ZGlmZiAtLWdpdCBhL2J1aWxkL3Nkay5hdHJlZSBiL2J1aWxkL3Nkay5hdHJlZQppbmRleCA4NTk1MmVhLi4zZGY0NDljIDEwMDY0NAotLS0gYS9idWlsZC9zZGsuYXRyZWUKKysrIGIvYnVpbGQvc2RrLmF0cmVlCkBAIC0xOCwxMCArMTgsMTAgQEAKICMgVGhlc2UgYXJlIHRoZSBmaWxlcyB0aGF0IGNvbXByaXNlIHRoYXQgU0RLCiAjCiAKLSMgdmVyc2lvbiBmaWxlcyBmb3IgdGhlIFNESyB1cGRhdGVyCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL2RvY19zb3VyY2UucHJvcGVydGllcyBkb2NzL3NvdXJjZS5wcm9wZXJ0aWVzCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL3Rvb2xzX3NvdXJjZS5wcm9wZXJ0aWVzIHRvb2xzL3NvdXJjZS5wcm9wZXJ0aWVzCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NvdXJjZS5wcm9wZXJ0aWVzCisjIHZlcnNpb24gZmlsZXMgZm9yIHRoZSBTREsgdXBkYXRlciwgZnJvbSBzZGsuZ2l0CitzZGsvc2NyaXB0cy9kb2Nfc291cmNlLnByb3BlcnRpZXMgZG9jcy9zb3VyY2UucHJvcGVydGllcworc2RrL3NjcmlwdHMvdG9vbHNfc291cmNlLnByb3BlcnRpZXMgdG9vbHMvc291cmNlLnByb3BlcnRpZXMKK3Nkay9zY3JpcHRzL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NvdXJjZS5wcm9wZXJ0aWVzCiAKICMgaG9zdCB0b29scyBmcm9tIG91dC9ob3N0LyQoSE9TVF9PUyktJChIT1NUX0FSQ0gpLwogYmluL2FhcHQgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdG9vbHMvYWFwdApAQCAtNDIsMjkgKzQyLDMyIEBACiBmcmFtZXdvcmsvb3JnLmVjbGlwc2UuamZhY2VfMy40LjIuTTIwMDkwMTA3LTA4MDAuamFyIHRvb2xzL2xpYi9vcmcuZWNsaXBzZS5qZmFjZV8zLjQuMi5NMjAwOTAxMDctMDgwMC5qYXIKIGZyYW1ld29yay9vc2dpLmphciB0b29scy9saWIvb3NnaS5qYXIKIAorIyBjb3B5IGJ1aWxkIHByb3AgZnJvbSBvdXQvLi4uL3Nkay8KIHNkay9zZGstYnVpbGQucHJvcCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9idWlsZC5wcm9wCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL3BsdWdpbi5wcm9wIHRvb2xzL2xpYi9wbHVnaW4ucHJvcAorCisjIGNvcHkgcGx1Z2luLnByb3AgZnJvbSBzZGsuZ2l0CitzZGsvc2NyaXB0cy9wbHVnaW4ucHJvcCB0b29scy9saWIvcGx1Z2luLnByb3AKIAogIyB0aGUgYWlkbCBwcmVjb21waWxlZCBpbmNsdWRlCiBvYmovZnJhbWV3b3JrLmFpZGwgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vZnJhbWV3b3JrLmFpZGwKIAotIyBzZGsgc2NyaXB0cwotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVzdHMudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL0FuZHJvaWRNYW5pZmVzdC50ZXN0cy50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9qYXZhX2ZpbGUudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL2phdmFfZmlsZS50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9qYXZhX3Rlc3RzX2ZpbGUudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL2phdmFfdGVzdHNfZmlsZS50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9sYXlvdXQudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL2xheW91dC50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9zdHJpbmdzLnRlbXBsYXRlIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9zdHJpbmdzLnRlbXBsYXRlCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL2FuZHJvaWRfcnVsZXMueG1sIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9hbmRyb2lkX3J1bGVzLnhtbAotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9hbmRyb2lkX3Rlc3RfcnVsZXMueG1sIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9hbmRyb2lkX3Rlc3RfcnVsZXMueG1sCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL2ljb25fbGRwaS5wbmcgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL2ljb25fbGRwaS5wbmcKLWRldmVsb3BtZW50L3Rvb2xzL3NjcmlwdHMvaWNvbl9tZHBpLnBuZyBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvaWNvbl9tZHBpLnBuZwotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9pY29uX2hkcGkucG5nIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9pY29uX2hkcGkucG5nCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL2J1aWxkLnRlbXBsYXRlIHRvb2xzL2xpYi9idWlsZC50ZW1wbGF0ZQotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9kZXZpY2VzLnhtbCB0b29scy9saWIvZGV2aWNlcy54bWwKKyMgc2RrLmdpdCBzY3JpcHRzCitzZGsvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQorc2RrL3NjcmlwdHMvQW5kcm9pZE1hbmlmZXN0LnRlc3RzLnRlbXBsYXRlIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9BbmRyb2lkTWFuaWZlc3QudGVzdHMudGVtcGxhdGUKK3Nkay9zY3JpcHRzL2phdmFfZmlsZS50ZW1wbGF0ZSBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvamF2YV9maWxlLnRlbXBsYXRlCitzZGsvc2NyaXB0cy9qYXZhX3Rlc3RzX2ZpbGUudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL2phdmFfdGVzdHNfZmlsZS50ZW1wbGF0ZQorc2RrL3NjcmlwdHMvbGF5b3V0LnRlbXBsYXRlIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9sYXlvdXQudGVtcGxhdGUKK3Nkay9zY3JpcHRzL3N0cmluZ3MudGVtcGxhdGUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vdGVtcGxhdGVzL3N0cmluZ3MudGVtcGxhdGUKK3Nkay9zY3JpcHRzL2FuZHJvaWRfcnVsZXMueG1sIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9hbmRyb2lkX3J1bGVzLnhtbAorc2RrL3NjcmlwdHMvYW5kcm9pZF90ZXN0X3J1bGVzLnhtbCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvYW5kcm9pZF90ZXN0X3J1bGVzLnhtbAorc2RrL3NjcmlwdHMvaWNvbl9sZHBpLnBuZyBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvaWNvbl9sZHBpLnBuZworc2RrL3NjcmlwdHMvaWNvbl9tZHBpLnBuZyBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvaWNvbl9tZHBpLnBuZworc2RrL3NjcmlwdHMvaWNvbl9oZHBpLnBuZyBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvaWNvbl9oZHBpLnBuZworc2RrL3NjcmlwdHMvYnVpbGQudGVtcGxhdGUgdG9vbHMvbGliL2J1aWxkLnRlbXBsYXRlCitzZGsvc2NyaXB0cy9kZXZpY2VzLnhtbCB0b29scy9saWIvZGV2aWNlcy54bWwKIAotIyBlbWFjcyBzdXBwb3J0Ci1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL2FuZHJvaWQuZWwgdG9vbHMvbGliL2FuZHJvaWQuZWwKKyMgZW1hY3Mgc3VwcG9ydCBmcm9tIHNkay5naXQKK3Nkay9zY3JpcHRzL2FuZHJvaWQuZWwgdG9vbHMvbGliL2FuZHJvaWQuZWwKIAogIyBzYW1wbGVzCiBkZXZlbG9wbWVudC9hcHBzL0dlc3R1cmVCdWlsZGVyIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NhbXBsZXMvR2VzdHVyZUJ1aWxkZXIKQEAgLTE1NiwyMCArMTU5LDIwIEBACiBwcmVidWlsdC9hbmRyb2lkLWFybS9rZXJuZWwva2VybmVsLXFlbXUgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vaW1hZ2VzL2tlcm5lbC1xZW11CiBleHRlcm5hbC9xZW11L2FuZHJvaWQvYXZkL2hhcmR3YXJlLXByb3BlcnRpZXMuaW5pIHRvb2xzL2xpYi9oYXJkd2FyZS1wcm9wZXJ0aWVzLmluaQogCi0jIGVtdWxhdG9yIHNraW5zCi1kZXZlbG9wbWVudC9lbXVsYXRvci9za2lucy9RVkdBICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvUVZHQQotZGV2ZWxvcG1lbnQvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dRVkdBNDMyCi1kZXZlbG9wbWVudC9lbXVsYXRvci9za2lucy9XUVZHQTQwMCAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1FWR0E0MDAKLWRldmVsb3BtZW50L2VtdWxhdG9yL3NraW5zL0hWR0EgICAgICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9za2lucy9IVkdBCi1kZXZlbG9wbWVudC9lbXVsYXRvci9za2lucy9XVkdBODAwICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1ZHQTgwMAotZGV2ZWxvcG1lbnQvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NCAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dWR0E4NTQKKyMgZW11bGF0b3Igc2tpbnMgZnJvbSBzZGsuZ2l0CitzZGsvZW11bGF0b3Ivc2tpbnMvUVZHQSAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1FWR0EKK3Nkay9lbXVsYXRvci9za2lucy9XUVZHQTQzMiAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1FWR0E0MzIKK3Nkay9lbXVsYXRvci9za2lucy9XUVZHQTQwMCAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1FWR0E0MDAKK3Nkay9lbXVsYXRvci9za2lucy9IVkdBICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvSFZHQQorc2RrL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAgICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9za2lucy9XVkdBODAwCitzZGsvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NCAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dWR0E4NTQKIAotIyBOT1RJQ0UgZmlsZXMgYXJlIGNvcGllZCBieSBidWlsZC9jb3JlL01ha2VmaWxlCi1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0IHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9OT1RJQ0UudHh0Ci1kZXZlbG9wbWVudC90b29scy9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0IHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NhbXBsZXMvTk9USUNFLnR4dAotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9zZGtfZmlsZXNfTk9USUNFLnR4dCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9kYXRhL05PVElDRS50eHQKLWRldmVsb3BtZW50L3Rvb2xzL3NjcmlwdHMvc2RrX2ZpbGVzX05PVElDRS50eHQgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvTk9USUNFLnR4dAotZGV2ZWxvcG1lbnQvdG9vbHMvc2NyaXB0cy9zZGtfZmlsZXNfTk9USUNFLnR4dCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90b29scy9OT1RJQ0UudHh0CisjIE5PVElDRSBmaWxlcyBhcmUgY29waWVkIGJ5IGJ1aWxkL2NvcmUvTWFrZWZpbGUgZnJvbSBzZGsuZ2l0CitzZGsvc2NyaXB0cy9zZGtfZmlsZXNfTk9USUNFLnR4dCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS90ZW1wbGF0ZXMvTk9USUNFLnR4dAorc2RrL3NjcmlwdHMvc2RrX2ZpbGVzX05PVElDRS50eHQgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2FtcGxlcy9OT1RJQ0UudHh0CitzZGsvc2NyaXB0cy9zZGtfZmlsZXNfTk9USUNFLnR4dCBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9kYXRhL05PVElDRS50eHQKK3Nkay9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0IHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL05PVElDRS50eHQKK3Nkay9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0IHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3Rvb2xzL05PVElDRS50eHQKIAogIyB0aGUgcmVhZG1lCiBkZXZlbG9wbWVudC9kb2NzL1NES19SRUxFQVNFX05PVEVTIFJFTEVBU0VfTk9URVMuaHRtbApAQCAtMjAyLDUgKzIwNSw1IEBACiBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNGYWxsYmFjay50dGYgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2RhdGEvZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmCiBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNKYXBhbmVzZS50dGYgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2RhdGEvZm9udHMvRHJvaWRTYW5zSmFwYW5lc2UudHRmCiAKLSMgZW1wdHkgYWRkLW9uIGZvbGRlciB3aXRoIGp1c3QgYSByZWFkbWUKLWRldmVsb3BtZW50L3Rvb2xzL3NjcmlwdHMvUkVBRE1FX2FkZC1vbnMudHh0IGFkZC1vbnMvUkVBRE1FLnR4dAorIyBlbXB0eSBhZGQtb24gZm9sZGVyIHdpdGgganVzdCBhIHJlYWRtZSBjb3BpZWQgZnJvbSBzZGsuZ2l0CitzZGsvc2NyaXB0cy9SRUFETUVfYWRkLW9ucy50eHQgYWRkLW9ucy9SRUFETUUudHh0CmRpZmYgLS1naXQgYS9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoIGIvYnVpbGQvdG9vbHMvbWFrZV93aW5kb3dzX3Nkay5zaAppbmRleCA5N2M3YmM3Li5jNDQzNDMwIDEwMDc1NQotLS0gYS9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoCisrKyBiL2J1aWxkL3Rvb2xzL21ha2Vfd2luZG93c19zZGsuc2gKQEAgLTE2MywxMyArMTYzLDEzIEBACiAgICAgY3AgLXYgL2N5Z2RyaXZlL2MvY3lnd2luL2Jpbi9tZ3d6LmRsbCAiJFRPT0xTIi8KIAogICAgICMgVXBkYXRlIGEgYnVuY2ggb2YgYmF0IGZpbGVzCi0gICAgY3AgLXYgZGV2ZWxvcG1lbnQvdG9vbHMvYXBrYnVpbGRlci9ldGMvYXBrYnVpbGRlci5iYXQgICAgICAgICAgICIkVE9PTFMiLwotICAgIGNwIC12IGRldmVsb3BtZW50L3Rvb2xzL2RkbXMvYXBwL2V0Yy9kZG1zLmJhdCAgICAgICAgICAgICAgICAgICAiJFRPT0xTIi8KLSAgICBjcCAtdiBkZXZlbG9wbWVudC90b29scy90cmFjZXZpZXcvZXRjL3RyYWNldmlldy5iYXQgICAgICAgICAgICAgIiRUT09MUyIvCi0gICAgY3AgLXYgZGV2ZWxvcG1lbnQvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9oaWVyYXJjaHl2aWV3ZXIuYmF0ICIkVE9PTFMiLwotICAgIGNwIC12IGRldmVsb3BtZW50L3Rvb2xzL2xheW91dG9wdC9hcHAvZXRjL2xheW91dG9wdC5iYXQgICAgICAgICAiJFRPT0xTIi8KLSAgICBjcCAtdiBkZXZlbG9wbWVudC90b29scy9kcmF3OXBhdGNoL2V0Yy9kcmF3OXBhdGNoLmJhdCAgICAgICAgICAgIiRUT09MUyIvCi0gICAgY3AgLXYgZGV2ZWxvcG1lbnQvdG9vbHMvc2RrbWFuYWdlci9hcHAvZXRjL2FuZHJvaWQuYmF0ICAgICAgICAgICIkVE9PTFMiLworICAgIGNwIC12IHNkay9hcGtidWlsZGVyL2V0Yy9hcGtidWlsZGVyLmJhdCAgICAgICAgICAgIiRUT09MUyIvCisgICAgY3AgLXYgc2RrL2RkbXMvYXBwL2V0Yy9kZG1zLmJhdCAgICAgICAgICAgICAgICAgICAiJFRPT0xTIi8KKyAgICBjcCAtdiBzZGsvdHJhY2V2aWV3L2V0Yy90cmFjZXZpZXcuYmF0ICAgICAgICAgICAgICIkVE9PTFMiLworICAgIGNwIC12IHNkay9oaWVyYXJjaHl2aWV3ZXIvZXRjL2hpZXJhcmNoeXZpZXdlci5iYXQgIiRUT09MUyIvCisgICAgY3AgLXYgc2RrL2xheW91dG9wdC9hcHAvZXRjL2xheW91dG9wdC5iYXQgICAgICAgICAiJFRPT0xTIi8KKyAgICBjcCAtdiBzZGsvZHJhdzlwYXRjaC9ldGMvZHJhdzlwYXRjaC5iYXQgICAgICAgICAgICIkVE9PTFMiLworICAgIGNwIC12IHNkay9zZGttYW5hZ2VyL2FwcC9ldGMvYW5kcm9pZC5iYXQgICAgICAgICAgIiRUT09MUyIvCiAKICAgICAjIFB1dCB0aGUgSmV0Q3JlYXRvciB0b29scywgY29udGVudCBhbmQgZG9jcyAobm90IGF2YWlsYWJsZSBpbiB0aGUgbGludXggU0RLKQogICAgIEpFVD0iJFRPT0xTL0pldCIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvc2RrX2NsZWFuLnNoIGIvYnVpbGQvdG9vbHMvc2RrX2NsZWFuLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9zY3JpcHRzL3Nka19jbGVhbi5zaApyZW5hbWUgdG8gYnVpbGQvdG9vbHMvc2RrX2NsZWFuLnNoCmRpZmYgLS1naXQgYS9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsIGIvZW11bGF0b3Iva2V5bWFwcy9BVlJDUC5rbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViM2M4YS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1rZXkgMjAwICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCi1rZXkgMjAxICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCi1rZXkgMTY2ICAgTUVESUFfU1RPUCAgICAgICAgICBXQUtFCi1rZXkgMTYzICAgTUVESUFfTkVYVCAgICAgICAgICBXQUtFCi1rZXkgMTY1ICAgTUVESUFfUFJFVklPVVMgICAgICBXQUtFCi1rZXkgMTY4ICAgTUVESUFfUkVXSU5EICAgICAgICBXQUtFCi1rZXkgMjA4ICAgTUVESUFfRkFTVF9GT1JXQVJEICBXQUtFCmRpZmYgLS1naXQgYS9lbXVsYXRvci9rZXltYXBzL0FuZHJvaWQubWsgYi9lbXVsYXRvci9rZXltYXBzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWM1MzAuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Iva2V5bWFwcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBxd2VydHkua2NtCi1pbmNsdWRlICQoQlVJTERfS0VZX0NIQVJfTUFQKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBxd2VydHkyLmtjbQotaW5jbHVkZSAkKEJVSUxEX0tFWV9DSEFSX01BUCkKLQotZmlsZSA6PSAkKFRBUkdFVF9PVVRfS0VZTEFZT1VUKS9xd2VydHkua2wKLUFMTF9QUkVCVUlMVCArPSAkKGZpbGUpCi0kKGZpbGUpOiAkKExPQ0FMX1BBVEgpL3F3ZXJ0eS5rbCB8ICQoQUNQKQotCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKLQotZmlsZSA6PSAkKFRBUkdFVF9PVVRfS0VZTEFZT1VUKS9BVlJDUC5rbAotQUxMX1BSRUJVSUxUICs9ICQoZmlsZSkKLSQoZmlsZSkgOiAkKExPQ0FMX1BBVEgpL0FWUkNQLmtsIHwgJChBQ1ApCi0JJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQpkaWZmIC0tZ2l0IGEvZW11bGF0b3Iva2V5bWFwcy9xd2VydHkua2NtIGIvZW11bGF0b3Iva2V5bWFwcy9xd2VydHkua2NtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2MzY0Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL2tleW1hcHMvcXdlcnR5LmtjbQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLVt0eXBlPVFXRVJUWV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIyBrZXljb2RlICAgICAgIGRpc3BsYXkgbnVtYmVyICBiYXNlICAgIGNhcHMgICAgZm4gICAgICBjYXBzX2ZuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotQSAgICAgICAgICAgICAgICdBJyAgICAgJzInICAgICAnYScgICAgICdBJyAgICAgJyMnICAgICAweDAwCi1CICAgICAgICAgICAgICAgJ0InICAgICAnMicgICAgICdiJyAgICAgJ0InICAgICAnPCcgICAgIDB4MDAKLUMgICAgICAgICAgICAgICAnQycgICAgICcyJyAgICAgJ2MnICAgICAnQycgICAgICc5JyAgICAgMHgwMEU3Ci1EICAgICAgICAgICAgICAgJ0QnICAgICAnMycgICAgICdkJyAgICAgJ0QnICAgICAnNScgICAgIDB4MDAKLUUgICAgICAgICAgICAgICAnRScgICAgICczJyAgICAgJ2UnICAgICAnRScgICAgICcyJyAgICAgMHgwMzAxCi1GICAgICAgICAgICAgICAgJ0YnICAgICAnMycgICAgICdmJyAgICAgJ0YnICAgICAnNicgICAgIDB4MDBBNQotRyAgICAgICAgICAgICAgICdHJyAgICAgJzQnICAgICAnZycgICAgICdHJyAgICAgJy0nICAgICAnXycKLUggICAgICAgICAgICAgICAnSCcgICAgICc0JyAgICAgJ2gnICAgICAnSCcgICAgICdbJyAgICAgJ3snCi1JICAgICAgICAgICAgICAgJ0knICAgICAnNCcgICAgICdpJyAgICAgJ0knICAgICAnJCcgICAgIDB4MDMwMgotSiAgICAgICAgICAgICAgICdKJyAgICAgJzUnICAgICAnaicgICAgICdKJyAgICAgJ10nICAgICAnfScKLUsgICAgICAgICAgICAgICAnSycgICAgICc1JyAgICAgJ2snICAgICAnSycgICAgICciJyAgICAgJ34nCi1MICAgICAgICAgICAgICAgJ0wnICAgICAnNScgICAgICdsJyAgICAgJ0wnICAgICAnJycgICAgICdgJwotTSAgICAgICAgICAgICAgICdNJyAgICAgJzYnICAgICAnbScgICAgICdNJyAgICAgJyEnICAgICAweDAwCi1OICAgICAgICAgICAgICAgJ04nICAgICAnNicgICAgICduJyAgICAgJ04nICAgICAnPicgICAgIDB4MDMwMwotTyAgICAgICAgICAgICAgICdPJyAgICAgJzYnICAgICAnbycgICAgICdPJyAgICAgJygnICAgICAweDAwCi1QICAgICAgICAgICAgICAgJ1AnICAgICAnNycgICAgICdwJyAgICAgJ1AnICAgICAnKScgICAgIDB4MDAKLVEgICAgICAgICAgICAgICAnUScgICAgICc3JyAgICAgJ3EnICAgICAnUScgICAgICcqJyAgICAgMHgwMzAwCi1SICAgICAgICAgICAgICAgJ1InICAgICAnNycgICAgICdyJyAgICAgJ1InICAgICAnMycgICAgIDB4MjBBQwotUyAgICAgICAgICAgICAgICdTJyAgICAgJzcnICAgICAncycgICAgICdTJyAgICAgJzQnICAgICAweDAwREYKLVQgICAgICAgICAgICAgICAnVCcgICAgICc4JyAgICAgJ3QnICAgICAnVCcgICAgICcrJyAgICAgMHgwMEEzCi1VICAgICAgICAgICAgICAgJ1UnICAgICAnOCcgICAgICd1JyAgICAgJ1UnICAgICAnJicgICAgIDB4MDMwOAotViAgICAgICAgICAgICAgICdWJyAgICAgJzgnICAgICAndicgICAgICdWJyAgICAgJz0nICAgICAnXicKLVcgICAgICAgICAgICAgICAnVycgICAgICc5JyAgICAgJ3cnICAgICAnVycgICAgICcxJyAgICAgMHgwMAotWCAgICAgICAgICAgICAgICdYJyAgICAgJzknICAgICAneCcgICAgICdYJyAgICAgJzgnICAgICAweEVGMDAKLVkgICAgICAgICAgICAgICAnWScgICAgICc5JyAgICAgJ3knICAgICAnWScgICAgICclJyAgICAgMHgwMEExCi1aICAgICAgICAgICAgICAgJ1onICAgICAnOScgICAgICd6JyAgICAgJ1onICAgICAnNycgICAgIDB4MDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jIG9uIHBjIGtleWJvYXJkcwotQ09NTUEgICAgICAgICAgICcsJyAgICAgJywnICAgICAnLCcgICAgICc7JyAgICAgJzsnICAgICAnfCcKLVBFUklPRCAgICAgICAgICAnLicgICAgICcuJyAgICAgJy4nICAgICAnOicgICAgICc6JyAgICAgMHgyMDI2Ci1BVCAgICAgICAgICAgICAgJ0AnICAgICAnMCcgICAgICdAJyAgICAgJzAnICAgICAnMCcgICAgIDB4MjAyMgotU0xBU0ggICAgICAgICAgICcvJyAgICAgJy8nICAgICAnLycgICAgICc/JyAgICAgJz8nICAgICAnXCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1TUEFDRSAgICAgICAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHgyMCAgICAweEVGMDEgIDB4RUYwMQotRU5URVIgICAgICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotVEFCICAgICAgICAgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkKLTAgICAgICAgICAgICAgICAnMCcgICAgICcwJyAgICAgJzAnICAgICAnKScgICAgICcpJyAgICAgJyknCi0xICAgICAgICAgICAgICAgJzEnICAgICAnMScgICAgICcxJyAgICAgJyEnICAgICAnIScgICAgICchJwotMiAgICAgICAgICAgICAgICcyJyAgICAgJzInICAgICAnMicgICAgICdAJyAgICAgJ0AnICAgICAnQCcKLTMgICAgICAgICAgICAgICAnMycgICAgICczJyAgICAgJzMnICAgICAnIycgICAgICcjJyAgICAgJyMnCi00ICAgICAgICAgICAgICAgJzQnICAgICAnNCcgICAgICc0JyAgICAgJyQnICAgICAnJCcgICAgICckJwotNSAgICAgICAgICAgICAgICc1JyAgICAgJzUnICAgICAnNScgICAgICclJyAgICAgJyUnICAgICAnJScKLTYgICAgICAgICAgICAgICAnNicgICAgICc2JyAgICAgJzYnICAgICAnXicgICAgICdeJyAgICAgJ14nCi03ICAgICAgICAgICAgICAgJzcnICAgICAnNycgICAgICc3JyAgICAgJyYnICAgICAnJicgICAgICcmJwotOCAgICAgICAgICAgICAgICc4JyAgICAgJzgnICAgICAnOCcgICAgICcqJyAgICAgJyonICAgICAnKicKLTkgICAgICAgICAgICAgICAnOScgICAgICc5JyAgICAgJzknICAgICAnKCcgICAgICcoJyAgICAgJygnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotR1JBVkUgICAgICAgICAgICdgJyAgICAgJ2AnICAgICAnYCcgICAgICd+JyAgICAgJ2AnICAgICAnficKLU1JTlVTICAgICAgICAgICAnLScgICAgICctJyAgICAgJy0nICAgICAnXycgICAgICctJyAgICAgJ18nCi1FUVVBTFMgICAgICAgICAgJz0nICAgICAnPScgICAgICc9JyAgICAgJysnICAgICAnPScgICAgICcrJwotTEVGVF9CUkFDS0VUICAgICdbJyAgICAgJ1snICAgICAnWycgICAgICd7JyAgICAgJ1snICAgICAneycKLVJJR0hUX0JSQUNLRVQgICAnXScgICAgICddJyAgICAgJ10nICAgICAnfScgICAgICddJyAgICAgJ30nCi1CQUNLU0xBU0ggICAgICAgJ1wnICAgICAnXCcgICAgICdcJyAgICAgJ3wnICAgICAnXCcgICAgICd8JwotU0VNSUNPTE9OICAgICAgICc7JyAgICAgJzsnICAgICAnOycgICAgICc6JyAgICAgJzsnICAgICAnOicKLUFQT1NUUk9QSEUgICAgICAnJycgICAgICcnJyAgICAgJycnICAgICAnIicgICAgICcnJyAgICAgJyInCi1TVEFSICAgICAgICAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJwotUE9VTkQgICAgICAgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycKLVBMVVMgICAgICAgICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZW11bGF0b3Iva2V5bWFwcy9xd2VydHkua2wgYi9lbXVsYXRvci9rZXltYXBzL3F3ZXJ0eS5rbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNWZkZC4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9rZXltYXBzL3F3ZXJ0eS5rbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLWtleSAzOTkgICBHUkFWRQota2V5IDIgICAgIDEKLWtleSAzICAgICAyCi1rZXkgNCAgICAgMwota2V5IDUgICAgIDQKLWtleSA2ICAgICA1Ci1rZXkgNyAgICAgNgota2V5IDggICAgIDcKLWtleSA5ICAgICA4Ci1rZXkgMTAgICAgOQota2V5IDExICAgIDAKLWtleSAxNTggICBCQUNLICAgICAgICAgICAgICBXQUtFX0RST1BQRUQKLWtleSAyMzAgICBTT0ZUX1JJR0hUICAgICAgICBXQUtFCi1rZXkgNjAgICAgU09GVF9SSUdIVCAgICAgICAgV0FLRQota2V5IDEwNyAgIEVORENBTEwgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDYyICAgIEVORENBTEwgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDIyOSAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDEzOSAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDU5ICAgIE1FTlUgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDEyNyAgIFNFQVJDSCAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDIxNyAgIFNFQVJDSCAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDIyOCAgIFBPVU5ECi1rZXkgMjI3ICAgU1RBUgota2V5IDIzMSAgIENBTEwgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDYxICAgIENBTEwgICAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDIzMiAgIERQQURfQ0VOVEVSICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDEwOCAgIERQQURfRE9XTiAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDEwMyAgIERQQURfVVAgICAgICAgICAgIFdBS0VfRFJPUFBFRAota2V5IDEwMiAgIEhPTUUgICAgICAgICAgICAgIFdBS0UKLWtleSAxMDUgICBEUEFEX0xFRlQgICAgICAgICBXQUtFX0RST1BQRUQKLWtleSAxMDYgICBEUEFEX1JJR0hUICAgICAgICBXQUtFX0RST1BQRUQKLWtleSAxMTUgICBWT0xVTUVfVVAKLWtleSAxMTQgICBWT0xVTUVfRE9XTgota2V5IDExNiAgIFBPV0VSICAgICAgICAgICAgIFdBS0UKLWtleSAyMTIgICBDQU1FUkEKLQota2V5IDE2ICAgIFEKLWtleSAxNyAgICBXCi1rZXkgMTggICAgRQota2V5IDE5ICAgIFIKLWtleSAyMCAgICBUCi1rZXkgMjEgICAgWQota2V5IDIyICAgIFUKLWtleSAyMyAgICBJCi1rZXkgMjQgICAgTwota2V5IDI1ICAgIFAKLWtleSAyNiAgICBMRUZUX0JSQUNLRVQKLWtleSAyNyAgICBSSUdIVF9CUkFDS0VUCi1rZXkgNDMgICAgQkFDS1NMQVNICi0KLWtleSAzMCAgICBBCi1rZXkgMzEgICAgUwota2V5IDMyICAgIEQKLWtleSAzMyAgICBGCi1rZXkgMzQgICAgRwota2V5IDM1ICAgIEgKLWtleSAzNiAgICBKCi1rZXkgMzcgICAgSwota2V5IDM4ICAgIEwKLWtleSAzOSAgICBTRU1JQ09MT04KLWtleSA0MCAgICBBUE9TVFJPUEhFCi1rZXkgMTQgICAgREVMCi0gICAgICAgIAota2V5IDQ0ICAgIFoKLWtleSA0NSAgICBYCi1rZXkgNDYgICAgQwota2V5IDQ3ICAgIFYKLWtleSA0OCAgICBCCi1rZXkgNDkgICAgTgota2V5IDUwICAgIE0KLWtleSA1MSAgICBDT01NQQota2V5IDUyICAgIFBFUklPRAota2V5IDUzICAgIFNMQVNICi1rZXkgMjggICAgRU5URVIKLSAgICAgICAgCi1rZXkgNTYgICAgQUxUX0xFRlQKLWtleSAxMDAgICBBTFRfUklHSFQKLWtleSA0MiAgICBTSElGVF9MRUZUCi1rZXkgNTQgICAgU0hJRlRfUklHSFQKLWtleSAxNSAgICBUQUIKLWtleSA1NyAgICBTUEFDRQota2V5IDE1MCAgIEVYUExPUkVSCi1rZXkgMTU1ICAgRU5WRUxPUEUgICAgICAgIAotCi1rZXkgMTIgICAgTUlOVVMKLWtleSAxMyAgICBFUVVBTFMKLWtleSAyMTUgICBBVAotCi0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL2tleW1hcHMvcXdlcnR5Mi5rY20gYi9lbXVsYXRvci9rZXltYXBzL3F3ZXJ0eTIua2NtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDg3ZmI3Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL2tleW1hcHMvcXdlcnR5Mi5rY20KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1bdHlwZT1RV0VSVFldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSMgdGhpcyBrZXltYXAgaXMgdG8gYmUgdXNlZCBpbiB0aGUgZW11bGF0b3Igb25seS4gbm90ZQotIyB0aGF0IEkgaGF2ZSBsaWJlcmFsbHkgbW9kaWZpZWQgY2VydGFpbiBrZXkgc3Ryb2tlcyB0bwotIyBtYWtlIGl0IG1vcmUgdXNhYmxlIGluIHRoaXMgY29udGV4dC4gdGhlIG1haW4gZGlmZmVyZW5jZXMKLSMgd2l0aCB0aGUgcmVmZXJlbmNlIGtleWJvYXJkIGltYWdlIGFyZToKLSMKLSMgIC0gY2FwLTIgcHJvZHVjZXMgJ0AnLCBhbmQgbm90ICciJywgd2l0aG91dCB0aGF0LCB0eXBpbmcKLSMgICAgZW1haWwgYWRkcmVzc2VzIGJlY29tZXMgYSBtYWpvciBwYWluIHdpdGggYSBxd2VydHkKLSMgICAga2V5Ym9hcmQuIG5vdGUgdGhhdCB5b3UgY2FuIHR5cGUgJyInIHdpdGggZm4tRSBhbnl3YXkuCi0jCi0jICAtIGNhcC1DT01NQSBhbmQgY2FwLVBFUklPRCByZXR1cm4gJzwnIGFuZCAnPicsIGluc3RlYWQKLSMgICAgb2Ygbm90aGluZy4KLSMKLSMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jIGtleWNvZGUgICAgICAgZGlzcGxheSAgbnVtYmVyIGJhc2UgICAgY2FwcyAgICBmbiAgICAgIGNhcHNfZm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1BICAgICAgICAgICAgICAgJ0EnICAgICAnMicgICAgICdhJyAgICAgJ0EnICAgICAnYScgICAgICdBJwotQiAgICAgICAgICAgICAgICdCJyAgICAgJzInICAgICAnYicgICAgICdCJyAgICAgJ2InICAgICAnQicKLUMgICAgICAgICAgICAgICAnQycgICAgICcyJyAgICAgJ2MnICAgICAnQycgICAgIDB4MDBlNyAgMHgwMEU3Ci1EICAgICAgICAgICAgICAgJ0QnICAgICAnMycgICAgICdkJyAgICAgJ0QnICAgICAnJycgICAgICcnJwotRSAgICAgICAgICAgICAgICdFJyAgICAgJzMnICAgICAnZScgICAgICdFJyAgICAgJyInICAgICAweDAzMDEKLUYgICAgICAgICAgICAgICAnRicgICAgICczJyAgICAgJ2YnICAgICAnRicgICAgICdbJyAgICAgJ1snCi1HICAgICAgICAgICAgICAgJ0cnICAgICAnNCcgICAgICdnJyAgICAgJ0cnICAgICAnXScgICAgICddJwotSCAgICAgICAgICAgICAgICdIJyAgICAgJzQnICAgICAnaCcgICAgICdIJyAgICAgJzwnICAgICAnPCcKLUkgICAgICAgICAgICAgICAnSScgICAgICc0JyAgICAgJ2knICAgICAnSScgICAgICctJyAgICAgMHgwMzAyCi1KICAgICAgICAgICAgICAgJ0onICAgICAnNScgICAgICdqJyAgICAgJ0onICAgICAnPicgICAgICc+JwotSyAgICAgICAgICAgICAgICdLJyAgICAgJzUnICAgICAnaycgICAgICdLJyAgICAgJzsnICAgICAnficKLUwgICAgICAgICAgICAgICAnTCcgICAgICc1JyAgICAgJ2wnICAgICAnTCcgICAgICc6JyAgICAgJ2AnCi1NICAgICAgICAgICAgICAgJ00nICAgICAnNicgICAgICdtJyAgICAgJ00nICAgICAnJScgICAgIDB4MDAKLU4gICAgICAgICAgICAgICAnTicgICAgICc2JyAgICAgJ24nICAgICAnTicgICAgIDB4MDAgICAgMHgwMzAzCi1PICAgICAgICAgICAgICAgJ08nICAgICAnNicgICAgICdvJyAgICAgJ08nICAgICAnKycgICAgICcrJwotUCAgICAgICAgICAgICAgICdQJyAgICAgJzcnICAgICAncCcgICAgICdQJyAgICAgJz0nICAgICAweDAwQTUKLVEgICAgICAgICAgICAgICAnUScgICAgICc3JyAgICAgJ3EnICAgICAnUScgICAgICd8JyAgICAgMHgwMzAwCi1SICAgICAgICAgICAgICAgJ1InICAgICAnNycgICAgICdyJyAgICAgJ1InICAgICAnYCcgICAgIDB4MjBBQwotUyAgICAgICAgICAgICAgICdTJyAgICAgJzcnICAgICAncycgICAgICdTJyAgICAgJ1wnICAgICAweDAwREYKLVQgICAgICAgICAgICAgICAnVCcgICAgICc4JyAgICAgJ3QnICAgICAnVCcgICAgICd7JyAgICAgMHgwMEEzCi1VICAgICAgICAgICAgICAgJ1UnICAgICAnOCcgICAgICd1JyAgICAgJ1UnICAgICAnXycgICAgIDB4MDMwOAotViAgICAgICAgICAgICAgICdWJyAgICAgJzgnICAgICAndicgICAgICdWJyAgICAgJ3YnICAgICAnVicKLVcgICAgICAgICAgICAgICAnVycgICAgICc5JyAgICAgJ3cnICAgICAnVycgICAgICd+JyAgICAgJ34nCi1YICAgICAgICAgICAgICAgJ1gnICAgICAnOScgICAgICd4JyAgICAgJ1gnICAgICAneCcgICAgIDB4RUYwMAotWSAgICAgICAgICAgICAgICdZJyAgICAgJzknICAgICAneScgICAgICdZJyAgICAgJ30nICAgICAweDAwQTEKLVogICAgICAgICAgICAgICAnWicgICAgICc5JyAgICAgJ3onICAgICAnWicgICAgICd6JyAgICAgJ1onCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotQ09NTUEgICAgICAgICAgICcsJyAgICAgJywnICAgICAnLCcgICAgICc8JyAgICAgJywnICAgICAnLCcKLVBFUklPRCAgICAgICAgICAnLicgICAgICcuJyAgICAgJy4nICAgICAnPicgICAgICcuJyAgICAgMHgyMDI2Ci1BVCAgICAgICAgICAgICAgJ0AnICAgICAnQCcgICAgICdAJyAgICAgJ0AnICAgICAnQCcgICAgIDB4MjAyMgotU0xBU0ggICAgICAgICAgICcvJyAgICAgJy8nICAgICAnLycgICAgICc/JyAgICAgJz8nICAgICAnPycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1TUEFDRSAgICAgICAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHgyMCAgICAweEVGMDEgIDB4RUYwMQotRU5URVIgICAgICAgICAweGEgICAgIDB4YSAgICAgMHhhICAgICAweGEgICAgIDB4YSAgICAgMHhhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotMCAgICAgICAgICAgICAgICcwJyAgICAgJzAnICAgICAnMCcgICAgICcpJyAgICAgJyknICAgICAnKScKLTEgICAgICAgICAgICAgICAnMScgICAgICcxJyAgICAgJzEnICAgICAnIScgICAgICchJyAgICAgJyEnCi0yICAgICAgICAgICAgICAgJzInICAgICAnMicgICAgICcyJyAgICAgJ0AnICAgICAnQCcgICAgICdAJwotMyAgICAgICAgICAgICAgICczJyAgICAgJzMnICAgICAnMycgICAgICcjJyAgICAgJyMnICAgICAnIycKLTQgICAgICAgICAgICAgICAnNCcgICAgICc0JyAgICAgJzQnICAgICAnJCcgICAgICckJyAgICAgJyQnCi01ICAgICAgICAgICAgICAgJzUnICAgICAnNScgICAgICc1JyAgICAgJyUnICAgICAnJScgICAgICclJwotNiAgICAgICAgICAgICAgICc2JyAgICAgJzYnICAgICAnNicgICAgICdeJyAgICAgJ14nICAgICAnXicKLTcgICAgICAgICAgICAgICAnNycgICAgICc3JyAgICAgJzcnICAgICAnJicgICAgICcmJyAgICAgJyYnCi04ICAgICAgICAgICAgICAgJzgnICAgICAnOCcgICAgICc4JyAgICAgJyonICAgICAnKicgICAgICcqJwotOSAgICAgICAgICAgICAgICc5JyAgICAgJzknICAgICAnOScgICAgICcoJyAgICAgJygnICAgICAnKCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jIHRoZSByZXN0IGlzIGZvciBhIHF3ZXJ0eSBrZXlib2FyZAotIwotVEFCICAgICAgICAgICAgIDB4OSAgICAgMHg5ICAgICAweDkgICAgIDB4OSAgICAgMHg5ICAgICAweDkKLUdSQVZFICAgICAgICAgICAnYCcgICAgICdgJyAgICAgJ2AnICAgICAnficgICAgICdgJyAgICAgJ34nCi1NSU5VUyAgICAgICAgICAgJy0nICAgICAnLScgICAgICctJyAgICAgJ18nICAgICAnLScgICAgICdfJwotRVFVQUxTICAgICAgICAgICc9JyAgICAgJz0nICAgICAnPScgICAgICcrJyAgICAgJz0nICAgICAnKycKLUxFRlRfQlJBQ0tFVCAgICAnWycgICAgICdbJyAgICAgJ1snICAgICAneycgICAgICdbJyAgICAgJ3snCi1SSUdIVF9CUkFDS0VUICAgJ10nICAgICAnXScgICAgICddJyAgICAgJ30nICAgICAnXScgICAgICd9JwotQkFDS1NMQVNIICAgICAgICdcJyAgICAgJ1wnICAgICAnXCcgICAgICd8JyAgICAgJ1wnICAgICAnfCcKLVNFTUlDT0xPTiAgICAgICAnOycgICAgICc7JyAgICAgJzsnICAgICAnOicgICAgICc7JyAgICAgJzonCi1BUE9TVFJPUEhFICAgICAgJycnICAgICAnJycgICAgICcnJyAgICAgJyInICAgICAnJycgICAgICciJwotU1RBUiAgICAgICAgICAgICcqJyAgICAgJyonICAgICAnKicgICAgICcqJyAgICAgJyonICAgICAnKicKLVBPVU5EICAgICAgICAgICAnIycgICAgICcjJyAgICAgJyMnICAgICAnIycgICAgICcjJyAgICAgJyMnCi1QTFVTICAgICAgICAgICAgJysnICAgICAnKycgICAgICcrJyAgICAgJysnICAgICAnKycgICAgICcrJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZW11bGF0b3IvbWtzZGNhcmQvQW5kcm9pZC5tayBiL2VtdWxhdG9yL21rc2RjYXJkL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjQxYjQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvbWtzZGNhcmQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBob3N0IGV4ZWN1dGFibGUKLSMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gbWtzZGNhcmQuYwotTE9DQUxfTU9EVUxFID0gbWtzZGNhcmQKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL21rc2RjYXJkL21rc2RjYXJkLmMgYi9lbXVsYXRvci9ta3NkY2FyZC9ta3NkY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVkMGY4Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL21rc2RjYXJkL21rc2RjYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyogbWtzZGNhcmQuYwotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSoqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotKiogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSoqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQotKiogICAgICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSoqICAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKioKLSoqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgR29vZ2xlIEluYy4gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotKiogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotKiogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KLSoqIEVWRU5UIFNIQUxMIEdvb2dsZSBJbmMuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0qKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0qKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSoqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotKiogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSoqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSoqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KLQotLyogYSBzaW1wbGUgYW5kIHBvcnRhYmxlIHByb2dyYW0gdXNlZCB0byBnZW5lcmF0ZSBhIGJsYW5rIEZBVDMyIGltYWdlIGZpbGUKLSAqCi0gKiB1c2FnZTogIG1rc2RjYXJkICBbLWwgbGFiZWxdIDxzaXplPiA8ZmlsZW5hbWU+Ci0gKi8KLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qIGJlbGlldmUgbWUsIHlvdSAqZG9uJ3QqIHdhbnQgdG8gY2hhbmdlIHRoZXNlIGNvbnN0YW50cyAhISAqLwotI2RlZmluZSAgQllURVNfUEVSX1NFQ1RPUiAgICA1MTIKLSNkZWZpbmUgIFJFU0VSVkVEX1NFQ1RPUlMgICAgMzIKLSNkZWZpbmUgIEJBQ0tVUF9CT09UX1NFQ1RPUiAgNgotI2RlZmluZSAgTlVNX0ZBVFMgICAgICAgICAgICAyCi0KLXR5cGVkZWYgbG9uZyBsb25nICAgICAgV2lkZTsgICAvKiBtaWdodCBiZSBzb21ldGhpbmcgZWxzZSBpZiB5b3UgZG9uJ3QgdXNlIEdDQyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOwotdHlwZWRlZiBCeXRlKiAgICAgICAgICBCeXRlczsKLQotI2RlZmluZSAgQllURV8ocCxpKSAgICAgICgoKEJ5dGVzKShwKSlbKGkpXSkKLQotI2RlZmluZSAgUE9LRUIocCx2KSAgICAgQllURV8ocCwwKSA9IChCeXRlKSh2KQotI2RlZmluZSAgUE9LRVMocCx2KSAgICggQllURV8ocCwwKSA9IChCeXRlKSh2KSwgQllURV8ocCwxKSA9IChCeXRlKSgodikgPj4gOCkgKQotI2RlZmluZSAgUE9LRVcocCx2KSAgICggQllURV8ocCwwKSA9IChCeXRlKSh2KSwgQllURV8ocCwxKSA9IChCeXRlKSgodikgPj4gOCksIEJZVEVfKHAsMikgPSAoQnl0ZSkoKHYpID4+IDE2KSwgQllURV8ocCwzKSA9IChCeXRlKSgodikgPj4gMjQpICkKLQotc3RhdGljIEJ5dGUgIHNfYm9vdF9zZWN0b3IgICBbIEJZVEVTX1BFUl9TRUNUT1IgXTsgICAgICAgLyogYm9vdCBzZWN0b3IgKi8KLXN0YXRpYyBCeXRlICBzX2ZzaW5mb19zZWN0b3IgWyBCWVRFU19QRVJfU0VDVE9SIF07ICAgLyogRlMgSW5mbyBzZWN0b3IgKi8KLXN0YXRpYyBCeXRlICBzX2ZhdF9oZWFkICAgICAgWyBCWVRFU19QRVJfU0VDVE9SIF07ICAgICAgICAvKiBmaXJzdCBGQVQgc2VjdG9yICovCi1zdGF0aWMgQnl0ZSAgc196ZXJvX3NlY3RvciAgIFsgQllURVNfUEVSX1NFQ1RPUiBdOyAgICAgLyogZW1wdHkgc2VjdG9yICovCi0KLS8qIHRoaXMgaXMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiBjcmVhdGluZyB0aGUgZGlzayAqLwotc3RhdGljIGludAotZ2V0X3NlcmlhbF9pZCggdm9pZCApCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgIGxvLCBoaSwgbWlkOwotICAgIHRpbWVfdCAgICAgICAgICBub3cgPSB0aW1lKE5VTEwpOwotICAgIHN0cnVjdCB0bSAgICAgICB0bSAgPSBnbXRpbWUoICZub3cgKVswXTsKLQotICAgIGxvICA9ICh1bnNpZ25lZCBzaG9ydCkodG0udG1fbWRheSArICgodG0udG1fbW9uKzEpIDw8IDgpICsgKHRtLnRtX3NlYyA8PCA4KSk7Ci0gICAgaGkgID0gKHVuc2lnbmVkIHNob3J0KSh0bS50bV9taW4gKyAodG0udG1faG91ciA8PCA4KSArICh0bS50bV95ZWFyICsgMTkwMCkpOwotCi0gICAgcmV0dXJuIGxvICsgKGhpIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZ2V0X3NlY3RvcnNfcGVyX2NsdXN0ZXIoIFdpZGUgIGRpc2tfc2l6ZSApCi17Ci0gICAgV2lkZSAgZGlza19NQiA9IGRpc2tfc2l6ZS8oMTAyNCoxMDI0KTsKLQotICAgIGlmIChkaXNrX01CIDwgMjYwKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChkaXNrX01CIDwgODE5MikKLSAgICAgICAgcmV0dXJuIDQ7Ci0KLSAgICBpZiAoZGlza19NQiA8IDE2Mzg0KQotICAgICAgICByZXR1cm4gODsKLQotICAgIGlmIChkaXNrX01CIDwgMzI3NjgpCi0gICAgICAgIHJldHVybiAxNjsKLQotICAgIHJldHVybiAzMjsKLX0KLQotc3RhdGljIGludAotZ2V0X3NlY3RvcnNfcGVyX2ZhdCggV2lkZSAgZGlza19zaXplLCBpbnQgIHNlY3RvcnNfcGVyX2NsdXN0ZXIgKQotewotICAgIFdpZGUgICBkaXZpZGVyOwotCi0gICAgLyogd2VpcmQgY29tcHV0YXRpb24gZnJvbSBNUyAtIHNlZSBmYXRnZW4xMDMuZG9jIGZvciBkZXRhaWxzICovCi0gICAgZGlza19zaXplIC09IFJFU0VSVkVEX1NFQ1RPUlMgKiBCWVRFU19QRVJfU0VDVE9SOyAgLyogZG9uJ3QgY291bnQgMzIgcmVzZXJ2ZWQgc2VjdG9ycyAqLwotICAgIGRpc2tfc2l6ZSAvPSBCWVRFU19QRVJfU0VDVE9SOyAgICAgICAvKiBkaXNrIHNpemUgaW4gc2VjdG9ycyAqLwotICAgIGRpdmlkZXIgPSAoKDI1NiAqIHNlY3RvcnNfcGVyX2NsdXN0ZXIpICsgTlVNX0ZBVFMpIC8gMjsKLQotICAgIHJldHVybiAoaW50KSggKGRpc2tfc2l6ZSArIChkaXZpZGVyLTEpKSAvIGRpdmlkZXIgKTsKLX0KLQotc3RhdGljIHZvaWQKLWJvb3Rfc2VjdG9yX2luaXQoIEJ5dGVzICBib290LCBCeXRlcyAgaW5mbywgV2lkZSAgIGRpc2tfc2l6ZSwgY29uc3QgY2hhciogIGxhYmVsICkKLXsKLSAgICBpbnQgICBzZWN0b3JzX3Blcl9jbHVzdGVyID0gZ2V0X3NlY3RvcnNfcGVyX2NsdXN0ZXIoZGlza19zaXplKTsKLSAgICBpbnQgICBzZWN0b3JzX3Blcl9mYXQgICAgPSBnZXRfc2VjdG9yc19wZXJfZmF0KGRpc2tfc2l6ZSwgc2VjdG9yc19wZXJfY2x1c3Rlcik7Ci0gICAgaW50ICAgc2VjdG9yc19wZXJfZGlzayAgID0gKGludCkoZGlza19zaXplIC8gQllURVNfUEVSX1NFQ1RPUik7Ci0gICAgaW50ICAgc2VyaWFsX2lkICAgICAgICAgID0gZ2V0X3NlcmlhbF9pZCgpOwotICAgIGludCAgIGZyZWVfY291bnQ7Ci0KLSAgICBpZiAobGFiZWwgPT0gTlVMTCkKLSAgICAgICAgbGFiZWwgPSAiU0RDQVJEIjsKLQotICAgIFBPS0VCKGJvb3QsIDB4ZWIpOwotICAgIFBPS0VCKGJvb3QrMSwgMHg1YSk7Ci0gICAgUE9LRUIoYm9vdCsyLCAweDkwKTsKLSAgICBzdHJjcHkoIChjaGFyKilib290ICsgMywgIk1TV0lONC4xIiApOwotICAgIFBPS0VTKCBib290ICsgMHgwYiwgQllURVNfUEVSX1NFQ1RPUiApOyAgICAvKiBzZWN0b3Igc2l6ZSAqLwotICAgIFBPS0VCKCBib290ICsgMHhkLCBzZWN0b3JzX3Blcl9jbHVzdGVyICk7ICAvKiBzZWN0b3JzIHBlciBjbHVzdGVyICovCi0gICAgUE9LRVMoIGJvb3QgKyAweGUsIFJFU0VSVkVEX1NFQ1RPUlMgKTsgICAgIC8qIHJlc2VydmVkIHNlY3RvcnMgYmVmb3JlIGZpcnN0IEZBVCAqLwotICAgIFBPS0VCKCBib290ICsgMHgxMCwgTlVNX0ZBVFMgKTsgICAgICAgICAgICAvKiBudW1iZXIgb2YgRkFUcyAqLwotICAgIFBPS0VTKCBib290ICsgMHgxMSwgMCApOyAgICAgICAgICAgICAgICAgICAvKiBtYXggcm9vdCBkaXJlY3RvcnkgZW50cmllcyBmb3IgRkFUMTIvRkFUMTYsIDAgZm9yIEZBVDMyICovCi0gICAgUE9LRVMoIGJvb3QgKyAweDEzLCAwICk7ICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHNlY3RvcnMsIDAgdG8gdXNlIDMyLWJpdCB2YWx1ZSBhdCBvZmZzZXQgMHgyMCAqLwotICAgIFBPS0VCKCBib290ICsgMHgxNSwgMHhGOCApOyAgICAgICAgICAgICAgICAvKiBtZWRpYSBkZXNjcmlwdG9yLCAweEY4ID09IGhhcmQgZGlzayAqLwotICAgIFBPS0VTKCBib290ICsgMHgxNiwgMCApOyAgICAgICAgICAgICAgICAgICAvKiBTZWN0b3JzIHBlciBGQVQgZm9yIEZBVDEyLzE2LCAwIGZvciBGQVQzMiAqLwotICAgIFBPS0VTKCBib290ICsgMHgxOCwgOSApOyAgICAgICAgICAgICAgICAgICAvKiBTZWN0b3JzIHBlciB0cmFjayAod2hhdGV2ZXIpICovCi0gICAgUE9LRVMoIGJvb3QgKyAweDFhLCAyICk7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBoZWFkcyAod2hhdGV2ZXIpICovCi0gICAgUE9LRVcoIGJvb3QgKyAweDFjLCAwICk7ICAgICAgICAgICAgICAgICAgIC8qIEhpZGRlbiBzZWN0b3JzICovCi0gICAgUE9LRVcoIGJvb3QgKyAweDIwLCBzZWN0b3JzX3Blcl9kaXNrICk7ICAgIC8qIFRvdGFsIHNlY3RvcnMgKi8KLQotICAgIC8qIGV4dGVuc2lvbiAqLwotICAgIFBPS0VXKCBib290ICsgMHgyNCwgc2VjdG9yc19wZXJfZmF0ICk7ICAgICAgIC8qIFNlY3RvcnMgcGVyIEZBVCAqLwotICAgIFBPS0VTKCBib290ICsgMHgyOCwgMCApOyAgICAgICAgIC8qIEZBVCBmbGFncyAqLwotICAgIFBPS0VTKCBib290ICsgMHgyYSwgMCApOyAgICAgICAgIC8qIHZlcnNpb24gKi8KLSAgICBQT0tFVyggYm9vdCArIDB4MmMsIDIgKTsgICAgICAgICAvKiBjbHVzdGVyIG51bWJlciBvZiByb290IGRpcmVjdG9yeSBzdGFydCAqLwotICAgIFBPS0VTKCBib290ICsgMHgzMCwgMSApOyAgICAgICAgIC8qIHNlY3RvciBudW1iZXIgb2YgRlMgaW5mb3JtYXRpb24gc2VjdG9yICovCi0gICAgUE9LRVMoIGJvb3QgKyAweDMyLCBCQUNLVVBfQk9PVF9TRUNUT1IgKTsgICAgICAgICAvKiBzZWN0b3IgbnVtYmVyIG9mIGEgY29weSBvZiB0aGlzIGJvb3Qgc2VjdG9yICovCi0gICAgUE9LRUIoIGJvb3QgKyAweDQwLCAweDgwICk7ICAgICAgLyogcGh5c2ljYWwgZHJpdmUgbnVtYmVyICovCi0gICAgUE9LRUIoIGJvb3QgKyAweDQyLCAweDI5ICk7ICAgICAgLyogZXh0ZW5kZWQgYm9vdCBzaWduYXR1cmUgPz8gKi8KLSAgICBQT0tFVyggYm9vdCArIDB4NDMsIHNlcmlhbF9pZCApOyAvKiBzZXJpYWwgSUQgKi8KLSAgICBzdHJuY3B5KCAoY2hhciopYm9vdCArIDB4NDcsIGxhYmVsLCAxMSApOyAgLyogVm9sdW1lIExhYmVsICovCi0gICAgbWVtY3B5KCBib290ICsgMHg1MiwgIkZBVDMyICAgIiwgOCApOyAgLyogRkFUIHN5c3RlbSB0eXBlLCBwYWRkZWQgd2l0aCAweDIwICovCi0KLSAgICBQT0tFQiggYm9vdCArIEJZVEVTX1BFUl9TRUNUT1ItMiwgMHg1NSApOyAgICAvKiBib290IHNlY3RvciBzaWduYXR1cmUgKi8KLSAgICBQT0tFQiggYm9vdCArIEJZVEVTX1BFUl9TRUNUT1ItMSwgMHhBQSApOwotCi0gICAgLyogRlNJbmZvIHNlY3RvciAqLwotICAgIGZyZWVfY291bnQgPSBzZWN0b3JzX3Blcl9kaXNrIC0gMzIgLSAyKnNlY3RvcnNfcGVyX2ZhdDsKLQotICAgIFBPS0VXKCBpbmZvICsgMCwgICAweDQxNjE1MjUyICk7Ci0gICAgUE9LRVcoIGluZm8gKyA0ODQsIDB4NjE0MTcyNzIgKTsKLSAgICBQT0tFVyggaW5mbyArIDQ4OCwgZnJlZV9jb3VudCApOyAgIC8qIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzICovCi0gICAgUE9LRVcoIGluZm8gKyA0OTIsIDMgKTsgICAgICAgICAgICAvKiBuZXh0IGZyZWUgY2x1c3RlcnMsIDAtMSByZXNlcnZlZCwgMiBpcyB1c2VkIGZvciB0aGUgcm9vdCBkaXIgKi8KLSAgICBQT0tFVyggaW5mbyArIDUwOCwgMHhBQTU1MDAwMCApOwotfQotCi1zdGF0aWMgdm9pZAotZmF0X2luaXQoIEJ5dGVzICBmYXQgKQotewotICAgIFBPS0VXKCBmYXQsICAgICAweDBmZmZmZmY4ICk7ICAvKiByZXNlcnZlIGNsdXN0ZXIgMSwgbWVkaWEgaWQgaW4gbG93IGJ5dGUgKi8KLSAgICBQT0tFVyggZmF0ICsgNCwgMHgwZmZmZmZmZiApOyAgLyogcmVzZXJ2ZSBjbHVzdGVyIDIgKi8KLSAgICBQT0tFVyggZmF0ICsgOCwgMHgwZmZmZmZmZiApOyAgLyogZW5kIG9mIGNsdXN0IGNoYWluIGZvciByb290IGRpciAqLwotfQotCi0KLXN0YXRpYyBpbnQKLXdyaXRlX3NlY3RvciggRklMRSogIGZpbGUsIEJ5dGVzICBzZWN0b3IgKQotewotICAgIHJldHVybiBmd3JpdGUoIHNlY3RvciwgMSwgNTEyLCBmaWxlICkgIT0gNTEyOwotfQotCi1zdGF0aWMgaW50Ci13cml0ZV9lbXB0eSggRklMRSogICBmaWxlLCBXaWRlICBjb3VudCApCi17Ci0gICAgc3RhdGljICBCeXRlICBlbXB0eVs2NCoxMDI0XTsKLQotICAgIGNvdW50ICo9IDUxMjsKLSAgICB3aGlsZSAoY291bnQgPiAwKSB7Ci0gICAgICAgIGludCAgbGVuID0gc2l6ZW9mKGVtcHR5KTsKLSAgICAgICAgaWYgKGxlbiA+IGNvdW50KQotICAgICAgICAgICAgbGVuID0gY291bnQ7Ci0KLSAgICAgICAgaWYgKCBmd3JpdGUoIGVtcHR5LCAxLCBsZW4sIGZpbGUgKSAhPSAoc2l6ZV90KWxlbiApCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBjb3VudCAtPSBsZW47Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB1c2FnZSAodm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIm1rc2RjYXJkOiBjcmVhdGUgYSBibGFuayBGQVQzMiBpbWFnZSB0byBiZSB1c2VkIHdpdGggdGhlIEFuZHJvaWQgZW11bGF0b3JcbiIgKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBta3NkY2FyZCBbLWwgbGFiZWxdIDxzaXplPiA8ZmlsZT5cblxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGlmIDxzaXplPiBpcyBhIHNpbXBsZSBpbnRlZ2VyLCBpdCBzcGVjaWZpZXMgYSBzaXplIGluIGJ5dGVzXG4iICk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGlmIDxzaXplPiBpcyBhbiBpbnRlZ2VyIGZvbGxvd2VkIGJ5ICdLJywgaXQgc3BlY2lmaWVzIGEgc2l6ZSBpbiBLaUJcbiIgKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgaWYgPHNpemU+IGlzIGFuIGludGVnZXIgZm9sbG93ZWQgYnkgJ00nLCBpdCBzcGVjaWZpZXMgYSBzaXplIGluIE1pQlxuIiApOwotICAgIGV4aXQoMSk7Ci19Ci0KLWludCAgbWFpbiggaW50IGFyZ2MsIGNoYXIqKiAgYXJndiApCi17Ci0gICAgV2lkZSAgIGRpc2tfc2l6ZTsKLSAgICBpbnQgICAgc2VjdG9yc19wZXJfZmF0OwotICAgIGludCAgICBzZWN0b3JzX3Blcl9kaXNrOwotICAgIGNoYXIqICBlbmQ7Ci0gICAgY29uc3QgY2hhciogIGxhYmVsID0gTlVMTDsKLSAgICBGSUxFKiAgZjsKLQotICAgIGZvciAoIDsgYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLSc7IGFyZ2MtLSwgYXJndisrICkKLSAgICB7Ci0gICAgICAgIGNoYXIqICBhcmcgPSBhcmd2WzFdICsgMTsKLSAgICAgICAgc3dpdGNoIChhcmdbMF0pIHsKLSAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgIGlmIChhcmdbMV0gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYXJnICs9IDI7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2MtLTsKLSAgICAgICAgICAgICAgICAgICAgYXJndisrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnYyA8PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndlsxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBhcmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhcmdjICE9IDMpCi0gICAgICAgIHVzYWdlKCk7Ci0KLSAgICBkaXNrX3NpemUgPSBzdHJ0b2woIGFyZ3ZbMV0sICZlbmQsIDEwICk7Ci0gICAgaWYgKGRpc2tfc2l6ZSA9PSAwICYmIGVycm5vID09IEVJTlZBTCkKLSAgICAgICAgdXNhZ2UoKTsKLQotICAgIGlmICgqZW5kID09ICdLJykKLSAgICAgICAgZGlza19zaXplICo9IDEwMjQ7Ci0gICAgZWxzZSBpZiAoKmVuZCA9PSAnTScpCi0gICAgICAgIGRpc2tfc2l6ZSAqPSAxMDI0KjEwMjQ7Ci0KLSAgICBpZiAoZGlza19zaXplIDwgOCoxMDI0KjEwMjQpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiIyMjIFdBUk5JTkcgOiBTRCBDYXJkIGltYWdlcyA8IDggTUIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgQW5kcm9pZCBlbXVsYXRvclxuIik7Ci0KLSAgICBzZWN0b3JzX3Blcl9kaXNrID0gZGlza19zaXplIC8gNTEyOwotICAgIHNlY3RvcnNfcGVyX2ZhdCAgPSBnZXRfc2VjdG9yc19wZXJfZmF0KCBkaXNrX3NpemUsIGdldF9zZWN0b3JzX3Blcl9jbHVzdGVyKCBkaXNrX3NpemUgKSApOwotCi0gICAgYm9vdF9zZWN0b3JfaW5pdCggc19ib290X3NlY3Rvciwgc19mc2luZm9fc2VjdG9yLCBkaXNrX3NpemUsIE5VTEwgKTsKLSAgICBmYXRfaW5pdCggc19mYXRfaGVhZCApOwotCi0gICAgZiA9IGZvcGVuKCBhcmd2WzJdLCAid2IiICk7Ci0gICAgaWYgKCAhZiApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGZpbGUgJyVzJywgYWJvcnRpbmcuLi5cbiIsIGFyZ3ZbMl0gKTsKLSAgICB9Ci0KLSAgIC8qIGhlcmUncyB0aGUgbGF5b3V0OgotICAgICoKLSAgICAqICBib290X3NlY3RvcgotICAgICogIGZzaW5mb19zZWN0b3IKLSAgICAqICBlbXB0eQotICAgICogIGJhY2t1cCBib290IHNlY3RvcgotICAgICogIGJhY2t1cCBmc2luZm8gc2VjdG9yCi0gICAgKiAgUkVTRVJWRURfU0VDVE9SUyAtIDQgZW1wdHkgc2VjdG9ycyAoaWYgYmFja3VwIHNlY3RvcnMpLCBvciBSRVNFUlZFRF9TRUNUT1JTIC0gMiAoaWYgbm8gYmFja3VwKQotICAgICogIGZpcnN0IGZhdAotICAgICogIHNlY29uZCBmYXQKLSAgICAqICB6ZXJvIHNlY3RvcnMKLSAgICovCi0KLSAgICBpZiAoIHdyaXRlX3NlY3RvciggZiwgc19ib290X3NlY3RvciApICkgIGdvdG8gRmFpbFdyaXRlOwotICAgIGlmICggd3JpdGVfc2VjdG9yKCBmLCBzX2ZzaW5mb19zZWN0b3IgKSApIGdvdG8gRmFpbFdyaXRlOwotICAgIGlmICggQkFDS1VQX0JPT1RfU0VDVE9SID4gMCApIHsKLSAgICAgICAgaWYgKCB3cml0ZV9lbXB0eSggZiwgQkFDS1VQX0JPT1RfU0VDVE9SIC0gMiApICkgZ290byBGYWlsV3JpdGU7Ci0gICAgICAgIGlmICggd3JpdGVfc2VjdG9yKCBmLCBzX2Jvb3Rfc2VjdG9yICkgKSBnb3RvIEZhaWxXcml0ZTsKLSAgICAgICAgaWYgKCB3cml0ZV9zZWN0b3IoIGYsIHNfZnNpbmZvX3NlY3RvciApICkgZ290byBGYWlsV3JpdGU7Ci0gICAgICAgIGlmICggd3JpdGVfZW1wdHkoIGYsIFJFU0VSVkVEX1NFQ1RPUlMgLSAyIC0gQkFDS1VQX0JPT1RfU0VDVE9SICkgKSBnb3RvIEZhaWxXcml0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpZiAoIHdyaXRlX2VtcHR5KCBmLCBSRVNFUlZFRF9TRUNUT1JTIC0gMiApICkgZ290byBGYWlsV3JpdGU7Ci0KLSAgICBpZiAoIHdyaXRlX3NlY3RvciggZiwgc19mYXRfaGVhZCApICkgZ290byBGYWlsV3JpdGU7Ci0gICAgaWYgKCB3cml0ZV9lbXB0eSggZiwgc2VjdG9yc19wZXJfZmF0LTEgKSApIGdvdG8gRmFpbFdyaXRlOwotCi0gICAgaWYgKCB3cml0ZV9zZWN0b3IoIGYsIHNfZmF0X2hlYWQgKSApIGdvdG8gRmFpbFdyaXRlOwotICAgIGlmICggd3JpdGVfZW1wdHkoIGYsIHNlY3RvcnNfcGVyX2ZhdC0xICkgKSBnb3RvIEZhaWxXcml0ZTsKLQotICAgIGlmICggd3JpdGVfZW1wdHkoIGYsIHNlY3RvcnNfcGVyX2Rpc2sgLSBSRVNFUlZFRF9TRUNUT1JTIC0gMipzZWN0b3JzX3Blcl9mYXQgKSApIGdvdG8gRmFpbFdyaXRlOwotCi0gICAgZmNsb3NlKGYpOwotICAgIHJldHVybiAwOwotCi1GYWlsV3JpdGU6Ci0gICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgd3JpdGUgdG8gJyVzJywgYWJvcnRpbmcuLi5cbiIsIGFyZ3ZbMl0gKTsKLSAgICB1bmxpbmsoIGFyZ3ZbMl0gKTsKLSAgICBmY2xvc2UoZik7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9ta3NkY2FyZC92ZmF0LWVtcHR5LTMyTUIuaW1nLmd6IGIvZW11bGF0b3IvbWtzZGNhcmQvdmZhdC1lbXB0eS0zMk1CLmltZy5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwNWRhMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9ta3NkY2FyZC92ZmF0LWVtcHR5LTMyTUIuaW1nLmd6CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcWVtdWQvQW5kcm9pZC5tayBiL2VtdWxhdG9yL3FlbXVkL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODZjNzMuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcWVtdWQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JcWVtdWQuYwotCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0KLUxPQ0FMX01PRFVMRTo9IHFlbXVkCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3FlbXVkL3FlbXVkLmMgYi9lbXVsYXRvci9xZW11ZC9xZW11ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIyYTJiLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3FlbXVkL3FlbXVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzE1ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0KLS8qCi0gKiAgdGhlIHFlbXVkIGRhZW1vbiBwcm9ncmFtIGlzIG9ubHkgdXNlZCB3aXRoaW4gQW5kcm9pZCBhcyBhIGJyaWRnZQotICogIGJldHdlZW4gdGhlIGVtdWxhdG9yIHByb2dyYW0gYW5kIHRoZSBlbXVsYXRlZCBzeXN0ZW0uIGl0IHJlYWxseSB3b3JrcyBhcwotICogIGEgc2ltcGxlIHN0cmVhbSBtdWx0aXBsZXhlciB0aGF0IHdvcmtzIGFzIGZvbGxvd3M6Ci0gKgotICogICAgLSBxZW11ZCBpcyBzdGFydGVkIGJ5IGluaXQgZm9sbG93aW5nIGluc3RydWN0aW9ucyBpbgotICogICAgICAvc3lzdGVtL2V0Yy9pbml0LmdvbGRmaXNoLnJjIChpLmUuIGl0IGlzIG5ldmVyIHN0YXJ0ZWQgb24gcmVhbCBkZXZpY2VzKQotICoKLSAqICAgIC0gcWVtdWQgY29tbXVuaWNhdGVzIHdpdGggdGhlIGVtdWxhdG9yIHByb2dyYW0gdGhyb3VnaCBhIHNpbmdsZSBzZXJpYWwKLSAqICAgICAgcG9ydCwgd2hvc2UgbmFtZSBpcyBwYXNzZWQgdGhyb3VnaCBhIGtlcm5lbCBib290IHBhcmFtZXRlcgotICogICAgICAoZS5nLiBhbmRyb2lkLnFlbXVkPXR0eVMxKQotICoKLSAqICAgIC0gcWVtdWQgYmluZHMgb25lIHVuaXggbG9jYWwgc3RyZWFtIHNvY2tldCAoL2Rldi9zb2NrZXQvcWVtdWQsIGNyZWF0ZWQKLSAqICAgICAgYnkgaW5pdCB0aHJvdWdoIC9zeXN0ZW0vZXRjL2luaXQuZ29sZGZpc2gucmMpLgotICoKLSAqCi0gKiAgICAgIGVtdWxhdG9yIDw9PXNlcmlhbD09PiBxZW11ZCA8LS0tPiAvZGV2L3NvY2tldC9xZW11ZCA8LSstLT4gY2xpZW50MQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLT4gY2xpZW50MgotICoKLSAqICAgLSB0aGUgc3BlY2lhbCBjaGFubmVsIGluZGV4IDAgaXMgdXNlZCBieSB0aGUgZW11bGF0b3IgYW5kIHFlbXVkIG9ubHkuCi0gKiAgICAgb3RoZXIgY2hhbm5lbCBudW1iZXJzIGNvcnJlc3BvbmQgdG8gY2xpZW50cy4gTW9yZSBzcGVjaWZpY2FsbHksCi0gKiAgICAgY29ubmVjdGlvbiBhcmUgY3JlYXRlZCBsaWtlIHRoaXM6Ci0gKgotICogICAgICogdGhlIGNsaWVudCBjb25uZWN0cyB0byAvZGV2L3NvY2tldC9xZW11ZAotICoKLSAqICAgICAqIHRoZSBjbGllbnQgc2VuZHMgdGhlIHNlcnZpY2UgbmFtZSB0aHJvdWdoIHRoZSBzb2NrZXQsIGFzCi0gKiAgICAgICAgICAgIDxzZXJ2aWNlLW5hbWU+Ci0gKgotICogICAgICogcWVtdWQgY3JlYXRlcyBhICJDbGllbnQiIG9iamVjdCBpbnRlcm5hbGx5LCBhc3NpZ25zIGl0IGFuCi0gKiAgICAgICBpbnRlcm5hbCB1bmlxdWUgY2hhbm5lbCBudW1iZXIgPiAwLCB0aGVuIHNlbmRzIGEgY29ubmVjdGlvbgotICogICAgICAgaW5pdGlhdGlvbiByZXF1ZXN0IHRvIHRoZSBlbXVsYXRvciAoaS5lLiB0aHJvdWdoIGNoYW5uZWwgMCk6Ci0gKgotICogICAgICAgICAgIGNvbm5lY3Q6PGlkPjo8bmFtZT4KLSAqCi0gKiAgICAgICB3aGVyZSA8bmFtZT4gaXMgdGhlIHNlcnZpY2UgbmFtZSwgYW5kIDxpZD4gaXMgYSAyLWhleGNoYXIKLSAqICAgICAgIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFubmVsIG51bWJlci4KLSAqCi0gKiAgICAgKiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBlbXVsYXRvciByZXNwb25kcyB0aHJvdWdoIGNoYW5uZWwgMAotICogICAgICAgd2l0aDoKLSAqCi0gKiAgICAgICAgICAgb2s6Y29ubmVjdDo8aWQ+Ci0gKgotICogICAgICAgYWZ0ZXIgdGhpcywgYWxsIG1lc3NhZ2VzIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIGVtdWxhdG9yCi0gKiAgICAgICBhcmUgcGFzc2VkIGluIHBhc3MtdGhyb3VnaCBtb2RlLgotICoKLSAqICAgICAqIGlmIHRoZSBlbXVsYXRvciByZWZ1c2VzIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24sIGl0IHdpbGwKLSAqICAgICAgIHNlbmQgdGhlIGZvbGxvd2luZyB0aHJvdWdoIGNoYW5uZWwgMDoKLSAqCi0gKiAgICAgICAgICAga286Y29ubmVjdDo8aWQ+OnJlYXNvbi1mb3ItZmFpbHVyZQotICoKLSAqICAgICAqIElmIHRoZSBjbGllbnQgY2xvc2VzIHRoZSBjb25uZWN0aW9uLCBxZW11ZCBzZW5kcyB0aGUgZm9sbG93aW5nCi0gKiAgICAgICB0byB0aGUgZW11bGF0b3I6Ci0gKgotICogICAgICAgICAgIGRpc2Nvbm5lY3Q6PGlkPgotICoKLSAqICAgICAgIFRoZSBzYW1lIG1lc3NhZ2UgaXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBpZiB0aGUgZW11bGF0b3IKLSAqICAgICAgIGNob29zZXMgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0gKgotICogICAgICogYW55IGNvbW1hbmQgc2VudCB0aHJvdWdoIGNoYW5uZWwgMCB0byB0aGUgZW11bGF0b3IgdGhhdCBpcwotICogICAgICAgbm90IHByb3Blcmx5IHJlY29nbml6ZWQgd2lsbCBiZSBhbnN3ZXJlZCBieToKLSAqCi0gKiAgICAgICAgICAga286dW5rbm93biBjb21tYW5kCi0gKgotICoKLSAqICBJbnRlcm5hbGx5LCB0aGUgZGFlbW9uIG1haW50YWlucyBhICJDbGllbnQiIG9iamVjdCBmb3IgZWFjaCBjbGllbnQKLSAqICBjb25uZWN0aW9uIChpLmUuIGFjY2VwdGluZyBzb2NrZXQgY29ubmVjdGlvbikuCi0gKi8KLQotLyogbmFtZSBvZiB0aGUgc2luZ2xlIGNvbnRyb2wgc29ja2V0IHVzZWQgYnkgdGhlIGRhZW1vbiAqLwotI2RlZmluZSBDT05UUk9MX1NPQ0tFVF9OQU1FICAicWVtdWQiCi0KLSNkZWZpbmUgIERFQlVHICAgICAxCi0jZGVmaW5lICBUX0FDVElWRSAgMCAgLyogc2V0IHRvIDEgdG8gZHVtcCB0cmFmZmljICovCi0KLSNpZiBERUJVRwotIyAgZGVmaW5lIExPR19UQUcgICJxZW11ZCIKLSMgIGluY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSMgIGRlZmluZSAgRCguLi4pICAgTE9HRChfX1ZBX0FSR1NfXykKLSNlbHNlCi0jICBkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCi0jICBkZWZpbmUgIFQoLi4uKSAgKCh2b2lkKTApCi0jZW5kaWYKLQotI2lmIFRfQUNUSVZFCi0jICBkZWZpbmUgIFQoLi4uKSAgIEQoX19WQV9BUkdTX18pCi0jZWxzZQotIyAgZGVmaW5lICBUKC4uLikgICAoKHZvaWQpMCkKLSNlbmRpZgotCi0vKiogVVRJTElUSUVTCi0gKiovCi0KLXN0YXRpYyB2b2lkCi1mYXRhbCggY29uc3QgY2hhciogIGZtdCwgLi4uICkKLXsKLSAgICB2YV9saXN0ICBhcmdzOwotICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJQQU5JQzogIik7Ci0gICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXG4iICk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkKgoteGFsbG9jKCBzaXplX3QgICBzeiApCi17Ci0gICAgdm9pZCogIHA7Ci0KLSAgICBpZiAoc3ogPT0gMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBwID0gbWFsbG9jKHN6KTsKLSAgICBpZiAocCA9PSBOVUxMKQotICAgICAgICBmYXRhbCggIm5vdCBlbm91Z2ggbWVtb3J5IiApOwotCi0gICAgcmV0dXJuIHA7Ci19Ci0KLSNkZWZpbmUgIHhuZXcocCkgICAocCkgPSB4YWxsb2Moc2l6ZW9mKCoocCkpKQotCi1zdGF0aWMgdm9pZCoKLXhhbGxvYzAoIHNpemVfdCAgc3ogKQotewotICAgIHZvaWQqICBwID0geGFsbG9jKHN6KTsKLSAgICBtZW1zZXQoIHAsIDAsIHN6ICk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLSNkZWZpbmUgIHhuZXcwKHApICAgKHApID0geGFsbG9jMChzaXplb2YoKihwKSkpCi0KLSNkZWZpbmUgIHhmcmVlKHApICAgIChmcmVlKChwKSksIChwKSA9IE5VTEwpCi0KLXN0YXRpYyB2b2lkKgoteHJlYWxsb2MoIHZvaWQqICBibG9jaywgc2l6ZV90ICBzaXplICkKLXsKLSAgICB2b2lkKiAgcCA9IHJlYWxsb2MoIGJsb2NrLCBzaXplICk7Ci0KLSAgICBpZiAocCA9PSBOVUxMICYmIHNpemUgPiAwKQotICAgICAgICBmYXRhbCggIm5vdCBlbm91Z2ggbWVtb3J5IiApOwotCi0gICAgcmV0dXJuIHA7Ci19Ci0KLSNkZWZpbmUgIHhyZW5ldyhwLGNvdW50KSAgKHApID0geHJlYWxsb2MoKHApLHNpemVvZigqKHApKSooY291bnQpKQotCi1zdGF0aWMgaW50Ci1oZXgyaW50KCBjb25zdCB1aW50OF90KiAgZGF0YSwgaW50ICBsZW4gKQotewotICAgIGludCAgcmVzdWx0ID0gMDsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgICAgICAgYyA9ICpkYXRhKys7Ci0gICAgICAgIHVuc2lnbmVkICBkOwotCi0gICAgICAgIHJlc3VsdCA8PD0gNDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgZCA9ICh1bnNpZ25lZCkoYyAtICcwJyk7Ci0gICAgICAgICAgICBpZiAoZCA8IDEwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkID0gKHVuc2lnbmVkKShjIC0gJ2EnKTsKLSAgICAgICAgICAgIGlmIChkIDwgNikgewotICAgICAgICAgICAgICAgIGQgKz0gMTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGQgPSAodW5zaWduZWQpKGMgLSAnQScpOwotICAgICAgICAgICAgaWYgKGQgPCA2KSB7Ci0gICAgICAgICAgICAgICAgZCArPSAxMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgwKTsKLQotICAgICAgICByZXN1bHQgfD0gZDsKLSAgICAgICAgbGVuICAgIC09IDE7Ci0gICAgfQotICAgIHJldHVybiAgcmVzdWx0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnQyaGV4KCBpbnQgIHZhbHVlLCB1aW50OF90KiAgdG8sIGludCAgd2lkdGggKQotewotICAgIGludCAgbm4gPSAwOwotICAgIHN0YXRpYyBjb25zdCBjaGFyIGhleGNoYXJzWzE2XSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLQotICAgIGZvciAoIC0td2lkdGg7IHdpZHRoID49IDA7IHdpZHRoLS0sIG5uKysgKSB7Ci0gICAgICAgIHRvW25uXSA9IGhleGNoYXJzWyh2YWx1ZSA+PiAod2lkdGgqNCkpICYgMTVdOwotICAgIH0KLX0KLQotc3RhdGljIGludAotZmRfcmVhZChpbnQgIGZkLCB2b2lkKiAgdG8sIGludCAgbGVuKQotewotICAgIGludCAgcmV0OwotCi0gICAgZG8gewotICAgICAgICByZXQgPSByZWFkKGZkLCB0bywgbGVuKTsKLSAgICB9IHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWZkX3dyaXRlKGludCAgZmQsIGNvbnN0IHZvaWQqICBmcm9tLCBpbnQgIGxlbikKLXsKLSAgICBpbnQgIHJldDsKLQotICAgIGRvIHsKLSAgICAgICAgcmV0ID0gd3JpdGUoZmQsIGZyb20sIGxlbik7Ci0gICAgfSB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotZmRfc2V0bm9uYmxvY2soaW50ICBmZCkKLXsKLSAgICBpbnQgIHJldCwgZmxhZ3M7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkQpOwotICAgIH0gd2hpbGUgKGZsYWdzIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAoZmxhZ3MgPCAwKSB7Ci0gICAgICAgIGZhdGFsKCAiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIGZkICVkOiAlcyIsCi0gICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZkLCBzdHJlcnJvcihlcnJubykgKTsKLSAgICB9Ci0KLSAgICBkbyB7Ci0gICAgICAgIHJldCA9IGZjbnRsKGZkLCBGX1NFVEZELCBmbGFncyB8IE9fTk9OQkxPQ0spOwotICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZmF0YWwoICIlczogY291bGQgbm90IHNldCBmZCAlZCB0byBub24tYmxvY2tpbmc6ICVzIiwKLSAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZmQsIHN0cmVycm9yKGVycm5vKSApOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50Ci1mZF9hY2NlcHQoaW50ICBmZCkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgIGZyb207Ci0gICAgc29ja2xlbl90ICAgICAgICBmcm9tbGVuID0gc2l6ZW9mKGZyb20pOwotICAgIGludCAgICAgICAgICAgICAgcmV0OwotCi0gICAgZG8gewotICAgICAgICByZXQgPSBhY2NlcHQoZmQsICZmcm9tLCAmZnJvbWxlbik7Ci0gICAgfSB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiogRkQgRVZFTlQgTE9PUAotICoqLwotCi0vKiBBIExvb3BlciBvYmplY3QgaXMgdXNlZCB0byBtb25pdG9yIGFjdGl2aXR5IG9uIG9uZSBvciBtb3JlCi0gKiBmaWxlIGRlc2NyaXB0b3JzIChlLmcgc29ja2V0cykuCi0gKgotICogLSBjYWxsIGxvb3Blcl9hZGQoKSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotICogICBjYWxsZWQgd2hlbiBldmVudHMgaGFwcGVuIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKgotICogLSBjYWxsIGxvb3Blcl9lbmFibGUoKSBvciBsb29wZXJfZGlzYWJsZSgpIHRvIGVuYWJsZS9kaXNhYmxlCi0gKiAgIHRoZSBzZXQgb2YgbW9uaXRvcmVkIGV2ZW50cyBmb3IgYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCi0gKgotICogLSBjYWxsIGxvb3Blcl9kZWwoKSB0byB1bnJlZ2lzdGVyIGEgZmlsZSBkZXNjcmlwdG9yLgotICogICB0aGlzIGRvZXMgKm5vdCogY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IGNhbiBvbmx5IHByb3ZpZGUgYSBzaW5nbGUgZnVuY3Rpb24gdG8gaGFuZGxlCi0gKiBhbGwgZXZlbnRzIHJlbGF0ZWQgdG8gYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCi0KLSAqIFlvdSBjYW4gY2FsbCBsb29wZXJfZW5hYmxlL19kaXNhYmxlL19kZWwgd2l0aGluIGEgZnVuY3Rpb24KLSAqIGNhbGxiYWNrLgotICovCi0KLS8qIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgTGludXgncyBlcG9sbCBmYWNpbGl0eQotICogdGhlIGV2ZW50IG1hc2sgd2UgdXNlIGFyZSBzaW1wbHkgY29tYmluYXRpb25zIG9mIEVQT0xMSU4KLSAqIEVQT0xMT1VULCBFUE9MTEhVUCBhbmQgRVBPTExFUlIKLSAqLwotI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgotCi0jZGVmaW5lICBNQVhfQ0hBTk5FTFMgIDE2Ci0jZGVmaW5lICBNQVhfRVZFTlRTICAgIChNQVhfQ0hBTk5FTFMrMSkgIC8qIGVhY2ggY2hhbm5lbCArIHRoZSBzZXJpYWwgZmQgKi8KLQotLyogdGhlIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gdHlwZSwgJ3VzZXInIGlzIGEgdXNlci1zcGVjaWZpYwotICogb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIGxvb3Blcl9hZGQoKS4KLSAqLwotdHlwZWRlZiB2b2lkICgqRXZlbnRGdW5jKSggdm9pZCogIHVzZXIsIGludCAgZXZlbnRzICk7Ci0KLS8qIGJpdCBmbGFncyBmb3IgdGhlIExvb3BIb29rIHN0cnVjdHVyZS4KLSAqCi0gKiBIT09LX1BFTkRJTkcgbWVhbnMgdGhhdCBhbiBldmVudCBoYXBwZW5lZCBvbiB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgZmlsZSBkZXNjcmlwdG9yLgotICoKLSAqIEhPT0tfQ0xPU0lORyBpcyB1c2VkIHRvIGRlbGF5LWNsb3NlIG1vbml0b3JlZAotICogZmlsZSBkZXNjcmlwdG9ycy4KLSAqLwotZW51bSB7Ci0gICAgSE9PS19QRU5ESU5HID0gKDEgPDwgMCksCi0gICAgSE9PS19DTE9TSU5HID0gKDEgPDwgMSksCi19OwotCi0vKiBBIExvb3BIb29rIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1vbml0b3IgYSBnaXZlbgotICogZmlsZSBkZXNjcmlwdG9yIGFuZCByZWNvcmQgaXRzIGV2ZW50IGhhbmRsZXIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgICAgIGZkOwotICAgIGludCAgICAgICAgd2FudGVkOyAgLyogZXZlbnRzIHdlIGFyZSBtb25pdG9yaW5nICovCi0gICAgaW50ICAgICAgICBldmVudHM7ICAvKiBldmVudHMgdGhhdCBvY2N1cmVkICovCi0gICAgaW50ICAgICAgICBzdGF0ZTsgICAvKiBzZWUgSE9PS19YWFggY29uc3RhbnRzICovCi0gICAgdm9pZCogICAgICBldl91c2VyOyAvKiB1c2VyLXByb3ZpZGVkIGhhbmRsZXIgcGFyYW1ldGVyICovCi0gICAgRXZlbnRGdW5jICBldl9mdW5jOyAvKiBldmVudCBoYW5kbGVyIGNhbGxiYWNrICovCi19IExvb3BIb29rOwotCi0vKiBMb29wZXIgaXMgdGhlIG1haW4gb2JqZWN0IG1vZGVsaW5nIGEgbG9vcGVyIG9iamVjdAotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgZXBvbGxfZmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgbnVtX2ZkczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBtYXhfZmRzOwotICAgIHN0cnVjdCBlcG9sbF9ldmVudCogIGV2ZW50czsKLSAgICBMb29wSG9vayogICAgICAgICAgICBob29rczsKLX0gTG9vcGVyOwotCi0vKiBpbml0aWFsaXplIGEgbG9vcGVyIG9iamVjdCAqLwotc3RhdGljIHZvaWQKLWxvb3Blcl9pbml0KCBMb29wZXIqICBsICkKLXsKLSAgICBsLT5lcG9sbF9mZCA9IGVwb2xsX2NyZWF0ZSg0KTsKLSAgICBsLT5udW1fZmRzICA9IDA7Ci0gICAgbC0+bWF4X2ZkcyAgPSAwOwotICAgIGwtPmV2ZW50cyAgID0gTlVMTDsKLSAgICBsLT5ob29rcyAgICA9IE5VTEw7Ci19Ci0KLS8qIGZpbmFsaXplIGEgbG9vcGVyIG9iamVjdCAqLwotc3RhdGljIHZvaWQKLWxvb3Blcl9kb25lKCBMb29wZXIqICBsICkKLXsKLSAgICB4ZnJlZShsLT5ldmVudHMpOwotICAgIHhmcmVlKGwtPmhvb2tzKTsKLSAgICBsLT5tYXhfZmRzID0gMDsKLSAgICBsLT5udW1fZmRzID0gMDsKLQotICAgIGNsb3NlKGwtPmVwb2xsX2ZkKTsKLSAgICBsLT5lcG9sbF9mZCAgPSAtMTsKLX0KLQotLyogcmV0dXJuIHRoZSBMb29wSG9vayBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAqIG1vbml0b3JlZCBmaWxlIGRlc2NyaXB0b3IsIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKi8KLXN0YXRpYyBMb29wSG9vayoKLWxvb3Blcl9maW5kKCBMb29wZXIqICBsLCBpbnQgIGZkICkKLXsKLSAgICBMb29wSG9vayogIGhvb2sgPSBsLT5ob29rczsKLSAgICBMb29wSG9vayogIGVuZCAgPSBob29rICsgbC0+bnVtX2ZkczsKLQotICAgIGZvciAoIDsgaG9vayA8IGVuZDsgaG9vaysrICkgewotICAgICAgICBpZiAoaG9vay0+ZmQgPT0gZmQpCi0gICAgICAgICAgICByZXR1cm4gaG9vazsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGdyb3cgdGhlIGFycmF5cyBpbiB0aGUgbG9vcGVyIG9iamVjdCAqLwotc3RhdGljIHZvaWQKLWxvb3Blcl9ncm93KCBMb29wZXIqICBsICkKLXsKLSAgICBpbnQgIG9sZF9tYXggPSBsLT5tYXhfZmRzOwotICAgIGludCAgbmV3X21heCA9IG9sZF9tYXggKyAob2xkX21heCA+PiAxKSArIDQ7Ci0gICAgaW50ICBuOwotCi0gICAgeHJlbmV3KCBsLT5ldmVudHMsIG5ld19tYXggKTsKLSAgICB4cmVuZXcoIGwtPmhvb2tzLCAgbmV3X21heCApOwotICAgIGwtPm1heF9mZHMgPSBuZXdfbWF4OwotCi0gICAgLyogbm93IGNoYW5nZSB0aGUgaGFuZGxlcyB0byBhbGwgZXZlbnRzICovCi0gICAgZm9yIChuID0gMDsgbiA8IGwtPm51bV9mZHM7IG4rKykgewotICAgICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7Ci0gICAgICAgIExvb3BIb29rKiAgICAgICAgICBob29rID0gbC0+aG9va3MgKyBuOwotCi0gICAgICAgIGV2LmV2ZW50cyAgID0gaG9vay0+d2FudGVkOwotICAgICAgICBldi5kYXRhLnB0ciA9IGhvb2s7Ci0gICAgICAgIGVwb2xsX2N0bCggbC0+ZXBvbGxfZmQsIEVQT0xMX0NUTF9NT0QsIGhvb2stPmZkLCAmZXYgKTsKLSAgICB9Ci19Ci0KLS8qIHJlZ2lzdGVyIGEgZmlsZSBkZXNjcmlwdG9yIGFuZCBpdHMgZXZlbnQgaGFuZGxlci4KLSAqIG5vIGV2ZW50IG1hc2sgd2lsbCBiZSBlbmFibGVkCi0gKi8KLXN0YXRpYyB2b2lkCi1sb29wZXJfYWRkKCBMb29wZXIqICBsLCBpbnQgIGZkLCBFdmVudEZ1bmMgIGZ1bmMsIHZvaWQqICB1c2VyICkKLXsKLSAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgIGV2OwotICAgIExvb3BIb29rKiAgICAgICAgICAgaG9vazsKLQotICAgIGlmIChsLT5udW1fZmRzID49IGwtPm1heF9mZHMpCi0gICAgICAgIGxvb3Blcl9ncm93KGwpOwotCi0gICAgaG9vayA9IGwtPmhvb2tzICsgbC0+bnVtX2ZkczsKLQotICAgIGhvb2stPmZkICAgICAgPSBmZDsKLSAgICBob29rLT5ldl91c2VyID0gdXNlcjsKLSAgICBob29rLT5ldl9mdW5jID0gZnVuYzsKLSAgICBob29rLT5zdGF0ZSAgID0gMDsKLSAgICBob29rLT53YW50ZWQgID0gMDsKLSAgICBob29rLT5ldmVudHMgID0gMDsKLQotICAgIGZkX3NldG5vbmJsb2NrKGZkKTsKLQotICAgIGV2LmV2ZW50cyAgID0gMDsKLSAgICBldi5kYXRhLnB0ciA9IGhvb2s7Ci0gICAgZXBvbGxfY3RsKCBsLT5lcG9sbF9mZCwgRVBPTExfQ1RMX0FERCwgZmQsICZldiApOwotCi0gICAgbC0+bnVtX2ZkcyArPSAxOwotfQotCi0vKiB1bnJlZ2lzdGVyIGEgZmlsZSBkZXNjcmlwdG9yIGFuZCBpdHMgZXZlbnQgaGFuZGxlcgotICovCi1zdGF0aWMgdm9pZAotbG9vcGVyX2RlbCggTG9vcGVyKiAgbCwgaW50ICBmZCApCi17Ci0gICAgTG9vcEhvb2sqICBob29rID0gbG9vcGVyX2ZpbmQoIGwsIGZkICk7Ci0KLSAgICBpZiAoIWhvb2spIHsKLSAgICAgICAgRCggIiVzOiBpbnZhbGlkIGZkOiAlZCIsIF9fRlVOQ1RJT05fXywgZmQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBkb24ndCByZW1vdmUgdGhlIGhvb2sgeWV0ICovCi0gICAgaG9vay0+c3RhdGUgfD0gSE9PS19DTE9TSU5HOwotCi0gICAgZXBvbGxfY3RsKCBsLT5lcG9sbF9mZCwgRVBPTExfQ1RMX0RFTCwgZmQsIE5VTEwgKTsKLX0KLQotLyogZW5hYmxlIG1vbml0b3Jpbmcgb2YgY2VydGFpbiBldmVudHMgZm9yIGEgZmlsZQotICogZGVzY3JpcHRvci4gVGhpcyBhZGRzICdldmVudHMnIHRvIHRoZSBjdXJyZW50Ci0gKiBldmVudCBtYXNrCi0gKi8KLXN0YXRpYyB2b2lkCi1sb29wZXJfZW5hYmxlKCBMb29wZXIqICBsLCBpbnQgIGZkLCBpbnQgIGV2ZW50cyApCi17Ci0gICAgTG9vcEhvb2sqICBob29rID0gbG9vcGVyX2ZpbmQoIGwsIGZkICk7Ci0KLSAgICBpZiAoIWhvb2spIHsKLSAgICAgICAgRCgiJXM6IGludmFsaWQgZmQ6ICVkIiwgX19GVU5DVElPTl9fLCBmZCApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50cyAmIH5ob29rLT53YW50ZWQpIHsKLSAgICAgICAgc3RydWN0IGVwb2xsX2V2ZW50ICBldjsKLQotICAgICAgICBob29rLT53YW50ZWQgfD0gZXZlbnRzOwotICAgICAgICBldi5ldmVudHMgICA9IGhvb2stPndhbnRlZDsKLSAgICAgICAgZXYuZGF0YS5wdHIgPSBob29rOwotCi0gICAgICAgIGVwb2xsX2N0bCggbC0+ZXBvbGxfZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmZXYgKTsKLSAgICB9Ci19Ci0KLS8qIGRpc2FibGUgbW9uaXRvcmluZyBvZiBjZXJ0YWluIGV2ZW50cyBmb3IgYSBmaWxlCi0gKiBkZXNjcmlwdG9yLiBUaGlzIGlnbm9yZXMgZXZlbnRzIHRoYXQgYXJlIG5vdAotICogY3VycmVudGx5IGVuYWJsZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1sb29wZXJfZGlzYWJsZSggTG9vcGVyKiAgbCwgaW50ICBmZCwgaW50ICBldmVudHMgKQotewotICAgIExvb3BIb29rKiAgaG9vayA9IGxvb3Blcl9maW5kKCBsLCBmZCApOwotCi0gICAgaWYgKCFob29rKSB7Ci0gICAgICAgIEQoIiVzOiBpbnZhbGlkIGZkOiAlZCIsIF9fRlVOQ1RJT05fXywgZmQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChldmVudHMgJiBob29rLT53YW50ZWQpIHsKLSAgICAgICAgc3RydWN0IGVwb2xsX2V2ZW50ICBldjsKLQotICAgICAgICBob29rLT53YW50ZWQgJj0gfmV2ZW50czsKLSAgICAgICAgZXYuZXZlbnRzICAgPSBob29rLT53YW50ZWQ7Ci0gICAgICAgIGV2LmRhdGEucHRyID0gaG9vazsKLQotICAgICAgICBlcG9sbF9jdGwoIGwtPmVwb2xsX2ZkLCBFUE9MTF9DVExfTU9ELCBmZCwgJmV2ICk7Ci0gICAgfQotfQotCi0vKiB3YWl0IHVudGlsIGFuIGV2ZW50IG9jY3VycyBvbiBvbmUgb2YgdGhlIHJlZ2lzdGVyZWQgZmlsZQotICogZGVzY3JpcHRvcnMuIE9ubHkgcmV0dXJucyBpbiBjYXNlIG9mIGVycm9yICEhCi0gKi8KLXN0YXRpYyB2b2lkCi1sb29wZXJfbG9vcCggTG9vcGVyKiAgbCApCi17Ci0gICAgZm9yICg7OykgewotICAgICAgICBpbnQgIG4sIGNvdW50OwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNvdW50ID0gZXBvbGxfd2FpdCggbC0+ZXBvbGxfZmQsIGwtPmV2ZW50cywgbC0+bnVtX2ZkcywgLTEgKTsKLSAgICAgICAgfSB3aGlsZSAoY291bnQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgICAgICBEKCIlczogZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBEKCIlczogaHVoID8gZXBvbGwgcmV0dXJuZWQgY291bnQ9MCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG1hcmsgYWxsIHBlbmRpbmcgaG9va3MgKi8KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKLSAgICAgICAgICAgIExvb3BIb29rKiAgaG9vayA9IGwtPmV2ZW50c1tuXS5kYXRhLnB0cjsKLSAgICAgICAgICAgIGhvb2stPnN0YXRlICA9IEhPT0tfUEVORElORzsKLSAgICAgICAgICAgIGhvb2stPmV2ZW50cyA9IGwtPmV2ZW50c1tuXS5ldmVudHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBleGVjdXRlIGhvb2sgY2FsbGJhY2tzLiB0aGlzIG1heSBjaGFuZ2UgdGhlICdob29rcycKLSAgICAgICAgICogYW5kICdldmVudHMnIGFycmF5LCBhcyB3ZWxsIGFzIGwtPm51bV9mZHMsIHNvIGJlIGNhcmVmdWwgKi8KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IGwtPm51bV9mZHM7IG4rKykgewotICAgICAgICAgICAgTG9vcEhvb2sqICBob29rID0gbC0+aG9va3MgKyBuOwotICAgICAgICAgICAgaWYgKGhvb2stPnN0YXRlICYgSE9PS19QRU5ESU5HKSB7Ci0gICAgICAgICAgICAgICAgaG9vay0+c3RhdGUgJj0gfkhPT0tfUEVORElORzsKLSAgICAgICAgICAgICAgICBob29rLT5ldl9mdW5jKCBob29rLT5ldl91c2VyLCBob29rLT5ldmVudHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyByZW1vdmUgYWxsIHRoZSBob29rcyB0aGF0IHdlcmUgY2xvc2VkIGJ5Ci0gICAgICAgICAqIHRoZSBjYWxsYmFja3MgKi8KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IGwtPm51bV9mZHM7KSB7Ci0gICAgICAgICAgICBMb29wSG9vayogIGhvb2sgPSBsLT5ob29rcyArIG47Ci0KLSAgICAgICAgICAgIGlmICghKGhvb2stPnN0YXRlICYgSE9PS19DTE9TSU5HKSkgewotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaG9va1swXSAgICAgPSBsLT5ob29rc1tsLT5udW1fZmRzLTFdOwotICAgICAgICAgICAgbC0+bnVtX2ZkcyAtPSAxOwotICAgICAgICB9Ci0gICAgfQotfQotCi0jaWYgVF9BQ1RJVkUKLWNoYXIqCi1xdW90ZSggY29uc3Qgdm9pZCogIGRhdGEsIGludCAgbGVuICkKLXsKLSAgICBjb25zdCBjaGFyKiAgcCAgID0gZGF0YTsKLSAgICBjb25zdCBjaGFyKiAgZW5kID0gcCArIGxlbjsKLSAgICBpbnQgICAgICAgICAgY291bnQgPSAwOwotICAgIGludCAgICAgICAgICBwaGFzZSA9IDA7Ci0gICAgc3RhdGljIGNoYXIqICBidWZmID0gTlVMTDsKLQotICAgIGZvciAocGhhc2UgPSAwOyBwaGFzZSA8IDI7IHBoYXNlKyspIHsKLSAgICAgICAgaWYgKHBoYXNlICE9IDApIHsKLSAgICAgICAgICAgIHhmcmVlKGJ1ZmYpOwotICAgICAgICAgICAgYnVmZiA9IHhhbGxvYyhjb3VudCsxKTsKLSAgICAgICAgfQotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAocCA9IGRhdGE7IHAgPCBlbmQ7IHArKykgewotICAgICAgICAgICAgaW50ICBjID0gKnA7Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICBpZiAocGhhc2UgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBidWZmW2NvdW50XSA9IGJ1ZmZbY291bnQrMV0gPSAnXFwnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYyA+PSAzMiAmJiBjIDwgMTI3KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBoYXNlICE9IDApCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZbY291bnRdID0gYzsKLSAgICAgICAgICAgICAgICBjb3VudCArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBpZiAocGhhc2UgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZitjb3VudCwgIjxUQUI+IiwgNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBoYXNlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmYrY291bnQsICI8TE4+IiwgNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBoYXNlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmYrY291bnQsICI8Q1I+IiwgNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwaGFzZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmZltjb3VudCswXSA9ICdcXCc7Ci0gICAgICAgICAgICAgICAgYnVmZltjb3VudCsxXSA9ICd4JzsKLSAgICAgICAgICAgICAgICBidWZmW2NvdW50KzJdID0gIjAxMjM0NTY3ODlhYmNkZWYiWyhjID4+IDQpICYgMTVdOwotICAgICAgICAgICAgICAgIGJ1ZmZbY291bnQrM10gPSAiMDEyMzQ1Njc4OWFiY2RlZiJbICAgICAoYykgJiAxNV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudCArPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIGJ1ZmZbY291bnRdID0gMDsKLSAgICByZXR1cm4gYnVmZjsKLX0KLSNlbmRpZiAvKiBUX0FDVElWRSAqLwotCi0vKiogUEFDS0VUUwotICoqCi0gKiogV2UgbmVlZCBhIHdheSB0byBidWZmZXIgZGF0YSBiZWZvcmUgaXQgY2FuIGJlIHNlbnQgdG8gdGhlCi0gKiogY29ycmVzcG9uZGluZyBmaWxlIGRlc2NyaXB0b3IuIFdlIHVzZSBsaW5rZWQgbGlzdCBvZiBQYWNrZXQKLSAqKiBvYmplY3RzIHRvIGRvIHRoaXMuCi0gKiovCi0KLXR5cGVkZWYgc3RydWN0IFBhY2tldCAgIFBhY2tldDsKLQotI2RlZmluZSAgTUFYX1BBWUxPQUQgIDQwMDAKLQotc3RydWN0IFBhY2tldCB7Ci0gICAgUGFja2V0KiAgIG5leHQ7Ci0gICAgaW50ICAgICAgIGxlbjsKLSAgICBpbnQgICAgICAgY2hhbm5lbDsKLSAgICB1aW50OF90ICAgZGF0YVsgTUFYX1BBWUxPQUQgXTsKLX07Ci0KLS8qIHdlIGV4cGVjdCB0byBhbGxvYy9mcmVlIGEgbG90IG9mIHBhY2tldHMgZHVyaW5nCi0gKiBvcGVyYXRpb25zIHNvIHVzZSBhIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBmcmVlIHBhY2tldHMKLSAqIHRvIGtlZXAgdGhpbmdzIHNwZWVkeSBhbmQgc2ltcGxlLgotICovCi1zdGF0aWMgUGFja2V0KiAgIF9mcmVlX3BhY2tldHM7Ci0KLS8qIEFsbG9jYXRlIGEgcGFja2V0ICovCi1zdGF0aWMgUGFja2V0KgotcGFja2V0X2FsbG9jKHZvaWQpCi17Ci0gICAgUGFja2V0KiAgcCA9IF9mcmVlX3BhY2tldHM7Ci0gICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICBfZnJlZV9wYWNrZXRzID0gcC0+bmV4dDsKLSAgICB9IGVsc2UgewotICAgICAgICB4bmV3KHApOwotICAgIH0KLSAgICBwLT5uZXh0ICAgID0gTlVMTDsKLSAgICBwLT5sZW4gICAgID0gMDsKLSAgICBwLT5jaGFubmVsID0gLTE7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qIFJlbGVhc2UgYSBwYWNrZXQuIFRoaXMgdGFrZXMgdGhlIGFkZHJlc3Mgb2YgYSBwYWNrZXQKLSAqIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byBOVUxMIG9uIGV4aXQgKGF2b2lkcwotICogcmVmZXJlbmNpbmcgZGFuZ2xpbmcgcG9pbnRlcnMgaW4gY2FzZSBvZiBidWdzKQotICovCi1zdGF0aWMgdm9pZAotcGFja2V0X2ZyZWUoIFBhY2tldCogICpwcGFja2V0ICkKLXsKLSAgICBQYWNrZXQqICBwID0gKnBwYWNrZXQ7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcC0+bmV4dCAgICAgICA9IF9mcmVlX3BhY2tldHM7Ci0gICAgICAgIF9mcmVlX3BhY2tldHMgPSBwOwotICAgICAgICAqcHBhY2tldCA9IE5VTEw7Ci0gICAgfQotfQotCi0vKiogUEFDS0VUIFJFQ0VJVkVSCi0gKioKLSAqKiBTaW1wbGUgYWJzdHJhY3Rpb24gZm9yIHNvbWV0aGluZyB0aGF0IGNhbiByZWNlaXZlIGEgcGFja2V0Ci0gKiogZnJvbSBhIEZESGFuZGxlciAoc2VlIGJlbG93KSBvciBzb21ldGhpbmcgZWxzZS4KLSAqKgotICoqIFNlbmQgYSBwYWNrZXQgdG8gaXQgd2l0aCAncmVjZWl2ZXJfcG9zdCcKLSAqKgotICoqIENhbGwgJ3JlY2VpdmVyX2Nsb3NlJyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nCi0gKiogcGFja2V0IHNvdXJjZSB3YXMgY2xvc2VkLgotICoqLwotCi10eXBlZGVmIHZvaWQgKCpQb3N0RnVuYykgKCB2b2lkKiAgdXNlciwgUGFja2V0KiAgcCApOwotdHlwZWRlZiB2b2lkICgqQ2xvc2VGdW5jKSggdm9pZCogIHVzZXIgKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFBvc3RGdW5jICAgcG9zdDsKLSAgICBDbG9zZUZ1bmMgIGNsb3NlOwotICAgIHZvaWQqICAgICAgdXNlcjsKLX0gUmVjZWl2ZXI7Ci0KLS8qIHBvc3QgYSBwYWNrZXQgdG8gYSByZWNlaXZlci4gTm90ZSB0aGF0IHRoaXMgdHJhbnNmZXJzCi0gKiBvd25lcnNoaXAgb2YgdGhlIHBhY2tldCB0byB0aGUgcmVjZWl2ZXIuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXJlY2VpdmVyX3Bvc3QoIFJlY2VpdmVyKiAgciwgUGFja2V0KiAgcCApCi17Ci0gICAgaWYgKHItPnBvc3QpCi0gICAgICAgIHItPnBvc3QoIHItPnVzZXIsIHAgKTsKLSAgICBlbHNlCi0gICAgICAgIHBhY2tldF9mcmVlKCZwKTsKLX0KLQotLyogdGVsbCBhIHJlY2VpdmVyIHRoZSBwYWNrZXQgc291cmNlIHdhcyBjbG9zZWQuCi0gKiB0aGlzIHdpbGwgYWxzbyBwcmV2ZW50IGZ1cnRoZXIgcG9zdGluZyB0byB0aGUKLSAqIHJlY2VpdmVyLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1yZWNlaXZlcl9jbG9zZSggUmVjZWl2ZXIqICByICkKLXsKLSAgICBpZiAoci0+Y2xvc2UpIHsKLSAgICAgICAgci0+Y2xvc2UoIHItPnVzZXIgKTsKLSAgICAgICAgci0+Y2xvc2UgPSBOVUxMOwotICAgIH0KLSAgICByLT5wb3N0ICA9IE5VTEw7Ci19Ci0KLQotLyoqIEZEIEhBTkRMRVJTCi0gKioKLSAqKiB0aGVzZSBhcmUgc21hcnQgbGlzdGVuZXJzIHRoYXQgc2VuZCBpbmNvbWluZyBwYWNrZXRzIHRvIGEgcmVjZWl2ZXIKLSAqKiBhbmQgY2FuIHF1ZXVlIG9uZSBvciBtb3JlIG91dGdvaW5nIHBhY2tldHMgYW5kIHNlbmQgdGhlbSB3aGVuCi0gKiogcG9zc2libGUgdG8gdGhlIEZELgotICoqCi0gKiogbm90ZSB0aGF0IHdlIHN1cHBvcnQgY2xlYW4gc2h1dGRvd24gb2YgZmlsZSBkZXNjcmlwdG9ycywKLSAqKiBpLmUuIHdlIHRyeSB0byBzZW5kIGFsbCBvdXRnb2luZyBwYWNrZXRzIGJlZm9yZSBkZXN0cm95aW5nCi0gKiogdGhlIEZESGFuZGxlci4KLSAqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgRkRIYW5kbGVyICAgICAgRkRIYW5kbGVyOwotdHlwZWRlZiBzdHJ1Y3QgRkRIYW5kbGVyTGlzdCAgRkRIYW5kbGVyTGlzdDsKLQotc3RydWN0IEZESGFuZGxlciB7Ci0gICAgaW50ICAgICAgICAgICAgIGZkOwotICAgIEZESGFuZGxlckxpc3QqICBsaXN0OwotICAgIGNoYXIgICAgICAgICAgICBjbG9zaW5nOwotICAgIFJlY2VpdmVyICAgICAgICByZWNlaXZlclsxXTsKLQotICAgIC8qIHF1ZXVlIG9mIG91dGdvaW5nIHBhY2tldHMgKi8KLSAgICBpbnQgICAgICAgICAgICAgb3V0X3BvczsKLSAgICBQYWNrZXQqICAgICAgICAgb3V0X2ZpcnN0OwotICAgIFBhY2tldCoqICAgICAgICBvdXRfcHRhaWw7Ci0KLSAgICBGREhhbmRsZXIqICAgICAgbmV4dDsKLSAgICBGREhhbmRsZXIqKiAgICAgcHJlZjsKLQotfTsKLQotc3RydWN0IEZESGFuZGxlckxpc3QgewotICAgIC8qIHRoZSBsb29wZXIgdGhhdCBtYW5hZ2VzIHRoZSBmZHMgKi8KLSAgICBMb29wZXIqICAgICAgbG9vcGVyOwotCi0gICAgLyogbGlzdCBvZiBhY3RpdmUgRkRIYW5kbGVyIG9iamVjdHMgKi8KLSAgICBGREhhbmRsZXIqICAgYWN0aXZlOwotCi0gICAgLyogbGlzdCBvZiBjbG9zaW5nIEZESGFuZGxlciBvYmplY3RzLgotICAgICAqIHRoZXNlIGFyZSB3YWl0aW5nIHRvIHB1c2ggdGhlaXIKLSAgICAgKiBxdWV1ZWQgcGFja2V0cyB0byB0aGUgZmQgYmVmb3JlCi0gICAgICogZnJlZWluZyB0aGVtc2VsdmVzLgotICAgICAqLwotICAgIEZESGFuZGxlciogICBjbG9zaW5nOwotCi19OwotCi0vKiByZW1vdmUgYSBGREhhbmRsZXIgZnJvbSBpdHMgY3VycmVudCBsaXN0ICovCi1zdGF0aWMgdm9pZAotZmRoYW5kbGVyX3JlbW92ZSggRkRIYW5kbGVyKiAgZiApCi17Ci0gICAgZi0+cHJlZlswXSA9IGYtPm5leHQ7Ci0gICAgaWYgKGYtPm5leHQpCi0gICAgICAgIGYtPm5leHQtPnByZWYgPSBmLT5wcmVmOwotfQotCi0vKiBhZGQgYSBGREhhbmRsZXIgdG8gYSBnaXZlbiBsaXN0ICovCi1zdGF0aWMgdm9pZAotZmRoYW5kbGVyX3ByZXBlbmQoIEZESGFuZGxlciogIGYsIEZESGFuZGxlcioqICBsaXN0ICkKLXsKLSAgICBmLT5uZXh0ID0gbGlzdFswXTsKLSAgICBmLT5wcmVmID0gbGlzdDsKLSAgICBsaXN0WzBdID0gZjsKLSAgICBpZiAoZi0+bmV4dCkKLSAgICAgICAgZi0+bmV4dC0+cHJlZiA9ICZmLT5uZXh0OwotfQotCi0vKiBpbml0aWFsaXplIGEgRkRIYW5kbGVyIGxpc3QgKi8KLXN0YXRpYyB2b2lkCi1mZGhhbmRsZXJfbGlzdF9pbml0KCBGREhhbmRsZXJMaXN0KiAgbGlzdCwgTG9vcGVyKiAgbG9vcGVyICkKLXsKLSAgICBsaXN0LT5sb29wZXIgID0gbG9vcGVyOwotICAgIGxpc3QtPmFjdGl2ZSAgPSBOVUxMOwotICAgIGxpc3QtPmNsb3NpbmcgPSBOVUxMOwotfQotCi0KLS8qIGNsb3NlIGEgRkRIYW5kbGVyIChhbmQgZnJlZSBpdCkuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90Ci0gKiBwZXJmb3JtIGEgZ3JhY2VmdWwgc2h1dGRvd24sIGkuZS4gYWxsIHBhY2tldHMgaW4gdGhlCi0gKiBvdXRnb2luZyBxdWV1ZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGZyZWUuCi0gKgotICogdGhpcyAqd2lsbCogbm90aWZ5IHRoZSByZWNlaXZlciB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKLSAqIHdhcyBjbG9zZWQuCi0gKgotICogeW91IHNob3VsZCBjYWxsIGZkaGFuZGxlcl9zaHV0ZG93bigpIGlmIHlvdSB3YW50IHRvCi0gKiBub3RpZnkgdGhlIEZESGFuZGxlciB0aGF0IGl0cyBwYWNrZXQgc291cmNlIGlzIGNsb3NlZC4KLSAqLwotc3RhdGljIHZvaWQKLWZkaGFuZGxlcl9jbG9zZSggRkRIYW5kbGVyKiAgZiApCi17Ci0gICAgLyogbm90aWZ5IHJlY2VpdmVyICovCi0gICAgcmVjZWl2ZXJfY2xvc2UoZi0+cmVjZWl2ZXIpOwotCi0gICAgLyogcmVtb3ZlIHRoZSBoYW5kbGVyIGZyb20gaXRzIGxpc3QgKi8KLSAgICBmZGhhbmRsZXJfcmVtb3ZlKGYpOwotCi0gICAgLyogZ2V0IHJpZCBvZiBvdXRnb2luZyBwYWNrZXQgcXVldWUgKi8KLSAgICBpZiAoZi0+b3V0X2ZpcnN0ICE9IE5VTEwpIHsKLSAgICAgICAgUGFja2V0KiAgcDsKLSAgICAgICAgd2hpbGUgKChwID0gZi0+b3V0X2ZpcnN0KSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmLT5vdXRfZmlyc3QgPSBwLT5uZXh0OwotICAgICAgICAgICAgcGFja2V0X2ZyZWUoJnApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZ2V0IHJpZCBvZiBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBpZiAoZi0+ZmQgPj0gMCkgewotICAgICAgICBsb29wZXJfZGVsKCBmLT5saXN0LT5sb29wZXIsIGYtPmZkICk7Ci0gICAgICAgIGNsb3NlKGYtPmZkKTsKLSAgICAgICAgZi0+ZmQgPSAtMTsKLSAgICB9Ci0KLSAgICBmLT5saXN0ID0gTlVMTDsKLSAgICB4ZnJlZShmKTsKLX0KLQotLyogQXNrIHRoZSBGREhhbmRsZXIgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgY29ubmVjdGlvbiwKLSAqIGkuZS4gc2VuZCBhbnkgcGVuZGluZyBvdXRnb2luZyBwYWNrZXRzIHRoZW4gYXV0by1mcmVlCi0gKiBpdHNlbGYuCi0gKi8KLXN0YXRpYyB2b2lkCi1mZGhhbmRsZXJfc2h1dGRvd24oIEZESGFuZGxlciogIGYgKQotewotICAgIC8qIHByZXZlbnQgbGF0ZXIgZmRoYW5kbGVyX2Nsb3NlKCkgdG8KLSAgICAgKiBjYWxsIHRoZSByZWNlaXZlcidzIGNsb3NlLgotICAgICAqLwotICAgIGYtPnJlY2VpdmVyLT5jbG9zZSA9IE5VTEw7Ci0KLSAgICBpZiAoZi0+b3V0X2ZpcnN0ICE9IE5VTEwgJiYgIWYtPmNsb3NpbmcpCi0gICAgewotICAgICAgICAvKiBtb3ZlIHRoZSBoYW5kbGVyIHRvIHRoZSAnY2xvc2luZycgbGlzdCAqLwotICAgICAgICBmLT5jbG9zaW5nID0gMTsKLSAgICAgICAgZmRoYW5kbGVyX3JlbW92ZShmKTsKLSAgICAgICAgZmRoYW5kbGVyX3ByZXBlbmQoZiwgJmYtPmxpc3QtPmNsb3NpbmcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmRoYW5kbGVyX2Nsb3NlKGYpOwotfQotCi0vKiBFbnF1ZXVlIGEgbmV3IHBhY2tldCB0aGF0IHRoZSBGREhhbmRsZXIgd2lsbAotICogc2VuZCB0aHJvdWdoIGl0cyBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLXN0YXRpYyB2b2lkCi1mZGhhbmRsZXJfZW5xdWV1ZSggRkRIYW5kbGVyKiAgZiwgUGFja2V0KiAgcCApCi17Ci0gICAgUGFja2V0KiAgZmlyc3QgPSBmLT5vdXRfZmlyc3Q7Ci0KLSAgICBwLT5uZXh0ICAgICAgICAgPSBOVUxMOwotICAgIGYtPm91dF9wdGFpbFswXSA9IHA7Ci0gICAgZi0+b3V0X3B0YWlsICAgID0gJnAtPm5leHQ7Ci0KLSAgICBpZiAoZmlyc3QgPT0gTlVMTCkgewotICAgICAgICBmLT5vdXRfcG9zID0gMDsKLSAgICAgICAgbG9vcGVyX2VuYWJsZSggZi0+bGlzdC0+bG9vcGVyLCBmLT5mZCwgRVBPTExPVVQgKTsKLSAgICB9Ci19Ci0KLQotLyogRkRIYW5kbGVyIGZpbGUgZGVzY3JpcHRvciBldmVudCBjYWxsYmFjayBmb3IgcmVhZC93cml0ZSBvcHMgKi8KLXN0YXRpYyB2b2lkCi1mZGhhbmRsZXJfZXZlbnQoIEZESGFuZGxlciogIGYsIGludCAgZXZlbnRzICkKLXsKLSAgIGludCAgbGVuOwotCi0gICAgLyogaW4gY2VydGFpbiBjYXNlcywgaXQncyBwb3NzaWJsZSB0byBoYXZlIGJvdGggRVBPTExJTiBhbmQKLSAgICAgKiBFUE9MTEhVUCBhdCB0aGUgc2FtZSB0aW1lLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGluY29taW5nCi0gICAgICogZGF0YSB0byByZWFkLCBidXQgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgbm9uZXRoZWxlc3MgY2xvc2VkCi0gICAgICogYnkgdGhlIHNlbmRlci4gQmUgc3VyZSB0byByZWFkIHRoZSBkYXRhIGJlZm9yZSBjbG9zaW5nCi0gICAgICogdGhlIHJlY2VpdmVyIHRvIGF2b2lkIHBhY2tldCBsb3NzLgotICAgICAqLwotCi0gICAgaWYgKGV2ZW50cyAmIEVQT0xMSU4pIHsKLSAgICAgICAgUGFja2V0KiAgcCA9IHBhY2tldF9hbGxvYygpOwotICAgICAgICBpbnQgICAgICBsZW47Ci0KLSAgICAgICAgaWYgKChsZW4gPSBmZF9yZWFkKGYtPmZkLCBwLT5kYXRhLCBNQVhfUEFZTE9BRCkpIDwgMCkgewotICAgICAgICAgICAgRCgiJXM6IGNhbid0IHJlY3Y6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcGFja2V0X2ZyZWUoJnApOwotICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgICAgIHAtPmxlbiAgICAgPSBsZW47Ci0gICAgICAgICAgICBwLT5jaGFubmVsID0gLTEwMTsgIC8qIHNwZWNpYWwgZGVidWcgdmFsdWUsIG5vdCB1c2VkICovCi0gICAgICAgICAgICByZWNlaXZlcl9wb3N0KCBmLT5yZWNlaXZlciwgcCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50cyAmIChFUE9MTEhVUHxFUE9MTEVSUikpIHsKLSAgICAgICAgLyogZGlzY29ubmVjdGlvbiAqLwotICAgICAgICBEKCIlczogZGlzY29ubmVjdCBvbiBmZCAlZCIsIF9fRlVOQ1RJT05fXywgZi0+ZmQpOwotICAgICAgICBmZGhhbmRsZXJfY2xvc2UoZik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnRzICYgRVBPTExPVVQgJiYgZi0+b3V0X2ZpcnN0KSB7Ci0gICAgICAgIFBhY2tldCogIHAgPSBmLT5vdXRfZmlyc3Q7Ci0gICAgICAgIGludCAgICAgIGF2YWlsLCBsZW47Ci0KLSAgICAgICAgYXZhaWwgPSBwLT5sZW4gLSBmLT5vdXRfcG9zOwotICAgICAgICBpZiAoKGxlbiA9IGZkX3dyaXRlKGYtPmZkLCBwLT5kYXRhICsgZi0+b3V0X3BvcywgYXZhaWwpKSA8IDApIHsKLSAgICAgICAgICAgIEQoIiVzOiBjYW4ndCBzZW5kOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYtPm91dF9wb3MgKz0gbGVuOwotICAgICAgICAgICAgaWYgKGYtPm91dF9wb3MgPj0gcC0+bGVuKSB7Ci0gICAgICAgICAgICAgICAgZi0+b3V0X3BvcyAgID0gMDsKLSAgICAgICAgICAgICAgICBmLT5vdXRfZmlyc3QgPSBwLT5uZXh0OwotICAgICAgICAgICAgICAgIHBhY2tldF9mcmVlKCZwKTsKLSAgICAgICAgICAgICAgICBpZiAoZi0+b3V0X2ZpcnN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZi0+b3V0X3B0YWlsID0gJmYtPm91dF9maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgbG9vcGVyX2Rpc2FibGUoIGYtPmxpc3QtPmxvb3BlciwgZi0+ZmQsIEVQT0xMT1VUICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KLS8qIENyZWF0ZSBhIG5ldyBGREhhbmRsZXIgdGhhdCBtb25pdG9ycyByZWFkL3dyaXRlcyAqLwotc3RhdGljIEZESGFuZGxlcioKLWZkaGFuZGxlcl9uZXcoIGludCAgICAgICAgICAgICBmZCwKLSAgICAgICAgICAgICAgIEZESGFuZGxlckxpc3QqICBsaXN0LAotICAgICAgICAgICAgICAgUmVjZWl2ZXIqICAgICAgIHJlY2VpdmVyICkKLXsKLSAgICBGREhhbmRsZXIqICBmID0geGFsbG9jMChzaXplb2YoKmYpKTsKLQotICAgIGYtPmZkICAgICAgICAgID0gZmQ7Ci0gICAgZi0+bGlzdCAgICAgICAgPSBsaXN0OwotICAgIGYtPnJlY2VpdmVyWzBdID0gcmVjZWl2ZXJbMF07Ci0gICAgZi0+b3V0X2ZpcnN0ICAgPSBOVUxMOwotICAgIGYtPm91dF9wdGFpbCAgID0gJmYtPm91dF9maXJzdDsKLSAgICBmLT5vdXRfcG9zICAgICA9IDA7Ci0KLSAgICBmZGhhbmRsZXJfcHJlcGVuZChmLCAmbGlzdC0+YWN0aXZlKTsKLQotICAgIGxvb3Blcl9hZGQoIGxpc3QtPmxvb3BlciwgZmQsIChFdmVudEZ1bmMpIGZkaGFuZGxlcl9ldmVudCwgZiApOwotICAgIGxvb3Blcl9lbmFibGUoIGxpc3QtPmxvb3BlciwgZmQsIEVQT0xMSU4gKTsKLQotICAgIHJldHVybiBmOwotfQotCi0KLS8qIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIG1vbml0b3IgYWNjZXB0cygpIG9uIHNlcnZlciBzb2NrZXRzLgotICogdGhlIGNvbnZlbnRpb24gdXNlZCBoZXJlIGlzIHRoYXQgdGhlIHJlY2VpdmVyIHdpbGwgcmVjZWl2ZSBhCi0gKiBkdW1teSBwYWNrZXQgd2l0aCB0aGUgbmV3IGNsaWVudCBzb2NrZXQgaW4gcC0+Y2hhbm5lbAotICovCi1zdGF0aWMgdm9pZAotZmRoYW5kbGVyX2FjY2VwdF9ldmVudCggRkRIYW5kbGVyKiAgZiwgaW50ICBldmVudHMgKQotewotICAgIGlmIChldmVudHMgJiBFUE9MTElOKSB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYW4gYWNjZXB0IC0gc2VuZCBhIGR1bW15IHBhY2tldCB0byB0aGUgcmVjZWl2ZXIgKi8KLSAgICAgICAgUGFja2V0KiAgcCA9IHBhY2tldF9hbGxvYygpOwotCi0gICAgICAgIEQoIiVzOiBhY2NlcHRpbmcgb24gZmQgJWQiLCBfX0ZVTkNUSU9OX18sIGYtPmZkKTsKLSAgICAgICAgcC0+ZGF0YVswXSA9IDE7Ci0gICAgICAgIHAtPmxlbiAgICAgPSAxOwotICAgICAgICBwLT5jaGFubmVsID0gZmRfYWNjZXB0KGYtPmZkKTsKLSAgICAgICAgaWYgKHAtPmNoYW5uZWwgPCAwKSB7Ci0gICAgICAgICAgICBEKCIlczogYWNjZXB0IGZhaWxlZCA/OiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHBhY2tldF9mcmVlKCZwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZWNlaXZlcl9wb3N0KCBmLT5yZWNlaXZlciwgcCApOwotICAgIH0KLQotICAgIGlmIChldmVudHMgJiAoRVBPTExIVVB8RVBPTExFUlIpKSB7Ci0gICAgICAgIC8qIGRpc2Nvbm5lY3RpbmcgISEgKi8KLSAgICAgICAgRCgiJXM6IGNsb3NpbmcgYWNjZXB0IGZkICVkIiwgX19GVU5DVElPTl9fLCBmLT5mZCk7Ci0gICAgICAgIGZkaGFuZGxlcl9jbG9zZShmKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotCi0vKiBDcmVhdGUgYSBuZXcgRkRIYW5kbGVyIHVzZWQgdG8gbW9uaXRvciBuZXcgY29ubmVjdGlvbnMgb24gYQotICogc2VydmVyIHNvY2tldC4gVGhlIHJlY2VpdmVyIG11c3QgZXhwZWN0IHRoZSBuZXcgY29ubmVjdGlvbgotICogZmQgaW4gdGhlICdjaGFubmVsJyBmaWVsZCBvZiBhIGR1bW15IHBhY2tldC4KLSAqLwotc3RhdGljIEZESGFuZGxlcioKLWZkaGFuZGxlcl9uZXdfYWNjZXB0KCBpbnQgICAgICAgICAgICAgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgRkRIYW5kbGVyTGlzdCogIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZXIqICAgICAgIHJlY2VpdmVyICkKLXsKLSAgICBGREhhbmRsZXIqICBmID0geGFsbG9jMChzaXplb2YoKmYpKTsKLQotICAgIGYtPmZkICAgICAgICAgID0gZmQ7Ci0gICAgZi0+bGlzdCAgICAgICAgPSBsaXN0OwotICAgIGYtPnJlY2VpdmVyWzBdID0gcmVjZWl2ZXJbMF07Ci0KLSAgICBmZGhhbmRsZXJfcHJlcGVuZChmLCAmbGlzdC0+YWN0aXZlKTsKLQotICAgIGxvb3Blcl9hZGQoIGxpc3QtPmxvb3BlciwgZmQsIChFdmVudEZ1bmMpIGZkaGFuZGxlcl9hY2NlcHRfZXZlbnQsIGYgKTsKLSAgICBsb29wZXJfZW5hYmxlKCBsaXN0LT5sb29wZXIsIGZkLCBFUE9MTElOICk7Ci0gICAgbGlzdGVuKCBmZCwgNSApOwotCi0gICAgcmV0dXJuIGY7Ci19Ci0KLS8qKiBTRVJJQUwgQ09OTkVDVElPTiBTVEFURQotICoqCi0gKiogVGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgZnJhbWluZyBwcm90b2NvbAotICoqIHVzZWQgb24gdGhlIHNlcmlhbCBwb3J0IGNvbm5lY3Rpb24uCi0gKiovCi0KLS8qIGVhY2ggcGFja2V0IGlzIG1hZGUgb2YgYSA2IGJ5dGUgaGVhZGVyIGZvbGxvd2VkIGJ5IGEgcGF5bG9hZAotICogdGhlIGhlYWRlciBsb29rcyBsaWtlOgotICoKLSAqICAgb2Zmc2V0ICAgc2l6ZSAgICBkZXNjcmlwdGlvbgotICogICAgICAgMCAgICAgICAyICAgIGEgMi1ieXRlIGhleCBzdHJpbmcgZm9yIHRoZSBjaGFubmVsIG51bWJlcgotICogICAgICAgNCAgICAgICA0ICAgIGEgNC1jaGFyIGhleCBzdHJpbmcgZm9yIHRoZSBzaXplIG9mIHRoZSBwYXlsb2FkCi0gKiAgICAgICA2ICAgICAgIG4gICAgdGhlIHBheWxvYWQgaXRzZWxmCi0gKi8KLSNkZWZpbmUgIEhFQURFUl9TSVpFICAgIDYKLSNkZWZpbmUgIENIQU5ORUxfT0ZGU0VUIDAKLSNkZWZpbmUgIExFTkdUSF9PRkZTRVQgIDIKLSNkZWZpbmUgIENIQU5ORUxfU0laRSAgIDIKLSNkZWZpbmUgIExFTkdUSF9TSVpFICAgIDQKLQotI2RlZmluZSAgQ0hBTk5FTF9DT05UUk9MICAwCi0KLS8qIFRoZSBTZXJpYWwgb2JqZWN0IHJlY2VpdmVzIGRhdGEgZnJvbSB0aGUgc2VyaWFsIHBvcnQsCi0gKiBleHRyYWN0cyB0aGUgcGF5bG9hZCBzaXplIGFuZCBjaGFubmVsIGluZGV4LCB0aGVuIHNlbmRzCi0gKiB0aGUgcmVzdWx0aW5nIG1lc3NhZ2VzIGFzIGEgcGFja2V0IHRvIGEgZ2VuZXJpYyByZWNlaXZlci4KLSAqCi0gKiBZb3UgY2FuIGFsc28gdXNlIHNlcmlhbF9zZW5kIHRvIHNlbmQgYSBwYWNrZXQgdGhyb3VnaAotICogdGhlIHNlcmlhbCBwb3J0LgotICovCi10eXBlZGVmIHN0cnVjdCBTZXJpYWwgewotICAgIEZESGFuZGxlciogIGZkaGFuZGxlcjsgICAvKiB1c2VkIHRvIG1vbml0b3Igc2VyaWFsIHBvcnQgZmQgKi8KLSAgICBSZWNlaXZlciAgICByZWNlaXZlclsxXTsgLyogc2VuZCBwYXlsb2FkIHRoZXJlICovCi0gICAgaW50ICAgICAgICAgaW5fbGVuOyAgICAgIC8qIGN1cnJlbnQgYnl0ZXMgaW4gaW5wdXQgcGFja2V0ICovCi0gICAgaW50ICAgICAgICAgaW5fZGF0YWxlbjsgIC8qIHBheWxvYWQgc2l6ZSwgb3IgMCB3aGVuIHJlYWRpbmcgaGVhZGVyICovCi0gICAgaW50ICAgICAgICAgaW5fY2hhbm5lbDsgIC8qIGV4dHJhY3RlZCBjaGFubmVsIG51bWJlciAqLwotICAgIFBhY2tldCogICAgIGluX3BhY2tldDsgICAvKiB1c2VkIHRvIHJlYWQgaW5jb21pbmcgcGFja2V0cyAqLwotfSBTZXJpYWw7Ci0KLQotLyogYSBjYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQncyBmZCBpcyBjbG9zZWQgKi8KLXN0YXRpYyB2b2lkCi1zZXJpYWxfZmRfY2xvc2UoIFNlcmlhbCogIHMgKQotewotICAgIGZhdGFsKCJ1bmV4cGVjdGVkIHNlcmlhbCBwb3J0IGNsb3NlICEhIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJpYWxfZHVtcCggUGFja2V0KiAgcCwgY29uc3QgY2hhciogIGZ1bmNuYW1lICkKLXsKLSAgICBUKCIlczogJTAzZCBieXRlczogJyVzJyIsCi0gICAgICBmdW5jbmFtZSwgcC0+bGVuLCBxdW90ZShwLT5kYXRhLCBwLT5sZW4pKTsKLX0KLQotLyogYSBjYWxsYmFjayBjYWxsZWQgd2hlbiBhIHBhY2tldCBhcnJpdmVzIGZyb20gdGhlIHNlcmlhbCBwb3J0J3MgRkRIYW5kbGVyLgotICoKLSAqIFRoaXMgd2lsbCBlc3NlbnRpYWxseSBwYXJzZSB0aGUgaGVhZGVyLCBleHRyYWN0IHRoZSBjaGFubmVsIG51bWJlciBhbmQKLSAqIHRoZSBwYXlsb2FkIHNpemUgYW5kIHN0b3JlIHRoZW0gaW4gJ2luX2RhdGFsZW4nIGFuZCAnaW5fY2hhbm5lbCcuCi0gKgotICogQWZ0ZXIgdGhhdCwgdGhlIHBheWxvYWQgaXMgc2VudCB0byB0aGUgcmVjZWl2ZXIgb25jZSBjb21wbGV0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXJpYWxfZmRfcmVjZWl2ZSggU2VyaWFsKiAgcywgUGFja2V0KiAgcCApCi17Ci0gICAgaW50ICAgICAgcnBvcyAgPSAwLCByY291bnQgPSBwLT5sZW47Ci0gICAgUGFja2V0KiAgaW5wICAgPSBzLT5pbl9wYWNrZXQ7Ci0gICAgaW50ICAgICAgaW5wb3MgPSBzLT5pbl9sZW47Ci0KLSAgICBzZXJpYWxfZHVtcCggcCwgX19GVU5DVElPTl9fICk7Ci0KLSAgICB3aGlsZSAocnBvcyA8IHJjb3VudCkKLSAgICB7Ci0gICAgICAgIGludCAgYXZhaWwgPSByY291bnQgLSBycG9zOwotCi0gICAgICAgIC8qIGZpcnN0LCB0cnkgdG8gcmVhZCB0aGUgaGVhZGVyICovCi0gICAgICAgIGlmIChzLT5pbl9kYXRhbGVuID09IDApIHsKLSAgICAgICAgICAgIGludCAgd2FudGVkID0gSEVBREVSX1NJWkUgLSBpbnBvczsKLSAgICAgICAgICAgIGlmIChhdmFpbCA+IHdhbnRlZCkKLSAgICAgICAgICAgICAgICBhdmFpbCA9IHdhbnRlZDsKLQotICAgICAgICAgICAgbWVtY3B5KCBpbnAtPmRhdGEgKyBpbnBvcywgcC0+ZGF0YSArIHJwb3MsIGF2YWlsICk7Ci0gICAgICAgICAgICBpbnBvcyArPSBhdmFpbDsKLSAgICAgICAgICAgIHJwb3MgICs9IGF2YWlsOwotCi0gICAgICAgICAgICBpZiAoaW5wb3MgPT0gSEVBREVSX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBzLT5pbl9kYXRhbGVuID0gaGV4MmludCggaW5wLT5kYXRhICsgTEVOR1RIX09GRlNFVCwgIExFTkdUSF9TSVpFICk7Ci0gICAgICAgICAgICAgICAgcy0+aW5fY2hhbm5lbCA9IGhleDJpbnQoIGlucC0+ZGF0YSArIENIQU5ORUxfT0ZGU0VULCBDSEFOTkVMX1NJWkUgKTsKLQotICAgICAgICAgICAgICAgIGlmIChzLT5pbl9kYXRhbGVuIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgRCgiaWdub3JpbmcgJXMgcGFja2V0IGZyb20gc2VyaWFsIHBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgIHMtPmluX2RhdGFsZW4gPyAiZW1wdHkiIDogIm1hbGZvcm1lZCIpOwotICAgICAgICAgICAgICAgICAgICBzLT5pbl9kYXRhbGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0QoInJlY2VpdmVkICVkIGJ5dGVzIHBhY2tldCBmb3IgY2hhbm5lbCAlZCIsIHMtPmluX2RhdGFsZW4sIHMtPmluX2NoYW5uZWwpOwotICAgICAgICAgICAgICAgIGlucG9zID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIHRoZW4sIHBvcHVsYXRlIHRoZSBwYWNrZXQgaXRzZWxmICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCAgIHdhbnRlZCA9IHMtPmluX2RhdGFsZW4gLSBpbnBvczsKLQotICAgICAgICAgICAgaWYgKGF2YWlsID4gd2FudGVkKQotICAgICAgICAgICAgICAgIGF2YWlsID0gd2FudGVkOwotCi0gICAgICAgICAgICBtZW1jcHkoIGlucC0+ZGF0YSArIGlucG9zLCBwLT5kYXRhICsgcnBvcywgYXZhaWwgKTsKLSAgICAgICAgICAgIGlucG9zICs9IGF2YWlsOwotICAgICAgICAgICAgcnBvcyAgKz0gYXZhaWw7Ci0KLSAgICAgICAgICAgIGlmIChpbnBvcyA9PSBzLT5pbl9kYXRhbGVuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmluX2NoYW5uZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEQoImlnbm9yaW5nICVkIGJ5dGVzIGFkZHJlc3NlZCB0byBjaGFubmVsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wb3MsIHMtPmluX2NoYW5uZWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucC0+bGVuICAgICA9IGlucG9zOwotICAgICAgICAgICAgICAgICAgICBpbnAtPmNoYW5uZWwgPSBzLT5pbl9jaGFubmVsOwotICAgICAgICAgICAgICAgICAgICByZWNlaXZlcl9wb3N0KCBzLT5yZWNlaXZlciwgaW5wICk7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmluX3BhY2tldCAgPSBpbnAgPSBwYWNrZXRfYWxsb2MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcy0+aW5fZGF0YWxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaW5wb3MgICAgICAgICA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcy0+aW5fbGVuID0gaW5wb3M7Ci0gICAgcGFja2V0X2ZyZWUoJnApOwotfQotCi0KLS8qIHNlbmQgYSBwYWNrZXQgdG8gdGhlIHNlcmlhbCBwb3J0LgotICogdGhpcyBhc3N1bWVzIHRoYXQgcC0+bGVuIGFuZCBwLT5jaGFubmVsIGNvbnRhaW4gdGhlIHBheWxvYWQncwotICogc2l6ZSBhbmQgY2hhbm5lbCBhbmQgd2lsbCBhZGQgdGhlIGFwcHJvcHJpYXRlIGhlYWRlci4KLSAqLwotc3RhdGljIHZvaWQKLXNlcmlhbF9zZW5kKCBTZXJpYWwqICBzLCBQYWNrZXQqICBwICkKLXsKLSAgICBQYWNrZXQqICBoID0gcGFja2V0X2FsbG9jKCk7Ci0KLSAgICAvL0QoInNlbmRpbmcgdG8gc2VyaWFsICVkIGJ5dGVzIGZyb20gY2hhbm5lbCAlZDogJyUuKnMnIiwgcC0+bGVuLCBwLT5jaGFubmVsLCBwLT5sZW4sIHAtPmRhdGEpOwotCi0gICAgLyogaW5zZXJ0IGEgc21hbGwgaGVhZGVyIGJlZm9yZSB0aGlzIHBhY2tldCAqLwotICAgIGgtPmxlbiA9IEhFQURFUl9TSVpFOwotICAgIGludDJoZXgoIHAtPmxlbiwgICAgIGgtPmRhdGEgKyBMRU5HVEhfT0ZGU0VULCAgTEVOR1RIX1NJWkUgKTsKLSAgICBpbnQyaGV4KCBwLT5jaGFubmVsLCBoLT5kYXRhICsgQ0hBTk5FTF9PRkZTRVQsIENIQU5ORUxfU0laRSApOwotCi0gICAgc2VyaWFsX2R1bXAoIGgsIF9fRlVOQ1RJT05fXyApOwotICAgIHNlcmlhbF9kdW1wKCBwLCBfX0ZVTkNUSU9OX18gKTsKLQotICAgIGZkaGFuZGxlcl9lbnF1ZXVlKCBzLT5mZGhhbmRsZXIsIGggKTsKLSAgICBmZGhhbmRsZXJfZW5xdWV1ZSggcy0+ZmRoYW5kbGVyLCBwICk7Ci19Ci0KLQotLyogaW5pdGlhbGl6ZSBzZXJpYWwgcmVhZGVyICovCi1zdGF0aWMgdm9pZAotc2VyaWFsX2luaXQoIFNlcmlhbCogICAgICAgICBzLAotICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmZCwKLSAgICAgICAgICAgICBGREhhbmRsZXJMaXN0KiAgbGlzdCwKLSAgICAgICAgICAgICBSZWNlaXZlciogICAgICAgcmVjZWl2ZXIgKQotewotICAgIFJlY2VpdmVyICByZWN2OwotCi0gICAgcmVjdi51c2VyICA9IHM7Ci0gICAgcmVjdi5wb3N0ICA9IChQb3N0RnVuYykgIHNlcmlhbF9mZF9yZWNlaXZlOwotICAgIHJlY3YuY2xvc2UgPSAoQ2xvc2VGdW5jKSBzZXJpYWxfZmRfY2xvc2U7Ci0KLSAgICBzLT5yZWNlaXZlclswXSA9IHJlY2VpdmVyWzBdOwotCi0gICAgcy0+ZmRoYW5kbGVyID0gZmRoYW5kbGVyX25ldyggZmQsIGxpc3QsICZyZWN2ICk7Ci0gICAgcy0+aW5fbGVuICAgICA9IDA7Ci0gICAgcy0+aW5fZGF0YWxlbiA9IDA7Ci0gICAgcy0+aW5fY2hhbm5lbCA9IDA7Ci0gICAgcy0+aW5fcGFja2V0ICA9IHBhY2tldF9hbGxvYygpOwotfQotCi0KLS8qKiBDTElFTlRTCi0gKiovCi0KLXR5cGVkZWYgc3RydWN0IENsaWVudCAgICAgICBDbGllbnQ7Ci10eXBlZGVmIHN0cnVjdCBNdWx0aXBsZXhlciAgTXVsdGlwbGV4ZXI7Ci0KLS8qIEEgQ2xpZW50IG9iamVjdCBtb2RlbHMgYSBzaW5nbGUgcWVtdWQgY2xpZW50IHNvY2tldAotICogY29ubmVjdGlvbiBpbiB0aGUgZW11bGF0ZWQgc3lzdGVtLgotICoKLSAqIHRoZSBjbGllbnQgZmlyc3Qgc2VuZHMgdGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBzZXJ2aWNlCi0gKiBpdCB3YW50cyB0byBjb250YWN0IChubyBmcmFtaW5nKSwgdGhlbiB3YWl0cyBmb3IgYSAyCi0gKiBieXRlIGFuc3dlciBmcm9tIHFlbXVkLgotICoKLSAqIHRoZSBhbnN3ZXIgaXMgZWl0aGVyICJPSyIgb3IgIktPIiB0byBpbmRpY2F0ZQotICogc3VjY2VzcyBvciBmYWlsdXJlLgotICoKLSAqIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIGNsaWVudCBjYW4gc2VuZCBtZXNzYWdlcwotICogdG8gdGhlIHNlcnZpY2UuCi0gKgotICogSW4gY2FzZSBvZiBmYWlsdXJlLCBpdCBjYW4gZGlzY29ubmVjdCBvciB0cnkgc2VuZGluZwotICogdGhlIG5hbWUgb2YgYW5vdGhlciBzZXJ2aWNlLgotICovCi1zdHJ1Y3QgQ2xpZW50IHsKLSAgICBDbGllbnQqICAgICAgIG5leHQ7Ci0gICAgQ2xpZW50KiogICAgICBwcmVmOwotICAgIGludCAgICAgICAgICAgY2hhbm5lbDsKLSAgICBjaGFyICAgICAgICAgIHJlZ2lzdGVyZWQ7Ci0gICAgRkRIYW5kbGVyKiAgICBmZGhhbmRsZXI7Ci0gICAgTXVsdGlwbGV4ZXIqICBtdWx0aXBsZXhlcjsKLX07Ci0KLXN0cnVjdCBNdWx0aXBsZXhlciB7Ci0gICAgQ2xpZW50KiAgICAgICAgY2xpZW50czsKLSAgICBpbnQgICAgICAgICAgICBsYXN0X2NoYW5uZWw7Ci0gICAgU2VyaWFsICAgICAgICAgc2VyaWFsWzFdOwotICAgIExvb3BlciAgICAgICAgIGxvb3BlclsxXTsKLSAgICBGREhhbmRsZXJMaXN0ICBmZGhhbmRsZXJzWzFdOwotfTsKLQotCi1zdGF0aWMgaW50ICAgbXVsdGlwbGV4ZXJfb3Blbl9jaGFubmVsKCBNdWx0aXBsZXhlciogIG11bHQsIFBhY2tldCogIHAgKTsKLXN0YXRpYyB2b2lkICBtdWx0aXBsZXhlcl9jbG9zZV9jaGFubmVsKCBNdWx0aXBsZXhlciogIG11bHQsIGludCAgY2hhbm5lbCApOwotc3RhdGljIHZvaWQgIG11bHRpcGxleGVyX3NlcmlhbF9zZW5kKCBNdWx0aXBsZXhlciogbXVsdCwgaW50ICBjaGFubmVsLCBQYWNrZXQqICBwICk7Ci0KLXN0YXRpYyB2b2lkCi1jbGllbnRfZHVtcCggQ2xpZW50KiAgYywgUGFja2V0KiAgcCwgY29uc3QgY2hhciogIGZ1bmNuYW1lICkKLXsKLSAgICBUKCIlczogY2xpZW50ICVwICglZCk6ICUzZCBieXRlczogJyVzJyIsCi0gICAgICBmdW5jbmFtZSwgYywgYy0+ZmRoYW5kbGVyLT5mZCwKLSAgICAgIHAtPmxlbiwgcXVvdGUocC0+ZGF0YSwgcC0+bGVuKSk7Ci19Ci0KLS8qIGRlc3Ryb3kgYSBjbGllbnQgKi8KLXN0YXRpYyB2b2lkCi1jbGllbnRfZnJlZSggQ2xpZW50KiAgYyApCi17Ci0gICAgLyogcmVtb3ZlIGZyb20gbGlzdCAqLwotICAgIGMtPnByZWZbMF0gPSBjLT5uZXh0OwotICAgIGlmIChjLT5uZXh0KQotICAgICAgICBjLT5uZXh0LT5wcmVmID0gYy0+cHJlZjsKLQotICAgIGMtPmNoYW5uZWwgICAgPSAtMTsKLSAgICBjLT5yZWdpc3RlcmVkID0gMDsKLQotICAgIC8qIGdlbnRseSBhc2sgdGhlIEZESGFuZGxlciB0byBzaHV0ZG93biB0bwotICAgICAqIGF2b2lkIGxvc2luZyBxdWV1ZWQgb3V0Z29pbmcgcGFja2V0cyAqLwotICAgIGlmIChjLT5mZGhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICBmZGhhbmRsZXJfc2h1dGRvd24oYy0+ZmRoYW5kbGVyKTsKLSAgICAgICAgYy0+ZmRoYW5kbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICB4ZnJlZShjKTsKLX0KLQotCi0vKiBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2xpZW50IHNvY2tldCByZWNlaXZlcyBkYXRhICovCi1zdGF0aWMgdm9pZAotY2xpZW50X2ZkX3JlY2VpdmUoIENsaWVudCogIGMsIFBhY2tldCogIHAgKQotewotICAgIGNsaWVudF9kdW1wKGMsIHAsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBpZiAoYy0+cmVnaXN0ZXJlZCkgewotICAgICAgICAvKiB0aGUgY2xpZW50IGlzIHJlZ2lzdGVyZWQsIGp1c3Qgc2VuZCB0aGUKLSAgICAgICAgICogZGF0YSB0aHJvdWdoIHRoZSBzZXJpYWwgcG9ydAotICAgICAgICAgKi8KLSAgICAgICAgbXVsdGlwbGV4ZXJfc2VyaWFsX3NlbmQoYy0+bXVsdGlwbGV4ZXIsIGMtPmNoYW5uZWwsIHApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGMtPmNoYW5uZWwgPiAwKSB7Ci0gICAgICAgIC8qIHRoZSBjbGllbnQgaXMgd2FpdGluZyByZWdpc3RyYXRpb24gcmVzdWx0cy4KLSAgICAgICAgICogdGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHRoZSBjbGllbnQKLSAgICAgICAgICogc2hvdWxkIHdhaXQgZm9yIG91ciAnb2snIG9yICdrbycuCi0gICAgICAgICAqIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgIEQoIiVzOiBiYWQgY2xpZW50IHNlbmRpbmcgZGF0YSBiZWZvcmUgZW5kIG9mIHJlZ2lzdHJhdGlvbiIsCi0gICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgIEJBRF9DTElFTlQ6Ci0gICAgICAgICBwYWNrZXRfZnJlZSgmcCk7Ci0gICAgICAgICBjbGllbnRfZnJlZShjKTsKLSAgICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiB0aGUgY2xpZW50IGhhc24ndCByZWdpc3RlcmVkIGEgc2VydmljZSB5ZXQsCi0gICAgICogc28gdGhpcyBtdXN0IGJlIHRoZSBuYW1lIG9mIGEgc2VydmljZSwgY2FsbAotICAgICAqIHRoZSBtdWx0aXBsZXhlciB0byBzdGFydCByZWdpc3RyYXRpb24gZm9yCi0gICAgICogaXQuCi0gICAgICovCi0gICAgRCgiJXM6IGF0dGVtcHRpbmcgcmVnaXN0cmF0aW9uIGZvciBzZXJ2aWNlICclLipzJyIsCi0gICAgICBfX0ZVTkNUSU9OX18sIHAtPmxlbiwgcC0+ZGF0YSk7Ci0gICAgYy0+Y2hhbm5lbCA9IG11bHRpcGxleGVyX29wZW5fY2hhbm5lbChjLT5tdWx0aXBsZXhlciwgcCk7Ci0gICAgaWYgKGMtPmNoYW5uZWwgPCAwKSB7Ci0gICAgICAgIEQoIiVzOiBzZXJ2aWNlIG5hbWUgdG9vIGxvbmciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIEJBRF9DTElFTlQ7Ci0gICAgfQotICAgIEQoIiVzOiAgICAtPiByZWNlaXZlZCBjaGFubmVsIGlkICVkIiwgX19GVU5DVElPTl9fLCBjLT5jaGFubmVsKTsKLSAgICBwYWNrZXRfZnJlZSgmcCk7Ci19Ci0KLQotLyogYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHNvY2tldCBpcyBjbG9zZWQuICovCi1zdGF0aWMgdm9pZAotY2xpZW50X2ZkX2Nsb3NlKCBDbGllbnQqICBjICkKLXsKLSAgICBUKCIlczogY2xpZW50ICVwICglZCkiLCBfX0ZVTkNUSU9OX18sIGMsIGMtPmZkaGFuZGxlci0+ZmQpOwotCi0gICAgLyogbm8gbmVlZCB0byBzaHV0ZG93biB0aGUgRkRIYW5kbGVyICovCi0gICAgYy0+ZmRoYW5kbGVyID0gTlVMTDsKLQotICAgIC8qIHRlbGwgdGhlIGVtdWxhdG9yIHdlJ3JlIG91dCAqLwotICAgIGlmIChjLT5jaGFubmVsID4gMCkKLSAgICAgICAgbXVsdGlwbGV4ZXJfY2xvc2VfY2hhbm5lbChjLT5tdWx0aXBsZXhlciwgYy0+Y2hhbm5lbCk7Ci0KLSAgICAvKiBmcmVlIHRoZSBjbGllbnQgKi8KLSAgICBjbGllbnRfZnJlZShjKTsKLX0KLQotLyogYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgbXVsdGlwbGV4ZXIgcmVjZWl2ZWQgYSByZWdpc3RyYXRpb24KLSAqIHJlc3BvbnNlIGZyb20gdGhlIGVtdWxhdG9yIGZvciBhIGdpdmVuIGNsaWVudC4KLSAqLwotc3RhdGljIHZvaWQKLWNsaWVudF9yZWdpc3RyYXRpb24oIENsaWVudCogIGMsIGludCAgcmVnaXN0ZXJlZCApCi17Ci0gICAgUGFja2V0KiAgcCA9IHBhY2tldF9hbGxvYygpOwotCi0gICAgLyogc2VuZHMgcmVnaXN0cmF0aW9uIHN0YXR1cyB0byBjbGllbnQgKi8KLSAgICBpZiAoIXJlZ2lzdGVyZWQpIHsKLSAgICAgICAgRCgiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgYy0+Y2hhbm5lbCk7Ci0gICAgICAgIG1lbWNweSggcC0+ZGF0YSwgIktPIiwgMiApOwotICAgICAgICBwLT5sZW4gPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEQoIiVzOiByZWdpc3RyYXRpb24gc3VjY2VlZGVkIGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIGMtPmNoYW5uZWwpOwotICAgICAgICBtZW1jcHkoIHAtPmRhdGEsICJPSyIsIDIgKTsKLSAgICAgICAgcC0+bGVuID0gMjsKLSAgICB9Ci0gICAgY2xpZW50X2R1bXAoYywgcCwgX19GVU5DVElPTl9fKTsKLSAgICBmZGhhbmRsZXJfZW5xdWV1ZShjLT5mZGhhbmRsZXIsIHApOwotCi0gICAgLyogbm93IHNhdmUgcmVnaXN0cmF0aW9uIHN0YXRlCi0gICAgICovCi0gICAgYy0+cmVnaXN0ZXJlZCA9IHJlZ2lzdGVyZWQ7Ci0gICAgaWYgKCFyZWdpc3RlcmVkKSB7Ci0gICAgICAgIC8qIGFsbG93IHRoZSBjbGllbnQgdG8gdHJ5IHJlZ2lzdGVyaW5nIGFub3RoZXIgc2VydmljZSAqLwotICAgICAgICBjLT5jaGFubmVsID0gLTE7Ci0gICAgfQotfQotCi0vKiBzZW5kIGRhdGEgdG8gYSBjbGllbnQgKi8KLXN0YXRpYyB2b2lkCi1jbGllbnRfc2VuZCggQ2xpZW50KiAgYywgUGFja2V0KiAgcCApCi17Ci0gICAgY2xpZW50X2R1bXAoYywgcCwgX19GVU5DVElPTl9fKTsKLSAgICBmZGhhbmRsZXJfZW5xdWV1ZShjLT5mZGhhbmRsZXIsIHApOwotfQotCi0KLS8qIENyZWF0ZSBuZXcgY2xpZW50IHNvY2tldCBoYW5kbGVyICovCi1zdGF0aWMgQ2xpZW50KgotY2xpZW50X25ldyggTXVsdGlwbGV4ZXIqICAgIG11bHQsCi0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmQsCi0gICAgICAgICAgICBGREhhbmRsZXJMaXN0KiAgcGZkaGFuZGxlcnMsCi0gICAgICAgICAgICBDbGllbnQqKiAgICAgICAgcGNsaWVudHMgKQotewotICAgIENsaWVudCogICBjOwotICAgIFJlY2VpdmVyICByZWN2OwotCi0gICAgeG5ldyhjKTsKLQotICAgIGMtPm11bHRpcGxleGVyID0gbXVsdDsKLSAgICBjLT5uZXh0ICAgICAgICA9IE5VTEw7Ci0gICAgYy0+cHJlZiAgICAgICAgPSAmYy0+bmV4dDsKLSAgICBjLT5jaGFubmVsICAgICA9IC0xOwotICAgIGMtPnJlZ2lzdGVyZWQgID0gMDsKLQotICAgIHJlY3YudXNlciAgPSBjOwotICAgIHJlY3YucG9zdCAgPSAoUG9zdEZ1bmMpICBjbGllbnRfZmRfcmVjZWl2ZTsKLSAgICByZWN2LmNsb3NlID0gKENsb3NlRnVuYykgY2xpZW50X2ZkX2Nsb3NlOwotCi0gICAgYy0+ZmRoYW5kbGVyID0gZmRoYW5kbGVyX25ldyggZmQsIHBmZGhhbmRsZXJzLCAmcmVjdiApOwotCi0gICAgLyogYWRkIHRvIGNsaWVudCBsaXN0ICovCi0gICAgYy0+bmV4dCAgID0gKnBjbGllbnRzOwotICAgIGMtPnByZWYgICA9IHBjbGllbnRzOwotICAgICpwY2xpZW50cyA9IGM7Ci0gICAgaWYgKGMtPm5leHQpCi0gICAgICAgIGMtPm5leHQtPnByZWYgPSAmYy0+bmV4dDsKLQotICAgIHJldHVybiBjOwotfQotCi0vKiogIEdMT0JBTCBNVUxUSVBMRVhFUgotICoqLwotCi0vKiBmaW5kIGEgY2xpZW50IGJ5IGl0cyBjaGFubmVsICovCi1zdGF0aWMgQ2xpZW50KgotbXVsdGlwbGV4ZXJfZmluZF9jbGllbnQoIE11bHRpcGxleGVyKiAgbXVsdCwgaW50ICBjaGFubmVsICkKLXsKLSAgICBDbGllbnQqIGMgPSBtdWx0LT5jbGllbnRzOwotCi0gICAgZm9yICggOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0ICkgewotICAgICAgICBpZiAoYy0+Y2hhbm5lbCA9PSBjaGFubmVsKQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBoYW5kbGUgY29udHJvbCBtZXNzYWdlcyBjb21pbmcgZnJvbSB0aGUgc2VyaWFsIHBvcnQKLSAqIG9uIENPTlRST0xfQ0hBTk5FTC4KLSAqLwotc3RhdGljIHZvaWQKLW11bHRpcGxleGVyX2hhbmRsZV9jb250cm9sKCBNdWx0aXBsZXhlciogIG11bHQsIFBhY2tldCogIHAgKQotewotICAgIC8qIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uIHN1Y2Nlc3MgKi8KLSAgICBpZiAocC0+bGVuID09IDEzICYmICFtZW1jbXAocC0+ZGF0YSwgIm9rOmNvbm5lY3Q6IiwgMTEpKSB7Ci0gICAgICAgIGludCAgICAgIGNoYW5uZWwgPSBoZXgyaW50KHAtPmRhdGErMTEsIDIpOwotICAgICAgICBDbGllbnQqICBjbGllbnQgID0gbXVsdGlwbGV4ZXJfZmluZF9jbGllbnQobXVsdCwgY2hhbm5lbCk7Ci0KLSAgICAgICAgLyogbm90ZSB0aGF0ICdjbGllbnQnIGNhbiBiZSBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAqIHNvY2tldCB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgZW11bGF0b3IgcmVzcG9uc2UgYXJyaXZlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgY2xpZW50X3JlZ2lzdHJhdGlvbihjbGllbnQsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRCgiJXM6IE5VTEwgY2xpZW50OiAnJS4qcyciLCBfX0ZVTkNUSU9OX18sIHAtPmxlbiwgcC0+ZGF0YSsxMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ290byBFWElUOwotICAgIH0KLQotICAgIC8qIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uIGZhaWx1cmUgKi8KLSAgICBpZiAocC0+bGVuID09IDEzICYmICFtZW1jbXAocC0+ZGF0YSwgImtvOmNvbm5lY3Q6IiwxMSkpIHsKLSAgICAgICAgaW50ICAgICBjaGFubmVsID0gaGV4MmludChwLT5kYXRhKzExLCAyKTsKLSAgICAgICAgQ2xpZW50KiBjbGllbnQgID0gbXVsdGlwbGV4ZXJfZmluZF9jbGllbnQobXVsdCwgY2hhbm5lbCk7Ci0KLSAgICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKQotICAgICAgICAgICAgY2xpZW50X3JlZ2lzdHJhdGlvbihjbGllbnQsIDApOwotCi0gICAgICAgIGdvdG8gRVhJVDsKLSAgICB9Ci0KLSAgICAvKiBlbXVsYXRvci1pbmR1Y2VkIGNsaWVudCBkaXNjb25uZWN0aW9uICovCi0gICAgaWYgKHAtPmxlbiA9PSAxMyAmJiAhbWVtY21wKHAtPmRhdGEsICJkaXNjb25uZWN0OiIsMTEpKSB7Ci0gICAgICAgIGludCAgICAgIGNoYW5uZWwgPSBoZXgyaW50KHAtPmRhdGErMTEsIDIpOwotICAgICAgICBDbGllbnQqICBjbGllbnQgID0gbXVsdGlwbGV4ZXJfZmluZF9jbGllbnQobXVsdCwgY2hhbm5lbCk7Ci0KLSAgICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKQotICAgICAgICAgICAgY2xpZW50X2ZyZWUoY2xpZW50KTsKLQotICAgICAgICBnb3RvIEVYSVQ7Ci0gICAgfQotCi0gICAgLyogQSBtZXNzYWdlIHRoYXQgYmVnaW5zIHdpdGggIlgwMCIgaXMgYSBwcm9iZSBzZW50IGJ5Ci0gICAgICogdGhlIGVtdWxhdG9yIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIHZlcnNpb24gb2YgcWVtdWQgaXQgcnVucwotICAgICAqIGFnYWluc3QgKGluIG9yZGVyIHRvIGRldGVjdCAxLjAvMS4xIHN5c3RlbSBpbWFnZXMuIEp1c3QKLSAgICAgKiBzaWxlbnRseSBpZ25vcmUgaXQgdGhlcmUgaW5zdGVhZCBvZiBwcmludGluZyBhbiBlcnJvcgotICAgICAqIG1lc3NhZ2UuCi0gICAgICovCi0gICAgaWYgKHAtPmxlbiA+PSAzICYmICFtZW1jbXAocC0+ZGF0YSwiWDAwIiwzKSkgewotICAgICAgICBnb3RvIEVYSVQ7Ci0gICAgfQotCi0gICAgRCgiJXM6IHVua25vd24gY29udHJvbCBtZXNzYWdlICglZCBieXRlcyk6ICclLipzJyIsCi0gICAgICBfX0ZVTkNUSU9OX18sIHAtPmxlbiwgcC0+bGVuLCBwLT5kYXRhKTsKLQotRVhJVDoKLSAgICBwYWNrZXRfZnJlZSgmcCk7Ci19Ci0KLS8qIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYW4gaW5jb21pbmcgcGFja2V0IGNvbWVzIGZyb20gdGhlIHNlcmlhbCBwb3J0ICovCi1zdGF0aWMgdm9pZAotbXVsdGlwbGV4ZXJfc2VyaWFsX3JlY2VpdmUoIE11bHRpcGxleGVyKiAgbXVsdCwgUGFja2V0KiAgcCApCi17Ci0gICAgQ2xpZW50KiAgY2xpZW50OwotCi0gICAgVCgiJXM6IGNoYW5uZWw9JWQgJyUuKnMnIiwgX19GVU5DVElPTl9fLCBwLT5jaGFubmVsLCBwLT5sZW4sIHAtPmRhdGEpOwotCi0gICAgaWYgKHAtPmNoYW5uZWwgPT0gQ0hBTk5FTF9DT05UUk9MKSB7Ci0gICAgICAgIG11bHRpcGxleGVyX2hhbmRsZV9jb250cm9sKG11bHQsIHApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2xpZW50ID0gbXVsdGlwbGV4ZXJfZmluZF9jbGllbnQobXVsdCwgcC0+Y2hhbm5lbCk7Ci0gICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIGNsaWVudF9zZW5kKGNsaWVudCwgcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBEKCIlczogZGlzY2FyZGluZyBwYWNrZXQgZm9yIHVua25vd24gY2hhbm5lbCAlZCIsIF9fRlVOQ1RJT05fXywgcC0+Y2hhbm5lbCk7Ci0gICAgcGFja2V0X2ZyZWUoJnApOwotfQotCi0vKiBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcmVhZGVyIGNsb3NlcyAqLwotc3RhdGljIHZvaWQKLW11bHRpcGxleGVyX3NlcmlhbF9jbG9zZSggTXVsdGlwbGV4ZXIqICBtdWx0ICkKLXsKLSAgICBmYXRhbCgidW5leHBlY3RlZCBjbG9zZSBvZiBzZXJpYWwgcmVhZGVyIik7Ci19Ci0KLS8qIGEgZnVuY3Rpb24gY2FsbGVkIHRvIHNlbmQgYSBwYWNrZXQgdG8gdGhlIHNlcmlhbCBwb3J0ICovCi1zdGF0aWMgdm9pZAotbXVsdGlwbGV4ZXJfc2VyaWFsX3NlbmQoIE11bHRpcGxleGVyKiAgbXVsdCwgaW50ICBjaGFubmVsLCBQYWNrZXQqICBwICkKLXsKLSAgICBwLT5jaGFubmVsID0gY2hhbm5lbDsKLSAgICBzZXJpYWxfc2VuZCggbXVsdC0+c2VyaWFsLCBwICk7Ci19Ci0KLQotCi0vKiBhIGZ1bmN0aW9uIHVzZWQgYnkgYSBjbGllbnQgdG8gYWxsb2NhdGUgYSBuZXcgY2hhbm5lbCBpZCBhbmQKLSAqIGFzayB0aGUgZW11bGF0b3IgdG8gb3BlbiBpdC4gJ3NlcnZpY2UnIG11c3QgYmUgYSBwYWNrZXQgY29udGFpbmluZwotICogdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gaXRzIHBheWxvYWQuCi0gKgotICogcmV0dXJucyAtMSBpZiB0aGUgc2VydmljZSBuYW1lIGlzIHRvbyBsb25nLgotICoKLSAqIG5vdGljZSB0aGF0IGNsaWVudF9yZWdpc3RyYXRpb24oKSB3aWxsIGJlIGNhbGxlZCBsYXRlciB3aGVuCi0gKiB0aGUgYW5zd2VyIGFycml2ZXMuCi0gKi8KLXN0YXRpYyBpbnQKLW11bHRpcGxleGVyX29wZW5fY2hhbm5lbCggTXVsdGlwbGV4ZXIqICBtdWx0LCBQYWNrZXQqICBzZXJ2aWNlICkKLXsKLSAgICBQYWNrZXQqICAgcCA9IHBhY2tldF9hbGxvYygpOwotICAgIGludCAgICAgICBsZW4sIGNoYW5uZWw7Ci0KLSAgICAvKiBmaW5kIGEgZnJlZSBjaGFubmVsIG51bWJlciwgYXNzdW1lIHdlIGRvbid0IGhhdmUgbWFueQotICAgICAqIGNsaWVudHMgaGVyZS4gKi8KLSAgICB7Ci0gICAgICAgIENsaWVudCogIGM7Ci0gICAgVFJZX0FHQUlOOgotICAgICAgICBjaGFubmVsID0gKCsrbXVsdC0+bGFzdF9jaGFubmVsKSAmIDB4ZmY7Ci0KLSAgICAgICAgZm9yIChjID0gbXVsdC0+Y2xpZW50czsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dCkKLSAgICAgICAgICAgIGlmIChjLT5jaGFubmVsID09IGNoYW5uZWwpCi0gICAgICAgICAgICAgICAgZ290byBUUllfQUdBSU47Ci0gICAgfQotCi0gICAgbGVuID0gc25wcmludGYoKGNoYXIqKXAtPmRhdGEsIHNpemVvZiBwLT5kYXRhLCAiY29ubmVjdDolLipzOiUwMngiLCBzZXJ2aWNlLT5sZW4sIHNlcnZpY2UtPmRhdGEsIGNoYW5uZWwpOwotICAgIGlmIChsZW4gPj0gKGludClzaXplb2YocC0+ZGF0YSkpIHsKLSAgICAgICAgRCgiJXM6IHdlaXJkLCBzZXJ2aWNlIG5hbWUgdG9vIGxvbmcgKCVkID4gJWQpIiwgX19GVU5DVElPTl9fLCBsZW4sIHNpemVvZihwLT5kYXRhKSk7Ci0gICAgICAgIHBhY2tldF9mcmVlKCZwKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBwLT5jaGFubmVsID0gQ0hBTk5FTF9DT05UUk9MOwotICAgIHAtPmxlbiAgICAgPSBsZW47Ci0KLSAgICBzZXJpYWxfc2VuZChtdWx0LT5zZXJpYWwsIHApOwotICAgIHJldHVybiBjaGFubmVsOwotfQotCi0vKiB1c2VkIHRvIHRlbGwgdGhlIGVtdWxhdG9yIGEgY2hhbm5lbCB3YXMgY2xvc2VkIGJ5IGEgY2xpZW50ICovCi1zdGF0aWMgdm9pZAotbXVsdGlwbGV4ZXJfY2xvc2VfY2hhbm5lbCggTXVsdGlwbGV4ZXIqICBtdWx0LCBpbnQgIGNoYW5uZWwgKQotewotICAgIFBhY2tldCogIHAgICA9IHBhY2tldF9hbGxvYygpOwotICAgIGludCAgICAgIGxlbiA9IHNucHJpbnRmKChjaGFyKilwLT5kYXRhLCBzaXplb2YocC0+ZGF0YSksICJkaXNjb25uZWN0OiUwMngiLCBjaGFubmVsKTsKLQotICAgIGlmIChsZW4gPiAoaW50KXNpemVvZihwLT5kYXRhKSkgewotICAgICAgICAvKiBzaG91bGQgbm90IGhhcHBlbiAqLwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcC0+Y2hhbm5lbCA9IENIQU5ORUxfQ09OVFJPTDsKLSAgICBwLT5sZW4gICAgID0gbGVuOwotCi0gICAgc2VyaWFsX3NlbmQobXVsdC0+c2VyaWFsLCBwKTsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBoYXBwZW5zIG9uIHRoZSBjb250cm9sCi0gKiBzb2NrZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1tdWx0aXBsZXhlcl9jb250cm9sX2FjY2VwdCggTXVsdGlwbGV4ZXIqICBtLCBQYWNrZXQqICBwICkKLXsKLSAgICAvKiB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IHNvY2tldCBjb25uZWN0aW9uIGlzCi0gICAgICogaW4gcC0+Y2hhbm5lbC4gU2VlIGZkaGFuZGxlcl9hY2NlcHRfZXZlbnQoKSAqLwotICAgIGludCAgICAgIGZkICAgICA9IHAtPmNoYW5uZWw7Ci0gICAgQ2xpZW50KiAgY2xpZW50ID0gY2xpZW50X25ldyggbSwgZmQsIG0tPmZkaGFuZGxlcnMsICZtLT5jbGllbnRzICk7Ci0KLSAgICBEKCJjcmVhdGVkIGNsaWVudCAlcCBsaXN0ZW5pbmcgb24gZmQgJWQiLCBjbGllbnQsIGZkKTsKLQotICAgIC8qIGZyZWUgZHVtbXkgcGFja2V0ICovCi0gICAgcGFja2V0X2ZyZWUoJnApOwotfQotCi1zdGF0aWMgdm9pZAotbXVsdGlwbGV4ZXJfY29udHJvbF9jbG9zZSggTXVsdGlwbGV4ZXIqICBtICkKLXsKLSAgICBmYXRhbCgidW5leHBlY3RlZCBtdWx0aXBsZXhlciBjb250cm9sIGNsb3NlIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tdWx0aXBsZXhlcl9pbml0KCBNdWx0aXBsZXhlciogIG0sIGNvbnN0IGNoYXIqICBzZXJpYWxfZGV2ICkKLXsKLSAgICBpbnQgICAgICAgZmQsIGNvbnRyb2xfZmQ7Ci0gICAgUmVjZWl2ZXIgIHJlY3Y7Ci0KLSAgICAvKiBpbml0aWFsaXplIGxvb3BlciBhbmQgZmRoYW5kbGVycyBsaXN0ICovCi0gICAgbG9vcGVyX2luaXQoIG0tPmxvb3BlciApOwotICAgIGZkaGFuZGxlcl9saXN0X2luaXQoIG0tPmZkaGFuZGxlcnMsIG0tPmxvb3BlciApOwotCi0gICAgLyogb3BlbiB0aGUgc2VyaWFsIHBvcnQgKi8KLSAgICBkbyB7Ci0gICAgICAgIGZkID0gb3BlbihzZXJpYWxfZGV2LCBPX1JEV1IpOwotICAgIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIGZhdGFsKCAiJXM6IGNvdWxkIG5vdCBvcGVuICclcyc6ICVzIiwgX19GVU5DVElPTl9fLCBzZXJpYWxfZGV2LAotICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pICk7Ci0gICAgfQotICAgIC8vIGRpc2FibGUgZWNobyBvbiBzZXJpYWwgbGluZXMKLSAgICBpZiAoICFtZW1jbXAoIHNlcmlhbF9kZXYsICIvZGV2L3R0eVMiLCA5ICkgKSB7Ci0gICAgICAgIHN0cnVjdCB0ZXJtaW9zICBpb3M7Ci0gICAgICAgIHRjZ2V0YXR0ciggZmQsICZpb3MgKTsKLSAgICAgICAgaW9zLmNfbGZsYWcgPSAwOyAgLyogZGlzYWJsZSBFQ0hPLCBJQ0FOT04sIGV0Yy4uLiAqLwotICAgICAgICB0Y3NldGF0dHIoIGZkLCBUQ1NBTk9XLCAmaW9zICk7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIHJlYWRlci93cml0ZXIgKi8KLSAgICByZWN2LnVzZXIgID0gbTsKLSAgICByZWN2LnBvc3QgID0gKFBvc3RGdW5jKSAgbXVsdGlwbGV4ZXJfc2VyaWFsX3JlY2VpdmU7Ci0gICAgcmVjdi5jbG9zZSA9IChDbG9zZUZ1bmMpIG11bHRpcGxleGVyX3NlcmlhbF9jbG9zZTsKLQotICAgIHNlcmlhbF9pbml0KCBtLT5zZXJpYWwsIGZkLCBtLT5mZGhhbmRsZXJzLCAmcmVjdiApOwotCi0gICAgLyogb3BlbiB0aGUgcWVtdWQgY29udHJvbCBzb2NrZXQgKi8KLSAgICByZWN2LnVzZXIgID0gbTsKLSAgICByZWN2LnBvc3QgID0gKFBvc3RGdW5jKSAgbXVsdGlwbGV4ZXJfY29udHJvbF9hY2NlcHQ7Ci0gICAgcmVjdi5jbG9zZSA9IChDbG9zZUZ1bmMpIG11bHRpcGxleGVyX2NvbnRyb2xfY2xvc2U7Ci0KLSAgICBmZCA9IGFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0KENPTlRST0xfU09DS0VUX05BTUUpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgZmF0YWwoImNvdWxkbid0IGdldCBmZCBmb3IgY29udHJvbCBzb2NrZXQgJyVzJyIsIENPTlRST0xfU09DS0VUX05BTUUpOwotICAgIH0KLQotICAgIGZkaGFuZGxlcl9uZXdfYWNjZXB0KCBmZCwgbS0+ZmRoYW5kbGVycywgJnJlY3YgKTsKLQotICAgIC8qIGluaXRpYWxpemUgY2xpZW50cyBsaXN0ICovCi0gICAgbS0+Y2xpZW50cyA9IE5VTEw7Ci19Ci0KLS8qKiBNQUlOIExPT1AKLSAqKi8KLQotc3RhdGljIE11bHRpcGxleGVyICBfbXVsdGlwbGV4ZXJbMV07Ci0KLWludCAgbWFpbiggdm9pZCApCi17Ci0gICAgTXVsdGlwbGV4ZXIqICBtID0gX211bHRpcGxleGVyOwotCi0gICAvKiBleHRyYWN0IHRoZSBuYW1lIG9mIG91ciBzZXJpYWwgZGV2aWNlIGZyb20gdGhlIGtlcm5lbAotICAgICogYm9vdCBvcHRpb25zIHRoYXQgYXJlIHN0b3JlZCBpbiAvcHJvYy9jbWRsaW5lCi0gICAgKi8KLSNkZWZpbmUgIEtFUk5FTF9PUFRJT04gICJhbmRyb2lkLnFlbXVkPSIKLQotICAgIHsKLSAgICAgICAgY2hhciAgICAgICAgICBidWZmWzEwMjRdOwotICAgICAgICBpbnQgICAgICAgICAgIGZkLCBsZW47Ci0gICAgICAgIGNoYXIqICAgICAgICAgcDsKLSAgICAgICAgY2hhciogICAgICAgICBxOwotCi0gICAgICAgIGZkID0gb3BlbiggIi9wcm9jL2NtZGxpbmUiLCBPX1JET05MWSApOwotICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBEKCIlczogY2FuJ3Qgb3BlbiAvcHJvYy9jbWRsaW5lICEhOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVuID0gZmRfcmVhZCggZmQsIGJ1ZmYsIHNpemVvZihidWZmKS0xICk7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIEQoIiVzOiBjYW4ndCByZWFkIC9wcm9jL2NtZGxpbmU6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZltsZW5dID0gMDsKLQotICAgICAgICBwID0gc3Ryc3RyKCBidWZmLCBLRVJORUxfT1BUSU9OICk7Ci0gICAgICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgICAgIEQoIiVzOiBjYW4ndCBmaW5kICclcycgaW4gL3Byb2MvY21kbGluZSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIEtFUk5FTF9PUFRJT04gKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwICs9IHNpemVvZihLRVJORUxfT1BUSU9OKS0xOyAgLyogc2tpcCBvcHRpb24gKi8KLSAgICAgICAgcSAgPSBwOwotICAgICAgICB3aGlsZSAoICpxICYmICpxICE9ICcgJyAmJiAqcSAhPSAnXHQnICkKLSAgICAgICAgICAgIHEgKz0gMTsKLQotICAgICAgICBzbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiL2Rldi8lLipzIiwgcS1wLCBwICk7Ci0KLSAgICAgICAgbXVsdGlwbGV4ZXJfaW5pdCggbSwgYnVmZiApOwotICAgIH0KLQotICAgIEQoICJlbnRlcmluZyBtYWluIGxvb3AiKTsKLSAgICBsb29wZXJfbG9vcCggbS0+bG9vcGVyICk7Ci0gICAgRCggInVuZXhwZWN0ZWQgdGVybWluYXRpb24gISEiICk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvQW5kcm9pZC5tayBiL2VtdWxhdG9yL3F0b29scy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDkzOTBjLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLSMgCi0jIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgSmF2YSBtZXRob2QgdHJhY2UgZHVtcCB0b29sCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1jb21tb25faW5jbHVkZXMgOj0gZXh0ZXJuYWwvcWVtdQotY29tbW9uX2NmbGFncyA6PSAtTzAgLWcKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gcG9zdF90cmFjZS5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gcG9zdF90cmFjZQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gcmVhZF90cmFjZS5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBhcm1kaXMuY3BwIFwKLQl0aHVtYmRpcy5jcHAgb3Bjb2RlLmNwcCByZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHJlYWRfdHJhY2UKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGNoZWNrX3RyYWNlLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwIFwKLQlvcGNvZGUuY3BwIHJlYWRfZWxmLmNwcCBwYXJzZV9vcHRpb25zLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gY2hlY2tfdHJhY2UKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGJiX2R1bXAuY3BwIHRyYWNlX3JlYWRlci5jcHAgZGVjb2Rlci5jcHAgXAotCXJlYWRfZWxmLmNwcCBwYXJzZV9vcHRpb25zLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gYmJfZHVtcAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gYmIyc3ltLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwIFwKLQlyZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IGJiMnN5bQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gcHJvZmlsZV90cmFjZS5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBcCi0Jb3Bjb2RlLmNwcCByZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHByb2ZpbGVfdHJhY2UKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGJicHJvZi5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBhcm1kaXMuY3BwIFwKLQl0aHVtYmRpcy5jcHAgb3Bjb2RlLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gYmJwcm9mCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBxMmcuY3BwIHRyYWNlX3JlYWRlci5jcHAgZGVjb2Rlci5jcHAgXAotCW9wY29kZS5jcHAgcmVhZF9lbGYuY3BwIHBhcnNlX29wdGlvbnMuY3BwIGd0cmFjZS5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHEyZwotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gcTJkbS5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBhcm1kaXMuY3BwIFwKLQl0aHVtYmRpcy5jcHAgb3Bjb2RlLmNwcCByZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAgZG10cmFjZS5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHEyZG0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGNvdmVyYWdlLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwIGFybWRpcy5jcHAgXAotCXRodW1iZGlzLmNwcCBvcGNvZGUuY3BwIHJlYWRfZWxmLmNwcCBwYXJzZV9vcHRpb25zLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gY292ZXJhZ2UKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IHN0YWNrX2R1bXAuY3BwIHRyYWNlX3JlYWRlci5jcHAgZGVjb2Rlci5jcHAgYXJtZGlzLmNwcCBcCi0JdGh1bWJkaXMuY3BwIG9wY29kZS5jcHAgcmVhZF9lbGYuY3BwIHBhcnNlX29wdGlvbnMuY3BwCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY29tbW9uX2luY2x1ZGVzKQotTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX2NmbGFncykKLUxPQ0FMX01PRFVMRSA6PSBzdGFja19kdW1wCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBjaGVja19zdGFjay5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBhcm1kaXMuY3BwIFwKLQl0aHVtYmRpcy5jcHAgb3Bjb2RlLmNwcCByZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IGNoZWNrX3N0YWNrCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBoaXN0X3RyYWNlLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY29tbW9uX2luY2x1ZGVzKQotTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX2NmbGFncykKLUxPQ0FMX01PRFVMRSA6PSBoaXN0X3RyYWNlCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSByZWFkX2FkZHIuY3BwIHRyYWNlX3JlYWRlci5jcHAgZGVjb2Rlci5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHJlYWRfYWRkcgotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gcmVhZF9waWQuY3BwIHRyYWNlX3JlYWRlci5jcHAgZGVjb2Rlci5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHJlYWRfcGlkCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBleGNfZHVtcC5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNvbW1vbl9pbmNsdWRlcykKLUxPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9jZmxhZ3MpCi1MT0NBTF9NT0RVTEUgOj0gZXhjX2R1bXAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IHJlYWRfbWV0aG9kLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwIFwKLQlyZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IHJlYWRfbWV0aG9kCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBwcm9maWxlX3BpZC5jcHAgdHJhY2VfcmVhZGVyLmNwcCBkZWNvZGVyLmNwcCBcCi0JcmVhZF9lbGYuY3BwIHBhcnNlX29wdGlvbnMuY3BwCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY29tbW9uX2luY2x1ZGVzKQotTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX2NmbGFncykKLUxPQ0FMX01PRFVMRSA6PSBwcm9maWxlX3BpZAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gZHVtcF9yZWdpb25zLmNwcCB0cmFjZV9yZWFkZXIuY3BwIGRlY29kZXIuY3BwIFwKLQlyZWFkX2VsZi5jcHAgcGFyc2Vfb3B0aW9ucy5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjb21tb25faW5jbHVkZXMpCi1MT0NBTF9DRkxBR1MgKz0gJChjb21tb25fY2ZsYWdzKQotTE9DQUxfTU9EVUxFIDo9IGR1bXBfcmVnaW9ucwotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9hcm1kaXMuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2FybWRpcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzU4NjcuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2FybWRpcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJhcm1kaXMuaCIKLSNpbmNsdWRlICJvcGNvZGUuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbmRfbmFtZXNbXSA9IHsKLSAgICAiZXEiLAotICAgICJuZSIsCi0gICAgImNzIiwKLSAgICAiY2MiLAotICAgICJtaSIsCi0gICAgInBsIiwKLSAgICAidnMiLAotICAgICJ2YyIsCi0gICAgImhpIiwKLSAgICAibHMiLAotICAgICJnZSIsCi0gICAgImx0IiwKLSAgICAiZ3QiLAotICAgICJsZSIsCi0gICAgIiIsCi0gICAgIlJFU0VSVkVEIgotfTsKLQotLy8gSW5kZXhlZCBieSB0aGUgc2hpZnQgdHlwZSAoYml0cyA2LTUpCi1zdGF0aWMgY29uc3QgY2hhciAqc2hpZnRfbmFtZXNbXSA9IHsKLSAgICAiTFNMIiwKLSAgICAiTFNSIiwKLSAgICAiQVNSIiwKLSAgICAiUk9SIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGNvbmRfdG9fc3RyKGludCBjb25kKSB7Ci0gICAgcmV0dXJuIGNvbmRfbmFtZXNbY29uZF07Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtKHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGluc24sIGNoYXIgKnJlc3VsdCkKLXsKLSAgICBzdGF0aWMgY2hhciAgIGJ1Zls4MF07Ci0gICAgY2hhciAgICAgICAgICAqcHRyOwotCi0gICAgcHRyID0gcmVzdWx0ID8gcmVzdWx0IDogYnVmOwotICAgIE9wY29kZSBvcGNvZGUgPSBkZWNvZGUoaW5zbik7Ci0gICAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICAgICAgY2FzZSBPUF9JTlZBTElEOgotICAgICAgICAgICAgc3ByaW50ZihwdHIsICJJbnZhbGlkIik7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICBjYXNlIE9QX1VOREVGSU5FRDoKLSAgICAgICAgICAgIHNwcmludGYocHRyLCAiVW5kZWZpbmVkIik7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICBjYXNlIE9QX0FEQzoKLSAgICAgICAgY2FzZSBPUF9BREQ6Ci0gICAgICAgIGNhc2UgT1BfQU5EOgotICAgICAgICBjYXNlIE9QX0JJQzoKLSAgICAgICAgY2FzZSBPUF9DTU46Ci0gICAgICAgIGNhc2UgT1BfQ01QOgotICAgICAgICBjYXNlIE9QX0VPUjoKLSAgICAgICAgY2FzZSBPUF9NT1Y6Ci0gICAgICAgIGNhc2UgT1BfTVZOOgotICAgICAgICBjYXNlIE9QX09SUjoKLSAgICAgICAgY2FzZSBPUF9SU0I6Ci0gICAgICAgIGNhc2UgT1BfUlNDOgotICAgICAgICBjYXNlIE9QX1NCQzoKLSAgICAgICAgY2FzZSBPUF9TVUI6Ci0gICAgICAgIGNhc2UgT1BfVEVROgotICAgICAgICBjYXNlIE9QX1RTVDoKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fYWx1KG9wY29kZSwgaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9COgotICAgICAgICBjYXNlIE9QX0JMOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9icmFuY2goYWRkciwgb3Bjb2RlLCBpbnNuLCBwdHIpOwotICAgICAgICBjYXNlIE9QX0JLUFQ6Ci0gICAgICAgICAgICByZXR1cm4gZGlzYXNtX2JrcHQoaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9CTFg6Ci0gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIHlldAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfQlg6Ci0gICAgICAgICAgICByZXR1cm4gZGlzYXNtX2J4KGluc24sIHB0cik7Ci0gICAgICAgIGNhc2UgT1BfQ0RQOgotICAgICAgICAgICAgc3ByaW50ZihwdHIsICJjZHAiKTsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIGNhc2UgT1BfQ0xaOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9jbHooaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9MREM6Ci0gICAgICAgICAgICBzcHJpbnRmKHB0ciwgImxkYyIpOwotICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgY2FzZSBPUF9MRE06Ci0gICAgICAgIGNhc2UgT1BfU1RNOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9tZW1ibG9jayhvcGNvZGUsIGluc24sIHB0cik7Ci0gICAgICAgIGNhc2UgT1BfTERSOgotICAgICAgICBjYXNlIE9QX0xEUkI6Ci0gICAgICAgIGNhc2UgT1BfTERSQlQ6Ci0gICAgICAgIGNhc2UgT1BfTERSVDoKLSAgICAgICAgY2FzZSBPUF9TVFI6Ci0gICAgICAgIGNhc2UgT1BfU1RSQjoKLSAgICAgICAgY2FzZSBPUF9TVFJCVDoKLSAgICAgICAgY2FzZSBPUF9TVFJUOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9tZW0oaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9MRFJIOgotICAgICAgICBjYXNlIE9QX0xEUlNCOgotICAgICAgICBjYXNlIE9QX0xEUlNIOgotICAgICAgICBjYXNlIE9QX1NUUkg6Ci0gICAgICAgICAgICByZXR1cm4gZGlzYXNtX21lbWhhbGYoaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9NQ1I6Ci0gICAgICAgIGNhc2UgT1BfTVJDOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9tY3Iob3Bjb2RlLCBpbnNuLCBwdHIpOwotICAgICAgICBjYXNlIE9QX01MQToKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fbWxhKG9wY29kZSwgaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9NUlM6Ci0gICAgICAgICAgICByZXR1cm4gZGlzYXNtX21ycyhpbnNuLCBwdHIpOwotICAgICAgICBjYXNlIE9QX01TUjoKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fbXNyKGluc24sIHB0cik7Ci0gICAgICAgIGNhc2UgT1BfTVVMOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9tdWwob3Bjb2RlLCBpbnNuLCBwdHIpOwotICAgICAgICBjYXNlIE9QX1BMRDoKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fcGxkKGluc24sIHB0cik7Ci0gICAgICAgIGNhc2UgT1BfU1RDOgotICAgICAgICAgICAgc3ByaW50ZihwdHIsICJzdGMiKTsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIGNhc2UgT1BfU1dJOgotICAgICAgICAgICAgcmV0dXJuIGRpc2FzbV9zd2koaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9TV1A6Ci0gICAgICAgIGNhc2UgT1BfU1dQQjoKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fc3dwKG9wY29kZSwgaW5zbiwgcHRyKTsKLSAgICAgICAgY2FzZSBPUF9VTUxBTDoKLSAgICAgICAgY2FzZSBPUF9VTVVMTDoKLSAgICAgICAgY2FzZSBPUF9TTUxBTDoKLSAgICAgICAgY2FzZSBPUF9TTVVMTDoKLSAgICAgICAgICAgIHJldHVybiBkaXNhc21fdW1sYWwob3Bjb2RlLCBpbnNuLCBwdHIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3ByaW50ZihwdHIsICJFcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX2FsdShPcGNvZGUgb3Bjb2RlLCB1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05vT3BlcmFuZDEgPSAxOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtOb0Rlc3QgPSAyOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtOb1NiaXQgPSA0OwotCi0gICAgY2hhciBybl9zdHJbMjBdOwotICAgIGNoYXIgcmRfc3RyWzIwXTsKLSAgICB1aW50OF90IGZsYWdzID0gMDsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCBpc19pbW1lZCA9IChpbnNuID4+IDI1KSAmIDB4MTsKLSAgICB1aW50OF90IGJpdF9zID0gKGluc24gPj4gMjApICYgMTsKLSAgICB1aW50OF90IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotICAgIHVpbnQ4X3QgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0gICAgdWludDhfdCBpbW1lZCA9IGluc24gJiAweGZmOwotCi0gICAgY29uc3QgY2hhciAqb3BuYW1lID0gb3Bjb2RlX25hbWVzW29wY29kZV07Ci0gICAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICAgICAgY2FzZSBPUF9DTU46Ci0gICAgICAgIGNhc2UgT1BfQ01QOgotICAgICAgICBjYXNlIE9QX1RFUToKLSAgICAgICAgY2FzZSBPUF9UU1Q6Ci0gICAgICAgICAgICBmbGFncyA9IGtOb0Rlc3QgfCBrTm9TYml0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfTU9WOgotICAgICAgICBjYXNlIE9QX01WTjoKLSAgICAgICAgICAgIGZsYWdzID0ga05vT3BlcmFuZDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIFRoZSAibW92IiBpbnN0cnVjdGlvbiBpZ25vcmVzIHRoZSBmaXJzdCBvcGVyYW5kIChybikuCi0gICAgcm5fc3RyWzBdID0gMDsKLSAgICBpZiAoKGZsYWdzICYga05vT3BlcmFuZDEpID09IDApIHsKLSAgICAgICAgc3ByaW50Zihybl9zdHIsICJyJWQsICIsIHJuKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBkbyBub3Qgd3JpdGUgdGhlIHJlc3VsdCByZWdpc3RlciAocmQpOgotICAgIC8vIHRzdCwgdGVxLCBjbXAsIGNtbi4KLSAgICByZF9zdHJbMF0gPSAwOwotICAgIGlmICgoZmxhZ3MgJiBrTm9EZXN0KSA9PSAwKSB7Ci0gICAgICAgIHNwcmludGYocmRfc3RyLCAiciVkLCAiLCByZCk7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqc2JpdF9zdHIgPSAiIjsKLSAgICBpZiAoYml0X3MgJiYgIShmbGFncyAmIGtOb1NiaXQpKQotICAgICAgICBzYml0X3N0ciA9ICJzIjsKLQotICAgIGlmIChpc19pbW1lZCkgewotICAgICAgICBzcHJpbnRmKHB0ciwgIiVzJXMlc1x0JXMlcyMldSAgOyAweCV4IiwKLSAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBzYml0X3N0ciwgcmRfc3RyLCBybl9zdHIsIGltbWVkLCBpbW1lZCk7Ci0gICAgICAgIHJldHVybiBwdHI7Ci0gICAgfQotCi0gICAgdWludDhfdCBzaGlmdF9pc19yZWcgPSAoaW5zbiA+PiA0KSAmIDE7Ci0gICAgdWludDhfdCByb3RhdGUgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKLSAgICB1aW50OF90IHJtID0gaW5zbiAmIDB4ZjsKLSAgICB1aW50OF90IHNoaWZ0X3R5cGUgPSAoaW5zbiA+PiA1KSAmIDB4MzsKLSAgICB1aW50OF90IHJzID0gKGluc24gPj4gOCkgJiAweGY7Ci0gICAgdWludDhfdCBzaGlmdF9hbW91bnQgPSAoaW5zbiA+PiA3KSAmIDB4MWY7Ci0gICAgdWludDMyX3Qgcm90YXRlZF92YWwgPSBpbW1lZDsKLSAgICB1aW50OF90IHJvdGF0ZTIgPSByb3RhdGUgPDwgMTsKLSAgICByb3RhdGVkX3ZhbCA9IChyb3RhdGVkX3ZhbCA+PiByb3RhdGUyKSB8IChyb3RhdGVkX3ZhbCA8PCAoMzIgLSByb3RhdGUyKSk7Ci0KLSAgICBpZiAoIXNoaWZ0X2lzX3JlZyAmJiBzaGlmdF90eXBlID09IDAgJiYgc2hpZnRfYW1vdW50ID09IDApIHsKLSAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdCVzJXNyJWQiLAotICAgICAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIHNiaXRfc3RyLCByZF9zdHIsIHJuX3N0ciwgcm0pOwotICAgICAgICByZXR1cm4gcHRyOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKnNoaWZ0X25hbWUgPSBzaGlmdF9uYW1lc1tzaGlmdF90eXBlXTsKLSAgICBpZiAoc2hpZnRfaXNfcmVnKSB7Ci0gICAgICAgIHNwcmludGYocHRyLCAiJXMlcyVzXHQlcyVzciVkLCAlcyByJWQiLAotICAgICAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIHNiaXRfc3RyLCByZF9zdHIsIHJuX3N0ciwgcm0sCi0gICAgICAgICAgICAgICAgc2hpZnRfbmFtZSwgcnMpOwotICAgICAgICByZXR1cm4gcHRyOwotICAgIH0KLSAgICBpZiAoc2hpZnRfYW1vdW50ID09IDApIHsKLSAgICAgICAgaWYgKHNoaWZ0X3R5cGUgPT0gMykgewotICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdCVzJXNyJWQsIFJSWCIsCi0gICAgICAgICAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIHNiaXRfc3RyLCByZF9zdHIsIHJuX3N0ciwgcm0pOwotICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgfQotICAgICAgICBzaGlmdF9hbW91bnQgPSAzMjsKLSAgICB9Ci0gICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdCVzJXNyJWQsICVzICMldSIsCi0gICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBzYml0X3N0ciwgcmRfc3RyLCBybl9zdHIsIHJtLAotICAgICAgICAgICAgc2hpZnRfbmFtZSwgc2hpZnRfYW1vdW50KTsKLSAgICByZXR1cm4gcHRyOwotfQotCi1jaGFyICpBcm06OmRpc2FzbV9icmFuY2godWludDMyX3QgYWRkciwgT3Bjb2RlIG9wY29kZSwgdWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50MzJfdCBvZmZzZXQgPSBpbnNuICYgMHhmZmZmZmY7Ci0gICAgLy8gU2lnbi1leHRlbmQgdGhlIDI0LWJpdCBvZmZzZXQKLSAgICBpZiAoKG9mZnNldCA+PiAyMykgJiAxKQotICAgICAgICBvZmZzZXQgfD0gMHhmZjAwMDAwMDsKLQotICAgIC8vIFByZS1jb21wdXRlIHRoZSBsZWZ0LXNoaWZ0IGFuZCB0aGUgcHJlZmV0Y2ggb2Zmc2V0Ci0gICAgb2Zmc2V0IDw8PSAyOwotICAgIG9mZnNldCArPSA4OwotICAgIGFkZHIgKz0gb2Zmc2V0OwotICAgIGNvbnN0IGNoYXIgKm9wbmFtZSA9IG9wY29kZV9uYW1lc1tvcGNvZGVdOwotICAgIHNwcmludGYocHRyLCAiJXMlc1x0MHgleCIsIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIGFkZHIpOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX2J4KHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCBybiA9IGluc24gJiAweGY7Ci0gICAgc3ByaW50ZihwdHIsICJieCVzXHRyJWQiLCBjb25kX3RvX3N0cihjb25kKSwgcm4pOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX2JrcHQodWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQzMl90IGltbWVkID0gKCgoaW5zbiA+PiA4KSAmIDB4ZmZmKSA8PCA0KSB8IChpbnNuICYgMHhmKTsKLSAgICBzcHJpbnRmKHB0ciwgImJrcHRcdCMlZCIsIGltbWVkKTsKLSAgICByZXR1cm4gcHRyOwotfQotCi1jaGFyICpBcm06OmRpc2FzbV9jbHoodWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotICAgIHVpbnQ4X3Qgcm0gPSBpbnNuICYgMHhmOwotICAgIHNwcmludGYocHRyLCAiY2x6JXNcdHIlZCwgciVkIiwgY29uZF90b19zdHIoY29uZCksIHJkLCBybSk7Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotY2hhciAqQXJtOjpkaXNhc21fbWVtYmxvY2soT3Bjb2RlIG9wY29kZSwgdWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIGNoYXIgdG1wX3JlZ1sxMF0sIHRtcF9saXN0WzgwXTsKLQotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IHdyaXRlX2JhY2sgPSAoaW5zbiA+PiAyMSkgJiAweDE7Ci0gICAgdWludDhfdCBiaXRfcyA9IChpbnNuID4+IDIyKSAmIDB4MTsKLSAgICB1aW50OF90IGlzX3VwID0gKGluc24gPj4gMjMpICYgMHgxOwotICAgIHVpbnQ4X3QgaXNfcHJlID0gKGluc24gPj4gMjQpICYgMHgxOwotICAgIHVpbnQ4X3Qgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0gICAgdWludDE2X3QgcmVnX2xpc3QgPSBpbnNuICYgMHhmZmZmOwotCi0gICAgY29uc3QgY2hhciAqb3BuYW1lID0gb3Bjb2RlX25hbWVzW29wY29kZV07Ci0KLSAgICBjb25zdCBjaGFyICpiYW5nID0gIiI7Ci0gICAgaWYgKHdyaXRlX2JhY2spCi0gICAgICAgIGJhbmcgPSAiISI7Ci0KLSAgICBjb25zdCBjaGFyICpjYXJyZXQgPSAiIjsKLSAgICBpZiAoYml0X3MpCi0gICAgICAgIGNhcnJldCA9ICJeIjsKLQotICAgIGNvbnN0IGNoYXIgKmNvbW1hID0gIiI7Ci0gICAgdG1wX2xpc3RbMF0gPSAwOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxNjsgKytpaSkgewotICAgICAgICBpZiAocmVnX2xpc3QgJiAoMSA8PCBpaSkpIHsKLSAgICAgICAgICAgIHNwcmludGYodG1wX3JlZywgIiVzciVkIiwgY29tbWEsIGlpKTsKLSAgICAgICAgICAgIHN0cmNhdCh0bXBfbGlzdCwgdG1wX3JlZyk7Ci0gICAgICAgICAgICBjb21tYSA9ICIsIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKmFkZHJfbW9kZSA9ICIiOwotICAgIGlmIChpc19wcmUpIHsKLSAgICAgICAgaWYgKGlzX3VwKSB7Ci0gICAgICAgICAgICBhZGRyX21vZGUgPSAiaWIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkcl9tb2RlID0gImRiIjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc191cCkgewotICAgICAgICAgICAgYWRkcl9tb2RlID0gImlhIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJfbW9kZSA9ICJkYSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcHJpbnRmKHB0ciwgIiVzJXMlc1x0ciVkJXMsIHslc30lcyIsCi0gICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBhZGRyX21vZGUsIHJuLCBiYW5nLCB0bXBfbGlzdCwgY2FycmV0KTsKLSAgICByZXR1cm4gcHRyOwotfQotCi1jaGFyICpBcm06OmRpc2FzbV9tZW0odWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IGlzX3JlZyA9IChpbnNuID4+IDI1KSAmIDB4MTsKLSAgICB1aW50OF90IGlzX2xvYWQgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgdWludDhfdCB3cml0ZV9iYWNrID0gKGluc24gPj4gMjEpICYgMHgxOwotICAgIHVpbnQ4X3QgaXNfYnl0ZSA9IChpbnNuID4+IDIyKSAmIDB4MTsKLSAgICB1aW50OF90IGlzX3VwID0gKGluc24gPj4gMjMpICYgMHgxOwotICAgIHVpbnQ4X3QgaXNfcHJlID0gKGluc24gPj4gMjQpICYgMHgxOwotICAgIHVpbnQ4X3Qgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0gICAgdWludDhfdCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLSAgICB1aW50MTZfdCBvZmZzZXQgPSBpbnNuICYgMHhmZmY7Ci0KLSAgICBjb25zdCBjaGFyICpvcG5hbWUgPSAibGRyIjsKLSAgICBpZiAoIWlzX2xvYWQpCi0gICAgICAgIG9wbmFtZSA9ICJzdHIiOwotCi0gICAgY29uc3QgY2hhciAqYmFuZyA9ICIiOwotICAgIGlmICh3cml0ZV9iYWNrKQotICAgICAgICBiYW5nID0gIiEiOwotCi0gICAgY29uc3QgY2hhciAqbWludXMgPSAiIjsKLSAgICBpZiAoaXNfdXAgPT0gMCkKLSAgICAgICAgbWludXMgPSAiLSI7Ci0KLSAgICBjb25zdCBjaGFyICpieXRlID0gIiI7Ci0gICAgaWYgKGlzX2J5dGUpCi0gICAgICAgIGJ5dGUgPSAiYiI7Ci0KLSAgICBpZiAoaXNfcmVnID09IDApIHsKLSAgICAgICAgaWYgKGlzX3ByZSkgewotICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdHIlZCwgW3IlZF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYnl0ZSwgcmQsIHJuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdHIlZCwgW3IlZCwgIyVzJXVdJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYnl0ZSwgcmQsIHJuLCBtaW51cywgb2Zmc2V0LCBiYW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRyYW5zZmVyID0gIiI7Ci0gICAgICAgICAgICBpZiAod3JpdGVfYmFjaykKLSAgICAgICAgICAgICAgICB0cmFuc2ZlciA9ICJ0IjsKLSAgICAgICAgICAgIHNwcmludGYocHRyLCAiJXMlcyVzJXNcdHIlZCwgW3IlZF0sICMlcyV1IiwKLSAgICAgICAgICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYnl0ZSwgdHJhbnNmZXIsIHJkLCBybiwgbWludXMsIG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHB0cjsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJtID0gaW5zbiAmIDB4ZjsKLSAgICB1aW50OF90IHNoaWZ0X3R5cGUgPSAoaW5zbiA+PiA1KSAmIDB4MzsKLSAgICB1aW50OF90IHNoaWZ0X2Ftb3VudCA9IChpbnNuID4+IDcpICYgMHgxZjsKLQotICAgIGNvbnN0IGNoYXIgKnNoaWZ0X25hbWUgPSBzaGlmdF9uYW1lc1tzaGlmdF90eXBlXTsKLQotICAgIGlmIChpc19wcmUpIHsKLSAgICAgICAgaWYgKHNoaWZ0X2Ftb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2hpZnRfdHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdHIlZCwgW3IlZCwgJXNyJWRdJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYnl0ZSwgcmQsIHJuLCBtaW51cywgcm0sIGJhbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hpZnRfdHlwZSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXNcdHIlZCwgW3IlZCwgJXNyJWQsIFJSWF0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBieXRlLCByZCwgcm4sIG1pbnVzLCBybSwgYmFuZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoaWZ0X2Ftb3VudCA9IDMyOwotICAgICAgICB9Ci0gICAgICAgIHNwcmludGYocHRyLCAiJXMlcyVzXHRyJWQsIFtyJWQsICVzciVkLCAlcyAjJXVdJXMiLAotICAgICAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIGJ5dGUsIHJkLCBybiwgbWludXMsIHJtLAotICAgICAgICAgICAgICAgIHNoaWZ0X25hbWUsIHNoaWZ0X2Ftb3VudCwgYmFuZyk7Ci0gICAgICAgIHJldHVybiBwdHI7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqdHJhbnNmZXIgPSAiIjsKLSAgICBpZiAod3JpdGVfYmFjaykKLSAgICAgICAgdHJhbnNmZXIgPSAidCI7Ci0KLSAgICBpZiAoc2hpZnRfYW1vdW50ID09IDApIHsKLSAgICAgICAgaWYgKHNoaWZ0X3R5cGUgPT0gMCkgewotICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzJXMlc1x0ciVkLCBbciVkXSwgJXNyJWQiLAotICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBieXRlLCB0cmFuc2ZlciwgcmQsIHJuLCBtaW51cywgcm0pOwotICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hpZnRfdHlwZSA9PSAzKSB7Ci0gICAgICAgICAgICBzcHJpbnRmKHB0ciwgIiVzJXMlcyVzXHRyJWQsIFtyJWRdLCAlc3IlZCwgUlJYIiwKLSAgICAgICAgICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYnl0ZSwgdHJhbnNmZXIsIHJkLCBybiwgbWludXMsIHJtKTsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgc2hpZnRfYW1vdW50ID0gMzI7Ci0gICAgfQotCi0gICAgc3ByaW50ZihwdHIsICIlcyVzJXMlc1x0ciVkLCBbciVkXSwgJXNyJWQsICVzICMldSIsCi0gICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBieXRlLCB0cmFuc2ZlciwgcmQsIHJuLCBtaW51cywgcm0sCi0gICAgICAgICAgICBzaGlmdF9uYW1lLCBzaGlmdF9hbW91bnQpOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX21lbWhhbGYodWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IGlzX2xvYWQgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgdWludDhfdCB3cml0ZV9iYWNrID0gKGluc24gPj4gMjEpICYgMHgxOwotICAgIHVpbnQ4X3QgaXNfaW1tZWQgPSAoaW5zbiA+PiAyMikgJiAweDE7Ci0gICAgdWludDhfdCBpc191cCA9IChpbnNuID4+IDIzKSAmIDB4MTsKLSAgICB1aW50OF90IGlzX3ByZSA9IChpbnNuID4+IDI0KSAmIDB4MTsKLSAgICB1aW50OF90IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotICAgIHVpbnQ4X3QgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0gICAgdWludDhfdCBiaXRzXzY1ID0gKGluc24gPj4gNSkgJiAweDM7Ci0gICAgdWludDhfdCBybSA9IGluc24gJiAweGY7Ci0gICAgdWludDhfdCBvZmZzZXQgPSAoKChpbnNuID4+IDgpICYgMHhmKSA8PCA0KSB8IChpbnNuICYgMHhmKTsKLQotICAgIGNvbnN0IGNoYXIgKm9wbmFtZSA9ICJsZHIiOwotICAgIGlmIChpc19sb2FkID09IDApCi0gICAgICAgIG9wbmFtZSA9ICJzdHIiOwotCi0gICAgY29uc3QgY2hhciAqd2lkdGggPSAiIjsKLSAgICBpZiAoYml0c182NSA9PSAxKQotICAgICAgICB3aWR0aCA9ICJoIjsKLSAgICBlbHNlIGlmIChiaXRzXzY1ID09IDIpCi0gICAgICAgIHdpZHRoID0gInNiIjsKLSAgICBlbHNlCi0gICAgICAgIHdpZHRoID0gInNoIjsKLQotICAgIGNvbnN0IGNoYXIgKmJhbmcgPSAiIjsKLSAgICBpZiAod3JpdGVfYmFjaykKLSAgICAgICAgYmFuZyA9ICIhIjsKLSAgICBjb25zdCBjaGFyICptaW51cyA9ICIiOwotICAgIGlmIChpc191cCA9PSAwKQotICAgICAgICBtaW51cyA9ICItIjsKLQotICAgIGlmIChpc19pbW1lZCkgewotICAgICAgICBpZiAoaXNfcHJlKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHB0ciwgIiVzJXNoXHRyJWQsIFtyJWRdIiwgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgcmQsIHJuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzaFx0ciVkLCBbciVkLCAjJXMldV0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCByZCwgcm4sIG1pbnVzLCBvZmZzZXQsIGJhbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzaFx0ciVkLCBbciVkXSwgIyVzJXUiLAotICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCByZCwgcm4sIG1pbnVzLCBvZmZzZXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdHI7Ci0gICAgfQotCi0gICAgaWYgKGlzX3ByZSkgewotICAgICAgICBzcHJpbnRmKHB0ciwgIiVzJXNoXHRyJWQsIFtyJWQsICVzciVkXSVzIiwKLSAgICAgICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCByZCwgcm4sIG1pbnVzLCBybSwgYmFuZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihwdHIsICIlcyVzaFx0ciVkLCBbciVkXSwgJXNyJWQiLAotICAgICAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIHJkLCBybiwgbWludXMsIHJtKTsKLSAgICB9Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotY2hhciAqQXJtOjpkaXNhc21fbWNyKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCBjcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0gICAgdWludDhfdCBjcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0gICAgdWludDhfdCBjcG51bSA9IChpbnNuID4+IDgpICYgMHhmOwotICAgIHVpbnQ4X3Qgb3Bjb2RlMiA9IChpbnNuID4+IDUpICYgMHg3OwotICAgIHVpbnQ4X3QgY3JtID0gaW5zbiAmIDB4ZjsKLQotICAgIGNvbnN0IGNoYXIgKm9wbmFtZSA9IG9wY29kZV9uYW1lc1tvcGNvZGVdOwotICAgIHNwcmludGYocHRyLCAiJXMlc1x0JWQsIDAsIHIlZCwgY3IlZCwgY3IlZCwgeyVkfSIsCi0gICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBjcG51bSwgY3JkLCBjcm4sIGNybSwgb3Bjb2RlMik7Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotY2hhciAqQXJtOjpkaXNhc21fbWxhKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCByZCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLSAgICB1aW50OF90IHJuID0gKGluc24gPj4gMTIpICYgMHhmOwotICAgIHVpbnQ4X3QgcnMgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKLSAgICB1aW50OF90IHJtID0gaW5zbiAmIDB4ZjsKLSAgICB1aW50OF90IGJpdF9zID0gKGluc24gPj4gMjApICYgMTsKLQotICAgIGNvbnN0IGNoYXIgKm9wbmFtZSA9IG9wY29kZV9uYW1lc1tvcGNvZGVdOwotICAgIHNwcmludGYocHRyLCAiJXMlcyVzXHRyJWQsIHIlZCwgciVkLCByJWQiLAotICAgICAgICAgICAgb3BuYW1lLCBjb25kX3RvX3N0cihjb25kKSwgYml0X3MgPyAicyIgOiAiIiwgcmQsIHJtLCBycywgcm4pOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX3VtbGFsKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCByZGhpID0gKGluc24gPj4gMTYpICYgMHhmOwotICAgIHVpbnQ4X3QgcmRsbyA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLSAgICB1aW50OF90IHJzID0gKGluc24gPj4gOCkgJiAweGY7Ci0gICAgdWludDhfdCBybSA9IGluc24gJiAweGY7Ci0gICAgdWludDhfdCBiaXRfcyA9IChpbnNuID4+IDIwKSAmIDE7Ci0KLSAgICBjb25zdCBjaGFyICpvcG5hbWUgPSBvcGNvZGVfbmFtZXNbb3Bjb2RlXTsKLSAgICBzcHJpbnRmKHB0ciwgIiVzJXMlc1x0ciVkLCByJWQsIHIlZCwgciVkIiwKLSAgICAgICAgICAgIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIGJpdF9zID8gInMiIDogIiIsIHJkbG8sIHJkaGksIHJtLCBycyk7Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotY2hhciAqQXJtOjpkaXNhc21fbXVsKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDhfdCByZCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLSAgICB1aW50OF90IHJzID0gKGluc24gPj4gOCkgJiAweGY7Ci0gICAgdWludDhfdCBybSA9IGluc24gJiAweGY7Ci0gICAgdWludDhfdCBiaXRfcyA9IChpbnNuID4+IDIwKSAmIDE7Ci0KLSAgICBjb25zdCBjaGFyICpvcG5hbWUgPSBvcGNvZGVfbmFtZXNbb3Bjb2RlXTsKLSAgICBzcHJpbnRmKHB0ciwgIiVzJXMlc1x0ciVkLCByJWQsIHIlZCIsCi0gICAgICAgICAgICBvcG5hbWUsIGNvbmRfdG9fc3RyKGNvbmQpLCBiaXRfcyA/ICJzIiA6ICIiLCByZCwgcm0sIHJzKTsKLSAgICByZXR1cm4gcHRyOwotfQotCi1jaGFyICpBcm06OmRpc2FzbV9tcnModWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotICAgIHVpbnQ4X3QgcHMgPSAoaW5zbiA+PiAyMikgJiAxOwotCi0gICAgc3ByaW50ZihwdHIsICJtcnMlc1x0ciVkLCAlcyIsIGNvbmRfdG9fc3RyKGNvbmQpLCByZCwgcHMgPyAic3BzciIgOiAiY3BzciIpOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX21zcih1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpCi17Ci0gICAgY2hhciBmbGFnc1s4XTsKLSAgICBpbnQgZmxhZ19pbmRleCA9IDA7Ci0gICAgdWludDhfdCBjb25kID0gKGluc24gPj4gMjgpICYgMHhmOwotICAgIHVpbnQ4X3QgaXNfaW1tZWQgPSAoaW5zbiA+PiAyNSkgJiAweDE7Ci0gICAgdWludDhfdCBwZCA9IChpbnNuID4+IDIyKSAmIDE7Ci0gICAgdWludDhfdCBtYXNrID0gKGluc24gPj4gMTYpICYgMHhmOwotCi0gICAgaWYgKG1hc2sgJiAxKQotICAgICAgICBmbGFnc1tmbGFnX2luZGV4KytdID0gJ2MnOwotICAgIGlmIChtYXNrICYgMikKLSAgICAgICAgZmxhZ3NbZmxhZ19pbmRleCsrXSA9ICd4JzsKLSAgICBpZiAobWFzayAmIDQpCi0gICAgICAgIGZsYWdzW2ZsYWdfaW5kZXgrK10gPSAncyc7Ci0gICAgaWYgKG1hc2sgJiA4KQotICAgICAgICBmbGFnc1tmbGFnX2luZGV4KytdID0gJ2YnOwotICAgIGZsYWdzW2ZsYWdfaW5kZXhdID0gMDsKLQotICAgIGlmIChpc19pbW1lZCkgewotICAgICAgICB1aW50MzJfdCBpbW1lZCA9IGluc24gJiAweGZmOwotICAgICAgICB1aW50OF90IHJvdGF0ZSA9IChpbnNuID4+IDgpICYgMHhmOwotICAgICAgICB1aW50OF90IHJvdGF0ZTIgPSByb3RhdGUgPDwgMTsKLSAgICAgICAgdWludDMyX3Qgcm90YXRlZF92YWwgPSAoaW1tZWQgPj4gcm90YXRlMikgfCAoaW1tZWQgPDwgKDMyIC0gcm90YXRlMikpOwotICAgICAgICBzcHJpbnRmKHB0ciwgIm1zciVzXHQlc18lcywgIzB4JXgiLAotICAgICAgICAgICAgICAgIGNvbmRfdG9fc3RyKGNvbmQpLCBwZCA/ICJzcHNyIiA6ICJjcHNyIiwgZmxhZ3MsIHJvdGF0ZWRfdmFsKTsKLSAgICAgICAgcmV0dXJuIHB0cjsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJtID0gaW5zbiAmIDB4ZjsKLQotICAgIHNwcmludGYocHRyLCAibXNyJXNcdCVzXyVzLCByJWQiLAotICAgICAgICAgICAgY29uZF90b19zdHIoY29uZCksIHBkID8gInNwc3IiIDogImNwc3IiLCBmbGFncywgcm0pOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLWNoYXIgKkFybTo6ZGlzYXNtX3BsZCh1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpCi17Ci0gICAgdWludDhfdCBpc19yZWcgPSAoaW5zbiA+PiAyNSkgJiAweDE7Ci0gICAgdWludDhfdCBpc191cCA9IChpbnNuID4+IDIzKSAmIDB4MTsKLSAgICB1aW50OF90IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotCi0gICAgY29uc3QgY2hhciAqbWludXMgPSAiIjsKLSAgICBpZiAoaXNfdXAgPT0gMCkKLSAgICAgICAgbWludXMgPSAiLSI7Ci0KLSAgICBpZiAoaXNfcmVnKSB7Ci0gICAgICAgIHVpbnQ4X3Qgcm0gPSBpbnNuICYgMHhmOwotICAgICAgICBzcHJpbnRmKHB0ciwgInBsZFx0W3IlZCwgJXNyJWRdIiwgcm4sIG1pbnVzLCBybSk7Ci0gICAgICAgIHJldHVybiBwdHI7Ci0gICAgfQotCi0gICAgdWludDE2X3Qgb2Zmc2V0ID0gaW5zbiAmIDB4ZmZmOwotICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICBzcHJpbnRmKHB0ciwgInBsZFx0W3IlZF0iLCBybik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihwdHIsICJwbGRcdFtyJWQsICMlcyV1XSIsIHJuLCBtaW51cywgb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotY2hhciAqQXJtOjpkaXNhc21fc3dpKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cikKLXsKLSAgICB1aW50OF90IGNvbmQgPSAoaW5zbiA+PiAyOCkgJiAweGY7Ci0gICAgdWludDMyX3Qgc3lzbnVtID0gaW5zbiAmIDB4MDBmZmZmZmY7Ci0KLSAgICBzcHJpbnRmKHB0ciwgInN3aSVzIDB4JXgiLCBjb25kX3RvX3N0cihjb25kKSwgc3lzbnVtKTsKLSAgICByZXR1cm4gcHRyOwotfQotCi1jaGFyICpBcm06OmRpc2FzbV9zd3AoT3Bjb2RlIG9wY29kZSwgdWludDMyX3QgaW5zbiwgY2hhciAqcHRyKQotewotICAgIHVpbnQ4X3QgY29uZCA9IChpbnNuID4+IDI4KSAmIDB4ZjsKLSAgICB1aW50OF90IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotICAgIHVpbnQ4X3QgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0gICAgdWludDhfdCBybSA9IGluc24gJiAweGY7Ci0KLSAgICBjb25zdCBjaGFyICpvcG5hbWUgPSBvcGNvZGVfbmFtZXNbb3Bjb2RlXTsKLSAgICBzcHJpbnRmKHB0ciwgIiVzJXNcdHIlZCwgciVkLCBbciVkXSIsIG9wbmFtZSwgY29uZF90b19zdHIoY29uZCksIHJkLCBybSwgcm4pOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLU9wY29kZSBBcm06OmRlY29kZSh1aW50MzJfdCBpbnNuKSB7Ci0gICAgdWludDMyX3QgYml0czI3XzI2ID0gKGluc24gPj4gMjYpICYgMHgzOwotICAgIHN3aXRjaCAoYml0czI3XzI2KSB7Ci0gICAgICAgIGNhc2UgMHgwOgotICAgICAgICAgICAgcmV0dXJuIGRlY29kZTAwKGluc24pOwotICAgICAgICBjYXNlIDB4MToKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGUwMShpbnNuKTsKLSAgICAgICAgY2FzZSAweDI6Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlMTAoaW5zbik7Ci0gICAgICAgIGNhc2UgMHgzOgotICAgICAgICAgICAgcmV0dXJuIGRlY29kZTExKGluc24pOwotICAgIH0KLSAgICByZXR1cm4gT1BfSU5WQUxJRDsKLX0KLQotT3Bjb2RlIEFybTo6ZGVjb2RlMDAodWludDMyX3QgaW5zbikgewotICAgIHVpbnQ4X3QgYml0MjUgPSAoaW5zbiA+PiAyNSkgJiAweDE7Ci0gICAgdWludDhfdCBiaXQ0ID0gKGluc24gPj4gNCkgJiAweDE7Ci0gICAgaWYgKGJpdDI1ID09IDAgJiYgYml0NCA9PSAxKSB7Ci0gICAgICAgIGlmICgoaW5zbiAmIDB4MGZmZmZmZjApID09IDB4MDEyZmZmMTApIHsKLSAgICAgICAgICAgIC8vIEJ4IGluc3RydWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gT1BfQlg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChpbnNuICYgMHgwZmYwMDBmMCkgPT0gMHgwMTYwMDAxMCkgewotICAgICAgICAgICAgLy8gQ2x6IGluc3RydWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gT1BfQ0xaOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoaW5zbiAmIDB4ZmZmMDAwZjApID09IDB4ZTEyMDAwNzApIHsKLSAgICAgICAgICAgIC8vIEJrcHQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgIHJldHVybiBPUF9CS1BUOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IGJpdHM3XzQgPSAoaW5zbiA+PiA0KSAmIDB4ZjsKLSAgICAgICAgaWYgKGJpdHM3XzQgPT0gMHg5KSB7Ci0gICAgICAgICAgICBpZiAoKGluc24gJiAweDBmZjAwZmYwKSA9PSAweDAxMDAwMDkwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3dwIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgICAgdWludDhfdCBiaXQyMiA9IChpbnNuID4+IDIyKSAmIDB4MTsKLSAgICAgICAgICAgICAgICBpZiAoYml0MjIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPUF9TV1BCOwotICAgICAgICAgICAgICAgIHJldHVybiBPUF9TV1A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmUgb2YgdGhlIG11bHRpcGx5IGluc3RydWN0aW9ucwotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9tdWwoaW5zbik7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90IGJpdDcgPSAoaW5zbiA+PiA3KSAmIDB4MTsKLSAgICAgICAgaWYgKGJpdDcgPT0gMSkgewotICAgICAgICAgICAgLy8gT25lIG9mIHRoZSBsb2FkL3N0b3JlIGhhbGZ3b3JkL2J5dGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX2xkcmgoaW5zbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPbmUgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLSAgICByZXR1cm4gZGVjb2RlX2FsdShpbnNuKTsKLX0KLQotT3Bjb2RlIEFybTo6ZGVjb2RlMDEodWludDMyX3QgaW5zbikgewotICAgIHVpbnQ4X3QgaXNfcmVnID0gKGluc24gPj4gMjUpICYgMHgxOwotICAgIHVpbnQ4X3QgYml0NCA9IChpbnNuID4+IDQpICYgMHgxOwotICAgIGlmIChpc19yZWcgPT0gMSAmJiBiaXQ0ID09IDEpCi0gICAgICAgIHJldHVybiBPUF9VTkRFRklORUQ7Ci0gICAgdWludDhfdCBpc19sb2FkID0gKGluc24gPj4gMjApICYgMHgxOwotICAgIHVpbnQ4X3QgaXNfYnl0ZSA9IChpbnNuID4+IDIyKSAmIDB4MTsKLSAgICBpZiAoKGluc24gJiAweGZkNzBmMDAwKSA9PSAweGY1NTBmMDAwKSB7Ci0gICAgICAgIC8vIFByZS1sb2FkCi0gICAgICAgIHJldHVybiBPUF9QTEQ7Ci0gICAgfQotICAgIGlmIChpc19sb2FkKSB7Ci0gICAgICAgIGlmIChpc19ieXRlKSB7Ci0gICAgICAgICAgICAvLyBMb2FkIGJ5dGUKLSAgICAgICAgICAgIHJldHVybiBPUF9MRFJCOwotICAgICAgICB9Ci0gICAgICAgIC8vIExvYWQgd29yZAotICAgICAgICByZXR1cm4gT1BfTERSOwotICAgIH0KLSAgICBpZiAoaXNfYnl0ZSkgewotICAgICAgICAvLyBTdG9yZSBieXRlCi0gICAgICAgIHJldHVybiBPUF9TVFJCOwotICAgIH0KLSAgICAvLyBTdG9yZSB3b3JkCi0gICAgcmV0dXJuIE9QX1NUUjsKLX0KLQotT3Bjb2RlIEFybTo6ZGVjb2RlMTAodWludDMyX3QgaW5zbikgewotICAgIHVpbnQ4X3QgYml0MjUgPSAoaW5zbiA+PiAyNSkgJiAweDE7Ci0gICAgaWYgKGJpdDI1ID09IDApIHsKLSAgICAgICAgLy8gTERNL1NUTQotICAgICAgICB1aW50OF90IGlzX2xvYWQgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgICAgIGlmIChpc19sb2FkKQotICAgICAgICAgICAgcmV0dXJuIE9QX0xETTsKLSAgICAgICAgcmV0dXJuIE9QX1NUTTsKLSAgICB9Ci0gICAgLy8gQnJhbmNoIG9yIEJyYW5jaCB3aXRoIGxpbmsKLSAgICB1aW50OF90IGlzX2xpbmsgPSAoaW5zbiA+PiAyNCkgJiAxOwotICAgIHVpbnQzMl90IG9mZnNldCA9IGluc24gJiAweGZmZmZmZjsKLQotICAgIC8vIFNpZ24tZXh0ZW5kIHRoZSAyNC1iaXQgb2Zmc2V0Ci0gICAgaWYgKChvZmZzZXQgPj4gMjMpICYgMSkKLSAgICAgICAgb2Zmc2V0IHw9IDB4ZmYwMDAwMDA7Ci0KLSAgICAvLyBQcmUtY29tcHV0ZSB0aGUgbGVmdC1zaGlmdCBhbmQgdGhlIHByZWZldGNoIG9mZnNldAotICAgIG9mZnNldCA8PD0gMjsKLSAgICBvZmZzZXQgKz0gODsKLSAgICBpZiAoaXNfbGluayA9PSAwKQotICAgICAgICByZXR1cm4gT1BfQjsKLSAgICByZXR1cm4gT1BfQkw7Ci19Ci0KLU9wY29kZSBBcm06OmRlY29kZTExKHVpbnQzMl90IGluc24pIHsKLSAgICB1aW50OF90IGJpdDI1ID0gKGluc24gPj4gMjUpICYgMHgxOwotICAgIGlmIChiaXQyNSA9PSAwKSB7Ci0gICAgICAgIC8vIExEQywgU0RDCi0gICAgICAgIHVpbnQ4X3QgaXNfbG9hZCA9IChpbnNuID4+IDIwKSAmIDB4MTsKLSAgICAgICAgaWYgKGlzX2xvYWQpIHsKLSAgICAgICAgICAgIC8vIExEQwotICAgICAgICAgICAgcmV0dXJuIE9QX0xEQzsKLSAgICAgICAgfQotICAgICAgICAvLyBTVEMKLSAgICAgICAgcmV0dXJuIE9QX1NUQzsKLSAgICB9Ci0KLSAgICB1aW50OF90IGJpdDI0ID0gKGluc24gPj4gMjQpICYgMHgxOwotICAgIGlmIChiaXQyNCA9PSAweDEpIHsKLSAgICAgICAgLy8gU1dJCi0gICAgICAgIHJldHVybiBPUF9TV0k7Ci0gICAgfQotICAKLSAgICB1aW50OF90IGJpdDQgPSAoaW5zbiA+PiA0KSAmIDB4MTsKLSAgICB1aW50OF90IGNwbnVtID0gKGluc24gPj4gOCkgJiAweGY7Ci0KLSAgICBpZiAoY3BudW0gPT0gMTUpIHsKLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBjb3Byb2Nlc3NvciAxNQotICAgICAgICB1aW50OF90IG9wY29kZSA9IChpbnNuID4+IDIxKSAmIDB4NzsKLSAgICAgICAgaWYgKGJpdDQgPT0gMCB8fCBvcGNvZGUgIT0gMCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiB1bmV4cGVjdGVkIGJpdCBwYXR0ZXJuLiAgQ3JlYXRlIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gaW4gY2FzZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQuCi0gICAgICAgICAgICByZXR1cm4gT1BfVU5ERUZJTkVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTVJDLCBNQ1IKLSAgICAgICAgdWludDhfdCBpc19tcmMgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgICAgIGlmIChpc19tcmMpCi0gICAgICAgICAgICByZXR1cm4gT1BfTVJDOwotICAgICAgICByZXR1cm4gT1BfTUNSOwotICAgIH0KLQotICAgIGlmIChiaXQ0ID09IDApIHsKLSAgICAgICAgLy8gQ0RQCi0gICAgICAgIHJldHVybiBPUF9DRFA7Ci0gICAgfQotICAgIC8vIE1SQywgTUNSCi0gICAgdWludDhfdCBpc19tcmMgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgaWYgKGlzX21yYykKLSAgICAgICAgcmV0dXJuIE9QX01SQzsKLSAgICByZXR1cm4gT1BfTUNSOwotfQotCi1PcGNvZGUgQXJtOjpkZWNvZGVfbXVsKHVpbnQzMl90IGluc24pIHsKLSAgICB1aW50OF90IGJpdDI0ID0gKGluc24gPj4gMjQpICYgMHgxOwotICAgIGlmIChiaXQyNCAhPSAwKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYW4gdW5leHBlY3RlZCBiaXQgcGF0dGVybi4gIENyZWF0ZSBhbiB1bmRlZmluZWQKLSAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gaW4gY2FzZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQuCi0gICAgICAgIHJldHVybiBPUF9VTkRFRklORUQ7Ci0gICAgfQotICAgIHVpbnQ4X3QgYml0MjMgPSAoaW5zbiA+PiAyMykgJiAweDE7Ci0gICAgdWludDhfdCBiaXQyMl9VID0gKGluc24gPj4gMjIpICYgMHgxOwotICAgIHVpbnQ4X3QgYml0MjFfQSA9IChpbnNuID4+IDIxKSAmIDB4MTsKLSAgICBpZiAoYml0MjMgPT0gMCkgewotICAgICAgICAvLyAzMi1iaXQgbXVsdGlwbHkKLSAgICAgICAgaWYgKGJpdDIyX1UgIT0gMCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiB1bmV4cGVjdGVkIGJpdCBwYXR0ZXJuLiAgQ3JlYXRlIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gaW4gY2FzZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQuCi0gICAgICAgICAgICByZXR1cm4gT1BfVU5ERUZJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaXQyMV9BID09IDApCi0gICAgICAgICAgICByZXR1cm4gT1BfTVVMOwotICAgICAgICByZXR1cm4gT1BfTUxBOwotICAgIH0KLSAgICAvLyA2NC1iaXQgbXVsdGlwbHkKLSAgICBpZiAoYml0MjJfVSA9PSAwKSB7Ci0gICAgICAgIC8vIFVuc2lnbmVkIG11bHRpcGx5IGxvbmcKLSAgICAgICAgaWYgKGJpdDIxX0EgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBPUF9VTVVMTDsKLSAgICAgICAgcmV0dXJuIE9QX1VNTEFMOwotICAgIH0KLSAgICAvLyBTaWduZWQgbXVsdGlwbHkgbG9uZwotICAgIGlmIChiaXQyMV9BID09IDApCi0gICAgICAgIHJldHVybiBPUF9TTVVMTDsKLSAgICByZXR1cm4gT1BfU01MQUw7Ci19Ci0KLU9wY29kZSBBcm06OmRlY29kZV9sZHJoKHVpbnQzMl90IGluc24pIHsKLSAgICB1aW50OF90IGlzX2xvYWQgPSAoaW5zbiA+PiAyMCkgJiAweDE7Ci0gICAgdWludDhfdCBiaXRzXzY1ID0gKGluc24gPj4gNSkgJiAweDM7Ci0gICAgaWYgKGlzX2xvYWQpIHsKLSAgICAgICAgaWYgKGJpdHNfNjUgPT0gMHgxKSB7Ci0gICAgICAgICAgICAvLyBMb2FkIHVuc2lnbmVkIGhhbGZ3b3JkCi0gICAgICAgICAgICByZXR1cm4gT1BfTERSSDsKLSAgICAgICAgfSBlbHNlIGlmIChiaXRzXzY1ID09IDB4MikgewotICAgICAgICAgICAgLy8gTG9hZCBzaWduZWQgYnl0ZQotICAgICAgICAgICAgcmV0dXJuIE9QX0xEUlNCOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNpZ25lZCBoYWxmd29yZAotICAgICAgICBpZiAoYml0c182NSAhPSAweDMpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gdW5leHBlY3RlZCBiaXQgcGF0dGVybi4gIENyZWF0ZSBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9uIGluIGNhc2UgdGhpcyBpcyBldmVyIGV4ZWN1dGVkLgotICAgICAgICAgICAgcmV0dXJuIE9QX1VOREVGSU5FRDsKLSAgICAgICAgfQotICAgICAgICAvLyBMb2FkIHNpZ25lZCBoYWxmd29yZAotICAgICAgICByZXR1cm4gT1BfTERSU0g7Ci0gICAgfQotICAgIC8vIFN0b3JlIGhhbGZ3b3JkCi0gICAgaWYgKGJpdHNfNjUgIT0gMHgxKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYW4gdW5leHBlY3RlZCBiaXQgcGF0dGVybi4gIENyZWF0ZSBhbiB1bmRlZmluZWQKLSAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gaW4gY2FzZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQuCi0gICAgICAgIHJldHVybiBPUF9VTkRFRklORUQ7Ci0gICAgfQotICAgIC8vIFN0b3JlIGhhbGZ3b3JkCi0gICAgcmV0dXJuIE9QX1NUUkg7Ci19Ci0KLU9wY29kZSBBcm06OmRlY29kZV9hbHUodWludDMyX3QgaW5zbikgewotICAgIHVpbnQ4X3QgaXNfaW1tZWQgPSAoaW5zbiA+PiAyNSkgJiAweDE7Ci0gICAgdWludDhfdCBvcGNvZGUgPSAoaW5zbiA+PiAyMSkgJiAweGY7Ci0gICAgdWludDhfdCBiaXRfcyA9IChpbnNuID4+IDIwKSAmIDE7Ci0gICAgdWludDhfdCBzaGlmdF9pc19yZWcgPSAoaW5zbiA+PiA0KSAmIDE7Ci0gICAgdWludDhfdCBiaXQ3ID0gKGluc24gPj4gNykgJiAxOwotICAgIGlmICghaXNfaW1tZWQgJiYgc2hpZnRfaXNfcmVnICYmIChiaXQ3ICE9IDApKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYW4gdW5leHBlY3RlZCBiaXQgcGF0dGVybi4gIENyZWF0ZSBhbiB1bmRlZmluZWQKLSAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gaW4gY2FzZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQuCi0gICAgICAgIHJldHVybiBPUF9VTkRFRklORUQ7Ci0gICAgfQotICAgIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgICAgIGNhc2UgMHgwOgotICAgICAgICAgICAgcmV0dXJuIE9QX0FORDsKLSAgICAgICAgY2FzZSAweDE6Ci0gICAgICAgICAgICByZXR1cm4gT1BfRU9SOwotICAgICAgICBjYXNlIDB4MjoKLSAgICAgICAgICAgIHJldHVybiBPUF9TVUI7Ci0gICAgICAgIGNhc2UgMHgzOgotICAgICAgICAgICAgcmV0dXJuIE9QX1JTQjsKLSAgICAgICAgY2FzZSAweDQ6Ci0gICAgICAgICAgICByZXR1cm4gT1BfQUREOwotICAgICAgICBjYXNlIDB4NToKLSAgICAgICAgICAgIHJldHVybiBPUF9BREM7Ci0gICAgICAgIGNhc2UgMHg2OgotICAgICAgICAgICAgcmV0dXJuIE9QX1NCQzsKLSAgICAgICAgY2FzZSAweDc6Ci0gICAgICAgICAgICByZXR1cm4gT1BfUlNDOwotICAgICAgICBjYXNlIDB4ODoKLSAgICAgICAgICAgIGlmIChiaXRfcykKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BfVFNUOwotICAgICAgICAgICAgcmV0dXJuIE9QX01SUzsKLSAgICAgICAgY2FzZSAweDk6Ci0gICAgICAgICAgICBpZiAoYml0X3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QX1RFUTsKLSAgICAgICAgICAgIHJldHVybiBPUF9NU1I7Ci0gICAgICAgIGNhc2UgMHhhOgotICAgICAgICAgICAgaWYgKGJpdF9zKQotICAgICAgICAgICAgICAgIHJldHVybiBPUF9DTVA7Ci0gICAgICAgICAgICByZXR1cm4gT1BfTVJTOwotICAgICAgICBjYXNlIDB4YjoKLSAgICAgICAgICAgIGlmIChiaXRfcykKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BfQ01OOwotICAgICAgICAgICAgcmV0dXJuIE9QX01TUjsKLSAgICAgICAgY2FzZSAweGM6Ci0gICAgICAgICAgICByZXR1cm4gT1BfT1JSOwotICAgICAgICBjYXNlIDB4ZDoKLSAgICAgICAgICAgIHJldHVybiBPUF9NT1Y7Ci0gICAgICAgIGNhc2UgMHhlOgotICAgICAgICAgICAgcmV0dXJuIE9QX0JJQzsKLSAgICAgICAgY2FzZSAweGY6Ci0gICAgICAgICAgICByZXR1cm4gT1BfTVZOOwotICAgIH0KLSAgICAvLyBVbnJlYWNoYWJsZQotICAgIHJldHVybiBPUF9JTlZBTElEOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2FybWRpcy5oIGIvZW11bGF0b3IvcXRvb2xzL2FybWRpcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzBmODMzLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9hcm1kaXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBBUk1ESVNfSAotI2RlZmluZSBBUk1ESVNfSAotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJvcGNvZGUuaCIKLQotY2xhc3MgQXJtIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjaGFyICpkaXNhc20odWludDMyX3QgYWRkciwgdWludDMyX3QgaW5zbiwgY2hhciAqYnVmZmVyKTsKLSAgc3RhdGljIE9wY29kZSBkZWNvZGUodWludDMyX3QgaW5zbik7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgT3Bjb2RlIGRlY29kZTAwKHVpbnQzMl90IGluc24pOwotICBzdGF0aWMgT3Bjb2RlIGRlY29kZTAxKHVpbnQzMl90IGluc24pOwotICBzdGF0aWMgT3Bjb2RlIGRlY29kZTEwKHVpbnQzMl90IGluc24pOwotICBzdGF0aWMgT3Bjb2RlIGRlY29kZTExKHVpbnQzMl90IGluc24pOwotICBzdGF0aWMgT3Bjb2RlIGRlY29kZV9tdWwodWludDMyX3QgaW5zbik7Ci0gIHN0YXRpYyBPcGNvZGUgZGVjb2RlX2xkcmgodWludDMyX3QgaW5zbik7Ci0gIHN0YXRpYyBPcGNvZGUgZGVjb2RlX2FsdSh1aW50MzJfdCBpbnNuKTsKLQotICBzdGF0aWMgY2hhciAqZGlzYXNtX2FsdShPcGNvZGUgb3Bjb2RlLCB1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX2JyYW5jaCh1aW50MzJfdCBhZGRyLCBPcGNvZGUgb3Bjb2RlLCB1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX2J4KHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fYmtwdCh1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX2Nseih1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX21lbWJsb2NrKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fbWVtKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fbWVtaGFsZih1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX21jcihPcGNvZGUgb3Bjb2RlLCB1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX21sYShPcGNvZGUgb3Bjb2RlLCB1aW50MzJfdCBpbnNuLCBjaGFyICpwdHIpOwotICBzdGF0aWMgY2hhciAqZGlzYXNtX3VtbGFsKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fbXVsKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fbXJzKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fbXNyKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fcGxkKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fc3dpKHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci0gIHN0YXRpYyBjaGFyICpkaXNhc21fc3dwKE9wY29kZSBvcGNvZGUsIHVpbnQzMl90IGluc24sIGNoYXIgKnB0cik7Ci19OwotCi1leHRlcm4gY2hhciAqZGlzYXNtX2luc25fdGh1bWIodWludDMyX3QgcGMsIHVpbnQzMl90IGluc24xLCB1aW50MzJfdCBpbnNuMiwgY2hhciAqcmVzdWx0KTsKLWV4dGVybiBPcGNvZGUgZGVjb2RlX2luc25fdGh1bWIodWludDMyX3QgZ2l2ZW4pOwotCi0jZW5kaWYgLyogQVJNRElTX0ggKi8KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9iYjJzeW0uY3BwIGIvZW11bGF0b3IvcXRvb2xzL2JiMnN5bS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMThiNjcuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2JiMnN5bS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXI8PiBUcmFjZVJlYWRlclR5cGU7Ci0KLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLWlubC5oIgotCi1zdHJ1Y3QgTXlTdGF0aWNSZWMgewotICAgIFN0YXRpY1JlYyAgIGJiOwotICAgIHN5bWJvbF90eXBlICpzeW07Ci0gICAgTXlTdGF0aWNSZWMgKmlubmVyOyAgICAvLyBwb2ludGVyIHRvIGFuIGlubmVyIGJhc2ljIGJsb2NrCi0gICAgaW50ICAgICAgICAgaXNfdGh1bWI7Ci19OwotCi1NeVN0YXRpY1JlYyAqKmFzc2lnbl9pbm5lcl9ibG9ja3MoaW50IG51bV9ibG9ja3MsIE15U3RhdGljUmVjICpibG9ja3MpOwotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHRyYWNlX2ZpbGUgZWxmX2ZpbGVcbiIsIHByb2dyYW0pOwotICAgIE9wdGlvbnNVc2FnZSgpOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHF1aWNrc29ydCB0byBjb21wYXJlIGFkZHJlc3NlcyBvZiBiYXNpYwotLy8gYmxvY2tzLgotaW50IGNtcF9pbmNfYWRkcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgTXlTdGF0aWNSZWMgKmJiMSwgKmJiMjsKLQotICAgIGJiMSA9ICooTXlTdGF0aWNSZWMqKilhOwotICAgIGJiMiA9ICooTXlTdGF0aWNSZWMqKiliOwotICAgIGlmIChiYjEtPmJiLmJiX2FkZHIgPCBiYjItPmJiLmJiX2FkZHIpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoYmIxLT5iYi5iYl9hZGRyID4gYmIyLT5iYi5iYl9hZGRyKQotICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gYmIxLT5iYi5iYl9udW0gLSBiYjItPmJiLmJiX251bTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgdWludDMyX3QgaW5zbnNba01heEluc25QZXJCQl07Ci0KLSAgICAvLyBQYXJzZSB0aGUgb3B0aW9ucwotICAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoYXJnYyAtIG9wdGluZCAhPSAyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgY2hhciAqZWxmX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBUcmFjZVJlYWRlcjw+ICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlcjw+OwotICAgIHRyYWNlLT5PcGVuKHRyYWNlX2ZpbGVuYW1lKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgVHJhY2VIZWFkZXIgKmhlYWRlciA9IHRyYWNlLT5HZXRIZWFkZXIoKTsKLSAgICB1aW50MzJfdCBudW1fc3RhdGljX2JiID0gaGVhZGVyLT5udW1fc3RhdGljX2JiOwotCi0gICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgc3RhdGljIGJsb2NrcwotICAgIE15U3RhdGljUmVjICpibG9ja3MgPSBuZXcgTXlTdGF0aWNSZWNbbnVtX3N0YXRpY19iYl07Ci0KLSAgICAvLyBSZWFkIGluIGFsbCB0aGUgc3RhdGljIGJsb2NrcwotICAgIGZvciAodWludDMyX3QgaWkgPSAwOyBpaSA8IG51bV9zdGF0aWNfYmI7ICsraWkpIHsKLSAgICAgICAgdHJhY2UtPlJlYWRTdGF0aWMoJmJsb2Nrc1tpaV0uYmIpOwotICAgICAgICBibG9ja3NbaWldLmlzX3RodW1iID0gYmxvY2tzW2lpXS5iYi5iYl9hZGRyICYgMTsKLSAgICAgICAgYmxvY2tzW2lpXS5iYi5iYl9hZGRyICY9IH4xOwotICAgICAgICBibG9ja3NbaWldLnN5bSA9IE5VTEw7Ci0gICAgICAgIGJsb2Nrc1tpaV0uaW5uZXIgPSBOVUxMOwotICAgICAgICB0cmFjZS0+UmVhZFN0YXRpY0luc25zKGJsb2Nrc1tpaV0uYmIubnVtX2luc25zLCBpbnNucyk7Ci0gICAgfQotCi0gICAgTXlTdGF0aWNSZWMgKipzb3J0ZWQgPSBhc3NpZ25faW5uZXJfYmxvY2tzKG51bV9zdGF0aWNfYmIsIGJsb2Nrcyk7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBzeW1ib2xfdHlwZSAqc3ltOwotICAgICAgICBCQkV2ZW50IGV2ZW50OwotICAgICAgICBCQkV2ZW50IGlnbm9yZWQ7Ci0KLSAgICAgICAgaWYgKEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmc3ltKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHVpbnQ2NF90IGJiX251bSA9IGV2ZW50LmJiX251bTsKLSAgICAgICAgYmxvY2tzW2JiX251bV0uc3ltID0gc3ltOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJpbnRmKCIjICAgICBiYiBudW1faW5zbnMgICAgIGJiX2FkZHIgZmlsZSAgc3ltYm9sXG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGlpID0gMDsgaWkgPCBudW1fc3RhdGljX2JiOyArK2lpKSB7Ci0gICAgICAgIGlmIChzb3J0ZWRbaWldLT5iYi5iYl9hZGRyID09IDAgfHwgc29ydGVkW2lpXS0+YmIubnVtX2luc25zID09IDAKLSAgICAgICAgICAgIHx8IHNvcnRlZFtpaV0tPnN5bSA9PSBOVUxMKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgcHJpbnRmKCIlOGxsZCAgICAgICAlM2QgIDB4JTA4eCAlcyAlc1xuIiwKLSAgICAgICAgICAgICAgIHNvcnRlZFtpaV0tPmJiLmJiX251bSwgc29ydGVkW2lpXS0+YmIubnVtX2luc25zLAotICAgICAgICAgICAgICAgc29ydGVkW2lpXS0+YmIuYmJfYWRkciwgc29ydGVkW2lpXS0+c3ltLT5yZWdpb24tPnBhdGgsCi0gICAgICAgICAgICAgICBzb3J0ZWRbaWldLT5zeW0tPm5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gRmluZCB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgYXJlIHN1YnNldHMgb2Ygb3RoZXIgYmFzaWMgYmxvY2tzLgotTXlTdGF0aWNSZWMgKiphc3NpZ25faW5uZXJfYmxvY2tzKGludCBudW1fYmxvY2tzLCBNeVN0YXRpY1JlYyAqYmxvY2tzKQotewotICAgIGludCBpaTsKLSAgICB1aW50MzJfdCBhZGRyX2VuZCwgYWRkcl9kaWZmOwotCi0gICAgLy8gQ3JlYXRlIGEgbGlzdCBvZiBwb2ludGVycyB0byB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgd2UgY2FuIHNvcnQuCi0gICAgTXlTdGF0aWNSZWMgKipzb3J0ZWQgPSBuZXcgTXlTdGF0aWNSZWMqW251bV9ibG9ja3NdOwotICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9ibG9ja3M7ICsraWkpIHsKLSAgICAgICAgc29ydGVkW2lpXSA9ICZibG9ja3NbaWldOwotICAgIH0KLQotICAgIC8vIFNvcnQgdGhlIGJhc2ljIGJsb2NrcyBpbnRvIGluY3JlYXNpbmcgYWRkcmVzcyBvcmRlcgotICAgIHFzb3J0KHNvcnRlZCwgbnVtX2Jsb2Nrcywgc2l6ZW9mKE15U3RhdGljUmVjKiksIGNtcF9pbmNfYWRkcik7Ci0KLSAgICAvLyBDcmVhdGUgcG9pbnRlcnMgdG8gaW5uZXIgYmxvY2tzIGFuZCBicmVhayB1cCB0aGUgZW5jbG9zaW5nIGJsb2NrCi0gICAgLy8gc28gdGhhdCB0aGVyZSBpcyBubyBvdmVybGFwLgotICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9ibG9ja3MgLSAxOyArK2lpKSB7Ci0gICAgICAgIGludCBudW1fYnl0ZXM7Ci0gICAgICAgIGlmIChzb3J0ZWRbaWldLT5pc190aHVtYikKLSAgICAgICAgICAgIG51bV9ieXRlcyA9IHNvcnRlZFtpaV0tPmJiLm51bV9pbnNucyA8PCAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBudW1fYnl0ZXMgPSBzb3J0ZWRbaWldLT5iYi5udW1faW5zbnMgPDwgMjsKLSAgICAgICAgYWRkcl9lbmQgPSBzb3J0ZWRbaWldLT5iYi5iYl9hZGRyICsgbnVtX2J5dGVzOwotICAgICAgICBpZiAoYWRkcl9lbmQgPiBzb3J0ZWRbaWkgKyAxXS0+YmIuYmJfYWRkcikgewotICAgICAgICAgICAgc29ydGVkW2lpXS0+aW5uZXIgPSBzb3J0ZWRbaWkgKyAxXTsKLSAgICAgICAgICAgIGFkZHJfZGlmZiA9IHNvcnRlZFtpaSArIDFdLT5iYi5iYl9hZGRyIC0gc29ydGVkW2lpXS0+YmIuYmJfYWRkcjsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bV9pbnNuczsKLSAgICAgICAgICAgIGlmIChzb3J0ZWRbaWldLT5pc190aHVtYikKLSAgICAgICAgICAgICAgICBudW1faW5zbnMgPSBhZGRyX2RpZmYgPj4gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBudW1faW5zbnMgPSBhZGRyX2RpZmYgPj4gMjsKLSAgICAgICAgICAgIHNvcnRlZFtpaV0tPmJiLm51bV9pbnNucyA9IG51bV9pbnNuczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzb3J0ZWQ7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvYmJfZHVtcC5jcHAgYi9lbXVsYXRvci9xdG9vbHMvYmJfZHVtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjQxZmIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2JiX2R1bXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXI8PiBUcmFjZVJlYWRlclR5cGU7Ci0KLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLWlubC5oIgotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHRyYWNlX2ZpbGUgZWxmX2ZpbGVcbiIsIHByb2dyYW0pOwotICAgIE9wdGlvbnNVc2FnZSgpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICAvLyBQYXJzZSB0aGUgb3B0aW9ucwotICAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoYXJnYyAtIG9wdGluZCAhPSAyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgY2hhciAqZWxmX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBUcmFjZVJlYWRlcjw+ICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlcjw+OwotICAgIHRyYWNlLT5PcGVuKHRyYWNlX2ZpbGVuYW1lKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgcHJpbnRmKCIjICB0aW1lICAgYmIgICBwaWQgbnVtX2luc25zICBiYl9hZGRyXG4iKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBzeW1ib2xfdHlwZSAqc3ltOwotICAgICAgICBCQkV2ZW50IGV2ZW50OwotICAgICAgICBCQkV2ZW50IGlnbm9yZWQ7Ci0KLSAgICAgICAgaWYgKEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmc3ltKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwcmludGYoIiU3bGxkICU0bGxkICU1ZCAgICAgICAlM2QgIDB4JTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgIGV2ZW50LnRpbWUsIGV2ZW50LmJiX251bSwgZXZlbnQucGlkLCBldmVudC5udW1faW5zbnMsCi0gICAgICAgICAgICAgICBldmVudC5iYl9hZGRyLCBzeW0tPm5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9iYnByb2YuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2JicHJvZi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDA5NDEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2JicHJvZi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJhcm1kaXMuaCIKLQotc3RydWN0IE15U3RhdGljUmVjIHsKLSAgICBTdGF0aWNSZWMgICBiYjsKLSAgICB1aW50MzJfdCAgICAqaW5zbnM7Ci0gICAgdWludDMyX3QgICAgKmN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGN5Y2xlcyBmb3IgZWFjaCBpbnNuCi0gICAgdWludDMyX3QgICAgZWxhcHNlZDsgICAgLy8gbnVtYmVyIG9mIGN5Y2xlcyBmb3IgYmFzaWMgYmxvY2sKLSAgICBpbnQgICAgICAgICBmcmVxOyAgICAgICAvLyBleGVjdXRpb24gZnJlcXVlbmN5Ci0gICAgTXlTdGF0aWNSZWMgKmlubmVyOyAgICAgLy8gcG9pbnRlciB0byBhbiBpbm5lciBiYXNpYyBibG9jawotICAgIGludCAgICAgICAgIGlzX3RodW1iOwotfTsKLQotTXlTdGF0aWNSZWMgKiphc3NpZ25faW5uZXJfYmxvY2tzKGludCBudW1fYmxvY2tzLCBNeVN0YXRpY1JlYyAqYmxvY2tzKTsKLQotLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBxdWlja3NvcnQgdG8gY29tcGFyZSBhZGRyZXNzZXMgb2YgYmFzaWMKLS8vIGJsb2Nrcy4KLWludCBjbXBfaW5jX2FkZHIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgewotICAgIE15U3RhdGljUmVjICpiYjEsICpiYjI7Ci0KLSAgICBiYjEgPSAqKE15U3RhdGljUmVjKiopYTsKLSAgICBiYjIgPSAqKE15U3RhdGljUmVjKiopYjsKLSAgICBpZiAoYmIxLT5iYi5iYl9hZGRyIDwgYmIyLT5iYi5iYl9hZGRyKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGJiMS0+YmIuYmJfYWRkciA+IGJiMi0+YmIuYmJfYWRkcikKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIGJiMS0+YmIuYmJfbnVtIC0gYmIyLT5iYi5iYl9udW07Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcXVpY2tzb3J0IHRvIGNvbXBhcmUgdGhlIGVsYXBzZWQgdGltZQotLy8gb2YgYmFzaWMgYmxvY2tzLgotaW50IGNtcF9kZWNfZWxhcHNlZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgTXlTdGF0aWNSZWMgKmJiMSwgKmJiMjsKLQotICAgIGJiMSA9ICooTXlTdGF0aWNSZWMqKilhOwotICAgIGJiMiA9ICooTXlTdGF0aWNSZWMqKiliOwotICAgIGlmIChiYjEtPmVsYXBzZWQgPCBiYjItPmVsYXBzZWQpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmIChiYjEtPmVsYXBzZWQgPiBiYjItPmVsYXBzZWQpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gYmIxLT5iYi5iYl9udW0gLSBiYjItPmJiLmJiX251bTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBxdWlja3NvcnQgdG8gY29tcGFyZSBmcmVxdWVuY2llcyBvZgotLy8gYmFzaWMgYmxvY2tzLgotaW50IGNtcF9kZWNfZnJlcShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgTXlTdGF0aWNSZWMgKmJiMSwgKmJiMjsKLQotICAgIGJiMSA9ICooTXlTdGF0aWNSZWMqKilhOwotICAgIGJiMiA9ICooTXlTdGF0aWNSZWMqKiliOwotICAgIGlmIChiYjEtPmZyZXEgPCBiYjItPmZyZXEpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmIChiYjEtPmZyZXEgPiBiYjItPmZyZXEpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gYmIxLT5iYi5iYl9udW0gLSBiYjItPmJiLmJiX251bTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGlmIChhcmdjICE9IDIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgdHJhY2VfZmlsZVxuIiwgYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgY2hhciAqdHJhY2VfZmlsZW5hbWUgPSBhcmd2WzFdOwotICAgIFRyYWNlUmVhZGVyQmFzZSAqdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXJCYXNlOwotICAgIHRyYWNlLT5PcGVuKHRyYWNlX2ZpbGVuYW1lKTsKLSAgICBUcmFjZUhlYWRlciAqaGVhZGVyID0gdHJhY2UtPkdldEhlYWRlcigpOwotICAgIHVpbnQzMl90IG51bV9zdGF0aWNfYmIgPSBoZWFkZXItPm51bV9zdGF0aWNfYmI7Ci0KLSAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSBzdGF0aWMgYmxvY2tzCi0gICAgTXlTdGF0aWNSZWMgKmJsb2NrcyA9IG5ldyBNeVN0YXRpY1JlY1tudW1fc3RhdGljX2JiXTsKLQotICAgIC8vIFJlYWQgaW4gYWxsIHRoZSBzdGF0aWMgYmxvY2tzCi0gICAgZm9yICh1aW50MzJfdCBpaSA9IDA7IGlpIDwgbnVtX3N0YXRpY19iYjsgKytpaSkgewotICAgICAgICB0cmFjZS0+UmVhZFN0YXRpYygmYmxvY2tzW2lpXS5iYik7Ci0gICAgICAgIGJsb2Nrc1tpaV0uaXNfdGh1bWIgPSBibG9ja3NbaWldLmJiLmJiX2FkZHIgJiAxOwotICAgICAgICBibG9ja3NbaWldLmJiLmJiX2FkZHIgJj0gfjE7Ci0gICAgICAgIHVpbnQzMl90IG51bV9pbnNucyA9IGJsb2Nrc1tpaV0uYmIubnVtX2luc25zOwotICAgICAgICBibG9ja3NbaWldLmluc25zID0gbmV3IHVpbnQzMl90W251bV9pbnNuc107Ci0gICAgICAgIGJsb2Nrc1tpaV0uY3ljbGVzID0gbmV3IHVpbnQzMl90W251bV9pbnNuc107Ci0gICAgICAgIG1lbXNldChibG9ja3NbaWldLmN5Y2xlcywgMCwgbnVtX2luc25zICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICAgIHRyYWNlLT5SZWFkU3RhdGljSW5zbnMobnVtX2luc25zLCBibG9ja3NbaWldLmluc25zKTsKLSAgICAgICAgYmxvY2tzW2lpXS5lbGFwc2VkID0gMDsKLSAgICAgICAgYmxvY2tzW2lpXS5mcmVxID0gMDsKLSAgICAgICAgYmxvY2tzW2lpXS5pbm5lciA9IE5VTEw7Ci0gICAgfQotCi0gICAgTXlTdGF0aWNSZWMgKipzb3J0ZWQgPSBhc3NpZ25faW5uZXJfYmxvY2tzKG51bV9zdGF0aWNfYmIsIGJsb2Nrcyk7Ci0KLSAgICB1aW50MzJfdCBwcmV2X3RpbWUgPSAwOwotICAgIHVpbnQzMl90IGVsYXBzZWQgPSAwOwotICAgIHVpbnQzMl90IGR1bW15OwotICAgIHVpbnQzMl90ICpjeWNsZV9wdHIgPSAmZHVtbXk7Ci0gICAgdWludDMyX3QgKmJiX2VsYXBzZWRfcHRyID0gJmR1bW15OwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEJCRXZlbnQgZXZlbnQ7Ci0KLSAgICAgICAgaWYgKHRyYWNlLT5SZWFkQkIoJmV2ZW50KSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyBBc3NpZ24gZnJlcXVlbmNpZXMgdG8gZWFjaCBiYXNpYyBibG9jawotICAgICAgICB1aW50NjRfdCBiYl9udW0gPSBldmVudC5iYl9udW07Ci0gICAgICAgIGludCBudW1faW5zbnMgPSBldmVudC5udW1faW5zbnM7Ci0gICAgICAgIGJsb2Nrc1tiYl9udW1dLmZyZXEgKz0gMTsKLSAgICAgICAgZm9yIChNeVN0YXRpY1JlYyAqYnB0ciA9IGJsb2Nrc1tiYl9udW1dLmlubmVyOyBicHRyOyBicHRyID0gYnB0ci0+aW5uZXIpCi0gICAgICAgICAgICBicHRyLT5mcmVxICs9IDE7Ci0KLSAgICAgICAgLy8gQXNzaWduIHNpbXVsYXRpb24gdGltZSB0byBlYWNoIGluc3RydWN0aW9uCi0gICAgICAgIGZvciAoTXlTdGF0aWNSZWMgKmJwdHIgPSAmYmxvY2tzW2JiX251bV07IGJwdHI7IGJwdHIgPSBicHRyLT5pbm5lcikgewotICAgICAgICAgICAgdWludDMyX3QgYmJfbnVtX2luc25zID0gYnB0ci0+YmIubnVtX2luc25zOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpaSA9IDA7IG51bV9pbnNucyAmJiBpaSA8IGJiX251bV9pbnNuczsgKytpaSwgLS1udW1faW5zbnMpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzaW1fdGltZSA9IHRyYWNlLT5SZWFkSW5zblRpbWUoZXZlbnQudGltZSk7Ci0gICAgICAgICAgICAgICAgZWxhcHNlZCA9IHNpbV90aW1lIC0gcHJldl90aW1lOwotICAgICAgICAgICAgICAgIHByZXZfdGltZSA9IHNpbV90aW1lOwotCi0gICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIHRoZSBlbGFwc2VkIHRpbWUgdG8gdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGFuZAotICAgICAgICAgICAgICAgIC8vIGJhc2ljIGJsb2NrLgotICAgICAgICAgICAgICAgICpjeWNsZV9wdHIgKz0gZWxhcHNlZDsKLSAgICAgICAgICAgICAgICAqYmJfZWxhcHNlZF9wdHIgKz0gZWxhcHNlZDsKLSAgICAgICAgICAgICAgICBjeWNsZV9wdHIgPSAmYnB0ci0+Y3ljbGVzW2lpXTsKLSAgICAgICAgICAgICAgICBiYl9lbGFwc2VkX3B0ciA9ICZicHRyLT5lbGFwc2VkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICpjeWNsZV9wdHIgKz0gMTsKLSAgICAqYmJfZWxhcHNlZF9wdHIgKz0gMTsKLQotICAgIC8vIFNvcnQgdGhlIGJhc2ljIGJsb2NrcyBpbnRvIGRlY3JlYXNpbmcgZWxhcHNlZCB0aW1lCi0gICAgcXNvcnQoc29ydGVkLCBudW1fc3RhdGljX2JiLCBzaXplb2YoTXlTdGF0aWNSZWMqKSwgY21wX2RlY19lbGFwc2VkKTsKLQotICAgIGNoYXIgc3BhY2VzWzgwXTsKLSAgICBtZW1zZXQoc3BhY2VzLCAnICcsIDc5KTsKLSAgICBzcGFjZXNbNzldID0gMDsKLSAgICBmb3IgKHVpbnQzMl90IGlpID0gMDsgaWkgPCBudW1fc3RhdGljX2JiOyArK2lpKSB7Ci0gICAgICAgIHByaW50ZigiYmIgJWxsZCBhZGRyOiAweCV4LCBpbnNuczogJWQgZnJlcTogJXUgZWxhcHNlZDogJXVcbiIsCi0gICAgICAgICAgICAgICBzb3J0ZWRbaWldLT5iYi5iYl9udW0sIHNvcnRlZFtpaV0tPmJiLmJiX2FkZHIsCi0gICAgICAgICAgICAgICBzb3J0ZWRbaWldLT5iYi5udW1faW5zbnMsIHNvcnRlZFtpaV0tPmZyZXEsCi0gICAgICAgICAgICAgICBzb3J0ZWRbaWldLT5lbGFwc2VkKTsKLSAgICAgICAgaW50IG51bV9pbnNucyA9IHNvcnRlZFtpaV0tPmJiLm51bV9pbnNuczsKLSAgICAgICAgdWludDMyX3QgYWRkciA9IHNvcnRlZFtpaV0tPmJiLmJiX2FkZHI7Ci0gICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCBudW1faW5zbnM7ICsramopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGVsYXBzZWQgPSBzb3J0ZWRbaWldLT5jeWNsZXNbampdOwotICAgICAgICAgICAgdWludDMyX3QgaW5zbiA9IHNvcnRlZFtpaV0tPmluc25zW2pqXTsKLSAgICAgICAgICAgIGlmIChpbnNuX2lzX3RodW1iKGluc24pKSB7Ci0gICAgICAgICAgICAgICAgaW5zbiA9IGluc25fdW53cmFwX3RodW1iKGluc24pOwotCi0gICAgICAgICAgICAgICAgLy8gdGh1bWJfcGFpciBpcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IG9mIGEgcGFpciBvZgotICAgICAgICAgICAgICAgIC8vIHRodW1iIGluc3RydWN0aW9ucyAoQkwgb3IgQkxYKS4KLSAgICAgICAgICAgICAgICBib29sIHRodW1iX3BhaXIgPSAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGh1bWIgaW5zdHJ1Y3Rpb24gKGlmIGFueSkgYmVjYXVzZSB3ZSBtYXkgbmVlZAotICAgICAgICAgICAgICAgIC8vIGl0IGZvciB0aGUgY2FzZSB3aGVyZSBpbnNuIGlzIEJMIG9yIEJMWC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnNuMiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHRodW1iX3BhaXIgJiYgKGpqICsgMSA8IG51bV9pbnNucykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zbjIgPSBzb3J0ZWRbaWldLT5pbnNuc1tqaiArIDFdOwotICAgICAgICAgICAgICAgICAgICBpbnNuMiA9IGluc25fdW53cmFwX3RodW1iKGluc24yKTsKLSAgICAgICAgICAgICAgICAgICAgamogKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhciAqZGlzYXNtID0gZGlzYXNtX2luc25fdGh1bWIoYWRkciwgaW5zbiwgaW5zbjIsIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmICh0aHVtYl9wYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAlNHUgJTA4eCAlMDR4ICUwNHggJXNcbiIsIGVsYXBzZWQsIGFkZHIsIGluc24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuMiwgZGlzYXNtKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkciArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAlNHUgJTA4eCAgICAgJTA0eCAlc1xuIiwgZWxhcHNlZCwgYWRkciwgaW5zbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FzbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZHIgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqZGlzYXNtID0gQXJtOjpkaXNhc20oYWRkciwgaW5zbiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgICU0dSAlMDh4ICUwOHggJXNcbiIsIGVsYXBzZWQsIGFkZHIsIGluc24sIGRpc2FzbSk7Ci0gICAgICAgICAgICAgICAgYWRkciArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlW10gc29ydGVkOwotICAgIHJldHVybiAwOwotfQotCi0vLyBGaW5kIHRoZSBiYXNpYyBibG9ja3MgdGhhdCBhcmUgc3Vic2V0cyBvZiBvdGhlciBiYXNpYyBibG9ja3MuCi1NeVN0YXRpY1JlYyAqKmFzc2lnbl9pbm5lcl9ibG9ja3MoaW50IG51bV9ibG9ja3MsIE15U3RhdGljUmVjICpibG9ja3MpCi17Ci0gICAgaW50IGlpOwotICAgIHVpbnQzMl90IGFkZHJfZW5kLCBhZGRyX2RpZmY7Ci0KLSAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoZSBiYXNpYyBibG9ja3MgdGhhdCB3ZSBjYW4gc29ydC4KLSAgICBNeVN0YXRpY1JlYyAqKnNvcnRlZCA9IG5ldyBNeVN0YXRpY1JlYypbbnVtX2Jsb2Nrc107Ci0gICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2Jsb2NrczsgKytpaSkgewotICAgICAgICBzb3J0ZWRbaWldID0gJmJsb2Nrc1tpaV07Ci0gICAgfQotCi0gICAgLy8gU29ydCB0aGUgYmFzaWMgYmxvY2tzIGludG8gaW5jcmVhc2luZyBhZGRyZXNzIG9yZGVyCi0gICAgcXNvcnQoc29ydGVkLCBudW1fYmxvY2tzLCBzaXplb2YoTXlTdGF0aWNSZWMqKSwgY21wX2luY19hZGRyKTsKLQotICAgIC8vIENyZWF0ZSBwb2ludGVycyB0byBpbm5lciBibG9ja3MgYW5kIGJyZWFrIHVwIHRoZSBlbmNsb3NpbmcgYmxvY2sKLSAgICAvLyBzbyB0aGF0IHRoZXJlIGlzIG5vIG92ZXJsYXAuCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2Jsb2NrcyAtIDE7ICsraWkpIHsKLSAgICAgICAgaW50IG51bV9ieXRlczsKLSAgICAgICAgaWYgKHNvcnRlZFtpaV0tPmlzX3RodW1iKQotICAgICAgICAgICAgbnVtX2J5dGVzID0gc29ydGVkW2lpXS0+YmIubnVtX2luc25zIDw8IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG51bV9ieXRlcyA9IHNvcnRlZFtpaV0tPmJiLm51bV9pbnNucyA8PCAyOwotICAgICAgICBhZGRyX2VuZCA9IHNvcnRlZFtpaV0tPmJiLmJiX2FkZHIgKyBudW1fYnl0ZXM7Ci0gICAgICAgIGlmIChhZGRyX2VuZCA+IHNvcnRlZFtpaSArIDFdLT5iYi5iYl9hZGRyKSB7Ci0gICAgICAgICAgICBzb3J0ZWRbaWldLT5pbm5lciA9IHNvcnRlZFtpaSArIDFdOwotICAgICAgICAgICAgYWRkcl9kaWZmID0gc29ydGVkW2lpICsgMV0tPmJiLmJiX2FkZHIgLSBzb3J0ZWRbaWldLT5iYi5iYl9hZGRyOwotICAgICAgICAgICAgdWludDMyX3QgbnVtX2luc25zOwotICAgICAgICAgICAgaWYgKHNvcnRlZFtpaV0tPmlzX3RodW1iKQotICAgICAgICAgICAgICAgIG51bV9pbnNucyA9IGFkZHJfZGlmZiA+PiAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG51bV9pbnNucyA9IGFkZHJfZGlmZiA+PiAyOwotICAgICAgICAgICAgc29ydGVkW2lpXS0+YmIubnVtX2luc25zID0gbnVtX2luc25zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvcnRlZDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9iaXR2ZWN0b3IuaCBiL2VtdWxhdG9yL3F0b29scy9iaXR2ZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmNWNmMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvYml0dmVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpZm5kZWYgQklUVkVDVE9SX0gKLSNkZWZpbmUgQklUVkVDVE9SX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLWNsYXNzIEJpdHZlY3RvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCaXR2ZWN0b3IoaW50IG51bV9iaXRzKSB7Ci0gICAgbnVtX2JpdHNfID0gbnVtX2JpdHM7Ci0KLSAgICAvLyBSb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIDMyCi0gICAgbnVtX2JpdHMgPSAobnVtX2JpdHMgKyAzMSkgJiB+MzE7Ci0gICAgdmVjdG9yXyA9IG5ldyB1aW50MzJfdFtudW1fYml0cyA+PiA1XTsKLSAgfQotICB+Qml0dmVjdG9yKCkgewotICAgIGRlbGV0ZVtdIHZlY3Rvcl87Ci0gIH0KLQotICB2b2lkICAgICAgICBTZXRCaXQoaW50IGJpdG51bSkgewotICAgIGFzc2VydChiaXRudW0gPCBudW1fYml0c18pOwotICAgIHZlY3Rvcl9bYml0bnVtID4+IDVdIHw9IDEgPDwgKGJpdG51bSAmIDMxKTsKLSAgfQotICB2b2lkICAgICAgICBDbGVhckJpdChpbnQgYml0bnVtKSB7Ci0gICAgYXNzZXJ0KGJpdG51bSA8IG51bV9iaXRzXyk7Ci0gICAgdmVjdG9yX1tiaXRudW0gPj4gNV0gJj0gfigxIDw8IChiaXRudW0gJiAzMSkpOwotICB9Ci0gIGJvb2wgICAgICAgIEdldEJpdChpbnQgYml0bnVtKSB7Ci0gICAgYXNzZXJ0KGJpdG51bSA8IG51bV9iaXRzXyk7Ci0gICAgcmV0dXJuICh2ZWN0b3JfW2JpdG51bSA+PiA1XSA+PiAoYml0bnVtICYgMzEpKSAmIDE7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCAgICAgICAgIG51bV9iaXRzXzsKLSAgdWludDMyX3QgICAgKnZlY3Rvcl87Ci19OwotCi0jZW5kaWYgIC8vIEJJVFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvY2FsbHN0YWNrLmggYi9lbXVsYXRvci9xdG9vbHMvY2FsbHN0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODIzMzAuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2NhbGxzdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBDQUxMX1NUQUNLX0gKLSNkZWZpbmUgQ0FMTF9TVEFDS19ICi0KLSNpbmNsdWRlICJvcGNvZGUuaCIKLSNpbmNsdWRlICJhcm1kaXMuaCIKLQotY2xhc3MgQ2FsbFN0YWNrQmFzZSB7Ci0gIHB1YmxpYzoKLSAgICBpbnQgICAgZ2V0SWQoKSAgICAgICAgICB7IHJldHVybiBtSWQ7IH0KLSAgICB2b2lkICAgc2V0SWQoaW50IGlkKSAgICB7IG1JZCA9IGlkOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBpbnQgICAgbUlkOwotfTsKLQotLy8gRGVmaW5lIGEgdGVtcGxhdGUgY2xhc3MgZm9yIHRoZSBzdGFjayBmcmFtZS4gIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKLS8vIFNZTSBpcyB0aGUgc3ltYm9sX3R5cGUgZnJvbSB0aGUgVHJhY2VSZWFkZXI8PiB0ZW1wbGF0ZSBjbGFzcy4gVG8KLS8vIHVzZSB0aGUgQ2FsbFN0YWNrIGNsYXNzLCB0aGUgdXNlciBkZXJpdmVzIGEgc3ViY2xhc3Mgb2YgU3RhY2tGcmFtZQotLy8gYW5kIGRlZmluZXMgcHVzaCgpIGFuZCBwb3AoKSBtZXRob2RzLiAgVGhpcyBkZXJpdmVkIGNsYXNzIGlzIHRoZW4KLS8vIHBhc3NlZCBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciB0byBDYWxsU3RhY2suCi10ZW1wbGF0ZSA8Y2xhc3MgU1lNPgotY2xhc3MgU3RhY2tGcmFtZSB7Ci0gIHB1YmxpYzoKLQotICAgIHZpcnR1YWwgflN0YWNrRnJhbWUoKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBwdXNoKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKSB7fTsKLSAgICB2aXJ0dWFsIHZvaWQgcG9wKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKSB7fTsKLQotICAgIHR5cGVkZWYgU1lNIHN5bWJvbF90eXBlOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F1c2VkRXhjZXB0aW9uID0gMHgwMTsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0ludGVycHJldGVkICAgICA9IDB4MDI7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTdGFydE5hdGl2ZSAgICAgPSAweDA0OwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUG9wQmFycmllciAgICAgID0gKGtDYXVzZWRFeGNlcHRpb24gfCBrSW50ZXJwcmV0ZWQKLSAgICAgICAgfCBrU3RhcnROYXRpdmUpOwotCi0gICAgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uOyAgICAgIC8vIHRoZSBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiB3ZSBlbnRlcmVkCi0gICAgdWludDMyX3QgICAgYWRkcjsgICAgICAgICAgIC8vIHJldHVybiBhZGRyZXNzIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICAgdWludDMyX3QgICAgZmxhZ3M7Ci0gICAgdWludDMyX3QgICAgdGltZTsgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcgd2hlbiBhIHByb2JsZW0gb2NjdXJyZWQKLSAgICB1aW50MzJfdCAgICBnbG9iYWxfdGltZTsgICAgLy8gZm9yIGRlYnVnZ2luZyB3aGVuIGEgcHJvYmxlbSBvY2N1cnJlZAotfTsKLQotdGVtcGxhdGUgPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFID0gQ2FsbFN0YWNrQmFzZT4KLWNsYXNzIENhbGxTdGFjayA6IHB1YmxpYyBCQVNFIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEZSQU1FIGZyYW1lX3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGUkFNRTo6c3ltYm9sX3R5cGUgc3ltYm9sX3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGUkFNRTo6c3ltYm9sX3R5cGU6OnJlZ2lvbl90eXBlIHJlZ2lvbl90eXBlOwotICAgIHR5cGVkZWYgQkFTRSBiYXNlX3R5cGU7Ci0KLSAgICBDYWxsU3RhY2soaW50IGlkLCBpbnQgbnVtRnJhbWVzLCBUcmFjZVJlYWRlclR5cGUgKnRyYWNlKTsKLSAgICB+Q2FsbFN0YWNrKCk7Ci0KLSAgICB2b2lkICAgIHVwZGF0ZVN0YWNrKEJCRXZlbnQgKmV2ZW50LCBzeW1ib2xfdHlwZSAqZnVuY3Rpb24pOwotICAgIHZvaWQgICAgcG9wQWxsKHVpbnQ2NF90IHRpbWUpOwotICAgIHZvaWQgICAgdGhyZWFkU3RhcnQodWludDY0X3QgdGltZSk7Ci0gICAgdm9pZCAgICB0aHJlYWRTdG9wKHVpbnQ2NF90IHRpbWUpOwotCi0gICAgLy8gU2V0IHRvIHRydWUgaWYgeW91IGRvbid0IHdhbnQgdG8gc2VlIGFueSBKYXZhIG1ldGhvZHMgZXZlcgotICAgIHZvaWQgICAgc2V0TmF0aXZlT25seShib29sIG5hdGl2ZU9ubHkpIHsKLSAgICAgICAgbU5hdGl2ZU9ubHkgPSBuYXRpdmVPbmx5OwotICAgIH0KLQotICAgIGludCAgICAgICAgIGdldFN0YWNrTGV2ZWwoKSB7IHJldHVybiBtVG9wOyB9Ci0KLSAgICB1aW50NjRfdCAgICBnZXRHbG9iYWxUaW1lKHVpbnQ2NF90IHRpbWUpIHsgcmV0dXJuIHRpbWUgKyBtU2tpcHBlZFRpbWU7IH0KLSAgICB2b2lkICAgICAgICBzaG93U3RhY2soRklMRSAqc3RyZWFtKTsKLQotICAgIGludCAgICAgICAgIG1OdW1GcmFtZXM7Ci0gICAgRlJBTUUgICAgICAgKm1GcmFtZXM7Ci0gICAgaW50ICAgICAgICAgbVRvcDsgICAgICAgICAgIC8vIGluZGV4IG9mIHRoZSBuZXh0IHN0YWNrIGZyYW1lIHRvIHdyaXRlCi0KLXByaXZhdGU6Ci0gICAgZW51bSBBY3Rpb24geyBOT05FLCBQVVNILCBQT1AsIE5BVElWRV9QVVNIIH07Ci0KLSAgICBBY3Rpb24gICAgICBnZXRBY3Rpb24oQkJFdmVudCAqZXZlbnQsIHN5bWJvbF90eXBlICpmdW5jdGlvbik7Ci0gICAgdm9pZCAgICAgICAgZG9NZXRob2RBY3Rpb24oQkJFdmVudCAqZXZlbnQsIHN5bWJvbF90eXBlICpmdW5jdGlvbik7Ci0gICAgdm9pZCAgICAgICAgZG9NZXRob2RQb3AoQkJFdmVudCAqZXZlbnQsIHVpbnQzMl90IGFkZHIsIGNvbnN0IHVpbnQzMl90IGZsYWdzKTsKLSAgICB2b2lkICAgICAgICBkb1NpbXBsZVB1c2goc3ltYm9sX3R5cGUgKmZ1bmN0aW9uLCB1aW50MzJfdCBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCBpbnQgZmxhZ3MpOwotICAgIHZvaWQgICAgICAgIGRvU2ltcGxlUG9wKHVpbnQ2NF90IHRpbWUpOwotICAgIHZvaWQgICAgICAgIGRvUHVzaChCQkV2ZW50ICpldmVudCwgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uKTsKLSAgICB2b2lkICAgICAgICBkb1BvcChCQkV2ZW50ICpldmVudCwgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uLCBBY3Rpb24gbWV0aG9kQWN0aW9uKTsKLQotICAgIFRyYWNlUmVhZGVyVHlwZSAqbVRyYWNlOwotCi0gICAgLy8gVGhpcyBpcyBhIGdsb2JhbCBzd2l0Y2ggdGhhdCBkaXNhYmxlcyBKYXZhIG1ldGhvZHMgZnJvbSBhcHBlYXJpbmcKLSAgICAvLyBvbiB0aGUgc3RhY2suCi0gICAgYm9vbCAgICAgICAgbU5hdGl2ZU9ubHk7Ci0gIAotICAgIC8vIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBuYXRpdmUgZnJhbWVzIGFyZSBjdXJyZW50bHkgYWxsb3dlZCBvbiB0aGUKLSAgICAvLyBzdGFjay4KLSAgICBib29sICAgICAgICBtQWxsb3dOYXRpdmVGcmFtZXM7Ci0KLSAgICBzeW1ib2xfdHlwZSBtRHVtbXlGdW5jdGlvbjsKLSAgICByZWdpb25fdHlwZSBtRHVtbXlSZWdpb247Ci0KLSAgICBzeW1ib2xfdHlwZSAqbVByZXZGdW5jdGlvbjsKLSAgICBCQkV2ZW50ICAgICBtUHJldkV2ZW50OwotCi0gICAgc3ltYm9sX3R5cGUgKm1Vc2VyRnVuY3Rpb247Ci0gICAgQkJFdmVudCAgICAgbVVzZXJFdmVudDsgICAgIC8vIHRoZSBwcmV2aW91cyB1c2VyLW1vZGUgZXZlbnQKLQotICAgIHVpbnQ2NF90ICAgIG1Ta2lwcGVkVGltZTsKLSAgICB1aW50NjRfdCAgICBtTGFzdFJ1blRpbWU7Ci0KLSAgICBzdGF0aWMgTWV0aG9kUmVjICAgIHNDdXJyZW50TWV0aG9kOwotICAgIHN0YXRpYyBNZXRob2RSZWMgICAgc05leHRNZXRob2Q7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLU1ldGhvZFJlYyBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+OjpzQ3VycmVudE1ldGhvZDsKLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotTWV0aG9kUmVjIENhbGxTdGFjazxGUkFNRSwgQkFTRT46OnNOZXh0TWV0aG9kOwotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLUNhbGxTdGFjazxGUkFNRSwgQkFTRT46OkNhbGxTdGFjayhpbnQgaWQsIGludCBudW1GcmFtZXMsIFRyYWNlUmVhZGVyVHlwZSAqdHJhY2UpCi17Ci0gICAgbU5hdGl2ZU9ubHkgPSBmYWxzZTsKLSAgICBtVHJhY2UgPSB0cmFjZTsKLSAgICBCQVNFOjpzZXRJZChpZCk7Ci0gICAgbU51bUZyYW1lcyA9IG51bUZyYW1lczsKLSAgICBtRnJhbWVzID0gbmV3IEZSQU1FW21OdW1GcmFtZXNdOwotICAgIG1Ub3AgPSAwOwotICAgIG1BbGxvd05hdGl2ZUZyYW1lcyA9IHRydWU7Ci0KLSAgICBtZW1zZXQoJm1EdW1teUZ1bmN0aW9uLCAwLCBzaXplb2Yoc3ltYm9sX3R5cGUpKTsKLSAgICBtZW1zZXQoJm1EdW1teVJlZ2lvbiwgMCwgc2l6ZW9mKHJlZ2lvbl90eXBlKSk7Ci0gICAgbUR1bW15RnVuY3Rpb24ucmVnaW9uID0gJm1EdW1teVJlZ2lvbjsKLSAgICBtUHJldkZ1bmN0aW9uID0gJm1EdW1teUZ1bmN0aW9uOwotICAgIG1lbXNldCgmbVByZXZFdmVudCwgMCwgc2l6ZW9mKEJCRXZlbnQpKTsKLSAgICBtVXNlckZ1bmN0aW9uID0gJm1EdW1teUZ1bmN0aW9uOwotICAgIG1lbXNldCgmbVVzZXJFdmVudCwgMCwgc2l6ZW9mKEJCRXZlbnQpKTsKLSAgICBtU2tpcHBlZFRpbWUgPSAwOwotICAgIG1MYXN0UnVuVGltZSA9IDA7Ci0KLSAgICAvLyBSZWFkIHRoZSBmaXJzdCB0d28gbWV0aG9kcyBmcm9tIHRoZSB0cmFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgcmVhZAotICAgIC8vIGZyb20gdGhlIG1ldGhvZCB0cmFjZSB5ZXQuCi0gICAgaWYgKHNDdXJyZW50TWV0aG9kLnRpbWUgPT0gMCkgewotICAgICAgICBpZiAobVRyYWNlLT5SZWFkTWV0aG9kKCZzQ3VycmVudE1ldGhvZCkpIHsKLSAgICAgICAgICAgIHNDdXJyZW50TWV0aG9kLnRpbWUgPSB+MHVsbDsKLSAgICAgICAgICAgIHNOZXh0TWV0aG9kLnRpbWUgPSB+MHVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc05leHRNZXRob2QudGltZSAhPSB+MHVsbCAmJiBtVHJhY2UtPlJlYWRNZXRob2QoJnNOZXh0TWV0aG9kKSkgewotICAgICAgICAgICAgc05leHRNZXRob2QudGltZSA9IH4wdWxsOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLUNhbGxTdGFjazxGUkFNRSwgQkFTRT46On5DYWxsU3RhY2soKQotewotICAgIGRlbGV0ZSBtRnJhbWVzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLXZvaWQKLUNhbGxTdGFjazxGUkFNRSwgQkFTRT46OnVwZGF0ZVN0YWNrKEJCRXZlbnQgKmV2ZW50LCBzeW1ib2xfdHlwZSAqZnVuY3Rpb24pCi17Ci0gICAgaWYgKG1OYXRpdmVPbmx5KSB7Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW50ZXJwcmV0ZWQgZnVuY3Rpb24sIHRoZW4gdXNlIHRoZSBuYXRpdmUgVk0gZnVuY3Rpb24KLSAgICAgICAgLy8gaW5zdGVhZC4KLSAgICAgICAgaWYgKGZ1bmN0aW9uLT52bV9zeW0gIT0gTlVMTCkKLSAgICAgICAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24tPnZtX3N5bTsKLSAgICB9IGVsc2UgewotICAgICAgICBkb01ldGhvZEFjdGlvbihldmVudCwgZnVuY3Rpb24pOwotICAgIH0KLQotICAgIEFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb24oZXZlbnQsIGZ1bmN0aW9uKTsKLQotICAgIC8vIEFsbG93IG5hdGl2ZSBmcmFtZXMgaWYgd2UgYXJlIGV4ZWN1dGluZyBpbiB0aGUga2VybmVsLgotICAgIGlmICghbUFsbG93TmF0aXZlRnJhbWVzCi0gICAgICAgICYmIChmdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb24pID09IDApIHsKLSAgICAgICAgYWN0aW9uID0gTk9ORTsKLSAgICB9Ci0KLSAgICBpZiAoZnVuY3Rpb24tPnZtX3N5bSAhPSBOVUxMKSB7Ci0gICAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24tPnZtX3N5bTsKLSAgICAgICAgZnVuY3Rpb24tPnZtX3N5bSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChhY3Rpb24gPT0gUFVTSCkgewotICAgICAgICBkb1B1c2goZXZlbnQsIGZ1bmN0aW9uKTsKLSAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBQT1ApIHsKLSAgICAgICAgZG9Qb3AoZXZlbnQsIGZ1bmN0aW9uLCBOT05FKTsKLSAgICB9Ci0KLSNpZiAwCi0gICAgLy8gUG9wIG9mZiBuYXRpdmUgZnVuY3Rpb25zIGJlZm9yZSBwdXNoaW5nIG9yIHBvcHBpbmcgSmF2YSBtZXRob2RzLgotICAgIGlmIChhY3Rpb24gPT0gUE9QICYmIG1QcmV2RnVuY3Rpb24tPnZtX3N5bSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIFBvcCBvZmYgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGZpcnN0LgotICAgICAgICBkb1BvcChldmVudCwgZnVuY3Rpb24sIE5PTkUpOwotICAgICAgICBpZiAobWV0aG9kQWN0aW9uID09IFBPUCkgewotICAgICAgICAgICAgZG9Qb3AoZXZlbnQsIGZ1bmN0aW9uLCBQT1ApOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZEFjdGlvbiA9PSBQVVNIKSB7Ci0gICAgICAgICAgICBkb1B1c2goZXZlbnQsIGZ1bmN0aW9uKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtZXRob2RBY3Rpb24gIT0gTk9ORSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1ldGhvZCB0cmFjZSBoYXMgYSBwdXNoIG9yIHBvcCwgdGhlbiBkbyBpdC4KLSAgICAgICAgICAgIGFjdGlvbiA9IG1ldGhvZEFjdGlvbjsKLSAgICAgICAgfSBlbHNlIGlmIChmdW5jdGlvbi0+dm1fc3ltICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBKYXZhIG1ldGhvZC4gIERvbid0IHB1c2ggb3IgcG9wIHRoZQotICAgICAgICAgICAgLy8gSmF2YSBtZXRob2Qgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgbWV0aG9kIHRyYWNlIHJlY29yZC4KLSAgICAgICAgICAgIGFjdGlvbiA9IE5PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjdGlvbiA9PSBQT1ApIHsKLSAgICAgICAgICAgIGRvUG9wKGV2ZW50LCBmdW5jdGlvbiwgbWV0aG9kQWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUFVTSCkgewotICAgICAgICAgICAgZG9QdXNoKGV2ZW50LCBmdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIElmIHRoZSBzdGFjayBpcyBub3cgZW1wdHksIHRoZW4gcHVzaCB0aGUgY3VycmVudCBmdW5jdGlvbi4KLSAgICBpZiAobVRvcCA9PSAwKSB7Ci0gICAgICAgIHVpbnQ2NF90IHRpbWUgPSBldmVudC0+dGltZSAtIG1Ta2lwcGVkVGltZTsKLSAgICAgICAgaW50IGZsYWdzID0gMDsKLSAgICAgICAgaWYgKGZ1bmN0aW9uLT52bV9zeW0gIT0gTlVMTCkgewotICAgICAgICAgICAgZmxhZ3MgPSBGUkFNRTo6a0ludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGRvU2ltcGxlUHVzaChmdW5jdGlvbiwgMCwgdGltZSwgMCk7Ci0gICAgfQotCi0gICAgbVByZXZGdW5jdGlvbiA9IGZ1bmN0aW9uOwotICAgIG1QcmV2RXZlbnQgPSAqZXZlbnQ7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotdm9pZAotQ2FsbFN0YWNrPEZSQU1FLCBCQVNFPjo6dGhyZWFkU3RhcnQodWludDY0X3QgdGltZSkKLXsKLSAgICBtU2tpcHBlZFRpbWUgKz0gdGltZSAtIG1MYXN0UnVuVGltZTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgRlJBTUUsIGNsYXNzIEJBU0U+Ci12b2lkCi1DYWxsU3RhY2s8RlJBTUUsIEJBU0U+Ojp0aHJlYWRTdG9wKHVpbnQ2NF90IHRpbWUpCi17Ci0gICAgbUxhc3RSdW5UaW1lID0gdGltZTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgRlJBTUUsIGNsYXNzIEJBU0U+Ci10eXBlbmFtZSBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+OjpBY3Rpb24KLUNhbGxTdGFjazxGUkFNRSwgQkFTRT46OmdldEFjdGlvbihCQkV2ZW50ICpldmVudCwgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uKQotewotICAgIEFjdGlvbiBhY3Rpb247Ci0gICAgdWludDMyX3Qgb2Zmc2V0OwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiB0byB0aGlzIGJhc2ljCi0gICAgLy8gYmxvY2sgYWRkcmVzcy4KLSAgICBvZmZzZXQgPSBldmVudC0+YmJfYWRkciAtIGZ1bmN0aW9uLT5hZGRyIC0gZnVuY3Rpb24tPnJlZ2lvbi0+YmFzZV9hZGRyOwotCi0gICAgLy8gR2V0IHRoZSBwcmV2aW91c2x5IGV4ZWN1dGVkIGluc3RydWN0aW9uCi0gICAgT3Bjb2RlIG9wID0gT1BfSU5WQUxJRDsKLSAgICBpbnQgbnVtSW5zbnMgPSBtUHJldkV2ZW50Lm51bV9pbnNuczsKLSAgICB1aW50MzJfdCBpbnNuID0gMDsKLSAgICBpZiAobnVtSW5zbnMgPiAwKSB7Ci0gICAgICAgIGluc24gPSBtUHJldkV2ZW50Lmluc25zW251bUluc25zIC0gMV07Ci0gICAgICAgIGlmIChtUHJldkV2ZW50LmlzX3RodW1iKSB7Ci0gICAgICAgICAgICBpbnNuID0gaW5zbl91bndyYXBfdGh1bWIoaW5zbik7Ci0gICAgICAgICAgICBvcCA9IGRlY29kZV9pbnNuX3RodW1iKGluc24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3AgPSBBcm06OmRlY29kZShpbnNuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHByZXZpb3VzIGJhc2ljIGJsb2NrIGRlcGVuZHMgb24KLSAgICAvLyB3aGV0aGVyIHRoZSBiYXNpYyBibG9jayB3YXMgQVJNIG9yIFRIVU1CIGluc3RydWN0aW9ucy4KLSAgICBpbnQgbnVtQnl0ZXM7Ci0gICAgaWYgKG1QcmV2RXZlbnQuaXNfdGh1bWIpIHsKLSAgICAgICAgbnVtQnl0ZXMgPSBudW1JbnNucyA8PCAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG51bUJ5dGVzID0gbnVtSW5zbnMgPDwgMjsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGlzIGJhc2ljIGJsb2NrIGZvbGxvd3MgdGhlIHByZXZpb3VzIG9uZSwgdGhlbiByZXR1cm4gTk9ORS4KLSAgICAvLyBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHdlIG1heSBiZSBmb29sZWQgaW50byB0aGlua2luZyB0aGlzCi0gICAgLy8gaXMgYSBQT1AgaWYgdGhlIHByZXZpb3VzIGJsb2NrIGVuZGVkIHdpdGggYSBjb25kaXRpb25hbAotICAgIC8vIChub24tZXhlY3V0ZWQpIGxkbWlhIGluc3RydWN0aW9uLiAgV2UgZG8gdGhpcyBjaGVjayBiZWZvcmUKLSAgICAvLyBjaGVja2luZyBpZiB3ZSBhcmUgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24gYmVjYXVzZSB3ZSBvdGhlcndpc2UKLSAgICAvLyB3ZSBtaWdodCBiZSBmb29sZWQgaW50byB0aGlua2luZyB0aGlzIGlzIGEgUFVTSCB0byBhIG5ldyBmdW5jdGlvbgotICAgIC8vIHdoZW4gaXQgaXMgcmVhbGx5IGp1c3QgYSBmYWxsLXRocnUgaW50byBhIGxvY2FsIGtlcm5lbCBzeW1ib2wKLSAgICAvLyB0aGF0IGp1c3QgbG9va3MgbGlrZSBhIG5ldyBmdW5jdGlvbi4KLSAgICB1aW50MzJfdCBwcmV2X2VuZF9hZGRyID0gbVByZXZFdmVudC5iYl9hZGRyICsgbnVtQnl0ZXM7Ci0gICAgaWYgKHByZXZfZW5kX2FkZHIgPT0gZXZlbnQtPmJiX2FkZHIpIHsKLSAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhpcyBiYXNpYyBibG9jayBpcyBpbiB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgbGFzdCBiYXNpYyBibG9jaywKLSAgICAvLyB0aGVuIGp1c3QgcmV0dXJuIE5PTkUgKGJ1dCBzZWUgdGhlIGV4Y2VwdGlvbnMgYmVsb3cpLgotICAgIC8vIEV4Y2VwdGlvbiAxOiBpZiB0aGUgZnVuY3Rpb24gY2FsbHMgaXRzZWxmIChvZmZzZXQgPT0gMCkgdGhlbiB3ZQotICAgIC8vIHdhbnQgdG8gcHVzaCB0aGlzIGZ1bmN0aW9uLgotICAgIC8vIEV4Y2VwdGlvbiAyOiBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0byBpdHNlbGYsIHRoZW4gd2Ugd2FudAotICAgIC8vIHRvIHBvcCB0aGlzIGZ1bmN0aW9uLiAgV2UgZGV0ZWN0IHRoaXMgY2FzZSBieSBjaGVja2luZyBpZiB0aGUgbGFzdAotICAgIC8vIGluc3RydWN0aW9uIGluIHRoZSBwcmV2aW91cyBiYXNpYyBibG9jayB3YXMgYSBsb2FkLW11bHRpcGxlIChsZG0pCi0gICAgLy8gYW5kIGluY2x1ZGVkIHIxNSBhcyBvbmUgb2YgdGhlIGxvYWRlZCByZWdpc3RlcnMuCi0gICAgaWYgKGZ1bmN0aW9uID09IG1QcmV2RnVuY3Rpb24pIHsKLSAgICAgICAgaWYgKG51bUluc25zID4gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbiBhbmQgdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiB3YXMgbm90IGEgYnJhbmNoLCB0aGVuIGl0J3MgYSBQVVNILgotICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwICYmIG9wICE9IE9QX0IgJiYgb3AgIT0gT1BfVEhVTUJfQikKLSAgICAgICAgICAgICAgICByZXR1cm4gUFVTSDsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhbiBsZG0gdGhhdCBsb2FkZWQgcjE1LAotICAgICAgICAgICAgLy8gdGhlbiBpdCdzIGEgUE9QLgotICAgICAgICAgICAgaWYgKG9mZnNldCAhPSAwICYmICgob3AgPT0gT1BfTERNICYmIChpbnNuICYgMHg4MDAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG9wID09IE9QX1RIVU1CX1BPUCAmJiAoaW5zbiAmIDB4MTAwKSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBPUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBOT05FOwotICAgIH0KLQotICAgIC8vIFdlIGhhdmUgdG8gZmlndXJlIG91dCBpZiB0aGlzIG5ldyBmdW5jdGlvbiBpcyBhIGNhbGwgb3IgYQotICAgIC8vIHJldHVybi4gIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBjb21wbGV0ZSBjYWxsIHN0YWNrIChzaW5jZQotICAgIC8vIHdlIGNvdWxkIGhhdmUgc3RhcnRlZCB0cmFjaW5nIGF0IGFueSBwb2ludCksIHNvIHdlIGhhdmUgdG8gdXNlCi0gICAgLy8gaGV1cmlzdGljcy4gIElmIHRoZSBhZGRyZXNzIHdlIGFyZSBqdW1waW5nIHRvIGlzIHRoZSBiZWdpbm5pbmcKLSAgICAvLyBvZiBhIGZ1bmN0aW9uLCBvciBpZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB0b29rIHVzIHRoZXJlIHdhcwotICAgIC8vIGVpdGhlciAiYmwiIG9yICJibHgiIHRoZW4gdGhpcyBpcyBhIFBVU0guICBBbHNvLCBpZiB0aGUKLSAgICAvLyBmdW5jdGlvbiBvZmZzZXQgaXMgbm9uLXplcm8gYW5kIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhCi0gICAgLy8gYnJhbmNoIGluc3RydWN0aW9uLCB3ZSB3aWxsIGNhbGwgaXQgYSBQVVNILiAgVGhpcyBoYXBwZW5zIGluCi0gICAgLy8gdGhlIGtlcm5lbCBhIGxvdCB3aGVuIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGFuIG9mZnNldCBmcm9tIGEKLSAgICAvLyBsYWJlbC4gQSBjb3VwbGUgbW9yZSBzcGVjaWFsIGNhc2VzOgotICAgIC8vCi0gICAgLy8gICAtIGVudGVyaW5nIGEgLnBsdCBzZWN0aW9uICgicHJvY2VkdXJlIGxpbmthZ2UgdGFibGUiKSBpcyBhIFBVU0gsCi0gICAgLy8gICAtIGFuIGV4Y2VwdGlvbiB0aGF0IGp1bXBzIGludG8gdGhlIGtlcm5lbCB2ZWN0b3IgZW50cnkgcG9pbnQKLSAgICAvLyAgICAgaXMgYWxzbyBhIHB1c2guCi0gICAgLy8gCi0gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIG9mZnNldCBpcyBub24temVybyBhbmQgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0gICAgLy8gaXMgYSBieCBvciBzb21lIG5vbi1icmFuY2ggaW5zdHJ1Y3Rpb24sIHRoZW4gaXQncyBhIFBPUC4KLSAgICAvLwotICAgIC8vIFRoZXJlJ3MgYW5vdGhlciBzcGVjaWFsIGNhc2UgdGhhdCBjb21lcyB1cC4gIFRoZSB1c2VyIGNvZGUKLSAgICAvLyBtaWdodCBleGVjdXRlIGFuIGluc3RydWN0aW9uIHRoYXQgcmV0dXJucyBidXQgYmVmb3JlIHRoZSBwYwotICAgIC8vIHN0YXJ0cyBleGVjdXRpbmcgaW4gdGhlIGNhbGxlciwgYSBrZXJuZWwgaW50ZXJydXB0IG9jY3Vycy4KLSAgICAvLyBCdXQgaXQgbWF5IGJlIGhhcmQgdG8gdGVsbCBpZiB0aGlzIGlzIGEgcmV0dXJuIHVudGlsIGFmdGVyCi0gICAgLy8gdGhlIGtlcm5lbCBpbnRlcnJ1cHQgY29kZSBpcyBkb25lIGFuZCByZXR1cm5zIHRvIHVzZXIgc3BhY2UuCi0gICAgLy8gU28gd2Ugc2F2ZSB0aGUgbGFzdCB1c2VyIGJhc2ljIGJsb2NrIGFuZCBsb29rIGF0IGl0IHdoZW4KLSAgICAvLyB3ZSBjb21lIGJhY2sgaW50byB1c2VyIHNwYWNlLgotCi0gICAgY29uc3QgdWludDMyX3Qga0lzS2VybmVsUmVnaW9uID0gcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbjsKLQotICAgIGlmICgoKG1QcmV2RnVuY3Rpb24tPnJlZ2lvbi0+ZmxhZ3MgJiBrSXNLZXJuZWxSZWdpb24pID09IDApCi0gICAgICAgICYmIChmdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIGtJc0tlcm5lbFJlZ2lvbikpIHsKLSAgICAgICAgLy8gV2UganVzdCBzd2l0Y2hlZCBpbnRvIHRoZSBrZXJuZWwuICBTYXZlIHRoZSBwcmV2aW91cwotICAgICAgICAvLyB1c2VyLW1vZGUgYmFzaWMgYmxvY2sgYW5kIGZ1bmN0aW9uLgotICAgICAgICBtVXNlckV2ZW50ID0gbVByZXZFdmVudDsKLSAgICAgICAgbVVzZXJGdW5jdGlvbiA9IG1QcmV2RnVuY3Rpb247Ci0gICAgfSBlbHNlIGlmICgobVByZXZGdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIGtJc0tlcm5lbFJlZ2lvbikKLSAgICAgICAgICAgICAgICYmICgoZnVuY3Rpb24tPnJlZ2lvbi0+ZmxhZ3MgJiBrSXNLZXJuZWxSZWdpb24pID09IDApKSB7Ci0gICAgICAgIC8vIFdlIGp1c3Qgc3dpdGNoZWQgZnJvbSBrZXJuZWwgdG8gdXNlciBtb2RlLgotICAgICAgICByZXR1cm4gUE9QOwotICAgIH0KLQotICAgIGFjdGlvbiA9IFBVU0g7Ci0gICAgaWYgKG9mZnNldCAhPSAwICYmIG1QcmV2RnVuY3Rpb24gIT0gJm1EdW1teUZ1bmN0aW9uKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBqdW1waW5nIGludG8gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLCBzbyB0aGlzIGlzCi0gICAgICAgIC8vIHByb2JhYmx5IGEgcmV0dXJuLCBub3QgYSBmdW5jdGlvbiBjYWxsLiAgQnV0IGxvb2sgYXQgdGhlCi0gICAgICAgIC8vIHByZXZpb3VzIGluc3RydWN0aW9uIGZpcnN0IHRvIHNlZSBpZiBpdCB3YXMgYSBicmFuY2gtYW5kLWxpbmsuCi0KLSAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3QgYSBicmFuY2ggKGFuZCBub3QgYQotICAgICAgICAvLyBicmFuY2gtYW5kLWxpbmspIHRoZW4gUE9QOyBvciBpZiBpdCBpcyBhICJieCIgaW5zdHJ1Y3Rpb24KLSAgICAgICAgLy8gdGhlbiBQT1AgYmVjYXVzZSB0aGF0IGlzIHVzZWQgdG8gcmV0dXJuIGZyb20gZnVuY3Rpb25zLgotICAgICAgICBpZiAoIWlzQnJhbmNoKG9wKSB8fCBvcCA9PSBPUF9CWCB8fCBvcCA9PSBPUF9USFVNQl9CWCkgewotICAgICAgICAgICAgYWN0aW9uID0gUE9QOwotICAgICAgICB9IGVsc2UgaWYgKGlzQnJhbmNoKG9wKSAmJiAhaXNCcmFuY2hMaW5rKG9wKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIG5vcm1hbCBicmFuY2ggdG8gYQotICAgICAgICAgICAgLy8gbG9jYWwgc3ltYm9sIHRoZW4gZG9uJ3QgY291bnQgaXQgYXMgYSBwdXNoIG9yIGEgcG9wLgotICAgICAgICAgICAgYWN0aW9uID0gTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmdW5jdGlvbi0+ZmxhZ3MgJiBzeW1ib2xfdHlwZTo6a0lzVmVjdG9yVGFibGUpCi0gICAgICAgICAgICBhY3Rpb24gPSBQVVNIOwotICAgIH0KLSAgICByZXR1cm4gYWN0aW9uOwotfQotCi0KLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotdm9pZCBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+Ojpkb1B1c2goQkJFdmVudCAqZXZlbnQsIHN5bWJvbF90eXBlICpmdW5jdGlvbikKLXsKLSAgICB1aW50NjRfdCB0aW1lID0gZXZlbnQtPnRpbWUgLSBtU2tpcHBlZFRpbWU7Ci0KLSAgICAvLyBDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3cKLSAgICBpZiAobVRvcCA+PSBtTnVtRnJhbWVzKSB7Ci0gICAgICAgIC8vIERvbid0IHNob3cgdGhlIHN0YWNrIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIGdlbmVyYXRlcyBhIGxvdAotICAgICAgICAvLyBvZiBvdXRwdXQgYW5kIHRoaXMgaXMgc2VlbiBieSB1c2VycyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGVuCi0gICAgICAgIC8vIHBvc3QtcHJvY2Vzc2luZyB0aGUgdHJhY2UuIEJ1dCB0aGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgotI2lmIDAKLSAgICAgICAgc2hvd1N0YWNrKHN0ZGVycik7Ci0jZW5kaWYKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogc3RhY2sgb3ZlcmZsb3cgKCVkIGZyYW1lcylcbiIsIG1Ub3ApOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8vIENvbXB1dGUgdGhlIHJldHVybiBhZGRyZXNzIGhlcmUgYmVjYXVzZSB3ZSBtYXkgbmVlZCB0byBjaGFuZ2UKLSAgICAvLyBpdCBpZiB3ZSBhcmUgcG9wcGluZyBvZmYgYSBmcmFtZSBmb3IgYSB2ZWN0b3IgdGFibGUuCi0gICAgaW50IG51bUJ5dGVzOwotICAgIGlmIChtUHJldkV2ZW50LmlzX3RodW1iKSB7Ci0gICAgICAgIG51bUJ5dGVzID0gbVByZXZFdmVudC5udW1faW5zbnMgPDwgMTsKLSAgICB9IGVsc2UgewotICAgICAgICBudW1CeXRlcyA9IG1QcmV2RXZlbnQubnVtX2luc25zIDw8IDI7Ci0gICAgfQotICAgIHVpbnQzMl90IHJldEFkZHIgPSBtUHJldkV2ZW50LmJiX2FkZHIgKyBudW1CeXRlczsKLQotICAgIC8vIElmIHRoaXMgaXMgYSBKYXZhIG1ldGhvZCB0aGVuIHNldCB0aGUgcmV0dXJuIGFkZHJlc3MgdG8gemVyby4KLSAgICAvLyBXZSB3b24ndCBiZSB1c2luZyBpdCBmb3IgcG9wcGluZyB0aGUgbWV0aG9kIGFuZCBpdCBtYXkgbGVhZAotICAgIC8vIHRvIGZhbHNlIG1hdGNoZXMgd2hlbiBzZWFyY2hpbmcgdGhlIHN0YWNrLgotICAgIGlmIChmdW5jdGlvbi0+dm1fc3ltICE9IE5VTEwpIHsKLSAgICAgICAgcmV0QWRkciA9IDA7Ci0gICAgfQotCi0jaWYgMAotICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seS4gIFNob3cgdGhlIHN0YWNrIGJlZm9yZSBlbnRlcmluZyB0aGUga2VybmVsCi0gICAgLy8gZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUuCi0gICAgaWYgKGZ1bmN0aW9uLT5mbGFncyAmIHN5bWJvbF90eXBlOjprSXNWZWN0b3JTdGFydCkgewotICAgICAgICBwcmludGYoInN0YWNrIGJlZm9yZSBlbnRlcmluZyBleGNlcHRpb25cbiIpOwotICAgICAgICBzaG93U3RhY2soc3RkZXJyKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIElmIHRoZSB0b3Agb2Ygc3RhY2sgaXMgYSB2ZWN0b3IgdGFibGUsIHRoZW4gcG9wIGl0Ci0gICAgLy8gb2ZmIGJlZm9yZSBwdXNoaW5nIG9uIHRoZSBuZXcgZnVuY3Rpb24uICBBbHNvLCBjaGFuZ2UgdGhlCi0gICAgLy8gcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBuZXcgZnVuY3Rpb24gdG8gdGhlIHJldHVybiBhZGRyZXNzCi0gICAgLy8gZnJvbSB0aGUgdmVjdG9yIHRhYmxlLgotICAgIGlmIChtVG9wID4gMAotICAgICAgICAmJiAobUZyYW1lc1ttVG9wIC0gMV0uZnVuY3Rpb24tPmZsYWdzICYgc3ltYm9sX3R5cGU6OmtJc1ZlY3RvclRhYmxlKSkgewotICAgICAgICByZXRBZGRyID0gbUZyYW1lc1ttVG9wIC0gMV0uYWRkcjsKLSAgICAgICAgZG9TaW1wbGVQb3AodGltZSk7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDMyX3Qga0lzS2VybmVsUmVnaW9uID0gcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbjsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSBmdW5jdGlvbiwgRjEsCi0gICAgLy8gY2FsbHMgYW5vdGhlciBmdW5jdGlvbiwgRjIsIGJ1dCB0aGUgYmVmb3JlIEYyIGNhbiBzdGFydAotICAgIC8vIGV4ZWN1dGluZywgaXQgdGFrZXMgYSBwYWdlIGZhdWx0IChvbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KLSAgICAvLyBpbiBGMikuICBUaGUga2VybmVsIGlzIGVudGVyZWQsIGhhbmRsZXMgdGhlIHBhZ2UgZmF1bHQsIGFuZAotICAgIC8vIHRoZW4gcmV0dXJucyB0byB0aGUgY2FsbGVkIGZ1bmN0aW9uLiAgVGhlIHByb2JsZW0gaXMgdGhhdAotICAgIC8vIHRoaXMgbG9va3MgbGlrZSBhIG5ldyBmdW5jdGlvbiBjYWxsIHRvIEYyIGZyb20gdGhlIGtlcm5lbC4KLSAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgY2xlYW5zIHVwIHRoZSBzdGFjayBieSBwb3BwaW5nIHRoZQotICAgIC8vIGtlcm5lbCBmcmFtZXMgYmFjayB0byBGMSAoYnV0IG5vdCBpbmNsdWRpbmcgRjEpLiAgVGhlCi0gICAgLy8gcmV0dXJuIGFkZHJlc3MgZm9yIEYyIGFsc28gaGFzIHRvIGJlIGZpeGVkIHVwIHRvIHBvaW50IHRvCi0gICAgLy8gRjEgaW5zdGVhZCBvZiB0aGUga2VybmVsLgotICAgIC8vCi0gICAgLy8gV2UgZGV0ZWN0IHRoaXMgY2FzZSBieSBjaGVja2luZyBpZiB0aGUgcHJldmlvdXMgYmFzaWMgYmxvY2sKLSAgICAvLyB3YXMgaW4gdGhlIGtlcm5lbCBhbmQgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2sgaXMgbm90LgotICAgIGlmICgobVByZXZGdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIGtJc0tlcm5lbFJlZ2lvbikKLSAgICAgICAgJiYgKChmdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIGtJc0tlcm5lbFJlZ2lvbikgPT0gMCkKLSAgICAgICAgJiYgbVRvcCA+IDApIHsKLSAgICAgICAgLy8gV2UgYXJlIHN3aXRjaGluZyBmcm9tIGtlcm5lbCBtb2RlIHRvIHVzZXIgbW9kZS4KLSNpZiAwCi0gICAgICAgIC8vIEZvciBkZWJ1Z2dpbmcuCi0gICAgICAgIHByaW50ZigiICBkb1B1c2goKTogcG9wcGluZyB0byB1c2VyIG1vZGUsIGJiX2FkZHI6IDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgIGV2ZW50LT5iYl9hZGRyKTsKLSAgICAgICAgc2hvd1N0YWNrKHN0ZGVycik7Ci0jZW5kaWYKLSAgICAgICAgZG8gewotICAgICAgICAgICAgLy8gUG9wIG9mZiB0aGUga2VybmVsIGZyYW1lcyB1bnRpbCB3ZSByZWFjaCB0aGUgb25lIHRoYXQKLSAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgZXhjZXB0aW9uLgotICAgICAgICAgICAgZG9TaW1wbGVQb3AodGltZSk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHN0YWNrIGZyYW1lIGlzIHRoZSBvbmUgdGhhdCBjYXVzZWQgYW4KLSAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aGVuIHN0b3AgcG9wcGluZyBmcmFtZXMuCi0gICAgICAgICAgICBpZiAobVRvcCA+IDAKLSAgICAgICAgICAgICAgICAmJiAobUZyYW1lc1ttVG9wIC0gMV0uZmxhZ3MgJiBGUkFNRTo6a0NhdXNlZEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtRnJhbWVzW21Ub3AgLSAxXS5mbGFncyAmPSB+RlJBTUU6OmtDYXVzZWRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgcmV0QWRkciA9IG1GcmFtZXNbbVRvcF0uYWRkcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAobVRvcCA+IDApOwotI2lmIDAKLSAgICAgICAgLy8gRm9yIGRlYnVnZ2luZwotICAgICAgICBwcmludGYoIiAgZG9QdXNoKCkgcG9wcGluZyB0byBsZXZlbCAlZCwgdXNpbmcgcmV0QWRkciAweCUwOHhcbiIsCi0gICAgICAgICAgICAgICBtVG9wLCByZXRBZGRyKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8vIElmIHdlIGFyZSBzdGFydGluZyBhbiBleGNlcHRpb24gaGFuZGxlciwgdGhlbiBtYXJrIHRoZSBwcmV2aW91cwotICAgIC8vIHN0YWNrIGZyYW1lIHNvIHRoYXQgd2Uga25vdyB3aGVyZSB0byByZXR1cm4gd2hlbiB0aGUgZXhjZXB0aW9uCi0gICAgLy8gaGFuZGxlciBmaW5pc2hlcy4KLSAgICBpZiAoKGZ1bmN0aW9uLT5mbGFncyAmIHN5bWJvbF90eXBlOjprSXNWZWN0b3JTdGFydCkgJiYgbVRvcCA+IDApCi0gICAgICAgIG1GcmFtZXNbbVRvcCAtIDFdLmZsYWdzIHw9IEZSQU1FOjprQ2F1c2VkRXhjZXB0aW9uOwotCi0gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGJlaW5nIHB1c2hlZCBpcyBhIEphdmEgbWV0aG9kLCB0aGVuIG1hcmsgaXQgb24KLSAgICAvLyB0aGUgc3RhY2sgc28gdGhhdCB3ZSBkb24ndCBwb3AgaXQgb2ZmIHVudGlsIHdlIGdldCBhIG1hdGNoaW5nCi0gICAgLy8gdHJhY2UgcmVjb3JkIGZyb20gdGhlIG1ldGhvZCB0cmFjZSBmaWxlLgotICAgIGludCBmbGFncyA9IDA7Ci0gICAgaWYgKGZ1bmN0aW9uLT52bV9zeW0gIT0gTlVMTCkgewotICAgICAgICBmbGFncyA9IEZSQU1FOjprSW50ZXJwcmV0ZWQ7Ci0gICAgfQotICAgIGRvU2ltcGxlUHVzaChmdW5jdGlvbiwgcmV0QWRkciwgdGltZSwgZmxhZ3MpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLXZvaWQgQ2FsbFN0YWNrPEZSQU1FLCBCQVNFPjo6ZG9TaW1wbGVQdXNoKHN5bWJvbF90eXBlICpmdW5jdGlvbiwgdWludDMyX3QgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsIGludCBmbGFncykKLXsKLSAgICAvLyBDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3cKLSAgICBpZiAobVRvcCA+PSBtTnVtRnJhbWVzKSB7Ci0gICAgICAgIHNob3dTdGFjayhzdGRlcnIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IHN0YWNrIGZyYW1lcyAoJWQpXG4iLCBtVG9wKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBtRnJhbWVzW21Ub3BdLmFkZHIgPSBhZGRyOwotICAgIG1GcmFtZXNbbVRvcF0uZnVuY3Rpb24gPSBmdW5jdGlvbjsKLSAgICBtRnJhbWVzW21Ub3BdLmZsYWdzID0gZmxhZ3M7Ci0gICAgbUZyYW1lc1ttVG9wXS50aW1lID0gdGltZTsKLSAgICBtRnJhbWVzW21Ub3BdLmdsb2JhbF90aW1lID0gdGltZSArIG1Ta2lwcGVkVGltZTsKLQotICAgIG1GcmFtZXNbbVRvcF0ucHVzaChtVG9wLCB0aW1lLCB0aGlzKTsKLSAgICBtVG9wICs9IDE7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotdm9pZCBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+Ojpkb1NpbXBsZVBvcCh1aW50NjRfdCB0aW1lKQotewotICAgIGlmIChtVG9wIDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Ub3AgLT0gMTsKLSAgICBtRnJhbWVzW21Ub3BdLnBvcChtVG9wLCB0aW1lLCB0aGlzKTsKLQotICAgIGlmIChtTmF0aXZlT25seSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gSWYgdGhlIHN0YWNrIGlzIGVtcHR5LCB0aGVuIGFsbG93IG1vcmUgbmF0aXZlIGZyYW1lcy4KLSAgICAvLyBPdGhlcndpc2UsIGlmIHdlIGFyZSB0cmFuc2l0aW9uaW5nIGZyb20gSmF2YSB0byBuYXRpdmUsIHRoZW4gYWxsb3cKLSAgICAvLyBtb3JlIG5hdGl2ZSBmcmFtZXMuCi0gICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIG5hdGl2ZSB0byBKYXZhLCB0aGVuIGRpc2FsbG93Ci0gICAgLy8gbW9yZSBuYXRpdmUgZnJhbWVzLgotICAgIGlmIChtVG9wID09IDApIHsKLSAgICAgICAgbUFsbG93TmF0aXZlRnJhbWVzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIG5ld2VySXNKYXZhID0gKG1GcmFtZXNbbVRvcF0uZmxhZ3MgJiBGUkFNRTo6a0ludGVycHJldGVkKSAhPSAwOwotICAgICAgICBib29sIG9sZGVySXNKYXZhID0gKG1GcmFtZXNbbVRvcCAtIDFdLmZsYWdzICYgRlJBTUU6OmtJbnRlcnByZXRlZCkgIT0gMDsKLSAgICAgICAgaWYgKG5ld2VySXNKYXZhICYmICFvbGRlcklzSmF2YSkgewotICAgICAgICAgICAgLy8gV2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBKYXZhIHRvIG5hdGl2ZQotICAgICAgICAgICAgbUFsbG93TmF0aXZlRnJhbWVzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghbmV3ZXJJc0phdmEgJiYgb2xkZXJJc0phdmEpIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSB0cmFuc2l0aW9uaW5nIGZyb20gbmF0aXZlIHRvIEphdmEKLSAgICAgICAgICAgIG1BbGxvd05hdGl2ZUZyYW1lcyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLXZvaWQgQ2FsbFN0YWNrPEZSQU1FLCBCQVNFPjo6ZG9Qb3AoQkJFdmVudCAqZXZlbnQsIHN5bWJvbF90eXBlICpmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIG1ldGhvZEFjdGlvbikKLXsKLSAgICB1aW50NjRfdCB0aW1lID0gZXZlbnQtPnRpbWUgLSBtU2tpcHBlZFRpbWU7Ci0KLSAgICAvLyBTZWFyY2ggYmFja3dhcmQgb24gdGhlIHN0YWNrIGZvciBhIG1hdGNoaW5nIHJldHVybiBhZGRyZXNzLgotICAgIC8vIFRoZSBtb3N0IGNvbW1vbiBjYXNlIGlzIHRoYXQgd2UgcG9wIG9uZSBzdGFjayBmcmFtZSwgYnV0Ci0gICAgLy8gc29tZXRpbWVzIHdlIHBvcCBtb3JlIHRoYW4gb25lLgotICAgIGludCBzdGFja0xldmVsOwotICAgIGJvb2wgYWxsb3dNZXRob2RQb3AgPSAobWV0aG9kQWN0aW9uID09IFBPUCk7Ci0gICAgZm9yIChzdGFja0xldmVsID0gbVRvcCAtIDE7IHN0YWNrTGV2ZWwgPj0gMDsgLS1zdGFja0xldmVsKSB7Ci0gICAgICAgIGlmIChldmVudC0+YmJfYWRkciA9PSBtRnJhbWVzW3N0YWNrTGV2ZWxdLmFkZHIpIHsKLSAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrLgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGZyYW1lIGNhdXNlZCBhbiBleGNlcHRpb24sIHRoZW4gZG8gbm90IHBvcAotICAgICAgICAvLyB0aGlzIHN0YWNrIGZyYW1lLgotICAgICAgICBpZiAobUZyYW1lc1tzdGFja0xldmVsXS5mbGFncyAmIEZSQU1FOjprUG9wQmFycmllcikgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEphdmEgbWV0aG9kLCB0aGVuIGFsbG93IGEgcG9wIG9ubHkgaWYgd2UKLSAgICAgICAgICAgIC8vIGhhdmUgYSBtYXRjaGluZyB0cmFjZSByZWNvcmQuCi0gICAgICAgICAgICBpZiAobUZyYW1lc1tzdGFja0xldmVsXS5mbGFncyAmIEZSQU1FOjprSW50ZXJwcmV0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dNZXRob2RQb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgYXQgbW9zdCBvbmUgbWV0aG9kIHBvcAotICAgICAgICAgICAgICAgICAgICBhbGxvd01ldGhvZFBvcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFja0xldmVsICs9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2hpbmcgcmV0dXJuIGFkZHJlc3MgdGhlbiBzZWFyY2ggdGhlIHN0YWNrCi0gICAgLy8gYWdhaW4gZm9yIGEgbWF0Y2hpbmcgZnVuY3Rpb24uCi0gICAgaWYgKHN0YWNrTGV2ZWwgPCAwIHx8IGV2ZW50LT5iYl9hZGRyICE9IG1GcmFtZXNbc3RhY2tMZXZlbF0uYWRkcikgewotICAgICAgICBib29sIGFsbG93TWV0aG9kUG9wID0gKG1ldGhvZEFjdGlvbiA9PSBQT1ApOwotICAgICAgICBmb3IgKHN0YWNrTGV2ZWwgPSBtVG9wIC0gMTsgc3RhY2tMZXZlbCA+PSAwOyAtLXN0YWNrTGV2ZWwpIHsKLSAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgc3RhY2sgZnJhbWUuCi0gICAgICAgICAgICBpZiAoZnVuY3Rpb24gPT0gbUZyYW1lc1tzdGFja0xldmVsXS5mdW5jdGlvbikgewotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcgZnVuY3Rpb24uICBXZSB3YW50IHRvIHBvcCB1cCB0byBidXQgbm90Ci0gICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoaXMgZnJhbWUuICBCdXQgYWxsb3cgcG9wcGluZyB0aGlzIGZyYW1lIGlmIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIGl0c2VsZiBhbmQgd2UgaGF2ZSBhIG1ldGhvZCBwb3AuCi0gICAgICAgICAgICAgICAgaWYgKGFsbG93TWV0aG9kUG9wICYmIGZ1bmN0aW9uID09IG1QcmV2RnVuY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcG9wIHRoaXMgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwb3AgdGhpcyBmcmFtZQotICAgICAgICAgICAgICAgIHN0YWNrTGV2ZWwgKz0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFjayBmcmFtZSBjYXVzZWQgYW4gZXhjZXB0aW9uLCB0aGVuIGRvIG5vdCBwb3AKLSAgICAgICAgICAgIC8vIHRoaXMgc3RhY2sgZnJhbWUuCi0gICAgICAgICAgICBpZiAobUZyYW1lc1tzdGFja0xldmVsXS5mbGFncyAmIEZSQU1FOjprUG9wQmFycmllcikgewotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBKYXZhIG1ldGhvZCwgdGhlbiBhbGxvdyBhIHBvcCBvbmx5IGlmIHdlCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBhIG1hdGNoaW5nIHRyYWNlIHJlY29yZC4KLSAgICAgICAgICAgICAgICBpZiAobUZyYW1lc1tzdGFja0xldmVsXS5mbGFncyAmIEZSQU1FOjprSW50ZXJwcmV0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93TWV0aG9kUG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBhdCBtb3N0IG9uZSBtZXRob2QgcG9wCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd01ldGhvZFBvcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhY2tMZXZlbCArPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFja0xldmVsIDwgMCkKLSAgICAgICAgICAgIHN0YWNrTGV2ZWwgPSAwOwotICAgIH0KLQotICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoaW5nIHN0YWNrIGZyYW1lLCB3ZSB3aWxsIHBvcAotICAgIC8vIHRoZSB3aG9sZSBzdGFjayAodW5sZXNzIHRoZXJlIGlzIGEgSmF2YSBtZXRob2Qgb3IgZXhjZXB0aW9uCi0gICAgLy8gZnJhbWUgb24gdGhlIHN0YWNrKS4gIFRoaXMgaXMgaW50ZW50aW9uYWwgYmVjYXVzZSB3ZSBtYXkgaGF2ZQotICAgIC8vIHN0YXJ0ZWQgdGhlIHRyYWNlIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhlY3V0aW5nIHByb2dyYW0gdGhhdCBpcwotICAgIC8vIHJldHVybmluZyB1cCB0aGUgc3RhY2sgYW5kIHdlIGRvIG5vdCBrbm93IHRoZSB3aG9sZSBzdGFjay4gIFNvCi0gICAgLy8gdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGlzIHRvIGVtcHR5IHRoZSBzdGFjay4KLQotICAgIC8vIElmIHdlIGFyZSBlbXB0eWluZyB0aGUgc3RhY2ssIHRoZW4gYWRkIHRoZSBjdXJyZW50IGZ1bmN0aW9uCi0gICAgLy8gb24gdG9wLiAgSWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHRvcCBvZgotICAgIC8vIHN0YWNrLCB0aGVuIGF2b2lkIGFuIGV4dHJhbmVvdXMgcG9wIGFuZCBwdXNoLgotICAgIGlmIChzdGFja0xldmVsID09IDAgJiYgbUZyYW1lc1swXS5mdW5jdGlvbiA9PSBmdW5jdGlvbikKLSAgICAgICAgc3RhY2tMZXZlbCA9IDE7Ci0KLSNpZiAwCi0gICAgLy8gSWYgd2UgYXJlIHBvcHBpbmcgb2ZmIGEgbGFyZ2UgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcywgdGhlbgotICAgIC8vIHdlIG1pZ2h0IGhhdmUgYSBidWcuCi0gICAgaWYgKG1Ub3AgLSBzdGFja0xldmVsID4gNykgewotICAgICAgICBwcmludGYoInBvcHBpbmcgdGhydSBsZXZlbCAlZFxuIiwgc3RhY2tMZXZlbCk7Ci0gICAgICAgIHNob3dTdGFjayhzdGRlcnIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gUG9wIHRoZSBzdGFjayBmcmFtZXMKLSAgICBmb3IgKGludCBpaSA9IG1Ub3AgLSAxOyBpaSA+PSBzdGFja0xldmVsOyAtLWlpKQotICAgICAgICBkb1NpbXBsZVBvcCh0aW1lKTsKLQotICAgIC8vIENsZWFyIHRoZSAiY2F1c2VkIGV4Y2VwdGlvbiIgYml0IG9uIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lCi0gICAgaWYgKG1Ub3AgPiAwKSB7Ci0gICAgICAgIG1GcmFtZXNbbVRvcCAtIDFdLmZsYWdzICY9IH5GUkFNRTo6a0NhdXNlZEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvLyBBbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBGMSBjYWxscyBGMiBhbmQgRjIgcmV0dXJucyB0bwotICAgIC8vIEYxLCBidXQgYmVmb3JlIHdlIGNhbiBleGVjdXRlIGFueSBpbnN0cnVjdGlvbnMgaW4gRjEsIHdlCi0gICAgLy8gc3dpdGNoIHRvIHRoZSBrZXJuZWwuICBUaGVuIHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIGtlcm5lbAotICAgIC8vIHdlIHdhbnQgdG8gcG9wIG9mZiBGMiBmcm9tIHRoZSBzdGFjayBpbnN0ZWFkIG9mIHB1c2hpbmcgRjEKLSAgICAvLyBvbiB0b3Agb2YgRjIuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCB3ZSBzYXZlZCB0aGUgbGFzdAotICAgIC8vIHVzZXItbW9kZSBiYXNpYyBibG9jayB3aGVuIHdlIGVudGVyZWQgdGhlIGtlcm5lbCAoaW4KLSAgICAvLyB0aGUgZ2V0QWN0aW9uKCkgZnVuY3Rpb24pIGFuZCBub3cgd2UgY2FuIGNoZWNrIHRvIHNlZSBpZgotICAgIC8vIHRoYXQgd2FzIGEgcmV0dXJuIHRvIEYxIGluc3RlYWQgb2YgYSBjYWxsLiAgV2UgdXNlIHRoZQotICAgIC8vIGdldEFjdGlvbigpIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGlzLgotICAgIGNvbnN0IHVpbnQzMl90IGtJc0tlcm5lbFJlZ2lvbiA9IHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb247Ci0gICAgaWYgKChtUHJldkZ1bmN0aW9uLT5yZWdpb24tPmZsYWdzICYga0lzS2VybmVsUmVnaW9uKQotICAgICAgICAmJiAoKGZ1bmN0aW9uLT5yZWdpb24tPmZsYWdzICYga0lzS2VybmVsUmVnaW9uKSA9PSAwKSkgewotICAgICAgICBtUHJldkV2ZW50ID0gbVVzZXJFdmVudDsKLSAgICAgICAgbVByZXZGdW5jdGlvbiA9IG1Vc2VyRnVuY3Rpb247Ci0gICAgICAgIGlmIChnZXRBY3Rpb24oZXZlbnQsIGZ1bmN0aW9uKSA9PSBQT1ApIHsKLSAgICAgICAgICAgIC8vIFdlIG1heSBuZWVkIHRvIHBvcCBtb3JlIHRoYW4gb25lIGZyYW1lLCBzbyBqdXN0Ci0gICAgICAgICAgICAvLyBjYWxsIGRvUG9wKCkgYWdhaW4uICBUaGlzIHdvbid0IGJlIGFuIGluZmluaXRlIGxvb3AKLSAgICAgICAgICAgIC8vIGhlcmUgYmVjYXVzZSB3ZSBjaGFuZ2VkIG1QcmV2RXZlbnQgdG8gdGhlIGxhc3QKLSAgICAgICAgICAgIC8vIHVzZXItbW9kZSBldmVudC4KLSAgICAgICAgICAgIGRvUG9wKGV2ZW50LCBmdW5jdGlvbiwgbWV0aG9kQWN0aW9uKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGU8Y2xhc3MgRlJBTUUsIGNsYXNzIEJBU0U+Ci12b2lkIENhbGxTdGFjazxGUkFNRSwgQkFTRT46OnBvcEFsbCh1aW50NjRfdCB0aW1lKQotewotICAgIHRpbWUgLT0gbVNraXBwZWRUaW1lOwotICAgIHdoaWxlIChtVG9wICE9IDApIHsKLSAgICAgICAgZG9TaW1wbGVQb3AodGltZSk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBGUkFNRSwgY2xhc3MgQkFTRT4KLXZvaWQgQ2FsbFN0YWNrPEZSQU1FLCBCQVNFPjo6ZG9NZXRob2RQb3AoQkJFdmVudCAqZXZlbnQsIHVpbnQzMl90IGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZsYWdzKQotewotICAgIHVpbnQ2NF90IHRpbWUgPSBldmVudC0+dGltZSAtIG1Ta2lwcGVkVGltZTsKLQotICAgIC8vIFNlYXJjaCB0aGUgc3RhY2sgZnJvbSB0aGUgdG9wIGRvd24gZm9yIGEgZnJhbWUgdGhhdCBjb250YWlucyBhCi0gICAgLy8gbWF0Y2hpbmcgbWV0aG9kLgotICAgIGludCBzdGFja0xldmVsOwotICAgIGZvciAoc3RhY2tMZXZlbCA9IG1Ub3AgLSAxOyBzdGFja0xldmVsID49IDA7IC0tc3RhY2tMZXZlbCkgewotICAgICAgICBpZiAobUZyYW1lc1tzdGFja0xldmVsXS5mbGFncyAmIGZsYWdzKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhIG5hdGl2ZSBtZXRob2QsIHRoZW4gZG9uJ3QgYm90aGVyIHRyeWluZwotICAgICAgICAgICAgLy8gdG8gbWF0Y2ggdGhlIGFkZHJlc3MuCi0gICAgICAgICAgICBpZiAoZmxhZ3MgPT0gRlJBTUU6OmtTdGFydE5hdGl2ZSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHN5bWJvbF90eXBlICpmdW5jID0gbUZyYW1lc1tzdGFja0xldmVsXS5mdW5jdGlvbjsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ldGhvZEFkZHIgPSBmdW5jLT5yZWdpb24tPmJhc2VfYWRkciArIGZ1bmMtPmFkZHI7Ci0gICAgICAgICAgICBpZiAobWV0aG9kQWRkciA9PSBhZGRyKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBmb3VuZCBhIG1hdGNoaW5nIGZyYW1lIHRoZW4gcG9wIHRoZSBzdGFjayB1cCB0byBhbmQgaW5jbHVkaW5nCi0gICAgLy8gdGhhdCBmcmFtZS4KLSAgICBpZiAoc3RhY2tMZXZlbCA+PSAwKSB7Ci0gICAgICAgIC8vIFBvcCB0aGUgc3RhY2sgZnJhbWVzCi0gICAgICAgIGZvciAoaW50IGlpID0gbVRvcCAtIDE7IGlpID49IHN0YWNrTGV2ZWw7IC0taWkpCi0gICAgICAgICAgICBkb1NpbXBsZVBvcCh0aW1lKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotdm9pZCBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+Ojpkb01ldGhvZEFjdGlvbihCQkV2ZW50ICpldmVudCwgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uKQotewotICAgIC8vIElmIHRoZSBldmVudHMgZ2V0IGFoZWFkIG9mIHRoZSBtZXRob2QgdHJhY2UsIHRoZW4gcmVhZCBhaGVhZCB1bnRpbCB3ZQotICAgIC8vIHN5bmMgdXAgYWdhaW4uICBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgaXMgYSBwb3Agb2YgYSBtZXRob2QgaW4gdGhlCi0gICAgLy8gbWV0aG9kIHRyYWNlIGZvciB3aGljaCB3ZSBkb24ndCBoYXZlIGEgcHJldmlvdXMgcHVzaC4gIFN1Y2ggYW4gdW5tYXRjaGVkCi0gICAgLy8gcG9wIGNhbiBoYXBwZW4gYmVjYXVzZSB0aGUgdXNlciBjYW4gc3RhcnQgdHJhY2luZyBhdCBhbnkgdGltZSBhbmQgc28KLSAgICAvLyB0aGVyZSBtaWdodCBhbHJlYWR5IGJlIGEgc3RhY2sgd2hlbiB3ZSBzdGFydCB0cmFjaW5nLgotICAgIHdoaWxlIChldmVudC0+dGltZSA+PSBzTmV4dE1ldGhvZC50aW1lKSB7Ci0gICAgICAgIHNDdXJyZW50TWV0aG9kID0gc05leHRNZXRob2Q7Ci0gICAgICAgIGlmIChtVHJhY2UtPlJlYWRNZXRob2QoJnNOZXh0TWV0aG9kKSkgewotICAgICAgICAgICAgc05leHRNZXRob2QudGltZSA9IH4wdWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50LT50aW1lID49IHNDdXJyZW50TWV0aG9kLnRpbWUgJiYgZXZlbnQtPnBpZCA9PSBzQ3VycmVudE1ldGhvZC5waWQpIHsKLSAgICAgICAgdWludDY0X3QgdGltZSA9IGV2ZW50LT50aW1lIC0gbVNraXBwZWRUaW1lOwotICAgICAgICBpbnQgZmxhZ3MgPSBzQ3VycmVudE1ldGhvZC5mbGFnczsKLSAgICAgICAgaWYgKGZsYWdzID09IGtNZXRob2RFbnRlcikgewotICAgICAgICAgICAgZG9TaW1wbGVQdXNoKGZ1bmN0aW9uLCAwLCB0aW1lLCBGUkFNRTo6a0ludGVycHJldGVkKTsKLSAgICAgICAgICAgIG1BbGxvd05hdGl2ZUZyYW1lcyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IGtOYXRpdmVFbnRlcikgewotICAgICAgICAgICAgZG9TaW1wbGVQdXNoKGZ1bmN0aW9uLCAwLCB0aW1lLCBGUkFNRTo6a1N0YXJ0TmF0aXZlKTsKLSAgICAgICAgICAgIG1BbGxvd05hdGl2ZUZyYW1lcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0ga01ldGhvZEV4aXQgfHwgZmxhZ3MgPT0ga01ldGhvZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgZG9NZXRob2RQb3AoZXZlbnQsIHNDdXJyZW50TWV0aG9kLmFkZHIsIEZSQU1FOjprSW50ZXJwcmV0ZWQpOwotICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IGtOYXRpdmVFeGl0IHx8IGZsYWdzID09IGtOYXRpdmVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIGRvTWV0aG9kUG9wKGV2ZW50LCBzQ3VycmVudE1ldGhvZC5hZGRyLCBGUkFNRTo6a1N0YXJ0TmF0aXZlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2gsIHNvIHJlYWQgdGhlIG5leHQgcmVjb3JkLiBXaGVuIHdlIGdldCB0byB0aGUgZW5kCi0gICAgICAgIC8vIG9mIHRoZSB0cmFjZSwgd2Ugc2V0IHRoZSB0aW1lIHRvIHRoZSBtYXhpbXVtIHZhbHVlICh+MCkuCi0gICAgICAgIHNDdXJyZW50TWV0aG9kID0gc05leHRNZXRob2Q7Ci0gICAgICAgIGlmIChzTmV4dE1ldGhvZC50aW1lICE9IH4wdWxsICYmIG1UcmFjZS0+UmVhZE1ldGhvZCgmc05leHRNZXRob2QpKSB7Ci0gICAgICAgICAgICBzTmV4dE1ldGhvZC50aW1lID0gfjB1bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEZSQU1FLCBjbGFzcyBCQVNFPgotdm9pZCBDYWxsU3RhY2s8RlJBTUUsIEJBU0U+OjpzaG93U3RhY2soRklMRSAqc3RyZWFtKQotewotICAgIGZwcmludGYoc3RyZWFtLCAibVRvcDogJWQgc2tpcHBlZFRpbWU6ICVsbHVcbiIsIG1Ub3AsIG1Ta2lwcGVkVGltZSk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1Ub3A7ICsraWkpIHsKLSAgICAgICAgdWludDMyX3QgYWRkciA9IG1GcmFtZXNbaWldLmZ1bmN0aW9uLT5hZGRyOwotICAgICAgICBhZGRyICs9IG1GcmFtZXNbaWldLmZ1bmN0aW9uLT5yZWdpb24tPnZzdGFydDsKLSAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICVkOiB0ICVkIGd0ICVkIGYgJXggMHglMDh4IDB4JTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICBpaSwgbUZyYW1lc1tpaV0udGltZSwgbUZyYW1lc1tpaV0uZ2xvYmFsX3RpbWUsCi0gICAgICAgICAgICAgICAgbUZyYW1lc1tpaV0uZmxhZ3MsCi0gICAgICAgICAgICAgICAgbUZyYW1lc1tpaV0uYWRkciwgYWRkciwKLSAgICAgICAgICAgICAgICBtRnJhbWVzW2lpXS5mdW5jdGlvbi0+bmFtZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogQ0FMTF9TVEFDS19IICovCmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvY2hlY2tfc3RhY2suY3BwIGIvZW11bGF0b3IvcXRvb2xzL2NoZWNrX3N0YWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkMTRkMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvY2hlY2tfc3RhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJiaXR2ZWN0b3IuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0jaW5jbHVkZSAiYXJtZGlzLmgiCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXI8PiBUcmFjZVJlYWRlclR5cGU7Ci0KLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLWlubC5oIgotI2luY2x1ZGUgImNhbGxzdGFjay5oIgotCi10eXBlZGVmIENhbGxTdGFjazxTdGFja0ZyYW1lPHN5bWJvbF90eXBlPiA+IENhbGxTdGFja1R5cGU7Ci0KLXZvaWQgY29tcGFyZVN0YWNrcyh1aW50NjRfdCB0aW1lLCBpbnQgcGlkKTsKLXZvaWQgZHVtcFN0YWNrcyhpbnQgcGlkKTsKLQotc3RhdGljIHVpbnQ2NF90IGRlYnVnVGltZTsKLXN0YXRpYyBjb25zdCBpbnQga051bVN0YWNrRnJhbWVzID0gNTAwOwotc3RhdGljIGNvbnN0IGludCBrTWF4VGhyZWFkcyA9ICgzMiAqIDEwMjQpOwotQ2FsbFN0YWNrVHlwZSAqZVN0YWNrc1trTWF4VGhyZWFkc107Ci0KLWludCBudW1FcnJvcnM7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhFcnJvcnMgPSAzOwotCi1zdHJ1Y3QgZnJhbWUgewotICAgIHVpbnQ2NF90ICAgIHRpbWU7Ci0gICAgdWludDMyX3QgICAgYWRkcjsKLSAgICBjb25zdCBjaGFyICAqbmFtZTsKLSAgICBib29sICAgICAgICBpc05hdGl2ZTsKLQotICAgIGZyYW1lKHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNOYXRpdmUpIHsKLSAgICAgICAgdGhpcy0+dGltZSA9IHRpbWU7Ci0gICAgICAgIHRoaXMtPmFkZHIgPSBhZGRyOwotICAgICAgICB0aGlzLT5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy0+aXNOYXRpdmUgPSBpc05hdGl2ZTsKLSAgICB9Ci19OwotCi1jbGFzcyBTdGFjayB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGludCBrTWF4RnJhbWVzID0gMTAwMDsKLSAgICBpbnQgdG9wOwotICAgIGZyYW1lICpmcmFtZXNba01heEZyYW1lc107Ci0KLSAgICBTdGFjaygpIHsKLSAgICAgICAgdG9wID0gMDsKLSAgICB9Ci0KLSAgICB2b2lkICAgICAgICBwdXNoKGZyYW1lICpwZnJhbWUpOwotICAgIGZyYW1lKiAgICAgIHBvcCgpOwotICAgIHZvaWQgICAgICAgIGR1bXAoKTsKLX07Ci0KLXZvaWQgU3RhY2s6OnB1c2goZnJhbWUgKnBmcmFtZSkgewotICAgIGlmICh0b3AgPT0ga01heEZyYW1lcykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBzdGFjayBvdmVyZmxvd1xuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGZyYW1lc1t0b3BdID0gcGZyYW1lOwotICAgIHRvcCArPSAxOwotfQotCi1mcmFtZSAqU3RhY2s6OnBvcCgpIHsKLSAgICBpZiAodG9wIDw9IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHRvcCAtPSAxOwotICAgIHJldHVybiBmcmFtZXNbdG9wXTsKLX0KLQotU3RhY2sgKm1TdGFja3Nba01heFRocmVhZHNdOwotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHRyYWNlX25hbWUgZWxmX2ZpbGVcbiIsCi0gICAgICAgICAgICBwcm9ncmFtKTsKLSAgICBPcHRpb25zVXNhZ2UoKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoYXJnYyAtIG9wdGluZCAhPSAyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGNoYXIgKnFlbXVfdHJhY2VfZmlsZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGNoYXIgKmVsZl9maWxlID0gYXJndltvcHRpbmQrK107Ci0KLSAgICBUcmFjZVJlYWRlclR5cGUgKmV0cmFjZSA9IG5ldyBUcmFjZVJlYWRlclR5cGU7Ci0gICAgZXRyYWNlLT5PcGVuKHFlbXVfdHJhY2VfZmlsZSk7Ci0gICAgZXRyYWNlLT5SZWFkS2VybmVsU3ltYm9scyhlbGZfZmlsZSk7Ci0gICAgZXRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgVHJhY2VSZWFkZXJUeXBlICptdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXJUeXBlOwotICAgIG10cmFjZS0+T3BlbihxZW11X3RyYWNlX2ZpbGUpOwotICAgIG10cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIG10cmFjZS0+U2V0Um9vdChyb290KTsKLQotICAgIEJCRXZlbnQgZXZlbnQ7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQkJFdmVudCBpZ25vcmVkOwotICAgICAgICBzeW1ib2xfdHlwZSAqZnVuY3Rpb247Ci0gICAgICAgIE1ldGhvZFJlYyBtZXRob2RfcmVjb3JkOwotICAgICAgICBzeW1ib2xfdHlwZSAqc3ltOwotICAgICAgICBUcmFjZVJlYWRlclR5cGU6OlByb2Nlc3NTdGF0ZSAqcHJvYzsKLSAgICAgICAgZnJhbWUgKnBmcmFtZTsKLQotICAgICAgICBpZiAobXRyYWNlLT5SZWFkTWV0aG9kU3ltYm9sKCZtZXRob2RfcmVjb3JkLCAmc3ltLCAmcHJvYykpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIUlzVmFsaWRQaWQocHJvYy0+cGlkKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIEdldCB0aGUgc3RhY2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZAotICAgICAgICBTdGFjayAqbVN0YWNrID0gbVN0YWNrc1twcm9jLT5waWRdOwotCi0gICAgICAgIC8vIElmIHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCwgdGhlbiBhbGxvY2F0ZSBhIG5ldyBvbmUuCi0gICAgICAgIGlmIChtU3RhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgbVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICBtU3RhY2tzW3Byb2MtPnBpZF0gPSBtU3RhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmxhZ3MgPSBtZXRob2RfcmVjb3JkLmZsYWdzOwotICAgICAgICBpZiAoZmxhZ3MgPT0ga01ldGhvZEVudGVyIHx8IGZsYWdzID09IGtOYXRpdmVFbnRlcikgewotICAgICAgICAgICAgcGZyYW1lID0gbmV3IGZyYW1lKG1ldGhvZF9yZWNvcmQudGltZSwgbWV0aG9kX3JlY29yZC5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bSA9PSBOVUxMID8gTlVMTDogc3ltLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9yZWNvcmQuZmxhZ3MgPT0ga05hdGl2ZUVudGVyKTsKLSAgICAgICAgICAgIG1TdGFjay0+cHVzaChwZnJhbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGZyYW1lID0gbVN0YWNrLT5wb3AoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwZnJhbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoR2V0TmV4dFZhbGlkRXZlbnQoZXRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmZnVuY3Rpb24pKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKGV2ZW50LmJiX251bSA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHN0YWNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgICAgICAgIENhbGxTdGFja1R5cGUgKmVTdGFjayA9IGVTdGFja3NbZXZlbnQucGlkXTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0LCB0aGVuIGFsbG9jYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAgIGlmIChlU3RhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVTdGFjayA9IG5ldyBDYWxsU3RhY2tUeXBlKGV2ZW50LnBpZCwga051bVN0YWNrRnJhbWVzLCBldHJhY2UpOwotICAgICAgICAgICAgICAgIGVTdGFja3NbZXZlbnQucGlkXSA9IGVTdGFjazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWJ1Z1RpbWUgIT0gMCAmJiBldmVudC50aW1lID49IGRlYnVnVGltZSkKLSAgICAgICAgICAgICAgICBwcmludGYoInRpbWU6ICVsbHUgZGVidWcgdGltZTogJWxsZFxuIiwgZXZlbnQudGltZSwgZGVidWdUaW1lKTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGFjawotICAgICAgICAgICAgZVN0YWNrLT51cGRhdGVTdGFjaygmZXZlbnQsIGZ1bmN0aW9uKTsKLSAgICAgICAgfSB3aGlsZSAoZXZlbnQudGltZSA8IG1ldGhvZF9yZWNvcmQudGltZSk7Ci0KLSAgICAgICAgY29tcGFyZVN0YWNrcyhldmVudC50aW1lLCBldmVudC5waWQpOwotICAgIH0KLQotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBrTWF4VGhyZWFkczsgKytpaSkgewotICAgICAgICBpZiAoZVN0YWNrc1tpaV0pCi0gICAgICAgICAgICBlU3RhY2tzW2lpXS0+cG9wQWxsKGV2ZW50LnRpbWUpOwotICAgIH0KLQotICAgIGRlbGV0ZSBldHJhY2U7Ci0gICAgZGVsZXRlIG10cmFjZTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBjb21wYXJlU3RhY2tzKHVpbnQ2NF90IHRpbWUsIGludCBwaWQpIHsKLSAgICBDYWxsU3RhY2tUeXBlICplU3RhY2sgPSBlU3RhY2tzW3BpZF07Ci0gICAgU3RhY2sgKm1TdGFjayA9IG1TdGFja3NbcGlkXTsKLSAgICBmcmFtZSAqKm1GcmFtZXMgPSBtU3RhY2stPmZyYW1lczsKLSAgICBmcmFtZSAqbWZyYW1lOwotCi0gICAgaW50IG1Ub3AgPSBtU3RhY2stPnRvcDsKLSAgICBpbnQgZVRvcCA9IGVTdGFjay0+bVRvcDsKLSAgICBDYWxsU3RhY2tUeXBlOjpmcmFtZV90eXBlICplRnJhbWVzID0gZVN0YWNrLT5tRnJhbWVzOwotCi0gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBub24tbmF0aXZlIG1ldGhvZHMgKGllLCBKYXZhIG1ldGhvZHMpIG9uIHRoZQotICAgIC8vIEphdmEgbWV0aG9kIHN0YWNrCi0gICAgaW50IG51bU5vbk5hdGl2ZU1ldGhvZHMgPSAwOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtVG9wOyArK2lpKSB7Ci0gICAgICAgIGlmICghbUZyYW1lc1tpaV0tPmlzTmF0aXZlKSB7Ci0gICAgICAgICAgICBudW1Ob25OYXRpdmVNZXRob2RzICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIEphdmEgbWV0aG9kcyBvbiB0aGUgbmF0aXZlIHN0YWNrCi0gICAgaW50IG51bU1ldGhvZHMgPSAwOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBlVG9wOyArK2lpKSB7Ci0gICAgICAgIGlmIChlRnJhbWVzW2lpXS5mbGFncyAmIENhbGxTdGFja1R5cGU6OmZyYW1lX3R5cGU6OmtJbnRlcnByZXRlZCkgewotICAgICAgICAgICAgbnVtTWV0aG9kcyArPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG51bWJlciBvZiBKYXZhIG1ldGhvZHMgb24gYm90aCBzdGFja3MgYXJlIHRoZSBzYW1lLgotICAgIC8vIEFsbG93IHRoZSBuYXRpdmUgc3RhY2sgdG8gaGF2ZSBvbmUgbGVzcyBKYXZhIG1ldGhvZCBiZWNhdXNlIHRoZQotICAgIC8vIG5hdGl2ZSBzdGFjayBtaWdodCBiZSBwdXNoaW5nIGEgbmF0aXZlIGZ1bmN0aW9uIGZpcnN0LgotICAgIGlmIChudW1Ob25OYXRpdmVNZXRob2RzICE9IG51bU1ldGhvZHMgJiYgbnVtTm9uTmF0aXZlTWV0aG9kcyAhPSBudW1NZXRob2RzICsgMSkgewotICAgICAgICBwcmludGYoIlxuRGlmZiBhdCB0aW1lICVsbHUgcGlkICVkOiBub24tbmF0aXZlICVkIG51bU1ldGhvZHMgJWRcbiIsCi0gICAgICAgICAgICAgICB0aW1lLCBwaWQsIG51bU5vbk5hdGl2ZU1ldGhvZHMsIG51bU1ldGhvZHMpOwotICAgICAgICBkdW1wU3RhY2tzKHBpZCk7Ci0gICAgICAgIG51bUVycm9ycyArPSAxOwotICAgICAgICBpZiAobnVtRXJyb3JzID49IGtNYXhFcnJvcnMpCi0gICAgICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBKYXZhIG1ldGhvZHMgb24gdGhlIG1ldGhvZCBzdGFjayBhcmUgdGhlIHNhbWUKLSAgICAvLyBhcyB0aGUgSmF2YSBtZXRob2RzIG9uIHRoZSBuYXRpdmUgc3RhY2suCi0gICAgaW50IG1JbmRleCA9IDA7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGVUb3A7ICsraWkpIHsKLSAgICAgICAgLy8gSWdub3JlIG5hdGl2ZSBmdW5jdGlvbnMgb24gdGhlIG5hdGl2ZSBzdGFjay4KLSAgICAgICAgaWYgKChlRnJhbWVzW2lpXS5mbGFncyAmIENhbGxTdGFja1R5cGU6OmZyYW1lX3R5cGU6OmtJbnRlcnByZXRlZCkgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB1aW50MzJfdCBhZGRyID0gZUZyYW1lc1tpaV0uZnVuY3Rpb24tPmFkZHI7Ci0gICAgICAgIGFkZHIgKz0gZUZyYW1lc1tpaV0uZnVuY3Rpb24tPnJlZ2lvbi0+dnN0YXJ0OwotICAgICAgICB3aGlsZSAobUluZGV4IDwgbVRvcCAmJiBtRnJhbWVzW21JbmRleF0tPmlzTmF0aXZlKSB7Ci0gICAgICAgICAgICBtSW5kZXggKz0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUluZGV4ID49IG1Ub3ApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGFkZHIgIT0gbUZyYW1lc1ttSW5kZXhdLT5hZGRyKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxuRGlmZiBhdCB0aW1lICVsbHUgcGlkICVkOiBmcmFtZSAlZFxuIiwgdGltZSwgcGlkLCBpaSk7Ci0gICAgICAgICAgICBkdW1wU3RhY2tzKHBpZCk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1JbmRleCArPSAxOwotICAgIH0KLX0KLQotdm9pZCBkdW1wU3RhY2tzKGludCBwaWQpIHsKLSAgICBDYWxsU3RhY2tUeXBlICplU3RhY2sgPSBlU3RhY2tzW3BpZF07Ci0gICAgU3RhY2sgKm1TdGFjayA9IG1TdGFja3NbcGlkXTsKLSAgICBmcmFtZSAqbWZyYW1lOwotCi0gICAgaW50IG1Ub3AgPSBtU3RhY2stPnRvcDsKLSAgICBwcmludGYoIlxuSmF2YSBtZXRob2Qgc3RhY2tcbiIpOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtVG9wOyBpaSsrKSB7Ci0gICAgICAgIG1mcmFtZSA9IG1TdGFjay0+ZnJhbWVzW2lpXTsKLSAgICAgICAgY29uc3QgY2hhciAqbmF0aXZlID0gbWZyYW1lLT5pc05hdGl2ZSA/ICJuIiA6ICIgIjsKLSAgICAgICAgcHJpbnRmKCIgICVzICVkOiAlbGx1IDB4JXggJXNcbiIsCi0gICAgICAgICAgICAgICBuYXRpdmUsIGlpLCBtZnJhbWUtPnRpbWUsIG1mcmFtZS0+YWRkciwKLSAgICAgICAgICAgICAgIG1mcmFtZS0+bmFtZSA9PSBOVUxMID8gIiIgOiBtZnJhbWUtPm5hbWUpOwotICAgIH0KLQotICAgIGludCBlVG9wID0gZVN0YWNrLT5tVG9wOwotICAgIENhbGxTdGFja1R5cGU6OmZyYW1lX3R5cGUgKmVGcmFtZXMgPSBlU3RhY2stPm1GcmFtZXM7Ci0gICAgaW50IG1JbmRleCA9IDA7Ci0gICAgcHJpbnRmKCJcbk5hdGl2ZSBzdGFja1xuIik7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGVUb3A7ICsraWkpIHsKLSAgICAgICAgdWludDMyX3QgYWRkciA9IGVGcmFtZXNbaWldLmZ1bmN0aW9uLT5hZGRyOwotICAgICAgICBhZGRyICs9IGVGcmFtZXNbaWldLmZ1bmN0aW9uLT5yZWdpb24tPnZzdGFydDsKLSAgICAgICAgY29uc3QgY2hhciAqbWFya2VyID0gIiAiOwotICAgICAgICBpZiAoZUZyYW1lc1tpaV0uZmxhZ3MgJiBDYWxsU3RhY2tUeXBlOjpmcmFtZV90eXBlOjprSW50ZXJwcmV0ZWQpIHsKLSAgICAgICAgICAgIGlmIChtSW5kZXggPj0gbVRvcCB8fCBhZGRyICE9IG1TdGFjay0+ZnJhbWVzW21JbmRleF0tPmFkZHIpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXIgPSAiKiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5kZXggKz0gMTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIiAlcyAlZDogJWQgZiAlZCAweCUwOHggJXNcbiIsCi0gICAgICAgICAgICAgICBtYXJrZXIsIGlpLCBlRnJhbWVzW2lpXS50aW1lLCBlRnJhbWVzW2lpXS5mbGFncywgYWRkciwKLSAgICAgICAgICAgICAgIGVGcmFtZXNbaWldLmZ1bmN0aW9uLT5uYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvY2hlY2tfdHJhY2UuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2NoZWNrX3RyYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzM2E4Ny4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvY2hlY2tfdHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJhcm1kaXMuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXI8PiBUcmFjZVJlYWRlclR5cGU7Ci0KLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLWlubC5oIgotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga09mZnNldFRocmVzaG9sZCA9IDB4MTAwMDAwOwotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHRyYWNlX2ZpbGUgZWxmX2ZpbGVcbiIsIHByb2dyYW0pOwotICAgIE9wdGlvbnNVc2FnZSgpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICAvLyBQYXJzZSB0aGUgb3B0aW9ucwotICAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoYXJnYyAtIG9wdGluZCAhPSAyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgY2hhciAqZWxmX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBUcmFjZVJlYWRlcjw+ICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlcjw+OwotICAgIHRyYWNlLT5PcGVuKHRyYWNlX2ZpbGVuYW1lKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgc3ltYm9sX3R5cGUgKnN5bTsKLSAgICAgICAgQkJFdmVudCBldmVudDsKLSAgICAgICAgQkJFdmVudCBpZ25vcmVkOwotCi0gICAgICAgIGlmIChHZXROZXh0VmFsaWRFdmVudCh0cmFjZSwgJmV2ZW50LCAmaWdub3JlZCwgJnN5bSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGV2ZW50LmJiX251bSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vcHJpbnRmKCJ0JWxsdSBiYiAlbGxkICVkXG4iLCBldmVudC50aW1lLCBldmVudC5iYl9udW0sIGV2ZW50Lm51bV9pbnNucyk7Ci0gICAgICAgIHVpbnQ2NF90IGluc25fdGltZSA9IHRyYWNlLT5SZWFkSW5zblRpbWUoZXZlbnQudGltZSk7Ci0gICAgICAgIGlmIChpbnNuX3RpbWUgIT0gZXZlbnQudGltZSkgewotICAgICAgICAgICAgcHJpbnRmKCJ0aW1lOiAlbGx1IGluc24gdGltZTogJWxsdSBiYjogJWxsdSBhZGRyOiAweCV4IG51bV9pbnNuczogJWQsIHBpZDogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgZXZlbnQudGltZSwgaW5zbl90aW1lLCBldmVudC5iYl9udW0sIGV2ZW50LmJiX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgZXZlbnQubnVtX2luc25zLCBldmVudC5waWQpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpaSA9IDE7IGlpIDwgZXZlbnQubnVtX2luc25zOyArK2lpKSB7Ci0gICAgICAgICAgICB0cmFjZS0+UmVhZEluc25UaW1lKGV2ZW50LnRpbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlIHRyYWNlOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2NvdmVyYWdlLmNwcCBiL2VtdWxhdG9yL3F0b29scy9jb3ZlcmFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGY3MjEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2NvdmVyYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgInRyYWNlX3JlYWRlci5oIgotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMuaCIKLSNpbmNsdWRlICJvcGNvZGUuaCIKLQotY29uc3QgaW50IGtNaWxsaW9uID0gMTAwMDAwMDsKLWNvbnN0IGludCBrTUh6ID0gMjAwICoga01pbGxpb247Ci0KLXN0cnVjdCBzeW1ib2wgewotICAgIGludCAgICBudW1DYWxsczsgICAgLy8gbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCi19OwotCi10eXBlZGVmIFRyYWNlUmVhZGVyPHN5bWJvbD4gVHJhY2VSZWFkZXJUeXBlOwotCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy1pbmwuaCIKLSNpbmNsdWRlICJjYWxsc3RhY2suaCIKLQotY2xhc3MgTXlGcmFtZSA6IHB1YmxpYyBTdGFja0ZyYW1lPHN5bWJvbF90eXBlPiB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkICAgIHB1c2goaW50IHN0YWNrTGV2ZWwsIHVpbnQ2NF90IHRpbWUsIENhbGxTdGFja0Jhc2UgKmJhc2UpIHsKLSAgICAgICAgZnVuY3Rpb24tPm51bUNhbGxzICs9IDE7Ci0gICAgfQotICAgIHZvaWQgICAgcG9wKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKSB7Ci0gICAgfQotfTsKLQotdHlwZWRlZiBDYWxsU3RhY2s8TXlGcmFtZT4gQ2FsbFN0YWNrVHlwZTsKLQotc3RhdGljIGNvbnN0IGludCBrTnVtU3RhY2tGcmFtZXMgPSA1MDA7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhUaHJlYWRzID0gKDMyICogMTAyNCk7Ci1DYWxsU3RhY2tUeXBlICpzdGFja3Nba01heFRocmVhZHNdOwotCi0vLyBUaGlzIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcXNvcnQoKSB0byBzb3J0IHN5bWJvbHMKLS8vIGludG8gZGVjcmVhc2luZyBudW1iZXIgb2YgY2FsbHMuCi1pbnQgY21wX3N5bV9jYWxscyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgY29uc3Qgc3ltYm9sX3R5cGUgKnN5bWEsICpzeW1iOwotICAgIHVpbnQ2NF90IGNhbGxzMSwgY2FsbHMyOwotCi0gICAgc3ltYSA9IHN0YXRpY19jYXN0PHN5bWJvbF90eXBlIGNvbnN0ICo+KGEpOwotICAgIHN5bWIgPSBzdGF0aWNfY2FzdDxzeW1ib2xfdHlwZSBjb25zdCAqPihiKTsKLSAgICBjYWxsczEgPSBzeW1hLT5udW1DYWxsczsKLSAgICBjYWxsczIgPSBzeW1iLT5udW1DYWxsczsKLSAgICBpZiAoY2FsbHMxIDwgY2FsbHMyKQotICAgICAgICByZXR1cm4gMTsKLSAgICBpZiAoY2FsbHMxID09IGNhbGxzMikgewotICAgICAgICBpbnQgY21wID0gc3RyY21wKHN5bWEtPm5hbWUsIHN5bWItPm5hbWUpOwotICAgICAgICBpZiAoY21wID09IDApCi0gICAgICAgICAgICBjbXAgPSBzdHJjbXAoc3ltYS0+cmVnaW9uLT5wYXRoLCBzeW1iLT5yZWdpb24tPnBhdGgpOwotICAgICAgICByZXR1cm4gY21wOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8vIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBxc29ydCgpIHRvIHNvcnQgc3ltYm9scwotLy8gaW50byBhbHBoYWJldGljYWwgb3JkZXIuCi1pbnQgY21wX3N5bV9uYW1lcyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgY29uc3Qgc3ltYm9sX3R5cGUgKnN5bWEsICpzeW1iOwotCi0gICAgc3ltYSA9IHN0YXRpY19jYXN0PHN5bWJvbF90eXBlIGNvbnN0ICo+KGEpOwotICAgIHN5bWIgPSBzdGF0aWNfY2FzdDxzeW1ib2xfdHlwZSBjb25zdCAqPihiKTsKLSAgICBpbnQgY21wID0gc3RyY21wKHN5bWEtPnJlZ2lvbi0+cGF0aCwgc3ltYi0+cmVnaW9uLT5wYXRoKTsKLSAgICBpZiAoY21wID09IDApCi0gICAgICAgIGNtcCA9IHN0cmNtcChzeW1hLT5uYW1lLCBzeW1iLT5uYW1lKTsKLSAgICByZXR1cm4gY21wOwotfQotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHRyYWNlX2ZpbGUgZWxmX2ZpbGVcbiIsIHByb2dyYW0pOwotICAgIE9wdGlvbnNVc2FnZSgpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChhcmdjIC0gb3B0aW5kICE9IDIpIHsKLSAgICAgICAgVXNhZ2UoYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgY2hhciAqdHJhY2VfZmlsZW5hbWUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBjaGFyICplbGZfZmlsZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIFRyYWNlUmVhZGVyPHN5bWJvbD4gKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyPHN5bWJvbD47Ci0gICAgdHJhY2UtPk9wZW4odHJhY2VfZmlsZW5hbWUpOwotICAgIHRyYWNlLT5TZXREZW1hbmdsZShkZW1hbmdsZSk7Ci0gICAgdHJhY2UtPlJlYWRLZXJuZWxTeW1ib2xzKGVsZl9maWxlKTsKLSAgICB0cmFjZS0+U2V0Um9vdChyb290KTsKLQotICAgIEJCRXZlbnQgZXZlbnQ7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQkJFdmVudCBpZ25vcmVkOwotICAgICAgICBzeW1ib2xfdHlwZSAqZnVuY3Rpb247Ci0KLSAgICAgICAgaWYgKEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmZnVuY3Rpb24pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChldmVudC5iYl9udW0gPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIEdldCB0aGUgc3RhY2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZAotICAgICAgICBDYWxsU3RhY2tUeXBlICpwU3RhY2sgPSBzdGFja3NbZXZlbnQucGlkXTsKLQotICAgICAgICAvLyBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIHRoZW4gYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgICBpZiAocFN0YWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBTdGFjayA9IG5ldyBDYWxsU3RhY2tUeXBlKGV2ZW50LnBpZCwga051bVN0YWNrRnJhbWVzLCB0cmFjZSk7Ci0gICAgICAgICAgICBzdGFja3NbZXZlbnQucGlkXSA9IHBTdGFjazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhY2sKLSAgICAgICAgcFN0YWNrLT51cGRhdGVTdGFjaygmZXZlbnQsIGZ1bmN0aW9uKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwga01heFRocmVhZHM7ICsraWkpIHsKLSAgICAgICAgaWYgKHN0YWNrc1tpaV0pCi0gICAgICAgICAgICBzdGFja3NbaWldLT5wb3BBbGwoZXZlbnQudGltZSk7Ci0gICAgfQotCi0gICAgaW50IG5zeW1zOwotICAgIHN5bWJvbF90eXBlICpzeW1zID0gdHJhY2UtPkdldFN5bWJvbHMoJm5zeW1zKTsKLQotICAgIC8vIFNvcnQgdGhlIHN5bWJvbHMgaW50byBkZWNyZWFzaW5nIG51bWJlciBvZiBjYWxscwotICAgIHFzb3J0KHN5bXMsIG5zeW1zLCBzaXplb2Yoc3ltYm9sX3R5cGUpLCBjbXBfc3ltX25hbWVzKTsKLQotICAgIHN5bWJvbF90eXBlICpwc3ltID0gc3ltczsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnN5bXM7ICsraWksICsrcHN5bSkgewotICAgICAgICAvLyBJZ25vcmUgZnVuY3Rpb25zIHdpdGggbm9uLXplcm8gY2FsbHMKLSAgICAgICAgaWYgKHBzeW0tPm51bUNhbGxzKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWdub3JlIHNvbWUgc3ltYm9scwotICAgICAgICBpZiAoc3RyY21wKHBzeW0tPm5hbWUsICIoZW5kKSIpID09IDApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHN0cmNtcChwc3ltLT5uYW1lLCAiKHVua25vd24pIikgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoc3RyY21wKHBzeW0tPm5hbWUsICIucGx0IikgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjb25zdCBjaGFyICprc3ltID0gIiAiOwotICAgICAgICBpZiAocHN5bS0+cmVnaW9uLT5mbGFncyAmIHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb24pCi0gICAgICAgICAgICBrc3ltID0gImsiOwotICAgICAgICBwcmludGYoIiVzICVzICVzXG4iLCBrc3ltLCBwc3ltLT5uYW1lLCBwc3ltLT5yZWdpb24tPnBhdGgpOwotI2lmIDAKLSAgICAgICAgcHJpbnRmKCIjJWQgJTVkICVzICVzICVzXG4iLCBpaSArIDEsIHBzeW0tPm51bUNhbGxzLCBrc3ltLCBwc3ltLT5uYW1lLAotICAgICAgICAgICAgICAgcHN5bS0+cmVnaW9uLT5wYXRoKTsKLSNlbmRpZgotICAgIH0KLSAgICBkZWxldGVbXSBzeW1zOwotICAgIGRlbGV0ZSB0cmFjZTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2RlY29kZXIuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2RlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUzMTgxLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9kZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgImRlY29kZXIuaCIKLSNpbmNsdWRlICJ0cmFjZV9jb21tb24uaCIKLQotLy8gVGhpcyBhcnJheSBwcm92aWRlcyBhIGZhc3QgY29udmVyc2lvbiBmcm9tIHRoZSBpbml0aWFsIGJ5dGUgaW4KLS8vIGEgdmFyaW50LWVuY29kZWQgb2JqZWN0IHRvIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGF0IG9iamVjdC4KLWludCBwcmVmaXhfdG9fbGVuW10gPSB7Ci0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgOSwgOSwgMTcsIDE3Ci19OwotCi0vLyBUaGlzIGFycmF5IHByb3ZpZGVzIGEgZmFzdCBjb252ZXJzaW9uIGZyb20gdGhlIGluaXRpYWwgYnl0ZSBpbgotLy8gYSB2YXJpbnQtZW5jb2RlZCBvYmplY3QgdG8gdGhlIGluaXRpYWwgZGF0YSBiaXRzIGZvciB0aGF0IG9iamVjdC4KLWludCBwcmVmaXhfdG9fZGF0YVtdID0gewotICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCi0gICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCi0gICAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCi0gICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCi0gICAgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksCi0gICAgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsCi0gICAgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCi0gICAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksCi0gICAgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCi0gICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKLSAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKLSAgICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKLSAgICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKLSAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAotICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAotICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCi0gICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgMCwgMSwgMiwgMywgMCwgMCwgMCwgMAotfTsKLQotc2lnbmVkIGNoYXIgcHJlZml4X3RvX3NpZ25lZF9kYXRhW10gPSB7Ci0gICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCi0gICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLSAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LAotICAgIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCi0gICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLAotICAgIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCi0gICAgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwKLSAgICAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LAotICAgIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsCi0gICAgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywKLSAgICAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLAotICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCi0gICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwKLSAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKLSAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAotICAgIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsCi0gICAgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwKLSAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAotICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsCi0gICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAotICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCi0gICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwKLSAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsCi0gICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwKLSAgICAweDAwLCAweDAxLCAweGZlLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLAotfTsKLQotRGVjb2Rlcjo6RGVjb2RlcigpCi17Ci0gICAgZmlsZW5hbWVfID0gTlVMTDsKLSAgICBmc3RyZWFtXyA9IE5VTEw7Ci0gICAgbmV4dF8gPSBOVUxMOwotICAgIGVuZF8gPSBOVUxMOwotfQotCi1EZWNvZGVyOjp+RGVjb2RlcigpCi17Ci0gICAgQ2xvc2UoKTsKLSAgICBkZWxldGVbXSBmaWxlbmFtZV87Ci19Ci0KLXZvaWQgRGVjb2Rlcjo6Q2xvc2UoKQotewotICAgIGlmIChmc3RyZWFtXykgewotICAgICAgICBmY2xvc2UoZnN0cmVhbV8pOwotICAgICAgICBmc3RyZWFtXyA9IE5VTEw7Ci0gICAgfQotfQotCi12b2lkIERlY29kZXI6Ok9wZW4oY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgaWYgKGZpbGVuYW1lXyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZVtdIGZpbGVuYW1lXzsKLSAgICB9Ci0gICAgZmlsZW5hbWVfID0gbmV3IGNoYXJbc3RybGVuKGZpbGVuYW1lKSArIDFdOwotICAgIHN0cmNweShmaWxlbmFtZV8sIGZpbGVuYW1lKTsKLSAgICBmc3RyZWFtXyA9IGZvcGVuKGZpbGVuYW1lXywgInIiKTsKLSAgICBpZiAoZnN0cmVhbV8gPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoZmlsZW5hbWVfKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpbnQgcnZhbCA9IGZyZWFkKGJ1Zl8sIDEsIGtCdWZTaXplLCBmc3RyZWFtXyk7Ci0gICAgaWYgKHJ2YWwgIT0ga0J1ZlNpemUpIHsKLSAgICAgICAgaWYgKGZlcnJvcihmc3RyZWFtXykpIHsKLSAgICAgICAgICAgIHBlcnJvcihmaWxlbmFtZV8pOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZlb2YoZnN0cmVhbV8pKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgc2hvcnQgZnJlYWQoKSBiZWZvcmUgZW9mXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbmV4dF8gPSBidWZfOwotICAgIGVuZF8gPSBidWZfICsgcnZhbDsKLX0KLQotdm9pZCBEZWNvZGVyOjpGaWxsQnVmZmVyKCkKLXsKLSAgICBhc3NlcnQobmV4dF8gPD0gZW5kXyk7Ci0gIAotICAgIGlmIChlbmRfIC0gbmV4dF8gPCBrRGVjb2RpbmdTcGFjZSAmJiBlbmRfID09ICZidWZfW2tCdWZTaXplXSkgewotICAgICAgICAvLyBDb3B5IHRoZSB1bnVzZWQgYnl0ZXMgbGVmdCBhdCB0aGUgZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgIC8vIGJ1ZmZlci4KLSAgICAgICAgaW50IGxlbiA9IGVuZF8gLSBuZXh0XzsKLSAgICAgICAgaWYgKGxlbiA+IDApCi0gICAgICAgICAgICBtZW1jcHkoYnVmXywgbmV4dF8sIGxlbik7Ci0KLSAgICAgICAgLy8gUmVhZCBlbm91Z2ggYnl0ZXMgdG8gZmlsbCB1cCB0aGUgYnVmZmVyLCBpZiBwb3NzaWJsZS4KLSAgICAgICAgaW50IG5ieXRlcyA9IGtCdWZTaXplIC0gbGVuOwotICAgICAgICBpbnQgcnZhbCA9IGZyZWFkKGJ1Zl8gKyBsZW4sIDEsIG5ieXRlcywgZnN0cmVhbV8pOwotICAgICAgICBpZiAocnZhbCA8IG5ieXRlcykgewotICAgICAgICAgICAgaWYgKGZlcnJvcihmc3RyZWFtXykpIHsKLSAgICAgICAgICAgICAgICBwZXJyb3IoZmlsZW5hbWVfKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmZW9mKGZzdHJlYW1fKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBzaG9ydCBmcmVhZCgpIGJlZm9yZSBlb2ZcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZW5kXyA9ICZidWZfW2xlbiArIHJ2YWxdOwotICAgICAgICBuZXh0XyA9IGJ1Zl87Ci0gICAgfQotfQotCi12b2lkIERlY29kZXI6OlJlYWQoY2hhciAqZGVzdCwgaW50IGxlbikKLXsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgbmJ5dGVzID0gZW5kXyAtIG5leHRfOwotICAgICAgICBpZiAobmJ5dGVzID09IDApIHsKLSAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKLSAgICAgICAgICAgIG5ieXRlcyA9IGVuZF8gLSBuZXh0XzsKLSAgICAgICAgICAgIGlmIChuYnl0ZXMgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobmJ5dGVzID4gbGVuKQotICAgICAgICAgICAgbmJ5dGVzID0gbGVuOwotICAgICAgICBtZW1jcHkoZGVzdCwgbmV4dF8sIG5ieXRlcyk7Ci0gICAgICAgIGRlc3QgKz0gbmJ5dGVzOwotICAgICAgICBsZW4gLT0gbmJ5dGVzOwotICAgICAgICBuZXh0XyArPSBuYnl0ZXM7Ci0gICAgfQotfQotCi0vLyBEZWNvZGUgYSB2YXJpbnQtZW5jb2RlZCBvYmplY3Qgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KLS8vIHRoZSBhcnJheSAiYnVmXyIgYW5kIHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBhcyBhIDY0LWJpdCBpbnRlZ2VyLgotLy8gQSB2YXJpbnQtZW5jb2RlZCBvYmplY3QgaGFzIGFuIGluaXRpYWwgcHJlZml4IHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55Ci0vLyBkYXRhIGJpdHMgZm9sbG93LiAgSWYgdGhlIGZpcnN0IGJpdCBpcyB6ZXJvLCBmb3IgZXhhbXBsZSwgdGhlbiB0aGVyZQotLy8gYXJlIDcgZGF0YSBiaXRzIHRoYXQgZm9sbG93LiAgVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBwcmVmaXggdmFsdWVzCi0vLyBhbmQgY29ycmVzcG9uZGluZyBkYXRhIGJpdHMuCi0vLwotLy8gUHJlZml4ICAgICBCeXRlcyAgRGF0YSBiaXRzCi0vLyAwICAgICAgICAgIDEgICAgICA3Ci0vLyAxMCAgICAgICAgIDIgICAgICAxNAotLy8gMTEwICAgICAgICAzICAgICAgMjEKLS8vIDExMTAgICAgICAgNCAgICAgIDI4Ci0vLyAxMTExMCAgICAgIDUgICAgICAzNQotLy8gMTExMTEwICAgICA2ICAgICAgNDIKLS8vIDExMTExMTAwICAgOSAgICAgIDY0Ci0vLyAxMTExMTEwMSAgIHJlc2VydmVkCi0vLyAxMTExMTExMCAgIHJlc2VydmVkCi0vLyAxMTExMTExMSAgIHJlc2VydmVkCi1pbnQ2NF90IERlY29kZXI6OkRlY29kZShib29sIGlzX3NpZ25lZCkKLXsKLSAgICBpbnQ2NF90IHZhbDY0OwotCi0gICAgaWYgKGVuZF8gLSBuZXh0XyA8IGtEZWNvZGluZ1NwYWNlKQotICAgICAgICBGaWxsQnVmZmVyKCk7Ci0KLSNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KLSAgICB1aW50OF90IGJ5dGUwID0gKm5leHRfOwotCi0gICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZGVjb2RlIGJhc2VkIG9uIHRoZSBmaXJzdCBieXRlLgotICAgIGludCBsZW4gPSBwcmVmaXhfdG9fbGVuW2J5dGUwXTsKLQotICAgIGlmIChuZXh0XyArIGxlbiA+IGVuZF8pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZGVjb2RpbmcgcGFzdCBlbmQgb2YgZmlsZS5cbiIsIGZpbGVuYW1lXyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLy8gR2V0IHRoZSBmaXJzdCBkYXRhIGJ5dGUuCi0gICAgaWYgKGlzX3NpZ25lZCkKLSAgICAgICAgdmFsNjQgPSBwcmVmaXhfdG9fc2lnbmVkX2RhdGFbYnl0ZTBdOwotICAgIGVsc2UKLSAgICAgICAgdmFsNjQgPSBwcmVmaXhfdG9fZGF0YVtieXRlMF07Ci0KLSAgICBuZXh0XyArPSAxOwotICAgIGZvciAoaW50IGlpID0gMTsgaWkgPCBsZW47ICsraWkpIHsKLSAgICAgICAgdmFsNjQgPSAodmFsNjQgPDwgOCkgfCAqbmV4dF8rKzsKLSAgICB9Ci0jZWxzZQotICAgIC8vIElmIHdlIGFyZSBvbiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgdGhlbiB1c2UgbGFyZ2UsIHVuYWxpZ25lZCBsb2Fkcy4KLSAgICB1aW50NjRfdCBkYXRhID0gKihyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4obmV4dF8pKTsKLSAgICB1aW50OF90IGJ5dGUwID0gZGF0YTsKLSAgICBkYXRhID0gYnN3YXA2NChkYXRhKTsKLQotICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGRlY29kZSBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZS4KLSAgICBpbnQgbGVuID0gcHJlZml4X3RvX2xlbltieXRlMF07Ci0KLSAgICBpZiAobmV4dF8gKyBsZW4gPiBlbmRfKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGRlY29kaW5nIHBhc3QgZW5kIG9mIGZpbGUuXG4iLCBmaWxlbmFtZV8pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgZmlyc3QgZGF0YSBieXRlLgotICAgIGlmIChpc19zaWduZWQpCi0gICAgICAgIHZhbDY0ID0gcHJlZml4X3RvX3NpZ25lZF9kYXRhW2J5dGUwXTsKLSAgICBlbHNlCi0gICAgICAgIHZhbDY0ID0gcHJlZml4X3RvX2RhdGFbYnl0ZTBdOwotCi0gICAgc3dpdGNoIChsZW4pIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHZhbDY0ID0gKHZhbDY0IDw8IDgpIHwgKChkYXRhID4+IDQ4KSAmIDB4ZmZ1bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHZhbDY0ID0gKHZhbDY0IDw8IDE2KSB8ICgoZGF0YSA+PiA0MCkgJiAweGZmZmZ1bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHZhbDY0ID0gKHZhbDY0IDw8IDI0KSB8ICgoZGF0YSA+PiAzMikgJiAweGZmZmZmZnVsbCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgdmFsNjQgPSAodmFsNjQgPDwgMzIpIHwgKChkYXRhID4+IDI0KSAmIDB4ZmZmZmZmZmZ1bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHZhbDY0ID0gKHZhbDY0IDw8IDQwKSB8ICgoZGF0YSA+PiAxNikgJiAweGZmZmZmZmZmZmZ1bGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIGRhdGEgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPigmbmV4dF9bMV0pKTsKLSAgICAgICAgICAgIHZhbDY0ID0gYnN3YXA2NChkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBuZXh0XyArPSBsZW47Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsNjQ7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvZGVjb2Rlci5oIGIvZW11bGF0b3IvcXRvb2xzL2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5MDVmZC4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi1jbGFzcyBEZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIERlY29kZXIoKTsKLSAgfkRlY29kZXIoKTsKLQotICB2b2lkICAgICAgICAgIE9wZW4oY2hhciAqZmlsZW5hbWUpOwotICB2b2lkICAgICAgICAgIENsb3NlKCk7Ci0gIGludDY0X3QgICAgICAgRGVjb2RlKGJvb2wgaXNfc2lnbmVkKTsKLSAgdm9pZCAgICAgICAgICBSZWFkKGNoYXIgKmRlc3QsIGludCBsZW4pOwotICBib29sICAgICAgICAgIElzRU9GKCkgICAgICAgICAgeyByZXR1cm4gKGVuZF8gPT0gbmV4dF8pICYmIGZlb2YoZnN0cmVhbV8pOyB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgY29uc3QgaW50IGtCdWZTaXplID0gNDA5NjsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVjb2RpbmdTcGFjZSA9IDk7Ci0KLSAgdm9pZCAgICAgICAgICBGaWxsQnVmZmVyKCk7Ci0KLSAgY2hhciAgICAgICAgICAqZmlsZW5hbWVfOwotICBGSUxFICAgICAgICAgICpmc3RyZWFtXzsKLSAgdWludDhfdCAgICAgICBidWZfW2tCdWZTaXplXTsKLSAgdWludDhfdCAgICAgICAqbmV4dF87Ci0gIHVpbnQ4X3QgICAgICAgKmVuZF87Ci19OwpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDg2YzVmLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiZG10cmFjZS5oIgotCi1zdGF0aWMgY29uc3Qgc2hvcnQga1ZlcnNpb24gPSAyOwotCi1jb25zdCBEbVRyYWNlOjpIZWFkZXIgRG1UcmFjZTo6aGVhZGVyID0gewotICAgIDB4NTc0ZjRjNTMsIGtWZXJzaW9uLCBzaXplb2YoRG1UcmFjZTo6SGVhZGVyKSwgMExMCi19OwotCi1zdGF0aWMgY2hhciAqa2V5SGVhZGVyID0gIip2ZXJzaW9uXG4iICIyXG4iICJjbG9jaz10aHJlYWQtY3B1XG4iOwotc3RhdGljIGNoYXIgKmtleVRocmVhZEhlYWRlciA9ICIqdGhyZWFkc1xuIjsKLXN0YXRpYyBjaGFyICprZXlGdW5jdGlvbkhlYWRlciA9ICIqbWV0aG9kc1xuIjsKLXN0YXRpYyBjaGFyICprZXlFbmQgPSAiKmVuZFxuIjsKLQotRG1UcmFjZTo6RG1UcmFjZSgpIHsKLSAgICBmRGF0YSA9IE5VTEw7Ci0gICAgZlRyYWNlID0gTlVMTDsKLSAgICB0aHJlYWRzID0gbmV3IHN0ZDo6dmVjdG9yPFRocmVhZFJlY29yZCo+OwotICAgIGZ1bmN0aW9ucyA9IG5ldyBzdGQ6OnZlY3RvcjxGdW5jdGlvblJlY29yZCo+OwotfQotCi1EbVRyYWNlOjp+RG1UcmFjZSgpIHsKLSAgICBkZWxldGUgdGhyZWFkczsKLSAgICBkZWxldGUgZnVuY3Rpb25zOwotfQotCi12b2lkIERtVHJhY2U6Om9wZW4oY29uc3QgY2hhciAqZG10cmFjZV9maWxlLCB1aW50NjRfdCBzdGFydF90aW1lKQotewotICAgIGZUcmFjZSA9IGZvcGVuKGRtdHJhY2VfZmlsZSwgInciKTsKLSAgICBpZiAoZlRyYWNlID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKGRtdHJhY2VfZmlsZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBhIHRlbXBvcmFyeSBmaWxlIHRvIHdyaXRlIHRoZSBkYXRhIGludG8uCi0gICAgY2hhciB0bXBEYXRhWzMyXTsKLSAgICBzdHJjcHkodG1wRGF0YSwgIi90bXAvZG10cmFjZS1kYXRhLVhYWFhYWCIpOwotICAgIGludCBkYXRhX2ZkID0gbWtzdGVtcCh0bXBEYXRhKTsKLSAgICBpZiAoZGF0YV9mZCA8IDApIHsKLSAgICAgICAgcGVycm9yKCJDYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLy8gRW5zdXJlIGl0IGdvZXMgYXdheSBvbiBleGl0LgotICAgIHVubGluayh0bXBEYXRhKTsKLSAgICBmRGF0YSA9IGZkb3BlbihkYXRhX2ZkLCAidysiKTsKLSAgICBpZiAoZkRhdGEgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoIkNhbid0IG1ha2UgdGVtcCBkYXRhIGZpbGUiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICB3cml0ZUhlYWRlcihmRGF0YSwgc3RhcnRfdGltZSk7Ci19Ci0KLXZvaWQgRG1UcmFjZTo6Y2xvc2UoKQotewotICAgIGlmIChmVHJhY2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotICAgIHdyaXRlS2V5RmlsZShmVHJhY2UpOwotCi0gICAgLy8gVGFrZSBkb3duIGhvdyBtdWNoIGRhdGEgd2Ugd3JvdGUgdG8gdGhlIHRlbXAgZGF0YSBmaWxlLgotICAgIGxvbmcgc2l6ZSA9IGZ0ZWxsKGZEYXRhKTsKLSAgICAvLyBSZXdpbmQgdGhlIGRhdGEgZmlsZSBhbmQgYXBwZW5kIGl0cyBjb250ZW50cyB0byB0aGUgdHJhY2UgZmlsZS4KLSAgICByZXdpbmQoZkRhdGEpOwotICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKLSAgICBmcmVhZChkYXRhLCBzaXplLCAxLCBmRGF0YSk7Ci0gICAgZndyaXRlKGRhdGEsIHNpemUsIDEsIGZUcmFjZSk7Ci0gICAgZnJlZShkYXRhKTsKLSAgICBmY2xvc2UoZkRhdGEpOwotICAgIGZjbG9zZShmVHJhY2UpOwotfQotCi0vKgotICogV3JpdGUgdmFsdWVzIHRvIHRoZSBiaW5hcnkgZGF0YSBmaWxlLgotICovCi12b2lkIERtVHJhY2U6OndyaXRlMkxFKEZJTEUqIGZzdHJlYW0sIHVuc2lnbmVkIHNob3J0IHZhbCkKLXsKLSAgICBwdXRjKHZhbCAmIDB4ZmYsIGZzdHJlYW0pOwotICAgIHB1dGModmFsID4+IDgsIGZzdHJlYW0pOwotfQotCi12b2lkIERtVHJhY2U6OndyaXRlNExFKEZJTEUqIGZzdHJlYW0sIHVuc2lnbmVkIGludCB2YWwpCi17Ci0gICAgcHV0Yyh2YWwgJiAweGZmLCBmc3RyZWFtKTsKLSAgICBwdXRjKCh2YWwgPj4gOCkgJiAweGZmLCBmc3RyZWFtKTsKLSAgICBwdXRjKCh2YWwgPj4gMTYpICYgMHhmZiwgZnN0cmVhbSk7Ci0gICAgcHV0YygodmFsID4+IDI0KSAmIDB4ZmYsIGZzdHJlYW0pOwotfQotCi12b2lkIERtVHJhY2U6OndyaXRlOExFKEZJTEUqIGZzdHJlYW0sIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCi17Ci0gICAgcHV0Yyh2YWwgJiAweGZmLCBmc3RyZWFtKTsKLSAgICBwdXRjKCh2YWwgPj4gOCkgJiAweGZmLCBmc3RyZWFtKTsKLSAgICBwdXRjKCh2YWwgPj4gMTYpICYgMHhmZiwgZnN0cmVhbSk7Ci0gICAgcHV0YygodmFsID4+IDI0KSAmIDB4ZmYsIGZzdHJlYW0pOwotICAgIHB1dGMoKHZhbCA+PiAzMikgJiAweGZmLCBmc3RyZWFtKTsKLSAgICBwdXRjKCh2YWwgPj4gNDApICYgMHhmZiwgZnN0cmVhbSk7Ci0gICAgcHV0YygodmFsID4+IDQ4KSAmIDB4ZmYsIGZzdHJlYW0pOwotICAgIHB1dGMoKHZhbCA+PiA1NikgJiAweGZmLCBmc3RyZWFtKTsKLX0KLQotdm9pZCBEbVRyYWNlOjp3cml0ZUhlYWRlcihGSUxFICpmc3RyZWFtLCB1aW50NjRfdCBzdGFydFRpbWUpCi17Ci0gICAgd3JpdGU0TEUoZnN0cmVhbSwgaGVhZGVyLm1hZ2ljKTsKLSAgICB3cml0ZTJMRShmc3RyZWFtLCBoZWFkZXIudmVyc2lvbik7Ci0gICAgd3JpdGUyTEUoZnN0cmVhbSwgaGVhZGVyLm9mZnNldCk7Ci0gICAgd3JpdGU4TEUoZnN0cmVhbSwgc3RhcnRUaW1lKTsKLX0KLQotdm9pZCBEbVRyYWNlOjp3cml0ZURhdGFSZWNvcmQoRklMRSAqZnN0cmVhbSwgaW50IHRocmVhZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWV0aG9kVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxhcHNlZFRpbWUpCi17Ci0gICAgd3JpdGUyTEUoZnN0cmVhbSwgdGhyZWFkSWQpOwotICAgIHdyaXRlNExFKGZzdHJlYW0sIG1ldGhvZFZhbCk7Ci0gICAgd3JpdGU0TEUoZnN0cmVhbSwgZWxhcHNlZFRpbWUpOwotfQotCi12b2lkIERtVHJhY2U6OmFkZEZ1bmN0aW9uRW50cnkoaW50IGZ1bmN0aW9uSWQsIHVpbnQzMl90IGN5Y2xlLCB1aW50MzJfdCBwaWQpCi17Ci0gICAgd3JpdGVEYXRhUmVjb3JkKGZEYXRhLCBwaWQsIGZ1bmN0aW9uSWQsIGN5Y2xlKTsKLX0KLQotdm9pZCBEbVRyYWNlOjphZGRGdW5jdGlvbkV4aXQoaW50IGZ1bmN0aW9uSWQsIHVpbnQzMl90IGN5Y2xlLCB1aW50MzJfdCBwaWQpCi17Ci0gICAgd3JpdGVEYXRhUmVjb3JkKGZEYXRhLCBwaWQsIGZ1bmN0aW9uSWQgfCAxLCBjeWNsZSk7Ci19Ci0KLXZvaWQgRG1UcmFjZTo6YWRkRnVuY3Rpb24oaW50IGZ1bmN0aW9uSWQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgRnVuY3Rpb25SZWNvcmQgKnJlYyA9IG5ldyBGdW5jdGlvblJlY29yZDsKLSAgICByZWMtPmlkID0gZnVuY3Rpb25JZDsKLSAgICByZWMtPm5hbWUgPSBuYW1lOwotICAgIGZ1bmN0aW9ucy0+cHVzaF9iYWNrKHJlYyk7Ci19Ci0KLXZvaWQgRG1UcmFjZTo6YWRkRnVuY3Rpb24oaW50IGZ1bmN0aW9uSWQsIGNvbnN0IGNoYXIgKmNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIGNvbnN0IGNoYXIgKnNpZykKLXsKLSAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIHRoZSBzdHJpbmdzLCBwbHVzIDIgdGFiIHNlcGFyYXRvcnMgcGx1cyBudWxsIGJ5dGUuCi0gICAgLy8gV2UgY3VycmVudGx5IGRvbid0IHJlY2xhaW0gdGhpcyBzcGFjZS4KLSAgICBpbnQgbGVuID0gc3RybGVuKGNsYXp6KSArIHN0cmxlbihtZXRob2QpICsgc3RybGVuKHNpZykgKyAzOwotICAgIGNoYXIgKm5hbWUgPSBuZXcgY2hhcltsZW5dOwotICAgIHNwcmludGYobmFtZSwgIiVzXHQlc1x0JXMiLCBjbGF6eiwgbWV0aG9kLCBzaWcpOwotCi0gICAgYWRkRnVuY3Rpb24oZnVuY3Rpb25JZCwgbmFtZSk7Ci19Ci0KLXZvaWQgRG1UcmFjZTo6cGFyc2VBbmRBZGRGdW5jdGlvbihpbnQgZnVuY3Rpb25JZCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICAvLyBQYXJzZSB0aGUgIm5hbWUiIHN0cmluZyBpbnRvICJjbGFzcyIsICJtZXRob2QiIGFuZCAic2lnbmF0dXJlIi4KLSAgICAvLyBUaGUgIm5hbWUiIHN0cmluZyBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgIC8vICAgbmFtZSA9ICJqYXZhLnV0aWwuTGlua2VkTGlzdC5zaXplKClJIgotICAgIC8vIGFuZCBpdCB3aWxsIGJlIHBhcnNlZCBpbnRvIHRoaXM6Ci0gICAgLy8gICBjbGF6eiA9ICJqYXZhLnV0aWwuTGlua2VkTGlzdCIKLSAgICAvLyAgIG1ldGhvZCA9ICJzaXplIgotICAgIC8vICAgc2lnID0gIigpSSIKLQotICAgIC8vIEZpbmQgdGhlIGZpcnN0IHBhcmVudGhlc2lzLCB0aGUgc3RhcnQgb2YgdGhlIHNpZ25hdHVyZS4KLSAgICBjaGFyICpwYXJlbiA9IChjaGFyKilzdHJjaHIobmFtZSwgJygnKTsKLQotICAgIC8vIElmIG5vdCBmb3VuZCwgdGhlbiBhZGQgdGhlIG9yaWdpbmFsIG5hbWUuCi0gICAgaWYgKHBhcmVuID09IE5VTEwpIHsKLSAgICAgICAgYWRkRnVuY3Rpb24oZnVuY3Rpb25JZCwgbmFtZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDb3B5IHRoZSBzaWduYXR1cmUKLSAgICBpbnQgbGVuID0gc3RybGVuKHBhcmVuKSArIDE7Ci0gICAgY2hhciAqc2lnID0gbmV3IGNoYXJbbGVuXTsKLSAgICBzdHJjcHkoc2lnLCBwYXJlbik7Ci0KLSAgICAvLyBaZXJvIHRoZSBwYXJlbnRoZXNpcyBzbyB0aGF0IHdlIGNhbiBzZWFyY2ggYmFja3dhcmRzIGZyb20gdGhlIHNpZ25hdHVyZQotICAgICpwYXJlbiA9IDA7Ci0KLSAgICAvLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHBlcmlvZCwgdGhlIHN0YXJ0IG9mIHRoZSBtZXRob2QgbmFtZQotICAgIGNoYXIgKmRvdCA9IChjaGFyKilzdHJyY2hyKG5hbWUsICcuJyk7Ci0KLSAgICAvLyBJZiBub3QgZm91bmQsIHRoZW4gYWRkIHRoZSBvcmlnaW5hbCBuYW1lLgotICAgIGlmIChkb3QgPT0gTlVMTCB8fCBkb3QgPT0gbmFtZSkgewotICAgICAgICBkZWxldGVbXSBzaWc7Ci0gICAgICAgICpwYXJlbiA9ICcoJzsKLSAgICAgICAgYWRkRnVuY3Rpb24oZnVuY3Rpb25JZCwgbmFtZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDb3B5IHRoZSBtZXRob2QsIG5vdCBpbmNsdWRpbmcgdGhlIGRvdAotICAgIGxlbiA9IHN0cmxlbihkb3QgKyAxKSArIDE7Ci0gICAgY2hhciAqbWV0aG9kID0gbmV3IGNoYXJbbGVuXTsKLSAgICBzdHJjcHkobWV0aG9kLCBkb3QgKyAxKTsKLQotICAgIC8vIFplcm8gdGhlIGRvdCB0byBkZWxpbWl0IHRoZSBjbGFzcyBuYW1lCi0gICAgKmRvdCA9IDA7Ci0KLSAgICBhZGRGdW5jdGlvbihmdW5jdGlvbklkLCBuYW1lLCBtZXRob2QsIHNpZyk7Ci0KLSAgICAvLyBGcmVlIHRoZSBzcGFjZSB3ZSBhbGxvY2F0ZWQuCi0gICAgZGVsZXRlW10gc2lnOwotICAgIGRlbGV0ZVtdIG1ldGhvZDsKLX0KLQotdm9pZCBEbVRyYWNlOjphZGRUaHJlYWQoaW50IHRocmVhZElkLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIFRocmVhZFJlY29yZCAqcmVjID0gbmV3IFRocmVhZFJlY29yZDsKLSAgICByZWMtPmlkID0gdGhyZWFkSWQ7Ci0gICAgcmVjLT5uYW1lID0gbmFtZTsKLSAgICB0aHJlYWRzLT5wdXNoX2JhY2socmVjKTsKLX0KLQotdm9pZCBEbVRyYWNlOjp1cGRhdGVOYW1lKGludCB0aHJlYWRJZCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzdGQ6OnZlY3RvcjxUaHJlYWRSZWNvcmQqPjo6aXRlcmF0b3IgaXRlcjsKLQotICAgIGZvciAoaXRlciA9IHRocmVhZHMtPmJlZ2luKCk7IGl0ZXIgIT0gdGhyZWFkcy0+ZW5kKCk7ICsraXRlcikgewotICAgICAgICBpZiAoKCppdGVyKS0+aWQgPT0gdGhyZWFkSWQpIHsKLSAgICAgICAgICAgICgqaXRlciktPm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERtVHJhY2U6OndyaXRlS2V5RmlsZShGSUxFICpmc3RyZWFtKQotewotICAgIGZ3cml0ZShrZXlIZWFkZXIsIHN0cmxlbihrZXlIZWFkZXIpLCAxLCBmc3RyZWFtKTsKLSAgICB3cml0ZVRocmVhZHMoZnN0cmVhbSk7Ci0gICAgd3JpdGVGdW5jdGlvbnMoZnN0cmVhbSk7Ci0gICAgZndyaXRlKGtleUVuZCwgc3RybGVuKGtleUVuZCksIDEsIGZzdHJlYW0pOwotfQotCi12b2lkIERtVHJhY2U6OndyaXRlVGhyZWFkcyhGSUxFICpmc3RyZWFtKQotewotICAgIHN0ZDo6dmVjdG9yPFRocmVhZFJlY29yZCo+OjppdGVyYXRvciBpdGVyOwotCi0gICAgZndyaXRlKGtleVRocmVhZEhlYWRlciwgc3RybGVuKGtleVRocmVhZEhlYWRlciksIDEsIGZzdHJlYW0pOwotICAgIGZvciAoaXRlciA9IHRocmVhZHMtPmJlZ2luKCk7IGl0ZXIgIT0gdGhyZWFkcy0+ZW5kKCk7ICsraXRlcikgewotICAgICAgICBmcHJpbnRmKGZzdHJlYW0sICIlZFx0JXNcbiIsICgqaXRlciktPmlkLCAoKml0ZXIpLT5uYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG1UcmFjZTo6d3JpdGVGdW5jdGlvbnMoRklMRSAqZnN0cmVhbSkKLXsKLSAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblJlY29yZCo+OjppdGVyYXRvciBpdGVyOwotCi0gICAgZndyaXRlKGtleUZ1bmN0aW9uSGVhZGVyLCBzdHJsZW4oa2V5RnVuY3Rpb25IZWFkZXIpLCAxLCBmc3RyZWFtKTsKLSAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnMtPmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zLT5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICAgIGZwcmludGYoZnN0cmVhbSwgIjB4JXhcdCVzXG4iLCAoKml0ZXIpLT5pZCwgKCppdGVyKS0+bmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuaCBiL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjA5MjEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBETVRSQUNFX0gKLSNkZWZpbmUgRE1UUkFDRV9ICi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWNsYXNzIERtVHJhY2UgewotICBwdWJsaWM6Ci0gICAgc3RydWN0IEhlYWRlciB7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtYWdpYzsKLSAgICAgICAgdWludDE2X3QgICAgICAgIHZlcnNpb247Ci0gICAgICAgIHVpbnQxNl90ICAgICAgICBvZmZzZXQ7Ci0gICAgICAgIHVpbnQ2NF90ICAgICAgICBkYXRlX3RpbWU7Ci0gICAgfTsKLQotICAgIERtVHJhY2UoKTsKLSAgICB+RG1UcmFjZSgpOwotCi0gICAgdm9pZCAgICAgICAgb3Blbihjb25zdCBjaGFyICpkbXRyYWNlX2ZpbGUsIHVpbnQ2NF90IHN0YXJ0VGltZSk7Ci0gICAgdm9pZCAgICAgICAgY2xvc2UoKTsKLSAgICB2b2lkICAgICAgICBhZGRGdW5jdGlvbkVudHJ5KGludCBtZXRob2RJZCwgdWludDMyX3QgY3ljbGUsIHVpbnQzMl90IHBpZCk7Ci0gICAgdm9pZCAgICAgICAgYWRkRnVuY3Rpb25FeGl0KGludCBtZXRob2RJZCwgdWludDMyX3QgY3ljbGUsIHVpbnQzMl90IHBpZCk7Ci0gICAgdm9pZCAgICAgICAgYWRkRnVuY3Rpb24oaW50IGZ1bmN0aW9uSWQsIGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHZvaWQgICAgICAgIGFkZEZ1bmN0aW9uKGludCBmdW5jdGlvbklkLCBjb25zdCBjaGFyICpjbGF6eiwgY29uc3QgY2hhciAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNpZyk7Ci0gICAgdm9pZCAgICAgICAgcGFyc2VBbmRBZGRGdW5jdGlvbihpbnQgZnVuY3Rpb25JZCwgY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgdm9pZCAgICAgICAgYWRkVGhyZWFkKGludCB0aHJlYWRJZCwgY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgdm9pZCAgICAgICAgdXBkYXRlTmFtZShpbnQgdGhyZWFkSWQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gIHByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IEhlYWRlciBoZWFkZXI7Ci0KLSAgICBzdHJ1Y3QgVGhyZWFkUmVjb3JkIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGlkOwotICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWU7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBGdW5jdGlvblJlY29yZCB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBpZDsKLSAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lOwotICAgIH07Ci0KLSAgICB2b2lkICAgICAgICB3cml0ZTJMRShGSUxFKiBmc3RyZWFtLCB1bnNpZ25lZCBzaG9ydCB2YWwpOwotICAgIHZvaWQgICAgICAgIHdyaXRlNExFKEZJTEUqIGZzdHJlYW0sIHVuc2lnbmVkIGludCB2YWwpOwotICAgIHZvaWQgICAgICAgIHdyaXRlOExFKEZJTEUqIGZzdHJlYW0sIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpOwotICAgIHZvaWQgICAgICAgIHdyaXRlSGVhZGVyKEZJTEUgKmZzdHJlYW0sIHVpbnQ2NF90IHN0YXJ0VGltZSk7Ci0gICAgdm9pZCAgICAgICAgd3JpdGVEYXRhUmVjb3JkKEZJTEUgKmZzdHJlYW0sIGludCB0aHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1ldGhvZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsYXBzZWRUaW1lKTsKLSAgICB2b2lkICAgICAgICB3cml0ZUtleUZpbGUoRklMRSAqZnN0cmVhbSk7Ci0gICAgdm9pZCAgICAgICAgd3JpdGVUaHJlYWRzKEZJTEUgKmZzdHJlYW0pOwotICAgIHZvaWQgICAgICAgIHdyaXRlRnVuY3Rpb25zKEZJTEUgKmZzdHJlYW0pOwotCi0gICAgRklMRSAgICAgICAgKmZEYXRhOwotICAgIEZJTEUgICAgICAgICpmVHJhY2U7Ci0gICAgc3RkOjp2ZWN0b3I8VGhyZWFkUmVjb3JkKj4gKnRocmVhZHM7Ci0gICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25SZWNvcmQqPiAqZnVuY3Rpb25zOwotfTsKLQotI2VuZGlmICAvLyBETVRSQUNFX0gKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9kdW1wX3JlZ2lvbnMuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2R1bXBfcmVnaW9ucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Mzg5ZjkuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2R1bXBfcmVnaW9ucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInRyYWNlX3JlYWRlci5oIgotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMuaCIKLQotdHlwZWRlZiBUcmFjZVJlYWRlcjw+IFRyYWNlUmVhZGVyVHlwZTsKLQotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMtaW5sLmgiCi0KLXZvaWQgVXNhZ2UoY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gdHJhY2VfZmlsZVxuIiwgcHJvZ3JhbSk7Ci0gICAgT3B0aW9uc1VzYWdlKCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgIC8vIFBhcnNlIHRoZSBvcHRpb25zCi0gICAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChhcmdjIC0gb3B0aW5kICE9IDEpIHsKLSAgICAgICAgVXNhZ2UoYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgY2hhciAqdHJhY2VfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgVHJhY2VSZWFkZXI8PiAqdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXI8PjsKLSAgICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0gICAgdHJhY2UtPlNldFJvb3Qocm9vdCk7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBCQkV2ZW50IGV2ZW50LCBpZ25vcmVkOwotICAgICAgICBzeW1ib2xfdHlwZSAqZHVtbXlfc3ltOwotCi0gICAgICAgIGlmIChHZXROZXh0VmFsaWRFdmVudCh0cmFjZSwgJmV2ZW50LCAmaWdub3JlZCwgJmR1bW15X3N5bSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpbnQgbnVtX3Byb2NzOwotICAgIFByb2Nlc3NTdGF0ZSAqcHJvY2Vzc2VzID0gdHJhY2UtPkdldFByb2Nlc3NlcygmbnVtX3Byb2NzKTsKLQotICAgIFByb2Nlc3NTdGF0ZSAqcHN0YXRlID0gJnByb2Nlc3Nlc1swXTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3Byb2NzOyArK2lpLCArK3BzdGF0ZSkgewotICAgICAgICBpZiAocHN0YXRlLT5uYW1lID09IE5VTEwpCi0gICAgICAgICAgICBwc3RhdGUtPm5hbWUgPSAiIjsKLSAgICAgICAgUHJvY2Vzc1N0YXRlICptYW5hZ2VyID0gcHN0YXRlLT5hZGRyX21hbmFnZXI7Ci0gICAgICAgIHByaW50ZigicGlkICVkIHJlZ2lvbnM6ICVkICVzIiwKLSAgICAgICAgICAgICAgIHBzdGF0ZS0+cGlkLCBtYW5hZ2VyLT5ucmVnaW9ucywgcHN0YXRlLT5uYW1lKTsKLSAgICAgICAgZm9yIChpbnQgamogPSAxOyBqaiA8IHBzdGF0ZS0+YXJnYzsgKytqaikgewotICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBwc3RhdGUtPmFyZ3ZbampdKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIHRyYWNlLT5EdW1wUmVnaW9ucyhzdGRvdXQsIHBzdGF0ZSk7Ci0gICAgfQotCi0gICAgZGVsZXRlIHRyYWNlOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2V4Y19kdW1wLmNwcCBiL2VtdWxhdG9yL3F0b29scy9leGNfZHVtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjU4NmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2V4Y19kdW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyX2Jhc2UuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgaWYgKGFyZ2MgIT0gMikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyB0cmFjZV9maWxlXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjaGFyICp0cmFjZV9maWxlbmFtZSA9IGFyZ3ZbMV07Ci0gICAgVHJhY2VSZWFkZXJCYXNlICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlckJhc2U7Ci0gICAgdHJhY2UtPk9wZW4odHJhY2VfZmlsZW5hbWUpOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgdWludDY0X3QgdGltZSwgcmVjbnVtLCBiYl9udW0sIGJiX3N0YXJ0X3RpbWU7Ci0gICAgICAgIHVpbnQzMl90IHBjLCB0YXJnZXRfcGM7Ci0gICAgICAgIGludCBudW1faW5zbnM7Ci0KLSAgICAgICAgaWYgKHRyYWNlLT5SZWFkRXhjKCZ0aW1lLCAmcGMsICZyZWNudW0sICZ0YXJnZXRfcGMsICZiYl9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmYmJfc3RhcnRfdGltZSwgJm51bV9pbnNucykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcHJpbnRmKCJ0aW1lOiAlbGxkIHJlYzogJWxsdSBwYzogJTA4eCB0YXJnZXQ6ICUwOHggYmI6ICVsbHUgYmJfc3RhcnQ6ICVsbHUgaW5zbnM6ICVkXG4iLAotICAgICAgICAgICAgICAgdGltZSwgcmVjbnVtLCBwYywgdGFyZ2V0X3BjLCBiYl9udW0sIGJiX3N0YXJ0X3RpbWUsIG51bV9pbnNucyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2d0cmFjZS5jcHAgYi9lbXVsYXRvci9xdG9vbHMvZ3RyYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZDhhNC4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvZ3RyYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgImd0cmFjZS5oIgotCi0vLyBBIGJ1ZmZlciBvZiB6ZXJvcwotc3RhdGljIGNoYXIgemVyb3NbR3RyYWNlOjprR3RyYWNlRW50cmllc1BlckJsb2NrICogc2l6ZW9mKEd0cmFjZTo6dHJhY2VfZW50cnkpXTsKLQotR3RyYWNlOjpHdHJhY2UoKSB7Ci0gIGd0cmFjZV9maWxlXyA9IE5VTEw7Ci0gIGZ0cmFjZV8gPSBOVUxMOwotICBmbmFtZXNfID0gTlVMTDsKLSAgc3RhcnRfc2VjXyA9IDA7Ci0gIHBkYXRlXyA9IDA7Ci0gIHB0aW1lXyA9IDA7Ci0gIG51bV9lbnRyaWVzXyA9IDA7Ci0gIGJsb2Nrbm9fID0gMTsKLSAgY3VycmVudF9waWRfID0gMDsKLX0KLQotR3RyYWNlOjp+R3RyYWNlKCkgewotICBpZiAoZnRyYWNlXykgewotICAgIC8vIEV4dGVuZCB0aGUgdHJhY2UgZmlsZSB0byBhIG11bHRpcGxlIG9mIDhrLiBPdGhlcndpc2UgZ3RyYWNlcG9zdDY0Ci0gICAgLy8gY29tcGxhaW5zLgotICAgIGxvbmcgcG9zID0gZnRlbGwoZnRyYWNlXyk7Ci0gICAgbG9uZyBwb3NfZW5kID0gKHBvcyArIDB4MWZmZikgJiB+MHgxZmZmOwotICAgIGlmIChwb3NfZW5kID4gcG9zKSB7Ci0gICAgICBjaGFyIGNoID0gMDsKLSAgICAgIGZzZWVrKGZ0cmFjZV8sIHBvc19lbmQgLSAxLCBTRUVLX1NFVCk7Ci0gICAgICBmd3JpdGUoJmNoLCAxLCAxLCBmdHJhY2VfKTsKLSAgICB9Ci0gICAgZmNsb3NlKGZ0cmFjZV8pOwotICB9Ci0gIGlmIChmbmFtZXNfKQotICAgIGZjbG9zZShmbmFtZXNfKTsKLX0KLQotdm9pZCBHdHJhY2U6Ok9wZW4oY29uc3QgY2hhciAqZ3RyYWNlX2ZpbGUsIHVpbnQzMl90IHBkYXRlLCB1aW50MzJfdCBwdGltZSkKLXsKLSAgZnRyYWNlXyA9IGZvcGVuKGd0cmFjZV9maWxlLCAidyIpOwotICBpZiAoZnRyYWNlXyA9PSBOVUxMKSB7Ci0gICAgcGVycm9yKGd0cmFjZV9maWxlKTsKLSAgICBleGl0KDEpOwotICB9Ci0gIGd0cmFjZV9maWxlXyA9IGd0cmFjZV9maWxlOwotCi0gIHBkYXRlXyA9IHBkYXRlOwotICBwdGltZV8gPSBwdGltZTsKLSAgc3ByaW50ZihnbmFtZV9maWxlXywgImduYW1lXyV4XyUwNngudHh0IiwgcGRhdGUsIHB0aW1lKTsKLSAgZm5hbWVzXyA9IGZvcGVuKGduYW1lX2ZpbGVfLCAidyIpOwotICBpZiAoZm5hbWVzXyA9PSBOVUxMKSB7Ci0gICAgcGVycm9yKGduYW1lX2ZpbGVfKTsKLSAgICBleGl0KDEpOwotICB9Ci0gIGZwcmludGYoZm5hbWVzXywgIiMgRmlsZSMgUHJvYyMgTGluZSMgTmFtZVxuIik7Ci19Ci0KLXZvaWQgR3RyYWNlOjpXcml0ZUZpcnN0SGVhZGVyKHVpbnQzMl90IHN0YXJ0X3NlYywgdWludDMyX3QgcGlkKQotewotICBmaXJzdF9oZWFkZXIgZmg7Ci0gIGN1cnJlbnRfcGlkXyA9IHBpZDsKLSAgc3RhcnRfc2VjXyA9IHN0YXJ0X3NlYzsKLSAgRmlsbEZpcnN0SGVhZGVyKHN0YXJ0X3NlYywgcGlkLCAmZmgpOwotICBmd3JpdGUoJmZoLCBzaXplb2YoZmgpLCAxLCBmdHJhY2VfKTsKLSAgbnVtX2VudHJpZXNfID0gODsKLX0KLQotdm9pZCBHdHJhY2U6OkZpbGxGaXJzdEhlYWRlcih1aW50MzJfdCBzdGFydF9zZWMsIHVpbnQzMl90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfaGVhZGVyICpmaCkgewotICBpbnQgY3B1ID0gMDsKLSAgaW50IG1heF9maWxlcyA9IDE2OwotICBpbnQgbWF4X3Byb2NlZHVyZXMgPSAxMjsKLQotICBmaC0+Y29tbW9uLmJsb2Nrbm8gPSAwOwotICBmaC0+Y29tbW9uLmVudHJ5X3dpZHRoID0gODsKLSAgZmgtPmNvbW1vbi5ibG9ja190aWMgPSBrQmFzZVRpYzsKLSAgZmgtPmNvbW1vbi5ibG9ja190aW1lID0gc3RhcnRfc2VjOwotICAvL2ZoLT5jb21tb24udXNlY19jcHUgPSAoc3RhcnRfdXNlYyA8PCA4KSB8IChjcHUgJiAweGZmKTsKLSAgZmgtPmNvbW1vbi51c2VjX2NwdSA9IGNwdSAmIDB4ZmY7Ci0gIGZoLT5jb21tb24ucGlkID0gcGlkOwotICBmaC0+Y29tbW9uLmJ1Z19jb3VudCA9IDA7Ci0gIGZoLT5jb21tb24uemVyb19jb3VudCA9IDA7Ci0KLSAgZmgtPnRpYyA9IGtCYXNlVGljICsgMTsKLSAgZmgtPm9uZSA9IDE7Ci0gIGZoLT50aWNzX3Blcl9zZWNvbmQgPSBrVGljc1BlclNlY29uZDsKLSAgZmgtPnRyYWNlX3RpbWUgPSBzdGFydF9zZWM7Ci0gIGZoLT52ZXJzaW9uID0gNTsKLSAgZmgtPmZpbGVfcHJvYyA9IChtYXhfZmlsZXMgPDwgOCkgfCBtYXhfcHJvY2VkdXJlczsKLSAgZmgtPnBkYXRlID0gcGRhdGVfOwotICBmaC0+cHRpbWUgPSBwdGltZV87Ci19Ci0KLXZvaWQgR3RyYWNlOjpXcml0ZUJsb2NrSGVhZGVyKHVpbnQzMl90IGN5Y2xlLCB1aW50MzJfdCBwaWQpCi17Ci0gIGludCBjcHUgPSAwOwotICBibG9ja19oZWFkZXIgYmg7Ci0KLSAgYmguYmxvY2tubyA9IGJsb2Nrbm9fKys7Ci0gIGJoLmVudHJ5X3dpZHRoID0gODsKLSAgYmguYmxvY2tfdGljID0gY3ljbGUgKyBrQmFzZVRpYzsKLSAgYmguYmxvY2tfdGltZSA9IHN0YXJ0X3NlY18gKyBjeWNsZSAvIGtUaWNzUGVyU2Vjb25kOwotICAvL2JoLnVzZWNfY3B1ID0gKHN0YXJ0X3VzZWMgPDwgOCkgfCAoY3B1ICYgMHhmZik7Ci0gIGJoLnVzZWNfY3B1ID0gY3B1ICYgMHhmZjsKLSAgYmgucGlkID0gcGlkOwotICBiaC5idWdfY291bnQgPSAwOwotICBiaC56ZXJvX2NvdW50ID0gMDsKLSAgZndyaXRlKCZiaCwgc2l6ZW9mKGJoKSwgMSwgZnRyYWNlXyk7Ci19Ci0KLXZvaWQgR3RyYWNlOjpBZGRHdHJhY2VSZWNvcmQoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCB1aW50MzJfdCBjeWNsZSwgdWludDMyX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfZXhpdCkKLXsKLSAgdHJhY2VfZW50cnkJZW50cnk7Ci0KLSAgaWYgKGN1cnJlbnRfcGlkXyAhPSBwaWQpIHsKLSAgICBjdXJyZW50X3BpZF8gPSBwaWQ7Ci0KLSAgICAvLyBXZSBhcmUgc3dpdGNoaW5nIHRvIGEgbmV3IHByb2Nlc3MgaWQsIHNvIHBhZCB0aGUgY3VycmVudCBibG9jawotICAgIC8vIHdpdGggemVyb3MuCi0gICAgaW50IG51bV96ZXJvcyA9IChrR3RyYWNlRW50cmllc1BlckJsb2NrIC0gbnVtX2VudHJpZXNfKSAqIHNpemVvZihlbnRyeSk7Ci0gICAgZndyaXRlKHplcm9zLCBudW1femVyb3MsIDEsIGZ0cmFjZV8pOwotICAgIFdyaXRlQmxvY2tIZWFkZXIoY3ljbGUsIHBpZCk7Ci0gICAgbnVtX2VudHJpZXNfID0gNDsKLSAgfQotCi0gIC8vIElmIHRoZSBjdXJyZW50IGJsb2NrIGlzIGZ1bGwsIHdyaXRlIG91dCBhIG5ldyBibG9jayBoZWFkZXIKLSAgaWYgKG51bV9lbnRyaWVzXyA9PSBrR3RyYWNlRW50cmllc1BlckJsb2NrKSB7Ci0gICAgV3JpdGVCbG9ja0hlYWRlcihjeWNsZSwgcGlkKTsKLSAgICBudW1fZW50cmllc18gPSA0OwotICB9Ci0KLSAgZW50cnkuY3ljbGUgPSBjeWNsZSArIGtCYXNlVGljOwotICBlbnRyeS5ldmVudCA9IChmaWxlbnVtIDw8IDEzKSB8IChwcm9jbnVtIDw8IDEpIHwgaXNfZXhpdDsKLSAgZndyaXRlKCZlbnRyeSwgc2l6ZW9mKGVudHJ5KSwgMSwgZnRyYWNlXyk7Ci0gIG51bV9lbnRyaWVzXyArPSAxOwotfQotCi12b2lkIEd0cmFjZTo6QWRkUHJvY0VudHJ5KGludCBmaWxlbnVtLCBpbnQgcHJvY251bSwgdWludDMyX3QgY3ljbGUsIHVpbnQzMl90IHBpZCkKLXsKLSAgQWRkR3RyYWNlUmVjb3JkKGZpbGVudW0sIHByb2NudW0sIGN5Y2xlLCBwaWQsIDApOwotfQotCi12b2lkIEd0cmFjZTo6QWRkUHJvY0V4aXQoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCB1aW50MzJfdCBjeWNsZSwgdWludDMyX3QgcGlkKQotewotICBBZGRHdHJhY2VSZWNvcmQoZmlsZW51bSwgcHJvY251bSwgY3ljbGUsIHBpZCwgMSk7Ci19Ci0KLXZvaWQgR3RyYWNlOjpBZGRQcm9jZWR1cmUoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCBjb25zdCBjaGFyICpwcm9jX25hbWUpCi17Ci0gIGZwcmludGYoZm5hbWVzXywgIiVkICVkICVkICVzXG4iLCBmaWxlbnVtLCBwcm9jbnVtLCBwcm9jbnVtLCBwcm9jX25hbWUpOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2d0cmFjZS5oIGIvZW11bGF0b3IvcXRvb2xzL2d0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJhZGMyLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9ndHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBHVFJBQ0VfSAotI2RlZmluZSBHVFJBQ0VfSAotCi1jbGFzcyBHdHJhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBrR3RyYWNlRW50cmllc1BlckJsb2NrID0gMTAyNDsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaWxsaW9uID0gMTAwMDAwMDsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaWNzUGVyU2Vjb25kID0gMjAwICoga01pbGxpb247Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Jhc2VUaWMgPSAweDEwMDA7Ci0KLSAgc3RydWN0IHRyYWNlX2VudHJ5IHsKLSAgICB1aW50MzJfdAljeWNsZTsKLSAgICB1aW50MzJfdAlldmVudDsKLSAgfTsKLQotICBzdHJ1Y3QgYmxvY2tfaGVhZGVyIHsKLSAgICB1aW50MzJfdAlibG9ja25vOwotICAgIHVpbnQzMl90CWVudHJ5X3dpZHRoOwotICAgIHVpbnQzMl90CWJsb2NrX3RpYzsKLSAgICB1aW50MzJfdAlibG9ja190aW1lOwotICAgIHVpbnQzMl90CXVzZWNfY3B1OwotICAgIHVpbnQzMl90CXBpZDsKLSAgICB1aW50MzJfdAlidWdfY291bnQ7Ci0gICAgdWludDMyX3QJemVyb19jb3VudDsKLSAgfTsKLQotICBzdHJ1Y3QgZmlyc3RfaGVhZGVyIHsKLSAgICBibG9ja19oZWFkZXIJY29tbW9uOwotICAgIHVpbnQzMl90CQl0aWM7Ci0gICAgdWludDMyX3QJCW9uZTsKLSAgICB1aW50MzJfdAkJdGljc19wZXJfc2Vjb25kOwotICAgIHVpbnQzMl90CQl0cmFjZV90aW1lOwotICAgIHVpbnQzMl90CQl2ZXJzaW9uOwotICAgIHVpbnQzMl90CQlmaWxlX3Byb2M7Ci0gICAgdWludDMyX3QJCXBkYXRlOwotICAgIHVpbnQzMl90CQlwdGltZTsKLSAgfTsKLQotICBHdHJhY2UoKTsKLSAgfkd0cmFjZSgpOwotCi0gIHZvaWQJCU9wZW4oY29uc3QgY2hhciAqZ3RyYWNlX2ZpbGUsIHVpbnQzMl90IHBkYXRlLCB1aW50MzJfdCBwdGltZSk7Ci0gIHZvaWQJCVdyaXRlRmlyc3RIZWFkZXIodWludDMyX3Qgc3RhcnRfc2VjLCB1aW50MzJfdCBwaWQpOwotICB2b2lkCQlBZGRQcm9jZWR1cmUoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCBjb25zdCBjaGFyICpwcm9jX25hbWUpOwotICB2b2lkCQlBZGRQcm9jRW50cnkoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCB1aW50MzJfdCBjeWNsZSwgdWludDMyX3QgcGlkKTsKLSAgdm9pZAkJQWRkUHJvY0V4aXQoaW50IGZpbGVudW0sIGludCBwcm9jbnVtLCB1aW50MzJfdCBjeWNsZSwgdWludDMyX3QgcGlkKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQJCUFkZEd0cmFjZVJlY29yZChpbnQgZmlsZW51bSwgaW50IHByb2NudW0sIHVpbnQzMl90IGN5Y2xlLCB1aW50MzJfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19leGl0KTsKLSAgdm9pZAkJRmlsbEZpcnN0SGVhZGVyKHVpbnQzMl90IHN0YXJ0X3NlYywgdWludDMyX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9oZWFkZXIgKmZoKTsKLSAgdm9pZAkJV3JpdGVCbG9ja0hlYWRlcih1aW50MzJfdCBjeWNsZSwgdWludDMyX3QgcGlkKTsKLQotICBjb25zdCBjaGFyCSpndHJhY2VfZmlsZV87Ci0gIGNoYXIJCWduYW1lX2ZpbGVfWzEwMF07Ci0gIEZJTEUJCSpmdHJhY2VfOwotICBGSUxFCQkqZm5hbWVzXzsKLSAgdWludDMyX3QJc3RhcnRfc2VjXzsKLSAgdWludDMyX3QJcGRhdGVfOwotICB1aW50MzJfdAlwdGltZV87Ci0gIGludAkJbnVtX2VudHJpZXNfOwotICBpbnQJCWJsb2Nrbm9fOwotICB1aW50MzJfdAljdXJyZW50X3BpZF87Ci19OwotCi0jZW5kaWYgIC8vIEdUUkFDRV9ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvaGFzaF90YWJsZS5oIGIvZW11bGF0b3IvcXRvb2xzL2hhc2hfdGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhOWVkNS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvaGFzaF90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBIQVNIX1RBQkxFX0gKLSNkZWZpbmUgSEFTSF9UQUJMRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi10ZW1wbGF0ZTxjbGFzcyBUPgotY2xhc3MgSGFzaFRhYmxlIHsKLSAgcHVibGljOgotICAgIEhhc2hUYWJsZShpbnQgc2l6ZSwgVCBkZWZhdWx0X3ZhbHVlID0gVCgpKTsKLSAgICB+SGFzaFRhYmxlKCk7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGVudHJ5ICAgICpuZXh0OwotICAgICAgICBjaGFyICAgICAqa2V5OwotICAgICAgICBUICAgICAgICB2YWx1ZTsKLSAgICB9IGVudHJ5X3R5cGU7Ci0KLSAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLQotICAgIHZvaWQgICAgICAgICBVcGRhdGUoY29uc3QgY2hhciAqa2V5LCBUIHZhbHVlKTsKLSAgICBib29sICAgICAgICAgUmVtb3ZlKGNvbnN0IGNoYXIgKmtleSk7Ci0gICAgVCAgICAgICAgICAgIEZpbmQoY29uc3QgY2hhciAqa2V5KTsKLSAgICBlbnRyeV90eXBlKiAgR2V0Rmlyc3QoKTsKLSAgICBlbnRyeV90eXBlKiAgR2V0TmV4dCgpOwotCi0gIHByaXZhdGU6Ci0gICAgdWludDMyX3QgICAgIEhhc2hGdW5jdGlvbihjb25zdCBjaGFyICprZXkpOwotCi0gICAgaW50ICAgICAgICAgIHNpemVfOwotICAgIGludCAgICAgICAgICBtYXNrXzsKLSAgICBUICAgICAgICAgICAgZGVmYXVsdF92YWx1ZV87Ci0gICAgZW50cnlfdHlwZSAgICoqdGFibGVfOwotICAgIGludCAgICAgICAgICBudW1fZW50cmllc187Ci0gICAgaW50ICAgICAgICAgIGN1cnJlbnRfaW5kZXhfOwotICAgIGVudHJ5X3R5cGUgICAqY3VycmVudF9wdHJfOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLUhhc2hUYWJsZTxUPjo6SGFzaFRhYmxlKGludCBzaXplLCBUIGRlZmF1bHRfdmFsdWUpCi17Ci0gICAgaW50IHBvdzI7Ci0KLSAgICAvLyBSb3VuZCB1cCBzaXplIHRvIGEgcG93ZXIgb2YgdHdvCi0gICAgZm9yIChwb3cyID0gMjsgcG93MiA8IHNpemU7IHBvdzIgPDw9IDEpCi0gICAgICAgIDsgICAgLy8gZW1wdHkgYm9keQotCi0gICAgc2l6ZV8gPSBwb3cyOwotICAgIG1hc2tfID0gcG93MiAtIDE7Ci0gICAgZGVmYXVsdF92YWx1ZV8gPSBkZWZhdWx0X3ZhbHVlOwotCi0gICAgLy8gQWxsb2NhdGUgYSB0YWJsZSBvZiBwb2ludGVycyBhbmQgaW5pdGlhbGl6ZSB0aGVtIGFsbCB0byBOVUxMLgotICAgIHRhYmxlXyA9IG5ldyBlbnRyeV90eXBlKltzaXplX107Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IHNpemVfOyArK2lpKQotICAgICAgICB0YWJsZV9baWldID0gTlVMTDsKLSAgICBudW1fZW50cmllc18gPSAwOwotICAgIGN1cnJlbnRfaW5kZXhfID0gMDsKLSAgICBjdXJyZW50X3B0cl8gPSBOVUxMOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotSGFzaFRhYmxlPFQ+Ojp+SGFzaFRhYmxlKCkKLXsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgc2l6ZV87ICsraWkpIHsKLSAgICAgICAgZW50cnlfdHlwZSAqcHRyLCAqbmV4dDsKLQotICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSBwb2ludGVycyBpbiB0aGUgY2hhaW4gYXQgdGhpcyB0YWJsZSBwb3NpdGlvbi4KLSAgICAgICAgLy8gU2F2ZSB0aGUgbmV4dCBwb2ludGVyIGJlZm9yZSBkZWxldGluZyBlYWNoIGVudHJ5IHNvIHRoYXQgd2UKLSAgICAgICAgLy8gZG9uJ3QgZGVyZWZlcmVuY2UgcGFydCBvZiBhIGRlYWxsb2NhdGVkIG9iamVjdC4KLSAgICAgICAgZm9yIChwdHIgPSB0YWJsZV9baWldOyBwdHI7IHB0ciA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBwdHItPm5leHQ7Ci0gICAgICAgICAgICBkZWxldGVbXSBwdHItPmtleTsKLSAgICAgICAgICAgIGRlbGV0ZSBwdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVsZXRlW10gdGFibGVfOwotfQotCi0vLyBQcm9mZXNzb3IgRGFuaWVsIEouIEJlcm5zdGVpbidzIGhhc2ggZnVuY3Rpb24uICBTZWUKLS8vIGh0dHA6Ly93d3cucGFydG93Lm5ldC9wcm9ncmFtbWluZy9oYXNoZnVuY3Rpb25zLwotdGVtcGxhdGU8Y2xhc3MgVD4KLXVpbnQzMl90IEhhc2hUYWJsZTxUPjo6SGFzaEZ1bmN0aW9uKGNvbnN0IGNoYXIgKmtleSkKLXsKLSAgICB1aW50MzJfdCBoYXNoID0gNTM4MTsKLQotICAgIGludCBsZW4gPSBzdHJsZW4oa2V5KTsKLSAgICBmb3IoaW50IGlpID0gMDsgaWkgPCBsZW47ICsra2V5LCArK2lpKQotICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAqa2V5OwotCi0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIEhhc2hUYWJsZTxUPjo6VXBkYXRlKGNvbnN0IGNoYXIgKmtleSwgVCB2YWx1ZSkKLXsKLSAgICAvLyBIYXNoIHRoZSBrZXkgdG8gZ2V0IHRoZSB0YWJsZSBwb3NpdGlvbgotICAgIGludCBsZW4gPSBzdHJsZW4oa2V5KTsKLSAgICBpbnQgcG9zID0gSGFzaEZ1bmN0aW9uKGtleSkgJiBtYXNrXzsKLQotICAgIC8vIFNlYXJjaCB0aGUgY2hhaW4gZm9yIGEgbWF0Y2hpbmcga2V5Ci0gICAgZm9yIChlbnRyeV90eXBlICpwdHIgPSB0YWJsZV9bcG9zXTsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKLSAgICAgICAgaWYgKHN0cmNtcChwdHItPmtleSwga2V5KSA9PSAwKSB7Ci0gICAgICAgICAgICBwdHItPnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgaGFzaCBlbnRyeSBhbmQgZmlsbCBpbiB0aGUgdmFsdWVzCi0gICAgZW50cnlfdHlwZSAqcHRyID0gbmV3IGVudHJ5X3R5cGU7Ci0KLSAgICAvLyBDb3B5IHRoZSBzdHJpbmcKLSAgICBwdHItPmtleSA9IG5ldyBjaGFyW2xlbiArIDFdOwotICAgIHN0cmNweShwdHItPmtleSwga2V5KTsKLSAgICBwdHItPnZhbHVlID0gdmFsdWU7Ci0KLSAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0Ci0gICAgcHRyLT5uZXh0ID0gdGFibGVfW3Bvc107Ci0gICAgdGFibGVfW3Bvc10gPSBwdHI7Ci0gICAgbnVtX2VudHJpZXNfICs9IDE7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1ib29sIEhhc2hUYWJsZTxUPjo6UmVtb3ZlKGNvbnN0IGNoYXIgKmtleSkKLXsKLSAgICAvLyBIYXNoIHRoZSBrZXkgdG8gZ2V0IHRoZSB0YWJsZSBwb3NpdGlvbgotICAgIGludCBsZW4gPSBzdHJsZW4oa2V5KTsKLSAgICBpbnQgcG9zID0gSGFzaEZ1bmN0aW9uKGtleSkgJiBtYXNrXzsKLQotICAgIC8vIFNlYXJjaCB0aGUgY2hhaW4gZm9yIGEgbWF0Y2hpbmcga2V5IGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cwotICAgIC8vIGVsZW1lbnQgaW4gdGhlIGNoYWluLgotICAgIGVudHJ5X3R5cGUgKnByZXYgPSBOVUxMOwotICAgIGZvciAoZW50cnlfdHlwZSAqcHRyID0gdGFibGVfW3Bvc107IHB0cjsgcHJldiA9IHB0ciwgcHRyID0gcHRyLT5uZXh0KSB7Ci0gICAgICAgIGlmIChzdHJjbXAocHRyLT5rZXksIGtleSkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHByZXYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHRhYmxlX1twb3NdID0gcHRyLT5uZXh0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gcHRyLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIHB0ci0+a2V5OwotICAgICAgICAgICAgZGVsZXRlIHB0cjsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXR5cGVuYW1lIEhhc2hUYWJsZTxUPjo6dmFsdWVfdHlwZSBIYXNoVGFibGU8VD46OkZpbmQoY29uc3QgY2hhciAqa2V5KQotewotICAgIC8vIEhhc2ggdGhlIGtleSB0byBnZXQgdGhlIHRhYmxlIHBvc2l0aW9uCi0gICAgaW50IHBvcyA9IEhhc2hGdW5jdGlvbihrZXkpICYgbWFza187Ci0KLSAgICAvLyBTZWFyY2ggdGhlIGNoYWluIGZvciBhIG1hdGNoaW5nIGtleQotICAgIGZvciAoZW50cnlfdHlwZSAqcHRyID0gdGFibGVfW3Bvc107IHB0cjsgcHRyID0gcHRyLT5uZXh0KSB7Ci0gICAgICAgIGlmIChzdHJjbXAocHRyLT5rZXksIGtleSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBwdHItPnZhbHVlOwotICAgIH0KLQotICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVuIHdlIGRpZG4ndCBmaW5kIHRoZSBrZXkKLSAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV87Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci10eXBlbmFtZSBIYXNoVGFibGU8VD46OmVudHJ5X3R5cGUqIEhhc2hUYWJsZTxUPjo6R2V0Rmlyc3QoKQotewotICAgIC8vIEZpbmQgdGhlIGZpcnN0IG5vbi1OVUxMIHRhYmxlIGVudHJ5LgotICAgIGZvciAoY3VycmVudF9pbmRleF8gPSAwOyBjdXJyZW50X2luZGV4XyA8IHNpemVfOyArK2N1cnJlbnRfaW5kZXhfKSB7Ci0gICAgICAgIGlmICh0YWJsZV9bY3VycmVudF9pbmRleF9dKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRhYmxlIGVudHJpZXMsIHRoZW4gcmV0dXJuIE5VTEwuCi0gICAgaWYgKGN1cnJlbnRfaW5kZXhfID09IHNpemVfKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8vIFJlbWVtYmVyIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgZWxlbWVudC4KLSAgICBjdXJyZW50X3B0cl8gPSB0YWJsZV9bY3VycmVudF9pbmRleF9dOwotICAgIHJldHVybiBjdXJyZW50X3B0cl87Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci10eXBlbmFtZSBIYXNoVGFibGU8VD46OmVudHJ5X3R5cGUqIEhhc2hUYWJsZTxUPjo6R2V0TmV4dCgpCi17Ci0gICAgLy8gSWYgd2UgYWxyZWFkeSBpdGVyYXRlZCBwYXJ0IHdheSB0aHJvdWdoIHRoZSBoYXNoIHRhYmxlLCB0aGVuIGNvbnRpbnVlCi0gICAgLy8gdG8gdGhlIG5leHQgZWxlbWVudC4KLSAgICBpZiAoY3VycmVudF9wdHJfKSB7Ci0gICAgICAgIGN1cnJlbnRfcHRyXyA9IGN1cnJlbnRfcHRyXy0+bmV4dDsKLQotICAgICAgICAvLyBJZiB3ZSBhcmUgcG9pbnRpbmcgdG8gYSB2YWxpZCBlbGVtZW50LCB0aGVuIHJldHVybiBpdC4KLSAgICAgICAgaWYgKGN1cnJlbnRfcHRyXykKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50X3B0cl87Ci0KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzdGFydCBzZWFyY2hpbmcgYXQgdGhlIG5leHQgdGFibGUgaW5kZXguCi0gICAgICAgIGN1cnJlbnRfaW5kZXhfICs9IDE7Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgbmV4dCBub24tTlVMTCB0YWJsZSBlbnRyeS4KLSAgICBmb3IgKDsgY3VycmVudF9pbmRleF8gPCBzaXplXzsgKytjdXJyZW50X2luZGV4XykgewotICAgICAgICBpZiAodGFibGVfW2N1cnJlbnRfaW5kZXhfXSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIG5vbi1OVUxMIHRhYmxlIGVudHJpZXMsIHRoZW4gcmV0dXJuIE5VTEwuCi0gICAgaWYgKGN1cnJlbnRfaW5kZXhfID09IHNpemVfKSB7Ci0gICAgICAgIC8vIFJlc2V0IHRoZSBjdXJyZW50IGluZGV4IHNvIHRoYXQgd2Ugd2lsbCBzdGFydCBvdmVyIGZyb20gdGhlCi0gICAgICAgIC8vIGJlZ2lubmluZyBvbiB0aGUgbmV4dCBjYWxsIHRvIEdldE5leHQoKS4KLSAgICAgICAgY3VycmVudF9pbmRleF8gPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBSZW1lbWJlciBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0gICAgY3VycmVudF9wdHJfID0gdGFibGVfW2N1cnJlbnRfaW5kZXhfXTsKLSAgICByZXR1cm4gY3VycmVudF9wdHJfOwotfQotCi0KLSNlbmRpZiAgLy8gSEFTSF9UQUJMRV9ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvaGlzdF90cmFjZS5jcHAgYi9lbXVsYXRvci9xdG9vbHMvaGlzdF90cmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYzZhOTAuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2hpc3RfdHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLQotc3RhdGljIGNvbnN0IGludCBrTWF4SGlzdEVudHJpZXMgPSAyNTY7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0RW50cmllczIgPSBrTWF4SGlzdEVudHJpZXMgLyAgMjsKLWludCBoaXN0W2tNYXhIaXN0RW50cmllc107Ci1pbnQgdW5kZXJmbG93LCBvdmVyZmxvdzsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIGlmIChhcmdjICE9IDIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyB0cmFjZV9maWxlXG4iLCBhcmd2WzBdKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgY2hhciAqdHJhY2VfZmlsZW5hbWUgPSBhcmd2WzFdOwotICBUcmFjZVJlYWRlckJhc2UgKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyQmFzZTsKLSAgdHJhY2UtPk9wZW4odHJhY2VfZmlsZW5hbWUpOwotCi0gIHVpbnQ2NF90IHByZXZfYmJfbnVtID0gMDsKLSAgdWludDY0X3QgcHJldl90aW1lID0gMDsKLSAgaW50IHRvdGFsID0gMDsKLSAgCi0gIHdoaWxlICgxKSB7Ci0gICAgQkJFdmVudCBldmVudDsKLQotICAgIGlmICh0cmFjZS0+UmVhZEJCKCZldmVudCkpCi0gICAgICBicmVhazsKLSAgICBpbnQgYmJfZGlmZiA9IGV2ZW50LmJiX251bSAtIHByZXZfYmJfbnVtOwotICAgIC8vaW50IHRpbWVfZGlmZiA9IGV2ZW50LnRpbWUgLSBwcmV2X3RpbWU7Ci0gICAgLy9wcmludGYoImJiX251bTogJWxsdSBwcmV2OiAlbGx1LCBkaWZmOiAlZFxuIiwKLSAgICAvLyBldmVudC5iYl9udW0sIHByZXZfYmJfbnVtLCBiYl9kaWZmKTsKLSAgICBwcmV2X2JiX251bSA9IGV2ZW50LmJiX251bTsKLSAgICBwcmV2X3RpbWUgPSBldmVudC50aW1lOwotCi0gICAgYmJfZGlmZiArPSBrTWF4SGlzdEVudHJpZXMyOwotICAgIGlmIChiYl9kaWZmIDwgMCkKLSAgICAgIHVuZGVyZmxvdyArPSAxOwotICAgIGVsc2UgaWYgKGJiX2RpZmYgPj0ga01heEhpc3RFbnRyaWVzKQotICAgICAgb3ZlcmZsb3cgKz0gMTsKLSAgICBlbHNlCi0gICAgICBoaXN0W2JiX2RpZmZdICs9IDE7Ci0gICAgdG90YWwgKz0gMTsKLSAgfQotCi0gIGludCBzdW0gPSAwOwotICBkb3VibGUgc3VtX3BlciA9IDA7Ci0gIGRvdWJsZSBwZXIgPSAwOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwga01heEhpc3RFbnRyaWVzOyArK2lpKSB7Ci0gICAgaWYgKGhpc3RbaWldID09IDApCi0gICAgICBjb250aW51ZTsKLSAgICBwZXIgPSAxMDAuMCAqIGhpc3RbaWldIC8gdG90YWw7Ci0gICAgc3VtICs9IGhpc3RbaWldOwotICAgIHN1bV9wZXIgPSAxMDAuMCAqIHN1bSAvIHRvdGFsOwotICAgIHByaW50ZigiICU0ZDogJTZkICU2LjJmICU2LjJmXG4iLCBpaSAtIGtNYXhIaXN0RW50cmllczIsIGhpc3RbaWldLCBwZXIsIHN1bV9wZXIpOwotICB9Ci0gIHBlciA9IDEwMC4wICogdW5kZXJmbG93IC8gdG90YWw7Ci0gIHByaW50ZigidW5kZXI6ICU2ZCAlNi4yZlxuIiwgdW5kZXJmbG93LCBwZXIpOwotICBwZXIgPSAxMDAuMCAqIG92ZXJmbG93IC8gdG90YWw7Ci0gIHByaW50Zigib3ZlcjogICU2ZCAlNi4yZlxuIiwgb3ZlcmZsb3csIHBlcik7Ci0gIHByaW50ZigidG90YWw6ICU2ZFxuIiwgdG90YWwpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9vcGNvZGUuY3BwIGIvZW11bGF0b3IvcXRvb2xzL29wY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmVmM2EuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL29wY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgIm9wY29kZS5oIgotCi0vLyBOb3RlOiB0aGlzIGFycmF5IGRlcGVuZHMgb24gdGhlIE9wY29kZSBlbnVtIGRlZmluZWQgaW4gb3Bjb2RlLmgKLXVpbnQzMl90IG9wY29kZV9mbGFnc1tdID0gewotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfSU5WQUxJRAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVU5ERUZJTkVECi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9BREMKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0FERAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfQU5ECi0gICAga0NhdEJyYW5jaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9CCi0gICAga0NhdEJyYW5jaCB8IGtDYXRCcmFuY2hMaW5rLCAgICAgICAgICAgICAgICAgICAvLyBPUF9CTAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfQklDCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9CS1BUCi0gICAga0NhdEJyYW5jaCB8IGtDYXRCcmFuY2hMaW5rIHwga0NhdEJyYW5jaEV4Y2gsICAvLyBPUF9CTFgKLSAgICBrQ2F0QnJhbmNoIHwga0NhdEJyYW5jaEV4Y2gsICAgICAgICAgICAgICAgICAgIC8vIE9QX0JYCi0gICAga0NhdENvcHJvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9DRFAKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0NMWgotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfQ01OCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9DTVAKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0VPUgotICAgIGtDYXRDb3Byb2MgfCBrQ2F0TG9hZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTERDCi0gICAga0NhdExvYWQgfCBrQ2F0TXVsdGlwbGUsICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9MRE0KLSAgICBrQ2F0TG9hZCB8IGtDYXRXb3JkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0xEUgotICAgIGtDYXRMb2FkIHwga0NhdEJ5dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTERSQgotICAgIGtDYXRMb2FkIHwga0NhdEJ5dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTERSQlQKLSAgICBrQ2F0TG9hZCB8IGtDYXRIYWxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0xEUkgKLSAgICBrQ2F0TG9hZCB8IGtDYXRCeXRlIHwga0NhdFNpZ25lZCwgICAgICAgICAgICAgIC8vIE9QX0xEUlNCCi0gICAga0NhdExvYWQgfCBrQ2F0SGFsZiB8IGtDYXRTaWduZWQsICAgICAgICAgICAgICAvLyBPUF9MRFJTSAotICAgIGtDYXRMb2FkIHwga0NhdFdvcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTERSVAotICAgIGtDYXRDb3Byb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTUNSCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9NTEEKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX01PVgotICAgIGtDYXRDb3Byb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTVJDCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9NUlMKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX01TUgotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfTVVMCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9NVk4KLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX09SUgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfUExECi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9SU0IKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1JTQwotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfU0JDCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9TTUxBTAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfU01VTEwKLSAgICBrQ2F0Q29wcm9jIHwga0NhdFN0b3JlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1NUQwotICAgIGtDYXRTdG9yZSB8IGtDYXRNdWx0aXBsZSwgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfU1RNCi0gICAga0NhdFN0b3JlIHwga0NhdFdvcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9TVFIKLSAgICBrQ2F0U3RvcmUgfCBrQ2F0Qnl0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1NUUkIKLSAgICBrQ2F0U3RvcmUgfCBrQ2F0Qnl0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1NUUkJUCi0gICAga0NhdFN0b3JlIHwga0NhdEhhbGYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9TVFJICi0gICAga0NhdFN0b3JlIHwga0NhdFdvcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9TVFJUCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9TVUIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1NXSQotICAgIGtDYXRMb2FkIHwga0NhdFN0b3JlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfU1dQCi0gICAga0NhdExvYWQgfCBrQ2F0U3RvcmUgfCBrQ2F0Qnl0ZSwgICAgICAgICAgICAgICAvLyBPUF9TV1BCCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9URVEKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RTVAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVU1MQUwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1VNVUxMCi0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX1VOREVGSU5FRCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0FEQywKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0FERCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0FORCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0FTUiwKLSAgICBrQ2F0QnJhbmNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0IsCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9CSUMsCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9CS1BULAotICAgIGtDYXRCcmFuY2ggfCBrQ2F0QnJhbmNoTGluaywgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfQkwsCi0gICAga0NhdEJyYW5jaCB8IGtDYXRCcmFuY2hMaW5rIHwga0NhdEJyYW5jaEV4Y2gsICAvLyBPUF9USFVNQl9CTFgsCi0gICAga0NhdEJyYW5jaCB8IGtDYXRCcmFuY2hFeGNoLCAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9CWCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0NNTiwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0NNUCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0VPUiwKLSAgICBrQ2F0TG9hZCB8IGtDYXRNdWx0aXBsZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0xETUlBLAotICAgIGtDYXRMb2FkIHwga0NhdFdvcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTERSLAotICAgIGtDYXRMb2FkIHwga0NhdEJ5dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTERSQiwKLSAgICBrQ2F0TG9hZCB8IGtDYXRIYWxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0xEUkgsCi0gICAga0NhdExvYWQgfCBrQ2F0Qnl0ZSB8IGtDYXRTaWduZWQsICAgICAgICAgICAgICAvLyBPUF9USFVNQl9MRFJTQiwKLSAgICBrQ2F0TG9hZCB8IGtDYXRIYWxmIHwga0NhdFNpZ25lZCwgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX0xEUlNILAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTFNMLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTFNSLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTU9WLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTVVMLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTVZOLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfTkVHLAotICAgIGtDYXRBbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfT1JSLAotICAgIGtDYXRMb2FkIHwga0NhdE11bHRpcGxlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfUE9QLAotICAgIGtDYXRTdG9yZSB8IGtDYXRNdWx0aXBsZSwgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfUFVTSCwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX1JPUiwKLSAgICBrQ2F0QWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX1NCQywKLSAgICBrQ2F0U3RvcmUgfCBrQ2F0TXVsdGlwbGUsICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX1NUTUlBLAotICAgIGtDYXRTdG9yZSB8IGtDYXRXb3JkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfU1RSLAotICAgIGtDYXRTdG9yZSB8IGtDYXRCeXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1BfVEhVTUJfU1RSQiwKLSAgICBrQ2F0U3RvcmUgfCBrQ2F0SGFsZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX1RIVU1CX1NUUkgsCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9TVUIsCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9TV0ksCi0gICAga0NhdEFsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPUF9USFVNQl9UU1QsCi0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QX0VORAotfTsKLQotY29uc3QgY2hhciAqb3Bjb2RlX25hbWVzW10gPSB7Ci0gICAgImludmFsaWQiLAotICAgICJ1bmRlZmluZWQiLAotICAgICJhZGMiLAotICAgICJhZGQiLAotICAgICJhbmQiLAotICAgICJiIiwKLSAgICAiYmwiLAotICAgICJiaWMiLAotICAgICJia3B0IiwKLSAgICAiYmx4IiwKLSAgICAiYngiLAotICAgICJjZHAiLAotICAgICJjbHoiLAotICAgICJjbW4iLAotICAgICJjbXAiLAotICAgICJlb3IiLAotICAgICJsZGMiLAotICAgICJsZG0iLAotICAgICJsZHIiLAotICAgICJsZHJiIiwKLSAgICAibGRyYnQiLAotICAgICJsZHJoIiwKLSAgICAibGRyc2IiLAotICAgICJsZHJzaCIsCi0gICAgImxkcnQiLAotICAgICJtY3IiLAotICAgICJtbGEiLAotICAgICJtb3YiLAotICAgICJtcmMiLAotICAgICJtcnMiLAotICAgICJtc3IiLAotICAgICJtdWwiLAotICAgICJtdm4iLAotICAgICJvcnIiLAotICAgICJwbGQiLAotICAgICJyc2IiLAotICAgICJyc2MiLAotICAgICJzYmMiLAotICAgICJzbWxhbCIsCi0gICAgInNtdWxsIiwKLSAgICAic3RjIiwKLSAgICAic3RtIiwKLSAgICAic3RyIiwKLSAgICAic3RyYiIsCi0gICAgInN0cmJ0IiwKLSAgICAic3RyaCIsCi0gICAgInN0cnQiLAotICAgICJzdWIiLAotICAgICJzd2kiLAotICAgICJzd3AiLAotICAgICJzd3BiIiwKLSAgICAidGVxIiwKLSAgICAidHN0IiwKLSAgICAidW1sYWwiLAotICAgICJ1bXVsbCIsCi0KLSAgICAidW5kZWZpbmVkIiwKLSAgICAiYWRjIiwKLSAgICAiYWRkIiwKLSAgICAiYW5kIiwKLSAgICAiYXNyIiwKLSAgICAiYiIsCi0gICAgImJpYyIsCi0gICAgImJrcHQiLAotICAgICJibCIsCi0gICAgImJseCIsCi0gICAgImJ4IiwKLSAgICAiY21uIiwKLSAgICAiY21wIiwKLSAgICAiZW9yIiwKLSAgICAibGRtaWEiLAotICAgICJsZHIiLAotICAgICJsZHJiIiwKLSAgICAibGRyaCIsCi0gICAgImxkcnNiIiwKLSAgICAibGRyc2giLAotICAgICJsc2wiLAotICAgICJsc3IiLAotICAgICJtb3YiLAotICAgICJtdWwiLAotICAgICJtdm4iLAotICAgICJuZWciLAotICAgICJvcnIiLAotICAgICJwb3AiLAotICAgICJwdXNoIiwKLSAgICAicm9yIiwKLSAgICAic2JjIiwKLSAgICAic3RtaWEiLAotICAgICJzdHIiLAotICAgICJzdHJiIiwKLSAgICAic3RyaCIsCi0gICAgInN1YiIsCi0gICAgInN3aSIsCi0gICAgInRzdCIsCi0KLSAgICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL29wY29kZS5oIGIvZW11bGF0b3IvcXRvb2xzL29wY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI2N2E2Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9vcGNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpZm5kZWYgT1BDT0RFX0gKLSNkZWZpbmUgT1BDT0RFX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8vIE5vdGU6IHRoaXMgbGlzdCBvZiBvcGNvZGVzIG11c3QgbWF0Y2ggdGhlIGxpc3QgdXNlZCB0byBpbml0aWFsaXplCi0vLyB0aGUgb3BmbGFnc1tdIGFycmF5IGluIG9wY29kZS5jcHAuCi1lbnVtIE9wY29kZSB7Ci0gICAgT1BfSU5WQUxJRCwKLSAgICBPUF9VTkRFRklORUQsCi0gICAgT1BfQURDLAotICAgIE9QX0FERCwKLSAgICBPUF9BTkQsCi0gICAgT1BfQiwKLSAgICBPUF9CTCwKLSAgICBPUF9CSUMsCi0gICAgT1BfQktQVCwKLSAgICBPUF9CTFgsCi0gICAgT1BfQlgsCi0gICAgT1BfQ0RQLAotICAgIE9QX0NMWiwKLSAgICBPUF9DTU4sCi0gICAgT1BfQ01QLAotICAgIE9QX0VPUiwKLSAgICBPUF9MREMsCi0gICAgT1BfTERNLAotICAgIE9QX0xEUiwKLSAgICBPUF9MRFJCLAotICAgIE9QX0xEUkJULAotICAgIE9QX0xEUkgsCi0gICAgT1BfTERSU0IsCi0gICAgT1BfTERSU0gsCi0gICAgT1BfTERSVCwKLSAgICBPUF9NQ1IsCi0gICAgT1BfTUxBLAotICAgIE9QX01PViwKLSAgICBPUF9NUkMsCi0gICAgT1BfTVJTLAotICAgIE9QX01TUiwKLSAgICBPUF9NVUwsCi0gICAgT1BfTVZOLAotICAgIE9QX09SUiwKLSAgICBPUF9QTEQsCi0gICAgT1BfUlNCLAotICAgIE9QX1JTQywKLSAgICBPUF9TQkMsCi0gICAgT1BfU01MQUwsCi0gICAgT1BfU01VTEwsCi0gICAgT1BfU1RDLAotICAgIE9QX1NUTSwKLSAgICBPUF9TVFIsCi0gICAgT1BfU1RSQiwKLSAgICBPUF9TVFJCVCwKLSAgICBPUF9TVFJILAotICAgIE9QX1NUUlQsCi0gICAgT1BfU1VCLAotICAgIE9QX1NXSSwKLSAgICBPUF9TV1AsCi0gICAgT1BfU1dQQiwKLSAgICBPUF9URVEsCi0gICAgT1BfVFNULAotICAgIE9QX1VNTEFMLAotICAgIE9QX1VNVUxMLAotCi0gICAgLy8gRGVmaW5lIHRodW1iIG9wY29kZXMKLSAgICBPUF9USFVNQl9VTkRFRklORUQsCi0gICAgT1BfVEhVTUJfQURDLAotICAgIE9QX1RIVU1CX0FERCwKLSAgICBPUF9USFVNQl9BTkQsCi0gICAgT1BfVEhVTUJfQVNSLAotICAgIE9QX1RIVU1CX0IsCi0gICAgT1BfVEhVTUJfQklDLAotICAgIE9QX1RIVU1CX0JLUFQsCi0gICAgT1BfVEhVTUJfQkwsCi0gICAgT1BfVEhVTUJfQkxYLAotICAgIE9QX1RIVU1CX0JYLAotICAgIE9QX1RIVU1CX0NNTiwKLSAgICBPUF9USFVNQl9DTVAsCi0gICAgT1BfVEhVTUJfRU9SLAotICAgIE9QX1RIVU1CX0xETUlBLAotICAgIE9QX1RIVU1CX0xEUiwKLSAgICBPUF9USFVNQl9MRFJCLAotICAgIE9QX1RIVU1CX0xEUkgsCi0gICAgT1BfVEhVTUJfTERSU0IsCi0gICAgT1BfVEhVTUJfTERSU0gsCi0gICAgT1BfVEhVTUJfTFNMLAotICAgIE9QX1RIVU1CX0xTUiwKLSAgICBPUF9USFVNQl9NT1YsCi0gICAgT1BfVEhVTUJfTVVMLAotICAgIE9QX1RIVU1CX01WTiwKLSAgICBPUF9USFVNQl9ORUcsCi0gICAgT1BfVEhVTUJfT1JSLAotICAgIE9QX1RIVU1CX1BPUCwKLSAgICBPUF9USFVNQl9QVVNILAotICAgIE9QX1RIVU1CX1JPUiwKLSAgICBPUF9USFVNQl9TQkMsCi0gICAgT1BfVEhVTUJfU1RNSUEsCi0gICAgT1BfVEhVTUJfU1RSLAotICAgIE9QX1RIVU1CX1NUUkIsCi0gICAgT1BfVEhVTUJfU1RSSCwKLSAgICBPUF9USFVNQl9TVUIsCi0gICAgT1BfVEhVTUJfU1dJLAotICAgIE9QX1RIVU1CX1RTVCwKLQotICAgIE9QX0VORCAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKLX07Ci0KLWV4dGVybiB1aW50MzJfdCBvcGNvZGVfZmxhZ3NbXTsKLWV4dGVybiBjb25zdCBjaGFyICpvcGNvZGVfbmFtZXNbXTsKLQotLy8gRGVmaW5lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZSBjYXRlZ29yaWVzCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdEJ5dGUgICAgICAgICAgPSAweDAwMDE7Ci1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdEhhbGYgICAgICAgICAgPSAweDAwMDI7Ci1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdFdvcmQgICAgICAgICAgPSAweDAwMDQ7Ci1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdExvbmcgICAgICAgICAgPSAweDAwMDg7Ci1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdE51bUJ5dGVzICAgICAgPSAoa0NhdEJ5dGUgfCBrQ2F0SGFsZiB8IGtDYXRXb3JkIHwga0NhdExvbmcpOwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDYXRNdWx0aXBsZSAgICAgID0gMHgwMDEwOwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDYXRTaWduZWQgICAgICAgID0gMHgwMDIwOwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDYXRMb2FkICAgICAgICAgID0gMHgwMDQwOwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDYXRTdG9yZSAgICAgICAgID0gMHgwMDgwOwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDYXRNZW1vcnlSZWYgICAgID0gKGtDYXRMb2FkIHwga0NhdFN0b3JlKTsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0QWx1ICAgICAgICAgICA9IDB4MDEwMDsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0QnJhbmNoICAgICAgICA9IDB4MDIwMDsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0QnJhbmNoTGluayAgICA9IDB4MDQwMDsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0QnJhbmNoRXhjaCAgICA9IDB4MDgwMDsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0Q29wcm9jICAgICAgICA9IDB4MTAwMDsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2F0TG9hZE11bHRpcGxlICA9IChrQ2F0TG9hZCB8IGtDYXRNdWx0aXBsZSk7Ci1zdGF0aWMgY29uc3QgdWludDMyX3Qga0NhdFN0b3JlTXVsdGlwbGUgPSAoa0NhdFN0b3JlIHwga0NhdE11bHRpcGxlKTsKLQotaW5saW5lIGJvb2wgaXNBTFUoT3Bjb2RlIG9wKSAgICB7IHJldHVybiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRBbHUpICE9IDA7IH0KLWlubGluZSBib29sIGlzQnJhbmNoKE9wY29kZSBvcCkgeyByZXR1cm4gKG9wY29kZV9mbGFnc1tvcF0gJiBrQ2F0QnJhbmNoKSAhPSAwOyB9Ci1pbmxpbmUgYm9vbCBpc0JyYW5jaExpbmsoT3Bjb2RlIG9wKSB7Ci0gICAgcmV0dXJuIChvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdEJyYW5jaExpbmspICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBpc0JyYW5jaEV4Y2goT3Bjb2RlIG9wKSB7Ci0gICAgcmV0dXJuIChvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdEJyYW5jaEV4Y2gpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBpc0xvYWQoT3Bjb2RlIG9wKSAgIHsgcmV0dXJuIChvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdExvYWQpICE9IDA7IH0KLWlubGluZSBib29sIGlzTG9hZE11bHRpcGxlKE9wY29kZSBvcCkgewotICAgIHJldHVybiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRMb2FkTXVsdGlwbGUpID09IGtDYXRMb2FkTXVsdGlwbGU7Ci19Ci1pbmxpbmUgYm9vbCBpc1N0b3JlTXVsdGlwbGUoT3Bjb2RlIG9wKSB7Ci0gICAgcmV0dXJuIChvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdFN0b3JlTXVsdGlwbGUpID09IGtDYXRTdG9yZU11bHRpcGxlOwotfQotaW5saW5lIGJvb2wgaXNTdG9yZShPcGNvZGUgb3ApICB7IHJldHVybiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRTdG9yZSkgIT0gMDsgfQotaW5saW5lIGJvb2wgaXNTaWduZWQoT3Bjb2RlIG9wKSB7IHJldHVybiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRTaWduZWQpICE9IDA7IH0KLWlubGluZSBib29sIGlzTWVtb3J5UmVmKE9wY29kZSBvcCkgewotICAgIHJldHVybiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRNZW1vcnlSZWYpICE9IDA7Ci19Ci1pbmxpbmUgaW50IGdldEFjY2Vzc1NpemUoT3Bjb2RlIG9wKSB7IHJldHVybiBvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdE51bUJ5dGVzOyB9Ci1pbmxpbmUgYm9vbCBpc0NvcHJvYyhPcGNvZGUgb3ApIHsgcmV0dXJuIChvcGNvZGVfZmxhZ3Nbb3BdICYga0NhdENvcHJvYykgIT0gMDsgfQotaW5saW5lIGludCBnZXROdW1BY2Nlc3NlcyhPcGNvZGUgb3AsIHVpbnQzMl90IGJpbmFyeSkgewotICBleHRlcm4gaW50IG51bV9vbmVfYml0c1tdOwotICBpbnQgbnVtX2FjY2Vzc2VzID0gMDsKLSAgaWYgKG9wY29kZV9mbGFnc1tvcF0gJiBrQ2F0TnVtQnl0ZXMpCi0gICAgbnVtX2FjY2Vzc2VzID0gMTsKLSAgZWxzZSBpZiAob3Bjb2RlX2ZsYWdzW29wXSAmIGtDYXRNdWx0aXBsZSkgewotICAgIG51bV9hY2Nlc3NlcyA9IG51bV9vbmVfYml0c1soYmluYXJ5ID4+IDgpICYgMHhmZl0KLSAgICAgICAgICAgICAgICAgICArIG51bV9vbmVfYml0c1tiaW5hcnkgJiAweGZmXTsKLSAgfQotICByZXR1cm4gbnVtX2FjY2Vzc2VzOwotfQotCi0jZW5kaWYgIC8vIE9QQ09ERV9ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcGFyc2Vfb3B0aW9ucy1pbmwuaCBiL2VtdWxhdG9yL3F0b29scy9wYXJzZV9vcHRpb25zLWlubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI5ZGY0Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9wYXJzZV9vcHRpb25zLWlubC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotI2lmbmRlZiBQQVJTRV9PUFRJT05TX0lOTF9ICi0jZGVmaW5lIFBBUlNFX09QVElPTlNfSU5MX0gKLQotLy8gRGVmaW5lIGEgdHlwZWRlZiBmb3IgVHJhY2VSZWFkZXJUeXBlIGFuZCBpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0vLyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGZpbGUgaW4gYSBDKysgc291cmNlIGZpbGUuCi0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLyAKLS8vIHN0cnVjdCBzeW1ib2wgewotLy8gICBpbnQgIGVsYXBzZWQ7Ci0vLyB9OwotLy8gCi0vLyB0eXBlZGVmIFRyYWNlUmVhZGVyPHN5bWJvbD4gVHJhY2VSZWFkZXJUeXBlOwotCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXJUeXBlOjpzeW1ib2xfdHlwZSBzeW1ib2xfdHlwZTsKLXR5cGVkZWYgVHJhY2VSZWFkZXJUeXBlOjpyZWdpb25fdHlwZSByZWdpb25fdHlwZTsKLXR5cGVkZWYgVHJhY2VSZWFkZXJUeXBlOjpQcm9jZXNzU3RhdGUgUHJvY2Vzc1N0YXRlOwotCi1zeW1ib2xfdHlwZSAqa2VybmVsX3N5bTsKLXN5bWJvbF90eXBlICpsaWJyYXJ5X3N5bTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBldmVudCBpcyBpbmNsdWRlZCAob3Igbm90IGV4Y2x1ZGVkKQotLy8gZnJvbSB0aGUgbGlzdCBvZiB2YWxpZCBldmVudHMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIG9uIHRoZQotLy8gY29tbWFuZCBsaW5lLgotaW5saW5lIGJvb2wgSXNWYWxpZEV2ZW50KEJCRXZlbnQgKmV2ZW50LCBzeW1ib2xfdHlwZSAqc3ltKQotewotICBpZiAoaW5jbHVkZV9zb21lX3BpZHMgJiYgcGlkX2luY2x1ZGVfdmVjdG9yLkdldEJpdChldmVudC0+cGlkKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZXhjbHVkZV9zb21lX3BpZHMgJiYgcGlkX2V4Y2x1ZGVfdmVjdG9yLkdldEJpdChldmVudC0+cGlkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGluY2x1ZGVfc29tZV9wcm9jZWR1cmVzKSB7Ci0gICAgaWYgKHN5bSA9PSBOVUxMIHx8IGluY2x1ZGVkX3Byb2NlZHVyZXMuRmluZChzeW0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGV4Y2x1ZGVfc29tZV9wcm9jZWR1cmVzKSB7Ci0gICAgaWYgKHN5bSA9PSBOVUxMIHx8IGV4Y2x1ZGVkX3Byb2NlZHVyZXMuRmluZChzeW0tPm5hbWUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgYm9vbCBJc1ZhbGlkUGlkKGludCBwaWQpIHsKLSAgaWYgKGluY2x1ZGVfc29tZV9waWRzICYmIHBpZF9pbmNsdWRlX3ZlY3Rvci5HZXRCaXQocGlkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGV4Y2x1ZGVfc29tZV9waWRzICYmIHBpZF9leGNsdWRlX3ZlY3Rvci5HZXRCaXQocGlkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgc3ltYm9sX3R5cGUgKkdldFN5bWJvbChUcmFjZVJlYWRlclR5cGUgKnRyYWNlLCBpbnQgcGlkLCB1aW50MzJfdCBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSkKLXsKLSAgc3ltYm9sX3R5cGUgKnN5bSA9IHRyYWNlLT5Mb29rdXBGdW5jdGlvbihwaWQsIGFkZHIsIHRpbWUpOwotCi0gIGlmIChsdW1wX2tlcm5lbCAmJiAoc3ltLT5yZWdpb24tPmZsYWdzICYgcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbikpIHsKLSAgICBpZiAoa2VybmVsX3N5bSA9PSBOVUxMKSB7Ci0gICAgICBrZXJuZWxfc3ltID0gc3ltOwotICAgICAgc3ltLT5uYW1lID0gIjprZXJuZWwiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzeW0gPSBrZXJuZWxfc3ltOwotICAgIH0KLSAgfQotCi0gIGlmIChsdW1wX2xpYnJhcmllcyAmJiAoc3ltLT5yZWdpb24tPmZsYWdzICYgcmVnaW9uX3R5cGU6OmtJc0xpYnJhcnlSZWdpb24pKSB7Ci0gICAgaWYgKGxpYnJhcnlfc3ltID09IE5VTEwpIHsKLSAgICAgIGxpYnJhcnlfc3ltID0gc3ltOwotICAgICAgc3ltLT5uYW1lID0gIjpsaWJzIjsKLSAgICB9IGVsc2UgewotICAgICAgc3ltID0gbGlicmFyeV9zeW07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN5bTsKLX0KLQotaW5saW5lIGJvb2wgSXNJbmNsdWRlZFByb2NlZHVyZShzeW1ib2xfdHlwZSAqc3ltKQotewotICBpZiAoaW5jbHVkZV9rZXJuZWxfc3ltcyAmJiAoc3ltLT5yZWdpb24tPmZsYWdzICYgcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbikpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpbmNsdWRlX2xpYnJhcnlfc3ltcyAmJiAoc3ltLT5yZWdpb24tPmZsYWdzICYgcmVnaW9uX3R5cGU6OmtJc0xpYnJhcnlSZWdpb24pKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gaW5jbHVkZWRfcHJvY2VkdXJlcy5GaW5kKHN5bS0+bmFtZSk7Ci19Ci0KLWlubGluZSBib29sIElzRXhjbHVkZWRQcm9jZWR1cmUoc3ltYm9sX3R5cGUgKnN5bSkKLXsKLSAgaWYgKGV4Y2x1ZGVfa2VybmVsX3N5bXMgJiYgKHN5bS0+cmVnaW9uLT5mbGFncyAmIHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb24pKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoZXhjbHVkZV9saWJyYXJ5X3N5bXMgJiYgKHN5bS0+cmVnaW9uLT5mbGFncyAmIHJlZ2lvbl90eXBlOjprSXNMaWJyYXJ5UmVnaW9uKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGV4Y2x1ZGVkX3Byb2NlZHVyZXMuRmluZChzeW0tPm5hbWUpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgb24gZW5kLW9mLWZpbGUuCi1pbmxpbmUgYm9vbCBHZXROZXh0VmFsaWRFdmVudChUcmFjZVJlYWRlclR5cGUgKnRyYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkJFdmVudCAqZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQkV2ZW50ICpmaXJzdF9pZ25vcmVkX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX3R5cGUgKipzeW1fcHRyKQotewotICBzeW1ib2xfdHlwZSAqc3ltID0gTlVMTDsKLSAgZmlyc3RfaWdub3JlZF9ldmVudC0+dGltZSA9IDA7Ci0gIGlmICh0cmFjZS0+UmVhZEJCKGV2ZW50KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgYm9vbCByZWNoZWNrID0gdHJ1ZTsKLSAgd2hpbGUgKHJlY2hlY2spIHsKLSAgICByZWNoZWNrID0gZmFsc2U7Ci0gICAgaWYgKGluY2x1ZGVfc29tZV9waWRzKSB7Ci0gICAgICB3aGlsZSAocGlkX2luY2x1ZGVfdmVjdG9yLkdldEJpdChldmVudC0+cGlkKSA9PSAwKSB7Ci0gICAgICAgIGlmIChmaXJzdF9pZ25vcmVkX2V2ZW50LT50aW1lID09IDApCi0gICAgICAgICAgKmZpcnN0X2lnbm9yZWRfZXZlbnQgPSAqZXZlbnQ7Ci0gICAgICAgIGlmICh0cmFjZS0+UmVhZEJCKGV2ZW50KSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGV4Y2x1ZGVfc29tZV9waWRzKSB7Ci0gICAgICB3aGlsZSAocGlkX2V4Y2x1ZGVfdmVjdG9yLkdldEJpdChldmVudC0+cGlkKSkgewotICAgICAgICBpZiAoZmlyc3RfaWdub3JlZF9ldmVudC0+dGltZSA9PSAwKQotICAgICAgICAgICpmaXJzdF9pZ25vcmVkX2V2ZW50ID0gKmV2ZW50OwotICAgICAgICBpZiAodHJhY2UtPlJlYWRCQihldmVudCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGluY2x1ZGVfc29tZV9wcm9jZWR1cmVzKSB7Ci0gICAgICBzeW0gPSBHZXRTeW1ib2wodHJhY2UsIGV2ZW50LT5waWQsIGV2ZW50LT5iYl9hZGRyLCBldmVudC0+dGltZSk7Ci0gICAgICB3aGlsZSAoIUlzSW5jbHVkZWRQcm9jZWR1cmUoc3ltKSkgewotICAgICAgICBpZiAoZmlyc3RfaWdub3JlZF9ldmVudC0+dGltZSA9PSAwKQotICAgICAgICAgICpmaXJzdF9pZ25vcmVkX2V2ZW50ID0gKmV2ZW50OwotICAgICAgICBpZiAodHJhY2UtPlJlYWRCQihldmVudCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJlY2hlY2sgPSB0cnVlOwotICAgICAgICBzeW0gPSBHZXRTeW1ib2wodHJhY2UsIGV2ZW50LT5waWQsIGV2ZW50LT5iYl9hZGRyLCBldmVudC0+dGltZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChleGNsdWRlX3NvbWVfcHJvY2VkdXJlcykgewotICAgICAgc3ltID0gR2V0U3ltYm9sKHRyYWNlLCBldmVudC0+cGlkLCBldmVudC0+YmJfYWRkciwgZXZlbnQtPnRpbWUpOwotICAgICAgd2hpbGUgKElzRXhjbHVkZWRQcm9jZWR1cmUoc3ltKSkgewotICAgICAgICBpZiAoZmlyc3RfaWdub3JlZF9ldmVudC0+dGltZSA9PSAwKQotICAgICAgICAgICpmaXJzdF9pZ25vcmVkX2V2ZW50ID0gKmV2ZW50OwotICAgICAgICBpZiAodHJhY2UtPlJlYWRCQihldmVudCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJlY2hlY2sgPSB0cnVlOwotICAgICAgICBzeW0gPSBHZXRTeW1ib2wodHJhY2UsIGV2ZW50LT5waWQsIGV2ZW50LT5iYl9hZGRyLCBldmVudC0+dGltZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICBzeW0gPSBHZXRTeW1ib2wodHJhY2UsIGV2ZW50LT5waWQsIGV2ZW50LT5iYl9hZGRyLCBldmVudC0+dGltZSk7Ci0KLSAgKnN5bV9wdHIgPSBzeW07Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2VuZGlmICAvLyBQQVJTRV9PUFRJT05TX0lOTF9ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcGFyc2Vfb3B0aW9ucy5jcHAgYi9lbXVsYXRvci9xdG9vbHMvcGFyc2Vfb3B0aW9ucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWU5YTEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3BhcnNlX29wdGlvbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYml0dmVjdG9yLmgiCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy5oIgotI2luY2x1ZGUgImhhc2hfdGFibGUuaCIKLQotY29uc3QgY2hhciAqcm9vdCA9ICIiOwotYm9vbCBsdW1wX2tlcm5lbDsKLWJvb2wgbHVtcF9saWJyYXJpZXM7Ci1CaXR2ZWN0b3IgcGlkX2luY2x1ZGVfdmVjdG9yKDMyNzY4KTsKLUJpdHZlY3RvciBwaWRfZXhjbHVkZV92ZWN0b3IoMzI3NjgpOwotYm9vbCBpbmNsdWRlX3NvbWVfcGlkczsKLWJvb2wgZXhjbHVkZV9zb21lX3BpZHM7Ci0KLUhhc2hUYWJsZTxpbnQ+IGV4Y2x1ZGVkX3Byb2NlZHVyZXMoMjAwMCk7Ci1IYXNoVGFibGU8aW50PiBpbmNsdWRlZF9wcm9jZWR1cmVzKDIwMDApOwotYm9vbCBleGNsdWRlX3NvbWVfcHJvY2VkdXJlczsKLWJvb2wgaW5jbHVkZV9zb21lX3Byb2NlZHVyZXM7Ci0KLWJvb2wgZXhjbHVkZV9rZXJuZWxfc3ltczsKLWJvb2wgZXhjbHVkZV9saWJyYXJ5X3N5bXM7Ci1ib29sIGluY2x1ZGVfa2VybmVsX3N5bXM7Ci1ib29sIGluY2x1ZGVfbGlicmFyeV9zeW1zOwotYm9vbCBkZW1hbmdsZSA9IHRydWU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpPcHRpb25zVXNhZ2VTdHIgPQotICAgICIgIC1lIDprZXJuZWwgZXhjbHVkZSBhbGwga2VybmVsIHN5bWJvbHNcbiIKLSAgICAiICAtZSA6bGlicyAgIGV4Y2x1ZGUgYWxsIGxpYnJhcnkgc3ltYm9sc1xuIgotICAgICIgIC1lIDxmdW5jPiAgZXhjbHVkZSBmdW5jdGlvbiA8ZnVuYz5cbiIKLSAgICAiICAtZSA8cGlkPiAgIGV4Y2x1ZGUgcHJvY2VzcyA8cGlkPlxuIgotICAgICIgIC1pIDprZXJuZWwgaW5jbHVkZSBhbGwga2VybmVsIHN5bWJvbHNcbiIKLSAgICAiICAtaSA6bGlicyAgIGluY2x1ZGUgYWxsIGxpYnJhcnkgc3ltYm9sc1xuIgotICAgICIgIC1pIDxmdW5jPiAgaW5jbHVkZSBmdW5jdGlvbiA8ZnVuYz5cbiIKLSAgICAiICAtaSA8cGlkPiAgIGluY2x1ZGUgcHJvY2VzcyA8cGlkPlxuIgotICAgICIgIC1sIDprZXJuZWwgbHVtcCBhbGwgdGhlIGtlcm5lbCBzeW1ib2xzIHRvZ2V0aGVyXG4iCi0gICAgIiAgLWwgOmxpYnMgICBsdW1wIGFsbCB0aGUgbGlicmFyeSBzeW1ib2xzIHRvZ2V0aGVyXG4iCi0gICAgIiAgLW0gICAgICAgICBkbyBub3QgZGVtYW5nbGUgQysrIHN5bWJvbHMgKG0gZm9yICdtYW5nbGUnKVxuIgotICAgICIgIC1yIDxyb290PiAgdXNlIDxyb290PiBhcyB0aGUgcGF0aCBmb3IgZmluZGluZyBFTEYgZXhlY3V0YWJsZXNcbiIKLSAgICA7Ci0KLXZvaWQgT3B0aW9uc1VzYWdlKCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgT3B0aW9uc1VzYWdlU3RyKTsKLX0KLQotdm9pZCBQYXJzZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGJvb2wgZXJyID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFlcnIpIHsKLSAgICAgICAgaW50IG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK2U6aTpsOm1yOiIpOwotICAgICAgICBpZiAob3B0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN3aXRjaCAob3B0KSB7Ci0gICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgaWYgKCpvcHRhcmcgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChvcHRhcmcsICI6a2VybmVsIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9rZXJuZWxfc3ltcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIjpsaWJzIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9saWJyYXJ5X3N5bXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBleGNsdWRlZF9wcm9jZWR1cmVzLlVwZGF0ZShvcHRhcmcsIDEpOwotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc29tZV9wcm9jZWR1cmVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgqb3B0YXJnKSkgewotICAgICAgICAgICAgICAgIGludCBiaXRudW0gPSBhdG9pKG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgcGlkX2V4Y2x1ZGVfdmVjdG9yLlNldEJpdChiaXRudW0pOwotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc29tZV9waWRzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZWRfcHJvY2VkdXJlcy5VcGRhdGUob3B0YXJnLCAxKTsKLSAgICAgICAgICAgICAgICBleGNsdWRlX3NvbWVfcHJvY2VkdXJlcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICBpZiAoKm9wdGFyZyA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG9wdGFyZywgIjprZXJuZWwiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2tlcm5lbF9zeW1zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiOmxpYnMiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2xpYnJhcnlfc3ltcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGluY2x1ZGVkX3Byb2NlZHVyZXMuVXBkYXRlKG9wdGFyZywgMSk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZV9zb21lX3Byb2NlZHVyZXMgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCpvcHRhcmcpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGJpdG51bSA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgICAgICAgICBwaWRfaW5jbHVkZV92ZWN0b3IuU2V0Qml0KGJpdG51bSk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZV9zb21lX3BpZHMgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlZF9wcm9jZWR1cmVzLlVwZGF0ZShvcHRhcmcsIDEpOwotICAgICAgICAgICAgICAgIGluY2x1ZGVfc29tZV9wcm9jZWR1cmVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgIGlmIChzdHJjbXAob3B0YXJnLCAiOmtlcm5lbCIpID09IDApCi0gICAgICAgICAgICAgICAgbHVtcF9rZXJuZWwgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIjpsaWJzIikgPT0gMCkKLSAgICAgICAgICAgICAgICBsdW1wX2xpYnJhcmllcyA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgIGRlbWFuZ2xlID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICByb290ID0gb3B0YXJnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9wYXJzZV9vcHRpb25zLmggYi9lbXVsYXRvci9xdG9vbHMvcGFyc2Vfb3B0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNiYjllLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9wYXJzZV9vcHRpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpZm5kZWYgUEFSU0VfT1BUSU9OU19ICi0jZGVmaW5lIFBBUlNFX09QVElPTlNfSAotCi0jaW5jbHVkZSAiYml0dmVjdG9yLmgiCi0jaW5jbHVkZSAiaGFzaF90YWJsZS5oIgotCi1leHRlcm4gY29uc3QgY2hhciAqcm9vdDsKLWV4dGVybiBib29sIGx1bXBfa2VybmVsOwotZXh0ZXJuIGJvb2wgbHVtcF9saWJyYXJpZXM7Ci1leHRlcm4gQml0dmVjdG9yIHBpZF9pbmNsdWRlX3ZlY3RvcjsKLWV4dGVybiBCaXR2ZWN0b3IgcGlkX2V4Y2x1ZGVfdmVjdG9yOwotZXh0ZXJuIGJvb2wgaW5jbHVkZV9zb21lX3BpZHM7Ci1leHRlcm4gYm9vbCBleGNsdWRlX3NvbWVfcGlkczsKLQotZXh0ZXJuIEhhc2hUYWJsZTxpbnQ+IGV4Y2x1ZGVkX3Byb2NlZHVyZXM7Ci1leHRlcm4gSGFzaFRhYmxlPGludD4gaW5jbHVkZWRfcHJvY2VkdXJlczsKLWV4dGVybiBib29sIGV4Y2x1ZGVfc29tZV9wcm9jZWR1cmVzOwotZXh0ZXJuIGJvb2wgaW5jbHVkZV9zb21lX3Byb2NlZHVyZXM7Ci0KLWV4dGVybiBib29sIGV4Y2x1ZGVfa2VybmVsX3N5bXM7Ci1leHRlcm4gYm9vbCBleGNsdWRlX2xpYnJhcnlfc3ltczsKLWV4dGVybiBib29sIGluY2x1ZGVfa2VybmVsX3N5bXM7Ci1leHRlcm4gYm9vbCBpbmNsdWRlX2xpYnJhcnlfc3ltczsKLWV4dGVybiBib29sIGRlbWFuZ2xlOwotCi1leHRlcm4gdm9pZCBVc2FnZShjb25zdCBjaGFyICpwcm9ncmFtKTsKLWV4dGVybiB2b2lkIFBhcnNlT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwotZXh0ZXJuIHZvaWQgT3B0aW9uc1VzYWdlKCk7Ci0KLSNlbmRpZiAgLy8gUEFSU0VfT1BUSU9OU19ICmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcG9zdF90cmFjZS5jcHAgYi9lbXVsYXRvci9xdG9vbHMvcG9zdF90cmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlY2ZjMmIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3Bvc3RfdHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0KLXR5cGVkZWYgc3RydWN0IE15U3RhdGljUmVjIHsKLSAgU3RhdGljUmVjIGJiOwotICB1aW50MzJfdCAgKmluc25zOwotfSBNeVN0YXRpY1JlYzsKLQotY29uc3QgaW50IGtOdW1QaWRzID0gMzI3Njg7Ci1jaGFyIHVzZWRQaWRzW2tOdW1QaWRzXTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHVpbnQzMl90IGluc25zW2tNYXhJbnNuUGVyQkJdOwotCi0gIGlmIChhcmdjICE9IDIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyB0cmFjZV9maWxlXG4iLCBhcmd2WzBdKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgY2hhciAqdHJhY2VfZmlsZW5hbWUgPSBhcmd2WzFdOwotICBUcmFjZVJlYWRlckJhc2UgKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyQmFzZTsKLSAgdHJhY2UtPlNldFBvc3RQcm9jZXNzaW5nKHRydWUpOwotICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0KLSAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBzdGF0aWMgYmFzaWMgYmxvY2tzIGFuZCBpbnN0cnVjdGlvbnMuCi0gIHVpbnQ2NF90IG51bV9zdGF0aWNfYmIgPSAwOwotICB1aW50NjRfdCBudW1fc3RhdGljX2luc24gPSAwOwotICB3aGlsZSAoMSkgewotICAgIFN0YXRpY1JlYyBzdGF0aWNfcmVjOwotCi0gICAgaWYgKHRyYWNlLT5SZWFkU3RhdGljKCZzdGF0aWNfcmVjKSkKLSAgICAgIGJyZWFrOwotICAgIGlmIChzdGF0aWNfcmVjLmJiX251bSAhPSBudW1fc3RhdGljX2JiKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgIkVycm9yOiBiYXNpYyBibG9jayBudW1iZXJzIG91dCBvZiBvcmRlcjsgZXhwZWN0ZWQgJWxsZCwgZ290ICVsbGRcbiIsCi0gICAgICAgICAgICAgIG51bV9zdGF0aWNfYmIsIHN0YXRpY19yZWMuYmJfbnVtKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIG51bV9zdGF0aWNfYmIgKz0gMTsKLSAgICBudW1fc3RhdGljX2luc24gKz0gc3RhdGljX3JlYy5udW1faW5zbnM7Ci0gICAgdHJhY2UtPlJlYWRTdGF0aWNJbnNucyhzdGF0aWNfcmVjLm51bV9pbnNucywgaW5zbnMpOwotICB9Ci0gIHRyYWNlLT5DbG9zZSgpOwotCi0gIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIHN0YXRpYyBibG9ja3MKLSAgTXlTdGF0aWNSZWMgKmJsb2NrcyA9IG5ldyBNeVN0YXRpY1JlY1tudW1fc3RhdGljX2JiXTsKLQotICAvLyBSZWFkIHRoZSBzdGF0aWMgYmxvY2tzIGFnYWluIGFuZCBzYXZlIHBvaW50ZXJzIHRvIHRoZW0KLSAgdHJhY2UtPk9wZW4odHJhY2VfZmlsZW5hbWUpOwotICBmb3IgKHVpbnQzMl90IGlpID0gMDsgaWkgPCBudW1fc3RhdGljX2JiOyArK2lpKSB7Ci0gICAgdHJhY2UtPlJlYWRTdGF0aWMoJmJsb2Nrc1tpaV0uYmIpOwotICAgIHVpbnQzMl90IG51bV9pbnNucyA9IGJsb2Nrc1tpaV0uYmIubnVtX2luc25zOwotICAgIGlmIChudW1faW5zbnMgPiAwKSB7Ci0gICAgICBibG9ja3NbaWldLmluc25zID0gbmV3IHVpbnQzMl90W251bV9pbnNuc107Ci0gICAgICB0cmFjZS0+UmVhZFN0YXRpY0luc25zKG51bV9pbnNucywgYmxvY2tzW2lpXS5pbnNucyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGxhc3QgYmFzaWMgYmxvY2suICBJZiBpdCBjb250YWlucyBhIHNwZWNpYWwgdW5kZWZpbmVkCi0gIC8vIGluc3RydWN0aW9uLCB0aGVuIHRydW5jYXRlIHRoZSBiYXNpYyBibG9jayBhdCB0aGF0IHBvaW50LgotICB1aW50MzJfdCBudW1faW5zbnMgPSBibG9ja3NbbnVtX3N0YXRpY19iYiAtIDFdLmJiLm51bV9pbnNuczsKLSAgdWludDMyX3QgKmluc25fcHRyID0gYmxvY2tzW251bV9zdGF0aWNfYmIgLSAxXS5pbnNuczsKLSAgZm9yICh1aW50MzJfdCBpaSA9IDA7IGlpIDwgbnVtX2luc25zOyArK2lpLCArK2luc25fcHRyKSB7Ci0gICAgaWYgKCppbnNuX3B0ciA9PSAweGU2YzAwMTEwKSB7Ci0gICAgICB1aW50MzJfdCBhY3R1YWxfbnVtX2luc25zID0gaWkgKyAxOwotICAgICAgYmxvY2tzW251bV9zdGF0aWNfYmIgLSAxXS5iYi5udW1faW5zbnMgPSBhY3R1YWxfbnVtX2luc25zOwotICAgICAgbnVtX3N0YXRpY19pbnNuIC09IChudW1faW5zbnMgLSBhY3R1YWxfbnVtX2luc25zKTsKLQotICAgICAgLy8gV3JpdGUgdGhlIGNoYW5nZXMgYmFjayB0byB0aGUgdHJhY2UgZmlsZQotICAgICAgdHJhY2UtPlRydW5jYXRlTGFzdEJsb2NrKGFjdHVhbF9udW1faW5zbnMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFRyYWNlSGVhZGVyICpoZWFkZXIgPSB0cmFjZS0+R2V0SGVhZGVyKCk7Ci0gIHN0cmNweShoZWFkZXItPmlkZW50LCBUUkFDRV9JREVOVCk7Ci0gIGhlYWRlci0+bnVtX3N0YXRpY19iYiA9IG51bV9zdGF0aWNfYmI7Ci0gIGhlYWRlci0+bnVtX2R5bmFtaWNfYmIgPSAwOwotICBoZWFkZXItPm51bV9zdGF0aWNfaW5zbiA9IG51bV9zdGF0aWNfaW5zbjsKLSAgaGVhZGVyLT5udW1fZHluYW1pY19pbnNuID0gMDsKLSAgdHJhY2UtPldyaXRlSGVhZGVyKGhlYWRlcik7Ci0KLSAgLy8gUmVvcGVuIHRoZSB0cmFjZSBmaWxlIGluIG9yZGVyIHRvIGZvcmNlIHRoZSB0cmFjZSBtYW5hZ2VyIHRvIHJlcmVhZAotICAvLyB0aGUgc3RhdGljIGJsb2NrcyBub3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUKLSAgLy8gaGVhZGVyLgotICB0cmFjZS0+Q2xvc2UoKTsKLSAgdHJhY2UtPk9wZW4odHJhY2VfZmlsZW5hbWUpOwotCi0gIC8vIENvdW50IHRoZSBudW1iZXIgb2YgZHluYW1pYyBleGVjdXRpb25zIG9mIGJhc2ljIGJsb2NrcyBhbmQgaW5zdHJ1Y3Rpb25zLgotICAvLyBBbHNvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcHJvY2VzcyBpZHMgYXJlIHVzZWQuCi0gIHVpbnQ2NF90IG51bV9keW5hbWljX2JiID0gMDsKLSAgdWludDY0X3QgbnVtX2R5bmFtaWNfaW5zbiA9IDA7Ci0gIHdoaWxlICgxKSB7Ci0gICAgQkJFdmVudCBldmVudDsKLQotICAgIGlmICh0cmFjZS0+UmVhZEJCKCZldmVudCkpCi0gICAgICBicmVhazsKLSAgICBpZiAoZXZlbnQuYmJfbnVtID49IG51bV9zdGF0aWNfYmIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAiRXJyb3I6IGJhc2ljIGJsb2NrIG51bWJlciAoJWxsZCkgdG9vIGxhcmdlIChudW0gYmxvY2tzOiAlbGxkKVxuIiwKLSAgICAgICAgICAgICAgZXZlbnQuYmJfbnVtLCBudW1fc3RhdGljX2JiKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHVzZWRQaWRzW2V2ZW50LnBpZF0gPSAxOwotICAgIG51bV9keW5hbWljX2JiICs9IDE7Ci0gICAgbnVtX2R5bmFtaWNfaW5zbiArPSBldmVudC5udW1faW5zbnM7Ci0gIH0KLQotICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHByb2Nlc3MgaWRzIHRoYXQgYXJlIHVzZWQgYW5kIHJlbWVtYmVyIHRoZSBmaXJzdAotICAvLyB1bnVzZWQgcGlkLgotICBpbnQgbnVtVXNlZFBpZHMgPSAwOwotICBpbnQgdW51c2VkUGlkID0gLTE7Ci0gIGZvciAoaW50IHBpZCA9IDA7IHBpZCA8IGtOdW1QaWRzOyBwaWQrKykgewotICAgICAgaWYgKHVzZWRQaWRzW3BpZF0gPT0gMSkgewotICAgICAgICAgIG51bVVzZWRQaWRzICs9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHVudXNlZFBpZCA9PSAtMSkgewotICAgICAgICAgIHVudXNlZFBpZCA9IHBpZDsKLSAgICAgIH0KLSAgfQotCi0gIC8vIFJld3JpdGUgdGhlIGhlYWRlciB3aXRoIHRoZSBkeW5hbWljIGNvdW50cwotICBoZWFkZXItPm51bV9keW5hbWljX2JiID0gbnVtX2R5bmFtaWNfYmI7Ci0gIGhlYWRlci0+bnVtX2R5bmFtaWNfaW5zbiA9IG51bV9keW5hbWljX2luc247Ci0gIGhlYWRlci0+bnVtX3VzZWRfcGlkcyA9IG51bVVzZWRQaWRzOwotICBoZWFkZXItPmZpcnN0X3VudXNlZF9waWQgPSB1bnVzZWRQaWQ7Ci0gIHRyYWNlLT5Xcml0ZUhlYWRlcihoZWFkZXIpOwotICB0cmFjZS0+Q2xvc2UoKTsKLQotICBwcmludGYoIlN0YXRpYyBiYXNpYyBibG9ja3M6ICVsbHUsIER5bmFtaWMgYmFzaWMgYmxvY2tzOiAlbGx1XG4iLAotICAgICAgICAgbnVtX3N0YXRpY19iYiwgbnVtX2R5bmFtaWNfYmIpOwotICBwcmludGYoIlN0YXRpYyBpbnN0cnVjdGlvbnM6ICVsbHUsIER5bmFtaWMgaW5zdHJ1Y3Rpb25zOiAlbGx1XG4iLAotICAgICAgICAgbnVtX3N0YXRpY19pbnNuLCBudW1fZHluYW1pY19pbnNuKTsKLQotICBkb3VibGUgZWxhcHNlZF9zZWNzID0gaGVhZGVyLT5lbGFwc2VkX3VzZWNzIC8gMTAwMDAwMC4wOwotICBkb3VibGUgaW5zbl9wZXJfc2VjID0gMDsKLSAgaWYgKGVsYXBzZWRfc2VjcyAhPSAwKQotICAgIGluc25fcGVyX3NlYyA9IG51bV9keW5hbWljX2luc24gLyBlbGFwc2VkX3NlY3M7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeCA9ICIiOwotICBpZiAoaW5zbl9wZXJfc2VjID49IDEwMDAwMDApIHsKLSAgICBpbnNuX3Blcl9zZWMgLz0gMTAwMDAwMC4wOwotICAgIHN1ZmZpeCA9ICJNIjsKLSAgfSBlbHNlIGlmIChpbnNuX3Blcl9zZWMgPiAxMDAwKSB7Ci0gICAgaW5zbl9wZXJfc2VjIC89IDEwMDAuMDsKLSAgICBzdWZmaXggPSAiSyI7Ci0gIH0KLSAgcHJpbnRmKCJFbGFwc2VkIHNlY29uZHM6ICUuMmYsIHNpbXVsYXRlZCBpbnN0cnVjdGlvbnMvc2VjOiAlLjFmJXNcbiIsCi0gICAgICAgICBlbGFwc2VkX3NlY3MsIGluc25fcGVyX3NlYywgc3VmZml4KTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcHJvZmlsZV9waWQuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3Byb2ZpbGVfcGlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhY2JmOS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvcHJvZmlsZV9waWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0KLXR5cGVkZWYgVHJhY2VSZWFkZXI8PiBUcmFjZVJlYWRlclR5cGU7Ci0KLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLWlubC5oIgotCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHF1aWNrc29ydCB0byBjb21wYXJlIHRoZSBjcHUgdGltZQotLy8gb2YgcHJvY2Vzc2VzIGFuZCBzb3J0IGludG8gZGVjcmVhc2luZyBvcmRlci4KLWludCBjbXBfZGVjX2NwdV90aW1lKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKLSAgUHJvY2Vzc1N0YXRlICpwcm9jMSwgKnByb2MyOwotCi0gIHByb2MxID0gKFByb2Nlc3NTdGF0ZSopYTsKLSAgcHJvYzIgPSAoUHJvY2Vzc1N0YXRlKiliOwotICBpZiAocHJvYzEgPT0gTlVMTCkgewotICAgIGlmIChwcm9jMiA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKHByb2MyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotICBpZiAocHJvYzEtPmNwdV90aW1lIDwgcHJvYzItPmNwdV90aW1lKQotICAgIHJldHVybiAxOwotICBpZiAocHJvYzEtPmNwdV90aW1lID4gcHJvYzItPmNwdV90aW1lKQotICAgIHJldHVybiAtMTsKLSAgLy8gSWYgdGhlIGNwdV90aW1lIHRpbWVzIGFyZSB0aGUgc2FtZSwgdGhlbiBzb3J0IGludG8gaW5jcmVhc2luZwotICAvLyBvcmRlciBvZiBwaWQuCi0gIHJldHVybiBwcm9jMS0+cGlkIC0gcHJvYzItPnBpZDsKLX0KLQotdm9pZCBVc2FnZShjb25zdCBjaGFyICpwcm9ncmFtKQotewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gdHJhY2VfZmlsZVxuIiwgcHJvZ3JhbSk7Ci0gIE9wdGlvbnNVc2FnZSgpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgLy8gUGFyc2UgdGhlIG9wdGlvbnMKLSAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICBpZiAoYXJnYyAtIG9wdGluZCAhPSAxKSB7Ci0gICAgVXNhZ2UoYXJndlswXSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICBUcmFjZVJlYWRlcjw+ICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlcjw+OwotICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0gIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gIHdoaWxlICgxKSB7Ci0gICAgQkJFdmVudCBldmVudCwgaWdub3JlZDsKLSAgICBzeW1ib2xfdHlwZSAqZHVtbXlfc3ltOwotCi0gICAgaWYgKEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmZHVtbXlfc3ltKSkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaW50IG51bV9wcm9jczsKLSAgUHJvY2Vzc1N0YXRlICpwcm9jZXNzZXMgPSB0cmFjZS0+R2V0UHJvY2Vzc2VzKCZudW1fcHJvY3MpOwotICBxc29ydChwcm9jZXNzZXMsIG51bV9wcm9jcywgc2l6ZW9mKFByb2Nlc3NTdGF0ZSksIGNtcF9kZWNfY3B1X3RpbWUpOwotCi0gIHVpbnQ2NF90IHRvdGFsX3RpbWUgPSAwOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3Byb2NzOyArK2lpKSB7Ci0gICAgdG90YWxfdGltZSArPSBwcm9jZXNzZXNbaWldLmNwdV90aW1lOwotICB9Ci0KLSAgdWludDY0X3Qgc3VtX3RpbWUgPSAwOwotICBwcmludGYoIiAgcGlkIHBhcmVudCAgIGNwdV90aW1lICAgICAgJSUgICAgICAlJSBmbGFncyBhcmd2XG4iKTsgCi0gIFByb2Nlc3NTdGF0ZSAqcHN0YXRlID0gJnByb2Nlc3Nlc1swXTsKLSAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9wcm9jczsgKytpaSwgKytwc3RhdGUpIHsKLSAgICBzdW1fdGltZSArPSBwc3RhdGUtPmNwdV90aW1lOwotICAgIGRvdWJsZSBwZXIgPSAxMDAuMCAqIHBzdGF0ZS0+Y3B1X3RpbWUgLyB0b3RhbF90aW1lOwotICAgIGRvdWJsZSBzdW1fcGVyID0gMTAwLjAgKiBzdW1fdGltZSAvIHRvdGFsX3RpbWU7Ci0gICAgY29uc3QgY2hhciAqcHJpbnRfZmxhZ3MgPSAiIjsKLSAgICBpZiAoKHBzdGF0ZS0+ZmxhZ3MgJiBQcm9jZXNzU3RhdGU6OmtDYWxsZWRFeGVjKSA9PSAwKQotICAgICAgcHJpbnRfZmxhZ3MgPSAiVCI7Ci0gICAgaWYgKHBzdGF0ZS0+bmFtZSA9PSBOVUxMKQotICAgICAgcHN0YXRlLT5uYW1lID0gIiI7Ci0gICAgcHJpbnRmKCIlNWQgICU1ZCAlMTBsbHUgJTYuMmYgJTYuMmYgJTVzICVzIiwKLSAgICAgICAgICAgcHN0YXRlLT5waWQsIHBzdGF0ZS0+cGFyZW50X3BpZCwgcHN0YXRlLT5jcHVfdGltZSwKLSAgICAgICAgICAgcGVyLCBzdW1fcGVyLCBwcmludF9mbGFncywgcHN0YXRlLT5uYW1lKTsKLSAgICBmb3IgKGludCBqaiA9IDE7IGpqIDwgcHN0YXRlLT5hcmdjOyArK2pqKSB7Ci0gICAgICBwcmludGYoIiAlcyIsIHBzdGF0ZS0+YXJndltqal0pOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci0gIH0KLSAgZGVsZXRlIHRyYWNlOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9wcm9maWxlX3RyYWNlLmNwcCBiL2VtdWxhdG9yL3F0b29scy9wcm9maWxlX3RyYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwNTZjYy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvcHJvZmlsZV90cmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXIuaCIKLSNpbmNsdWRlICJwYXJzZV9vcHRpb25zLmgiCi0KLWNvbnN0IGludCBrTWlsbGlvbiA9IDEwMDAwMDA7Ci1jb25zdCBpbnQga01IeiA9IDIwMCAqIGtNaWxsaW9uOwotCi1zdHJ1Y3Qgc3ltYm9sIHsKLSAgICBpbnQgICAgICAgICBjb3VudDsgICAgICAvLyBudW1iZXIgb2YgdGltZXMgYSBmdW5jdGlvbiBpcyBleGVjdXRlZAotICAgIHVpbnQ2NF90ICAgIGVsYXBzZWQ7ICAgIC8vIGVsYXBzZWQgdGltZSBmb3IgdGhpcyBmdW5jdGlvbgotfTsKLQotdHlwZWRlZiBUcmFjZVJlYWRlcjxzeW1ib2w+IFRyYWNlUmVhZGVyVHlwZTsKLQotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMtaW5sLmgiCi0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrT2Zmc2V0VGhyZXNob2xkID0gMHgxMDAwMDA7Ci0KLS8vIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBxc29ydCgpIHRvIHNvcnQKLS8vIHN5bWJvbHMgaW50byBkZWNyZWFzaW5nIGVsYXBzZWQgdGltZS4KLWludCBjbXBfc3ltX2VsYXBzZWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgewotICAgIGNvbnN0IHN5bWJvbF90eXBlICpzeW1hLCAqc3ltYjsKLSAgICB1aW50NjRfdCBlbGFwc2VkMSwgZWxhcHNlZDI7Ci0KLSAgICBzeW1hID0gc3RhdGljX2Nhc3Q8c3ltYm9sX3R5cGUgY29uc3QgKj4oYSk7Ci0gICAgc3ltYiA9IHN0YXRpY19jYXN0PHN5bWJvbF90eXBlIGNvbnN0ICo+KGIpOwotICAgIGVsYXBzZWQxID0gc3ltYS0+ZWxhcHNlZDsKLSAgICBlbGFwc2VkMiA9IHN5bWItPmVsYXBzZWQ7Ci0gICAgaWYgKGVsYXBzZWQxIDwgZWxhcHNlZDIpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmIChlbGFwc2VkMSA9PSBlbGFwc2VkMikKLSAgICAgICAgcmV0dXJuIHN0cmNtcChzeW1hLT5uYW1lLCBzeW1iLT5uYW1lKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgVXNhZ2UoY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gdHJhY2VfZmlsZSBlbGZfZmlsZVxuIiwgcHJvZ3JhbSk7Ci0gICAgT3B0aW9uc1VzYWdlKCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBQYXJzZU9wdGlvbnMoYXJnYywgYXJndik7Ci0gICAgaWYgKGFyZ2MgLSBvcHRpbmQgIT0gMikgewotICAgICAgICBVc2FnZShhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjaGFyICp0cmFjZV9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGNoYXIgKmVsZl9maWxlID0gYXJndltvcHRpbmQrK107Ci0gICAgVHJhY2VSZWFkZXI8c3ltYm9sPiAqdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXI8c3ltYm9sPjsKLSAgICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0gICAgdHJhY2UtPlNldERlbWFuZ2xlKGRlbWFuZ2xlKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgc3ltYm9sX3R5cGUgZHVtbXk7Ci0gICAgZHVtbXkuY291bnQgPSAwOwotICAgIGR1bW15LmVsYXBzZWQgPSAwOwotICAgIHN5bWJvbF90eXBlICpwcmV2X3N5bSA9ICZkdW1teTsKLSAgICB1aW50NjRfdCBwcmV2X2JiX3RpbWUgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHN5bWJvbF90eXBlICpzeW07Ci0gICAgICAgIEJCRXZlbnQgZXZlbnQ7Ci0gICAgICAgIEJCRXZlbnQgZmlyc3RfaWdub3JlZF9ldmVudDsKLQotICAgICAgICBib29sIGVvZiA9IEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZmaXJzdF9pZ25vcmVkX2V2ZW50LCAmc3ltKTsKLQotICAgICAgICAvLyBBc3NpZ24gdGhlIGVsYXBzZWQgdGltZSB0byB0aGUgcHJldmlvdXMgZnVuY3Rpb24gc3ltYm9sCi0gICAgICAgIHVpbnQ2NF90IGVsYXBzZWQgPSAwOwotICAgICAgICBpZiAoZmlyc3RfaWdub3JlZF9ldmVudC50aW1lICE9IDApCi0gICAgICAgICAgICBlbGFwc2VkID0gZmlyc3RfaWdub3JlZF9ldmVudC50aW1lIC0gcHJldl9iYl90aW1lOwotICAgICAgICBlbHNlIGlmICghZW9mKQotICAgICAgICAgICAgZWxhcHNlZCA9IGV2ZW50LnRpbWUgLSBwcmV2X2JiX3RpbWU7Ci0gICAgICAgIHByZXZfc3ltLT5lbGFwc2VkICs9IGVsYXBzZWQ7Ci0KLSAgICAgICAgaWYgKGVvZikKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHByZXZfYmJfdGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgIHN5bS0+Y291bnQgKz0gMTsKLSAgICAgICAgcHJldl9zeW0gPSBzeW07Ci0jaWYgMAotICAgICAgICBwcmludGYoInQlbGxkIGJiX251bTogJWQsIGJiX2FkZHI6IDB4JXggZnVuYzogJXMsIGFkZHI6IDB4JXgsIGNvdW50OiAlZFxuIiwKLSAgICAgICAgICAgICAgIGJiX3RpbWUsIGJiX251bSwgYmJfYWRkciwgc3ltLT5uYW1lLCBzeW0tPmFkZHIsIHN5bS0+Y291bnQpOwotI2VuZGlmCi0gICAgfQotCi0gICAgaW50IG5zeW1zOwotICAgIHN5bWJvbF90eXBlICpzeW1zID0gdHJhY2UtPkdldFN5bWJvbHMoJm5zeW1zKTsKLQotICAgIC8vIFNvcnQgdGhlIHN5bWJvbHMgaW50byBkZWNyZWFzaW5nIG9yZGVyIG9mIGVsYXBzZWQgdGltZQotICAgIHFzb3J0KHN5bXMsIG5zeW1zLCBzaXplb2Yoc3ltYm9sX3R5cGUpLCBjbXBfc3ltX2VsYXBzZWQpOwotCi0gICAgLy8gQWRkIHVwIGFsbCB0aGUgY3ljbGVzCi0gICAgdWludDY0X3QgdG90YWwgPSAwOwotICAgIHN5bWJvbF90eXBlICpzeW0gPSBzeW1zOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuc3ltczsgKytpaSwgKytzeW0pIHsKLSAgICAgICAgdG90YWwgKz0gc3ltLT5lbGFwc2VkOwotICAgIH0KLQotICAgIGRvdWJsZSBzZWNzID0gMS4wICogdG90YWwgLyBrTUh6OwotICAgIHByaW50ZigiVG90YWwgc2Vjb25kczogJS4yZiwgdG90YWwgY3ljbGVzOiAlbGxkLCBNSHo6ICVkXG5cbiIsCi0gICAgICAgICAgIHNlY3MsIHRvdGFsLCBrTUh6IC8ga01pbGxpb24pOwotCi0gICAgdWludDY0X3Qgc3VtID0gMDsKLSAgICBwcmludGYoIkVsYXBzZWQgc2VjcyBFbGFwc2VkIGN5YyAgICAgICUlICAgICAgJSUgICAgRnVuY3Rpb25cbiIpOwotICAgIHN5bSA9IHN5bXM7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5zeW1zOyArK2lpLCArK3N5bSkgewotICAgICAgICBpZiAoc3ltLT5lbGFwc2VkID09IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3VtICs9IHN5bS0+ZWxhcHNlZDsKLSAgICAgICAgZG91YmxlIHBlciA9IDEwMC4wICogc3ltLT5lbGFwc2VkIC8gdG90YWw7Ci0gICAgICAgIGRvdWJsZSBzdW1fcGVyID0gMTAwLjAgKiBzdW0gLyB0b3RhbDsKLSAgICAgICAgZG91YmxlIHNlY3MgPSAxLjAgKiBzeW0tPmVsYXBzZWQgLyBrTUh6OwotICAgICAgICBjb25zdCBjaGFyICprc3ltID0gIiAiOwotICAgICAgICBpZiAoc3ltLT5yZWdpb24tPmZsYWdzICYgcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbikKLSAgICAgICAgICAgIGtzeW0gPSAiayI7Ci0gICAgICAgIHByaW50ZigiJTEyLjJmICUxMWxsZCAlNi4yZiAlNi4yZiAgJXMgJXNcbiIsCi0gICAgICAgICAgICAgICBzZWNzLCBzeW0tPmVsYXBzZWQsIHBlciwgc3VtX3Blciwga3N5bSwgc3ltLT5uYW1lKTsKLSAgICB9Ci0gICAgZGVsZXRlW10gc3ltczsKLSAgICBkZWxldGUgdHJhY2U7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9xMmRtLmNwcCBiL2VtdWxhdG9yL3F0b29scy9xMmRtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkYmFlYi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvcTJkbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInRyYWNlX3JlYWRlci5oIgotI2luY2x1ZGUgImJpdHZlY3Rvci5oIgotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMuaCIKLSNpbmNsdWRlICJkbXRyYWNlLmgiCi0jaW5jbHVkZSAiYXJtZGlzLmgiCi0KLXN0cnVjdCBzeW1ib2wgewotICAgIHVpbnQzMl90IGlkOwotfTsKLQotdHlwZWRlZiBUcmFjZVJlYWRlcjxzeW1ib2w+IFRyYWNlUmVhZGVyVHlwZTsKLQotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMtaW5sLmgiCi0jaW5jbHVkZSAiY2FsbHN0YWNrLmgiCi0KLURtVHJhY2UgKmRtdHJhY2U7Ci0KLWNsYXNzIE15RnJhbWUgOiBwdWJsaWMgU3RhY2tGcmFtZTxzeW1ib2xfdHlwZT4gewotICBwdWJsaWM6Ci0gICAgdm9pZCBwdXNoKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKTsKLSAgICB2b2lkIHBvcChpbnQgc3RhY2tMZXZlbCwgdWludDY0X3QgdGltZSwgQ2FsbFN0YWNrQmFzZSAqYmFzZSk7Ci19OwotCi10eXBlZGVmIENhbGxTdGFjazxNeUZyYW1lPiBDYWxsU3RhY2tUeXBlOwotCi1zdGF0aWMgY29uc3QgaW50IGtOdW1TdGFja0ZyYW1lcyA9IDUwMDsKLXN0YXRpYyBjb25zdCBpbnQga01heFRocmVhZHMgPSAoMzIgKiAxMDI0KTsKLXVpbnQ2NF90IHRocmVhZF90aW1lW2tNYXhUaHJlYWRzXTsKLQotY2xhc3MgRnVuY3Rpb25TdGFjayB7Ci0gIHB1YmxpYzoKLSAgICBGdW5jdGlvblN0YWNrKCkgewotICAgICAgICB0b3AgPSAwOwotICAgIH0KLSAgICB2b2lkIHB1c2goc3ltYm9sX3R5cGUgKnN5bSkgewotICAgICAgICBpZiAodG9wID49IGtOdW1TdGFja0ZyYW1lcykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZnJhbWVzW3RvcF0gPSBzeW07Ci0gICAgICAgIHRvcCArPSAxOwotICAgIH0KLQotICAgIHN5bWJvbF90eXBlKiBwb3AoKSB7Ci0gICAgICAgIGlmICh0b3AgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wIC09IDE7Ci0gICAgICAgIHJldHVybiBmcmFtZXNbdG9wXTsKLSAgICB9Ci0KLSAgICB2b2lkIHNob3dTdGFjaygpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b3AgJWRcbiIsIHRvcCk7Ci0gICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCB0b3A7IGlpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAlZDogJXNcbiIsIGlpLCBmcmFtZXNbaWldLT5uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIGludCB0b3A7Ci0gICAgc3ltYm9sX3R5cGUgKmZyYW1lc1trTnVtU3RhY2tGcmFtZXNdOwotfTsKLQotRnVuY3Rpb25TdGFjayAqZG10cmFjZV9zdGFja1trTWF4VGhyZWFkc107Ci0KLXZvaWQgTXlGcmFtZTo6cHVzaChpbnQgc3RhY2tMZXZlbCwgdWludDY0X3QgdGltZSwgQ2FsbFN0YWNrQmFzZSAqYmFzZSkKLXsKLSAgICBpbnQgcGlkID0gYmFzZS0+Z2V0SWQoKTsKLSAgICBDYWxsU3RhY2tUeXBlICpzdGFjayA9IChDYWxsU3RhY2tUeXBlICopIGJhc2U7Ci0KLSNpZiAwCi0gICAgZnByaW50ZihzdGRlcnIsICJuYXRpdmUgcHVzaCB0ICVsbHUgcCAlZCBzICVkIGZpZCAlZCAweCV4ICVzXG4iLAotICAgICAgICAgICAgc3RhY2stPmdldEdsb2JhbFRpbWUodGltZSksIHBpZCwgc3RhY2tMZXZlbCwKLSAgICAgICAgICAgIGZ1bmN0aW9uLT5pZCwgZnVuY3Rpb24tPmFkZHIsIGZ1bmN0aW9uLT5uYW1lKTsKLSNlbmRpZgotCi0gICAgRnVuY3Rpb25TdGFjayAqZnN0YWNrID0gZG10cmFjZV9zdGFja1twaWRdOwotICAgIGlmIChmc3RhY2sgPT0gTlVMTCkgewotICAgICAgICBmc3RhY2sgPSBuZXcgRnVuY3Rpb25TdGFjaygpOwotICAgICAgICBkbXRyYWNlX3N0YWNrW3BpZF0gPSBmc3RhY2s7Ci0gICAgfQotCi0gICAgZnN0YWNrLT5wdXNoKGZ1bmN0aW9uKTsKLSAgICB0aHJlYWRfdGltZVtwaWRdID0gdGltZTsKLSAgICBkbXRyYWNlLT5hZGRGdW5jdGlvbkVudHJ5KGZ1bmN0aW9uLT5pZCwgdGltZSwgcGlkKTsKLX0KLQotdm9pZCBNeUZyYW1lOjpwb3AoaW50IHN0YWNrTGV2ZWwsIHVpbnQ2NF90IHRpbWUsIENhbGxTdGFja0Jhc2UgKmJhc2UpCi17Ci0gICAgaW50IHBpZCA9IGJhc2UtPmdldElkKCk7Ci0gICAgQ2FsbFN0YWNrVHlwZSAqc3RhY2sgPSAoQ2FsbFN0YWNrVHlwZSAqKSBiYXNlOwotCi0jaWYgMAotICAgIGZwcmludGYoc3RkZXJyLCAibmF0aXZlIHBvcCAgdCAlbGx1IHAgJWQgcyAlZCBmaWQgJWQgMHgleCAlc1xuIiwKLSAgICAgICAgICAgIHN0YWNrLT5nZXRHbG9iYWxUaW1lKHRpbWUpLCBwaWQsIHN0YWNrTGV2ZWwsCi0gICAgICAgICAgICBmdW5jdGlvbi0+aWQsIGZ1bmN0aW9uLT5hZGRyLCBmdW5jdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLQotICAgIEZ1bmN0aW9uU3RhY2sgKmZzdGFjayA9IGRtdHJhY2Vfc3RhY2tbcGlkXTsKLSAgICBpZiAoZnN0YWNrID09IE5VTEwpIHsKLSAgICAgICAgZnN0YWNrID0gbmV3IEZ1bmN0aW9uU3RhY2soKTsKLSAgICAgICAgZG10cmFjZV9zdGFja1twaWRdID0gZnN0YWNrOwotICAgIH0KLQotICAgIHN5bWJvbF90eXBlICpzeW0gPSBmc3RhY2stPnBvcCgpOwotICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0gIT0gZnVuY3Rpb24pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogcTJkbSBmdW5jdGlvbiBtaXNtYXRjaCBhdCB0aW1lICVsbHUgcGlkICVkIHN5bSAlc1xuIiwKLSAgICAgICAgICAgICAgICBzdGFjay0+Z2V0R2xvYmFsVGltZSh0aW1lKSwgcGlkLCBzeW0tPm5hbWUpOwotICAgICAgICBmc3RhY2stPnNob3dTdGFjaygpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIHRocmVhZF90aW1lW3BpZF0gPSB0aW1lOwotICAgIGRtdHJhY2UtPmFkZEZ1bmN0aW9uRXhpdChmdW5jdGlvbi0+aWQsIHRpbWUsIHBpZCk7Ci19Ci0KLXVpbnQzMl90IG5leHRGdW5jdGlvbklkID0gNDsKLUNhbGxTdGFja1R5cGUgKnN0YWNrc1trTWF4VGhyZWFkc107Ci0KLXZvaWQgVXNhZ2UoY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gdHJhY2VfbmFtZSBlbGZfZmlsZSBkbXRyYWNlX25hbWVcbiIsCi0gICAgICAgICAgICBwcm9ncmFtKTsKLSAgICBPcHRpb25zVXNhZ2UoKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGJvb2wgdXNlS2VybmVsU3RhY2sgPSB0cnVlOwotCi0gICAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChhcmdjIC0gb3B0aW5kICE9IDMpIHsKLSAgICAgICAgVXNhZ2UoYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgY2hhciAqcWVtdV90cmFjZV9maWxlID0gYXJndltvcHRpbmQrK107Ci0gICAgY2hhciAqZWxmX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBjaGFyICpkbXRyYWNlX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBUcmFjZVJlYWRlclR5cGUgKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyVHlwZTsKLSAgICB0cmFjZS0+T3BlbihxZW11X3RyYWNlX2ZpbGUpOwotICAgIHRyYWNlLT5TZXREZW1hbmdsZShkZW1hbmdsZSk7Ci0gICAgdHJhY2UtPlJlYWRLZXJuZWxTeW1ib2xzKGVsZl9maWxlKTsKLSAgICB0cmFjZS0+U2V0Um9vdChyb290KTsKLSAgICBUcmFjZUhlYWRlciAqcWhlYWRlciA9IHRyYWNlLT5HZXRIZWFkZXIoKTsKLSAgICB1aW50NjRfdCBzdGFydFRpbWUgPSBxaGVhZGVyLT5zdGFydF9zZWM7Ci0gICAgc3RhcnRUaW1lID0gKHN0YXJ0VGltZSA8PCAzMikgfCBxaGVhZGVyLT5zdGFydF91c2VjOwotICAgIGludCBrZXJuZWxQaWQgPSBxaGVhZGVyLT5maXJzdF91bnVzZWRfcGlkOwotCi0gICAgZG10cmFjZSA9IG5ldyBEbVRyYWNlOwotICAgIGRtdHJhY2UtPm9wZW4oZG10cmFjZV9maWxlLCBzdGFydFRpbWUpOwotCi0gICAgYm9vbCBpbktlcm5lbCA9IGZhbHNlOwotICAgIENhbGxTdGFja1R5cGUgKmtlcm5lbFN0YWNrID0gTlVMTDsKLSAgICBpZiAodXNlS2VybmVsU3RhY2spIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgZmFrZSBrZXJuZWwgdGhyZWFkIHN0YWNrIHdoZXJlIHdlIHdpbGwgcHV0IGFsbCB0aGUga2VybmVsCi0gICAgICAgIC8vIGNvZGUuCi0gICAgICAgIGtlcm5lbFN0YWNrID0gbmV3IENhbGxTdGFja1R5cGUoa2VybmVsUGlkLCBrTnVtU3RhY2tGcmFtZXMsIHRyYWNlKTsKLSAgICAgICAgZG10cmFjZS0+YWRkVGhyZWFkKGtlcm5lbFBpZCwgIihrZXJuZWwpIik7Ci0gICAgfQotCi0gICAgQ2FsbFN0YWNrVHlwZSAqcHJldlN0YWNrID0gTlVMTDsKLSAgICBCQkV2ZW50IGV2ZW50OwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEJCRXZlbnQgaWdub3JlZDsKLSAgICAgICAgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uOwotCi0gICAgICAgIGlmIChHZXROZXh0VmFsaWRFdmVudCh0cmFjZSwgJmV2ZW50LCAmaWdub3JlZCwgJmZ1bmN0aW9uKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoZXZlbnQuYmJfbnVtID09IDApCi0gICAgICAgICAgICBicmVhazsKLSNpZiAwCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXZlbnQgdCAlbGx1IHAgJWQgJXNcbiIsCi0gICAgICAgICAgICAgICAgZXZlbnQudGltZSwgZXZlbnQucGlkLCBmdW5jdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLQotICAgICAgICBDYWxsU3RhY2tUeXBlICpwU3RhY2s7Ci0gICAgICAgIGlmICh1c2VLZXJuZWxTdGFjaykgewotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBmdW5jdGlvbi0+cmVnaW9uLT5mbGFnczsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlZ2lvbl9tYXNrID0gcmVnaW9uX3R5cGU6OmtJc0tlcm5lbFJlZ2lvbgotICAgICAgICAgICAgICAgICAgICB8IHJlZ2lvbl90eXBlOjprSXNVc2VyTWFwcGVkUmVnaW9uOwotICAgICAgICAgICAgaWYgKChmbGFncyAmIHJlZ2lvbl9tYXNrKSA9PSByZWdpb25fdHlwZTo6a0lzS2VybmVsUmVnaW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBrZXJuZWwgc3RhY2sKLSAgICAgICAgICAgICAgICBwU3RhY2sgPSBrZXJuZWxTdGFjazsKLSAgICAgICAgICAgICAgICBpbktlcm5lbCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIHdlcmUganVzdCBpbiB0aGUga2VybmVsIHRoZW4gcG9wIG9mZiBhbGwgb2YgdGhlCi0gICAgICAgICAgICAgICAgLy8gc3RhY2sgZnJhbWVzIGZvciB0aGUga2VybmVsIHRocmVhZC4KLSAgICAgICAgICAgICAgICBpZiAoaW5LZXJuZWwgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpbktlcm5lbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBrZXJuZWxTdGFjay0+cG9wQWxsKGV2ZW50LnRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHN0YWNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgICAgICAgICAgICBwU3RhY2sgPSBzdGFja3NbZXZlbnQucGlkXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgc3RhY2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZAotICAgICAgICAgICAgcFN0YWNrID0gc3RhY2tzW2V2ZW50LnBpZF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIHRoZW4gYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgICBpZiAocFN0YWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBTdGFjayA9IG5ldyBDYWxsU3RhY2tUeXBlKGV2ZW50LnBpZCwga051bVN0YWNrRnJhbWVzLCB0cmFjZSk7Ci0gICAgICAgICAgICBzdGFja3NbZXZlbnQucGlkXSA9IHBTdGFjazsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB0cmFjZS0+R2V0UHJvY2Vzc05hbWUoZXZlbnQucGlkKTsKLSAgICAgICAgICAgIGRtdHJhY2UtPmFkZFRocmVhZChldmVudC5waWQsIG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByZXZTdGFjayAhPSBwU3RhY2spIHsKLSAgICAgICAgICAgIHBTdGFjay0+dGhyZWFkU3RhcnQoZXZlbnQudGltZSk7Ci0gICAgICAgICAgICBpZiAocHJldlN0YWNrKQotICAgICAgICAgICAgICAgIHByZXZTdGFjay0+dGhyZWFkU3RvcChldmVudC50aW1lKTsKLSAgICAgICAgfQotICAgICAgICBwcmV2U3RhY2sgPSBwU3RhY2s7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXZlciBzZWVuIHRoaXMgZnVuY3Rpb24gYmVmb3JlLCB0aGVuIGFkZCBpdCB0byB0aGUKLSAgICAgICAgLy8gbGlzdCBvZiBrbm93biBmdW5jdGlvbnMuCi0gICAgICAgIGlmIChmdW5jdGlvbi0+aWQgPT0gMCkgewotICAgICAgICAgICAgZnVuY3Rpb24tPmlkID0gbmV4dEZ1bmN0aW9uSWQ7Ci0gICAgICAgICAgICBuZXh0RnVuY3Rpb25JZCArPSA0OwotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBmdW5jdGlvbi0+cmVnaW9uLT5mbGFnczsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmdW5jdGlvbi0+bmFtZTsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBUbyBkaXN0aW5ndWlzaCBrZXJuZWwgZnVuY3Rpb24gbmFtZXMgZnJvbSB1c2VyIGxpYnJhcnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lcywgYWRkIGEgbWFya2VyIHRvIHRoZSBuYW1lLgotICAgICAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyBzdHJsZW4oIiBba2VybmVsXSIpICsgMTsKLSAgICAgICAgICAgICAgICBjaGFyICprZXJuZWxOYW1lID0gbmV3IGNoYXJbbGVuXTsKLSAgICAgICAgICAgICAgICBzdHJjcHkoa2VybmVsTmFtZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RyY2F0KGtlcm5lbE5hbWUsICIgW2tlcm5lbF0iKTsKLSAgICAgICAgICAgICAgICBuYW1lID0ga2VybmVsTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRtdHJhY2UtPnBhcnNlQW5kQWRkRnVuY3Rpb24oZnVuY3Rpb24tPmlkLCBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhY2sKLSAgICAgICAgcFN0YWNrLT51cGRhdGVTdGFjaygmZXZlbnQsIGZ1bmN0aW9uKTsKLSAgICB9Ci0KLSAgICBpZiAocHJldlN0YWNrID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm8gZXZlbnRzIGluIHRyYWNlLlxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHByZXZTdGFjay0+dGhyZWFkU3RvcChldmVudC50aW1lKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwga01heFRocmVhZHM7ICsraWkpIHsKLSAgICAgICAgaWYgKHN0YWNrc1tpaV0pIHsKLSAgICAgICAgICAgIHN0YWNrc1tpaV0tPnRocmVhZFN0YXJ0KGV2ZW50LnRpbWUpOwotICAgICAgICAgICAgc3RhY2tzW2lpXS0+cG9wQWxsKGV2ZW50LnRpbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh1c2VLZXJuZWxTdGFjaykgewotICAgICAgICBrZXJuZWxTdGFjay0+cG9wQWxsKGV2ZW50LnRpbWUpOwotICAgIH0KLQotICAgIC8vIFJlYWQgdGhlIHBpZCBldmVudHMgdG8gZmluZCB0aGUgbmFtZXMgb2YgdGhlIHByb2Nlc3NlcwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIFBpZEV2ZW50IHBpZF9ldmVudDsKLSAgICAgICAgaWYgKHRyYWNlLT5SZWFkUGlkRXZlbnQoJnBpZF9ldmVudCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKHBpZF9ldmVudC5yZWNfdHlwZSA9PSBrUGlkTmFtZSkgewotICAgICAgICAgICAgZG10cmFjZS0+dXBkYXRlTmFtZShwaWRfZXZlbnQucGlkLCBwaWRfZXZlbnQucGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkbXRyYWNlLT5jbG9zZSgpOwotICAgIGRlbGV0ZSBkbXRyYWNlOwotICAgIGRlbGV0ZSB0cmFjZTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9xMmcuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3EyZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMmFlOTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3EyZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInRyYWNlX3JlYWRlci5oIgotI2luY2x1ZGUgImd0cmFjZS5oIgotI2luY2x1ZGUgImJpdHZlY3Rvci5oIgotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMuaCIKLQotc3RydWN0IHN5bWJvbCB7Ci0gIGludAkJZmlsZW51bTsJLy8gdGhlIGZpbGUgbnVtYmVyIChmb3IgZ3RyYWNlKQotICBpbnQJCXByb2NudW07CS8vIHRoZSBwcm9jZWR1cmUgbnVtYmVyIChmb3IgZ3RyYWNlKQotfTsKLQotdHlwZWRlZiBUcmFjZVJlYWRlcjxzeW1ib2w+IFRyYWNlUmVhZGVyVHlwZTsKLQotI2luY2x1ZGUgInBhcnNlX29wdGlvbnMtaW5sLmgiCi0KLWNvbnN0IGludCBrTWF4UHJvY051bSA9IDQwOTU7Ci1pbnQgbmV4dF9maWxlbnVtID0gMTsKLWludCBuZXh0X3Byb2NudW0gPSAxOwotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvcHRpb25zXSB0cmFjZV9maWxlIGVsZl9maWxlIGd0cmFjZV9maWxlXG4iLAotICAgICAgICAgIHByb2dyYW0pOwotICBPcHRpb25zVXNhZ2UoKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBQYXJzZU9wdGlvbnMoYXJnYywgYXJndik7Ci0gIGlmIChhcmdjIC0gb3B0aW5kICE9IDMpIHsKLSAgICBVc2FnZShhcmd2WzBdKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgY2hhciAqcWVtdV90cmFjZV9maWxlID0gYXJndltvcHRpbmQrK107Ci0gIGNoYXIgKmVsZl9maWxlID0gYXJndltvcHRpbmQrK107Ci0gIGNoYXIgKmd0cmFjZV9maWxlID0gYXJndltvcHRpbmQrK107Ci0gIFRyYWNlUmVhZGVyPHN5bWJvbD4gKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyPHN5bWJvbD47Ci0gIHRyYWNlLT5PcGVuKHFlbXVfdHJhY2VfZmlsZSk7Ci0gIHRyYWNlLT5SZWFkS2VybmVsU3ltYm9scyhlbGZfZmlsZSk7Ci0gIHRyYWNlLT5TZXRSb290KHJvb3QpOwotICBUcmFjZUhlYWRlciAqcWhlYWRlciA9IHRyYWNlLT5HZXRIZWFkZXIoKTsKLQotICAvLyBHZXQgdGhlIGZpcnN0IHZhbGlkIGV2ZW50IHRvIGdldCB0aGUgcHJvY2VzcyBpZCBmb3IgdGhlIGd0cmFjZSBoZWFkZXIuCi0gIEJCRXZlbnQgZXZlbnQ7Ci0gIEJCRXZlbnQgaWdub3JlZDsKLSAgc3ltYm9sX3R5cGUgKnN5bTsKLSAgaWYgKEdldE5leHRWYWxpZEV2ZW50KHRyYWNlLCAmZXZlbnQsICZpZ25vcmVkLCAmc3ltKSkKLSAgICByZXR1cm4gMDsKLQotICBHdHJhY2UgKmd0cmFjZSA9IG5ldyBHdHJhY2U7Ci0gIGd0cmFjZS0+T3BlbihndHJhY2VfZmlsZSwgcWhlYWRlci0+cGRhdGUsIHFoZWFkZXItPnB0aW1lKTsKLSAgZ3RyYWNlLT5Xcml0ZUZpcnN0SGVhZGVyKHFoZWFkZXItPnN0YXJ0X3NlYywgZXZlbnQucGlkKTsKLQotICBzeW1ib2xfdHlwZSAqcHJldl9zeW0gPSBOVUxMOwotICBib29sIGVvZiA9IGZhbHNlOwotICB3aGlsZSAoIWVvZikgewotICAgIGlmIChzeW0gIT0gcHJldl9zeW0pIHsKLSAgICAgIC8vIFRoaXMgcHJvY2VkdXJlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwcmV2aW91cyBwcm9jZWR1cmUuCi0KLSAgICAgIC8vIElmIHdlIGhhdmUgbmV2ZXIgc2VlbiB0aGlzIHN5bWJvbCBiZWZvcmUsIHRoZW4gYWRkIGl0IHRvIHRoZQotICAgICAgLy8gbGlzdCBvZiBrbm93biBwcm9jZWR1cmVzLgotICAgICAgaWYgKHN5bS0+ZmlsZW51bSA9PSAwKSB7Ci0gICAgICAgIHN5bS0+ZmlsZW51bSA9IG5leHRfZmlsZW51bTsKLSAgICAgICAgc3ltLT5wcm9jbnVtID0gbmV4dF9wcm9jbnVtOwotICAgICAgICBndHJhY2UtPkFkZFByb2NlZHVyZShzeW0tPmZpbGVudW0sIHN5bS0+cHJvY251bSwgc3ltLT5uYW1lKTsKLSAgICAgICAgbmV4dF9wcm9jbnVtICs9IDE7Ci0gICAgICAgIGlmIChuZXh0X3Byb2NudW0gPiBrTWF4UHJvY051bSkgewotICAgICAgICAgIG5leHRfZmlsZW51bSArPSAxOwotICAgICAgICAgIG5leHRfcHJvY251bSA9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB5ZXQgcmVjb3JkZWQgdGhlIHByb2NlZHVyZSBleGl0IGZvciB0aGUgcHJldmlvdXMKLSAgICAgIC8vIHByb2NlZHVyZSwgdGhlbiBkbyBpdCBub3cuCi0gICAgICBpZiAocHJldl9zeW0pIHsKLSAgICAgICAgZ3RyYWNlLT5BZGRQcm9jRXhpdChwcmV2X3N5bS0+ZmlsZW51bSwgcHJldl9zeW0tPnByb2NudW0sIGV2ZW50LnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucGlkKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIHRlcm1pbmF0aW5nIHJlY29yZCwgdGhlbiByZWNvcmQgYSBwcm9jZWR1cmUKLSAgICAgIC8vIGVudHJ5LgotICAgICAgaWYgKGV2ZW50LmJiX251bSAhPSAwKSB7Ci0gICAgICAgIGd0cmFjZS0+QWRkUHJvY0VudHJ5KHN5bS0+ZmlsZW51bSwgc3ltLT5wcm9jbnVtLCBldmVudC50aW1lLCBldmVudC5waWQpOwotICAgICAgICBwcmV2X3N5bSA9IHN5bTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlb2YgPSBHZXROZXh0VmFsaWRFdmVudCh0cmFjZSwgJmV2ZW50LCAmaWdub3JlZCwgJnN5bSk7Ci0gICAgaWYgKGlnbm9yZWQudGltZSAhPSAwICYmIHByZXZfc3ltKSB7Ci0gICAgICAvLyBXZSByZWFkIGFuIGV2ZW50IHRoYXQgd2UgYXJlIGlnbm9yaW5nLgotICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHJlY29yZGVkIGEgcHJvY2VkdXJlIGV4aXQsIHRoZW4gZG8gc28uCi0gICAgICBndHJhY2UtPkFkZFByb2NFeGl0KHByZXZfc3ltLT5maWxlbnVtLCBwcmV2X3N5bS0+cHJvY251bSwgaWdub3JlZC50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkLnBpZCk7Ci0gICAgICBwcmV2X3N5bSA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgZGVsZXRlIGd0cmFjZTsKLSAgZGVsZXRlIHRyYWNlOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9yZWFkX2FkZHIuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3JlYWRfYWRkci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOGMyMGYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3JlYWRfYWRkci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgInRyYWNlX3JlYWRlci5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgaWYgKGFyZ2MgIT0gMikgewotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHRyYWNlX2ZpbGVcbiIsIGFyZ3ZbMF0pOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBjaGFyICp0cmFjZV9maWxlbmFtZSA9IGFyZ3ZbMV07Ci0gIFRyYWNlUmVhZGVyQmFzZSAqdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXJCYXNlOwotICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0KLSAgd2hpbGUgKDEpIHsKLSAgICB1aW50NjRfdCB0aW1lOwotICAgIHVpbnQzMl90IGFkZHI7Ci0gICAgaW50IGZsYWdzOwotCi0gICAgaWYgKHRyYWNlLT5SZWFkQWRkcigmdGltZSwgJmFkZHIsICZmbGFncykpCi0gICAgICBicmVhazsKLSAgICBjb25zdCBjaGFyICpvcCA9ICJsZCI7Ci0gICAgaWYgKGZsYWdzID09IDEpCi0gICAgICAgIG9wID0gInN0IjsKLSAgICBwcmludGYoIiVsbGQgMHglMDh4ICVzXG4iLCB0aW1lLCBhZGRyLCBvcCk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcmVhZF9lbGYuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3JlYWRfZWxmLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxYTc0YS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvcmVhZF9lbGYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMsMjAwNCwyMDA1IFdlaSBRaW4KLSAgICBTZWUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgCi0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSAicmVhZF9lbGYuaCIKLQotI2RlZmluZSBTd2FwSGFsZihhKSAoKChhICYgMHgwMGZmKSA8PCA4KSB8ICgoYSAmIDB4ZmYwMCkgPj4gOCkpCi0jZGVmaW5lIFN3YXBXb3JkKGEpICgoKGEgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKGEgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoYSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKChhICYgMHgwMDAwMDBmZikgPDwgMjQpKQotI2RlZmluZSBTd2FwQWRkcihhKSBTd2FwV29yZChhKQotI2RlZmluZSBTd2FwT2ZmKGEpIFN3YXBXb3JkKGEpCi0jZGVmaW5lIFN3YXBTZWN0aW9uKGEpIFN3YXBIYWxmKGEpCi0KLWludCBMaXR0bGVFbmRpYW4oKQotewotICBFbGYzMl9Xb3JkIGEgPSAweDAxMDIwMzA0OwotICByZXR1cm4gKihjaGFyICopICZhID09IDB4MDQ7Ci19Ci0KLXZvaWQgU3dhcEVsZkhlYWRlcihFbGYzMl9FaGRyICpoZHIpCi17Ci0gIGhkci0+ZV90eXBlID0gU3dhcEhhbGYoaGRyLT5lX3R5cGUpOwotICBoZHItPmVfbWFjaGluZSA9IFN3YXBIYWxmKGhkci0+ZV9tYWNoaW5lKTsKLSAgaGRyLT5lX3ZlcnNpb24gPSBTd2FwV29yZChoZHItPmVfdmVyc2lvbik7Ci0gIGhkci0+ZV9lbnRyeSA9IFN3YXBBZGRyKGhkci0+ZV9lbnRyeSk7Ci0gIGhkci0+ZV9waG9mZiA9IFN3YXBPZmYoaGRyLT5lX3Bob2ZmKTsKLSAgaGRyLT5lX3Nob2ZmID0gU3dhcE9mZihoZHItPmVfc2hvZmYpOwotICBoZHItPmVfZmxhZ3MgPSBTd2FwV29yZChoZHItPmVfZmxhZ3MpOwotICBoZHItPmVfZWhzaXplID0gU3dhcEhhbGYoaGRyLT5lX2Voc2l6ZSk7Ci0gIGhkci0+ZV9waGVudHNpemUgPSBTd2FwSGFsZihoZHItPmVfcGhlbnRzaXplKTsKLSAgaGRyLT5lX3BobnVtID0gU3dhcEhhbGYoaGRyLT5lX3BobnVtKTsKLSAgaGRyLT5lX3NoZW50c2l6ZSA9IFN3YXBIYWxmKGhkci0+ZV9zaGVudHNpemUpOwotICBoZHItPmVfc2hudW0gPSBTd2FwSGFsZihoZHItPmVfc2hudW0pOwotICBoZHItPmVfc2hzdHJuZHggPSBTd2FwSGFsZihoZHItPmVfc2hzdHJuZHgpOwotfQotCi12b2lkIFN3YXBTZWN0aW9uSGVhZGVyKEVsZjMyX1NoZHIgKnNoZHIpCi17Ci0gIHNoZHItPnNoX25hbWUgPSBTd2FwV29yZChzaGRyLT5zaF9uYW1lKTsKLSAgc2hkci0+c2hfdHlwZSA9IFN3YXBXb3JkKHNoZHItPnNoX3R5cGUpOwotICBzaGRyLT5zaF9mbGFncyA9IFN3YXBXb3JkKHNoZHItPnNoX2ZsYWdzKTsKLSAgc2hkci0+c2hfYWRkciA9IFN3YXBBZGRyKHNoZHItPnNoX2FkZHIpOwotICBzaGRyLT5zaF9vZmZzZXQgPSBTd2FwT2ZmKHNoZHItPnNoX29mZnNldCk7Ci0gIHNoZHItPnNoX3NpemUgPSBTd2FwV29yZChzaGRyLT5zaF9zaXplKTsKLSAgc2hkci0+c2hfbGluayA9IFN3YXBXb3JkKHNoZHItPnNoX2xpbmspOwotICBzaGRyLT5zaF9pbmZvID0gU3dhcFdvcmQoc2hkci0+c2hfaW5mbyk7Ci0gIHNoZHItPnNoX2FkZHJhbGlnbiA9IFN3YXBXb3JkKHNoZHItPnNoX2FkZHJhbGlnbik7Ci0gIHNoZHItPnNoX2VudHNpemUgPSBTd2FwV29yZChzaGRyLT5zaF9lbnRzaXplKTsKLX0KLQotdm9pZCBTd2FwRWxmU3ltYm9sKEVsZjMyX1N5bSAqc3ltKQotewotICAgIHN5bS0+c3RfbmFtZSA9IFN3YXBXb3JkKHN5bS0+c3RfbmFtZSk7Ci0gICAgc3ltLT5zdF92YWx1ZSA9IFN3YXBBZGRyKHN5bS0+c3RfdmFsdWUpOwotICAgIHN5bS0+c3Rfc2l6ZSA9IFN3YXBXb3JkKHN5bS0+c3Rfc2l6ZSk7Ci0gICAgc3ltLT5zdF9zaG5keCA9IFN3YXBTZWN0aW9uKHN5bS0+c3Rfc2huZHgpOwotfQotCi12b2lkIEFkanVzdEVsZkhlYWRlcihFbGYzMl9FaGRyICpoZHIpCi17Ci0gIHN3aXRjaChoZHItPmVfaWRlbnRbRUlfREFUQV0pCi0gIHsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgotICAgICAgaWYgKCFMaXR0bGVFbmRpYW4oKSkKLSAgICAgICAgU3dhcEVsZkhlYWRlcihoZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoKLSAgICAgIGlmIChMaXR0bGVFbmRpYW4oKSkKLSAgICAgICAgU3dhcEVsZkhlYWRlcihoZHIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBBZGp1c3RTZWN0aW9uSGVhZGVyKEVsZjMyX0VoZHIgKmhkciwgRWxmMzJfU2hkciAqc2hkcikKLXsKLSAgc3dpdGNoKGhkci0+ZV9pZGVudFtFSV9EQVRBXSkKLSAgewotICAgIGNhc2UgRUxGREFUQTJMU0I6Ci0gICAgICBpZiAoIUxpdHRsZUVuZGlhbigpKQotICAgICAgICBTd2FwU2VjdGlvbkhlYWRlcihzaGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGREFUQTJNU0I6Ci0gICAgICBpZiAoTGl0dGxlRW5kaWFuKCkpCi0gICAgICAgIFN3YXBTZWN0aW9uSGVhZGVyKHNoZHIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBBZGp1c3RFbGZTeW1ib2xzKEVsZjMyX0VoZHIgKmhkciwgRWxmMzJfU3ltICplbGZfc3ltYm9scywgaW50IG51bV9lbnRyaWVzKQotewotICAgIGlmIChoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IgJiYgTGl0dGxlRW5kaWFuKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCICYmICFMaXR0bGVFbmRpYW4oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBudW1fZW50cmllczsgKytpaSkgewotICAgICAgICBTd2FwRWxmU3ltYm9sKCZlbGZfc3ltYm9sc1tpaV0pOwotICAgIH0KLX0KLQotRWxmMzJfRWhkciAqUmVhZEVsZkhlYWRlcihGSUxFICpmb2JqKQotewotICBFbGYzMl9FaGRyICpoZHIgPSBuZXcgRWxmMzJfRWhkcjsKLSAgaW50IHJ2YWwgPSBmcmVhZChoZHIsIHNpemVvZihFbGYzMl9FaGRyKSwgMSwgZm9iaik7Ci0gIGlmIChydmFsICE9IDEpIHsKLSAgICBkZWxldGUgaGRyOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChoZHItPmVfaWRlbnRbRUlfTUFHMF0gIT0gMHg3ZiB8fCBoZHItPmVfaWRlbnRbRUlfTUFHMV0gIT0gJ0UnIHx8Ci0gICAgICBoZHItPmVfaWRlbnRbRUlfTUFHMl0gIT0gJ0wnIHx8IGhkci0+ZV9pZGVudFtFSV9NQUczXSAhPSAnRicpIHsKLSAgICBkZWxldGUgaGRyOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIEFkanVzdEVsZkhlYWRlcihoZHIpOwotICByZXR1cm4gaGRyOwotfQotCi1FbGYzMl9TaGRyICpSZWFkU2VjdGlvbkhlYWRlcnMoRWxmMzJfRWhkciAqaGRyLCBGSUxFICpmKQotewotICBpbnQgaTsKLSAgdW5zaWduZWQgbG9uZyBzeiA9IGhkci0+ZV9zaG51bSAqIGhkci0+ZV9zaGVudHNpemU7Ci0gIGFzc2VydChzaXplb2YoRWxmMzJfU2hkcikgPT0gaGRyLT5lX3NoZW50c2l6ZSk7Ci0gIEVsZjMyX1NoZHIgKnNoZHIgPSBuZXcgRWxmMzJfU2hkcltoZHItPmVfc2hudW1dOwotCi0gIGlmIChmc2VlayhmLCBoZHItPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQotICB7Ci0gICAgZGVsZXRlW10gc2hkcjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZnJlYWQoc2hkciwgc3osIDEsIGYpICE9IDEpCi0gIHsKLSAgICBkZWxldGVbXSBzaGRyOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZm9yKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspCi0gICAgQWRqdXN0U2VjdGlvbkhlYWRlcihoZHIsIHNoZHIgKyBpKTsKLQotICByZXR1cm4gc2hkcjsKLX0KLQotCi1jaGFyICpSZWFkU3RyaW5nVGFibGUoRWxmMzJfRWhkciAqaGRyLCBFbGYzMl9TaGRyICpzaGRyX3RhYmxlLCBGSUxFICpmKQotewotICBFbGYzMl9TaGRyICpzaGRyID0gc2hkcl90YWJsZSArIGhkci0+ZV9zaHN0cm5keDsKLSAgY2hhciAqc3RyaW5nX3RhYmxlOwotCi0gIHN0cmluZ190YWJsZSA9IG5ldyBjaGFyW3NoZHItPnNoX3NpemVdOwotICBmc2VlayhmLCBzaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKLSAgZnJlYWQoc3RyaW5nX3RhYmxlLCBzaGRyLT5zaF9zaXplLCAxLCBmKTsKLQotICByZXR1cm4gc3RyaW5nX3RhYmxlOwotfQotCi1pbnQgUmVhZFNlY3Rpb24oRWxmMzJfU2hkciAqc2hkciwgdm9pZCAqYnVmZmVyLCBGSUxFICpmKQotewotICBpZiAoZnNlZWsoZiwgc2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChmcmVhZChidWZmZXIsIHNoZHItPnNoX3NpemUsIDEsIGYpICE9IDEpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotY2hhciAqR2V0U3ltYm9sTmFtZShFbGYzMl9IYWxmIGluZGV4LCBjaGFyICpzdHJpbmdfdGFibGUpCi17Ci0gIHJldHVybiBzdHJpbmdfdGFibGUgKyBpbmRleDsKLX0KLQotRWxmMzJfU2hkciAqRmluZFN5bWJvbFRhYmxlU2VjdGlvbihFbGYzMl9FaGRyICpoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZjMyX1NoZHIgKnNoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cmluZ190YWJsZSkKLXsKLSAgZm9yKGludCBpaSA9IDA7IGlpIDwgaGRyLT5lX3NobnVtOyBpaSsrKSB7Ci0gICAgaWYgKHNoZHJbaWldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQiAmJgotICAgICAgIHN0cmNtcChHZXRTeW1ib2xOYW1lKHNoZHJbaWldLnNoX25hbWUsIHN0cmluZ190YWJsZSksCi0gICAgICAgICAgICAgICIuc3ltdGFiIikgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gJnNoZHJbaWldOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotRWxmMzJfU2hkciAqRmluZFN5bWJvbFN0cmluZ1RhYmxlU2VjdGlvbihFbGYzMl9FaGRyICpoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZjMyX1NoZHIgKnNoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cmluZ190YWJsZSkKLXsKLSAgZm9yKGludCBpaSA9IDA7IGlpIDwgaGRyLT5lX3NobnVtOyBpaSsrKSB7Ci0gICAgaWYgKHNoZHJbaWldLnNoX3R5cGUgPT0gU0hUX1NUUlRBQiAmJgotICAgICAgIHN0cmNtcChHZXRTeW1ib2xOYW1lKHNoZHJbaWldLnNoX25hbWUsIHN0cmluZ190YWJsZSksCi0gICAgICAgICAgICAgICIuc3RydGFiIikgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gJnNoZHJbaWldOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9yZWFkX2VsZi5oIGIvZW11bGF0b3IvcXRvb2xzL3JlYWRfZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjY2YzMuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3JlYWRfZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIFJFQURfRUxGX0gKLSNkZWZpbmUgUkVBRF9FTEZfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlbGYuaD4KLQotRWxmMzJfRWhkciAqUmVhZEVsZkhlYWRlcihGSUxFICpmb2JqKTsKLUVsZjMyX1NoZHIgKlJlYWRTZWN0aW9uSGVhZGVycyhFbGYzMl9FaGRyICpoZHIsIEZJTEUgKmZvYmopOwotY2hhciAqUmVhZFN0cmluZ1RhYmxlKEVsZjMyX0VoZHIgKmhkciwgRWxmMzJfU2hkciAqc2hkciwgRklMRSAqZm9iaik7Ci1FbGYzMl9TaGRyICpGaW5kU3ltYm9sVGFibGVTZWN0aW9uKEVsZjMyX0VoZHIgKmhkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxmMzJfU2hkciAqc2hkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyaW5nX3RhYmxlKTsKLUVsZjMyX1NoZHIgKkZpbmRTeW1ib2xTdHJpbmdUYWJsZVNlY3Rpb24oRWxmMzJfRWhkciAqaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGYzMl9TaGRyICpzaGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHJpbmdfdGFibGUpOwotaW50IFJlYWRTZWN0aW9uKEVsZjMyX1NoZHIgKnNoZHIsIHZvaWQgKmJ1ZmZlciwgRklMRSAqZik7Ci12b2lkIEFkanVzdEVsZlN5bWJvbHMoRWxmMzJfRWhkciAqaGRyLCBFbGYzMl9TeW0gKmVsZl9zeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZW50cmllcyk7Ci0KLSNlbmRpZiAvKiBSRUFEX0VMRl9IICovCmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcmVhZF9tZXRob2QuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3JlYWRfbWV0aG9kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhMGMxYS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvcmVhZF9tZXRob2QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy5oIgotCi10eXBlZGVmIFRyYWNlUmVhZGVyPD4gVHJhY2VSZWFkZXJUeXBlOwotCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy1pbmwuaCIKLQotc3RydWN0IGZyYW1lIHsKLSAgICB1aW50NjRfdCAgICB0aW1lOwotICAgIHVpbnQzMl90ICAgIGFkZHI7Ci0gICAgY29uc3QgY2hhciAgKm5hbWU7Ci0gICAgYm9vbCAgICAgICAgaXNOYXRpdmU7Ci0KLSAgICBmcmFtZSh1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzTmF0aXZlKSB7Ci0gICAgICAgIHRoaXMtPnRpbWUgPSB0aW1lOwotICAgICAgICB0aGlzLT5hZGRyID0gYWRkcjsKLSAgICAgICAgdGhpcy0+bmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMtPmlzTmF0aXZlID0gaXNOYXRpdmU7Ci0gICAgfQotfTsKLQotY2xhc3MgU3RhY2sgewotICAgIHN0YXRpYyBjb25zdCBpbnQga01heEZyYW1lcyA9IDEwMDA7Ci0gICAgaW50IHRvcDsKLSAgICBmcmFtZSAqZnJhbWVzW2tNYXhGcmFtZXNdOwotCi1wdWJsaWM6Ci0gICAgU3RhY2soKSB7Ci0gICAgICAgIHRvcCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCAgICAgICAgcHVzaChmcmFtZSAqcGZyYW1lKTsKLSAgICBmcmFtZSogICAgICBwb3AoKTsKLSAgICB2b2lkICAgICAgICBkdW1wKCk7Ci19OwotCi12b2lkIFN0YWNrOjpwdXNoKGZyYW1lICpwZnJhbWUpIHsKLSAgICBpZiAodG9wID09IGtNYXhGcmFtZXMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogc3RhY2sgb3ZlcmZsb3dcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBmcmFtZXNbdG9wXSA9IHBmcmFtZTsKLSAgICB0b3AgKz0gMTsKLX0KLQotZnJhbWUgKlN0YWNrOjpwb3AoKSB7Ci0gICAgaWYgKHRvcCA8PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB0b3AgLT0gMTsKLSAgICByZXR1cm4gZnJhbWVzW3RvcF07Ci19Ci0KLXZvaWQgU3RhY2s6OmR1bXAoKSB7Ci0gICAgZnJhbWUgKnBmcmFtZTsKLQotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCB0b3A7IGlpKyspIHsKLSAgICAgICAgcGZyYW1lID0gZnJhbWVzW2lpXTsKLSAgICAgICAgY29uc3QgY2hhciAqbmF0aXZlID0gcGZyYW1lLT5pc05hdGl2ZSA/ICJuIiA6ICIgIjsKLSAgICAgICAgcHJpbnRmKCIgJXMgJWQ6ICVsbHUgMHgleCAlc1xuIiwKLSAgICAgICAgICAgICAgIG5hdGl2ZSwgaWksIHBmcmFtZS0+dGltZSwgcGZyYW1lLT5hZGRyLAotICAgICAgICAgICAgICAgcGZyYW1lLT5uYW1lID09IE5VTEwgPyAiIiA6IHBmcmFtZS0+bmFtZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgaW50IGtNYXhUaHJlYWRzID0gKDMyICogMTAyNCk7Ci1TdGFjayAqc3RhY2tzW2tNYXhUaHJlYWRzXTsKLQotdm9pZCBVc2FnZShjb25zdCBjaGFyICpwcm9ncmFtKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvcHRpb25zXSB0cmFjZV9uYW1lIGVsZl9maWxlXG4iLAotICAgICAgICAgICAgcHJvZ3JhbSk7Ci0gICAgT3B0aW9uc1VzYWdlKCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoYXJnYyAtIG9wdGluZCAhPSAyKSB7Ci0gICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGNoYXIgKnFlbXVfdHJhY2VfZmlsZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGNoYXIgKmVsZl9maWxlID0gYXJndltvcHRpbmQrK107Ci0gICAgVHJhY2VSZWFkZXJUeXBlICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlclR5cGU7Ci0gICAgdHJhY2UtPk9wZW4ocWVtdV90cmFjZV9maWxlKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgTWV0aG9kUmVjIG1ldGhvZF9yZWNvcmQ7Ci0gICAgICAgIHN5bWJvbF90eXBlICpzeW07Ci0gICAgICAgIFRyYWNlUmVhZGVyVHlwZTo6UHJvY2Vzc1N0YXRlICpwcm9jOwotICAgICAgICBmcmFtZSAqcGZyYW1lOwotCi0gICAgICAgIGlmICh0cmFjZS0+UmVhZE1ldGhvZFN5bWJvbCgmbWV0aG9kX3JlY29yZCwgJnN5bSwgJnByb2MpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCFJc1ZhbGlkUGlkKHByb2MtPnBpZCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoc3ltICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHByaW50ZigiJWxsZCBwICVkIDB4JXggJWQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgbWV0aG9kX3JlY29yZC50aW1lLCBwcm9jLT5waWQsIG1ldGhvZF9yZWNvcmQuYWRkciwKLSAgICAgICAgICAgICAgICAgICBtZXRob2RfcmVjb3JkLmZsYWdzLCBzeW0tPm5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCIlbGxkIHAgJWQgMHgleCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBtZXRob2RfcmVjb3JkLnRpbWUsIHByb2MtPnBpZCwgbWV0aG9kX3JlY29yZC5hZGRyLAotICAgICAgICAgICAgICAgICAgIG1ldGhvZF9yZWNvcmQuZmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBzdGFjayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkCi0gICAgICAgIFN0YWNrICpwU3RhY2sgPSBzdGFja3NbcHJvYy0+cGlkXTsKLQotICAgICAgICAvLyBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIHRoZW4gYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgICBpZiAocFN0YWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBTdGFjayA9IG5ldyBTdGFjaygpOwotICAgICAgICAgICAgc3RhY2tzW3Byb2MtPnBpZF0gPSBwU3RhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmxhZ3MgPSBtZXRob2RfcmVjb3JkLmZsYWdzOwotICAgICAgICBpZiAoZmxhZ3MgPT0ga01ldGhvZEVudGVyIHx8IGZsYWdzID09IGtOYXRpdmVFbnRlcikgewotICAgICAgICAgICAgcGZyYW1lID0gbmV3IGZyYW1lKG1ldGhvZF9yZWNvcmQudGltZSwgbWV0aG9kX3JlY29yZC5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bSA9PSBOVUxMID8gTlVMTDogc3ltLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9yZWNvcmQuZmxhZ3MgPT0ga05hdGl2ZUVudGVyKTsKLSAgICAgICAgICAgIHBTdGFjay0+cHVzaChwZnJhbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGZyYW1lID0gcFN0YWNrLT5wb3AoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwZnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0YWNrLT5kdW1wKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3JlYWRfcGlkLmNwcCBiL2VtdWxhdG9yL3F0b29scy9yZWFkX3BpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDY5ZDQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3JlYWRfcGlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgdHJhY2VfZmlsZVxuIiwgYXJndlswXSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gYXJndlsxXTsKLSAgVHJhY2VSZWFkZXJCYXNlICp0cmFjZSA9IG5ldyBUcmFjZVJlYWRlckJhc2U7Ci0gIHRyYWNlLT5PcGVuKHRyYWNlX2ZpbGVuYW1lKTsKLQotICB3aGlsZSAoMSkgewotICAgIFBpZEV2ZW50IGV2ZW50OwotICAgIGlmICh0cmFjZS0+UmVhZFBpZEV2ZW50KCZldmVudCkpCi0gICAgICBicmVhazsKLSAgICBzd2l0Y2ggKGV2ZW50LnJlY190eXBlKSB7Ci0gICAgICBjYXNlIGtQaWRGb3JrOgotICAgICAgICBwcmludGYoInQlbGxkIGZvcmsgdGdpZCAlZCBwaWQgJWRcbiIsIGV2ZW50LnRpbWUsIGV2ZW50LnRnaWQsIGV2ZW50LnBpZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUGlkQ2xvbmU6Ci0gICAgICAgIHByaW50ZigidCVsbGQgY2xvbmUgdGdpZCAlZCBwaWQgJWRcbiIsIGV2ZW50LnRpbWUsIGV2ZW50LnRnaWQsIGV2ZW50LnBpZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUGlkU3dpdGNoOgotICAgICAgICBwcmludGYoInQlbGxkIHN3aXRjaCAlZFxuIiwgZXZlbnQudGltZSwgZXZlbnQucGlkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtQaWRFeGl0OgotICAgICAgICBwcmludGYoInQlbGxkIGV4aXQgJWRcbiIsIGV2ZW50LnRpbWUsIGV2ZW50LnBpZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUGlkTW1hcDoKLSAgICAgICAgcHJpbnRmKCJ0JWxsZCBtbWFwICUwOHggLSAlMDh4LCBvZmZzZXQgJTA4eCAnJXMnXG4iLAotICAgICAgICAgICAgICAgZXZlbnQudGltZSwgZXZlbnQudnN0YXJ0LCBldmVudC52ZW5kLCBldmVudC5vZmZzZXQsIGV2ZW50LnBhdGgpOwotICAgICAgICBkZWxldGVbXSBldmVudC5wYXRoOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga1BpZE11bm1hcDoKLSAgICAgICAgcHJpbnRmKCJ0JWxsZCBtdW5tYXAgJTA4eCAtICUwOHhcbiIsCi0gICAgICAgICAgICAgICBldmVudC50aW1lLCBldmVudC52c3RhcnQsIGV2ZW50LnZlbmQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga1BpZFN5bWJvbEFkZDoKLSAgICAgICAgcHJpbnRmKCJ0JWxsZCBhZGQgc3ltICUwOHggJyVzJ1xuIiwKLSAgICAgICAgICAgICAgIGV2ZW50LnRpbWUsIGV2ZW50LnZzdGFydCwgZXZlbnQucGF0aCk7Ci0gICAgICAgIGRlbGV0ZVtdIGV2ZW50LnBhdGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUGlkU3ltYm9sUmVtb3ZlOgotICAgICAgICBwcmludGYoInQlbGxkIHJlbW92ZSAlMDh4XG4iLCBldmVudC50aW1lLCBldmVudC52c3RhcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga1BpZEV4ZWM6Ci0gICAgICAgIHByaW50ZigidCVsbGQgYXJnYzogJWRcbiIsIGV2ZW50LnRpbWUsIGV2ZW50LmFyZ2MpOwotICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZXZlbnQuYXJnYzsgKytpaSkgewotICAgICAgICAgIHByaW50ZigiICBhcmd2WyVkXTogJXNcbiIsIGlpLCBldmVudC5hcmd2W2lpXSk7Ci0gICAgICAgICAgZGVsZXRlW10gZXZlbnQuYXJndltpaV07Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlW10gZXZlbnQuYXJndjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtQaWRLdGhyZWFkTmFtZToKLSAgICAgICAgcHJpbnRmKCJ0JWxsZCBrdGhyZWFkIHRnaWQgJWQgcGlkICVkICVzXG4iLAotICAgICAgICAgICAgICAgZXZlbnQudGltZSwgZXZlbnQudGdpZCwgZXZlbnQucGlkLCBldmVudC5wYXRoKTsKLSAgICAgICAgZGVsZXRlW10gZXZlbnQucGF0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtQaWROYW1lOgotICAgICAgICBwcmludGYoInQlbGxkIG5hbWUgJWQgJXNcbiIsCi0gICAgICAgICAgICAgICBldmVudC50aW1lLCBldmVudC5waWQsIGV2ZW50LnBhdGgpOwotICAgICAgICBkZWxldGVbXSBldmVudC5wYXRoOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvcmVhZF90cmFjZS5jcHAgYi9lbXVsYXRvci9xdG9vbHMvcmVhZF90cmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDkxN2MuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3JlYWRfdHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0jaW5jbHVkZSAiYXJtZGlzLmgiCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy5oIgotCi10eXBlZGVmIFRyYWNlUmVhZGVyPD4gVHJhY2VSZWFkZXJUeXBlOwotCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy1pbmwuaCIKLQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtPZmZzZXRUaHJlc2hvbGQgPSAweDEwMDAwMDsKLXN0YXRpYyB1aW50NjRfdCBzdGFydFRpbWUgPSAwOwotCi12b2lkIFVzYWdlKGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiVXNhZ2U6ICVzIFtvcHRpb25zXSBbLS0gLXMgc3RhcnRfdGltZV0gdHJhY2VfZmlsZSBlbGZfZmlsZVxuIiwKLSAgICAgICAgICAgIHByb2dyYW0pOwotICAgIE9wdGlvbnNVc2FnZSgpOwotfQotCi0KLWJvb2wgbG9jYWxQYXJzZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGJvb2wgZXJyID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFlcnIpIHsKLSAgICAgICAgaW50IG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK3M6Iik7Ci0gICAgICAgIGlmIChvcHQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3dpdGNoIChvcHQpIHsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICBzdGFydFRpbWUgPSBzdHJ0b3VsbChvcHRhcmcsIE5VTEwsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgLy8gUGFyc2UgdGhlIG9wdGlvbnMKLSAgICBQYXJzZU9wdGlvbnMoYXJnYywgYXJndik7Ci0gICAgbG9jYWxQYXJzZU9wdGlvbnMoYXJnYywgYXJndik7Ci0gICAgaWYgKGFyZ2MgLSBvcHRpbmQgIT0gMikgewotICAgICAgICBVc2FnZShhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjaGFyICp0cmFjZV9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGNoYXIgKmVsZl9maWxlID0gYXJndltvcHRpbmQrK107Ci0gICAgVHJhY2VSZWFkZXI8PiAqdHJhY2UgPSBuZXcgVHJhY2VSZWFkZXI8PjsKLSAgICB0cmFjZS0+T3Blbih0cmFjZV9maWxlbmFtZSk7Ci0gICAgdHJhY2UtPlNldERlbWFuZ2xlKGRlbWFuZ2xlKTsKLSAgICB0cmFjZS0+UmVhZEtlcm5lbFN5bWJvbHMoZWxmX2ZpbGUpOwotICAgIHRyYWNlLT5TZXRSb290KHJvb3QpOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgc3ltYm9sX3R5cGUgKnN5bTsKLSAgICAgICAgY2hhciBidWZbMTAyNF07Ci0gICAgICAgIEJCRXZlbnQgZXZlbnQ7Ci0gICAgICAgIEJCRXZlbnQgaWdub3JlZDsKLQotICAgICAgICBpZiAoR2V0TmV4dFZhbGlkRXZlbnQodHJhY2UsICZldmVudCwgJmlnbm9yZWQsICZzeW0pKQotICAgICAgICAgICAgYnJlYWs7Ci0jaWYgMAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInQlbGx1IGJiICVsbGQgJWRcbiIsCi0gICAgICAgICAgICAgICAgZXZlbnQudGltZSwgZXZlbnQuYmJfbnVtLCBldmVudC5udW1faW5zbnMpOwotI2VuZGlmCi0KLSAgICAgICAgdWludDMyX3QgKmluc25zID0gZXZlbnQuaW5zbnM7Ci0gICAgICAgIHVpbnQzMl90IGFkZHIgPSBldmVudC5iYl9hZGRyOwotICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBhZGRyIC0gc3ltLT5hZGRyIC0gc3ltLT5yZWdpb24tPmJhc2VfYWRkcjsKLSAgICAgICAgc3ltYm9sX3R5cGUgKnZtX3N5bSA9IHN5bS0+dm1fc3ltOwotICAgICAgICBjb25zdCBjaGFyICp2bV9uYW1lID0gTlVMTDsKLSAgICAgICAgaWYgKHZtX3N5bSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB2bV9uYW1lID0gdm1fc3ltLT5uYW1lOwotICAgICAgICAgICAgb2Zmc2V0ID0gYWRkciAtIHZtX3N5bS0+YWRkciAtIHZtX3N5bS0+cmVnaW9uLT5iYXNlX2FkZHI7Ci0gICAgICAgIH0KLSNpZiAwCi0gICAgICAgIGlmIChzdHJjbXAoc3ltLT5uYW1lLCAiKHVua25vd24pIikgPT0gMCB8fCBvZmZzZXQgPiBrT2Zmc2V0VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICBQcm9jZXNzU3RhdGUgKnByb2Nlc3MgPSB0cmFjZS0+R2V0Q3VycmVudFByb2Nlc3MoKTsKLSAgICAgICAgICAgIFByb2Nlc3NTdGF0ZSAqbWFuYWdlciA9IHByb2Nlc3MtPmFkZHJfbWFuYWdlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtYW5hZ2VyLT5ucmVnaW9uczsgKytpaSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAlMmQ6ICUwOHggLSAlMDh4IGJhc2U6ICUwOHggb2Zmc2V0OiAldSBuc3ltczogJTRkIGZsYWdzOiAweCV4ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPnZzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPnZlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5iYXNlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5maWxlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPm5zeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLT5yZWdpb25zW2lpXS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5wYXRoKTsKLSAgICAgICAgICAgICAgICBpbnQgbnN5bWJvbHMgPSBtYW5hZ2VyLT5yZWdpb25zW2lpXS0+bnN5bWJvbHM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDEwICYmIGpqIDwgbnN5bWJvbHM7ICsramopIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgJTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5zeW1ib2xzW2pqXS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPnN5bWJvbHNbampdLm5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0jaWYgMQotICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZXZlbnQubnVtX2luc25zOyArK2lpKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBzaW1fdGltZSA9IHRyYWNlLT5SZWFkSW5zblRpbWUoZXZlbnQudGltZSk7Ci0gICAgICAgICAgICBpZiAoc2ltX3RpbWUgPCBzdGFydFRpbWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGluc24gPSBpbnNuc1tpaV07Ci0gICAgICAgICAgICBjaGFyICpkaXNhc207Ci0gICAgICAgICAgICBpbnQgYnl0ZXM7Ci0gICAgICAgICAgICBpZiAodm1fbmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICIlcyslMDJ4OiAlcyIsIHZtX25hbWUsIG9mZnNldCwgc3ltLT5uYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICIlcyslMDJ4Iiwgc3ltLT5uYW1lLCBvZmZzZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5zbl9pc190aHVtYihpbnNuKSkgewotICAgICAgICAgICAgICAgIGJ5dGVzID0gMjsKLSAgICAgICAgICAgICAgICBpbnNuID0gaW5zbl91bndyYXBfdGh1bWIoaW5zbik7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aHVtYl9wYWlyIGlzIHRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBwYWlyIG9mCi0gICAgICAgICAgICAgICAgLy8gdGh1bWIgaW5zdHJ1Y3Rpb25zIChCTCBvciBCTFgpLgotICAgICAgICAgICAgICAgIGJvb2wgdGh1bWJfcGFpciA9ICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB0aHVtYiBpbnN0cnVjdGlvbiAoaWYgYW55KSBiZWNhdXNlIHdlIG1heSBuZWVkCi0gICAgICAgICAgICAgICAgLy8gaXQgZm9yIHRoZSBjYXNlIHdoZXJlIGluc24gaXMgQkwgb3IgQkxYLgotICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc24yID0gMDsKLSAgICAgICAgICAgICAgICBpZiAodGh1bWJfcGFpciAmJiAoaWkgKyAxIDwgZXZlbnQubnVtX2luc25zKSkgewotICAgICAgICAgICAgICAgICAgICBpbnNuMiA9IGluc25zW2lpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGluc24yID0gaW5zbl91bndyYXBfdGh1bWIoaW5zbjIpOwotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGlpICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc2FzbSA9IGRpc2FzbV9pbnNuX3RodW1iKGFkZHIsIGluc24sIGluc24yLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAodGh1bWJfcGFpcikgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVsbHUgcCUtNGQgJTA4eCAlMDR4ICUwNHggJS0zMHMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fdGltZSwgZXZlbnQucGlkLCBhZGRyLCBpbnNuLCBpbnNuMiwgYnVmLCBkaXNhc20pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWxsdSBwJS00ZCAlMDh4ICAgICAlMDR4ICUtMzBzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltX3RpbWUsIGV2ZW50LnBpZCwgYWRkciwgaW5zbiwgYnVmLCBkaXNhc20pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZXMgPSA0OwotICAgICAgICAgICAgICAgIGRpc2FzbSA9IEFybTo6ZGlzYXNtKGFkZHIsIGluc24sIE5VTEwpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJWxsdSBwJS00ZCAlMDh4ICUwOHggJS0zMHMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpbV90aW1lLCBldmVudC5waWQsIGFkZHIsIGluc24sIGJ1ZiwgZGlzYXNtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcHJpbnRmKCJ0JWxsdSBcdCUwOHhcbiIsIHNpbV90aW1lLCBhZGRyKTsKLSAgICAgICAgICAgIGFkZHIgKz0gYnl0ZXM7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXM7Ci0gICAgICAgIH0KLSNlbmRpZgotI2lmIDAKLSAgICAgICAgYXNzZXJ0KG9mZnNldCA8IGtPZmZzZXRUaHJlc2hvbGQpOwotI2VuZGlmCi0gICAgfQotCi0gICAgZGVsZXRlIHRyYWNlOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3N0YWNrX2R1bXAuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3N0YWNrX2R1bXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg1Y2QwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy9zdGFja19kdW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0jaW5jbHVkZSAiYml0dmVjdG9yLmgiCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy5oIgotI2luY2x1ZGUgImFybWRpcy5oIgotCi10eXBlZGVmIFRyYWNlUmVhZGVyPD4gVHJhY2VSZWFkZXJUeXBlOwotCi0jaW5jbHVkZSAicGFyc2Vfb3B0aW9ucy1pbmwuaCIKLSNpbmNsdWRlICJjYWxsc3RhY2suaCIKLQotc3RhdGljIHVpbnQ2NF90IGRlYnVnVGltZTsKLXN0YXRpYyB1aW50NjRfdCBkdW1wVGltZSA9IDA7Ci0KLWNsYXNzIE15RnJhbWUgOiBwdWJsaWMgU3RhY2tGcmFtZTxzeW1ib2xfdHlwZT4gewotICBwdWJsaWM6Ci0gICAgdm9pZCAgICBwdXNoKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKTsKLSAgICB2b2lkICAgIHBvcChpbnQgc3RhY2tMZXZlbCwgdWludDY0X3QgdGltZSwgQ2FsbFN0YWNrQmFzZSAqYmFzZSk7Ci0gICAgdm9pZCAgICBnZXRGcmFtZVR5cGUoY2hhciAqdHlwZSk7Ci19OwotCi10eXBlZGVmIENhbGxTdGFjazxNeUZyYW1lPiBDYWxsU3RhY2tUeXBlOwotCi12b2lkIE15RnJhbWU6OmdldEZyYW1lVHlwZShjaGFyICp0eXBlKQotewotICAgIHN0cmNweSh0eXBlLCAiLS0tLSIpOwotICAgIGlmIChmbGFncyAmIGtDYXVzZWRFeGNlcHRpb24pCi0gICAgICAgIHR5cGVbMF0gPSAnZSc7Ci0gICAgaWYgKGZsYWdzICYga0ludGVycHJldGVkKQotICAgICAgICB0eXBlWzFdID0gJ20nOwotICAgIGlmIChmdW5jdGlvbi0+cmVnaW9uLT5mbGFncyAmIHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb24pCi0gICAgICAgIHR5cGVbMl0gPSAnayc7Ci0gICAgaWYgKGZ1bmN0aW9uLT5mbGFncyAmIHN5bWJvbF90eXBlOjprSXNWZWN0b3JUYWJsZSkKLSAgICAgICAgdHlwZVszXSA9ICd2JzsKLX0KLQotdm9pZCBNeUZyYW1lOjpwdXNoKGludCBzdGFja0xldmVsLCB1aW50NjRfdCB0aW1lLCBDYWxsU3RhY2tCYXNlICpiYXNlKQotewotICAgIGNoYXIgdHlwZVs1XTsKLQotICAgIGlmIChkdW1wVGltZSA+IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIGdldEZyYW1lVHlwZSh0eXBlKTsKLSAgICBwcmludGYoIiVsbHUgZW4gdGhyICVkICVzICUzZCIsIHRpbWUsIGJhc2UtPmdldElkKCksIHR5cGUsIHN0YWNrTGV2ZWwpOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBzdGFja0xldmVsOyArK2lpKQotICAgICAgICBwcmludGYoIi4iKTsKLSAgICBwcmludGYoIiAweCUwOHggJXNcbiIsIGFkZHIsIGZ1bmN0aW9uLT5uYW1lKTsKLX0KLQotdm9pZCBNeUZyYW1lOjpwb3AoaW50IHN0YWNrTGV2ZWwsIHVpbnQ2NF90IHRpbWUsIENhbGxTdGFja0Jhc2UgKmJhc2UpCi17Ci0gICAgY2hhciB0eXBlWzVdOwotCi0gICAgaWYgKGR1bXBUaW1lID4gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZ2V0RnJhbWVUeXBlKHR5cGUpOwotICAgIHByaW50ZigiJWxsdSB4ICB0aHIgJWQgJXMgJTNkIiwgdGltZSwgYmFzZS0+Z2V0SWQoKSwgdHlwZSwgc3RhY2tMZXZlbCk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IHN0YWNrTGV2ZWw7ICsraWkpCi0gICAgICAgIHByaW50ZigiLiIpOwotICAgIHByaW50ZigiIDB4JTA4eCAlc1xuIiwgYWRkciwgZnVuY3Rpb24tPm5hbWUpOwotfQotCi1zdGF0aWMgY29uc3QgaW50IGtOdW1TdGFja0ZyYW1lcyA9IDUwMDsKLXN0YXRpYyBjb25zdCBpbnQga01heFRocmVhZHMgPSAoMzIgKiAxMDI0KTsKLUNhbGxTdGFja1R5cGUgKnN0YWNrc1trTWF4VGhyZWFkc107Ci0KLXZvaWQgVXNhZ2UoY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gWy0tIC1kIGR1bXBUaW1lXSB0cmFjZV9uYW1lIGVsZl9maWxlXG4iLAotICAgICAgICAgICAgcHJvZ3JhbSk7Ci0gICAgT3B0aW9uc1VzYWdlKCk7Ci19Ci0KLWJvb2wgbG9jYWxQYXJzZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGJvb2wgZXJyID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFlcnIpIHsKLSAgICAgICAgaW50IG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK2Q6Iik7Ci0gICAgICAgIGlmIChvcHQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3dpdGNoIChvcHQpIHsKLSAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICBkdW1wVGltZSA9IHN0cnRvdWxsKG9wdGFyZywgTlVMTCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGxvY2FsUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChhcmdjIC0gb3B0aW5kICE9IDIpIHsKLSAgICAgICAgVXNhZ2UoYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgY2hhciAqcWVtdV90cmFjZV9maWxlID0gYXJndltvcHRpbmQrK107Ci0gICAgY2hhciAqZWxmX2ZpbGUgPSBhcmd2W29wdGluZCsrXTsKLSAgICBUcmFjZVJlYWRlclR5cGUgKnRyYWNlID0gbmV3IFRyYWNlUmVhZGVyVHlwZTsKLSAgICB0cmFjZS0+T3BlbihxZW11X3RyYWNlX2ZpbGUpOwotICAgIHRyYWNlLT5SZWFkS2VybmVsU3ltYm9scyhlbGZfZmlsZSk7Ci0gICAgdHJhY2UtPlNldFJvb3Qocm9vdCk7Ci0KLSAgICBCQkV2ZW50IGV2ZW50OwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEJCRXZlbnQgaWdub3JlZDsKLSAgICAgICAgc3ltYm9sX3R5cGUgKmZ1bmN0aW9uOwotCi0gICAgICAgIGlmIChHZXROZXh0VmFsaWRFdmVudCh0cmFjZSwgJmV2ZW50LCAmaWdub3JlZCwgJmZ1bmN0aW9uKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoZXZlbnQuYmJfbnVtID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBHZXQgdGhlIHN0YWNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgICAgQ2FsbFN0YWNrVHlwZSAqcFN0YWNrID0gc3RhY2tzW2V2ZW50LnBpZF07Ci0KLSAgICAgICAgLy8gSWYgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0LCB0aGVuIGFsbG9jYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgaWYgKHBTdGFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwU3RhY2sgPSBuZXcgQ2FsbFN0YWNrVHlwZShldmVudC5waWQsIGtOdW1TdGFja0ZyYW1lcywgdHJhY2UpOwotICAgICAgICAgICAgc3RhY2tzW2V2ZW50LnBpZF0gPSBwU3RhY2s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlYnVnVGltZSAhPSAwICYmIGV2ZW50LnRpbWUgPj0gZGVidWdUaW1lKQotICAgICAgICAgICAgcHJpbnRmKCJkZWJ1ZyB0aW1lOiAlbGxkXG4iLCBkZWJ1Z1RpbWUpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhY2sKLSAgICAgICAgcFN0YWNrLT51cGRhdGVTdGFjaygmZXZlbnQsIGZ1bmN0aW9uKTsKLQotICAgICAgICAvLyBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgYSBzdGFjayBkdW1wIGF0IGEgY2VydGFpbiB0aW1lLAotICAgICAgICAvLyBhbmQgd2UgYXJlIGF0IHRoYXQgdGltZSwgdGhlbiBkdW1wIHRoZSBzdGFjayBhbmQgZXhpdC4KLSAgICAgICAgaWYgKGR1bXBUaW1lID4gMCAmJiBldmVudC50aW1lID49IGR1bXBUaW1lKSB7Ci0gICAgICAgICAgICBwU3RhY2stPnNob3dTdGFjayhzdGRvdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwga01heFRocmVhZHM7ICsraWkpIHsKLSAgICAgICAgaWYgKHN0YWNrc1tpaV0pCi0gICAgICAgICAgICBzdGFja3NbaWldLT5wb3BBbGwoZXZlbnQudGltZSk7Ci0gICAgfQotCi0gICAgZGVsZXRlIHRyYWNlOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL2NvbW1vbl9oZWFkLm1rIGIvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL2NvbW1vbl9oZWFkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3MGU5Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy9jb21tb25faGVhZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNDIDo9IGFybS1lbGYtZ2NjCi1MRCA6PSBhcm0tZWxmLWxkCi1BUyA6PSBhcm0tZWxmLWFzCi1PQkpDT1BZIDo9IGFybS1lbGYtb2JqY29weQotT0JKRFVNUCA6PSBhcm0tZWxmLW9iamR1bXAKLQotT1BUIDo9IC1nCi1DRkxBR1MgOj0gJChPUFQpIC1tY3B1PWFybTkKLQotLlNVRkZJWEVTOiAuZGlzIC5iaW4gLmVsZgotCi0uYy5lbGY6Ci0JJChDQykgJChDRkxBR1MpICAtWGxpbmtlciAtLXNjcmlwdCAuLi90ZXN0cy5sZCAtbyAkQCAkPCAtbm9zdGRsaWIKLQotLmMuczoKLQkkKENDKSAkKENGTEFHUykgLXN0YXRpYyAtUyAkPAotCi0uUy5lbGY6Ci0JJChDQykgJChDRkxBR1MpIC1YbGlua2VyIC0tc2NyaXB0IC4uL3Rlc3RzLmxkIC1ub3N0ZGxpYiAtbyAkQCAkPAotCi0uZWxmLmRpczoKLQkkKE9CSkRVTVApIC1hZHggJDwgPiAkQAotCi0uZWxmLmJpbjoKLQkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQApkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL2NvbW1vbl90YWlsLm1rIGIvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL2NvbW1vbl90YWlsLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTFjMTQxLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy9jb21tb25fdGFpbC5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1jbGVhbjoKLQlybSAtZiAqLmVsZiAqLmRpcyAqLmJpbiAqLm8gKn4gYS5vdXQKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy9ndHJhY2UvTWFrZWZpbGUgYi9lbXVsYXRvci9xdG9vbHMvdGVzdHMvZ3RyYWNlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIwNTBjLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy9ndHJhY2UvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1pbmNsdWRlIC4uL2NvbW1vbl9oZWFkLm1rCi0KLVA0Uk9PVD0vd29yay9hbmRyb2lkCi1RRU1VPSQoUDRST09UKS9kZXZpY2UvdG9vbHMvcWVtdS9hcm0tc29mdG1tdS9xZW11LXN5c3RlbS1hcm0KLVFUT09MUz0kKFA0Uk9PVCkvZGV2aWNlL3Rvb2xzL3F0b29scwotCi1hbGw6IHRlc3QuZWxmIHRlc3QuYmluIHRlc3QuZGlzCi0KLXRyYWNlOiB0ZXN0LmVsZiB0ZXN0LmJpbgotCSQoUUVNVSkgLVFFTVUgLWtlcm5lbCB0ZXN0LmJpbiAtdHJhY2UgZm9vCi0JJChRVE9PTFMpL3Bvc3RfdHJhY2UgZm9vCi0JJChRVE9PTFMpL3JlYWRfdHJhY2UgZm9vIHRlc3QuZWxmID4gdDEKLQotZ3RyYWNlOiB0cmFjZQotCSQoUVRPT0xTKS9xMmcgLXIgJChQNFJPT1QpL2RldmljZS9vdXQvbGludXgtYXJtLXJlbGVhc2Uvc3ltYm9scyBmb28gdGVzdC5lbGYgZm9vLmd0cmFjZQotCWd0cmFjZXBvc3Q2NCBmb28uZ3RyYWNlID4gdDIKLQotaW5jbHVkZSAuLi9jb21tb25fdGFpbC5tawpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL2d0cmFjZS90ZXN0LmMgYi9lbXVsYXRvci9xdG9vbHMvdGVzdHMvZ3RyYWNlL3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2YTBmMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvdGVzdHMvZ3RyYWNlL3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0jaW5jbHVkZSAiLi4vbWFjcm9zLmgiCi0KLWludCBmb28xKCk7Ci1pbnQgZm9vMigpOwotdm9pZCBiYXIoKTsKLWludCBjaGlsZDEoKTsKLWludCBjaGlsZDIoKTsKLWludCBjaGlsZDMoKTsKLWludCBjaGlsZDQoKTsKLWludCBjaGlsZDUoKTsKLQotaW50IGdsb2JhbDsKLQotdm9pZCBzdGFydCgpCi17Ci0gIC8vIFNldCB0aGUgc3RhY2sgcG9pbnRlcgotICBhc20oIiAgbW92IHIxMywjMHgyMDAwMDAiKTsKLSAgUFJJTlRfU1RSKCJoZWxsb1xuIik7Ci0gIFRSQUNFX0lOSVRfTkFNRSg3MDEsICJwcm9jX2ZvbyIpOwotICBUUkFDRV9JTklUX05BTUUoNzAyLCAicHJvY19iYXIiKTsKLSAgVFJBQ0VfU1dJVENIKDcwMSk7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMSgpOwotICBUUkFDRV9TV0lUQ0goNzAyKTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBiYXIoKTsKLSAgVFJBQ0VfU1dJVENIKDcwMSk7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMigpOwotICBUUkFDRV9TV0lUQ0goNzAzKTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0gIFRSQUNFX1NXSVRDSCg3MDEpOwotICBpZiAoZ2xvYmFsKysgPiAwKQotICAgICAgZ2xvYmFsKys7Ci0gIGZvbzEoKTsKLQotICBUUkFDRV9TV0lUQ0goNzA0KTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0KLSAgVFJBQ0VfU1dJVENIKDcwMSk7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMSgpOwotCi0gIFRSQUNFX1NXSVRDSCg3MDUpOwotICBpZiAoZ2xvYmFsKysgPiAwKQotICAgICAgZ2xvYmFsKys7Ci0gIGZvbzEoKTsKLQotICBUUkFDRV9TV0lUQ0goNzAxKTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0KLSAgVFJBQ0VfU1dJVENIKDcwNik7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMSgpOwotCi0gIFRSQUNFX1NXSVRDSCg3MDEpOwotICBpZiAoZ2xvYmFsKysgPiAwKQotICAgICAgZ2xvYmFsKys7Ci0gIGZvbzEoKTsKLQotICBUUkFDRV9TV0lUQ0goNzA3KTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0KLSAgVFJBQ0VfU1dJVENIKDcwMSk7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMSgpOwotCi0gIFRSQUNFX1NXSVRDSCg3MDgpOwotICBpZiAoZ2xvYmFsKysgPiAwKQotICAgICAgZ2xvYmFsKys7Ci0gIGZvbzEoKTsKLQotICBUUkFDRV9TV0lUQ0goNzAxKTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0KLSAgVFJBQ0VfU1dJVENIKDcwOSk7Ci0gIGlmIChnbG9iYWwrKyA+IDApCi0gICAgICBnbG9iYWwrKzsKLSAgZm9vMSgpOwotCi0gIFRSQUNFX1NXSVRDSCg3MDEpOwotICBpZiAoZ2xvYmFsKysgPiAwKQotICAgICAgZ2xvYmFsKys7Ci0gIGZvbzEoKTsKLQotICBUUkFDRV9TV0lUQ0goNzEwKTsKLSAgaWYgKGdsb2JhbCsrID4gMCkKLSAgICAgIGdsb2JhbCsrOwotICBmb28xKCk7Ci0KLSAgVFJBQ0VfU1RPUF9FTVUoKTsKLX0KLQotaW50IGZvbzEoKQotewotICBpbnQgYSA9IDA7Ci0KLSAgaW50IGlpOwotICBmb3IgKGlpID0gMDsgaWkgPCAzOyArK2lpKSB7Ci0gICAgYSArPSBjaGlsZDEoKTsKLSAgICBhICs9IGNoaWxkMigpOwotICAgIGEgKz0gY2hpbGQzKCk7Ci0gIH0KLSAgcmV0dXJuIGE7Ci19Ci0KLWludCBmb28yKCkKLXsKLSAgaW50IGEgPSAwOwotCi0gIGludCBpaTsKLSAgZm9yIChpaSA9IDA7IGlpIDwgMjsgKytpaSkgewotICAgIGEgKz0gY2hpbGQzKCk7Ci0gICAgYSArPSBjaGlsZDQoKTsKLSAgICBhICs9IGNoaWxkNSgpOwotICB9Ci0gIHJldHVybiBhOwotfQotCi0jZGVmaW5lIGtTdHJpZGUgNjQKLXZvaWQgYmFyKCkKLXsKLSAgaW50IGEgPSAwOwotCi0gIHN0YXRpYyBjaGFyIG1lbVsxMDAwICoga1N0cmlkZV07Ci0KLSAgaW50IGlpLCBqajsKLQotICBmb3IgKGlpID0gMDsgaWkgPCA0OyArK2lpKSB7Ci0gICAgZm9yIChqaiA9IDA7IGpqIDwgMTA7ICsramopCi0gICAgICBhICs9IG1lbVtqaiAqIGtTdHJpZGVdOwotICAgIGZvbzEoKTsKLSAgICBmb28yKCk7Ci0gIH0KLX0KLQotaW50IGNoaWxkMSgpCi17Ci0gIGludCBhID0gMDsKLQotICBpbnQgaWk7Ci0gIGZvciAoaWkgPSAwOyBpaSA8IDI7ICsraWkpCi0gICAgYSArPSBpaTsKLSAgcmV0dXJuIGE7Ci19Ci0KLWludCBjaGlsZDIoKQotewotICBpbnQgYSA9IDA7Ci0KLSAgaW50IGlpOwotICBmb3IgKGlpID0gMDsgaWkgPCA0OyArK2lpKQotICAgIGEgKz0gaWk7Ci0gIHJldHVybiBhOwotfQotCi1pbnQgY2hpbGQzKCkKLXsKLSAgaW50IGEgPSAwOwotCi0gIGludCBpaTsKLSAgZm9yIChpaSA9IDA7IGlpIDwgNjsgKytpaSkKLSAgICBhICs9IGlpOwotICByZXR1cm4gYTsKLX0KLQotaW50IGNoaWxkNCgpCi17Ci0gIGludCBhID0gMDsKLQotICBpbnQgaWk7Ci0gIGZvciAoaWkgPSAwOyBpaSA8IDg7ICsraWkpCi0gICAgYSArPSBpaTsKLSAgcmV0dXJuIGE7Ci19Ci0KLWludCBjaGlsZDUoKQotewotICBpbnQgYSA9IDA7Ci0KLSAgaW50IGlpOwotICBmb3IgKGlpID0gMDsgaWkgPCAxMDsgKytpaSkKLSAgICBhICs9IGlpOwotICByZXR1cm4gYTsKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy9tYWNyb3MuaCBiL2VtdWxhdG9yL3F0b29scy90ZXN0cy9tYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2Mzc0Yi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvdGVzdHMvbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jaWZuZGVmIF9URVNUX1RSQUNFX0NfSF8KLSNkZWZpbmUgX1RFU1RfVFJBQ0VfQ19IXwotCi0vKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRyYWNlIGRldmljZSAqLwotI2RlZmluZSBUUkFDRV9ERVZfQkFTRV9BRERSICAgICAgICAgICAgIDB4MjEwMDAwMDAKLQotLyp0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIG9mIHRoZSB0cmFjZSBkZXZpY2UgKi8KLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19TV0lUQ0ggICAgICAgICAgICAwCi0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfRk9SSyAgICAgICAgICAgICAgMQotI2RlZmluZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9QSUQgICAgICAgIDIKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19FWEVDVkVfVk1TVEFSVCAgICAzCi0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX1ZNRU5EICAgICAgNAotI2RlZmluZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9PRkZTRVQgICAgIDUKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19FWEVDVkVfRVhFUEFUSCAgICA2Ci0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfRVhJVCAgICAgICAgICAgICAgNwotI2RlZmluZSBUUkFDRV9ERVZfUkVHX0NNRExJTkUgICAgICAgICAgIDgKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19DTURMSU5FX0xFTiAgICAgICA5Ci0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfTU1BUF9FWEVQQVRIICAgICAgMTAKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19JTklUX1BJRCAgICAgICAgICAxMQotI2RlZmluZSBUUkFDRV9ERVZfUkVHX0lOSVRfTkFNRSAgICAgICAgIDEyCi0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfQ0xPTkUgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19EWU5fU1lNICAgICAgICAgICA1MAotI2RlZmluZSBUUkFDRV9ERVZfUkVHX0RZTl9TWU1fQUREUiAgICAgIDUxCi0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfUFJJTlRfU1RSICAgICAgICAgNjAKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19QUklOVF9OVU1fREVDICAgICA2MQotI2RlZmluZSBUUkFDRV9ERVZfUkVHX1BSSU5UX05VTV9IRVggICAgIDYyCi0jZGVmaW5lIFRSQUNFX0RFVl9SRUdfU1RPUF9FTVUgICAgICAgICAgOTAKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19FTkFCTEUgICAgICAgICAgICAxMDAKLSNkZWZpbmUgVFJBQ0VfREVWX1JFR19ESVNBQkxFICAgICAgICAgICAxMDEKLQotLyogd3JpdGUgYSB3b3JkIHRvIGEgdHJhY2UgZGV2aWNlIHJlZ2lzdGVyICovCi0jZGVmaW5lIERFVl9XUklURV9XT1JEKGFkZHIsdmFsdWUpXAotICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoVFJBQ0VfREVWX0JBU0VfQUREUiArICgoYWRkcikgPDwgMikpID0gKHZhbHVlKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBnZW5lcmF0ZXMgdGVzdCBldmVudHMgKi8KLQotLyogY29udGV4dCBzd2l0Y2ggKi8KLSNkZWZpbmUgVFJBQ0VfU1dJVENIKHBpZCkgICAgICAgICAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX1NXSVRDSCwgKHBpZCkpCi0vKiBmb3JrICovCi0jZGVmaW5lIFRSQUNFX0ZPUksocGlkKSAgICAgICAgICAgICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19GT1JLLCAocGlkKSkKLS8qIGNsb25lICovCi0jZGVmaW5lIFRSQUNFX0NMT05FKHBpZCkgICAgICAgICAgICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19DTE9ORSwgKHBpZCkpCi0vKiBkdW1wIG5hbWUgYW5kIHBhdGggb2YgdGhyZWFkcyBleGVjdXRlZCBiZWZvcmUgdHJhY2UgZGV2aWNlIGNyZWF0ZWQgKi8KLSNkZWZpbmUgVFJBQ0VfSU5JVF9OQU1FKHBpZCxwYXRoKVwKLWRvIHtcCi0gICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19JTklUX1BJRCwgKHBpZCkpO1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0lOSVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpKHBhdGgpKTtcCi19d2hpbGUoMCkKLS8qIGR1bXAgZXhlYyBtYXBwaW5nIG9mIHRocmVhZHMgZXhlY3V0ZWQgYmVmb3JlIHRyYWNlIGRldmljZSBjcmVhdGVkICovCi0jZGVmaW5lIFRSQUNFX0lOSVRfRVhFQyh2c3RhcnQsdmVuZCxlb2ZmLHBhdGgpXAotZG8ge1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0VYRUNWRV9WTVNUQVJULCAodnN0YXJ0KSk7XAotICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX1ZNRU5ELCAodmVuZCkpO1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0VYRUNWRV9PRkZTRVQsIChlb2ZmKSk7XAotICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX0VYRVBBVEgsICh1bnNpZ25lZCBsb25nKShwYXRoKSk7XAotfXdoaWxlKDApCi0vKiBtbWFwICovCi0jZGVmaW5lIFRSQUNFX01NQVAodnN0YXJ0LHZlbmQsZW9mZixwYXRoKVwKLWRvIHtcCi0gICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19FWEVDVkVfVk1TVEFSVCwgKHZzdGFydCkpO1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0VYRUNWRV9WTUVORCwgKHZlbmQpKTtcCi0gICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19FWEVDVkVfT0ZGU0VULCAoZW9mZikpO1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX01NQVBfRVhFUEFUSCwgKHVuc2lnbmVkIGxvbmcpKHBhdGgpKTtcCi19d2hpbGUoMCkKLS8qIGV4ZWN2ZSAqLwotI2RlZmluZSBUUkFDRV9FWEVDVkUoY21kbGVuLGNtZClcCi1kbyB7XAotICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfQ01ETElORV9MRU4sIChjbWRsZW4pKTtcCi0gICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19DTURMSU5FLCAodW5zaWduZWQgbG9uZykoY21kKSk7XAotfXdoaWxlKDApCi0vKiBleGl0ICovCi0jZGVmaW5lIFRSQUNFX0VYSVQocmV0dikgICAgICAgICAgICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19FWElULCAocmV0dikpCi0KLS8qIG90aGVyIGNvbW1hbmRzICovCi0KLS8qIHN0b3AgZW11bGF0aW9uICovCi0jZGVmaW5lIFRSQUNFX1NUT1BfRU1VKCkgICAgICAgICAgICAgREVWX1dSSVRFX1dPUkQoVFJBQ0VfREVWX1JFR19TVE9QX0VNVSwgMSkKLS8qIGVuYWJsZS9kaXNhYmxlIHRyYWNpbmcgKi8KLSNkZWZpbmUgVFJBQ0VfRU5BQkxFX1RSQUNJTkcoKSAgICAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0VOQUJMRSwgMSkKLSNkZWZpbmUgVFJBQ0VfRElTQUJMRV9UUkFDSU5HKCkgICAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0RJU0FCTEUsIDEpCi0vKiBkeW5hbWljIHN5bWJvbHMgKi8KLSNkZWZpbmUgVFJBQ0VfRFlOX1NZTShhZGRyLHN5bSlcCi1kbyB7XAotICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfRFlOX1NZTV9BRERSLCAoYWRkcikpO1wKLSAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX0RZTl9TWU0sICh1bnNpZ25lZCBsb25nKShzeW0pKTtcCi19d2hpbGUoMCkKLS8qIHByaW50cyAqLwotI2RlZmluZSBQUklOVF9TVFIoc3RyKSAgICAgICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfUFJJTlRfU1RSLCAodW5zaWduZWQgbG9uZykoc3RyKSkKLSNkZWZpbmUgUFJJTlRfTlVNX0RFQyhudW0pICAgICBERVZfV1JJVEVfV09SRChUUkFDRV9ERVZfUkVHX1BSSU5UX05VTV9ERUMsIChudW0pKQotI2RlZmluZSBQUklOVF9OVU1fSEVYKG51bSkgICAgIERFVl9XUklURV9XT1JEKFRSQUNFX0RFVl9SRUdfUFJJTlRfTlVNX0hFWCwgKG51bSkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL3Rlc3RzLmxkIGIvZW11bGF0b3IvcXRvb2xzL3Rlc3RzL3Rlc3RzLmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZlNDFiLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3F0b29scy90ZXN0cy90ZXN0cy5sZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgVEVYVF9TVEFSVCA9IDB4MDAwMTAwMDAgOwotICBEQVRBX1NUQVJUID0gMHgwMDIwMDAwMCA7Ci0gIGhhbmRsZXJzIDB4MCA6IHsgKihoYW5kbGVycykgfQotICAudGV4dCBURVhUX1NUQVJUIDogeyAqKC50ZXh0KSB9Ci0gIC5kYXRhIERBVEFfU1RBUlQgOiB7ICooLmRhdGEpIH0KLSAgLmJzcyAgOiB7ICooLmJzcykgKihDT01NT04pIH0KLSAgcDAwMzAwMDAwIDB4MDAzMDAwMDAgOiB7ICoocDAwMzAwMDAwKSB9Ci0gIHAwMDQwMDAwMCAweDAwNDAwMDAwIDogeyAqKHAwMDQwMDAwMCkgfQotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3RodW1iZGlzLmNwcCBiL2VtdWxhdG9yL3F0b29scy90aHVtYmRpcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzQ4MmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3RodW1iZGlzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgTW9kaWZpY2F0aW9uIGJ5IEphbWVzIEcuIFNtaXRoIChqc21pdGhAY3lnbnVzLmNvLnVrKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJvcGNvZGVzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4gCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi1tb3JlIGRldGFpbHMuIAotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBNb2RpZmllZCB0byBmaXQgaW50byB0aGUgcXRvb2xzIGZyYW1ld29yay4gIFRoZSBtYWluIGRpZmZlcmVuY2VzIGFyZToKLSAqCi0gKiAtIFRoZSBkaXNhc3NlbWJseSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGluc3RlYWQgb2Ygd3JpdGluZyBpdCB0byBhCi0gKiBmaWxlIHN0cmVhbS4KLSAqCi0gKiAtIEFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc3RydWN0ICJkaXNhc3NlbWJsZV9pbmZvIiBoYXZlIGJlZW4gcmVtb3ZlZC4KLSAqCi0gKiAtIEEgc2V0IG9mIGVudW1zIGZvciB0aGUgdGh1bWIgb3Bjb2RlcyBoYXZlIGJlZW4gZGVmaW5lZCwgYWxvbmcgd2l0aCBhCi0gKiAiZGVjb2RlKCkiIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIHRodW1iIGluc3RydWN0aW9uIHRvIGFuIG9wY29kZSBlbnVtLgotICoKLSAqIC0gRWxpbWluYXRlZCB1c2VzIG9mIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgJywgYCwgYW5kID8gZnJvbSB0aGUKLSAqIHRodW1iX29wY29kZXNbXSB0YWJsZSBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgc3BlY2lmeSBzZXBhcmF0ZSBvcGNvZGVzCi0gKiBmb3IgZGlzdGluY3QgaW5zdHJ1Y3Rpb25zLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAib3Bjb2RlLmgiCi0KLQotc3RydWN0IHRodW1iX29wY29kZQotewotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBtYXNrOyAgLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgICBPcGNvZGUgb3Bjb2RlOwotICAgIGNvbnN0IGNoYXIgKiBhc3NlbWJsZXI7ICAgICAgLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlICAgICAgICAgICAgICAgICAgICUKLSAgICU8Yml0ZmllbGQ+ZCAgICAgICAgIHByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPnggICAgICAgICBwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPlggICAgICAgICBwcmludCB0aGUgYml0ZmllbGQgYXMgMSBoZXggZGlnaXQgd2l0aG91dCBsZWFkaW5nICIweCIKLSAgICU8Yml0ZmllbGQ+ciAgICAgICAgIHByaW50IGFzIGFuIEFSTSByZWdpc3RlcgotICAgJTxiaXRmaWVsZD5mICAgICAgICAgcHJpbnQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpZiA+NyBlbHNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIKLSAgICU8Y29kZT55ICAgICAgICAgICAgIHByaW50IGEgc2luZ2xlIHByZWNpc2lvbiBWRlAgcmVnLgotICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlczogMD0+U20sIDE9PlNkLCAyPT5TbiwgMz0+bXVsdGktbGlzdCwgND0+U20gcGFpcgotICAgJTxjb2RlPnogICAgICAgICAgICAgcHJpbnQgYSBkb3VibGUgcHJlY2lzaW9uIFZGUCByZWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZXM6IDA9PkRtLCAxPT5EZCwgMj0+RG4sIDM9Pm11bHRpLWxpc3QKLSAgICVjICAgICAgICAgICAgICAgICAgIHByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKLSAgICVQICAgICAgICAgICAgICAgICAgIHByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRICAgICAgICAgICAgICAgICAgIHByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBsZGYvc3RmIGluc24KLSAgICVSICAgICAgICAgICAgICAgICAgIHByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKLSAgICU8Yml0bnVtPidjICAgICAgICAgIHByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCi0gICAlPGJpdG51bT5gYyAgICAgICAgICBwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYiAgICAgICAgIHByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIKLSAgICVwICAgICAgICAgICAgICAgICAgIHByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKLSAgICV0ICAgICAgICAgICAgICAgICAgIHByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCi0gICAlbyAgICAgICAgICAgICAgICAgICBwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYSAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KLSAgICViICAgICAgICAgICAgICAgICAgIHByaW50IGJyYW5jaCBkZXN0aW5hdGlvbgotICAgJUIgICAgICAgICAgICAgICAgICAgcHJpbnQgYXJtIEJMWCgxKSBkZXN0aW5hdGlvbgotICAgJUEgICAgICAgICAgICAgICAgICAgcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbSAgICAgICAgICAgICAgICAgICBwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gICAlQyAgICAgICAgICAgICAgICAgICBwcmludCB0aGUgUFNSIHN1YiB0eXBlLgotICAgJUYgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhlIENPVU5UIGZpZWxkIG9mIGEgTEZNL1NGTSBpbnN0cnVjdGlvbi4KLVRodW1iIHNwZWNpZmljIGZvcm1hdCBvcHRpb25zOgotICAgJUQgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMC4uMiBhcyBoaWdoIG51bWJlciBpZiBiaXQgNyBzZXQpCi0gICAlUyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciAoYml0cyAzLi41IGFzIGhpZ2ggbnVtYmVyIGlmIGJpdCA2IHNldCkKLSAgICU8Yml0ZmllbGQ+SSAgICAgICAgIHByaW50IGJpdGZpZWxkIGFzIGEgc2lnbmVkIGRlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQotICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzawotICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKLSAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCi0gICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKLSAgICVJICAgICAgICAgICAgICAgICAgIHByaW50IGNpcnJ1cyBzaWduZWQgc2hpZnQgaW1tZWRpYXRlOiBiaXRzIDAuLjN8NC4uNgotICAgJTxiaXRmaWVsZD5CICAgICAgICAgcHJpbnQgVGh1bWIgYnJhbmNoIGRlc3RpbmF0aW9uIChzaWduZWQgZGlzcGxhY2VtZW50KQotICAgJTxiaXRmaWVsZD5XICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogNCkgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPkggICAgICAgICBwcmludCAoYml0ZmllbGQgKiAyKSBhcyBhIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+YSAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgcGMtcmVsIG9mZnNldCArIGRlY29kZWQgc3ltYm9sCi0qLwotCi0KLXN0YXRpYyBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRodW1iX29wY29kZXNbXSA9Ci17Ci0gICAgLyogVGh1bWIgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotICAgIC8qIEFSTSBWNSBJU0EgZXh0ZW5kcyBUaHVtYi4gICovCi0gICAgezB4YmUwMCwgMHhmZjAwLCBPUF9USFVNQl9CS1BULCAiYmtwdFx0JTAtN3gifSwKLSAgICB7MHg0NzgwLCAweGZmODcsIE9QX1RIVU1CX0JMWCwgImJseFx0JTMtNnIifSwgIC8qIG5vdGU6IDQgYml0IHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgLyogRm9ybWF0IDUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1cGRhdGUgdGhlIFBTUi4gICovCi0gICAgezB4MUMwMCwgMHhGRkMwLCBPUF9USFVNQl9NT1YsICJtb3ZcdCUwLTJyLCAlMy01ciJ9LAotICAgIC8qIEZvcm1hdCA0LiAgKi8KLSAgICB7MHg0MDAwLCAweEZGQzAsIE9QX1RIVU1CX0FORCwgImFuZFx0JTAtMnIsICUzLTVyIn0sCi0gICAgezB4NDA0MCwgMHhGRkMwLCBPUF9USFVNQl9FT1IsICJlb3JcdCUwLTJyLCAlMy01ciJ9LAotICAgIHsweDQwODAsIDB4RkZDMCwgT1BfVEhVTUJfTFNMLCAibHNsXHQlMC0yciwgJTMtNXIifSwKLSAgICB7MHg0MEMwLCAweEZGQzAsIE9QX1RIVU1CX0xTUiwgImxzclx0JTAtMnIsICUzLTVyIn0sCi0gICAgezB4NDEwMCwgMHhGRkMwLCBPUF9USFVNQl9BU1IsICJhc3JcdCUwLTJyLCAlMy01ciJ9LAotICAgIHsweDQxNDAsIDB4RkZDMCwgT1BfVEhVTUJfQURDLCAiYWRjXHQlMC0yciwgJTMtNXIifSwKLSAgICB7MHg0MTgwLCAweEZGQzAsIE9QX1RIVU1CX1NCQywgInNiY1x0JTAtMnIsICUzLTVyIn0sCi0gICAgezB4NDFDMCwgMHhGRkMwLCBPUF9USFVNQl9ST1IsICJyb3JcdCUwLTJyLCAlMy01ciJ9LAotICAgIHsweDQyMDAsIDB4RkZDMCwgT1BfVEhVTUJfVFNULCAidHN0XHQlMC0yciwgJTMtNXIifSwKLSAgICB7MHg0MjQwLCAweEZGQzAsIE9QX1RIVU1CX05FRywgIm5lZ1x0JTAtMnIsICUzLTVyIn0sCi0gICAgezB4NDI4MCwgMHhGRkMwLCBPUF9USFVNQl9DTVAsICJjbXBcdCUwLTJyLCAlMy01ciJ9LAotICAgIHsweDQyQzAsIDB4RkZDMCwgT1BfVEhVTUJfQ01OLCAiY21uXHQlMC0yciwgJTMtNXIifSwKLSAgICB7MHg0MzAwLCAweEZGQzAsIE9QX1RIVU1CX09SUiwgIm9yclx0JTAtMnIsICUzLTVyIn0sCi0gICAgezB4NDM0MCwgMHhGRkMwLCBPUF9USFVNQl9NVUwsICJtdWxcdCUwLTJyLCAlMy01ciJ9LAotICAgIHsweDQzODAsIDB4RkZDMCwgT1BfVEhVTUJfQklDLCAiYmljXHQlMC0yciwgJTMtNXIifSwKLSAgICB7MHg0M0MwLCAweEZGQzAsIE9QX1RIVU1CX01WTiwgIm12blx0JTAtMnIsICUzLTVyIn0sCi0gICAgLyogZm9ybWF0IDEzICovCi0gICAgezB4QjAwMCwgMHhGRjgwLCBPUF9USFVNQl9BREQsICJhZGRcdHNwLCAjJTAtNlcifSwKLSAgICB7MHhCMDgwLCAweEZGODAsIE9QX1RIVU1CX1NVQiwgInN1Ylx0c3AsICMlMC02VyJ9LAotICAgIC8qIGZvcm1hdCA1ICovCi0gICAgezB4NDcwMCwgMHhGRjgwLCBPUF9USFVNQl9CWCwgImJ4XHQlUyJ9LAotICAgIHsweDQ0MDAsIDB4RkYwMCwgT1BfVEhVTUJfQURELCAiYWRkXHQlRCwgJVMifSwKLSAgICB7MHg0NTAwLCAweEZGMDAsIE9QX1RIVU1CX0NNUCwgImNtcFx0JUQsICVTIn0sCi0gICAgezB4NDYwMCwgMHhGRjAwLCBPUF9USFVNQl9NT1YsICJtb3ZcdCVELCAlUyJ9LAotICAgIC8qIGZvcm1hdCAxNCAqLwotICAgIHsweEI0MDAsIDB4RkUwMCwgT1BfVEhVTUJfUFVTSCwgInB1c2hcdCVOIn0sCi0gICAgezB4QkMwMCwgMHhGRTAwLCBPUF9USFVNQl9QT1AsICJwb3BcdCVPIn0sCi0gICAgLyogZm9ybWF0IDIgKi8KLSAgICB7MHgxODAwLCAweEZFMDAsIE9QX1RIVU1CX0FERCwgImFkZFx0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAotICAgIHsweDFBMDAsIDB4RkUwMCwgT1BfVEhVTUJfU1VCLCAic3ViXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gICAgezB4MUMwMCwgMHhGRTAwLCBPUF9USFVNQl9BREQsICJhZGRcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCi0gICAgezB4MUUwMCwgMHhGRTAwLCBPUF9USFVNQl9TVUIsICJzdWJcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCi0gICAgLyogZm9ybWF0IDggKi8KLSAgICB7MHg1MjAwLCAweEZFMDAsIE9QX1RIVU1CX1NUUkgsICJzdHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgICB7MHg1QTAwLCAweEZFMDAsIE9QX1RIVU1CX0xEUkgsICJsZHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgICB7MHg1NjAwLCAweEZFMDAsIE9QX1RIVU1CX0xEUlNCLCAibGRyc2JcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAgIHsweDVFMDAsIDB4RkUwMCwgT1BfVEhVTUJfTERSU0gsICJsZHJzaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gICAgLyogZm9ybWF0IDcgKi8KLSAgICB7MHg1MDAwLCAweEZFMDAsIE9QX1RIVU1CX1NUUiwgInN0clx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gICAgezB4NTQwMCwgMHhGRTAwLCBPUF9USFVNQl9TVFJCLCAic3RyYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gICAgezB4NTgwMCwgMHhGRTAwLCBPUF9USFVNQl9MRFIsICJsZHJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAgIHsweDVDMDAsIDB4RkUwMCwgT1BfVEhVTUJfTERSQiwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAgIC8qIGZvcm1hdCAxICovCi0gICAgezB4MDAwMCwgMHhGODAwLCBPUF9USFVNQl9MU0wsICJsc2xcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICAgIHsweDA4MDAsIDB4RjgwMCwgT1BfVEhVTUJfTFNSLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgICB7MHgxMDAwLCAweEY4MDAsIE9QX1RIVU1CX0FTUiwgImFzclx0JTAtMnIsICUzLTVyLCAjJTYtMTBkIn0sCi0gICAgLyogZm9ybWF0IDMgKi8KLSAgICB7MHgyMDAwLCAweEY4MDAsIE9QX1RIVU1CX01PViwgIm1vdlx0JTgtMTByLCAjJTAtN2QifSwKLSAgICB7MHgyODAwLCAweEY4MDAsIE9QX1RIVU1CX0NNUCwgImNtcFx0JTgtMTByLCAjJTAtN2QifSwKLSAgICB7MHgzMDAwLCAweEY4MDAsIE9QX1RIVU1CX0FERCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKLSAgICB7MHgzODAwLCAweEY4MDAsIE9QX1RIVU1CX1NVQiwgInN1Ylx0JTgtMTByLCAjJTAtN2QifSwKLSAgICAvKiBmb3JtYXQgNiAqLwotICAgIC8qIFRPRE86IERpc2Fzc2VtYmxlIFBDIHJlbGF0aXZlICJMRFIgckQsPTxzeW1ib2xpYz4iICovCi0gICAgezB4NDgwMCwgMHhGODAwLCBPUF9USFVNQl9MRFIsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sCi0gICAgLyogZm9ybWF0IDkgKi8KLSAgICB7MHg2MDAwLCAweEY4MDAsIE9QX1RIVU1CX1NUUiwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgICB7MHg2ODAwLCAweEY4MDAsIE9QX1RIVU1CX0xEUiwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgICB7MHg3MDAwLCAweEY4MDAsIE9QX1RIVU1CX1NUUkIsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAgIHsweDc4MDAsIDB4RjgwMCwgT1BfVEhVTUJfTERSQiwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gICAgLyogZm9ybWF0IDEwICovCi0gICAgezB4ODAwMCwgMHhGODAwLCBPUF9USFVNQl9TVFJILCAic3RyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgICB7MHg4ODAwLCAweEY4MDAsIE9QX1RIVU1CX0xEUkgsICJsZHJoXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBIXSJ9LAotICAgIC8qIGZvcm1hdCAxMSAqLwotICAgIHsweDkwMDAsIDB4RjgwMCwgT1BfVEhVTUJfU1RSLCAic3RyXHQlOC0xMHIsIFtzcCwgIyUwLTdXXSJ9LAotICAgIHsweDk4MDAsIDB4RjgwMCwgT1BfVEhVTUJfTERSLCAibGRyXHQlOC0xMHIsIFtzcCwgIyUwLTdXXSJ9LAotICAgIC8qIGZvcm1hdCAxMiAqLwotICAgIHsweEEwMDAsIDB4RjgwMCwgT1BfVEhVTUJfQURELCAiYWRkXHQlOC0xMHIsIHBjLCAjJTAtN1dcdChhZHIgJTgtMTByLCUwLTdhKSJ9LAotICAgIHsweEE4MDAsIDB4RjgwMCwgT1BfVEhVTUJfQURELCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKLSAgICAvKiBmb3JtYXQgMTUgKi8KLSAgICB7MHhDMDAwLCAweEY4MDAsIE9QX1RIVU1CX1NUTUlBLCAic3RtaWFcdCU4LTEwciEsJU0ifSwKLSAgICB7MHhDODAwLCAweEY4MDAsIE9QX1RIVU1CX0xETUlBLCAibGRtaWFcdCU4LTEwciEsJU0ifSwKLSAgICAvKiBmb3JtYXQgMTggKi8KLSAgICB7MHhFMDAwLCAweEY4MDAsIE9QX1RIVU1CX0IsICJiXHQlMC0xMEIifSwKLSAgICAvKiBmb3JtYXQgMTkgKi8KLSAgICAvKiBzcGVjaWFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgaW4gZGlzYXNzZW1ibGVyICovCi0gICAgezB4RjAwMCwgMHhGODAwLCBPUF9USFVNQl9CTCwgIiJ9LAotICAgIHsweEY4MDAsIDB4RjgwMCwgT1BfVEhVTUJfQkwsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgICB7MHhFODAwLCAweEY4MDAsIE9QX1RIVU1CX0JMWCwgInNlY29uZCBoYWxmIG9mIEJMWCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgICAvKiBmb3JtYXQgMTYgKi8KLSAgICB7MHhEMDAwLCAweEZGMDAsIE9QX1RIVU1CX0IsICJiZXFcdCUwLTdCIn0sCi0gICAgezB4RDEwMCwgMHhGRjAwLCBPUF9USFVNQl9CLCAiYm5lXHQlMC03QiJ9LAotICAgIHsweEQyMDAsIDB4RkYwMCwgT1BfVEhVTUJfQiwgImJjc1x0JTAtN0IifSwKLSAgICB7MHhEMzAwLCAweEZGMDAsIE9QX1RIVU1CX0IsICJiY2NcdCUwLTdCIn0sCi0gICAgezB4RDQwMCwgMHhGRjAwLCBPUF9USFVNQl9CLCAiYm1pXHQlMC03QiJ9LAotICAgIHsweEQ1MDAsIDB4RkYwMCwgT1BfVEhVTUJfQiwgImJwbFx0JTAtN0IifSwKLSAgICB7MHhENjAwLCAweEZGMDAsIE9QX1RIVU1CX0IsICJidnNcdCUwLTdCIn0sCi0gICAgezB4RDcwMCwgMHhGRjAwLCBPUF9USFVNQl9CLCAiYnZjXHQlMC03QiJ9LAotICAgIHsweEQ4MDAsIDB4RkYwMCwgT1BfVEhVTUJfQiwgImJoaVx0JTAtN0IifSwKLSAgICB7MHhEOTAwLCAweEZGMDAsIE9QX1RIVU1CX0IsICJibHNcdCUwLTdCIn0sCi0gICAgezB4REEwMCwgMHhGRjAwLCBPUF9USFVNQl9CLCAiYmdlXHQlMC03QiJ9LAotICAgIHsweERCMDAsIDB4RkYwMCwgT1BfVEhVTUJfQiwgImJsdFx0JTAtN0IifSwKLSAgICB7MHhEQzAwLCAweEZGMDAsIE9QX1RIVU1CX0IsICJiZ3RcdCUwLTdCIn0sCi0gICAgezB4REQwMCwgMHhGRjAwLCBPUF9USFVNQl9CLCAiYmxlXHQlMC03QiJ9LAotICAgIC8qIGZvcm1hdCAxNyAqLwotICAgIHsweERFMDAsIDB4RkYwMCwgT1BfVEhVTUJfVU5ERUZJTkVELCAidW5kZWZpbmVkIn0sCi0gICAgezB4REYwMCwgMHhGRjAwLCBPUF9USFVNQl9TV0ksICJzd2lcdCUwLTdkIn0sCi0gICAgLyogZm9ybWF0IDkgKi8KLSAgICB7MHg2MDAwLCAweEY4MDAsIE9QX1RIVU1CX1NUUiwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgICB7MHg2ODAwLCAweEY4MDAsIE9QX1RIVU1CX0xEUiwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgICB7MHg3MDAwLCAweEY4MDAsIE9QX1RIVU1CX1NUUkIsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAgIHsweDc4MDAsIDB4RjgwMCwgT1BfVEhVTUJfTERSQiwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gICAgLyogdGhlIHJlc3QgKi8KLSAgICB7MHgwMDAwLCAweDAwMDAsIE9QX1RIVU1CX1VOREVGSU5FRCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgICB7MHgwMDAwLCAweDAwMDAsIE9QX0VORCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AyMyh4LHkpICgoKCgoKHgpICYgMHgwN2ZmKSA8PCAxMSkgfCAoKHkpICYgMHgwN2ZmKSkgXAotICAgICAgICAgICAgICAgICAgICAgXiAweDIwMDAwMCkgLSAweDIwMDAwMCkgLyogMjNiaXQgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBhcm1fY29uZGl0aW9uYWxbXSA9Ci17ImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwgInBsIiwgInZzIiwgInZjIiwKLSAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAiIiwgIm52In07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBjb25zdCBjaGFyICogZGVzY3JpcHRpb247Ci0gIGNvbnN0IGNoYXIgKiByZWdfbmFtZXNbMTZdOwotfQotYXJtX3JlZ25hbWU7Ci0KLXN0YXRpYyBhcm1fcmVnbmFtZSByZWduYW1lc1tdID0KLXsKLSAgeyAicmF3IiAsICJTZWxlY3QgcmF3IHJlZ2lzdGVyIG5hbWVzIiwKLSAgICB7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSJ9fSwKLSAgeyAiZ2NjIiwgICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBieSBHQ0MiLAotICAgIHsgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwgInNsIiwgICJmcCIsICAiaXAiLCAgInNwIiwgICJsciIsICAicGMiIH19LAotICB7ICJzdGQiLCAgIlNlbGVjdCByZWdpc3RlciBuYW1lcyB1c2VkIGluIEFSTSdzIElTQSBkb2N1bWVudGF0aW9uIiwKLSAgICB7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJzcCIsICAibHIiLCAgInBjIiB9fSwKLSAgeyAiYXBjcyIsICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiB0aGUgQVBDUyIsCi0gICAgeyAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAidjEiLCAidjIiLCAidjMiLCAidjQiLCAidjUiLCAidjYiLCAic2wiLCAgImZwIiwgICJpcCIsICAic3AiLCAgImxyIiwgICJwYyIgfX0sCi0gIHsgImF0cGNzIiwgIlNlbGVjdCByZWdpc3RlciBuYW1lcyB1c2VkIGluIHRoZSBBVFBDUyIsCi0gICAgeyAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAidjEiLCAidjIiLCAidjMiLCAidjQiLCAidjUiLCAidjYiLCAidjciLCAgInY4IiwgICJJUCIsICAiU1AiLCAgIkxSIiwgICJQQyIgfX0sCi0gIHsgInNwZWNpYWwtYXRwY3MiLCAiU2VsZWN0IHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiB0aGUgQVRQQ1MiLAotICAgIHsgImExIiwgImEyIiwgImEzIiwgImE0IiwgInYxIiwgInYyIiwgInYzIiwgIldSIiwgInY1IiwgIlNCIiwgIlNMIiwgICJGUCIsICAiSVAiLCAgIlNQIiwgICJMUiIsICAiUEMiIH19Ci19OwotCi0vKiBEZWZhdWx0IHRvIFNURCByZWdpc3RlciBuYW1lIHNldC4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJlZ25hbWVfc2VsZWN0ZWQgPSAyOwotCi0jZGVmaW5lIE5VTV9BUk1fUkVHTkFNRVMgIE5VTV9FTEVNIChyZWduYW1lcykKLSNkZWZpbmUgYXJtX3JlZ25hbWVzICAgICAgcmVnbmFtZXNbcmVnbmFtZV9zZWxlY3RlZF0ucmVnX25hbWVzCi0KLU9wY29kZSBkZWNvZGVfaW5zbl90aHVtYih1aW50MzJfdCBnaXZlbikKLXsKLSAgICBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogaW5zbjsKLQotICAgIGZvciAoaW5zbiA9IHRodW1iX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKSB7Ci0gICAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLSAgICAgICAgICAgIHJldHVybiBpbnNuLT5vcGNvZGU7Ci0gICAgfQotICAgIHJldHVybiBPUF9USFVNQl9VTkRFRklORUQ7Ci19Ci0KLS8vIEdlbmVyYXRlcyB0aGUgZGlzYXNzZW1ibHkgc3RyaW5nIGZvciB0aGUgdGh1bWIgaW5zdHJ1Y3Rpb24gImluc24xIi4KLS8vIElmICJpbnNuMSIgaXMgYSBCTCBvciBCTFggaW5zdHJ1Y3Rpb24gdGhhdCBpcyB0aGUgZmlyc3Qgb2YgdHdvIFRodW1iCi0vLyBpbnN0cnVjdGlvbnMsIHRoZW4gaW5zbjIgaXMgdGhlIHNlY29uZCBvZiB0d28gaW5zdHJ1Y3Rpb25zLiAgT3RoZXJ3aXNlLAotLy8gaW5zbjIgaXMgaWdub3JlZC4KLWNoYXIgKmRpc2FzbV9pbnNuX3RodW1iKHVpbnQzMl90IHBjLCB1aW50MzJfdCBpbnNuMSwgdWludDMyX3QgaW5zbjIsIGNoYXIgKnJlc3VsdCkKLXsKLSAgICBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogaW5zbjsKLSAgICBzdGF0aWMgY2hhciBidWZbODBdOwotICAgIGNoYXIgKnB0cjsKLSAgICB1aW50MzJfdCBhZGRyOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJlc3VsdCA9IGJ1ZjsKLSAgICBwdHIgPSByZXN1bHQ7Ci0KLSAgICBmb3IgKGluc24gPSB0aHVtYl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykgewotICAgICAgICBpZiAoKGluc24xICYgaW5zbi0+bWFzaykgIT0gaW5zbi0+dmFsdWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBjb25zdCBjaGFyICogYyA9IGluc24tPmFzc2VtYmxlcjsKLQotICAgICAgICAvKiBTcGVjaWFsIHByb2Nlc3NpbmcgZm9yIFRodW1iIDItaW5zdHJ1Y3Rpb24gQkwgc2VxdWVuY2U6ICAqLwotICAgICAgICBpZiAoISpjKSB7IC8qIENoZWNrIGZvciBlbXB0eSAobm90IE5VTEwpIGFzc2VtYmxlciBzdHJpbmcuICAqLwotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OwotCi0gICAgICAgICAgICBvZmZzZXQgPSBCRElTUDIzIChpbnNuMSwgaW5zbjIpOwotICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICogMiArIHBjICsgNDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKChpbnNuMiAmIDB4MTAwMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiYmx4XHQiKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgJj0gMHhmZmZmZmZmYzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICJibFx0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdHIgKz0gbGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzcHJpbnRmKHB0ciwgIjB4JXgiLCBvZmZzZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW5zbjEgJj0gMHhmZmZmOwotICAgICAgICAKLSAgICAgICAgZm9yICg7ICpjOyBjKyspIHsKLSAgICAgICAgICAgIGlmICgqYyAhPSAnJScpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBkb21hc2twYyA9IDA7Ci0gICAgICAgICAgICBpbnQgZG9tYXNrbHIgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzd2l0Y2ggKCorK2MpIHsKLSAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlJSIpOwotICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAnUyc6IHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVnID0gKGluc24xID4+IDMpICYgMHg3OwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbjEgJiAoMSA8PCA2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlICdEJzogewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWc7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZWcgPSBpbnNuMSAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluc24xICYgKDEgPDwgNykpCi0gICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fY29uZGl0aW9uYWwgWyhpbnNuMSA+PiA4KSAmIDB4Zl0pOwotICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnNuMSAmICgxIDw8IDgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZG9tYXNrbHIgPSAxOwotICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChpbnNuMSAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza3BjID0gMTsKLSAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICAgICAgICAgICAgICBjYXNlICdNJzogewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWc7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgInsiKTsKLSAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgc3BvdAotICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKHJlZyA9IDA7IChyZWcgPCA4KTsgcmVnKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24xICYgKDEgPDwgcmVnKSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza2xyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgYXJtX3JlZ25hbWVzWzE0XSAvKiAibHIiICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkb21hc2twYykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCBhcm1fcmVnbmFtZXNbMTVdIC8qICJwYyIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICJ9Iik7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiAKLSAgICAgICAgICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJpdGVuZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGluc24xID4+IGJpdHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgIiVkIiwgcmVnIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKHB0ciwgIiVkIiwgcmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQy1yZWxhdGl2ZSBhZGRyZXNzIC0tIHRoZSBib3R0b20gdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSBkcm9wcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGNhbGN1bGF0aW9uLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAoKHBjICsgNCkgJiB+MykgKyAocmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIweCV4IiwgYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYocHRyLCAiMHglMDR4IiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKChyZWcgXiAoMSA8PCBiaXRlbmQpKSAtICgxIDw8IGJpdGVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlZCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9ICgocmVnIF4gKDEgPDwgYml0ZW5kKSkgLSAoMSA8PCBiaXRlbmQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSByZWcgKiAyICsgcGMgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIweCV4IiwgYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW5zbjEgJiAoMSA8PCBiaXRzdGFydCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuMSAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlYyIsICpjKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihwdHIsICIlYyIsICorK2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyogTm8gbWF0Y2guICAqLwotICAgIGFib3J0ICgpOwotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5jcHAgYi9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNWQ5My4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSAidHJhY2VfcmVhZGVyLmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgotCi0vLyBBIHN0cnVjdCBmb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IGxpbmtlZC1saXN0cyBvZiBEZXhTeW0gc3RydWN0cwotc3RydWN0IERleFN5bUxpc3QgewotICAgIERleFN5bUxpc3QgICpuZXh0OwotICAgIERleFN5bSAgICAgIHN5bTsKLX07Ci0KLS8vIERlY2xhcmUgc3RhdGljIGZ1bmN0aW9ucyB1c2VkIGluIHRoaXMgZmlsZQotc3RhdGljIGNoYXIgKkV4dHJhY3REZXhQYXRoRnJvbU1tYXAoY29uc3QgY2hhciAqbW1hcF9wYXRoKTsKLXN0YXRpYyB2b2lkIENvcHlEZXhTeW1ib2xzVG9BcnJheShEZXhGaWxlTGlzdCAqZGV4ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXhTeW1MaXN0ICpoZWFkLCBpbnQgbnVtX3N5bWJvbHMpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHBhdGhuYW1lIHRvIHRoZSBhIHNwZWNpZmljIHRyYWNlIGZpbGUuICBUaGUKLS8vIHN0cmluZyBzcGFjZSBpcyBhbGxvY2F0ZWQgaW4gdGhpcyByb3V0aW5lIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZQotLy8gY2FsbGVyLgotc3RhdGljIGNoYXIgKkNyZWF0ZVRyYWNlUGF0aChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXh0KQotewotICAgIGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmJhc2Vfc3RhcnQsICpiYXNlX2VuZDsKLSAgICBpbnQgaWksIGxlbiwgYmFzZV9sZW4sIGRpcl9sZW4sIHBhdGhfbGVuLCBxdHJhY2VfbGVuOwotCi0gICAgLy8gSGFuZGxlIGVycm9yIGNhc2VzCi0gICAgaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgKmZpbGVuYW1lID09IDAgfHwgc3RyY21wKGZpbGVuYW1lLCAiLyIpID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLy8gSWdub3JlIGEgdHJhaWxpbmcgc2xhc2gsIGlmIGFueQotICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7Ci0gICAgaWYgKGZpbGVuYW1lW2xlbiAtIDFdID09ICcvJykKLSAgICAgICAgbGVuIC09IDE7Ci0KLSAgICAvLyBGaW5kIHRoZSBiYXNlbmFtZS4gIFdlIGRvbid0IHVzZSBiYXNlbmFtZSgzKSBiZWNhdXNlIHRoZXJlIGFyZQotICAgIC8vIGRpZmZlcmVudCBiZWhhdmlvcnMgZm9yIEdOVSBhbmQgUG9zaXggaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCi0gICAgLy8gbGFzdCBjaGFyYWN0ZXIgaXMgYSBzbGFzaC4KLSAgICBiYXNlX3N0YXJ0ID0gYmFzZV9lbmQgPSAmZmlsZW5hbWVbbGVuXTsKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBsZW47ICsraWkpIHsKLSAgICAgICAgYmFzZV9zdGFydCAtPSAxOwotICAgICAgICBpZiAoKmJhc2Vfc3RhcnQgPT0gJy8nKSB7Ci0gICAgICAgICAgICBiYXNlX3N0YXJ0ICs9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBiYXNlX2xlbiA9IGJhc2VfZW5kIC0gYmFzZV9zdGFydDsKLSAgICBkaXJfbGVuID0gbGVuIC0gYmFzZV9sZW47Ci0gICAgcXRyYWNlX2xlbiA9IHN0cmxlbigiL3F0cmFjZSIpOwotCi0gICAgLy8gQ3JlYXRlIHNwYWNlIGZvciB0aGUgcGF0aG5hbWU6ICIvZGlyL2Jhc2VuYW1lL3F0cmFjZS5leHQiCi0gICAgLy8gVGhlICJleHQiIHN0cmluZyBhbHJlYWR5IGNvbnRhaW5zIHRoZSBkb3QsIHNvIGp1c3QgYWRkIGEgYnl0ZQotICAgIC8vIGZvciB0aGUgdGVybWluYXRpbmcgemVyby4KLSAgICBwYXRoX2xlbiA9IGRpcl9sZW4gKyBiYXNlX2xlbiArIHF0cmFjZV9sZW4gKyBzdHJsZW4oZXh0KSArIDE7Ci0gICAgZm5hbWUgPSBuZXcgY2hhcltwYXRoX2xlbl07Ci0gICAgaWYgKGRpcl9sZW4gPiAwKQotICAgICAgICBzdHJuY3B5KGZuYW1lLCBmaWxlbmFtZSwgZGlyX2xlbik7Ci0gICAgZm5hbWVbZGlyX2xlbl0gPSAwOwotICAgIHN0cm5jYXQoZm5hbWUsIGJhc2Vfc3RhcnQsIGJhc2VfbGVuKTsKLSAgICBzdHJjYXQoZm5hbWUsICIvcXRyYWNlIik7Ci0gICAgc3RyY2F0KGZuYW1lLCBleHQpOwotICAgIHJldHVybiBmbmFtZTsKLX0KLQotaW5saW5lIEJCUmVhZGVyOjpGdXR1cmUgKkJCUmVhZGVyOjpBbGxvY0Z1dHVyZSgpCi17Ci0gICAgRnV0dXJlICpmdXR1cmUgPSBmcmVlXzsKLSAgICBmcmVlXyA9IGZyZWVfLT5uZXh0OwotICAgIHJldHVybiBmdXR1cmU7Ci19Ci0KLWlubGluZSB2b2lkIEJCUmVhZGVyOjpGcmVlRnV0dXJlKEZ1dHVyZSAqZnV0dXJlKQotewotICAgIGZ1dHVyZS0+bmV4dCA9IGZyZWVfOwotICAgIGZyZWVfID0gZnV0dXJlOwotfQotCi1pbmxpbmUgdm9pZCBCQlJlYWRlcjo6SW5zZXJ0RnV0dXJlKEZ1dHVyZSAqZnV0dXJlKQotewotICAgIHVpbnQ2NF90IGZ1dHVyZV90aW1lID0gZnV0dXJlLT5iYi5uZXh0X3RpbWU7Ci0gICAgRnV0dXJlICpwcmV2ID0gTlVMTDsKLSAgICBGdXR1cmUgKnB0cjsKLSAgICBmb3IgKHB0ciA9IGhlYWRfOyBwdHI7IHByZXYgPSBwdHIsIHB0ciA9IHB0ci0+bmV4dCkgewotICAgICAgICBpZiAoZnV0dXJlX3RpbWUgPD0gcHRyLT5iYi5uZXh0X3RpbWUpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHByZXYgPT0gTlVMTCkgewotICAgICAgICAvLyBsaW5rIGl0IGF0IHRoZSBmcm9udAotICAgICAgICBmdXR1cmUtPm5leHQgPSBoZWFkXzsKLSAgICAgICAgaGVhZF8gPSBmdXR1cmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbGluayBpdCBhZnRlciAicHJldiIKLSAgICAgICAgZnV0dXJlLT5uZXh0ID0gcHJldi0+bmV4dDsKLSAgICAgICAgcHJldi0+bmV4dCA9IGZ1dHVyZTsKLSAgICB9Ci19Ci0KLS8vIERlY29kZXMgdGhlIG5leHQgYmFzaWMgYmxvY2sgcmVjb3JkIGZyb20gdGhlIGZpbGUuICBSZXR1cm5zIDEKLS8vIGF0IGVuZC1vZi1maWxlLCBvdGhlcndpc2UgcmV0dXJucyAwLgotaW5saW5lIGludCBCQlJlYWRlcjo6RGVjb2RlTmV4dFJlYygpCi17Ci0gICAgaW50NjRfdCBiYl9kaWZmID0gZGVjb2Rlcl8tPkRlY29kZSh0cnVlKTsKLSAgICB1aW50NjRfdCB0aW1lX2RpZmYgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICBuZXh0cmVjXy5iYl9yZWMucmVwZWF0ID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgaWYgKHRpbWVfZGlmZiA9PSAwKQotICAgICAgICByZXR1cm4gMTsKLSAgICBpZiAobmV4dHJlY18uYmJfcmVjLnJlcGVhdCkKLSAgICAgICAgbmV4dHJlY18uYmJfcmVjLnRpbWVfZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIG5leHRyZWNfLmJiX3JlYy5iYl9udW0gKz0gYmJfZGlmZjsKLSAgICBuZXh0cmVjXy5iYl9yZWMuc3RhcnRfdGltZSArPSB0aW1lX2RpZmY7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUJCUmVhZGVyOjpCQlJlYWRlcihUcmFjZVJlYWRlckJhc2UgKnRyYWNlKQotewotICAgIHRyYWNlXyA9IHRyYWNlOwotICAgIGRlY29kZXJfID0gbmV3IERlY29kZXI7Ci19Ci0KLUJCUmVhZGVyOjp+QkJSZWFkZXIoKQotewotICAgIGRlbGV0ZSBkZWNvZGVyXzsKLX0KLQotdm9pZCBCQlJlYWRlcjo6T3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjbGFzcyB2YXJpYWJsZXMKLSAgICBtZW1zZXQoJm5leHRyZWNfLCAwLCBzaXplb2YoVGltZVJlYykpOwotICAgIG1lbXNldChmdXR1cmVzXywgMCwgc2l6ZW9mKEZ1dHVyZSkgKiBrTWF4TnVtQmFzaWNCbG9ja3MpOwotICAgIGhlYWRfID0gTlVMTDsKLQotICAgIC8vIExpbmsgYWxsIG9mIHRoZSBmdXR1cmVzX1tdIGFycmF5IGVsZW1lbnRzIG9uIHRoZSBmcmVlIGxpc3QuCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGtNYXhOdW1CYXNpY0Jsb2NrcyAtIDE7ICsraWkpIHsKLSAgICAgICAgZnV0dXJlc19baWldLm5leHQgPSAmZnV0dXJlc19baWkgKyAxXTsKLSAgICB9Ci0gICAgZnV0dXJlc19ba01heE51bUJhc2ljQmxvY2tzIC0gMV0ubmV4dCA9IDA7Ci0gICAgZnJlZV8gPSAmZnV0dXJlc19bMF07Ci0KLSAgICAvLyBPcGVuIHRoZSB0cmFjZS5iYiBmaWxlCi0gICAgY2hhciAqZm5hbWUgPSBDcmVhdGVUcmFjZVBhdGgoZmlsZW5hbWUsICIuYmIiKTsKLSAgICBkZWNvZGVyXy0+T3BlbihmbmFtZSk7Ci0gICAgaXNfZW9mXyA9IERlY29kZU5leHRSZWMoKTsKLSAgICBkZWxldGVbXSBmbmFtZTsKLX0KLQotdm9pZCBCQlJlYWRlcjo6Q2xvc2UoKQotewotICAgIGRlY29kZXJfLT5DbG9zZSgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgYXQgZW5kIG9mIGZpbGUuCi1ib29sIEJCUmVhZGVyOjpSZWFkQkIoQkJFdmVudCAqZXZlbnQpCi17Ci0gICAgaWYgKGlzX2VvZl8gJiYgaGVhZF8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSNpZiAwCi0gICAgaWYgKG5leHRyZWNfKSB7Ci0gICAgICAgIHByaW50ZigibmV4dHJlYzogYnVmZmVyWyVkXSwgYmJfbnVtOiAlbGxkIHN0YXJ0OiAlZCBkaWZmICVkIHJlcGVhdCAlZCBuZXh0ICV1XG4iLAotICAgICAgICAgICAgICAgbmV4dHJlY18gLSAmYnVmZmVyX1swXSwKLSAgICAgICAgICAgICAgIG5leHRyZWNfLT5iYl9yZWMuYmJfbnVtLCBuZXh0cmVjXy0+YmJfcmVjLnN0YXJ0X3RpbWUsCi0gICAgICAgICAgICAgICBuZXh0cmVjXy0+YmJfcmVjLnRpbWVfZGlmZiwgbmV4dHJlY18tPmJiX3JlYy5yZXBlYXQsCi0gICAgICAgICAgICAgICBuZXh0cmVjXy0+bmV4dF90aW1lKTsKLSAgICB9Ci0gICAgaWYgKGhlYWRfKSB7Ci0gICAgICAgIHByaW50ZigiaGVhZDogMHgleCwgYmJfbnVtOiAlbGxkIHN0YXJ0OiAlZCBkaWZmICVkIHJlcGVhdCAlZCBuZXh0ICV1XG4iLAotICAgICAgICAgICAgICAgaGVhZF8sCi0gICAgICAgICAgICAgICBoZWFkXy0+YmItPmJiX3JlYy5iYl9udW0sIGhlYWRfLT5iYi0+YmJfcmVjLnN0YXJ0X3RpbWUsCi0gICAgICAgICAgICAgICBoZWFkXy0+YmItPmJiX3JlYy50aW1lX2RpZmYsIGhlYWRfLT5iYi0+YmJfcmVjLnJlcGVhdCwKLSAgICAgICAgICAgICAgIGhlYWRfLT5iYi0+bmV4dF90aW1lKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoIWlzX2VvZl8pIHsKLSAgICAgICAgaWYgKGhlYWRfKSB7Ci0gICAgICAgICAgICBUaW1lUmVjICpiYiA9ICZoZWFkXy0+YmI7Ci0gICAgICAgICAgICBpZiAoYmItPm5leHRfdGltZSA8IG5leHRyZWNfLmJiX3JlYy5zdGFydF90aW1lKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGhlYWQgaXMgZWFybGllci4KLSAgICAgICAgICAgICAgICBldmVudC0+dGltZSA9IGJiLT5uZXh0X3RpbWU7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPmJiX251bSA9IGJiLT5iYl9yZWMuYmJfbnVtOwotICAgICAgICAgICAgICAgIGV2ZW50LT5iYl9hZGRyID0gdHJhY2VfLT5HZXRCQkFkZHIoZXZlbnQtPmJiX251bSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPmluc25zID0gdHJhY2VfLT5HZXRJbnNucyhldmVudC0+YmJfbnVtKTsKLSAgICAgICAgICAgICAgICBldmVudC0+bnVtX2luc25zID0gdHJhY2VfLT5GaW5kTnVtSW5zbnMoZXZlbnQtPmJiX251bSwgZXZlbnQtPnRpbWUpOwotICAgICAgICAgICAgICAgIGV2ZW50LT5waWQgPSB0cmFjZV8tPkZpbmRDdXJyZW50UGlkKGV2ZW50LT50aW1lKTsKLSAgICAgICAgICAgICAgICBldmVudC0+aXNfdGh1bWIgPSB0cmFjZV8tPkdldElzVGh1bWIoZXZlbnQtPmJiX251bSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGhlYWQgZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgRnV0dXJlICpmdXR1cmUgPSBoZWFkXzsKLSAgICAgICAgICAgICAgICBoZWFkXyA9IGhlYWRfLT5uZXh0OwotICAgICAgICAgICAgICAgIGlmIChiYi0+YmJfcmVjLnJlcGVhdCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG1vcmUgcmVwZXRpdGlvbnMgb2YgdGhpcyBiYgotICAgICAgICAgICAgICAgICAgICBiYi0+YmJfcmVjLnJlcGVhdCAtPSAxOwotICAgICAgICAgICAgICAgICAgICBiYi0+bmV4dF90aW1lICs9IGJiLT5iYl9yZWMudGltZV9kaWZmOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGlzIGZ1dHVyZSBpbnRvIHRoZSBzb3J0ZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICBJbnNlcnRGdXR1cmUoZnV0dXJlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBmdXR1cmUgdG8gdGhlIGZyZWUgbGlzdAotICAgICAgICAgICAgICAgICAgICBGcmVlRnV0dXJlKGZ1dHVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgbmV4dHJlYyBpcyBlYXJsaWVyIChvciB0aGVyZSB3YXMgbm8gaGVhZCkKLSAgICAgICAgZXZlbnQtPnRpbWUgPSBuZXh0cmVjXy5iYl9yZWMuc3RhcnRfdGltZTsKLSAgICAgICAgZXZlbnQtPmJiX251bSA9IG5leHRyZWNfLmJiX3JlYy5iYl9udW07Ci0gICAgICAgIGV2ZW50LT5iYl9hZGRyID0gdHJhY2VfLT5HZXRCQkFkZHIoZXZlbnQtPmJiX251bSk7Ci0gICAgICAgIGV2ZW50LT5pbnNucyA9IHRyYWNlXy0+R2V0SW5zbnMoZXZlbnQtPmJiX251bSk7Ci0gICAgICAgIGV2ZW50LT5udW1faW5zbnMgPSB0cmFjZV8tPkZpbmROdW1JbnNucyhldmVudC0+YmJfbnVtLCBldmVudC0+dGltZSk7Ci0gICAgICAgIGV2ZW50LT5waWQgPSB0cmFjZV8tPkZpbmRDdXJyZW50UGlkKGV2ZW50LT50aW1lKTsKLSAgICAgICAgZXZlbnQtPmlzX3RodW1iID0gdHJhY2VfLT5HZXRJc1RodW1iKGV2ZW50LT5iYl9udW0pOwotICAgICAgICBpZiAobmV4dHJlY18uYmJfcmVjLnJlcGVhdCA+IDApIHsKLSAgICAgICAgICAgIEZ1dHVyZSAqZnV0dXJlID0gQWxsb2NGdXR1cmUoKTsKLSAgICAgICAgICAgIGZ1dHVyZS0+YmIuYmJfcmVjID0gbmV4dHJlY18uYmJfcmVjOwotICAgICAgICAgICAgZnV0dXJlLT5iYi5iYl9yZWMucmVwZWF0IC09IDE7Ci0gICAgICAgICAgICBmdXR1cmUtPmJiLm5leHRfdGltZSA9IG5leHRyZWNfLmJiX3JlYy5zdGFydF90aW1lICsgbmV4dHJlY18uYmJfcmVjLnRpbWVfZGlmZjsKLSAgICAgICAgICAgIEluc2VydEZ1dHVyZShmdXR1cmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNfZW9mXyA9IERlY29kZU5leHRSZWMoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vcHJpbnRmKCJ1c2luZyBoZWFkXyAweCV4XG4iLCBoZWFkXyk7Ci0gICAgYXNzZXJ0KGhlYWRfKTsKLSAgICBUaW1lUmVjICpiYiA9ICZoZWFkXy0+YmI7Ci0gICAgZXZlbnQtPnRpbWUgPSBiYi0+bmV4dF90aW1lOwotICAgIGV2ZW50LT5iYl9udW0gPSBiYi0+YmJfcmVjLmJiX251bTsKLSAgICBldmVudC0+YmJfYWRkciA9IHRyYWNlXy0+R2V0QkJBZGRyKGV2ZW50LT5iYl9udW0pOwotICAgIGV2ZW50LT5pbnNucyA9IHRyYWNlXy0+R2V0SW5zbnMoZXZlbnQtPmJiX251bSk7Ci0gICAgZXZlbnQtPm51bV9pbnNucyA9IHRyYWNlXy0+RmluZE51bUluc25zKGV2ZW50LT5iYl9udW0sIGV2ZW50LT50aW1lKTsKLSAgICBldmVudC0+cGlkID0gdHJhY2VfLT5GaW5kQ3VycmVudFBpZChldmVudC0+dGltZSk7Ci0gICAgZXZlbnQtPmlzX3RodW1iID0gdHJhY2VfLT5HZXRJc1RodW1iKGV2ZW50LT5iYl9udW0pOwotCi0gICAgLy8gUmVtb3ZlIHRoZSBoZWFkIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAotICAgIEZ1dHVyZSAqZnV0dXJlID0gaGVhZF87Ci0gICAgaGVhZF8gPSBoZWFkXy0+bmV4dDsKLSAgICBpZiAoYmItPmJiX3JlYy5yZXBlYXQgPiAwKSB7Ci0gICAgICAgIC8vIHRoZXJlIGFyZSBtb3JlIHJlcGV0aXRpb25zIG9mIHRoaXMgYmIKLSAgICAgICAgYmItPmJiX3JlYy5yZXBlYXQgLT0gMTsKLSAgICAgICAgYmItPm5leHRfdGltZSArPSBiYi0+YmJfcmVjLnRpbWVfZGlmZjsKLQotICAgICAgICAvLyBJbnNlcnQgdGhpcyBmdXR1cmUgaW50byB0aGUgc29ydGVkIGxpc3QKLSAgICAgICAgSW5zZXJ0RnV0dXJlKGZ1dHVyZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWRkIHRoaXMgZnV0dXJlIHRvIHRoZSBmcmVlIGxpc3QKLSAgICAgICAgRnJlZUZ1dHVyZShmdXR1cmUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUluc25SZWFkZXI6Okluc25SZWFkZXIoKQotewotICAgIGRlY29kZXJfID0gbmV3IERlY29kZXI7Ci19Ci0KLUluc25SZWFkZXI6On5JbnNuUmVhZGVyKCkKLXsKLSAgICBkZWxldGUgZGVjb2Rlcl87Ci19Ci0KLXZvaWQgSW5zblJlYWRlcjo6T3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBwcmV2X3RpbWVfID0gMDsKLSAgICB0aW1lX2RpZmZfID0gMDsKLSAgICByZXBlYXRfID0gLTE7Ci0KLSAgICAvLyBPcGVuIHRoZSB0cmFjZS5pbnNuIGZpbGUKLSAgICBjaGFyICpmbmFtZSA9IENyZWF0ZVRyYWNlUGF0aChmaWxlbmFtZSwgIi5pbnNuIik7Ci0gICAgZGVjb2Rlcl8tPk9wZW4oZm5hbWUpOwotICAgIGRlbGV0ZVtdIGZuYW1lOwotfQotCi12b2lkIEluc25SZWFkZXI6OkNsb3NlKCkKLXsKLSAgICBkZWNvZGVyXy0+Q2xvc2UoKTsKLX0KLQotdWludDY0X3QgSW5zblJlYWRlcjo6UmVhZEluc25UaW1lKHVpbnQ2NF90IG1pbl90aW1lKQotewotICAgIGRvIHsKLSAgICAgICAgaWYgKHJlcGVhdF8gPT0gLTEpIHsKLSAgICAgICAgICAgIHRpbWVfZGlmZl8gPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlcGVhdF8gPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBwcmV2X3RpbWVfICs9IHRpbWVfZGlmZl87Ci0gICAgICAgIHJlcGVhdF8gLT0gMTsKLSAgICB9IHdoaWxlIChwcmV2X3RpbWVfIDwgbWluX3RpbWUpOwotICAgIHJldHVybiBwcmV2X3RpbWVfOwotfQotCi1BZGRyUmVhZGVyOjpBZGRyUmVhZGVyKCkKLXsKLSAgICBkZWNvZGVyXyA9IG5ldyBEZWNvZGVyOwotICAgIG9wZW5lZF8gPSBmYWxzZTsKLX0KLQotQWRkclJlYWRlcjo6fkFkZHJSZWFkZXIoKQotewotICAgIGRlbGV0ZSBkZWNvZGVyXzsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9wZW5pbmcgdGhlIGZpbGUKLWJvb2wgQWRkclJlYWRlcjo6T3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4KQotewotICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotCi0gICAgcHJldl9hZGRyXyA9IDA7Ci0gICAgcHJldl90aW1lXyA9IDA7Ci0KLSAgICAvLyBPcGVuIHRoZSB0cmFjZS5hZGRyIGZpbGUKLSAgICBjaGFyICpmbmFtZSA9IENyZWF0ZVRyYWNlUGF0aChmaWxlbmFtZSwgc3VmZml4KTsKLSAgICBpbnQgcnZhbCA9IHN0YXQoZm5hbWUsICZzdGF0X2J1Zik7Ci0gICAgaWYgKHJ2YWwgPT0gLTEpIHsKLSAgICAgICAgLy8gVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgZGVsZXRlW10gZm5hbWU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBkZWNvZGVyXy0+T3BlbihmbmFtZSk7Ci0gICAgb3BlbmVkXyA9IHRydWU7Ci0gICAgZGVsZXRlW10gZm5hbWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEFkZHJSZWFkZXI6OkNsb3NlKCkKLXsKLSAgICBkZWNvZGVyXy0+Q2xvc2UoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGF0IGVuZCBvZiBmaWxlLgotYm9vbCBBZGRyUmVhZGVyOjpSZWFkQWRkcih1aW50NjRfdCAqdGltZSwgdWludDMyX3QgKmFkZHIpCi17Ci0gICAgaWYgKCFvcGVuZWRfKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgYWRkcmVzcyB0cmFjZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHVpbnQzMl90IGFkZHJfZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUodHJ1ZSk7Ci0gICAgdWludDY0X3QgdGltZV9kaWZmID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgaWYgKHRpbWVfZGlmZiA9PSAwICYmIGFkZHJfZGlmZiA9PSAwKSB7Ci0gICAgICAgICphZGRyID0gMDsKLSAgICAgICAgKnRpbWUgPSAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcHJldl9hZGRyXyArPSBhZGRyX2RpZmY7Ci0gICAgcHJldl90aW1lXyArPSB0aW1lX2RpZmY7Ci0gICAgKmFkZHIgPSBwcmV2X2FkZHJfOwotICAgICp0aW1lID0gcHJldl90aW1lXzsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUV4Y1JlYWRlcjo6RXhjUmVhZGVyKCkKLXsKLSAgICBkZWNvZGVyXyA9IG5ldyBEZWNvZGVyOwotfQotCi1FeGNSZWFkZXI6On5FeGNSZWFkZXIoKQotewotICAgIGRlbGV0ZSBkZWNvZGVyXzsKLX0KLQotdm9pZCBFeGNSZWFkZXI6Ok9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcHJldl90aW1lXyA9IDA7Ci0gICAgcHJldl9yZWNudW1fID0gMDsKLQotICAgIC8vIE9wZW4gdGhlIHRyYWNlLmV4YyBmaWxlCi0gICAgY2hhciAqZm5hbWUgPSBDcmVhdGVUcmFjZVBhdGgoZmlsZW5hbWUsICIuZXhjIik7Ci0gICAgZGVjb2Rlcl8tPk9wZW4oZm5hbWUpOwotICAgIGRlbGV0ZVtdIGZuYW1lOwotfQotCi12b2lkIEV4Y1JlYWRlcjo6Q2xvc2UoKQotewotICAgIGRlY29kZXJfLT5DbG9zZSgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgYXQgZW5kIG9mIGZpbGUuCi1ib29sIEV4Y1JlYWRlcjo6UmVhZEV4Yyh1aW50NjRfdCAqdGltZSwgdWludDMyX3QgKmN1cnJlbnRfcGMsIHVpbnQ2NF90ICpyZWNudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdGFyZ2V0X3BjLCB1aW50NjRfdCAqYmJfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKmJiX3N0YXJ0X3RpbWUsIGludCAqbnVtX2luc25zKQotewotICAgIHVpbnQ2NF90IHRpbWVfZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIHVpbnQzMl90IHBjID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgaWYgKCh0aW1lX2RpZmYgfCBwYykgPT0gMCkgewotICAgICAgICBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgIGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB1aW50NjRfdCByZWNudW1fZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIHByZXZfdGltZV8gKz0gdGltZV9kaWZmOwotICAgIHByZXZfcmVjbnVtXyArPSByZWNudW1fZGlmZjsKLSAgICAqdGltZSA9IHByZXZfdGltZV87Ci0gICAgKmN1cnJlbnRfcGMgPSBwYzsKLSAgICAqcmVjbnVtID0gcHJldl9yZWNudW1fOwotICAgICp0YXJnZXRfcGMgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAqYmJfbnVtID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgKmJiX3N0YXJ0X3RpbWUgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAqbnVtX2luc25zID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1QaWRSZWFkZXI6OlBpZFJlYWRlcigpCi17Ci0gICAgZGVjb2Rlcl8gPSBuZXcgRGVjb2RlcjsKLX0KLQotUGlkUmVhZGVyOjp+UGlkUmVhZGVyKCkKLXsKLSAgICBkZWxldGUgZGVjb2Rlcl87Ci19Ci0KLXZvaWQgUGlkUmVhZGVyOjpPcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHByZXZfdGltZV8gPSAwOwotCi0gICAgLy8gT3BlbiB0aGUgdHJhY2UucGlkIGZpbGUKLSAgICBjaGFyICpmbmFtZSA9IENyZWF0ZVRyYWNlUGF0aChmaWxlbmFtZSwgIi5waWQiKTsKLSAgICBkZWNvZGVyXy0+T3BlbihmbmFtZSk7Ci0gICAgZGVsZXRlW10gZm5hbWU7Ci19Ci0KLXZvaWQgUGlkUmVhZGVyOjpDbG9zZSgpCi17Ci0gICAgZGVjb2Rlcl8tPkNsb3NlKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBhdCBlbmQgb2YgZmlsZS4KLWJvb2wgUGlkUmVhZGVyOjpSZWFkUGlkRXZlbnQoUGlkRXZlbnQgKmV2ZW50KQotewotICAgIHVpbnQ2NF90IHRpbWVfZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIGludCByZWNfdHlwZSA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIHByZXZfdGltZV8gKz0gdGltZV9kaWZmOwotICAgIGV2ZW50LT50aW1lID0gcHJldl90aW1lXzsKLSAgICBldmVudC0+cmVjX3R5cGUgPSByZWNfdHlwZTsKLSAgICBzd2l0Y2gocmVjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBrUGlkRW5kT2ZGaWxlOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2Uga1BpZFN3aXRjaDoKLSAgICAgICAgY2FzZSBrUGlkRXhpdDoKLSAgICAgICAgICAgIGV2ZW50LT5waWQgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtQaWRGb3JrOgotICAgICAgICBjYXNlIGtQaWRDbG9uZToKLSAgICAgICAgICAgIGV2ZW50LT50Z2lkID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICBldmVudC0+cGlkID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrUGlkTW1hcDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVudC0+dnN0YXJ0ID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPnZlbmQgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBldmVudC0+b2Zmc2V0ID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNoYXIgKnBhdGggPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICAgICAgICAgICAgICBkZWNvZGVyXy0+UmVhZChwYXRoLCBsZW4pOwotICAgICAgICAgICAgICAgIHBhdGhbbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPnBhdGggPSBwYXRoOwotICAgICAgICAgICAgICAgIGV2ZW50LT5tbWFwX3BhdGggPSBwYXRoOwotICAgICAgICAgICAgICAgIGNoYXIgKmRleGZpbGUgPSBFeHRyYWN0RGV4UGF0aEZyb21NbWFwKHBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChkZXhmaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gZXZlbnQtPnBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LT5wYXRoID0gZGV4ZmlsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrUGlkTXVubWFwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV2ZW50LT52c3RhcnQgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBldmVudC0+dmVuZCA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga1BpZFN5bWJvbEFkZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVudC0+dnN0YXJ0ID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNoYXIgKnBhdGggPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICAgICAgICAgICAgICBkZWNvZGVyXy0+UmVhZChwYXRoLCBsZW4pOwotICAgICAgICAgICAgICAgIHBhdGhbbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPnBhdGggPSBwYXRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga1BpZFN5bWJvbFJlbW92ZToKLSAgICAgICAgICAgIGV2ZW50LT52c3RhcnQgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtQaWRFeGVjOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBhcmdjID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQtPmFyZ2MgPSBhcmdjOwotICAgICAgICAgICAgICAgIGNoYXIgKiphcmd2ID0gbmV3IGNoYXIqW2FyZ2NdOwotICAgICAgICAgICAgICAgIGV2ZW50LT5hcmd2ID0gYXJndjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgYXJnYzsgKytpaSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWxlbiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBhcmd2W2lpXSA9IG5ldyBjaGFyW2FsZW4gKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl8tPlJlYWQoYXJndltpaV0sIGFsZW4pOwotICAgICAgICAgICAgICAgICAgICBhcmd2W2lpXVthbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga1BpZE5hbWU6Ci0gICAgICAgIGNhc2Uga1BpZEt0aHJlYWROYW1lOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZWNfdHlwZSA9PSBrUGlkS3RocmVhZE5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQtPnRnaWQgPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXZlbnQtPnBpZCA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGludCBsZW4gPSBkZWNvZGVyXy0+RGVjb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjaGFyICpwYXRoID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgICAgICAgICAgICAgZGVjb2Rlcl8tPlJlYWQocGF0aCwgbGVuKTsKLSAgICAgICAgICAgICAgICBwYXRoW2xlbl0gPSAwOwotICAgICAgICAgICAgICAgIGV2ZW50LT5wYXRoID0gcGF0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIEZyZWVzIHRoZSBtZW1vcnkgdGhhdCBtaWdodCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCi12b2lkIFBpZFJlYWRlcjo6RGlzcG9zZShQaWRFdmVudCAqZXZlbnQpCi17Ci0gICAgc3dpdGNoKGV2ZW50LT5yZWNfdHlwZSkgewotICAgICAgICBjYXNlIGtQaWRNbWFwOgotICAgICAgICBjYXNlIGtQaWRTeW1ib2xBZGQ6Ci0gICAgICAgIGNhc2Uga1BpZE5hbWU6Ci0gICAgICAgIGNhc2Uga1BpZEt0aHJlYWROYW1lOgotICAgICAgICAgICAgZGVsZXRlW10gZXZlbnQtPnBhdGg7Ci0gICAgICAgICAgICBldmVudC0+cGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICBldmVudC0+bW1hcF9wYXRoID0gTlVMTDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga1BpZEV4ZWM6Ci0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZXZlbnQtPmFyZ2M7ICsraWkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBldmVudC0+YXJndltpaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSBldmVudC0+YXJndjsKLSAgICAgICAgICAgIGV2ZW50LT5hcmd2ID0gTlVMTDsKLSAgICAgICAgICAgIGV2ZW50LT5hcmdjID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1NZXRob2RSZWFkZXI6Ok1ldGhvZFJlYWRlcigpCi17Ci0gICAgZGVjb2Rlcl8gPSBuZXcgRGVjb2RlcjsKLSAgICBvcGVuZWRfID0gZmFsc2U7Ci19Ci0KLU1ldGhvZFJlYWRlcjo6fk1ldGhvZFJlYWRlcigpCi17Ci0gICAgZGVsZXRlIGRlY29kZXJfOwotfQotCi1ib29sIE1ldGhvZFJlYWRlcjo6T3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLQotICAgIHByZXZfdGltZV8gPSAwOwotICAgIHByZXZfYWRkcl8gPSAwOwotICAgIHByZXZfcGlkXyA9IDA7Ci0KLSAgICAvLyBPcGVuIHRoZSB0cmFjZS5tZXRob2QgZmlsZQotICAgIGNoYXIgKmZuYW1lID0gQ3JlYXRlVHJhY2VQYXRoKGZpbGVuYW1lLCAiLm1ldGhvZCIpOwotICAgIGludCBydmFsID0gc3RhdChmbmFtZSwgJnN0YXRfYnVmKTsKLSAgICBpZiAocnZhbCA9PSAtMSkgewotICAgICAgICAvLyBUaGUgZmlsZSBkb2VzIG5vdCBleGlzdAotICAgICAgICBkZWxldGVbXSBmbmFtZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGRlY29kZXJfLT5PcGVuKGZuYW1lKTsKLSAgICBkZWxldGVbXSBmbmFtZTsKLSAgICBvcGVuZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgTWV0aG9kUmVhZGVyOjpDbG9zZSgpCi17Ci0gICAgZGVjb2Rlcl8tPkNsb3NlKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBhdCBlbmQgb2YgZmlsZS4KLWJvb2wgTWV0aG9kUmVhZGVyOjpSZWFkTWV0aG9kKE1ldGhvZFJlYyAqbWV0aG9kX3JlY29yZCkKLXsKLSAgICBpZiAoIW9wZW5lZF8pCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHVpbnQ2NF90IHRpbWVfZGlmZiA9IGRlY29kZXJfLT5EZWNvZGUoZmFsc2UpOwotICAgIGludDMyX3QgYWRkcl9kaWZmID0gZGVjb2Rlcl8tPkRlY29kZSh0cnVlKTsKLSAgICBpZiAodGltZV9kaWZmID09IDApIHsKLSAgICAgICAgbWV0aG9kX3JlY29yZC0+dGltZSA9IDA7Ci0gICAgICAgIG1ldGhvZF9yZWNvcmQtPmFkZHIgPSAwOwotICAgICAgICBtZXRob2RfcmVjb3JkLT5mbGFncyA9IDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQzMl90IHBpZF9kaWZmID0gZGVjb2Rlcl8tPkRlY29kZSh0cnVlKTsKLSAgICBwcmV2X3RpbWVfICs9IHRpbWVfZGlmZjsKLSAgICBwcmV2X2FkZHJfICs9IGFkZHJfZGlmZjsKLSAgICBwcmV2X3BpZF8gKz0gcGlkX2RpZmY7Ci0gICAgbWV0aG9kX3JlY29yZC0+dGltZSA9IHByZXZfdGltZV87Ci0gICAgbWV0aG9kX3JlY29yZC0+YWRkciA9IHByZXZfYWRkcl87Ci0gICAgbWV0aG9kX3JlY29yZC0+cGlkID0gcHJldl9waWRfOwotICAgIG1ldGhvZF9yZWNvcmQtPmZsYWdzID0gZGVjb2Rlcl8tPkRlY29kZShmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1UcmFjZVJlYWRlckJhc2U6OlRyYWNlUmVhZGVyQmFzZSgpCi17Ci0gICAgc3RhdGljX2ZpbGVuYW1lXyA9IE5VTEw7Ci0gICAgc3RhdGljX2ZzdHJlYW1fID0gTlVMTDsKLSAgICBoZWFkZXJfID0gbmV3IFRyYWNlSGVhZGVyOwotICAgIGJiX3JlYWRlcl8gPSBuZXcgQkJSZWFkZXIodGhpcyk7Ci0gICAgaW5zbl9yZWFkZXJfID0gbmV3IEluc25SZWFkZXI7Ci0gICAgbG9hZF9hZGRyX3JlYWRlcl8gPSBuZXcgQWRkclJlYWRlcjsKLSAgICBzdG9yZV9hZGRyX3JlYWRlcl8gPSBuZXcgQWRkclJlYWRlcjsKLSAgICBleGNfcmVhZGVyXyA9IG5ldyBFeGNSZWFkZXI7Ci0gICAgcGlkX3JlYWRlcl8gPSBuZXcgUGlkUmVhZGVyOwotICAgIG1ldGhvZF9yZWFkZXJfID0gbmV3IE1ldGhvZFJlYWRlcjsKLSAgICBpbnRlcm5hbF9leGNfcmVhZGVyXyA9IG5ldyBFeGNSZWFkZXI7Ci0gICAgaW50ZXJuYWxfcGlkX3JlYWRlcl8gPSBuZXcgUGlkUmVhZGVyOwotICAgIGludGVybmFsX21ldGhvZF9yZWFkZXJfID0gbmV3IE1ldGhvZFJlYWRlcjsKLSAgICBibG9ja3NfID0gTlVMTDsKLSAgICBiYl9yZWNudW1fID0gMDsKLSAgICBleGNfcmVjbnVtXyA9IDA7Ci0gICAgZXhjX2VuZF8gPSBmYWxzZTsKLSAgICBleGNfYmJfbnVtXyA9IDA7Ci0gICAgZXhjX3RpbWVfID0gMDsKLSAgICBleGNfbnVtX2luc25zXyA9IDA7Ci0gICAgY3VycmVudF9waWRfID0gMDsKLSAgICBuZXh0X3BpZF8gPSAwOwotICAgIG5leHRfcGlkX3N3aXRjaF90aW1lXyA9IDA7Ci0gICAgcG9zdF9wcm9jZXNzaW5nXyA9IGZhbHNlOwotICAgIGRleF9oYXNoXyA9IE5VTEw7Ci0gICAgbG9hZF9lb2ZfID0gZmFsc2U7Ci0gICAgbG9hZF90aW1lXyA9IDA7Ci0gICAgbG9hZF9hZGRyXyA9IDA7Ci0gICAgc3RvcmVfZW9mXyA9IGZhbHNlOwotICAgIHN0b3JlX3RpbWVfID0gMDsKLSAgICBzdG9yZV9hZGRyXyA9IDA7Ci19Ci0KLVRyYWNlUmVhZGVyQmFzZTo6flRyYWNlUmVhZGVyQmFzZSgpCi17Ci0gICAgQ2xvc2UoKTsKLSAgICBkZWxldGUgYmJfcmVhZGVyXzsKLSAgICBkZWxldGUgaW5zbl9yZWFkZXJfOwotICAgIGRlbGV0ZSBsb2FkX2FkZHJfcmVhZGVyXzsKLSAgICBkZWxldGUgc3RvcmVfYWRkcl9yZWFkZXJfOwotICAgIGRlbGV0ZSBleGNfcmVhZGVyXzsKLSAgICBkZWxldGUgcGlkX3JlYWRlcl87Ci0gICAgZGVsZXRlIG1ldGhvZF9yZWFkZXJfOwotICAgIGRlbGV0ZSBpbnRlcm5hbF9leGNfcmVhZGVyXzsKLSAgICBkZWxldGUgaW50ZXJuYWxfcGlkX3JlYWRlcl87Ci0gICAgZGVsZXRlIGludGVybmFsX21ldGhvZF9yZWFkZXJfOwotICAgIGlmIChibG9ja3NfKSB7Ci0gICAgICAgIGludCBudW1fc3RhdGljX2JiID0gaGVhZGVyXy0+bnVtX3N0YXRpY19iYjsKLSAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9zdGF0aWNfYmI7ICsraWkpIHsKLSAgICAgICAgICAgIGRlbGV0ZVtdIGJsb2Nrc19baWldLmluc25zOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZVtdIGJsb2Nrc187Ci0gICAgfQotICAgIGRlbGV0ZSBoZWFkZXJfOwotICAgIGlmIChkZXhfaGFzaF8gIT0gTlVMTCkgewotICAgICAgICBIYXNoVGFibGU8RGV4RmlsZUxpc3QqPjo6ZW50cnlfdHlwZSAqcHRyOwotICAgICAgICBmb3IgKHB0ciA9IGRleF9oYXNoXy0+R2V0Rmlyc3QoKTsgcHRyOyBwdHIgPSBkZXhfaGFzaF8tPkdldE5leHQoKSkgewotICAgICAgICAgICAgRGV4RmlsZUxpc3QgKmRleGZpbGUgPSBwdHItPnZhbHVlOwotICAgICAgICAgICAgZGVsZXRlW10gZGV4ZmlsZS0+cGF0aDsKLSAgICAgICAgICAgIGludCBuc3ltYm9scyA9IGRleGZpbGUtPm5zeW1ib2xzOwotICAgICAgICAgICAgRGV4U3ltICpzeW1ib2xzID0gZGV4ZmlsZS0+c3ltYm9sczsKLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuc3ltYm9sczsgaWkrKykgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHN5bWJvbHNbaWldLm5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSBkZXhmaWxlLT5zeW1ib2xzOwotICAgICAgICAgICAgZGVsZXRlIGRleGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVsZXRlIGRleF9oYXNoXzsKLSAgICBkZWxldGVbXSBzdGF0aWNfZmlsZW5hbWVfOwotfQotCi12b2lkIFRyYWNlUmVhZGVyQmFzZTo6UmVhZFRyYWNlSGVhZGVyKEZJTEUgKmZzdHJlYW0sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFjZW5hbWUsIFRyYWNlSGVhZGVyICpoZWFkZXIpCi17Ci0gICAgaW50IHJ2YWwgPSBmcmVhZChoZWFkZXIsIHNpemVvZihUcmFjZUhlYWRlciksIDEsIGZzdHJlYW0pOwotICAgIGlmIChydmFsICE9IDEpIHsKLSAgICAgICAgcGVycm9yKGZpbGVuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIXBvc3RfcHJvY2Vzc2luZ18gJiYgc3RyY21wKGhlYWRlci0+aWRlbnQsIFRSQUNFX0lERU5UKSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG1pc3NpbmcgdHJhY2UgaGVhZGVyOyBydW4gJ3Bvc3RfdHJhY2UgJXMnIGZpcnN0XG4iLAotICAgICAgICAgICAgICAgIGZpbGVuYW1lLCB0cmFjZW5hbWUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChoZWFkZXItPnZlcnNpb24gIT0gVFJBQ0VfVkVSU0lPTikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiJXM6IHRyYWNlIGhlYWRlciB2ZXJzaW9uICglZCkgZG9lcyBub3QgbWF0Y2ggY29tcGlsZWQgdG9vbHMgdmVyc2lvbiAoJWQpXG4iLAotICAgICAgICAgICAgICAgIHRyYWNlbmFtZSwgaGVhZGVyLT52ZXJzaW9uLCBUUkFDRV9WRVJTSU9OKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjb252ZXJ0MzIoaGVhZGVyLT52ZXJzaW9uKTsKLSAgICBjb252ZXJ0MzIoaGVhZGVyLT5zdGFydF9zZWMpOwotICAgIGNvbnZlcnQzMihoZWFkZXItPnN0YXJ0X3VzZWMpOwotICAgIGNvbnZlcnQzMihoZWFkZXItPnBkYXRlKTsKLSAgICBjb252ZXJ0MzIoaGVhZGVyLT5wdGltZSk7Ci0gICAgY29udmVydDY0KGhlYWRlci0+bnVtX3N0YXRpY19iYik7Ci0gICAgY29udmVydDY0KGhlYWRlci0+bnVtX3N0YXRpY19pbnNuKTsKLSAgICBjb252ZXJ0NjQoaGVhZGVyLT5udW1fZHluYW1pY19iYik7Ci0gICAgY29udmVydDY0KGhlYWRlci0+bnVtX2R5bmFtaWNfaW5zbik7Ci0gICAgY29udmVydDY0KGhlYWRlci0+ZWxhcHNlZF91c2Vjcyk7Ci19Ci0KLQotdm9pZCBUcmFjZVJlYWRlckJhc2U6Ok9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgY2hhciAqZm5hbWU7Ci0gICAgRklMRSAqZnN0cmVhbTsKLQotICAgIC8vIE9wZW4gdGhlIHF0cmFjZS5iYiBmaWxlCi0gICAgYmJfcmVhZGVyXy0+T3BlbihmaWxlbmFtZSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBxdHJhY2UuaW5zbiBmaWxlCi0gICAgaW5zbl9yZWFkZXJfLT5PcGVuKGZpbGVuYW1lKTsKLQotICAgIC8vIE9wZW4gdGhlIHF0cmFjZS5sb2FkIGZpbGUgYW5kIHJlYWQgdGhlIGZpcnN0IGxpbmUKLSAgICBsb2FkX2VvZl8gPSBsb2FkX2FkZHJfcmVhZGVyXy0+T3BlbihmaWxlbmFtZSwgIi5sb2FkIik7Ci0gICAgaWYgKCFsb2FkX2VvZl8pCi0gICAgICAgIGxvYWRfZW9mXyA9IGxvYWRfYWRkcl9yZWFkZXJfLT5SZWFkQWRkcigmbG9hZF90aW1lXywgJmxvYWRfYWRkcl8pOwotCi0gICAgLy8gT3BlbiB0aGUgcXRyYWNlLnN0b3JlIGZpbGUgYW5kIHJlYWQgdGhlIGZpcnN0IGxpbmUKLSAgICBzdG9yZV9lb2ZfID0gc3RvcmVfYWRkcl9yZWFkZXJfLT5PcGVuKGZpbGVuYW1lLCAiLnN0b3JlIik7Ci0gICAgaWYgKCFzdG9yZV9lb2ZfKQotICAgICAgICBzdG9yZV9lb2ZfID0gc3RvcmVfYWRkcl9yZWFkZXJfLT5SZWFkQWRkcigmc3RvcmVfdGltZV8sICZzdG9yZV9hZGRyXyk7Ci0KLSAgICAvLyBPcGVuIHRoZSBxdHJhY2UuZXhjIGZpbGUKLSAgICBleGNfcmVhZGVyXy0+T3BlbihmaWxlbmFtZSk7Ci0KLSAgICAvLyBPcGVuIGFub3RoZXIgZmlsZSBzdHJlYW0gdG8gdGhlIHF0cmFjZS5leGMgZmlsZSBmb3IgaW50ZXJuYWwgcmVhZHMuCi0gICAgLy8gVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBhbHNvIHJlYWQgZnJvbSB0aGUgcXRyYWNlLmV4YyBmaWxlLgotICAgIGludGVybmFsX2V4Y19yZWFkZXJfLT5PcGVuKGZpbGVuYW1lKTsKLQotICAgIC8vIE9wZW4gdGhlIHF0cmFjZS5waWQgZmlsZQotICAgIHBpZF9yZWFkZXJfLT5PcGVuKGZpbGVuYW1lKTsKLSAgICBpbnRlcm5hbF9waWRfcmVhZGVyXy0+T3BlbihmaWxlbmFtZSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBxdHJhY2UubWV0aG9kIGZpbGUKLSAgICBtZXRob2RfcmVhZGVyXy0+T3BlbihmaWxlbmFtZSk7Ci0gICAgaW50ZXJuYWxfbWV0aG9kX3JlYWRlcl8tPk9wZW4oZmlsZW5hbWUpOwotCi0gICAgLy8gT3BlbiB0aGUgcXRyYWNlLnN0YXRpYyBmaWxlCi0gICAgZm5hbWUgPSBDcmVhdGVUcmFjZVBhdGgoZmlsZW5hbWUsICIuc3RhdGljIik7Ci0gICAgc3RhdGljX2ZpbGVuYW1lXyA9IGZuYW1lOwotCi0gICAgZnN0cmVhbSA9IGZvcGVuKGZuYW1lLCAiciIpOwotICAgIGlmIChmc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKGZuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RhdGljX2ZzdHJlYW1fID0gZnN0cmVhbTsKLQotICAgIC8vIFJlYWQgdGhlIGhlYWRlcgotICAgIFJlYWRUcmFjZUhlYWRlcihmc3RyZWFtLCBmbmFtZSwgZmlsZW5hbWUsIGhlYWRlcl8pOwotCi0gICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgc3RhdGljIGJsb2NrcwotICAgIGludCBudW1fc3RhdGljX2JiID0gaGVhZGVyXy0+bnVtX3N0YXRpY19iYjsKLSAgICBpZiAobnVtX3N0YXRpY19iYikgewotICAgICAgICBibG9ja3NfID0gbmV3IFN0YXRpY0Jsb2NrW251bV9zdGF0aWNfYmJdOwotCi0gICAgICAgIC8vIFJlYWQgaW4gYWxsIHRoZSBzdGF0aWMgYmxvY2tzCi0gICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBudW1fc3RhdGljX2JiOyArK2lpKSB7Ci0gICAgICAgICAgICBSZWFkU3RhdGljKCZibG9ja3NfW2lpXS5yZWMpOwotICAgICAgICAgICAgaW50IG51bV9pbnNucyA9IGJsb2Nrc19baWldLnJlYy5udW1faW5zbnM7Ci0gICAgICAgICAgICBpZiAobnVtX2luc25zID4gMCkgewotICAgICAgICAgICAgICAgIGJsb2Nrc19baWldLmluc25zID0gbmV3IHVpbnQzMl90W251bV9pbnNuc107Ci0gICAgICAgICAgICAgICAgUmVhZFN0YXRpY0luc25zKG51bV9pbnNucywgYmxvY2tzX1tpaV0uaW5zbnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBibG9ja3NfW2lpXS5pbnNucyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnNlZWsoc3RhdGljX2ZzdHJlYW1fLCBzaXplb2YoVHJhY2VIZWFkZXIpLCBTRUVLX1NFVCk7Ci0gICAgfQotCi0gICAgUGFyc2VEZXhMaXN0KGZpbGVuYW1lKTsKLQotICAgIC8vIElmIHRoZSBkZXhfaGFzaF8gaXMgTlVMTCwgdGhlbiBhc3NpZ24gaXQgYSBzbWFsbCBoYXNoIHRhYmxlCi0gICAgLy8gc28gdGhhdCB3ZSBjYW4gc2ltcGx5IGRvIGEgRmluZCgpIG9wZXJhdGlvbiB3aXRob3V0IGhhdmluZwotICAgIC8vIHRvIGNoZWNrIGZvciBOVUxMIGZpcnN0LgotICAgIGlmIChkZXhfaGFzaF8gPT0gTlVMTCkgewotICAgICAgICBkZXhfaGFzaF8gPSBuZXcgSGFzaFRhYmxlPERleEZpbGVMaXN0Kj4oMSwgTlVMTCk7Ci0gICAgfQotfQotCi0vLyBSZWFkcyB0aGUgbGlzdCBvZiBwaWQgZXZlbnRzIGxvb2tpbmcgZm9yIGFuIG1tYXAgb2YgYSBkZXggZmlsZS4KLVBpZEV2ZW50ICogVHJhY2VSZWFkZXJCYXNlOjpGaW5kTW1hcERleEZpbGVFdmVudCgpCi17Ci0gICAgc3RhdGljIFBpZEV2ZW50IGV2ZW50OwotCi0gICAgd2hpbGUgKCFwaWRfcmVhZGVyXy0+UmVhZFBpZEV2ZW50KCZldmVudCkpIHsKLSAgICAgICAgaWYgKGV2ZW50LnJlY190eXBlID09IGtQaWRNbWFwICYmIGV2ZW50LnBhdGggIT0gZXZlbnQubW1hcF9wYXRoKSB7Ci0gICAgICAgICAgICByZXR1cm4gJmV2ZW50OwotICAgICAgICB9Ci0gICAgICAgIHBpZF9yZWFkZXJfLT5EaXNwb3NlKCZldmVudCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBDb3B5RGV4U3ltYm9sc1RvQXJyYXkoRGV4RmlsZUxpc3QgKmRleGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV4U3ltTGlzdCAqaGVhZCwgaW50IG51bV9zeW1ib2xzKQotewotICAgIGlmIChkZXhmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIERleFN5bSAqc3ltYm9scyA9IE5VTEw7Ci0gICAgaWYgKG51bV9zeW1ib2xzID4gMCkgewotICAgICAgICBzeW1ib2xzID0gbmV3IERleFN5bVtudW1fc3ltYm9sc107Ci0gICAgfQotICAgIGRleGZpbGUtPm5zeW1ib2xzID0gbnVtX3N5bWJvbHM7Ci0gICAgZGV4ZmlsZS0+c3ltYm9scyA9IHN5bWJvbHM7Ci0gICAgCi0gICAgLy8gQ29weSB0aGUgbGlua2VkLWxpc3QgdG8gdGhlIGFycmF5LgotICAgIERleFN5bUxpc3QgKm5leHRfc3ltID0gTlVMTDsKLSAgICBpbnQgbmV4dF9pbmRleCA9IDA7Ci0gICAgZm9yIChEZXhTeW1MaXN0ICpzeW0gPSBoZWFkOyBzeW07IHN5bSA9IG5leHRfc3ltKSB7Ci0gICAgICAgIG5leHRfc3ltID0gc3ltLT5uZXh0OwotICAgICAgICBzeW1ib2xzW25leHRfaW5kZXhdLmFkZHIgPSBzeW0tPnN5bS5hZGRyOwotICAgICAgICBzeW1ib2xzW25leHRfaW5kZXhdLmxlbiA9IHN5bS0+c3ltLmxlbjsKLSAgICAgICAgc3ltYm9sc1tuZXh0X2luZGV4XS5uYW1lID0gc3ltLT5zeW0ubmFtZTsKLSAgICAgICAgbmV4dF9pbmRleCArPSAxOwotICAgICAgICBkZWxldGUgc3ltOwotICAgIH0KLX0KLQotdm9pZCBUcmFjZVJlYWRlckJhc2U6OlBhcnNlRGV4TGlzdChjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtCdWZTaXplID0gNDA5NjsKLSAgICBjaGFyIGJ1ZltrQnVmU2l6ZV07Ci0gICAgY2hhciBjdXJyZW50X2ZpbGVba0J1ZlNpemVdOwotCi0gICAgLy8gRmluZCBhbiBleGFtcGxlIGRleCBmaWxlIGluIHRoZSBsaXN0IG9mIG1tYXBzCi0gICAgUGlkRXZlbnQgKmV2ZW50ID0gRmluZE1tYXBEZXhGaWxlRXZlbnQoKTsKLQotICAgIC8vIFJlc2V0IHRoZSBwaWRfcmVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAgcGlkX3JlYWRlcl8tPkNsb3NlKCk7Ci0gICAgcGlkX3JlYWRlcl8tPk9wZW4oZmlsZW5hbWUpOwotCi0gICAgLy8gSWYgdGhlcmUgd2VyZSBubyBtbWFwcGVkIGRleCBmaWxlcywgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHBhcnNlCi0gICAgLy8gdGhlIGRleGxpc3QuCi0gICAgaWYgKGV2ZW50ID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBjaGFyICptbWFwX2RleGZpbGUgPSBldmVudC0+cGF0aDsKLQotICAgIC8vIENoZWNrIGlmIHRoZSBkZXhsaXN0IGZpbGUgZXhpc3RzLiAgSXQgc2hvdWxkIGhhdmUgdGhlIG5hbWUKLSAgICAvLyAicXRyYWNlLmRleGxpc3QiCi0gICAgY2hhciAqZm5hbWUgPSBDcmVhdGVUcmFjZVBhdGgoZmlsZW5hbWUsICIuZGV4bGlzdCIpOwotICAgIGludCBydmFsID0gc3RhdChmbmFtZSwgJnN0YXRfYnVmKTsKLSAgICBpZiAocnZhbCA9PSAtMSkgewotICAgICAgICAvLyBUaGUgZmlsZSBkb2VzIG5vdCBleGlzdAotICAgICAgICBkZWxldGVbXSBmbmFtZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE9wZW4gdGhlIHF0cmFjZS5kZXhsaXN0IGZpbGUKLSAgICBGSUxFICpmc3RyZWFtID0gZm9wZW4oZm5hbWUsICJyIik7Ci0gICAgaWYgKGZzdHJlYW0gPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoZm5hbWUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8vIEZpcnN0IHBhc3M6IHJlYWQgYWxsIHRoZSBmaWxlbmFtZXMsIGxvb2tpbmcgZm9yIGEgbWF0Y2ggZm9yIHRoZQotICAgIC8vIGV4YW1wbGUgbW1hcCBkZXggZmlsZW5hbWUuICBBbHNvIGNvdW50IHRoZSBmaWxlcyBzbyB0aGF0IHdlCi0gICAgLy8ga25vdyBob3cgYmlnIHRvIG1ha2UgdGhlIGhhc2ggdGFibGUuCi0gICAgY2hhciAqbWF0Y2ggPSBOVUxMOwotICAgIGludCBudW1fZmlsZXMgPSAwOwotICAgIHdoaWxlIChmZ2V0cyhidWYsIGtCdWZTaXplLCBmc3RyZWFtKSkgewotICAgICAgICBpZiAoYnVmWzBdICE9ICcjJykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBudW1fZmlsZXMgKz0gMTsKLSAgICAgICAgbWF0Y2ggPSBzdHJzdHIoYnVmICsgMSwgbW1hcF9kZXhmaWxlKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBkZXhsaXN0IGZpbGUgZW5kcyB3aXRoIHRoZSBzdHJpbmcgbW1hcF9kZXhmaWxlLgotICAgICAgICAvLyBXZSBhZGQgb25lIHRvIHRoZSBsZW5ndGggb2YgdGhlIG1tYXBfZGV4ZmlsZSBiZWNhdXNlIGJ1ZltdCi0gICAgICAgIC8vIGVuZHMgd2l0aCBhIG5ld2xpbmUuICBUaGUgc3RybGVuKG1tYXBfZGV4ZmlsZSkgY29tcHV0YXRpb24KLSAgICAgICAgLy8gY291bGQgYmUgbW92ZWQgYWJvdmUgdGhlIGxvb3AgYnV0IGl0IHNob3VsZCBvbmx5IGV2ZXIgYmUKLSAgICAgICAgLy8gZXhlY3V0ZWQgb25jZS4KLSAgICAgICAgaWYgKG1hdGNoICE9IE5VTEwgJiYgc3RybGVuKG1hdGNoKSA9PSBzdHJsZW4obW1hcF9kZXhmaWxlKSArIDEpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCB0aGUgcmVzdCBvZiB0aGUgZmlsZXMKLSAgICB3aGlsZSAoZmdldHMoYnVmLCBrQnVmU2l6ZSwgZnN0cmVhbSkpIHsKLSAgICAgICAgaWYgKGJ1ZlswXSA9PSAnIycpCi0gICAgICAgICAgICBudW1fZmlsZXMgKz0gMTsKLSAgICB9Ci0KLSAgICBpZiAobWF0Y2ggPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgdGhlIG1tYXBwZWQgZGV4IGZpbGUgJyVzJyBpbiB0aGUgZGV4bGlzdFxuIiwKLSAgICAgICAgICAgICAgICBtbWFwX2RleGZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBkZWxldGVbXSBtbWFwX2RleGZpbGU7Ci0KLSAgICAvLyBUaGUgcHJlZml4IGxlbmd0aCBpbmNsdWRlcyB0aGUgbGVhZGluZyAnIycuCi0gICAgaW50IHByZWZpeF9sZW4gPSBtYXRjaCAtIGJ1ZjsKLQotICAgIC8vIEFsbG9jYXRlIGEgaGFzaCB0YWJsZQotICAgIGRleF9oYXNoXyA9IG5ldyBIYXNoVGFibGU8RGV4RmlsZUxpc3QqPig0ICogbnVtX2ZpbGVzLCBOVUxMKTsKLQotICAgIC8vIFJlc2V0IHRoZSBmaWxlIHN0cmVhbSB0byB0aGUgYmVnaW5uaW5nCi0gICAgcmV3aW5kKGZzdHJlYW0pOwotCi0gICAgLy8gU2Vjb25kIHBhc3M6IHJlYWQgdGhlIGZpbGVuYW1lcywgc3RyaXBwaW5nIG9mZiB0aGUgY29tbW9uIHByZWZpeC4KLSAgICAvLyBBbmQgcmVhZCBhbGwgdGhlIChhZGRyZXNzLCBtZXRob2QpIG1hcHBpbmdzLiAgV2hlbiB3ZSByZWFkIGEgbmV3Ci0gICAgLy8gZmlsZW5hbWUsIGNyZWF0ZSBhIG5ldyBEZXhGaWxlTGlzdCBhbmQgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlLgotICAgIC8vIEFkZCBuZXcgc3ltYm9sIG1hcHBpbmdzIHRvIGEgbGlua2VkIGxpc3QgdW50aWwgd2UgaGF2ZSB0aGUgd2hvbGUKLSAgICAvLyBsaXN0IGFuZCB0aGVuIGNyZWF0ZSBhbiBhcnJheSBmb3IgdGhlbSBzbyB0aGF0IHdlIGNhbiB1c2UgYmluYXJ5Ci0gICAgLy8gc2VhcmNoIG9uIHRoZSBhZGRyZXNzIHRvIGZpbmQgdGhlIHN5bWJvbCBuYW1lIHF1aWNrbHkuCi0KLSAgICAvLyBVc2UgYSBsaW5rZWQgbGlzdCBmb3Igc3RvcmluZyB0aGUgc3ltYm9scwotICAgIERleFN5bUxpc3QgKmhlYWQgPSBOVUxMOwotICAgIERleFN5bUxpc3QgKnByZXYgPSBOVUxMOwotICAgIGludCBudW1fc3ltYm9scyA9IDA7Ci0KLSAgICBEZXhGaWxlTGlzdCAqZGV4ZmlsZSA9IE5VTEw7Ci0gICAgaW50IGxpbmVudW0gPSAwOwotICAgIHdoaWxlIChmZ2V0cyhidWYsIGtCdWZTaXplLCBmc3RyZWFtKSkgewotICAgICAgICBsaW5lbnVtICs9IDE7Ci0gICAgICAgIGlmIChidWZbMF0gPT0gJyMnKSB7Ci0gICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGFmdGVyIHRoZSAnIycgaXMgYSBmaWxlbmFtZS4KLSAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgY29tbW9uIHByZWZpeC4KLQotICAgICAgICAgICAgLy8gRmlyc3QsIHNhdmUgYWxsIHRoZSBzeW1ib2xzIGZyb20gdGhlIHByZXZpb3VzIGZpbGUgKGlmIGFueSkuCi0gICAgICAgICAgICBDb3B5RGV4U3ltYm9sc1RvQXJyYXkoZGV4ZmlsZSwgaGVhZCwgbnVtX3N5bWJvbHMpOwotCi0gICAgICAgICAgICBkZXhmaWxlID0gbmV3IERleEZpbGVMaXN0OwotICAgICAgICAgICAgLy8gU3VidHJhY3Qgb25lIGJlY2F1c2UgYnVmW10gY29udGFpbnMgYSB0cmFpbGluZyBuZXdsaW5lCi0gICAgICAgICAgICBpbnQgcGF0aGxlbiA9IHN0cmxlbihidWYpIC0gcHJlZml4X2xlbiAtIDE7Ci0gICAgICAgICAgICBjaGFyICpwYXRoID0gbmV3IGNoYXJbcGF0aGxlbiArIDFdOwotICAgICAgICAgICAgc3RybmNweShwYXRoLCBidWYgKyBwcmVmaXhfbGVuLCBwYXRobGVuKTsKLSAgICAgICAgICAgIHBhdGhbcGF0aGxlbl0gPSAwOwotICAgICAgICAgICAgZGV4ZmlsZS0+cGF0aCA9IHBhdGg7Ci0gICAgICAgICAgICBkZXhmaWxlLT5uc3ltYm9scyA9IDA7Ci0gICAgICAgICAgICBkZXhmaWxlLT5zeW1ib2xzID0gTlVMTDsKLSAgICAgICAgICAgIGRleF9oYXNoXy0+VXBkYXRlKHBhdGgsIGRleGZpbGUpOwotICAgICAgICAgICAgbnVtX3N5bWJvbHMgPSAwOwotICAgICAgICAgICAgaGVhZCA9IE5VTEw7Ci0gICAgICAgICAgICBwcmV2ID0gTlVMTDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgYWRkcjsKLSAgICAgICAgaW50IGxlbiwgbGluZTsKLSAgICAgICAgY2hhciBjbGF6eltrQnVmU2l6ZV0sIG1ldGhvZFtrQnVmU2l6ZV0sIHNpZ1trQnVmU2l6ZV0sIGZpbGVba0J1ZlNpemVdOwotICAgICAgICBpZiAoc3NjYW5mKGJ1ZiwgIjB4JXggJWQgJXMgJXMgJXMgJXMgJWQiLAotICAgICAgICAgICAgICAgICAgICZhZGRyLCAmbGVuLCBjbGF6eiwgbWV0aG9kLCBzaWcsIGZpbGUsICZsaW5lKSAhPSA3KSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBwYXJzZSBsaW5lICVkIG9mIGZpbGUgJXM6XG4lcyIsCi0gICAgICAgICAgICAgICAgICAgIGxpbmVudW0sIGZuYW1lLCBidWYpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSBjbGFzcyBuYW1lLCBtZXRob2QgbmFtZSwgYW5kIHNpZ25hdHVyZQotICAgICAgICAvLyBwbHVzIG9uZSBmb3IgdGhlIHBlcmlvZCBzZXBhcmF0aW5nIHRoZSBjbGFzcyBhbmQgbWV0aG9kLgotICAgICAgICBpbnQgbmNoYXJzID0gc3RybGVuKGNsYXp6KSArIHN0cmxlbihtZXRob2QpICsgc3RybGVuKHNpZykgKyAxOwotICAgICAgICBjaGFyICpuYW1lID0gbmV3IGNoYXJbbmNoYXJzICsgMV07Ci0gICAgICAgIHN0cmNweShuYW1lLCBjbGF6eik7Ci0gICAgICAgIHN0cmNhdChuYW1lLCAiLiIpOwotICAgICAgICBzdHJjYXQobmFtZSwgbWV0aG9kKTsKLSAgICAgICAgc3RyY2F0KG5hbWUsIHNpZyk7Ci0KLSAgICAgICAgRGV4U3ltTGlzdCAqc3ltYm9sID0gbmV3IERleFN5bUxpc3Q7Ci0gICAgICAgIHN5bWJvbC0+c3ltLmFkZHIgPSBhZGRyOwotICAgICAgICBzeW1ib2wtPnN5bS5sZW4gPSBsZW47Ci0gICAgICAgIHN5bWJvbC0+c3ltLm5hbWUgPSBuYW1lOwotICAgICAgICBzeW1ib2wtPm5leHQgPSBOVUxMOwotCi0gICAgICAgIC8vIEtlZXAgdGhlIGxpc3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGZpbGUKLSAgICAgICAgaWYgKGhlYWQgPT0gTlVMTCkKLSAgICAgICAgICAgIGhlYWQgPSBzeW1ib2w7Ci0gICAgICAgIGlmIChwcmV2ICE9IE5VTEwpCi0gICAgICAgICAgICBwcmV2LT5uZXh0ID0gc3ltYm9sOwotICAgICAgICBwcmV2ID0gc3ltYm9sOwotICAgICAgICBudW1fc3ltYm9scyArPSAxOwotICAgIH0KLSAgICBmY2xvc2UoZnN0cmVhbSk7Ci0KLSAgICAvLyBDb3B5IHRoZSBzeW1ib2xzIGZyb20gdGhlIGxhc3QgZmlsZS4KLSAgICBDb3B5RGV4U3ltYm9sc1RvQXJyYXkoZGV4ZmlsZSwgaGVhZCwgbnVtX3N5bWJvbHMpOwotICAgIGRlbGV0ZVtdIGZuYW1lOwotfQotCi0vLyBFeHRyYWN0cyB0aGUgcGF0aG5hbWUgdG8gYSBqYXIgZmlsZSAob3IgLmFwayBmaWxlKSBmcm9tIHRoZSBtbWFwIHBhdGhuYW1lLgotLy8gQW4gZXhhbXBsZSBtbWFwIHBhdGhuYW1lIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0vLyAgIC9kYXRhL2RhbHZpay1jYWNoZS9zeXN0ZW1AYXBwQFRlc3RIYXJuZXNzLmFwa0BjbGFzc2VzLmRleAotLy8gV2Ugd2FudCB0byBjb252ZXJ0IHRoYXQgdG8gdGhpczoKLS8vICAgL3N5c3RlbS9hcHAvVGVzdEhhcm5lc3MuYXBrCi0vLyBJZiB0aGUgcGF0aG5hbWUgaXMgbm90IG9mIHRoZSBleHBlY3RlZCBmb3JtLCB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCi0vLyBUaGUgc3BhY2UgZm9yIHRoZSBleHRyYWN0ZWQgcGF0aCBpcyBhbGxvY2F0ZWQgaW4gdGhpcyByb3V0aW5lIGFuZCBzaG91bGQKLS8vIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLXN0YXRpYyBjaGFyICpFeHRyYWN0RGV4UGF0aEZyb21NbWFwKGNvbnN0IGNoYXIgKm1tYXBfcGF0aCkKLXsKLSAgICBjb25zdCBjaGFyICplbmQgPSByaW5kZXgobW1hcF9wYXRoLCAnQCcpOwotICAgIGlmIChlbmQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQgPSByaW5kZXgobW1hcF9wYXRoLCAnLycpOwotICAgIGlmIChzdGFydCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7Ci0gICAgY2hhciAqcGF0aCA9IG5ldyBjaGFyW2xlbiArIDFdOwotICAgIHN0cm5jcHkocGF0aCwgc3RhcnQsIGxlbik7Ci0gICAgcGF0aFtsZW5dID0gMDsKLQotICAgIC8vIFJlcGxhY2UgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiAnQCcgd2l0aCAnLycKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbGVuOyBpaSsrKSB7Ci0gICAgICAgIGlmIChwYXRoW2lpXSA9PSAnQCcpCi0gICAgICAgICAgICBwYXRoW2lpXSA9ICcvJzsKLSAgICB9Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLXZvaWQgVHJhY2VSZWFkZXJCYXNlOjpDbG9zZSgpCi17Ci0gICAgYmJfcmVhZGVyXy0+Q2xvc2UoKTsKLSAgICBpbnNuX3JlYWRlcl8tPkNsb3NlKCk7Ci0gICAgbG9hZF9hZGRyX3JlYWRlcl8tPkNsb3NlKCk7Ci0gICAgc3RvcmVfYWRkcl9yZWFkZXJfLT5DbG9zZSgpOwotICAgIGV4Y19yZWFkZXJfLT5DbG9zZSgpOwotICAgIHBpZF9yZWFkZXJfLT5DbG9zZSgpOwotICAgIG1ldGhvZF9yZWFkZXJfLT5DbG9zZSgpOwotICAgIGludGVybmFsX2V4Y19yZWFkZXJfLT5DbG9zZSgpOwotICAgIGludGVybmFsX3BpZF9yZWFkZXJfLT5DbG9zZSgpOwotICAgIGludGVybmFsX21ldGhvZF9yZWFkZXJfLT5DbG9zZSgpOwotICAgIGZjbG9zZShzdGF0aWNfZnN0cmVhbV8pOwotICAgIHN0YXRpY19mc3RyZWFtXyA9IE5VTEw7Ci19Ci0KLXZvaWQgVHJhY2VSZWFkZXJCYXNlOjpXcml0ZUhlYWRlcihUcmFjZUhlYWRlciAqaGVhZGVyKQotewotICAgIFRyYWNlSGVhZGVyIHN3YXBwZWRIZWFkZXI7Ci0KLSAgICBmcmVvcGVuKHN0YXRpY19maWxlbmFtZV8sICJyKyIsIHN0YXRpY19mc3RyZWFtXyk7Ci0gICAgZnNlZWsoc3RhdGljX2ZzdHJlYW1fLCAwLCBTRUVLX1NFVCk7Ci0KLSAgICBtZW1jcHkoJnN3YXBwZWRIZWFkZXIsIGhlYWRlciwgc2l6ZW9mKFRyYWNlSGVhZGVyKSk7Ci0KLSAgICBjb252ZXJ0MzIoc3dhcHBlZEhlYWRlci52ZXJzaW9uKTsKLSAgICBjb252ZXJ0MzIoc3dhcHBlZEhlYWRlci5zdGFydF9zZWMpOwotICAgIGNvbnZlcnQzMihzd2FwcGVkSGVhZGVyLnN0YXJ0X3VzZWMpOwotICAgIGNvbnZlcnQzMihzd2FwcGVkSGVhZGVyLnBkYXRlKTsKLSAgICBjb252ZXJ0MzIoc3dhcHBlZEhlYWRlci5wdGltZSk7Ci0gICAgY29udmVydDY0KHN3YXBwZWRIZWFkZXIubnVtX3N0YXRpY19iYik7Ci0gICAgY29udmVydDY0KHN3YXBwZWRIZWFkZXIubnVtX3N0YXRpY19pbnNuKTsKLSAgICBjb252ZXJ0NjQoc3dhcHBlZEhlYWRlci5udW1fZHluYW1pY19iYik7Ci0gICAgY29udmVydDY0KHN3YXBwZWRIZWFkZXIubnVtX2R5bmFtaWNfaW5zbik7Ci0gICAgY29udmVydDY0KHN3YXBwZWRIZWFkZXIuZWxhcHNlZF91c2Vjcyk7Ci0KLSAgICBmd3JpdGUoJnN3YXBwZWRIZWFkZXIsIHNpemVvZihUcmFjZUhlYWRlciksIDEsIHN0YXRpY19mc3RyZWFtXyk7Ci19Ci0KLS8vIFJlYWRzIHRoZSBuZXh0IFN0YXRpY1JlYyBmcm9tIHRoZSB0cmFjZSBmaWxlIChub3QgaW5jbHVkaW5nIHRoZSBsaXN0Ci0vLyBvZiBpbnN0cnVjdGlvbnMpLiAgT24gZW5kLW9mLWZpbGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLgotaW50IFRyYWNlUmVhZGVyQmFzZTo6UmVhZFN0YXRpYyhTdGF0aWNSZWMgKnJlYykKLXsKLSAgICBpbnQgcnZhbCA9IGZyZWFkKHJlYywgc2l6ZW9mKFN0YXRpY1JlYyksIDEsIHN0YXRpY19mc3RyZWFtXyk7Ci0gICAgaWYgKHJ2YWwgIT0gMSkgewotICAgICAgICBpZiAoZmVvZihzdGF0aWNfZnN0cmVhbV8pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwZXJyb3Ioc3RhdGljX2ZpbGVuYW1lXyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGNvbnZlcnQ2NChyZWMtPmJiX251bSk7Ci0gICAgY29udmVydDMyKHJlYy0+YmJfYWRkcik7Ci0gICAgY29udmVydDMyKHJlYy0+bnVtX2luc25zKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJlYWRzICJudW0iIGluc3RydWN0aW9ucyBpbnRvIHRoZSBhcnJheSAiaW5zbnMiIHdoaWNoIG11c3QgYmUgbGFyZ2UKLS8vIGVub3VnaCB0byBob2xkIHRoZSAibnVtIiBpbnN0cnVjdGlvbnMuCi0vLyBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGluc3RydWN0aW9ucyByZWFkLiAgVGhpcyB3aWxsIHVzdWFsbHkKLS8vIGJlICJudW0iIGJ1dCBtYXkgYmUgbGVzcyBpZiBlbmQtb2YtZmlsZSBvY2N1cnJlZC4KLWludCBUcmFjZVJlYWRlckJhc2U6OlJlYWRTdGF0aWNJbnNucyhpbnQgbnVtLCB1aW50MzJfdCAqaW5zbnMpCi17Ci0gICAgaWYgKG51bSA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpbnQgcnZhbCA9IGZyZWFkKGluc25zLCBzaXplb2YodWludDMyX3QpLCBudW0sIHN0YXRpY19mc3RyZWFtXyk7Ci0KLSAgICAvLyBDb252ZXJ0IGZyb20gbGl0dGxlLWVuZGlhbiwgaWYgbmVjZXNzYXJ5Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bTsgKytpaSkKLSAgICAgICAgY29udmVydDMyKGluc25zW2lpXSk7Ci0KLSAgICBpZiAocnZhbCAhPSBudW0pIHsKLSAgICAgICAgaWYgKGZlb2Yoc3RhdGljX2ZzdHJlYW1fKSkgewotICAgICAgICAgICAgcmV0dXJuIHJ2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcGVycm9yKHN0YXRpY19maWxlbmFtZV8pOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm4gcnZhbDsKLX0KLQotdm9pZCBUcmFjZVJlYWRlckJhc2U6OlRydW5jYXRlTGFzdEJsb2NrKHVpbnQzMl90IG51bV9pbnNucykKLXsKLSAgICB1aW50MzJfdCBpbnNuc1trTWF4SW5zblBlckJCXTsKLSAgICBTdGF0aWNSZWMgc3RhdGljX3JlYzsKLSAgICBsb25nIGxvYyA9IDAsIHByZXZfbG9jID0gMDsKLQotICAgIGZyZW9wZW4oc3RhdGljX2ZpbGVuYW1lXywgInIrIiwgc3RhdGljX2ZzdHJlYW1fKTsKLSAgICBmc2VlayhzdGF0aWNfZnN0cmVhbV8sIHNpemVvZihUcmFjZUhlYWRlciksIFNFRUtfU0VUKTsKLQotICAgIC8vIEZpbmQgdGhlIGxhc3QgcmVjb3JkCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgcHJldl9sb2MgPSBsb2M7Ci0gICAgICAgIGxvYyA9IGZ0ZWxsKHN0YXRpY19mc3RyZWFtXyk7Ci0KLSAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBieXRlLXN3YXAgc3RhdGljX3JlYyBoZXJlIGJlY2F1c2Ugd2UgYXJlIGp1c3QKLSAgICAgICAgLy8gcmVhZGluZyB0aGUgcmVjb3JkcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGxhc3Qgb25lLgotICAgICAgICBpbnQgcnZhbCA9IGZyZWFkKCZzdGF0aWNfcmVjLCBzaXplb2YoU3RhdGljUmVjKSwgMSwgc3RhdGljX2ZzdHJlYW1fKTsKLSAgICAgICAgaWYgKHJ2YWwgIT0gMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBSZWFkU3RhdGljSW5zbnMoc3RhdGljX3JlYy5udW1faW5zbnMsIGluc25zKTsKLSAgICB9Ci0gICAgaWYgKHByZXZfbG9jICE9IDApIHsKLSAgICAgICAgZnNlZWsoc3RhdGljX2ZzdHJlYW1fLCBwcmV2X2xvYywgU0VFS19TRVQpOwotICAgICAgICBzdGF0aWNfcmVjLm51bV9pbnNucyA9IG51bV9pbnNuczsKLQotICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byBieXRlLXN3YXAsIGJ1dCBqdXN0IHRoZSBmaWVsZCB0aGF0IHdlIGNoYW5nZWQuCi0gICAgICAgIGNvbnZlcnQzMihzdGF0aWNfcmVjLm51bV9pbnNucyk7Ci0gICAgICAgIGZ3cml0ZSgmc3RhdGljX3JlYywgc2l6ZW9mKFN0YXRpY1JlYyksIDEsIHN0YXRpY19mc3RyZWFtXyk7Ci0gICAgICAgIGludCBmZCA9IGZpbGVubyhzdGF0aWNfZnN0cmVhbV8pOwotICAgICAgICBsb25nIGxlbiA9IGZ0ZWxsKHN0YXRpY19mc3RyZWFtXyk7Ci0gICAgICAgIGxlbiArPSBudW1faW5zbnMgKiBzaXplb2YodWludDMyX3QpOwotICAgICAgICBmdHJ1bmNhdGUoZmQsIGxlbik7Ci0gICAgfQotfQotCi1pbnQgVHJhY2VSZWFkZXJCYXNlOjpGaW5kTnVtSW5zbnModWludDY0X3QgYmJfbnVtLCB1aW50NjRfdCBiYl9zdGFydF90aW1lKQotewotICAgIGludCBudW1faW5zbnM7Ci0KLSAgICAvLyBSZWFkIHRoZSBleGNlcHRpb24gdHJhY2UgZmlsZS4gICJiYl9yZWNudW1fIiBpcyB0aGUgbnVtYmVyIG9mCi0gICAgLy8gYmFzaWMgYmxvY2sgcmVjb3JkcyB0aGF0IGhhdmUgYmVlbiByZWFkIHNvIGZhciwgYW5kICJleGNfcmVjbnVtXyIKLSAgICAvLyBpcyB0aGUgcmVjb3JkIG51bWJlciBmcm9tIHRoZSBleGNlcHRpb24gdHJhY2UuCi0gICAgd2hpbGUgKCFleGNfZW5kXyAmJiBleGNfcmVjbnVtXyA8IGJiX3JlY251bV8pIHsKLSAgICAgICAgdWludDMyX3QgY3VycmVudF9wYywgdGFyZ2V0X3BjOwotICAgICAgICB1aW50NjRfdCB0aW1lOwotCi0gICAgICAgIGV4Y19lbmRfID0gaW50ZXJuYWxfZXhjX3JlYWRlcl8tPlJlYWRFeGMoJnRpbWUsICZjdXJyZW50X3BjLCAmZXhjX3JlY251bV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9wYywgJmV4Y19iYl9udW1fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGNfdGltZV8sICZleGNfbnVtX2luc25zXyk7Ci0gICAgfQotCi0gICAgLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGluIHRoaXMgYmFzaWMgYmxvY2ssIHRoZW4gdXNlIHRoZQotICAgIC8vIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBleGNlcHRpb24gcmVjb3JkLgotICAgIGlmICghZXhjX2VuZF8gJiYgZXhjX3JlY251bV8gPT0gYmJfcmVjbnVtXykgewotICAgICAgICBudW1faW5zbnMgPSBleGNfbnVtX2luc25zXzsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICAgIC8vIHN0YXRpYyBiYXNpYyBibG9jay4KLSAgICAgICAgbnVtX2luc25zID0gYmxvY2tzX1tiYl9udW1dLnJlYy5udW1faW5zbnM7Ci0gICAgfQotICAgIHJldHVybiBudW1faW5zbnM7Ci19Ci0KLS8vIEZpbmRzIHRoZSBjdXJyZW50IHBpZCBmb3IgdGhlIGdpdmVuIHRpbWUuICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHBpZAotLy8gdHJhY2UgZmlsZSBhbmQgYXNzdW1lcyB0aGF0IHRoZSAidGltZSIgcGFyYW1ldGVyIGlzIG1vbm90b25pY2FsbHkKLS8vIGluY3JlYXNpbmcuCi1pbnQgVHJhY2VSZWFkZXJCYXNlOjpGaW5kQ3VycmVudFBpZCh1aW50NjRfdCB0aW1lKQotewotICAgIFBpZEV2ZW50IGV2ZW50OwotCi0gICAgaWYgKHRpbWUgPCBuZXh0X3BpZF9zd2l0Y2hfdGltZV8pCi0gICAgICAgIHJldHVybiBjdXJyZW50X3BpZF87Ci0KLSAgICBjdXJyZW50X3BpZF8gPSBuZXh0X3BpZF87Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGludGVybmFsX3BpZF9yZWFkZXJfLT5SZWFkUGlkRXZlbnQoJmV2ZW50KSkgewotICAgICAgICAgICAgbmV4dF9waWRfc3dpdGNoX3RpbWVfID0gfjB1bGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQucmVjX3R5cGUgIT0ga1BpZFN3aXRjaCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoZXZlbnQudGltZSA+IHRpbWUpIHsKLSAgICAgICAgICAgIG5leHRfcGlkXyA9IGV2ZW50LnBpZDsKLSAgICAgICAgICAgIG5leHRfcGlkX3N3aXRjaF90aW1lXyA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50X3BpZF8gPSBldmVudC5waWQ7Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50X3BpZF87Ci19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmggYi9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWNiMWIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSNpZm5kZWYgVFJBQ0VfUkVBREVSX0gKLSNkZWZpbmUgVFJBQ0VfUkVBREVSX0gKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3h4YWJpLmg+Ci0jaW5jbHVkZSAicmVhZF9lbGYuaCIKLSNpbmNsdWRlICJ0cmFjZV9yZWFkZXJfYmFzZS5oIgotI2luY2x1ZGUgImhhc2hfdGFibGUuaCIKLQotc3RydWN0IFRyYWNlUmVhZGVyRW1wdHlTdHJ1Y3QgewotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQgPSBUcmFjZVJlYWRlckVtcHR5U3RydWN0PgotY2xhc3MgVHJhY2VSZWFkZXIgOiBwdWJsaWMgVHJhY2VSZWFkZXJCYXNlIHsKLSAgcHVibGljOgotCi0gICAgc3RydWN0IHJlZ2lvbl9lbnRyeTsKLSAgICB0eXBlZGVmIHN0cnVjdCBzeW1ib2xfZW50cnkgOiBwdWJsaWMgVCB7Ci0gICAgICAgIHR5cGVkZWYgcmVnaW9uX2VudHJ5IHJlZ2lvbl90eXBlOwotCi0gICAgICAgIC8vIERlZmluZSBmbGFnIHZhbHVlcwotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0lzUGx0ID0gMHgwMTsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJc1ZlY3RvclN0YXJ0ID0gMHgwMjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJc1ZlY3RvclRhYmxlID0gKGtJc1BsdCB8IGtJc1ZlY3RvclN0YXJ0KTsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJc0ludGVycHJldGVyID0gMHgwNDsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJc01ldGhvZCA9IDB4MDg7Ci0KLSAgICAgICAgdWludDMyX3QgICAgICAgIGFkZHI7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgaG9sZCB0aGUgbmFtZSBvZiB0aGUgaW50ZXJwcmV0ZWQgbWV0aG9kIGluc3RlYWQgb2YKLSAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIG5hdGl2ZSBmdW5jdGlvbiBpZiB0aGUgbmF0aXZlIGZ1bmN0aW9uIGlzIGEKLSAgICAgICAgLy8gdmlydHVhbCBtYWNoaW5lIGludGVycHJldGVyLgotICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWU7Ci0KLSAgICAgICAgLy8gVGhlIHN5bWJvbCBmb3IgdGhlIHZpcnR1YWwgbWFjaGluZSBpbnRlcnByZXRlciwgb3IgTlVMTAotICAgICAgICBzeW1ib2xfZW50cnkgICAgKnZtX3N5bTsKLSAgICAgICAgcmVnaW9uX3R5cGUgICAgICpyZWdpb247Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBmbGFnczsKLSAgICB9IHN5bWJvbF90eXBlOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgcmVnaW9uX2VudHJ5IHsKLSAgICAgICAgLy8gRGVmaW5lIGZsYWcgdmFsdWVzCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSXNLZXJuZWxSZWdpb24gICAgICAgICAgID0gMHgwMTsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTaGFyZWRTeW1ib2xzICAgICAgICAgICAgPSAweDAyOwotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0lzTGlicmFyeVJlZ2lvbiAgICAgICAgICA9IDB4MDQ7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSXNVc2VyTWFwcGVkUmVnaW9uICAgICAgID0gMHgwODsKLQotICAgICAgICByZWdpb25fZW50cnkoKSA6IHJlZnMoMCksIHBhdGgoTlVMTCksIHZzdGFydCgwKSwgdmVuZCgwKSwgYmFzZV9hZGRyKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb2Zmc2V0KDApLCBmbGFncygwKSwgbnN5bWJvbHMoMCksIHN5bWJvbHMoTlVMTCkge30KLQotICAgICAgICBzeW1ib2xfdHlwZSAgICAqTG9va3VwRnVuY3Rpb25CeU5hbWUoY2hhciAqbmFtZSkgewotICAgICAgICAgICAgLy8gSnVzdCBkbyBhIGxpbmVhciBzZWFyY2gKLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuc3ltYm9sczsgKytpaSkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoc3ltYm9sc1tpaV0ubmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZzeW1ib2xzW2lpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVnaW9uX2VudHJ5ICAgKk1ha2VQcml2YXRlQ29weShyZWdpb25fZW50cnkgKmRlc3QpIHsKLSAgICAgICAgICAgIGRlc3QtPnJlZnMgPSAwOwotICAgICAgICAgICAgZGVzdC0+cGF0aCA9IFN0cmR1cChwYXRoKTsKLSAgICAgICAgICAgIGRlc3QtPnZzdGFydCA9IHZzdGFydDsKLSAgICAgICAgICAgIGRlc3QtPnZlbmQgPSB2ZW5kOwotICAgICAgICAgICAgZGVzdC0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOwotICAgICAgICAgICAgZGVzdC0+ZmlsZV9vZmZzZXQgPSBmaWxlX29mZnNldDsKLSAgICAgICAgICAgIGRlc3QtPmZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICBkZXN0LT5uc3ltYm9scyA9IG5zeW1ib2xzOwotICAgICAgICAgICAgZGVzdC0+c3ltYm9scyA9IHN5bWJvbHM7Ci0gICAgICAgICAgICByZXR1cm4gZGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCAgICAgICAgICAgICByZWZzOyAgICAgICAgLy8gcmVmZXJlbmNlIGNvdW50Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAqcGF0aDsKLSAgICAgICAgdWludDMyX3QgICAgICAgIHZzdGFydDsKLSAgICAgICAgdWludDMyX3QgICAgICAgIHZlbmQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBiYXNlX2FkZHI7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBmaWxlX29mZnNldDsKLSAgICAgICAgdWludDMyX3QgICAgICAgIGZsYWdzOwotICAgICAgICBpbnQgICAgICAgICAgICAgbnN5bWJvbHM7Ci0gICAgICAgIHN5bWJvbF90eXBlICAgICAqc3ltYm9sczsKLSAgICB9IHJlZ2lvbl90eXBlOwotCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBIYXNoVGFibGU8cmVnaW9uX3R5cGUqPjo6ZW50cnlfdHlwZSBoYXNoX2VudHJ5X3R5cGU7Ci0KLSAgICBjbGFzcyBQcm9jZXNzU3RhdGUgewotICAgICAgcHVibGljOgotCi0gICAgICAgIC8vIFRoZSAicmVnaW9ucyIgYXJyYXkgYmVsb3cgaXMgYSBwb2ludGVyIHRvIGFycmF5IG9mIHBvaW50ZXJzIHRvCi0gICAgICAgIC8vIHJlZ2lvbnMuICBUaGUgc2l6ZSBvZiB0aGUgcG9pbnRlciBhcnJheSBpcyBrSW5pdGlhbE51bVJlZ2lvbnMsCi0gICAgICAgIC8vIGJ1dCBncm93cyBpZiBuZWVkZWQuICBUaGVyZSBpcyBhIHNlcGFyYXRlIHJlZ2lvbiBmb3IgZWFjaCBtbWFwCi0gICAgICAgIC8vIGNhbGwgd2hpY2ggaW5jbHVkZXMgc2hhcmVkIGxpYnJhcmllcyBhcyB3ZWxsIGFzIC5kZXggYW5kIC5qYXIKLSAgICAgICAgLy8gZmlsZXMuICBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgYSByZWdpb24gZm9yIHRoZSBtYWluIGV4ZWN1dGFibGUKLSAgICAgICAgLy8gZm9yIHRoaXMgcHJvY2VzcywgYXMgd2VsbCBhcyBhIGZldyByZWdpb25zIGZvciB0aGUga2VybmVsLgotICAgICAgICAvLwotICAgICAgICAvLyBJZiBhIGNoaWxkIHByb2Nlc3MgaXMgYSBjbG9uZSBvZiBhIHBhcmVudCBwcm9jZXNzLCB0aGUKLSAgICAgICAgLy8gcmVnaW9ucyBhcnJheSBpcyB1bnVzZWQuICBJbnN0ZWFkLCB0aGUgImFkZHJfbWFuYWdlciIgcG9pbnRlciBpcwotICAgICAgICAvLyB1c2VkIHRvIGZpbmQgdGhlIHByb2Nlc3MgdGhhdCBpcyB0aGUgYWRkcmVzcyBzcGFjZSBtYW5hZ2VyIGZvcgotICAgICAgICAvLyBib3RoIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3Nlcy4KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbE51bVJlZ2lvbnMgPSAxMDsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhNZXRob2RTdGFja1NpemUgPSAxMDAwOwotCi0gICAgICAgIC8vIERlZmluZSB2YWx1ZXMgZm9yIHRoZSBQcm9jZXNzU3RhdGUgZmxhZyBiaXRzCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0NhbGxlZEV4ZWMgICAgICAgICAgICA9IDB4MDE7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0NhbGxlZEV4aXQgICAgICAgICAgICA9IDB4MDI7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0lzQ2xvbmUgICAgICAgICAgICAgICA9IDB4MDQ7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0hhc0tlcm5lbFJlZ2lvbiAgICAgICA9IDB4MDg7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0hhc0ZpcnN0TW1hcCAgICAgICAgICA9IDB4MTA7Ci0KLSAgICAgICAgc3RydWN0IG1ldGhvZEZyYW1lIHsKLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGFkZHI7Ci0gICAgICAgICAgICBib29sICAgICAgICBpc05hdGl2ZTsKLSAgICAgICAgfTsKLQotICAgICAgICBQcm9jZXNzU3RhdGUoKSB7Ci0gICAgICAgICAgICBjcHVfdGltZSA9IDA7Ci0gICAgICAgICAgICB0Z2lkID0gMDsKLSAgICAgICAgICAgIHBpZCA9IDA7Ci0gICAgICAgICAgICBwYXJlbnRfcGlkID0gMDsKLSAgICAgICAgICAgIGV4aXRfdmFsID0gMDsKLSAgICAgICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgICAgIGFyZ2MgPSAwOwotICAgICAgICAgICAgYXJndiA9IE5VTEw7Ci0gICAgICAgICAgICBuYW1lID0gTlVMTDsKLSAgICAgICAgICAgIG5yZWdpb25zID0gMDsKLSAgICAgICAgICAgIG1heF9yZWdpb25zID0gMDsKLSAgICAgICAgICAgIC8vIERvbid0IGFsbG9jYXRlIHNwYWNlIHlldCB1bnRpbCB3ZSBrbm93IGlmIHdlIGFyZSBhIGNsb25lLgotICAgICAgICAgICAgcmVnaW9ucyA9IE5VTEw7Ci0gICAgICAgICAgICBwYXJlbnQgPSBOVUxMOwotICAgICAgICAgICAgYWRkcl9tYW5hZ2VyID0gdGhpczsKLSAgICAgICAgICAgIG5leHQgPSBOVUxMOwotICAgICAgICAgICAgY3VycmVudF9tZXRob2Rfc3ltID0gTlVMTDsKLSAgICAgICAgICAgIG1ldGhvZF9zdGFja190b3AgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgflByb2Nlc3NTdGF0ZSgpIHsKLSAgICAgICAgICAgIGRlbGV0ZVtdIG5hbWU7Ci0gICAgICAgICAgICBpZiAoKGZsYWdzICYga0lzQ2xvbmUpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZyZWUgdGhlIHJlZ2lvbnMuICBXZSBtdXN0IGJlIGNhcmVmdWwgbm90IHRvIGZyZWUgdGhlIHN5bWJvbHMKLSAgICAgICAgICAgIC8vIHdpdGhpbiBlYWNoIHJlZ2lvbiBiZWNhdXNlIHRoZSBzeW1ib2xzIGFyZSBzb21ldGltZXMgc2hhcmVkCi0gICAgICAgICAgICAvLyBiZXR3ZWVuIG11bHRpcGxlIHJlZ2lvbnMuICBUaGUgVHJhY2VSZWFkZXIgY2xhc3MgaGFzIGEgaGFzaAotICAgICAgICAgICAgLy8gdGFibGUgY29udGFpbmluZyBhbGwgdGhlIHVuaXF1ZSByZWdpb25zIGFuZCBpdCB3aWxsIGZyZWUgdGhlCi0gICAgICAgICAgICAvLyByZWdpb24gc3ltYm9scyBpbiBpdHMgZGVzdHJ1Y3Rvci4gIFdlIG5lZWQgdG8gZnJlZSBvbmx5IHRoZQotICAgICAgICAgICAgLy8gcmVnaW9ucyBhbmQgdGhlIGFycmF5IG9mIHJlZ2lvbiBwb2ludGVycy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBFYWNoIHJlZ2lvbiBpcyBhbHNvIHJlZmVyZW5jZS1jb3VudGVkLiAgVGhlIGNvdW50IGlzIHplcm8KLSAgICAgICAgICAgIC8vIGlmIG5vIG90aGVyIHByb2Nlc3NlcyBhcmUgc2hhcmluZyB0aGlzIHJlZ2lvbi4KLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBucmVnaW9uczsgaWkrKykgewotICAgICAgICAgICAgICAgIGlmIChyZWdpb25zW2lpXS0+cmVmcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaW9uc1tpaV0tPnJlZnMgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJlZ2lvbnNbaWldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWxldGVbXSByZWdpb25zOwotCi0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgYXJnYzsgKytpaSkKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBhcmd2W2lpXTsKLSAgICAgICAgICAgIGRlbGV0ZVtdIGFyZ3Y7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEdW1wcyB0aGUgc3RhY2sgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LiAgRm9yIGRlYnVnZ2luZy4KLSAgICAgICAgdm9pZCAgICAgICAgICAgIER1bXBTdGFjayhGSUxFICpzdHJlYW0pOwotCi0gICAgICAgIHVpbnQ2NF90ICAgICAgICBjcHVfdGltZTsKLSAgICAgICAgdWludDY0X3QgICAgICAgIHN0YXJ0X3RpbWU7Ci0gICAgICAgIHVpbnQ2NF90ICAgICAgICBlbmRfdGltZTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIHRnaWQ7Ci0gICAgICAgIGludCAgICAgICAgICAgICBwaWQ7Ci0gICAgICAgIGludCAgICAgICAgICAgICBwYXJlbnRfcGlkOwotICAgICAgICBpbnQgICAgICAgICAgICAgZXhpdF92YWw7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBmbGFnczsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGFyZ2M7Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAqKmFyZ3Y7Ci0gICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG5yZWdpb25zOyAgICAgICAgLy8gbnVtIHJlZ2lvbnMgaW4gdXNlCi0gICAgICAgIGludCAgICAgICAgICAgICBtYXhfcmVnaW9uczsgICAgIC8vIG1heCByZWdpb25zIGFsbG9jYXRlZAotICAgICAgICByZWdpb25fdHlwZSAgICAgKipyZWdpb25zOwotICAgICAgICBQcm9jZXNzU3RhdGUgICAgKnBhcmVudDsKLSAgICAgICAgUHJvY2Vzc1N0YXRlICAgICphZGRyX21hbmFnZXI7ICAgLy8gdGhlIGFkZHJlc3Mgc3BhY2UgbWFuYWdlciBwcm9jZXNzCi0gICAgICAgIFByb2Nlc3NTdGF0ZSAgICAqbmV4dDsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG1ldGhvZF9zdGFja190b3A7Ci0gICAgICAgIG1ldGhvZEZyYW1lICAgICBtZXRob2Rfc3RhY2tba01heE1ldGhvZFN0YWNrU2l6ZV07Ci0gICAgICAgIHN5bWJvbF90eXBlICAgICAqY3VycmVudF9tZXRob2Rfc3ltOwotICAgIH07Ci0KLSAgICBUcmFjZVJlYWRlcigpOwotICAgIH5UcmFjZVJlYWRlcigpOwotCi0gICAgdm9pZCAgICAgICAgICAgICAgICBSZWFkS2VybmVsU3ltYm9scyhjb25zdCBjaGFyICprZXJuZWxfZmlsZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDb3B5S2VybmVsUmVnaW9uKFByb2Nlc3NTdGF0ZSAqcHN0YXRlKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIENsZWFyUmVnaW9ucyhQcm9jZXNzU3RhdGUgKnBzdGF0ZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDb3B5UmVnaW9ucyhQcm9jZXNzU3RhdGUgKnBhcmVudCwgUHJvY2Vzc1N0YXRlICpjaGlsZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBEdW1wUmVnaW9ucyhGSUxFICpzdHJlYW0sIFByb2Nlc3NTdGF0ZSAqcHN0YXRlKTsKLSAgICBzeW1ib2xfdHlwZSAgICAgICAgICpMb29rdXBGdW5jdGlvbihpbnQgcGlkLCB1aW50MzJfdCBhZGRyLCB1aW50NjRfdCB0aW1lKTsKLSAgICBzeW1ib2xfdHlwZSAgICAgICAgICpHZXRTeW1ib2xzKGludCAqbnVtX3N5bXMpOwotICAgIFByb2Nlc3NTdGF0ZSAgICAgICAgKkdldEN1cnJlbnRQcm9jZXNzKCkgICAgICAgICAgICB7IHJldHVybiBjdXJyZW50XzsgfQotICAgIFByb2Nlc3NTdGF0ZSAgICAgICAgKkdldFByb2Nlc3NlcyhpbnQgKm51bV9wcm9jcyk7Ci0gICAgUHJvY2Vzc1N0YXRlICAgICAgICAqR2V0TmV4dFByb2Nlc3MoKTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICpHZXRQcm9jZXNzTmFtZShpbnQgcGlkKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIFNldFJvb3QoY29uc3QgY2hhciAqcm9vdCkgICAgICAgeyByb290XyA9IHJvb3Q7IH0KLSAgICB2b2lkICAgICAgICAgICAgICAgIFNldERlbWFuZ2xlKGJvb2wgZGVtYW5nbGUpICAgICAgeyBkZW1hbmdsZV8gPSBkZW1hbmdsZTsgfQotICAgIGJvb2wgICAgICAgICAgICAgICAgUmVhZE1ldGhvZFN5bWJvbChNZXRob2RSZWMgKm1ldGhvZF9yZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF90eXBlICoqcHN5bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICoqcHByb2MpOwotCi0gIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludCBGaW5kQ3VycmVudFBpZCh1aW50NjRfdCB0aW1lKTsKLQotICBwcml2YXRlOgotCi0gICAgc3RhdGljIGNvbnN0IGludCBrTnVtUGlkcyA9IDMyNzY4OwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSW5jbHVkZUxvY2FsU3ltYm9scyA9IDB4MTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgQWRkUHJlZGVmaW5lZFJlZ2lvbihyZWdpb25fdHlwZSAqcmVnaW9uLCBjb25zdCBjaGFyICpwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2c3RhcnQsIHVpbnQzMl90IHZlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2UpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgSW5pdFJlZ2lvblN5bWJvbHMocmVnaW9uX3R5cGUgKnJlZ2lvbiwgaW50IG5zeW1ib2xzKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIEFkZFJlZ2lvblN5bWJvbChyZWdpb25fdHlwZSAqcmVnaW9uLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgQWRkUHJlZGVmaW5lZFJlZ2lvbnMoUHJvY2Vzc1N0YXRlICpwc3RhdGUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgZGVtYW5nbGVfbmFtZXMoaW50IG5mdW5jcywgc3ltYm9sX3R5cGUgKmZ1bmN0aW9ucyk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBSZWFkRWxmU3ltYm9scyhyZWdpb25fdHlwZSAqcmVnaW9uLCB1aW50MzJfdCBmbGFncyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBBZGRSZWdpb24oUHJvY2Vzc1N0YXRlICpwc3RhdGUsIHJlZ2lvbl90eXBlICpyZWdpb24pOwotICAgIHJlZ2lvbl90eXBlICAgICAgICAgKkZpbmRSZWdpb24odWludDMyX3QgYWRkciwgaW50IG5yZWdpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX3R5cGUgKipyZWdpb25zKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIEZpbmRSZWdpb25JbmRleCh1aW50MzJfdCBhZGRyLCBpbnQgbnJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl90eXBlICoqcmVnaW9ucyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBGaW5kQW5kUmVtb3ZlUmVnaW9uKFByb2Nlc3NTdGF0ZSAqcHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2c3RhcnQsIHVpbnQzMl90IHZlbmQpOwotICAgIHN5bWJvbF90eXBlICAgICAgICAgKkZpbmRGdW5jdGlvbih1aW50MzJfdCBhZGRyLCBpbnQgbnN5bXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF90eXBlICpzeW1ib2xzLCBib29sIGV4YWN0X21hdGNoKTsKLSAgICBzeW1ib2xfdHlwZSAgICAgICAgICpGaW5kQ3VycmVudE1ldGhvZChpbnQgcGlkLCB1aW50NjRfdCB0aW1lKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIFBvcHVsYXRlU3ltYm9sc0Zyb21EZXhGaWxlKGNvbnN0IERleEZpbGVMaXN0ICpkZXhmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX3R5cGUgKnJlZ2lvbik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBIYW5kbGVQaWRFdmVudChQaWRFdmVudCAqZXZlbnQpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgSGFuZGxlTWV0aG9kUmVjb3JkKFByb2Nlc3NTdGF0ZSAqcHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFJlYyAqbWV0aG9kX3JlYyk7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgIGNhY2hlZF9waWRfOwotICAgIHN5bWJvbF90eXBlICAgICAgICAgKmNhY2hlZF9mdW5jXzsKLSAgICBzeW1ib2xfdHlwZSAgICAgICAgIHVua25vd25fOwotICAgIGludCAgICAgICAgICAgICAgICAgbmV4dF9waWRfOwotCi0gICAgUGlkRXZlbnQgICAgICAgICAgICBuZXh0X3BpZF9ldmVudF87Ci0gICAgUHJvY2Vzc1N0YXRlICAgICAgICAqcHJvY2Vzc2VzX1trTnVtUGlkc107Ci0gICAgUHJvY2Vzc1N0YXRlICAgICAgICAqY3VycmVudF87Ci0gICAgTWV0aG9kUmVjICAgICAgICAgICBuZXh0X21ldGhvZF87Ci0gICAgdWludDY0X3QgICAgICAgICAgICBmdW5jdGlvbl9zdGFydF90aW1lXzsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICpyb290XzsKLSAgICBIYXNoVGFibGU8cmVnaW9uX3R5cGUqPiAqaGFzaF87Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBkZW1hbmdsZV87Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotVHJhY2VSZWFkZXI8VD46OlRyYWNlUmVhZGVyKCkKLXsKLSAgICBzdGF0aWMgUGlkRXZlbnQgZXZlbnRfbm9fYWN0aW9uOwotCi0gICAgY2FjaGVkX3BpZF8gPSAtMTsKLSAgICBjYWNoZWRfZnVuY18gPSBOVUxMOwotCi0gICAgbWVtc2V0KCZ1bmtub3duXywgMCwgc2l6ZW9mKHN5bWJvbF90eXBlKSk7Ci0gICAgdW5rbm93bl8ubmFtZSA9ICIodW5rbm93bikiOwotICAgIG5leHRfcGlkXyA9IDA7Ci0KLSAgICBtZW1zZXQoJmV2ZW50X25vX2FjdGlvbiwgMCwgc2l6ZW9mKFBpZEV2ZW50KSk7Ci0gICAgZXZlbnRfbm9fYWN0aW9uLnJlY190eXBlID0ga1BpZE5vQWN0aW9uOwotICAgIG5leHRfcGlkX2V2ZW50XyA9IGV2ZW50X25vX2FjdGlvbjsKLSAgICBmb3IgKGludCBpaSA9IDE7IGlpIDwga051bVBpZHM7ICsraWkpCi0gICAgICAgIHByb2Nlc3Nlc19baWldID0gTlVMTDsKLSAgICBjdXJyZW50XyA9IG5ldyBQcm9jZXNzU3RhdGU7Ci0gICAgcHJvY2Vzc2VzX1swXSA9IGN1cnJlbnRfOwotICAgIG5leHRfbWV0aG9kXy50aW1lID0gMDsKLSAgICBuZXh0X21ldGhvZF8uYWRkciA9IDA7Ci0gICAgbmV4dF9tZXRob2RfLmZsYWdzID0gMDsKLSAgICBmdW5jdGlvbl9zdGFydF90aW1lXyA9IDA7Ci0gICAgcm9vdF8gPSAiIjsKLSAgICBoYXNoXyA9IG5ldyBIYXNoVGFibGU8cmVnaW9uX3R5cGUqPig1MTIpOwotICAgIEFkZFByZWRlZmluZWRSZWdpb25zKGN1cnJlbnRfKTsKLSAgICBkZW1hbmdsZV8gPSB0cnVlOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotVHJhY2VSZWFkZXI8VD46On5UcmFjZVJlYWRlcigpCi17Ci0gICAgaGFzaF9lbnRyeV90eXBlICpwdHI7Ci0gICAgZm9yIChwdHIgPSBoYXNoXy0+R2V0Rmlyc3QoKTsgcHRyOyBwdHIgPSBoYXNoXy0+R2V0TmV4dCgpKSB7Ci0gICAgICAgIHJlZ2lvbl90eXBlICpyZWdpb24gPSBwdHItPnZhbHVlOwotICAgICAgICAvLyBJZiB0aGUgc3ltYm9scyBhcmUgbm90IHNoYXJlZCB3aXRoIGFub3RoZXIgcmVnaW9uLCB0aGVuIGRlbGV0ZSB0aGVtLgotICAgICAgICBpZiAoKHJlZ2lvbi0+ZmxhZ3MgJiByZWdpb25fdHlwZTo6a1NoYXJlZFN5bWJvbHMpID09IDApIHsKLSAgICAgICAgICAgIGludCBuc3ltYm9scyA9IHJlZ2lvbi0+bnN5bWJvbHM7Ci0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnN5bWJvbHM7IGlpKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSByZWdpb24tPnN5bWJvbHNbaWldLm5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSByZWdpb24tPnN5bWJvbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlW10gcmVnaW9uLT5wYXRoOwotCi0gICAgICAgIC8vIERvIG5vdCBkZWxldGUgdGhlIHJlZ2lvbiBpdHNlbGYgaGVyZS4gIEVhY2ggcmVnaW9uCi0gICAgICAgIC8vIGlzIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBkZWxldGVkIGJ5IHRoZSBQcm9jZXNzU3RhdGUKLSAgICAgICAgLy8gb2JqZWN0IHRoYXQgb3ducyBpdC4KLSAgICB9Ci0gICAgZGVsZXRlIGhhc2hfOwotCi0gICAgLy8gRGVsZXRlIHRoZSBQcm9jZXNzU3RhdGUgb2JqZWN0cyBhZnRlciB0aGUgcmVnaW9uIHN5bWJvbHMgaW4KLSAgICAvLyB0aGUgaGFzaCB0YWJsZSBhYm92ZSBzbyB0aGF0IHdlIHN0aWxsIGhhdmUgdmFsaWQgcmVnaW9uIHBvaW50ZXJzCi0gICAgLy8gd2hlbiBkZWxldGluZyB0aGUgcmVnaW9uIHN5bWJvbHMuCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGtOdW1QaWRzOyArK2lpKSB7Ci0gICAgICAgIGRlbGV0ZSBwcm9jZXNzZXNfW2lpXTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgcXNvcnQoKSByb3V0aW5lIHRvIHNvcnQgc3ltYm9scwotLy8gaW50byBpbmNyZWFzaW5nIGFkZHJlc3Mgb3JkZXIuCi10ZW1wbGF0ZTxjbGFzcyBUPgotaW50IGNtcF9zeW1ib2xfYWRkcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6c3ltYm9sX3R5cGUgc3R5cGU7Ci0KLSAgICBjb25zdCBzdHlwZSAqc3ltYSA9IHN0YXRpY19jYXN0PHN0eXBlIGNvbnN0ICo+KGEpOwotICAgIGNvbnN0IHN0eXBlICpzeW1iID0gc3RhdGljX2Nhc3Q8c3R5cGUgY29uc3QgKj4oYik7Ci0gICAgdWludDMyX3QgYWRkcjEgPSBzeW1hLT5hZGRyOwotICAgIHVpbnQzMl90IGFkZHIyID0gc3ltYi0+YWRkcjsKLSAgICBpZiAoYWRkcjEgPCBhZGRyMikKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChhZGRyMSA+IGFkZHIyKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8vIFRoZSBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lLCBzb3J0IHRoZSBzeW1ib2xzIGludG8KLSAgICAvLyBpbmNyZWFzaW5nIGFscGhhYmV0aWNhbCBvcmRlci4gIEJ1dCBwdXQgc3ltYm9scyB0aGF0Ci0gICAgLy8gdGhhdCBzdGFydCB3aXRoICJfIiBsYXN0LgotICAgIGlmIChzeW1hLT5uYW1lWzBdID09ICdfJyB8fCBzeW1iLT5uYW1lWzBdID09ICdfJykgewotICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgdW5kZXJzY29yZXMgYW5kIHNvcnQgdGhlCi0gICAgICAgIC8vIHN5bWJvbCB3aXRoIHRoZSBtb3N0IHVuZGVyc2NvcmVzIGxhc3QuCi0gICAgICAgIGludCBhQ291bnQgPSAwOwotICAgICAgICB3aGlsZSAoc3ltYS0+bmFtZVthQ291bnRdID09ICdfJykKLSAgICAgICAgICAgIGFDb3VudCArPSAxOwotICAgICAgICBpbnQgYkNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKHN5bWItPm5hbWVbYkNvdW50XSA9PSAnXycpCi0gICAgICAgICAgICBiQ291bnQgKz0gMTsKLSAgICAgICAgaWYgKGFDb3VudCA8IGJDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhQ291bnQgPiBiQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSBzeW1ib2xzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHVuZGVyc2NvcmVzLCB0aGVuCi0gICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgc29ydCBieSB0aGUgd2hvbGUgbmFtZS4KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmNtcChzeW1hLT5uYW1lLCBzeW1iLT5uYW1lKTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBxc29ydCgpIHJvdXRpbmUgdG8gc29ydCByZWdpb24gZW50cmllcwotLy8gaW50byBpbmNyZWFzaW5nIGFkZHJlc3Mgb3JkZXIuCi10ZW1wbGF0ZTxjbGFzcyBUPgotaW50IGNtcF9yZWdpb25fYWRkcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6cmVnaW9uX3R5cGUgcnR5cGU7Ci0KLSAgICBjb25zdCBydHlwZSAqbWEgPSAqc3RhdGljX2Nhc3Q8cnR5cGUqIGNvbnN0ICo+KGEpOwotICAgIGNvbnN0IHJ0eXBlICptYiA9ICpzdGF0aWNfY2FzdDxydHlwZSogY29uc3QgKj4oYik7Ci0gICAgdWludDMyX3QgYWRkcjEgPSBtYS0+dnN0YXJ0OwotICAgIHVpbnQzMl90IGFkZHIyID0gbWItPnZzdGFydDsKLSAgICBpZiAoYWRkcjEgPCBhZGRyMikKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChhZGRyMSA9PSBhZGRyMikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8vIFRoaXMgcm91dGluZSByZXR1cm5zIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBzeW1ib2xzLgotdGVtcGxhdGU8Y2xhc3MgVD4KLXR5cGVuYW1lIFRyYWNlUmVhZGVyPFQ+OjpzeW1ib2xfdHlwZSoKLVRyYWNlUmVhZGVyPFQ+OjpHZXRTeW1ib2xzKGludCAqbnVtX3N5bXMpCi17Ci0gICAgLy8gQ291bnQgdGhlIHN5bWJvbHMKLSAgICBpbnQgbnN5bXMgPSAwOwotICAgIGZvciAoaGFzaF9lbnRyeV90eXBlICpwdHIgPSBoYXNoXy0+R2V0Rmlyc3QoKTsgcHRyOyBwdHIgPSBoYXNoXy0+R2V0TmV4dCgpKSB7Ci0gICAgICAgIHJlZ2lvbl90eXBlICpyZWdpb24gPSBwdHItPnZhbHVlOwotICAgICAgICBuc3ltcyArPSByZWdpb24tPm5zeW1ib2xzOwotICAgIH0KLSAgICAqbnVtX3N5bXMgPSBuc3ltczsKLQotICAgIC8vIEFsbG9jYXRlIHNwYWNlCi0gICAgc3ltYm9sX3R5cGUgKnN5bXMgPSBuZXcgc3ltYm9sX3R5cGVbbnN5bXNdOwotICAgIHN5bWJvbF90eXBlICpuZXh0X3N5bSA9IHN5bXM7Ci0KLSAgICAvLyBDb3B5IHRoZSBzeW1ib2xzCi0gICAgZm9yIChoYXNoX2VudHJ5X3R5cGUgKnB0ciA9IGhhc2hfLT5HZXRGaXJzdCgpOyBwdHI7IHB0ciA9IGhhc2hfLT5HZXROZXh0KCkpIHsKLSAgICAgICAgcmVnaW9uX3R5cGUgKnJlZ2lvbiA9IHB0ci0+dmFsdWU7Ci0gICAgICAgIG1lbWNweShuZXh0X3N5bSwgcmVnaW9uLT5zeW1ib2xzLCByZWdpb24tPm5zeW1ib2xzICogc2l6ZW9mKHN5bWJvbF90eXBlKSk7Ci0gICAgICAgIG5leHRfc3ltICs9IHJlZ2lvbi0+bnN5bWJvbHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN5bXM7Ci19Ci0KLS8vIFRoaXMgcm91dGluZSByZXR1cm5zIGFsbCB0aGUgdmFsaWQgcHJvY2Vzc2VzLgotdGVtcGxhdGU8Y2xhc3MgVD4KLXR5cGVuYW1lIFRyYWNlUmVhZGVyPFQ+OjpQcm9jZXNzU3RhdGUqCi1UcmFjZVJlYWRlcjxUPjo6R2V0UHJvY2Vzc2VzKGludCAqbnVtX3Byb2NzKQotewotICAgIC8vIENvdW50IHRoZSB2YWxpZCBwcm9jZXNzZXMKLSAgICBpbnQgbnByb2NzID0gMDsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwga051bVBpZHM7ICsraWkpIHsKLSAgICAgICAgaWYgKHByb2Nlc3Nlc19baWldKQotICAgICAgICAgICAgbnByb2NzICs9IDE7Ci0gICAgfQotCi0gICAgLy8gQWxsb2NhdGUgYSBuZXcgYXJyYXkgdG8gaG9sZCB0aGUgdmFsaWQgcHJvY2Vzc2VzLgotICAgIFByb2Nlc3NTdGF0ZSAqcHJvY3MgPSBuZXcgUHJvY2Vzc1N0YXRlW25wcm9jc107Ci0KLSAgICAvLyBDb3B5IHRoZSBwcm9jZXNzZXMgdG8gdGhlIG5ldyBhcnJheS4KLSAgICBQcm9jZXNzU3RhdGUgKnBzdGF0ZSA9IHByb2NzOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBrTnVtUGlkczsgKytpaSkgewotICAgICAgICBpZiAocHJvY2Vzc2VzX1tpaV0pCi0gICAgICAgICAgICBtZW1jcHkocHN0YXRlKyssIHByb2Nlc3Nlc19baWldLCBzaXplb2YoUHJvY2Vzc1N0YXRlKSk7Ci0gICAgfQotCi0gICAgKm51bV9wcm9jcyA9IG5wcm9jczsKLSAgICByZXR1cm4gcHJvY3M7Ci19Ci0KLS8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBuZXh0IHZhbGlkIHByb2Nlc3MsIG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vCi0vLyBtb3JlIHZhbGlkIHByb2Nlc3Nlcy4KLXRlbXBsYXRlPGNsYXNzIFQ+Ci10eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6UHJvY2Vzc1N0YXRlKgotVHJhY2VSZWFkZXI8VD46OkdldE5leHRQcm9jZXNzKCkKLXsKLSAgICB3aGlsZSAobmV4dF9waWRfIDwga051bVBpZHMpIHsKLSAgICAgICAgaWYgKHByb2Nlc3Nlc19bbmV4dF9waWRfXSkKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZXNfW25leHRfcGlkXysrXTsKLSAgICAgICAgbmV4dF9waWRfICs9IDE7Ci0gICAgfQotICAgIG5leHRfcGlkXyA9IDA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jb25zdCBjaGFyKiBUcmFjZVJlYWRlcjxUPjo6R2V0UHJvY2Vzc05hbWUoaW50IHBpZCkKLXsKLSAgICBpZiAocGlkIDwgMCB8fCBwaWQgPj0ga051bVBpZHMgfHwgcHJvY2Vzc2VzX1twaWRdID09IE5VTEwpCi0gICAgICAgIHJldHVybiAiKHVua25vd24pIjsKLSAgICByZXR1cm4gcHJvY2Vzc2VzX1twaWRdLT5uYW1lOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6QWRkUHJlZGVmaW5lZFJlZ2lvbihyZWdpb25fdHlwZSAqcmVnaW9uLCBjb25zdCBjaGFyICpwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2c3RhcnQsIHVpbnQzMl90IHZlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2UpCi17Ci0gICAgLy8gQ29weSB0aGUgcGF0aCB0byBtYWtlIGl0IGVhc3kgdG8gZGVsZXRlIGxhdGVyLgotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7Ci0gICAgcmVnaW9uLT5wYXRoID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgc3RyY3B5KHJlZ2lvbi0+cGF0aCwgcGF0aCk7Ci0gICAgcmVnaW9uLT52c3RhcnQgPSB2c3RhcnQ7Ci0gICAgcmVnaW9uLT52ZW5kID0gdmVuZDsKLSAgICByZWdpb24tPmJhc2VfYWRkciA9IGJhc2U7Ci0gICAgcmVnaW9uLT5mbGFncyA9IHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb247Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFRyYWNlUmVhZGVyPFQ+OjpJbml0UmVnaW9uU3ltYm9scyhyZWdpb25fdHlwZSAqcmVnaW9uLCBpbnQgbnN5bWJvbHMpCi17Ci0gICAgcmVnaW9uLT5uc3ltYm9scyA9IG5zeW1ib2xzOwotICAgIHJlZ2lvbi0+c3ltYm9scyA9IG5ldyBzeW1ib2xfdHlwZVtuc3ltYm9sc107Ci0gICAgbWVtc2V0KHJlZ2lvbi0+c3ltYm9scywgMCwgbnN5bWJvbHMgKiBzaXplb2Yoc3ltYm9sX3R5cGUpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgVHJhY2VSZWFkZXI8VD46OkFkZFJlZ2lvblN5bWJvbChyZWdpb25fdHlwZSAqcmVnaW9uLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmVnaW9uLT5zeW1ib2xzW2lkeF0uYWRkciA9IGFkZHI7Ci0gICAgcmVnaW9uLT5zeW1ib2xzW2lkeF0ubmFtZSA9IFN0cmR1cChuYW1lKTsKLSAgICByZWdpb24tPnN5bWJvbHNbaWR4XS52bV9zeW0gPSBOVUxMOwotICAgIHJlZ2lvbi0+c3ltYm9sc1tpZHhdLnJlZ2lvbiA9IHJlZ2lvbjsKLSAgICByZWdpb24tPnN5bWJvbHNbaWR4XS5mbGFncyA9IGZsYWdzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6QWRkUHJlZGVmaW5lZFJlZ2lvbnMoUHJvY2Vzc1N0YXRlICpwc3RhdGUpCi17Ci0gICAgcmVnaW9uX3R5cGUgKnJlZ2lvbiA9IG5ldyByZWdpb25fdHlwZTsKLSAgICBBZGRQcmVkZWZpbmVkUmVnaW9uKHJlZ2lvbiwgIihib290bG9hZGVyKSIsIDAsIDB4MTQsIDApOwotICAgIEluaXRSZWdpb25TeW1ib2xzKHJlZ2lvbiwgMik7Ci0gICAgQWRkUmVnaW9uU3ltYm9sKHJlZ2lvbiwgMCwgMCwgIihib290bG9hZGVyX3N0YXJ0KSIsIDApOwotICAgIEFkZFJlZ2lvblN5bWJvbChyZWdpb24sIDEsIDB4MTQsICIoYm9vdGxvYWRlcl9lbmQpIiwgMCk7Ci0gICAgQWRkUmVnaW9uKHBzdGF0ZSwgcmVnaW9uKTsKLSAgICBoYXNoXy0+VXBkYXRlKHJlZ2lvbi0+cGF0aCwgcmVnaW9uKTsKLQotICAgIHJlZ2lvbiA9IG5ldyByZWdpb25fdHlwZTsKLSAgICBBZGRQcmVkZWZpbmVkUmVnaW9uKHJlZ2lvbiwgIihleGNlcHRpb24gdmVjdG9ycykiLCAweGZmZmYwMDAwLCAweGZmZmYwNTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMCk7Ci0gICAgSW5pdFJlZ2lvblN5bWJvbHMocmVnaW9uLCAyKTsKLSAgICBBZGRSZWdpb25TeW1ib2wocmVnaW9uLCAwLCAweDAsICIodmVjdG9yX3N0YXJ0KSIsCi0gICAgICAgICAgICAgICAgICAgIHN5bWJvbF90eXBlOjprSXNWZWN0b3JTdGFydCk7Ci0gICAgQWRkUmVnaW9uU3ltYm9sKHJlZ2lvbiwgMSwgMHg1MDAsICIodmVjdG9yX2VuZCkiLCAwKTsKLSAgICBBZGRSZWdpb24ocHN0YXRlLCByZWdpb24pOwotICAgIGhhc2hfLT5VcGRhdGUocmVnaW9uLT5wYXRoLCByZWdpb24pOwotCi0gICAgcmVnaW9uID0gbmV3IHJlZ2lvbl90eXBlOwotICAgIEFkZFByZWRlZmluZWRSZWdpb24ocmVnaW9uLCAiKGF0b21pYyBvcHMpIiwgMHhmZmZmMGY4MCwgMHhmZmZmMTAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjBmODApOwotICAgIC8vIE1hcmsgdGhpcyByZWdpb24gYXMgYWxzbyBiZWluZyBtYXBwZWQgaW4gdXNlci1zcGFjZS4KLSAgICAvLyBUaGlzIGlzbid0IHVzZWQgYW55d2hlcmUgaW4gdGhpcyBjb2RlIGJ1dCBjbGllbnQgY29kZSBjYW4gdGVzdCBmb3IKLSAgICAvLyB0aGlzIGZsYWcgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHRyZWF0IHRoaXMgYXMga2VybmVsIG9yIHVzZXIgY29kZS4KLSAgICByZWdpb24tPmZsYWdzIHw9IHJlZ2lvbl90eXBlOjprSXNVc2VyTWFwcGVkUmVnaW9uOwotCi0gICAgSW5pdFJlZ2lvblN5bWJvbHMocmVnaW9uLCA0KTsKLSAgICBBZGRSZWdpb25TeW1ib2wocmVnaW9uLCAwLCAweDAsICIoa3VzZXJfYXRvbWljX2luYykiLCAwKTsKLSAgICBBZGRSZWdpb25TeW1ib2wocmVnaW9uLCAxLCAweDIwLCAiKGt1c2VyX2F0b21pY19kZWMpIiwgMCk7Ci0gICAgQWRkUmVnaW9uU3ltYm9sKHJlZ2lvbiwgMiwgMHg0MCwgIihrdXNlcl9jbXB4Y2hnKSIsIDApOwotICAgIEFkZFJlZ2lvblN5bWJvbChyZWdpb24sIDMsIDB4ODAsICIoa3VzZXJfZW5kKSIsIDApOwotICAgIEFkZFJlZ2lvbihwc3RhdGUsIHJlZ2lvbik7Ci0gICAgaGFzaF8tPlVwZGF0ZShyZWdpb24tPnBhdGgsIHJlZ2lvbik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFRyYWNlUmVhZGVyPFQ+OjpSZWFkS2VybmVsU3ltYm9scyhjb25zdCBjaGFyICprZXJuZWxfZmlsZSkKLXsKLSAgICByZWdpb25fdHlwZSAqcmVnaW9uID0gbmV3IHJlZ2lvbl90eXBlOwotICAgIC8vIENvcHkgdGhlIHBhdGggdG8gbWFrZSBpdCBlYXN5IHRvIGRlbGV0ZSBsYXRlci4KLSAgICBpbnQgbGVuID0gc3RybGVuKGtlcm5lbF9maWxlKTsKLSAgICByZWdpb24tPnBhdGggPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICBzdHJjcHkocmVnaW9uLT5wYXRoLCBrZXJuZWxfZmlsZSk7Ci0gICAgcmVnaW9uLT5mbGFncyA9IHJlZ2lvbl90eXBlOjprSXNLZXJuZWxSZWdpb247Ci0gICAgUmVhZEVsZlN5bWJvbHMocmVnaW9uLCBrSW5jbHVkZUxvY2FsU3ltYm9scyk7Ci0gICAgcmVnaW9uLT52ZW5kID0gMHhmZmZmMDAwMDsKLSAgICBBZGRSZWdpb24ocHJvY2Vzc2VzX1swXSwgcmVnaW9uKTsKLSAgICBwcm9jZXNzZXNfWzBdLT5mbGFncyB8PSBQcm9jZXNzU3RhdGU6OmtIYXNLZXJuZWxSZWdpb247Ci0gICAgaGFzaF8tPlVwZGF0ZShyZWdpb24tPnBhdGgsIHJlZ2lvbik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFRyYWNlUmVhZGVyPFQ+OjpkZW1hbmdsZV9uYW1lcyhpbnQgbmZ1bmNzLCBzeW1ib2xfdHlwZSAqZnVuY3Rpb25zKQotewotICAgIGNoYXIgKmRlbWFuZ2xlZDsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5mdW5jczsgKytpaSkgewotICAgICAgICBkZW1hbmdsZWQgPSBOVUxMOwotICAgICAgICBpbnQgbGVuID0gc3RybGVuKGZ1bmN0aW9uc1tpaV0ubmFtZSk7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgY2hlY2sgZm9yICJsZW4gPiAxIiB0aGVuIHRoZSBkZW1hbmdsZXIgd2lsbCBpbmNvcnJlY3RseQotICAgICAgICAvLyBleHBhbmQgMS1sZXR0ZXIgZnVuY3Rpb24gbmFtZXMuICBGb3IgZXhhbXBsZSwgImIiIGJlY29tZXMgImJvb2wiLAotICAgICAgICAvLyAiYyIgYmVjb21lcyAiY2hhciIgYW5kICJkIiBiZWNvbWVzICJkb3VibGUiLiAgQWxzbyBjaGVjayB0aGF0IHRoZQotICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgaXMgYW4gdW5kZXJzY29yZS4gIE90aGVyd2lzZSwgb24gc29tZSBzdHJpbmdzCi0gICAgICAgIC8vIHRoZSBkZW1hbmdsZXIgd2lsbCB0cnkgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoYmVjYXVzZQotICAgICAgICAvLyB0aGUgc3RyaW5nIGlzIG5vdCByZWFsbHkgYSBDKysgbWFuZ2xlZCBuYW1lKSBhbmQgdmFsZ3JpbmQgd2lsbAotICAgICAgICAvLyBjb21wbGFpbi4KLSAgICAgICAgaWYgKGRlbWFuZ2xlXyAmJiBsZW4gPiAxICYmIGZ1bmN0aW9uc1tpaV0ubmFtZVswXSA9PSAnXycpIHsKLSAgICAgICAgICAgIGRlbWFuZ2xlZCA9IGFiaTo6X19jeGFfZGVtYW5nbGUoZnVuY3Rpb25zW2lpXS5uYW1lLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZW1hbmdsZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlW10gZnVuY3Rpb25zW2lpXS5uYW1lOwotICAgICAgICAgICAgZnVuY3Rpb25zW2lpXS5uYW1lID0gU3RyZHVwKGRlbWFuZ2xlZCk7Ci0gICAgICAgICAgICBmcmVlKGRlbWFuZ2xlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEFkZHMgdGhlIHN5bWJvbHMgZnJvbSB0aGUgZ2l2ZW4gRUxGIGZpbGUgdG8gdGhlIGdpdmVuIHByb2Nlc3MuCi0vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBmaWxlIHdhcyBub3QgYW4gRUxGIGZpbGUgb3IgaWYgdGhlcmUgd2FzIGFuCi0vLyBlcnJvciB0cnlpbmcgdG8gcmVhZCB0aGUgc2VjdGlvbnMgb2YgdGhlIEVMRiBmaWxlLgotdGVtcGxhdGU8Y2xhc3MgVD4KLWJvb2wgVHJhY2VSZWFkZXI8VD46OlJlYWRFbGZTeW1ib2xzKHJlZ2lvbl90eXBlICpyZWdpb24sIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN0YXRpYyBjaGFyIGZ1bGxfcGF0aFs0MDk2XTsKLSAgICBFbGYzMl9TaGRyICAqc3ltdGFiLCAqc3ltc3RyOwotICAgIEVsZjMyX0VoZHIgICpoZHI7Ci0gICAgRWxmMzJfU2hkciAgKnNoZHI7Ci0KLSAgICBmdWxsX3BhdGhbMF0gPSAwOwotICAgIGlmIChyb290XyAmJiBzdHJjbXAocm9vdF8sICIvIikpIHsKLSAgICAgICAgc3RyY3B5KGZ1bGxfcGF0aCwgcm9vdF8pOwotICAgIH0KLSAgICBzdHJjYXQoZnVsbF9wYXRoLCByZWdpb24tPnBhdGgpOwotICAgIEZJTEUgKmZvYmogPSBmb3BlbihmdWxsX3BhdGgsICJyIik7Ci0gICAgaWYoZm9iaiA9PSBOVUxMKSB7Ci0gICAgRW1wdHlSZWdpb246Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGFuICh1bmtub3duKSBzeW1ib2wgd2l0aCBhZGRyZXNzIDAsIG90aGVyd2lzZSBzb21lCi0gICAgICAgIC8vIG90aGVyIHBhcnRzIG9mIHRoZSB0cmFjZSByZWFkZXIgd2lsbCBzaW1wbHkgY3Jhc2ggd2hlbiBkZWFsaW5nIHdpdGgKLSAgICAgICAgLy8gYW4gZW1wdHkgcmVnaW9uCi0gICAgICAgIHJlZ2lvbi0+dnN0YXJ0ID0gMDsKLSAgICAgICAgcmVnaW9uLT5uc3ltYm9scyA9IDE7Ci0gICAgICAgIHJlZ2lvbi0+c3ltYm9scyAgPSBuZXcgc3ltYm9sX3R5cGVbMV07Ci0gICAgICAgIG1lbXNldChyZWdpb24tPnN5bWJvbHMsIDAsIHNpemVvZihzeW1ib2xfdHlwZSkpOwotCi0gICAgICAgIHJlZ2lvbi0+c3ltYm9sc1swXS5hZGRyICAgPSAwOwotICAgICAgICByZWdpb24tPnN5bWJvbHNbMF0ubmFtZSAgID0gU3RyZHVwKCIodW5rbm93bikiKTsKLSAgICAgICAgcmVnaW9uLT5zeW1ib2xzWzBdLnZtX3N5bSA9IE5VTEw7Ci0gICAgICAgIHJlZ2lvbi0+c3ltYm9sc1swXS5yZWdpb24gPSByZWdpb247Ci0gICAgICAgIHJlZ2lvbi0+c3ltYm9sc1swXS5mbGFncyAgPSAwOwotCi0gICAgICAgIGlmIChmb2JqICE9IE5VTEwpCi0gICAgICAgICAgICBmY2xvc2UoZm9iaik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBoZHIgPSBSZWFkRWxmSGVhZGVyKGZvYmopOwotICAgIGlmIChoZHIgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZWFkIEVMRiBoZWFkZXIgZnJvbSAnJXMnXG4iLCBmdWxsX3BhdGgpOwotICAgICAgICBnb3RvIEVtcHR5UmVnaW9uOwotICAgIH0KLQotICAgIHNoZHIgPSBSZWFkU2VjdGlvbkhlYWRlcnMoaGRyLCBmb2JqKTsKLSAgICBpZihzaGRyID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCByZWFkIHNlY3Rpb24gaGVhZGVycyBmcm9tIGV4ZWN1dGFibGVcbiIpOwotICAgICAgICBnb3RvIEVtcHR5UmVnaW9uOwotICAgIH0KLSAgICBjaGFyICpzZWN0aW9uX25hbWVzID0gUmVhZFN0cmluZ1RhYmxlKGhkciwgc2hkciwgZm9iaik7Ci0KLSAgICAvLyBHZXQgdGhlIHN5bWJvbCB0YWJsZSBzZWN0aW9uCi0gICAgc3ltdGFiID0gRmluZFN5bWJvbFRhYmxlU2VjdGlvbihoZHIsIHNoZHIsIHNlY3Rpb25fbmFtZXMpOwotICAgIGlmIChzeW10YWIgPT0gTlVMTCB8fCBzeW10YWItPnNoX3NpemUgPT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHJlYWQgc3ltYm9sIHRhYmxlIGZyb20gJyVzJ1xuIiwgZnVsbF9wYXRoKTsKLSAgICAgICAgZ290byBFbXB0eVJlZ2lvbjsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgc2VjdGlvbgotICAgIHN5bXN0ciA9IEZpbmRTeW1ib2xTdHJpbmdUYWJsZVNlY3Rpb24oaGRyLCBzaGRyLCBzZWN0aW9uX25hbWVzKTsKLSAgICBpZiAoc3ltc3RyID09IE5VTEwgfHwgc3ltc3RyLT5zaF9zaXplID09IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCByZWFkIHN5bWJvbCBzdHJpbmcgdGFibGUgZnJvbSAnJXMnXG4iLCBmdWxsX3BhdGgpOwotICAgICAgICBnb3RvIEVtcHR5UmVnaW9uOwotICAgIH0KLQotICAgIC8vIExvYWQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgZGF0YQotICAgIGNoYXIgKnN5bWJvbF9uYW1lcyA9IG5ldyBjaGFyW3N5bXN0ci0+c2hfc2l6ZV07Ci0gICAgUmVhZFNlY3Rpb24oc3ltc3RyLCBzeW1ib2xfbmFtZXMsIGZvYmopOwotCi0gICAgaW50IG51bV9lbnRyaWVzID0gc3ltdGFiLT5zaF9zaXplIC8gc3ltdGFiLT5zaF9lbnRzaXplOwotICAgIEVsZjMyX1N5bSAqZWxmX3N5bWJvbHMgPSBuZXcgRWxmMzJfU3ltW251bV9lbnRyaWVzXTsKLSAgICBSZWFkU2VjdGlvbihzeW10YWIsIGVsZl9zeW1ib2xzLCBmb2JqKTsKLSAgICBBZGp1c3RFbGZTeW1ib2xzKGhkciwgZWxmX3N5bWJvbHMsIG51bV9lbnRyaWVzKTsKLSNpZiAwCi0gICAgcHJpbnRmKCJzaXplOiAlZCwgZW50X3NpemU6ICVkLCBudW1fZW50cmllczogJWRcbiIsCi0gICAgICAgICAgIHN5bXRhYi0+c2hfc2l6ZSwgc3ltdGFiLT5zaF9lbnRzaXplLCBudW1fZW50cmllcyk7Ci0jZW5kaWYKLSAgICBpbnQgbmZ1bmNzID0gMDsKLQotICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIHN5bWJvbHMgZm9yIG5vdy4gIFdlIHdpbGwKLSAgICAvLyByZWFsbG9jYXRlIHNwYWNlIGZvciBqdXN0IHRoZSBmdW5jdGlvbiBzeW1ib2xzIGFmdGVyIHdlCi0gICAgLy8ga25vdyBob3cgbWFueSB0aGVyZSBhcmUuICBBbHNvLCBtYWtlIHN1cmUgdGhlcmUgaXMgcm9vbQotICAgIC8vIGZvciBzb21lIGV4dHJhIHN5bWJvbHMsIGluY2x1ZGluZyB0aGUgdGV4dCBzZWN0aW9uIG5hbWVzLgotICAgIGludCBudW1fYWxsb2MgPSBudW1fZW50cmllcyArIGhkci0+ZV9zaG51bSArIDE7Ci0gICAgc3ltYm9sX3R5cGUgKmZ1bmNfc3ltYm9scyA9IG5ldyBzeW1ib2xfdHlwZVtudW1fYWxsb2NdOwotICAgIG1lbXNldChmdW5jX3N5bWJvbHMsIDAsIG51bV9hbGxvYyAqIHNpemVvZihzeW1ib2xfdHlwZSkpOwotCi0gICAgLy8gSWYgdGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgZm9yIGEgdmlydHVhbCBtYWNoaW5lLCB0aGVuCi0gICAgLy8gc2V0IHRoZSBJc0ludGVycHJldGVyIGZsYWcgZm9yIGFsbCBzeW1ib2xzIGluIHRoYXQgc2hhcmVkIGxpYnJhcnkuCi0gICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHJlcGxhY2UgdGhlIHN5bWJvbCBuYW1lcyB3aXRoIHRoZSBuYW1lIG9mCi0gICAgLy8gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgbWV0aG9kIG9uIHRoZSB2aXJ0dWFsIG1hY2hpbmUuCi0gICAgaW50IHN5bWJvbF9mbGFncyA9IDA7Ci0gICAgY2hhciAqY3AgPSBzdHJyY2hyKHJlZ2lvbi0+cGF0aCwgJy8nKTsKLSAgICBpZiAoY3AgIT0gTlVMTCkgewotICAgICAgICAvLyBNb3ZlIHBhc3QgdGhlICcvJwotICAgICAgICBjcCArPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZXJlIHdhcyBubyAnLycsIHNvIHVzZSB0aGUgd2hvbGUgcGF0aAotICAgICAgICBjcCA9IHJlZ2lvbi0+cGF0aDsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcChjcCwgImxpYmR2bS5zbyIpID09IDApIHsKLSAgICAgICAgc3ltYm9sX2ZsYWdzID0gc3ltYm9sX3R5cGU6OmtJc0ludGVycHJldGVyOwotICAgIH0KLQotICAgIGJvb2wgemVyb19mb3VuZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGlpID0gMTsgaWkgPCBudW1fZW50cmllczsgKytpaSkgewotICAgICAgICBpbnQgaWR4ID0gZWxmX3N5bWJvbHNbaWldLnN0X25hbWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGEgbmFtZSwgb3IgaWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggYQotICAgICAgICAvLyBkb2xsYXIgc2lnbiAoJCksIHRoZW4gc2tpcCBpdC4KLSAgICAgICAgaWYgKGlkeCA9PSAwIHx8IHN5bWJvbF9uYW1lc1tpZHhdID09IDAgfHwgc3ltYm9sX25hbWVzW2lkeF0gPT0gJyQnKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgbm90IGV4ZWN1dGFibGUsIHRoZW4gc2tpcCBpdC4KLSAgICAgICAgdWludDMyX3Qgc2VjdGlvbiA9IGVsZl9zeW1ib2xzW2lpXS5zdF9zaG5keDsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gMCB8fCBzZWN0aW9uID49IGhkci0+ZV9zaG51bSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoKHNoZHJbc2VjdGlvbl0uc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSA9PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgdWludDhfdCBzeW1fdHlwZSA9IEVMRjMyX1NUX1RZUEUoZWxmX3N5bWJvbHNbaWldLnN0X2luZm8pOwotICAgICAgICB1aW50OF90IHN5bV9iaW5kID0gRUxGMzJfU1RfQklORChlbGZfc3ltYm9sc1tpaV0uc3RfaW5mbyk7Ci0KLSAgICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBkZWNpZGUgaWYgd2Ugd2FudCBsb2NhbCBub24tZnVuY3Rpb24KLSAgICAgICAgLy8gc3ltYm9scyB0byBiZSBpbmNsdWRlZC4gIFdlIGN1cnJlbnRseSBpbmNsdWRlIHRoZXNlIHN5bWJvbHMKLSAgICAgICAgLy8gb25seSBmb3IgdGhlIGtlcm5lbCwgd2hlcmUgaXQgaXMgdXNlZnVsIGJlY2F1c2UgdGhlIGtlcm5lbAotICAgICAgICAvLyBoYXMgbG90cyBvZiBhc3NlbWJseSBsYW5ndWFnZSBsYWJlbHMgdGhhdCBoYXZlIG1lYW5pbmdmdWwgbmFtZXMuCi0gICAgICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUxvY2FsU3ltYm9scykgPT0gMCAmJiBzeW1fYmluZCA9PSBTVEJfTE9DQUwKLSAgICAgICAgICAgICYmIHN5bV90eXBlICE9IFNUVF9GVU5DKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotI2lmIDAKLSAgICAgICAgcHJpbnRmKCIlMDh4ICV4ICV4ICVzXG4iLAotICAgICAgICAgICAgICAgZWxmX3N5bWJvbHNbaWldLnN0X3ZhbHVlLAotICAgICAgICAgICAgICAgc3ltX2JpbmQsCi0gICAgICAgICAgICAgICBzeW1fdHlwZSwKLSAgICAgICAgICAgICAgICZzeW1ib2xfbmFtZXNbaWR4XSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKHN5bV90eXBlICE9IFNUVF9GVU5DICYmIHN5bV90eXBlICE9IFNUVF9OT1RZUEUpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoZWxmX3N5bWJvbHNbaWldLnN0X3ZhbHVlID09IDApCi0gICAgICAgICAgICB6ZXJvX2ZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aHVtYiBmdW5jdGlvbnMgc2VlbSB0byBoYXZlIHRoZSBsb3cgYml0IHNldCwKLSAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIGluc3RydWN0aW9ucyBhcmUgcmVhbGx5IGF0IGFuIGV2ZW4gYWRkcmVzcy4KLSAgICAgICAgdWludDMyX3QgYWRkciA9IGVsZl9zeW1ib2xzW2lpXS5zdF92YWx1ZSAmIH4weDE7Ci0gICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLmFkZHIgPSBhZGRyOwotICAgICAgICBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5uYW1lID0gU3RyZHVwKCZzeW1ib2xfbmFtZXNbaWR4XSk7Ci0gICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLmZsYWdzID0gc3ltYm9sX2ZsYWdzOwotCi0gICAgICAgIG5mdW5jcyArPSAxOwotICAgIH0KLQotICAgIC8vIEFkZCBhIFswLCAiKHVua25vd24pIl0gc3ltYm9sIHBhaXIgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYQotICAgIC8vIHN5bWJvbCB3aXRoIHRoZSBhZGRyZXNzIHplcm8uICBXZSBkb24ndCBuZWVkIHRvIHJlYWxsb2NhdGUgc3BhY2UKLSAgICAvLyBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBtb3JlIHRoYW4gd2UgbmVlZC4KLSAgICBpZiAoIXplcm9fZm91bmQpIHsKLSAgICAgICAgZnVuY19zeW1ib2xzW25mdW5jc10uYWRkciA9IDA7Ci0gICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLm5hbWUgPSBTdHJkdXAoIigwIHVua25vd24pIik7Ci0gICAgICAgIG5mdW5jcyArPSAxOwotICAgIH0KLQotICAgIC8vIEFkZCBhbm90aGVyIGVudHJ5IGF0IHRoZSBlbmQKLSAgICBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5hZGRyID0gMHhmZmZmZmZmZjsKLSAgICBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5uYW1lID0gU3RyZHVwKCIoZW5kKSIpOwotICAgIG5mdW5jcyArPSAxOwotCi0gICAgLy8gQWRkIGluIHRoZSBuYW1lcyBvZiB0aGUgdGV4dCBzZWN0aW9ucywgYnV0IG9ubHkgaWYgdGhlcmUKLSAgICAvLyBhcmUgbm8gc3ltYm9scyB3aXRoIHRoYXQgYWRkcmVzcyBhbHJlYWR5LgotICAgIGZvciAoaW50IHNlY3Rpb24gPSAwOyBzZWN0aW9uIDwgaGRyLT5lX3NobnVtOyArK3NlY3Rpb24pIHsKLSAgICAgICAgaWYgKChzaGRyW3NlY3Rpb25dLnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHVpbnQzMl90IGFkZHIgPSBzaGRyW3NlY3Rpb25dLnNoX2FkZHI7Ci0gICAgICAgIC8vIFNlYXJjaCBmb3IgYSBzeW1ib2wgd2l0aCBhIG1hdGNoaW5nIGFkZHJlc3MuICBUaGUgc3ltYm9scyBhcmVuJ3QKLSAgICAgICAgLy8gc29ydGVkIHlldCBzbyB3ZSBqdXN0IHNlYXJjaCB0aGUgd2hvbGUgbGlzdC4KLSAgICAgICAgaW50IGlpOwotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBuZnVuY3M7ICsraWkpIHsKLSAgICAgICAgICAgIGlmIChhZGRyID09IGZ1bmNfc3ltYm9sc1tpaV0uYWRkcikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaWkgPT0gbmZ1bmNzKSB7Ci0gICAgICAgICAgICAvLyBTeW1ib2wgYXQgYWRkcmVzcyAiYWRkciIgZG9lcyBub3QgZXhpc3QsIHNvIGFkZCB0aGUgdGV4dAotICAgICAgICAgICAgLy8gc2VjdGlvbiBuYW1lLiAgVGhpcyB3aWxsIHVzdWFsbHkgYWRkIHRoZSAiLnBsdCIgc2VjdGlvbgotICAgICAgICAgICAgLy8gKHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlKS4KLSAgICAgICAgICAgIGludCBpZHggPSBzaGRyW3NlY3Rpb25dLnNoX25hbWU7Ci0gICAgICAgICAgICBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5hZGRyID0gYWRkcjsKLSAgICAgICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLm5hbWUgPSBTdHJkdXAoJnNlY3Rpb25fbmFtZXNbaWR4XSk7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGZ1bmNfc3ltYm9sc1tuZnVuY3NdLm5hbWUsICIucGx0IikgPT0gMCkgewotICAgICAgICAgICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLmZsYWdzIHw9IHN5bWJvbF90eXBlOjprSXNQbHQ7Ci0gICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gaW5jbHVkZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBuYW1lIG9mIHRoZSBsaWJyYXJ5LiAgT3RoZXJ3aXNlIHdlIHdpbGwgaGF2ZSBsb3RzCi0gICAgICAgICAgICAgICAgLy8gb2YgIi5wbHQiIHN5bWJvbHMuCi0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbihyZWdpb24tPnBhdGgpOwotICAgICAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oIjoucGx0Iik7Ci0gICAgICAgICAgICAgICAgY2hhciAqbmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOwotICAgICAgICAgICAgICAgIHN0cmNweShuYW1lLCByZWdpb24tPnBhdGgpOwotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiOi5wbHQiKTsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5uYW1lOwotICAgICAgICAgICAgICAgIGZ1bmNfc3ltYm9sc1tuZnVuY3NdLm5hbWUgPSBuYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBwYXJ0IG9mIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaW50ZXJwcmV0ZXIKLSAgICAgICAgICAgICAgICBjaGFyICpjcCA9IHN0cnJjaHIocmVnaW9uLT5wYXRoLCAnLycpOwotICAgICAgICAgICAgICAgIGlmIChjcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgcGFzdCB0aGUgJy8nCi0gICAgICAgICAgICAgICAgICAgIGNwICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vICcvJywgc28gdXNlIHRoZSB3aG9sZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgIGNwID0gcmVnaW9uLT5wYXRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGNwLCAibGliZHZtLnNvIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBmdW5jX3N5bWJvbHNbbmZ1bmNzXS5mbGFncyB8PSBzeW1ib2xfdHlwZTo6a0lzSW50ZXJwcmV0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmZ1bmNzICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSBqdXN0IHRoZSBzcGFjZSB3ZSBuZWVkIG5vdyB0aGF0IHdlIGtub3cgZXhhY3RseQotICAgIC8vIGhvdyBtYW55IHN5bWJvbHMgd2UgaGF2ZS4KLSAgICBzeW1ib2xfdHlwZSAqZnVuY3Rpb25zID0gbmV3IHN5bWJvbF90eXBlW25mdW5jc107Ci0KLSAgICAvLyBDb3B5IHRoZSBzeW1ib2xzIHRvIHRoZSBmdW5jdGlvbnMgYXJyYXkKLSAgICBtZW1jcHkoZnVuY3Rpb25zLCBmdW5jX3N5bWJvbHMsIG5mdW5jcyAqIHNpemVvZihzeW1ib2xfdHlwZSkpOwotICAgIGRlbGV0ZVtdIGZ1bmNfc3ltYm9sczsKLQotICAgIC8vIEFzc2lnbiB0aGUgcmVnaW9uIHBvaW50ZXJzCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5mdW5jczsgKytpaSkgewotICAgICAgICBmdW5jdGlvbnNbaWldLnJlZ2lvbiA9IHJlZ2lvbjsKLSAgICB9Ci0KLSAgICAvLyBTb3J0IHRoZSBzeW1ib2xzIGludG8gaW5jcmVhc2luZyBhZGRyZXNzIG9yZGVyCi0gICAgcXNvcnQoZnVuY3Rpb25zLCBuZnVuY3MsIHNpemVvZihzeW1ib2xfdHlwZSksIGNtcF9zeW1ib2xfYWRkcjxUPik7Ci0KLSAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3ltYm9scyB3aXRoIHRoZSBzYW1lIGFkZHJlc3MsIHRoZW4gcmVtb3ZlCi0gICAgLy8gdGhlIGR1cGxpY2F0ZXMuICBGaXJzdCwgY291bnQgdGhlIG51bWJlciBvZiBkdXBsaWNhdGVzLgotICAgIHVpbnQzMl90IHByZXZfYWRkciA9IH4wOwotICAgIGludCBudW1fZHVwbGljYXRlcyA9IDA7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5mdW5jczsgKytpaSkgewotICAgICAgICBpZiAocHJldl9hZGRyID09IGZ1bmN0aW9uc1tpaV0uYWRkcikKLSAgICAgICAgICAgIG51bV9kdXBsaWNhdGVzICs9IDE7Ci0gICAgICAgIHByZXZfYWRkciA9IGZ1bmN0aW9uc1tpaV0uYWRkcjsKLSAgICB9Ci0gCi0gICAgaWYgKG51bV9kdXBsaWNhdGVzID4gMCkgewotICAgICAgICBpbnQgbnVtX3VuaXEgPSBuZnVuY3MgLSBudW1fZHVwbGljYXRlczsKLQotICAgICAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHVuaXF1ZSBmdW5jdGlvbnMKLSAgICAgICAgc3ltYm9sX3R5cGUgKnVuaXFfZnVuY3Rpb25zID0gbmV3IHN5bWJvbF90eXBlW251bV91bmlxXTsKLQotICAgICAgICAvLyBDb3B5IHRoZSB1bmlxdWUgZnVuY3Rpb25zCi0gICAgICAgIHByZXZfYWRkciA9IH4wOwotICAgICAgICBpbnQgbmV4dF91bmlxID0gMDsKLSAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5mdW5jczsgKytpaSkgewotICAgICAgICAgICAgaWYgKHByZXZfYWRkciA9PSBmdW5jdGlvbnNbaWldLmFkZHIpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBmdW5jdGlvbnNbaWldLm5hbWU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoJnVuaXFfZnVuY3Rpb25zW25leHRfdW5pcSsrXSwgJmZ1bmN0aW9uc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN5bWJvbF90eXBlKSk7Ci0gICAgICAgICAgICBwcmV2X2FkZHIgPSBmdW5jdGlvbnNbaWldLmFkZHI7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KG5leHRfdW5pcSA9PSBudW1fdW5pcSk7Ci0KLSAgICAgICAgZGVsZXRlW10gZnVuY3Rpb25zOwotICAgICAgICBmdW5jdGlvbnMgPSB1bmlxX2Z1bmN0aW9uczsKLSAgICAgICAgbmZ1bmNzID0gbnVtX3VuaXE7Ci0gICAgfQotCi0gICAgLy8gRmluYWxseSwgZGVtYW5nbGUgYWxsIG9mIHRoZSBzeW1ib2wgbmFtZXMKLSAgICBkZW1hbmdsZV9uYW1lcyhuZnVuY3MsIGZ1bmN0aW9ucyk7Ci0KLSAgICB1aW50MzJfdCBtaW5fYWRkciA9IDA7Ci0gICAgaWYgKCF6ZXJvX2ZvdW5kKQotICAgICAgICBtaW5fYWRkciA9IGZ1bmN0aW9uc1sxXS5hZGRyOwotICAgIGlmIChyZWdpb24tPnZzdGFydCA9PSAwKQotICAgICAgICByZWdpb24tPnZzdGFydCA9IG1pbl9hZGRyOwotICAgIHJlZ2lvbi0+bnN5bWJvbHMgPSBuZnVuY3M7Ci0gICAgcmVnaW9uLT5zeW1ib2xzID0gZnVuY3Rpb25zOwotCi0jaWYgMAotICAgIHByaW50ZigiJXMgbnVtIHN5bWJvbHM6ICVkIG1pbl9hZGRyOiAweCV4XG4iLCByZWdpb24tPnBhdGgsIG5mdW5jcywgbWluX2FkZHIpOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuZnVuY3M7ICsraWkpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwOHggJXNcbiIsIGZ1bmN0aW9uc1tpaV0uYWRkciwgZnVuY3Rpb25zW2lpXS5uYW1lKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBkZWxldGVbXSBlbGZfc3ltYm9sczsKLSAgICBkZWxldGVbXSBzeW1ib2xfbmFtZXM7Ci0gICAgZGVsZXRlW10gc2VjdGlvbl9uYW1lczsKLSAgICBkZWxldGVbXSBzaGRyOwotICAgIGRlbGV0ZSBoZHI7Ci0gICAgZmNsb3NlKGZvYmopOwotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6Q29weUtlcm5lbFJlZ2lvbihQcm9jZXNzU3RhdGUgKnBzdGF0ZSkKLXsKLSAgICBQcm9jZXNzU3RhdGUgKm1hbmFnZXIgPSBwc3RhdGUtPmFkZHJfbWFuYWdlcjsKLSAgICBpZiAobWFuYWdlci0+ZmxhZ3MgJiBQcm9jZXNzU3RhdGU6OmtIYXNLZXJuZWxSZWdpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCBucmVnaW9ucyA9IHByb2Nlc3Nlc19bMF0tPm5yZWdpb25zOwotICAgIHJlZ2lvbl90eXBlICoqcmVnaW9ucyA9IHByb2Nlc3Nlc19bMF0tPnJlZ2lvbnM7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5yZWdpb25zOyBpaSsrKSB7Ci0gICAgICAgIGlmIChyZWdpb25zW2lpXS0+ZmxhZ3MgJiByZWdpb25fdHlwZTo6a0lzS2VybmVsUmVnaW9uKSB7Ci0gICAgICAgICAgICBBZGRSZWdpb24obWFuYWdlciwgcmVnaW9uc1tpaV0pOwotICAgICAgICAgICAgcmVnaW9uc1tpaV0tPnJlZnMgKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtYW5hZ2VyLT5mbGFncyB8PSBQcm9jZXNzU3RhdGU6OmtIYXNLZXJuZWxSZWdpb247Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFRyYWNlUmVhZGVyPFQ+OjpDbGVhclJlZ2lvbnMoUHJvY2Vzc1N0YXRlICpwc3RhdGUpCi17Ci0gICAgYXNzZXJ0KHBzdGF0ZS0+cGlkICE9IDApOwotICAgIGludCBucmVnaW9ucyA9IHBzdGF0ZS0+bnJlZ2lvbnM7Ci0gICAgcmVnaW9uX3R5cGUgKipyZWdpb25zID0gcHN0YXRlLT5yZWdpb25zOwotCi0gICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gYWxsIHRoZSByZWdpb25zCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5yZWdpb25zOyBpaSsrKSB7Ci0gICAgICAgIGlmIChyZWdpb25zW2lpXS0+cmVmcyA+IDApIHsKLSAgICAgICAgICAgIHJlZ2lvbnNbaWldLT5yZWZzIC09IDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbGV0ZSByZWdpb25zW2lpXTsKLSAgICB9Ci0gICAgZGVsZXRlW10gcHN0YXRlLT5yZWdpb25zOwotICAgIHBzdGF0ZS0+cmVnaW9ucyA9IE5VTEw7Ci0gICAgcHN0YXRlLT5ucmVnaW9ucyA9IDA7Ci0gICAgcHN0YXRlLT5tYXhfcmVnaW9ucyA9IDA7Ci0gICAgcHN0YXRlLT5hZGRyX21hbmFnZXIgPSBwc3RhdGU7Ci0gICAgcHN0YXRlLT5mbGFncyAmPSB+UHJvY2Vzc1N0YXRlOjprSXNDbG9uZTsKLSAgICBwc3RhdGUtPmZsYWdzICY9IH5Qcm9jZXNzU3RhdGU6OmtIYXNLZXJuZWxSZWdpb247Ci0gICAgQ29weUtlcm5lbFJlZ2lvbihwc3RhdGUpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6QWRkUmVnaW9uKFByb2Nlc3NTdGF0ZSAqcHN0YXRlLCByZWdpb25fdHlwZSAqcmVnaW9uKQotewotICAgIFByb2Nlc3NTdGF0ZSAqbWFuYWdlciA9IHBzdGF0ZS0+YWRkcl9tYW5hZ2VyOwotICAgIGlmIChtYW5hZ2VyLT5yZWdpb25zID09IE5VTEwpIHsKLSAgICAgICAgbWFuYWdlci0+bWF4X3JlZ2lvbnMgPSBQcm9jZXNzU3RhdGU6OmtJbml0aWFsTnVtUmVnaW9uczsKLSAgICAgICAgbWFuYWdlci0+cmVnaW9ucyA9IG5ldyByZWdpb25fdHlwZSpbbWFuYWdlci0+bWF4X3JlZ2lvbnNdOwotICAgICAgICBtYW5hZ2VyLT5ucmVnaW9ucyA9IDA7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBncm93IHRoZSBhcnJheQotICAgIGludCBucmVnaW9ucyA9IG1hbmFnZXItPm5yZWdpb25zOwotICAgIGludCBtYXhfcmVnaW9ucyA9IG1hbmFnZXItPm1heF9yZWdpb25zOwotICAgIGlmIChucmVnaW9ucyA+PSBtYXhfcmVnaW9ucykgewotICAgICAgICBtYXhfcmVnaW9ucyA8PD0gMTsKLSAgICAgICAgbWFuYWdlci0+bWF4X3JlZ2lvbnMgPSBtYXhfcmVnaW9uczsKLSAgICAgICAgcmVnaW9uX3R5cGUgKipyZWdpb25zID0gbmV3IHJlZ2lvbl90eXBlKlttYXhfcmVnaW9uc107Ci0gICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBucmVnaW9uczsgaWkrKykgewotICAgICAgICAgICAgcmVnaW9uc1tpaV0gPSBtYW5hZ2VyLT5yZWdpb25zW2lpXTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVbXSBtYW5hZ2VyLT5yZWdpb25zOwotICAgICAgICBtYW5hZ2VyLT5yZWdpb25zID0gcmVnaW9uczsKLSAgICB9Ci0KLSAgICAvLyBBZGQgdGhlIG5ldyByZWdpb24gdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYW5kIHJlc29ydAotICAgIG1hbmFnZXItPnJlZ2lvbnNbbnJlZ2lvbnNdID0gcmVnaW9uOwotICAgIG5yZWdpb25zICs9IDE7Ci0gICAgbWFuYWdlci0+bnJlZ2lvbnMgPSBucmVnaW9uczsKLQotICAgIC8vIFJlc29ydCB0aGUgcmVnaW9ucyBpbnRvIGluY3JlYXNpbmcgc3RhcnQgYWRkcmVzcwotICAgIHFzb3J0KG1hbmFnZXItPnJlZ2lvbnMsIG5yZWdpb25zLCBzaXplb2YocmVnaW9uX3R5cGUqKSwgY21wX3JlZ2lvbl9hZGRyPFQ+KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgVHJhY2VSZWFkZXI8VD46OkZpbmRBbmRSZW1vdmVSZWdpb24oUHJvY2Vzc1N0YXRlICpwc3RhdGUsIHVpbnQzMl90IHZzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVuZCkKLXsKLSAgICBQcm9jZXNzU3RhdGUgKm1hbmFnZXIgPSBwc3RhdGUtPmFkZHJfbWFuYWdlcjsKLSAgICBpbnQgbnJlZ2lvbnMgPSBtYW5hZ2VyLT5ucmVnaW9uczsKLSAgICBpbnQgaW5kZXggPSBGaW5kUmVnaW9uSW5kZXgodnN0YXJ0LCBucmVnaW9ucywgbWFuYWdlci0+cmVnaW9ucyk7Ci0gICAgcmVnaW9uX3R5cGUgKnJlZ2lvbiA9IG1hbmFnZXItPnJlZ2lvbnNbaW5kZXhdOwotCi0gICAgLy8gSWYgdGhlIHJlZ2lvbiBkb2VzIG5vdCBjb250YWluIFt2c3RhcnQsdmVuZF0sIHRoZW4gcmV0dXJuLgotICAgIGlmICh2c3RhcnQgPCByZWdpb24tPnZzdGFydCB8fCB2ZW5kID4gcmVnaW9uLT52ZW5kKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBJZiB0aGUgZXhpc3RpbmcgcmVnaW9uIGV4YWN0bHkgbWF0Y2hlcyB0aGUgYWRkcmVzcyByYW5nZSBbdnN0YXJ0LHZlbmRdCi0gICAgLy8gdGhlbiByZW1vdmUgdGhlIHdob2xlIHJlZ2lvbi4KLSAgICBpZiAodnN0YXJ0ID09IHJlZ2lvbi0+dnN0YXJ0ICYmIHZlbmQgPT0gcmVnaW9uLT52ZW5kKSB7Ci0gICAgICAgIC8vIFRoZSByZWdpb25zIGFyZSByZWZlcmVuY2UtY291bnRlZC4KLSAgICAgICAgaWYgKHJlZ2lvbi0+cmVmcyA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBGcmVlIHRoZSByZWdpb24KLSAgICAgICAgICAgIGhhc2hfLT5SZW1vdmUocmVnaW9uLT5wYXRoKTsKLSAgICAgICAgICAgIGRlbGV0ZSByZWdpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdpb24tPnJlZnMgLT0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChucmVnaW9ucyA+IDEpIHsKLSAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcmVnaW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5IHRvIHRoaXMgZW1wdHkgc2xvdAotICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpbmRleF0gPSBtYW5hZ2VyLT5yZWdpb25zW25yZWdpb25zIC0gMV07Ci0KLSAgICAgICAgICAgIC8vIFJlc29ydCB0aGUgcmVnaW9ucyBpbnRvIGluY3JlYXNpbmcgc3RhcnQgYWRkcmVzcwotICAgICAgICAgICAgcXNvcnQobWFuYWdlci0+cmVnaW9ucywgbnJlZ2lvbnMgLSAxLCBzaXplb2YocmVnaW9uX3R5cGUqKSwKLSAgICAgICAgICAgICAgICAgIGNtcF9yZWdpb25fYWRkcjxUPik7Ci0gICAgICAgIH0KLSAgICAgICAgbWFuYWdlci0+bnJlZ2lvbnMgPSBucmVnaW9ucyAtIDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgZXhpc3RpbmcgcmVnaW9uIGNvbnRhaW5zIHRoZSBnaXZlbiByYW5nZSBhbmQgZW5kcyBhdCB0aGUKLSAgICAvLyBlbmQgb2YgdGhlIGdpdmVuIHJhbmdlIChhIGNvbW1vbiBjYXNlIGZvciBzb21lIHJlYXNvbiksIHRoZW4KLSAgICAvLyB0cnVuY2F0ZSB0aGUgZXhpc3RpbmcgcmVnaW9uIHNvIHRoYXQgaXQgZW5kcyBhdCB2c3RhcnQgKGJlY2F1c2UKLSAgICAvLyB3ZSBhcmUgZGVsZXRpbmcgdGhlIHJhbmdlIFt2c3RhcnQsdmVuZF0pLgotICAgIGlmICh2c3RhcnQgPiByZWdpb24tPnZzdGFydCAmJiB2ZW5kID09IHJlZ2lvbi0+dmVuZCkgewotICAgICAgICByZWdpb25fdHlwZSAqdHJ1bmNhdGVkOwotCi0gICAgICAgIGlmIChyZWdpb24tPnJlZnMgPT0gMCkgewotICAgICAgICAgICAgLy8gVGhpcyByZWdpb24gaXMgbm90IHNoYXJlZCwgc28gdHJ1bmNhdGUgaXQgZGlyZWN0bHkKLSAgICAgICAgICAgIHRydW5jYXRlZCA9IHJlZ2lvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgcmVnaW9uIGlzIHNoYXJlZCwgc28gbWFrZSBhIGNvcHkgdGhhdCB3ZSBjYW4gdHJ1bmNhdGUKLSAgICAgICAgICAgIHJlZ2lvbi0+cmVmcyAtPSAxOwotICAgICAgICAgICAgdHJ1bmNhdGVkID0gcmVnaW9uLT5NYWtlUHJpdmF0ZUNvcHkobmV3IHJlZ2lvbl90eXBlKTsKLSAgICAgICAgfQotICAgICAgICB0cnVuY2F0ZWQtPnZlbmQgPSB2c3RhcnQ7Ci0gICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaW5kZXhdID0gdHJ1bmNhdGVkOwotICAgIH0KLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgVHJhY2VSZWFkZXI8VD46OkNvcHlSZWdpb25zKFByb2Nlc3NTdGF0ZSAqcGFyZW50LCBQcm9jZXNzU3RhdGUgKmNoaWxkKQotewotICAgIC8vIENvcHkgdGhlIHBhcmVudCdzIGFkZHJlc3Mgc3BhY2UKLSAgICBQcm9jZXNzU3RhdGUgKm1hbmFnZXIgPSBwYXJlbnQtPmFkZHJfbWFuYWdlcjsKLSAgICBpbnQgbnJlZ2lvbnMgPSBtYW5hZ2VyLT5ucmVnaW9uczsKLSAgICBjaGlsZC0+bnJlZ2lvbnMgPSBucmVnaW9uczsKLSAgICBjaGlsZC0+bWF4X3JlZ2lvbnMgPSBtYW5hZ2VyLT5tYXhfcmVnaW9uczsKLSAgICByZWdpb25fdHlwZSAqKnJlZ2lvbnMgPSBuZXcgcmVnaW9uX3R5cGUqW21hbmFnZXItPm1heF9yZWdpb25zXTsKLSAgICBjaGlsZC0+cmVnaW9ucyA9IHJlZ2lvbnM7Ci0gICAgbWVtY3B5KHJlZ2lvbnMsIG1hbmFnZXItPnJlZ2lvbnMsIG5yZWdpb25zICogc2l6ZW9mKHJlZ2lvbl90eXBlKikpOwotCi0gICAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gYWxsIHRoZSByZWdpb25zCi0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5yZWdpb25zOyBpaSsrKSB7Ci0gICAgICAgIHJlZ2lvbnNbaWldLT5yZWZzICs9IDE7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6RHVtcFJlZ2lvbnMoRklMRSAqc3RyZWFtLCBQcm9jZXNzU3RhdGUgKnBzdGF0ZSkgewotICAgIFByb2Nlc3NTdGF0ZSAqbWFuYWdlciA9IHBzdGF0ZS0+YWRkcl9tYW5hZ2VyOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtYW5hZ2VyLT5ucmVnaW9uczsgKytpaSkgewotICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgJTA4eCAtICUwOHggb2Zmc2V0OiAlNXggIG5zeW1zOiAlNGQgcmVmczogJWQgJXNcbiIsCi0gICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPnZzdGFydCwKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLT5yZWdpb25zW2lpXS0+dmVuZCwKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLT5yZWdpb25zW2lpXS0+ZmlsZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPm5zeW1ib2xzLAotICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5yZWZzLAotICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5wYXRoKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci10eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6cmVnaW9uX3R5cGUgKgotVHJhY2VSZWFkZXI8VD46OkZpbmRSZWdpb24odWludDMyX3QgYWRkciwgaW50IG5yZWdpb25zLCByZWdpb25fdHlwZSAqKnJlZ2lvbnMpCi17Ci0gICAgaW50IGhpZ2ggPSBucmVnaW9uczsKLSAgICBpbnQgbG93ID0gLTE7Ci0gICAgd2hpbGUgKGxvdyArIDEgPCBoaWdoKSB7Ci0gICAgICAgIGludCBtaWRkbGUgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgICB1aW50MzJfdCBtaWRkbGVfYWRkciA9IHJlZ2lvbnNbbWlkZGxlXS0+dnN0YXJ0OwotICAgICAgICBpZiAobWlkZGxlX2FkZHIgPT0gYWRkcikKLSAgICAgICAgICAgIHJldHVybiByZWdpb25zW21pZGRsZV07Ci0gICAgICAgIGlmIChtaWRkbGVfYWRkciA+IGFkZHIpCi0gICAgICAgICAgICBoaWdoID0gbWlkZGxlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb3cgPSBtaWRkbGU7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYW4gZXhhY3QgYWRkcmVzcyBtYXRjaC4gIFNvIHVzZQotICAgIC8vIHRoZSBjbG9zZXN0IHJlZ2lvbiBhZGRyZXNzIHRoYXQgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBhZGRyZXNzLgotICAgIGlmIChsb3cgPCAwKQotICAgICAgICBsb3cgPSAwOwotICAgIHJldHVybiByZWdpb25zW2xvd107Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1pbnQgVHJhY2VSZWFkZXI8VD46OkZpbmRSZWdpb25JbmRleCh1aW50MzJfdCBhZGRyLCBpbnQgbnJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fdHlwZSAqKnJlZ2lvbnMpCi17Ci0gICAgaW50IGhpZ2ggPSBucmVnaW9uczsKLSAgICBpbnQgbG93ID0gLTE7Ci0gICAgd2hpbGUgKGxvdyArIDEgPCBoaWdoKSB7Ci0gICAgICAgIGludCBtaWRkbGUgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgICB1aW50MzJfdCBtaWRkbGVfYWRkciA9IHJlZ2lvbnNbbWlkZGxlXS0+dnN0YXJ0OwotICAgICAgICBpZiAobWlkZGxlX2FkZHIgPT0gYWRkcikKLSAgICAgICAgICAgIHJldHVybiBtaWRkbGU7Ci0gICAgICAgIGlmIChtaWRkbGVfYWRkciA+IGFkZHIpCi0gICAgICAgICAgICBoaWdoID0gbWlkZGxlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb3cgPSBtaWRkbGU7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYW4gZXhhY3QgYWRkcmVzcyBtYXRjaC4gIFNvIHVzZQotICAgIC8vIHRoZSBjbG9zZXN0IHJlZ2lvbiBhZGRyZXNzIHRoYXQgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBhZGRyZXNzLgotICAgIGlmIChsb3cgPCAwKQotICAgICAgICBsb3cgPSAwOwotICAgIHJldHVybiBsb3c7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci10eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6c3ltYm9sX3R5cGUgKgotVHJhY2VSZWFkZXI8VD46OkZpbmRGdW5jdGlvbih1aW50MzJfdCBhZGRyLCBpbnQgbnN5bXMsIHN5bWJvbF90eXBlICpzeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4YWN0X21hdGNoKQotewotICAgIGludCBoaWdoID0gbnN5bXM7Ci0gICAgaW50IGxvdyA9IC0xOwotICAgIHdoaWxlIChsb3cgKyAxIDwgaGlnaCkgewotICAgICAgICBpbnQgbWlkZGxlID0gKGhpZ2ggKyBsb3cpIC8gMjsKLSAgICAgICAgdWludDMyX3QgbWlkZGxlX2FkZHIgPSBzeW1ib2xzW21pZGRsZV0uYWRkcjsKLSAgICAgICAgaWYgKG1pZGRsZV9hZGRyID09IGFkZHIpCi0gICAgICAgICAgICByZXR1cm4gJnN5bWJvbHNbbWlkZGxlXTsKLSAgICAgICAgaWYgKG1pZGRsZV9hZGRyID4gYWRkcikKLSAgICAgICAgICAgIGhpZ2ggPSBtaWRkbGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvdyA9IG1pZGRsZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGRpZCBub3QgZmluZCBhbiBleGFjdCBhZGRyZXNzIG1hdGNoLiAgU28gdXNlCi0gICAgLy8gdGhlIGNsb3Nlc3QgZnVuY3Rpb24gYWRkcmVzcyB0aGF0IGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICAvLyBXZSBhZGRlZCBhIHN5bWJvbCB3aXRoIGFkZHJlc3MgemVybyBzbyBpZiB0aGVyZSBpcyBubyBrbm93bgotICAgIC8vIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFkZHJlc3MsIHRoZW4gd2Ugd2lsbCByZXR1cm4gdGhlCi0gICAgLy8gIih1bmtub3duKSIgc3ltYm9sLgotICAgIGlmIChsb3cgPj0gMCAmJiAhZXhhY3RfbWF0Y2gpCi0gICAgICAgIHJldHVybiAmc3ltYm9sc1tsb3ddOwotICAgIHJldHVybiBOVUxMOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdHlwZW5hbWUgVHJhY2VSZWFkZXI8VD46OnN5bWJvbF90eXBlICoKLVRyYWNlUmVhZGVyPFQ+OjpMb29rdXBGdW5jdGlvbihpbnQgcGlkLCB1aW50MzJfdCBhZGRyLCB1aW50NjRfdCB0aW1lKQotewotICAgIC8vIENoZWNrIGlmIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBzdGlsbCBhIGdvb2QgbWF0Y2guCi0gICAgaWYgKGNhY2hlZF9waWRfID09IHBpZCkgewotICAgICAgICB1aW50MzJfdCB2c3RhcnQgPSBjYWNoZWRfZnVuY18tPnJlZ2lvbi0+dnN0YXJ0OwotICAgICAgICB1aW50MzJfdCB2ZW5kID0gY2FjaGVkX2Z1bmNfLT5yZWdpb24tPnZlbmQ7Ci0gICAgICAgIGlmIChhZGRyID49IHZzdGFydCAmJiBhZGRyIDwgdmVuZCkgewotICAgICAgICAgICAgdWludDMyX3Qgc3ltX2FkZHIgPSBhZGRyIC0gY2FjaGVkX2Z1bmNfLT5yZWdpb24tPmJhc2VfYWRkcjsKLSAgICAgICAgICAgIGlmIChzeW1fYWRkciA+PSBjYWNoZWRfZnVuY18tPmFkZHIKLSAgICAgICAgICAgICAgICAmJiBzeW1fYWRkciA8IChjYWNoZWRfZnVuY18gKyAxKS0+YWRkcikgewotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBKYXZhIG1ldGhvZCBvbiB0aGUgbWV0aG9kIHRyYWNlLgotICAgICAgICAgICAgICAgIHN5bWJvbF90eXBlICpzeW0gPSBGaW5kQ3VycmVudE1ldGhvZChwaWQsIHRpbWUpOwotICAgICAgICAgICAgICAgIGlmIChzeW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzeW0tPnZtX3N5bSA9IGNhY2hlZF9mdW5jXzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZF9mdW5jXzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFByb2Nlc3NTdGF0ZSAqcHN0YXRlID0gcHJvY2Vzc2VzX1twaWRdOwotICAgIGlmIChwc3RhdGUgPT0gTlVMTCkgewotICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm9jZXNzIHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIHBpZC4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgotICAgICAgICBjYWNoZWRfcGlkXyA9IC0xOwotICAgICAgICBjYWNoZWRfZnVuY18gPSBOVUxMOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHJvY2Vzc1N0YXRlICptYW5hZ2VyID0gcHN0YXRlLT5hZGRyX21hbmFnZXI7Ci0gICAgY2FjaGVkX3BpZF8gPSBwaWQ7Ci0gICAgcmVnaW9uX3R5cGUgKnJlZ2lvbiA9IEZpbmRSZWdpb24oYWRkciwgbWFuYWdlci0+bnJlZ2lvbnMsIG1hbmFnZXItPnJlZ2lvbnMpOwotICAgIHVpbnQzMl90IHN5bV9hZGRyID0gYWRkciAtIHJlZ2lvbi0+YmFzZV9hZGRyOwotCi0gICAgY2FjaGVkX2Z1bmNfID0gRmluZEZ1bmN0aW9uKHN5bV9hZGRyLCByZWdpb24tPm5zeW1ib2xzLCByZWdpb24tPnN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vIGV4YWN0IG1hdGNoICovKTsKLSAgICBpZiAoY2FjaGVkX2Z1bmNfICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGVkX2Z1bmNfLT5yZWdpb24gPSByZWdpb247Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBKYXZhIG1ldGhvZCBvbiB0aGUgbWV0aG9kIHRyYWNlLgotICAgICAgICBzeW1ib2xfdHlwZSAqc3ltID0gRmluZEN1cnJlbnRNZXRob2QocGlkLCB0aW1lKTsKLSAgICAgICAgaWYgKHN5bSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzeW0tPnZtX3N5bSA9IGNhY2hlZF9mdW5jXzsKLSAgICAgICAgICAgIHJldHVybiBzeW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2FjaGVkX2Z1bmNfOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgVHJhY2VSZWFkZXI8VD46OkhhbmRsZVBpZEV2ZW50KFBpZEV2ZW50ICpldmVudCkKLXsKLSAgICBzd2l0Y2ggKGV2ZW50LT5yZWNfdHlwZSkgewotICAgIGNhc2Uga1BpZEZvcms6Ci0gICAgY2FzZSBrUGlkQ2xvbmU6Ci0gICAgICAgIC8vIGV2ZW50LT5waWQgaXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIGNoaWxkCi0gICAgICAgIGlmIChldmVudC0+cGlkID49IGtOdW1QaWRzKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBwaWQgKCVkKSB0b28gbGFyZ2VcbiIsIGV2ZW50LT5waWQpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUHJvY2Vzc1N0YXRlIHN0cnVjdCBmb3IgdGhlIGNoaWxkCi0gICAgICAgIC8vIGFuZCBsaW5rIGl0IGluIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCBmb3IgdGhhdAotICAgICAgICAvLyBwaWQuCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb2Nlc3NTdGF0ZSAqY2hpbGQgPSBuZXcgUHJvY2Vzc1N0YXRlOwotICAgICAgICAgICAgcHJvY2Vzc2VzX1tldmVudC0+cGlkXSA9IGNoaWxkOwotICAgICAgICAgICAgY2hpbGQtPnBpZCA9IGV2ZW50LT5waWQ7Ci0gICAgICAgICAgICBjaGlsZC0+dGdpZCA9IGV2ZW50LT50Z2lkOwotCi0gICAgICAgICAgICAvLyBMaW5rIHRoZSBuZXcgY2hpbGQgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0IChvbmx5IG5lZWRlZCBpZgotICAgICAgICAgICAgLy8gcGlkcyB3cmFwIGFyb3VuZCwgd2hpY2ggd2lsbCBwcm9iYWJseSBuZXZlciBoYXBwZW4gd2hlbgotICAgICAgICAgICAgLy8gdHJhY2luZyBiZWNhdXNlIGl0IHdvdWxkIHRha2Ugc28gbG9uZykuCi0gICAgICAgICAgICBjaGlsZC0+bmV4dCA9IHByb2Nlc3Nlc19bZXZlbnQtPnBpZF07Ci0gICAgICAgICAgICBjaGlsZC0+cGFyZW50X3BpZCA9IGN1cnJlbnRfLT5waWQ7Ci0gICAgICAgICAgICBjaGlsZC0+cGFyZW50ID0gY3VycmVudF87Ci0gICAgICAgICAgICBjaGlsZC0+c3RhcnRfdGltZSA9IGV2ZW50LT50aW1lOwotICAgICAgICAgICAgY2hpbGQtPm5hbWUgPSBTdHJkdXAoY3VycmVudF8tPm5hbWUpOwotICAgICAgICAgICAgaWYgKGV2ZW50LT5yZWNfdHlwZSA9PSBrUGlkRm9yaykgewotICAgICAgICAgICAgICAgIENvcHlSZWdpb25zKGN1cnJlbnRfLCBjaGlsZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNoYXJlIHRoZSBwYXJlbnQncyBhZGRyZXNzIHNwYWNlCi0gICAgICAgICAgICAgICAgY2hpbGQtPmZsYWdzIHw9IFByb2Nlc3NTdGF0ZTo6a0lzQ2xvbmU7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgYWRkcmVzcyBzcGFjZSBtYW5hZ2VyIGZvciB0aGUgY2xvbmUgaXMgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAvLyBhcyB0aGUgYWRkcmVzcyBzcGFjZSBtYW5hZ2VyIGZvciB0aGUgcGFyZW50LiAgVGhpcyB3b3JrcwotICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGNoaWxkIGxhdGVyIGNsb25lcyBpdHNlbGYuCi0gICAgICAgICAgICAgICAgY2hpbGQtPmFkZHJfbWFuYWdlciA9IGN1cnJlbnRfLT5hZGRyX21hbmFnZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUGlkU3dpdGNoOgotICAgICAgICAvLyBldmVudC0+cGlkIGlzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSBwcm9jZXNzIHdlIGFyZQotICAgICAgICAvLyBzd2l0Y2hpbmcgdG8uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IGVsYXBzZWQgPSBldmVudC0+dGltZSAtIGZ1bmN0aW9uX3N0YXJ0X3RpbWVfOwotICAgICAgICAgICAgZnVuY3Rpb25fc3RhcnRfdGltZV8gPSBldmVudC0+dGltZTsKLSAgICAgICAgICAgIGN1cnJlbnRfLT5jcHVfdGltZSArPSBlbGFwc2VkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50Xy0+ZmxhZ3MgJiBQcm9jZXNzU3RhdGU6OmtDYWxsZWRFeGl0KQotICAgICAgICAgICAgY3VycmVudF8tPmVuZF90aW1lID0gZXZlbnQtPnRpbWU7Ci0KLSAgICAgICAgaWYgKGV2ZW50LT5waWQgPj0ga051bVBpZHMpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHBpZCAoJWQpIHRvbyBsYXJnZVxuIiwgZXZlbnQtPnBpZCk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHByb2Nlc3Mgd2UgYXJlIHN3aXRjaGluZyB0byBkb2VzIG5vdCBleGlzdCwgdGhlbgotICAgICAgICAvLyBjcmVhdGUgb25lLiAgVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2UgdGhlIHRyYWNpbmcgY29kZSBkb2VzCi0gICAgICAgIC8vIG5vdCBzdGFydCB0cmFjaW5nIGZyb20gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBrZXJuZWwuCi0gICAgICAgIGN1cnJlbnRfID0gcHJvY2Vzc2VzX1tldmVudC0+cGlkXTsKLSAgICAgICAgaWYgKGN1cnJlbnRfID09IE5VTEwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRfID0gbmV3IFByb2Nlc3NTdGF0ZTsKLSAgICAgICAgICAgIHByb2Nlc3Nlc19bZXZlbnQtPnBpZF0gPSBjdXJyZW50XzsKLSAgICAgICAgICAgIGN1cnJlbnRfLT5waWQgPSBldmVudC0+cGlkOwotICAgICAgICAgICAgY3VycmVudF8tPnN0YXJ0X3RpbWUgPSBldmVudC0+dGltZTsKLSAgICAgICAgICAgIENvcHlLZXJuZWxSZWdpb24oY3VycmVudF8pOwotICAgICAgICB9Ci0jaWYgMAotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoInN3aXRjaGluZyB0byBwJWRcbiIsIGN1cnJlbnRfLT5waWQpOwotICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICptYW5hZ2VyID0gY3VycmVudF8tPmFkZHJfbWFuYWdlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtYW5hZ2VyLT5ucmVnaW9uczsgKytpaSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAlMDh4IC0gJTA4eCBvZmZzZXQ6ICVkIG5zeW1zOiAlNGQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT52c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT52ZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLT5yZWdpb25zW2lpXS0+ZmlsZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXItPnJlZ2lvbnNbaWldLT5uc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci0+cmVnaW9uc1tpaV0tPnBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUGlkRXhpdDoKLSAgICAgICAgY3VycmVudF8tPmV4aXRfdmFsID0gZXZlbnQtPnBpZDsKLSAgICAgICAgY3VycmVudF8tPmZsYWdzIHw9IFByb2Nlc3NTdGF0ZTo6a0NhbGxlZEV4aXQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga1BpZE11bm1hcDoKLSAgICAgICAgRmluZEFuZFJlbW92ZVJlZ2lvbihjdXJyZW50XywgZXZlbnQtPnZzdGFydCwgZXZlbnQtPnZlbmQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtQaWRNbWFwOgotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpb25fdHlwZSAqcmVnaW9uOwotICAgICAgICAgICAgcmVnaW9uX3R5cGUgKmV4aXN0aW5nX3JlZ2lvbiA9IGhhc2hfLT5GaW5kKGV2ZW50LT5wYXRoKTsKLSAgICAgICAgICAgIGlmIChleGlzdGluZ19yZWdpb24gPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8IGV4aXN0aW5nX3JlZ2lvbi0+dnN0YXJ0ICE9IGV2ZW50LT52c3RhcnQKLSAgICAgICAgICAgICAgICB8fCBleGlzdGluZ19yZWdpb24tPnZlbmQgIT0gZXZlbnQtPnZlbmQKLSAgICAgICAgICAgICAgICB8fCBleGlzdGluZ19yZWdpb24tPmZpbGVfb2Zmc2V0ICE9IGV2ZW50LT5vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcmVnaW9uIGFuZCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcycKLSAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIHNwYWNlLgotICAgICAgICAgICAgICAgIHJlZ2lvbiA9IG5ldyByZWdpb25fdHlwZTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudC0+cGF0aCBpcyBhbGxvY2F0ZWQgYnkgUmVhZFBpZEV2ZW50KCkgYW5kIG93bmVkCi0gICAgICAgICAgICAgICAgLy8gYnkgdXMuCi0gICAgICAgICAgICAgICAgcmVnaW9uLT5wYXRoID0gZXZlbnQtPnBhdGg7Ci0gICAgICAgICAgICAgICAgcmVnaW9uLT52c3RhcnQgPSBldmVudC0+dnN0YXJ0OwotICAgICAgICAgICAgICAgIHJlZ2lvbi0+dmVuZCA9IGV2ZW50LT52ZW5kOwotICAgICAgICAgICAgICAgIHJlZ2lvbi0+ZmlsZV9vZmZzZXQgPSBldmVudC0+b2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ19yZWdpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBEZXhGaWxlTGlzdCAqZGV4ZmlsZSA9IGRleF9oYXNoXy0+RmluZChldmVudC0+cGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXhmaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVsYXRlU3ltYm9sc0Zyb21EZXhGaWxlKGRleGZpbGUsIHJlZ2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWFkRWxmU3ltYm9scyhyZWdpb24sIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhc2hfLT5VcGRhdGUocmVnaW9uLT5wYXRoLCByZWdpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lvbi0+bnN5bWJvbHMgPSBleGlzdGluZ19yZWdpb24tPm5zeW1ib2xzOwotICAgICAgICAgICAgICAgICAgICByZWdpb24tPnN5bWJvbHMgPSBleGlzdGluZ19yZWdpb24tPnN5bWJvbHM7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lvbi0+ZmxhZ3MgfD0gcmVnaW9uX3R5cGU6OmtTaGFyZWRTeW1ib2xzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlX2FkZHIgaXMgc3VidHJhY3RlZCBmcm9tIGFuIGFkZHJlc3MgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBuYW1lIGxvb2t1cCBhbmQgaXMgZWl0aGVyIHplcm8gb3IgZXZlbnQtPnZzdGFydC4KLSAgICAgICAgICAgICAgICAvLyBIQUNLOiBEZXRlcm1pbmUgaWYgYmFzZV9hZGRyIGlzIG5vbi16ZXJvIGJ5IGxvb2tpbmcgYXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gc2Vjb25kIHN5bWJvbCBhZGRyZXNzIChza2lwIHRoZSBmaXJzdCBzeW1ib2wgYmVjYXVzZSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgc3ltYm9sICIodW5rbm93bikiIHdpdGggYW4gYWRkcmVzcyBvZiB6ZXJvKS4KLSAgICAgICAgICAgICAgICBpZiAocmVnaW9uLT5uc3ltYm9scyA+IDIgJiYgcmVnaW9uLT5zeW1ib2xzWzFdLmFkZHIgPCBldmVudC0+dnN0YXJ0KQotICAgICAgICAgICAgICAgICAgICByZWdpb24tPmJhc2VfYWRkciA9IGV2ZW50LT52c3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBUcmVhdCBhbGwgbW1hcHBlZCByZWdpb25zIGFmdGVyIHRoZSBmaXJzdCBhcyAibGlicmFyaWVzIi4KLSAgICAgICAgICAgICAgICAvLyBQcm9maWxpbmcgdG9vbHMgY2FuIHRlc3QgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfLT5mbGFncyAmIFByb2Nlc3NTdGF0ZTo6a0hhc0ZpcnN0TW1hcCkKLSAgICAgICAgICAgICAgICAgICAgcmVnaW9uLT5mbGFncyB8PSByZWdpb25fdHlwZTo6a0lzTGlicmFyeVJlZ2lvbjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfLT5mbGFncyB8PSBQcm9jZXNzU3RhdGU6OmtIYXNGaXJzdE1tYXA7Ci0jaWYgMAotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgdnN0YXJ0OiAweCV4IHZlbmQ6IDB4JXggb2Zmc2V0OiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICByZWdpb24tPnBhdGgsIHJlZ2lvbi0+dnN0YXJ0LCByZWdpb24tPnZlbmQsIHJlZ2lvbi0+ZmlsZV9vZmZzZXQpOwotI2VuZGlmCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlZ2lvbiA9IGV4aXN0aW5nX3JlZ2lvbjsKLSAgICAgICAgICAgICAgICByZWdpb24tPnJlZnMgKz0gMTsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBldmVudC0+cGF0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkZFJlZ2lvbihjdXJyZW50XywgcmVnaW9uKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtQaWRFeGVjOgotICAgICAgICBpZiAoY3VycmVudF8tPmFyZ2MgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgY3VycmVudF8tPmFyZ2M7IGlpKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBjdXJyZW50Xy0+YXJndltpaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSBjdXJyZW50Xy0+YXJndjsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVbXSBjdXJyZW50Xy0+bmFtZTsKLQotICAgICAgICBjdXJyZW50Xy0+YXJnYyA9IGV2ZW50LT5hcmdjOwotICAgICAgICBjdXJyZW50Xy0+YXJndiA9IGV2ZW50LT5hcmd2OwotICAgICAgICBjdXJyZW50Xy0+bmFtZSA9IFN0cmR1cChjdXJyZW50Xy0+YXJndlswXSk7Ci0gICAgICAgIGN1cnJlbnRfLT5mbGFncyB8PSBQcm9jZXNzU3RhdGU6OmtDYWxsZWRFeGVjOwotICAgICAgICBDbGVhclJlZ2lvbnMoY3VycmVudF8pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtQaWROYW1lOgotICAgIGNhc2Uga1BpZEt0aHJlYWROYW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9jZXNzU3RhdGUgKnBzdGF0ZSA9IHByb2Nlc3Nlc19bZXZlbnQtPnBpZF07Ci0gICAgICAgICAgICBpZiAocHN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwc3RhdGUgPSBuZXcgUHJvY2Vzc1N0YXRlOwotICAgICAgICAgICAgICAgIGlmIChldmVudC0+cmVjX3R5cGUgPT0ga1BpZEt0aHJlYWROYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBzdGF0ZS0+dGdpZCA9IGV2ZW50LT50Z2lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwc3RhdGUtPnBpZCA9IGV2ZW50LT5waWQ7Ci0gICAgICAgICAgICAgICAgcHN0YXRlLT5zdGFydF90aW1lID0gZXZlbnQtPnRpbWU7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VzX1tldmVudC0+cGlkXSA9IHBzdGF0ZTsKLSAgICAgICAgICAgICAgICBDb3B5S2VybmVsUmVnaW9uKHBzdGF0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHBzdGF0ZS0+bmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBzdGF0ZS0+bmFtZSA9IGV2ZW50LT5wYXRoOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga1BpZE5vQWN0aW9uOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtQaWRTeW1ib2xBZGQ6Ci0gICAgICAgIGRlbGV0ZVtdIGV2ZW50LT5wYXRoOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtQaWRTeW1ib2xSZW1vdmU6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLy8gRmluZHMgdGhlIGN1cnJlbnQgcGlkIGZvciB0aGUgZ2l2ZW4gdGltZS4gIFRoaXMgcm91dGluZSByZWFkcyB0aGUgcGlkCi0vLyB0cmFjZSBmaWxlIGFuZCBhc3N1bWVzIHRoYXQgdGhlICJ0aW1lIiBwYXJhbWV0ZXIgaXMgbW9ub3RvbmljYWxseQotLy8gaW5jcmVhc2luZy4KLXRlbXBsYXRlIDxjbGFzcyBUPgotaW50IFRyYWNlUmVhZGVyPFQ+OjpGaW5kQ3VycmVudFBpZCh1aW50NjRfdCB0aW1lKQotewotICAgIGlmICh0aW1lIDwgbmV4dF9waWRfZXZlbnRfLnRpbWUpCi0gICAgICAgIHJldHVybiBjdXJyZW50Xy0+cGlkOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgSGFuZGxlUGlkRXZlbnQoJm5leHRfcGlkX2V2ZW50Xyk7Ci0KLSAgICAgICAgaWYgKGludGVybmFsX3BpZF9yZWFkZXJfLT5SZWFkUGlkRXZlbnQoJm5leHRfcGlkX2V2ZW50XykpIHsKLSAgICAgICAgICAgIG5leHRfcGlkX2V2ZW50Xy50aW1lID0gfjB1bGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobmV4dF9waWRfZXZlbnRfLnRpbWUgPiB0aW1lKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50Xy0+cGlkOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgVHJhY2VSZWFkZXI8VD46OlByb2Nlc3NTdGF0ZTo6RHVtcFN0YWNrKEZJTEUgKnN0cmVhbSkKLXsKLSAgICBjb25zdCBjaGFyICpuYXRpdmU7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1ldGhvZF9zdGFja190b3A7IGlpKyspIHsKLSAgICAgICAgbmF0aXZlID0gbWV0aG9kX3N0YWNrW2lpXS5pc05hdGl2ZSA/ICJuIiA6ICIgIjsKLSAgICAgICAgZnByaW50ZihzdHJlYW0sICIlMmQ6ICVzIDB4JTA4eFxuIiwgaWksIG5hdGl2ZSwgbWV0aG9kX3N0YWNrW2lpXS5hZGRyKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBUcmFjZVJlYWRlcjxUPjo6SGFuZGxlTWV0aG9kUmVjb3JkKFByb2Nlc3NTdGF0ZSAqcHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFJlYyAqbWV0aG9kX3JlYykKLXsKLSAgICB1aW50MzJfdCBhZGRyOwotICAgIGludCB0b3AgPSBwc3RhdGUtPm1ldGhvZF9zdGFja190b3A7Ci0gICAgaW50IGZsYWdzID0gbWV0aG9kX3JlYy0+ZmxhZ3M7Ci0gICAgYm9vbCBpc05hdGl2ZTsKLSAgICBpZiAoZmxhZ3MgPT0ga01ldGhvZEVudGVyIHx8IGZsYWdzID09IGtOYXRpdmVFbnRlcikgewotICAgICAgICAvLyBQdXNoIHRoaXMgbWV0aG9kIG9uIHRoZSBzdGFjawotICAgICAgICBpZiAodG9wID49IHBzdGF0ZS0+a01heE1ldGhvZFN0YWNrU2l6ZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTdGFjayBvdmVyZmxvdyBhdCB0aW1lICVsbHVcbiIsIG1ldGhvZF9yZWMtPnRpbWUpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBwc3RhdGUtPm1ldGhvZF9zdGFja1t0b3BdLmFkZHIgPSBtZXRob2RfcmVjLT5hZGRyOwotICAgICAgICBpc05hdGl2ZSA9IChmbGFncyA9PSBrTmF0aXZlRW50ZXIpOwotICAgICAgICBwc3RhdGUtPm1ldGhvZF9zdGFja1t0b3BdLmlzTmF0aXZlID0gaXNOYXRpdmU7Ci0gICAgICAgIHBzdGF0ZS0+bWV0aG9kX3N0YWNrX3RvcCA9IHRvcCArIDE7Ci0gICAgICAgIGFkZHIgPSBtZXRob2RfcmVjLT5hZGRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh0b3AgPD0gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHN0YWNrIHVuZGVyZmxvd3MsIHRoZW4gc2V0IHRoZSBjdXJyZW50IG1ldGhvZCB0byBOVUxMLgotICAgICAgICAgICAgcHN0YXRlLT5jdXJyZW50X21ldGhvZF9zeW0gPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRvcCAtPSAxOwotICAgICAgICBhZGRyID0gcHN0YXRlLT5tZXRob2Rfc3RhY2tbdG9wXS5hZGRyOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYSBub24tbmF0aXZlIG1ldGhvZCB0aGVuIHRoZSBhZGRyZXNzIHdlIGFyZSBwb3BwaW5nIHNob3VsZAotICAgICAgICAvLyBtYXRjaCB0aGUgdG9wLW9mLXN0YWNrIGFkZHJlc3MuICBOYXRpdmUgcG9wcyBkb24ndCBhbHdheXMgbWF0Y2ggdGhlCi0gICAgICAgIC8vIGFkZHJlc3Mgb2YgdGhlIG5hdGl2ZSBwdXNoIGZvciBzb21lIHJlYXNvbi4KLSAgICAgICAgaWYgKGFkZHIgIT0gbWV0aG9kX3JlYy0+YWRkciAmJiAhcHN0YXRlLT5tZXRob2Rfc3RhY2tbdG9wXS5pc05hdGl2ZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICJTdGFjayBtZXRob2QgKDB4JXgpIGF0IGluZGV4ICVkIGRvZXMgbm90IG1hdGNoIHRyYWNlIHJlY29yZCAoMHgleCkgYXQgdGltZSAlbGx1XG4iLAotICAgICAgICAgICAgICAgICAgICBhZGRyLCB0b3AsIG1ldGhvZF9yZWMtPmFkZHIsIG1ldGhvZF9yZWMtPnRpbWUpOwotICAgICAgICAgICAgcHN0YXRlLT5EdW1wU3RhY2soc3RkZXJyKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBhcmUgcG9wcGluZyBhIG5hdGl2ZSBtZXRob2QsIHRoZW4gdGhlIHRvcC1vZi1zdGFjayBzaG91bGQgYWxzbwotICAgICAgICAvLyBiZSBhIG5hdGl2ZSBtZXRob2QuCi0gICAgICAgIGJvb2wgcG9wcGluZ05hdGl2ZSA9IChmbGFncyA9PSBrTmF0aXZlRXhpdCkgfHwgKGZsYWdzID09IGtOYXRpdmVFeGNlcHRpb24pOwotICAgICAgICBpZiAocG9wcGluZ05hdGl2ZSAhPSBwc3RhdGUtPm1ldGhvZF9zdGFja1t0b3BdLmlzTmF0aXZlKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgIlBvcHBpbmcgbmF0aXZlIHZzLiBub24tbmF0aXZlIG1pc21hdGNoIGF0IGluZGV4ICVkIHRpbWUgJWxsdVxuIiwKLSAgICAgICAgICAgICAgICAgICAgdG9wLCBtZXRob2RfcmVjLT50aW1lKTsKLSAgICAgICAgICAgIHBzdGF0ZS0+RHVtcFN0YWNrKHN0ZGVycik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHN0YXRlLT5tZXRob2Rfc3RhY2tfdG9wID0gdG9wOwotICAgICAgICBpZiAodG9wID09IDApIHsKLSAgICAgICAgICAgIC8vIFdoZW4gd2UgZW1wdHkgdGhlIHN0YWNrLCBzZXQgdGhlIGN1cnJlbnQgbWV0aG9kIHRvIE5VTEwKLSAgICAgICAgICAgIHBzdGF0ZS0+Y3VycmVudF9tZXRob2Rfc3ltID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhZGRyID0gcHN0YXRlLT5tZXRob2Rfc3RhY2tbdG9wIC0gMV0uYWRkcjsKLSAgICAgICAgaXNOYXRpdmUgPSBwc3RhdGUtPm1ldGhvZF9zdGFja1t0b3AgLSAxXS5pc05hdGl2ZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgdG9wLW9mLXN0YWNrIGlzIGEgbmF0aXZlIG1ldGhvZCwgdGhlbiBzZXQgdGhlIGN1cnJlbnQgbWV0aG9kCi0gICAgLy8gdG8gTlVMTC4KLSAgICBpZiAoaXNOYXRpdmUpIHsKLSAgICAgICAgcHN0YXRlLT5jdXJyZW50X21ldGhvZF9zeW0gPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUHJvY2Vzc1N0YXRlICptYW5hZ2VyID0gcHN0YXRlLT5hZGRyX21hbmFnZXI7Ci0gICAgcmVnaW9uX3R5cGUgKnJlZ2lvbiA9IEZpbmRSZWdpb24oYWRkciwgbWFuYWdlci0+bnJlZ2lvbnMsIG1hbmFnZXItPnJlZ2lvbnMpOwotICAgIHVpbnQzMl90IHN5bV9hZGRyID0gYWRkciAtIHJlZ2lvbi0+YmFzZV9hZGRyOwotICAgIHN5bWJvbF90eXBlICpzeW0gPSBGaW5kRnVuY3Rpb24oc3ltX2FkZHIsIHJlZ2lvbi0+bnN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24tPnN5bWJvbHMsIHRydWUgLyogZXhhY3QgbWF0Y2ggKi8pOwotCi0gICAgcHN0YXRlLT5jdXJyZW50X21ldGhvZF9zeW0gPSBzeW07Ci0gICAgaWYgKHN5bSAhPSBOVUxMKSB7Ci0gICAgICAgIHN5bS0+cmVnaW9uID0gcmVnaW9uOwotICAgIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCB0b3Atb2Ytc3RhY2sgSmF2YSBtZXRob2QsIGlmIGFueSwgZm9yIHRoZSBnaXZlbiBwaWQKLS8vIGF0IHRoZSBnaXZlbiB0aW1lLiBUaGUgInRpbWUiIHBhcmFtZXRlciBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZwotLy8gYWNyb3NzIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gdGhpcyBtZXRob2QuCi0vLyBJZiB0aGUgSmF2YSBtZXRob2Qgc3RhY2sgaXMgZW1wdHkgb3IgaWYgYSBuYXRpdmUgSk5JIG1ldGhvZCBpcyBvbiB0aGUKLS8vIHRvcCBvZiB0aGUgc3RhY2ssIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyBOVUxMLgotdGVtcGxhdGUgPGNsYXNzIFQ+Ci10eXBlbmFtZSBUcmFjZVJlYWRlcjxUPjo6c3ltYm9sX3R5cGUqCi1UcmFjZVJlYWRlcjxUPjo6RmluZEN1cnJlbnRNZXRob2QoaW50IHBpZCwgdWludDY0X3QgdGltZSkKLXsKLSAgICBQcm9jZXNzU3RhdGUgKnByb2NTdGF0ZSA9IHByb2Nlc3Nlc19bcGlkXTsKLQotICAgIGlmICh0aW1lIDwgbmV4dF9tZXRob2RfLnRpbWUpIHsKLSAgICAgICAgcmV0dXJuIHByb2NTdGF0ZS0+Y3VycmVudF9tZXRob2Rfc3ltOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChuZXh0X21ldGhvZF8udGltZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBtYXkgaGF2ZSB0byBwcm9jZXNzIG1ldGhvZHMgZnJvbSBhIGRpZmZlcmVudCBwaWQgc28gdXNlCi0gICAgICAgICAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgcHJvY1N0YXRlLgotICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICpwU3RhdGUgPSBwcm9jZXNzZXNfW25leHRfbWV0aG9kXy5waWRdOwotICAgICAgICAgICAgSGFuZGxlTWV0aG9kUmVjb3JkKHBTdGF0ZSwgJm5leHRfbWV0aG9kXyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW50ZXJuYWxfbWV0aG9kX3JlYWRlcl8tPlJlYWRNZXRob2QoJm5leHRfbWV0aG9kXykpIHsKLSAgICAgICAgICAgIG5leHRfbWV0aG9kXy50aW1lID0gfjB1bGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobmV4dF9tZXRob2RfLnRpbWUgPiB0aW1lKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBwcm9jU3RhdGUtPmN1cnJlbnRfbWV0aG9kX3N5bTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIFRyYWNlUmVhZGVyPFQ+OjpQb3B1bGF0ZVN5bWJvbHNGcm9tRGV4RmlsZShjb25zdCBEZXhGaWxlTGlzdCAqZGV4ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl90eXBlICpyZWdpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXsKLSAgICBpbnQgbnN5bWJvbHMgPSBkZXhmaWxlLT5uc3ltYm9sczsKLSAgICBEZXhTeW0gKmRleHN5bXMgPSBkZXhmaWxlLT5zeW1ib2xzOwotICAgIHJlZ2lvbi0+bnN5bWJvbHMgPSBuc3ltYm9scyArIDE7Ci0gICAgc3ltYm9sX3R5cGUgKnN5bWJvbHMgPSBuZXcgc3ltYm9sX3R5cGVbbnN5bWJvbHMgKyAxXTsKLSAgICBtZW1zZXQoc3ltYm9scywgMCwgKG5zeW1ib2xzICsgMSkgKiBzaXplb2Yoc3ltYm9sX3R5cGUpKTsKLSAgICByZWdpb24tPnN5bWJvbHMgPSBzeW1ib2xzOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuc3ltYm9sczsgaWkrKykgewotICAgICAgICBzeW1ib2xzW2lpXS5hZGRyID0gZGV4c3ltc1tpaV0uYWRkcjsKLSAgICAgICAgc3ltYm9sc1tpaV0ubmFtZSA9IFN0cmR1cChkZXhzeW1zW2lpXS5uYW1lKTsKLSAgICAgICAgc3ltYm9sc1tpaV0udm1fc3ltID0gTlVMTDsKLSAgICAgICAgc3ltYm9sc1tpaV0ucmVnaW9uID0gcmVnaW9uOwotICAgICAgICBzeW1ib2xzW2lpXS5mbGFncyA9IHN5bWJvbF90eXBlOjprSXNNZXRob2Q7Ci0gICAgfQotCi0gICAgLy8gQWRkIGFuIGVudHJ5IGF0IHRoZSBlbmQgd2l0aCBhbiBhZGRyZXNzIG9mIDB4ZmZmZmZmZmYuICBUaGlzCi0gICAgLy8gaXMgcmVxdWlyZWQgZm9yIExvb2t1cEZ1bmN0aW9uKCkgdG8gd29yay4KLSAgICBzeW1ib2xfdHlwZSAqc3ltYm9sID0gJnN5bWJvbHNbbnN5bWJvbHNdOwotICAgIHN5bWJvbC0+YWRkciA9IDB4ZmZmZmZmZmY7Ci0gICAgc3ltYm9sLT5uYW1lID0gU3RyZHVwKCIoZW5kKSIpOwotICAgIHN5bWJvbC0+dm1fc3ltID0gTlVMTDsKLSAgICBzeW1ib2wtPnJlZ2lvbiA9IHJlZ2lvbjsKLSAgICBzeW1ib2wtPmZsYWdzID0gc3ltYm9sX3R5cGU6OmtJc01ldGhvZDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIFRyYWNlUmVhZGVyPFQ+OjpSZWFkTWV0aG9kU3ltYm9sKE1ldGhvZFJlYyAqbWV0aG9kX3JlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX3R5cGUgKipwc3ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGUgKipwcHJvYykKLXsKLSAgICBpZiAoaW50ZXJuYWxfbWV0aG9kX3JlYWRlcl8tPlJlYWRNZXRob2QoJm5leHRfbWV0aG9kXykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ29weSB0aGUgd2hvbGUgTWV0aG9kUmVjIHN0cnVjdAotICAgICptZXRob2RfcmVjb3JkID0gbmV4dF9tZXRob2RfOwotCi0gICAgdWludDY0X3QgdGltZSA9IG5leHRfbWV0aG9kXy50aW1lOwotICAgIAotICAgIC8vIFJlYWQgdGhlIHBpZCB0cmFjZSBmaWxlIHVwIHRvIHRoaXMgcG9pbnQgdG8gbWFrZSBzdXJlIHRoZQotICAgIC8vIHByb2Nlc3Mgc3RhdGUgaXMgdmFsaWQuCi0gICAgRmluZEN1cnJlbnRQaWQodGltZSk7Ci0KLSAgICBQcm9jZXNzU3RhdGUgKnBzdGF0ZSA9IHByb2Nlc3Nlc19bbmV4dF9tZXRob2RfLnBpZF07Ci0gICAgKnBwcm9jID0gcHN0YXRlOwotICAgIEhhbmRsZU1ldGhvZFJlY29yZChwc3RhdGUsICZuZXh0X21ldGhvZF8pOwotICAgICpwc3ltID0gcHN0YXRlLT5jdXJyZW50X21ldGhvZF9zeW07Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jZW5kaWYgLyogVFJBQ0VfUkVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy90cmFjZV9yZWFkZXJfYmFzZS5oIGIvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlcl9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmMzZDEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlcl9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0jaWZuZGVmIFRSQUNFX1JFQURFUl9CQVNFX0gKLSNkZWZpbmUgVFJBQ0VfUkVBREVSX0JBU0VfSAotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJ0cmFjZV9jb21tb24uaCIKLSNpbmNsdWRlICJoYXNoX3RhYmxlLmgiCi0KLWNsYXNzIEJCUmVhZGVyOwotY2xhc3MgSW5zblJlYWRlcjsKLWNsYXNzIEFkZHJSZWFkZXI7Ci1jbGFzcyBFeGNSZWFkZXI7Ci1jbGFzcyBQaWRSZWFkZXI7Ci1jbGFzcyBNZXRob2RSZWFkZXI7Ci0KLXN0cnVjdCBTdGF0aWNSZWMgewotICAgIHVpbnQ2NF90ICAgIGJiX251bTsKLSAgICB1aW50MzJfdCAgICBiYl9hZGRyOwotICAgIHVpbnQzMl90ICAgIG51bV9pbnNuczsKLX07Ci0KLXN0cnVjdCBTdGF0aWNCbG9jayB7Ci0gICAgU3RhdGljUmVjICAgcmVjOwotICAgIHVpbnQzMl90ICAgICppbnNuczsKLX07Ci0KLXN0cnVjdCBCQkV2ZW50IHsKLSAgICB1aW50NjRfdCAgICB0aW1lOwotICAgIHVpbnQ2NF90ICAgIGJiX251bTsKLSAgICB1aW50MzJfdCAgICBiYl9hZGRyOwotICAgIHVpbnQzMl90ICAgICppbnNuczsKLSAgICBpbnQgICAgICAgICBudW1faW5zbnM7Ci0gICAgaW50ICAgICAgICAgcGlkOwotICAgIGludCAgICAgICAgIGlzX3RodW1iOwotfTsKLQotc3RydWN0IFBpZEV2ZW50IHsKLSAgICB1aW50NjRfdCAgICB0aW1lOwotICAgIGludCAgICAgICAgIHJlY190eXBlOyAgICAgICAvLyByZWNvcmQgdHlwZTogZm9yaywgY29udGV4dCBzd2l0Y2gsIGV4aXQgLi4uCi0gICAgaW50ICAgICAgICAgdGdpZDsgICAgICAgICAgIC8vIHRocmVhZCBncm91cCBpZAotICAgIGludCAgICAgICAgIHBpZDsgICAgICAgICAgICAvLyBmb3IgZm9yazogY2hpbGQgcGlkOyBmb3Igc3dpdGNoOiBuZXh0IHBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBmb3IgZXhpdDogZXhpdCB2YWx1ZQotICAgIHVpbnQzMl90ICAgIHZzdGFydDsgICAgICAgICAvLyB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MgKG9ubHkgdXNlZCB3aXRoIG1tYXApCi0gICAgdWludDMyX3QgICAgdmVuZDsgICAgICAgICAgIC8vIHZpcnR1YWwgZW5kIGFkZHJlc3MgKG9ubHkgdXNlZCB3aXRoIG1tYXApCi0gICAgdWludDMyX3QgICAgb2Zmc2V0OyAgICAgICAgIC8vIHZpcnR1YWwgZmlsZSBvZmZzZXQgKG9ubHkgdXNlZCB3aXRoIG1tYXApCi0KLSAgICAvLyBEeW5hbWljYWxseSBhbGxvY2F0ZWQgcGF0aCB0byBleGVjdXRhYmxlIChvciBsaWIpLiBJbiB0aGUgY2FzZSBvZgotICAgIC8vIGFuIG1tYXBwZWQgZGV4IGZpbGUsIHRoZSBwYXRoIGlzIG1vZGlmaWVkIHRvIGJlIG1vcmUgdXNlZnVsIGZvcgotICAgIC8vIGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBvdXRwdXQgb2YgZGV4bGlzdC4gIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIHRoaXM6Ci0gICAgLy8gICAvZGF0YS9kYWx2aWstY2FjaGUvc3lzdGVtQGFwcEBUZXN0SGFybmVzcy5hcGtAY2xhc3Nlcy5kZXgKLSAgICAvLyBXZSBjb252ZXJ0IHRvIHRoaXM6Ci0gICAgLy8gICAvc3lzdGVtL2FwcC9UZXN0SGFybmVzcy5hcGsKLSAgICBjaGFyICAgICAgICAqcGF0aDsKLSAgICBjaGFyICAgICAgICAqbW1hcF9wYXRoOyAgICAgLy8gdW5tb2RpZmllZCBtbWFwIHBhdGgKLSAgICBpbnQgICAgICAgICBhcmdjOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIGFyZ3MKLSAgICBjaGFyICAgICAgICAqKmFyZ3Y7ICAgICAgICAgLy8gZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mIGFyZ3MKLX07Ci0KLXN0cnVjdCBNZXRob2RSZWMgewotICAgIHVpbnQ2NF90ICAgIHRpbWU7Ci0gICAgdWludDMyX3QgICAgYWRkcjsKLSAgICBpbnQgICAgICAgICBwaWQ7Ci0gICAgaW50ICAgICAgICAgZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgRGV4U3ltIHsKLSAgICB1aW50MzJfdCAgICBhZGRyOwotICAgIGludCAgICAgICAgIGxlbjsKLSAgICBjaGFyICAgICAgICAqbmFtZTsKLX07Ci0KLXN0cnVjdCBEZXhGaWxlTGlzdCB7Ci0gICAgY2hhciAgICAgICAgKnBhdGg7Ci0gICAgaW50ICAgICAgICAgbnN5bWJvbHM7Ci0gICAgRGV4U3ltICAgICAgKnN5bWJvbHM7Ci19OwotCi1jbGFzcyBUcmFjZVJlYWRlckJhc2UgewotICBwdWJsaWM6Ci0gICAgVHJhY2VSZWFkZXJCYXNlKCk7Ci0gICAgdmlydHVhbCB+VHJhY2VSZWFkZXJCYXNlKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgQkJSZWFkZXI7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIE9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgQ2xvc2UoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIFdyaXRlSGVhZGVyKFRyYWNlSGVhZGVyICpoZWFkZXIpOwotICAgIGlubGluZSBib29sICAgICAgICAgUmVhZEJCKEJCRXZlbnQgKmV2ZW50KTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIFJlYWRTdGF0aWMoU3RhdGljUmVjICpyZWMpOwotICAgIGludCAgICAgICAgICAgICAgICAgUmVhZFN0YXRpY0luc25zKGludCBudW0sIHVpbnQzMl90ICppbnNucyk7Ci0gICAgVHJhY2VIZWFkZXIgICAgICAgICAqR2V0SGVhZGVyKCkgICAgICAgICAgICAgICAgeyByZXR1cm4gaGVhZGVyXzsgfQotICAgIGlubGluZSB1aW50NjRfdCAgICAgUmVhZEluc25UaW1lKHVpbnQ2NF90IG1pbl90aW1lKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIFRydW5jYXRlTGFzdEJsb2NrKHVpbnQzMl90IG51bV9pbnNucyk7Ci0gICAgaW5saW5lIGJvb2wgICAgICAgICBSZWFkQWRkcih1aW50NjRfdCAqdGltZSwgdWludDMyX3QgKmFkZHIsIGludCAqZmxhZ3MpOwotICAgIGlubGluZSBib29sICAgICAgICAgUmVhZEV4Yyh1aW50NjRfdCAqdGltZSwgdWludDMyX3QgKmN1cnJlbnRfcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpyZWNudW0sIHVpbnQzMl90ICp0YXJnZXRfcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpiYl9udW0sIHVpbnQ2NF90ICpiYl9zdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9pbnNucyk7Ci0gICAgaW5saW5lIGJvb2wgICAgICAgICBSZWFkUGlkRXZlbnQoUGlkRXZlbnQgKmV2ZW50KTsKLSAgICBpbmxpbmUgYm9vbCAgICAgICAgIFJlYWRNZXRob2QoTWV0aG9kUmVjICptZXRob2RfcmVjb3JkKTsKLSAgICBTdGF0aWNCbG9jayAgICAgICAgICpHZXRTdGF0aWNCbG9jayh1aW50NjRfdCBiYl9udW0pIHsgcmV0dXJuICZibG9ja3NfW2JiX251bV07IH0KLSAgICB1aW50MzJfdCAgICAgICAgICAgICpHZXRJbnNucyh1aW50NjRfdCBiYl9udW0pIHsgcmV0dXJuIGJsb2Nrc19bYmJfbnVtXS5pbnNuczsgfQotICAgIHVpbnQzMl90ICAgICAgICAgICAgR2V0QkJBZGRyKHVpbnQ2NF90IGJiX251bSkgewotICAgICAgICByZXR1cm4gYmxvY2tzX1tiYl9udW1dLnJlYy5iYl9hZGRyICYgfjE7Ci0gICAgfQotICAgIGludCAgICAgICAgICAgICAgICAgR2V0SXNUaHVtYih1aW50NjRfdCBiYl9udW0pIHsKLSAgICAgICAgcmV0dXJuIGJsb2Nrc19bYmJfbnVtXS5yZWMuYmJfYWRkciAmIDE7Ci0gICAgfQotICAgIHZvaWQgICAgICAgICAgICAgICAgU2V0UG9zdFByb2Nlc3NpbmcoYm9vbCB2YWwpIHsgcG9zdF9wcm9jZXNzaW5nXyA9IHZhbDsgfQotCi0gIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludCAgICAgICAgIEZpbmRDdXJyZW50UGlkKHVpbnQ2NF90IHRpbWUpOwotICAgIGludCAgICAgICAgICAgICAgICAgY3VycmVudF9waWRfOwotICAgIGludCAgICAgICAgICAgICAgICAgbmV4dF9waWRfOwotICAgIHVpbnQ2NF90ICAgICAgICAgICAgbmV4dF9waWRfc3dpdGNoX3RpbWVfOwotICAgIFBpZFJlYWRlciAgICAgICAgICAgKmludGVybmFsX3BpZF9yZWFkZXJfOwotICAgIE1ldGhvZFJlYWRlciAgICAgICAgKmludGVybmFsX21ldGhvZF9yZWFkZXJfOwotICAgIEhhc2hUYWJsZTxEZXhGaWxlTGlzdCo+ICpkZXhfaGFzaF87Ci0KLSAgcHJpdmF0ZToKLSAgICBpbnQgICAgICAgICAgRmluZE51bUluc25zKHVpbnQ2NF90IGJiX251bSwgdWludDY0X3QgYmJfc3RhcnRfdGltZSk7Ci0gICAgdm9pZCAgICAgICAgIFJlYWRUcmFjZUhlYWRlcihGSUxFICpmc3RyZWFtLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHJhY2VuYW1lLCBUcmFjZUhlYWRlciAqaGVhZGVyKTsKLSAgICBQaWRFdmVudCAgICAgKkZpbmRNbWFwRGV4RmlsZUV2ZW50KCk7Ci0gICAgdm9pZCAgICAgICAgIFBhcnNlRGV4TGlzdChjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0KLSAgICBjaGFyICAgICAgICAgKnN0YXRpY19maWxlbmFtZV87Ci0gICAgRklMRSAgICAgICAgICpzdGF0aWNfZnN0cmVhbV87Ci0gICAgVHJhY2VIZWFkZXIgICpoZWFkZXJfOwotICAgIEJCUmVhZGVyICAgICAqYmJfcmVhZGVyXzsKLSAgICBJbnNuUmVhZGVyICAgKmluc25fcmVhZGVyXzsKLSAgICBBZGRyUmVhZGVyICAgKmxvYWRfYWRkcl9yZWFkZXJfOwotICAgIEFkZHJSZWFkZXIgICAqc3RvcmVfYWRkcl9yZWFkZXJfOwotICAgIEV4Y1JlYWRlciAgICAqZXhjX3JlYWRlcl87Ci0gICAgUGlkUmVhZGVyICAgICpwaWRfcmVhZGVyXzsKLSAgICBNZXRob2RSZWFkZXIgKm1ldGhvZF9yZWFkZXJfOwotICAgIEV4Y1JlYWRlciAgICAqaW50ZXJuYWxfZXhjX3JlYWRlcl87Ci0gICAgU3RhdGljQmxvY2sgICpibG9ja3NfOwotICAgIGJvb2wgICAgICAgICBleGNfZW5kXzsKLSAgICB1aW50NjRfdCAgICAgYmJfcmVjbnVtXzsKLSAgICB1aW50NjRfdCAgICAgZXhjX3JlY251bV87Ci0gICAgdWludDY0X3QgICAgIGV4Y19iYl9udW1fOwotICAgIHVpbnQ2NF90ICAgICBleGNfdGltZV87Ci0gICAgaW50ICAgICAgICAgIGV4Y19udW1faW5zbnNfOwotICAgIGJvb2wgICAgICAgICBwb3N0X3Byb2Nlc3NpbmdfOwotCi0gICAgYm9vbCAgICAgICAgIGxvYWRfZW9mXzsKLSAgICB1aW50NjRfdCAgICAgbG9hZF90aW1lXzsKLSAgICB1aW50MzJfdCAgICAgbG9hZF9hZGRyXzsKLSAgICBib29sICAgICAgICAgc3RvcmVfZW9mXzsKLSAgICB1aW50NjRfdCAgICAgc3RvcmVfdGltZV87Ci0gICAgdWludDMyX3QgICAgIHN0b3JlX2FkZHJfOwotfTsKLQotY2xhc3MgRGVjb2RlcjsKLQotY2xhc3MgQkJSZWFkZXIgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQkJSZWFkZXIoVHJhY2VSZWFkZXJCYXNlICp0cmFjZSk7Ci0gICAgfkJCUmVhZGVyKCk7Ci0gICAgdm9pZCAgICAgT3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdm9pZCAgICAgQ2xvc2UoKTsKLSAgICBib29sICAgICBSZWFkQkIoQkJFdmVudCAqZXZlbnQpOwotCi0gIHByaXZhdGU6Ci0gICAgc3RydWN0IFRpbWVSZWMgewotICAgICAgICBCQlJlYyAgICAgICBiYl9yZWM7Ci0gICAgICAgIHVpbnQ2NF90ICAgIG5leHRfdGltZTsKLSAgICB9OwotCi0gICAgc3RydWN0IEZ1dHVyZSB7Ci0gICAgICAgIEZ1dHVyZSAgICAgICpuZXh0OwotICAgICAgICBUaW1lUmVjICAgICBiYjsKLSAgICB9OwotCi0gICAgaW5saW5lIEZ1dHVyZSAgICpBbGxvY0Z1dHVyZSgpOwotICAgIGlubGluZSB2b2lkICAgICBGcmVlRnV0dXJlKEZ1dHVyZSAqZnV0dXJlKTsKLSAgICBpbmxpbmUgdm9pZCAgICAgSW5zZXJ0RnV0dXJlKEZ1dHVyZSAqZnV0dXJlKTsKLSAgICBpbmxpbmUgaW50ICAgICAgRGVjb2RlTmV4dFJlYygpOwotCi0gICAgVGltZVJlYyAgICAgICAgIG5leHRyZWNfOwotICAgIEZ1dHVyZSAgICAgICAgICBmdXR1cmVzX1trTWF4TnVtQmFzaWNCbG9ja3NdOwotICAgIEZ1dHVyZSAgICAgICAgICAqaGVhZF87Ci0gICAgRnV0dXJlICAgICAgICAgICpmcmVlXzsKLSAgICBEZWNvZGVyICAgICAgICAgKmRlY29kZXJfOwotICAgIGJvb2wgICAgICAgICAgICBpc19lb2ZfOwotICAgIFRyYWNlUmVhZGVyQmFzZSAqdHJhY2VfOwotfTsKLQotY2xhc3MgSW5zblJlYWRlciB7Ci0gIHB1YmxpYzoKLSAgICBJbnNuUmVhZGVyKCk7Ci0gICAgfkluc25SZWFkZXIoKTsKLQotICAgIHZvaWQgICAgICAgIE9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHZvaWQgICAgICAgIENsb3NlKCk7Ci0gICAgdWludDY0X3QgICAgUmVhZEluc25UaW1lKHVpbnQ2NF90IG1pbl90aW1lKTsKLQotICBwcml2YXRlOgotICAgIERlY29kZXIgICAgICpkZWNvZGVyXzsKLSAgICB1aW50NjRfdCAgICBwcmV2X3RpbWVfOwotICAgIHVpbnQ2NF90ICAgIHRpbWVfZGlmZl87Ci0gICAgaW50ICAgICAgICAgcmVwZWF0XzsKLX07Ci0KLWNsYXNzIEFkZHJSZWFkZXIgewotICBwdWJsaWM6Ci0gICAgQWRkclJlYWRlcigpOwotICAgIH5BZGRyUmVhZGVyKCk7Ci0KLSAgICBib29sICAgICAgICBPcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpzdWZmaXgpOwotICAgIHZvaWQgICAgICAgIENsb3NlKCk7Ci0gICAgYm9vbCAgICAgICAgUmVhZEFkZHIodWludDY0X3QgKnRpbWUsIHVpbnQzMl90ICphZGRyKTsKLQotICBwcml2YXRlOgotICAgIERlY29kZXIgICAgICpkZWNvZGVyXzsKLSAgICB1aW50MzJfdCAgICBwcmV2X2FkZHJfOwotICAgIHVpbnQ2NF90ICAgIHByZXZfdGltZV87Ci0gICAgYm9vbCAgICAgICAgb3BlbmVkXzsgICAgICAgIC8vIHRydWUgYWZ0ZXIgZmlsZSBpcyBvcGVuZWQKLX07Ci0KLWNsYXNzIEV4Y1JlYWRlciB7Ci0gIHB1YmxpYzoKLSAgICBFeGNSZWFkZXIoKTsKLSAgICB+RXhjUmVhZGVyKCk7Ci0KLSAgICB2b2lkICAgICAgICBPcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLSAgICB2b2lkICAgICAgICBDbG9zZSgpOwotICAgIGJvb2wgICAgICAgIFJlYWRFeGModWludDY0X3QgKnRpbWUsIHVpbnQzMl90ICpjdXJyZW50X3BjLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKnJlY251bSwgdWludDMyX3QgKnRhcmdldF9wYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpiYl9udW0sIHVpbnQ2NF90ICpiYl9zdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1faW5zbnMpOwotCi0gIHByaXZhdGU6Ci0gICAgRGVjb2RlciAgICAgKmRlY29kZXJfOwotICAgIHVpbnQ2NF90ICAgIHByZXZfdGltZV87Ci0gICAgdWludDY0X3QgICAgcHJldl9yZWNudW1fOwotfTsKLQotY2xhc3MgUGlkUmVhZGVyIHsKLSAgcHVibGljOgotICAgIFBpZFJlYWRlcigpOwotICAgIH5QaWRSZWFkZXIoKTsKLQotICAgIHZvaWQgICAgICAgIE9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHZvaWQgICAgICAgIENsb3NlKCk7Ci0gICAgYm9vbCAgICAgICAgUmVhZFBpZEV2ZW50KHN0cnVjdCBQaWRFdmVudCAqZXZlbnQpOwotICAgIHZvaWQgICAgICAgIERpc3Bvc2Uoc3RydWN0IFBpZEV2ZW50ICpldmVudCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBEZWNvZGVyICAgICAqZGVjb2Rlcl87Ci0gICAgdWludDY0X3QgICAgcHJldl90aW1lXzsKLX07Ci0KLWNsYXNzIE1ldGhvZFJlYWRlciB7Ci0gIHB1YmxpYzoKLSAgICBNZXRob2RSZWFkZXIoKTsKLSAgICB+TWV0aG9kUmVhZGVyKCk7Ci0KLSAgICBib29sICAgICAgICBPcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLSAgICB2b2lkICAgICAgICBDbG9zZSgpOwotICAgIGJvb2wgICAgICAgIFJlYWRNZXRob2QoTWV0aG9kUmVjICptZXRob2RfcmVjb3JkKTsKLQotICBwcml2YXRlOgotICAgIERlY29kZXIgICAgICpkZWNvZGVyXzsKLSAgICB1aW50NjRfdCAgICBwcmV2X3RpbWVfOwotICAgIHVpbnQzMl90ICAgIHByZXZfYWRkcl87Ci0gICAgaW50MzJfdCAgICAgcHJldl9waWRfOwotICAgIGJvb2wgICAgICAgIG9wZW5lZF87ICAgICAgICAvLyB0cnVlIGFmdGVyIGZpbGUgaXMgb3BlbmVkCi19OwotCi0vLyBSZWFkcyB0aGUgbmV4dCBkeW5hbWljIGJhc2ljIGJsb2NrIGZyb20gdGhlIHRyYWNlLgotLy8gUmV0dXJucyB0cnVlIG9uIGVuZC1vZi1maWxlLgotaW5saW5lIGJvb2wgVHJhY2VSZWFkZXJCYXNlOjpSZWFkQkIoQkJFdmVudCAqZXZlbnQpCi17Ci0gICAgYmJfcmVjbnVtXyArPSAxOwotICAgIHJldHVybiBiYl9yZWFkZXJfLT5SZWFkQkIoZXZlbnQpOwotfQotCi1pbmxpbmUgdWludDY0X3QgVHJhY2VSZWFkZXJCYXNlOjpSZWFkSW5zblRpbWUodWludDY0X3QgbWluX3RpbWUpCi17Ci0gICAgcmV0dXJuIGluc25fcmVhZGVyXy0+UmVhZEluc25UaW1lKG1pbl90aW1lKTsKLX0KLQotaW5saW5lIGJvb2wgVHJhY2VSZWFkZXJCYXNlOjpSZWFkQWRkcih1aW50NjRfdCAqdGltZSwgdWludDMyX3QgKmFkZHIsIGludCAqZmxhZ3MpCi17Ci0gICAgaWYgKGxvYWRfZW9mXyAmJiBzdG9yZV9lb2ZfKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChzdG9yZV9lb2ZfIHx8ICghbG9hZF9lb2ZfICYmIGxvYWRfdGltZV8gPD0gc3RvcmVfdGltZV8pKSB7Ci0gICAgICAgICp0aW1lID0gbG9hZF90aW1lXzsKLSAgICAgICAgKmFkZHIgPSBsb2FkX2FkZHJfOwotICAgICAgICAqZmxhZ3MgPSAwOwotICAgICAgICBsb2FkX2VvZl8gPSBsb2FkX2FkZHJfcmVhZGVyXy0+UmVhZEFkZHIoJmxvYWRfdGltZV8sICZsb2FkX2FkZHJfKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqdGltZSA9IHN0b3JlX3RpbWVfOwotICAgICAgICAqYWRkciA9IHN0b3JlX2FkZHJfOwotICAgICAgICAqZmxhZ3MgPSAxOwotICAgICAgICBzdG9yZV9lb2ZfID0gc3RvcmVfYWRkcl9yZWFkZXJfLT5SZWFkQWRkcigmc3RvcmVfdGltZV8sICZzdG9yZV9hZGRyXyk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIGJvb2wgVHJhY2VSZWFkZXJCYXNlOjpSZWFkRXhjKHVpbnQ2NF90ICp0aW1lLCB1aW50MzJfdCAqY3VycmVudF9wYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqcmVjbnVtLCB1aW50MzJfdCAqdGFyZ2V0X3BjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpiYl9udW0sIHVpbnQ2NF90ICpiYl9zdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX2luc25zKQotewotICAgIHJldHVybiBleGNfcmVhZGVyXy0+UmVhZEV4Yyh0aW1lLCBjdXJyZW50X3BjLCByZWNudW0sIHRhcmdldF9wYywgYmJfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYl9zdGFydF90aW1lLCBudW1faW5zbnMpOwotfQotCi1pbmxpbmUgYm9vbCBUcmFjZVJlYWRlckJhc2U6OlJlYWRQaWRFdmVudChQaWRFdmVudCAqZXZlbnQpCi17Ci0gICAgcmV0dXJuIHBpZF9yZWFkZXJfLT5SZWFkUGlkRXZlbnQoZXZlbnQpOwotfQotCi1pbmxpbmUgYm9vbCBUcmFjZVJlYWRlckJhc2U6OlJlYWRNZXRob2QoTWV0aG9kUmVjICptZXRob2RfcmVjb3JkKQotewotICAgIHJldHVybiBtZXRob2RfcmVhZGVyXy0+UmVhZE1ldGhvZChtZXRob2RfcmVjb3JkKTsKLX0KLQotLy8gRHVwbGljYXRlcyBhIHN0cmluZywgYWxsb2NhdGluZyBzcGFjZSB1c2luZyBuZXdbXS4KLWlubGluZSBjaGFyICogU3RyZHVwKGNvbnN0IGNoYXIgKnNyYykgewotICAgIGludCBsZW4gPSBzdHJsZW4oc3JjKTsKLSAgICBjaGFyICpjb3B5ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgc3RyY3B5KGNvcHksIHNyYyk7Ci0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLSNlbmRpZiAvKiBUUkFDRV9SRUFERVJfQkFTRV9IICovCmRpZmYgLS1naXQgYS9lbXVsYXRvci9zZW5zb3JzL0FuZHJvaWQubWsgYi9lbXVsYXRvci9zZW5zb3JzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTAyYWQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2Vuc29ycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9QUk9EVUNUKSxzaW0pCi0jIEhBTCBtb2R1bGUgaW1wbGVtZW5hdGlvbiwgbm90IHByZWxpbmtlZCBhbmQgc3RvcmVkIGluCi0jIGh3LzxTRU5TT1JTX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLmhhcmR3YXJlPi5zbwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2h3Ci1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX1NSQ19GSUxFUyA6PSBzZW5zb3JzX3FlbXUuYwotTE9DQUxfTU9EVUxFIDo9IHNlbnNvcnMuZ29sZGZpc2gKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2Vuc29ycy9zZW5zb3JzX3FlbXUuYyBiL2VtdWxhdG9yL3NlbnNvcnMvc2Vuc29yc19xZW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzYzNmEuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2Vuc29ycy9zZW5zb3JzX3FlbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogdGhpcyBpbXBsZW1lbnRzIGEgc2Vuc29ycyBoYXJkd2FyZSBsaWJyYXJ5IGZvciB0aGUgQW5kcm9pZCBlbXVsYXRvci4KLSAqIHRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgYmUgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSB0aGF0IHdpbGwgYmUKLSAqIHBsYWNlZCBpbnRvIC9zeXN0ZW0vbGliL2h3L3NlbnNvcnMuZ29sZGZpc2guc28KLSAqCi0gKiBpdCB3aWxsIGJlIGxvYWRlZCBieSB0aGUgY29kZSBpbiBoYXJkd2FyZS9saWJoYXJkd2FyZS9oYXJkd2FyZS5jCi0gKiB3aGljaCBpcyBpdHNlbGYgY2FsbGVkIGZyb20gY29tX2FuZHJvaWRfc2VydmVyX1NlbnNvclNlcnZpY2UuY3BwCi0gKi8KLQotCi0vKiB3ZSBjb25uZWN0IHdpdGggdGhlIGVtdWxhdG9yIHRocm91Z2ggdGhlICJzZW5zb3JzIiBxZW11ZCBzZXJ2aWNlCi0gKi8KLSNkZWZpbmUgIFNFTlNPUlNfU0VSVklDRV9OQU1FICJzZW5zb3JzIgotCi0jZGVmaW5lIExPR19UQUcgIlFlbXVTZW5zb3JzIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgotCi0jaWYgMAotI2RlZmluZSAgRCguLi4pICBMT0dEKF9fVkFfQVJHU19fKQotI2Vsc2UKLSNkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCi0jZW5kaWYKLQotI2RlZmluZSAgRSguLi4pICBMT0dFKF9fVkFfQVJHU19fKQotCi0jaW5jbHVkZSA8aGFyZHdhcmUvcWVtdWQuaD4KLQotLyoqIFNFTlNPUiBJRFMgQU5EIE5BTUVTCi0gKiovCi0KLSNkZWZpbmUgTUFYX05VTV9TRU5TT1JTIDQKLQotI2RlZmluZSBTVVBQT1JURURfU0VOU09SUyAgKCgxPDxNQVhfTlVNX1NFTlNPUlMpLTEpCi0KLSNkZWZpbmUgIElEX0JBU0UgICAgICAgICAgIFNFTlNPUlNfSEFORExFX0JBU0UKLSNkZWZpbmUgIElEX0FDQ0VMRVJBVElPTiAgIChJRF9CQVNFKzApCi0jZGVmaW5lICBJRF9NQUdORVRJQ19GSUVMRCAoSURfQkFTRSsxKQotI2RlZmluZSAgSURfT1JJRU5UQVRJT04gICAgKElEX0JBU0UrMikKLSNkZWZpbmUgIElEX1RFTVBFUkFUVVJFICAgIChJRF9CQVNFKzMpCi0KLSNkZWZpbmUgIFNFTlNPUlNfQUNDRUxFUkFUSU9OICAgKDEgPDwgSURfQUNDRUxFUkFUSU9OKQotI2RlZmluZSAgU0VOU09SU19NQUdORVRJQ19GSUVMRCAgKDEgPDwgSURfTUFHTkVUSUNfRklFTEQpCi0jZGVmaW5lICBTRU5TT1JTX09SSUVOVEFUSU9OICAgICAoMSA8PCBJRF9PUklFTlRBVElPTikKLSNkZWZpbmUgIFNFTlNPUlNfVEVNUEVSQVRVUkUgICAgICgxIDw8IElEX1RFTVBFUkFUVVJFKQotCi0jZGVmaW5lICBJRF9DSEVDSyh4KSAgKCh1bnNpZ25lZCkoKHgpLUlEX0JBU0UpIDwgNCkKLQotI2RlZmluZSAgU0VOU09SU19MSVNUICBcCi0gICAgU0VOU09SXyhBQ0NFTEVSQVRJT04sImFjY2VsZXJhdGlvbiIpIFwKLSAgICBTRU5TT1JfKE1BR05FVElDX0ZJRUxELCJtYWduZXRpYy1maWVsZCIpIFwKLSAgICBTRU5TT1JfKE9SSUVOVEFUSU9OLCJvcmllbnRhdGlvbiIpIFwKLSAgICBTRU5TT1JfKFRFTVBFUkFUVVJFLCJ0ZW1wZXJhdHVyZSIpIFwKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciogIG5hbWU7Ci0gICAgaW50ICAgICAgICAgIGlkOyB9IF9zZW5zb3JJZHNbTUFYX05VTV9TRU5TT1JTXSA9Ci17Ci0jZGVmaW5lIFNFTlNPUl8oeCx5KSAgeyB5LCBJRF8jI3ggfSwKLSAgICBTRU5TT1JTX0xJU1QKLSN1bmRlZiAgU0VOU09SXwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1fc2Vuc29ySWRUb05hbWUoIGludCAgaWQgKQotewotICAgIGludCAgbm47Ci0gICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX05VTV9TRU5TT1JTOyBubisrKQotICAgICAgICBpZiAoaWQgPT0gX3NlbnNvcklkc1tubl0uaWQpCi0gICAgICAgICAgICByZXR1cm4gX3NlbnNvcklkc1tubl0ubmFtZTsKLSAgICByZXR1cm4gIjxVTktOT1dOPiI7Ci19Ci0KLXN0YXRpYyBpbnQKLV9zZW5zb3JJZEZyb21OYW1lKCBjb25zdCBjaGFyKiAgbmFtZSApCi17Ci0gICAgaW50ICBubjsKLQotICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGZvciAobm4gPSAwOyBubiA8IE1BWF9OVU1fU0VOU09SUzsgbm4rKykKLSAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgX3NlbnNvcklkc1tubl0ubmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gX3NlbnNvcklkc1tubl0uaWQ7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKiBTRU5TT1JTIENPTlRST0wgREVWSUNFCi0gKioKLSAqKiBUaGlzIG9uZSBpcyB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHNlbnNvcnMgZHJpdmVycy4KLSAqKiBXZSBpbXBsZW1lbnQgdGhpcyBieSBzZW5kaW5nIGRpcmVjdGx5IGNvbW1hbmRzIHRvIHRoZSBlbXVsYXRvcgotICoqIHRocm91Z2ggdGhlIFFFTVVEIGNoYW5uZWwuCi0gKiovCi0KLXR5cGVkZWYgc3RydWN0IFNlbnNvckNvbnRyb2wgewotICAgIHN0cnVjdCBzZW5zb3JzX2NvbnRyb2xfZGV2aWNlX3QgIGRldmljZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfc2Vuc29yczsKLX0gU2Vuc29yQ29udHJvbDsKLQotLyogdGhpcyBtdXN0IHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWFkCi0gKiB0aGUgc2Vuc29ycyBkYXRhIChpdCBpcyBwYXNzZWQgdG8gZGF0YV9fZGF0YV9vcGVuKCkgYmVsb3cKLSAqLwotc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCoKLWNvbnRyb2xfX29wZW5fZGF0YV9zb3VyY2Uoc3RydWN0IHNlbnNvcnNfY29udHJvbF9kZXZpY2VfdCAqZGV2KQotewotICAgIFNlbnNvckNvbnRyb2wqICBjdGwgPSAodm9pZCopZGV2OwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlOwotCi0gICAgaWYgKGN0bC0+ZmQgPCAwKSB7Ci0gICAgICAgIGN0bC0+ZmQgPSBxZW11ZF9jaGFubmVsX29wZW4oU0VOU09SU19TRVJWSUNFX05BTUUpOwotICAgIH0KLSAgICBEKCIlczogZmQ9JWQiLCBfX0ZVTkNUSU9OX18sIGN0bC0+ZmQpOwotICAgIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhhbmRsZS0+ZGF0YVswXSA9IGN0bC0+ZmQ7Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotc3RhdGljIGludAotY29udHJvbF9fYWN0aXZhdGUoc3RydWN0IHNlbnNvcnNfY29udHJvbF9kZXZpY2VfdCAqZGV2LAotICAgICAgICAgICAgICAgICAgaW50IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIGludCBlbmFibGVkKQotewotICAgIFNlbnNvckNvbnRyb2wqICBjdGwgPSAodm9pZCopZGV2OwotICAgIHVpbnQzMl90ICAgICAgICBtYXNrLCBzZW5zb3JzLCBhY3RpdmUsIG5ld19zZW5zb3JzLCBjaGFuZ2VkOwotICAgIGNoYXIgICAgICAgICAgICBjb21tYW5kWzEyOF07Ci0gICAgaW50ICAgICAgICAgICAgIHJldDsKLQotICAgIEQoIiVzOiBoYW5kbGU9JXMgKCVkKSBlbmFibGVkPSVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICBfc2Vuc29ySWRUb05hbWUoaGFuZGxlKSwgaGFuZGxlLCBlbmFibGVkKTsKLQotICAgIGlmICghSURfQ0hFQ0soaGFuZGxlKSkgewotICAgICAgICBFKCIlczogYmFkIGhhbmRsZSBJRCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtYXNrICAgID0gKDE8PGhhbmRsZSk7Ci0gICAgc2Vuc29ycyA9IGVuYWJsZWQgPyBtYXNrIDogMDsKLQotICAgIGFjdGl2ZSAgICAgID0gY3RsLT5hY3RpdmVfc2Vuc29yczsKLSAgICBuZXdfc2Vuc29ycyA9IChhY3RpdmUgJiB+bWFzaykgfCAoc2Vuc29ycyAmIG1hc2spOwotICAgIGNoYW5nZWQgICAgID0gYWN0aXZlIF4gbmV3X3NlbnNvcnM7Ci0KLSAgICBpZiAoIWNoYW5nZWQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mIGNvbW1hbmQsICJzZXQ6JXM6JWQiLAotICAgICAgICAgICAgICAgIF9zZW5zb3JJZFRvTmFtZShoYW5kbGUpLCBlbmFibGVkICE9IDApOwotCi0gICAgaWYgKGN0bC0+ZmQgPCAwKSB7Ci0gICAgICAgIGN0bC0+ZmQgPSBxZW11ZF9jaGFubmVsX29wZW4oU0VOU09SU19TRVJWSUNFX05BTUUpOwotICAgIH0KLQotICAgIHJldCA9IHFlbXVkX2NoYW5uZWxfc2VuZChjdGwtPmZkLCBjb21tYW5kLCAtMSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGN0bC0+YWN0aXZlX3NlbnNvcnMgPSBuZXdfc2Vuc29yczsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jb250cm9sX19zZXRfZGVsYXkoc3RydWN0IHNlbnNvcnNfY29udHJvbF9kZXZpY2VfdCAqZGV2LCBpbnQzMl90IG1zKQotewotICAgIFNlbnNvckNvbnRyb2wqICBjdGwgPSAodm9pZCopZGV2OwotICAgIGNoYXIgICAgICAgICAgICBjb21tYW5kWzEyOF07Ci0KLSAgICBEKCIlczogZGV2PSVwIGRlbGF5LW1zPSVkIiwgX19GVU5DVElPTl9fLCBkZXYsIG1zKTsKLQotICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZiBjb21tYW5kLCAic2V0LWRlbGF5OiVkIiwgbXMpOwotCi0gICAgcmV0dXJuIHFlbXVkX2NoYW5uZWxfc2VuZChjdGwtPmZkLCBjb21tYW5kLCAtMSk7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmb3JjZS1zdG9wIHRoZSBibG9ja2luZyByZWFkKCkgaW4KLSAqIGRhdGFfX3BvbGwuIEluIG9yZGVyIHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGFzIHNpbXBsZQotICogYXMgcG9zc2libGUgaGVyZSwgd2Ugc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGVtdWxhdG9yIHdoaWNoCi0gKiBzaGFsbCBzZW5kIGJhY2sgYW4gYXBwcm9wcmlhdGUgZGF0YSBibG9jayB0byB0aGUgc3lzdGVtLgotICovCi1zdGF0aWMgaW50Ci1jb250cm9sX193YWtlKHN0cnVjdCBzZW5zb3JzX2NvbnRyb2xfZGV2aWNlX3QgKmRldikKLXsKLSAgICBTZW5zb3JDb250cm9sKiAgY3RsID0gKHZvaWQqKWRldjsKLSAgICBEKCIlczogZGV2PSVwIiwgX19GVU5DVElPTl9fLCBkZXYpOwotICAgIHJldHVybiBxZW11ZF9jaGFubmVsX3NlbmQoY3RsLT5mZCwgIndha2UiLCAtMSk7Ci19Ci0KLQotc3RhdGljIGludAotY29udHJvbF9fY2xvc2Uoc3RydWN0IGh3X2RldmljZV90ICpkZXYpIAotewotICAgIFNlbnNvckNvbnRyb2wqICBjdGwgPSAodm9pZCopZGV2OwotICAgIGNsb3NlKGN0bC0+ZmQpOwotICAgIGZyZWUoY3RsKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqIFNFTlNPUlMgREFUQSBERVZJQ0UKLSAqKgotICoqIFRoaXMgb25lIGlzIHVzZWQgdG8gcmVhZCBzZW5zb3IgZGF0YSBmcm9tIHRoZSBoYXJkd2FyZS4KLSAqKiBXZSBpbXBsZW1lbnQgdGhpcyBieSBzaW1wbHkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZQotICoqIGVtdWxhdG9yIHRocm91Z2ggdGhlIFFFTVVEIGNoYW5uZWwuCi0gKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgU2Vuc29yRGF0YSB7Ci0gICAgc3RydWN0IHNlbnNvcnNfZGF0YV9kZXZpY2VfdCAgZGV2aWNlOwotICAgIHNlbnNvcnNfZGF0YV90ICAgICAgICAgICAgICAgIHNlbnNvcnNbTUFYX05VTV9TRU5TT1JTXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNfZmQ7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1NlbnNvcnM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgdGltZVN0YXJ0OwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXQ7Ci19IFNlbnNvckRhdGE7Ci0KLS8qIHJldHVybiB0aGUgY3VycmVudCB0aW1lIGluIG5hbm9zZWNvbmRzICovCi1zdGF0aWMgaW50NjRfdAotZGF0YV9fbm93X25zKHZvaWQpCi17Ci0gICAgc3RydWN0IHRpbWVzcGVjICB0czsKLQotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOwotCi0gICAgcmV0dXJuIChpbnQ2NF90KXRzLnR2X3NlYyAqIDEwMDAwMDAwMDAgKyB0cy50dl9uc2VjOwotfQotCi1zdGF0aWMgaW50Ci1kYXRhX19kYXRhX29wZW4oc3RydWN0IHNlbnNvcnNfZGF0YV9kZXZpY2VfdCAqZGV2LCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkKLXsKLSAgICBTZW5zb3JEYXRhKiAgZGF0YSA9ICh2b2lkKilkZXY7Ci0gICAgaW50IGk7Ci0gICAgRCgiJXM6IGRldj0lcCBmZD0lZCIsIF9fRlVOQ1RJT05fXywgZGV2LCBmZCk7Ci0gICAgbWVtc2V0KCZkYXRhLT5zZW5zb3JzLCAwLCBzaXplb2YoZGF0YS0+c2Vuc29ycykpOwotCi0gICAgZm9yIChpPTAgOyBpPE1BWF9OVU1fU0VOU09SUyA7IGkrKykgewotICAgICAgICBkYXRhLT5zZW5zb3JzW2ldLnZlY3Rvci5zdGF0dXMgPSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0g7Ci0gICAgfQotICAgIGRhdGEtPnBlbmRpbmdTZW5zb3JzID0gMDsKLSAgICBkYXRhLT50aW1lU3RhcnQgICAgICA9IDA7Ci0gICAgZGF0YS0+dGltZU9mZnNldCAgICAgPSAwOwotCi0gICAgZGF0YS0+ZXZlbnRzX2ZkID0gZHVwKGhhbmRsZS0+ZGF0YVswXSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRhdGFfX2RhdGFfY2xvc2Uoc3RydWN0IHNlbnNvcnNfZGF0YV9kZXZpY2VfdCAqZGV2KQotewotICAgIFNlbnNvckRhdGEqICBkYXRhID0gKHZvaWQqKWRldjsKLSAgICBEKCIlczogZGV2PSVwIiwgX19GVU5DVElPTl9fLCBkZXYpOwotICAgIGlmIChkYXRhLT5ldmVudHNfZmQgPiAwKSB7Ci0gICAgICAgIGNsb3NlKGRhdGEtPmV2ZW50c19mZCk7Ci0gICAgICAgIGRhdGEtPmV2ZW50c19mZCA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcGlja19zZW5zb3IoU2Vuc29yRGF0YSogICAgICBkYXRhLAotICAgICAgICAgICAgc2Vuc29yc19kYXRhX3QqICB2YWx1ZXMpCi17Ci0gICAgdWludDMyX3QgbWFzayA9IFNVUFBPUlRFRF9TRU5TT1JTOwotICAgIHdoaWxlIChtYXNrKSB7Ci0gICAgICAgIHVpbnQzMl90IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHoobWFzayk7Ci0gICAgICAgIG1hc2sgJj0gfigxPDxpKTsKLSAgICAgICAgaWYgKGRhdGEtPnBlbmRpbmdTZW5zb3JzICYgKDE8PGkpKSB7Ci0gICAgICAgICAgICBkYXRhLT5wZW5kaW5nU2Vuc29ycyAmPSB+KDE8PGkpOwotICAgICAgICAgICAgKnZhbHVlcyA9IGRhdGEtPnNlbnNvcnNbaV07Ci0gICAgICAgICAgICB2YWx1ZXMtPnNlbnNvciA9ICgxPDxpKTsKLSAgICAgICAgICAgIExPR0RfSUYoMCwgIiVzOiAlZCBbJWYsICVmLCAlZl0iLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICgxPDxpKSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLT52ZWN0b3IueCwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLT52ZWN0b3IueSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLT52ZWN0b3Iueik7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dFKCJObyBzZW5zb3IgdG8gcmV0dXJuISEhIHBlbmRpbmdTZW5zb3JzPSUwOHgiLCBkYXRhLT5wZW5kaW5nU2Vuc29ycyk7Ci0gICAgLy8gd2UgbWF5IGVuZC11cCBpbiBhIGJ1c3kgbG9vcCwgc2xvdyB0aGluZ3MgZG93biwganVzdCBpbiBjYXNlLgotICAgIHVzbGVlcCgxMDAwMDApOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludAotZGF0YV9fcG9sbChzdHJ1Y3Qgc2Vuc29yc19kYXRhX2RldmljZV90ICpkZXYsIHNlbnNvcnNfZGF0YV90KiB2YWx1ZXMpCi17Ci0gICAgU2Vuc29yRGF0YSogIGRhdGEgPSAodm9pZCopZGV2OwotICAgIGludCBmZCA9IGRhdGEtPmV2ZW50c19mZDsKLQotICAgIEQoIiVzOiBkYXRhPSVwIiwgX19GVU5DVElPTl9fLCBkZXYpOwotCi0gICAgLy8gdGhlcmUgYXJlIHBlbmRpbmcgc2Vuc29ycywgcmV0dXJucyB0aGVtIG5vdy4uLgotICAgIGlmIChkYXRhLT5wZW5kaW5nU2Vuc29ycykgewotICAgICAgICByZXR1cm4gcGlja19zZW5zb3IoZGF0YSwgdmFsdWVzKTsKLSAgICB9Ci0KLSAgICAvLyB3YWl0IHVudGlsIHdlIGdldCBhIGNvbXBsZXRlIGV2ZW50IGZvciBhbiBlbmFibGVkIHNlbnNvcgotICAgIHVpbnQzMl90IG5ld19zZW5zb3JzID0gMDsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIC8qIHJlYWQgdGhlIG5leHQgZXZlbnQgKi8KLSAgICAgICAgY2hhciAgICAgYnVmZlsyNTZdOwotICAgICAgICBpbnQgICAgICBsZW4gPSBxZW11ZF9jaGFubmVsX3JlY3YoZGF0YS0+ZXZlbnRzX2ZkLCBidWZmLCBzaXplb2YgYnVmZi0xKTsKLSAgICAgICAgZmxvYXQgICAgcGFyYW1zWzNdOwotICAgICAgICBpbnQ2NF90ICBldmVudF90aW1lOwotCi0gICAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnVmZltsZW5dID0gMDsKLQotICAgICAgICAvKiAid2FrZSIgaXMgc2VudCBmcm9tIHRoZSBlbXVsYXRvciB0byBleGl0IHRoaXMgbG9vcC4gVGhpcyBzaGFsbAotICAgICAgICAgKiByZWFsbHkgYmUgYmVjYXVzZSBhbm90aGVyIHRocmVhZCBjYWxsZWQgImNvbnRyb2xfX3dha2UiIGluIHRoaXMKLSAgICAgICAgICogcHJvY2Vzcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghc3RyY21wKChjb25zdCBjaGFyKilkYXRhLCAid2FrZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMHg3RkZGRkZGRjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qICJhY2NlbGVyYXRpb246PHg+Ojx5Pjo8ej4iIGNvcnJlc3BvbmRzIHRvIGFuIGFjY2VsZXJhdGlvbiBldmVudCAqLwotICAgICAgICBpZiAoc3NjYW5mKGJ1ZmYsICJhY2NlbGVyYXRpb246JWc6JWc6JWciLCBwYXJhbXMrMCwgcGFyYW1zKzEsIHBhcmFtcysyKSA9PSAzKSB7Ci0gICAgICAgICAgICBuZXdfc2Vuc29ycyB8PSBTRU5TT1JTX0FDQ0VMRVJBVElPTjsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfQUNDRUxFUkFUSU9OXS5hY2NlbGVyYXRpb24ueCA9IHBhcmFtc1swXTsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfQUNDRUxFUkFUSU9OXS5hY2NlbGVyYXRpb24ueSA9IHBhcmFtc1sxXTsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfQUNDRUxFUkFUSU9OXS5hY2NlbGVyYXRpb24ueiA9IHBhcmFtc1syXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogIm9yaWVudGF0aW9uOjxhemltdXRoPjo8cGl0Y2g+Ojxyb2xsPiIgaXMgc2VudCB3aGVuIG9yaWVudGF0aW9uIGNoYW5nZXMgKi8KLSAgICAgICAgaWYgKHNzY2FuZihidWZmLCAib3JpZW50YXRpb246JWc6JWc6JWciLCBwYXJhbXMrMCwgcGFyYW1zKzEsIHBhcmFtcysyKSA9PSAzKSB7Ci0gICAgICAgICAgICBuZXdfc2Vuc29ycyB8PSBTRU5TT1JTX09SSUVOVEFUSU9OOwotICAgICAgICAgICAgZGF0YS0+c2Vuc29yc1tJRF9PUklFTlRBVElPTl0ub3JpZW50YXRpb24uYXppbXV0aCA9IHBhcmFtc1swXTsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfT1JJRU5UQVRJT05dLm9yaWVudGF0aW9uLnBpdGNoICAgPSBwYXJhbXNbMV07Ci0gICAgICAgICAgICBkYXRhLT5zZW5zb3JzW0lEX09SSUVOVEFUSU9OXS5vcmllbnRhdGlvbi5yb2xsICAgID0gcGFyYW1zWzJdOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAibWFnbmV0aWM6PHg+Ojx5Pjo8ej4iIGlzIHNlbnQgZm9yIHRoZSBwYXJhbXMgb2YgdGhlIG1hZ25ldGljIGZpZWxkICovCi0gICAgICAgIGlmIChzc2NhbmYoYnVmZiwgIm1hZ25ldGljOiVnOiVnOiVnIiwgcGFyYW1zKzAsIHBhcmFtcysxLCBwYXJhbXMrMikgPT0gMykgewotICAgICAgICAgICAgbmV3X3NlbnNvcnMgfD0gU0VOU09SU19NQUdORVRJQ19GSUVMRDsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfTUFHTkVUSUNfRklFTERdLm1hZ25ldGljLnggPSBwYXJhbXNbMF07Ci0gICAgICAgICAgICBkYXRhLT5zZW5zb3JzW0lEX01BR05FVElDX0ZJRUxEXS5tYWduZXRpYy55ID0gcGFyYW1zWzFdOwotICAgICAgICAgICAgZGF0YS0+c2Vuc29yc1tJRF9NQUdORVRJQ19GSUVMRF0ubWFnbmV0aWMueiA9IHBhcmFtc1syXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogInRlbXBlcmF0dXJlOjxjZWxzaXVzPiIgKi8KLSAgICAgICAgaWYgKHNzY2FuZihidWZmLCAidGVtcGVyYXR1cmU6JWciLCBwYXJhbXMrMCkgPT0gMikgewotICAgICAgICAgICAgbmV3X3NlbnNvcnMgfD0gU0VOU09SU19URU1QRVJBVFVSRTsKLSAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbSURfVEVNUEVSQVRVUkVdLnRlbXBlcmF0dXJlID0gcGFyYW1zWzBdOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAic3luYzo8dGltZT4iIGlzIHNlbnQgYWZ0ZXIgYSBzZXJpZXMgb2Ygc2Vuc29yIGV2ZW50cy4KLSAgICAgICAgICogd2hlcmUgJ3RpbWUnIGlzIGV4cHJlc3NlZCBpbiBtaWNyby1zZWNvbmRzIGFuZCBjb3JyZXNwb25kcwotICAgICAgICAgKiB0byB0aGUgVk0gdGltZSB3aGVuIHRoZSByZWFsIHBvbGwgb2NjdXJlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzc2NhbmYoYnVmZiwgInN5bmM6JWxsZCIsICZldmVudF90aW1lKSA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobmV3X3NlbnNvcnMpIHsKLSAgICAgICAgICAgICAgICBkYXRhLT5wZW5kaW5nU2Vuc29ycyA9IG5ld19zZW5zb3JzOwotICAgICAgICAgICAgICAgIGludDY0X3QgdCA9IGV2ZW50X3RpbWUgKiAxMDAwTEw7ICAvKiBjb252ZXJ0IHRvIG5hbm8tc2Vjb25kcyAqLwotCi0gICAgICAgICAgICAgICAgLyogdXNlIHRoZSB0aW1lIGF0IHRoZSBmaXJzdCBzeW5jOiBhcyB0aGUgYmFzZSBmb3IgbGF0ZXIKLSAgICAgICAgICAgICAgICAgKiB0aW1lIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgIGlmIChkYXRhLT50aW1lU3RhcnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhLT50aW1lU3RhcnQgID0gZGF0YV9fbm93X25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPnRpbWVPZmZzZXQgPSBkYXRhLT50aW1lU3RhcnQgLSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ICs9IGRhdGEtPnRpbWVPZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAobmV3X3NlbnNvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2NseihuZXdfc2Vuc29ycyk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld19zZW5zb3JzICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPnNlbnNvcnNbaV0udGltZSA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwaWNrX3NlbnNvcihkYXRhLCB2YWx1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBEKCJodWggPyBzeW5jIHdpdGhvdXQgYW55IHNlbnNvciBkYXRhID8iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEQoImh1aCA/IHVuc3VwcG9ydGVkIGNvbW1hbmQiKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWRhdGFfX2Nsb3NlKHN0cnVjdCBod19kZXZpY2VfdCAqZGV2KSAKLXsKLSAgICBTZW5zb3JEYXRhKiBkYXRhID0gKFNlbnNvckRhdGEqKWRldjsKLSAgICBpZiAoZGF0YSkgewotICAgICAgICBpZiAoZGF0YS0+ZXZlbnRzX2ZkID4gMCkgewotICAgICAgICAgICAgLy9MT0dEKCIoZGV2aWNlIGNsb3NlKSBhYm91dCB0byBjbG9zZSBmZD0lZCIsIGRhdGEtPmV2ZW50c19mZCk7Ci0gICAgICAgICAgICBjbG9zZShkYXRhLT5ldmVudHNfZmQpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUoZGF0YSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qKiBNT0RVTEUgUkVHSVNUUkFUSU9OIFNVUFBPUlQKLSAqKgotICoqIFRoaXMgaXMgcmVxdWlyZWQgc28gdGhhdCBoYXJkd2FyZS9saWJoYXJkd2FyZS9oYXJkd2FyZS5jCi0gKiogd2lsbCBkbG9wZW4oKSB0aGlzIGxpYnJhcnkgYXBwcm9wcmlhdGVseS4KLSAqKi8KLQotLyoKLSAqIHRoZSBmb2xsb3dpbmcgaXMgdGhlIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCBzZW5zb3JzLgotICogdGhpcyB0YWJsZSBpcyB1c2VkIHRvIGJ1aWxkIHNTZW5zb3JMaXN0IGRlY2xhcmVkIGJlbG93Ci0gKiBhY2NvcmRpbmcgdG8gd2hpY2ggaGFyZHdhcmUgc2Vuc29ycyBhcmUgcmVwb3J0ZWQgYXMKLSAqIGF2YWlsYWJsZSBmcm9tIHRoZSBlbXVsYXRvciAoc2VlIGdldF9zZW5zb3JzX2xpc3QgYmVsb3cpCi0gKgotICogbm90ZTogbnVtZXJpY2FsIHZhbHVlcyBmb3IgbWF4UmFuZ2UvcmVzb2x1dGlvbi9wb3dlciB3ZXJlCi0gKiAgICAgICB0YWtlbiBmcm9tIHRoZSByZWZlcmVuY2UgQUs4OTc2QSBpbXBsZW1lbnRhdGlvbgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlbnNvcl90IHNTZW5zb3JMaXN0SW5pdFtdID0gewotICAgICAgICB7IC5uYW1lICAgICAgID0gIkdvbGRmaXNoIDMtYXhpcyBBY2NlbGVyb21ldGVyIiwKLSAgICAgICAgICAudmVuZG9yICAgICA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgICAudmVyc2lvbiAgICA9IDEsCi0gICAgICAgICAgLmhhbmRsZSAgICAgPSBJRF9BQ0NFTEVSQVRJT04sCi0gICAgICAgICAgLnR5cGUgICAgICAgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSLAotICAgICAgICAgIC5tYXhSYW5nZSAgID0gMi44ZiwKLSAgICAgICAgICAucmVzb2x1dGlvbiA9IDEuMGYvNDAzMi4wZiwKLSAgICAgICAgICAucG93ZXIgICAgICA9IDMuMGYsCi0gICAgICAgICAgLnJlc2VydmVkICAgPSB7fQotICAgICAgICB9LAotCi0gICAgICAgIHsgLm5hbWUgICAgICAgPSAiR29sZGZpc2ggMy1heGlzIE1hZ25ldGljIGZpZWxkIHNlbnNvciIsCi0gICAgICAgICAgLnZlbmRvciAgICAgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgICAgICAgLnZlcnNpb24gICAgPSAxLAotICAgICAgICAgIC5oYW5kbGUgICAgID0gSURfTUFHTkVUSUNfRklFTEQsCi0gICAgICAgICAgLnR5cGUgICAgICAgPSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCwKLSAgICAgICAgICAubWF4UmFuZ2UgICA9IDIwMDAuMGYsCi0gICAgICAgICAgLnJlc29sdXRpb24gPSAxLjBmLAotICAgICAgICAgIC5wb3dlciAgICAgID0gNi43ZiwKLSAgICAgICAgICAucmVzZXJ2ZWQgICA9IHt9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgeyAubmFtZSAgICAgICA9ICJHb2xkZmlzaCBPcmllbnRhdGlvbiBzZW5zb3IiLAotICAgICAgICAgIC52ZW5kb3IgICAgID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICAgIC52ZXJzaW9uICAgID0gMSwKLSAgICAgICAgICAuaGFuZGxlICAgICA9IElEX09SSUVOVEFUSU9OLAotICAgICAgICAgIC50eXBlICAgICAgID0gU0VOU09SX1RZUEVfT1JJRU5UQVRJT04sCi0gICAgICAgICAgLm1heFJhbmdlICAgPSAzNjAuMGYsCi0gICAgICAgICAgLnJlc29sdXRpb24gPSAxLjBmLAotICAgICAgICAgIC5wb3dlciAgICAgID0gOS43ZiwKLSAgICAgICAgICAucmVzZXJ2ZWQgICA9IHt9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgeyAubmFtZSAgICAgICA9ICJHb2xkZmlzaCBUZW1wZXJhdHVyZSBzZW5zb3IiLAotICAgICAgICAgIC52ZW5kb3IgICAgID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICAgIC52ZXJzaW9uICAgID0gMSwKLSAgICAgICAgICAuaGFuZGxlICAgICA9IElEX1RFTVBFUkFUVVJFLAotICAgICAgICAgIC50eXBlICAgICAgID0gU0VOU09SX1RZUEVfVEVNUEVSQVRVUkUsCi0gICAgICAgICAgLm1heFJhbmdlICAgPSA4MC4wZiwKLSAgICAgICAgICAucmVzb2x1dGlvbiA9IDEuMGYsCi0gICAgICAgICAgLnBvd2VyICAgICAgPSAwLjBmLAotICAgICAgICAgIC5yZXNlcnZlZCAgID0ge30KLSAgICAgICAgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX3QgIHNTZW5zb3JMaXN0W01BWF9OVU1fU0VOU09SU107Ci0KLXN0YXRpYyB1aW50MzJfdCBzZW5zb3JzX19nZXRfc2Vuc29yc19saXN0KHN0cnVjdCBzZW5zb3JzX21vZHVsZV90KiBtb2R1bGUsCi0gICAgICAgIHN0cnVjdCBzZW5zb3JfdCBjb25zdCoqIGxpc3QpIAotewotICAgIGludCAgZmQgPSBxZW11ZF9jaGFubmVsX29wZW4oU0VOU09SU19TRVJWSUNFX05BTUUpOwotICAgIGNoYXIgYnVmZmVyWzEyXTsKLSAgICBpbnQgIG1hc2ssIG5uLCBjb3VudDsKLQotICAgIGludCAgcmV0OwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgRSgiJXM6IG5vIHFlbXVkIGNvbm5lY3Rpb24iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0ID0gcWVtdWRfY2hhbm5lbF9zZW5kKGZkLCAibGlzdC1zZW5zb3JzIiwgLTEpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIEUoIiVzOiBjb3VsZCBub3QgcXVlcnkgc2Vuc29yIGxpc3Q6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldCA9IHFlbXVkX2NoYW5uZWxfcmVjdihmZCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyLTEpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIEUoIiVzOiBjb3VsZCBub3QgcmVjZWl2ZSBzZW5zb3IgbGlzdDogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYnVmZmVyW3JldF0gPSAwOwotICAgIGNsb3NlKGZkKTsKLQotICAgIC8qIHRoZSByZXN1bHQgaXMgYSBpbnRlZ2VyIHVzZWQgYXMgYSBtYXNrIGZvciBhdmFpbGFibGUgc2Vuc29ycyAqLwotICAgIG1hc2sgID0gYXRvaShidWZmZXIpOwotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKG5uID0gMDsgbm4gPCBNQVhfTlVNX1NFTlNPUlM7IG5uKyspIHsKLSAgICAgICAgaWYgKCgoMSA8PCBubikgJiBtYXNrKSA9PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgc1NlbnNvckxpc3RbY291bnQrK10gPSBzU2Vuc29yTGlzdEluaXRbbm5dOwotICAgIH0KLSAgICBEKCIlczogcmV0dXJuZWQgJWQgc2Vuc29ycyAobWFzaz0lZCkiLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBtYXNrKTsKLSAgICAqbGlzdCA9IHNTZW5zb3JMaXN0OwotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi1zdGF0aWMgaW50Ci1vcGVuX3NlbnNvcnMoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCi0gICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgIHN0cnVjdCBod19kZXZpY2VfdCogICAgICAqZGV2aWNlKQotewotICAgIGludCAgc3RhdHVzID0gLUVJTlZBTDsKLQotICAgIEQoIiVzOiBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsIFNFTlNPUlNfSEFSRFdBUkVfQ09OVFJPTCkpCi0gICAgewotICAgICAgICBTZW5zb3JDb250cm9sICpkZXYgPSBtYWxsb2Moc2l6ZW9mKCpkZXYpKTsKLQotICAgICAgICBtZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwotCi0gICAgICAgIGRldi0+ZGV2aWNlLmNvbW1vbi50YWcgICAgICAgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwotICAgICAgICBkZXYtPmRldmljZS5jb21tb24udmVyc2lvbiAgID0gMDsKLSAgICAgICAgZGV2LT5kZXZpY2UuY29tbW9uLm1vZHVsZSAgICA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKSBtb2R1bGU7Ci0gICAgICAgIGRldi0+ZGV2aWNlLmNvbW1vbi5jbG9zZSAgICAgPSBjb250cm9sX19jbG9zZTsKLSAgICAgICAgZGV2LT5kZXZpY2Uub3Blbl9kYXRhX3NvdXJjZSA9IGNvbnRyb2xfX29wZW5fZGF0YV9zb3VyY2U7Ci0gICAgICAgIGRldi0+ZGV2aWNlLmFjdGl2YXRlICAgICAgICAgPSBjb250cm9sX19hY3RpdmF0ZTsKLSAgICAgICAgZGV2LT5kZXZpY2Uuc2V0X2RlbGF5ICAgICAgICA9IGNvbnRyb2xfX3NldF9kZWxheTsKLSAgICAgICAgZGV2LT5kZXZpY2Uud2FrZSAgICAgICAgICAgICA9IGNvbnRyb2xfX3dha2U7Ci0gICAgICAgIGRldi0+ZmQgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKLQotICAgICAgICAqZGV2aWNlID0gJmRldi0+ZGV2aWNlLmNvbW1vbjsKLSAgICAgICAgc3RhdHVzICA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgU0VOU09SU19IQVJEV0FSRV9EQVRBKSkgewotICAgICAgICBTZW5zb3JEYXRhICpkZXYgPSBtYWxsb2Moc2l6ZW9mKCpkZXYpKTsKLQotICAgICAgICBtZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwotCi0gICAgICAgIGRldi0+ZGV2aWNlLmNvbW1vbi50YWcgICAgID0gSEFSRFdBUkVfREVWSUNFX1RBRzsKLSAgICAgICAgZGV2LT5kZXZpY2UuY29tbW9uLnZlcnNpb24gPSAwOwotICAgICAgICBkZXYtPmRldmljZS5jb21tb24ubW9kdWxlICA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKSBtb2R1bGU7Ci0gICAgICAgIGRldi0+ZGV2aWNlLmNvbW1vbi5jbG9zZSAgID0gZGF0YV9fY2xvc2U7Ci0gICAgICAgIGRldi0+ZGV2aWNlLmRhdGFfb3BlbiAgICAgID0gZGF0YV9fZGF0YV9vcGVuOwotICAgICAgICBkZXYtPmRldmljZS5kYXRhX2Nsb3NlICAgICA9IGRhdGFfX2RhdGFfY2xvc2U7Ci0gICAgICAgIGRldi0+ZGV2aWNlLnBvbGwgICAgICAgICAgID0gZGF0YV9fcG9sbDsKLSAgICAgICAgZGV2LT5ldmVudHNfZmQgICAgICAgICAgICAgPSAtMTsKLQotICAgICAgICAqZGV2aWNlID0gJmRldi0+ZGV2aWNlLmNvbW1vbjsKLSAgICAgICAgc3RhdHVzICA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IHNlbnNvcnNfbW9kdWxlX21ldGhvZHMgPSB7Ci0gICAgLm9wZW4gPSBvcGVuX3NlbnNvcnMKLX07Ci0KLWNvbnN0IHN0cnVjdCBzZW5zb3JzX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7Ci0gICAgLmNvbW1vbiA9IHsKLSAgICAgICAgLnRhZyA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCi0gICAgICAgIC52ZXJzaW9uX21ham9yID0gMSwKLSAgICAgICAgLnZlcnNpb25fbWlub3IgPSAwLAotICAgICAgICAuaWQgPSBTRU5TT1JTX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgLm5hbWUgPSAiR29sZGZpc2ggU0VOU09SUyBNb2R1bGUiLAotICAgICAgICAuYXV0aG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICAubWV0aG9kcyA9ICZzZW5zb3JzX21vZHVsZV9tZXRob2RzLAotICAgIH0sCi0gICAgLmdldF9zZW5zb3JzX2xpc3QgPSBzZW5zb3JzX19nZXRfc2Vuc29yc19saXN0Ci19OwpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9hcnJvd19kb3duLnBuZyBiL2VtdWxhdG9yL3NraW5zL0hWR0EvYXJyb3dfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmRlMjIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9hcnJvd19kb3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL0hWR0EvYXJyb3dfbGVmdC5wbmcgYi9lbXVsYXRvci9za2lucy9IVkdBL2Fycm93X2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFiMTkyLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL0hWR0EvYXJyb3dfbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9IVkdBL2Fycm93X3JpZ2h0LnBuZyBiL2VtdWxhdG9yL3NraW5zL0hWR0EvYXJyb3dfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JjNjVkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL0hWR0EvYXJyb3dfcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9hcnJvd191cC5wbmcgYi9lbXVsYXRvci9za2lucy9IVkdBL2Fycm93X3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNzEyMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9IVkdBL2Fycm93X3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL0hWR0EvYmFja2dyb3VuZF9sYW5kLnBuZyBiL2VtdWxhdG9yL3NraW5zL0hWR0EvYmFja2dyb3VuZF9sYW5kLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljODU3Yi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9IVkdBL2JhY2tncm91bmRfbGFuZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9IVkdBL2JhY2tncm91bmRfcG9ydC5wbmcgYi9lbXVsYXRvci9za2lucy9IVkdBL2JhY2tncm91bmRfcG9ydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTI5MzQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9iYWNrZ3JvdW5kX3BvcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9idXR0b24ucG5nIGIvZW11bGF0b3Ivc2tpbnMvSFZHQS9idXR0b24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZDIwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL0hWR0EvYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL0hWR0EvY29udHJvbHMucG5nIGIvZW11bGF0b3Ivc2tpbnMvSFZHQS9jb250cm9scy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1ZTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9jb250cm9scy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9IVkdBL2hhcmR3YXJlLmluaSBiL2VtdWxhdG9yL3NraW5zL0hWR0EvaGFyZHdhcmUuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEzMGIwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL0hWR0EvaGFyZHdhcmUuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHNraW4tc3BlY2lmaWMgaGFyZHdhcmUgdmFsdWVzCi1ody5sY2QuZGVuc2l0eT0xNjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9IVkdBL2tleS5wbmcgYi9lbXVsYXRvci9za2lucy9IVkdBL2tleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjAzYmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9rZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9rZXlib2FyZC5wbmcgYi9lbXVsYXRvci9za2lucy9IVkdBL2tleWJvYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0OWRjZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9IVkdBL2tleWJvYXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL0hWR0EvbGF5b3V0IGIvZW11bGF0b3Ivc2tpbnMvSFZHQS9sYXlvdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjODJkZGUuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvSFZHQS9sYXlvdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotcGFydHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGJhY2tncm91bmRfcG9ydC5wbmcKLSAgICAgICAgfQotICAgIH0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9sYW5kLnBuZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGV2aWNlIHsKLSAgICAgICAgZGlzcGxheSB7Ci0gICAgICAgICAgICB3aWR0aCAgIDMyMAotICAgICAgICAgICAgaGVpZ2h0ICA0ODAKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb250cm9scyB7Ci0gICAgICAgIGJhY2tncm91bmQgewotICAgICAgICAgICAgaW1hZ2UgICBjb250cm9scy5wbmcKLSAgICAgICAgfQotICAgICAgICBidXR0b25zIHsKLSAgICAgICAgICAgIHNvZnQtbGVmdCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA1NgotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgaG9tZSB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAwCi0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiYWNrIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDExMgotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC11cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X3VwLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtZG93biB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X2Rvd24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSAxMDYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtbGVmdCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X2xlZnQucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTMKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1yaWdodCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X3JpZ2h0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDEyMwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWNlbnRlciB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIHNlbGVjdC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDgxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaG9uZS1kaWFsIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDAKLSAgICAgICAgICAgICAgICAgICAgeSA3MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGhvbmUtaGFuZ3VwIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDE2OAotICAgICAgICAgICAgICAgICAgICB5IDcxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBvd2VyIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDE2OAotICAgICAgICAgICAgICAgICAgICB5IDAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9sdW1lLXVwIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDExMgotICAgICAgICAgICAgICAgICAgICB5IDAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9sdW1lLWRvd24gewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTYKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlYXJjaCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAga2V5Ym9hcmQgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAga2V5Ym9hcmQucG5nCi0gICAgICAgIH0KLSAgICAgICAgYnV0dG9ucyB7Ci0gICAgICAgICAgICAxIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5ICA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAyIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgOCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgOSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5ICA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgciB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB5IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGsgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREVMIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDQVAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQRVJJT0QgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRU5URVIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTFQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTWU0gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBVCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNQQUNFIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAgc3BhY2ViYXIucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0xBU0ggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ09NTUEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxUMiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KLQotbGF5b3V0cyB7Ci0gICAgcG9ydHJhaXQgewotICAgICAgICB3aWR0aCAgICAgNzkxCi0gICAgICAgIGhlaWdodCAgICA1MzQKLSAgICAgICAgY29sb3IgICAgIDB4ZTBlMGUwCi0gICAgICAgIGV2ZW50ICAgICBFVl9TVzowOjEKLQotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDIgewotICAgICAgICAgICAgbmFtZSAgICBsYW5kc2NhcGUKLSAgICAgICAgICAgIHggICAgICAgODAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgZGV2aWNlCi0gICAgICAgICAgICB4ICAgICAgIDI4Ci0gICAgICAgICAgICB5ICAgICAgIDI3Ci0gICAgICAgIH0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICBjb250cm9scwotICAgICAgICAgICAgeCAgICAgICA0NzYKLSAgICAgICAgICAgIHkgICAgICAgNzcKLSAgICAgICAgfQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgIGtleWJvYXJkCi0gICAgICAgICAgICB4ICAgICAgIDM5NQotICAgICAgICAgICAgeSAgICAgICAzMjgKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgbGFuZHNjYXBlIHsKLSAgICAgICAgd2lkdGggICAgIDY0MAotICAgICAgICBoZWlnaHQgICAgNjAxCi0gICAgICAgIGNvbG9yICAgICAweGUwZTBlMAotICAgICAgICBldmVudCAgICAgRVZfU1c6MDowCi0KLSAgICAgICAgIyB0aGUgZnJhbWV3b3JrIF9hbHdheXNfIGFzc3VtZSB0aGF0IHRoZSBEUGFkCi0gICAgICAgICMgaGFzIGJlZW4gcGh5c2ljYWxseSByb3RhdGVkIGluIGxhbmRzY2FwZSBtb2RlLgotICAgICAgICAjIGhvd2V2ZXIsIHdpdGggdGhpcyBza2luLCB0aGlzIGlzIG5vdCB0aGUgY2FzZQotICAgICAgICAjCi0gICAgICAgIGRwYWQtcm90YXRpb24gMwotCi0gICAgICAgIHBhcnQxIHsKLSAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKLSAgICAgICAgICAgIHggICAgICAgODAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQyIHsKLSAgICAgICAgICAgIG5hbWUgICAgbGFuZHNjYXBlCi0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDMgewotICAgICAgICAgICAgbmFtZSAgICAgIGRldmljZQotICAgICAgICAgICAgeCAgICAgICAgIDgwCi0gICAgICAgICAgICB5ICAgICAgICAgMzQ5Ci0gICAgICAgICAgICByb3RhdGlvbiAgMwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgIDQxMAotICAgICAgICAgICAgeSAgICAgICAgMzk2Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICAgMTgKLSAgICAgICAgICAgIHkgICAgICAgIDM5NgotICAgICAgICB9Ci0gICAgfQotfQotCi1rZXlib2FyZCB7Ci0gICAgY2hhcm1hcCBxd2VydHkyCi19Ci0KLW5ldHdvcmsgewotICAgIHNwZWVkICBmdWxsCi0gICAgZGVsYXkgIG5vbmUKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL0hWR0Evc2VsZWN0LnBuZyBiL2VtdWxhdG9yL3NraW5zL0hWR0Evc2VsZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNjVkMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9IVkdBL3NlbGVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9IVkdBL3NwYWNlYmFyLnBuZyBiL2VtdWxhdG9yL3NraW5zL0hWR0Evc3BhY2ViYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ1OWJkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL0hWR0Evc3BhY2ViYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9hcnJvd19kb3duLnBuZyBiL2VtdWxhdG9yL3NraW5zL1FWR0EvYXJyb3dfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmRlMjIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9hcnJvd19kb3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1FWR0EvYXJyb3dfbGVmdC5wbmcgYi9lbXVsYXRvci9za2lucy9RVkdBL2Fycm93X2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFiMTkyLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1FWR0EvYXJyb3dfbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9RVkdBL2Fycm93X3JpZ2h0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1FWR0EvYXJyb3dfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JjNjVkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1FWR0EvYXJyb3dfcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9hcnJvd191cC5wbmcgYi9lbXVsYXRvci9za2lucy9RVkdBL2Fycm93X3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNzEyMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9RVkdBL2Fycm93X3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1FWR0EvYmFja2dyb3VuZF9sYW5kLnBuZyBiL2VtdWxhdG9yL3NraW5zL1FWR0EvYmFja2dyb3VuZF9sYW5kLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMDJiNS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9RVkdBL2JhY2tncm91bmRfbGFuZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9RVkdBL2JhY2tncm91bmRfcG9ydC5wbmcgYi9lbXVsYXRvci9za2lucy9RVkdBL2JhY2tncm91bmRfcG9ydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Mjg1NjIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9iYWNrZ3JvdW5kX3BvcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9idXR0b24ucG5nIGIvZW11bGF0b3Ivc2tpbnMvUVZHQS9idXR0b24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZDIwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1FWR0EvYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1FWR0EvY29udHJvbHMucG5nIGIvZW11bGF0b3Ivc2tpbnMvUVZHQS9jb250cm9scy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1ZTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9jb250cm9scy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9RVkdBL2hhcmR3YXJlLmluaSBiL2VtdWxhdG9yL3NraW5zL1FWR0EvaGFyZHdhcmUuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWZlNjE3Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1FWR0EvaGFyZHdhcmUuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHNraW4tc3BlY2lmaWMgaGFyZHdhcmUgdmFsdWVzCi1ody5sY2QuZGVuc2l0eT0xMjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9RVkdBL2tleS5wbmcgYi9lbXVsYXRvci9za2lucy9RVkdBL2tleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjAzYmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9rZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9rZXlib2FyZC5wbmcgYi9lbXVsYXRvci9za2lucy9RVkdBL2tleWJvYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0OWRjZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9RVkdBL2tleWJvYXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1FWR0EvbGF5b3V0IGIvZW11bGF0b3Ivc2tpbnMvUVZHQS9sYXlvdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjIxMzMuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvUVZHQS9sYXlvdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotcGFydHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGJhY2tncm91bmRfcG9ydC5wbmcKLSAgICAgICAgfQotICAgIH0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9sYW5kLnBuZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGV2aWNlIHsKLSAgICAgICAgZGlzcGxheSB7Ci0gICAgICAgICAgICB3aWR0aCAgIDI0MAotICAgICAgICAgICAgaGVpZ2h0ICAzMjAKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY29udHJvbHMgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgY29udHJvbHMucG5nCi0gICAgICAgIH0KLSAgICAgICAgYnV0dG9ucyB7Ci0gICAgICAgICAgICBzb2Z0LWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTYKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhvbWUgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMAotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFjayB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtdXAgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd191cC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWRvd24gewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19kb3duLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgMTA2Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19sZWZ0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDUzCi0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtcmlnaHQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19yaWdodC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMjMKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1jZW50ZXIgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBzZWxlY3QucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSA4MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGhvbmUtZGlhbCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAwCi0gICAgICAgICAgICAgICAgICAgIHkgNzEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBob25lLWhhbmd1cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSA3MQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3dlciB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS11cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS1kb3duIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDU2Ci0gICAgICAgICAgICAgICAgICAgIHkgMAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWFyY2ggewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTY4Ci0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGtleWJvYXJkIHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGtleWJvYXJkLnBuZwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbnMgewotICAgICAgICAgICAgMSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAzIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGogewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFTCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0FQIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUEVSSU9EIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVOVEVSIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxUIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU1lNIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTUEFDRSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIHNwYWNlYmFyLnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMQVNIIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENPTU1BIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMVDIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWxheW91dHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgd2lkdGggICAgIDcxMQotICAgICAgICBoZWlnaHQgICAgNDM1Ci0gICAgICAgIGNvbG9yICAgICAweGUwZTBlMAotICAgICAgICBldmVudCAgICAgRVZfU1c6MDoxCi0gICAgICAgIAotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDIgewotICAgICAgICAgICAgbmFtZSAgICBsYW5kc2NhcGUKLSAgICAgICAgICAgIHggICAgICAgODAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgZGV2aWNlCi0gICAgICAgICAgICB4ICAgICAgIDI4Ci0gICAgICAgICAgICB5ICAgICAgIDU4Ci0gICAgICAgIH0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgIDM5NgotICAgICAgICAgICAgeSAgICAgICAgMjcKLSAgICAgICAgfQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICAgMzE1Ci0gICAgICAgICAgICB5ICAgICAgICAyMjkKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxhbmRzY2FwZSB7Ci0gICAgICAgIHdpZHRoICAgICA2NDAKLSAgICAgICAgaGVpZ2h0ICAgIDUyMgotICAgICAgICBjb2xvciAgICAgMHhlMGUwZTAKLSAgICAgICAgZXZlbnQgICAgIEVWX1NXOjA6MAotCi0gICAgICAgIGRwYWQtcm90YXRpb24gMwotCi0KLSAgICAgICAgcGFydDEgewotICAgICAgICAgICAgbmFtZSAgICBwb3J0cmFpdAotICAgICAgICAgICAgeCAgICAgICA4MDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDIgewotICAgICAgICAgICAgbmFtZSAgICBsYW5kc2NhcGUKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MyB7Ci0gICAgICAgICAgICBuYW1lICAgICAgZGV2aWNlCi0gICAgICAgICAgICB4ICAgICAgICAgMTYwCi0gICAgICAgICAgICB5ICAgICAgICAgMjcwCi0gICAgICAgICAgICByb3RhdGlvbiAgMwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgIDQxMAotICAgICAgICAgICAgeSAgICAgICAgMzE3Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICAgMTgKLSAgICAgICAgICAgIHkgICAgICAgIDMxNwotICAgICAgICB9Ci0gICAgfQotfQotCi1rZXlib2FyZCB7Ci0gICAgY2hhcm1hcCBxd2VydHkyCi19Ci0KLW5ldHdvcmsgewotICAgIHNwZWVkICBmdWxsCi0gICAgZGVsYXkgIG5vbmUKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1FWR0Evc2VsZWN0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1FWR0Evc2VsZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNjVkMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9RVkdBL3NlbGVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9RVkdBL3NwYWNlYmFyLnBuZyBiL2VtdWxhdG9yL3NraW5zL1FWR0Evc3BhY2ViYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ1OWJkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1FWR0Evc3BhY2ViYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfZG93bi5wbmcgYi9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9hcnJvd19kb3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmZGUyMi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9hcnJvd19kb3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2Fycm93X2xlZnQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfbGVmdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWIxOTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9hcnJvd19yaWdodC5wbmcgYi9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9hcnJvd19yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmM2NWQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfdXAucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYXJyb3dfdXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM3MTIxLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2Fycm93X3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2JhY2tncm91bmRfbGFuZC5wbmcgYi9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9iYWNrZ3JvdW5kX2xhbmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiZWU5Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2JhY2tncm91bmRfbGFuZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9iYWNrZ3JvdW5kX3BvcnQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYmFja2dyb3VuZF9wb3J0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZWRiOC4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9iYWNrZ3JvdW5kX3BvcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYnV0dG9uLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODFkMjAuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2NvbnRyb2xzLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2NvbnRyb2xzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiODVlMi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9jb250cm9scy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9oYXJkd2FyZS5pbmkgYi9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9oYXJkd2FyZS5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZmU2MTcuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvaGFyZHdhcmUuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIHNraW4tc3BlY2lmaWMgaGFyZHdhcmUgdmFsdWVzCi1ody5sY2QuZGVuc2l0eT0xMjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9rZXkucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAva2V5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiMDNiZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9rZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAva2V5Ym9hcmQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAva2V5Ym9hcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ5ZGNmLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2tleWJvYXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2xheW91dCBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL2xheW91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MWFkZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9sYXlvdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotcGFydHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGJhY2tncm91bmRfcG9ydC5wbmcKLSAgICAgICAgfQotICAgIH0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9sYW5kLnBuZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGV2aWNlIHsKLSAgICAgICAgZGlzcGxheSB7Ci0gICAgICAgICAgICB3aWR0aCAgIDI0MAotICAgICAgICAgICAgaGVpZ2h0ICA0MDAKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY29udHJvbHMgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgY29udHJvbHMucG5nCi0gICAgICAgIH0KLSAgICAgICAgYnV0dG9ucyB7Ci0gICAgICAgICAgICBzb2Z0LWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTYKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhvbWUgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMAotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFjayB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtdXAgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd191cC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWRvd24gewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19kb3duLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgMTA2Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19sZWZ0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDUzCi0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtcmlnaHQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19yaWdodC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMjMKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1jZW50ZXIgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBzZWxlY3QucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSA4MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGhvbmUtZGlhbCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAwCi0gICAgICAgICAgICAgICAgICAgIHkgNzEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBob25lLWhhbmd1cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSA3MQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3dlciB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS11cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS1kb3duIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDU2Ci0gICAgICAgICAgICAgICAgICAgIHkgMAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWFyY2ggewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTY4Ci0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGtleWJvYXJkIHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGtleWJvYXJkLnBuZwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbnMgewotICAgICAgICAgICAgMSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAzIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGogewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFTCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0FQIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUEVSSU9EIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVOVEVSIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxUIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU1lNIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTUEFDRSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIHNwYWNlYmFyLnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMQVNIIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENPTU1BIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMVDIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWxheW91dHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgd2lkdGggICAgIDcxMQotICAgICAgICBoZWlnaHQgICAgNDU0Ci0gICAgICAgIGNvbG9yICAgICAweGUwZTBlMAotICAgICAgICBldmVudCAgICAgRVZfU1c6MDoxCi0gICAgICAgIAotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDIgewotICAgICAgICAgICAgbmFtZSAgICBsYW5kc2NhcGUKLSAgICAgICAgICAgIHggICAgICAgODAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgZGV2aWNlCi0gICAgICAgICAgICB4ICAgICAgIDI4Ci0gICAgICAgICAgICB5ICAgICAgIDI3Ci0gICAgICAgIH0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgIDM5NgotICAgICAgICAgICAgeSAgICAgICAgMzcKLSAgICAgICAgfQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICAgMzE1Ci0gICAgICAgICAgICB5ICAgICAgICAyNDgKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxhbmRzY2FwZSB7Ci0gICAgICAgIHdpZHRoICAgICA2NDAKLSAgICAgICAgaGVpZ2h0ICAgIDUyMgotICAgICAgICBjb2xvciAgICAgMHhlMGUwZTAKLSAgICAgICAgZXZlbnQgICAgIEVWX1NXOjA6MAotCi0gICAgICAgIGRwYWQtcm90YXRpb24gMwotCi0gICAgICAgIHBhcnQxIHsKLSAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKLSAgICAgICAgICAgIHggICAgICAgODAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQyIHsKLSAgICAgICAgICAgIG5hbWUgICAgbGFuZHNjYXBlCi0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDMgewotICAgICAgICAgICAgbmFtZSAgICAgIGRldmljZQotICAgICAgICAgICAgeCAgICAgICAgIDEyMAotICAgICAgICAgICAgeSAgICAgICAgIDI3MAotICAgICAgICAgICAgcm90YXRpb24gIDMKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQ0IHsKLSAgICAgICAgICAgIG5hbWUgICAgIGNvbnRyb2xzCi0gICAgICAgICAgICB4ICAgICAgICA0MTAKLSAgICAgICAgICAgIHkgICAgICAgIDMxNwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDUgewotICAgICAgICAgICAgbmFtZSAgICAga2V5Ym9hcmQKLSAgICAgICAgICAgIHggICAgICAgIDE4Ci0gICAgICAgICAgICB5ICAgICAgICAzMTcKLSAgICAgICAgfQotICAgIH0KLX0KLQota2V5Ym9hcmQgewotICAgIGNoYXJtYXAgcXdlcnR5MgotfQotCi1uZXR3b3JrIHsKLSAgICBzcGVlZCAgZnVsbAotICAgIGRlbGF5ICBub25lCi19CmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9zZWxlY3QucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvc2VsZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNjVkMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQwMC9zZWxlY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvc3BhY2ViYXIucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAvc3BhY2ViYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ1OWJkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDAwL3NwYWNlYmFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X2Rvd24ucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYXJyb3dfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmRlMjIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYXJyb3dfZG93bi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9hcnJvd19sZWZ0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFiMTkyLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X2xlZnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYXJyb3dfcmlnaHQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYXJyb3dfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JjNjVkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X3JpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X3VwLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2Fycm93X3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNzEyMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9hcnJvd191cC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9iYWNrZ3JvdW5kX2xhbmQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYmFja2dyb3VuZF9sYW5kLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1MGUyNS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9iYWNrZ3JvdW5kX2xhbmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYmFja2dyb3VuZF9wb3J0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2JhY2tncm91bmRfcG9ydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MWFiNDUuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvYmFja2dyb3VuZF9wb3J0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2J1dHRvbi5wbmcgYi9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9idXR0b24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZDIwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9jb250cm9scy5wbmcgYi9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9jb250cm9scy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1ZTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvY29udHJvbHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvaGFyZHdhcmUuaW5pIGIvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvaGFyZHdhcmUuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWZlNjE3Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2hhcmR3YXJlLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBza2luLXNwZWNpZmljIGhhcmR3YXJlIHZhbHVlcwotaHcubGNkLmRlbnNpdHk9MTIwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIva2V5LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2tleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjAzYmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIva2V5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2tleWJvYXJkLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL2tleWJvYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0OWRjZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9rZXlib2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9sYXlvdXQgYi9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9sYXlvdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmU5NTUuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvbGF5b3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLXBhcnRzIHsKLSAgICBwb3J0cmFpdCB7Ci0gICAgICAgIGJhY2tncm91bmQgewotICAgICAgICAgICAgaW1hZ2UgICBiYWNrZ3JvdW5kX3BvcnQucG5nCi0gICAgICAgIH0KLSAgICB9Ci0gICAgbGFuZHNjYXBlIHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGJhY2tncm91bmRfbGFuZC5wbmcKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRldmljZSB7Ci0gICAgICAgIGRpc3BsYXkgewotICAgICAgICAgICAgd2lkdGggICAyNDAKLSAgICAgICAgICAgIGhlaWdodCAgNDMyCi0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGNvbnRyb2xzIHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGNvbnRyb2xzLnBuZwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbnMgewotICAgICAgICAgICAgc29mdC1sZWZ0IHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDU2Ci0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBob21lIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDAKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhY2sgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTEyCi0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLXVwIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYXJyb3dfdXAucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1kb3duIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYXJyb3dfZG93bi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDEwNgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1sZWZ0IHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYXJyb3dfbGVmdC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA1MwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLXJpZ2h0IHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYXJyb3dfcmlnaHQucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTIzCi0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtY2VudGVyIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugc2VsZWN0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgODEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBob25lLWRpYWwgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMAotICAgICAgICAgICAgICAgICAgICB5IDcxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaG9uZS1oYW5ndXAgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTY4Ci0gICAgICAgICAgICAgICAgICAgIHkgNzEKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG93ZXIgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTY4Ci0gICAgICAgICAgICAgICAgICAgIHkgMAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2x1bWUtdXAgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTEyCi0gICAgICAgICAgICAgICAgICAgIHkgMAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2x1bWUtZG93biB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA1NgotICAgICAgICAgICAgICAgICAgICB5IDAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VhcmNoIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDE2OAotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBrZXlib2FyZCB7Ci0gICAgICAgIGJhY2tncm91bmQgewotICAgICAgICAgICAgaW1hZ2UgICBrZXlib2FyZC5wbmcKLSAgICAgICAgfQotICAgICAgICBidXR0b25zIHsKLSAgICAgICAgICAgIDEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgIDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA0IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA1IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA2IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA3IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA4IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA5IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAwIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgIDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG8gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgayB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGwgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBERUwgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENBUCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHogewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBFUklPRCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFTlRFUiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMVCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNZTSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFUIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU1BBQ0UgewotICAgICAgICAgICAgICAgIGltYWdlICBzcGFjZWJhci5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTTEFTSCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDT01NQSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTFQyIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQotCi1sYXlvdXRzIHsKLSAgICBwb3J0cmFpdCB7Ci0gICAgICAgIHdpZHRoICAgICA3MTEKLSAgICAgICAgaGVpZ2h0ICAgIDQ4NgotICAgICAgICBjb2xvciAgICAgMHhlMGUwZTAKLSAgICAgICAgZXZlbnQgICAgIEVWX1NXOjA6MQotICAgICAgICAKLSAgICAgICAgcGFydDEgewotICAgICAgICAgICAgbmFtZSAgICBwb3J0cmFpdAotICAgICAgICAgICAgeCAgICAgICAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQyIHsKLSAgICAgICAgICAgIG5hbWUgICAgbGFuZHNjYXBlCi0gICAgICAgICAgICB4ICAgICAgIDgwMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MyB7Ci0gICAgICAgICAgICBuYW1lICAgIGRldmljZQotICAgICAgICAgICAgeCAgICAgICAyOAotICAgICAgICAgICAgeSAgICAgICAyNwotICAgICAgICB9Ci0gICAgICAgIHBhcnQ0IHsKLSAgICAgICAgICAgIG5hbWUgICAgIGNvbnRyb2xzCi0gICAgICAgICAgICB4ICAgICAgICAzOTYKLSAgICAgICAgICAgIHkgICAgICAgIDUzCi0gICAgICAgIH0KLSAgICAgICAgcGFydDUgewotICAgICAgICAgICAgbmFtZSAgICAga2V5Ym9hcmQKLSAgICAgICAgICAgIHggICAgICAgIDMxNQotICAgICAgICAgICAgeSAgICAgICAgMjgwCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICB3aWR0aCAgICAgNjQwCi0gICAgICAgIGhlaWdodCAgICA1MjIKLSAgICAgICAgY29sb3IgICAgIDB4ZTBlMGUwCi0gICAgICAgIGV2ZW50ICAgICBFVl9TVzowOjAKLQotICAgICAgICBkcGFkLXJvdGF0aW9uIDMKLQotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDgwMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MiB7Ci0gICAgICAgICAgICBuYW1lICAgIGxhbmRzY2FwZQotICAgICAgICAgICAgeCAgICAgICAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgICBkZXZpY2UKLSAgICAgICAgICAgIHggICAgICAgICAxMDQKLSAgICAgICAgICAgIHkgICAgICAgICAyNzAKLSAgICAgICAgICAgIHJvdGF0aW9uICAzCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0NCB7Ci0gICAgICAgICAgICBuYW1lICAgICBjb250cm9scwotICAgICAgICAgICAgeCAgICAgICAgNDEwCi0gICAgICAgICAgICB5ICAgICAgICAzMTcKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQ1IHsKLSAgICAgICAgICAgIG5hbWUgICAgIGtleWJvYXJkCi0gICAgICAgICAgICB4ICAgICAgICAxOAotICAgICAgICAgICAgeSAgICAgICAgMzE3Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWtleWJvYXJkIHsKLSAgICBjaGFybWFwIHF3ZXJ0eTIKLX0KLQotbmV0d29yayB7Ci0gICAgc3BlZWQgIGZ1bGwKLSAgICBkZWxheSAgbm9uZQotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvc2VsZWN0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL3NlbGVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YTY1ZDMuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MzIvc2VsZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL3NwYWNlYmFyLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyL3NwYWNlYmFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NTliZC4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XUVZHQTQzMi9zcGFjZWJhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2Fycm93X2Rvd24ucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9hcnJvd19kb3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmZGUyMi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2Fycm93X2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9hcnJvd19sZWZ0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYXJyb3dfbGVmdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWIxOTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9hcnJvd19sZWZ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYXJyb3dfcmlnaHQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9hcnJvd19yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmM2NWQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9hcnJvd19yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2Fycm93X3VwLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYXJyb3dfdXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM3MTIxLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYXJyb3dfdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9iYWNrZ3JvdW5kX2xhbmQucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9iYWNrZ3JvdW5kX2xhbmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY3NzE3Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYmFja2dyb3VuZF9sYW5kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYmFja2dyb3VuZF9wb3J0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvYmFja2dyb3VuZF9wb3J0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlZjJlYS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2JhY2tncm91bmRfcG9ydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2J1dHRvbi5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODAwL2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODFkMjAuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9idXR0b24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9jb250cm9scy5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODAwL2NvbnRyb2xzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiODVlMi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2NvbnRyb2xzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvaGFyZHdhcmUuaW5pIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9oYXJkd2FyZS5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWM5MTUuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9oYXJkd2FyZS5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgc2tpbi1zcGVjaWZpYyBoYXJkd2FyZSB2YWx1ZXMKLWh3LmxjZC5kZW5zaXR5PTI0MAotdm0uaGVhcFNpemU9MjQKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAva2V5LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAva2V5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiMDNiZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2tleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2tleWJvYXJkLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAva2V5Ym9hcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ5ZGNmLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAva2V5Ym9hcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMC9sYXlvdXQgYi9lbXVsYXRvci9za2lucy9XVkdBODAwL2xheW91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NDdmMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL2xheW91dAorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi1wYXJ0cyB7Ci0gICAgcG9ydHJhaXQgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9wb3J0LnBuZwotICAgICAgICB9Ci0gICAgfQotICAgIGxhbmRzY2FwZSB7Ci0gICAgICAgIGJhY2tncm91bmQgewotICAgICAgICAgICAgaW1hZ2UgICBiYWNrZ3JvdW5kX2xhbmQucG5nCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXZpY2UgewotICAgICAgICBkaXNwbGF5IHsKLSAgICAgICAgICAgIHdpZHRoICAgNDgwCi0gICAgICAgICAgICBoZWlnaHQgIDgwMAotICAgICAgICAgICAgeCAgICAgICAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBjb250cm9scyB7Ci0gICAgICAgIGJhY2tncm91bmQgewotICAgICAgICAgICAgaW1hZ2UgICBjb250cm9scy5wbmcKLSAgICAgICAgfQotICAgICAgICBidXR0b25zIHsKLSAgICAgICAgICAgIHNvZnQtbGVmdCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA1NgotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgaG9tZSB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAwCi0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiYWNrIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDExMgotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC11cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X3VwLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtZG93biB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X2Rvd24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSAxMDYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtbGVmdCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X2xlZnQucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTMKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1yaWdodCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGFycm93X3JpZ2h0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDEyMwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWNlbnRlciB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIHNlbGVjdC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDgxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaG9uZS1kaWFsIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDAKLSAgICAgICAgICAgICAgICAgICAgeSA3MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGhvbmUtaGFuZ3VwIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDE2OAotICAgICAgICAgICAgICAgICAgICB5IDcxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBvd2VyIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDE2OAotICAgICAgICAgICAgICAgICAgICB5IDAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9sdW1lLXVwIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDExMgotICAgICAgICAgICAgICAgICAgICB5IDAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9sdW1lLWRvd24gewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTYKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlYXJjaCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAga2V5Ym9hcmQgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAga2V5Ym9hcmQucG5nCi0gICAgICAgIH0KLSAgICAgICAgYnV0dG9ucyB7Ci0gICAgICAgICAgICAxIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5ICA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAyIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgNyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgOCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgOSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5ICA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgciB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB5IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDExNgotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDIyNwotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGsgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREVMIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDQVAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE1MwotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTkwCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDI2NAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQRVJJT0QgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRU5URVIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTFQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTWU0gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBVCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDc5Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNQQUNFIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAgc3BhY2ViYXIucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0xBU0ggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ09NTUEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxUMiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KLQotbGF5b3V0cyB7Ci0gICAgcG9ydHJhaXQgewotICAgICAgICB3aWR0aCAgICAgOTUwCi0gICAgICAgIGhlaWdodCAgICA4NTQKLSAgICAgICAgY29sb3IgICAgIDB4ZTBlMGUwCi0gICAgICAgIGV2ZW50ICAgICBFVl9TVzowOjEKLSAgICAgICAgCi0gICAgICAgIHBhcnQxIHsKLSAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MiB7Ci0gICAgICAgICAgICBuYW1lICAgIGxhbmRzY2FwZQotICAgICAgICAgICAgeCAgICAgICAxMDAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgZGV2aWNlCi0gICAgICAgICAgICB4ICAgICAgIDI3Ci0gICAgICAgICAgICB5ICAgICAgIDI3Ci0gICAgICAgIH0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICBjb250cm9scwotICAgICAgICAgICAgeCAgICAgICA2MzUKLSAgICAgICAgICAgIHkgICAgICAgMjA3Ci0gICAgICAgIH0KLSAgICAgICAgcGFydDUgewotICAgICAgICAgICAgbmFtZSAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICA1NTQKLSAgICAgICAgICAgIHkgICAgICAgNDU5Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGxhbmRzY2FwZSB7Ci0gICAgICAgIHdpZHRoICAgICA4NTMKLSAgICAgICAgaGVpZ2h0ICAgIDc2MQotICAgICAgICBjb2xvciAgICAgMHhlMGUwZTAKLSAgICAgICAgZXZlbnQgICAgIEVWX1NXOjA6MAotCi0gICAgICAgIGRwYWQtcm90YXRpb24gMwotCi0gICAgICAgIHBhcnQxIHsKLSAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKLSAgICAgICAgICAgIHggICAgICAgOTAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQyIHsKLSAgICAgICAgICAgIG5hbWUgICAgbGFuZHNjYXBlCi0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDMgewotICAgICAgICAgICAgbmFtZSAgICAgIGRldmljZQotICAgICAgICAgICAgeCAgICAgICAgIDI2Ci0gICAgICAgICAgICB5ICAgICAgICAgNTA5Ci0gICAgICAgICAgICByb3RhdGlvbiAgMwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDQgewotICAgICAgICAgICAgbmFtZSAgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgIDUzOQotICAgICAgICAgICAgeSAgICAgICAgNTU2Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0NSB7Ci0gICAgICAgICAgICBuYW1lICAgICBrZXlib2FyZAotICAgICAgICAgICAgeCAgICAgICAgOTgKLSAgICAgICAgICAgIHkgICAgICAgIDU1NgotICAgICAgICB9Ci0gICAgfQotfQotCi1rZXlib2FyZCB7Ci0gICAgY2hhcm1hcCBxd2VydHkyCi19Ci0KLW5ldHdvcmsgewotICAgIHNwZWVkICBmdWxsCi0gICAgZGVsYXkgIG5vbmUKLX0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvc2VsZWN0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvc2VsZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNjVkMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODAwL3NlbGVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODAwL3NwYWNlYmFyLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvc3BhY2ViYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ1OWJkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAvc3BhY2ViYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9hcnJvd19kb3duLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYXJyb3dfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmRlMjIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9hcnJvd19kb3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYXJyb3dfbGVmdC5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODU0L2Fycm93X2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFiMTkyLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYXJyb3dfbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2Fycm93X3JpZ2h0LnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYXJyb3dfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JjNjVkLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYXJyb3dfcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9hcnJvd191cC5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODU0L2Fycm93X3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNzEyMS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2Fycm93X3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYmFja2dyb3VuZF9sYW5kLnBuZyBiL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYmFja2dyb3VuZF9sYW5kLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwZjkwZS4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2JhY2tncm91bmRfbGFuZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2JhY2tncm91bmRfcG9ydC5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODU0L2JhY2tncm91bmRfcG9ydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWJmNjcuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9iYWNrZ3JvdW5kX3BvcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9idXR0b24ucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9idXR0b24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZDIwLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvY29udHJvbHMucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9jb250cm9scy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1ZTIuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9jb250cm9scy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2hhcmR3YXJlLmluaSBiL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvaGFyZHdhcmUuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVjOTE1Li4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvaGFyZHdhcmUuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHNraW4tc3BlY2lmaWMgaGFyZHdhcmUgdmFsdWVzCi1ody5sY2QuZGVuc2l0eT0yNDAKLXZtLmhlYXBTaXplPTI0CmRpZmYgLS1naXQgYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2tleS5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODU0L2tleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjAzYmYuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9rZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9rZXlib2FyZC5wbmcgYi9lbXVsYXRvci9za2lucy9XVkdBODU0L2tleWJvYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0OWRjZi4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci9za2lucy9XVkdBODU0L2tleWJvYXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvbGF5b3V0IGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9sYXlvdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODZkZGMuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9sYXlvdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotcGFydHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGJhY2tncm91bmRfcG9ydC5wbmcKLSAgICAgICAgfQotICAgIH0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9sYW5kLnBuZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGV2aWNlIHsKLSAgICAgICAgZGlzcGxheSB7Ci0gICAgICAgICAgICB3aWR0aCAgIDQ4MAotICAgICAgICAgICAgaGVpZ2h0ICA4NTQKLSAgICAgICAgICAgIHggICAgICAgMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY29udHJvbHMgewotICAgICAgICBiYWNrZ3JvdW5kIHsKLSAgICAgICAgICAgIGltYWdlICAgY29udHJvbHMucG5nCi0gICAgICAgIH0KLSAgICAgICAgYnV0dG9ucyB7Ci0gICAgICAgICAgICBzb2Z0LWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNTYKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhvbWUgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMAotICAgICAgICAgICAgICAgICAgICB5IDE0MgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFjayB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAxNDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtdXAgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd191cC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCA3NwotICAgICAgICAgICAgICAgICAgICB5IDUzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWRvd24gewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19kb3duLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDc3Ci0gICAgICAgICAgICAgICAgICAgIHkgMTA2Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcGFkLWxlZnQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19sZWZ0LnBuZwotICAgICAgICAgICAgICAgICAgICB4IDUzCi0gICAgICAgICAgICAgICAgICAgIHkgNTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwYWQtcmlnaHQgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBhcnJvd19yaWdodC5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMjMKLSAgICAgICAgICAgICAgICAgICAgeSA1MwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHBhZC1jZW50ZXIgewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBzZWxlY3QucG5nCi0gICAgICAgICAgICAgICAgICAgIHggNzcKLSAgICAgICAgICAgICAgICAgICAgeSA4MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGhvbmUtZGlhbCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAwCi0gICAgICAgICAgICAgICAgICAgIHkgNzEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBob25lLWhhbmd1cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSA3MQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3dlciB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxNjgKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS11cCB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlIGJ1dHRvbi5wbmcKLSAgICAgICAgICAgICAgICAgICAgeCAxMTIKLSAgICAgICAgICAgICAgICAgICAgeSAwCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvbHVtZS1kb3duIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UgYnV0dG9uLnBuZwotICAgICAgICAgICAgICAgICAgICB4IDU2Ci0gICAgICAgICAgICAgICAgICAgIHkgMAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWFyY2ggewotICAgICAgICAgICAgICAgICAgICBpbWFnZSBidXR0b24ucG5nCi0gICAgICAgICAgICAgICAgICAgIHggMTY4Ci0gICAgICAgICAgICAgICAgICAgIHkgMTQyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGtleWJvYXJkIHsKLSAgICAgICAgYmFja2dyb3VuZCB7Ci0gICAgICAgICAgICBpbWFnZSAgIGtleWJvYXJkLnBuZwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbnMgewotICAgICAgICAgICAgMSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNQotICAgICAgICAgICAgfQotICAgICAgICAgICAgMiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSA1Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAzIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNzkKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxOTAKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDkgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMDEKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4ICA1Ci0gICAgICAgICAgICAgICAgeSAgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHcgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0IHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHUgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA0MQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbyB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNDEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDQxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGEgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAgNQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA0MgotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxMTYKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTUzCi0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGogewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyMjcKLSAgICAgICAgICAgICAgICB5IDc3Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSA3NwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMwMQotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFTCB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDMzOAotICAgICAgICAgICAgICAgIHkgNzcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0FQIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDQyCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHYgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAxNTMKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYiB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIGtleS5wbmcKLSAgICAgICAgICAgICAgICB4IDE5MAotICAgICAgICAgICAgICAgIHkgMTEzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjI3Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0gewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAyNjQKLSAgICAgICAgICAgICAgICB5IDExMwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUEVSSU9EIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVOVEVSIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzM4Ci0gICAgICAgICAgICAgICAgeSAxMTMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxUIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggIDUKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU1lNIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggNDIKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVQgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCA3OQotICAgICAgICAgICAgICAgIHkgMTQ5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTUEFDRSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2UgIHNwYWNlYmFyLnBuZwotICAgICAgICAgICAgICAgIHggMTE2Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMQVNIIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMjY0Ci0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENPTU1BIHsKLSAgICAgICAgICAgICAgICBpbWFnZSAga2V5LnBuZwotICAgICAgICAgICAgICAgIHggMzAxCi0gICAgICAgICAgICAgICAgeSAxNDkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMVDIgewotICAgICAgICAgICAgICAgIGltYWdlICBrZXkucG5nCi0gICAgICAgICAgICAgICAgeCAzMzgKLSAgICAgICAgICAgICAgICB5IDE0OQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWxheW91dHMgewotICAgIHBvcnRyYWl0IHsKLSAgICAgICAgd2lkdGggICAgIDk1MAotICAgICAgICBoZWlnaHQgICAgOTA4Ci0gICAgICAgIGNvbG9yICAgICAweGUwZTBlMAotICAgICAgICBldmVudCAgICAgRVZfU1c6MDoxCi0gICAgICAgIAotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDAKLSAgICAgICAgICAgIHkgICAgICAgMAotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDIgewotICAgICAgICAgICAgbmFtZSAgICBsYW5kc2NhcGUKLSAgICAgICAgICAgIHggICAgICAgMTAwMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MyB7Ci0gICAgICAgICAgICBuYW1lICAgIGRldmljZQotICAgICAgICAgICAgeCAgICAgICAyNwotICAgICAgICAgICAgeSAgICAgICAyNwotICAgICAgICB9Ci0gICAgICAgIHBhcnQ0IHsKLSAgICAgICAgICAgIG5hbWUgICAgY29udHJvbHMKLSAgICAgICAgICAgIHggICAgICAgNjM1Ci0gICAgICAgICAgICB5ICAgICAgIDIzNAotICAgICAgICB9Ci0gICAgICAgIHBhcnQ1IHsKLSAgICAgICAgICAgIG5hbWUgICAga2V5Ym9hcmQKLSAgICAgICAgICAgIHggICAgICAgNTU0Ci0gICAgICAgICAgICB5ICAgICAgIDQ4NgotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBsYW5kc2NhcGUgewotICAgICAgICB3aWR0aCAgICAgOTA3Ci0gICAgICAgIGhlaWdodCAgICA3NjEKLSAgICAgICAgY29sb3IgICAgIDB4ZTBlMGUwCi0gICAgICAgIGV2ZW50ICAgICBFVl9TVzowOjAKLQotICAgICAgICBkcGFkLXJvdGF0aW9uIDMKLQotICAgICAgICBwYXJ0MSB7Ci0gICAgICAgICAgICBuYW1lICAgIHBvcnRyYWl0Ci0gICAgICAgICAgICB4ICAgICAgIDkwMAotICAgICAgICAgICAgeSAgICAgICAwCi0gICAgICAgIH0KLQotICAgICAgICBwYXJ0MiB7Ci0gICAgICAgICAgICBuYW1lICAgIGxhbmRzY2FwZQotICAgICAgICAgICAgeCAgICAgICAwCi0gICAgICAgICAgICB5ICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQzIHsKLSAgICAgICAgICAgIG5hbWUgICAgICBkZXZpY2UKLSAgICAgICAgICAgIHggICAgICAgICAyNgotICAgICAgICAgICAgeSAgICAgICAgIDUwOQotICAgICAgICAgICAgcm90YXRpb24gIDMKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnQ0IHsKLSAgICAgICAgICAgIG5hbWUgICAgIGNvbnRyb2xzCi0gICAgICAgICAgICB4ICAgICAgICA1NjcKLSAgICAgICAgICAgIHkgICAgICAgIDU1NgotICAgICAgICB9Ci0KLSAgICAgICAgcGFydDUgewotICAgICAgICAgICAgbmFtZSAgICAga2V5Ym9hcmQKLSAgICAgICAgICAgIHggICAgICAgIDEyNgotICAgICAgICAgICAgeSAgICAgICAgNTU2Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWtleWJvYXJkIHsKLSAgICBjaGFybWFwIHF3ZXJ0eTIKLX0KLQotbmV0d29yayB7Ci0gICAgc3BlZWQgIGZ1bGwKLSAgICBkZWxheSAgbm9uZQotfQpkaWZmIC0tZ2l0IGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9zZWxlY3QucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9zZWxlY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGE2NWQzLi4wMDAwMDAwCi0tLSBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvc2VsZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQvc3BhY2ViYXIucG5nIGIvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9zcGFjZWJhci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDU5YmQuLjAwMDAwMDAKLS0tIGEvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NC9zcGFjZWJhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lbXVsYXRvci90b29scy9BbmRyb2lkLm1rIGIvZW11bGF0b3IvdG9vbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkOTYxMy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci90b29scy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyB0aGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCBlbXVsYXRvci1zcGVjaWZpYyBwcm9ncmFtIHRvb2xzCi0jIHRoYXQgc2hvdWxkIG9ubHkgcnVuIGluIHRoZSBlbXVsYXRvci4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pZm5lcSAoJChUQVJHRVRfUFJPRFVDVCksc2ltKQotCi0jIFRoZSAncWVtdS1wcm9wcycgcHJvZ3JhbSBpcyBydW4gZnJvbSAvc3lzdGVtL2V0Yy9pbml0LmdvbGRmaXNoLnJjCi0jIHRvIHNldHVwIHZhcmlvdXMgc3lzdGVtIHByb3BlcnRpZXMgc2VudCBieSB0aGUgZW11bGF0b3IgcHJvZ3JhbS4KLSMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFICAgIDo9IHFlbXUtcHJvcHMKLUxPQ0FMX1NSQ19GSUxFUyA6PSBxZW11LXByb3BzLmMKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzCi0jIHdlIGRvbid0IHdhbnQgdGhpcyBpbiAndXNlcicgYnVpbGRzIHdoaWNoIGRvbid0IGhhdmUKLSMgZW11bGF0b3Itc3BlY2lmaWMgYmluYXJpZXMuCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZwotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWVuZGlmICMgVEFSR0VUX1BST0RVQ1QgIT0gc2ltCi0KZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3Rvb2xzL3FlbXUtcHJvcHMuYyBiL2VtdWxhdG9yL3Rvb2xzL3FlbXUtcHJvcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxMDVmYy4uMDAwMDAwMAotLS0gYS9lbXVsYXRvci90b29scy9xZW11LXByb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qIHRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIHJlYWQgYSBzZXQgb2Ygc3lzdGVtIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcwotICogZnJvbSB0aGUgZW11bGF0b3IgcHJvZ3JhbSBhbmQgc2V0IHRoZW0gaW4gdGhlIGN1cnJlbnRseS1ydW5uaW5nIGVtdWxhdGVkCi0gKiBzeXN0ZW0uIEl0IGRvZXMgc28gYnkgY29ubmVjdGluZyB0byB0aGUgJ2Jvb3QtcHJvcGVydGllcycgcWVtdWQgc2VydmljZS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gc2hvdWxkIGJlIHJ1biBhcyByb290IGFuZCBjYWxsZWQgZnJvbQotICogL3N5c3RlbS9ldGMvaW5pdC5nb2xkZmlzaC5yYyBleGNsdXNpdmVseS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgICJxZW11LXByb3BzIgotCi0jZGVmaW5lIERFQlVHICAxCi0KLSNpZiBERUJVRwotIyAgaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotIyAgZGVmaW5lICBERCguLi4pICAgIExPR0koX19WQV9BUkdTX18pCi0jZWxzZQotIyAgZGVmaW5lICBERCguLi4pICAgICgodm9pZCkwKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3FlbXVkLmg+Ci0KLS8qIE5hbWUgb2YgdGhlIHFlbXVkIHNlcnZpY2Ugd2Ugd2FudCB0byBjb25uZWN0IHRvLgotICovCi0jZGVmaW5lICBRRU1VRF9TRVJWSUNFICAiYm9vdC1wcm9wZXJ0aWVzIgotCi0jZGVmaW5lICBNQVhfVFJJRVMgICAgICA1Ci0KLWludCAgbWFpbih2b2lkKQotewotICAgIGludCAgcWVtdWRfZmQsIGNvdW50ID0gMDsKLQotICAgIC8qIHRyeSB0byBjb25uZWN0IHRvIHRoZSBxZW11ZCBzZXJ2aWNlICovCi0gICAgewotICAgICAgICBpbnQgIHRyaWVzID0gTUFYX1RSSUVTOwotCi0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBxZW11ZF9mZCA9IHFlbXVkX2NoYW5uZWxfb3BlbiggImJvb3QtcHJvcGVydGllcyIgKTsKLSAgICAgICAgICAgIGlmIChxZW11ZF9mZCA+PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAoLS10cmllcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgREQoIkNvdWxkIG5vdCBjb25uZWN0IGFmdGVyIHRvbyBtYW55IHRyaWVzLiBBYm9ydGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBERCgid2FpdGluZyAxcyB0byB3YWl0IGZvciBxZW11ZC4iKTsKLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgREQoImNvbm5lY3RlZCB0byAnJXMnIHFlbXVkIHNlcnZpY2UuIiwgUUVNVURfU0VSVklDRSk7Ci0KLSAgICAvKiBzZW5kIHRoZSAnbGlzdCcgY29tbWFuZCB0byB0aGUgc2VydmljZSAqLwotICAgIGlmIChxZW11ZF9jaGFubmVsX3NlbmQocWVtdWRfZmQsICJsaXN0IiwgLTEpIDwgMCkgewotICAgICAgICBERCgiY291bGQgbm90IHNlbmQgY29tbWFuZCB0byAnJXMnIHNlcnZpY2UiLCBRRU1VRF9TRVJWSUNFKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogcmVhZCBlYWNoIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIHNpbmdsZSBsaW5lIGZyb20gdGhlIHNlcnZpY2UsCi0gICAgICogdW50aWwgZXhoYXVzdGlvbi4KLSAgICAgKi8KLSAgICBmb3IgKDs7KQotICAgIHsKLSNkZWZpbmUgIEJVRkZfU0laRSAgIChQUk9QRVJUWV9LRVlfTUFYICsgUFJPUEVSVFlfVkFMVUVfTUFYICsgMikKLQotICAgICAgICBjaGFyKiBxOwotICAgICAgICBjaGFyICB0ZW1wW0JVRkZfU0laRV07Ci0gICAgICAgIGludCAgIGxlbiA9IHFlbXVkX2NoYW5uZWxfcmVjdihxZW11ZF9mZCwgdGVtcCwgc2l6ZW9mIHRlbXAgLSAxKTsKLQotICAgICAgICBpZiAobGVuIDwgMCB8fCBsZW4gPiBCVUZGX1NJWkUtMSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHRlbXBbbGVuXSA9ICdcMCc7ICAvKiB6ZXJvLXRlcm1pbmF0ZSBzdHJpbmcgKi8KLQotICAgICAgICBERCgicmVjZWl2ZWQ6ICUuKnMiLCBsZW4sIHRlbXApOwotCi0gICAgICAgIC8qIHNlcGFyYXRlIHByb3BlcnkgbmFtZSBmcm9tIHZhbHVlICovCi0gICAgICAgIHEgPSBzdHJjaHIodGVtcCwgJz0nKTsKLSAgICAgICAgaWYgKHEgPT0gTlVMTCkgewotICAgICAgICAgICAgREQoImludmFsaWQgZm9ybWF0LCBpZ25vcmVkLiIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgKnErKyA9ICdcMCc7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5X3NldCh0ZW1wLCBxKSA8IDApIHsKLSAgICAgICAgICAgIEREKCJjb3VsZCBub3Qgc2V0IHByb3BlcnR5ICclcycgdG8gJyVzJyIsIHRlbXAsIHEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQgKz0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGZpbmFsbHksIGNsb3NlIHRoZSBjaGFubmVsIGFuZCBleGl0ICovCi0gICAgY2xvc2UocWVtdWRfZmQpOwotICAgIEREKCJleGl0aW5nICglZCBwcm9wZXJ0aWVzIHNldCkuIiwgY291bnQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbmRrL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMubWsgYi9uZGsvYnVpbGQvY29yZS9kZWZpbml0aW9ucy5tawppbmRleCA5NWJhYjY3Li5hZTliNTQwIDEwMDY0NAotLS0gYS9uZGsvYnVpbGQvY29yZS9kZWZpbml0aW9ucy5taworKysgYi9uZGsvYnVpbGQvY29yZS9kZWZpbml0aW9ucy5tawpAQCAtMjYyLDcgKzI2Miw3IEBACiAKICMgdGhlIGxpc3Qgb2YgdmFyaWFibGVzIHRoYXQgKm1heSogYmUgZGVmaW5lZCBpbiBBcHBsaWNhdGlvbi5tayBmaWxlcwogTkRLX0FQUF9WQVJTX09QVElPTkFMIDo9IEFQUF9PUFRJTSBBUFBfQ1BQRkxBR1MgQVBQX0NGTEFHUyBBUFBfQ1hYRkxBR1MgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEFQUF9QTEFURk9STSBBUFBfQlVJTERfU0NSSVBUCisgICAgICAgICAgICAgICAgICAgICAgICAgQVBQX1BMQVRGT1JNIEFQUF9CVUlMRF9TQ1JJUFQgQVBQX0FCSQogCiAjIHRoZSBsaXN0IG9mIGFsbCB2YXJpYWJsZXMgdGhhdCBtYXkgYXBwZWFyIGluIGFuIEFwcGxpY2F0aW9uLm1rIGZpbGUKIE5ES19BUFBfVkFSUyA6PSAkKE5ES19BUFBfVkFSU19SRVFVSVJFRCkgJChOREtfQVBQX1ZBUlNfT1BUSU9OQUwpCmRpZmYgLS1naXQgYS9uZGsvYnVpbGQvY29yZS9tYWluLm1rIGIvbmRrL2J1aWxkL2NvcmUvbWFpbi5tawppbmRleCA5MWZmYjcxLi4xYzM0NDJhIDEwMDY0NAotLS0gYS9uZGsvYnVpbGQvY29yZS9tYWluLm1rCisrKyBiL25kay9idWlsZC9jb3JlL21haW4ubWsKQEAgLTgzLDEzICs4MywzMSBAQAogICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYWRkLXRvb2xjaGFpbi5taylcCiApCiAKLSMkKGluZm8gQUxMX1RPT0xDSEFJTlM9JChBTExfVE9PTENIQUlOUykpCi1OREtfVEFSR0VUX1RPT0xDSEFJTiA6PSAkKGZpcnN0d29yZCAkKE5ES19BTExfVE9PTENIQUlOUykpCi0kKGNhbGwgbmRrX2xvZywgRGVmYXVsdCB0b29sY2hhaW4gaXMgJChOREtfVEFSR0VUX1RPT0xDSEFJTikpCi0KIE5ES19BTExfVE9PTENIQUlOUyAgIDo9ICQoY2FsbCB1bmlxLCQoTkRLX0FMTF9UT09MQ0hBSU5TKSkKIE5ES19BTExfQUJJUyAgICAgICAgIDo9ICQoY2FsbCB1bmlxLCQoTkRLX0FMTF9BQklTKSkKIAorIyBUaGUgZGVmYXVsdCB0b29sY2hhaW4gaXMgbm93IGFybS1lYWJpLTQuNC4wLCBob3dldmVyIGl0cworIyBDKysgY29tcGlsZXIgaXMgYSB0YWQgYml0IG1vcmUgcGVkYW50aWMgd2l0aCBjZXJ0YWluCisjIGNvbnN0cnVjdHMgKGUuZy4gdGVtcGxhdGVzKSBzbyBhbGxvdyB1c2VycyB0byBzd2l0Y2ggYmFjaworIyB0byB0aGUgb2xkIDQuMi4xIGluc3RlYWQgaWYgdGhleSByZWFsbHkgd2FudCB0by4KKyMKKyMgTk9URTogeW91IHdvbid0IGdldCBhcm1lYWJpLXY3YSBzdXBwb3J0IHRob3VnaCAhCisjCitOREtfVE9PTENIQUlOIDo9ICQoc3RyaXAgJChOREtfVE9PTENIQUlOKSkKK2lmbmRlZiBOREtfVE9PTENIQUlOCisgICAgTkRLX1RBUkdFVF9UT09MQ0hBSU4gOj0gYXJtLWVhYmktNC40LjAKKyAgICAkKGNhbGwgbmRrX2xvZywgRGVmYXVsdCB0b29sY2hhaW4gaXMgJChOREtfVEFSR0VUX1RPT0xDSEFJTikpCitlbHNlCisgICAgIyBjaGVjayB0aGF0IHRoZSB0b29sY2hhaW4gbmFtZSBpcyBzdXBwb3J0ZWQKKyAgICAkKGlmICQoZmlsdGVyLW91dCAkKE5ES19BTExfVE9PTENIQUlOUyksJChOREtfVE9PTENIQUlOKSksXAorICAgICAgJChjYWxsIF9fbmRrX2luZm8sTkRLX1RPT0xDSEFJTiBpcyBkZWZpbmVkIHRvIHRoZSB1bnN1cHBvcnRlZCB2YWx1ZSAkKE5ES19UT09MQ0hBSU4pKSBcCisgICAgICAkKGNhbGwgX19uZGtfaW5mbyxQbGVhc2UgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogJChOREtfQUxMX1RPT0xDSEFJTlMpKVwKKyAgICAgICQoY2FsbCBfX25ka19lcnJvcixBYm9ydGluZylcCisgICAgLCkKKyAgICBOREtfVEFSR0VUX1RPT0xDSEFJTj0kKE5ES19UT09MQ0hBSU4pCisgICAgJChjYWxsIG5ka19sb2csIFVzaW5nIHNwZWNpZmljIHRvb2xjaGFpbiAkKE5ES19UQVJHRVRfVE9PTENIQUlOKSkKK2VuZGlmCisKICQoY2FsbCBuZGtfbG9nLCBUaGlzIE5ESyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHRvb2xjaGFpbnMgYW5kIHRhcmdldCBBQklzOikKICQoZm9yZWFjaCB0YywkKE5ES19BTExfVE9PTENIQUlOUyksXAogICAgICQoY2FsbCBuZGtfbG9nLCAkKHNwYWNlKSQoc3BhY2UpJCh0Yyk6ICAkKE5ES19UT09MQ0hBSU4uJCh0YykuYWJpcykpXApkaWZmIC0tZ2l0IGEvbmRrL2J1aWxkL2NvcmUvc2V0dXAtYWJpLm1rIGIvbmRrL2J1aWxkL2NvcmUvc2V0dXAtYWJpLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NDg4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvYnVpbGQvY29yZS9zZXR1cC1hYmkubWsKQEAgLTAsMCArMSwyOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMgYnkgYnVpbGQvY29yZS9zZXR1cC1hcHAubWsKKyMKKworJChjYWxsIG5ka19sb2csQnVpbGRpbmcgYXBwbGljYXRpb24gJyQoTkRLX0FQUF9OQU1FKScgZm9yIEFCSSAnJChUQVJHRVRfQVJDSF9BQkkpJykKKworVEFSR0VUX0FSQ0ggOj0gYXJtCisKK1RBUkdFVF9PVVQgIDo9ICQoTkRLX0FQUF9PVVQpLyQoX2FwcCkvJChUQVJHRVRfQVJDSF9BQkkpCitUQVJHRVRfT0JKUyA6PSAkKFRBUkdFVF9PVVQpL29ianMKKworVEFSR0VUX0dEQl9TRVRVUCA6PSAkKFRBUkdFVF9PVVQpL3NldHVwLmdkYgorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zZXR1cC10b29sY2hhaW4ubWsKZGlmZiAtLWdpdCBhL25kay9idWlsZC9jb3JlL3NldHVwLWFwcC5tayBiL25kay9idWlsZC9jb3JlL3NldHVwLWFwcC5tawppbmRleCA4NTEzNDgyLi5kODM1ZTZmIDEwMDY0NAotLS0gYS9uZGsvYnVpbGQvY29yZS9zZXR1cC1hcHAubWsKKysrIGIvbmRrL2J1aWxkL2NvcmUvc2V0dXAtYXBwLm1rCkBAIC0yMSwyMSArMjEsNiBAQAogCiBfbWFwIDo9IE5ES19BUFAuJChfYXBwKQogCi0jIHdoaWNoIHBsYXRmb3JtL2FiaS90b29sY2hhaW4gYXJlIHdlIGdvaW5nIHRvIHVzZT8KLVRBUkdFVF9QTEFURk9STSA6PSAkKGNhbGwgZ2V0LCQoX21hcCksQVBQX1BMQVRGT1JNKQotVEFSR0VUX0FSQ0hfQUJJICA6PSBhcm0KLVRBUkdFVF9BUkNIICAgICAgOj0gYXJtCi1UQVJHRVRfVE9PTENIQUlOIDo9ICQoTkRLX1RBUkdFVF9UT09MQ0hBSU4pCi0KLSMgdGhlIGxvY2F0aW9uIG9mIGdlbmVyYXRlZCBmaWxlcyBmb3IgdGhpcyBhcHAKLUhPU1RfT1VUICAgIDo9ICQoTkRLX0FQUF9PVVQpLyQoX2FwcCkvJChIT1NUX1RBRykKLUhPU1RfT0JKUyAgIDo9ICQoSE9TVF9PVVQpL29ianMKLQotVEFSR0VUX09VVCAgOj0gJChOREtfQVBQX09VVCkvJChfYXBwKS8kKFRBUkdFVF9BQkkpCi1UQVJHRVRfT0JKUyA6PSAkKFRBUkdFVF9PVVQpL29ianMKLQotVEFSR0VUX0dEQl9TRVRVUCA6PSAkKFRBUkdFVF9PVVQpL3NldHVwLmdkYgotCiAjIG9rLCBsZXQncyBwYXJzZSBhbGwgQW5kcm9pZC5tayBzb3VyY2UgZmlsZXMgaW4gb3JkZXIgdG8gYnVpbGQKICMgdGhlIG1vZHVsZXMgZm9yIHRoaXMgYXBwLgogIwpAQCAtNjIsNCArNDcsMzMgQEAKIG5kay1hcHAtJChfYXBwKTogJChOREtfQVBQX01PRFVMRVMpCiBhbGw6IG5kay1hcHAtJChfYXBwKQogCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zZXR1cC10b29sY2hhaW4ubWsKKyMgd2hpY2ggcGxhdGZvcm0vYWJpL3Rvb2xjaGFpbiBhcmUgd2UgZ29pbmcgdG8gdXNlPworVEFSR0VUX1BMQVRGT1JNIDo9ICQoY2FsbCBnZXQsJChfbWFwKSxBUFBfUExBVEZPUk0pCisKKyMgdGhlIGxvY2F0aW9uIG9mIGdlbmVyYXRlZCBmaWxlcyBmb3IgdGhpcyBhcHAKK0hPU1RfT1VUICAgIDo9ICQoTkRLX0FQUF9PVVQpLyQoX2FwcCkvJChIT1NUX1RBRykKK0hPU1RfT0JKUyAgIDo9ICQoSE9TVF9PVVQpL29ianMKKworIyB0aGUgdGFyZ2V0IHRvIHVzZQorVEFSR0VUX1RPT0xDSEFJTiA6PSAkKE5ES19UQVJHRVRfVE9PTENIQUlOKQorCitBUFBfQUJJIDo9ICQoc3RyaXAgJChBUFBfQUJJKSkKK2lmbmRlZiBBUFBfQUJJCisgICAgIyB0aGUgZGVmYXVsdCBBQkkgZm9yIG5vdyBpcyBhcm1lYWJpCisgICAgQVBQX0FCSSA6PSBhcm1lYWJpCitlbmRpZgorCisjIGNoZWNrIHRoZSB0YXJnZXQgQUJJcyBmb3IgdGhpcyBhcHBsaWNhdGlvbgorX2JhZF9hYmlzID0gJChzdHJpcCAkKGZpbHRlci1vdXQgJChOREtfQUxMX0FCSVMpLCQoQVBQX0FCSSkpKQoraWZuZXEgKCQoX2JhZF9hYmlzKSwpCisgICAgJChpbmZvIF9iYWRfYWJpcyA9ICckKF9iYWRfYWJpcyknKQorICAgICQoY2FsbCBfX25ka19pbmZvLE5ESyBBcHBsaWNhdGlvbiAnJChfYXBwKScgdGFyZ2V0cyB1bmtub3duIEFCSShzKTogJChfYmFkX2FiaXMpKQorICAgICQoY2FsbCBfX25ka19pbmZvLFBsZWFzZSBmaXggdGhlIEFQUF9BQkkgZGVmaW5pdGlvbiBpbiAkKE5ES19BUFBfQVBQTElDQVRJT05fTUspKQorICAgICQoY2FsbCBfX25ka19lcnJvcixBYm9ydGluZykKK2VuZGlmCisKKyQoZm9yZWFjaCBfYWJpLCQoQVBQX0FCSSksXAorICAgICQoZXZhbCBUQVJHRVRfQVJDSF9BQkkgOj0gJChfYWJpKSlcCisgICAgJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3NldHVwLWFiaS5taykgXAorKQorCmRpZmYgLS1naXQgYS9uZGsvYnVpbGQvY29yZS9zZXR1cC10b29sY2hhaW4ubWsgYi9uZGsvYnVpbGQvY29yZS9zZXR1cC10b29sY2hhaW4ubWsKaW5kZXggMzUyNTg1ZS4uZTVkNGU4MiAxMDA2NDQKLS0tIGEvbmRrL2J1aWxkL2NvcmUvc2V0dXAtdG9vbGNoYWluLm1rCisrKyBiL25kay9idWlsZC9jb3JlL3NldHVwLXRvb2xjaGFpbi5tawpAQCAtMTMsMTMgKzEzLDIxIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCByZXBlYXRlZGx5IGZyb20gYnVpbGQvY29yZS9tYWluLm1rIGFuZCBpcyB1c2VkCisjIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCByZXBlYXRlZGx5IGZyb20gYnVpbGQvY29yZS9zZXR1cC1hYmkubWsgYW5kIGlzIHVzZWQKICMgdG8gc2V0dXAgdGhlIHRhcmdldCB0b29sY2hhaW4gZm9yIGEgZ2l2ZW4gcGxhdGZvcm0vYWJpIGNvbWJpbmF0aW9uLgogIwogCiAkKGNhbGwgYXNzZXJ0LWRlZmluZWQsVEFSR0VUX1RPT0xDSEFJTiBUQVJHRVRfUExBVEZPUk0gVEFSR0VUX0FSQ0ggVEFSR0VUX0FSQ0hfQUJJKQogJChjYWxsIGFzc2VydC1kZWZpbmVkLE5ES19BUFBTKQogCisjIENoZWNrIHRoYXQgdGhlIHRvb2xjaGFpbiBzdXBwb3J0cyB0aGUgY3VycmVudCBBQkkKKyQoaWYgJChmaWx0ZXItb3V0ICQoTkRLX1RPT0xDSEFJTi4kKE5ES19UQVJHRVRfVE9PTENIQUlOKS5hYmlzKSwkKFRBUkdFVF9BUkNIX0FCSSkpLFwKKyAgICAkKGNhbGwgX19uZGtfaW5mbyxUaGUgJChOREtfVEFSR0VUX1RPT0xDSEFJTikgdG9vbGNoYWluIGRvZXMgbm90IHN1cHBvcnQgdGhlICQoVEFSR0VUX0FSQ0hfQUJJKSBBQkkuKVwKKyAgICAkKGNhbGwgX19uZGtfaW5mbyxQbGVhc2UgbW9kaWZ5IHRoZSBBUFBfQUJJIGRlZmluaXRpb24gaW4gJChOREtfQVBQX0FQUExJQ0FUSU9OX01LKSB0byBmaXggdGhpcylcCisgICAgJChjYWxsIF9fbmRrX2luZm8sVmFsaWQgQUJJcyB2YWx1ZXMgZm9yICQoTkRLX1RBUkdFVF9UT09MQ0hBSU4pIGFyZTogJChOREtfVEFSR0VUX1RPT0xDSEFJTi4kKE5ES19UT09MQ0hBSU4pLmFiaXMpKVwKKyAgICAkKGNhbGwgX19uZGtfZXJyb3IsQWJvcnRpbmcpXAorLCkKKwogVEFSR0VUX0FCSSA6PSAkKFRBUkdFVF9QTEFURk9STSktJChUQVJHRVRfQVJDSF9BQkkpCiAKICMgc2V0dXAgc3lzcm9vdC1yZWxhdGVkIHZhcmlhYmxlcy4gVGhlIFNZU1JPT1QgcG9pbnQgdG8gYSBkaXJlY3RvcnkKQEAgLTI3LDcgKzM1LDcgQEAKICMgc29tZSBsaWJyYXJpZXMgYW5kIG9iamVjdCBmaWxlcyB1c2VkIGZvciBsaW5raW5nIHRoZSBnZW5lcmF0ZWQKICMgdGFyZ2V0IGZpbGVzIHByb3Blcmx5LgogIwotU1lTUk9PVCA6PSBidWlsZC9wbGF0Zm9ybXMvJChUQVJHRVRfUExBVEZPUk0pL2FyY2gtJChUQVJHRVRfQVJDSF9BQkkpCitTWVNST09UIDo9IGJ1aWxkL3BsYXRmb3Jtcy8kKFRBUkdFVF9QTEFURk9STSkvYXJjaC0kKFRBUkdFVF9BUkNIKQogCiBUQVJHRVRfQ1JUQkVHSU5fU1RBVElDX08gIDo9ICQoU1lTUk9PVCkvdXNyL2xpYi9jcnRiZWdpbl9zdGF0aWMubwogVEFSR0VUX0NSVEJFR0lOX0RZTkFNSUNfTyA6PSAkKFNZU1JPT1QpL3Vzci9saWIvY3J0YmVnaW5fZHluYW1pYy5vCkBAIC00MCw3ICs0OCw3IEBACiBpbmNsdWRlICQoTkRLX1RPT0xDSEFJTi4kKFRBUkdFVF9UT09MQ0hBSU4pLnNldHVwKQogCiAjIGNvbXB1dGUgTkRLX0FQUF9ERVNUIGFzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXMKLU5ES19BUFBfREVTVCA6PSAkKE5ES19BUFBfUFJPSkVDVF9QQVRIKS9saWJzLyQoVEFSR0VUX0FCSV9TVUJESVIpCitOREtfQVBQX0RFU1QgOj0gJChOREtfQVBQX1BST0pFQ1RfUEFUSCkvbGlicy8kKFRBUkdFVF9BUkNIX0FCSSkKIAogIyBmcmVlIHRoZSBkaWN0aW9uYXJ5IG9mIExPQ0FMX01PRFVMRSBkZWZpbml0aW9ucwogJChjYWxsIG1vZHVsZXMtY2xlYXIpCmRpZmYgLS1naXQgYS9uZGsvYnVpbGQvdG9vbGNoYWlucy9hcm0tZWFiaS00LjIuMS9jb25maWcubWsgYi9uZGsvYnVpbGQvdG9vbGNoYWlucy9hcm0tZWFiaS00LjIuMS9jb25maWcubWsKaW5kZXggMWI1Y2YwMi4uYzYyOTdjMiAxMDA2NDQKLS0tIGEvbmRrL2J1aWxkL3Rvb2xjaGFpbnMvYXJtLWVhYmktNC4yLjEvY29uZmlnLm1rCisrKyBiL25kay9idWlsZC90b29sY2hhaW5zL2FybS1lYWJpLTQuMi4xL2NvbmZpZy5tawpAQCAtMTYsNCArMTYsNCBAQAogIyBjb25maWcgZmlsZSBmb3IgdGhlIGFybS1lYWJpLTQuMi4xIHRvb2xjaGFpbiBmb3IgdGhlIEFuZHJvaWQgTkRLCiAjIHRoZSByZWFsIG1lYXQgaXMgaW4gdGhlIHNldHVwLm1rIGZpbGUgYWRqYWNlbnQgdG8gdGhpcyBvbmUKICMKLVRPT0xDSEFJTl9BQklTIDo9IGFybQorVE9PTENIQUlOX0FCSVMgOj0gYXJtZWFiaQpkaWZmIC0tZ2l0IGEvbmRrL2J1aWxkL3Rvb2xjaGFpbnMvYXJtLWVhYmktNC40LjAvY29uZmlnLm1rIGIvbmRrL2J1aWxkL3Rvb2xjaGFpbnMvYXJtLWVhYmktNC40LjAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTI4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvYnVpbGQvdG9vbGNoYWlucy9hcm0tZWFiaS00LjQuMC9jb25maWcubWsKQEAgLTAsMCArMSwxOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBjb25maWcgZmlsZSBmb3IgdGhlIGFybS1lYWJpLTQuNC4wIHRvb2xjaGFpbiBmb3IgdGhlIEFuZHJvaWQgTkRLCisjIHRoZSByZWFsIG1lYXQgaXMgaW4gdGhlIHNldHVwLm1rIGZpbGUgYWRqYWNlbnQgdG8gdGhpcyBvbmUKKyMKK1RPT0xDSEFJTl9BQklTIDo9IGFybWVhYmkgYXJtZWFiaS12N2EKZGlmZiAtLWdpdCBhL25kay9idWlsZC90b29sY2hhaW5zL2FybS1lYWJpLTQuNC4wL3NldHVwLm1rIGIvbmRrL2J1aWxkL3Rvb2xjaGFpbnMvYXJtLWVhYmktNC40LjAvc2V0dXAubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkZWVkNQotLS0gL2Rldi9udWxsCisrKyBiL25kay9idWlsZC90b29sY2hhaW5zL2FybS1lYWJpLTQuNC4wL3NldHVwLm1rCkBAIC0wLDAgKzEsMTM5IEBACisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyB1c2VkIHRvIHByZXBhcmUgdGhlIE5ESyB0byBidWlsZCB3aXRoIHRoZSBhcm0tZWFiaS00LjQuMAorIyB0b29sY2hhaW4gYW55IG51bWJlciBvZiBzb3VyY2UgZmlsZXMKKyMKKyMgaXRzIHB1cnBvc2UgaXMgdG8gZGVmaW5lIChvciByZS1kZWZpbmUpIHRlbXBsYXRlcyB1c2VkIHRvIGJ1aWxkCisjIHZhcmlvdXMgc291cmNlcyBpbnRvIHRhcmdldCBvYmplY3QgZmlsZXMsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmlsZSBtYXkgZW5kIHVwIGJlaW5nIHBhcnNlZCBzZXZlcmFsIHRpbWVzIGluIGZ1dHVyZQorIyByZXZpc2lvbnMgb2YgdGhlIE5ESy4KKyMKKworVE9PTENIQUlOX05BTUUgICA6PSBhcm0tZWFiaS00LjQuMAorVE9PTENIQUlOX1BSRUZJWCA6PSAkKEhPU1RfUFJFQlVJTFQpLyQoVE9PTENIQUlOX05BTUUpL2Jpbi9hcm0tZWFiaS0KKworVEFSR0VUX0NGTEFHUy5jb21tb24gOj0gXAorICAgIC1JJChTWVNST09UKS91c3IvaW5jbHVkZSBcCisgICAgLWZwaWMgXAorICAgIC1tdGh1bWItaW50ZXJ3b3JrIFwKKyAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zIFwKKyAgICAtZnVud2luZC10YWJsZXMgXAorICAgIC1mc3RhY2stcHJvdGVjdG9yIFwKKyAgICAtZm5vLXNob3J0LWVudW1zIFwKKyAgICAtRF9fQVJNX0FSQ0hfNV9fIC1EX19BUk1fQVJDSF81VF9fIFwKKyAgICAtRF9fQVJNX0FSQ0hfNUVfXyAtRF9fQVJNX0FSQ0hfNVRFX18gXAorCitpZmVxICgkKFRBUkdFVF9BUkNIX0FCSSksYXJtZWFiaS12N2EpCisgICAgVEFSR0VUX0FSQ0hfQ0ZMQUdTIDo9IC1tYXJjaD1hcm12Ny1hIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbWZsb2F0LWFiaT1zb2Z0ZnAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tZnB1PW5lb24KKyAgICBUQVJHRVRfQVJDSF9MREZMQUdTIDo9IC1XbCwtLWZpeC1jb3J0ZXgtYTgKK2Vsc2UKKyAgICBUQVJHRVRfQVJDSF9DRkxBR1MgOj0gLW1hcmNoPWFybXY1dGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tdHVuZT14c2NhbGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tc29mdC1mbG9hdAorICAgIFRBUkdFVF9BUkNIX0xERkxBR1MgOj0KK2VuZGlmCisKK1RBUkdFVF9hcm1fcmVsZWFzZV9DRkxBR1MgOj0gIC1PMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZnN0cmljdC1hbGlhc2luZyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZnVuc3dpdGNoLWxvb3BzICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZmlubGluZS1saW1pdD0zMDAKKworVEFSR0VUX3RodW1iX3JlbGVhc2VfQ0ZMQUdTIDo9IC1tdGh1bWIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1PcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZmlubGluZS1saW1pdD02NAorCisjIFdoZW4gYnVpbGRpbmcgZm9yIGRlYnVnLCBjb21waWxlIGV2ZXJ5dGhpbmcgYXMgYXJtLgorVEFSR0VUX2FybV9kZWJ1Z19DRkxBR1MgOj0gJChUQVJHRVRfYXJtX3JlbGVhc2VfQ0ZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtZm5vLXN0cmljdC1hbGlhc2luZworCitUQVJHRVRfdGh1bWJfZGVidWdfQ0ZMQUdTIDo9ICQoVEFSR0VUX3RodW1iX3JlbGVhc2VfQ0ZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tYXJtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKworVEFSR0VUX0NDICAgICAgIDo9ICQoVE9PTENIQUlOX1BSRUZJWClnY2MKK1RBUkdFVF9DRkxBR1MgICA6PSAkKFRBUkdFVF9DRkxBR1MuY29tbW9uKSAkKFRBUkdFVF9BUkNIX0NGTEFHUykKKworCitUQVJHRVRfQ1hYICAgICAgOj0gJChUT09MQ0hBSU5fUFJFRklYKWcrKworVEFSR0VUX0NYWEZMQUdTIDo9ICQoVEFSR0VUX0NGTEFHUy5jb21tb24pICQoVEFSR0VUX0FSQ0hfQ0ZMQUdTKSAtZm5vLWV4Y2VwdGlvbnMgLWZuby1ydHRpCisKK1RBUkdFVF9MRCAgICAgIDo9ICQoVE9PTENIQUlOX1BSRUZJWClsZAorVEFSR0VUX0xERkxBR1MgOj0gJChUQVJHRVRfQVJDSF9MREZMQUdTKQorCitUQVJHRVRfQVIgICAgICA6PSAkKFRPT0xDSEFJTl9QUkVGSVgpYXIKK1RBUkdFVF9BUkZMQUdTIDo9IGNycworCitUQVJHRVRfTElCR0NDIDo9ICQoc2hlbGwgJChUQVJHRVRfQ0MpIC1tdGh1bWItaW50ZXJ3b3JrIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQorVEFSR0VUX0xETElCUyA6PSAtV2wsLXJwYXRoLWxpbms9JChTWVNST09UKS91c3IvbGliCisKKyMgVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgYSBiaW5hcnkgZG9lc24ndCByZWZlcmVuY2UgdW5kZWZpbmVkCisjIGZsYWdzLgorVEFSR0VUX05PX1VOREVGSU5FRF9MREZMQUdTIDo9IC1XbCwtLW5vLXVuZGVmaW5lZAorCisjIE5PVEU6IEVuc3VyZSB0aGF0IFRBUkdFVF9MSUJHQ0MgaXMgcGxhY2VkIGFmdGVyIGFsbCBwcml2YXRlIG9iamVjdHMKKyMgICAgICAgYW5kIHN0YXRpYyBsaWJyYXJpZXMsIGJ1dCBiZWZvcmUgYW55IG90aGVyIGxpYnJhcnkgaW4gdGhlIGxpbmsKKyMgICAgICAgY29tbWFuZCBsaW5lIHdoZW4gZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcy4KKyMKKyMgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsIGxpYmdjYy5hIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgdGFyZ2V0CisjICAgICAgIHdpbGwgYmUgaW5jbHVkZWQgaW50byBpdCwgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHdoYXQncyBhdmFpbGFibGUKKyMgICAgICAgb24gb3RoZXIgbGlicmFyaWVzIGxpa2UgbGliYy5zbywgd2hpY2ggbWF5IGNoYW5nZSBiZXR3ZWVuIHN5c3RlbQorIyAgICAgICByZWxlYXNlcyBkdWUgdG8gdG9vbGNoYWluIG9yIGxpYnJhcnkgY2hhbmdlcy4KKyMKK2RlZmluZSBjbWQtYnVpbGQtc2hhcmVkLWxpYnJhcnkKKyQoVEFSR0VUX0NDKSBcCisgICAgLW5vc3RkbGliIC1XbCwtc29uYW1lLCQobm90ZGlyICRAKSBcCisgICAgLVdsLC1zaGFyZWQsLUJzeW1ib2xpYyBcCisgICAgJChQUklWQVRFX09CSkVDVFMpIFwKKyAgICAtV2wsLS13aG9sZS1hcmNoaXZlIFwKKyAgICAkKFBSSVZBVEVfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAgIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgXAorICAgICQoUFJJVkFURV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChUQVJHRVRfTElCR0NDKSBcCisgICAgJChQUklWQVRFX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAkKFBSSVZBVEVfTERGTEFHUykgXAorICAgICQoUFJJVkFURV9MRExJQlMpIFwKKyAgICAtbyAkQAorZW5kZWYKKworZGVmaW5lIGNtZC1idWlsZC1leGVjdXRhYmxlCiskKFRBUkdFVF9DQykgXAorICAgIC1ub3N0ZGxpYiAtQmR5bmFtaWMgXAorICAgIC1XbCwtZHluYW1pYy1saW5rZXIsL3N5c3RlbS9iaW4vbGlua2VyIFwKKyAgICAtV2wsLS1nYy1zZWN0aW9ucyBcCisgICAgLVdsLC16LG5vY29weXJlbG9jIFwKKyAgICAkKFRBUkdFVF9DUlRCRUdJTl9EWU5BTUlDX08pIFwKKyAgICAkKFBSSVZBVEVfT0JKRUNUUykgXAorICAgICQoUFJJVkFURV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChUQVJHRVRfTElCR0NDKSBcCisgICAgJChQUklWQVRFX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAkKFBSSVZBVEVfTERGTEFHUykgXAorICAgICQoUFJJVkFURV9MRExJQlMpIFwKKyAgICAkKFRBUkdFVF9DUlRFTkRfTykgXAorICAgIC1vICRACitlbmRlZgorCitkZWZpbmUgY21kLWJ1aWxkLXN0YXRpYy1saWJyYXJ5CiskKFRBUkdFVF9BUikgJChUQVJHRVRfQVJGTEFHUykgJEAgJChQUklWQVRFX09CSkVDVFMpCitlbmRlZgorCitjbWQtc3RyaXAgPSAkKFRPT0xDSEFJTl9QUkVGSVgpc3RyaXAgLS1zdHJpcC1kZWJ1ZyAkMQpkaWZmIC0tZ2l0IGEvbmRrL2J1aWxkL3Rvb2xzL2J1aWxkLXRvb2xjaGFpbi5zaCBiL25kay9idWlsZC90b29scy9idWlsZC10b29sY2hhaW4uc2gKaW5kZXggMWM2YjM5OC4uN2JlZDk5YSAxMDA3NTUKLS0tIGEvbmRrL2J1aWxkL3Rvb2xzL2J1aWxkLXRvb2xjaGFpbi5zaAorKysgYi9uZGsvYnVpbGQvdG9vbHMvYnVpbGQtdG9vbGNoYWluLnNoCkBAIC0yNiw2NSArMjYsOTYgQEAKICMgbnVtYmVyIG9mIGpvYnMgdG8gcnVuIGluIHBhcmFsbGVsIHdoZW4gcnVubmluZyBtYWtlCiBKT0JTPSRIT1NUX05VTV9DUFVTCiAKLVRPT0xDSEFJTl9OQU1FPWFybS1lYWJpLTQuMi4xCiBQTEFURk9STT1hbmRyb2lkLTMKIEFCST1hcm0KK0dDQ19WRVJTSU9OPTQuMi4xCitHREJfVkVSU0lPTj02LjYKK0JJTlVUSUxTX1ZFUlNJT049Mi4xNworUkVMRUFTRT1gZGF0ZSArJVklbSVkYAorQlVJTERfT1VUPWBta3RlbXAgLWQgL3RtcC9uZGstdG9vbGNoYWluLVhYWGAKIAogT1BUSU9OX0hFTFA9bm8KIE9QVElPTl9QTEFURk9STT0KIE9QVElPTl9GT1JDRV8zMj1ubwogT1BUSU9OX1JFQlVJTEQ9bm8KK09QVElPTl9HQ0NfVkVSU0lPTj0KK09QVElPTl9HREJfVkVSU0lPTj0KK09QVElPTl9QQUNLQUdFPQorT1BUSU9OX1JFTEVBU0U9CitPUFRJT05fQlVJTERfT1VUPQogCiBWRVJCT1NFPW5vCiBmb3Igb3B0IGRvCi0gIG9wdGFyZz1gZXhwciAieCRvcHQiIDogJ3hbXj1dKj1cKC4qXCknYAotICBjYXNlICIkb3B0IiBpbgotICAtLWhlbHB8LWh8LVw/KSBPUFRJT05fSEVMUD15ZXMKLSAgOzsKLSAgLS12ZXJib3NlKQotICAgIGlmIFsgIiRWRVJCT1NFIiA9ICJ5ZXMiIF0gOyB0aGVuCi0gICAgICAgIFZFUkJPU0UyPXllcwotICAgIGVsc2UKKyAgICBvcHRhcmc9YGV4cHIgIngkb3B0IiA6ICd4W149XSo9XCguKlwpJ2AKKyAgICBjYXNlICIkb3B0IiBpbgorICAgIC0taGVscHwtaHwtXD8pIE9QVElPTl9IRUxQPXllcworICAgIDs7CisgICAgLS12ZXJib3NlKQorICAgICAgICBpZiBbICIkVkVSQk9TRSIgPSAieWVzIiBdIDsgdGhlbgorICAgICAgICAgICAgVkVSQk9TRTI9eWVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFZFUkJPU0U9eWVzCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgLS1nY2MtdmVyc2lvbj0qKQorICAgICAgICBPUFRJT05fR0NDX1ZFUlNJT049JG9wdGFyZworICAgICAgICA7OworICAgIC0tZ2RiLXZlcnNpb249KikKKyAgICAgICAgT1BUSU9OX0dEQl9WRVJTSU9OPSRvcHRhcmcKKyAgICAgICAgOzsKKyAgICAtLXBhY2thZ2U9KikKKyAgICAgICAgT1BUSU9OX1BBQ0tBR0U9IiRvcHRhcmciCisgICAgICAgIDs7CisgICAgLS1wbGF0Zm9ybT0qKQorICAgICAgICBQTEFURk9STT0kb3B0YXJnCisgICAgICAgIDs7CisgICAgLS1idWlsZC1vdXQ9KikKKyAgICAgICAgT1BUSU9OX0JVSUxEX09VVD0iJG9wdGFyZyIKKyAgICAgICAgOzsKKyAgICAtLWFiaT0qKQorICAgICAgICBBQkk9JG9wdGFyZworICAgICAgICA7OworICAgIC0tcmVsZWFzZT0qKQorICAgICAgICBPUFRJT05fUkVMRUFTRT0kb3B0YXJnCisgICAgICAgIDs7CisgICAgLS1mb3JjZS1kb3dubG9hZCkKKyAgICAgICAgT1BUSU9OX0ZPUkNFX0RPV05MT0FEPXllcworICAgICAgICBPUFRJT05fRk9SQ0VfQlVJTEQ9eWVzCisgICAgICAgIDs7CisgICAgLS1mb3JjZS1idWlsZCkKKyAgICAgICAgT1BUSU9OX0ZPUkNFX0JVSUxEPXllcworICAgICAgICA7OworICAgIC0tdmVyYm9zZSkKICAgICAgICAgVkVSQk9TRT15ZXMKLSAgICBmaQotICAgIDs7Ci0gIC0tdG9vbGNoYWluPSopCi0gICAgVE9PTENIQUlOX05BTUU9JG9wdGFyZwotICAgIDs7Ci0gIC0tcGxhdGZvcm09KikKLSAgICBQTEFURk9STT0kb3B0YXJnCi0gICAgOzsKLSAgLS1hYmk9KikKLSAgICBBQkk9JG9wdGFyZwotICAgIDs7Ci0gIC0tZm9yY2UtZG93bmxvYWQpCi0gICAgT1BUSU9OX0ZPUkNFX0RPV05MT0FEPXllcwotICAgIE9QVElPTl9GT1JDRV9CVUlMRD15ZXMKLSAgICA7OwotICAtLWZvcmNlLWJ1aWxkKQotICAgIE9QVElPTl9GT1JDRV9CVUlMRD15ZXMKLSAgICA7OwotICAtLXZlcmJvc2UpCi0gICAgVkVSQk9TRT15ZXMKLSAgICA7OwotICAqKQotICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKLSAgICBleGl0IDEKLSAgZXNhYworICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKKyAgICAgICAgZXhpdCAxCisgICAgZXNhYwogZG9uZQogCiBpZiBbICRPUFRJT05fSEVMUCA9ICJ5ZXMiIF0gOyB0aGVuCiAgICAgZWNobyAiUmVidWlsZCB0aGUgcHJlYnVpbHQgYmluYXJpZXMgZm9yIHRoZSBBbmRyb2lkIE5ESyB0b29sY2hhaW4uIgorICAgIGVjaG8gIlRoaXMgc2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCB0aGUgc291cmNlcyBmcm9tIHRoZSIKKyAgICBlY2hvICJJbnRlcm5ldCwgdW5sZXNzIHlvdSB1c2UgdGhlIC0tcGFja2FnZT08ZmlsZT4gb3B0aW9uIHRvIHNwZWNpZnkiCisgICAgZWNobyAidGhlIGV4YWN0IHNvdXJjZSBwYWNrYWdlIHRvIHVzZS4iCiAgICAgZWNobyAiIgotICAgIGVjaG8gIm9wdGlvbnM6IgorICAgIGVjaG8gIlNlZSBidWlsZC90b29scy9kb3dubG9hZC10b29sY2hhaW4tc291cmNlcy5zaCBmb3IgYSB0b29sIHRoYXQiCisgICAgZWNobyAiY2FuIGNyZWF0ZSBhIGNvbXBhdGlibGUgc291cmNlIHBhY2thZ2UgZnJvbSB0aGUgY3VycmVudCIKKyAgICBlY2hvICJnaXQgcmVwb3NpdG9yaWVzLiIKICAgICBlY2hvICIiCi0gICAgZWNobyAiICAtLWhlbHAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgotICAgIGVjaG8gIiAgLS10b29sY2hhaW49PG5hbWU+IHRvb2xjaGFpbiBuYW1lIChkZWZhdWx0IGlzICRUT09MQ0hBSU5fTkFNRSkiCi0gICAgZWNobyAiICAtLXBsYXRmb3JtPTxuYW1lPiAgZ2VuZXJhdGUgdG9vbGNoYWluIGZyb20gcGxhdGZvcm0gPG5hbWU+IChkZWZhdWx0IGlzICRQTEFURk9STSkiCi0gICAgZWNobyAiICAtLWFiaT08bmFtZT4gICAgICAgZ2VuZXJhdGUgdG9vbGNoYWluIGZyb20gYWJpIDxuYW1lPiAoZGVmYXVsdCBpcyAkQUJJKSIKLSAgICBlY2hvICIgIC0tYnVpbGQtb3V0PTxwYXRoPiBzZXQgQW5kcm9pZCBidWlsZCBvdXQgZGlyZWN0b3J5IgotICAgIGVjaG8gIiAgLS1mb3JjZS1kb3dubG9hZCAgIGZvcmNlIGEgZG93bmxvYWQgYW5kIHVucGFja2luZyBvZiB0aGUgdG9vbGNoYWluIHNvdXJjZXMiCi0gICAgZWNobyAiICAtLWZvcmNlLWJ1aWxkICAgICAgZm9yY2UgYSByZWJ1aWxkIG9mIHRoZSBzb3VyY2VzIgorICAgIGVjaG8gIm9wdGlvbnMgKGRlZmF1bHRzIGFyZSB3aXRoaW4gYnJhY2tldHMpOiIKKyAgICBlY2hvICIiCisgICAgZWNobyAiICAtLWhlbHAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgorICAgIGVjaG8gIiAgLS1nY2MtdmVyc2lvbj08dmVyc2lvbj4gIHNlbGVjdCBHQ0MgdmVyc2lvbiBbJEdDQ19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tZ2RiLXZlcnNpb249PHZlcnNpb24+ICBzZWxlY3QgR0RCIHZlcnNpb24gWyRHREJfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLXBhY2thZ2U9PGZpbGU+ICAgICAgICAgc3BlY2lmeSBkb3dubG9hZCBzb3VyY2UgcGFja2FnZSIKKyAgICBlY2hvICIgIC0tcGxhdGZvcm09PG5hbWU+ICAgICAgICBnZW5lcmF0ZSB0b29sY2hhaW4gZnJvbSBwbGF0Zm9ybSA8bmFtZT4gWyRQTEFURk9STV0iCisgICAgZWNobyAiICAtLWFiaT08bmFtZT4gICAgICAgICAgICAgZ2VuZXJhdGUgdG9vbGNoYWluIGZyb20gYWJpIDxuYW1lPiBbJEFCSV0iCisgICAgZWNobyAiICAtLXJlbGVhc2U9PG5hbWU+ICAgICAgICAgc3BlY2lmeSBwcmVidWlsdCByZWxlYXNlIG5hbWUgWyRSRUxFQVNFXSIKKyAgICBlY2hvICIgIC0tYnVpbGQtb3V0PTxwYXRoPiAgICAgICBzZXQgdGVtcG9yYXJ5IGJ1aWxkIG91dCBkaXJlY3RvcnkgWy90bXAvPHJhbmRvbT5dIgorICAgIGVjaG8gIiAgLS1mb3JjZS1kb3dubG9hZCAgICAgICAgIGZvcmNlIGEgZG93bmxvYWQgYW5kIHVucGFja2luZyBvZiB0aGUgdG9vbGNoYWluIHNvdXJjZXMiCisgICAgZWNobyAiICAtLWZvcmNlLWJ1aWxkICAgICAgICAgICAgZm9yY2UgYSByZWJ1aWxkIG9mIHRoZSBzb3VyY2VzIgogICAgIGVjaG8gIiIKICAgICBleGl0IDAKIGZpCkBAIC0xMDUsMTcgKzEzNiw2MCBAQAogICAgIHJ1biAoKQogICAgIHsKICAgICAgICAgZWNobyAiIyMjIyMgTkVXIENPTU1BTkQiCi0gICAgICAgIGVjaG8gJEAKLSAgICAgICAgJEAgMj4mMSB8IHRlZSAkVE1QTE9HCisgICAgICAgIGVjaG8gIiRAIgorICAgICAgICAkQCAyPiYxCisgICAgfQorICAgIGxvZyAoKQorICAgIHsKKyAgICAgICAgZWNobyAiTE9HOiAkQCIKICAgICB9CiBlbHNlCi0gICAgZWNobyAiVG8gZm9sbG93IGJ1aWxkIGxvbmcsIHBsZWFzZSB1c2UgaW4gYW5vdGhlciB0ZXJtaW5hbDogdGFpbCAtRiAkVE1QTE9HIgorICAgIGVjaG8gIlRvIGZvbGxvdyBidWlsZCwgcGxlYXNlIHVzZSBpbiBhbm90aGVyIHRlcm1pbmFsOiB0YWlsIC1GICRUTVBMT0ciCiAgICAgcnVuICgpCiAgICAgewogICAgICAgICBlY2hvICIjIyMjIyBORVcgQ09NTUFORCIgPj4gJFRNUExPRwogICAgICAgICBlY2hvICIkQCIgPj4gJFRNUExPRwotICAgICAgICAkQCAxPiRUTVBMT0cgMj4mMQorICAgICAgICAkQCA+PiRUTVBMT0cgMj4mMQogICAgIH0KKyAgICBsb2cgKCkKKyAgICB7CisgICAgICAgIGVjaG8gIiRAIiA+IC9kZXYvbnVsbAorICAgIH0KK2ZpCisKK2lmIFsgLW4gIiRPUFRJT05fR0NDX1ZFUlNJT04iIF0gOyB0aGVuCisgICAgR0NDX1ZFUlNJT049IiRPUFRJT05fR0NDX1ZFUlNJT04iCisgICAgbG9nICJVc2luZyBnY2MgdmVyc2lvbiAkR0NDX1ZFUlNJT04iCitlbHNlCisgICAgbG9nICJVc2luZyBkZWZhdWx0IGdjYyB2ZXJzaW9uICRHQ0NfVkVSU0lPTiIKK2ZpCisKK2lmIFsgLW4gIiRPUFRJT05fR0RCX1ZFUlNJT04iIF0gOyB0aGVuCisgICAgR0RCX1ZFUlNJT049IiRPUFRJT05fR0RCX1ZFUlNJT04iCisgICAgbG9nICJVc2luZyBnZGIgdmVyc2lvbiAkR0RCX1ZFUlNJT04iCitlbHNlCisgICAgbG9nICJVc2luZyBkZWZhdWx0IGdkYiB2ZXJzaW9uICRHREJfVkVSU0lPTiIKK2ZpCisKK2lmIFsgLW4gIiRPUFRJT05fUkVMRUFTRSIgXSA7IHRoZW4KKyAgICBSRUxFQVNFPSIkUkVMRUFTRSIKKyAgICBsb2cgIlVzaW5nIHRvb2xjaGFpbiByZWxlYXNlIG5hbWUgJyRSRUxFQVNFJyIKK2Vsc2UKKyAgICBsb2cgIlVzaW5nIGRlZmF1bHQgdG9vbGNoYWluIG5hbWUgJyRSRUxFQVNFJyIKK2ZpCisKK2lmIFsgLW4gIiRPUFRJT05fUEFDS0FHRSIgXSA7IHRoZW4KKyAgICBpZiBbICEgLWYgIiRPUFRJT05fUEFDS0FHRSIgXSA7IHRoZW4KKyAgICAgICAgZWNobyAiUGFja2FnZSBpcyBub3QgYSBmaWxlOiAkT1BUSU9OX1BBQ0tBR0UiCisgICAgICAgIGV4aXQgMQorICAgIGZpCitmaQorCitpZiBbIC1uICIkT1BUSU9OX0JVSUxEX09VVCIgXSA7IHRoZW4KKyAgICBCVUlMRF9PVVQ9JE9QVElPTl9CVUlMRF9PVVQKKyAgICBsb2cgIlVzaW5nIHNwZWNpZmljIGJ1aWxkIG91dCBkaXJlY3Rvcnk6ICRCVUlMRF9PVVQiCitlbHNlCisgICAgbG9nICJVc2luZyBkZWZhdWx0IHJhbmRvbSBidWlsZCBvdXQgZGlyZWN0b3J5OiAkQlVJTERfT1VUIgogZmkKIAogQU5EUk9JRF9OREtfUk9PVD1gY2QgJEFORFJPSURfTkRLX1JPT1QgJiYgcHdkYApAQCAtMTIzLDIzICsxOTcsMTQgQEAKIEFORFJPSURfUExBVEZPUk1TX1JPT1Q9JEFORFJPSURfTkRLX1JPT1QvYnVpbGQvcGxhdGZvcm1zCiAKICMgd2hlcmUgYWxsIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGJlIHBsYWNlZAotT1VUPSRBTkRST0lEX05ES19ST09UL291dC8kVE9PTENIQUlOX05BTUUKK09VVD0kQlVJTERfT1VUCiBQQUNLQUdFX09VVD0kT1VUL3BhY2thZ2VzCiBUSU1FU1RBTVBfT1VUPSRPVVQvdGltZXN0YW1wcwogCiAjIHdoZXJlIHRoZSBzeXNyb290IGlzIGxvY2F0ZWQKK0FORFJPSURfVE9PTENIQUlOX1NSQz0kT1VUL3NyYwogQU5EUk9JRF9TWVNST09UPSRBTkRST0lEX05ES19ST09UL2J1aWxkL3BsYXRmb3Jtcy8kUExBVEZPUk0vYXJjaC0kQUJJCiAKLSMgd2hlcmUgdGhlIHRvb2xjaGFpbiBiaW5hcmllcyB3aWxsIGJlIHBsYWNlZAotQU5EUk9JRF9UT09MQ0hBSU5fT1VUPSRPVVQvdG9vbGNoYWluCi1BTkRST0lEX1RPT0xDSEFJTl9TUkM9JEFORFJPSURfVE9PTENIQUlOX09VVC9zcmMKLUFORFJPSURfVE9PTENIQUlOX0JVSUxEPSRBTkRST0lEX1RPT0xDSEFJTl9PVVQvYnVpbGQKLQotIyB3aGVyZSB0aGUgZ2Ric2VydmVyIGJpbmFyaWVzIHdpbGwgYmUgcGxhY2VkCi1BTkRST0lEX0dEQlNFUlZFUl9PVVQ9JE9VVC9nZGJzZXJ2ZXIKLUFORFJPSURfR0RCU0VSVkVSX0JVSUxEPSRBTkRST0lEX0dEQlNFUlZFUl9PVVQvYnVpbGQKLUFORFJPSURfR0RCU0VSVkVSX0RFU1Q9JEFORFJPSURfU1lTUk9PVC91c3IvYmluCi0KICMgTGV0J3MgY2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyBtZDVzdW0gaGVyZQogQV9NRDU9YGVjaG8gIkEiIHwgbWQ1c3VtIHwgY3V0IC1kJyAnIC1mMWAKIGlmIFsgIiRBX01ENSIgIT0gImJmMDcyZTkxMTkwNzdiNGU3NjQzN2E5Mzk4Njc4N2VmIiBdIDsgdGhlbgpAQCAtMTkwLDExICsyNTUsNiBAQAogICAgIGZpCiB9CiAKLVRPT0xDSEFJTl9TUkM9JEFORFJPSURfVE9PTENIQUlOX1NSQwotVE9PTENIQUlOX0JVSUxEPSRBTkRST0lEX1RPT0xDSEFJTl9CVUlMRAotVE9PTENIQUlOX1BSRUZJWD0kQU5EUk9JRF9OREtfUk9PVC9idWlsZC9wcmVidWlsdC8kSE9TVF9UQUcvJFRPT0xDSEFJTl9OQU1FCi0KLUdEQlNFUlZFUl9CVUlMRD0kQU5EUk9JRF9HREJTRVJWRVJfQlVJTEQKIAogdGltZXN0YW1wX2NoZWNrICgpCiB7CkBAIC0yMTgsOCArMjc4LDkgQEAKIH0KIAogIyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBkb3dubG9hZCBhbmQgdmVyaWZ5IGEgdG9vbGNoYWluCi0jIHBhY2thZ2UgCi0jICQxOiBkaXJlY3RvcnkgbmFtZSB1bmRlciBidWlsZC9hcmNoaXZlICAoZS5nLiAnYW5kcm9pZC10b29sY2hhaW4nKQorIyBwYWNrYWdlLgorIworIyAkMTogZGlyZWN0b3J5IG5hbWUgdW5kZXIgYnVpbGQvYXJjaGl2ZSAgKGUuZy4gJ3Rvb2xjaGFpbicpCiAjCiBkb3dubG9hZF9wYWNrYWdlICgpCiB7CkBAIC0zMTUsMTAgKzM3NiwxMCBAQAogICAgICAgICBlY2hvICJVbnBhY2sgIDogJDEgc291cmNlcyIKICAgICAgICAgZWNobyAiICAgICAgICAgIGZyb20gJFNSQ1BLRyIKICAgICAgICAgZWNobyAiICAgICAgICAgIGludG8gJFNSQ0RJUiIKLSAgICAgICAgcm0gLXJmICRTUkNESVIKLSAgICAgICAgbWtkaXIgLXAgJFNSQ0RJUgorICAgICAgICBydW4gcm0gLXJmICRTUkNESVIKKyAgICAgICAgcnVuIG1rZGlyIC1wICRTUkNESVIKICAgICAgICAgVEFSRkxBR1M9eGpmCi0gICAgICAgIGlmIFsgJFZFUkJPU0UgPSB5ZXMgXTsgdGhlbgorICAgICAgICBpZiBbICRWRVJCT1NFMiA9IHllcyBdOyB0aGVuCiAgICAgICAgICAgVEFSRkxBR1M9InYkVEFSRkxBR1MiCiAgICAgICAgIGZpCiAgICAgICAgIHJ1biB0YXIgJFRBUkZMQUdTICRTUkNQS0cgLUMgJFNSQ0RJUgpAQCAtMzUwLDggKzQxMSwxMyBAQAogICAgIGV4aXQgMgogZmkKIAotZG93bmxvYWRfcGFja2FnZSB0b29sY2hhaW4KLXVucGFja19wYWNrYWdlICAgdG9vbGNoYWluICRBTkRST0lEX1RPT0xDSEFJTl9TUkMKK2lmIFsgLW4gIiRPUFRJT05fUEFDS0FHRSIgXSA7IHRoZW4KKyAgICBQS0dfdG9vbGNoYWluPSIkT1BUSU9OX1BBQ0tBR0UiCitlbHNlCisgICAgZG93bmxvYWRfcGFja2FnZSB0b29sY2hhaW4KK2ZpCisKK3VucGFja19wYWNrYWdlIHRvb2xjaGFpbiAkQU5EUk9JRF9UT09MQ0hBSU5fU1JDCiAKICMgcmVtb3ZlIGFsbCBpbmZvIGZpbGVzIGZyb20gdGhlIHVucGFja2VkIHRvb2xjaGFpbiBzb3VyY2VzCiAjIHRoZXkgY3JlYXRlIGNvdW50bGVzcyBsaXR0bGUgcHJvYmxlbXMgZHVyaW5nIHRoZSBidWlsZApAQCAtMzYwLDExOSArNDI2LDIwNiBAQAogIwogZmluZCAkQU5EUk9JRF9UT09MQ0hBSU5fU1JDIC10eXBlIGYgLWEgLW5hbWUgIiouaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCiAKLSMgY29uZmlndXJlIHRoZSB0b29sY2hhaW4KLWlmICEgdGltZXN0YW1wX2NoZWNrIHRvb2xjaGFpbiBjb25maWd1cmU7IHRoZW4KLSAgICBlY2hvICJDb25maWd1cmU6IHRvb2xjaGFpbiBidWlsZCIKLSAgICBta2RpciAtcCAkVE9PTENIQUlOX0JVSUxEICYmCi0gICAgY2QgJFRPT0xDSEFJTl9CVUlMRCAmJgotICAgIGV4cG9ydCBDRkxBR1M9IiRIT1NUX0NGTEFHUyIgJiYKLSAgICBleHBvcnQgTERGTEFHUz0iJEhPU1RfTERGTEFHUyIgJiYgcnVuIFwKLSAgICAkVE9PTENIQUlOX1NSQy9jb25maWd1cmUgLS10YXJnZXQ9YXJtLWVhYmkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWRpc2FibGUtbmxzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9JFRPT0xDSEFJTl9QUkVGSVggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdpdGgtc3lzcm9vdD0kQU5EUk9JRF9TWVNST09UCiAKLSAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KLSAgICAgICAgZWNobyAiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGNvbmZpZ3VyZSB0b29sY2hhaW4gYnVpbGQuIFNlZSAkVE1QTE9HIgotICAgICAgICBleGl0IDEKKyMgU2V0dXAgdmFyaWFibGVzIHRvIHByb3Blcmx5IGJ1aWxkIGEgbmV3IHRvb2xjaGFpbgorIyAkMTogdG9vbGNoYWluIG5hbWUsIGUuZy4gYXJtLWVhYmktNC4yLjEKK2J1aWxkX3Rvb2xjaGFpbiAoKQoreworICAgIFRPT0xDSEFJTl9OQU1FPSQxCisKKyAgICAjIHdoZXJlIHRoZSB0b29sY2hhaW4gaXMgZ29pbmcgdG8gYmUgYnVpbHQKKyAgICBUT09MQ0hBSU5fQlVJTEQ9JE9VVC8kVE9PTENIQUlOX05BTUUKKworICAgICMgd2hlcmUgdGhlIGdkYnNlcnZlciBiaW5hcmllcyB3aWxsIGJlIHBsYWNlZAorICAgIEdEQlNFUlZFUl9CVUlMRD0kVE9PTENIQUlOX0JVSUxEL2dkYnNlcnZlcgorCisgICAgVE9PTENIQUlOX1NSQz0kQU5EUk9JRF9UT09MQ0hBSU5fU1JDCisgICAgVE9PTENIQUlOX1BSRUZJWD0kT1VUL2J1aWxkL3ByZWJ1aWx0LyRIT1NUX1RBRy8kVE9PTENIQUlOX05BTUUKKyAgICBUT09MQ0hBSU5fTElDRU5TRVM9JEFORFJPSURfTkRLX1JPT1QvYnVpbGQvdG9vbHMvdG9vbGNoYWluLWxpY2Vuc2VzCisKKyAgICAjIGNvbmZpZ3VyZSB0aGUgdG9vbGNoYWluCisgICAgaWYgISB0aW1lc3RhbXBfY2hlY2sgJFRPT0xDSEFJTl9OQU1FIGNvbmZpZ3VyZTsgdGhlbgorICAgICAgICBlY2hvICJDb25maWd1cmU6ICRUT09MQ0hBSU5fTkFNRSB0b29sY2hhaW4gYnVpbGQiCisgICAgICAgICMgT2xkIHZlcnNpb25zIG9mIHRoZSB0b29sY2hhaW4gc291cmNlIHBhY2thZ2VzIHBsYWNlZCB0aGUKKyAgICAgICAgIyBjb25maWd1cmUgc2NyaXB0IGF0IHRoZSB0b3AtbGV2ZWwuIE5ld2VyIG9uZXMgcGxhY2UgaXQgdW5kZXIKKyAgICAgICAgIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHRob3VnaC4gUHJvYmUgdGhlIGZpbGUgc3lzdGVtIHRvIGNoZWNrCisgICAgICAgICMgdGhpcy4KKyAgICAgICAgQlVJTERfU1JDRElSPSRUT09MQ0hBSU5fU1JDL2J1aWxkCisgICAgICAgIGlmIFsgISAtZCAkQlVJTERfU1JDRElSIF0gOyB0aGVuCisgICAgICAgICAgICBCVUlMRF9TUkNESVI9JFRPT0xDSEFJTl9TUkMKKyAgICAgICAgZmkKKyAgICAgICAgT0xEX0FCST0iJEFCSSIKKyAgICAgICAgT0xEX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgT0xEX0xERkxBR1M9IiRMREZMQUdTIgorICAgICAgICBta2RpciAtcCAkVE9PTENIQUlOX0JVSUxEICYmCisgICAgICAgIGNkICRUT09MQ0hBSU5fQlVJTEQgJiYKKyAgICAgICAgZXhwb3J0IEFCST0iMzIiICYmICAjIG5lZWRlZCB0byBidWlsZCBhIDMyLWJpdCBnbXAKKyAgICAgICAgZXhwb3J0IENGTEFHUz0iJEhPU1RfQ0ZMQUdTIiAmJgorICAgICAgICBleHBvcnQgTERGTEFHUz0iJEhPU1RfTERGTEFHUyIgJiYgcnVuIFwKKyAgICAgICAgJEJVSUxEX1NSQ0RJUi9jb25maWd1cmUgLS10YXJnZXQ9YXJtLWVhYmkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWRpc2FibGUtbmxzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9JFRPT0xDSEFJTl9QUkVGSVggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdpdGgtc3lzcm9vdD0kQU5EUk9JRF9TWVNST09UIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aXRoLWJpbnV0aWxzLXZlcnNpb249JEJJTlVUSUxTX1ZFUlNJT04gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdpdGgtZ2NjLXZlcnNpb249JEdDQ19WRVJTSU9OIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aXRoLWdkYi12ZXJzaW9uPSRHREJfVkVSU0lPTgorICAgICAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkVycm9yIHdoaWxlIHRyeWluZyB0byBjb25maWd1cmUgdG9vbGNoYWluIGJ1aWxkLiBTZWUgJFRNUExPRyIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBBQkk9IiRPTERfQUJJIgorICAgICAgICBDRkxBR1M9IiRPTERfQ0ZMQUdTIgorICAgICAgICBMREZMQUdTPSIkT0xEX0xERkxBR1MiCisgICAgICAgIHRpbWVzdGFtcF9zZXQgICAkVE9PTENIQUlOX05BTUUgY29uZmlndXJlCisgICAgICAgIHRpbWVzdGFtcF9mb3JjZSAkVE9PTENIQUlOX05BTUUgYnVpbGQKICAgICBmaQotICAgIHRpbWVzdGFtcF9zZXQgICB0b29sY2hhaW4gY29uZmlndXJlCi0gICAgdGltZXN0YW1wX2ZvcmNlIHRvb2xjaGFpbiBidWlsZAotZmkKIAotIyBidWlsZCB0aGUgdG9vbGNoYWluCi1pZiAhIHRpbWVzdGFtcF9jaGVjayB0b29sY2hhaW4gYnVpbGQgOyB0aGVuCi0gICAgZWNobyAiQnVpbGRpbmcgOiB0b29sY2hhaW4gW3RoaXMgY2FuIHRha2UgYSBsb25nIHRpbWVdLiIKLSAgICBjZCAkVE9PTENIQUlOX0JVSUxEICYmCi0gICAgZXhwb3J0IENGTEFHUz0iJEhPU1RfQ0ZMQUdTIiAmJgotICAgIGV4cG9ydCBMREZMQUdTPSIkSE9TVF9MREZMQUdTIiAmJgotICAgIHJ1biBtYWtlIC1qJEpPQlMKLSAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KLSAgICAgICAgZWNobyAiRXJyb3Igd2hpbGUgYnVpbGRpbmcgdG9vbGNoYWluLiBTZWUgJFRNUExPRyIKLSAgICAgICAgZXhpdCAxCisgICAgIyBidWlsZCB0aGUgdG9vbGNoYWluCisgICAgaWYgISB0aW1lc3RhbXBfY2hlY2sgJFRPT0xDSEFJTl9OQU1FIGJ1aWxkIDsgdGhlbgorICAgICAgICBlY2hvICJCdWlsZGluZyA6ICRUT09MQ0hBSU5fTkFNRSB0b29sY2hhaW4gW3RoaXMgY2FuIHRha2UgYSBsb25nIHRpbWVdLiIKKyAgICAgICAgT0xEX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgT0xEX0xERkxBR1M9IiRMREZMQUdTIgorICAgICAgICBPTERfQUJJPSIkQUJJIgorICAgICAgICBjZCAkVE9PTENIQUlOX0JVSUxEICYmCisgICAgICAgIGV4cG9ydCBDRkxBR1M9IiRIT1NUX0NGTEFHUyIgJiYKKyAgICAgICAgZXhwb3J0IExERkxBR1M9IiRIT1NUX0xERkxBR1MiICYmCisgICAgICAgIGV4cG9ydCBBQkk9IjMyIiAmJgorICAgICAgICBydW4gbWFrZSAtaiRKT0JTCisgICAgICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICAgICAgZWNobyAiRXJyb3Igd2hpbGUgYnVpbGRpbmcgdG9vbGNoYWluLiBTZWUgJFRNUExPRyIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBDRkxBR1M9IiRPTERfQ0ZMQUdTIgorICAgICAgICBMREZMQUdTPSIkT0xEX0xERkxBR1MiCisgICAgICAgIEFCST0iJE9MRF9BQkkiCisgICAgICAgIHRpbWVzdGFtcF9zZXQgICAkVE9PTENIQUlOX05BTUUgYnVpbGQKKyAgICAgICAgdGltZXN0YW1wX2ZvcmNlICRUT09MQ0hBSU5fTkFNRSBpbnN0YWxsCiAgICAgZmkKLSAgICB0aW1lc3RhbXBfc2V0ICAgdG9vbGNoYWluIGJ1aWxkCi0gICAgdGltZXN0YW1wX2ZvcmNlIHRvb2xjaGFpbiBpbnN0YWxsCi1maQogCi0jIGluc3RhbGwgdGhlIHRvb2xjaGFpbiB0byBpdHMgZmluYWwgbG9jYXRpb24KLWlmICEgdGltZXN0YW1wX2NoZWNrIHRvb2xjaGFpbiBpbnN0YWxsIDsgdGhlbgotICAgIGVjaG8gIkluc3RhbGwgIDogdG9vbGNoYWluIGJpbmFyaWVzLiIKLSAgICBjZCAkVE9PTENIQUlOX0JVSUxEICYmCi0gICAgcnVuIG1ha2UgaW5zdGFsbAotICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgotICAgICAgICBlY2hvICJFcnJvciB3aGlsZSBpbnN0YWxsaW5nIHRvb2xjaGFpbi4gU2VlICRUTVBMT0ciCi0gICAgICAgIGV4aXQgMQorICAgICMgaW5zdGFsbCB0aGUgdG9vbGNoYWluIHRvIGl0cyBmaW5hbCBsb2NhdGlvbgorICAgIGlmICEgdGltZXN0YW1wX2NoZWNrICRUT09MQ0hBSU5fTkFNRSBpbnN0YWxsIDsgdGhlbgorICAgICAgICBlY2hvICJJbnN0YWxsICA6ICRUT09MQ0hBSU5fTkFNRSB0b29sY2hhaW4gYmluYXJpZXMuIgorICAgICAgICBjZCAkVE9PTENIQUlOX0JVSUxEICYmCisgICAgICAgIHJ1biBtYWtlIGluc3RhbGwKKyAgICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICJFcnJvciB3aGlsZSBpbnN0YWxsaW5nIHRvb2xjaGFpbi4gU2VlICRUTVBMT0ciCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgIyBkb24ndCBmb3JnZXQgdG8gY29weSB0aGUgR1BMIGFuZCBMR1BMIGxpY2Vuc2UgZmlsZXMKKyAgICAgICAgY3AgLWYgJFRPT0xDSEFJTl9MSUNFTlNFUy9DT1BZSU5HICRUT09MQ0hBSU5fTElDRU5TRVMvQ09QWUlORy5MSUIgJFRPT0xDSEFJTl9QUkVGSVgKKyAgICAgICAgIyByZW1vdmUgc29tZSB1bm5lZWRlZCBmaWxlcworICAgICAgICBybSAtZiAkVE9PTENIQUlOX1BSRUZJWC9iaW4vKi1nY2NidWcKKyAgICAgICAgcm0gLXJmICRUT09MQ0hBSU5fUFJFRklYL21hbiAkVE9PTENIQUlOX1BSRUZJWC9pbmZvCisgICAgICAgICMgc3RyaXAgYmluYXJpZXMgdG8gcmVkdWNlIGZpbmFsIHBhY2thZ2Ugc2l6ZQorICAgICAgICBzdHJpcCAkVE9PTENIQUlOX1BSRUZJWC9iaW4vKgorICAgICAgICBzdHJpcCAkVE9PTENIQUlOX1BSRUZJWC9hcm0tZWFiaS9iaW4vKgorICAgICAgICBzdHJpcCAkVE9PTENIQUlOX1BSRUZJWC9saWJleGVjL2djYy8qLyovY2MxCisgICAgICAgIHN0cmlwICRUT09MQ0hBSU5fUFJFRklYL2xpYmV4ZWMvZ2NjLyovKi9jYzFwbHVzCisgICAgICAgIHN0cmlwICRUT09MQ0hBSU5fUFJFRklYL2xpYmV4ZWMvZ2NjLyovKi9jb2xsZWN0MgorICAgICAgICB0aW1lc3RhbXBfc2V0ICAgJFRPT0xDSEFJTl9OQU1FIGluc3RhbGwKKyAgICAgICAgdGltZXN0YW1wX2ZvcmNlICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgY29uZmlndXJlCiAgICAgZmkKLSAgICAjIGRvbid0IGZvcmdldCB0byBjb3B5IHRoZSBHUEwgYW5kIExHUEwgbGljZW5zZSBmaWxlcwotICAgIGNwIC1mICRUT09MQ0hBSU5fU1JDL0NPUFlJTkcgJFRPT0xDSEFJTl9TUkMvQ09QWUlORy5MSUIgJFRPT0xDSEFJTl9QUkVGSVgKLSAgICAjIHJlbW92ZSBzb21lIHVubmVlZGVkIGZpbGVzCi0gICAgcm0gLWYgJFRPT0xDSEFJTl9QUkVGSVgvYmluLyotZ2NjYnVnCi0gICAgcm0gLXJmICRUT09MQ0hBSU5fUFJFRklYL21hbiAkVE9PTENIQUlOX1BSRUZJWC9pbmZvCi0gICAgIyBzdHJpcCBiaW5hcmllcyB0byByZWR1Y2UgZmluYWwgcGFja2FnZSBzaXplCi0gICAgc3RyaXAgJFRPT0xDSEFJTl9QUkVGSVgvYmluLyoKLSAgICBzdHJpcCAkVE9PTENIQUlOX1BSRUZJWC9hcm0tZWFiaS9iaW4vKgotICAgIHN0cmlwICRUT09MQ0hBSU5fUFJFRklYL2xpYmV4ZWMvZ2NjLyovKi9jYzEKLSAgICBzdHJpcCAkVE9PTENIQUlOX1BSRUZJWC9saWJleGVjL2djYy8qLyovY2MxcGx1cwotICAgIHN0cmlwICRUT09MQ0hBSU5fUFJFRklYL2xpYmV4ZWMvZ2NjLyovKi9jb2xsZWN0MgotICAgIHRpbWVzdGFtcF9zZXQgICB0b29sY2hhaW4gaW5zdGFsbAotICAgIHRpbWVzdGFtcF9mb3JjZSBnZGJzZXJ2ZXIgY29uZmlndXJlCi1maQogCi0jIGNvbmZpZ3VyZSB0aGUgZ2Ric2VydmVyIGJ1aWxkIG5vdwotaWYgISB0aW1lc3RhbXBfY2hlY2sgZ2Ric2VydmVyIGNvbmZpZ3VyZTsgdGhlbgotICAgIGVjaG8gIkNvbmZpZ3VyZTogZ2Ric2VydmVyIGJ1aWxkLiIKLSAgICBta2RpciAtcCAkR0RCU0VSVkVSX0JVSUxECi0gICAgY2QgJEdEQlNFUlZFUl9CVUlMRCAmJgotICAgIGV4cG9ydCBDQz0iJFRPT0xDSEFJTl9QUkVGSVgvYmluL2FybS1lYWJpLWdjYyIgJiYKLSAgICBleHBvcnQgQ0ZMQUdTPSItZyAtTzIgLXN0YXRpYyAtbWFuZHJvaWQgLUkkQU5EUk9JRF9TWVNST09UL3Vzci9pbmNsdWRlIiAgJiYKLSAgICBleHBvcnQgTERGTEFHUz0gJiYKLSAgICBydW4gJFRPT0xDSEFJTl9TUkMvZ2RiLTYuNi9nZGIvZ2Ric2VydmVyL2NvbmZpZ3VyZSBcCi0gICAgLS1ob3N0PWFybS1lYWJpLWxpbnV4IFwKLSAgICAtLXdpdGgtc3lzcm9vdD0kQU5EUk9JRF9TWVNST09UCi0gICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkIG5vdCBjb25maWd1cmUgZ2Ric2VydmVyIGJ1aWxkLiBTZWUgJFRNUExPRyIKLSAgICAgICAgZXhpdCAxCisgICAgIyBjb25maWd1cmUgdGhlIGdkYnNlcnZlciBidWlsZCBub3cKKyAgICBpZiAhIHRpbWVzdGFtcF9jaGVjayAkVE9PTENIQUlOX05BTUUtZ2Ric2VydmVyIGNvbmZpZ3VyZTsgdGhlbgorICAgICAgICBlY2hvICJDb25maWd1cmU6ICRUT09MQ0hBSU5fTkFNRSBnZGJzZXJ2ZXIgYnVpbGQuIgorICAgICAgICAjIE9sZCB0b29sY2hhaW4gc291cmNlIHBhY2thZ2VzIHBsYWNlZCB0aGUgZ2RiIHNvdXJjZXMgYXQKKyAgICAgICAgIyB0aGUgdG9wLWxldmVsLCB3aGlsZSBuZXdlciBvbmVzIHBsYWNlIHRoZW0gdW5kZXIgdGhlICdnZGInCisgICAgICAgICMgZGlyZWN0b3J5LiBQcm9iZSB0aGUgZmlsZXN5c3RlbSB0byBjaGVjayB3aGljaCBvbmUgaXMgYXBwcm9wcmlhdGUuCisgICAgICAgIEdEQl9TUkNESVI9JFRPT0xDSEFJTl9TUkMvZ2RiL2dkYi0kR0RCX1ZFUlNJT04KKyAgICAgICAgaWYgWyAhIC1kICRHREJfU1JDRElSIF0gOyB0aGVuCisgICAgICAgICAgICBHREJfU1JDRElSPSRUT09MQ0hBSU5fU1JDL2dkYi0kR0RCX1ZFUlNJT04KKyAgICAgICAgZmkKKyAgICAgICAgbWtkaXIgLXAgJEdEQlNFUlZFUl9CVUlMRAorICAgICAgICBPTERfQ0M9IiRDQyIKKyAgICAgICAgT0xEX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgT0xEX0xERkxBR1M9IiRMREZMQUdTIgorICAgICAgICBjZCAkR0RCU0VSVkVSX0JVSUxEICYmCisgICAgICAgIGV4cG9ydCBDQz0iJFRPT0xDSEFJTl9QUkVGSVgvYmluL2FybS1lYWJpLWdjYyIgJiYKKyAgICAgICAgZXhwb3J0IENGTEFHUz0iLWcgLU8yIC1zdGF0aWMgLW1hbmRyb2lkIiAgJiYKKyAgICAgICAgZXhwb3J0IExERkxBR1M9ICYmCisgICAgICAgIHJ1biAkR0RCX1NSQ0RJUi9nZGIvZ2Ric2VydmVyL2NvbmZpZ3VyZSBcCisgICAgICAgIC0taG9zdD1hcm0tZWFiaS1saW51eCBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSRBTkRST0lEX1NZU1JPT1QKKyAgICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICJDb3VsZCBub3QgY29uZmlndXJlIGdkYnNlcnZlciBidWlsZC4gU2VlICRUTVBMT0ciCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgQ0M9IiRPTERfQ0MiCisgICAgICAgIENGTEFHUz0iJE9MRF9DRkxBR1MiCisgICAgICAgIExERkxBR1M9IiRPTERfTERGTEFHUyIKKyAgICAgICAgdGltZXN0YW1wX3NldCAgICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgY29uZmlndXJlCisgICAgICAgIHRpbWVzdGFtcF9mb3JjZSAkVE9PTENIQUlOX05BTUUtZ2Ric2VydmVyIGJ1aWxkCiAgICAgZmkKLSAgICB0aW1lc3RhbXBfc2V0ICAgZ2Ric2VydmVyIGNvbmZpZ3VyZQotICAgIHRpbWVzdGFtcF9mb3JjZSBnZGJzZXJ2ZXIgYnVpbGQKLWZpCiAKLSMgYnVpbGQgZ2Ric2VydmVyCi1pZiAhIHRpbWVzdGFtcF9jaGVjayBnZGJzZXJ2ZXIgYnVpbGQ7IHRoZW4KLSAgICBlY2hvICJCdWlsZGluZyA6IGdkYnNlcnZlci4iCi0gICAgY2QgJEdEQlNFUlZFUl9CVUlMRCAmJgotICAgIHJ1biBtYWtlIC1qJEpPQlMKLSAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGQgbm90IGJ1aWxkIGdkYnNlcnZlci4gU2VlICRUTVBMT0ciCi0gICAgICAgIGV4aXQgMQorICAgICMgYnVpbGQgZ2Ric2VydmVyCisgICAgaWYgISB0aW1lc3RhbXBfY2hlY2sgJFRPT0xDSEFJTl9OQU1FLWdkYnNlcnZlciBidWlsZDsgdGhlbgorICAgICAgICBlY2hvICJCdWlsZGluZyA6ICRUT09MQ0hBSU5fTkFNRSBnZGJzZXJ2ZXIuIgorICAgICAgICBjZCAkR0RCU0VSVkVSX0JVSUxEICYmCisgICAgICAgIHJ1biBtYWtlIC1qJEpPQlMKKyAgICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICJDb3VsZCBub3QgYnVpbGQgJFRPT0xDSEFJTl9OQU1FIGdkYnNlcnZlci4gU2VlICRUTVBMT0ciCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgdGltZXN0YW1wX3NldCAgICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgYnVpbGQKKyAgICAgICAgdGltZXN0YW1wX2ZvcmNlICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgaW5zdGFsbAogICAgIGZpCi0gICAgdGltZXN0YW1wX3NldCAgIGdkYnNlcnZlciBidWlsZAotICAgIHRpbWVzdGFtcF9mb3JjZSBnZGJzZXJ2ZXIgaW5zdGFsbAotZmkKIAotIyBpbnN0YWxsIGdkYnNlcnZlcgorICAgICMgaW5zdGFsbCBnZGJzZXJ2ZXIKKyAgICAjCisgICAgIyBub3RlIHRoYXQgd2UgaW5zdGFsbCBpdCBpbiB0aGUgdG9vbGNoYWluIGJpbiBkaXJlY3RvcnkKKyAgICAjIG5vdCBpbiAkU1lTUk9PVC91c3IvYmluCisgICAgIworICAgIGlmICEgdGltZXN0YW1wX2NoZWNrICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgaW5zdGFsbDsgdGhlbgorICAgICAgICBlY2hvICJJbnN0YWxsICA6ICRUT09MQ0hBSU5fTkFNRSBnZGJzZXJ2ZXIuIgorICAgICAgICBERVNUPSRUT09MQ0hBSU5fUFJFRklYL2JpbgorICAgICAgICBta2RpciAtcCAkREVTVCAmJgorICAgICAgICAkVE9PTENIQUlOX1BSRUZJWC9iaW4vYXJtLWVhYmktc3RyaXAgJEdEQlNFUlZFUl9CVUlMRC9nZGJzZXJ2ZXIgJiYKKyAgICAgICAgcnVuIGNwIC1mICRHREJTRVJWRVJfQlVJTEQvZ2Ric2VydmVyICRERVNUL2dkYnNlcnZlcgorICAgICAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkNvdWxkIG5vdCBpbnN0YWxsIGdkYnNlcnZlci4gU2VlICRUTVBMT0ciCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgdGltZXN0YW1wX3NldCAgICRUT09MQ0hBSU5fTkFNRS1nZGJzZXJ2ZXIgaW5zdGFsbAorICAgICAgICB0aW1lc3RhbXBfZm9yY2UgcGFja2FnZSB0b29sY2hhaW4KKyAgICBmaQorfQorCisjIExvb2sgYXQgdGhlIHRvb2xjaGFpbnMgYXZhaWxhYmxlIGZyb20gdGhlIHNvdXJjZSBwYWNrYWdlCiAjCi0jIG5vdGUgdGhhdCB3ZSBpbnN0YWxsIGl0IGluIHRoZSB0b29sY2hhaW4gYmluIGRpcmVjdG9yeQotIyBub3QgaW4gJFNZU1JPT1QvdXNyL2JpbgorIyBUaGUgb2xkIHNvdXJjZSB0YXJiYWxsIG9ubHkgY29udGFpbmVkIGdjYyA0LjIuMSwgdGhlIG5ldworIyBvbmVzIGNvbnRhaW4gbXVsdGlwbGUgdG9vbGNoYWlucwogIwotaWYgISB0aW1lc3RhbXBfY2hlY2sgZ2Ric2VydmVyIGluc3RhbGw7IHRoZW4KLSAgICBlY2hvICJJbnN0YWxsICA6IGdkYnNlcnZlci4iCi0gICAgREVTVD0kVE9PTENIQUlOX1BSRUZJWC9iaW4KLSAgICBta2RpciAtcCAkREVTVCAmJgotICAgICRUT09MQ0hBSU5fUFJFRklYL2Jpbi9hcm0tZWFiaS1zdHJpcCAkR0RCU0VSVkVSX0JVSUxEL2dkYnNlcnZlciAmJgotICAgIHJ1biBjcCAtZiAkR0RCU0VSVkVSX0JVSUxEL2dkYnNlcnZlciAkREVTVC9nZGJzZXJ2ZXIKLSAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGQgbm90IGluc3RhbGwgZ2Ric2VydmVyLiBTZWUgJFRNUExPRyIKLSAgICAgICAgZXhpdCAxCi0gICAgZmkKLSAgICB0aW1lc3RhbXBfc2V0ICAgZ2Ric2VydmVyIGluc3RhbGwKLSAgICB0aW1lc3RhbXBfZm9yY2UgcGFja2FnZSB0b29sY2hhaW4KK2lmIFsgLWQgJEFORFJPSURfVE9PTENIQUlOX1NSQy9nY2MtNC4yLjEgXSA7IHRoZW4KKyAgICAjIEFuIG9sZCB0b29sY2hhaW4gc291cmNlIHBhY2thZ2UKKyAgICBBTkRST0lEX1RPT0xDSEFJTl9MSVNUPWFybS1lYWJpLTQuMi4xCitlbHNlCisgICAgQU5EUk9JRF9UT09MQ0hBSU5fTElTVD0iYXJtLWVhYmktNC4yLjEgYXJtLWVhYmktNC40LjAiCiBmaQogCitmb3IgX3Rvb2xjaGFpbiBpbiAkQU5EUk9JRF9UT09MQ0hBSU5fTElTVDsgZG8KKyAgICBpZiB0aW1lc3RhbXBfY2hlY2sgdG9vbGNoYWluIGJ1aWxkOyB0aGVuCisgICAgICAgIHRpbWVzdGFtcF9mb3JjZSAke190b29sY2hhaW59IGNvbmZpZ3VyZQorICAgICAgICB0aW1lc3RhbXBfZm9yY2UgJHtfdG9vbGNoYWlufS1nZGJzZXJ2ZXIgY29uZmlndXJlCisgICAgZmkKKyAgICAjIEdjYyA0LjIuMSBuZWVkcyBiaW51dGlscyAyLjE3CisgICAgaWYgWyAke190b29sY2hhaW59ID0gYXJtLWVhYmktNC4yLjEgXSA7IHRoZW4KKyAgICAgICAgR0NDX1ZFUlNJT049NC4yLjEKKyAgICAgICAgQklOVVRJTFNfVkVSU0lPTj0yLjE3CisgICAgZWxzZQorICAgICAgICBHQ0NfVkVSU0lPTj00LjQuMAorICAgICAgICBCSU5VVElMU19WRVJTSU9OPTIuMTkKKyAgICBmaQorICAgIGJ1aWxkX3Rvb2xjaGFpbiAke190b29sY2hhaW59Citkb25lCisKICMgcGFja2FnZSB0aGUgdG9vbGNoYWluCi1UT09MQ0hBSU5fVEFSQkFMTD0vdG1wL3ByZWJ1aWx0LSRUT09MQ0hBSU5fTkFNRS0kSE9TVF9UQUcudGFyLmJ6MgorVE9PTENIQUlOX1RBUkJBTEw9L3RtcC9hbmRyb2lkLW5kay1wcmVidWlsdC0kUkVMRUFTRS0kSE9TVF9UQUcudGFyLmJ6MgogaWYgISB0aW1lc3RhbXBfY2hlY2sgcGFja2FnZSB0b29sY2hhaW47IHRoZW4KKyAgICBlY2hvICJDbGVhbnVwICA6IFJlbW92aW5nIHVudXNlZnVsIHN0dWZmIgorICAgIHJtIC1yZiAkT1VUL2J1aWxkL3ByZWJ1aWx0LyRIT1NUX1RBRy8qL3NoYXJlCisgICAgZmluZCAkT1VUL2J1aWxkL3ByZWJ1aWx0LyRIT1NUX1RBRyAtbmFtZSAibGliaWJlcnR5LmEiIHwgeGFyZ3Mgcm0gLWYKKyAgICBmaW5kICRPVVQvYnVpbGQvcHJlYnVpbHQvJEhPU1RfVEFHIC1uYW1lICJsaWJhcm0tZWxmLWxpbnV4LXNpbS5hIiB8IHhhcmdzIHJtIC1mCiAgICAgZWNobyAiUGFja2FnZSAgOiAkSE9TVF9BUkNIIHRvb2xjaGFpbiBiaW5hcmllcyIKICAgICBlY2hvICIgICAgICAgICAgIGludG8gJFRPT0xDSEFJTl9UQVJCQUxMIgogICAgIGNkICRBTkRST0lEX05ES19ST09UICYmCkBAIC00ODAsMTUgKzYzMywyNyBAQAogICAgIGlmIFsgJFZFUkJPU0UgPSB5ZXMgXSA7IHRoZW4KICAgICAgIFRBUkZMQUdTPSJ2JFRBUkZMQUdTIgogICAgIGZpCi0gICAgcnVuIHRhciAkVEFSRkxBR1MgJFRPT0xDSEFJTl9UQVJCQUxMIGJ1aWxkL3ByZWJ1aWx0LyRIT1NUX1RBRy8kVE9PTENIQUlOX05BTUUKKyAgICBUT09MQ0hBSU5fU1JDX0RJUlM9CisgICAgZm9yIF90b29sY2hhaW4gaW4gJEFORFJPSURfVE9PTENIQUlOX0xJU1Q7IGRvCisgICAgICAgIFRPT0xDSEFJTl9TUkNfRElSUz0iJFRPT0xDSEFJTl9TUkNfRElSUyBidWlsZC9wcmVidWlsdC8kSE9TVF9UQUcvJHtfdG9vbGNoYWlufSIKKyAgICBkb25lCisgICAgcnVuIHRhciAkVEFSRkxBR1MgJFRPT0xDSEFJTl9UQVJCQUxMIC1DICRPVVQgJFRPT0xDSEFJTl9TUkNfRElSUwogICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgogICAgICAgICBlY2hvICJFUlJPUjogQ2Fubm90IHBhY2thZ2UgcHJlYnVpbHQgdG9vbGNoYWluIGJpbmFyaWVzLiBTZWUgJFRNUExPRyIKICAgICAgICAgZXhpdCAxCiAgICAgZmkKICAgICB0aW1lc3RhbXBfc2V0IHBhY2thZ2UgdG9vbGNoYWluCisgICAgZWNobyAicHJlYnVpbHQgdG9vbGNoYWluIGlzIGluICRUT09MQ0hBSU5fVEFSQkFMTCIKIGVsc2UKICAgICBlY2hvICJwcmVidWlsdCB0b29sY2hhaW4gaXMgaW4gJFRPT0xDSEFJTl9UQVJCQUxMIgogZmkKIAoraWYgWyAteiAiJE9QVElPTl9CVUlMRF9PVVQiIF0gOyB0aGVuCisgICAgZWNobyAiQ2xlYW5pbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSAkT1VUIgorICAgIHJtIC1yZiAkT1VUCitlbHNlCisgICAgZWNobyAiRG9uJ3QgZm9yZ2V0IHRvIGNsZWFuIGJ1aWxkIGRpcmVjdG9yeSAkT1VUIgorZmkKKwogZWNobyAiRG9uZS4iCiBybSAtZiAkVE1QTE9HCmRpZmYgLS1naXQgYS9uZGsvYnVpbGQvdG9vbHMvZG93bmxvYWQtdG9vbGNoYWluLXNvdXJjZXMuc2ggYi9uZGsvYnVpbGQvdG9vbHMvZG93bmxvYWQtdG9vbGNoYWluLXNvdXJjZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhiYWYwOAotLS0gL2Rldi9udWxsCisrKyBiL25kay9idWlsZC90b29scy9kb3dubG9hZC10b29sY2hhaW4tc291cmNlcy5zaApAQCAtMCwwICsxLDIwMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAgVGhpcyBzaGVsbCBzY3JpcHQgaXMgdXNlZCB0byBkb3dubG9hZCB0aGUgc291cmNlcyBvZiB0aGUgQW5kcm9pZCBOREsgdG9vbGNoYWluCisjICBmcm9tIHRoZSBnaXQgc2VydmVyIGF0IGFuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcgYW5kIHBhY2thZ2UgdGhlbSBpbiBhIG5pY2UgdGFyYmFsbAorIyAgdGhhdCBjYW4gbGF0ZXIgYmUgdXNlZCB3aXRoIHRoZSAnYnVpbHQtdG9vbGNoYWluLnNoJyBzY3JpcHQuCisjCisKKyMgaW5jbHVkZSBjb21tb24gZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGRlZmluaXRpb25zCisuIGBkaXJuYW1lICQwYC8uLi9jb3JlL25kay1jb21tb24uc2gKKworT1BUSU9OX0hFTFA9bm8KK09QVElPTl9SRUxFQVNFPQorT1BUSU9OX0dJVD0KK09QVElPTl9CUkFOQ0g9CisKKyMgdGhlIGRlZmF1bHQgcmVsZWFzZSBuYW1lICh1c2UgdG9kYXkncyBkYXRlKQorUkVMRUFTRT1gZGF0ZSArJVklbSVkYAorCisjIHRoZSBkZWZhdWx0IGJyYW5jaCB0byB1c2UKK0JSQU5DSD1lY2xhaXIKKworR0lUQ01EPWdpdAorCitWRVJCT1NFPW5vCitWRVJCT1NFMj1ubworCitmb3Igb3B0IGRvCisgICAgb3B0YXJnPWBleHByICJ4JG9wdCIgOiAneFtePV0qPVwoLipcKSdgCisgICAgY2FzZSAiJG9wdCIgaW4KKyAgICAtLWhlbHB8LWh8LVw/KSBPUFRJT05fSEVMUD15ZXMKKyAgICA7OworICAgIC0tYnJhbmNoPSopCisgICAgICAgIE9QVElPTl9CUkFOQ0g9IiRvcHRhcmciCisgICAgICAgIDs7CisgICAgLS1naXQ9KikKKyAgICAgICAgT1BUSU9OX0dJVD0iJG9wdGFyZyIKKyAgICAgICAgOzsKKyAgICAtLXZlcmJvc2UpCisgICAgICAgIGlmIFsgIiRWRVJCT1NFIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgICAgICAgICBWRVJCT1NFMj15ZXMKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVkVSQk9TRT15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAtLXJlbGVhc2U9KikKKyAgICAgICAgT1BUSU9OX1JFTEVBU0U9JG9wdGFyZworICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKKyAgICAgICAgZXhpdCAxCisgICAgZXNhYworZG9uZQorCitpZiBbICRPUFRJT05fSEVMUCA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiRG93bmxvYWQgdGhlIE5ESyB0b29sY2hhaW4gc291cmNlcyBmcm9tIGFuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcgYW5kIHBhY2thZ2UgdGhlbS4iCisgICAgZWNobyAiWW91IHdpbGwgbmVlZCB0byBydW4gdGhpcyBzY3JpcHQgYmVmb3JlIGJlaW5nIGFibGUgdG8gcmVidWlsZCB0aGUgTkRLIHRvb2xjaGFpbiIKKyAgICBlY2hvICJiaW5hcmllcyBmcm9tIHNjcmF0Y2ggd2l0aCBidWlsZC90b29scy9idWlsZC10b29sY2hhaW4uc2giCisgICAgZWNobyAiIgorICAgIGVjaG8gIm9wdGlvbnMgKGRlZmF1bHRzIGluIGJyYWNrZXRzKToiCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgLS1oZWxwICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgorICAgIGVjaG8gIiAgLS1icmFuY2g9PG5hbWU+ICAgICAgc3BlY2lmeSByZWxlYXNlIGJyYW5jaCBbJEJSQU5DSF0iCisgICAgZWNobyAiICAtLXJlbGVhc2U9PG5hbWU+ICAgICBzcGVjaWZ5IHJlbGVhc2UgbmFtZSBbJFJFTEVBU0VdIgorICAgIGVjaG8gIiAgLS1naXQ9PGV4ZWN1dGFibGU+ICAgdXNlIHRoaXMgdmVyc2lvbiBvZiB0aGUgZ2l0IHRvb2wgWyRHSVRDTURdIgorICAgIGVjaG8gIiAgLS12ZXJib3NlICAgICAgICAgICAgaW5jcmVhc2UgdmVyYm9zaXR5IgorICAgIGVjaG8gIiIKKyAgICBleGl0IDAKK2ZpCisKK1RNUExPRz0vdG1wL2FuZHJvaWQtbmRrLWRvd25sb2FkLXRvb2xjaGFpbi0kJC5sb2cKK3JtIC1yZiAkVE1QTE9HCisKK2lmIFsgJFZFUkJPU0UgPSB5ZXMgXSA7IHRoZW4KKyAgICBydW4gKCkKKyAgICB7CisgICAgICAgIGVjaG8gIiMjIyMjIE5FVyBDT01NQU5EIgorICAgICAgICBlY2hvICRACisgICAgICAgICRAIDI+JjEgfCB0ZWUgJFRNUExPRworICAgIH0KKyAgICBsb2cgKCkKKyAgICB7CisgICAgICAgIGVjaG8gIkxPRzogJEAiCisgICAgfQorZWxzZQorICAgIGVjaG8gIlRvIGZvbGxvdyBkb3dubG9hZCwgcGxlYXNlIHVzZSBpbiBhbm90aGVyIHRlcm1pbmFsOiB0YWlsIC1GICRUTVBMT0ciCisgICAgcnVuICgpCisgICAgeworICAgICAgICBlY2hvICIjIyMjIyBORVcgQ09NTUFORCIgPj4gJFRNUExPRworICAgICAgICBlY2hvICIkQCIgPj4gJFRNUExPRworICAgICAgICAkQCAxPiRUTVBMT0cgMj4mMQorICAgIH0KKyAgICBsb2cgKCkKKyAgICB7CisgICAgICAgIGVjaG8gIiRAIiA+IC9kZXYvbnVsbAorICAgIH0KK2ZpCisKK2lmIFsgLW4gIiRPUFRJT05fUkVMRUFTRSIgXSA7IHRoZW4KKyAgICBSRUxFQVNFPSIkT1BUSU9OX1JFTEVBU0UiCisgICAgbG9nICJVc2luZyByZWxlYXNlIG5hbWUgJFJFTEVBU0UiCitlbHNlCisgICAgbG9nICJVc2luZyBkZWZhdWx0IHJlbGVhc2UgbmFtZSAkUkVMRUFTRSIKK2ZpCisKKyMgQ2hlY2sgdGhhdCAnZ2l0JyB3b3JrcworaWYgWyAtbiAiJE9QVElPTl9HSVQiIF0gOyB0aGVuCisgICAgR0lUQ01EPSIkT1BUSU9OX0dJVCIKKyAgICBsb2cgIlVzaW5nIGdpdCB0b29sIGNvbW1hbmQ6ICckR0lUQ01EJyIKK2Vsc2UKKyAgICBsb2cgIlVzaW5nIGRlZmF1bHQgZ2l0IHRvb2wgY29tbWFuZC4iCitmaQorJEdJVENNRCAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMQoraWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgZWNobyAiVGhlIGdpdCB0b29sIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiBQbGVhc2UgY2hlY2sgJEdJVENNRCIKKyAgICBleGl0IDEKK2ZpCitsb2cgIkdpdCBzZWVtcyB0byB3b3JrIG9rLiIKKworaWYgWyAtbiAiJE9QVElPTl9CUkFOQ0giIF0gOyB0aGVuCisgICAgQlJBTkNIPSIkT1BUSU9OX0JSQU5DSCIKKyAgICBsb2cgIlVzaW5nIGJyYW5jaCBuYW1lZCAkQlJBTkNIIgorZWxzZQorICAgIGxvZyAiVXNpbmcgZGVmYXVsdCBicmFuY2ggbmFtZSAkQlJBTkNIIgorZmkKKworIyBDcmVhdGUgdGVtcCBkaXJlY3Rvcnkgd2hlcmUgZXZlcnl0aGluZyB3aWxsIGJlIGNvcGllZAorIworUEtHTkFNRT1hbmRyb2lkLW5kay10b29sY2hhaW4tJFJFTEVBU0UKK1RNUERJUj0vdG1wLyRQS0dOQU1FCitsb2cgIkNyZWF0aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkgJFRNUERJUiIKK3JtIC1yZiAkVE1QRElSICYmIG1rZGlyICRUTVBESVIKK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeTogJFRNUERJUiIKK2ZpCisKKyMgcHJlZml4IHVzZWQgZm9yIGFsbCBjbG9uZSBvcGVyYXRpb25zCitHSVRQUkVGSVg9Z2l0Oi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy90b29sY2hhaW4KKwordG9vbGNoYWluX2Nsb25lICgpCit7CisgICAgZWNobyAiZG93bmxvYWRpbmcgc291cmNlcyBmb3IgdG9vbGNoYWluLyQxIgorICAgIGxvZyAiY2xvbmluZyAkR0lUUFJFRklYLyQxLmdpdCIKKyAgICBydW4gZ2l0IGNsb25lICRHSVRQUkVGSVgvJDEuZ2l0ICQxCisgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgIGVjaG8gIkNvdWxkIG5vdCBjbG9uZSAkR0lUUFJFRklYLyQxLmdpdCA/IgorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIGxvZyAiY2hlY2tpbmcgb3V0ICRCUkFOQ0ggYnJhbmNoIG9mICQxLmdpdCIKKyAgICBjZCAkMQorICAgIHJ1biBnaXQgY2hlY2tvdXQgLWIgJEJSQU5DSCBvcmlnaW4vJEJSQU5DSAorICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICBlY2hvICJDb3VsZCBub3QgY2hlY2tvdXQgJDEgPyIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICAjIGdldCByaWQgb2YgLmdpdCBkaXJlY3RvcnksIHdlIHdvbid0IG5lZWQgaXQuCisgICAgY2QgLi4KKyAgICBsb2cgImdldHRpbmcgcmlkIG9mIC5naXQgZGlyZWN0b3J5IGZvciAkMS4iCisgICAgcnVuIHJtIC1yZiAkMS8uZ2l0Cit9CisKKworY2QgJFRNUERJUgordG9vbGNoYWluX2Nsb25lIGJpbnV0aWxzCit0b29sY2hhaW5fY2xvbmUgYnVpbGQKK3Rvb2xjaGFpbl9jbG9uZSBnY2MKK3Rvb2xjaGFpbl9jbG9uZSBnZGIKK3Rvb2xjaGFpbl9jbG9uZSBnbXAKKyN0b29sY2hhaW5fY2xvbmUgZ29sZCAgIyBub3Qgc3VyZSBhYm91dCB0aGlzIG9uZSAhCit0b29sY2hhaW5fY2xvbmUgbXBmcgorCisjIFdlIG9ubHkga2VlcCBvbmUgdmVyc2lvbiBvZiBnY2MgYW5kIGJpbnV0aWxzCisKKyMgd2UgY2xlYXJseSBkb24ndCBuZWVkIHRoaXMKK2xvZyAiZ2V0dGluZyByaWQgb2Ygb2Jzb2xldGUgZ2NjIDQuMy4xIHNvdXJjZXMiCitybSAtcmYgJFRNUERJUi9nY2MvZ2NjLTQuMy4xCisKKyMgY3JlYXRlIHRoZSBwYWNrYWdlCitQQUNLQUdFPS90bXAvJFBLR05BTUUudGFyLmJ6MgorZWNobyAiQ3JlYXRpbmcgcGFja2FnZSBhcmNoaXZlICRQQUNLQUdFIgorY2QgYGRpcm5hbWUgJFRNUERJUmAKK3J1biB0YXIgY2p2ZiAkUEFDS0FHRSAtQyAvdG1wLyRQS0dOQU1FIC4KK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgIGVjaG8gIkNvdWxkIG5vdCBwYWNrYWdlIHRvb2xjaGFpbiBzb3VyY2UgYXJjaGl2ZSA/LiBTZWUgJFRNUExPRyIKKyAgICBleGl0IDEKK2ZpCisKK2VjaG8gIlRvb2xjaGFpbiBzb3VyY2VzIGRvd25sb2FkZWQgYW5kIHBhY2thZ2VkIHN1Y2Nlc2Z1bGx5IGF0ICRQQUNLQUdFIgorcm0gLWYgJFRNUExPRwpkaWZmIC0tZ2l0IGEvbmRrL2J1aWxkL3Rvb2xzL3Rvb2xjaGFpbi1saWNlbnNlcy9DT1BZSU5HIGIvbmRrL2J1aWxkL3Rvb2xzL3Rvb2xjaGFpbi1saWNlbnNlcy9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2I2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvYnVpbGQvdG9vbHMvdG9vbGNoYWluLWxpY2Vuc2VzL0NPUFlJTkcKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL25kay9idWlsZC90b29scy90b29sY2hhaW4tbGljZW5zZXMvQ09QWUlORy5MSUIgYi9uZGsvYnVpbGQvdG9vbHMvdG9vbGNoYWluLWxpY2Vuc2VzL0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmQ3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvYnVpbGQvdG9vbHMvdG9vbGNoYWluLWxpY2Vuc2VzL0NPUFlJTkcuTElCCkBAIC0wLDAgKzEsNTEwIEBACisKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCTUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zCitiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0CitiZWNvbWVzIGEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QKK2JlIGFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAorY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdAorICAgIHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscyBzcGVjaWZpZWQgaW4KKyAgICBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB0aGUgY29zdCBvZgorICAgIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5LCBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlCitjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcworb2YgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LgorSXQgaXMgc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QKK2VmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZAoraGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsCitub3RpY2UgaXMgZm91bmQuCisKKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvcgoreW91ciBzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LAoraWYgbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzCisgIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvbmRrL2RvY3MvQU5EUk9JRC1NSy5UWFQgYi9uZGsvZG9jcy9BTkRST0lELU1LLlRYVAppbmRleCBiYWJjZDk1Li42MjI4MDZhIDEwMDY0NAotLS0gYS9uZGsvZG9jcy9BTkRST0lELU1LLlRYVAorKysgYi9uZGsvZG9jcy9BTkRST0lELU1LLlRYVApAQCAtMjA5LDE0ICsyMDksMjUgQEAKIAogVEFSR0VUX1BMQVRGT1JNCiAgICAgTmFtZSBvZiB0aGUgdGFyZ2V0IEFuZHJvaWQgcGxhdGZvcm0gd2hlbiB0aGlzIEFuZHJvaWQubWsgaXMgcGFyc2VkLgotICAgIEZvciBub3csIG9ubHkgJ2FuZHJvaWQtMycgaXMgc3VwcG9ydGVkLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICBBbmRyb2lkIDEuNSBwbGF0Zm9ybS4KKyAgICBGb3IgZXhhbXBsZSwgJ2FuZHJvaWQtMycgY29ycmVzcG9uZCB0byBBbmRyb2lkIDEuNSBzeXN0ZW0gaW1hZ2VzLiBGb3IKKyAgICBhIGNvbXBsZXRlIGxpc3Qgb2YgcGxhdGZvcm0gbmFtZXMgYW5kIGNvcnJlc3BvbmRpbmcgQW5kcm9pZCBzeXN0ZW0KKyAgICBpbWFnZXMsIHJlYWQgZG9jcy9TVEFCTEUtQVBJUy5UWFQuCiAKIFRBUkdFVF9BUkNIX0FCSQogICAgIE5hbWUgb2YgdGhlIHRhcmdldCBDUFUrQUJJIHdoZW4gdGhpcyBBbmRyb2lkLm1rIGlzIHBhcnNlZC4KLSAgICBGb3Igbm93LCBvbmx5ICdhcm0nIGlzIHN1cHBvcnRlZCwgd2hpY2ggcmVhbGx5IG1lYW5zIHRoZSBmb2xsb3dpbmc6CisgICAgVHdvIHZhbHVlcyBhcmUgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQ6CiAKLSAgICAgICBBUk12NVRFIG9yIGhpZ2hlciBDUFUsIHdpdGggJ3NvZnRmbG9hdCcgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydAorICAgICAgIGFybWVhYmkKKyAgICAgICAgICAgIEZvciBBcm12NVRFCisKKyAgICAgICBhcm1lYWJpLXY3YQorCisgICAgTk9URTogVXAgdG8gQW5kcm9pZCBOREsgMS42X3IxLCB0aGlzIHZhcmlhYmxlIHdhcyBzaW1wbHkgZGVmaW5lZAorICAgICAgICAgIGFzICdhcm0nLiBIb3dldmVyLCB0aGUgdmFsdWUgaGFzIGJlZW4gcmVkZWZpbmVkIHRvIGJldHRlcgorICAgICAgICAgIG1hdGNoIHdoYXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBbmRyb2lkIHBsYXRmb3JtLgorCisgICAgRm9yIG1vcmUgZGV0YWlscyBhYm91dCBhcmNoaXRlY3R1cmUgQUJJcyBhbmQgY29ycmVzcG9uZGluZworICAgIGNvbXBhdGliaWxpdHkgaXNzdWVzLCBwbGVhc2UgcmVhZCBkb2NzL0NQVS1BUkNILUFCSVMuVFhUCiAKICAgICBPdGhlciB0YXJnZXQgQUJJcyB3aWxsIGJlIGludHJvZHVjZWQgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBOREsKICAgICBhbmQgd2lsbCBoYXZlIGEgZGlmZmVyZW50IG5hbWUuIE5vdGUgdGhhdCBhbGwgQVJNLWJhc2VkIEFCSXMgd2lsbApAQCAtMjI4LDggKzIzOSw5IEBACiAgICAgYXMgJChUQVJHRVRfUExBVEZPUk0pLSQoVEFSR0VUX0FSQ0hfQUJJKSBhbmQgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQKICAgICB0byB0ZXN0IGFnYWluc3QgYSBzcGVjaWZpYyB0YXJnZXQgc3lzdGVtIGltYWdlIGZvciBhIHJlYWwgZGV2aWNlLgogCi0gICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlICdhbmRyb2lkLTMtYXJtJworICAgIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBiZSAnYW5kcm9pZC0zLWFybWVhYmknCiAKKyAgICAoVXAgdG8gQW5kcm9pZCBOREsgMS42X3IxLCB0aGlzIHVzZWQgdG8gYmUgJ2FuZHJvaWQtMy1hcm0nIGJ5IGRlZmF1bHQpCiAKIE5ESy1wcm92aWRlZCBmdW5jdGlvbiBtYWNyb3M6CiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQpkaWZmIC0tZ2l0IGEvbmRrL2RvY3MvQVBQTElDQVRJT04tTUsuVFhUIGIvbmRrL2RvY3MvQVBQTElDQVRJT04tTUsuVFhUCmluZGV4IGI3OTBhYzYuLjBhMTFjY2EgMTAwNjQ0Ci0tLSBhL25kay9kb2NzL0FQUExJQ0FUSU9OLU1LLlRYVAorKysgYi9uZGsvZG9jcy9BUFBMSUNBVElPTi1NSy5UWFQKQEAgLTExNCw2ICsxMTQsMjUgQEAKICAgICB0byBwb2ludCB0byBhbiBhbHRlcm5hdGUgYnVpbGQgc2NyaXB0LiBBIG5vbi1hYnNvbHV0ZSBwYXRoIHdpbGwgYWx3YXlzCiAgICAgYmUgaW50ZXJwcmVhdGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBOREsncyB0b3AtbGV2ZWwgZGlyZWN0b3J5LgogCitBUFBfQUJJCisgICAgQnkgZGVmYXVsdCwgdGhlIE5ESyBidWlsZCBzeXN0ZW0gd2lsbCBnZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIHRoZQorICAgICdhcm1lYWJpJyBBQkkuIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gQVJNdjVURSBiYXNlZCBDUFUgd2l0aCBzb2Z0d2FyZQorICAgIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuIFlvdSBjYW4gdXNlIEFQUF9BQkkgdG8gc2VsZWN0IGEgZGlmZmVyZW50CisgICAgQUJJLgorCisgICAgRm9yIGV4YW1wbGUsIHRvIHN1cHBvcnQgaGFyZHdhcmUgRlBVIGluc3RydWN0aW9ucyBvbiBBUk12NyBiYXNlZCBkZXZpY2VzLAorICAgIHVzZToKKworICAgICAgICBBUFBfQUJJIDo9IGFybWVhYmktdjdhCisKKyAgICBPciB0byBzdXBwb3J0IGJvdGggQVJNdjVURSBhbmQgQVJNdjcgYmFzZWQgZGV2aWNlcywgdXNlOgorCisgICAgICAgIEFQUF9BQkkgOj0gYXJtZWFiaSBhcm1lYWJpLXY3YQorCisgICAgRm9yIHRoZSBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgQUJJcyBhbmQgZGV0YWlscyBhYm91dCB0aGVpciB1c2FnZSAvIGxpbWl0YXRpb25zCisgICAgcGxlYXNlIHJlYWQgZG9jcy9DUFUtQVJDSC1BQklTLlRYVAorCisKIEEgdHJpdmlhbCBBcHBsaWNhdGlvbi5tayBmaWxlIHdvdWxkIGJlOgogCiAtLS0tLS0tLS0tLS0tLSBjdXQgaGVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9uZGsvZG9jcy9DSEFOR0VTLlRYVCBiL25kay9kb2NzL0NIQU5HRVMuVFhUCmluZGV4IGMxNjI4ODYuLjY1NmIxYjQgMTAwNjQ0Ci0tLSBhL25kay9kb2NzL0NIQU5HRVMuVFhUCisrKyBiL25kay9kb2NzL0NIQU5HRVMuVFhUCkBAIC03LDI0ICs3LDYwIEBACiAKIC0gRml4IGJ1aWxkL2hvc3Qtc2V0dXAuc2ggdG8gZXhlY3V0ZSBhcyBhIEJvdXJuZSBzaGVsbCBzY3JpcHQgKGFnYWluKQogCi0tIE1ha2UgdGFyZ2V0IHNoYXJlZCBsaWJyYXJpZXMgcG9ydGFibGUgdG8gc3lzdGVtcyB0aGF0IGRvbid0IHVzZSB0aGUgZXhhY3Qgc2FtZQotICB0b29sY2hhaW4gKEdDQyA0LjIuMSkgLgotCi0tIEFjdHVhbGx5IHVzZSB0aGUgYXdrIHZlcnNpb24gZGV0ZWN0ZWQgYnkgaG9zdC1zZXR1cC5zaCBkdXJpbmcgdGhlIGJ1aWxkLgorLSBNYWtlIHRhcmdldCBzaGFyZWQgbGlicmFyaWVzIHBvcnRhYmxlIHRvIHN5c3RlbXMgdGhhdCBkb24ndCB1c2UgdGhlIGV4YWN0CisgIHNhbWUgdG9vbGNoYWluLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gbGliZ2NjLmEgaW1wbGVtZW50YXRpb25zCisgIGJldHdlZW4gZ2NjIDQuMi4xIGFuZCA0LjQuMC4gVGhpcyBjaGFuZ2UgZW5zdXJlcyB0aGF0IGdlbmVyYXRlZCBtYWNoaW5lCisgIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gaGVscGVyIGZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorICBydW50aW1lLgogCiAKIElNUE9SVEFOVCBDSEFOR0VTOgogCi0tIEFkZGVkIHBsYXRmb3JtIGVjbGFpci01IHRvIHJlZmxlY3QgdGhlIEVjbGFpciBicmFuY2guIFRoaXMgaXMgbWVyZWx5IGEgY29weQorLSBTdXBwb3J0IGZvciBoYXJkd2FyZSBGUFUuIFRoaXMgaXMgdGhyb3VnaCB0aGUgbmV3ICdhcm1lYWJpLXY3YScgQUJJCisgIGNvcnJlc3BvbmRpbmcgdG8gQVJNdjctYSBjbGFzcyBkZXZpY2VzLgorCisgIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB0aGUgTkRLIHdpbGwgc3RpbGwgZ2VuZXJhdGUgbWFjaGluZSBjb2RlIGZvciB0aGUgb2xkCisgICdhcm1lYWJpJyBBQkkgKEFSTXY1VEUgYmFzZWQpIHdoaWNoIGlzIHN1cHBvcnRlZCBieSBhbGwgb2ZmaWNpYWwgQW5kcm9pZAorICBzeXN0ZW0gaW1hZ2VzIHRvIGRhdGUuCisKKyAgWW91IHdpbGwgbmVlZCB0byBkZWZpbmUgQVBQX0FCSSBpbiB5b3VyIEFwcGxpY2F0aW9uLm1rIGZpbGUgdG8gY2hhbmdlIHRoaXMuCisgIFNlZSBkb2NzL0FQUExJQ0FUSU9OLU1LLlRYVAorCisgIE1vcmUgZGV0YWlscyBhYm91dCBBQklzIGlzIG5vdyBhdmFpbGFibGUgaW4gZG9jcy9DUFUtQVJDSC1BQklTLlRYVAorCistIEdDQyA0LjQuMCBpcyBub3cgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBOREsuIEl0IGdlbmVyYXRlcyBiZXR0ZXIgY29kZSB0aGFuCisgIEdDQyA0LjIuMSwgd2hpY2ggd2FzIHVzZWQgaW4gcHJldmlvdXMgcmVsZWFzZXMuIEhvd2V2ZXIsIHRoZSBjb21waWxlcidzIEMrKworICBmcm9udGVuZCBpcyBhbHNvIGEgbG90IG1vcmUgcGVkYW50aWMgcmVnYXJkaW5nIGNlcnRhaW4gdGVtcGxhdGUgY29uc3RydWN0cworICBhbmQgd2lsbCBldmVuIHJlZnVzZSB0byBidWlsZCBzb21lIG9mIHRoZW0uCisKKyAgRm9yIHRoaXMgcmVhc29uLCB0aGUgTkRLIGFsc28gY29tZXMgd2l0aCBHQ0MgNC4yLjEgcHJlYnVpbHQgYmluYXJpZXMsIGFuZAorICB5b3UgY2FuIGZvcmNlIGl0cyB1c2FnZSBieSBkZWZpbmluZyBOREtfVE9PTENIQUlOIGluIHlvdXIgZW52aXJvbm1lbnQgdG8KKyAgdGhlIHZhbHVlICdhcm0tZWFiaS00LjIuMScuIEZvciBleGFtcGxlOgorCisgICAgICAgIGV4cG9ydCBOREtfVE9PTENIQUlOPWFybS1lYWJpLTQuMi4xCisgICAgICAgIG1ha2UgQVBQPWhlbGxvLWpuaQorCisgIE5vdGUgdGhhdCBvbmx5IHRoZSAnYXJtZWFiaScgQUJJIGlzIHN1cHBvcnRlZCBieSB0aGUgNC4yLjEgdG9vbGNoYWluLiBXZQorICByZWNvbW1lbmQgc3dpdGNoaW5nIHRvIDQuMi4xICpvbmx5KiBpZiB5b3UgZW5jb3VudGVyIGNvbXBpbGF0aW9uIHByb2JsZW1zCisgIHdpdGggNC40LjAuCisKKyAgVGhlIDQuMi4xIHByZWJ1aWx0IGJpbmFyaWVzIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBmcm9tIGEgZnV0dXJlIHJlbGVhc2UKKyAgb2YgdGhlIEFuZHJvaWQgTkRLLCB3ZSB0aHVzICpzdHJvbmdseSogaW52aXRlIHlvdSB0byBmaXggeW91ciBjb2RlIGlmIHN1Y2gKKyAgcHJvYmxlbXMgaGFwcGVuLgorCistIFN1cHBvcnQgZm9yIE9wZW5HTCBFUyAyLjAuIFRoaXMgaXMgdGhyb3VnaCB0aGUgbmV3ICdhbmRyb2lkLTUnIHBsYXRmb3JtIHRvCisgIHJlZmxlY3QgQW5kcm9pZCAyLjAgKHByZXZpb3VzbHkgdGhlIEVjbGFpciBicmFuY2gpLiBUaGlzIGlzIG1lcmVseSBhIGNvcHkKICAgb2YgYW5kcm9pZC00IHRoYXQgYWxzbyBpbmNsdWRlcyBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgZm9yIE9wZW5HTCBFUyAyLjAuCiAKICAgU2VlIHRoZSBzYW1wbGUgbmFtZWQgImhlbGxvLWdsMiIgZm9yIGEgKnZlcnkqIGJhc2ljIGRlbW9uc3RyYXRpb24uIE5vdGUgdGhhdAotICBPcGVuR0wgRVMgMi4wIGlzIGN1cnJlbnRseSAqbm90KiBhdmFpbGFibGUgZnJvbSBKYXZhLCBhbmQgbXVzdCBiZSB1c2VkIHRocm91Z2gKLSAgbmF0aXZlIGNvZGUgZXhjbHVzaXZlbHkuCisgIE9wZW5HTCBFUyAyLjAgaXMgY3VycmVudGx5ICpub3QqIGF2YWlsYWJsZSBmcm9tIEphdmEsIGFuZCBtdXN0IGJlIHVzZWQKKyAgdGhyb3VnaCBuYXRpdmUgY29kZSBleGNsdXNpdmVseS4KIAogCiBPVEhFUiBGSVhFUyAmIENIQU5HRVM6CiAKKy0gQWN0dWFsbHkgdXNlIHRoZSBhd2sgdmVyc2lvbiBkZXRlY3RlZCBieSBob3N0LXNldHVwLnNoIGR1cmluZyB0aGUgYnVpbGQuCisKIC0gQWRkZWQgLS1wcmVidWlsdC1uZGs9RklMRSBvcHRpb24gdG8gYnVpbGQvdG9vbHMvbWFrZS1yZWxlYXNlLnNoIHNjcmlwdCB0bwogICBwYWNrYWdlIGEgbmV3IGV4cGVyaW1lbnRhbCBOREsgcGFja2FnZSBhcmNoaXZlIGZyb20gdGhlIGN1cnJlbnQgc291cmNlIHRyZWUKICAgcGx1cyB0aGUgdG9vbGNoYWluIGJpbmFyaWVzIG9mIGFuIGV4aXN0aW5nIE5ESyByZWxlYXNlIHBhY2thZ2UuIEUuZy46CkBAIC01OCw2ICs5NCwxNyBAQAogICAgICAgc3RfY3RpbWVuc2VjKSB0byA8c3RhdC5oPgogICAgIC0gYWRkIG1pc3NpbmcgZGVjbGFyYXRpb24gZm9yIHR6c2V0KCkgaW4gPHRpbWUuaD4KIAorLSBBZGRlZCBidWlsZC90b29scy9kb3dubG9hZC10b29sY2hhaW4tc291cmNlcy5zaCwgYSBzY3JpcHQgdGhhdCBhbGxvd3MgeW91CisgIHRvIGRvd25sb2FkIHRoZSB0b29sY2hhaW4gc291cmNlcyBmcm9tIHRoZSBvZmZpY2lhbCBvcGVuLXNvdXJjZSByZXBvc2l0b3J5CisgIGF0IGFuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcgYW5kIG5pY2VseSBwYWNrYWdlIHRoZW0gaW50byBhIHRhcmJhbGwgdGhhdCBjYW4KKyAgbGF0ZXIgYmUgdXNlZCBieSBidWlsZC90b29scy9idWlsZC10b29sY2hhaW4uc2ggdG8gcmVidWlsZCB0aGUgcHJlYnVpbHQKKyAgYmluYXJpZXMgZm9yIHlvdXIgc3lzdGVtLgorCistIFVwZGF0ZWQgYnVpbGQvdG9vbHMvYnVpbGQtdG9vbGNoYWluLnNoIHRvIHN1cHBvcnQgdGhlIHRhcmJhbGxzIGdlbmVyYXRlZAorICBieSBkb3dubG9hZC10b29sY2hhaW4tc291cmNlcy5zaCB3aXRoIHRoZSAtLXBhY2thZ2U9PGZpbGU+IG9wdGlvbi4gVGhpcworICBhbHNvIGJ1aWxkcyBib3RoIGdjYyA0LjIuMSBhbmQgNC40LjAsIGFkZGluZyBzdXBwb3J0IGZvciBhcm1lYWJpLXY3YSB0bworICBnY2MgNC40LjAuCisKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGFuZHJvaWQtbmRrLTEuNl9yMQogCmRpZmYgLS1naXQgYS9uZGsvZG9jcy9DUFUtQVJDSC1BQklTLlRYVCBiL25kay9kb2NzL0NQVS1BUkNILUFCSVMuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvZG9jcy9DUFUtQVJDSC1BQklTLlRYVApAQCAtMCwwICsxLDIyNSBAQAorQW5kcm9pZCBOYXRpdmUgQ1BVIEFCSSBNYW5hZ2VtZW50CisKKworSW50cm9kdWN0aW9uOgorPT09PT09PT09PT09PQorCitFdmVyeSBwaWVjZSBvZiBuYXRpdmUgY29kZSBnZW5lcmF0ZWQgd2l0aCB0aGUgQW5kcm9pZCBOREsgbWF0Y2hlcyBhIGdpdmVuCisiQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSIgKEFCSSkgdGhhdCBkZWZpbmVzIGV4YWN0bHkgaG93IHlvdXIKK2FwcGxpY2F0aW9uJ3MgbWFjaGluZSBjb2RlIGlzIGV4cGVjdGVkIHRvIGludGVyYWN0IHdpdGggdGhlIHN5c3RlbSBhdAorcnVudGltZS4KKworQSB0eXBpY2FsIEFCSSBkZXNjcmliZXMgdGhpbmdzIGluICpleGNydWNpYXRpbmcqIGRldGFpbHMsIGFuZCB3aWxsIHR5cGljYWxseQoraW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCisgIC0gdGhlIENQVSBpbnN0cnVjdGlvbiBzZXQgdGhhdCB0aGUgbWFjaGluZSBjb2RlIHNob3VsZCB1c2UKKworICAtIHRoZSBlbmRpYW5lc3Mgb2YgbWVtb3J5IHN0b3JlcyBhbmQgbG9hZHMgYXQgcnVudGltZQorCisgIC0gdGhlIGZvcm1hdCBvZiBleGVjdXRhYmxlIGJpbmFyaWVzIChzaGFyZWQgbGlicmFyaWVzLCBwcm9ncmFtcywgZXRjLi4uKQorICAgIGFuZCB3aGF0IHR5cGUgb2YgY29udGVudCBpcyBhbGxvd2VkL3N1cHBvcnRlZCBpbiB0aGVtLgorCisgIC0gdmFyaW91cyBjb252ZW50aW9ucyB1c2VkIHRvIHBhc3MgZGF0YSBiZXR3ZWVuIHlvdXIgY29kZSBhbmQKKyAgICB0aGUgc3lzdGVtIChlLmcuIGhvdyByZWdpc3RlcnMgYW5kL29yIHRoZSBzdGFjayBhcmUgdXNlZCB3aGVuIGZ1bmN0aW9ucworICAgIGFyZSBjYWxsZWQsIGFsaWdubWVudCBjb25zdHJhaW50cywgZXRjLi4uKQorCisgIC0gYWxpZ25tZW50IGFuZCBzaXplIGNvbnN0cmFpbnRzIGZvciBlbnVtIHR5cGVzLCBzdHJ1Y3R1cmUgZmllbGRzIGFuZAorICAgIGFycmF5cy4KKworICAtIHRoZSBsaXN0IG9mIGZ1bmN0aW9uIHN5bWJvbHMgYXZhaWxhYmxlIHRvIHlvdXIgbWFjaGluZSBjb2RlIGF0IHJ1bnRpbWUsCisgICAgZ2VuZXJhbGx5IGZyb20gYSB2ZXJ5IHNwZWNpZmljIHNlbGVjdGVkIHNldCBvZiBsaWJyYXJpZXMuCisKK1RoaXMgZG9jdW1lbnQgbGlzdHMgdGhlIGV4YWN0IEFCSXMgc3VwcG9ydGVkIGJ5IHRoZSBBbmRyb2lkIE5ESyBhbmQgdGhlCitvZmZpY2lhbCBBbmRyb2lkIHBsYXRmb3JtIHJlbGVhc2VzLgorCisKK0kuIFN1cHBvcnRlZCBBQklzOgorPT09PT09PT09PT09PT09PT09CisKK0VhY2ggc3VwcG9ydGVkIEFCSSBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIG5hbWUuCisKKworIEkuMS4gJ2FybWVhYmknCisgLS0tLS0tLS0tLS0tLS0KKworICBUaGlzIGlzIHRoZSBuYW1lIG9mIGFuIEFCSSBmb3IgQVJNLWJhc2VkIENQVXMgdGhhdCBzdXBwb3J0ICphdCogKmxlYXN0KgorICB0aGUgQVJNdjVURSBpbnN0cnVjdGlvbiBzZXQuIFBsZWFzZSByZWZlciB0byBmb2xsb3dpbmcgZG9jdW1lbnRhdGlvbiBmb3IKKyAgbW9yZSBkZXRhaWxzOgorCisgICAtIEFSTSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIG1hbnVhbCAgICAgICAgICAgICAgICAoYS5rLmEgIEFSTUFSTSkKKyAgIC0gUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIChhLmsuYS4gQUFQQ1MpCisgICAtIEVMRiBmb3IgdGhlIEFSTSBBcmNoaXRlY3R1cmUgICAgICAgICAgICAgICAgICAgICAoYS5rLmEuIEFSTUVMRikKKyAgIC0gQUJJIGZvciB0aGUgQVJNIEFyY2hpdGVjdHVyZSAgICAgICAgICAgICAgICAgICAgIChhLmsuYS4gQlNBQkkpCisgICAtIEJhc2UgUGxhdGZvcm0gQUJJIGZvciB0aGUgQVJNIEFyY2hpdGVjdHVyZSAgICAgICAoYS5rLmEuIEJQQUJJKQorICAgLSBDIExpYnJhcnkgQUJJIGZvciB0aGUgQVJNIEFyY2hpdGVjdHVyZSAgICAgICAgICAgKGEuay5hLiBDTElBQkkpCisgICAtIEMrKyBBQkkgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlICAgICAgICAgICAgICAgICAoYS5rLmEuIENQUEFCSSkKKyAgIC0gUnVudGltZSBBQkkgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlICAgICAgICAgICAgIChhLmsuYS4gUlRBQkkpCisKKyAgIC0gRUxGIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UKKyAgICAgKERSQUZUIC0gMjQgQXByaWwgMjAwMSkKKworICAgLSBHZW5lcmljIEMrKyBBQkkgIChodHRwOi8vd3d3LmNvZGVzb3VyY2VyeS5jb20vcHVibGljL2N4eC1hYmkvYWJpLmh0bWwpCisKKyAgTm90ZSB0aGF0IHRoZSBBQVBDUyBzdGFuZGFyZCBkZWZpbmVzICdFQUJJJyBhcyBhIG1vbmlrZXIgdXNlZCB0byBzcGVjaWZ5CisgIGEgX2ZhbWlseV8gb2Ygc2ltaWxhciBidXQgZGlzdGluY3QgQUJJcy4gQW5kcm9pZCBmb2xsb3dzIHRoZSBsaXR0bGUtZW5kaWFuCisgIEFSTSBHTlUvTGludXggQUJJIGFzIGRvY3VtZW50ZWQgaW4gdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKKworICAgICAgaHR0cDovL3d3dy5jb2Rlc291cmNlcnkuY29tL2dudV90b29sY2hhaW5zL2FybS9hcm1fZ251X2xpbnV4X2FiaS5wZGYKKworICBXaXRoIHRoZSBleGNlcHRpb24gdGhhdCB3Y2hhcl90IGlzIG9ubHkgb25lIGJ5dGUuIFRoaXMgc2hvdWxkIG5vdCBtYXR0ZXIKKyAgaW4gcHJhY3RpY2Ugc2luY2Ugd2NoYXJfdCBpcyBzaW1wbHkgKm5vdCogcmVhbGx5IHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZAorICBwbGF0Zm9ybSBhbnl3YXkuCisKKyAgVGhpcyBBQkkgZG9lcyAqbm90KiBzdXBwb3J0IGhhcmR3YXJlLWFzc2lzdGVkIGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9ucy4KKyAgSW5zdGVhZCwgYWxsIEZQIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB0aHJvdWdoIHNvZnR3YXJlIGhlbHBlciBmdW5jdGlvbnMKKyAgdGhhdCBjb21lIGZyb20gdGhlIGNvbXBpbGVyJ3MgbGliZ2NjLmEgc3RhdGljIGxpYnJhcnkuCisKKyAgVGh1bWIgKGEuay5hLiBUaHVtYi0xKSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4gTm90ZSB0aGF0IHRoZSBOREsKKyAgd2lsbCBnZW5lcmF0ZSB0aHVtYiBjb2RlIGJ5IGRlZmF1bHQsIHVubGVzcyB5b3UgZGVmaW5lIExPQ0FMX0FSTV9NT0RFCisgIGluIHlvdXIgQW5kcm9pZC5tayAoc2VlIGRvY3MvQU5EUk9JRC1NSy5UWFQgZm9yIGFsbCBkZXRhaWxzKS4KKworCisgSS4yLiAnYXJtZWFiaS12N2EnCisgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhpcyBpcyB0aGUgbmFtZSBvZiBhbm90aGVyIEFSTS1iYXNlZCBDUFUgQUJJIHRoYXQgKmV4dGVuZHMqICdhcm1lYWJpJyB0bworICBpbmNsdWRlIGEgZmV3IENQVSBpbnN0cnVjdGlvbiBzZXQgZXh0ZW5zaW9ucyBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZworICBkb2N1bWVudDoKKworICAtIEFSTSBBcmNoaXRlY3R1cmUgdjctYSBSZWZlcmVuY2UgTWFudWFsCisKKyAgVGhlIGluc3RydWN0aW9uIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgQW5kcm9pZC1zcGVjaWZpYyBBQkkgYXJlOgorCisgICAgIC0gVGhlIFRodW1iLTIgaW5zdHJ1Y3Rpb24gc2V0IGV4dGVuc2lvbi4KKyAgICAgLSBUaGUgVkZQIGhhcmR3YXJlIEZQVSBpbnN0cnVjdGlvbnMuCisKKyAgTW9yZSBzcGVjaWZpY2FsbHksIFZGUHYzLUQzMiBpcyBiZWluZyB1c2VkLCB3aGljaCBjb3JyZXNwb25kcyB0byAzMgorICBkZWRpY2F0ZWQgNjQtYml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBwcm92aWRlZCBieSB0aGUgQ1BVLgorCisgIE90aGVyIGV4dGVuc2lvbnMgZGVzY3JpYmVkIGJ5IHRoZSB2Ny1hIEFSTSBsaWtlIEFkdmFuY2VkIFNJTUQgKGEuay5hLiBORU9OKQorICBvciBUaHVtYkVFIGFyZSBvcHRpb25hbCB0byB0aGlzIEFCSSwgd2hpY2ggbWVhbnMgdGhhdCBkZXZlbG9wZXJzIHNob3VsZAorICBjaGVjayAqYXQqICpydW50aW1lKiB3aGV0aGVyIHRoZSBleHRlbnNpb25zIGFyZSBhdmFpbGFibGUgYW5kIHByb3ZpZGUKKyAgYWx0ZXJuYXRpdmUgY29kZSBwYXRocyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4KKworICAoSnVzdCBsaWtlIG9uZSB0eXBpY2FsbHkgZG9lcyBvbiB4ODYgc3lzdGVtcyB0byBjaGVjay91c2UgTU1YL1NTRTIvZXRjLi4uCisgICBzcGVjaWFsaXplZCBpbnN0cnVjdGlvbnMpLgorCisgIElNUE9SVEFOVCBOT1RFOiBUaGlzIEFCSSBlbmZvcmNlcyB0aGF0IGFsbCBkb3VibGUgdmFsdWVzIGFyZSBwYXNzZWQgZHVyaW5nCisgIGZ1bmN0aW9uIGNhbGxzIGluICdjb3JlJyByZWdpc3RlciBwYWlycywgaW5zdGVhZCBvZiBkZWRpY2F0ZWQgRlAgb25lcy4KKyAgSG93ZXZlciwgYWxsIGludGVybmFsIGNvbXB1dGF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIHdpdGggdGhlIEZQIHJlZ2lzdGVycworICBhbmQgd2lsbCBiZSBncmVhdGx5IHNwZWQgdXAuCisKKyAgVGhpcyBsaXR0bGUgY29uc3RyYWludCwgd2hpbGUgcmVzdWx0aW5nIGluIGEgc2xpZ2h0IGRlY3JlYXNlIG9mCisgIHBlcmZvcm1hbmNlLCBlbnN1cmVzIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggYWxsIGV4aXN0aW5nICdhcm1lYWJpJworICBiaW5hcmllcy4KKworICBJTVBPUlRBTlQgTk9URTogVGhlICdhcm1lYWJpLXY3YScgbWFjaGluZSBjb2RlIHdpbGwgKm5vdCogcnVuIG9uIEFSTXY1IG9yCisgICAgICAgICAgICAgICAgICBBUk12NiBiYXNlZCBkZXZpY2VzLgorCisKK0lJLiBHZW5lcmF0aW5nIGNvZGUgZm9yIGEgc3BlY2lmaWMgQUJJOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0J5IGRlZmF1bHQsIHRoZSBOREsgd2lsbCBnZW5lcmF0ZSBtYWNoaW5lIGNvZGUgZm9yIHRoZSAnYXJtZWFiaScgQUJJLgorWW91IGNhbiBob3dldmVyIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8geW91ciBBcHBsaWNhdGlvbi5tayB0byBnZW5lcmF0ZQorQVJNdjctYSBjb21wYXRpYmxlIG1hY2hpbmUgY29kZSBpbnN0ZWFkOgorCisgICBBUFBfQUJJIDo9IGFybWVhYmktdjdhCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gYnVpbGQgbWFjaGluZSBjb2RlIGZvciAqdHdvKiBkaXN0aW5jdCBBQklzIGJ5IHVzaW5nOgorCisgICBBUFBfQUJJIDo9IGFybWVhYmkgYXJtZWFiaS12N2EKKworVGhpcyB3aWxsIGluc3RydWN0IHRoZSBOREsgdG8gYnVpbGQgdHdvIHZlcnNpb25zIG9mIHlvdXIgbWFjaGluZSBjb2RlOiBvbmUgZm9yCitlYWNoIEFCSSBsaXN0ZWQgb24gdGhpcyBsaW5lLiBCb3RoIGxpYnJhcmllcyB3aWxsIGJlIGNvcGllZCB0byB5b3VyIGFwcGxpY2F0aW9uCitwcm9qZWN0IHBhdGggYW5kIHdpbGwgYmUgdWx0aW1hdGVseSBwYWNrYWdlZCBpbnRvIHlvdXIgLmFway4KKworU3VjaCBhIHBhY2thZ2UgaXMgY2FsbGVkIGEgImZhdCBiaW5hcnkiIGluIEFuZHJvaWQgc3BlYWsgc2luY2UgaXQgY29udGFpbnMKK21hY2hpbmUgY29kZSBmb3IgbW9yZSB0aGFuIG9uZSBDUFUgYXJjaGl0ZWN0dXJlLiBBdCBpbnN0YWxsYXRpb24gdGltZSwgdGhlCitwYWNrYWdlIG1hbmFnZXIgd2lsbCBvbmx5IHVucGFjayB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtYWNoaW5lIGNvZGUgZm9yIHRoZQordGFyZ2V0IGRldmljZS4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgorCisKKworSUlJLiBBQkkgTWFuYWdlbWVudCBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBwcm92aWRlcyBzcGVjaWZpYyBkZXRhaWxzIGFib3V0IGhvdyB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBtYW5hZ2VzCituYXRpdmUgY29kZSBpbiBhcHBsaWNhdGlvbiBwYWNrYWdlcy4KKworCisgIElJSS4xLiBOYXRpdmUgY29kZSBpbiBBcHBsaWNhdGlvbiBQYWNrYWdlczoKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBzaGFyZWQgbGlicmFyaWVzIGdlbmVyYXRlZCB3aXRoIHRoZSBOREsgYXJlIHN0b3JlZCBpbgorICAgIHRoZSBmaW5hbCBhcHBsaWNhdGlvbiBwYWNrYWdlICguYXBrKSBhdCBsb2NhdGlvbnMgb2YgdGhlIGZvcm06CisKKyAgICAgICBsaWIvPGFiaT4vbGliPG5hbWU+LnNvCisKKyAgICBXaGVyZSA8YWJpPiBpcyBvbmUgb2YgdGhlIEFCSSBuYW1lcyBsaXN0ZWQgaW4gc2VjdGlvbiBJSSBhYm92ZSwgYW5kIDxuYW1lPgorICAgIGlzIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gbG9hZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZnJvbSB0aGUgVk0KKyAgICBhcyBpbjoKKworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIjxuYW1lPiIpOworCisgICAgU2luY2UgLmFwayBmaWxlcyBhcmUganVzdCB6aXAgZmlsZXMsIHlvdSBjYW4gdHJpdmlhbGx5IGxpc3QgdGhlaXIgY29udGVudAorICAgIHdpdGggYSBjb21tYW5kIGxpa2U6CisKKyAgICAgICAgdW56aXAgLWwgPGFwaz4KKworICAgIHRvIHZlcmlmeSB0aGF0IHRoZSBuYXRpdmUgc2hhcmVkIGxpYnJhcmllcyB5b3Ugd2FudCBhcmUgaW5kZWVkIGF0IHRoZQorICAgIHByb3BlciBsb2NhdGlvbi4gWW91IGNhbiBhbHNvIHBsYWNlIG5hdGl2ZSBzaGFyZWQgbGlicmFyaWVzIGF0IG90aGVyCisgICAgbG9jYXRpb25zIHdpdGhpbiB0aGUgLmFwaywgYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBzeXN0ZW0sIG9yIG1vcmUKKyAgICBwcmVjaXNlbHkgYnkgdGhlIHN0ZXBzIGRlc2NyaWJlZCBiZWxvdzsgeW91IHdpbGwgbmVlZCB0byBleHRyYWN0L2luc3RhbGwKKyAgICB0aGVtIG1hbnVhbGx5IGluIHlvdXIgYXBwbGljYXRpb24uCisKKyAgICBJbiB0aGUgY2FzZSBvZiBhICJmYXQiIGJpbmFyeSwgdHdvIGRpc3RpbmN0IGxpYnJhcmllcyBhcmUgdGh1cyBwbGFjZWQgaW4KKyAgICB0aGUgIC5hcGssIGZvciBleGFtcGxlIGF0OgorCisgICAgICAgIGxpYi9hcm1lYWJpL2xpYmZvby5zbworICAgICAgICBsaWIvYXJtZWFiaS12N2EvbGliZm9vLnNvCisKKworICBJSUkuMi4gQW5kcm9pZCBQbGF0Zm9ybSBBQkkgc3VwcG9ydDoKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUaGUgQW5kcm9pZCBzeXN0ZW0ga25vd3MgYXQgcnVudGltZSB3aGljaCBBQkkocykgaXQgc3VwcG9ydHMuIE1vcmUKKyAgICBwcmVjaXNlbHksIHVwIHRvIHR3byBidWlsZC1zcGVjaWZpYyBzeXN0ZW0gcHJvcGVydGllcyBhcmUgdXNlZCB0bworICAgIGluZGljYXRlOgorCisgICAgLSB0aGUgJ3ByaW1hcnknIEFCSSBmb3IgdGhlIGRldmljZSwgY29ycmVzcG9uZGluZyB0byB0aGUgbWFjaGluZQorICAgICAgY29kZSB1c2VkIGluIHRoZSBzeXN0ZW0gaW1hZ2UgaXRzZWxmLgorCisgICAgLSBhbiBvcHRpb25hbCAnc2Vjb25kYXJ5JyBBQkksIGNvcnJlc3BvbmRpbmcgdG8gYW5vdGhlciBBQkkgdGhhdAorICAgICAgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbSBpbWFnZS4KKworICAgIEZvciBleGFtcGxlLCBhIHR5cGljYWwgQVJNdjVURS1iYXNlZCBkZXZpY2Ugd291bGQgb25seSBkZWZpbmUKKyAgICB0aGUgcHJpbWFyeSBBQkkgYXMgJ2FybWVhYmknIGFuZCBub3QgZGVmaW5lIGEgc2Vjb25kYXJ5IG9uZS4KKworICAgIE9uIHRoZSBvdGhlciBoYW5kLCBhIHR5cGljYWwgQVJNdjctYmFzZWQgZGV2aWNlIHdvdWxkIGRlZmluZSB0aGUKKyAgICBwcmltYXJ5IEFCSSB0byAnYXJtZWFiaS12N2EnIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZSB0byAnYXJtZWFiaScKKyAgICBzaW5jZSBpdCBjYW4gcnVuIGFwcGxpY2F0aW9uIG5hdGl2ZSBiaW5hcmllcyBnZW5lcmF0ZWQgZm9yIGJvdGgKKyAgICBvZiB0aGVtLgorCisKKyAgSUlJLjMuIEF1dG9tYXRpYyBleHRyYWN0aW9uIG9mIG5hdGl2ZSBjb2RlIGF0IGluc3RhbGwgdGltZToKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFdoZW4gaW5zdGFsbGluZyBhbiBhcHBsaWNhdGlvbiwgdGhlIHBhY2thZ2UgbWFuYWdlciBzZXJ2aWNlIHdpbGwgc2NhbgorICAgIHRoZSAuYXBrIGFuZCBsb29rIGZvciBhbnkgc2hhcmVkIGxpYnJhcnkgb2YgdGhlIGZvcm06CisKKyAgICAgICAgIGxpYi88cHJpbWFyeS1hYmk+L2xpYjxuYW1lPi5zbworCisgICAgSWYgb25lIGlzIGZvdW5kLCB0aGVuIGl0IGlzIGNvcGllZCB1bmRlciAkQVBQRElSL2xpYi9saWI8bmFtZT4uc28sCisgICAgd2hlcmUgJEFQUERJUiBjb3JyZXNwb25kcyB0byB0aGUgYXBwbGljYXRpb24ncyBzcGVjaWZpYyBkYXRhIGRpcmVjdG9yeS4KKworICAgIElmIG5vbmUgaXMgZm91bmQsIGFuZCBhIHNlY29uZGFyeSBBQkkgaXMgZGVmaW5lZCwgdGhlIHNlcnZpY2Ugd2lsbAorICAgIHRoZW4gc2NhbiBmb3Igc2hhcmVkIGxpYnJhcmllcyBvZiB0aGUgZm9ybToKKworICAgICAgICBsaWIvPHNlY29uZGFyeS1hYmk+L2xpYjxuYW1lPi5zbworCisgICAgSWYgYW55dGhpbmcgaXMgZm91bmQsIHRoZW4gaXQgaXMgY29waWVkIHVuZGVyICRBUFBESVIvbGliL2xpYjxuYW1lPi5zbworCisgICAgVGhpcyBtZWNoYW5pc20gZW5zdXJlcyB0aGF0IHRoZSBiZXN0IG1hY2hpbmUgY29kZSBmb3IgdGhlIHRhcmdldAorICAgIGRldmljZSBpcyBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrYWdlIGF0IGluc3RhbGxhdGlvbgorICAgIHRpbWUuCmRpZmYgLS1naXQgYS9uZGsvZG9jcy9TVEFCTEUtQVBJUy5UWFQgYi9uZGsvZG9jcy9TVEFCTEUtQVBJUy5UWFQKaW5kZXggN2Q1ZDE3NS4uNzAwYmI4OCAxMDA2NDQKLS0tIGEvbmRrL2RvY3MvU1RBQkxFLUFQSVMuVFhUCisrKyBiL25kay9kb2NzL1NUQUJMRS1BUElTLlRYVApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgYW5kcm9pZC0zICAgICAgLT4gT2ZmaWNpYWwgQW5kcm9pZCAxLjUgc3lzdGVtIGltYWdlcwogICAgIGFuZHJvaWQtNCAgICAgIC0+IE9mZmljaWFsIEFuZHJvaWQgMS42IHN5c3RlbSBpbWFnZXMKLSAgICBhbmRyb2lkLTUgICAgICAtPiBFeHBlcmltZW50YWwgRWNsYWlyIHN5c3RlbSBpbWFnZXMKKyAgICBhbmRyb2lkLTUgICAgICAtPiBPZmZpY2lhbCBBbmRyb2lkIDIuMCBzeXN0ZW0gaW1hZ2VzCiAKIElJLiBBbmRyb2lkLTMgU3RhYmxlIE5hdGl2ZSBBUElzOgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9faW5kZXguaHRtbAppbmRleCA2YjMwMzAzLi41ZTdlYmZjIDEwMDc1NQotLS0gYS9zYW1wbGVzL0FwaURlbW9zL19pbmRleC5odG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvX2luZGV4Lmh0bWwKQEAgLTE2LDI3ICsxNiwyOSBAQAogICA8bGk+QW5kIG1hbnkgbWFueSBtb3JlLi4uPC9saT4gIAogPC91bD4KIAotPHA+WW91J2xsIG5vdGljZSB0aGF0IGFsbCB0aGUgc2FtcGxlcyBhcmUgaW5jbHVkZWQgaW4gYSBzaW5nbGUgQW5kcm9pZCBwcm9qZWN0LAotc28gdGhlIGFwcGxpY2F0aW9uIGNvZGUgYW5kIG90aGVyIHJlc291cmNlIGZpbGVzIGZvciBhbGwgc2FtcGxlcyBhcmUgYmF0Y2hlZCB0b2dldGhlci4gCi1UbyBoZWxwIHlvdSBmaW5kIHRoZSBjb2RlIHRoYXQncyByZWxldmFudCB0byB5b3UsIGhlcmUncyBhIGRpcmVjdG9yeSB0aGF0Ci1wb2ludHMgdG8gdGhlIHByb2dyYW0gY29kZSBmb3IgdGhlIGRpZmZlcmVudCB0b3BpY3MgaW5jbHVkZWQgaW4gdGhlIHByb2plY3Q6PC9wPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogCi08dWw+Ci0gICAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL2luZGV4Lmh0bWwiPkFuaW1hdGlvbjwvYT48L2xpPgorLy8gVGhpcyBpcyBhIHRvdGFsbHkgdGVtcG9yYXJ5IGhhY2sgdG8gZGlzcGxheSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb25seQorLy8gd2hlbiB0aGUgZG9jcyBhcmUgb25saW5lLiBUaGlzIHdpbGwgYmUgY2hhbmdlZCBvbmNlIHRoZSBzYW1wbGVzIGdldCBtb3ZlZC4KIAotICAgIDxsaT48YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9pbmRleC5odG1sIj5BcHA8L2E+PC9saT4KK2lmICh0b1Jvb3QgPT0gIi8iKSB7CiAKLSAgICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHB3aWRnZXQvaW5kZXguaHRtbCI+QXBwIFdpZGdldHM8L2E+PC9saT4KK2RvY3VtZW50LndyaXRlKCIiKworIjxwPllvdSdsbCBub3RpY2UgdGhhdCBhbGwgdGhlIHNhbXBsZXMgYXJlIGluY2x1ZGVkIGluIGEgc2luZ2xlIEFuZHJvaWQiKworInByb2plY3Qsc28gdGhlIGFwcGxpY2F0aW9uIGNvZGUgYW5kIG90aGVyIHJlc291cmNlIGZpbGVzIGZvciBhbGwgc2FtcGxlcyBhcmUgYmF0Y2hlZCIrCisidG9nZXRoZXIuVG8gaGVscCB5b3UgZmluZCB0aGUgY29kZSB0aGF0J3MgcmVsZXZhbnQgdG8geW91LCBoZXJlJ3MgYSBkaXJlY3RvcnkgdGhhdCIrCisicG9pbnRzIHRvIHRoZSBwcm9ncmFtIGNvZGUgZm9yIHRoZSBkaWZmZXJlbnQgdG9waWNzIGluY2x1ZGVkIGluIHRoZSBwcm9qZWN0OjwvcD4iKwogCi0gICAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9pbmRleC5odG1sIj5Db250ZW50PC9hPjwvbGk+Ci0gICAgCi0gICAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvaW5kZXguaHRtbCI+R3JhcGhpY3M8L2E+PC9saT4KLSAgICAKLSAgICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9tZWRpYS9pbmRleC5odG1sIj5NZWRpYTwvYT48L2xpPgotICAgIAotICAgIDxsaT48YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL29zL2luZGV4Lmh0bWwiPk9TPC9hPjwvbGk+CisiPHVsPjxsaT48YSBocmVmPSdzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9pbmRleC5odG1sJz5BbmltYXRpb248L2E+PC9saT4iKworIiAgICA8bGk+PGEgaHJlZj0nc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvaW5kZXguaHRtbCc+QXBwPC9hPjwvbGk+IisKKyIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwd2lkZ2V0L2luZGV4Lmh0bWwnPkFwcCBXaWRnZXRzPC9hPjwvbGk+IisKKyIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9pbmRleC5odG1sJz5Db250ZW50PC9hPjwvbGk+IisKKyIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvaW5kZXguaHRtbCc+R3JhcGhpY3M8L2E+PC9saT4iKworIiAgICA8bGk+PGEgaHJlZj0nc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9tZWRpYS9pbmRleC5odG1sJz5NZWRpYTwvYT48L2xpPiIrCisiICAgIDxsaT48YSBocmVmPSdzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL29zL2luZGV4Lmh0bWwnPk9TPC9hPjwvbGk+IisKKyIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdGV4dC9pbmRleC5odG1sJz5UZXh0PC9hPjwvbGk+IisKKyIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9pbmRleC5odG1sJz5WaWV3czwvYT48L2xpPjwvdWw+Iik7CiAKLSAgICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy90ZXh0L2luZGV4Lmh0bWwiPlRleHQ8L2E+PC9saT4KLSAgICAKLSAgICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L2luZGV4Lmh0bWwiPlZpZXdzPC9hPjwvbGk+Ci08L3VsPgorfQorCis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2FuZHJvaWRwcmVmcy8uY2xhc3NwYXRoIGIvdG9vbHMvYW5kcm9pZHByZWZzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTAxMTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW5kcm9pZHByZWZzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9hbmRyb2lkcHJlZnMvLmdpdGlnbm9yZSBiL3Rvb2xzL2FuZHJvaWRwcmVmcy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk5NTA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FuZHJvaWRwcmVmcy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvYW5kcm9pZHByZWZzLy5wcm9qZWN0IGIvdG9vbHMvYW5kcm9pZHByZWZzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjMzYmJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FuZHJvaWRwcmVmcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPkFuZHJvaWRQcmVmczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9hbmRyb2lkcHJlZnMvQW5kcm9pZC5tayBiL3Rvb2xzL2FuZHJvaWRwcmVmcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjNiMDg1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FuZHJvaWRwcmVmcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUpBUlVUSUxTX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKEpBUlVUSUxTX0xPQ0FMX0RJUikvc3JjL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FuZHJvaWRwcmVmcy9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2FuZHJvaWRwcmVmcy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjMGFhNi4uMDAwMDAwMAotLS0gYS90b29scy9hbmRyb2lkcHJlZnMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9NT0RVTEUgOj0gYW5kcm9pZHByZWZzCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvYW5kcm9pZHByZWZzL3NyYy9jb20vYW5kcm9pZC9wcmVmcy9BbmRyb2lkTG9jYXRpb24uamF2YSBiL3Rvb2xzL2FuZHJvaWRwcmVmcy9zcmMvY29tL2FuZHJvaWQvcHJlZnMvQW5kcm9pZExvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmM0MjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW5kcm9pZHByZWZzL3NyYy9jb20vYW5kcm9pZC9wcmVmcy9BbmRyb2lkTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYW5kcm9pZCBmaWxlcyAoaW5jbHVkaW5nIGVtdWxhdG9yIGZpbGVzLCBkZG1zIGNvbmZpZywgZGVidWcga2V5c3RvcmUpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmRyb2lkTG9jYXRpb24gewotICAgIC8qKgotICAgICAqIFZpcnR1YWwgRGV2aWNlIGZvbGRlciBpbnNpZGUgdGhlIHBhdGggcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGb2xkZXIoKX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfQVZEID0gImF2ZCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvdyB3aGVuIHRoZSBsb2NhdGlvbiBvZiB0aGUgYW5kcm9pZCBmb2xkZXIgY291bGRuJ3QgYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1ByZWZzTG9jYXRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9sZGVyIHVzZWQgdG8gc3RvcmUgYW5kcm9pZCByZWxhdGVkIGZpbGVzLgotICAgICAqIEByZXR1cm4gYW4gT1Mgc3BlY2lmaWMgcGF0aCwgdGVybWluYXRlZCBieSBhIHNlcGFyYXRvci4KLSAgICAgKiBAdGhyb3dzIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldEZvbGRlcigpIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoc1ByZWZzTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGhvbWUgPSBmaW5kVmFsaWRQYXRoKCJBTkRST0lEX1NES19IT01FIiwgInVzZXIuaG9tZSIsICJIT01FIik7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBhYm92ZSBmYWlsZWQsIHdlIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIGlmIChob21lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgdGhlIGhvbWUgZGlyZWN0b3J5LiBNYWtlIHN1cmUgdGhlIHVzZXIuaG9tZSBwcm9wZXJ0eSBpcyBzZXQgdXAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc1ByZWZzTG9jYXRpb24gPSBob21lICsgRmlsZS5zZXBhcmF0b3IgKyAiLmFuZHJvaWQiICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGZvbGRlciBleGlzdHMhCi0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHNQcmVmc0xvY2F0aW9uKTsKLSAgICAgICAgaWYgKGYuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZi5ta2RpcigpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlMiA9IG5ldyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGZvbGRlciAnJTEkcycuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIHBhdGggb2YgcHJlZmVyZW5jZSBmb2xkZXIgZXhwZWN0ZWQgYnkgdGhlIEFuZHJvaWQgdG9vbHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNQcmVmc0xvY2F0aW9uKSk7Ci0gICAgICAgICAgICAgICAgZTIuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgICAgIHRocm93IGUyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGYuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24oc1ByZWZzTG9jYXRpb24gKwotICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIGRpcmVjdG9yeSEgIiArCi0gICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHRoZSBwYXRoIG9mIHByZWZlcmVuY2UgZm9sZGVyIGV4cGVjdGVkIGJ5IHRoZSBBbmRyb2lkIHRvb2xzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNQcmVmc0xvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhIGxpc3Qgb2Ygc3lzdGVtIHByb3BlcnRpZXMgYW5kL29yIHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHZhbGlkaXR5LCBhbmQKLSAgICAgKiBleGlzdGluZyBkaXJlY3RvciwgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZS4KLSAgICAgKiBAcGFyYW0gbmFtZXMKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBwcm9wZXJ0eS92YXJpYWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFZhbGlkUGF0aChTdHJpbmcuLi4gbmFtZXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aDsKLSAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhdGggPSBTeXN0ZW0uZ2V0ZW52KG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9hbnR0YXNrcy8uY2xhc3NwYXRoIGIvdG9vbHMvYW50dGFza3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjZTE1YS4uMDAwMDAwMAotLS0gYS90b29scy9hbnR0YXNrcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvU2RrTGliIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQU5EUk9JRF9TUkMvcHJlYnVpbHQvY29tbW9uL2FudC9hbnQuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL0Fwa0J1aWxkZXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYW50dGFza3MvLmdpdGlnbm9yZSBiL3Rvb2xzL2FudHRhc2tzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTk1MDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW50dGFza3MvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2FudHRhc2tzLy5wcm9qZWN0IGIvdG9vbHMvYW50dGFza3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDFiNjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW50dGFza3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5hbnQtdGFza3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYW50dGFza3MvQW5kcm9pZC5tayBiL3Rvb2xzL2FudHRhc2tzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWU5MDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW50dGFza3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1BTlRUQVNLU19MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChBTlRUQVNLU19MT0NBTF9ESVIpL3NyYy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9hbnR0YXNrcy9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2FudHRhc2tzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ2ZDNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FudHRhc2tzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgICAgICBzZGtsaWIgXAotICAgICAgICBhcGtidWlsZGVyIFwKLSAgICAgICAgYW50Ci0KLUxPQ0FMX01PRFVMRSA6PSBhbnR0YXNrcwotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2FudHRhc2tzL3NyYy9jb20vYW5kcm9pZC9hbnQvQWFwdEV4ZWNMb29wVGFzay5qYXZhIGIvdG9vbHMvYW50dGFza3Mvc3JjL2NvbS9hbmRyb2lkL2FudC9BYXB0RXhlY0xvb3BUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjhmNDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvYW50dGFza3Mvc3JjL2NvbS9hbmRyb2lkL2FudC9BYXB0RXhlY0xvb3BUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuQXBrQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5BcGtTZXR0aW5nczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllcy5Qcm9wZXJ0eVR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogVGFzayBhYmxlIHRvIHJ1biBhbiBFeGVjIHRhc2sgb24gYWFwdCBzZXZlcmFsIHRpbWVzLgotICogSXQgZG9lcyBub3QgZm9sbG93IHRoZSBleGVjIHRhc2sgZm9ybWF0LCBpbnN0ZWFkIGl0IGhhcyBpdHMgb3duIHBhcmFtZXRlcnMsIHdoaWNoIG1hcHMKLSAqIGRpcmVjdGx5IHRvIGFhcHQuCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWFwdEV4ZWNMb29wVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUV4ZWN1dGFibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1hbmQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1hbmlmZXN0OwotICAgIHByaXZhdGUgU3RyaW5nIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFzc2V0czsKLSAgICBwcml2YXRlIFN0cmluZyBtQW5kcm9pZEphcjsKLSAgICBwcml2YXRlIFN0cmluZyBtT3V0Rm9sZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIG1CYXNlTmFtZTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAiZXhlY3V0YWJsZSIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBleGVjdXRhYmxlIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBleGVjdXRhYmxlKSB7Ci0gICAgICAgIG1FeGVjdXRhYmxlID0gZXhlY3V0YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgImNvbW1hbmQiIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJtYW5pZmVzdCIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBtYW5pZmVzdCB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoUGF0aCBtYW5pZmVzdCkgewotICAgICAgICBtTWFuaWZlc3QgPSBtYW5pZmVzdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAicmVzb3VyY2VzIiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFBhdGggcmVzb3VyY2VzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSByZXNvdXJjZXMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgImFzc2V0cyIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBhc3NldHMgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFzc2V0cyhQYXRoIGFzc2V0cykgewotICAgICAgICBtQXNzZXRzID0gYXNzZXRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJhbmRyb2lkamFyIiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGFuZHJvaWRKYXIgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuZHJvaWRqYXIoUGF0aCBhbmRyb2lkSmFyKSB7Ci0gICAgICAgIG1BbmRyb2lkSmFyID0gYW5kcm9pZEphci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAib3V0Zm9sZGVyIiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIG91dEZvbGRlciB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0Zm9sZGVyKFBhdGggb3V0Rm9sZGVyKSB7Ci0gICAgICAgIG1PdXRGb2xkZXIgPSBvdXRGb2xkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgImJhc2VuYW1lIiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGJhc2VOYW1lIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlbmFtZShTdHJpbmcgYmFzZU5hbWUpIHsKLSAgICAgICAgbUJhc2VOYW1lID0gYmFzZU5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBFeGVjdXRlcyB0aGUgbG9vcC4gQmFzZWQgb24gdGhlIHZhbHVlcyBpbnNpZGUgZGVmYXVsdC5wcm9wZXJ0aWVzLCB0aGlzIHdpbGwKLSAgICAgKiBjcmVhdGUgYWx0ZXJuYXRlIHRlbXBvcmFyeSBhcF8gZmlsZXMuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2plY3QgdGFza1Byb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgLy8gZmlyc3QgZG8gYSBmdWxsIHJlc291cmNlIHBhY2thZ2UKLSAgICAgICAgY3JlYXRlUGFja2FnZShudWxsIC8qY29uZmlnTmFtZSovLCBudWxsIC8qcmVzb3VyY2VGaWx0ZXIqLyk7Ci0KLSAgICAgICAgLy8gbm93IHNlZSBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSBmaWxlIHdpdGggZmlsdGVyZWQgcmVzb3VyY2VzLgotICAgICAgICAvLyBHZXQgdGhlIHByb2plY3QgYmFzZSBkaXJlY3RvcnkuCi0gICAgICAgIEZpbGUgYmFzZURpciA9IHRhc2tQcm9qZWN0LmdldEJhc2VEaXIoKTsKLSAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcGVydGllcyA9IFByb2plY3RQcm9wZXJ0aWVzLmxvYWQoYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuREVGQVVMVCk7Ci0KLQotICAgICAgICBBcGtTZXR0aW5ncyBhcGtTZXR0aW5ncyA9IEFwa0NvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0U2V0dGluZ3MocHJvcGVydGllcyk7Ci0gICAgICAgIGlmIChhcGtTZXR0aW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFwa0ZpbHRlcnMgPSBhcGtTZXR0aW5ncy5nZXRSZXNvdXJjZUZpbHRlcnMoKTsKLSAgICAgICAgICAgIGlmIChhcGtGaWx0ZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGFwa0ZpbHRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVQYWNrYWdlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVzb3VyY2UgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gY29uZmlnTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsdGVyIGNvbmZpZy4gQ2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSBhIGZ1bGwgcmVzb3VyY2UKLSAgICAgKiBwYWNrYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgotICAgICAqIEBwYXJhbSByZXNvdXJjZUZpbHRlciB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmaWx0ZXIgdG8gcGFzcyB0byBhYXB0IChpZiBjb25maWdOYW1lIGlzCi0gICAgICogbm9uIG51bGwpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2UoU3RyaW5nIGNvbmZpZ05hbWUsIFN0cmluZyByZXNvdXJjZUZpbHRlcikgewotICAgICAgICBQcm9qZWN0IHRhc2tQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIGlmIChjb25maWdOYW1lID09IG51bGwgfHwgcmVzb3VyY2VGaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBmdWxsIHJlc291cmNlIHBhY2thZ2UuLi4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgcmVzb3VyY2UgcGFja2FnZSBmb3IgY29uZmlnICclMSRzJyAoJTIkcykuLi4iLAotICAgICAgICAgICAgICAgICAgICBjb25maWdOYW1lLCByZXNvdXJjZUZpbHRlcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgdGFzayBmb3IgdGhlIGRlZmF1bHQgYXBrLgotICAgICAgICBFeGVjVGFzayB0YXNrID0gbmV3IEV4ZWNUYXNrKCk7Ci0gICAgICAgIHRhc2suc2V0RXhlY3V0YWJsZShtRXhlY3V0YWJsZSk7Ci0gICAgICAgIHRhc2suc2V0RmFpbG9uZXJyb3IodHJ1ZSk7Ci0KLSAgICAgICAgLy8gYWFwdCBjb21tYW5kLiBPbmx5ICJwYWNrYWdlIiBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lIHJlYWxseS4KLSAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShtQ29tbWFuZCk7Ci0KLSAgICAgICAgLy8gZmlsdGVycyBpZiBuZWVkZWQKLSAgICAgICAgaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCAmJiByZXNvdXJjZUZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0YXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItYyIpOwotICAgICAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShyZXNvdXJjZUZpbHRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSBmbGFnCi0gICAgICAgIHRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1mIik7Ci0KLSAgICAgICAgLy8gbWFuaWZlc3QgbG9jYXRpb24KLSAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLU0iKTsKLSAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShtTWFuaWZlc3QpOwotCi0gICAgICAgIC8vIHJlc291cmNlcyBsb2NhdGlvbi4gVGhpcyBtYXkgbm90IGV4aXN0cywgYW5kIGFhcHQgZG9lc24ndCBsaWtlIGl0LCBzbyB3ZSBjaGVjayBmaXJzdC4KLSAgICAgICAgRmlsZSByZXMgPSBuZXcgRmlsZShtUmVzb3VyY2VzKTsKLSAgICAgICAgaWYgKHJlcy5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0YXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItUyIpOwotICAgICAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShtUmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFzc2V0cyBsb2NhdGlvbi4gVGhpcyBtYXkgbm90IGV4aXN0cywgYW5kIGFhcHQgZG9lc24ndCBsaWtlIGl0LCBzbyB3ZSBjaGVjayBmaXJzdC4KLSAgICAgICAgRmlsZSBhc3NldHMgPSBuZXcgRmlsZShtQXNzZXRzKTsKLSAgICAgICAgaWYgKGFzc2V0cy5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0YXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItQSIpOwotICAgICAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShtQXNzZXRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFuZHJvaWQuamFyCi0gICAgICAgIHRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1JIik7Ci0gICAgICAgIHRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUobUFuZHJvaWRKYXIpOwotCi0gICAgICAgIC8vIG91dCBmaWxlLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvdXRGb2xkZXIsIGJhc2VOYW1lLCBhbmQgdGhlIGNvbmZpZ05hbWUgKGlmIGFwcGxpY2FibGUpCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZTsKLSAgICAgICAgaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCAmJiByZXNvdXJjZUZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG1CYXNlTmFtZSArICItIiArIGNvbmZpZ05hbWUgKyAiLmFwXyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG1CYXNlTmFtZSArICIuYXBfIjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG1PdXRGb2xkZXIsIGZpbGVuYW1lKTsKLSAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLUYiKTsKLSAgICAgICAgdGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAvLyBmaW5hbCBzZXR1cCBvZiB0aGUgdGFzawotICAgICAgICB0YXNrLnNldFByb2plY3QodGFza1Byb2plY3QpOwotICAgICAgICB0YXNrLnNldE93bmluZ1RhcmdldChnZXRPd25pbmdUYXJnZXQoKSk7Ci0KLSAgICAgICAgLy8gZXhlY3V0ZSBpdC4KLSAgICAgICAgdGFzay5leGVjdXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYW50dGFza3Mvc3JjL2NvbS9hbmRyb2lkL2FudC9BcGtCdWlsZGVyVGFzay5qYXZhIGIvdG9vbHMvYW50dGFza3Mvc3JjL2NvbS9hbmRyb2lkL2FudC9BcGtCdWlsZGVyVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VlMDJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FudHRhc2tzL3NyYy9jb20vYW5kcm9pZC9hbnQvQXBrQnVpbGRlclRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5hcGtidWlsZGVyLkFwa0J1aWxkZXIuQXBrQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuYXBrYnVpbGRlci5pbnRlcm5hbC5BcGtCdWlsZGVySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5hcGtidWlsZGVyLmludGVybmFsLkFwa0J1aWxkZXJJbXBsLkFwa0ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuQXBrQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5BcGtTZXR0aW5nczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllcy5Qcm9wZXJ0eVR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGguUGF0aEVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBBcGtCdWlsZGVyVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgLy8gcmVmIGlkIHRvIHRoZSA8cGF0aD4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBib290IGNsYXNzcGF0aHMuCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFRl9BUEtfUEFUSCA9ICJhbmRyb2lkLmFwa3MucGF0aCI7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyB0byByZXByZXNlbnQgbmVzdGVkIGVsZW1lbnRzLiBTaW5jZSB0aGV5IGFsbCBoYXZlIG9ubHkgb25lIGF0dHJpYnV0ZSAoJ3BhdGgnKSwgdGhlCi0gICAgICogc2FtZSBjbGFzcyBjYW4gYmUgdXNlZCBmb3IgYWxsIHRoZSBuZXN0ZWQgZWxlbWVudHMgKHppcCwgZmlsZSwgc291cmNlZm9sZGVyLCBqYXJmb2xkZXIsCi0gICAgICogbmF0aXZlZm9sZGVyKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFZhbHVlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7Ci0gICAgICAgIFN0cmluZyBtUGF0aDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJwYXRoIiBhdHRyaWJ1dGUuCi0gICAgICAgICAqIEBwYXJhbSBwYXRoIHRoZSB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoUGF0aCBwYXRoKSB7Ci0gICAgICAgICAgICBtUGF0aCA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1PdXRGb2xkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUJhc2VOYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmVyYm9zZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2lnbmVkID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZhbHVlPiBtWmlwTGlzdCA9IG5ldyBBcnJheUxpc3Q8VmFsdWU+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8VmFsdWU+IG1GaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8VmFsdWU+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8VmFsdWU+IG1Tb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxWYWx1ZT4oKTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxWYWx1ZT4gbUphcmZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFZhbHVlPigpOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZhbHVlPiBtSmFyZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFZhbHVlPigpOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZhbHVlPiBtTmF0aXZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8VmFsdWU+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxGaWxlSW5wdXRTdHJlYW0+IG1aaXBBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPigpOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEZpbGU+IG1BcmNoaXZlRmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8QXBrRmlsZT4gbUphdmFSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PEFwa0ZpbGU+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPiBtUmVzb3VyY2VzSmFycyA9IG5ldyBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPigpOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFwa0ZpbGU+IG1OYXRpdmVMaWJyYXJpZXMgPSBuZXcgQXJyYXlMaXN0PEFwa0ZpbGU+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgIm91dGZvbGRlciIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBvdXRGb2xkZXIgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dGZvbGRlcihQYXRoIG91dEZvbGRlcikgewotICAgICAgICBtT3V0Rm9sZGVyID0gb3V0Rm9sZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJiYXNlbmFtZSIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBiYXNlTmFtZSB0aGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZW5hbWUoU3RyaW5nIGJhc2VOYW1lKSB7Ci0gICAgICAgIG1CYXNlTmFtZSA9IGJhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAidmVyYm9zZSIgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB2ZXJib3NlIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgewotICAgICAgICBtVmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJzaWduZWQiIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gc2lnbmVkIHRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaWduZWQoYm9vbGVhbiBzaWduZWQpIHsKLSAgICAgICAgbVNpZ25lZCA9IHNpZ25lZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBuZXN0ZWQgPHZhcj56aXA8L3Zhcj4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVppcCgpIHsKLSAgICAgICAgVmFsdWUgemlwID0gbmV3IFZhbHVlKCk7Ci0gICAgICAgIG1aaXBMaXN0LmFkZCh6aXApOwotICAgICAgICByZXR1cm4gemlwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIG5lc3RlZCA8dmFyPmZpbGU8L3Zhcj4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUZpbGUoKSB7Ci0gICAgICAgIFZhbHVlIGZpbGUgPSBuZXcgVmFsdWUoKTsKLSAgICAgICAgbUZpbGVMaXN0LmFkZChmaWxlKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbmVzdGVkIDx2YXI+c291cmNlZm9sZGVyPC92YXI+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVTb3VyY2Vmb2xkZXIoKSB7Ci0gICAgICAgIFZhbHVlIGZpbGUgPSBuZXcgVmFsdWUoKTsKLSAgICAgICAgbVNvdXJjZUxpc3QuYWRkKGZpbGUpOwotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBuZXN0ZWQgPHZhcj5qYXJmb2xkZXI8L3Zhcj4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUphcmZvbGRlcigpIHsKLSAgICAgICAgVmFsdWUgZmlsZSA9IG5ldyBWYWx1ZSgpOwotICAgICAgICBtSmFyZm9sZGVyTGlzdC5hZGQoZmlsZSk7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIG5lc3RlZCA8dmFyPmphcmZpbGU8L3Zhcj4gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUphcmZpbGUoKSB7Ci0gICAgICAgIFZhbHVlIGZpbGUgPSBuZXcgVmFsdWUoKTsKLSAgICAgICAgbUphcmZpbGVMaXN0LmFkZChmaWxlKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbmVzdGVkIDx2YXI+bmF0aXZlZm9sZGVyPC92YXI+IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVOYXRpdmVmb2xkZXIoKSB7Ci0gICAgICAgIFZhbHVlIGZpbGUgPSBuZXcgVmFsdWUoKTsKLSAgICAgICAgbU5hdGl2ZUxpc3QuYWRkKGZpbGUpOwotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBhbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIEFwa0J1aWxkZXJJbXBsIGFwa0J1aWxkZXIgPSBuZXcgQXBrQnVpbGRlckltcGwoKTsKLSAgICAgICAgYXBrQnVpbGRlci5zZXRWZXJib3NlKG1WZXJib3NlKTsKLSAgICAgICAgYXBrQnVpbGRlci5zZXRTaWduZWRQYWNrYWdlKG1TaWduZWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzZXR1cCB0aGUgbGlzdCBvZiBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gZ28gaW4gdGhlIGFyY2hpdmUuCi0KLSAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgemlwIGZpbGVzIHRvIGFkZC4gVGhpcyB3aWxsIG5vdCBpbmNsdWRlCi0gICAgICAgICAgICAvLyB0aGUgcmVzb3VyY2UgcGFja2FnZSwgd2hpY2ggaXMgaGFuZGxlZCBzZXBhcmFseSBmb3IgZWFjaCBhcGsgdG8gY3JlYXRlLgotICAgICAgICAgICAgZm9yIChWYWx1ZSB2IDogbVppcExpc3QpIHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHYubVBhdGgpOwotICAgICAgICAgICAgICAgIG1aaXBBcmNoaXZlcy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBvZiBmaWxlIHRvIGRpcmVjdGx5IGFkZCB0aGUgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICBmb3IgKFZhbHVlIHYgOiBtRmlsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBtQXJjaGl2ZUZpbGVzLmFkZChBcGtCdWlsZGVySW1wbC5nZXRJbnB1dEZpbGUodi5tUGF0aCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBvZiBmaWxlIHRvIGRpcmVjdGx5IGFkZCB0aGUgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICBmb3IgKFZhbHVlIHYgOiBtU291cmNlTGlzdCkgewotICAgICAgICAgICAgICAgIEFwa0J1aWxkZXJJbXBsLnByb2Nlc3NTb3VyY2VGb2xkZXJGb3JSZXNvdXJjZSh2Lm1QYXRoLCBtSmF2YVJlc291cmNlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IG9mIGphciBmb2xkZXJzLgotICAgICAgICAgICAgZm9yIChWYWx1ZSB2IDogbUphcmZvbGRlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBBcGtCdWlsZGVySW1wbC5wcm9jZXNzSmFyRm9sZGVyKHYubVBhdGgsIG1SZXNvdXJjZXNKYXJzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IGdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgamFyIGZpbGVzLgotICAgICAgICAgICAgZm9yIChWYWx1ZSB2IDogbUphcmZpbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgQXBrQnVpbGRlckltcGwucHJvY2Vzc0phckZpbGUodi5tUGF0aCwgbVJlc291cmNlc0phcnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgdGhlIG5hdGl2ZSBsaWIgZm9sZGVyLgotICAgICAgICAgICAgZm9yIChWYWx1ZSB2IDogbU5hdGl2ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gdi5tUGF0aDsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXJhbWV0ZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGdldCB0aGUgcmVsYXRpdmUgcGF0aAotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBwYXJhbWV0ZXIubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXBrQnVpbGRlckltcGwucHJvY2Vzc05hdGl2ZUZvbGRlcihvZmZzZXQsIGYsIG1OYXRpdmVMaWJyYXJpZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIFBhdGggaXRlbSB0aGF0IHdpbGwgY29udGFpbiBhbGwgdGhlIGdlbmVyYXRlZCBBUEtzCi0gICAgICAgICAgICAvLyBmb3IgcmV1c2UgYnkgb3RoZXIgdGFyZ2V0cyAoc2lnbmluZy96aXBhbGlnbmluZykKLSAgICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGFudFByb2plY3QpOwotCi0gICAgICAgICAgICAvLyBUaGUgY3JlYXRlQXBrIG1ldGhvZCB1c2VzIG1CYXNlTmFtZSBmb3IgdGhlIGJhc2UgbmFtZSBvZiB0aGUgcGFja2FnZXMgKHJlc291cmNlcwotICAgICAgICAgICAgLy8gYW5kIGFwayBmaWxlcykuCi0gICAgICAgICAgICAvLyBUaGUgZ2VuZXJhdGVkIGFwayBmaWxlIG5hbWUgaXMKLSAgICAgICAgICAgIC8vIGRlYnVnOiAgIHtiYXNlfVste2NvbmZpZ31dLWRlYnVnLXVuYWxpZ25lZC5hcGsKLSAgICAgICAgICAgIC8vIHJlbGVhc2U6IHtiYXNlfVste2NvbmZpZ31dLXVuc2lnbmVkLmFwawotICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBmb3IgMS41IHByb2plY3RzIGFuZCBiZWZvcmUgdGhlICdpbnN0YWxsJyBhbnQgdGFyZ2V0IGV4cGVjdHMgdGhlIG5hbWUKLSAgICAgICAgICAgIC8vIG9mIHRoZSBkZWZhdWx0IGRlYnVnIHBhY2thZ2UgdG8gYmUge2Jhc2V9LWRlYnVnLmFwawotICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aG9zZSBwYWNrYWdlLCB3ZSBsb29rIGZvciB0aGUgJ291dC5kZWJ1Zy51bmFsaWduZWQucGFja2FnZScKLSAgICAgICAgICAgIC8vIHByb3BlcnR5LiBJZiB0aGlzIGV4aXN0LCB0aGVuIHdlIGdlbmVyYXRlIHtiYXNlfVste2NvbmZpZ31dLWRlYnVnLXVuYWxpZ25lZC5hcGsKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBnZW5lcmF0ZSB7YmFzZX1bLXtjb25maWd9XS1kZWJ1Zy5hcGsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBNYWtlIGFwa2J1aWxkZXIgZXhwb3J0IHRoZSBwYWNrYWdlIG5hbWUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAvLyBoYXZpbmcgdG8ga2VlcCBhcGtidWlsZGVyIGFuZCB0aGUgcnVsZXMgZmlsZSBpbiBzeW5jCi0gICAgICAgICAgICBTdHJpbmcgZGVidWdQYWNrYWdlU3VmZml4ID0gIi1kZWJ1Zy11bmFsaWduZWQuYXBrIjsKLSAgICAgICAgICAgIGlmIChhbnRQcm9qZWN0LmdldFByb3BlcnR5KCJvdXQuZGVidWcudW5hbGlnbmVkLnBhY2thZ2UiKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGFudFByb2plY3QuZ2V0UHJvcGVydHkoIm91dC1kZWJ1Zy11bmFsaWduZWQtcGFja2FnZSIpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWJ1Z1BhY2thZ2VTdWZmaXggPSAiLWRlYnVnLmFwayI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZpcnN0IGRvIGEgZnVsbCByZXNvdXJjZSBwYWNrYWdlCi0gICAgICAgICAgICBjcmVhdGVBcGsoYXBrQnVpbGRlciwgbnVsbCAvKmNvbmZpZ05hbWUqLywgbnVsbCAvKnJlc291cmNlRmlsdGVyKi8sIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnUGFja2FnZVN1ZmZpeCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBzZWUgaWYgd2UgbmVlZCB0byBjcmVhdGUgZmlsZSB3aXRoIGZpbHRlcmVkIHJlc291cmNlcy4KLSAgICAgICAgICAgIC8vIEdldCB0aGUgcHJvamVjdCBiYXNlIGRpcmVjdG9yeS4KLSAgICAgICAgICAgIEZpbGUgYmFzZURpciA9IGFudFByb2plY3QuZ2V0QmFzZURpcigpOwotICAgICAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcGVydGllcyA9IFByb2plY3RQcm9wZXJ0aWVzLmxvYWQoYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkRFRkFVTFQpOwotCi0gICAgICAgICAgICBBcGtTZXR0aW5ncyBhcGtTZXR0aW5ncyA9IEFwa0NvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0U2V0dGluZ3MocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBpZiAoYXBrU2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXBrRmlsdGVycyA9IGFwa1NldHRpbmdzLmdldFJlc291cmNlRmlsdGVycygpOwotICAgICAgICAgICAgICAgIGlmIChhcGtGaWx0ZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBhcGtGaWx0ZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFwayhhcGtCdWlsZGVyLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdQYWNrYWdlU3VmZml4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmluYWxseSBzZXRzIHRoZSBwYXRoIGluIHRoZSBwcm9qZWN0IHdpdGggYSByZWZlcmVuY2UKLSAgICAgICAgICAgIGFudFByb2plY3QuYWRkUmVmZXJlbmNlKFJFRl9BUEtfUEFUSCwgcGF0aCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoQXBrQ3JlYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBhcGtCdWlsZGVyCi0gICAgICogQHBhcmFtIGNvbmZpZ05hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciBjb25maWcuIENhbiBiZSBudWxsIGluIHdoaWNoIGNhc2UgYSBmdWxsIHJlc291cmNlCi0gICAgICogcGFja2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VGaWx0ZXIgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gZmlsdGVyIHRvIHBhc3MgdG8gYWFwdCAoaWYgY29uZmlnTmFtZSBpcwotICAgICAqIG5vbiBudWxsKQotICAgICAqIEBwYXJhbSBwYXRoIEFudCB7QGxpbmsgUGF0aH0gdG8gd2hpY2ggYWRkIHRoZSBnZW5lcmF0ZWQgQVBLcyBhcyB7QGxpbmsgUGF0aEVsZW1lbnR9Ci0gICAgICogQHBhcmFtIGRlYnVnUGFja2FnZVN1ZmZpeCBzdWZmaXggZm9yIHRoZSBkZWJ1ZyBwYWNrYWdlcy4KLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQXBrQ3JlYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXBrKEFwa0J1aWxkZXJJbXBsIGFwa0J1aWxkZXIsIFN0cmluZyBjb25maWdOYW1lLCBTdHJpbmcgcmVzb3VyY2VGaWx0ZXIsCi0gICAgICAgICAgICBQYXRoIHBhdGgsIFN0cmluZyBkZWJ1Z1BhY2thZ2VTdWZmaXgpCi0gICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBcGtDcmVhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEFsbCB0aGUgZmlsZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUgaGF2ZSBhbHJlYWR5IGJlZW4gcHJlcCdlZCB1cCwgZXhjZXB0Ci0gICAgICAgIC8vIHRoZSByZXNvdXJjZSBwYWNrYWdlLgotICAgICAgICAvLyBmaWd1cmUgb3V0IGl0cyBuYW1lLgotICAgICAgICBTdHJpbmcgZmlsZW5hbWU7Ci0gICAgICAgIGlmIChjb25maWdOYW1lICE9IG51bGwgJiYgcmVzb3VyY2VGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZW5hbWUgPSBtQmFzZU5hbWUgKyAiLSIgKyBjb25maWdOYW1lICsgIi5hcF8iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsZW5hbWUgPSBtQmFzZU5hbWUgKyAiLmFwXyI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgd2UgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHppcCBhcmNoaXZlIChpdCdzIGp1c3QgYSB6aXAgZmlsZSkuCi0KLSAgICAgICAgLy8gaXQncyB1c2VkIGFzIGEgemlwIGFyY2hpdmUgaW5wdXQKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHJlc291Y2VQYWNrYWdlWmlwRmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUobU91dEZvbGRlciwgZmlsZW5hbWUpKTsKLSAgICAgICAgbVppcEFyY2hpdmVzLmFkZChyZXNvdWNlUGFja2FnZVppcEZpbGUpOwotCi0gICAgICAgIC8vIHByZXBhcmUgdGhlIGZpbGVuYW1lIHRvIGdlbmVyYXRlLiBTYW1lIHRoaW5nIGFzIHRoZSByZXNvdXJjZSBmaWxlLgotICAgICAgICBpZiAoY29uZmlnTmFtZSAhPSBudWxsICYmIHJlc291cmNlRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gbUJhc2VOYW1lICsgIi0iICsgY29uZmlnTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gbUJhc2VOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TaWduZWQpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyBkZWJ1Z1BhY2thZ2VTdWZmaXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi11bnNpZ25lZC5hcGsiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ05hbWUgPT0gbnVsbCB8fCByZXNvdXJjZUZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVNpZ25lZCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nICVzIGFuZCBzaWduaW5nIGl0IHdpdGggYSBkZWJ1ZyBrZXkuLi4iLCBmaWxlbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyAlcyBmb3IgcmVsZWFzZS4uLiIsIGZpbGVuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpZ25lZCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nICUxJHMgKHdpdGggJTIkcykgYW5kIHNpZ25pbmcgaXQgd2l0aCBhIGRlYnVnIGtleS4uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgcmVzb3VyY2VGaWx0ZXIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgJTEkcyAod2l0aCAlMiRzKSBmb3IgcmVsZWFzZS4uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgcmVzb3VyY2VGaWx0ZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG91dCBGaWxlCi0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKG1PdXRGb2xkZXIsIGZpbGVuYW1lKTsKLQotICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIFBhdGggb2JqZWN0Ci0gICAgICAgIFBhdGhFbGVtZW50IGVsZW1lbnQgPSBwYXRoLmNyZWF0ZVBhdGhFbGVtZW50KCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0TG9jYXRpb24oZik7Ci0KLSAgICAgICAgLy8gYW5kIGdlbmVyYXRlIHRoZSBhcGsKLSAgICAgICAgYXBrQnVpbGRlci5jcmVhdGVQYWNrYWdlKGYuZ2V0QWJzb2x1dGVGaWxlKCksIG1aaXBBcmNoaXZlcywKLSAgICAgICAgICAgICAgICBtQXJjaGl2ZUZpbGVzLCBtSmF2YVJlc291cmNlcywgbVJlc291cmNlc0phcnMsIG1OYXRpdmVMaWJyYXJpZXMpOwotCi0gICAgICAgIC8vIHdlIGFyZSBkb25lLiBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgcmVzb3VyY2UgcGFja2FnZSBmcm9tIHRoZSBsaXN0IG9mIHppcCBhcmNoaXZlcwotICAgICAgICAvLyBpbiBjYXNlIHdlIGhhdmUgYW5vdGhlciBhcGsgdG8gZ2VuZXJhdGUuCi0gICAgICAgIG1aaXBBcmNoaXZlcy5yZW1vdmUocmVzb3VjZVBhY2thZ2VaaXBGaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9hbnR0YXNrcy9zcmMvY29tL2FuZHJvaWQvYW50L1NldHVwVGFzay5qYXZhIGIvdG9vbHMvYW50dGFza3Mvc3JjL2NvbS9hbmRyb2lkL2FudC9TZXR1cFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzY2NjZC4uMDAwMDAwMAotLS0gYS90b29scy9hbnR0YXNrcy9zcmMvY29tL2FuZHJvaWQvYW50L1NldHVwVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmFudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0LklPcHRpb25hbExpYnJhcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuUHJvamVjdFByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkWFBhdGhGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi54bWwuQW5kcm9pZE1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5JbXBvcnRUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aC5QYXRoRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KLS8qKgotICogU2V0dXAvSW1wb3J0IEFudCB0YXNrLiBUaGlzIHRhc2sgYWNjb21wbGlzaGVzOgotICogPHVsPgotICogPGxpPkdldHMgdGhlIHByb2plY3QgdGFyZ2V0IGhhc2ggc3RyaW5nIGZyb20ge0BsaW5rIFByb2plY3RQcm9wZXJ0aWVzI1BST1BFUlRZX1RBUkdFVH0sCi0gKiBhbmQgcmVzb2x2ZXMgaXQgdG8gZ2V0IHRoZSBwcm9qZWN0J3Mge0BsaW5rIElBbmRyb2lkVGFyZ2V0fS48L2xpPgotICogPGxpPlNldHMgdXAgcHJvcGVydGllcyBzbyB0aGF0IGFhcHQgY2FuIGZpbmQgdGhlIGFuZHJvaWQuamFyIGluIHRoZSByZXNvbHZlZCB0YXJnZXQuPC9saT4KLSAqIDxsaT5TZXRzIHVwIHRoZSBib290IGNsYXNzcGF0aCByZWYgc28gdGhhdCB0aGUgPGNvZGU+amF2YWM8L2NvZGU+IHRhc2sga25vd3Mgd2hlcmUgdG8gZmluZAotICogdGhlIGxpYnJhcmllcy4gVGhpcyBpbmNsdWRlcyB0aGUgZGVmYXVsdCBhbmRyb2lkLmphciBmcm9tIHRoZSByZXNvbHZlZCB0YXJnZXQgYnV0IGFsc28gb3B0aW9uYWwKLSAqIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGUgdGFyZ2V0IChpZiBhbnksIHdoZW4gdGhlIHRhcmdldCBpcyBhbiBhZGQtb24pLjwvbGk+Ci0gKiA8bGk+SW1wb3J0cyB0aGUgYnVpbGQgcnVsZXMgbG9jYXRlZCBpbiB0aGUgcmVzb2x2ZWQgdGFyZ2V0IHNvIHRoYXQgdGhlIGJ1aWxkIGFjdHVhbGx5IGRvZXMKLSAqIHNvbWV0aGluZy4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYXR0cmlidXRlIDx2YXI+aW1wb3J0PC92YXI+IHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4KLSAqIDwvbGk+PC91bD4KLSAqCi0gKiBUaGlzIGlzIHVzZWQgaW4gYnVpbGQueG1sL3RlbXBsYXRlLgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNldHVwVGFzayBleHRlbmRzIEltcG9ydFRhc2sgewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBTkRST0lEX1JVTEVTID0gImFuZHJvaWRfcnVsZXMueG1sIjsKLSAgICAvLyBhZGRpdGlvbmFsIGFuZHJvaWQgcnVsZXMgZm9yIHRlc3QgcHJvamVjdCAtIGRlcGVuZHMgb24gYW5kcm9pZF9ydWxlcy54bWwKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5EUk9JRF9URVNUX1JVTEVTID0gImFuZHJvaWRfdGVzdF9ydWxlcy54bWwiOwotICAgIC8vIGFudCBwcm9wZXJ0eSB3aXRoIHRoZSBwYXRoIHRvIHRoZSBhbmRyb2lkLmphcgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9BTkRST0lEX0pBUiA9ICJhbmRyb2lkLmphciI7Ci0gICAgLy8gTEVHQUNZIC0gY29tcGF0aWJpbGl0eSB3aXRoIDEuNiBhbmQgYmVmb3JlCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0FORFJPSURfSkFSX0xFR0FDWSA9ICJhbmRyb2lkLWphciI7Ci0gICAgLy8gYW50IHByb3BlcnR5IHdpdGggdGhlIHBhdGggdG8gdGhlIGZyYW1ld29yay5qYXIKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfQU5EUk9JRF9BSURMID0gImFuZHJvaWQuYWlkbCI7Ci0gICAgLy8gTEVHQUNZIC0gY29tcGF0aWJpbGl0eSB3aXRoIDEuNiBhbmQgYmVmb3JlCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0FORFJPSURfQUlETF9MRUdBQ1kgPSAiYW5kcm9pZC1haWRsIjsKLSAgICAvLyBhbnQgcHJvcGVydHkgd2l0aCB0aGUgcGF0aCB0byB0aGUgYWFwdCB0b29sCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0FBUFQgPSAiYWFwdCI7Ci0gICAgLy8gYW50IHByb3BlcnR5IHdpdGggdGhlIHBhdGggdG8gdGhlIGFpZGwgdG9vbAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9BSURMID0gImFpZGwiOwotICAgIC8vIGFudCBwcm9wZXJ0eSB3aXRoIHRoZSBwYXRoIHRvIHRoZSBkeCB0b29sCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0RYID0gImR4IjsKLSAgICAvLyByZWYgaWQgdG8gdGhlIDxwYXRoPiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGJvb3QgY2xhc3NwYXRocy4KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVGX0NMQVNTUEFUSCA9ICJhbmRyb2lkLnRhcmdldC5jbGFzc3BhdGgiOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Eb0ltcG9ydCA9IHRydWU7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBhbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgU0RLIGxvY2F0aW9uCi0gICAgICAgIFN0cmluZyBzZGtMb2NhdGlvbiA9IGFudFByb2plY3QuZ2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfU0RLKTsKLQotICAgICAgICAvLyBjaGVjayBpZiBpdCdzIHZhbGlkIGFuZCBleGlzdHMKLSAgICAgICAgaWYgKHNka0xvY2F0aW9uID09IG51bGwgfHwgc2RrTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gTEVHQUNZIHN1cHBvcnQ6IHByb2plY3QgY3JlYXRlZCB3aXRoIDEuNiBvciBiZWZvcmUgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50Ci0gICAgICAgICAgICAvLyBwcm9wZXJ0eSB0byBkZWNsYXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgU0RLLiBBdCB0aGlzIHBvaW50LCB3ZSBjYW5ub3QKLSAgICAgICAgICAgIC8vIHlldCBjaGVjayB3aGljaCB0YXJnZXQgaXMgcnVubmluZyBzbyB3ZSBjaGVjayBib3RoIGFsd2F5cy4KLSAgICAgICAgICAgIHNka0xvY2F0aW9uID0gYW50UHJvamVjdC5nZXRQcm9wZXJ0eShQcm9qZWN0UHJvcGVydGllcy5QUk9QRVJUWV9TREtfTEVHQUNZKTsKLSAgICAgICAgICAgIGlmIChzZGtMb2NhdGlvbiA9PSBudWxsIHx8IHNka0xvY2F0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNESyBMb2NhdGlvbiBpcyBub3Qgc2V0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBzZGsgPSBuZXcgRmlsZShzZGtMb2NhdGlvbik7Ci0gICAgICAgIGlmIChzZGsuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNESyBMb2NhdGlvbiAnJXMnIGlzIG5vdCB2YWxpZC4iLCBzZGtMb2NhdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB0YXJnZXQgcHJvcGVydHkgdmFsdWUKLSAgICAgICAgU3RyaW5nIHRhcmdldEhhc2hTdHJpbmcgPSBhbnRQcm9qZWN0LmdldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX1RBUkdFVCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQcm9qZWN0ID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGFudFByb2plY3QuZ2V0UHJvcGVydHkoInRlc3RlZC5wcm9qZWN0LmRpciIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzVGVzdFByb2plY3QgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldEhhc2hTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBbmRyb2lkIFRhcmdldCBpcyBub3Qgc2V0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9hZCB1cCB0aGUgc2RrIHRhcmdldHMuCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFNka01hbmFnZXIgbWFuYWdlciA9IFNka01hbmFnZXIuY3JlYXRlTWFuYWdlcihzZGtMb2NhdGlvbiwgbmV3IElTZGtMb2coKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihUaHJvd2FibGUgdCwgU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgICAgIGlmIChlcnJvckZvcm1hdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KCJFcnJvcjogIiArIGVycm9yRm9ybWF0LCBhcmdzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMuYWRkKCJFcnJvcjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50ZihTdHJpbmcgbXNnRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KG1zZ0Zvcm1hdCwgYXJncykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyB3YXJuaW5nRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KCJXYXJuaW5nOiAiICsgd2FybmluZ0Zvcm1hdCwgYXJncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzaW5jZSB3ZSBmYWlsZWQgdG8gcGFyc2UgdGhlIFNESywgbGV0cyBkaXNwbGF5IHRoZSBwYXJzaW5nIG91dHB1dC4KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBTREsgY29udGVudC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlc29sdmUgaXQKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgYW5kcm9pZFRhcmdldCA9IG1hbmFnZXIuZ2V0VGFyZ2V0RnJvbUhhc2hTdHJpbmcodGFyZ2V0SGFzaFN0cmluZyk7Ci0KLSAgICAgICAgaWYgKGFuZHJvaWRUYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVzb2x2ZSB0YXJnZXQgJyVzJyIsIHRhcmdldEhhc2hTdHJpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRpc3BsYXkgaXQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0IFRhcmdldDogIiArIGFuZHJvaWRUYXJnZXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGFuZHJvaWRUYXJnZXQuaXNQbGF0Zm9ybSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlbmRvcjogIiArIGFuZHJvaWRUYXJnZXQuZ2V0VmVuZG9yKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQbGF0Zm9ybSBWZXJzaW9uOiAiICsgYW5kcm9pZFRhcmdldC5nZXRWZXJzaW9uTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFQSSBsZXZlbDogIiArIGFuZHJvaWRUYXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKTsKLQotICAgICAgICAvLyBhbHdheXMgY2hlY2sgdGhlIG1hbmlmZXN0IG1pblNka1ZlcnNpb24uCi0gICAgICAgIGNoZWNrTWFuaWZlc3QoYW50UHJvamVjdCwgYW5kcm9pZFRhcmdldC5nZXRWZXJzaW9uKCkpOwotCi0gICAgICAgIC8vIHNldHMgdXAgdGhlIHByb3BlcnRpZXMgdG8gZmluZCBhbmRyb2lkLmphci9mcmFtZXdvcmsuYWlkbC90YXJnZXQgdG9vbHMKLSAgICAgICAgU3RyaW5nIGFuZHJvaWRKYXIgPSBhbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQU5EUk9JRF9KQVIpOwotICAgICAgICBhbnRQcm9qZWN0LnNldFByb3BlcnR5KFBST1BFUlRZX0FORFJPSURfSkFSLCBhbmRyb2lkSmFyKTsKLQotICAgICAgICBTdHJpbmcgYW5kcm9pZEFpZGwgPSBhbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQU5EUk9JRF9BSURMKTsKLSAgICAgICAgYW50UHJvamVjdC5zZXRQcm9wZXJ0eShQUk9QRVJUWV9BTkRST0lEX0FJREwsIGFuZHJvaWRBaWRsKTsKLQotICAgICAgICBhbnRQcm9qZWN0LnNldFByb3BlcnR5KFBST1BFUlRZX0FBUFQsIGFuZHJvaWRUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5BQVBUKSk7Ci0gICAgICAgIGFudFByb2plY3Quc2V0UHJvcGVydHkoUFJPUEVSVFlfQUlETCwgYW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFJREwpKTsKLSAgICAgICAgYW50UHJvamVjdC5zZXRQcm9wZXJ0eShQUk9QRVJUWV9EWCwgYW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkRYKSk7Ci0KLSAgICAgICAgLy8gc2V0cyB1cCB0aGUgYm9vdCBjbGFzc3BhdGgKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIFBhdGggb2JqZWN0Ci0gICAgICAgIFBhdGggYm9vdGNsYXNzcGF0aCA9IG5ldyBQYXRoKGFudFByb2plY3QpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIFBhdGhFbGVtZW50IGZvciB0aGUgZnJhbWV3b3JrIGphcgotICAgICAgICBQYXRoRWxlbWVudCBlbGVtZW50ID0gYm9vdGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpOwotICAgICAgICBlbGVtZW50LnNldFBhdGgoYW5kcm9pZEphcik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIFBhdGhFbGVtZW50IGZvciBlYWNoIG9wdGlvbmFsIGxpYnJhcnkuCi0gICAgICAgIElPcHRpb25hbExpYnJhcnlbXSBsaWJyYXJpZXMgPSBhbmRyb2lkVGFyZ2V0LmdldE9wdGlvbmFsTGlicmFyaWVzKCk7Ci0gICAgICAgIGlmIChsaWJyYXJpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSGFzaFNldDxTdHJpbmc+IHZpc2l0ZWRKYXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChJT3B0aW9uYWxMaWJyYXJ5IGxpYnJhcnkgOiBsaWJyYXJpZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgamFyUGF0aCA9IGxpYnJhcnkuZ2V0SmFyUGF0aCgpOwotICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkSmFycy5jb250YWlucyhqYXJQYXRoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpdGVkSmFycy5hZGQoamFyUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGJvb3RjbGFzc3BhdGguY3JlYXRlUGF0aEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRQYXRoKGxpYnJhcnkuZ2V0SmFyUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5hbGx5IHNldHMgdGhlIHBhdGggaW4gdGhlIHByb2plY3Qgd2l0aCBhIHJlZmVyZW5jZQotICAgICAgICBhbnRQcm9qZWN0LmFkZFJlZmVyZW5jZShSRUZfQ0xBU1NQQVRILCBib290Y2xhc3NwYXRoKTsKLQotICAgICAgICAvLyBmaW5kIHRoZSBmaWxlIHRvIGltcG9ydCwgYW5kIGltcG9ydCBpdC4KLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlRm9sZGVyID0gYW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlRFTVBMQVRFUyk7Ci0KLSAgICAgICAgLy8gTEVHQUNZIHN1cHBvcnQuIGFuZHJvaWRfcnVsZXMueG1sIGluIG9sZGVyIHBsYXRmb3JtcyBleHBlY3RzIHByb3BlcnRpZXMgd2l0aAotICAgICAgICAvLyBvbGRlciBuYW1lcy4gVGhpcyBzZXRzIHRob3NlIHByb3BlcnRpZXMgdG8gbWFrZSBzdXJlIHRoZSBydWxlcyB3aWxsIHdvcmsuCi0gICAgICAgIGlmIChhbmRyb2lkVGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlMZXZlbCgpIDw9IDQpIHsgLy8gMS42IGFuZCBlYXJsaWVyCi0gICAgICAgICAgICBhbnRQcm9qZWN0LnNldFByb3BlcnR5KFBST1BFUlRZX0FORFJPSURfSkFSX0xFR0FDWSwgYW5kcm9pZEphcik7Ci0gICAgICAgICAgICBhbnRQcm9qZWN0LnNldFByb3BlcnR5KFBST1BFUlRZX0FORFJPSURfQUlETF9MRUdBQ1ksIGFuZHJvaWRBaWRsKTsKLSAgICAgICAgICAgIGFudFByb2plY3Quc2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfU0RLX0xFR0FDWSwgc2RrTG9jYXRpb24pOwotICAgICAgICAgICAgU3RyaW5nIGFwcFBhY2thZ2UgPSBhbnRQcm9qZWN0LmdldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX0FQUF9QQUNLQUdFKTsKLSAgICAgICAgICAgIGlmIChhcHBQYWNrYWdlICE9IG51bGwgJiYgYXBwUGFja2FnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbnRQcm9qZWN0LnNldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX0FQUF9QQUNLQUdFX0xFR0FDWSwgYXBwUGFja2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgdGhlIGltcG9ydCBzZWN0aW9uLiBUaGlzIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIHRhc2sgYWN0dWFsbHkgaGFzIHRvIGltcG9ydCBhIGZpbGUuCi0gICAgICAgIGlmIChtRG9JbXBvcnQpIHsKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBleGlzdHMuCi0gICAgICAgICAgICBGaWxlIHRlbXBsYXRlcyA9IG5ldyBGaWxlKHRlbXBsYXRlRm9sZGVyKTsKLQotICAgICAgICAgICAgaWYgKHRlbXBsYXRlcy5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRlbXBsYXRlIGRpcmVjdG9yeSAnJXMnIGlzIG1pc3NpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRm9sZGVyKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZFJ1bGVzRmlsZU5hbWUgPSBpc1Rlc3RQcm9qZWN0ID8gQU5EUk9JRF9URVNUX1JVTEVTIDogQU5EUk9JRF9SVUxFUzsKLQotICAgICAgICAgICAgLy8gbm93IGNoZWNrIHRoZSBydWxlcyBmaWxlIGV4aXN0cy4KLSAgICAgICAgICAgIEZpbGUgcnVsZXMgPSBuZXcgRmlsZSh0ZW1wbGF0ZUZvbGRlciwgaW1wb3J0ZWRSdWxlc0ZpbGVOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHJ1bGVzLmlzRmlsZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkJ1aWxkIHJ1bGVzIGZpbGUgJyVzJyBpcyBtaXNzaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZvbGRlcikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGZpbGUgbG9jYXRpb24gdG8gaW1wb3J0Ci0gICAgICAgICAgICBzZXRGaWxlKHJ1bGVzLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAgICAgLy8gYW5kIGltcG9ydAotICAgICAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICJpbXBvcnQiIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydChib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIG1Eb0ltcG9ydCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbWFuaWZlc3QgPGNvZGU+bWluU2RrVmVyc2lvbjwvY29kZT4gYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBhbnRQcm9qZWN0IHRoZSBhbnQgcHJvamVjdAotICAgICAqIEBwYXJhbSBhbmRyb2lkVmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcGxhdGZvcm0gdGhlIHByb2plY3QgaXMgY29tcGlsaW5nIGFnYWluc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWFuaWZlc3QoUHJvamVjdCBhbnRQcm9qZWN0LCBBbmRyb2lkVmVyc2lvbiBhbmRyb2lkVmVyc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBtYW5pZmVzdCA9IG5ldyBGaWxlKGFudFByb2plY3QuZ2V0QmFzZURpcigpLCAiQW5kcm9pZE1hbmlmZXN0LnhtbCIpOwotCi0gICAgICAgICAgICBYUGF0aCB4UGF0aCA9IEFuZHJvaWRYUGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0geFBhdGguZXZhbHVhdGUoCi0gICAgICAgICAgICAgICAgICAgICIvIiAgKyBBbmRyb2lkTWFuaWZlc3QuTk9ERV9NQU5JRkVTVCArCi0gICAgICAgICAgICAgICAgICAgICIvIiAgKyBBbmRyb2lkTWFuaWZlc3QuTk9ERV9VU0VTX1NESyArCi0gICAgICAgICAgICAgICAgICAgICIvQCIgKyBBbmRyb2lkWFBhdGhGYWN0b3J5LkRFRkFVTFRfTlNfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX01JTl9TREtfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3QpKSk7Ci0KLSAgICAgICAgICAgIGlmIChhbmRyb2lkVmVyc2lvbi5pc1ByZXZpZXcoKSkgewotICAgICAgICAgICAgICAgIC8vIGluIHByZXZpZXcgbW9kZSwgdGhlIGNvbnRlbnQgb2YgdGhlIG1pblNka1ZlcnNpb24gbXVzdCBtYXRjaCBleGFjdGx5IHRoZQotICAgICAgICAgICAgICAgIC8vIHBsYXRmb3JtIGNvZGVuYW1lLgotICAgICAgICAgICAgICAgIFN0cmluZyBjb2RlTmFtZSA9IGFuZHJvaWRWZXJzaW9uLmdldENvZGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVOYW1lLmVxdWFscyh2YWx1ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvciAnJTEkcycgU0RLIFByZXZpZXcsIGF0dHJpYnV0ZSBtaW5TZGtWZXJzaW9uIGluIEFuZHJvaWRNYW5pZmVzdC54bWwgbXVzdCBiZSAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBmb3Igbm9ybWFsIHBsYXRmb3JtLCB3ZSdsbCBvbmx5IGRpc3BsYXkgd2FybmluZ3MgaWYgdGhlIHZhbHVlIGlzIGxvd2VyIG9yIGhpZ2hlcgotICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIHRhcmdldCBhcGkgbGV2ZWwuCi0gICAgICAgICAgICAgICAgLy8gRmlyc3QgY29udmVydCB0byBhbiBpbnQuCi0gICAgICAgICAgICAgICAgaW50IG1pblNka1ZhbHVlID0gLTE7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWluU2RrVmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIGl0J3Mgbm90IGEgbnVtYmVyOiBlcnJvciEKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSAlMSRzIGluIEFuZHJvaWRNYW5pZmVzdC54bWwgbXVzdCBiZSBhbiBJbnRlZ2VyISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9NSU5fU0RLX1ZFUlNJT04pKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgcHJvamVjdEFwaUxldmVsID0gYW5kcm9pZFZlcnNpb24uZ2V0QXBpTGV2ZWwoKTsKLSAgICAgICAgICAgICAgICBpZiAobWluU2RrVmFsdWUgPCBwcm9qZWN0QXBpTGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IEF0dHJpYnV0ZSAlMSRzIGluIEFuZHJvaWRNYW5pZmVzdC54bWwgKCUyJGQpIGlzIGxvd2VyIHRoYW4gdGhlIHByb2plY3QgdGFyZ2V0IEFQSSBsZXZlbCAoJTMkZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNka1ZhbHVlLCBwcm9qZWN0QXBpTGV2ZWwpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pblNka1ZhbHVlID4gYW5kcm9pZFZlcnNpb24uZ2V0QXBpTGV2ZWwoKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogQXR0cmlidXRlICUxJHMgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbCAoJTIkZCkgaXMgaGlnaGVyIHRoYW4gdGhlIHByb2plY3QgdGFyZ2V0IEFQSSBsZXZlbCAoJTMkZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNka1ZhbHVlLCBwcm9qZWN0QXBpTGV2ZWwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vIG1pblNka1ZlcnNpb24/IGRpc3BsYXkgYSB3YXJuaW5nCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE5vIG1pblNka1ZlcnNpb24gdmFsdWUgc2V0LiBBcHBsaWNhdGlvbiB3aWxsIGluc3RhbGwgb24gYWxsIEFuZHJvaWQgdmVyc2lvbnMuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2FudHRhc2tzL3NyYy9jb20vYW5kcm9pZC9hbnQvWFBhdGhUYXNrLmphdmEgYi90b29scy9hbnR0YXNrcy9zcmMvY29tL2FuZHJvaWQvYW50L1hQYXRoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNmYjcxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FudHRhc2tzL3NyYy9jb20vYW5kcm9pZC9hbnQvWFBhdGhUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIueG1sLkFuZHJvaWRYUGF0aEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuZHJvaWQgc3BlY2lmaWMgWFBhdGggdGFzay4KLSAqIFRoZSBnb2FsIGlzIHRvIGdldCB0aGUgcmVzdWx0IG9mIGFuIFhQYXRoIGV4cHJlc3Npb24gb24gQW5kcm9pZCBYTUwgZmlsZXMuIFRoZSBhbmRyb2lkIG5hbWVzcGFjZQotICogKGh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCkgbXVzdCBiZSBhc3NvY2lhdGVkIHRvIHRoZSAiYW5kcm9pZCIgcHJlZml4LgotICovCi1wdWJsaWMgY2xhc3MgWFBhdGhUYXNrIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIFBhdGggbU1hbmlmZXN0RmlsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUV4cHJlc3Npb247Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChQYXRoIG1hbmlmZXN0RmlsZSkgewotICAgICAgICBtTWFuaWZlc3RGaWxlID0gbWFuaWZlc3RGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgbVByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgewotICAgICAgICBtRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobU1hbmlmZXN0RmlsZSA9PSBudWxsIHx8IG1NYW5pZmVzdEZpbGUubGlzdCgpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnB1dCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvdXRwdXQgYXR0cmlidXRlIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJleHByZXNzaW9uIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYUGF0aCB4cGF0aCA9IEFuZHJvaWRYUGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBtTWFuaWZlc3RGaWxlLmxpc3QoKVswXTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSB4cGF0aC5ldmFsdWF0ZShtRXhwcmVzc2lvbiwgbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpKTsKLQotICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KG1Qcm9wZXJ0eSwgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fwa2J1aWxkZXIvLmNsYXNzcGF0aCBiL3Rvb2xzL2Fwa2J1aWxkZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NjhmYy4uMDAwMDAwMAotLS0gYS90b29scy9hcGtidWlsZGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9KYXJVdGlscyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9BbmRyb2lkUHJlZnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXBrYnVpbGRlci8uZ2l0aWdub3JlIGIvdG9vbHMvYXBrYnVpbGRlci8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk5NTA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fwa2J1aWxkZXIvLnByb2plY3QgYi90b29scy9hcGtidWlsZGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk3YWZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BcGtCdWlsZGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fwa2J1aWxkZXIvQW5kcm9pZC5tayBiL3Rvb2xzL2Fwa2J1aWxkZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZTVjOC4uMDAwMDAwMAotLS0gYS90b29scy9hcGtidWlsZGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotQVBLQlVJTERFUl9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChBUEtCVUlMREVSX0xPQ0FMX0RJUikvZXRjL0FuZHJvaWQubWsKLWluY2x1ZGUgJChBUEtCVUlMREVSX0xPQ0FMX0RJUikvc3JjL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL0FuZHJvaWQubWsgYi90b29scy9hcGtidWlsZGVyL2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRkYjE3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gYXBrYnVpbGRlcgotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL2Fwa2J1aWxkZXIgYi90b29scy9hcGtidWlsZGVyL2V0Yy9hcGtidWlsZGVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTdlODIyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL2Fwa2J1aWxkZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDUtMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAotIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgotcHJvZz0iJDAiCi13aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwotICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKLSAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKLSAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKLSAgICBlbHNlCi0gICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCi0gICAgZmkKLWRvbmUKLW9sZHdkPWBwd2RgCi1wcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLWNkICIke3Byb2dkaXJ9IgotcHJvZ2Rpcj1gcHdkYAotcHJvZz0iJHtwcm9nZGlyfSIvYGJhc2VuYW1lICIke3Byb2d9ImAKLWNkICIke29sZHdkfSIKLQotamFyZmlsZT1hcGtidWlsZGVyLmphcgotZnJhbWV3b3JrZGlyPSIkcHJvZ2RpciIKLWxpYmRpcj0iJHByb2dkaXIiCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICRqYXJmaWxlIgotICAgIGV4aXQgMQotZmkKLQotCi0jIENoZWNrIGFyZ3MuCi1pZiBbIGRlYnVnID0gIiQxIiBdOyB0aGVuCi0gICAgIyBhZGQgdGhpcyBpbiBmb3IgZGVidWdnaW5nCi0gICAgamF2YV9kZWJ1Zz0tYWdlbnRsaWI6amR3cD10cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LGFkZHJlc3M9ODA1MCxzdXNwZW5kPXkKLSAgICBzaGlmdCAxCi1lbHNlCi0gICAgamF2YV9kZWJ1Zz0KLWZpCi0KLSMgTWFjIE9TIFggbmVlZHMgYW4gYWRkaXRpb25hbCBhcmcsIG9yIHlvdSBnZXQgYW4gImlsbGVnYWwgdGhyZWFkIiBjb21wbGFpbnQuCi1pZiBbIGB1bmFtZWAgPSAiRGFyd2luIiBdOyB0aGVuCi0gICAgb3Nfb3B0cz0iLVhzdGFydE9uRmlyc3RUaHJlYWQiCi1lbHNlCi0gICAgb3Nfb3B0cz0KLWZpCi0KLWlmIFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXSA7IHRoZW4KLSAgICBqYXJwYXRoPWBjeWdwYXRoIC13ICAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSJgCi0gICAgcHJvZ2Rpcj1gY3lncGF0aCAtdyAgIiRwcm9nZGlyImAKLWVsc2UKLSAgICBqYXJwYXRoPSIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIgotZmkKLQotIyBuZWVkIHRvIHVzZSAiamF2YS5leHQuZGlycyIgYmVjYXVzZSAiLWphciIgY2F1c2VzIGNsYXNzcGF0aCB0byBiZSBpZ25vcmVkCi0jIG1pZ2h0IG5lZWQgbW9yZSBtZW1vcnksIGUuZy4gLVhteDEyOE0KLWV4ZWMgamF2YSAtWG14MTI4TSAkb3Nfb3B0cyAkamF2YV9kZWJ1ZyAtRGphdmEuZXh0LmRpcnM9IiRmcmFtZXdvcmtkaXIiIC1EamF2YS5saWJyYXJ5LnBhdGg9IiRsaWJkaXIiIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9hcGtidWlsZGVyL2V0Yy9hcGtidWlsZGVyLmJhdCBiL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL2Fwa2J1aWxkZXIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDY4OWM2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL2Fwa2J1aWxkZXIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLXJlbQotcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotcmVtIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLXJlbSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1yZW0KLXJlbSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1yZW0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLXJlbSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLXJlbSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1yZW0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXJlbSBkb24ndCBtb2RpZnkgdGhlIGNhbGxlcidzIGVudmlyb25tZW50Ci1zZXRsb2NhbAotCi1yZW0gU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCi1yZW0gYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXNldCBwcm9nPSV+ZjAKLQotcmVtIENoYW5nZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgZHJpdmUgdG8gd2hlcmUgdGhlIHNjcmlwdCBpcywgdG8gYXZvaWQKLXJlbSBpc3N1ZXMgd2l0aCBkaXJlY3RvcmllcyBjb250YWluaW5nIHdoaXRlc3BhY2VzLgotY2QgL2QgJX5kcDAKLQotc2V0IGphcmZpbGU9YXBrYnVpbGRlci5qYXIKLXNldCBmcmFtZXdvcmtkaXI9Ci1zZXQgbGliZGlyPQotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9bGliXAotICAgIHNldCBsaWJkaXI9bGliXAotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9Li5cZnJhbWV3b3JrXAotICAgIHNldCBsaWJkaXI9Li5cbGliXAotCi06SmFyRmlsZU9rCi0KLXNldCBqYXJwYXRoPSVmcmFtZXdvcmtkaXIlJWphcmZpbGUlCi0KLWNhbGwgamF2YSAtRGphdmEuZXh0LmRpcnM9JWZyYW1ld29ya2RpciUgLURqYXZhLmxpYnJhcnkucGF0aD0lbGliZGlyJSAtamFyICVqYXJwYXRoJSAlKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXBrYnVpbGRlci9ldGMvbWFuaWZlc3QudHh0IGIvdG9vbHMvYXBrYnVpbGRlci9ldGMvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFmYjE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmFwa2J1aWxkZXIuQXBrQnVpbGRlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXBrYnVpbGRlci9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2Fwa2J1aWxkZXIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MDNjYTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYXBrYnVpbGRlci9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGFuZHJvaWRwcmVmcyBcCi0gICAgICAgIGphcnV0aWxzCi0KLUxPQ0FMX01PRFVMRSA6PSBhcGtidWlsZGVyCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXBrYnVpbGRlci9zcmMvY29tL2FuZHJvaWQvYXBrYnVpbGRlci9BcGtCdWlsZGVyLmphdmEgYi90b29scy9hcGtidWlsZGVyL3NyYy9jb20vYW5kcm9pZC9hcGtidWlsZGVyL0Fwa0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5ZjM1NS4uMDAwMDAwMAotLS0gYS90b29scy9hcGtidWlsZGVyL3NyYy9jb20vYW5kcm9pZC9hcGtidWlsZGVyL0Fwa0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hcGtidWlsZGVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYXBrYnVpbGRlci5pbnRlcm5hbC5BcGtCdWlsZGVySW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0KLS8qKgotICogQ29tbWFuZCBsaW5lIEFQSyBidWlsZGVyIHdpdGggc2lnbmluZyBzdXBwb3J0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBrQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFdyb25nT3B0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIFdyb25nT3B0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgQXBrQ3JlYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgQXBrQ3JlYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFwa0NyZWF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW4gbWV0aG9kLiBUaGlzIGlzIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdGhyb3VnaCBhbiBleGVjLgotICAgICAqIDxwLz5XQVJOSU5HOiB0aGlzIHdpbGwgY2FsbCB7QGxpbmsgU3lzdGVtI2V4aXQoaW50KX0gaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KLSAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBBcGtCdWlsZGVySW1wbCgpLnJ1bihhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoV3JvbmdPcHRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJpbnRVc2FnZUFuZFF1aXQoKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50QW5kRXhpdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFwa0NyZWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50QW5kRXhpdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBUEkgZW50cnkgcG9pbnQgc2ltaWxhciB0byB0aGUge0BsaW5rICNtYWluKFN0cmluZ1tdKX0gbWV0aG9kLgotICAgICAqIDxwLz5Vbmxpa2Uge0BsaW5rICNtYWluKFN0cmluZ1tdKX0sIHRoaXMgd2lsbCBub3QgY2FsbCB7QGxpbmsgU3lzdGVtI2V4aXQoaW50KX0gYW5kIGluc3RlYWQKLSAgICAgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0gICAgICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAgKiBAdGhyb3dzIFdyb25nT3B0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFyZSBpbmNvcnJlY3QuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgYSByZXF1aXJlZCBmaWxlIHdhcyBub3QgZm91bmQuCi0gICAgICogQHRocm93cyBBcGtDcmVhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBBUEsuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUFwayhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBXcm9uZ09wdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEFwa0NyZWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEFwa0J1aWxkZXJJbXBsKCkucnVuKGFyZ3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZUFuZFF1aXQoKSB7Ci0gICAgICAgIC8vIDgwIGNvbHMgbWFya2VyOiAgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBIGNvbW1hbmQgbGluZSB0b29sIHRvIHBhY2thZ2UgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiBmcm9tIHZhcmlvdXMgc291cmNlcy4iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogYXBrYnVpbGRlciA8b3V0IGFyY2hpdmU+IFstdl1bLXVdWy1zdG9yZXR5cGUgU1RPUkVfVFlQRV0gWy16IGlucHV0emlwXSIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAgICAgICAgIFstZiBpbnB1dGZpbGVdIFstcmYgaW5wdXQtZm9sZGVyXSBbLXJqIC1pbnB1dC1wYXRoXSIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAtdiAgICAgIFZlcmJvc2UuIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgIC11ICAgICAgQ3JlYXRlcyBhbiB1bnNpZ25lZCBwYWNrYWdlLiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAtc3RvcmV0eXBlIEZvcmNlcyB0aGUgS2V5U3RvcmUgdHlwZS4gSWYgb21taXRlZCB0aGUgZGVmYXVsdCBpcyB1c2VkLiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAteiAgICAgIEZvbGxvd2VkIGJ5IHRoZSBwYXRoIHRvIGEgemlwIGFyY2hpdmUuIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgQWRkcyB0aGUgY29udGVudCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgLWYgICAgICBGb2xsb3dlZCBieSB0aGUgcGF0aCB0byBhIGZpbGUuIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgQWRkcyB0aGUgZmlsZSB0byB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgLXJmICAgICBGb2xsb3dlZCBieSB0aGUgcGF0aCB0byBhIHNvdXJjZSBmb2xkZXIuIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgQWRkcyB0aGUgamF2YSByZXNvdXJjZXMgZm91bmQgaW4gdGhhdCBmb2xkZXIgdG8gdGhlIGFwcGxpY2F0aW9uIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgcGFja2FnZSwgd2hpbGUga2VlcGluZyB0aGVpciBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyLiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAtcmogICAgIEZvbGxvd2VkIGJ5IHRoZSBwYXRoIHRvIGEgamFyIGZpbGUgb3IgYSBmb2xkZXIgY29udGFpbmluZyIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAgICAgICAgIGphciBmaWxlcy4iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgICAgICAgICBBZGRzIHRoZSBqYXZhIHJlc291cmNlcyBmb3VuZCBpbiB0aGUgamFyIGZpbGUocykgdG8gdGhlIGFwcGxpY2F0aW9uIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgcGFja2FnZS4iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgLW5mICAgICBGb2xsb3dlZCBieSB0aGUgcm9vdCBmb2xkZXIgY29udGFpbmluZyBuYXRpdmUgbGlicmFyaWVzIHRvIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgICAgICAgICAgaW5jbHVkZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4iKTsKLQotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50QW5kRXhpdChTdHJpbmcuLi4gbWVzc2FnZXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXBrYnVpbGRlci9zcmMvY29tL2FuZHJvaWQvYXBrYnVpbGRlci9pbnRlcm5hbC9BcGtCdWlsZGVySW1wbC5qYXZhIGIvdG9vbHMvYXBrYnVpbGRlci9zcmMvY29tL2FuZHJvaWQvYXBrYnVpbGRlci9pbnRlcm5hbC9BcGtCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDIxYzIyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fwa2J1aWxkZXIvc3JjL2NvbS9hbmRyb2lkL2Fwa2J1aWxkZXIvaW50ZXJuYWwvQXBrQnVpbGRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hcGtidWlsZGVyLmludGVybmFsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYXBrYnVpbGRlci5BcGtCdWlsZGVyLldyb25nT3B0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmFwa2J1aWxkZXIuQXBrQnVpbGRlci5BcGtDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5EZWJ1Z0tleVByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5TaWduZWRKYXJCdWlsZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkRlYnVnS2V5UHJvdmlkZXIuS2V5dG9vbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBDb21tYW5kIGxpbmUgQVBLIGJ1aWxkZXIgd2l0aCBzaWduaW5nIHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGtCdWlsZGVySW1wbCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFBBVFRFUk5fSkFSX0VYVCA9IFBhdHRlcm4uY29tcGlsZSgiXi4rXFwuamFyJCIsCi0gICAgICAgICAgICBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gUEFUVEVSTl9OQVRJVkVMSUJfRVhUID0gUGF0dGVybi5jb21waWxlKCJeLitcXC5zbyQiLAotICAgICAgICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOQVRJVkVfTElCX1JPT1QgPSAibGliLyI7Ci0KLSAgICAvKioKLSAgICAgKiBBIEZpbGUgdG8gYmUgYWRkZWQgdG8gdGhlIEFQSyBhcmNoaXZlLgotICAgICAqIDxwLz5UaGlzIGluY2x1ZGVzIHRoZSB7QGxpbmsgRmlsZX0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIGFuZCBpdHMgcGF0aCBpbiB0aGUgYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIEFwa0ZpbGUgewotICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGg7Ci0gICAgICAgIEZpbGUgZmlsZTsKLQotICAgICAgICBBcGtGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICB0aGlzLmFyY2hpdmVQYXRoID0gcGF0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlRmlsdGVyIG1SZXNvdXJjZUZpbHRlciA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmJvc2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNpZ25lZFBhY2thZ2UgPSB0cnVlOwotICAgIC8qKiB0aGUgb3B0aW9uYWwgdHlwZSBvZiB0aGUgZGVidWcga2V5c3RvcmUuIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgZGVmYXVsdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1TdG9yZVR5cGUgPSBudWxsOwotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKLSAgICAgICAgbVZlcmJvc2UgPSB2ZXJib3NlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpZ25lZFBhY2thZ2UoYm9vbGVhbiBzaWduZWRQYWNrYWdlKSB7Ci0gICAgICAgIG1TaWduZWRQYWNrYWdlID0gc2lnbmVkUGFja2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFdyb25nT3B0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgICBBcGtDcmVhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXcm9uZ09wdGlvbkV4Y2VwdGlvbigiTm8gb3B0aW9ucyBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgdGhlIGZpcnN0IGFyZ3MgdGhhdCBzaG91bGQgYmUgYSBmaWxlIHBhdGgKLSAgICAgICAgRmlsZSBvdXRGaWxlID0gZ2V0T3V0RmlsZShhcmdzWzBdKTsKLQotICAgICAgICBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPiB6aXBBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPigpOwotICAgICAgICBBcnJheUxpc3Q8RmlsZT4gYXJjaGl2ZUZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICBBcnJheUxpc3Q8QXBrRmlsZT4gamF2YVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8QXBrRmlsZT4oKTsKLSAgICAgICAgQXJyYXlMaXN0PEZpbGVJbnB1dFN0cmVhbT4gcmVzb3VyY2VzSmFycyA9IG5ldyBBcnJheUxpc3Q8RmlsZUlucHV0U3RyZWFtPigpOwotICAgICAgICBBcnJheUxpc3Q8QXBrRmlsZT4gbmF0aXZlTGlicmFyaWVzID0gbmV3IEFycmF5TGlzdDxBcGtGaWxlPigpOwotCi0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIFN0cmluZyBhcmd1bWVudCA9IGFyZ3NbaW5kZXgrK107Ci0KLSAgICAgICAgICAgIGlmICgiLXYiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBtVmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItdSIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIG1TaWduZWRQYWNrYWdlID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCIteiIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIG9uIHRoZSBuZXh0IGFyZ3VtZW50LgotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nT3B0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHZhbHVlIGZvciAteiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1tpbmRleCsrXSk7Ci0gICAgICAgICAgICAgICAgICAgIHppcEFyY2hpdmVzLmFkZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwa0NyZWF0aW9uRXhjZXB0aW9uKCIteiBmaWxlIGlzIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1mIi4gZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIG9uIHRoZSBuZXh0IGFyZ3VtZW50LgotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdPcHRpb25FeGNlcHRpb24oIk1pc3NpbmcgdmFsdWUgZm9yIC1mIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXJjaGl2ZUZpbGVzLmFkZChnZXRJbnB1dEZpbGUoYXJnc1tpbmRleCsrXSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiLXJmIi4gZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIG9uIHRoZSBuZXh0IGFyZ3VtZW50LgotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdPcHRpb25FeGNlcHRpb24oIk1pc3NpbmcgdmFsdWUgZm9yIC1yZiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByb2Nlc3NTb3VyY2VGb2xkZXJGb3JSZXNvdXJjZShhcmdzW2luZGV4KytdLCBqYXZhUmVzb3VyY2VzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1yaiIuIGVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBxdWljayBjaGVjayBvbiB0aGUgbmV4dCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nT3B0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHZhbHVlIGZvciAtcmoiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhcmdzW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSmFyRm9sZGVyKGFyZ3NbaW5kZXgrK10sIHJlc291cmNlc0phcnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSmFyRmlsZShhcmdzW2luZGV4KytdLCByZXNvdXJjZXNKYXJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItbmYiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBxdWljayBjaGVjayBvbiB0aGUgbmV4dCBhcmd1bWVudC4KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nT3B0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHZhbHVlIGZvciAtbmYiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gYXJnc1tpbmRleCsrXTsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXJhbWV0ZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGdldCB0aGUgcmVsYXRpdmUgcGF0aAotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBwYXJhbWV0ZXIubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvY2Vzc05hdGl2ZUZvbGRlcihvZmZzZXQsIGYsIG5hdGl2ZUxpYnJhcmllcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItc3RvcmV0eXBlIi5lcXVhbHMoYXJndW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgb24gdGhlIG5leHQgYXJndW1lbnQuCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXcm9uZ09wdGlvbkV4Y2VwdGlvbigiTWlzc2luZyB2YWx1ZSBmb3IgLXN0b3JldHlwZSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdG9yZVR5cGUgID0gYXJnc1tpbmRleCsrXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nT3B0aW9uRXhjZXB0aW9uKCJVbmtub3duIGFyZ3VtZW50OiAiICsgYXJndW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChpbmRleCA8IGFyZ3MubGVuZ3RoKTsKLQotICAgICAgICBjcmVhdGVQYWNrYWdlKG91dEZpbGUsIHppcEFyY2hpdmVzLCBhcmNoaXZlRmlsZXMsIGphdmFSZXNvdXJjZXMsIHJlc291cmNlc0phcnMsCi0gICAgICAgICAgICAgICAgbmF0aXZlTGlicmFyaWVzKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgRmlsZSBnZXRPdXRGaWxlKFN0cmluZyBmaWxlcGF0aCkgdGhyb3dzIEFwa0NyZWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZXBhdGgpOwotCi0gICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbihmaWxlcGF0aCArICIgaXMgYSBkaXJlY3RvcnkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZi5leGlzdHMoKSkgeyAvLyB3aWxsIGJlIGEgZmlsZSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICBpZiAoZi5jYW5Xcml0ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwa0NyZWF0aW9uRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgIiArIGZpbGVwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGYuY3JlYXRlTmV3RmlsZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSAiICsgZmlsZXBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSAnIiArIGZpbGVwYXRoICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldElucHV0RmlsZShTdHJpbmcgZmlsZXBhdGgpIHRocm93cyBBcGtDcmVhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVwYXRoKTsKLQotICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oZmlsZXBhdGggKyAiIGlzIGEgZGlyZWN0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmIChmLmNhblJlYWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHJlYWQgIiArIGZpbGVwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbihmaWxlcGF0aCArICIgZG9lcyBub3QgZXhpc3RzISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgc291cmNlIGZvbGRlciBhbmQgYWRkcyBpdHMgamF2YSByZXNvdXJjZXMgdG8gYSBnaXZlbiBsaXN0IG9mIHtAbGluayBBcGtGaWxlfS4KLSAgICAgKiBAcGFyYW0gZm9sZGVyUGF0aCB0aGUgcGF0aCB0byB0aGUgc291cmNlIGZvbGRlci4KLSAgICAgKiBAcGFyYW0gamF2YVJlc291cmNlcyB0aGUgbGlzdCBvZiB7QGxpbmsgQXBrRmlsZX0gdG8gZmlsbC4KLSAgICAgKiBAdGhyb3dzIEFwa0NyZWF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NTb3VyY2VGb2xkZXJGb3JSZXNvdXJjZShTdHJpbmcgZm9sZGVyUGF0aCwKLSAgICAgICAgICAgIEFycmF5TGlzdDxBcGtGaWxlPiBqYXZhUmVzb3VyY2VzKSB0aHJvd3MgQXBrQ3JlYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZm9sZGVyUGF0aCk7Ci0KLSAgICAgICAgaWYgKGZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAvLyBmaWxlIGlzIGEgZGlyZWN0b3J5LCBwcm9jZXNzIGl0cyBjb250ZW50LgotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlRm9yUmVzb3VyY2UoZmlsZSwgbnVsbCwgamF2YVJlc291cmNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3QgYSBkaXJlY3Rvcnk/IG91dHB1dCBlcnJvciBhbmQgcXVpdC4KLSAgICAgICAgICAgIGlmIChmb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oZm9sZGVyUGF0aCArICIgaXMgbm90IGEgZm9sZGVyISIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oZm9sZGVyUGF0aCArICIgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0phckZvbGRlcihTdHJpbmcgcGFyYW1ldGVyLCBDb2xsZWN0aW9uPEZpbGVJbnB1dFN0cmVhbT4gcmVzb3VyY2VzSmFycykKLSAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXJhbWV0ZXIpOwotICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGYubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEFUVEVSTl9KQVJfRVhULm1hdGNoZXIobmFtZSkubWF0Y2hlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGU7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0phckZpbGUocGF0aCwgcmVzb3VyY2VzSmFycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9jZXNzSmFyRmlsZShwYXJhbWV0ZXIsIHJlc291cmNlc0phcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NKYXJGaWxlKFN0cmluZyBqYXJmaWxlUGF0aCwgQ29sbGVjdGlvbjxGaWxlSW5wdXRTdHJlYW0+IHJlc291cmNlc0phcnMpCi0gICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShqYXJmaWxlUGF0aCk7Ci0gICAgICAgIHJlc291cmNlc0phcnMuYWRkKGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSB7QGxpbmsgRmlsZX0gdGhhdCBjb3VsZCBiZSBhIHtAbGluayBBcGtGaWxlfSwgb3IgYSBmb2xkZXIgY29udGFpbmluZwotICAgICAqIGphdmEgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSB7QGxpbmsgRmlsZX0gdG8gcHJvY2Vzcy4KLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGlzIGZpbGUgdG8gdGhlIHNvdXJjZSBmb2xkZXIuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgICAqIGlkZW50aWZ5IGEgcm9vdCBmaWxlLgotICAgICAqIEBwYXJhbSBqYXZhUmVzb3VyY2VzIHRoZSBDb2xsZWN0aW9uIG9mIHtAbGluayBBcGtGaWxlfSBvYmplY3QgdG8gZmlsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGaWxlRm9yUmVzb3VyY2UoRmlsZSBmaWxlLCBTdHJpbmcgcGF0aCwKLSAgICAgICAgICAgIENvbGxlY3Rpb248QXBrRmlsZT4gamF2YVJlc291cmNlcykgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAvLyBhIGRpcmVjdG9yeT8gd2UgY2hlY2sgaXQKLSAgICAgICAgICAgIGlmIChKYXZhUmVzb3VyY2VGaWx0ZXIuY2hlY2tGb2xkZXJGb3JQYWNrYWdpbmcoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgaXQncyB2YWxpZCwgd2UgYXBwZW5kIGl0cyBuYW1lIHRvIHRoZSBjdXJyZW50IHBhdGguCi0gICAgICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhbmQgcHJvY2VzcyBpdHMgY29udGVudC4KLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgICAgIGZvciAoRmlsZSBjb250ZW50RmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlRm9yUmVzb3VyY2UoY29udGVudEZpbGUsIHBhdGgsIGphdmFSZXNvdXJjZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGEgZmlsZT8gd2UgY2hlY2sgaXQKLSAgICAgICAgICAgIGlmIChKYXZhUmVzb3VyY2VGaWx0ZXIuY2hlY2tGaWxlRm9yUGFja2FnaW5nKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGFwcGVuZCBpdHMgbmFtZSB0byB0aGUgY3VycmVudCBwYXRoCi0gICAgICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIGphdmFSZXNvdXJjZXMuYWRkKG5ldyBBcGtGaWxlKGZpbGUsIHBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSB7QGxpbmsgRmlsZX0gZm9yIG5hdGl2ZSBsaWJyYXJ5IGluY2x1c2lvbi4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBsZW5ndGggb2YgdGhlIHJvb3QgZm9sZGVyICh1c2VkIHRvIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCkKLSAgICAgKiBAcGFyYW0gZiB0aGUge0BsaW5rIEZpbGV9IHRvIHByb2Nlc3MKLSAgICAgKiBAcGFyYW0gbmF0aXZlTGlicmFyaWVzIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCBuYXRpdmUgbGlicmFyaWVzIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzTmF0aXZlRm9sZGVyKGludCBvZmZzZXQsIEZpbGUgZiwKLSAgICAgICAgICAgIENvbGxlY3Rpb248QXBrRmlsZT4gbmF0aXZlTGlicmFyaWVzKSB7Ci0gICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGYubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChGaWxlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05hdGl2ZUZvbGRlcihvZmZzZXQsIGNoaWxkLCBuYXRpdmVMaWJyYXJpZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICBpZiAoUEFUVEVSTl9OQVRJVkVMSUJfRVhULm1hdGNoZXIoZi5nZXROYW1lKCkpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gTkFUSVZFX0xJQl9ST09UICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKG9mZnNldCkucmVwbGFjZSgnXFwnLCAnLycpOwotCi0gICAgICAgICAgICAgICAgbmF0aXZlTGlicmFyaWVzLmFkZChuZXcgQXBrRmlsZShmLCBwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlCi0gICAgICogQHBhcmFtIG91dEZpbGUgdGhlIHBhY2thZ2UgZmlsZSB0byBjcmVhdGUKLSAgICAgKiBAcGFyYW0gemlwQXJjaGl2ZXMgdGhlIGxpc3Qgb2YgemlwIGFyY2hpdmUKLSAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgYXJjaGl2ZQotICAgICAqIEBwYXJhbSBqYXZhUmVzb3VyY2VzIHRoZSBsaXN0IG9mIGphdmEgcmVzb3VyY2VzIGZyb20gdGhlIHNvdXJjZSBmb2xkZXJzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZXNKYXJzIHRoZSBsaXN0IG9mIGphciBmaWxlcyBmcm9tIHdoaWNoIHRvIHRha2UgamF2YSByZXNvdXJjZXMKLSAgICAgKiBAdGhyb3dzIEFwa0NyZWF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZShGaWxlIG91dEZpbGUsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0+IHppcEFyY2hpdmVzLAotICAgICAgICAgICAgSXRlcmFibGU8PyBleHRlbmRzIEZpbGU+IGZpbGVzLCBJdGVyYWJsZTw/IGV4dGVuZHMgQXBrRmlsZT4gamF2YVJlc291cmNlcywKLSAgICAgICAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0+IHJlc291cmNlc0phcnMsCi0gICAgICAgICAgICBJdGVyYWJsZTw/IGV4dGVuZHMgQXBrRmlsZT4gbmF0aXZlTGlicmFyaWVzKSB0aHJvd3MgQXBrQ3JlYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGdldCB0aGUgZGVidWcga2V5Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWduZWRKYXJCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgICAgIGlmIChtU2lnbmVkUGFja2FnZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJVc2luZyBrZXlzdG9yZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdLZXlQcm92aWRlci5nZXREZWZhdWx0S2V5U3RvcmVPc1BhdGgoKSkpOwotCi0KLSAgICAgICAgICAgICAgICBEZWJ1Z0tleVByb3ZpZGVyIGtleVByb3ZpZGVyID0gbmV3IERlYnVnS2V5UHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG9zS2V5UGF0aDogdXNlIGRlZmF1bHQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RvcmVUeXBlLCBudWxsIC8qIElLZXlHZW5PdXRwdXQgKi8pOwotICAgICAgICAgICAgICAgIFByaXZhdGVLZXkga2V5ID0ga2V5UHJvdmlkZXIuZ2V0RGVidWdLZXkoKTsKLSAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSAoWDUwOUNlcnRpZmljYXRlKWtleVByb3ZpZGVyLmdldENlcnRpZmljYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwa0NyZWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IGRlYnVnIHNpZ25hdHVyZSBrZXkiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBjZXJ0aWZpY2F0ZSBleHBpcmF0aW9uIGRhdGUKLSAgICAgICAgICAgICAgICBpZiAoY2VydGlmaWNhdGUgIT0gbnVsbCAmJiBjZXJ0aWZpY2F0ZS5nZXROb3RBZnRlcigpLmNvbXBhcmVUbyhuZXcgRGF0ZSgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETywgcmVnZW5lcmF0ZSBhIG5ldyBvbmUuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbigiRGVidWcgQ2VydGlmaWNhdGUgZXhwaXJlZCBvbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0LmdldEluc3RhbmNlKCkuZm9ybWF0KGNlcnRpZmljYXRlLmdldE5vdEFmdGVyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFNpZ25lZEphckJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBmYWxzZSAvKiBhcHBlbmQgKi8pLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU2lnbmVkSmFyQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZhbHNlIC8qIGFwcGVuZCAqLyksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGtleSAqLywgbnVsbCAvKiBjZXJ0aWZpY2F0ZSAqLyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgYXJjaGl2ZXMKLSAgICAgICAgICAgIGZvciAoRmlsZUlucHV0U3RyZWFtIGlucHV0IDogemlwQXJjaGl2ZXMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndyaXRlWmlwKGlucHV0LCBudWxsIC8qIGZpbHRlciAqLyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgc2luZ2xlIGZpbGVzCi0gICAgICAgICAgICBmb3IgKEZpbGUgaW5wdXQgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBwdXQgdGhlIGZpbGUgYXQgdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgYnVpbGRlci53cml0ZUZpbGUoaW5wdXQsIGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1WZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlMSRzID0+ICUyJHMiLCBpbnB1dC5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgamF2YSByZXNvdXJjZSBmcm9tIHRoZSBzb3VyY2UgZm9sZGVycy4KLSAgICAgICAgICAgIGZvciAoQXBrRmlsZSByZXNvdXJjZSA6IGphdmFSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndyaXRlRmlsZShyZXNvdXJjZS5maWxlLCByZXNvdXJjZS5hcmNoaXZlUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1WZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlMSRzID0+ICUyJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc291cmNlLmFyY2hpdmVQYXRoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGphdmEgcmVzb3VyY2UgZnJvbSBqYXIgZmlsZXMuCi0gICAgICAgICAgICBmb3IgKEZpbGVJbnB1dFN0cmVhbSBpbnB1dCA6IHJlc291cmNlc0phcnMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndyaXRlWmlwKGlucHV0LCBtUmVzb3VyY2VGaWx0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG5hdGl2ZSBmaWxlcwotICAgICAgICAgICAgZm9yIChBcGtGaWxlIGZpbGUgOiBuYXRpdmVMaWJyYXJpZXMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndyaXRlRmlsZShmaWxlLmZpbGUsIGZpbGUuYXJjaGl2ZVBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChtVmVyYm9zZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJTEkcyA9PiAlMiRzIiwgZmlsZS5maWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuYXJjaGl2ZVBhdGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsb3NlIGFuZCBzaWduIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAgICAgICAgYnVpbGRlci5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChLZXl0b29sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldEphdmFIb21lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcGtDcmVhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXG5KQVZBX0hPTUUgc2VlbXMgdW5kZWZpbmVkLCBzZXR0aW5nIGl0IHdpbGwgaGVscCBsb2NhdGluZyBrZXl0b29sIGF1dG9tYXRpY2FsbHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW4gYWxzbyBtYW51YWxseSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZFxuOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDb21tYW5kTGluZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwa0NyZWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcbkpBVkFfSE9NRSBpcyBzZXQgdG86ICIgKyBlLmdldEphdmFIb21lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlxuVXBkYXRlIGl0IGlmIG5lY2Vzc2FyeSwgb3IgbWFudWFsbHkgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q29tbWFuZExpbmUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXBrQ3JlYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9hcmNocXVlcnkvLmNsYXNzcGF0aCBiL3Rvb2xzL2FyY2hxdWVyeS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjUwMTE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FyY2hxdWVyeS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaHF1ZXJ5Ly5naXRpZ25vcmUgYi90b29scy9hcmNocXVlcnkvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS90b29scy9hcmNocXVlcnkvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaHF1ZXJ5Ly5wcm9qZWN0IGIvdG9vbHMvYXJjaHF1ZXJ5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODg2MDkxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FyY2hxdWVyeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmFyY2hxdWVyeTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9hcmNocXVlcnkvQW5kcm9pZC5tayBiL3Rvb2xzL2FyY2hxdWVyeS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NhZDQ2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FyY2hxdWVyeS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUFSQ0hRVUVSWV9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChBUkNIUVVFUllfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaHF1ZXJ5L2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy9hcmNocXVlcnkvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2MmU4OC4uMDAwMDAwMAotLS0gYS90b29scy9hcmNocXVlcnkvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmFyY2hxdWVyeS5NYWluCmRpZmYgLS1naXQgYS90b29scy9hcmNocXVlcnkvc3JjL0FuZHJvaWQubWsgYi90b29scy9hcmNocXVlcnkvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MGYwMDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYXJjaHF1ZXJ5L3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0KLUxPQ0FMX01PRFVMRSA6PSBhcmNocXVlcnkKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaHF1ZXJ5L3NyYy9jb20vYW5kcm9pZC9hcmNocXVlcnkvTWFpbi5qYXZhIGIvdG9vbHMvYXJjaHF1ZXJ5L3NyYy9jb20vYW5kcm9pZC9hcmNocXVlcnkvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzZjY2ExLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2FyY2hxdWVyeS9zcmMvY29tL2FuZHJvaWQvYXJjaHF1ZXJ5L01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmFyY2hxdWVyeTsKLQotLyoqCi0gKiBKYXZhIGNvbW1hbmQgbGluZSB0b29sIHRvIHJldHVybiB0aGUgQ1BVIGFyY2hpdGVjdHVyZSBvZiB0aGUgaG9zdCBqYXZhIFZNLgotICoKLSAqIFRoZSBnb2FsIGlzIHRvIGJlIGFibGUgdG8gbGF1bmNoIFNXVCBiYXNlZCBhcHBsaWNhdGlvbnMgKERETVMsIFRyYWNldmlldywgQW5kcm9pZCkgb24gYW55Ci0gKiB0eXBlIG9mIE9TLgotICoKLSAqIEJlY2F1c2UgYSA2NCBiaXQgT1MgY2FuIHJ1biBhIDMyIGJpdCBWaXJ0dWFsIE1hY2hpbmUsIHdlIG5lZWQgdG8gcXVlcnkgdGhlIFZNIGl0c2VsZiB0byBrbm93Ci0gKiB3aGV0aGVyIGl0J3MgMzIgb3IgNjQgYml0IHRvIGRldGVjdCB3aGljaCBzd3QuamFyIGl0IHNob3VsZCB1c2UgKGl0IGNvbnRhaW5zIG5hdGl2ZSBsaWJyYXJpZXMpLgotICogU2ltcGx5IHF1ZXJ5aW5nIHRoZSBPUyBpcyBub3QgZW5vdWdoLgotICoKLSAqIFRoZSBvdGhlciBwcm9ibGVtIGlzIHRoYXQgb25jZSBhIFZNIGlzIGxhdW5jaGVkIGl0IGlzIGltcG9zc2libGUgdG8gY2hhbmdlIGl0cyBjbGFzc3BhdGggdG8KLSAqIHBvaW50IHRoZSBWTSB0byB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHN3dC5qYXIuCi0gKgotICogVGhlIHNvbHV0aW9uIGlzIHRoaXMgc21hbGwgY29tbWFuZCBsaW5lIHRvb2wsIHJ1bm5pbmcgaW4gdGhlIFZNLCBhbmQgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZgotICogdGhlICdvcy5hcmNoJyBwcm9wZXJ0eS4gQmFzZWQgb24gdGhlIHJldHVybmVkIHZhbHVlLCB0aGUgc2NyaXB0IGxhdW5jaGluZyB0aGUgU1dUIGJhc2VkCi0gKiBhcHBsaWNhdGlvbnMgd2lsbCBjb25maWd1cmUgdGhlIEphdmEgVk0gd2l0aCB0aGUgcGF0aCB0byB0aGUgY29ycmVjdCBzd3QuamFyCi0gKgotICogQmVjYXVzZSBkaWZmZXJlbnQgVk1zIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGZvciAzMiBhbmQgNjQgYml0IHZlcnNpb24gb2YgeDg2IENQVXMsIHRoZSBwcm9ncmFtCi0gKiBoYW5kbGVzIGFsbCB0aGUgcG9zc2libGUgdmFsdWVzIGFuZCBub3JtYWxpemUgdGhlIHJldHVybmVkIHZhbHVlLgotICoKLSAqIEF0IHRoaXMgdGltZSwgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIGFyZToKLSAqIHg4NjogICAgMzIgYml0IHg4NgotICogeDg2XzY0OiA2NCBiaXQgeDg2Ci0gKiBwcGM6ICAgIFBvd2VyUEMgKFdBUk5JTkc6IHRoZSBTREsgZG9lc24ndCBhY3R1YWxseSBzdXBwb3J0IHRoaXMgYXJjaGl0ZWN0dXJlKS4KLSAqCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFpbiB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0gICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlMSRzOiAlMiRzIiwgYXJnLCBTeXN0ZW0uZ2V0UHJvcGVydHkoYXJnKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIC8vIFZhbHVlcyBsaXN0ZWQgZnJvbSBodHRwOi8vbG9waWNhLnNvdXJjZWZvcmdlLm5ldC9vcy5odG1sCi0gICAgICAgICAgICBTdHJpbmcgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOwotCi0gICAgICAgICAgICBpZiAoYXJjaC5lcXVhbHNJZ25vcmVDYXNlKCJ4ODZfNjQiKSB8fCBhcmNoLmVxdWFsc0lnbm9yZUNhc2UoImFtZDY0IikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ4ODZfNjQiKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmNoLmVxdWFsc0lnbm9yZUNhc2UoIng4NiIpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFyY2guZXF1YWxzSWdub3JlQ2FzZSgiaTM4NiIpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFyY2guZXF1YWxzSWdub3JlQ2FzZSgiaTY4NiIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieDg2Iik7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJjaC5lcXVhbHNJZ25vcmVDYXNlKCJwcGMiKSB8fCBhcmNoLmVxdWFsc0lnbm9yZUNhc2UoIlBvd2VyUEMiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInBwYyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGFyY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy8uZ2l0aWdub3JlIGIvdG9vbHMvZGRtcy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgzM2EwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYXBwL2JpbgotbGlicy9kZG1saWIvYmluCi1saWJzL2RkbXVpbGliL2JpbgotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL0FuZHJvaWQubWsgYi90b29scy9kZG1zL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzI0OGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLURETVNfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoRERNU19MT0NBTF9ESVIpL2xpYnMvQW5kcm9pZC5tawotaW5jbHVkZSAkKERETVNfTE9DQUxfRElSKS9hcHAvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvdG9vbHMvZGRtcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC8uY2xhc3NwYXRoIGIvdG9vbHMvZGRtcy9hcHAvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MDY4OC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0iTWFrZWZpbGV8cmVzb3VyY2VzLyIga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvcmVzb3VyY2VzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LlVTRVJfTElCUkFSWS9BTkRST0lEX1NXVCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9kZG1saWIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZGRtdWlsaWIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvQW5kcm9pZFByZWZzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL1Nka1N0YXRzU2VydmljZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC8ucHJvamVjdCBiL3Rvb2xzL2RkbXMvYXBwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmIxOWQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvYXBwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+ZGRtczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9BbmRyb2lkLm1rIGIvdG9vbHMvZGRtcy9hcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1NzcwNi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLURETVNBUFBfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoRERNU0FQUF9MT0NBTF9ESVIpL2V0Yy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoRERNU0FQUF9MT0NBTF9ESVIpL3NyYy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9SRUFETUUgYi90b29scy9kZG1zL2FwcC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTVkZGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotVXNpbmcgdGhlIEVjbGlwc2UgcHJvamVjdHMgZm9yIGRkbXMuCi0KLWRkbXMgcmVxdWlyZXMgU1dUIHRvIGNvbXBpbGUuCi0KLVNXVCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlcG90IHVuZGVyIC8vZGV2aWNlL3ByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0Ci0KLUJlY2F1c2UgdGhlIGJ1aWxkIHBhdGggY2Fubm90IGNvbnRhaW4gcmVsYXRpdmUgcGF0aCB0aGF0IGFyZSBub3QgaW5zaWRlIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKLXRoZSAuY2xhc3NwYXRoIGZpbGUgcmVmZXJlbmNlcyBhIHVzZXIgbGlicmFyeSBjYWxsZWQgQU5EUk9JRF9TV1QuCi0KLUluIG9yZGVyIHRvIGNvbXBpbGUgdGhlIHByb2plY3QsIG1ha2UgYSB1c2VyIGxpYnJhcnkgY2FsbGVkIEFORFJPSURfU1dUIGNvbnRhaW5pbmcgdGhlIGphcgotYXZhaWxhYmxlIGF0IC8vZGV2aWNlL3ByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL2V0Yy9BbmRyb2lkLm1rIGIvdG9vbHMvZGRtcy9hcHAvZXRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjk5NzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvZXRjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1BSRUJVSUxUX0VYRUNVVEFCTEVTIDo9IGRkbXMKLWluY2x1ZGUgJChCVUlMRF9IT1NUX1BSRUJVSUxUKQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9ldGMvZGRtcyBiL3Rvb2xzL2RkbXMvYXBwL2V0Yy9kZG1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzY3YWViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvYXBwL2V0Yy9kZG1zCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAyMDA1LTIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLSMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXByb2c9IiQwIgotd2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KLSAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCi0gICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCi0gICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCi0gICAgZWxzZQotICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLSAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgotICAgIGZpCi1kb25lCi1vbGR3ZD1gcHdkYAotcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtvbGR3ZH0iCi0KLWphcmZpbGU9ZGRtcy5qYXIKLWZyYW1ld29ya2Rpcj0iJHByb2dkaXIiCi1saWJkaXI9IiRwcm9nZGlyIgotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvZnJhbWV3b3JrCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIKLSAgICBleGl0IDEKLWZpCi0KLQotIyBDaGVjayBhcmdzLgotaWYgWyBkZWJ1ZyA9ICIkMSIgXTsgdGhlbgotICAgICMgYWRkIHRoaXMgaW4gZm9yIGRlYnVnZ2luZwotICAgIGphdmFfZGVidWc9LWFnZW50bGliOmpkd3A9dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxhZGRyZXNzPTgwNTAsc3VzcGVuZD15Ci0gICAgc2hpZnQgMQotZWxzZQotICAgIGphdmFfZGVidWc9Ci1maQotCi1qYXZhQ21kPSJqYXZhIgotCi0jIE1hYyBPUyBYIG5lZWRzIGFuIGFkZGl0aW9uYWwgYXJnLCBvciB5b3UgZ2V0IGFuICJpbGxlZ2FsIHRocmVhZCIgY29tcGxhaW50LgotaWYgWyBgdW5hbWVgID0gIkRhcndpbiIgXTsgdGhlbgotICAgIG9zX29wdHM9Ii1Yc3RhcnRPbkZpcnN0VGhyZWFkIgotZWxzZQotICAgIG9zX29wdHM9Ci1maQotCi1pZiBbIGB1bmFtZWAgPSAiTGludXgiIF07IHRoZW4KLSAgICBleHBvcnQgR0RLX05BVElWRV9XSU5ET1dTPXRydWUKLWZpCi0KLWphcnBhdGg9IiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiCi0KLSMgRmlndXJlIG91dCB0aGUgcGF0aCB0byB0aGUgc3d0LmphciBmb3IgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLgotIyBpZiBBTkRST0lEX1NXVCBpcyBkZWZpbmVkLCB0aGVuIGp1c3QgdXNlIHRoaXMuCi0jIGVsc2UsIGlmIHJ1bm5pbmcgaW4gdGhlIEFuZHJvaWQgc291cmNlIHRyZWUsIHRoZW4gbG9vayBmb3IgdGhlIGNvcnJlY3Qgc3d0IGZvbGRlciBpbiBwcmVidWlsdAotIyBlbHNlLCBsb29rIGZvciB0aGUgY29ycmVjdCBzd3QgZm9sZGVyIGluIHRoZSBTREsgdW5kZXIgdG9vbHMvbGliLwotc3d0cGF0aD0iIgotaWYgWyAtbiAiJEFORFJPSURfU1dUIiBdOyB0aGVuCi0gICAgc3d0cGF0aD0iJEFORFJPSURfU1dUIgotZWxzZQotICAgIHZtYXJjaD1gJHtqYXZhQ21kfSAtamFyICIke2ZyYW1ld29ya2Rpcn0iL2FyY2hxdWVyeS5qYXJgCi0gICAgaWYgWyAtbiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCi0gICAgICAgIG9zbmFtZT1gdW5hbWUgLXMgfCB0ciBBLVogYS16YAotICAgICAgICBzd3RwYXRoPSIke0FORFJPSURfQlVJTERfVE9QfS9wcmVidWlsdC8ke29zbmFtZX0tJHt2bWFyY2h9L3N3dCIKLSAgICBlbHNlCi0gICAgICAgIHN3dHBhdGg9IiR7ZnJhbWV3b3JrZGlyfS8ke3ZtYXJjaH0iCi0gICAgZmkKLWZpCi0KLSMgQ29tYmluZSB0aGUgc3d0cGF0aCBhbmQgdGhlIGZyYW1ld29yayBkaXIgcGF0aC4KLWlmIFsgLWQgIiRzd3RwYXRoIiBdOyB0aGVuCi0gICAgZnJhbWV3b3JrZGlyPSIke3N3dHBhdGh9OiR7ZnJhbWV3b3JrZGlyfSIKLWVsc2UKLSAgICBlY2hvICJTV1QgZm9sZGVyICcke3N3dHBhdGh9JyBkb2VzIG5vdCBleGlzdC4iCi0gICAgZWNobyAiUGxlYXNlIGV4cG9ydCBBTkRST0lEX1NXVCB0byBwb2ludCB0byB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgc3d0LmphciBmb3IgeW91ciBwbGF0Zm9ybS4iCi0gICAgZXhpdCAxCi1maQotCi0jIG5lZWQgdG8gdXNlICJqYXZhLmV4dC5kaXJzIiBiZWNhdXNlICItamFyIiBjYXVzZXMgY2xhc3NwYXRoIHRvIGJlIGlnbm9yZWQKLSMgbWlnaHQgbmVlZCBtb3JlIG1lbW9yeSwgZS5nLiAtWG14MTI4TQotZXhlYyAiJGphdmFDbWQiIC1YbXgyNTZNICRvc19vcHRzICRqYXZhX2RlYnVnIC1EamF2YS5leHQuZGlycz0iJGZyYW1ld29ya2RpciIgLURjb20uYW5kcm9pZC5kZG1zLmJpbmRpcj0iJHByb2dkaXIiIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9ldGMvZGRtcy5iYXQgYi90b29scy9kZG1zL2FwcC9ldGMvZGRtcy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmZTUzNmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvZXRjL2RkbXMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLXJlbQotcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotcmVtIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLXJlbSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1yZW0KLXJlbSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1yZW0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLXJlbSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLXJlbSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1yZW0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXJlbSBkb24ndCBtb2RpZnkgdGhlIGNhbGxlcidzIGVudmlyb25tZW50Ci1zZXRsb2NhbAotCi1yZW0gU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCi1yZW0gYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXNldCBwcm9nPSV+ZjAKLQotcmVtIENoYW5nZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgZHJpdmUgdG8gd2hlcmUgdGhlIHNjcmlwdCBpcywgdG8gYXZvaWQKLXJlbSBpc3N1ZXMgd2l0aCBkaXJlY3RvcmllcyBjb250YWluaW5nIHdoaXRlc3BhY2VzLgotY2QgL2QgJX5kcDAKLQotc2V0IGphcmZpbGU9ZGRtcy5qYXIKLXNldCBmcmFtZXdvcmtkaXI9Ci0KLWlmIGV4aXN0ICVmcmFtZXdvcmtkaXIlJWphcmZpbGUlIGdvdG8gSmFyRmlsZU9rCi0gICAgc2V0IGZyYW1ld29ya2Rpcj1saWJcCi0KLWlmIGV4aXN0ICVmcmFtZXdvcmtkaXIlJWphcmZpbGUlIGdvdG8gSmFyRmlsZU9rCi0gICAgc2V0IGZyYW1ld29ya2Rpcj0uLlxmcmFtZXdvcmtcCi0KLTpKYXJGaWxlT2sKLQotaWYgZGVidWcgTkVRICIlMSIgZ290byBOb0RlYnVnCi0gICAgc2V0IGphdmFfZGVidWc9LWFnZW50bGliOmpkd3A9dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxhZGRyZXNzPTgwNTAsc3VzcGVuZD15Ci0gICAgc2hpZnQgMQotOk5vRGVidWcKLQotc2V0IGphcnBhdGg9JWZyYW1ld29ya2RpciUlamFyZmlsZSUKLQotaWYgbm90IGRlZmluZWQgQU5EUk9JRF9TV1QgZ290byBRdWVyeUFyY2gKLSAgICBzZXQgc3d0X3BhdGg9JUFORFJPSURfU1dUJQotICAgIGdvdG8gU3d0RG9uZQotCi06UXVlcnlBcmNoCi0KLSAgICBmb3IgL2YgJSVhIGluICgnamF2YSAtamFyICVmcmFtZXdvcmtkaXIlYXJjaHF1ZXJ5LmphcicpIGRvIHNldCBzd3RfcGF0aD0lZnJhbWV3b3JrZGlyJSUlYQotCi06U3d0RG9uZQotCi1pZiBleGlzdCAlc3d0X3BhdGglIGdvdG8gU2V0UGF0aAotICAgIGVjaG8gU1dUIGZvbGRlciAnJXN3dF9wYXRoJScgZG9lcyBub3QgZXhpc3QuCi0gICAgZWNobyBQbGVhc2Ugc2V0IEFORFJPSURfU1dUIHRvIHBvaW50IHRvIHRoZSBmb2xkZXIgY29udGFpbmluZyBzd3QuamFyIGZvciB5b3VyIHBsYXRmb3JtLgotICAgIGV4aXQgL0IKLQotOlNldFBhdGgKLXNldCBqYXZhZXh0ZGlycz0lc3d0X3BhdGglOyVmcmFtZXdvcmtkaXIlCi0KLWNhbGwgamF2YSAlamF2YV9kZWJ1ZyUgLURqYXZhLmV4dC5kaXJzPSVqYXZhZXh0ZGlycyUgLURjb20uYW5kcm9pZC5kZG1zLmJpbmRpcj0gLWphciAlamFycGF0aCUgJSoKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9hcHAvZXRjL21hbmlmZXN0LnR4dCBiL3Rvb2xzL2RkbXMvYXBwL2V0Yy9tYW5pZmVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzhhY2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmRkbXMuTWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9hcHAvc3JjL0FuZHJvaWQubWsgYi90b29scy9kZG1zL2FwcC9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYjY3OC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlc291cmNlcwotCi1MT0NBTF9KQVJfTUFOSUZFU1QgOj0gLi4vZXRjL21hbmlmZXN0LnR4dAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWFuZHJvaWRwcmVmcyBcCi0Jc2Rrc3RhdHMgXAotCWRkbWxpYiBcCi0JZGRtdWlsaWIgXAotCXN3dCBcCi0Jb3JnLmVjbGlwc2UuamZhY2VfMy40LjIuTTIwMDkwMTA3LTA4MDAgXAotCW9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA4MDQyMS0yMDA2IFwKLQlvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuNC4wLkkyMDA4MDUwOS0yMDAwCi1MT0NBTF9NT0RVTEUgOj0gZGRtcwotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0Fib3V0RGlhbG9nLmphdmEgYi90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9BYm91dERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2YWVlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0Fib3V0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogLy9kZXZpY2UvdG9vbHMvZGRtcy9zcmMvY29tL2FuZHJvaWQvZGRtcy9BYm91dERpYWxvZy5qYXZhCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSW1hZ2VIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBPdXIgImFib3V0IiBib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLSAgICBwcml2YXRlIEltYWdlIGxvZ29JbWFnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB3aXRoIGRlZmF1bHQgc3R5bGUuCi0gICAgICovCi0gICAgcHVibGljIEFib3V0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotICAgICAgICB0aGlzKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgd2l0aCBhcHAtZGVmaW5lZCBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJvdXREaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZSBhbmQgZGlzcGxheSB0aGUgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0gICAgICAgIFNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIGdldFN0eWxlKCkpOwotICAgICAgICBzaGVsbC5zZXRUZXh0KCJBYm91dC4uLiIpOwotCi0gICAgICAgIGxvZ29JbWFnZSA9IGxvYWRJbWFnZShzaGVsbCwgImRkbXMtbG9nby5wbmciKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlQ29udGVudHMoc2hlbGwpOwotICAgICAgICBzaGVsbC5wYWNrKCk7Ci0KLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ29JbWFnZS5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBMb2FkIGFuIGltYWdlIGZpbGUgZnJvbSBhIHJlc291cmNlLgotICAgICAqCi0gICAgICogVGhpcyBkZXBlbmRzIG9uIERpc3BsYXksIHNvIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBydWxlcyBhcmUgZm9yCi0gICAgICogbG9hZGluZyBvbmNlIGFuZCBjYWNoaW5nIGluIGEgc3RhdGljIGNsYXNzIGZpZWxkLgotICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2UgbG9hZEltYWdlKFNoZWxsIHNoZWxsLCBTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW1hZ2VTdHJlYW07Ci0gICAgICAgIFN0cmluZyBwYXRoTmFtZSA9ICIvaW1hZ2VzLyIgKyBmaWxlTmFtZTsgIC8vICROT04tTkxTLTEkCi0KLSAgICAgICAgaW1hZ2VTdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoTmFtZSk7Ci0gICAgICAgIGlmIChpbWFnZVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL3Rocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY291bGRuJ3QgZmluZCAiICsgcGF0aE5hbWUpOwotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiQ291bGRuJ3QgbG9hZCAiICsgcGF0aE5hbWUpOwotICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgcmV0dXJuIEltYWdlSGVscGVyLmNyZWF0ZVBsYWNlSG9sZGVyQXJ0KGRpc3BsYXksIDEwMCwgNTAsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEltYWdlIGltZyA9IG5ldyBJbWFnZShzaGVsbC5nZXREaXNwbGF5KCksIGltYWdlU3RyZWFtKTsKLSAgICAgICAgaWYgKGltZyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb3VsZG4ndCBsb2FkICIgKyBwYXRoTmFtZSk7Ci0gICAgICAgIHJldHVybiBpbWc7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgdGhlIGFib3V0IGJveCBjb250ZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoZmluYWwgU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQ7Ci0gICAgICAgIEdyaWREYXRhIGRhdGE7Ci0gICAgICAgIExhYmVsIGxhYmVsOwotCi0gICAgICAgIHNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0gICAgICAgIC8vIEZhbmN5IGxvZ28KLSAgICAgICAgTGFiZWwgbG9nbyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGxvZ28uc2V0SW1hZ2UobG9nb0ltYWdlKTsKLQotICAgICAgICAvLyBUZXh0IEFyZWEKLSAgICAgICAgQ29tcG9zaXRlIHRleHRBcmVhID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGV4dEFyZWEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAgICAgLy8gVGV4dCBsaW5lcwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbCh0ZXh0QXJlYSwgU1dULk5PTkUpOwotICAgICAgICBpZiAoTWFpbi5zUmV2aXNpb24gIT0gbnVsbCAmJiBNYWluLnNSZXZpc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoIkRhbHZpayBEZWJ1ZyBNb25pdG9yIFJldmlzaW9uICIgKyBNYWluLnNSZXZpc2lvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCJEYWx2aWsgRGVidWcgTW9uaXRvciIpOwotICAgICAgICB9Ci0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHRleHRBcmVhLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkNvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Iik7Ci0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHRleHRBcmVhLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkFsbCBSaWdodHMgUmVzZXJ2ZWQuIik7Ci0KLSAgICAgICAgLy8gYmxhbmsgc3BvdCBpbiBncmlkCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgLy8gIk9LIiBidXR0b24KLSAgICAgICAgQnV0dG9uIG9rID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgICAgICBvay5zZXRUZXh0KCJPSyIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSA4MDsKLSAgICAgICAgb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzaGVsbC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzaGVsbC5wYWNrKCk7Ci0KLSAgICAgICAgc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvRGVidWdQb3J0UHJvdmlkZXIuamF2YSBiL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0RlYnVnUG9ydFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTg2YjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvRGVidWdQb3J0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkRlYnVnUG9ydE1hbmFnZXIuSURlYnVnUG9ydFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERETVMgaW1wbGVtZW50YXRpb24gb2YgdGhlIElEZWJ1Z1BvcnRQcm92aWRlciBpbnRlcmZhY2UuCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgc2F2aW5nL2xvYWRpbmcgdGhlIGxpc3Qgb2Ygc3RhdGljIGRlYnVnIHBvcnQgZnJvbQotICogdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIHByb3ZpZGVzIHRoZSBwb3J0IG51bWJlciB0byB0aGUgRGV2aWNlIE1vbml0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z1BvcnRQcm92aWRlciBpbXBsZW1lbnRzIElEZWJ1Z1BvcnRQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEZWJ1Z1BvcnRQcm92aWRlciBzVGhpcyAgPSBuZXcgRGVidWdQb3J0UHJvdmlkZXIoKTsKLQotICAgIC8qKiBQcmVmZXJlbmNlIG5hbWUgZm9yIHRoZSBzdGF0aWMgcG9ydCBsaXN0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQVRJQ19QT1JUX0xJU1QgPSAiYW5kcm9pZC5zdGF0aWNQb3J0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIE1hcHBpbmcgZGV2aWNlIHNlcmlhbCBudW1iZXJzIHRvIG1hcHMuIFRoZSBlbWJlZGRlZCBtYXBzIGFyZSBtYXBwaW5nIGFwcGxpY2F0aW9uIG5hbWVzIHRvCi0gICAgICogZGVidWdnZXIgcG9ydHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gbU1hcDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRGVidWdQb3J0UHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlYnVnUG9ydFByb3ZpZGVyKCkgewotICAgICAgICBjb21wdXRlUG9ydExpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHN0YXRpYyBkZWJ1ZyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gdGhlCi0gICAgICAgICAqIHNwZWNpZmllZCB7QGxpbmsgSURldmljZX0uCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBvbi4KLSAgICAgICAgICogQHBhcmFtIGFwcE5hbWUgVGhlIGFwcGxpY2F0aW9uIG5hbWUsIGFzIGRlZmluZWQgaW4gdGhlCi0gICAgICAgICAqICBBbmRyb2lkTWFuaWZlc3QueG1sIHBhY2thZ2UgYXR0cmlidXRlLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdGF0aWMgZGVidWcgcG9ydCBvciB7QGxpbmsgI05PX1NUQVRJQ19QT1JUfSBpZiB0aGVyZSBpcyBub25lIHNldHVwLgotICAgICAqCi0gICAgICogQHNlZSBJRGVidWdQb3J0UHJvdmlkZXIjZ2V0UG9ydChJRGV2aWNlLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQb3J0KElEZXZpY2UgZGV2aWNlLCBTdHJpbmcgYXBwTmFtZSkgewotICAgICAgICBpZiAobU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBkZXZpY2VNYXAgPSBtTWFwLmdldChkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgaWYgKGRldmljZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBpID0gZGV2aWNlTWFwLmdldChhcHBOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJRGVidWdQb3J0UHJvdmlkZXIuTk9fU1RBVElDX1BPUlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFwIG9mIFN0YXRpYyBkZWJ1Z2dlciBwb3J0cy4gVGhlIG1hcCBsaW5rcyBkZXZpY2Ugc2VyaWFsIG51bWJlcnMgdG8KLSAgICAgKiBhIG1hcCBsaW5raW5nIGFwcGxpY2F0aW9uIG5hbWUgdG8gZGVidWdnZXIgcG9ydHMuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBnZXRQb3J0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBtYXAgbWVtYmVyIGZyb20gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIFByZWZlcmVuY2UgU3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVQb3J0TGlzdCgpIHsKLSAgICAgICAgbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+KCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwcmVmcyBzdG9yZQotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZnNEaWFsb2cuZ2V0U3RvcmUoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gc3RvcmUuZ2V0U3RyaW5nKFBSRUZTX1NUQVRJQ19QT1JUX0xJU1QpOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gZm9ybWF0IGlzCi0gICAgICAgICAgICAvLyBwb3J0MXxwb3J0Mnxwb3J0M3wuLi4KLSAgICAgICAgICAgIC8vIHdoZXJlIHBvcnQjIGlzCi0gICAgICAgICAgICAvLyBhcHBQYWNrYWdlTmFtZTphcHBQb3J0TnVtYmVyOmRldmljZS1zZXJpYWwtbnVtYmVyCi0gICAgICAgICAgICBTdHJpbmdbXSBwb3J0U2VnbWVudHMgPSB2YWx1ZS5zcGxpdCgiXFx8Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBzZWcgOiBwb3J0U2VnbWVudHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBlbnRyeSA9IHNlZy5zcGxpdCgiOiIpOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBzdXBwb3J0LiBpZiB3ZSBoYXZlIG9ubHkgMiBlbnRyeSwgd2UgZGVmYXVsdAotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBmaXJzdCBlbXVsYXRvci4KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5Lmxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWUgPSBlbnRyeVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lID0gSURldmljZS5GSVJTVF9FTVVMQVRPUl9TTjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRldmljZSBtYXAKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBkZXZpY2VNYXAgPSBtTWFwLmdldChkZXZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICAgICAgICAgICAgICBtTWFwLnB1dChkZXZpY2VOYW1lLCBkZXZpY2VNYXApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRldmljZU1hcC5wdXQoZW50cnlbMF0sIEludGVnZXIudmFsdWVPZihlbnRyeVsxXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBuZXcgW2RldmljZSwgYXBwLCBwb3J0XSB2YWx1ZXMuCi0gICAgICogVGhlIHZhbHVlcyBhcmUgYWxzbyBzeW5jJ2VkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAqIEBwYXJhbSBtYXAgVGhlIG1hcCBjb250YWluaW5nIHRoZSBuZXcgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnRMaXN0KE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsSW50ZWdlcj4+IG1hcCkgewotICAgICAgICAvLyB1cGRhdGUgdGhlIG1lbWJlciBtYXAuCi0gICAgICAgIG1NYXAuY2xlYXIoKTsKLSAgICAgICAgbU1hcC5wdXRBbGwobWFwKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgICAgICAvLyBzZWUgZm9ybWF0IGRlZmluaXRpb24gaW4gZ2V0UG9ydExpc3QKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gZGV2aWNlS2V5cyA9IG1hcC5rZXlTZXQoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgZGV2aWNlS2V5IDogZGV2aWNlS2V5cykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gZGV2aWNlTWFwID0gbWFwLmdldChkZXZpY2VLZXkpOwotICAgICAgICAgICAgaWYgKGRldmljZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gYXBwS2V5cyA9IGRldmljZU1hcC5rZXlTZXQoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFwcEtleSA6IGFwcEtleXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwb3J0ID0gZGV2aWNlTWFwLmdldChhcHBLZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYXBwS2V5KS5hcHBlbmQoJzonKS5hcHBlbmQocG9ydC5pbnRWYWx1ZSgpKS5hcHBlbmQoJzonKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQoZGV2aWNlS2V5KS5hcHBlbmQoJ3wnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwcmVmcyBzdG9yZS4KLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZzRGlhbG9nLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgLy8gYW5kIGdpdmUgaXQgdGhlIG5ldyB2YWx1ZS4KLSAgICAgICAgc3RvcmUuc2V0VmFsdWUoUFJFRlNfU1RBVElDX1BPUlRfTElTVCwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0RldmljZUNvbW1hbmREaWFsb2cuamF2YSBiL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0RldmljZUNvbW1hbmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NTczMy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9EZXZpY2VDb21tYW5kRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyogLy9kZXZpY2UvdG9vbHMvZGRtcy9zcmMvY29tL2FuZHJvaWQvZGRtcy9EZXZpY2VDb21tYW5kRGlhbG9nLmphdmEKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklTaGVsbE91dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBFeGVjdXRlIGEgY29tbWFuZCBvbiBhbiBBREItYXR0YWNoZWQgZGV2aWNlIGFuZCBzYXZlIHRoZSBvdXRwdXQuCi0gKgotICogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkbyB0aGlzLiAgT25lIGlzIHRvIHJ1biBhIHNpbmdsZSBjb21tYW5kCi0gKiBhbmQgc2hvdyB0aGUgb3V0cHV0LiAgQW5vdGhlciBpcyB0byBoYXZlIHNldmVyYWwgcG9zc2libGUgY29tbWFuZHMgYW5kCi0gKiBsZXQgdGhlIHVzZXIgY2xpY2sgYSBidXR0b24gbmV4dCB0byB0aGUgb25lIChvciBvbmVzKSB0aGV5IHdhbnQuICBUaGlzCi0gKiBjdXJyZW50bHkgdXNlcyB0aGUgc2ltcGxlIDE6MSBmb3JtLgotICovCi1wdWJsaWMgY2xhc3MgRGV2aWNlQ29tbWFuZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfU1RBVEUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9TVEFURSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9fU1RBVEUgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR0NBVCA9IDM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtQ29tbWFuZDsKLSAgICBwcml2YXRlIFN0cmluZyBtRmlsZU5hbWU7Ci0KLSAgICBwcml2YXRlIExhYmVsIG1TdGF0dXNMYWJlbDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ2FuY2VsRG9uZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU2F2ZTsKLSAgICBwcml2YXRlIFRleHQgbVRleHQ7Ci0gICAgcHJpdmF0ZSBGb250IG1Gb250ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgd2l0aCBkZWZhdWx0IHN0eWxlLgotICAgICAqLwotICAgIHB1YmxpYyBEZXZpY2VDb21tYW5kRGlhbG9nKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgZmlsZU5hbWUsIFNoZWxsIHBhcmVudCkgewotICAgICAgICAvLyBkb24ndCB3YW50IGEgY2xvc2UgYnV0dG9uLCBidXQgaXQgc2VlbXMgaGFyZCB0byBnZXQgcmlkIG9mIG9uIEdUSwotICAgICAgICAvLyBrZWVwIGl0IG9uIGFsbCBwbGF0Zm9ybXMgZm9yIGNvbnNpc3RlbmN5Ci0gICAgICAgIHRoaXMoY29tbWFuZCwgZmlsZU5hbWUsIHBhcmVudCwKLSAgICAgICAgICAgIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5CT1JERVIgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgd2l0aCBhcHAtZGVmaW5lZCBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGV2aWNlQ29tbWFuZERpYWxvZyhTdHJpbmcgY29tbWFuZCwgU3RyaW5nIGZpbGVOYW1lLCBTaGVsbCBwYXJlbnQsCi0gICAgICAgIGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgIG1GaWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZXBhcmUgYW5kIGRpc3BsYXkgdGhlIGRpYWxvZy4KLSAgICAgKiBAcGFyYW0gY3VycmVudERldmljZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW4oSURldmljZSBjdXJyZW50RGV2aWNlKSB7Ci0gICAgICAgIFNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIGdldFN0eWxlKCkpOwotICAgICAgICBzaGVsbC5zZXRUZXh0KCJSZW1vdGUgQ29tbWFuZCIpOwotCi0gICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICBtRm9udCA9IGZpbmRGb250KHNoZWxsLmdldERpc3BsYXkoKSk7Ci0gICAgICAgIGNyZWF0ZUNvbnRlbnRzKHNoZWxsKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHdlaXJkIGxheW91dCBiZWhhdmlvciB1bmRlciBMaW51eCB3aGVuIFRleHQgaXMgYWRkZWQgLS0KLSAgICAgICAgLy8gbG9va3MgbGlrZSB0ZXh0IHdpZGdldCBoYXMgbWluIHdpZHRoIG9mIDQwMCB3aGVuIEZJTExfSE9SSVpPTlRBTAotICAgICAgICAvLyBpcyB1c2VkLCBhbmQgbGF5b3V0IGdldHMgdHdlYWtlZCB0byBmb3JjZSB0aGlzLiAgKE1pZ2h0IGJlIGV2ZW4KLSAgICAgICAgLy8gbW9yZSB3aXRoIHRoZSBzY3JvbGwgYmFycyBpbiBwbGFjZSAtLSBpdCB3aWdnZWQgb3V0IHdoZW4gdGhlCi0gICAgICAgIC8vIGZpbGUgc2F2ZSBkaWFsb2cgd2FzIGludm9rZWQuKQotICAgICAgICBzaGVsbC5zZXRNaW5pbXVtU2l6ZSg1MDAsIDIwMCk7Ci0gICAgICAgIHNoZWxsLnNldFNpemUoODAwLCA2MDApOwotICAgICAgICBzaGVsbC5vcGVuKCk7Ci0KLSAgICAgICAgZXhlY3V0ZUNvbW1hbmQoc2hlbGwsIGN1cnJlbnREZXZpY2UpOwotCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICAgICAgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Gb250ICE9IG51bGwpCi0gICAgICAgICAgICBtRm9udC5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgYSB0ZXh0IHdpZGdldCB0byBzaG93IHRoZSBvdXRwdXQgYW5kIHNvbWUgYnV0dG9ucyB0bwotICAgICAqIG1hbmFnZSB0aGluZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIEdyaWREYXRhIGRhdGE7Ci0KLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRmluaXNoZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiTk9UIGNsb3NpbmcgLSBjYW5jZWxsaW5nIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtQ2FuY2VsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1TdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dCgiRXhlY3V0aW5nICciICsgc2hvcnRDb21tYW5kU3RyaW5nKCkgKyAiJyIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1TdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIG1UZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIG1UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgbVRleHQuc2V0Rm9udChtRm9udCk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgLy8gInNhdmUiIGJ1dHRvbgotICAgICAgICBtU2F2ZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICAgICAgbVNhdmUuc2V0VGV4dCgiU2F2ZSIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSA4MDsKLSAgICAgICAgbVNhdmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbVNhdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzYXZlVGV4dChzaGVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtU2F2ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyAiY2FuY2VsL2RvbmUiIGJ1dHRvbgotICAgICAgICBtQ2FuY2VsRG9uZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICAgICAgbUNhbmNlbERvbmUuc2V0VGV4dCgiQ2FuY2VsIik7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IDgwOwotICAgICAgICBtQ2FuY2VsRG9uZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtQ2FuY2VsRG9uZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmICghbUZpbmlzaGVkKQotICAgICAgICAgICAgICAgICAgICBtQ2FuY2VsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmlndXJlIG91dCB3aGF0IGZvbnQgdG8gdXNlLgotICAgICAqCi0gICAgICogUmV0dXJucyAibnVsbCIgaWYgd2UgY2FuJ3QgZmlndXJlIGl0IG91dCwgd2hpY2ggU1dUIHVuZGVyc3RhbmRzIHRvCi0gICAgICogbWVhbiAidXNlIGRlZmF1bHQgc3lzdGVtIGZvbnQiLgotICAgICAqLwotICAgIHByaXZhdGUgRm9udCBmaW5kRm9udChEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgU3RyaW5nIGZvbnRTdHIgPSBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpLmdldFN0cmluZygidGV4dE91dHB1dEZvbnQiKTsKLSAgICAgICAgaWYgKGZvbnRTdHIgIT0gbnVsbCkgewotICAgICAgICAgICAgRm9udERhdGEgZmRhdCA9IG5ldyBGb250RGF0YShmb250U3RyKTsKLSAgICAgICAgICAgIGlmIChmZGF0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb250KGRpc3BsYXksIGZkYXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDYWxsYmFjayBjbGFzcyBmb3IgY29tbWFuZCBleGVjdXRpb24uCi0gICAgICovCi0gICAgY2xhc3MgR2F0aGVyZXIgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBJU2hlbGxPdXRwdXRSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9VTktOT1dOID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1NVQ0NFU1MgPSAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRkFJTFVSRSA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9DQU5DRUxMRUQgPSAzOwotCi0gICAgICAgIHByaXZhdGUgU2hlbGwgbVNoZWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBUZXh0IG1UZXh0OwotICAgICAgICBwcml2YXRlIGludCBtUmVzdWx0OwotICAgICAgICBwcml2YXRlIElEZXZpY2UgbURldmljZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3I7IHBhc3MgaW4gdGhlIHRleHQgd2lkZ2V0IHRoYXQgd2lsbCByZWNlaXZlIHRoZSBvdXRwdXQuCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBHYXRoZXJlcihTaGVsbCBzaGVsbCwgSURldmljZSBkZXZpY2UsIFN0cmluZyBjb21tYW5kLCBUZXh0IHRleHQpIHsKLSAgICAgICAgICAgIG1TaGVsbCA9IHNoZWxsOwotICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBSRVNVTFRfVU5LTk9XTjsKLQotICAgICAgICAgICAgLy8gdGhpcyBpcyBpbiBvdXRlciBjbGFzcwotICAgICAgICAgICAgbUNhbmNlbCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRocmVhZCBlbnRyeSBwb2ludC4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICAgICAgICAgIGlmIChtRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJDYW5ub3QgZXhlY3V0ZSBjb21tYW5kOiBubyBkZXZpY2Ugc2VsZWN0ZWQuIik7Ci0gICAgICAgICAgICAgICAgbVJlc3VsdCA9IFJFU1VMVF9GQUlMVVJFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQobUNvbW1hbmQsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNhbmNlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN1bHQgPSBSRVNVTFRfQ0FOQ0VMTEVEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdWx0ID0gUkVTVUxUX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiUmVtb3RlIGV4ZWMgZmFpbGVkOiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN1bHQgPSBSRVNVTFRfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvclJlc3VsdChtUmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkgZXhlY3V0ZVJlbW90ZUNvbW1hbmQoKS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZE91dHB1dChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0gICAgICAgICAgICBMb2cudigiZGRtcyIsICJyZWNlaXZlZCAiICsgbGVuZ3RoICsgIiBieXRlcyIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dDsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gbmV3IFN0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCwgIklTTy04ODU5LTEiKTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0ZXh0IHdpZGdldDsgbXVzdCBkbyBpbiBVSSB0aHJlYWQKLSAgICAgICAgICAgICAgICBtVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQuYXBwZW5kKHRleHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKLSAgICAgICAgICAgICAgICB1ZWUucHJpbnRTdGFja1RyYWNlKCk7ICAgICAgLy8gbm90IGV4cGVjdGVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZmx1c2guCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IGV4ZWN1dGVSZW1vdGVDb21tYW5kKCkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuY2VsOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qCi0gICAgICogRXhlY3V0ZSBhIHJlbW90ZSBjb21tYW5kLCBhZGQgdGhlIG91dHB1dCB0byB0aGUgdGV4dCB3aWRnZXQsIGFuZAotICAgICAqIHVwZGF0ZSBjb250cm9scy4KLSAgICAgKgotICAgICAqIFdlIGhhdmUgdG8gcnVuIHRoZSBjb21tYW5kIGluIGEgdGhyZWFkIHNvIHRoYXQgdGhlIFVJIGNvbnRpbnVlcwotICAgICAqIHRvIHdvcmsuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDb21tYW5kKFNoZWxsIHNoZWxsLCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICBHYXRoZXJlciBnYXRoID0gbmV3IEdhdGhlcmVyKHNoZWxsLCBkZXZpY2UsIGNvbW1hbmRTdHJpbmcoKSwgbVRleHQpOwotICAgICAgICBnYXRoLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGNvbnRyb2xzIGFmdGVyIHRoZSByZW1vdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4gIFRoaXMKLSAgICAgKiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvclJlc3VsdChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gR2F0aGVyZXIuUkVTVUxUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KCJTdWNjZXNzZnVsbHkgZXhlY3V0ZWQgJyIKLSAgICAgICAgICAgICAgICArIHNob3J0Q29tbWFuZFN0cmluZygpICsgIiciKTsKLSAgICAgICAgICAgIG1TYXZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IEdhdGhlcmVyLlJFU1VMVF9DQU5DRUxMRUQpIHsKLSAgICAgICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KCJFeGVjdXRpb24gY2FuY2VsbGVkOyBwYXJ0aWFsIHJlc3VsdHMgYmVsb3ciKTsKLSAgICAgICAgICAgIG1TYXZlLnNldEVuYWJsZWQodHJ1ZSk7ICAgICAvLyBzYXZlIHBhcnRpYWwKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gR2F0aGVyZXIuUkVTVUxUX0ZBSUxVUkUpIHsKLSAgICAgICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KCJGYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtU3RhdHVzTGFiZWwucGFjaygpOwotICAgICAgICBtQ2FuY2VsRG9uZS5zZXRUZXh0KCJEb25lIik7Ci0gICAgICAgIG1GaW5pc2hlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBbGxvdyB0aGUgdXNlciB0byBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgdGV4dCBkaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVUZXh0KFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZGxnID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TQVZFKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lOwotCi0gICAgICAgIGRsZy5zZXRUZXh0KCJTYXZlIG91dHB1dC4uLiIpOwotICAgICAgICBkbGcuc2V0RmlsZU5hbWUoZGVmYXVsdEZpbGVOYW1lKCkpOwotICAgICAgICBkbGcuc2V0RmlsdGVyUGF0aChQcmVmc0RpYWxvZy5nZXRTdG9yZSgpLmdldFN0cmluZygibGFzdFRleHRTYXZlRGlyIikpOwotICAgICAgICBkbGcuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJUZXh0IEZpbGVzICgqLnR4dCkiCi0gICAgICAgIH0pOwotICAgICAgICBkbGcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIioudHh0IgotICAgICAgICB9KTsKLQotICAgICAgICBmaWxlTmFtZSA9IGRsZy5vcGVuKCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpLnNldFZhbHVlKCJsYXN0VGV4dFNhdmVEaXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGcuZ2V0RmlsdGVyUGF0aCgpKTsKLQotICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiU2F2aW5nIG91dHB1dCB0byAiICsgZmlsZU5hbWUpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29udmVydCB0byA4LWJpdCBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1UZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgIGJ5dGVbXSBhc2NpaTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXNjaWkgPSB0ZXh0LmdldEJ5dGVzKCJJU08tODg1OS0xIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKLSAgICAgICAgICAgICAgICB1ZWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgYXNjaWkgPSBuZXcgYnl0ZVswXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE91dHB1dCBkYXRhLCBjb252ZXJ0aW5nIENSTEYgdG8gTEYuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGFzY2lpLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0RmlsZSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aC0xICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhc2NpaVtpXSA9PSAweDBkICYmIGFzY2lpW2krMV0gPT0gMHgwYSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGFzY2lpW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7ICAgICAgICAvLyBmbHVzaCBidWZmZXIsIGNsb3NlIGZpbGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJVbmFibGUgdG8gc2F2ZSAiICsgZmlsZU5hbWUgKyAiOiAiICsgaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIHNoZWxsIGNvbW1hbmQgd2UncmUgZ29pbmcgdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmRTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQ29tbWFuZDsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIGEgZGVmYXVsdCBmaWxlbmFtZSBmb3IgdGhlICJzYXZlIiBjb21tYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIExpa2UgY29tbWFuZFN0cmluZygpLCBidXQgbGVuZ3RoLWxpbWl0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRDb21tYW5kU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgc3RyID0gY29tbWFuZFN0cmluZygpOwotICAgICAgICBpZiAoc3RyLmxlbmd0aCgpID4gNTApCi0gICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCA1MCkgKyAiLi4uIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0Ryb3Bkb3duU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL0Ryb3Bkb3duU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkOTIxYy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9Ecm9wZG93blNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiAvL2RldmljZS90b29scy9kZG1zL3NyYy9jb20vYW5kcm9pZC9kZG1zL0Ryb3Bkb3duU2VsZWN0aW9uTGlzdGVuZXIuamF2YQotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgZHJvcC1kb3duIG1lbnVzIGluIHRvb2xiYXJzLgotICovCi1wdWJsaWMgY2xhc3MgRHJvcGRvd25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotICAgIHByaXZhdGUgTWVudSBtTWVudTsKLSAgICBwcml2YXRlIFRvb2xJdGVtIG1Ecm9wZG93bjsKLQotICAgIC8qKgotICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yLiAgQ3JlYXRlcyBhbiBlbXB0eSBNZW51IHRvIGhvbGQgaXRlbXMuCi0gICAgICovCi0gICAgcHVibGljIERyb3Bkb3duU2VsZWN0aW9uTGlzdGVuZXIoVG9vbEl0ZW0gaXRlbSkgewotICAgICAgICBtRHJvcGRvd24gPSBpdGVtOwotICAgICAgICBtTWVudSA9IG5ldyBNZW51KGl0ZW0uZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGl0ZW0gdG8gdGhlIGRyb3Bkb3duIG1lbnUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBsYWJlbCkgewotICAgICAgICBNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1NZW51LCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChsYWJlbCk7Ci0gICAgICAgIGl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRyb3Bkb3duJ3MgdGV4dCB0byBtYXRjaCB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgTWVudUl0ZW0gc2VsID0gKE1lbnVJdGVtKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBtRHJvcGRvd24uc2V0VGV4dChzZWwuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlZCB3aGVuIGRyb3Bkb3duIG9yIG5laWdoYm9yaW5nIGFycm93IGlzIGNsaWNrZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0gICAgICAgICAgICAvLyBhcnJvdyBjbGlja2VkLCBzaG93IG1lbnUKLSAgICAgICAgICAgIFRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pIGUud2lkZ2V0OwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcygpOwotICAgICAgICAgICAgUG9pbnQgcHQgPSBpdGVtLmdldFBhcmVudCgpLnRvRGlzcGxheShuZXcgUG9pbnQocmVjdC54LCByZWN0LnkpKTsKLSAgICAgICAgICAgIG1NZW51LnNldExvY2F0aW9uKHB0LngsIHB0LnkgKyByZWN0LmhlaWdodCk7Ci0gICAgICAgICAgICBtTWVudS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYnV0dG9uIGNsaWNrZWQKLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgbURyb3Bkb3duLmdldFRleHQoKSArICIgUHJlc3NlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9NYWluLmphdmEgYi90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDUxOWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZWJ1Z1BvcnRNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2Rrc3RhdHMuU2RrU3RhdHNTZXJ2aWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5SdW50aW1lTVhCZWFuOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0KLS8qKgotICogU3RhcnQgdGhlIFVJIGFuZCBuZXR3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzUmV2aXNpb247Ci0KLSAgICBwdWJsaWMgTWFpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIGEgdGhyZWFkIGJhaWxzIHdpdGggYW4gdW5jYXVnaHQgZXhjZXB0aW9uLCBicmluZyB0aGUgd2hvbGUKLSAgICAgKiB0aGluZyBkb3duLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVuY2F1Z2h0SGFuZGxlciBpbXBsZW1lbnRzIFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCB1bmNhdWdodEV4Y2VwdGlvbihUaHJlYWQgdCwgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgInNodXR0aW5nIGRvd24gZHVlIHRvIHVuY2F1Z2h0IGV4Y2VwdGlvbiIpOwotCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgICAgICBMb2cuZSgiZGRtcyIsIHN3LnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFyZ3MsIHN0YXJ0IHRocmVhZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICAvLyBJbiBvcmRlciB0byBoYXZlIHRoZSBBV1QvU1dUIGJyaWRnZSB3b3JrIG9uIExlb3BhcmQsIHdlIGRvIHRoaXMgbGl0dGxlIGhhY2suCi0gICAgICAgIFN0cmluZyBvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChvcy5zdGFydHNXaXRoKCJNYWMgT1MiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBSdW50aW1lTVhCZWFuIHJ0ID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UnVudGltZU1YQmVhbigpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAiSkFWQV9TVEFSVEVEX09OX0ZJUlNUX1RIUkVBRF8iICsgKHJ0LmdldE5hbWUoKS5zcGxpdCgiQCIpKVswXSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBUaHJlYWQuc2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgVW5jYXVnaHRIYW5kbGVyKCkpOwotCi0gICAgICAgIC8vIGxvYWQgcHJlZnMgYW5kIGluaXQgdGhlIGRlZmF1bHQgdmFsdWVzCi0gICAgICAgIFByZWZzRGlhbG9nLmluaXQoKTsKLQotICAgICAgICBMb2cuZCgiZGRtcyIsICJJbml0aWFsaXppbmciKTsKLQotICAgICAgICAvLyB0aGUgInBpbmciIGFyZ3VtZW50IG1lYW5zIHRvIGNoZWNrIGluIHdpdGggdGhlIHNlcnZlciBhbmQgZXhpdAotICAgICAgICAvLyB0aGUgYXBwbGljYXRpb24gbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIgbXVzdCBhbHNvIGJlIHN1cHBsaWVkCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAzICYmIGFyZ3NbMF0uZXF1YWxzKCJwaW5nIikpIHsKLSAgICAgICAgICAgIFNka1N0YXRzU2VydmljZS5waW5nKGFyZ3NbMV0sIGFyZ3NbMl0sIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgTG9nLmUoImRkbXMiLCAiVW5rbm93biBhcmd1bWVudDogIiArIGFyZ3NbMF0pOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGRkbXMgcGFyZW50IGZvbGRlciBsb2NhdGlvbgotICAgICAgICBTdHJpbmcgZGRtc1BhcmVudExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJjb20uYW5kcm9pZC5kZG1zLmJpbmRpciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gd2UncmUgcGFzdCB0aGUgcG9pbnQgd2hlcmUgZGRtcyBjYW4gYmUgY2FsbGVkIGp1c3QgdG8gc2VuZCBhIHBpbmcsIHNvIHdlIGNhbgotICAgICAgICAvLyBwaW5nIGZvciBkZG1zIGl0c2VsZi4KLSAgICAgICAgcGluZyhkZG1zUGFyZW50TG9jYXRpb24pOwotCi0gICAgICAgIERlYnVnUG9ydE1hbmFnZXIuc2V0UHJvdmlkZXIoRGVidWdQb3J0UHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0aHJlZSBtYWluIHRocmVhZHMKLSAgICAgICAgVUlUaHJlYWQgdWkgPSBVSVRocmVhZC5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1aS5ydW5VSShkZG1zUGFyZW50TG9jYXRpb24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgUHJlZnNEaWFsb2cuc2F2ZSgpOwotCi0gICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZCgiZGRtcyIsICJCeWUiKTsKLQotICAgICAgICAvLyB0aGlzIGlzIGtpbmRhIGJhZCwgYnV0IG9uIE1hY09TIHRoZSBzaHV0ZG93biBkb2Vzbid0IHNlZW0gdG8gZmluaXNoIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gYSB0aHJlYWQgY2FsbGVkIEFXVC1TaHV0ZG93bi4gVGhpcyB3aWxsIGhlbHAgd2hpbGUgSSB0cmFjayB0aGlzIGRvd24uCi0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwaW5nKFN0cmluZyBkZG1zUGFyZW50TG9jYXRpb24pIHsKLSAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgRmlsZSBzb3VyY2VQcm9wOwotICAgICAgICAgICAgaWYgKGRkbXNQYXJlbnRMb2NhdGlvbiAhPSBudWxsICYmIGRkbXNQYXJlbnRMb2NhdGlvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VQcm9wID0gbmV3IEZpbGUoZGRtc1BhcmVudExvY2F0aW9uLCAic291cmNlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VQcm9wID0gbmV3IEZpbGUoInNvdXJjZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZVByb3ApKTsKLSAgICAgICAgICAgIHNSZXZpc2lvbiA9IHAuZ2V0UHJvcGVydHkoIlBrZy5SZXZpc2lvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoc1JldmlzaW9uICE9IG51bGwgJiYgc1JldmlzaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFNka1N0YXRzU2VydmljZS5waW5nKCJkZG1zIiwgc1JldmlzaW9uLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGZpbGU/IGRvbid0IHBpbmcuCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGZpbGU/IGRvbid0IHBpbmcuCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9QcmVmc0RpYWxvZy5qYXZhIGIvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvUHJlZnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkYmZlNi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9QcmVmc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qIC8vZGV2aWNlL3Rvb2xzL2RkbXMvc3JjL2NvbS9hbmRyb2lkL2RkbXMvUHJlZnNEaWFsb2cuamF2YQotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRGRtQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZG1QcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRGRtVWlQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5Qb3J0RmllbGRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2Rrc3RhdHMuU2RrU3RhdHNTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5EaXJlY3RvcnlGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Gb250RmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgZGlhbG9nLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlZnNEaWFsb2cgewotCi0gICAgLy8gUHJlZmVyZW5jZSBzdG9yZS4KLSAgICBwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlU3RvcmUgbVByZWZTdG9yZTsKLQotICAgIC8vIHB1YmxpYyBjb25zdCB2YWx1ZXMgZm9yIHN0b3JhZ2UKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSEVMTF9YID0gInNoZWxsWCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSEVMTF9ZID0gInNoZWxsWSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSEVMTF9XSURUSCA9ICJzaGVsbFdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNIRUxMX0hFSUdIVCA9ICJzaGVsbEhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFBMT1JFUl9TSEVMTF9YID0gImV4cGxvcmVyU2hlbGxYIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYUExPUkVSX1NIRUxMX1kgPSAiZXhwbG9yZXJTaGVsbFkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhQTE9SRVJfU0hFTExfV0lEVEggPSAiZXhwbG9yZXJTaGVsbFdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYUExPUkVSX1NIRUxMX0hFSUdIVCA9ICJleHBsb3JlclNoZWxsSGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNIT1dfTkFUSVZFX0hFQVAgPSAibmF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HQ0FUX0NPTFVNTl9NT0RFID0gImRkbXNMb2dDb2x1bW5Nb2RlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR0NBVF9GT05UID0gImRkbXNMb2dGb250IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HQ0FUX0NPTFVNTl9NT0RFX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0dDQVRfQ09MVU1OX01PREVfTUFOVUFMID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19ERUJVR19QT1JUX0JBU0UgPSAiYWRiRGVidWdCYXNlUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfU0VMRUNURURfREVCVUdfUE9SVCA9ICJkZWJ1Z1NlbGVjdGVkUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfREVGQVVMVF9USFJFQURfVVBEQVRFID0gImRlZmF1bHRUaHJlYWRVcGRhdGVFbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19ERUZBVUxUX0hFQVBfVVBEQVRFID0gImRlZmF1bHRIZWFwVXBkYXRlRW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfVEhSRUFEX1JFRlJFU0hfSU5URVJWQUwgPSAidGhyZWFkU3RhdHVzSW50ZXJ2YWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0xPR19MRVZFTCA9ICJkZG1zTG9nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1RJTUVPVVQgPSAidGltZU91dCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciAtLSBkbyBub3QgaW5zdGFudGlhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmVmc0RpYWxvZygpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFByZWZlcmVuY2VTdG9yZSB0aGF0IGhvbGRzIG91ciB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlU3RvcmUgZ2V0U3RvcmUoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZlN0b3JlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHByZWZzIHRvIHRoZSBjb25maWcgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1QcmVmU3RvcmUuc2F2ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIkZhaWxlZCBzYXZpbmcgcHJlZnMgZmlsZTogIiArIGlvZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gc29tZSBvbmUtdGltZSBwcmVwLgotICAgICAqCi0gICAgICogVGhlIG9yaWdpbmFsIHBsYW4gd2FzIHRvIGxldCB0aGUgaW5kaXZpZHVhbCBjbGFzc2VzIGRlZmluZSB0aGVpcgotICAgICAqIG93biBkZWZhdWx0cywgd2hpY2ggd2Ugd291bGQgZ2V0IGFuZCB0aGVuIG92ZXJyaWRlIHdpdGggdGhlIGNvbmZpZwotICAgICAqIGZpbGUuICBIb3dldmVyLCBQcmVmZXJlbmNlc1N0b3JlLmxvYWQoKSBkb2Vzbid0IHRyaWdnZXIgdGhlICJjaGFuZ2VkIgotICAgICAqIGV2ZW50cywgd2hpY2ggbWVhbnMgd2UgaGF2ZSB0byBwdWxsIHRoZSBsb2FkZWQgY29uZmlnIHZhbHVlcyBvdXQgYnkKLSAgICAgKiBoYW5kLgotICAgICAqCi0gICAgICogU28sIHdlIHNldCB0aGUgZGVmYXVsdHMsIGxvYWQgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb25maWcgZmlsZSwgYW5kCi0gICAgICogdGhlbiBydW4gdGhyb3VnaCBhbmQgbWFudWFsbHkgZXhwb3J0IHRoZSB2YWx1ZXMuICBUaGVuIHdlIGR1cGxpY2F0ZQotICAgICAqIHRoZSBzZWNvbmQgcGFydCBsYXRlciBvbiBmb3IgdGhlICJjaGFuZ2VkIiBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGFzc2VydCBtUHJlZlN0b3JlID09IG51bGw7Ci0KLSAgICAgICAgbVByZWZTdG9yZSA9IFNka1N0YXRzU2VydmljZS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgICAgICBpZiAobVByZWZTdG9yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc2VyaW91cyBpc3N1ZSBoZXJlLi4uCi0gICAgICAgICAgICBMb2cuZSgiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYWNjZXNzIGJvdGggdGhlIHVzZXIgSE9NRSBkaXJlY3RvcnkgYW5kIHRoZSBzeXN0ZW0gd2lkZSB0ZW1wIGZvbGRlci4gUXVpdHRpbmcuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IHZhbHVlcwotICAgICAgICBzZXREZWZhdWx0cyhTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIGxpc3RlbiBmb3IgY2hhbmdlcwotICAgICAgICBtUHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IENoYW5nZUxpc3RlbmVyKCkpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBpbml0aWFsaXplIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSwgZnJvbSB0aGUgdmFsdWVzIGluIHRoZSBzdG9yZS4KLQotICAgICAgICAvLyBGaXJzdCB0aGUgZGRtIGxpYi4KLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0RGVidWdQb3J0QmFzZShtUHJlZlN0b3JlLmdldEludChQUkVGU19ERUJVR19QT1JUX0JBU0UpKTsKLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0U2VsZWN0ZWREZWJ1Z1BvcnQobVByZWZTdG9yZS5nZXRJbnQoUFJFRlNfU0VMRUNURURfREVCVUdfUE9SVCkpOwotICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRMb2dMZXZlbChtUHJlZlN0b3JlLmdldFN0cmluZyhQUkVGU19MT0dfTEVWRUwpKTsKLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0SW5pdGlhbFRocmVhZFVwZGF0ZShtUHJlZlN0b3JlLmdldEJvb2xlYW4oUFJFRlNfREVGQVVMVF9USFJFQURfVVBEQVRFKSk7Ci0gICAgICAgIERkbVByZWZlcmVuY2VzLnNldEluaXRpYWxIZWFwVXBkYXRlKG1QcmVmU3RvcmUuZ2V0Qm9vbGVhbihQUkVGU19ERUZBVUxUX0hFQVBfVVBEQVRFKSk7Ci0gICAgICAgIERkbVByZWZlcmVuY2VzLnNldFRpbWVPdXQobVByZWZTdG9yZS5nZXRJbnQoUFJFRlNfVElNRU9VVCkpOwotCi0gICAgICAgIC8vIHNvbWUgc3RhdGljIHZhbHVlcwotICAgICAgICBTdHJpbmcgb3V0ID0gU3lzdGVtLmdldGVudigiQU5EUk9JRF9QUk9EVUNUX09VVCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIERkbVVpUHJlZmVyZW5jZXMuc2V0U3ltYm9sc0xvY2F0aW9uKG91dCArIEZpbGUuc2VwYXJhdG9yICsgInN5bWJvbHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBEZG1VaVByZWZlcmVuY2VzLnNldEFkZHIyTGluZUxvY2F0aW9uKCJhcm0tZWFiaS1hZGRyMmxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZyB0cmFjZXZpZXcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbS5hbmRyb2lkLmRkbXMuYmluZGlyIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh0cmFjZXZpZXcgIT0gbnVsbCAmJiB0cmFjZXZpZXcubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgdHJhY2V2aWV3ICs9IEZpbGUuc2VwYXJhdG9yICsgRGRtQ29uc3RhbnRzLkZOX1RSQUNFVklFVzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYWNldmlldyA9IERkbUNvbnN0YW50cy5GTl9UUkFDRVZJRVc7Ci0gICAgICAgIH0KLSAgICAgICAgRGRtVWlQcmVmZXJlbmNlcy5zZXRUcmFjZXZpZXdMb2NhdGlvbih0cmFjZXZpZXcpOwotCi0gICAgICAgIC8vIE5vdyB0aGUgZGRtdWkgbGliCi0gICAgICAgIERkbVVpUHJlZmVyZW5jZXMuc2V0U3RvcmUobVByZWZTdG9yZSk7Ci0gICAgICAgIERkbVVpUHJlZmVyZW5jZXMuc2V0VGhyZWFkUmVmcmVzaEludGVydmFsKG1QcmVmU3RvcmUuZ2V0SW50KFBSRUZTX1RIUkVBRF9SRUZSRVNIX0lOVEVSVkFMKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBwcmVmZXJlbmNlcy4gIFRoZXNlIGFyZSBlaXRoZXIgZGVmaW5lZAotICAgICAqIHN0YXRpY2FsbHkgb3IgYXJlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgc2V0IGJ5IHRoZSBjbGFzcyBpbml0aWFsaXplcnMKLSAgICAgKiBpbiBvdGhlciBjbGFzc2VzLgotICAgICAqCi0gICAgICogVGhlIG90aGVyIHRocmVhZHMgKGUuZy4gVk1XYXRjaGVyVGhyZWFkKSBoYXZlbid0IGJlZW4gY3JlYXRlZCB5ZXQsCi0gICAgICogc28gd2Ugd2FudCB0byB1c2Ugc3RhdGljIHZhbHVlcyByYXRoZXIgdGhhbiByZWFkaW5nIGZpZWxkcyBmcm9tCi0gICAgICogY2xhc3MuZ2V0SW5zdGFuY2UoKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlZmF1bHRzKFN0cmluZyBob21lRGlyKSB7Ci0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChQUkVGU19ERUJVR19QT1JUX0JBU0UsIERkbVByZWZlcmVuY2VzLkRFRkFVTFRfREVCVUdfUE9SVF9CQVNFKTsKLQotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoUFJFRlNfU0VMRUNURURfREVCVUdfUE9SVCwKLSAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5ERUZBVUxUX1NFTEVDVEVEX0RFQlVHX1BPUlQpOwotCi0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChQUkVGU19ERUZBVUxUX1RIUkVBRF9VUERBVEUsIHRydWUpOwotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoUFJFRlNfREVGQVVMVF9IRUFQX1VQREFURSwgZmFsc2UpOwotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoUFJFRlNfVEhSRUFEX1JFRlJFU0hfSU5URVJWQUwsCi0gICAgICAgICAgICBEZG1VaVByZWZlcmVuY2VzLkRFRkFVTFRfVEhSRUFEX1JFRlJFU0hfSU5URVJWQUwpOwotCi0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdCgidGV4dFNhdmVEaXIiLCBob21lRGlyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoImltYWdlU2F2ZURpciIsIGhvbWVEaXIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbVByZWZTdG9yZS5zZXREZWZhdWx0KFBSRUZTX0xPR19MRVZFTCwgImluZm8iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChQUkVGU19USU1FT1VULCBEZG1QcmVmZXJlbmNlcy5ERUZBVUxUX1RJTUVPVVQpOwotCi0gICAgICAgIC8vIGNob29zZSBhIGRlZmF1bHQgZm9udCBmb3IgdGhlIHRleHQgb3V0cHV0Ci0gICAgICAgIEZvbnREYXRhIGZkYXQgPSBuZXcgRm9udERhdGEoIkNvdXJpZXIiLCAxMCwgU1dULk5PUk1BTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbVByZWZTdG9yZS5zZXREZWZhdWx0KCJ0ZXh0T3V0cHV0Rm9udCIsIGZkYXQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBsYXlvdXQgaW5mb3JtYXRpb24uCi0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChTSEVMTF9YLCAxMDApOwotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoU0hFTExfWSwgMTAwKTsKLSAgICAgICAgbVByZWZTdG9yZS5zZXREZWZhdWx0KFNIRUxMX1dJRFRILCA4MDApOwotICAgICAgICBtUHJlZlN0b3JlLnNldERlZmF1bHQoU0hFTExfSEVJR0hULCA2MDApOwotCi0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBMT1JFUl9TSEVMTF9YLCA1MCk7Ci0gICAgICAgIG1QcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBMT1JFUl9TSEVMTF9ZLCA1MCk7Ci0KLSAgICAgICAgbVByZWZTdG9yZS5zZXREZWZhdWx0KFNIT1dfTkFUSVZFX0hFQVAsIGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIGEgImxpc3RlbmVyIiB0byB0YWtlIGFjdGlvbiB3aGVuIHByZWZlcmVuY2VzIGNoYW5nZS4gIFRoZXNlIGFyZQotICAgICAqIHJlcXVpcmVkIGZvciBvbmdvaW5nIGFjdGl2aXRpZXMgdGhhdCBkb24ndCBjaGVjayBwcmVmcyBvbiBlYWNoIHVzZS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgb25seSBpbnZva2VkIHdoZW4gc29tZXRoaW5nIGV4cGxpY2l0bHkgY2hhbmdlcyB0aGUgdmFsdWUgb2YKLSAgICAgKiBhIHByZWZlcmVuY2UgKGUuZy4gbm90IHdoZW4gdGhlIHByZWZzIGZpbGUgaXMgbG9hZGVkKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgU3RyaW5nIGNoYW5nZWQgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0gICAgICAgICAgICBpZiAoY2hhbmdlZC5lcXVhbHMoUFJFRlNfREVCVUdfUE9SVF9CQVNFKSkgewotICAgICAgICAgICAgICAgIERkbVByZWZlcmVuY2VzLnNldERlYnVnUG9ydEJhc2UobVByZWZTdG9yZS5nZXRJbnQoUFJFRlNfREVCVUdfUE9SVF9CQVNFKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZWQuZXF1YWxzKFBSRUZTX1NFTEVDVEVEX0RFQlVHX1BPUlQpKSB7Ci0gICAgICAgICAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0U2VsZWN0ZWREZWJ1Z1BvcnQobVByZWZTdG9yZS5nZXRJbnQoUFJFRlNfU0VMRUNURURfREVCVUdfUE9SVCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VkLmVxdWFscyhQUkVGU19MT0dfTEVWRUwpKSB7Ci0gICAgICAgICAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0TG9nTGV2ZWwoKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlZC5lcXVhbHMoInRleHRTYXZlRGlyIikpIHsKLSAgICAgICAgICAgICAgICBtUHJlZlN0b3JlLnNldFZhbHVlKCJsYXN0VGV4dFNhdmVEaXIiLAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlZC5lcXVhbHMoImltYWdlU2F2ZURpciIpKSB7Ci0gICAgICAgICAgICAgICAgbVByZWZTdG9yZS5zZXRWYWx1ZSgibGFzdEltYWdlU2F2ZURpciIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VkLmVxdWFscyhQUkVGU19USU1FT1VUKSkgewotICAgICAgICAgICAgICAgIERkbVByZWZlcmVuY2VzLnNldFRpbWVPdXQobVByZWZTdG9yZS5nZXRJbnQoUFJFRlNfVElNRU9VVCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudigiZGRtcyIsICJQcmVmZXJlbmNlIGNoYW5nZTogIiArIGV2ZW50LmdldFByb3BlcnR5KCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiAnIiArIGV2ZW50LmdldE9sZFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiJyAtLT4gJyIgKyBldmVudC5nZXROZXdWYWx1ZSgpICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBkaXNwbGF5IHRoZSBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bihTaGVsbCBzaGVsbCkgewotICAgICAgICBhc3NlcnQgbVByZWZTdG9yZSAhPSBudWxsOwotCi0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyIHByZWZNZ3IgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQotICAgICAgICBQcmVmZXJlbmNlTm9kZSBub2RlLCBzdWJOb2RlOwotCi0gICAgICAgIC8vIHRoaXMgZGlkbid0IHdvcmsgLS0gZ290IE5QRSwgcG9zc2libHkgZnJvbSBjbGFzcyBsb29rdXA6Ci0gICAgICAgIC8vUHJlZmVyZW5jZU5vZGUgYXBwID0gbmV3IFByZWZlcmVuY2VOb2RlKCJhcHAiLCAiQXBwbGljYXRpb24iLCBudWxsLAotICAgICAgICAvLyAgICBBcHBQcmVmcy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIG5vZGUgPSBuZXcgUHJlZmVyZW5jZU5vZGUoImRlYnVnZ2VyIiwgbmV3IERlYnVnZ2VyUHJlZnMoKSk7Ci0gICAgICAgIHByZWZNZ3IuYWRkVG9Sb290KG5vZGUpOwotCi0gICAgICAgIHN1Yk5vZGUgPSBuZXcgUHJlZmVyZW5jZU5vZGUoInBhbmVsIiwgbmV3IFBhbmVsUHJlZnMoKSk7Ci0gICAgICAgIC8vcHJlZk1nci5hZGRUbyhub2RlLmdldElkKCksIHN1Yk5vZGUpOwotICAgICAgICBwcmVmTWdyLmFkZFRvUm9vdChzdWJOb2RlKTsKLQotICAgICAgICBub2RlID0gbmV3IFByZWZlcmVuY2VOb2RlKCJMb2dDYXQiLCBuZXcgTG9nQ2F0UHJlZnMoKSk7Ci0gICAgICAgIHByZWZNZ3IuYWRkVG9Sb290KG5vZGUpOwotCi0gICAgICAgIG5vZGUgPSBuZXcgUHJlZmVyZW5jZU5vZGUoIm1pc2MiLCBuZXcgTWlzY1ByZWZzKCkpOwotICAgICAgICBwcmVmTWdyLmFkZFRvUm9vdChub2RlKTsKLQotICAgICAgICBub2RlID0gbmV3IFByZWZlcmVuY2VOb2RlKCJzdGF0cyIsIG5ldyBVc2FnZVN0YXRzUHJlZnMoKSk7Ci0gICAgICAgIHByZWZNZ3IuYWRkVG9Sb290KG5vZGUpOwotCi0gICAgICAgIFByZWZlcmVuY2VEaWFsb2cgZGxnID0gbmV3IFByZWZlcmVuY2VEaWFsb2coc2hlbGwsIHByZWZNZ3IpOwotICAgICAgICBkbGcuc2V0UHJlZmVyZW5jZVN0b3JlKG1QcmVmU3RvcmUpOwotCi0gICAgICAgIC8vIHJ1biBpdAotICAgICAgICBkbGcub3BlbigpOwotCi0gICAgICAgIC8vIHNhdmUgcHJlZnMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1QcmVmU3RvcmUuc2F2ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRpc2NhcmQgdGhlIHN0dWZmIHdlIGNyZWF0ZWQKLSAgICAgICAgLy9wcmVmTWdyLmRpc3Bvc2UoKTsKLSAgICAgICAgLy9kbGcuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICJEZWJ1Z2dlciIgcHJlZnMgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWJ1Z2dlclByZWZzIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIERlYnVnZ2VyUHJlZnMoKSB7Ci0gICAgICAgICAgICBzdXBlcihHUklEKTsgICAgICAgIC8vIHVzZSAiZ3JpZCIgbGF5b3V0IHNvIGVkaXQgYm94ZXMgbGluZSB1cAotICAgICAgICAgICAgc2V0VGl0bGUoIkRlYnVnZ2VyIik7Ci0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBmaWVsZCBlZGl0b3JzLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLSAgICAgICAgICAgIEludGVnZXJGaWVsZEVkaXRvciBpZmU7Ci0KLSAgICAgICAgICAgIGlmZSA9IG5ldyBQb3J0RmllbGRFZGl0b3IoUFJFRlNfREVCVUdfUE9SVF9CQVNFLAotICAgICAgICAgICAgICAgICJTdGFydGluZyB2YWx1ZSBmb3IgbG9jYWwgcG9ydDoiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGlmZSk7Ci0KLSAgICAgICAgICAgIGlmZSA9IG5ldyBQb3J0RmllbGRFZGl0b3IoUFJFRlNfU0VMRUNURURfREVCVUdfUE9SVCwKLSAgICAgICAgICAgICAgICAiUG9ydCBvZiBTZWxlY3RlZCBWTToiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGlmZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAiUGFuZWwiIHByZWZzIHBhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZWxQcmVmcyBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCYXNpYyBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQYW5lbFByZWZzKCkgewotICAgICAgICAgICAgc3VwZXIoRkxBVCk7ICAgICAgICAvLyB1c2UgImZsYXQiIGxheW91dAotICAgICAgICAgICAgc2V0VGl0bGUoIkluZm8gUGFuZWxzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGZpZWxkIGVkaXRvcnMuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotICAgICAgICAgICAgQm9vbGVhbkZpZWxkRWRpdG9yIGJmZTsKLSAgICAgICAgICAgIEludGVnZXJGaWVsZEVkaXRvciBpZmU7Ci0KLSAgICAgICAgICAgIGJmZSA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoUFJFRlNfREVGQVVMVF9USFJFQURfVVBEQVRFLAotICAgICAgICAgICAgICAgICJUaHJlYWQgdXBkYXRlcyBlbmFibGVkIGJ5IGRlZmF1bHQiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGJmZSk7Ci0KLSAgICAgICAgICAgIGJmZSA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoUFJFRlNfREVGQVVMVF9IRUFQX1VQREFURSwKLSAgICAgICAgICAgICAgICAiSGVhcCB1cGRhdGVzIGVuYWJsZWQgYnkgZGVmYXVsdCIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICAgICAgYWRkRmllbGQoYmZlKTsKLQotICAgICAgICAgICAgaWZlID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihQUkVGU19USFJFQURfUkVGUkVTSF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAiVGhyZWFkIHN0YXR1cyBpbnRlcnZhbCAoc2Vjb25kcyk6IiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgICAgICBpZmUuc2V0VmFsaWRSYW5nZSgxLCA2MCk7Ci0gICAgICAgICAgICBhZGRGaWVsZChpZmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogImxvZ2NhdCIgcHJlZnMgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2dDYXRQcmVmcyBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCYXNpYyBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb2dDYXRQcmVmcygpIHsKLSAgICAgICAgICAgIHN1cGVyKEZMQVQpOyAgICAgICAgLy8gdXNlICJmbGF0IiBsYXlvdXQKLSAgICAgICAgICAgIHNldFRpdGxlKCJMb2djYXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgZmllbGQgZWRpdG9ycy4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0gICAgICAgICAgICBSYWRpb0dyb3VwRmllbGRFZGl0b3IgcmdmZTsKLQotICAgICAgICAgICAgcmdmZSA9IG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoUHJlZnNEaWFsb2cuTE9HQ0FUX0NPTFVNTl9NT0RFLAotICAgICAgICAgICAgICAgICJNZXNzYWdlIENvbHVtbiBSZXNpemluZyBNb2RlIiwgMSwgbmV3IFN0cmluZ1tdW10gewotICAgICAgICAgICAgICAgICAgICB7ICJNYW51YWwiLCBQcmVmc0RpYWxvZy5MT0dDQVRfQ09MVU1OX01PREVfTUFOVUFMIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIkF1dG9tYXRpYyIsIFByZWZzRGlhbG9nLkxPR0NBVF9DT0xVTU5fTU9ERV9BVVRPIH0sCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhZGRGaWVsZChyZ2ZlKTsKLQotICAgICAgICAgICAgRm9udEZpZWxkRWRpdG9yIGZmZSA9IG5ldyBGb250RmllbGRFZGl0b3IoUHJlZnNEaWFsb2cuTE9HQ0FUX0ZPTlQsICJUZXh0IG91dHB1dCBmb250OiIsCi0gICAgICAgICAgICAgICAgICAgIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICAgICAgYWRkRmllbGQoZmZlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICJtaXNjIiBwcmVmcyBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1pc2NQcmVmcyBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCYXNpYyBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNaXNjUHJlZnMoKSB7Ci0gICAgICAgICAgICBzdXBlcihGTEFUKTsgICAgICAgIC8vIHVzZSAiZmxhdCIgbGF5b3V0Ci0gICAgICAgICAgICBzZXRUaXRsZSgiTWlzYyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBmaWVsZCBlZGl0b3JzLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLSAgICAgICAgICAgIERpcmVjdG9yeUZpZWxkRWRpdG9yIGRmZTsKLSAgICAgICAgICAgIEZvbnRGaWVsZEVkaXRvciBmZmU7Ci0KLSAgICAgICAgICAgIEludGVnZXJGaWVsZEVkaXRvciBpZmUgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKFBSRUZTX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICJBREIgY29ubmVjdGlvbiB0aW1lIG91dCAobXMpOiIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICAgICAgYWRkRmllbGQoaWZlKTsKLQotICAgICAgICAgICAgZGZlID0gbmV3IERpcmVjdG9yeUZpZWxkRWRpdG9yKCJ0ZXh0U2F2ZURpciIsCi0gICAgICAgICAgICAgICAgIkRlZmF1bHQgdGV4dCBzYXZlIGRpcjoiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGRmZSk7Ci0KLSAgICAgICAgICAgIGRmZSA9IG5ldyBEaXJlY3RvcnlGaWVsZEVkaXRvcigiaW1hZ2VTYXZlRGlyIiwKLSAgICAgICAgICAgICAgICAiRGVmYXVsdCBpbWFnZSBzYXZlIGRpcjoiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGRmZSk7Ci0KLSAgICAgICAgICAgIGZmZSA9IG5ldyBGb250RmllbGRFZGl0b3IoInRleHRPdXRwdXRGb250IiwgIlRleHQgb3V0cHV0IGZvbnQ6IiwKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGZmZSk7Ci0KLSAgICAgICAgICAgIFJhZGlvR3JvdXBGaWVsZEVkaXRvciByZ2ZlOwotCi0gICAgICAgICAgICByZ2ZlID0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcihQUkVGU19MT0dfTEVWRUwsCi0gICAgICAgICAgICAgICAgIkxvZ2dpbmcgTGV2ZWwiLCAxLCBuZXcgU3RyaW5nW11bXSB7Ci0gICAgICAgICAgICAgICAgICAgIHsgIlZlcmJvc2UiLCBMb2dMZXZlbC5WRVJCT1NFLmdldFN0cmluZ1ZhbHVlKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiRGVidWciLCBMb2dMZXZlbC5ERUJVRy5nZXRTdHJpbmdWYWx1ZSgpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIkluZm8iLCBMb2dMZXZlbC5JTkZPLmdldFN0cmluZ1ZhbHVlKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiV2FybmluZyIsIExvZ0xldmVsLldBUk4uZ2V0U3RyaW5nVmFsdWUoKSB9LAotICAgICAgICAgICAgICAgICAgICB7ICJFcnJvciIsIExvZ0xldmVsLkVSUk9SLmdldFN0cmluZ1ZhbHVlKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiQXNzZXJ0IiwgTG9nTGV2ZWwuQVNTRVJULmdldFN0cmluZ1ZhbHVlKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpLCB0cnVlKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKHJnZmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIkRldmljZSIgcHJlZnMgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVc2FnZVN0YXRzUHJlZnMgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBCb29sZWFuRmllbGRFZGl0b3IgbU9wdEluQ2hlY2tib3g7Ci0gICAgICAgIHByaXZhdGUgQ29tcG9zaXRlIG1Ub3A7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVzYWdlU3RhdHNQcmVmcygpIHsKLSAgICAgICAgICAgIHNldFRpdGxlKCJVc2FnZSBTdGF0cyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIG1Ub3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgbVRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLSAgICAgICAgICAgIG1Ub3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgICAgIExpbmsgdGV4dCA9IG5ldyBMaW5rKG1Ub3AsIFNXVC5XUkFQKTsKLSAgICAgICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICB0ZXh0LnNldFRleHQoU2RrU3RhdHNTZXJ2aWNlLkJPRFlfVEVYVCk7Ci0KLSAgICAgICAgICAgIHRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgU2RrU3RhdHNTZXJ2aWNlLm9wZW5VcmwoZXZlbnQudGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1PcHRJbkNoZWNrYm94ID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihTZGtTdGF0c1NlcnZpY2UuUElOR19PUFRfSU4sCi0gICAgICAgICAgICAgICAgICAgIFNka1N0YXRzU2VydmljZS5DSEVDS0JPWF9URVhULCBtVG9wKTsKLSAgICAgICAgICAgIG1PcHRJbkNoZWNrYm94LnNldFBhZ2UodGhpcyk7Ci0gICAgICAgICAgICBtT3B0SW5DaGVja2JveC5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICAgICAgICAgICAgbU9wdEluQ2hlY2tib3gubG9hZCgpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUG9pbnQgZG9Db21wdXRlU2l6ZSgpIHsKLSAgICAgICAgICAgIGlmIChtVG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVRvcC5jb21wdXRlU2l6ZSg0NTAsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRvQ29tcHV0ZVNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0gICAgICAgICAgICBpZiAobU9wdEluQ2hlY2tib3ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1PcHRJbkNoZWNrYm94LmxvYWREZWZhdWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0gICAgICAgICAgICBpZiAobU9wdEluQ2hlY2tib3ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1PcHRJbkNoZWNrYm94LnN0b3JlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci5wZXJmb3JtQXBwbHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgICAgICBpZiAobU9wdEluQ2hlY2tib3ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1PcHRJbkNoZWNrYm94LnN0b3JlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9TdGF0aWNQb3J0Q29uZmlnRGlhbG9nLmphdmEgYi90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9TdGF0aWNQb3J0Q29uZmlnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGJjN2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvU3RhdGljUG9ydENvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5UYWJsZUhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERpYWxvZyB0byBjb25maWd1cmUgdGhlIHN0YXRpYyBkZWJ1ZyBwb3J0cy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNQb3J0Q29uZmlnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotICAgIC8qKiBQcmVmZXJlbmNlIG5hbWUgZm9yIHRoZSAwdGggY29sdW1uIHdpZHRoICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0RFVklDRV9DT0wgPSAic3BjZC5kZXZpY2VDb2x1bW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgMXN0IGNvbHVtbiB3aWR0aCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19BUFBfQ09MID0gInNwY2QuQXBwQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFByZWZlcmVuY2UgbmFtZSBmb3IgdGhlIDJuZCBjb2x1bW4gd2lkdGggKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfUE9SVF9DT0wgPSAic3BjZC5Qb3J0Q29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTF9ERVZJQ0UgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xfQVBQTElDQVRJT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xfUE9SVCA9IDI7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBETEdfV0lEVEggPSA1MDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMR19IRUlHSFQgPSAzMDA7Ci0KLSAgICBwcml2YXRlIFNoZWxsIG1TaGVsbDsKLSAgICBwcml2YXRlIFNoZWxsIG1QYXJlbnQ7Ci0KLSAgICBwcml2YXRlIFRhYmxlIG1Qb3J0VGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBBcnJheSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGFscmVhZHkgdXNlZCBzdGF0aWMgcG9ydCB0byBhdm9pZAotICAgICAqIGR1cGxpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1Qb3J0cyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQotICAgIC8qKgotICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhdGljUG9ydENvbmZpZ0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQk9SREVSIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGFuZCBkaXNwbGF5IHRoZSBkaWFsb2cuIFRoaXMgbWV0aG9kIHJldHVybnMgb25seSB3aGVuIHRoZQotICAgICAqIHVzZXIgY2xvc2VzIHRoZSBkaWFsb2cgc29tZWhvdy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0gICAgICAgIGNyZWF0ZVVJKCk7Ci0KLSAgICAgICAgaWYgKG1QYXJlbnQgPT0gbnVsbCB8fCBtU2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlRnJvbVN0b3JlKCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBkaWFsb2cgc2l6ZS4KLSAgICAgICAgbVNoZWxsLnNldE1pbmltdW1TaXplKERMR19XSURUSCwgRExHX0hFSUdIVCk7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gbVBhcmVudC5nZXRCb3VuZHMoKTsKLSAgICAgICAgLy8gZ2V0IHRoZSBjZW50ZXIgbmV3IHRvcCBsZWZ0LgotICAgICAgICBpbnQgY3ggPSByLnggKyByLndpZHRoLzI7Ci0gICAgICAgIGludCB4ID0gY3ggLSBETEdfV0lEVEggLyAyOwotICAgICAgICBpbnQgY3kgPSByLnkgKyByLmhlaWdodC8yOwotICAgICAgICBpbnQgeSA9IGN5IC0gRExHX0hFSUdIVCAvIDI7Ci0gICAgICAgIG1TaGVsbC5zZXRCb3VuZHMoeCwgeSwgRExHX1dJRFRILCBETEdfSEVJR0hUKTsKLQotICAgICAgICBtU2hlbGwucGFjaygpOwotCi0gICAgICAgIC8vIGFjdHVhbGx5IG9wZW4gdGhlIGRpYWxvZwotICAgICAgICBtU2hlbGwub3BlbigpOwotCi0gICAgICAgIC8vIGV2ZW50IGxvb3AgdW50aWwgdGhlIGRpYWxvZyBpcyBjbG9zZWQuCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1QYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoIW1TaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkaWFsb2cgdWkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVJKCkgewotICAgICAgICBtUGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIG1TaGVsbCA9IG5ldyBTaGVsbChtUGFyZW50LCBnZXRTdHlsZSgpKTsKLSAgICAgICAgbVNoZWxsLnNldFRleHQoIlN0YXRpYyBQb3J0IENvbmZpZ3VyYXRpb24iKTsKLQotICAgICAgICBtU2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQotICAgICAgICBtU2hlbGwuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGV2ZW50LmRvaXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBjZW50ZXIgcGFydCB3aXRoIHRoZSBsaXN0IG9uIHRoZSBsZWZ0IGFuZCB0aGUgYnV0dG9ucwotICAgICAgICAvLyBvbiB0aGUgcmlnaHQuCi0gICAgICAgIENvbXBvc2l0ZSBtYWluID0gbmV3IENvbXBvc2l0ZShtU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgbWFpbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbWFpbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotICAgICAgICAvLyBsZWZ0IHBhcnQ6IGxpc3QgdmlldwotICAgICAgICBtUG9ydFRhYmxlID0gbmV3IFRhYmxlKG1haW4sIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtUG9ydFRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBtUG9ydFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1Qb3J0VGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1Qb3J0VGFibGUsICJEZXZpY2UgU2VyaWFsIE51bWJlciIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsICJlbXVsYXRvci01NTU0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX0RFVklDRV9DT0wsIFByZWZzRGlhbG9nLmdldFN0b3JlKCkpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1Qb3J0VGFibGUsICJBcHBsaWNhdGlvbiBQYWNrYWdlIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwgImNvbS5hbmRyb2lkLnNhbXBsZXMucGhvbmUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfQVBQX0NPTCwgUHJlZnNEaWFsb2cuZ2V0U3RvcmUoKSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obVBvcnRUYWJsZSwgIkRlYnVnIFBvcnQiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwgIkRlYnVnIFBvcnQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfUE9SVF9DT0wsIFByZWZzRGlhbG9nLmdldFN0b3JlKCkpOwotCi0gICAgICAgIC8vIHJpZ2h0IHBhcnQ6IGJ1dHRvbnMKLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKG1haW4sIFNXVC5OT05FKTsKLSAgICAgICAgYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0gICAgICAgIGJ1dHRvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQotICAgICAgICBCdXR0b24gbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuTk9ORSk7Ci0gICAgICAgIG5ld0J1dHRvbi5zZXRUZXh0KCJOZXcuLi4iKTsKLSAgICAgICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RhdGljUG9ydEVkaXREaWFsb2cgZGxnID0gbmV3IFN0YXRpY1BvcnRFZGl0RGlhbG9nKG1TaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRsZy5vcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UgPSBkbGcuZ2V0RGV2aWNlU04oKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwcCA9IGRsZy5nZXRBcHBOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gZGxnLmdldFBvcnROdW1iZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgYWRkRW50cnkoZGV2aWNlLCBhcHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5OT05FKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRUZXh0KCJFZGl0Li4uIik7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtUG9ydFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9sZERldmljZU5hbWUgPSBnZXREZXZpY2VOYW1lKGluZGV4KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2xkQXBwTmFtZSA9IGdldEFwcE5hbWUoaW5kZXgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvbGRQb3J0TnVtYmVyID0gZ2V0UG9ydE51bWJlcihpbmRleCk7Ci0gICAgICAgICAgICAgICAgU3RhdGljUG9ydEVkaXREaWFsb2cgZGxnID0gbmV3IFN0YXRpY1BvcnRFZGl0RGlhbG9nKG1TaGVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0cywgb2xkRGV2aWNlTmFtZSwgb2xkQXBwTmFtZSwgb2xkUG9ydE51bWJlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGRsZy5vcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gZGxnLmdldERldmljZVNOKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcHAgPSBkbGcuZ2V0QXBwTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IGRsZy5nZXRQb3J0TnVtYmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VFbnRyeShpbmRleCwgZGV2aWNlTmFtZSwgYXBwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5OT05FKTsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldFRleHQoIkRlbGV0ZSIpOwotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Qb3J0VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICByZW1vdmVFbnRyeShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGJvdHRvbSBwYXJ0IHdpdGggdGhlIG9rL2NhbmNlbAotICAgICAgICBDb21wb3NpdGUgYm90dG9tQ29tcCA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIGJvdHRvbUNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLSAgICAgICAgYm90dG9tQ29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0gICAgICAgIEJ1dHRvbiBva0J1dHRvbiA9IG5ldyBCdXR0b24oYm90dG9tQ29tcCwgU1dULk5PTkUpOwotICAgICAgICBva0J1dHRvbi5zZXRUZXh0KCJPSyIpOwotICAgICAgICBva0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldFRleHQoIkNhbmNlbCIpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtU2hlbGwuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVBvcnRUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2VsZWN0aW9uIGluZGV4Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbVBvcnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gaW5kZXggIT0gLTE7Ci0gICAgICAgICAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtU2hlbGwucGFjaygpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmV3IGVudHJ5IGluIHRoZSBsaXN0LgotICAgICAqIEBwYXJhbSBkZXZpY2VOYW1lIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSBkZXZpY2UKLSAgICAgKiBAcGFyYW0gYXBwTmFtZSBqYXZhIHBhY2thZ2UgZm9yIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIEBwYXJhbSBwb3J0TnVtYmVyIHBvcnQgbnVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVudHJ5KFN0cmluZyBkZXZpY2VOYW1lLCBTdHJpbmcgYXBwTmFtZSwgaW50IHBvcnROdW1iZXIpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGl0ZW0gZm9yIHRoZSB0YWJsZQotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obVBvcnRUYWJsZSwgU1dULk5PTkUpOwotCi0gICAgICAgIGl0ZW0uc2V0VGV4dChDT0xfREVWSUNFLCBkZXZpY2VOYW1lKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KENPTF9BUFBMSUNBVElPTiwgYXBwTmFtZSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChDT0xfUE9SVCwgSW50ZWdlci50b1N0cmluZyhwb3J0TnVtYmVyKSk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBwb3J0IHRvIHRoZSBsaXN0IG9mIHBvcnQgbnVtYmVyIHVzZWQuCi0gICAgICAgIG1Qb3J0cy5hZGQocG9ydE51bWJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gdGhlIGxpc3QuCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gYmUgcmVtb3ZlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVFbnRyeShpbnQgaW5kZXgpIHsKLSAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIHVpCi0gICAgICAgIG1Qb3J0VGFibGUucmVtb3ZlKGluZGV4KTsKLQotICAgICAgICAvLyBhbmQgZnJvbSB0aGUgcG9ydCBsaXN0LgotICAgICAgICBtUG9ydHMucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIGFuIGVudHJ5IGluIHRoZSBsaXN0IHdpdGggbmV3IHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGJlIHJlcGxhY2VkCi0gICAgICogQHBhcmFtIGRldmljZU5hbWUgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGRldmljZQotICAgICAqIEBwYXJhbSBhcHBOYW1lIFRoZSBuZXcgamF2YSBwYWNrYWdlIGZvciB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBAcGFyYW0gcG9ydE51bWJlciBUaGUgbmV3IHBvcnQgbnVtYmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlRW50cnkoaW50IGluZGV4LCBTdHJpbmcgZGV2aWNlTmFtZSwgU3RyaW5nIGFwcE5hbWUsIGludCBwb3J0TnVtYmVyKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgdGFibGUgaXRlbSBieSBpbmRleAotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG1Qb3J0VGFibGUuZ2V0SXRlbShpbmRleCk7Ci0KLSAgICAgICAgLy8gc2V0IGl0cyBuZXcgdmFsdWUKLSAgICAgICAgaXRlbS5zZXRUZXh0KENPTF9ERVZJQ0UsIGRldmljZU5hbWUpOwotICAgICAgICBpdGVtLnNldFRleHQoQ09MX0FQUExJQ0FUSU9OLCBhcHBOYW1lKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KENPTF9QT1JULCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnROdW1iZXIpKTsKLQotICAgICAgICAvLyBhbmQgcmVwbGFjZSB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIHBvcnQgbGlzdC4KLSAgICAgICAgbVBvcnRzLnNldChpbmRleCwgcG9ydE51bWJlcik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXZpY2UgbmFtZSBmb3IgYSBzcGVjaWZpYyBpbmRleAotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBqYXZhIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZXZpY2VOYW1lKGludCBpbmRleCkgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG1Qb3J0VGFibGUuZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIHJldHVybiBpdGVtLmdldFRleHQoQ09MX0RFVklDRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gbmFtZSBmb3IgYSBzcGVjaWZpYyBpbmRleAotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBqYXZhIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBcHBOYW1lKGludCBpbmRleCkgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG1Qb3J0VGFibGUuZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIHJldHVybiBpdGVtLmdldFRleHQoQ09MX0FQUExJQ0FUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG51bWJlciBmb3IgYSBzcGVjaWZpYyBpbmRleAotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFBvcnROdW1iZXIoaW50IGluZGV4KSB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbVBvcnRUYWJsZS5nZXRJdGVtKGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0VGV4dChDT0xfUE9SVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdWkgZnJvbSB0aGUgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZyb21TdG9yZSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBtYXAgZnJvbSB0aGUgZGVidWcgcG9ydCBtYW5hZ2VyCi0gICAgICAgIERlYnVnUG9ydFByb3ZpZGVyIHByb3ZpZGVyID0gRGVidWdQb3J0UHJvdmlkZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+IG1hcCA9IHByb3ZpZGVyLmdldFBvcnRMaXN0KCk7Ci0KLSAgICAgICAgLy8gd2UncmUgZ29pbmcgdG8gbG9vcCBvbiB0aGUga2V5cyBhbmQgZmlsbCB0aGUgdGFibGUuCi0gICAgICAgIFNldDxTdHJpbmc+IGRldmljZUtleXMgPSBtYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgZGV2aWNlS2V5IDogZGV2aWNlS2V5cykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gZGV2aWNlTWFwID0gbWFwLmdldChkZXZpY2VLZXkpOwotICAgICAgICAgICAgaWYgKGRldmljZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gYXBwS2V5cyA9IGRldmljZU1hcC5rZXlTZXQoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFwcEtleSA6IGFwcEtleXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwb3J0ID0gZGV2aWNlTWFwLmdldChhcHBLZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbnRyeShkZXZpY2VLZXksIGFwcEtleSwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHN0b3JlIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHVpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdG9yZSgpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IE1hcCBvYmplY3QgYW5kIGZpbGwgaXQuCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4oKTsKLQotICAgICAgICBpbnQgY291bnQgPSBtUG9ydFRhYmxlLmdldEl0ZW1Db3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG1Qb3J0VGFibGUuZ2V0SXRlbShpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gaXRlbS5nZXRUZXh0KENPTF9ERVZJQ0UpOwotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBkZXZpY2VNYXAgPSBtYXAuZ2V0KGRldmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKGRldmljZU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoZGV2aWNlTmFtZSwgZGV2aWNlTWFwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGV2aWNlTWFwLnB1dChpdGVtLmdldFRleHQoQ09MX0FQUExJQ0FUSU9OKSwgSW50ZWdlci52YWx1ZU9mKGl0ZW0uZ2V0VGV4dChDT0xfUE9SVCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBpdCBpbiB0aGUgc3RvcmUgdGhyb3VnaCB0aGUgZGVidWcgcG9ydCBtYW5hZ2VyLgotICAgICAgICBEZWJ1Z1BvcnRQcm92aWRlciBwcm92aWRlciA9IERlYnVnUG9ydFByb3ZpZGVyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIHByb3ZpZGVyLnNldFBvcnRMaXN0KG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvU3RhdGljUG9ydEVkaXREaWFsb2cuamF2YSBiL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL1N0YXRpY1BvcnRFZGl0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjQ5NjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9hcHAvc3JjL2NvbS9hbmRyb2lkL2RkbXMvU3RhdGljUG9ydEVkaXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogU21hbGwgZGlhbG9nIGJveCB0byBlZGl0IGEgc3RhdGljIHBvcnQgbnVtYmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljUG9ydEVkaXREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMR19XSURUSCA9IDQwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRExHX0hFSUdIVCA9IDIwMDsKLQotICAgIHByaXZhdGUgU2hlbGwgbVBhcmVudDsKLQotICAgIHByaXZhdGUgU2hlbGwgbVNoZWxsOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1PayA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwcE5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUG9ydE51bWJlcjsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1Pa0J1dHRvbjsKLQotICAgIHByaXZhdGUgTGFiZWwgbVdhcm5pbmc7Ci0KLSAgICAvKiogTGlzdCBvZiBwb3J0cyBhbHJlYWR5IGluIHVzZSAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1Qb3J0czsKLQotICAgIC8qKiBUaGlzIGlzIHRoZSBwb3J0IGJlaW5nIGVkaXRlZC4gKi8KLSAgICBwcml2YXRlIGludCBtRWRpdFBvcnQgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtRGV2aWNlU247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGlhbG9nIHdpdGggZW1wdHkgZmllbGRzLgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBTaGVsbAotICAgICAqIEBwYXJhbSBwb3J0cyBUaGUgbGlzdCBvZiBhbHJlYWR5IHVzZWQgcG9ydCBudW1iZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBTdGF0aWNQb3J0RWRpdERpYWxvZyhTaGVsbCBwYXJlbnQsIEFycmF5TGlzdDxJbnRlZ2VyPiBwb3J0cykgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5CT1JERVIgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICAgICAgICBtUG9ydHMgPSBwb3J0czsKLSAgICAgICAgbURldmljZVNuID0gSURldmljZS5GSVJTVF9FTVVMQVRPUl9TTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGlhbG9nIHdpdGggcHJlZGVmaW5lZCB2YWx1ZXMuCi0gICAgICogQHBhcmFtIHNoZWxsIFRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gcG9ydHMgVGhlIGxpc3Qgb2YgYWxyZWFkeSB1c2VkIHBvcnQgbnVtYmVycy4KLSAgICAgKiBAcGFyYW0gb2xkRGV2aWNlU04gdGhlIGRldmljZSBzZXJpYWwgbnVtYmVyIHRvIGRpc3BsYXkKLSAgICAgKiBAcGFyYW0gb2xkQXBwTmFtZSBUaGUgYXBwbGljYXRpb24gbmFtZSB0byBkaXNwbGF5Ci0gICAgICogQHBhcmFtIG9sZFBvcnROdW1iZXIgVGhlIHBvcnQgbnVtYmVyIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhdGljUG9ydEVkaXREaWFsb2coU2hlbGwgc2hlbGwsIEFycmF5TGlzdDxJbnRlZ2VyPiBwb3J0cywKLSAgICAgICAgICAgIFN0cmluZyBvbGREZXZpY2VTTiwgU3RyaW5nIG9sZEFwcE5hbWUsIFN0cmluZyBvbGRQb3J0TnVtYmVyKSB7Ci0gICAgICAgIHRoaXMoc2hlbGwsIHBvcnRzKTsKLQotICAgICAgICBtRGV2aWNlU24gPSBvbGREZXZpY2VTTjsKLSAgICAgICAgbUFwcE5hbWUgPSBvbGRBcHBOYW1lOwotICAgICAgICBtUG9ydE51bWJlciA9IG9sZFBvcnROdW1iZXI7Ci0gICAgICAgIG1FZGl0UG9ydCA9IEludGVnZXIudmFsdWVPZihtUG9ydE51bWJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgdGhlIGRpYWxvZy4gVGhlIG1ldGhvZCB3aWxsIHJldHVybiB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgZGlhbG9nCi0gICAgICogc29tZWhvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvayB3YXMgcHJlc3NlZCwgZmFsc2UgaWYgY2FuY2VsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9wZW4oKSB7Ci0gICAgICAgIGNyZWF0ZVVJKCk7Ci0KLSAgICAgICAgaWYgKG1QYXJlbnQgPT0gbnVsbCB8fCBtU2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNoZWxsLnNldE1pbmltdW1TaXplKERMR19XSURUSCwgRExHX0hFSUdIVCk7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gbVBhcmVudC5nZXRCb3VuZHMoKTsKLSAgICAgICAgLy8gZ2V0IHRoZSBjZW50ZXIgbmV3IHRvcCBsZWZ0LgotICAgICAgICBpbnQgY3ggPSByLnggKyByLndpZHRoLzI7Ci0gICAgICAgIGludCB4ID0gY3ggLSBETEdfV0lEVEggLyAyOwotICAgICAgICBpbnQgY3kgPSByLnkgKyByLmhlaWdodC8yOwotICAgICAgICBpbnQgeSA9IGN5IC0gRExHX0hFSUdIVCAvIDI7Ci0gICAgICAgIG1TaGVsbC5zZXRCb3VuZHMoeCwgeSwgRExHX1dJRFRILCBETEdfSEVJR0hUKTsKLQotICAgICAgICBtU2hlbGwub3BlbigpOwotCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1QYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoIW1TaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbU9rOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlU04oKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlU247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcHBOYW1lKCkgewotICAgICAgICByZXR1cm4gbUFwcE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQb3J0TnVtYmVyKCkgewotICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKG1Qb3J0TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVUkoKSB7Ci0gICAgICAgIG1QYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgbVNoZWxsID0gbmV3IFNoZWxsKG1QYXJlbnQsIGdldFN0eWxlKCkpOwotICAgICAgICBtU2hlbGwuc2V0VGV4dCgiU3RhdGljIFBvcnQiKTsKLQotICAgICAgICBtU2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgbVNoZWxsLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gY2VudGVyIHBhcnQgd2l0aCB0aGUgZWRpdCBmaWVsZAotICAgICAgICBDb21wb3NpdGUgbWFpbiA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1haW4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1haW4uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLSAgICAgICAgTGFiZWwgbDAgPSBuZXcgTGFiZWwobWFpbiwgU1dULk5PTkUpOwotICAgICAgICBsMC5zZXRUZXh0KCJEZXZpY2UgTmFtZToiKTsKLQotICAgICAgICBmaW5hbCBUZXh0IGRldmljZVNOVGV4dCA9IG5ldyBUZXh0KG1haW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGV2aWNlU05UZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBpZiAobURldmljZVNuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRldmljZVNOVGV4dC5zZXRUZXh0KG1EZXZpY2VTbik7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2aWNlU05UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VTbiA9IGRldmljZVNOVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwobWFpbiwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIkFwcGxpY2F0aW9uIE5hbWU6Iik7Ci0KLSAgICAgICAgZmluYWwgVGV4dCBhcHBOYW1lVGV4dCA9IG5ldyBUZXh0KG1haW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgaWYgKG1BcHBOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFwcE5hbWVUZXh0LnNldFRleHQobUFwcE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGFwcE5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBhcHBOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtQXBwTmFtZSA9IGFwcE5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgbDIgPSBuZXcgTGFiZWwobWFpbiwgU1dULk5PTkUpOwotICAgICAgICBsMi5zZXRUZXh0KCJEZWJ1ZyBQb3J0OiIpOwotCi0gICAgICAgIGZpbmFsIFRleHQgZGVidWdQb3J0VGV4dCA9IG5ldyBUZXh0KG1haW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgaWYgKG1Qb3J0TnVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlYnVnUG9ydFRleHQuc2V0VGV4dChtUG9ydE51bWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZGVidWdQb3J0VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZGVidWdQb3J0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtUG9ydE51bWJlciA9IGRlYnVnUG9ydFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyB3YXJuaW5nIGxhYmVsCi0gICAgICAgIENvbXBvc2l0ZSB3YXJuaW5nQ29tcCA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHdhcm5pbmdDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB3YXJuaW5nQ29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCi0gICAgICAgIG1XYXJuaW5nID0gbmV3IExhYmVsKHdhcm5pbmdDb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1XYXJuaW5nLnNldFRleHQoIiIpOwotICAgICAgICBtV2FybmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICAvLyBib3R0b20gcGFydCB3aXRoIHRoZSBvay9jYW5jZWwKLSAgICAgICAgQ29tcG9zaXRlIGJvdHRvbUNvbXAgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wCi0gICAgICAgICAgICAgICAgLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0gICAgICAgIGJvdHRvbUNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotICAgICAgICBtT2tCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgbU9rQnV0dG9uLnNldFRleHQoIk9LIik7Ci0gICAgICAgIG1Pa0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1PayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1TaGVsbC5zZXREZWZhdWx0QnV0dG9uKG1Pa0J1dHRvbik7Ci0KLSAgICAgICAgQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oYm90dG9tQ29tcCwgU1dULk5PTkUpOwotICAgICAgICBjYW5jZWxCdXR0b24uc2V0VGV4dCgiQ2FuY2VsIik7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1TaGVsbC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgY29udGVudCBvZiB0aGUgMiB0ZXh0IGZpZWxkcyBhbmQgZW5hYmxlL2Rpc2FibGUgIm9rIiwgd2hpbGUKLSAgICAgKiBzZXR0aW5nIHVwIHRoZSB3YXJuaW5nL2Vycm9yIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgICAvLyBmaXJzdCB3ZSByZXNldCB0aGUgd2FybmluZyBkaWFsb2cuIFRoaXMgYWxsb3dzIHVzIHRvIGxhdHRlcgotICAgICAgICAvLyBkaXNwbGF5IHdhcm5pbmdzLgotICAgICAgICBtV2FybmluZy5zZXRUZXh0KCIiKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBjaGVjayB0aGUgZGV2aWNlIG5hbWUgZmllbGQgaXMgbm90IGVtcHR5Ci0gICAgICAgIGlmIChtRGV2aWNlU24gPT0gbnVsbCB8fCBtRGV2aWNlU24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbVdhcm5pbmcuc2V0VGV4dCgiRGV2aWNlIG5hbWUgbWlzc2luZy4iKTsKLSAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGZpZWxkIGlzIG5vdCBlbXB0eQotICAgICAgICBpZiAobUFwcE5hbWUgPT0gbnVsbCB8fCBtQXBwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtV2FybmluZy5zZXRUZXh0KCJBcHBsaWNhdGlvbiBuYW1lIG1pc3NpbmcuIik7Ci0gICAgICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGFja2FnZUVycm9yID0gIkFwcGxpY2F0aW9uIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEphdmEgcGFja2FnZSBuYW1lLiI7Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsLiBJdCBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgIC8vIGphdmEgcGFja2FnZS4KLSAgICAgICAgU3RyaW5nW10gcGFja2FnZVNlZ21lbnRzID0gbUFwcE5hbWUuc3BsaXQoIlxcLiIpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICBmb3IgKFN0cmluZyBwIDogcGFja2FnZVNlZ21lbnRzKSB7Ci0gICAgICAgICAgICBpZiAocC5tYXRjaGVzKCJeW2EtekEtWl1bYS16QS1aMC05XSoiKSA9PSBmYWxzZSkgeyAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1XYXJuaW5nLnNldFRleHQocGFja2FnZUVycm9yKTsKLSAgICAgICAgICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsZXRzIGFsc28gZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIHBhY2thZ2UgY29udGFpbnMgdXBwZXIgY2FzZQotICAgICAgICAgICAgLy8gbGV0dGVycy4KLSAgICAgICAgICAgIGlmIChwLm1hdGNoZXMoIl5bYS16XVthLXowLTldKiIpID09IGZhbHNlKSB7IC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbVdhcm5pbmcuc2V0VGV4dCgiTG93ZXIgY2FzZSBpcyByZWNvbW1lbmRlZCBmb3IgSmF2YSBwYWNrYWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBzcGxpdCB3aWxsIG5vdCBkZXRlY3QgdGhlIGxhc3QgY2hhciBiZWluZyBhICcuJwotICAgICAgICAvLyBzbyB3ZSB0ZXN0IGl0IG1hbnVhbGx5Ci0gICAgICAgIGlmIChtQXBwTmFtZS5jaGFyQXQobUFwcE5hbWUubGVuZ3RoKCktMSkgPT0gJy4nKSB7Ci0gICAgICAgICAgICBtV2FybmluZy5zZXRUZXh0KHBhY2thZ2VFcnJvcik7Ci0gICAgICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgd2UgdGVzdCB0aGUgcGFja2FnZSBuYW1lIGZpZWxkIGlzIG5vdCBlbXB0eS4KLSAgICAgICAgaWYgKG1Qb3J0TnVtYmVyID09IG51bGwgfHwgbVBvcnROdW1iZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbVdhcm5pbmcuc2V0VGV4dCgiUG9ydCBOdW1iZXIgbWlzc2luZy4iKTsKLSAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZW4gd2UgY2hlY2sgaXQgb25seSBjb250YWlucyBkaWdpdHMuCi0gICAgICAgIGlmIChtUG9ydE51bWJlci5tYXRjaGVzKCJbMC05XSoiKSA9PSBmYWxzZSkgeyAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgbVdhcm5pbmcuc2V0VGV4dCgiUG9ydCBOdW1iZXIgaW52YWxpZC4iKTsKLSAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgaW50IGZyb20gdGhlIHBvcnQgbnVtYmVyIHRvIHZhbGlkYXRlCi0gICAgICAgIGxvbmcgcG9ydCA9IExvbmcudmFsdWVPZihtUG9ydE51bWJlcik7Ci0gICAgICAgIGlmIChwb3J0ID49IDMyNzY3KSB7Ci0gICAgICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBpdHMgaW4gdGhlIGxpc3Qgb2YgYWxyZWFkeSB1c2VkIHBvcnRzCi0gICAgICAgIGlmIChwb3J0ICE9IG1FZGl0UG9ydCkgewotICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBtUG9ydHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSBpLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdhcm5pbmcuc2V0VGV4dCgiUG9ydCBhbHJlYWR5IGluIHVzZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgbU9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vdCBlcnJvciwgc28gd2UgZW5hYmxlIHRoZSBvayBidXR0b24uCi0gICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL1VJVGhyZWFkLmphdmEgYi90b29scy9kZG1zL2FwcC9zcmMvY29tL2FuZHJvaWQvZGRtcy9VSVRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThiM2YxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9jb20vYW5kcm9pZC9kZG1zL1VJVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JQ2xpZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuSUhwcm9mRHVtcEhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuTWV0aG9kUHJvZmlsaW5nU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuSUxvZ091dHB1dDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5TeW5jUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLkFsbG9jYXRpb25QYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5EZXZpY2VQYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5FbXVsYXRvckNvbnRyb2xQYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5IZWFwUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSVRhYmxlRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5JbWFnZUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5JbWFnZUxvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5JbmZvUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuTmF0aXZlSGVhcFBhbmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlNjcmVlblNob3REaWFsb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuU3lzaW5mb1BhbmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlRhYmxlUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuVGhyZWFkUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRGV2aWNlUGFuZWwuSVVpU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuYWN0aW9ucy5Ub29sSXRlbUFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5leHBsb3Jlci5EZXZpY2VFeHBsb3JlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5oYW5kbGVyLkJhc2VGaWxlSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5oYW5kbGVyLk1ldGhvZFByb2ZpbGluZ0hhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50LkV2ZW50TG9nUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nY2F0LkxvZ0NvbG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQuTG9nRmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZ2NhdC5Mb2dQYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQuTG9nUGFuZWwuSUxvZ0ZpbHRlclN0b3JhZ2VNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGlzIGFjdHMgYXMgdGhlIFVJIGJ1aWxkZXIuIFRoaXMgY2Fubm90IGJlIGl0cyBvd24gdGhyZWFkIHNpbmNlIHRoaXMgcHJldmVudCB1c2luZyBBV1QgaW4gYW4KLSAqIFNXVCBhcHBsaWNhdGlvbi4gU28gdGhpcyBjbGFzcyBtYWlubHkgYnVpbGRzIHRoZSB1aSwgYW5kIG1hbmFnZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBwYW5lbHMKLSAqIHdoZW4ge0BsaW5rIElEZXZpY2V9IC8ge0BsaW5rIENsaWVudH0gc2VsZWN0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVRocmVhZCBpbXBsZW1lbnRzIElVaVNlbGVjdGlvbkxpc3RlbmVyLCBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIgewotICAgIC8qCi0gICAgICogVUkgdGFiIHBhbmVsIGRlZmluaXRpb25zLiBUaGUgY29uc3RhbnRzIGhlcmUgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBhcnJheQotICAgICAqIGluZGljZXMgaW4gbVBhbmVscy4gUEFORUxfQ0xJRU5UX0xJU1QgaXMgYSAidmlydHVhbCIgcGFuZWwgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIGNsaWVudCBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0NMSUVOVF9MSVNUID0gLTE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9JTkZPID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX1RIUkVBRCA9IDE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9IRUFQID0gMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX05BVElWRV9IRUFQID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQU5FTF9BTExPQ0FUSU9OUyA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfU1lTSU5GTyA9IDU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfQ09VTlQgPSA2OwotCi0gICAgLyoqIENvbnRlbnQgaXMgc2V0dXAgaW4gdGhlIGNvbnN0cnVjdG9yICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVQYW5lbFtdIG1QYW5lbHMgPSBuZXcgVGFibGVQYW5lbFtQQU5FTF9DT1VOVF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtUGFuZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiSW5mbyIsICJUaHJlYWRzIiwgIlZNIEhlYXAiLCAiTmF0aXZlIEhlYXAiLCAiQWxsb2NhdGlvbiBUcmFja2VyIiwgIlN5c2luZm8iCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1QYW5lbFRpcHMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIkNsaWVudCBpbmZvcm1hdGlvbiIsICJUaHJlYWQgc3RhdHVzIiwgIlZNIGhlYXAgc3RhdHVzIiwKLSAgICAgICAgICAgICJOYXRpdmUgaGVhcCBzdGF0dXMiLCAiQWxsb2NhdGlvbiBUcmFja2VyIiwgIlN5c2luZm8gZ3JhcGhzIgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9MT0dTQVNIID0KLSAgICAgICAgImxvZ1Nhc2hMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TQVNIID0KLSAgICAgICAgInNhc2hMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfVElNRSA9Ci0gICAgICAgICJsb2djYXQudGltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQ09MX0xFVkVMID0KLSAgICAgICAgImxvZ2NhdC5sZXZlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQ09MX1BJRCA9Ci0gICAgICAgICJsb2djYXQucGlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfVEFHID0KLSAgICAgICAgImxvZ2NhdC50YWciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0NPTF9NRVNTQUdFID0KLSAgICAgICAgImxvZ2NhdC5tZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0ZJTFRFUlMgPSAibG9nY2F0LmZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIFVJVGhyZWFkIG1JbnN0YW5jZSA9IG5ldyBVSVRocmVhZCgpOwotCi0gICAgLy8gb3VyIGRpc3BsYXkKLSAgICBwcml2YXRlIERpc3BsYXkgbURpc3BsYXk7Ci0KLSAgICAvLyB0aGUgdGFibGUgd2Ugc2hvdyBpbiB0aGUgbGVmdC1oYW5kIHBhbmUKLSAgICBwcml2YXRlIERldmljZVBhbmVsIG1EZXZpY2VQYW5lbDsKLQotICAgIHByaXZhdGUgSURldmljZSBtQ3VycmVudERldmljZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBDbGllbnQgbUN1cnJlbnRDbGllbnQgPSBudWxsOwotCi0gICAgLy8gc3RhdHVzIGxpbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYXBwIHdpbmRvdwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0xpbmU7Ci0KLSAgICAvLyBzb21lIHRvb2xiYXIgaXRlbXMgd2UgbmVlZCB0byB1cGRhdGUKLSAgICBwcml2YXRlIFRvb2xJdGVtIG1UQlNob3dUaHJlYWRVcGRhdGVzOwotICAgIHByaXZhdGUgVG9vbEl0ZW0gbVRCU2hvd0hlYXBVcGRhdGVzOwotICAgIHByaXZhdGUgVG9vbEl0ZW0gbVRCSGFsdDsKLSAgICBwcml2YXRlIFRvb2xJdGVtIG1UQkNhdXNlR2M7Ci0gICAgcHJpdmF0ZSBUb29sSXRlbSBtVEJEdW1wSHByb2Y7Ci0gICAgcHJpdmF0ZSBUb29sSXRlbSBtVEJQcm9maWxpbmc7Ci0KLSAgICBwcml2YXRlIEltYWdlTG9hZGVyIG1EZG1zSW1hZ2VMb2FkZXI7Ci0gICAgcHJpdmF0ZSBJbWFnZUxvYWRlciBtRGRtdWlMaWJJbWFnZUxvYWRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRmlsdGVyU3RvcmFnZSBpbXBsZW1lbnRzIElMb2dGaWx0ZXJTdG9yYWdlTWFuYWdlciB7Ci0KLSAgICAgICAgcHVibGljIExvZ0ZpbHRlcltdIGdldEZpbHRlckZyb21TdG9yZSgpIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJQcmVmcyA9IFByZWZzRGlhbG9nLmdldFN0b3JlKCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBQUkVGU19GSUxURVJTKTsKLQotICAgICAgICAgICAgLy8gc3BsaXQgaW4gYSBzdHJpbmcgcGVyIGZpbHRlcgotICAgICAgICAgICAgU3RyaW5nW10gZmlsdGVycyA9IGZpbHRlclByZWZzLnNwbGl0KCJcXHwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBBcnJheUxpc3Q8TG9nRmlsdGVyPiBsaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PExvZ0ZpbHRlcj4oZmlsdGVycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBmIDogZmlsdGVycykgewotICAgICAgICAgICAgICAgIGlmIChmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBMb2dGaWx0ZXIgbG9nRmlsdGVyID0gbmV3IExvZ0ZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nRmlsdGVyLmxvYWRGcm9tU3RyaW5nKGYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChsb2dGaWx0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBMb2dGaWx0ZXJbbGlzdC5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNhdmVGaWx0ZXJzKExvZ0ZpbHRlcltdIGZpbHRlcnMpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsdGVyU3RyaW5nID0gZi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmaWx0ZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnfCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpLnNldFZhbHVlKFBSRUZTX0ZJTFRFUlMsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNEZWZhdWx0RmlsdGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgTG9nUGFuZWwgbUxvZ1BhbmVsOwotCi0gICAgcHJpdmF0ZSBUb29sSXRlbUFjdGlvbiBtQ3JlYXRlRmlsdGVyQWN0aW9uOwotICAgIHByaXZhdGUgVG9vbEl0ZW1BY3Rpb24gbURlbGV0ZUZpbHRlckFjdGlvbjsKLSAgICBwcml2YXRlIFRvb2xJdGVtQWN0aW9uIG1FZGl0RmlsdGVyQWN0aW9uOwotICAgIHByaXZhdGUgVG9vbEl0ZW1BY3Rpb24gbUV4cG9ydEFjdGlvbjsKLSAgICBwcml2YXRlIFRvb2xJdGVtQWN0aW9uIG1DbGVhckFjdGlvbjsKLQotICAgIHByaXZhdGUgVG9vbEl0ZW1BY3Rpb25bXSBtTG9nTGV2ZWxBY3Rpb25zOwotICAgIHByaXZhdGUgU3RyaW5nW10gbUxvZ0xldmVsSWNvbnMgPSB7Ci0gICAgICAgICAgICAidi5wbmciLCAvLyROT04tTkxTLTFTCi0gICAgICAgICAgICAiZC5wbmciLCAvLyROT04tTkxTLTFTCi0gICAgICAgICAgICAiaS5wbmciLCAvLyROT04tTkxTLTFTCi0gICAgICAgICAgICAidy5wbmciLCAvLyROT04tTkxTLTFTCi0gICAgICAgICAgICAiZS5wbmciLCAvLyROT04tTkxTLTFTCi0gICAgfTsKLQotICAgIHByb3RlY3RlZCBDbGlwYm9hcmQgbUNsaXBib2FyZDsKLQotICAgIHByaXZhdGUgTWVudUl0ZW0gbUNvcHlNZW51SXRlbTsKLQotICAgIHByaXZhdGUgTWVudUl0ZW0gbVNlbGVjdEFsbE1lbnVJdGVtOwotCi0gICAgcHJpdmF0ZSBUYWJsZUZvY3VzTGlzdGVuZXIgbVRhYmxlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIERldmljZUV4cGxvcmVyIG1FeHBsb3JlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTaGVsbCBtRXhwbG9yZXJTaGVsbCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEVtdWxhdG9yQ29udHJvbFBhbmVsIG1FbXVsYXRvclBhbmVsOwotCi0gICAgcHJpdmF0ZSBFdmVudExvZ1BhbmVsIG1FdmVudExvZ1BhbmVsOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBtVHJhY2luZ1N0YXJ0SW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlIG1UcmFjaW5nU3RvcEltYWdlOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBUYWJsZUZvY3VzTGlzdGVuZXIgaW1wbGVtZW50cyBJVGFibGVGb2N1c0xpc3RlbmVyIHsKLQotICAgICAgICBwcml2YXRlIElGb2N1c2VkVGFibGVBY3RpdmF0b3IgbUN1cnJlbnRBY3RpdmF0b3I7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoSUZvY3VzZWRUYWJsZUFjdGl2YXRvciBhY3RpdmF0b3IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50QWN0aXZhdG9yID0gYWN0aXZhdG9yOwotICAgICAgICAgICAgaWYgKG1Db3B5TWVudUl0ZW0uaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbUNvcHlNZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RBbGxNZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KElGb2N1c2VkVGFibGVBY3RpdmF0b3IgYWN0aXZhdG9yKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIGZyb20gb25lIHRhYmxlIHRvIGFub3RoZXIsIGl0J3MgdW5jbGVhcgotICAgICAgICAgICAgLy8gaWYgdGhlIG9sZCB0YWJsZSBsb3NlIGl0cyBmb2N1cyBiZWZvcmUgdGhlIG5ldwotICAgICAgICAgICAgLy8gb25lIGdldHMgdGhlIGZvY3VzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrLgotICAgICAgICAgICAgaWYgKGFjdGl2YXRvciA9PSBtQ3VycmVudEFjdGl2YXRvcikgewotICAgICAgICAgICAgICAgIGFjdGl2YXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db3B5TWVudUl0ZW0uaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db3B5TWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RBbGxNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb3B5KENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudEFjdGl2YXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRBY3RpdmF0b3IuY29weShjbGlwYm9hcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50QWN0aXZhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2YXRvci5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBmb3IgSFBST0YgZHVtcHMuCi0gICAgICogVGhpcyB3aWxsIGFsd2F5cyBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgSFBST0YgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEhQcm9mSGFuZGxlciBleHRlbmRzIEJhc2VGaWxlSGFuZGxlciBpbXBsZW1lbnRzIElIcHJvZkR1bXBIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgSFByb2ZIYW5kbGVyKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgQ2xpZW50IGNsaWVudCkgewotICAgICAgICAgICAgbURpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgSFBST0YgZmlsZSBmb3IgYXBwbGljYXRpb24gJyUxJHMnLlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVjayBsb2djYXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGR1bXAgaHByb2YgYnV0dG9uIGlzIHJlLWVuYWJsZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzZWxlY3Rpb24uIGFzIHRoZSBjbGllbnQgaXMgZmluaXNoZWQgZHVtcGluZyBhbiBocHJvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZVBhdGgsIGZpbmFsIENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRGV2aWNlIGRldmljZSA9IGNsaWVudC5nZXREZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3luYyBzZXJ2aWNlIHRvIHB1bGwgdGhlIEhQUk9GIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN5bmNTZXJ2aWNlIHN5bmMgPSBjbGllbnQuZ2V0RGV2aWNlKCkuZ2V0U3luY1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IHByb21wdEFuZFB1bGwoc3luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0Q2xpZW50RGVzY3JpcHRpb24oKSArICIuaHByb2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRmlsZVBhdGgsICJTYXZlIEhQUk9GIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmdldENvZGUoKSAhPSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZG93bmxvYWQgSFBST0YgZmlsZSBmcm9tIGRldmljZSAnJTEkcycuXG5cbiUyJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIlVuYWJsZSB0byBkb3dubG9hZCBIUFJPRiBmaWxlIGZyb20gZGV2aWNlICclMSRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiVW5hYmxlIHRvIGRvd25sb2FkIEhQUk9GIGZpbGUgZnJvbSBkZXZpY2UgJyUxJHMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGR1bXAgaHByb2YgYnV0dG9uIGlzIHJlLWVuYWJsZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzZWxlY3Rpb24uIGFzIHRoZSBjbGllbnQgaXMgZmluaXNoZWQgZHVtcGluZyBhbiBocHJvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG1QYXJlbnRTaGVsbCwgIkhQUk9GIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2VuZXJpYyBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVJVGhyZWFkKCkgewotICAgICAgICBtUGFuZWxzW1BBTkVMX0lORk9dID0gbmV3IEluZm9QYW5lbCgpOwotICAgICAgICBtUGFuZWxzW1BBTkVMX1RIUkVBRF0gPSBuZXcgVGhyZWFkUGFuZWwoKTsKLSAgICAgICAgbVBhbmVsc1tQQU5FTF9IRUFQXSA9IG5ldyBIZWFwUGFuZWwoKTsKLSAgICAgICAgaWYgKFByZWZzRGlhbG9nLmdldFN0b3JlKCkuZ2V0Qm9vbGVhbihQcmVmc0RpYWxvZy5TSE9XX05BVElWRV9IRUFQKSkgewotICAgICAgICAgICAgbVBhbmVsc1tQQU5FTF9OQVRJVkVfSEVBUF0gPSBuZXcgTmF0aXZlSGVhcFBhbmVsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGFuZWxzW1BBTkVMX05BVElWRV9IRUFQXSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhbmVsc1tQQU5FTF9BTExPQ0FUSU9OU10gPSBuZXcgQWxsb2NhdGlvblBhbmVsKCk7Ci0gICAgICAgIG1QYW5lbHNbUEFORUxfU1lTSU5GT10gPSBuZXcgU3lzaW5mb1BhbmVsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVUlUaHJlYWQgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBEaXNwbGF5LiBEb24ndCB0cnkgdGhpcyB1bmxlc3MgeW91J3JlIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSByKSB7Ci0gICAgICAgIGlmIChtRGlzcGxheSAhPSBudWxsICYmIG1EaXNwbGF5LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbURpc3BsYXkuYXN5bmNFeGVjKHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHJldHVybnMgdGhlIElQcmVmZXJlbmNlU3RvcmUgKi8KLSAgICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRTdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIFByZWZzRGlhbG9nLmdldFN0b3JlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIFNXVCBvYmplY3RzIGFuZCBkcml2ZSB0aGUgdXNlciBpbnRlcmZhY2UgZXZlbnQgbG9vcC4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gbG9jYXRpb24gb2YgdGhlIGZvbGRlciB0aGF0IGNvbnRhaW5zIGRkbXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuVUkoU3RyaW5nIGRkbXNQYXJlbnRMb2NhdGlvbikgewotICAgICAgICBEaXNwbGF5LnNldEFwcE5hbWUoImRkbXMiKTsKLSAgICAgICAgbURpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChtRGlzcGxheSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBpbWFnZSBsb2FkZXJzIGZvciBERE1TIGFuZCBERE1VSUxJQgotICAgICAgICBtRGRtc0ltYWdlTG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIG1EZG11aUxpYkltYWdlTG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKERldmljZVBhbmVsLmNsYXNzKTsKLQotICAgICAgICBzaGVsbC5zZXRJbWFnZShJbWFnZUhlbHBlci5sb2FkSW1hZ2UobURkbXNJbWFnZUxvYWRlciwgbURpc3BsYXksCi0gICAgICAgICAgICAgICAgImRkbXMtaWNvbi5wbmciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgMTAwLCA1MCwgbnVsbCkpOwotCi0gICAgICAgIExvZy5zZXRMb2dPdXRwdXQobmV3IElMb2dPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludEFuZFByb21wdExvZyhmaW5hbCBMb2dMZXZlbCBsb2dMZXZlbCwgZmluYWwgU3RyaW5nIHRhZywKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cucHJpbnRMb2cobG9nTGV2ZWwsIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgLy8gZGlhbG9nIGJveCBvbmx5IHJ1biBpbiBVSSB0aHJlYWQuLgotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gbURpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dMZXZlbCA9PSBMb2dMZXZlbC5FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHNoZWxsLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50TG9nKExvZ0xldmVsIGxvZ0xldmVsLCBTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5wcmludExvZyhsb2dMZXZlbCwgdGFnLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBoYW5kbGVyIGZvciBocHJvZiBkdW1wCi0gICAgICAgIENsaWVudERhdGEuc2V0SHByb2ZEdW1wSGFuZGxlcihuZXcgSFByb2ZIYW5kbGVyKHNoZWxsKSk7Ci0gICAgICAgIENsaWVudERhdGEuc2V0TWV0aG9kUHJvZmlsaW5nSGFuZGxlcihuZXcgTWV0aG9kUHJvZmlsaW5nSGFuZGxlcihzaGVsbCkpOwotCi0gICAgICAgIC8vIFt0cnkgdG9dIGVuc3VyZSBBREIgaXMgcnVubmluZwotICAgICAgICBTdHJpbmcgYWRiTG9jYXRpb247Ci0gICAgICAgIGlmIChkZG1zUGFyZW50TG9jYXRpb24gIT0gbnVsbCAmJiBkZG1zUGFyZW50TG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgYWRiTG9jYXRpb24gPSBkZG1zUGFyZW50TG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvciArICJhZGIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGJMb2NhdGlvbiA9ICJhZGIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuaW5pdCh0cnVlIC8qIGRlYnVnZ2VyIHN1cHBvcnQgKi8pOwotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuY3JlYXRlQnJpZGdlKGFkYkxvY2F0aW9uLCB0cnVlIC8qIGZvcmNlTmV3QnJpZGdlICovKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIGxpc3RlbiB0byBjbGllbnQgY2hhbmdlIHRvIGJlIG5vdGlmaWVkIG9mIGNsaWVudCBzdGF0dXMgKHByb2ZpbGluZykgY2hhbmdlCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGRDbGllbnRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBzaGVsbC5zZXRUZXh0KCJEYWx2aWsgRGVidWcgTW9uaXRvciIpOwotICAgICAgICBzZXRDb25maXJtQ2xvc2Uoc2hlbGwpOwotICAgICAgICBjcmVhdGVNZW51cyhzaGVsbCk7Ci0gICAgICAgIGNyZWF0ZVdpZGdldHMoc2hlbGwpOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAgICAgc2V0U2l6ZUFuZFBvc2l0aW9uKHNoZWxsKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotCi0gICAgICAgIExvZy5kKCJkZG1zIiwgIlVJIGlzIHVwIik7Ci0KLSAgICAgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghbURpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICAgICAgbURpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBtTG9nUGFuZWwuc3RvcExvZ0NhdCh0cnVlKTsKLQotICAgICAgICBtRGV2aWNlUGFuZWwuZGlzcG9zZSgpOwotICAgICAgICBmb3IgKFRhYmxlUGFuZWwgcGFuZWwgOiBtUGFuZWxzKSB7Ci0gICAgICAgICAgICBpZiAocGFuZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhbmVsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1EaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICAgICAgTG9nLmQoImRkbXMiLCAiVUkgaXMgZG93biIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIG1haW4gd2luZG93IGZyb20gdGhlIHByZWZlcmVuY2UsIGFuZAotICAgICAqIHNldHVwIGxpc3RlbmVycyBmb3IgY29udHJvbCBldmVudHMgKHJlc2l6ZS9tb3ZlIG9mIHRoZSB3aW5kb3cpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNpemVBbmRQb3NpdGlvbihmaW5hbCBTaGVsbCBzaGVsbCkgewotICAgICAgICBzaGVsbC5zZXRNaW5pbXVtU2l6ZSg0MDAsIDIwMCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB4L3kgYW5kIHcvaCBmcm9tIHRoZSBwcmVmcwotICAgICAgICBQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpOwotICAgICAgICBpbnQgeCA9IHByZWZzLmdldEludChQcmVmc0RpYWxvZy5TSEVMTF9YKTsKLSAgICAgICAgaW50IHkgPSBwcmVmcy5nZXRJbnQoUHJlZnNEaWFsb2cuU0hFTExfWSk7Ci0gICAgICAgIGludCB3ID0gcHJlZnMuZ2V0SW50KFByZWZzRGlhbG9nLlNIRUxMX1dJRFRIKTsKLSAgICAgICAgaW50IGggPSBwcmVmcy5nZXRJbnQoUHJlZnNEaWFsb2cuU0hFTExfSEVJR0hUKTsKLQotICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIG5vdCBvdXQgb2YgdGhlIGRpc3BsYXkgYXJlYQotICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IG1EaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhlIHdpZHRoL2hlaWdodAotICAgICAgICBpZiAodyA+IHJlY3Qud2lkdGgpIHsKLSAgICAgICAgICAgIHcgPSByZWN0LndpZHRoOwotICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuU0hFTExfV0lEVEgsIHJlY3Qud2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoID4gcmVjdC5oZWlnaHQpIHsKLSAgICAgICAgICAgIGggPSByZWN0LmhlaWdodDsKLSAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLlNIRUxMX0hFSUdIVCwgcmVjdC5oZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoZW4gY2hlY2sgeC4gTWFrZSBzdXJlIHRoZSBsZWZ0IGNvcm5lciBpcyBpbiB0aGUgc2NyZWVuCi0gICAgICAgIGlmICh4IDwgcmVjdC54KSB7Ci0gICAgICAgICAgICB4ID0gcmVjdC54OwotICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuU0hFTExfWCwgcmVjdC54KTsKLSAgICAgICAgfSBlbHNlIGlmICh4ID49IHJlY3QueCArIHJlY3Qud2lkdGgpIHsKLSAgICAgICAgICAgIHggPSByZWN0LnggKyByZWN0LndpZHRoIC0gdzsKLSAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLlNIRUxMX1gsIHJlY3QueCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhlbiBjaGVjayB5LiBNYWtlIHN1cmUgdGhlIGxlZnQgY29ybmVyIGlzIGluIHRoZSBzY3JlZW4KLSAgICAgICAgaWYgKHkgPCByZWN0LnkpIHsKLSAgICAgICAgICAgIHkgPSByZWN0Lnk7Ci0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5TSEVMTF9ZLCByZWN0LnkpOwotICAgICAgICB9IGVsc2UgaWYgKHkgPj0gcmVjdC55ICsgcmVjdC5oZWlnaHQpIHsKLSAgICAgICAgICAgIHkgPSByZWN0LnkgKyByZWN0LmhlaWdodCAtIGg7Ci0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5TSEVMTF9ZLCByZWN0LnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHdlIGNhbiBzZXQgdGhlIGxvY2F0aW9uL3NpemUKLSAgICAgICAgc2hlbGwuc2V0Qm91bmRzKHgsIHksIHcsIGgpOwotCi0gICAgICAgIC8vIGFkZCBsaXN0ZW5lciBmb3IgcmVzaXplL21vdmUKLSAgICAgICAgc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5ldyB4L3kKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIC8vIHN0b3JlIGluIHByZWYgZmlsZQotICAgICAgICAgICAgICAgIFByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IFByZWZzRGlhbG9nLmdldFN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuU0hFTExfWCwgcmVjdC54KTsKLSAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5TSEVMTF9ZLCByZWN0LnkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV3IHcvaAotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgLy8gc3RvcmUgaW4gcHJlZiBmaWxlCi0gICAgICAgICAgICAgICAgUHJlZmVyZW5jZVN0b3JlIHByZWZzID0gUHJlZnNEaWFsb2cuZ2V0U3RvcmUoKTsKLSAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5TSEVMTF9XSURUSCwgcmVjdC53aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuU0hFTExfSEVJR0hULCByZWN0LmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIGZpbGUgZXhwbG9yZXIgd2luZG93IGZyb20gdGhlCi0gICAgICogcHJlZmVyZW5jZSwgYW5kIHNldHVwIGxpc3RlbmVycyBmb3IgY29udHJvbCBldmVudHMgKHJlc2l6ZS9tb3ZlIG9mCi0gICAgICogdGhlIHdpbmRvdykKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RXhwbG9yZXJTaXplQW5kUG9zaXRpb24oZmluYWwgU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc2hlbGwuc2V0TWluaW11bVNpemUoNDAwLCAyMDApOwotCi0gICAgICAgIC8vIGdldCB0aGUgeC95IGFuZCB3L2ggZnJvbSB0aGUgcHJlZnMKLSAgICAgICAgUHJlZmVyZW5jZVN0b3JlIHByZWZzID0gUHJlZnNEaWFsb2cuZ2V0U3RvcmUoKTsKLSAgICAgICAgaW50IHggPSBwcmVmcy5nZXRJbnQoUHJlZnNEaWFsb2cuRVhQTE9SRVJfU0hFTExfWCk7Ci0gICAgICAgIGludCB5ID0gcHJlZnMuZ2V0SW50KFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX1kpOwotICAgICAgICBpbnQgdyA9IHByZWZzLmdldEludChQcmVmc0RpYWxvZy5FWFBMT1JFUl9TSEVMTF9XSURUSCk7Ci0gICAgICAgIGludCBoID0gcHJlZnMuZ2V0SW50KFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX0hFSUdIVCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBub3Qgb3V0IG9mIHRoZSBkaXNwbGF5IGFyZWEKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBtRGlzcGxheS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIHRoZSB3aWR0aC9oZWlnaHQKLSAgICAgICAgaWYgKHcgPiByZWN0LndpZHRoKSB7Ci0gICAgICAgICAgICB3ID0gcmVjdC53aWR0aDsKLSAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX1dJRFRILCByZWN0LndpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaCA+IHJlY3QuaGVpZ2h0KSB7Ci0gICAgICAgICAgICBoID0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5FWFBMT1JFUl9TSEVMTF9IRUlHSFQsIHJlY3QuaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyB0aGVuIGNoZWNrIHguIE1ha2Ugc3VyZSB0aGUgbGVmdCBjb3JuZXIgaXMgaW4gdGhlIHNjcmVlbgotICAgICAgICBpZiAoeCA8IHJlY3QueCkgewotICAgICAgICAgICAgeCA9IHJlY3QueDsKLSAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX1gsIHJlY3QueCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoeCA+PSByZWN0LnggKyByZWN0LndpZHRoKSB7Ci0gICAgICAgICAgICB4ID0gcmVjdC54ICsgcmVjdC53aWR0aCAtIHc7Ci0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShQcmVmc0RpYWxvZy5FWFBMT1JFUl9TSEVMTF9YLCByZWN0LngpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoZW4gY2hlY2sgeS4gTWFrZSBzdXJlIHRoZSBsZWZ0IGNvcm5lciBpcyBpbiB0aGUgc2NyZWVuCi0gICAgICAgIGlmICh5IDwgcmVjdC55KSB7Ci0gICAgICAgICAgICB5ID0gcmVjdC55OwotICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuRVhQTE9SRVJfU0hFTExfWSwgcmVjdC55KTsKLSAgICAgICAgfSBlbHNlIGlmICh5ID49IHJlY3QueSArIHJlY3QuaGVpZ2h0KSB7Ci0gICAgICAgICAgICB5ID0gcmVjdC55ICsgcmVjdC5oZWlnaHQgLSBoOwotICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuRVhQTE9SRVJfU0hFTExfWSwgcmVjdC55KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyB3ZSBjYW4gc2V0IHRoZSBsb2NhdGlvbi9zaXplCi0gICAgICAgIHNoZWxsLnNldEJvdW5kcyh4LCB5LCB3LCBoKTsKLQotICAgICAgICAvLyBhZGQgbGlzdGVuZXIgZm9yIHJlc2l6ZS9tb3ZlCi0gICAgICAgIHNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgeC95Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBpbiBwcmVmIGZpbGUKLSAgICAgICAgICAgICAgICBQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpOwotICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX1gsIHJlY3QueCk7Ci0gICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuRVhQTE9SRVJfU0hFTExfWSwgcmVjdC55KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5ldyB3L2gKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIC8vIHN0b3JlIGluIHByZWYgZmlsZQotICAgICAgICAgICAgICAgIFByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IFByZWZzRGlhbG9nLmdldFN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUHJlZnNEaWFsb2cuRVhQTE9SRVJfU0hFTExfV0lEVEgsIHJlY3Qud2lkdGgpOwotICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFByZWZzRGlhbG9nLkVYUExPUkVSX1NIRUxMX0hFSUdIVCwgcmVjdC5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgY29uZmlybS1iZWZvcmUtY2xvc2UgZGlhbG9nLiBUT0RPOiBlbmFibGUvZGlzYWJsZSBpbiBwcmVmcy4gVE9ETzoKLSAgICAgKiBpcyB0aGVyZSBhbnkgcG9pbnQgaW4gaGF2aW5nIHRoaXM/Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbmZpcm1DbG9zZShmaW5hbCBTaGVsbCBzaGVsbCkgewotICAgICAgICBpZiAodHJ1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0eWxlID0gU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTzsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQm94IG1zZ0JveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgbXNnQm94LnNldFRleHQoIkNvbmZpcm0uLi4iKTsKLSAgICAgICAgICAgICAgICBtc2dCb3guc2V0TWVzc2FnZSgiQ2xvc2UgRERNPyIpOwotICAgICAgICAgICAgICAgIGV2ZW50LmRvaXQgPSAobXNnQm94Lm9wZW4oKSA9PSBTV1QuWUVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgdGhlIG1lbnUgYmFyIGFuZCBpdGVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVudXMoZmluYWwgU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgLy8gY3JlYXRlIG1lbnUgYmFyCi0gICAgICAgIE1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQotICAgICAgICAvLyBjcmVhdGUgdG9wLWxldmVsIGl0ZW1zCi0gICAgICAgIE1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICAgICAgZmlsZUl0ZW0uc2V0VGV4dCgiJkZpbGUiKTsKLSAgICAgICAgTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotICAgICAgICBlZGl0SXRlbS5zZXRUZXh0KCImRWRpdCIpOwotICAgICAgICBNZW51SXRlbSBhY3Rpb25JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICAgICAgYWN0aW9uSXRlbS5zZXRUZXh0KCImQWN0aW9ucyIpOwotICAgICAgICBNZW51SXRlbSBkZXZpY2VJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICAgICAgZGV2aWNlSXRlbS5zZXRUZXh0KCImRGV2aWNlIik7Ci0gICAgICAgIE1lbnVJdGVtIGhlbHBJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICAgICAgaGVscEl0ZW0uc2V0VGV4dCgiJkhlbHAiKTsKLQotICAgICAgICAvLyBjcmVhdGUgdG9wLWxldmVsIG1lbnVzCi0gICAgICAgIE1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShtZW51QmFyKTsKLSAgICAgICAgZmlsZUl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0gICAgICAgIE1lbnUgZWRpdE1lbnUgPSBuZXcgTWVudShtZW51QmFyKTsKLSAgICAgICAgZWRpdEl0ZW0uc2V0TWVudShlZGl0TWVudSk7Ci0gICAgICAgIE1lbnUgYWN0aW9uTWVudSA9IG5ldyBNZW51KG1lbnVCYXIpOwotICAgICAgICBhY3Rpb25JdGVtLnNldE1lbnUoYWN0aW9uTWVudSk7Ci0gICAgICAgIE1lbnUgZGV2aWNlTWVudSA9IG5ldyBNZW51KG1lbnVCYXIpOwotICAgICAgICBkZXZpY2VJdGVtLnNldE1lbnUoZGV2aWNlTWVudSk7Ci0gICAgICAgIE1lbnUgaGVscE1lbnUgPSBuZXcgTWVudShtZW51QmFyKTsKLSAgICAgICAgaGVscEl0ZW0uc2V0TWVudShoZWxwTWVudSk7Ci0KLSAgICAgICAgTWVudUl0ZW0gaXRlbTsKLQotICAgICAgICAvLyBjcmVhdGUgRmlsZSBtZW51IGl0ZW1zCi0gICAgICAgIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KCImUHJlZmVyZW5jZXMuLi4iKTsKLSAgICAgICAgaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFByZWZzRGlhbG9nLnJ1bihzaGVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KCImU3RhdGljIFBvcnQgQ29uZmlndXJhdGlvbi4uLiIpOwotICAgICAgICBpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RhdGljUG9ydENvbmZpZ0RpYWxvZyBkbGcgPSBuZXcgU3RhdGljUG9ydENvbmZpZ0RpYWxvZyhzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQotICAgICAgICBpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgiRSZ4aXRcdEN0cmwtUSIpOwotICAgICAgICBpdGVtLnNldEFjY2VsZXJhdG9yKCdRJyB8IFNXVC5DT05UUk9MKTsKLSAgICAgICAgaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSBlZGl0IG1lbnUgaXRlbXMKLSAgICAgICAgbUNvcHlNZW51SXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULk5PTkUpOwotICAgICAgICBtQ29weU1lbnVJdGVtLnNldFRleHQoIiZDb3B5XHRDdHJsLUMiKTsKLSAgICAgICAgbUNvcHlNZW51SXRlbS5zZXRBY2NlbGVyYXRvcignQycgfCBTV1QuQ09NTUFORCk7Ci0gICAgICAgIG1Db3B5TWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtVGFibGVMaXN0ZW5lci5jb3B5KG1DbGlwYm9hcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIG1TZWxlY3RBbGxNZW51SXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULk5PTkUpOwotICAgICAgICBtU2VsZWN0QWxsTWVudUl0ZW0uc2V0VGV4dCgiU2VsZWN0ICZBbGxcdEN0cmwtQSIpOwotICAgICAgICBtU2VsZWN0QWxsTWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoJ0EnIHwgU1dULkNPTU1BTkQpOwotICAgICAgICBtU2VsZWN0QWxsTWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtVGFibGVMaXN0ZW5lci5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEFjdGlvbiBtZW51IGl0ZW1zCi0gICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGNvbWUgd2l0aCBhIGNvbmZpcm1hdGlvbiBkaWFsb2cKLSAgICAgICAgZmluYWwgTWVudUl0ZW0gYWN0aW9uSGFsdEl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uTWVudSwgU1dULk5PTkUpOwotICAgICAgICBhY3Rpb25IYWx0SXRlbS5zZXRUZXh0KCImSGFsdCBWTSIpOwotICAgICAgICBhY3Rpb25IYWx0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VQYW5lbC5raWxsU2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgTWVudUl0ZW0gYWN0aW9uQ2F1c2VHY0l0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uTWVudSwgU1dULk5PTkUpOwotICAgICAgICBhY3Rpb25DYXVzZUdjSXRlbS5zZXRUZXh0KCJDYXVzZSAmR0MiKTsKLSAgICAgICAgYWN0aW9uQ2F1c2VHY0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlUGFuZWwuZm9yY2VHY09uU2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIEFjdGlvbiBpdGVtcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlCi0gICAgICAgIGFjdGlvbk1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uSGFsdEl0ZW0uc2V0RW5hYmxlZChtVEJIYWx0LmdldEVuYWJsZWQoKSAmJiBtQ3VycmVudENsaWVudCAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBhY3Rpb25DYXVzZUdjSXRlbS5zZXRFbmFibGVkKG1UQkNhdXNlR2MuZ2V0RW5hYmxlZCgpICYmIG1DdXJyZW50Q2xpZW50ICE9IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBjcmVhdGUgRGV2aWNlIG1lbnUgaXRlbXMKLSAgICAgICAgZmluYWwgTWVudUl0ZW0gc2NyZWVuU2hvdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZGV2aWNlTWVudSwgU1dULk5PTkUpOwotICAgICAgICBzY3JlZW5TaG90SXRlbS5zZXRUZXh0KCImU2NyZWVuIGNhcHR1cmUuLi5cdENUcmwtUyIpOwotICAgICAgICBzY3JlZW5TaG90SXRlbS5zZXRBY2NlbGVyYXRvcignUycgfCBTV1QuQ09OVFJPTCk7Ci0gICAgICAgIHNjcmVlblNob3RJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2NyZWVuU2hvdERpYWxvZyBkbGcgPSBuZXcgU2NyZWVuU2hvdERpYWxvZyhzaGVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGRsZy5vcGVuKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5ldyBNZW51SXRlbShkZXZpY2VNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQotICAgICAgICBmaW5hbCBNZW51SXRlbSBleHBsb3Jlckl0ZW0gPSBuZXcgTWVudUl0ZW0oZGV2aWNlTWVudSwgU1dULk5PTkUpOwotICAgICAgICBleHBsb3Jlckl0ZW0uc2V0VGV4dCgiRmlsZSBFeHBsb3Jlci4uLiIpOwotICAgICAgICBleHBsb3Jlckl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVGaWxlRXhwbG9yZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IE1lbnVJdGVtKGRldmljZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtIHByb2Nlc3NJdGVtID0gbmV3IE1lbnVJdGVtKGRldmljZU1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJvY2Vzc0l0ZW0uc2V0VGV4dCgiU2hvdyAmcHJvY2VzcyBzdGF0dXMuLi4iKTsKLSAgICAgICAgcHJvY2Vzc0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEZXZpY2VDb21tYW5kRGlhbG9nIGRsZzsKLSAgICAgICAgICAgICAgICBkbGcgPSBuZXcgRGV2aWNlQ29tbWFuZERpYWxvZygicHMgLXgiLCAicHMteC50eHQiLCBzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4obUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBNZW51SXRlbSBkZXZpY2VTdGF0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oZGV2aWNlTWVudSwgU1dULk5PTkUpOwotICAgICAgICBkZXZpY2VTdGF0ZUl0ZW0uc2V0VGV4dCgiRHVtcCAmZGV2aWNlIHN0YXRlLi4uIik7Ci0gICAgICAgIGRldmljZVN0YXRlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERldmljZUNvbW1hbmREaWFsb2cgZGxnOwotICAgICAgICAgICAgICAgIGRsZyA9IG5ldyBEZXZpY2VDb21tYW5kRGlhbG9nKCIvc3lzdGVtL2Jpbi9kdW1wc3RhdGUgL3Byb2Mvc2VsZi9mZC8wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2Utc3RhdGUudHh0Iiwgc2hlbGwpOwotICAgICAgICAgICAgICAgIGRsZy5vcGVuKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgTWVudUl0ZW0gYXBwU3RhdGVJdGVtID0gbmV3IE1lbnVJdGVtKGRldmljZU1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgYXBwU3RhdGVJdGVtLnNldFRleHQoIkR1bXAgJmFwcCBzdGF0ZS4uLiIpOwotICAgICAgICBhcHBTdGF0ZUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGFwcFN0YXRlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERldmljZUNvbW1hbmREaWFsb2cgZGxnOwotICAgICAgICAgICAgICAgIGRsZyA9IG5ldyBEZXZpY2VDb21tYW5kRGlhbG9nKCJkdW1wc3lzIiwgImFwcC1zdGF0ZS50eHQiLCBzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4obUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBNZW51SXRlbSByYWRpb1N0YXRlSXRlbSA9IG5ldyBNZW51SXRlbShkZXZpY2VNZW51LCBTV1QuTk9ORSk7Ci0gICAgICAgIHJhZGlvU3RhdGVJdGVtLnNldFRleHQoIkR1bXAgJnJhZGlvIHN0YXRlLi4uIik7Ci0gICAgICAgIHJhZGlvU3RhdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlQ29tbWFuZERpYWxvZyBkbGc7Ci0gICAgICAgICAgICAgICAgZGxnID0gbmV3IERldmljZUNvbW1hbmREaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2F0IC9kYXRhL2xvZ3MvcmFkaW8uNCAvZGF0YS9sb2dzL3JhZGlvLjMiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgL2RhdGEvbG9ncy9yYWRpby4yIC9kYXRhL2xvZ3MvcmFkaW8uMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAvZGF0YS9sb2dzL3JhZGlvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyYWRpby1zdGF0ZS50eHQiLCBzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4obUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBNZW51SXRlbSBsb2dDYXRJdGVtID0gbmV3IE1lbnVJdGVtKGRldmljZU1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgbG9nQ2F0SXRlbS5zZXRUZXh0KCJSdW4gJmxvZ2NhdC4uLiIpOwotICAgICAgICBsb2dDYXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlQ29tbWFuZERpYWxvZyBkbGc7Ci0gICAgICAgICAgICAgICAgZGxnID0gbmV3IERldmljZUNvbW1hbmREaWFsb2coImxvZ2NhdCAnKjpkIGpkd3A6dyciLCAibG9nLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4obUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBjb25maWd1cmUgQWN0aW9uIGl0ZW1zIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgZGV2aWNlTWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRldmljZUVuYWJsZWQgPSBtQ3VycmVudERldmljZSAhPSBudWxsOwotICAgICAgICAgICAgICAgIHNjcmVlblNob3RJdGVtLnNldEVuYWJsZWQoZGV2aWNlRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgZXhwbG9yZXJJdGVtLnNldEVuYWJsZWQoZGV2aWNlRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0l0ZW0uc2V0RW5hYmxlZChkZXZpY2VFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBkZXZpY2VTdGF0ZUl0ZW0uc2V0RW5hYmxlZChkZXZpY2VFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBhcHBTdGF0ZUl0ZW0uc2V0RW5hYmxlZChkZXZpY2VFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByYWRpb1N0YXRlSXRlbS5zZXRFbmFibGVkKGRldmljZUVuYWJsZWQpOwotICAgICAgICAgICAgICAgIGxvZ0NhdEl0ZW0uc2V0RW5hYmxlZChkZXZpY2VFbmFibGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEhlbHAgbWVudSBpdGVtcwotICAgICAgICBpdGVtID0gbmV3IE1lbnVJdGVtKGhlbHBNZW51LCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgiJkNvbnRlbnRzLi4uIik7Ci0gICAgICAgIGl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuT0s7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUJveCBtc2dCb3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgc3R5bGUpOwotICAgICAgICAgICAgICAgIG1zZ0JveC5zZXRUZXh0KCJIZWxwISIpOwotICAgICAgICAgICAgICAgIG1zZ0JveC5zZXRNZXNzYWdlKCJIZWxwIHdhbnRlZC4iKTsKLSAgICAgICAgICAgICAgICBtc2dCb3gub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuZXcgTWVudUl0ZW0oaGVscE1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIGl0ZW0gPSBuZXcgTWVudUl0ZW0oaGVscE1lbnUsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KCImQWJvdXQuLi4iKTsKLSAgICAgICAgaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEFib3V0RGlhbG9nIGRsZyA9IG5ldyBBYm91dERpYWxvZyhzaGVsbCk7Ci0gICAgICAgICAgICAgICAgZGxnLm9wZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gdGVsbCB0aGUgc2hlbGwgdG8gdXNlIHRoaXMgbWVudQotICAgICAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSB3aWRnZXRzIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uIHdpbmRvdy4gVGhlIGJhc2ljIGxheW91dCBpcyBhCi0gICAgICogdHdvLXBhbmVsIHNhc2gsIHdpdGggYSBzY3JvbGxpbmcgbGlzdCBvZiBWTXMgb24gdGhlIGxlZnQgYW5kIGRldGFpbGVkCi0gICAgICogb3V0cHV0IGZvciBhIHNpbmdsZSBWTSBvbiB0aGUgcmlnaHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdpZGdldHMoZmluYWwgU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgQ29sb3IgZGFya0dyYXkgPSBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIHRocmVlIGFyZWFzOiB0b29sIGJhciwgc3BsaXQgcGFuZWxzLCBzdGF0dXMgbGluZQotICAgICAgICAgKi8KLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gMS4gcGFuZWwgYXJlYQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgcGFuZWxBcmVhID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUik7Ci0KLSAgICAgICAgLy8gbWFrZSB0aGUgcGFuZWwgYXJlYSBhYnNvcmIgYWxsIHNwYWNlCi0gICAgICAgIHBhbmVsQXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAvLyAyLiBzdGF0dXMgbGluZS4KLSAgICAgICAgbVN0YXR1c0xpbmUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQotICAgICAgICAvLyBtYWtlIHN0YXR1cyBsaW5lIGV4dGVuZCBhbGwgdGhlIHdheSBhY3Jvc3MKLSAgICAgICAgbVN0YXR1c0xpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbVN0YXR1c0xpbmUuc2V0VGV4dCgiSW5pdGlhbGl6aW5nLi4uIik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29uZmlndXJlIHRoZSBzcGxpdC1wYW5lbCBhcmVhLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVN0b3JlIHByZWZzID0gUHJlZnNEaWFsb2cuZ2V0U3RvcmUoKTsKLQotICAgICAgICBDb21wb3NpdGUgdG9wUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhbmVsQXJlYSwgU1dULk5PTkUpOwotICAgICAgICBmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChwYW5lbEFyZWEsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgc2FzaC5zZXRCYWNrZ3JvdW5kKGRhcmtHcmF5KTsKLSAgICAgICAgQ29tcG9zaXRlIGJvdHRvbVBhbmVsID0gbmV3IENvbXBvc2l0ZShwYW5lbEFyZWEsIFNXVC5OT05FKTsKLQotICAgICAgICBwYW5lbEFyZWEuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCi0gICAgICAgIGNyZWF0ZVRvcFBhbmVsKHRvcFBhbmVsLCBkYXJrR3JheSk7Ci0gICAgICAgIGNyZWF0ZUJvdHRvbVBhbmVsKGJvdHRvbVBhbmVsKTsKLQotICAgICAgICAvLyBmb3JtIGxheW91dCBkYXRhCi0gICAgICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgdG9wUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCAmJiBwcmVmcy5jb250YWlucyhQUkVGRVJFTkNFX0xPR1NBU0gpKSB7Ci0gICAgICAgICAgICBzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgcHJlZnMuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICBQUkVGRVJFTkNFX0xPR1NBU0gpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwwKTsgLy8gNTAlIGFjcm9zcwotICAgICAgICB9Ci0gICAgICAgIHNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIHNhc2hEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIHNhc2guc2V0TGF5b3V0RGF0YShzYXNoRGF0YSk7Ci0KLSAgICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLSAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIGJvdHRvbVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgLy8gYWxsb3cgcmVzaXplcywgYnV0IGNhcCBhdCBtaW5QYW5lbFdpZHRoCi0gICAgICAgIHNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHBhbmVsUmVjdCA9IHBhbmVsQXJlYS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IHBhbmVsUmVjdC5oZWlnaHQgLSBzYXNoUmVjdC5oZWlnaHQgLSAxMDA7Ci0gICAgICAgICAgICAgICAgZS55ID0gTWF0aC5tYXgoTWF0aC5taW4oZS55LCBib3R0b20pLCAxMDApOwotICAgICAgICAgICAgICAgIGlmIChlLnkgIT0gc2FzaFJlY3QueSkgewotICAgICAgICAgICAgICAgICAgICBzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgZS55KTsKLSAgICAgICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUFJFRkVSRU5DRV9MT0dTQVNILCBlLnkpOwotICAgICAgICAgICAgICAgICAgICBwYW5lbEFyZWEubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBhZGQgYSBnbG9iYWwgZm9jdXMgbGlzdGVuZXIgZm9yIGFsbCB0aGUgdGFibGVzCi0gICAgICAgIG1UYWJsZUxpc3RlbmVyID0gbmV3IFRhYmxlRm9jdXNMaXN0ZW5lcigpOwotCi0gICAgICAgIC8vIG5vdyBzZXQgdXAgdGhlIGxpc3RlbmVyIGluIHRoZSB2YXJpb3VzIHBhbmVscwotICAgICAgICBtTG9nUGFuZWwuc2V0VGFibGVGb2N1c0xpc3RlbmVyKG1UYWJsZUxpc3RlbmVyKTsKLSAgICAgICAgbUV2ZW50TG9nUGFuZWwuc2V0VGFibGVGb2N1c0xpc3RlbmVyKG1UYWJsZUxpc3RlbmVyKTsKLSAgICAgICAgZm9yIChUYWJsZVBhbmVsIHAgOiBtUGFuZWxzKSB7Ci0gICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcC5zZXRUYWJsZUZvY3VzTGlzdGVuZXIobVRhYmxlTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXR1c0xpbmUuc2V0VGV4dCgiIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQb3B1bGF0ZSB0aGUgdG9vbCBiYXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURldmljZVBhbmVsVG9vbEJhcihUb29sQmFyIHRvb2xCYXIpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gdG9vbEJhci5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gYWRkICJzaG93IGhlYXAgdXBkYXRlcyIgYnV0dG9uCi0gICAgICAgIG1UQlNob3dIZWFwVXBkYXRlcyA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotICAgICAgICBtVEJTaG93SGVhcFVwZGF0ZXMuc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBkaXNwbGF5LAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fSEVBUCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgbnVsbCkpOwotICAgICAgICBtVEJTaG93SGVhcFVwZGF0ZXMuc2V0VG9vbFRpcFRleHQoIlNob3cgaGVhcCB1cGRhdGVzIik7Ci0gICAgICAgIG1UQlNob3dIZWFwVXBkYXRlcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVRCU2hvd0hlYXBVcGRhdGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50Q2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBzdGF0dXMgPSAoKFRvb2xJdGVtKWUuaXRlbSkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludmVydCBwcmV2aW91cyBzdGF0ZQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuYWJsZSA9ICFtQ3VycmVudENsaWVudC5pc0hlYXBVcGRhdGVFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50LnNldEhlYXBVcGRhdGVFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7IC8vIHRoaXMgaGFzIG5vIGVmZmVjdD8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGFkZCAiZHVtcCBIUFJPRiIgYnV0dG9uCi0gICAgICAgIG1UQkR1bXBIcHJvZiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1UQkR1bXBIcHJvZi5zZXRUb29sVGlwVGV4dCgiRHVtcCBIUFJPRiBmaWxlIik7Ci0gICAgICAgIG1UQkR1bXBIcHJvZi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVRCRHVtcEhwcm9mLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX0hQUk9GLCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0gICAgICAgIG1UQkR1bXBIcHJvZi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VQYW5lbC5kdW1wSHByb2YoKTsKLQotICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGR1bXAgaHByb2YgYnV0dG9uIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAvLyBhcyB0aGUgY2xpZW50IGlzIGFscmVhZHkgZHVtcGluZyBhbiBocHJvZiBmaWxlCi0gICAgICAgICAgICAgICAgZW5hYmxlQnV0dG9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBhZGQgImNhdXNlIEdDIiBidXR0b24KLSAgICAgICAgbVRCQ2F1c2VHYyA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1UQkNhdXNlR2Muc2V0VG9vbFRpcFRleHQoIkNhdXNlIGFuIGltbWVkaWF0ZSBHQyIpOwotICAgICAgICBtVEJDYXVzZUdjLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVEJDYXVzZUdjLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX0dDLCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0gICAgICAgIG1UQkNhdXNlR2MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlUGFuZWwuZm9yY2VHY09uU2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIC8vIGFkZCAic2hvdyB0aHJlYWQgdXBkYXRlcyIgYnV0dG9uCi0gICAgICAgIG1UQlNob3dUaHJlYWRVcGRhdGVzID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG1UQlNob3dUaHJlYWRVcGRhdGVzLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1RIUkVBRCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgbnVsbCkpOwotICAgICAgICBtVEJTaG93VGhyZWFkVXBkYXRlcy5zZXRUb29sVGlwVGV4dCgiU2hvdyB0aHJlYWQgdXBkYXRlcyIpOwotICAgICAgICBtVEJTaG93VGhyZWFkVXBkYXRlcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVRCU2hvd1RocmVhZFVwZGF0ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBib29sZWFuIHN0YXR1cyA9ICgoVG9vbEl0ZW0pZS5pdGVtKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW52ZXJ0IHByZXZpb3VzIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlID0gIW1DdXJyZW50Q2xpZW50LmlzVGhyZWFkVXBkYXRlRW5hYmxlZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50LnNldFRocmVhZFVwZGF0ZUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsgLy8gdGhpcyBoYXMgbm8gZWZmZWN0PwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gYWRkIGEgc3RhcnQvc3RvcCBtZXRob2QgdHJhY2luZwotICAgICAgICBtVHJhY2luZ1N0YXJ0SW1hZ2UgPSBJbWFnZUhlbHBlci5sb2FkSW1hZ2UobURkbXVpTGliSW1hZ2VMb2FkZXIsIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRGV2aWNlUGFuZWwuSUNPTl9UUkFDSU5HX1NUQVJULAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpOwotICAgICAgICBtVHJhY2luZ1N0b3BJbWFnZSA9IEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1RSQUNJTkdfU1RPUCwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKTsKLSAgICAgICAgbVRCUHJvZmlsaW5nID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgbVRCUHJvZmlsaW5nLnNldFRvb2xUaXBUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgIG1UQlByb2ZpbGluZy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVRCUHJvZmlsaW5nLnNldEltYWdlKG1UcmFjaW5nU3RhcnRJbWFnZSk7Ci0gICAgICAgIG1UQlByb2ZpbGluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VQYW5lbC50b2dnbGVNZXRob2RQcm9maWxpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIC8vIGFkZCAia2lsbCBWTSIgYnV0dG9uOyBuZWVkIHRvIG1ha2UgdGhpcyB2aXN1YWxseSBkaXN0aW5jdCBmcm9tCi0gICAgICAgIC8vIHRoZSBzdGF0dXMgdXBkYXRlIGJ1dHRvbnMKLSAgICAgICAgbVRCSGFsdCA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1UQkhhbHQuc2V0VG9vbFRpcFRleHQoIkhhbHQgdGhlIHRhcmdldCBWTSIpOwotICAgICAgICBtVEJIYWx0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVEJIYWx0LnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX0hBTFQsIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLSAgICAgICAgbVRCSGFsdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VQYW5lbC5raWxsU2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICB0b29sQmFyLnBhY2soKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wUGFuZWwoZmluYWwgQ29tcG9zaXRlIGNvbXAsIENvbG9yIGRhcmtHcmF5KSB7Ci0gICAgICAgIGZpbmFsIFByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IFByZWZzRGlhbG9nLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgY29tcC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGxlZnRQYW5lbCA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotICAgICAgICBmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChjb21wLCBTV1QuVkVSVElDQUwpOwotICAgICAgICBzYXNoLnNldEJhY2tncm91bmQoZGFya0dyYXkpOwotICAgICAgICBDb21wb3NpdGUgcmlnaHRQYW5lbCA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotCi0gICAgICAgIGNyZWF0ZUxlZnRQYW5lbChsZWZ0UGFuZWwpOwotICAgICAgICBjcmVhdGVSaWdodFBhbmVsKHJpZ2h0UGFuZWwpOwotCi0gICAgICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLSAgICAgICAgbGVmdFBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICBzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgaWYgKHByZWZzICE9IG51bGwgJiYgcHJlZnMuY29udGFpbnMoUFJFRkVSRU5DRV9TQVNIKSkgewotICAgICAgICAgICAgc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBwcmVmcy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgIFBSRUZFUkVOQ0VfU0FTSCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcG9zaXRpb24gdGhlIHNhc2ggMzgwIGZyb20gdGhlIHJpZ2h0IGluc3RlYWQgb2YgeCUgKGRvbmUgYnkgdXNpbmcKLSAgICAgICAgICAgIC8vIEZvcm1BdHRhY2htZW50KHgsIDApKSBpbiBvcmRlciB0byBrZWVwIHRoZSBzYXNoIGF0IHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBwb3NpdGlvbgotICAgICAgICAgICAgLy8gZnJvbSB0aGUgbGVmdCB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4KLSAgICAgICAgICAgIC8vIDM4MHB4IGlzIGp1c3QgZW5vdWdoIHRvIGRpc3BsYXkgdGhlIGxlZnQgdGFibGUgd2l0aCBubyBob3Jpem9udGFsCi0gICAgICAgICAgICAvLyBzY3JvbGxiYXIgd2l0aCB0aGUgZGVmYXVsdCBmb250LgotICAgICAgICAgICAgc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzODApOwotICAgICAgICB9Ci0gICAgICAgIHNhc2guc2V0TGF5b3V0RGF0YShzYXNoRGF0YSk7Ci0KLSAgICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIHJpZ2h0UGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBmaW5hbCBpbnQgbWluUGFuZWxXaWR0aCA9IDYwOwotCi0gICAgICAgIC8vIGFsbG93IHJlc2l6ZXMsIGJ1dCBjYXAgYXQgbWluUGFuZWxXaWR0aAotICAgICAgICBzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc2FzaFJlY3QgPSBzYXNoLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBwYW5lbFJlY3QgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBwYW5lbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIG1pblBhbmVsV2lkdGg7Ci0gICAgICAgICAgICAgICAgZS54ID0gTWF0aC5tYXgoTWF0aC5taW4oZS54LCByaWdodCksIG1pblBhbmVsV2lkdGgpOwotICAgICAgICAgICAgICAgIGlmIChlLnggIT0gc2FzaFJlY3QueCkgewotICAgICAgICAgICAgICAgICAgICBzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueCk7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFBSRUZFUkVOQ0VfU0FTSCwgZS54KTsKLSAgICAgICAgICAgICAgICAgICAgY29tcC5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVCb3R0b21QYW5lbChmaW5hbCBDb21wb3NpdGUgY29tcCkgewotICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBjbGlwYm9hcmQKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gY29tcC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIG1DbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCi0gICAgICAgIExvZ0NvbG9ycyBjb2xvcnMgPSBuZXcgTG9nQ29sb3JzKCk7Ci0KLSAgICAgICAgY29sb3JzLmluZm9Db2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAxMjcsIDApOwotICAgICAgICBjb2xvcnMuZGVidWdDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAxMjcpOwotICAgICAgICBjb2xvcnMuZXJyb3JDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotICAgICAgICBjb2xvcnMud2FybmluZ0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMTI3LCAwKTsKLSAgICAgICAgY29sb3JzLnZlcmJvc2VDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHByZWZlcmVuY2VzIG5hbWVzCi0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1RJTUUgPSBQUkVGU19DT0xfVElNRTsKLSAgICAgICAgTG9nUGFuZWwuUFJFRlNfTEVWRUwgPSBQUkVGU19DT0xfTEVWRUw7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1BJRCA9IFBSRUZTX0NPTF9QSUQ7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1RBRyA9IFBSRUZTX0NPTF9UQUc7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX01FU1NBR0UgPSBQUkVGU19DT0xfTUVTU0FHRTsKLQotICAgICAgICBjb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0gICAgICAgIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvbXAsIFNXVC5IT1JJWk9OVEFMKTsKLQotICAgICAgICBtQ3JlYXRlRmlsdGVyQWN0aW9uID0gbmV3IFRvb2xJdGVtQWN0aW9uKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgbUNyZWF0ZUZpbHRlckFjdGlvbi5pdGVtLnNldFRvb2xUaXBUZXh0KCJDcmVhdGUgRmlsdGVyIik7Ci0gICAgICAgIG1DcmVhdGVGaWx0ZXJBY3Rpb24uaXRlbS5zZXRJbWFnZShJbWFnZUhlbHBlci5sb2FkSW1hZ2UobURkbXVpTGliSW1hZ2VMb2FkZXIsIG1EaXNwbGF5LAotICAgICAgICAgICAgICAgICJhZGQucG5nIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLSAgICAgICAgbUNyZWF0ZUZpbHRlckFjdGlvbi5pdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUxvZ1BhbmVsLmFkZEZpbHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtRWRpdEZpbHRlckFjdGlvbiA9IG5ldyBUb29sSXRlbUFjdGlvbih0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1FZGl0RmlsdGVyQWN0aW9uLml0ZW0uc2V0VG9vbFRpcFRleHQoIkVkaXQgRmlsdGVyIik7Ci0gICAgICAgIG1FZGl0RmlsdGVyQWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAiZWRpdC5wbmciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgbnVsbCkpOwotICAgICAgICBtRWRpdEZpbHRlckFjdGlvbi5pdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUxvZ1BhbmVsLmVkaXRGaWx0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbURlbGV0ZUZpbHRlckFjdGlvbiA9IG5ldyBUb29sSXRlbUFjdGlvbih0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1EZWxldGVGaWx0ZXJBY3Rpb24uaXRlbS5zZXRUb29sVGlwVGV4dCgiRGVsZXRlIEZpbHRlciIpOwotICAgICAgICBtRGVsZXRlRmlsdGVyQWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAiZGVsZXRlLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0gICAgICAgIG1EZWxldGVGaWx0ZXJBY3Rpb24uaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1Mb2dQYW5lbC5kZWxldGVGaWx0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0KLSAgICAgICAgTG9nTGV2ZWxbXSBsZXZlbHMgPSBMb2dMZXZlbC52YWx1ZXMoKTsKLSAgICAgICAgbUxvZ0xldmVsQWN0aW9ucyA9IG5ldyBUb29sSXRlbUFjdGlvblttTG9nTGV2ZWxJY29ucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtTG9nTGV2ZWxBY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGxldmVsc1tpXS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgVG9vbEl0ZW1BY3Rpb24gbmV3QWN0aW9uID0gbmV3IFRvb2xJdGVtQWN0aW9uKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICBtTG9nTGV2ZWxBY3Rpb25zW2ldID0gbmV3QWN0aW9uOwotICAgICAgICAgICAgLy9uZXdBY3Rpb24uaXRlbS5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgICAgbmV3QWN0aW9uLml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBvdGhlciBhY3Rpb25zIGFuZCByZWNvcmQgY3VycmVudCBpbmRleAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtTG9nTGV2ZWxBY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUb29sSXRlbUFjdGlvbiBhID0gbUxvZ0xldmVsQWN0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IG5ld0FjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0Q2hlY2tlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgbG9nIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvZ1BhbmVsLnNldEN1cnJlbnRGaWx0ZXJMb2dMZXZlbChpKzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG5ld0FjdGlvbi5pdGVtLnNldFRvb2xUaXBUZXh0KG5hbWUpOwotICAgICAgICAgICAgbmV3QWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgbUxvZ0xldmVsSWNvbnNbaV0sCi0gICAgICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQotICAgICAgICBtQ2xlYXJBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgICBtQ2xlYXJBY3Rpb24uaXRlbS5zZXRUb29sVGlwVGV4dCgiQ2xlYXIgTG9nIik7Ci0KLSAgICAgICAgbUNsZWFyQWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAiY2xlYXIucG5nIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLSAgICAgICAgbUNsZWFyQWN0aW9uLml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIG1FeHBvcnRBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgICBtRXhwb3J0QWN0aW9uLml0ZW0uc2V0VG9vbFRpcFRleHQoIkV4cG9ydCBTZWxlY3Rpb24gQXMgVGV4dC4uLiIpOwotICAgICAgICBtRXhwb3J0QWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAic2F2ZS5wbmciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgRGV2aWNlUGFuZWwuSUNPTl9XSURUSCwgbnVsbCkpOwotICAgICAgICBtRXhwb3J0QWN0aW9uLml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuc2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIHRvb2xCYXIucGFjaygpOwotCi0gICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIGxvZyB2aWV3Ci0gICAgICAgIG1Mb2dQYW5lbCA9IG5ldyBMb2dQYW5lbChuZXcgSW1hZ2VMb2FkZXIoTG9nUGFuZWwuY2xhc3MpLCBjb2xvcnMsIG5ldyBGaWx0ZXJTdG9yYWdlKCksCi0gICAgICAgICAgICAgICAgTG9nUGFuZWwuRklMVEVSX01BTlVBTCk7Ci0KLSAgICAgICAgbUxvZ1BhbmVsLnNldEFjdGlvbnMobURlbGV0ZUZpbHRlckFjdGlvbiwgbUVkaXRGaWx0ZXJBY3Rpb24sIG1Mb2dMZXZlbEFjdGlvbnMpOwotCi0gICAgICAgIFN0cmluZyBjb2xNb2RlID0gcHJlZnMuZ2V0U3RyaW5nKFByZWZzRGlhbG9nLkxPR0NBVF9DT0xVTU5fTU9ERSk7Ci0gICAgICAgIGlmIChQcmVmc0RpYWxvZy5MT0dDQVRfQ09MVU1OX01PREVfQVVUTy5lcXVhbHMoY29sTW9kZSkpIHsKLSAgICAgICAgICAgIG1Mb2dQYW5lbC5zZXRDb2x1bW5Nb2RlKExvZ1BhbmVsLkNPTFVNTl9NT0RFX0FVVE8pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZvbnRTdHIgPSBQcmVmc0RpYWxvZy5nZXRTdG9yZSgpLmdldFN0cmluZyhQcmVmc0RpYWxvZy5MT0dDQVRfRk9OVCk7Ci0gICAgICAgIGlmIChmb250U3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRm9udERhdGEgZmRhdCA9IG5ldyBGb250RGF0YShmb250U3RyKTsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuc2V0Rm9udChuZXcgRm9udChkaXNwbGF5LCBmZGF0KSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgZm9udFN0ciBpc24ndCBhIHZhbGlkIGZvbnQgcmVwcmVzZW50YXRpb24uCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90aGluZyBpbiB0aGlzIGNhc2UsIHRoZSBsb2djYXQgdmlldyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmb250LgotICAgICAgICAgICAgfSBjYXRjaCAoU1dURXJyb3IgZTIpIHsKLSAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIHRoZSBGb250KCkgY29uc3RydWN0b3IgZmFpbGVkLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLCB0aGUgbG9nY2F0IHZpZXcgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZm9udC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1Mb2dQYW5lbC5jcmVhdGVQYW5lbChjb21wKTsKLQotICAgICAgICAvLyBhbmQgc3RhcnQgdGhlIGxvZ2NhdAotICAgICAgICBtTG9nUGFuZWwuc3RhcnRMb2dDYXQobUN1cnJlbnREZXZpY2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbGVmdCBwYW5lbDogYSB0YWJsZSBvZiBWTXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUxlZnRQYW5lbChmaW5hbCBDb21wb3NpdGUgY29tcCkgewotICAgICAgICBjb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5SSUdIVCB8IFNXVC5XUkFQKTsKLSAgICAgICAgdG9vbEJhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgY3JlYXRlRGV2aWNlUGFuZWxUb29sQmFyKHRvb2xCYXIpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgbURldmljZVBhbmVsID0gbmV3IERldmljZVBhbmVsKG5ldyBJbWFnZUxvYWRlcihEZXZpY2VQYW5lbC5jbGFzcyksIHRydWUgLyogc2hvd1BvcnRzICovKTsKLSAgICAgICAgbURldmljZVBhbmVsLmNyZWF0ZVBhbmVsKGMpOwotCi0gICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgdG8gdGhlIGRldmljZSBwYW5lbCBzZWxlY3Rpb24gbGlzdGVuZXIKLSAgICAgICAgbURldmljZVBhbmVsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcmlnaHQgcGFuZWw6IHRhYnMgd2l0aCBWTSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmlnaHRQYW5lbChmaW5hbCBDb21wb3NpdGUgY29tcCkgewotICAgICAgICBUYWJJdGVtIGl0ZW07Ci0gICAgICAgIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLSAgICAgICAgY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihjb21wLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGFuZWxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobVBhbmVsc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dChtUGFuZWxOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRUb29sVGlwVGV4dChtUGFuZWxUaXBzW2ldKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldENvbnRyb2wobVBhbmVsc1tpXS5jcmVhdGVQYW5lbCh0YWJGb2xkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgZW11bGF0b3IgY29udHJvbCBwYW5lbCB0byB0aGUgZm9sZGVycy4KLSAgICAgICAgaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotICAgICAgICBpdGVtLnNldFRleHQoIkVtdWxhdG9yIENvbnRyb2wiKTsKLSAgICAgICAgaXRlbS5zZXRUb29sVGlwVGV4dCgiRW11bGF0b3IgQ29udHJvbCBQYW5lbCIpOwotICAgICAgICBtRW11bGF0b3JQYW5lbCA9IG5ldyBFbXVsYXRvckNvbnRyb2xQYW5lbChtRGRtdWlMaWJJbWFnZUxvYWRlcik7Ci0gICAgICAgIGl0ZW0uc2V0Q29udHJvbChtRW11bGF0b3JQYW5lbC5jcmVhdGVQYW5lbCh0YWJGb2xkZXIpKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGV2ZW50IGxvZyBwYW5lbCB0byB0aGUgZm9sZGVycy4KLSAgICAgICAgaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotICAgICAgICBpdGVtLnNldFRleHQoIkV2ZW50IExvZyIpOwotICAgICAgICBpdGVtLnNldFRvb2xUaXBUZXh0KCJFdmVudCBMb2ciKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbXBvc2l0ZSB0aGF0IHdpbGwgaG9sZCB0aGUgdG9vbGJhciBhbmQgdGhlIGV2ZW50IGxvZyBwYW5lbC4KLSAgICAgICAgQ29tcG9zaXRlIGV2ZW50TG9nVG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLSAgICAgICAgaXRlbS5zZXRDb250cm9sKGV2ZW50TG9nVG9wQ29tcG9zaXRlKTsKLSAgICAgICAgZXZlbnRMb2dUb3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0b29sYmFyIGFuZCB0aGUgYWN0aW9ucwotICAgICAgICBUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihldmVudExvZ1RvcENvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotICAgICAgICB0b29sYmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIFRvb2xJdGVtQWN0aW9uIG9wdGlvbnNBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbGJhciwgU1dULlBVU0gpOwotICAgICAgICBvcHRpb25zQWN0aW9uLml0ZW0uc2V0VG9vbFRpcFRleHQoIk9wZW5zIHRoZSBvcHRpb25zIHBhbmVsIik7Ci0gICAgICAgIG9wdGlvbnNBY3Rpb24uaXRlbS5zZXRJbWFnZShJbWFnZUhlbHBlci5sb2FkSW1hZ2UobURkbXVpTGliSW1hZ2VMb2FkZXIsIGNvbXAuZ2V0RGlzcGxheSgpLAotICAgICAgICAgICAgICAgICJlZGl0LnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0KLSAgICAgICAgVG9vbEl0ZW1BY3Rpb24gY2xlYXJBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbGJhciwgU1dULlBVU0gpOwotICAgICAgICBjbGVhckFjdGlvbi5pdGVtLnNldFRvb2xUaXBUZXh0KCJDbGVhcnMgdGhlIGV2ZW50IGxvZyIpOwotICAgICAgICBjbGVhckFjdGlvbi5pdGVtLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgY29tcC5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgImNsZWFyLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0KLSAgICAgICAgbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0gICAgICAgIFRvb2xJdGVtQWN0aW9uIHNhdmVBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbGJhciwgU1dULlBVU0gpOwotICAgICAgICBzYXZlQWN0aW9uLml0ZW0uc2V0VG9vbFRpcFRleHQoIlNhdmVzIHRoZSBldmVudCBsb2ciKTsKLSAgICAgICAgc2F2ZUFjdGlvbi5pdGVtLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgY29tcC5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgInNhdmUucG5nIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLQotICAgICAgICBUb29sSXRlbUFjdGlvbiBsb2FkQWN0aW9uID0gbmV3IFRvb2xJdGVtQWN0aW9uKHRvb2xiYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgbG9hZEFjdGlvbi5pdGVtLnNldFRvb2xUaXBUZXh0KCJMb2FkcyBhbiBldmVudCBsb2ciKTsKLSAgICAgICAgbG9hZEFjdGlvbi5pdGVtLnNldEltYWdlKEltYWdlSGVscGVyLmxvYWRJbWFnZShtRGRtdWlMaWJJbWFnZUxvYWRlciwgY29tcC5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgImxvYWQucG5nIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fV0lEVEgsIERldmljZVBhbmVsLklDT05fV0lEVEgsIG51bGwpKTsKLQotICAgICAgICBUb29sSXRlbUFjdGlvbiBpbXBvcnRCdWdBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbGJhciwgU1dULlBVU0gpOwotICAgICAgICBpbXBvcnRCdWdBY3Rpb24uaXRlbS5zZXRUb29sVGlwVGV4dCgiSW1wb3J0cyBhIGJ1ZyByZXBvcnQiKTsKLSAgICAgICAgaW1wb3J0QnVnQWN0aW9uLml0ZW0uc2V0SW1hZ2UoSW1hZ2VIZWxwZXIubG9hZEltYWdlKG1EZG11aUxpYkltYWdlTG9hZGVyLCBjb21wLmdldERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICAiaW1wb3J0QnVnLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBEZXZpY2VQYW5lbC5JQ09OX1dJRFRILCBudWxsKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBldmVudCBsb2cgcGFuZWwKLSAgICAgICAgbUV2ZW50TG9nUGFuZWwgPSBuZXcgRXZlbnRMb2dQYW5lbChtRGRtdWlMaWJJbWFnZUxvYWRlcik7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBleHRlcm5hbCBhY3Rpb25zCi0gICAgICAgIG1FdmVudExvZ1BhbmVsLnNldEFjdGlvbnMob3B0aW9uc0FjdGlvbiwgY2xlYXJBY3Rpb24sIHNhdmVBY3Rpb24sIGxvYWRBY3Rpb24sCi0gICAgICAgICAgICAgICAgaW1wb3J0QnVnQWN0aW9uKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHBhbmVsCi0gICAgICAgIG1FdmVudExvZ1BhbmVsLmNyZWF0ZVBhbmVsKGV2ZW50TG9nVG9wQ29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRmlsZUV4cGxvcmVyKCkgewotICAgICAgICBpZiAobUV4cGxvcmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FeHBsb3JlclNoZWxsID0gbmV3IFNoZWxsKG1EaXNwbGF5KTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB1aQotICAgICAgICAgICAgbUV4cGxvcmVyU2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgICAgIC8vIHRvb2xiYXIgKyBhY3Rpb24KLSAgICAgICAgICAgIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKG1FeHBsb3JlclNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICB0b29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgICAgICBUb29sSXRlbUFjdGlvbiBwdWxsQWN0aW9uID0gbmV3IFRvb2xJdGVtQWN0aW9uKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHB1bGxBY3Rpb24uaXRlbS5zZXRUb29sVGlwVGV4dCgiUHVsbCBGaWxlIGZyb20gRGV2aWNlIik7Ci0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IG1EZG11aUxpYkltYWdlTG9hZGVyLmxvYWRJbWFnZSgicHVsbC5wbmciLCBtRGlzcGxheSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHVsbEFjdGlvbi5pdGVtLnNldEltYWdlKGltYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2Ugd2hlbiB0aGUgaWNvbiBpcyBtaXNzaW5nCi0gICAgICAgICAgICAgICAgcHVsbEFjdGlvbi5pdGVtLnNldFRleHQoIlB1bGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUb29sSXRlbUFjdGlvbiBwdXNoQWN0aW9uID0gbmV3IFRvb2xJdGVtQWN0aW9uKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHB1c2hBY3Rpb24uaXRlbS5zZXRUb29sVGlwVGV4dCgiUHVzaCBmaWxlIG9udG8gRGV2aWNlIik7Ci0gICAgICAgICAgICBpbWFnZSA9IG1EZG11aUxpYkltYWdlTG9hZGVyLmxvYWRJbWFnZSgicHVzaC5wbmciLCBtRGlzcGxheSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHVzaEFjdGlvbi5pdGVtLnNldEltYWdlKGltYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2Ugd2hlbiB0aGUgaWNvbiBpcyBtaXNzaW5nCi0gICAgICAgICAgICAgICAgcHVzaEFjdGlvbi5pdGVtLnNldFRleHQoIlB1c2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUb29sSXRlbUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgVG9vbEl0ZW1BY3Rpb24odG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgICAgICAgZGVsZXRlQWN0aW9uLml0ZW0uc2V0VG9vbFRpcFRleHQoIkRlbGV0ZSIpOwotICAgICAgICAgICAgaW1hZ2UgPSBtRGRtdWlMaWJJbWFnZUxvYWRlci5sb2FkSW1hZ2UoImRlbGV0ZS5wbmciLCBtRGlzcGxheSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlQWN0aW9uLml0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSB3aGVuIHRoZSBpY29uIGlzIG1pc3NpbmcKLSAgICAgICAgICAgICAgICBkZWxldGVBY3Rpb24uaXRlbS5zZXRUZXh0KCJEZWxldGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZXZpY2UgZXhwbG9yZXIKLSAgICAgICAgICAgIG1FeHBsb3JlciA9IG5ldyBEZXZpY2VFeHBsb3JlcigpOwotCi0gICAgICAgICAgICBtRXhwbG9yZXIuc2V0SW1hZ2VzKG1EZG11aUxpYkltYWdlTG9hZGVyLmxvYWRJbWFnZSgiZmlsZS5wbmciLCBtRGlzcGxheSksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbURkbXVpTGliSW1hZ2VMb2FkZXIubG9hZEltYWdlKCJmb2xkZXIucG5nIiwgbURpc3BsYXkpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG1EZG11aUxpYkltYWdlTG9hZGVyLmxvYWRJbWFnZSgiYW5kcm9pZC5wbmciLCBtRGlzcGxheSksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBtRXhwbG9yZXIuc2V0QWN0aW9ucyhwdXNoQWN0aW9uLCBwdWxsQWN0aW9uLCBkZWxldGVBY3Rpb24pOwotCi0gICAgICAgICAgICBwdWxsQWN0aW9uLml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtRXhwbG9yZXIucHVsbFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcHVsbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgcHVzaEFjdGlvbi5pdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGxvcmVyLnB1c2hJbnRvU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBwdXNoQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICBkZWxldGVBY3Rpb24uaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHBsb3Jlci5kZWxldGVTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUobUV4cGxvcmVyU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAgICAgbUV4cGxvcmVyLmNyZWF0ZVBhbmVsKHBhcmVudCk7Ci0gICAgICAgICAgICBtRXhwbG9yZXIuc3dpdGNoRGV2aWNlKG1DdXJyZW50RGV2aWNlKTsKLQotICAgICAgICAgICAgbUV4cGxvcmVyU2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtRXhwbG9yZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtRXhwbG9yZXJTaGVsbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2hlbGxEZWFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNoZWxsRGVpY29uaWZpZWQoU2hlbGxFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaGVsbEljb25pZmllZChTaGVsbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtRXhwbG9yZXJTaGVsbC5wYWNrKCk7Ci0gICAgICAgICAgICBzZXRFeHBsb3JlclNpemVBbmRQb3NpdGlvbihtRXhwbG9yZXJTaGVsbCk7Ci0gICAgICAgICAgICBtRXhwbG9yZXJTaGVsbC5vcGVuKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUV4cGxvcmVyU2hlbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FeHBsb3JlclNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN0YXR1cyBsaW5lLiBUT0RPOiBtYWtlIHRoaXMgYSBzdGFjaywgc28gd2UgY2FuIHNhZmVseSBoYXZlCi0gICAgICogbXVsdGlwbGUgdGhpbmdzIHRyeWluZyB0byBzZXQgaXQgYWxsIGF0IG9uY2UuIEFsc28gc3BlY2lmeSBhbiBleHBpcmF0aW9uPwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmUoZmluYWwgU3RyaW5nIHN0cikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbURpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvU2V0U3RhdHVzTGluZShzdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gc3d0ZSkgewotICAgICAgICAgICAgaWYgKCFtRGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgc3d0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NldFN0YXR1c0xpbmUoU3RyaW5nIHN0cikgewotICAgICAgICBpZiAobVN0YXR1c0xpbmUuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghbVN0YXR1c0xpbmUuZ2V0VGV4dCgpLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzTGluZS5zZXRUZXh0KHN0cik7Ci0KLSAgICAgICAgICAgIC8vIHRyeSB7IFRocmVhZC5zbGVlcCgxMDApOyB9Ci0gICAgICAgICAgICAvLyBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoZmluYWwgU3RyaW5nIG1zZykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbURpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobURpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSwgIkVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gc3d0ZSkgewotICAgICAgICAgICAgaWYgKCFtRGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgc3d0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmFibGVCdXR0b25zKCkgewotICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRCU2hvd1RocmVhZFVwZGF0ZXMuc2V0U2VsZWN0aW9uKG1DdXJyZW50Q2xpZW50LmlzVGhyZWFkVXBkYXRlRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIG1UQlNob3dUaHJlYWRVcGRhdGVzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtVEJTaG93SGVhcFVwZGF0ZXMuc2V0U2VsZWN0aW9uKG1DdXJyZW50Q2xpZW50LmlzSGVhcFVwZGF0ZUVuYWJsZWQoKSk7Ci0gICAgICAgICAgICBtVEJTaG93SGVhcFVwZGF0ZXMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1UQkhhbHQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1UQkNhdXNlR2Muc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgQ2xpZW50RGF0YSBkYXRhID0gbUN1cnJlbnRDbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotCi0gICAgICAgICAgICBpZiAoZGF0YS5oYXNGZWF0dXJlKENsaWVudERhdGEuRkVBVFVSRV9IUFJPRikpIHsKLSAgICAgICAgICAgICAgICBtVEJEdW1wSHByb2Yuc2V0RW5hYmxlZChkYXRhLmhhc1BlbmRpbmdIcHJvZkR1bXAoKSA9PSBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVRCRHVtcEhwcm9mLnNldFRvb2xUaXBUZXh0KCJEdW1wIEhQUk9GIGZpbGUiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRCRHVtcEhwcm9mLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1UQkR1bXBIcHJvZi5zZXRUb29sVGlwVGV4dCgiRHVtcCBIUFJPRiBmaWxlIChub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVk0pIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkYXRhLmhhc0ZlYXR1cmUoQ2xpZW50RGF0YS5GRUFUVVJFX1BST0ZJTElORykpIHsKLSAgICAgICAgICAgICAgICBtVEJQcm9maWxpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YS5nZXRNZXRob2RQcm9maWxpbmdTdGF0dXMoKSA9PSBNZXRob2RQcm9maWxpbmdTdGF0dXMuT04pIHsKLSAgICAgICAgICAgICAgICAgICAgbVRCUHJvZmlsaW5nLnNldFRvb2xUaXBUZXh0KCJTdG9wIE1ldGhvZCBQcm9maWxpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgbVRCUHJvZmlsaW5nLnNldEltYWdlKG1UcmFjaW5nU3RvcEltYWdlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtVEJQcm9maWxpbmcuc2V0VG9vbFRpcFRleHQoIlN0YXJ0IE1ldGhvZCBQcm9maWxpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgbVRCUHJvZmlsaW5nLnNldEltYWdlKG1UcmFjaW5nU3RhcnRJbWFnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVEJQcm9maWxpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVRCUHJvZmlsaW5nLnNldEltYWdlKG1UcmFjaW5nU3RhcnRJbWFnZSk7Ci0gICAgICAgICAgICAgICAgbVRCUHJvZmlsaW5nLnNldFRvb2xUaXBUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIChub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVk0pIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBsaXN0IGlzIGVtcHR5LCBkaXNhYmxlIHRoZXNlCi0gICAgICAgICAgICBtVEJTaG93VGhyZWFkVXBkYXRlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgbVRCU2hvd1RocmVhZFVwZGF0ZXMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVEJTaG93SGVhcFVwZGF0ZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIG1UQlNob3dIZWFwVXBkYXRlcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1UQkhhbHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVEJDYXVzZUdjLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICBtVEJEdW1wSHByb2Yuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVEJEdW1wSHByb2Yuc2V0VG9vbFRpcFRleHQoIkR1bXAgSFBST0YgZmlsZSIpOwotCi0gICAgICAgICAgICBtVEJQcm9maWxpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVEJQcm9maWxpbmcuc2V0SW1hZ2UobVRyYWNpbmdTdGFydEltYWdlKTsKLSAgICAgICAgICAgIG1UQlByb2ZpbGluZy5zZXRUb29sVGlwVGV4dCgiU3RhcnQgTWV0aG9kIFByb2ZpbGluZyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IHtAbGluayBJRGV2aWNlfSBhbmQge0BsaW5rIENsaWVudH0gYXJlIHNlbGVjdGVkLgotICAgICAqIEBwYXJhbSBzZWxlY3RlZERldmljZSB0aGUgc2VsZWN0ZWQgZGV2aWNlLiBJZiBudWxsLCBubyBkZXZpY2VzIGFyZSBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDbGllbnQgVGhlIHNlbGVjdGVkIGNsaWVudC4gSWYgbnVsbCwgbm8gY2xpZW50cyBhcmUgc2VsZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElVaVNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJRGV2aWNlIHNlbGVjdGVkRGV2aWNlLCBDbGllbnQgc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50RGV2aWNlICE9IHNlbGVjdGVkRGV2aWNlKSB7Ci0gICAgICAgICAgICBtQ3VycmVudERldmljZSA9IHNlbGVjdGVkRGV2aWNlOwotICAgICAgICAgICAgZm9yIChUYWJsZVBhbmVsIHBhbmVsIDogbVBhbmVscykgewotICAgICAgICAgICAgICAgIGlmIChwYW5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhbmVsLmRldmljZVNlbGVjdGVkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1FbXVsYXRvclBhbmVsLmRldmljZVNlbGVjdGVkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIG1Mb2dQYW5lbC5kZXZpY2VTZWxlY3RlZChtQ3VycmVudERldmljZSk7Ci0gICAgICAgICAgICBpZiAobUV2ZW50TG9nUGFuZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FdmVudExvZ1BhbmVsLmRldmljZVNlbGVjdGVkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1FeHBsb3JlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGxvcmVyLnN3aXRjaERldmljZShtQ3VycmVudERldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRCcmlkZ2UoKS5zZXRTZWxlY3RlZENsaWVudChzZWxlY3RlZENsaWVudCk7Ci0gICAgICAgICAgICBtQ3VycmVudENsaWVudCA9IHNlbGVjdGVkQ2xpZW50OwotICAgICAgICAgICAgZm9yIChUYWJsZVBhbmVsIHBhbmVsIDogbVBhbmVscykgewotICAgICAgICAgICAgICAgIGlmIChwYW5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhbmVsLmNsaWVudFNlbGVjdGVkKG1DdXJyZW50Q2xpZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsaWVudENoYW5nZWQoQ2xpZW50IGNsaWVudCwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgaWYgKChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9NRVRIT0RfUFJPRklMSU5HX1NUQVRVUykgPT0KLSAgICAgICAgICAgICAgICBDbGllbnQuQ0hBTkdFX01FVEhPRF9QUk9GSUxJTkdfU1RBVFVTKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgPT0gY2xpZW50KSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgcmVmcmVzaCBvZiB0aGUgYnV0dG9uIGVuYWJsZWQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RkbXMtaWNvbi5wbmcgYi90b29scy9kZG1zL2FwcC9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZG1zLWljb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdhODNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvYXBwL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RkbXMtaWNvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2FwcC9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZG1zLWxvZ28ucG5nIGIvdG9vbHMvZGRtcy9hcHAvc3JjL3Jlc291cmNlcy9pbWFnZXMvZGRtcy1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MDhiNC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2FwcC9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZG1zLWxvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL0FuZHJvaWQubWsgYi90b29scy9kZG1zL2xpYnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYzZkMC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1ERE1TTElCU19MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChERE1TTElCU19MT0NBTF9ESVIpL2RkbWxpYi9BbmRyb2lkLm1rCi1pbmNsdWRlICQoRERNU0xJQlNfTE9DQUxfRElSKS9kZG11aWxpYi9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliLy5jbGFzc3BhdGggYi90b29scy9kZG1zL2xpYnMvZGRtbGliLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTAxMTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi8ucHJvamVjdCBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTI1YzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmRkbWxpYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL0FuZHJvaWQubWsgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWJkZDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLURETUxJQl9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChERE1MSUJfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDdmOTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9NT0RVTEUgOj0gZGRtbGliCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0FkYkhlbHBlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0FkYkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThkMzY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9BZGJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMgYW5kIGNvbm5lY3Rpb25zIHRvIGFkYi4KLSAqIDxwLz57QGxpbmsgRGVidWdCcmlkZ2VTZXJ2ZXJ9IGlzIHRoZSBwdWJsaWMgQVBJIHRvIGNvbm5lY3Rpb24gdG8gYWRiLCB3aGlsZSB7QGxpbmsgQWRiSGVscGVyfQotICogZG9lcyB0aGUgbG93IGxldmVsIHN0dWZmLgotICogPHAvPlRoaXMgY3VycmVudGx5IHVzZXMgc3Bpbi13YWl0IG5vbi1ibG9ja2luZyBJL08uIEEgU2VsZWN0b3Igd291bGQgYmUgbW9yZSBlZmZpY2llbnQsCi0gKiBidXQgc2VlbXMgbGlrZSBvdmVya2lsbCBmb3Igd2hhdCB3ZSdyZSBkb2luZyBoZXJlLgotICovCi1maW5hbCBjbGFzcyBBZGJIZWxwZXIgewotCi0gICAgLy8gcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGtPa2F5ID0gMHg1OTQxNGI0Zkw7Ci0gICAgLy8gcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGtGYWlsID0gMHg0YzQ5NDE0Nkw7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFdBSVRfVElNRSA9IDU7IC8vIHNwaW4td2FpdCBzbGVlcCwgaW4gbXMKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGRvIG5vdCBpbnN0YW50aWF0ZSAqLwotICAgIHByaXZhdGUgQWRiSGVscGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3BvbnNlIGZyb20gQURCLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBBZGJSZXNwb25zZSB7Ci0gICAgICAgIHB1YmxpYyBBZGJSZXNwb25zZSgpIHsKLSAgICAgICAgICAgIC8vIGlvU3VjY2VzcyA9IG9rYXkgPSB0aW1lb3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBtZXNzYWdlID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpb1N1Y2Nlc3M7IC8vIHJlYWQgYWxsIGV4cGVjdGVkIGRhdGEsIG5vIHRpbWVvdXRlcwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9rYXk7IC8vIGZpcnN0IDQgYnl0ZXMgaW4gcmVzcG9uc2Ugd2VyZSAiT0tBWSI/Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdGltZW91dDsgLy8gVE9ETzogaW1wbGVtZW50Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOyAvLyBkaWFnbm9zdGljIHN0cmluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbmQgY29ubmVjdCBhIG5ldyBwYXNzLXRocm91Z2ggc29ja2V0LCBmcm9tIHRoZSBob3N0IHRvIGEgcG9ydCBvbgotICAgICAqIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRiU29ja0FkZHIKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2UgdG8gY29ubmVjdCB0by4gQ2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlCi0gICAgICogdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UuCi0gICAgICogQHBhcmFtIGRldmljZVBvcnQgdGhlIHBvcnQgd2UncmUgb3BlbmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0Q2hhbm5lbCBvcGVuKEluZXRTb2NrZXRBZGRyZXNzIGFkYlNvY2tBZGRyLAotICAgICAgICAgICAgRGV2aWNlIGRldmljZSwgaW50IGRldmljZVBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU29ja2V0Q2hhbm5lbCBhZGJDaGFuID0gU29ja2V0Q2hhbm5lbC5vcGVuKGFkYlNvY2tBZGRyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkYkNoYW4uc29ja2V0KCkuc2V0VGNwTm9EZWxheSh0cnVlKTsKLSAgICAgICAgICAgIGFkYkNoYW4uY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgZGV2aWNlIGlzIG5vdCAtMSwgdGhlbiB3ZSBmaXJzdCB0ZWxsIGFkYiB3ZSdyZSBsb29raW5nIHRvCi0gICAgICAgICAgICAvLyB0YWxrIHRvIGEgc3BlY2lmaWMgZGV2aWNlCi0gICAgICAgICAgICBzZXREZXZpY2UoYWRiQ2hhbiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgYnl0ZVtdIHJlcSA9IGNyZWF0ZUFkYkZvcndhcmRSZXF1ZXN0KG51bGwsIGRldmljZVBvcnQpOwotICAgICAgICAgICAgLy8gTG9nLmhleER1bXAocmVxKTsKLQotICAgICAgICAgICAgaWYgKHdyaXRlKGFkYkNoYW4sIHJlcSkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgc3VibWl0dGluZyByZXF1ZXN0IHRvIEFEQiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIEFkYlJlc3BvbnNlIHJlc3AgPSByZWFkQWRiUmVzcG9uc2UoYWRiQ2hhbiwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKCFyZXNwLm9rYXkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJjb25uZWN0aW9uIHJlcXVlc3QgcmVqZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBhZGJDaGFuLmNvbmZpZ3VyZUJsb2NraW5nKHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGJDaGFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIGNvbm5lY3RzIGEgbmV3IHBhc3MtdGhyb3VnaCBzb2NrZXQsIGZyb20gdGhlIGhvc3QgdG8gYSBwb3J0IG9uCi0gICAgICogdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGJTb2NrQWRkcgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB0byBjb25uZWN0IHRvLiBDYW4gYmUgbnVsbCBpbiB3aGljaCBjYXNlIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUKLSAgICAgKiB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcGlkIHRoZSBwcm9jZXNzIHBpZCB0byBjb25uZWN0IHRvLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0Q2hhbm5lbCBjcmVhdGVQYXNzVGhyb3VnaENvbm5lY3Rpb24oSW5ldFNvY2tldEFkZHJlc3MgYWRiU29ja0FkZHIsCi0gICAgICAgICAgICBEZXZpY2UgZGV2aWNlLCBpbnQgcGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFNvY2tldENoYW5uZWwgYWRiQ2hhbiA9IFNvY2tldENoYW5uZWwub3BlbihhZGJTb2NrQWRkcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGJDaGFuLnNvY2tldCgpLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0gICAgICAgICAgICBhZGJDaGFuLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIGRldmljZSBpcyBub3QgLTEsIHRoZW4gd2UgZmlyc3QgdGVsbCBhZGIgd2UncmUgbG9va2luZyB0bwotICAgICAgICAgICAgLy8gdGFsayB0byBhIHNwZWNpZmljIGRldmljZQotICAgICAgICAgICAgc2V0RGV2aWNlKGFkYkNoYW4sIGRldmljZSk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSByZXEgPSBjcmVhdGVKZHdwRm9yd2FyZFJlcXVlc3QocGlkKTsKLSAgICAgICAgICAgIC8vIExvZy5oZXhEdW1wKHJlcSk7Ci0KLSAgICAgICAgICAgIGlmICh3cml0ZShhZGJDaGFuLCByZXEpID09IGZhbHNlKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHN1Ym1pdHRpbmcgcmVxdWVzdCB0byBBREIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBBZGJSZXNwb25zZSByZXNwID0gcmVhZEFkYlJlc3BvbnNlKGFkYkNoYW4sIGZhbHNlIC8qIHJlYWREaWFnU3RyaW5nICovKTsKLSAgICAgICAgICAgIGlmICghcmVzcC5va2F5KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiY29ubmVjdGlvbiByZXF1ZXN0IHJlamVjdGVkOiAiICsgcmVzcC5tZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBhZGJDaGFuLmNvbmZpZ3VyZUJsb2NraW5nKHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGJDaGFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwb3J0IGZvcndhcmRpbmcgcmVxdWVzdCBmb3IgYWRiLiBUaGlzIHJldHVybnMgYW4gYXJyYXkKLSAgICAgKiBjb250YWluaW5nICIjIyMjdGNwOntwb3J0fTp7YWRkU3RyfSIuCi0gICAgICogQHBhcmFtIGFkZHJTdHIgdGhlIGhvc3QuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IG9uIHRoZSBkZXZpY2UuIFRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBudW1lcmljLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBjcmVhdGVBZGJGb3J3YXJkUmVxdWVzdChTdHJpbmcgYWRkclN0ciwgaW50IHBvcnQpIHsKLSAgICAgICAgU3RyaW5nIHJlcVN0cjsKLQotICAgICAgICBpZiAoYWRkclN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmVxU3RyID0gInRjcDoiICsgcG9ydDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVxU3RyID0gInRjcDoiICsgcG9ydCArICI6IiArIGFkZHJTdHI7Ci0gICAgICAgIHJldHVybiBmb3JtQWRiUmVxdWVzdChyZXFTdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwb3J0IGZvcndhcmRpbmcgcmVxdWVzdCB0byBhIGpkd3AgcHJvY2Vzcy4gVGhpcyByZXR1cm5zIGFuIGFycmF5Ci0gICAgICogY29udGFpbmluZyAiIyMjI2p3ZHA6e3BpZH0iLgotICAgICAqIEBwYXJhbSBwaWQgdGhlIGpkd3AgcHJvY2VzcyBwaWQgb24gdGhlIGRldmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gY3JlYXRlSmR3cEZvcndhcmRSZXF1ZXN0KGludCBwaWQpIHsKLSAgICAgICAgU3RyaW5nIHJlcVN0ciA9IFN0cmluZy5mb3JtYXQoImpkd3A6JTEkZCIsIHBpZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZvcm1BZGJSZXF1ZXN0KHJlcVN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEFTQ0lJIHN0cmluZyBwcmVjZWVkZWQgYnkgZm91ciBoZXggZGlnaXRzLiBUaGUgb3BlbmluZyAiIyMjIyIKLSAgICAgKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcsIGVuY29kZWQgYXMgQVNDSUkgaGV4IChjYXNlCi0gICAgICogZG9lc24ndCBtYXR0ZXIpLiAicG9ydCIgYW5kICJob3N0IiBhcmUgd2hhdCB3ZSB3YW50IHRvIGZvcndhcmQgdG8uIElmCi0gICAgICogd2UncmUgb24gdGhlIGhvc3Qgc2lkZSBjb25uZWN0aW5nIGludG8gdGhlIGRldmljZSwgImFkZHJTdHIiIHNob3VsZCBiZQotICAgICAqIG51bGwuCi0gICAgICovCi0gICAgc3RhdGljIGJ5dGVbXSBmb3JtQWRiUmVxdWVzdChTdHJpbmcgcmVxKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHRTdHIgPSBTdHJpbmcuZm9ybWF0KCIlMDRYJXMiLCByZXEubGVuZ3RoKCksIHJlcSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnl0ZVtdIHJlc3VsdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFN0ci5nZXRCeXRlcyhERUZBVUxUX0VOQ09ESU5HKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKLSAgICAgICAgICAgIHVlZS5wcmludFN0YWNrVHJhY2UoKTsgLy8gbm90IGV4cGVjdGVkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgcmVzdWx0Lmxlbmd0aCA9PSByZXEubGVuZ3RoKCkgKyA0OwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSByZXNwb25zZSBmcm9tIEFEQiBhZnRlciBhIGNvbW1hbmQuCi0gICAgICogQHBhcmFtIGNoYW4gVGhlIHNvY2tldCBjaGFubmVsIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFkYi4KLSAgICAgKiBAcGFyYW0gcmVhZERpYWdTdHJpbmcgSWYgdHJ1ZSwgd2UncmUgZXhwZWN0aW5nIGFuIE9LQVkgcmVzcG9uc2UgdG8gYmUKLSAgICAgKiAgICAgIGZvbGxvd2VkIGJ5IGEgZGlhZ25vc3RpYyBzdHJpbmcuIE90aGVyd2lzZSwgd2Ugb25seSBleHBlY3QgdGhlCi0gICAgICogICAgICBkaWFnbm9zdGljIHN0cmluZyB0byBmb2xsb3cgYSBGQUlMLgotICAgICAqLwotICAgIHN0YXRpYyBBZGJSZXNwb25zZSByZWFkQWRiUmVzcG9uc2UoU29ja2V0Q2hhbm5lbCBjaGFuLCBib29sZWFuIHJlYWREaWFnU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBBZGJSZXNwb25zZSByZXNwID0gbmV3IEFkYlJlc3BvbnNlKCk7Ci0KLSAgICAgICAgYnl0ZVtdIHJlcGx5ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgIGlmIChyZWFkKGNoYW4sIHJlcGx5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzcC5pb1N1Y2Nlc3MgPSB0cnVlOwotCi0gICAgICAgIGlmIChpc09rYXkocmVwbHkpKSB7Ci0gICAgICAgICAgICByZXNwLm9rYXkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZERpYWdTdHJpbmcgPSB0cnVlOyAvLyBsb29rIGZvciBhIHJlYXNvbiBhZnRlciB0aGUgRkFJTAotICAgICAgICAgICAgcmVzcC5va2F5ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3QgYSBsb29wIC0tIHVzZSAid2hpbGUiIHNvIHdlIGNhbiB1c2UgImJyZWFrIgotICAgICAgICB3aGlsZSAocmVhZERpYWdTdHJpbmcpIHsKLSAgICAgICAgICAgIC8vIGxlbmd0aCBzdHJpbmcgaXMgaW4gbmV4dCA0IGJ5dGVzCi0gICAgICAgICAgICBieXRlW10gbGVuQnVmID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICBpZiAocmVhZChjaGFuLCBsZW5CdWYpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiRXhwZWN0ZWQgZGlhZ25vc3RpYyBzdHJpbmcgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsZW5TdHIgPSByZXBseVRvU3RyaW5nKGxlbkJ1Zik7Ci0KLSAgICAgICAgICAgIGludCBsZW47Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxlbiA9IEludGVnZXIucGFyc2VJbnQobGVuU3RyLCAxNik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiRXhwZWN0ZWQgZGlnaXRzLCBnb3QgJyIgKyBsZW5TdHIgKyAiJzogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsZW5CdWZbMF0gKyAiICIgKyBsZW5CdWZbMV0gKyAiICIgKyBsZW5CdWZbMl0gKyAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuQnVmWzNdKTsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJyZXBseSB3YXMgIiArIHJlcGx5VG9TdHJpbmcocmVwbHkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZVtdIG1zZyA9IG5ldyBieXRlW2xlbl07Ci0gICAgICAgICAgICBpZiAocmVhZChjaGFuLCBtc2cpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiRmFpbGVkIHJlYWRpbmcgZGlhZ25vc3RpYyBzdHJpbmcsIGxlbj0iICsgbGVuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcC5tZXNzYWdlID0gcmVwbHlUb1N0cmluZyhtc2cpOwotICAgICAgICAgICAgTG9nLnYoImRkbXMiLCAiR290IHJlcGx5ICciICsgcmVwbHlUb1N0cmluZyhyZXBseSkgKyAiJywgZGlhZz0nIgotICAgICAgICAgICAgICAgICAgICArIHJlc3AubWVzc2FnZSArICInIik7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGZyYW1lIGJ1ZmZlciBmcm9tIHRoZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSYXdJbWFnZSBnZXRGcmFtZUJ1ZmZlcihJbmV0U29ja2V0QWRkcmVzcyBhZGJTb2NrQWRkciwgRGV2aWNlIGRldmljZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmF3SW1hZ2UgaW1hZ2VQYXJhbXMgPSBuZXcgUmF3SW1hZ2UoKTsKLSAgICAgICAgYnl0ZVtdIHJlcXVlc3QgPSBmb3JtQWRiUmVxdWVzdCgiZnJhbWVidWZmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnl0ZVtdIG51ZGdlID0gewotICAgICAgICAgICAgMAotICAgICAgICB9OwotICAgICAgICBieXRlW10gcmVwbHk7Ci0KLSAgICAgICAgU29ja2V0Q2hhbm5lbCBhZGJDaGFuID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkYkNoYW4gPSBTb2NrZXRDaGFubmVsLm9wZW4oYWRiU29ja0FkZHIpOwotICAgICAgICAgICAgYWRiQ2hhbi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgbm90IC0xLCB0aGVuIHdlIGZpcnN0IHRlbGwgYWRiIHdlJ3JlIGxvb2tpbmcgdG8gdGFsawotICAgICAgICAgICAgLy8gdG8gYSBzcGVjaWZpYyBkZXZpY2UKLSAgICAgICAgICAgIHNldERldmljZShhZGJDaGFuLCBkZXZpY2UpOwotCi0gICAgICAgICAgICBpZiAod3JpdGUoYWRiQ2hhbiwgcmVxdWVzdCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgYXNraW5nIGZvciBmcmFtZSBidWZmZXIiKTsKLQotICAgICAgICAgICAgQWRiUmVzcG9uc2UgcmVzcCA9IHJlYWRBZGJSZXNwb25zZShhZGJDaGFuLCBmYWxzZSAvKiByZWFkRGlhZ1N0cmluZyAqLyk7Ci0gICAgICAgICAgICBpZiAoIXJlc3AuaW9TdWNjZXNzIHx8ICFyZXNwLm9rYXkpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJHb3QgdGltZW91dCBvciB1bmhhcHB5IHJlc3BvbnNlIGZyb20gQURCIGZiIHJlcTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNwLm1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmlyc3QgdGhlIHByb3RvY29sIHZlcnNpb24uCi0gICAgICAgICAgICByZXBseSA9IG5ldyBieXRlWzRdOwotICAgICAgICAgICAgaWYgKHJlYWQoYWRiQ2hhbiwgcmVwbHkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiZ290IHBhcnRpYWwgcmVwbHkgZnJvbSBBREIgZmI6Iik7Ci0gICAgICAgICAgICAgICAgTG9nLmhleER1bXAoImRkbXMiLCBMb2dMZXZlbC5XQVJOLCByZXBseSwgMCwgcmVwbHkubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBhZGJDaGFuLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChyZXBseSk7Ci0gICAgICAgICAgICBidWYub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwotCi0gICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGJ1Zi5nZXRJbnQoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBoZWFkZXIgc2l6ZSAodGhpcyBpcyBhIGNvdW50IG9mIGludCkKLSAgICAgICAgICAgIGludCBoZWFkZXJTaXplID0gUmF3SW1hZ2UuZ2V0SGVhZGVyU2l6ZSh2ZXJzaW9uKTsKLQotICAgICAgICAgICAgLy8gcmVhZCB0aGUgaGVhZGVyCi0gICAgICAgICAgICByZXBseSA9IG5ldyBieXRlW2hlYWRlclNpemUgKiA0XTsKLSAgICAgICAgICAgIGlmIChyZWFkKGFkYkNoYW4sIHJlcGx5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIExvZy53KCJkZG1zIiwgImdvdCBwYXJ0aWFsIHJlcGx5IGZyb20gQURCIGZiOiIpOwotICAgICAgICAgICAgICAgIExvZy5oZXhEdW1wKCJkZG1zIiwgTG9nTGV2ZWwuV0FSTiwgcmVwbHksIDAsIHJlcGx5Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYWRiQ2hhbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKHJlcGx5KTsKLSAgICAgICAgICAgIGJ1Zi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7Ci0KLSAgICAgICAgICAgIC8vIGZpbGwgdGhlIFJhd0ltYWdlIHdpdGggdGhlIGhlYWRlcgotICAgICAgICAgICAgaWYgKGltYWdlUGFyYW1zLnJlYWRIZWFkZXIodmVyc2lvbiwgYnVmKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIExvZy5lKCJTY3JlZW5zaG90IiwgIlVuc3VwcG9ydGVkIHByb3RvY29sOiAiICsgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgImltYWdlIHBhcmFtczogYnBwPSIgKyBpbWFnZVBhcmFtcy5icHAgKyAiLCBzaXplPSIKLSAgICAgICAgICAgICAgICAgICAgKyBpbWFnZVBhcmFtcy5zaXplICsgIiwgd2lkdGg9IiArIGltYWdlUGFyYW1zLndpZHRoCi0gICAgICAgICAgICAgICAgICAgICsgIiwgaGVpZ2h0PSIgKyBpbWFnZVBhcmFtcy5oZWlnaHQpOwotCi0gICAgICAgICAgICBpZiAod3JpdGUoYWRiQ2hhbiwgbnVkZ2UpID09IGZhbHNlKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIG51ZGdpbmciKTsKLQotICAgICAgICAgICAgcmVwbHkgPSBuZXcgYnl0ZVtpbWFnZVBhcmFtcy5zaXplXTsKLSAgICAgICAgICAgIGlmIChyZWFkKGFkYkNoYW4sIHJlcGx5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIExvZy53KCJkZG1zIiwgImdvdCB0cnVuY2F0ZWQgcmVwbHkgZnJvbSBBREIgZmIgZGF0YSIpOwotICAgICAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW1hZ2VQYXJhbXMuZGF0YSA9IHJlcGx5OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGFkYkNoYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbWFnZVBhcmFtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgY29tbWFuZCBvbiB0aGUgZGV2aWNlIGFuZCByZXRyaWV2ZSB0aGUgb3V0cHV0LiBUaGUgb3V0cHV0IGlzCi0gICAgICogaGFuZGVkIHRvICJyY3ZyIiBhcyBpdCBhcnJpdmVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlUmVtb3RlQ29tbWFuZChJbmV0U29ja2V0QWRkcmVzcyBhZGJTb2NrQWRkciwKLSAgICAgICAgICAgIFN0cmluZyBjb21tYW5kLCBEZXZpY2UgZGV2aWNlLCBJU2hlbGxPdXRwdXRSZWNlaXZlciByY3ZyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLnYoImRkbXMiLCAiZXhlY3V0ZTogcnVubmluZyAiICsgY29tbWFuZCk7Ci0KLSAgICAgICAgU29ja2V0Q2hhbm5lbCBhZGJDaGFuID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkYkNoYW4gPSBTb2NrZXRDaGFubmVsLm9wZW4oYWRiU29ja0FkZHIpOwotICAgICAgICAgICAgYWRiQ2hhbi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgbm90IC0xLCB0aGVuIHdlIGZpcnN0IHRlbGwgYWRiIHdlJ3JlIGxvb2tpbmcgdG8KLSAgICAgICAgICAgIC8vIHRhbGsKLSAgICAgICAgICAgIC8vIHRvIGEgc3BlY2lmaWMgZGV2aWNlCi0gICAgICAgICAgICBzZXREZXZpY2UoYWRiQ2hhbiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgYnl0ZVtdIHJlcXVlc3QgPSBmb3JtQWRiUmVxdWVzdCgic2hlbGw6IiArIGNvbW1hbmQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAod3JpdGUoYWRiQ2hhbiwgcmVxdWVzdCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgc3VibWl0dGluZyBzaGVsbCBjb21tYW5kIik7Ci0KLSAgICAgICAgICAgIEFkYlJlc3BvbnNlIHJlc3AgPSByZWFkQWRiUmVzcG9uc2UoYWRiQ2hhbiwgZmFsc2UgLyogcmVhZERpYWdTdHJpbmcgKi8pOwotICAgICAgICAgICAgaWYgKCFyZXNwLmlvU3VjY2VzcyB8fCAhcmVzcC5va2F5KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLCAiQURCIHJlamVjdGVkIHNoZWxsIGNvbW1hbmQgKCIgKyBjb21tYW5kICsgIik6ICIgKyByZXNwLm1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic2FkIHJlc3VsdCBmcm9tIGFkYjogIiArIHJlc3AubWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMTYzODRdOwotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBjb3VudDsKLQotICAgICAgICAgICAgICAgIGlmIChyY3ZyICE9IG51bGwgJiYgcmN2ci5pc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KCJkZG1zIiwgImV4ZWN1dGU6IGNhbmNlbGxlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb3VudCA9IGFkYkNoYW4ucmVhZChidWYpOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYXQgdGhlIGVuZCwgd2UgZmx1c2ggdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICByY3ZyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KCJkZG1zIiwgImV4ZWN1dGUgJyIgKyBjb21tYW5kICsgIicgb24gJyIgKyBkZXZpY2UgKyAiJyA6IEVPRiBoaXQuIFJlYWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FICogNSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocmN2ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByY3ZyLmFkZE91dHB1dChidWYuYXJyYXkoKSwgYnVmLmFycmF5T2Zmc2V0KCksIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWYucmV3aW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGFkYkNoYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkYkNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy52KCJkZG1zIiwgImV4ZWN1dGU6IHJldHVybmluZyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgRXZlbnQgbG9nIHNlcnZpY2Ugb24gdGhlIHtAbGluayBEZXZpY2V9LCBhbmQgcHJvdmlkZXMgaXRzIG91dHB1dCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTG9nUmVjZWl2ZXJ9LgotICAgICAqIEBwYXJhbSBhZGJTb2NrQWRkciB0aGUgc29ja2V0IGFkZHJlc3MgdG8gY29ubmVjdCB0byBhZGIKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBEZXZpY2Ugb24gd2hpY2ggdG8gcnVuIHRoZSBzZXJ2aWNlCi0gICAgICogQHBhcmFtIHJjdnIgdGhlIHtAbGluayBMb2dSZWNlaXZlcn0gdG8gcmVjZWl2ZSB0aGUgbG9nIG91dHB1dAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRMb2dTZXJ2aWNlKEluZXRTb2NrZXRBZGRyZXNzIGFkYlNvY2tBZGRyLCBEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgTG9nUmVjZWl2ZXIgcmN2cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuTG9nU2VydmljZShhZGJTb2NrQWRkciwgZGV2aWNlLCAiZXZlbnRzIiwgcmN2cik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGEgbG9nIHNlcnZpY2Ugb24gdGhlIHtAbGluayBEZXZpY2V9LCBhbmQgcHJvdmlkZXMgaXRzIG91dHB1dCB0byB0aGUge0BsaW5rIExvZ1JlY2VpdmVyfS4KLSAgICAgKiBAcGFyYW0gYWRiU29ja0FkZHIgdGhlIHNvY2tldCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gYWRiCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgRGV2aWNlIG9uIHdoaWNoIHRvIHJ1biB0aGUgc2VydmljZQotICAgICAqIEBwYXJhbSBsb2dOYW1lIHRoZSBuYW1lIG9mIHRoZSBsb2cgZmlsZSB0byBvdXRwdXQKLSAgICAgKiBAcGFyYW0gcmN2ciB0aGUge0BsaW5rIExvZ1JlY2VpdmVyfSB0byByZWNlaXZlIHRoZSBsb2cgb3V0cHV0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5Mb2dTZXJ2aWNlKEluZXRTb2NrZXRBZGRyZXNzIGFkYlNvY2tBZGRyLCBEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbG9nTmFtZSwKLSAgICAgICAgICAgIExvZ1JlY2VpdmVyIHJjdnIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvY2tldENoYW5uZWwgYWRiQ2hhbiA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkYkNoYW4gPSBTb2NrZXRDaGFubmVsLm9wZW4oYWRiU29ja0FkZHIpOwotICAgICAgICAgICAgYWRiQ2hhbi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgbm90IC0xLCB0aGVuIHdlIGZpcnN0IHRlbGwgYWRiIHdlJ3JlIGxvb2tpbmcgdG8gdGFsawotICAgICAgICAgICAgLy8gdG8gYSBzcGVjaWZpYyBkZXZpY2UKLSAgICAgICAgICAgIHNldERldmljZShhZGJDaGFuLCBkZXZpY2UpOwotCi0gICAgICAgICAgICBieXRlW10gcmVxdWVzdCA9IGZvcm1BZGJSZXF1ZXN0KCJsb2c6IiArIGxvZ05hbWUpOwotICAgICAgICAgICAgaWYgKHdyaXRlKGFkYkNoYW4sIHJlcXVlc3QpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gc3VibWl0IHRoZSBsb2cgY29tbWFuZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBZGJSZXNwb25zZSByZXNwID0gcmVhZEFkYlJlc3BvbnNlKGFkYkNoYW4sIGZhbHNlIC8qIHJlYWREaWFnU3RyaW5nICovKTsKLSAgICAgICAgICAgIGlmICghcmVzcC5pb1N1Y2Nlc3MgfHwgIXJlc3Aub2theSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGV2aWNlIHJlamVjdGVkIGxvZyBjb21tYW5kOiAiICsgcmVzcC5tZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVsxNjM4NF07Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChkYXRhKTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50OwotCi0gICAgICAgICAgICAgICAgaWYgKHJjdnIgIT0gbnVsbCAmJiByY3ZyLmlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY291bnQgPSBhZGJDaGFuLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRSAqIDUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjdnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmN2ci5wYXJzZU5ld0RhdGEoYnVmLmFycmF5KCksIGJ1Zi5hcnJheU9mZnNldCgpLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmLnJld2luZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChhZGJDaGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGJDaGFuLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcG9ydCBmb3J3YXJkaW5nIGJldHdlZW4gYSBsb2NhbCBhbmQgYSByZW1vdGUgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRiU29ja0FkZHIgdGhlIHNvY2tldCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gYWRiCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGRvIHRoZSBwb3J0IGZvd2FyZGluZwotICAgICAqIEBwYXJhbSBsb2NhbFBvcnQgdGhlIGxvY2FsIHBvcnQgdG8gZm9yd2FyZAotICAgICAqIEBwYXJhbSByZW1vdGVQb3J0IHRoZSByZW1vdGUgcG9ydC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3MuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjcmVhdGVGb3J3YXJkKEluZXRTb2NrZXRBZGRyZXNzIGFkYlNvY2tBZGRyLCBEZXZpY2UgZGV2aWNlLCBpbnQgbG9jYWxQb3J0LAotICAgICAgICAgICAgaW50IHJlbW90ZVBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU29ja2V0Q2hhbm5lbCBhZGJDaGFuID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkYkNoYW4gPSBTb2NrZXRDaGFubmVsLm9wZW4oYWRiU29ja0FkZHIpOwotICAgICAgICAgICAgYWRiQ2hhbi5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSByZXF1ZXN0ID0gZm9ybUFkYlJlcXVlc3QoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgImhvc3Qtc2VyaWFsOiUxJHM6Zm9yd2FyZDp0Y3A6JTIkZDt0Y3A6JTMkZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpLCBsb2NhbFBvcnQsIHJlbW90ZVBvcnQpKTsKLQotICAgICAgICAgICAgaWYgKHdyaXRlKGFkYkNoYW4sIHJlcXVlc3QpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gc3VibWl0IHRoZSBmb3J3YXJkIGNvbW1hbmQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFkYlJlc3BvbnNlIHJlc3AgPSByZWFkQWRiUmVzcG9uc2UoYWRiQ2hhbiwgZmFsc2UgLyogcmVhZERpYWdTdHJpbmcgKi8pOwotICAgICAgICAgICAgaWYgKCFyZXNwLmlvU3VjY2VzcyB8fCAhcmVzcC5va2F5KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEZXZpY2UgcmVqZWN0ZWQgY29tbWFuZDogIiArIHJlc3AubWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYWRiQ2hhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRiQ2hhbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgcG9ydCBmb3J3YXJkaW5nIGJldHdlZW4gYSBsb2NhbCBhbmQgYSByZW1vdGUgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRiU29ja0FkZHIgdGhlIHNvY2tldCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gYWRiCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgcG9ydCBmb3dhcmRpbmcKLSAgICAgKiBAcGFyYW0gbG9jYWxQb3J0IHRoZSBsb2NhbCBwb3J0IG9mIHRoZSBmb3J3YXJkCi0gICAgICogQHBhcmFtIHJlbW90ZVBvcnQgdGhlIHJlbW90ZSBwb3J0LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzcy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZvcndhcmQoSW5ldFNvY2tldEFkZHJlc3MgYWRiU29ja0FkZHIsIERldmljZSBkZXZpY2UsIGludCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBTb2NrZXRDaGFubmVsIGFkYkNoYW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRiQ2hhbiA9IFNvY2tldENoYW5uZWwub3BlbihhZGJTb2NrQWRkcik7Ci0gICAgICAgICAgICBhZGJDaGFuLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKLQotICAgICAgICAgICAgYnl0ZVtdIHJlcXVlc3QgPSBmb3JtQWRiUmVxdWVzdChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiaG9zdC1zZXJpYWw6JTEkczpraWxsZm9yd2FyZDp0Y3A6JTIkZDt0Y3A6JTMkZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpLCBsb2NhbFBvcnQsIHJlbW90ZVBvcnQpKTsKLQotICAgICAgICAgICAgaWYgKCF3cml0ZShhZGJDaGFuLCByZXF1ZXN0KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIHN1Ym1pdCB0aGUgcmVtb3ZlIGZvcndhcmQgY29tbWFuZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWRiUmVzcG9uc2UgcmVzcCA9IHJlYWRBZGJSZXNwb25zZShhZGJDaGFuLCBmYWxzZSAvKiByZWFkRGlhZ1N0cmluZyAqLyk7Ci0gICAgICAgICAgICBpZiAoIXJlc3AuaW9TdWNjZXNzIHx8ICFyZXNwLm9rYXkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRldmljZSByZWplY3RlZCBjb21tYW5kOiAiICsgcmVzcC5tZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChhZGJDaGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGJDaGFuLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIGluICJyZXBseSIgYXJlIE9LQVkuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNPa2F5KGJ5dGVbXSByZXBseSkgewotICAgICAgICByZXR1cm4gcmVwbHlbMF0gPT0gKGJ5dGUpJ08nICYmIHJlcGx5WzFdID09IChieXRlKSdLJwotICAgICAgICAgICAgICAgICYmIHJlcGx5WzJdID09IChieXRlKSdBJyAmJiByZXBseVszXSA9PSAoYnl0ZSknWSc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gQURCIHJlcGx5IHRvIGEgc3RyaW5nLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgcmVwbHlUb1N0cmluZyhieXRlW10gcmVwbHkpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmcocmVwbHksIERFRkFVTFRfRU5DT0RJTkcpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgewotICAgICAgICAgICAgdWVlLnByaW50U3RhY2tUcmFjZSgpOyAvLyBub3QgZXhwZWN0ZWQKLSAgICAgICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgZnJvbSB0aGUgc29ja2V0IHVudGlsIHRoZSBhcnJheSBpcyBmaWxsZWQsIG9yIG5vIG1vcmUgZGF0YSBpcyBjb21pbmcgKGJlY2F1c2UKLSAgICAgKiB0aGUgc29ja2V0IGNsb3NlZCBvciB0aGUgdGltZW91dCBleHBpcmVkKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFuIHRoZSBvcGVuZWQgc29ja2V0IHRvIHJlYWQgZnJvbS4gSXQgbXVzdCBiZSBpbiBub24tYmxvY2tpbmcKLSAgICAgKiAgICAgIG1vZGUgZm9yIHRpbWVvdXRzIHRvIHdvcmsKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEgaW50by4KLSAgICAgKiBAcmV0dXJuICJ0cnVlIiBpZiBhbGwgZGF0YSB3YXMgcmVhZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gcmVhZChTb2NrZXRDaGFubmVsIGNoYW4sIGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgcmVhZChjaGFuLCBkYXRhLCAtMSwgRGRtUHJlZmVyZW5jZXMuZ2V0VGltZU91dCgpKTsKLSAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIExvZy5kKCJkZG1zIiwgInJlYWRBbGw6IElPRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgfQotCi0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgZnJvbSB0aGUgc29ja2V0IHVudGlsIHRoZSBhcnJheSBpcyBmaWxsZWQsIHRoZSBvcHRpb25hbCBsZW5ndGgKLSAgICAgKiBpcyByZWFjaGVkLCBvciBubyBtb3JlIGRhdGEgaXMgY29taW5nIChiZWNhdXNlIHRoZSBzb2NrZXQgY2xvc2VkIG9yIHRoZQotICAgICAqIHRpbWVvdXQgZXhwaXJlZCkuIEFmdGVyICJ0aW1lb3V0IiBtaWxsaXNlY29uZHMgc2luY2UgdGhlCi0gICAgICogcHJldmlvdXMgc3VjY2Vzc2Z1bCByZWFkLCB0aGlzIHdpbGwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IG5ldyBkYXRhIGhhcwotICAgICAqIGJlZW4gZm91bmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hhbiB0aGUgb3BlbmVkIHNvY2tldCB0byByZWFkIGZyb20uIEl0IG11c3QgYmUgaW4gbm9uLWJsb2NraW5nCi0gICAgICogICAgICBtb2RlIGZvciB0aW1lb3V0cyB0byB3b3JrCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVhZCBkYXRhIGludG8uCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIHRvIHJlYWQgb3IgLTEgdG8gZmlsbCB0aGUgZGF0YSBidWZmZXIgY29tcGxldGVseQotICAgICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IHZhbHVlLiBBIHRpbWVvdXQgb2YgemVybyBtZWFucyAid2FpdCBmb3JldmVyIi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgcmVhZChTb2NrZXRDaGFubmVsIGNoYW4sIGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSwgMCwgbGVuZ3RoICE9IC0xID8gbGVuZ3RoIDogZGF0YS5sZW5ndGgpOwotICAgICAgICBpbnQgbnVtV2FpdHMgPSAwOwotCi0gICAgICAgIHdoaWxlIChidWYucG9zaXRpb24oKSAhPSBidWYubGltaXQoKSkgewotICAgICAgICAgICAgaW50IGNvdW50OwotCi0gICAgICAgICAgICBjb3VudCA9IGNoYW4ucmVhZChidWYpOwotICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkgewotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgInJlYWQ6IGNoYW5uZWwgRU9GIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFT0YiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWQgbW9yZSBhY2N1cmF0ZSB0aW1lb3V0PwotICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9IDAgJiYgbnVtV2FpdHMgKiBXQUlUX1RJTUUgPiB0aW1lb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgInJlYWQ6IHRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0aW1lb3V0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1ibG9ja2luZyBzcGluCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnVtV2FpdHMrKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbnVtV2FpdHMgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdW50aWwgYWxsIGRhdGEgaW4gImRhdGEiIGlzIHdyaXR0ZW4gb3IgdGhlIGNvbm5lY3Rpb24gZmFpbHMuCi0gICAgICogQHBhcmFtIGNoYW4gdGhlIG9wZW5lZCBzb2NrZXQgdG8gd3JpdGUgdG8uCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGJ1ZmZlciB0byBzZW5kLgotICAgICAqIEByZXR1cm4gInRydWUiIGlmIGFsbCBkYXRhIHdhcyB3cml0dGVuLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIHdyaXRlKFNvY2tldENoYW5uZWwgY2hhbiwgYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlKGNoYW4sIGRhdGEsIC0xLCBEZG1QcmVmZXJlbmNlcy5nZXRUaW1lT3V0KCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiZGRtcyIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdW50aWwgYWxsIGRhdGEgaW4gImRhdGEiIGlzIHdyaXR0ZW4sIHRoZSBvcHRpb25hbCBsZW5ndGggaXMgcmVhY2hlZCwKLSAgICAgKiB0aGUgdGltZW91dCBleHBpcmVzLCBvciB0aGUgY29ubmVjdGlvbiBmYWlscy4gUmV0dXJucyAidHJ1ZSIgaWYgYWxsCi0gICAgICogZGF0YSB3YXMgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gY2hhbiB0aGUgb3BlbmVkIHNvY2tldCB0byB3cml0ZSB0by4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYnVmZmVyIHRvIHNlbmQuCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIHRvIHdyaXRlIG9yIC0xIHRvIHNlbmQgdGhlIHdob2xlIGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZW91dCB2YWx1ZS4gQSB0aW1lb3V0IG9mIHplcm8gbWVhbnMgIndhaXQgZm9yZXZlciIuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHdyaXRlKFNvY2tldENoYW5uZWwgY2hhbiwgYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgsIGludCB0aW1lb3V0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSwgMCwgbGVuZ3RoICE9IC0xID8gbGVuZ3RoIDogZGF0YS5sZW5ndGgpOwotICAgICAgICBpbnQgbnVtV2FpdHMgPSAwOwotCi0gICAgICAgIHdoaWxlIChidWYucG9zaXRpb24oKSAhPSBidWYubGltaXQoKSkgewotICAgICAgICAgICAgaW50IGNvdW50OwotCi0gICAgICAgICAgICBjb3VudCA9IGNoYW4ud3JpdGUoYnVmKTsKLSAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJ3cml0ZTogY2hhbm5lbCBFT0YiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNoYW5uZWwgRU9GIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIG1vcmUgYWNjdXJhdGUgdGltZW91dD8KLSAgICAgICAgICAgICAgICBpZiAodGltZW91dCAhPSAwICYmIG51bVdhaXRzICogV0FJVF9USU1FID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJ3cml0ZTogdGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLWJsb2NraW5nIHNwaW4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBudW1XYWl0cysrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBudW1XYWl0cyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZWxscyBhZGIgdG8gdGFsayB0byBhIHNwZWNpZmljIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGFkYkNoYW4gdGhlIHNvY2tldCBjb25uZWN0aW9uIHRvIGFkYgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0byB0YWxrIHRvLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBzZXREZXZpY2UoU29ja2V0Q2hhbm5lbCBhZGJDaGFuLCBEZXZpY2UgZGV2aWNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaWYgdGhlIGRldmljZSBpcyBub3QgLTEsIHRoZW4gd2UgZmlyc3QgdGVsbCBhZGIgd2UncmUgbG9va2luZyB0byB0YWxrCi0gICAgICAgIC8vIHRvIGEgc3BlY2lmaWMgZGV2aWNlCi0gICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJob3N0OnRyYW5zcG9ydDoiICsgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBieXRlW10gZGV2aWNlX3F1ZXJ5ID0gZm9ybUFkYlJlcXVlc3QobXNnKTsKLQotICAgICAgICAgICAgaWYgKHdyaXRlKGFkYkNoYW4sIGRldmljZV9xdWVyeSkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgc3VibWl0dGluZyBkZXZpY2UgKCIgKyBkZXZpY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikgcmVxdWVzdCB0byBBREIiKTsKLQotICAgICAgICAgICAgQWRiUmVzcG9uc2UgcmVzcCA9IHJlYWRBZGJSZXNwb25zZShhZGJDaGFuLCBmYWxzZSAvKiByZWFkRGlhZ1N0cmluZyAqLyk7Ci0gICAgICAgICAgICBpZiAoIXJlc3Aub2theSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImRldmljZSAoIiArIGRldmljZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSByZXF1ZXN0IHJlamVjdGVkOiAiICsgcmVzcC5tZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0FsbG9jYXRpb25JbmZvLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQWxsb2NhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNGI1MC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQWxsb2NhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotLyoqCi0gKiBIb2xkcyBhbiBBbGxvY2F0aW9uIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkluZm8gaW1wbGVtZW50cyBDb21wYXJhYmxlPEFsbG9jYXRpb25JbmZvPiwgSVN0YWNrVHJhY2VJbmZvIHsKLSAgICBwcml2YXRlIFN0cmluZyBtQWxsb2NhdGVkQ2xhc3M7Ci0gICAgcHJpdmF0ZSBpbnQgbUFsbG9jYXRpb25TaXplOwotICAgIHByaXZhdGUgc2hvcnQgbVRocmVhZElkOwotICAgIHByaXZhdGUgU3RhY2tUcmFjZUVsZW1lbnRbXSBtU3RhY2tUcmFjZTsKLQotICAgIC8qCi0gICAgICogU2ltcGxlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIEFsbG9jYXRpb25JbmZvKFN0cmluZyBhbGxvY2F0ZWRDbGFzcywgaW50IGFsbG9jYXRpb25TaXplLAotICAgICAgICBzaG9ydCB0aHJlYWRJZCwgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlKSB7Ci0gICAgICAgIG1BbGxvY2F0ZWRDbGFzcyA9IGFsbG9jYXRlZENsYXNzOwotICAgICAgICBtQWxsb2NhdGlvblNpemUgPSBhbGxvY2F0aW9uU2l6ZTsKLSAgICAgICAgbVRocmVhZElkID0gdGhyZWFkSWQ7Ci0gICAgICAgIG1TdGFja1RyYWNlID0gc3RhY2tUcmFjZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWxsb2NhdGVkIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsb2NhdGVkQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBtQWxsb2NhdGVkQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtQWxsb2NhdGlvblNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHRocmVhZCB0aGF0IHBlcmZvcm1lZCB0aGUgYWxsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyZWFkSWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGhyZWFkSWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSVN0YWNrVHJhY2VJbmZvI2dldFN0YWNrVHJhY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBTdGFja1RyYWNlRWxlbWVudFtdIGdldFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhY2tUcmFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhBbGxvY2F0aW9uSW5mbyBvdGhlckFsbG9jKSB7Ci0gICAgICAgIHJldHVybiBvdGhlckFsbG9jLm1BbGxvY2F0aW9uU2l6ZSAtIG1BbGxvY2F0aW9uU2l6ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQW5kcm9pZERlYnVnQnJpZGdlLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQW5kcm9pZERlYnVnQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOWRjY2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0FuZHJvaWREZWJ1Z0JyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLlRocmVhZC5TdGF0ZTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBBIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3Qtc2lkZSBhbmRyb2lkIGRlYnVnIGJyaWRnZSAoYWRiKQotICogPHAvPlRoaXMgaXMgdGhlIGNlbnRyYWwgcG9pbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhbnkgZGV2aWNlcywgZW11bGF0b3JzLCBvciB0aGUgYXBwbGljYXRpb25zCi0gKiBydW5uaW5nIG9uIHRoZW0uCi0gKiA8cC8+PGI+e0BsaW5rICNpbml0KGJvb2xlYW4pfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgaXMgZG9uZS48L2I+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmRyb2lkRGVidWdCcmlkZ2UgewotCi0gICAgLyoKLSAgICAgKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZlcnNpb24gb2YgYWRiIHN1cHBvcnRlZC4gVGhpcyBjb3JyZXNwb25kIHRvCi0gICAgICogQURCX1NFUlZFUl9WRVJTSU9OIGZvdW5kIGluIC8vZGV2aWNlL3Rvb2xzL2FkYi9hZGIuaAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFEQl9WRVJTSU9OX01JQ1JPX01JTiA9IDIwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBBREJfVkVSU0lPTl9NSUNST19NQVggPSAtMTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc0FkYlZlcnNpb24gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXi4qKFxcZCspXFwuKFxcZCspXFwuKFxcZCspJCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURCID0gImFkYiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRERNUyA9ICJkZG1zIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gV2hlcmUgdG8gZmluZCB0aGUgQURCIGJyaWRnZS4KLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQl9IT1NUID0gIjEyNy4wLjAuMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBmaW5hbCBzdGF0aWMgaW50IEFEQl9QT1JUID0gNTAzNzsKLQotICAgIHN0YXRpYyBJbmV0QWRkcmVzcyBzSG9zdEFkZHI7Ci0gICAgc3RhdGljIEluZXRTb2NrZXRBZGRyZXNzIHNTb2NrZXRBZGRyOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gYnVpbHQtaW4gbG9jYWwgYWRkcmVzcy9wb3J0IGZvciBBREIuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzSG9zdEFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoQURCX0hPU1QpOwotICAgICAgICAgICAgc1NvY2tldEFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3Moc0hvc3RBZGRyLCBBREJfUE9SVCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5kcm9pZERlYnVnQnJpZGdlIHNUaGlzOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0NsaWVudFN1cHBvcnQ7Ci0KLSAgICAvKiogRnVsbCBwYXRoIHRvIGFkYi4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtQWRiT3NMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcnNpb25DaGVjazsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBEZXZpY2VNb25pdG9yIG1EZXZpY2VNb25pdG9yOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlMaXN0PElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyPiBzQnJpZGdlTGlzdGVuZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUxpc3Q8SURldmljZUNoYW5nZUxpc3RlbmVyPiBzRGV2aWNlTGlzdGVuZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxJRGV2aWNlQ2hhbmdlTGlzdGVuZXI+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXJyYXlMaXN0PElDbGllbnRDaGFuZ2VMaXN0ZW5lcj4gc0NsaWVudExpc3RlbmVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8SUNsaWVudENoYW5nZUxpc3RlbmVyPigpOwotCi0gICAgLy8gbG9jayBvYmplY3QgZm9yIHN5bmNocm9uaXphdGlvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzTG9jayA9IHNCcmlkZ2VMaXN0ZW5lcnM7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBwcm92aWRlIGEgbWV0aG9kIHRoYXQgZGVhbHMKLSAgICAgKiB3aXRoIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0gaXMgY29ubmVjdGVkLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgICAgICogQHBhcmFtIGJyaWRnZSB0aGUgbmV3IHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGJyaWRnZUNoYW5nZWQoQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBtZXRob2RzIHRoYXQgZGVhbAotICAgICAqIHdpdGgge0BsaW5rIElEZXZpY2V9IGFkZGl0aW9uLCBkZWxldGlvbiwgYW5kIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJRGV2aWNlQ2hhbmdlTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIHRoZSBhIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgICAgICogQHBhcmFtIGRldmljZSB0aGUgbmV3IGRldmljZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldmljZUNvbm5lY3RlZChJRGV2aWNlIGRldmljZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiB0aGUgYSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIG5ldyBkZXZpY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkZXZpY2VEaXNjb25uZWN0ZWQoSURldmljZSBkZXZpY2UpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBkZXZpY2UgZGF0YSBjaGFuZ2VkLCBvciB3aGVuIGNsaWVudHMgYXJlIHN0YXJ0ZWQvdGVybWluYXRlZCBvbiB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRoYXQgd2FzIHVwZGF0ZWQuCi0gICAgICAgICAqIEBwYXJhbSBjaGFuZ2VNYXNrIHRoZSBtYXNrIGRlc2NyaWJpbmcgd2hhdCBjaGFuZ2VkLiBJdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZwotICAgICAgICAgKiB2YWx1ZXM6IHtAbGluayBJRGV2aWNlI0NIQU5HRV9CVUlMRF9JTkZPfSwge0BsaW5rIElEZXZpY2UjQ0hBTkdFX1NUQVRFfSwKLSAgICAgICAgICoge0BsaW5rIElEZXZpY2UjQ0hBTkdFX0NMSUVOVF9MSVNUfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZGV2aWNlQ2hhbmdlZChJRGV2aWNlIGRldmljZSwgaW50IGNoYW5nZU1hc2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgbWV0aG9kcyB0aGF0IGRlYWwKLSAgICAgKiB3aXRoIHtAbGluayBDbGllbnR9ICBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNsaWVudENoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhbiBleGlzdGluZyBjbGllbnQgaW5mb3JtYXRpb24gY2hhbmdlZC4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIHVwZGF0ZWQgY2xpZW50LgotICAgICAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgYml0IG1hc2sgZGVzY3JpYmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLiBJdCBjYW4gY29udGFpbgotICAgICAgICAgKiBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHtAbGluayBDbGllbnQjQ0hBTkdFX0lORk99LAotICAgICAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9ERUJVR0dFUl9TVEFUVVN9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9USFJFQURfTU9ERX0sCi0gICAgICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9NT0RFfSwKLSAgICAgICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfTkFUSVZFX0hFQVBfREFUQX0KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENoYW5nZWQoQ2xpZW50IGNsaWVudCwgaW50IGNoYW5nZU1hc2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSA8Y29kZT5kZG08L2NvZGU+IGxpYnJhcnkuCi0gICAgICogPHAvPlRoaXMgbXVzdCBiZSBjYWxsZWQgb25jZSA8Yj5iZWZvcmU8L2I+IGFueSBjYWxsIHRvCi0gICAgICoge0BsaW5rICNjcmVhdGVCcmlkZ2UoU3RyaW5nLCBib29sZWFuKX0uCi0gICAgICogPHA+VGhlIGxpYnJhcnkgY2FuIGJlIGluaXRpYWxpemVkIGluIDIgd2F5czoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPk1vZGUgMTogPHZhcj5jbGllbnRTdXBwb3J0PC92YXI+ID09IDxjb2RlPnRydWU8L2NvZGU+Ljxicj5UaGUgbGlicmFyeSBtb25pdG9ycyB0aGUKLSAgICAgKiBkZXZpY2VzIGFuZCB0aGUgYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhlbS4gSXQgd2lsbCBjb25uZWN0IHRvIGVhY2ggYXBwbGljYXRpb24sIGFzIGEKLSAgICAgKiBkZWJ1Z2dlciBvZiBzb3J0LCB0byBiZSBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlbSB0aHJvdWdoIEpEV1AgcGFja2V0cy48L2xpPgotICAgICAqIDxsaT5Nb2RlIDI6IDx2YXI+Y2xpZW50U3VwcG9ydDwvdmFyPiA9PSA8Y29kZT5mYWxzZTwvY29kZT4uPGJyPlRoZSBsaWJyYXJ5IG9ubHkgbW9uaXRvcnMKLSAgICAgKiBkZXZpY2VzLiBUaGUgYXBwbGljYXRpb25zIGFyZSBsZWZ0IHVudG91Y2hlZCwgbGV0dGluZyBvdGhlciB0b29scyBidWlsdCBvbgotICAgICAqIDxjb2RlPmRkbWxpYjwvY29kZT4gdG8gY29ubmVjdCBhIGRlYnVnZ2VyIHRvIHRoZW0uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDxwLz48Yj5Pbmx5IG9uZSB0b29sIGNhbiBydW4gaW4gbW9kZSAxIGF0IHRoZSBzYW1lIHRpbWUuPC9iPgotICAgICAqIDxwLz5Ob3RlIHRoYXQgbW9kZSAxIGRvZXMgbm90IHByZXZlbnQgZGVidWdnaW5nIG9mIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIGRldmljZXMuIE1vZGUgMQotICAgICAqIGxldHMgZGVidWdnZXJzIGNvbm5lY3QgdG8gPGNvZGU+ZGRtbGliPC9jb2RlPiB3aGljaCBhY3RzIGFzIGEgcHJveHkgYmV0d2VlbiB0aGUgZGVidWdnZXJzIGFuZAotICAgICAqIHRoZSBhcHBsaWNhdGlvbnMgdG8gZGVidWcuIFNlZSB7QGxpbmsgQ2xpZW50I2dldERlYnVnZ2VyTGlzdGVuUG9ydCgpfS4KLSAgICAgKiA8cC8+VGhlIHByZWZlcmVuY2VzIG9mIDxjb2RlPmRkbWxpYjwvY29kZT4gc2hvdWxkIGFsc28gYmUgaW5pdGlhbGl6ZWQgd2l0aCB3aGF0ZXZlciBkZWZhdWx0Ci0gICAgICogdmFsdWVzIHdlcmUgY2hhbmdlZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKiA8cC8+V2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMsIHtAbGluayAjdGVybWluYXRlKCl9IHNob3VsZCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGNsaWVudFN1cHBvcnQgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpYnJhcnkgc2hvdWxkIGVuYWJsZSB0aGUgbW9uaXRvcmluZyBhbmQKLSAgICAgKiBpbnRlcmFjdGlvbiB3aXRoIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBkZXZpY2VzLgotICAgICAqIEBzZWUgQW5kcm9pZERlYnVnQnJpZGdlI2NyZWF0ZUJyaWRnZShTdHJpbmcsIGJvb2xlYW4pCi0gICAgICogQHNlZSBEZG1QcmVmZXJlbmNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gY2xpZW50U3VwcG9ydCkgewotICAgICAgICBzQ2xpZW50U3VwcG9ydCA9IGNsaWVudFN1cHBvcnQ7Ci0KLSAgICAgICAgTW9uaXRvclRocmVhZCBtb25pdG9yVGhyZWFkID0gTW9uaXRvclRocmVhZC5jcmVhdGVJbnN0YW5jZSgpOwotICAgICAgICBtb25pdG9yVGhyZWFkLnN0YXJ0KCk7Ci0KLSAgICAgICAgSGFuZGxlSGVsbG8ucmVnaXN0ZXIobW9uaXRvclRocmVhZCk7Ci0gICAgICAgIEhhbmRsZUFwcE5hbWUucmVnaXN0ZXIobW9uaXRvclRocmVhZCk7Ci0gICAgICAgIEhhbmRsZVRlc3QucmVnaXN0ZXIobW9uaXRvclRocmVhZCk7Ci0gICAgICAgIEhhbmRsZVRocmVhZC5yZWdpc3Rlcihtb25pdG9yVGhyZWFkKTsKLSAgICAgICAgSGFuZGxlSGVhcC5yZWdpc3Rlcihtb25pdG9yVGhyZWFkKTsKLSAgICAgICAgSGFuZGxlV2FpdC5yZWdpc3Rlcihtb25pdG9yVGhyZWFkKTsKLSAgICAgICAgSGFuZGxlUHJvZmlsaW5nLnJlZ2lzdGVyKG1vbml0b3JUaHJlYWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlcm1pbmF0ZXMgdGhlIGRkbSBsaWJyYXJ5LiBUaGlzIG11c3QgYmUgY2FsbGVkIHVwb24gYXBwbGljYXRpb24gdGVybWluYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgLy8ga2lsbCB0aGUgbW9uaXRvcmluZyBzZXJ2aWNlcwotICAgICAgICBpZiAoc1RoaXMgIT0gbnVsbCAmJiBzVGhpcy5tRGV2aWNlTW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzVGhpcy5tRGV2aWNlTW9uaXRvci5zdG9wKCk7Ci0gICAgICAgICAgICBzVGhpcy5tRGV2aWNlTW9uaXRvciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBNb25pdG9yVGhyZWFkIG1vbml0b3JUaHJlYWQgPSBNb25pdG9yVGhyZWFkLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChtb25pdG9yVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vbml0b3JUaHJlYWQucXVpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBkZG1saWIgaXMgc2V0dXAgdG8gc3VwcG9ydCBtb25pdG9yaW5nIGFuZCBpbnRlcmFjdGluZyB3aXRoCi0gICAgICoge0BsaW5rIENsaWVudH1zIHJ1bm5pbmcgb24gdGhlIHtAbGluayBJRGV2aWNlfXMuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gZ2V0Q2xpZW50U3VwcG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHNDbGllbnRTdXBwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSB0aGF0IGlzIG5vdCBsaW5rZWQgdG8gYW55IHBhcnRpY3VsYXIgZXhlY3V0YWJsZS4KLSAgICAgKiA8cC8+VGhpcyBicmlkZ2Ugd2lsbCBleHBlY3QgYWRiIHRvIGJlIHJ1bm5pbmcuIEl0IHdpbGwgbm90IGJlIGFibGUgdG8gc3RhcnQvc3RvcC9yZXN0YXJ0Ci0gICAgICogYWRiLgotICAgICAqIDxwLz5JZiBhIGJyaWRnZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQsIGl0IGlzIGRpcmVjdGx5IHJldHVybmVkIHdpdGggbm8gY2hhbmdlcyAoc2ltaWxhcgotICAgICAqIHRvIGNhbGxpbmcge0BsaW5rICNnZXRCcmlkZ2UoKX0pLgotICAgICAqIEByZXR1cm4gYSBjb25uZWN0ZWQgYnJpZGdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5kcm9pZERlYnVnQnJpZGdlIGNyZWF0ZUJyaWRnZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNUaGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc1RoaXMgPSBuZXcgQW5kcm9pZERlYnVnQnJpZGdlKCk7Ci0gICAgICAgICAgICAgICAgc1RoaXMuc3RhcnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNUaGlzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgbGlzdGVuZXJzIGNvdWxkIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGxpc3Qgd2hpbGUgcHJvY2Vzc2luZwotICAgICAgICAgICAgLy8gdGhlaXIgZXZlbnQgY2FsbGJhY2ssIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0IGFuZCBpdGVyYXRlIG9uIGl0IGluc3RlYWQgb2YKLSAgICAgICAgICAgIC8vIHRoZSBtYWluIGxpc3QuCi0gICAgICAgICAgICAvLyBUaGlzIG1vc3RseSBoYXBwZW5zIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHF1aXRzLgotICAgICAgICAgICAgSURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnNDb3B5ID0gc0JyaWRnZUxpc3RlbmVycy50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICBuZXcgSURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXJbc0JyaWRnZUxpc3RlbmVycy5zaXplKCldKTsKLQotICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZQotICAgICAgICAgICAgZm9yIChJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc0NvcHkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIGNhdGNoIGFueSBleGNlcHRpb24gc28gdGhhdCBhIGJhZCBsaXN0ZW5lciBkb2Vzbid0IGtpbGwgb3VyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYnJpZGdlQ2hhbmdlZChzVGhpcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoRERNUywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZGVidWcgYnJpZGdlIGZyb20gdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4KLSAgICAgKiA8cC8+Ci0gICAgICogQW55IGV4aXN0aW5nIHNlcnZlciB3aWxsIGJlIGRpc2Nvbm5lY3RlZCwgdW5sZXNzIHRoZSBsb2NhdGlvbiBpcyB0aGUgc2FtZSBhbmQKLSAgICAgKiA8Y29kZT5mb3JjZU5ld0JyaWRnZTwvY29kZT4gaXMgc2V0IHRvIGZhbHNlLgotICAgICAqIEBwYXJhbSBvc0xvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wgJ2FkYicKLSAgICAgKiBAcGFyYW0gZm9yY2VOZXdCcmlkZ2UgZm9yY2UgY3JlYXRpb24gb2YgYSBuZXcgYnJpZGdlIGV2ZW4gaWYgb25lIHdpdGggdGhlIHNhbWUgbG9jYXRpb24KLSAgICAgKiBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiBAcmV0dXJuIGEgY29ubmVjdGVkIGJyaWRnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWREZWJ1Z0JyaWRnZSBjcmVhdGVCcmlkZ2UoU3RyaW5nIG9zTG9jYXRpb24sIGJvb2xlYW4gZm9yY2VOZXdCcmlkZ2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNUaGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc1RoaXMubUFkYk9zTG9jYXRpb24gIT0gbnVsbCAmJiBzVGhpcy5tQWRiT3NMb2NhdGlvbi5lcXVhbHMob3NMb2NhdGlvbikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlTmV3QnJpZGdlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzVGhpczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHRoZSBjdXJyZW50IHNlcnZlcgotICAgICAgICAgICAgICAgICAgICBzVGhpcy5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNUaGlzID0gbmV3IEFuZHJvaWREZWJ1Z0JyaWRnZShvc0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBzVGhpcy5zdGFydCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc1RoaXMgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBsaXN0ZW5lcnMgY291bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgbGlzdCB3aGlsZSBwcm9jZXNzaW5nCi0gICAgICAgICAgICAvLyB0aGVpciBldmVudCBjYWxsYmFjaywgd2UgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGl0ZXJhdGUgb24gaXQgaW5zdGVhZCBvZgotICAgICAgICAgICAgLy8gdGhlIG1haW4gbGlzdC4KLSAgICAgICAgICAgIC8vIFRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMuCi0gICAgICAgICAgICBJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVyc0NvcHkgPSBzQnJpZGdlTGlzdGVuZXJzLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcltzQnJpZGdlTGlzdGVuZXJzLnNpemUoKV0pOwotCi0gICAgICAgICAgICAvLyBub3RpZnkgdGhlIGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlCi0gICAgICAgICAgICBmb3IgKElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzQ29weSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gY2F0Y2ggYW55IGV4Y2VwdGlvbiBzbyB0aGF0IGEgYmFkIGxpc3RlbmVyIGRvZXNuJ3Qga2lsbCBvdXIKLSAgICAgICAgICAgICAgICAvLyB0aHJlYWQKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5icmlkZ2VDaGFuZ2VkKHNUaGlzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShERE1TLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzVGhpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGVidWcgYnJpZGdlLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3ZXJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbmRyb2lkRGVidWdCcmlkZ2UgZ2V0QnJpZGdlKCkgewotICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgdGhlIGN1cnJlbnQgZGVidWcgYnJpZGdlLCBhbmQgZGVzdHJveSB0aGUgb2JqZWN0LgotICAgICAqIDxwLz5UaGlzIGFsc28gc3RvcHMgdGhlIGN1cnJlbnQgYWRiIGhvc3Qgc2VydmVyLgotICAgICAqIDxwLz4KLSAgICAgKiBBIG5ldyBvYmplY3Qgd2lsbCBoYXZlIHRvIGJlIGNyZWF0ZWQgd2l0aCB7QGxpbmsgI2NyZWF0ZUJyaWRnZShTdHJpbmcsIGJvb2xlYW4pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzY29ubmVjdEJyaWRnZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNUaGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzVGhpcy5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgc1RoaXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgbGlzdGVuZXJzIGNvdWxkIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGxpc3Qgd2hpbGUgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIC8vIHRoZWlyIGV2ZW50IGNhbGxiYWNrLCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgbGlzdCBhbmQgaXRlcmF0ZSBvbiBpdCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAgICAgLy8gdGhlIG1haW4gbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1vc3RseSBoYXBwZW5zIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHF1aXRzLgotICAgICAgICAgICAgICAgIElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzQ29weSA9IHNCcmlkZ2VMaXN0ZW5lcnMudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcltzQnJpZGdlTGlzdGVuZXJzLnNpemUoKV0pOwotCi0gICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICAgICAgZm9yIChJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc0NvcHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byBjYXRjaCBhbnkgZXhjZXB0aW9uIHNvIHRoYXQgYSBiYWQgbGlzdGVuZXIgZG9lc24ndCBraWxsIG91cgotICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmJyaWRnZUNoYW5nZWQoc1RoaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoRERNUywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBhIG5ldwotICAgICAqIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IGlzIGNvbm5lY3RlZCwgYnkgc2VuZGluZyBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQKLSAgICAgKiBpbiB0aGUge0BsaW5rIElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyfSBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXIoSURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNCcmlkZ2VMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgc0JyaWRnZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGlmIChzVGhpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gY2F0Y2ggYW55IGV4Y2VwdGlvbiBzbyB0aGF0IGEgYmFkIGxpc3RlbmVyIGRvZXNuJ3Qga2lsbCBvdXIKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5icmlkZ2VDaGFuZ2VkKHNUaGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKERETVMsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBhIG5ldwotICAgICAqIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IGlzIHN0YXJ0ZWQuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyKElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKLSAgICAgICAgICAgIHNCcmlkZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuIGEge0BsaW5rIElEZXZpY2V9Ci0gICAgICogaXMgY29ubmVjdGVkLCBkaXNjb25uZWN0ZWQsIG9yIHdoZW4gaXRzIHByb3BlcnRpZXMgb3IgaXRzIHtAbGluayBDbGllbnR9IGxpc3QgY2hhbmdlZCwKLSAgICAgKiBieSBzZW5kaW5nIGl0IG9uZSBvZiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGUge0BsaW5rIElEZXZpY2VDaGFuZ2VMaXN0ZW5lcn0gaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZXZpY2VDaGFuZ2VMaXN0ZW5lcihJRGV2aWNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNEZXZpY2VMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgc0RldmljZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBhCi0gICAgICoge0BsaW5rIElEZXZpY2V9IGlzIGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkLCBvciB3aGVuIGl0cyBwcm9wZXJ0aWVzIG9yIGl0cyB7QGxpbmsgQ2xpZW50fQotICAgICAqIGxpc3QgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKElEZXZpY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBzRGV2aWNlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBhIHtAbGluayBDbGllbnR9Ci0gICAgICogcHJvcGVydHkgY2hhbmdlZCwgYnkgc2VuZGluZyBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlCi0gICAgICoge0BsaW5rIElDbGllbnRDaGFuZ2VMaXN0ZW5lcn0gaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDbGllbnRDaGFuZ2VMaXN0ZW5lcihJQ2xpZW50Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNDbGllbnRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgc0NsaWVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBhCi0gICAgICoge0BsaW5rIENsaWVudH0gcHJvcGVydHkgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNsaWVudENoYW5nZUxpc3RlbmVyKElDbGllbnRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBzQ2xpZW50TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRldmljZXMuCi0gICAgICogQHNlZSAjaGFzSW5pdGlhbERldmljZUxpc3QoKQotICAgICAqLwotICAgIHB1YmxpYyBJRGV2aWNlW10gZ2V0RGV2aWNlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKG1EZXZpY2VNb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURldmljZU1vbml0b3IuZ2V0RGV2aWNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBJRGV2aWNlWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYnJpZGdlIGhhcyBhY3F1aXJlZCB0aGUgaW5pdGlhbCBsaXN0IGZyb20gYWRiIGFmdGVyIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHAvPkNhbGxpbmcge0BsaW5rICNnZXREZXZpY2VzKCl9IHJpZ2h0IGFmdGVyIHtAbGluayAjY3JlYXRlQnJpZGdlKFN0cmluZywgYm9vbGVhbil9IHdpbGwKLSAgICAgKiBnZW5lcmFsbHkgcmVzdWx0IGluIGFuIGVtcHR5IGxpc3QuIFRoaXMgaXMgZHVlIHRvIHRoZSBpbnRlcm5hbCBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbgotICAgICAqIG1lY2hhbmlzbSB3aXRoIDxjb2RlPmFkYjwvY29kZT4gdGhhdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUge0BsaW5rIElEZXZpY2V9IGxpc3QgaGFzIGJlZW4KLSAgICAgKiBidWlsdCBiZWZvcmUgdGhlIGNhbGwgdG8ge0BsaW5rICNnZXREZXZpY2VzKCl9LgotICAgICAqIDxwLz5UaGUgcmVjb21tZW5kZWQgd2F5IHRvIGdldCB0aGUgbGlzdCBvZiB7QGxpbmsgSURldmljZX0gb2JqZWN0cyBpcyB0byBjcmVhdGUgYQotICAgICAqIHtAbGluayBJRGV2aWNlQ2hhbmdlTGlzdGVuZXJ9IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsRGV2aWNlTGlzdCgpIHsKLSAgICAgICAgaWYgKG1EZXZpY2VNb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGV2aWNlTW9uaXRvci5oYXNJbml0aWFsRGV2aWNlTGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNsaWVudCB0byBhY2NlcHQgZGVidWdnZXIgY29ubmVjdGlvbiBvbiB0aGUgY3VzdG9tICJTZWxlY3RlZCBkZWJ1ZyBwb3J0Ii4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDbGllbnQgdGhlIGNsaWVudC4gQ2FuIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDbGllbnQoQ2xpZW50IHNlbGVjdGVkQ2xpZW50KSB7Ci0gICAgICAgIE1vbml0b3JUaHJlYWQgbW9uaXRvclRocmVhZCA9IE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1vbml0b3JUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvclRocmVhZC5zZXRTZWxlY3RlZENsaWVudChzZWxlY3RlZENsaWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IG9iamVjdCBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIGFkYiBkYWVtb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIE1vbml0b3JUaHJlYWQgbW9uaXRvclRocmVhZCA9IE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1EZXZpY2VNb25pdG9yICE9IG51bGwgJiYgbW9uaXRvclRocmVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZU1vbml0b3IuaXNNb25pdG9yaW5nKCkgJiYgbW9uaXRvclRocmVhZC5nZXRTdGF0ZSgpICE9IFN0YXRlLlRFUk1JTkFURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0gb2JqZWN0IGF0dGVtcHRlZCB0byBjb25uZWN0Ci0gICAgICogdG8gdGhlIGFkYiBkYWVtb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uQXR0ZW1wdENvdW50KCkgewotICAgICAgICBpZiAobURldmljZU1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VNb25pdG9yLmdldENvbm5lY3Rpb25BdHRlbXB0Q291bnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSBvYmplY3QgYXR0ZW1wdGVkIHRvIHJlc3RhcnQKLSAgICAgKiB0aGUgYWRiIGRhZW1vbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlc3RhcnRBdHRlbXB0Q291bnQoKSB7Ci0gICAgICAgIGlmIChtRGV2aWNlTW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZU1vbml0b3IuZ2V0UmVzdGFydEF0dGVtcHRDb3VudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGJyaWRnZS4KLSAgICAgKiBAcGFyYW0gb3NMb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sCi0gICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbmRyb2lkRGVidWdCcmlkZ2UoU3RyaW5nIG9zTG9jYXRpb24pIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9zTG9jYXRpb24gPT0gbnVsbCB8fCBvc0xvY2F0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFkYk9zTG9jYXRpb24gPSBvc0xvY2F0aW9uOwotCi0gICAgICAgIGNoZWNrQWRiVmVyc2lvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYnJpZGdlIG5vdCBsaW5rZWQgdG8gYW55IHBhcnRpY3VsYXIgYWRiIGV4ZWN1dGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbmRyb2lkRGVidWdCcmlkZ2UoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyBhZGIgZm9yIGl0cyB2ZXJzaW9uIG51bWJlciBhbmQgY2hlY2tzIGl0IGFnYWluc3Qge0BsaW5rICNNSU5fVkVSU0lPTl9OVU1CRVJ9IGFuZAotICAgICAqIHtAbGluayAjTUFYX1ZFUlNJT05fTlVNQkVSfQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0FkYlZlcnNpb24oKSB7Ci0gICAgICAgIC8vIGRlZmF1bHQgaXMgYmFkIGNoZWNrCi0gICAgICAgIG1WZXJzaW9uQ2hlY2sgPSBmYWxzZTsKLQotICAgICAgICBpZiAobUFkYk9zTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICAgICAgY29tbWFuZFswXSA9IG1BZGJPc0xvY2F0aW9uOwotICAgICAgICAgICAgY29tbWFuZFsxXSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgTG9nLmQoRERNUywgU3RyaW5nLmZvcm1hdCgiQ2hlY2tpbmcgJyUxJHMgdmVyc2lvbiciLCBtQWRiT3NMb2NhdGlvbikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBlcnJvck91dHB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3RkT3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBpbnQgc3RhdHVzID0gZ3JhYlByb2Nlc3NPdXRwdXQocHJvY2VzcywgZXJyb3JPdXRwdXQsIHN0ZE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB3YWl0Rm9yUmVhZGVycyAqLyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCInYWRiIHZlcnNpb24nIGZhaWxlZCEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGVycm9yIDogZXJyb3JPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsICJhZGIiLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBib3RoIHN0ZG91dCBhbmQgc3RkZXJyCi0gICAgICAgICAgICBib29sZWFuIHZlcnNpb25Gb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IHN0ZE91dHB1dCkgewotICAgICAgICAgICAgICAgIHZlcnNpb25Gb3VuZCA9IHNjYW5WZXJzaW9uTGluZShsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbkZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdmVyc2lvbkZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGVycm9yT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25Gb3VuZCA9IHNjYW5WZXJzaW9uTGluZShsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb25Gb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmVyc2lvbkZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUsIHdlIGZhaWxlZCB0byBwYXJzZSB0aGUgb3V0cHV0LgotICAgICAgICAgICAgICAgIExvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLkVSUk9SLCBBREIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgJ2FkYiB2ZXJzaW9uJyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsIEFEQiwKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdGhlIGFkYiB2ZXJzaW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgYSBsaW5lIHJlc3VsdGluZyBmcm9tICdhZGIgdmVyc2lvbicgZm9yIGEgcG90ZW50aWFsIHZlcnNpb24gbnVtYmVyLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGZvdW5kLCBpdCBjaGVja3MgdGhlIHZlcnNpb24gbnVtYmVyIGFnYWluc3Qgd2hhdCBpcyBleHBlY3RlZAotICAgICAqIGJ5IHRoaXMgdmVyc2lvbiBvZiBkZG1zLgotICAgICAqIDxwLz4KLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhIHZlcnNpb24gbnVtYmVyIGhhcyBiZWVuIGZvdW5kIHNvIHRoYXQgd2UgY2FuIHN0b3Agc2Nhbm5pbmcsCi0gICAgICogd2hldGhlciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2Ugb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgdG8gc2Nhbi4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSB2ZXJzaW9uIG51bWJlciB3YXMgZm91bmQgKHdoZXRoZXIgaXQgaXMgYWNjZXB0YWJsZSBvciBub3QpLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzY2FuVmVyc2lvbkxpbmUoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gc0FkYlZlcnNpb24ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGludCBtYWpvclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIGludCBtaW5vclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgIGludCBtaWNyb1ZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMykpOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgb25seSB0aGUgbWljcm8gdmVyc2lvbiBmb3Igbm93LgotICAgICAgICAgICAgICAgIGlmIChtaWNyb1ZlcnNpb24gPCBBREJfVkVSU0lPTl9NSUNST19NSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBtaW5pbXVtIHZlcnNpb24gb2YgYWRiOiAlMSRkLiUyJGQuJTMkZC4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJDdXJyZW50IHZlcnNpb24gaXMgJTEkZC4lMiRkLiU0JGQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24sIEFEQl9WRVJTSU9OX01JQ1JPX01JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb1ZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICBMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwgQURCLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQl9WRVJTSU9OX01JQ1JPX01BWCAhPSAtMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9WZXJzaW9uID4gQURCX1ZFUlNJT05fTUlDUk9fTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZWQgbWF4aW11bSB2ZXJzaW9uIG9mIGFkYjogJTEkZC4lMiRkLiUzJGQuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ3VycmVudCB2ZXJzaW9uIGlzICUxJGQuJTIkZC4lNCRkIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uLCBBREJfVkVSU0lPTl9NSUNST19NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9WZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsIEFEQiwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVZlcnNpb25DaGVjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgZGVidWcgYnJpZGdlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzLgotICAgICAqLwotICAgIGJvb2xlYW4gc3RhcnQoKSB7Ci0gICAgICAgIGlmIChtQWRiT3NMb2NhdGlvbiAhPSBudWxsICYmIChtVmVyc2lvbkNoZWNrID09IGZhbHNlIHx8IHN0YXJ0QWRiKCkgPT0gZmFsc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gbm93IHRoYXQgdGhlIGJyaWRnZSBpcyBjb25uZWN0ZWQsIHdlIHN0YXJ0IHRoZSB1bmRlcmx5aW5nIHNlcnZpY2VzLgotICAgICAgICBtRGV2aWNlTW9uaXRvciA9IG5ldyBEZXZpY2VNb25pdG9yKHRoaXMpOwotICAgICAgICBtRGV2aWNlTW9uaXRvci5zdGFydCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgLyoqCi0gICAgICogS2lsbHMgdGhlIGRlYnVnIGJyaWRnZSwgYW5kIHRoZSBhZGIgaG9zdCBzZXJ2ZXIuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MKLSAgICAgKi8KLSAgICBib29sZWFuIHN0b3AoKSB7Ci0gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3Qgc3RhcnRlZCB3ZSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChtU3RhcnRlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8ga2lsbCB0aGUgbW9uaXRvcmluZyBzZXJ2aWNlcwotICAgICAgICBtRGV2aWNlTW9uaXRvci5zdG9wKCk7Ci0gICAgICAgIG1EZXZpY2VNb25pdG9yID0gbnVsbDsKLQotICAgICAgICBpZiAoc3RvcEFkYigpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0YXJ0cyBhZGIsIGJ1dCBub3QgdGhlIHNlcnZpY2VzIGFyb3VuZCBpdC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXN0YXJ0KCkgewotICAgICAgICBpZiAobUFkYk9zTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoQURCLAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlc3RhcnQgYWRiIHdoZW4gQW5kcm9pZERlYnVnQnJpZGdlIGlzIGNyZWF0ZWQgd2l0aG91dCB0aGUgbG9jYXRpb24gb2YgYWRiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZlcnNpb25DaGVjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsIEFEQiwKLSAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gcmVzdGFydCBhZGIsIGJ1dCB2ZXJzaW9uIGNoZWNrIGZhaWxlZCEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgc3RvcEFkYigpOwotCi0gICAgICAgICAgICBib29sZWFuIHJlc3RhcnQgPSBzdGFydEFkYigpOwotCi0gICAgICAgICAgICBpZiAocmVzdGFydCAmJiBtRGV2aWNlTW9uaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURldmljZU1vbml0b3IgPSBuZXcgRGV2aWNlTW9uaXRvcih0aGlzKTsKLSAgICAgICAgICAgICAgICBtRGV2aWNlTW9uaXRvci5zdGFydCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGUgbGlzdGVuZXIgb2YgYSBuZXcge0BsaW5rIElEZXZpY2V9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgbm90aWZpY2F0aW9uIG9mIHRoZSBsaXN0ZW5lcnMgaXMgZG9uZSBpbiBhIHN5bmNocm9uaXplZCBibG9jay4gSXQgaXMgaW1wb3J0YW50IHRvCi0gICAgICogZXhwZWN0IHRoZSBsaXN0ZW5lcnMgdG8gcG90ZW50aWFsbHkgYWNjZXNzIHZhcmlvdXMgbWV0aG9kcyBvZiB7QGxpbmsgSURldmljZX0gYXMgd2VsbCBhcwotICAgICAqIHtAbGluayAjZ2V0RGV2aWNlcygpfSB3aGljaCB1c2UgaW50ZXJuYWwgbG9ja3MuCi0gICAgICogPHAvPgotICAgICAqIEZvciB0aGlzIHJlYXNvbiwgYW55IGNhbGwgdG8gdGhpcyBtZXRob2QgZnJvbSBhIG1ldGhvZCBvZiB7QGxpbmsgRGV2aWNlTW9uaXRvcn0sCi0gICAgICoge0BsaW5rIElEZXZpY2V9IHdoaWNoIGlzIGFsc28gaW5zaWRlIGEgc3luY2hyb25pemVkIGJsb2NrLCBzaG91bGQgZmlyc3Qgc3luY2hyb25pemUgb24KLSAgICAgKiB0aGUge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0gbG9jay4gQWNjZXNzIHRvIHRoaXMgbG9jayBpcyBkb25lIHRocm91Z2gge0BsaW5rICNnZXRMb2NrKCl9LgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIG5ldyA8Y29kZT5JRGV2aWNlPC9jb2RlPi4KLSAgICAgKiBAc2VlICNnZXRMb2NrKCkKLSAgICAgKi8KLSAgICB2b2lkIGRldmljZUNvbm5lY3RlZChJRGV2aWNlIGRldmljZSkgewotICAgICAgICAvLyBiZWNhdXNlIHRoZSBsaXN0ZW5lcnMgY291bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgbGlzdCB3aGlsZSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHRoZWlyIGV2ZW50IGNhbGxiYWNrLCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgbGlzdCBhbmQgaXRlcmF0ZSBvbiBpdCBpbnN0ZWFkIG9mCi0gICAgICAgIC8vIHRoZSBtYWluIGxpc3QuCi0gICAgICAgIC8vIFRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMuCi0gICAgICAgIElEZXZpY2VDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVyc0NvcHkgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnNDb3B5ID0gc0RldmljZUxpc3RlbmVycy50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICBuZXcgSURldmljZUNoYW5nZUxpc3RlbmVyW3NEZXZpY2VMaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RpZnkgdGhlIGxpc3RlbmVycwotICAgICAgICBmb3IgKElEZXZpY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc0NvcHkpIHsKLSAgICAgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gY2F0Y2ggYW55IGV4Y2VwdGlvbiBzbyB0aGF0IGEgYmFkIGxpc3RlbmVyIGRvZXNuJ3Qga2lsbCBvdXIKLSAgICAgICAgICAgIC8vIHRocmVhZAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5kZXZpY2VDb25uZWN0ZWQoZGV2aWNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoRERNUywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGxpc3RlbmVyIG9mIGEgZGlzY29ubmVjdGVkIHtAbGluayBJRGV2aWNlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIG5vdGlmaWNhdGlvbiBvZiB0aGUgbGlzdGVuZXJzIGlzIGRvbmUgaW4gYSBzeW5jaHJvbml6ZWQgYmxvY2suIEl0IGlzIGltcG9ydGFudCB0bwotICAgICAqIGV4cGVjdCB0aGUgbGlzdGVuZXJzIHRvIHBvdGVudGlhbGx5IGFjY2VzcyB2YXJpb3VzIG1ldGhvZHMgb2Yge0BsaW5rIElEZXZpY2V9IGFzIHdlbGwgYXMKLSAgICAgKiB7QGxpbmsgI2dldERldmljZXMoKX0gd2hpY2ggdXNlIGludGVybmFsIGxvY2tzLgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgdGhpcyByZWFzb24sIGFueSBjYWxsIHRvIHRoaXMgbWV0aG9kIGZyb20gYSBtZXRob2Qgb2Yge0BsaW5rIERldmljZU1vbml0b3J9LAotICAgICAqIHtAbGluayBJRGV2aWNlfSB3aGljaCBpcyBhbHNvIGluc2lkZSBhIHN5bmNocm9uaXplZCBibG9jaywgc2hvdWxkIGZpcnN0IHN5bmNocm9uaXplIG9uCi0gICAgICogdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IGxvY2suIEFjY2VzcyB0byB0aGlzIGxvY2sgaXMgZG9uZSB0aHJvdWdoIHtAbGluayAjZ2V0TG9jaygpfS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkaXNjb25uZWN0ZWQgPGNvZGU+SURldmljZTwvY29kZT4uCi0gICAgICogQHNlZSAjZ2V0TG9jaygpCi0gICAgICovCi0gICAgdm9pZCBkZXZpY2VEaXNjb25uZWN0ZWQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgbGlzdGVuZXJzIGNvdWxkIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGxpc3Qgd2hpbGUgcHJvY2Vzc2luZwotICAgICAgICAvLyB0aGVpciBldmVudCBjYWxsYmFjaywgd2UgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGl0ZXJhdGUgb24gaXQgaW5zdGVhZCBvZgotICAgICAgICAvLyB0aGUgbWFpbiBsaXN0LgotICAgICAgICAvLyBUaGlzIG1vc3RseSBoYXBwZW5zIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHF1aXRzLgotICAgICAgICBJRGV2aWNlQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnNDb3B5ID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgbGlzdGVuZXJzQ29weSA9IHNEZXZpY2VMaXN0ZW5lcnMudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IElEZXZpY2VDaGFuZ2VMaXN0ZW5lcltzRGV2aWNlTGlzdGVuZXJzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90aWZ5IHRoZSBsaXN0ZW5lcnMKLSAgICAgICAgZm9yIChJRGV2aWNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnNDb3B5KSB7Ci0gICAgICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIGNhdGNoIGFueSBleGNlcHRpb24gc28gdGhhdCBhIGJhZCBsaXN0ZW5lciBkb2Vzbid0IGtpbGwgb3VyCi0gICAgICAgICAgICAvLyB0aHJlYWQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuZGV2aWNlRGlzY29ubmVjdGVkKGRldmljZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKERETVMsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBsaXN0ZW5lciBvZiBhIG1vZGlmaWVkIHtAbGluayBJRGV2aWNlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIG5vdGlmaWNhdGlvbiBvZiB0aGUgbGlzdGVuZXJzIGlzIGRvbmUgaW4gYSBzeW5jaHJvbml6ZWQgYmxvY2suIEl0IGlzIGltcG9ydGFudCB0bwotICAgICAqIGV4cGVjdCB0aGUgbGlzdGVuZXJzIHRvIHBvdGVudGlhbGx5IGFjY2VzcyB2YXJpb3VzIG1ldGhvZHMgb2Yge0BsaW5rIElEZXZpY2V9IGFzIHdlbGwgYXMKLSAgICAgKiB7QGxpbmsgI2dldERldmljZXMoKX0gd2hpY2ggdXNlIGludGVybmFsIGxvY2tzLgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgdGhpcyByZWFzb24sIGFueSBjYWxsIHRvIHRoaXMgbWV0aG9kIGZyb20gYSBtZXRob2Qgb2Yge0BsaW5rIERldmljZU1vbml0b3J9LAotICAgICAqIHtAbGluayBJRGV2aWNlfSB3aGljaCBpcyBhbHNvIGluc2lkZSBhIHN5bmNocm9uaXplZCBibG9jaywgc2hvdWxkIGZpcnN0IHN5bmNocm9uaXplIG9uCi0gICAgICogdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IGxvY2suIEFjY2VzcyB0byB0aGlzIGxvY2sgaXMgZG9uZSB0aHJvdWdoIHtAbGluayAjZ2V0TG9jaygpfS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBtb2RpZmllZCA8Y29kZT5JRGV2aWNlPC9jb2RlPi4KLSAgICAgKiBAc2VlICNnZXRMb2NrKCkKLSAgICAgKi8KLSAgICB2b2lkIGRldmljZUNoYW5nZWQoSURldmljZSBkZXZpY2UsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIC8vIGJlY2F1c2UgdGhlIGxpc3RlbmVycyBjb3VsZCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBsaXN0IHdoaWxlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gdGhlaXIgZXZlbnQgY2FsbGJhY2ssIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0IGFuZCBpdGVyYXRlIG9uIGl0IGluc3RlYWQgb2YKLSAgICAgICAgLy8gdGhlIG1haW4gbGlzdC4KLSAgICAgICAgLy8gVGhpcyBtb3N0bHkgaGFwcGVucyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBxdWl0cy4KLSAgICAgICAgSURldmljZUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzQ29weSA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKLSAgICAgICAgICAgIGxpc3RlbmVyc0NvcHkgPSBzRGV2aWNlTGlzdGVuZXJzLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJRGV2aWNlQ2hhbmdlTGlzdGVuZXJbc0RldmljZUxpc3RlbmVycy5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGlmeSB0aGUgbGlzdGVuZXJzCi0gICAgICAgIGZvciAoSURldmljZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzQ29weSkgewotICAgICAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byBjYXRjaCBhbnkgZXhjZXB0aW9uIHNvIHRoYXQgYSBiYWQgbGlzdGVuZXIgZG9lc24ndCBraWxsIG91cgotICAgICAgICAgICAgLy8gdGhyZWFkCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmRldmljZUNoYW5nZWQoZGV2aWNlLCBjaGFuZ2VNYXNrKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoRERNUywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGxpc3RlbmVyIG9mIGEgbW9kaWZpZWQge0BsaW5rIENsaWVudH0uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBub3RpZmljYXRpb24gb2YgdGhlIGxpc3RlbmVycyBpcyBkb25lIGluIGEgc3luY2hyb25pemVkIGJsb2NrLiBJdCBpcyBpbXBvcnRhbnQgdG8KLSAgICAgKiBleHBlY3QgdGhlIGxpc3RlbmVycyB0byBwb3RlbnRpYWxseSBhY2Nlc3MgdmFyaW91cyBtZXRob2RzIG9mIHtAbGluayBJRGV2aWNlfSBhcyB3ZWxsIGFzCi0gICAgICoge0BsaW5rICNnZXREZXZpY2VzKCl9IHdoaWNoIHVzZSBpbnRlcm5hbCBsb2Nrcy4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIHRoaXMgcmVhc29uLCBhbnkgY2FsbCB0byB0aGlzIG1ldGhvZCBmcm9tIGEgbWV0aG9kIG9mIHtAbGluayBEZXZpY2VNb25pdG9yfSwKLSAgICAgKiB7QGxpbmsgSURldmljZX0gd2hpY2ggaXMgYWxzbyBpbnNpZGUgYSBzeW5jaHJvbml6ZWQgYmxvY2ssIHNob3VsZCBmaXJzdCBzeW5jaHJvbml6ZSBvbgotICAgICAqIHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSBsb2NrLiBBY2Nlc3MgdG8gdGhpcyBsb2NrIGlzIGRvbmUgdGhyb3VnaCB7QGxpbmsgI2dldExvY2soKX0uCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgbW9kaWZpZWQgPGNvZGU+Q2xpZW50PC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgY2hhbmdlZCBpbiB0aGUgPGNvZGU+Q2xpZW50PC9jb2RlPgotICAgICAqIEBzZWUgI2dldExvY2soKQotICAgICAqLwotICAgIHZvaWQgY2xpZW50Q2hhbmdlZChDbGllbnQgY2xpZW50LCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICAvLyBiZWNhdXNlIHRoZSBsaXN0ZW5lcnMgY291bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgbGlzdCB3aGlsZSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHRoZWlyIGV2ZW50IGNhbGxiYWNrLCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgbGlzdCBhbmQgaXRlcmF0ZSBvbiBpdCBpbnN0ZWFkIG9mCi0gICAgICAgIC8vIHRoZSBtYWluIGxpc3QuCi0gICAgICAgIC8vIFRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMuCi0gICAgICAgIElDbGllbnRDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVyc0NvcHkgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnNDb3B5ID0gc0NsaWVudExpc3RlbmVycy50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICBuZXcgSUNsaWVudENoYW5nZUxpc3RlbmVyW3NDbGllbnRMaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGlmeSB0aGUgbGlzdGVuZXJzCi0gICAgICAgIGZvciAoSUNsaWVudENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzQ29weSkgewotICAgICAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byBjYXRjaCBhbnkgZXhjZXB0aW9uIHNvIHRoYXQgYSBiYWQgbGlzdGVuZXIgZG9lc24ndCBraWxsIG91cgotICAgICAgICAgICAgLy8gdGhyZWFkCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNsaWVudENoYW5nZWQoY2xpZW50LCBjaGFuZ2VNYXNrKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoRERNUywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRGV2aWNlTW9uaXRvcn0gb2JqZWN0LgotICAgICAqLwotICAgIERldmljZU1vbml0b3IgZ2V0RGV2aWNlTW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VNb25pdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgYWRiIGhvc3Qgc2lkZSBzZXJ2ZXIuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MKLSAgICAgKi8KLSAgICBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydEFkYigpIHsKLSAgICAgICAgaWYgKG1BZGJPc0xvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKEFEQiwKLSAgICAgICAgICAgICAgICAiQ2Fubm90IHN0YXJ0IGFkYiB3aGVuIEFuZHJvaWREZWJ1Z0JyaWRnZSBpcyBjcmVhdGVkIHdpdGhvdXQgdGhlIGxvY2F0aW9uIG9mIGFkYi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvY2VzcyBwcm9jOwotICAgICAgICBpbnQgc3RhdHVzID0gLTE7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICAgICAgY29tbWFuZFswXSA9IG1BZGJPc0xvY2F0aW9uOwotICAgICAgICAgICAgY29tbWFuZFsxXSA9ICJzdGFydC1zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBMb2cuZChERE1TLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJMYXVuY2hpbmcgJyUxJHMgJTIkcycgdG8gZW5zdXJlIEFEQiBpcyBydW5uaW5nLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbUFkYk9zTG9jYXRpb24sIGNvbW1hbmRbMV0pKTsKLSAgICAgICAgICAgIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBlcnJvck91dHB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3RkT3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBncmFiUHJvY2Vzc091dHB1dChwcm9jLCBlcnJvck91dHB1dCwgc3RkT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiB3YWl0Rm9yUmVhZGVycyAqLyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBMb2cuZChERE1TLCAiVW5hYmxlIHRvIHJ1biAnYWRiJzogIiArIGlvZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB3ZSdsbCByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBMb2cuZChERE1TLCAiVW5hYmxlIHRvIHJ1biAnYWRiJzogIiArIGllLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgTG9nLncoRERNUywKLSAgICAgICAgICAgICAgICAgICAgIidhZGIgc3RhcnQtc2VydmVyJyBmYWlsZWQgLS0gcnVuIG1hbnVhbGx5IGlmIG5lY2Vzc2FyeSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZChERE1TLCAiJ2FkYiBzdGFydC1zZXJ2ZXInIHN1Y2NlZWRlZCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgdGhlIGFkYiBob3N0IHNpZGUgc2VydmVyLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wQWRiKCkgewotICAgICAgICBpZiAobUFkYk9zTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoQURCLAotICAgICAgICAgICAgICAgICJDYW5ub3Qgc3RvcCBhZGIgd2hlbiBBbmRyb2lkRGVidWdCcmlkZ2UgaXMgY3JlYXRlZCB3aXRob3V0IHRoZSBsb2NhdGlvbiBvZiBhZGIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb2Nlc3MgcHJvYzsKLSAgICAgICAgaW50IHN0YXR1cyA9IC0xOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIGNvbW1hbmRbMF0gPSBtQWRiT3NMb2NhdGlvbjsKLSAgICAgICAgICAgIGNvbW1hbmRbMV0gPSAia2lsbC1zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHByb2Mud2FpdEZvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgTG9nLncoRERNUywKLSAgICAgICAgICAgICAgICAgICAgIidhZGIga2lsbC1zZXJ2ZXInIGZhaWxlZCAtLSBydW4gbWFudWFsbHkgaWYgbmVjZXNzYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIExvZy5kKERETVMsICInYWRiIGtpbGwtc2VydmVyJyBzdWNjZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0ZGVyci9zdGRvdXQgb3V0cHV0cyBvZiBhIHByb2Nlc3MgYW5kIHJldHVybiB3aGVuIHRoZSBwcm9jZXNzIGlzIGRvbmUuCi0gICAgICogQm90aCA8Yj5tdXN0PC9iPiBiZSByZWFkIG9yIHRoZSBwcm9jZXNzIHdpbGwgYmxvY2sgb24gd2luZG93cy4KLSAgICAgKiBAcGFyYW0gcHJvY2VzcyBUaGUgcHJvY2VzcyB0byBnZXQgdGhlIG91cHV0IGZyb20KLSAgICAgKiBAcGFyYW0gZXJyb3JPdXRwdXQgVGhlIGFycmF5IHRvIHN0b3JlIHRoZSBzdGRlcnIgb3V0cHV0LiBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gc3RkT3V0cHV0IFRoZSBhcnJheSB0byBzdG9yZSB0aGUgc3Rkb3V0IG91dHB1dC4gY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGRpc3BsYXlTdGRPdXQgSWYgdHJ1ZSB0aGlzIHdpbGwgZGlzcGxheSBzdGRvdXQgYXMgd2VsbAotICAgICAqIEBwYXJhbSB3YWl0Zm9yUmVhZGVycyBpZiB0cnVlLCB0aGlzIHdpbGwgd2FpdCBmb3IgdGhlIHJlYWRlciB0aHJlYWRzLgotICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgcmV0dXJuIGNvZGUuCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdyYWJQcm9jZXNzT3V0cHV0KGZpbmFsIFByb2Nlc3MgcHJvY2VzcywgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gZXJyb3JPdXRwdXQsCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBzdGRPdXRwdXQsIGJvb2xlYW4gd2FpdGZvclJlYWRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgZXJyb3JPdXRwdXQgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHN0ZE91dHB1dCAhPSBudWxsOwotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB0byByZWFkIHRoZSBzdGRlcnIgb3V0cHV0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZXJyUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoQURCLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck91dHB1dC5hZGQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgb3V0UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG91dFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKEFEQiwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkT3V0cHV0LmFkZChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHQxLnN0YXJ0KCk7Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0KLSAgICAgICAgLy8gaXQgbG9va3MgbGlrZSBvbiB3aW5kb3dzIHByb2Nlc3Mjd2FpdEZvcigpIGNhbiByZXR1cm4KLSAgICAgICAgLy8gYmVmb3JlIHRoZSB0aHJlYWQgaGF2ZSBmaWxsZWQgdGhlIGFycmF5cywgc28gd2Ugd2FpdCBmb3IgYm90aCB0aHJlYWRzIGFuZCB0aGUKLSAgICAgICAgLy8gcHJvY2VzcyBpdHNlbGYuCi0gICAgICAgIGlmICh3YWl0Zm9yUmVhZGVycykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0MS5qb2luKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHQyLmpvaW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJvY2VzcwotICAgICAgICByZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGxvY2sgdXNlZCBieSB0aGlzIGNsYXNzIHRvIHByb3RlY3QgYW55IGFjY2VzcyB0byB0aGUgbGlzdGVuZXIuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaW5jbHVkZXMgYWRkaW5nL3JlbW92aW5nIGxpc3RlbmVycywgYnV0IGFsc28gbm90aWZ5aW5nIGxpc3RlbmVycyBvZiBuZXcgYnJpZGdlcywKLSAgICAgKiBkZXZpY2VzLCBhbmQgY2xpZW50cy4KLSAgICAgKi8KLSAgICBzdGF0aWMgT2JqZWN0IGdldExvY2soKSB7Ci0gICAgICAgIHJldHVybiBzTG9jazsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQmFkUGFja2V0RXhjZXB0aW9uLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQmFkUGFja2V0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWIzMTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0JhZFBhY2tldEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogLy9kZXZpY2UvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0JhZFBhY2tldEV4Y2VwdGlvbi5qYXZhCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi0vKioKLSAqIFRocm93biBpZiB0aGUgY29udGVudHMgb2YgYSBwYWNrZXQgYXJlIGJhZC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1jbGFzcyBCYWRQYWNrZXRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgQmFkUGFja2V0RXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJhZFBhY2tldEV4Y2VwdGlvbihTdHJpbmcgbXNnKQotICAgIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9DaHVua0hhbmRsZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9DaHVua0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmYTMxOC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQ2h1bmtIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkRlYnVnUG9ydE1hbmFnZXIuSURlYnVnUG9ydFByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLQotLyoqCi0gKiBTdWJjbGFzcyB0aGlzIHdpdGggYSBjbGFzcyB0aGF0IGhhbmRsZXMgb25lIG9yIG1vcmUgY2h1bmsgdHlwZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19IRUFERVJfTEVOID0gODsgICAvLyA0LWJ5dGUgdHlwZSwgNC1ieXRlIGxlbgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZU9yZGVyIENIVU5LX09SREVSID0gQnl0ZU9yZGVyLkJJR19FTkRJQU47Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19GQUlMID0gdHlwZSgiRkFJTCIpOwotCi0gICAgQ2h1bmtIYW5kbGVyKCkge30KLQotICAgIC8qKgotICAgICAqIENsaWVudCBpcyByZWFkeS4gIFRoZSBtb25pdG9yIHRocmVhZCBjYWxscyB0aGlzIG1ldGhvZCBvbiBhbGwKLSAgICAgKiBoYW5kbGVycyB3aGVuIHRoZSBjbGllbnQgaXMgZGV0ZXJtaW5lZCB0byBiZSBERE0tYXdhcmUgKHVzdWFsbHkKLSAgICAgKiBhZnRlciByZWNlaXZpbmcgYSBIRUxPIHJlc3BvbnNlLikKLSAgICAgKgotICAgICAqIFRoZSBoYW5kbGVyIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBpbml0aWFsaXplIGNsaWVudC1zaWRlCi0gICAgICogYWN0aXZpdHkuICBCZWNhdXNlIHRoZXJlJ3MgYSBmYWlyIGNoYW5jZSB3ZSdsbCB3YW50IHRvIHNlbmQgYQotICAgICAqIG1lc3NhZ2UgdG8gdGhlIGNsaWVudCwgdGhpcyBtZXRob2QgY2FuIHRocm93IGFuIElPRXhjZXB0aW9uLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgY2xpZW50UmVhZHkoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IGhhcyBnb25lIGF3YXkuICBDYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xpZW50IGNvbm5lY3Rpb24uCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBjbGllbnREaXNjb25uZWN0ZWQoQ2xpZW50IGNsaWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYW4gaW5jb21pbmcgY2h1bmsuICBUaGUgZGF0YSwgb2YgY2h1bmsgdHlwZSAidHlwZSIsIGJlZ2lucwotICAgICAqIGF0IHRoZSBzdGFydCBvZiAiZGF0YSIgYW5kIGNvbnRpbnVlcyB0byBkYXRhLmxpbWl0KCkuCi0gICAgICoKLSAgICAgKiBJZiAiaXNSZXBseSIgaXMgc2V0LCB0aGVuICJtc2dJZCIgd2lsbCBiZSB0aGUgSUQgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiB3ZSBzZW50IHRvIHRoZSBjbGllbnQuICBPdGhlcndpc2UsIGl0J3MgdGhlIElEIGdlbmVyYXRlZCBieSB0aGUKLSAgICAgKiBjbGllbnQgZm9yIHRoaXMgZXZlbnQuICBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSB0byByZWNlaXZlIGNodW5rcwotICAgICAqIGluIHJlcGx5IHBhY2tldHMgZm9yIHdoaWNoIHdlIGFyZSBub3QgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIFRoZSBoYW5kbGVyIG1heSBub3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiAiZGF0YSIuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBoYW5kbGVDaHVuayhDbGllbnQgY2xpZW50LCBpbnQgdHlwZSwKLSAgICAgICAgQnl0ZUJ1ZmZlciBkYXRhLCBib29sZWFuIGlzUmVwbHksIGludCBtc2dJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgY2h1bmtzIG5vdCByZWNvZ25pemVkIGJ5IGhhbmRsZXJzLiAgVGhlIGhhbmRsZUNodW5rKCkgbWV0aG9kCi0gICAgICogaW4gc3ViLWNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBpZiB0aGUgY2h1bmsgdHlwZSBpc24ndCByZWNvZ25pemVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25DaHVuayhDbGllbnQgY2xpZW50LCBpbnQgdHlwZSwKLSAgICAgICAgQnl0ZUJ1ZmZlciBkYXRhLCBib29sZWFuIGlzUmVwbHksIGludCBtc2dJZCkgewotICAgICAgICBpZiAodHlwZSA9PSBDSFVOS19GQUlMKSB7Ci0gICAgICAgICAgICBpbnQgZXJyb3JDb2RlLCBtc2dMZW47Ci0gICAgICAgICAgICBTdHJpbmcgbXNnOwotCi0gICAgICAgICAgICBlcnJvckNvZGUgPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgbXNnTGVuID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgICAgIG1zZyA9IGdldFN0cmluZyhkYXRhLCBtc2dMZW4pOwotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiV0FSTklORzogZmFpbHVyZSBjb2RlPSIgKyBlcnJvckNvZGUgKyAiIG1zZz0iICsgbXNnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIldBUk5JTkc6IHJlY2VpdmVkIHVua25vd24gY2h1bmsgIiArIG5hbWUodHlwZSkKLSAgICAgICAgICAgICAgICArICI6IGxlbj0iICsgZGF0YS5saW1pdCgpICsgIiwgcmVwbHk9IiArIGlzUmVwbHkKLSAgICAgICAgICAgICAgICArICIsIG1zZ0lkPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobXNnSWQpKTsKLSAgICAgICAgfQotICAgICAgICBMb2cudygiZGRtcyIsICIgICAgICAgICBjbGllbnQgIiArIGNsaWVudCArICIsIGhhbmRsZXIgIiArIHRoaXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBjb3B5IGEgU3RyaW5nIG91dCBvZiBhIEJ5dGVCdWZmZXIuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGhlcmUgYmVjYXVzZSBtdWx0aXBsZSBjaHVuayBoYW5kbGVycyBjYW4gbWFrZSB1c2Ugb2YgaXQsCi0gICAgICogYW5kIHRoZXJlJ3Mgbm93aGVyZSBiZXR0ZXIgdG8gcHV0IGl0LgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEJ5dGVCdWZmZXIgYnVmLCBpbnQgbGVuKSB7Ci0gICAgICAgIGNoYXJbXSBkYXRhID0gbmV3IGNoYXJbbGVuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGRhdGFbaV0gPSBidWYuZ2V0Q2hhcigpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvcHkgYSBTdHJpbmcgaW50byBhIEJ5dGVCdWZmZXIuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgcHV0U3RyaW5nKEJ5dGVCdWZmZXIgYnVmLCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICBidWYucHV0Q2hhcihzdHIuY2hhckF0KGkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgNC1jaGFyYWN0ZXIgc3RyaW5nIHRvIGEgMzItYml0IHR5cGUuCi0gICAgICovCi0gICAgc3RhdGljIGludCB0eXBlKFN0cmluZyB0eXBlTmFtZSkgewotICAgICAgICBpbnQgdmFsID0gMDsKLQotICAgICAgICBpZiAodHlwZU5hbWUubGVuZ3RoKCkgIT0gNCkgewotICAgICAgICAgICAgTG9nLmUoImRkbXMiLCAiVHlwZSBuYW1lIG11c3QgYmUgNCBsZXR0ZXIgbG9uZyIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlR5cGUgbmFtZSBtdXN0IGJlIDQgbGV0dGVyIGxvbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWwgPDw9IDg7Ci0gICAgICAgICAgICB2YWwgfD0gKGJ5dGUpIHR5cGVOYW1lLmNoYXJBdChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhbiBpbnRlZ2VyIHR5cGUgdG8gYSA0LWNoYXJhY3RlciBzdHJpbmcuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBuYW1lKGludCB0eXBlKSB7Ci0gICAgICAgIGNoYXJbXSBhc2NpaSA9IG5ldyBjaGFyWzRdOwotCi0gICAgICAgIGFzY2lpWzBdID0gKGNoYXIpICgodHlwZSA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgYXNjaWlbMV0gPSAoY2hhcikgKCh0eXBlID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICBhc2NpaVsyXSA9IChjaGFyKSAoKHR5cGUgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgYXNjaWlbM10gPSAoY2hhcikgKHR5cGUgJiAweGZmKTsKLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhhc2NpaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYSBCeXRlQnVmZmVyIHdpdGggZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIEpEV1AgcGFja2V0Ci0gICAgICogaGVhZGVyIGFuZCBvbmUgY2h1bmsgaGVhZGVyIGluIGFkZGl0aW9uIHRvIHRoZSBkZW1hbmRzIG9mIHRoZQotICAgICAqIGNodW5rIGJlaW5nIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiAibWF4Q2h1bmtMZW4iIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmsgY29udGVudHMgb25seS4KLSAgICAgKi8KLSAgICBzdGF0aWMgQnl0ZUJ1ZmZlciBhbGxvY0J1ZmZlcihpbnQgbWF4Q2h1bmtMZW4pIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPQotICAgICAgICAgICAgQnl0ZUJ1ZmZlci5hbGxvY2F0ZShKZHdwUGFja2V0LkpEV1BfSEVBREVSX0xFTiArIDggK21heENodW5rTGVuKTsKLSAgICAgICAgYnVmLm9yZGVyKENIVU5LX09SREVSKTsKLSAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNsaWNlIG9mIHRoZSBKRFdQIHBhY2tldCBidWZmZXIgdGhhdCBob2xkcyBqdXN0IHRoZQotICAgICAqIGNodW5rIGRhdGEuCi0gICAgICovCi0gICAgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0Q2h1bmtEYXRhQnVmKEJ5dGVCdWZmZXIgamR3cEJ1ZikgewotICAgICAgICBCeXRlQnVmZmVyIHNsaWNlOwotCi0gICAgICAgIGFzc2VydCBqZHdwQnVmLnBvc2l0aW9uKCkgPT0gMDsKLQotICAgICAgICBqZHdwQnVmLnBvc2l0aW9uKEpkd3BQYWNrZXQuSkRXUF9IRUFERVJfTEVOICsgQ0hVTktfSEVBREVSX0xFTik7Ci0gICAgICAgIHNsaWNlID0gamR3cEJ1Zi5zbGljZSgpOwotICAgICAgICBzbGljZS5vcmRlcihDSFVOS19PUkRFUik7Ci0gICAgICAgIGpkd3BCdWYucG9zaXRpb24oMCk7Ci0KLSAgICAgICAgcmV0dXJuIHNsaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBjaHVuayBoZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjaHVuay4KLSAgICAgKgotICAgICAqIFBhc3MgaW4gdGhlIGJ5dGUgYnVmZmVyIHJldHVybmVkIGJ5IEpkd3BQYWNrZXQuZ2V0UGF5bG9hZCgpLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGZpbmlzaENodW5rUGFja2V0KEpkd3BQYWNrZXQgcGFja2V0LCBpbnQgdHlwZSwgaW50IGNodW5rTGVuKSB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gcGFja2V0LmdldFBheWxvYWQoKTsKLQotICAgICAgICBidWYucHV0SW50KDB4MDAsIHR5cGUpOwotICAgICAgICBidWYucHV0SW50KDB4MDQsIGNodW5rTGVuKTsKLQotICAgICAgICBwYWNrZXQuZmluaXNoUGFja2V0KENIVU5LX0hFQURFUl9MRU4gKyBjaHVua0xlbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGlzIG9wZW5lZCB3aXRoIHRoZSBwcm9wZXIgZGVidWdnZXIgcG9ydCBmb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIGFwcGxpY2F0aW9uIG5hbWUsIGFuZCBpZiBub3QsIHJlb3BlbiBpdC4KLSAgICAgKiBAcGFyYW0gY2xpZW50Ci0gICAgICogQHBhcmFtIHVpVGhyZWFkCi0gICAgICogQHBhcmFtIGFwcE5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDbGllbnQgY2hlY2tEZWJ1Z2dlclBvcnRGb3JBcHBOYW1lKENsaWVudCBjbGllbnQsIFN0cmluZyBhcHBOYW1lKSB7Ci0gICAgICAgIElEZWJ1Z1BvcnRQcm92aWRlciBwcm92aWRlciA9IERlYnVnUG9ydE1hbmFnZXIuZ2V0UHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIERldmljZSBkZXZpY2UgPSBjbGllbnQuZ2V0RGV2aWNlSW1wbCgpOwotICAgICAgICAgICAgaW50IG5ld1BvcnQgPSBwcm92aWRlci5nZXRQb3J0KGRldmljZSwgYXBwTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChuZXdQb3J0ICE9IElEZWJ1Z1BvcnRQcm92aWRlci5OT19TVEFUSUNfUE9SVCAmJgotICAgICAgICAgICAgICAgICAgICBuZXdQb3J0ICE9IGNsaWVudC5nZXREZWJ1Z2dlckxpc3RlblBvcnQoKSkgewotCi0gICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSA9IEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRCcmlkZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnJpZGdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlTW9uaXRvciBkZXZpY2VNb25pdG9yID0gYnJpZGdlLmdldERldmljZU1vbml0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZU1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTW9uaXRvci5hZGRDbGllbnRUb0Ryb3BBbmRSZW9wZW4oY2xpZW50LCBuZXdQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xpZW50OwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0NsaWVudC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVmYTE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YS5NZXRob2RQcm9maWxpbmdTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkRlYnVnUG9ydE1hbmFnZXIuSURlYnVnUG9ydFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSUNsaWVudENoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHNpbmdsZSBjbGllbnQsIHVzdWFsbHkgYSBEQWx2aWsgVk0gcHJvY2Vzcy4KLSAqIDxwLz5UaGlzIGNsYXNzIGdpdmVzIGFjY2VzcyB0byBiYXNpYyBjbGllbnQgaW5mb3JtYXRpb24sIGFzIHdlbGwgYXMgbWV0aG9kcyB0byBwZXJmb3JtIGFjdGlvbnMKLSAqIG9uIHRoZSBjbGllbnQuCi0gKiA8cC8+TW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgdXN1YWxseSB1cGRhdGVkIGluIHJlYWwgdGltZSwgY2FuIGJlIGFjY2VzcyB0aHJvdWdoIHRoZQotICoge0BsaW5rIENsaWVudERhdGF9IGNsYXNzLiBFYWNoIDxjb2RlPkNsaWVudDwvY29kZT4gb2JqZWN0IGhhcyBpdHMgb3duIDxjb2RlPkNsaWVudERhdGE8L2NvZGU+Ci0gKiBhY2Nlc3NlZCB0aHJvdWdoIHtAbGluayAjZ2V0Q2xpZW50RGF0YSgpfS4KLSAqLwotcHVibGljIGNsYXNzIENsaWVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX1BST1RPQ09MX1ZFUlNJT04gPSAxOwotCi0gICAgLyoqIENsaWVudCBjaGFuZ2UgYml0IG1hc2s6IGFwcGxpY2F0aW9uIG5hbWUgY2hhbmdlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX05BTUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOwotICAgIC8qKiBDbGllbnQgY2hhbmdlIGJpdCBtYXNrOiBkZWJ1Z2dlciBzdGF0dXMgY2hhbmdlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0RFQlVHR0VSX1NUQVRVUyAgICAgICAgICAgID0gMHgwMDAyOwotICAgIC8qKiBDbGllbnQgY2hhbmdlIGJpdCBtYXNrOiBkZWJ1Z2dlciBwb3J0IGNoYW5nZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNDsKLSAgICAvKiogQ2xpZW50IGNoYW5nZSBiaXQgbWFzazogdGhyZWFkIHVwZGF0ZSBmbGFnIGNoYW5nZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9USFJFQURfTU9ERSAgICAgICAgICAgICAgICA9IDB4MDAwODsKLSAgICAvKiogQ2xpZW50IGNoYW5nZSBiaXQgbWFzazogdGhyZWFkIGRhdGEgdXBkYXRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9USFJFQURfREFUQSAgICAgICAgICAgICAgICA9IDB4MDAxMDsKLSAgICAvKiogQ2xpZW50IGNoYW5nZSBiaXQgbWFzazogaGVhcCB1cGRhdGUgZmxhZyBjaGFuZ2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfSEVBUF9NT0RFICAgICAgICAgICAgICAgICAgPSAweDAwMjA7Ci0gICAgLyoqIENsaWVudCBjaGFuZ2UgYml0IG1hc2s6IGhlYWQgZGF0YSB1cGRhdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0hFQVBfREFUQSAgICAgICAgICAgICAgICAgID0gMHgwMDQwOwotICAgIC8qKiBDbGllbnQgY2hhbmdlIGJpdCBtYXNrOiBuYXRpdmUgaGVhcCBkYXRhIHVwZGF0ZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfTkFUSVZFX0hFQVBfREFUQSAgICAgICAgICAgPSAweDAwODA7Ci0gICAgLyoqIENsaWVudCBjaGFuZ2UgYml0IG1hc2s6IHRocmVhZCBzdGFjayB0cmFjZSB1cGRhdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1RIUkVBRF9TVEFDS1RSQUNFICAgICAgICAgID0gMHgwMTAwOwotICAgIC8qKiBDbGllbnQgY2hhbmdlIGJpdCBtYXNrOiBhbGxvY2F0aW9uIGluZm9ybWF0aW9uIHVwZGF0ZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfSEVBUF9BTExPQ0FUSU9OUyAgICAgICAgICAgPSAweDAyMDA7Ci0gICAgLyoqIENsaWVudCBjaGFuZ2UgYml0IG1hc2s6IGFsbG9jYXRpb24gaW5mb3JtYXRpb24gdXBkYXRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9IRUFQX0FMTE9DQVRJT05fU1RBVFVTICAgICA9IDB4MDQwMDsKLSAgICAvKiogQ2xpZW50IGNoYW5nZSBiaXQgbWFzazogYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiB1cGRhdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX01FVEhPRF9QUk9GSUxJTkdfU1RBVFVTICAgID0gMHgwODAwOwotCi0gICAgLyoqIENsaWVudCBjaGFuZ2UgYml0IG1hc2s6IGNvbWJpbmF0aW9uIG9mIHtAbGluayBDbGllbnQjQ0hBTkdFX05BTUV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX0RFQlVHR0VSX1NUQVRVU30sIGFuZCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9QT1JUfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfSU5GTyA9IENIQU5HRV9OQU1FIHwgQ0hBTkdFX0RFQlVHR0VSX1NUQVRVUyB8IENIQU5HRV9QT1JUOwotCi0gICAgcHJpdmF0ZSBTb2NrZXRDaGFubmVsIG1DaGFuOwotCi0gICAgLy8gZGVidWdnZXIgd2UncmUgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkKLSAgICBwcml2YXRlIERlYnVnZ2VyIG1EZWJ1Z2dlcjsKLSAgICBwcml2YXRlIGludCBtRGVidWdnZXJMaXN0ZW5Qb3J0OwotCi0gICAgLy8gbGlzdCBvZiBJRHMgZm9yIHJlcXVlc3RzIHdlIGhhdmUgc2VudCB0byB0aGUgY2xpZW50Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsQ2h1bmtIYW5kbGVyPiBtT3V0c3RhbmRpbmdSZXFzOwotCi0gICAgLy8gY2h1bmsgaGFuZGxlcnMgc3Rhc2ggc3RhdGUgZGF0YSBpbiBoZXJlCi0gICAgcHJpdmF0ZSBDbGllbnREYXRhIG1DbGllbnREYXRhOwotCi0gICAgLy8gVXNlciBpbnRlcmZhY2Ugc3RhdGUuICBDaGFuZ2luZyB0aGUgdmFsdWUgY2F1c2VzIGEgbWVzc2FnZSB0byBiZQotICAgIC8vIHNlbnQgdG8gdGhlIGNsaWVudC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRocmVhZFVwZGF0ZUVuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IZWFwVXBkYXRlRW5hYmxlZDsKLQotICAgIC8qCi0gICAgICogUmVhZC93cml0ZSBidWZmZXJzLiAgV2UgY2FuIGdldCBsYXJnZSBxdWFudGl0aWVzIG9mIGRhdGEgZnJvbSB0aGUKLSAgICAgKiBjbGllbnQsIGUuZy4gdGhlIHJlc3BvbnNlIHRvIGEgImdpdmUgbWUgdGhlIGxpc3Qgb2YgYWxsIGtub3duIGNsYXNzZXMiCi0gICAgICogcmVxdWVzdCBmcm9tIHRoZSBkZWJ1Z2dlci4gIFJlcXVlc3RzIGZyb20gdGhlIGRlYnVnZ2VyLCBhbmQgZnJvbSB1cywKLSAgICAgKiBhcmUgbXVjaCBzbWFsbGVyLgotICAgICAqCi0gICAgICogUGFzcy10aHJvdWdoIGRlYnVnZ2VyIHRyYWZmaWMgaXMgc2VudCB3aXRob3V0IGNvcHlpbmcuICAibVdyaXRlQnVmZmVyIgotICAgICAqIGlzIG9ubHkgdXNlZCBmb3IgZGF0YSBnZW5lcmF0ZWQgd2l0aGluIENsaWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9CVUZfU0laRSA9IDIqMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMjAwKjEwMjQqMTAyNDsKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbVJlYWRCdWZmZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1JJVEVfQlVGX1NJWkUgPSAyNTY7Ci0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1Xcml0ZUJ1ZmZlcjsKLQotICAgIHByaXZhdGUgRGV2aWNlIG1EZXZpY2U7Ci0KLSAgICBwcml2YXRlIGludCBtQ29ublN0YXRlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUX0lOSVQgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUX05PVF9KRFdQICAgICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUX0FXQUlUX1NIQUtFICA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVF9ORUVEX0RETV9QS1QgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RfTk9UX0RETSAgICAgID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUX1JFQURZICAgICAgICA9IDEzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVF9FUlJPUiAgICAgICAgPSAyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RfRElTQ09OTkVDVEVEID0gMjE7Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBvYmplY3QgZm9yIGEgbmV3IGNsaWVudCBjb25uZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRoaXMgY2xpZW50IGJlbG9uZ3MgdG8KLSAgICAgKiBAcGFyYW0gY2hhbiB0aGUgY29ubmVjdGVkIHtAbGluayBTb2NrZXRDaGFubmVsfS4KLSAgICAgKiBAcGFyYW0gcGlkIHRoZSBjbGllbnQgcGlkLgotICAgICAqLwotICAgIENsaWVudChEZXZpY2UgZGV2aWNlLCBTb2NrZXRDaGFubmVsIGNoYW4sIGludCBwaWQpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgbUNoYW4gPSBjaGFuOwotCi0gICAgICAgIG1SZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShJTklUSUFMX0JVRl9TSVpFKTsKLSAgICAgICAgbVdyaXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShXUklURV9CVUZfU0laRSk7Ci0KLSAgICAgICAgbU91dHN0YW5kaW5nUmVxcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsQ2h1bmtIYW5kbGVyPigpOwotCi0gICAgICAgIG1Db25uU3RhdGUgPSBTVF9JTklUOwotCi0gICAgICAgIG1DbGllbnREYXRhID0gbmV3IENsaWVudERhdGEocGlkKTsKLQotICAgICAgICBtVGhyZWFkVXBkYXRlRW5hYmxlZCA9IERkbVByZWZlcmVuY2VzLmdldEluaXRpYWxUaHJlYWRVcGRhdGUoKTsKLSAgICAgICAgbUhlYXBVcGRhdGVFbmFibGVkID0gRGRtUHJlZmVyZW5jZXMuZ2V0SW5pdGlhbEhlYXBVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgQ2xpZW50fSBvYmplY3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJbQ2xpZW50IHBpZDogIiArIG1DbGllbnREYXRhLmdldFBpZCgpICsgIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJRGV2aWNlfSBvbiB3aGljaCB0aGlzIENsaWVudCBpcyBydW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBJRGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHtAbGluayBEZXZpY2V9IG9uIHdoaWNoIHRoaXMgQ2xpZW50IGlzIHJ1bm5pbmcuCi0gICAgICovCi0gICAgRGV2aWNlIGdldERldmljZUltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlYnVnZ2VyIHBvcnQgZm9yIHRoaXMgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdnZXJMaXN0ZW5Qb3J0KCkgewotICAgICAgICByZXR1cm4gbURlYnVnZ2VyTGlzdGVuUG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGllbnQgVk0gaXMgRERNLWF3YXJlLgotICAgICAqCi0gICAgICogQ2FsbGluZyBoZXJlIGlzIG9ubHkgYWxsb3dlZCBhZnRlciB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbgotICAgICAqIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGRtQXdhcmUoKSB7Ci0gICAgICAgIHN3aXRjaCAobUNvbm5TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVF9JTklUOgotICAgICAgICAgICAgY2FzZSBTVF9OT1RfSkRXUDoKLSAgICAgICAgICAgIGNhc2UgU1RfQVdBSVRfU0hBS0U6Ci0gICAgICAgICAgICBjYXNlIFNUX05FRURfRERNX1BLVDoKLSAgICAgICAgICAgIGNhc2UgU1RfTk9UX0RETToKLSAgICAgICAgICAgIGNhc2UgU1RfRVJST1I6Ci0gICAgICAgICAgICBjYXNlIFNUX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBjYXNlIFNUX1JFQURZOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGRlYnVnZ2VyIGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWdnZXJBdHRhY2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1EZWJ1Z2dlci5pc0RlYnVnZ2VyQXR0YWNoZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIERlYnVnZ2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGllbnQuCi0gICAgICovCi0gICAgRGVidWdnZXIgZ2V0RGVidWdnZXIoKSB7Ci0gICAgICAgIHJldHVybiBtRGVidWdnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENsaWVudERhdGF9IG9iamVjdCBjb250YWluaW5nIHRoaXMgY2xpZW50IGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnREYXRhIGdldENsaWVudERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtQ2xpZW50RGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZXMgdGhlIGNsaWVudCB0byBleGVjdXRlIGl0cyBnYXJiYWdlIGNvbGxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlR2FyYmFnZUNvbGxlY3RvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhbmRsZUhlYXAuc2VuZEhQR0ModGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiU2VuZCBvZiBIUEdDIG1lc3NhZ2UgZmFpbGVkIik7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoZSBWTSBkdW1wIGFuIEhQUk9GIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkdW1wSHByb2YoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZSA9ICIvc2RjYXJkLyIgKyBtQ2xpZW50RGF0YS5nZXRDbGllbnREZXNjcmlwdGlvbigpLnJlcGxhY2VBbGwoIlxcOi4qIiwgIiIpICsKLSAgICAgICAgICAgICAgICAiLmhwcm9mIjsKLSAgICAgICAgICAgIEhhbmRsZUhlYXAuc2VuZEhQRFUodGhpcywgZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIlNlbmQgb2YgSFBEVSBtZXNzYWdlIGZhaWxlZCIpOwotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b2dnbGVNZXRob2RQcm9maWxpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsaWVudERhdGEuZ2V0TWV0aG9kUHJvZmlsaW5nU3RhdHVzKCkgPT0gTWV0aG9kUHJvZmlsaW5nU3RhdHVzLk9OKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlUHJvZmlsaW5nLnNlbmRNUFJFKHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9ICIvc2RjYXJkLyIgKyBtQ2xpZW50RGF0YS5nZXRDbGllbnREZXNjcmlwdGlvbigpLnJlcGxhY2VBbGwoIlxcOi4qIiwgIiIpICsKLSAgICAgICAgICAgICAgICAiLnRyYWNlIjsKLSAgICAgICAgICAgICAgICBIYW5kbGVQcm9maWxpbmcuc2VuZE1QUlModGhpcywgZmlsZSwgOCoxMDI0KjEwMjQsIDAgLypmbGFncyovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiVG9nZ2xlIG1ldGhvZCBwcm9maWxpbmcgZmFpbGVkIik7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgVk0gdG8gc2VuZCB0aGUgZW5hYmxlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIHByb2ZpbGluZy4KLSAgICAgKiBUaGlzIGlzIGFzeW5jaHJvbm91cy4KLSAgICAgKiA8cC8+VGhlIGFsbG9jYXRpb24gc3RhdHVzIGNhbiBiZSBhY2Nlc3NlZCBieSB7QGxpbmsgQ2xpZW50RGF0YSNnZXRBbGxvY2F0aW9uU3RhdHVzKCl9LgotICAgICAqIFRoZSBub3RpZmljYXRpb24gdGhhdCB0aGUgbmV3IHN0YXR1cyBpcyBhdmFpbGFibGUgd2lsbCBiZSByZWNlaXZlZCB0aHJvdWdoCi0gICAgICoge0BsaW5rIElDbGllbnRDaGFuZ2VMaXN0ZW5lciNjbGllbnRDaGFuZ2VkKENsaWVudCwgaW50KX0gd2l0aCBhIDxjb2RlPmNoYW5nZU1hc2s8L2NvZGU+Ci0gICAgICogY29udGFpbmluZyB0aGUgbWFzayB7QGxpbmsgI0NIQU5HRV9IRUFQX0FMTE9DQVRJT05fU1RBVFVTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TWV0aG9kUHJvZmlsaW5nU3RhdHVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFuZGxlSGVhcC5zZW5kUkVBUSh0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoImRkbWxpYiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB0aHJlYWQgdXBkYXRlLgotICAgICAqIDxwLz5JZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgVk0gd2lsbCBiZSBhYmxlIHRvIHNlbmQgdGhyZWFkIGluZm9ybWF0aW9uLiBUaHJlYWQgaW5mb3JtYXRpb24KLSAgICAgKiBtdXN0IGJlIHJlcXVlc3RlZCB3aXRoIHtAbGluayAjcmVxdWVzdFRocmVhZFVwZGF0ZSgpfS4KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCB0aGUgZW5hYmxlIGZsYWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGhyZWFkVXBkYXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgbVRocmVhZFVwZGF0ZUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICBpZiAoZW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbUNsaWVudERhdGEuY2xlYXJUaHJlYWRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFuZGxlVGhyZWFkLnNlbmRUSEVOKHRoaXMsIGVuYWJsZWQpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBpdCBoZXJlOyBjbGllbnQgd2lsbCBjbGVhbiB1cCBzaG9ydGx5Ci0gICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGUoQ0hBTkdFX1RIUkVBRF9NT0RFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRocmVhZCB1cGRhdGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RocmVhZFVwZGF0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGhyZWFkVXBkYXRlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHRocmVhZCB1cGRhdGUgcmVxdWVzdC4gVGhpcyBpcyBhc3luY2hyb25vdXMuCi0gICAgICogPHAvPlRoZSB0aHJlYWQgaW5mbyBjYW4gYmUgYWNjZXNzZWQgYnkge0BsaW5rIENsaWVudERhdGEjZ2V0VGhyZWFkcygpfS4gVGhlIG5vdGlmaWNhdGlvbgotICAgICAqIHRoYXQgdGhlIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSB3aWxsIGJlIHJlY2VpdmVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgSUNsaWVudENoYW5nZUxpc3RlbmVyI2NsaWVudENoYW5nZWQoQ2xpZW50LCBpbnQpfSB3aXRoIGEgPGNvZGU+Y2hhbmdlTWFzazwvY29kZT4KLSAgICAgKiBjb250YWluaW5nIHRoZSBtYXNrIHtAbGluayAjQ0hBTkdFX1RIUkVBRF9EQVRBfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VGhyZWFkVXBkYXRlKCkgewotICAgICAgICBIYW5kbGVUaHJlYWQucmVxdWVzdFRocmVhZFVwZGF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHRocmVhZCBzdGFjayB0cmFjZSB1cGRhdGUgcmVxdWVzdC4gVGhpcyBpcyBhc3luY2hyb25vdXMuCi0gICAgICogPHAvPlRoZSB0aHJlYWQgaW5mbyBjYW4gYmUgYWNjZXNzZWQgYnkge0BsaW5rIENsaWVudERhdGEjZ2V0VGhyZWFkcygpfSBhbmQKLSAgICAgKiB7QGxpbmsgVGhyZWFkSW5mbyNnZXRTdGFja1RyYWNlKCl9LgotICAgICAqIDxwLz5UaGUgbm90aWZpY2F0aW9uIHRoYXQgdGhlIG5ldyBkYXRhIGlzIGF2YWlsYWJsZQotICAgICAqIHdpbGwgYmUgcmVjZWl2ZWQgdGhyb3VnaCB7QGxpbmsgSUNsaWVudENoYW5nZUxpc3RlbmVyI2NsaWVudENoYW5nZWQoQ2xpZW50LCBpbnQpfQotICAgICAqIHdpdGggYSA8Y29kZT5jaGFuZ2VNYXNrPC9jb2RlPiBjb250YWluaW5nIHRoZSBtYXNrIHtAbGluayAjQ0hBTkdFX1RIUkVBRF9TVEFDS1RSQUNFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VGhyZWFkU3RhY2tUcmFjZShpbnQgdGhyZWFkSWQpIHsKLSAgICAgICAgSGFuZGxlVGhyZWFkLnJlcXVlc3RUaHJlYWRTdGFja0NhbGxSZWZyZXNoKHRoaXMsIHRocmVhZElkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBoZWFwIHVwZGF0ZS4KLSAgICAgKiA8cC8+SWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFueSBHQyB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gc2VuZCBpdHMgaGVhcCBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cC8+VGhlIGhlYXAgaW5mb3JtYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGJ5IHtAbGluayBDbGllbnREYXRhI2dldFZtSGVhcERhdGEoKX0uCi0gICAgICogPHAvPlRoZSBub3RpZmljYXRpb24gdGhhdCB0aGUgbmV3IGRhdGEgaXMgYXZhaWxhYmxlCi0gICAgICogd2lsbCBiZSByZWNlaXZlZCB0aHJvdWdoIHtAbGluayBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCl9Ci0gICAgICogd2l0aCBhIDxjb2RlPmNoYW5nZU1hc2s8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHZhbHVlIHtAbGluayAjQ0hBTkdFX0hFQVBfREFUQX0uCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdGhlIGVuYWJsZSBmbGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhcFVwZGF0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1IZWFwVXBkYXRlRW5hYmxlZCA9IGVuYWJsZWQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhbmRsZUhlYXAuc2VuZEhQSUYodGhpcywKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA/IEhhbmRsZUhlYXAuSFBJRl9XSEVOX0VWRVJZX0dDIDogSGFuZGxlSGVhcC5IUElGX1dIRU5fTkVWRVIpOwotCi0gICAgICAgICAgICBIYW5kbGVIZWFwLnNlbmRIUFNHKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPyBIYW5kbGVIZWFwLldIRU5fR0MgOiBIYW5kbGVIZWFwLldIRU5fRElTQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlSGVhcC5XSEFUX01FUkdFKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgaXQgaGVyZTsgY2xpZW50IHdpbGwgY2xlYW4gdXAgc2hvcnRseQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlKENIQU5HRV9IRUFQX01PREUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaGVhcCB1cGRhdGUgaXMgZW5hYmxlZC4KLSAgICAgKiBAc2VlICNzZXRIZWFwVXBkYXRlRW5hYmxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhcFVwZGF0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhcFVwZGF0ZUVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBuYXRpdmUgaGVhcCB1cGRhdGUgcmVxdWVzdC4gdGhpcyBpcyBhc3luY2hyb25vdXMuCi0gICAgICogPHAvPlRoZSBuYXRpdmUgaGVhcCBpbmZvIGNhbiBiZSBhY2Nlc3NlZCBieSB7QGxpbmsgQ2xpZW50RGF0YSNnZXROYXRpdmVBbGxvY2F0aW9uTGlzdCgpfS4KLSAgICAgKiBUaGUgbm90aWZpY2F0aW9uIHRoYXQgdGhlIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSB3aWxsIGJlIHJlY2VpdmVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgSUNsaWVudENoYW5nZUxpc3RlbmVyI2NsaWVudENoYW5nZWQoQ2xpZW50LCBpbnQpfSB3aXRoIGEgPGNvZGU+Y2hhbmdlTWFzazwvY29kZT4KLSAgICAgKiBjb250YWluaW5nIHRoZSBtYXNrIHtAbGluayAjQ0hBTkdFX05BVElWRV9IRUFQX0RBVEF9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3ROYXRpdmVIZWFwSW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIYW5kbGVOYXRpdmVIZWFwLnNlbmROSEdUKHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKCJkZG1saWIiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBbGxvY2F0aW9uIHRyYWNrZXIgZm9yIHRoaXMgY2xpZW50LgotICAgICAqIDxwLz5JZiBlbmFibGVkLCB0aGUgVk0gd2lsbCBzdGFydCB0cmFja2luZyBhbGxvY2F0aW9uIGluZm9ybWF0aW9ucy4gQSBjYWxsIHRvCi0gICAgICoge0BsaW5rICNyZXF1ZXN0QWxsb2NhdGlvbkRldGFpbHMoKX0gd2lsbCBtYWtlIHRoZSBWTSBzZW5kcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZQotICAgICAqIGFsbG9jYXRpb25zIHRoYXQgaGFwcGVuZWQgYmV0d2VlbiB0aGUgZW5hYmxpbmcgYW5kIHRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBlbmFibGUKLSAgICAgKiBAc2VlICNyZXF1ZXN0QWxsb2NhdGlvbkRldGFpbHMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUFsbG9jYXRpb25UcmFja2VyKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIYW5kbGVIZWFwLnNlbmRSRUFFKHRoaXMsIGVuYWJsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKCJkZG1saWIiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgVk0gdG8gc2VuZCB0aGUgZW5hYmxlIHN0YXR1cyBvZiB0aGUgYWxsb2NhdGlvbiB0cmFja2luZy4KLSAgICAgKiBUaGlzIGlzIGFzeW5jaHJvbm91cy4KLSAgICAgKiA8cC8+VGhlIGFsbG9jYXRpb24gc3RhdHVzIGNhbiBiZSBhY2Nlc3NlZCBieSB7QGxpbmsgQ2xpZW50RGF0YSNnZXRBbGxvY2F0aW9uU3RhdHVzKCl9LgotICAgICAqIFRoZSBub3RpZmljYXRpb24gdGhhdCB0aGUgbmV3IHN0YXR1cyBpcyBhdmFpbGFibGUgd2lsbCBiZSByZWNlaXZlZCB0aHJvdWdoCi0gICAgICoge0BsaW5rIElDbGllbnRDaGFuZ2VMaXN0ZW5lciNjbGllbnRDaGFuZ2VkKENsaWVudCwgaW50KX0gd2l0aCBhIDxjb2RlPmNoYW5nZU1hc2s8L2NvZGU+Ci0gICAgICogY29udGFpbmluZyB0aGUgbWFzayB7QGxpbmsgI0NIQU5HRV9IRUFQX0FMTE9DQVRJT05fU1RBVFVTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0QWxsb2NhdGlvblN0YXR1cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhbmRsZUhlYXAuc2VuZFJFQVEodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKCJkZG1saWIiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgVk0gdG8gc2VuZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBhbGxvY2F0aW9ucyB0aGF0IGhhdmUKLSAgICAgKiBoYXBwZW5lZCBzaW5jZSB0aGUgY2FsbCB0byB7QGxpbmsgI2VuYWJsZUFsbG9jYXRpb25UcmFja2VyKGJvb2xlYW4pfSB3aXRoIDx2YXI+ZW5hYmxlPC92YXI+Ci0gICAgICogc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGlzIGFzeW5jaHJvbm91cy4KLSAgICAgKiA8cC8+VGhlIGFsbG9jYXRpb24gaW5mb3JtYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGJ5IHtAbGluayBDbGllbnREYXRhI2dldEFsbG9jYXRpb25zKCl9LgotICAgICAqIFRoZSBub3RpZmljYXRpb24gdGhhdCB0aGUgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIHdpbGwgYmUgcmVjZWl2ZWQgdGhyb3VnaAotICAgICAqIHtAbGluayBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCl9IHdpdGggYSA8Y29kZT5jaGFuZ2VNYXNrPC9jb2RlPgotICAgICAqIGNvbnRhaW5pbmcgdGhlIG1hc2sge0BsaW5rICNDSEFOR0VfSEVBUF9BTExPQ0FUSU9OU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdEFsbG9jYXRpb25EZXRhaWxzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFuZGxlSGVhcC5zZW5kUkVBTCh0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoImRkbWxpYiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBraWxsIG1lc3NhZ2UgdG8gdGhlIFZNLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGtpbGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIYW5kbGVFeGl0LnNlbmRFWElUKHRoaXMsIDEpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIlNlbmQgb2YgRVhJVCBtZXNzYWdlIGZhaWxlZCIpOwotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIGNsaWVudCB3aXRoIGEgU2VsZWN0b3IuCi0gICAgICovCi0gICAgdm9pZCByZWdpc3RlcihTZWxlY3RvciBzZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtQ2hhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hhbi5yZWdpc3RlcihzZWwsIFNlbGVjdGlvbktleS5PUF9SRUFELCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNsaWVudCB0byBhY2NlcHQgZGVidWdnZXIgY29ubmVjdGlvbiBvbiB0aGUgInNlbGVjdGVkIGRlYnVnZ2VyIHBvcnQiLgotICAgICAqCi0gICAgICogQHNlZSBBbmRyb2lkRGVidWdCcmlkZ2Ujc2V0U2VsZWN0ZWRDbGllbnQoQ2xpZW50KQotICAgICAqIEBzZWUgRGRtUHJlZmVyZW5jZXMjc2V0U2VsZWN0ZWREZWJ1Z1BvcnQoaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFzU2VsZWN0ZWRDbGllbnQoKSB7Ci0gICAgICAgIE1vbml0b3JUaHJlYWQgbW9uaXRvclRocmVhZCA9IE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1vbml0b3JUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvclRocmVhZC5zZXRTZWxlY3RlZENsaWVudCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNsaWVudCBpcyB0aGUgY3VycmVudCBzZWxlY3RlZCBjbGllbnQsIGFjY2VwdGluZyBkZWJ1Z2dlciBjb25uZWN0aW9uCi0gICAgICogb24gdGhlICJzZWxlY3RlZCBkZWJ1Z2dlciBwb3J0Ii4KLSAgICAgKgotICAgICAqIEBzZWUgI3NldEFzU2VsZWN0ZWRDbGllbnQoKQotICAgICAqIEBzZWUgQW5kcm9pZERlYnVnQnJpZGdlI3NldFNlbGVjdGVkQ2xpZW50KENsaWVudCkKLSAgICAgKiBAc2VlIERkbVByZWZlcmVuY2VzI3NldFNlbGVjdGVkRGVidWdQb3J0KGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkQ2xpZW50KCkgewotICAgICAgICBNb25pdG9yVGhyZWFkIG1vbml0b3JUaHJlYWQgPSBNb25pdG9yVGhyZWFkLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChtb25pdG9yVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtb25pdG9yVGhyZWFkLmdldFNlbGVjdGVkQ2xpZW50KCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIHNlcnZlciBzb2NrZXQgY2hhbm5lbCBhbmQgbGlzdGVuIGZvcgotICAgICAqIGNvbm5lY3Rpb25zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICAgKi8KLSAgICB2b2lkIGxpc3RlbkZvckRlYnVnZ2VyKGludCBsaXN0ZW5Qb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtRGVidWdnZXJMaXN0ZW5Qb3J0ID0gbGlzdGVuUG9ydDsKLSAgICAgICAgbURlYnVnZ2VyID0gbmV3IERlYnVnZ2VyKHRoaXMsIGxpc3RlblBvcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIHRoZSBKRFdQIGhhbmRzaGFrZS4KLSAgICAgKgotICAgICAqIE9uIGZhaWx1cmUsIGNsb3NlcyB0aGUgc29ja2V0IGFuZCByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gc2VuZEhhbmRzaGFrZSgpIHsKLSAgICAgICAgYXNzZXJ0IG1Xcml0ZUJ1ZmZlci5wb3NpdGlvbigpID09IDA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGFzc3VtZSB3cml0ZSBidWZmZXIgY2FuIGhvbGQgMTQgYnl0ZXMKLSAgICAgICAgICAgIEpkd3BQYWNrZXQucHV0SGFuZHNoYWtlKG1Xcml0ZUJ1ZmZlcik7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRMZW4gPSBtV3JpdGVCdWZmZXIucG9zaXRpb24oKTsKLSAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlci5mbGlwKCk7Ci0gICAgICAgICAgICBpZiAobUNoYW4ud3JpdGUobVdyaXRlQnVmZmVyKSAhPSBleHBlY3RlZExlbikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInBhcnRpYWwgaGFuZHNoYWtlIHdyaXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgTG9nLmUoImRkbXMtY2xpZW50IiwgIklPIGVycm9yIGR1cmluZyBoYW5kc2hha2U6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIG1Db25uU3RhdGUgPSBTVF9FUlJPUjsKLSAgICAgICAgICAgIGNsb3NlKHRydWUgLyogbm90aWZ5ICovKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlci5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbm5TdGF0ZSA9IFNUX0FXQUlUX1NIQUtFOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VuZCBhIG5vbi1ERE0gcGFja2V0IHRvIHRoZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBFcXVpdmFsZW50IHRvIHNlbmRBbmRDb25zdW1lKHBhY2tldCwgbnVsbCkuCi0gICAgICovCi0gICAgdm9pZCBzZW5kQW5kQ29uc3VtZShKZHdwUGFja2V0IHBhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2VuZEFuZENvbnN1bWUocGFja2V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgRERNIHBhY2tldCB0byB0aGUgY2xpZW50LgotICAgICAqCi0gICAgICogSWRlYWxseSwgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNpbmdsZSBjaGFubmVsIHdyaXRlLiAgSWYgdGhhdCBkb2Vzbid0Ci0gICAgICogaGFwcGVuLCB3ZSBoYXZlIHRvIHByZXZlbnQgYW55Ym9keSBlbHNlIGZyb20gd3JpdGluZyB0byB0aGUgY2hhbm5lbAotICAgICAqIHVudGlsIHRoaXMgcGFja2V0IGNvbXBsZXRlcywgc28gd2Ugc3luY2hyb25pemUgb24gdGhlIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBBbm90aGVyIGdvYWwgaXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYnVmZmVyIGNvcGllcywgc28gd2Ugd3JpdGUKLSAgICAgKiBkaXJlY3RseSBvdXQgb2YgdGhlIEpkd3BQYWNrZXQncyBCeXRlQnVmZmVyLgotICAgICAqLwotICAgIHZvaWQgc2VuZEFuZENvbnN1bWUoSmR3cFBhY2tldCBwYWNrZXQsIENodW5rSGFuZGxlciByZXBseUhhbmRsZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG1DaGFuID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhbiBoYXBwZW4gZm9yIGUuZy4gVEhTVCBwYWNrZXRzCi0gICAgICAgICAgICBMb2cudigiZGRtcyIsICJOb3Qgc2VuZGluZyBwYWNrZXQgLS0gY2xpZW50IGlzIGNsb3NlZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcGx5SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQWRkIHRoZSBJRCB0byB0aGUgbGlzdCBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cy4gIFdlIGhhdmUgdG8gZG8KLSAgICAgICAgICAgICAqIHRoaXMgYmVmb3JlIHNlbmRpbmcgdGhlIHBhY2tldCwgaW4gY2FzZSB0aGUgcmVzcG9uc2UgY29tZXMgYmFjawotICAgICAgICAgICAgICogYmVmb3JlIG91ciB0aHJlYWQgcmV0dXJucyBmcm9tIHRoZSBwYWNrZXQtc2VuZCBmdW5jdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYWRkUmVxdWVzdElkKHBhY2tldC5nZXRJZCgpLCByZXBseUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtQ2hhbikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYWNrZXQud3JpdGVBbmRDb25zdW1lKG1DaGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0SWQocGFja2V0LmdldElkKCkpOwotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcndhcmQgdGhlIHBhY2tldCB0byB0aGUgZGVidWdnZXIgKGlmIHN0aWxsIGNvbm5lY3RlZCB0byBvbmUpLgotICAgICAqCi0gICAgICogQ29uc3VtZXMgdGhlIHBhY2tldC4KLSAgICAgKi8KLSAgICB2b2lkIGZvcndhcmRQYWNrZXRUb0RlYnVnZ2VyKEpkd3BQYWNrZXQgcGFja2V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIERlYnVnZ2VyIGRiZyA9IG1EZWJ1Z2dlcjsKLQotICAgICAgICBpZiAoZGJnID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkRpc2NhcmRpbmcgcGFja2V0Iik7Ci0gICAgICAgICAgICBwYWNrZXQuY29uc3VtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGJnLnNlbmRBbmRDb25zdW1lKHBhY2tldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGRhdGEgZnJvbSBvdXIgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZGF0YSBpcyBrbm93biB0byBiZSBhdmFpbGFibGUsIGFuZCB3ZSBkb24ndCB5ZXQKLSAgICAgKiBoYXZlIGEgZnVsbCBwYWNrZXQgaW4gdGhlIGJ1ZmZlci4gIElmIHRoZSBidWZmZXIgaXMgYXQgY2FwYWNpdHksCi0gICAgICogZXhwYW5kIGl0LgotICAgICAqLwotICAgIHZvaWQgcmVhZCgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gewotCi0gICAgICAgIGludCBjb3VudDsKLQotICAgICAgICBpZiAobVJlYWRCdWZmZXIucG9zaXRpb24oKSA9PSBtUmVhZEJ1ZmZlci5jYXBhY2l0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobVJlYWRCdWZmZXIuY2FwYWNpdHkoKSAqIDIgPiBNQVhfQlVGX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZSgiZGRtcyIsICJFeGNlZWRlZCBNQVhfQlVGX1NJWkUhIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJFeHBhbmRpbmcgcmVhZCBidWZmZXIgdG8gIgotICAgICAgICAgICAgICAgICsgbVJlYWRCdWZmZXIuY2FwYWNpdHkoKSAqIDIpOwotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIG5ld0J1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobVJlYWRCdWZmZXIuY2FwYWNpdHkoKSAqIDIpOwotCi0gICAgICAgICAgICAvLyBjb3B5IGVudGlyZSBidWZmZXIgdG8gbmV3IGJ1ZmZlcgotICAgICAgICAgICAgbVJlYWRCdWZmZXIucG9zaXRpb24oMCk7Ci0gICAgICAgICAgICBuZXdCdWZmZXIucHV0KG1SZWFkQnVmZmVyKTsgIC8vIGxlYXZlcyAicG9zaXRpb24iIGF0IGVuZCBvZiBjb3BpZWQKLQotICAgICAgICAgICAgbVJlYWRCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBjb3VudCA9IG1DaGFuLnJlYWQobVJlYWRCdWZmZXIpOwotICAgICAgICBpZiAoY291bnQgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZWFkIGZhaWxlZCIpOwotCi0gICAgICAgIGlmIChMb2cuQ29uZmlnLkxPR1YpIExvZy52KCJkZG1zIiwgIlJlYWQgIiArIGNvdW50ICsgIiBieXRlcyBmcm9tICIgKyB0aGlzKTsKLSAgICAgICAgLy9Mb2cuaGV4RHVtcCgiZGRtcyIsIExvZy5ERUJVRywgbVJlYWRCdWZmZXIuYXJyYXkoKSwKLSAgICAgICAgLy8gICAgbVJlYWRCdWZmZXIuYXJyYXlPZmZzZXQoKSwgbVJlYWRCdWZmZXIucG9zaXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgZmlyc3QgZnVsbCBKRFdQIHBhY2tldCBpbiB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSBmdWxsIHBhY2tldCwgcmV0dXJuIG51bGwuCi0gICAgICoKLSAgICAgKiBJZiB3ZSBoYXZlbid0IHlldCByZWNlaXZlZCB0aGUgSkRXUCBoYW5kc2hha2UsIHdlIHdhdGNoIGZvciBpdCBoZXJlCi0gICAgICogYW5kIGNvbnN1bWUgaXQgd2l0aG91dCBhZG1pdHRpbmcgdG8gaGF2ZSBkb25lIHNvLiAgVXBvbiByZWNlaXB0Ci0gICAgICogd2Ugc2VuZCBvdXQgdGhlICJIRUxPIiBtZXNzYWdlLCB3aGljaCBpcyB3aHkgdGhpcyBjYW4gdGhyb3cgYW4KLSAgICAgKiBJT0V4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBKZHdwUGFja2V0IGdldEpkd3BQYWNrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9uIGVudHJ5LCB0aGUgZGF0YSBzdGFydHMgYXQgb2Zmc2V0IDAgYW5kIGVuZHMgYXQgInBvc2l0aW9uIi4KLSAgICAgICAgICogImxpbWl0IiBpcyBzZXQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtQ29ublN0YXRlID09IFNUX0FXQUlUX1NIQUtFKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIGZpcnN0IHRoaW5nIHdlIGdldCBmcm9tIHRoZSBjbGllbnQgaXMgYSByZXNwb25zZSB0byBvdXIKLSAgICAgICAgICAgICAqIGhhbmRzaGFrZS4gIEl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgcGFja2V0LCBzbyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAgKiBoYW5kbGUgaXQgc3BlY2lhbGx5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgICAgICByZXN1bHQgPSBKZHdwUGFja2V0LmZpbmRIYW5kc2hha2UobVJlYWRCdWZmZXIpOwotICAgICAgICAgICAgLy9Mb2cudigiZGRtcyIsICJmaW5kSGFuZDogIiArIHJlc3VsdCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGNhc2UgSmR3cFBhY2tldC5IQU5EU0hBS0VfR09PRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoImRkbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIkdvb2QgaGFuZHNoYWtlIGZyb20gY2xpZW50LCBzZW5kaW5nIEhFTE8gdG8gIiArIG1DbGllbnREYXRhLmdldFBpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgSmR3cFBhY2tldC5jb25zdW1lSGFuZHNoYWtlKG1SZWFkQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5TdGF0ZSA9IFNUX05FRURfRERNX1BLVDsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlSGVsbG8uc2VuZEhlbGxvQ29tbWFuZHModGhpcywgU0VSVkVSX1BST1RPQ09MX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBhbm90aGVyIHBhY2tldCBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRKZHdwUGFja2V0KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBKZHdwUGFja2V0LkhBTkRTSEFLRV9CQUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkJhZCBoYW5kc2hha2UgZnJvbSBjbGllbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKS5nZXRSZXRyeU9uQmFkSGFuZHNoYWtlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBkcm9wIHRoZSBjbGllbnQsIGJ1dCBhbHNvIGF0dGVtcHQgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGJ5IHRoZSBEZXZpY2VNb25pdG9yLgotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5nZXRNb25pdG9yKCkuYWRkQ2xpZW50VG9Ecm9wQW5kUmVvcGVuKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEZWJ1Z1BvcnRQcm92aWRlci5OT19TVEFUSUNfUE9SVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGl0IGFzIGJhZCwgY2xvc2UgdGhlIHNvY2tldCwgYW5kIGRvbid0IHJldHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29ublN0YXRlID0gU1RfTk9UX0pEV1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSh0cnVlIC8qIG5vdGlmeSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKZHdwUGFja2V0LkhBTkRTSEFLRV9OT1RZRVQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIk5vIGhhbmRzaGFrZSBmcm9tIGNsaWVudCB5ZXQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIlVua25vd24gcGFja2V0IHdoaWxlIHdhaXRpbmcgZm9yIGNsaWVudCBoYW5kc2hha2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKG1Db25uU3RhdGUgPT0gU1RfTkVFRF9ERE1fUEtUIHx8Ci0gICAgICAgICAgICBtQ29ublN0YXRlID09IFNUX05PVF9ERE0gfHwKLSAgICAgICAgICAgIG1Db25uU3RhdGUgPT0gU1RfUkVBRFkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBOb3JtYWwgcGFja2V0IHRyYWZmaWMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtUmVhZEJ1ZmZlci5wb3NpdGlvbigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nLkNvbmZpZy5MT0dWKSBMb2cudigiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICJDaGVja2luZyAiICsgbVJlYWRCdWZmZXIucG9zaXRpb24oKSArICIgYnl0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBKZHdwUGFja2V0LmZpbmRQYWNrZXQobVJlYWRCdWZmZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE5vdCBleHBlY3RpbmcgZGF0YSB3aGVuIGluIHRoaXMgc3RhdGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIlJlY2VpdmluZyBkYXRhIGluIHN0YXRlID0gIiArIG1Db25uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBJRCB0byB0aGUgbGlzdCBvZiByZXF1ZXN0IElEcyBmb3Igd2hpY2ggd2UgYXdhaXQKLSAgICAgKiBhIHJlc3BvbnNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRSZXF1ZXN0SWQoaW50IGlkLCBDaHVua0hhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1PdXRzdGFuZGluZ1JlcXMpIHsKLSAgICAgICAgICAgIGlmIChMb2cuQ29uZmlnLkxPR1YpIExvZy52KCJkZG1zIiwKLSAgICAgICAgICAgICAgICAiQWRkaW5nIHJlcSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArIiB0byBzZXQiKTsKLSAgICAgICAgICAgIG1PdXRzdGFuZGluZ1JlcXMucHV0KGlkLCBoYW5kbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgbGlzdCwgaWYgcHJlc2VudC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVJlcXVlc3RJZChpbnQgaWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtT3V0c3RhbmRpbmdSZXFzKSB7Ci0gICAgICAgICAgICBpZiAoTG9nLkNvbmZpZy5MT0dWKSBMb2cudigiZGRtcyIsCi0gICAgICAgICAgICAgICAgIlJlbW92aW5nIHJlcSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArICIgZnJvbSBzZXQiKTsKLSAgICAgICAgICAgIG1PdXRzdGFuZGluZ1JlcXMucmVtb3ZlKGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vTG9nLncoImRkbXMiLCAiUmVxdWVzdCAiICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkKLSAgICAgICAgLy8gICAgKyAiIGNvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gIiArIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSByZXNwb25zZSB0byBhIHJlcXVlc3Qgd2Ugc2VudCBlYXJsaWVyLgotICAgICAqIElmIHNvLCByZXR1cm4gdGhlIENodW5rSGFuZGxlciByZXNwb25zaWJsZS4KLSAgICAgKi8KLSAgICBDaHVua0hhbmRsZXIgaXNSZXNwb25zZVRvVXMoaW50IGlkKSB7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtT3V0c3RhbmRpbmdSZXFzKSB7Ci0gICAgICAgICAgICBDaHVua0hhbmRsZXIgaGFuZGxlciA9IG1PdXRzdGFuZGluZ1JlcXMuZ2V0KGlkKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nLkNvbmZpZy5MT0dWKSBMb2cudigiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICJGb3VuZCAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKQotICAgICAgICAgICAgICAgICAgICArICIgaW4gcmVxdWVzdCBzZXQgLSAiICsgaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlYXJsaWVyIHJlcXVlc3QgcmVzdWx0ZWQgaW4gYSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXhwZWN0ZWQKLSAgICAgKiByZXNwb25zZSB0byBhIEhFTE8gbWVzc2FnZSB3aGVuIHRhbGtpbmcgdG8gYSBub24tRERNIGNsaWVudC4KLSAgICAgKi8KLSAgICB2b2lkIHBhY2tldEZhaWxlZChKZHdwUGFja2V0IHJlcGx5KSB7Ci0gICAgICAgIGlmIChtQ29ublN0YXRlID09IFNUX05FRURfRERNX1BLVCkgewotICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiTWFya2luZyAiICsgdGhpcyArICIgYXMgbm9uLURETSBjbGllbnQiKTsKLSAgICAgICAgICAgIG1Db25uU3RhdGUgPSBTVF9OT1RfRERNOwotICAgICAgICB9IGVsc2UgaWYgKG1Db25uU3RhdGUgIT0gU1RfTk9UX0RETSkgewotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiV0VJUkQ6IGdvdCBKRFdQIGZhaWx1cmUgcGFja2V0IG9uIERETSByZXEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBNb25pdG9yVGhyZWFkIGNhbGxzIHRoaXMgd2hlbiBpdCBzZWVzIGEgRERNIHJlcXVlc3Qgb3IgcmVwbHkuCi0gICAgICogSWYgd2UgaGF2ZW4ndCBzZWVuIGEgRERNIHBhY2tldCBiZWZvcmUsIHdlIGFkdmFuY2UgdGhlIHN0YXRlIHRvCi0gICAgICogU1RfUkVBRFkgYW5kIHJldHVybiAiZmFsc2UiLiAgT3RoZXJ3aXNlLCBqdXN0IHJldHVybiB0cnVlLgotICAgICAqCi0gICAgICogVGhlIGlkZWEgaXMgdG8gbGV0IHRoZSBNb25pdG9yVGhyZWFkIGtub3cgd2hlbiB3ZSBmaXJzdCBzZWUgYSBERE0KLSAgICAgKiBwYWNrZXQsIHNvIHdlIGNhbiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBoYW5kbGVycyB3aGVuIGEgY2xpZW50Ci0gICAgICogY29ubmVjdGlvbiBpcyBtYWRlLiAgVGhpcyBtZXRob2QgaXMgc3luY2hyb25pemVkIHNvIHRoYXQgd2Ugb25seQotICAgICAqIHNlbmQgdGhlIGJyb2FkY2FzdCBvbmNlLgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCBib29sZWFuIGRkbVNlZW4oKSB7Ci0gICAgICAgIGlmIChtQ29ublN0YXRlID09IFNUX05FRURfRERNX1BLVCkgewotICAgICAgICAgICAgbUNvbm5TdGF0ZSA9IFNUX1JFQURZOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG1Db25uU3RhdGUgIT0gU1RfUkVBRFkpIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIldFSVJEOiBpbiBkZG1TZWVuIHdpdGggc3RhdGU9IiArIG1Db25uU3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBjbGllbnQgc29ja2V0IGNoYW5uZWwuICBJZiB0aGVyZSBpcyBhIGRlYnVnZ2VyIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHVzLCBjbG9zZSB0aGF0IHRvby4KLSAgICAgKgotICAgICAqIENsb3NpbmcgYSBjaGFubmVsIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlcnMgaXQgZnJvbSB0aGUgc2VsZWN0b3IuCi0gICAgICogSG93ZXZlciwgd2UgaGF2ZSB0byBpdGVyYXRlIHRocm91Z2ggdGhlIHNlbGVjdG9yIGxvb3AgYmVmb3JlIGl0Ci0gICAgICogYWN0dWFsbHkgbGV0cyB0aGVtIGdvIGFuZCBhbGxvd3MgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdG8gY2xvc2UuCi0gICAgICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBtYW5hZ2UgdGhhdC4KLSAgICAgKiBAcGFyYW0gbm90aWZ5IFdoZXRoZXIgb3Igbm90IHRvIG5vdGlmeSB0aGUgbGlzdGVuZXJzIG9mIGEgY2hhbmdlLgotICAgICAqLwotICAgIHZvaWQgY2xvc2UoYm9vbGVhbiBub3RpZnkpIHsKLSAgICAgICAgTG9nLmQoImRkbXMiLCAiQ2xvc2luZyAiICsgdGhpcy50b1N0cmluZygpKTsKLQotICAgICAgICBtT3V0c3RhbmRpbmdSZXFzLmNsZWFyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2hhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQ2hhbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGVidWdnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EZWJ1Z2dlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1EZWJ1Z2dlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiZmFpbGVkIHRvIGNsb3NlICIgKyB0aGlzKTsKLSAgICAgICAgICAgIC8vIHN3YWxsb3cgaXQgLS0gbm90IG11Y2ggZWxzZSB0byBkbwotICAgICAgICB9Ci0KLSAgICAgICAgbURldmljZS5yZW1vdmVDbGllbnQodGhpcywgbm90aWZ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB7QGxpbmsgQ2xpZW50fSBoYXMgYSB2YWxpZCBjb25uZWN0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbiBWTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbUNoYW4gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShpbnQgY2hhbmdlTWFzaykgewotICAgICAgICBtRGV2aWNlLnVwZGF0ZSh0aGlzLCBjaGFuZ2VNYXNrKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9DbGllbnREYXRhLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvQ2xpZW50RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTZmNWQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9DbGllbnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkhlYXBTZWdtZW50LkhlYXBTZWdtZW50RWxlbWVudDsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0KLS8qKgotICogQ29udGFpbnMgdGhlIGRhdGEgb2YgYSB7QGxpbmsgQ2xpZW50fS4KLSAqLwotcHVibGljIGNsYXNzIENsaWVudERhdGEgewotICAgIC8qIFRoaXMgaXMgYSBwbGFjZSB0byBzdGFzaCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIENsaWVudCwgc3VjaCBhcyB0aHJlYWQKLSAgICAqIHN0YXRlcyBvciBoZWFwIGRhdGEuICBDbGllbnREYXRhIG1hcHMgMToxIHRvIENsaWVudCwgYnV0IGl0J3MgYSBsaXR0bGUKLSAgICAqIGNsZWFuZXIgaWYgd2Ugc2VwYXJhdGUgdGhlIGRhdGEgb3V0LgotICAgICoKLSAgICAqIE1lc3NhZ2UgaGFuZGxlcnMgYXJlIHdlbGNvbWUgdG8gc3Rhc2ggYXJiaXRyYXJ5IGRhdGEgaGVyZS4KLSAgICAqCi0gICAgKiBJTVBPUlRBTlQ6IFRoZSBkYXRhIGhlcmUgaXMgd3JpdHRlbiBieSBIYW5kbGVGb28gbWV0aG9kcyBhbmQgcmVhZCBieQotICAgICogRm9vUGFuZWwgbWV0aG9kcywgd2hpY2ggcnVuIGluIGRpZmZlcmVudCB0aHJlYWRzLiAgQWxsIG5vbi10cml2aWFsCi0gICAgKiBhY2Nlc3Mgc2hvdWxkIGJlIHN5bmNocm9uaXplZCBhZ2FpbnN0IHRoZSBDbGllbnREYXRhIG9iamVjdC4KLSAgICAqLwotCi0KLSAgICAvKiogVGVtcG9yYXJ5IG5hbWUgb2YgVk0gdG8gYmUgaWdub3JlZC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFX0lOSVRJQUxJWkVEID0gIjxwcmUtaW5pdGlhbGl6ZWQ+IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIERlYnVnZ2VyU3RhdHVzIHsKLSAgICAgICAgLyoqIERlYnVnZ2VyIGNvbm5lY3Rpb24gc3RhdHVzOiBub3Qgd2FpdGluZyBvbiBvbmUsIG5vdCBjb25uZWN0ZWQgdG8gb25lLCBidXQgYWNjZXB0aW5nCi0gICAgICAgICAqIG5ldyBjb25uZWN0aW9ucy4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4gKi8KLSAgICAgICAgREVGQVVMVCwKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlYnVnZ2VyIGNvbm5lY3Rpb24gc3RhdHVzOiB0aGUgYXBwbGljYXRpb24ncyBWTSBpcyBwYXVzZWQsIHdhaXRpbmcgZm9yIGEgZGVidWdnZXIgdG8KLSAgICAgICAgICogY29ubmVjdCB0byBpdCBiZWZvcmUgcmVzdW1pbmcuICovCi0gICAgICAgIFdBSVRJTkcsCi0gICAgICAgIC8qKiBEZWJ1Z2dlciBjb25uZWN0aW9uIHN0YXR1cyA6IERlYnVnZ2VyIGlzIGNvbm5lY3RlZCAqLwotICAgICAgICBBVFRBQ0hFRCwKLSAgICAgICAgLyoqIERlYnVnZ2VyIGNvbm5lY3Rpb24gc3RhdHVzOiBUaGUgbGlzdGVuaW5nIHBvcnQgZm9yIGRlYnVnZ2VyIGNvbm5lY3Rpb24gZmFpbGVkIHRvIGxpc3Rlbi4KLSAgICAgICAgICogTm8gZGVidWdnZXIgd2lsbCBiZSBhYmxlIHRvIGNvbm5lY3QuICovCi0gICAgICAgIEVSUk9SOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBBbGxvY2F0aW9uVHJhY2tpbmdTdGF0dXMgewotICAgICAgICAvKioKLSAgICAgICAgICogQWxsb2NhdGlvbiB0cmFja2luZyBzdGF0dXM6IHVua25vd24uCi0gICAgICAgICAqIDxwLz5UaGlzIGhhcHBlbnMgcmlnaHQgYWZ0ZXIgYSB7QGxpbmsgQ2xpZW50fSBpcyBkaXNjb3ZlcmVkCi0gICAgICAgICAqIGJ5IHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSwgYW5kIGJlZm9yZSB0aGUge0BsaW5rIENsaWVudH0gYW5zd2VyZWQgdGhlIHF1ZXJ5Ci0gICAgICAgICAqIHJlZ2FyZGluZyBpdHMgYWxsb2NhdGlvbiB0cmFja2luZyBzdGF0dXMuCi0gICAgICAgICAqIEBzZWUgQ2xpZW50I3JlcXVlc3RBbGxvY2F0aW9uU3RhdHVzKCkKLSAgICAgICAgICovCi0gICAgICAgIFVOS05PV04sCi0gICAgICAgIC8qKiBBbGxvY2F0aW9uIHRyYWNraW5nIHN0YXR1czogdGhlIHtAbGluayBDbGllbnR9IGlzIG5vdCB0cmFja2luZyBhbGxvY2F0aW9ucy4gKi8KLSAgICAgICAgT0ZGLAotICAgICAgICAvKiogQWxsb2NhdGlvbiB0cmFja2luZyBzdGF0dXM6IHRoZSB7QGxpbmsgQ2xpZW50fSBpcyB0cmFja2luZyBhbGxvY2F0aW9ucy4gKi8KLSAgICAgICAgT047Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIE1ldGhvZFByb2ZpbGluZ1N0YXR1cyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBNZXRob2QgcHJvZmlsaW5nIHN0YXR1czogdW5rbm93bi4KLSAgICAgICAgICogPHAvPlRoaXMgaGFwcGVucyByaWdodCBhZnRlciBhIHtAbGluayBDbGllbnR9IGlzIGRpc2NvdmVyZWQKLSAgICAgICAgICogYnkgdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LCBhbmQgYmVmb3JlIHRoZSB7QGxpbmsgQ2xpZW50fSBhbnN3ZXJlZCB0aGUgcXVlcnkKLSAgICAgICAgICogcmVnYXJkaW5nIGl0cyBtZXRob2QgcHJvZmlsaW5nIHN0YXR1cy4KLSAgICAgICAgICogQHNlZSBDbGllbnQjcmVxdWVzdE1ldGhvZFByb2ZpbGluZ1N0YXR1cygpCi0gICAgICAgICAqLwotICAgICAgICBVTktOT1dOLAotICAgICAgICAvKiogTWV0aG9kIHByb2ZpbGluZyBzdGF0dXM6IHRoZSB7QGxpbmsgQ2xpZW50fSBpcyBub3QgcHJvZmlsaW5nIG1ldGhvZCBjYWxscy4gKi8KLSAgICAgICAgT0ZGLAotICAgICAgICAvKiogTWV0aG9kIHByb2ZpbGluZyBzdGF0dXM6IHRoZSB7QGxpbmsgQ2xpZW50fSBpcyBwcm9maWxpbmcgbWV0aG9kIGNhbGxzLiAqLwotICAgICAgICBPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG1heCBzaXplIG9mIHRoZSBoZWFwLCBpbiB0aGUge0BsaW5rIE1hcH0gcmV0dXJuZWQgYnkKLSAgICAgKiB7QGxpbmsgI2dldFZtSGVhcEluZm8oaW50KX0KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIRUFQX01BWF9TSVpFX0JZVEVTID0gIm1heFNpemVJbkJ5dGVzIjsgLy8gJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHNpemUgb2YgdGhlIGhlYXAsIGluIHRoZSB7QGxpbmsgTWFwfSByZXR1cm5lZCBieQotICAgICAqIHtAbGluayAjZ2V0Vm1IZWFwSW5mbyhpbnQpfQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQVBfU0laRV9CWVRFUyA9ICJzaXplSW5CeXRlcyI7IC8vICROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIG9mIHRoZSBoZWFwLCBpbiB0aGUKLSAgICAgKiB7QGxpbmsgTWFwfSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZtSGVhcEluZm8oaW50KX0KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIRUFQX0JZVEVTX0FMTE9DQVRFRCA9ICJieXRlc0FsbG9jYXRlZCI7IC8vICROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgaGVhcCwgaW4gdGhlIHtAbGluayBNYXB9Ci0gICAgICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWbUhlYXBJbmZvKGludCl9Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBUF9PQkpFQ1RTX0FMTE9DQVRFRCA9ICJvYmplY3RzQWxsb2NhdGVkIjsgLy8gJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBmb3IgZmVhdHVyZSBlbmFibGluZyBzdGFydGluZy9zdG9wcGluZyBtZXRob2QgcHJvZmlsaW5nCi0gICAgICogQHNlZSAjaGFzRmVhdHVyZShTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkVBVFVSRV9QUk9GSUxJTkcgPSAibWV0aG9kLXRyYWNlLXByb2ZpbGluZyI7IC8vICROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgZm9yIGZlYXR1cmUgYWxsb3dpbmcgdG8gZHVtcCBocHJvZiBmaWxlcwotICAgICAqIEBzZWUgI2hhc0ZlYXR1cmUoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZFQVRVUkVfSFBST0YgPSAiaHByb2YtaGVhcC1kdW1wIjsgLy8gJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIElIcHJvZkR1bXBIYW5kbGVyIHNIcHJvZkR1bXBIYW5kbGVyOwotICAgIHByaXZhdGUgc3RhdGljIElNZXRob2RQcm9maWxpbmdIYW5kbGVyIHNNZXRob2RQcm9maWxpbmdIYW5kbGVyOwotCi0gICAgLy8gaXMgdGhpcyBhIERETS1hd2FyZSBjbGllbnQ/Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RkbUF3YXJlOwotCi0gICAgLy8gdGhlIGNsaWVudCdzIHByb2Nlc3MgSUQKLSAgICBwcml2YXRlIGZpbmFsIGludCBtUGlkOwotCi0gICAgLy8gSmF2YSBWTSBpZGVudGlmaWNhdGlvbiBzdHJpbmcKLSAgICBwcml2YXRlIFN0cmluZyBtVm1JZGVudGlmaWVyOwotCi0gICAgLy8gY2xpZW50J3Mgc2VsZi1kZXNjcmlwdGlvbgotICAgIHByaXZhdGUgU3RyaW5nIG1DbGllbnREZXNjcmlwdGlvbjsKLQotICAgIC8vIGhvdyBpbnRlcmVzdGVkIGFyZSB3ZSBpbiBhIGRlYnVnZ2VyPwotICAgIHByaXZhdGUgRGVidWdnZXJTdGF0dXMgbURlYnVnZ2VySW50ZXJlc3Q7Ci0KLSAgICAvLyBMaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlcyBieSB0aGUgY2xpZW50LgotICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxTdHJpbmc+IG1GZWF0dXJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIC8vIFRocmVhZCB0cmFja2luZyAoVEhDUiwgVEhERSkuCi0gICAgcHJpdmF0ZSBUcmVlTWFwPEludGVnZXIsVGhyZWFkSW5mbz4gbVRocmVhZE1hcDsKLQotICAgIC8qKiBWTSBIZWFwIGRhdGEgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhlYXBEYXRhIG1IZWFwRGF0YSA9IG5ldyBIZWFwRGF0YSgpOwotICAgIC8qKiBOYXRpdmUgSGVhcCBkYXRhICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIZWFwRGF0YSBtTmF0aXZlSGVhcERhdGEgPSBuZXcgSGVhcERhdGEoKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoTWFwPFN0cmluZywgTG9uZz4+IG1IZWFwSW5mb01hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoTWFwPFN0cmluZywgTG9uZz4+KCk7Ci0KLQotICAgIC8qKiBsaWJyYXJ5IG1hcCBpbmZvLiBTdG9yZWQgaGVyZSBzaW5jZSB0aGUgYmFja3RyYWNlIGRhdGEKLSAgICAgKiBpcyBjb21wdXRlZCBvbiBhIG5lZWQgdG8gZGlzcGxheSBiYXNpcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxOYXRpdmVMaWJyYXJ5TWFwSW5mbz4gbU5hdGl2ZUxpYk1hcEluZm8gPQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hdGl2ZUxpYnJhcnlNYXBJbmZvPigpOwotCi0gICAgLyoqIE5hdGl2ZSBBbGxvYyBpbmZvIGxpc3QgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4gbU5hdGl2ZUFsbG9jYXRpb25MaXN0ID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4oKTsKLSAgICBwcml2YXRlIGludCBtTmF0aXZlVG90YWxNZW1vcnk7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb25JbmZvW10gbUFsbG9jYXRpb25zOwotICAgIHByaXZhdGUgQWxsb2NhdGlvblRyYWNraW5nU3RhdHVzIG1BbGxvY2F0aW9uU3RhdHVzID0gQWxsb2NhdGlvblRyYWNraW5nU3RhdHVzLlVOS05PV047Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGVuZGluZ0hwcm9mRHVtcDsKLQotICAgIHByaXZhdGUgTWV0aG9kUHJvZmlsaW5nU3RhdHVzIG1Qcm9maWxpbmdTdGF0dXMgPSBNZXRob2RQcm9maWxpbmdTdGF0dXMuVU5LTk9XTjsKLSAgICBwcml2YXRlIFN0cmluZyBtUGVuZGluZ01ldGhvZFByb2ZpbGluZzsKLQotICAgIC8qKgotICAgICAqIEhlYXAgSW5mb3JtYXRpb24uCi0gICAgICogPHAvPlRoZSBoZWFwIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwge0BsaW5rIEhlYXBTZWdtZW50fSBvYmplY3RzLgotICAgICAqIDxwLz5BIGNhbGwgdG8ge0BsaW5rICNpc0hlYXBEYXRhQ29tcGxldGUoKX0gd2lsbCBpbmRpY2F0ZSBpZiB0aGUgc2VnbWVudHMgKGF2YWlsYWJsZSB0aHJvdWdoCi0gICAgICoge0BsaW5rICNnZXRIZWFwU2VnbWVudHMoKX0pIHJlcHJlc2VudCB0aGUgZnVsbCBoZWFwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhcERhdGEgewotICAgICAgICBwcml2YXRlIFRyZWVTZXQ8SGVhcFNlZ21lbnQ+IG1IZWFwU2VnbWVudHMgPSBuZXcgVHJlZVNldDxIZWFwU2VnbWVudD4oKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IZWFwRGF0YUNvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIG1Qcm9jZXNzZWRIZWFwRGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgQXJyYXlMaXN0PEhlYXBTZWdtZW50RWxlbWVudD4+IG1Qcm9jZXNzZWRIZWFwTWFwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBYmFuZG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgaGVhcCBzZWdtZW50cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckhlYXBEYXRhKCkgewotICAgICAgICAgICAgLyogQWJhbmRvbiB0aGUgb2xkIHNlZ21lbnRzIGluc3RlYWQgb2YganVzdCBjYWxsaW5nIC5jbGVhcigpLgotICAgICAgICAgICAgICogVGhpcyBsZXRzIHRoZSB1c2VyIGhvbGQgb250byB0aGUgb2xkIHNldCBpZiBpdCB3YW50cyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbUhlYXBTZWdtZW50cyA9IG5ldyBUcmVlU2V0PEhlYXBTZWdtZW50PigpOwotICAgICAgICAgICAgbUhlYXBEYXRhQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgcmF3IEhQU0cgY2h1bmsgZGF0YSB0byB0aGUgbGlzdCBvZiBoZWFwIHNlZ21lbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgZnJvbSBhbiBIUFNHIGNodW5rLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkIHZvaWQgYWRkSGVhcERhdGEoQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgICAgICBIZWFwU2VnbWVudCBoczsKLQotICAgICAgICAgICAgaWYgKG1IZWFwRGF0YUNvbXBsZXRlKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJIZWFwRGF0YSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhzID0gbmV3IEhlYXBTZWdtZW50KGRhdGEpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRpc2NhcmRpbmcgc2hvcnQgSFBTRyBkYXRhIChsZW5ndGggIiArIGRhdGEubGltaXQoKSArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSGVhcFNlZ21lbnRzLmFkZChocyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYWxsIGhlYXAgZGF0YSBoYXMgYXJyaXZlZC4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCB2b2lkIHNlYWxIZWFwRGF0YSgpIHsKLSAgICAgICAgICAgIG1IZWFwRGF0YUNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGhlYXAgZGF0YSBoYXMgYmVlbiBzZWFsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYXBEYXRhQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUhlYXBEYXRhQ29tcGxldGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBjb2xsZWN0ZWQgaGVhcCBkYXRhLCBpZiBzZWFsZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgaGVhcCBzZWdtZW50cyBpZiB0aGUgaGVhcCBkYXRhIGhhcyBiZWVuIHNlYWxlZCwgb3IgbnVsbCBpZiBpdCBoYXNuJ3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxIZWFwU2VnbWVudD4gZ2V0SGVhcFNlZ21lbnRzKCkgewotICAgICAgICAgICAgaWYgKGlzSGVhcERhdGFDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFwU2VnbWVudHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwcm9jZXNzZWQgaGVhcCBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaGVhcERhdGEgVGhlIG5ldyBoZWFwIGRhdGEgKGNhbiBiZSBudWxsKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc2VkSGVhcERhdGEoYnl0ZVtdIGhlYXBEYXRhKSB7Ci0gICAgICAgICAgICBtUHJvY2Vzc2VkSGVhcERhdGEgPSBoZWFwRGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHByb2Nlc3NlZCBoZWFwIGRhdGEsIGlmIHByZXNlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3NlZCBoZWFwIGRhdGEsIG9yIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldFByb2Nlc3NlZEhlYXBEYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9jZXNzZWRIZWFwRGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NlZEhlYXBNYXAoTWFwPEludGVnZXIsIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+PiBoZWFwTWFwKSB7Ci0gICAgICAgICAgICBtUHJvY2Vzc2VkSGVhcE1hcCA9IGhlYXBNYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWFwPEludGVnZXIsIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+PiBnZXRQcm9jZXNzZWRIZWFwTWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9jZXNzZWRIZWFwTWFwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcnMgYWJsZSB0byBhY3Qgb24gSFBST0YgZHVtcHMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJSHByb2ZEdW1wSGFuZGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIEhQUk9GIGR1bXAgc3VjY2VlZGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVtb3RlRmlsZVBhdGggdGhlIGRldmljZS1zaWRlIHBhdGggb2YgdGhlIEhQUk9GIGZpbGUuCi0gICAgICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIGNsaWVudCBmb3Igd2hpY2ggdGhlIEhQUk9GIGZpbGUgd2FzLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvblN1Y2Nlc3MoU3RyaW5nIHJlbW90ZUZpbGVQYXRoLCBDbGllbnQgY2xpZW50KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIEhQUk9GIGR1bXAgZmFpbGVkLgotICAgICAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSBjbGllbnQgZm9yIHdoaWNoIHRoZSBIUFJPRiBmaWxlIHdhcy4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25GYWlsdXJlKENsaWVudCBjbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXJzIGFibGUgdG8gYWN0IG9uIE1ldGhvZCBwcm9maWxpbmcgaW5mbwotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZXRob2QgdHJhY2luZyB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAgICAgICogQHBhcmFtIHJlbW90ZUZpbGVQYXRoIHRoZSBkZXZpY2Utc2lkZSBwYXRoIG9mIHRoZSB0cmFjZSBmaWxlLgotICAgICAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSBjbGllbnQgdGhhdCB3YXMgcHJvZmlsZWQuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU3VjY2VzcyhTdHJpbmcgcmVtb3RlRmlsZVBhdGgsIENsaWVudCBjbGllbnQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBtZXRob2QgdHJhY2luZyBmYWlsZWQuCi0gICAgICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIGNsaWVudCB0aGF0IHdhcyBwcm9maWxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25GYWlsdXJlKENsaWVudCBjbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhhbmRsZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gSFBST0YgZHVtcCBzdWNjZWVkZWQgb3IgZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIcHJvZkR1bXBIYW5kbGVyKElIcHJvZkR1bXBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgc0hwcm9mRHVtcEhhbmRsZXIgPSBoYW5kbGVyOwotICAgIH0KLQotICAgIHN0YXRpYyBJSHByb2ZEdW1wSGFuZGxlciBnZXRIcHJvZkR1bXBIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gc0hwcm9mRHVtcEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGFuZGxlciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBIUFJPRiBkdW1wIHN1Y2NlZWRlZCBvciBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1ldGhvZFByb2ZpbGluZ0hhbmRsZXIoSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBzTWV0aG9kUHJvZmlsaW5nSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIElNZXRob2RQcm9maWxpbmdIYW5kbGVyIGdldE1ldGhvZFByb2ZpbGluZ0hhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzTWV0aG9kUHJvZmlsaW5nSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmljIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIENsaWVudERhdGEoaW50IHBpZCkgewotICAgICAgICBtUGlkID0gcGlkOwotCi0gICAgICAgIG1EZWJ1Z2dlckludGVyZXN0ID0gRGVidWdnZXJTdGF0dXMuREVGQVVMVDsKLSAgICAgICAgbVRocmVhZE1hcCA9IG5ldyBUcmVlTWFwPEludGVnZXIsVGhyZWFkSW5mbz4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb2Nlc3MgaXMgRERNLWF3YXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGRtQXdhcmUoKSB7Ci0gICAgICAgIHJldHVybiBtSXNEZG1Bd2FyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIERETS1hd2FyZSBzdGF0dXMuCi0gICAgICovCi0gICAgdm9pZCBpc0RkbUF3YXJlKGJvb2xlYW4gYXdhcmUpIHsKLSAgICAgICAgbUlzRGRtQXdhcmUgPSBhd2FyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9jZXNzIElELgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGlkKCkgewotICAgICAgICByZXR1cm4gbVBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDbGllbnQncyBWTSBpZGVudGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vm1JZGVudGlmaWVyKCkgewotICAgICAgICByZXR1cm4gbVZtSWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIFZNIGlkZW50aWZpZXIuCi0gICAgICovCi0gICAgdm9pZCBzZXRWbUlkZW50aWZpZXIoU3RyaW5nIGlkZW50KSB7Ci0gICAgICAgIG1WbUlkZW50aWZpZXIgPSBpZGVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgZGVzY3JpcHRpb24uCi0gICAgICogPHAvPlRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGRlZmluZWQgaW4gdGhlCi0gICAgICogPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGllbnQgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHRoZSBkZXNjcmlwdGlvbiB3YXMgbm90IHlldAotICAgICAqIHNlbnQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUNsaWVudERlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgY2xpZW50IGRlc2NyaXB0aW9uLgotICAgICAqCi0gICAgICogVGhlcmUgbWF5IGJlIGEgcmFjZSBiZXR3ZWVuIEhFTE8gYW5kIEFQTk0uICBSYXRoZXIgdGhhbiB0cnkKLSAgICAgKiB0byBlbmZvcmNlIG9yZGVyaW5nIG9uIHRoZSBkZXZpY2UsIHdlIGp1c3QgZG9uJ3QgYWxsb3cgYW4gZW1wdHkKLSAgICAgKiBuYW1lIHRvIHJlcGxhY2UgYSBzcGVjaWZpZWQgb25lLgotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpZW50RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2xpZW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gVk0gaXMgZmlyc3QgbmFtZWQgPHByZS1pbml0aWFsaXplZD4gYmVmb3JlIGJlaW5nIGFzc2lnbmVkCi0gICAgICAgICAgICAgKiBpdHMgcmVhbCBuYW1lLgotICAgICAgICAgICAgICogRGVwZW5kaW5nIG9uIHRoZSB0aW1pbmcsIHdlIGNhbiBnZXQgYW4gQVBOTSBjaHVuayBzZXR0aW5nIHRoaXMgbmFtZSBiZWZvcmUKLSAgICAgICAgICAgICAqIGFub3RoZXIgb25lIHNldHRpbmcgdGhlIGZpbmFsIGFjdHVhbCBuYW1lLiBTbyBpZiB3ZSBnZXQgYSBTZXRDbGllbnREZXNjcmlwdGlvbgotICAgICAgICAgICAgICogd2l0aCB0aGlzIHZhbHVlIHdlIGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKFBSRV9JTklUSUFMSVpFRC5lcXVhbHMoZGVzY3JpcHRpb24pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbUNsaWVudERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWJ1Z2dlciBjb25uZWN0aW9uIHN0YXR1cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVidWdnZXJTdGF0dXMgZ2V0RGVidWdnZXJDb25uZWN0aW9uU3RhdHVzKCkgewotICAgICAgICByZXR1cm4gbURlYnVnZ2VySW50ZXJlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBkZWJ1Z2dlciBjb25uZWN0aW9uIHN0YXR1cy4KLSAgICAgKi8KLSAgICB2b2lkIHNldERlYnVnZ2VyQ29ubmVjdGlvblN0YXR1cyhEZWJ1Z2dlclN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgbURlYnVnZ2VySW50ZXJlc3QgPSBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBoZWFwIGluZm8gdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhcElkIFRoZSBoZWFwIHdob3NlIGluZm8gdG8gdXBkYXRlCi0gICAgICogQHBhcmFtIHNpemVJbkJ5dGVzIFRoZSBzaXplIG9mIHRoZSBoZWFwLCBpbiBieXRlcwotICAgICAqIEBwYXJhbSBieXRlc0FsbG9jYXRlZCBUaGUgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBhbGxvY2F0ZWQgaW4gdGhlIGhlYXAKLSAgICAgKiBAcGFyYW0gb2JqZWN0c0FsbG9jYXRlZCBUaGUgbnVtYmVyIG9mIG9iamVjdHMgY3VycmVudGx5IGFsbG9jYXRlZCBpbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWFwCi0gICAgICovCi0gICAgLy8gVE9ETzoga2VlcCB0cmFjayBvZiB0aW1lc3RhbXAsIHJlYXNvbgotICAgIHN5bmNocm9uaXplZCB2b2lkIHNldEhlYXBJbmZvKGludCBoZWFwSWQsIGxvbmcgbWF4U2l6ZUluQnl0ZXMsCi0gICAgICAgICAgICBsb25nIHNpemVJbkJ5dGVzLCBsb25nIGJ5dGVzQWxsb2NhdGVkLCBsb25nIG9iamVjdHNBbGxvY2F0ZWQpIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExvbmc+IGhlYXBJbmZvID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOwotICAgICAgICBoZWFwSW5mby5wdXQoSEVBUF9NQVhfU0laRV9CWVRFUywgbWF4U2l6ZUluQnl0ZXMpOwotICAgICAgICBoZWFwSW5mby5wdXQoSEVBUF9TSVpFX0JZVEVTLCBzaXplSW5CeXRlcyk7Ci0gICAgICAgIGhlYXBJbmZvLnB1dChIRUFQX0JZVEVTX0FMTE9DQVRFRCwgYnl0ZXNBbGxvY2F0ZWQpOwotICAgICAgICBoZWFwSW5mby5wdXQoSEVBUF9PQkpFQ1RTX0FMTE9DQVRFRCwgb2JqZWN0c0FsbG9jYXRlZCk7Ci0gICAgICAgIG1IZWFwSW5mb01hcC5wdXQoaGVhcElkLCBoZWFwSW5mbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEhlYXBEYXRhfSBvYmplY3QgZm9yIHRoZSBWTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGVhcERhdGEgZ2V0Vm1IZWFwRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFwRGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSGVhcERhdGF9IG9iamVjdCBmb3IgdGhlIG5hdGl2ZSBjb2RlLgotICAgICAqLwotICAgIEhlYXBEYXRhIGdldE5hdGl2ZUhlYXBEYXRhKCkgewotICAgICAgICByZXR1cm4gbU5hdGl2ZUhlYXBEYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgbGlzdCBvZiBrbm93biBWTSBoZWFwIGlkcy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBtdXN0IHN5bmNocm9uaXplIG9uIHRoZSB7QGxpbmsgQ2xpZW50RGF0YX0gb2JqZWN0IHdoaWxlIGl0ZXJhdGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgbGlzdCBvZiBoZWFwIGlkcwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8SW50ZWdlcj4gZ2V0Vm1IZWFwSWRzKCkgewotICAgICAgICByZXR1cm4gbUhlYXBJbmZvTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdC1yZWNlbnQgaW5mbyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgVk0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFwSWQgVGhlIGhlYXAgd2hvc2UgaW5mbyBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICAgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIGluZm8gdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGhlYXAuCi0gICAgICogICAgICAgICBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBoZWFwIElEIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBMb25nPiBnZXRWbUhlYXBJbmZvKGludCBoZWFwSWQpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFwSW5mb01hcC5nZXQoaGVhcElkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IHRocmVhZCB0byB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUaHJlYWQoaW50IHRocmVhZElkLCBTdHJpbmcgdGhyZWFkTmFtZSkgewotICAgICAgICBUaHJlYWRJbmZvIGF0dHIgPSBuZXcgVGhyZWFkSW5mbyh0aHJlYWRJZCwgdGhyZWFkTmFtZSk7Ci0gICAgICAgIG1UaHJlYWRNYXAucHV0KHRocmVhZElkLCBhdHRyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgdGhyZWFkIGZyb20gdGhlIGxpc3QuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVGhyZWFkKGludCB0aHJlYWRJZCkgewotICAgICAgICBtVGhyZWFkTWFwLnJlbW92ZSh0aHJlYWRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aHJlYWRzIGFzIHtAbGluayBUaHJlYWRJbmZvfSBvYmplY3RzLgotICAgICAqIDxwLz5UaGUgbGlzdCBpcyBlbXB0eSB1bnRpbCBhIHRocmVhZCB1cGRhdGUgd2FzIHJlcXVlc3RlZCB3aXRoCi0gICAgICoge0BsaW5rIENsaWVudCNyZXF1ZXN0VGhyZWFkVXBkYXRlKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVGhyZWFkSW5mb1tdIGdldFRocmVhZHMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248VGhyZWFkSW5mbz4gdGhyZWFkcyA9IG1UaHJlYWRNYXAudmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiB0aHJlYWRzLnRvQXJyYXkobmV3IFRocmVhZEluZm9bdGhyZWFkcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGhyZWFkSW5mb30gYnkgdGhyZWFkIGlkLgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCBUaHJlYWRJbmZvIGdldFRocmVhZChpbnQgdGhyZWFkSWQpIHsKLSAgICAgICAgcmV0dXJuIG1UaHJlYWRNYXAuZ2V0KHRocmVhZElkKTsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhclRocmVhZHMoKSB7Ci0gICAgICAgIG1UaHJlYWRNYXAuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHtAbGluayBOYXRpdmVBbGxvY2F0aW9uSW5mb30uCi0gICAgICogQHNlZSBDbGllbnQjcmVxdWVzdE5hdGl2ZUhlYXBJbmZvcm1hdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPiBnZXROYXRpdmVBbGxvY2F0aW9uTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobU5hdGl2ZUFsbG9jYXRpb25MaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGRzIGEgbmV3IHtAbGluayBOYXRpdmVBbGxvY2F0aW9uSW5mb30gdG8gdGhlIHtAbGluayBDbGllbnR9Ci0gICAgICogQHBhcmFtIGFsbG9jSW5mbyBUaGUge0BsaW5rIE5hdGl2ZUFsbG9jYXRpb25JbmZvfSB0byBhZGQuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgYWRkTmF0aXZlQWxsb2NhdGlvbihOYXRpdmVBbGxvY2F0aW9uSW5mbyBhbGxvY0luZm8pIHsKLSAgICAgICAgbU5hdGl2ZUFsbG9jYXRpb25MaXN0LmFkZChhbGxvY0luZm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjdXJyZW50IG1hbGxvYyBpbmZvLgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyTmF0aXZlQWxsb2NhdGlvbkluZm8oKSB7Ci0gICAgICAgIG1OYXRpdmVBbGxvY2F0aW9uTGlzdC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG5hdGl2ZSBtZW1vcnkuCi0gICAgICogQHNlZSBDbGllbnQjcmVxdWVzdE5hdGl2ZUhlYXBJbmZvcm1hdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VG90YWxOYXRpdmVNZW1vcnkoKSB7Ci0gICAgICAgIHJldHVybiBtTmF0aXZlVG90YWxNZW1vcnk7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHZvaWQgc2V0VG90YWxOYXRpdmVNZW1vcnkoaW50IHRvdGFsTWVtb3J5KSB7Ci0gICAgICAgIG1OYXRpdmVUb3RhbE1lbW9yeSA9IHRvdGFsTWVtb3J5OwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZE5hdGl2ZUxpYnJhcnlNYXBJbmZvKGxvbmcgc3RhcnRBZGRyLCBsb25nIGVuZEFkZHIsIFN0cmluZyBsaWJyYXJ5KSB7Ci0gICAgICAgIG1OYXRpdmVMaWJNYXBJbmZvLmFkZChuZXcgTmF0aXZlTGlicmFyeU1hcEluZm8oc3RhcnRBZGRyLCBlbmRBZGRyLCBsaWJyYXJ5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9IG9uIHtAbGluayBOYXRpdmVMaWJyYXJ5TWFwSW5mb30gb2JqZWN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBtdXN0IHN5bmNocm9uaXplIG9uIHRoZSB7QGxpbmsgQ2xpZW50RGF0YX0gb2JqZWN0IHdoaWxlIGl0ZXJhdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhdG9yPE5hdGl2ZUxpYnJhcnlNYXBJbmZvPiBnZXROYXRpdmVMaWJyYXJ5TWFwSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1OYXRpdmVMaWJNYXBJbmZvLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb2NhdGlvblN0YXR1cyhBbGxvY2F0aW9uVHJhY2tpbmdTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIG1BbGxvY2F0aW9uU3RhdHVzID0gc3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFsbG9jYXRpb24gdHJhY2tpbmcgc3RhdHVzLgotICAgICAqIEBzZWUgQ2xpZW50I3JlcXVlc3RBbGxvY2F0aW9uU3RhdHVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEFsbG9jYXRpb25UcmFja2luZ1N0YXR1cyBnZXRBbGxvY2F0aW9uU3RhdHVzKCkgewotICAgICAgICByZXR1cm4gbUFsbG9jYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb2NhdGlvbnMoQWxsb2NhdGlvbkluZm9bXSBhbGxvY3MpIHsKLSAgICAgICAgbUFsbG9jYXRpb25zID0gYWxsb2NzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdHJhY2tlZCBhbGxvY2F0aW9ucy4KLSAgICAgKiBAc2VlIENsaWVudCNyZXF1ZXN0QWxsb2NhdGlvbkRldGFpbHMoKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQWxsb2NhdGlvbkluZm9bXSBnZXRBbGxvY2F0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uczsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLSAgICAgICAgbUZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayBDbGllbnR9IHN1cHBvcnRzIHRoZSBnaXZlbiA8dmFyPmZlYXR1cmU8L3Zhcj4KLSAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLSAgICAgKgotICAgICAqIEBzZWUgQ2xpZW50RGF0YSNGRUFUVVJFX1BST0ZJTElORwotICAgICAqIEBzZWUgQ2xpZW50RGF0YSNGRUFUVVJFX0hQUk9GCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgewotICAgICAgICByZXR1cm4gbUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRldmljZS1zaWRlIHBhdGggdG8gdGhlIGhwcm9mIGZpbGUgYmVpbmcgd3JpdHRlbgotICAgICAqIEBwYXJhbSBwZW5kaW5nSHByb2ZEdW1wIHRoZSBmaWxlIHRvIHRoZSBocHJvZiBmaWxlCi0gICAgICovCi0gICAgdm9pZCBzZXRQZW5kaW5nSHByb2ZEdW1wKFN0cmluZyBwZW5kaW5nSHByb2ZEdW1wKSB7Ci0gICAgICAgIG1QZW5kaW5nSHByb2ZEdW1wID0gcGVuZGluZ0hwcm9mRHVtcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBkZXZpY2Utc2lkZSBocHJvZiBmaWxlIGJlaW5nIHdyaXR0ZW4uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBlbmRpbmdIcHJvZkR1bXAoKSB7Ci0gICAgICAgIHJldHVybiBtUGVuZGluZ0hwcm9mRHVtcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZW5kaW5nSHByb2ZEdW1wKCkgewotICAgICAgICByZXR1cm4gbVBlbmRpbmdIcHJvZkR1bXAgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNZXRob2RQcm9maWxpbmdTdGF0dXMoTWV0aG9kUHJvZmlsaW5nU3RhdHVzIHN0YXR1cykgewotICAgICAgICBtUHJvZmlsaW5nU3RhdHVzID0gc3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGhvZCBwcm9maWxpbmcgc3RhdHVzLgotICAgICAqIEBzZWUgQ2xpZW50I3JlcXVlc3RNZXRob2RQcm9maWxpbmdTdGF0dXMoKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWV0aG9kUHJvZmlsaW5nU3RhdHVzIGdldE1ldGhvZFByb2ZpbGluZ1N0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxpbmdTdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGV2aWNlLXNpZGUgcGF0aCB0byB0aGUgbWV0aG9kIHByb2ZpbGUgZmlsZSBiZWluZyB3cml0dGVuCi0gICAgICogQHBhcmFtIHBlbmRpbmdNZXRob2RQcm9maWxpbmcgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbgotICAgICAqLwotICAgIHZvaWQgc2V0UGVuZGluZ01ldGhvZFByb2ZpbGluZyhTdHJpbmcgcGVuZGluZ01ldGhvZFByb2ZpbGluZykgewotICAgICAgICBtUGVuZGluZ01ldGhvZFByb2ZpbGluZyA9IHBlbmRpbmdNZXRob2RQcm9maWxpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZGV2aWNlLXNpZGUgbWV0aG9kIHByb2ZpbGluZyBmaWxlIGJlaW5nIHdyaXR0ZW4uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBlbmRpbmdNZXRob2RQcm9maWxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtUGVuZGluZ01ldGhvZFByb2ZpbGluZzsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZG1Db25zdGFudHMuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZG1Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4MjNmMy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRGRtQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZG1Db25zdGFudHMgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUExBVEZPUk1fVU5LTk9XTiA9IDA7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUExBVEZPUk1fTElOVVggPSAxOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBMQVRGT1JNX1dJTkRPV1MgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBMQVRGT1JNX0RBUldJTiA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGN1cnJlbnQgcGxhdGZvcm0sIG9uZSBvZiB7QGxpbmsgI1BMQVRGT1JNX1dJTkRPV1N9LCB7QGxpbmsgI1BMQVRGT1JNX0RBUldJTn0sCi0gICAgICoge0BsaW5rICNQTEFURk9STV9MSU5VWH0gb3Ige0BsaW5rICNQTEFURk9STV9VTktOT1dOfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDVVJSRU5UX1BMQVRGT1JNID0gY3VycmVudFBsYXRmb3JtKCk7Ci0KLSAgICAvKiogaHByb2YtY29udiBleGVjdXRhYmxlICh3aXRoIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnJlbnQgT1MpICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0hQUk9GX0NPTlZFUlRFUiA9IChDVVJSRU5UX1BMQVRGT1JNID09IFBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJocHJvZi1jb252LmV4ZSIgOiAiaHByb2YtY29udiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLyoqIHRyYWNldmlldyBleGVjdXRhYmxlICh3aXRoIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnJlbnQgT1MpICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX1RSQUNFVklFVyA9IChDVVJSRU5UX1BMQVRGT1JNID09IFBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJ0cmFjZXZpZXcuYmF0IiA6ICJ0cmFjZXZpZXciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY3VycmVudCBwbGF0Zm9ybQotICAgICAqCi0gICAgICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNQTEFURk9STV9XSU5ET1dTfSwge0BsaW5rICNQTEFURk9STV9EQVJXSU59LAotICAgICAqIHtAbGluayAjUExBVEZPUk1fTElOVVh9IG9yIHtAbGluayAjUExBVEZPUk1fVU5LTk9XTn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY3VycmVudFBsYXRmb3JtKCkgewotICAgICAgICBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAob3Muc3RhcnRzV2l0aCgiTWFjIE9TIikpIHsgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIFBMQVRGT1JNX0RBUldJTjsKLSAgICAgICAgfSBlbHNlIGlmIChvcy5zdGFydHNXaXRoKCJXaW5kb3dzIikpIHsgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBQTEFURk9STV9XSU5ET1dTOwotICAgICAgICB9IGVsc2UgaWYgKG9zLnN0YXJ0c1dpdGgoIkxpbnV4IikpIHsgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIFBMQVRGT1JNX0xJTlVYOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFBMQVRGT1JNX1VOS05PV047Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRGRtUHJlZmVyZW5jZXMuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZG1QcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ0YWIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZG1QcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgZm9yIHRoZSBkZG0gbGlicmFyeS4KLSAqIDxwLz5UaGlzIGNsYXNzIGRvZXMgbm90IGhhbmRsZSBzdG9yaW5nIHRoZSBwcmVmZXJlbmNlcy4gSXQgaXMgbWVyZWx5IGEgY2VudHJhbCBwb2ludCBmb3IKLSAqIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgZGRtbGliIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlcy4KLSAqIDxwLz5WYXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIGRkbWxpYiBxdWVyeSB0aGlzIGNsYXNzIHRvIGdldCB0aGVpciB2YWx1ZXMuCi0gKiA8cC8+Q2FsbHMgdG8gc29tZSA8Y29kZT5zZXQjIygpPC9jb2RlPiBtZXRob2RzIHdpbGwgdXBkYXRlIHRoZSBjb21wb25lbnRzIHVzaW5nIHRoZSB2YWx1ZXMKLSAqIHJpZ2h0IGF3YXksIHdoaWxlIG90aGVyIG1ldGhvZHMgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbmNlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2UjaW5pdChib29sZWFuKX0KLSAqIGhhcyBiZWVuIGNhbGxlZC4KLSAqIDxwLz5DaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIG1ldGhvZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERkbVByZWZlcmVuY2VzIHsKLQotICAgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciB0aHJlYWQgdXBkYXRlIGZsYWcgdXBvbiBjbGllbnQgY29ubmVjdGlvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gREVGQVVMVF9JTklUSUFMX1RIUkVBRF9VUERBVEUgPSBmYWxzZTsKLSAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgaGVhcCB1cGRhdGUgZmxhZyB1cG9uIGNsaWVudCBjb25uZWN0aW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX0lOSVRJQUxfSEVBUF9VUERBVEUgPSBmYWxzZTsKLSAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNsaWVudCBkZWJ1ZyBwb3J0ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9TRUxFQ1RFRF9ERUJVR19QT1JUID0gODcwMDsKLSAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRlYnVnIHBvcnQgYmFzZSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfREVCVUdfUE9SVF9CQVNFID0gODYwMDsKLSAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvZ2NhdCB7QGxpbmsgTG9nTGV2ZWx9ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2dMZXZlbCBERUZBVUxUX0xPR19MRVZFTCA9IExvZ0xldmVsLkVSUk9SOwotICAgIC8qKiBEZWZhdWx0IHRpbWVvdXQgdmFsdWVzIGZvciBhZGIgY29ubmVjdGlvbiAobWlsbGlzZWNvbmRzKSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDUwMDA7IC8vIHN0YW5kYXJkIGRlbGF5LCBpbiBtcwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzVGhyZWFkVXBkYXRlID0gREVGQVVMVF9JTklUSUFMX1RIUkVBRF9VUERBVEU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSW5pdGlhbEhlYXBVcGRhdGUgPSBERUZBVUxUX0lOSVRJQUxfSEVBUF9VUERBVEU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc1NlbGVjdGVkRGVidWdQb3J0ID0gREVGQVVMVF9TRUxFQ1RFRF9ERUJVR19QT1JUOwotICAgIHByaXZhdGUgc3RhdGljIGludCBzRGVidWdQb3J0QmFzZSA9IERFRkFVTFRfREVCVUdfUE9SVF9CQVNFOwotICAgIHByaXZhdGUgc3RhdGljIExvZ0xldmVsIHNMb2dMZXZlbCA9IERFRkFVTFRfTE9HX0xFVkVMOwotICAgIHByaXZhdGUgc3RhdGljIGludCBzVGltZU91dCA9IERFRkFVTFRfVElNRU9VVDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwge0BsaW5rIENsaWVudH0gZmxhZyBmb3IgdGhyZWFkIHVwZGF0ZXMuCi0gICAgICogQHNlZSAjc2V0SW5pdGlhbFRocmVhZFVwZGF0ZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbml0aWFsVGhyZWFkVXBkYXRlKCkgewotICAgICAgICByZXR1cm4gc1RocmVhZFVwZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHtAbGluayBDbGllbnR9IGZsYWcgZm9yIHRocmVhZCB1cGRhdGVzLgotICAgICAqIDxwLz5UaGlzIGNoYW5nZSB0YWtlcyBlZmZlY3QgcmlnaHQgYXdheSwgZm9yIG5ld2x5IGNyZWF0ZWQge0BsaW5rIENsaWVudH0gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5pdGlhbFRocmVhZFVwZGF0ZShib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIHNUaHJlYWRVcGRhdGUgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIHtAbGluayBDbGllbnR9IGZsYWcgZm9yIGhlYXAgdXBkYXRlcy4KLSAgICAgKiBAc2VlICNzZXRJbml0aWFsSGVhcFVwZGF0ZShib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbml0aWFsSGVhcFVwZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNJbml0aWFsSGVhcFVwZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHtAbGluayBDbGllbnR9IGZsYWcgZm9yIGhlYXAgdXBkYXRlcy4KLSAgICAgKiA8cC8+SWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB7QGxpbmsgQ2xpZW50RGF0YX0gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgd2l0aAotICAgICAqIHRoZSBWTSBoZWFwIGluZm9ybWF0aW9uIHdoZW5ldmVyIGEgR0MgaGFwcGVucy4KLSAgICAgKiA8cC8+VGhpcyBjaGFuZ2UgdGFrZXMgZWZmZWN0IHJpZ2h0IGF3YXksIGZvciBuZXdseSBjcmVhdGVkIHtAbGluayBDbGllbnR9IG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEluaXRpYWxIZWFwVXBkYXRlKGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgc0luaXRpYWxIZWFwVXBkYXRlID0gc3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVidWcgcG9ydCB1c2VkIGJ5IHRoZSBzZWxlY3RlZCB7QGxpbmsgQ2xpZW50fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTZWxlY3RlZERlYnVnUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHNTZWxlY3RlZERlYnVnUG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWJ1ZyBwb3J0IHVzZWQgYnkgdGhlIHNlbGVjdGVkIHtAbGluayBDbGllbnR9LgotICAgICAqIDxwLz5UaGlzIGNoYW5nZSB0YWtlcyBlZmZlY3QgcmlnaHQgYXdheS4KLSAgICAgKiBAcGFyYW0gcG9ydCB0aGUgbmV3IHBvcnQgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWxlY3RlZERlYnVnUG9ydChpbnQgcG9ydCkgewotICAgICAgICBzU2VsZWN0ZWREZWJ1Z1BvcnQgPSBwb3J0OwotCi0gICAgICAgIE1vbml0b3JUaHJlYWQgbW9uaXRvclRocmVhZCA9IE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1vbml0b3JUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvclRocmVhZC5zZXREZWJ1Z1NlbGVjdGVkUG9ydChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlYnVnIHBvcnQgdXNlZCBieSB0aGUgZmlyc3Qge0BsaW5rIENsaWVudH0uIEZvbGxvd2luZyBjbGllbnRzLCB3aWxsIHVzZSB0aGUKLSAgICAgKiBuZXh0IHBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVidWdQb3J0QmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWJ1Z1BvcnRCYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlYnVnIHBvcnQgdXNlZCBieSB0aGUgZmlyc3Qge0BsaW5rIENsaWVudH0uCi0gICAgICogPHAvPk9uY2UgYSBwb3J0IGlzIHVzZWQsIHRoZSBuZXh0IENsaWVudCB3aWxsIHVzZSBwb3J0ICsgMS4gUXVpdHRpbmcgYXBwbGljYXRpb25zIHdpbGwKLSAgICAgKiByZWxlYXNlIHRoZWlyIGRlYnVnIHBvcnQsIGFuZCBuZXcgY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gcmV1c2UgdGhlbS4KLSAgICAgKiA8cC8+VGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZSNpbml0KGJvb2xlYW4pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVidWdQb3J0QmFzZShpbnQgcG9ydCkgewotICAgICAgICBzRGVidWdQb3J0QmFzZSA9IHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWluaW11bSB7QGxpbmsgTG9nTGV2ZWx9IGJlaW5nIGRpc3BsYXllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExvZ0xldmVsIGdldExvZ0xldmVsKCkgewotICAgICAgICByZXR1cm4gc0xvZ0xldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1pbmltdW0ge0BsaW5rIExvZ0xldmVsfSB0byBkaXNwbGF5LgotICAgICAqIDxwLz5UaGlzIGNoYW5nZSB0YWtlcyBlZmZlY3QgcmlnaHQgYXdheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9nTGV2ZWwoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNMb2dMZXZlbCA9IExvZ0xldmVsLmdldEJ5U3RyaW5nKHZhbHVlKTsKLQotICAgICAgICBMb2cuc2V0TGV2ZWwoc0xvZ0xldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lb3V0IHRvIGJlIHVzZWQgaW4gYWRiIGNvbm5lY3Rpb25zIChtaWxsaXNlY29uZHMpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRpbWVPdXQoKSB7Ci0gICAgICAgIHJldHVybiBzVGltZU91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lb3V0IHZhbHVlIGZvciBhZGIgY29ubmVjdGlvbi4KLSAgICAgKiA8cC8+VGhpcyBjaGFuZ2UgdGFrZXMgZWZmZWN0IGZvciBuZXdseSBjcmVhdGVkIGNvbm5lY3Rpb25zIG9ubHkuCi0gICAgICogQHBhcmFtIHRpbWVPdXQgdGhlIHRpbWVvdXQgdmFsdWUgKG1pbGxpc2Vjb25kcykuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRpbWVPdXQoaW50IHRpbWVPdXQpIHsKLSAgICAgICAgc1RpbWVPdXQgPSB0aW1lT3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vbiBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRGRtUHJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIC8vIHBhc3MsIG9ubHkgc3RhdGljIG1ldGhvZHMgaW4gdGhlIGNsYXNzLgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZWJ1Z1BvcnRNYW5hZ2VyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRGVidWdQb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWZkYzBlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZWJ1Z1BvcnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRGV2aWNlOwotCi0vKioKLSAqIENlbnRyYWxpemVkIHBvaW50IHRvIHByb3ZpZGUgYSB7QGxpbmsgSURlYnVnUG9ydFByb3ZpZGVyfSB0byBkZG1saWIuCi0gKgotICogPHAvPldoZW4ge0BsaW5rIENsaWVudH0gb2JqZWN0cyBhcmUgY3JlYXRlZCwgdGhleSBzdGFydCBsaXN0ZW5pbmcgZm9yIGRlYnVnZ2VycyBvbiBhIHNwZWNpZmljCi0gKiBwb3J0LiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBzdGFydCB3aXRoIHtAbGluayBEZG1QcmVmZXJlbmNlcyNnZXREZWJ1Z1BvcnRCYXNlKCl9IGFuZAotICogaW5jcmVtZW50IHRoaXMgdmFsdWUgZm9yIGVhY2ggbmV3IDxjb2RlPkNsaWVudDwvY29kZT4uCi0gKgotICogPHAvPlRoaXMge0BsaW5rIERlYnVnUG9ydE1hbmFnZXJ9IGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgZGRtbGliIHRvIHByb3ZpZGUgYSBjdXN0b20KLSAqIHBvcnQgcHJvdmlkZXIgb24gYSBwZXItPGNvZGU+Q2xpZW50PC9jb2RlPiBiYXNpcywgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UvZW11bGF0b3IgdGhleSBhcmUKLSAqIHJ1bm5pbmcgb24sIGFuZC9vciB0aGVpciBuYW1lcy4KLSAqLwotcHVibGljIGNsYXNzIERlYnVnUG9ydE1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IHByb3ZpZGVzIGEgbm9uIHJhbmRvbQotICAgICAqIGRlYnVnZ2VyIHBvcnQgZm9yIGEgbmV3bHkgY3JlYXRlZCB7QGxpbmsgQ2xpZW50fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z1BvcnRQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fU1RBVElDX1BPUlQgPSAtMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5vbi1yYW5kb20gZGVidWdnZXIgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIHRoZQotICAgICAgICAgKiBzcGVjaWZpZWQge0BsaW5rIERldmljZX0uCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBvbi4KLSAgICAgICAgICogQHBhcmFtIGFwcE5hbWUgVGhlIGFwcGxpY2F0aW9uIG5hbWUsIGFzIGRlZmluZWQgaW4gdGhlIDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+Ci0gICAgICAgICAqIDx2YXI+cGFja2FnZTwvdmFyPiBhdHRyaWJ1dGUgb2YgdGhlIDx2YXI+bWFuaWZlc3Q8L3Zhcj4gbm9kZS4KLSAgICAgICAgICogQHJldHVybiBUaGUgbm9uLXJhbmRvbSBkZWJ1Z2dlciBwb3J0IG9yIHtAbGluayAjTk9fU1RBVElDX1BPUlR9IGlmIHRoZSB7QGxpbmsgQ2xpZW50fQotICAgICAgICAgKiBzaG91bGQgdXNlIHRoZSBhdXRvbWF0aWMgZGVidWdnZXIgcG9ydCBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9ydChJRGV2aWNlIGRldmljZSwgU3RyaW5nIGFwcE5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElEZWJ1Z1BvcnRQcm92aWRlciBzUHJvdmlkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIElEZWJ1Z1BvcnRQcm92aWRlcn0gdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBhIG5ldyB7QGxpbmsgQ2xpZW50fSByZXF1ZXN0cwotICAgICAqIGEgZGVidWdnZXIgcG9ydC4KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIDxjb2RlPklEZWJ1Z1BvcnRQcm92aWRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm92aWRlcihJRGVidWdQb3J0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc1Byb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIElEZWJ1Z1BvcnRQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNQcm92aWRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRGVidWdnZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZWJ1Z2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWJiYzMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkRlYnVnZ2VyU3RhdHVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7Ci0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGEgcGVuZGluZyBvciBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIHdpdGggYSBKRFdQIGRlYnVnZ2VyLgotICovCi1jbGFzcyBEZWJ1Z2dlciB7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIGZyb20gdGhlIGRlYnVnZ2VyIHNob3VsZCBiZSBwcmV0dHkgc21hbGw7IG1heSBub3QgZXZlbgotICAgICAqIG5lZWQgYW4gZXhwYW5kaW5nLWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9CVUZfU0laRSA9IDEgKiAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQlVGX1NJWkUgPSAzMiAqIDEwMjQ7Ci0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1SZWFkQnVmZmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRV9EQVRBX0JVRl9TSVpFID0gMjU2OwotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtUHJlRGF0YUJ1ZmZlcjsKLQotICAgIC8qIGNvbm5lY3Rpb24gc3RhdGUgKi8KLSAgICBwcml2YXRlIGludCBtQ29ublN0YXRlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVF9OT1RfQ09OTkVDVEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RfQVdBSVRfU0hBS0UgICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUX1JFQURZICAgICAgICAgPSAzOwotCi0gICAgLyogcGVlciAqLwotICAgIHByaXZhdGUgQ2xpZW50IG1DbGllbnQ7ICAgICAgICAgLy8gY2xpZW50IHdlJ3JlIGZvcndhcmRpbmcgdG8vZnJvbQotICAgIHByaXZhdGUgaW50IG1MaXN0ZW5Qb3J0OyAgICAgICAgLy8gbGlzdGVuIHRvIG1lCi0gICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXRDaGFubmVsIG1MaXN0ZW5DaGFubmVsOwotCi0gICAgLyogdGhpcyBnb2VzIHVwIGFuZCBkb3duOyBzeW5jaHJvbml6ZSBtZXRob2RzIHRoYXQgYWNjZXNzIHRoZSBmaWVsZCAqLwotICAgIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBtQ2hhbm5lbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWJ1Z2dlciBvYmplY3QsIGNvbmZpZ3VyZWQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucwotICAgICAqIG9uIGEgc3BlY2lmaWMgcG9ydC4KLSAgICAgKi8KLSAgICBEZWJ1Z2dlcihDbGllbnQgY2xpZW50LCBpbnQgbGlzdGVuUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBtQ2xpZW50ID0gY2xpZW50OwotICAgICAgICBtTGlzdGVuUG9ydCA9IGxpc3RlblBvcnQ7Ci0KLSAgICAgICAgbUxpc3RlbkNoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKLSAgICAgICAgbUxpc3RlbkNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOyAgICAgICAgLy8gcmVxdWlyZWQgZm9yIFNlbGVjdG9yCi0KLSAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLSAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImxvY2FsaG9zdCIpLCAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGxpc3RlblBvcnQpOwotICAgICAgICBtTGlzdGVuQ2hhbm5lbC5zb2NrZXQoKS5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7ICAvLyBlbmFibGUgU09fUkVVU0VBRERSCi0gICAgICAgIG1MaXN0ZW5DaGFubmVsLnNvY2tldCgpLmJpbmQoYWRkcik7Ci0KLSAgICAgICAgbVJlYWRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKElOSVRJQUxfQlVGX1NJWkUpOwotICAgICAgICBtUHJlRGF0YUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoUFJFX0RBVEFfQlVGX1NJWkUpOwotICAgICAgICBtQ29ublN0YXRlID0gU1RfTk9UX0NPTk5FQ1RFRDsKLQotICAgICAgICBMb2cuZCgiZGRtcyIsICJDcmVhdGVkOiAiICsgdGhpcy50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zICJ0cnVlIiBpZiBhIGRlYnVnZ2VyIGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB1cy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVidWdnZXJBdHRhY2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1DaGFubmVsICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHRoZSBEZWJ1Z2dlciBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBtQ2hhbm5lbCAhPSBudWxsIG1lYW5zIHdlIGhhdmUgY29ubmVjdGlvbiwgU1RfUkVBRFkgbWVhbnMgaXQncyBnb2luZwotICAgICAgICByZXR1cm4gIltEZWJ1Z2dlciAiICsgbUxpc3RlblBvcnQgKyAiLS0+IiArIG1DbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldFBpZCgpCi0gICAgICAgICAgICAgICAgKyAoKG1Db25uU3RhdGUgIT0gU1RfUkVBRFkpID8gIiBpbmFjdGl2ZV0iIDogIiBhY3RpdmVdIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgdGhlIGRlYnVnZ2VyJ3MgbGlzdGVuIHNvY2tldCB3aXRoIHRoZSBTZWxlY3Rvci4KLSAgICAgKi8KLSAgICB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoU2VsZWN0b3Igc2VsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtTGlzdGVuQ2hhbm5lbC5yZWdpc3RlcihzZWwsIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQsIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQ2xpZW50IGJlaW5nIGRlYnVnZ2VkLgotICAgICAqLwotICAgIENsaWVudCBnZXRDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uLCBidXQgb25seSBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLgotICAgICAqCi0gICAgICogTXVzdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCBvdGhlciB1c2VzIG9mIG1DaGFubmVsIGFuZCBtUHJlQnVmZmVyLgotICAgICAqCi0gICAgICogUmV0dXJucyAibnVsbCIgaWYgd2UncmUgYWxyZWFkeSB0YWxraW5nIHRvIHNvbWVib2R5LgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCBTb2NrZXRDaGFubmVsIGFjY2VwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhY2NlcHQobUxpc3RlbkNoYW5uZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0ZW4gY2hhbm5lbC4gIFRoaXMKLSAgICAgKiBpcyBzbyB3ZSBjYW4gbGlzdGVuIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHRoZSAiY3VycmVudCIgY2xpZW50LAotICAgICAqIHdoZXJlICJjdXJyZW50IiBpcyBjb25zdGFudGx5IGluIGZsdXguCi0gICAgICoKLSAgICAgKiBNdXN0IGJlIHN5bmNocm9uaXplZCB3aXRoIG90aGVyIHVzZXMgb2YgbUNoYW5uZWwgYW5kIG1QcmVCdWZmZXIuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zICJudWxsIiBpZiB3ZSdyZSBhbHJlYWR5IHRhbGtpbmcgdG8gc29tZWJvZHkuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIFNvY2tldENoYW5uZWwgYWNjZXB0KFNlcnZlclNvY2tldENoYW5uZWwgbGlzdGVuQ2hhbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobGlzdGVuQ2hhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTb2NrZXRDaGFubmVsIG5ld0NoYW47Ci0KLSAgICAgICAgICAgIG5ld0NoYW4gPSBsaXN0ZW5DaGFuLmFjY2VwdCgpOwotICAgICAgICAgICAgaWYgKG1DaGFubmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJkZWJ1Z2dlciBhbHJlYWR5IHRhbGtpbmcgdG8gIiArIG1DbGllbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uICIgKyBtTGlzdGVuUG9ydCk7Ci0gICAgICAgICAgICAgICAgbmV3Q2hhbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYW5uZWwgPSBuZXdDaGFuOwotICAgICAgICAgICAgbUNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOyAgICAgICAgIC8vIHJlcXVpcmVkIGZvciBTZWxlY3RvcgotICAgICAgICAgICAgbUNvbm5TdGF0ZSA9IFNUX0FXQUlUX1NIQUtFOwotICAgICAgICAgICAgcmV0dXJuIG1DaGFubmVsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIGRhdGEgY29ubmVjdGlvbiBvbmx5LgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlRGF0YSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoYW5uZWwuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQ2hhbm5lbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbm5TdGF0ZSA9IFNUX05PVF9DT05ORUNURUQ7Ci0KLSAgICAgICAgICAgICAgICBDbGllbnREYXRhIGNkID0gbUNsaWVudC5nZXRDbGllbnREYXRhKCk7Ci0gICAgICAgICAgICAgICAgY2Quc2V0RGVidWdnZXJDb25uZWN0aW9uU3RhdHVzKERlYnVnZ2VyU3RhdHVzLkRFRkFVTFQpOwotICAgICAgICAgICAgICAgIG1DbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfREVCVUdHRVJfU1RBVFVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBMb2cudygiZGRtcyIsICJGYWlsZWQgdG8gY2xvc2UgZGF0YSAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgc29ja2V0IHRoYXQncyBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucyBhbmQgKGlmCi0gICAgICogd2UncmUgY29ubmVjdGVkKSB0aGUgZGVidWdnZXIgZGF0YSBzb2NrZXQuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUxpc3RlbkNoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5DaGFubmVsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGlzdGVuQ2hhbm5lbCA9IG51bGw7Ci0gICAgICAgICAgICBjbG9zZURhdGEoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBMb2cudygiZGRtcyIsICJGYWlsZWQgdG8gY2xvc2UgbGlzdGVuZXIgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogPz8gYWRkIGEgZmluYWxpemVyIHRoYXQgdmVyaWZpZXMgdGhlIGNoYW5uZWwgd2FzIGNsb3NlZAotCi0gICAgLyoqCi0gICAgICogUmVhZCBkYXRhIGZyb20gb3VyIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMga25vd24gdG8gYmUgYXZhaWxhYmxlLCBhbmQgd2UgZG9uJ3QgeWV0Ci0gICAgICogaGF2ZSBhIGZ1bGwgcGFja2V0IGluIHRoZSBidWZmZXIuICBJZiB0aGUgYnVmZmVyIGlzIGF0IGNhcGFjaXR5LAotICAgICAqIGV4cGFuZCBpdC4KLSAgICAgKi8KLSAgICB2b2lkIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgY291bnQ7Ci0KLSAgICAgICAgaWYgKG1SZWFkQnVmZmVyLnBvc2l0aW9uKCkgPT0gbVJlYWRCdWZmZXIuY2FwYWNpdHkoKSkgewotICAgICAgICAgICAgaWYgKG1SZWFkQnVmZmVyLmNhcGFjaXR5KCkgKiAyID4gTUFYX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJFeHBhbmRpbmcgcmVhZCBidWZmZXIgdG8gIgotICAgICAgICAgICAgICAgICsgbVJlYWRCdWZmZXIuY2FwYWNpdHkoKSAqIDIpOwotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIG5ld0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUobVJlYWRCdWZmZXIuY2FwYWNpdHkoKSAqIDIpOwotICAgICAgICAgICAgbVJlYWRCdWZmZXIucG9zaXRpb24oMCk7Ci0gICAgICAgICAgICBuZXdCdWZmZXIucHV0KG1SZWFkQnVmZmVyKTsgICAgIC8vIGxlYXZlcyAicG9zaXRpb24iIGF0IGVuZAotCi0gICAgICAgICAgICBtUmVhZEJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvdW50ID0gbUNoYW5uZWwucmVhZChtUmVhZEJ1ZmZlcik7Ci0gICAgICAgIExvZy52KCJkZG1zIiwgIlJlYWQgIiArIGNvdW50ICsgIiBieXRlcyBmcm9tICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKGNvdW50IDwgMCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZWFkIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpcnN0IGZ1bGwgSkRXUCBwYWNrZXQgaW4gdGhlIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIElmIHdlIGRvbid0IHlldCBoYXZlIGEgZnVsbCBwYWNrZXQsIHJldHVybiBudWxsLgotICAgICAqCi0gICAgICogSWYgd2UgaGF2ZW4ndCB5ZXQgcmVjZWl2ZWQgdGhlIEpEV1AgaGFuZHNoYWtlLCB3ZSB3YXRjaCBmb3IgaXQgaGVyZQotICAgICAqIGFuZCBjb25zdW1lIGl0IHdpdGhvdXQgYWRtaXR0aW5nIHRvIGhhdmUgZG9uZSBzby4gIFdlIGFsc28gc2VuZAotICAgICAqIHRoZSBoYW5kc2hha2UgcmVzcG9uc2UgdG8gdGhlIGRlYnVnZ2VyLCBhbG9uZyB3aXRoIGFueSBwZW5kaW5nCi0gICAgICogcHJlLWNvbm5lY3Rpb24gZGF0YSwgd2hpY2ggaXMgd2h5IHRoaXMgY2FuIHRocm93IGFuIElPRXhjZXB0aW9uLgotICAgICAqLwotICAgIEpkd3BQYWNrZXQgZ2V0SmR3cFBhY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE9uIGVudHJ5LCB0aGUgZGF0YSBzdGFydHMgYXQgb2Zmc2V0IDAgYW5kIGVuZHMgYXQgInBvc2l0aW9uIi4KLSAgICAgICAgICogImxpbWl0IiBpcyBzZXQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtQ29ublN0YXRlID09IFNUX0FXQUlUX1NIQUtFKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgICAgICByZXN1bHQgPSBKZHdwUGFja2V0LmZpbmRIYW5kc2hha2UobVJlYWRCdWZmZXIpOwotICAgICAgICAgICAgLy9Mb2cudigiZGRtcyIsICJmaW5kSGFuZDogIiArIHJlc3VsdCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGNhc2UgSmR3cFBhY2tldC5IQU5EU0hBS0VfR09PRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiR29vZCBoYW5kc2hha2UgZnJvbSBkZWJ1Z2dlciIpOwotICAgICAgICAgICAgICAgICAgICBKZHdwUGFja2V0LmNvbnN1bWVIYW5kc2hha2UobVJlYWRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBzZW5kSGFuZHNoYWtlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uU3RhdGUgPSBTVF9SRUFEWTsKLQotICAgICAgICAgICAgICAgICAgICBDbGllbnREYXRhIGNkID0gbUNsaWVudC5nZXRDbGllbnREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNkLnNldERlYnVnZ2VyQ29ubmVjdGlvblN0YXR1cyhEZWJ1Z2dlclN0YXR1cy5BVFRBQ0hFRCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfREVCVUdHRVJfU1RBVFVTKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBhbm90aGVyIHBhY2tldCBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRKZHdwUGFja2V0KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBKZHdwUGFja2V0LkhBTkRTSEFLRV9CQUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRlYnVnZ2VyLCB0aHJvdyBhbiBleGNlcHRpb24gc28gd2UgZHJvcCB0aGUgbGluZQotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJCYWQgaGFuZHNoYWtlIGZyb20gZGVidWdnZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJiYWQgaGFuZHNoYWtlIik7Ci0gICAgICAgICAgICAgICAgY2FzZSBKZHdwUGFja2V0LkhBTkRTSEFLRV9OT1RZRVQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIlVua25vd24gcGFja2V0IHdoaWxlIHdhaXRpbmcgZm9yIGNsaWVudCBoYW5kc2hha2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKG1Db25uU3RhdGUgPT0gU1RfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChtUmVhZEJ1ZmZlci5wb3NpdGlvbigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBMb2cudigiZGRtcyIsICJDaGVja2luZyAiICsgbVJlYWRCdWZmZXIucG9zaXRpb24oKSArICIgYnl0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBKZHdwUGFja2V0LmZpbmRQYWNrZXQobVJlYWRCdWZmZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoImRkbXMiLCAiUmVjZWl2aW5nIGRhdGEgaW4gc3RhdGUgPSAiICsgbUNvbm5TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkIGEgcGFja2V0IHRvIHRoZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiAibUNsaWVudCIgd2lsbCBuZXZlciBiZSBudWxsLCB0aG91Z2ggaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBjaGFubmVsCi0gICAgICogaW4gdGhlIGNsaWVudCBoYXMgY2xvc2VkIGFuZCBvdXIgc2VuZCBhdHRlbXB0IHdpbGwgZmFpbC4KLSAgICAgKgotICAgICAqIENvbnN1bWVzIHRoZSBwYWNrZXQuCi0gICAgICovCi0gICAgdm9pZCBmb3J3YXJkUGFja2V0VG9DbGllbnQoSmR3cFBhY2tldCBwYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1DbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSBoYW5kc2hha2UgdG8gdGhlIGRlYnVnZ2VyLiAgV2UgYWxzbyBzZW5kIGFsb25nIGFueSBwYWNrZXRzCi0gICAgICogd2UgYWxyZWFkeSByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgKHVzdWFsbHkganVzdCBhIFZNX1NUQVJUIGV2ZW50LAotICAgICAqIGlmIGFueXRoaW5nIGF0IGFsbCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZW5kSGFuZHNoYWtlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciB0ZW1wQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShKZHdwUGFja2V0LkhBTkRTSEFLRV9MRU4pOwotICAgICAgICBKZHdwUGFja2V0LnB1dEhhbmRzaGFrZSh0ZW1wQnVmZmVyKTsKLSAgICAgICAgaW50IGV4cGVjdGVkTGVuZ3RoID0gdGVtcEJ1ZmZlci5wb3NpdGlvbigpOwotICAgICAgICB0ZW1wQnVmZmVyLmZsaXAoKTsKLSAgICAgICAgaWYgKG1DaGFubmVsLndyaXRlKHRlbXBCdWZmZXIpICE9IGV4cGVjdGVkTGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInBhcnRpYWwgaGFuZHNoYWtlIHdyaXRlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBleHBlY3RlZExlbmd0aCA9IG1QcmVEYXRhQnVmZmVyLnBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIlNlbmRpbmcgIiArIG1QcmVEYXRhQnVmZmVyLnBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGJ5dGVzIG9mIHNhdmVkIGRhdGEiKTsKLSAgICAgICAgICAgIG1QcmVEYXRhQnVmZmVyLmZsaXAoKTsKLSAgICAgICAgICAgIGlmIChtQ2hhbm5lbC53cml0ZShtUHJlRGF0YUJ1ZmZlcikgIT0gZXhwZWN0ZWRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInBhcnRpYWwgcHJlLWRhdGEgd3JpdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmVEYXRhQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgcGFja2V0IHRvIHRoZSBkZWJ1Z2dlci4KLSAgICAgKgotICAgICAqIElkZWFsbHksIHdlIGNhbiBkbyB0aGlzIHdpdGggYSBzaW5nbGUgY2hhbm5lbCB3cml0ZS4gIElmIHRoYXQgZG9lc24ndAotICAgICAqIGhhcHBlbiwgd2UgaGF2ZSB0byBwcmV2ZW50IGFueWJvZHkgZWxzZSBmcm9tIHdyaXRpbmcgdG8gdGhlIGNoYW5uZWwKLSAgICAgKiB1bnRpbCB0aGlzIHBhY2tldCBjb21wbGV0ZXMsIHNvIHdlIHN5bmNocm9uaXplIG9uIHRoZSBjaGFubmVsLgotICAgICAqCi0gICAgICogQW5vdGhlciBnb2FsIGlzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJ1ZmZlciBjb3BpZXMsIHNvIHdlIHdyaXRlCi0gICAgICogZGlyZWN0bHkgb3V0IG9mIHRoZSBKZHdwUGFja2V0J3MgQnl0ZUJ1ZmZlci4KLSAgICAgKgotICAgICAqIFdlIG11c3Qgc3luY2hyb25pemUgb24gIm1DaGFubmVsIiBiZWZvcmUgd3JpdGluZyB0byBpdC4gIFdlIHdhbnQgdG8KLSAgICAgKiBjb29yZGluYXRlIHRoZSBidWZmZXJlZCBkYXRhIHdpdGggbUNoYW5uZWwgY3JlYXRpb24sIHNvIHRoaXMgd2hvbGUKLSAgICAgKiBtZXRob2QgaXMgc3luY2hyb25pemVkLgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCB2b2lkIHNlbmRBbmRDb25zdW1lKEpkd3BQYWNrZXQgcGFja2V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChtQ2hhbm5lbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQnVmZmVyIHRoaXMgdXAgc28gd2UgY2FuIHNlbmQgaXQgdG8gdGhlIGRlYnVnZ2VyIHdoZW4gaXQKLSAgICAgICAgICAgICAqIGZpbmFsbHkgZG9lcyBjb25uZWN0LiAgVGhpcyBpcyBlc3NlbnRpYWwgYmVjYXVzZSB0aGUgVk1fU1RBUlQKLSAgICAgICAgICAgICAqIG1lc3NhZ2UgbWlnaHQgYmUgdGVsbGluZyB0aGUgZGVidWdnZXIgdGhhdCB0aGUgVk0gaXMKLSAgICAgICAgICAgICAqIHN1c3BlbmRlZC4gIFRoZSBhbHRlcm5hdGl2ZSBhcHByb2FjaCB3b3VsZCBiZSBmb3IgdXMgdG8KLSAgICAgICAgICAgICAqIGNhcHR1cmUgYW5kIGludGVycHJldCBWTV9TVEFSVCBhbmQgc2VuZCBpdCBsYXRlciBpZiB3ZQotICAgICAgICAgICAgICogZGlkbid0IGNob29zZSB0byB1bi1zdXNwZW5kIHRoZSBWTSBmb3Igb3VyIG93biBwdXJwb3Nlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiU2F2aW5nIHBhY2tldCAweCIKLSAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhY2tldC5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBwYWNrZXQubW92ZVBhY2tldChtUHJlRGF0YUJ1ZmZlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYWNrZXQud3JpdGVBbmRDb25zdW1lKG1DaGFubmVsKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0RldmljZS5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0RldmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNkODE3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZXZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuU3luY1Jlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0KLS8qKgotICogQSBEZXZpY2UuIEl0IGNhbiBiZSBhIHBoeXNpY2FsIGRldmljZSBvciBhbiBlbXVsYXRvci4KLSAqLwotZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgSURldmljZSB7Ci0KLSAgICAvKiogRW11bGF0b3IgU2VyaWFsIE51bWJlciByZWdleHAuICovCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBSRV9FTVVMQVRPUl9TTiA9ICJlbXVsYXRvci0oXFxkKykiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogU2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNlcmlhbE51bWJlciA9IG51bGw7Ci0KLSAgICAvKiogTmFtZSBvZiB0aGUgQVZEICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUF2ZE5hbWUgPSBudWxsOwotCi0gICAgLyoqIFN0YXRlIG9mIHRoZSBkZXZpY2UuICovCi0gICAgcHJpdmF0ZSBEZXZpY2VTdGF0ZSBtU3RhdGUgPSBudWxsOwotCi0gICAgLyoqIERldmljZSBwcm9wZXJ0aWVzLiAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2xpZW50PiBtQ2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8Q2xpZW50PigpOwotICAgIHByaXZhdGUgRGV2aWNlTW9uaXRvciBtTW9uaXRvcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkRldmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBTb2NrZXQgZm9yIHRoZSBjb25uZWN0aW9uIG1vbml0b3JpbmcgY2xpZW50IGNvbm5lY3Rpb24vZGlzY29ubmVjdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNvY2tldENoYW5uZWwgbVNvY2tldENoYW5uZWw7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgcmVjZWl2ZXIgZm9yICJwbSBpbnN0YWxsIHBhY2thZ2UuYXBrIiBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5zdGFsbFJlY2VpdmVyIGV4dGVuZHMgTXVsdGlMaW5lUmVjZWl2ZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTX09VVFBVVCA9ICJTdWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZBSUxVUkVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiRmFpbHVyZVxccytcXFsoLiopXFxdIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtRXJyb3JNZXNzYWdlID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgSW5zdGFsbFJlY2VpdmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoU1VDQ0VTU19PVVRQVVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IEZBSUxVUkVfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVycm9yTWVzc2FnZSA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FcnJvck1lc3NhZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI2dldFNlcmlhbE51bWJlcigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJpYWxOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2VyaWFsTnVtYmVyOwotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdmROYW1lKCkgewotICAgICAgICByZXR1cm4gbUF2ZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgQVZECi0gICAgICovCi0gICAgdm9pZCBzZXRBdmROYW1lKFN0cmluZyBhdmROYW1lKSB7Ci0gICAgICAgIGlmIChpc0VtdWxhdG9yKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0IHRoZSBBVkQgbmFtZSBvZiB0aGUgZGV2aWNlIGlzIG5vdCBhbiBlbXVsYXRvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUF2ZE5hbWUgPSBhdmROYW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZ2V0U3RhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyBEZXZpY2VTdGF0ZSBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLgotICAgICAqLwotICAgIHZvaWQgc2V0U3RhdGUoRGV2aWNlU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI2dldFByb3BlcnRpZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobVByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZ2V0UHJvcGVydHlDb3VudCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcm9wZXJ0eUNvdW50KCkgewotICAgICAgICByZXR1cm4gbVByb3BlcnRpZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBtUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbVNlcmlhbE51bWJlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI2lzT25saW5lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09ubGluZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBEZXZpY2VTdGF0ZS5PTkxJTkU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNpc0VtdWxhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtdWxhdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlcmlhbE51bWJlci5tYXRjaGVzKFJFX0VNVUxBVE9SX1NOKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI2lzT2ZmbGluZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPZmZsaW5lKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IERldmljZVN0YXRlLk9GRkxJTkU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNpc0Jvb3RMb2FkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQm9vdExvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBEZXZpY2VTdGF0ZS5CT09UTE9BREVSOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjaGFzQ2xpZW50cygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpZW50cygpIHsKLSAgICAgICAgcmV0dXJuIG1DbGllbnRzLnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNnZXRDbGllbnRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50W10gZ2V0Q2xpZW50cygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2xpZW50cykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGllbnRzLnRvQXJyYXkobmV3IENsaWVudFttQ2xpZW50cy5zaXplKCldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZ2V0Q2xpZW50KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIENsaWVudCBnZXRDbGllbnQoU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DbGllbnRzKSB7Ci0gICAgICAgICAgICBmb3IgKENsaWVudCBjIDogbUNsaWVudHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25OYW1lLmVxdWFscyhjLmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZ2V0U3luY1NlcnZpY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBTeW5jU2VydmljZSBnZXRTeW5jU2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN5bmNTZXJ2aWNlIHN5bmNTZXJ2aWNlID0gbmV3IFN5bmNTZXJ2aWNlKEFuZHJvaWREZWJ1Z0JyaWRnZS5zU29ja2V0QWRkciwgdGhpcyk7Ci0gICAgICAgIGlmIChzeW5jU2VydmljZS5vcGVuU3luYygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3luY1NlcnZpY2U7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNnZXRGaWxlTGlzdGluZ1NlcnZpY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTGlzdGluZ1NlcnZpY2UgZ2V0RmlsZUxpc3RpbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbGVMaXN0aW5nU2VydmljZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI2dldFNjcmVlbnNob3QoKQotICAgICAqLwotICAgIHB1YmxpYyBSYXdJbWFnZSBnZXRTY3JlZW5zaG90KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEFkYkhlbHBlci5nZXRGcmFtZUJ1ZmZlcihBbmRyb2lkRGVidWdCcmlkZ2Uuc1NvY2tldEFkZHIsIHRoaXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjZXhlY3V0ZVNoZWxsQ29tbWFuZChqYXZhLmxhbmcuU3RyaW5nLCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgSVNoZWxsT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBBZGJIZWxwZXIuZXhlY3V0ZVJlbW90ZUNvbW1hbmQoQW5kcm9pZERlYnVnQnJpZGdlLnNTb2NrZXRBZGRyLCBjb21tYW5kLCB0aGlzLAotICAgICAgICAgICAgICAgIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI3J1bkV2ZW50TG9nU2VydmljZShjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkV2ZW50TG9nU2VydmljZShMb2dSZWNlaXZlciByZWNlaXZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQWRiSGVscGVyLnJ1bkV2ZW50TG9nU2VydmljZShBbmRyb2lkRGVidWdCcmlkZ2Uuc1NvY2tldEFkZHIsIHRoaXMsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlI3J1bkxvZ1NlcnZpY2UoY29tLmFuZHJvaWQuZGRtbGliLmxvZy5Mb2dSZWNlaXZlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5Mb2dTZXJ2aWNlKFN0cmluZyBsb2duYW1lLAotICAgICAgICAgICAgTG9nUmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFkYkhlbHBlci5ydW5Mb2dTZXJ2aWNlKEFuZHJvaWREZWJ1Z0JyaWRnZS5zU29ja2V0QWRkciwgdGhpcywgbG9nbmFtZSwgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2UjY3JlYXRlRm9yd2FyZChpbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVGb3J3YXJkKGludCBsb2NhbFBvcnQsIGludCByZW1vdGVQb3J0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gQWRiSGVscGVyLmNyZWF0ZUZvcndhcmQoQW5kcm9pZERlYnVnQnJpZGdlLnNTb2NrZXRBZGRyLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICBsb2NhbFBvcnQsIHJlbW90ZVBvcnQpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiYWRiLWZvcndhcmQiLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNyZW1vdmVGb3J3YXJkKGludCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUZvcndhcmQoaW50IGxvY2FsUG9ydCwgaW50IHJlbW90ZVBvcnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBBZGJIZWxwZXIucmVtb3ZlRm9yd2FyZChBbmRyb2lkRGVidWdCcmlkZ2Uuc1NvY2tldEFkZHIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUG9ydCwgcmVtb3RlUG9ydCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKCJhZGItcmVtb3ZlLWZvcndhcmQiLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZSNnZXRDbGllbnROYW1lKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudE5hbWUoaW50IHBpZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DbGllbnRzKSB7Ci0gICAgICAgICAgICBmb3IgKENsaWVudCBjIDogbUNsaWVudHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYy5nZXRDbGllbnREYXRhKCkuZ2V0UGlkKCkgPT0gcGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgRGV2aWNlKERldmljZU1vbml0b3IgbW9uaXRvciwgU3RyaW5nIHNlcmlhbE51bWJlciwgRGV2aWNlU3RhdGUgZGV2aWNlU3RhdGUpIHsKLSAgICAgICAgbU1vbml0b3IgPSBtb25pdG9yOwotICAgICAgICBtU2VyaWFsTnVtYmVyID0gc2VyaWFsTnVtYmVyOwotICAgICAgICBtU3RhdGUgPSBkZXZpY2VTdGF0ZTsKLSAgICB9Ci0KLSAgICBEZXZpY2VNb25pdG9yIGdldE1vbml0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtTW9uaXRvcjsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZENsaWVudChDbGllbnQgY2xpZW50KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudHMpIHsKLSAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdDxDbGllbnQ+IGdldENsaWVudExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtQ2xpZW50czsKLSAgICB9Ci0KLSAgICBib29sZWFuIGhhc0NsaWVudChpbnQgcGlkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudHMpIHsKLSAgICAgICAgICAgIGZvciAoQ2xpZW50IGNsaWVudCA6IG1DbGllbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0UGlkKCkgPT0gcGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyQ2xpZW50TGlzdCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2xpZW50cykgewotICAgICAgICAgICAgbUNsaWVudHMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNsaWVudCBtb25pdG9yaW5nIHNvY2tldC4KLSAgICAgKiBAcGFyYW0gc29ja2V0Q2hhbm5lbCB0aGUgc29ja2V0cwotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpZW50TW9uaXRvcmluZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHsKLSAgICAgICAgbVNvY2tldENoYW5uZWwgPSBzb2NrZXRDaGFubmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsaWVudCBtb25pdG9yaW5nIHNvY2tldC4KLSAgICAgKi8KLSAgICBTb2NrZXRDaGFubmVsIGdldENsaWVudE1vbml0b3JpbmdTb2NrZXQoKSB7Ci0gICAgICAgIHJldHVybiBtU29ja2V0Q2hhbm5lbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEge0BsaW5rIENsaWVudH0gZnJvbSB0aGUgbGlzdC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSBjbGllbnQgdG8gcmVtb3ZlLgotICAgICAqIEBwYXJhbSBub3RpZnkgV2hldGhlciBvciBub3QgdG8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMgb2YgYSBjaGFuZ2UuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCwgYm9vbGVhbiBub3RpZnkpIHsKLSAgICAgICAgbU1vbml0b3IuYWRkUG9ydFRvQXZhaWxhYmxlTGlzdChjbGllbnQuZ2V0RGVidWdnZXJMaXN0ZW5Qb3J0KCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DbGllbnRzKSB7Ci0gICAgICAgICAgICBtQ2xpZW50cy5yZW1vdmUoY2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm90aWZ5KSB7Ci0gICAgICAgICAgICBtTW9uaXRvci5nZXRTZXJ2ZXIoKS5kZXZpY2VDaGFuZ2VkKHRoaXMsIENIQU5HRV9DTElFTlRfTElTVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShpbnQgY2hhbmdlTWFzaykgewotICAgICAgICBtTW9uaXRvci5nZXRTZXJ2ZXIoKS5kZXZpY2VDaGFuZ2VkKHRoaXMsIGNoYW5nZU1hc2spOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKENsaWVudCBjbGllbnQsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIG1Nb25pdG9yLmdldFNlcnZlcigpLmNsaWVudENoYW5nZWQoY2xpZW50LCBjaGFuZ2VNYXNrKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBsYWJlbCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Qcm9wZXJ0aWVzLnB1dChsYWJlbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGluc3RhbGxQYWNrYWdlKFN0cmluZyBwYWNrYWdlRmlsZVBhdGgsIGJvb2xlYW4gcmVpbnN0YWxsKQotICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgIFN0cmluZyByZW1vdGVGaWxlUGF0aCA9IHN5bmNQYWNrYWdlVG9EZXZpY2UocGFja2FnZUZpbGVQYXRoKTsKLSAgICAgICBTdHJpbmcgcmVzdWx0ID0gaW5zdGFsbFJlbW90ZVBhY2thZ2UocmVtb3RlRmlsZVBhdGgsIHJlaW5zdGFsbCk7Ci0gICAgICAgcmVtb3ZlUmVtb3RlUGFja2FnZShyZW1vdGVGaWxlUGF0aCk7Ci0gICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzeW5jUGFja2FnZVRvRGV2aWNlKFN0cmluZyBsb2NhbEZpbGVQYXRoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlRmlsZU5hbWUgPSBnZXRGaWxlTmFtZShsb2NhbEZpbGVQYXRoKTsKLSAgICAgICAgICAgIFN0cmluZyByZW1vdGVGaWxlUGF0aCA9IFN0cmluZy5mb3JtYXQoIi9kYXRhL2xvY2FsL3RtcC8lMSRzIiwgcGFja2FnZUZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBMb2cuZChwYWNrYWdlRmlsZU5hbWUsIFN0cmluZy5mb3JtYXQoIlVwbG9hZGluZyAlMSRzIG9udG8gZGV2aWNlICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VGaWxlTmFtZSwgZ2V0U2VyaWFsTnVtYmVyKCkpKTsKLQotICAgICAgICAgICAgU3luY1NlcnZpY2Ugc3luYyA9IGdldFN5bmNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc3luYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJVcGxvYWRpbmcgZmlsZSBvbnRvIGRldmljZSAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gc3luYy5wdXNoRmlsZShsb2NhbEZpbGVQYXRoLCByZW1vdGVGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNTZXJ2aWNlLmdldE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldENvZGUoKSAhPSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byB1cGxvYWQgZmlsZTogJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gb3BlbiBzeW5jIGNvbm5lY3Rpb24hIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVtb3RlRmlsZVBhdGg7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBvcGVuIHN5bmMgY29ubmVjdGlvbiEgcmVhc29uOiAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gYSBsb2NhbCBmaWxlIHBhdGgKLSAgICAgKiBAcGFyYW0gZmlsZVBhdGggZnVsbCBkaXJlY3RvcnkgcGF0aCB0byBmaWxlCi0gICAgICogQHJldHVybiB7QGxpbmsgU3RyaW5nfSBmaWxlIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZmlsZVBhdGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGZpbGVQYXRoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaW5zdGFsbFJlbW90ZVBhY2thZ2UoU3RyaW5nIHJlbW90ZUZpbGVQYXRoLCBib29sZWFuIHJlaW5zdGFsbCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEluc3RhbGxSZWNlaXZlciByZWNlaXZlciA9IG5ldyBJbnN0YWxsUmVjZWl2ZXIoKTsKLSAgICAgICAgU3RyaW5nIGNtZCA9IFN0cmluZy5mb3JtYXQocmVpbnN0YWxsID8gInBtIGluc3RhbGwgLXIgXCIlMSRzXCIiIDogInBtIGluc3RhbGwgXCIlMSRzXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGVQYXRoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQsIHJlY2VpdmVyKTsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldEVycm9yTWVzc2FnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVQYWNrYWdlKFN0cmluZyByZW1vdGVGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm93IHdlIGRlbGV0ZSB0aGUgYXBwIHdlIHN5bmMnZWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInJtICIgKyByZW1vdGVGaWxlUGF0aCwgbmV3IE51bGxPdXRwdXRSZWNlaXZlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgcGFja2FnZTogJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdW5pbnN0YWxsUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEluc3RhbGxSZWNlaXZlciByZWNlaXZlciA9IG5ldyBJbnN0YWxsUmVjZWl2ZXIoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gdW5pbnN0YWxsICIgKyBwYWNrYWdlTmFtZSwgcmVjZWl2ZXIpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0RldmljZU1vbml0b3IuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9EZXZpY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjY5OWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0RldmljZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQWRiSGVscGVyLkFkYlJlc3BvbnNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkRlYnVnZ2VyU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZWJ1Z1BvcnRNYW5hZ2VyLklEZWJ1Z1BvcnRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZS5EZXZpY2VTdGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIERldmljZSBtb25pdG9yLiBUaGlzIGNvbm5lY3RzIHRvIHRoZSBBbmRyb2lkIERlYnVnIEJyaWRnZSBhbmQgZ2V0IGRldmljZSBhbmQKLSAqIGRlYnVnZ2FibGUgcHJvY2VzcyBpbmZvcm1hdGlvbiBmcm9tIGl0LgotICovCi1maW5hbCBjbGFzcyBEZXZpY2VNb25pdG9yIHsKLSAgICBwcml2YXRlIGJ5dGVbXSBtTGVuZ3RoQnVmZmVyID0gbmV3IGJ5dGVbNF07Ci0gICAgcHJpdmF0ZSBieXRlW10gbUxlbmd0aEJ1ZmZlcjIgPSBuZXcgYnl0ZVs0XTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtUXVpdCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBBbmRyb2lkRGVidWdCcmlkZ2UgbVNlcnZlcjsKLQotICAgIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBtTWFpbkFkYkNvbm5lY3Rpb24gPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTW9uaXRvcmluZyA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uQXR0ZW1wdCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlc3RhcnRBdHRlbXB0Q291bnQgPSAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbERldmljZUxpc3REb25lID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PERldmljZT4gbURldmljZXMgPSBuZXcgQXJyYXlMaXN0PERldmljZT4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1EZWJ1Z2dlclBvcnRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPENsaWVudCwgSW50ZWdlcj4gbUNsaWVudHNUb1Jlb3BlbiA9IG5ldyBIYXNoTWFwPENsaWVudCwgSW50ZWdlcj4oKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERldmljZU1vbml0b3J9IG9iamVjdCBhbmQgbGlua3MgaXQgdG8gdGhlIHJ1bm5pbmcKLSAgICAgKiB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSBvYmplY3QuCi0gICAgICogQHBhcmFtIHNlcnZlciB0aGUgcnVubmluZyB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfS4KLSAgICAgKi8KLSAgICBEZXZpY2VNb25pdG9yKEFuZHJvaWREZWJ1Z0JyaWRnZSBzZXJ2ZXIpIHsKLSAgICAgICAgbVNlcnZlciA9IHNlcnZlcjsKLQotICAgICAgICBtRGVidWdnZXJQb3J0cy5hZGQoRGRtUHJlZmVyZW5jZXMuZ2V0RGVidWdQb3J0QmFzZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIG1vbml0b3JpbmcuCi0gICAgICovCi0gICAgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgbmV3IFRocmVhZCgiRGV2aWNlIExpc3QgTW9uaXRvciIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTW9uaXRvckxvb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBtb25pdG9yaW5nLgotICAgICAqLwotICAgIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgbVF1aXQgPSB0cnVlOwotCi0gICAgICAgIC8vIHdha2V1cCB0aGUgbWFpbiBsb29wIHRocmVhZCBieSBjbG9zaW5nIHRoZSBtYWluIGNvbm5lY3Rpb24gdG8gYWRiLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1NYWluQWRiQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1haW5BZGJDb25uZWN0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3YWtlIHVwIHRoZSBzZWNvbmRhcnkgbG9vcCBieSBjbG9zaW5nIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgaWYgKG1TZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3Iud2FrZXVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgbW9uaXRvciBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBkZWJ1ZyBicmlkZ2Ugc2VydmVyLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTW9uaXRvcmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1Nb25pdG9yaW5nOwotICAgIH0KLQotICAgIGludCBnZXRDb25uZWN0aW9uQXR0ZW1wdENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25BdHRlbXB0OwotICAgIH0KLQotICAgIGludCBnZXRSZXN0YXJ0QXR0ZW1wdENvdW50KCkgewotICAgICAgICByZXR1cm4gbVJlc3RhcnRBdHRlbXB0Q291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBEZXZpY2VbXSBnZXREZXZpY2VzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1EZXZpY2VzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZXMudG9BcnJheShuZXcgRGV2aWNlW21EZXZpY2VzLnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBoYXNJbml0aWFsRGV2aWNlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0aWFsRGV2aWNlTGlzdERvbmU7Ci0gICAgfQotCi0gICAgQW5kcm9pZERlYnVnQnJpZGdlIGdldFNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2ZXI7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRDbGllbnRUb0Ryb3BBbmRSZW9wZW4oQ2xpZW50IGNsaWVudCwgaW50IHBvcnQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2xpZW50c1RvUmVvcGVuKSB7Ci0gICAgICAgICAgICBMb2cuZCgiRGV2aWNlTW9uaXRvciIsCi0gICAgICAgICAgICAgICAgICAgICJBZGRpbmcgIiArIGNsaWVudCArICIgdG8gbGlzdCBvZiBjbGllbnQgdG8gcmVvcGVuICgiICsgcG9ydCArIikuIik7Ci0gICAgICAgICAgICBpZiAobUNsaWVudHNUb1Jlb3Blbi5nZXQoY2xpZW50KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNsaWVudHNUb1Jlb3Blbi5wdXQoY2xpZW50LCBwb3J0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU2VsZWN0b3Iud2FrZXVwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW9uaXRvcnMgdGhlIGRldmljZXMuIFRoaXMgY29ubmVjdHMgdG8gdGhlIERlYnVnIEJyaWRnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZXZpY2VNb25pdG9yTG9vcCgpIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobU1haW5BZGJDb25uZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkRldmljZU1vbml0b3IiLCAiT3BlbmluZyBhZGIgY29ubmVjdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICBtTWFpbkFkYkNvbm5lY3Rpb24gPSBvcGVuQWRiQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU1haW5BZGJDb25uZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQXR0ZW1wdCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkRldmljZU1vbml0b3IiLCAiQ29ubmVjdGlvbiBhdHRlbXB0czogIiArIG1Db25uZWN0aW9uQXR0ZW1wdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25BdHRlbXB0ID4gMTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZlci5zdGFydEFkYigpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0QXR0ZW1wdENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJEZXZpY2VNb25pdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRiIHJlc3RhcnQgYXR0ZW1wdHM6ICIgKyBtUmVzdGFydEF0dGVtcHRDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3RhcnRBdHRlbXB0Q291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBQml0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRGV2aWNlTW9uaXRvciIsICJDb25uZWN0ZWQgdG8gYWRiIGZvciBkZXZpY2UgbW9uaXRvcmluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BdHRlbXB0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtTWFpbkFkYkNvbm5lY3Rpb24gIT0gbnVsbCAmJiBtTW9uaXRvcmluZyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtTW9uaXRvcmluZyA9IHNlbmREZXZpY2VMaXN0TW9uaXRvcmluZ1JlcXVlc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1vbml0b3JpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkTGVuZ3RoKG1NYWluQWRiQ29ubmVjdGlvbiwgbUxlbmd0aEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBpbmNvbWluZyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW5jb21pbmdEZXZpY2VEYXRhKGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGJ1aWxkIHRoZSBsaXN0IGF0IGxlYXN0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbERldmljZUxpc3REb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uIGFjZSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBiZWNhdXNlIG9mIGEgY2FsbCB0byBRdWl0LiBXZSBkbyBub3RoaW5nLCBhbmQgdGhlIGxvb3Agd2lsbCBicmVhay4KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIGlmIChtUXVpdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRGV2aWNlTW9uaXRvciIsICJBZGIgY29ubmVjdGlvbiBFcnJvcjoiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Nb25pdG9yaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWFpbkFkYkNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFpbkFkYkNvbm5lY3Rpb24uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGF0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYWluQWRiQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKG1RdWl0ID09IGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTbGVlcHMgZm9yIGEgbGl0dGxlIGJpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd2FpdEFCaXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBkZWJ1ZyBicmlkZ2Ugc2VydmVyLgotICAgICAqIEByZXR1cm4gYSBjb25uZWN0IHNvY2tldCBpZiBzdWNjZXNzLCBudWxsIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBvcGVuQWRiQ29ubmVjdGlvbigpIHsKLSAgICAgICAgTG9nLmQoIkRldmljZU1vbml0b3IiLCAiQ29ubmVjdGluZyB0byBhZGIgZm9yIERldmljZSBMaXN0IE1vbml0b3JpbmcuLi4iKTsKLQotICAgICAgICBTb2NrZXRDaGFubmVsIGFkYkNoYW5uZWwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRiQ2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbihBbmRyb2lkRGVidWdCcmlkZ2Uuc1NvY2tldEFkZHIpOwotICAgICAgICAgICAgYWRiQ2hhbm5lbC5zb2NrZXQoKS5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWRiQ2hhbm5lbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlbmREZXZpY2VMaXN0TW9uaXRvcmluZ1JlcXVlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBieXRlW10gcmVxdWVzdCA9IEFkYkhlbHBlci5mb3JtQWRiUmVxdWVzdCgiaG9zdDp0cmFjay1kZXZpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZiAoQWRiSGVscGVyLndyaXRlKG1NYWluQWRiQ29ubmVjdGlvbiwgcmVxdWVzdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIExvZy5lKCJEZXZpY2VNb25pdG9yIiwgIlNlbmRpbmcgVHJhY2tpbmcgcmVxdWVzdCBmYWlsZWQhIik7Ci0gICAgICAgICAgICBtTWFpbkFkYkNvbm5lY3Rpb24uY2xvc2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU2VuZGluZyBUcmFja2luZyByZXF1ZXN0IGZhaWxlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFkYlJlc3BvbnNlIHJlc3AgPSBBZGJIZWxwZXIucmVhZEFkYlJlc3BvbnNlKG1NYWluQWRiQ29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiByZWFkRGlhZ1N0cmluZyAqLyk7Ci0KLSAgICAgICAgaWYgKHJlc3AuaW9TdWNjZXNzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRGV2aWNlTW9uaXRvciIsICJGYWlsZWQgdG8gcmVhZCB0aGUgYWRiIHJlc3BvbnNlISIpOwotICAgICAgICAgICAgbU1haW5BZGJDb25uZWN0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byByZWFkIHRoZSBhZGIgcmVzcG9uc2UhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcC5va2F5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyByZXF1ZXN0IHdhcyByZWZ1c2VkIGJ5IGFkYiEKLSAgICAgICAgICAgIExvZy5lKCJEZXZpY2VNb25pdG9yIiwgImFkYiByZWZ1c2VkIHJlcXVlc3Q6ICIgKyByZXNwLm1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3Aub2theTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYW4gaW5jb21pbmcgZGV2aWNlIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0Ci0gICAgICogQHBhcmFtIHNvY2tldAotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNvbWluZ0RldmljZURhdGEoaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0PERldmljZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGV2aWNlPigpOwotCi0gICAgICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSByZWFkKG1NYWluQWRiQ29ubmVjdGlvbiwgYnVmZmVyKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gZGV2aWNlcyA9IHJlc3VsdC5zcGxpdCgiXG4iKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgZCA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbSA9IGQuc3BsaXQoIlx0Iik7IC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBhZGIgdXNlcyBvbmx5IHNlcmlhbCBudW1iZXJzIHRvIGlkZW50aWZ5IGRldmljZXMKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlIGRldmljZSA9IG5ldyBEZXZpY2UodGhpcywgcGFyYW1bMF0gLypzZXJpYWxudW1iZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VTdGF0ZS5nZXRTdGF0ZShwYXJhbVsxXSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgbWVyZ2UgdGhlIG5ldyBkZXZpY2VzIHdpdGggdGhlIG9sZCBvbmVzLgotICAgICAgICB1cGRhdGVEZXZpY2VzKGxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGVzIHRoZSBkZXZpY2UgbGlzdCB3aXRoIHRoZSBuZXcgaXRlbXMgcmVjZWl2ZWQgZnJvbSB0aGUgbW9uaXRvcmluZyBzZXJ2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZXZpY2VzKEFycmF5TGlzdDxEZXZpY2U+IG5ld0xpc3QpIHsKLSAgICAgICAgLy8gYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBtU2VydmVyLmRldmljZURpc2Nvbm5lY3RlZCB3aGljaCB3aWxsIGFjcXVpcmUgdGhpcyBsb2NrCi0gICAgICAgIC8vIHdlIGxvY2sgaXQgZmlyc3QsIHNvIHRoYXQgdGhlIEFuZHJvaWREZWJ1Z0JyaWRnZSBsb2NrIGlzIGFsd2F5cyBsb2NrZWQgZmlyc3QuCi0gICAgICAgIHN5bmNocm9uaXplZCAoQW5kcm9pZERlYnVnQnJpZGdlLmdldExvY2soKSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGV2aWNlcykgewotICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIGRldmljZSBpbiB0aGUgY3VycmVudCBsaXN0LCB3ZSBsb29rIGZvciBhIG1hdGNoaW5nIHRoZSBuZXcgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyAqIGlmIHdlIGZpbmQgaXQsIHdlIHVwZGF0ZSB0aGUgY3VycmVudCBvYmplY3Qgd2l0aCB3aGF0ZXZlciBuZXcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAvLyAgIHRoZXJlIGlzCi0gICAgICAgICAgICAgICAgLy8gICAobW9zdGx5IHN0YXRlIGNoYW5nZSwgaWYgdGhlIGRldmljZSBiZWNvbWVzIHJlYWR5LCB3ZSBxdWVyeSBmb3IgYnVpbGQgaW5mbykuCi0gICAgICAgICAgICAgICAgLy8gICBXZSBhbHNvIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIG5ldyBsaXN0IHRvIG1hcmsgaXQgYXMgInByb2Nlc3NlZCIKLSAgICAgICAgICAgICAgICAvLyAqIGlmIHdlIGRvIG5vdCBmaW5kIGl0LCB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgY3VycmVudCBsaXN0LgotICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhpcyBpcyBkb25lLCB0aGUgbmV3IGxpc3QgY29udGFpbnMgZGV2aWNlIHdlIGFyZW4ndCBtb25pdG9yaW5nIHlldCwgc28gd2UKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlbSB0byB0aGUgbGlzdCwgYW5kIHN0YXJ0IG1vbml0b3JpbmcgdGhlbS4KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGQgPSAwIDsgZCA8IG1EZXZpY2VzLnNpemUoKSA7KSB7Ci0gICAgICAgICAgICAgICAgICAgIERldmljZSBkZXZpY2UgPSBtRGV2aWNlcy5nZXQoZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBzaW1pbGFyIGRldmljZSBpbiB0aGUgbmV3IGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG5ld0xpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgZGQgPSAwIDsgZGQgPCBjb3VudCA7IGRkKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBuZXdEZXZpY2UgPSBuZXdMaXN0LmdldChkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgaXQgbWF0Y2hlcyBpbiBpZCBhbmQgc2VyaWFsIG51bWJlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkuZXF1YWxzKGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGUgaWYgbmVlZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0U3RhdGUoKSAhPSBuZXdEZXZpY2UuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Uuc2V0U3RhdGUobmV3RGV2aWNlLmdldFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UudXBkYXRlKERldmljZS5DSEFOR0VfU1RBVEUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UganVzdCBnb3QgcmVhZHkvb25saW5lLCB3ZSBuZWVkIHRvIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vbml0b3JpbmcgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuaXNPbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRDbGllbnRTdXBwb3J0KCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE1vbml0b3JpbmdEZXZpY2UoZGV2aWNlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRGV2aWNlTW9uaXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdGFydCBtb25pdG9yaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmdldFByb3BlcnR5Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlOZXdEZXZpY2VGb3JJbmZvKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIG5ldyBkZXZpY2UgZnJvbSB0aGUgbGlzdCBzaW5jZSBpdCdzIGJlZW4gdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3QucmVtb3ZlKGRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hdGNoID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGlzIGdvbmUsIHdlIG5lZWQgdG8gcmVtb3ZlIGl0LCBhbmQga2VlcCBjdXJyZW50IGluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBwcm9jZXNzIHRoZSBuZXh0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZlci5kZXZpY2VEaXNjb25uZWN0ZWQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG5leHQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBkKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIHNob3VsZCBzdGlsbCBoYXZlIHNvbWUgbmV3IGRldmljZXMgaW4gbmV3TGlzdCwgc28gd2UKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRoZW0uCi0gICAgICAgICAgICAgICAgZm9yIChEZXZpY2UgbmV3RGV2aWNlIDogbmV3TGlzdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlbSB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlcy5hZGQobmV3RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZlci5kZXZpY2VDb25uZWN0ZWQobmV3RGV2aWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBtb25pdG9yaW5nIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkRGVidWdCcmlkZ2UuZ2V0Q2xpZW50U3VwcG9ydCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEZXZpY2UuaXNPbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TW9uaXRvcmluZ0RldmljZShuZXdEZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlaXIgYnVpbGQgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0RldmljZS5pc09ubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeU5ld0RldmljZUZvckluZm8obmV3RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXdMaXN0LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZURldmljZShEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGRldmljZS5jbGVhckNsaWVudExpc3QoKTsKLSAgICAgICAgbURldmljZXMucmVtb3ZlKGRldmljZSk7Ci0KLSAgICAgICAgU29ja2V0Q2hhbm5lbCBjaGFubmVsID0gZGV2aWNlLmdldENsaWVudE1vbml0b3JpbmdTb2NrZXQoKTsKLSAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIHRoZSBjbG9zZSBmYWlscy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgYSBkZXZpY2UgZm9yIGl0cyBidWlsZCBpbmZvLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB0byBxdWVyeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcXVlcnlOZXdEZXZpY2VGb3JJbmZvKERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gVE9ETzogZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHRocmVhZC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGdldCB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoR2V0UHJvcFJlY2VpdmVyLkdFVFBST1BfQ09NTUFORCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEdldFByb3BSZWNlaXZlcihkZXZpY2UpKTsKLQotICAgICAgICAgICAgLy8gbm93IGdldCB0aGUgZW11bGF0b3IgVmlydHVhbCBEZXZpY2UgbmFtZSAoaWYgYXBwbGljYWJsZSkuCi0gICAgICAgICAgICBpZiAoZGV2aWNlLmlzRW11bGF0b3IoKSkgewotICAgICAgICAgICAgICAgIEVtdWxhdG9yQ29uc29sZSBjb25zb2xlID0gRW11bGF0b3JDb25zb2xlLmdldENvbnNvbGUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uc29sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZS5zZXRBdmROYW1lKGNvbnNvbGUuZ2V0QXZkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGdldCB0aGUgYnVpbGQgaW5mbywgaXQgZG9lc24ndCBtYXR0ZXIgdG9vIG11Y2gKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIG1vbml0b3Jpbmcgc2VydmljZSBmb3IgYSBkZXZpY2UuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRvIG1vbml0b3IuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0TW9uaXRvcmluZ0RldmljZShEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9IG9wZW5BZGJDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKHNvY2tldENoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHNlbmREZXZpY2VNb25pdG9yaW5nUmVxdWVzdChzb2NrZXRDaGFubmVsLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGV2aWNlTW9uaXRvclRocmVhZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnNldENsaWVudE1vbml0b3JpbmdTb2NrZXQoc29ja2V0Q2hhbm5lbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGV2aWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHdha2V1cCBiZWZvcmUgZG9pbmcgdGhlIHJlZ2lzdGVyLiBUaGUgc3luY2hyb25pemVkIGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgc2VsZWN0b3Igd29uJ3Qgc2VsZWN0KCkgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcyBibG9jay4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBzZWUgZGV2aWNlQ2xpZW50TW9uaXRvckxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rvci53YWtldXAoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnJlZ2lzdGVyKG1TZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBjbG9zZSB0aGUgc29ja2V0IGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgdGhhdCBvbmUuIEl0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjbG9zZWQuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExvZy5kKCJEZXZpY2VNb25pdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIEZhaWx1cmUgd2hlbiBzdGFydGluZyB0byBtb25pdG9yIGRldmljZSAnIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXZpY2UgKyAiJyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RGV2aWNlTW9uaXRvclRocmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1TZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKLSAgICAgICAgbmV3IFRocmVhZCgiRGV2aWNlIENsaWVudCBNb25pdG9yIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VDbGllbnRNb25pdG9yTG9vcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRldmljZUNsaWVudE1vbml0b3JMb29wKCkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc3luY2hyb25pemVkIGJsb2NrIHN0b3BzIHVzIGZyb20gZG9pbmcgdGhlIHNlbGVjdCgpIGlmIGEgbmV3Ci0gICAgICAgICAgICAgICAgLy8gRGV2aWNlIGlzIGJlaW5nIGFkZGVkLgotICAgICAgICAgICAgICAgIC8vIEBzZWUgc3RhcnRNb25pdG9yaW5nRGV2aWNlKCkKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1EZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbVNlbGVjdG9yLnNlbGVjdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1RdWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DbGllbnRzVG9SZW9wZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DbGllbnRzVG9SZW9wZW4uc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENsaWVudD4gY2xpZW50cyA9IG1DbGllbnRzVG9SZW9wZW4ua2V5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yVGhyZWFkIG1vbml0b3JUaHJlYWQgPSBNb25pdG9yVGhyZWFkLmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2xpZW50IGNsaWVudCA6IGNsaWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgZGV2aWNlID0gY2xpZW50LmdldERldmljZUltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkID0gY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRQaWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JUaHJlYWQuZHJvcENsaWVudChjbGllbnQsIGZhbHNlIC8qIG5vdGlmeSAqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGtpbmRhIGJhZCwgYnV0IGlmIHdlIGRvbid0IHdhaXQgYSBiaXQsIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIGFuc3dlciB0aGUgc2Vjb25kIGhhbmRzaGFrZSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QUJpdCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBtQ2xpZW50c1RvUmVvcGVuLmdldChjbGllbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gSURlYnVnUG9ydFByb3ZpZGVyLk5PX1NUQVRJQ19QT1JUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBnZXROZXh0RGVidWdnZXJQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKCJEZXZpY2VNb25pdG9yIiwgIlJlb3BlbmluZyAiICsgY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuQ2xpZW50KGRldmljZSwgcGlkLCBwb3J0LCBtb25pdG9yVGhyZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UudXBkYXRlKERldmljZS5DSEFOR0VfQ0xJRU5UX0xJU1QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50c1RvUmVvcGVuLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTZXQ8U2VsZWN0aW9uS2V5PiBrZXlzID0gbVNlbGVjdG9yLnNlbGVjdGVkS2V5cygpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gaXRlciA9IGtleXMuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pc1ZhbGlkKCkgJiYga2V5LmlzUmVhZGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIERldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBkZXZpY2UgPSAoRGV2aWNlKWF0dGFjaG1lbnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNvY2tldCA9IGRldmljZS5nZXRDbGllbnRNb25pdG9yaW5nU29ja2V0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkTGVuZ3RoKHNvY2tldCwgbUxlbmd0aEJ1ZmZlcjIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW5jb21pbmdKZHdwRGF0YShkZXZpY2UsIHNvY2tldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRGV2aWNlTW9uaXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIGpkd3AgbGlzdDogIiArIGlvZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQgdGhlIG1vbml0b3Jpbmcgb2YgdGhhdCBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURldmljZXMuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRGV2aWNlTW9uaXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc3RhcnRpbmcgbW9uaXRvcmluZyBzZXJ2aWNlIGZvciAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRNb25pdG9yaW5nRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChtUXVpdCA9PSBmYWxzZSkgewotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gd2hpbGUgKG1RdWl0ID09IGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VuZERldmljZU1vbml0b3JpbmdSZXF1ZXN0KFNvY2tldENoYW5uZWwgc29ja2V0LCBEZXZpY2UgZGV2aWNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBBZGJIZWxwZXIuc2V0RGV2aWNlKHNvY2tldCwgZGV2aWNlKTsKLQotICAgICAgICBieXRlW10gcmVxdWVzdCA9IEFkYkhlbHBlci5mb3JtQWRiUmVxdWVzdCgidHJhY2stamR3cCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgaWYgKEFkYkhlbHBlci53cml0ZShzb2NrZXQsIHJlcXVlc3QpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRGV2aWNlTW9uaXRvciIsICJTZW5kaW5nIGpkd3AgdHJhY2tpbmcgcmVxdWVzdCBmYWlsZWQhIik7Ci0gICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWRiUmVzcG9uc2UgcmVzcCA9IEFkYkhlbHBlci5yZWFkQWRiUmVzcG9uc2Uoc29ja2V0LCBmYWxzZSAvKiByZWFkRGlhZ1N0cmluZyAqLyk7Ci0KLSAgICAgICAgaWYgKHJlc3AuaW9TdWNjZXNzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRGV2aWNlTW9uaXRvciIsICJGYWlsZWQgdG8gcmVhZCB0aGUgYWRiIHJlc3BvbnNlISIpOwotICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwLm9rYXkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIHJlcXVlc3Qgd2FzIHJlZnVzZWQgYnkgYWRiIQotICAgICAgICAgICAgTG9nLmUoIkRldmljZU1vbml0b3IiLCAiYWRiIHJlZnVzZWQgcmVxdWVzdDogIiArIHJlc3AubWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcC5va2F5OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5jb21pbmdKZHdwRGF0YShEZXZpY2UgZGV2aWNlLCBTb2NrZXRDaGFubmVsIG1vbml0b3JTb2NrZXQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgIC8vIGFycmF5IGZvciB0aGUgY3VycmVudCBwaWRzLgotICAgICAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHBpZExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIGRhdGEgaWYgdGhlcmUgYXJlIGFueQotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVhZChtb25pdG9yU29ja2V0LCBidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gc3BsaXQgZWFjaCBsaW5lIGluIGl0cyBvd24gbGlzdCBhbmQgY3JlYXRlIGFuIGFycmF5IG9mIGludGVnZXIgcGlkCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGlkcyA9IHJlc3VsdC5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGlkIDogcGlkcykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGlkTGlzdC5hZGQoSW50ZWdlci52YWx1ZU9mKHBpZCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoaXMgcGlkIGlzIG5vdCByZWFsbHkgYSBudW1iZXIuIExldHMgaWdub3JlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1vbml0b3JUaHJlYWQgbW9uaXRvclRocmVhZCA9IE1vbml0b3JUaHJlYWQuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIG1lcmdlIHRoZSBjdXJyZW50IGxpc3Qgd2l0aCB0aGUgb2xkIG9uZS4KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBtZXJnaW5nIG9mIHRoZSBkZXZpY2UgbGlzdC4KLQotICAgICAgICAgICAgLy8gRm9yIGVhY2ggY2xpZW50IGluIHRoZSBjdXJyZW50IGxpc3QsIHdlIGxvb2sgZm9yIGEgbWF0Y2hpbmcgdGhlIHBpZCBpbiB0aGUgbmV3IGxpc3QuCi0gICAgICAgICAgICAvLyAqIGlmIHdlIGZpbmQgaXQsIHdlIGRvIG5vdGhpbmcsIGV4Y2VwdCByZW1vdmluZyB0aGUgcGlkIGZyb20gaXRzIGxpc3QsCi0gICAgICAgICAgICAvLyAgIHRvIG1hcmsgaXQgYXMgInByb2Nlc3NlZCIKLSAgICAgICAgICAgIC8vICogaWYgd2UgZG8gbm90IGZpbmQgYW55IG1hdGNoLCB3ZSByZW1vdmUgdGhlIGNsaWVudCBmcm9tIHRoZSBjdXJyZW50IGxpc3QuCi0gICAgICAgICAgICAvLyBPbmNlIHRoaXMgaXMgZG9uZSwgdGhlIG5ldyBsaXN0IGNvbnRhaW5zIHBpZHMgZm9yIHdoaWNoIHdlIGRvbid0IGhhdmUgY2xpZW50cyB5ZXQsCi0gICAgICAgICAgICAvLyBzbyB3ZSBjcmVhdGUgY2xpZW50cyBmb3IgdGhlbSwgYWRkIHRoZW0gdG8gdGhlIGxpc3QsIGFuZCBzdGFydCBtb25pdG9yaW5nIHRoZW0uCi0KLSAgICAgICAgICAgIExpc3Q8Q2xpZW50PiBjbGllbnRzID0gZGV2aWNlLmdldENsaWVudExpc3QoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGJlY2F1c2UgTW9uaXRvclRocmVhZCNkcm9wQ2xpZW50IGFjcXVpcmVzIGZpcnN0IHRoZSBtb25pdG9yVGhyZWFkIGxvY2sgYW5kIHRoZW4gdGhlCi0gICAgICAgICAgICAvLyBEZXZpY2UgY2xpZW50IGxpc3QgbG9jayAod2hlbiByZW1vdmluZyB0aGUgQ2xpZW50IGZyb20gdGhlIGxpc3QpLCB3ZSBoYXZlIHRvIG1ha2UKLSAgICAgICAgICAgIC8vIHN1cmUgd2UgYWNxdWlyZSB0aGUgbG9ja3MgaW4gdGhlIHNhbWUgb3JkZXIsIHNpbmNlIGFub3RoZXIgdGhyZWFkIChNb25pdG9yVGhyZWFkKSwKLSAgICAgICAgICAgIC8vIGNvdWxkIGNhbGwgZHJvcENsaWVudCBpdHNlbGYuCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3JUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNsaWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDAgOyBjIDwgY2xpZW50cy5zaXplKCkgOykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50IGNsaWVudCA9IGNsaWVudHMuZ2V0KGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZCA9IGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0UGlkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgbWF0Y2hpbmcgcGlkCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIG1hdGNoID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZWdlciBtYXRjaGluZ1BpZCA6IHBpZExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGlkID09IG1hdGNoaW5nUGlkLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGluZ1BpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZExpc3QucmVtb3ZlKG1hdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7IC8vIG1vdmUgb24gdG8gdGhlIG5leHQgY2xpZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGRyb3AgdGhlIGNsaWVudC4gdGhlIGNsaWVudCB3aWxsIHJlbW92ZSBpdHNlbGYgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGl0cyBkZXZpY2Ugd2hpY2ggaXMgJ2NsaWVudHMnLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhc2sgdGhlIG1vbml0b3IgdGhyZWFkIHRvIG5vdCBzZW5kIG5vdGlmaWNhdGlvbiwgYXMgd2UnbGwgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBvbmNlIGF0IHRoZSBlbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvclRocmVhZC5kcm9wQ2xpZW50KGNsaWVudCwgZmFsc2UgLyogbm90aWZ5ICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3aGF0ZXZlciBwaWQgaXMgbGVmdCBpbiB0aGUgbGlzdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgaW50byBDbGllbnRzLgotICAgICAgICAgICAgZm9yIChpbnQgbmV3UGlkIDogcGlkTGlzdCkgewotICAgICAgICAgICAgICAgIG9wZW5DbGllbnQoZGV2aWNlLCBuZXdQaWQsIGdldE5leHREZWJ1Z2dlclBvcnQoKSwgbW9uaXRvclRocmVhZCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZlci5kZXZpY2VDaGFuZ2VkKGRldmljZSwgRGV2aWNlLkNIQU5HRV9DTElFTlRfTElTVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbmQgY3JlYXRlcyBhIG5ldyBjbGllbnQuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvcGVuQ2xpZW50KERldmljZSBkZXZpY2UsIGludCBwaWQsIGludCBwb3J0LCBNb25pdG9yVGhyZWFkIG1vbml0b3JUaHJlYWQpIHsKLQotICAgICAgICBTb2NrZXRDaGFubmVsIGNsaWVudFNvY2tldDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IEFkYkhlbHBlci5jcmVhdGVQYXNzVGhyb3VnaENvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5zU29ja2V0QWRkciwgZGV2aWNlLCBwaWQpOwotCi0gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgU2VsZWN0b3IKLSAgICAgICAgICAgIGNsaWVudFNvY2tldC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgewotICAgICAgICAgICAgTG9nLmQoIkRldmljZU1vbml0b3IiLCAiVW5rbm93biBKZHdwIHBpZDogIiArIHBpZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgTG9nLncoIkRldmljZU1vbml0b3IiLAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gY2xpZW50ICciICsgcGlkICsgIic6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVDbGllbnQoZGV2aWNlLCBwaWQsIGNsaWVudFNvY2tldCwgcG9ydCwgbW9uaXRvclRocmVhZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNsaWVudCBhbmQgcmVnaXN0ZXIgaXQgdG8gdGhlIG1vbml0b3IgdGhyZWFkCi0gICAgICogQHBhcmFtIGRldmljZQotICAgICAqIEBwYXJhbSBwaWQKLSAgICAgKiBAcGFyYW0gc29ja2V0Ci0gICAgICogQHBhcmFtIGRlYnVnZ2VyUG9ydCB0aGUgZGVidWdnZXIgcG9ydC4KLSAgICAgKiBAcGFyYW0gbW9uaXRvclRocmVhZCB0aGUge0BsaW5rIE1vbml0b3JUaHJlYWR9IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2xpZW50KERldmljZSBkZXZpY2UsIGludCBwaWQsIFNvY2tldENoYW5uZWwgc29ja2V0LCBpbnQgZGVidWdnZXJQb3J0LAotICAgICAgICAgICAgTW9uaXRvclRocmVhZCBtb25pdG9yVGhyZWFkKSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBzb21ldGhpbmcuIENyZWF0ZSBhIENsaWVudCBvYmplY3QsIGFkZAotICAgICAgICAgKiBpdCB0byB0aGUgbGlzdCwgYW5kIGluaXRpYXRlIHRoZSBKRFdQIGhhbmRzaGFrZS4KLSAgICAgICAgICovCi0KLSAgICAgICAgQ2xpZW50IGNsaWVudCA9IG5ldyBDbGllbnQoZGV2aWNlLCBzb2NrZXQsIHBpZCk7Ci0KLSAgICAgICAgaWYgKGNsaWVudC5zZW5kSGFuZHNoYWtlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRDbGllbnRTdXBwb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50Lmxpc3RlbkZvckRlYnVnZ2VyKGRlYnVnZ2VyUG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5zZXREZWJ1Z2dlckNvbm5lY3Rpb25TdGF0dXMoRGVidWdnZXJTdGF0dXMuRVJST1IpOwotICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIkNhbid0IGJpbmQgdG8gbG9jYWwgIiArIGRlYnVnZ2VyUG9ydCArICIgZm9yIGRlYnVnZ2VyIik7Ci0gICAgICAgICAgICAgICAgLy8gb2ggd2VsbAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbGllbnQucmVxdWVzdEFsbG9jYXRpb25TdGF0dXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIkhhbmRzaGFrZSB3aXRoICIgKyBjbGllbnQgKyAiIGZhaWxlZCEiKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgaGFuZHNoYWtlIHNlbmQgZmFpbGVkLiBXZSBjb3VsZCByZW1vdmUgaXQgbm93LCBidXQgaWYgdGhlCi0gICAgICAgICAgICAgKiBmYWlsdXJlIGlzICJwZXJtYW5lbnQiIHdlJ2xsIGp1c3Qga2VlcCBiYW5naW5nIG9uIGl0IGFuZAotICAgICAgICAgICAgICogZ2V0dGluZyB0aGUgc2FtZSByZXN1bHQuIEtlZXAgaXQgaW4gdGhlIGxpc3Qgd2l0aCBpdHMgImVycm9yIgotICAgICAgICAgICAgICogc3RhdGUgc28gd2UgZG9uJ3QgdHJ5IHRvIHJlb3BlbiBpdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsaWVudC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIGRldmljZS5hZGRDbGllbnQoY2xpZW50KTsKLSAgICAgICAgICAgIG1vbml0b3JUaHJlYWQuYWRkQ2xpZW50KGNsaWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TmV4dERlYnVnZ2VyUG9ydCgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBwb3J0IGFuZCByZW1vdmUgaXQKLSAgICAgICAgc3luY2hyb25pemVkIChtRGVidWdnZXJQb3J0cykgewotICAgICAgICAgICAgaWYgKG1EZWJ1Z2dlclBvcnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IG1EZWJ1Z2dlclBvcnRzLmdldCgwKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdC4KLSAgICAgICAgICAgICAgICBtRGVidWdnZXJQb3J0cy5yZW1vdmUoMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCwgYWRkIHRoZSBuZXh0IHBvcnQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBpZiAobURlYnVnZ2VyUG9ydHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbURlYnVnZ2VyUG9ydHMuYWRkKHBvcnQrMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRQb3J0VG9BdmFpbGFibGVMaXN0KGludCBwb3J0KSB7Ci0gICAgICAgIGlmIChwb3J0ID4gMCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGVidWdnZXJQb3J0cykgewotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgY2FzZSB3aGVyZSBjbGllbnRzIGFyZSBjbG9zZWQgdHdpY2UsIHdlIGhhdmUgdG8gbWFrZQotICAgICAgICAgICAgICAgIC8vIHN1cmUgdGhlIHBvcnQgbnVtYmVyIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIGlmIChtRGVidWdnZXJQb3J0cy5pbmRleE9mKHBvcnQpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcG9ydCB0byB0aGUgbGlzdCB3aGlsZSBrZWVwaW5nIGl0IHNvcnRlZC4gSXQncyBub3QgbGlrZSB0aGVyZSdzCi0gICAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIGJlIHRvbnMgb2Ygb2JqZWN0cyBzbyB3ZSBkbyBpdCBsaW5lYXJseS4KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbURlYnVnZ2VyUG9ydHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQgPCBtRGVidWdnZXJQb3J0cy5nZXQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdnZXJQb3J0cy5hZGQoaSwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgY2FuIGNvbXBhY3QgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSBhIHNvY2tldC4KLSAgICAgKiBAcGFyYW0gc29ja2V0IFRoZSB7QGxpbmsgU29ja2V0Q2hhbm5lbH0gdG8gcmVhZCBmcm9tLgotICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCwgb3IgMCAoemVybykgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgc29ja2V0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvbm5lY3Rpb24gZmFpbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJlYWRMZW5ndGgoU29ja2V0Q2hhbm5lbCBzb2NrZXQsIGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSByZWFkKHNvY2tldCwgYnVmZmVyKTsKLQotICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobXNnLCAxNik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UnbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGJlbG93LgotICAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgICAvLyB3ZSByZWNlaXZlIHNvbWV0aGluZyB3ZSBjYW4ndCByZWFkLiBJdCdzIGJldHRlciB0byByZXNldCB0aGUgY29ubmVjdGlvbiBhdCB0aGlzIHBvaW50LgotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIGxlbmd0aCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxzIGEgYnVmZmVyIGZyb20gYSBzb2NrZXQuCi0gICAgICogQHBhcmFtIHNvY2tldAotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgYXMgYSBzdHJpbmcsIG9yIG51bGwgaWYgaXQgZmFpbGVkIHRvIGNvbnZlcnQgdGhlIGJ1ZmZlci4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZChTb2NrZXRDaGFubmVsIHNvY2tldCwgYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLQotICAgICAgICB3aGlsZSAoYnVmLnBvc2l0aW9uKCkgIT0gYnVmLmxpbWl0KCkpIHsKLSAgICAgICAgICAgIGludCBjb3VudDsKLQotICAgICAgICAgICAgY291bnQgPSBzb2NrZXQucmVhZChidWYpOwotICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRU9GIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWYucG9zaXRpb24oKSwgQWRiSGVscGVyLkRFRkFVTFRfRU5DT0RJTkcpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBudWxsIGJlbG93LgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRW11bGF0b3JDb25zb2xlLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRW11bGF0b3JDb25zb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzAxOWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0VtdWxhdG9yQ29uc29sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBlbXVsYXRlZCBoYXJkd2FyZSBvZiB0aGUgQW5kcm9pZCBlbXVsYXRvci4KLSAqIDxwLz5UaGlzIGlzIGJhc2ljYWxseSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBjb21tYW5kIGxpbmUgY29uc29sZSBub3JtYWxseSB1c2VkIHdpdGggdGVsbmV0LgotICo8cC8+Ci0gKiBSZWdhcmRpbmcgbGluZSB0ZXJtaW5hdGlvbiBoYW5kbGluZzo8YnI+Ci0gKiBPbmUgb2YgdGhlIGlzc3VlcyBpcyB0aGF0IHRoZSB0ZWxuZXQgcHJvdG9jb2wgPGI+cmVxdWlyZXM8L2I+IHVzYWdlIG9mIDxjb2RlPlxyXG48L2NvZGU+LiBNb3N0Ci0gKiBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgZW5mb3JjZSBpdCAodGhlIGRvcyBvbmUgZG9lcykuIEluIHRoaXMgcGFydGljdWxhciBjYXNlLCB0aGlzIGlzIG1vc3RseQotICogaXJyZWxldmFudCBzaW5jZSB3ZSBkb24ndCB1c2UgdGVsbmV0IGluIEphdmEsIGJ1dCB0aGF0IG1lYW5zIHdlIHdhbnQgdG8gbWFrZQotICogc3VyZSB3ZSB1c2UgdGhlIHNhbWUgbGluZSB0ZXJtaW5hdGlvbiB0aGFuIHdoYXQgdGhlIGNvbnNvbGUgZXhwZWN0cy4gVGhlIGNvbnNvbGUKLSAqIGNvZGUgcmVtb3ZlcyA8Y29kZT5ccjwvY29kZT4gYW5kIHdhaXRzIGZvciA8Y29kZT5cbjwvY29kZT4uCi0gKiA8cC8+SG93ZXZlciB0aGlzIG1lYW5zIHlvdSA8aT5tYXk8L2k+IHJlY2VpdmUgPGNvZGU+XHJcbjwvY29kZT4gd2hlbiByZWFkaW5nIGZyb20gdGhlIGNvbnNvbGUuCi0gKiA8cC8+Ci0gKiA8Yj5UaGlzIEFQSSB3aWxsIGNoYW5nZSBpbiB0aGUgbmVhciBmdXR1cmUuPC9iPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW11bGF0b3JDb25zb2xlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgV0FJVF9USU1FID0gNTsgLy8gc3Bpbi13YWl0IHNsZWVwLCBpbiBtcwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNURF9USU1FT1VUID0gNTAwMDsgLy8gc3RhbmRhcmQgZGVsYXksIGluIG1zCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSE9TVCA9ICIxMjcuMC4wLjEiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1BTkRfUElORyA9ICJoZWxwXHJcbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09NTUFORF9BVkRfTkFNRSA9ICJhdmQgbmFtZVxyXG4iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1BTkRfS0lMTCA9ICJraWxsXHJcbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09NTUFORF9HU01fU1RBVFVTID0gImdzbSBzdGF0dXNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0dTTV9DQUxMID0gImdzbSBjYWxsICUxJHNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0dTTV9DQU5DRUxfQ0FMTCA9ICJnc20gY2FuY2VsICUxJHNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0dTTV9EQVRBID0gImdzbSBkYXRhICUxJHNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0dTTV9WT0lDRSA9ICJnc20gdm9pY2UgJTEkc1xyXG4iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1BTkRfU01TX1NFTkQgPSAic21zIHNlbmQgJTEkcyAlMiRzXHJcbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09NTUFORF9ORVRXT1JLX1NUQVRVUyA9ICJuZXR3b3JrIHN0YXR1c1xyXG4iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1BTkRfTkVUV09SS19TUEVFRCA9ICJuZXR3b3JrIHNwZWVkICUxJHNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX05FVFdPUktfTEFURU5DWSA9ICJuZXR3b3JrIGRlbGF5ICUxJHNcclxuIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX0dQUyA9Ci0gICAgICAgICJnZW8gbm1lYSAkR1BHR0EsJTEkMDJkJTIkMDJkJTMkMDJkLiU0JDAzZCwiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAiJTUkMDNkJTYkMDkuNmYsJTckYywlOCQwM2QlOSQwOS42ZiwlMTAkYywiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAiMSwxMCwwLjAsMC4wLDAsMC4wLDAsMC4wLDAwMDBcclxuIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBSRV9LTyA9IFBhdHRlcm4uY29tcGlsZSgiS086XFxzKyguKikiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQXJyYXkgb2YgZGVsYXkgdmFsdWVzOiBubyBkZWxheSwgZ3BycywgZWRnZS9lZ3BycywgdW10cy8zZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50W10gTUlOX0xBVEVOQ0lFUyA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIDAsICAgICAgLy8gTm8gZGVsYXkKLSAgICAgICAgMTUwLCAgICAvLyBncHJzCi0gICAgICAgIDgwLCAgICAgLy8gZWRnZS9lZ3BycwotICAgICAgICAzNSAgICAgIC8vIHVtdHMvM2cKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQXJyYXkgb2YgZG93bmxvYWQgc3BlZWRzOiBmdWxsIHNwZWVkLCBnc20sIGhzY3NkLCBncHJzLCBlZGdlL2VncHJzLCB1bXRzLzNnLCBoc2RwYS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50W10gRE9XTkxPQURfU1BFRURTID0gbmV3IGludFtdIHsKLSAgICAgICAgMCwgICAgICAgICAgLy8gZnVsbCBzcGVlZAotICAgICAgICAxNDQwMCwgICAgICAvLyBnc20KLSAgICAgICAgNDMyMDAsICAgICAgLy8gaHNjc2QKLSAgICAgICAgODAwMDAsICAgICAgLy8gZ3BycwotICAgICAgICAyMzY4MDAsICAgICAvLyBlZGdlL2VncHJzCi0gICAgICAgIDE5MjAwMDAsICAgIC8vIHVtdHMvM2cKLSAgICAgICAgMTQ0MDAwMDAgICAgLy8gaHNkcGEKLSAgICB9OwotCi0gICAgLyoqIEFycmF5cyBvZiB2YWxpZCBuZXR3b3JrIHNwZWVkcyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gTkVUV09SS19TUEVFRFMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiZnVsbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImdzbSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImhzY3NkIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAiZ3BycyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImVkZ2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICJ1bXRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAiaHNkcGEiLCAvLyROT04tTkxTLTEkCi0gICAgfTsKLQotICAgIC8qKiBBcnJheXMgb2YgdmFsaWQgbmV0d29yayBsYXRlbmNpZXMgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIE5FVFdPUktfTEFURU5DSUVTID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgIm5vbmUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICJncHJzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAiZWRnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgInVtdHMiLCAvLyROT04tTkxTLTEkCi0gICAgfTsKLQotICAgIC8qKiBHc20gTW9kZSBlbnVtLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBHc21Nb2RlIHsKLSAgICAgICAgVU5LTk9XTigoU3RyaW5nKW51bGwpLAotICAgICAgICBVTlJFR0lTVEVSRUQobmV3IFN0cmluZ1tdIHsgInVucmVnaXN0ZXJlZCIsICJvZmYiIH0pLAotICAgICAgICBIT01FKG5ldyBTdHJpbmdbXSB7ICJob21lIiwgIm9uIiB9KSwKLSAgICAgICAgUk9BTUlORygicm9hbWluZyIpLAotICAgICAgICBTRUFSQ0hJTkcoInNlYXJjaGluZyIpLAotICAgICAgICBERU5JRUQoImRlbmllZCIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdGFnczsKLQotICAgICAgICBHc21Nb2RlKFN0cmluZyB0YWcpIHsKLSAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMudGFncyA9IG5ldyBTdHJpbmdbXSB7IHRhZyB9OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhZ3MgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgR3NtTW9kZShTdHJpbmdbXSB0YWdzKSB7Ci0gICAgICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBHc21Nb2RlIGdldEVudW0oU3RyaW5nIHRhZykgewotICAgICAgICAgICAgZm9yIChHc21Nb2RlIG1vZGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHQgOiBtb2RlLnRhZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZXF1YWxzKHRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFVOS05PV047Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgZmlyc3QgdGFnIG9mIHRoZSBlbnVtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRhZ3NbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFU1VMVF9PSyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNFbXVsYXRvclJlZ2V4cCA9IFBhdHRlcm4uY29tcGlsZShEZXZpY2UuUkVfRU1VTEFUT1JfU04pOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1ZvaWNlU3RhdHVzUmVnZXhwID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgImdzbVxccyt2b2ljZVxccytzdGF0ZTpcXHMqKFthLXpdKykiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzRGF0YVN0YXR1c1JlZ2V4cCA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJnc21cXHMrZGF0YVxccytzdGF0ZTpcXHMqKFthLXpdKykiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzRG93bmxvYWRTcGVlZFJlZ2V4cCA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJcXHMrZG93bmxvYWRcXHMrc3BlZWQ6XFxzKyhcXGQrKVxccytiaXRzLioiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzTWluTGF0ZW5jeVJlZ2V4cCA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJcXHMrbWluaW11bVxccytsYXRlbmN5OlxccysoXFxkKylcXHMrbXMiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIEVtdWxhdG9yQ29uc29sZT4gc0VtdWxhdG9ycyA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIEVtdWxhdG9yQ29uc29sZT4oKTsKLQotICAgIC8qKiBHc20gU3RhdHVzIGNsYXNzICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHc21TdGF0dXMgewotICAgICAgICAvKiogVm9pY2Ugc3RhdHVzLiAqLwotICAgICAgICBwdWJsaWMgR3NtTW9kZSB2b2ljZSA9IEdzbU1vZGUuVU5LTk9XTjsKLSAgICAgICAgLyoqIERhdGEgc3RhdHVzLiAqLwotICAgICAgICBwdWJsaWMgR3NtTW9kZSBkYXRhID0gR3NtTW9kZS5VTktOT1dOOwotICAgIH0KLQotICAgIC8qKiBOZXR3b3JrIFN0YXR1cyBjbGFzcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmV0d29ya1N0YXR1cyB7Ci0gICAgICAgIC8qKiBuZXR3b3JrIHNwZWVkIHN0YXR1cy4gVGhpcyBpcyBhbiBpbmRleCBpbiB0aGUge0BsaW5rICNET1dOTE9BRF9TUEVFRFN9IGFycmF5LiAqLwotICAgICAgICBwdWJsaWMgaW50IHNwZWVkID0gLTE7Ci0gICAgICAgIC8qKiBuZXR3b3JrIGxhdGVuY3kgc3RhdHVzLiAgVGhpcyBpcyBhbiBpbmRleCBpbiB0aGUge0BsaW5rICNNSU5fTEFURU5DSUVTfSBhcnJheS4gKi8KLSAgICAgICAgcHVibGljIGludCBsYXRlbmN5ID0gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgbVBvcnQ7Ci0KLSAgICBwcml2YXRlIFNvY2tldENoYW5uZWwgbVNvY2tldENoYW5uZWw7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBtQnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBFbXVsYXRvckNvbnNvbGV9IG9iamVjdCBmb3IgdGhlIGdpdmVuIHtAbGluayBEZXZpY2V9LiBUaGlzIGNhbgotICAgICAqIGJlIGFuIGFscmVhZHkgZXhpc3RpbmcgY29uc29sZSwgb3IgYSBuZXcgb25lIGlmIGl0IGhhZG4ndCBiZWVuIGNyZWF0ZWQgeWV0LgotICAgICAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdGhhdCB0aGUgY29uc29sZSBsaW5rcyB0by4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkVtdWxhdG9yQ29uc29sZTwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb25uZWN0aW9uIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBFbXVsYXRvckNvbnNvbGUgZ2V0Q29uc29sZShJRGV2aWNlIGQpIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIGFuIGVtdWxhdG9yCi0gICAgICAgIE1hdGNoZXIgbSA9IHNFbXVsYXRvclJlZ2V4cC5tYXRjaGVyKGQuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgcG9ydCBudW1iZXIuIFRoaXMgaXMgdGhlIGNvbnNvbGUgcG9ydC4KLSAgICAgICAgICAgIGludCBwb3J0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBwb3J0IG51bWJlci4gVGhpcyBpcyBhIGJpdCBzdHJhbmdlIHNpbmNlCi0gICAgICAgICAgICAgICAgLy8gaXQncyBjb21pbmcgZnJvbSBhIHJlZ2V4cCB0aGF0IG9ubHkgYWNjZXB0IGRpZ2l0LCBidXQgd2UgaGFuZGxlIHRoZSBjYXNlCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybiBudWxsLgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbXVsYXRvckNvbnNvbGUgY29uc29sZSA9IHNFbXVsYXRvcnMuZ2V0KHBvcnQpOwotCi0gICAgICAgICAgICBpZiAoY29uc29sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnNvbGUgZXhpc3QsIHdlIHBpbmcgdGhlIGVtdWxhdG9yIHRvIGNoZWNrIHRoZSBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLnBpbmcoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBSZW1vdmVDb25zb2xlKGNvbnNvbGUubVBvcnQpOwotICAgICAgICAgICAgICAgICAgICBjb25zb2xlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb25zb2xlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBjb25zb2xlIG9iamVjdCBleGlzdHMgZm9yIHRoaXMgcG9ydCBzbyB3ZSBjcmVhdGUgb25lLCBhbmQgc3RhcnQKLSAgICAgICAgICAgICAgICAvLyB0aGUgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICBjb25zb2xlID0gbmV3IEVtdWxhdG9yQ29uc29sZShwb3J0KTsKLSAgICAgICAgICAgICAgICBpZiAoY29uc29sZS5zdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNFbXVsYXRvcnMucHV0KHBvcnQsIGNvbnNvbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBjb25zb2xlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBwb3J0IGZyb20gdGhlIG1hcC4KLSAgICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvZiB0aGUgY29uc29sZSB0byByZW1vdmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgUmVtb3ZlQ29uc29sZShpbnQgcG9ydCkgewotICAgICAgICBzRW11bGF0b3JzLnJlbW92ZShwb3J0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVtdWxhdG9yQ29uc29sZShpbnQgcG9ydCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtUG9ydCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjb25zb2xlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydCgpIHsKLQotICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzb2NrZXRBZGRyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaG9zdEFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCk7Ci0gICAgICAgICAgICBzb2NrZXRBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RBZGRyLCBtUG9ydCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU29ja2V0Q2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3Blbihzb2NrZXRBZGRyKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgc29tZSBzdHVmZiBmcm9tIGl0Ci0gICAgICAgIHJlYWRMaW5lcygpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBpbmcgdGhlIGVtdWxhdG9yIHRvIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbGl2ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHBpbmcoKSB7Ci0gICAgICAgIC8vIGl0IGxvb2tzIGxpa2Ugd2UgY2FuIHNlbmQgc3R1ZmYsIGV2ZW4gd2hlbiB0aGUgZW11bGF0b3IgcXVpdCwgYnV0IHdlIGNhbid0IHJlYWQKLSAgICAgICAgLy8gZnJvbSB0aGUgc29ja2V0LiBTbyB3ZSBjaGVjayB0aGUgcmV0dXJuIG9mIHJlYWRMaW5lcygpCi0gICAgICAgIGlmIChzZW5kQ29tbWFuZChDT01NQU5EX1BJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZExpbmVzKCkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIEtJTEwgY29tbWFuZCB0byB0aGUgZW11bGF0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGtpbGwoKSB7Ci0gICAgICAgIGlmIChzZW5kQ29tbWFuZChDT01NQU5EX0tJTEwpKSB7Ci0gICAgICAgICAgICBSZW1vdmVDb25zb2xlKG1Qb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEF2ZE5hbWUoKSB7Ci0gICAgICAgIGlmIChzZW5kQ29tbWFuZChDT01NQU5EX0FWRF9OQU1FKSkgewotICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gcmVhZExpbmVzKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA9PSAyKSB7IC8vIHRoaXMgc2hvdWxkIGJlIHRoZSBuYW1lIG9uIGZpcnN0IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvayBvbiAybmQgbGluZQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzZWUgaWYgdGhlcmUncyBhIG1lc3NhZ2UgYWZ0ZXIgS08KLSAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBSRV9LTy5tYXRjaGVyKHJlc3VsdFtyZXN1bHQubGVuZ3RoLTFdKTsKLSAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXR3b3JrIHN0YXR1cyBvZiB0aGUgZW11bGF0b3IuCi0gICAgICogQHJldHVybiBhIHtAbGluayBOZXR3b3JrU3RhdHVzfSBvYmplY3QgY29udGFpbmluZyB0aGUge0BsaW5rIEdzbVN0YXR1c30sIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHF1ZXJ5IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE5ldHdvcmtTdGF0dXMgZ2V0TmV0d29ya1N0YXR1cygpIHsKLSAgICAgICAgaWYgKHNlbmRDb21tYW5kKENPTU1BTkRfTkVUV09SS19TVEFUVVMpKSB7Ci0gICAgICAgICAgICAvKiBSZXN1bHQgaXMgaW4gdGhlIGZvcm1hdAotICAgICAgICAgICAgICAgIEN1cnJlbnQgbmV0d29yayBzdGF0dXM6Ci0gICAgICAgICAgICAgICAgZG93bmxvYWQgc3BlZWQ6ICAgICAgMTQ0MDAgYml0cy9zICgxLjggS0IvcykKLSAgICAgICAgICAgICAgICB1cGxvYWQgc3BlZWQ6ICAgICAgICAxNDQwMCBiaXRzL3MgKDEuOCBLQi9zKQotICAgICAgICAgICAgICAgIG1pbmltdW0gbGF0ZW5jeTogIDAgbXMKLSAgICAgICAgICAgICAgICBtYXhpbXVtIGxhdGVuY3k6ICAwIG1zCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHJlYWRMaW5lcygpOwotCi0gICAgICAgICAgICBpZiAoaXNWYWxpZChyZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugb25seSBjb21wYXJlIGFnYWlucyB0aGUgbWluIGxhdGVuY3kgYW5kIHRoZSBkb3dubG9hZCBzcGVlZAotICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCByZWx5IG9uIHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0LCBhbmQgc2ltcGx5IGxvb3AgdGhyb3VnaAotICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5lIHRlc3RpbmcgdGhlIHJlZ2V4cC4KLSAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdHVzIHN0YXR1cyA9IG5ldyBOZXR3b3JrU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBzRG93bmxvYWRTcGVlZFJlZ2V4cC5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zcGVlZCA9IGdldFNwZWVkSW5kZXgodmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIG9uIHRvIG5leHQgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbSA9IHNNaW5MYXRlbmN5UmVnZXhwLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzdHJpbmcgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaW5kZXggZnJvbSB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmxhdGVuY3kgPSBnZXRMYXRlbmN5SW5kZXgodmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIG9uIHRvIG5leHQgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZ3NtIHN0YXR1cyBvZiB0aGUgZW11bGF0b3IKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEdzbVN0YXR1c30gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGdtcyBzdGF0dXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlIHF1ZXJ5IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEdzbVN0YXR1cyBnZXRHc21TdGF0dXMoKSB7Ci0gICAgICAgIGlmIChzZW5kQ29tbWFuZChDT01NQU5EX0dTTV9TVEFUVVMpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogcmVzdWx0IGlzIGluIHRoZSBmb3JtYXQ6Ci0gICAgICAgICAgICAgKiBnc20gc3RhdHVzCi0gICAgICAgICAgICAgKiBnc20gdm9pY2Ugc3RhdGU6IGhvbWUKLSAgICAgICAgICAgICAqIGdzbSBkYXRhIHN0YXRlOiAgaG9tZQotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHJlYWRMaW5lcygpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWQocmVzdWx0KSkgewotCi0gICAgICAgICAgICAgICAgR3NtU3RhdHVzIHN0YXR1cyA9IG5ldyBHc21TdGF0dXMoKTsKLQotICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCByZWx5IG9uIHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0LCBhbmQgc2ltcGx5IGxvb3AgdGhyb3VnaAotICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5lIHRlc3RpbmcgdGhlIHJlZ2V4cC4KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHNWb2ljZVN0YXR1c1JlZ2V4cC5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52b2ljZSA9IEdzbU1vZGUuZ2V0RW51bSh2YWx1ZS50b0xvd2VyQ2FzZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBvbiB0byBuZXh0IGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG0gPSBzRGF0YVN0YXR1c1JlZ2V4cC5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kYXRhID0gR3NtTW9kZS5nZXRFbnVtKHZhbHVlLnRvTG93ZXJDYXNlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIG9uIHRvIG5leHQgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdTTSB2b2ljZSBtb2RlLgotICAgICAqIEBwYXJhbSBtb2RlIHRoZSB7QGxpbmsgR3NtTW9kZX0gdmFsdWUuCi0gICAgICogQHJldHVybiBSRVNVTFRfT0sgaWYgc3VjY2VzcywgYW4gZXJyb3IgU3RyaW5nIG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gaWYgbW9kZSBpcyBhbiBpbnZhbGlkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNldEdzbVZvaWNlTW9kZShHc21Nb2RlIG1vZGUpIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1vZGUgPT0gR3NtTW9kZS5VTktOT1dOKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KENPTU1BTkRfR1NNX1ZPSUNFLCBtb2RlLmdldFRhZygpKTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NDb21tYW5kKGNvbW1hbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEdTTSBkYXRhIG1vZGUuCi0gICAgICogQHBhcmFtIG1vZGUgdGhlIHtAbGluayBHc21Nb2RlfSB2YWx1ZQotICAgICAqIEByZXR1cm4ge0BsaW5rICNSRVNVTFRfT0t9IGlmIHN1Y2Nlc3MsIGFuIGVycm9yIFN0cmluZyBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGlmIG1vZGUgaXMgYW4gaW52YWxpZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzZXRHc21EYXRhTW9kZShHc21Nb2RlIG1vZGUpIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1vZGUgPT0gR3NtTW9kZS5VTktOT1dOKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KENPTU1BTkRfR1NNX0RBVEEsIG1vZGUuZ2V0VGFnKCkpOwotICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYW4gaW5jb21pbmcgY2FsbCBvbiB0aGUgZW11bGF0b3IuCi0gICAgICogQHBhcmFtIG51bWJlciBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNhbGxpbmcgbnVtYmVyLgotICAgICAqIEByZXR1cm4ge0BsaW5rICNSRVNVTFRfT0t9IGlmIHN1Y2Nlc3MsIGFuIGVycm9yIFN0cmluZyBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgY2FsbChTdHJpbmcgbnVtYmVyKSB7Ci0gICAgICAgIFN0cmluZyBjb21tYW5kID0gU3RyaW5nLmZvcm1hdChDT01NQU5EX0dTTV9DQUxMLCBudW1iZXIpOwotICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhIGN1cnJlbnQgY2FsbC4KLSAgICAgKiBAcGFyYW0gbnVtYmVyIHRoZSBudW1iZXIgb2YgdGhlIGNhbGwgdG8gY2FuY2VsCi0gICAgICogQHJldHVybiB7QGxpbmsgI1JFU1VMVF9PS30gaWYgc3VjY2VzcywgYW4gZXJyb3IgU3RyaW5nIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBjYW5jZWxDYWxsKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KENPTU1BTkRfR1NNX0NBTkNFTF9DQUxMLCBudW1iZXIpOwotICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYW4gU01TIHRvIHRoZSBlbXVsYXRvcgotICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIHNlbmRlciBwaG9uZSBudW1iZXIKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgU01TIG1lc3NhZ2UuIFwgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQuIFRoZSBjYXJyaWFnZSByZXR1cm4gaXMKLSAgICAgKiB0aGUgMiBjaGFyYWN0ZXIgc2VxdWVuY2UgIHsnXCcsICduJyB9Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAbGluayAjUkVTVUxUX09LfSBpZiBzdWNjZXNzLCBhbiBlcnJvciBTdHJpbmcgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNlbmRTbXMoU3RyaW5nIG51bWJlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KENPTU1BTkRfU01TX1NFTkQsIG51bWJlciwgbWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzQ29tbWFuZChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuZXR3b3JrIHNwZWVkLgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb25JbmRleCBUaGUgaW5kZXggaW4gdGhlIHtAbGluayAjTkVUV09SS19TUEVFRFN9IHRhYmxlLgotICAgICAqIEByZXR1cm4ge0BsaW5rICNSRVNVTFRfT0t9IGlmIHN1Y2Nlc3MsIGFuIGVycm9yIFN0cmluZyBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc2V0TmV0d29ya1NwZWVkKGludCBzZWxlY3Rpb25JbmRleCkgewotICAgICAgICBTdHJpbmcgY29tbWFuZCA9IFN0cmluZy5mb3JtYXQoQ09NTUFORF9ORVRXT1JLX1NQRUVELCBORVRXT1JLX1NQRUVEU1tzZWxlY3Rpb25JbmRleF0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmV0d29yayBsYXRlbmN5LgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb25JbmRleCBUaGUgaW5kZXggaW4gdGhlIHtAbGluayAjTkVUV09SS19MQVRFTkNJRVN9IHRhYmxlLgotICAgICAqIEByZXR1cm4ge0BsaW5rICNSRVNVTFRfT0t9IGlmIHN1Y2Nlc3MsIGFuIGVycm9yIFN0cmluZyBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc2V0TmV0d29ya0xhdGVuY3koaW50IHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgICAgIFN0cmluZyBjb21tYW5kID0gU3RyaW5nLmZvcm1hdChDT01NQU5EX05FVFdPUktfTEFURU5DWSwgTkVUV09SS19MQVRFTkNJRVNbc2VsZWN0aW9uSW5kZXhdKTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NDb21tYW5kKGNvbW1hbmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNlbmRMb2NhdGlvbihkb3VibGUgbG9uZ2l0dWRlLCBkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBlbGV2YXRpb24pIHsKLQotICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBkb3VibGUgYWJzTG9uZyA9IE1hdGguYWJzKGxvbmdpdHVkZSk7Ci0gICAgICAgIGludCBsb25nRGVncmVlID0gKGludClNYXRoLmZsb29yKGFic0xvbmcpOwotICAgICAgICBjaGFyIGxvbmdEaXJlY3Rpb24gPSAnRSc7Ci0gICAgICAgIGlmIChsb25naXR1ZGUgPCAwKSB7Ci0gICAgICAgICAgICBsb25nRGlyZWN0aW9uID0gJ1cnOwotICAgICAgICB9Ci0KLSAgICAgICAgZG91YmxlIGxvbmdNaW51dGUgPSAoYWJzTG9uZyAtIE1hdGguZmxvb3IoYWJzTG9uZykpICogNjA7Ci0KLSAgICAgICAgZG91YmxlIGFic0xhdCA9IE1hdGguYWJzKGxhdGl0dWRlKTsKLSAgICAgICAgaW50IGxhdERlZ3JlZSA9IChpbnQpTWF0aC5mbG9vcihhYnNMYXQpOwotICAgICAgICBjaGFyIGxhdERpcmVjdGlvbiA9ICdOJzsKLSAgICAgICAgaWYgKGxhdGl0dWRlIDwgMCkgewotICAgICAgICAgICAgbGF0RGlyZWN0aW9uID0gJ1MnOwotICAgICAgICB9Ci0KLSAgICAgICAgZG91YmxlIGxhdE1pbnV0ZSA9IChhYnNMYXQgLSBNYXRoLmZsb29yKGFic0xhdCkpICogNjA7Ci0KLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KENPTU1BTkRfR1BTLAotICAgICAgICAgICAgICAgIGMuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSwgYy5nZXQoQ2FsZW5kYXIuTUlOVVRFKSwKLSAgICAgICAgICAgICAgICBjLmdldChDYWxlbmRhci5TRUNPTkQpLCBjLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksCi0gICAgICAgICAgICAgICAgbGF0RGVncmVlLCBsYXRNaW51dGUsIGxhdERpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICBsb25nRGVncmVlLCBsb25nTWludXRlLCBsb25nRGlyZWN0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBlbXVsYXRvciBjb25zb2xlLgotICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHN0cmluZy4gPGI+TVVTVCBCRSBURVJNSU5BVEVEIEJZIFxuPC9iPi4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VzcwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIGJDb21tYW5kOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiQ29tbWFuZCA9IGNvbW1hbmQuZ2V0Qnl0ZXMoREVGQVVMVF9FTkNPRElORyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB3cm9uZyBlbmNvZGluZy4uLgotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBjb21tYW5kCi0gICAgICAgICAgICBBZGJIZWxwZXIud3JpdGUobVNvY2tldENoYW5uZWwsIGJDb21tYW5kLCBiQ29tbWFuZC5sZW5ndGgsIERkbVByZWZlcmVuY2VzLmdldFRpbWVPdXQoKSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBjb25uZWN0aW9uIGZhaWxlZCBzb21laG93LCB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgdGhlIGNvbnNvbGUuCi0gICAgICAgICAgICAgICAgUmVtb3ZlQ29uc29sZShtUG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgZW11bGF0b3IgYW5kIHBhcnNlcyBpdHMgYW5zd2VyLgotICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHNlbmQuCi0gICAgICogQHJldHVybiB7QGxpbmsgI1JFU1VMVF9PS30gaWYgc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0NvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLSAgICAgICAgaWYgKHNlbmRDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSByZWFkTGluZXMoKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gUkVfS08ubWF0Y2hlcihyZXN1bHRbcmVzdWx0Lmxlbmd0aC0xXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gUkVTVUxUX09LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gIlVuYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbXVsYXRvciI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIlVuYWJsZSB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGVtdWxhdG9yIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBsaW5lIGZyb20gdGhlIGNvbnNvbGUgc29ja2V0LiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcgdW50aWwgd2UgcmVhZCB0aGUgbGluZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5PS1xyXG48L2xpPgotICAgICAqIDxsaT5LTzxtc2c+XHJcbjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlYWQgZnJvbSB0aGUgZW11bGF0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSByZWFkTGluZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChtQnVmZmVyLCAwLCBtQnVmZmVyLmxlbmd0aCk7Ci0gICAgICAgICAgICBpbnQgbnVtV2FpdHMgPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHdoaWxlIChidWYucG9zaXRpb24oKSAhPSBidWYubGltaXQoKSAmJiBzdG9wID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50OwotCi0gICAgICAgICAgICAgICAgY291bnQgPSBtU29ja2V0Q2hhbm5lbC5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bVdhaXRzICogV0FJVF9USU1FID4gU1REX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1ibG9ja2luZyBzcGluCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBudW1XYWl0cysrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVdhaXRzID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgbGFzdCBmZXcgY2hhciBhcmVuJ3QgT0suIEZvciBhIHZhbGlkIG1lc3NhZ2UgdG8gdGVzdAotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyAoT0svS08gKyBcclxuKQotICAgICAgICAgICAgICAgIGlmIChidWYucG9zaXRpb24oKSA+PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBidWYucG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHNXaXRoT0socG9zKSB8fCBsYXN0TGluZUlzS08ocG9zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBuZXcgU3RyaW5nKG1CdWZmZXIsIDAsIGJ1Zi5wb3NpdGlvbigpLCBERUZBVUxUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIHJldHVybiBtc2cuc3BsaXQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgNCBjaGFyYWN0ZXJzICpiZWZvcmUqIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSAiT0tcclxuIgotICAgICAqIEBwYXJhbSBjdXJyZW50UG9zaXRpb24gVGhlIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5kc1dpdGhPSyhpbnQgY3VycmVudFBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyW2N1cnJlbnRQb3NpdGlvbi0xXSA9PSAnXG4nICYmCi0gICAgICAgICAgICAgICAgbUJ1ZmZlcltjdXJyZW50UG9zaXRpb24tMl0gPT0gJ1xyJyAmJgotICAgICAgICAgICAgICAgIG1CdWZmZXJbY3VycmVudFBvc2l0aW9uLTNdID09ICdLJyAmJgotICAgICAgICAgICAgICAgIG1CdWZmZXJbY3VycmVudFBvc2l0aW9uLTRdID09ICdPJykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsYXN0IGxpbmUgc3RhcnRzIHdpdGggS08gYW5kIGlzIGFsc28gdGVybWluYXRlZCBieSBcclxuCi0gICAgICogQHBhcmFtIGN1cnJlbnRQb3NpdGlvbiB0aGUgY3VycmVudCBwb3NpdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsYXN0TGluZUlzS08oaW50IGN1cnJlbnRQb3NpdGlvbikgewotICAgICAgICAvLyBmaXJzdCBjaGVjayB0aGF0IHRoZSBsYXN0IDIgY2hhcmFjdGVycyBhcmUgQ1JMRgotICAgICAgICBpZiAobUJ1ZmZlcltjdXJyZW50UG9zaXRpb24tMV0gIT0gJ1xuJyB8fAotICAgICAgICAgICAgICAgIG1CdWZmZXJbY3VycmVudFBvc2l0aW9uLTJdICE9ICdccicpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBsb29wIGJhY2t3YXJkIGxvb2tpbmcgZm9yIHRoZSBwcmV2aW91cyBDUkxGLCBvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKGkgPSBjdXJyZW50UG9zaXRpb24tMyA7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlcltpXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgXG4hCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIG1CdWZmZXJbaS0xXSA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIFxyIQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoZXJlIGl0IGlzIGVpdGhlciAtMSBpZiB3ZSByZWFjaGVkIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHdpdGhvdXQgZmluZGluZwotICAgICAgICAvLyBhIENSTEYsIG9yIHRoZSBwb3NpdGlvbiBvZiBcbi4gU28gaW4gYm90aCBjYXNlIHdlIGxvb2sgYXQgdGhlIGNoYXJhY3RlcnMgYXQgaSsxIGFuZCBpKzIKLSAgICAgICAgaWYgKG1CdWZmZXJbaSsxXSA9PSAnSycgJiYgbUJ1ZmZlcltpKzJdID09ICdPJykgewotICAgICAgICAgICAgLy8gZm91bmQgZXJyb3IhCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgbGluZSBvZiB0aGUgcmVzdWx0IGRvZXMgbm90IHN0YXJ0IHdpdGggS08KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChTdHJpbmdbXSByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIShSRV9LTy5tYXRjaGVyKHJlc3VsdFtyZXN1bHQubGVuZ3RoLTFdKS5tYXRjaGVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRMYXRlbmN5SW5kZXgoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGludCB2YWx1ZQotICAgICAgICAgICAgaW50IGxhdGVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBzcGVlZCBmcm9tIHRoZSBpbmRleAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgTUlOX0xBVEVOQ0lFUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChNSU5fTEFURU5DSUVTW2ldID09IGxhdGVuY3kpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZywgd2UnbGwganVzdCByZXR1cm4gLTEuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3BlZWRJbmRleChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW50IHZhbHVlCi0gICAgICAgICAgICBpbnQgc3BlZWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBzcGVlZCBmcm9tIHRoZSBpbmRleAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgRE9XTkxPQURfU1BFRURTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERPV05MT0FEX1NQRUVEU1tpXSA9PSBzcGVlZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLCB3ZSdsbCBqdXN0IHJldHVybiAtMS4KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRmlsZUxpc3RpbmdTZXJ2aWNlLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvRmlsZUxpc3RpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGNmNzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0ZpbGVMaXN0aW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUHJvdmlkZXMge0BsaW5rIERldmljZX0gc2lkZSBmaWxlIGxpc3Rpbmcgc2VydmljZS4KLSAqIDxwLz5UbyBnZXQgYW4gaW5zdGFuY2UgZm9yIGEga25vd24ge0BsaW5rIERldmljZX0sIGNhbGwge0BsaW5rIERldmljZSNnZXRGaWxlTGlzdGluZ1NlcnZpY2UoKX0uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlTGlzdGluZ1NlcnZpY2UgewotCi0gICAgLyoqIFBhdHRlcm4gdG8gZmluZCBmaWxlbmFtZXMgdGhhdCBtYXRjaCAiKi5hcGsiICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzQXBrUGF0dGVybiA9Ci0gICAgICAgIFBhdHRlcm4uY29tcGlsZSgiLipcXC5hcGsiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUE1fRlVMTF9MSVNUSU5HID0gInBtIGxpc3QgcGFja2FnZXMgLWYiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUGF0dGVybiB0byBwYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSAncG0gLWxmJyBjb21tYW5kLjxicj4KLSAgICAgKiBUaGUgb3V0cHV0IGZvcm1hdCBsb29rcyBsaWtlOjxicj4KLSAgICAgKiAvZGF0YS9hcHAvbXlhcHAuYXBrPWNvbS5teXBhY2thZ2UubXlhcHAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQbVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5wYWNrYWdlOiguKz8pPSguKykkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBUb3AgbGV2ZWwgZGF0YSBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX0RBVEEgPSAiZGF0YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogVG9wIGxldmVsIHNkY2FyZCBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX1NEQ0FSRCA9ICJzZGNhcmQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIFRvcCBsZXZlbCBzeXN0ZW0gZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJUkVDVE9SWV9TWVNURU0gPSAic3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBUb3AgbGV2ZWwgdGVtcCBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX1RFTVAgPSAidG1wIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBBcHBsaWNhdGlvbiBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX0FQUCA9ICJhcHAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBzUm9vdExldmVsQXBwcm92ZWRJdGVtcyA9IHsKLSAgICAgICAgRElSRUNUT1JZX0RBVEEsCi0gICAgICAgIERJUkVDVE9SWV9TRENBUkQsCi0gICAgICAgIERJUkVDVE9SWV9TWVNURU0sCi0gICAgICAgIERJUkVDVE9SWV9URU1QCi0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBSRUZSRVNIX1JBVEUgPSA1MDAwTDsKLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIHRlc3QgaGFzIHRvIGJlIHNsaWdodGx5IGxvd2VyIGZvciBwcmVjaXNpb24gaXNzdWUuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgUkVGUkVTSF9URVNUID0gKGxvbmcpKFJFRlJFU0hfUkFURSAqIC44KTsKLQotICAgIC8qKiBFbnRyeSB0eXBlOiBGaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GSUxFID0gMDsKLSAgICAvKiogRW50cnkgdHlwZTogRGlyZWN0b3J5ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESVJFQ1RPUlkgPSAxOwotICAgIC8qKiBFbnRyeSB0eXBlOiBEaXJlY3RvcnkgTGluayAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElSRUNUT1JZX0xJTksgPSAyOwotICAgIC8qKiBFbnRyeSB0eXBlOiBCbG9jayAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQkxPQ0sgPSAzOwotICAgIC8qKiBFbnRyeSB0eXBlOiBDaGFyYWN0ZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NIQVJBQ1RFUiA9IDQ7Ci0gICAgLyoqIEVudHJ5IHR5cGU6IExpbmsgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xJTksgPSA1OwotICAgIC8qKiBFbnRyeSB0eXBlOiBTb2NrZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NPQ0tFVCA9IDY7Ci0gICAgLyoqIEVudHJ5IHR5cGU6IEZJRk8gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJRk8gPSA3OwotICAgIC8qKiBFbnRyeSB0eXBlOiBPdGhlciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1RIRVIgPSA4OwotCi0gICAgLyoqIERldmljZSBzaWRlIGZpbGUgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9ST09UID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQotICAgIC8qKgotICAgICAqIFJlZ2V4cCBwYXR0ZXJuIHRvIHBhcnNlIHRoZSByZXN1bHQgZnJvbSBscy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNMc1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICJeKFtiY2Rsc3AtXVstcl1bLXddWy14c1NdWy1yXVstd11bLXhzU11bLXJdWy13XVsteHN0U1RdKVxccysoXFxTKylcXHMrKFxcUyspXFxzKyhbXFxkXFxzLF0qKVxccysoXFxkezR9LVxcZFxcZC1cXGRcXGQpXFxzKyhcXGRcXGQ6XFxkXFxkKVxccysoLiopJCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIERldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgRmlsZUVudHJ5IG1Sb290OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8VGhyZWFkPiBtVGhyZWFkTGlzdCA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOwotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhbiBlbnRyeSBpbiBhIGRpcmVjdG9yeS4gVGhpcyBjYW4gYmUgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgRmlsZUVudHJ5IHsKLSAgICAgICAgLyoqIFBhdHRlcm4gdG8gZXNjYXBlIGZpbGVuYW1lcyBmb3Igc2hlbGwgY29tbWFuZCBjb25zdW1wdGlvbi4gKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzRXNjYXBlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAiKFtcXFxcKCkqKz9cIicjL1xcc10pIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29tcGFyYXRvciBvYmplY3QgZm9yIEZpbGVFbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxGaWxlRW50cnk+IHNFbnRyeUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxGaWxlRW50cnk+KCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKEZpbGVFbnRyeSBvMSwgRmlsZUVudHJ5IG8yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8xIGluc3RhbmNlb2YgRmlsZUVudHJ5ICYmIG8yIGluc3RhbmNlb2YgRmlsZUVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBmZTEgPSAoRmlsZUVudHJ5KW8xOwotICAgICAgICAgICAgICAgICAgICBGaWxlRW50cnkgZmUyID0gKEZpbGVFbnRyeSlvMjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZlMS5uYW1lLmNvbXBhcmVUbyhmZTIubmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEZpbGVFbnRyeSBwYXJlbnQ7Ci0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBTdHJpbmcgaW5mbzsKLSAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zOwotICAgICAgICBTdHJpbmcgc2l6ZTsKLSAgICAgICAgU3RyaW5nIGRhdGU7Ci0gICAgICAgIFN0cmluZyB0aW1lOwotICAgICAgICBTdHJpbmcgb3duZXI7Ci0gICAgICAgIFN0cmluZyBncm91cDsKLSAgICAgICAgaW50IHR5cGU7Ci0gICAgICAgIGJvb2xlYW4gaXNBcHBQYWNrYWdlOwotCi0gICAgICAgIGJvb2xlYW4gaXNSb290OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50cnkgY29udGVudCBoYXMgYmVlbiBmZXRjaGVkIHlldCwgb3Igbm90LgotICAgICAgICAgKi8KLSAgICAgICAgbG9uZyBmZXRjaFRpbWUgPSAwOwotCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxGaWxlRW50cnk+IG1DaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8RmlsZUVudHJ5PigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgZW50cnkuCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGVudHJ5IG9yIG51bGwgaWYgZW50cnkgaXMgcm9vdAotICAgICAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnRyeS4KLSAgICAgICAgICogQHBhcmFtIHR5cGUgZW50cnkgdHlwZS4gQ2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiB7QGxpbmsgRmlsZUxpc3RpbmdTZXJ2aWNlI1RZUEVfRklMRX0sCi0gICAgICAgICAqIHtAbGluayBGaWxlTGlzdGluZ1NlcnZpY2UjVFlQRV9ESVJFQ1RPUll9LCB7QGxpbmsgRmlsZUxpc3RpbmdTZXJ2aWNlI1RZUEVfT1RIRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBGaWxlRW50cnkoRmlsZUVudHJ5IHBhcmVudCwgU3RyaW5nIG5hbWUsIGludCB0eXBlLCBib29sZWFuIGlzUm9vdCkgewotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuaXNSb290ID0gaXNSb290OwotCi0gICAgICAgICAgICBjaGVja0FwcFBhY2thZ2VTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBzdHJpbmcgb2YgdGhlIGVudHJ5LCBhcyByZXR1cm5lZCBieSA8Y29kZT5sczwvY29kZT4uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgZGF0ZSBzdHJpbmcgb2YgdGhlIGVudHJ5LCBhcyByZXR1cm5lZCBieSA8Y29kZT5sczwvY29kZT4uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHN0cmluZyBvZiB0aGUgZW50cnksIGFzIHJldHVybmVkIGJ5IDxjb2RlPmxzPC9jb2RlPi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb24gc3RyaW5nIG9mIHRoZSBlbnRyeSwgYXMgcmV0dXJuZWQgYnkgPGNvZGU+bHM8L2NvZGU+LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQZXJtaXNzaW9ucygpIHsKLSAgICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBleHRyYSBpbmZvIGZvciB0aGUgZW50cnkuCi0gICAgICAgICAqIDxwLz5Gb3IgYSBsaW5rLCBpdCB3aWxsIGJlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsuCi0gICAgICAgICAqIDxwLz5Gb3IgYW4gYXBwbGljYXRpb24gYXBrIGZpbGUgaXQgd2lsbCBiZSB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBhcyByZXR1cm5lZAotICAgICAgICAgKiBieSB0aGUgUGFja2FnZSBNYW5hZ2VyLiAgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnkuCi0gICAgICAgICAqIEByZXR1cm4gYSBwYXRoIHN0cmluZyB1c2luZyB7QGxpbmsgRmlsZUxpc3RpbmdTZXJ2aWNlI0ZJTEVfU0VQQVJBVE9SfSBhcyBzZXBhcmF0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxQYXRoKCkgewotICAgICAgICAgICAgaWYgKGlzUm9vdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGSUxFX1JPT1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGhCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbGxQYXRoQnVpbGRlcihwYXRoQnVpbGRlciwgZmFsc2UpOwotCi0gICAgICAgICAgICByZXR1cm4gcGF0aEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGZ1bGx5IGVzY2FwZWQgcGF0aCBvZiB0aGUgZW50cnkuIFRoaXMgcGF0aCBpcyBzYWZlIHRvIHVzZSBpbiBhCi0gICAgICAgICAqIHNoZWxsIGNvbW1hbmQgbGluZS4KLSAgICAgICAgICogQHJldHVybiBhIHBhdGggc3RyaW5nIHVzaW5nIHtAbGluayBGaWxlTGlzdGluZ1NlcnZpY2UjRklMRV9TRVBBUkFUT1J9IGFzIHNlcGFyYXRvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGdWxsRXNjYXBlZFBhdGgoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGhCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbGxQYXRoQnVpbGRlcihwYXRoQnVpbGRlciwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBwYXRoQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHBhdGggYXMgYSBsaXN0IG9mIHNlZ21lbnRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFBhdGhTZWdtZW50cygpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZpbGxQYXRoU2VnbWVudHMobGlzdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZTsKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgaWYgdGhlIGVudHJ5IGlzIGEgZm9sZGVyIG9yIGEgbGluayB0byBhIGZvbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gVFlQRV9ESVJFQ1RPUlkgfHwgdHlwZSA9PSBUWVBFX0RJUkVDVE9SWV9MSU5LOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlRW50cnkgZ2V0UGFyZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgY2hpbGRyZW4gb2YgdGhlIGVudHJ5LiBUaGlzIHJldHVybnMgdGhlIGNhY2hlIGNyZWF0ZWQgZnJvbSBjYWxsaW5nCi0gICAgICAgICAqIDxjb2RlPkZpbGVMaXN0aW5nU2VydmljZS5nZXRDaGlsZHJlbigpPC9jb2RlPi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlRW50cnlbXSBnZXRDYWNoZWRDaGlsZHJlbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2hpbGRyZW4udG9BcnJheShuZXcgRmlsZUVudHJ5W21DaGlsZHJlbi5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZCB7QGxpbmsgRmlsZUVudHJ5fSBtYXRjaGluZyB0aGUgbmFtZS4KLSAgICAgICAgICogVGhpcyB1c2VzIHRoZSBjYWNoZWQgY2hpbGRyZW4gbGlzdC4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIHRvIHJldHVybi4KLSAgICAgICAgICogQHJldHVybiB0aGUgRmlsZUVudHJ5IG1hdGNoaW5nIHRoZSBuYW1lIG9yIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmlsZUVudHJ5IGZpbmRDaGlsZChTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgZm9yIChGaWxlRW50cnkgZW50cnkgOiBtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkubmFtZS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZW50cnkgaXMgdGhlIHJvb3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNSb290OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRDaGlsZChGaWxlRW50cnkgY2hpbGQpIHsKLSAgICAgICAgICAgIG1DaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGlsZHJlbihBcnJheUxpc3Q8RmlsZUVudHJ5PiBuZXdDaGlsZHJlbikgewotICAgICAgICAgICAgbUNoaWxkcmVuLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ2hpbGRyZW4uYWRkQWxsKG5ld0NoaWxkcmVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZEZldGNoKCkgewotICAgICAgICAgICAgaWYgKGZldGNoVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGN1cnJlbnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LWZldGNoVGltZSA+IFJFRlJFU0hfVEVTVCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBpZiB0aGUgZW50cnkgaXMgYSB2YWxpZCBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNBcHBQYWNrYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgaWYgdGhlIGZpbGUgbmFtZSBpcyBhbiBhcHBsaWNhdGlvbiBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcEZpbGVOYW1lKCkgewotICAgICAgICAgICAgTWF0Y2hlciBtID0gc0Fwa1BhdHRlcm4ubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBtLm1hdGNoZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWN1cnNpdmVseSBmaWxscyB0aGUgcGF0aEJ1aWxkZXIgd2l0aCB0aGUgZnVsbCBwYXRoCi0gICAgICAgICAqIEBwYXJhbSBwYXRoQnVpbGRlciBhIFN0cmluZ0J1aWxkZXIgdXNlZCB0byBjcmVhdGUgdGhlIHBhdGguCi0gICAgICAgICAqIEBwYXJhbSBlc2NhcGVQYXRoIFdoZXRoZXIgdGhlIHBhdGggbmVlZCB0byBiZSBlc2NhcGVkIGZvciBjb25zdW1wdGlvbiBieQotICAgICAgICAgKiBhIHNoZWxsIGNvbW1hbmQgbGluZS4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxQYXRoQnVpbGRlcihTdHJpbmdCdWlsZGVyIHBhdGhCdWlsZGVyLCBib29sZWFuIGVzY2FwZVBhdGgpIHsKLSAgICAgICAgICAgIGlmIChpc1Jvb3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudC5maWxsUGF0aEJ1aWxkZXIocGF0aEJ1aWxkZXIsIGVzY2FwZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0aEJ1aWxkZXIuYXBwZW5kKEZJTEVfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHBhdGhCdWlsZGVyLmFwcGVuZChlc2NhcGVQYXRoID8gZXNjYXBlKG5hbWUpIDogbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVjdXJzaXZlbHkgZmlsbHMgdGhlIHNlZ21lbnQgbGlzdCB3aXRoIHRoZSBmdWxsIHBhdGguCi0gICAgICAgICAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0IG9mIHNlZ21lbnRzIHRvIGZpbGwuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsUGF0aFNlZ21lbnRzKEFycmF5TGlzdDxTdHJpbmc+IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChpc1Jvb3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudC5maWxsUGF0aFNlZ21lbnRzKGxpc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsaXN0LmFkZChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBpbnRlcm5hbCBhcHAgcGFja2FnZSBzdGF0dXMgZmxhZy4gVGhpcyBjaGVja3Mgd2hldGhlciB0aGUgZW50cnkgaXMgaW4gYW4gYXBwCi0gICAgICAgICAqIGRpcmVjdG9yeSBsaWtlIC9kYXRhL2FwcCBvciAvc3lzdGVtL2FwcAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQXBwUGFja2FnZVN0YXR1cygpIHsKLSAgICAgICAgICAgIGlzQXBwUGFja2FnZSA9IGZhbHNlOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IGdldFBhdGhTZWdtZW50cygpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9GSUxFICYmIHNlZ21lbnRzLmxlbmd0aCA9PSAzICYmIGlzQXBwRmlsZU5hbWUoKSkgewotICAgICAgICAgICAgICAgIGlzQXBwUGFja2FnZSA9IERJUkVDVE9SWV9BUFAuZXF1YWxzKHNlZ21lbnRzWzFdKSAmJgotICAgICAgICAgICAgICAgICAgICAoRElSRUNUT1JZX1NZU1RFTS5lcXVhbHMoc2VnbWVudHNbMF0pIHx8IERJUkVDVE9SWV9EQVRBLmVxdWFscyhzZWdtZW50c1swXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYW4gZXNjYXBlZCB2ZXJzaW9uIG9mIHRoZSBlbnRyeSBuYW1lLgotICAgICAgICAgKiBAcGFyYW0gZW50cnlOYW1lCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0cmluZyBlc2NhcGUoU3RyaW5nIGVudHJ5TmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIHNFc2NhcGVQYXR0ZXJuLm1hdGNoZXIoZW50cnlOYW1lKS5yZXBsYWNlQWxsKCJcXFxcJDEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMc1JlY2VpdmVyIGV4dGVuZHMgTXVsdGlMaW5lUmVjZWl2ZXIgewotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PEZpbGVFbnRyeT4gbUVudHJ5TGlzdDsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtTGlua0xpc3Q7Ci0gICAgICAgIHByaXZhdGUgRmlsZUVudHJ5W10gbUN1cnJlbnRDaGlsZHJlbjsKLSAgICAgICAgcHJpdmF0ZSBGaWxlRW50cnkgbVBhcmVudEVudHJ5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYW4gbHMgcmVjZWl2ZXIvcGFyc2VyLgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudENoaWxkcmVuIFRoZSBsaXN0IG9mIGN1cnJlbnQgY2hpbGRyZW4uIFRvIHByZXZlbnQKLSAgICAgICAgICogICAgICBjb2xsYXBzZSBkdXJpbmcgdXBkYXRlLCByZXVzaW5nIHRoZSBzYW1lIEZpbGVFbnRyeSBvYmplY3RzIGZvcgotICAgICAgICAgKiAgICAgIGZpbGVzIHRoYXQgd2VyZSBhbHJlYWR5IHRoZXJlIGlzIHBhcmFtb3VudC4KLSAgICAgICAgICogQHBhcmFtIGVudHJ5TGlzdCB0aGUgbGlzdCBvZiBuZXcgY2hpbGRyZW4gdG8gYmUgZmlsbGVkIGJ5IHRoZQotICAgICAgICAgKiAgICAgIHJlY2VpdmVyLgotICAgICAgICAgKiBAcGFyYW0gbGlua0xpc3QgdGhlIGxpc3Qgb2YgbGluayBwYXRoIHRvIGNvbXB1dGUgcG9zdCBscywgdG8gZmlndXJlCi0gICAgICAgICAqICAgICAgb3V0IGlmIHRoZSBsaW5rIHBvaW50ZWQgdG8gYSBmaWxlIG9yIHRvIGEgZGlyZWN0b3J5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExzUmVjZWl2ZXIoRmlsZUVudHJ5IHBhcmVudEVudHJ5LCBBcnJheUxpc3Q8RmlsZUVudHJ5PiBlbnRyeUxpc3QsCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlua0xpc3QpIHsKLSAgICAgICAgICAgIG1QYXJlbnRFbnRyeSA9IHBhcmVudEVudHJ5OwotICAgICAgICAgICAgbUN1cnJlbnRDaGlsZHJlbiA9IHBhcmVudEVudHJ5LmdldENhY2hlZENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBtRW50cnlMaXN0ID0gZW50cnlMaXN0OwotICAgICAgICAgICAgbUxpbmtMaXN0ID0gbGlua0xpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc05ld0xpbmVzKFN0cmluZ1tdIGxpbmVzKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGhhbmRsZSBlbXB0eSBsaW5lcy4KLSAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgbGluZSB0aHJvdWdoIHRoZSByZWdleHAKLSAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBzTHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbS5ncm91cCg3KTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgcm9vdCwgd2Ugb25seSBhY2NlcHQgc2VsZWN0ZWQgaXRlbXMKLSAgICAgICAgICAgICAgICBpZiAobVBhcmVudEVudHJ5LmlzUm9vdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYXBwcm92ZWQgOiBzUm9vdExldmVsQXBwcm92ZWRJdGVtcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcHJvdmVkLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGluIHRoZSBhcHByb3ZlZCBsaXN0IHdlIHNraXAgdGhpcyBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3duZXIgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBncm91cCA9IG0uZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNpemUgPSBtLmdyb3VwKDQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRlID0gbS5ncm91cCg1KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGltZSA9IG0uZ3JvdXAoNik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluZm8gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgaW50IG9iamVjdFR5cGUgPSBUWVBFX09USEVSOwotICAgICAgICAgICAgICAgIHN3aXRjaCAocGVybWlzc2lvbnMuY2hhckF0KDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBUWVBFX0ZJTEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnYicgOgotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IFRZUEVfQkxPQ0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnYycgOgotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IFRZUEVfQ0hBUkFDVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBUWVBFX0RJUkVDVE9SWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdsJyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gVFlQRV9MSU5LOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBUWVBFX1NPQ0tFVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdwJyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gVFlQRV9GSUZPOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgd2hhdCB3ZSBtYXkgYmUgbGlua2luZyB0bwotICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IFRZUEVfTElOSykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IG5hbWUuc3BsaXQoIlxccy0+XFxzIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgaGF2ZSAyIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBlbnRyeSBuYW1lIHRvIG5vdCBjb250YWluIHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VnbWVudHNbMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbGluayBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc2VnbWVudHNbMV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBnZXQgdGhlIHBhdGggdG8gdGhlIGxpbmsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhTZWdtZW50cyA9IGluZm8uc3BsaXQoRklMRV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5rIGlzIHRvIHNvbWV0aGluZyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIHRoZSBsaW5rIGlzIC4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCIuLiIuZXF1YWxzKHBhdGhTZWdtZW50c1swXSkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHR5cGUgYW5kIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBUWVBFX0RJUkVDVE9SWV9MSU5LOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciB3ZSBmb3VuZCB0aGUgb2JqZWN0IGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2UnbGwgZmluZCBpdCBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYW4gYXJyb3cgaW4gZnJvbnQgdG8gc3BlY2lmeSBpdCdzIGEgbGluay4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICItPiAiICsgaW5mbzsgLy8kTk9OLU5MUy0xJDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVudHJ5LCBlaXRoZXIgZnJvbSBhbiBleGlzdGluZyBvbmUsIG9yIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBlbnRyeSA9IGdldEV4aXN0aW5nRW50cnkobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgRmlsZUVudHJ5KG1QYXJlbnRFbnRyeSwgbmFtZSwgb2JqZWN0VHlwZSwgZmFsc2UgLyogaXNSb290ICovKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgc29tZSBtaXNjIGluZm8KLSAgICAgICAgICAgICAgICBlbnRyeS5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zOwotICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgPSBzaXplOwotICAgICAgICAgICAgICAgIGVudHJ5LmRhdGUgPSBkYXRlOwotICAgICAgICAgICAgICAgIGVudHJ5LnRpbWUgPSB0aW1lOwotICAgICAgICAgICAgICAgIGVudHJ5Lm93bmVyID0gb3duZXI7Ci0gICAgICAgICAgICAgICAgZW50cnkuZ3JvdXAgPSBncm91cDsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBUWVBFX0xJTkspIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuaW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUVudHJ5TGlzdC5hZGQoZW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFF1ZXJpZXMgZm9yIGFuIGFscmVhZHkgZXhpc3RpbmcgRW50cnkgcGVyIG5hbWUKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudHJ5Ci0gICAgICAgICAqIEByZXR1cm4gdGhlIGV4aXN0aW5nIEZpbGVFbnRyeSBvciBudWxsIGlmIG5vIGVudHJ5IHdpdGggYSBtYXRjaGluZwotICAgICAgICAgKiBuYW1lIGV4aXN0cy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRmlsZUVudHJ5IGdldEV4aXN0aW5nRW50cnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1DdXJyZW50Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlRW50cnkgZSA9IG1DdXJyZW50Q2hpbGRyZW5baV07Ci0KLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBnb2luZyB0byAiZXJhc2UiIHRoZSBvbmUgd2UgdXNlLCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgaXRlbSBpcyBub3QgbnVsbC4KLSAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcGVyIG5hbWUsIGNhc2Utc2Vuc2l0aXZlLgotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoZS5uYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJhc2UgZnJvbSB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDaGlsZHJlbltpXSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgYW55IG1hdGNoaW5nIG9iamVjdCwgcmV0dXJuIG51bGwKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hMaW5rcygpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gSGFuZGxlIGxpbmtzIGluIHRoZSBsaXN0aW5nIHNlcnZpY2UKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgYSBtZXRob2QgdGhhdCBkZWFscyB3aXRoIGFzeW5jaHJvbm91cwotICAgICAqIHJlc3VsdCBmcm9tIDxjb2RlPmxzPC9jb2RlPiBjb21tYW5kIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAc2VlIEZpbGVMaXN0aW5nU2VydmljZSNnZXRDaGlsZHJlbihjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLkZpbGVFbnRyeSwgYm9vbGVhbiwgY29tLmFuZHJvaWQuZGRtbGliLkZpbGVMaXN0aW5nU2VydmljZS5JTGlzdGluZ1JlY2VpdmVyKQotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUxpc3RpbmdSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKEZpbGVFbnRyeSBlbnRyeSwgRmlsZUVudHJ5W10gY2hpbGRyZW4pOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hFbnRyeShGaWxlRW50cnkgZW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGaWxlIExpc3RpbmcgU2VydmljZSBmb3IgYSBzcGVjaWZpZWQge0BsaW5rIERldmljZX0uCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgRGV2aWNlIHRoZSBzZXJ2aWNlIGlzIGNvbm5lY3RlZCB0by4KLSAgICAgKi8KLSAgICBGaWxlTGlzdGluZ1NlcnZpY2UoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmlsZUVudHJ5fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByb290IGVsZW1lbnQgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGV2aWNlIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIEZpbGVFbnRyeSBnZXRSb290KCkgewotICAgICAgICBpZiAobURldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb290ID0gbmV3IEZpbGVFbnRyeShudWxsIC8qIHBhcmVudCAqLywgIiIgLyogbmFtZSAqLywgVFlQRV9ESVJFQ1RPUlksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzUm9vdCAqLyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtUm9vdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIGEge0BsaW5rIEZpbGVFbnRyeX0uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGEgY2FjaGUgbWVjaGFuaXNtIGFuZCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIG1vZGVzLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiA8dmFyPnJlY2VpdmVyPC92YXI+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgZGV2aWNlIHNpZGUgPGNvZGU+bHM8L2NvZGU+Ci0gICAgICogY29tbWFuZCBpcyBkb25lIHN5bmNocm9ub3VzbHksIGFuZCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIHVwb24gY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC48YnI+Ci0gICAgICogSWYgPHZhcj5yZWNlaXZlcjwvdmFyPiBpcyBub24gPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBjb21tYW5kIGlzIGxhdW5jaGVkIGlzIGEgc2VwYXJhdGUKLSAgICAgKiB0aHJlYWQgYW5kIHVwb24gY29tcGxldGlvbiwgdGhlIHJlY2VpdmVyIHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHJlc3VsdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHJlc3VsdCBmb3IgZWFjaCA8Y29kZT5sczwvY29kZT4gY29tbWFuZCBpcyBjYWNoZWQgaW4gdGhlIHBhcmVudAotICAgICAqIDxjb2RlPkZpbGVFbnRyeTwvY29kZT4uIDx2YXI+dXNlQ2FjaGU8L3Zhcj4gYWxsb3dzIHVzYWdlIG9mIHRoaXMgY2FjaGUsIGJ1dCBvbmx5IGlmIHRoZQotICAgICAqIGNhY2hlIGlzIHZhbGlkLiBUaGUgY2FjaGUgaXMgdmFsaWQgb25seSBmb3Ige0BsaW5rIEZpbGVMaXN0aW5nU2VydmljZSNSRUZSRVNIX1JBVEV9IG1zLgotICAgICAqIEFmdGVyIHRoYXQgYSBuZXcgPGNvZGU+bHM8L2NvZGU+IGNvbW1hbmQgaXMgYWx3YXlzIGV4ZWN1dGVkLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgY2FjaGUgaXMgdmFsaWQgYW5kIDxjb2RlPnVzZUNhY2hlID09IHRydWU8L2NvZGU+LCB0aGUgbWV0aG9kIHdpbGwgYWx3YXlzIHNpbXBseQotICAgICAqIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNhY2hlLCB3aGV0aGVyIGEge0BsaW5rIElMaXN0aW5nUmVjZWl2ZXJ9IGhhcyBiZWVuIHByb3ZpZGVkIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgcGFyZW50IGVudHJ5LgotICAgICAqIEBwYXJhbSB1c2VDYWNoZSBBIGZsYWcgdG8gdXNlIHRoZSBjYWNoZSBvciB0byBmb3JjZSBhIG5ldyBscyBjb21tYW5kLgotICAgICAqIEBwYXJhbSByZWNlaXZlciBBIHJlY2VpdmVyIGZvciBhc3luY2hyb25vdXMgY2FsbHMuCi0gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjaGlsZHJlbiBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYXN5bmNocm9ub3VzIGNhbGxzLgotICAgICAqCi0gICAgICogQHNlZSBGaWxlRW50cnkjZ2V0Q2FjaGVkQ2hpbGRyZW4oKQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlRW50cnlbXSBnZXRDaGlsZHJlbihmaW5hbCBGaWxlRW50cnkgZW50cnksIGJvb2xlYW4gdXNlQ2FjaGUsCi0gICAgICAgICAgICBmaW5hbCBJTGlzdGluZ1JlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIC8vIGZpcnN0IHRoaW5nIHdlIGRvIGlzIGNoZWNrIHRoZSBjYWNoZSwgYW5kIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHJlY2VudAotICAgICAgICAvLyBlbm91Z2ggY2hpbGRyZW4gbGlzdCwgd2UganVzdCByZXR1cm4gdGhhdC4KLSAgICAgICAgaWYgKHVzZUNhY2hlICYmIGVudHJ5Lm5lZWRGZXRjaCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q2FjaGVkQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gcmVjZWl2ZXIsIHRoZW4gdGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwsIGFuZCB3ZQotICAgICAgICAvLyByZXR1cm4gdGhlIHJlc3VsdCBvZiBscwotICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZG9McyhlbnRyeSk7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q2FjaGVkQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgaXMgYSBhc3luY2hyb25vdXMgY2FsbC4KLSAgICAgICAgLy8gd2UgbGF1bmNoIGEgdGhyZWFkIHRoYXQgd2lsbCBkbyBscyBhbmQgZ2l2ZSB0aGUgbGlzdGluZwotICAgICAgICAvLyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJscyAiICsgZW50cnkuZ2V0RnVsbFBhdGgoKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkb0xzKGVudHJ5KTsKLQotICAgICAgICAgICAgICAgIHJlY2VpdmVyLnNldENoaWxkcmVuKGVudHJ5LCBlbnRyeS5nZXRDYWNoZWRDaGlsZHJlbigpKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVFbnRyeVtdIGNoaWxkcmVuID0gZW50cnkuZ2V0Q2FjaGVkQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBjaGlsZHJlblswXS5pc0FwcGxpY2F0aW9uUGFja2FnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBGaWxlRW50cnk+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmlsZUVudHJ5PigpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoRmlsZUVudHJ5IGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gY2hpbGQuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQocGF0aCwgY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBwbS4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBQTV9GVUxMX0xJU1RJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCwgbmV3IE11bHRpTGluZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZmlsZXBhdGggYW5kIHBhY2thZ2UgZnJvbSB0aGUgbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHNQbVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjaGlsZHJlbiB3aXRoIHRoYXQgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW50cnkgZW50cnkgPSBtYXAuZ2V0KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW5mbyA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5yZWZyZXNoRW50cnkoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYiBmYWlsZWQgc29tZWhvdywgd2UgZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLy8gaWYgYW5vdGhlciB0aHJlYWQgaXMgcGVuZGluZywgbGF1bmNoIGl0Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbVRocmVhZExpc3QucmVtb3ZlKHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gbGF1bmNoIHRoZSBuZXh0IG9uZSBpZiBhcHBsaWNhYmxlLgotICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHQgPSBtVGhyZWFkTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBydW4gbXVsdGlwbGUgbHMgb24gdGhlIGRldmljZSBhdCB0aGUgc2FtZSB0aW1lLCBzbyB3ZQotICAgICAgICAvLyBzdG9yZSB0aGUgdGhyZWFkIGluIGEgbGlzdCBhbmQgbGF1bmNoIGl0IG9ubHkgaWYgdGhlcmUncyBubyBvdGhlciB0aHJlYWQgcnVubmluZy4KLSAgICAgICAgLy8gdGhlIHRocmVhZCB3aWxsIGxhdW5jaCB0aGUgbmV4dCBvbmUgb25jZSBpdCdzIGRvbmUuCi0gICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZExpc3QpIHsKLSAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdAotICAgICAgICAgICAgbVRocmVhZExpc3QuYWRkKHQpOwotCi0gICAgICAgICAgICAvLyBpZiBpdCdzIHRoZSBvbmx5IG9uZSwgbGF1bmNoIGl0LgotICAgICAgICAgICAgaWYgKG1UaHJlYWRMaXN0LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdC5zdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIHdlIHJldHVybiBudWxsLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9McyhGaWxlRW50cnkgZW50cnkpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiB0aGUgZW50cmllcwotICAgICAgICBBcnJheUxpc3Q8RmlsZUVudHJ5PiBlbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGVFbnRyeT4oKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IHRoYXQgd2lsbCByZWNlaXZlIHRoZSBsaW5rIHRvIGNvbXB1dGUgcG9zdCBsczsKLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlua0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb21tYW5kCi0gICAgICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJscyAtbCAiICsgZW50cnkuZ2V0RnVsbFBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlY2VpdmVyIG9iamVjdCB0aGF0IHdpbGwgcGFyc2UgdGhlIHJlc3VsdCBmcm9tIGxzCi0gICAgICAgICAgICBMc1JlY2VpdmVyIHJlY2VpdmVyID0gbmV3IExzUmVjZWl2ZXIoZW50cnksIGVudHJ5TGlzdCwgbGlua0xpc3QpOwotCi0gICAgICAgICAgICAvLyBjYWxsIGxzLgotICAgICAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQsIHJlY2VpdmVyKTsKLQotICAgICAgICAgICAgLy8gZmluaXNoIHRoZSBwcm9jZXNzIG9mIHRoZSByZWNlaXZlciB0byBoYW5kbGUgbGlua3MKLSAgICAgICAgICAgIHJlY2VpdmVyLmZpbmlzaExpbmtzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIHZpZXdlcgotICAgICAgICBlbnRyeS5mZXRjaFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAvLyBzb3J0IHRoZSBjaGlsZHJlbiBhbmQgc2V0IHRoZW0gYXMgdGhlIG5ldyBjaGlsZHJlbgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVudHJ5TGlzdCwgRmlsZUVudHJ5LnNFbnRyeUNvbXBhcmF0b3IpOwotICAgICAgICBlbnRyeS5zZXRDaGlsZHJlbihlbnRyeUxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9HZXRQcm9wUmVjZWl2ZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9HZXRQcm9wUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5MzM3OS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvR2V0UHJvcFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBBIHJlY2VpdmVyIGFibGUgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIG9mIAotICoge0BsaW5rICNHRVRQUk9QX0NPTU1BTkR9IG9uIGEgZGV2aWNlLgotICovCi1maW5hbCBjbGFzcyBHZXRQcm9wUmVjZWl2ZXIgZXh0ZW5kcyBNdWx0aUxpbmVSZWNlaXZlciB7Ci0gICAgZmluYWwgc3RhdGljIFN0cmluZyBHRVRQUk9QX0NPTU1BTkQgPSAiZ2V0cHJvcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIEdFVFBST1BfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXlxcWyhbXl1dKylcXF1cXDpcXHMqXFxbKC4qKVxcXSQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGluZGljYXRlcyBpZiB3ZSBuZWVkIHRvIHJlYWQgdGhlIGZpcnN0ICovCi0gICAgcHJpdmF0ZSBEZXZpY2UgbURldmljZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSByZWNlaXZlciB3aXRoIHRoZSBkZXZpY2UgdGhlIHJlY2VpdmVyIHdpbGwgbW9kaWZ5LgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0byBtb2RpZnkKLSAgICAgKi8KLSAgICBwdWJsaWMgR2V0UHJvcFJlY2VpdmVyKERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3TGluZXMoU3RyaW5nW10gbGluZXMpIHsKLSAgICAgICAgLy8gV2UgcmVjZWl2ZSBhbiBhcnJheSBvZiBsaW5lcy4gV2UncmUgZXhwZWN0aW5nCi0gICAgICAgIC8vIHRvIGhhdmUgdGhlIGJ1aWxkIGluZm8gaW4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgYnVpbGQKLSAgICAgICAgLy8gZGF0ZSBpbiB0aGUgMm5kIGxpbmUuIFRoZXJlIHNlZW1zIHRvIGJlIGFuIGVtcHR5IGxpbmUKLSAgICAgICAgLy8gYWZ0ZXIgYWxsIHRoYXQuCi0KLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwIHx8IGxpbmUuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IEdFVFBST1BfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZS5hZGRQcm9wZXJ0eShsYWJlbCwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICBtRGV2aWNlLnVwZGF0ZShEZXZpY2UuQ0hBTkdFX0JVSUxEX0lORk8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVBcHBOYW1lLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlQXBwTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIxZGZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVBcHBOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogSGFuZGxlIHRoZSAiYXBwIG5hbWUiIGNodW5rIChBUE5NKS4KLSAqLwotZmluYWwgY2xhc3MgSGFuZGxlQXBwTmFtZSBleHRlbmRzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19BUE5NID0gQ2h1bmtIYW5kbGVyLnR5cGUoIkFQTk0iKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhbmRsZUFwcE5hbWUgbUluc3QgPSBuZXcgSGFuZGxlQXBwTmFtZSgpOwotCi0KLSAgICBwcml2YXRlIEhhbmRsZUFwcE5hbWUoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgZm9yIHRoZSBwYWNrZXRzIHdlIGV4cGVjdCB0byBnZXQgZnJvbSB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihNb25pdG9yVGhyZWFkIG10KSB7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX0FQTk0sIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgaXMgcmVhZHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50UmVhZHkoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgd2VudCBhd2F5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsaWVudERpc2Nvbm5lY3RlZChDbGllbnQgY2xpZW50KSB7fQotCi0gICAgLyoqCi0gICAgICogQ2h1bmsgaGFuZGxlciBlbnRyeSBwb2ludC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVDaHVuayhDbGllbnQgY2xpZW50LCBpbnQgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhLAotICAgICAgICAgICAgYm9vbGVhbiBpc1JlcGx5LCBpbnQgbXNnSWQpIHsKLQotICAgICAgICBMb2cuZCgiZGRtLWFwcG5hbWUiLCAiaGFuZGxpbmcgIiArIENodW5rSGFuZGxlci5uYW1lKHR5cGUpKTsKLQotICAgICAgICBpZiAodHlwZSA9PSBDSFVOS19BUE5NKSB7Ci0gICAgICAgICAgICBhc3NlcnQgIWlzUmVwbHk7Ci0gICAgICAgICAgICBoYW5kbGVBUE5NKGNsaWVudCwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVVbmtub3duQ2h1bmsoY2xpZW50LCB0eXBlLCBkYXRhLCBpc1JlcGx5LCBtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBhIHJlcGx5IHRvIG91ciBBUE5NIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVBUE5NKENsaWVudCBjbGllbnQsIEJ5dGVCdWZmZXIgZGF0YSkgewotICAgICAgICBpbnQgYXBwTmFtZUxlbjsKLSAgICAgICAgU3RyaW5nIGFwcE5hbWU7Ci0KLSAgICAgICAgYXBwTmFtZUxlbiA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIGFwcE5hbWUgPSBnZXRTdHJpbmcoZGF0YSwgYXBwTmFtZUxlbik7Ci0KLSAgICAgICAgTG9nLmQoImRkbS1hcHBuYW1lIiwgIkFQTk06IGFwcD0nIiArIGFwcE5hbWUgKyAiJyIpOwotCi0gICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKGNkKSB7Ci0gICAgICAgICAgICBjZC5zZXRDbGllbnREZXNjcmlwdGlvbihhcHBOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudCA9IGNoZWNrRGVidWdnZXJQb3J0Rm9yQXBwTmFtZShjbGllbnQsIGFwcE5hbWUpOwotCi0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX05BTUUpOwotICAgICAgICB9Ci0gICAgfQotIH0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZUV4aXQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVFeGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWVkYmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZUV4aXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBTdWJtaXQgYW4gZXhpdCByZXF1ZXN0LgotICovCi1maW5hbCBjbGFzcyBIYW5kbGVFeGl0IGV4dGVuZHMgQ2h1bmtIYW5kbGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0VYSVQgPSB0eXBlKCJFWElUIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYW5kbGVFeGl0IG1JbnN0ID0gbmV3IEhhbmRsZUV4aXQoKTsKLQotCi0gICAgcHJpdmF0ZSBIYW5kbGVFeGl0KCkge30KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGZvciB0aGUgcGFja2V0cyB3ZSBleHBlY3QgdG8gZ2V0IGZyb20gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoTW9uaXRvclRocmVhZCBtdCkge30KLQotICAgIC8qKgotICAgICAqIENsaWVudCBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRSZWFkeShDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24ge30KLQotICAgIC8qKgotICAgICAqIENsaWVudCB3ZW50IGF3YXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50RGlzY29ubmVjdGVkKENsaWVudCBjbGllbnQpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDaHVuayBoYW5kbGVyIGVudHJ5IHBvaW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNodW5rKENsaWVudCBjbGllbnQsIGludCB0eXBlLCBCeXRlQnVmZmVyIGRhdGEsIGJvb2xlYW4gaXNSZXBseSwgaW50IG1zZ0lkKSB7Ci0gICAgICAgIGhhbmRsZVVua25vd25DaHVuayhjbGllbnQsIHR5cGUsIGRhdGEsIGlzUmVwbHksIG1zZ0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGFuIEVYSVQgcmVxdWVzdCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRVhJVChDbGllbnQgY2xpZW50LCBpbnQgc3RhdHVzKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgcmF3QnVmID0gYWxsb2NCdWZmZXIoNCk7Ci0gICAgICAgIEpkd3BQYWNrZXQgcGFja2V0ID0gbmV3IEpkd3BQYWNrZXQocmF3QnVmKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICBidWYucHV0SW50KHN0YXR1cyk7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19FWElULCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0tZXhpdCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX0VYSVQpICsgIjogIiArIHN0YXR1cyk7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVIZWFwLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlSGVhcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA1MGFmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVIZWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuQWxsb2NhdGlvblRyYWNraW5nU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLklIcHJvZkR1bXBIYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBIYW5kbGUgaGVhcCBzdGF0dXMgdXBkYXRlcy4KLSAqLwotZmluYWwgY2xhc3MgSGFuZGxlSGVhcCBleHRlbmRzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19IUElGID0gdHlwZSgiSFBJRiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0hQU1QgPSB0eXBlKCJIUFNUIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfSFBFTiA9IHR5cGUoIkhQRU4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19IUFNHID0gdHlwZSgiSFBTRyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0hQR0MgPSB0eXBlKCJIUEdDIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfSFBEVSA9IHR5cGUoIkhQRFUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19SRUFFID0gdHlwZSgiUkVBRSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1JFQVEgPSB0eXBlKCJSRUFRIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfUkVBTCA9IHR5cGUoIlJFQUwiKTsKLQotICAgIC8vIGFyZ3MgdG8gc2VuZEhQU0cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSEVOX0RJU0FCTEUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdIRU5fR0MgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdIQVRfTUVSR0UgPSAwOyAvLyBtZXJnZSBhZGphY2VudCBvYmplY3RzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9PQkogPSAxOyAgIC8vIGtlZXAgb2JqZWN0cyBkaXN0aW5jdAotCi0gICAgLy8gYXJncyB0byBzZW5kSFBJRgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhQSUZfV0hFTl9ORVZFUiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFBJRl9XSEVOX05PVyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFBJRl9XSEVOX05FWFRfR0MgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhQSUZfV0hFTl9FVkVSWV9HQyA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYW5kbGVIZWFwIG1JbnN0ID0gbmV3IEhhbmRsZUhlYXAoKTsKLQotICAgIHByaXZhdGUgSGFuZGxlSGVhcCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBmb3IgdGhlIHBhY2tldHMgd2UgZXhwZWN0IHRvIGdldCBmcm9tIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKE1vbml0b3JUaHJlYWQgbXQpIHsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfSFBJRiwgbUluc3QpOwotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19IUFNULCBtSW5zdCk7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX0hQRU4sIG1JbnN0KTsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfSFBTRywgbUluc3QpOwotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19SRUFRLCBtSW5zdCk7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX1JFQUwsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgaXMgcmVhZHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50UmVhZHkoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNsaWVudC5pc0hlYXBVcGRhdGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vc2VuZEhQU0coY2xpZW50LCBXSEVOX0dDLCBXSEFUX01FUkdFKTsKLSAgICAgICAgICAgIHNlbmRIUElGKGNsaWVudCwgSFBJRl9XSEVOX0VWRVJZX0dDKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsaWVudCB3ZW50IGF3YXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50RGlzY29ubmVjdGVkKENsaWVudCBjbGllbnQpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDaHVuayBoYW5kbGVyIGVudHJ5IHBvaW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNodW5rKENsaWVudCBjbGllbnQsIGludCB0eXBlLCBCeXRlQnVmZmVyIGRhdGEsIGJvb2xlYW4gaXNSZXBseSwgaW50IG1zZ0lkKSB7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJoYW5kbGluZyAiICsgQ2h1bmtIYW5kbGVyLm5hbWUodHlwZSkpOwotCi0gICAgICAgIGlmICh0eXBlID09IENIVU5LX0hQSUYpIHsKLSAgICAgICAgICAgIGhhbmRsZUhQSUYoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX0hQU1QpIHsKLSAgICAgICAgICAgIGhhbmRsZUhQU1QoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX0hQRU4pIHsKLSAgICAgICAgICAgIGhhbmRsZUhQRU4oY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX0hQU0cpIHsKLSAgICAgICAgICAgIGhhbmRsZUhQU0coY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX0hQRFUpIHsKLSAgICAgICAgICAgIGhhbmRsZUhQRFUoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1JFQVEpIHsKLSAgICAgICAgICAgIGhhbmRsZVJFQVEoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1JFQUwpIHsKLSAgICAgICAgICAgIGhhbmRsZVJFQUwoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVVua25vd25DaHVuayhjbGllbnQsIHR5cGUsIGRhdGEsIGlzUmVwbHksIG1zZ0lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIGEgaGVhcCBpbmZvIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUhQSUYoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJIUElGISIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IG51bUhlYXBzID0gZGF0YS5nZXRJbnQoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1IZWFwczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlYXBJZCA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgICAgICAgICAgICAgbG9uZyB0aW1lU3RhbXAgPSBkYXRhLmdldExvbmcoKTsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgICAgICAgICBieXRlIHJlYXNvbiA9IGRhdGEuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBtYXhIZWFwU2l6ZSA9IChsb25nKWRhdGEuZ2V0SW50KCkgJiAweDAwZmZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgbG9uZyBoZWFwU2l6ZSA9IChsb25nKWRhdGEuZ2V0SW50KCkgJiAweDAwZmZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgbG9uZyBieXRlc0FsbG9jYXRlZCA9IChsb25nKWRhdGEuZ2V0SW50KCkgJiAweDAwZmZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgbG9uZyBvYmplY3RzQWxsb2NhdGVkID0gKGxvbmcpZGF0YS5nZXRJbnQoKSAmIDB4MDBmZmZmZmZmZjsKLQotICAgICAgICAgICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0SGVhcEluZm8oaGVhcElkLCBtYXhIZWFwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBTaXplLCBieXRlc0FsbG9jYXRlZCwgb2JqZWN0c0FsbG9jYXRlZCk7Ci0gICAgICAgICAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX0hFQVBfREFUQSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLncoImRkbS1oZWFwIiwgIm1hbGZvcm1lZCBIUElGIGNodW5rIGZyb20gY2xpZW50Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGFuIEhQSUYgKEhlYVAgSW5GbykgcmVxdWVzdCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSFBJRihDbGllbnQgY2xpZW50LCBpbnQgd2hlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigxKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIGJ1Zi5wdXQoKGJ5dGUpd2hlbik7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19IUElGLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX0hQSUYpICsgIjogd2hlbj0iICsgd2hlbik7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBhIGhlYXAgc2VnbWVudCBzZXJpZXMgc3RhcnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSFBTVChDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgLyogQ2xlYXIgb3V0IGFueSBkYXRhIHRoYXQncyBzaXR0aW5nIGFyb3VuZCB0bwotICAgICAgICAgKiBnZXQgcmVhZHkgZm9yIHRoZSBjaHVua3MgdGhhdCBhcmUgYWJvdXQgdG8gY29tZS4KLSAgICAgICAgICovCi0vL3h4eCB0b2RvOiBvbmx5IGNsZWFyIGRhdGEgdGhhdCBiZWxvbmdzIHRvIHRoZSBoZWFwIG1lbnRpb25lZCBpbiA8ZGF0YT4uCi0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0Vm1IZWFwRGF0YSgpLmNsZWFySGVhcERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBhIGhlYXAgc2VnbWVudCBzZXJpZXMgZW5kIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUhQRU4oQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIC8qIExldCB0aGUgVUkga25vdyB0aGF0IHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiB0aGUKLSAgICAgICAgICogZGF0YSBmb3IgdGhpcyBoZWFwLgotICAgICAgICAgKi8KLS8veHh4IHRvZG86IG9ubHkgc2VhbCBkYXRhIHRoYXQgYmVsb25ncyB0byB0aGUgaGVhcCBtZW50aW9uZWQgaW4gPGRhdGE+LgotICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldFZtSGVhcERhdGEoKS5zZWFsSGVhcERhdGEoKTsKLSAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX0hFQVBfREFUQSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgYSBoZWFwIHNlZ21lbnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSFBTRyhDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgYnl0ZSBkYXRhQ29weVtdID0gbmV3IGJ5dGVbZGF0YS5saW1pdCgpXTsKLSAgICAgICAgZGF0YS5yZXdpbmQoKTsKLSAgICAgICAgZGF0YS5nZXQoZGF0YUNvcHkpOwotICAgICAgICBkYXRhID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGFDb3B5KTsKLSAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRWbUhlYXBEYXRhKCkuYWRkSGVhcERhdGEoZGF0YSk7Ci0vL3h4eCB0b2RvOiBhZGQgdG8gdGhlIGhlYXAgbWVudGlvbmVkIGluIDxkYXRhPgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGFuIEhQU0cgKEhlYVAgU2VHbWVudCkgcmVxdWVzdCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSFBTRyhDbGllbnQgY2xpZW50LCBpbnQgd2hlbiwgaW50IHdoYXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigyKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIGJ1Zi5wdXQoKGJ5dGUpd2hlbik7Ci0gICAgICAgIGJ1Zi5wdXQoKGJ5dGUpd2hhdCk7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19IUFNHLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX0hQU0cpICsgIjogd2hlbj0iCi0gICAgICAgICAgICArIHdoZW4gKyAiLCB3aGF0PSIgKyB3aGF0KTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGFuIEhQR0MgcmVxdWVzdCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSFBHQyhDbGllbnQgY2xpZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDApOwotICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IG5ldyBKZHdwUGFja2V0KHJhd0J1Zik7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gZ2V0Q2h1bmtEYXRhQnVmKHJhd0J1Zik7Ci0KLSAgICAgICAgLy8gbm8gZGF0YQotCi0gICAgICAgIGZpbmlzaENodW5rUGFja2V0KHBhY2tldCwgQ0hVTktfSFBHQywgYnVmLnBvc2l0aW9uKCkpOwotICAgICAgICBMb2cuZCgiZGRtLWhlYXAiLCAiU2VuZGluZyAiICsgbmFtZShDSFVOS19IUEdDKSk7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhbiBIUERVIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKgotICAgICAqIFdlIHdpbGwgZ2V0IGFuIEhQRFUgcmVzcG9uc2Ugd2hlbiB0aGUgaGVhcCBkdW1wIGhhcyBjb21wbGV0ZWQuICBPbgotICAgICAqIGZhaWx1cmUgd2UgZ2V0IGEgZ2VuZXJpYyBmYWlsdXJlIHJlc3BvbnNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIG5hbWUgb2Ygb3V0cHV0IGZpbGUgKG9uIGRldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEhQRFUoQ2xpZW50IGNsaWVudCwgU3RyaW5nIGZpbGVOYW1lKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDQgKyBmaWxlTmFtZS5sZW5ndGgoKSAqIDIpOwotICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IG5ldyBKZHdwUGFja2V0KHJhd0J1Zik7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gZ2V0Q2h1bmtEYXRhQnVmKHJhd0J1Zik7Ci0KLSAgICAgICAgYnVmLnB1dEludChmaWxlTmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIHB1dFN0cmluZyhidWYsIGZpbGVOYW1lKTsKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX0hQRFUsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1oZWFwIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfSFBEVSkgKyAiICciICsgZmlsZU5hbWUgKyInIik7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5zZXRQZW5kaW5nSHByb2ZEdW1wKGZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBub3RpZmljYXRpb24gb2YgY29tcGxldGlvbiBvZiBhIEhlYVAgRFVtcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSFBEVShDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgYnl0ZSByZXN1bHQ7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlbmFtZSBhbmQgbWFrZSB0aGUgY2xpZW50IG5vdCBoYXZlIHBlbmRpbmcgSFBST0YgZHVtcCBhbnltb3JlLgotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldFBlbmRpbmdIcHJvZkR1bXAoKTsKLSAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5zZXRQZW5kaW5nSHByb2ZEdW1wKG51bGwpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZHVtcCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gZGF0YS5nZXQoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGFwcC1sZXZlbCBoYW5kbGVyIGZvciBIUFJPRiBkdW1wCi0gICAgICAgIElIcHJvZkR1bXBIYW5kbGVyIGhhbmRsZXIgPSBDbGllbnREYXRhLmdldEhwcm9mRHVtcEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vblN1Y2Nlc3MoZmlsZW5hbWUsIGNsaWVudCk7Ci0KLSAgICAgICAgICAgICAgICBMb2cuZCgiZGRtLWhlYXAiLCAiSGVhcCBkdW1wIHJlcXVlc3QgaGFzIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25GYWlsdXJlKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbS1oZWFwIiwgIkhlYXAgZHVtcCByZXF1ZXN0IGZhaWxlZCAoY2hlY2sgZGV2aWNlIGxvZykiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgUkVBRSAoUkVjZW50IEFsbG9jYXRpb24gRW5hYmxlKSByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRSRUFFKENsaWVudCBjbGllbnQsIGJvb2xlYW4gZW5hYmxlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDEpOwotICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IG5ldyBKZHdwUGFja2V0KHJhd0J1Zik7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gZ2V0Q2h1bmtEYXRhQnVmKHJhd0J1Zik7Ci0KLSAgICAgICAgYnVmLnB1dCgoYnl0ZSkgKGVuYWJsZSA/IDEgOiAwKSk7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19SRUFFLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX1JFQUUpICsgIjogIiArIGVuYWJsZSk7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIFJFQVEgKFJFY2VudCBBbGxvY2F0aW9uIFF1ZXJ5KSByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRSRUFRKENsaWVudCBjbGllbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgcmF3QnVmID0gYWxsb2NCdWZmZXIoMCk7Ci0gICAgICAgIEpkd3BQYWNrZXQgcGFja2V0ID0gbmV3IEpkd3BQYWNrZXQocmF3QnVmKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICAvLyBubyBkYXRhCi0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19SRUFRLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX1JFQVEpKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgUkVBTCAoUkVjZW50IEFMbG9jYXRpb24pIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJFQUwoQ2xpZW50IGNsaWVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigwKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIC8vIG5vIGRhdGEKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX1JFQUwsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1oZWFwIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfUkVBTCkpOwotICAgICAgICBjbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0LCBtSW5zdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgdGhlIHJlc3BvbnNlIGZyb20gb3VyIFJFY2VudCBBbGxvY2F0aW9uIFF1ZXJ5IG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJFQVEoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZDsKLQotICAgICAgICBlbmFibGVkID0gKGRhdGEuZ2V0KCkgIT0gMCk7Ci0gICAgICAgIExvZy5kKCJkZG0taGVhcCIsICJSRUFRIHNheXM6IGVuYWJsZWQ9IiArIGVuYWJsZWQpOwotCi0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0QWxsb2NhdGlvblN0YXR1cyhlbmFibGVkID8KLSAgICAgICAgICAgICAgICBBbGxvY2F0aW9uVHJhY2tpbmdTdGF0dXMuT04gOiBBbGxvY2F0aW9uVHJhY2tpbmdTdGF0dXMuT0ZGKTsKLSAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX0hFQVBfQUxMT0NBVElPTl9TVEFUVVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgVk0gY2xhc3MgZGVzY3JpcHRvciBzdHJpbmcgKCJMYW5kcm9pZC9vcy9EZWJ1ZzsiKSB0bwotICAgICAqIGEgZG90LW5vdGF0aW9uIGNsYXNzIG5hbWUgKCJhbmRyb2lkLm9zLkRlYnVnIikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRvclRvRG90KFN0cmluZyBzdHIpIHsKLSAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBhcnJheXMuCi0gICAgICAgIGludCBhcnJheSA9IDA7Ci0gICAgICAgIHdoaWxlIChzdHIuc3RhcnRzV2l0aCgiWyIpKSB7Ci0gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgYXJyYXkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0KLSAgICAgICAgLyogc3RyaXAgb2ZmIGxlYWRpbmcgJ0wnIGFuZCB0cmFpbGluZyAnOycgaWYgYXBwcm9wcmlhdGUgKi8KLSAgICAgICAgaWYgKGxlbiA+PSAyICYmIHN0ci5jaGFyQXQoMCkgPT0gJ0wnICYmIHN0ci5jaGFyQXQobGVuIC0gMSkgPT0gJzsnKSB7Ci0gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDEsIGxlbi0xKTsKLSAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCcvJywgJy4nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGJhc2ljIHR5cGVzCi0gICAgICAgICAgICBpZiAoIkMiLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gImNoYXIiOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiQiIuZXF1YWxzKHN0cikpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSAiYnl0ZSI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJaIi5lcXVhbHMoc3RyKSkgewotICAgICAgICAgICAgICAgIHN0ciA9ICJib29sZWFuIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlMiLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gInNob3J0IjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkkiLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gImludCI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJKIi5lcXVhbHMoc3RyKSkgewotICAgICAgICAgICAgICAgIHN0ciA9ICJsb25nIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkYiLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gImZsb2F0IjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkQiLmVxdWFscyhzdHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyID0gImRvdWJsZSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgYWRkIHRoZSBhcnJheSBwYXJ0Ci0gICAgICAgIGZvciAoaW50IGEgPSAwIDsgYSA8IGFycmF5OyBhKyspIHsKLSAgICAgICAgICAgIHN0ciA9IHN0ciArICJbXSI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgc3RyaW5nIHRhYmxlIG91dCBvZiAiZGF0YSIuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGp1c3QgYSBzZXJpYWwgY29sbGVjdGlvbiBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIGlzIGEKLSAgICAgKiBmb3VyLWJ5dGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IFVURi0xNiBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkU3RyaW5nVGFibGUoQnl0ZUJ1ZmZlciBkYXRhLCBTdHJpbmdbXSBzdHJpbmdzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IHN0cmluZ3MubGVuZ3RoOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50IG5hbWVMZW4gPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3IgPSBnZXRTdHJpbmcoZGF0YSwgbmFtZUxlbik7Ci0gICAgICAgICAgICBzdHJpbmdzW2ldID0gZGVzY3JpcHRvclRvRG90KGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgYSBSRWNlbnQgQUxsb2NhdGlvbiByZXNwb25zZS4KLSAgICAgKgotICAgICAqIE1lc3NhZ2UgaGVhZGVyIChhbGwgdmFsdWVzIGJpZy1lbmRpYW4pOgotICAgICAqICAgKDFiKSBtZXNzYWdlIGhlYWRlciBsZW4gKHRvIGFsbG93IGZ1dHVyZSBleHBhbnNpb24pOyBpbmNsdWRlcyBpdHNlbGYKLSAgICAgKiAgICgxYikgZW50cnkgaGVhZGVyIGxlbgotICAgICAqICAgKDFiKSBzdGFjayBmcmFtZSBsZW4KLSAgICAgKiAgICgyYikgbnVtYmVyIG9mIGVudHJpZXMKLSAgICAgKiAgICg0Yikgb2Zmc2V0IHRvIHN0cmluZyB0YWJsZSBmcm9tIHN0YXJ0IG9mIG1lc3NhZ2UKLSAgICAgKiAgICgyYikgbnVtYmVyIG9mIGNsYXNzIG5hbWUgc3RyaW5ncwotICAgICAqICAgKDJiKSBudW1iZXIgb2YgbWV0aG9kIG5hbWUgc3RyaW5ncwotICAgICAqICAgKDJiKSBudW1iZXIgb2Ygc291cmNlIGZpbGUgbmFtZSBzdHJpbmdzCi0gICAgICogICBGb3IgZWFjaCBlbnRyeToKLSAgICAgKiAgICAgKDRiKSB0b3RhbCBhbGxvY2F0aW9uIHNpemUKLSAgICAgKiAgICAgKDJiKSB0aHJlYWRJZAotICAgICAqICAgICAoMmIpIGFsbG9jYXRlZCBvYmplY3QncyBjbGFzcyBuYW1lIGluZGV4Ci0gICAgICogICAgICgxYikgc3RhY2sgZGVwdGgKLSAgICAgKiAgICAgRm9yIGVhY2ggc3RhY2sgZnJhbWU6Ci0gICAgICogICAgICAgKDJiKSBtZXRob2QncyBjbGFzcyBuYW1lCi0gICAgICogICAgICAgKDJiKSBtZXRob2QgbmFtZQotICAgICAqICAgICAgICgyYikgbWV0aG9kIHNvdXJjZSBmaWxlCi0gICAgICogICAgICAgKDJiKSBsaW5lIG51bWJlciwgY2xpcHBlZCB0byAzMjc2NzsgLTIgaWYgbmF0aXZlOyAtMSBpZiBubyBzb3VyY2UKLSAgICAgKiAgICh4YikgY2xhc3MgbmFtZSBzdHJpbmdzCi0gICAgICogICAoeGIpIG1ldGhvZCBuYW1lIHN0cmluZ3MKLSAgICAgKiAgICh4Yikgc291cmNlIGZpbGUgc3RyaW5ncwotICAgICAqCi0gICAgICogICBBcyB3aXRoIG90aGVyIERETSB0cmFmZmljLCBzdHJpbmdzIGFyZSBzZW50IGFzIGEgNC1ieXRlIGxlbmd0aAotICAgICAqICAgZm9sbG93ZWQgYnkgVVRGLTE2IGRhdGEuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJFQUwoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIExvZy5lKCJkZG0taGVhcCIsICIqKiogUmVjZWl2ZWQgIiArIG5hbWUoQ0hVTktfUkVBTCkpOwotICAgICAgICBpbnQgbWVzc2FnZUhkckxlbiwgZW50cnlIZHJMZW4sIHN0YWNrRnJhbWVMZW47Ci0gICAgICAgIGludCBudW1FbnRyaWVzLCBvZmZzZXRUb1N0cmluZ3M7Ci0gICAgICAgIGludCBudW1DbGFzc05hbWVzLCBudW1NZXRob2ROYW1lcywgbnVtRmlsZU5hbWVzOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlYWQgdGhlIGhlYWRlci4KLSAgICAgICAgICovCi0gICAgICAgIG1lc3NhZ2VIZHJMZW4gPSAoZGF0YS5nZXQoKSAmIDB4ZmYpOwotICAgICAgICBlbnRyeUhkckxlbiA9IChkYXRhLmdldCgpICYgMHhmZik7Ci0gICAgICAgIHN0YWNrRnJhbWVMZW4gPSAoZGF0YS5nZXQoKSAmIDB4ZmYpOwotICAgICAgICBudW1FbnRyaWVzID0gKGRhdGEuZ2V0U2hvcnQoKSAmIDB4ZmZmZik7Ci0gICAgICAgIG9mZnNldFRvU3RyaW5ncyA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIG51bUNsYXNzTmFtZXMgPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgbnVtTWV0aG9kTmFtZXMgPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgbnVtRmlsZU5hbWVzID0gKGRhdGEuZ2V0U2hvcnQoKSAmIDB4ZmZmZik7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTa2lwIGZvcndhcmQgdG8gdGhlIHN0cmluZ3MgYW5kIHJlYWQgdGhlbS4KLSAgICAgICAgICovCi0gICAgICAgIGRhdGEucG9zaXRpb24ob2Zmc2V0VG9TdHJpbmdzKTsKLQotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWVzID0gbmV3IFN0cmluZ1tudW1DbGFzc05hbWVzXTsKLSAgICAgICAgU3RyaW5nW10gbWV0aG9kTmFtZXMgPSBuZXcgU3RyaW5nW251bU1ldGhvZE5hbWVzXTsKLSAgICAgICAgU3RyaW5nW10gZmlsZU5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlTmFtZXNdOwotCi0gICAgICAgIHJlYWRTdHJpbmdUYWJsZShkYXRhLCBjbGFzc05hbWVzKTsKLSAgICAgICAgcmVhZFN0cmluZ1RhYmxlKGRhdGEsIG1ldGhvZE5hbWVzKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk1FVEhPRFM6ICIKLSAgICAgICAgLy8gICAgKyBqYXZhLnV0aWwuQXJyYXlzLmRlZXBUb1N0cmluZyhtZXRob2ROYW1lcykpOwotICAgICAgICByZWFkU3RyaW5nVGFibGUoZGF0YSwgZmlsZU5hbWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTa2lwIGJhY2sgdG8gYSBwb2ludCBqdXN0IHBhc3QgdGhlIGhlYWRlciBhbmQgc3RhcnQgcmVhZGluZwotICAgICAgICAgKiBlbnRyaWVzLgotICAgICAgICAgKi8KLSAgICAgICAgZGF0YS5wb3NpdGlvbihtZXNzYWdlSGRyTGVuKTsKLQotICAgICAgICBBcnJheUxpc3Q8QWxsb2NhdGlvbkluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFsbG9jYXRpb25JbmZvPihudW1FbnRyaWVzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0b3RhbFNpemU7Ci0gICAgICAgICAgICBpbnQgdGhyZWFkSWQsIGNsYXNzTmFtZUluZGV4LCBzdGFja0RlcHRoOwotCi0gICAgICAgICAgICB0b3RhbFNpemUgPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgdGhyZWFkSWQgPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgICAgIGNsYXNzTmFtZUluZGV4ID0gKGRhdGEuZ2V0U2hvcnQoKSAmIDB4ZmZmZik7Ci0gICAgICAgICAgICBzdGFja0RlcHRoID0gKGRhdGEuZ2V0KCkgJiAweGZmKTsKLSAgICAgICAgICAgIC8qIHdlJ3ZlIGNvbnN1bWVkIDkgYnl0ZXM7IGdvYmJsZSB1cCBhbnkgZXh0cmEgKi8KLSAgICAgICAgICAgIGZvciAoaW50IHNraXAgPSA5OyBza2lwIDwgZW50cnlIZHJMZW47IHNraXArKykKLSAgICAgICAgICAgICAgICBkYXRhLmdldCgpOwotCi0gICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0ZUFycmF5ID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50W3N0YWNrRGVwdGhdOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUHVsbCBvdXQgdGhlIHN0YWNrIHRyYWNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGludCBzdGkgPSAwOyBzdGkgPCBzdGFja0RlcHRoOyBzdGkrKykgewotICAgICAgICAgICAgICAgIGludCBtZXRob2RDbGFzc05hbWVJbmRleCwgbWV0aG9kTmFtZUluZGV4OwotICAgICAgICAgICAgICAgIGludCBtZXRob2RTb3VyY2VGaWxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgc2hvcnQgbGluZU51bWJlcjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kQ2xhc3NOYW1lLCBtZXRob2ROYW1lLCBtZXRob2RTb3VyY2VGaWxlOwotCi0gICAgICAgICAgICAgICAgbWV0aG9kQ2xhc3NOYW1lSW5kZXggPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lSW5kZXggPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTb3VyY2VGaWxlSW5kZXggPSAoZGF0YS5nZXRTaG9ydCgpICYgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gZGF0YS5nZXRTaG9ydCgpOwotCi0gICAgICAgICAgICAgICAgbWV0aG9kQ2xhc3NOYW1lID0gY2xhc3NOYW1lc1ttZXRob2RDbGFzc05hbWVJbmRleF07Ci0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWVzW21ldGhvZE5hbWVJbmRleF07Ci0gICAgICAgICAgICAgICAgbWV0aG9kU291cmNlRmlsZSA9IGZpbGVOYW1lc1ttZXRob2RTb3VyY2VGaWxlSW5kZXhdOwotCi0gICAgICAgICAgICAgICAgc3RlQXJyYXlbc3RpXSA9IG5ldyBTdGFja1RyYWNlRWxlbWVudChtZXRob2RDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIG1ldGhvZFNvdXJjZUZpbGUsIGxpbmVOdW1iZXIpOwotCi0gICAgICAgICAgICAgICAgLyogd2UndmUgY29uc3VtZWQgOCBieXRlczsgZ29iYmxlIHVwIGFueSBleHRyYSAqLwotICAgICAgICAgICAgICAgIGZvciAoaW50IHNraXAgPSA5OyBza2lwIDwgc3RhY2tGcmFtZUxlbjsgc2tpcCsrKQotICAgICAgICAgICAgICAgICAgICBkYXRhLmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsaXN0LmFkZChuZXcgQWxsb2NhdGlvbkluZm8oY2xhc3NOYW1lc1tjbGFzc05hbWVJbmRleF0sCi0gICAgICAgICAgICAgICAgdG90YWxTaXplLCAoc2hvcnQpIHRocmVhZElkLCBzdGVBcnJheSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc29ydCBiaWdnZXN0IGFsbG9jYXRpb25zIGZpcnN0LgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwotCi0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0QWxsb2NhdGlvbnMobGlzdC50b0FycmF5KG5ldyBBbGxvY2F0aW9uSW5mb1tudW1FbnRyaWVzXSkpOwotICAgICAgICBjbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfSEVBUF9BTExPQ0FUSU9OUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGb3IgZGVidWdnaW5nOiBkdW1wIHRoZSBjb250ZW50cyBvZiBhbiBBbGxvY1JlY29yZCBhcnJheS4KLSAgICAgKgotICAgICAqIFRoZSBhcnJheSBzdGFydHMgd2l0aCB0aGUgb2xkZXN0IGtub3duIGFsbG9jYXRpb24gYW5kIGVuZHMgd2l0aAotICAgICAqIHRoZSBtb3N0IHJlY2VudCBhbGxvY2F0aW9uLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFJlY29yZHMoQWxsb2NhdGlvbkluZm9bXSByZWNvcmRzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgIiArIHJlY29yZHMubGVuZ3RoICsgIiByZWNvcmRzOiIpOwotCi0gICAgICAgIGZvciAoQWxsb2NhdGlvbkluZm8gcmVjOiByZWNvcmRzKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRpZD0iICsgcmVjLmdldFRocmVhZElkKCkgKyAiICIKLSAgICAgICAgICAgICAgICArIHJlYy5nZXRBbGxvY2F0ZWRDbGFzcygpICsgIiAoIiArIHJlYy5nZXRTaXplKCkgKyAiIGJ5dGVzKSIpOwotCi0gICAgICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHN0ZTogcmVjLmdldFN0YWNrVHJhY2UoKSkgewotICAgICAgICAgICAgICAgIGlmIChzdGUuaXNOYXRpdmVNZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgc3RlLmdldENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIuIiArIHN0ZS5nZXRNZXRob2ROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoTmF0aXZlIG1ldGhvZCkiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgc3RlLmdldENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIuIiArIHN0ZS5nZXRNZXRob2ROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIHN0ZS5nZXRGaWxlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIHN0ZS5nZXRMaW5lTnVtYmVyKCkgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlSGVsbG8uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVIZWxsby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYyYmNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVIZWxsby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBIYW5kbGUgdGhlICJoZWxsbyIgY2h1bmsgKEhFTE8pIGFuZCBmZWF0dXJlIGRpc2NvdmVyeS4KLSAqLwotZmluYWwgY2xhc3MgSGFuZGxlSGVsbG8gZXh0ZW5kcyBDaHVua0hhbmRsZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfSEVMTyA9IENodW5rSGFuZGxlci50eXBlKCJIRUxPIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfRkVBVCA9IENodW5rSGFuZGxlci50eXBlKCJGRUFUIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYW5kbGVIZWxsbyBtSW5zdCA9IG5ldyBIYW5kbGVIZWxsbygpOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVIZWxsbygpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBmb3IgdGhlIHBhY2tldHMgd2UgZXhwZWN0IHRvIGdldCBmcm9tIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKE1vbml0b3JUaHJlYWQgbXQpIHsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfSEVMTywgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsaWVudCBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRSZWFkeShDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMb2cuZCgiZGRtLWhlbGxvIiwgIk5vdyByZWFkeTogIiArIGNsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IHdlbnQgYXdheS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnREaXNjb25uZWN0ZWQoQ2xpZW50IGNsaWVudCkgewotICAgICAgICBMb2cuZCgiZGRtLWhlbGxvIiwgIk5vdyBkaXNjb25uZWN0ZWQ6ICIgKyBjbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIEhFTExPLXR5cGUgY29tbWFuZHMgdG8gdGhlIFZNIGFmdGVyIGEgZ29vZCBoYW5kc2hha2UuCi0gICAgICogQHBhcmFtIGNsaWVudAotICAgICAqIEBwYXJhbSBzZXJ2ZXJQcm90b2NvbFZlcnNpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRIZWxsb0NvbW1hbmRzKENsaWVudCBjbGllbnQsIGludCBzZXJ2ZXJQcm90b2NvbFZlcnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzZW5kSEVMTyhjbGllbnQsIHNlcnZlclByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIHNlbmRGRUFUKGNsaWVudCk7Ci0gICAgICAgIEhhbmRsZVByb2ZpbGluZy5zZW5kTVBSUShjbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENodW5rIGhhbmRsZXIgZW50cnkgcG9pbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlQ2h1bmsoQ2xpZW50IGNsaWVudCwgaW50IHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSwgYm9vbGVhbiBpc1JlcGx5LCBpbnQgbXNnSWQpIHsKLQotICAgICAgICBMb2cuZCgiZGRtLWhlbGxvIiwgImhhbmRsaW5nICIgKyBDaHVua0hhbmRsZXIubmFtZSh0eXBlKSk7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gQ0hVTktfSEVMTykgewotICAgICAgICAgICAgYXNzZXJ0IGlzUmVwbHk7Ci0gICAgICAgICAgICBoYW5kbGVIRUxPKGNsaWVudCwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDSFVOS19GRUFUKSB7Ci0gICAgICAgICAgICBoYW5kbGVGRUFUKGNsaWVudCwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVVbmtub3duQ2h1bmsoY2xpZW50LCB0eXBlLCBkYXRhLCBpc1JlcGx5LCBtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBhIHJlcGx5IHRvIG91ciBIRUxPIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVIRUxPKENsaWVudCBjbGllbnQsIEJ5dGVCdWZmZXIgZGF0YSkgewotICAgICAgICBpbnQgdmVyc2lvbiwgcGlkLCB2bUlkZW50TGVuLCBhcHBOYW1lTGVuOwotICAgICAgICBTdHJpbmcgdm1JZGVudCwgYXBwTmFtZTsKLQotICAgICAgICB2ZXJzaW9uID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgcGlkID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgdm1JZGVudExlbiA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIGFwcE5hbWVMZW4gPSBkYXRhLmdldEludCgpOwotCi0gICAgICAgIHZtSWRlbnQgPSBnZXRTdHJpbmcoZGF0YSwgdm1JZGVudExlbik7Ci0gICAgICAgIGFwcE5hbWUgPSBnZXRTdHJpbmcoZGF0YSwgYXBwTmFtZUxlbik7Ci0KLSAgICAgICAgTG9nLmQoImRkbS1oZWxsbyIsICJIRUxPOiB2PSIgKyB2ZXJzaW9uICsgIiwgcGlkPSIgKyBwaWQKLSAgICAgICAgICAgICsgIiwgdm09JyIgKyB2bUlkZW50ICsgIicsIGFwcD0nIiArIGFwcE5hbWUgKyAiJyIpOwotCi0gICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoY2QpIHsKLSAgICAgICAgICAgIGlmIChjZC5nZXRQaWQoKSA9PSBwaWQpIHsKLSAgICAgICAgICAgICAgICBjZC5zZXRWbUlkZW50aWZpZXIodm1JZGVudCk7Ci0gICAgICAgICAgICAgICAgY2Quc2V0Q2xpZW50RGVzY3JpcHRpb24oYXBwTmFtZSk7Ci0gICAgICAgICAgICAgICAgY2QuaXNEZG1Bd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoImRkbS1oZWxsbyIsICJSZWNlaXZlZCBwaWQgKCIgKyBwaWQgKyAiKSBkb2VzIG5vdCBtYXRjaCBjbGllbnQgcGlkICgiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNkLmdldFBpZCgpICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudCA9IGNoZWNrRGVidWdnZXJQb3J0Rm9yQXBwTmFtZShjbGllbnQsIGFwcE5hbWUpOwotCi0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX05BTUUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgSEVMTyByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRIRUxPKENsaWVudCBjbGllbnQsIGludCBzZXJ2ZXJQcm90b2NvbFZlcnNpb24pCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcig0KTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIGJ1Zi5wdXRJbnQoc2VydmVyUHJvdG9jb2xWZXJzaW9uKTsKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX0hFTE8sIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1oZWxsbyIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX0hFTE8pCi0gICAgICAgICAgICArICIgSUQ9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhwYWNrZXQuZ2V0SWQoKSkpOwotICAgICAgICBjbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0LCBtSW5zdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGEgcmVwbHkgdG8gb3VyIEZFQVQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUZFQVQoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGludCBmZWF0dXJlQ291bnQ7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZlYXR1cmVDb3VudCA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZWF0dXJlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50IGxlbiA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmVhdHVyZSA9IGdldFN0cmluZyhkYXRhLCBsZW4pOwotICAgICAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCi0gICAgICAgICAgICBMb2cuZCgiZGRtLWhlbGxvIiwgIkZlYXR1cmU6ICIgKyBmZWF0dXJlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgYSBGRUFUIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEZFQVQoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigwKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIC8vIG5vIGRhdGEKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX0ZFQVQsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1oZWFwIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfRkVBVCkpOwotICAgICAgICBjbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0LCBtSW5zdCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlTmF0aXZlSGVhcC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZU5hdGl2ZUhlYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyNjU5MC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlTmF0aXZlSGVhcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci0KLS8qKgotICogSGFuZGxlIHRocmVhZCBzdGF0dXMgdXBkYXRlcy4KLSAqLwotZmluYWwgY2xhc3MgSGFuZGxlTmF0aXZlSGVhcCBleHRlbmRzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19OSEdUID0gdHlwZSgiTkhHVCIpOyAvLyAkTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX05IU0cgPSB0eXBlKCJOSFNHIik7IC8vICROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfTkhTVCA9IHR5cGUoIk5IU1QiKTsgLy8gJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19OSEVOID0gdHlwZSgiTkhFTiIpOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFuZGxlTmF0aXZlSGVhcCBtSW5zdCA9IG5ldyBIYW5kbGVOYXRpdmVIZWFwKCk7Ci0KLSAgICBwcml2YXRlIEhhbmRsZU5hdGl2ZUhlYXAoKSB7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBmb3IgdGhlIHBhY2tldHMgd2UgZXhwZWN0IHRvIGdldCBmcm9tIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKE1vbml0b3JUaHJlYWQgbXQpIHsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfTkhHVCwgbUluc3QpOwotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19OSFNHLCBtSW5zdCk7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX05IU1QsIG1JbnN0KTsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfTkhFTiwgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsaWVudCBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRSZWFkeShDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24ge30KLQotICAgIC8qKgotICAgICAqIENsaWVudCB3ZW50IGF3YXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50RGlzY29ubmVjdGVkKENsaWVudCBjbGllbnQpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDaHVuayBoYW5kbGVyIGVudHJ5IHBvaW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNodW5rKENsaWVudCBjbGllbnQsIGludCB0eXBlLCBCeXRlQnVmZmVyIGRhdGEsIGJvb2xlYW4gaXNSZXBseSwgaW50IG1zZ0lkKSB7Ci0KLSAgICAgICAgTG9nLmQoImRkbS1uYXRpdmVoZWFwIiwgImhhbmRsaW5nICIgKyBDaHVua0hhbmRsZXIubmFtZSh0eXBlKSk7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gQ0hVTktfTkhHVCkgewotICAgICAgICAgICAgaGFuZGxlTkhHVChjbGllbnQsIGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ0hVTktfTkhTVCkgewotICAgICAgICAgICAgLy8gc3RhcnQgY2h1bmsgYmVmb3JlIGFueSBOSFNHIGNodW5rKHMpCi0gICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldE5hdGl2ZUhlYXBEYXRhKCkuY2xlYXJIZWFwRGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ0hVTktfTkhFTikgewotICAgICAgICAgICAgLy8gZW5kIGNodW5rIGFmdGVyIE5IU0cgY2h1bmsocykKLSAgICAgICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0TmF0aXZlSGVhcERhdGEoKS5zZWFsSGVhcERhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX05IU0cpIHsKLSAgICAgICAgICAgIGhhbmRsZU5IU0coY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVVua25vd25DaHVuayhjbGllbnQsIHR5cGUsIGRhdGEsIGlzUmVwbHksIG1zZ0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51cGRhdGUoQ2xpZW50LkNIQU5HRV9OQVRJVkVfSEVBUF9EQVRBKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGFuIE5IR1QgKE5hdGl2ZSBUaHJlYWQgR2VUKSByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmROSEdUKENsaWVudCBjbGllbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigwKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIC8vIG5vIGRhdGEgaW4gcmVxdWVzdCBtZXNzYWdlCi0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19OSEdULCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0tbmF0aXZlaGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX05IR1QpKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotCi0gICAgICAgIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDIpOwotICAgICAgICBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICBidWYucHV0KChieXRlKUhhbmRsZUhlYXAuV0hFTl9HQyk7Ci0gICAgICAgIGJ1Zi5wdXQoKGJ5dGUpSGFuZGxlSGVhcC5XSEFUX09CSik7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19OSFNHLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0tbmF0aXZlaGVhcCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX05IU0cpKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIG91ciBuYXRpdmUgaGVhcCBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOSEdUKENsaWVudCBjbGllbnQsIEJ5dGVCdWZmZXIgZGF0YSkgewotICAgICAgICBDbGllbnREYXRhIGNkID0gY2xpZW50LmdldENsaWVudERhdGEoKTsKLQotICAgICAgICBMb2cuZCgiZGRtLW5hdGl2ZWhlYXAiLCAiTkhHVDogIiArIGRhdGEubGltaXQoKSArICIgYnl0ZXMiKTsKLQotICAgICAgICAvLyBUT0RPIC0gcHJvY2VzcyBpbmNvbWluZyBkYXRhIGFuZCBzYXZlIGluICJjZCIKLSAgICAgICAgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtkYXRhLmxpbWl0KCldOwotICAgICAgICBkYXRhLmdldChjb3B5KTsKLQotICAgICAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgcnVuCi0gICAgICAgIGNkLmNsZWFyTmF0aXZlQWxsb2NhdGlvbkluZm8oKTsKLQotICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChjb3B5KTsKLSAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLQotLy8gICAgICAgIHJlYWQgdGhlIGhlYWRlcgotLy8gICAgICAgIHR5cGVkZWYgc3RydWN0IEhlYWRlciB7Ci0vLyAgICAgICAgICAgIHVpbnQzMl90IG1hcFNpemU7Ci0vLyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jU2l6ZTsKLS8vICAgICAgICAgICAgdWludDMyX3QgYWxsb2NJbmZvU2l6ZTsKLS8vICAgICAgICAgICAgdWludDMyX3QgdG90YWxNZW1vcnk7Ci0vLyAgICAgICAgICAgICAgdWludDMyX3QgYmFja3RyYWNlU2l6ZTsKLS8vICAgICAgICB9OwotCi0gICAgICAgIGludCBtYXBTaXplID0gYnVmZmVyLmdldEludCgpOwotICAgICAgICBpbnQgYWxsb2NTaXplID0gYnVmZmVyLmdldEludCgpOwotICAgICAgICBpbnQgYWxsb2NJbmZvU2l6ZSA9IGJ1ZmZlci5nZXRJbnQoKTsKLSAgICAgICAgaW50IHRvdGFsTWVtb3J5ID0gYnVmZmVyLmdldEludCgpOwotICAgICAgICBpbnQgYmFja3RyYWNlU2l6ZSA9IGJ1ZmZlci5nZXRJbnQoKTsKLQotICAgICAgICBMb2cuZCgiZGRtcyIsICJtYXBTaXplOiAiICsgbWFwU2l6ZSk7Ci0gICAgICAgIExvZy5kKCJkZG1zIiwgImFsbG9jU2l6ZTogIiArIGFsbG9jU2l6ZSk7Ci0gICAgICAgIExvZy5kKCJkZG1zIiwgImFsbG9jSW5mb1NpemU6ICIgKyBhbGxvY0luZm9TaXplKTsKLSAgICAgICAgTG9nLmQoImRkbXMiLCAidG90YWxNZW1vcnk6ICIgKyB0b3RhbE1lbW9yeSk7Ci0KLSAgICAgICAgY2Quc2V0VG90YWxOYXRpdmVNZW1vcnkodG90YWxNZW1vcnkpOwotCi0gICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB1cGRhdGVzIGFyZW4ndCB0dXJuZWQgb24uCi0gICAgICAgIGlmIChhbGxvY0luZm9TaXplID09IDApCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChtYXBTaXplID4gMCkgewotICAgICAgICAgICAgYnl0ZVtdIG1hcHMgPSBuZXcgYnl0ZVttYXBTaXplXTsKLSAgICAgICAgICAgIGJ1ZmZlci5nZXQobWFwcywgMCwgbWFwU2l6ZSk7Ci0gICAgICAgICAgICBwYXJzZU1hcHMoY2QsIG1hcHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBhbGxvY1NpemUgLyBhbGxvY0luZm9TaXplOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGl0ZXJhdGlvbnMgOyBpKyspIHsKLSAgICAgICAgICAgIE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluZm8gPSBuZXcgTmF0aXZlQWxsb2NhdGlvbkluZm8oCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXRJbnQoKSAvKiBzaXplICovLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0SW50KCkgLyogYWxsb2NhdGlvbnMgKi8pOwotCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBiYWNrdHJhY2VTaXplIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBhZGRyID0gKChsb25nKWJ1ZmZlci5nZXRJbnQoKSkgJiAweDAwMDAwMDAwZmZmZmZmZmZMOwotCi0gICAgICAgICAgICAgICAgaW5mby5hZGRTdGFja0NhbGxBZGRyZXNzKGFkZHIpOzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2QuYWRkTmF0aXZlQWxsb2NhdGlvbihpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOSFNHKENsaWVudCBjbGllbnQsIEJ5dGVCdWZmZXIgZGF0YSkgewotICAgICAgICBieXRlIGRhdGFDb3B5W10gPSBuZXcgYnl0ZVtkYXRhLmxpbWl0KCldOwotICAgICAgICBkYXRhLnJld2luZCgpOwotICAgICAgICBkYXRhLmdldChkYXRhQ29weSk7Ci0gICAgICAgIGRhdGEgPSBCeXRlQnVmZmVyLndyYXAoZGF0YUNvcHkpOwotICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldE5hdGl2ZUhlYXBEYXRhKCkuYWRkSGVhcERhdGEoZGF0YSk7Ci0KLSAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdPUksgSU4gUFJPR1JFU1MKLQotLy8gICAgICAgIExvZy5lKCJkZG0tbmF0aXZlaGVhcCIsICJOSFNHOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0vLyAgICAgICAgTG9nLmUoImRkbS1uYXRpdmVoZWFwIiwgIk5IU0c6ICIgKyBkYXRhLmxpbWl0KCkgKyAiIGJ5dGVzIik7Ci0KLSAgICAgICAgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtkYXRhLmxpbWl0KCldOwotICAgICAgICBkYXRhLmdldChjb3B5KTsKLQotICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChjb3B5KTsKLSAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKLQotICAgICAgICBpbnQgaWQgPSBidWZmZXIuZ2V0SW50KCk7Ci0gICAgICAgIGludCB1bml0c2l6ZSA9IChpbnQpIGJ1ZmZlci5nZXQoKTsKLSAgICAgICAgbG9uZyBzdGFydEFkZHJlc3MgPSAobG9uZykgYnVmZmVyLmdldEludCgpICYgMHgwMDAwMDAwMGZmZmZmZmZmTDsKLSAgICAgICAgaW50IG9mZnNldCA9IGJ1ZmZlci5nZXRJbnQoKTsKLSAgICAgICAgaW50IGFsbG9jYXRpb25Vbml0Q291bnQgPSBidWZmZXIuZ2V0SW50KCk7Ci0KLS8vICAgICAgICBMb2cuZSgiZGRtLW5hdGl2ZWhlYXAiLCAiaWQ6ICIgKyBpZCk7Ci0vLyAgICAgICAgTG9nLmUoImRkbS1uYXRpdmVoZWFwIiwgInVuaXRzaXplOiAiICsgdW5pdHNpemUpOwotLy8gICAgICAgIExvZy5lKCJkZG0tbmF0aXZlaGVhcCIsICJzdGFydEFkZHJlc3M6IDB4IiArIExvbmcudG9IZXhTdHJpbmcoc3RhcnRBZGRyZXNzKSk7Ci0vLyAgICAgICAgTG9nLmUoImRkbS1uYXRpdmVoZWFwIiwgIm9mZnNldDogIiArIG9mZnNldCk7Ci0vLyAgICAgICAgTG9nLmUoImRkbS1uYXRpdmVoZWFwIiwgImFsbG9jYXRpb25Vbml0Q291bnQ6ICIgKyBhbGxvY2F0aW9uVW5pdENvdW50KTsKLS8vICAgICAgICBMb2cuZSgiZGRtLW5hdGl2ZWhlYXAiLCAiZW5kOiAweCIgKwotLy8gICAgICAgICAgICAgICAgTG9uZy50b0hleFN0cmluZyhzdGFydEFkZHJlc3MgKyB1bml0c2l6ZSAqIGFsbG9jYXRpb25Vbml0Q291bnQpKTsKLQotICAgICAgICAvLyByZWFkIHRoZSB1c2FnZQotICAgICAgICB3aGlsZSAoYnVmZmVyLnBvc2l0aW9uKCkgPCBidWZmZXIubGltaXQoKSkgewotICAgICAgICAgICAgaW50IGVTdGF0ZSA9IChpbnQpYnVmZmVyLmdldCgpICYgMHgwMDAwMDBmZjsKLSAgICAgICAgICAgIGludCBlTGVuID0gKChpbnQpYnVmZmVyLmdldCgpICYgMHgwMDAwMDBmZikgKyAxOwotICAgICAgICAgICAgLy9Mb2cuZSgiZGRtLW5hdGl2ZWhlYXAiLCAic29saWRpdHk6ICIgKyAoZVN0YXRlICYgMHg3KSArICIgLSBraW5kOiAiCi0gICAgICAgICAgICAvLyAgICAgICAgKyAoKGVTdGF0ZSA+PiAzKSAmIDB4NykgKyAiIC0gbGVuOiAiICsgZUxlbik7Ci0gICAgICAgIH0KLQotCi0vLyAgICAgICAgY291bnQgKz0gdW5pdHNpemUgKiBhbGxvY2F0aW9uVW5pdENvdW50OwotLy8gICAgICAgIExvZy5lKCJkZG0tbmF0aXZlaGVhcCIsICJjb3VudCA9ICIgKyBjb3VudCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VNYXBzKENsaWVudERhdGEgY2QsIGJ5dGVbXSBtYXBzKSB7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYXBzKSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dCk7Ci0KLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gbW9zdCBsaWJyYXJpZXMgYXJlIGRlZmluZWQgb24gc2V2ZXJhbCBsaW5lcywgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgcGFyc2UKLSAgICAgICAgICAgIC8vIGFsbCB0aGUgbGlicmFyeSBsaW5lcyBhbmQgb25seSBhZGQgdGhlIGxpYnJhcnkgYXQgdGhlIGVuZAotICAgICAgICAgICAgbG9uZyBzdGFydEFkZHIgPSAwOwotICAgICAgICAgICAgbG9uZyBlbmRBZGRyID0gMDsKLSAgICAgICAgICAgIFN0cmluZyBsaWJyYXJ5ID0gbnVsbDsKLQotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPCAxNikgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb25nIHRtcFN0YXJ0ID0gTG9uZy5wYXJzZUxvbmcobGluZS5zdWJzdHJpbmcoMCwgOCksIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB0bXBFbmQgPSBMb25nLnBhcnNlTG9uZyhsaW5lLnN1YnN0cmluZyg5LCAxNyksIDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAqIG9ubHkgY2hlY2sgZm9yIGxpYnJhcnkgYWRkcmVzc2VzIGFzIGRlZmluZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAqIC8vZGV2aWNlL2NvbmZpZy9wcmVsaW5rLWxpbnV4LWFybS5tYXAKLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wU3RhcnQgPj0gMHgwMDAwMDAwMDgwMDAwMDAwTCAmJiB0bXBTdGFydCA8PSAweDAwMDAwMDAwQkZGRkZGRkZMKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZignLycpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBMaWIgPSBsaW5lLnN1YnN0cmluZyhpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpYnJhcnkgIT0gbnVsbCAmJiB0bXBMaWIuZXF1YWxzKGxpYnJhcnkpID09IGZhbHNlKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZC5hZGROYXRpdmVMaWJyYXJ5TWFwSW5mbyhzdGFydEFkZHIsIGVuZEFkZHIsIGxpYnJhcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsIGxpYnJhcnkgKyAiKCIgKyBMb25nLnRvSGV4U3RyaW5nKHN0YXJ0QWRkcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLSAiICsgTG9uZy50b0hleFN0cmluZyhlbmRBZGRyKSArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGluaXQgdGhlIG5ldyBsaWJyYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSA9IHRtcExpYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFkZHIgPSB0bXBTdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRBZGRyID0gdG1wRW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG5ldyBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRBZGRyID0gdG1wRW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjZC5hZGROYXRpdmVMaWJyYXJ5TWFwSW5mbyhzdGFydEFkZHIsIGVuZEFkZHIsIGxpYnJhcnkpOwotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgbGlicmFyeSArICIoIiArIExvbmcudG9IZXhTdHJpbmcoc3RhcnRBZGRyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIC0gIiArIExvbmcudG9IZXhTdHJpbmcoZW5kQWRkcikgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY5OTczLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YS5JTWV0aG9kUHJvZmlsaW5nSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YS5NZXRob2RQcm9maWxpbmdTdGF0dXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogSGFuZGxlIGhlYXAgc3RhdHVzIHVwZGF0ZXMuCi0gKi8KLWZpbmFsIGNsYXNzIEhhbmRsZVByb2ZpbGluZyBleHRlbmRzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19NUFJTID0gdHlwZSgiTVBSUyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX01QUkUgPSB0eXBlKCJNUFJFIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfTVBSUSA9IHR5cGUoIk1QUlEiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19GQUlMID0gdHlwZSgiRkFJTCIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFuZGxlUHJvZmlsaW5nIG1JbnN0ID0gbmV3IEhhbmRsZVByb2ZpbGluZygpOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVQcm9maWxpbmcoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgZm9yIHRoZSBwYWNrZXRzIHdlIGV4cGVjdCB0byBnZXQgZnJvbSB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihNb25pdG9yVGhyZWFkIG10KSB7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX01QUkUsIG1JbnN0KTsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfTVBSUSwgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsaWVudCBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRSZWFkeShDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24ge30KLQotICAgIC8qKgotICAgICAqIENsaWVudCB3ZW50IGF3YXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50RGlzY29ubmVjdGVkKENsaWVudCBjbGllbnQpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDaHVuayBoYW5kbGVyIGVudHJ5IHBvaW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNodW5rKENsaWVudCBjbGllbnQsIGludCB0eXBlLCBCeXRlQnVmZmVyIGRhdGEsCi0gICAgICAgIGJvb2xlYW4gaXNSZXBseSwgaW50IG1zZ0lkKSB7Ci0KLSAgICAgICAgTG9nLmQoImRkbS1wcm9mIiwgImhhbmRsaW5nICIgKyBDaHVua0hhbmRsZXIubmFtZSh0eXBlKSk7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gQ0hVTktfTVBSRSkgewotICAgICAgICAgICAgaGFuZGxlTVBSRShjbGllbnQsIGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ0hVTktfTVBSUSkgewotICAgICAgICAgICAgaGFuZGxlTVBSUShjbGllbnQsIGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ0hVTktfRkFJTCkgewotICAgICAgICAgICAgaGFuZGxlRkFJTChjbGllbnQsIGRhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlVW5rbm93bkNodW5rKGNsaWVudCwgdHlwZSwgZGF0YSwgaXNSZXBseSwgbXNnSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBhIE1QUlMgKE1ldGhvZCBQUm9maWxpbmcgU3RhcnQpIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKgotICAgICAqIFRoZSBhcmd1bWVudHMgdG8gdGhpcyBtZXRob2Qgd2lsbCBldmVudHVhbGx5IGJlIHBhc3NlZCB0bwotICAgICAqIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCkgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3aGljaCBwcm9maWxpbmcgZGF0YQotICAgICAqICAgICAgICAgIHdpbGwgYmUgd3JpdHRlbiAob24gdGhlIGRldmljZSk7IGl0IHdpbGwgaGF2ZSAiLnRyYWNlIgotICAgICAqICAgICAgICAgIGFwcGVuZGVkIGlmIG5lY2Vzc2FyeQotICAgICAqIEBwYXJhbSBidWZmZXJTaXplIGlzIHRoZSBkZXNpcmVkIGJ1ZmZlciBzaXplIGluIGJ5dGVzICg4TUIgaXMgZ29vZCkKLSAgICAgKiBAcGFyYW0gZmxhZ3Mgc2VlIHN0YXJ0TWV0aG9kVHJhY2luZygpIGRvY3M7IHVzZSAwIGZvciBkZWZhdWx0IGJlaGF2aW9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRNUFJTKENsaWVudCBjbGllbnQsIFN0cmluZyBmaWxlTmFtZSwgaW50IGJ1ZmZlclNpemUsCi0gICAgICAgIGludCBmbGFncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDMqNCArIGZpbGVOYW1lLmxlbmd0aCgpICogMik7Ci0gICAgICAgIEpkd3BQYWNrZXQgcGFja2V0ID0gbmV3IEpkd3BQYWNrZXQocmF3QnVmKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICBidWYucHV0SW50KGJ1ZmZlclNpemUpOwotICAgICAgICBidWYucHV0SW50KGZsYWdzKTsKLSAgICAgICAgYnVmLnB1dEludChmaWxlTmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIHB1dFN0cmluZyhidWYsIGZpbGVOYW1lKTsKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX01QUlMsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1wcm9mIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfTVBSUykgKyAiICciICsgZmlsZU5hbWUKLSAgICAgICAgICAgICsgIicsIHNpemU9IiArIGJ1ZmZlclNpemUgKyAiLCBmbGFncz0iICsgZmxhZ3MpOwotICAgICAgICBjbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0LCBtSW5zdCk7Ci0KLSAgICAgICAgLy8gcmVjb3JkIHRoZSBmaWxlbmFtZSB3ZSBhc2tlZCBmb3IuCi0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0UGVuZGluZ01ldGhvZFByb2ZpbGluZyhmaWxlTmFtZSk7Ci0KLSAgICAgICAgLy8gc2VuZCBhIHN0YXR1cyBxdWVyeS4gdGhpcyBlbnN1cmUgdGhhdCB0aGUgc3RhdHVzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaWYgZm9yIHNvbWUKLSAgICAgICAgLy8gcmVhc29uIHN0YXJ0aW5nIHRoZSB0cmFjaW5nIGZhaWxlZC4KLSAgICAgICAgc2VuZE1QUlEoY2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgTVBSRSAoTWV0aG9kIFBSb2ZpbGluZyBFbmQpIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZE1QUkUoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciByYXdCdWYgPSBhbGxvY0J1ZmZlcigwKTsKLSAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBuZXcgSmR3cFBhY2tldChyYXdCdWYpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGdldENodW5rRGF0YUJ1ZihyYXdCdWYpOwotCi0gICAgICAgIC8vIG5vIGRhdGEKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX01QUkUsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS1wcm9mIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfTVBSRSkpOwotICAgICAgICBjbGllbnQuc2VuZEFuZENvbnN1bWUocGFja2V0LCBtSW5zdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIG5vdGlmaWNhdGlvbiB0aGF0IG1ldGhvZCBwcm9maWxpbmcgaGFzIGZpbmlzaGVkIHdyaXRpbmcKLSAgICAgKiBkYXRhIHRvIGRpc2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1QUkUoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGJ5dGUgcmVzdWx0OwotCi0gICAgICAgIC8vIGdldCB0aGUgZmlsZW5hbWUgYW5kIG1ha2UgdGhlIGNsaWVudCBub3QgaGF2ZSBwZW5kaW5nIEhQUk9GIGR1bXAgYW55bW9yZS4KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRQZW5kaW5nTWV0aG9kUHJvZmlsaW5nKCk7Ci0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0UGVuZGluZ01ldGhvZFByb2ZpbGluZyhudWxsKTsKLQotICAgICAgICByZXN1bHQgPSBkYXRhLmdldCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgYXBwLWxldmVsIGhhbmRsZXIgZm9yIG1ldGhvZCB0cmFjaW5nIGR1bXAKLSAgICAgICAgSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIgaGFuZGxlciA9IENsaWVudERhdGEuZ2V0TWV0aG9kUHJvZmlsaW5nSGFuZGxlcigpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uU3VjY2VzcyhmaWxlbmFtZSwgY2xpZW50KTsKLQotICAgICAgICAgICAgICAgIExvZy5kKCJkZG0tcHJvZiIsICJNZXRob2QgcHJvZmlsaW5nIGhhcyBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uRmFpbHVyZShjbGllbnQpOwotCi0gICAgICAgICAgICAgICAgTG9nLncoImRkbS1wcm9mIiwgIk1ldGhvZCBwcm9maWxpbmcgaGFzIGZhaWxlZCAoY2hlY2sgZGV2aWNlIGxvZykiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuc2V0TWV0aG9kUHJvZmlsaW5nU3RhdHVzKE1ldGhvZFByb2ZpbGluZ1N0YXR1cy5PRkYpOwotICAgICAgICBjbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfTUVUSE9EX1BST0ZJTElOR19TVEFUVVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgYSBNUFJRIChNZXRob2QgUFJvZmlsaW5nIFF1ZXJ5KSByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRNUFJRKENsaWVudCBjbGllbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgcmF3QnVmID0gYWxsb2NCdWZmZXIoMCk7Ci0gICAgICAgIEpkd3BQYWNrZXQgcGFja2V0ID0gbmV3IEpkd3BQYWNrZXQocmF3QnVmKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICAvLyBubyBkYXRhCi0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19NUFJRLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0tcHJvZiIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX01QUlEpKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgcmVzcG9uc2UgdG8gcXVlcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1QUlEoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGJ5dGUgcmVzdWx0OwotCi0gICAgICAgIHJlc3VsdCA9IGRhdGEuZ2V0KCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLnNldE1ldGhvZFByb2ZpbGluZ1N0YXR1cyhNZXRob2RQcm9maWxpbmdTdGF0dXMuT0ZGKTsKLSAgICAgICAgICAgIExvZy5kKCJkZG0tcHJvZiIsICJNZXRob2QgcHJvZmlsaW5nIGlzIG5vdCBydW5uaW5nIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLnNldE1ldGhvZFByb2ZpbGluZ1N0YXR1cyhNZXRob2RQcm9maWxpbmdTdGF0dXMuT04pOwotICAgICAgICAgICAgTG9nLmQoImRkbS1wcm9mIiwgIk1ldGhvZCBwcm9maWxpbmcgaXMgcnVubmluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGNsaWVudC51cGRhdGUoQ2xpZW50LkNIQU5HRV9NRVRIT0RfUFJPRklMSU5HX1NUQVRVUyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZBSUwoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIC8vIHRoaXMgY2FuIGJlIHNlbnQgaWYgTVBSUyBmYWlsZWQgKGxpa2Ugd3JvbmcgcGVybWlzc2lvbikKLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldFBlbmRpbmdNZXRob2RQcm9maWxpbmcoKTsKLSAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwZW5kaW5nIGZpbGUuCi0gICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLnNldFBlbmRpbmdNZXRob2RQcm9maWxpbmcobnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBub3RpZnkgb2YgZmFpbHVyZQotICAgICAgICAgICAgSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIgaGFuZGxlciA9IENsaWVudERhdGEuZ2V0TWV0aG9kUHJvZmlsaW5nSGFuZGxlcigpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25GYWlsdXJlKGNsaWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlbmQgYSBxdWVyeSB0byBrbm93IHRoZSBjdXJyZW50IHN0YXR1cwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZE1QUlEoY2xpZW50KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoIkhhbmRsZVByb2ZpbGluZyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlVGVzdC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmM2E3NC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBIYW5kbGUgdGhyZWFkIHN0YXR1cyB1cGRhdGVzLgotICovCi1maW5hbCBjbGFzcyBIYW5kbGVUZXN0IGV4dGVuZHMgQ2h1bmtIYW5kbGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1RFU1QgPSB0eXBlKCJURVNUIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYW5kbGVUZXN0IG1JbnN0ID0gbmV3IEhhbmRsZVRlc3QoKTsKLQotCi0gICAgcHJpdmF0ZSBIYW5kbGVUZXN0KCkge30KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGZvciB0aGUgcGFja2V0cyB3ZSBleHBlY3QgdG8gZ2V0IGZyb20gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoTW9uaXRvclRocmVhZCBtdCkgewotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19URVNULCBtSW5zdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IGlzIHJlYWR5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsaWVudFJlYWR5KENsaWVudCBjbGllbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IHdlbnQgYXdheS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnREaXNjb25uZWN0ZWQoQ2xpZW50IGNsaWVudCkge30KLQotICAgIC8qKgotICAgICAqIENodW5rIGhhbmRsZXIgZW50cnkgcG9pbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlQ2h1bmsoQ2xpZW50IGNsaWVudCwgaW50IHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSwgYm9vbGVhbiBpc1JlcGx5LCBpbnQgbXNnSWQpIHsKLQotICAgICAgICBMb2cuZCgiZGRtLXRlc3QiLCAiaGFuZGxpbmcgIiArIENodW5rSGFuZGxlci5uYW1lKHR5cGUpKTsKLQotICAgICAgICBpZiAodHlwZSA9PSBDSFVOS19URVNUKSB7Ci0gICAgICAgICAgICBoYW5kbGVURVNUKGNsaWVudCwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVVbmtub3duQ2h1bmsoY2xpZW50LCB0eXBlLCBkYXRhLCBpc1JlcGx5LCBtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZSBhIHRocmVhZCBjcmVhdGlvbiBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVURVNUKENsaWVudCBjbGllbnQsIEJ5dGVCdWZmZXIgZGF0YSkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENhbid0IGNhbGwgZGF0YS5hcnJheSgpIG9uIGEgcmVhZC1vbmx5IEJ5dGVCdWZmZXIsIHNvIHdlIG1ha2UKLSAgICAgICAgICogYSBjb3B5LgotICAgICAgICAgKi8KLSAgICAgICAgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtkYXRhLmxpbWl0KCldOwotICAgICAgICBkYXRhLmdldChjb3B5KTsKLQotICAgICAgICBMb2cuZCgiZGRtLXRlc3QiLCAiUmVjZWl2ZWQ6Iik7Ci0gICAgICAgIExvZy5oZXhEdW1wKCJkZG0tdGVzdCIsIExvZ0xldmVsLkRFQlVHLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlVGhyZWFkLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzBjOTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBIYW5kbGUgdGhyZWFkIHN0YXR1cyB1cGRhdGVzLgotICovCi1maW5hbCBjbGFzcyBIYW5kbGVUaHJlYWQgZXh0ZW5kcyBDaHVua0hhbmRsZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfVEhFTiA9IHR5cGUoIlRIRU4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19USENSID0gdHlwZSgiVEhDUiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1RIREUgPSB0eXBlKCJUSERFIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfVEhTVCA9IHR5cGUoIlRIU1QiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19USE5NID0gdHlwZSgiVEhOTSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1NUS0wgPSB0eXBlKCJTVEtMIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYW5kbGVUaHJlYWQgbUluc3QgPSBuZXcgSGFuZGxlVGhyZWFkKCk7Ci0KLSAgICAvLyBvbmx5IHJlYWQvd3JpdHRlbiBieSByZXF1ZXN0VGhyZWFkVXBkYXRlcygpCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBtVGhyZWFkU3RhdHVzUmVxUnVubmluZyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gbVRocmVhZFN0YWNrVHJhY2VSZXFSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIEhhbmRsZVRocmVhZCgpIHt9Ci0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGZvciB0aGUgcGFja2V0cyB3ZSBleHBlY3QgdG8gZ2V0IGZyb20gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoTW9uaXRvclRocmVhZCBtdCkgewotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19USENSLCBtSW5zdCk7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX1RIREUsIG1JbnN0KTsKLSAgICAgICAgbXQucmVnaXN0ZXJDaHVua0hhbmRsZXIoQ0hVTktfVEhTVCwgbUluc3QpOwotICAgICAgICBtdC5yZWdpc3RlckNodW5rSGFuZGxlcihDSFVOS19USE5NLCBtSW5zdCk7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX1NUS0wsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgaXMgcmVhZHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50UmVhZHkoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmQoImRkbS10aHJlYWQiLCAiTm93IHJlYWR5OiAiICsgY2xpZW50KTsKLSAgICAgICAgaWYgKGNsaWVudC5pc1RocmVhZFVwZGF0ZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHNlbmRUSEVOKGNsaWVudCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IHdlbnQgYXdheS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnREaXNjb25uZWN0ZWQoQ2xpZW50IGNsaWVudCkge30KLQotICAgIC8qKgotICAgICAqIENodW5rIGhhbmRsZXIgZW50cnkgcG9pbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlQ2h1bmsoQ2xpZW50IGNsaWVudCwgaW50IHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSwgYm9vbGVhbiBpc1JlcGx5LCBpbnQgbXNnSWQpIHsKLQotICAgICAgICBMb2cuZCgiZGRtLXRocmVhZCIsICJoYW5kbGluZyAiICsgQ2h1bmtIYW5kbGVyLm5hbWUodHlwZSkpOwotCi0gICAgICAgIGlmICh0eXBlID09IENIVU5LX1RIQ1IpIHsKLSAgICAgICAgICAgIGhhbmRsZVRIQ1IoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1RIREUpIHsKLSAgICAgICAgICAgIGhhbmRsZVRIREUoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1RIU1QpIHsKLSAgICAgICAgICAgIGhhbmRsZVRIU1QoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1RITk0pIHsKLSAgICAgICAgICAgIGhhbmRsZVRITk0oY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENIVU5LX1NUS0wpIHsKLSAgICAgICAgICAgIGhhbmRsZVNUS0woY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVVua25vd25DaHVuayhjbGllbnQsIHR5cGUsIGRhdGEsIGlzUmVwbHksIG1zZ0lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIGEgdGhyZWFkIGNyZWF0aW9uIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBXZSBzaG91bGQgYmUgdG9sZXJhbnQgb2YgcmVjZWl2aW5nIGEgZHVwbGljYXRlIGNyZWF0ZSBtZXNzYWdlLiAgKEl0Ci0gICAgICogc2hvdWxkbid0IGhhcHBlbiB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLikKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVEhDUihDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgaW50IHRocmVhZElkLCBuYW1lTGVuOwotICAgICAgICBTdHJpbmcgbmFtZTsKLQotICAgICAgICB0aHJlYWRJZCA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIG5hbWVMZW4gPSBkYXRhLmdldEludCgpOwotICAgICAgICBuYW1lID0gZ2V0U3RyaW5nKGRhdGEsIG5hbWVMZW4pOwotCi0gICAgICAgIExvZy52KCJkZG0tdGhyZWFkIiwgIlRIQ1I6ICIgKyB0aHJlYWRJZCArICIgJyIgKyBuYW1lICsgIiciKTsKLQotICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmFkZFRocmVhZCh0aHJlYWRJZCwgbmFtZSk7Ci0gICAgICAgIGNsaWVudC51cGRhdGUoQ2xpZW50LkNIQU5HRV9USFJFQURfREFUQSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgYSB0aHJlYWQgZGVhdGggbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVEhERShDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgaW50IHRocmVhZElkOwotCi0gICAgICAgIHRocmVhZElkID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgTG9nLnYoImRkbS10aHJlYWQiLCAiVEhERTogIiArIHRocmVhZElkKTsKLQotICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLnJlbW92ZVRocmVhZCh0aHJlYWRJZCk7Ci0gICAgICAgIGNsaWVudC51cGRhdGUoQ2xpZW50LkNIQU5HRV9USFJFQURfREFUQSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgYSB0aHJlYWQgc3RhdHVzIHVwZGF0ZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogUmVzcG9uc2UgaGFzOgotICAgICAqICAoMWIpIGhlYWRlciBsZW4KLSAgICAgKiAgKDFiKSBieXRlcyBwZXIgZW50cnkKLSAgICAgKiAgKDJiKSB0aHJlYWQgY291bnQKLSAgICAgKiBUaGVuLCBmb3IgZWFjaCB0aHJlYWQ6Ci0gICAgICogICg0YikgdGhyZWFkSWQgKG1hdGNoZXMgdmFsdWUgZnJvbSBUSENSKQotICAgICAqICAoMWIpIHRocmVhZCBzdGF0dXMKLSAgICAgKiAgKDRiKSB0aWQKLSAgICAgKiAgKDRiKSB1dGltZQotICAgICAqICAoNGIpIHN0aW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRIU1QoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGludCBoZWFkZXJMZW4sIGJ5dGVzUGVyRW50cnksIGV4dHJhUGVyRW50cnk7Ci0gICAgICAgIGludCB0aHJlYWRDb3VudDsKLQotICAgICAgICBoZWFkZXJMZW4gPSAoZGF0YS5nZXQoKSAmIDB4ZmYpOwotICAgICAgICBieXRlc1BlckVudHJ5ID0gKGRhdGEuZ2V0KCkgJiAweGZmKTsKLSAgICAgICAgdGhyZWFkQ291bnQgPSBkYXRhLmdldFNob3J0KCk7Ci0KLSAgICAgICAgaGVhZGVyTGVuIC09IDQ7ICAgICAvLyB3ZSd2ZSByZWFkIDQgYnl0ZXMKLSAgICAgICAgd2hpbGUgKGhlYWRlckxlbi0tID4gMCkKLSAgICAgICAgICAgIGRhdGEuZ2V0KCk7Ci0KLSAgICAgICAgZXh0cmFQZXJFbnRyeSA9IGJ5dGVzUGVyRW50cnkgLSAxODsgICAgIC8vIHdlIHdhbnQgMTggYnl0ZXMKLQotICAgICAgICBMb2cudigiZGRtLXRocmVhZCIsICJUSFNUOiB0aHJlYWRDb3VudD0iICsgdGhyZWFkQ291bnQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBlYWNoIHRocmVhZCwgZXh0cmFjdCB0aGUgZGF0YSwgZmluZCB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICogY2xpZW50LCBhbmQgYWRkIGl0IHRvIHRoZSBDbGllbnREYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhyZWFkSWQsIHN0YXR1cywgdGlkLCB1dGltZSwgc3RpbWU7Ci0gICAgICAgICAgICBib29sZWFuIGlzRGFlbW9uID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHRocmVhZElkID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEuZ2V0KCk7Ci0gICAgICAgICAgICB0aWQgPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgdXRpbWUgPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgc3RpbWUgPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgaWYgKGJ5dGVzUGVyRW50cnkgPj0gMTgpCi0gICAgICAgICAgICAgICAgaXNEYWVtb24gPSAoZGF0YS5nZXQoKSAhPSAwKTsKLQotICAgICAgICAgICAgTG9nLnYoImRkbS10aHJlYWQiLCAiICBpZD0iICsgdGhyZWFkSWQKLSAgICAgICAgICAgICAgICArICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgdGlkPSIgKyB0aWQKLSAgICAgICAgICAgICAgICArICIsIHV0aW1lPSIgKyB1dGltZSArICIsIHN0aW1lPSIgKyBzdGltZSk7Ci0KLSAgICAgICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotICAgICAgICAgICAgVGhyZWFkSW5mbyB0aHJlYWRJbmZvID0gY2QuZ2V0VGhyZWFkKHRocmVhZElkKTsKLSAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyZWFkSW5mby51cGRhdGVUaHJlYWQoc3RhdHVzLCB0aWQsIHV0aW1lLCBzdGltZSwgaXNEYWVtb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIlRocmVhZCB3aXRoIGlkPSIgKyB0aHJlYWRJZCArICIgbm90IGZvdW5kIik7Ci0KLSAgICAgICAgICAgIC8vIHNsdXJwIHVwIGFueSBleHRyYQotICAgICAgICAgICAgZm9yIChpbnQgc2x1cnAgPSBleHRyYVBlckVudHJ5OyBzbHVycCA+IDA7IHNsdXJwLS0pCi0gICAgICAgICAgICAgICAgZGF0YS5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51cGRhdGUoQ2xpZW50LkNIQU5HRV9USFJFQURfREFUQSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgYSBUSE5NIChUSHJlYWQgTmFNZSkgbWVzc2FnZS4gIFdlIGdldCBvbmUgb2YgdGhlc2UgYWZ0ZXIKLSAgICAgKiBzb21lYm9keSBjYWxscyBUaHJlYWQuc2V0TmFtZSgpIG9uIGEgcnVubmluZyB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRITk0oQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGludCB0aHJlYWRJZCwgbmFtZUxlbjsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgdGhyZWFkSWQgPSBkYXRhLmdldEludCgpOwotICAgICAgICBuYW1lTGVuID0gZGF0YS5nZXRJbnQoKTsKLSAgICAgICAgbmFtZSA9IGdldFN0cmluZyhkYXRhLCBuYW1lTGVuKTsKLQotICAgICAgICBMb2cudigiZGRtLXRocmVhZCIsICJUSE5NOiAiICsgdGhyZWFkSWQgKyAiICciICsgbmFtZSArICInIik7Ci0KLSAgICAgICAgVGhyZWFkSW5mbyB0aHJlYWRJbmZvID0gY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRUaHJlYWQodGhyZWFkSWQpOwotICAgICAgICBpZiAodGhyZWFkSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJlYWRJbmZvLnNldFRocmVhZE5hbWUobmFtZSk7Ci0gICAgICAgICAgICBjbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfVEhSRUFEX0RBVEEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiVGhyZWFkIHdpdGggaWQ9IiArIHRocmVhZElkICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW4gaW5jb21pbmcgU1RLTC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU1RLTChDbGllbnQgY2xpZW50LCBCeXRlQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZTsKLSAgICAgICAgaW50IGksIHRocmVhZElkLCBzdGFja0RlcHRoOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgaW50IGZ1dHVyZTsKLQotICAgICAgICBmdXR1cmUgPSBkYXRhLmdldEludCgpOwotICAgICAgICB0aHJlYWRJZCA9IGRhdGEuZ2V0SW50KCk7Ci0KLSAgICAgICAgTG9nLnYoImRkbXMiLCAiU1RLTDogIiArIHRocmVhZElkKTsKLQotICAgICAgICAvKiB1bi1zZXJpYWxpemUgdGhlIFN0YWNrVHJhY2VFbGVtZW50W10gKi8KLSAgICAgICAgc3RhY2tEZXB0aCA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgIHRyYWNlID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50W3N0YWNrRGVwdGhdOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2tEZXB0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLCBtZXRob2ROYW1lLCBmaWxlTmFtZTsKLSAgICAgICAgICAgIGludCBsZW4sIGxpbmVOdW1iZXI7Ci0KLSAgICAgICAgICAgIGxlbiA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBnZXRTdHJpbmcoZGF0YSwgbGVuKTsKLSAgICAgICAgICAgIGxlbiA9IGRhdGEuZ2V0SW50KCk7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gZ2V0U3RyaW5nKGRhdGEsIGxlbik7Ci0gICAgICAgICAgICBsZW4gPSBkYXRhLmdldEludCgpOwotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGdldFN0cmluZyhkYXRhLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGluZU51bWJlciA9IGRhdGEuZ2V0SW50KCk7Ci0KLSAgICAgICAgICAgIHRyYWNlW2ldID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50KGNsYXNzTmFtZSwgbWV0aG9kTmFtZSwgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRocmVhZEluZm8gdGhyZWFkSW5mbyA9IGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0VGhyZWFkKHRocmVhZElkKTsKLSAgICAgICAgaWYgKHRocmVhZEluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyZWFkSW5mby5zZXRTdGFja0NhbGwodHJhY2UpOwotICAgICAgICAgICAgY2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX1RIUkVBRF9TVEFDS1RSQUNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKCJTVEtMIiwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkdvdCBzdGFja2NhbGwgZm9yIHRocmVhZCAlMSRkLCB3aGljaCBkb2VzIG5vdCBleGlzdHMgKGFueW1vcmU/KS4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHRocmVhZElkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNlbmQgYSBUSEVOIChUSHJlYWQgbm90aWZpY2F0aW9uIEVOYWJsZSkgcmVxdWVzdCB0byB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kVEhFTihDbGllbnQgY2xpZW50LCBib29sZWFuIGVuYWJsZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDEpOwotICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IG5ldyBKZHdwUGFja2V0KHJhd0J1Zik7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gZ2V0Q2h1bmtEYXRhQnVmKHJhd0J1Zik7Ci0KLSAgICAgICAgaWYgKGVuYWJsZSkKLSAgICAgICAgICAgIGJ1Zi5wdXQoKGJ5dGUpMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ1Zi5wdXQoKGJ5dGUpMCk7Ci0KLSAgICAgICAgZmluaXNoQ2h1bmtQYWNrZXQocGFja2V0LCBDSFVOS19USEVOLCBidWYucG9zaXRpb24oKSk7Ci0gICAgICAgIExvZy5kKCJkZG0tdGhyZWFkIiwgIlNlbmRpbmcgIiArIG5hbWUoQ0hVTktfVEhFTikgKyAiOiAiICsgZW5hYmxlKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VuZCBhIFNUS0wgKFNUYWNLIExpc3QpIHJlcXVlc3QgdG8gdGhlIGNsaWVudC4gIFRoZSBWTSB3aWxsIHN1c3BlbmQKLSAgICAgKiB0aGUgdGFyZ2V0IHRocmVhZCwgb2J0YWluIGl0cyBzdGFjaywgYW5kIHJldHVybiBpdC4gIElmIHRoZSB0aHJlYWQKLSAgICAgKiBpcyBubyBsb25nZXIgcnVubmluZywgYSBmYWlsdXJlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kU1RLTChDbGllbnQgY2xpZW50LCBpbnQgdGhyZWFkSWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZCgiZGRtLXRocmVhZCIsICJ3b3VsZCBzZW5kIFNUS0wgIiArIHRocmVhZElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ5dGVCdWZmZXIgcmF3QnVmID0gYWxsb2NCdWZmZXIoNCk7Ci0gICAgICAgIEpkd3BQYWNrZXQgcGFja2V0ID0gbmV3IEpkd3BQYWNrZXQocmF3QnVmKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBnZXRDaHVua0RhdGFCdWYocmF3QnVmKTsKLQotICAgICAgICBidWYucHV0SW50KHRocmVhZElkKTsKLQotICAgICAgICBmaW5pc2hDaHVua1BhY2tldChwYWNrZXQsIENIVU5LX1NUS0wsIGJ1Zi5wb3NpdGlvbigpKTsKLSAgICAgICAgTG9nLmQoImRkbS10aHJlYWQiLCAiU2VuZGluZyAiICsgbmFtZShDSFVOS19TVEtMKSArICI6ICIgKyB0aHJlYWRJZCk7Ci0gICAgICAgIGNsaWVudC5zZW5kQW5kQ29uc3VtZShwYWNrZXQsIG1JbnN0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIHBlcmlvZGljYWxseSBmcm9tIHRoZSBVSSB0aHJlYWQuICBUbyBhdm9pZCBsb2NraW5nCi0gICAgICogdGhlIFVJIHdoaWxlIHdlIHJlcXVlc3QgdGhlIHVwZGF0ZXMsIHdlIGNyZWF0ZSBhIG5ldyB0aHJlYWQuCi0gICAgICoKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCByZXF1ZXN0VGhyZWFkVXBkYXRlKGZpbmFsIENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgaWYgKGNsaWVudC5pc0RkbUF3YXJlKCkgJiYgY2xpZW50LmlzVGhyZWFkVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBpZiAobVRocmVhZFN0YXR1c1JlcVJ1bm5pbmcpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJXYWl0aW5nIGZvciBwcmV2aW91cyB0aHJlYWQgdXBkYXRlIHJlcSB0byBmaW5pc2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ldyBUaHJlYWQoIlRocmVhZCBTdGF0dXMgUmVxIikgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocmVhZFN0YXR1c1JlcVJ1bm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFRIU1QoY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJVbmFibGUgdG8gcmVxdWVzdCB0aHJlYWQgdXBkYXRlcyBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGllbnQgKyAiOiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkU3RhdHVzUmVxUnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgcmVxdWVzdFRocmVhZFN0YWNrQ2FsbFJlZnJlc2goZmluYWwgQ2xpZW50IGNsaWVudCwgZmluYWwgaW50IHRocmVhZElkKSB7Ci0gICAgICAgIGlmIChjbGllbnQuaXNEZG1Bd2FyZSgpICYmIGNsaWVudC5pc1RocmVhZFVwZGF0ZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgaWYgKG1UaHJlYWRTdGFja1RyYWNlUmVxUnVubmluZyApIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJXYWl0aW5nIGZvciBwcmV2aW91cyB0aHJlYWQgc3RhY2sgY2FsbCByZXEgdG8gZmluaXNoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZXcgVGhyZWFkKCJUaHJlYWQgU3RhdHVzIFJlcSIpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJlYWRTdGFja1RyYWNlUmVxUnVubmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kU1RLTChjbGllbnQsIHRocmVhZElkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJVbmFibGUgdG8gcmVxdWVzdCB0aHJlYWQgc3RhY2sgY2FsbCB1cGRhdGVzIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsaWVudCArICI6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRTdGFja1RyYWNlUmVxUnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNlbmQgYSBUSFNUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBjbGllbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kVEhTVChDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQnVmZmVyIHJhd0J1ZiA9IGFsbG9jQnVmZmVyKDApOwotICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IG5ldyBKZHdwUGFja2V0KHJhd0J1Zik7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gZ2V0Q2h1bmtEYXRhQnVmKHJhd0J1Zik7Ci0KLSAgICAgICAgLy8gbm90aGluZyBtdWNoIHRvIHNheQotCi0gICAgICAgIGZpbmlzaENodW5rUGFja2V0KHBhY2tldCwgQ0hVTktfVEhTVCwgYnVmLnBvc2l0aW9uKCkpOwotICAgICAgICBMb2cuZCgiZGRtLXRocmVhZCIsICJTZW5kaW5nICIgKyBuYW1lKENIVU5LX1RIU1QpKTsKLSAgICAgICAgY2xpZW50LnNlbmRBbmRDb25zdW1lKHBhY2tldCwgbUluc3QpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVdhaXQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVXYWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGNiZWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVdhaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkRlYnVnZ2VyU3RhdHVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCi0vKioKLSAqIEhhbmRsZSB0aGUgIndhaXQiIGNodW5rIChXQUlUKS4gIFRoZXNlIGFyZSBzZW50IHVwIHdoZW4gdGhlIGNsaWVudCBpcwotICogd2FpdGluZyBmb3Igc29tZXRoaW5nLCBlLmcuIGZvciBhIGRlYnVnZ2VyIHRvIGF0dGFjaC4KLSAqLwotZmluYWwgY2xhc3MgSGFuZGxlV2FpdCBleHRlbmRzIENodW5rSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19XQUlUID0gQ2h1bmtIYW5kbGVyLnR5cGUoIldBSVQiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhbmRsZVdhaXQgbUluc3QgPSBuZXcgSGFuZGxlV2FpdCgpOwotCi0KLSAgICBwcml2YXRlIEhhbmRsZVdhaXQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgZm9yIHRoZSBwYWNrZXRzIHdlIGV4cGVjdCB0byBnZXQgZnJvbSB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihNb25pdG9yVGhyZWFkIG10KSB7Ci0gICAgICAgIG10LnJlZ2lzdGVyQ2h1bmtIYW5kbGVyKENIVU5LX1dBSVQsIG1JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgaXMgcmVhZHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50UmVhZHkoQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgd2VudCBhd2F5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsaWVudERpc2Nvbm5lY3RlZChDbGllbnQgY2xpZW50KSB7fQotCi0gICAgLyoqCi0gICAgICogQ2h1bmsgaGFuZGxlciBlbnRyeSBwb2ludC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVDaHVuayhDbGllbnQgY2xpZW50LCBpbnQgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhLCBib29sZWFuIGlzUmVwbHksIGludCBtc2dJZCkgewotCi0gICAgICAgIExvZy5kKCJkZG0td2FpdCIsICJoYW5kbGluZyAiICsgQ2h1bmtIYW5kbGVyLm5hbWUodHlwZSkpOwotCi0gICAgICAgIGlmICh0eXBlID09IENIVU5LX1dBSVQpIHsKLSAgICAgICAgICAgIGFzc2VydCAhaXNSZXBseTsKLSAgICAgICAgICAgIGhhbmRsZVdBSVQoY2xpZW50LCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVVua25vd25DaHVuayhjbGllbnQsIHR5cGUsIGRhdGEsIGlzUmVwbHksIG1zZ0lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIGEgcmVwbHkgdG8gb3VyIFdBSVQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVdBSVQoQ2xpZW50IGNsaWVudCwgQnl0ZUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGJ5dGUgcmVhc29uOwotCi0gICAgICAgIHJlYXNvbiA9IGRhdGEuZ2V0KCk7Ci0KLSAgICAgICAgTG9nLmQoImRkbS13YWl0IiwgIldBSVQ6IHJlYXNvbj0iICsgcmVhc29uKTsKLQotCi0gICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKGNkKSB7Ci0gICAgICAgICAgICBjZC5zZXREZWJ1Z2dlckNvbm5lY3Rpb25TdGF0dXMoRGVidWdnZXJTdGF0dXMuV0FJVElORyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfREVCVUdHRVJfU1RBVFVTKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IZWFwU2VnbWVudC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hlYXBTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjJlNjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hlYXBTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHR5cGVzIGFuZCBsb2NhdGlvbnMgb2Ygb2JqZWN0cyBpbiBhIHNlZ21lbnQgb2YgYSBoZWFwLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSGVhcFNlZ21lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlPEhlYXBTZWdtZW50PiB7Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgYW4gb2JqZWN0L3JlZ2lvbiBlbmNvZGVkIGluIHRoZSBIUFNHIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFwU2VnbWVudEVsZW1lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlPEhlYXBTZWdtZW50RWxlbWVudD4gewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNvbGlkaXR5IHZhbHVlcywgd2hpY2ggbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluCi0gICAgICAgICAqIHRoZSBIUFNHIGRhdGEuCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qKiBUaGUgZWxlbWVudCBkZXNjcmliZXMgYSBmcmVlIGJsb2NrLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTT0xJRElUWV9GUkVFID0gMDsKLQotICAgICAgICAvKiogVGhlIGVsZW1lbnQgaXMgc3Ryb25nbHktcmVhY2hhYmxlLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTT0xJRElUWV9IQVJEID0gMTsKLQotICAgICAgICAvKiogVGhlIGVsZW1lbnQgaXMgc29mdGx5LXJlYWNoYWJsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgU09MSURJVFlfU09GVCA9IDI7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGlzIHdlYWtseS1yZWFjaGFibGUuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNPTElESVRZX1dFQUsgPSAzOwotCi0gICAgICAgIC8qKiBUaGUgZWxlbWVudCBpcyBwaGFudG9tLXJlYWNoYWJsZS4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgU09MSURJVFlfUEhBTlRPTSA9IDQ7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGlzIHBlbmRpbmcgZmluYWxpemF0aW9uLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTT0xJRElUWV9GSU5BTElaQUJMRSA9IDU7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGlzIG5vdCByZWFjaGFibGUsIGFuZCBpcyBhYm91dCB0byBiZSBzd2VwdC9mcmVlZC4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgU09MSURJVFlfU1dFRVAgPSA2OwotCi0gICAgICAgIC8qKiBUaGUgcmVhY2hhYmlsaXR5IG9mIHRoZSBvYmplY3QgaXMgdW5rbm93bi4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgU09MSURJVFlfSU5WQUxJRCA9IC0xOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogS2luZCB2YWx1ZXMsIHdoaWNoIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbgotICAgICAgICAgKiB0aGUgSFBTRyBkYXRhLgotICAgICAgICAgKi8KLQotICAgICAgICAvKiogVGhlIGVsZW1lbnQgZGVzY3JpYmVzIGEgZGF0YSBvYmplY3QuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEtJTkRfT0JKRUNUID0gMDsKLQotICAgICAgICAvKiogVGhlIGVsZW1lbnQgZGVzY3JpYmVzIGEgY2xhc3Mgb2JqZWN0LiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBLSU5EX0NMQVNTX09CSkVDVCA9IDE7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBhcnJheSBvZiAxLWJ5dGUgZWxlbWVudHMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEtJTkRfQVJSQVlfMSA9IDI7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBhcnJheSBvZiAyLWJ5dGUgZWxlbWVudHMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEtJTkRfQVJSQVlfMiA9IDM7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBhcnJheSBvZiA0LWJ5dGUgZWxlbWVudHMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEtJTkRfQVJSQVlfNCA9IDQ7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBhcnJheSBvZiA4LWJ5dGUgZWxlbWVudHMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEtJTkRfQVJSQVlfOCA9IDU7Ci0KLSAgICAgICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiB1bmtub3duIHR5cGUgb2Ygb2JqZWN0LiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBLSU5EX1VOS05PV04gPSA2OwotCi0gICAgICAgIC8qKiBUaGUgZWxlbWVudCBkZXNjcmliZXMgYSBuYXRpdmUgb2JqZWN0LiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBLSU5EX05BVElWRSA9IDc7Ci0KLSAgICAgICAgLyoqIFRoZSBvYmplY3Qga2luZCBpcyB1bmtub3duIG9yIHVuc3BlY2lmaWVkLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBLSU5EX0lOVkFMSUQgPSAtMTsKLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGJpdCBpbiB0aGUgSFBTRyBkYXRhIHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gZWxlbWVudCBzaG91bGQKLSAgICAgICAgICogYmUgY29tYmluZWQgd2l0aCB0aGUgZWxlbWVudCB0aGF0IGZvbGxvd3MsIHR5cGljYWxseSBiZWNhdXNlCi0gICAgICAgICAqIGFuIGVsZW1lbnQgaXMgdG9vIGxhcmdlIHRvIGJlIGRlc2NyaWJlZCBieSBhIHNpbmdsZSBlbGVtZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBBUlRJQUxfTUFTSyA9IDEgPDwgNzsKLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZXNjcmliZXMgdGhlIHJlYWNoYWJpbGl0eS9zb2xpZGl0eSBvZiB0aGUgZWxlbWVudC4gIE11c3QKLSAgICAgICAgICogYmUgc2V0IHRvIG9uZSBvZiB0aGUgU09MSURJVFlfKiB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGludCBtU29saWRpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlc2NyaWJlcyB0aGUgdHlwZS9raW5kIG9mIHRoZSBlbGVtZW50LiAgTXVzdCBiZSBzZXQgdG8gb25lCi0gICAgICAgICAqIG9mIHRoZSBLSU5EXyogdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgbUtpbmQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlc2NyaWJlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50LCBpbiBieXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgaW50IG1MZW5ndGg7Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGVsZW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGVhcFNlZ21lbnRFbGVtZW50KCkgewotICAgICAgICAgICAgc2V0U29saWRpdHkoU09MSURJVFlfSU5WQUxJRCk7Ci0gICAgICAgICAgICBzZXRLaW5kKEtJTkRfSU5WQUxJRCk7Ci0gICAgICAgICAgICBzZXRMZW5ndGgoLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhlIGVudHJ5IGF0IHRoZSBjdXJyZW50Ci0gICAgICAgICAqIHBvc2l0aW9uIG9mIGhwc2dEYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaHMgVGhlIGhlYXAgc2VnbWVudCB0byBwdWxsIHRoZSBlbnRyeSBmcm9tLgotICAgICAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBub3QgYSB3aG9sZSBlbnRyeQotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgaHBzZ0RhdGEuCi0gICAgICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gICAgICAgICAgIGlmIHRoZSBwcm92aWRlZCBkYXRhIGlzIG1hbGZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBIZWFwU2VnbWVudEVsZW1lbnQoSGVhcFNlZ21lbnQgaHMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgc2V0KGhzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXBsYWNlIHRoZSBlbGVtZW50IHdpdGggdGhlIGVudHJ5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCi0gICAgICAgICAqIGhwc2dEYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaHMgVGhlIGhlYXAgc2VnbWVudCB0byBwdWxsIHRoZSBlbnRyeSBmcm9tLgotICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0LgotICAgICAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBub3QgYSB3aG9sZSBlbnRyeQotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBzZ0RhdGEuCi0gICAgICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gICAgICAgICAgIGlmIHRoZSBwcm92aWRlZCBkYXRhIGlzIG1hbGZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBIZWFwU2VnbWVudEVsZW1lbnQgc2V0KEhlYXBTZWdtZW50IGhzKQotICAgICAgICAgICAgICAgIHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgLyogVE9ETzogTWF5YmUga2VlcCB0cmFjayBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIGVhY2ggZWxlbWVudAotICAgICAgICAgICAgICogICAgICAgc28gdGhhdCB0aGV5IGNhbiBiZSBleGFtaW5lZCBpbmRlcGVuZGVudGx5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBocy5tVXNhZ2VEYXRhOwotICAgICAgICAgICAgaW50IGVTdGF0ZSA9IChpbnQpZGF0YS5nZXQoKSAmIDB4MDAwMDAwZmY7Ci0gICAgICAgICAgICBpbnQgZUxlbiA9ICgoaW50KWRhdGEuZ2V0KCkgJiAweDAwMDAwMGZmKSArIDE7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoZVN0YXRlICYgUEFSVElBTF9NQVNLKSAhPSAwKSB7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcGFydGlhbCBiaXQgd2FzIHNldCwgdGhlIG5leHQgYnl0ZSBzaG91bGQgZGVzY3JpYmUKLSAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBvYmplY3QgYXMgdGhlIGN1cnJlbnQgb25lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGludCBuZXh0U3RhdGUgPSAoaW50KWRhdGEuZ2V0KCkgJiAweDAwMDAwMGZmOwotICAgICAgICAgICAgICAgIGlmICgobmV4dFN0YXRlICYgflBBUlRJQUxfTUFTSykgIT0gKGVTdGF0ZSAmIH5QQVJUSUFMX01BU0spKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiU3RhdGUgbWlzbWF0Y2giLCBkYXRhLnBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlU3RhdGUgPSBuZXh0U3RhdGU7Ci0gICAgICAgICAgICAgICAgZUxlbiArPSAoKGludClkYXRhLmdldCgpICYgMHgwMDAwMDBmZikgKyAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRTb2xpZGl0eShlU3RhdGUgJiAweDcpOwotICAgICAgICAgICAgc2V0S2luZCgoZVN0YXRlID4+IDMpICYgMHg3KTsKLSAgICAgICAgICAgIHNldExlbmd0aChlTGVuICogaHMubUFsbG9jYXRpb25Vbml0U2l6ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTb2xpZGl0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU29saWRpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTb2xpZGl0eShpbnQgc29saWRpdHkpIHsKLSAgICAgICAgICAgIHRoaXMubVNvbGlkaXR5ID0gc29saWRpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUtpbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRLaW5kKGludCBraW5kKSB7Ci0gICAgICAgICAgICB0aGlzLm1LaW5kID0ga2luZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotICAgICAgICAgICAgdGhpcy5tTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oSGVhcFNlZ21lbnRFbGVtZW50IG90aGVyKSB7Ci0gICAgICAgICAgICBpZiAobUxlbmd0aCAhPSBvdGhlci5tTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1MZW5ndGggPCBvdGhlci5tTGVuZ3RoID8gLTEgOiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyogVGhlIElEIG9mIHRoZSBoZWFwIHRoYXQgdGhpcyBzZWdtZW50IGJlbG9uZ3MgdG8uCi0gICAgcHJvdGVjdGVkIGludCBtSGVhcElkOwotCi0gICAgLy8qIFRoZSBzaXplIG9mIGFuIGFsbG9jYXRpb24gdW5pdCwgaW4gYnl0ZXMuIChlLmcuLCA4IGJ5dGVzKQotICAgIHByb3RlY3RlZCBpbnQgbUFsbG9jYXRpb25Vbml0U2l6ZTsKLQotICAgIC8vKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGlzIHNlZ21lbnQuCi0gICAgcHJvdGVjdGVkIGxvbmcgbVN0YXJ0QWRkcmVzczsKLQotICAgIC8vKiBUaGUgb2Zmc2V0IG9mIHRoaXMgcGljZXMgZnJvbSBtU3RhcnRBZGRyZXNzLCBpbiBieXRlcy4KLSAgICBwcm90ZWN0ZWQgaW50IG1PZmZzZXQ7Ci0KLSAgICAvLyogVGhlIG51bWJlciBvZiBhbGxvY2F0aW9uIHVuaXRzIGRlc2NyaWJlZCBpbiB0aGlzIHNlZ21lbnQuCi0gICAgcHJvdGVjdGVkIGludCBtQWxsb2NhdGlvblVuaXRDb3VudDsKLQotICAgIC8vKiBUaGUgcmF3IGRhdGEgdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VnbWVudC4KLSAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBtVXNhZ2VEYXRhOwotCi0gICAgLy8qIG1TdGFydEFkZHJlc3MgaXMgc2V0IHRvIHRoaXMgdmFsdWUgd2hlbiB0aGUgc2VnbWVudCBiZWNvbWVzIGludmFsaWQuCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBJTlZBTElEX1NUQVJUX0FERFJFU1MgPSAtMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBIZWFwU2VnbWVudCBiYXNlZCBvbiB0aGUgcmF3IGNvbnRlbnRzCi0gICAgICogb2YgYW4gSFBTRyBjaHVuay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBocHNnRGF0YSBUaGUgcmF3IGRhdGEgZnJvbSBhbiBIUFNHIGNodW5rLgotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGlmIGhwc2dEYXRhIGlzIHRvbyBzbWFsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhvbGQgdGhlIEhQU0cgY2h1bmsgaGVhZGVyIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIEhlYXBTZWdtZW50KEJ5dGVCdWZmZXIgaHBzZ0RhdGEpIHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gewotICAgICAgICAvKiBSZWFkIHRoZSBIUFNHIGNodW5rIGhlYWRlci4KLSAgICAgICAgICogVGhlc2UgZ2V0KigpIGNhbGxzIG1heSB0aHJvdyBhIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbgotICAgICAgICAgKiBpZiB0aGUgdW5kZXJseWluZyBkYXRhIGlzbid0IGJpZyBlbm91Z2guCi0gICAgICAgICAqLwotICAgICAgICBocHNnRGF0YS5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7Ci0gICAgICAgIG1IZWFwSWQgPSBocHNnRGF0YS5nZXRJbnQoKTsKLSAgICAgICAgbUFsbG9jYXRpb25Vbml0U2l6ZSA9IChpbnQpIGhwc2dEYXRhLmdldCgpOwotICAgICAgICBtU3RhcnRBZGRyZXNzID0gKGxvbmcpIGhwc2dEYXRhLmdldEludCgpICYgMHgwMDAwMDAwMGZmZmZmZmZmTDsKLSAgICAgICAgbU9mZnNldCA9IGhwc2dEYXRhLmdldEludCgpOwotICAgICAgICBtQWxsb2NhdGlvblVuaXRDb3VudCA9IGhwc2dEYXRhLmdldEludCgpOwotCi0gICAgICAgIC8vIEhvbGQgb250byB0aGUgcmVtYWluZGVyIG9mIHRoZSBkYXRhLgotICAgICAgICBtVXNhZ2VEYXRhID0gaHBzZ0RhdGEuc2xpY2UoKTsKLSAgICAgICAgbVVzYWdlRGF0YS5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7ICAgLy8gZG9lc24ndCBhY3R1YWxseSBtYXR0ZXIKLQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLS8veHh4IGRvIGl0Ci0vL3h4eCBtYWtlIHN1cmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBtYXRjaGVzIG1BbGxvY2F0aW9uVW5pdENvdW50LgotLy94eHggbWFrZSBzdXJlIHRoZSBsYXN0IGVsZW1lbnQgZG9lc24ndCBoYXZlIFAgc2V0Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGlmIHRoaXMgc2VnbWVudCBzdGlsbCBjb250YWlucyBkYXRhLCBhbmQgaGFzIG5vdCBiZWVuCi0gICAgICogYXBwZW5kZWQgdG8gYW5vdGhlciBzZWdtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgc2VnbWVudCBoYXMgbm90IGJlZW4gYXBwZW5kZWQgdG8KLSAgICAgKiAgICAgICAgIGFub3RoZXIgc2VnbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVN0YXJ0QWRkcmVzcyAhPSBJTlZBTElEX1NUQVJUX0FERFJFU1M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGlmIDxjb2RlPm90aGVyPC9jb2RlPiBjb21lcyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIEhlYXBTZWdtZW50IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vdGhlcjwvY29kZT4gY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcwotICAgICAqICAgICAgICAgc2VnbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5BcHBlbmQoSGVhcFNlZ21lbnQgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkgJiYgbUhlYXBJZCA9PSBvdGhlci5tSGVhcElkICYmCi0gICAgICAgICAgICAgICAgbUFsbG9jYXRpb25Vbml0U2l6ZSA9PSBvdGhlci5tQWxsb2NhdGlvblVuaXRTaXplICYmCi0gICAgICAgICAgICAgICAgZ2V0RW5kQWRkcmVzcygpID09IG90aGVyLmdldFN0YXJ0QWRkcmVzcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCB0aGUgY29udGVudHMgb2YgPGNvZGU+b3RoZXI8L2NvZGU+IHRvIHRoaXMgc2VnbWVudAotICAgICAqIGlmIGl0IGRlc2NyaWJlcyB0aGUgc2VnbWVudCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdGhlciBUaGUgc2VnbWVudCB0byBhcHBlbmQgdG8gdGhpcyBzZWdtZW50LCBpZiBwb3NzaWJsZS4KLSAgICAgKiAgICAgICAgICAgICAgSWYgYXBwZW5kZWQsIDxjb2RlPm90aGVyPC9jb2RlPiB3aWxsIGJlIGludmFsaWQKLSAgICAgKiAgICAgICAgICAgICAgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vdGhlcjwvY29kZT4gd2FzIHN1Y2Nlc3NmdWxseSBhcHBlbmRlZCB0bwotICAgICAqICAgICAgICAgdGhpcyBzZWdtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChIZWFwU2VnbWVudCBvdGhlcikgewotICAgICAgICBpZiAoY2FuQXBwZW5kKG90aGVyKSkgewotICAgICAgICAgICAgLyogUHJlc2VydmUgdGhlIHBvc2l0aW9uLiAgVGhlIG1hcmsgaXMgbm90IHByZXNlcnZlZCwKLSAgICAgICAgICAgICAqIGJ1dCB3ZSBkb24ndCB1c2UgaXQgYW55d2F5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgcG9zID0gbVVzYWdlRGF0YS5wb3NpdGlvbigpOwotCi0gICAgICAgICAgICAvLyBHdWFyYW50ZWUgdGhhdCB3ZSBoYXZlIGVub3VnaCByb29tIGZvciB0aGUgbmV3IGRhdGEuCi0gICAgICAgICAgICBpZiAobVVzYWdlRGF0YS5jYXBhY2l0eSgpIC0gbVVzYWdlRGF0YS5saW1pdCgpIDwKLSAgICAgICAgICAgICAgICAgICAgb3RoZXIubVVzYWdlRGF0YS5saW1pdCgpKSB7Ci0gICAgICAgICAgICAgICAgLyogR3JvdyBtb3JlIHRoYW4gbmVjZXNzYXJ5IGluIGNhc2UgYW5vdGhlciBhcHBlbmQoKQotICAgICAgICAgICAgICAgICAqIGlzIGFib3V0IHRvIGhhcHBlbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IG1Vc2FnZURhdGEubGltaXQoKSArIG90aGVyLm1Vc2FnZURhdGEubGltaXQoKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG5ld0RhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG5ld1NpemUgKiAyKTsKLQotICAgICAgICAgICAgICAgIG1Vc2FnZURhdGEucmV3aW5kKCk7Ci0gICAgICAgICAgICAgICAgbmV3RGF0YS5wdXQobVVzYWdlRGF0YSk7Ci0gICAgICAgICAgICAgICAgbVVzYWdlRGF0YSA9IG5ld0RhdGE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgb3RoZXIgc2VnbWVudCBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb24uCi0gICAgICAgICAgICBvdGhlci5tVXNhZ2VEYXRhLnJld2luZCgpOwotICAgICAgICAgICAgbVVzYWdlRGF0YS5wdXQob3RoZXIubVVzYWdlRGF0YSk7Ci0gICAgICAgICAgICBtVXNhZ2VEYXRhLnBvc2l0aW9uKHBvcyk7Ci0KLSAgICAgICAgICAgIC8vIEZpeCB0aGlzIHNlZ21lbnQncyBoZWFkZXIgdG8gY292ZXIgdGhlIG5ldyBkYXRhLgotICAgICAgICAgICAgbUFsbG9jYXRpb25Vbml0Q291bnQgKz0gb3RoZXIubUFsbG9jYXRpb25Vbml0Q291bnQ7Ci0KLSAgICAgICAgICAgIC8vIE1hcmsgdGhlIG90aGVyIHNlZ21lbnQgYXMgaW52YWxpZC4KLSAgICAgICAgICAgIG90aGVyLm1TdGFydEFkZHJlc3MgPSBJTlZBTElEX1NUQVJUX0FERFJFU1M7Ci0gICAgICAgICAgICBvdGhlci5tVXNhZ2VEYXRhID0gbnVsbDsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRTdGFydEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhcnRBZGRyZXNzICsgbU9mZnNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uVW5pdFNpemUgKiBtQWxsb2NhdGlvblVuaXRDb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbmRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RhcnRBZGRyZXNzKCkgKyBnZXRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXdpbmRFbGVtZW50cygpIHsKLSAgICAgICAgaWYgKG1Vc2FnZURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgbVVzYWdlRGF0YS5yZXdpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBIZWFwU2VnbWVudEVsZW1lbnQgZ2V0TmV4dEVsZW1lbnQoSGVhcFNlZ21lbnRFbGVtZW50IHJldXNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocmV1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXVzZS5zZXQodGhpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGVhcFNlZ21lbnRFbGVtZW50KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8qIE5vcm1hbCAiZW5kIG9mIGJ1ZmZlciIgc2l0dWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvKiBNYWxmb3JtZWQgZGF0YS4KLSAgICAgICAgICAgICAqLwotLy9UT0RPOiB3ZSBzaG91bGQgY2F0Y2ggdGhpcyBpbiB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ldGhvZCBvdmVycmlkZXMgZm9yIENvbXBhcmFibGUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIZWFwU2VnbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVUbygoSGVhcFNlZ21lbnQpIG8pID09IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhcElkICogMzEgKwotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVW5pdFNpemUgKiAzMSArCi0gICAgICAgICAgICAgICAgKGludCkgbVN0YXJ0QWRkcmVzcyAqIDMxICsKLSAgICAgICAgICAgICAgICBtT2Zmc2V0ICogMzEgKwotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVW5pdENvdW50ICogMzEgKwotICAgICAgICAgICAgICAgIG1Vc2FnZURhdGEuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgc3RyLmFwcGVuZCgiSGVhcFNlZ21lbnQgeyBoZWFwICIpLmFwcGVuZChtSGVhcElkKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgc3RhcnQgMHgiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZygoaW50KSBnZXRTdGFydEFkZHJlc3MoKSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBsZW5ndGggIikuYXBwZW5kKGdldExlbmd0aCgpKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIiB9Iik7Ci0KLSAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEhlYXBTZWdtZW50IG90aGVyKSB7Ci0gICAgICAgIGlmIChtSGVhcElkICE9IG90aGVyLm1IZWFwSWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtSGVhcElkIDwgb3RoZXIubUhlYXBJZCA/IC0xIDogMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0U3RhcnRBZGRyZXNzKCkgIT0gb3RoZXIuZ2V0U3RhcnRBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTdGFydEFkZHJlc3MoKSA8IG90aGVyLmdldFN0YXJ0QWRkcmVzcygpID8gLTEgOiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdHdvIHNlZ21lbnRzIGhhdmUgdGhlIHNhbWUgc3RhcnQgYWRkcmVzcywgdGhlIHJlc3Qgb2YKLSAgICAgICAgICogdGhlIGZpZWxkcyBzaG91bGQgYmUgZXF1YWwuICBHbyB0aHJvdWdoIHRoZSBtb3Rpb25zLCB0aG91Z2guCi0gICAgICAgICAqIE5vdGUgdGhhdCB3ZSByZS1jaGVjayB0aGUgY29tcG9uZW50cyBvZiBnZXRTdGFydEFkZHJlc3MoKQotICAgICAgICAgKiAobVN0YXJ0QWRkcmVzcyBhbmQgbU9mZnNldCkgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGZpZWxkcyBpbgotICAgICAgICAgKiBhbiBlcXVhbCBzZWdtZW50IGFyZSBlcXVhbC4KLSAgICAgICAgICovCi0KLSAgICAgICAgaWYgKG1BbGxvY2F0aW9uVW5pdFNpemUgIT0gb3RoZXIubUFsbG9jYXRpb25Vbml0U2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uVW5pdFNpemUgPCBvdGhlci5tQWxsb2NhdGlvblVuaXRTaXplID8gLTEgOiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3RhcnRBZGRyZXNzICE9IG90aGVyLm1TdGFydEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RhcnRBZGRyZXNzIDwgb3RoZXIubVN0YXJ0QWRkcmVzcyA/IC0xIDogMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9mZnNldCAhPSBvdGhlci5tT2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbU9mZnNldCA8IG90aGVyLm1PZmZzZXQgPyAtMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BbGxvY2F0aW9uVW5pdENvdW50ICE9IG90aGVyLm1BbGxvY2F0aW9uVW5pdENvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFsbG9jYXRpb25Vbml0Q291bnQgPCBvdGhlci5tQWxsb2NhdGlvblVuaXRDb3VudCA/IC0xIDogMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVVzYWdlRGF0YSAhPSBvdGhlci5tVXNhZ2VEYXRhKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVzYWdlRGF0YS5jb21wYXJlVG8ob3RoZXIubVVzYWdlRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0lEZXZpY2UuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9JRGV2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwOTZhYmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0lEZXZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogIEEgRGV2aWNlLiBJdCBjYW4gYmUgYSBwaHlzaWNhbCBkZXZpY2Ugb3IgYW4gZW11bGF0b3IuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURldmljZSB7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX0JVSUxEX1ZFUlNJT04gPSAicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX0JVSUxEX0FQSV9MRVZFTCA9ICJyby5idWlsZC52ZXJzaW9uLnNkayI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9CVUlMRF9DT0RFTkFNRSA9ICJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIjsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfREVCVUdHQUJMRSA9ICJyby5kZWJ1Z2dhYmxlIjsKLQotICAgIC8qKiBTZXJpYWwgbnVtYmVyIG9mIHRoZSBmaXJzdCBjb25uZWN0ZWQgZW11bGF0b3IuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklSU1RfRU1VTEFUT1JfU04gPSAiZW11bGF0b3ItNTU1NCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGV2aWNlIGNoYW5nZSBiaXQgbWFzazoge0BsaW5rIERldmljZVN0YXRlfSBjaGFuZ2UuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1NUQVRFID0gMHgwMDAxOwotICAgIC8qKiBEZXZpY2UgY2hhbmdlIGJpdCBtYXNrOiB7QGxpbmsgQ2xpZW50fSBsaXN0IGNoYW5nZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfQ0xJRU5UX0xJU1QgPSAweDAwMDI7Ci0gICAgLyoqIERldmljZSBjaGFuZ2UgYml0IG1hc2s6IGJ1aWxkIGluZm8gY2hhbmdlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9CVUlMRF9JTkZPID0gMHgwMDA0OwotCi0gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1BST1BfQlVJTERfQVBJX0xFVkVMfS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX0JVSUxEX1ZFUlNJT05fTlVNQkVSID0gUFJPUF9CVUlMRF9BUElfTEVWRUw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgb2YgYSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIERldmljZVN0YXRlIHsKLSAgICAgICAgQk9PVExPQURFUigiYm9vdGxvYWRlciIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIE9GRkxJTkUoIm9mZmxpbmUiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBPTkxJTkUoImRldmljZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVN0YXRlOwotCi0gICAgICAgIERldmljZVN0YXRlKFN0cmluZyBzdGF0ZSkgewotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHtAbGluayBEZXZpY2VTdGF0ZX0gZnJvbSB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IDxjb2RlPmFkYiBkZXZpY2VzPC9jb2RlPi4KLSAgICAgICAgICogQHBhcmFtIHN0YXRlIHRoZSBkZXZpY2Ugc3RhdGUuCi0gICAgICAgICAqIEByZXR1cm4gYSB7QGxpbmsgRGV2aWNlU3RhdGV9IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3RhdGUgaXMgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGV2aWNlU3RhdGUgZ2V0U3RhdGUoU3RyaW5nIHN0YXRlKSB7Ci0gICAgICAgICAgICBmb3IgKERldmljZVN0YXRlIGRldmljZVN0YXRlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlU3RhdGUubVN0YXRlLmVxdWFscyhzdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZVN0YXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VyaWFsTnVtYmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBBVkQgdGhlIGVtdWxhdG9yIGlzIHJ1bm5pbmcuCi0gICAgICogPHAvPlRoaXMgaXMgb25seSB2YWxpZCBpZiB7QGxpbmsgI2lzRW11bGF0b3IoKX0gcmV0dXJucyB0cnVlLgotICAgICAqIDxwLz5JZiB0aGUgZW11bGF0b3IgaXMgbm90IHJ1bm5pbmcgYW55IEFWRCAoZm9yIGluc3RhbmNlIGl0J3MgcnVubmluZyBmcm9tIGFuIEFuZHJvaWQgc291cmNlCi0gICAgICogdHJlZSBidWlsZCksIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuICI8Y29kZT4mbHQ7YnVpbGQmZ3Q7PC9jb2RlPiIuCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgQVZEIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF2ZE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIERldmljZVN0YXRlIGdldFN0YXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXZpY2UgcHJvcGVydGllcy4gSXQgY29udGFpbnMgdGhlIHdob2xlIG91dHB1dCBvZiAnZ2V0cHJvcCcKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvcGVydHkgZm9yIHRoaXMgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJvcGVydHlDb3VudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByb3BlcnR5IHZhbHVlLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSB0byByZXR1cm4uCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgZGV2aWNlIGlzIHJlYWR5LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYge0BsaW5rICNnZXRTdGF0ZSgpfSByZXR1cm5zIHtAbGluayBEZXZpY2VTdGF0ZSNPTkxJTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzT25saW5lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXZpY2UgaXMgYW4gZW11bGF0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXVsYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB7QGxpbmsgI2dldFN0YXRlKCl9IHJldHVybnMge0BsaW5rIERldmljZVN0YXRlI09GRkxJTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzT2ZmbGluZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgZGV2aWNlIGlzIGluIGJvb3Rsb2FkZXIgbW9kZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyB7QGxpbmsgRGV2aWNlU3RhdGUjQk9PVExPQURFUn0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNCb290TG9hZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHtAbGluayBEZXZpY2V9IGhhcyB7QGxpbmsgQ2xpZW50fXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpZW50cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgY2xpZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50W10gZ2V0Q2xpZW50cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBDbGllbnR9IGJ5IGl0cyBhcHBsaWNhdGlvbiBuYW1lLgotICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Q2xpZW50PC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KFN0cmluZyBhcHBsaWNhdGlvbk5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBTeW5jU2VydmljZX0gb2JqZWN0IHRvIHB1c2ggLyBwdWxsIGZpbGVzIHRvIGFuZCBmcm9tIHRoZSBkZXZpY2UuCi0gICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgU3luY1NlcnZpY2UgY291bGRuJ3QgYmUgY3JlYXRlZC4gVGhpcyBjYW4gaGFwcGVuIGlmIGFkYgotICAgICAqIHJlZnVzZSB0byBvcGVuIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgdGhlIHtAbGluayBJRGV2aWNlfSBpcyBpbnZhbGlkIChvciBnb3QgZGlzY29ubmVjdGVkKS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb25uZWN0aW9uIHdpdGggYWRiIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3luY1NlcnZpY2UgZ2V0U3luY1NlcnZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZpbGVMaXN0aW5nU2VydmljZX0gZm9yIHRoaXMgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTGlzdGluZ1NlcnZpY2UgZ2V0RmlsZUxpc3RpbmdTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBhIHNjcmVlbiBzaG90IG9mIHRoZSBkZXZpY2UgYW5kIHJldHVybnMgaXQgYXMgYSB7QGxpbmsgUmF3SW1hZ2V9LgotICAgICAqIEByZXR1cm4gdGhlIHNjcmVlbnNob3QgYXMgYSA8Y29kZT5SYXdJbWFnZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAgKiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFJhd0ltYWdlIGdldFNjcmVlbnNob3QoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIHNoZWxsIGNvbW1hbmQgb24gdGhlIGRldmljZSwgYW5kIHNlbmRzIHRoZSByZXN1bHQgdG8gYSByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBleGVjdXRlCi0gICAgICogQHBhcmFtIHJlY2VpdmVyIFRoZSByZWNlaXZlciBvYmplY3QgZ2V0dGluZyB0aGUgcmVzdWx0IGZyb20gdGhlIGNvbW1hbmQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQsCi0gICAgICAgICAgICBJU2hlbGxPdXRwdXRSZWNlaXZlciByZWNlaXZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgZXZlbnQgbG9nIHNlcnZpY2UgYW5kIG91dHB1dHMgdGhlIGV2ZW50IGxvZyB0byB0aGUge0BsaW5rIExvZ1JlY2VpdmVyfS4KLSAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgdGhlIHJlY2VpdmVyIHRvIHJlY2VpdmUgdGhlIGV2ZW50IGxvZyBlbnRyaWVzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5FdmVudExvZ1NlcnZpY2UoTG9nUmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIGxvZyBzZXJ2aWNlIGZvciB0aGUgZ2l2ZW4gbG9nIGFuZCBvdXRwdXRzIHRoZSBsb2cgdG8gdGhlIHtAbGluayBMb2dSZWNlaXZlcn0uCi0gICAgICogQHBhcmFtIGxvZ25hbWUgdGhlIGxvZ25hbWUgb2YgdGhlIGxvZyB0byByZWFkIGZyb20uCi0gICAgICogQHBhcmFtIHJlY2VpdmVyIHRoZSByZWNlaXZlciB0byByZWNlaXZlIHRoZSBldmVudCBsb2cgZW50cmllcy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuTG9nU2VydmljZShTdHJpbmcgbG9nbmFtZSwgTG9nUmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwb3J0IGZvcndhcmRpbmcgYmV0d2VlbiBhIGxvY2FsIGFuZCBhIHJlbW90ZSBwb3J0LgotICAgICAqIEBwYXJhbSBsb2NhbFBvcnQgdGhlIGxvY2FsIHBvcnQgdG8gZm9yd2FyZAotICAgICAqIEBwYXJhbSByZW1vdGVQb3J0IHRoZSByZW1vdGUgcG9ydC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY3JlYXRlRm9yd2FyZChpbnQgbG9jYWxQb3J0LCBpbnQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcG9ydCBmb3J3YXJkaW5nIGJldHdlZW4gYSBsb2NhbCBhbmQgYSByZW1vdGUgcG9ydC4KLSAgICAgKiBAcGFyYW0gbG9jYWxQb3J0IHRoZSBsb2NhbCBwb3J0IHRvIGZvcndhcmQKLSAgICAgKiBAcGFyYW0gcmVtb3RlUG9ydCB0aGUgcmVtb3RlIHBvcnQuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUZvcndhcmQoaW50IGxvY2FsUG9ydCwgaW50IHJlbW90ZVBvcnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2xpZW50IGJ5IHBpZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwaWQgaXMgdW5rbm93bgotICAgICAqIEBwYXJhbSBwaWQgdGhlIHBpZCBvZiB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TmFtZShpbnQgcGlkKTsKLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gb24gZGV2aWNlLgotICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgY29tYmluZXMgdGhlIHN5bmNQYWNrYWdlVG9EZXZpY2UsIGluc3RhbGxSZW1vdGVQYWNrYWdlLAotICAgICAqIGFuZCByZW1vdmVQYWNrYWdlIHN0ZXBzCi0gICAgICogQHBhcmFtIHBhY2thZ2VGaWxlUGF0aCB0aGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBmaWxlIG9uIGxvY2FsIGhvc3QgdG8gaW5zdGFsbAotICAgICAqIEBwYXJhbSByZWluc3RhbGwgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlLWluc3RhbGwgb2YgYXBwIHNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gd2l0aCBhbiBlcnJvciBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNjZXNzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGluc3RhbGxQYWNrYWdlKFN0cmluZyBwYWNrYWdlRmlsZVBhdGgsIGJvb2xlYW4gcmVpbnN0YWxsKSAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGEgZmlsZSB0byBkZXZpY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxGaWxlUGF0aCB0aGUgYWJzb2x1dGUgcGF0aCB0byBmaWxlIG9uIGxvY2FsIGhvc3QKLSAgICAgKiBAcmV0dXJuIHtAbGluayBTdHJpbmd9IGRlc3RpbmF0aW9uIHBhdGggb24gZGV2aWNlIGZvciBmaWxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBmYXRhbCBlcnJvciBvY2N1cnJlZCB3aGVuIHB1c2hpbmcgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc3luY1BhY2thZ2VUb0RldmljZShTdHJpbmcgbG9jYWxGaWxlUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRoYXQgd2FzIHB1c2hlZCB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbiBvbiB0aGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSByZW1vdGVGaWxlUGF0aCBhYnNvbHV0ZSBmaWxlIHBhdGggdG8gcGFja2FnZSBmaWxlIG9uIGRldmljZQotICAgICAqIEBwYXJhbSByZWluc3RhbGwgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlLWluc3RhbGwgb2YgYXBwIHNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBAdGhyb3dzIEluc3RhbGxFeGNlcHRpb24gaWYgaW5zdGFsbGF0aW9uIGZhaWxlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgaW5zdGFsbFJlbW90ZVBhY2thZ2UoU3RyaW5nIHJlbW90ZUZpbGVQYXRoLCBib29sZWFuIHJlaW5zdGFsbCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGZpbGUgZnJvbSBkZXZpY2UKLSAgICAgKiBAcGFyYW0gcmVtb3RlRmlsZVBhdGggcGF0aCBvbiBkZXZpY2Ugb2YgZmlsZSB0byByZW1vdmUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGUgcmVtb3ZhbCBmYWlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVQYWNrYWdlKFN0cmluZyByZW1vdGVGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVW5pbnN0YWxsIGFuIHBhY2thZ2UgZnJvbSB0aGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgQW5kcm9pZCBhcHBsaWNhdGlvbiBwYWNrYWdlIG5hbWUgdG8gdW5pbnN0YWxsCi0gICAgICogQHJldHVybiBhIHtAbGluayBTdHJpbmd9IHdpdGggYW4gZXJyb3IgY29kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc3VjY2Vzcy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB1bmluc3RhbGxQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSVNoZWxsT3V0cHV0UmVjZWl2ZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9JU2hlbGxPdXRwdXRSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY3MWJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9JU2hlbGxPdXRwdXRSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi0vKioKLSAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgbWV0aG9kcyB0aGF0IGRlYWwgd2l0aCBvdXQgZnJvbSBhIHJlbW90ZSBzaGVsbAotICogY29tbWFuZCBvbiBhIGRldmljZS9lbXVsYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2hlbGxPdXRwdXRSZWNlaXZlciB7Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIGV2ZXJ5IHRpbWUgc29tZSBuZXcgZGF0YSBpcyBhdmFpbGFibGUuCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIG5ldyBkYXRhLgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgbmV3IGRhdGEgc3RhcnRzLgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgbmV3IGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3V0cHV0KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzIGV4ZWN1dGlvbiAodW5sZXNzIHRoZSBwcm9jZXNzIHdhcwotICAgICAqIGNhbmNlbGVkKS4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHRlcm1pbmF0ZSBhbmQgZmx1c2ggd2hhdGV2ZXIKLSAgICAgKiBkYXRhIHdhcyBub3QgeWV0IHByb2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIG1ldGhvZCB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHJlbW90ZSBzaGVsbCBjb21tYW5kLgotICAgICAqIEByZXR1cm4gdHJ1ZSB0byBjYW5jZWwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpOwotfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9JU3RhY2tUcmFjZUluZm8uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9JU3RhY2tUcmFjZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZDczMC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSVN0YWNrVHJhY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLS8qKgotICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IHJldHVybnMgYSBzdGFjayB0cmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhY2tUcmFjZUluZm8gewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhY2sgdHJhY2UuIFRoaXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdGFja1RyYWNlRWxlbWVudFtdIGdldFN0YWNrVHJhY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0pkd3BQYWNrZXQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9KZHdwUGFja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmJiODIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0pkd3BQYWNrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKiAvL2RldmljZS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSmR3cFBhY2tldC5qYXZhCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwotCi0vKioKLSAqIEEgSkRXUCBwYWNrZXQsIHNpdHRpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgQnl0ZUJ1ZmZlciBzb21ld2hlcmUuCi0gKgotICogVGhpcyBhbGxvd3MgdXMgdG8gd3JhcCBhICJwb2ludGVyIiB0byB0aGUgZGF0YSB3aXRoIHRoZSByZXN1bHRzIG9mCi0gKiBkZWNvZGluZyB0aGUgcGFja2V0LgotICoKLSAqIE5vbmUgb2YgdGhlIG9wZXJhdGlvbnMgaGVyZSBhcmUgc3luY2hyb25pemVkLiAgSWYgbXVsdGlwbGUgdGhyZWFkcyB3aWxsCi0gKiBiZSBhY2Nlc3NpbmcgdGhlIHNhbWUgQnl0ZUJ1ZmZlcnMsIGV4dGVybmFsIHN5bmMgd2lsbCBiZSByZXF1aXJlZC4KLSAqCi0gKiBVc2UgdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBlbXB0eSBwYWNrZXQsIG9yICJmaW5kUGFja2V0KCkiIHRvCi0gKiB3cmFwIGEgSmR3cFBhY2tldCBhcm91bmQgZXhpc3RpbmcgZGF0YS4KLSAqLwotZmluYWwgY2xhc3MgSmR3cFBhY2tldCB7Ci0gICAgLy8gaGVhZGVyIGxlbgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpEV1BfSEVBREVSX0xFTiA9IDExOwotCi0gICAgLy8gcmVzdWx0cyBmcm9tIGZpbmRIYW5kc2hha2UKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQU5EU0hBS0VfR09PRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORFNIQUtFX05PVFlFVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORFNIQUtFX0JBRCA9IDM7Ci0KLSAgICAvLyBvdXIgY21kU2V0L2NtZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERE1TX0NNRF9TRVQgPSAweGM3OyAgICAgICAvLyAnRycgKyAxMjgKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRERNU19DTUQgPSAweDAxOwotCi0gICAgLy8gImZsYWdzIiBmaWVsZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBMWV9QQUNLRVQgPSAweDgwOwotCi0gICAgLy8gdGhpcyBpcyBzZW50IGFuZCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgYSBKRFdQIGNvbm5lY3Rpb24KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gbUhhbmRzaGFrZSA9IHsKLSAgICAgICAgJ0onLCAnRCcsICdXJywgJ1AnLCAnLScsICdIJywgJ2EnLCAnbicsICdkJywgJ3MnLCAnaCcsICdhJywgJ2snLCAnZScKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORFNIQUtFX0xFTiA9IG1IYW5kc2hha2UubGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1CdWZmZXI7Ci0gICAgcHJpdmF0ZSBpbnQgbUxlbmd0aCwgbUlkLCBtRmxhZ3MsIG1DbWRTZXQsIG1DbWQsIG1FcnJDb2RlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNOZXc7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbVNlcmlhbElkID0gMHg0MDAwMDAwMDsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwYWNrZXQsIGluICJidWYiLgotICAgICAqLwotICAgIEpkd3BQYWNrZXQoQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICAgICAgbUJ1ZmZlciA9IGJ1ZjsKLSAgICAgICAgbUlzTmV3ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5pc2ggYSBwYWNrZXQgY3JlYXRlZCB3aXRoIG5ld1BhY2tldCgpLgotICAgICAqCi0gICAgICogVGhpcyBhbHdheXMgY3JlYXRlcyBhIGNvbW1hbmQgcGFja2V0LCB3aXRoIHRoZSBuZXh0IHNlcmlhbCBudW1iZXIKLSAgICAgKiBpbiBzZXF1ZW5jZS4KLSAgICAgKgotICAgICAqIFdlIGhhdmUgdG8gdGFrZSAicGF5bG9hZExlbmd0aCIgYXMgYW4gYXJndW1lbnQgYmVjYXVzZSB3ZSBjYW4ndAotICAgICAqIHNlZSB0aGUgcG9zaXRpb24gaW4gdGhlICJzbGljZSIgcmV0dXJuZWQgYnkgZ2V0UGF5bG9hZCgpLiAgV2UgY291bGQKLSAgICAgKiBmaXNoIGl0IG91dCBvZiB0aGUgY2h1bmsgaGVhZGVyLCBidXQgaXQncyBsZWdhbCBmb3IgdGhlcmUgdG8gYmUKLSAgICAgKiBtb3JlIHRoYW4gb25lIGNodW5rIGluIGEgSkRXUCBwYWNrZXQuCi0gICAgICoKLSAgICAgKiBPbiBleGl0LCAicG9zaXRpb24iIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBkYXRhLgotICAgICAqLwotICAgIHZvaWQgZmluaXNoUGFja2V0KGludCBwYXlsb2FkTGVuZ3RoKSB7Ci0gICAgICAgIGFzc2VydCBtSXNOZXc7Ci0KLSAgICAgICAgQnl0ZU9yZGVyIG9sZE9yZGVyID0gbUJ1ZmZlci5vcmRlcigpOwotICAgICAgICBtQnVmZmVyLm9yZGVyKENodW5rSGFuZGxlci5DSFVOS19PUkRFUik7Ci0KLSAgICAgICAgbUxlbmd0aCA9IEpEV1BfSEVBREVSX0xFTiArIHBheWxvYWRMZW5ndGg7Ci0gICAgICAgIG1JZCA9IGdldE5leHRTZXJpYWwoKTsKLSAgICAgICAgbUZsYWdzID0gMDsKLSAgICAgICAgbUNtZFNldCA9IERETVNfQ01EX1NFVDsKLSAgICAgICAgbUNtZCA9IERETVNfQ01EOwotCi0gICAgICAgIG1CdWZmZXIucHV0SW50KDB4MDAsIG1MZW5ndGgpOwotICAgICAgICBtQnVmZmVyLnB1dEludCgweDA0LCBtSWQpOwotICAgICAgICBtQnVmZmVyLnB1dCgweDA4LCAoYnl0ZSkgbUZsYWdzKTsKLSAgICAgICAgbUJ1ZmZlci5wdXQoMHgwOSwgKGJ5dGUpIG1DbWRTZXQpOwotICAgICAgICBtQnVmZmVyLnB1dCgweDBhLCAoYnl0ZSkgbUNtZCk7Ci0KLSAgICAgICAgbUJ1ZmZlci5vcmRlcihvbGRPcmRlcik7Ci0gICAgICAgIG1CdWZmZXIucG9zaXRpb24obUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXh0IHNlcmlhbCBudW1iZXIuICBUaGlzIGNyZWF0ZXMgYSB1bmlxdWUgc2VyaWFsIG51bWJlcgotICAgICAqIGFjcm9zcyBhbGwgY29ubmVjdGlvbnMsIG5vdCBqdXN0IGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLiAgVGhpcwotICAgICAqIGlzIGEgdXNlZnVsIHByb3BlcnR5IHdoZW4gZGVidWdnaW5nLCBidXQgaXNuJ3QgbmVjZXNzYXJ5LgotICAgICAqCi0gICAgICogV2UgY2FuJ3Qgc3luY2hyb25pemUgb24gYW4gaW50LCBzbyB3ZSB1c2UgYSBzeW5jIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGdldE5leHRTZXJpYWwoKSB7Ci0gICAgICAgIHJldHVybiBtU2VyaWFsSWQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzbGljZSBvZiB0aGUgYnl0ZSBidWZmZXIsIHBvc2l0aW9uZWQgcGFzdCB0aGUgSkRXUCBoZWFkZXIKLSAgICAgKiB0byB0aGUgc3RhcnQgb2YgdGhlIGNodW5rIGhlYWRlci4gIFRoZSBidWZmZXIncyBsaW1pdCB3aWxsIGJlIHNldAotICAgICAqIHRvIHRoZSBzaXplIG9mIHRoZSBwYXlsb2FkIGlmIHRoZSBzaXplIGlzIGtub3duOyBpZiB0aGlzIGlzIGEKLSAgICAgKiBwYWNrZXQgdW5kZXIgY29uc3RydWN0aW9uIHRoZSBsaW1pdCB3aWxsIGJlIHNldCB0byB0aGUgZW5kIG9mIHRoZQotICAgICAqIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIERvZXNuJ3QgZXhhbWluZSB0aGUgcGFja2V0IGF0IGFsbCAtLSB3b3JrcyBvbiBlbXB0eSBidWZmZXJzLgotICAgICAqLwotICAgIEJ5dGVCdWZmZXIgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWY7Ci0gICAgICAgIGludCBvbGRQb3NuID0gbUJ1ZmZlci5wb3NpdGlvbigpOwotCi0gICAgICAgIG1CdWZmZXIucG9zaXRpb24oSkRXUF9IRUFERVJfTEVOKTsKLSAgICAgICAgYnVmID0gbUJ1ZmZlci5zbGljZSgpOyAgICAgLy8gZ29lcyBmcm9tIHBvc2l0aW9uIHRvIGxpbWl0Ci0gICAgICAgIG1CdWZmZXIucG9zaXRpb24ob2xkUG9zbik7Ci0KLSAgICAgICAgaWYgKG1MZW5ndGggPiAwKQotICAgICAgICAgICAgYnVmLmxpbWl0KG1MZW5ndGggLSBKRFdQX0hFQURFUl9MRU4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc3NlcnQgbUlzTmV3OwotICAgICAgICBidWYub3JkZXIoQ2h1bmtIYW5kbGVyLkNIVU5LX09SREVSKTsKLSAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zICJ0cnVlIiBpZiB0aGlzIEpEV1AgcGFja2V0IGhhcyBhIEpEV1AgY29tbWFuZCB0eXBlLgotICAgICAqCi0gICAgICogVGhpcyBuZXZlciByZXR1cm5zICJ0cnVlIiBmb3IgcmVwbHkgcGFja2V0cy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGRtUGFja2V0KCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIFJFUExZX1BBQ0tFVCkgPT0gMCAmJgotICAgICAgICAgICAgICAgbUNtZFNldCA9PSBERE1TX0NNRF9TRVQgJiYKLSAgICAgICAgICAgICAgIG1DbWQgPT0gRERNU19DTUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyAidHJ1ZSIgaWYgdGhpcyBKRFdQIHBhY2tldCBpcyB0YWdnZWQgYXMgYSByZXBseS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUmVwbHkoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgUkVQTFlfUEFDS0VUKSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgInRydWUiIGlmIHRoaXMgSkRXUCBwYWNrZXQgaXMgYSByZXBseSB3aXRoIGEgbm9uemVybwotICAgICAqIGVycm9yIGNvZGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Vycm9yKCkgewotICAgICAgICByZXR1cm4gaXNSZXBseSgpICYmIG1FcnJDb2RlICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyAidHJ1ZSIgaWYgdGhpcyBKRFdQIHBhY2tldCBoYXMgbm8gZGF0YS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiAobUxlbmd0aCA9PSBKRFdQX0hFQURFUl9MRU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGFja2V0J3MgSUQuICBGb3IgYSByZXBseSBwYWNrZXQsIHRoaXMgYWxsb3dzIHVzIHRvCi0gICAgICogbWF0Y2ggdGhlIHJlcGx5IHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QuCi0gICAgICovCi0gICAgaW50IGdldElkKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0LiAgVGhpcyBpbmNsdWRlcyB0aGUgaGVhZGVyLCBzbyBhbgotICAgICAqIGVtcHR5IHBhY2tldCBpcyAxMSBieXRlcyBsb25nLgotICAgICAqLwotICAgIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIG91ciBwYWNrZXQgdG8gImNoYW4iLiAgQ29uc3VtZXMgdGhlIHBhY2tldCBhcyBwYXJ0IG9mIHRoZQotICAgICAqIHdyaXRlLgotICAgICAqCi0gICAgICogVGhlIEpEV1AgcGFja2V0IHN0YXJ0cyBhdCBvZmZzZXQgMCBhbmQgZW5kcyBhdCBtQnVmZmVyLnBvc2l0aW9uKCkuCi0gICAgICovCi0gICAgdm9pZCB3cml0ZUFuZENvbnN1bWUoU29ja2V0Q2hhbm5lbCBjaGFuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkTGltaXQ7Ci0KLSAgICAgICAgLy9Mb2cuaSgiZGRtcyIsICJ3cml0ZUFuZENvbnN1bWU6IHBvcz0iICsgbUJ1ZmZlci5wb3NpdGlvbigpCi0gICAgICAgIC8vICAgICsgIiwgbGltaXQ9IiArIG1CdWZmZXIubGltaXQoKSk7Ci0KLSAgICAgICAgYXNzZXJ0IG1MZW5ndGggPiAwOwotCi0gICAgICAgIG1CdWZmZXIuZmxpcCgpOyAgICAgICAgIC8vIGxpbWl0PC1wb3NuLCBwb3NuPC0wCi0gICAgICAgIG9sZExpbWl0ID0gbUJ1ZmZlci5saW1pdCgpOwotICAgICAgICBtQnVmZmVyLmxpbWl0KG1MZW5ndGgpOwotICAgICAgICB3aGlsZSAobUJ1ZmZlci5wb3NpdGlvbigpICE9IG1CdWZmZXIubGltaXQoKSkgewotICAgICAgICAgICAgY2hhbi53cml0ZShtQnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwb3NpdGlvbiBzaG91bGQgbm93IGJlIGF0IGVuZCBvZiBwYWNrZXQKLSAgICAgICAgYXNzZXJ0IG1CdWZmZXIucG9zaXRpb24oKSA9PSBtTGVuZ3RoOwotCi0gICAgICAgIG1CdWZmZXIubGltaXQob2xkTGltaXQpOwotICAgICAgICBtQnVmZmVyLmNvbXBhY3QoKTsgICAgICAvLyBzaGlmdCBwb3NuLi4ubGltaXQsIHBvc248LXBlbmRpbmcgZGF0YQotCi0gICAgICAgIC8vTG9nLmkoImRkbXMiLCAiICAgICAgICAgICAgICAgOiBwb3M9IiArIG1CdWZmZXIucG9zaXRpb24oKQotICAgICAgICAvLyAgICArICIsIGxpbWl0PSIgKyBtQnVmZmVyLmxpbWl0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICJNb3ZlIiB0aGUgcGFja2V0IGRhdGEgb3V0IG9mIHRoZSBidWZmZXIgd2UncmUgc2l0dGluZyBvbiBhbmQgaW50bwotICAgICAqIGJ1ZiBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIG1vdmVQYWNrZXQoQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICAgICAgTG9nLnYoImRkbXMiLCAibW92aW5nICIgKyBtTGVuZ3RoICsgIiBieXRlcyIpOwotICAgICAgICBpbnQgb2xkUG9zbiA9IG1CdWZmZXIucG9zaXRpb24oKTsKLQotICAgICAgICBtQnVmZmVyLnBvc2l0aW9uKDApOwotICAgICAgICBtQnVmZmVyLmxpbWl0KG1MZW5ndGgpOwotICAgICAgICBidWYucHV0KG1CdWZmZXIpOwotICAgICAgICBtQnVmZmVyLnBvc2l0aW9uKG1MZW5ndGgpOwotICAgICAgICBtQnVmZmVyLmxpbWl0KG9sZFBvc24pOwotICAgICAgICBtQnVmZmVyLmNvbXBhY3QoKTsgICAgICAvLyBzaGlmdCBwb3NuLi4ubGltaXQsIHBvc248LXBlbmRpbmcgZGF0YQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN1bWUgdGhlIEpEV1AgcGFja2V0LgotICAgICAqCi0gICAgICogT24gZW50cnkgYW5kIGV4aXQsICJwb3NpdGlvbiIgaXMgdGhlICNvZiBieXRlcyBpbiB0aGUgYnVmZmVyLgotICAgICAqLwotICAgIHZvaWQgY29uc3VtZSgpCi0gICAgewotICAgICAgICAvL0xvZy5kKCJkZG1zIiwgImNvbnN1bWluZyAiICsgbUxlbmd0aCArICIgYnl0ZXMiKTsKLSAgICAgICAgLy9Mb2cuZCgiZGRtcyIsICIgIHBvc249IiArIG1CdWZmZXIucG9zaXRpb24oKQotICAgICAgICAvLyAgICArICIsIGxpbWl0PSIgKyBtQnVmZmVyLmxpbWl0KCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSAiZmxpcCIgY2FsbCBzZXRzICJsaW1pdCIgZXF1YWwgdG8gdGhlIHBvc2l0aW9uICh1c3VhbGx5IHRoZQotICAgICAgICAgKiBlbmQgb2YgZGF0YSkgYW5kICJwb3NpdGlvbiIgZXF1YWwgdG8gemVyby4KLSAgICAgICAgICoKLSAgICAgICAgICogY29tcGFjdCgpIGNvcGllcyBldmVyeXRoaW5nIGZyb20gInBvc2l0aW9uIiBhbmQgImxpbWl0IiB0byB0aGUKLSAgICAgICAgICogc3RhcnQgb2YgdGhlIGJ1ZmZlciwgc2V0cyAicG9zaXRpb24iIHRvIHRoZSBlbmQgb2YgZGF0YSwgYW5kCi0gICAgICAgICAqIHNldHMgImxpbWl0IiB0byB0aGUgY2FwYWNpdHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIE9uIGVudHJ5LCAicG9zaXRpb24iIGlzIHNldCB0byB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlcgotICAgICAgICAgKiBhbmQgImxpbWl0IiBpcyBzZXQgdG8gdGhlIGNhcGFjaXR5LiAgV2Ugd2FudCB0byBjYWxsIGZsaXAoKQotICAgICAgICAgKiBzbyB0aGF0IHBvc2l0aW9uLi5saW1pdCBzcGFucyBvdXIgZGF0YSwgYWR2YW5jZSAicG9zaXRpb24iIHBhc3QKLSAgICAgICAgICogdGhlIGN1cnJlbnQgcGFja2V0LCB0aGVuIGNvbXBhY3QuCi0gICAgICAgICAqLwotICAgICAgICBtQnVmZmVyLmZsaXAoKTsgICAgICAgICAvLyBsaW1pdDwtcG9zbiwgcG9zbjwtMAotICAgICAgICBtQnVmZmVyLnBvc2l0aW9uKG1MZW5ndGgpOwotICAgICAgICBtQnVmZmVyLmNvbXBhY3QoKTsgICAgICAvLyBzaGlmdCBwb3NuLi4ubGltaXQsIHBvc248LXBlbmRpbmcgZGF0YQotICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICAgICAgLy9Mb2cuZCgiZGRtcyIsICIgIGFmdGVyIGNvbXBhY3QsIHBvc249IiArIG1CdWZmZXIucG9zaXRpb24oKQotICAgICAgICAvLyAgICArICIsIGxpbWl0PSIgKyBtQnVmZmVyLmxpbWl0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIEpEV1AgcGFja2V0IGF0IHRoZSBzdGFydCBvZiAiYnVmIi4gIFRoZSBzdGFydCBpcyBrbm93biwKLSAgICAgKiBidXQgdGhlIGxlbmd0aCBoYXMgdG8gYmUgcGFyc2VkIG91dC4KLSAgICAgKgotICAgICAqIE9uIGVudHJ5LCB0aGUgcGFja2V0IGRhdGEgaW4gImJ1ZiIgbXVzdCBzdGFydCBhdCBvZmZzZXQgMCBhbmQgZW5kCi0gICAgICogYXQgInBvc2l0aW9uIi4gICJsaW1pdCIgc2hvdWxkIGJlIHNldCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5LiAgVGhpcwotICAgICAqIG1ldGhvZCBkb2VzIG5vdCBhbHRlciAiYnVmInMgYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIFJldHVybnMgYSBuZXcgSmR3cFBhY2tldCBpZiBhIGZ1bGwgb25lIGlzIGZvdW5kIGluIHRoZSBidWZmZXIuICBJZgotICAgICAqIG5vdCwgcmV0dXJucyBudWxsLiAgVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGF0YSBkb2Vzbid0IGxvb2sgbGlrZQotICAgICAqIGEgdmFsaWQgSkRXUCBwYWNrZXQuCi0gICAgICovCi0gICAgc3RhdGljIEpkd3BQYWNrZXQgZmluZFBhY2tldChCeXRlQnVmZmVyIGJ1ZikgewotICAgICAgICBpbnQgY291bnQgPSBidWYucG9zaXRpb24oKTsKLSAgICAgICAgaW50IGxlbmd0aCwgaWQsIGZsYWdzLCBjbWRTZXQsIGNtZDsKLQotICAgICAgICBpZiAoY291bnQgPCBKRFdQX0hFQURFUl9MRU4pCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBCeXRlT3JkZXIgb2xkT3JkZXIgPSBidWYub3JkZXIoKTsKLSAgICAgICAgYnVmLm9yZGVyKENodW5rSGFuZGxlci5DSFVOS19PUkRFUik7Ci0KLSAgICAgICAgbGVuZ3RoID0gYnVmLmdldEludCgweDAwKTsKLSAgICAgICAgaWQgPSBidWYuZ2V0SW50KDB4MDQpOwotICAgICAgICBmbGFncyA9IGJ1Zi5nZXQoMHgwOCkgJiAweGZmOwotICAgICAgICBjbWRTZXQgPSBidWYuZ2V0KDB4MDkpICYgMHhmZjsKLSAgICAgICAgY21kID0gYnVmLmdldCgweDBhKSAmIDB4ZmY7Ci0KLSAgICAgICAgYnVmLm9yZGVyKG9sZE9yZGVyKTsKLQotICAgICAgICBpZiAobGVuZ3RoIDwgSkRXUF9IRUFERVJfTEVOKQotICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFBhY2tldEV4Y2VwdGlvbigpOwotICAgICAgICBpZiAoY291bnQgPCBsZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBKZHdwUGFja2V0IHBrdCA9IG5ldyBKZHdwUGFja2V0KGJ1Zik7Ci0gICAgICAgIC8vcGt0Lm1CdWZmZXIgPSBidWY7Ci0gICAgICAgIHBrdC5tTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICBwa3QubUlkID0gaWQ7Ci0gICAgICAgIHBrdC5tRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAoKGZsYWdzICYgUkVQTFlfUEFDS0VUKSA9PSAwKSB7Ci0gICAgICAgICAgICBwa3QubUNtZFNldCA9IGNtZFNldDsKLSAgICAgICAgICAgIHBrdC5tQ21kID0gY21kOwotICAgICAgICAgICAgcGt0Lm1FcnJDb2RlID0gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwa3QubUNtZFNldCA9IC0xOwotICAgICAgICAgICAgcGt0Lm1DbWQgPSAtMTsKLSAgICAgICAgICAgIHBrdC5tRXJyQ29kZSA9IGNtZFNldCB8IChjbWQgPDwgOCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGt0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpa2UgZmluZFBhY2tldCgpLCBidXQgd2hlbiB3ZSdyZSBleHBlY3RpbmcgdGhlIEpEV1AgaGFuZHNoYWtlLgotICAgICAqCi0gICAgICogUmV0dXJucyBvbmUgb2Y6Ci0gICAgICogICBIQU5EU0hBS0VfR09PRCAgIC0gZm91bmQgaGFuZHNoYWtlLCBsb29rcyBnb29kCi0gICAgICogICBIQU5EU0hBS0VfQkFEICAgIC0gZm91bmQgZW5vdWdoIGRhdGEsIGJ1dCBpdCdzIHdyb25nCi0gICAgICogICBIQU5EU0hBS0VfTk9UWUVUIC0gbm90IGVub3VnaCBkYXRhIGhhcyBiZWVuIHJlYWQgeWV0Ci0gICAgICovCi0gICAgc3RhdGljIGludCBmaW5kSGFuZHNoYWtlKEJ5dGVCdWZmZXIgYnVmKSB7Ci0gICAgICAgIGludCBjb3VudCA9IGJ1Zi5wb3NpdGlvbigpOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBpZiAoY291bnQgPCBtSGFuZHNoYWtlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBIQU5EU0hBS0VfTk9UWUVUOwotCi0gICAgICAgIGZvciAoaSA9IG1IYW5kc2hha2UubGVuZ3RoIC0xOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgaWYgKGJ1Zi5nZXQoaSkgIT0gbUhhbmRzaGFrZVtpXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSEFORFNIQUtFX0JBRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBIQU5EU0hBS0VfR09PRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGhhbmRzaGFrZSBzdHJpbmcgZnJvbSB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogT24gZW50cnkgYW5kIGV4aXQsICJwb3NpdGlvbiIgaXMgdGhlICNvZiBieXRlcyBpbiB0aGUgYnVmZmVyLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNvbnN1bWVIYW5kc2hha2UoQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICAgICAgLy8gaW4gdGhlb3J5LCBub3RoaW5nIGVsc2UgY2FuIGhhdmUgYXJyaXZlZCwgc28gdGhpcyBpcyBvdmVya2lsbAotICAgICAgICBidWYuZmxpcCgpOyAgICAgICAgIC8vIGxpbWl0PC1wb3NuLCBwb3NuPC0wCi0gICAgICAgIGJ1Zi5wb3NpdGlvbihtSGFuZHNoYWtlLmxlbmd0aCk7Ci0gICAgICAgIGJ1Zi5jb21wYWN0KCk7ICAgICAgLy8gc2hpZnQgcG9zbi4uLmxpbWl0LCBwb3NuPC1wZW5kaW5nIGRhdGEKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IHRoZSBoYW5kc2hha2Ugc3RyaW5nIGludG8gdGhlIG91dHB1dCBidWZmZXIuCi0gICAgICoKLSAgICAgKiBPbiBleGl0LCAiYnVmInMgcG9zaXRpb24gd2lsbCBiZSBhZHZhbmNlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBwdXRIYW5kc2hha2UoQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICAgICAgYnVmLnB1dChtSGFuZHNoYWtlKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9Mb2cuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NWIwNC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotLyoqCi0gKiBMb2cgY2xhc3MgdGhhdCBtaXJyb3JzIHRoZSBBUEkgaW4gbWFpbiBBbmRyb2lkIHNvdXJjZXMuCi0gKiA8cC8+RGVmYXVsdCBiZWhhdmlvciBvdXRwdXRzIHRoZSBsb2cgdG8ge0BsaW5rIFN5c3RlbSNvdXR9LiBVc2UKLSAqIHtAbGluayAjc2V0TG9nT3V0cHV0KGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuSUxvZ091dHB1dCl9IHRvIHJlZGlyZWN0IHRoZSBsb2cgc29tZXdoZXJlIGVsc2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewotCi0gICAgLyoqCi0gICAgICogTG9nIExldmVsIGVudW0uCi0gICAgICovCi0gICAgcHVibGljIGVudW0gTG9nTGV2ZWwgewotICAgICAgICBWRVJCT1NFKDIsICJ2ZXJib3NlIiwgJ1YnKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRygzLCAiZGVidWciLCAnRCcpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIElORk8oNCwgImluZm8iLCAnSScpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIFdBUk4oNSwgIndhcm4iLCAnVycpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIEVSUk9SKDYsICJlcnJvciIsICdFJyksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQVNTRVJUKDcsICJhc3NlcnQiLCAnQScpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByaW9yaXR5TGV2ZWw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1TdHJpbmdWYWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBjaGFyIG1Qcmlvcml0eUxldHRlcjsKLQotICAgICAgICBMb2dMZXZlbChpbnQgaW50UHJpb3JpdHksIFN0cmluZyBzdHJpbmdWYWx1ZSwgY2hhciBwcmlvcml0eUNoYXIpIHsKLSAgICAgICAgICAgIG1Qcmlvcml0eUxldmVsID0gaW50UHJpb3JpdHk7Ci0gICAgICAgICAgICBtU3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLSAgICAgICAgICAgIG1Qcmlvcml0eUxldHRlciA9IHByaW9yaXR5Q2hhcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTG9nTGV2ZWwgZ2V0QnlTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBmb3IgKExvZ0xldmVsIG1vZGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlLm1TdHJpbmdWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTG9nTGV2ZWx9IGVudW0gbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBsZXR0ZXIuCi0gICAgICAgICAqIEBwYXJhbSBsZXR0ZXIgdGhlIGxldHRlciBtYXRjaGluZyBhIDxjb2RlPkxvZ0xldmVsPC9jb2RlPiBlbnVtCi0gICAgICAgICAqIEByZXR1cm4gYSA8Y29kZT5Mb2dMZXZlbDwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG1hdGNoIHdlcmUgZm91bmQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIExvZ0xldmVsIGdldEJ5TGV0dGVyKGNoYXIgbGV0dGVyKSB7Ci0gICAgICAgICAgICBmb3IgKExvZ0xldmVsIG1vZGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlLm1Qcmlvcml0eUxldHRlciA9PSBsZXR0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTG9nTGV2ZWx9IGVudW0gbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBsZXR0ZXIuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogVGhlIGxldHRlciBpcyBwYXNzZWQgYXMgYSB7QGxpbmsgU3RyaW5nfSBhcmd1bWVudCwgYnV0IG9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgICAgICAgKiBpcyB1c2VkLiAKLSAgICAgICAgICogQHBhcmFtIGxldHRlciB0aGUgbGV0dGVyIG1hdGNoaW5nIGEgPGNvZGU+TG9nTGV2ZWw8L2NvZGU+IGVudW0KLSAgICAgICAgICogQHJldHVybiBhIDxjb2RlPkxvZ0xldmVsPC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWF0Y2ggd2VyZSBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTG9nTGV2ZWwgZ2V0QnlMZXR0ZXJTdHJpbmcoU3RyaW5nIGxldHRlcikgewotICAgICAgICAgICAgaWYgKGxldHRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QnlMZXR0ZXIobGV0dGVyLmNoYXJBdCgwKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGxldHRlciBpZGVudGlmeWluZyB0aGUgcHJpb3JpdHkgb2YgdGhlIHtAbGluayBMb2dMZXZlbH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgY2hhciBnZXRQcmlvcml0eUxldHRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJpb3JpdHlMZXR0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByaW9yaXR5TGV2ZWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIG5vbiB0cmFuc2xhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIExvZ0xldmVsLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyaW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IGRlYWwgd2l0aCBvdXRwdXR0aW5nIGxvZwotICAgICAqIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUxvZ091dHB1dCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBsb2cgbWVzc2FnZSBuZWVkcyB0byBiZSBwcmludGVkLgotICAgICAgICAgKiBAcGFyYW0gbG9nTGV2ZWwgVGhlIHtAbGluayBMb2dMZXZlbH0gZW51bSByZXByZXNlbnRpbmcgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnRMb2coTG9nTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIGEgbG9nIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYW5kLCBpZiBwb3NzaWJsZSwgZGlzcGxheWVkIHRvIHRoZSB1c2VyCi0gICAgICAgICAqIGluIGEgZGlhbG9nIGJveC4KLSAgICAgICAgICogQHBhcmFtIGxvZ0xldmVsIFRoZSB7QGxpbmsgTG9nTGV2ZWx9IGVudW0gcmVwcmVzZW50aW5nIHRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50QW5kUHJvbXB0TG9nKExvZ0xldmVsIGxvZ0xldmVsLCBTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nTGV2ZWwgbUxldmVsID0gRGRtUHJlZmVyZW5jZXMuZ2V0TG9nTGV2ZWwoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIElMb2dPdXRwdXQgc0xvZ091dHB1dDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBtU3BhY2VMaW5lID0gbmV3IGNoYXJbNzJdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBtSGV4RGlnaXQgPSBuZXcgY2hhcltdCi0gICAgICAgIHsgJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdhJywnYicsJ2MnLCdkJywnZScsJ2YnIH07Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLyogcHJlcCBmb3IgaGV4IGR1bXAgKi8KLSAgICAgICAgaW50IGkgPSBtU3BhY2VMaW5lLmxlbmd0aC0xOwotICAgICAgICB3aGlsZSAoaSA+PSAwKQotICAgICAgICAgICAgbVNwYWNlTGluZVtpLS1dID0gJyAnOwotICAgICAgICBtU3BhY2VMaW5lWzBdID0gbVNwYWNlTGluZVsxXSA9IG1TcGFjZUxpbmVbMl0gPSBtU3BhY2VMaW5lWzNdID0gJzAnOwotICAgICAgICBtU3BhY2VMaW5lWzRdID0gJy0nOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25maWcgewotICAgICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dWID0gdHJ1ZTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HRCA9IHRydWU7Ci0gICAgfTsKLQotICAgIHByaXZhdGUgTG9nKCkge30KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgYSB7QGxpbmsgTG9nTGV2ZWwjVkVSQk9TRX0gbGV2ZWwgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdihTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBwcmludGxuKExvZ0xldmVsLlZFUkJPU0UsIHRhZywgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyBhIHtAbGluayBMb2dMZXZlbCNERUJVR30gbGV2ZWwgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZChTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBwcmludGxuKExvZ0xldmVsLkRFQlVHLCB0YWcsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgYSB7QGxpbmsgTG9nTGV2ZWwjSU5GT30gbGV2ZWwgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaShTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBwcmludGxuKExvZ0xldmVsLklORk8sIHRhZywgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyBhIHtAbGluayBMb2dMZXZlbCNXQVJOfSBsZXZlbCBtZXNzYWdlLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3KFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHByaW50bG4oTG9nTGV2ZWwuV0FSTiwgdGFnLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXRzIGEge0BsaW5rIExvZ0xldmVsI0VSUk9SfSBsZXZlbCBtZXNzYWdlLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlKFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHByaW50bG4oTG9nTGV2ZWwuRVJST1IsIHRhZywgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyBhIGxvZyBtZXNzYWdlIGFuZCBhdHRlbXB0cyB0byBkaXNwbGF5IGl0IGluIGEgZGlhbG9nLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dBbmREaXNwbGF5KExvZ0xldmVsIGxvZ0xldmVsLCBTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoc0xvZ091dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzTG9nT3V0cHV0LnByaW50QW5kUHJvbXB0TG9nKGxvZ0xldmVsLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRsbihsb2dMZXZlbCwgdGFnLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgYSB7QGxpbmsgTG9nTGV2ZWwjRVJST1J9IGxldmVsIHtAbGluayBUaHJvd2FibGV9IGluZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUge0BsaW5rIFRocm93YWJsZX0gdG8gb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlKFN0cmluZyB0YWcsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgcHJpbnRsbihMb2dMZXZlbC5FUlJPUiwgdGFnLCB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpICsgJ1xuJyArIHN3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGV2ZWwoTG9nTGV2ZWwgbG9nTGV2ZWwpIHsKLSAgICAgICAgbUxldmVsID0gbG9nTGV2ZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIElMb2dPdXRwdXR9IHRvIHVzZSB0byBwcmludCB0aGUgbG9ncy4gSWYgbm90IHNldCwge0BsaW5rIFN5c3RlbSNvdXR9Ci0gICAgICogd2lsbCBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBsb2dPdXRwdXQgVGhlIHtAbGluayBJTG9nT3V0cHV0fSB0byB1c2UgdG8gcHJpbnQgdGhlIGxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9nT3V0cHV0KElMb2dPdXRwdXQgbG9nT3V0cHV0KSB7Ci0gICAgICAgIHNMb2dPdXRwdXQgPSBsb2dPdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBoZXggZHVtcC4KLSAgICAgKiA8cC8+Ci0gICAgICogTG9jYWwgYWRkaXRpb24uICBPdXRwdXQgbG9va3MgbGlrZToKLSAgICAgKiAxMjMwLSAwMCAxMSAyMiAzMyA0NCA1NSA2NiA3NyA4OCA5OSBhYSBiYiBjYyBkZCBlZSBmZiAgMDEyMzQ1Njc4OWFiY2RlZgotICAgICAqIDxwLz4KLSAgICAgKiBVc2VzIG5vIHN0cmluZyBjb25jYXRlbmF0aW9uOyBjcmVhdGVzIG9uZSBTdHJpbmcgb2JqZWN0IHBlciBsaW5lLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGhleER1bXAoU3RyaW5nIHRhZywgTG9nTGV2ZWwgbGV2ZWwsIGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLSAgICAgICAgaW50IGtIZXhPZmZzZXQgPSA2OwotICAgICAgICBpbnQga0FzY09mZnNldCA9IDU1OwotICAgICAgICBjaGFyW10gbGluZSA9IG5ldyBjaGFyW21TcGFjZUxpbmUubGVuZ3RoXTsKLSAgICAgICAgaW50IGFkZHIsIGJhc2VBZGRyLCBjb3VudDsKLSAgICAgICAgaW50IGksIGNoOwotICAgICAgICBib29sZWFuIG5lZWRFcmFzZSA9IHRydWU7Ci0KLSAgICAgICAgLy9Mb2cudyh0YWcsICJIRVggRFVNUDogb2ZmPSIgKyBvZmZzZXQgKyAiLCBsZW5ndGg9IiArIGxlbmd0aCk7Ci0KLSAgICAgICAgYmFzZUFkZHIgPSAwOwotICAgICAgICB3aGlsZSAobGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAxNikgewotICAgICAgICAgICAgICAgIC8vIGZ1bGwgbGluZQotICAgICAgICAgICAgICAgIGNvdW50ID0gMTY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHBhcnRpYWwgbGluZTsgcmUtY29weSBibGFua3MgdG8gY2xlYXIgZW5kCi0gICAgICAgICAgICAgICAgY291bnQgPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgbmVlZEVyYXNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5lZWRFcmFzZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVNwYWNlTGluZSwgMCwgbGluZSwgMCwgbVNwYWNlTGluZS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG5lZWRFcmFzZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvdXRwdXQgdGhlIGFkZHJlc3MgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDQgaGV4IGRpZ2l0cykKLSAgICAgICAgICAgIGFkZHIgPSBiYXNlQWRkcjsKLSAgICAgICAgICAgIGFkZHIgJj0gMHhmZmZmOwotICAgICAgICAgICAgY2ggPSAzOwotICAgICAgICAgICAgd2hpbGUgKGFkZHIgIT0gMCkgewotICAgICAgICAgICAgICAgIGxpbmVbY2hdID0gbUhleERpZ2l0W2FkZHIgJiAweDBmXTsKLSAgICAgICAgICAgICAgICBjaC0tOwotICAgICAgICAgICAgICAgIGFkZHIgPj4+PSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvdXRwdXQgaGV4IGRpZ2l0cyBhbmQgQVNDSUkgY2hhcnMKLSAgICAgICAgICAgIGNoID0ga0hleE9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSB2YWwgPSBkYXRhW29mZnNldCArIGldOwotCi0gICAgICAgICAgICAgICAgbGluZVtjaCsrXSA9IG1IZXhEaWdpdFsodmFsID4+PiA0KSAmIDB4MGZdOwotICAgICAgICAgICAgICAgIGxpbmVbY2grK10gPSBtSGV4RGlnaXRbdmFsICYgMHgwZl07Ci0gICAgICAgICAgICAgICAgY2grKzsKLQotICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gMHgyMCAmJiB2YWwgPCAweDdmKQotICAgICAgICAgICAgICAgICAgICBsaW5lW2tBc2NPZmZzZXQgKyBpXSA9IChjaGFyKSB2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBsaW5lW2tBc2NPZmZzZXQgKyBpXSA9ICcuJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRsbihsZXZlbCwgdGFnLCBuZXcgU3RyaW5nKGxpbmUpKTsKLQotICAgICAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IGNodW5rIG9mIGRhdGEKLSAgICAgICAgICAgIGxlbmd0aCAtPSBjb3VudDsKLSAgICAgICAgICAgIG9mZnNldCArPSBjb3VudDsKLSAgICAgICAgICAgIGJhc2VBZGRyICs9IGNvdW50OwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEdW1wIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBieXRlIGFycmF5IHdpdGggREVCVUcgcHJpb3JpdHkuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgaGV4RHVtcChieXRlW10gZGF0YSkgewotICAgICAgICBoZXhEdW1wKCJkZG1zIiwgTG9nTGV2ZWwuREVCVUcsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKiBjdXJyZW50bHkgcHJpbnRzIHRvIHN0ZG91dDsgY291bGQgd3JpdGUgdG8gYSBsb2cgd2luZG93ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludGxuKExvZ0xldmVsIGxvZ0xldmVsLCBTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAobG9nTGV2ZWwuZ2V0UHJpb3JpdHkoKSA+PSBtTGV2ZWwuZ2V0UHJpb3JpdHkoKSkgewotICAgICAgICAgICAgaWYgKHNMb2dPdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNMb2dPdXRwdXQucHJpbnRMb2cobG9nTGV2ZWwsIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50TG9nKGxvZ0xldmVsLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByaW50cyBhIGxvZyBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBsb2dMZXZlbAotICAgICAqIEBwYXJhbSB0YWcKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludExvZyhMb2dMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHRhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgbG9uZyBtc2VjOwotICAgICAgICAKLSAgICAgICAgbXNlYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBTdHJpbmcgb3V0TWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIiUwMmQ6JTAyZCAlYy8lczogJXNcbiIsCi0gICAgICAgICAgICAgICAgKG1zZWMgLyA2MDAwMCkgJSA2MCwgKG1zZWMgLyAxMDAwKSAlIDYwLAotICAgICAgICAgICAgICAgIGxvZ0xldmVsLmdldFByaW9yaXR5TGV0dGVyKCksIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQob3V0TWVzc2FnZSk7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL01vbml0b3JUaHJlYWQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9Nb25pdG9yVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTQ5NDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL01vbml0b3JUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZWJ1Z1BvcnRNYW5hZ2VyLklEZWJ1Z1BvcnRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Ob3RZZXRCb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTW9uaXRvciBvcGVuIGNvbm5lY3Rpb25zLgotICovCi1maW5hbCBjbGFzcyBNb25pdG9yVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQotICAgIC8vIEZvciBicm9hZGNhc3RzIHRvIG1lc3NhZ2UgaGFuZGxlcnMKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElFTlRfQ09OTkVDVEVEID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElFTlRfUkVBRFkgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9ESVNDT05ORUNURUQgPSAzOwotCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1RdWl0ID0gZmFsc2U7Ci0KLSAgICAvLyBMaXN0IG9mIGNsaWVudHMgd2UncmUgcGF5aW5nIGF0dGVudGlvbiB0bwotICAgIHByaXZhdGUgQXJyYXlMaXN0PENsaWVudD4gbUNsaWVudExpc3Q7Ci0KLSAgICAvLyBUaGUgYWxtaWdodHkgbXV4Ci0gICAgcHJpdmF0ZSBTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvLyBNYXAgY2h1bmsgdHlwZXMgdG8gaGFuZGxlcnMKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgQ2h1bmtIYW5kbGVyPiBtSGFuZGxlck1hcDsKLQotICAgIC8vIHBvcnQgZm9yICJkZWJ1ZyBzZWxlY3RlZCIKLSAgICBwcml2YXRlIFNlcnZlclNvY2tldENoYW5uZWwgbURlYnVnU2VsZWN0ZWRDaGFuOwotCi0gICAgcHJpdmF0ZSBpbnQgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0OwotCi0gICAgcHJpdmF0ZSBpbnQgbURlYnVnU2VsZWN0ZWRQb3J0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiAiU2VsZWN0ZWQiIGNsaWVudCBzZXR1cCB0byBhbnN3ZXIgZGVidWdnaW5nIGNvbm5lY3Rpb24gdG8gdGhlIG1OZXdEZWJ1Z1NlbGVjdGVkUG9ydCBwb3J0LgotICAgICAqLwotICAgIHByaXZhdGUgQ2xpZW50IG1TZWxlY3RlZENsaWVudCA9IG51bGw7Ci0KLSAgICAvLyBzaW5nbGV0b24KLSAgICBwcml2YXRlIHN0YXRpYyBNb25pdG9yVGhyZWFkIG1JbnN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIEdlbmVyaWMgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNb25pdG9yVGhyZWFkKCkgewotICAgICAgICBzdXBlcigiTW9uaXRvciIpOwotICAgICAgICBtQ2xpZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xpZW50PigpOwotICAgICAgICBtSGFuZGxlck1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIENodW5rSGFuZGxlcj4oKTsKLQotICAgICAgICBtTmV3RGVidWdTZWxlY3RlZFBvcnQgPSBEZG1QcmVmZXJlbmNlcy5nZXRTZWxlY3RlZERlYnVnUG9ydCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBjbGllbnQgbW9uaXRvciB0aHJlYWQuCi0gICAgICovCi0gICAgc3RhdGljIE1vbml0b3JUaHJlYWQgY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UgPSBuZXcgTW9uaXRvclRocmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGNsaWVudCBtb25pdG9yIHRocmVhZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgTW9uaXRvclRocmVhZCBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgb3IgY2hhbmdlcyB0aGUgcG9ydCBudW1iZXIgZm9yICJkZWJ1ZyBzZWxlY3RlZCIuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgc2V0RGVidWdTZWxlY3RlZFBvcnQoaW50IHBvcnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChBbmRyb2lkRGVidWdCcmlkZ2UuZ2V0Q2xpZW50U3VwcG9ydCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURlYnVnU2VsZWN0ZWRDaGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkNoYW5naW5nIGRlYnVnLXNlbGVjdGVkIHBvcnQgdG8gIiArIHBvcnQpOwotICAgICAgICAgICAgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0ID0gcG9ydDsKLSAgICAgICAgICAgIHdha2V1cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2Ugc2V0IG1OZXdEZWJ1Z1NlbGVjdGVkUG9ydCBpbnN0ZWFkIG9mIG1EZWJ1Z1NlbGVjdGVkUG9ydCBzbyB0aGF0IGl0J3MgYXV0b21hdGljYWxseQotICAgICAgICAgICAgLy8gb3BlbmVkIG9uIHRoZSBmaXJzdCBydW4gbG9vcC4KLSAgICAgICAgICAgIG1OZXdEZWJ1Z1NlbGVjdGVkUG9ydCA9IHBvcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjbGllbnQgdG8gYWNjZXB0IGRlYnVnZ2VyIGNvbm5lY3Rpb24gb24gdGhlIGN1c3RvbSAiU2VsZWN0ZWQgZGVidWcgcG9ydCIuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkQ2xpZW50IHRoZSBjbGllbnQuIENhbiBiZSBudWxsLgotICAgICAqLwotICAgIHN5bmNocm9uaXplZCB2b2lkIHNldFNlbGVjdGVkQ2xpZW50KENsaWVudCBzZWxlY3RlZENsaWVudCkgewotICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRDbGllbnQgIT0gc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgICAgIENsaWVudCBvbGRDbGllbnQgPSBtU2VsZWN0ZWRDbGllbnQ7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRDbGllbnQgPSBzZWxlY3RlZENsaWVudDsKLQotICAgICAgICAgICAgaWYgKG9sZENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2xkQ2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX1BPUlQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDbGllbnQudXBkYXRlKENsaWVudC5DSEFOR0VfUE9SVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgYWNjZXB0aW5nIGRlYnVnZ2VyIGNvbm5lY3Rpb24gb24gdGhlIGN1c3RvbSAiU2VsZWN0ZWQgZGVidWcgcG9ydCIuCi0gICAgICovCi0gICAgQ2xpZW50IGdldFNlbGVjdGVkQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdGVkQ2xpZW50OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyAidHJ1ZSIgaWYgd2Ugd2FudCB0byByZXRyeSBjb25uZWN0aW9ucyB0byBjbGllbnRzIGlmIHdlIGdldCBhIGJhZAotICAgICAqIEpEV1AgaGFuZHNoYWtlIGJhY2ssICJmYWxzZSIgaWYgd2Ugd2FudCB0byBqdXN0IG1hcmsgdGhlbSBhcyBiYWQgYW5kCi0gICAgICogbGVhdmUgdGhlbSBhbG9uZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGdldFJldHJ5T25CYWRIYW5kc2hha2UoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBUT0RPPyBtYWtlIGNvbmZpZ3VyYWJsZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBhcnJheSBvZiBrbm93biBjbGllbnRzLgotICAgICAqLwotICAgIENsaWVudFtdIGdldENsaWVudHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudExpc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpZW50TGlzdC50b0FycmF5KG5ldyBDbGllbnRbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgImhhbmRsZXIiIGFzIHRoZSBoYW5kbGVyIGZvciB0eXBlICJ0eXBlIi4KLSAgICAgKi8KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckNodW5rSGFuZGxlcihpbnQgdHlwZSwgQ2h1bmtIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgaWYgKG1JbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1IYW5kbGVyTWFwKSB7Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXJNYXAuZ2V0KHR5cGUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlck1hcC5wdXQodHlwZSwgaGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYXRjaCBmb3IgYWN0aXZpdHkgZnJvbSBjbGllbnRzIGFuZCBkZWJ1Z2dlcnMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBMb2cuZCgiZGRtcyIsICJNb25pdG9yIGlzIHVwIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgc2VsZWN0b3IKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwgImRkbXMiLAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgTW9uaXRvciBUaHJlYWQ6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghbVF1aXQpIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHN5bmMgd2l0aCBuZXcgcmVnaXN0cmF0aW9uczogd2Ugd2FpdCB1bnRpbCBhZGRDbGllbnQgaXMgZG9uZSBiZWZvcmUgZ29pbmcgdGhyb3VnaAotICAgICAgICAgICAgICAgICAqIGFuZCBkb2luZyBtU2VsZWN0b3Iuc2VsZWN0KCkgYWdhaW4uCi0gICAgICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgI2FkZENsaWVudChDbGllbnQpfQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudExpc3QpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAocmUtKW9wZW4gdGhlICJkZWJ1ZyBzZWxlY3RlZCIgcG9ydCwgaWYgaXQncyBub3Qgb3BlbmVkIHlldCBvcgotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwb3J0IGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRDbGllbnRTdXBwb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobURlYnVnU2VsZWN0ZWRDaGFuID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0ICE9IG1EZWJ1Z1NlbGVjdGVkUG9ydCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3BlbkRlYnVnU2VsZWN0ZWRQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlYnVnU2VsZWN0ZWRQb3J0ID0gbU5ld0RlYnVnU2VsZWN0ZWRQb3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZSgiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZW9wZW4gZGVidWcgcG9ydCBmb3IgU2VsZWN0ZWQgQ2xpZW50IHRvOiAiICsgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLCBpb2UpOwotICAgICAgICAgICAgICAgICAgICBtTmV3RGVidWdTZWxlY3RlZFBvcnQgPSBtRGVidWdTZWxlY3RlZFBvcnQ7IC8vIG5vIHJldHJ5Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gbVNlbGVjdG9yLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGxlZEtleUV4Y2VwdGlvbiBja2UpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc29tZWJvZHkgY2FsbGVkIHdha2V1cCgpID8KLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmkoImRkbXMiLCAic2VsZWN0b3IgbG9vcGluZyIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTZXQ8U2VsZWN0aW9uS2V5PiBrZXlzID0gbVNlbGVjdG9yLnNlbGVjdGVkS2V5cygpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gaXRlciA9IGtleXMuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuYXR0YWNobWVudCgpIGluc3RhbmNlb2YgQ2xpZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsaWVudEFjdGl2aXR5KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkuYXR0YWNobWVudCgpIGluc3RhbmNlb2YgRGVidWdnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVidWdnZXJBY3Rpdml0eShrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5LmF0dGFjaG1lbnQoKSBpbnN0YW5jZW9mIE1vbml0b3JUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVidWdTZWxlY3RlZEFjdGl2aXR5KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSgiZGRtcyIsICJ1bmtub3duIGFjdGl2aXR5IGtleSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBoYXZlIG91ciB0aHJlYWQgYmUga2lsbGVkIGJlY2F1c2Ugb2YgYW55IHVuY2F1Z2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24sIHNvIHdlIGludGVyY2VwdCBhbGwgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIkV4Y2VwdGlvbiBkdXJpbmcgYWN0aXZpdHkgZnJvbSBTZWxlY3Rvci4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSBvdXIgdGhyZWFkIGJlIGtpbGxlZCBiZWNhdXNlIG9mIGFueSB1bmNhdWdodAotICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiwgc28gd2UgaW50ZXJjZXB0IGFsbCBoZXJlLgotICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgIkV4Y2VwdGlvbiBNb25pdG9yVGhyZWFkLnJ1bigpIik7Ci0gICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9ydCBvbiB3aGljaCB0aGUgc2VsZWN0ZWQgY2xpZW50IGxpc3RlbiBmb3IgZGVidWdnZXIKLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVidWdTZWxlY3RlZFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBtRGVidWdTZWxlY3RlZFBvcnQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTb21ldGhpbmcgaGFwcGVuZWQuIEZpZ3VyZSBvdXQgd2hhdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NsaWVudEFjdGl2aXR5KFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgICAgQ2xpZW50IGNsaWVudCA9IChDbGllbnQpa2V5LmF0dGFjaG1lbnQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGtleS5pc1JlYWRhYmxlKCkgPT0gZmFsc2UgfHwga2V5LmlzVmFsaWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkludmFsaWQga2V5IGZyb20gIiArIGNsaWVudCArICIuIERyb3BwaW5nIGNsaWVudC4iKTsKLSAgICAgICAgICAgICAgICBkcm9wQ2xpZW50KGNsaWVudCwgdHJ1ZSAvKiBub3RpZnkgKi8pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xpZW50LnJlYWQoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFNlZSBpZiB3ZSBoYXZlIGEgZnVsbCBwYWNrZXQgaW4gdGhlIGJ1ZmZlci4gSXQncyBwb3NzaWJsZSB3ZSBoYXZlCi0gICAgICAgICAgICAgKiBtb3JlIHRoYW4gb25lIHBhY2tldCwgc28gd2UgaGF2ZSB0byBsb29wLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBKZHdwUGFja2V0IHBhY2tldCA9IGNsaWVudC5nZXRKZHdwUGFja2V0KCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFja2V0LmlzRGRtUGFja2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdW5zb2xpY2l0ZWQgRERNIHJlcXVlc3QgLSBoYW5kIGl0IG9mZgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIXBhY2tldC5pc1JlcGx5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVyKGNsaWVudCwgcGFja2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0LmNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhY2tldC5pc1JlcGx5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGNsaWVudC5pc1Jlc3BvbnNlVG9VcyhwYWNrZXQuZ2V0SWQoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyByZXBseSB0byBlYXJsaWVyIERETSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIENodW5rSGFuZGxlciBoYW5kbGVyID0gY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzUmVzcG9uc2VUb1VzKHBhY2tldC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2tldC5pc0Vycm9yKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucGFja2V0RmFpbGVkKHBhY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhY2tldC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJHb3QgZW1wdHkgcmVwbHkgZm9yIDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocGFja2V0LmdldElkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tICIgKyBjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsSGFuZGxlcihjbGllbnQsIHBhY2tldCwgaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldC5jb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVSZXF1ZXN0SWQocGFja2V0LmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KCJkZG1zIiwgIkZvcndhcmRpbmcgY2xpZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChwYWNrZXQuaXNSZXBseSgpID8gInJlcGx5IiA6ICJldmVudCIpICsgIiAweCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocGFja2V0LmdldElkKCkpICsgIiB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGllbnQuZ2V0RGVidWdnZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5mb3J3YXJkUGFja2V0VG9EZWJ1Z2dlcihwYWNrZXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZpbmQgbmV4dAotICAgICAgICAgICAgICAgIHBhY2tldCA9IGNsaWVudC5nZXRKZHdwUGFja2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENhbmNlbGxlZEtleUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBrZXkgd2FzIGNhbmNlbGVkIHByb2JhYmx5IGR1ZSB0byBhIGRpc2Nvbm5lY3RlZCBjbGllbnQgYmVmb3JlIHdlIGNvdWxkCi0gICAgICAgICAgICAvLyByZWFkIHN0dWZmIGNvbWluZyBmcm9tIHRoZSBjbGllbnQsIHNvIHdlIGRyb3AgaXQuCi0gICAgICAgICAgICBkcm9wQ2xpZW50KGNsaWVudCwgdHJ1ZSAvKiBub3RpZnkgKi8pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gc29tZXRoaW5nIGNsb3NlZCBkb3duLCBubyBuZWVkIHRvIHByaW50IGFueXRoaW5nLiBUaGUgY2xpZW50IGlzIHNpbXBseSBkcm9wcGVkLgotICAgICAgICAgICAgZHJvcENsaWVudChjbGllbnQsIHRydWUgLyogbm90aWZ5ICovKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZSgiZGRtcyIsIGV4KTsKLQotICAgICAgICAgICAgLyogY2xvc2UgdGhlIGNsaWVudDsgYXV0b21hdGljYWxseSB1bi1yZWdpc3RlcnMgZnJvbSBzZWxlY3RvciAqLwotICAgICAgICAgICAgZHJvcENsaWVudChjbGllbnQsIHRydWUgLyogbm90aWZ5ICovKTsKLQotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2xpZW50IGRhdGEgcGFja2V0IGV4Y2VlZGVkIG1heGltdW0gYnVmZmVyIHNpemUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsaWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBkaXNwbGF5IGl0Ci0gICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb2Nlc3MgYW4gaW5jb21pbmcgRERNIHBhY2tldC4gSWYgdGhpcyBpcyBhIHJlcGx5IHRvIGFuIGVhcmxpZXIgcmVxdWVzdCwKLSAgICAgKiAiaGFuZGxlciIgd2lsbCBiZSBzZXQgdG8gdGhlIGhhbmRsZXIgcmVzcG9uc2libGUgZm9yIHRoZSBvcmlnaW5hbAotICAgICAqIHJlcXVlc3QuIFRoZSBzcGVjIGFsbG93cyBhIEpEV1AgbWVzc2FnZSB0byBpbmNsdWRlIG11bHRpcGxlIERETSBjaHVua3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxIYW5kbGVyKENsaWVudCBjbGllbnQsIEpkd3BQYWNrZXQgcGFja2V0LAotICAgICAgICAgICAgQ2h1bmtIYW5kbGVyIGhhbmRsZXIpIHsKLQotICAgICAgICAvLyBvbiBmaXJzdCBERE0gcGFja2V0IHJlY2VpdmVkLCBicm9hZGNhc3QgYSAicmVhZHkiIG1lc3NhZ2UKLSAgICAgICAgaWYgKCFjbGllbnQuZGRtU2VlbigpKQotICAgICAgICAgICAgYnJvYWRjYXN0KENMSUVOVF9SRUFEWSwgY2xpZW50KTsKLQotICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IHBhY2tldC5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIGludCB0eXBlLCBsZW5ndGg7Ci0gICAgICAgIGJvb2xlYW4gcmVwbHkgPSB0cnVlOwotCi0gICAgICAgIHR5cGUgPSBidWYuZ2V0SW50KCk7Ci0gICAgICAgIGxlbmd0aCA9IGJ1Zi5nZXRJbnQoKTsKLQotICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBub3QgYSByZXBseSwgZmlndXJlIG91dCB3aG8gd2FudHMgaXQKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUhhbmRsZXJNYXApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyID0gbUhhbmRsZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICAgICAgICAgIHJlcGx5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudygiZGRtcyIsICJSZWNlaXZlZCB1bnN1cHBvcnRlZCBjaHVuayB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgKyBDaHVua0hhbmRsZXIubmFtZSh0eXBlKSArICIgKGxlbj0iICsgbGVuZ3RoICsgIikiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkNhbGxpbmcgaGFuZGxlciBmb3IgIiArIENodW5rSGFuZGxlci5uYW1lKHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICsgIiBbIiArIGhhbmRsZXIgKyAiXSAobGVuPSIgKyBsZW5ndGggKyAiKSIpOwotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpYnVmID0gYnVmLnNsaWNlKCk7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIHJvQnVmID0gaWJ1Zi5hc1JlYWRPbmx5QnVmZmVyKCk7IC8vIGVuZm9yY2UgUi9PCi0gICAgICAgICAgICByb0J1Zi5vcmRlcihDaHVua0hhbmRsZXIuQ0hVTktfT1JERVIpOwotICAgICAgICAgICAgLy8gZG8gdGhlIGhhbmRsaW5nIG9mIHRoZSBjaHVuayBzeW5jaHJvbml6ZWQgb24gdGhlIGNsaWVudCBsaXN0Ci0gICAgICAgICAgICAvLyB0byBiZSBzdXJlIHRoZXJlJ3Mgbm8gY29uY3VycmVuY3kgaXNzdWUgd2hlbiB3ZSBsb29rIGZvciBIT01FCi0gICAgICAgICAgICAvLyBpbiBoYXNBcHAoKQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2xpZW50TGlzdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlQ2h1bmsoY2xpZW50LCB0eXBlLCByb0J1ZiwgcmVwbHksIHBhY2tldC5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERyb3BzIGEgY2xpZW50IGZyb20gdGhlIG1vbml0b3IuCi0gICAgICogPHAvPlRoaXMgd2lsbCBsb2NrIHRoZSB7QGxpbmsgQ2xpZW50fSBsaXN0IG9mIHRoZSB7QGxpbmsgRGV2aWNlfSBydW5uaW5nIDx2YXI+Y2xpZW50PC92YXI+LgotICAgICAqIEBwYXJhbSBjbGllbnQKLSAgICAgKiBAcGFyYW0gbm90aWZ5Ci0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgZHJvcENsaWVudChDbGllbnQgY2xpZW50LCBib29sZWFuIG5vdGlmeSkgewotICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudExpc3QpIHsKLSAgICAgICAgICAgIGlmIChtQ2xpZW50TGlzdC5yZW1vdmUoY2xpZW50KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjbGllbnQuY2xvc2Uobm90aWZ5KTsKLSAgICAgICAgYnJvYWRjYXN0KENMSUVOVF9ESVNDT05ORUNURUQsIGNsaWVudCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogaHR0cDovL2ZvcnVtLmphdmEuc3VuLmNvbS90aHJlYWQuanNwYT90aHJlYWRJRD03MjY3MTUmc3RhcnQ9MAotICAgICAgICAgKiBodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD01MDczNTA0Ci0gICAgICAgICAqLwotICAgICAgICB3YWtldXAoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb2Nlc3MgYWN0aXZpdHkgZnJvbSBvbmUgb2YgdGhlIGRlYnVnZ2VyIHNvY2tldHMuIFRoaXMgY291bGQgYmUgYSBuZXcKLSAgICAgKiBjb25uZWN0aW9uIG9yIGEgZGF0YSBwYWNrZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWJ1Z2dlckFjdGl2aXR5KFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgICAgRGVidWdnZXIgZGJnID0gKERlYnVnZ2VyKWtleS5hdHRhY2htZW50KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChrZXkuaXNBY2NlcHRhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhY2NlcHROZXdEZWJ1Z2dlcihkYmcsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJkZWJ1Z2dlciBhY2NlcHQoKSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmlzUmVhZGFibGUoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWJ1Z2dlckRhdGEoa2V5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoImRkbS1kZWJ1Z2dlciIsICJrZXkgaW4gdW5rbm93biBzdGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDYW5jZWxsZWRLZXlFeGNlcHRpb24gY2tlKSB7Ci0gICAgICAgICAgICAvLyBrZXkgaGFzIGJlZW4gY2FuY2VsbGVkIHdlIGNhbiBpZ25vcmUgdGhhdC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQWNjZXB0IGEgbmV3IGNvbm5lY3Rpb24gZnJvbSBhIGRlYnVnZ2VyLiBJZiBzdWNjZXNzZnVsLCByZWdpc3RlciBpdCB3aXRoCi0gICAgICogdGhlIFNlbGVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhY2NlcHROZXdEZWJ1Z2dlcihEZWJ1Z2dlciBkYmcsIFNlcnZlclNvY2tldENoYW5uZWwgYWNjZXB0Q2hhbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtQ2xpZW50TGlzdCkgewotICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBjaGFuOwotCi0gICAgICAgICAgICBpZiAoYWNjZXB0Q2hhbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNoYW4gPSBkYmcuYWNjZXB0KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY2hhbiA9IGRiZy5hY2NlcHQoYWNjZXB0Q2hhbik7Ci0KLSAgICAgICAgICAgIGlmIChjaGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFuLnNvY2tldCgpLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICB3YWtldXAoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW4ucmVnaXN0ZXIobVNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCwgZGJnKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkLCBkcm9wIHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGRiZy5jbG9zZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkLCBkcm9wIHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGRiZy5jbG9zZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsICJpZ25vcmluZyBkdXBsaWNhdGUgZGVidWdnZXIiKTsKLSAgICAgICAgICAgICAgICAvLyBuZXcgY29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBoYXZlIGluY29taW5nIGRhdGEgZnJvbSB0aGUgZGVidWdnZXIuIEZvcndhcmQgaXQgdG8gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RlYnVnZ2VyRGF0YShTZWxlY3Rpb25LZXkga2V5KSB7Ci0gICAgICAgIERlYnVnZ2VyIGRiZyA9IChEZWJ1Z2dlcilrZXkuYXR0YWNobWVudCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVhZCBwZW5kaW5nIGRhdGEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGRiZy5yZWFkKCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZWUgaWYgd2UgaGF2ZSBhIGZ1bGwgcGFja2V0IGluIHRoZSBidWZmZXIuIEl0J3MgcG9zc2libGUgd2UgaGF2ZQotICAgICAgICAgICAgICogbW9yZSB0aGFuIG9uZSBwYWNrZXQsIHNvIHdlIGhhdmUgdG8gbG9vcC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgSmR3cFBhY2tldCBwYWNrZXQgPSBkYmcuZ2V0SmR3cFBhY2tldCgpOwotICAgICAgICAgICAgd2hpbGUgKHBhY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoImRkbXMiLCAiRm9yd2FyZGluZyBkYmcgcmVxIDB4IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhY2tldC5nZXRJZCgpKSArICIgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBkYmcuZ2V0Q2xpZW50KCkpOwotCi0gICAgICAgICAgICAgICAgZGJnLmZvcndhcmRQYWNrZXRUb0NsaWVudChwYWNrZXQpOwotCi0gICAgICAgICAgICAgICAgcGFja2V0ID0gZGJnLmdldEpkd3BQYWNrZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2xvc2UgZGF0YSBjb25uZWN0aW9uOyBhdXRvbWF0aWNhbGx5IHVuLXJlZ2lzdGVycyBkYmcgZnJvbQotICAgICAgICAgICAgICogc2VsZWN0b3IuIFRoZSBmYWlsdXJlIGNvdWxkIGJlIGNhdXNlZCBieSB0aGUgZGVidWdnZXIgZ29pbmcgYXdheSwKLSAgICAgICAgICAgICAqIG9yIGJ5IHRoZSBjbGllbnQgZ29pbmcgYXdheSBhbmQgZmFpbGluZyB0byBhY2NlcHQgb3VyIGRhdGEuCi0gICAgICAgICAgICAgKiBFaXRoZXIgd2F5LCB0aGUgZGVidWdnZXIgY29ubmVjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGV4aXN0IGFueQotICAgICAgICAgICAgICogbG9uZ2VyLiBXZSBhbHNvIG5lZWQgdG8gcmVjeWNsZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LCBzbwotICAgICAgICAgICAgICogdGhhdCB0aGUgVk0gc2VlcyB0aGUgZGVidWdnZXIgZGlzY29ubmVjdC4gRm9yIGEgRERNLWF3YXJlIGNsaWVudAotICAgICAgICAgICAgICogdGhpcyB3b24ndCBiZSBuZWNlc3NhcnksIGFuZCB3ZSBjYW4ganVzdCBzZW5kIGEgImRlYnVnZ2VyCi0gICAgICAgICAgICAgKiBkaXNjb25uZWN0ZWQiIG1lc3NhZ2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIkNsb3NpbmcgY29ubmVjdGlvbiB0byBkZWJ1Z2dlciAiICsgZGJnKTsKLSAgICAgICAgICAgIGRiZy5jbG9zZURhdGEoKTsKLSAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBkYmcuZ2V0Q2xpZW50KCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmlzRGRtQXdhcmUoKSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNvZnQtZGlzY29ubmVjdCBERE0tYXdhcmUgY2xpZW50cwotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIiAocmVjeWNsaW5nIGNsaWVudCBjb25uZWN0aW9uIGFzIHdlbGwpIik7Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgZHJvcCB0aGUgY2xpZW50LCBidXQgYWxzbyBhdHRlbXB0IHRvIHJlb3BlbiBpdC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgYnkgdGhlIERldmljZU1vbml0b3IuCi0gICAgICAgICAgICAgICAgY2xpZW50LmdldERldmljZUltcGwoKS5nZXRNb25pdG9yKCkuYWRkQ2xpZW50VG9Ecm9wQW5kUmVvcGVuKGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElEZWJ1Z1BvcnRQcm92aWRlci5OT19TVEFUSUNfUE9SVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKCJkZG1zIiwgIiAocmVjeWNsaW5nIGNsaWVudCBjb25uZWN0aW9uIGFzIHdlbGwpIik7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGRyb3AgdGhlIGNsaWVudCwgYnV0IGFsc28gYXR0ZW1wdCB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGJ5IHRoZSBEZXZpY2VNb25pdG9yLgotICAgICAgICAgICAgICAgIGNsaWVudC5nZXREZXZpY2VJbXBsKCkuZ2V0TW9uaXRvcigpLmFkZENsaWVudFRvRHJvcEFuZFJlb3BlbihjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJRGVidWdQb3J0UHJvdmlkZXIuTk9fU1RBVElDX1BPUlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUZWxsIHRoZSB0aHJlYWQgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdha2V1cCgpIHsKLSAgICAgICAgbVNlbGVjdG9yLndha2V1cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlbGwgdGhlIHRocmVhZCB0byBzdG9wLiBDYWxsZWQgZnJvbSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgcXVpdCgpIHsKLSAgICAgICAgbVF1aXQgPSB0cnVlOwotICAgICAgICB3YWtldXAoKTsKLSAgICAgICAgTG9nLmQoImRkbXMiLCAiV2FpdGluZyBmb3IgTW9uaXRvciB0aHJlYWQiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuam9pbigpOwotICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgcXVpdHRpbmcsIGxldHMgZHJvcCBhbGwgdGhlIGNsaWVudCBhbmQgZGlzY29ubmVjdAotICAgICAgICAgICAgLy8gdGhlIERlYnVnU2VsZWN0ZWRQb3J0Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DbGllbnRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDbGllbnQgYyA6IG1DbGllbnRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoZmFsc2UgLyogbm90aWZ5ICovKTsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0KENMSUVOVF9ESVNDT05ORUNURUQsIGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2xpZW50TGlzdC5jbGVhcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURlYnVnU2VsZWN0ZWRDaGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4uc29ja2V0KCkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBpZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JbnN0YW5jZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbmV3IENsaWVudCB0byB0aGUgbGlzdCBvZiB0aGluZ3Mgd2UgbW9uaXRvci4gQWxzbyBhZGRzIHRoZSBjbGllbnQncwotICAgICAqIGNoYW5uZWwgYW5kIHRoZSBjbGllbnQncyBkZWJ1Z2dlciBsaXN0ZW5lciB0byB0aGUgc2VsZWN0aW9uIGxpc3QuIFRoaXMKLSAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBvbmUgdGhyZWFkICh0aGUgVk1XYXRjaGVyVGhyZWFkKSB0byBhdm9pZCBhCi0gICAgICogcmFjZSBiZXR3ZWVuICJhbHJlYWR5T3BlbiIgYW5kIENsaWVudCBjcmVhdGlvbi4KLSAgICAgKi8KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgewotICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExvZy5kKCJkZG1zIiwgIkFkZGluZyBuZXcgY2xpZW50ICIgKyBjbGllbnQpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUNsaWVudExpc3QpIHsKLSAgICAgICAgICAgIG1DbGllbnRMaXN0LmFkZChjbGllbnQpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVnaXN0ZXIgdGhlIENsaWVudCdzIHNvY2tldCBjaGFubmVsIHdpdGggdGhlIHNlbGVjdG9yLiBXZSBhdHRhY2gKLSAgICAgICAgICAgICAqIHRoZSBDbGllbnQgdG8gdGhlIFNlbGVjdGlvbktleS4gSWYgeW91IHRyeSB0byByZWdpc3RlciBhIG5ldwotICAgICAgICAgICAgICogY2hhbm5lbCB3aXRoIHRoZSBTZWxlY3RvciB3aGlsZSBpdCBpcyB3YWl0aW5nIGZvciBJL08sIHlvdSB3aWxsCi0gICAgICAgICAgICAgKiBibG9jay4gVGhlIHNvbHV0aW9uIGlzIHRvIGNhbGwgd2FrZXVwKCkgYW5kIHRoZW4gaG9sZCBhIGxvY2sgdG8KLSAgICAgICAgICAgICAqIGVuc3VyZSB0aGF0IHRoZSByZWdpc3RyYXRpb24gaGFwcGVucyBiZWZvcmUgdGhlIFNlbGVjdG9yIGdvZXMKLSAgICAgICAgICAgICAqIGJhY2sgdG8gc2xlZXAuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2FrZXVwKCk7Ci0KLSAgICAgICAgICAgICAgICBjbGllbnQucmVnaXN0ZXIobVNlbGVjdG9yKTsKLQotICAgICAgICAgICAgICAgIERlYnVnZ2VyIGRiZyA9IGNsaWVudC5nZXREZWJ1Z2dlcigpOwotICAgICAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkYmcucmVnaXN0ZXJMaXN0ZW5lcihtU2VsZWN0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIC8vIG5vdCByZWFsbHkgZXhwZWN0aW5nIHRoaXMgdG8gaGFwcGVuCi0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBCcm9hZGNhc3QgYW4gZXZlbnQgdG8gYWxsIG1lc3NhZ2UgaGFuZGxlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdChpbnQgZXZlbnQsIENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgTG9nLmQoImRkbXMiLCAiYnJvYWRjYXN0ICIgKyBldmVudCArICI6ICIgKyBjbGllbnQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBoYW5kbGVyIG9iamVjdHMgYXBwZWFyIG9uY2UgaW4gbUhhbmRsZXJNYXAgZm9yIGVhY2ggbWVzc2FnZSB0aGV5Ci0gICAgICAgICAqIGhhbmRsZS4gV2Ugd2FudCB0byBub3RpZnkgdGhlbSBvbmNlIGVhY2gsIHNvIHdlIGNvbnZlcnQgdGhlIEhhc2hNYXAKLSAgICAgICAgICogdG8gYSBIYXNoU2V0IGJlZm9yZSB3ZSBpdGVyYXRlLgotICAgICAgICAgKi8KLSAgICAgICAgSGFzaFNldDxDaHVua0hhbmRsZXI+IHNldDsKLSAgICAgICAgc3luY2hyb25pemVkIChtSGFuZGxlck1hcCkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxDaHVua0hhbmRsZXI+IHZhbHVlcyA9IG1IYW5kbGVyTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgc2V0ID0gbmV3IEhhc2hTZXQ8Q2h1bmtIYW5kbGVyPih2YWx1ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3I8Q2h1bmtIYW5kbGVyPiBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ2h1bmtIYW5kbGVyIGhhbmRsZXIgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9SRUFEWToKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2xpZW50UmVhZHkoY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkIHdpdGggdGhlIGNsaWVudC4gSXQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIG91dCBvZiB0aGUgbGlzdCB0aGUgbmV4dCB0aW1lIHdlIHRyeSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggaXQsIHNvIHdlIGRpc2NhcmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gaGVyZSBhbmQgYXNzdW1lIGNsZWFudXAgd2lsbCBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVyLiBNYXkgbmVlZCB0byBwcm9wYWdhdGUgZmFydGhlci4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cm91YmxlIGlzIHRoYXQgbm90IGFsbCB2YWx1ZXMgZm9yICJldmVudCIgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudygiZGRtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgZXhjZXB0aW9uIHdoaWxlIGJyb2FkY2FzdGluZyAncmVhZHknIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNsaWVudERpc2Nvbm5lY3RlZChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgKG9yIHJlb3BlbnMpIHRoZSAiZGVidWcgc2VsZWN0ZWQiIHBvcnQgYW5kIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3J0IHdhcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVvcGVuRGVidWdTZWxlY3RlZFBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIExvZy5kKCJkZG1zIiwgInJlb3BlbiBkZWJ1Zy1zZWxlY3RlZCBwb3J0OiAiICsgbU5ld0RlYnVnU2VsZWN0ZWRQb3J0KTsKLSAgICAgICAgaWYgKG1EZWJ1Z1NlbGVjdGVkQ2hhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4uY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EZWJ1Z1NlbGVjdGVkQ2hhbiA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOwotICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4uY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOyAvLyByZXF1aXJlZCBmb3IgU2VsZWN0b3IKLQotICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAotICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgibG9jYWxob3N0IiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtTmV3RGVidWdTZWxlY3RlZFBvcnQpOwotICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4uc29ja2V0KCkuc2V0UmV1c2VBZGRyZXNzKHRydWUpOyAvLyBlbmFibGUgU09fUkVVU0VBRERSCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EZWJ1Z1NlbGVjdGVkQ2hhbi5zb2NrZXQoKS5iaW5kKGFkZHIpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkQ2xpZW50LnVwZGF0ZShDbGllbnQuQ0hBTkdFX1BPUlQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGVidWdTZWxlY3RlZENoYW4ucmVnaXN0ZXIobVNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfQUNDRVBULCB0aGlzKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubmV0LkJpbmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheURlYnVnU2VsZWN0ZWRCaW5kRXJyb3IobU5ld0RlYnVnU2VsZWN0ZWRQb3J0KTsKLQotICAgICAgICAgICAgLy8gZG8gbm90IGF0dGVtcHQgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgbURlYnVnU2VsZWN0ZWRDaGFuID0gbnVsbDsKLSAgICAgICAgICAgIG1OZXdEZWJ1Z1NlbGVjdGVkUG9ydCA9IC0xOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlIGhhdmUgc29tZSBhY3Rpdml0eSBvbiB0aGUgImRlYnVnIHNlbGVjdGVkIiBwb3J0LiBIYW5kbGUgaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWJ1Z1NlbGVjdGVkQWN0aXZpdHkoU2VsZWN0aW9uS2V5IGtleSkgewotICAgICAgICBhc3NlcnQga2V5LmlzQWNjZXB0YWJsZSgpOwotCi0gICAgICAgIFNlcnZlclNvY2tldENoYW5uZWwgYWNjZXB0Q2hhbiA9IChTZXJ2ZXJTb2NrZXRDaGFubmVsKWtleS5jaGFubmVsKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmluZCB0aGUgZGVidWdnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgY2xpZW50LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1TZWxlY3RlZENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEZWJ1Z2dlciBkYmcgPSBtU2VsZWN0ZWRDbGllbnQuZ2V0RGVidWdnZXIoKTsKLQotICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoImRkbXMiLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24gb24gJ2RlYnVnIHNlbGVjdGVkJyBwb3J0Iik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXB0TmV3RGVidWdnZXIoZGJnLCBhY2NlcHRDaGFuKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHNob3VsZCBiZSBnb25lLCBrZWVwIGdvaW5nCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLncoImRkbXMiLAotICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIG9uICdkZWJ1ZyBzZWxlY3RlZCcgcG9ydCwgYnV0IG5vbmUgc2VsZWN0ZWQiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNvY2tldENoYW5uZWwgY2hhbiA9IGFjY2VwdENoYW4uYWNjZXB0KCk7Ci0gICAgICAgICAgICBjaGFuLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgLy8gbm90IGV4cGVjdGVkOyBjbGllbnQgc2hvdWxkIGJlIGdvbmUsIGtlZXAgZ29pbmcKLSAgICAgICAgfSBjYXRjaCAoTm90WWV0Qm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZGlzcGxheURlYnVnU2VsZWN0ZWRCaW5kRXJyb3IobURlYnVnU2VsZWN0ZWRQb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5RGVidWdTZWxlY3RlZEJpbmRFcnJvcihpbnQgcG9ydCkgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvcGVuIFNlbGVjdGVkIFZNIGRlYnVnIHBvcnQgKCUxJGQpLiBNYWtlIHN1cmUgeW91IGRvIG5vdCBoYXZlIGFub3RoZXIgaW5zdGFuY2Ugb2YgRERNUyBvciBvZiB0aGUgZWNsaXBzZSBwbHVnaW4gcnVubmluZy4gSWYgaXQncyBiZWluZyB1c2VkIGJ5IHNvbWV0aGluZyBlbHNlLCBjaG9vc2UgYSBuZXcgcG9ydCBudW1iZXIgaW4gdGhlIHByZWZlcmVuY2VzLiIsCi0gICAgICAgICAgICAgICAgcG9ydCk7Ci0KLSAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsICJkZG1zIiwgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL011bHRpTGluZVJlY2VpdmVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvTXVsdGlMaW5lUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkYmIwNS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvTXVsdGlMaW5lUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBCYXNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU2hlbGxPdXRwdXRSZWNlaXZlcn0sIHRoYXQgdGFrZXMgdGhlIHJhdyBkYXRhIGNvbWluZyBmcm9tIHRoZQotICogc29ja2V0LCBhbmQgY29udmVydCBpdCBpbnRvIHtAbGluayBTdHJpbmd9IG9iamVjdHMuCi0gKiA8cC8+QWRkaXRpb25hbGx5LCBpdCBzcGxpdHMgdGhlIHN0cmluZyBieSBsaW5lcy4KLSAqIDxwLz5DbGFzc2VzIGV4dGVuZGluZyBpdCBtdXN0IGltcGxlbWVudCB7QGxpbmsgI3Byb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSl9IHdoaWNoIHJlY2VpdmVzCi0gKiBuZXcgcGFyc2VkIGxpbmVzIGFzIHRoZXkgYmVjb21lIGF2YWlsYWJsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpTGluZVJlY2VpdmVyIGltcGxlbWVudHMgSVNoZWxsT3V0cHV0UmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UcmltTGluZXMgPSB0cnVlOwotCi0gICAgLyoqIHVuZmluaXNoZWQgbWVzc2FnZSBsaW5lLCBzdG9yZWQgZm9yIG5leHQgcGFja2V0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVVuZmluaXNoZWRMaW5lID0gbnVsbDsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbUFycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRyaW0gbGluZXMgZmxhZy4KLSAgICAgKiBAcGFyYW0gdHJpbSBoZXRoZXIgdGhlIGxpbmVzIGFyZSB0cmltbWVkLCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJpbUxpbmUoYm9vbGVhbiB0cmltKSB7Ci0gICAgICAgIG1UcmltTGluZXMgPSB0cmltOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5hZGIuSVNoZWxsT3V0cHV0UmVjZWl2ZXIjYWRkT3V0cHV0KAotICAgICAqICAgICAgYnl0ZVtdLCBpbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRPdXRwdXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcyA9IG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsICJJU08tODg1OS0xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vcm1hbCBlbmNvZGluZyBkaWRuJ3Qgd29yaywgdHJ5IHRoZSBkZWZhdWx0IG9uZQotICAgICAgICAgICAgICAgIHMgPSBuZXcgU3RyaW5nKGRhdGEsIG9mZnNldCxsZW5ndGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvayB3ZSd2ZSBnb3QgYSBzdHJpbmcKLSAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYWQgYW4gdW5maW5pc2hlZCBsaW5lIHdlIGFkZCBpdC4KLSAgICAgICAgICAgICAgICBpZiAobVVuZmluaXNoZWRMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcyA9IG1VbmZpbmlzaGVkTGluZSArIHM7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmZpbmlzaGVkTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHdlIHNwbGl0IHRoZSBsaW5lcwotICAgICAgICAgICAgICAgIG1BcnJheS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBzLmluZGV4T2YoIlxyXG4iLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBcclxuIHdhcyBub3QgZm91bmQsIHRoaXMgaXMgYW4gdW5maW5pc2hlZCBsaW5lCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBzdG9yZSBpdCB0byBiZSBwcm9jZXNzZWQgZm9yIHRoZSBuZXh0IHBhY2tldAotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbmZpbmlzaGVkTGluZSA9IHMuc3Vic3RyaW5nKHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZm91bmQgYSBcclxuOwotICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmltTGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQXJyYXkuYWRkKGxpbmUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RhcnQgdG8gYWZ0ZXIgdGhlIFxyXG4gd2UgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpbmRleCArIDI7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUFycmF5LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSd2ZSBzcGxpdCBhbGwgdGhlIGxpbmVzLgotICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBhcnJheQotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IG1BcnJheS50b0FycmF5KG5ldyBTdHJpbmdbbUFycmF5LnNpemUoKV0pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgaXQgZm9yIGZpbmFsIHByb2Nlc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05ld0xpbmVzKGxpbmVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuYWRiLklTaGVsbE91dHB1dFJlY2VpdmVyI2ZsdXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaCgpIHsKLSAgICAgICAgaWYgKG1VbmZpbmlzaGVkTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTmV3TGluZXMobmV3IFN0cmluZ1tdIHsgbVVuZmluaXNoZWRMaW5lIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9uZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlcm1pbmF0ZXMgdGhlIHByb2Nlc3MuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxpbmVzIGhhdmUgYmVlbiB0aHJvdWdoCi0gICAgICoge0BsaW5rICNwcm9jZXNzTmV3TGluZXMoU3RyaW5nW10pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIG5ldyBsaW5lcyBhcmUgYmVpbmcgcmVjZWl2ZWQgYnkgdGhlIHJlbW90ZSBwcm9jZXNzLgotICAgICAqIDxwLz5JdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIGxpbmVzIGFyZSBjb21wbGV0ZSB3aGVuIHRoZXkgYXJlIGdpdmVuIHRvIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBsaW5lcyBUaGUgYXJyYXkgY29udGFpbmluZyB0aGUgbmV3IGxpbmVzLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcyk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvTmF0aXZlQWxsb2NhdGlvbkluZm8uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OYXRpdmVBbGxvY2F0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZiMDA0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OYXRpdmVBbGxvY2F0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFN0b3JlcyBuYXRpdmUgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAqIDxwLz5Db250YWlucyBudW1iZXIgb2YgYWxsb2NhdGlvbnMsIHRoZWlyIHNpemUgYW5kIHRoZSBzdGFjayB0cmFjZS4KLSAqIDxwLz5Ob3RlOiB0aGUgZGRtbGliIGRvZXMgbm90IHJlc29sdmUgdGhlIHN0YWNrIHRyYWNlIGF1dG9tYXRpY2FsbHkuIFdoaWxlIHRoaXMgY2xhc3MgcHJvdmlkZXMKLSAqIHN0b3JhZ2UgZm9yIHJlc29sdmVkIHN0YWNrIHRyYWNlLCB0aGlzIGlzIG1lcmVseSBmb3IgY29udmVuaWVuY2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVBbGxvY2F0aW9uSW5mbyB7Ci0gICAgLyogY29uc3RhbnRzIGZvciBmbGFnIGJpdHMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19aWUdPVEVfQ0hJTEQgID0gKDE8PDMxKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19NQVNLICAgICAgICAgID0gKEZMQUdfWllHT1RFX0NISUxEKTsKLQotICAgIC8qKgotICAgICAqIGxpc3Qgb2YgYWxsb2MgZnVuY3Rpb25zIHRoYXQgYXJlIGZpbHRlcmVkIG91dCB3aGVuIGF0dGVtcHRpbmcgdG8gZGlzcGxheQotICAgICAqIGEgcmVsZXZhbnQgbWV0aG9kIHJlc3BvbnNpYmxlIGZvciBhbiBhbGxvY2F0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFN0cmluZz4gc0FsbG9jRnVuY3Rpb25GaWx0ZXI7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgc0FsbG9jRnVuY3Rpb25GaWx0ZXIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgc0FsbG9jRnVuY3Rpb25GaWx0ZXIuYWRkKCJtYWxsb2MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzQWxsb2NGdW5jdGlvbkZpbHRlci5hZGQoImNhbGxvYyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbGxvY0Z1bmN0aW9uRmlsdGVyLmFkZCgicmVhbGxvYyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbGxvY0Z1bmN0aW9uRmlsdGVyLmFkZCgiZ2V0X2JhY2t0cmFjZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbGxvY0Z1bmN0aW9uRmlsdGVyLmFkZCgiZ2V0X2hhc2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzQWxsb2NGdW5jdGlvbkZpbHRlci5hZGQoIj8/Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc0FsbG9jRnVuY3Rpb25GaWx0ZXIuYWRkKCJpbnRlcm5hbF9mcmVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc0FsbG9jRnVuY3Rpb25GaWx0ZXIuYWRkKCJvcGVyYXRvciBuZXciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzQWxsb2NGdW5jdGlvbkZpbHRlci5hZGQoImxlYWtfZnJlZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbGxvY0Z1bmN0aW9uRmlsdGVyLmFkZCgiY2hrX2ZyZWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzQWxsb2NGdW5jdGlvbkZpbHRlci5hZGQoImNoa19tZW1hbGlnbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbGxvY0Z1bmN0aW9uRmlsdGVyLmFkZCgiTWFsbG9jIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtU2l6ZTsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNaeWdvdGVDaGlsZDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1BbGxvY2F0aW9uczsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExvbmc+IG1TdGFja0NhbGxBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxOYXRpdmVTdGFja0NhbGxJbmZvPiBtUmVzb2x2ZWRTdGFja0NhbGwgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0YWNrQ2FsbFJlc29sdmVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBOYXRpdmVBbGxvY2F0aW9uSW5mb30uCi0gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb25zLgotICAgICAqIEBwYXJhbSBhbGxvY2F0aW9ucyB0aGUgYWxsb2NhdGlvbiBjb3VudAotICAgICAqLwotICAgIE5hdGl2ZUFsbG9jYXRpb25JbmZvKGludCBzaXplLCBpbnQgYWxsb2NhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5tU2l6ZSA9IHNpemUgJiB+RkxBR19NQVNLOwotICAgICAgICB0aGlzLm1Jc1p5Z290ZUNoaWxkID0gKChzaXplICYgRkxBR19aWUdPVEVfQ0hJTEQpICE9IDApOwotICAgICAgICB0aGlzLm1BbGxvY2F0aW9ucyA9IGFsbG9jYXRpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc3RhY2sgY2FsbCBhZGRyZXNzIGZvciB0aGlzIGFsbG9jYXRpb24uCi0gICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gYWRkLgotICAgICAqLwotICAgIHZvaWQgYWRkU3RhY2tDYWxsQWRkcmVzcyhsb25nIGFkZHJlc3MpIHsKLSAgICAgICAgbVN0YWNrQ2FsbEFkZHJlc3Nlcy5hZGQoYWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhpcyBhbGxvY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBoYXBwZW5lZCBpbiBhIGNoaWxkIG9mIHRoZSB6eWdvdGUKLSAgICAgKiBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWnlnb3RlQ2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiBtSXNaeWdvdGVDaGlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0aW9uIGNvdW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QWxsb2NhdGlvbkNvdW50KCkgewotICAgICAgICByZXR1cm4gbUFsbG9jYXRpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0YWNrIGNhbGwgYWRkcmVzc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvCi0gICAgICoge0BsaW5rIE5hdGl2ZVN0YWNrQ2FsbEluZm99IG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFja0NhbGxSZXNvbHZlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1N0YWNrQ2FsbFJlc29sdmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YWNrIGNhbGwgb2YgdGhpcyBhbGxvY2F0aW9uIGFzIHJhdyBhZGRyZXNzZXMuCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgd2hlcmUgdGhlIGFsbG9jYXRpb24gaGFwcGVuZWQuCi0gICAgICovCi0gICAgcHVibGljIExvbmdbXSBnZXRTdGFja0NhbGxBZGRyZXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhY2tDYWxsQWRkcmVzc2VzLnRvQXJyYXkobmV3IExvbmdbbVN0YWNrQ2FsbEFkZHJlc3Nlcy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVzb2x2ZWQgc3RhY2sgY2FsbCBmb3IgdGhpcyBhbGxvY2F0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiA8Y29kZT5yZXNvbHZlZFN0YWNrQ2FsbDwvY29kZT4gaXMgbm9uIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4KLSAgICAgKiB7QGxpbmsgI2lzU3RhY2tDYWxsUmVzb2x2ZWQoKX0gd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gYWZ0ZXIgdGhpcyBjYWxsLgotICAgICAqIEBwYXJhbSByZXNvbHZlZFN0YWNrQ2FsbCBUaGUgbGlzdCBvZiB7QGxpbmsgTmF0aXZlU3RhY2tDYWxsSW5mb30uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlc29sdmVkU3RhY2tDYWxsKExpc3Q8TmF0aXZlU3RhY2tDYWxsSW5mbz4gcmVzb2x2ZWRTdGFja0NhbGwpIHsKLSAgICAgICAgaWYgKG1SZXNvbHZlZFN0YWNrQ2FsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVzb2x2ZWRTdGFja0NhbGwgPSBuZXcgQXJyYXlMaXN0PE5hdGl2ZVN0YWNrQ2FsbEluZm8+KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmVzb2x2ZWRTdGFja0NhbGwuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBtUmVzb2x2ZWRTdGFja0NhbGwuYWRkQWxsKHJlc29sdmVkU3RhY2tDYWxsKTsKLSAgICAgICAgbUlzU3RhY2tDYWxsUmVzb2x2ZWQgPSBtUmVzb2x2ZWRTdGFja0NhbGwuc2l6ZSgpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgc3RhY2sgY2FsbC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBOYXRpdmVTdGFja0NhbGxJbmZvfSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3RhY2sgY2FsbAotICAgICAqIHdhcyBub3QgcmVzb2x2ZWQuCi0gICAgICogQHNlZSAjc2V0UmVzb2x2ZWRTdGFja0NhbGwoQXJyYXlMaXN0KQotICAgICAqIEBzZWUgI2lzU3RhY2tDYWxsUmVzb2x2ZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTmF0aXZlU3RhY2tDYWxsSW5mb1tdIGdldFJlc29sdmVkU3RhY2tDYWxsKCkgewotICAgICAgICBpZiAobUlzU3RhY2tDYWxsUmVzb2x2ZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzb2x2ZWRTdGFja0NhbGwudG9BcnJheShuZXcgTmF0aXZlU3RhY2tDYWxsSW5mb1ttUmVzb2x2ZWRTdGFja0NhbGwuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNvbWUgb3RoZXIgb2JqZWN0IGlzICJlcXVhbCB0byIgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIG9iaiB0aGUgcmVmZXJlbmNlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgb2JqIGFyZ3VtZW50OwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmF0aXZlQWxsb2NhdGlvbkluZm8pIHsKLSAgICAgICAgICAgIE5hdGl2ZUFsbG9jYXRpb25JbmZvIG1pID0gKE5hdGl2ZUFsbG9jYXRpb25JbmZvKW9iajsKLSAgICAgICAgICAgIC8vIHF1aWNrIGNvbXBhcmUgb2Ygc2l6ZSwgYWxsb2MsIGFuZCBzdGFja2NhbGwgc2l6ZQotICAgICAgICAgICAgaWYgKG1TaXplICE9IG1pLm1TaXplIHx8IG1BbGxvY2F0aW9ucyAhPSBtaS5tQWxsb2NhdGlvbnMgfHwKLSAgICAgICAgICAgICAgICAgICAgbVN0YWNrQ2FsbEFkZHJlc3Nlcy5zaXplKCkgIT0gbWkubVN0YWNrQ2FsbEFkZHJlc3Nlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBzdGFjayBhZGRyZXNzZXMKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1TdGFja0NhbGxBZGRyZXNzZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsb25nIGEgPSBtU3RhY2tDYWxsQWRkcmVzc2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICBsb25nIGIgPSBtaS5tU3RhY2tDYWxsQWRkcmVzc2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoYSAhPSBiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJBbGxvY2F0aW9uczogIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobUFsbG9jYXRpb25zKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlNpemU6ICIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKG1TaXplKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlRvdGFsIFNpemU6ICIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKG1TaXplICogbUFsbG9jYXRpb25zKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEl0ZXJhdG9yPExvbmc+IGFkZHJJdGVyYXRvciA9IG1TdGFja0NhbGxBZGRyZXNzZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgSXRlcmF0b3I8TmF0aXZlU3RhY2tDYWxsSW5mbz4gc291cmNlSXRlcmF0b3IgPSBtUmVzb2x2ZWRTdGFja0NhbGwuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoc291cmNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBsb25nIGFkZHIgPSBhZGRySXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgTmF0aXZlU3RhY2tDYWxsSW5mbyBzb3VyY2UgPSBzb3VyY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYWRkciA9PSAwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoc291cmNlLmdldExpbmVOdW1iZXIoKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXHQlMSQwOHhcdCUyJHMgLS0tICUzJHMgLS0tICU0JHM6JTUkZFxuIiwgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRMaWJyYXJ5TmFtZSgpLCBzb3VyY2UuZ2V0TWV0aG9kTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFNvdXJjZUZpbGUoKSwgc291cmNlLmdldExpbmVOdW1iZXIoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0JTEkMDh4XHQlMiRzIC0tLSAlMyRzIC0tLSAlNCRzXG4iLCBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldExpYnJhcnlOYW1lKCksIHNvdXJjZS5nZXRNZXRob2ROYW1lKCksIHNvdXJjZS5nZXRTb3VyY2VGaWxlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgTmF0aXZlU3RhY2tDYWxsSW5mb30gdGhhdCBpcyByZWxldmFudC4KLSAgICAgKiA8cC8+Ci0gICAgICogQSByZWxldmFudCA8Y29kZT5OYXRpdmVTdGFja0NhbGxJbmZvPC9jb2RlPiBpcyBhIHN0YWNrIGNhbGwgdGhhdCBpcyBub3QgZGVlcCBpbiB0aGUKLSAgICAgKiBsb3dlciBsZXZlbCBvZiB0aGUgbGliYywgYnV0IHRoZSBhY3R1YWwgbWV0aG9kIHRoYXQgcGVyZm9ybWVkIHRoZSBhbGxvY2F0aW9uLiAKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+TmF0aXZlU3RhY2tDYWxsSW5mbzwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHN0YWNrIGNhbGwgaGFzIG5vdAotICAgICAqIGJlZW4gcHJvY2Vzc2VkIGZyb20gdGhlIHJhdyBhZGRyZXNzZXMuCi0gICAgICogQHNlZSAjc2V0UmVzb2x2ZWRTdGFja0NhbGwoQXJyYXlMaXN0KQotICAgICAqIEBzZWUgI2lzU3RhY2tDYWxsUmVzb2x2ZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTmF0aXZlU3RhY2tDYWxsSW5mbyBnZXRSZWxldmFudFN0YWNrQ2FsbEluZm8oKSB7Ci0gICAgICAgIGlmIChtSXNTdGFja0NhbGxSZXNvbHZlZCAmJiBtUmVzb2x2ZWRTdGFja0NhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8TmF0aXZlU3RhY2tDYWxsSW5mbz4gc291cmNlSXRlcmF0b3IgPSBtUmVzb2x2ZWRTdGFja0NhbGwuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPExvbmc+IGFkZHJJdGVyYXRvciA9IG1TdGFja0NhbGxBZGRyZXNzZXMuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKHNvdXJjZUl0ZXJhdG9yLmhhc05leHQoKSAmJiBhZGRySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBhZGRyID0gYWRkckl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBOYXRpdmVTdGFja0NhbGxJbmZvIGluZm8gPSBzb3VyY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVsZXZhbnQoaW5mby5nZXRNZXRob2ROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY291bGRudCBmaW5kIGEgcmVsZXZhbnQgb25lLCBzbyB3ZSdsbCByZXR1cm4gdGhlIGZpcnN0IG9uZSBpZiBpdAotICAgICAgICAgICAgLy8gZXhpc3RzLgotICAgICAgICAgICAgaWYgKG1SZXNvbHZlZFN0YWNrQ2FsbC5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBtUmVzb2x2ZWRTdGFja0NhbGwuZ2V0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIG5hbWUgaXMgcmVsZXZhbnQuCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCBuYW1lIHRvIHRlc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZhbnQoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyIDogc0FsbG9jRnVuY3Rpb25GaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKGZpbHRlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OYXRpdmVMaWJyYXJ5TWFwSW5mby5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL05hdGl2ZUxpYnJhcnlNYXBJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjYzMTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL05hdGl2ZUxpYnJhcnlNYXBJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLS8qKgotICogTWVtb3J5IGFkZHJlc3MgdG8gbGlicmFyeSBtYXBwaW5nIGZvciBuYXRpdmUgbGlicmFyaWVzLgotICogPHAvPgotICogRWFjaCBpbnN0YW5jZSByZXByZXNlbnRzIGEgc2luZ2xlIG5hdGl2ZSBsaWJyYXJ5IGFuZCBpdHMgc3RhcnQgYW5kIGVuZCBtZW1vcnkgYWRkcmVzc2VzLiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hdGl2ZUxpYnJhcnlNYXBJbmZvIHsKLSAgICBwcml2YXRlIGxvbmcgbVN0YXJ0QWRkcjsKLSAgICBwcml2YXRlIGxvbmcgbUVuZEFkZHI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTGlicmFyeTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbmF0aXZlIGxpYnJhcnkgbWFwIGluZm8uCi0gICAgICogQHBhcmFtIHN0YXJ0QWRkciBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbGlicmFyeS4KLSAgICAgKiBAcGFyYW0gZW5kQWRkciBUaGUgZW5kIGFkZHJlc3Mgb2YgdGhlIGxpYnJhcnkuCi0gICAgICogQHBhcmFtIGxpYnJhcnkgVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuCi0gICAgICovCi0gICAgTmF0aXZlTGlicmFyeU1hcEluZm8obG9uZyBzdGFydEFkZHIsIGxvbmcgZW5kQWRkciwgU3RyaW5nIGxpYnJhcnkpIHsKLSAgICAgICAgdGhpcy5tU3RhcnRBZGRyID0gc3RhcnRBZGRyOwotICAgICAgICB0aGlzLm1FbmRBZGRyID0gZW5kQWRkcjsKLSAgICAgICAgdGhpcy5tTGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1MaWJyYXJ5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBsaWJyYXJ5LgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIG1TdGFydEFkZHI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuZCBhZGRyZXNzIG9mIHRoZSBsaWJyYXJ5LgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldEVuZEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBtRW5kQWRkcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIGluc2lkZSB0aGUgbGlicmFyeS4KLSAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFkZHJlc3MgaXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9mIHRoZSBsaWJyYXJ5LgotICAgICAqIEBzZWUgI2dldFN0YXJ0QWRkcmVzcygpCi0gICAgICogQHNlZSAjZ2V0RW5kQWRkcmVzcygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaXRoaW5MaWJyYXJ5KGxvbmcgYWRkcmVzcykgewotICAgICAgICByZXR1cm4gYWRkcmVzcyA+PSBtU3RhcnRBZGRyICYmIGFkZHJlc3MgPD0gbUVuZEFkZHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL05hdGl2ZVN0YWNrQ2FsbEluZm8uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OYXRpdmVTdGFja0NhbGxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDgxOGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL05hdGl2ZVN0YWNrQ2FsbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYjsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBzdGFjayBjYWxsLiBUaGlzIGlzIHVzZWQgdG8gcmV0dXJuIGFsbCBvZiB0aGUgY2FsbAotICogaW5mb3JtYXRpb24gYXMgb25lIG9iamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hdGl2ZVN0YWNrQ2FsbEluZm8gewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gU09VUkNFX05BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXiguKyk6KFxcZCspJCIpOwotICAgIAotICAgIC8qKiBuYW1lIG9mIHRoZSBsaWJyYXJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUxpYnJhcnk7Ci0KLSAgICAvKiogbmFtZSBvZiB0aGUgbWV0aG9kICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU1ldGhvZDsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlICsgbGluZSBudW1iZXIgaW4gdGhlIGZvcm1hdDxicj4KLSAgICAgKiAmbHQ7c291cmNlZmlsZSZndDs6Jmx0O2xpbmVudW1iZXImZ3Q7Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUZpbGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgbUxpbmVOdW1iZXIgPSAtMTsgCi0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjb25zdHJ1Y3RvciB3aXRoIGxpYnJhcnksIG1ldGhvZCwgYW5kIHNvdXJjZWZpbGUgaW5mb3JtYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaWIgVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkKLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG51bWJlcgotICAgICAqIGFzICJbc291cmNlZmlsZV06W2ZpbGVOdW1iZXJdIgotICAgICAqLwotICAgIHB1YmxpYyBOYXRpdmVTdGFja0NhbGxJbmZvKFN0cmluZyBsaWIsIFN0cmluZyBtZXRob2QsIFN0cmluZyBzb3VyY2VGaWxlKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbGliOwotICAgICAgICBtTWV0aG9kID0gbWV0aG9kOwotICAgICAgICAKLSAgICAgICAgTWF0Y2hlciBtID0gU09VUkNFX05BTUVfUEFUVEVSTi5tYXRjaGVyKHNvdXJjZUZpbGUpOwotICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VGaWxlID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVOdW1iZXIgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCB0aGUgbGluZSBudW1iZXIgd2lsbCBzdGF5IGF0IC0xCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU291cmNlRmlsZSA9IHNvdXJjZUZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTGlicmFyeTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRob2Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2VGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIG1MaW5lTnVtYmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OdWxsT3V0cHV0UmVjZWl2ZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9OdWxsT3V0cHV0UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNWExZS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvTnVsbE91dHB1dFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWI7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTaGVsbE91dHB1dFJlY2VpdmVyfSB0aGF0IGRvZXMgbm90aGluZy4KLSAqIDxwLz5UaGlzIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgYSByZW1vdGUgc2hlbGwgY29tbWFuZCB3aGVuIHRoZSBvdXRwdXQgaXMgbm90IG5lZWRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxPdXRwdXRSZWNlaXZlciBpbXBsZW1lbnRzIElTaGVsbE91dHB1dFJlY2VpdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE51bGxPdXRwdXRSZWNlaXZlciBzUmVjZWl2ZXIgPSBuZXcgTnVsbE91dHB1dFJlY2VpdmVyKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTaGVsbE91dHB1dFJlY2VpdmVyIGdldFJlY2VpdmVyKCkgewotICAgICAgICByZXR1cm4gc1JlY2VpdmVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5hZGIuSVNoZWxsT3V0cHV0UmVjZWl2ZXIjYWRkT3V0cHV0KGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3V0cHV0KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLmFkYi5JU2hlbGxPdXRwdXRSZWNlaXZlciNmbHVzaCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLmFkYi5JU2hlbGxPdXRwdXRSZWNlaXZlciNpc0NhbmNlbGxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9SYXdJbWFnZS5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL1Jhd0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzYxNDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL1Jhd0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotLyoqCi0gKiBEYXRhIHJlcHJlc2VudGluZyBhbiBpbWFnZSB0YWtlbiBmcm9tIGEgZGV2aWNlIGZyYW1lIGJ1ZmZlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJhd0ltYWdlIHsKLSAgICBwdWJsaWMgaW50IHZlcnNpb247Ci0gICAgcHVibGljIGludCBicHA7Ci0gICAgcHVibGljIGludCBzaXplOwotICAgIHB1YmxpYyBpbnQgd2lkdGg7Ci0gICAgcHVibGljIGludCBoZWlnaHQ7Ci0gICAgcHVibGljIGludCByZWRfb2Zmc2V0OwotICAgIHB1YmxpYyBpbnQgcmVkX2xlbmd0aDsKLSAgICBwdWJsaWMgaW50IGJsdWVfb2Zmc2V0OwotICAgIHB1YmxpYyBpbnQgYmx1ZV9sZW5ndGg7Ci0gICAgcHVibGljIGludCBncmVlbl9vZmZzZXQ7Ci0gICAgcHVibGljIGludCBncmVlbl9sZW5ndGg7Ci0gICAgcHVibGljIGludCBhbHBoYV9vZmZzZXQ7Ci0gICAgcHVibGljIGludCBhbHBoYV9sZW5ndGg7Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGRhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgaGVhZGVyIG9mIGEgUmF3SW1hZ2UgZnJvbSBhIHtAbGluayBCeXRlQnVmZmVyfS4KLSAgICAgKiA8cC8+VGhlIHdheSB0aGUgZGF0YSBpcyBzZW50IG92ZXIgYWRiIGlzIGRlZmluZWQgaW4gc3lzdGVtL2NvcmUvYWRiL2ZyYW1lYnVmZmVyX3NlcnZpY2UuYwotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbC4KLSAgICAgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZEhlYWRlcihpbnQgdmVyc2lvbiwgQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQotICAgICAgICBpZiAodmVyc2lvbiA9PSAxNikgewotICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eSBtb2RlIHdpdGggb3JpZ2luYWwgcHJvdG9jb2wKLSAgICAgICAgICAgIHRoaXMuYnBwID0gMTY7Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgYWN0dWFsIHZhbHVlcy4KLSAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGJ1Zi5nZXRJbnQoKTsKLSAgICAgICAgICAgIHRoaXMud2lkdGggPSBidWYuZ2V0SW50KCk7Ci0gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGJ1Zi5nZXRJbnQoKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVzdC4gRm9ybWF0IGlzIDU2NQotICAgICAgICAgICAgdGhpcy5yZWRfb2Zmc2V0ID0gMTE7Ci0gICAgICAgICAgICB0aGlzLnJlZF9sZW5ndGggPSA1OwotICAgICAgICAgICAgdGhpcy5ncmVlbl9vZmZzZXQgPSA1OwotICAgICAgICAgICAgdGhpcy5ncmVlbl9sZW5ndGggPSA2OwotICAgICAgICAgICAgdGhpcy5ibHVlX29mZnNldCA9IDA7Ci0gICAgICAgICAgICB0aGlzLmJsdWVfbGVuZ3RoID0gNTsKLSAgICAgICAgICAgIHRoaXMuYWxwaGFfb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHRoaXMuYWxwaGFfbGVuZ3RoID0gMDsKLSAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgICAgIHRoaXMuYnBwID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy5zaXplID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy53aWR0aCA9IGJ1Zi5nZXRJbnQoKTsKLSAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy5yZWRfb2Zmc2V0ID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy5yZWRfbGVuZ3RoID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy5ibHVlX29mZnNldCA9IGJ1Zi5nZXRJbnQoKTsKLSAgICAgICAgICAgIHRoaXMuYmx1ZV9sZW5ndGggPSBidWYuZ2V0SW50KCk7Ci0gICAgICAgICAgICB0aGlzLmdyZWVuX29mZnNldCA9IGJ1Zi5nZXRJbnQoKTsKLSAgICAgICAgICAgIHRoaXMuZ3JlZW5fbGVuZ3RoID0gYnVmLmdldEludCgpOwotICAgICAgICAgICAgdGhpcy5hbHBoYV9vZmZzZXQgPSBidWYuZ2V0SW50KCk7Ci0gICAgICAgICAgICB0aGlzLmFscGhhX2xlbmd0aCA9IGJ1Zi5nZXRJbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHByb3RvY29sIQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFzayB2YWx1ZSBmb3IgdGhlIHJlZCBjb2xvci4KLSAgICAgKiA8cC8+VGhpcyB2YWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZWRNYXNrKCkgewotICAgICAgICByZXR1cm4gZ2V0TWFzayhyZWRfbGVuZ3RoLCByZWRfb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXNrIHZhbHVlIGZvciB0aGUgZ3JlZW4gY29sb3IuCi0gICAgICogPHAvPlRoaXMgdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0R3JlZW5NYXNrKCkgewotICAgICAgICByZXR1cm4gZ2V0TWFzayhncmVlbl9sZW5ndGgsIGdyZWVuX29mZnNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFzayB2YWx1ZSBmb3IgdGhlIGJsdWUgY29sb3IuCi0gICAgICogPHAvPlRoaXMgdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Qmx1ZU1hc2soKSB7Ci0gICAgICAgIHJldHVybiBnZXRNYXNrKGJsdWVfbGVuZ3RoLCBibHVlX29mZnNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIGZvciBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGZyYW1lYnVmZmVyIGFkYiBwcm90b2NvbC4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW50IHRoYXQgbWFrZXMgdXAgdGhlIGhlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRIZWFkZXJTaXplKGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIHN3aXRjaCAodmVyc2lvbikgewotICAgICAgICAgICAgY2FzZSAxNjogLy8gY29tcGF0aWJpbGl0eSBtb2RlCi0gICAgICAgICAgICAgICAgcmV0dXJuIDM7IC8vIHNpemUsIHdpZHRoLCBoZWlnaHQKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gMTI7IC8vIGJwcCwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgNCoobGVuZ3RoLCBvZmZzZXQpCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcm90YXRlZCB2ZXJzaW9uIG9mIHRoZSBpbWFnZQotICAgICAqIFRoZSBpbWFnZSBpcyByb3RhdGVkIGNvdW50ZXItY2xvY2t3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBSYXdJbWFnZSBnZXRSb3RhdGVkKCkgewotICAgICAgICBSYXdJbWFnZSByb3RhdGVkID0gbmV3IFJhd0ltYWdlKCk7Ci0gICAgICAgIHJvdGF0ZWQudmVyc2lvbiA9IHRoaXMudmVyc2lvbjsKLSAgICAgICAgcm90YXRlZC5icHAgPSB0aGlzLmJwcDsKLSAgICAgICAgcm90YXRlZC5zaXplID0gdGhpcy5zaXplOwotICAgICAgICByb3RhdGVkLnJlZF9vZmZzZXQgPSB0aGlzLnJlZF9vZmZzZXQ7Ci0gICAgICAgIHJvdGF0ZWQucmVkX2xlbmd0aCA9IHRoaXMucmVkX2xlbmd0aDsKLSAgICAgICAgcm90YXRlZC5ibHVlX29mZnNldCA9IHRoaXMuYmx1ZV9vZmZzZXQ7Ci0gICAgICAgIHJvdGF0ZWQuYmx1ZV9sZW5ndGggPSB0aGlzLmJsdWVfbGVuZ3RoOwotICAgICAgICByb3RhdGVkLmdyZWVuX29mZnNldCA9IHRoaXMuZ3JlZW5fb2Zmc2V0OwotICAgICAgICByb3RhdGVkLmdyZWVuX2xlbmd0aCA9IHRoaXMuZ3JlZW5fbGVuZ3RoOwotICAgICAgICByb3RhdGVkLmFscGhhX29mZnNldCA9IHRoaXMuYWxwaGFfb2Zmc2V0OwotICAgICAgICByb3RhdGVkLmFscGhhX2xlbmd0aCA9IHRoaXMuYWxwaGFfbGVuZ3RoOwotCi0gICAgICAgIHJvdGF0ZWQud2lkdGggPSB0aGlzLmhlaWdodDsKLSAgICAgICAgcm90YXRlZC5oZWlnaHQgPSB0aGlzLndpZHRoOwotCi0gICAgICAgIGludCBjb3VudCA9IHRoaXMuZGF0YS5sZW5ndGg7Ci0gICAgICAgIHJvdGF0ZWQuZGF0YSA9IG5ldyBieXRlW2NvdW50XTsKLQotICAgICAgICBpbnQgYnl0ZUNvdW50ID0gdGhpcy5icHAgPj4gMzsgLy8gYnBwIGlzIGluIGJpdHMsIHdlIHdhbnQgYnl0ZXMgdG8gbWF0Y2ggb3VyIGFycmF5Ci0gICAgICAgIGZpbmFsIGludCB3ID0gdGhpcy53aWR0aDsKLSAgICAgICAgZmluYWwgaW50IGggPSB0aGlzLmhlaWdodDsKLSAgICAgICAgZm9yIChpbnQgeSA9IDAgOyB5IDwgaCA7IHkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDAgOyB4IDwgdyA7IHgrKykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEsICh5ICogdyArIHgpICogYnl0ZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlZC5kYXRhLCAoKHcteC0xKSAqIGggKyB5KSAqIGJ5dGVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm90YXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEFSR0IgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIHBpeGVsIGF0IDx2YXI+aW5kZXg8L3Zhcj4gaW4ge0BsaW5rICNkYXRhfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEFSR0IoaW50IGluZGV4KSB7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgaWYgKGJwcCA9PSAxNikgewotICAgICAgICAgICAgdmFsdWUgPSBkYXRhW2luZGV4XSAmIDB4MDBGRjsKLSAgICAgICAgICAgIHZhbHVlIHw9IChkYXRhW2luZGV4KzFdIDw8IDgpICYgMHgwRkYwMDsKLSAgICAgICAgfSBlbHNlIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZGF0YVtpbmRleF0gJiAweDAwRkY7Ci0gICAgICAgICAgICB2YWx1ZSB8PSAoZGF0YVtpbmRleCsxXSAmIDB4MDBGRikgPDwgODsKLSAgICAgICAgICAgIHZhbHVlIHw9IChkYXRhW2luZGV4KzJdICYgMHgwMEZGKSA8PCAxNjsKLSAgICAgICAgICAgIHZhbHVlIHw9IChkYXRhW2luZGV4KzNdICYgMHgwMEZGKSA8PCAyNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmF3SW1hZ2UuZ2V0QVJHQihpbnQpIG9ubHkgd29ya3MgaW4gMTYgYW5kIDMyIGJpdCBtb2RlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHIgPSAoKHZhbHVlID4+PiByZWRfb2Zmc2V0KSAmIGdldE1hc2socmVkX2xlbmd0aCkpIDw8ICg4IC0gcmVkX2xlbmd0aCk7Ci0gICAgICAgIGludCBnID0gKCh2YWx1ZSA+Pj4gZ3JlZW5fb2Zmc2V0KSAmIGdldE1hc2soZ3JlZW5fbGVuZ3RoKSkgPDwgKDggLSBncmVlbl9sZW5ndGgpOwotICAgICAgICBpbnQgYiA9ICgodmFsdWUgPj4+IGJsdWVfb2Zmc2V0KSAmIGdldE1hc2soYmx1ZV9sZW5ndGgpKSA8PCAoOCAtIGJsdWVfbGVuZ3RoKTsKLSAgICAgICAgaW50IGE7Ci0gICAgICAgIGlmIChhbHBoYV9sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgYSA9IDB4RkY7IC8vIGZvcmNlIGFscGhhIHRvIG9wYXF1ZSBpZiB0aGVyZSdzIG5vIGFscGhhIHZhbHVlIGluIHRoZSBmcmFtZWJ1ZmZlci4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGEgPSAoKHZhbHVlID4+PiBhbHBoYV9vZmZzZXQpICYgZ2V0TWFzayhhbHBoYV9sZW5ndGgpKSA8PCAoOCAtIGFscGhhX2xlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgYSBtYXNrIHZhbHVlIGJhc2VkIG9uIGEgbGVuZ3RoIGFuZCBvZmZzZXQuCi0gICAgICogPHAvPlRoaXMgdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1hc2soaW50IGxlbmd0aCwgaW50IG9mZnNldCkgewotICAgICAgICBpbnQgcmVzID0gZ2V0TWFzayhsZW5ndGgpIDw8IG9mZnNldDsKLQotICAgICAgICAvLyBpZiB0aGUgYnBwIGlzIDMyIGJpdHMgdGhlbiB3ZSBuZWVkIHRvIGludmVydCBpdCBiZWNhdXNlIHRoZSBidWZmZXIgaXMgaW4gbGl0dGxlIGVuZGlhbgotICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5yZXZlcnNlQnl0ZXMocmVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1hc2sgdmFsdWUgYmFzZWQgb24gYSBsZW5ndGguCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRNYXNrKGludCBsZW5ndGgpIHsKLSAgICAgICAgaW50IHJlcyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgcmVzID0gKHJlcyA8PCAxKSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9TeW5jU2VydmljZS5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL1N5bmNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNmI1NjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL1N5bmNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFkYkhlbHBlci5BZGJSZXNwb25zZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLkZpbGVFbnRyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudXRpbHMuQXJyYXlIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBTeW5jIHNlcnZpY2UgY2xhc3MgdG8gcHVzaC9wdWxsIHRvL2Zyb20gZGV2aWNlcy9lbXVsYXRvcnMsIHRocm91Z2ggdGhlIGRlYnVnIGJyaWRnZS4KLSAqIDxwLz4KLSAqIFRvIGdldCBhIHtAbGluayBTeW5jU2VydmljZX0gb2JqZWN0LCB1c2Uge0BsaW5rIERldmljZSNnZXRTeW5jU2VydmljZSgpfS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN5bmNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBJRF9PS0FZID0geyAnTycsICdLJywgJ0EnLCAnWScgfTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gSURfRkFJTCA9IHsgJ0YnLCAnQScsICdJJywgJ0wnIH07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIElEX1NUQVQgPSB7ICdTJywgJ1QnLCAnQScsICdUJyB9OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBJRF9SRUNWID0geyAnUicsICdFJywgJ0MnLCAnVicgfTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gSURfREFUQSA9IHsgJ0QnLCAnQScsICdUJywgJ0EnIH07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIElEX0RPTkUgPSB7ICdEJywgJ08nLCAnTicsICdFJyB9OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBJRF9TRU5EID0geyAnUycsICdFJywgJ04nLCAnRCcgfTsKLS8vICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBJRF9MSVNUID0geyAnTCcsICdJJywgJ1MnLCAnVCcgfTsKLS8vICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBJRF9ERU5UID0geyAnRCcsICdFJywgJ04nLCAnVCcgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE51bGxTeW5jUHJvZ3Jlc01vbml0b3Igc051bGxTeW5jUHJvZ3Jlc3NNb25pdG9yID0KLSAgICAgICAgICAgIG5ldyBOdWxsU3luY1Byb2dyZXNNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JU09DSyA9IDB4QzAwMDsgLy8gdHlwZTogc3ltYm9saWMgbGluawotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lGTE5LID0gMHhBMDAwOyAvLyB0eXBlOiBzeW1ib2xpYyBsaW5rCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfSUZSRUcgPSAweDgwMDA7IC8vIHR5cGU6IHJlZ3VsYXIgZmlsZQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lGQkxLID0gMHg2MDAwOyAvLyB0eXBlOiBibG9jayBkZXZpY2UKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JRkRJUiA9IDB4NDAwMDsgLy8gdHlwZTogZGlyZWN0b3J5Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfSUZDSFIgPSAweDIwMDA7IC8vIHR5cGU6IGNoYXJhY3RlciBkZXZpY2UKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JRklGTyA9IDB4MTAwMDsgLy8gdHlwZTogZmlmbwotLyoKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JU1VJRCA9IDB4MDgwMDsgLy8gc2V0LXVpZCBiaXQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JU0dJRCA9IDB4MDQwMDsgLy8gc2V0LWdpZCBiaXQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JU1ZUWCA9IDB4MDIwMDsgLy8gc3RpY2t5IGJpdAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lSV1hVID0gMHgwMUMwOyAvLyB1c2VyIHBlcm1pc3Npb25zCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfSVJVU1IgPSAweDAxMDA7IC8vIHVzZXI6IHJlYWQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JV1VTUiA9IDB4MDA4MDsgLy8gdXNlcjogd3JpdGUKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JWFVTUiA9IDB4MDA0MDsgLy8gdXNlcjogZXhlY3V0ZQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lSV1hHID0gMHgwMDM4OyAvLyBncm91cCBwZXJtaXNzaW9ucwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lSR1JQID0gMHgwMDIwOyAvLyBncm91cDogcmVhZAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0lXR1JQID0gMHgwMDEwOyAvLyBncm91cDogd3JpdGUKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JWEdSUCA9IDB4MDAwODsgLy8gZ3JvdXA6IGV4ZWN1dGUKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JUldYTyA9IDB4MDAwNzsgLy8gb3RoZXIgcGVybWlzc2lvbnMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JUk9USCA9IDB4MDAwNDsgLy8gb3RoZXI6IHJlYWQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19JV09USCA9IDB4MDAwMjsgLy8gb3RoZXI6IHdyaXRlCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfSVhPVEggPSAweDAwMDE7IC8vIG90aGVyOiBleGVjdXRlCi0qLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNZTkNfREFUQV9NQVggPSA2NCoxMDI0OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBSRU1PVEVfUEFUSF9NQVhfTEVOR1RIID0gMTAyNDsKLQotICAgIC8qKiBSZXN1bHQgY29kZSBmb3IgdHJhbnNmZXIgc3VjY2Vzcy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfT0sgPSAwOwotICAgIC8qKiBSZXN1bHQgY29kZSBmb3IgY2FuY2VsZWQgdHJhbnNmZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfQ0FOQ0VMRUQgPSAxOwotICAgIC8qKiBSZXN1bHQgY29kZSBmb3IgdW5rbm93biBlcnJvciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9VTktOT1dOX0VSUk9SID0gMjsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9DT05ORUNUSU9OX0VSUk9SID0gMzsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIHVua25vd24gcmVtb3RlIG9iamVjdCBkdXJpbmcgYSBwdWxsICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX05PX1JFTU9URV9PQkpFQ1QgPSA0OwotICAgIC8qKiBSZXN1bHQgY29kZSB3aGVuIGF0dGVtcHRpbmcgdG8gcHVsbCBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgZmlsZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9UQVJHRVRfSVNfRklMRSA9IDU7Ci0gICAgLyoqIFJlc3VsdCBjb2RlIHdoZW4gYXR0ZW1wdGluZyB0byBwdWxsIG11bHRpcGxlIGludG8gYSBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfTk9fRElSX1RBUkdFVCA9IDY7Ci0gICAgLyoqIFJlc3VsdCBjb2RlIGZvciB3cm9uZyBlbmNvZGluZyBvbiB0aGUgcmVtb3RlIHBhdGguICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1JFTU9URV9QQVRIX0VOQ09ESU5HID0gNzsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIHJlbW90ZSBwYXRoIHRoYXQgaXMgdG9vIGxvbmcuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1JFTU9URV9QQVRIX0xFTkdUSCA9IDg7Ci0gICAgLyoqIFJlc3VsdCBjb2RlIGZvciBlcnJvciB3aGlsZSB3cml0aW5nIGxvY2FsIGZpbGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZJTEVfV1JJVEVfRVJST1IgPSA5OwotICAgIC8qKiBSZXN1bHQgY29kZSBmb3IgZXJyb3Igd2hpbGUgcmVhZGluZyBsb2NhbCBmaWxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GSUxFX1JFQURfRVJST1IgPSAxMDsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIGF0dGVtcHRpbmcgdG8gcHVzaCBhIGZpbGUgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfTk9fTE9DQUxfRklMRSA9IDExOwotICAgIC8qKiBSZXN1bHQgY29kZSBmb3IgYXR0ZW1wdGluZyB0byBwdXNoIGEgZGlyZWN0b3J5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9MT0NBTF9JU19ESVJFQ1RPUlkgPSAxMjsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIHdoZW4gdGhlIHRhcmdldCBwYXRoIG9mIGEgbXVsdGkgZmlsZSBwdXNoIGlzIGEgZmlsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfUkVNT1RFX0lTX0ZJTEUgPSAxMzsKLSAgICAvKiogUmVzdWx0IGNvZGUgZm9yIHJlY2VpdmluZyB0b28gbXVjaCBkYXRhIGZyb20gdGhlIHJlbW92ZSBkZXZpY2UgYXQgb25jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9CVUZGRVJfT1ZFUlJVTiA9IDE0OwotCi0gICAgLyoqCi0gICAgICogQSBmaWxlIHRyYW5zZmVyIHJlc3VsdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBjb250YWlucyBhIGNvZGUsIGFuZCBhbiBvcHRpb25hbCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNSZXN1bHQgewotICAgICAgICBwcml2YXRlIGludCBtQ29kZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lc3NhZ2U7Ci0gICAgICAgIFN5bmNSZXN1bHQoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBtQ29kZSA9IGNvZGU7Ci0gICAgICAgICAgICBtTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jUmVzdWx0KGludCBjb2RlLCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhpcyhjb2RlLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jUmVzdWx0KGludCBjb2RlKSB7Ci0gICAgICAgICAgICB0aGlzKGNvZGUsIGVycm9yQ29kZVRvU3RyaW5nKGNvZGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2FnZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgbWV0aG9kcyB0aGF0IGRlYWwKLSAgICAgKiB3aXRoIGRpc3BsYXlpbmcgdHJhbnNmZXIgcHJvZ3Jlc3MuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJU3luY1Byb2dyZXNzTW9uaXRvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gdGhlIHRyYW5zZmVyIHN0YXJ0cwotICAgICAgICAgKiBAcGFyYW0gdG90YWxXb3JrIHRoZSB0b3RhbCBhbW91bnQgb2Ygd29yay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCB0b3RhbFdvcmspOwotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIHRoZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCBvciBpbnRlcnJ1cHRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgdG8gcXVlcnkgZm9yIHBvc3NpYmxlIGNhbmNlbGxhdGlvbi4KLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2ZlciBzaG91bGQgYmUgc3RvcHBlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhIHN1YiB0YXNrIGlzIHN0YXJ0ZWQuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzdWIgdGFzay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0U3ViVGFzayhTdHJpbmcgbmFtZSk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gc29tZSBwcm9ncmVzcyBoYXZlIGJlZW4gbWFkZS4KLSAgICAgICAgICogQHBhcmFtIHdvcmsgdGhlIGFtb3VudCBvZiB3b3JrIGRvbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKGludCB3b3JrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFN5bmMgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IGRvZXMgbm90aGluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxTeW5jUHJvZ3Jlc01vbml0b3IgaW1wbGVtZW50cyBJU3luY1Byb2dyZXNzTW9uaXRvciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkdmFuY2UoaW50IHdvcmspIHsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoaW50IHRvdGFsV29yaykgewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0U3ViVGFzayhTdHJpbmcgbmFtZSkgewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZXRTb2NrZXRBZGRyZXNzIG1BZGRyZXNzOwotICAgIHByaXZhdGUgRGV2aWNlIG1EZXZpY2U7Ci0gICAgcHJpdmF0ZSBTb2NrZXRDaGFubmVsIG1DaGFubmVsOwotCi0gICAgLyoqCi0gICAgICogQnVmZmVyIHVzZWQgdG8gc2VuZCBkYXRhLiBBbGxvY2F0ZWQgd2hlbiBuZWVkZWQgYW5kIHJldXNlZCBhZnRlcndhcmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUJ1ZmZlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBTeW5jIHNlcnZpY2Ugb2JqZWN0LgotICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGNvbm5lY3QgdG8KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSB7QGxpbmsgRGV2aWNlfSB0aGF0IHRoZSBzZXJ2aWNlIGNvbm5lY3RzIHRvLgotICAgICAqLwotICAgIFN5bmNTZXJ2aWNlKEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3MsIERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbUFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBzeW5jIGNvbm5lY3Rpb24uIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBjYWxscyB0byBwdXNoW0ZpbGVdIC8gcHVsbFtGaWxlXS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gb3BlbmVkLCBmYWxzZSBpZiBhZGIgcmVmdXNlIHRoZSBjb25uZWN0aW9uLiBUaGlzIGNhbiBoYXBwZW4KLSAgICAgKiBpZiB0aGUge0BsaW5rIERldmljZX0gaXMgaW52YWxpZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBjb25uZWN0aW9uIHRvIGFkYiBmYWlsZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBvcGVuU3luYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbihtQWRkcmVzcyk7Ci0gICAgICAgICAgICBtQ2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIHRhcmdldCBhIHNwZWNpZmljIGRldmljZQotICAgICAgICAgICAgQWRiSGVscGVyLnNldERldmljZShtQ2hhbm5lbCwgbURldmljZSk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSByZXF1ZXN0ID0gQWRiSGVscGVyLmZvcm1BZGJSZXF1ZXN0KCJzeW5jOiIpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgQWRiSGVscGVyLndyaXRlKG1DaGFubmVsLCByZXF1ZXN0LCAtMSwgRGRtUHJlZmVyZW5jZXMuZ2V0VGltZU91dCgpKTsKLQotICAgICAgICAgICAgQWRiUmVzcG9uc2UgcmVzcCA9IEFkYkhlbHBlci5yZWFkQWRiUmVzcG9uc2UobUNoYW5uZWwsIGZhbHNlIC8qIHJlYWREaWFnU3RyaW5nICovKTsKLQotICAgICAgICAgICAgaWYgKCFyZXNwLmlvU3VjY2VzcyB8fCAhcmVzcC5va2F5KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCB0aW1lb3V0IG9yIHVuaGFwcHkgcmVzcG9uc2UgZnJvbSBBREIgc3luYyByZXE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzcC5tZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBtQ2hhbm5lbC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1DaGFubmVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtQ2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWwuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHRocm93IHRoZSBvcmlnaW5hbCBleGNlcHRpb24sIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYW5uZWwgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAobUNoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ2hhbm5lbC5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZSByZWFsbHkuLi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFubmVsID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jIHByb2dyZXNzIG1vbml0b3IgdGhhdCBkb2VzIG5vdGhpbmcuIFRoaXMgYWxsb3dzIGJhY2tncm91bmQgdGFza3MgdGhhdCBkb24ndAotICAgICAqIHdhbnQvbmVlZCB0byBkaXNwbGF5IHVpLCB0byBwYXNzIGEgdmFsaWQge0BsaW5rIElTeW5jUHJvZ3Jlc3NNb25pdG9yfS4KLSAgICAgKiA8cC8+VGhpcyBvYmplY3QgY2FuIGJlIHJldXNlZCBtdWx0aXBsZSB0aW1lcyBhbmQgY2FuIGJlIHVzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN5bmNQcm9ncmVzc01vbml0b3IgZ2V0TnVsbFByb2dyZXNzTW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNOdWxsU3luY1Byb2dyZXNzTW9uaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBlcnJvciBjb2RlIGludG8gYSBub24tbG9jYWxpemVkIHN0cmluZwotICAgICAqIEBwYXJhbSBjb2RlIHRoZSBlcnJvciBjb2RlOwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvckNvZGVUb1N0cmluZyhpbnQgY29kZSkgewotICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX09LOgotICAgICAgICAgICAgICAgIHJldHVybiAiU3VjY2Vzcy4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfQ0FOQ0VMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJUcmFuZmVydCBjYW5jZWxlZCBieSB0aGUgdXNlci4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfVU5LTk9XTl9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gRXJyb3IuIjsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX0NPTk5FQ1RJT05fRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJBZGIgQ29ubmVjdGlvbiBFcnJvci4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfTk9fUkVNT1RFX09CSkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJlbW90ZSBvYmplY3QgZG9lc24ndCBleGlzdCEiOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfVEFSR0VUX0lTX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJUYXJnZXQgb2JqZWN0IGlzIGEgZmlsZS4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfTk9fRElSX1RBUkdFVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlRhcmdldCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdC4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfUkVNT1RFX1BBVEhfRU5DT0RJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJSZW1vdGUgUGF0aCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgICAgICAgICBjYXNlIFJFU1VMVF9SRU1PVEVfUEFUSF9MRU5HVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJSZW1vdmUgcGF0aCBpcyB0b28gbG9uZy4iOwotICAgICAgICAgICAgY2FzZSBSRVNVTFRfRklMRV9XUklURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIldyaXRpbmcgbG9jYWwgZmlsZSBmYWlsZWQhIjsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX0ZJTEVfUkVBRF9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJlYWRpbmcgbG9jYWwgZmlsZSBmYWlsZWQhIjsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX05PX0xPQ0FMX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJMb2NhbCBmaWxlIGRvZXNuJ3QgZXhpc3QuIjsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX0xPQ0FMX0lTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkxvY2FsIHBhdGggaXMgYSBkaXJlY3RvcnkuIjsKLSAgICAgICAgICAgIGNhc2UgUkVTVUxUX1JFTU9URV9JU19GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiAiUmVtb3RlIHBhdGggaXMgYSBmaWxlLiI7Ci0gICAgICAgICAgICBjYXNlIFJFU1VMVF9CVUZGRVJfT1ZFUlJVTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJlY2VpdmluZyB0b28gbXVjaCBkYXRhLiI7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1bGxzIGZpbGUocykgb3IgZm9sZGVyKHMpLgotICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSByZW1vdGUgaXRlbShzKSB0byBwdWxsCi0gICAgICogQHBhcmFtIGxvY2FsUGF0aCBUaGUgbG9jYWwgZGVzdGluYXRpb24uIElmIHRoZSBlbnRyaWVzIGNvdW50IGlzID4gMSBvcgotICAgICAqICAgICAgaWYgdGhlIHVuaXF1ZSBlbnRyeSBpcyBhIGZvbGRlciwgdGhpcyBzaG91bGQgYmUgYSBmb2xkZXIuCi0gICAgICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHNlZSBGaWxlTGlzdGluZ1NlcnZpY2UuRmlsZUVudHJ5Ci0gICAgICogQHNlZSAjZ2V0TnVsbFByb2dyZXNzTW9uaXRvcigpCi0gICAgICovCi0gICAgcHVibGljIFN5bmNSZXN1bHQgcHVsbChGaWxlRW50cnlbXSBlbnRyaWVzLCBTdHJpbmcgbG9jYWxQYXRoLCBJU3luY1Byb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgLy8gZmlyc3Qgd2UgY2hlY2sgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5IGFuZCBleGlzdHMKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLSAgICAgICAgaWYgKGYuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfTk9fRElSX1RBUkdFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9UQVJHRVRfSVNfRklMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYSBGaWxlTGlzdGluZ1NlcnZpY2Ugb2JqZWN0Ci0gICAgICAgIEZpbGVMaXN0aW5nU2VydmljZSBmbHMgPSBuZXcgRmlsZUxpc3RpbmdTZXJ2aWNlKG1EZXZpY2UpOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhlIG51bWJlciBvZiBmaWxlIHRvIG1vdmUKLSAgICAgICAgaW50IHRvdGFsID0gZ2V0VG90YWxSZW1vdGVGaWxlU2l6ZShlbnRyaWVzLCBmbHMpOwotCi0gICAgICAgIC8vIHN0YXJ0IHRoZSBtb25pdG9yCi0gICAgICAgIG1vbml0b3Iuc3RhcnQodG90YWwpOwotCi0gICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gZG9QdWxsKGVudHJpZXMsIGxvY2FsUGF0aCwgZmxzLCBtb25pdG9yKTsKLQotICAgICAgICBtb25pdG9yLnN0b3AoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1bGxzIGEgc2luZ2xlIGZpbGUuCi0gICAgICogQHBhcmFtIHJlbW90ZSB0aGUgcmVtb3RlIGZpbGUKLSAgICAgKiBAcGFyYW0gbG9jYWxGaWxlbmFtZSBUaGUgbG9jYWwgZGVzdGluYXRpb24uCi0gICAgICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHNlZSBGaWxlTGlzdGluZ1NlcnZpY2UuRmlsZUVudHJ5Ci0gICAgICogQHNlZSAjZ2V0TnVsbFByb2dyZXNzTW9uaXRvcigpCi0gICAgICovCi0gICAgcHVibGljIFN5bmNSZXN1bHQgcHVsbEZpbGUoRmlsZUVudHJ5IHJlbW90ZSwgU3RyaW5nIGxvY2FsRmlsZW5hbWUsCi0gICAgICAgICAgICBJU3luY1Byb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIGludCB0b3RhbCA9IHJlbW90ZS5nZXRTaXplVmFsdWUoKTsKLSAgICAgICAgbW9uaXRvci5zdGFydCh0b3RhbCk7Ci0KLSAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBkb1B1bGxGaWxlKHJlbW90ZS5nZXRGdWxsUGF0aCgpLCBsb2NhbEZpbGVuYW1lLCBtb25pdG9yKTsKLQotICAgICAgICBtb25pdG9yLnN0b3AoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWxscyBhIHNpbmdsZSBmaWxlLgotICAgICAqIDxwLz5CZWNhdXNlIHRoaXMgbWV0aG9kIGp1c3QgZGVhbHMgd2l0aCBhIFN0cmluZyBmb3IgdGhlIHJlbW90ZSBmaWxlIGluc3RlYWQgb2YgYQotICAgICAqIHtAbGluayBGaWxlRW50cnl9LCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBiZWluZyBwdWxsZWQgaXMgdW5rbm93biBhbmQgdGhlCi0gICAgICoge0BsaW5rIElTeW5jUHJvZ3Jlc3NNb25pdG9yfSB3aWxsIG5vdCBwcm9wZXJseSBzaG93IHRoZSBwcm9ncmVzcwotICAgICAqIEBwYXJhbSByZW1vdGVGaWxlcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZQotICAgICAqIEBwYXJhbSBsb2NhbEZpbGVuYW1lIFRoZSBsb2NhbCBkZXN0aW5hdGlvbi4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHJldHVybiBhIHtAbGluayBTeW5jUmVzdWx0fSBvYmplY3Qgd2l0aCBhIGNvZGUgYW5kIGFuIG9wdGlvbmFsIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXROdWxsUHJvZ3Jlc3NNb25pdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3luY1Jlc3VsdCBwdWxsRmlsZShTdHJpbmcgcmVtb3RlRmlsZXBhdGgsIFN0cmluZyBsb2NhbEZpbGVuYW1lLAotICAgICAgICAgICAgSVN5bmNQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBtb25pdG9yLnN0YXJ0KDApOwotICAgICAgICAvL1RPRE86IHVzZSB0aGUge0BsaW5rIEZpbGVMaXN0aW5nU2VydmljZX0gdG8gZ2V0IHRoZSBmaWxlIHNpemUuCi0KLSAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBkb1B1bGxGaWxlKHJlbW90ZUZpbGVwYXRoLCBsb2NhbEZpbGVuYW1lLCBtb25pdG9yKTsKLQotICAgICAgICBtb25pdG9yLnN0b3AoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoIHNldmVyYWwgZmlsZXMuCi0gICAgICogQHBhcmFtIGxvY2FsIEFuIGFycmF5IG9mIGxvY2EgZmlsZXMgdG8gcHVzaAotICAgICAqIEBwYXJhbSByZW1vdGUgdGhlIHJlbW90ZSB7QGxpbmsgRmlsZUVudHJ5fSByZXByZXNlbnRpbmcgYSBkaXJlY3RvcnkuCi0gICAgICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTeW5jUmVzdWx0IHB1c2goU3RyaW5nW10gbG9jYWwsIEZpbGVFbnRyeSByZW1vdGUsIElTeW5jUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgaWYgKHJlbW90ZS5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX1JFTU9URV9JU19GSUxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2UgYSBsaXN0IG9mIEZpbGUgZnJvbSB0aGUgbGlzdCBvZiBTdHJpbmcKLSAgICAgICAgQXJyYXlMaXN0PEZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogbG9jYWwpIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZChuZXcgRmlsZShwYXRoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHRvdGFsIGNvdW50IG9mIHRoZSBieXRlcyB0byB0cmFuc2ZlcgotICAgICAgICBGaWxlW10gZmlsZUFycmF5ID0gZmlsZXMudG9BcnJheShuZXcgRmlsZVtmaWxlcy5zaXplKCldKTsKLSAgICAgICAgaW50IHRvdGFsID0gZ2V0VG90YWxMb2NhbEZpbGVTaXplKGZpbGVBcnJheSk7Ci0KLSAgICAgICAgbW9uaXRvci5zdGFydCh0b3RhbCk7Ci0KLSAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBkb1B1c2goZmlsZUFycmF5LCByZW1vdGUuZ2V0RnVsbFBhdGgoKSwgbW9uaXRvcik7Ci0KLSAgICAgICAgbW9uaXRvci5zdG9wKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoIGEgc2luZ2xlIGZpbGUuCi0gICAgICogQHBhcmFtIGxvY2FsIHRoZSBsb2NhbCBmaWxlcGF0aC4KLSAgICAgKiBAcGFyYW0gcmVtb3RlIFRoZSByZW1vdGUgZmlsZXBhdGguCi0gICAgICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTeW5jUmVzdWx0IHB1c2hGaWxlKFN0cmluZyBsb2NhbCwgU3RyaW5nIHJlbW90ZSwgSVN5bmNQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShsb2NhbCk7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX05PX0xPQ0FMX0ZJTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9MT0NBTF9JU19ESVJFQ1RPUlkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9uaXRvci5zdGFydCgoaW50KWYubGVuZ3RoKCkpOwotCi0gICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gZG9QdXNoRmlsZShsb2NhbCwgcmVtb3RlLCBtb25pdG9yKTsKLQotICAgICAgICBtb25pdG9yLnN0b3AoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbXB1dGUgdGhlIHJlY3Vyc2l2ZSBmaWxlIHNpemUgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgbGlzdC4gRm9sZGVyCi0gICAgICogaGF2ZSBhIHdlaWdodCBvZiAxLgotICAgICAqIEBwYXJhbSBlbnRyaWVzCi0gICAgICogQHBhcmFtIGZscwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRUb3RhbFJlbW90ZUZpbGVTaXplKEZpbGVFbnRyeVtdIGVudHJpZXMsIEZpbGVMaXN0aW5nU2VydmljZSBmbHMpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChGaWxlRW50cnkgZSA6IGVudHJpZXMpIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gZS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBGaWxlTGlzdGluZ1NlcnZpY2UuVFlQRV9ESVJFQ1RPUlkpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgRmlsZUVudHJ5W10gY2hpbGRyZW4gPSBmbHMuZ2V0Q2hpbGRyZW4oZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgICAgIGNvdW50ICs9IGdldFRvdGFsUmVtb3RlRmlsZVNpemUoY2hpbGRyZW4sIGZscykgKyAxOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX0ZJTEUpIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSBlLmdldFNpemVWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbXB1dGUgdGhlIHJlY3Vyc2l2ZSBmaWxlIHNpemUgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgbGlzdC4gRm9sZGVyCi0gICAgICogaGF2ZSBhIHdlaWdodCBvZiAxLgotICAgICAqIFRoaXMgZG9lcyBub3QgY2hlY2sgZm9yIGNpcmN1bGFyIGxpbmtzLgotICAgICAqIEBwYXJhbSBmaWxlcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRUb3RhbExvY2FsRmlsZVNpemUoRmlsZVtdIGZpbGVzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChGaWxlIGYgOiBmaWxlcykgewotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUb3RhbExvY2FsRmlsZVNpemUoZi5saXN0RmlsZXMoKSkgKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBmLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWxscyBtdWx0aXBsZSBmaWxlcy9mb2xkZXJzIHJlY3Vyc2l2ZWx5LgotICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBsaXN0IG9mIGVudHJ5IHRvIHB1bGwKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXRoIHRoZSBsb2NhbHBhdGggdG8gYSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gZmlsZUxpc3RpbmdTZXJ2aWNlIGEgRmlsZUxpc3RpbmdTZXJ2aWNlIG9iamVjdCB0byBicm93c2UgdGhyb3VnaCByZW1vdGUgZGlyZWN0b3JpZXMuCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IuIE11c3QgYmUgc3RhcnRlZCBhbHJlYWR5LgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgU3luY1Jlc3VsdCBkb1B1bGwoRmlsZUVudHJ5W10gZW50cmllcywgU3RyaW5nIGxvY2FsUGF0aCwKLSAgICAgICAgICAgIEZpbGVMaXN0aW5nU2VydmljZSBmaWxlTGlzdGluZ1NlcnZpY2UsCi0gICAgICAgICAgICBJU3luY1Byb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgZm9yIChGaWxlRW50cnkgZSA6IGVudHJpZXMpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGNhbmNlbGxlZAotICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHR5cGUgKHdlIG9ubHkgcHVsbCBkaXJlY3RvcnkgYW5kIGZpbGVzIGZvciBub3cpCi0gICAgICAgICAgICBpbnQgdHlwZSA9IGUuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfRElSRUNUT1JZKSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5zdGFydFN1YlRhc2soZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVzdCA9IGxvY2FsUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShkZXN0KTsKLSAgICAgICAgICAgICAgICBkLm1rZGlyKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGVuIHJlY3Vyc2l2ZWx5IGNhbGwgdGhlIGNvbnRlbnQuIFNpbmNlIHdlIGRpZCBhIGxzIGNvbW1hbmQKLSAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIG51bWJlciBvZiBmaWxlcywgd2UgY2FuIHVzZSB0aGUgY2FjaGUKLSAgICAgICAgICAgICAgICBGaWxlRW50cnlbXSBjaGlsZHJlbiA9IGZpbGVMaXN0aW5nU2VydmljZS5nZXRDaGlsZHJlbihlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IGRvUHVsbChjaGlsZHJlbiwgZGVzdCwgZmlsZUxpc3RpbmdTZXJ2aWNlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1Db2RlICE9IFJFU1VMVF9PSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb25pdG9yLmFkdmFuY2UoMSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfRklMRSkgewotICAgICAgICAgICAgICAgIG1vbml0b3Iuc3RhcnRTdWJUYXNrKGUuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlc3QgPSBsb2NhbFBhdGggKyBGaWxlLnNlcGFyYXRvciArIGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gZG9QdWxsRmlsZShlLmdldEZ1bGxQYXRoKCksIGRlc3QsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubUNvZGUgIT0gUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9PSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVsbHMgYSByZW1vdGUgZmlsZQotICAgICAqIEBwYXJhbSByZW1vdGVQYXRoIHRoZSByZW1vdGUgZmlsZSAobGVuZ3RoIG1heCBpcyAxMDI0KQotICAgICAqIEBwYXJhbSBsb2NhbFBhdGggdGhlIGxvY2FsIGRlc3RpbmF0aW9uCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IuIFRoZSBtb25pdG9yIG11c3QgYmUgc3RhcnRlZCBhbHJlYWR5LgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgU3luY1Jlc3VsdCBkb1B1bGxGaWxlKFN0cmluZyByZW1vdGVQYXRoLCBTdHJpbmcgbG9jYWxQYXRoLAotICAgICAgICAgICAgSVN5bmNQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBieXRlW10gbXNnID0gbnVsbDsKLSAgICAgICAgYnl0ZVtdIHB1bGxSZXN1bHQgPSBuZXcgYnl0ZVs4XTsKLQotICAgICAgICBmaW5hbCBpbnQgdGltZU91dCA9IERkbVByZWZlcmVuY2VzLmdldFRpbWVPdXQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJlbW90ZVBhdGhDb250ZW50ID0gcmVtb3RlUGF0aC5nZXRCeXRlcyhBZGJIZWxwZXIuREVGQVVMVF9FTkNPRElORyk7Ci0KLSAgICAgICAgICAgIGlmIChyZW1vdGVQYXRoQ29udGVudC5sZW5ndGggPiBSRU1PVEVfUEFUSF9NQVhfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9SRU1PVEVfUEFUSF9MRU5HVEgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZ1bGwgcmVxdWVzdCBtZXNzYWdlCi0gICAgICAgICAgICBtc2cgPSBjcmVhdGVGaWxlUmVxKElEX1JFQ1YsIHJlbW90ZVBhdGhDb250ZW50KTsKLQotICAgICAgICAgICAgLy8gYW5kIHNlbmQgaXQuCi0gICAgICAgICAgICBBZGJIZWxwZXIud3JpdGUobUNoYW5uZWwsIG1zZywgLTEsIHRpbWVPdXQpOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSByZXN1bHQsIGluIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIDIgaW50cwotICAgICAgICAgICAgLy8gKGlkLCBzaXplKQotICAgICAgICAgICAgQWRiSGVscGVyLnJlYWQobUNoYW5uZWwsIHB1bGxSZXN1bHQsIC0xLCB0aW1lT3V0KTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgd2UgaGF2ZSB0aGUgcHJvcGVyIGRhdGEgYmFjawotICAgICAgICAgICAgaWYgKGNoZWNrUmVzdWx0KHB1bGxSZXN1bHQsIElEX0RBVEEpID09IGZhbHNlICYmCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdWx0KHB1bGxSZXN1bHQsIElEX0RPTkUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9DT05ORUNUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX1JFTU9URV9QQVRIX0VOQ09ESU5HLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9DT05ORUNUSU9OX0VSUk9SLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFjY2VzcyB0aGUgZGVzdGluYXRpb24gZmlsZQotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShsb2NhbFBhdGgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgc3RyZWFtIHRvIHdyaXRlIGluIHRoZSBmaWxlLiBXZSB1c2UgYSBuZXcgdHJ5L2NhdGNoIGJsb2NrIHRvIGRpZmZlcmVudGlhdGUKLSAgICAgICAgLy8gYmV0d2VlbiBmaWxlIGFuZCBuZXR3b3JrIGlvIGV4Y2VwdGlvbnMuCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9GSUxFX1dSSVRFX0VSUk9SLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBidWZmZXIgdG8gcmVhZCB0aGUgZGF0YQotICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW1NZTkNfREFUQV9NQVhdOwotCi0gICAgICAgIC8vIGxvb3AgdG8gZ2V0IGRhdGEgdW50aWwgd2UncmUgZG9uZS4KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGNhbmNlbGxlZAotICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UncmUgZG9uZSwgd2Ugc3RvcCB0aGUgbG9vcAotICAgICAgICAgICAgaWYgKGNoZWNrUmVzdWx0KHB1bGxSZXN1bHQsIElEX0RPTkUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hlY2tSZXN1bHQocHVsbFJlc3VsdCwgSURfREFUQSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBobW0gdGhlcmUncyBhbiBlcnJvcgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfQ09OTkVDVElPTl9FUlJPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXlIZWxwZXIuc3dhcDMyYml0RnJvbUFycmF5KHB1bGxSZXN1bHQsIDQpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IFNZTkNfREFUQV9NQVgpIHsKLSAgICAgICAgICAgICAgICAvLyBidWZmZXIgb3ZlcnJ1biEKLSAgICAgICAgICAgICAgICAvLyBlcnJvciBhbmQgZXhpdAotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfQlVGRkVSX09WRVJSVU4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIG5vdyByZWFkIHRoZSBsZW5ndGggd2UgcmVjZWl2ZWQKLSAgICAgICAgICAgICAgICBBZGJIZWxwZXIucmVhZChtQ2hhbm5lbCwgZGF0YSwgbGVuZ3RoLCB0aW1lT3V0KTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaGVhZGVyIGZvciB0aGUgbmV4dCBwYWNrZXQuCi0gICAgICAgICAgICAgICAgQWRiSGVscGVyLnJlYWQobUNoYW5uZWwsIHB1bGxSZXN1bHQsIC0xLCB0aW1lT3V0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX0NPTk5FQ1RJT05fRVJST1IsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgY29udGVudCBpbiB0aGUgZmlsZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3Mud3JpdGUoZGF0YSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX0ZJTEVfV1JJVEVfRVJST1IsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtb25pdG9yLmFkdmFuY2UobGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9GSUxFX1dSSVRFX0VSUk9SLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX09LKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFB1c2ggbXVsdGlwbGUgZmlsZXMKLSAgICAgKiBAcGFyYW0gZmlsZUFycmF5Ci0gICAgICogQHBhcmFtIHJlbW90ZVBhdGgKLSAgICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3luY1Jlc3VsdH0gb2JqZWN0IHdpdGggYSBjb2RlIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgU3luY1Jlc3VsdCBkb1B1c2goRmlsZVtdIGZpbGVBcnJheSwgU3RyaW5nIHJlbW90ZVBhdGgsIElTeW5jUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgZm9yIChGaWxlIGYgOiBmaWxlQXJyYXkpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGNhbmNlbGVkCi0gICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIHRoZSByZW1vdGUgcGF0aAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzdCA9IHJlbW90ZVBhdGggKyAiLyIgKyBmLmdldE5hbWUoKTsgLy8gJE5PTi1OTFMtMVMKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zdGFydFN1YlRhc2soZGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gZG9QdXNoKGYubGlzdEZpbGVzKCksIGRlc3QsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubUNvZGUgIT0gUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5hZHZhbmNlKDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdGhlIHJlbW90ZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdGVGaWxlID0gcmVtb3RlUGF0aCArICIvIiArIGYuZ2V0TmFtZSgpOyAvLyAkTk9OLU5MUy0xUwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnN0YXJ0U3ViVGFzayhyZW1vdGVGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBkb1B1c2hGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIHJlbW90ZUZpbGUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1Db2RlICE9IFJFU1VMVF9PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfT0spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2ggYSBzaW5nbGUgZmlsZQotICAgICAqIEBwYXJhbSBsb2NhbFBhdGggdGhlIGxvY2FsIGZpbGUgdG8gcHVzaAotICAgICAqIEBwYXJhbSByZW1vdGVQYXRoIHRoZSByZW1vdGUgZmlsZSAobGVuZ3RoIG1heCBpcyAxMDI0KQotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yLiBUaGUgbW9uaXRvciBtdXN0IGJlIHN0YXJ0ZWQgYWxyZWFkeS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN5bmNSZXN1bHR9IG9iamVjdCB3aXRoIGEgY29kZSBhbmQgYW4gb3B0aW9uYWwgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN5bmNSZXN1bHQgZG9QdXNoRmlsZShTdHJpbmcgbG9jYWxQYXRoLCBTdHJpbmcgcmVtb3RlUGF0aCwKLSAgICAgICAgICAgIElTeW5jUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgIGJ5dGVbXSBtc2c7Ci0KLSAgICAgICAgZmluYWwgaW50IHRpbWVPdXQgPSBEZG1QcmVmZXJlbmNlcy5nZXRUaW1lT3V0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSByZW1vdGVQYXRoQ29udGVudCA9IHJlbW90ZVBhdGguZ2V0Qnl0ZXMoQWRiSGVscGVyLkRFRkFVTFRfRU5DT0RJTkcpOwotCi0gICAgICAgICAgICBpZiAocmVtb3RlUGF0aENvbnRlbnQubGVuZ3RoID4gUkVNT1RFX1BBVEhfTUFYX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfUkVNT1RFX1BBVEhfTEVOR1RIKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobG9jYWxQYXRoKTsKLQotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBzdGlsbC4uLgotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX05PX0xPQ0FMX0ZJTEUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHN0cmVhbSB0byByZWFkIHRoZSBmaWxlCi0gICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGhlYWRlciBmb3IgdGhlIGFjdGlvbgotICAgICAgICAgICAgbXNnID0gY3JlYXRlU2VuZEZpbGVSZXEoSURfU0VORCwgcmVtb3RlUGF0aENvbnRlbnQsIDA2NDQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfUkVNT1RFX1BBVEhfRU5DT0RJTkcsIGUpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9GSUxFX1JFQURfRVJST1IsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIHNlbmQgaXQuIFdlIHVzZSBhIGN1c3RvbSB0cnkvY2F0Y2ggYmxvY2sgdG8gbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgIC8vIGZpbGUgYW5kIG5ldHdvcmsgSU8gZXhjZXB0aW9ucy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkYkhlbHBlci53cml0ZShtQ2hhbm5lbCwgbXNnLCAtMSwgdGltZU91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfQ09OTkVDVElPTl9FUlJPUiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGJ1ZmZlciB1c2VkIHRvIHJlYWQuCi0gICAgICAgIC8vIHdlIHJlYWQgbWF4IFNZTkNfREFUQV9NQVgsIGJ1dCB3ZSBuZWVkIDIgNCBieXRlcyBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVmZmVyID0gbmV3IGJ5dGVbU1lOQ19EQVRBX01BWCArIDhdOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoSURfREFUQSwgMCwgbUJ1ZmZlciwgMCwgSURfREFUQS5sZW5ndGgpOwotCi0gICAgICAgIC8vIGxvb2sgd2hpbGUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGNhbmNlbGVkCi0gICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWFkIHVwIHRvIFNZTkNfREFUQV9NQVgKLSAgICAgICAgICAgIGludCByZWFkQ291bnQgPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkQ291bnQgPSBmaXMucmVhZChtQnVmZmVyLCA4LCBTWU5DX0RBVEFfTUFYKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNSZXN1bHQoUkVTVUxUX0ZJTEVfUkVBRF9FUlJPUiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkQ291bnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHNlbmQgdGhlIGRhdGEgdG8gdGhlIGRldmljZQotICAgICAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIGFtb3VudCByZWFkCi0gICAgICAgICAgICBBcnJheUhlbHBlci5zd2FwMzJiaXRzVG9BcnJheShyZWFkQ291bnQsIG1CdWZmZXIsIDQpOwotCi0gICAgICAgICAgICAvLyBub3cgd3JpdGUgaXQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQWRiSGVscGVyLndyaXRlKG1DaGFubmVsLCBtQnVmZmVyLCByZWFkQ291bnQrOCwgdGltZU91dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9DT05ORUNUSU9OX0VSUk9SLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYW5kIGFkdmFuY2UgdGhlIG1vbml0b3IKLSAgICAgICAgICAgIG1vbml0b3IuYWR2YW5jZShyZWFkQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNsb3NlIHRoZSBsb2NhbCBmaWxlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9GSUxFX1JFQURfRVJST1IsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRE9ORSBtZXNzYWdlCi0gICAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDA7Ci0gICAgICAgICAgICBtc2cgPSBjcmVhdGVSZXEoSURfRE9ORSwgKGludCl0aW1lKTsKLQotICAgICAgICAgICAgLy8gYW5kIHNlbmQgaXQuCi0gICAgICAgICAgICBBZGJIZWxwZXIud3JpdGUobUNoYW5uZWwsIG1zZywgLTEsIHRpbWVPdXQpOwotCi0gICAgICAgICAgICAvLyByZWFkIHRoZSByZXN1bHQsIGluIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIDIgaW50cwotICAgICAgICAgICAgLy8gKGlkLCBzaXplKQotICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlWzhdOwotICAgICAgICAgICAgQWRiSGVscGVyLnJlYWQobUNoYW5uZWwsIHJlc3VsdCwgLTEgLyogZnVsbCBsZW5ndGggKi8sIHRpbWVPdXQpOwotCi0gICAgICAgICAgICBpZiAoY2hlY2tSZXN1bHQocmVzdWx0LCBJRF9PS0FZKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGlmIChjaGVja1Jlc3VsdChyZXN1bHQsIElEX0ZBSUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgc29tZSBlcnJvciBtZXNzYWdlLi4uCi0gICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBBcnJheUhlbHBlci5zd2FwMzJiaXRGcm9tQXJyYXkocmVzdWx0LCA0KTsKLQotICAgICAgICAgICAgICAgICAgICBBZGJIZWxwZXIucmVhZChtQ2hhbm5lbCwgbUJ1ZmZlciwgbGVuLCB0aW1lT3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgdGhlIHJlc3VsdD8KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKG1CdWZmZXIsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJkZG1zIiwgInRyYW5zZmVyIGVycm9yOiAiICsgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfVU5LTk9XTl9FUlJPUiwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9VTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzdWx0KFJFU1VMVF9DT05ORUNUSU9OX0VSUk9SLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU3luY1Jlc3VsdChSRVNVTFRfT0spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1vZGUgb2YgdGhlIHJlbW90ZSBmaWxlLgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSByZW1vdGUgZmlsZQotICAgICAqIEByZXR1cm4gYW5kIEludGVnZXIgY29udGFpbmluZyB0aGUgbW9kZSBpZiBhbGwgd2VudCB3ZWxsIG9yIG51bGwKLSAgICAgKiAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgSW50ZWdlciByZWFkTW9kZShTdHJpbmcgcGF0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzdGF0IHJlcXVlc3QgbWVzc2FnZS4KLSAgICAgICAgICAgIGJ5dGVbXSBtc2cgPSBjcmVhdGVGaWxlUmVxKElEX1NUQVQsIHBhdGgpOwotCi0gICAgICAgICAgICBBZGJIZWxwZXIud3JpdGUobUNoYW5uZWwsIG1zZywgLTEgLyogZnVsbCBsZW5ndGggKi8sIERkbVByZWZlcmVuY2VzLmdldFRpbWVPdXQoKSk7Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3VsdCwgaW4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgNCBpbnRzCi0gICAgICAgICAgICAvLyAoaWQsIG1vZGUsIHNpemUsIHRpbWUpCi0gICAgICAgICAgICBieXRlW10gc3RhdFJlc3VsdCA9IG5ldyBieXRlWzE2XTsKLSAgICAgICAgICAgIEFkYkhlbHBlci5yZWFkKG1DaGFubmVsLCBzdGF0UmVzdWx0LCAtMSAvKiBmdWxsIGxlbmd0aCAqLywgRGRtUHJlZmVyZW5jZXMuZ2V0VGltZU91dCgpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgd2UgaGF2ZSB0aGUgcHJvcGVyIGRhdGEgYmFjawotICAgICAgICAgICAgaWYgKGNoZWNrUmVzdWx0KHN0YXRSZXN1bHQsIElEX1NUQVQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIHJldHVybiB0aGUgbW9kZSAoMm5kIGludCBpbiB0aGUgYXJyYXkpCi0gICAgICAgICAgICByZXR1cm4gQXJyYXlIZWxwZXIuc3dhcDMyYml0RnJvbUFycmF5KHN0YXRSZXN1bHQsIDQpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbW1hbmQgd2l0aCBhIGNvZGUgYW5kIGFuIGludCB2YWx1ZXMKLSAgICAgKiBAcGFyYW0gY29tbWFuZAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gY3JlYXRlUmVxKGJ5dGVbXSBjb21tYW5kLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbOF07Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21tYW5kLCAwLCBhcnJheSwgMCwgNCk7Ci0gICAgICAgIEFycmF5SGVscGVyLnN3YXAzMmJpdHNUb0FycmF5KHZhbHVlLCBhcnJheSwgNCk7Ci0KLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgYXJyYXkgZm9yIGEgc3RhdCByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSA0IGJ5dGUgY29tbWFuZCAoSURfU1RBVCwgSURfUkVDViwgLi4uKQotICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSByZW1vdGUgZmlsZSBvbiB3aGljaCB0byBleGVjdXRlIHRoZSBjb21tYW5kCi0gICAgICogQHJldHVybiB0aGUgYnl0ZVtdIHRvIHNlbmQgdG8gdGhlIGRldmljZSB0aHJvdWdoIGFkYgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBjcmVhdGVGaWxlUmVxKGJ5dGVbXSBjb21tYW5kLCBTdHJpbmcgcGF0aCkgewotICAgICAgICBieXRlW10gcGF0aENvbnRlbnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGF0aENvbnRlbnQgPSBwYXRoLmdldEJ5dGVzKEFkYkhlbHBlci5ERUZBVUxUX0VOQ09ESU5HKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVGaWxlUmVxKGNvbW1hbmQsIHBhdGhDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGFycmF5IGZvciBhIGZpbGUgcmVxdWVzdC4gVGhpcyBjcmVhdGVzIGFuIGFycmF5IHdpdGggYSA0IGJ5dGUgY29tbWFuZCArIHRoZQotICAgICAqIHJlbW90ZSBmaWxlIG5hbWUuCi0gICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIDQgYnl0ZSBjb21tYW5kIChJRF9TVEFULCBJRF9SRUNWLCAuLi4pLgotICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoLCBhcyBhIGJ5dGUgYXJyYXksIG9mIHRoZSByZW1vdGUgZmlsZSBvbiB3aGljaCB0bwotICAgICAqICAgICAgZXhlY3V0ZSB0aGUgY29tbWFuZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBieXRlW10gdG8gc2VuZCB0byB0aGUgZGV2aWNlIHRocm91Z2ggYWRiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNyZWF0ZUZpbGVSZXEoYnl0ZVtdIGNvbW1hbmQsIGJ5dGVbXSBwYXRoKSB7Ci0gICAgICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlWzggKyBwYXRoLmxlbmd0aF07Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21tYW5kLCAwLCBhcnJheSwgMCwgNCk7Ci0gICAgICAgIEFycmF5SGVscGVyLnN3YXAzMmJpdHNUb0FycmF5KHBhdGgubGVuZ3RoLCBhcnJheSwgNCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgYXJyYXksIDgsIHBhdGgubGVuZ3RoKTsKLQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNyZWF0ZVNlbmRGaWxlUmVxKGJ5dGVbXSBjb21tYW5kLCBieXRlW10gcGF0aCwgaW50IG1vZGUpIHsKLSAgICAgICAgLy8gbWFrZSB0aGUgbW9kZSBpbnRvIGEgc3RyaW5nCi0gICAgICAgIFN0cmluZyBtb2RlU3RyID0gIiwiICsgKG1vZGUgJiAwNzc3KTsgLy8gJE5PTi1OTFMtMVMKLSAgICAgICAgYnl0ZVtdIG1vZGVDb250ZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vZGVDb250ZW50ID0gbW9kZVN0ci5nZXRCeXRlcyhBZGJIZWxwZXIuREVGQVVMVF9FTkNPRElORyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVs4ICsgcGF0aC5sZW5ndGggKyBtb2RlQ29udGVudC5sZW5ndGhdOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tbWFuZCwgMCwgYXJyYXksIDAsIDQpOwotICAgICAgICBBcnJheUhlbHBlci5zd2FwMzJiaXRzVG9BcnJheShwYXRoLmxlbmd0aCArIG1vZGVDb250ZW50Lmxlbmd0aCwgYXJyYXksIDQpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhdGgsIDAsIGFycmF5LCA4LCBwYXRoLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobW9kZUNvbnRlbnQsIDAsIGFycmF5LCA4ICsgcGF0aC5sZW5ndGgsIG1vZGVDb250ZW50Lmxlbmd0aCk7Ci0KLSAgICAgICAgcmV0dXJuIGFycmF5OwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHJlc3VsdCBhcnJheSBzdGFydHMgd2l0aCB0aGUgcHJvdmlkZWQgY29kZQotICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCBhcnJheSB0byBjaGVjawotICAgICAqIEBwYXJhbSBjb2RlIFRoZSA0IGJ5dGUgY29kZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgbWF0Y2hlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUmVzdWx0KGJ5dGVbXSByZXN1bHQsIGJ5dGVbXSBjb2RlKSB7Ci0gICAgICAgIGlmIChyZXN1bHRbMF0gIT0gY29kZVswXSB8fAotICAgICAgICAgICAgICAgIHJlc3VsdFsxXSAhPSBjb2RlWzFdIHx8Ci0gICAgICAgICAgICAgICAgcmVzdWx0WzJdICE9IGNvZGVbMl0gfHwKLSAgICAgICAgICAgICAgICByZXN1bHRbM10gIT0gY29kZVszXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RmlsZVR5cGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKChtb2RlICYgU19JU09DSykgPT0gU19JU09DSykgewotICAgICAgICAgICAgcmV0dXJuIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX1NPQ0tFVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobW9kZSAmIFNfSUZMTkspID09IFNfSUZMTkspIHsKLSAgICAgICAgICAgIHJldHVybiBGaWxlTGlzdGluZ1NlcnZpY2UuVFlQRV9MSU5LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtb2RlICYgU19JRlJFRykgPT0gU19JRlJFRykgewotICAgICAgICAgICAgcmV0dXJuIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX0ZJTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1vZGUgJiBTX0lGQkxLKSA9PSBTX0lGQkxLKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfQkxPQ0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1vZGUgJiBTX0lGRElSKSA9PSBTX0lGRElSKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfRElSRUNUT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtb2RlICYgU19JRkNIUikgPT0gU19JRkNIUikgewotICAgICAgICAgICAgcmV0dXJuIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX0NIQVJBQ1RFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobW9kZSAmIFNfSUZJRk8pID09IFNfSUZJRk8pIHsKLSAgICAgICAgICAgIHJldHVybiBGaWxlTGlzdGluZ1NlcnZpY2UuVFlQRV9GSUZPOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX09USEVSOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9UaHJlYWRJbmZvLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvVGhyZWFkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI4NGYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9UaHJlYWRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliOwotCi0vKioKLSAqIEhvbGRzIGEgdGhyZWFkIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGhyZWFkSW5mbyBpbXBsZW1lbnRzIElTdGFja1RyYWNlSW5mbyB7Ci0gICAgcHJpdmF0ZSBpbnQgbVRocmVhZElkOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaHJlYWROYW1lOwotICAgIHByaXZhdGUgaW50IG1TdGF0dXM7Ci0gICAgcHJpdmF0ZSBpbnQgbVRpZDsKLSAgICBwcml2YXRlIGludCBtVXRpbWU7Ci0gICAgcHJpdmF0ZSBpbnQgbVN0aW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEYWVtb247Ci0gICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudFtdIG1UcmFjZTsKLSAgICBwcml2YXRlIGxvbmcgbVRyYWNlVGltZTsKLQotICAgIC8vIHByaW9yaXR5PwotICAgIC8vIHRvdGFsIENQVSB1c2VkPwotICAgIC8vIG1ldGhvZCBhdCB0b3Agb2Ygc3RhY2s/Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Qgd2l0aCBiYXNpYyBpZGVudGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBUaHJlYWRJbmZvKGludCB0aHJlYWRJZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLSAgICAgICAgbVRocmVhZElkID0gdGhyZWFkSWQ7Ci0gICAgICAgIG1UaHJlYWROYW1lID0gdGhyZWFkTmFtZTsKLQotICAgICAgICBtU3RhdHVzID0gLTE7Ci0gICAgICAgIC8vbVRpZCA9IG1VdGltZSA9IG1TdGltZSA9IDA7Ci0gICAgICAgIC8vbUlzRGFlbW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdpdGggdGhlIHZhbHVlcyB3ZSBnZXQgZnJvbSBhIFRIU1QgY2h1bmsuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVUaHJlYWQoaW50IHN0YXR1cywgaW50IHRpZCwgaW50IHV0aW1lLCBpbnQgc3RpbWUsIGJvb2xlYW4gaXNEYWVtb24pIHsKLQotICAgICAgICBtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtVGlkID0gdGlkOwotICAgICAgICBtVXRpbWUgPSB1dGltZTsKLSAgICAgICAgbVN0aW1lID0gc3RpbWU7Ci0gICAgICAgIG1Jc0RhZW1vbiA9IGlzRGFlbW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGFjayBjYWxsIG9mIHRoZSB0aHJlYWQuCi0gICAgICogQHBhcmFtIHRyYWNlIHN0YWNrY2FsbCBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIHNldFN0YWNrQ2FsbChTdGFja1RyYWNlRWxlbWVudFtdIHRyYWNlKSB7Ci0gICAgICAgIG1UcmFjZSA9IHRyYWNlOwotICAgICAgICBtVHJhY2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGhyZWFkJ3MgSUQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUaHJlYWRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UaHJlYWRJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhyZWFkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UaHJlYWROYW1lOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFRocmVhZE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbVRocmVhZE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSB0aWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRUaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFZNIHRocmVhZCBzdGF0dXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1bXVsYXRpdmUgdXNlciB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VXRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVXRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBzeXN0ZW0gdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0aW1lKCkgewotICAgICAgICByZXR1cm4gbVN0aW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgZGFlbW9uIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhZW1vbigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0RhZW1vbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5JU3RhY2tUcmFjZUluZm8jZ2V0U3RhY2tUcmFjZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0YWNrVHJhY2VFbGVtZW50W10gZ2V0U3RhY2tUcmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSB0aW1lIG9mIHRoZSBzdGFja3RyYWNlIGRhdGEuCi0gICAgICogQHNlZSAjZ2V0U3RhY2tUcmFjZSgpCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0U3RhY2tDYWxsVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjZVRpbWU7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0V2ZW50Q29udGFpbmVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0V2ZW50Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTE4NmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9FdmVudENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyLkxvZ0VudHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBldmVudCBhbmQgaXRzIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudENvbnRhaW5lciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGFyaXNvbiBtZXRob2QgZm9yIHtAbGluayBFdmVudENvbnRhaW5lciN0ZXN0VmFsdWUoaW50LCBPYmplY3QsIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRDb250YWluZXIuQ29tcGFyZU1ldGhvZCl9Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgZW51bSBDb21wYXJlTWV0aG9kIHsKLSAgICAgICAgRVFVQUxfVE8oImVxdWFscyIsICI9PSIpLAotICAgICAgICBMRVNTRVJfVEhBTigibGVzcyB0aGFuIG9yIGVxdWFscyB0byIsICI8PSIpLAotICAgICAgICBMRVNTRVJfVEhBTl9TVFJJQ1QoImxlc3MgdGhhbiIsICI8IiksCi0gICAgICAgIEdSRUFURVJfVEhBTigiZ3JlYXRlciB0aGFuIG9yIGVxdWFscyB0byIsICI+PSIpLAotICAgICAgICBHUkVBVEVSX1RIQU5fU1RSSUNUKCJncmVhdGVyIHRoYW4iLCAiPiIpLAotICAgICAgICBCSVRfQ0hFQ0soImJpdCBjaGVjayIsICImIik7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRlc3RTdHJpbmc7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21wYXJlTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmcgdGVzdFN0cmluZykgewotICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgbVRlc3RTdHJpbmcgPSB0ZXN0U3RyaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGRpc3BsYXkgc3RyaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHNob3J0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRlc3RTdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUeXBlIGZvciBldmVudCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBFdmVudFZhbHVlVHlwZSB7Ci0gICAgICAgIFVOS05PV04oMCksCi0gICAgICAgIElOVCgxKSwKLSAgICAgICAgTE9ORygyKSwKLSAgICAgICAgU1RSSU5HKDMpLAotICAgICAgICBMSVNUKDQpLAotICAgICAgICBUUkVFKDUpOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBTVE9SQUdFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4oXFxkKylAKC4qKSQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYSB7QGxpbmsgRXZlbnRWYWx1ZVR5cGV9IGZyb20gYW4gaW50ZWdlciB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWF0Y2gKLSAgICAgICAgICogd2FzIGZvdW5kLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVnZXIgdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgRXZlbnRWYWx1ZVR5cGUgZ2V0RXZlbnRWYWx1ZVR5cGUoaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBmb3IgKEV2ZW50VmFsdWVUeXBlIHR5cGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLm1WYWx1ZSA9PSB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYSBzdG9yYWdlIHN0cmluZyBmb3IgYW4ge0BsaW5rIE9iamVjdH0gb2YgdHlwZSBzdXBwb3J0ZWQgYnkKLSAgICAgICAgICoge0BsaW5rIEV2ZW50VmFsdWVUeXBlfS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBTdHJpbmdzIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgY2FuIGJlIHJlbG9hZGVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNnZXRPYmplY3RGcm9tU3RvcmFnZVN0cmluZyhTdHJpbmcpfS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBOT1RFOiBmb3Igbm93LCBvbmx5IHtAbGluayAjU1RSSU5HfSwge0BsaW5rICNJTlR9LCBhbmQge0BsaW5rICNMT05HfSBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gImNvbnZlcnQiIGludG8gYSBzdG9yYWdlIHN0cmluZy4KLSAgICAgICAgICogQHJldHVybiBhIHN0cmluZyBzdG9yaW5nIHRoZSBvYmplY3QgYW5kIGl0cyB0eXBlIG9yIG51bGwgaWYgdGhlIHR5cGUgd2FzIG5vdCByZWNvZ25pemVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RvcmFnZVN0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNUUklORy5tVmFsdWUgKyAiQCIgKyAoU3RyaW5nKW9iamVjdDsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlQubVZhbHVlICsgIkAiICsgb2JqZWN0LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9ORy5tVmFsdWUgKyAiQCIgKyBvYmplY3QudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBPYmplY3R9IGZyb20gYSBzdG9yYWdlIHN0cmluZyBjcmVhdGVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNnZXRTdG9yYWdlU3RyaW5nKE9iamVjdCl9LgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0b3JhZ2Ugc3RyaW5nCi0gICAgICAgICAqIEByZXR1cm4gYW4ge0BsaW5rIE9iamVjdH0gb3IgbnVsbCBpZiB0aGUgc3RyaW5nIG9yIHR5cGUgd2VyZSBub3QgcmVjb2duaXplZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE9iamVjdEZyb21TdG9yYWdlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgTWF0Y2hlciBtID0gU1RPUkFHRV9QQVRURVJOLm1hdGNoZXIodmFsdWUpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRXZlbnRWYWx1ZVR5cGUgdHlwZSA9IGdldEV2ZW50VmFsdWVUeXBlKEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGVudW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRXZlbnRWYWx1ZVR5cGUoaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbVRhZzsKLSAgICBwdWJsaWMgaW50IHBpZDsgICAgLyogZ2VuZXJhdGluZyBwcm9jZXNzJ3MgcGlkICovCi0gICAgcHVibGljIGludCB0aWQ7ICAgIC8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHRpZCAqLwotICAgIHB1YmxpYyBpbnQgc2VjOyAgICAvKiBzZWNvbmRzIHNpbmNlIEVwb2NoICovCi0gICAgcHVibGljIGludCBuc2VjOyAgIC8qIG5hbm9zZWNvbmRzICovCi0KLSAgICBwcml2YXRlIE9iamVjdCBtRGF0YTsgCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBFdmVudENvbnRhaW5lcn0gZnJvbSBhIHtAbGluayBMb2dFbnRyeX0uCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgTG9nRW50cnkgZnJvbSB3aGljaCBwaWQsIHRpZCwgYW5kIHRpbWUgaW5mbyBpcyBjb3BpZWQuCi0gICAgICogQHBhcmFtIHRhZyB0aGUgZXZlbnQgdGFnIHZhbHVlCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgb2YgdGhlIEV2ZW50Q29udGFpbmVyLgotICAgICAqLwotICAgIEV2ZW50Q29udGFpbmVyKExvZ0VudHJ5IGVudHJ5LCBpbnQgdGFnLCBPYmplY3QgZGF0YSkgewotICAgICAgICBnZXRUeXBlKGRhdGEpOwotICAgICAgICBtVGFnID0gdGFnOwotICAgICAgICBtRGF0YSA9IGRhdGE7Ci0KLSAgICAgICAgcGlkID0gZW50cnkucGlkOwotICAgICAgICB0aWQgPSBlbnRyeS50aWQ7Ci0gICAgICAgIHNlYyA9IGVudHJ5LnNlYzsKLSAgICAgICAgbnNlYyA9IGVudHJ5Lm5zZWM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEV2ZW50Q29udGFpbmVyfSB3aXRoIHJhdyBkYXRhCi0gICAgICovCi0gICAgRXZlbnRDb250YWluZXIoaW50IHRhZywgaW50IHBpZCwgaW50IHRpZCwgaW50IHNlYywgaW50IG5zZWMsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIGdldFR5cGUoZGF0YSk7Ci0gICAgICAgIG1UYWcgPSB0YWc7Ci0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucGlkID0gcGlkOwotICAgICAgICB0aGlzLnRpZCA9IHRpZDsKLSAgICAgICAgdGhpcy5zZWMgPSBzZWM7Ci0gICAgICAgIHRoaXMubnNlYyA9IG5zZWM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0YSBhcyBhbiBpbnQuCi0gICAgICogQHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB0eXBlIGlzIG5vdCB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjSU5UfS4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSW50ZWdlciBnZXRJbnQoKSB0aHJvd3MgSW52YWxpZFR5cGVFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0VHlwZShtRGF0YSkgPT0gRXZlbnRWYWx1ZVR5cGUuSU5UKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpbURhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0YSBhcyBhIGxvbmcuCi0gICAgICogQHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB0eXBlIGlzIG5vdCB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjTE9OR30uIAotICAgICAqIEBzZWUgI2dldFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBMb25nIGdldExvbmcoKSB0aHJvd3MgSW52YWxpZFR5cGVFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0VHlwZShtRGF0YSkgPT0gRXZlbnRWYWx1ZVR5cGUuTE9ORykgewotICAgICAgICAgICAgcmV0dXJuIChMb25nKW1EYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0YSBhcyBhIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIGlmIHRoZSBkYXRhIHR5cGUgaXMgbm90IHtAbGluayBFdmVudFZhbHVlVHlwZSNTVFJJTkd9LgotICAgICAqIEBzZWUgI2dldFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldFR5cGUobURhdGEpID09IEV2ZW50VmFsdWVUeXBlLlNUUklORykgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbURhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbHVlIGJ5IGluZGV4LiBUaGUgcmV0dXJuIHR5cGUgaXMgZGVmaW5lZCBieSBpdHMgdHlwZS4KLSAgICAgKiBAcGFyYW0gdmFsdWVJbmRleCB0aGUgaW5kZXggb2YgdGhlIHZhbHVlLiBJZiB0aGUgZGF0YSBpcyBub3QgYSBsaXN0LCB0aGlzIGlzIGlnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQgdmFsdWVJbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWUobURhdGEsIHZhbHVlSW5kZXgsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2YWx1ZSBieSBpbmRleCBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0gdmFsdWVJbmRleCB0aGUgaW5kZXggb2YgdGhlIHZhbHVlLiBJZiB0aGUgZGF0YSBpcyBub3QgYSBsaXN0LCB0aGlzIGlzIGlnbm9yZWQuCi0gICAgICogQHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB0eXBlIGlzIG5vdCB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjSU5UfSwKLSAgICAgKiB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjTE9OR30sIHtAbGluayBFdmVudFZhbHVlVHlwZSNMSVNUfSwgb3IgaWYgdGhlIGl0ZW0gaW4gdGhlCi0gICAgICogbGlzdCBhdCBpbmRleCA8Y29kZT52YWx1ZUluZGV4PC9jb2RlPiBpcyBub3Qgb2YgdHlwZSB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjSU5UfSBvcgotICAgICAqIHtAbGluayBFdmVudFZhbHVlVHlwZSNMT05HfS4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldFZhbHVlQXNEb3VibGUoaW50IHZhbHVlSW5kZXgpIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzRG91YmxlKG1EYXRhLCB2YWx1ZUluZGV4LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdmFsdWUgYnkgaW5kZXggYXMgYSBTdHJpbmcuCi0gICAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IG9mIHRoZSB2YWx1ZS4gSWYgdGhlIGRhdGEgaXMgbm90IGEgbGlzdCwgdGhpcyBpcyBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgSW52YWxpZFR5cGVFeGNlcHRpb24gaWYgdGhlIGRhdGEgdHlwZSBpcyBub3Qge0BsaW5rIEV2ZW50VmFsdWVUeXBlI0lOVH0sCi0gICAgICoge0BsaW5rIEV2ZW50VmFsdWVUeXBlI0xPTkd9LCB7QGxpbmsgRXZlbnRWYWx1ZVR5cGUjU1RSSU5HfSwge0BsaW5rIEV2ZW50VmFsdWVUeXBlI0xJU1R9LAotICAgICAqIG9yIGlmIHRoZSBpdGVtIGluIHRoZSBsaXN0IGF0IGluZGV4IDxjb2RlPnZhbHVlSW5kZXg8L2NvZGU+IGlzIG5vdCBvZiB0eXBlCi0gICAgICoge0BsaW5rIEV2ZW50VmFsdWVUeXBlI0lOVH0sIHtAbGluayBFdmVudFZhbHVlVHlwZSNMT05HfSwgb3Ige0BsaW5rIEV2ZW50VmFsdWVUeXBlI1NUUklOR30KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoaW50IHZhbHVlSW5kZXgpIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKG1EYXRhLCB2YWx1ZUluZGV4LCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXZlbnRWYWx1ZVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFR5cGUobURhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBFdmVudFZhbHVlVHlwZSBnZXRUeXBlKE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuIEV2ZW50VmFsdWVUeXBlLklOVDsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgICAgcmV0dXJuIEV2ZW50VmFsdWVUeXBlLkxPTkc7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIEV2ZW50VmFsdWVUeXBlLlNUUklORzsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbGlzdCB0byBzZWUgaWYgd2UgaGF2ZSBhbm90aGVyIGxpc3QKLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSAoT2JqZWN0W10pZGF0YTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IG9iamVjdHMpIHsKLSAgICAgICAgICAgICAgICBFdmVudFZhbHVlVHlwZSB0eXBlID0gZ2V0VHlwZShvYmopOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEV2ZW50VmFsdWVUeXBlLkxJU1QgfHwgdHlwZSA9PSBFdmVudFZhbHVlVHlwZS5UUkVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFdmVudFZhbHVlVHlwZS5UUkVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBFdmVudFZhbHVlVHlwZS5MSVNUOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV2ZW50VmFsdWVUeXBlLlVOS05PV047Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4tdGggdmFsdWUgb2YgdGhpcyBldmVudCBhZ2FpbnN0IGEgcHJvdmlkZWQgdmFsdWUuCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgdmFsdWUgdG8gdGVzdAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIGNvbXBhcmVNZXRob2QgdGhlIG1ldGhvZCBvZiB0ZXN0aW5nCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0ZXN0IHBhc3NlZC4KLSAgICAgKiBAdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB2YWx1ZSB0byB0ZXN0IGFuZCB0aGUgdmFsdWUKLSAgICAgKiB0byB0ZXN0IGFnYWluc3QsIG9yIGlmIHRoZSBjb21wYXJlIG1ldGhvZCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzLgotICAgICAqIEBzZWUgQ29tcGFyZU1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZShpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgIENvbXBhcmVNZXRob2QgY29tcGFyZU1ldGhvZCkgdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgRXZlbnRWYWx1ZVR5cGUgdHlwZSA9IGdldFR5cGUobURhdGEpOwotICAgICAgICBpZiAoaW5kZXggPiAwICYmIHR5cGUgIT0gRXZlbnRWYWx1ZVR5cGUuTElTVCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBkYXRhID0gbURhdGE7Ci0gICAgICAgIGlmICh0eXBlID09IEV2ZW50VmFsdWVUeXBlLkxJU1QpIHsKLSAgICAgICAgICAgIGRhdGEgPSAoKE9iamVjdFtdKW1EYXRhKVtpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YS5nZXRDbGFzcygpLmVxdWFscyhkYXRhLmdldENsYXNzKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoY29tcGFyZU1ldGhvZCkgewotICAgICAgICAgICAgY2FzZSBFUVVBTF9UTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5lcXVhbHModmFsdWUpOwotICAgICAgICAgICAgY2FzZSBMRVNTRVJfVEhBTjoKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoKEludGVnZXIpZGF0YSkuY29tcGFyZVRvKChJbnRlZ2VyKXZhbHVlKSA8PSAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBMb25nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKChMb25nKWRhdGEpLmNvbXBhcmVUbygoTG9uZyl2YWx1ZSkgPD0gMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gb3RoZXIgdHlwZXMgY2FuJ3QgdXNlIHRoaXMgY29tcGFyZSBtZXRob2QuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIExFU1NFUl9USEFOX1NUUklDVDoKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoKEludGVnZXIpZGF0YSkuY29tcGFyZVRvKChJbnRlZ2VyKXZhbHVlKSA8IDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoKExvbmcpZGF0YSkuY29tcGFyZVRvKChMb25nKXZhbHVlKSA8IDApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG90aGVyIHR5cGVzIGNhbid0IHVzZSB0aGlzIGNvbXBhcmUgbWV0aG9kLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgY2FzZSBHUkVBVEVSX1RIQU46Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKChJbnRlZ2VyKWRhdGEpLmNvbXBhcmVUbygoSW50ZWdlcil2YWx1ZSkgPj0gMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoTG9uZylkYXRhKS5jb21wYXJlVG8oKExvbmcpdmFsdWUpID49IDApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG90aGVyIHR5cGVzIGNhbid0IHVzZSB0aGlzIGNvbXBhcmUgbWV0aG9kLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgY2FzZSBHUkVBVEVSX1RIQU5fU1RSSUNUOgotICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoSW50ZWdlcilkYXRhKS5jb21wYXJlVG8oKEludGVnZXIpdmFsdWUpID4gMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoTG9uZylkYXRhKS5jb21wYXJlVG8oKExvbmcpdmFsdWUpID4gMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gb3RoZXIgdHlwZXMgY2FuJ3QgdXNlIHRoaXMgY29tcGFyZSBtZXRob2QuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIEJJVF9DSEVDSzoKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoKEludGVnZXIpZGF0YSkuaW50VmFsdWUoKSAmICgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKSkgIT0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBMb25nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKChMb25nKWRhdGEpLmxvbmdWYWx1ZSgpICYgKChMb25nKXZhbHVlKS5sb25nVmFsdWUoKSkgIT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBvdGhlciB0eXBlcyBjYW4ndCB1c2UgdGhpcyBjb21wYXJlIG1ldGhvZC4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBkYXRhLCBpbnQgdmFsdWVJbmRleCwgYm9vbGVhbiByZWN1cnNpdmUpIHsKLSAgICAgICAgRXZlbnRWYWx1ZVR5cGUgdHlwZSA9IGdldFR5cGUoZGF0YSk7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UOgotICAgICAgICAgICAgY2FzZSBMT05HOgotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgICAgICBjYXNlIExJU1Q6Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBsaXN0ID0gKE9iamVjdFtdKSBkYXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJbmRleCA+PSAwICYmIHZhbHVlSW5kZXggPCBsaXN0Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKGxpc3RbdmFsdWVJbmRleF0sIHZhbHVlSW5kZXgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgZ2V0VmFsdWVBc0RvdWJsZShPYmplY3QgZGF0YSwgaW50IHZhbHVlSW5kZXgsIGJvb2xlYW4gcmVjdXJzaXZlKQotICAgICAgICAgICAgdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgRXZlbnRWYWx1ZVR5cGUgdHlwZSA9IGdldFR5cGUoZGF0YSk7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpZGF0YSkuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMb25nKWRhdGEpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICBpZiAocmVjdXJzaXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGxpc3QgPSAoT2JqZWN0W10pIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUluZGV4ID49IDAgJiYgdmFsdWVJbmRleCA8IGxpc3QubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0RvdWJsZShsaXN0W3ZhbHVlSW5kZXhdLCB2YWx1ZUluZGV4LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoT2JqZWN0IGRhdGEsIGludCB2YWx1ZUluZGV4LCBib29sZWFuIHJlY3Vyc2l2ZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEV2ZW50VmFsdWVUeXBlIHR5cGUgPSBnZXRUeXBlKGRhdGEpOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIElOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKWRhdGEpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIExPTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoTG9uZylkYXRhKS50b1N0cmluZygpOwotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZGF0YTsKLSAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICBpZiAocmVjdXJzaXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGxpc3QgPSAoT2JqZWN0W10pIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUluZGV4ID49IDAgJiYgdmFsdWVJbmRleCA8IGxpc3QubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhsaXN0W3ZhbHVlSW5kZXhdLCB2YWx1ZUluZGV4LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFZhbHVlQXNTdHJpbmcoKSBkb2Vzbid0IHN1cHBvcnQgRXZlbnRWYWx1ZVR5cGUuVFJFRSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiZ2V0VmFsdWVBc1N0cmluZygpIHVuc3VwcG9ydGVkIHR5cGU6IiArIHR5cGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvRXZlbnRMb2dQYXJzZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvRXZlbnRMb2dQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyY2U2OS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0V2ZW50TG9nUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliLmxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk11bHRpTGluZVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRDb250YWluZXIuRXZlbnRWYWx1ZVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudFZhbHVlRGVzY3JpcHRpb24uVmFsdWVUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuTG9nRW50cnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnV0aWxzLkFycmF5SGVscGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBQYXJzZXIgZm9yIHRoZSAiZXZlbnQiIGxvZy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV2ZW50TG9nUGFyc2VyIHsKLQotICAgIC8qKiBMb2NhdGlvbiBvZiB0aGUgdGFnIG1hcCBmaWxlIG9uIHRoZSBkZXZpY2UgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVZFTlRfVEFHX01BUF9GSUxFID0gIi9zeXN0ZW0vZXRjL2V2ZW50LWxvZy10YWdzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRXZlbnQgbG9nIGVudHJ5IHR5cGVzLiAgVGhlc2UgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBkZWNsYXJhdGlvbnMgaW4KLSAgICAgKiBqYXZhL2FuZHJvaWQvYW5kcm9pZC91dGlsL0V2ZW50TG9nLmphdmEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEVWRU5UX1RZUEVfSU5UICAgICAgPSAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBFVkVOVF9UWVBFX0xPTkcgICAgID0gMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRVZFTlRfVFlQRV9TVFJJTkcgICA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEVWRU5UX1RZUEVfTElTVCAgICAgPSAzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBQQVRURVJOX1NJTVBMRV9UQUcgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgIl4oXFxkKylcXHMrKFtBLVphLXowLTlfXSspXFxzKiQiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gUEFUVEVSTl9UQUdfV0lUSF9ERVNDID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4oXFxkKylcXHMrKFtBLVphLXowLTlfXSspXFxzKiguKilcXHMqJCIpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBQQVRURVJOX0RFU0NSSVBUSU9OID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIlxcKChbQS1aYS16MC05X1xcc10rKVxcfChcXGQrKShcXHxcXGQrKXswLDF9XFwpIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gVEVYVF9MT0dfTElORSA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICIoXFxkXFxkKS0oXFxkXFxkKVxccyhcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpLihcXGR7M30pXFxzK0kvKFthLXpBLVowLTlfXSspXFxzKlxcKFxccyooXFxkKylcXCk6XFxzKyguKikiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBUcmVlTWFwPEludGVnZXIsIFN0cmluZz4gbVRhZ01hcCA9IG5ldyBUcmVlTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgVHJlZU1hcDxJbnRlZ2VyLCBFdmVudFZhbHVlRGVzY3JpcHRpb25bXT4gbVZhbHVlRGVzY3JpcHRpb25NYXAgPQotICAgICAgICBuZXcgVHJlZU1hcDxJbnRlZ2VyLCBFdmVudFZhbHVlRGVzY3JpcHRpb25bXT4oKTsKLQotICAgIHB1YmxpYyBFdmVudExvZ1BhcnNlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0cyB0aGUgcGFyc2VyIGZvciBhIHNwZWNpZmljIERldmljZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2RzIHJlYWRzIHRoZSBldmVudC1sb2ctdGFncyBsb2NhdGVkIG9uIHRoZSBkZXZpY2UgdG8gZmluZCBvdXQKLSAgICAgKiB3aGF0IHRhZ3MgYXJlIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIGV2ZW50IGxvZyBhbmQgd2hhdCB0aGVpciBmb3JtYXQgaXMuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VzcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGZhaWx1cmUgb3IgY2FuY2VsbGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gcmVhZCB0aGUgZXZlbnQgdGFnIG1hcCBmaWxlIG9uIHRoZSBkZXZpY2UuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY2F0ICIgKyBFVkVOVF9UQUdfTUFQX0ZJTEUsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3IE11bHRpTGluZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUYWdMaW5lKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRzIHRoZSBwYXJzZXIgd2l0aCB0aGUgY29udGVudCBvZiBhIHRhZyBmaWxlLgotICAgICAqIEBwYXJhbSB0YWdGaWxlQ29udGVudCB0aGUgbGluZXMgb2YgYSB0YWcgZmlsZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3MsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoU3RyaW5nW10gdGFnRmlsZUNvbnRlbnQpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IHRhZ0ZpbGVDb250ZW50KSB7Ci0gICAgICAgICAgICBwcm9jZXNzVGFnTGluZShsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0cyB0aGUgcGFyc2VyIHdpdGggYSBzcGVjaWZpZWQgZXZlbnQtbG9nLXRhZ3MgZmlsZS4KLSAgICAgKiBAcGFyYW0gZmlsZVBhdGgKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3MsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoU3RyaW5nIGZpbGVQYXRoKSAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVQYXRoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGFnTGluZShsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChsaW5lICE9IG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbGluZSBmcm9tIHRoZSBldmVudC1sb2ctdGFncyBmaWxlLgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZ0xpbmUoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgLy8gaWdub3JlIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50IGxpbmVzCi0gICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCAmJiBsaW5lLmNoYXJBdCgwKSAhPSAnIycpIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBBVFRFUk5fVEFHX1dJVEhfREVTQy5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG1UYWdNYXAuZ2V0KHZhbHVlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGFnTWFwLnB1dCh2YWx1ZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBHQyB0YWcuIFdlIGlnbm9yZSB3aGF0IGlzIGluIHRoZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGFrZSB3aGF0IHRoZSBjdXN0b20gR2NFdmVudENvbnRhaW5lciBjbGFzcyB0ZWxscyB1cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkdWUgdG8gdGhlIGV2ZW50IGVuY29kaW5nIHNldmVyYWwgdmFsdWVzIG9uIDIgbG9uZ3MuCi0gICAgICAgICAgICAgICAgICAgIC8vIEBzZWUgR2NFdmVudENvbnRhaW5lcgotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gR2NFdmVudENvbnRhaW5lci5HQ19FVkVOVF9UQUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZURlc2NyaXB0aW9uTWFwLnB1dCh2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHY0V2ZW50Q29udGFpbmVyLmdldFZhbHVlRGVzY3JpcHRpb25zKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBtLmdyb3VwKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRWYWx1ZURlc2NyaXB0aW9uW10gZGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZURlc2NyaXB0aW9uTWFwLnB1dCh2YWx1ZSwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGNvbnZlcnQgdGhlIG51bWJlciBpbnRvIGEgc3RyaW5nLiBqdXN0IGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG0gPSBQQVRURVJOX1NJTVBMRV9UQUcubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG1UYWdNYXAuZ2V0KHZhbHVlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGFnTWFwLnB1dCh2YWx1ZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEV2ZW50VmFsdWVEZXNjcmlwdGlvbltdIHByb2Nlc3NEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgU3RyaW5nW10gZGVzY3JpcHRpb25zID0gZGVzY3JpcHRpb24uc3BsaXQoIlxccyosXFxzKiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgQXJyYXlMaXN0PEV2ZW50VmFsdWVEZXNjcmlwdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RXZlbnRWYWx1ZURlc2NyaXB0aW9uPigpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGRlc2MgOiBkZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBBVFRFUk5fREVTQ1JJUFRJT04ubWF0Y2hlcihkZXNjKTsKLSAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbS5ncm91cCgxKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZVN0cmluZyA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0eXBlVmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHR5cGVTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBFdmVudFZhbHVlVHlwZSBldmVudFZhbHVlVHlwZSA9IEV2ZW50VmFsdWVUeXBlLmdldEV2ZW50VmFsdWVUeXBlKHR5cGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudFZhbHVlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGlnbm9yZSB0aGlzIGRlc2NyaXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGxvZyB0aGUgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gbS5ncm91cCgzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcgIT0gbnVsbCAmJiB0eXBlU3RyaW5nLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9za2lwIHRoZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQodHlwZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgdmFsdWVUeXBlID0gVmFsdWVUeXBlLmdldFZhbHVlVHlwZSh0eXBlVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKG5hbWUsIGV2ZW50VmFsdWVUeXBlLCB2YWx1ZVR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24obmFtZSwgZXZlbnRWYWx1ZVR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgdGhpcyBkZXNjcmlwdGlvbiBpZiBvbmUgbnVtYmVyIGlzIG1hbGZvcm1lZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbG9nIHRoZSBlcnJvci4KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgdGhpcyBkZXNjcmlwdGlvbiBpZiBkYXRhIHR5cGUgYW5kIGRhdGEgdW5pdCBkb24ndCBtYXRjaAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBsb2cgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIkV2ZW50TG9nUGFyc2VyIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQ2FuJ3QgcGFyc2UgJTEkcyIsIGRlc2NyaXB0aW9uKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb25bbGlzdC5zaXplKCldKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBFdmVudENvbnRhaW5lciBwYXJzZShMb2dFbnRyeSBlbnRyeSkgewotICAgICAgICBpZiAoZW50cnkubGVuIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5PZmZzZXQgPSAwOwotCi0gICAgICAgIGludCB0YWdWYWx1ZSA9IEFycmF5SGVscGVyLnN3YXAzMmJpdEZyb21BcnJheShlbnRyeS5kYXRhLCBpbk9mZnNldCk7Ci0gICAgICAgIGluT2Zmc2V0ICs9IDQ7Ci0KLSAgICAgICAgU3RyaW5nIHRhZyA9IG1UYWdNYXAuZ2V0KHRhZ1ZhbHVlKTsKLSAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRXZlbnRMb2dQYXJzZXIiLCBTdHJpbmcuZm9ybWF0KCJ1bmtub3duIHRhZyBudW1iZXI6ICUxJGQiLCB0YWdWYWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBpZiAocGFyc2VCaW5hcnlFdmVudChlbnRyeS5kYXRhLCBpbk9mZnNldCwgbGlzdCkgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGRhdGE7Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBkYXRhID0gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIGRhdGEgPSBsaXN0LnRvQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV2ZW50Q29udGFpbmVyIGV2ZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHRhZ1ZhbHVlID09IEdjRXZlbnRDb250YWluZXIuR0NfRVZFTlRfVEFHKSB7Ci0gICAgICAgICAgICBldmVudCA9IG5ldyBHY0V2ZW50Q29udGFpbmVyKGVudHJ5LCB0YWdWYWx1ZSwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudENvbnRhaW5lcihlbnRyeSwgdGFnVmFsdWUsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBFdmVudENvbnRhaW5lciBwYXJzZShTdHJpbmcgdGV4dExvZ0xpbmUpIHsKLSAgICAgICAgLy8gbGluZSB3aWxsIGxvb2sgbGlrZQotICAgICAgICAvLyAwNC0yOSAyMzoxNjoxNi42OTEgSS9kdm1fZ2NfaW5mbyggIDQyNyk6IDxkYXRhPgotICAgICAgICAvLyB3aGVyZSA8ZGF0YT4gaXMgZWl0aGVyCi0gICAgICAgIC8vIFt2YWx1ZTEsdmFsdWUyLi4uXQotICAgICAgICAvLyBvcgotICAgICAgICAvLyB2YWx1ZQotICAgICAgICBpZiAodGV4dExvZ0xpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSB0aGUgaGVhZGVyIGZpcnN0Ci0gICAgICAgIE1hdGNoZXIgbSA9IFRFWFRfTE9HX0xJTkUubWF0Y2hlcih0ZXh0TG9nTGluZSk7Ci0gICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgbW9udGggPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIGludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgzKSk7Ci0gICAgICAgICAgICAgICAgaW50IG1pbnV0ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpOwotICAgICAgICAgICAgICAgIGludCBzZWNvbmRzID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDUpKTsKLSAgICAgICAgICAgICAgICBpbnQgbWlsbGlzZWNvbmRzID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDYpKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgaW50byBzZWNvbmRzIHNpbmNlIGVwb2NoIGFuZCBuYW5vLXNlY29uZHMuCi0gICAgICAgICAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBjYWwuc2V0KGNhbC5nZXQoQ2FsZW5kYXIuWUVBUiksIG1vbnRoLTEsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpOwotICAgICAgICAgICAgICAgIGludCBzZWMgPSAoaW50KU1hdGguZmxvb3IoY2FsLmdldFRpbWVJbk1pbGxpcygpLzEwMDApOwotICAgICAgICAgICAgICAgIGludCBuc2VjID0gbWlsbGlzZWNvbmRzICogMTAwMDAwMDsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSBtLmdyb3VwKDcpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1lcmljYWwgdGFnIHZhbHVlCi0gICAgICAgICAgICAgICAgaW50IHRhZ1ZhbHVlID0gLTE7Ci0gICAgICAgICAgICAgICAgU2V0PEVudHJ5PEludGVnZXIsIFN0cmluZz4+IHRhZ1NldCA9IG1UYWdNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PEludGVnZXIsIFN0cmluZz4gZW50cnkgOiB0YWdTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhbHVlID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0YWdWYWx1ZSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgcGlkID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDgpKTsKLQotICAgICAgICAgICAgICAgIE9iamVjdCBkYXRhID0gcGFyc2VUZXh0RGF0YShtLmdyb3VwKDkpLCB0YWdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgd2UgY2FuIGFsbG9jYXRlIGFuZCByZXR1cm4gdGhlIEV2ZW50Q29udGFpbmVyCi0gICAgICAgICAgICAgICAgRXZlbnRDb250YWluZXIgZXZlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh0YWdWYWx1ZSA9PSBHY0V2ZW50Q29udGFpbmVyLkdDX0VWRU5UX1RBRykgewotICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBHY0V2ZW50Q29udGFpbmVyKHRhZ1ZhbHVlLCBwaWQsIC0xIC8qIHRpZCAqLywgc2VjLCBuc2VjLCBkYXRhKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudENvbnRhaW5lcih0YWdWYWx1ZSwgcGlkLCAtMSAvKiB0aWQgKi8sIHNlYywgbnNlYywgZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRUYWdNYXAoKSB7Ci0gICAgICAgIHJldHVybiBtVGFnTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgRXZlbnRWYWx1ZURlc2NyaXB0aW9uW10+IGdldEV2ZW50SW5mb01hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZURlc2NyaXB0aW9uTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgYmluYXJ5IGxvZyBkYXRhIHRvIHByaW50YWJsZSBmb3JtLgotICAgICAqCi0gICAgICogVGhpcyBuZWVkcyB0byBiZSByZWN1cnNpdmUgYmVjYXVzZSB5b3UgY2FuIGhhdmUgbGlzdHMgb2YgbGlzdHMuCi0gICAgICoKLSAgICAgKiBJZiB3ZSBydW4gb3V0IG9mIHJvb20sIHdlIHN0b3AgcHJvY2Vzc2luZyBpbW1lZGlhdGVseS4gIEl0J3MgaW1wb3J0YW50Ci0gICAgICogZm9yIHVzIHRvIGNoZWNrIGZvciBzcGFjZSBvbiBldmVyeSBvdXRwdXQgZWxlbWVudCB0byBhdm9pZCBwcm9kdWNpbmcKLSAgICAgKiBnYXJibGVkIG91dHB1dC4KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIGFtb3VudCByZWFkIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlQmluYXJ5RXZlbnQoYnl0ZVtdIGV2ZW50RGF0YSwgaW50IGRhdGFPZmZzZXQsIEFycmF5TGlzdDxPYmplY3Q+IGxpc3QpIHsKLQotICAgICAgICBpZiAoZXZlbnREYXRhLmxlbmd0aCAtIGRhdGFPZmZzZXQgPCAxKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGludCBvZmZzZXQgPSBkYXRhT2Zmc2V0OwotCi0gICAgICAgIGludCB0eXBlID0gZXZlbnREYXRhW29mZnNldCsrXTsKLQotICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCAiLS0tIHR5cGU9JWQgKHJlbSBsZW49JWQpXG4iLCB0eXBlLCBldmVudERhdGFMZW4pOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEVWRU5UX1RZUEVfSU5UOiB7IC8qIDMyLWJpdCBzaWduZWQgaW50ICovCi0gICAgICAgICAgICAgICAgaW50IGl2YWw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREYXRhLmxlbmd0aCAtIG9mZnNldCA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBpdmFsID0gQXJyYXlIZWxwZXIuc3dhcDMyYml0RnJvbUFycmF5KGV2ZW50RGF0YSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKLQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBJbnRlZ2VyKGl2YWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RZUEVfTE9ORzogeyAvKiA2NC1iaXQgc2lnbmVkIGxvbmcgKi8KLSAgICAgICAgICAgICAgICBsb25nIGx2YWw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREYXRhLmxlbmd0aCAtIG9mZnNldCA8IDgpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBsdmFsID0gQXJyYXlIZWxwZXIuc3dhcDY0Yml0RnJvbUFycmF5KGV2ZW50RGF0YSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODsKLQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBMb25nKGx2YWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RZUEVfU1RSSU5HOiB7IC8qIFVURi04IGNoYXJzLCBub3QgTlVMTC10ZXJtaW5hdGVkICovCi0gICAgICAgICAgICAgICAgaW50IHN0ckxlbjsKLQotICAgICAgICAgICAgICAgIGlmIChldmVudERhdGEubGVuZ3RoIC0gb2Zmc2V0IDwgNCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIHN0ckxlbiA9IEFycmF5SGVscGVyLnN3YXAzMmJpdEZyb21BcnJheShldmVudERhdGEsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREYXRhLmxlbmd0aCAtIG9mZnNldCA8IHN0ckxlbikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyhldmVudERhdGEsIG9mZnNldCwgc3RyTGVuLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzdHIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3RyTGVuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX1RZUEVfTElTVDogeyAvKiBOIGl0ZW1zLCBhbGwgZGlmZmVyZW50IHR5cGVzICovCi0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREYXRhLmxlbmd0aCAtIG9mZnNldCA8IDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGV2ZW50RGF0YVtvZmZzZXQrK107Ci0KLSAgICAgICAgICAgICAgICAvLyBtYWtlIGEgbmV3IHRlbXAgbGlzdAotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxPYmplY3Q+IHN1Ykxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHBhcnNlQmluYXJ5RXZlbnQoZXZlbnREYXRhLCBvZmZzZXQsIHN1Ykxpc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZChzdWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExvZy5lKCJFdmVudExvZ1BhcnNlciIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVua25vd24gYmluYXJ5IGV2ZW50IHR5cGUgJTEkZCIsIHR5cGUpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvZmZzZXQgLSBkYXRhT2Zmc2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IHBhcnNlVGV4dERhdGEoU3RyaW5nIGRhdGEsIGludCB0YWdWYWx1ZSkgewotICAgICAgICAvLyBmaXJzdCwgZ2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHdlJ3JlIHN1cHBvc2VkIHRvIHBhcnNlCi0gICAgICAgIEV2ZW50VmFsdWVEZXNjcmlwdGlvbltdIGRlc2MgPSBtVmFsdWVEZXNjcmlwdGlvbk1hcC5nZXQodGFnVmFsdWUpOwotCi0gICAgICAgIGlmIChkZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gcGFyc2UgYW5kIGNyZWF0ZSBzdHJpbmcgdmFsdWVzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzYy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGdldE9iamVjdEZyb21TdHJpbmcoZGF0YSwgZGVzY1swXS5nZXRFdmVudFZhbHVlVHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoIlsiKSAmJiBkYXRhLmVuZHNXaXRoKCJdIikpIHsKLSAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN1YnN0cmluZygxLCBkYXRhLmxlbmd0aCgpIC0gMSk7Ci0KLSAgICAgICAgICAgIC8vIGdldCBlYWNoIGluZGl2aWR1YWwgdmFsdWVzIGFzIFN0cmluZwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZGF0YS5zcGxpdCgiLCIpOwotCi0gICAgICAgICAgICBpZiAodGFnVmFsdWUgPT0gR2NFdmVudENvbnRhaW5lci5HQ19FVkVOVF9UQUcpIHsKLSAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBHQyBldmVudCEKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsyXTsKLQotICAgICAgICAgICAgICAgIG9iamVjdHNbMF0gPSBnZXRPYmplY3RGcm9tU3RyaW5nKHZhbHVlc1swXSwgRXZlbnRWYWx1ZVR5cGUuTE9ORyk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0c1sxXSA9IGdldE9iamVjdEZyb21TdHJpbmcodmFsdWVzWzFdLCBFdmVudFZhbHVlVHlwZS5MT05HKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBhcyB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzLgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IGRlc2MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W3ZhbHVlcy5sZW5ndGhdOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZGVzYy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldE9iamVjdEZyb21TdHJpbmcodmFsdWVzW2ldLCBkZXNjW2ldLmdldEV2ZW50VmFsdWVUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHNbaV0gPSBvYmo7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgT2JqZWN0IGdldE9iamVjdEZyb21TdHJpbmcoU3RyaW5nIHZhbHVlLCBFdmVudFZhbHVlVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIElOVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBMT05HOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZywgd2UnbGwgcmV0dXJuIG51bGwuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNyZWF0ZXMgdGhlIGV2ZW50LWxvZy10YWdzIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBwYXRoLgotICAgICAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgZmlsZSBwYXRoIHRvIHdyaXRlIHRoZSBmaWxlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlVGFncyhTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGRlc3RGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKLQotICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGtleSA6IG1UYWdNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHRhZyBuYW1lCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBtVGFnTWFwLmdldChrZXkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBkZXNjcmlwdGlvbnMKLSAgICAgICAgICAgICAgICBFdmVudFZhbHVlRGVzY3JpcHRpb25bXSBkZXNjcmlwdG9ycyA9IG1WYWx1ZURlc2NyaXB0aW9uTWFwLmdldChrZXkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTEkZCAlMiRzIiwga2V5LCB0YWdOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRXZlbnRWYWx1ZURlc2NyaXB0aW9uIGV2ZCA6IGRlc2NyaXB0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChldmQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgifCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXZkLmdldEV2ZW50VmFsdWVUeXBlKCkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGV2ZC5nZXRWYWx1ZVR5cGUoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgifCkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBTdHJpbmcuZm9ybWF0KCIlMSRkICUyJHNcbiIsIGtleSwgdGFnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbGluZS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9FdmVudFZhbHVlRGVzY3JpcHRpb24uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvRXZlbnRWYWx1ZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGI0ZTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9FdmVudFZhbHVlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWIubG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lci5FdmVudFZhbHVlVHlwZTsKLQotCi0vKioKLSAqIERlc2NyaWJlcyBhbiB7QGxpbmsgRXZlbnRDb250YWluZXJ9IHZhbHVlLgotICogPHAvPgotICogVGhpcyBpcyBhIHN0YW5kLWFsb25lIG9iamVjdCwgbm90IGxpbmtlZCB0byBhIHBhcnRpY3VsYXIgRXZlbnQuIEl0IGRlc2NyaWJlcyB0aGUgdmFsdWUsIGJ5Ci0gKiBuYW1lLCB0eXBlICh7QGxpbmsgRXZlbnRWYWx1ZVR5cGV9KSwgYW5kIChpZiBuZWVkZWQpIHZhbHVlIHVuaXQgKHtAbGluayBWYWx1ZVR5cGV9KS4KLSAqIDxwLz4KLSAqIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcywgYW5kIGlzIGluc3RlYWQgZGVwZW5kZW50IG9uIHRoZQotICogaW5kZXggb2YgdGhpcyBwYXJ0aWN1bGFyIG9iamVjdCBpbiB0aGUgYXJyYXkgb2Yge0BsaW5rIEV2ZW50VmFsdWVEZXNjcmlwdGlvbn0gcmV0dXJuZWQgYnkKLSAqIHtAbGluayBFdmVudExvZ1BhcnNlciNnZXRFdmVudEluZm9NYXAoKX0gd2hlbiBxdWVyaWVkIGZvciBhIHBhcnRpY3VsYXIgZXZlbnQgdGFnLgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFdmVudFZhbHVlRGVzY3JpcHRpb24gewotICAgIAotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgYSBudW1lcmljYWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkaXNwbGF5IHZhbHVlcyBvZiB2YXN0bHkgZGlmZmVyZW50Ci0gICAgICogdHlwZS9yYW5nZSBpbiBncmFwaHMuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBWYWx1ZVR5cGUgewotICAgICAgICBOT1RfQVBQTElDQUJMRSgwKSwKLSAgICAgICAgT0JKRUNUUygxKSwKLSAgICAgICAgQllURVMoMiksCi0gICAgICAgIE1JTExJU0VDT05EUygzKSwKLSAgICAgICAgQUxMT0NBVElPTlMoNCksCi0gICAgICAgIElEKDUpLAotICAgICAgICBQRVJDRU5UKDYpOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1WYWx1ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIHRoYXQgdGhlIHtAbGluayBFdmVudFZhbHVlVHlwZX0gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSB7QGxpbmsgVmFsdWVUeXBlfS4KLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHtAbGluayBFdmVudFZhbHVlVHlwZX0gdG8gY2hlY2suCi0gICAgICAgICAqIEB0aHJvd3MgSW52YWxpZFZhbHVlVHlwZUV4Y2VwdGlvbiBpZiB0aGUgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tUeXBlKEV2ZW50VmFsdWVUeXBlIHR5cGUpIHRocm93cyBJbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICgodHlwZSAhPSBFdmVudFZhbHVlVHlwZS5JTlQgJiYgdHlwZSAhPSBFdmVudFZhbHVlVHlwZS5MT05HKQotICAgICAgICAgICAgICAgICAgICAmJiB0aGlzICE9IE5PVF9BUFBMSUNBQkxFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMSRzIGRvZXNuJ3Qgc3VwcG9ydCB0eXBlICUyJHMiLCB0eXBlLCB0aGlzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHtAbGluayBWYWx1ZVR5cGV9IGZyb20gYW4gaW50ZWdlciB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWF0Y2gKLSAgICAgICAgICogd2VyZSBmb3VuZC4KLSAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlZ2VyIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZVR5cGUgZ2V0VmFsdWVUeXBlKGludCB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChWYWx1ZVR5cGUgdHlwZSA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUubVZhbHVlID09IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGVudW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFZhbHVlVHlwZShpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgRXZlbnRWYWx1ZVR5cGUgbUV2ZW50VmFsdWVUeXBlOwotICAgIHByaXZhdGUgVmFsdWVUeXBlIG1WYWx1ZVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEge0BsaW5rIEV2ZW50VmFsdWVEZXNjcmlwdGlvbn0gd2l0aCBhIG5hbWUgYW5kIGEgdHlwZS4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIHR5cGUgaXMge0BsaW5rIEV2ZW50VmFsdWVUeXBlI0lOVH0gb3Ige0BsaW5rIEV2ZW50VmFsdWVUeXBlI0xPTkd9LCB0aGUKLSAgICAgKiB7QGxpbmsgI21WYWx1ZVR5cGV9IGlzIHNldCB0byB7QGxpbmsgVmFsdWVUeXBlI0JZVEVTfSBieSBkZWZhdWx0LiBJdCBzZXQgdG8KLSAgICAgKiB7QGxpbmsgVmFsdWVUeXBlI05PVF9BUFBMSUNBQkxFfSBmb3IgYWxsIG90aGVyIHtAbGluayBFdmVudFZhbHVlVHlwZX0gdmFsdWVzLgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBFdmVudFZhbHVlRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIEV2ZW50VmFsdWVUeXBlIHR5cGUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICBtRXZlbnRWYWx1ZVR5cGUgPSB0eXBlOwotICAgICAgICBpZiAobUV2ZW50VmFsdWVUeXBlID09IEV2ZW50VmFsdWVUeXBlLklOVCB8fCBtRXZlbnRWYWx1ZVR5cGUgPT0gRXZlbnRWYWx1ZVR5cGUuTE9ORykgewotICAgICAgICAgICAgbVZhbHVlVHlwZSA9IFZhbHVlVHlwZS5CWVRFUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSBWYWx1ZVR5cGUuTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSB7QGxpbmsgRXZlbnRWYWx1ZURlc2NyaXB0aW9ufSB3aXRoIGEgbmFtZSBhbmQgYSB0eXBlLCBhbmQgYSB7QGxpbmsgVmFsdWVUeXBlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUKLSAgICAgKiBAdGhyb3dzIEludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24gaWYgdHlwZSBhbmQgdmFsdWV0eXBlIGFyZSBub3QgY29tcGF0aWJsZS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBFdmVudFZhbHVlRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIEV2ZW50VmFsdWVUeXBlIHR5cGUsIFZhbHVlVHlwZSB2YWx1ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSW52YWxpZFZhbHVlVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbUV2ZW50VmFsdWVUeXBlID0gdHlwZTsKLSAgICAgICAgbVZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLSAgICAgICAgbVZhbHVlVHlwZS5jaGVja1R5cGUobUV2ZW50VmFsdWVUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRXZlbnRWYWx1ZVR5cGV9LgotICAgICAqLwotICAgIHB1YmxpYyBFdmVudFZhbHVlVHlwZSBnZXRFdmVudFZhbHVlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1FdmVudFZhbHVlVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVmFsdWVUeXBlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsdWVUeXBlIGdldFZhbHVlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChtVmFsdWVUeXBlICE9IFZhbHVlVHlwZS5OT1RfQVBQTElDQUJMRSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHMgKCUyJHMsICUzJHMpIiwgbU5hbWUsIG1FdmVudFZhbHVlVHlwZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyAoJTIkcykiLCBtTmFtZSwgbUV2ZW50VmFsdWVUeXBlLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWUgaXMgb2YgdGhlIHByb3BlciB0eXBlIGZvciB0aGlzIHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBvZiB0aGUgcHJvcGVyIHR5cGUgZm9yIHRoaXMgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tGb3JUeXBlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzd2l0Y2ggKG1FdmVudFZhbHVlVHlwZSkgewotICAgICAgICAgICAgY2FzZSBJTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcjsKLSAgICAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBMb25nOwotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nOwotICAgICAgICAgICAgY2FzZSBMSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IG9mIGEgdmFsaWQgdHlwZSAoYmFzZWQgb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICAgICoge0BsaW5rICNnZXRFdmVudFZhbHVlVHlwZSgpfSkgZnJvbSBhIFN0cmluZyB2YWx1ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogSU1QT1JUQU5UIHtAbGluayBFdmVudFZhbHVlVHlwZSNMSVNUfSBhbmQge0BsaW5rIEV2ZW50VmFsdWVUeXBlI1RSRUV9IGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGV4cHJlc3NlZCBhcyBhIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCBvciBudWxsIGlmIHRoZSBjb252ZXJzaW9uIGNvdWxkIG5vdCBiZSBkb25lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0RnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChtRXZlbnRWYWx1ZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UOgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvR2NFdmVudENvbnRhaW5lci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9HY0V2ZW50Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWUyMDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9HY0V2ZW50Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliLmxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyLkxvZ0VudHJ5OwotCi0vKioKLSAqIEN1c3RvbSBFdmVudCBDb250YWluZXIgZm9yIHRoZSBHYyBldmVudCBzaW5jZSB0aGlzIGV2ZW50IGRvZXNuJ3Qgc2ltcGx5IG91dHB1dCBkYXRhIGluCi0gKiBpbnQgb3IgbG9uZyBmb3JtYXQsIGJ1dCBlbmNvZGVzIHNldmVyYWwgdmFsdWVzIG9uIDQgbG9uZ3MuCi0gKiA8cC8+Ci0gKiBUaGUgYXJyYXkgb2Yge0BsaW5rIEV2ZW50VmFsdWVEZXNjcmlwdGlvbn1zIHBhcnNlZCBmcm9tIHRoZSAiZXZlbnQtbG9nLXRhZ3MiIGZpbGUgbXVzdAotICogYmUgaWdub3JlZCwgYW5kIGluc3RlYWQsIHRoZSBhcnJheSByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0VmFsdWVEZXNjcmlwdGlvbnMoKX0gbXVzdCBiZSB1c2VkLiAKLSAqLwotZmluYWwgY2xhc3MgR2NFdmVudENvbnRhaW5lciBleHRlbmRzIEV2ZW50Q29udGFpbmVyIHsKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBHQ19FVkVOVF9UQUcgPSAyMDAwMTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NJZDsKLSAgICBwcml2YXRlIGxvbmcgZ2NUaW1lOwotICAgIHByaXZhdGUgbG9uZyBieXRlc0ZyZWVkOwotICAgIHByaXZhdGUgbG9uZyBvYmplY3RzRnJlZWQ7Ci0gICAgcHJpdmF0ZSBsb25nIGFjdHVhbFNpemU7Ci0gICAgcHJpdmF0ZSBsb25nIGFsbG93ZWRTaXplOwotICAgIHByaXZhdGUgbG9uZyBzb2Z0TGltaXQ7Ci0gICAgcHJpdmF0ZSBsb25nIG9iamVjdHNBbGxvY2F0ZWQ7Ci0gICAgcHJpdmF0ZSBsb25nIGJ5dGVzQWxsb2NhdGVkOwotICAgIHByaXZhdGUgbG9uZyB6QWN0dWFsU2l6ZTsKLSAgICBwcml2YXRlIGxvbmcgekFsbG93ZWRTaXplOwotICAgIHByaXZhdGUgbG9uZyB6T2JqZWN0c0FsbG9jYXRlZDsKLSAgICBwcml2YXRlIGxvbmcgekJ5dGVzQWxsb2NhdGVkOwotICAgIHByaXZhdGUgbG9uZyBkbG1hbGxvY0Zvb3RwcmludDsKLSAgICBwcml2YXRlIGxvbmcgbWFsbGluZm9Ub3RhbEFsbG9jYXRlZFNwYWNlOwotICAgIHByaXZhdGUgbG9uZyBleHRlcm5hbExpbWl0OwotICAgIHByaXZhdGUgbG9uZyBleHRlcm5hbEJ5dGVzQWxsb2NhdGVkOwotCi0gICAgR2NFdmVudENvbnRhaW5lcihMb2dFbnRyeSBlbnRyeSwgaW50IHRhZywgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgc3VwZXIoZW50cnksIHRhZywgZGF0YSk7Ci0gICAgICAgIGluaXQoZGF0YSk7Ci0gICAgfQotCi0gICAgR2NFdmVudENvbnRhaW5lcihpbnQgdGFnLCBpbnQgcGlkLCBpbnQgdGlkLCBpbnQgc2VjLCBpbnQgbnNlYywgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgc3VwZXIodGFnLCBwaWQsIHRpZCwgc2VjLCBuc2VjLCBkYXRhKTsKLSAgICAgICAgaW5pdChkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSlkYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2ldIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUR2bUhlYXBJbmZvKChMb25nKXZhbHVlc1tpXSwgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFdmVudFZhbHVlVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gRXZlbnRWYWx1ZVR5cGUuTElTVDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0VmFsdWUoaW50IGluZGV4LCBPYmplY3QgdmFsdWUsIENvbXBhcmVNZXRob2QgY29tcGFyZU1ldGhvZCkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvIGEgcXVpY2sgZWFzeSBjaGVjayBvbiB0aGUgdHlwZS4KLSAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgIGlmICgodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHlwZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKGNvbXBhcmVNZXRob2QpIHsKLSAgICAgICAgICAgIGNhc2UgRVFVQUxfVE86Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NJZC5lcXVhbHModmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUFzTG9uZyhpbmRleCkgPT0gKChMb25nKXZhbHVlKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIExFU1NFUl9USEFOOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUFzTG9uZyhpbmRleCkgPD0gKChMb25nKXZhbHVlKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGNhc2UgTEVTU0VSX1RIQU5fU1RSSUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUFzTG9uZyhpbmRleCkgPCAoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBHUkVBVEVSX1RIQU46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNMb25nKGluZGV4KSA+PSAoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBHUkVBVEVSX1RIQU5fU1RSSUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUFzTG9uZyhpbmRleCkgPiAoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgY2FzZSBCSVRfQ0hFQ0s6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChnZXRWYWx1ZUFzTG9uZyhpbmRleCkgJiAoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IHZhbHVlSW5kZXgpIHsKLSAgICAgICAgaWYgKHZhbHVlSW5kZXggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NJZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhnZXRWYWx1ZUFzTG9uZyh2YWx1ZUluZGV4KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgd291bGQgb25seSBoYXBwZW5lZCBpZiB2YWx1ZUluZGV4IHdhcyAwLCB3aGljaCB3ZSB0ZXN0IGFib3ZlLgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldFZhbHVlQXNEb3VibGUoaW50IHZhbHVlSW5kZXgpIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoZG91YmxlKWdldFZhbHVlQXNMb25nKHZhbHVlSW5kZXgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyhpbnQgdmFsdWVJbmRleCkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlSW5kZXgpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0lkOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhnZXRWYWx1ZUFzTG9uZyh2YWx1ZUluZGV4KSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFR5cGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgc3RvcCB0aGVyZSBzaW5jZSB3ZSB0ZXN0LCBpbiB0aGlzIG1ldGhvZCBmaXJzdC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjdXN0b20gYXJyYXkgb2Yge0BsaW5rIEV2ZW50VmFsdWVEZXNjcmlwdGlvbn0gc2luY2UgdGhlIGFjdHVhbCBjb250ZW50IG9mIHRoaXMKLSAgICAgKiBldmVudCAobGlzdCBvZiAobG9uZywgbG9uZykgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlcyBlbmNvZGVkIGludG8gdGhvc2UgbG9uZ3MuCi0gICAgICovCi0gICAgc3RhdGljIEV2ZW50VmFsdWVEZXNjcmlwdGlvbltdIGdldFZhbHVlRGVzY3JpcHRpb25zKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb25bXSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIlByb2Nlc3MgTmFtZSIsIEV2ZW50VmFsdWVUeXBlLlNUUklORyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkdDIFRpbWUiLCBFdmVudFZhbHVlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZS5NSUxMSVNFQ09ORFMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJGcmVlZCBPYmplY3RzIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUuT0JKRUNUUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkZyZWVkIEJ5dGVzIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywgVmFsdWVUeXBlLkJZVEVTKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50VmFsdWVEZXNjcmlwdGlvbigiU29mdCBMaW1pdCIsIEV2ZW50VmFsdWVUeXBlLkxPTkcsIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFjdHVhbCBTaXplIChhZ2dyZWdhdGUpIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUuQllURVMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJBbGxvd2VkIFNpemUgKGFnZ3JlZ2F0ZSkiLCBFdmVudFZhbHVlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFsbG9jYXRlZCBPYmplY3RzIChhZ2dyZWdhdGUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFZhbHVlVHlwZS5MT05HLCBWYWx1ZVR5cGUuT0JKRUNUUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFsbG9jYXRlZCBCeXRlcyAoYWdncmVnYXRlKSIsIEV2ZW50VmFsdWVUeXBlLkxPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlLkJZVEVTKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50VmFsdWVEZXNjcmlwdGlvbigiQWN0dWFsIFNpemUiLCBFdmVudFZhbHVlVHlwZS5MT05HLCBWYWx1ZVR5cGUuQllURVMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJBbGxvd2VkIFNpemUiLCBFdmVudFZhbHVlVHlwZS5MT05HLCBWYWx1ZVR5cGUuQllURVMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJBbGxvY2F0ZWQgT2JqZWN0cyIsIEV2ZW50VmFsdWVUeXBlLkxPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlLk9CSkVDVFMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJBbGxvY2F0ZWQgQnl0ZXMiLCBFdmVudFZhbHVlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFjdHVhbCBTaXplICh6eWdvdGUpIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUuQllURVMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJBbGxvd2VkIFNpemUgKHp5Z290ZSkiLCBFdmVudFZhbHVlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFsbG9jYXRlZCBPYmplY3RzICh6eWdvdGUpIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUuT0JKRUNUUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIkFsbG9jYXRlZCBCeXRlcyAoenlnb3RlKSIsIEV2ZW50VmFsdWVUeXBlLkxPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlLkJZVEVTKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50VmFsdWVEZXNjcmlwdGlvbigiRXh0ZXJuYWwgQWxsb2NhdGlvbiBMaW1pdCIsIEV2ZW50VmFsdWVUeXBlLkxPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlLkJZVEVTKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50VmFsdWVEZXNjcmlwdGlvbigiRXh0ZXJuYWwgQnl0ZXMgQWxsb2NhdGVkIiwgRXZlbnRWYWx1ZVR5cGUuTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUuQllURVMpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnRWYWx1ZURlc2NyaXB0aW9uKCJkbG1hbGxvYyBGb290cHJpbnQiLCBFdmVudFZhbHVlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudFZhbHVlRGVzY3JpcHRpb24oIk1hbGxvYyBJbmZvOiBUb3RhbCBBbGxvY2F0ZWQgU3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VmFsdWVUeXBlLkxPTkcsIFZhbHVlVHlwZS5CWVRFUyksCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICB9IGNhdGNoIChJbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB3ZSBjb250cm9sIG1hbnVhbCB0aGUgRXZlbnRWYWx1ZVR5cGUgYW5kIHRoZSBWYWx1ZVR5cGUKLSAgICAgICAgICAgIC8vIHZhbHVlcy4gRm9yIGRldmVsb3BtZW50IHB1cnBvc2UsIHdlIGFzc2VydCBpZiB0aGlzIGhhcHBlbnMuCi0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB0aGUgY29tcGlsZXIgY29tcGxhaW5zIG90aGVyd2lzZS4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlRHZtSGVhcEluZm8obG9uZyBkYXRhLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgc3dpdGNoIChpbmRleCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIC8vICAgIFs2MyAgIF0gTXVzdCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgLy8gICAgWzYyLTI0XSBBU0NJSSBwcm9jZXNzIGlkZW50aWZpZXIKLSAgICAgICAgICAgICAgICAvLyAgICBbMjMtMTJdIEdDIHRpbWUgaW4gbXMKLSAgICAgICAgICAgICAgICAvLyAgICBbMTEtIDBdIEJ5dGVzIGZyZWVkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZ2NUaW1lID0gZmxvYXQxMlRvSW50KChpbnQpKChkYXRhID4+IDEyKSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIGJ5dGVzRnJlZWQgPSBmbG9hdDEyVG9JbnQoKGludCkoZGF0YSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGxvbmcgaW50byBhbiBhcnJheSwgaW4gdGhlIHByb3BlciBvcmRlciBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IHRoZQotICAgICAgICAgICAgICAgIC8vIGZpcnN0IDUgY2hhciBpbnRvIGEgc3RyaW5nLgotICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhQXJyYXkgPSBuZXcgYnl0ZVs4XTsKLSAgICAgICAgICAgICAgICBwdXQ2NGJpdHNUb0FycmF5KGRhdGEsIGRhdGFBcnJheSwgMCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIGZyb20gdGhlIHN0cmluZwotICAgICAgICAgICAgICAgIHByb2Nlc3NJZCA9IG5ldyBTdHJpbmcoZGF0YUFycmF5LCAwLCA1KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAvLyAgICBbNjMtNjJdIDEwCi0gICAgICAgICAgICAgICAgLy8gICAgWzYxLTYwXSBSZXNlcnZlZDsgbXVzdCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgLy8gICAgWzU5LTQ4XSBPYmplY3RzIGZyZWVkCi0gICAgICAgICAgICAgICAgLy8gICAgWzQ3LTM2XSBBY3R1YWwgc2l6ZSAoY3VycmVudCBmb290cHJpbnQpCi0gICAgICAgICAgICAgICAgLy8gICAgWzM1LTI0XSBBbGxvd2VkIHNpemUgKGN1cnJlbnQgaGFyZCBtYXgpCi0gICAgICAgICAgICAgICAgLy8gICAgWzIzLTEyXSBPYmplY3RzIGFsbG9jYXRlZAotICAgICAgICAgICAgICAgIC8vICAgIFsxMS0gMF0gQnl0ZXMgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgb2JqZWN0c0ZyZWVkID0gZmxvYXQxMlRvSW50KChpbnQpKChkYXRhID4+IDQ4KSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIGFjdHVhbFNpemUgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gMzYpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgYWxsb3dlZFNpemUgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gMjQpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0c0FsbG9jYXRlZCA9IGZsb2F0MTJUb0ludCgoaW50KSgoZGF0YSA+PiAxMikgJiAweEZGRkwpKTsKLSAgICAgICAgICAgICAgICBieXRlc0FsbG9jYXRlZCA9IGZsb2F0MTJUb0ludCgoaW50KShkYXRhICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgLy8gICAgWzYzLTYyXSAxMQotICAgICAgICAgICAgICAgIC8vICAgIFs2MS02MF0gUmVzZXJ2ZWQ7IG11c3QgYmUgemVybwotICAgICAgICAgICAgICAgIC8vICAgIFs1OS00OF0gU29mdCBsaW1pdCAoY3VycmVudCBzb2Z0IG1heCkKLSAgICAgICAgICAgICAgICAvLyAgICBbNDctMzZdIEFjdHVhbCBzaXplIChjdXJyZW50IGZvb3RwcmludCkKLSAgICAgICAgICAgICAgICAvLyAgICBbMzUtMjRdIEFsbG93ZWQgc2l6ZSAoY3VycmVudCBoYXJkIG1heCkKLSAgICAgICAgICAgICAgICAvLyAgICBbMjMtMTJdIE9iamVjdHMgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgLy8gICAgWzExLSAwXSBCeXRlcyBhbGxvY2F0ZWQKLSAgICAgICAgICAgICAgICBzb2Z0TGltaXQgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gNDgpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgekFjdHVhbFNpemUgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gMzYpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgekFsbG93ZWRTaXplID0gZmxvYXQxMlRvSW50KChpbnQpKChkYXRhID4+IDI0KSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIHpPYmplY3RzQWxsb2NhdGVkID0gZmxvYXQxMlRvSW50KChpbnQpKChkYXRhID4+IDEyKSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIHpCeXRlc0FsbG9jYXRlZCA9IGZsb2F0MTJUb0ludCgoaW50KShkYXRhICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgLy8gICAgWzYzLTQ4XSBSZXNlcnZlZDsgbXVzdCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgLy8gICAgWzQ3LTM2XSBkbG1hbGxvY0Zvb3RwcmludAotICAgICAgICAgICAgICAgIC8vICAgIFszNS0yNF0gbWFsbGluZm86IHRvdGFsIGFsbG9jYXRlZCBzcGFjZQotICAgICAgICAgICAgICAgIC8vICAgIFsyMy0xMl0gRXh0ZXJuYWwgYnl0ZSBsaW1pdAotICAgICAgICAgICAgICAgIC8vICAgIFsxMS0gMF0gRXh0ZXJuYWwgYnl0ZXMgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgZGxtYWxsb2NGb290cHJpbnQgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gMzYpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgbWFsbGluZm9Ub3RhbEFsbG9jYXRlZFNwYWNlID0gZmxvYXQxMlRvSW50KChpbnQpKChkYXRhID4+IDI0KSAmIDB4RkZGTCkpOwotICAgICAgICAgICAgICAgIGV4dGVybmFsTGltaXQgPSBmbG9hdDEyVG9JbnQoKGludCkoKGRhdGEgPj4gMTIpICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuYWxCeXRlc0FsbG9jYXRlZCA9IGZsb2F0MTJUb0ludCgoaW50KShkYXRhICYgMHhGRkZMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgMTIgYml0IGZsb2F0IHJlcHJlc2VudGF0aW9uIGludG8gYW4gdW5zaWduZWQgaW50IChyZXR1cm5lZCBhcyBhIGxvbmcpCi0gICAgICogQHBhcmFtIGYxMgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZmxvYXQxMlRvSW50KGludCBmMTIpIHsKLSAgICAgICAgcmV0dXJuIChmMTIgJiAweDFGRikgPDwgKChmMTIgPj4+IDkpICogNCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHB1dHMgYW4gdW5zaWduZWQgdmFsdWUgaW4gYW4gYXJyYXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBwdXQuCi0gICAgICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheSB3aGVyZSB0byBwdXQgdGhlIHZhbHVlLgotICAgICAqICAgICAgQXJyYXkgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3Qgb2Zmc2V0ICsgOAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0NjRiaXRzVG9BcnJheShsb25nIHZhbHVlLCBieXRlW10gZGVzdCwgaW50IG9mZnNldCkgewotICAgICAgICBkZXN0W29mZnNldCArIDddID0gKGJ5dGUpKHZhbHVlICYgMHgwMDAwMDAwMDAwMDAwMEZGTCk7Ci0gICAgICAgIGRlc3Rbb2Zmc2V0ICsgNl0gPSAoYnl0ZSkoKHZhbHVlICYgMHgwMDAwMDAwMDAwMDBGRjAwTCkgPj4gOCk7Ci0gICAgICAgIGRlc3Rbb2Zmc2V0ICsgNV0gPSAoYnl0ZSkoKHZhbHVlICYgMHgwMDAwMDAwMDAwRkYwMDAwTCkgPj4gMTYpOwotICAgICAgICBkZXN0W29mZnNldCArIDRdID0gKGJ5dGUpKCh2YWx1ZSAmIDB4MDAwMDAwMDBGRjAwMDAwMEwpID4+IDI0KTsKLSAgICAgICAgZGVzdFtvZmZzZXQgKyAzXSA9IChieXRlKSgodmFsdWUgJiAweDAwMDAwMEZGMDAwMDAwMDBMKSA+PiAzMik7Ci0gICAgICAgIGRlc3Rbb2Zmc2V0ICsgMl0gPSAoYnl0ZSkoKHZhbHVlICYgMHgwMDAwRkYwMDAwMDAwMDAwTCkgPj4gNDApOwotICAgICAgICBkZXN0W29mZnNldCArIDFdID0gKGJ5dGUpKCh2YWx1ZSAmIDB4MDBGRjAwMDAwMDAwMDAwMEwpID4+IDQ4KTsKLSAgICAgICAgZGVzdFtvZmZzZXQgKyAwXSA9IChieXRlKSgodmFsdWUgJiAweEZGMDAwMDAwMDAwMDAwMDBMKSA+PiA1Nik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvbmcgdmFsdWUgb2YgdGhlIDxjb2RlPnZhbHVlSW5kZXg8L2NvZGU+LXRoIHZhbHVlLgotICAgICAqIEBwYXJhbSB2YWx1ZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgdmFsdWUuCi0gICAgICogQHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiBpZiBpbmRleCBpcyAwIGFzIGl0IGlzIGEgc3RyaW5nIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBnZXRWYWx1ZUFzTG9uZyhpbnQgdmFsdWVJbmRleCkgdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoICh2YWx1ZUluZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUeXBlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdjVGltZTsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0c0ZyZWVkOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc0ZyZWVkOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVybiBzb2Z0TGltaXQ7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFNpemU7Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRTaXplOwotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RzQWxsb2NhdGVkOwotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc0FsbG9jYXRlZDsKLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsU2l6ZSAtIHpBY3R1YWxTaXplOwotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dlZFNpemUgLSB6QWxsb3dlZFNpemU7Ci0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RzQWxsb2NhdGVkIC0gek9iamVjdHNBbGxvY2F0ZWQ7Ci0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc0FsbG9jYXRlZCAtIHpCeXRlc0FsbG9jYXRlZDsKLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICByZXR1cm4gekFjdHVhbFNpemU7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHJldHVybiB6QWxsb3dlZFNpemU7Ci0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgIHJldHVybiB6T2JqZWN0c0FsbG9jYXRlZDsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHpCeXRlc0FsbG9jYXRlZDsKLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsTGltaXQ7Ci0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbEJ5dGVzQWxsb2NhdGVkOwotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgICByZXR1cm4gZGxtYWxsb2NGb290cHJpbnQ7Ci0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgIHJldHVybiBtYWxsaW5mb1RvdGFsQWxsb2NhdGVkU3BhY2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9JbnZhbGlkVHlwZUV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9JbnZhbGlkVHlwZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZmOGFhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvSW52YWxpZFR5cGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2c7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYWNjZXNzaW5nIGFuIHtAbGluayBFdmVudENvbnRhaW5lcn0gdmFsdWUgd2l0aCB0aGUgd3JvbmcgdHlwZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEludmFsaWRUeXBlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIE5lZWRlZCBieSB7QGxpbmsgU2VyaWFsaXphYmxlfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGRlZmF1bHQgZGV0YWlsIG1lc3NhZ2UuCi0gICAgICogQHNlZSBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEludmFsaWRUeXBlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigiSW52YWxpZCBUeXBlIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZS4gVGhlIGRldGFpbCBtZXNzYWdlIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwKLSAgICAgKiBieSB0aGUge0BsaW5rIFRocm93YWJsZSNnZXRNZXNzYWdlKCl9IG1ldGhvZC4KLSAgICAgKiBAc2VlIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW52YWxpZFR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlIGFuZCBhIGRldGFpbCBtZXNzYWdlIG9mCi0gICAgICogPGNvZGU+KGNhdXNlPT1udWxsID8gbnVsbCA6IGNhdXNlLnRvU3RyaW5nKCkpPC9jb2RlPiAod2hpY2ggdHlwaWNhbGx5IGNvbnRhaW5zCi0gICAgICogdGhlIGNsYXNzIGFuZCBkZXRhaWwgbWVzc2FnZSBvZiBjYXVzZSkuCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKLSAgICAgKiB7QGxpbmsgVGhyb3dhYmxlI2dldENhdXNlKCl9IG1ldGhvZCkuIChBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzIHBlcm1pdHRlZCwKLSAgICAgKiBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yIHVua25vd24uKQotICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJbnZhbGlkVHlwZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgY2F1c2UuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlLiBUaGUgZGV0YWlsIG1lc3NhZ2UgaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbAotICAgICAqIGJ5IHRoZSB7QGxpbmsgVGhyb3dhYmxlI2dldE1lc3NhZ2UoKX0gbWV0aG9kLgotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlCi0gICAgICoge0BsaW5rIFRocm93YWJsZSNnZXRDYXVzZSgpfSBtZXRob2QpLiAoQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpcyBwZXJtaXR0ZWQsCi0gICAgICogYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjYXVzZSBpcyBub25leGlzdGVudCBvciB1bmtub3duLikKLSAgICAgKiBAc2VlIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW52YWxpZFR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL2xvZy9JbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0ludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNTBjOC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0ludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyLkV2ZW50VmFsdWVUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhc3NvY2lhdGluZyBhbiB7QGxpbmsgRXZlbnRWYWx1ZVR5cGV9IHdpdGggYW4gaW5jb21wYXRpYmxlCi0gKiB7QGxpbmsgVmFsdWVUeXBlfS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogTmVlZGVkIGJ5IHtAbGluayBTZXJpYWxpemFibGV9LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZGVmYXVsdCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgKiBAc2VlIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW52YWxpZFZhbHVlVHlwZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoIkludmFsaWQgVHlwZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UuIFRoZSBkZXRhaWwgbWVzc2FnZSBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsCi0gICAgICogYnkgdGhlIHtAbGluayBUaHJvd2FibGUjZ2V0TWVzc2FnZSgpfSBtZXRob2QuCi0gICAgICogQHNlZSBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEludmFsaWRWYWx1ZVR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlIGFuZCBhIGRldGFpbCBtZXNzYWdlIG9mCi0gICAgICogPGNvZGU+KGNhdXNlPT1udWxsID8gbnVsbCA6IGNhdXNlLnRvU3RyaW5nKCkpPC9jb2RlPiAod2hpY2ggdHlwaWNhbGx5IGNvbnRhaW5zCi0gICAgICogdGhlIGNsYXNzIGFuZCBkZXRhaWwgbWVzc2FnZSBvZiBjYXVzZSkuCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKLSAgICAgKiB7QGxpbmsgVGhyb3dhYmxlI2dldENhdXNlKCl9IG1ldGhvZCkuIChBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzIHBlcm1pdHRlZCwKLSAgICAgKiBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yIHVua25vd24uKQotICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlIGFuZCBjYXVzZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UuIFRoZSBkZXRhaWwgbWVzc2FnZSBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsCi0gICAgICogYnkgdGhlIHtAbGluayBUaHJvd2FibGUjZ2V0TWVzc2FnZSgpfSBtZXRob2QuCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKLSAgICAgKiB7QGxpbmsgVGhyb3dhYmxlI2dldENhdXNlKCl9IG1ldGhvZCkuIChBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzIHBlcm1pdHRlZCwKLSAgICAgKiBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yIHVua25vd24uKQotICAgICAqIEBzZWUgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJbnZhbGlkVmFsdWVUeXBlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvTG9nUmVjZWl2ZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9sb2cvTG9nUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZjAyNS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvbG9nL0xvZ1JlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliLmxvZzsKLQotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnV0aWxzLkFycmF5SGVscGVyOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlY2VpdmVyIGFibGUgdG8gcHJvdmlkZSBsb3cgbGV2ZWwgcGFyc2luZyBmb3IgZGV2aWNlLXNpZGUgbG9nIHNlcnZpY2VzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTG9nUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEVOVFJZX0hFQURFUl9TSVpFID0gMjA7IC8vIDIqMiArIDQqNDsgc2VlIExvZ0VudHJ5LgotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIGxvZyBlbnRyeSBhbmQgaXRzIHJhdyBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgTG9nRW50cnkgewotICAgICAgICAvKgotICAgICAgICAgKiBTZWUgLy9kZXZpY2UvaW5jbHVkZS91dGlscy9sb2dnZXIuaAotICAgICAgICAgKi8KLSAgICAgICAgLyoqIDE2Yml0IHVuc2lnbmVkOiBsZW5ndGggb2YgdGhlIHBheWxvYWQuICovCi0gICAgICAgIHB1YmxpYyBpbnQgIGxlbjsgLyogVGhpcyBpcyBub3JtYWxseSBmb2xsb3dlZCBieSBhIDE2IGJpdCBwYWRkaW5nICovCi0gICAgICAgIC8qKiBwaWQgb2YgdGhlIHByb2Nlc3MgdGhhdCBnZW5lcmF0ZWQgdGhpcyB7QGxpbmsgTG9nRW50cnl9ICovCi0gICAgICAgIHB1YmxpYyBpbnQgICBwaWQ7Ci0gICAgICAgIC8qKiB0aWQgb2YgdGhlIHByb2Nlc3MgdGhhdCBnZW5lcmF0ZWQgdGhpcyB7QGxpbmsgTG9nRW50cnl9ICovCi0gICAgICAgIHB1YmxpYyBpbnQgICB0aWQ7Ci0gICAgICAgIC8qKiBTZWNvbmRzIHNpbmNlIGVwb2NoLiAqLwotICAgICAgICBwdWJsaWMgaW50ICAgc2VjOwotICAgICAgICAvKiogbmFub3NlY29uZHMuICovCi0gICAgICAgIHB1YmxpYyBpbnQgICBuc2VjOwotICAgICAgICAvKiogVGhlIGVudHJ5J3MgcmF3IGRhdGEuICovCi0gICAgICAgIHB1YmxpYyBieXRlW10gZGF0YTsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IGRlYWxzCi0gICAgICogd2l0aCB7QGxpbmsgTG9nRW50cnl9IG9iamVjdHMgY29taW5nIGZyb20gbG9nIHNlcnZpY2UgdGhyb3VnaCBhIHtAbGluayBMb2dSZWNlaXZlcn0uCi0gICAgICogPHAvPlRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHR3byBtZXRob2RzLgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNuZXdFbnRyeShjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyLkxvZ0VudHJ5KX0gcHJvdmlkZXMgYQotICAgICAqIGZpcnN0IGxldmVsIG9mIHBhcnNpbmcsIGV4dHJhY3Rpbmcge0BsaW5rIExvZ0VudHJ5fSBvYmplY3RzIG91dCBvZiB0aGUgbG9nIHNlcnZpY2Ugb3V0cHV0LjwvbGk+Ci0gICAgICogPGxpPntAbGluayAjbmV3RGF0YShieXRlW10sIGludCwgaW50KX0gcHJvdmlkZXMgYSB3YXkgdG8gcmVjZWl2ZSB0aGUgcmF3IGluZm9ybWF0aW9uCi0gICAgICogY29taW5nIGRpcmVjdGx5IGZyb20gdGhlIGxvZyBzZXJ2aWNlLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElMb2dMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIExvZ0VudHJ5fSBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlIHtAbGluayBMb2dSZWNlaXZlcn0uCi0gICAgICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgbmV3IGxvZyBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG5ld0VudHJ5KExvZ0VudHJ5IGVudHJ5KTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gbmV3IHJhdyBkYXRhIGlzIGNvbWluZyBmcm9tIHRoZSBsb2cgc2VydmljZS4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIHJhdyBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBzaWduYWxpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGRhdGEuCi0gICAgICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBuZXdEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKiogQ3VycmVudCB7QGxpbmsgTG9nRW50cnl9IGJlaW5nIHJlYWQsIGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBsaXN0ZW5lci4gKi8KLSAgICBwcml2YXRlIExvZ0VudHJ5IG1DdXJyZW50RW50cnk7Ci0KLSAgICAvKiogVGVtcCBidWZmZXIgdG8gc3RvcmUgcGFydGlhbCBlbnRyeSBoZWFkZXJzLiAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1FbnRyeUhlYWRlckJ1ZmZlciA9IG5ldyBieXRlW0VOVFJZX0hFQURFUl9TSVpFXTsKLSAgICAvKiogT2Zmc2V0IGluIHRoZSBwYXJ0aWFsIGhlYWRlciBidWZmZXIgKi8KLSAgICBwcml2YXRlIGludCBtRW50cnlIZWFkZXJPZmZzZXQgPSAwOwotICAgIC8qKiBPZmZzZXQgaW4gdGhlIHBhcnRpYWwgZW50cnkgZGF0YSAqLwotICAgIHByaXZhdGUgaW50IG1FbnRyeURhdGFPZmZzZXQgPSAwOwotICAgIAotICAgIC8qKiBMaXN0ZW5lciB3YWl0aW5nIGZvciByZWNlaXZlIGZ1bGx5IHJlYWQge0BsaW5rIExvZ0VudHJ5fSBvYmplY3RzICovCi0gICAgcHJpdmF0ZSBJTG9nTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0NhbmNlbGxlZCA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTG9nUmVjZWl2ZXJ9IHdpdGggYW4ge0BsaW5rIElMb2dMaXN0ZW5lcn0uCi0gICAgICogPHAvPgotICAgICAqIFRoZSB7QGxpbmsgSUxvZ0xpc3RlbmVyfSB3aWxsIHJlY2VpdmUgbmV3IGxvZyBlbnRyaWVzIGFzIHRoZXkgYXJlIHBhcnNlZCwgaW4gdGhlIGZvcm0gCi0gICAgICogb2Yge0BsaW5rIExvZ0VudHJ5fSBvYmplY3RzLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBuZXcgbG9nIGVudHJpZXMuCi0gICAgICovCi0gICAgcHVibGljIExvZ1JlY2VpdmVyKElMb2dMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgbmV3IGRhdGEgY29taW5nIGZyb20gdGhlIGxvZyBzZXJ2aWNlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGJ1ZmZlcgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgc2lnbmFsaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBkYXRhLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2VOZXdEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIC8vIG5vdGlmeSB0aGUgbGlzdGVuZXIgb2YgbmV3IHJhdyBkYXRhCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm5ld0RhdGEoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9vcCB3aGlsZSB0aGVyZSBpcyBzdGlsbCBkYXRhIHRvIGJlIHJlYWQgYW5kIHRoZSByZWNlaXZlciBoYXMgbm90IGJlIGNhbmNlbGxlZC4KLSAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDAgJiYgbUlzQ2FuY2VsbGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB3ZSBoYXZlIG5vIGN1cnJlbnQgZW50cnkuCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRFbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbnRyeUhlYWRlck9mZnNldCArIGxlbmd0aCA8IEVOVFJZX0hFQURFUl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gZmluaXNoIHRoZSBoZWFkZXIsIHNhdmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEgd2UgaGF2ZSBhbmQgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBtRW50cnlIZWFkZXJCdWZmZXIsIG1FbnRyeUhlYWRlck9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbUVudHJ5SGVhZGVyT2Zmc2V0ICs9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGZpbGwgdGhlIGhlYWRlciwgbGV0J3MgZG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpZCB3ZSBzdG9yZSBzb21lIHBhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyPwotICAgICAgICAgICAgICAgICAgICBpZiAobUVudHJ5SGVhZGVyT2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHJlc3Qgb2YgdGhlIGVudHJ5IGhlYWRlciBpbnRvIHRoZSBoZWFkZXIgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IEVOVFJZX0hFQURFUl9TSVpFIC0gbUVudHJ5SGVhZGVyT2Zmc2V0OyAKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBtRW50cnlIZWFkZXJCdWZmZXIsIG1FbnRyeUhlYWRlck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZW50cnkgZnJvbSB0aGUgaGVhZGVyIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRFbnRyeSA9IGNyZWF0ZUVudHJ5KG1FbnRyeUhlYWRlckJ1ZmZlciwgMCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB1c2VkIHRoZSB3aG9sZSBlbnRyeSBoZWFkZXIgYnVmZmVyLCB3ZSByZXNldCAgdGhlIG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgbUVudHJ5SGVhZGVyT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGN1cnJlbnQgb2Zmc2V0IGFuZCByZW1haW5pbmcgbGVuZ3RoIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBlbnRyeSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBzaXplOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBlbnRyeSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEVudHJ5ID0gY3JlYXRlRW50cnkoZGF0YSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGN1cnJlbnQgb2Zmc2V0IGFuZCByZW1haW5pbmcgbGVuZ3RoIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBlbnRyeSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRU5UUllfSEVBREVSX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gRU5UUllfSEVBREVSX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYW4gZW50cnksIGFuZCBvZmZzZXQvbGVuZ3RoIGhhdmUgYmVlbiB1cGRhdGVkIHRvIHNraXAKLSAgICAgICAgICAgIC8vIHRoZSBlbnRyeSBoZWFkZXIuCi0gICAgCi0gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciB0aGlzIGVudHJ5IG9yIG1vcmUsIHdlJ2xsIG5lZWQgdG8gZW5kIHRoaXMgZW50cnkKLSAgICAgICAgICAgIGlmIChsZW5ndGggPj0gbUN1cnJlbnRFbnRyeS5sZW4gLSBtRW50cnlEYXRhT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhbmQgc2F2ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0aGF0IHdlIGhhdmUgdG8gcmVhZCBmb3IgdGhpcyBlbnRyeSwKLSAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiBob3cgbXVjaCB3ZSBtYXkgYWxyZWFkeSBoYXZlIHJlYWQuCi0gICAgICAgICAgICAgICAgaW50IGRhdGFTaXplID0gbUN1cnJlbnRFbnRyeS5sZW4gLSBtRW50cnlEYXRhT2Zmc2V0OyAgCi0gICAgCi0gICAgICAgICAgICAgICAgLy8gd2Ugb25seSByZWFkIHdoYXQgd2UgbmVlZCwgYW5kIHB1dCBpdCBpbiB0aGUgZW50cnkgYnVmZmVyLgotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBtQ3VycmVudEVudHJ5LmRhdGEsIG1FbnRyeURhdGFPZmZzZXQsIGRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIGEgbmV3IGVudHJ5Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5uZXdFbnRyeShtQ3VycmVudEVudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gcmVzZXQgc29tZSBmbGFnczogd2UgaGF2ZSByZWFkIDAgZGF0YSBvZiB0aGUgY3VycmVudCBlbnRyeS4KLSAgICAgICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBubyBjdXJyZW50IGVudHJ5IGJlaW5nIHJlYWQuCi0gICAgICAgICAgICAgICAgbUVudHJ5RGF0YU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRFbnRyeSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgZGF0YSBidWZmZXIgaW5mbyB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVudHJ5IC8gc3RhcnQKLSAgICAgICAgICAgICAgICAvLyBvZiB0aGUgbmV4dCBvbmUuCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGFTaXplOwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBkYXRhU2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB0byBmaWxsIHRoaXMgZW50cnksIHNvIHdlIHN0b3JlIHdoYXQgd2UgaGF2ZQotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBlbnRyeSBpdHNlbGYuCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIG1DdXJyZW50RW50cnkuZGF0YSwgbUVudHJ5RGF0YU9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBhbW91bnQgcmVhZCBmb3IgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgbUVudHJ5RGF0YU9mZnNldCArPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVjZWl2ZXIgaXMgY2FuY2VsaW5nIHRoZSByZW1vdGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0NhbmNlbGxlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyB0aGUgY3VycmVudCByZW1vdGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1Jc0NhbmNlbGxlZCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTG9nRW50cnl9IGZyb20gdGhlIGFycmF5IG9mIGJ5dGVzLiBUaGlzIGV4cGVjdHMgdGhlIGRhdGEgYnVmZmVyIHNpemUKLSAgICAgKiB0byBiZSBhdCBsZWFzdCA8Y29kZT5vZmZzZXQgKyB7QGxpbmsgI0VOVFJZX0hFQURFUl9TSVpFfTwvY29kZT4uCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgYnVmZmVyIHRoZSBlbnRyeSBpcyByZWFkIGZyb20uCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGZyb20gdGhlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGVudHJ5LgotICAgICAqIEByZXR1cm4gYSBuZXcge0BsaW5rIExvZ0VudHJ5fSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzb21lIGVycm9yIGhhcHBlbmVkLgotICAgICAqLwotICAgIHByaXZhdGUgTG9nRW50cnkgY3JlYXRlRW50cnkoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQpIHsKLSAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgb2Zmc2V0ICsgRU5UUllfSEVBREVSX1NJWkUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIG5vdCBiaWcgZW5vdWdoIHRvIGhvbGQgZnVsbCBMb2dnZXJFbnRyeSBoZWFkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBmaWxsIGl0LgotICAgICAgICBMb2dFbnRyeSBlbnRyeSA9IG5ldyBMb2dFbnRyeSgpOwotICAgICAgICBlbnRyeS5sZW4gPSBBcnJheUhlbHBlci5zd2FwVTE2Yml0RnJvbUFycmF5KGRhdGEsIG9mZnNldCk7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSd2ZSByZWFkIG9ubHkgMTYgYml0cywgYnV0IHNpbmNlIHRoZXJlJ3MgYWxzbyBhIDE2IGJpdCBwYWRkaW5nLAotICAgICAgICAvLyB3ZSBjYW4gc2tpcCByaWdodCBvdmVyIGJvdGguCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICAKLSAgICAgICAgZW50cnkucGlkID0gQXJyYXlIZWxwZXIuc3dhcDMyYml0RnJvbUFycmF5KGRhdGEsIG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBlbnRyeS50aWQgPSBBcnJheUhlbHBlci5zd2FwMzJiaXRGcm9tQXJyYXkoZGF0YSwgb2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIGVudHJ5LnNlYyA9IEFycmF5SGVscGVyLnN3YXAzMmJpdEZyb21BcnJheShkYXRhLCBvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgZW50cnkubnNlYyA9IEFycmF5SGVscGVyLnN3YXAzMmJpdEZyb21BcnJheShkYXRhLCBvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgCi0gICAgICAgIC8vIGFsbG9jYXRlIHRoZSBkYXRhCi0gICAgICAgIGVudHJ5LmRhdGEgPSBuZXcgYnl0ZVtlbnRyeS5sZW5dOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL0lUZXN0UnVuTGlzdGVuZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL0lUZXN0UnVuTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYTY5OC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9JVGVzdFJ1bkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lcjsKLQotLyoqCi0gKiBSZWNlaXZlcyBldmVudCBub3RpZmljYXRpb25zIGR1cmluZyBpbnN0cnVtZW50YXRpb24gdGVzdCBydW5zLiAKLSAqIFBhdHRlcm5lZCBhZnRlciB7QGxpbmsganVuaXQucnVubmVyLlRlc3RSdW5MaXN0ZW5lcn0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRlc3RSdW5MaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiAgVHlwZXMgb2YgdGVzdCBmYWlsdXJlcy4KLSAgICAgKi8KLSAgICBlbnVtIFRlc3RGYWlsdXJlIHsKLSAgICAgICAgLyoqIFRlc3QgZmFpbGVkIGR1ZSB0byB1bmFudGljaXBhdGVkIHVuY2F1Z2h0IGV4Y2VwdGlvbi4gKi8KLSAgICAgICAgRVJST1IsCi0gICAgICAgIC8qKiBUZXN0IGZhaWxlZCBkdWUgdG8gYSBmYWxzZSBhc3NlcnRpb24uICovCi0gICAgICAgIEZBSUxVUkUKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmVwb3J0cyB0aGUgc3RhcnQgb2YgYSB0ZXN0IHJ1bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdENvdW50IHRvdGFsIG51bWJlciBvZiB0ZXN0cyBpbiB0ZXN0IHJ1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKGludCB0ZXN0Q291bnQpOwotICAgIAotICAgIC8qKgotICAgICAqIFJlcG9ydHMgZW5kIG9mIHRlc3QgcnVuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGFwc2VkVGltZSBkZXZpY2UgcmVwb3J0ZWQgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRW5kZWQobG9uZyBlbGFwc2VkVGltZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnRzIHRlc3QgcnVuIHN0b3BwZWQgYmVmb3JlIGNvbXBsZXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsYXBzZWRUaW1lIGRldmljZSByZXBvcnRlZCBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdG9wcGVkKGxvbmcgZWxhcHNlZFRpbWUpOwotCi0gICAgLyoqCi0gICAgICogUmVwb3J0cyB0aGUgc3RhcnQgb2YgYW4gaW5kaXZpZHVhbCB0ZXN0IGNhc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3QgaWRlbnRpZmllcyB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpOwotCi0gICAgLyoqCi0gICAgICogUmVwb3J0cyB0aGUgZXhlY3V0aW9uIGVuZCBvZiBhbiBpbmRpdmlkdWFsIHRlc3QgY2FzZS4KLSAgICAgKiBJZiB7QGxpbmsgI3Rlc3RGYWlsZWR9IHdhcyBub3QgaW52b2tlZCwgdGhpcyB0ZXN0IHBhc3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdCBpZGVudGlmaWVzIHRoZSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpOwotCi0gICAgLyoqCi0gICAgICogUmVwb3J0cyB0aGUgZmFpbHVyZSBvZiBhIGluZGl2aWR1YWwgdGVzdCBjYXNlLgotICAgICAqIFdpbGwgYmUgY2FsbGVkIGJldHdlZW4gdGVzdFN0YXJ0ZWQgYW5kIHRlc3RFbmRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdHVzIGZhaWx1cmUgdHlwZQotICAgICAqIEBwYXJhbSB0ZXN0IGlkZW50aWZpZXMgdGhlIHRlc3QKLSAgICAgKiBAcGFyYW0gdHJhY2Ugc3RhY2sgdHJhY2Ugb2YgZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWQoVGVzdEZhaWx1cmUgc3RhdHVzLCBUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBSZXBvcnRzIHRlc3QgcnVuIGZhaWxlZCB0byBleGVjdXRlIGR1ZSB0byBhIGZhdGFsIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GYWlsZWQoU3RyaW5nIGVycm9yTWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9JbnN0cnVtZW50YXRpb25SZXN1bHRQYXJzZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL0luc3RydW1lbnRhdGlvblJlc3VsdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTBiMjFmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL0luc3RydW1lbnRhdGlvblJlc3VsdFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklTaGVsbE91dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk11bHRpTGluZVJlY2VpdmVyOwotCi0vKioKLSAqIFBhcnNlcyB0aGUgJ3JhdyBvdXRwdXQgbW9kZScgcmVzdWx0cyBvZiBhbiBpbnN0cnVtZW50YXRpb24gdGVzdCBydW4gZnJvbSBzaGVsbCBhbmQgaW5mb3JtcyBhIAotICogSVRlc3RSdW5MaXN0ZW5lciBvZiB0aGUgcmVzdWx0cy4KLSAqIAotICogPHA+RXhwZWN0cyB0aGUgZm9sbG93aW5nIG91dHB1dDoKLSAqIAotICogPHA+SWYgZmF0YWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0ZWQgdG8gcnVuIHRoZSB0ZXN0czoKLSAqIDxwcmU+Ci0gKiBJTlNUUlVNRU5UQVRJT05fU1RBVFVTOiBFcnJvcj1lcnJvciBNZXNzYWdlCi0gKiBJTlNUUlVNRU5UQVRJT05fRkFJTEVEOiAKLSAqIDwvcHJlPgotICogPHA+b3IKLSAqIDxwcmU+Ci0gKiBJTlNUUlVNRU5UQVRJT05fUkVTVUxUOiBzaG9ydE1zZz1lcnJvciBNZXNzYWdlCi0gKiA8L3ByZT4KLSAqIAotICogPHA+T3RoZXJ3aXNlLCBleHBlY3QgYSBzZXJpZXMgb2YgdGVzdCByZXN1bHRzLCBlYWNoIG9uZSBjb250YWluaW5nIGEgc2V0IG9mIHN0YXR1cyBrZXkvdmFsdWUKLSAqIHBhaXJzLCBkZWxpbWl0ZWQgYnkgYSBzdGFydCgxKS9wYXNzKDApL2ZhaWwoLTIpL2Vycm9yKC0xKSBzdGF0dXMgY29kZSByZXN1bHQuIEF0IGVuZCBvZiB0ZXN0IAotICogcnVuLCBleHBlY3RzIHRoYXQgdGhlIGVsYXBzZWQgdGVzdCB0aW1lIGluIHNlY29uZHMgd2lsbCBiZSBkaXNwbGF5ZWQgIAotICogCi0gKiA8cD5Gb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiBJTlNUUlVNRU5UQVRJT05fU1RBVFVTX0NPREU6IDEKLSAqIElOU1RSVU1FTlRBVElPTl9TVEFUVVM6IGNsYXNzPWNvbS5mb28uRm9vVGVzdAotICogSU5TVFJVTUVOVEFUSU9OX1NUQVRVUzogdGVzdD10ZXN0Rm9vCi0gKiBJTlNUUlVNRU5UQVRJT05fU1RBVFVTOiBudW10ZXN0cz0yCi0gKiBJTlNUUlVNRU5UQVRJT05fU1RBVFVTOiBzdGFjaz1jb20uZm9vLkZvb1Rlc3QjdGVzdEZvbzozMTIKLSAqICAgIGNvbS5mb28uWAotICogSU5TVFJVTUVOVEFUSU9OX1NUQVRVU19DT0RFOiAtMiAgIAotICogLi4uIAotICogCi0gKiBUaW1lOiBYCi0gKiA8L3ByZT4KLSAqIDxwPk5vdGUgdGhhdCB0aGUgInZhbHVlIiBwb3J0aW9uIG9mIHRoZSBrZXktdmFsdWUgcGFpciBtYXkgd3JhcCBvdmVyIHNldmVyYWwgdGV4dCBsaW5lcwotICovCi1wdWJsaWMgY2xhc3MgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyIGV4dGVuZHMgTXVsdGlMaW5lUmVjZWl2ZXIgewotICAgIAotICAgIC8qKiBSZWxldmFudCB0ZXN0IHN0YXR1cyBrZXlzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXR1c0tleXMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVCA9ICJ0ZXN0IjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUNLID0gInN0YWNrIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTVRFU1RTID0gIm51bXRlc3RzIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SID0gIkVycm9yIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUTVNHID0gInNob3J0TXNnIjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFRlc3QgcmVzdWx0IHN0YXR1cyBjb2Rlcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0dXNDb2RlcyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMVVJFID0gLTI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IC0xOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotICAgIH0KLQotICAgIC8qKiBQcmVmaXhlcyB1c2VkIHRvIGlkZW50aWZ5IG91dHB1dC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmVmaXhlcyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVMgPSAiSU5TVFJVTUVOVEFUSU9OX1NUQVRVUzogIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19DT0RFID0gIklOU1RSVU1FTlRBVElPTl9TVEFUVVNfQ09ERTogIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19GQUlMRUQgPSAiSU5TVFJVTUVOVEFUSU9OX0ZBSUxFRDogIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREUgPSAiSU5TVFJVTUVOVEFUSU9OX0NPREU6ICI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFQgPSAiSU5TVFJVTUVOVEFUSU9OX1JFU1VMVDogIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfUkVQT1JUID0gIlRpbWU6ICI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgSVRlc3RSdW5MaXN0ZW5lciBtVGVzdExpc3RlbmVyOwotCi0gICAgLyoqIAotICAgICAqIFRlc3QgcmVzdWx0IGRhdGEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0UmVzdWx0IHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIG1Db2RlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3ROYW1lID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RDbGFzcyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1TdGFja1RyYWNlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIG1OdW1UZXN0cyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvKiogUmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCB2YWx1ZXMgaGF2ZSBiZWVuIHBhcnNlZCAqLwotICAgICAgICBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvZGUgIT0gbnVsbCAmJiBtVGVzdE5hbWUgIT0gbnVsbCAmJiBtVGVzdENsYXNzICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBQcm92aWRlcyBhIG1vcmUgdXNlciByZWFkYWJsZSBzdHJpbmcgZm9yIFRlc3RSZXN1bHQsIGlmIHBvc3NpYmxlICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaWYgKG1UZXN0Q2xhc3MgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKG1UZXN0Q2xhc3MpOwotICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoJyMnKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICBpZiAobVRlc3ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKG1UZXN0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICByZXR1cm4gInVua25vd24gcmVzdWx0IjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogU3RvcmVzIHRoZSBzdGF0dXMgdmFsdWVzIGZvciB0aGUgdGVzdCByZXN1bHQgY3VycmVudGx5IGJlaW5nIHBhcnNlZCAqLwotICAgIHByaXZhdGUgVGVzdFJlc3VsdCBtQ3VycmVudFRlc3RSZXN1bHQgPSBudWxsOwotICAgIAotICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgImtleSIgcG9ydGlvbiBvZiB0aGUgc3RhdHVzIGtleS12YWx1ZSBiZWluZyBwYXJzZWQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRLZXkgPSBudWxsOwotICAgIAotICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgInZhbHVlIiBwb3J0aW9uIG9mIHRoZSBzdGF0dXMga2V5LXZhbHVlIGJlaW5nIHBhcnNlZC4gKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0gICAgCi0gICAgLyoqIFRydWUgaWYgc3RhcnQgb2YgdGVzdCBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIGxpc3RlbmVyLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVzdFN0YXJ0UmVwb3J0ZWQgPSBmYWxzZTsKLSAgICAKLSAgICAvKiogVGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgdGVzdCBydW4sIGluIG1pbGxpc2Vjb25kcy4gKi8KLSAgICBwcml2YXRlIGxvbmcgbVRlc3RUaW1lID0gMDsKLSAgICAKLSAgICAvKiogVHJ1ZSBpZiBjdXJyZW50IHRlc3QgcnVuIGhhcyBiZWVuIGNhbmNlbGVkIGJ5IHVzZXIuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0NhbmNlbGxlZCA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkluc3RydW1lbnRhdGlvblJlc3VsdFBhcnNlciI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBpbmZvcm1lZCBvZiB0ZXN0IHJlc3VsdHMgYXMgdGhlIHRlc3RzIGFyZSBleGVjdXRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyKElUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVRlc3RMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGluc3RydW1lbnRhdGlvbiB0ZXN0IG91dHB1dCBmcm9tIHNoZWxsLgotICAgICAqIAotICAgICAqIEBzZWUgTXVsdGlMaW5lUmVjZWl2ZXIjcHJvY2Vzc05ld0xpbmVzCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc05ld0xpbmVzKFN0cmluZ1tdIGxpbmVzKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgcGFyc2UobGluZSk7Ci0gICAgICAgICAgICAvLyBpbiB2ZXJib3NlIG1vZGUsIGR1bXAgYWxsIGFkYiBvdXRwdXQgdG8gbG9nCi0gICAgICAgICAgICBMb2cudihMT0dfVEFHLCBsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbiBpbmRpdmlkdWFsIG91dHB1dCBsaW5lLiBFeHBlY3RzIGEgbGluZSB0aGF0IGlzIG9uZSBvZjoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPiAKLSAgICAgKiBUaGUgc3RhcnQgb2YgYSBuZXcgc3RhdHVzIGxpbmUgKHN0YXJ0cyB3aXRoIFByZWZpeGVzLlNUQVRVUyBvciBQcmVmaXhlcy5TVEFUVVNfQ09ERSksIAotICAgICAqIGFuZCB0aHVzIHRoZXJlIGlzIGEgbmV3IGtleT12YWx1ZSBwYWlyIHRvIHBhcnNlLCBhbmQgdGhlIHByZXZpb3VzIGtleS12YWx1ZSBwYWlyIGlzIAotICAgICAqIGZpbmlzaGVkLiAKLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT4KLSAgICAgKiBBIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMgc3RhdHVzICh0aGUgInZhbHVlIiBwb3J0aW9uIG9mIHRoZSBrZXkgaGFzIHdyYXBwZWQKLSAgICAgKiB0byB0aGUgbmV4dCBsaW5lKS4KLSAgICAgKiA8L2xpPiAgCi0gICAgICogPGxpPiBBIGxpbmUgcmVwb3J0aW5nIGEgZmF0YWwgZXJyb3IgaW4gdGhlIHRlc3QgcnVuIChQcmVmaXhlcy5TVEFUVVNfRkFJTEVEKSA8L2xpPgotICAgICAqIDxsaT4gQSBsaW5lIHJlcG9ydGluZyB0aGUgdG90YWwgZWxhcHNlZCB0aW1lIG9mIHRoZSB0ZXN0IHJ1bi4gKFByZWZpeGVzLlRJTUVfUkVQT1JUKSA8L2xpPiAgCi0gICAgICogPC91bD4KLSAgICAgKiAgICAKLSAgICAgKiBAcGFyYW0gbGluZSAgVGV4dCBvdXRwdXQgbGluZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFByZWZpeGVzLlNUQVRVU19DT0RFKSkgewotICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdHVzIGtleS12YWx1ZSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFN0b3JlIGl0LgotICAgICAgICAgICAgc3VibWl0Q3VycmVudEtleVZhbHVlKCk7Ci0gICAgICAgICAgICBwYXJzZVN0YXR1c0NvZGUobGluZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFByZWZpeGVzLlNUQVRVUykpIHsKLSAgICAgICAgICAgIC8vIFByZXZpb3VzIHN0YXR1cyBrZXktdmFsdWUgaGFzIGJlZW4gY29sbGVjdGVkLiBTdG9yZSBpdC4KLSAgICAgICAgICAgIHN1Ym1pdEN1cnJlbnRLZXlWYWx1ZSgpOwotICAgICAgICAgICAgcGFyc2VLZXkobGluZSwgUHJlZml4ZXMuU1RBVFVTLmxlbmd0aCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoUHJlZml4ZXMuUkVTVUxUKSkgewotICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdHVzIGtleS12YWx1ZSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFN0b3JlIGl0LgotICAgICAgICAgICAgc3VibWl0Q3VycmVudEtleVZhbHVlKCk7Ci0gICAgICAgICAgICBwYXJzZUtleShsaW5lLCBQcmVmaXhlcy5SRVNVTFQubGVuZ3RoKCkpOyAgCi0gICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFByZWZpeGVzLlNUQVRVU19GQUlMRUQpIHx8IAotICAgICAgICAgICAgICAgICAgIGxpbmUuc3RhcnRzV2l0aChQcmVmaXhlcy5DT0RFKSkgewotICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdHVzIGtleS12YWx1ZSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFN0b3JlIGl0LgotICAgICAgICAgICAgc3VibWl0Q3VycmVudEtleVZhbHVlKCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgcmVtYWluaW5nIGRhdGEgb24gdGhpcyBsaW5lICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFByZWZpeGVzLlRJTUVfUkVQT1JUKSkgewotICAgICAgICAgICAgcGFyc2VUaW1lKGxpbmUsIFByZWZpeGVzLlRJTUVfUkVQT1JULmxlbmd0aCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgdmFsdWUgdGhhdCBoYXMgd3JhcHBlZCB0byBuZXh0IGxpbmUuIAotICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWUuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJ1bnJlY29nbml6ZWQgbGluZSAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBjdXJyZW50bHkgcGFyc2VkIGtleS12YWx1ZSBwYWlyIGludG8gbUN1cnJlbnRUZXN0SW5mby4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3VibWl0Q3VycmVudEtleVZhbHVlKCkgewotICAgICAgICBpZiAobUN1cnJlbnRLZXkgIT0gbnVsbCAmJiBtQ3VycmVudFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRlc3RSZXN1bHQgdGVzdEluZm8gPSBnZXRDdXJyZW50VGVzdEluZm8oKTsKLSAgICAgICAgICAgIFN0cmluZyBzdGF0dXNWYWx1ZSA9IG1DdXJyZW50VmFsdWUudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgaWYgKG1DdXJyZW50S2V5LmVxdWFscyhTdGF0dXNLZXlzLkNMQVNTKSkgewotICAgICAgICAgICAgICAgIHRlc3RJbmZvLm1UZXN0Q2xhc3MgPSBzdGF0dXNWYWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50S2V5LmVxdWFscyhTdGF0dXNLZXlzLlRFU1QpKSB7Ci0gICAgICAgICAgICAgICAgdGVzdEluZm8ubVRlc3ROYW1lID0gc3RhdHVzVmFsdWUudHJpbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudEtleS5lcXVhbHMoU3RhdHVzS2V5cy5OVU1URVNUUykpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0ZXN0SW5mby5tTnVtVGVzdHMgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXR1c1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5leHBlY3RlZCBpbnRlZ2VyIG51bWJlciBvZiB0ZXN0cywgcmVjZWl2ZWQgIiArIHN0YXR1c1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50S2V5LmVxdWFscyhTdGF0dXNLZXlzLkVSUk9SKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRLZXkuZXF1YWxzKFN0YXR1c0tleXMuU0hPUlRNU0cpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGVzdCBydW4gbXVzdCBoYXZlIGZhaWxlZAotICAgICAgICAgICAgICAgIGhhbmRsZVRlc3RSdW5GYWlsZWQoc3RhdHVzVmFsdWUpOyAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRLZXkuZXF1YWxzKFN0YXR1c0tleXMuU1RBQ0spKSB7Ci0gICAgICAgICAgICAgICAgdGVzdEluZm8ubVN0YWNrVHJhY2UgPSBzdGF0dXNWYWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRLZXkgPSBudWxsOwotICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXN0UmVzdWx0IGdldEN1cnJlbnRUZXN0SW5mbygpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VGVzdFJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFRlc3RSZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjbGVhckN1cnJlbnRUZXN0SW5mbygpIHsKLSAgICAgICAgbUN1cnJlbnRUZXN0UmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBrZXkgZnJvbSB0aGUgY3VycmVudCBsaW5lLgotICAgICAqIEV4cGVjdHMgZm9ybWF0IG9mICJrZXk9dmFsdWUiLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gbGluZSBmdWxsIGxpbmUgb2YgdGV4dCB0byBwYXJzZSAKLSAgICAgKiBAcGFyYW0ga2V5U3RhcnRQb3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBrZXkgaW4gdGhlIGdpdmVuIGxpbmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VLZXkoU3RyaW5nIGxpbmUsIGludCBrZXlTdGFydFBvcykgewotICAgICAgICBpbnQgZW5kS2V5UG9zID0gbGluZS5pbmRleE9mKCc9Jywga2V5U3RhcnRQb3MpOwotICAgICAgICBpZiAoZW5kS2V5UG9zICE9IC0xKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEtleSA9IGxpbmUuc3Vic3RyaW5nKGtleVN0YXJ0UG9zLCBlbmRLZXlQb3MpLnRyaW0oKTsKLSAgICAgICAgICAgIHBhcnNlVmFsdWUobGluZSwgZW5kS2V5UG9zICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBzdGFydCBvZiBhIGtleT12YWx1ZSBwYWlyLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gbGluZSAtIGZ1bGwgbGluZSBvZiB0ZXh0IHRvIHBhcnNlIAotICAgICAqIEBwYXJhbSB2YWx1ZVN0YXJ0UG9zIC0gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gbGluZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZVZhbHVlKFN0cmluZyBsaW5lLCBpbnQgdmFsdWVTdGFydFBvcykgewotICAgICAgICBtQ3VycmVudFZhbHVlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUN1cnJlbnRWYWx1ZS5hcHBlbmQobGluZS5zdWJzdHJpbmcodmFsdWVTdGFydFBvcykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZXMgb3V0IGEgc3RhdHVzIGNvZGUgcmVzdWx0LiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VTdGF0dXNDb2RlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKFByZWZpeGVzLlNUQVRVU19DT0RFLmxlbmd0aCgpKS50cmltKCk7Ci0gICAgICAgIFRlc3RSZXN1bHQgdGVzdEluZm8gPSBnZXRDdXJyZW50VGVzdEluZm8oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RJbmZvLm1Db2RlID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7ICAgIAotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkV4cGVjdGVkIGludGVnZXIgc3RhdHVzIGNvZGUsIHJlY2VpdmVkOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0aGlzIG1lYW5zIHdlJ3JlIGRvbmUgd2l0aCBjdXJyZW50IHRlc3QgcmVzdWx0IGJ1bmRsZQotICAgICAgICByZXBvcnRSZXN1bHQodGVzdEluZm8pOwotICAgICAgICBjbGVhckN1cnJlbnRUZXN0SW5mbygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGVzdCBydW4gY2FuY2VsZWQuCi0gICAgICogCi0gICAgICogQHNlZSBJU2hlbGxPdXRwdXRSZWNlaXZlciNpc0NhbmNlbGxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtSXNDYW5jZWxsZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlcXVlc3RzIGNhbmNlbGxhdGlvbiBvZiB0ZXN0IHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1Jc0NhbmNlbGxlZCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlcG9ydHMgYSB0ZXN0IHJlc3VsdCB0byB0aGUgdGVzdCBydW4gbGlzdGVuZXIuIE11c3QgYmUgY2FsbGVkIHdoZW4gYSBpbmRpdmlkdWFsIHRlc3QKLSAgICAgKiByZXN1bHQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdHVzTWFwIGtleS12YWx1ZSBzdGF0dXMgcGFpcnMgb2YgdGVzdCByZXN1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVwb3J0UmVzdWx0KFRlc3RSZXN1bHQgdGVzdEluZm8pIHsKLSAgICAgICAgaWYgKCF0ZXN0SW5mby5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJpbnZhbGlkIGluc3RydW1lbnRhdGlvbiBzdGF0dXMgYnVuZGxlICIgKyB0ZXN0SW5mby50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZXBvcnRUZXN0UnVuU3RhcnRlZCh0ZXN0SW5mbyk7Ci0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3RJZCA9IG5ldyBUZXN0SWRlbnRpZmllcih0ZXN0SW5mby5tVGVzdENsYXNzLCB0ZXN0SW5mby5tVGVzdE5hbWUpOwotCi0gICAgICAgIHN3aXRjaCAodGVzdEluZm8ubUNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgU3RhdHVzQ29kZXMuU1RBUlQ6Ci0gICAgICAgICAgICAgICAgbVRlc3RMaXN0ZW5lci50ZXN0U3RhcnRlZCh0ZXN0SWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTdGF0dXNDb2Rlcy5GQUlMVVJFOgotICAgICAgICAgICAgICAgIG1UZXN0TGlzdGVuZXIudGVzdEZhaWxlZChJVGVzdFJ1bkxpc3RlbmVyLlRlc3RGYWlsdXJlLkZBSUxVUkUsIHRlc3RJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFjZSh0ZXN0SW5mbykpOwotICAgICAgICAgICAgICAgIG1UZXN0TGlzdGVuZXIudGVzdEVuZGVkKHRlc3RJZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFN0YXR1c0NvZGVzLkVSUk9SOgotICAgICAgICAgICAgICAgIG1UZXN0TGlzdGVuZXIudGVzdEZhaWxlZChJVGVzdFJ1bkxpc3RlbmVyLlRlc3RGYWlsdXJlLkVSUk9SLCB0ZXN0SWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhY2UodGVzdEluZm8pKTsKLSAgICAgICAgICAgICAgICBtVGVzdExpc3RlbmVyLnRlc3RFbmRlZCh0ZXN0SWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTdGF0dXNDb2Rlcy5PSzoKLSAgICAgICAgICAgICAgICBtVGVzdExpc3RlbmVyLnRlc3RFbmRlZCh0ZXN0SWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBzdGF0dXMgY29kZSByZWNlaXZlZDogIiArIHRlc3RJbmZvLm1Db2RlKTsKLSAgICAgICAgICAgICAgICBtVGVzdExpc3RlbmVyLnRlc3RFbmRlZCh0ZXN0SWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXBvcnRzIHRoZSBzdGFydCBvZiBhIHRlc3QgcnVuLCBhbmQgdGhlIHRvdGFsIHRlc3QgY291bnQsIGlmIGl0IGhhcyBub3QgYmVlbiBwcmV2aW91c2x5IAotICAgICAqIHJlcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0SW5mbyBjdXJyZW50IHRlc3Qgc3RhdHVzIHZhbHVlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXBvcnRUZXN0UnVuU3RhcnRlZChUZXN0UmVzdWx0IHRlc3RJbmZvKSB7Ci0gICAgICAgIC8vIGlmIHN0YXJ0IHRlc3QgcnVuIG5vdCByZXBvcnRlZCB5ZXQKLSAgICAgICAgaWYgKCFtVGVzdFN0YXJ0UmVwb3J0ZWQgJiYgdGVzdEluZm8ubU51bVRlc3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0TGlzdGVuZXIudGVzdFJ1blN0YXJ0ZWQodGVzdEluZm8ubU51bVRlc3RzKTsKLSAgICAgICAgICAgIG1UZXN0U3RhcnRSZXBvcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGN1cnJlbnQgZmFpbGVkIHRlc3QsIGZyb20gdGhlIHByb3ZpZGVkIHRlc3RJbmZvLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFRyYWNlKFRlc3RSZXN1bHQgdGVzdEluZm8pIHsKLSAgICAgICAgaWYgKHRlc3RJbmZvLm1TdGFja1RyYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0SW5mby5tU3RhY2tUcmFjZTsgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQ291bGQgbm90IGZpbmQgc3RhY2sgdHJhY2UgZm9yIGZhaWxlZCB0ZXN0ICIpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJvd2FibGUoIlVua25vd24gZmFpbHVyZSIpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIG91dCBhbmQgc3RvcmUgdGhlIGVsYXBzZWQgdGltZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VUaW1lKFN0cmluZyBsaW5lLCBpbnQgc3RhcnRQb3MpIHsKLSAgICAgICAgU3RyaW5nIHRpbWVTdHJpbmcgPSBsaW5lLnN1YnN0cmluZyhzdGFydFBvcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbG9hdCB0aW1lU2Vjb25kcyA9IEZsb2F0LnBhcnNlRmxvYXQodGltZVN0cmluZyk7Ci0gICAgICAgICAgICBtVGVzdFRpbWUgPSAobG9uZykgKHRpbWVTZWNvbmRzICogMTAwMCk7IAotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuZXhwZWN0ZWQgdGltZSBmb3JtYXQgIiArIHRpbWVTdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBpbnN0cnVtZW50YXRpb24gcnVuIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGVzdFJ1bkZhaWxlZChTdHJpbmcgZXJyb3JNc2cpIHsKLSAgICAgICAgbVRlc3RMaXN0ZW5lci50ZXN0UnVuRmFpbGVkKGVycm9yTXNnID09IG51bGwgPyAiVW5rbm93biBlcnJvciIgOiBlcnJvck1zZyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBwYXJlbnQgd2hlbiBhZGIgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgc3VwZXIuZG9uZSgpOwotICAgICAgICBtVGVzdExpc3RlbmVyLnRlc3RSdW5FbmRlZChtVGVzdFRpbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL1JlbW90ZUFuZHJvaWRUZXN0UnVubmVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQxZDE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL1JlbW90ZUFuZHJvaWRUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXI7Ci0KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIFJ1bnMgYSBBbmRyb2lkIHRlc3QgY29tbWFuZCByZW1vdGVseSBhbmQgcmVwb3J0cyByZXN1bHRzLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIgIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsICBTdHJpbmcgbVJ1bm5lck5hbWU7Ci0gICAgcHJpdmF0ZSBJRGV2aWNlIG1SZW1vdGVEZXZpY2U7Ci0gICAgLyoqIG1hcCBvZiBuYW1lLXZhbHVlIGluc3RydW1lbnRhdGlvbiBhcmd1bWVudCBwYWlycyAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtQXJnTWFwOwotICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyIG1QYXJzZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSZW1vdGVBbmRyb2lkVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOTkVSX05BTUUgPSAiYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDTEFTU19TRVBBUkFUT1IgPSAnLCc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBNRVRIT0RfU0VQQVJBVE9SID0gJyMnOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlVOTkVSX1NFUEFSQVRPUiA9ICcvJzsKLQotICAgIC8vIGRlZmluZWQgaW5zdHJ1bWVudGF0aW9uIGFyZ3VtZW50IG5hbWVzICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVJHX05BTUUgPSAiY2xhc3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfQVJHX05BTUUgPSAibG9nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfQVJHX05BTUUgPSAiZGVidWciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1ZFUkFHRV9BUkdfTkFNRSA9ICJjb3ZlcmFnZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfQVJHX05BTUUgPSAicGFja2FnZSI7Ci0gCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBBbmRyb2lkIHRlc3QgcnVubmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgQW5kcm9pZCBhcHBsaWNhdGlvbiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHRlc3RzIHRvIHJ1biAKLSAgICAgKiBAcGFyYW0gcnVubmVyTmFtZSB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVubmVyIHRvIGV4ZWN1dGUuIElmIG51bGwsIHdpbGwgdXNlIGRlZmF1bHQKLSAgICAgKiAgIHJ1bm5lciAKLSAgICAgKiBAcGFyYW0gcmVtb3RlRGV2aWNlIHRoZSBBbmRyb2lkIGRldmljZSB0byBleGVjdXRlIHRlc3RzIG9uCi0gICAgICovCi0gICAgcHVibGljIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKFN0cmluZyBwYWNrYWdlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBydW5uZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGV2aWNlIHJlbW90ZURldmljZSkgewotICAgICAgICAKLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1SdW5uZXJOYW1lID0gcnVubmVyTmFtZTsKLSAgICAgICAgbVJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgICAgbUFyZ01hcCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yLiBVc2VzIGRlZmF1bHQgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIEFuZHJvaWQgYXBwbGljYXRpb24gcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSB0ZXN0cyB0byBydW4gCi0gICAgICogQHBhcmFtIHJlbW90ZURldmljZSB0aGUgQW5kcm9pZCBkZXZpY2UgdG8gZXhlY3V0ZSB0ZXN0cyBvbgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcihTdHJpbmcgcGFja2FnZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGV2aWNlIHJlbW90ZURldmljZSkgewotICAgICAgICB0aGlzKHBhY2thZ2VOYW1lLCBudWxsLCByZW1vdGVEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJ1bm5lck5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSdW5uZXJOYW1lKCkgewotICAgICAgICBpZiAobVJ1bm5lck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfUlVOTkVSX05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1SdW5uZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbXBsZXRlIGluc3RydW1lbnRhdGlvbiBjb21wb25lbnQgcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSdW5uZXJQYXRoKCkgewotICAgICAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWUoKSArIFJVTk5FUl9TRVBBUkFUT1IgKyBnZXRSdW5uZXJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0byBydW4gb25seSB0ZXN0cyBpbiB0aGlzIGNsYXNzCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlICdydW4nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgKGVnIHgueS56KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkFyZyhDTEFTU19BUkdfTkFNRSwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHJ1biBvbmx5IHRlc3RzIGluIHRoZSBwcm92aWRlZCBjbGFzc2VzCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlICdydW4nLgotICAgICAqIDxwPgotICAgICAqIElmIHByb3ZpZGluZyBtb3JlIHRoYW4gb25lIGNsYXNzLCByZXF1aXJlcyBhIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdGhhdCBzdXBwb3J0cyAKLSAgICAgKiB0aGUgbXVsdGlwbGUgY2xhc3MgYXJndW1lbnQgc3ludGF4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWVzIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyAoZWcgeC55LnopCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lcyhTdHJpbmdbXSBjbGFzc05hbWVzKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NBcmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgIGNsYXNzQXJnQnVpbGRlci5hcHBlbmQoQ0xBU1NfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXNzQXJnQnVpbGRlci5hcHBlbmQoY2xhc3NOYW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q2xhc3NOYW1lKGNsYXNzQXJnQnVpbGRlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHJ1biBvbmx5IHNwZWNpZmllZCB0ZXN0IG1ldGhvZAotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSAncnVuJy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIChlZyB4LnkueikKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbWV0aG9kIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzZXRDbGFzc05hbWUoY2xhc3NOYW1lICsgTUVUSE9EX1NFUEFSQVRPUiArIHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRvIHJ1biBhbGwgdGVzdHMgaW4gc3BlY2lmaWVkIHBhY2thZ2UKLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgJ3J1bicuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgKGVnIHgueS56KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uQXJnKFBBQ0tBR0VfQVJHX05BTUUsIHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgYXJndW1lbnQgdG8gaW5jbHVkZSBpbiBpbnN0cnVtZW50YXRpb24gY29tbWFuZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlICdydW4nLiBJZiBhbiBhcmd1bWVudCB3aXRoIGdpdmVuIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZCwgaXQncwotICAgICAqIHZhbHVlIHdpbGwgYmUgb3ZlcnJpZGRlbi4gCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBidW5kbGUgYXJndW1lbnQKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEluc3RydW1lbnRhdGlvbkFyZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBvciB2YWx1ZSBhcmd1bWVudHMgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQXJnTWFwLnB1dChuYW1lLCB2YWx1ZSk7ICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgYm9vbGVhbiBhcmd1bWVudCB0byBpbmNsdWRlIGluIGluc3RydW1lbnRhdGlvbiBjb21tYW5kLgotICAgICAqIDxwLz4KLSAgICAgKiBAc2VlIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyI2FkZEluc3RydW1lbnRhdGlvbkFyZwotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gYnVuZGxlIGFyZ3VtZW50Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRCb29sZWFuQXJnKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkFyZyhuYW1lLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgfQotICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgdGVzdCBydW4gdG8gbG9nIG9ubHkgbW9kZSAtIHNraXBzIHRlc3QgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvZ09ubHkoYm9vbGVhbiBsb2dPbmx5KSB7Ci0gICAgICAgIGFkZEJvb2xlYW5BcmcoTE9HX0FSR19OQU1FLCBsb2dPbmx5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgZGVidWcgbW9kZSBvZiB0aGlzIHRlc3QgcnVuLiBJZiB0cnVlLCB0aGUgQW5kcm9pZCB0ZXN0IHJ1bm5lciB3aWxsIHdhaXQgZm9yIGEgCi0gICAgICogZGVidWdnZXIgdG8gYXR0YWNoIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGVzdCBleGVjdXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgewotICAgICAgICBhZGRCb29sZWFuQXJnKERFQlVHX0FSR19OQU1FLCBkZWJ1Zyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIGNvZGUgY292ZXJhZ2UgbW9kZSBvZiB0aGlzIHRlc3QgcnVuLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3ZlcmFnZShib29sZWFuIGNvdmVyYWdlKSB7Ci0gICAgICAgIGFkZEJvb2xlYW5BcmcoQ09WRVJBR0VfQVJHX05BTUUsIGNvdmVyYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoaXMgdGVzdCBydW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGxpc3RlbnMgZm9yIHRlc3QgcmVzdWx0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBydW5DYXNlQ29tbWFuZFN0ciA9IFN0cmluZy5mb3JtYXQoImFtIGluc3RydW1lbnQgLXcgLXIgJXMgJXMiLAotICAgICAgICAgICAgZ2V0QXJnc0NvbW1hbmQoKSwgZ2V0UnVubmVyUGF0aCgpKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgcnVuQ2FzZUNvbW1hbmRTdHIpOwotICAgICAgICBtUGFyc2VyID0gbmV3IEluc3RydW1lbnRhdGlvblJlc3VsdFBhcnNlcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1SZW1vdGVEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChydW5DYXNlQ29tbWFuZFN0ciwgbVBhcnNlcik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIGUpOwotICAgICAgICAgICAgbGlzdGVuZXIudGVzdFJ1bkZhaWxlZChlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdHMgY2FuY2VsbGF0aW9uIG9mIHRoaXMgdGVzdCBydW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBpZiAobVBhcnNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGFyc2VyLmNhbmNlbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbCBpbnN0cnVtZW50YXRpb24gY29tbWFuZCBsaW5lIHN5bnRheCBmb3IgdGhlIHByb3ZpZGVkIGluc3RydW1lbnRhdGlvbiAKLSAgICAgKiBhcmd1bWVudHMuICAKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBubyBhcmd1bWVudHMgd2VyZSBzcGVjaWZpZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXJnc0NvbW1hbmQoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY29tbWFuZEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBhcmdQYWlyIDogbUFyZ01hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnQ21kID0gU3RyaW5nLmZvcm1hdCgiIC1lICVzICVzIiwgYXJnUGFpci5nZXRLZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgYXJnUGFpci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZChhcmdDbWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21tYW5kQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL1Rlc3RJZGVudGlmaWVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9UZXN0SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNiMTA4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi90ZXN0cnVubmVyL1Rlc3RJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lcjsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgcGFyc2VkIGluc3RydW1lbnRhdGlvbiB0ZXN0IAotICovCi1wdWJsaWMgY2xhc3MgVGVzdElkZW50aWZpZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVGVzdE5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRlc3QgaWRlbnRpZmllcgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0LiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdElkZW50aWZpZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCB0ZXN0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjbGFzc05hbWUgYW5kIHRlc3ROYW1lIG11c3QgIiArIAotICAgICAgICAgICAgICAgICAgICAiYmUgbm9uLW51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICBtVGVzdE5hbWUgPSB0ZXN0TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdE5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGVxdWFsaXR5IGJ5IGNvbXBhcmluZyBjbGFzcyBhbmQgbWV0aG9kIG5hbWUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVGVzdElkZW50aWZpZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdElkZW50aWZpZXIgb3RoZXJUZXN0ID0gKFRlc3RJZGVudGlmaWVyKW90aGVyOwotICAgICAgICByZXR1cm4gZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKG90aGVyVGVzdC5nZXRDbGFzc05hbWUoKSkgICYmIAotICAgICAgICAgICAgICAgIGdldFRlc3ROYW1lKCkuZXF1YWxzKG90aGVyVGVzdC5nZXRUZXN0TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGhhc2hDb2RlIGJhc2VkIG9uIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3NOYW1lKCkuaGFzaENvZGUoKSAqIDMxICsgZ2V0VGVzdE5hbWUoKS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi91dGlscy9BcnJheUhlbHBlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL3V0aWxzL0FycmF5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjdlNWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL3V0aWxzL0FycmF5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWIudXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgYXJyYXkgdG8gaW50L2xvbmcgY29udmVyc2lvbiBmb3IgZGF0YSByZWNlaXZlZCBmcm9tIGRldmljZXMgdGhyb3VnaCBhZGIuIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlIZWxwZXIgewotCi0gICAgLyoqCi0gICAgICogU3dhcHMgYW4gdW5zaWduZWQgdmFsdWUgYXJvdW5kLCBhbmQgcHV0cyB0aGUgcmVzdWx0IGluIGFuIGFycmF5IHRoYXQgY2FuIGJlIHNlbnQgdG8gYSBkZXZpY2UuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzd2FwLgotICAgICAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkgd2hlcmUgdG8gcHV0IHRoZSBzd2FwcGVkIHZhbHVlLgotICAgICAqICAgICAgQXJyYXkgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3Qgb2Zmc2V0ICsgNAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzd2FwMzJiaXRzVG9BcnJheShpbnQgdmFsdWUsIGJ5dGVbXSBkZXN0LCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGRlc3Rbb2Zmc2V0XSA9IChieXRlKSh2YWx1ZSAmIDB4MDAwMDAwRkYpOwotICAgICAgICBkZXN0W29mZnNldCArIDFdID0gKGJ5dGUpKCh2YWx1ZSAmIDB4MDAwMEZGMDApID4+IDgpOwotICAgICAgICBkZXN0W29mZnNldCArIDJdID0gKGJ5dGUpKCh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgICAgICAgZGVzdFtvZmZzZXQgKyAzXSA9IChieXRlKSgodmFsdWUgJiAweEZGMDAwMDAwKSA+PiAyNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZnJvbSBhbiBhcnJheSBjb21pbmcgZnJvbSBhIGRldmljZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGludAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkgYXQgd2hpY2ggdGhlIGludCBzdGFydHMKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHJlYWQgZnJvbSB0aGUgYXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBzd2FwMzJiaXRGcm9tQXJyYXkoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGludCB2ID0gMDsKLSAgICAgICAgdiB8PSAoKGludCl2YWx1ZVtvZmZzZXRdKSAmIDB4MDAwMDAwRkY7Ci0gICAgICAgIHYgfD0gKCgoaW50KXZhbHVlW29mZnNldCArIDFdKSAmIDB4MDAwMDAwRkYpIDw8IDg7Ci0gICAgICAgIHYgfD0gKCgoaW50KXZhbHVlW29mZnNldCArIDJdKSAmIDB4MDAwMDAwRkYpIDw8IDE2OwotICAgICAgICB2IHw9ICgoKGludCl2YWx1ZVtvZmZzZXQgKyAzXSkgJiAweDAwMDAwMEZGKSA8PCAyNDsKLQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW4gdW5zaWduZWQgMTYgYml0IGludGVnZXIgZnJvbSBhbiBhcnJheSBjb21pbmcgZnJvbSBhIGRldmljZSwKLSAgICAgKiBhbmQgcmV0dXJucyBpdCBhcyBhbiAnaW50JwotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgMTYgYml0IGludCAoMiBieXRlKS4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5IGF0IHdoaWNoIHRoZSBpbnQgc3RhcnRzCi0gICAgICogICAgICBBcnJheSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCBvZmZzZXQgKyAyCi0gICAgICogQHJldHVybiB0aGUgaW50ZWdlciByZWFkIGZyb20gdGhlIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHN3YXBVMTZiaXRGcm9tQXJyYXkoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGludCB2ID0gMDsKLSAgICAgICAgdiB8PSAoKGludCl2YWx1ZVtvZmZzZXRdKSAmIDB4MDAwMDAwRkY7Ci0gICAgICAgIHYgfD0gKCgoaW50KXZhbHVlW29mZnNldCArIDFdKSAmIDB4MDAwMDAwRkYpIDw8IDg7Ci0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlYWRzIGEgc2lnbmVkIDY0IGJpdCBpbnRlZ2VyIGZyb20gYW4gYXJyYXkgY29taW5nIGZyb20gYSBkZXZpY2UuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBpbnQKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5IGF0IHdoaWNoIHRoZSBpbnQgc3RhcnRzCi0gICAgICogICAgICBBcnJheSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCBvZmZzZXQgKyA4Ci0gICAgICogQHJldHVybiB0aGUgaW50ZWdlciByZWFkIGZyb20gdGhlIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBsb25nIHN3YXA2NGJpdEZyb21BcnJheShieXRlW10gdmFsdWUsIGludCBvZmZzZXQpIHsKLSAgICAgICAgbG9uZyB2ID0gMDsKLSAgICAgICAgdiB8PSAoKGxvbmcpdmFsdWVbb2Zmc2V0XSkgJiAweDAwMDAwMDAwMDAwMDAwRkZMOwotICAgICAgICB2IHw9ICgoKGxvbmcpdmFsdWVbb2Zmc2V0ICsgMV0pICYgMHgwMDAwMDAwMDAwMDAwMEZGTCkgPDwgODsKLSAgICAgICAgdiB8PSAoKChsb25nKXZhbHVlW29mZnNldCArIDJdKSAmIDB4MDAwMDAwMDAwMDAwMDBGRkwpIDw8IDE2OwotICAgICAgICB2IHw9ICgoKGxvbmcpdmFsdWVbb2Zmc2V0ICsgM10pICYgMHgwMDAwMDAwMDAwMDAwMEZGTCkgPDwgMjQ7Ci0gICAgICAgIHYgfD0gKCgobG9uZyl2YWx1ZVtvZmZzZXQgKyA0XSkgJiAweDAwMDAwMDAwMDAwMDAwRkZMKSA8PCAzMjsKLSAgICAgICAgdiB8PSAoKChsb25nKXZhbHVlW29mZnNldCArIDVdKSAmIDB4MDAwMDAwMDAwMDAwMDBGRkwpIDw8IDQwOwotICAgICAgICB2IHw9ICgoKGxvbmcpdmFsdWVbb2Zmc2V0ICsgNl0pICYgMHgwMDAwMDAwMDAwMDAwMEZGTCkgPDwgNDg7Ci0gICAgICAgIHYgfD0gKCgobG9uZyl2YWx1ZVtvZmZzZXQgKyA3XSkgJiAweDAwMDAwMDAwMDAwMDAwRkZMKSA8PCA1NjsKLQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9JbnN0cnVtZW50YXRpb25SZXN1bHRQYXJzZXJUZXN0LmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9JbnN0cnVtZW50YXRpb25SZXN1bHRQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDJkZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvZGRtbGliL3Rlc3RydW5uZXIvSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KLS8qKgotICogVGVzdHMgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyIG1QYXJzZXI7Ci0gICAgcHJpdmF0ZSBWZXJpZnlpbmdUZXN0UmVzdWx0IG1UZXN0UmVzdWx0OwotCi0gICAgLy8gc3RhdGljIGR1bW15IHRlc3QgbmFtZXMgdG8gdXNlIGZvciB2YWxpZGF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiY29tLnRlc3QuRm9vVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0Rm9vIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0tfVFJBQ0UgPSAiamF2YS5sYW5nLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSAtIHRlc3QgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBJbnN0cnVtZW50YXRpb25SZXN1bHRQYXJzZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtVGVzdFJlc3VsdCA9IG5ldyBWZXJpZnlpbmdUZXN0UmVzdWx0KCk7Ci0gICAgICAgIG1QYXJzZXIgPSBuZXcgSW5zdHJ1bWVudGF0aW9uUmVzdWx0UGFyc2VyKG1UZXN0UmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB0ZXN0IHJ1biBzdGFydGVkIGFuZCB0ZXN0IHN0YXJ0IGV2ZW50cyBpcyBzZW50IG9uIGZpcnN0Ci0gICAgICogYnVuZGxlIHJlY2VpdmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RhcnRlZCgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBidWlsZENvbW1vblJlc3VsdCgpOwotICAgICAgICBhZGRTdGFydENvZGUob3V0cHV0KTsKLQotICAgICAgICBpbmplY3RUZXN0U3RyaW5nKG91dHB1dC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0Q29tbW9uQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RSZXN1bHQubU51bVRlc3RzUnVuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgc2luZ2xlIHN1Y2Nlc3NmdWwgdGVzdCBleGVjdXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdWNjZXNzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IGJ1aWxkQ29tbW9uUmVzdWx0KCk7Ci0gICAgICAgIGFkZFN0YXJ0Q29kZShvdXRwdXQpOwotICAgICAgICBhZGRDb21tb25TdGF0dXMob3V0cHV0KTsKLSAgICAgICAgYWRkU3VjY2Vzc0NvZGUob3V0cHV0KTsKLQotICAgICAgICBpbmplY3RUZXN0U3RyaW5nKG91dHB1dC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0Q29tbW9uQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RSZXN1bHQubU51bVRlc3RzUnVuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG1UZXN0UmVzdWx0Lm1UZXN0U3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGJhc2ljIHBhcnNpbmcgb2YgZmFpbGVkIHRlc3QgY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEZhaWxlZCgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBidWlsZENvbW1vblJlc3VsdCgpOwotICAgICAgICBhZGRTdGFydENvZGUob3V0cHV0KTsKLSAgICAgICAgYWRkQ29tbW9uU3RhdHVzKG91dHB1dCk7Ci0gICAgICAgIGFkZFN0YWNrVHJhY2Uob3V0cHV0KTsKLSAgICAgICAgYWRkRmFpbHVyZUNvZGUob3V0cHV0KTsKLQotICAgICAgICBpbmplY3RUZXN0U3RyaW5nKG91dHB1dC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0Q29tbW9uQXR0cmlidXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFJlc3VsdC5tTnVtVGVzdHNSdW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoSVRlc3RSdW5MaXN0ZW5lci5UZXN0RmFpbHVyZS5GQUlMVVJFLCBtVGVzdFJlc3VsdC5tVGVzdFN0YXR1cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTVEFDS19UUkFDRSwgbVRlc3RSZXN1bHQubVRyYWNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBiYXNpYyBwYXJzaW5nIGFuZCBjb252ZXJzaW9uIG9mIHRpbWUgZnJvbSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRpbWVQYXJzaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgdGltZVN0cmluZyA9ICJUaW1lOiA0LjkiOwotICAgICAgICBpbmplY3RUZXN0U3RyaW5nKHRpbWVTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNDkwMCwgbVRlc3RSZXN1bHQubVRlc3RUaW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBiYXNpYyBwYXJzaW5nIG9mIGEgdGVzdCBydW4gZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7ICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJVbmFibGUgdG8gZmluZCBpbnN0cnVtZW50YXRpb24gaW5mbyI7Ci0gICAgICAgIGFkZFN0YXR1c0tleShvdXRwdXQsICJFcnJvciIsIGVycm9yTWVzc2FnZSk7Ci0gICAgICAgIGFkZFN0YXR1c0NvZGUob3V0cHV0LCAiLTEiKTsKLSAgICAgICAgb3V0cHV0LmFwcGVuZCgiSU5TVFJVTUVOVEFUSU9OX0ZBSUxFRDogY29tLmR1bW15L2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIik7Ci0gICAgICAgIGFkZExpbmVCcmVhayhvdXRwdXQpOwotICAgICAgICAKLSAgICAgICAgaW5qZWN0VGVzdFN0cmluZyhvdXRwdXQudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlLCBtVGVzdFJlc3VsdC5tUnVuRmFpbGVkTWVzc2FnZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgcGFyc2luZyBvZiBhIHRlc3QgcnVuIGZhaWx1cmUsIHdoZXJlIGFuIGluc3RydW1lbnRhdGlvbiBjb21wb25lbnQgZmFpbGVkIHRvIGxvYWQKLSAgICAgKiBQYXJzaW5nIGlucHV0IHRha2VzIHRoZSBmcm9tIG9mIElOU1RSVU1FTlRBVElPTl9SRVNVTFQ6IGZmZgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GYWlsZWRSZXN1bHQoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsgICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBpbnN0cnVtZW50YXRpb24iOwotICAgICAgICBvdXRwdXQuYXBwZW5kKCJJTlNUUlVNRU5UQVRJT05fUkVTVUxUOiBzaG9ydE1zZz0iKTsKLSAgICAgICAgb3V0cHV0LmFwcGVuZChlcnJvck1lc3NhZ2UpOwotICAgICAgICBhZGRMaW5lQnJlYWsob3V0cHV0KTsKLSAgICAgICAgb3V0cHV0LmFwcGVuZCgiSU5TVFJVTUVOVEFUSU9OX0NPREU6IDAiKTsKLSAgICAgICAgYWRkTGluZUJyZWFrKG91dHB1dCk7Ci0gICAgICAgIAotICAgICAgICBpbmplY3RUZXN0U3RyaW5nKG91dHB1dC50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhlcnJvck1lc3NhZ2UsIG1UZXN0UmVzdWx0Lm1SdW5GYWlsZWRNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBjb21tb24gdGVzdCByZXN1bHQgdXNpbmcgVEVTVF9OQU1FIGFuZCBURVNUX0NMQVNTLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBidWlsZENvbW1vblJlc3VsdCgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAvLyBhZGQgdGVzdCBzdGFydCBidW5kbGUKLSAgICAgICAgYWRkQ29tbW9uU3RhdHVzKG91dHB1dCk7Ci0gICAgICAgIGFkZFN0YXR1c0NvZGUob3V0cHV0LCAiMSIpOwotICAgICAgICAvLyBhZGQgZW5kIHRlc3QgYnVuZGxlLCB3aXRob3V0IHN0YXR1cwotICAgICAgICBhZGRDb21tb25TdGF0dXMob3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGNvbW1vbiBzdGF0dXMgcmVzdWx0cyB0byB0aGUgcHJvdmlkZWQgb3V0cHV0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRDb21tb25TdGF0dXMoU3RyaW5nQnVpbGRlciBvdXRwdXQpIHsKLSAgICAgICAgYWRkU3RhdHVzS2V5KG91dHB1dCwgInN0cmVhbSIsICJcclxuIiArIENMQVNTX05BTUUpOwotICAgICAgICBhZGRTdGF0dXNLZXkob3V0cHV0LCAidGVzdCIsIFRFU1RfTkFNRSk7Ci0gICAgICAgIGFkZFN0YXR1c0tleShvdXRwdXQsICJjbGFzcyIsIENMQVNTX05BTUUpOwotICAgICAgICBhZGRTdGF0dXNLZXkob3V0cHV0LCAiY3VycmVudCIsICIxIik7Ci0gICAgICAgIGFkZFN0YXR1c0tleShvdXRwdXQsICJudW10ZXN0cyIsICIxIik7Ci0gICAgICAgIGFkZFN0YXR1c0tleShvdXRwdXQsICJpZCIsICJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHN0YWNrIHRyYWNlIHN0YXR1cyBidW5kbGUgdG8gb3V0cHV0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRTdGFja1RyYWNlKFN0cmluZ0J1aWxkZXIgb3V0cHV0KSB7Ci0gICAgICAgIGFkZFN0YXR1c0tleShvdXRwdXQsICJzdGFjayIsIFNUQUNLX1RSQUNFKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIGEgc3RhdHVzIGtleS12YWx1ZSBidW5kbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN0YXR1c0tleShTdHJpbmdCdWlsZGVyIG91dHB1dEJ1aWxkZXIsIFN0cmluZyBrZXksCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgb3V0cHV0QnVpbGRlci5hcHBlbmQoIklOU1RSVU1FTlRBVElPTl9TVEFUVVM6ICIpOwotICAgICAgICBvdXRwdXRCdWlsZGVyLmFwcGVuZChrZXkpOwotICAgICAgICBvdXRwdXRCdWlsZGVyLmFwcGVuZCgnPScpOwotICAgICAgICBvdXRwdXRCdWlsZGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIGFkZExpbmVCcmVhayhvdXRwdXRCdWlsZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgbGluZSBicmVhayBjaGFyYWN0ZXJzIHRvIG91dHB1dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRMaW5lQnJlYWsoU3RyaW5nQnVpbGRlciBvdXRwdXRCdWlsZGVyKSB7Ci0gICAgICAgIG91dHB1dEJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN0YXJ0Q29kZShTdHJpbmdCdWlsZGVyIG91dHB1dEJ1aWxkZXIpIHsKLSAgICAgICAgYWRkU3RhdHVzQ29kZShvdXRwdXRCdWlsZGVyLCAiMSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRTdWNjZXNzQ29kZShTdHJpbmdCdWlsZGVyIG91dHB1dEJ1aWxkZXIpIHsKLSAgICAgICAgYWRkU3RhdHVzQ29kZShvdXRwdXRCdWlsZGVyLCAiMCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRGYWlsdXJlQ29kZShTdHJpbmdCdWlsZGVyIG91dHB1dEJ1aWxkZXIpIHsKLSAgICAgICAgYWRkU3RhdHVzQ29kZShvdXRwdXRCdWlsZGVyLCAiLTIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkU3RhdHVzQ29kZShTdHJpbmdCdWlsZGVyIG91dHB1dEJ1aWxkZXIsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBvdXRwdXRCdWlsZGVyLmFwcGVuZCgiSU5TVFJVTUVOVEFUSU9OX1NUQVRVU19DT0RFOiAiKTsKLSAgICAgICAgb3V0cHV0QnVpbGRlci5hcHBlbmQodmFsdWUpOwotICAgICAgICBhZGRMaW5lQnJlYWsob3V0cHV0QnVpbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5qZWN0IGEgdGVzdCBzdHJpbmcgaW50byB0aGUgcmVzdWx0IHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluamVjdFRlc3RTdHJpbmcoU3RyaW5nIHJlc3VsdCkgewotICAgICAgICBieXRlW10gZGF0YSA9IHJlc3VsdC5nZXRCeXRlcygpOwotICAgICAgICBtUGFyc2VyLmFkZE91dHB1dChkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIG1QYXJzZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q29tbW9uQXR0cmlidXRlcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUsIG1UZXN0UmVzdWx0Lm1TdWl0ZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RSZXN1bHQubVRlc3RDb3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIG1UZXN0UmVzdWx0Lm1UZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBzcGVjaWFsaXplZCB0ZXN0IGxpc3RlbmVyIHRoYXQgc3RvcmVzIGEgc2luZ2xlIHRlc3QgZXZlbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVmVyaWZ5aW5nVGVzdFJlc3VsdCBpbXBsZW1lbnRzIElUZXN0UnVuTGlzdGVuZXIgewotCi0gICAgICAgIFN0cmluZyBtU3VpdGVOYW1lOwotICAgICAgICBpbnQgbVRlc3RDb3VudDsKLSAgICAgICAgaW50IG1OdW1UZXN0c1J1bjsKLSAgICAgICAgU3RyaW5nIG1UZXN0TmFtZTsKLSAgICAgICAgbG9uZyBtVGVzdFRpbWU7Ci0gICAgICAgIFRlc3RGYWlsdXJlIG1UZXN0U3RhdHVzOwotICAgICAgICBTdHJpbmcgbVRyYWNlOwotICAgICAgICBib29sZWFuIG1TdG9wcGVkOwotICAgICAgICAvKiogc3RvcmVzIHRoZSBlcnJvciBtZXNzYWdlIHByb3ZpZGVkIHRvIHRlc3RSdW5GYWlsZWQgKi8KLSAgICAgICAgU3RyaW5nIG1SdW5GYWlsZWRNZXNzYWdlOwotCi0gICAgICAgIFZlcmlmeWluZ1Rlc3RSZXN1bHQoKSB7Ci0gICAgICAgICAgICBtTnVtVGVzdHNSdW4gPSAwOwotICAgICAgICAgICAgbVRlc3RTdGF0dXMgPSBudWxsOwotICAgICAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1SdW5GYWlsZWRNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgICAgICBtTnVtVGVzdHNSdW4rKzsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjbGFzcyBuYW1lIiwgbVN1aXRlTmFtZSwgdGVzdC5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGVzdCBlbmRlZCIsIG1UZXN0TmFtZSwgdGVzdC5nZXRUZXN0TmFtZSgpKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0RmFpbHVyZSBzdGF0dXMsIFRlc3RJZGVudGlmaWVyIHRlc3QsIFN0cmluZyB0cmFjZSkgewotICAgICAgICAgICAgbVRlc3RTdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgICAgICBtVHJhY2UgPSB0cmFjZTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjbGFzcyBuYW1lIiwgbVN1aXRlTmFtZSwgdGVzdC5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGVzdCBlbmRlZCIsIG1UZXN0TmFtZSwgdGVzdC5nZXRUZXN0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lKSB7Ci0gICAgICAgICAgICBtVGVzdFRpbWUgPSBlbGFwc2VkVGltZTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoaW50IHRlc3RDb3VudCkgewotICAgICAgICAgICAgbVRlc3RDb3VudCA9IHRlc3RDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdG9wcGVkKGxvbmcgZWxhcHNlZFRpbWUpIHsKLSAgICAgICAgICAgIG1UZXN0VGltZSA9IGVsYXBzZWRUaW1lOwotICAgICAgICAgICAgbVN0b3BwZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0ZWQoVGVzdElkZW50aWZpZXIgdGVzdCkgewotICAgICAgICAgICAgbVN1aXRlTmFtZSA9IHRlc3QuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBtVGVzdE5hbWUgPSB0ZXN0LmdldFRlc3ROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgICAgIG1SdW5GYWlsZWRNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvZGRtbGliL3Rlc3RydW5uZXIvUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXJUZXN0LmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjllYzlmZS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvdGVzdHJ1bm5lci9SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkZpbGVMaXN0aW5nU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlJhd0ltYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciBtUnVubmVyOwotICAgIHByaXZhdGUgTW9ja0RldmljZSBtTW9ja0RldmljZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0UgPSAiY29tLnRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JVTk5FUiA9ICJjb20udGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtTW9ja0RldmljZSA9IG5ldyBNb2NrRGV2aWNlKCk7Ci0gICAgICAgIG1SdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIoVEVTVF9QQUNLQUdFLCBURVNUX1JVTk5FUiwgbU1vY2tEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGJhc2ljIGNhc2UgYnVpbGRpbmcgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBydW5uZXIgY29tbWFuZCB3aXRoIG5vIGFyZ3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgewotICAgICAgICBtUnVubmVyLnJ1bihuZXcgRW1wdHlMaXN0ZW5lcigpKTsKLSAgICAgICAgYXNzZXJ0U3RyaW5nc0VxdWFscyhTdHJpbmcuZm9ybWF0KCJhbSBpbnN0cnVtZW50IC13IC1yICVzLyVzIiwgVEVTVF9QQUNLQUdFLCBURVNUX1JVTk5FUiksCi0gICAgICAgICAgICAgICAgbU1vY2tEZXZpY2UuZ2V0TGFzdFNoZWxsQ29tbWFuZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBidWlsZGluZyBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lciBjb21tYW5kIHdpdGggbG9nIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuV2l0aExvZygpIHsKLSAgICAgICAgbVJ1bm5lci5zZXRMb2dPbmx5KHRydWUpOwotICAgICAgICBtUnVubmVyLnJ1bihuZXcgRW1wdHlMaXN0ZW5lcigpKTsKLSAgICAgICAgYXNzZXJ0U3RyaW5nc0VxdWFscyhTdHJpbmcuZm9ybWF0KCJhbSBpbnN0cnVtZW50IC13IC1yIC1lIGxvZyB0cnVlICVzLyVzIiwgVEVTVF9QQUNLQUdFLAotICAgICAgICAgICAgICAgIFRFU1RfUlVOTkVSKSwgbU1vY2tEZXZpY2UuZ2V0TGFzdFNoZWxsQ29tbWFuZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBidWlsZGluZyBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lciBjb21tYW5kIHdpdGggbWV0aG9kIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuV2l0aE1ldGhvZCgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9ICJGb29UZXN0IjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lID0gImZvb1Rlc3QiOwotICAgICAgICBtUnVubmVyLnNldE1ldGhvZE5hbWUoY2xhc3NOYW1lLCB0ZXN0TmFtZSk7Ci0gICAgICAgIG1SdW5uZXIucnVuKG5ldyBFbXB0eUxpc3RlbmVyKCkpOwotICAgICAgICBhc3NlcnRTdHJpbmdzRXF1YWxzKFN0cmluZy5mb3JtYXQoImFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJXMjJXMgJXMvJXMiLCBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgdGVzdE5hbWUsIFRFU1RfUEFDS0FHRSwgVEVTVF9SVU5ORVIpLCBtTW9ja0RldmljZS5nZXRMYXN0U2hlbGxDb21tYW5kKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGJ1aWxkaW5nIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gcnVubmVyIGNvbW1hbmQgd2l0aCB0ZXN0IHBhY2thZ2Ugc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5XaXRoUGFja2FnZSgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gImZvby50ZXN0IjsKLSAgICAgICAgbVJ1bm5lci5zZXRUZXN0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotICAgICAgICBtUnVubmVyLnJ1bihuZXcgRW1wdHlMaXN0ZW5lcigpKTsKLSAgICAgICAgYXNzZXJ0U3RyaW5nc0VxdWFscyhTdHJpbmcuZm9ybWF0KCJhbSBpbnN0cnVtZW50IC13IC1yIC1lIHBhY2thZ2UgJXMgJXMvJXMiLCBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBURVNUX1BBQ0tBR0UsIFRFU1RfUlVOTkVSKSwgbU1vY2tEZXZpY2UuZ2V0TGFzdFNoZWxsQ29tbWFuZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBidWlsZGluZyBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lciBjb21tYW5kIHdpdGggZXh0cmEgYXJndW1lbnQgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1bldpdGhBZGRJbnN0cnVtZW50YXRpb25BcmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHRyYUFyZ05hbWUgPSAiYmxhaCI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHRyYUFyZ1ZhbHVlID0gImJsYWhWYWx1ZSI7Ci0gICAgICAgIG1SdW5uZXIuYWRkSW5zdHJ1bWVudGF0aW9uQXJnKGV4dHJhQXJnTmFtZSwgZXh0cmFBcmdWYWx1ZSk7Ci0gICAgICAgIG1SdW5uZXIucnVuKG5ldyBFbXB0eUxpc3RlbmVyKCkpOwotICAgICAgICBhc3NlcnRTdHJpbmdzRXF1YWxzKFN0cmluZy5mb3JtYXQoImFtIGluc3RydW1lbnQgLXcgLXIgLWUgJXMgJXMgJXMvJXMiLCBleHRyYUFyZ05hbWUsCi0gICAgICAgICAgICAgICAgZXh0cmFBcmdWYWx1ZSwgVEVTVF9QQUNLQUdFLCBURVNUX1JVTk5FUiksIG1Nb2NrRGV2aWNlLmdldExhc3RTaGVsbENvbW1hbmQoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgdHdvIHN0cmluZ3MgYXJlIGVxdWFsIGlnbm9yaW5nIHdoaXRlc3BhY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFN0cmluZ3NFcXVhbHMoU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7Ci0gICAgICAgIFN0cmluZyBzdHJpcHBlZFN0cjEgPSBzdHIxLnJlcGxhY2VBbGwoIiAiLCAiIik7Ci0gICAgICAgIFN0cmluZyBzdHJpcHBlZFN0cjIgPSBzdHIyLnJlcGxhY2VBbGwoIiAiLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdHJpcHBlZFN0cjEsIHN0cmlwcGVkU3RyMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBkdW1teSBkZXZpY2UgdGhhdCBkb2VzIG5vdGhpbmcgZXhjZXB0IHN0b3JlIHRoZSBwcm92aWRlZCBleGVjdXRlZCBzaGVsbCBjb21tYW5kIGZvcgotICAgICAqIGxhdGVyIHJldHJpZXZhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrRGV2aWNlIGltcGxlbWVudHMgSURldmljZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RTaGVsbENvbW1hbmQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgY29tbWFuZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGZyb20gZ2V0TGFzdFNoZWxsQ29tbWFuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgSVNoZWxsT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtTGFzdFNoZWxsQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBsYXN0IGNvbW1hbmQgcHJvdmlkZWQgdG8gZXhlY3V0ZVNoZWxsQ29tbWFuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdFNoZWxsQ29tbWFuZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTGFzdFNoZWxsQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZUZvcndhcmQoaW50IGxvY2FsUG9ydCwgaW50IHJlbW90ZVBvcnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENsaWVudCBnZXRDbGllbnQoU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudE5hbWUoaW50IHBpZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xpZW50W10gZ2V0Q2xpZW50cygpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGVMaXN0aW5nU2VydmljZSBnZXRGaWxlTGlzdGluZ1NlcnZpY2UoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRQcm9wZXJ0eUNvdW50KCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmF3SW1hZ2UgZ2V0U2NyZWVuc2hvdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VyaWFsTnVtYmVyKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGV2aWNlU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTeW5jU2VydmljZSBnZXRTeW5jU2VydmljZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpZW50cygpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCb290TG9hZGVyKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtdWxhdG9yKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09mZmxpbmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzT25saW5lKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGb3J3YXJkKGludCBsb2NhbFBvcnQsIGludCByZW1vdGVQb3J0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bkV2ZW50TG9nU2VydmljZShMb2dSZWNlaXZlciByZWNlaXZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuTG9nU2VydmljZShTdHJpbmcgbG9nbmFtZSwgTG9nUmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXZkTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgaW5zdGFsbFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VGaWxlUGF0aCwgYm9vbGVhbiByZWluc3RhbGwpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB1bmluc3RhbGxQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBpbnN0YWxsUmVtb3RlUGFja2FnZShTdHJpbmcgcmVtb3RlRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWluc3RhbGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZVBhY2thZ2UoU3RyaW5nIHJlbW90ZUZpbGVQYXRoKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgc3luY1BhY2thZ2VUb0RldmljZShTdHJpbmcgbG9jYWxGaWxlUGF0aCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIElUZXN0UnVuTGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXN0UnVuTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWQoVGVzdEZhaWx1cmUgc3RhdHVzLCBUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkVuZGVkKGxvbmcgZWxhcHNlZFRpbWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkZhaWxlZChTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKGludCB0ZXN0Q291bnQpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0b3BwZWQobG9uZyBlbGFwc2VkVGltZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi8uY2xhc3NwYXRoIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDM2OGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSJNYWtlZmlsZXxyZXNvdXJjZXMvIiBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy9yZXNvdXJjZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZGRtbGliIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LlVTRVJfTElCUkFSWS9BTkRST0lEX1NXVCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5VU0VSX0xJQlJBUlkvQU5EUk9JRF9KRlJFRUNIQVJUIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi8ucHJvamVjdCBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljYjJmMi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5kZG11aWxpYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvQW5kcm9pZC5tayBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDU5ZTVlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLURETVVJTElCX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKERETVVJTElCX0xPQ0FMX0RJUikvc3JjL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9SRUFETUUgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjZiODRhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1Vc2luZyB0aGUgRWNsaXBzZSBwcm9qZWN0cyBmb3IgZGRtdWlsaWIuCi0KLWRkbXVpbGliIHJlcXVpcmVzIFNXVCB0byBjb21waWxlLgotCi1TV1QgaXMgYXZhaWxhYmxlIGluIHRoZSBkZXBvdCB1bmRlciBwcmVidWlsZC88cGxhdGZvcm0+L3N3dAotCi1CZWNhdXNlIHRoZSBidWlsZCBwYXRoIGNhbm5vdCBjb250YWluIHJlbGF0aXZlIHBhdGggdGhhdCBhcmUgbm90IGluc2lkZSB0aGUgcHJvamVjdCBkaXJlY3RvcnksCi10aGUgLmNsYXNzcGF0aCBmaWxlIHJlZmVyZW5jZXMgYSB1c2VyIGxpYnJhcnkgY2FsbGVkIEFORFJPSURfU1dULgotCi1JbiBvcmRlciB0byBjb21waWxlIHRoZSBwcm9qZWN0LCBtYWtlIGEgdXNlciBsaWJyYXJ5IGNhbGxlZCBBTkRST0lEX1NXVCBjb250YWluaW5nIHRoZSBqYXIKLWF2YWlsYWJsZSBhdCBwcmVidWlsZC88cGxhdGZvcm0+L3N3dC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL0FuZHJvaWQubWsgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2VhYzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmVzb3VyY2VzCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlkZG1saWIgXAotCXN3dCBcCi0Jb3JnLmVjbGlwc2UuamZhY2VfMy40LjIuTTIwMDkwMTA3LTA4MDAgXAotCW9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA4MDQyMS0yMDA2IFwKLQlvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuNC4wLkkyMDA4MDUwOS0yMDAwIFwKLQlqY29tbW9uLTEuMC4xMiBcCi0JamZyZWVjaGFydC0xLjAuOSBcCi0JamZyZWVjaGFydC0xLjAuOS1zd3QKLQkKLUxPQ0FMX01PRFVMRSA6PSBkZG11aWxpYgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvQWRkcjJMaW5lLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0FkZHIyTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2UwOTMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvQWRkcjJMaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuKjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBhZGRyMmxpbmUgcHJvY2VzcyB0byBnZXQgZmlsZW5hbWUvbWV0aG9kIGluZm9ybWF0aW9uIGZyb20gYQotICogbWVtb3J5IGFkZHJlc3MuPGJyPgotICogRWFjaCBwcm9jZXNzIGNhbiBvbmx5IGhhbmRsZSBvbmUgbGlicmFyeSwgd2hpY2ggc2hvdWxkIGJlIHByb3ZpZGVkIHdoZW4KLSAqIGNyZWF0aW5nIGEgbmV3IHByb2Nlc3MuPGJyPgotICogPGJyPgotICogVGhlIHByb2Nlc3NlcyB0YWtlIHNvbWUgdGltZSB0byBsb2FkIGFzIHRoZXkgbmVlZCB0byBwYXJzZSB0aGUgbGlicmFyeSBmaWxlcy4KLSAqIEZvciB0aGlzIHJlYXNvbiwgcHJvY2Vzc2VzIGNhbm5vdCBiZSBtYW51YWxseSBzdGFydGVkLiBJbnN0ZWFkIHRoZSBjbGFzcwotICoga2VlcHMgYW4gaW50ZXJuYWwgbGlzdCBvZiBwcm9jZXNzZXMgYW5kIG9uZSBhc2tzIGZvciBhIHByb2Nlc3MgZm9yIGEgc3BlY2lmaWMKLSAqIGxpYnJhcnksIHVzaW5nIDxjb2RlPmdldFByb2Nlc3MoU3RyaW5nIGxpYnJhcnkpPGNvZGU+Ljxicj48L2JyPgotICogSW50ZXJuYWxseSwgdGhlIHByb2Nlc3NlcyBhcmUgc3RhcnRlZCBpbiBwaXBlIG1vZGUgdG8gYmUgYWJsZSB0byBxdWVyeSB0aGVtCi0gKiB3aXRoIG11bHRpcGxlIGFkZHJlc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEFkZHIyTGluZSB7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkZWQgcHJvY2Vzc2VzIGxpc3QuIFRoaXMgaXMgYWxzbyB1c2VkIGFzIGEgbG9ja2luZyBvYmplY3QgZm9yIGFueQotICAgICAqIG1ldGhvZHMgZGVhbGluZyB3aXRoIHN0YXJ0aW5nL3N0b3BwaW5nL2NyZWF0aW5nIHByb2Nlc3Nlcy9xdWVyeWluZyBmb3IKLSAgICAgKiBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEFkZHIyTGluZT4gc1Byb2Nlc3NDYWNoZSA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEFkZHIyTGluZT4oKTsKLQotICAgIC8qKgotICAgICAqIGJ5dGUgYXJyYXkgcmVwcmVzZW50aW5nIGEgY2FycmlhZ2UgcmV0dXJuLiBVc2VkIHRvIHB1c2ggYWRkcmVzc2VzIGluIHRoZQotICAgICAqIHByb2Nlc3MgcGlwZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNDckxmID0gewotICAgICAgICAnXG4nCi0gICAgfTsKLQotICAgIC8qKiBQYXRoIHRvIHRoZSBsaWJyYXJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUxpYnJhcnk7Ci0KLSAgICAvKiogdGhlIGNvbW1hbmQgbGluZSBwcm9jZXNzICovCi0gICAgcHJpdmF0ZSBQcm9jZXNzIG1Qcm9jZXNzOwotCi0gICAgLyoqIGJ1ZmZlciB0byByZWFkIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQgbGluZSBwcm9jZXNzIGZyb20gKi8KLSAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIG1SZXN1bHRSZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBvdXRwdXQgc3RyZWFtIHRvIHByb3ZpZGUgbmV3IGFkZHJlc3NlcyB0byBkZWNvZGUgdG8gdGhlIGNvbW1hbmQgbGluZQotICAgICAqIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG1BZGRyZXNzV3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgYSBBZGRyMkxpbmUgcHJvY2VzcyBmb3IgdGhlIHNwZWNpZmllZCBsaWJyYXJ5LgotICAgICAqIDxicj5UaGUgbGlicmFyeSBzaG91bGQgYmUgaW4gYSBmb3JtYXQgdGhhdCBtYWtlczxicj4KLSAgICAgKiA8Y29kZT4kQU5EUk9JRF9QUk9EVUNUX09VVCArICIvc3ltYm9scyIgKyBsaWJyYXJ5PC9jb2RlPiBhIHZhbGlkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlicmFyeSB0aGUgbGlicmFyeSBpbiB3aGljaCB0byBsb29rIGZvciBhZGRyZXNzZXMuCi0gICAgICogQHJldHVybiBhIG5ldyBBZGRyMkxpbmUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHN0YXJ0ZWQgcHJvY2VzcywgcmVhZHkgdG8KLSAgICAgKiAgICAgICAgIGJlIHF1ZXJpZWQgZm9yIGFkZHJlc3Nlcy4gSWYgYW55IGVycm9yIGhhcHBlbmVkIHdoZW4gbGF1bmNoaW5nIGEKLSAgICAgKiAgICAgICAgIG5ldyBwcm9jZXNzLCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWRkcjJMaW5lIGdldFByb2Nlc3MoZmluYWwgU3RyaW5nIGxpYnJhcnkpIHsKLSAgICAgICAgLy8gc3luY2hyb25pemUgYXJvdW5kIHRoZSBoYXNobWFwIG9iamVjdAotICAgICAgICBpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNQcm9jZXNzQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhbiBleGlzdGluZyBwcm9jZXNzCi0gICAgICAgICAgICAgICAgQWRkcjJMaW5lIHByb2Nlc3MgPSBzUHJvY2Vzc0NhY2hlLmdldChsaWJyYXJ5KTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGZpbmQgb25lLCB3ZSBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgICBpZiAocHJvY2VzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgPSBuZXcgQWRkcjJMaW5lKGxpYnJhcnkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc3RhcnQgaXQKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBwcm9jZXNzLnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3RhcnRpbmcgdGhlIHByb2Nlc3Mgd29ya2VkLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBzUHJvY2Vzc0NhY2hlLnB1dChsaWJyYXJ5LCBwcm9jZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBqdXN0IGRyb3AgdGhlIG9iamVjdCwgdG8gcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcHJvY2VzcwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgb2JqZWN0IHdpdGggYSBsaWJyYXJ5IG5hbWUuCi0gICAgICogPGJyPlRoZSBsaWJyYXJ5IHNob3VsZCBiZSBpbiBhIGZvcm1hdCB0aGF0IG1ha2VzPGJyPgotICAgICAqIDxjb2RlPiRBTkRST0lEX1BST0RVQ1RfT1VUICsgIi9zeW1ib2xzIiArIGxpYnJhcnk8L2NvZGU+IGEgdmFsaWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBsaWJyYXJ5IGluIHdoaWNoIHRvIGxvb2sgZm9yIGFkZHJlc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBZGRyMkxpbmUoZmluYWwgU3RyaW5nIGxpYnJhcnkpIHsKLSAgICAgICAgbUxpYnJhcnkgPSBsaWJyYXJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgY29tbWFuZCBsaW5lIHByb2Nlc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2Nlc3Mgd2FzIHN0YXJ0ZWQsIGZhbHNlIGlmIGl0IGZhaWxlZCB0byBzdGFydCwgb3IKLSAgICAgKiAgICAgICAgIGlmIHRoZXJlIHdhcyBhbnkgb3RoZXIgZXJyb3JzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydCgpIHsKLSAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gZ2V0UHJvY2VzcygpIHdlIGtub3cgd2UgZG9uJ3QgbmVlZAotICAgICAgICAvLyB0byBzeW5jaHJvbml6ZSB0aGlzIGNvZGUuCi0KLSAgICAgICAgLy8gZ2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5LgotICAgICAgICBTdHJpbmcgc3ltYm9scyA9IFN5c3RlbS5nZXRlbnYoIkFORFJPSURfU1lNQk9MUyIpOwotICAgICAgICBpZiAoc3ltYm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzeW1ib2xzID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTeW1ib2xEaXJlY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbNV07Ci0gICAgICAgIGNvbW1hbmRbMF0gPSBEZG1VaVByZWZlcmVuY2VzLmdldEFkZHIyTGluZSgpOwotICAgICAgICBjb21tYW5kWzFdID0gIi1DIjsKLSAgICAgICAgY29tbWFuZFsyXSA9ICItZiI7Ci0gICAgICAgIGNvbW1hbmRbM10gPSAiLWUiOwotICAgICAgICBjb21tYW5kWzRdID0gc3ltYm9scyArIG1MaWJyYXJ5LnJlcGxhY2VBbGwoImxpYmNcXC5zbyIsICJsaWJjX2RlYnVnXFwuc28iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBzdGFydCB0aGUgcHJvY2VzcwotICAgICAgICAgICAgbVByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotCi0gICAgICAgICAgICBpZiAobVByb2Nlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzdWx0IHJlYWRlcgotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG1Qcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgbVJlc3VsdFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG91dHN0cmVhbSB0byB3cml0ZSB0aGUgYWRkcmVzc2VzCi0gICAgICAgICAgICAgICAgbUFkZHJlc3NXcml0ZXIgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obVByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBvdXIgc3RyZWFtcyBhcmUgaGVyZQotICAgICAgICAgICAgICAgIGlmIChtUmVzdWx0UmVhZGVyID09IG51bGwgfHwgbUFkZHJlc3NXcml0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3QgaGVyZT8gc3RvcCB0aGUgcHJvY2VzcyBhbmQgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzcy5kZXN0cm95KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIHN1Y2Nlc3MKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb2cgdGhlIGVycm9yCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHRyeWluZyB0byBzdGFydCAlMSRzIHByb2Nlc3MgZm9yIGxpYnJhcnkgJTIkcyIsCi0gICAgICAgICAgICAgICAgICAgIERkbVVpUHJlZmVyZW5jZXMuZ2V0QWRkcjJMaW5lKCksIG1MaWJyYXJ5KTsKLSAgICAgICAgICAgIExvZy5lKCJkZG0tQWRkcjJMaW5lIiwgbXNnKTsKLQotICAgICAgICAgICAgLy8gZHJvcCB0aGUgcHJvY2VzcyBqdXN0IGluIGNhc2UKLSAgICAgICAgICAgIGlmIChtUHJvY2VzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByb2Nlc3MuZGVzdHJveSgpOwotICAgICAgICAgICAgICAgIG1Qcm9jZXNzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIGNhbiBiZSBoZXJlIGVpdGhlciBjYXVzZSB0aGUgYWxsb2NhdGlvbiBvZiBtUHJvY2VzcyBmYWlsZWQsIG9yIHdlCi0gICAgICAgIC8vIGNhdWdodCBhbiBleGNlcHRpb24KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBjb21tYW5kIGxpbmUgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNQcm9jZXNzQ2FjaGUpIHsKLSAgICAgICAgICAgIGlmIChtUHJvY2VzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwcm9jZXNzIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBzUHJvY2Vzc0NhY2hlLnJlbW92ZShtTGlicmFyeSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGVuIHN0b3BzIHRoZSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgbVByb2Nlc3MuZGVzdHJveSgpOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSByZWZlcmVuY2UgdG8gbnVsbC4KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbG93cyB0byBtYWtlIHN1cmUgYW5vdGhlciB0aHJlYWQgY2FsbGluZyBnZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBxdWVyeSBhIHN0b3BwZWQgdGhyZWFkCi0gICAgICAgICAgICAgICAgbVByb2Nlc3MgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYWxsIGN1cnJlbnQgcnVubmluZyBwcm9jZXNzZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3BBbGwoKSB7Ci0gICAgICAgIC8vIGJlY2F1c2Ugb2YgY29uY3VycmVudCBhY2Nlc3MgKGFuZCBvdXIgdXNlIG9mIEhhc2hNYXAudmFsdWVzKCkpLCB3ZQotICAgICAgICAvLyBjYW4ndCByZWx5IG9uIHRoZSBzeW5jaHJvbml6ZWQgaW5zaWRlIHN0b3AoKS4gV2UgbmVlZCB0byBwdXQgb25lCi0gICAgICAgIC8vIGFyb3VuZCB0aGUgd2hvbGUgbG9vcC4KLSAgICAgICAgc3luY2hyb25pemVkIChzUHJvY2Vzc0NhY2hlKSB7Ci0gICAgICAgICAgICAvLyBqdXN0IGEgYmFzaWMgbG9vcCBvbiBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaGFzaG1hcCBhbmQgY2FsbCB0bwotICAgICAgICAgICAgLy8gc3RvcCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxBZGRyMkxpbmU+IGNvbCA9IHNQcm9jZXNzQ2FjaGUudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKEFkZHIyTGluZSBhMmwgOiBjb2wpIHsKLSAgICAgICAgICAgICAgICBhMmwuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3MgdXAgYW4gYWRkcmVzcyBhbmQgcmV0dXJucyBtZXRob2QgbmFtZSwgc291cmNlIGZpbGUgbmFtZSwgYW5kIGxpbmUKLSAgICAgKiBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRkciB0aGUgYWRkcmVzcyB0byBsb29rIHVwCi0gICAgICogQHJldHVybiBhIEJhY2t0cmFjZUluZm8gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZC9maWxlbmFtZS9saW5lbnVtYmVyCi0gICAgICogICAgICAgICBvciBudWxsIGlmIHRoZSBwcm9jZXNzIHdlIHN0b3BwZWQgYmVmb3JlIHRoZSBxdWVyeSBjb3VsZCBiZQotICAgICAqICAgICAgICAgcHJvY2Vzc2VkLCBvciBpZiBhbiBJTyBleGNlcHRpb24gaGFwcGVuZWQuCi0gICAgICovCi0gICAgcHVibGljIE5hdGl2ZVN0YWNrQ2FsbEluZm8gZ2V0QWRkcmVzcyhsb25nIGFkZHIpIHsKLSAgICAgICAgLy8gZXZlbiB0aG91Z2ggd2UgZG9uJ3QgYWNjZXNzIHRoZSBoYXNobWFwIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAvLyBzeW5jaHJvbml6ZWQgb24gaXQgdG8gcHJldmVudAotICAgICAgICAvLyBhbm90aGVyIHRocmVhZCBmcm9tIHN0b3BwaW5nIHRoZSBwcm9jZXNzIHdlJ3JlIGdvaW5nIHRvIHF1ZXJ5LgotICAgICAgICBzeW5jaHJvbml6ZWQgKHNQcm9jZXNzQ2FjaGUpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlL2FsbG9jYXRlZAotICAgICAgICAgICAgaWYgKG1Qcm9jZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBwcmVwYXJlIHRvIHRoZSB3cml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICAgICAgICAgIC8vIGZpcnN0LCBjb252ZXJzaW9uIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhleCB2YWx1ZS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wID0gTG9uZy50b1N0cmluZyhhZGRyLCAxNik7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIG1BZGRyZXNzV3JpdGVyLndyaXRlKHRtcC5nZXRCeXRlcygpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgQ1ItTEYKLSAgICAgICAgICAgICAgICAgICAgbUFkZHJlc3NXcml0ZXIud3JpdGUoc0NyTGYpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIGl0IGFsbC4KLSAgICAgICAgICAgICAgICAgICAgbUFkZHJlc3NXcml0ZXIuZmx1c2goKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSByZXN1bHQuIFdlIG5lZWQgdG8gcmVhZCAyIGxpbmVzCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSBtUmVzdWx0UmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2UgPSBtUmVzdWx0UmVhZGVyLnJlYWRMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgYmFja3RyYWNlIG9iamVjdCBhbmQgcmV0dXJuIGl0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCAmJiBzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTdGFja0NhbGxJbmZvKG1MaWJyYXJ5LCBtZXRob2QsIHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxvZyB0aGUgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB0cnlpbmcgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBhZGRyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRtcCArICIgaW4gbGlicmFyeTogIiArIG1MaWJyYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgcmV0dXJuIG51bGwgbGF0ZXIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9BbGxvY2F0aW9uUGFuZWwuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvQWxsb2NhdGlvblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzBlMTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9BbGxvY2F0aW9uUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbGxvY2F0aW9uSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSUNsaWVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkFsbG9jYXRpb25UcmFja2luZ1N0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG91ciBpbmZvcm1hdGlvbiBwYW5lbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxvY2F0aW9uUGFuZWwgZXh0ZW5kcyBUYWJsZVBhbmVsIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19BTExPQ19DT0xfU0laRSA9ICJhbGxvY1BhbmVsLkNvbDAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0FMTE9DX0NPTF9DTEFTUyA9ICJhbGxvY1BhbmVsLkNvbDEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0FMTE9DX0NPTF9USFJFQUQgPSAiYWxsb2NQYW5lbC5Db2wyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19BTExPQ19DT0xfVFJBQ0VfQ0xBU1MgPSAiYWxsb2NQYW5lbC5Db2wzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19BTExPQ19DT0xfVFJBQ0VfTUVUSE9EID0gImFsbG9jUGFuZWwuQ29sNCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19BTExPQ19TQVNIID0gImFsbG9jUGFuZWwuc2FzaCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFDS19DT0xfQ0xBU1MgPSAiYWxsb2NQYW5lbC5zdGFjay5jb2wwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFDS19DT0xfTUVUSE9EID0gImFsbG9jUGFuZWwuc3RhY2suY29sMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfU1RBQ0tfQ09MX0ZJTEUgPSAiYWxsb2NQYW5lbC5zdGFjay5jb2wyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFDS19DT0xfTElORSA9ICJhbGxvY1BhbmVsLnN0YWNrLmNvbDMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQUNLX0NPTF9OQVRJVkUgPSAiYWxsb2NQYW5lbC5zdGFjay5jb2w0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUFsbG9jYXRpb25CYXNlOwotICAgIHByaXZhdGUgVGFibGUgbUFsbG9jYXRpb25UYWJsZTsKLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIG1BbGxvY2F0aW9uVmlld2VyOwotCi0gICAgcHJpdmF0ZSBTdGFja1RyYWNlUGFuZWwgbVN0YWNrVHJhY2VQYW5lbDsKLSAgICBwcml2YXRlIFRhYmxlIG1TdGFja1RyYWNlVGFibGU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUVuYWJsZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtUmVxdWVzdEJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENvbnRlbnQgUHJvdmlkZXIgdG8gZGlzcGxheSB0aGUgYWxsb2NhdGlvbnMgb2YgYSBjbGllbnQuCi0gICAgICogRXhwZWN0ZWQgaW5wdXQgaXMgYSB7QGxpbmsgQ2xpZW50fSBvYmplY3QsIGVsZW1lbnRzIHVzZWQgaW4gdGhlIHRhYmxlIGFyZSBvZiB0eXBlCi0gICAgICoge0BsaW5rIEFsbG9jYXRpb25JbmZvfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbGxvY2F0aW9uQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENsaWVudCkgewotICAgICAgICAgICAgICAgIEFsbG9jYXRpb25JbmZvW10gYWxsb2NzID0gKChDbGllbnQpaW5wdXRFbGVtZW50KS5nZXRDbGllbnREYXRhKCkuZ2V0QWxsb2NhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWxsb2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9jczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBMYWJlbCBQcm92aWRlciB0byB1c2Ugd2l0aCB7QGxpbmsgQWxsb2NhdGlvbkNvbnRlbnRQcm92aWRlcn0uIEl0IGV4cGVjdHMgdGhlIGVsZW1lbnRzIHRvIGJlCi0gICAgICogb2YgdHlwZSB7QGxpbmsgQWxsb2NhdGlvbkluZm99LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsbG9jYXRpb25MYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWxsb2NhdGlvbkluZm8pIHsKLSAgICAgICAgICAgICAgICBBbGxvY2F0aW9uSW5mbyBhbGxvYyA9IChBbGxvY2F0aW9uSW5mbyllbGVtZW50OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoYWxsb2MuZ2V0U2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9jLmdldEFsbG9jYXRlZENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTaG9ydC50b1N0cmluZyhhbGxvYy5nZXRUaHJlYWRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZXMgPSBhbGxvYy5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2VzWzBdLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlcyA9IGFsbG9jLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZXNbMF0uZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG91ciBjb250cm9sKHMpLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIC8vIGJhc2UgY29tcG9zaXRlIGZvciBzZWxlY3RlZCBjbGllbnQgd2l0aCBlbmFibGVkIHRocmVhZCB1cGRhdGUuCi0gICAgICAgIG1BbGxvY2F0aW9uQmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG1BbGxvY2F0aW9uQmFzZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gdGFibGUgYWJvdmUgdGhlIHNhc2gKLSAgICAgICAgQ29tcG9zaXRlIHRvcFBhcmVudCA9IG5ldyBDb21wb3NpdGUobUFsbG9jYXRpb25CYXNlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRvcFBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotICAgICAgICBtRW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbih0b3BQYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgbUVuYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIENsaWVudCBjdXJyZW50ID0gZ2V0Q3VycmVudENsaWVudCgpOwotICAgICAgICAgICAgICAgIEFsbG9jYXRpb25UcmFja2luZ1N0YXR1cyBzdGF0dXMgPSBjdXJyZW50LmdldENsaWVudERhdGEoKS5nZXRBbGxvY2F0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBbGxvY2F0aW9uVHJhY2tpbmdTdGF0dXMuT04pIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5lbmFibGVBbGxvY2F0aW9uVHJhY2tlcihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC5lbmFibGVBbGxvY2F0aW9uVHJhY2tlcih0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudC5yZXF1ZXN0QWxsb2NhdGlvblN0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtUmVxdWVzdEJ1dHRvbiA9IG5ldyBCdXR0b24odG9wUGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIG1SZXF1ZXN0QnV0dG9uLnNldFRleHQoIkdldCBBbGxvY2F0aW9ucyIpOwotICAgICAgICBtUmVxdWVzdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGdldEN1cnJlbnRDbGllbnQoKS5yZXF1ZXN0QWxsb2NhdGlvbkRldGFpbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2V0VXBCdXR0b25zKGZhbHNlIC8qIGVuYWJsZWQgKi8sIEFsbG9jYXRpb25UcmFja2luZ1N0YXR1cy5PRkYpOwotCi0gICAgICAgIG1BbGxvY2F0aW9uVGFibGUgPSBuZXcgVGFibGUodG9wUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YTsKLSAgICAgICAgbUFsbG9jYXRpb25UYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1BbGxvY2F0aW9uVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbUFsbG9jYXRpb25UYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbUFsbG9jYXRpb25UYWJsZSwKLSAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBTaXplIiwKLSAgICAgICAgICAgICAgICBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjg4OCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19BTExPQ19DT0xfU0laRSwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVGFibGUsCi0gICAgICAgICAgICAgICAgIkFsbG9jYXRlZCBDbGFzcyIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIkFsbG9jYXRlZCBDbGFzcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19BTExPQ19DT0xfQ0xBU1MsIHN0b3JlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbigKLSAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblRhYmxlLAotICAgICAgICAgICAgICAgICJUaHJlYWQgSWQiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICI5OTkiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfQUxMT0NfQ09MX1RIUkVBRCwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVGFibGUsCi0gICAgICAgICAgICAgICAgIkFsbG9jYXRlZCBpbiIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgInV0aW1lIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX0FMTE9DX0NPTF9UUkFDRV9DTEFTUywgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVGFibGUsCi0gICAgICAgICAgICAgICAgIkFsbG9jYXRlZCBpbiIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgInV0aW1lIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX0FMTE9DX0NPTF9UUkFDRV9NRVRIT0QsIHN0b3JlKTsKLQotICAgICAgICBtQWxsb2NhdGlvblZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihtQWxsb2NhdGlvblRhYmxlKTsKLSAgICAgICAgbUFsbG9jYXRpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBbGxvY2F0aW9uQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBtQWxsb2NhdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbGxvY2F0aW9uTGFiZWxQcm92aWRlcigpKTsKLQotICAgICAgICBtQWxsb2NhdGlvblZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEFsbG9jYXRpb25JbmZvIHNlbGVjdGVkQWxsb2MgPSBnZXRBbGxvY2F0aW9uU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVBbGxvY2F0aW9uU3RhY2tUcmFjZShzZWxlY3RlZEFsbG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gdGhlIHNlcGFyYXRpbmcgc2FzaAotICAgICAgICBmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChtQWxsb2NhdGlvbkJhc2UsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgQ29sb3IgZGFya0dyYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotICAgICAgICBzYXNoLnNldEJhY2tncm91bmQoZGFya0dyYXkpOwotCi0gICAgICAgIC8vIHRoZSBVSSBiZWxvdyB0aGUgc2FzaAotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsID0gbmV3IFN0YWNrVHJhY2VQYW5lbCgpOwotICAgICAgICBtU3RhY2tUcmFjZVRhYmxlID0gbVN0YWNrVHJhY2VQYW5lbC5jcmVhdGVQYW5lbChtQWxsb2NhdGlvbkJhc2UsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0NMQVNTLAotICAgICAgICAgICAgICAgIFBSRUZTX1NUQUNLX0NPTF9NRVRIT0QsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0ZJTEUsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0xJTkUsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX05BVElWRSwKLSAgICAgICAgICAgICAgICBzdG9yZSk7Ci0KLSAgICAgICAgLy8gbm93IHNldHVwIHRoZSBzYXNoLgotICAgICAgICAvLyBmb3JtIGxheW91dCBkYXRhCi0gICAgICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgdG9wUGFyZW50LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICAgICAgaWYgKHN0b3JlICE9IG51bGwgJiYgc3RvcmUuY29udGFpbnMoUFJFRlNfQUxMT0NfU0FTSCkpIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBzdG9yZS5nZXRJbnQoUFJFRlNfQUxMT0NfU0FTSCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLDApOyAvLyA1MCUgYWNyb3NzCi0gICAgICAgIH0KLSAgICAgICAgc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgc2FzaERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQotICAgICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgbVN0YWNrVHJhY2VUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIGFsbG93IHJlc2l6ZXMsIGJ1dCBjYXAgYXQgbWluUGFuZWxXaWR0aAotICAgICAgICBzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc2FzaFJlY3QgPSBzYXNoLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBwYW5lbFJlY3QgPSBtQWxsb2NhdGlvbkJhc2UuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBwYW5lbFJlY3QuaGVpZ2h0IC0gc2FzaFJlY3QuaGVpZ2h0IC0gMTAwOwotICAgICAgICAgICAgICAgIGUueSA9IE1hdGgubWF4KE1hdGgubWluKGUueSwgYm90dG9tKSwgMTAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZS55ICE9IHNhc2hSZWN0LnkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKFBSRUZTX0FMTE9DX1NBU0gsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uQmFzZS5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBtQWxsb2NhdGlvbkJhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9jdXMgdG8gdGhlIHByb3BlciBjb250cm9sIGluc2lkZSB0aGUgcGFuZWwuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIG1BbGxvY2F0aW9uVGFibGUuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXhpc3RpbmcgY2xpZW50IGluZm9ybWF0aW9uIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSB1cGRhdGVkIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgYml0IG1hc2sgZGVzY3JpYmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLiBJdCBjYW4gY29udGFpbgotICAgICAqIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoge0BsaW5rIENsaWVudCNDSEFOR0VfSU5GT30sIHtAbGluayBDbGllbnQjQ0hBTkdFX05BTUV9Ci0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfREVCVUdHRVJfU1RBVFVTfSwge0BsaW5rIENsaWVudCNDSEFOR0VfVEhSRUFEX01PREV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9IRUFQX0RBVEF9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9OQVRJVkVfSEVBUF9EQVRBfQotICAgICAqCi0gICAgICogQHNlZSBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGllbnRDaGFuZ2VkKGZpbmFsIENsaWVudCBjbGllbnQsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIGlmIChjbGllbnQgPT0gZ2V0Q3VycmVudENsaWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoKGNoYW5nZU1hc2sgJiBDbGllbnQuQ0hBTkdFX0hFQVBfQUxMT0NBVElPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblRhYmxlLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBbGxvY2F0aW9uU3RhY2tDYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdpZGdldCBpcyBkaXNwb3NlZCwgd2UgZG8gbm90aGluZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNoYW5nZU1hc2sgJiBDbGllbnQuQ0hBTkdFX0hFQVBfQUxMT0NBVElPTl9TVEFUVVMpICE9IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblRhYmxlLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwQnV0dG9ucyh0cnVlLCBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldEFsbG9jYXRpb25TdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdpZGdldCBpcyBkaXNwb3NlZCwgd2UgZG8gbm90aGluZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyBkZXZpY2UgaXMgc2VsZWN0ZWQuIFRoZSBuZXcgZGV2aWNlIGNhbiBiZSBhY2Nlc3NlZAotICAgICAqIHdpdGgge0BsaW5rICNnZXRDdXJyZW50RGV2aWNlKCl9LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRldmljZVNlbGVjdGVkKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGNsaWVudCBpcyBzZWxlY3RlZC4gVGhlIG5ldyBjbGllbnQgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnRDbGllbnQoKX0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50U2VsZWN0ZWQoKSB7Ci0gICAgICAgIGlmIChtQWxsb2NhdGlvblRhYmxlLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xpZW50IGNsaWVudCA9IGdldEN1cnJlbnRDbGllbnQoKTsKLQotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsLnNldEN1cnJlbnRDbGllbnQoY2xpZW50KTsKLSAgICAgICAgbVN0YWNrVHJhY2VQYW5lbC5zZXRWaWV3ZXJJbnB1dChudWxsKTsgLy8gYWx3YXlzIGVtcHR5IG9uIGNsaWVudCBzZWxlY3Rpb24gY2hhbmdlLgotCi0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0VXBCdXR0b25zKHRydWUgLyogZW5hYmxlZCAqLywgY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRBbGxvY2F0aW9uU3RhdHVzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0VXBCdXR0b25zKGZhbHNlIC8qIGVuYWJsZWQgKi8sIEFsbG9jYXRpb25UcmFja2luZ1N0YXR1cy5PRkYpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUFsbG9jYXRpb25WaWV3ZXIuc2V0SW5wdXQoY2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBzdGFjayBjYWxsIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIDxiPm11c3Q8L2I+IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbG9jYXRpb25TdGFja0NhbGwoKSB7Ci0gICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgVGhyZWFkVGFibGUKLSAgICAgICAgICAgIEFsbG9jYXRpb25JbmZvIHNlbGVjdGVkQWxsb2MgPSBnZXRBbGxvY2F0aW9uU2VsZWN0aW9uKG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRBbGxvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQWxsb2NhdGlvblN0YWNrVHJhY2Uoc2VsZWN0ZWRBbGxvYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUFsbG9jYXRpb25TdGFja1RyYWNlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXBkYXRlcyB0aGUgc3RhY2tjYWxsIG9mIHRoZSBzcGVjaWZpZWQgYWxsb2NhdGlvbi4gSWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIFVJIGlzIGVtcHRpZWQKLSAgICAgKiBvZiBjdXJyZW50IGRhdGEuCi0gICAgICogQHBhcmFtIHRocmVhZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBbGxvY2F0aW9uU3RhY2tUcmFjZShBbGxvY2F0aW9uSW5mbyBhbGxvYykgewotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsLnNldFZpZXdlcklucHV0KGFsbG9jKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUZvY3VzTGlzdGVuZXIoKSB7Ci0gICAgICAgIGFkZFRhYmxlVG9Gb2N1c0xpc3RlbmVyKG1BbGxvY2F0aW9uVGFibGUpOwotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihtU3RhY2tUcmFjZVRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gc2VsZWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICogSWYgYSB7QGxpbmsgSVNlbGVjdGlvbn0gb2JqZWN0IGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IHtAbGluayBBbGxvY2F0aW9uSW5mb30gZnJvbSB0aGlzCi0gICAgICogc2VsZWN0aW9uIGlzIHJldHVybmVkLCBvdGhlcndpc2UsIHRoZSA8Y29kZT5JU2VsZWN0aW9uPC9jb2RlPiByZXR1cm5lZCBieQotICAgICAqIHtAbGluayBUYWJsZVZpZXdlciNnZXRTZWxlY3Rpb24oKX0gaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSB7QGxpbmsgSVNlbGVjdGlvbn0gdG8gdXNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgQWxsb2NhdGlvbkluZm8gZ2V0QWxsb2NhdGlvblNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IG1BbGxvY2F0aW9uVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFsbG9jYXRpb25JbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBbGxvY2F0aW9uSW5mbylvYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkCi0gICAgICogQHBhcmFtIHRyYWNraW5nU3RhdHVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFVwQnV0dG9ucyhib29sZWFuIGVuYWJsZWQsIEFsbG9jYXRpb25UcmFja2luZ1N0YXR1cyB0cmFja2luZ1N0YXR1cykgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgc3dpdGNoICh0cmFja2luZ1N0YXR1cykgewotICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTjoKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUJ1dHRvbi5zZXRUZXh0KCI/Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9GRjoKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUJ1dHRvbi5zZXRUZXh0KCJTdGFydCBUcmFja2luZyIpOwotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9OOgotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlQnV0dG9uLnNldFRleHQoIlN0b3AgVHJhY2tpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtUmVxdWVzdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1FbmFibGVCdXR0b24uc2V0VGV4dCgiU3RhcnQgVHJhY2tpbmciKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9CYWNrZ3JvdW5kVGhyZWFkLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0JhY2tncm91bmRUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkNGM5NS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0JhY2tncm91bmRUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLQotLyoqCi0gKiBiYXNlIGJhY2tncm91bmQgdGhyZWFkIGNsYXNzLiBUaGUgY2xhc3MgcHJvdmlkZXMgYSBzeW5jaHJvbm91cyBxdWl0IG1ldGhvZAotICogd2hpY2ggc2V0cyBhIHF1aXR0aW5nIGZsYWcgdG8gdHJ1ZS4gSW5oZXJpdGluZyBjbGFzc2VzIHNob3VsZCByZWd1bGFybHkgdGVzdAotICogdGhpcyBmbGFnIHdpdGggPGNvZGU+aXNRdWl0dGluZygpPC9jb2RlPiBhbmQgc2hvdWxkIGZpbmlzaCBpZiB0aGUgZmxhZyBpcwotICogdHJ1ZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhY2tncm91bmRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgIHByaXZhdGUgYm9vbGVhbiBtUXVpdCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGVsbCB0aGUgdGhyZWFkIHRvIGV4aXQuIFRoaXMgaXMgdXN1YWxseSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLiBUaGUKLSAgICAgKiBjYWxsIGlzIHN5bmNocm9ub3VzIGFuZCB3aWxsIG9ubHkgcmV0dXJuIG9uY2UgdGhlIHRocmVhZCBoYXMgdGVybWluYXRlZAotICAgICAqIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBxdWl0KCkgewotICAgICAgICBtUXVpdCA9IHRydWU7Ci0gICAgICAgIExvZy5kKCJkZG1zIiwgIldhaXRpbmcgZm9yIEJhY2tncm91bmRUaHJlYWQgdG8gcXVpdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5qb2luKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBpZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiByZXR1cm5zIGlmIHRoZSB0aHJlYWQgd2FzIGFza2VkIHRvIHF1aXQuICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNRdWl0dGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1RdWl0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9CYXNlSGVhcFBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0Jhc2VIZWFwUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2NmVhNS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0Jhc2VIZWFwUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5IZWFwU2VnbWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YS5IZWFwRGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSGVhcFNlZ21lbnQuSGVhcFNlZ21lbnRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotCi0vKioKLSAqIEJhc2UgUGFuZWwgZm9yIGhlYXAgcGFuZWxzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUhlYXBQYW5lbCBleHRlbmRzIFRhYmxlUGFuZWwgewotCi0gICAgLyoqIHN0b3JlIHRoZSBwcm9jZXNzZWQgaGVhcCBzZWdtZW50LCBzbyB0aGF0IHdlIGRvbid0IHJlY29tcHV0ZSBJbWFnZSBmb3Igbm90aGluZyAqLwotICAgIHByb3RlY3RlZCBieXRlW10gbVByb2Nlc3NlZEhlYXBEYXRhOwotICAgIHByaXZhdGUgTWFwPEludGVnZXIsIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+PiBtSGVhcE1hcDsKLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZSB0aGUgaGVhcCBkYXRhIGludG8gYW4gYXJyYXkuIFRoZSByZXN1bHRpbmcgYXJyYXkgaXMgYXZhaWxhYmxlIHRocm91Z2gKLSAgICAgKiA8Y29kZT5nZXRTZXJpYWxpemVkRGF0YSgpPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gaGVhcERhdGEgVGhlIGhlYXAgZGF0YSB0byBzZXJpYWxpemUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgY2hhbmdlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXJpYWxpemVIZWFwRGF0YShIZWFwRGF0YSBoZWFwRGF0YSkgewotICAgICAgICBDb2xsZWN0aW9uPEhlYXBTZWdtZW50PiBoZWFwU2VnbWVudHM7Ci0KLSAgICAgICAgLy8gQXRvbWljYWxseSBnZXQgYW5kIGNsZWFyIHRoZSBoZWFwIGRhdGEuCi0gICAgICAgIHN5bmNocm9uaXplZCAoaGVhcERhdGEpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgc2VnbWVudHMKLSAgICAgICAgICAgIGhlYXBTZWdtZW50cyA9IGhlYXBEYXRhLmdldEhlYXBTZWdtZW50cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChoZWFwU2VnbWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIG5vdCBudWxsLCB3ZSBuZXZlciBwcm9jZXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICAvLyBCZWZvcmUgd2UgcHJvY2VzcyB0aGVuLCB3ZSBkcm9wIHRoZW0gZnJvbSB0aGUgSGVhcERhdGEKLSAgICAgICAgICAgICAgICBoZWFwRGF0YS5jbGVhckhlYXBEYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRoZW0gaW50byBhIGxpbmVhciBieXRlW10KLSAgICAgICAgICAgICAgICBkb1NlcmlhbGl6ZUhlYXBEYXRhKGhlYXBTZWdtZW50cyk7Ci0gICAgICAgICAgICAgICAgaGVhcERhdGEuc2V0UHJvY2Vzc2VkSGVhcERhdGEobVByb2Nlc3NlZEhlYXBEYXRhKTsKLSAgICAgICAgICAgICAgICBoZWFwRGF0YS5zZXRQcm9jZXNzZWRIZWFwTWFwKG1IZWFwTWFwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIGhlYXAgc2VnbWVudHMgYXJlIG51bGwuIExldCBzZWUgaWYgdGhlIGhlYXBEYXRhIGNvbnRhaW5zIGEgCi0gICAgICAgICAgICAgICAgLy8gbGlzdCB0aGF0IGlzIGFscmVhZHkgcHJvY2Vzc2VkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJ5dGVbXSBwaXhEYXRhID0gaGVhcERhdGEuZ2V0UHJvY2Vzc2VkSGVhcERhdGEoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBhbmQgY29tcGFyZSBpdCB0byB0aGUgb25lIHdlIGN1cnJlbnRseSBoYXZlIGluIHRoZSBwYW5lbC4KLSAgICAgICAgICAgICAgICBpZiAocGl4RGF0YSA9PSBtUHJvY2Vzc2VkSGVhcERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBpdHMgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRIZWFwRGF0YSA9IHBpeERhdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8SGVhcFNlZ21lbnRFbGVtZW50Pj4gaGVhcE1hcCA9Ci0gICAgICAgICAgICAgICAgICAgIGhlYXBEYXRhLmdldFByb2Nlc3NlZEhlYXBNYXAoKTsKLSAgICAgICAgICAgICAgICBtSGVhcE1hcCA9IGhlYXBNYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIGhlYXAgZGF0YQotICAgICAqLwotICAgIHByb3RlY3RlZCBieXRlW10gZ2V0U2VyaWFsaXplZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvY2Vzc2VkSGVhcERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGFuZCBzZXJpYWxpemUgdGhlIGhlYXBEYXRhLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgcmVzdWx0aW5nIHNlcmlhbGl6ZWQgYXJyYXkgaXMge0BsaW5rICNtUHJvY2Vzc2VkSGVhcERhdGF9LgotICAgICAqIDxwLz4KLSAgICAgKiB0aGUgcmVzdWx0aW5nIG1hcCBpcyB7QGxpbmsgI21IZWFwTWFwfS4KLSAgICAgKiBAcGFyYW0gaGVhcERhdGEgdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEhlYXBTZWdtZW50fSB0aGF0IGZvcm1zIHRoZSBoZWFwIGRhdGEuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2VyaWFsaXplSGVhcERhdGEoQ29sbGVjdGlvbjxIZWFwU2VnbWVudD4gaGVhcERhdGEpIHsKLSAgICAgICAgbUhlYXBNYXAgPSBuZXcgVHJlZU1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8SGVhcFNlZ21lbnRFbGVtZW50Pj4oKTsKLQotICAgICAgICBJdGVyYXRvcjxIZWFwU2VnbWVudD4gaXRlcmF0b3I7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0KLSAgICAgICAgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSg0ICogMTAyNCk7Ci0KLSAgICAgICAgaXRlcmF0b3IgPSBoZWFwRGF0YS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBIZWFwU2VnbWVudCBocyA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgSGVhcFNlZ21lbnRFbGVtZW50IGUgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgdjsKLQotICAgICAgICAgICAgICAgIGUgPSBocy5nZXROZXh0RWxlbWVudChudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTb2xpZGl0eSgpID09IEhlYXBTZWdtZW50RWxlbWVudC5TT0xJRElUWV9GUkVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHYgPSBlLmdldEtpbmQoKSArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgZWxlbWVudCBpbiB0aGUgbWFwCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEhlYXBTZWdtZW50RWxlbWVudD4gZWxlbWVudExpc3QgPSBtSGVhcE1hcC5nZXQodik7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0PEhlYXBTZWdtZW50RWxlbWVudD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbUhlYXBNYXAucHV0KHYsIGVsZW1lbnRMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKGUpOwotCi0KLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gZS5nZXRMZW5ndGgoKSAvIDg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHYpOwotICAgICAgICAgICAgICAgICAgICAtLWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2Nlc3NlZEhlYXBEYXRhID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzb3J0IHRoZSBzZWdtZW50IGVsZW1lbnQgaW4gdGhlIGhlYXAgaW5mby4KLSAgICAgICAgQ29sbGVjdGlvbjxBcnJheUxpc3Q8SGVhcFNlZ21lbnRFbGVtZW50Pj4gZWxlbWVudExpc3RzID0gbUhlYXBNYXAudmFsdWVzKCk7Ci0gICAgICAgIGZvciAoQXJyYXlMaXN0PEhlYXBTZWdtZW50RWxlbWVudD4gZWxlbWVudExpc3QgOiBlbGVtZW50TGlzdHMpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZWxlbWVudExpc3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaW5lYXIgaW1hZ2Ugb2YgdGhlIGhlYXAgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4RGF0YQotICAgICAqIEBwYXJhbSBoCi0gICAgICogQHBhcmFtIHBhbGV0dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlRGF0YSBjcmVhdGVMaW5lYXJIZWFwSW1hZ2UoYnl0ZVtdIHBpeERhdGEsIGludCBoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0gICAgICAgIGludCB3ID0gcGl4RGF0YS5sZW5ndGggLyBoOwotICAgICAgICBpZiAocGl4RGF0YS5sZW5ndGggJSBoICE9IDApIHsKLSAgICAgICAgICAgIHcrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaGVhcCBpbWFnZS4KLSAgICAgICAgSW1hZ2VEYXRhIGlkID0gbmV3IEltYWdlRGF0YSh3LCBoLCA4LCBwYWxldHRlKTsKLQotICAgICAgICBpbnQgeCA9IDA7Ci0gICAgICAgIGludCB5ID0gMDsKLSAgICAgICAgZm9yIChieXRlIGIgOiBwaXhEYXRhKSB7Ci0gICAgICAgICAgICBpZiAoYiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWQuc2V0UGl4ZWwoeCwgeSwgYik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHkrKzsKLSAgICAgICAgICAgIGlmICh5ID49IGgpIHsKLSAgICAgICAgICAgICAgICB5ID0gMDsKLSAgICAgICAgICAgICAgICB4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvQ2xpZW50RGlzcGxheVBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0NsaWVudERpc3BsYXlQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzExOTMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvQ2xpZW50RGlzcGxheVBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JQ2xpZW50Q2hhbmdlTGlzdGVuZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGllbnREaXNwbGF5UGFuZWwgZXh0ZW5kcyBTZWxlY3Rpb25EZXBlbmRlbnRQYW5lbAotICAgICAgICBpbXBsZW1lbnRzIElDbGllbnRDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0Q3JlYXRpb24oKSB7Ci0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGRDbGllbnRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlQ2xpZW50Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9EZG1VaVByZWZlcmVuY2VzLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0RkbVVpUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzMmE0ZS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0RkbVVpUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgZW50cnkgcG9pbnQgZm9yIGRkbXVpbGliLiBBbGxvd3MgdGhlIGxpYiB0byBhY2Nlc3MgYSBwcmVmZXJlbmNlCi0gKiBzdG9yZSAob3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlKSBkZWZpbmVkIGJ5IHRoZQotICogYXBwbGljYXRpb24gdGhhdCBpbmNsdWRlcyB0aGUgbGliLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGRtVWlQcmVmZXJlbmNlcyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RIUkVBRF9SRUZSRVNIX0lOVEVSVkFMID0gNDsgIC8vIHNlY29uZHMKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBzVGhyZWFkUmVmcmVzaEludGVydmFsID0gREVGQVVMVF9USFJFQURfUkVGUkVTSF9JTlRFUlZBTDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIG1TdG9yZTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1N5bWJvbExvY2F0aW9uID0iIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzQWRkcjJMaW5lTG9jYXRpb24gPSIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNUcmFjZXZpZXdMb2NhdGlvbiA9IiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0gICAgICAgIG1TdG9yZSA9IHN0b3JlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0U3RvcmUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RvcmU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGhyZWFkUmVmcmVzaEludGVydmFsKCkgewotICAgICAgICByZXR1cm4gc1RocmVhZFJlZnJlc2hJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUmVmcmVzaEludGVydmFsKGludCBwb3J0KSB7Ci0gICAgICAgIHNUaHJlYWRSZWZyZXNoSW50ZXJ2YWwgPSBwb3J0OwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nIGdldFN5bWJvbERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHNTeW1ib2xMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3ltYm9sc0xvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICBzU3ltYm9sTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldEFkZHIyTGluZSgpIHsKLSAgICAgICAgcmV0dXJuIHNBZGRyMkxpbmVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWRkcjJMaW5lTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHNBZGRyMkxpbmVMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYWNldmlldygpIHsKLSAgICAgICAgcmV0dXJuIHNUcmFjZXZpZXdMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJhY2V2aWV3TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHNUcmFjZXZpZXdMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0RldmljZVBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0RldmljZVBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTY5MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9EZXZpY2VQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZG1QcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklDbGllbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkRlYnVnZ2VyU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlLkRldmljZVN0YXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEEgZGlzcGxheSBvZiBib3RoIHRoZSBkZXZpY2VzIGFuZCB0aGVpciBjbGllbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGV2aWNlUGFuZWwgZXh0ZW5kcyBQYW5lbCBpbXBsZW1lbnRzIElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICBJRGV2aWNlQ2hhbmdlTGlzdGVuZXIsIElDbGllbnRDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQ09MX05BTUVfU0VSSUFMID0gImRldmljZVBhbmVsLkNvbDAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTF9QSURfU1RBVEUgPSAiZGV2aWNlUGFuZWwuQ29sMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQ09MX1BPUlRfQlVJTEQgPSAiZGV2aWNlUGFuZWwuQ29sNCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERVZJQ0VfQ09MX1NFUklBTCA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFVklDRV9DT0xfU1RBVEUgPSAxOwotICAgIC8vIGNvbCAyLCAzIG5vdCB1c2VkLgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERVZJQ0VfQ09MX0JVSUxEID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDTElFTlRfQ09MX05BTUUgPSAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDTElFTlRfQ09MX1BJRCA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENMSUVOVF9DT0xfVEhSRUFEID0gMjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0xJRU5UX0NPTF9IRUFQID0gMzsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0xJRU5UX0NPTF9QT1JUID0gNDsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fV0lEVEggPSAxNjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OX1RIUkVBRCA9ICJ0aHJlYWQucG5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05fSEVBUCA9ICJoZWFwLnBuZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OX0hBTFQgPSAiaGFsdC5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUNPTl9HQyA9ICJnYy5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUNPTl9IUFJPRiA9ICJocHJvZi5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUNPTl9UUkFDSU5HX1NUQVJUID0gInRyYWNpbmdfc3RhcnQucG5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05fVFJBQ0lOR19TVE9QID0gInRyYWNpbmdfc3RvcC5wbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElEZXZpY2UgbUN1cnJlbnREZXZpY2U7Ci0gICAgcHJpdmF0ZSBDbGllbnQgbUN1cnJlbnRDbGllbnQ7Ci0KLSAgICBwcml2YXRlIFRyZWUgbVRyZWU7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIG1UcmVlVmlld2VyOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBtRGV2aWNlSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtRW11bGF0b3JJbWFnZTsKLQotICAgIHByaXZhdGUgSW1hZ2UgbVRocmVhZEltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgbUhlYXBJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1XYWl0aW5nSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtRGVidWdnZXJJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1EZWJ1Z0Vycm9ySW1hZ2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJVWlTZWxlY3Rpb25MaXN0ZW5lcj4gbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVVpU2VsZWN0aW9uTGlzdGVuZXI+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJRGV2aWNlPiBtRGV2aWNlc1RvRXhwYW5kID0gbmV3IEFycmF5TGlzdDxJRGV2aWNlPigpOwotCi0gICAgcHJpdmF0ZSBJSW1hZ2VMb2FkZXIgbUxvYWRlcjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtQWR2YW5jZWRQb3J0U3VwcG9ydDsKLQotICAgIC8qKgotICAgICAqIEEgQ29udGVudCBwcm92aWRlciBmb3IgdGhlIHtAbGluayBUcmVlVmlld2VyfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGlucHV0IGlzIGEge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0uIEZpcnN0IGxldmVsIGVsZW1lbnRzIGFyZSB7QGxpbmsgSURldmljZX0gb2JqZWN0cywKLSAgICAgKiBhbmQgc2Vjb25kIGxldmVsIGVsZW1lbnRzIGFyZSB7QGxpbmsgQ2xpZW50fSBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJRGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoSURldmljZSlwYXJlbnRFbGVtZW50KS5nZXRDbGllbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsaWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKENsaWVudCllbGVtZW50KS5nZXREZXZpY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURldmljZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKElEZXZpY2UpZWxlbWVudCkuaGFzQ2xpZW50cygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDbGllbnRzIG5ldmVyIGhhdmUgY2hpbGRyZW4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFuZHJvaWREZWJ1Z0JyaWRnZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEFuZHJvaWREZWJ1Z0JyaWRnZSlpbnB1dEVsZW1lbnQpLmdldERldmljZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBMYWJlbCBQcm92aWRlciBmb3IgdGhlIHtAbGluayBUcmVlVmlld2VyfSBpbiB7QGxpbmsgRGV2aWNlUGFuZWx9LiBJdCBwcm92aWRlcwotICAgICAqIGxhYmVscyBhbmQgaW1hZ2VzIGZvciB7QGxpbmsgSURldmljZX0gYW5kIHtAbGluayBDbGllbnR9IG9iamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSBERVZJQ0VfQ09MX1NFUklBTCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSURldmljZSkgewotICAgICAgICAgICAgICAgIElEZXZpY2UgZGV2aWNlID0gKElEZXZpY2UpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmlzRW11bGF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUVtdWxhdG9ySW1hZ2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VJbWFnZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsaWVudCkgewotICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSAoQ2xpZW50KWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQ2xpZW50RGF0YSBjZCA9IGNsaWVudC5nZXRDbGllbnREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX0NPTF9OQU1FOgotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjZC5nZXREZWJ1Z2dlckNvbm5lY3Rpb25TdGF0dXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGQVVMVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQUlUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVdhaXRpbmdJbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFUVEFDSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbURlYnVnZ2VySW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1EZWJ1Z0Vycm9ySW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfQ09MX1RIUkVBRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQuaXNUaHJlYWRVcGRhdGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRocmVhZEltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX0NPTF9IRUFQOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudC5pc0hlYXBVcGRhdGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUhlYXBJbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURldmljZSkgewotICAgICAgICAgICAgICAgIElEZXZpY2UgZGV2aWNlID0gKElEZXZpY2UpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVWSUNFX0NPTF9TRVJJQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmdldFNlcmlhbE51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFVklDRV9DT0xfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3RhdGVTdHJpbmcoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERVZJQ0VfQ09MX0JVSUxEOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGRldmljZS5nZXRQcm9wZXJ0eShJRGV2aWNlLlBST1BfQlVJTERfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlYnVnZ2FibGUgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0RFQlVHR0FCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuaXNFbXVsYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdmROYW1lID0gZGV2aWNlLmdldEF2ZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2ZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkTmFtZSA9ICI/IjsgLy8gdGhlIGRldmljZSBpcyBwcm9iYWJseSBub3Qgb25saW5lIHlldCwgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgaXRzIEFWRCBuYW1lIGp1c3QgeWV0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z2dhYmxlICE9IG51bGwgJiYgZGVidWdnYWJsZS5lcXVhbHMoIjEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyBbJTIkcywgZGVidWddIiwgYXZkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyBbJTIkc10iLCBhdmROYW1lLCB2ZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnZ2FibGUgIT0gbnVsbCAmJiBkZWJ1Z2dhYmxlLmVxdWFscygiMSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzLCBkZWJ1ZyIsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHMiLCB2ZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xpZW50KSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50IGNsaWVudCA9IChDbGllbnQpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBDbGllbnREYXRhIGNkID0gY2xpZW50LmdldENsaWVudERhdGEoKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfQ09MX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNkLmdldENsaWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIj8iOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9DT0xfUElEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoY2QuZ2V0UGlkKCkpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9DT0xfUE9SVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWR2YW5jZWRQb3J0U3VwcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gY2xpZW50LmdldERlYnVnZ2VyTGlzdGVuUG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0U3RyaW5nID0gIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFN0cmluZyA9IEludGVnZXIudG9TdHJpbmcocG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQuaXNTZWxlY3RlZENsaWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzIC8gJTIkZCIsIHBvcnRTdHJpbmcsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5nZXRTZWxlY3RlZERlYnVnUG9ydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9ydFN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBtZXRob2RzIHRoYXQgZGVhbHMKLSAgICAgKiB3aXRoIHtAbGluayBJRGV2aWNlfSBhbmQge0BsaW5rIENsaWVudH0gc2VsZWN0aW9uIGNoYW5nZXMgY29taW5nIGZyb20gdGhlIHVpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVVpU2VsZWN0aW9uTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIGEgbmV3IHtAbGluayBJRGV2aWNlfSBhbmQge0BsaW5rIENsaWVudH0gYXJlIHNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0ZWREZXZpY2UgdGhlIHNlbGVjdGVkIGRldmljZS4gSWYgbnVsbCwgbm8gZGV2aWNlcyBhcmUgc2VsZWN0ZWQuCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3RlZENsaWVudCBUaGUgc2VsZWN0ZWQgY2xpZW50LiBJZiBudWxsLCBubyBjbGllbnRzIGFyZSBzZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSURldmljZSBzZWxlY3RlZERldmljZSwgQ2xpZW50IHNlbGVjdGVkQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgRGV2aWNlUGFuZWx9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbG9hZGVyCi0gICAgICogQHBhcmFtIGFkdmFuY2VkUG9ydFN1cHBvcnQgaWYgdHJ1ZSB0aGUgZGV2aWNlIHBhbmVsIHdpbGwgYWRkIHN1cHBvcnQgZm9yIHNlbGVjdGVkIGNsaWVudCBwb3J0Ci0gICAgICogYW5kIGRpc3BsYXkgdGhlIHBvcnRzIGluIHRoZSB1aS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGV2aWNlUGFuZWwoSUltYWdlTG9hZGVyIGxvYWRlciwgYm9vbGVhbiBhZHZhbmNlZFBvcnRTdXBwb3J0KSB7Ci0gICAgICAgIG1Mb2FkZXIgPSBsb2FkZXI7Ci0gICAgICAgIG1BZHZhbmNlZFBvcnRTdXBwb3J0ID0gYWR2YW5jZWRQb3J0U3VwcG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihJVWlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoSVVpU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBsb2FkSW1hZ2VzKHBhcmVudC5nZXREaXNwbGF5KCksIG1Mb2FkZXIpOwotCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0cmVlIGFuZCBpdHMgY29sdW1uCi0gICAgICAgIG1UcmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgbVRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbVRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVHJlZUNvbHVtbihtVHJlZSwgIk5hbWUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaG9tZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19DT0xfTkFNRV9TRVJJQUwsIHN0b3JlKTsKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVHJlZUNvbHVtbihtVHJlZSwgIiIsIFNXVC5MRUZULCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIk9mZmxpbmUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfQ09MX1BJRF9TVEFURSwgc3RvcmUpOwotCi0gICAgICAgIFRyZWVDb2x1bW4gY29sID0gbmV3IFRyZWVDb2x1bW4obVRyZWUsIFNXVC5OT05FKTsKLSAgICAgICAgY29sLnNldFdpZHRoKElDT05fV0lEVEggKyA4KTsKLSAgICAgICAgY29sLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0gICAgICAgIGNvbCA9IG5ldyBUcmVlQ29sdW1uKG1UcmVlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbC5zZXRXaWR0aChJQ09OX1dJRFRIICsgOCk7Ci0gICAgICAgIGNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICIiLCBTV1QuTEVGVCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICI5OTk5LTk5OTkiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfQ09MX1BPUlRfQlVJTEQsIHN0b3JlKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRyZWUgdmlld2VyCi0gICAgICAgIG1UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIobVRyZWUpOwotCi0gICAgICAgIC8vIG1ha2UgdGhlIGRldmljZSBhdXRvIGV4cGFuZGVkLgotICAgICAgICBtVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQotICAgICAgICAvLyBzZXQgdXAgdGhlIGNvbnRlbnQgYW5kIGxhYmVsIHByb3ZpZGVycy4KLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIG1UcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgbVRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIG1UcmVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBwcm9wZXIgY29udHJvbCBpbnNpZGUgdGhlIHBhbmVsLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtVHJlZS5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RDcmVhdGlvbigpIHsKLSAgICAgICAgLy8gYXNrIGZvciBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBpbiBBbmRyb2lkRGVidWdCcmlkZ2UgKGEgbmV3IG9uZSBpcyBjcmVhdGVkIHdoZW4KLSAgICAgICAgLy8gYWRiIGlzIHJlc3RhcnRlZCBmcm9tIGEgZGlmZmVyZW50IGxvY2F0aW9uKSwgSURldmljZSBhbmQgQ2xpZW50IG9iamVjdHMuCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGREZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuYWRkRGV2aWNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGRDbGllbnRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlQ2xpZW50Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQge0BsaW5rIENsaWVudH0uIE1heSBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnQgZ2V0U2VsZWN0ZWRDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudENsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB7QGxpbmsgSURldmljZX0uIElmIGEge0BsaW5rIENsaWVudH0gaXMgc2VsZWN0ZWQsIGl0IHJldHVybnMgdGhlCi0gICAgICogSURldmljZSBvYmplY3QgY29udGFpbmluZyB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBJRGV2aWNlIGdldFNlbGVjdGVkRGV2aWNlKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnREZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogS2lsbHMgdGhlIHNlbGVjdGVkIHtAbGluayBDbGllbnR9IGJ5IHNlbmRpbmcgaXRzIFZNIGEgaGFsdCBjb21tYW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGtpbGxTZWxlY3RlZENsaWVudCgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50Q2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBtQ3VycmVudENsaWVudDsKLQotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgZGV2aWNlLgotICAgICAgICAgICAgVHJlZVBhdGggdHJlZVBhdGggPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgbUN1cnJlbnREZXZpY2UgfSk7Ci0gICAgICAgICAgICBUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSBuZXcgVHJlZVNlbGVjdGlvbih0cmVlUGF0aCk7Ci0gICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24odHJlZVNlbGVjdGlvbik7Ci0KLSAgICAgICAgICAgIGNsaWVudC5raWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZXMgYSBHQyBvbiB0aGUgc2VsZWN0ZWQge0BsaW5rIENsaWVudH0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VHY09uU2VsZWN0ZWRDbGllbnQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudENsaWVudC5leGVjdXRlR2FyYmFnZUNvbGxlY3RvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHVtcEhwcm9mKCkgewotICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRDbGllbnQuZHVtcEhwcm9mKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b2dnbGVNZXRob2RQcm9maWxpbmcoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudENsaWVudC50b2dnbGVNZXRob2RQcm9maWxpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRIZWFwT25TZWxlY3RlZENsaWVudChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRDbGllbnQuc2V0SGVhcFVwZGF0ZUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRUaHJlYWRPblNlbGVjdGVkQ2xpZW50KGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudENsaWVudC5zZXRUaHJlYWRVcGRhdGVFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0gaXMgc3RhcnRlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBzZW50IGZyb20gYSBub24gVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBicmlkZ2UgdGhlIG5ldyB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyI3NlcnZlckNoYW5nZWQoQW5kcm9pZERlYnVnQnJpZGdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJyaWRnZUNoYW5nZWQoZmluYWwgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSkgewotICAgICAgICBpZiAobVRyZWUuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBleGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVHJlZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB1cCB0aGUgZGF0YSBzb3VyY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRJbnB1dChicmlkZ2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIGEgcG9zc2libGUgc2VsZWN0aW9uIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJlZSBpcyBkaXNwb3NlZCwgd2UgbmVlZCB0byBkbyBzb21ldGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgbGlzdGVuZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVEZXZpY2VDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVDbGllbnRDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsIGN1cnJlbnQgZGV2aWNlcyBhcmUgb2Jzb2xldGUKLSAgICAgICAgc3luY2hyb25pemVkIChtRGV2aWNlc1RvRXhwYW5kKSB7Ci0gICAgICAgICAgICBtRGV2aWNlc1RvRXhwYW5kLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gdGhlIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byB0aGUge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBuZXcgZGV2aWNlLgotICAgICAqCi0gICAgICogQHNlZSBJRGV2aWNlQ2hhbmdlTGlzdGVuZXIjZGV2aWNlQ29ubmVjdGVkKElEZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV2aWNlQ29ubmVjdGVkKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGV4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmIChtVHJlZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBhbGwKLSAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgbGlzdGVuZXIgb2YgYSBwb3NzaWJsZSBzZWxlY3Rpb24gY2hhbmdlLgotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0cmVlIGlzIGRpc3Bvc2VkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZy4KLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RlbmVyLgotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKERldmljZVBhbmVsLnRoaXMpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlQ2xpZW50Q2hhbmdlTGlzdGVuZXIoRGV2aWNlUGFuZWwudGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGhhdmUgY2xpZW50cyB5ZXQsIGl0J2xsIG5lZWQgdG8gYmUgbWFudWFsbHkgZXhwYW5kZWQgd2hlbiBpdCBnZXRzIHRoZW0uCi0gICAgICAgIGlmIChkZXZpY2UuaGFzQ2xpZW50cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1EZXZpY2VzVG9FeHBhbmQpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlc1RvRXhwYW5kLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIHRoZSBhIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgbmV3IGRldmljZS4KLSAgICAgKgotICAgICAqIEBzZWUgSURldmljZUNoYW5nZUxpc3RlbmVyI2RldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlIGRldmljZSkgewotICAgICAgICBkZXZpY2VDb25uZWN0ZWQoZGV2aWNlKTsKLQotICAgICAgICAvLyBqdXN0IGluIGNhc2UsIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGRldmljZXMgdG8gZXhwYW5kLgotICAgICAgICBzeW5jaHJvbml6ZWQgKG1EZXZpY2VzVG9FeHBhbmQpIHsKLSAgICAgICAgICAgIG1EZXZpY2VzVG9FeHBhbmQucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBkZXZpY2UgZGF0YSBjaGFuZ2VkLCBvciB3aGVuIGNsaWVudHMgYXJlIHN0YXJ0ZWQvdGVybWluYXRlZCBvbiB0aGUgZGV2aWNlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRoYXQgd2FzIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIGNoYW5nZU1hc2sgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDaGFuZ2VkKElEZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV2aWNlQ2hhbmdlZChmaW5hbCBJRGV2aWNlIGRldmljZSwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgYm9vbGVhbiBleHBhbmQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkIChtRGV2aWNlc1RvRXhwYW5kKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBtRGV2aWNlc1RvRXhwYW5kLmluZGV4T2YoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UuaGFzQ2xpZW50cygpICYmIGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbURldmljZXNUb0V4cGFuZC5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgIGV4cGFuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBib29sZWFuIGZpbmFsRXhwYW5kID0gZXhwYW5kOwotCi0gICAgICAgIGV4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmIChtVHJlZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgc2VsZWN0ZWQuIFRoaXMgaXMgZG9uZSBpbiBjYXNlIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBvZiB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlIHdhcyBraWxsZWQuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBtYW51YWxseSByZXNlbGVjdCB0aGUgZGV2aWNlLgotCi0gICAgICAgICAgICAgICAgICAgIElEZXZpY2Ugc2VsZWN0ZWREZXZpY2UgPSBnZXRTZWxlY3RlZERldmljZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGRldmljZQotICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIGRldmljZSB3YXMgdGhlIGNoYW5nZWQgZGV2aWNlIGFuZCB0aGUgbmV3IHNlbGVjdGlvbiBpcwotICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSwgd2UgcmVzZWxlY3QgdGhlIGRldmljZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGV2aWNlID09IGRldmljZSAmJiBtVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgVHJlZVNlbGVjdGlvbihuZXcgVHJlZVBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGRldmljZSB9KSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiBhIHBvc3NpYmxlIHNlbGVjdGlvbiBjaGFuZ2UuCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbEV4cGFuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShkZXZpY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJlZSBpcyBkaXNwb3NlZCwgd2UgbmVlZCB0byBkbyBzb21ldGhpbmcuCi0gICAgICAgICAgICAgICAgICAgIC8vIGxldHMgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBsaXN0ZW5lci4KLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXIoRGV2aWNlUGFuZWwudGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVEZXZpY2VDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZUNsaWVudENoYW5nZUxpc3RlbmVyKERldmljZVBhbmVsLnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGFuIGV4aXN0aW5nIGNsaWVudCBpbmZvcm1hdGlvbiBjaGFuZ2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGNsaWVudCB0aGUgdXBkYXRlZCBjbGllbnQuCi0gICAgICogQHBhcmFtIGNoYW5nZU1hc2sgdGhlIGJpdCBtYXNrIGRlc2NyaWJpbmcgdGhlIGNoYW5nZWQgcHJvcGVydGllcy4gSXQgY2FuIGNvbnRhaW4KLSAgICAgKiBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHtAbGluayBDbGllbnQjQ0hBTkdFX0lORk99LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX0RFQlVHR0VSX1NUQVRVU30sIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9USFJFQURfREFUQX0sIHtAbGluayBDbGllbnQjQ0hBTkdFX0hFQVBfTU9ERX0sCi0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfTkFUSVZFX0hFQVBfREFUQX0KLSAgICAgKgotICAgICAqIEBzZWUgSUNsaWVudENoYW5nZUxpc3RlbmVyI2NsaWVudENoYW5nZWQoQ2xpZW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xpZW50Q2hhbmdlZChmaW5hbCBDbGllbnQgY2xpZW50LCBmaW5hbCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICBleGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVRyZWUuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGNsaWVudAotICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKGNsaWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9ERUJVR0dFUl9TVEFUVVMpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50LkNIQU5HRV9ERUJVR0dFUl9TVEFUVVMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldERlYnVnZ2VyQ29ubmVjdGlvblN0YXR1cygpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2VyU3RhdHVzLldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIGlzIGV4cGFuZGVkLiBOb3JtYWxseSB0aGUgc2V0U2VsZWN0aW9uIGJlbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGF1dG8gZXhwYW5kLCBidXQgdGhlIGNoaWxkcmVuIG9mIGRldmljZSBtYXkgbm90IGFscmVhZHkgZXhpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgdGltZS4gRm9yY2luZyBhbiBleHBhbmQgd2lsbCBtYWtlIHRoZSBUcmVlVmlld2VyIGNyZWF0ZSB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICAgSURldmljZSBkZXZpY2UgPSBjbGllbnQuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShkZXZpY2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShkZXZpY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW5kIHNldCB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0aCB0cmVlUGF0aCA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyBkZXZpY2UsIGNsaWVudH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gbmV3IFRyZWVTZWxlY3Rpb24odHJlZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHRyZWVTZWxlY3Rpb24pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkdmFuY2VkUG9ydFN1cHBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2V0QXNTZWxlY3RlZENsaWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIGEgcG9zc2libGUgc2VsZWN0aW9uIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhkZXZpY2UsIGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0cmVlIGlzIGRpc3Bvc2VkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZy4KLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RlbmVyLgotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcihEZXZpY2VQYW5lbC50aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKERldmljZVBhbmVsLnRoaXMpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlQ2xpZW50Q2hhbmdlTGlzdGVuZXIoRGV2aWNlUGFuZWwudGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcyhEaXNwbGF5IGRpc3BsYXksIElJbWFnZUxvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgaWYgKG1EZXZpY2VJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGV2aWNlSW1hZ2UgPSBJbWFnZUhlbHBlci5sb2FkSW1hZ2UobG9hZGVyLCBkaXNwbGF5LCAiZGV2aWNlLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9XSURUSCwgSUNPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FbXVsYXRvckltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbXVsYXRvckltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgImVtdWxhdG9yLnBuZyIsIElDT05fV0lEVEgsIElDT05fV0lEVEgsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGhyZWFkSW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbVRocmVhZEltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGxvYWRlciwgZGlzcGxheSwgSUNPTl9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgIElDT05fV0lEVEgsIElDT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSGVhcEltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1IZWFwSW1hZ2UgPSBJbWFnZUhlbHBlci5sb2FkSW1hZ2UobG9hZGVyLCBkaXNwbGF5LCBJQ09OX0hFQVAsCi0gICAgICAgICAgICAgICAgICAgIElDT05fV0lEVEgsIElDT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVdhaXRpbmdJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtV2FpdGluZ0ltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgImRlYnVnLXdhaXQucG5nIiwgSUNPTl9XSURUSCwgSUNPTl9XSURUSCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobURlYnVnZ2VySW1hZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbURlYnVnZ2VySW1hZ2UgPSBJbWFnZUhlbHBlci5sb2FkSW1hZ2UobG9hZGVyLCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAiZGVidWctYXR0YWNoLnBuZyIsIElDT05fV0lEVEgsIElDT05fV0lEVEgsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobURlYnVnRXJyb3JJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGVidWdFcnJvckltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGxvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgImRlYnVnLWVycm9yLnBuZyIsIElDT05fV0lEVEgsIElDT05fV0lEVEgsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZGlzcGxheSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBkIHRoZSBkZXZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdGVTdHJpbmcoSURldmljZSBkKSB7Ci0gICAgICAgIERldmljZVN0YXRlIGRldmljZVN0YXRlID0gZC5nZXRTdGF0ZSgpOwotICAgICAgICBpZiAoZGV2aWNlU3RhdGUgPT0gRGV2aWNlU3RhdGUuT05MSU5FKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk9ubGluZSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlU3RhdGUgPT0gRGV2aWNlU3RhdGUuT0ZGTElORSkgewotICAgICAgICAgICAgcmV0dXJuICJPZmZsaW5lIjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VTdGF0ZSA9PSBEZXZpY2VTdGF0ZS5CT09UTE9BREVSKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkJvb3Rsb2FkZXIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICI/PyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHtAbGluayBSdW5uYWJsZX0gaW4gdGhlIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIHJ1bm5hYmxlIHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1UcmVlLmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRyZWUgaXMgZGlzcG9zZWQsIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nLiBsZXRzIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgbGlzdGVuZXIuCi0gICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVEZXZpY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVDbGllbnRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgc2VsZWN0aW9uCi0gICAgICAgIFRyZWVJdGVtW10gaXRlbXMgPSBtVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICBDbGllbnQgY2xpZW50ID0gbnVsbDsKLSAgICAgICAgSURldmljZSBkZXZpY2UgPSBudWxsOwotCi0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZW1zWzBdLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGllbnQpIHsKLSAgICAgICAgICAgICAgICBjbGllbnQgPSAoQ2xpZW50KW9iamVjdDsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBjbGllbnQuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElEZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSAoSURldmljZSlvYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBub3RpZnlMaXN0ZW5lcnMoZGV2aWNlLCBjbGllbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSURldmljZSBzZWxlY3RlZERldmljZSwgQ2xpZW50IHNlbGVjdGVkQ2xpZW50KSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZERldmljZSAhPSBtQ3VycmVudERldmljZSB8fCBzZWxlY3RlZENsaWVudCAhPSBtQ3VycmVudENsaWVudCkgewotICAgICAgICAgICAgbUN1cnJlbnREZXZpY2UgPSBzZWxlY3RlZERldmljZTsKLSAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50ID0gc2VsZWN0ZWRDbGllbnQ7Ci0KLSAgICAgICAgICAgIGZvciAoSVVpU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lciB3aXRoIGEgdHJ5L2NhdGNoLWFsbCB0byBtYWtlIHN1cmUgdGhpcyB0aHJlYWQgd29uJ3QgZGllCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBvZiBhbiB1bmNhdWdodCBleGNlcHRpb24gYmVmb3JlIGFsbCB0aGUgbGlzdGVuZXJzIHdlcmUgbm90aWZpZWQuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3RlZERldmljZSwgc2VsZWN0ZWRDbGllbnQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0VtdWxhdG9yQ29udHJvbFBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0VtdWxhdG9yQ29udHJvbFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTBkM2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9FbXVsYXRvckNvbnRyb2xQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5FbXVsYXRvckNvbnNvbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkVtdWxhdG9yQ29uc29sZS5Hc21Nb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5FbXVsYXRvckNvbnNvbGUuR3NtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5FbXVsYXRvckNvbnNvbGUuTmV0d29ya1N0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5Db29yZGluYXRlQ29udHJvbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb24uR3B4UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvY2F0aW9uLkttbFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5UcmFja0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5UcmFja0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb24uVHJhY2tQb2ludDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5XYXlQb2ludDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5XYXlQb2ludENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5XYXlQb2ludExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb24uR3B4UGFyc2VyLlRyYWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUGFuZWwgdG8gY29udHJvbCB0aGUgZW11bGF0b3IgdXNpbmcgRW11bGF0b3JDb25zb2xlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXVsYXRvckNvbnRyb2xQYW5lbCBleHRlbmRzIFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsIHsKLQotICAgIC8vIGRlZmF1bHQgbG9jYXRpb246IFBhdGlvIG91dHNpZGUgQ2hhcmxpZSdzCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZG91YmxlIERFRkFVTFRfTE9OR0lUVURFID0gLTEyMi4wODQwOTU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZG91YmxlIERFRkFVTFRfTEFUSVRVREUgPSAzNy40MjIwMDY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFRURfRk9STUFUID0gIlNwZWVkOiAlMSRkWCI7Ci0KLQotICAgIC8qKgotICAgICAqIE1hcCBiZXR3ZWVuIHRoZSBkaXNwbGF5IGdzbSBtb2RlIGFuZCB0aGUgaW50ZXJuYWwgdGFnIHVzZWQgYnkgdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW11bXSBHU01fTU9ERVMgPSBuZXcgU3RyaW5nW11bXSB7Ci0gICAgICAgIHsgInVucmVnaXN0ZXJlZCIsIEdzbU1vZGUuVU5SRUdJU1RFUkVELmdldFRhZygpIH0sCi0gICAgICAgIHsgImhvbWUiLCBHc21Nb2RlLkhPTUUuZ2V0VGFnKCkgfSwKLSAgICAgICAgeyAicm9hbWluZyIsIEdzbU1vZGUuUk9BTUlORy5nZXRUYWcoKSB9LAotICAgICAgICB7ICJzZWFyY2hpbmciLCBHc21Nb2RlLlNFQVJDSElORy5nZXRUYWcoKSB9LAotICAgICAgICB7ICJkZW5pZWQiLCBHc21Nb2RlLkRFTklFRC5nZXRUYWcoKSB9LAotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBORVRXT1JLX1NQRUVEUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICJGdWxsIiwKLSAgICAgICAgIkdTTSIsCi0gICAgICAgICJIU0NTRCIsCi0gICAgICAgICJHUFJTIiwKLSAgICAgICAgIkVER0UiLAotICAgICAgICAiVU1UUyIsCi0gICAgICAgICJIU0RQQSIsCi0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIE5FVFdPUktfTEFURU5DSUVTID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgIk5vbmUiLAotICAgICAgICAiR1BSUyIsCi0gICAgICAgICJFREdFIiwKLSAgICAgICAgIlVNVFMiLAotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnRbXSBQTEFZX1NQRUVEUyA9IG5ldyBpbnRbXSB7IDEsIDIsIDUsIDEwLCAyMCwgNTAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRV9QSE9ORV9OVU1CRVIgPSAiXlsrIzAtOV0rJCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfV0FZUE9JTlRfQ09MX05BTUUgPSAiZW11bGF0b3JDb250cm9sLndheXBvaW50Lm5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1dBWVBPSU5UX0NPTF9MT05HSVRVREUgPSAiZW11bGF0b3JDb250cm9sLndheXBvaW50LmxvbmdpdHVkZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfV0FZUE9JTlRfQ09MX0xBVElUVURFID0gImVtdWxhdG9yQ29udHJvbC53YXlwb2ludC5sYXRpdHVkZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfV0FZUE9JTlRfQ09MX0VMRVZBVElPTiA9ICJlbXVsYXRvckNvbnRyb2wud2F5cG9pbnQuZWxldmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19XQVlQT0lOVF9DT0xfREVTQ1JJUFRJT04gPSAiZW11bGF0b3JDb250cm9sLndheXBvaW50LmRlc2MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1RSQUNLX0NPTF9OQU1FID0gImVtdWxhdG9yQ29udHJvbC50cmFjay5uYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19UUkFDS19DT0xfQ09VTlQgPSAiZW11bGF0b3JDb250cm9sLnRyYWNrLmNvdW50IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19UUkFDS19DT0xfRklSU1QgPSAiZW11bGF0b3JDb250cm9sLnRyYWNrLmZpcnN0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19UUkFDS19DT0xfTEFTVCA9ICJlbXVsYXRvckNvbnRyb2wudHJhY2subGFzdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfVFJBQ0tfQ09MX0NPTU1FTlQgPSAiZW11bGF0b3JDb250cm9sLnRyYWNrLmNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElJbWFnZUxvYWRlciBtSW1hZ2VMb2FkZXI7Ci0KLSAgICBwcml2YXRlIEVtdWxhdG9yQ29uc29sZSBtRW11bGF0b3JDb25zb2xlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVBhcmVudDsKLQotICAgIHByaXZhdGUgTGFiZWwgbVZvaWNlTGFiZWw7Ci0gICAgcHJpdmF0ZSBDb21ibyBtVm9pY2VNb2RlOwotICAgIHByaXZhdGUgTGFiZWwgbURhdGFMYWJlbDsKLSAgICBwcml2YXRlIENvbWJvIG1EYXRhTW9kZTsKLSAgICBwcml2YXRlIExhYmVsIG1TcGVlZExhYmVsOwotICAgIHByaXZhdGUgQ29tYm8gbU5ldHdvcmtTcGVlZDsKLSAgICBwcml2YXRlIExhYmVsIG1MYXRlbmN5TGFiZWw7Ci0gICAgcHJpdmF0ZSBDb21ibyBtTmV0d29ya0xhdGVuY3k7Ci0KLSAgICBwcml2YXRlIExhYmVsIG1OdW1iZXJMYWJlbDsKLSAgICBwcml2YXRlIFRleHQgbVBob25lTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVZvaWNlQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TbXNCdXR0b247Ci0KLSAgICBwcml2YXRlIExhYmVsIG1NZXNzYWdlTGFiZWw7Ci0gICAgcHJpdmF0ZSBUZXh0IG1TbXNNZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbUNhbGxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUNhbmNlbEJ1dHRvbjsKLQotICAgIHByaXZhdGUgVGFiRm9sZGVyIG1Mb2NhdGlvbkZvbGRlcnM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGVjaW1hbEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU2V4YWdlc2ltYWxCdXR0b247Ci0gICAgcHJpdmF0ZSBDb29yZGluYXRlQ29udHJvbHMgbUxvbmdpdHVkZUNvbnRyb2xzOwotICAgIHByaXZhdGUgQ29vcmRpbmF0ZUNvbnRyb2xzIG1MYXRpdHVkZUNvbnRyb2xzOwotICAgIHByaXZhdGUgQnV0dG9uIG1HcHhVcGxvYWRCdXR0b247Ci0gICAgcHJpdmF0ZSBUYWJsZSBtR3B4V2F5UG9pbnRUYWJsZTsKLSAgICBwcml2YXRlIFRhYmxlIG1HcHhUcmFja1RhYmxlOwotICAgIHByaXZhdGUgQnV0dG9uIG1LbWxVcGxvYWRCdXR0b247Ci0gICAgcHJpdmF0ZSBUYWJsZSBtS21sV2F5UG9pbnRUYWJsZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1QbGF5R3B4QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1HcHhCYWNrd2FyZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtR3B4Rm9yd2FyZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtR3B4U3BlZWRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVBsYXlLbWxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUttbEJhY2t3YXJkQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1LbWxGb3J3YXJkQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1LbWxTcGVlZEJ1dHRvbjsKLQotICAgIHByaXZhdGUgSW1hZ2UgbVBsYXlJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1QYXVzZUltYWdlOwotCi0gICAgcHJpdmF0ZSBUaHJlYWQgbVBsYXlpbmdUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QbGF5aW5nVHJhY2s7Ci0gICAgcHJpdmF0ZSBpbnQgbVBsYXlEaXJlY3Rpb24gPSAxOwotICAgIHByaXZhdGUgaW50IG1TcGVlZDsKLSAgICBwcml2YXRlIGludCBtU3BlZWRJbmRleDsKLQotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0aW9uQWRhcHRlciBtRGlyZWN0aW9uQnV0dG9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKWUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoYi5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIGJhc2ljYWxseSB0aGUgYnV0dG9uIHdhcyB1bnNlbGVjdGVkLCB3aGljaCB3ZSBkb24ndCBhbGxvdy4KLSAgICAgICAgICAgICAgICAvLyBzbyB3ZSByZXNlbGVjdCBpdC4KLSAgICAgICAgICAgICAgICBiLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyBoYW5kbGUgc2VsZWN0aW9uIGNoYW5nZS4KLSAgICAgICAgICAgIGlmIChiID09IG1HcHhGb3J3YXJkQnV0dG9uIHx8IGIgPT0gbUttbEZvcndhcmRCdXR0b24pIHsKLSAgICAgICAgICAgICAgICBtR3B4QmFja3dhcmRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtR3B4Rm9yd2FyZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUttbEJhY2t3YXJkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUttbEZvcndhcmRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1QbGF5RGlyZWN0aW9uID0gMTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3B4QmFja3dhcmRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1HcHhGb3J3YXJkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUttbEJhY2t3YXJkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICBtS21sRm9yd2FyZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgIG1QbGF5RGlyZWN0aW9uID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25BZGFwdGVyIG1TcGVlZEJ1dHRvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIG1TcGVlZEluZGV4ID0gKG1TcGVlZEluZGV4KzEpICUgUExBWV9TUEVFRFMubGVuZ3RoOwotICAgICAgICAgICAgbVNwZWVkID0gUExBWV9TUEVFRFNbbVNwZWVkSW5kZXhdOwotCi0gICAgICAgICAgICBtR3B4U3BlZWRCdXR0b24uc2V0VGV4dChTdHJpbmcuZm9ybWF0KFNQRUVEX0ZPUk1BVCwgbVNwZWVkKSk7Ci0gICAgICAgICAgICBtR3B4UGxheUNvbnRyb2xzLnBhY2soKTsKLSAgICAgICAgICAgIG1LbWxTcGVlZEJ1dHRvbi5zZXRUZXh0KFN0cmluZy5mb3JtYXQoU1BFRURfRk9STUFULCBtU3BlZWQpKTsKLSAgICAgICAgICAgIG1LbWxQbGF5Q29udHJvbHMucGFjaygpOwotCi0gICAgICAgICAgICBpZiAobVBsYXlpbmdUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbGF5aW5nVGhyZWFkLmludGVycnVwdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgIH07Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUttbFBsYXlDb250cm9sczsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtR3B4UGxheUNvbnRyb2xzOwotCi0KLSAgICBwdWJsaWMgRW11bGF0b3JDb250cm9sUGFuZWwoSUltYWdlTG9hZGVyIGltYWdlTG9hZGVyKSB7Ci0gICAgICAgIG1JbWFnZUxvYWRlciA9IGltYWdlTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyBkZXZpY2UgaXMgc2VsZWN0ZWQuIFRoZSBuZXcgZGV2aWNlIGNhbiBiZSBhY2Nlc3NlZAotICAgICAqIHdpdGgge0BsaW5rICNnZXRDdXJyZW50RGV2aWNlKCl9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGV2aWNlU2VsZWN0ZWQoKSB7Ci0gICAgICAgIGhhbmRsZU5ld0RldmljZShnZXRDdXJyZW50RGV2aWNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyBjbGllbnQgaXMgc2VsZWN0ZWQuIFRoZSBuZXcgY2xpZW50IGNhbiBiZSBhY2Nlc3NlZAotICAgICAqIHdpdGgge0BsaW5rICNnZXRDdXJyZW50Q2xpZW50KCl9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50U2VsZWN0ZWQoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29udHJvbCBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgc29tZSBpbmZvcm1hdGlvbi4gIFRoaXMgaXMKLSAgICAgKiBjYWxsZWQgb25jZSwgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nLCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAgICAgZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2NvbGxpbmdQYXJlbnQgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBzY29sbGluZ1BhcmVudC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICAgICAgc2NvbGxpbmdQYXJlbnQuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLSAgICAgICAgc2NvbGxpbmdQYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUoc2NvbGxpbmdQYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2NvbGxpbmdQYXJlbnQuc2V0Q29udGVudCh0b3ApOwotICAgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSByZXNpemUgZm9yIHRoZSBzY3JvbGxpbmcgdG8gd29yayAod2h5IGlzbid0IHRoYXQgZG9uZSBhdXRvbWF0aWNhbGx5PyE/KQotICAgICAgICBzY29sbGluZ1BhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gc2NvbGxpbmdQYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIHNjb2xsaW5nUGFyZW50LnNldE1pblNpemUodG9wLmNvbXB1dGVTaXplKHIud2lkdGgsIFNXVC5ERUZBVUxUKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNyZWF0ZVJhZGlvQ29udHJvbHModG9wKTsKLQotICAgICAgICBjcmVhdGVDYWxsQ29udHJvbHModG9wKTsKLQotICAgICAgICBjcmVhdGVMb2NhdGlvbkNvbnRyb2xzKHRvcCk7Ci0KLSAgICAgICAgZG9FbmFibGUoZmFsc2UpOwotCi0gICAgICAgIHRvcC5sYXlvdXQoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBzY29sbGluZ1BhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgIHNjb2xsaW5nUGFyZW50LnNldE1pblNpemUodG9wLmNvbXB1dGVTaXplKHIud2lkdGgsIFNXVC5ERUZBVUxUKSk7Ci0KLSAgICAgICAgcmV0dXJuIHNjb2xsaW5nUGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBSYWRpbyAob24vb2ZmL3JvYW1pbmcsIGZvciB2b2ljZS9kYXRhKSBjb250cm9scy4KLSAgICAgKiBAcGFyYW0gdG9wCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJhZGlvQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHRvcCkgewotICAgICAgICBHcm91cCBnMSA9IG5ldyBHcm91cCh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgZzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGcxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotICAgICAgICBnMS5zZXRUZXh0KCJUZWxlcGhvbnkgU3RhdHVzIik7Ci0KLSAgICAgICAgLy8gdGhlIGluc2lkZSBvZiB0aGUgZ3JvdXAgaXMgMiBjb21wb3NpdGUgc28gdGhhdCBhbGwgdGhlIGNvbHVtbiBvZiB0aGUgY29udHJvbHMgKG1haW5seQotICAgICAgICAvLyBjb21ib3MpIGhhdmUgdGhlIHNhbWUgd2lkdGgsIHdoaWxlIG5vdCB0YWtpbmcgdGhlIHdob2xlIHNjcmVlbiB3aWR0aAotICAgICAgICBDb21wb3NpdGUgaW5zaWRlR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGcxLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkJvdHRvbSA9IGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbkxlZnQgPSBnbC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgICAgIGluc2lkZUdyb3VwLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgbVZvaWNlTGFiZWwgPSBuZXcgTGFiZWwoaW5zaWRlR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbVZvaWNlTGFiZWwuc2V0VGV4dCgiVm9pY2U6Iik7Ci0gICAgICAgIG1Wb2ljZUxhYmVsLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCi0gICAgICAgIG1Wb2ljZU1vZGUgPSBuZXcgQ29tYm8oaW5zaWRlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtVm9pY2VNb2RlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBmb3IgKFN0cmluZ1tdIG1vZGUgOiBHU01fTU9ERVMpIHsKLSAgICAgICAgICAgIG1Wb2ljZU1vZGUuYWRkKG1vZGVbMF0pOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2ljZU1vZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0Vm9pY2VNb2RlKG1Wb2ljZU1vZGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1TcGVlZExhYmVsID0gbmV3IExhYmVsKGluc2lkZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TcGVlZExhYmVsLnNldFRleHQoIlNwZWVkOiIpOwotICAgICAgICBtU3BlZWRMYWJlbC5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQotICAgICAgICBtTmV0d29ya1NwZWVkID0gbmV3IENvbWJvKGluc2lkZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbU5ldHdvcmtTcGVlZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbW9kZSA6IE5FVFdPUktfU1BFRURTKSB7Ci0gICAgICAgICAgICBtTmV0d29ya1NwZWVkLmFkZChtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtTmV0d29ya1NwZWVkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldE5ldHdvcmtTcGVlZChtTmV0d29ya1NwZWVkLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtRGF0YUxhYmVsID0gbmV3IExhYmVsKGluc2lkZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1EYXRhTGFiZWwuc2V0VGV4dCgiRGF0YToiKTsKLSAgICAgICAgbURhdGFMYWJlbC5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQotICAgICAgICBtRGF0YU1vZGUgPSBuZXcgQ29tYm8oaW5zaWRlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtRGF0YU1vZGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nW10gbW9kZSA6IEdTTV9NT0RFUykgewotICAgICAgICAgICAgbURhdGFNb2RlLmFkZChtb2RlWzBdKTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YU1vZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0YU1vZGUobURhdGFNb2RlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtTGF0ZW5jeUxhYmVsID0gbmV3IExhYmVsKGluc2lkZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1MYXRlbmN5TGFiZWwuc2V0VGV4dCgiTGF0ZW5jeToiKTsKLSAgICAgICAgbUxhdGVuY3lMYWJlbC5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQotICAgICAgICBtTmV0d29ya0xhdGVuY3kgPSBuZXcgQ29tYm8oaW5zaWRlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtTmV0d29ya0xhdGVuY3kuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIG1vZGUgOiBORVRXT1JLX0xBVEVOQ0lFUykgewotICAgICAgICAgICAgbU5ldHdvcmtMYXRlbmN5LmFkZChtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtTmV0d29ya0xhdGVuY3kuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0TmV0d29ya0xhdGVuY3kobU5ldHdvcmtMYXRlbmN5LmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBub3cgYW4gZW1wdHkgbGFiZWwgdG8gdGFrZSB0aGUgcmVzdCBvZiB0aGUgd2lkdGggb2YgdGhlIGdyb3VwCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoZzEsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgVm9pY2UvU01TIGNhbGwvaGFuZyB1cCBjb250cm9scwotICAgICAqIEBwYXJhbSB0b3AKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2FsbENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSB0b3ApIHsKLSAgICAgICAgR3JpZExheW91dCBnbDsKLSAgICAgICAgR3JvdXAgZzIgPSBuZXcgR3JvdXAodG9wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGcyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLSAgICAgICAgZzIuc2V0VGV4dCgiVGVsZXBob255IEFjdGlvbnMiKTsKLQotICAgICAgICAvLyBob3Jpem9udGFsIGNvbXBvc2l0ZSBmb3IgbGFiZWwgKyB0ZXh0IGZpZWxkCi0gICAgICAgIENvbXBvc2l0ZSBwaG9uZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGcyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHBob25lQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkJvdHRvbSA9IGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbkxlZnQgPSBnbC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgICAgIHBob25lQ29tcC5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICAgIG1OdW1iZXJMYWJlbCA9IG5ldyBMYWJlbChwaG9uZUNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgbU51bWJlckxhYmVsLnNldFRleHQoIkluY29taW5nIG51bWJlcjoiKTsKLQotICAgICAgICBtUGhvbmVOdW1iZXIgPSBuZXcgVGV4dChwaG9uZUNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTEVGVCB8IFNXVC5TSU5HTEUpOwotICAgICAgICBtUGhvbmVOdW1iZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1QaG9uZU51bWJlci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBSZWVuYWJsZSB0aGUgd2lkZ2V0cyBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUgdGV4dC4KLSAgICAgICAgICAgICAgICAvLyBkb0VuYWJsZSBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBwaG9uZSBudW1iZXIgdG8gZW5hYmxlL2Rpc2FibGUgc29tZQotICAgICAgICAgICAgICAgIC8vIHdpZGdldHMuCi0gICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSB3ZSdyZSBnZXR0aW5nIGEgY2FsbGJhY2sgYXQgY3JlYXRpb24gdGltZSwgc28gd2UgY2FuJ3QKLSAgICAgICAgICAgICAgICAvLyBzdXBwb3NlIHRoYXQgd2UgYXJlIGVuYWJsZWQgd2hlbiB0aGUgdGV4dCBpcyBtb2RpZmllZC4uLgotICAgICAgICAgICAgICAgIGRvRW5hYmxlKG1FbXVsYXRvckNvbnNvbGUgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1Wb2ljZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGhvbmVDb21wLCBTV1QuUkFESU8pOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1Wb2ljZUJ1dHRvbi5zZXRUZXh0KCJWb2ljZSIpOwotICAgICAgICBtVm9pY2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1Wb2ljZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVZvaWNlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgbVZvaWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRvRW5hYmxlKHRydWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1Wb2ljZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbEJ1dHRvbi5zZXRUZXh0KCJDYWxsIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxCdXR0b24uc2V0VGV4dCgiU2VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVNtc0J1dHRvbiA9IG5ldyBCdXR0b24ocGhvbmVDb21wLCBTV1QuUkFESU8pOwotICAgICAgICBtU21zQnV0dG9uLnNldFRleHQoIlNNUyIpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1TbXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1TbXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgcmFkaW8gYnV0dG9ucywgd2UgY2FuIHB1dCBhIGxpc3RlbmVyIG9uIG9ubHkgb25lICh0aGV5Ci0gICAgICAgIC8vIGFyZSBib3RoIGNhbGxlZCBvbiBzZWxlY3QgYW5kIHVuc2VsZWN0IGV2ZW50LgotCi0gICAgICAgIG1NZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwocGhvbmVDb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLSAgICAgICAgbU1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbU1lc3NhZ2VMYWJlbC5zZXRUZXh0KCJNZXNzYWdlOiIpOwotICAgICAgICBtTWVzc2FnZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIG1TbXNNZXNzYWdlID0gbmV3IFRleHQocGhvbmVDb21wLCBTV1QuQk9SREVSIHwgU1dULkxFRlQgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIG1TbXNNZXNzYWdlLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSA3MDsKLSAgICAgICAgbVNtc01lc3NhZ2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gY29tcG9zaXRlIHRvIHB1dCB0aGUgMiBidXR0b25zIGhvcml6b250YWxseQotICAgICAgICBDb21wb3NpdGUgZzJCdXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShnMiwgU1dULk5PTkUpOwotICAgICAgICBnMkJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5XaWR0aCA9IGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGcyQnV0dG9uQ29tcC5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICAgIC8vIG5vdyBhIGJ1dHRvbiBiZWxvdyB0aGUgcGhvbmUgbnVtYmVyCi0gICAgICAgIG1DYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihnMkJ1dHRvbkNvbXAsIFNXVC5QVVNIKTsKLSAgICAgICAgbUNhbGxCdXR0b24uc2V0VGV4dCgiQ2FsbCIpOwotICAgICAgICBtQ2FsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUNhbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yQ29uc29sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVm9pY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kUmVzdWx0KG1FbXVsYXRvckNvbnNvbGUuY2FsbChtUGhvbmVOdW1iZXIuZ2V0VGV4dCgpLnRyaW0oKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmNvZGUgdGhlIG1lc3NhZ2UuIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgY2FycmlhZ2UgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIgYnkgdGhlIDIgY2hhcmFjdGVyIHN0cmluZyBcbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhpcyB0aGUgXCBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgZXNjYXBlZCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZUFsbCgpIGV4cGVjdHMgcmVnZXhwIHNvIFwgY2hhciBhcmUgZXNjYXBlZCB0d2ljZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbVNtc01lc3NhZ2UuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgiXFxcXCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcXFxcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgdGhlIG5vcm1hbCBsaW5lIGRlbGltaXRlciBpcyByZXR1cm5lZCBieSBUZXh0LmdldExpbmVEZWxpbWl0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgc2VlbXMgY29weSBwYXN0aW5nIHRleHQgY29taW5nIGZyb20gc29tZXdoZXJlIGVsc2UgY291bGQgaGF2ZSBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpbWl0ZWQuIEZvciB0aGlzIHJlYXNvbiwgd2UnbGwgcmVwbGFjZSBpcyBzZXZlcmFsIHN0ZXBzCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGR1YWwgQ1ItTEYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2VBbGwoIlxyXG4iLCAiXFxcXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgcmVtYWluaW5nIHN0YW5kIGFsb25lIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCJcbiIsICJcXFxcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSByZW1haW5pbmcgc3RhbmQgYWxvbmUgXHIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2VBbGwoIlxyIiwgIlxcXFxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZFJlc3VsdChtRW11bGF0b3JDb25zb2xlLnNlbmRTbXMobVBob25lTnVtYmVyLmdldFRleHQoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oZzJCdXR0b25Db21wLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1DYW5jZWxCdXR0b24uc2V0VGV4dCgiSGFuZyBVcCIpOwotICAgICAgICBtQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtQ2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbXVsYXRvckNvbnNvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVZvaWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZFJlc3VsdChtRW11bGF0b3JDb25zb2xlLmNhbmNlbENhbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG9uZU51bWJlci5nZXRUZXh0KCkudHJpbSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBMb2NhdGlvbiBjb250cm9scy4KLSAgICAgKiBAcGFyYW0gdG9wCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUxvY2F0aW9uQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHRvcCkgewotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBsLnNldFRleHQoIkxvY2F0aW9uIENvbnRyb2xzIik7Ci0KLSAgICAgICAgbUxvY2F0aW9uRm9sZGVycyA9IG5ldyBUYWJGb2xkZXIodG9wLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Mb2NhdGlvbkZvbGRlcnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIG1hbnVhbExvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUobUxvY2F0aW9uRm9sZGVycywgU1dULk5PTkUpOwotICAgICAgICBUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShtTG9jYXRpb25Gb2xkZXJzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgiTWFudWFsIik7Ci0gICAgICAgIGl0ZW0uc2V0Q29udHJvbChtYW51YWxMb2NhdGlvbkNvbXApOwotCi0gICAgICAgIGNyZWF0ZU1hbnVhbExvY2F0aW9uQ29udHJvbChtYW51YWxMb2NhdGlvbkNvbXApOwotCi0gICAgICAgIG1QbGF5SW1hZ2UgPSBtSW1hZ2VMb2FkZXIubG9hZEltYWdlKCJwbGF5LnBuZyIsIG1QYXJlbnQuZ2V0RGlzcGxheSgpKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgbVBhdXNlSW1hZ2UgPSBtSW1hZ2VMb2FkZXIubG9hZEltYWdlKCJwYXVzZS5wbmciLCBtUGFyZW50LmdldERpc3BsYXkoKSk7IC8vICROT04tTkxTLTEkCi0KLSAgICAgICAgQ29tcG9zaXRlIGdweExvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUobUxvY2F0aW9uRm9sZGVycywgU1dULk5PTkUpOwotICAgICAgICBpdGVtID0gbmV3IFRhYkl0ZW0obUxvY2F0aW9uRm9sZGVycywgU1dULk5PTkUpOwotICAgICAgICBpdGVtLnNldFRleHQoIkdQWCIpOwotICAgICAgICBpdGVtLnNldENvbnRyb2woZ3B4TG9jYXRpb25Db21wKTsKLQotICAgICAgICBjcmVhdGVHcHhMb2NhdGlvbkNvbnRyb2woZ3B4TG9jYXRpb25Db21wKTsKLQotICAgICAgICBDb21wb3NpdGUga21sTG9jYXRpb25Db21wID0gbmV3IENvbXBvc2l0ZShtTG9jYXRpb25Gb2xkZXJzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGttbExvY2F0aW9uQ29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIGl0ZW0gPSBuZXcgVGFiSXRlbShtTG9jYXRpb25Gb2xkZXJzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgiS01MIik7Ci0gICAgICAgIGl0ZW0uc2V0Q29udHJvbChrbWxMb2NhdGlvbkNvbXApOwotCi0gICAgICAgIGNyZWF0ZUttbExvY2F0aW9uQ29udHJvbChrbWxMb2NhdGlvbkNvbXApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNYW51YWxMb2NhdGlvbkNvbnRyb2woQ29tcG9zaXRlIG1hbnVhbExvY2F0aW9uQ29tcCkgewotICAgICAgICBmaW5hbCBTdGFja0xheW91dCBzbDsKLSAgICAgICAgR3JpZExheW91dCBnbDsKLSAgICAgICAgTGFiZWwgbGFiZWw7Ci0KLSAgICAgICAgbWFudWFsTG9jYXRpb25Db21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBtRGVjaW1hbEJ1dHRvbiA9IG5ldyBCdXR0b24obWFudWFsTG9jYXRpb25Db21wLCBTV1QuUkFESU8pOwotICAgICAgICBtRGVjaW1hbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbURlY2ltYWxCdXR0b24uc2V0VGV4dCgiRGVjaW1hbCIpOwotICAgICAgICBtU2V4YWdlc2ltYWxCdXR0b24gPSBuZXcgQnV0dG9uKG1hbnVhbExvY2F0aW9uQ29tcCwgU1dULlJBRElPKTsKLSAgICAgICAgbVNleGFnZXNpbWFsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtU2V4YWdlc2ltYWxCdXR0b24uc2V0VGV4dCgiU2V4YWdlc2ltYWwiKTsKLQotICAgICAgICAvLyBjb21wb3NpdGUgdG8gaG9sZCBhbmQgc3dpdGNoaW5nIGJldHdlZW4gdGhlIDIgbW9kZXMuCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb250ZW50ID0gbmV3IENvbXBvc2l0ZShtYW51YWxMb2NhdGlvbkNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgY29udGVudC5zZXRMYXlvdXQoc2wgPSBuZXcgU3RhY2tMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gZGVjaW1hbCBkaXNwbGF5Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBkZWNpbWFsQ29udGVudCA9IG5ldyBDb21wb3NpdGUoY29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBkZWNpbWFsQ29udGVudC5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0KLSAgICAgICAgbUxvbmdpdHVkZUNvbnRyb2xzID0gbmV3IENvb3JkaW5hdGVDb250cm9scygpOwotICAgICAgICBtTGF0aXR1ZGVDb250cm9scyA9IG5ldyBDb29yZGluYXRlQ29udHJvbHMoKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChkZWNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJMb25naXR1ZGUiKTsKLQotICAgICAgICBtTG9uZ2l0dWRlQ29udHJvbHMuY3JlYXRlRGVjaW1hbFRleHQoZGVjaW1hbENvbnRlbnQpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGRlY2ltYWxDb250ZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkxhdGl0dWRlIik7Ci0KLSAgICAgICAgbUxhdGl0dWRlQ29udHJvbHMuY3JlYXRlRGVjaW1hbFRleHQoZGVjaW1hbENvbnRlbnQpOwotCi0gICAgICAgIC8vIHNleGFnZXNpbWFsIGNvbnRlbnQKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHNleGFnZXNpbWFsQ29udGVudCA9IG5ldyBDb21wb3NpdGUoY29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXhhZ2VzaW1hbENvbnRlbnQuc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoNywgZmFsc2UpKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJMb25naXR1ZGUiKTsKLQotICAgICAgICBtTG9uZ2l0dWRlQ29udHJvbHMuY3JlYXRlU2V4YWdlc2ltYWxEZWdyZWVUZXh0KHNleGFnZXNpbWFsQ29udGVudCk7Ci0KLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoc2V4YWdlc2ltYWxDb250ZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlx1MDBCMCIpOyAvLyBkZWdyZWUgY2hhcmFjdGVyCi0KLSAgICAgICAgbUxvbmdpdHVkZUNvbnRyb2xzLmNyZWF0ZVNleGFnZXNpbWFsTWludXRlVGV4dChzZXhhZ2VzaW1hbENvbnRlbnQpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCInIik7Ci0KLSAgICAgICAgbUxvbmdpdHVkZUNvbnRyb2xzLmNyZWF0ZVNleGFnZXNpbWFsU2Vjb25kVGV4dChzZXhhZ2VzaW1hbENvbnRlbnQpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJcIiIpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJMYXRpdHVkZSIpOwotCi0gICAgICAgIG1MYXRpdHVkZUNvbnRyb2xzLmNyZWF0ZVNleGFnZXNpbWFsRGVncmVlVGV4dChzZXhhZ2VzaW1hbENvbnRlbnQpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJcdTAwQjAiKTsKLQotICAgICAgICBtTGF0aXR1ZGVDb250cm9scy5jcmVhdGVTZXhhZ2VzaW1hbE1pbnV0ZVRleHQoc2V4YWdlc2ltYWxDb250ZW50KTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChzZXhhZ2VzaW1hbENvbnRlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiJyIpOwotCi0gICAgICAgIG1MYXRpdHVkZUNvbnRyb2xzLmNyZWF0ZVNleGFnZXNpbWFsU2Vjb25kVGV4dChzZXhhZ2VzaW1hbENvbnRlbnQpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHNleGFnZXNpbWFsQ29udGVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJcIiIpOwotCi0gICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBkaXNwbGF5IHRvIGRlY2ltYWwKLSAgICAgICAgc2wudG9wQ29udHJvbCA9IGRlY2ltYWxDb250ZW50OwotICAgICAgICBtRGVjaW1hbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICAgICAgbURlY2ltYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobURlY2ltYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2wudG9wQ29udHJvbCA9IGRlY2ltYWxDb250ZW50OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNsLnRvcENvbnRyb2wgPSBzZXhhZ2VzaW1hbENvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRlbnQubGF5b3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEJ1dHRvbiBzZW5kQnV0dG9uID0gbmV3IEJ1dHRvbihtYW51YWxMb2NhdGlvbkNvbXAsIFNXVC5QVVNIKTsKLSAgICAgICAgc2VuZEJ1dHRvbi5zZXRUZXh0KCJTZW5kIik7Ci0gICAgICAgIHNlbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yQ29uc29sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kUmVzdWx0KG1FbXVsYXRvckNvbnNvbGUuc2VuZExvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb25naXR1ZGVDb250cm9scy5nZXRWYWx1ZSgpLCBtTGF0aXR1ZGVDb250cm9scy5nZXRWYWx1ZSgpLCAwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtTG9uZ2l0dWRlQ29udHJvbHMuc2V0VmFsdWUoREVGQVVMVF9MT05HSVRVREUpOwotICAgICAgICBtTGF0aXR1ZGVDb250cm9scy5zZXRWYWx1ZShERUZBVUxUX0xBVElUVURFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR3B4TG9jYXRpb25Db250cm9sKENvbXBvc2l0ZSBncHhMb2NhdGlvbkNvbXApIHsKLSAgICAgICAgR3JpZERhdGEgZ2Q7Ci0KLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IERkbVVpUHJlZmVyZW5jZXMuZ2V0U3RvcmUoKTsKLQotICAgICAgICBncHhMb2NhdGlvbkNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgbUdweFVwbG9hZEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3B4TG9jYXRpb25Db21wLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1HcHhVcGxvYWRCdXR0b24uc2V0VGV4dCgiTG9hZCBHUFguLi4iKTsKLQotICAgICAgICAvLyBUYWJsZSBmb3Igd2F5IHBvaW50Ci0gICAgICAgIG1HcHhXYXlQb2ludFRhYmxlID0gbmV3IFRhYmxlKGdweExvY2F0aW9uQ29tcCwKLSAgICAgICAgICAgICAgICBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtR3B4V2F5UG9pbnRUYWJsZS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMTAwOwotICAgICAgICBtR3B4V2F5UG9pbnRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtR3B4V2F5UG9pbnRUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUdweFdheVBvaW50VGFibGUsICJOYW1lIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIlNvbWUgTmFtZSIsCi0gICAgICAgICAgICAgICAgUFJFRlNfV0FZUE9JTlRfQ09MX05BTUUsIHN0b3JlKTsKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUdweFdheVBvaW50VGFibGUsICJMb25naXR1ZGUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiLTE5OS45OTk5OTkiLAotICAgICAgICAgICAgICAgIFBSRUZTX1dBWVBPSU5UX0NPTF9MT05HSVRVREUsIHN0b3JlKTsKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUdweFdheVBvaW50VGFibGUsICJMYXRpdHVkZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICItMTk5Ljk5OTk5OSIsCi0gICAgICAgICAgICAgICAgUFJFRlNfV0FZUE9JTlRfQ09MX0xBVElUVURFLCBzdG9yZSk7Ci0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1HcHhXYXlQb2ludFRhYmxlLCAiRWxldmF0aW9uIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIjk5OTk5LjkiLAotICAgICAgICAgICAgICAgIFBSRUZTX1dBWVBPSU5UX0NPTF9FTEVWQVRJT04sIHN0b3JlKTsKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUdweFdheVBvaW50VGFibGUsICJEZXNjcmlwdGlvbiIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJTb21lIERlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICBQUkVGU19XQVlQT0lOVF9DT0xfREVTQ1JJUFRJT04sIHN0b3JlKTsKLQotICAgICAgICBmaW5hbCBUYWJsZVZpZXdlciBncHhXYXlQb2ludFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihtR3B4V2F5UG9pbnRUYWJsZSk7Ci0gICAgICAgIGdweFdheVBvaW50Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV2F5UG9pbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGdweFdheVBvaW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdheVBvaW50TGFiZWxQcm92aWRlcigpKTsKLQotICAgICAgICBncHhXYXlQb2ludFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBXYXlQb2ludCkgewotICAgICAgICAgICAgICAgICAgICAgICAgV2F5UG9pbnQgd2F5UG9pbnQgPSAoV2F5UG9pbnQpc2VsZWN0ZWRPYmplY3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW11bGF0b3JDb25zb2xlICE9IG51bGwgJiYgbVBsYXlpbmdUcmFjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kUmVzdWx0KG1FbXVsYXRvckNvbnNvbGUuc2VuZExvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F5UG9pbnQuZ2V0TG9uZ2l0dWRlKCksIHdheVBvaW50LmdldExhdGl0dWRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXlQb2ludC5nZXRFbGV2YXRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyB0YWJsZSBmb3IgdHJhY2tzLgotICAgICAgICBtR3B4VHJhY2tUYWJsZSA9IG5ldyBUYWJsZShncHhMb2NhdGlvbkNvbXAsCi0gICAgICAgICAgICAgICAgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgbUdweFRyYWNrVGFibGUuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IDEwMDsKLSAgICAgICAgbUdweFRyYWNrVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbUdweFRyYWNrVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1HcHhUcmFja1RhYmxlLCAiTmFtZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJTb21lIHZlcnkgbG9uZyBuYW1lIiwKLSAgICAgICAgICAgICAgICBQUkVGU19UUkFDS19DT0xfTkFNRSwgc3RvcmUpOwotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtR3B4VHJhY2tUYWJsZSwgIlBvaW50IENvdW50IiwgU1dULlJJR0hULAotICAgICAgICAgICAgICAgICI5OTk5IiwKLSAgICAgICAgICAgICAgICBQUkVGU19UUkFDS19DT0xfQ09VTlQsIHN0b3JlKTsKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUdweFRyYWNrVGFibGUsICJGaXJzdCBQb2ludCBUaW1lIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIjk5OS05OS05OVQ5OTo5OTo5OVoiLAotICAgICAgICAgICAgICAgIFBSRUZTX1RSQUNLX0NPTF9GSVJTVCwgc3RvcmUpOwotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtR3B4VHJhY2tUYWJsZSwgIkxhc3QgUG9pbnQgVGltZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICI5OTktOTktOTlUOTk6OTk6OTlaIiwKLSAgICAgICAgICAgICAgICBQUkVGU19UUkFDS19DT0xfTEFTVCwgc3RvcmUpOwotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtR3B4VHJhY2tUYWJsZSwgIkNvbW1lbnQiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiLTE5OS45OTk5OTkiLAotICAgICAgICAgICAgICAgIFBSRUZTX1RSQUNLX0NPTF9DT01NRU5ULCBzdG9yZSk7Ci0KLSAgICAgICAgZmluYWwgVGFibGVWaWV3ZXIgZ3B4VHJhY2tWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIobUdweFRyYWNrVGFibGUpOwotICAgICAgICBncHhUcmFja1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRyYWNrQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBncHhUcmFja1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmFja0xhYmVsUHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgZ3B4VHJhY2tWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgVHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrIHRyYWNrID0gKFRyYWNrKXNlbGVjdGVkT2JqZWN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yQ29uc29sZSAhPSBudWxsICYmIG1QbGF5aW5nVHJhY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja1BvaW50W10gcG9pbnRzID0gdHJhY2suZ2V0UG9pbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmRSZXN1bHQobUVtdWxhdG9yQ29uc29sZS5zZW5kTG9jYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbMF0uZ2V0TG9uZ2l0dWRlKCksIHBvaW50c1swXS5nZXRMYXRpdHVkZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzWzBdLmdldEVsZXZhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5R3B4QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtR3B4QmFja3dhcmRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1HcHhGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtR3B4U3BlZWRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVBsYXlHcHhCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUdweEJhY2t3YXJkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1HcHhGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1HcHhTcGVlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUdweFVwbG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKG1QYXJlbnQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCi0gICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRUZXh0KCJMb2FkIEdQWCBGaWxlIik7Ci0gICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmdweCIgfSApOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgR3B4UGFyc2VyIHBhcnNlciA9IG5ldyBHcHhQYXJzZXIoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VyLnBhcnNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdweFdheVBvaW50Vmlld2VyLnNldElucHV0KHBhcnNlci5nZXRXYXlQb2ludHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncHhUcmFja1ZpZXdlci5zZXRJbnB1dChwYXJzZXIuZ2V0VHJhY2tzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtR3B4UGxheUNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShncHhMb2NhdGlvbkNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBnbDsKLSAgICAgICAgbUdweFBsYXlDb250cm9scy5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIG1HcHhQbGF5Q29udHJvbHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbVBsYXlHcHhCdXR0b24gPSBuZXcgQnV0dG9uKG1HcHhQbGF5Q29udHJvbHMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBtUGxheUdweEJ1dHRvbi5zZXRJbWFnZShtUGxheUltYWdlKTsKLSAgICAgICAgbVBsYXlHcHhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgaWYgKG1QbGF5aW5nVHJhY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdweFRyYWNrVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpID09IGZhbHNlICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2sgdHJhY2sgPSAoVHJhY2spc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5VHJhY2sodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBwbGF5aW5nLCB0aGVuIHdlIHBhdXNlCi0gICAgICAgICAgICAgICAgICAgbVBsYXlpbmdUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWluZ1RocmVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nVGhyZWFkLmludGVycnVwdCgpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKG1HcHhQbGF5Q29udHJvbHMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMDsKLQotICAgICAgICBtR3B4QmFja3dhcmRCdXR0b24gPSBuZXcgQnV0dG9uKG1HcHhQbGF5Q29udHJvbHMsIFNXVC5UT0dHTEUgfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1HcHhCYWNrd2FyZEJ1dHRvbi5zZXRJbWFnZShtSW1hZ2VMb2FkZXIubG9hZEltYWdlKCJiYWNrd2FyZC5wbmciLCBtUGFyZW50LmdldERpc3BsYXkoKSkpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtR3B4QmFja3dhcmRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgbUdweEJhY2t3YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1EaXJlY3Rpb25CdXR0b25BZGFwdGVyKTsKLSAgICAgICAgbUdweEZvcndhcmRCdXR0b24gPSBuZXcgQnV0dG9uKG1HcHhQbGF5Q29udHJvbHMsIFNXVC5UT0dHTEUgfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1HcHhGb3J3YXJkQnV0dG9uLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoImZvcndhcmQucG5nIiwgbVBhcmVudC5nZXREaXNwbGF5KCkpKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgbUdweEZvcndhcmRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBtR3B4Rm9yd2FyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihtRGlyZWN0aW9uQnV0dG9uQWRhcHRlcik7Ci0KLSAgICAgICAgbUdweFNwZWVkQnV0dG9uID0gbmV3IEJ1dHRvbihtR3B4UGxheUNvbnRyb2xzLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLQotICAgICAgICBtU3BlZWRJbmRleCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IFBMQVlfU1BFRURTW21TcGVlZEluZGV4XTsKLQotICAgICAgICBtR3B4U3BlZWRCdXR0b24uc2V0VGV4dChTdHJpbmcuZm9ybWF0KFNQRUVEX0ZPUk1BVCwgbVNwZWVkKSk7Ci0gICAgICAgIG1HcHhTcGVlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihtU3BlZWRCdXR0b25BZGFwdGVyKTsKLQotICAgICAgICBtUGxheUdweEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUdweEJhY2t3YXJkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtR3B4Rm9yd2FyZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUdweFNwZWVkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUttbExvY2F0aW9uQ29udHJvbChDb21wb3NpdGUga21sTG9jYXRpb25Db21wKSB7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAga21sTG9jYXRpb25Db21wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0gICAgICAgIG1LbWxVcGxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKGttbExvY2F0aW9uQ29tcCwgU1dULlBVU0gpOwotICAgICAgICBtS21sVXBsb2FkQnV0dG9uLnNldFRleHQoIkxvYWQgS01MLi4uIik7Ci0KLSAgICAgICAgLy8gVGFibGUgZm9yIHdheSBwb2ludAotICAgICAgICBtS21sV2F5UG9pbnRUYWJsZSA9IG5ldyBUYWJsZShrbWxMb2NhdGlvbkNvbXAsCi0gICAgICAgICAgICAgICAgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgbUttbFdheVBvaW50VGFibGUuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IDIwMDsKLSAgICAgICAgbUttbFdheVBvaW50VGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbUttbFdheVBvaW50VGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1LbWxXYXlQb2ludFRhYmxlLCAiTmFtZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJTb21lIE5hbWUiLAotICAgICAgICAgICAgICAgIFBSRUZTX1dBWVBPSU5UX0NPTF9OQU1FLCBzdG9yZSk7Ci0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1LbWxXYXlQb2ludFRhYmxlLCAiTG9uZ2l0dWRlIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIi0xOTkuOTk5OTk5IiwKLSAgICAgICAgICAgICAgICBQUkVGU19XQVlQT0lOVF9DT0xfTE9OR0lUVURFLCBzdG9yZSk7Ci0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1LbWxXYXlQb2ludFRhYmxlLCAiTGF0aXR1ZGUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiLTE5OS45OTk5OTkiLAotICAgICAgICAgICAgICAgIFBSRUZTX1dBWVBPSU5UX0NPTF9MQVRJVFVERSwgc3RvcmUpOwotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtS21sV2F5UG9pbnRUYWJsZSwgIkVsZXZhdGlvbiIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICI5OTk5OS45IiwKLSAgICAgICAgICAgICAgICBQUkVGU19XQVlQT0lOVF9DT0xfRUxFVkFUSU9OLCBzdG9yZSk7Ci0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1LbWxXYXlQb2ludFRhYmxlLCAiRGVzY3JpcHRpb24iLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiU29tZSBEZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgUFJFRlNfV0FZUE9JTlRfQ09MX0RFU0NSSVBUSU9OLCBzdG9yZSk7Ci0KLSAgICAgICAgZmluYWwgVGFibGVWaWV3ZXIga21sV2F5UG9pbnRWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIobUttbFdheVBvaW50VGFibGUpOwotICAgICAgICBrbWxXYXlQb2ludFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdheVBvaW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBrbWxXYXlQb2ludFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXYXlQb2ludExhYmVsUHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgbUttbFVwbG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKG1QYXJlbnQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCi0gICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRUZXh0KCJMb2FkIEtNTCBGaWxlIik7Ci0gICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmttbCIgfSApOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgS21sUGFyc2VyIHBhcnNlciA9IG5ldyBLbWxQYXJzZXIoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VyLnBhcnNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGttbFdheVBvaW50Vmlld2VyLnNldElucHV0KHBhcnNlci5nZXRXYXlQb2ludHMoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtS21sQmFja3dhcmRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LbWxGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtS21sU3BlZWRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAga21sV2F5UG9pbnRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgV2F5UG9pbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdheVBvaW50IHdheVBvaW50ID0gKFdheVBvaW50KXNlbGVjdGVkT2JqZWN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yQ29uc29sZSAhPSBudWxsICYmIG1QbGF5aW5nVHJhY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZFJlc3VsdChtRW11bGF0b3JDb25zb2xlLnNlbmRMb2NhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdheVBvaW50LmdldExvbmdpdHVkZSgpLCB3YXlQb2ludC5nZXRMYXRpdHVkZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F5UG9pbnQuZ2V0RWxldmF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotCi0gICAgICAgIG1LbWxQbGF5Q29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGttbExvY2F0aW9uQ29tcCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdsOwotICAgICAgICBtS21sUGxheUNvbnRyb2xzLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbUttbFBsYXlDb250cm9scy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBtUGxheUttbEJ1dHRvbiA9IG5ldyBCdXR0b24obUttbFBsYXlDb250cm9scywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEltYWdlKG1QbGF5SW1hZ2UpOwotICAgICAgICBtUGxheUttbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICBpZiAobVBsYXlpbmdUcmFjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnB1dCA9IGttbFdheVBvaW50Vmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgV2F5UG9pbnRbXSkgewotICAgICAgICAgICAgICAgICAgICAgICBwbGF5S21sKChXYXlQb2ludFtdKWlucHV0KTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHBsYXlpbmcsIHRoZW4gd2UgcGF1c2UKLSAgICAgICAgICAgICAgICAgICBtUGxheWluZ1RyYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5aW5nVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdUaHJlYWQuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwobUttbFBsYXlDb250cm9scywgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSAwOwotCi0gICAgICAgIG1LbWxCYWNrd2FyZEJ1dHRvbiA9IG5ldyBCdXR0b24obUttbFBsYXlDb250cm9scywgU1dULlRPR0dMRSB8IFNXVC5GTEFUKTsKLSAgICAgICAgbUttbEJhY2t3YXJkQnV0dG9uLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoImJhY2t3YXJkLnBuZyIsIG1QYXJlbnQuZ2V0RGlzcGxheSgpKSk7IC8vICROT04tTkxTLTEkCi0gICAgICAgIG1LbWxCYWNrd2FyZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBtS21sQmFja3dhcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobURpcmVjdGlvbkJ1dHRvbkFkYXB0ZXIpOwotICAgICAgICBtS21sRm9yd2FyZEJ1dHRvbiA9IG5ldyBCdXR0b24obUttbFBsYXlDb250cm9scywgU1dULlRPR0dMRSB8IFNXVC5GTEFUKTsKLSAgICAgICAgbUttbEZvcndhcmRCdXR0b24uc2V0SW1hZ2UobUltYWdlTG9hZGVyLmxvYWRJbWFnZSgiZm9yd2FyZC5wbmciLCBtUGFyZW50LmdldERpc3BsYXkoKSkpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtS21sRm9yd2FyZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIG1LbWxGb3J3YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1EaXJlY3Rpb25CdXR0b25BZGFwdGVyKTsKLQotICAgICAgICBtS21sU3BlZWRCdXR0b24gPSBuZXcgQnV0dG9uKG1LbWxQbGF5Q29udHJvbHMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotCi0gICAgICAgIG1TcGVlZEluZGV4ID0gMDsKLSAgICAgICAgbVNwZWVkID0gUExBWV9TUEVFRFNbbVNwZWVkSW5kZXhdOwotCi0gICAgICAgIG1LbWxTcGVlZEJ1dHRvbi5zZXRUZXh0KFN0cmluZy5mb3JtYXQoU1BFRURfRk9STUFULCBtU3BlZWQpKTsKLSAgICAgICAgbUttbFNwZWVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1TcGVlZEJ1dHRvbkFkYXB0ZXIpOwotCi0gICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtS21sQmFja3dhcmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1LbWxGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtS21sU3BlZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9jdXMgdG8gdGhlIHByb3BlciBjb250cm9sIGluc2lkZSB0aGUgcGFuZWwuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdENyZWF0aW9uKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXREYXRhTW9kZShpbnQgc2VsZWN0aW9uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1FbXVsYXRvckNvbnNvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmRSZXN1bHQobUVtdWxhdG9yQ29uc29sZS5zZXRHc21EYXRhTW9kZSgKLSAgICAgICAgICAgICAgICAgICAgR3NtTW9kZS5nZXRFbnVtKEdTTV9NT0RFU1tzZWxlY3Rpb25JbmRleF1bMV0pKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldFZvaWNlTW9kZShpbnQgc2VsZWN0aW9uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1FbXVsYXRvckNvbnNvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmRSZXN1bHQobUVtdWxhdG9yQ29uc29sZS5zZXRHc21Wb2ljZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgIEdzbU1vZGUuZ2V0RW51bShHU01fTU9ERVNbc2VsZWN0aW9uSW5kZXhdWzFdKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXROZXR3b3JrTGF0ZW5jeShpbnQgc2VsZWN0aW9uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1FbXVsYXRvckNvbnNvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmRSZXN1bHQobUVtdWxhdG9yQ29uc29sZS5zZXROZXR3b3JrTGF0ZW5jeShzZWxlY3Rpb25JbmRleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXROZXR3b3JrU3BlZWQoaW50IHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgICAgIGlmIChtRW11bGF0b3JDb25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kUmVzdWx0KG1FbXVsYXRvckNvbnNvbGUuc2V0TmV0d29ya1NwZWVkKHNlbGVjdGlvbkluZGV4KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIG9uIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIG5ldyBzZWxlY3RlZCBkZXZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVOZXdEZXZpY2UoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKG1QYXJlbnQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdW5saW5rIHRvIHByZXZpb3VzIGNvbnNvbGUuCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgbUVtdWxhdG9yQ29uc29sZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbXVsYXRvciBjb25zb2xlIGZvciB0aGlzIGRldmljZQotICAgICAgICAgICAgLy8gRmlyc3Qgd2UgbmVlZCB0aGUgZGV2aWNlIGl0c2VsZgotICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgR3NtU3RhdHVzIGdzbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgTmV0d29ya1N0YXR1cyBuZXRzdGF0dXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbXVsYXRvckNvbnNvbGUgPSBFbXVsYXRvckNvbnNvbGUuZ2V0Q29uc29sZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yQ29uc29sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGdzbSBzdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGdzbSA9IG1FbXVsYXRvckNvbnNvbGUuZ2V0R3NtU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXRzdGF0dXMgPSBtRW11bGF0b3JDb25zb2xlLmdldE5ldHdvcmtTdGF0dXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdzbSA9PSBudWxsIHx8IG5ldHN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtdWxhdG9yQ29uc29sZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZ3NtICE9IG51bGwgJiYgbmV0c3RhdHVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBkID0gbVBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgR3NtU3RhdHVzIGZfZ3NtID0gZ3NtOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXR1cyBmX25ldHN0YXR1cyA9IG5ldHN0YXR1czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZfZ3NtLnZvaWNlICE9IEdzbU1vZGUuVU5LTk9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvaWNlTW9kZS5zZWxlY3QoZ2V0R3NtQ29tYm9JbmRleChmX2dzbS52b2ljZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvaWNlTW9kZS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmX2dzbS5kYXRhICE9IEdzbU1vZGUuVU5LTk9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFNb2RlLnNlbGVjdChnZXRHc21Db21ib0luZGV4KGZfZ3NtLmRhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhTW9kZS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZfbmV0c3RhdHVzLnNwZWVkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya1NwZWVkLnNlbGVjdChmX25ldHN0YXR1cy5zcGVlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya1NwZWVkLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZl9uZXRzdGF0dXMubGF0ZW5jeSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtMYXRlbmN5LnNlbGVjdChmX25ldHN0YXR1cy5sYXRlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrTGF0ZW5jeS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBlbmFibGUvZGlzYWJsZSB0aGUgdWkKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBlbmFibGUgPSBtRW11bGF0b3JDb25zb2xlICE9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuYWJsZShlbmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHVpLiBDYW4gYmUgY2FsbGVkIGZyb20gbm9uIHVpIHRocmVhZHMuCi0gICAgICogQHBhcmFtIGVuYWJsZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlKGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGlzcGxheSBkID0gbVBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICBkLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBhcmVudC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvRW5hYmxlKGVuYWJsZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkaXNwb3NlZC4gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQaG9uZU51bWJlcigpIHsKLSAgICAgICAgU3RyaW5nIG51bWJlciA9IG1QaG9uZU51bWJlci5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgICAgIHJldHVybiBudW1iZXIubWF0Y2hlcyhSRV9QSE9ORV9OVU1CRVIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSB1aS4gQ2Fubm90IGJlIGNhbGxlZCBmcm9tIG5vbiB1aSB0aHJlYWRzLgotICAgICAqIEBwYXJhbSBlbmFibGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FbmFibGUoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1Wb2ljZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1Wb2ljZU1vZGUuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICBtRGF0YUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1EYXRhTW9kZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIG1TcGVlZExhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1OZXR3b3JrU3BlZWQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICBtTGF0ZW5jeUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1OZXR3b3JrTGF0ZW5jeS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIC8vIENhbGxpbmcgc2V0RW5hYmxlZCBvbiBhIHRleHQgZmllbGQgd2lsbCB0cmlnZ2VyIGEgbW9kaWZ5VGV4dCBldmVudCwgc28gd2UgZG9uJ3QgZG8gaXQKLSAgICAgICAgLy8gaWYgd2UgZG9uJ3QgbmVlZCB0by4KLSAgICAgICAgaWYgKG1QaG9uZU51bWJlci5pc0VuYWJsZWQoKSAhPSBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtTnVtYmVyTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgIG1QaG9uZU51bWJlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IGlzVmFsaWRQaG9uZU51bWJlcigpOwotCi0gICAgICAgIG1Wb2ljZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgdmFsaWQpOwotICAgICAgICBtU21zQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCAmJiB2YWxpZCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzbXNWYWxpZCA9IGVuYWJsZWQgJiYgdmFsaWQgJiYgbVNtc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAvLyBDYWxsaW5nIHNldEVuYWJsZWQgb24gYSB0ZXh0IGZpZWxkIHdpbGwgdHJpZ2dlciBhIG1vZGlmeVRleHQgZXZlbnQsIHNvIHdlIGRvbid0IGRvIGl0Ci0gICAgICAgIC8vIGlmIHdlIGRvbid0IG5lZWQgdG8uCi0gICAgICAgIGlmIChtU21zTWVzc2FnZS5pc0VuYWJsZWQoKSAhPSBzbXNWYWxpZCkgewotICAgICAgICAgICAgbU1lc3NhZ2VMYWJlbC5zZXRFbmFibGVkKHNtc1ZhbGlkKTsKLSAgICAgICAgICAgIG1TbXNNZXNzYWdlLnNldEVuYWJsZWQoc21zVmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU21zTWVzc2FnZS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5Mcy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgbUNhbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIHZhbGlkKTsKLSAgICAgICAgbUNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgdmFsaWQgJiYgbVZvaWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICBpZiAoZW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVZvaWNlTW9kZS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgbURhdGFNb2RlLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBtTmV0d29ya1NwZWVkLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBtTmV0d29ya0xhdGVuY3kuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChtUGhvbmVOdW1iZXIuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIG1QaG9uZU51bWJlci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9jYXRpb24gY29udHJvbHMKLSAgICAgICAgbUxvY2F0aW9uRm9sZGVycy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIG1EZWNpbWFsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1TZXhhZ2VzaW1hbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBtTG9uZ2l0dWRlQ29udHJvbHMuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgbUxhdGl0dWRlQ29udHJvbHMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICBtR3B4VXBsb2FkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1HcHhXYXlQb2ludFRhYmxlLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1HcHhUcmFja1RhYmxlLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1LbWxVcGxvYWRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgbUttbFdheVBvaW50VGFibGUuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY29tYm8gaXRlbSBtYXRjaGluZyBhIHNwZWNpZmljIEdzbU1vZGUuCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRHc21Db21ib0luZGV4KEdzbU1vZGUgbW9kZSkgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBHU01fTU9ERVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIG1vZGVzID0gR1NNX01PREVTW2ldOwotICAgICAgICAgICAgaWYgKG1vZGUuZ2V0VGFnKCkuZXF1YWxzKG1vZGVzWzFdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3VsdCBvZiBhIGNvbW1hbmQgc2VudCB0byB0aGUgY29uc29sZS4KLSAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NDb21tYW5kUmVzdWx0KGZpbmFsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBFbXVsYXRvckNvbnNvbGUuUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGFyZW50LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG1QYXJlbnQuZ2V0U2hlbGwoKSwgIkVtdWxhdG9yIENvbnNvbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSBxdWl0dGluZywganVzdCBpZ25vcmUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRyYWNrCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlUcmFjayhmaW5hbCBUcmFjayB0cmFjaykgewotICAgICAgICAvLyBubyBuZWVkIHRvIHN5bmNocm9uaXplIHRoaXMgY2hlY2ssIHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4sIGlzIHdlIHN0YXJ0IHRoZSB0aHJlYWQKLSAgICAgICAgLy8gZm9yIG5vdGhpbmcuCi0gICAgICAgIGlmIChtRW11bGF0b3JDb25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5R3B4QnV0dG9uLnNldEltYWdlKG1QYXVzZUltYWdlKTsKLSAgICAgICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEltYWdlKG1QYXVzZUltYWdlKTsKLSAgICAgICAgICAgIG1QbGF5aW5nVHJhY2sgPSB0cnVlOwotCi0gICAgICAgICAgICBtUGxheWluZ1RocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tQb2ludFtdIHRyYWNrUG9pbnRzID0gdHJhY2suZ2V0UG9pbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSB0cmFja1BvaW50cy5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RhcnQgaW5kZXguCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5RGlyZWN0aW9uID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBjb3VudCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBzdGFydDsgcCA+PSAwICYmIHAgPCBjb3VudDsgcCArPSBtUGxheURpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWluZ1RyYWNrID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgcG9pbnQgYW5kIHNlbmQgaXRzIGxvY2F0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVtdWxhdG9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyYWNrUG9pbnQgdHJhY2tQb2ludCA9IHRyYWNrUG9pbnRzW3BdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChFbXVsYXRvckNvbnRyb2xQYW5lbC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW11bGF0b3JDb25zb2xlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZFJlc3VsdChtRW11bGF0b3JDb25zb2xlLnNlbmRMb2NhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrUG9pbnQuZ2V0TG9uZ2l0dWRlKCksIHRyYWNrUG9pbnQuZ2V0TGF0aXR1ZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrUG9pbnQuZ2V0RWxldmF0aW9uKCkpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgdGhlIGZpbmFsIHBvaW50LCB0aGVuIGdldCB0aGUgbmV4dCBvbmUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgZGVsdGEgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0SW5kZXggPSBwICsgbVBsYXlEaXJlY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRJbmRleCA+PTAgJiYgbmV4dEluZGV4IDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tQb2ludCBuZXh0UG9pbnQgPSB0cmFja1BvaW50c1tuZXh0SW5kZXhdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBuZXh0UG9pbnQuZ2V0VGltZSgpIC0gdHJhY2tQb2ludC5nZXRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoZGVsdGEgLyBtU3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXlpbmdUcmFjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZ290IGludGVycnVwdGVkLCBsZXRzIG1ha2Ugc3VyZSB3ZSBjYW4gcGxheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FpdGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBuZWVkVG9XYWl0ID0gZGVsdGEgLyBtU3BlZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRlZCA8IG5lZWRUb1dhaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKG5lZWRUb1dhaXQgLSB3YWl0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwganVzdCBsb29wIGFuZCB3YWl0IGFnYWluIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyB3ZSdyZSBzdXBwb3NlZCB0byBzdG9wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXlpbmdUcmFjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyZW50LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXlHcHhCdXR0b24uaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlHcHhCdXR0b24uc2V0SW1hZ2UobVBsYXlJbWFnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlLbWxCdXR0b24uc2V0SW1hZ2UobVBsYXlJbWFnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcXVpdHRpbmcsIGp1c3QgaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBtUGxheWluZ1RocmVhZC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlLbWwoZmluYWwgV2F5UG9pbnRbXSB0cmFja1BvaW50cykgewotICAgICAgICAvLyBubyBuZWVkIHRvIHN5bmNocm9uaXplIHRoaXMgY2hlY2ssIHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4sIGlzIHdlIHN0YXJ0IHRoZSB0aHJlYWQKLSAgICAgICAgLy8gZm9yIG5vdGhpbmcuCi0gICAgICAgIGlmIChtRW11bGF0b3JDb25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5R3B4QnV0dG9uLnNldEltYWdlKG1QYXVzZUltYWdlKTsKLSAgICAgICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEltYWdlKG1QYXVzZUltYWdlKTsKLSAgICAgICAgICAgIG1QbGF5aW5nVHJhY2sgPSB0cnVlOwotCi0gICAgICAgICAgICBtUGxheWluZ1RocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gdHJhY2tQb2ludHMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHN0YXJ0IGluZGV4LgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheURpcmVjdGlvbiA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gY291bnQgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gc3RhcnQ7IHAgPj0gMCAmJiBwIDwgY291bnQ7IHAgKz0gbVBsYXlEaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXlpbmdUcmFjayA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHBvaW50IGFuZCBzZW5kIGl0cyBsb2NhdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbXVsYXRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXlQb2ludCB0cmFja1BvaW50ID0gdHJhY2tQb2ludHNbcF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEVtdWxhdG9yQ29udHJvbFBhbmVsLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbXVsYXRvckNvbnNvbGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kUmVzdWx0KG1FbXVsYXRvckNvbnNvbGUuc2VuZExvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tQb2ludC5nZXRMb25naXR1ZGUoKSwgdHJhY2tQb2ludC5nZXRMYXRpdHVkZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tQb2ludC5nZXRFbGV2YXRpb24oKSkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCB0aGUgZmluYWwgcG9pbnQsIHRoZW4gZ2V0IHRoZSBuZXh0IG9uZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRJbmRleCA9IHAgKyBtUGxheURpcmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEluZGV4ID49MCAmJiBuZXh0SW5kZXggPCBjb3VudCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSAxMDAwOyAvLyAxIHNlY29uZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKGRlbHRhIC8gbVNwZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5aW5nVHJhY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCBpbnRlcnJ1cHRlZCwgbGV0cyBtYWtlIHN1cmUgd2UgY2FuIHBsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHdhaXRlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbmVlZFRvV2FpdCA9IGRlbHRhIC8gbVNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0ZWQgPCBuZWVkVG9XYWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcChuZWVkVG9XYWl0IC0gd2FpdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIGp1c3QgbG9vcCBhbmQgd2FpdCBhZ2FpbiBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3Mgd2UncmUgc3VwcG9zZWQgdG8gc3RvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5aW5nVHJhY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nVHJhY2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5R3B4QnV0dG9uLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5R3B4QnV0dG9uLnNldEltYWdlKG1QbGF5SW1hZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5S21sQnV0dG9uLnNldEltYWdlKG1QbGF5SW1hZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHF1aXR0aW5nLCBqdXN0IGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgbVBsYXlpbmdUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSGVhcFBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0hlYXBQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNmOWIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSGVhcFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSUNsaWVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5IZWFwU2VnbWVudC5IZWFwU2VnbWVudEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuQ2hhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5KRnJlZUNoYXJ0OwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5heGlzLkNhdGVnb3J5QXhpczsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuYXhpcy5DYXRlZ29yeUxhYmVsUG9zaXRpb25zOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5sYWJlbHMuQ2F0ZWdvcnlUb29sVGlwR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5wbG90LkNhdGVnb3J5UGxvdDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucGxvdC5QbG90OwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5wbG90LlBsb3RPcmllbnRhdGlvbjsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucmVuZGVyZXIuY2F0ZWdvcnkuQ2F0ZWdvcnlJdGVtUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnRpdGxlLlRleHRUaXRsZTsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS5jYXRlZ29yeS5DYXRlZ29yeURhdGFzZXQ7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEuY2F0ZWdvcnkuRGVmYXVsdENhdGVnb3J5RGF0YXNldDsKLWltcG9ydCBvcmcuamZyZWUuZXhwZXJpbWVudGFsLmNoYXJ0LnN3dC5DaGFydENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuamZyZWUuZXhwZXJpbWVudGFsLnN3dC5TV1RVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3Igb3VyIGluZm9ybWF0aW9uIHBhbmVscy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhlYXBQYW5lbCBleHRlbmRzIEJhc2VIZWFwUGFuZWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFUU19DT0xfVFlQRSA9ICJoZWFwUGFuZWwuY29sMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfU1RBVFNfQ09MX0NPVU5UID0gImhlYXBQYW5lbC5jb2wxIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFUU19DT0xfU0laRSA9ICJoZWFwUGFuZWwuY29sMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfU1RBVFNfQ09MX1NNQUxMRVNUID0gImhlYXBQYW5lbC5jb2wzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFUU19DT0xfTEFSR0VTVCA9ICJoZWFwUGFuZWwuY29sNCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfU1RBVFNfQ09MX01FRElBTiA9ICJoZWFwUGFuZWwuY29sNSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfU1RBVFNfQ09MX0FWRVJBR0UgPSAiaGVhcFBhbmVsLmNvbDYiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiBhcmdzIHRvIHNldFVwZGF0ZVN0YXR1cygpICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9TRUxFQ1RFRCAgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0VOQUJMRUQgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDI7Ci0KLSAgICAvKiogY29sb3IgcGFsZXR0ZSBhbmQgbWFwIGxlZ2VuZC4gTkFUSVZFIGlzIHRoZSBsYXN0IGVudW0gaXMgYSAwIGJhc2VkIGVudW0gbGlzdCwgc28gd2UgbmVlZAotICAgICAqIE5hdGl2ZSsxIGF0IGxlYXN0LiBXZSBhbHNvIG5lZWQgMiBtb3JlIGVudHJpZXMgZm9yIGZyZWUgYXJlYSBhbmQgZXhwYW5zaW9uIGFyZWEuICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUEFMRVRURV9FTlRSSUVTID0gSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfTkFUSVZFKzIgKzE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbU1hcExlZ2VuZCA9IG5ldyBTdHJpbmdbTlVNX1BBTEVUVEVfRU5UUklFU107Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFsZXR0ZURhdGEgbU1hcFBhbGV0dGUgPSBjcmVhdGVQYWxldHRlKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU1BMQVlfSEVBUF9CSVRNQVAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU1BMQVlfSElMQkVSVF9CSVRNQVAgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFDRUhPTERFUl9ISUxCRVJUX1NJWkUgPSAyMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQUNFSE9MREVSX0xJTkVBUl9WX1NJWkUgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQUNFSE9MREVSX0xJTkVBUl9IX1NJWkUgPSAzMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBaT09NUyA9IHsxMDAsIDUwLCAyNX07Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVtYmVyRm9ybWF0IHNCeXRlRm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVtYmVyRm9ybWF0IHNMYXJnZUJ5dGVGb3JtYXR0ZXIgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOdW1iZXJGb3JtYXQgc0NvdW50Rm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0J5dGVGb3JtYXR0ZXIuc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKDApOwotICAgICAgICBzQnl0ZUZvcm1hdHRlci5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoMSk7Ci0gICAgICAgIHNMYXJnZUJ5dGVGb3JtYXR0ZXIuc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKDMpOwotICAgICAgICBzTGFyZ2VCeXRlRm9ybWF0dGVyLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygzKTsKLQotICAgICAgICBzQ291bnRGb3JtYXR0ZXIuc2V0R3JvdXBpbmdVc2VkKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGlzcGxheSBtRGlzcGxheTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1Ub3A7IC8vIHJlYWwgdG9wCi0gICAgcHJpdmF0ZSBMYWJlbCBtVXBkYXRlU3RhdHVzOwotICAgIHByaXZhdGUgVGFibGUgbUhlYXBTdW1tYXJ5OwotICAgIHByaXZhdGUgQ29tYm8gbURpc3BsYXlNb2RlOwotCi0gICAgLy9wcml2YXRlIFNjcm9sbGVkQ29tcG9zaXRlIG1TY3JvbGxlZENvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1EaXNwbGF5QmFzZTsgLy8gYmFzZSBvZiB0aGUgZGlzcGxheXMuCi0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBtRGlzcGxheVN0YWNrOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVN0YXRpc3RpY3NCYXNlOwotICAgIHByaXZhdGUgVGFibGUgbVN0YXRpc3RpY3NUYWJsZTsKLSAgICBwcml2YXRlIEpGcmVlQ2hhcnQgbUNoYXJ0OwotICAgIHByaXZhdGUgQ2hhcnRDb21wb3NpdGUgbUNoYXJ0Q29tcG9zaXRlOwotICAgIHByaXZhdGUgQnV0dG9uIG1HY0J1dHRvbjsKLSAgICBwcml2YXRlIERlZmF1bHRDYXRlZ29yeURhdGFzZXQgbUFsbG9jQ291bnREYXRhU2V0OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUxpbmVhckJhc2U7Ci0gICAgcHJpdmF0ZSBMYWJlbCBtTGluZWFySGVhcEltYWdlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUhpbGJlcnRCYXNlOwotICAgIHByaXZhdGUgTGFiZWwgbUhpbGJlcnRIZWFwSW1hZ2U7Ci0gICAgcHJpdmF0ZSBHcm91cCBtTGVnZW5kOwotICAgIHByaXZhdGUgQ29tYm8gbVpvb207Ci0KLSAgICAvKiogSW1hZ2UgdXNlZCBmb3IgdGhlIGhpbGJlcnQgZGlzcGxheS4gU2luY2Ugd2UgcmVjcmVhdGUgYSBuZXcgaW1hZ2UgZXZlcnkgdGltZSwgd2UKLSAgICAgKiBrZWVwIHRoaXMgb25lIGFyb3VuZCB0byBkaXNwb3NlIGl0LiAqLwotICAgIHByaXZhdGUgSW1hZ2UgbUhpbGJlcnRJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1MaW5lYXJJbWFnZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZVtdIG1MYXlvdXQ7Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBjb2xvciBwYWxldHRlIGZvciBtYXAuICBTZXQgdXAgdGl0bGVzIGZvciBsZWdlbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGFsZXR0ZURhdGEgY3JlYXRlUGFsZXR0ZSgpIHsKLSAgICAgICAgUkdCIGNvbG9yc1tdID0gbmV3IFJHQltOVU1fUEFMRVRURV9FTlRSSUVTXTsKLSAgICAgICAgY29sb3JzWzBdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDE5MiwgMTkyLCAxOTIpOyAvLyBub24taGVhcCBwaXhlbHMgYXJlIGdyYXkKLSAgICAgICAgbU1hcExlZ2VuZFswXQotICAgICAgICAgICAgICAgID0gIihoZWFwIGV4cGFuc2lvbiBhcmVhKSI7Ci0KLSAgICAgICAgY29sb3JzWzFdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDAsIDAsIDApOyAgICAgICAvLyBmcmVlIGNodW5rcyBhcmUgYmxhY2sKLSAgICAgICAgbU1hcExlZ2VuZFsxXQotICAgICAgICAgICAgICAgID0gImZyZWUiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9PQkpFQ1QgKyAyXQotICAgICAgICAgICAgICAgID0gbmV3IFJHQigwLCAwLCAyNTUpOyAgICAgLy8gb2JqZWN0cyBhcmUgYmx1ZQotICAgICAgICBtTWFwTGVnZW5kW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX09CSkVDVCArIDJdCi0gICAgICAgICAgICAgICAgPSAiZGF0YSBvYmplY3QiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9DTEFTU19PQkpFQ1QgKyAyXQotICAgICAgICAgICAgICAgID0gbmV3IFJHQigwLCAyNTUsIDApOyAgICAgLy8gY2xhc3Mgb2JqZWN0cyBhcmUgZ3JlZW4KLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9DTEFTU19PQkpFQ1QgKyAyXQotICAgICAgICAgICAgICAgID0gImNsYXNzIG9iamVjdCI7Ci0KLSAgICAgICAgY29sb3JzW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX0FSUkFZXzEgKyAyXQotICAgICAgICAgICAgICAgID0gbmV3IFJHQigyNTUsIDAsIDApOyAgICAgLy8gYnl0ZS9ib29sIGFycmF5cyBhcmUgcmVkCi0gICAgICAgIG1NYXBMZWdlbmRbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfMSArIDJdCi0gICAgICAgICAgICAgICAgPSAiMS1ieXRlIGFycmF5IChieXRlW10sIGJvb2xlYW5bXSkiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV8yICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMjU1LCAxMjgsIDApOyAgIC8vIHNob3J0L2NoYXIgYXJyYXlzIGFyZSBvcmFuZ2UKLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV8yICsgMl0KLSAgICAgICAgICAgICAgICA9ICIyLWJ5dGUgYXJyYXkgKHNob3J0W10sIGNoYXJbXSkiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV80ICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMjU1LCAyNTUsIDApOyAgIC8vIG9iai9pbnQvZmxvYXQgYXJyYXlzIGFyZSB5ZWxsb3cKLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV80ICsgMl0KLSAgICAgICAgICAgICAgICA9ICI0LWJ5dGUgYXJyYXkgKG9iamVjdFtdLCBpbnRbXSwgZmxvYXRbXSkiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV84ICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMjU1LCAxMjgsIDEyOCk7IC8vIGxvbmcvZG91YmxlIGFycmF5cyBhcmUgcGluawotICAgICAgICBtTWFwTGVnZW5kW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX0FSUkFZXzggKyAyXQotICAgICAgICAgICAgICAgID0gIjgtYnl0ZSBhcnJheSAobG9uZ1tdLCBkb3VibGVbXSkiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9VTktOT1dOICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMjU1LCAwLCAyNTUpOyAgIC8vIHVua25vd24gb2JqZWN0cyBhcmUgY3lhbgotICAgICAgICBtTWFwTGVnZW5kW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX1VOS05PV04gKyAyXQotICAgICAgICAgICAgICAgID0gInVua25vd24gb2JqZWN0IjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfTkFUSVZFICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoNjQsIDY0LCA2NCk7ICAgIC8vIG5hdGl2ZSBvYmplY3RzIGFyZSBkYXJrIGdyYXkKLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9OQVRJVkUgKyAyXQotICAgICAgICAgICAgICAgID0gIm5vbi1KYXZhIG9iamVjdCI7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYWxldHRlRGF0YShjb2xvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhbiBleGlzdGluZyBjbGllbnQgaW5mb3JtYXRpb24gY2hhbmdlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBzZW50IGZyb20gYSBub24gVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIHVwZGF0ZWQgY2xpZW50LgotICAgICAqIEBwYXJhbSBjaGFuZ2VNYXNrIHRoZSBiaXQgbWFzayBkZXNjcmliaW5nIHRoZSBjaGFuZ2VkIHByb3BlcnRpZXMuIEl0IGNhbiBjb250YWluCi0gICAgICogYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9JTkZPfSwge0BsaW5rIENsaWVudCNDSEFOR0VfTkFNRX0KLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9ERUJVR0dFUl9TVEFUVVN9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9USFJFQURfTU9ERX0sCi0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfVEhSRUFEX0RBVEF9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9IRUFQX01PREV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX0hFQVBfREFUQX0sIHtAbGluayBDbGllbnQjQ0hBTkdFX05BVElWRV9IRUFQX0RBVEF9Ci0gICAgICoKLSAgICAgKiBAc2VlIElDbGllbnRDaGFuZ2VMaXN0ZW5lciNjbGllbnRDaGFuZ2VkKENsaWVudCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsaWVudENoYW5nZWQoZmluYWwgQ2xpZW50IGNsaWVudCwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgaWYgKGNsaWVudCA9PSBnZXRDdXJyZW50Q2xpZW50KCkpIHsKLSAgICAgICAgICAgIGlmICgoY2hhbmdlTWFzayAmIENsaWVudC5DSEFOR0VfSEVBUF9NT0RFKSA9PSBDbGllbnQuQ0hBTkdFX0hFQVBfTU9ERSB8fAotICAgICAgICAgICAgICAgICAgICAoY2hhbmdlTWFzayAmIENsaWVudC5DSEFOR0VfSEVBUF9EQVRBKSA9PSBDbGllbnQuQ0hBTkdFX0hFQVBfREFUQSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3AuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBpcyBkaXNwb3NlZCAoYXBwIGlzIHF1aXR0aW5nIG1vc3QgbGlrZWx5KSwgd2UgZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgZGV2aWNlIGlzIHNlbGVjdGVkLiBUaGUgbmV3IGRldmljZSBjYW4gYmUgYWNjZXNzZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0Q3VycmVudERldmljZSgpfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRldmljZVNlbGVjdGVkKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGNsaWVudCBpcyBzZWxlY3RlZC4gVGhlIG5ldyBjbGllbnQgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnRDbGllbnQoKX0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50U2VsZWN0ZWQoKSB7Ci0gICAgICAgIGlmIChtVG9wLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDbGllbnQgY2xpZW50ID0gZ2V0Q3VycmVudENsaWVudCgpOwotCi0gICAgICAgIExvZy5kKCJkZG1zIiwgIkhlYXBQYW5lbDogY2hhbmdlZCAiICsgY2xpZW50KTsKLQotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotCi0gICAgICAgICAgICBpZiAoY2xpZW50LmlzSGVhcFVwZGF0ZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIG1HY0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5TW9kZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHNldFVwZGF0ZVN0YXR1cyhFTkFCTEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0VXBkYXRlU3RhdHVzKE5PVF9FTkFCTEVEKTsKLSAgICAgICAgICAgICAgICBtR2NCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlNb2RlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWxsU3VtbWFyeVRhYmxlKGNkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG1vZGUgPSBtRGlzcGxheU1vZGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChtb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICBmaWxsRGV0YWlsZWRUYWJsZShjbGllbnQsIGZhbHNlIC8qIGZvcmNlUmVkcmF3ICovKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKERJU1BMQVlfSEVBUF9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVySGVhcERhdGEoY2QsIG1vZGUgLSAxLCBmYWxzZSAvKiBmb3JjZVJlZHJhdyAqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUdjQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbURpc3BsYXlNb2RlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZmlsbFN1bW1hcnlUYWJsZShudWxsKTsKLSAgICAgICAgICAgIGZpbGxEZXRhaWxlZFRhYmxlKG51bGwsIHRydWUpOwotICAgICAgICAgICAgc2V0VXBkYXRlU3RhdHVzKE5PVF9TRUxFQ1RFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzaXplcyBvZiB0aGluZ3MgY2hhbmdlIGZyZXF1ZW50bHksIHNvIHJlZG8gbGF5b3V0Ci0gICAgICAgIC8vbVNjcm9sbGVkQ29tcG9zaXRlLnNldE1pblNpemUobURpc3BsYXlTdGFjay50b3BDb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotICAgICAgICAvLyAgICAgICAgU1dULkRFRkFVTFQpKTsKLSAgICAgICAgbURpc3BsYXlCYXNlLmxheW91dCgpOwotICAgICAgICAvL21TY3JvbGxlZENvbXBvc2l0ZS5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgb3VyIGNvbnRyb2wocykuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1EaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdsOwotCi0gICAgICAgIG1Ub3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtVG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBtVG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIG1VcGRhdGVTdGF0dXMgPSBuZXcgTGFiZWwobVRvcCwgU1dULk5PTkUpOwotICAgICAgICBzZXRVcGRhdGVTdGF0dXMoTk9UX1NFTEVDVEVEKTsKLQotICAgICAgICBDb21wb3NpdGUgc3VtbWFyeVNlY3Rpb24gPSBuZXcgQ29tcG9zaXRlKG1Ub3AsIFNXVC5OT05FKTsKLSAgICAgICAgc3VtbWFyeVNlY3Rpb24uc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgICAgIG1IZWFwU3VtbWFyeSA9IGNyZWF0ZVN1bW1hcnlUYWJsZShzdW1tYXJ5U2VjdGlvbik7Ci0gICAgICAgIG1HY0J1dHRvbiA9IG5ldyBCdXR0b24oc3VtbWFyeVNlY3Rpb24sIFNXVC5QVVNIKTsKLSAgICAgICAgbUdjQnV0dG9uLnNldFRleHQoIkNhdXNlIEdDIik7Ci0gICAgICAgIG1HY0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUdjQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50IGNsaWVudCA9IGdldEN1cnJlbnRDbGllbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGVHYXJiYWdlQ29sbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBDb21wb3NpdGUgY29tYm9TZWN0aW9uID0gbmV3IENvbXBvc2l0ZShtVG9wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbWJvU2VjdGlvbi5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICAgIExhYmVsIGRpc3BsYXlMYWJlbCA9IG5ldyBMYWJlbChjb21ib1NlY3Rpb24sIFNXVC5OT05FKTsKLSAgICAgICAgZGlzcGxheUxhYmVsLnNldFRleHQoIkRpc3BsYXk6ICIpOwotCi0gICAgICAgIG1EaXNwbGF5TW9kZSA9IG5ldyBDb21ibyhjb21ib1NlY3Rpb24sIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtRGlzcGxheU1vZGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1EaXNwbGF5TW9kZS5hZGQoIlN0YXRzIik7Ci0gICAgICAgIGlmIChESVNQTEFZX0hFQVBfQklUTUFQKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU1vZGUuYWRkKCJMaW5lYXIiKTsKLSAgICAgICAgICAgIGlmIChESVNQTEFZX0hJTEJFUlRfQklUTUFQKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlNb2RlLmFkZCgiSGlsYmVydCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGJhc2Ugb2YgdGhlIGRpc3BsYXlzLgotICAgICAgICBtRGlzcGxheUJhc2UgPSBuZXcgQ29tcG9zaXRlKG1Ub3AsIFNXVC5OT05FKTsKLSAgICAgICAgbURpc3BsYXlCYXNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBtRGlzcGxheVN0YWNrID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIG1EaXNwbGF5QmFzZS5zZXRMYXlvdXQobURpc3BsYXlTdGFjayk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBzdGF0aXN0aWNzIGRpc3BsYXkKLSAgICAgICAgbVN0YXRpc3RpY3NCYXNlID0gbmV3IENvbXBvc2l0ZShtRGlzcGxheUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgLy9tU3RhdGlzdGljc0Jhc2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1TdGF0aXN0aWNzQmFzZS5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIG1EaXNwbGF5U3RhY2sudG9wQ29udHJvbCA9IG1TdGF0aXN0aWNzQmFzZTsKLSAgICAgICAgCi0gICAgICAgIG1TdGF0aXN0aWNzVGFibGUgPSBjcmVhdGVEZXRhaWxlZFRhYmxlKG1TdGF0aXN0aWNzQmFzZSk7Ci0gICAgICAgIG1TdGF0aXN0aWNzVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIAotICAgICAgICBjcmVhdGVDaGFydCgpOwotCi0gICAgICAgIC8vY3JlYXRlIHRoZSBsaW5lYXIgY29tcG9zaXRlCi0gICAgICAgIG1MaW5lYXJCYXNlID0gbmV3IENvbXBvc2l0ZShtRGlzcGxheUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgLy9tTGluZWFyQmFzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbUxpbmVhckJhc2Uuc2V0TGF5b3V0KGdsKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBtTGluZWFySGVhcEltYWdlID0gbmV3IExhYmVsKG1MaW5lYXJCYXNlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBtTGluZWFySGVhcEltYWdlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAgICAgbUxpbmVhckhlYXBJbWFnZS5zZXRJbWFnZShJbWFnZUhlbHBlci5jcmVhdGVQbGFjZUhvbGRlckFydChtRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgUExBQ0VIT0xERVJfTElORUFSX0hfU0laRSwgUExBQ0VIT0xERVJfTElORUFSX1ZfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbURpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBib3R0b20gcGFydCAobGVnZW5kKQotICAgICAgICAgICAgQ29tcG9zaXRlIGJvdHRvbVNlY3Rpb24gPSBuZXcgQ29tcG9zaXRlKG1MaW5lYXJCYXNlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGJvdHRvbVNlY3Rpb24uc2V0TGF5b3V0KGdsKTsKLQotICAgICAgICAgICAgY3JlYXRlTGVnZW5kKGJvdHRvbVNlY3Rpb24pOwotICAgICAgICB9Ci0KLS8qICAgICAgICAKLSAgICAgICAgbVNjcm9sbGVkQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKG1Ub3AsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbVNjcm9sbGVkQ29tcG9zaXRlLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICAgICAgbVNjcm9sbGVkQ29tcG9zaXRlLnNldENvbnRlbnQobURpc3BsYXlCYXNlKTsKLSovCi0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGhpbGJlcnQgZGlzcGxheS4KLSAgICAgICAgbUhpbGJlcnRCYXNlID0gbmV3IENvbXBvc2l0ZShtRGlzcGxheUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgLy9tSGlsYmVydEJhc2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIG1IaWxiZXJ0QmFzZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICAgIGlmIChESVNQTEFZX0hJTEJFUlRfQklUTUFQKSB7Ci0gICAgICAgICAgICBtSGlsYmVydEhlYXBJbWFnZSA9IG5ldyBMYWJlbChtSGlsYmVydEJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIG1IaWxiZXJ0SGVhcEltYWdlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAgICAgbUhpbGJlcnRIZWFwSW1hZ2Uuc2V0SW1hZ2UoSW1hZ2VIZWxwZXIuY3JlYXRlUGxhY2VIb2xkZXJBcnQobURpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIFBMQUNFSE9MREVSX0hJTEJFUlRfU0laRSwgUExBQ0VIT0xERVJfSElMQkVSVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICBtRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIHJpZ2h0IHBhcnQgKGxlZ2VuZCArIHpvb20pCi0gICAgICAgICAgICBDb21wb3NpdGUgcmlnaHRTZWN0aW9uID0gbmV3IENvbXBvc2l0ZShtSGlsYmVydEJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAgICAgcmlnaHRTZWN0aW9uLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgICAgIENvbXBvc2l0ZSB6b29tQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShyaWdodFNlY3Rpb24sIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICAgICAgem9vbUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKHpvb21Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGwuc2V0VGV4dCgiWm9vbToiKTsKLSAgICAgICAgICAgIG1ab29tID0gbmV3IENvbWJvKHpvb21Db21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICAgICAgZm9yIChpbnQgeiA6IFpPT01TKSB7Ci0gICAgICAgICAgICAgICAgbVpvb20uYWRkKFN0cmluZy5mb3JtYXQoIiUxJGQlJSIsIHopKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVpvb20uc2VsZWN0KDApOwotICAgICAgICAgICAgbVpvb20uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRMZWdlbmRUZXh0KG1ab29tLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgICAgICAgICBDbGllbnQgY2xpZW50ID0gZ2V0Q3VycmVudENsaWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckhlYXBEYXRhKGNsaWVudC5nZXRDbGllbnREYXRhKCksIDEsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRvcC5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgY3JlYXRlTGVnZW5kKHJpZ2h0U2VjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUhpbGJlcnRCYXNlLnBhY2soKTsKLQotICAgICAgICBtTGF5b3V0ID0gbmV3IENvbXBvc2l0ZVtdIHsgbVN0YXRpc3RpY3NCYXNlLCBtTGluZWFyQmFzZSwgbUhpbGJlcnRCYXNlIH07Ci0gICAgICAgIG1EaXNwbGF5TW9kZS5zZWxlY3QoMCk7Ci0gICAgICAgIG1EaXNwbGF5TW9kZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1EaXNwbGF5TW9kZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxEZXRhaWxlZFRhYmxlKGNsaWVudCwgdHJ1ZSAvKiBmb3JjZVJlZHJhdyAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJIZWFwRGF0YShjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLCBpbmRleC0xLCB0cnVlIC8qIGZvcmNlUmVkcmF3ICovKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1EaXNwbGF5U3RhY2sudG9wQ29udHJvbCA9IG1MYXlvdXRbaW5kZXhdOwotICAgICAgICAgICAgICAgIC8vbVNjcm9sbGVkQ29tcG9zaXRlLnNldE1pblNpemUobURpc3BsYXlTdGFjay50b3BDb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotICAgICAgICAgICAgICAgIC8vICAgICAgICBTV1QuREVGQVVMVCkpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5QmFzZS5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAvL21TY3JvbGxlZENvbXBvc2l0ZS5yZWRyYXcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9tU2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluU2l6ZShtRGlzcGxheVN0YWNrLnRvcENvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0gICAgICAgIC8vICAgICAgICBTV1QuREVGQVVMVCkpOwotICAgICAgICBtRGlzcGxheUJhc2UubGF5b3V0KCk7Ci0gICAgICAgIC8vbVNjcm9sbGVkQ29tcG9zaXRlLnJlZHJhdygpOwotCi0gICAgICAgIHJldHVybiBtVG9wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBwcm9wZXIgY29udHJvbCBpbnNpZGUgdGhlIHBhbmVsLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtSGVhcFN1bW1hcnkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIFRhYmxlIGNyZWF0ZVN1bW1hcnlUYWJsZShDb21wb3NpdGUgYmFzZSkgewotICAgICAgICBUYWJsZSB0YWIgPSBuZXcgVGFibGUoYmFzZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIHRhYi5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWIuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIGNvbDsKLQotICAgICAgICBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFiLCBTV1QuUklHSFQpOwotICAgICAgICBjb2wuc2V0VGV4dCgiSUQiKTsKLSAgICAgICAgY29sLnBhY2soKTsKLQotICAgICAgICBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFiLCBTV1QuUklHSFQpOwotICAgICAgICBjb2wuc2V0VGV4dCgiMDAwLjAwMFdXIik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGNvbC5wYWNrKCk7Ci0gICAgICAgIGNvbC5zZXRUZXh0KCJIZWFwIFNpemUiKTsKLQotICAgICAgICBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFiLCBTV1QuUklHSFQpOwotICAgICAgICBjb2wuc2V0VGV4dCgiMDAwLjAwMFdXIik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGNvbC5wYWNrKCk7Ci0gICAgICAgIGNvbC5zZXRUZXh0KCJBbGxvY2F0ZWQiKTsKLQotICAgICAgICBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFiLCBTV1QuUklHSFQpOwotICAgICAgICBjb2wuc2V0VGV4dCgiMDAwLjAwMFdXIik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGNvbC5wYWNrKCk7Ci0gICAgICAgIGNvbC5zZXRUZXh0KCJGcmVlIik7Ci0KLSAgICAgICAgY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYiwgU1dULlJJR0hUKTsKLSAgICAgICAgY29sLnNldFRleHQoIjAwMC4wMCUiKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLnBhY2soKTsKLSAgICAgICAgY29sLnNldFRleHQoIiUgVXNlZCIpOwotCi0gICAgICAgIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWIsIFNXVC5SSUdIVCk7Ci0gICAgICAgIGNvbC5zZXRUZXh0KCIwMDAsMDAwLDAwMCIpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICBjb2wucGFjaygpOwotICAgICAgICBjb2wuc2V0VGV4dCgiIyBPYmplY3RzIik7Ci0KLSAgICAgICAgcmV0dXJuIHRhYjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBUYWJsZSBjcmVhdGVEZXRhaWxlZFRhYmxlKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0gICAgICAgIAotICAgICAgICBUYWJsZSB0YWIgPSBuZXcgVGFibGUoYmFzZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIHRhYi5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWIuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKHRhYiwgIlR5cGUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiNC1ieXRlIGFycmF5IChvYmplY3RbXSwgaW50W10sIGZsb2F0W10pIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX1NUQVRTX0NPTF9UWVBFLCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odGFiLCAiQ291bnQiLCBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjAwLDAwMCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19TVEFUU19DT0xfQ09VTlQsIHN0b3JlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbih0YWIsICJUb3RhbCBTaXplIiwgU1dULlJJR0hULAotICAgICAgICAgICAgICAgICIwMDAuMDAwIFdXIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX1NUQVRTX0NPTF9TSVpFLCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odGFiLCAiU21hbGxlc3QiLCBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjAwMC4wMDAgV1ciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBVFNfQ09MX1NNQUxMRVNULCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odGFiLCAiTGFyZ2VzdCIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiMDAwLjAwMCBXVyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19TVEFUU19DT0xfTEFSR0VTVCwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKHRhYiwgIk1lZGlhbiIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiMDAwLjAwMCBXVyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19TVEFUU19DT0xfTUVESUFOLCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odGFiLCAiQXZlcmFnZSIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiMDAwLjAwMCBXVyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19TVEFUU19DT0xfQVZFUkFHRSwgc3RvcmUpOwotCi0gICAgICAgIHRhYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1TdGF0aXN0aWNzVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBtU3RhdGlzdGljc1RhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+PiBoZWFwTWFwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldFZtSGVhcERhdGEoKS5nZXRQcm9jZXNzZWRIZWFwTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+IGxpc3QgPSBoZWFwTWFwLmdldChpdGVtLmdldERhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NoYXJ0KGxpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRhYjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY2hhcnQgYmVsb3cgdGhlIHN0YXRpc3RpY3MgdGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2hhcnQoKSB7Ci0gICAgICAgIG1BbGxvY0NvdW50RGF0YVNldCA9IG5ldyBEZWZhdWx0Q2F0ZWdvcnlEYXRhc2V0KCk7Ci0gICAgICAgIG1DaGFydCA9IENoYXJ0RmFjdG9yeS5jcmVhdGVCYXJDaGFydChudWxsLCAiU2l6ZSIsICJDb3VudCIsIG1BbGxvY0NvdW50RGF0YVNldCwKLSAgICAgICAgICAgICAgICBQbG90T3JpZW50YXRpb24uVkVSVElDQUwsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIGZvbnQgdG8gbWFrZSBhIHByb3BlciB0aXRsZS4gV2UgbmVlZCB0byBjb252ZXJ0IHRoZSBzd3QgZm9udCwKLSAgICAgICAgLy8gaW50byBhbiBhd3QgZm9udC4KLSAgICAgICAgRm9udCBmID0gbVN0YXRpc3RpY3NCYXNlLmdldEZvbnQoKTsKLSAgICAgICAgRm9udERhdGFbXSBmRGF0YSA9IGYuZ2V0Rm9udERhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGV2ZW50IHRob3VnaCBvbiBNYWMgT1MgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBmb250RGF0YSwgd2UnbGwgb25seSB1c2UKLSAgICAgICAgLy8gdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgRm9udERhdGEgZmlyc3RGb250RGF0YSA9IGZEYXRhWzBdOwotICAgICAgICAKLSAgICAgICAgamF2YS5hd3QuRm9udCBhd3RGb250ID0gU1dUVXRpbHMudG9Bd3RGb250KG1TdGF0aXN0aWNzQmFzZS5nZXREaXNwbGF5KCksCi0gICAgICAgICAgICAgICAgZmlyc3RGb250RGF0YSwgdHJ1ZSAvKiBlbnN1cmVTYW1lU2l6ZSAqLyk7Ci0KLSAgICAgICAgbUNoYXJ0LnNldFRpdGxlKG5ldyBUZXh0VGl0bGUoIkFsbG9jYXRpb24gY291bnQgcGVyIHNpemUiLCBhd3RGb250KSk7Ci0gICAgICAgIAotICAgICAgICBQbG90IHBsb3QgPSBtQ2hhcnQuZ2V0UGxvdCgpOwotICAgICAgICBpZiAocGxvdCBpbnN0YW5jZW9mIENhdGVnb3J5UGxvdCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwbG90Ci0gICAgICAgICAgICBDYXRlZ29yeVBsb3QgY2F0ZWdvcnlQbG90ID0gKENhdGVnb3J5UGxvdClwbG90OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGRvbWFpbiBheGlzIHRvIGRyYXcgbGFiZWxzIHRoYXQgYXJlIGRpc3BsYXllZCBldmVuIHdpdGggbWFueSB2YWx1ZXMuCi0gICAgICAgICAgICBDYXRlZ29yeUF4aXMgZG9tYWluQXhpcyA9IGNhdGVnb3J5UGxvdC5nZXREb21haW5BeGlzKCk7Ci0gICAgICAgICAgICBkb21haW5BeGlzLnNldENhdGVnb3J5TGFiZWxQb3NpdGlvbnMoQ2F0ZWdvcnlMYWJlbFBvc2l0aW9ucy5ET1dOXzkwKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ2F0ZWdvcnlJdGVtUmVuZGVyZXIgcmVuZGVyZXIgPSBjYXRlZ29yeVBsb3QuZ2V0UmVuZGVyZXIoKTsKLSAgICAgICAgICAgIHJlbmRlcmVyLnNldEJhc2VUb29sVGlwR2VuZXJhdG9yKG5ldyBDYXRlZ29yeVRvb2xUaXBHZW5lcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVRvb2xUaXAoQ2F0ZWdvcnlEYXRhc2V0IGRhdGFzZXQsIGludCByb3csIGludCBjb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBrZXkgZm9yIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIEJ5dGVMb25nIGNvbHVtbktleSA9IChCeXRlTG9uZylkYXRhc2V0LmdldENvbHVtbktleShjb2x1bW4pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm93S2V5ID0gKFN0cmluZylkYXRhc2V0LmdldFJvd0tleShyb3cpOwotICAgICAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSBkYXRhc2V0LmdldFZhbHVlKHJvd0tleSwgY29sdW1uS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRkICUyJHMgb2YgJTMkZCBieXRlcyIsIHZhbHVlLmludFZhbHVlKCksIHJvd0tleSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uS2V5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIG1DaGFydENvbXBvc2l0ZSA9IG5ldyBDaGFydENvbXBvc2l0ZShtU3RhdGlzdGljc0Jhc2UsIFNXVC5CT1JERVIsIG1DaGFydCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX1dJRFRILAotICAgICAgICAgICAgICAgIENoYXJ0Q29tcG9zaXRlLkRFRkFVTFRfSEVJR0hULAotICAgICAgICAgICAgICAgIENoYXJ0Q29tcG9zaXRlLkRFRkFVTFRfTUlOSU1VTV9EUkFXX1dJRFRILAotICAgICAgICAgICAgICAgIENoYXJ0Q29tcG9zaXRlLkRFRkFVTFRfTUlOSU1VTV9EUkFXX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAzMDAwLCAvLyBtYXggZHJhdyB3aWR0aC4gV2UgZG9uJ3Qgd2FudCBpdCB0byB6b29tLCBzbyB3ZSBwdXQgYSBiaWcgbnVtYmVyCi0gICAgICAgICAgICAgICAgMzAwMCwgLy8gbWF4IGRyYXcgaGVpZ2h0LiBXZSBkb24ndCB3YW50IGl0IHRvIHpvb20sIHNvIHdlIHB1dCBhIGJpZyBudW1iZXIKLSAgICAgICAgICAgICAgICB0cnVlLCAgLy8gb2ZmLXNjcmVlbiBidWZmZXIKLSAgICAgICAgICAgICAgICB0cnVlLCAgLy8gcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHRydWUsICAvLyBzYXZlCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByaW50Ci0gICAgICAgICAgICAgICAgZmFsc2UsICAvLyB6b29tCi0gICAgICAgICAgICAgICAgdHJ1ZSk7ICAgLy8gdG9vbHRpcHMKLQotICAgICAgICBtQ2hhcnRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZXR0eUJ5dGVDb3VudChsb25nIGJ5dGVzKSB7Ci0gICAgICAgIGRvdWJsZSBmcmFjQnl0ZXMgPSBieXRlczsKLSAgICAgICAgU3RyaW5nIHVuaXRzID0gIiBCIjsKLSAgICAgICAgaWYgKGZyYWNCeXRlcyA8IDEwMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBzQnl0ZUZvcm1hdHRlci5mb3JtYXQoZnJhY0J5dGVzKSArIHVuaXRzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJhY0J5dGVzIC89IDEwMjQ7Ci0gICAgICAgICAgICB1bml0cyA9ICIgS0IiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFjQnl0ZXMgPj0gMTAyNCkgewotICAgICAgICAgICAgZnJhY0J5dGVzIC89IDEwMjQ7Ci0gICAgICAgICAgICB1bml0cyA9ICIgTUIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFjQnl0ZXMgPj0gMTAyNCkgewotICAgICAgICAgICAgZnJhY0J5dGVzIC89IDEwMjQ7Ci0gICAgICAgICAgICB1bml0cyA9ICIgR0IiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNMYXJnZUJ5dGVGb3JtYXR0ZXIuZm9ybWF0KGZyYWNCeXRlcykgKyB1bml0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwcm94aW1hdGVCeXRlQ291bnQobG9uZyBieXRlcykgewotICAgICAgICBkb3VibGUgZnJhY0J5dGVzID0gYnl0ZXM7Ci0gICAgICAgIFN0cmluZyB1bml0cyA9ICIiOwotICAgICAgICBpZiAoZnJhY0J5dGVzID49IDEwMjQpIHsKLSAgICAgICAgICAgIGZyYWNCeXRlcyAvPSAxMDI0OwotICAgICAgICAgICAgdW5pdHMgPSAiSyI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYWNCeXRlcyA+PSAxMDI0KSB7Ci0gICAgICAgICAgICBmcmFjQnl0ZXMgLz0gMTAyNDsKLSAgICAgICAgICAgIHVuaXRzID0gIk0iOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFjQnl0ZXMgPj0gMTAyNCkgewotICAgICAgICAgICAgZnJhY0J5dGVzIC89IDEwMjQ7Ci0gICAgICAgICAgICB1bml0cyA9ICJHIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzQnl0ZUZvcm1hdHRlci5mb3JtYXQoZnJhY0J5dGVzKSArIHVuaXRzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRDb21tYXNUb051bWJlcihsb25nIG51bSkgewotICAgICAgICByZXR1cm4gc0NvdW50Rm9ybWF0dGVyLmZvcm1hdChudW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmcmFjdGlvbmFsUGVyY2VudChsb25nIG51bSwgbG9uZyBkZW5vbSkgewotICAgICAgICBkb3VibGUgdmFsID0gKGRvdWJsZSludW0gLyAoZG91YmxlKWRlbm9tOwotICAgICAgICB2YWwgKj0gMTAwOwotCi0gICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBuZi5zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoMik7Ci0gICAgICAgIG5mLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygyKTsKLSAgICAgICAgcmV0dXJuIG5mLmZvcm1hdCh2YWwpICsgIiUiOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsU3VtbWFyeVRhYmxlKENsaWVudERhdGEgY2QpIHsKLSAgICAgICAgaWYgKG1IZWFwU3VtbWFyeS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1IZWFwU3VtbWFyeS5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgICBtSGVhcFN1bW1hcnkucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgaWYgKGNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2QpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxJbnRlZ2VyPiBpdGVyID0gY2QuZ2V0Vm1IZWFwSWRzKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgaWQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gaGVhcEluZm8gPSBjZC5nZXRWbUhlYXBJbmZvKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlYXBJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2l6ZUluQnl0ZXMgPSBoZWFwSW5mby5nZXQoQ2xpZW50RGF0YS5IRUFQX1NJWkVfQllURVMpOwotICAgICAgICAgICAgICAgICAgICBsb25nIGJ5dGVzQWxsb2NhdGVkID0gaGVhcEluZm8uZ2V0KENsaWVudERhdGEuSEVBUF9CWVRFU19BTExPQ0FURUQpOwotICAgICAgICAgICAgICAgICAgICBsb25nIG9iamVjdHNBbGxvY2F0ZWQgPSBoZWFwSW5mby5nZXQoQ2xpZW50RGF0YS5IRUFQX09CSkVDVFNfQUxMT0NBVEVEKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1IZWFwU3VtbWFyeSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMCwgaWQudG9TdHJpbmcoKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCBwcmV0dHlCeXRlQ291bnQoc2l6ZUluQnl0ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDIsIHByZXR0eUJ5dGVDb3VudChieXRlc0FsbG9jYXRlZCkpOwotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMywgcHJldHR5Qnl0ZUNvdW50KHNpemVJbkJ5dGVzIC0gYnl0ZXNBbGxvY2F0ZWQpKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDQsIGZyYWN0aW9uYWxQZXJjZW50KGJ5dGVzQWxsb2NhdGVkLCBzaXplSW5CeXRlcykpOwotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoNSwgYWRkQ29tbWFzVG9OdW1iZXIob2JqZWN0c0FsbG9jYXRlZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1IZWFwU3VtbWFyeS5wYWNrKCk7Ci0gICAgICAgIG1IZWFwU3VtbWFyeS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBmaWxsRGV0YWlsZWRUYWJsZShDbGllbnQgY2xpZW50LCBib29sZWFuIGZvcmNlUmVkcmF3KSB7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRoZSBjbGllbnQgaXMgaW52YWxpZCBvciBoZWFwIHVwZGF0ZXMgYXJlIG5vdCBlbmFibGVkLgotICAgICAgICBpZiAoY2xpZW50ID09IG51bGwgfHwgY2xpZW50LmlzSGVhcFVwZGF0ZUVuYWJsZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVN0YXRpc3RpY3NUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIHNob3dDaGFydChudWxsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ2xpZW50RGF0YSBjZCA9IGNsaWVudC5nZXRDbGllbnREYXRhKCk7Ci0KLSAgICAgICAgTWFwPEludGVnZXIsIEFycmF5TGlzdDxIZWFwU2VnbWVudEVsZW1lbnQ+PiBoZWFwTWFwOwotCi0gICAgICAgIC8vIEF0b21pY2FsbHkgZ2V0IGFuZCBjbGVhciB0aGUgaGVhcCBkYXRhLgotICAgICAgICBzeW5jaHJvbml6ZWQgKGNkKSB7Ci0gICAgICAgICAgICBpZiAoc2VyaWFsaXplSGVhcERhdGEoY2QuZ2V0Vm1IZWFwRGF0YSgpKSA9PSBmYWxzZSAmJiBmb3JjZVJlZHJhdyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSwgd2UgcmV0dXJuLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGVhcE1hcCA9IGNkLmdldFZtSGVhcERhdGEoKS5nZXRQcm9jZXNzZWRIZWFwTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHdlIGhhdmUgbmV3IGRhdGEsIGxldHMgZGlzcGxheSBpdC4KLSAgICAgICAgCi0gICAgICAgIC8vIEZpcnN0LCBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhbmQgaXRzIGtleS4KLSAgICAgICAgaW50IGluZGV4ID0gbVN0YXRpc3RpY3NUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBJbnRlZ2VyIHNlbGVjdGVkS2V5ID0gbnVsbDsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBzZWxlY3RlZEtleSA9IChJbnRlZ2VyKW1TdGF0aXN0aWNzVGFibGUuZ2V0SXRlbShpbmRleCkuZ2V0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGlzYWJsZSByZWRyYXdzIGFuZCByZW1vdmUgYWxsIGZyb20gdGhlIHRhYmxlLgotICAgICAgICBtU3RhdGlzdGljc1RhYmxlLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgIG1TdGF0aXN0aWNzVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaGVhcE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2VsZWN0ZWRJbmRleCA9IC0xOwotICAgICAgICAgICAgQXJyYXlMaXN0PEhlYXBTZWdtZW50RWxlbWVudD4gc2VsZWN0ZWRMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBrZXlzCi0gICAgICAgICAgICBTZXQ8SW50ZWdlcj4ga2V5cyA9IGhlYXBNYXAua2V5U2V0KCk7Ci0gICAgICAgICAgICBpbnQgaXRlciA9IDA7IC8vIHVzZSBhIG1hbnVhbCBpdGVyIGludCBiZWNhdXNlIFNldDw/PiBkb2Vzbid0IGhhdmUgYW4gaW5kZXgKLSAgICAgICAgICAgIC8vIGJhc2VkIGFjY2Vzc29yLgotICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SGVhcFNlZ21lbnRFbGVtZW50PiBsaXN0ID0gaGVhcE1hcC5nZXQoa2V5KTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGtleSB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoc2VsZWN0ZWRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBpdGVyOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExpc3QgPSBsaXN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpdGVyKys7Ci0KLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obVN0YXRpc3RpY3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShrZXkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDAsIG1NYXBMZWdlbmRba2V5XSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjb3VudCwgc21hbGxlc3QsIGxhcmdlc3QKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgYWRkQ29tbWFzVG9OdW1iZXIoY291bnQpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCBwcmV0dHlCeXRlQ291bnQobGlzdC5nZXQoMCkuZ2V0TGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDQsIHByZXR0eUJ5dGVDb3VudChsaXN0LmdldChjb3VudC0xKS5nZXRMZW5ndGgoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBtZWRpYW4gPSBjb3VudCAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIEhlYXBTZWdtZW50RWxlbWVudCBlbGVtZW50ID0gbGlzdC5nZXQobWVkaWFuKTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzaXplID0gZWxlbWVudC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDUsIHByZXR0eUJ5dGVDb3VudChzaXplKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9uZyB0b3RhbFNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBlbGVtZW50LmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplICs9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgYXZlcmFnZSBhbmQgdG90YWwKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDIsIHByZXR0eUJ5dGVDb3VudCh0b3RhbFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDYsIHByZXR0eUJ5dGVDb3VudCh0b3RhbFNpemUgLyBjb3VudCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXRpc3RpY3NUYWJsZS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRpc3RpY3NUYWJsZS5zZXRTZWxlY3Rpb24oc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgc2hvd0NoYXJ0KHNlbGVjdGVkTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNob3dDaGFydChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0aXN0aWNzVGFibGUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ5dGVMb25nIGltcGxlbWVudHMgQ29tcGFyYWJsZTxCeXRlTG9uZz4gewotICAgICAgICBwcml2YXRlIGxvbmcgbVZhbHVlOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBCeXRlTG9uZyhsb25nIHZhbHVlKSB7Ci0gICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBwcm94aW1hdGVCeXRlQ291bnQobVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEJ5dGVMb25nIG90aGVyKSB7Ci0gICAgICAgICAgICBpZiAobVZhbHVlICE9IG90aGVyLm1WYWx1ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWUgPCBvdGhlci5tVmFsdWUgPyAtMSA6IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIGNoYXJ0IHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGxpc3Qgb2Yge0BsaW5rIEhlYXBTZWdtZW50RWxlbWVudH0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dDaGFydChBcnJheUxpc3Q8SGVhcFNlZ21lbnRFbGVtZW50PiBsaXN0KSB7Ci0gICAgICAgIG1BbGxvY0NvdW50RGF0YVNldC5jbGVhcigpOwotCi0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByb3dLZXkgPSAiQWxsb2MgQ291bnQiOwotICAgIAotICAgICAgICAgICAgbG9uZyBjdXJyZW50U2l6ZSA9IC0xOwotICAgICAgICAgICAgaW50IGN1cnJlbnRDb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKEhlYXBTZWdtZW50RWxlbWVudCBlbGVtZW50IDogbGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldExlbmd0aCgpICE9IGN1cnJlbnRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2l6ZSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUxvbmcgY29sdW1uS2V5ID0gbmV3IEJ5dGVMb25nKGN1cnJlbnRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY0NvdW50RGF0YVNldC5hZGRWYWx1ZShjdXJyZW50Q291bnQsIHJvd0tleSwgY29sdW1uS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFNpemUgPSBlbGVtZW50LmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q291bnQgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYWRkIHRoZSBsYXN0IGl0ZW0KLSAgICAgICAgICAgIGlmIChjdXJyZW50U2l6ZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIEJ5dGVMb25nIGNvbHVtbktleSA9IG5ldyBCeXRlTG9uZyhjdXJyZW50U2l6ZSk7Ci0gICAgICAgICAgICAgICAgbUFsbG9jQ291bnREYXRhU2V0LmFkZFZhbHVlKGN1cnJlbnRDb3VudCwgcm93S2V5LCBjb2x1bW5LZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBZGQgYSBjb2xvciBsZWdlbmQgdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTGVnZW5kKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbUxlZ2VuZCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbUxlZ2VuZC5zZXRUZXh0KGdldExlZ2VuZFRleHQoMCkpOwotCi0gICAgICAgIG1MZWdlbmQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLSAgICAgICAgUkdCW10gY29sb3JzID0gbU1hcFBhbGV0dGUuY29sb3JzOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1BBTEVUVEVfRU5UUklFUzsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZSB0bXBJbWFnZSA9IGNyZWF0ZUNvbG9yUmVjdChwYXJlbnQuZ2V0RGlzcGxheSgpLCBjb2xvcnNbaV0pOwotCi0gICAgICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKG1MZWdlbmQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGwuc2V0SW1hZ2UodG1wSW1hZ2UpOwotCi0gICAgICAgICAgICBsID0gbmV3IExhYmVsKG1MZWdlbmQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGwuc2V0VGV4dChtTWFwTGVnZW5kW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldExlZ2VuZFRleHQoaW50IGxldmVsKSB7Ci0gICAgICAgIGludCBieXRlcyA9IDggKiAoMTAwIC8gWk9PTVNbbGV2ZWxdKTsKLQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiS2V5ICgxIHBpeGVsID0gJTEkZCBieXRlcykiLCBieXRlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldExlZ2VuZFRleHQoaW50IGxldmVsKSB7Ci0gICAgICAgIG1MZWdlbmQuc2V0VGV4dChnZXRMZWdlbmRUZXh0KGxldmVsKSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBhIG5pY2UgcmVjdGFuZ2xlIGluIHRoZSBzcGVjaWZpZWQgY29sb3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbWFnZSBjcmVhdGVDb2xvclJlY3QoRGlzcGxheSBkaXNwbGF5LCBSR0IgY29sb3IpIHsKLSAgICAgICAgaW50IHdpZHRoID0gMzI7Ci0gICAgICAgIGludCBoZWlnaHQgPSAxNjsKLQotICAgICAgICBJbWFnZSBpbWcgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIEdDIGdjID0gbmV3IEdDKGltZyk7Ci0gICAgICAgIGdjLnNldEJhY2tncm91bmQobmV3IENvbG9yKGRpc3BsYXksIGNvbG9yKSk7Ci0gICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGdjLmRpc3Bvc2UoKTsKLSAgICAgICAgcmV0dXJuIGltZzsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQXJlIHVwZGF0ZXMgZW5hYmxlZD8KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VXBkYXRlU3RhdHVzKGludCBzdGF0dXMpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgTk9UX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgIG1VcGRhdGVTdGF0dXMuc2V0VGV4dCgiU2VsZWN0IGEgY2xpZW50IHRvIHNlZSBoZWFwIHVwZGF0ZXMiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTk9UX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZVN0YXR1cy5zZXRUZXh0KCJIZWFwIHVwZGF0ZXMgYXJlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9UIEVOQUJMRUQgZm9yIHRoaXMgY2xpZW50Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZVN0YXR1cy5zZXRUZXh0KCJIZWFwIHVwZGF0ZXMgd2lsbCBoYXBwZW4gYWZ0ZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVyeSBHQyBmb3IgdGhpcyBjbGllbnQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1VcGRhdGVTdGF0dXMucGFjaygpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbG9zZXN0IHBvd2VyIG9mIHR3byBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlID49IHZhbHVlCi0gICAgICogQHJldHVybiBhIHBvd2VyIG9mIHR3byA+PSB2YWx1ZS4gIElmIHZhbHVlID4gMl4zMSwgMl4zMSBpcyByZXR1cm5lZC4KLSAgICAgKi8KLS8veHh4IHVzZSBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQoKSBvciBudW1iZXJPZkxlYWRpbmdaZXJvcygpLgotICAgIHByaXZhdGUgaW50IG5leHRQb3cyKGludCB2YWx1ZSkgewotICAgICAgICBmb3IgKGludCBpID0gMzE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgKDE8PGkpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCAzMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTw8KGkgKyAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTw8MzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHpPcmRlckRhdGEoSW1hZ2VEYXRhIGlkLCBieXRlIHBpeERhdGFbXSkgewotICAgICAgICBpbnQgbWF4WCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4RGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLyogVHJlYWQgdGhlIHBpeERhdGEgaW5kZXggYXMgYSB6LW9yZGVyIGN1cnZlIGluZGV4IGFuZAotICAgICAgICAgICAgICogZGVjb21wb3NlIGludG8gQ2FydGVzaWFuIGNvb3JkaW5hdGVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgeCA9IChpICYgMSkgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDIpICYgMSkgPDwgMSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gNCkgJiAxKSA8PCAyIHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiA2KSAmIDEpIDw8IDMgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDgpICYgMSkgPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTApICYgMSkgPDwgNSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTIpICYgMSkgPDwgNiB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTQpICYgMSkgPDwgNyB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTYpICYgMSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTgpICYgMSkgPDwgOSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMjApICYgMSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDIyKSAmIDEpIDw8IDExIHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiAyNCkgJiAxKSA8PCAxMiB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMjYpICYgMSkgPDwgMTMgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDI4KSAmIDEpIDw8IDE0IHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiAzMCkgJiAxKSA8PCAxNTsKLSAgICAgICAgICAgIGludCB5ID0gKChpID4+PiAxKSAmIDEpIDw8IDAgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDMpICYgMSkgPDwgMSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gNSkgJiAxKSA8PCAyIHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiA3KSAmIDEpIDw8IDMgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDkpICYgMSkgPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTEpICYgMSkgPDwgNSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTMpICYgMSkgPDwgNiB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTUpICYgMSkgPDwgNyB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTcpICYgMSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMTkpICYgMSkgPDwgOSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMjEpICYgMSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDIzKSAmIDEpIDw8IDExIHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiAyNSkgJiAxKSA8PCAxMiB8Ci0gICAgICAgICAgICAgICAgICAgICgoaSA+Pj4gMjcpICYgMSkgPDwgMTMgfAotICAgICAgICAgICAgICAgICAgICAoKGkgPj4+IDI5KSAmIDEpIDw8IDE0IHwKLSAgICAgICAgICAgICAgICAgICAgKChpID4+PiAzMSkgJiAxKSA8PCAxNTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWQuc2V0UGl4ZWwoeCwgeSwgcGl4RGF0YVtpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHggPiBtYXhYKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heFggPSB4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFkIHBpeGVsczogaSAiICsgaSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCB3ICIgKyBpZC53aWR0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBoICIgKyBpZC5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgeCAiICsgeCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCB5ICIgKyB5KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF4WDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSElMQkVSVF9ESVJfTiA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhJTEJFUlRfRElSX1MgPSAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBISUxCRVJUX0RJUl9FID0gMjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSElMQkVSVF9ESVJfVyA9IDM7Ci0KLSAgICBwcml2YXRlIHZvaWQgaGlsYmVydFdhbGsoSW1hZ2VEYXRhIGlkLCBJbnB1dFN0cmVhbSBwaXhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCB4LCBpbnQgeSwgaW50IGRpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHggPj0gaWQud2lkdGggfHwgeSA+PSBpZC5oZWlnaHQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChvcmRlciA9PSAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBwID0gcGl4RGF0YS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHAgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBmbGlwIGFsb25nIHg9eSBheGlzOyAgYXNzdW1lIHdpZHRoID09IGhlaWdodAotICAgICAgICAgICAgICAgICAgICBpZC5zZXRQaXhlbCh5LCB4LCBwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBTa2Fua3k7IHVzZSBhbiBvdGhlcndpc2UtdW51c2VkIEltYWdlRGF0YSBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgKiB0byBrZWVwIHRyYWNrIG9mIHRoZSBtYXggeCx5IHVzZWQuIE5vdGUgdGhhdCB4IGFuZCB5IGFyZSBpbnZlcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh5ID4gaWQueCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWQueCA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPiBpZC55KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZC55ID0geDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLS8veHh4IGp1c3QgZ2l2ZSB1cDsgZG9uJ3QgYm90aGVyIHdhbGtpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhZCBwaXhlbHM6IG9yZGVyICIgKyBvcmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBkaXIgIiArIGRpciArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCB3ICIgKyBpZC53aWR0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBoICIgKyBpZC5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgeCAiICsgeCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCB5ICIgKyB5KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9yZGVyLS07Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSAxIDw8IG9yZGVyOwotICAgICAgICAgICAgaW50IG5leHRYID0geCArIGRlbHRhOwotICAgICAgICAgICAgaW50IG5leHRZID0geSArIGRlbHRhOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICAgICAgY2FzZSBISUxCRVJUX0RJUl9FOgotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgICAgIHgsICAgICB5LCBISUxCRVJUX0RJUl9OKTsKLSAgICAgICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgcGl4RGF0YSwgb3JkZXIsICAgICB4LCBuZXh0WSwgSElMQkVSVF9ESVJfRSk7Ci0gICAgICAgICAgICAgICAgaGlsYmVydFdhbGsoaWQsIHBpeERhdGEsIG9yZGVyLCBuZXh0WCwgbmV4dFksIEhJTEJFUlRfRElSX0UpOwotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgbmV4dFgsICAgICB5LCBISUxCRVJUX0RJUl9TKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSElMQkVSVF9ESVJfTjoKLSAgICAgICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgcGl4RGF0YSwgb3JkZXIsICAgICB4LCAgICAgeSwgSElMQkVSVF9ESVJfRSk7Ci0gICAgICAgICAgICAgICAgaGlsYmVydFdhbGsoaWQsIHBpeERhdGEsIG9yZGVyLCBuZXh0WCwgICAgIHksIEhJTEJFUlRfRElSX04pOwotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgbmV4dFgsIG5leHRZLCBISUxCRVJUX0RJUl9OKTsKLSAgICAgICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgcGl4RGF0YSwgb3JkZXIsICAgICB4LCBuZXh0WSwgSElMQkVSVF9ESVJfVyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhJTEJFUlRfRElSX1M6Ci0gICAgICAgICAgICAgICAgaGlsYmVydFdhbGsoaWQsIHBpeERhdGEsIG9yZGVyLCBuZXh0WCwgbmV4dFksIEhJTEJFUlRfRElSX1cpOwotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgICAgIHgsIG5leHRZLCBISUxCRVJUX0RJUl9TKTsKLSAgICAgICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgcGl4RGF0YSwgb3JkZXIsICAgICB4LCAgICAgeSwgSElMQkVSVF9ESVJfUyk7Ci0gICAgICAgICAgICAgICAgaGlsYmVydFdhbGsoaWQsIHBpeERhdGEsIG9yZGVyLCBuZXh0WCwgICAgIHksIEhJTEJFUlRfRElSX0UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBISUxCRVJUX0RJUl9XOgotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgbmV4dFgsIG5leHRZLCBISUxCRVJUX0RJUl9TKTsKLSAgICAgICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgcGl4RGF0YSwgb3JkZXIsIG5leHRYLCAgICAgeSwgSElMQkVSVF9ESVJfVyk7Ci0gICAgICAgICAgICAgICAgaGlsYmVydFdhbGsoaWQsIHBpeERhdGEsIG9yZGVyLCAgICAgeCwgICAgIHksIEhJTEJFUlRfRElSX1cpOwotICAgICAgICAgICAgICAgIGhpbGJlcnRXYWxrKGlkLCBwaXhEYXRhLCBvcmRlciwgICAgIHgsIG5leHRZLCBISUxCRVJUX0RJUl9OKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSGlsYmVydCBkaXJlY3Rpb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgaGlsYmVydE9yZGVyRGF0YShJbWFnZURhdGEgaWQsIGJ5dGUgcGl4RGF0YVtdKSB7Ci0KLSAgICAgICAgaW50IG9yZGVyID0gMDsKLSAgICAgICAgZm9yIChpbnQgbiA9IDE7IG4gPCBpZC53aWR0aDsgbiAqPSAyKSB7Ci0gICAgICAgICAgICBvcmRlcisrOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNrYW5reTsgdXNlIGFuIG90aGVyd2lzZS11bnVzZWQgSW1hZ2VEYXRhIGZpZWxkCi0gICAgICAgICAqIHRvIGtlZXAgdHJhY2sgb2YgbWF4WC4KLSAgICAgICAgICovCi0gICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoMCwwKTsKLSAgICAgICAgaW50IG9sZElkWCA9IGlkLng7Ci0gICAgICAgIGludCBvbGRJZFkgPSBpZC55OwotICAgICAgICBpZC54ID0gaWQueSA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoaWxiZXJ0V2FsayhpZCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBpeERhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsIDAsIDAsIEhJTEJFUlRfRElSX0UpOwotICAgICAgICAgICAgcC54ID0gaWQueDsKLSAgICAgICAgICAgIHAueSA9IGlkLnk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgaGlsYmVydFdhbGsoKSIpOwotICAgICAgICAgICAgcC54ID0gaWQuaGVpZ2h0OwotICAgICAgICAgICAgcC55ID0gaWQud2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWQueCA9IG9sZElkWDsKLSAgICAgICAgaWQueSA9IG9sZElkWTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbWFnZURhdGEgY3JlYXRlSGlsYmVydEhlYXBJbWFnZShieXRlIHBpeERhdGFbXSkgewotICAgICAgICBpbnQgdywgaDsKLQotICAgICAgICAvLyBQaWNrIGFuIGltYWdlIHNpemUgdGhhdCB0aGUgbGFyZ2VzdCBvZiBoZWFwcyB3aWxsIGZpdCBpbnRvLgotICAgICAgICB3ID0gKGludClNYXRoLnNxcnQoKGRvdWJsZSkoKDE2ICogMTAyNCAqIDEwMjQpLzgpKTsKLQotICAgICAgICAvLyBTcGFjZS1maWxsaW5nIGN1cnZlcyByZXF1aXJlIGEgcG93ZXItb2YtMiB3aWR0aC4KLSAgICAgICAgdyA9IG5leHRQb3cyKHcpOwotICAgICAgICBoID0gdzsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGhlYXAgaW1hZ2UuCi0gICAgICAgIEltYWdlRGF0YSBpZCA9IG5ldyBJbWFnZURhdGEodywgaCwgOCwgbU1hcFBhbGV0dGUpOwotCi0gICAgICAgIC8vIENvcHkgdGhlIGRhdGEgaW50byB0aGUgaW1hZ2UKLSAgICAgICAgLy9pbnQgbWF4WCA9IHpPcmRlckRhdGEoaWQsIHBpeERhdGEpOwotICAgICAgICBQb2ludCBtYXhQID0gaGlsYmVydE9yZGVyRGF0YShpZCwgcGl4RGF0YSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBtYXggc2l6ZSB0byBtYWtlIGl0IGEgcm91bmQgbnVtYmVyIG9uY2UgdGhlIHpvb20gaXMgYXBwbGllZAotICAgICAgICBpbnQgZmFjdG9yID0gMTAwIC8gWk9PTVNbbVpvb20uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0gICAgICAgIGlmIChmYWN0b3IgIT0gMSkgewotICAgICAgICAgICAgaW50IHRtcCA9IG1heFAueCAlIGZhY3RvcjsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gMCkgewotICAgICAgICAgICAgICAgIG1heFAueCArPSBmYWN0b3IgLSB0bXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IG1heFAueSAlIGZhY3RvcjsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gMCkgewotICAgICAgICAgICAgICAgIG1heFAueSArPSBmYWN0b3IgLSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4UC55IDwgaWQuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBDcm9wIHRoZSBpbWFnZSBkb3duIHRvIHRoZSBpbnRlcmVzdGluZyBwYXJ0LgotICAgICAgICAgICAgaWQgPSBuZXcgSW1hZ2VEYXRhKGlkLndpZHRoLCBtYXhQLnksIGlkLmRlcHRoLCBpZC5wYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLnNjYW5saW5lUGFkLCBpZC5kYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhQLnggPCBpZC53aWR0aCkgewotICAgICAgICAgICAgLy8gY3JvcCB0aGUgaW1hZ2UgYWdhaW4uIEEgYml0IHRyaWNraWVyIHRoaXMgdGltZS4KLSAgICAgICAgICAgSW1hZ2VEYXRhIGNyb3BwZWRJZCA9IG5ldyBJbWFnZURhdGEobWF4UC54LCBpZC5oZWlnaHQsIGlkLmRlcHRoLCBpZC5wYWxldHRlKTsKLQotICAgICAgICAgICBpbnRbXSBidWZmZXIgPSBuZXcgaW50W21heFAueF07Ci0gICAgICAgICAgIGZvciAoaW50IGwgPSAwIDsgbCA8IGlkLmhlaWdodDsgbCsrKSB7Ci0gICAgICAgICAgICAgICBpZC5nZXRQaXhlbHMoMCwgbCwgbWF4UC54LCBidWZmZXIsIDApOwotICAgICAgICAgICAgICAgY3JvcHBlZElkLnNldFBpeGVscygwLCBsLCBtYXhQLngsIGJ1ZmZlciwgMCk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpZCA9IGNyb3BwZWRJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFwcGx5IHRoZSB6b29tCi0gICAgICAgIGlmIChmYWN0b3IgIT0gMSkgewotICAgICAgICAgICAgaWQgPSBpZC5zY2FsZWRUbyhpZC53aWR0aCAvIGZhY3RvciwgaWQuaGVpZ2h0IC8gZmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHRoZSByYXcgaGVhcCBkYXRhIHRvIGFuIGltYWdlLiAgV2Uga25vdyB3ZSdyZSBydW5uaW5nIGluCi0gICAgICogdGhlIFVJIHRocmVhZCwgc28gd2UgY2FuIGlzc3VlIGdyYXBoaWNzIGNvbW1hbmRzIGRpcmVjdGx5LgotICAgICAqCi0gICAgICogaHR0cDovL2hlbHAuZWNsaXBzZS5vcmcvaGVscDMxL25mdG9waWMvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3N3dC9ncmFwaGljcy9HQy5odG1sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2QgVGhlIGNsaWVudCBkYXRhCi0gICAgICogQHBhcmFtIG1vZGUgVGhlIGRpc3BsYXkgbW9kZS4gMCA9IGxpbmVhciwgMSA9IGhpbGJlcnQuCi0gICAgICogQHBhcmFtIGZvcmNlUmVkcmF3Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbmRlckhlYXBEYXRhKENsaWVudERhdGEgY2QsIGludCBtb2RlLCBib29sZWFuIGZvcmNlUmVkcmF3KSB7Ci0gICAgICAgIEltYWdlIGltYWdlOwotCi0gICAgICAgIGJ5dGVbXSBwaXhEYXRhOwotCi0gICAgICAgIC8vIEF0b21pY2FsbHkgZ2V0IGFuZCBjbGVhciB0aGUgaGVhcCBkYXRhLgotICAgICAgICBzeW5jaHJvbml6ZWQgKGNkKSB7Ci0gICAgICAgICAgICBpZiAoc2VyaWFsaXplSGVhcERhdGEoY2QuZ2V0Vm1IZWFwRGF0YSgpKSA9PSBmYWxzZSAmJiBmb3JjZVJlZHJhdyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSwgd2UgcmV0dXJuLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGl4RGF0YSA9IGdldFNlcmlhbGl6ZWREYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGl4RGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbWFnZURhdGEgaWQ7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWQgPSBjcmVhdGVIaWxiZXJ0SGVhcEltYWdlKHBpeERhdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZCA9IGNyZWF0ZUxpbmVhckhlYXBJbWFnZShwaXhEYXRhLCAyMDAsIG1NYXBQYWxldHRlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2UobURpc3BsYXksIGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFJlbmRlciBhIHBsYWNlaG9sZGVyIGltYWdlLgotICAgICAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgPSBQTEFDRUhPTERFUl9ISUxCRVJUX1NJWkU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoID0gUExBQ0VIT0xERVJfTElORUFSX0hfU0laRTsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSBQTEFDRUhPTERFUl9MSU5FQVJfVl9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2UobURpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChtRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZSgwLCAwLCB3aWR0aC0xLCBoZWlnaHQtMSk7Ci0gICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBnYyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIG5ldyBpbWFnZQotCi0gICAgICAgIGlmIChtb2RlID09IDEpIHsKLSAgICAgICAgICAgIGlmIChtSGlsYmVydEltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSGlsYmVydEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUhpbGJlcnRJbWFnZSA9IGltYWdlOwotICAgICAgICAgICAgbUhpbGJlcnRIZWFwSW1hZ2Uuc2V0SW1hZ2UobUhpbGJlcnRJbWFnZSk7Ci0gICAgICAgICAgICBtSGlsYmVydEhlYXBJbWFnZS5wYWNrKHRydWUpOwotICAgICAgICAgICAgbUhpbGJlcnRCYXNlLmxheW91dCgpOwotICAgICAgICAgICAgbUhpbGJlcnRCYXNlLnBhY2sodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVhckltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZWFySW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTGluZWFySW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgICAgIG1MaW5lYXJIZWFwSW1hZ2Uuc2V0SW1hZ2UobUxpbmVhckltYWdlKTsKLSAgICAgICAgICAgIG1MaW5lYXJIZWFwSW1hZ2UucGFjayh0cnVlKTsKLSAgICAgICAgICAgIG1MaW5lYXJCYXNlLmxheW91dCgpOwotICAgICAgICAgICAgbUxpbmVhckJhc2UucGFjayh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFRhYmxlRm9jdXNMaXN0ZW5lcigpIHsKLSAgICAgICAgYWRkVGFibGVUb0ZvY3VzTGlzdGVuZXIobUhlYXBTdW1tYXJ5KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSUltYWdlTG9hZGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0lJbWFnZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JmNjEyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSUltYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgYW4gaW1hZ2UgbG9hZGVyLiBqYXIgYXBwL2xpYiBhbmQgcGx1Z2luIGhhdmUgZGlmZmVyZW50IHBhY2thZ2luZyBtZXRob2QKLSAqIHNvIGVhY2ggaW1wbGVtZW50YXRpb24gd2lsbCBiZSBkaWZmZXJlbnQuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGltcGxlbWVudCBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMsIGFuZCBwcmVmZXJhYmx5IGJvdGggaWYgcG9zc2libGUuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbWFnZUxvYWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGFuIGltYWdlIGZyb20gdGhlIHJlc291cmNlIGZyb20gYSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBkaXNwbGF5Ci0gICAgICovCi0gICAgcHVibGljIEltYWdlIGxvYWRJbWFnZShTdHJpbmcgZmlsZW5hbWUsIERpc3BsYXkgZGlzcGxheSk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGFuIEltYWdlRGVzY3JpcHRvciBmcm9tIHRoZSByZXNvdXJjZSBmcm9tIGEgZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gZGlzcGxheQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgbG9hZERlc2NyaXB0b3IoU3RyaW5nIGZpbGVuYW1lLCBEaXNwbGF5IGRpc3BsYXkpOwotCi19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0lUYWJsZUZvY3VzTGlzdGVuZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSVRhYmxlRm9jdXNMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQyNWQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSVRhYmxlRm9jdXNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLQotLyoqCi0gKiBBbiBvYmplY3QgbGlzdGVuaW5nIHRvIGZvY3VzIGNoYW5nZSBpbiBUYWJsZSBvYmplY3RzLjxicj4KLSAqIEZvciBhcHBsaWNhdGlvbiBub3QgcmVseWluZyBvbiBhIFJDUCB0byBwcm92aWRlIG1lbnUgY2hhbmdlcyBiYXNlZCBvbiBmb2N1cywKLSAqIHRoaXMgY2xhc3MgYWxsb3dzIHRvIGdldCBtb25pdG9yIHRoZSBmb2N1cyBjaGFuZ2Ugb2Ygc2V2ZXJhbCBUYWJsZSB3aWRnZXQKLSAqIGFuZCB1cGRhdGUgdGhlIG1lbnUgYWN0aW9uIGFjY29yZGluZ2x5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWJsZUZvY3VzTGlzdGVuZXIgewotCi0JcHVibGljIGludGVyZmFjZSBJRm9jdXNlZFRhYmxlQWN0aXZhdG9yIHsKLQkJcHVibGljIHZvaWQgY29weShDbGlwYm9hcmQgY2xpcGJvYXJkKTsKLQotCQlwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChJRm9jdXNlZFRhYmxlQWN0aXZhdG9yIGFjdGl2YXRvcik7Ci0KLQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoSUZvY3VzZWRUYWJsZUFjdGl2YXRvciBhY3RpdmF0b3IpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9JbWFnZUhlbHBlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU5NzhiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIEltYWdlSGVscGVyIHsKLQotICAgIC8qKgotICAgICAqIExvYWRzIGFuIGltYWdlIGZyb20gYSByZXNvdXJjZS4gVGhpcyBtZXRob2QgdXNlZCBhIGNsYXNzIHRvIGxvY2F0ZSB0aGUKLSAgICAgKiByZXNvdXJjZXMsIGFuZCB0aGVuIGxvYWQgdGhlIGZpbGVuYW1lIGZyb20gL2ltYWdlcyBpbnNpZGUgdGhlIHJlc291cmNlcy48YnI+Ci0gICAgICogRXh0cmEgcGFyYW1ldGVycyBhbGxvd3MgZm9yIGNyZWF0aW9uIG9mIGEgcmVwbGFjZW1lbnQgaW1hZ2Ugb2YgdGhlCi0gICAgICogbG9hZGluZyBmYWlsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBpbWFnZSBsb2FkZXIgdXNlZC4KLSAgICAgKiBAcGFyYW0gZGlzcGxheSB0aGUgRGlzcGxheSBvYmplY3QKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZQotICAgICAqIEBwYXJhbSB3aWR0aCBvcHRpb25hbCB3aWR0aCB0byBjcmVhdGUgcmVwbGFjZW1lbnQgSW1hZ2UuIElmIC0xLCBudWxsIGJlCi0gICAgICogICAgICAgICAgICBiZSByZXR1cm5lZCBpZiB0aGUgbG9hZGluZyBmYWlscy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IG9wdGlvbmFsIGhlaWdodCB0byBjcmVhdGUgcmVwbGFjZW1lbnQgSW1hZ2UuIElmIC0xLCBudWxsIGJlCi0gICAgICogICAgICAgICAgICBiZSByZXR1cm5lZCBpZiB0aGUgbG9hZGluZyBmYWlscy4KLSAgICAgKiBAcGFyYW0gcGhDb2xvciBvcHRpb25hbCBjb2xvciB0byBjcmVhdGUgcmVwbGFjZW1lbnQgSW1hZ2UuIElmIG51bGwsIEJsdWUKLSAgICAgKiAgICAgICAgICAgIGNvbG9yIHdpbGwgYmUgdXNlZC4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IEltYWdlIG9yIG51bGwgaWYgdGhlIGxvYWRpbmcgZmFpbGVkIGFuZCB0aGUgb3B0aW9uYWwKLSAgICAgKiAgICAgICAgIHJlcGxhY2VtZW50IHNpemUgd2FzIC0xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBsb2FkSW1hZ2UoSUltYWdlTG9hZGVyIGxvYWRlciwgRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIENvbG9yIHBoQ29sb3IpIHsKLQotICAgICAgICBJbWFnZSBpbWcgPSBudWxsOwotICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGltZyA9IGxvYWRlci5sb2FkSW1hZ2UoZmlsZU5hbWUsIGRpc3BsYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGltZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudygiZGRtcyIsICJDb3VsZG4ndCBsb2FkICIgKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBoYWQgdGhlIGV4dHJhIHBhcmFtZXRlciB0byBjcmVhdGUgcmVwbGFjZW1lbnQgaW1hZ2UgdGhlbiB3ZQotICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCByZXR1cm4gaXQuCi0gICAgICAgICAgICBpZiAod2lkdGggIT0gLTEgJiYgaGVpZ2h0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYWNlSG9sZGVyQXJ0KGRpc3BsYXksIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaENvbG9yICE9IG51bGwgPyBwaENvbG9yIDogZGlzcGxheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBqdXN0IHJldHVybiBudWxsCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHBsYWNlLWhvbGRlciBhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgY3JlYXRlUGxhY2VIb2xkZXJBcnQoRGlzcGxheSBkaXNwbGF5LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICBpbnQgaGVpZ2h0LCBDb2xvciBjb2xvcikgewotICAgICAgICBJbWFnZSBpbWcgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIEdDIGdjID0gbmV3IEdDKGltZyk7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoY29sb3IpOwotICAgICAgICBnYy5kcmF3TGluZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZ2MuZHJhd0xpbmUoMCwgaGVpZ2h0IC0gMSwgd2lkdGgsIC0xKTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gaW1nOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9JbWFnZUxvYWRlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9JbWFnZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmYyMjg1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSW1hZ2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBJbWFnZSBsb2FkZXIgZm9yIGFuIG5vcm1hbCBzdGFuZGFsb25lIGFwcC4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlTG9hZGVyIGltcGxlbWVudHMgSUltYWdlTG9hZGVyIHsKLQotICAgIC8qKiBjbGFzcyB1c2VkIGFzIHJlZmVyZW5jZSB0byBnZXQgdGhlIHJlb3VyY2VzICovCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBtQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9hZGVyIGZvciBhIHNwZWNpZmljIGNsYXNzLiBUaGUgY2xhc3MgYWxsb3dzIGphdmEgdG8gZmlndXJlCi0gICAgICogb3V0IHdoaWNoIC5qYXIgZmlsZSB0byBzZWFyY2ggZm9yIHRoZSBpbWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZUxvYWRlcihDbGFzczw/PiB0aGVDbGFzcykgewotICAgICAgICBtQ2xhc3MgPSB0aGVDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWREZXNjcmlwdG9yKFN0cmluZyBmaWxlbmFtZSwgRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgSW1hZ2VEZXNjcmlwdG9yCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBsb2FkSW1hZ2UoU3RyaW5nIGZpbGVuYW1lLCBEaXNwbGF5IGRpc3BsYXkpIHsKLQotICAgICAgICBTdHJpbmcgdG1wID0gIi9pbWFnZXMvIiArIGZpbGVuYW1lOwotICAgICAgICBJbnB1dFN0cmVhbSBpbWFnZVN0cmVhbSA9IG1DbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHRtcCk7Ci0KLSAgICAgICAgaWYgKGltYWdlU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEltYWdlIGltZyA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZVN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAoaW1nID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb3VsZG4ndCBsb2FkICIgKyB0bXApOwotICAgICAgICAgICAgcmV0dXJuIGltZzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSW5mb1BhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL0luZm9QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JiOTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvSW5mb1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSUNsaWVudENoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogRGlzcGxheSBjbGllbnQgaW5mbyBpbiBhIHR3by1jb2x1bW4gZm9ybWF0LgotICovCi1wdWJsaWMgY2xhc3MgSW5mb1BhbmVsIGV4dGVuZHMgVGFibGVQYW5lbCB7Ci0gICAgcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0gICAgcHJpdmF0ZSBUYWJsZUNvbHVtbiBtQ29sMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtTGFiZWxzW10gPSB7Ci0gICAgICAgICJERE0tYXdhcmU/IiwKLSAgICAgICAgIkFwcCBkZXNjcmlwdGlvbjoiLAotICAgICAgICAiVk0gdmVyc2lvbjoiLAotICAgICAgICAiUHJvY2VzcyBJRDoiLAotICAgICAgICAiU3VwcG9ydHMgUHJvZmlsaW5nIENvbnRyb2w6IiwKLSAgICAgICAgIlN1cHBvcnRzIEhQUk9GIENvbnRyb2w6IiwKLSAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRfRERNX0FXQVJFICAgICAgICAgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5UX0FQUF9ERVNDUiAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVF9WTV9WRVJTSU9OICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRfUFJPQ0VTU19JRCAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5UX1NVUFBPUlRTX1BST0ZJTElORyA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVF9TVVBQT1JUU19IUFJPRiAgICAgPSA1OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG91ciBjb250cm9sKHMpLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtVGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIG1UYWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIGNvbDEgPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlLCBTV1QuUklHSFQpOwotICAgICAgICBjb2wxLnNldFRleHQoIm5hbWUiKTsKLSAgICAgICAgbUNvbDIgPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlLCBTV1QuTEVGVCk7Ci0gICAgICAgIG1Db2wyLnNldFRleHQoIlBsYWNlSG9sZGVyQ29udGVudEZvcldpZHRoIik7Ci0KLSAgICAgICAgVGFibGVJdGVtIGl0ZW07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxhYmVscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMCwgbUxhYmVsc1tpXSk7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgIi0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbDEucGFjaygpOwotICAgICAgICBtQ29sMi5wYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1UYWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgcHJvcGVyIGNvbnRyb2wgaW5zaWRlIHRoZSBwYW5lbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgbVRhYmxlLnNldEZvY3VzKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXhpc3RpbmcgY2xpZW50IGluZm9ybWF0aW9uIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSB1cGRhdGVkIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgYml0IG1hc2sgZGVzY3JpYmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLiBJdCBjYW4gY29udGFpbgotICAgICAqIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoge0BsaW5rIENsaWVudCNDSEFOR0VfUE9SVH0sIHtAbGluayBDbGllbnQjQ0hBTkdFX05BTUV9Ci0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfREVCVUdHRVJfU1RBVFVTfSwge0BsaW5rIENsaWVudCNDSEFOR0VfVEhSRUFEX01PREV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9IRUFQX0RBVEF9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9OQVRJVkVfSEVBUF9EQVRBfQotICAgICAqCi0gICAgICogQHNlZSBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGllbnRDaGFuZ2VkKGZpbmFsIENsaWVudCBjbGllbnQsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIGlmIChjbGllbnQgPT0gZ2V0Q3VycmVudENsaWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoKGNoYW5nZU1hc2sgJiBDbGllbnQuQ0hBTkdFX0lORk8pID09IENsaWVudC5DSEFOR0VfSU5GTykgewotICAgICAgICAgICAgICAgIGlmIChtVGFibGUuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBtVGFibGUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4gVGhlIG5ldyBkZXZpY2UgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnREZXZpY2UoKX0KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VTZWxlY3RlZCgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyBjbGllbnQgaXMgc2VsZWN0ZWQuIFRoZSBuZXcgY2xpZW50IGNhbiBiZSBhY2Nlc3NlZAotICAgICAqIHdpdGgge0BsaW5rICNnZXRDdXJyZW50Q2xpZW50KCl9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xpZW50U2VsZWN0ZWQoKSB7Ci0gICAgICAgIGlmIChtVGFibGUuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0KLSAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MYWJlbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG1UYWJsZS5nZXRJdGVtKGkpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCAiLSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW07Ci0gICAgICAgICAgICBTdHJpbmcgY2xpZW50RGVzY3JpcHRpb24sIHZtSWRlbnRpZmllciwgaXNEZG1Bd2FyZSwKLSAgICAgICAgICAgICAgICBwaWQ7Ci0KLSAgICAgICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChjZCkgewotICAgICAgICAgICAgICAgIGNsaWVudERlc2NyaXB0aW9uID0gKGNkLmdldENsaWVudERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgY2QuZ2V0Q2xpZW50RGVzY3JpcHRpb24oKSA6ICI/IjsKLSAgICAgICAgICAgICAgICB2bUlkZW50aWZpZXIgPSAoY2QuZ2V0Vm1JZGVudGlmaWVyKCkgIT0gbnVsbCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgY2QuZ2V0Vm1JZGVudGlmaWVyKCkgOiAiPyI7Ci0gICAgICAgICAgICAgICAgaXNEZG1Bd2FyZSA9IGNkLmlzRGRtQXdhcmUoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA6ICJubyI7Ci0gICAgICAgICAgICAgICAgcGlkID0gKGNkLmdldFBpZCgpICE9IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNkLmdldFBpZCgpKSA6ICI/IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaXRlbSA9IG1UYWJsZS5nZXRJdGVtKEVOVF9BUFBfREVTQ1IpOwotICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDEsIGNsaWVudERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIGl0ZW0gPSBtVGFibGUuZ2V0SXRlbShFTlRfVk1fVkVSU0lPTik7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgdm1JZGVudGlmaWVyKTsKLSAgICAgICAgICAgIGl0ZW0gPSBtVGFibGUuZ2V0SXRlbShFTlRfRERNX0FXQVJFKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCBpc0RkbUF3YXJlKTsKLSAgICAgICAgICAgIGl0ZW0gPSBtVGFibGUuZ2V0SXRlbShFTlRfUFJPQ0VTU19JRCk7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgcGlkKTsKLSAgICAgICAgICAgIGl0ZW0gPSBtVGFibGUuZ2V0SXRlbShFTlRfU1VQUE9SVFNfUFJPRklMSU5HKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCBCb29sZWFuLnRvU3RyaW5nKGNkLmhhc0ZlYXR1cmUoQ2xpZW50RGF0YS5GRUFUVVJFX1BST0ZJTElORykpKTsKLSAgICAgICAgICAgIGl0ZW0gPSBtVGFibGUuZ2V0SXRlbShFTlRfU1VQUE9SVFNfSFBST0YpOwotICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDEsIEJvb2xlYW4udG9TdHJpbmcoY2QuaGFzRmVhdHVyZShDbGllbnREYXRhLkZFQVRVUkVfSFBST0YpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29sMi5wYWNrKCk7Ci0KLSAgICAgICAgLy9Mb2cuaSgiZGRtcyIsICJJbmZvUGFuZWw6IGNoYW5nZWQgIiArIGNsaWVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVGb2N1c0xpc3RlbmVyKCkgewotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihtVGFibGUpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9OYXRpdmVIZWFwUGFuZWwuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvTmF0aXZlSGVhcFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjQ2MGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9OYXRpdmVIZWFwUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk5hdGl2ZUFsbG9jYXRpb25JbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5OYXRpdmVMaWJyYXJ5TWFwSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTmF0aXZlU3RhY2tDYWxsSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklDbGllbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSGVhcFNlZ21lbnQuSGVhcFNlZ21lbnRFbGVtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmFubm90YXRpb24uV29ya2VyVGhyZWFkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFBhbmVsIHdpdGggbmF0aXZlIGhlYXAgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVIZWFwUGFuZWwgZXh0ZW5kcyBCYXNlSGVhcFBhbmVsIHsKLQotICAgIC8qKiBjb2xvciBwYWxldHRlIGFuZCBtYXAgbGVnZW5kLiBOQVRJVkUgaXMgdGhlIGxhc3QgZW51bSBpcyBhIDAgYmFzZWQgZW51bSBsaXN0LCBzbyB3ZSBuZWVkCi0gICAgICogTmF0aXZlKzEgYXQgbGVhc3QuIFdlIGFsc28gbmVlZCAyIG1vcmUgZW50cmllcyBmb3IgZnJlZSBhcmVhIGFuZCBleHBhbnNpb24gYXJlYS4gICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9QQUxFVFRFX0VOVFJJRVMgPSBIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9OQVRJVkUrMiArMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtTWFwTGVnZW5kID0gbmV3IFN0cmluZ1tOVU1fUEFMRVRURV9FTlRSSUVTXTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWxldHRlRGF0YSBtTWFwUGFsZXR0ZSA9IGNyZWF0ZVBhbGV0dGUoKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfRElTUExBWV9BTEwgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExPQ19ESVNQTEFZX1BSRV9aWUdPVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExPQ19ESVNQTEFZX1BPU1RfWllHT1RFID0gMjsKLQotICAgIHByaXZhdGUgRGlzcGxheSBtRGlzcGxheTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1CYXNlOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBtVXBkYXRlU3RhdHVzOwotCi0gICAgLyoqIGNvbWJvIGdpdmluZyBjaG9pY2Ugb2Ygd2hhdCB0byBkaXNwbGF5OiBhbGwsIHByZS16eWdvdGUsIHBvc3Qtenlnb3RlICovCi0gICAgcHJpdmF0ZSBDb21ibyBtQWxsb2NEaXNwbGF5Q29tYm87Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRnVsbFVwZGF0ZUJ1dHRvbjsKLQotICAgIC8vIHNlZSBDcmVhdGVDb250cm9sKCkKLSAgICAvL3ByaXZhdGUgQnV0dG9uIG1EaWZmVXBkYXRlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDb21ibyBtRGlzcGxheU1vZGVDb21ibzsKLQotICAgIC8qKiBzdGFjayBjb21wb3NpdGUgZm9yIG1vZGUgKDEtMikgJiAzICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVRvcFN0YWNrQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBtVG9wU3RhY2tMYXlvdXQ7Ci0KLSAgICAvKiogc3RhY2sgY29tcG9zaXRlIGZvciBtb2RlIDEgJiAyICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUFsbG9jYXRpb25TdGFja0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgbUFsbG9jYXRpb25TdGFja0xheW91dDsKLQotICAgIC8qKiB0b3AgbGV2ZWwgY29udGFpbmVyIGZvciBtb2RlIDEgJiAyICovCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVRhYmxlTW9kZUNvbnRyb2w7Ci0KLSAgICAvKiogdG9wIGxldmVsIG9iamVjdCBmb3IgdGhlIGFsbG9jYXRpb24gbW9kZSAqLwotICAgIHByaXZhdGUgQ29udHJvbCBtQWxsb2NhdGlvbk1vZGVUb3A7Ci0KLSAgICAvKiogdG9wIGxldmVsIGZvciB0aGUgbGlicmFyeSBtb2RlICovCi0gICAgcHJpdmF0ZSBDb250cm9sIG1MaWJyYXJ5TW9kZVRvcENvbnRyb2w7Ci0KLSAgICAvKiogY29tcG9zaXRlIGZvciBwYWdlIFVJIGFuZCB0b3RhbCBtZW1vcnkgZGlzcGxheSAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1QYWdlVUlDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIExhYmVsIG1Ub3RhbE1lbW9yeUxhYmVsOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBtUGFnZUxhYmVsOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVBhZ2VOZXh0QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVBhZ2VQcmV2aW91c0J1dHRvbjsKLQotICAgIHByaXZhdGUgVGFibGUgbUFsbG9jYXRpb25UYWJsZTsKLQotICAgIHByaXZhdGUgVGFibGUgbUxpYnJhcnlUYWJsZTsKLQotICAgIHByaXZhdGUgVGFibGUgbUxpYnJhcnlBbGxvY2F0aW9uVGFibGU7Ci0KLSAgICBwcml2YXRlIFRhYmxlIG1EZXRhaWxUYWJsZTsKLQotICAgIHByaXZhdGUgTGFiZWwgbUltYWdlOwotICAgIAotICAgIHByaXZhdGUgaW50IG1BbGxvY0Rpc3BsYXlNb2RlID0gQUxMT0NfRElTUExBWV9BTEw7Ci0KLSAgICAvKioKLSAgICAgKiBwb2ludGVyIHRvIGN1cnJlbnQgc3RhY2tjYWxsIHRocmVhZCBjb21wdXRhdGlvbiBpbiBvcmRlciB0byBxdWl0IGl0IGlmCi0gICAgICogcmVxdWlyZWQgKG5ldyB1cGRhdGUgcmVxdWVzdGVkKQotICAgICAqLwotICAgIHByaXZhdGUgU3RhY2tDYWxsVGhyZWFkIG1TdGFja0NhbGxUaHJlYWQ7Ci0KLSAgICAvKiogQ3VycmVudCBMaWJyYXJ5IEFsbG9jYXRpb24gdGFibGUgZmlsbCB0aHJlYWQuIGtpbGxlZCBpZiBzZWxlY3Rpb24gY2hhbmdlcyAqLwotICAgIHByaXZhdGUgRmlsbFRhYmxlVGhyZWFkIG1GaWxsVGFibGVUaHJlYWQ7Ci0KLSAgICAvKioKLSAgICAgKiBjdXJyZW50IGNsaWVudCBkYXRhLiBVc2VkIHRvIGFjY2VzcyB0aGUgbWFsbG9jIGluZm8gd2hlbiBzd2l0Y2hpbmcgcGFnZXMKLSAgICAgKiBvciBzZWxlY3RpbmcgYWxsb2NhdGlvbiB0byBzaG93IHN0YWNrIGNhbGwKLSAgICAgKi8KLSAgICBwcml2YXRlIENsaWVudERhdGEgbUNsaWVudERhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBjbGllbnQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZGlzcGxheS4gdXNlZCB3aGVuIGFza2luZyBmb3IgYW4gInVwZGF0ZSAmIGRpZmYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGllbnREYXRhIG1CYWNrVXBDbGllbnREYXRhOwotCi0gICAgLyoqIGxpc3Qgb2YgTmF0aXZlQWxsb2NhdGlvbkluZm8gb2JqZWN0cyBmaWxsZWQgd2l0aCB0aGUgbGlzdCBmcm9tIENsaWVudERhdGEgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4gbUFsbG9jYXRpb25zID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4oKTsKLSAgICAKLSAgICAvKiogbGlzdCBvZiB0aGUge0BsaW5rIE5hdGl2ZUFsbG9jYXRpb25JbmZvfSBiZWluZyBkaXNwbGF5ZWQgYmFzZWQgb24gdGhlIHNlbGVjdGlvbgotICAgICAqIG9mIHtAbGluayAjbUFsbG9jRGlzcGxheUNvbWJvfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4gbURpc3BsYXllZEFsbG9jYXRpb25zID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYXRpdmVBbGxvY2F0aW9uSW5mbz4oKTsKLQotICAgIC8qKiBsaXN0IG9mIE5hdGl2ZUFsbG9jYXRpb25JbmZvIG9iamVjdCBrZXB0IGFzIGJhY2t1cCB3aGVuIGRvaW5nIGFuICJ1cGRhdGUgJiBkaWZmIiAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPiBtQmFja1VwQWxsb2NhdGlvbnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPigpOwotCi0gICAgLyoqIGJhY2sgdXAgb2YgdGhlIHRvdGFsIG1lbW9yeSwgdXNlZCB3aGVuIGRvaW5nIGFuICJ1cGRhdGUgJiBkaWZmIiAqLwotICAgIHByaXZhdGUgaW50IG1CYWNrVXBUb3RhbE1lbW9yeTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50UGFnZSA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBtUGFnZUNvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqIGxpc3Qgb2YgYWxsb2NhdGlvbiBwZXIgTGlicmFyeS4gVGhpcyBpcyBjcmVhdGVkIGZyb20gdGhlIGxpc3Qgb2YKLSAgICAgKiBOYXRpdmVBbGxvY2F0aW9uSW5mbyBvYmplY3RzIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBDbGllbnREYXRhIG9iamVjdC4gU2luY2Ugd2UKLSAgICAgKiBkb24ndCBrZWVwIHRoaXMgbGlzdCBhcm91bmQsIGl0IGlzIHJlY29tcHV0ZWQgZXZlcnl0aW1lIHRoZSBjbGllbnQKLSAgICAgKiBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExpYnJhcnlBbGxvY2F0aW9ucz4gbUxpYnJhcnlBbGxvY2F0aW9ucyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8TGlicmFyeUFsbG9jYXRpb25zPigpOwotCi0gICAgLyogYXJncyB0byBzZXRVcGRhdGVTdGF0dXMoKSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfU0VMRUNURUQgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9FTkFCTEVEID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1BFUl9QQUdFID0gMjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQUxMT0NBVElPTl9TQVNIID0gIk5IYWxsb2NTYXNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19MSUJSQVJZX1NBU0ggPSAiTkhsaWJyYXJ5U2FzaCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfREVUQUlMX0FERFJFU1MgPSAiTkhkZXRhaWxBZGRyZXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19ERVRBSUxfTElCUkFSWSA9ICJOSGRldGFpbExpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0RFVEFJTF9NRVRIT0QgPSAiTkhkZXRhaWxNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0RFVEFJTF9GSUxFID0gIk5IZGV0YWlsRmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfREVUQUlMX0xJTkUgPSAiTkhkZXRhaWxMaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19BTExPQ19UT1RBTCA9ICJOSGFsbG9jVG90YWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0FMTE9DX0NPVU5UID0gIk5IYWxsb2NDb3VudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQUxMT0NfU0laRSA9ICJOSGFsbG9jU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQUxMT0NfTElCUkFSWSA9ICJOSGFsbG9jTGliIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19BTExPQ19NRVRIT0QgPSAiTkhhbGxvY01ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfQUxMT0NfRklMRSA9ICJOSGFsbG9jRmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfTElCX0xJQlJBUlkgPSAiTkhsaWJMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19MSUJfU0laRSA9ICJOSGxpYlNpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0xJQl9DT1VOVCA9ICJOSGxpYkNvdW50IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19MSUJBTExPQ19UT1RBTCA9ICJOSGxpYkFsbG9jVG90YWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0xJQkFMTE9DX0NPVU5UID0gIk5IbGliQWxsb2NDb3VudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfTElCQUxMT0NfU0laRSA9ICJOSGxpYkFsbG9jU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfTElCQUxMT0NfTUVUSE9EID0gIk5IbGliQWxsb2NNZXRob2QiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogc3RhdGljIGZvcm1hdHRlciBvYmplY3QgdG8gZm9ybWF0IGFsbCBudW1iZXJzIGFzICMsIyMjICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGVjaW1hbEZvcm1hdCBzRm9ybWF0dGVyOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNGb3JtYXR0ZXIgPSAoRGVjaW1hbEZvcm1hdClOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKHNGb3JtYXR0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNGb3JtYXR0ZXIgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIywjIyMiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc0Zvcm1hdHRlci5hcHBseVBhdHRlcm4oIiMsIyMjIik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBjYWNoaW5nIG1lY2hhbmlzbSB0byBhdm9pZCByZWNvbXB1dGluZyB0aGUgYmFja3RyYWNlIGZvciBhIHBhcnRpY3VsYXIKLSAgICAgKiBhZGRyZXNzIHNldmVyYWwgdGltZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPExvbmcsIE5hdGl2ZVN0YWNrQ2FsbEluZm8+IG1Tb3VyY2VDYWNoZSA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPExvbmcsTmF0aXZlU3RhY2tDYWxsSW5mbz4oKTsKLSAgICBwcml2YXRlIGxvbmcgbVRvdGFsU2l6ZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU2F2ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3ltYm9sc0J1dHRvbjsKLQotICAgIC8qKgotICAgICAqIHRocmVhZCBjbGFzcyB0byBjb252ZXJ0IHRoZSBhZGRyZXNzIGNhbGwgaW50byBtZXRob2QsIGZpbGUgYW5kIGxpbmUKLSAgICAgKiBudW1iZXIgaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGFja0NhbGxUaHJlYWQgZXh0ZW5kcyBCYWNrZ3JvdW5kVGhyZWFkIHsKLSAgICAgICAgcHJpdmF0ZSBDbGllbnREYXRhIG1DbGllbnREYXRhOwotCi0gICAgICAgIHB1YmxpYyBTdGFja0NhbGxUaHJlYWQoQ2xpZW50RGF0YSBjZCkgewotICAgICAgICAgICAgbUNsaWVudERhdGEgPSBjZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbGllbnREYXRhIGdldENsaWVudERhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsaWVudERhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgTmF0aXZlQWxsb2NhdGlvbkluZm8gYW5kIGluaXQgdGhlbQotICAgICAgICAgICAgSXRlcmF0b3I8TmF0aXZlQWxsb2NhdGlvbkluZm8+IGl0ZXIgPSBtQWxsb2NhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGludCB0b3RhbCA9IG1BbGxvY2F0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNRdWl0dGluZygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBOYXRpdmVBbGxvY2F0aW9uSW5mbyBpbmZvID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8uaXNTdGFja0NhbGxSZXNvbHZlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExvbmdbXSBsaXN0ID0gaW5mby5nZXRTdGFja0NhbGxBZGRyZXNzZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxOYXRpdmVTdGFja0NhbGxJbmZvPiByZXNvbHZlZFN0YWNrQ2FsbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hdGl2ZVN0YWNrQ2FsbEluZm8+KCk7IAotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGFkZHIgPSBsaXN0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGUgYWRkciBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVN0YWNrQ2FsbEluZm8gc291cmNlID0gbVNvdXJjZUNhY2hlLmdldChhZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IHdlIGNvbnZlcnQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZUZvckFkZHIoYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZUNhY2hlLnB1dChhZGRyLCBzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFN0YWNrQ2FsbC5hZGQoc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRSZXNvbHZlZFN0YWNrQ2FsbChyZXNvbHZlZFN0YWNrQ2FsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGFmdGVyIGV2ZXJ5IERJU1BMQVlfUEVSX1BBR0Ugd2UgYXNrIGZvciBhIHVpIHJlZnJlc2gsIHVubGVzcwotICAgICAgICAgICAgICAgIC8vIHdlIHJlYWNoIHRvdGFsLCBzaW5jZSB3ZSBhbHNvIGRvIGl0IGFmdGVyIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgLy8gKG9ubHkgYW4gaXNzdWUgaW4gY2FzZSB3ZSBoYXZlIGEgcGVyZmVjdCBudW1iZXIgb2YgcGFnZSkKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIGlmICgoY291bnQgJSBESVNQTEFZX1BFUl9QQUdFKSA9PSAwICYmIGNvdW50ICE9IHRvdGFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVOSEFsbG9jYXRpb25TdGFja0NhbGxzKG1DbGllbnREYXRhLCBjb3VudCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgdGhlIGFwcCBpcyBxdWl0dGluZywgc28gd2UganVzdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcHBlZCB0aGUgdGhyZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZU5IQWxsb2NhdGlvblN0YWNrQ2FsbHMobUNsaWVudERhdGEsIGNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTmF0aXZlU3RhY2tDYWxsSW5mbyBzb3VyY2VGb3JBZGRyKGxvbmcgYWRkcikgewotICAgICAgICAgICAgTmF0aXZlTGlicmFyeU1hcEluZm8gbGlicmFyeSA9IGdldExpYnJhcnlGb3IoYWRkcik7Ci0KLSAgICAgICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIEFkZHIyTGluZSBwcm9jZXNzID0gQWRkcjJMaW5lLmdldFByb2Nlc3MobGlicmFyeS5nZXRMaWJyYXJ5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgYmFzZSBvZiB0aGUgbGlicmFyeSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsdWUgPSBhZGRyIC0gbGlicmFyeS5nZXRTdGFydEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTmF0aXZlU3RhY2tDYWxsSW5mbyBpbmZvID0gcHJvY2Vzcy5nZXRBZGRyZXNzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU3RhY2tDYWxsSW5mbyhsaWJyYXJ5ICE9IG51bGwgPyBsaWJyYXJ5LmdldExpYnJhcnlOYW1lKCkgOiBudWxsLAotICAgICAgICAgICAgICAgICAgICBMb25nLnRvSGV4U3RyaW5nKGFkZHIpLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE5hdGl2ZUxpYnJhcnlNYXBJbmZvIGdldExpYnJhcnlGb3IobG9uZyBhZGRyKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxOYXRpdmVMaWJyYXJ5TWFwSW5mbz4gaXQgPSBtQ2xpZW50RGF0YS5nZXROYXRpdmVMaWJyYXJ5TWFwSW5mbygpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTmF0aXZlTGlicmFyeU1hcEluZm8gaW5mbyA9IGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzV2l0aGluTGlicmFyeShhZGRyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExvZy5kKCJkZG0tbmF0aXZlaGVhcCIsICJGYWlsZWQgZmluZGluZyBMaWJyYXJ5IGZvciAiICsgTG9uZy50b0hleFN0cmluZyhhZGRyKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB1cGRhdGUgdGhlIE5hdGl2ZSBIZWFwIHBhbmVsIHdpdGggdGhlIGFtb3VudCBvZiBhbGxvY2F0aW9uIGZvciB3aGljaCB0aGUKLSAgICAgICAgICogc3RhY2sgY2FsbCBoYXMgYmVlbiBjb21wdXRlZC4gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIG5vbiBVSSB0aHJlYWQsIGJ1dAotICAgICAgICAgKiB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGFsbG9jYXRpb24KLSAgICAgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgZGlzcGxheSB3YXMgZGlzcG9zZWQgYW5kIHRoZSB1cGRhdGUgY291bGRuJ3QgaGFwcGVuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlTkhBbGxvY2F0aW9uU3RhY2tDYWxscyhmaW5hbCBDbGllbnREYXRhIGNsaWVudERhdGEsIGZpbmFsIGludCBjb3VudCkgewotICAgICAgICAgICAgaWYgKG1EaXNwbGF5LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFsbG9jYXRpb25TdGFja0NhbGxzKGNsaWVudERhdGEsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGaWxsVGFibGVUaHJlYWQgZXh0ZW5kcyBCYWNrZ3JvdW5kVGhyZWFkIHsKLSAgICAgICAgcHJpdmF0ZSBMaWJyYXJ5QWxsb2NhdGlvbnMgbUxpYkFsbG9jOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1NYXg7Ci0KLSAgICAgICAgcHVibGljIEZpbGxUYWJsZVRocmVhZChMaWJyYXJ5QWxsb2NhdGlvbnMgbGliYWxsb2MsIGludCBtKSB7Ci0gICAgICAgICAgICBtTGliQWxsb2MgPSBsaWJhbGxvYzsKLSAgICAgICAgICAgIG1NYXggPSBtOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtTWF4OyBpID4gMCAmJiBpc1F1aXR0aW5nKCkgPT0gZmFsc2U7IGkgLT0gMTApIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVOSExpYnJhcnlBbGxvY2F0aW9uVGFibGUobUxpYkFsbG9jLCBtTWF4IC0gaSwgbU1heCAtIGkgKyAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogdXBkYXRlcyB0aGUgbGlicmFyeSBhbGxvY2F0aW9uIHRhYmxlIGluIHRoZSBOYXRpdmUgSGVhcCBwYW5lbC4gVGhpcyBpcwotICAgICAgICAgKiBjYWxsZWQgZnJvbSBhIG5vbiBVSSB0aHJlYWQsIGJ1dCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaWJhbGxvYyB0aGUgY3VycmVudCBsaWJyYXJ5IGFsbG9jYXRpb24gb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgICAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgaW5kZXggb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGRpc3BsYXllZAotICAgICAgICAgKiBAcGFyYW0gZW5kIGVuZCBpbmRleCBvZiB0aGUgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGRpc3BsYXllZAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5ITGlicmFyeUFsbG9jYXRpb25UYWJsZShmaW5hbCBMaWJyYXJ5QWxsb2NhdGlvbnMgbGliQWxsb2MsCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAobURpc3BsYXkuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGlicmFyeUFsbG9jYXRpb25UYWJsZShsaWJBbGxvYywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGNsYXNzIHRvIGFnZ3JlZ2F0ZSBhbGxvY2F0aW9ucyBwZXIgbGlicmFyeSAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlicmFyeUFsbG9jYXRpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUxpYnJhcnk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TmF0aXZlQWxsb2NhdGlvbkluZm8+IG1MaWJBbGxvY2F0aW9ucyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPigpOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1TaXplOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1Db3VudDsKLQotICAgICAgICAvKiogY29uc3RydWN0IHRoZSBhZ2dyZWdhdGUgb2JqZWN0IGZvciBhIGxpYnJhcnkgKi8KLSAgICAgICAgcHVibGljIExpYnJhcnlBbGxvY2F0aW9ucyhmaW5hbCBTdHJpbmcgbGliKSB7Ci0gICAgICAgICAgICBtTGlicmFyeSA9IGxpYjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBnZXQgdGhlIGxpYnJhcnkgbmFtZSAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExpYnJhcnkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxpYnJhcnk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogYWRkIGEgTmF0aXZlQWxsb2NhdGlvbkluZm8gb2JqZWN0IHRvIHRoaXMgYWdncmVnYXRlIG9iamVjdCAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGxvY2F0aW9uKE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluZm8pIHsKLSAgICAgICAgICAgIG1MaWJBbGxvY2F0aW9ucy5hZGQoaW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogZ2V0IGFuIGl0ZXJhdG9yIG9uIHRoZSBOYXRpdmVBbGxvY2F0aW9uSW5mbyBvYmplY3RzICovCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvcjxOYXRpdmVBbGxvY2F0aW9uSW5mbz4gZ2V0QWxsb2NhdGlvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxpYkFsbG9jYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogZ2V0IGEgTmF0aXZlQWxsb2NhdGlvbkluZm8gb2JqZWN0IGJ5IGluZGV4ICovCi0gICAgICAgIHB1YmxpYyBOYXRpdmVBbGxvY2F0aW9uSW5mbyBnZXRBbGxvY2F0aW9uKGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1MaWJBbGxvY2F0aW9ucy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIHJldHVybnMgdGhlIE5hdGl2ZUFsbG9jYXRpb25JbmZvIG9iamVjdCBjb3VudCAqLwotICAgICAgICBwdWJsaWMgaW50IGdldEFsbG9jYXRpb25TaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG1MaWJBbGxvY2F0aW9ucy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogcmV0dXJucyB0aGUgdG90YWwgYWxsb2NhdGlvbiBzaXplICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogY29tcHV0ZSB0aGUgYWxsb2NhdGlvbiBjb3VudCBhbmQgc2l6ZSBmb3IgYWxsb2NhdGlvbiBvYmplY3RzIGFkZGVkCi0gICAgICAgICAqIHRocm91Z2ggPGNvZGU+YWRkQWxsb2NhdGlvbigpPC9jb2RlPiwgYW5kIHNvcnQgdGhlIG9iamVjdHMgYnkKLSAgICAgICAgICogdG90YWwgYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY29tcHV0ZUFsbG9jYXRpb25TaXplQW5kQ291bnQoKSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtQ291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChOYXRpdmVBbGxvY2F0aW9uSW5mbyBpbmZvIDogbUxpYkFsbG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgbUNvdW50ICs9IGluZm8uZ2V0QWxsb2NhdGlvbkNvdW50KCk7Ci0gICAgICAgICAgICAgICAgbVNpemUgKz0gaW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKSAqIGluZm8uZ2V0U2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtTGliQWxsb2NhdGlvbnMsIG5ldyBDb21wYXJhdG9yPE5hdGl2ZUFsbG9jYXRpb25JbmZvPigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTmF0aXZlQWxsb2NhdGlvbkluZm8gbzEsIE5hdGl2ZUFsbG9jYXRpb25JbmZvIG8yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvMi5nZXRBbGxvY2F0aW9uQ291bnQoKSAqIG8yLmdldFNpemUoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBvMS5nZXRBbGxvY2F0aW9uQ291bnQoKSAqIG8xLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBvdXIgY29udHJvbChzKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBtRGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgbUJhc2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBnbC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgIG1CYXNlLnNldExheW91dChnbCk7Ci0gICAgICAgIG1CYXNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICAKLSAgICAgICAgLy8gY29tcG9zaXRlIGZvciA8dXBkYXRlIGJ0bj4gPHN0YXR1cz4KLSAgICAgICAgQ29tcG9zaXRlIHRtcCA9IG5ldyBDb21wb3NpdGUobUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgdG1wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0bXAuc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgZ2wubWFyZ2luV2lkdGggPSBnbC5tYXJnaW5IZWlnaHQgPSAwOwotCi0gICAgICAgIG1GdWxsVXBkYXRlQnV0dG9uID0gbmV3IEJ1dHRvbih0bXAsIFNXVC5OT05FKTsKLSAgICAgICAgbUZ1bGxVcGRhdGVCdXR0b24uc2V0VGV4dCgiRnVsbCBVcGRhdGUiKTsKLSAgICAgICAgbUZ1bGxVcGRhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtQmFja1VwQ2xpZW50RGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlNb2RlQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVNhdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1wdHlUYWJsZXMoKTsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdGFjayBjYWxsIGNvbXB1dGF0aW9uIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgLy8gY2xpZW50Ci0gICAgICAgICAgICAgICAgLy8gd2Ugc3RvcCBpdAotICAgICAgICAgICAgICAgIGlmIChtU3RhY2tDYWxsVGhyZWFkICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQuZ2V0Q2xpZW50RGF0YSgpID09IG1DbGllbnREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQucXVpdCgpOwotICAgICAgICAgICAgICAgICAgICBtU3RhY2tDYWxsVGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZXF1ZXN0TmF0aXZlSGVhcEluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtVXBkYXRlU3RhdHVzID0gbmV3IExhYmVsKHRtcCwgU1dULk5PTkUpOwotICAgICAgICBtVXBkYXRlU3RhdHVzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIHRvcCBsYXlvdXQgZm9yIHRoZSBjb21ib3MgYW5kIG90ZXIgY29udHJvbHMgb24gdGhlIHJpZ2h0LgotICAgICAgICBDb21wb3NpdGUgdG9wX2xheW91dCA9IG5ldyBDb21wb3NpdGUobUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgdG9wX2xheW91dC5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5XaWR0aCA9IGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIAotICAgICAgICBuZXcgTGFiZWwodG9wX2xheW91dCwgU1dULk5PTkUpLnNldFRleHQoIlNob3c6Iik7Ci0gICAgICAgIAotICAgICAgICBtQWxsb2NEaXNwbGF5Q29tYm8gPSBuZXcgQ29tYm8odG9wX2xheW91dCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtQWxsb2NEaXNwbGF5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1BbGxvY0Rpc3BsYXlDb21iby5hZGQoIkFsbCBBbGxvY2F0aW9ucyIpOwotICAgICAgICBtQWxsb2NEaXNwbGF5Q29tYm8uYWRkKCJQcmUtWnlnb3RlIEFsbG9jYXRpb25zIik7Ci0gICAgICAgIG1BbGxvY0Rpc3BsYXlDb21iby5hZGQoIlp5Z290ZSBDaGlsZCBBbGxvY2F0aW9ucyAoWikiKTsKLSAgICAgICAgbUFsbG9jRGlzcGxheUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25BbGxvY0Rpc3BsYXlDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1BbGxvY0Rpc3BsYXlDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzZXBhcmF0b3IKLSAgICAgICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHRvcF9sYXlvdXQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotICAgICAgICBHcmlkRGF0YSBnZDsKLSAgICAgICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IDA7Ci0gICAgICAgIGdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0KLSAgICAgICAgbVNhdmVCdXR0b24gPSBuZXcgQnV0dG9uKHRvcF9sYXlvdXQsIFNXVC5QVVNIKTsKLSAgICAgICAgbVNhdmVCdXR0b24uc2V0VGV4dCgiU2F2ZS4uLiIpOwotICAgICAgICBtU2F2ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVNhdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhtQmFzZS5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldFRleHQoIlNhdmUgQWxsb2NhdGlvbnMiKTsKLSAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCJhbGxvY2F0aW9ucy50eHQiKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNhdmVBbGxvY2F0aW9ucyhmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86IGVpdGhlciBmaXggdGhlIGRpZmYgbWVjaGFuaXNtIG9yIHJlbW92ZSBpdCBhbHRvZ2V0aGVyLgotICAgICAgICBtRGlmZlVwZGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24odG9wX2xheW91dCwgU1dULk5PTkUpOwotICAgICAgICBtRGlmZlVwZGF0ZUJ1dHRvbi5zZXRUZXh0KCJVcGRhdGUgJiYgRGlmZiIpOwotICAgICAgICBtRGlmZlVwZGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCBkaWZmLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbGlzdAotICAgICAgICAgICAgICAgIC8vIG9mIG1hbGxvY3MKLSAgICAgICAgICAgICAgICBtQmFja1VwQWxsb2NhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtQmFja1VwQWxsb2NhdGlvbnMuYWRkQWxsKG1BbGxvY2F0aW9ucyk7Ci0gICAgICAgICAgICAgICAgbUJhY2tVcENsaWVudERhdGEgPSBtQ2xpZW50RGF0YTsKLSAgICAgICAgICAgICAgICBtQmFja1VwVG90YWxNZW1vcnkgPSBtQ2xpZW50RGF0YS5nZXRUb3RhbE5hdGl2ZU1lbW9yeSgpOwotCi0gICAgICAgICAgICAgICAgbURpc3BsYXlNb2RlQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1wdHlUYWJsZXMoKTsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdGFjayBjYWxsIGNvbXB1dGF0aW9uIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgLy8gY2xpZW50Ci0gICAgICAgICAgICAgICAgLy8gd2Ugc3RvcCBpdAotICAgICAgICAgICAgICAgIGlmIChtU3RhY2tDYWxsVGhyZWFkICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQuZ2V0Q2xpZW50RGF0YSgpID09IG1DbGllbnREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQucXVpdCgpOwotICAgICAgICAgICAgICAgICAgICBtU3RhY2tDYWxsVGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZXF1ZXN0TmF0aXZlSGVhcEluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgKi8KLQotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKHRvcF9sYXlvdXQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJEaXNwbGF5OiIpOwotCi0gICAgICAgIG1EaXNwbGF5TW9kZUNvbWJvID0gbmV3IENvbWJvKHRvcF9sYXlvdXQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbURpc3BsYXlNb2RlQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1EaXNwbGF5TW9kZUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7ICJBbGxvY2F0aW9uIExpc3QiLCAiQnkgTGlicmFyaWVzIiB9KTsKLSAgICAgICAgbURpc3BsYXlNb2RlQ29tYm8uc2VsZWN0KDApOwotICAgICAgICBtRGlzcGxheU1vZGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaERpc3BsYXlNb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtRGlzcGxheU1vZGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG1TeW1ib2xzQnV0dG9uID0gbmV3IEJ1dHRvbih0b3BfbGF5b3V0LCBTV1QuUFVTSCk7Ci0gICAgICAgIG1TeW1ib2xzQnV0dG9uLnNldFRleHQoIkxvYWQgU3ltYm9scyIpOwotICAgICAgICBtU3ltYm9sc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGFjdHVhbCBjb250ZW50IGNvbXBvc2l0ZXMsCi0gICAgICAgIC8vIGluIHN0YWNrIG1vZGUgbGF5b3V0LgotICAgICAgICAvLyBUaGlzIHRvcCBsZXZlbCBjb21wb3NpdGUgY29udGFpbnMgMiBvdGhlciBjb21wb3NpdGVzLgotICAgICAgICAvLyAqIG9uZSBmb3IgYm90aCBBbGxvY2F0aW9ucyBhbmQgTGlicmFyaWVzIG1vZGUKLSAgICAgICAgLy8gKiBvbmUgZm9yIGZsYXQgbW9kZSAod2hpY2ggaXMgZ29uZSBmb3Igbm93KQotCi0gICAgICAgIG1Ub3BTdGFja0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobUJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgbVRvcFN0YWNrQ29tcG9zaXRlLnNldExheW91dChtVG9wU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKSk7Ci0gICAgICAgIG1Ub3BTdGFja0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAvLyBjcmVhdGUgMXN0IGFuZCAybmQgbW9kZXMKLSAgICAgICAgY3JlYXRlVGFibGVEaXNwbGF5KG1Ub3BTdGFja0NvbXBvc2l0ZSk7Ci0KLSAgICAgICAgbVRvcFN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBtVGFibGVNb2RlQ29udHJvbDsKLSAgICAgICAgbVRvcFN0YWNrQ29tcG9zaXRlLmxheW91dCgpOwotCi0gICAgICAgIHNldFVwZGF0ZVN0YXR1cyhOT1RfU0VMRUNURUQpOwotCi0gICAgICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgICAgLy8gVE9ETyBhZGQgaW1hZ2UgZGlzcGxheSBvZiBuYXRpdmUgaGVhcC4KLSAgICAgICAgLy9tSW1hZ2UgPSBuZXcgTGFiZWwobUJhc2UsIFNXVC5OT05FKTsKLQotICAgICAgICBtQmFzZS5wYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1CYXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgcHJvcGVyIGNvbnRyb2wgaW5zaWRlIHRoZSBwYW5lbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgLy8gVE9ETwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGFuIGV4aXN0aW5nIGNsaWVudCBpbmZvcm1hdGlvbiBjaGFuZ2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGNsaWVudCB0aGUgdXBkYXRlZCBjbGllbnQuCi0gICAgICogQHBhcmFtIGNoYW5nZU1hc2sgdGhlIGJpdCBtYXNrIGRlc2NyaWJpbmcgdGhlIGNoYW5nZWQgcHJvcGVydGllcy4gSXQgY2FuIGNvbnRhaW4KLSAgICAgKiBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHtAbGluayBDbGllbnQjQ0hBTkdFX0lORk99LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9OQU1FfQotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX0RFQlVHR0VSX1NUQVRVU30sIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9USFJFQURfREFUQX0sIHtAbGluayBDbGllbnQjQ0hBTkdFX0hFQVBfTU9ERX0sCi0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfTkFUSVZFX0hFQVBfREFUQX0KLSAgICAgKgotICAgICAqIEBzZWUgSUNsaWVudENoYW5nZUxpc3RlbmVyI2NsaWVudENoYW5nZWQoQ2xpZW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xpZW50Q2hhbmdlZChmaW5hbCBDbGllbnQgY2xpZW50LCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICBpZiAoY2xpZW50ID09IGdldEN1cnJlbnRDbGllbnQoKSkgewotICAgICAgICAgICAgaWYgKChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9OQVRJVkVfSEVBUF9EQVRBKSA9PSBDbGllbnQuQ0hBTkdFX05BVElWRV9IRUFQX0RBVEEpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJhc2UuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBtQmFzZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4gVGhlIG5ldyBkZXZpY2UgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnREZXZpY2UoKX0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGV2aWNlU2VsZWN0ZWQoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgY2xpZW50IGlzIHNlbGVjdGVkLiBUaGUgbmV3IGNsaWVudCBjYW4gYmUgYWNjZXNzZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0Q3VycmVudENsaWVudCgpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRTZWxlY3RlZCgpIHsKLSAgICAgICAgaWYgKG1CYXNlLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDbGllbnQgY2xpZW50ID0gZ2V0Q3VycmVudENsaWVudCgpOwotCi0gICAgICAgIG1EaXNwbGF5TW9kZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBlbXB0eVRhYmxlcygpOwotCi0gICAgICAgIExvZy5kKCJkZG1zIiwgIk5hdGl2ZUhlYXBQYW5lbDogY2hhbmdlZCAiICsgY2xpZW50KTsKLQotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsaWVudERhdGEgY2QgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotICAgICAgICAgICAgbUNsaWVudERhdGEgPSBjZDsKLQotICAgICAgICAgICAgLy8gaWYgKGNkLmdldFNob3dIZWFwVXBkYXRlcygpKQotICAgICAgICAgICAgc2V0VXBkYXRlU3RhdHVzKEVOQUJMRUQpOwotICAgICAgICAgICAgLy8gZWxzZQotICAgICAgICAgICAgLy8gc2V0VXBkYXRlU3RhdHVzKE5PVF9FTkFCTEVEKTsKLQotICAgICAgICAgICAgaW5pdEFsbG9jYXRpb25EaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgIC8vcmVuZGVyQml0bWFwKGNkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DbGllbnREYXRhID0gbnVsbDsKLSAgICAgICAgICAgIHNldFVwZGF0ZVN0YXR1cyhOT1RfU0VMRUNURUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJhc2UucGFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgVUkgd2l0aCB0aGUgbmV3bHkgY29tcHV0ZSBzdGFjayBjYWxscywgdW5sZXNzIHRoZSBVSSBzd2l0Y2hlZAotICAgICAqIHRvIGEgZGlmZmVyZW50IGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZCB0aGUgQ2xpZW50RGF0YSBmb3Igd2hpY2ggdGhlIHN0YWNrIGNhbGwgYXJlIGJlaW5nIGNvbXB1dGVkLgotICAgICAqIEBwYXJhbSBjb3VudCB0aGUgY3VycmVudCBjb3VudCBvZiBhbGxvY2F0aW9ucyBmb3Igd2hpY2ggdGhlIHN0YWNrIGNhbGxzCi0gICAgICogICAgICAgICAgICBoYXZlIGJlZW4gY29tcHV0ZWQuCi0gICAgICovCi0gICAgQFdvcmtlclRocmVhZAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFsbG9jYXRpb25TdGFja0NhbGxzKENsaWVudERhdGEgY2QsIGludCBjb3VudCkgewotICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIHBhbmVsIHN0aWxsIHNob3dzIHRoZSBzYW1lIGNsaWVudGRhdGEgdGhhbgotICAgICAgICAvLyB0aGUgdGhyZWFkIGlzIGNvbXB1dGluZyBmb3IuCi0gICAgICAgIGlmIChjZCA9PSBtQ2xpZW50RGF0YSkgewotCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBtQWxsb2NhdGlvbnMuc2l6ZSgpOwotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gdG90YWwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lOiBkbyBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICBtRGlzcGxheU1vZGVDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1TYXZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbVN0YWNrQ2FsbFRocmVhZCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdvcmsgaW4gcHJvZ3Jlc3MsIHVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyLgotLy8gICAgICAgICAgICAgICAgbVVpVGhyZWFkLnNldFN0YXR1c0xpbmUoIkNvbXB1dGluZyBzdGFjayBjYWxsOiAiICsgY291bnQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgKyAiLyIgKyB0b3RhbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBhdHRlbXB0IHRvIG9ubHkgdXBkYXRlIHdoZW4gbmVlZGVkLgotICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGlzIG5vdCByZWxhdGVkIHRvIG1BbGxvY2F0aW9ucy5zaXplKCkgYW55bW9yZQotICAgICAgICAgICAgLy8gZHVlIHRvIHByZS16eWdvdGUvcG9zdC16eWdvdGUgZGlzcGxheSwgdXBkYXRlIGFsbCB0aGUgdGltZS4KLSAgICAgICAgICAgIC8vIEF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgcGFnZXMgYW55d2F5LCBzaW5jZSBpdCdzIGdldHRpbmcgY29tcHV0ZWQKLSAgICAgICAgICAgIC8vIHJlYWxseSBmYXN0IG5vdy4KLS8vICAgICAgICAgICAgaWYgKChtQ3VycmVudFBhZ2UgKyAxKSAqIERJU1BMQVlfUEVSX1BBR0UgPT0gY291bnQKLS8vICAgICAgICAgICAgICAgICAgICB8fCAoY291bnQgPT0gdG90YWwgJiYgbUN1cnJlbnRQYWdlID09IG1QYWdlQ291bnQgLSAxKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSBhbGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUFsbG9jYXRpb25UYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluZm8gPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5hdGl2ZUFsbG9jYXRpb25JbmZvKW1BbGxvY2F0aW9uVGFibGUuZ2V0SXRlbShpbmRleCkuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHRoZSB0YWJsZQotICAgICAgICAgICAgICAgIGVtcHR5VGFibGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaWxsIGl0IGFnYWluCi0gICAgICAgICAgICAgICAgZmlsbEFsbG9jYXRpb25UYWJsZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVzZWxlY3QKLSAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblRhYmxlLnNldFNlbGVjdGlvbihpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGRldGFpbCB0YWJsZSBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxEZXRhaWxUYWJsZShpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChtQWxsb2NhdGlvblRhYmxlLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSB0YWJsZSBpcyBkaXNwb3NlZC4gTGV0J3MgaWdub3JlIGl0LgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvbGQgY2xpZW50IHN0aWxsIHJ1bm5pbmcuIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFRhYmxlRm9jdXNMaXN0ZW5lcigpIHsKLSAgICAgICAgYWRkVGFibGVUb0ZvY3VzTGlzdGVuZXIobUFsbG9jYXRpb25UYWJsZSk7Ci0gICAgICAgIGFkZFRhYmxlVG9Gb2N1c0xpc3RlbmVyKG1MaWJyYXJ5VGFibGUpOwotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihtTGlicmFyeUFsbG9jYXRpb25UYWJsZSk7Ci0gICAgICAgIGFkZFRhYmxlVG9Gb2N1c0xpc3RlbmVyKG1EZXRhaWxUYWJsZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsb2NEaXNwbGF5Q2hhbmdlKCkgewotICAgICAgICBtQWxsb2NEaXNwbGF5TW9kZSA9IG1BbGxvY0Rpc3BsYXlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgbGlzdAotICAgICAgICB1cGRhdGVBbGxvY0Rpc3BsYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICB1cGRhdGVUb3RhbE1lbW9yeURpc3BsYXkoKTsKLQotICAgICAgICAvLyByZXNldCB0aGUgdWkuCi0gICAgICAgIG1DdXJyZW50UGFnZSA9IDA7Ci0gICAgICAgIHVwZGF0ZVBhZ2VVSSgpOwotICAgICAgICBzd2l0Y2hEaXNwbGF5TW9kZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQWxsb2NEaXNwbGF5TGlzdCgpIHsKLSAgICAgICAgbVRvdGFsU2l6ZSA9IDA7Ci0gICAgICAgIG1EaXNwbGF5ZWRBbGxvY2F0aW9ucy5jbGVhcigpOwotICAgICAgICBmb3IgKE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluZm8gOiBtQWxsb2NhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChtQWxsb2NEaXNwbGF5TW9kZSA9PSBBTExPQ19ESVNQTEFZX0FMTCB8fAotICAgICAgICAgICAgICAgICAgICAobUFsbG9jRGlzcGxheU1vZGUgPT0gQUxMT0NfRElTUExBWV9QUkVfWllHT1RFIF4gaW5mby5pc1p5Z290ZUNoaWxkKCkpKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXllZEFsbG9jYXRpb25zLmFkZChpbmZvKTsKLSAgICAgICAgICAgICAgICBtVG90YWxTaXplICs9IGluZm8uZ2V0U2l6ZSgpICogaW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGl0ZW0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGNvdW50ID0gbURpc3BsYXllZEFsbG9jYXRpb25zLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIG1QYWdlQ291bnQgPSBjb3VudCAvIERJU1BMQVlfUEVSX1BBR0U7Ci0KLSAgICAgICAgLy8gbmVlZCB0byBhZGQgYSBwYWdlIGZvciB0aGUgcmVzdCBvZiB0aGUgZGl2Ci0gICAgICAgIGlmICgoY291bnQgJSBESVNQTEFZX1BFUl9QQUdFKSA+IDApIHsKLSAgICAgICAgICAgIG1QYWdlQ291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVG90YWxNZW1vcnlEaXNwbGF5KCkgewotICAgICAgICBzd2l0Y2ggKG1BbGxvY0Rpc3BsYXlNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIEFMTE9DX0RJU1BMQVlfQUxMOgotICAgICAgICAgICAgICAgIG1Ub3RhbE1lbW9yeUxhYmVsLnNldFRleHQoU3RyaW5nLmZvcm1hdCgiVG90YWwgTWVtb3J5OiAlMSRzIEJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNGb3JtYXR0ZXIuZm9ybWF0KG1Ub3RhbFNpemUpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFMTE9DX0RJU1BMQVlfUFJFX1pZR09URToKLSAgICAgICAgICAgICAgICBtVG90YWxNZW1vcnlMYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIlp5Z290ZSBNZW1vcnk6ICUxJHMgQnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgc0Zvcm1hdHRlci5mb3JtYXQobVRvdGFsU2l6ZSkpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUxMT0NfRElTUExBWV9QT1NUX1pZR09URToKLSAgICAgICAgICAgICAgICBtVG90YWxNZW1vcnlMYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIlBvc3Qtenlnb3RlIE1lbW9yeTogJTEkcyBCeXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzRm9ybWF0dGVyLmZvcm1hdChtVG90YWxTaXplKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgc3dpdGNoRGlzcGxheU1vZGUoKSB7Ci0gICAgICAgIHN3aXRjaCAobURpc3BsYXlNb2RlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotICAgICAgICAgICAgY2FzZSAwOiB7Ly8gYWxsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICBtVG9wU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1UYWJsZU1vZGVDb250cm9sOwotICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1BbGxvY2F0aW9uTW9kZVRvcDsKLSAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblN0YWNrQ29tcG9zaXRlLmxheW91dCgpOwotICAgICAgICAgICAgICAgIG1Ub3BTdGFja0NvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBlbXB0eVRhYmxlcygpOwotICAgICAgICAgICAgICAgIGZpbGxBbGxvY2F0aW9uVGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogey8vIGxpYnJhcmllcwotICAgICAgICAgICAgICAgIG1Ub3BTdGFja0xheW91dC50b3BDb250cm9sID0gbVRhYmxlTW9kZUNvbnRyb2w7Ci0gICAgICAgICAgICAgICAgbUFsbG9jYXRpb25TdGFja0xheW91dC50b3BDb250cm9sID0gbUxpYnJhcnlNb2RlVG9wQ29udHJvbDsKLSAgICAgICAgICAgICAgICBtQWxsb2NhdGlvblN0YWNrQ29tcG9zaXRlLmxheW91dCgpOwotICAgICAgICAgICAgICAgIG1Ub3BTdGFja0NvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBlbXB0eVRhYmxlcygpOwotICAgICAgICAgICAgICAgIGZpbGxMaWJyYXJ5VGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0QWxsb2NhdGlvbkRpc3BsYXkoKSB7Ci0gICAgICAgIG1BbGxvY2F0aW9ucy5jbGVhcigpOwotICAgICAgICBtQWxsb2NhdGlvbnMuYWRkQWxsKG1DbGllbnREYXRhLmdldE5hdGl2ZUFsbG9jYXRpb25MaXN0KCkpOwotICAgICAgICAKLSAgICAgICAgdXBkYXRlQWxsb2NEaXNwbGF5TGlzdCgpOwotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBwcmV2aW91cyBjbGllbnRkYXRhIGFuZCBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IG9uZS4gd2UKLSAgICAgICAgLy8gZG8gYSBkaWZmIGJldHdlZW4gdGhlIG5ldyBsaXN0IGFuZCB0aGUgb2xkIG9uZS4KLSAgICAgICAgaWYgKG1CYWNrVXBDbGllbnREYXRhICE9IG51bGwgJiYgbUJhY2tVcENsaWVudERhdGEgPT0gbUNsaWVudERhdGEpIHsKLQotICAgICAgICAgICAgQXJyYXlMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPiBhZGQgPSBuZXcgQXJyYXlMaXN0PE5hdGl2ZUFsbG9jYXRpb25JbmZvPigpOwotCi0gICAgICAgICAgICAvLyB3ZSBnbyB0aHJvdWdoIHRoZSBsaXN0IG9mIE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluIHRoZSBuZXcgbGlzdCBhbmQgY2hlY2sgaWYKLSAgICAgICAgICAgIC8vIHRoZXJlJ3Mgb25lIHdpdGggdGhlIHNhbWUgZXhhY3QgZGF0YSAoc2l6ZSwgYWxsb2NhdGlvbiwgY291bnQgYW5kCi0gICAgICAgICAgICAvLyBzdGFja2NhbGwgYWRkcmVzc2VzKSBpbiB0aGUgb2xkIGxpc3QuCi0gICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBmaW5kIGFueSwgd2UgYWRkIGl0IHRvIHRoZSAiYWRkIiBsaXN0Ci0gICAgICAgICAgICBmb3IgKE5hdGl2ZUFsbG9jYXRpb25JbmZvIG1pIDogbUFsbG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoTmF0aXZlQWxsb2NhdGlvbkluZm8gb2xkX21pIDogbUJhY2tVcEFsbG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaS5lcXVhbHMob2xkX21pKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZC5hZGQobWkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHV0IHRoZSByZXN1bHQgaW4gbUFsbG9jYXRpb25zCi0gICAgICAgICAgICBtQWxsb2NhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1BbGxvY2F0aW9ucy5hZGRBbGwoYWRkKTsKLQotICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZGlmZmVyZW5jZSBpbiBtZW1vcnkgdXNhZ2UuIFRoaXMgaXMgY29tcHV0ZWQKLSAgICAgICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIG9iamVjdHMgaW4gbUFsbG9jYXRpb25zLgotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoTmF0aXZlQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvIDogbUFsbG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgKz0gYWxsb2NJbmZvLmdldFNpemUoKSAqIGFsbG9jSW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRvdGFsTWVtb3J5TGFiZWwuc2V0VGV4dChTdHJpbmcuZm9ybWF0KCJNZW1vcnkgRGlmZmVyZW5jZTogJTEkcyBCeXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHNGb3JtYXR0ZXIuZm9ybWF0KGNvdW50KSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZnVsbCBtZW1vcnkgdXNhZ2UKLSAgICAgICAgICAgIHVwZGF0ZVRvdGFsTWVtb3J5RGlzcGxheSgpOwotICAgICAgICAgICAgLy9tRGlmZlVwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKG1DbGllbnREYXRhLmdldFRvdGFsTmF0aXZlTWVtb3J5KCkgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBtVG90YWxNZW1vcnlMYWJlbC5wYWNrKCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWdlIHVpCi0gICAgICAgIG1EaXNwbGF5TW9kZUNvbWJvLnNlbGVjdCgwKTsKLQotICAgICAgICBtTGlicmFyeUFsbG9jYXRpb25zLmNsZWFyKCk7Ci0KLSAgICAgICAgLy8gcmVzZXQgdG8gZmlyc3QgcGFnZQotICAgICAgICBtQ3VycmVudFBhZ2UgPSAwOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgbGFiZWwKLSAgICAgICAgdXBkYXRlUGFnZVVJKCk7Ci0KLSAgICAgICAgLy8gbm93IGZpbGwgdGhlIGFsbG9jYXRpb24gVGFibGUgd2l0aCB0aGUgY3VycmVudCBwYWdlCi0gICAgICAgIHN3aXRjaERpc3BsYXlNb2RlKCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgdGhlIHRocmVhZCB0byBjb21wdXRlIHRoZSBzdGFjayBjYWxscwotICAgICAgICBpZiAobUFsbG9jYXRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQgPSBuZXcgU3RhY2tDYWxsVGhyZWFkKG1DbGllbnREYXRhKTsKLSAgICAgICAgICAgIG1TdGFja0NhbGxUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQYWdlVUkoKSB7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBsYWJlbCBhbmQgcGFjayB0byB1cGRhdGUgdGhlIGxheW91dCwgb3RoZXJ3aXNlCi0gICAgICAgIC8vIHRoZSBsYWJlbCB3aWxsIGJlIGN1dCBvZmYgaWYgdGhlIG5ldyBzaXplIGlzIGJpZ2dlcgotICAgICAgICBpZiAobVBhZ2VDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBtUGFnZUxhYmVsLnNldFRleHQoIjAgb2YgMCBhbGxvY2F0aW9ucy4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAvLyBnZXQgb3VyIHN0YXJ0aW5nIGluZGV4Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAobUN1cnJlbnRQYWdlICogRElTUExBWV9QRVJfUEFHRSkgKyAxOwotICAgICAgICAgICAgLy8gZW5kIGluZGV4LCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBsYXN0IHBhZ2UgY2FuIGJlIGhhbGYgZnVsbAotICAgICAgICAgICAgaW50IGNvdW50ID0gbURpc3BsYXllZEFsbG9jYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBNYXRoLm1pbihzdGFydCArIERJU1BMQVlfUEVSX1BBR0UgLSAxLCBjb3VudCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNGb3JtYXR0ZXIuZm9ybWF0KHN0YXJ0KSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgLSAiKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc0Zvcm1hdHRlci5mb3JtYXQoZW5kKSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgb2YgIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNGb3JtYXR0ZXIuZm9ybWF0KGNvdW50KSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgYWxsb2NhdGlvbnMuIik7Ci0gICAgICAgICAgICBtUGFnZUxhYmVsLnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRoZSBidXR0b24gZW5hYmxlZCBzdGF0ZS4KLSAgICAgICAgbVBhZ2VQcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKG1DdXJyZW50UGFnZSA+IDApOwotICAgICAgICAvLyByZW1pbmRlcjogbUN1cnJlbnRQYWdlIHN0YXJ0cyBhdCAwLgotICAgICAgICBtUGFnZU5leHRCdXR0b24uc2V0RW5hYmxlZChtQ3VycmVudFBhZ2UgPCBtUGFnZUNvdW50IC0gMSk7Ci0KLSAgICAgICAgbVBhZ2VMYWJlbC5wYWNrKCk7Ci0gICAgICAgIG1QYWdlVUlDb21wb3NpdGUucGFjaygpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxBbGxvY2F0aW9uVGFibGUoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY291bnQKLSAgICAgICAgaW50IGNvdW50ID0gbURpc3BsYXllZEFsbG9jYXRpb25zLnNpemUoKTsKLQotICAgICAgICAvLyBnZXQgb3VyIHN0YXJ0aW5nIGluZGV4Ci0gICAgICAgIGludCBzdGFydCA9IG1DdXJyZW50UGFnZSAqIERJU1BMQVlfUEVSX1BBR0U7Ci0KLSAgICAgICAgLy8gbG9vcCBmb3IgRElTUExBWV9QRVJfUEFHRSBvciB0aWxsIHdlIHJlYWNoIGNvdW50Ci0gICAgICAgIGludCBlbmQgPSBzdGFydCArIERJU1BMQVlfUEVSX1BBR0U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kICYmIGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBOYXRpdmVBbGxvY2F0aW9uSW5mbyBpbmZvID0gbURpc3BsYXllZEFsbG9jYXRpb25zLmdldChpKTsKLQotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBudWxsOwotCi0gICAgICAgICAgICBpZiAobUFsbG9jRGlzcGxheU1vZGUgPT0gQUxMT0NfRElTUExBWV9BTEwpICB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0obUFsbG9jYXRpb25UYWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCAoaW5mby5pc1p5Z290ZUNoaWxkKCkgPyAiWiAiIDogIiIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNGb3JtYXR0ZXIuZm9ybWF0KGluZm8uZ2V0U2l6ZSgpICogaW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKSkpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCBzRm9ybWF0dGVyLmZvcm1hdChpbmZvLmdldEFsbG9jYXRpb25Db3VudCgpKSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDIsIHNGb3JtYXR0ZXIuZm9ybWF0KGluZm8uZ2V0U2l6ZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BbGxvY0Rpc3BsYXlNb2RlID09IEFMTE9DX0RJU1BMQVlfUFJFX1pZR09URSBeIGluZm8uaXNaeWdvdGVDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0obUFsbG9jYXRpb25UYWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCBzRm9ybWF0dGVyLmZvcm1hdChpbmZvLmdldFNpemUoKSAqIGluZm8uZ2V0QWxsb2NhdGlvbkNvdW50KCkpKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgc0Zvcm1hdHRlci5mb3JtYXQoaW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKSkpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgyLCBzRm9ybWF0dGVyLmZvcm1hdChpbmZvLmdldFNpemUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgaXRlbQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpdGVtLnNldERhdGEoaW5mbyk7Ci0KLSAgICAgICAgICAgIE5hdGl2ZVN0YWNrQ2FsbEluZm8gYnRpID0gaW5mby5nZXRSZWxldmFudFN0YWNrQ2FsbEluZm8oKTsKLSAgICAgICAgICAgIGlmIChidGkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaWIgPSBidGkuZ2V0TGlicmFyeU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kID0gYnRpLmdldE1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlID0gYnRpLmdldFNvdXJjZUZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGliICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCBsaWIpOwotICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDQsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoNSwgc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsTGlicmFyeVRhYmxlKCkgewotICAgICAgICAvLyBmaWxsIHRoZSBsaWJyYXJ5IHRhYmxlCi0gICAgICAgIHNvcnRBbGxvY2F0aW9uc1BlckxpYnJhcnkoKTsKLQotICAgICAgICBmb3IgKExpYnJhcnlBbGxvY2F0aW9ucyBsaWJhbGxvYyA6IG1MaWJyYXJ5QWxsb2NhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChsaWJhbGxvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1MaWJyYXJ5VGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGliID0gbGliYWxsb2MuZ2V0TGlicmFyeSgpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCBsaWIgIT0gbnVsbCA/IGxpYiA6ICIiKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgc0Zvcm1hdHRlci5mb3JtYXQobGliYWxsb2MuZ2V0U2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDIsIHNGb3JtYXR0ZXIuZm9ybWF0KGxpYmFsbG9jLmdldENvdW50KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsTGlicmFyeUFsbG9jYXRpb25UYWJsZSgpIHsKLSAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9uVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1EZXRhaWxUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgaW50IGluZGV4ID0gbUxpYnJhcnlUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIExpYnJhcnlBbGxvY2F0aW9ucyBsaWJhbGxvYyA9IG1MaWJyYXJ5QWxsb2NhdGlvbnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgIC8vIHN0YXJ0IGEgdGhyZWFkIHRoYXQgd2lsbCBmaWxsIHRhYmxlIDEwIGF0IGEgdGltZSB0byBrZWVwIHRoZSB1aQotICAgICAgICAgICAgLy8gcmVzcG9uc2l2ZSwgYnV0IGZpcnN0IHdlIGtpbGwgdGhlIHByZXZpb3VzIG9uZSBpZiB0aGVyZSB3YXMgb25lCi0gICAgICAgICAgICBpZiAobUZpbGxUYWJsZVRocmVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGxUYWJsZVRocmVhZC5xdWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsbFRhYmxlVGhyZWFkID0gbmV3IEZpbGxUYWJsZVRocmVhZChsaWJhbGxvYywKLSAgICAgICAgICAgICAgICAgICAgbGliYWxsb2MuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0gICAgICAgICAgICBtRmlsbFRhYmxlVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVMaWJyYXJ5QWxsb2NhdGlvblRhYmxlKExpYnJhcnlBbGxvY2F0aW9ucyBsaWJhbGxvYywKLSAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1MaWJyYXJ5VGFibGUuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUxpYnJhcnlUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBMaWJyYXJ5QWxsb2NhdGlvbnMgbmV3bGliYWxsb2MgPSBtTGlicmFyeUFsbG9jYXRpb25zLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdsaWJhbGxvYyA9PSBsaWJhbGxvYykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbGliYWxsb2MuZ2V0QWxsb2NhdGlvblNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZCAmJiBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUFsbG9jYXRpb25JbmZvIGluZm8gPSBsaWJhbGxvYy5nZXRBbGxvY2F0aW9uKGkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9uVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMCwgc0Zvcm1hdHRlci5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFNpemUoKSAqIGluZm8uZ2V0QWxsb2NhdGlvbkNvdW50KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgc0Zvcm1hdHRlci5mb3JtYXQoaW5mby5nZXRBbGxvY2F0aW9uQ291bnQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgyLCBzRm9ybWF0dGVyLmZvcm1hdChpbmZvLmdldFNpemUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlU3RhY2tDYWxsSW5mbyBzdGFja0NhbGxJbmZvID0gaW5mby5nZXRSZWxldmFudFN0YWNrQ2FsbEluZm8oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tDYWxsSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCBzdGFja0NhbGxJbmZvLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHF1aXQgdGhlIHRocmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GaWxsVGFibGVUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxsVGFibGVUaHJlYWQucXVpdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxsVGFibGVUaHJlYWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoImRkbXMiLCAiZXJyb3Igd2hlbiB1cGRhdGluZyB0aGUgbGlicmFyeSBhbGxvY2F0aW9uIHRhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbERldGFpbFRhYmxlKGZpbmFsIE5hdGl2ZUFsbG9jYXRpb25JbmZvIG1pKSB7Ci0gICAgICAgIG1EZXRhaWxUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgbURldGFpbFRhYmxlLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGRldGFpbCBUYWJsZSB3aXRoIHRoZSBiYWNrIHRyYWNlCi0gICAgICAgICAgICBMb25nW10gYWRkcmVzc2VzID0gbWkuZ2V0U3RhY2tDYWxsQWRkcmVzc2VzKCk7Ci0gICAgICAgICAgICBOYXRpdmVTdGFja0NhbGxJbmZvW10gcmVzb2x2ZWRTdGFja0NhbGwgPSBtaS5nZXRSZXNvbHZlZFN0YWNrQ2FsbCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTdGFja0NhbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVzb2x2ZWRTdGFja0NhbGwubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3Nlc1tpXSA9PSBudWxsIHx8IGFkZHJlc3Nlc1tpXS5sb25nVmFsdWUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsb25nIGFkZHIgPSBhZGRyZXNzZXNbaV0ubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgTmF0aXZlU3RhY2tDYWxsSW5mbyBzb3VyY2UgPSByZXNvbHZlZFN0YWNrQ2FsbFtpXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obURldGFpbFRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDAsIFN0cmluZy5mb3JtYXQoIiUwOHgiLCBhZGRyKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGlicmFyeU5hbWUgPSBzb3VyY2UuZ2V0TGlicmFyeU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHNvdXJjZS5nZXRNZXRob2ROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGUgPSBzb3VyY2UuZ2V0U291cmNlRmlsZSgpOwotICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gc291cmNlLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobGlicmFyeU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDEsIGxpYnJhcnlOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMiwgbWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDMsIHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyICE9IC0xKQotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoNCwgSW50ZWdlci50b1N0cmluZyhsaW5lTnVtYmVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGV0YWlsVGFibGUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBcmUgdXBkYXRlcyBlbmFibGVkPwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRVcGRhdGVTdGF0dXMoaW50IHN0YXR1cykgewotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBOT1RfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZVN0YXR1cy5zZXRUZXh0KCJTZWxlY3QgYSBjbGllbnQgdG8gc2VlIGhlYXAgaW5mbyIpOwotICAgICAgICAgICAgICAgIG1BbGxvY0Rpc3BsYXlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtRnVsbFVwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAvL21EaWZmVXBkYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOT1RfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBtVXBkYXRlU3RhdHVzLnNldFRleHQoIkhlYXAgdXBkYXRlcyBhcmUgIiArICJOT1QgRU5BQkxFRCBmb3IgdGhpcyBjbGllbnQiKTsKLSAgICAgICAgICAgICAgICBtQWxsb2NEaXNwbGF5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxVcGRhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgLy9tRGlmZlVwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBtVXBkYXRlU3RhdHVzLnNldFRleHQoIlByZXNzICdGdWxsIFVwZGF0ZScgdG8gcmV0cmlldmUgIiArICJsYXRlc3QgZGF0YSIpOwotICAgICAgICAgICAgICAgIG1BbGxvY0Rpc3BsYXlDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1GdWxsVXBkYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9tRGlmZlVwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVVwZGF0ZVN0YXR1cy5wYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBUYWJsZSBkaXNwbGF5LiBUaGlzIGluY2x1ZGVzIGEgImRldGFpbCIgVGFibGUgaW4gdGhlIGJvdHRvbQotICAgICAqIGhhbGYgYW5kIDIgbW9kZXMgaW4gdGhlIHRvcCBoYWxmOiBhbGxvY2F0aW9uIFRhYmxlIGFuZAotICAgICAqIGxpYnJhcnkrYWxsb2NhdGlvbnMgVGFibGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgdGhlIHRvcCBwYXJlbnQgdG8gY3JlYXRlIHRoZSBkaXNwbGF5IGludG8KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVEaXNwbGF5KENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGZpbmFsIGludCBtaW5QYW5lbFdpZHRoID0gNjA7Ci0KLSAgICAgICAgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IERkbVVpUHJlZmVyZW5jZXMuZ2V0U3RvcmUoKTsKLQotICAgICAgICAvLyB0b3AgbGV2ZWwgY29tcG9zaXRlIGZvciBtb2RlIDEgJiAyCi0gICAgICAgIG1UYWJsZU1vZGVDb250cm9sID0gbmV3IENvbXBvc2l0ZShiYXNlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkxlZnQgPSBnbC5tYXJnaW5SaWdodCA9IGdsLm1hcmdpblRvcCA9IGdsLm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgICAgIG1UYWJsZU1vZGVDb250cm9sLnNldExheW91dChnbCk7Ci0gICAgICAgIG1UYWJsZU1vZGVDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIG1Ub3RhbE1lbW9yeUxhYmVsID0gbmV3IExhYmVsKG1UYWJsZU1vZGVDb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Ub3RhbE1lbW9yeUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtVG90YWxNZW1vcnlMYWJlbC5zZXRUZXh0KCJUb3RhbCBNZW1vcnk6IDAgQnl0ZXMiKTsKLQotICAgICAgICAvLyB0aGUgdG9wIGhhbGYgb2YgdGhlc2UgbW9kZXMgaXMgZHluYW1pYwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBzYXNoX2NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobVRhYmxlTW9kZUNvbnRyb2wsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotICAgICAgICBzYXNoX2NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0gICAgICAgIHNhc2hfY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgc3RhY2tlZCBjb21wb3NpdGUKLSAgICAgICAgbUFsbG9jYXRpb25TdGFja0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2FzaF9jb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbUFsbG9jYXRpb25TdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBtQWxsb2NhdGlvblN0YWNrQ29tcG9zaXRlLnNldExheW91dChtQWxsb2NhdGlvblN0YWNrTGF5b3V0KTsKLSAgICAgICAgbUFsbG9jYXRpb25TdGFja0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRvcCBoYWxmIGZvciBtb2RlIDEKLSAgICAgICAgY3JlYXRlQWxsb2NhdGlvblRvcEhhbGYobUFsbG9jYXRpb25TdGFja0NvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0b3AgaGFsZiBmb3IgbW9kZSAyCi0gICAgICAgIGNyZWF0ZUxpYnJhcnlUb3BIYWxmKG1BbGxvY2F0aW9uU3RhY2tDb21wb3NpdGUpOwotCi0gICAgICAgIGZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKHNhc2hfY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgLy8gYm90dG9tIGhhbGYgb2YgdGhlc2UgbW9kZXMgaXMgdGhlIHNhbWU6IGRldGFpbCB0YWJsZQotICAgICAgICBjcmVhdGVEZXRhaWxUYWJsZShzYXNoX2NvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gaW5pdCB2YWx1ZSBmb3Igc3RhY2sKLSAgICAgICAgbUFsbG9jYXRpb25TdGFja0xheW91dC50b3BDb250cm9sID0gbUFsbG9jYXRpb25Nb2RlVG9wOwotCi0gICAgICAgIC8vIGZvcm0gbGF5b3V0IGRhdGEKLSAgICAgICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChtVG90YWxNZW1vcnlMYWJlbCwgMCk7Ci0gICAgICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgbUFsbG9jYXRpb25TdGFja0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhIHNhc2hEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGlmIChwcmVmcyAhPSBudWxsICYmIHByZWZzLmNvbnRhaW5zKFBSRUZTX0FMTE9DQVRJT05fU0FTSCkpIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLAotICAgICAgICAgICAgICAgICAgICBwcmVmcy5nZXRJbnQoUFJFRlNfQUxMT0NBVElPTl9TQVNIKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOyAvLyA1MCUgYWNyb3NzCi0gICAgICAgIH0KLSAgICAgICAgc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgc2FzaERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQotICAgICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotICAgICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgbURldGFpbFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgLy8gYWxsb3cgcmVzaXplcywgYnV0IGNhcCBhdCBtaW5QYW5lbFdpZHRoCi0gICAgICAgIHNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHBhbmVsUmVjdCA9IHNhc2hfY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBpbnQgYm90dG9tID0gcGFuZWxSZWN0LmhlaWdodCAtIHNhc2hSZWN0LmhlaWdodCAtIG1pblBhbmVsV2lkdGg7Ci0gICAgICAgICAgICAgICAgZS55ID0gTWF0aC5tYXgoTWF0aC5taW4oZS55LCBib3R0b20pLCBtaW5QYW5lbFdpZHRoKTsKLSAgICAgICAgICAgICAgICBpZiAoZS55ICE9IHNhc2hSZWN0LnkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFBSRUZTX0FMTE9DQVRJT05fU0FTSCwgZS55KTsKLSAgICAgICAgICAgICAgICAgICAgc2FzaF9jb21wb3NpdGUubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGV0YWlsVGFibGUoQ29tcG9zaXRlIGJhc2UpIHsKLQotICAgICAgICBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZzID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIG1EZXRhaWxUYWJsZSA9IG5ldyBUYWJsZShiYXNlLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtRGV0YWlsVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1EZXRhaWxUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtRGV0YWlsVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1EZXRhaWxUYWJsZSwgIkFkZHJlc3MiLCBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjAwMDAwMDAwIiwgUFJFRlNfREVUQUlMX0FERFJFU1MsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtRGV0YWlsVGFibGUsICJMaWJyYXJ5IiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0IiwgUFJFRlNfREVUQUlMX0xJQlJBUlksIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtRGV0YWlsVGFibGUsICJNZXRob2QiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLCBQUkVGU19ERVRBSUxfTUVUSE9ELCBwcmVmcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obURldGFpbFRhYmxlLCAiRmlsZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsIFBSRUZTX0RFVEFJTF9GSUxFLCBwcmVmcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obURldGFpbFRhYmxlLCAiTGluZSIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiOSw5OTkiLCBQUkVGU19ERVRBSUxfTElORSwgcHJlZnMpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFsbG9jYXRpb25Ub3BIYWxmKENvbXBvc2l0ZSBiKSB7Ci0gICAgICAgIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJhc2UgPSBuZXcgQ29tcG9zaXRlKGIsIFNXVC5OT05FKTsKLSAgICAgICAgbUFsbG9jYXRpb25Nb2RlVG9wID0gYmFzZTsKLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgZ2wubWFyZ2luTGVmdCA9IGdsLm1hcmdpblJpZ2h0ID0gZ2wubWFyZ2luVG9wID0gZ2wubWFyZ2luQm90dG9tID0gMDsKLSAgICAgICAgZ2wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgYmFzZS5zZXRMYXlvdXQoZ2wpOwotICAgICAgICBiYXNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIC8vIGhvcml6b250YWwgbGF5b3V0IGZvciBtZW1vcnkgdG90YWwgYW5kIHBhZ2VzIFVJCi0gICAgICAgIG1QYWdlVUlDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICAgICAgbVBhZ2VVSUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotICAgICAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgZ2wubWFyZ2luTGVmdCA9IGdsLm1hcmdpblJpZ2h0ID0gZ2wubWFyZ2luVG9wID0gZ2wubWFyZ2luQm90dG9tID0gMDsKLSAgICAgICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBtUGFnZVVJQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgLy8gUGFnZSBVSQotICAgICAgICBtUGFnZVByZXZpb3VzQnV0dG9uID0gbmV3IEJ1dHRvbihtUGFnZVVJQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1QYWdlUHJldmlvdXNCdXR0b24uc2V0VGV4dCgiPCIpOwotICAgICAgICBtUGFnZVByZXZpb3VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLS07Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGFnZVVJKCk7Ci0gICAgICAgICAgICAgICAgZW1wdHlUYWJsZXMoKTsKLSAgICAgICAgICAgICAgICBmaWxsQWxsb2NhdGlvblRhYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1QYWdlTmV4dEJ1dHRvbiA9IG5ldyBCdXR0b24obVBhZ2VVSUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtUGFnZU5leHRCdXR0b24uc2V0VGV4dCgiPiIpOwotICAgICAgICBtUGFnZU5leHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UrKzsKLSAgICAgICAgICAgICAgICB1cGRhdGVQYWdlVUkoKTsKLSAgICAgICAgICAgICAgICBlbXB0eVRhYmxlcygpOwotICAgICAgICAgICAgICAgIGZpbGxBbGxvY2F0aW9uVGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVBhZ2VMYWJlbCA9IG5ldyBMYWJlbChtUGFnZVVJQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1QYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgdXBkYXRlUGFnZVVJKCk7Ci0KLSAgICAgICAgbUFsbG9jYXRpb25UYWJsZSA9IG5ldyBUYWJsZShiYXNlLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtQWxsb2NhdGlvblRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBtQWxsb2NhdGlvblRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1BbGxvY2F0aW9uVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1BbGxvY2F0aW9uVGFibGUsICJUb3RhbCIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiOSw5OTksOTk5IiwgUFJFRlNfQUxMT0NfVE9UQUwsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtQWxsb2NhdGlvblRhYmxlLCAiQ291bnQiLCBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjksOTk5IiwgUFJFRlNfQUxMT0NfQ09VTlQsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtQWxsb2NhdGlvblRhYmxlLCAiU2l6ZSIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiOTk5LDk5OSIsIFBSRUZTX0FMTE9DX1NJWkUsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtQWxsb2NhdGlvblRhYmxlLCAiTGlicmFyeSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdCIsIFBSRUZTX0FMTE9DX0xJQlJBUlksIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtQWxsb2NhdGlvblRhYmxlLCAiTWV0aG9kIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0IiwgUFJFRlNfQUxMT0NfTUVUSE9ELCBwcmVmcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUFsbG9jYXRpb25UYWJsZSwgIkZpbGUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCBQUkVGU19BTExPQ19GSUxFLCBwcmVmcyk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBtQWxsb2NhdGlvblRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3Rpb24gaW5kZXgKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtQWxsb2NhdGlvblRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBtQWxsb2NhdGlvblRhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBOYXRpdmVBbGxvY2F0aW9uSW5mbykgewotICAgICAgICAgICAgICAgICAgICBmaWxsRGV0YWlsVGFibGUoKE5hdGl2ZUFsbG9jYXRpb25JbmZvKWl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5VG9wSGFsZihDb21wb3NpdGUgYmFzZSkgewotICAgICAgICBmaW5hbCBpbnQgbWluUGFuZWxXaWR0aCA9IDYwOwotCi0gICAgICAgIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgY29tcG9zaXRlIHRoYXQnbGwgY29udGFpbiAyIHRhYmxlcyBob3Jpem9udGFsbHkKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUoYmFzZSwgU1dULk5PTkUpOwotICAgICAgICBtTGlicmFyeU1vZGVUb3BDb250cm9sID0gdG9wOwotICAgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotICAgICAgICB0b3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgLy8gZmlyc3QgdGFibGU6IGxpYnJhcnkKLSAgICAgICAgbUxpYnJhcnlUYWJsZSA9IG5ldyBUYWJsZSh0b3AsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIG1MaWJyYXJ5VGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1MaWJyYXJ5VGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbUxpYnJhcnlUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUxpYnJhcnlUYWJsZSwgIkxpYnJhcnkiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCBQUkVGU19MSUJfTElCUkFSWSwgcHJlZnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1MaWJyYXJ5VGFibGUsICJTaXplIiwgU1dULlJJR0hULAotICAgICAgICAgICAgICAgICI5LDk5OSw5OTkiLCBQUkVGU19MSUJfU0laRSwgcHJlZnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1MaWJyYXJ5VGFibGUsICJDb3VudCIsIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiOSw5OTkiLCBQUkVGU19MSUJfQ09VTlQsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIG1MaWJyYXJ5VGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBmaWxsTGlicmFyeUFsbG9jYXRpb25UYWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaCh0b3AsIFNXVC5WRVJUSUNBTCk7Ci0KLSAgICAgICAgLy8gMm5kIHRhYmxlOiBhbGxvY2F0aW9uIHBlciBsaWJyYXJ5Ci0gICAgICAgIG1MaWJyYXJ5QWxsb2NhdGlvblRhYmxlID0gbmV3IFRhYmxlKHRvcCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9uVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1MaWJyYXJ5QWxsb2NhdGlvblRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1MaWJyYXJ5QWxsb2NhdGlvblRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtTGlicmFyeUFsbG9jYXRpb25UYWJsZSwgIlRvdGFsIiwKLSAgICAgICAgICAgICAgICBTV1QuUklHSFQsICI5LDk5OSw5OTkiLCBQUkVGU19MSUJBTExPQ19UT1RBTCwgcHJlZnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1MaWJyYXJ5QWxsb2NhdGlvblRhYmxlLCAiQ291bnQiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwgIjksOTk5IiwgUFJFRlNfTElCQUxMT0NfQ09VTlQsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtTGlicmFyeUFsbG9jYXRpb25UYWJsZSwgIlNpemUiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwgIjk5OSw5OTkiLCBQUkVGU19MSUJBTExPQ19TSVpFLCBwcmVmcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obUxpYnJhcnlBbGxvY2F0aW9uVGFibGUsICJNZXRob2QiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLCBQUkVGU19MSUJBTExPQ19NRVRIT0QsIHByZWZzKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIG1MaWJyYXJ5QWxsb2NhdGlvblRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0aW9uIGluIHRoZSBsaWJyYXJ5IHRhYmxlCi0gICAgICAgICAgICAgICAgaW50IGluZGV4MSA9IG1MaWJyYXJ5VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IGluIHRoZSBsaWJyYXJ5IGFsbG9jYXRpb24gdGFibGUKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXgyID0gbUxpYnJhcnlBbGxvY2F0aW9uVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIE1hbGxvY0luZm8gb2JqZWN0Ci0gICAgICAgICAgICAgICAgTGlicmFyeUFsbG9jYXRpb25zIGxpYmFsbG9jID0gbUxpYnJhcnlBbGxvY2F0aW9ucy5nZXQoaW5kZXgxKTsKLSAgICAgICAgICAgICAgICBOYXRpdmVBbGxvY2F0aW9uSW5mbyBpbmZvID0gbGliYWxsb2MuZ2V0QWxsb2NhdGlvbihpbmRleDIpOwotICAgICAgICAgICAgICAgIGZpbGxEZXRhaWxUYWJsZShpbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gZm9ybSBsYXlvdXQgZGF0YQotICAgICAgICBGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0gICAgICAgIG1MaWJyYXJ5VGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCAmJiBwcmVmcy5jb250YWlucyhQUkVGU19MSUJSQVJZX1NBU0gpKSB7Ci0gICAgICAgICAgICBzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsCi0gICAgICAgICAgICAgICAgICAgIHByZWZzLmdldEludChQUkVGU19MSUJSQVJZX1NBU0gpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOwotICAgICAgICB9Ci0gICAgICAgIHNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7IC8vIDUwJSBhY3Jvc3MKLSAgICAgICAgc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQotICAgICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0gICAgICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9uVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICAvLyBhbGxvdyByZXNpemVzLCBidXQgY2FwIGF0IG1pblBhbmVsV2lkdGgKLSAgICAgICAgc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHNhc2hSZWN0ID0gc2FzaC5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcGFuZWxSZWN0ID0gdG9wLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBwYW5lbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIG1pblBhbmVsV2lkdGg7Ci0gICAgICAgICAgICAgICAgZS54ID0gTWF0aC5tYXgoTWF0aC5taW4oZS54LCByaWdodCksIG1pblBhbmVsV2lkdGgpOwotICAgICAgICAgICAgICAgIGlmIChlLnggIT0gc2FzaFJlY3QueCkgewotICAgICAgICAgICAgICAgICAgICBzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueCk7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFBSRUZTX0xJQlJBUllfU0FTSCwgZS55KTsKLSAgICAgICAgICAgICAgICAgICAgdG9wLmxheW91dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtcHR5VGFibGVzKCkgewotICAgICAgICBtQWxsb2NhdGlvblRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICBtTGlicmFyeVRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICBtTGlicmFyeUFsbG9jYXRpb25UYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgbURldGFpbFRhYmxlLnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0QWxsb2NhdGlvbnNQZXJMaWJyYXJ5KCkgewotICAgICAgICBpZiAobUNsaWVudERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBoYXNoIG1hcCBvZiBMaWJyYXJ5QWxsb2NhdGlvbnMgdG8gYWNjZXNzIGFnZ3JlZ2F0ZQotICAgICAgICAgICAgLy8gb2JqZWN0cyBhbHJlYWR5IGNyZWF0ZWQKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMaWJyYXJ5QWxsb2NhdGlvbnM+IGxpYmNhY2hlID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpYnJhcnlBbGxvY2F0aW9ucz4oKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBhbGxvY2F0aW9uIGNvdW50Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtRGlzcGxheWVkQWxsb2NhdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTmF0aXZlQWxsb2NhdGlvbkluZm8gYWxsb2NJbmZvID0gbURpc3BsYXllZEFsbG9jYXRpb25zLmdldChpKTsKLQotICAgICAgICAgICAgICAgIE5hdGl2ZVN0YWNrQ2FsbEluZm8gc3RhY2tDYWxsSW5mbyA9IGFsbG9jSW5mby5nZXRSZWxldmFudFN0YWNrQ2FsbEluZm8oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhY2tDYWxsSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaWJyYXJ5TmFtZSA9IHN0YWNrQ2FsbEluZm8uZ2V0TGlicmFyeU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlicmFyeUFsbG9jYXRpb25zIGxpYmFsbG9jID0gbGliY2FjaGUuZ2V0KGxpYnJhcnlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpYmFsbG9jID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgbGlicmFyeSBhbGxvY2F0aW9uIG9iamVjdCBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHNvIHdlIGNyZWF0ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpYmFsbG9jID0gbmV3IExpYnJhcnlBbGxvY2F0aW9ucyhsaWJyYXJ5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWJjYWNoZS5wdXQobGlicmFyeU5hbWUsIGxpYmFsbG9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgbUxpYnJhcnlBbGxvY2F0aW9ucy5hZGQobGliYWxsb2MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgTWFsbG9jSW5mbyBvYmplY3QgdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIGxpYmFsbG9jLmFkZEFsbG9jYXRpb24oYWxsb2NJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBub3cgdGhhdCB0aGUgbGlzdCBpcyBjcmVhdGVkLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgYW5kCi0gICAgICAgICAgICAvLyBzb3J0IGl0IGJ5IHNpemUuIFRoaXMgd2lsbCBhbHNvIHNvcnQgdGhlIE1hbGxvY0luZm8gb2JqZWN0cwotICAgICAgICAgICAgLy8gaW5zaWRlIGVhY2ggTGlicmFyeUFsbG9jYXRpb24gb2JqZWN0cy4KLSAgICAgICAgICAgIGZvciAoTGlicmFyeUFsbG9jYXRpb25zIGxpYmFsbG9jIDogbUxpYnJhcnlBbGxvY2F0aW9ucykgewotICAgICAgICAgICAgICAgIGxpYmFsbG9jLmNvbXB1dGVBbGxvY2F0aW9uU2l6ZUFuZENvdW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyB3ZSBzb3J0IGl0Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1MaWJyYXJ5QWxsb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yPExpYnJhcnlBbGxvY2F0aW9ucz4oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKExpYnJhcnlBbGxvY2F0aW9ucyBvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExpYnJhcnlBbGxvY2F0aW9ucyBvMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzIuZ2V0U2l6ZSgpIC0gbzEuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbmRlckJpdG1hcChDbGllbnREYXRhIGNkKSB7Ci0gICAgICAgIGJ5dGVbXSBwaXhEYXRhOwotCi0gICAgICAgIC8vIEF0b21pY2FsbHkgZ2V0IGFuZCBjbGVhciB0aGUgaGVhcCBkYXRhLgotICAgICAgICBzeW5jaHJvbml6ZWQgKGNkKSB7Ci0gICAgICAgICAgICBpZiAoc2VyaWFsaXplSGVhcERhdGEoY2QuZ2V0Vm1IZWFwRGF0YSgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSwgd2UgcmV0dXJuLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGl4RGF0YSA9IGdldFNlcmlhbGl6ZWREYXRhKCk7Ci0KLSAgICAgICAgICAgIEltYWdlRGF0YSBpZCA9IGNyZWF0ZUxpbmVhckhlYXBJbWFnZShwaXhEYXRhLCAyMDAsIG1NYXBQYWxldHRlKTsKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gbmV3IEltYWdlKG1CYXNlLmdldERpc3BsYXkoKSwgaWQpOwotICAgICAgICAgICAgbUltYWdlLnNldEltYWdlKGltYWdlKTsKLSAgICAgICAgICAgIG1JbWFnZS5wYWNrKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgY29sb3IgcGFsZXR0ZSBmb3IgbWFwLiAgU2V0IHVwIHRpdGxlcyBmb3IgbGVnZW5kLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFBhbGV0dGVEYXRhIGNyZWF0ZVBhbGV0dGUoKSB7Ci0gICAgICAgIFJHQiBjb2xvcnNbXSA9IG5ldyBSR0JbTlVNX1BBTEVUVEVfRU5UUklFU107Ci0gICAgICAgIGNvbG9yc1swXQotICAgICAgICAgICAgICAgID0gbmV3IFJHQigxOTIsIDE5MiwgMTkyKTsgLy8gbm9uLWhlYXAgcGl4ZWxzIGFyZSBncmF5Ci0gICAgICAgIG1NYXBMZWdlbmRbMF0KLSAgICAgICAgICAgICAgICA9ICIoaGVhcCBleHBhbnNpb24gYXJlYSkiOwotCi0gICAgICAgIGNvbG9yc1sxXQotICAgICAgICAgICAgICAgID0gbmV3IFJHQigwLCAwLCAwKTsgICAgICAgLy8gZnJlZSBjaHVua3MgYXJlIGJsYWNrCi0gICAgICAgIG1NYXBMZWdlbmRbMV0KLSAgICAgICAgICAgICAgICA9ICJmcmVlIjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfT0JKRUNUICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMCwgMCwgMjU1KTsgICAgIC8vIG9iamVjdHMgYXJlIGJsdWUKLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9PQkpFQ1QgKyAyXQotICAgICAgICAgICAgICAgID0gImRhdGEgb2JqZWN0IjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQ0xBU1NfT0JKRUNUICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMCwgMjU1LCAwKTsgICAgIC8vIGNsYXNzIG9iamVjdHMgYXJlIGdyZWVuCi0gICAgICAgIG1NYXBMZWdlbmRbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQ0xBU1NfT0JKRUNUICsgMl0KLSAgICAgICAgICAgICAgICA9ICJjbGFzcyBvYmplY3QiOwotCi0gICAgICAgIGNvbG9yc1tIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV8xICsgMl0KLSAgICAgICAgICAgICAgICA9IG5ldyBSR0IoMjU1LCAwLCAwKTsgICAgIC8vIGJ5dGUvYm9vbCBhcnJheXMgYXJlIHJlZAotICAgICAgICBtTWFwTGVnZW5kW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX0FSUkFZXzEgKyAyXQotICAgICAgICAgICAgICAgID0gIjEtYnl0ZSBhcnJheSAoYnl0ZVtdLCBib29sZWFuW10pIjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfMiArIDJdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDI1NSwgMTI4LCAwKTsgICAvLyBzaG9ydC9jaGFyIGFycmF5cyBhcmUgb3JhbmdlCi0gICAgICAgIG1NYXBMZWdlbmRbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfMiArIDJdCi0gICAgICAgICAgICAgICAgPSAiMi1ieXRlIGFycmF5IChzaG9ydFtdLCBjaGFyW10pIjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfNCArIDJdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDI1NSwgMjU1LCAwKTsgICAvLyBvYmovaW50L2Zsb2F0IGFycmF5cyBhcmUgeWVsbG93Ci0gICAgICAgIG1NYXBMZWdlbmRbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfNCArIDJdCi0gICAgICAgICAgICAgICAgPSAiNC1ieXRlIGFycmF5IChvYmplY3RbXSwgaW50W10sIGZsb2F0W10pIjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfQVJSQVlfOCArIDJdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDI1NSwgMTI4LCAxMjgpOyAvLyBsb25nL2RvdWJsZSBhcnJheXMgYXJlIHBpbmsKLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9BUlJBWV84ICsgMl0KLSAgICAgICAgICAgICAgICA9ICI4LWJ5dGUgYXJyYXkgKGxvbmdbXSwgZG91YmxlW10pIjsKLQotICAgICAgICBjb2xvcnNbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfVU5LTk9XTiArIDJdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDI1NSwgMCwgMjU1KTsgICAvLyB1bmtub3duIG9iamVjdHMgYXJlIGN5YW4KLSAgICAgICAgbU1hcExlZ2VuZFtIZWFwU2VnbWVudEVsZW1lbnQuS0lORF9VTktOT1dOICsgMl0KLSAgICAgICAgICAgICAgICA9ICJ1bmtub3duIG9iamVjdCI7Ci0KLSAgICAgICAgY29sb3JzW0hlYXBTZWdtZW50RWxlbWVudC5LSU5EX05BVElWRSArIDJdCi0gICAgICAgICAgICAgICAgPSBuZXcgUkdCKDY0LCA2NCwgNjQpOyAgICAvLyBuYXRpdmUgb2JqZWN0cyBhcmUgZGFyayBncmF5Ci0gICAgICAgIG1NYXBMZWdlbmRbSGVhcFNlZ21lbnRFbGVtZW50LktJTkRfTkFUSVZFICsgMl0KLSAgICAgICAgICAgICAgICA9ICJub24tSmF2YSBvYmplY3QiOwotCi0gICAgICAgIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoY29sb3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVBbGxvY2F0aW9ucyhTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZU5hbWUpKSk7Ci0gICAgCi0gICAgICAgICAgICBmb3IgKE5hdGl2ZUFsbG9jYXRpb25JbmZvIGFsbG9jIDogbUFsbG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oYWxsb2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoIk5hdGl2ZSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9QYW5lbC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTEwY2M3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBvdXIgaW5mb3JtYXRpb24gcGFuZWxzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFuZWwgewotCi0gICAgcHVibGljIGZpbmFsIENvbnRyb2wgY3JlYXRlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb250cm9sIHBhbmVsQ29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgICAgICBwb3N0Q3JlYXRpb24oKTsKLQotICAgICAgICByZXR1cm4gcGFuZWxDb250cm9sOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvc3RDcmVhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIHNvbWUgaW5mb3JtYXRpb24uICBUaGlzIGlzCi0gICAgICogY2FsbGVkIG9uY2UsIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZywgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZm9jdXMgdG8gdGhlIHByb3BlciBjb250cm9sIGluc2lkZSB0aGUgcGFuZWwuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9jdXMoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9Qb3J0RmllbGRFZGl0b3IuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvUG9ydEZpZWxkRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzM3MmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9Qb3J0RmllbGRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVkaXQgYW4gaW50ZWdlciBmaWVsZCwgdmFsaWRhdGluZyBpdCBhcyBhIHBvcnQgbnVtYmVyLgotICovCi1wdWJsaWMgY2xhc3MgUG9ydEZpZWxkRWRpdG9yIGV4dGVuZHMgSW50ZWdlckZpZWxkRWRpdG9yIHsKLQotICAgIHB1YmxpYyBib29sZWFuIG1SZWN1cnNpdmVDaGVjayA9IGZhbHNlOwotCi0gICAgcHVibGljIFBvcnRGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIGxhYmVsLCBwYXJlbnQpOwotICAgICAgICBzZXRWYWxpZGF0ZVN0cmF0ZWd5KFZBTElEQVRFX09OX0tFWV9TVFJPS0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZCwgYXMgYW4gaW50ZWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgICAgaW50IHZhbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbCA9IEludGVnZXIucGFyc2VJbnQoZ2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgIHZhbCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpZWxkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RhdGUoKSB7Ci0gICAgICAgIGlmIChzdXBlci5jaGVja1N0YXRlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvL0xvZy5pKCJkZG1zIiwgImNoZWNrIHN0YXRlICIgKyBnZXRTdHJpbmdWYWx1ZSgpKTsKLSAgICAgICAgYm9vbGVhbiBlcnIgPSBmYWxzZTsKLSAgICAgICAgaW50IHZhbCA9IGdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsIDwgMTAyNCB8fCB2YWwgPiAzMjc2NykgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJQb3J0IG11c3QgYmUgYmV0d2VlbiAxMDI0IGFuZCAzMjc2NyIpOwotICAgICAgICAgICAgZXJyID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIGVyciA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNob3dFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuICFlcnI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hlY2tTdGF0ZShQb3J0RmllbGRFZGl0b3IgcGZlKSB7Ci0gICAgICAgIHBmZS5yZWZyZXNoVmFsaWRTdGF0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvU2NyZWVuU2hvdERpYWxvZy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TY3JlZW5TaG90RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTA4ZjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TY3JlZW5TaG90RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5SYXdJbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkltYWdlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEdhdGhlciBhIHNjcmVlbiBzaG90IGZyb20gdGhlIGRldmljZSBhbmQgc2F2ZSBpdCB0byBhIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JlZW5TaG90RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotICAgIHByaXZhdGUgTGFiZWwgbUJ1c3lMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG1JbWFnZUxhYmVsOwotICAgIHByaXZhdGUgQnV0dG9uIG1TYXZlOwotICAgIHByaXZhdGUgSURldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgUmF3SW1hZ2UgbVJhd0ltYWdlOwotICAgIHByaXZhdGUgQ2xpcGJvYXJkIG1DbGlwYm9hcmQ7Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB3aXRoIGRlZmF1bHQgc3R5bGUuCi0gICAgICovCi0gICAgcHVibGljIFNjcmVlblNob3REaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICAgICAgICBtQ2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgd2l0aCBhcHAtZGVmaW5lZCBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2NyZWVuU2hvdERpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlIGFuZCBkaXNwbGF5IHRoZSBkaWFsb2cuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUge0BsaW5rIElEZXZpY2V9IGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBzY3JlZW5zaG90LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW4oSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLQotICAgICAgICBTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBnZXRTdHlsZSgpKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dCgiRGV2aWNlIFNjcmVlbiBDYXB0dXJlIik7Ci0KLSAgICAgICAgY3JlYXRlQ29udGVudHMoc2hlbGwpOwotICAgICAgICBzaGVsbC5wYWNrKCk7Ci0gICAgICAgIHNoZWxsLm9wZW4oKTsKLQotICAgICAgICB1cGRhdGVEZXZpY2VJbWFnZShzaGVsbCk7Ci0KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLSAgICAgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBzY3JlZW4gY2FwdHVyZSBkaWFsb2cgY29udGVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIEdyaWREYXRhIGRhdGE7Ci0KLSAgICAgICAgZmluYWwgaW50IGNvbENvdW50ID0gNTsKLQotICAgICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sQ291bnQsIHRydWUpKTsKLQotICAgICAgICAvLyAicmVmcmVzaCIgYnV0dG9uCi0gICAgICAgIEJ1dHRvbiByZWZyZXNoID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgICAgICByZWZyZXNoLnNldFRleHQoIlJlZnJlc2giKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gODA7Ci0gICAgICAgIHJlZnJlc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmVmcmVzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZURldmljZUltYWdlKHNoZWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gInJvdGF0ZSIgYnV0dG9uCi0gICAgICAgIEJ1dHRvbiByb3RhdGUgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJvdGF0ZS5zZXRUZXh0KCJSb3RhdGUiKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gODA7Ci0gICAgICAgIHJvdGF0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByb3RhdGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJhd0ltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJhd0ltYWdlID0gbVJhd0ltYWdlLmdldFJvdGF0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW1hZ2VEaXNwbGF5KHNoZWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vICJzYXZlIiBidXR0b24KLSAgICAgICAgbVNhdmUgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1TYXZlLnNldFRleHQoIlNhdmUiKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gODA7Ci0gICAgICAgIG1TYXZlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG1TYXZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2F2ZUltYWdlKHNoZWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQnV0dG9uIGNvcHkgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgICAgIGNvcHkuc2V0VGV4dCgiQ29weSIpOwotICAgICAgICBjb3B5LnNldFRvb2xUaXBUZXh0KCJDb3B5IHRoZSBzY3JlZW5zaG90IHRvIHRoZSBjbGlwYm9hcmQiKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gODA7Ci0gICAgICAgIGNvcHkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgY29weS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvcHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICAvLyAiZG9uZSIgYnV0dG9uCi0gICAgICAgIEJ1dHRvbiBkb25lID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgICAgICBkb25lLnNldFRleHQoIkRvbmUiKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gODA7Ci0gICAgICAgIGRvbmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZG9uZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHRpdGxlLyJjYXB0dXJpbmciIGxhYmVsCi0gICAgICAgIG1CdXN5TGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgbUJ1c3lMYWJlbC5zZXRUZXh0KCJQcmVwYXJpbmcuLi4iKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2xDb3VudDsKLSAgICAgICAgbUJ1c3lMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIHNwYWNlIGZvciB0aGUgaW1hZ2UKLSAgICAgICAgbUltYWdlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbENvdW50OwotICAgICAgICBtSW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIG1JbWFnZUxhYmVsLnNldEltYWdlKEltYWdlSGVscGVyLmNyZWF0ZVBsYWNlSG9sZGVyQXJ0KAotICAgICAgICAgICAgICAgIGRpc3BsYXksIDUwLCA1MCwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpKTsKLQotCi0gICAgICAgIHNoZWxsLnNldERlZmF1bHRCdXR0b24oZG9uZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBjb250ZW50IG9mIHtAbGluayAjbUltYWdlTGFiZWx9IHRvIHRoZSBjbGlwYm9hcmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHkoKSB7Ci0gICAgICAgIG1DbGlwYm9hcmQuc2V0Q29udGVudHMoCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbWFnZUxhYmVsLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkKLSAgICAgICAgICAgICAgICB9LCBuZXcgVHJhbnNmZXJbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXB0dXJlcyBhIG5ldyBpbWFnZSBmcm9tIHRoZSBkZXZpY2UsIGFuZCBkaXNwbGF5IGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZXZpY2VJbWFnZShTaGVsbCBzaGVsbCkgewotICAgICAgICBtQnVzeUxhYmVsLnNldFRleHQoIkNhcHR1cmluZy4uLiIpOyAgICAgLy8gbm8gZWZmZWN0Ci0KLSAgICAgICAgc2hlbGwuc2V0Q3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoU1dULkNVUlNPUl9XQUlUKSk7Ci0KLSAgICAgICAgbVJhd0ltYWdlID0gZ2V0RGV2aWNlSW1hZ2UoKTsKLQotICAgICAgICB1cGRhdGVJbWFnZURpc3BsYXkoc2hlbGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpc3BsYXkgd2l0aCB7QGxpbmsgI21SYXdJbWFnZX0uCi0gICAgICogQHBhcmFtIHNoZWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUltYWdlRGlzcGxheShTaGVsbCBzaGVsbCkgewotICAgICAgICBJbWFnZSBpbWFnZTsKLSAgICAgICAgaWYgKG1SYXdJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICBpbWFnZSA9IEltYWdlSGVscGVyLmNyZWF0ZVBsYWNlSG9sZGVyQXJ0KAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LCAzMjAsIDI0MCwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCi0gICAgICAgICAgICBtU2F2ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1CdXN5TGFiZWwuc2V0VGV4dCgiU2NyZWVuIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQgcmF3IGRhdGEgdG8gYW4gSW1hZ2UuCi0gICAgICAgICAgICBQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKAotICAgICAgICAgICAgICAgICAgICBtUmF3SW1hZ2UuZ2V0UmVkTWFzaygpLAotICAgICAgICAgICAgICAgICAgICBtUmF3SW1hZ2UuZ2V0R3JlZW5NYXNrKCksCi0gICAgICAgICAgICAgICAgICAgIG1SYXdJbWFnZS5nZXRCbHVlTWFzaygpKTsKLQotICAgICAgICAgICAgSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEobVJhd0ltYWdlLndpZHRoLCBtUmF3SW1hZ2UuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBtUmF3SW1hZ2UuYnBwLCBwYWxldHRlLCAxLCBtUmF3SW1hZ2UuZGF0YSk7Ci0gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZShnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCksIGltYWdlRGF0YSk7Ci0KLSAgICAgICAgICAgIG1TYXZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtQnVzeUxhYmVsLnNldFRleHQoIkNhcHR1cmVkIGltYWdlOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUltYWdlTGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgICBtSW1hZ2VMYWJlbC5wYWNrKCk7Ci0gICAgICAgIHNoZWxsLnBhY2soKTsKLQotICAgICAgICAvLyB0aGVyZSdzIG5vIHdheSB0byByZXN0b3JlIG9sZCBjdXJzb3I7IGFzc3VtZSBpdCdzIEFSUk9XCi0gICAgICAgIHNoZWxsLnNldEN1cnNvcihzaGVsbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfQVJST1cpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHcmFicyBhbiBpbWFnZSBmcm9tIGFuIEFEQi1jb25uZWN0ZWQgZGV2aWNlIGFuZCByZXR1cm5zIGl0IGFzIGEge0BsaW5rIFJhd0ltYWdlfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFJhd0ltYWdlIGdldERldmljZUltYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UuZ2V0U2NyZWVuc2hvdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIExvZy53KCJkZG1zIiwgIlVuYWJsZSB0byBnZXQgZnJhbWUgYnVmZmVyOiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlIGltYWdlIHRvIGRpc2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVJbWFnZShTaGVsbCBzaGVsbCkgewotICAgICAgICBGaWxlRGlhbG9nIGRsZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZTsKLQotICAgICAgICBkbGcuc2V0VGV4dCgiU2F2ZSBpbWFnZS4uLiIpOwotICAgICAgICBkbGcuc2V0RmlsZU5hbWUoImRldmljZS5wbmciKTsKLSAgICAgICAgZGxnLnNldEZpbHRlclBhdGgoRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpLmdldFN0cmluZygibGFzdEltYWdlU2F2ZURpciIpKTsKLSAgICAgICAgZGxnLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiUE5HIEZpbGVzICgqLnBuZykiCi0gICAgICAgIH0pOwotICAgICAgICBkbGcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIioucG5nIiAvLyROT04tTkxTLTEkCi0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbGVOYW1lID0gZGxnLm9wZW4oKTsKLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIERkbVVpUHJlZmVyZW5jZXMuZ2V0U3RvcmUoKS5zZXRWYWx1ZSgibGFzdEltYWdlU2F2ZURpciIsIGRsZy5nZXRGaWx0ZXJQYXRoKCkpOwotCi0gICAgICAgICAgICBMb2cuZCgiZGRtcyIsICJTYXZpbmcgaW1hZ2UgdG8gIiArIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIEltYWdlRGF0YSBpbWFnZURhdGEgPSBtSW1hZ2VMYWJlbC5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotICAgICAgICAgICAgICAgIGxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2VEYXRhIH07Ci0gICAgICAgICAgICAgICAgbG9hZGVyLnNhdmUoZmlsZU5hbWUsIFNXVC5JTUFHRV9QTkcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoImRkbXMiLCAiVW5hYmxlIHRvIHNhdmUgIiArIGZpbGVOYW1lICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1NlbGVjdGlvbkRlcGVuZGVudFBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1NlbGVjdGlvbkRlcGVuZGVudFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDIyMTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TZWxlY3Rpb25EZXBlbmRlbnRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotCi0vKioKLSAqIEEgUGFuZWwgdGhhdCByZXF1aXJlcyB7QGxpbmsgRGV2aWNlfS97QGxpbmsgQ2xpZW50fSBzZWxlY3Rpb24gbm90aWZpY2F0aW9ucy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsIGV4dGVuZHMgUGFuZWwgewotICAgIHByaXZhdGUgSURldmljZSBtQ3VycmVudERldmljZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBDbGllbnQgbUN1cnJlbnRDbGllbnQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgRGV2aWNlfS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGRldmljZSBvciBudWxsIGlmIG5vbmUgYXJlIHNlbGVjdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBJRGV2aWNlIGdldEN1cnJlbnREZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudERldmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBDbGllbnR9LgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY2xpZW50IG9yIG51bGwgaWYgbm9uZSBhcmUgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIENsaWVudCBnZXRDdXJyZW50Q2xpZW50KCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRDbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWREZXZpY2UgdGhlIHNlbGVjdGVkIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXZpY2VTZWxlY3RlZChJRGV2aWNlIHNlbGVjdGVkRGV2aWNlKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZERldmljZSAhPSBtQ3VycmVudERldmljZSkgewotICAgICAgICAgICAgbUN1cnJlbnREZXZpY2UgPSBzZWxlY3RlZERldmljZTsKLSAgICAgICAgICAgIGRldmljZVNlbGVjdGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgY2xpZW50IGlzIHNlbGVjdGVkLgotICAgICAqIEBwYXJhbSBzZWxlY3RlZENsaWVudCB0aGUgc2VsZWN0ZWQgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsaWVudFNlbGVjdGVkKENsaWVudCBzZWxlY3RlZENsaWVudCkgewotICAgICAgICBpZiAoc2VsZWN0ZWRDbGllbnQgIT0gbUN1cnJlbnRDbGllbnQpIHsKLSAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50ID0gc2VsZWN0ZWRDbGllbnQ7Ci0gICAgICAgICAgICBjbGllbnRTZWxlY3RlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4gVGhlIG5ldyBkZXZpY2UgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnREZXZpY2UoKX0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGV2aWNlU2VsZWN0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyBjbGllbnQgaXMgc2VsZWN0ZWQuIFRoZSBuZXcgY2xpZW50IGNhbiBiZSBhY2Nlc3NlZAotICAgICAqIHdpdGgge0BsaW5rICNnZXRDdXJyZW50Q2xpZW50KCl9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsaWVudFNlbGVjdGVkKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1N0YWNrVHJhY2VQYW5lbC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TdGFja1RyYWNlUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1ODk2Mi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1N0YWNrVHJhY2VQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVN0YWNrVHJhY2VJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogU3RhY2sgVHJhY2UgUGFuZWwuCi0gKiA8cC8+VGhpcyBpcyBub3QgYSBwYW5lbCBpbiB0aGUgcmVndWxhciBzZW5zZS4gSW5zdGVhZCB0aGlzIGlzIGp1c3QgYW4gb2JqZWN0IGFyb3VuZCB0aGUgY3JlYXRpb24KLSAqIGFuZCBtYW5hZ2VtZW50IG9mIGEgU3RhY2sgVHJhY2UgZGlzcGxheS4KLSAqIDxwLz5VSSBjcmVhdGlvbiBpcyBkb25lIHRocm91Z2gKLSAqIHtAbGluayAjY3JlYXRlUGFuZWwoQ29tcG9zaXRlLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgSVByZWZlcmVuY2VTdG9yZSl9LgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YWNrVHJhY2VQYW5lbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJU291cmNlUmV2ZWFsZXIgc1NvdXJjZVJldmVhbGVyOwotCi0gICAgcHJpdmF0ZSBUYWJsZSBtU3RhY2tUcmFjZVRhYmxlOwotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgbVN0YWNrVHJhY2VWaWV3ZXI7Ci0KLSAgICBwcml2YXRlIENsaWVudCBtQ3VycmVudENsaWVudDsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb250ZW50IFByb3ZpZGVyIHRvIGRpc3BsYXkgdGhlIHN0YWNrIHRyYWNlIG9mIGEgdGhyZWFkLgotICAgICAqIEV4cGVjdGVkIGlucHV0IGlzIGEge0BsaW5rIElTdGFja1RyYWNlSW5mb30gb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YWNrVHJhY2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVN0YWNrVHJhY2VJbmZvKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0RWxlbWVudCBjYW5ub3QgcmV0dXJuIG51bGwsIHNvIHdlIHJldHVybiBhbiBlbXB0eSBhcnJheQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gc3RhY2sgdHJhY2UKLSAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCB0cmFjZVtdID0gKChJU3RhY2tUcmFjZUluZm8paW5wdXRFbGVtZW50KS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBBIExhYmVsIFByb3ZpZGVyIHRvIHVzZSB3aXRoIHtAbGluayBTdGFja1RyYWNlQ29udGVudFByb3ZpZGVyfS4gSXQgZXhwZWN0cyB0aGUgZWxlbWVudHMgdG8gYmUKLSAgICAgKiBvZiB0eXBlIHtAbGluayBTdGFja1RyYWNlRWxlbWVudH0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhY2tUcmFjZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdGFja1RyYWNlRWxlbWVudCkgewotICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IHRyYWNlRWxlbWVudCA9IChTdGFja1RyYWNlRWxlbWVudCllbGVtZW50OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlRWxlbWVudC5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlRWxlbWVudC5nZXRNZXRob2ROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZUVsZW1lbnQuZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodHJhY2VFbGVtZW50LmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnRvU3RyaW5nKHRyYWNlRWxlbWVudC5pc05hdGl2ZU1ldGhvZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IGlzIGFibGUgdG8gcmV2ZWFsIGEgbWV0aG9kCi0gICAgICogaW4gYSBzb3VyY2UgZWRpdG9yCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJU291cmNlUmV2ZWFsZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB0byByZXZlYWwgYSBwYXJ0aWN1bGFyIGxpbmUgaW4gYSBzb3VyY2UgZWRpdG9yCi0gICAgICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHJ1bm5pbmcgdGhlIHNvdXJjZS4KLSAgICAgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcmV2ZWFsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXZlYWwoU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgaW50IGxpbmUpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgSVNvdXJjZVJldmVhbGVyfSBvYmplY3QgYWJsZSB0byByZXZlYWwgc291cmNlIGNvZGUgaW4gYSBzb3VyY2UgZWRpdG9yLgotICAgICAqIEBwYXJhbSByZXZlYWxlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTb3VyY2VSZXZlYWxlcihJU291cmNlUmV2ZWFsZXIgcmV2ZWFsZXIpIHsKLSAgICAgICAgc1NvdXJjZVJldmVhbGVyID0gcmV2ZWFsZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgU3RyYWNrVHJhY2UgZGlzcGxheS4KLSAgICAgKiA8cC8+VGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSB0byB1c2UgYSB7QGxpbmsgR3JpZExheW91dH0gd2l0aAotICAgICAqIDIgY29sdW1ucy4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAgICAqIEBwYXJhbSBwcmVmc19zdGFja19jb2xfY2xhc3MgCi0gICAgICogQHBhcmFtIHByZWZzX3N0YWNrX2NvbF9tZXRob2QgCi0gICAgICogQHBhcmFtIHByZWZzX3N0YWNrX2NvbF9maWxlIAotICAgICAqIEBwYXJhbSBwcmVmc19zdGFja19jb2xfbGluZSAKLSAgICAgKiBAcGFyYW0gcHJlZnNfc3RhY2tfY29sX25hdGl2ZSAKLSAgICAgKiBAcGFyYW0gc3RvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFibGUgY3JlYXRlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHByZWZzX3N0YWNrX2NvbF9jbGFzcywKLSAgICAgICAgICAgIFN0cmluZyBwcmVmc19zdGFja19jb2xfbWV0aG9kLCBTdHJpbmcgcHJlZnNfc3RhY2tfY29sX2ZpbGUsIFN0cmluZyBwcmVmc19zdGFja19jb2xfbGluZSwKLSAgICAgICAgICAgIFN0cmluZyBwcmVmc19zdGFja19jb2xfbmF0aXZlLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0gICAgICAgIAotICAgICAgICBtU3RhY2tUcmFjZVRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgbVN0YWNrVHJhY2VUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtU3RhY2tUcmFjZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlVGFibGUsCi0gICAgICAgICAgICAgICAgIkNsYXNzIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiU29tZUxvbmdDbGFzc05hbWUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJlZnNfc3RhY2tfY29sX2NsYXNzLCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbVN0YWNrVHJhY2VUYWJsZSwKLSAgICAgICAgICAgICAgICAiTWV0aG9kIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAic29tZUxvbmdNZXRob2QiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJlZnNfc3RhY2tfY29sX21ldGhvZCwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlVGFibGUsCi0gICAgICAgICAgICAgICAgIkZpbGUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICJhbmRyb2lkL3NvbWVwYWNrYWdlL3NvbWVvdGhlcnBhY2thZ2Uvc29tZWZpbGUuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJlZnNfc3RhY2tfY29sX2ZpbGUsIHN0b3JlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbigKLSAgICAgICAgICAgICAgICBtU3RhY2tUcmFjZVRhYmxlLAotICAgICAgICAgICAgICAgICJMaW5lIiwKLSAgICAgICAgICAgICAgICBTV1QuUklHSFQsCi0gICAgICAgICAgICAgICAgIjk5OTk5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByZWZzX3N0YWNrX2NvbF9saW5lLCBzdG9yZSk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbVN0YWNrVHJhY2VUYWJsZSwKLSAgICAgICAgICAgICAgICAiTmF0aXZlIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiTmF0aXZlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHByZWZzX3N0YWNrX2NvbF9uYXRpdmUsIHN0b3JlKTsKLSAgICAgICAgCi0gICAgICAgIG1TdGFja1RyYWNlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG1TdGFja1RyYWNlVGFibGUpOwotICAgICAgICBtU3RhY2tUcmFjZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFN0YWNrVHJhY2VDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIG1TdGFja1RyYWNlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFN0YWNrVHJhY2VMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICAKLSAgICAgICAgbVN0YWNrVHJhY2VWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNTb3VyY2VSZXZlYWxlciAhPSBudWxsICYmIG1DdXJyZW50Q2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3RlZCBzdGFjayB0cmFjZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbVN0YWNrVHJhY2VWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RhY2tUcmFjZUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCB0cmFjZUVsZW1lbnQgPSAoU3RhY2tUcmFjZUVsZW1lbnQpb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZUVsZW1lbnQuaXNOYXRpdmVNZXRob2QoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU291cmNlUmV2ZWFsZXIucmV2ZWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50LmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUVsZW1lbnQuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VFbGVtZW50LmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gbVN0YWNrVHJhY2VUYWJsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5wdXQgZm9yIHRoZSB7QGxpbmsgVGFibGVWaWV3ZXJ9LgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUge0BsaW5rIElTdGFja1RyYWNlSW5mb30gdGhhdCB3aWxsIHByb3ZpZGUgdGhlIHZpZXdlciB3aXRoIHRoZSBsaXN0IG9mCi0gICAgICoge0BsaW5rIFN0YWNrVHJhY2VFbGVtZW50fQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdlcklucHV0KElTdGFja1RyYWNlSW5mbyBpbnB1dCkgewotICAgICAgICBtU3RhY2tUcmFjZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIG1TdGFja1RyYWNlVmlld2VyLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBjbGllbnQgcnVubmluZyB0aGUgc3RhY2sgdHJhY2UuCi0gICAgICogQHBhcmFtIGN1cnJlbnRDbGllbnQgdGhlIHtAbGluayBDbGllbnR9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRDbGllbnQoQ2xpZW50IGN1cnJlbnRDbGllbnQpIHsKLSAgICAgICAgbUN1cnJlbnRDbGllbnQgPSBjdXJyZW50Q2xpZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvU3luY1Byb2dyZXNzTW9uaXRvci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TeW5jUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjU5ODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TeW5jUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5JU3luY1Byb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSVN5bmNQcm9ncmVzc01vbml0b3J9IHdyYXBwaW5nIGFuIEVjbGlwc2Uge0BsaW5rIElQcm9ncmVzc01vbml0b3J9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY1Byb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIElTeW5jUHJvZ3Jlc3NNb25pdG9yIHsKLQotICAgIHByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtTW9uaXRvcjsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLQotICAgIHB1YmxpYyBTeW5jUHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU1vbml0b3IgPSBtb25pdG9yOwotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoaW50IHRvdGFsV29yaykgewotICAgICAgICBtTW9uaXRvci5iZWdpblRhc2sobU5hbWUsIHRvdGFsV29yayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgbU1vbml0b3IuZG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkdmFuY2UoaW50IHdvcmspIHsKLSAgICAgICAgbU1vbml0b3Iud29ya2VkKHdvcmspOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRTdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1Nb25pdG9yLnN1YlRhc2sobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TeXNpbmZvUGFuZWwuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvU3lzaW5mb1BhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjIzN2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9TeXNpbmZvUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklTaGVsbE91dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5DaGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LkpGcmVlQ2hhcnQ7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEuZ2VuZXJhbC5EZWZhdWx0UGllRGF0YXNldDsKLWltcG9ydCBvcmcuamZyZWUuZXhwZXJpbWVudGFsLmNoYXJ0LnN3dC5DaGFydENvbXBvc2l0ZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBEaXNwbGF5cyBzeXN0ZW0gaW5mb3JtYXRpb24gZ3JhcGhzIG9idGFpbmVkIGZyb20gYSBidWdyZXBvcnQgZmlsZSBvciBkZXZpY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeXNpbmZvUGFuZWwgZXh0ZW5kcyBUYWJsZVBhbmVsIGltcGxlbWVudHMgSVNoZWxsT3V0cHV0UmVjZWl2ZXIgewotCi0gICAgLy8gVUkgY29tcG9uZW50cwotICAgIHByaXZhdGUgTGFiZWwgbUxhYmVsOwotICAgIHByaXZhdGUgQnV0dG9uIG1GZXRjaEJ1dHRvbjsKLSAgICBwcml2YXRlIENvbWJvIG1EaXNwbGF5TW9kZTsKLQotICAgIHByaXZhdGUgRGVmYXVsdFBpZURhdGFzZXQgbURhdGFzZXQ7Ci0KLSAgICAvLyBUaGUgYnVncmVwb3J0IGZpbGUgdG8gcHJvY2VzcwotICAgIHByaXZhdGUgRmlsZSBtRGF0YUZpbGU7Ci0KLSAgICAvLyBUbyBnZXQgb3V0cHV0IGZyb20gYWRiIGNvbW1hbmRzCi0gICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIG1UZW1wU3RyZWFtOwotCi0gICAgLy8gU2VsZWN0cyB0aGUgY3VycmVudCBkaXNwbGF5OiBNT0RFX0NQVSwgZXRjLgotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX0NQVSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfQUxBUk0gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1dBS0VMT0NLID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9NRU1JTkZPID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TWU5DID0gNDsKLQotICAgIC8vIGFyZ3VtZW50IHRvIGR1bXBzeXM7IHNlY3Rpb24gaW4gdGhlIGJ1Z3JlcG9ydCBob2xkaW5nIHRoZSBkYXRhCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVR1JFUE9SVF9TRUNUSU9OW10gPSB7ImNwdWluZm8iLCAiYWxhcm0iLAotICAgICAgICAgICAgImJhdHRlcnlpbmZvIiwgIk1FTU9SWSBJTkZPIiwgImNvbnRlbnQifTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QX0NPTU1BTkRbXSA9IHsiZHVtcHN5cyBjcHVpbmZvIiwKLSAgICAgICAgICAgICJkdW1wc3lzIGFsYXJtIiwgImR1bXBzeXMgYmF0dGVyeWluZm8iLCAiY2F0IC9wcm9jL21lbWluZm8gOyBwcm9jcmFuayIsCi0gICAgICAgICAgICAiZHVtcHN5cyBjb250ZW50In07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQVElPTlNbXSA9IHsiQ1BVIGxvYWQiLCAiQWxhcm1zIiwKLSAgICAgICAgICAgICJXYWtlbG9ja3MiLCAiTWVtb3J5IHVzYWdlIiwgIlN5bmMifTsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgZGF0YXNldCB0byBkaXNwbGF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGJ1Z3JlcG9ydCBmaWxlIHRvIHByb2Nlc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVEYXRhc2V0KEZpbGUgZmlsZSkgewotICAgICAgICBtRGF0YXNldC5jbGVhcigpOwotICAgICAgICBtTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBnZXRCdWdyZXBvcnRSZWFkZXIoZmlsZSk7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9DUFUpIHsKLSAgICAgICAgICAgICAgICByZWFkQ3B1RGF0YXNldChicik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IE1PREVfQUxBUk0pIHsKLSAgICAgICAgICAgICAgICByZWFkQWxhcm1EYXRhc2V0KGJyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9XQUtFTE9DSykgewotICAgICAgICAgICAgICAgIHJlYWRXYWtlbG9ja0RhdGFzZXQoYnIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX01FTUlORk8pIHsKLSAgICAgICAgICAgICAgICByZWFkTWVtaW5mb0RhdGFzZXQoYnIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX1NZTkMpIHsKLSAgICAgICAgICAgICAgICByZWFkU3luY0RhdGFzZXQoYnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRERNUyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4gVGhlIG5ldyBkZXZpY2UgY2FuIGJlIGFjY2Vzc2VkIHdpdGgKLSAgICAgKiB7QGxpbmsgI2dldEN1cnJlbnREZXZpY2UoKX0KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VTZWxlY3RlZCgpIHsKLSAgICAgICAgaWYgKGdldEN1cnJlbnREZXZpY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmV0Y2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGxvYWRGcm9tRGV2aWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmV0Y2hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgY2xpZW50IGlzIHNlbGVjdGVkLiBUaGUgbmV3IGNsaWVudCBjYW4gYmUgYWNjZXNzZWQgd2l0aAotICAgICAqIHtAbGluayAjZ2V0Q3VycmVudENsaWVudCgpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRTZWxlY3RlZCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgcHJvcGVyIGNvbnRyb2wgaW5zaWRlIHRoZSBwYW5lbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgbURpc3BsYXlNb2RlLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhIG5ldyBidWdyZXBvcnQgZnJvbSB0aGUgZGV2aWNlIGFuZCB1cGRhdGVzIHRoZSBkaXNwbGF5LgotICAgICAqIEZldGNoaW5nIGlzIGFzeW5jaHJvbm91cy4gIFNlZSBhbHNvIGFkZE91dHB1dCwgZmx1c2gsIGFuZCBpc0NhbmNlbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEZyb21EZXZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbml0U2hlbGxPdXRwdXRCdWZmZXIoKTsKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX01FTUlORk8pIHsKLSAgICAgICAgICAgICAgICAvLyBIYWNrIHRvIGFkZCBidWdyZXBvcnQtc3R5bGUgc2VjdGlvbiBoZWFkZXIgZm9yIG1lbWluZm8KLSAgICAgICAgICAgICAgICBtVGVtcFN0cmVhbS53cml0ZSgiLS0tLS0tIE1FTU9SWSBJTkZPIC0tLS0tLVxuIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldEN1cnJlbnREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICBEVU1QX0NPTU1BTkRbbU1vZGVdLCB0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoIkRETVMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRlbXBvcmFyeSBvdXRwdXQgZmlsZSBmb3IgZXhlY3V0ZVNoZWxsQ29tbWFuZCgpLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBmaWxlIGVycm9yCi0gICAgICovCi0gICAgdm9pZCBpbml0U2hlbGxPdXRwdXRCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtRGF0YUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJkZG1zZmlsZSIsICIudHh0Iik7Ci0gICAgICAgIG1EYXRhRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgbVRlbXBTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtRGF0YUZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgb3V0cHV0IHRvIHRoZSB0ZW1wIGZpbGUuIElTaGVsbE91dHB1dFJlY2VpdmVyIG1ldGhvZC4gQ2FsbGVkIGJ5Ci0gICAgICogZXhlY3V0ZVNoZWxsQ29tbWFuZCgpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE91dHB1dChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVRlbXBTdHJlYW0ud3JpdGUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiRERNUyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIG91dHB1dCBmcm9tIHNoZWxsIGNvbW1hbmQuIElTaGVsbE91dHB1dFJlY2VpdmVyIG1ldGhvZC4gVGhlCi0gICAgICogb3V0cHV0IGlzIHBhc3NlZCB0byBnZW5lcmF0ZURhdGFzZXQoKS4gQ2FsbGVkIGJ5IGV4ZWN1dGVTaGVsbENvbW1hbmQoKSBvbgotICAgICAqIGNvbXBsZXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAgIGlmIChtVGVtcFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1UZW1wU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVEYXRhc2V0KG1EYXRhRmlsZSk7Ci0gICAgICAgICAgICAgICAgbVRlbXBTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgIG1EYXRhRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIkRETVMiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElTaGVsbE91dHB1dFJlY2VpdmVyIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZmFsc2UgLSBkb24ndCBjYW5jZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBvdXIgY29udHJvbHMgZm9yIHRoZSBVSSBwYW5lbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLSAgICAgICAgdG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIENvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgYnV0dG9ucy5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQotICAgICAgICBtRGlzcGxheU1vZGUgPSBuZXcgQ29tYm8oYnV0dG9ucywgU1dULlBVU0gpOwotICAgICAgICBmb3IgKFN0cmluZyBtb2RlIDogQ0FQVElPTlMpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TW9kZS5hZGQobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbURpc3BsYXlNb2RlLnNlbGVjdChtTW9kZSk7Ci0gICAgICAgIG1EaXNwbGF5TW9kZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbURpc3BsYXlNb2RlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlRGF0YXNldChtRGF0YUZpbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q3VycmVudERldmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZEZyb21EZXZpY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBsb2FkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0VGV4dCgiTG9hZCBmcm9tIEZpbGUiKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGxvYWRCdXR0b24uZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5PUEVOKTsKLSAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldFRleHQoIkxvYWQgYnVncmVwb3J0Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFGaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZURhdGFzZXQobURhdGFGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1GZXRjaEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotICAgICAgICBtRmV0Y2hCdXR0b24uc2V0VGV4dCgiVXBkYXRlIGZyb20gRGV2aWNlIik7Ci0gICAgICAgIG1GZXRjaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUZldGNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZEZyb21EZXZpY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUxhYmVsID0gbmV3IExhYmVsKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBtTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbURhdGFzZXQgPSBuZXcgRGVmYXVsdFBpZURhdGFzZXQoKTsKLSAgICAgICAgSkZyZWVDaGFydCBjaGFydCA9IENoYXJ0RmFjdG9yeS5jcmVhdGVQaWVDaGFydCgiIiwgbURhdGFzZXQsIGZhbHNlCi0gICAgICAgICAgICAgICAgLyogbGVnZW5kICovLCB0cnVlLyogdG9vbHRpcHMgKi8sIGZhbHNlIC8qIHVybHMgKi8pOwotCi0gICAgICAgIENoYXJ0Q29tcG9zaXRlIGNoYXJ0Q29tcG9zaXRlID0gbmV3IENoYXJ0Q29tcG9zaXRlKHRvcCwKLSAgICAgICAgICAgICAgICBTV1QuQk9SREVSLCBjaGFydCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX0hFSUdIVCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX0hFSUdIVCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX01JTklNVU1fRFJBV19XSURUSCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX01JTklNVU1fRFJBV19IRUlHSFQsCi0gICAgICAgICAgICAgICAgMzAwMCwKLSAgICAgICAgICAgICAgICAvLyBtYXggZHJhdyB3aWR0aC4gV2UgZG9uJ3Qgd2FudCBpdCB0byB6b29tLCBzbyB3ZSBwdXQgYSBiaWcgbnVtYmVyCi0gICAgICAgICAgICAgICAgMzAwMCwKLSAgICAgICAgICAgICAgICAvLyBtYXggZHJhdyBoZWlnaHQuIFdlIGRvbid0IHdhbnQgaXQgdG8gem9vbSwgc28gd2UgcHV0IGEgYmlnIG51bWJlcgotICAgICAgICAgICAgICAgIHRydWUsICAvLyBvZmYtc2NyZWVuIGJ1ZmZlcgotICAgICAgICAgICAgICAgIHRydWUsICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHNhdmUKLSAgICAgICAgICAgICAgICB0cnVlLCAgLy8gcHJpbnQKLSAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIHpvb20KLSAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgY2hhcnRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xpZW50Q2hhbmdlZChmaW5hbCBDbGllbnQgY2xpZW50LCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICAvLyBEb24ndCBjYXJlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIG9wZW4gYSBidWdyZXBvcnQgYW5kIHNraXAgdG8gdGhlIHNwZWNpZmllZCBzZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgRmlsZSB0byBvcGVuCi0gICAgICogQHJldHVybiBSZWFkZXIgdG8gYnVncmVwb3J0IGZpbGUKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gb24gZmlsZSBlcnJvcgotICAgICAqLwotICAgIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZ2V0QnVncmVwb3J0UmVhZGVyKEZpbGUgZmlsZSkgdGhyb3dzCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSB1bndhbnRlZCBidWdyZXBvcnQgc2VjdGlvbnMKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZCgiRERNUyIsICJTZXJ2aWNlIG5vdCBmb3VuZCAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxpbmUuc3RhcnRzV2l0aCgiRFVNUCBPRiBTRVJWSUNFICIpIHx8IGxpbmUuc3RhcnRzV2l0aCgiLS0tLS0iKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbGluZS5pbmRleE9mKEJVR1JFUE9SVF9TRUNUSU9OW21Nb2RlXSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSB0aW1lIHN0cmluZyBnZW5lcmF0ZWQgYnkgQmF0dGVyeVN0YXRzLgotICAgICAqIEEgdHlwaWNhbCBuZXctZm9ybWF0IHN0cmluZyBpcyAiMTFkIDEzaCA0NW0gMzlzIDk5OW1zIi4KLSAgICAgKiBBIHR5cGljYWwgb2xkLWZvcm1hdCBzdHJpbmcgaXMgIjEyLjMgc2VjIi4KLSAgICAgKiBAcmV0dXJuIHRpbWUgaW4gbXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlVGltZU1zKFN0cmluZyBzKSB7Ci0gICAgICAgIGxvbmcgdG90YWwgPSAwOwotICAgICAgICAvLyBNYXRjaGVzIGEgc2luZ2xlIGNvbXBvbmVudCBlLmcuICIxMi4zIHNlYyIgb3IgIjQ1bXMiCi0gICAgICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZSgiKFtcXGRcXC5dKylcXHMqKFthLXpdKykiKTsKLSAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKHMpOwotICAgICAgICB3aGlsZSAobS5maW5kKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICBpZiAoInNlYyIuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHRpbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gKGxvbmcpIChEb3VibGUucGFyc2VEb3VibGUobS5ncm91cCgxKSkgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvbmcgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgaWYgKCJkIi5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gdmFsdWUgKiAyNCAqIDYwICogNjAgKiAxMDAwOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiaCIuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgICAgIHRvdGFsICs9IHZhbHVlICogNjAgKiA2MCAqIDEwMDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJtIi5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gdmFsdWUgKiA2MCAqIDEwMDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJzIi5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gdmFsdWUgKiAxMDAwOwotICAgICAgICAgICAgfSBlbHNlIGlmICgibXMiLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB3YWtlbG9jayBpbmZvcm1hdGlvbiBmcm9tIGJ1Z3JlcG9ydC4gVXBkYXRlcyBtRGF0YXNldCB3aXRoIHRoZQotICAgICAqIG5ldyBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIGJyIFJlYWRlciBwcm92aWRpbmcgdGhlIGNvbnRlbnQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9yIHJlYWRpbmcgZmlsZQotICAgICAqLwotICAgIHZvaWQgcmVhZFdha2Vsb2NrRGF0YXNldChCdWZmZXJlZFJlYWRlciBicikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGF0dGVybiBsb2NrUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiV2FrZSBsb2NrIChcXFMrKTogKC4rKSBwYXJ0aWFsIik7Ci0gICAgICAgIFBhdHRlcm4gdG90YWxQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJUb3RhbDogKC4rKSB1cHRpbWUiKTsKLSAgICAgICAgZG91YmxlIHRvdGFsID0gMDsKLSAgICAgICAgYm9vbGVhbiBpbkN1cnJlbnQgPSBmYWxzZTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLnN0YXJ0c1dpdGgoIkRVTVAgT0YgU0VSVklDRSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uZSwgb3IgbW92ZWQgb24gdG8gdGhlIG5leHQgc2VydmljZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiQ3VycmVudCBCYXR0ZXJ5IFVzYWdlIFN0YXRpc3RpY3MiKSkgewotICAgICAgICAgICAgICAgIGluQ3VycmVudCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluQ3VycmVudCkgewotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IGxvY2tQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG0uZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSA9IHBhcnNlVGltZU1zKG0uZ3JvdXAoMikpIC8gMTAwMC47Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKG0uZ3JvdXAoMSksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbSA9IHRvdGFsUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobS5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHBhcnNlVGltZU1zKG0uZ3JvdXAoMSkpIC8gMTAwMC47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvdGFsID4gMCkgewotICAgICAgICAgICAgbURhdGFzZXQuc2V0VmFsdWUoIlVubG9ja2VkIiwgdG90YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGFsYXJtIGluZm9ybWF0aW9uIGZyb20gYnVncmVwb3J0LiBVcGRhdGVzIG1EYXRhc2V0IHdpdGggdGhlIG5ldwotICAgICAqIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnIgUmVhZGVyIHByb3ZpZGluZyB0aGUgY29udGVudAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZXJyb3IgcmVhZGluZyBmaWxlCi0gICAgICovCi0gICAgdm9pZCByZWFkQWxhcm1EYXRhc2V0KEJ1ZmZlcmVkUmVhZGVyIGJyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgLmNvbXBpbGUoIihcXGQrKSBhbGFybXM6IEludGVudCAuKlxcLihbXi4gXSspIGZsYWdzIik7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwgfHwgbGluZS5zdGFydHNXaXRoKCJEVU1QIE9GIFNFUlZJQ0UiKSkgewotICAgICAgICAgICAgICAgIC8vIERvbmUsIG9yIG1vdmVkIG9uIHRvIHRoZSBuZXh0IHNlcnZpY2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgY291bnQgPSBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgbURhdGFzZXQuc2V0VmFsdWUobmFtZSwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGNwdSBsb2FkIGluZm9ybWF0aW9uIGZyb20gYnVncmVwb3J0LiBVcGRhdGVzIG1EYXRhc2V0IHdpdGggdGhlCi0gICAgICogbmV3IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnIgUmVhZGVyIHByb3ZpZGluZyB0aGUgY29udGVudAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZXJyb3IgcmVhZGluZyBmaWxlCi0gICAgICovCi0gICAgdm9pZCByZWFkQ3B1RGF0YXNldChCdWZmZXJlZFJlYWRlciBicikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybgotICAgICAgICAgICAgICAgIC5jb21waWxlKCIoXFxTKyk6IChcXFMrKSUgPSAoLispJSB1c2VyIC4gKC4rKSUga2VybmVsIik7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwgfHwgbGluZS5zdGFydHNXaXRoKCJEVU1QIE9GIFNFUlZJQ0UiKSkgewotICAgICAgICAgICAgICAgIC8vIERvbmUsIG9yIG1vdmVkIG9uIHRvIHRoZSBuZXh0IHNlcnZpY2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkxvYWQ6IikpIHsKLSAgICAgICAgICAgICAgICBtTGFiZWwuc2V0VGV4dChsaW5lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBsb25nIGJvdGggPSBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICBsb25nIHVzZXIgPSBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDMpKTsKLSAgICAgICAgICAgICAgICBsb25nIGtlcm5lbCA9IExvbmcucGFyc2VMb25nKG0uZ3JvdXAoNCkpOwotICAgICAgICAgICAgICAgIGlmICgiVE9UQUwiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm90aCA8IDEwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFzZXQuc2V0VmFsdWUoIklkbGUiLCAoMTAwIC0gYm90aCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1ha2UgZ3JhcGhzIG1vcmUgdXNlZnVsIGV2ZW4gd2l0aCByb3VuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9nIG9mdGVuIGhhcyAwJSB1c2VyICsgMCUga2VybmVsID0gMSUgdG90YWwKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJiaXRyYXJpbHkgZ2l2ZSBleHRyYSB0byBrZXJuZWwKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZShuYW1lICsgIiAodXNlcikiLCB1c2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoa2VybmVsID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFzZXQuc2V0VmFsdWUobmFtZSArICIgKGtlcm5lbCkiICwgYm90aCAtIHVzZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyID09IDAgJiYga2VybmVsID09IDAgJiYgYm90aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKG5hbWUsIGJvdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIG1lbWluZm8gaW5mb3JtYXRpb24gZnJvbSBidWdyZXBvcnQuIFVwZGF0ZXMgbURhdGFzZXQgd2l0aCB0aGUKLSAgICAgKiBuZXcgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiciBSZWFkZXIgcHJvdmlkaW5nIHRoZSBjb250ZW50Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBlcnJvciByZWFkaW5nIGZpbGUKLSAgICAgKi8KLSAgICB2b2lkIHJlYWRNZW1pbmZvRGF0YXNldChCdWZmZXJlZFJlYWRlciBicikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGF0dGVybiB2YWx1ZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXGQrKSBrQiIpOwotICAgICAgICBsb25nIHRvdGFsID0gMDsKLSAgICAgICAgbG9uZyBvdGhlciA9IDA7Ci0gICAgICAgIG1MYWJlbC5zZXRUZXh0KCJQU1MgaW4ga0IiKTsgICAgICAgIAotCi0gICAgICAgIC8vIFNjYW4gbWVtaW5mbwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmaWxlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXRjaGVyIG0gPSB2YWx1ZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIGxvbmcga2IgPSBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJNZW1Ub3RhbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsID0ga2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIk1lbUZyZWUiKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZSgiRnJlZSIsIGtiKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0ga2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIlNsYWIiKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZSgiU2xhYiIsIGtiKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0ga2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIlBhZ2VUYWJsZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZSgiUGFnZVRhYmxlcyIsIGtiKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0ga2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkJ1ZmZlcnMiKSAmJiBrYiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFzZXQuc2V0VmFsdWUoIkJ1ZmZlcnMiLCBrYik7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsIC09IGtiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJJbmFjdGl2ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKCJJbmFjdGl2ZSIsIGtiKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0ga2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIk1lbUZyZWUiKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZSgiRnJlZSIsIGtiKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgLT0ga2I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBTY2FuIHByb2NyYW5rCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCJQUk9DUkFOSyIpID49IDAgfHwgbGluZS5pbmRleE9mKCJQSUQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY3JhbmsgaGVhZGVyCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAgKGxpbmUuaW5kZXhPZigiLS0tLSIpID49IDApIHsKLSAgICAgICAgICAgICAgICAvL2VuZCBvZiBwcm9jcmFuayBzZWN0aW9uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFeHRyYWN0IHBzcyBmaWVsZCBmcm9tIHByb2NyYW5rIG91dHB1dAotICAgICAgICAgICAgbG9uZyBwc3MgPSBMb25nLnBhcnNlTG9uZyhsaW5lLnN1YnN0cmluZygyMywgMzEpLnRyaW0oKSk7Ci0gICAgICAgICAgICBTdHJpbmcgY21kbGluZSA9IGxpbmUuc3Vic3RyaW5nKDQzKS50cmltKCkucmVwbGFjZSgiL3N5c3RlbS9iaW4vIiwgIiIpOwotICAgICAgICAgICAgLy8gQXJiaXRyYXJ5IG1pbmltdW0gc2l6ZSB0byBkaXNwbGF5Ci0gICAgICAgICAgICBpZiAocHNzID4gMjAwMCkgewotICAgICAgICAgICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKGNtZGxpbmUsIHBzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG90aGVyICs9IHBzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsIC09IHBzczsKLSAgICAgICAgfQotICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZSgiT3RoZXIiLCBvdGhlcik7Ci0gICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKCJVbmtub3duIiwgdG90YWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBzeW5jIGluZm9ybWF0aW9uIGZyb20gYnVncmVwb3J0LiBVcGRhdGVzIG1EYXRhc2V0IHdpdGggdGhlIG5ldwotICAgICAqIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnIgUmVhZGVyIHByb3ZpZGluZyB0aGUgY29udGVudAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZXJyb3IgcmVhZGluZyBmaWxlCi0gICAgICovCi0gICAgdm9pZCByZWFkU3luY0RhdGFzZXQoQnVmZmVyZWRSZWFkZXIgYnIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsIHx8IGxpbmUuc3RhcnRzV2l0aCgiRFVNUCBPRiBTRVJWSUNFIikpIHsKLSAgICAgICAgICAgICAgICAvLyBEb25lLCBvciBtb3ZlZCBvbiB0byB0aGUgbmV4dCBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIgfCIpICYmIGxpbmUubGVuZ3RoKCkgPiA3MCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHkgPSBsaW5lLnN1YnN0cmluZygzLCAxOCkudHJpbSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkdXJhdGlvbiA9IGxpbmUuc3Vic3RyaW5nKDYxLCA3MCkudHJpbSgpOwotICAgICAgICAgICAgICAgIC8vIER1cmF0aW9uIGlzIE1NOlNTIG9yIEhIOk1NOlNTIChEYXRlVXRpbHMuZm9ybWF0RWxhcHNlZFRpbWUpCi0gICAgICAgICAgICAgICAgU3RyaW5nIGR1clBhcnRzW10gPSBkdXJhdGlvbi5zcGxpdCgiOiIpOwotICAgICAgICAgICAgICAgIGlmIChkdXJQYXJ0cy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICBsb25nIGR1ciA9IExvbmcucGFyc2VMb25nKGR1clBhcnRzWzBdKSAqIDYwICsgTG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUxvbmcoZHVyUGFydHNbMV0pOwotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldC5zZXRWYWx1ZShhdXRob3JpdHksIGR1cik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbi5sZW5ndGgoKSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgZHVyID0gTG9uZy5wYXJzZUxvbmcoZHVyUGFydHNbMF0pICogMzYwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy5wYXJzZUxvbmcoZHVyUGFydHNbMV0pICogNjAgKyBMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlTG9uZyhkdXJQYXJ0c1syXSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0LnNldFZhbHVlKGF1dGhvcml0eSwgZHVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1RhYmxlSGVscGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1RhYmxlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTU3ZTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9UYWJsZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhlbHAgdXNpbmcgVGFibGUgb2JqZWN0cy4KLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUhlbHBlciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVGFibGVDb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIElmIGEKLSAgICAgKiA8Y29kZT5QcmVmZXJlbmNlU3RvcmU8L2NvZGU+IG9iamVjdCBhbmQgYSBwcmVmZXJlbmNlIGVudHJ5IG5hbWUgU3RyaW5nCi0gICAgICogb2JqZWN0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb2x1bW4gd2lsbCBsaXN0ZW4gdG8gY2hhbmdlIGluIGl0cyB3aWR0aAotICAgICAqIGFuZCB1cGRhdGUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgYWNjb3JkaW5nbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBUYWJsZSBwYXJlbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHN0cmluZwotICAgICAqIEBwYXJhbSBzdHlsZSBUaGUgY29sdW1uIHN0eWxlCi0gICAgICogQHBhcmFtIHNhbXBsZV90ZXh0IEEgc2FtcGxlIHRleHQgdG8gZmlndXJlIG91dCBjb2x1bW4gd2lkdGggaWYgcHJlZmVyZW5jZQotICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgbWlzc2luZwotICAgICAqIEBwYXJhbSBwcmVmX25hbWUgVGhlIHByZWZlcmVuY2UgZW50cnkgbmFtZSBmb3IgY29sdW1uIHdpZHRoCi0gICAgICogQHBhcmFtIHByZWZzIFRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICogQHJldHVybiBUaGUgVGFibGVDb2x1bW4gb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlQ29sdW1uIGNyZWF0ZVRhYmxlQ29sdW1uKFRhYmxlIHBhcmVudCwgU3RyaW5nIGhlYWRlciwKLSAgICAgICAgICAgIGludCBzdHlsZSwgU3RyaW5nIHNhbXBsZV90ZXh0LCBmaW5hbCBTdHJpbmcgcHJlZl9uYW1lLAotICAgICAgICAgICAgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmcykgewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29sdW1uCi0gICAgICAgIFRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBwcmVmIHN0b3JlIG9yIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCB3ZSB1c2UgdGhlIHNhbXBsZQotICAgICAgICAvLyB0ZXh0IGFuZCBwYWNrIHRoZSBjb2x1bW4uCi0gICAgICAgIC8vIE90aGVyd2lzZSB3ZSBqdXN0IHJlYWQgdGhlIHdpZHRoIGZyb20gdGhlIHByZWZzIGFuZCBhcHBseSBpdC4KLSAgICAgICAgaWYgKHByZWZzID09IG51bGwgfHwgcHJlZnMuY29udGFpbnMocHJlZl9uYW1lKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgY29sLnNldFRleHQoc2FtcGxlX3RleHQpOwotICAgICAgICAgICAgY29sLnBhY2soKTsKLQotICAgICAgICAgICAgLy8gaW5pdCB0aGUgcHJlZnMgc3RvcmUgd2l0aCB0aGUgY3VycmVudCB2YWx1ZQotICAgICAgICAgICAgaWYgKHByZWZzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShwcmVmX25hbWUsIGNvbC5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbC5zZXRXaWR0aChwcmVmcy5nZXRJbnQocHJlZl9uYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIGhlYWRlcgotICAgICAgICBjb2wuc2V0VGV4dChoZWFkZXIpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcHJlZiBzdG9yZSBhbmQgYSBwcmVmIGVudHJ5IG5hbWUsIHRoZW4gd2Ugc2V0dXAgYQotICAgICAgICAvLyBsaXN0ZW5lciB0byBjYXRjaCBjb2x1bW4gcmVzaXplIHRvIHB1dCBzdG9yZSB0aGUgbmV3IHdpZHRoIHZhbHVlLgotICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCAmJiBwcmVmX25hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV3IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIGludCB3ID0gKChUYWJsZUNvbHVtbillLndpZGdldCkuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBpbiBwcmVmIHN0b3JlCi0gICAgICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKHByZWZfbmFtZSwgdyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFRyZWVDb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIElmIGEKLSAgICAgKiA8Y29kZT5QcmVmZXJlbmNlU3RvcmU8L2NvZGU+IG9iamVjdCBhbmQgYSBwcmVmZXJlbmNlIGVudHJ5IG5hbWUgU3RyaW5nCi0gICAgICogb2JqZWN0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb2x1bW4gd2lsbCBsaXN0ZW4gdG8gY2hhbmdlIGluIGl0cyB3aWR0aAotICAgICAqIGFuZCB1cGRhdGUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgYWNjb3JkaW5nbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBUYWJsZSBwYXJlbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHN0cmluZwotICAgICAqIEBwYXJhbSBzdHlsZSBUaGUgY29sdW1uIHN0eWxlCi0gICAgICogQHBhcmFtIHNhbXBsZV90ZXh0IEEgc2FtcGxlIHRleHQgdG8gZmlndXJlIG91dCBjb2x1bW4gd2lkdGggaWYgcHJlZmVyZW5jZQotICAgICAqICAgICAgICAgICAgdmFsdWUgaXMgbWlzc2luZwotICAgICAqIEBwYXJhbSBwcmVmX25hbWUgVGhlIHByZWZlcmVuY2UgZW50cnkgbmFtZSBmb3IgY29sdW1uIHdpZHRoCi0gICAgICogQHBhcmFtIHByZWZzIFRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRyZWVDb2x1bW4oVHJlZSBwYXJlbnQsIFN0cmluZyBoZWFkZXIsIGludCBzdHlsZSwKLSAgICAgICAgICAgIFN0cmluZyBzYW1wbGVfdGV4dCwgZmluYWwgU3RyaW5nIHByZWZfbmFtZSwKLSAgICAgICAgICAgIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZnMpIHsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbHVtbgotICAgICAgICBUcmVlQ29sdW1uIGNvbCA9IG5ldyBUcmVlQ29sdW1uKHBhcmVudCwgc3R5bGUpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHByZWYgc3RvcmUgb3IgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIHdlIHVzZSB0aGUgc2FtcGxlCi0gICAgICAgIC8vIHRleHQgYW5kIHBhY2sgdGhlIGNvbHVtbi4KLSAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGp1c3QgcmVhZCB0aGUgd2lkdGggZnJvbSB0aGUgcHJlZnMgYW5kIGFwcGx5IGl0LgotICAgICAgICBpZiAocHJlZnMgPT0gbnVsbCB8fCBwcmVmcy5jb250YWlucyhwcmVmX25hbWUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBjb2wuc2V0VGV4dChzYW1wbGVfdGV4dCk7Ci0gICAgICAgICAgICBjb2wucGFjaygpOwotCi0gICAgICAgICAgICAvLyBpbml0IHRoZSBwcmVmcyBzdG9yZSB3aXRoIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKHByZWZfbmFtZSwgY29sLmdldFdpZHRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29sLnNldFdpZHRoKHByZWZzLmdldEludChwcmVmX25hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgaGVhZGVyCi0gICAgICAgIGNvbC5zZXRUZXh0KGhlYWRlcik7Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBwcmVmIHN0b3JlIGFuZCBhIHByZWYgZW50cnkgbmFtZSwgdGhlbiB3ZSBzZXR1cCBhCi0gICAgICAgIC8vIGxpc3RlbmVyIHRvIGNhdGNoIGNvbHVtbiByZXNpemUgdG8gcHV0IHN0b3JlIHRoZSBuZXcgd2lkdGggdmFsdWUuCi0gICAgICAgIGlmIChwcmVmcyAhPSBudWxsICYmIHByZWZfbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb2wuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgaW50IHcgPSAoKFRyZWVDb2x1bW4pZS53aWRnZXQpLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgaW4gcHJlZiBzdG9yZQotICAgICAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShwcmVmX25hbWUsIHcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVHJlZUNvbHVtbiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gSWYgYQotICAgICAqIDxjb2RlPlByZWZlcmVuY2VTdG9yZTwvY29kZT4gb2JqZWN0IGFuZCBhIHByZWZlcmVuY2UgZW50cnkgbmFtZSBTdHJpbmcKLSAgICAgKiBvYmplY3QgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvbHVtbiB3aWxsIGxpc3RlbiB0byBjaGFuZ2UgaW4gaXRzIHdpZHRoCi0gICAgICogYW5kIHVwZGF0ZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhY2NvcmRpbmdseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFRhYmxlIHBhcmVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgc3RyaW5nCi0gICAgICogQHBhcmFtIHN0eWxlIFRoZSBjb2x1bW4gc3R5bGUKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gaWYgdGhlIHByZWZlcmVuY2UgdmFsdWUgaXMgbWlzc2luZwotICAgICAqIEBwYXJhbSBwcmVmX25hbWUgVGhlIHByZWZlcmVuY2UgZW50cnkgbmFtZSBmb3IgY29sdW1uIHdpZHRoCi0gICAgICogQHBhcmFtIHByZWZzIFRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRyZWVDb2x1bW4oVHJlZSBwYXJlbnQsIFN0cmluZyBoZWFkZXIsIGludCBzdHlsZSwKLSAgICAgICAgICAgIGludCB3aWR0aCwgZmluYWwgU3RyaW5nIHByZWZfbmFtZSwKLSAgICAgICAgICAgIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZnMpIHsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbHVtbgotICAgICAgICBUcmVlQ29sdW1uIGNvbCA9IG5ldyBUcmVlQ29sdW1uKHBhcmVudCwgc3R5bGUpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHByZWYgc3RvcmUgb3IgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIHdlIHVzZSB0aGUgc2FtcGxlCi0gICAgICAgIC8vIHRleHQgYW5kIHBhY2sgdGhlIGNvbHVtbi4KLSAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGp1c3QgcmVhZCB0aGUgd2lkdGggZnJvbSB0aGUgcHJlZnMgYW5kIGFwcGx5IGl0LgotICAgICAgICBpZiAocHJlZnMgPT0gbnVsbCB8fCBwcmVmcy5jb250YWlucyhwcmVmX25hbWUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBjb2wuc2V0V2lkdGgod2lkdGgpOwotCi0gICAgICAgICAgICAvLyBpbml0IHRoZSBwcmVmcyBzdG9yZSB3aXRoIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKHByZWZfbmFtZSwgd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29sLnNldFdpZHRoKHByZWZzLmdldEludChwcmVmX25hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgaGVhZGVyCi0gICAgICAgIGNvbC5zZXRUZXh0KGhlYWRlcik7Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBwcmVmIHN0b3JlIGFuZCBhIHByZWYgZW50cnkgbmFtZSwgdGhlbiB3ZSBzZXR1cCBhCi0gICAgICAgIC8vIGxpc3RlbmVyIHRvIGNhdGNoIGNvbHVtbiByZXNpemUgdG8gcHV0IHN0b3JlIHRoZSBuZXcgd2lkdGggdmFsdWUuCi0gICAgICAgIGlmIChwcmVmcyAhPSBudWxsICYmIHByZWZfbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb2wuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgaW50IHcgPSAoKFRyZWVDb2x1bW4pZS53aWRnZXQpLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgaW4gcHJlZiBzdG9yZQotICAgICAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShwcmVmX25hbWUsIHcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9UYWJsZVBhbmVsLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1RhYmxlUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzNzE5My4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1RhYmxlUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklUYWJsZUZvY3VzTGlzdGVuZXIuSUZvY3VzZWRUYWJsZUFjdGl2YXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHBhbmVsIGNvbnRhaW5pbmcgVGFibGUgdGhhdCBuZWVkIHRvIHN1cHBvcnQgY29weS1wYXN0ZS1zZWxlY3RBbGwKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhYmxlUGFuZWwgZXh0ZW5kcyBDbGllbnREaXNwbGF5UGFuZWwgewotICAgIHByaXZhdGUgSVRhYmxlRm9jdXNMaXN0ZW5lciBtR2xvYmFsTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgVGFibGVGb2N1c0xpc3RlbmVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBvbmUgb2YgdGhlIHRhYmxlcwotICAgICAqIGdldHMgb3IgbG9zZXMgZm9jdXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUYWJsZUZvY3VzTGlzdGVuZXIoSVRhYmxlRm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIGdsb2JhbCBsaXN0ZW5lciwgdG8gbWFrZSBzdXJlIHRhYmxlIGNyZWF0ZWQgYWZ0ZXIKLSAgICAgICAgLy8gdGhpcyBjYWxsIHdpbGwgc3RpbGwgYmUgc2V0dXAuCi0gICAgICAgIG1HbG9iYWxMaXN0ZW5lciA9IGxpc3RlbmVyOwotCi0gICAgICAgIHNldFRhYmxlRm9jdXNMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIFRhYmxlIG9mIG9iamVjdCBvZiB0aGUgcGFuZWwgdG8gd29yayB3aXRoIHRoZSBnbG9iYWwgbGlzdGVuZXIuPGJyPgotICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRhYmxlRm9jdXNMaXN0ZW5lcigpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgYSBUYWJsZSBvYmplY3QgdG8gbm90aWZ5IHRoZSBnbG9iYWwgVGFibGUgRm9jdXMgbGlzdGVuZXIgd2hlbiBpdAotICAgICAqIGdldHMgb3IgbG9zZXMgdGhlIGZvY3VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhYmxlIHRoZSBUYWJsZSBvYmplY3QuCi0gICAgICogQHBhcmFtIGNvbFN0YXJ0Ci0gICAgICogQHBhcmFtIGNvbEVuZAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFRhYmxlVG9Gb2N1c0xpc3RlbmVyKGZpbmFsIFRhYmxlIHRhYmxlLAotICAgICAgICAgICAgZmluYWwgaW50IGNvbFN0YXJ0LCBmaW5hbCBpbnQgY29sRW5kKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0aXZhdG9yIGZvciB0aGlzIHRhYmxlCi0gICAgICAgIGZpbmFsIElGb2N1c2VkVGFibGVBY3RpdmF0b3IgYWN0aXZhdG9yID0gbmV3IElGb2N1c2VkVGFibGVBY3RpdmF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb3B5KENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNvcnQgdGhlIGl0ZW1zIHRvIGJlIHN1cmUuCi0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoc2VsZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgIC8vIGFsbCBsaW5lcyBtdXN0IGJlIGNvbmNhdGVuYXRlZC4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgICAgIC8vIGxvb3Agb24gdGhlIHNlbGVjdGlvbiBhbmQgb3V0cHV0IHRoZSBmaWxlLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgOiBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gY29sU3RhcnQgOyBjIDw9IGNvbEVuZCA7IGMrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGl0ZW0uZ2V0VGV4dChjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1x0Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhhdCB0byB0aGUgY2xpcGJvYXJkIGlmIHRoZSBzdHJpbmcgaGFzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0Q29udGVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZGF0YSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICAgICAgdGFibGUuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBmb2N1cyBsaXN0ZW5lciBvbiB0aGUgdGFibGUgdG8gbm90aWZ5IHRoZSBnbG9iYWwgbGlzdGVuZXIKLSAgICAgICAgdGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1HbG9iYWxMaXN0ZW5lci5mb2N1c0dhaW5lZChhY3RpdmF0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUdsb2JhbExpc3RlbmVyLmZvY3VzTG9zdChhY3RpdmF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIGEgVGFibGUgb2JqZWN0IHRvIG5vdGlmeSB0aGUgZ2xvYmFsIFRhYmxlIEZvY3VzIGxpc3RlbmVyIHdoZW4gaXQKLSAgICAgKiBnZXRzIG9yIGxvc2VzIHRoZSBmb2N1cy48YnI+Ci0gICAgICogV2hlbiB0aGUgY29weSBtZXRob2QgaXMgaW52b2tlZCwgYWxsIGNvbHVtbnMgYXJlIHB1dCBpbiB0aGUgY2xpcGJvYXJkLCBzZXBhcmF0ZWQKLSAgICAgKiBieSB0YWJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIFRhYmxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihmaW5hbCBUYWJsZSB0YWJsZSkgewotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcih0YWJsZSwgMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKS0xKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvVGhyZWFkUGFuZWwuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvVGhyZWFkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZDRmMy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL1RocmVhZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5UaHJlYWRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSUNsaWVudENoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3Igb3VyIGluZm9ybWF0aW9uIHBhbmVscy4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZFBhbmVsIGV4dGVuZHMgVGFibGVQYW5lbCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1RIUkVBRF9DT0xfSUQgPSAidGhyZWFkUGFuZWwuQ29sMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfVEhSRUFEX0NPTF9USUQgPSAidGhyZWFkUGFuZWwuQ29sMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfVEhSRUFEX0NPTF9TVEFUVVMgPSAidGhyZWFkUGFuZWwuQ29sMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfVEhSRUFEX0NPTF9VVElNRSA9ICJ0aHJlYWRQYW5lbC5Db2wzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19USFJFQURfQ09MX1NUSU1FID0gInRocmVhZFBhbmVsLkNvbDQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1RIUkVBRF9DT0xfTkFNRSA9ICJ0aHJlYWRQYW5lbC5Db2w1IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19USFJFQURfU0FTSCA9ICJ0aHJlYWRQYW5lbC5zYXNoIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQUNLX0NPTF9DTEFTUyA9ICJ0aHJlYWRQYW5lbC5zdGFjay5jb2wwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19TVEFDS19DT0xfTUVUSE9EID0gInRocmVhZFBhbmVsLnN0YWNrLmNvbDEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQUNLX0NPTF9GSUxFID0gInRocmVhZFBhbmVsLnN0YWNrLmNvbDIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQUNLX0NPTF9MSU5FID0gInRocmVhZFBhbmVsLnN0YWNrLmNvbDMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX1NUQUNLX0NPTF9OQVRJVkUgPSAidGhyZWFkUGFuZWwuc3RhY2suY29sNCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUJhc2U7Ci0gICAgcHJpdmF0ZSBMYWJlbCBtTm90RW5hYmxlZDsKLSAgICBwcml2YXRlIExhYmVsIG1Ob3RTZWxlY3RlZDsKLSAgICAKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtVGhyZWFkQmFzZTsKLSAgICBwcml2YXRlIFRhYmxlIG1UaHJlYWRUYWJsZTsKLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIG1UaHJlYWRWaWV3ZXI7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtU3RhY2tUcmFjZUJhc2U7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVJlZnJlc2hTdGFja1RyYWNlQnV0dG9uOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YWNrVHJhY2VUaW1lTGFiZWw7Ci0gICAgcHJpdmF0ZSBTdGFja1RyYWNlUGFuZWwgbVN0YWNrVHJhY2VQYW5lbDsKLSAgICBwcml2YXRlIFRhYmxlIG1TdGFja1RyYWNlVGFibGU7Ci0KLSAgICAvKiogSW5kaWNhdGVzIGlmIGEgdGltZXItYmFzZWQgUnVubmFibGUgaXMgY3VycmVudCByZXF1ZXN0aW5nIHRocmVhZCB1cGRhdGVzIHJlZ3VsYXJseS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU11c3RTdG9wUmVjdXJyaW5nVGhyZWFkVXBkYXRlID0gZmFsc2U7Ci0gICAgLyoqIEZsYWcgdG8gdGVsbCB0aGUgcmVjdXJyaW5nIHRocmVhZCB1cGRhdGUgdG8gc3RvcCBydW5uaW5nICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZWN1cnJpbmdUaHJlYWRVcGRhdGVSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRIUkVBRF9TVEFUVVMgPSB7Ci0gICAgICAgICJ6b21iaWUiLCAicnVubmluZyIsICJ0aW1lZC13YWl0IiwgIm1vbml0b3IiLAotICAgICAgICAid2FpdCIsICJpbml0IiwgInN0YXJ0IiwgIm5hdGl2ZSIsICJ2bXdhaXQiCi0gICAgfTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb250ZW50IFByb3ZpZGVyIHRvIGRpc3BsYXkgdGhlIHRocmVhZHMgb2YgYSBjbGllbnQuCi0gICAgICogRXhwZWN0ZWQgaW5wdXQgaXMgYSB7QGxpbmsgQ2xpZW50fSBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGhyZWFkQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENsaWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKENsaWVudClpbnB1dEVsZW1lbnQpLmdldENsaWVudERhdGEoKS5nZXRUaHJlYWRzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogQSBMYWJlbCBQcm92aWRlciB0byB1c2Ugd2l0aCB7QGxpbmsgVGhyZWFkQ29udGVudFByb3ZpZGVyfS4gSXQgZXhwZWN0cyB0aGUgZWxlbWVudHMgdG8gYmUKLSAgICAgKiBvZiB0eXBlIHtAbGluayBUaHJlYWRJbmZvfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUaHJlYWRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIFRocmVhZEluZm8gdGhyZWFkID0gKFRocmVhZEluZm8pZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhyZWFkLmlzRGFlbW9uKCkgPyAiKiIgOiAiIikgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZih0aHJlYWQuZ2V0VGhyZWFkSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0aHJlYWQuZ2V0VGlkKCkpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkLmdldFN0YXR1cygpID49IDAgJiYgdGhyZWFkLmdldFN0YXR1cygpIDwgVEhSRUFEX1NUQVRVUy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRIUkVBRF9TVEFUVVNbdGhyZWFkLmdldFN0YXR1cygpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0aHJlYWQuZ2V0VXRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0aHJlYWQuZ2V0U3RpbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJlYWQuZ2V0VGhyZWFkTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBvdXIgY29udHJvbChzKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbURpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgbUJhc2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtQmFzZS5zZXRMYXlvdXQobmV3IFN0YWNrTGF5b3V0KCkpOwotCi0gICAgICAgIC8vIFVJIGZvciB0aHJlYWQgbm90IGVuYWJsZWQKLSAgICAgICAgbU5vdEVuYWJsZWQgPSBuZXcgTGFiZWwobUJhc2UsIFNXVC5DRU5URVIgfCBTV1QuV1JBUCk7Ci0gICAgICAgIG1Ob3RFbmFibGVkLnNldFRleHQoIlRocmVhZCB1cGRhdGVzIG5vdCBlbmFibGVkIGZvciBzZWxlY3RlZCBjbGllbnRcbiIKLSAgICAgICAgICAgICsgIih1c2UgdG9vbGJhciBidXR0b24gdG8gZW5hYmxlKSIpOwotCi0gICAgICAgIC8vIFVJIGZvciBub3QgY2xpZW50IHNlbGVjdGVkCi0gICAgICAgIG1Ob3RTZWxlY3RlZCA9IG5ldyBMYWJlbChtQmFzZSwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLSAgICAgICAgbU5vdFNlbGVjdGVkLnNldFRleHQoIm5vIGNsaWVudCBpcyBzZWxlY3RlZCIpOwotCi0gICAgICAgIC8vIGJhc2UgY29tcG9zaXRlIGZvciBzZWxlY3RlZCBjbGllbnQgd2l0aCBlbmFibGVkIHRocmVhZCB1cGRhdGUuCi0gICAgICAgIG1UaHJlYWRCYXNlID0gbmV3IENvbXBvc2l0ZShtQmFzZSwgU1dULk5PTkUpOwotICAgICAgICBtVGhyZWFkQmFzZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0YWJsZSBhYm92ZSB0aGUgc2FzaAotICAgICAgICBtVGhyZWFkVGFibGUgPSBuZXcgVGFibGUobVRocmVhZEJhc2UsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIG1UaHJlYWRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVGhyZWFkVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZSwKLSAgICAgICAgICAgICAgICAiSUQiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAiODg4IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX1RIUkVBRF9DT0xfSUQsIHN0b3JlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbigKLSAgICAgICAgICAgICAgICBtVGhyZWFkVGFibGUsCi0gICAgICAgICAgICAgICAgIlRpZCIsCi0gICAgICAgICAgICAgICAgU1dULlJJR0hULAotICAgICAgICAgICAgICAgICI4ODg4OCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19USFJFQURfQ09MX1RJRCwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAidGltZWQtd2FpdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBQUkVGU19USFJFQURfQ09MX1NUQVRVUywgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZSwKLSAgICAgICAgICAgICAgICAidXRpbWUiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAidXRpbWUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfVEhSRUFEX0NPTF9VVElNRSwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZSwKLSAgICAgICAgICAgICAgICAic3RpbWUiLAotICAgICAgICAgICAgICAgIFNXVC5SSUdIVCwKLSAgICAgICAgICAgICAgICAidXRpbWUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUFJFRlNfVEhSRUFEX0NPTF9TVElNRSwgc3RvcmUpOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZSwKLSAgICAgICAgICAgICAgICAiTmFtZSIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuY2xhc3MuUmVhbGx5TG9uZ0NsYXNzTmFtZS5NZXRob2ROYW1lIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFBSRUZTX1RIUkVBRF9DT0xfTkFNRSwgc3RvcmUpOwotICAgICAgICAKLSAgICAgICAgbVRocmVhZFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihtVGhyZWFkVGFibGUpOwotICAgICAgICBtVGhyZWFkVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGhyZWFkQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBtVGhyZWFkVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRocmVhZExhYmVsUHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgbVRocmVhZFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFRocmVhZEluZm8gc2VsZWN0ZWRUaHJlYWQgPSBnZXRUaHJlYWRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVRocmVhZFN0YWNrVHJhY2Uoc2VsZWN0ZWRUaHJlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbVRocmVhZFZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWRJbmZvIHNlbGVjdGVkVGhyZWFkID0gZ2V0VGhyZWFkU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnQgY2xpZW50ID0gKENsaWVudCltVGhyZWFkVmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZXF1ZXN0VGhyZWFkU3RhY2tUcmFjZShzZWxlY3RlZFRocmVhZC5nZXRUaHJlYWRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0aGUgc2VwYXJhdGluZyBzYXNoCi0gICAgICAgIGZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKG1UaHJlYWRCYXNlLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIENvbG9yIGRhcmtHcmF5ID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKTsKLSAgICAgICAgc2FzaC5zZXRCYWNrZ3JvdW5kKGRhcmtHcmF5KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRoZSBVSSBiZWxvdyB0aGUgc2FzaAotICAgICAgICBtU3RhY2tUcmFjZUJhc2UgPSBuZXcgQ29tcG9zaXRlKG1UaHJlYWRCYXNlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TdGFja1RyYWNlQmFzZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotICAgICAgICBtUmVmcmVzaFN0YWNrVHJhY2VCdXR0b24gPSBuZXcgQnV0dG9uKG1TdGFja1RyYWNlQmFzZSwgU1dULlBVU0gpOwotICAgICAgICBtUmVmcmVzaFN0YWNrVHJhY2VCdXR0b24uc2V0VGV4dCgiUmVmcmVzaCIpOwotICAgICAgICBtUmVmcmVzaFN0YWNrVHJhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWRJbmZvIHNlbGVjdGVkVGhyZWFkID0gZ2V0VGhyZWFkU2VsZWN0aW9uKG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRocmVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsaWVudCBjdXJyZW50Q2xpZW50ID0gZ2V0Q3VycmVudENsaWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xpZW50LnJlcXVlc3RUaHJlYWRTdGFja1RyYWNlKHNlbGVjdGVkVGhyZWFkLmdldFRocmVhZElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG1TdGFja1RyYWNlVGltZUxhYmVsID0gbmV3IExhYmVsKG1TdGFja1RyYWNlQmFzZSwgU1dULk5PTkUpOwotICAgICAgICBtU3RhY2tUcmFjZVRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsID0gbmV3IFN0YWNrVHJhY2VQYW5lbCgpOwotICAgICAgICBtU3RhY2tUcmFjZVRhYmxlID0gbVN0YWNrVHJhY2VQYW5lbC5jcmVhdGVQYW5lbChtU3RhY2tUcmFjZUJhc2UsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0NMQVNTLAotICAgICAgICAgICAgICAgIFBSRUZTX1NUQUNLX0NPTF9NRVRIT0QsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0ZJTEUsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX0xJTkUsCi0gICAgICAgICAgICAgICAgUFJFRlNfU1RBQ0tfQ09MX05BVElWRSwKLSAgICAgICAgICAgICAgICBzdG9yZSk7Ci0gICAgICAgIAotICAgICAgICBHcmlkRGF0YSBnZDsKLSAgICAgICAgbVN0YWNrVHJhY2VUYWJsZS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgc2V0dXAgdGhlIHNhc2guCi0gICAgICAgIC8vIGZvcm0gbGF5b3V0IGRhdGEKLSAgICAgICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0gICAgICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICAgICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgICAgICBtVGhyZWFkVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCAmJiBzdG9yZS5jb250YWlucyhQUkVGU19USFJFQURfU0FTSCkpIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBzdG9yZS5nZXRJbnQoUFJFRlNfVEhSRUFEX1NBU0gpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwwKTsgLy8gNTAlIGFjcm9zcwotICAgICAgICB9Ci0gICAgICAgIHNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgICAgIHNhc2hEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIHNhc2guc2V0TGF5b3V0RGF0YShzYXNoRGF0YSk7Ci0KLSAgICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgICAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLSAgICAgICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICAgICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgICAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgICAgIG1TdGFja1RyYWNlQmFzZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIGFsbG93IHJlc2l6ZXMsIGJ1dCBjYXAgYXQgbWluUGFuZWxXaWR0aAotICAgICAgICBzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc2FzaFJlY3QgPSBzYXNoLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBwYW5lbFJlY3QgPSBtVGhyZWFkQmFzZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IHBhbmVsUmVjdC5oZWlnaHQgLSBzYXNoUmVjdC5oZWlnaHQgLSAxMDA7Ci0gICAgICAgICAgICAgICAgZS55ID0gTWF0aC5tYXgoTWF0aC5taW4oZS55LCBib3R0b20pLCAxMDApOwotICAgICAgICAgICAgICAgIGlmIChlLnkgIT0gc2FzaFJlY3QueSkgewotICAgICAgICAgICAgICAgICAgICBzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgZS55KTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0VmFsdWUoUFJFRlNfVEhSRUFEX1NBU0gsIGUueSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJlYWRCYXNlLmxheW91dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgKChTdGFja0xheW91dCltQmFzZS5nZXRMYXlvdXQoKSkudG9wQ29udHJvbCA9IG1Ob3RTZWxlY3RlZDsKLQotICAgICAgICByZXR1cm4gbUJhc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBwcm9wZXIgY29udHJvbCBpbnNpZGUgdGhlIHBhbmVsLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtVGhyZWFkVGFibGUuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXhpc3RpbmcgY2xpZW50IGluZm9ybWF0aW9uIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSB1cGRhdGVkIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgYml0IG1hc2sgZGVzY3JpYmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLiBJdCBjYW4gY29udGFpbgotICAgICAqIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoge0BsaW5rIENsaWVudCNDSEFOR0VfSU5GT30sIHtAbGluayBDbGllbnQjQ0hBTkdFX05BTUV9Ci0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfREVCVUdHRVJfU1RBVFVTfSwge0BsaW5rIENsaWVudCNDSEFOR0VfVEhSRUFEX01PREV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9IRUFQX0RBVEF9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9OQVRJVkVfSEVBUF9EQVRBfQotICAgICAqCi0gICAgICogQHNlZSBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGllbnRDaGFuZ2VkKGZpbmFsIENsaWVudCBjbGllbnQsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIGlmIChjbGllbnQgPT0gZ2V0Q3VycmVudENsaWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoKGNoYW5nZU1hc2sgJiBDbGllbnQuQ0hBTkdFX1RIUkVBRF9NT0RFKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9USFJFQURfREFUQSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTZWxlY3RlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3aWRnZXQgaXMgZGlzcG9zZWQsIHdlIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9USFJFQURfU1RBQ0tUUkFDRSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUYWJsZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaHJlYWRTdGFja0NhbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lkZ2V0IGlzIGRpc3Bvc2VkLCB3ZSBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IGRldmljZSBpcyBzZWxlY3RlZC4gVGhlIG5ldyBkZXZpY2UgY2FuIGJlIGFjY2Vzc2VkCi0gICAgICogd2l0aCB7QGxpbmsgI2dldEN1cnJlbnREZXZpY2UoKX0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGV2aWNlU2VsZWN0ZWQoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgY2xpZW50IGlzIHNlbGVjdGVkLiBUaGUgbmV3IGNsaWVudCBjYW4gYmUgYWNjZXNzZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0Q3VycmVudENsaWVudCgpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRTZWxlY3RlZCgpIHsKLSAgICAgICAgaWYgKG1UaHJlYWRUYWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgIAotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsLnNldEN1cnJlbnRDbGllbnQoY2xpZW50KTsKLQotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghY2xpZW50LmlzVGhyZWFkVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgKChTdGFja0xheW91dCltQmFzZS5nZXRMYXlvdXQoKSkudG9wQ29udHJvbCA9IG1Ob3RFbmFibGVkOwotICAgICAgICAgICAgICAgIG1UaHJlYWRWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IHVwZGF0aW5nIHRoZSB0aHJlYWQsIHN0b3AgZG9pbmcgaXQuCi0gICAgICAgICAgICAgICAgbU11c3RTdG9wUmVjdXJyaW5nVGhyZWFkVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKChTdGFja0xheW91dCltQmFzZS5nZXRMYXlvdXQoKSkudG9wQ29udHJvbCA9IG1UaHJlYWRCYXNlOwotICAgICAgICAgICAgICAgIG1UaHJlYWRWaWV3ZXIuc2V0SW5wdXQoY2xpZW50KTsKLQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVwZGF0aW5nIHdlIHN0YXJ0IHRoZSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVjdXJyaW5nVGhyZWFkVXBkYXRlUnVubmluZyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZWN1cnJpbmdUaHJlYWRVcGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTXVzdFN0b3BSZWN1cnJpbmdUaHJlYWRVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlcmUncyBhIHJ1bm5hYmxlIHRoYXQncyBzdGlsbCBnb2luZyB0byBnZXQgY2FsbGVkLCBsZXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbHkgY2FuY2VsIHRoZSBzdG9wLCBhbmQga2VlcCBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgbU11c3RTdG9wUmVjdXJyaW5nVGhyZWFkVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAoKFN0YWNrTGF5b3V0KW1CYXNlLmdldExheW91dCgpKS50b3BDb250cm9sID0gbU5vdFNlbGVjdGVkOwotICAgICAgICAgICAgbVRocmVhZFZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CYXNlLmxheW91dCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBzdGFjayBjYWxsIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIDxiPm11c3Q8L2I+IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRocmVhZFN0YWNrQ2FsbCgpIHsKLSAgICAgICAgQ2xpZW50IGNsaWVudCA9IGdldEN1cnJlbnRDbGllbnQoKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBUaHJlYWRUYWJsZQotICAgICAgICAgICAgVGhyZWFkSW5mbyBzZWxlY3RlZFRocmVhZCA9IGdldFRocmVhZFNlbGVjdGlvbihudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVUaHJlYWRTdGFja1RyYWNlKHNlbGVjdGVkVGhyZWFkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGhyZWFkU3RhY2tUcmFjZShudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB1cGRhdGVzIHRoZSBzdGFja2NhbGwgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQuIElmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBVSSBpcyBlbXB0aWVkCi0gICAgICogb2YgY3VycmVudCBkYXRhLgotICAgICAqIEBwYXJhbSB0aHJlYWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGhyZWFkU3RhY2tUcmFjZShUaHJlYWRJbmZvIHRocmVhZCkgewotICAgICAgICBtU3RhY2tUcmFjZVBhbmVsLnNldFZpZXdlcklucHV0KHRocmVhZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZWZyZXNoU3RhY2tUcmFjZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbG9uZyBzdGFja2NhbGxUaW1lID0gdGhyZWFkLmdldFN0YWNrQ2FsbFRpbWUoKTsKLSAgICAgICAgICAgIGlmIChzdGFja2NhbGxUaW1lICE9IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBuZXcgRGF0ZShzdGFja2NhbGxUaW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlVGltZUxhYmVsLnNldFRleHQobGFiZWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhY2tUcmFjZVRpbWVMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJlZnJlc2hTdGFja1RyYWNlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtU3RhY2tUcmFjZVRpbWVMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVGb2N1c0xpc3RlbmVyKCkgewotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihtVGhyZWFkVGFibGUpOwotICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihtU3RhY2tUcmFjZVRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSByZWN1cnJpbmcgZXZlbnRzLiBXZSB1c2UgYSBzaG9ydGVyICJpbml0aWFsV2FpdCIgc28gd2UgZG8gdGhlCi0gICAgICogZmlyc3QgZXhlY3V0aW9uIHNvb25lci4gV2UgZG9uJ3QgZG8gaXQgaW1tZWRpYXRlbHkgYmVjYXVzZSB3ZSB3YW50IHRvCi0gICAgICogZ2l2ZSB0aGUgY2xpZW50cyBhIGNoYW5jZSB0byBnZXQgc2V0IHVwLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydFJlY3VycmluZ1RocmVhZFVwZGF0ZSgpIHsKLSAgICAgICAgbVJlY3VycmluZ1RocmVhZFVwZGF0ZVJ1bm5pbmcgPSB0cnVlOwotICAgICAgICBpbnQgaW5pdGlhbFdhaXQgPSAxMDAwOwotCi0gICAgICAgIG1EaXNwbGF5LnRpbWVyRXhlYyhpbml0aWFsV2FpdCwgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBjaGVjayB3ZSBzdGlsbCB3YW50IHVwZGF0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXVzdFN0b3BSZWN1cnJpbmdUaHJlYWRVcGRhdGUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCBjbGllbnQgPSBnZXRDdXJyZW50Q2xpZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucmVxdWVzdFRocmVhZFVwZGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXkudGltZXJFeGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGRtVWlQcmVmZXJlbmNlcy5nZXRUaHJlYWRSZWZyZXNoSW50ZXJ2YWwoKSAqIDEwMDAsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgQ2xpZW50LCB3aGljaCBtZWFucyB0aGUgcnVubmFibGUgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ29pbmcgdG8gYmUgY2FsbGVkIHRocm91Z2ggdGhlIHRpbWVyLiBXZSByZXNldCB0aGUgcnVubmluZyBmbGFnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWN1cnJpbmdUaHJlYWRVcGRhdGVSdW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGFjdHVhbGx5IHN0b3BzIChkb24ndCBjYWxsIHRoZSB0aW1lckV4ZWMpIGFuZCByZXNldCB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVjdXJyaW5nVGhyZWFkVXBkYXRlUnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbU11c3RTdG9wUmVjdXJyaW5nVGhyZWFkVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRocmVhZCBzZWxlY3Rpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKiBJZiBhIHtAbGluayBJU2VsZWN0aW9ufSBvYmplY3QgaXMgc3BlY2lmaWVkLCB0aGUgZmlyc3Qge0BsaW5rIFRocmVhZEluZm99IGZyb20gdGhpcyBzZWxlY3Rpb24KLSAgICAgKiBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlLCB0aGUgPGNvZGU+SVNlbGVjdGlvbjwvY29kZT4gcmV0dXJuZWQgYnkKLSAgICAgKiB7QGxpbmsgVGFibGVWaWV3ZXIjZ2V0U2VsZWN0aW9uKCl9IGlzIHVzZWQuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUge0BsaW5rIElTZWxlY3Rpb259IHRvIHVzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRocmVhZEluZm8gZ2V0VGhyZWFkU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VsZWN0aW9uID0gbVRocmVhZFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRocmVhZEluZm8pb2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9hY3Rpb25zL0lDb21tb25BY3Rpb24uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvYWN0aW9ucy9JQ29tbW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmI4NzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9hY3Rpb25zL0lDb21tb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmFjdGlvbnM7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgYmFzaWMgYWN0aW9uIGhhbmRsaW5nLiBUaGlzIGFsbG93cyB0aGUgY29tbW9uIHVpCi0gKiBjb21wb25lbnRzIHRvIGFjY2VzcyBUb29sSXRlbSBvciBBY3Rpb24gdGhlIHNhbWUgd2F5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25BY3Rpb24gewotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBhY3Rpb24uCi0gICAgICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlLCBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBkaXNhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0dXMgb2YgdGhpcyBhY3Rpb24uCi0gICAgICogQHBhcmFtIGNoZWNrZWQgdGhlIG5ldyBjaGVja2VkIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgUnVubmFibGV9IHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBhY3Rpb24gaXMgdHJpZ2dlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bm5hYmxlKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9hY3Rpb25zL1Rvb2xJdGVtQWN0aW9uLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2FjdGlvbnMvVG9vbEl0ZW1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxNTk4Zi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2FjdGlvbnMvVG9vbEl0ZW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogV3JhcHBlciBhcm91bmQge0BsaW5rIFRvb2xJdGVtfSB0byBpbXBsZW1lbnQge0BsaW5rIElDb21tb25BY3Rpb259Ci0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbUFjdGlvbiBpbXBsZW1lbnRzIElDb21tb25BY3Rpb24gewotICAgIHB1YmxpYyBUb29sSXRlbSBpdGVtOwotCi0gICAgcHVibGljIFRvb2xJdGVtQWN0aW9uKFRvb2xCYXIgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgaXRlbSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgYWN0aW9uLgotICAgICAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSwgYW5kCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZGlzYWJsZQotICAgICAqIEBzZWUgSUNvbW1vbkFjdGlvbiNzZXRDaGVja2VkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLSAgICAgICAgaXRlbS5zZXRTZWxlY3Rpb24oY2hlY2tlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUsIGFuZAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGRpc2FibGUKLSAgICAgKiBAc2VlIElDb21tb25BY3Rpb24jc2V0RW5hYmxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgUnVubmFibGV9IHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBhY3Rpb24gaXMgdHJpZ2dlcmVkICh0aHJvdWdoCi0gICAgICoge0BsaW5rIFNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KX0gb24gdGhlIHdyYXBwZWQge0BsaW5rIFRvb2xJdGVtfSkuCi0gICAgICogQHNlZSBJQ29tbW9uQWN0aW9uI3NldFJ1bm5hYmxlKFJ1bm5hYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bm5hYmxlKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9hbm5vdGF0aW9uL1VpVGhyZWFkLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2Fubm90YXRpb24vVWlUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5ZTExYi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2Fubm90YXRpb24vVWlUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotLyoqCi0gKiBTaW1wbGUgdXRpbGl0eSBhbm5vdGF0aW9uIHVzZWQgb25seSB0byBtYXJrIG1ldGhvZHMgdGhhdCBhcmUgZXhlY3V0ZWQgb24gdGhlIFVJIHRocmVhZC4KLSAqIFRoaXMgYW5ub3RhdGlvbidzIHNvbGUgcHVycG9zZSBpcyB0byBoZWxwIHJlYWRpbmcgdGhlIHNvdXJjZSBjb2RlLiBJdCBoYXMgbm8gYWRkaXRpb25hbCBlZmZlY3QuCi0gKi8KLUBUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVpVGhyZWFkIHsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvYW5ub3RhdGlvbi9Xb3JrZXJUaHJlYWQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvYW5ub3RhdGlvbi9Xb3JrZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2N2VkYS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2Fubm90YXRpb24vV29ya2VyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLS8qKgotICogU2ltcGxlIHV0aWxpdHkgYW5ub3RhdGlvbiB1c2VkIG9ubHkgdG8gbWFyayBtZXRob2RzIHRoYXQgYXJlIG5vdCBleGVjdXRlZCBvbiB0aGUgVUkgdGhyZWFkLgotICogVGhpcyBhbm5vdGF0aW9uJ3Mgc29sZSBwdXJwb3NlIGlzIHRvIGhlbHAgcmVhZGluZyB0aGUgc291cmNlIGNvZGUuIEl0IGhhcyBubyBhZGRpdGlvbmFsIGVmZmVjdC4KLSAqLwotQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgV29ya2VyVGhyZWFkIHsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvY29uc29sZS9EZG1Db25zb2xlLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2NvbnNvbGUvRGRtQ29uc29sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY0Mzc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvY29uc29sZS9EZG1Db25zb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5jb25zb2xlOwotCi0KLS8qKgotICogU3RhdGljIENvbnNvbGUgdXNlZCB0byBvdXB1dCBtZXNzYWdlcy4gQnkgZGVmYXVsdCBvdXRwdXRzIHRoZSBtZXNzYWdlIHRvIFN5c3RlbS5vdXQgYW5kCi0gKiBTeXN0ZW0uZXJyLCBidXQgY2FuIHJlY2VpdmUgYSBJRGRtQ29uc29sZSBvYmplY3Qgd2hpY2ggd2lsbCBhY3R1YWxseSBkbyBzb21ldGhpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZG1Db25zb2xlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIElEZG1Db25zb2xlIG1Db25zb2xlOwotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbWVzc2FnZSB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHByaW50Ci0gICAgICogQHBhcmFtIGZvcmNlRGlzcGxheSBpZiB0cnVlLCB0aGlzIGZvcmNlIHRoZSBjb25zb2xlIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclRvQ29uc29sZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAobUNvbnNvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnNvbGUucHJpbnRFcnJvclRvQ29uc29sZShtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBzZXZlcmFsIG1lc3NhZ2VzIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VzIHRoZSBtZXNzYWdlcyB0byBwcmludAotICAgICAqIEBwYXJhbSBmb3JjZURpc3BsYXkgaWYgdHJ1ZSwgdGhpcyBmb3JjZSB0aGUgY29uc29sZSB0byBiZSBkaXNwbGF5ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nW10gbWVzc2FnZXMpIHsKLSAgICAgICAgaWYgKG1Db25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUobWVzc2FnZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbWVzc2FnZSB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHByaW50Ci0gICAgICogQHBhcmFtIGZvcmNlRGlzcGxheSBpZiB0cnVlLCB0aGlzIGZvcmNlIHRoZSBjb25zb2xlIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUb0NvbnNvbGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1Db25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db25zb2xlLnByaW50VG9Db25zb2xlKG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHNldmVyYWwgbWVzc2FnZXMgdG8gdGhlIGFuZHJvaWQgY29uc29sZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZXMgdGhlIG1lc3NhZ2VzIHRvIHByaW50Ci0gICAgICogQHBhcmFtIGZvcmNlRGlzcGxheSBpZiB0cnVlLCB0aGlzIGZvcmNlIHRoZSBjb25zb2xlIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUb0NvbnNvbGUoU3RyaW5nW10gbWVzc2FnZXMpIHsKLSAgICAgICAgaWYgKG1Db25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db25zb2xlLnByaW50VG9Db25zb2xlKG1lc3NhZ2VzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG1lc3NhZ2UgOiBtZXNzYWdlcykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBJRGRtQ29uc29sZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgY29uc29sZQotICAgICAqIEBwYXJhbSBjb25zb2xlIFRoZSBuZXcgSURkbUNvbnNvbGUKLSAgICAgKiAqKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uc29sZShJRGRtQ29uc29sZSBjb25zb2xlKSB7Ci0gICAgICAgIG1Db25zb2xlID0gY29uc29sZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2NvbnNvbGUvSURkbUNvbnNvbGUuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvY29uc29sZS9JRGRtQ29uc29sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjc5ZDQxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvY29uc29sZS9JRGRtQ29uc29sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIuY29uc29sZTsKLQotCi0vKioKLSAqIERETVMgY29uc29sZSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURkbUNvbnNvbGUgewotICAgIC8qKgotICAgICAqIFByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIGFuZHJvaWQgY29uc29sZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBwcmludAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHNldmVyYWwgbWVzc2FnZXMgdG8gdGhlIGFuZHJvaWQgY29uc29sZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZXMgdGhlIG1lc3NhZ2VzIHRvIHByaW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRFcnJvclRvQ29uc29sZShTdHJpbmdbXSBtZXNzYWdlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSBtZXNzYWdlIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gcHJpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFRvQ29uc29sZShTdHJpbmcgbWVzc2FnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgc2V2ZXJhbCBtZXNzYWdlcyB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlcyB0aGUgbWVzc2FnZXMgdG8gcHJpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFRvQ29uc29sZShTdHJpbmdbXSBtZXNzYWdlcyk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2V4cGxvcmVyL0RldmljZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9leHBsb3Jlci9EZXZpY2VDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjMTlmZS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2V4cGxvcmVyL0RldmljZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmV4cGxvcmVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkZpbGVMaXN0aW5nU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLkZpbGVFbnRyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLklMaXN0aW5nUmVjZWl2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLS8qKgotICogQ29udGVudCBwcm92aWRlciBjbGFzcyBmb3IgZGV2aWNlIEV4cGxvcmVyLgotICovCi1jbGFzcyBEZXZpY2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgbVZpZXdlcjsKLSAgICBwcml2YXRlIEZpbGVMaXN0aW5nU2VydmljZSBtRmlsZUxpc3RpbmdTZXJ2aWNlOwotICAgIHByaXZhdGUgRmlsZUVudHJ5IG1Sb290RW50cnk7Ci0KLSAgICBwcml2YXRlIElMaXN0aW5nUmVjZWl2ZXIgc0xpc3RpbmdSZWNlaXZlciA9IG5ldyBJTGlzdGluZ1JlY2VpdmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihmaW5hbCBGaWxlRW50cnkgZW50cnksIEZpbGVFbnRyeVtdIGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBmaW5hbCBUcmVlIHQgPSBtVmlld2VyLmdldFRyZWUoKTsKLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB0LmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdlci5yZWZyZXNoKGVudHJ5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBpdCBvcGVuLCBzaW5jZSBvbiBsaW51eCBhbmQgd2luZG93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGdldENoaWxkcmVuKCkgcmV0dXJucyBudWxsLCB0aGUgbm9kZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgY29uc2lkZXJlZCBleHBhbmRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKGVudHJ5LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hFbnRyeShmaW5hbCBGaWxlRW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgIGZpbmFsIFRyZWUgdCA9IG1WaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHQuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGVudHJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld2VyLnJlZnJlc2goZW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIERldmljZUNvbnRlbnRQcm92aWRlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0aW5nU2VydmljZShGaWxlTGlzdGluZ1NlcnZpY2UgZmxzKSB7Ci0gICAgICAgIG1GaWxlTGlzdGluZ1NlcnZpY2UgPSBmbHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgRmlsZUVudHJ5IHBhcmVudEVudHJ5ID0gKEZpbGVFbnRyeSlwYXJlbnRFbGVtZW50OwotCi0gICAgICAgICAgICBPYmplY3RbXSBvbGRFbnRyaWVzID0gcGFyZW50RW50cnkuZ2V0Q2FjaGVkQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIE9iamVjdFtdIG5ld0VudHJpZXMgPSBtRmlsZUxpc3RpbmdTZXJ2aWNlLmdldENoaWxkcmVuKHBhcmVudEVudHJ5LAotICAgICAgICAgICAgICAgICAgICB0cnVlLCBzTGlzdGluZ1JlY2VpdmVyKTsKLQotICAgICAgICAgICAgaWYgKG5ld0VudHJpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbnRyaWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBudWxsIHdhcyByZXR1cm5lZCwgdGhpcyBtZWFucyB0aGUgY2FjaGUgd2FzIG5vdCB2YWxpZCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgYSB0aHJlYWQgd2FzIGxhdW5jaGVkIGZvciBscy4gc0xpc3RpbmdSZWNlaXZlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gbm90aWZpZWQgd2l0aCB0aGUgbmV3IGVudHJpZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9sZEVudHJpZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgRmlsZUVudHJ5IGVudHJ5ID0gKEZpbGVFbnRyeSllbGVtZW50OwotCi0gICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVudHJ5KSB7Ci0gICAgICAgICAgICBGaWxlRW50cnkgZW50cnkgPSAoRmlsZUVudHJ5KWVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRUeXBlKCkgPT0gRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfRElSRUNUT1JZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgRmlsZUVudHJ5IGVudHJ5ID0gKEZpbGVFbnRyeSlpbnB1dEVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaXNSb290KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4obVJvb3RFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotICAgICAgICAgICAgbVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlcjsKLSAgICAgICAgfQotICAgICAgICBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBGaWxlRW50cnkpIHsKLSAgICAgICAgICAgIG1Sb290RW50cnkgPSAoRmlsZUVudHJ5KW5ld0lucHV0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9leHBsb3Jlci9EZXZpY2VFeHBsb3Jlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9leHBsb3Jlci9EZXZpY2VFeHBsb3Jlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg0M2E0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvZXhwbG9yZXIvRGV2aWNlRXhwbG9yZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5leHBsb3JlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5GaWxlTGlzdGluZ1NlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklTaGVsbE91dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLkZpbGVFbnRyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2UuSVN5bmNQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLlN5bmNSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRGRtVWlQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5QYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5TeW5jUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlRhYmxlSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmFjdGlvbnMuSUNvbW1vbkFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5jb25zb2xlLkRkbUNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBEZXZpY2UgZmlsZXN5c3RlbSBleHBsb3JlciBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIERldmljZUV4cGxvcmVyIGV4dGVuZHMgUGFuZWwgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQUNFX0tFWV9FWFQgPSAiLmtleSI7IC8vICROT04tTkxTLTFTCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQUNFX0RBVEFfRVhUID0gIi5kYXRhIjsgLy8gJE5PTi1OTFMtMVMKLQotICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gbUtleUZpbGVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIiguKylcXCIgKyBUUkFDRV9LRVlfRVhUKTsgLy8gJE5PTi1OTFMtMVMKLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIG1EYXRhRmlsZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiKC4rKVxcIiArIFRSQUNFX0RBVEFfRVhUKTsgLy8gJE5PTi1OTFMtMVMKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9OQU1FID0gImFuZHJvaWQuZXhwbG9yZXIubmFtZSI7IC8vJE5PTi1OTFMtMVMKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fU0laRSA9ICJhbmRyb2lkLmV4cGxvcmVyLnNpemUiOyAvLyROT04tTkxTLTFTCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0RBVEUgPSAiYW5kcm9pZC5leHBsb3Jlci5kYXRhIjsgLy8kTk9OLU5MUy0xUwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9USU1FID0gImFuZHJvaWQuZXhwbG9yZXIudGltZSI7IC8vJE5PTi1OTFMtMVMKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fUEVSTUlTU0lPTlMgPSAiYW5kcm9pZC5leHBsb3Jlci5wZXJtaXNzaW9ucyI7IC8vICROT04tTkxTLTFTCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0lORk8gPSAiYW5kcm9pZC5leHBsb3Jlci5pbmZvIjsgLy8gJE5PTi1OTFMtMVMKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1QYXJlbnQ7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIG1UcmVlVmlld2VyOwotICAgIHByaXZhdGUgVHJlZSBtVHJlZTsKLSAgICBwcml2YXRlIERldmljZUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBJQ29tbW9uQWN0aW9uIG1QdXNoQWN0aW9uOwotICAgIHByaXZhdGUgSUNvbW1vbkFjdGlvbiBtUHVsbEFjdGlvbjsKLSAgICBwcml2YXRlIElDb21tb25BY3Rpb24gbURlbGV0ZUFjdGlvbjsKLQotICAgIHByaXZhdGUgSW1hZ2UgbUZpbGVJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1Gb2xkZXJJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1QYWNrYWdlSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtT3RoZXJJbWFnZTsKLQotICAgIHByaXZhdGUgSURldmljZSBtQ3VycmVudERldmljZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1EZWZhdWx0U2F2ZTsKLQotICAgIHB1YmxpYyBEZXZpY2VFeHBsb3JlcigpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGltYWdlcyBmb3IgdGhlIGxpc3R2aWV3Ci0gICAgICogQHBhcmFtIGZpbGVJbWFnZQotICAgICAqIEBwYXJhbSBmb2xkZXJJbWFnZQotICAgICAqIEBwYXJhbSBvdGhlckltYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VzKEltYWdlIGZpbGVJbWFnZSwgSW1hZ2UgZm9sZGVySW1hZ2UsIEltYWdlIHBhY2thZ2VJbWFnZSwKLSAgICAgICAgICAgIEltYWdlIG90aGVySW1hZ2UpIHsKLSAgICAgICAgbUZpbGVJbWFnZSA9IGZpbGVJbWFnZTsKLSAgICAgICAgbUZvbGRlckltYWdlID0gZm9sZGVySW1hZ2U7Ci0gICAgICAgIG1QYWNrYWdlSW1hZ2UgPSBwYWNrYWdlSW1hZ2U7Ci0gICAgICAgIG1PdGhlckltYWdlID0gb3RoZXJJbWFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhY3Rpb25zIHNvIHRoYXQgdGhlIGRldmljZSBleHBsb3JlciBjYW4gZW5hYmxlL2Rpc2FibGUgdGhlbSBiYXNlZCBvbiB0aGUgY3VycmVudAotICAgICAqIHNlbGVjdGlvbgotICAgICAqIEBwYXJhbSBwdXNoQWN0aW9uCi0gICAgICogQHBhcmFtIHB1bGxBY3Rpb24KLSAgICAgKiBAcGFyYW0gZGVsZXRlQWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9ucyhJQ29tbW9uQWN0aW9uIHB1c2hBY3Rpb24sIElDb21tb25BY3Rpb24gcHVsbEFjdGlvbiwKLSAgICAgICAgICAgIElDb21tb25BY3Rpb24gZGVsZXRlQWN0aW9uKSB7Ci0gICAgICAgIG1QdXNoQWN0aW9uID0gcHVzaEFjdGlvbjsKLSAgICAgICAgbVB1bGxBY3Rpb24gPSBwdWxsQWN0aW9uOwotICAgICAgICBtRGVsZXRlQWN0aW9uID0gZGVsZXRlQWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb250cm9sIGNhcGFibGUgb2YgZGlzcGxheWluZyBzb21lIGluZm9ybWF0aW9uLiAgVGhpcyBpcwotICAgICAqIGNhbGxlZCBvbmNlLCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXppbmcsIGZyb20gdGhlIFVJIHRocmVhZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgICAgICBtVHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZJUlRVQUwpOwotICAgICAgICBtVHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGNvbHVtbnMKLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVHJlZUNvbHVtbihtVHJlZSwgIk5hbWUiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiMDAwMGRyd3hyd3hyd3giLCBDT0xVTU5fTkFNRSwgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICJTaXplIiwgU1dULlJJR0hULAotICAgICAgICAgICAgICAgICIwMDAwMDAiLCBDT0xVTU5fU0laRSwgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICJEYXRlIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIjIwMDctMDgtMTQiLCBDT0xVTU5fREFURSwgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICJUaW1lIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgIjIwOjU0IiwgQ09MVU1OX1RJTUUsIHN0b3JlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUcmVlQ29sdW1uKG1UcmVlLCAiUGVybWlzc2lvbnMiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiZHJ3eHJ3eHJ3eCIsIENPTFVNTl9QRVJNSVNTSU9OUywgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICJJbmZvIiwgU1dULkxFRlQsCi0gICAgICAgICAgICAgICAgImRyd3hyd3hyd3giLCBDT0xVTU5fSU5GTywgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBqZmFjZSB3cmFwcGVyCi0gICAgICAgIG1UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIobVRyZWUpOwotCi0gICAgICAgIC8vIHNldHVwIGRhdGEgcHJvdmlkZXIKLSAgICAgICAgbUNvbnRlbnRQcm92aWRlciA9IG5ldyBEZXZpY2VDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG1Db250ZW50UHJvdmlkZXIpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBGaWxlTGFiZWxQcm92aWRlcihtRmlsZUltYWdlLAotICAgICAgICAgICAgICAgIG1Gb2xkZXJJbWFnZSwgbVBhY2thZ2VJbWFnZSwgbU90aGVySW1hZ2UpKTsKLQotICAgICAgICAvLyBzZXR1cCBhIGxpc3RlbmVyIGZvciBzZWxlY3Rpb24KLSAgICAgICAgbVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbCA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QdWxsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtUHVzaEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVB1bGxBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QdXNoQWN0aW9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLnNpemUoKSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZWxldGVFbmFibGVkU3RhdGUoKEZpbGVFbnRyeSllbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gYWRkIHN1cHBvcnQgZm9yIGRvdWJsZSBjbGljawotICAgICAgICBtVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbCA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBlbnRyeSA9IChGaWxlRW50cnkpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBwYXJlbnRFbnRyeSA9IGVudHJ5LmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgd2l0aCBubyBwYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGlzIGlzIGEgZmlsZSBsaWtlIHdlIHdhbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBtS2V5RmlsZVBhdHRlcm4ubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSB3L28gdGhlIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGRhdGEgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFOYW1lID0gYmFzZU5hbWUgKyBUUkFDRV9EQVRBX0VYVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBkYXRhRW50cnkgPSBwYXJlbnRFbnRyeS5maW5kQ2hpbGQoZGF0YU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHJhY2VEb3VibGVDbGljayhiYXNlTmFtZSwgZW50cnksIGRhdGFFbnRyeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG1EYXRhRmlsZVBhdHRlcm4ubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIHcvbyB0aGUgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXlOYW1lID0gYmFzZU5hbWUgKyBUUkFDRV9LRVlfRVhUOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBrZXlFbnRyeSA9IHBhcmVudEVudHJ5LmZpbmRDaGlsZChrZXlOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUcmFjZURvdWJsZUNsaWNrKGJhc2VOYW1lLCBrZXlFbnRyeSwgZW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2V0dXAgZHJvcCBsaXN0ZW5lcgotICAgICAgICBtVHJlZVZpZXdlci5hZGREcm9wU3VwcG9ydChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSwKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0sCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdlckRyb3BBZGFwdGVyKG1UcmVlVmlld2VyKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1Ecm9wKE9iamVjdCBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpdGVtIG9uIHdoaWNoIHdlIGRyb3BwZWQgdGhlIGl0ZW0ocykKLSAgICAgICAgICAgICAgICBGaWxlRW50cnkgdGFyZ2V0ID0gKEZpbGVFbnRyeSlnZXRDdXJyZW50VGFyZ2V0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlIGRyb3AgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgcm9vdAotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgYSBkaXJlY3RvcnksIHdlIGdldCB0aGUgcGFyZW50IGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gZHJvcAotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKWRhdGE7Ci0KLSAgICAgICAgICAgICAgICAvLyBkbyB0aGUgZHJvcAotICAgICAgICAgICAgICAgIHB1c2hGaWxlcyhmaWxlcywgdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmluaXNoIHdpdGggYSByZWZyZXNoCi0gICAgICAgICAgICAgICAgcmVmcmVzaCh0YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdGhlIHJlYWwgaXRlbQotICAgICAgICAgICAgICAgIEZpbGVFbnRyeSB0YXJnZXRFbnRyeSA9IChGaWxlRW50cnkpdGFyZ2V0OwotCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgYSBkaXJlY3RvcnksIHdlIGdldCB0aGUgcGFyZW50IGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbnRyeS5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldEVudHJ5LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhbmQgc3RhcnQgdGhlIHJlZnJlc2ggdGhyZWFkCi0gICAgICAgIG5ldyBUaHJlYWQoIkRldmljZSBMcyByZWZyZXNoZXIiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoRmlsZUxpc3RpbmdTZXJ2aWNlLlJFRlJFU0hfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVHJlZSAhPSBudWxsICYmIG1UcmVlLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gbVRyZWUuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyZWUuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIHJldHVybiBtVHJlZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0Q3JlYXRpb24oKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgcHJvcGVyIGNvbnRyb2wgaW5zaWRlIHRoZSBwYW5lbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgbVRyZWUuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBkb3VibGUgY2xpY2sgb24gYSB0cmFjZSBmaWxlCi0gICAgICogQHBhcmFtIGJhc2VOYW1lIHRoZSBiYXNlIG5hbWUgb2YgdGhlIDIgZmlsZXMuCi0gICAgICogQHBhcmFtIGtleUVudHJ5IFRoZSBGaWxlRW50cnkgZm9yIHRoZSAua2V5IGZpbGUuCi0gICAgICogQHBhcmFtIGRhdGFFbnRyeSBUaGUgRmlsZUVudHJ5IGZvciB0aGUgLmRhdGEgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVHJhY2VEb3VibGVDbGljayhTdHJpbmcgYmFzZU5hbWUsIEZpbGVFbnRyeSBrZXlFbnRyeSwKLSAgICAgICAgICAgIEZpbGVFbnRyeSBkYXRhRW50cnkpIHsKLSAgICAgICAgLy8gZmlyc3Qgd2UgbmVlZCB0byBkb3dubG9hZCB0aGUgZmlsZXMuCi0gICAgICAgIEZpbGUga2V5RmlsZTsKLSAgICAgICAgRmlsZSBkYXRhRmlsZTsKLSAgICAgICAgU3RyaW5nIHBhdGg7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wIGZpbGUgZm9yIGtleUZpbGUKLSAgICAgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoYmFzZU5hbWUsICIudHJhY2UiKTsKLSAgICAgICAgICAgIGYuZGVsZXRlKCk7Ci0gICAgICAgICAgICBmLm1rZGlyKCk7Ci0KLSAgICAgICAgICAgIHBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgICAgICAgICBrZXlGaWxlID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsga2V5RW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGRhdGFGaWxlID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZGF0YUVudHJ5LmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvd25sb2FkIHRoZSBmaWxlcwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3luY1NlcnZpY2Ugc3luYyA9IG1DdXJyZW50RGV2aWNlLmdldFN5bmNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc3luYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVN5bmNQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IFN5bmNTZXJ2aWNlLmdldE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IHN5bmMucHVsbEZpbGUoa2V5RW50cnksIGtleUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0Q29kZSgpICE9IFN5bmNTZXJ2aWNlLlJFU1VMVF9PSykgewotICAgICAgICAgICAgICAgICAgICBEZG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHB1bGwgJTEkczogJTIkcyIsIGtleUVudHJ5LmdldE5hbWUoKSwgcmVzdWx0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc3luYy5wdWxsRmlsZShkYXRhRW50cnksIGRhdGFGaWxlLmdldEFic29sdXRlUGF0aCgpLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldENvZGUoKSAhPSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwdWxsICUxJHM6ICUyJHMiLCBkYXRhRW50cnkuZ2V0TmFtZSgpLCByZXN1bHQuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBmaWxlLCB3ZSBuZWVkIHRvIGxhdW5jaCB0cmFjZXZpZXcKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgICAgICBjb21tYW5kWzBdID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRUcmFjZXZpZXcoKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kWzFdID0gcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgYmFzZU5hbWU7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRocmVhZCBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCJUcmFjZXZpZXcgb3V0cHV0IikgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIHRvIHJlYWQgdGhlIHN0ZGVyciBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwLmdldEVycm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlc3VsdFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBwcm9jZXNzIGZpbmlzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVzdWx0UmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKCJUcmFjZXZpZXc6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAud2FpdEZvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0uc3RhcnQoKTsKLQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERkbUNvbnNvbGUucHJpbnRFcnJvclRvQ29uc29sZShTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHB1bGwgJTEkczogJTIkcyIsIGtleUVudHJ5LmdldE5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1bGwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9uIHRoZSBsb2NhbCBkcml2ZS4gVGhpcyBtZXRob2QgZGlzcGxheXMKLSAgICAgKiBhIGRpYWxvZyBib3ggdG8gbGV0IHRoZSB1c2VyIHNlbGVjdCB3aGVyZSB0byBzdG9yZSB0aGUgZmlsZShzKSBhbmQKLSAgICAgKiBmb2xkZXIocykuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVsbFNlbGVjdGlvbigpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IG1UcmVlLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIC8vIG5hbWUgb2YgdGhlIHNpbmdsZSBmaWxlIHB1bGwsIG9yIG51bGwgaWYgd2UncmUgcHVsbGluZyBhIGRpcmVjdG9yeQotICAgICAgICAvLyBvciBtb3JlIHRoYW4gb25lIG9iamVjdC4KLSAgICAgICAgU3RyaW5nIGZpbGVQdWxsTmFtZSA9IG51bGw7Ci0gICAgICAgIEZpbGVFbnRyeSBzaW5nbGVFbnRyeSA9IG51bGw7Ci0KLSAgICAgICAgLy8gYXJlIHdlIHB1bGxpbmcgYSBzaW5nbGUgZmlsZT8KLSAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICBzaW5nbGVFbnRyeSA9IChGaWxlRW50cnkpaXRlbXNbMF0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKHNpbmdsZUVudHJ5LmdldFR5cGUoKSA9PSBGaWxlTGlzdGluZ1NlcnZpY2UuVFlQRV9GSUxFKSB7Ci0gICAgICAgICAgICAgICAgZmlsZVB1bGxOYW1lID0gc2luZ2xlRW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2hlcmUgZG8gd2Ugc2F2ZSBieSBkZWZhdWx0PwotICAgICAgICBTdHJpbmcgZGVmYXVsdFBhdGggPSBtRGVmYXVsdFNhdmU7Ci0gICAgICAgIGlmIChkZWZhdWx0UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlUHVsbE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2cobVBhcmVudC5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dCgiR2V0IERldmljZSBGaWxlIik7Ci0gICAgICAgICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKGZpbGVQdWxsTmFtZSk7Ci0gICAgICAgICAgICBmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgoZGVmYXVsdFBhdGgpOwotCi0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRTYXZlID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCk7Ci0KLSAgICAgICAgICAgICAgICBwdWxsRmlsZShzaW5nbGVFbnRyeSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpcmVjdG9yeURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobVBhcmVudC5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgIGRpcmVjdG9yeURpYWxvZy5zZXRUZXh0KCJHZXQgRGV2aWNlIEZpbGVzL0ZvbGRlcnMiKTsKLSAgICAgICAgICAgIGRpcmVjdG9yeURpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlZmF1bHRQYXRoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU5hbWUgPSBkaXJlY3RvcnlEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB1bGxTZWxlY3Rpb24oaXRlbXMsIGRpcmVjdG9yeU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaCBuZXcgZmlsZShzKSBhbmQgZm9sZGVyKHMpIGludG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBDdXJyZW50Ci0gICAgICogc2VsZWN0aW9uIG11c3QgYmUgc2luZ2xlIGl0ZW0uIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBub3QgYQotICAgICAqIGRpcmVjdG9yeSwgdGhlIHBhcmVudCBkaXJlY3RvcnkgaXMgdXNlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBkaXNwbGF5cyBhIGRpYWxvZyB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGZpbGUgdG8gcHVzaCB0bwotICAgICAqIHRoZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVzaEludG9TZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdlJ3JlIGdvaW5nIHRvIHB1bGwKLSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IG1UcmVlLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZURpYWxvZyBkbGcgPSBuZXcgRmlsZURpYWxvZyhtUGFyZW50LmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lOwotCi0gICAgICAgIGRsZy5zZXRUZXh0KCJQdXQgRmlsZSBvbiBEZXZpY2UiKTsKLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUuCi0gICAgICAgIEZpbGVFbnRyeSBlbnRyeSA9IChGaWxlRW50cnkpaXRlbXNbMF0uZ2V0RGF0YSgpOwotICAgICAgICBkbGcuc2V0RmlsZU5hbWUoZW50cnkuZ2V0TmFtZSgpKTsKLQotICAgICAgICBTdHJpbmcgZGVmYXVsdFBhdGggPSBtRGVmYXVsdFNhdmU7Ci0gICAgICAgIGlmIChkZWZhdWx0UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBkbGcuc2V0RmlsdGVyUGF0aChkZWZhdWx0UGF0aCk7Ci0KLSAgICAgICAgZmlsZU5hbWUgPSBkbGcub3BlbigpOwotICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbURlZmF1bHRTYXZlID0gZGxnLmdldEZpbHRlclBhdGgoKTsKLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZW1vdGUgcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gdHlwZS4KLSAgICAgICAgICAgIFN0cmluZyByZW1vdGVQYXRoOwotICAgICAgICAgICAgRmlsZUVudHJ5IHRvUmVmcmVzaCA9IGVudHJ5OwotICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdGVQYXRoID0gZW50cnkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG9SZWZyZXNoID0gZW50cnkuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgcmVtb3RlUGF0aCA9IHRvUmVmcmVzaC5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdXNoRmlsZShmaWxlTmFtZSwgcmVtb3RlUGF0aCk7Ci0gICAgICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKHRvUmVmcmVzaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVTZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdlJ3JlIGdvaW5nIHRvIHB1bGwKLSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IG1UcmVlLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggIT0gMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZUVudHJ5IGVudHJ5ID0gKEZpbGVFbnRyeSlpdGVtc1swXS5nZXREYXRhKCk7Ci0gICAgICAgIGZpbmFsIEZpbGVFbnRyeSBwYXJlbnRFbnRyeSA9IGVudHJ5LmdldFBhcmVudCgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZGVsZXRlIGNvbW1hbmQKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAicm0gIiArIGVudHJ5LmdldEZ1bGxFc2NhcGVkUGF0aCgpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1DdXJyZW50RGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCwgbmV3IElTaGVsbE91dHB1dFJlY2VpdmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZE91dHB1dChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gZ2V0IG91dHB1dCB0byBkaXNwbGF5IGVycm9ycyBpZiBhbnkuCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2gocGFyZW50RW50cnkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGFkYiBmYWlsZWQgc29tZWhvdywgd2UgZG8gbm90aGluZy4gV2Ugc2hvdWxkIGJlIGRpc3BsYXlpbmcgdGhlIGVycm9yIGZyb20gdGhlIG91dHB1dAotICAgICAgICAgICAgLy8gb2YgdGhlIHNoZWxsIGNvbW1hbmQuCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIGEgZnVsbCByZWZyZXNoIG9mIHRoZSBleHBsb3Jlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldyBkZXZpY2UgdG8gZXhwbG9yZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzd2l0Y2hEZXZpY2UoZmluYWwgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSAhPSBtQ3VycmVudERldmljZSkgewotICAgICAgICAgICAgbUN1cnJlbnREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICAvLyBub3cgd2UgY2hhbmdlIHRoZSBpbnB1dC4gYnV0IHdlIG5lZWQgdG8gZG8gdGhhdCBpbiB0aGUKLSAgICAgICAgICAgIC8vIHVpIHRocmVhZC4KLSAgICAgICAgICAgIGlmIChtVHJlZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IGQgPSBtVHJlZS5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgZC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyZWUuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnREZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTGlzdGluZ1NlcnZpY2UgZmxzID0gbUN1cnJlbnREZXZpY2UuZ2V0RmlsZUxpc3RpbmdTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UHJvdmlkZXIuc2V0TGlzdGluZ1NlcnZpY2UoZmxzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0SW5wdXQoZmxzLmdldFJvb3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoIGFuIGVudHJ5IGZyb20gYSBub24gdWkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgdG8gcmVmcmVzaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaChmaW5hbCBGaWxlRW50cnkgZW50cnkpIHsKLSAgICAgICAgRGlzcGxheSBkID0gbVRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldERpc3BsYXkoKTsKLSAgICAgICAgZC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2goZW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWxscyB0aGUgc2VsZWN0aW9uIGZyb20gYSBkZXZpY2UuCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSB0cmVlIHNlbGVjdGlvbiB0aGUgcmVtb3RlIGZpbGUgb24gdGhlIGRldmljZQotICAgICAqIEBwYXJhbSBsb2NhbERpcmVjdG9yIHRoZSBsb2NhbCBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHB1bGxTZWxlY3Rpb24oVHJlZUl0ZW1bXSBpdGVtcywgZmluYWwgU3RyaW5nIGxvY2FsRGlyZWN0b3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTeW5jU2VydmljZSBzeW5jID0gbUN1cnJlbnREZXZpY2UuZ2V0U3luY1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIGEgbGlzdCBvZiB0aGUgRmlsZUVudHJ5LgotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxGaWxlRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGVFbnRyeT4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKFRyZWVJdGVtIGl0ZW0gOiBpdGVtcykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcy5hZGQoKEZpbGVFbnRyeSlkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRW50cnlbXSBlbnRyeUFycmF5ID0gZW50cmllcy50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IGEgcHJvZ3Jlc3NkaWFsb2cKLSAgICAgICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKG1QYXJlbnQuZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG1vbml0b3Igd3JhcHBlciBhcm91bmQgdGhlIGpmYWNlIG1vbml0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNSZXN1bHQgcmVzdWx0ID0gc3luYy5wdWxsKGVudHJ5QXJyYXksIGxvY2FsRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY1Byb2dyZXNzTW9uaXRvcihtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQdWxsaW5nIGZpbGUocykgZnJvbSB0aGUgZGV2aWNlIikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldENvZGUoKSAhPSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcHVsbCBzZWxlY3Rpb246ICUxJHMiLCByZXN1bHQuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERkbUNvbnNvbGUucHJpbnRFcnJvclRvQ29uc29sZSggIkZhaWxlZCB0byBwdWxsIHNlbGVjdGlvbiIpOwotICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1bGxzIGEgZmlsZSBmcm9tIGEgZGV2aWNlLgotICAgICAqIEBwYXJhbSByZW1vdGUgdGhlIHJlbW90ZSBmaWxlIG9uIHRoZSBkZXZpY2UKLSAgICAgKiBAcGFyYW0gbG9jYWwgdGhlIGRlc3RpbmF0aW9uIGZpbGVwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHB1bGxGaWxlKGZpbmFsIEZpbGVFbnRyeSByZW1vdGUsIGZpbmFsIFN0cmluZyBsb2NhbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3luY1NlcnZpY2Ugc3luYyA9IG1DdXJyZW50RGV2aWNlLmdldFN5bmNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc3luYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhtUGFyZW50LmdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IHN5bmMucHVsbEZpbGUocmVtb3RlLCBsb2NhbCwgbmV3IFN5bmNQcm9ncmVzc01vbml0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IsIFN0cmluZy5mb3JtYXQoIlB1bGxpbmcgJTEkcyBmcm9tIHRoZSBkZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS5nZXROYW1lKCkpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldENvZGUoKSAhPSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcHVsbCAlMSRzOiAlMiRzIiwgcmVtb3RlLCByZXN1bHQuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKCAiRmFpbGVkIHRvIHB1bGwgc2VsZWN0aW9uIik7Ci0gICAgICAgICAgICBEZG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIHNldmVyYWwgZmlsZXMgYW5kIGRpcmVjdG9yeSBpbnRvIGEgcmVtb3RlIGRpcmVjdG9yeS4KLSAgICAgKiBAcGFyYW0gbG9jYWxGaWxlcwotICAgICAqIEBwYXJhbSByZW1vdGVEaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHVzaEZpbGVzKGZpbmFsIFN0cmluZ1tdIGxvY2FsRmlsZXMsIGZpbmFsIEZpbGVFbnRyeSByZW1vdGVEaXJlY3RvcnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFN5bmNTZXJ2aWNlIHN5bmMgPSBtQ3VycmVudERldmljZS5nZXRTeW5jU2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHN5bmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cobVBhcmVudC5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBzeW5jLnB1c2gobG9jYWxGaWxlcywgcmVtb3RlRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNQcm9ncmVzc01vbml0b3IobW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1c2hpbmcgZmlsZShzKSB0byB0aGUgZGV2aWNlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRDb2RlKCkgIT0gU3luY1NlcnZpY2UuUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHB1c2ggdGhlIGl0ZW1zOiAlMSRzIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERkbUNvbnNvbGUucHJpbnRFcnJvclRvQ29uc29sZSgiRmFpbGVkIHRvIHB1c2ggdGhlIGl0ZW1zIik7Ci0gICAgICAgICAgICBEZG1Db25zb2xlLnByaW50RXJyb3JUb0NvbnNvbGUoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGEgZmlsZSBvbiBhIGRldmljZS4KLSAgICAgKiBAcGFyYW0gbG9jYWwgdGhlIGxvY2FsIGZpbGVwYXRoIG9mIHRoZSBmaWxlIHRvIHB1c2gKLSAgICAgKiBAcGFyYW0gcmVtb3RlRGlyZWN0b3J5IHRoZSByZW1vdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9uIHRoZSBkZXZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHVzaEZpbGUoZmluYWwgU3RyaW5nIGxvY2FsLCBmaW5hbCBTdHJpbmcgcmVtb3RlRGlyZWN0b3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTeW5jU2VydmljZSBzeW5jID0gbUN1cnJlbnREZXZpY2UuZ2V0U3luY1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKG1QYXJlbnQuZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWdzID0gbG9jYWwuc3BsaXQoUGF0dGVybi5xdW90ZShGaWxlLnNlcGFyYXRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzZWdzW3NlZ3MubGVuZ3RoLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW90ZUZpbGUgPSByZW1vdGVEaXJlY3RvcnkgKyBGaWxlTGlzdGluZ1NlcnZpY2UuRklMRV9TRVBBUkFUT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IHN5bmMucHVzaEZpbGUobG9jYWwsIHJlbW90ZUZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY1Byb2dyZXNzTW9uaXRvcihtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJQdXNoaW5nICUxJHMgdG8gdGhlIGRldmljZS4iLCBuYW1lKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRDb2RlKCkgIT0gU3luY1NlcnZpY2UuUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHB1c2ggJTEkcyBvbiAlMiRzOiAlMyRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1DdXJyZW50RGV2aWNlLmdldFNlcmlhbE51bWJlcigpLCByZXN1bHQuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKCJGYWlsZWQgdG8gcHVzaCB0aGUgaXRlbShzKS4iKTsKLSAgICAgICAgICAgIERkbUNvbnNvbGUucHJpbnRFcnJvclRvQ29uc29sZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXRlIGJhc2VkIG9uIGEgRmlsZUVudHJ5IHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgc2VsZWN0ZWQgRmlsZUVudHJ5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVsZXRlRW5hYmxlZFN0YXRlKEZpbGVFbnRyeSBlbGVtZW50KSB7Ci0gICAgICAgIG1EZWxldGVBY3Rpb24uc2V0RW5hYmxlZChlbGVtZW50LmdldFR5cGUoKSA9PSBGaWxlTGlzdGluZ1NlcnZpY2UuVFlQRV9GSUxFKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2V4cGxvcmVyL0ZpbGVMYWJlbFByb3ZpZGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2V4cGxvcmVyL0ZpbGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkY2E5NjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9leHBsb3Jlci9GaWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmV4cGxvcmVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkZpbGVMaXN0aW5nU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuRmlsZUxpc3RpbmdTZXJ2aWNlLkZpbGVFbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogTGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBGaWxlRW50cnkuCi0gKi8KLWNsYXNzIEZpbGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBJbWFnZSBtRmlsZUltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgbUZvbGRlckltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgbVBhY2thZ2VJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1PdGhlckltYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBMYWJlbCBwcm92aWRlciB3aXRoIGN1c3RvbSBpbWFnZXMuCi0gICAgICogQHBhcmFtIGZpbGVJbWFnZSB0aGUgSW1hZ2UgdG8gcmVwcmVzZW50IGEgZmlsZQotICAgICAqIEBwYXJhbSBmb2xkZXJJbWFnZSB0aGUgSW1hZ2UgdG8gcmVwcmVzZW50IGEgZm9sZGVyCi0gICAgICogQHBhcmFtIHBhY2thZ2VJbWFnZSB0aGUgSW1hZ2UgdG8gcmVwcmVzZW50IGEgLmFwayBmaWxlLiBJZiBudWxsLAotICAgICAqICAgICAgZmlsZUltYWdlIGlzIHVzZWQgaW5zdGVhZC4KLSAgICAgKiBAcGFyYW0gb3RoZXJJbWFnZSB0aGUgSW1hZ2UgdG8gcmVwcmVzZW50IGFsbCBvdGhlciBlbnRyeSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTGFiZWxQcm92aWRlcihJbWFnZSBmaWxlSW1hZ2UsIEltYWdlIGZvbGRlckltYWdlLAotICAgICAgICAgICAgSW1hZ2UgcGFja2FnZUltYWdlLCBJbWFnZSBvdGhlckltYWdlKSB7Ci0gICAgICAgIG1GaWxlSW1hZ2UgPSBmaWxlSW1hZ2U7Ci0gICAgICAgIG1Gb2xkZXJJbWFnZSA9IGZvbGRlckltYWdlOwotICAgICAgICBtT3RoZXJJbWFnZSA9IG90aGVySW1hZ2U7Ci0gICAgICAgIGlmIChwYWNrYWdlSW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVBhY2thZ2VJbWFnZSA9IHBhY2thZ2VJbWFnZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QYWNrYWdlSW1hZ2UgPSBmaWxlSW1hZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGFiZWwgcHJvdmlkZXIgd2l0aCBkZWZhdWx0IGltYWdlcy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlTGFiZWxQcm92aWRlcigpIHsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFbnRyeSkgewotICAgICAgICAgICAgICAgIEZpbGVFbnRyeSBlbnRyeSA9IChGaWxlRW50cnkpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5LmdldFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfTElOSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBhbmQgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNBcHBsaWNhdGlvblBhY2thZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGFja2FnZUltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GaWxlSW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsZUxpc3RpbmdTZXJ2aWNlLlRZUEVfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVMaXN0aW5nU2VydmljZS5UWVBFX0RJUkVDVE9SWV9MSU5LOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Gb2xkZXJJbWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSByZXR1cm4gYSBkaWZmZXJlbnQgaW1hZ2UuCi0gICAgICAgICAgICByZXR1cm4gbU90aGVySW1hZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRW50cnkpIHsKLSAgICAgICAgICAgIEZpbGVFbnRyeSBlbnRyeSA9IChGaWxlRW50cnkpZWxlbWVudDsKLQotICAgICAgICAgICAgc3dpdGNoIChjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0RGF0ZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFRpbWUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRQZXJtaXNzaW9ucygpOwotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldEluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIGxpc3RlbmVycy4KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIGxpc3RlbmVycwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9oYW5kbGVyL0Jhc2VGaWxlSGFuZGxlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9oYW5kbGVyL0Jhc2VGaWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJhMmVmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvaGFuZGxlci9CYXNlRmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5oYW5kbGVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLklIcHJvZkR1bXBIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLklNZXRob2RQcm9maWxpbmdIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5TeW5jUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlN5bmNQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLS8qKgotICogQmFzZSBoYW5kbGVyIGNsYXNzIGZvciBoYW5kbGVyIGRlYWxpbmcgd2l0aCBmaWxlcyBsb2NhdGVkIG9uIGEgZGV2aWNlLgotICoKLSAqIEBzZWUgSUhwcm9mRHVtcEhhbmRsZXIKLSAqIEBzZWUgSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIKLSAqLwotcHVibGljIGNsYXNzIEJhc2VGaWxlSGFuZGxlciB7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU2hlbGwgbVBhcmVudFNoZWxsOwotCi0gICAgcHVibGljIEJhc2VGaWxlSGFuZGxlcihTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICBtUGFyZW50U2hlbGwgPSBwYXJlbnRTaGVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9tcHRzIHRoZSB1c2VyIGZvciBhIHNhdmUgbG9jYXRpb24gYW5kIHB1bGxzIHRoZSByZW1vdGUgZmlsZXMgaW50byB0aGlzIGxvY2F0aW9uLgotICAgICAqIDxwLz5UaGlzIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgVGhyZWFkLgotICAgICAqIEBwYXJhbSBzeW5jIHRoZSB7QGxpbmsgU3luY1NlcnZpY2V9IHRvIHVzZSB0byBwdWxsIHRoZSBmaWxlIGZyb20gdGhlIGRldmljZQotICAgICAqIEBwYXJhbSBsb2NhbEZpbGVOYW1lIFRoZSBkZWZhdWx0IGxvY2FsIG5hbWUKLSAgICAgKiBAcGFyYW0gcmVtb3RlRmlsZVBhdGggVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcHVsbCBvZmYgb2YgdGhlIGRldmljZQotICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIEZpbGUgU2F2ZSBkaWFsb2cuCi0gICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBwdWxsIGFzIGEge0BsaW5rIFN5bmNSZXN1bHR9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgc3luYwotICAgICAqIGRpZG4ndCBoYXBwZW4gKGNhbmNlbGVkIGJ5IHRoZSB1c2VyKS4KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNSZXN1bHQgcHJvbXB0QW5kUHVsbChTeW5jU2VydmljZSBzeW5jLAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsRmlsZU5hbWUsIFN0cmluZyByZW1vdGVGaWxlUGF0aCwgU3RyaW5nIHRpdGxlKQotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2cobVBhcmVudFNoZWxsLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgZmlsZURpYWxvZy5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgZmlsZURpYWxvZy5zZXRGaWxlTmFtZShsb2NhbEZpbGVOYW1lKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxGaWxlUGF0aCA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICBpZiAobG9jYWxGaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHVsbChzeW5jLCBsb2NhbEZpbGVQYXRoLCByZW1vdGVGaWxlUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWxscyBhIGZpbGUgb2ZmIG9mIGEgZGV2aWNlCi0gICAgICogQHBhcmFtIHN5bmMgdGhlIHtAbGluayBTeW5jU2VydmljZX0gdG8gdXNlIHRvIHB1bGwgdGhlIGZpbGUuCi0gICAgICogQHBhcmFtIGxvY2FsRmlsZVBhdGggdGhlIHBhdGggb2YgdGhlIGxvY2FsIGZpbGUgdG8gY3JlYXRlCi0gICAgICogQHBhcmFtIHJlbW90ZUZpbGVQYXRoIHRoZSBwYXRoIG9mIHRoZSByZW1vdGUgZmlsZSB0byBwdWxsCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBzeW5jIGFzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTeW5jUmVzdWx0fQotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3luY1Jlc3VsdCBwdWxsKGZpbmFsIFN5bmNTZXJ2aWNlIHN5bmMsIGZpbmFsIFN0cmluZyBsb2NhbEZpbGVQYXRoLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlbW90ZUZpbGVQYXRoKQotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3luY1Jlc3VsdFtdIHJlcyA9IG5ldyBTeW5jUmVzdWx0WzFdOwotICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKG1QYXJlbnRTaGVsbCkucnVuKHRydWUsIHRydWUsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzWzBdID0gc3luYy5wdWxsRmlsZShyZW1vdGVGaWxlUGF0aCwgbG9jYWxGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY1Byb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1bGxpbmcgJTEkcyBmcm9tIHRoZSBkZXZpY2UiLCByZW1vdGVGaWxlUGF0aCkpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzWzBdOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvaGFuZGxlci9NZXRob2RQcm9maWxpbmdIYW5kbGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2hhbmRsZXIvTWV0aG9kUHJvZmlsaW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY5YTdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvaGFuZGxlci9NZXRob2RQcm9maWxpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIuaGFuZGxlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlN5bmNTZXJ2aWNlLlN5bmNSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRGRtVWlQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5jb25zb2xlLkRkbUNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBIYW5kbGVyIGZvciBNZXRob2QgdHJhY2luZy4KLSAqIFRoaXMgd2lsbCBwdWxsIHRoZSB0cmFjZSBmaWxlIGludG8gYSB0ZW1wIGZpbGUgYW5kIGxhdW5jaCB0cmFjZXZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9maWxpbmdIYW5kbGVyIGV4dGVuZHMgQmFzZUZpbGVIYW5kbGVyCi0gICAgICAgIGltcGxlbWVudHMgSU1ldGhvZFByb2ZpbGluZ0hhbmRsZXIgewotCi0gICAgcHVibGljIE1ldGhvZFByb2ZpbGluZ0hhbmRsZXIoU2hlbGwgcGFyZW50U2hlbGwpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBDbGllbnQgY2xpZW50KSB7Ci0gICAgICAgIG1QYXJlbnRTaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBNZXRob2QgUHJvZmlsaW5nIGZpbGUgZm9yIGFwcGxpY2F0aW9uICclMSRzJy5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIGxvZ2NhdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIFN0cmluZyByZW1vdGVGaWxlUGF0aCwgZmluYWwgQ2xpZW50IGNsaWVudCkgewotICAgICAgICBtUGFyZW50U2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUZpbGVQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZG93bmxvYWQgdHJhY2UgZmlsZTogdW5rbm93biBmaWxlIG5hbWUuXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBkaXNjb25uZWN0ZWQgdGhlIGRldmljZSB3aGlsZSByZWNvcmRpbmcgdGhlIHRyYWNlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgSURldmljZSBkZXZpY2UgPSBjbGllbnQuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzeW5jIHNlcnZpY2UgdG8gcHVsbCB0aGUgSFBST0YgZmlsZQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTeW5jU2VydmljZSBzeW5jID0gY2xpZW50LmdldERldmljZSgpLmdldFN5bmNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1bGxBbmRPcGVuKHN5bmMsIHJlbW90ZUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiVW5hYmxlIHRvIGRvd25sb2FkIHRyYWNlIGZpbGUgZnJvbSBkZXZpY2UgJyUxJHMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIlVuYWJsZSB0byBkb3dubG9hZCB0cmFjZSBmaWxlIGZyb20gZGV2aWNlICclMSRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdWxsQW5kT3BlbihTeW5jU2VydmljZSBzeW5jLCBTdHJpbmcgcmVtb3RlRmlsZVBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2V0IGEgdGVtcCBmaWxlCi0gICAgICAgIEZpbGUgdGVtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFuZHJvaWQiLCAiLnRyYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBTdHJpbmcgdGVtcFBhdGggPSB0ZW1wLmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgICAgIC8vIHB1bGwgdGhlIGZpbGUKLSAgICAgICAgU3luY1Jlc3VsdCByZXN1bHQgPSBwdWxsKHN5bmMsIHRlbXBQYXRoLCByZW1vdGVGaWxlUGF0aCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRDb2RlKCkgPT0gU3luY1NlcnZpY2UuUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3BlbiB0aGUgdGVtcCBmaWxlIGluIHRyYWNldmlldwotICAgICAgICAgICAgICAgIG9wZW5JblRyYWNldmlldyh0ZW1wUGF0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiVW5hYmxlIHRvIGRvd25sb2FkIHRyYWNlIGZpbGU6XG5cbiUxJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuLgotICAgICAgICAgICAgZGlzcGxheUVycm9yKCJVbmFibGUgdG8gZG93bmxvYWQgdHJhY2UgZmlsZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvcGVuSW5UcmFjZXZpZXcoU3RyaW5nIHRlbXBQYXRoKSB7Ci0gICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGZpbGUsIHdlIG5lZWQgdG8gbGF1bmNoIHRyYWNldmlldwotICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgY29tbWFuZFswXSA9IERkbVVpUHJlZmVyZW5jZXMuZ2V0VHJhY2V2aWV3KCk7Ci0gICAgICAgIGNvbW1hbmRbMV0gPSB0ZW1wUGF0aDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgUHJvY2VzcyBwID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGhyZWFkIGZvciB0aGUgb3V0cHV0Ci0gICAgICAgICAgICBuZXcgVGhyZWFkKCJUcmFjZXZpZXcgb3V0cHV0IikgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIHRvIHJlYWQgdGhlIHN0ZGVyciBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocC5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVzdWx0UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlc3VsdFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGRtQ29uc29sZS5wcmludEVycm9yVG9Db25zb2xlKCJUcmFjZXZpZXc6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIHAud2FpdEZvcigpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoInRyYWNldmlldyIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgidHJhY2V2aWV3IiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG1QYXJlbnRTaGVsbCwgIk1ldGhvZCBQcm9maWxpbmcgRXJyb3IiLAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoZm9ybWF0LCBhcmdzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9Db29yZGluYXRlQ29udHJvbHMuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vQ29vcmRpbmF0ZUNvbnRyb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGE3YWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9Db29yZGluYXRlQ29udHJvbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBFbmNhcHN1bGF0aW9uIG9mIGNvbnRyb2xzIGhhbmRsaW5nIGEgbG9jYXRpb24gY29vcmRpbmF0ZSBpbiBkZWNpbWFsIGFuZCBzZXhhZ2VzaW1hbC4KLSAqIDxwLz5UaGlzIGhhbmRsZSB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGJvdGggbW9kZXMgYXV0b21hdGljYWxseSBieSB1c2luZyBhIHtAbGluayBNb2RpZnlMaXN0ZW5lcn0KLSAqIG9uIGFsbCB0aGUge0BsaW5rIFRleHR9IHdpZGdldHMuCi0gKiA8cC8+VG8gZ2V0L3NldCB0aGUgY29vcmRpbmF0ZSwgdXNlIHtAbGluayAjc2V0VmFsdWUoZG91YmxlKX0gYW5kIHtAbGluayAjZ2V0VmFsdWUoKX0gKHByZWNlZGVkIGJ5Ci0gKiBhIGNhbGwgdG8ge0BsaW5rICNpc1ZhbHVlVmFsaWQoKX0pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb29yZGluYXRlQ29udHJvbHMgewotICAgIHByaXZhdGUgZG91YmxlIG1WYWx1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZhbHVlVmFsaWRpdHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIFRleHQgbURlY2ltYWxUZXh0OwotICAgIHByaXZhdGUgVGV4dCBtU2V4YWdlc2ltYWxEZWdyZWVUZXh0OwotICAgIHByaXZhdGUgVGV4dCBtU2V4YWdlc2ltYWxNaW51dGVUZXh0OwotICAgIHByaXZhdGUgVGV4dCBtU2V4YWdlc2ltYWxTZWNvbmRUZXh0OwotICAgIAotICAgIC8qKiBJbnRlcm5hbCBmbGFnIHRvIHByZXZlbnQge0BsaW5rIE1vZGlmeUV2ZW50fSB0byBiZSBzZW50IHdoZW4ge0BsaW5rIFRleHQjc2V0VGV4dChTdHJpbmcpfQotICAgICAqIGlzIGNhbGxlZC4gVGhpcyBpcyBhbiBpbnQgaW5zdGVhZCBvZiBhIGJvb2xlYW4gdG8gYWN0IGFzIGEgY291bnRlci4gKi8KLSAgICBwcml2YXRlIGludCBtTWFudWFsVGV4dENoYW5nZSA9IDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTW9kaWZ5TGlzdGVuZXIgZm9yIHRoZSAzIHtAbGluayBUZXh0fSBjb250cm9scyBvZiB0aGUgc2V4YWdlc2ltYWwgbW9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1TZXhhZ2VzaW1hbExpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAobU1hbnVhbFRleHRDaGFuZ2UgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtVmFsdWUgPSBnZXRWYWx1ZUZyb21TZXhhZ2VzaW1hbENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAgICAgc2V0VmFsdWVJbnRvRGVjaW1hbENvbnRyb2wobVZhbHVlKTsKLSAgICAgICAgICAgICAgICBtVmFsdWVWYWxpZGl0eSA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHdyb25nIGZvcm1hdCBlbXB0eSB0aGUgZGVjaW1hbCBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtVmFsdWVWYWxpZGl0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc2V0RGVjaW1hbENvbnRyb2xzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBUZXh0fSBjb250cm9sIGZvciB0aGUgZGVjaW1hbCBkaXNwbGF5IG9mIHRoZSBjb29yZGluYXRlLgotICAgICAqIDxwLz5UaGUgY29udHJvbCBpcyBleHBlY3RlZCB0byBiZSBwbGFjZWQgaW4gYSBDb21wb3NpdGUgdXNpbmcgYSB7QGxpbmsgR3JpZExheW91dH0uCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUge0BsaW5rIENvbXBvc2l0ZX0gcGFyZW50IG9mIHRoZSBjb250cm9sLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZURlY2ltYWxUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbURlY2ltYWxUZXh0ID0gY3JlYXRlVGV4dENvbnRyb2wocGFyZW50LCAiLTE5OS45OTk5OTkiLCBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NYW51YWxUZXh0Q2hhbmdlID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WYWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShtRGVjaW1hbFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVJbnRvU2V4YWdlc2ltYWxDb250cm9sKG1WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1WYWx1ZVZhbGlkaXR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyBmb3JtYXQgZW1wdHkgdGhlIHNleGFnZXNpbWFsIGNvbnRyb2xzLgotICAgICAgICAgICAgICAgICAgICBtVmFsdWVWYWxpZGl0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXNldFNleGFnZXNpbWFsQ29udHJvbHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgVGV4dH0gY29udHJvbCBmb3IgdGhlICJkZWdyZWUiIGRpc3BsYXkgb2YgdGhlIGNvb3JkaW5hdGUgaW4gc2V4YWdlc2ltYWwKLSAgICAgKiBtb2RlLgotICAgICAqIDxwLz5UaGUgY29udHJvbCBpcyBleHBlY3RlZCB0byBiZSBwbGFjZWQgaW4gYSBDb21wb3NpdGUgdXNpbmcgYSB7QGxpbmsgR3JpZExheW91dH0uCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUge0BsaW5rIENvbXBvc2l0ZX0gcGFyZW50IG9mIHRoZSBjb250cm9sLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNleGFnZXNpbWFsRGVncmVlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1TZXhhZ2VzaW1hbERlZ3JlZVRleHQgPSBjcmVhdGVUZXh0Q29udHJvbChwYXJlbnQsICItMTk5IiwgbVNleGFnZXNpbWFsTGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBUZXh0fSBjb250cm9sIGZvciB0aGUgIm1pbnV0ZSIgZGlzcGxheSBvZiB0aGUgY29vcmRpbmF0ZSBpbiBzZXhhZ2VzaW1hbAotICAgICAqIG1vZGUuCi0gICAgICogPHAvPlRoZSBjb250cm9sIGlzIGV4cGVjdGVkIHRvIGJlIHBsYWNlZCBpbiBhIENvbXBvc2l0ZSB1c2luZyBhIHtAbGluayBHcmlkTGF5b3V0fS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSB7QGxpbmsgQ29tcG9zaXRlfSBwYXJlbnQgb2YgdGhlIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2V4YWdlc2ltYWxNaW51dGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVNleGFnZXNpbWFsTWludXRlVGV4dCA9IGNyZWF0ZVRleHRDb250cm9sKHBhcmVudCwgIjk5IiwgbVNleGFnZXNpbWFsTGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUge0BsaW5rIFRleHR9IGNvbnRyb2wgZm9yIHRoZSAic2Vjb25kIiBkaXNwbGF5IG9mIHRoZSBjb29yZGluYXRlIGluIHNleGFnZXNpbWFsCi0gICAgICogbW9kZS4KLSAgICAgKiA8cC8+VGhlIGNvbnRyb2wgaXMgZXhwZWN0ZWQgdG8gYmUgcGxhY2VkIGluIGEgQ29tcG9zaXRlIHVzaW5nIGEge0BsaW5rIEdyaWRMYXlvdXR9LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHtAbGluayBDb21wb3NpdGV9IHBhcmVudCBvZiB0aGUgY29udHJvbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTZXhhZ2VzaW1hbFNlY29uZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtU2V4YWdlc2ltYWxTZWNvbmRUZXh0ID0gY3JlYXRlVGV4dENvbnRyb2wocGFyZW50LCAiOTkuOTk5IiwgbVNleGFnZXNpbWFsTGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvb3JkaW5hdGUgaW50byB0aGUge0BsaW5rIFRleHR9IGNvbnRyb2xzLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29vcmRpbmF0ZSB2YWx1ZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICBtVmFsdWVWYWxpZGl0eSA9IHRydWU7Ci0gICAgICAgIHNldFZhbHVlSW50b0RlY2ltYWxDb250cm9sKHZhbHVlKTsKLSAgICAgICAgc2V0VmFsdWVJbnRvU2V4YWdlc2ltYWxDb250cm9sKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgY29udHJvbChzKSBpcyB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbHVlVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWVWYWxpZGl0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIHNldCBpbiB0aGUgY29udHJvbChzKS4KLSAgICAgKiA8cC8+VGhpcyB2YWx1ZSBjYW4gYmUgZXJyb25lb3VzLCBhbmQgYSBjaGVjayB3aXRoIHtAbGluayAjaXNWYWx1ZVZhbGlkKCl9IHNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBiZWZvcmUgYW55IGNhbGwgdG8gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbGwgdGhlIHtAbGluayBUZXh0fSBjb250cm9scy4KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCB0aGUgZW5hYmxlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtRGVjaW1hbFRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgbVNleGFnZXNpbWFsRGVncmVlVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBtU2V4YWdlc2ltYWxNaW51dGVUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1TZXhhZ2VzaW1hbFNlY29uZFRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0RGVjaW1hbENvbnRyb2xzKCkgewotICAgICAgICBtTWFudWFsVGV4dENoYW5nZSsrOwotICAgICAgICBtRGVjaW1hbFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbU1hbnVhbFRleHRDaGFuZ2UtLTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRTZXhhZ2VzaW1hbENvbnRyb2xzKCkgewotICAgICAgICBtTWFudWFsVGV4dENoYW5nZSsrOwotICAgICAgICBtU2V4YWdlc2ltYWxEZWdyZWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1TZXhhZ2VzaW1hbE1pbnV0ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbVNleGFnZXNpbWFsU2Vjb25kVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtTWFudWFsVGV4dENoYW5nZS0tOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHR9IHdpdGggYSBnaXZlbiBwYXJlbnQsIGRlZmF1bHQgc3RyaW5nIGFuZCBhIHtAbGluayBNb2RpZnlMaXN0ZW5lcn0KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0uCi0gICAgICogQHBhcmFtIGRlZmF1bHRTdHJpbmcgdGhlIGRlZmF1bHQgc3RyaW5nIHRvIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUge0BsaW5rIFRleHR9IGNvbnRyb2wKLSAgICAgKiBzaXplIGhpbnQuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSB7QGxpbmsgTW9kaWZ5TGlzdGVuZXJ9IHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB7QGxpbmsgVGV4dH0gY29udHJvbCBpcwotICAgICAqIG1vZGlmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgVGV4dCBjcmVhdGVUZXh0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFN0cmluZywKLSAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29udHJvbAotICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTEVGVCB8IFNXVC5TSU5HTEUpOwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciB0byBpdC4KLSAgICAgICAgdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIAotICAgICAgICAvLyBjb21wdXRlIGl0cyBzaXplLwotICAgICAgICBtTWFudWFsVGV4dENoYW5nZSsrOwotICAgICAgICB0ZXh0LnNldFRleHQoZGVmYXVsdFN0cmluZyk7Ci0gICAgICAgIHRleHQucGFjaygpOwotICAgICAgICBQb2ludCBzaXplID0gdGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICB0ZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1NYW51YWxUZXh0Q2hhbmdlLS07Ci0gICAgICAgIAotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSBzaXplLng7Ci0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBkb3VibGUgZ2V0VmFsdWVGcm9tU2V4YWdlc2ltYWxDb250cm9scygpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBkb3VibGUgZGVncmVlcyA9IERvdWJsZS5wYXJzZURvdWJsZShtU2V4YWdlc2ltYWxEZWdyZWVUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGRvdWJsZSBtaW51dGVzID0gRG91YmxlLnBhcnNlRG91YmxlKG1TZXhhZ2VzaW1hbE1pbnV0ZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgZG91YmxlIHNlY29uZHMgPSBEb3VibGUucGFyc2VEb3VibGUobVNleGFnZXNpbWFsU2Vjb25kVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc1Bvc2l0aXZlID0gKGRlZ3JlZXMgPj0gMC4pOwotICAgICAgICBkZWdyZWVzID0gTWF0aC5hYnMoZGVncmVlcyk7Ci0KLSAgICAgICAgZG91YmxlIHZhbHVlID0gZGVncmVlcyArIG1pbnV0ZXMgLyA2MC4gKyBzZWNvbmRzIC8gMzYwMC47IAotICAgICAgICByZXR1cm4gaXNQb3NpdGl2ZSA/IHZhbHVlIDogLSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVJbnRvRGVjaW1hbENvbnRyb2woZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIG1NYW51YWxUZXh0Q2hhbmdlKys7Ci0gICAgICAgIG1EZWNpbWFsVGV4dC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIiUuNmYiLCB2YWx1ZSkpOwotICAgICAgICBtTWFudWFsVGV4dENoYW5nZS0tOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVJbnRvU2V4YWdlc2ltYWxDb250cm9sKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICAvLyBnZXQgdGhlIHNpZ24gYW5kIG1ha2UgdGhlIG51bWJlciBwb3NpdGl2ZSBubyBtYXR0ZXIgd2hhdC4KLSAgICAgICAgYm9vbGVhbiBpc1Bvc2l0aXZlID0gKHZhbHVlID49IDAuKTsKLSAgICAgICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIGRlZ3JlZQotICAgICAgICBkb3VibGUgZGVncmVlcyA9IE1hdGguZmxvb3IodmFsdWUpOwotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBtaW51dGVzCi0gICAgICAgIGRvdWJsZSBtaW51dGVzID0gTWF0aC5mbG9vcigodmFsdWUgLSBkZWdyZWVzKSAqIDYwLik7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIHNlY29uZHMuCi0gICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKHZhbHVlIC0gZGVncmVlcykgKiAzNjAwLiAtIG1pbnV0ZXMgKiA2MC47Ci0gICAgICAgIAotICAgICAgICBtTWFudWFsVGV4dENoYW5nZSsrOwotICAgICAgICBtU2V4YWdlc2ltYWxEZWdyZWVUZXh0LnNldFRleHQoCi0gICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpc1Bvc2l0aXZlID8gKGludClkZWdyZWVzIDogKGludCktIGRlZ3JlZXMpKTsKLSAgICAgICAgbVNleGFnZXNpbWFsTWludXRlVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoKGludCltaW51dGVzKSk7Ci0gICAgICAgIG1TZXhhZ2VzaW1hbFNlY29uZFRleHQuc2V0VGV4dChTdHJpbmcuZm9ybWF0KCIlLjNmIiwgc2Vjb25kcykpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1NYW51YWxUZXh0Q2hhbmdlLS07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9HcHhQYXJzZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vR3B4UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDMzN2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9HcHhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi0vKioKLSAqIEEgdmVyeSBiYXNpYyBHUFggcGFyc2VyIHRvIG1lZXQgdGhlIG5lZWQgb2YgdGhlIGVtdWxhdG9yIGNvbnRyb2wgcGFuZWwuCi0gKiA8cC8+Ci0gKiBJdCBwYXJzZXMgYmFzaWMgd2F5cG9pbnQgaW5mb3JtYXRpb24sIGFuZCB0cmFja3MgKG1lcmdpbmcgc2VnbWVudHMpLgotICovCi1wdWJsaWMgY2xhc3MgR3B4UGFyc2VyIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfR1BYID0gImh0dHA6Ly93d3cudG9wb2dyYWZpeC5jb20vR1BYLzEvMSI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX1dBWVBPSU5UID0gIndwdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9ERV9UUkFDSyA9ICJ0cmsiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfVFJBQ0tfU0VHTUVOVCA9ICJ0cmtzZWciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfVFJBQ0tfUE9JTlQgPSAidHJrcHQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX1RJTUUgPSAidGltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9ERV9FTEVWQVRJT04gPSAiZWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0RFU0NSSVBUSU9OID0gImRlc2MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTE9OR0lUVURFID0gImxvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9MQVRJVFVERSA9ICJsYXQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBzUGFyc2VyRmFjdG9yeTsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBzUGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgc1BhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZpbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBHcHhIYW5kbGVyIG1IYW5kbGVyOwotICAgIAotICAgIC8qKiBQYXR0ZXJuIHRvIHBhcnNlIHRpbWUgd2l0aCBvcHRpb25hbCBzdWItc2Vjb25kIHByZWNpc2lvbiwgYW5kIG9wdGlvbmFsCi0gICAgICogWiBpbmRpY2F0aW5nIHRoZSB0aW1lIGlzIGluIFVUQy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIElTTzg2MDFfVElNRSA9Ci0gICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKFxcZHs0fSktKFxcZFxcZCktKFxcZFxcZClUKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkoPzooXFwuXFxkKykpPyhaKT8iKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIEhhbmRsZXIgZm9yIHRoZSBTQVggcGFyc2VyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdweEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0gICAgICAgIC8vIC0tLS0tLS0tLSBwYXJzZWQgZGF0YSAtLS0tLS0tLS0gCi0gICAgICAgIExpc3Q8V2F5UG9pbnQ+IG1XYXlQb2ludHM7Ci0gICAgICAgIExpc3Q8VHJhY2s+IG1UcmFja0xpc3Q7Ci0gICAgICAgIAotICAgICAgICAvLyAtLS0tLS0tLS0gc3RhdGUgZm9yIHBhcnNpbmcgLS0tLS0tLS0tIAotICAgICAgICBUcmFjayBtQ3VycmVudFRyYWNrOwotICAgICAgICBUcmFja1BvaW50IG1DdXJyZW50VHJhY2tQb2ludDsKLSAgICAgICAgV2F5UG9pbnQgbUN1cnJlbnRXYXlQb2ludDsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtU3RyaW5nQWNjdW11bGF0b3IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBtU3VjY2VzcyA9IHRydWU7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBzdGFuZGFyZCBHUFggbm9kZXMuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChOU19HUFguZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5PREVfV0FZUE9JTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2F5UG9pbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2F5UG9pbnRzID0gbmV3IEFycmF5TGlzdDxXYXlQb2ludD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbVdheVBvaW50cy5hZGQobUN1cnJlbnRXYXlQb2ludCA9IG5ldyBXYXlQb2ludCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uKG1DdXJyZW50V2F5UG9pbnQsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5PREVfVFJBQ0suZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxUcmFjaz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTGlzdC5hZGQobUN1cnJlbnRUcmFjayA9IG5ldyBUcmFjaygpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX1RSQUNLX1NFR01FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZG8gbm90aGluZyBoZXJlLiBUaGlzIHdpbGwgbWVyZ2UgYWxsIHRoZSBzZWdtZW50cyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHNpbmdsZSBUcmFja1BvaW50IGxpc3QgaW4gdGhlIFRyYWNrLgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5PREVfVFJBQ0tfUE9JTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrLmFkZFBvaW50KG1DdXJyZW50VHJhY2tQb2ludCA9IG5ldyBUcmFja1BvaW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uKG1DdXJyZW50VHJhY2tQb2ludCwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIG5vIG1hdHRlciB0aGUgbm9kZSwgd2UgZW1wdHkgdGhlIFN0cmluZ0J1aWxkZXIgYWNjdW11bGF0b3Igd2hlbiB3ZSBzdGFydAotICAgICAgICAgICAgICAgIC8vIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgbVN0cmluZ0FjY3VtdWxhdG9yLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcm9jZXNzZXMgbmV3IGNoYXJhY3RlcnMgZm9yIHRoZSBub2RlIGNvbnRlbnQuIFRoZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgc3RvcmVkLAotICAgICAgICAgKiBhbmQgd2lsbCBiZSBwcm9jZXNzZWQgd2hlbiB7QGxpbmsgI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IGlzIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG1TdHJpbmdBY2N1bXVsYXRvci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoTlNfR1BYLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE5PREVfV0FZUE9JTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXYXlQb2ludCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX1RSQUNLLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTk9ERV9UUkFDS19QT0lOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrUG9pbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTk9ERV9OQU1FLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2suc2V0TmFtZShtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRXYXlQb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdheVBvaW50LnNldE5hbWUobVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX1RJTUUuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tQb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrUG9pbnQuc2V0VGltZShjb21wdXRlVGltZShtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX0VMRVZBVElPTi5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja1BvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tQb2ludC5zZXRFbGV2YXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZShtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50V2F5UG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXYXlQb2ludC5zZXRFbGV2YXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZShtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX0RFU0NSSVBUSU9OLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFdheVBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V2F5UG9pbnQuc2V0RGVzY3JpcHRpb24obVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnRzIHRoZSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIHRpbWUgaW50byBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2guCi0gICAgICAgICAqIEBwYXJhbSB0aW1lU3RyaW5nIHRoZSBzdHJpbmcgZGF0YS4KLSAgICAgICAgICogQHJldHVybiBkYXRlIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgbG9uZyBjb21wdXRlVGltZShTdHJpbmcgdGltZVN0cmluZykgewotICAgICAgICAgICAgLy8gVGltZSBsb29rcyBsaWtlOiAyMDA4LTA0LTA1VDE5OjI0OjUwWgotICAgICAgICAgICAgTWF0Y2hlciBtID0gSVNPODYwMV9USU1FLm1hdGNoZXIodGltZVN0cmluZyk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHZhcmlvdXMgZWxlbWVudHMgYW5kIHJlY29uc3RydWN0IHRpbWUgYXMgYSBsb25nLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5ZWFyID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vbnRoID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRhdGUgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMykpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaG91ck9mRGF5ID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDQpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbnV0ZSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCg1KSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNikpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICBpbnQgbWlsbGlzZWNvbmRzID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViU2Vjb25kR3JvdXAgPSBtLmdyb3VwKDcpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViU2Vjb25kR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gKGludCkoMTAwMCAqIERvdWJsZS5wYXJzZURvdWJsZShzdWJTZWNvbmRHcm91cCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHV0Y1RpbWUgPSBtLmdyb3VwKDgpICE9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIGNvbnZlcnQgaW50byBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2guCi0gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyIGM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1dGNUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGMuc2V0KHllYXIsIG1vbnRoLCBkYXRlLCBob3VyT2ZEYXksIG1pbnV0ZSwgc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmdldFRpbWVJbk1pbGxpcygpICsgbWlsbGlzZWNvbmRzOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBpcyBpbnZhbGlkLCB3ZSdsbCByZXR1cm4gLTEgYmVsb3cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbnZhbGlkIHRpbWUhCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIYW5kbGVzIHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGVzIGFuZCBzdG9yZSB0aGVtIGludG8gYSB7QGxpbmsgTG9jYXRpb25Qb2ludH0uCi0gICAgICAgICAqIEBwYXJhbSBsb2NhdGlvbk5vZGUgdGhlIHtAbGluayBMb2NhdGlvblBvaW50fSB0byByZWNlaXZlIHRoZSBsb2NhdGlvbiBkYXRhLgotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBYTUwgbm9kZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVMb2NhdGlvbihMb2NhdGlvblBvaW50IGxvY2F0aW9uTm9kZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvdWJsZSBsb25naXR1ZGUgPSBEb3VibGUucGFyc2VEb3VibGUoYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0xPTkdJVFVERSkpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSA9IERvdWJsZS5wYXJzZURvdWJsZShhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTEFUSVRVREUpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsb2NhdGlvbk5vZGUuc2V0TG9jYXRpb24obG9uZ2l0dWRlLCBsYXRpdHVkZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHdyb25nIGRhdGEsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBXYXlQb2ludFtdIGdldFdheVBvaW50cygpIHsKLSAgICAgICAgICAgIGlmIChtV2F5UG9pbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVdheVBvaW50cy50b0FycmF5KG5ldyBXYXlQb2ludFttV2F5UG9pbnRzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFRyYWNrW10gZ2V0VHJhY2tzKCkgewotICAgICAgICAgICAgaWYgKG1UcmFja0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVHJhY2tMaXN0LnRvQXJyYXkobmV3IFRyYWNrW21UcmFja0xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGdldFN1Y2Nlc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIEdQUyB0cmFjay4KLSAgICAgKiA8cC8+QSB0cmFjayBpcyBjb21wb3NlZCBvZiBhIGxpc3Qgb2Yge0BsaW5rIFRyYWNrUG9pbnR9IGFuZCBvcHRpb25hbCBuYW1lIGFuZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVHJhY2sgewotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQ7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxUcmFja1BvaW50PiBtUG9pbnRzID0gbmV3IEFycmF5TGlzdDxUcmFja1BvaW50PigpOwotCi0gICAgICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotICAgICAgICAgICAgbUNvbW1lbnQgPSBjb21tZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgYWRkUG9pbnQoVHJhY2tQb2ludCB0cmFja1BvaW50KSB7Ci0gICAgICAgICAgICBtUG9pbnRzLmFkZCh0cmFja1BvaW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFRyYWNrUG9pbnRbXSBnZXRQb2ludHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvaW50cy50b0FycmF5KG5ldyBUcmFja1BvaW50W21Qb2ludHMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEZpcnN0UG9pbnRUaW1lKCkgewotICAgICAgICAgICAgaWYgKG1Qb2ludHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUG9pbnRzLmdldCgwKS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldExhc3RQb2ludFRpbWUoKSB7Ci0gICAgICAgICAgICBpZiAobVBvaW50cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qb2ludHMuZ2V0KG1Qb2ludHMuc2l6ZSgpLTEpLmdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGdldFBvaW50Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvaW50cy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBHUFggcGFyc2VyIGZvciBhIGZpbGUgc3BlY2lmaWVkIGJ5IGl0cyBmdWxsIHBhdGguCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBmdWxsIHBhdGggb2YgdGhlIEdQWCBmaWxlIHRvIHBhcnNlLgotICAgICAqLwotICAgIHB1YmxpYyBHcHhQYXJzZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIG1GaWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgR1BYIGZpbGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBhcnNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IHNQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCi0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBHcHhIYW5kbGVyKCk7Ci0KLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIobUZpbGVOYW1lKSksIG1IYW5kbGVyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG1IYW5kbGVyLmdldFN1Y2Nlc3MoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyc2VkIHtAbGluayBXYXlQb2ludH0gb2JqZWN0cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3ZXJlIGZvdW5kIChvcgotICAgICAqIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgV2F5UG9pbnRbXSBnZXRXYXlQb2ludHMoKSB7Ci0gICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUhhbmRsZXIuZ2V0V2F5UG9pbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJzZWQge0BsaW5rIFRyYWNrfSBvYmplY3RzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdlcmUgZm91bmQgKG9yCi0gICAgICogaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBUcmFja1tdIGdldFRyYWNrcygpIHsKLSAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtSGFuZGxlci5nZXRUcmFja3MoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9LbWxQYXJzZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vS21sUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDg1YWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9LbWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBIHZlcnkgYmFzaWMgS01MIHBhcnNlciB0byBtZWV0IHRoZSBuZWVkIG9mIHRoZSBlbXVsYXRvciBjb250cm9sIHBhbmVsLgotICogPHAvPgotICogSXQgcGFyc2VzIGJhc2ljIFBsYWNlbWFyayBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEttbFBhcnNlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX0tNTF8yID0gImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX1BMQUNFTUFSSyA9ICJQbGFjZW1hcmsiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0NPT1JESU5BVEVTID0gImNvb3JkaW5hdGVzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc0xvY2F0aW9uUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFteLF0rKSwoW14sXSspKD86LChbXixdKykpPyIpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3Rvcnkgc1BhcnNlckZhY3Rvcnk7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1BhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNQYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1GaWxlTmFtZTsKLQotICAgIHByaXZhdGUgS21sSGFuZGxlciBtSGFuZGxlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIGZvciB0aGUgU0FYIHBhcnNlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBLbWxIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgICAgICAvLyAtLS0tLS0tLS0gcGFyc2VkIGRhdGEgLS0tLS0tLS0tIAotICAgICAgICBMaXN0PFdheVBvaW50PiBtV2F5UG9pbnRzOwotICAgICAgICAKLSAgICAgICAgLy8gLS0tLS0tLS0tIHN0YXRlIGZvciBwYXJzaW5nIC0tLS0tLS0tLSAKLSAgICAgICAgV2F5UG9pbnQgbUN1cnJlbnRXYXlQb2ludDsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtU3RyaW5nQWNjdW11bGF0b3IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGJvb2xlYW4gbVN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgc3RhbmRhcmQgR1BYIG5vZGVzLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoTlNfS01MXzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOT0RFX1BMQUNFTUFSSy5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1XYXlQb2ludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XYXlQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFdheVBvaW50PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtV2F5UG9pbnRzLmFkZChtQ3VycmVudFdheVBvaW50ID0gbmV3IFdheVBvaW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBubyBtYXR0ZXIgdGhlIG5vZGUsIHdlIGVtcHR5IHRoZSBTdHJpbmdCdWlsZGVyIGFjY3VtdWxhdG9yIHdoZW4gd2Ugc3RhcnQKLSAgICAgICAgICAgICAgICAvLyBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgIG1TdHJpbmdBY2N1bXVsYXRvci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJvY2Vzc2VzIG5ldyBjaGFyYWN0ZXJzIGZvciB0aGUgbm9kZSBjb250ZW50LiBUaGUgY2hhcmFjdGVycyBhcmUgc2ltcGx5IHN0b3JlZCwKLSAgICAgICAgICogYW5kIHdpbGwgYmUgcHJvY2Vzc2VkIHdoZW4ge0BsaW5rICNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfSBpcyBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtU3RyaW5nQWNjdW11bGF0b3IuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKE5TX0tNTF8yKSkgewotICAgICAgICAgICAgICAgIGlmIChOT0RFX1BMQUNFTUFSSy5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdheVBvaW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5PREVfTkFNRS5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRXYXlQb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdheVBvaW50LnNldE5hbWUobVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOT0RFX0NPT1JESU5BVEVTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFdheVBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTG9jYXRpb24obUN1cnJlbnRXYXlQb2ludCwgbVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlcyB0aGUgbG9jYXRpb24gc3RyaW5nIGFuZCBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW50byBhIHtAbGluayBMb2NhdGlvblBvaW50fS4KLSAgICAgICAgICogQHBhcmFtIGxvY2F0aW9uTm9kZSB0aGUge0BsaW5rIExvY2F0aW9uUG9pbnR9IHRvIHJlY2VpdmUgdGhlIGxvY2F0aW9uIGRhdGEuCi0gICAgICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvY2F0aW9uIGluZm8uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VMb2NhdGlvbihMb2NhdGlvblBvaW50IGxvY2F0aW9uTm9kZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG0gPSBzTG9jYXRpb25QYXR0ZXJuLm1hdGNoZXIobG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxvbmdpdHVkZSA9IERvdWJsZS5wYXJzZURvdWJsZShtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGl0dWRlID0gRG91YmxlLnBhcnNlRG91YmxlKG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25Ob2RlLnNldExvY2F0aW9uKGxvbmdpdHVkZSwgbGF0aXR1ZGUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG0uZ3JvdXBDb3VudCgpID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2Ugd2UgaGF2ZSBlbGV2YXRpb24gZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uTm9kZS5zZXRFbGV2YXRpb24oRG91YmxlLnBhcnNlRG91YmxlKG0uZ3JvdXAoMykpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIGRhdGEsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBXYXlQb2ludFtdIGdldFdheVBvaW50cygpIHsKLSAgICAgICAgICAgIGlmIChtV2F5UG9pbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVdheVBvaW50cy50b0FycmF5KG5ldyBXYXlQb2ludFttV2F5UG9pbnRzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZ2V0U3VjY2VzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VjY2VzczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgR1BYIHBhcnNlciBmb3IgYSBmaWxlIHNwZWNpZmllZCBieSBpdHMgZnVsbCBwYXRoLgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgZnVsbCBwYXRoIG9mIHRoZSBHUFggZmlsZSB0byBwYXJzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgS21sUGFyc2VyKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBtRmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIEdQWCBmaWxlLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBzUGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgS21sSGFuZGxlcigpOwotCi0gICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG1GaWxlTmFtZSkpLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBtSGFuZGxlci5nZXRTdWNjZXNzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcnNlZCB7QGxpbmsgV2F5UG9pbnR9IG9iamVjdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2VyZSBmb3VuZCAob3IKLSAgICAgKiBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIFdheVBvaW50W10gZ2V0V2F5UG9pbnRzKCkgewotICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1IYW5kbGVyLmdldFdheVBvaW50cygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL0xvY2F0aW9uUG9pbnQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vTG9jYXRpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI4ZjQxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vTG9jYXRpb25Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgTG9jYXRpb24gYXdhcmUgcG9pbnRzLgotICovCi1jbGFzcyBMb2NhdGlvblBvaW50IHsKLSAgICBwcml2YXRlIGRvdWJsZSBtTG9uZ2l0dWRlOwotICAgIHByaXZhdGUgZG91YmxlIG1MYXRpdHVkZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0VsZXZhdGlvbiA9IGZhbHNlOwotICAgIHByaXZhdGUgZG91YmxlIG1FbGV2YXRpb247Ci0KLSAgICBmaW5hbCB2b2lkIHNldExvY2F0aW9uKGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBsYXRpdHVkZSkgewotICAgICAgICBtTG9uZ2l0dWRlID0gbG9uZ2l0dWRlOwotICAgICAgICBtTGF0aXR1ZGUgPSBsYXRpdHVkZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGRvdWJsZSBnZXRMb25naXR1ZGUoKSB7Ci0gICAgICAgIHJldHVybiBtTG9uZ2l0dWRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgZG91YmxlIGdldExhdGl0dWRlKCkgewotICAgICAgICByZXR1cm4gbUxhdGl0dWRlOwotICAgIH0KLQotICAgIGZpbmFsIHZvaWQgc2V0RWxldmF0aW9uKGRvdWJsZSBlbGV2YXRpb24pIHsKLSAgICAgICAgbUVsZXZhdGlvbiA9IGVsZXZhdGlvbjsKLSAgICAgICAgbUhhc0VsZXZhdGlvbiA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0VsZXZhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1IYXNFbGV2YXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0RWxldmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbUVsZXZhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1RyYWNrQ29udGVudFByb3ZpZGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1RyYWNrQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjM3Y2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9UcmFja0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbi5HcHhQYXJzZXIuVHJhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENvbnRlbnQgcHJvdmlkZXIgdG8gZGlzcGxheSB7QGxpbmsgVHJhY2t9IG9iamVjdHMgaW4gYSBUYWJsZS4KLSAqIDxwLz5UaGUgZXhwZWN0ZWQgdHlwZSBmb3IgdGhlIGlucHV0IGlzIHtAbGluayBUcmFja308Y29kZT5bXTwvY29kZT4uIAotICovCi1wdWJsaWMgY2xhc3MgVHJhY2tDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVHJhY2tbXSkgewotICAgICAgICAgICAgcmV0dXJuIChUcmFja1tdKWlucHV0RWxlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vVHJhY2tMYWJlbFByb3ZpZGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1RyYWNrTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQxZjdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vVHJhY2tMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvY2F0aW9uLkdweFBhcnNlci5UcmFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogTGFiZWwgUHJvdmlkZXIgZm9yIHtAbGluayBUYWJsZX0gb2JqZWN0cyBkaXNwbGF5aW5nIHtAbGluayBUcmFja30gb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNrTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmFjaykgewotICAgICAgICAgICAgVHJhY2sgdHJhY2sgPSAoVHJhY2spZWxlbWVudDsKLSAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjay5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh0cmFjay5nZXRQb2ludENvdW50KCkpOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gdHJhY2suZ2V0Rmlyc3RQb2ludFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgdGltZSA9IHRyYWNrLmdldExhc3RQb2ludFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrLmdldENvbW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1RyYWNrUG9pbnQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vVHJhY2tQb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdmNGJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vVHJhY2tQb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9jYXRpb247Ci0KLQotLyoqCi0gKiBBIFRyYWNrIFBvaW50LgotICogPHAvPkEgdHJhY2sgcG9pbnQgaXMgYSBwb2ludCBpbiB0aW1lIGFuZCBzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNrUG9pbnQgZXh0ZW5kcyBMb2NhdGlvblBvaW50IHsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWU7Ci0KLSAgICB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7Ci0gICAgICAgIG1UaW1lID0gdGltZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UaW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vV2F5UG9pbnQuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vV2F5UG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ODBiZC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1dheVBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotLyoqCi0gKiBBIEdQUy9LTUwgd2F5IHBvaW50LgotICogPHAvPkEgd2F5cG9pbnQgaXMgYSB1c2VyIHNwZWNpZmllZCBsb2NhdGlvbiwgd2l0aCBhIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2F5UG9pbnQgZXh0ZW5kcyBMb2NhdGlvblBvaW50IHsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0KLSAgICB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vV2F5UG9pbnRDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vV2F5UG9pbnRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlZDc3Ny4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvY2F0aW9uL1dheVBvaW50Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29udGVudCBwcm92aWRlciB0byBkaXNwbGF5IHtAbGluayBXYXlQb2ludH0gb2JqZWN0cyBpbiBhIFRhYmxlLgotICogPHAvPlRoZSBleHBlY3RlZCB0eXBlIGZvciB0aGUgaW5wdXQgaXMge0BsaW5rIFdheVBvaW50fTxjb2RlPltdPC9jb2RlPi4gCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXlQb2ludENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBXYXlQb2ludFtdKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFdheVBvaW50W10paW5wdXRFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9XYXlQb2ludExhYmVsUHJvdmlkZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9jYXRpb24vV2F5UG9pbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTZmMWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2NhdGlvbi9XYXlQb2ludExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogTGFiZWwgUHJvdmlkZXIgZm9yIHtAbGluayBUYWJsZX0gb2JqZWN0cyBkaXNwbGF5aW5nIHtAbGluayBXYXlQb2ludH0gb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFdheVBvaW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXYXlQb2ludCkgewotICAgICAgICAgICAgV2F5UG9pbnQgd2F5UG9pbnQgPSAoV2F5UG9pbnQpZWxlbWVudDsKLSAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YXlQb2ludC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJS42ZiIsIHdheVBvaW50LmdldExvbmdpdHVkZSgpKTsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjZmIiwgd2F5UG9pbnQuZ2V0TGF0aXR1ZGUoKSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBpZiAod2F5UG9pbnQuaGFzRWxldmF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmIiwgd2F5UG9pbnQuZ2V0RWxldmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdheVBvaW50LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgLy8gcGFzcwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvQnVnUmVwb3J0SW1wb3J0ZXIuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0J1Z1JlcG9ydEltcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTFhYzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvQnVnUmVwb3J0SW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCdWdSZXBvcnRJbXBvcnRlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19IRUFERVIgPSAiLS0tLS0tIEVWRU5UIExPRyBUQUdTIC0tLS0tLSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19IRUFERVIgPSAiLS0tLS0tIEVWRU5UIExPRyAtLS0tLS0iOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVJfVEFHID0gIi0tLS0tLSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGFnczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Mb2c7Ci0gICAgCi0gICAgcHVibGljIEJ1Z1JlcG9ydEltcG9ydGVyKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCkpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChUQUdfSEVBREVSLmVxdWFscyhsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICByZWFkVGFncyhyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtVGFnczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldExvZygpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRUYWdzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjb250ZW50ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTE9HX0hFQURFUi5lcXVhbHMobGluZSkpIHsKLSAgICAgICAgICAgICAgICBtVGFncyA9IGNvbnRlbnQudG9BcnJheShuZXcgU3RyaW5nW2NvbnRlbnQuc2l6ZSgpXSk7Ci0gICAgICAgICAgICAgICAgcmVhZExvZyhyZWFkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGVudC5hZGQobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZExvZyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoSEVBREVSX1RBRykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50LmFkZChsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1Mb2cgPSBjb250ZW50LnRvQXJyYXkobmV3IFN0cmluZ1tjb250ZW50LnNpemUoKV0pOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlGaWx0ZXJlZExvZy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheUZpbHRlcmVkTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzM4N2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheUZpbHRlcmVkTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheUZpbHRlcmVkTG9nIGV4dGVuZHMgRGlzcGxheUxvZyB7Ci0KLSAgICBwdWJsaWMgRGlzcGxheUZpbHRlcmVkTG9nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgZXZlbnQgdG8gdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCBuZXdFdmVudChFdmVudENvbnRhaW5lciBldmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiB2YWx1ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFZhbHVlRGlzcGxheURlc2NyaXB0b3I+KCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcj4gb2NjdXJyZW5jZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcj4oKTsKLQotICAgICAgICBpZiAoZmlsdGVyRXZlbnQoZXZlbnQsIHZhbHVlRGVzY3JpcHRvcnMsIG9jY3VycmVuY2VEZXNjcmlwdG9ycykpIHsKLSAgICAgICAgICAgIGFkZFRvTG9nKGV2ZW50LCBsb2dQYXJzZXIsIHZhbHVlRGVzY3JpcHRvcnMsIG9jY3VycmVuY2VEZXNjcmlwdG9ycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGRpc3BsYXkgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBkaXNwbGF5IHR5cGUgYXMgYW4gaW50ZWdlcgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIGludCBnZXREaXNwbGF5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERJU1BMQVlfVFlQRV9GSUxURVJFRF9MT0c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheUdyYXBoLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5R3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZmQ3ZS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5R3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudFZhbHVlRGVzY3JpcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5JbnZhbGlkVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuYXhpcy5BeGlzTG9jYXRpb247Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LmF4aXMuTnVtYmVyQXhpczsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucGxvdC5YWVBsb3Q7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnJlbmRlcmVyLnh5LkFic3RyYWN0WFlJdGVtUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnJlbmRlcmVyLnh5LlhZQXJlYVJlbmRlcmVyOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5yZW5kZXJlci54eS5YWUxpbmVBbmRTaGFwZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuTWlsbGlzZWNvbmQ7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5UaW1lU2VyaWVzOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuVGltZVNlcmllc0NvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEaXNwbGF5R3JhcGggZXh0ZW5kcyBFdmVudERpc3BsYXkgewotCi0gICAgcHVibGljIERpc3BsYXlHcmFwaChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCByZXNldFVJKCkgewotICAgICAgICBDb2xsZWN0aW9uPFRpbWVTZXJpZXNDb2xsZWN0aW9uPiBkYXRhc2V0cyA9IG1WYWx1ZVR5cGVEYXRhU2V0TWFwLnZhbHVlcygpOwotICAgICAgICBmb3IgKFRpbWVTZXJpZXNDb2xsZWN0aW9uIGRhdGFzZXQgOiBkYXRhc2V0cykgewotICAgICAgICAgICAgZGF0YXNldC5yZW1vdmVBbGxTZXJpZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9jY3VycmVuY2VEYXRhU2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PY2N1cnJlbmNlRGF0YVNldC5yZW1vdmVBbGxTZXJpZXMoKTsKLSAgICAgICAgfQotICAgICAgICBtVmFsdWVEZXNjcmlwdG9yU2VyaWVzTWFwLmNsZWFyKCk7Ci0gICAgICAgIG1PY3VycmVuY2VEZXNjcmlwdG9yU2VyaWVzTWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgVUkgZm9yIHRoZSBldmVudCBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICAgICogQHBhcmFtIGxvZ1BhcnNlciB0aGUgY3VycmVudCBsb2cgcGFyc2VyLgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29udHJvbCAod2hpY2ggbWF5IGhhdmUgY2hpbGRyZW4pLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIsCi0gICAgICAgICAgICBmaW5hbCBJTG9nQ29sdW1uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0Q2hhcnRUaXRsZShsb2dQYXJzZXIpOwotICAgICAgICByZXR1cm4gY3JlYXRlQ29tcG9zaXRlQ2hhcnQocGFyZW50LCBsb2dQYXJzZXIsIHRpdGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGV2ZW50IHRvIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgbmV3RXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgICAgICBBcnJheUxpc3Q8VmFsdWVEaXNwbGF5RGVzY3JpcHRvcj4gdmFsdWVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPigpOwotCi0gICAgICAgIEFycmF5TGlzdDxPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3I+IG9jY3VycmVuY2VEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3I+KCk7Ci0KLSAgICAgICAgaWYgKGZpbHRlckV2ZW50KGV2ZW50LCB2YWx1ZURlc2NyaXB0b3JzLCBvY2N1cnJlbmNlRGVzY3JpcHRvcnMpKSB7Ci0gICAgICAgICAgICB1cGRhdGVDaGFydChldmVudCwgbG9nUGFyc2VyLCB2YWx1ZURlc2NyaXB0b3JzLCBvY2N1cnJlbmNlRGVzY3JpcHRvcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNoYXJ0IHdpdGggdGhlIHtAbGluayBFdmVudENvbnRhaW5lcn0gYnkgYWRkaW5nIHRoZSB2YWx1ZXMvb2NjdXJyZW5jZXMgZGVmaW5lZAotICAgICAqIGJ5IHRoZSB7QGxpbmsgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcn0gYW5kIHtAbGluayBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3J9IG9iamVjdHMgZnJvbQotICAgICAqIHRoZSB0d28gbGlzdHMuCi0gICAgICogPHAvPlRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm9uIGVtcHR5LgotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIKLSAgICAgKiBAcGFyYW0gdmFsdWVEZXNjcmlwdG9ycwotICAgICAqIEBwYXJhbSBvY2N1cnJlbmNlRGVzY3JpcHRvcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2hhcnQoRXZlbnRDb250YWluZXIgZXZlbnQsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlciwKLSAgICAgICAgICAgIEFycmF5TGlzdDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiB2YWx1ZURlc2NyaXB0b3JzLAotICAgICAgICAgICAgQXJyYXlMaXN0PE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcj4gb2NjdXJyZW5jZURlc2NyaXB0b3JzKSB7Ci0gICAgICAgIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHRhZ01hcCA9IGxvZ1BhcnNlci5nZXRUYWdNYXAoKTsKLQotICAgICAgICBNaWxsaXNlY29uZCBtaWxsaXNlY29uZFRpbWUgPSBudWxsOwotICAgICAgICBsb25nIG1zZWMgPSAtMTsKLQotICAgICAgICAvLyBJZiB0aGUgZXZlbnQgY29udGFpbmVyIGlzIGEgY3B1IGNvbnRhaW5lciAodGFnID09IDI3MjEpLCBhbmQgdGhlcmUgaXMgbm8gZGVzY3JpcHRvcgotICAgICAgICAvLyBmb3IgdGhlIHRvdGFsIENQVSBsb2FkLCB0aGVuIHdlIGRvIGFjY3VtdWxhdGUgYWxsIHRoZSB2YWx1ZXMuCi0gICAgICAgIGJvb2xlYW4gYWNjdW11bGF0ZVZhbHVlcyA9IGZhbHNlOwotICAgICAgICBkb3VibGUgYWNjdW11bGF0ZWRWYWx1ZSA9IDA7Ci0KLSAgICAgICAgaWYgKGV2ZW50Lm1UYWcgPT0gMjcyMSkgewotICAgICAgICAgICAgYWNjdW11bGF0ZVZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHZhbHVlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRlVmFsdWVzICY9IChkZXNjcmlwdG9yLnZhbHVlSW5kZXggIT0gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHZhbHVlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBoYXNobWFwIGZvciB0aGlzIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICBIYXNoTWFwPEludGVnZXIsIFRpbWVTZXJpZXM+IG1hcCA9IG1WYWx1ZURlc2NyaXB0b3JTZXJpZXNNYXAuZ2V0KGRlc2NyaXB0b3IpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBub3QgdGhlcmUgeWV0LCB3ZSBjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFRpbWVTZXJpZXM+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WYWx1ZURlc2NyaXB0b3JTZXJpZXNNYXAucHV0KGRlc2NyaXB0b3IsIG1hcCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBUaW1lU2VyaWVzIGZvciB0aGlzIHBpZAotICAgICAgICAgICAgICAgIFRpbWVTZXJpZXMgdGltZVNlcmllcyA9IG1hcC5nZXQoZXZlbnQucGlkKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LCB3ZSBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgICBpZiAodGltZVNlcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2VyaWVzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcmllc0Z1bGxOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcmllc0xhYmVsID0gZ2V0U2VyaWVzTGFiZWwoZXZlbnQsIGRlc2NyaXB0b3IpOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobVZhbHVlRGVzY3JpcHRvckNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0NIRUNLX1NBTUVfVEFHOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc0Z1bGxOYW1lID0gU3RyaW5nLmZvcm1hdCgiJTEkcyAvICUyJHMiLCBzZXJpZXNMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfQ0hFQ0tfU0FNRV9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXNGdWxsTmFtZSA9IFN0cmluZy5mb3JtYXQoIiUxJHMiLCBzZXJpZXNMYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc0Z1bGxOYW1lID0gU3RyaW5nLmZvcm1hdCgiJTEkcyAvICUyJHM6ICUzJHMiLCBzZXJpZXNMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ01hcC5nZXQoZGVzY3JpcHRvci5ldmVudFRhZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnZhbHVlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRhdGEgc2V0IGZvciB0aGlzIFZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICBUaW1lU2VyaWVzQ29sbGVjdGlvbiBkYXRhc2V0ID0gZ2V0VmFsdWVEYXRhc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1BhcnNlci5nZXRFdmVudEluZm9NYXAoKS5nZXQoZXZlbnQubVRhZylbZGVzY3JpcHRvci52YWx1ZUluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVWYWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc2VyaWVzCi0gICAgICAgICAgICAgICAgICAgIHRpbWVTZXJpZXMgPSBuZXcgVGltZVNlcmllcyhzZXJpZXNGdWxsTmFtZSwgTWlsbGlzZWNvbmQuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU1heGltdW1DaGFydEl0ZW1BZ2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTZXJpZXMuc2V0TWF4aW11bUl0ZW1BZ2UobU1heGltdW1DaGFydEl0ZW1BZ2UgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQuYWRkU2VyaWVzKHRpbWVTZXJpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgbWFwLgotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGV2ZW50LnBpZCwgdGltZVNlcmllcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB0aW1lU2VyaWVzLgotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBldmVudAotICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSA9IGV2ZW50LmdldFZhbHVlQXNEb3VibGUoZGVzY3JpcHRvci52YWx1ZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgdGhlIHZhbHVlcyBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGVWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRWYWx1ZSArPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhY2N1bXVsYXRlZFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdGltZQotICAgICAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZFRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtc2VjID0gKGxvbmcpZXZlbnQuc2VjICogMTAwMEwgKyAoZXZlbnQubnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRUaW1lID0gbmV3IE1pbGxpc2Vjb25kKG5ldyBEYXRlKG1zZWMpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHZhbHVlIHRvIHRoZSB0aW1lIHNlcmllcwotICAgICAgICAgICAgICAgIHRpbWVTZXJpZXMuYWRkT3JVcGRhdGUobWlsbGlzZWNvbmRUaW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgdGhpcyBkZXNjcmlwdG9yIGlmIHRoZXJlJ3MgYSB0eXBlIG1pc21hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogb2NjdXJyZW5jZURlc2NyaXB0b3JzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaGFzaG1hcCBmb3IgdGhpcyBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBUaW1lU2VyaWVzPiBtYXAgPSBtT2N1cnJlbmNlRGVzY3JpcHRvclNlcmllc01hcC5nZXQoZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCB0aGVyZSB5ZXQsIHdlIGNyZWF0ZSBpdC4KLSAgICAgICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgVGltZVNlcmllcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgbU9jdXJyZW5jZURlc2NyaXB0b3JTZXJpZXNNYXAucHV0KGRlc2NyaXB0b3IsIG1hcCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBUaW1lU2VyaWVzIGZvciB0aGlzIHBpZAotICAgICAgICAgICAgICAgIFRpbWVTZXJpZXMgdGltZVNlcmllcyA9IG1hcC5nZXQoZXZlbnQucGlkKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LCB3ZSBjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVTZXJpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VyaWVzTGFiZWwgPSBnZXRTZXJpZXNMYWJlbChldmVudCwgZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcmllc0Z1bGxOYW1lID0gU3RyaW5nLmZvcm1hdCgiWyUxJHM6JTIkc10iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ01hcC5nZXQoZGVzY3JpcHRvci5ldmVudFRhZyksIHNlcmllc0xhYmVsKTsKLQotICAgICAgICAgICAgICAgICAgICB0aW1lU2VyaWVzID0gbmV3IFRpbWVTZXJpZXMoc2VyaWVzRnVsbE5hbWUsIE1pbGxpc2Vjb25kLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NYXhpbXVtQ2hhcnRJdGVtQWdlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2VyaWVzLnNldE1heGltdW1JdGVtQWdlKG1NYXhpbXVtQ2hhcnRJdGVtQWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGdldE9jY3VycmVuY2VEYXRhU2V0KCkuYWRkU2VyaWVzKHRpbWVTZXJpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoZXZlbnQucGlkLCB0aW1lU2VyaWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlcmllcwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aW1lCi0gICAgICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kVGltZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZWMgPSAobG9uZylldmVudC5zZWMgKiAxMDAwTCArIChldmVudC5uc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZFRpbWUgPSBuZXcgTWlsbGlzZWNvbmQobmV3IERhdGUobXNlYykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdmFsdWUgdG8gdGhlIHRpbWUgc2VyaWVzCi0gICAgICAgICAgICAgICAgdGltZVNlcmllcy5hZGRPclVwZGF0ZShtaWxsaXNlY29uZFRpbWUsIDApOyAvLyB0aGUgdmFsdWUgaXMgdW51c2VkCi0gICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgdGhpcyBkZXNjcmlwdG9yIGlmIHRoZXJlJ3MgYSB0eXBlIG1pc21hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgc2VyaWVzIGFuZCByZW1vdmUgb2xkIHZhbHVlcy4KLSAgICAgICAgaWYgKG1zZWMgIT0gLTEgJiYgbU1heGltdW1DaGFydEl0ZW1BZ2UgIT0gLTEpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248SGFzaE1hcDxJbnRlZ2VyLCBUaW1lU2VyaWVzPj4gcGlkTWFwVmFsdWVzID0KLSAgICAgICAgICAgICAgICBtVmFsdWVEZXNjcmlwdG9yU2VyaWVzTWFwLnZhbHVlcygpOwotCi0gICAgICAgICAgICBmb3IgKEhhc2hNYXA8SW50ZWdlciwgVGltZVNlcmllcz4gcGlkTWFwVmFsdWUgOiBwaWRNYXBWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFRpbWVTZXJpZXM+IHNlcmllc0NvbGxlY3Rpb24gPSBwaWRNYXBWYWx1ZS52YWx1ZXMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoVGltZVNlcmllcyB0aW1lU2VyaWVzIDogc2VyaWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aW1lU2VyaWVzLnJlbW92ZUFnZWRJdGVtcyhtc2VjLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBpZE1hcFZhbHVlcyA9IG1PY3VycmVuY2VEZXNjcmlwdG9yU2VyaWVzTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChIYXNoTWFwPEludGVnZXIsIFRpbWVTZXJpZXM+IHBpZE1hcFZhbHVlIDogcGlkTWFwVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxUaW1lU2VyaWVzPiBzZXJpZXNDb2xsZWN0aW9uID0gcGlkTWFwVmFsdWUudmFsdWVzKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKFRpbWVTZXJpZXMgdGltZVNlcmllcyA6IHNlcmllc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVNlcmllcy5yZW1vdmVBZ2VkSXRlbXMobXNlYywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBUaW1lU2VyaWVzQ29sbGVjdGlvbn0gZm9yIGEgc3BlY2lmaWMge0BsaW5rIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZX0uCi0gICAgICogSWYgdGhlIGRhdGEgc2V0IGlzIG5vdCB5ZXQgY3JlYXRlZCwgaXQgaXMgZmlyc3QgYWxsb2NhdGVkIGFuZCBzZXQgdXAgaW50byB0aGUKLSAgICAgKiB7QGxpbmsgb3JnLmpmcmVlLmNoYXJ0LkpGcmVlQ2hhcnR9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZX0gb2YgdGhlIGRhdGEgc2V0LgotICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlVmFsdWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBUaW1lU2VyaWVzQ29sbGVjdGlvbiBnZXRWYWx1ZURhdGFzZXQoRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZSB0eXBlLCBib29sZWFuIGFjY3VtdWxhdGVWYWx1ZXMpIHsKLSAgICAgICAgVGltZVNlcmllc0NvbGxlY3Rpb24gZGF0YXNldCA9IG1WYWx1ZVR5cGVEYXRhU2V0TWFwLmdldCh0eXBlKTsKLSAgICAgICAgaWYgKGRhdGFzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkYXRhIHNldCBhbmQgc3RvcmUgaXQgaW4gdGhlIG1hcAotICAgICAgICAgICAgZGF0YXNldCA9IG5ldyBUaW1lU2VyaWVzQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgbVZhbHVlVHlwZURhdGFTZXRNYXAucHV0KHR5cGUsIGRhdGFzZXQpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlbmRlcmVyIGFuZCBjb25maWd1cmUgaXQgZGVwZW5kaW5nIG9uIHRoZSBWYWx1ZVR5cGUKLSAgICAgICAgICAgIEFic3RyYWN0WFlJdGVtUmVuZGVyZXIgcmVuZGVyZXI7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBFdmVudFZhbHVlRGVzY3JpcHRpb24uVmFsdWVUeXBlLlBFUkNFTlQgJiYgYWNjdW11bGF0ZVZhbHVlcykgewotICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gbmV3IFhZQXJlYVJlbmRlcmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhZTGluZUFuZFNoYXBlUmVuZGVyZXIgciA9IG5ldyBYWUxpbmVBbmRTaGFwZVJlbmRlcmVyKCk7Ci0gICAgICAgICAgICAgICAgci5zZXRCYXNlU2hhcGVzVmlzaWJsZSh0eXBlICE9IEV2ZW50VmFsdWVEZXNjcmlwdGlvbi5WYWx1ZVR5cGUuUEVSQ0VOVCk7Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlciA9IHI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBib3RoIHRoZSBkYXRhc2V0IGFuZCB0aGUgcmVuZGVyZXIgaW4gdGhlIHBsb3Qgb2JqZWN0LgotICAgICAgICAgICAgWFlQbG90IHh5UGxvdCA9IG1DaGFydC5nZXRYWVBsb3QoKTsKLSAgICAgICAgICAgIHh5UGxvdC5zZXREYXRhc2V0KG1EYXRhU2V0Q291bnQsIGRhdGFzZXQpOwotICAgICAgICAgICAgeHlQbG90LnNldFJlbmRlcmVyKG1EYXRhU2V0Q291bnQsIHJlbmRlcmVyKTsKLQotICAgICAgICAgICAgLy8gcHV0IGEgbmV3IGF4aXMgbGFiZWwsIGFuZCBjb25maWd1cmUgaXQuCi0gICAgICAgICAgICBOdW1iZXJBeGlzIGF4aXMgPSBuZXcgTnVtYmVyQXhpcyh0eXBlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBFdmVudFZhbHVlRGVzY3JpcHRpb24uVmFsdWVUeXBlLlBFUkNFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSBwZXJjZW50IHJhbmdlIHRvIGJlICgwLDEwMCkgZml4ZWQuCi0gICAgICAgICAgICAgICAgYXhpcy5zZXRBdXRvUmFuZ2UoZmFsc2UpOwotICAgICAgICAgICAgICAgIGF4aXMuc2V0UmFuZ2UoMC4sIDEwMC4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3IgdGhlIGluZGV4LCB3ZSBpZ25vcmUgdGhlIG9jY3VycmVuY2UgZGF0YXNldAotICAgICAgICAgICAgaW50IGNvdW50ID0gbURhdGFTZXRDb3VudDsKLSAgICAgICAgICAgIGlmIChtT2NjdXJyZW5jZURhdGFTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHh5UGxvdC5zZXRSYW5nZUF4aXMoY291bnQsIGF4aXMpOwotICAgICAgICAgICAgaWYgKChjb3VudCAlIDIpID09IDApIHsKLSAgICAgICAgICAgICAgICB4eVBsb3Quc2V0UmFuZ2VBeGlzTG9jYXRpb24oY291bnQsIEF4aXNMb2NhdGlvbi5CT1RUT01fT1JfTEVGVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHh5UGxvdC5zZXRSYW5nZUF4aXNMb2NhdGlvbihjb3VudCwgQXhpc0xvY2F0aW9uLlRPUF9PUl9SSUdIVCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyB3ZSBsaW5rIHRoZSBkYXRhc2V0IGFuZCB0aGUgYXhpcwotICAgICAgICAgICAgeHlQbG90Lm1hcERhdGFzZXRUb1JhbmdlQXhpcyhtRGF0YVNldENvdW50LCBjb3VudCk7Ci0KLSAgICAgICAgICAgIG1EYXRhU2V0Q291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkYXRhc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc2VyaWVzIGxhYmVsIGZvciB0aGlzIGV2ZW50LiBUaGlzIG9ubHkgY29udGFpbnMgdGhlIHBpZCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIHtAbGluayBFdmVudENvbnRhaW5lcn0KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUge0BsaW5rIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcn0KLSAgICAgKiBAcmV0dXJuIHRoZSBzZXJpZXMgbGFiZWwuCi0gICAgICogQHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcmllc0xhYmVsKEV2ZW50Q29udGFpbmVyIGV2ZW50LCBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkVHlwZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmluY2x1ZGVQaWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZyhkZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyAoJTIkZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0VmFsdWVBc1N0cmluZyhkZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXgpLCBldmVudC5waWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoZXZlbnQucGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGltZVNlcmllc0NvbGxlY3Rpb259IGZvciB0aGUgb2NjdXJyZW5jZSBkaXNwbGF5LiBJZiB0aGUgZGF0YSBzZXQgaXMgbm90Ci0gICAgICogeWV0IGNyZWF0ZWQsIGl0IGlzIGZpcnN0IGFsbG9jYXRlZCBhbmQgc2V0IHVwIGludG8gdGhlIHtAbGluayBvcmcuamZyZWUuY2hhcnQuSkZyZWVDaGFydH0gb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgVGltZVNlcmllc0NvbGxlY3Rpb24gZ2V0T2NjdXJyZW5jZURhdGFTZXQoKSB7Ci0gICAgICAgIGlmIChtT2NjdXJyZW5jZURhdGFTZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbU9jY3VycmVuY2VEYXRhU2V0ID0gbmV3IFRpbWVTZXJpZXNDb2xsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIFhZUGxvdCB4eVBsb3QgPSBtQ2hhcnQuZ2V0WFlQbG90KCk7Ci0gICAgICAgICAgICB4eVBsb3Quc2V0RGF0YXNldChtRGF0YVNldENvdW50LCBtT2NjdXJyZW5jZURhdGFTZXQpOwotCi0gICAgICAgICAgICBPY2N1cnJlbmNlUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgT2NjdXJyZW5jZVJlbmRlcmVyKCk7Ci0gICAgICAgICAgICByZW5kZXJlci5zZXRCYXNlU2hhcGVzVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB4eVBsb3Quc2V0UmVuZGVyZXIobURhdGFTZXRDb3VudCwgcmVuZGVyZXIpOwotCi0gICAgICAgICAgICBtRGF0YVNldENvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbU9jY3VycmVuY2VEYXRhU2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgZGlzcGxheSB0eXBlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGRpc3BsYXkgdHlwZSBhcyBhbiBpbnRlZ2VyCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IGdldERpc3BsYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gRElTUExBWV9UWVBFX0dSQVBIOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQge0BsaW5rIEV2ZW50TG9nUGFyc2VyfSBvYmplY3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TmV3TG9nUGFyc2VyKEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgICAgICBpZiAobUNoYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGFydC5zZXRUaXRsZShnZXRDaGFydFRpdGxlKGxvZ1BhcnNlcikpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtZWFuaW5nZnVsIGNoYXJ0IHRpdGxlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB7QGxpbmsgI21WYWx1ZURlc2NyaXB0b3JDaGVja30uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyIHRoZSBsb2dQYXJzZXIuCi0gICAgICogQHJldHVybiB0aGUgY2hhcnQgdGl0bGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2hhcnRUaXRsZShFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIpIHsKLSAgICAgICAgaWYgKG1WYWx1ZURlc2NyaXB0b3JzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFydERlc2MgPSBudWxsOwotICAgICAgICAgICAgc3dpdGNoIChtVmFsdWVEZXNjcmlwdG9yQ2hlY2spIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0NIRUNLX1NBTUVfVEFHOgotICAgICAgICAgICAgICAgICAgICBpZiAobG9nUGFyc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGVzYyA9IGxvZ1BhcnNlci5nZXRUYWdNYXAoKS5nZXQobVZhbHVlRGVzY3JpcHRvcnMuZ2V0KDApLmV2ZW50VGFnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0NIRUNLX1NBTUVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dQYXJzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnREZXNjID0gU3RyaW5nLmZvcm1hdCgiJTEkcyAvICUyJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dQYXJzZXIuZ2V0VGFnTWFwKCkuZ2V0KG1WYWx1ZURlc2NyaXB0b3JzLmdldCgwKS5ldmVudFRhZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZURlc2NyaXB0b3JzLmdldCgwKS52YWx1ZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhcnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyAtICUyJHMiLCBtTmFtZSwgY2hhcnREZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheUxvZy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheUxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjI5NmYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudFZhbHVlRGVzY3JpcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5JbnZhbGlkVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5EZG1VaVByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlRhYmxlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheUxvZyBleHRlbmRzIEV2ZW50RGlzcGxheSB7Ci0gICAgcHVibGljIERpc3BsYXlMb2coU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTF9EQVRFID0gIkV2ZW50TG9nUGFuZWwubG9nLkNvbDEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTF9QSUQgPSAiRXZlbnRMb2dQYW5lbC5sb2cuQ29sMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQ09MX0VWRU5UVEFHID0gIkV2ZW50TG9nUGFuZWwubG9nLkNvbDMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTF9WQUxVRU5BTUUgPSAiRXZlbnRMb2dQYW5lbC5sb2cuQ29sNCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQ09MX1ZBTFVFID0gIkV2ZW50TG9nUGFuZWwubG9nLkNvbDUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTF9UWVBFID0gIkV2ZW50TG9nUGFuZWwubG9nLkNvbDYiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCByZXNldFVJKCkgewotICAgICAgICBtTG9nVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBldmVudCB0byB0aGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIG5ld0V2ZW50KEV2ZW50Q29udGFpbmVyIGV2ZW50LCBFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIpIHsKLSAgICAgICAgYWRkVG9Mb2coZXZlbnQsIGxvZ1BhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgVUkgZm9yIHRoZSBldmVudCBkaXNwbGF5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyIHRoZSBjdXJyZW50IGxvZyBwYXJzZXIuCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sICh3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbikuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgQ29udHJvbCBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLCBJTG9nQ29sdW1uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUxvZ1VJKHBhcmVudCwgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4ge0BsaW5rIEV2ZW50Q29udGFpbmVyfSB0byB0aGUgbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50ICAgICB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGxvZ1BhcnNlciB0aGUgbG9nIHBhcnNlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9Mb2coRXZlbnRDb250YWluZXIgZXZlbnQsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgICAgICBTY3JvbGxCYXIgYmFyID0gbUxvZ1RhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgICAgIGJvb2xlYW4gc2Nyb2xsID0gYmFyLmdldE1heGltdW0oKSA9PSBiYXIuZ2V0U2VsZWN0aW9uKCkgKyBiYXIuZ2V0VGh1bWIoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGRhdGUuCi0gICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBsb25nIG1zZWMgPSAobG9uZykgZXZlbnQuc2VjICogMTAwMEw7Ci0gICAgICAgIGMuc2V0VGltZUluTWlsbGlzKG1zZWMpOwotCi0gICAgICAgIC8vIGNvbnZlcnQgdGhlIHRpbWUgaW50byBhIHN0cmluZwotICAgICAgICBTdHJpbmcgZGF0ZSA9IFN0cmluZy5mb3JtYXQoIiUxJHRGICUxJHRUIiwgYyk7Ci0KLSAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IGxvZ1BhcnNlci5nZXRUYWdNYXAoKS5nZXQoZXZlbnQubVRhZyk7Ci0gICAgICAgIFN0cmluZyBwaWROYW1lID0gSW50ZWdlci50b1N0cmluZyhldmVudC5waWQpOwotCi0gICAgICAgIC8vIGdldCB0aGUgdmFsdWUgZGVzY3JpcHRpb24KLSAgICAgICAgRXZlbnRWYWx1ZURlc2NyaXB0aW9uW10gdmFsdWVEZXNjcmlwdGlvbiA9IGxvZ1BhcnNlci5nZXRFdmVudEluZm9NYXAoKS5nZXQoZXZlbnQubVRhZyk7Ci0gICAgICAgIGlmICh2YWx1ZURlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVEZXNjcmlwdGlvbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEV2ZW50VmFsdWVEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHZhbHVlRGVzY3JpcHRpb25baV07Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZyhpKTsKLQotICAgICAgICAgICAgICAgICAgICBsb2dWYWx1ZShkYXRlLCBwaWROYW1lLCBldmVudE5hbWUsIGRlc2NyaXB0aW9uLmdldE5hbWUoKSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0RXZlbnRWYWx1ZVR5cGUoKSwgZGVzY3JpcHRpb24uZ2V0VmFsdWVUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nVmFsdWUoZGF0ZSwgcGlkTmFtZSwgZXZlbnROYW1lLCBkZXNjcmlwdGlvbi5nZXROYW1lKCksIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmdldEV2ZW50VmFsdWVUeXBlKCksIGRlc2NyaXB0aW9uLmdldFZhbHVlVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNjcm9sbCBpZiBuZWVkZWQsIGJ5IHNob3dpbmcgdGhlIGxhc3QgaXRlbQotICAgICAgICAgICAgaWYgKHNjcm9sbCkgewotICAgICAgICAgICAgICAgIGludCBpdGVtQ291bnQgPSBtTG9nVGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUxvZ1RhYmxlLnNob3dJdGVtKG1Mb2dUYWJsZS5nZXRJdGVtKGl0ZW1Db3VudCAtIDEpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIHtAbGluayBFdmVudENvbnRhaW5lcn0gdG8gdGhlIGxvZy4gT25seSBhZGQgdGhlIHZhbHVlcy9vY2N1cnJlbmNlcyBkZWZpbmVkIGJ5Ci0gICAgICogdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMuIElmIGFuIGV2ZW50IGlzIGNvbmZpZ3VyZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHZhbHVlIGFuZCBvY2N1cnJlbmNlLAotICAgICAqIG9ubHkgdGhlIHZhbHVlcyBhcmUgZGlzcGxheWVkIChhcyB0aGV5IG1hcmsgYW4gZXZlbnQgb2NjdXJyZW5jZSBhbnl3YXkpLgotICAgICAqIDxwLz5UaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGF0IGxlYXN0IG9uZSBvZiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vbiBlbXB0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIKLSAgICAgKiBAcGFyYW0gdmFsdWVEZXNjcmlwdG9ycwotICAgICAqIEBwYXJhbSBvY2N1cnJlbmNlRGVzY3JpcHRvcnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb0xvZyhFdmVudENvbnRhaW5lciBldmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLAotICAgICAgICAgICAgQXJyYXlMaXN0PFZhbHVlRGlzcGxheURlc2NyaXB0b3I+IHZhbHVlRGVzY3JpcHRvcnMsCi0gICAgICAgICAgICBBcnJheUxpc3Q8T2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBvY2N1cnJlbmNlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgU2Nyb2xsQmFyIGJhciA9IG1Mb2dUYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICBib29sZWFuIHNjcm9sbCA9IGJhci5nZXRNYXhpbXVtKCkgPT0gYmFyLmdldFNlbGVjdGlvbigpICsgYmFyLmdldFRodW1iKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBkYXRlLgotICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgbG9uZyBtc2VjID0gKGxvbmcpIGV2ZW50LnNlYyAqIDEwMDBMOwotICAgICAgICBjLnNldFRpbWVJbk1pbGxpcyhtc2VjKTsKLQotICAgICAgICAvLyBjb252ZXJ0IHRoZSB0aW1lIGludG8gYSBzdHJpbmcKLSAgICAgICAgU3RyaW5nIGRhdGUgPSBTdHJpbmcuZm9ybWF0KCIlMSR0RiAlMSR0VCIsIGMpOwotCi0gICAgICAgIFN0cmluZyBldmVudE5hbWUgPSBsb2dQYXJzZXIuZ2V0VGFnTWFwKCkuZ2V0KGV2ZW50Lm1UYWcpOwotICAgICAgICBTdHJpbmcgcGlkTmFtZSA9IEludGVnZXIudG9TdHJpbmcoZXZlbnQucGlkKTsKLQotICAgICAgICBpZiAodmFsdWVEZXNjcmlwdG9ycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHZhbHVlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgICAgICBsb2dEZXNjcmlwdG9yKGV2ZW50LCBkZXNjcmlwdG9yLCBkYXRlLCBwaWROYW1lLCBldmVudE5hbWUsIGxvZ1BhcnNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3ZSBkaXNwbGF5IHRoZSBldmVudC4gU2luY2UgdGhlIFN0cmluZ0J1aWxkZXIgY29udGFpbnMgdGhlIGhlYWRlciAoZGF0ZSwgZXZlbnQgbmFtZSwKLSAgICAgICAgICAgIC8vIHBpZCkgYXQgdGhpcyBwb2ludCwgdGhlcmUgaXNuJ3QgYW55dGhpbmcgZWxzZSB0byBkaXNwbGF5LgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2Nyb2xsIGlmIG5lZWRlZCwgYnkgc2hvd2luZyB0aGUgbGFzdCBpdGVtCi0gICAgICAgIGlmIChzY3JvbGwpIHsKLSAgICAgICAgICAgIGludCBpdGVtQ291bnQgPSBtTG9nVGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoaXRlbUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIG1Mb2dUYWJsZS5zaG93SXRlbShtTG9nVGFibGUuZ2V0SXRlbShpdGVtQ291bnQgLSAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSB2YWx1ZSBpbiB0aGUgdWkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqIEBwYXJhbSBwaWQKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKiBAcGFyYW0gdmFsdWVOYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIGV2ZW50VmFsdWVUeXBlCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2dWYWx1ZShTdHJpbmcgZGF0ZSwgU3RyaW5nIHBpZCwgU3RyaW5nIGV2ZW50LCBTdHJpbmcgdmFsdWVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlLCBFdmVudENvbnRhaW5lci5FdmVudFZhbHVlVHlwZSBldmVudFZhbHVlVHlwZSwgRXZlbnRWYWx1ZURlc2NyaXB0aW9uLlZhbHVlVHlwZSB2YWx1ZVR5cGUpIHsKLQotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obUxvZ1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgwLCBkYXRlKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KDEsIHBpZCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgyLCBldmVudCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgzLCB2YWx1ZU5hbWUpOwotICAgICAgICBpdGVtLnNldFRleHQoNCwgdmFsdWUpOwotCi0gICAgICAgIFN0cmluZyB0eXBlOwotICAgICAgICBpZiAodmFsdWVUeXBlICE9IEV2ZW50VmFsdWVEZXNjcmlwdGlvbi5WYWx1ZVR5cGUuTk9UX0FQUExJQ0FCTEUpIHsKLSAgICAgICAgICAgIHR5cGUgPSBTdHJpbmcuZm9ybWF0KCIlMSRzLCAlMiRzIiwgZXZlbnRWYWx1ZVR5cGUudG9TdHJpbmcoKSwgdmFsdWVUeXBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IGV2ZW50VmFsdWVUeXBlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpdGVtLnNldFRleHQoNSwgdHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIHZhbHVlIGZyb20gYW4ge0BsaW5rIEV2ZW50Q29udGFpbmVyfSBhcyBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgICAgICB0aGUgRXZlbnRDb250YWluZXIKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgVmFsdWVEaXNwbGF5RGVzY3JpcHRvciBkZWZpbmluZyB3aGljaCB2YWx1ZSB0byBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkYXRlICAgICAgIHRoZSBkYXRlIG9mIHRoZSBldmVudCBpbiBhIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gcGlkTmFtZQotICAgICAqIEBwYXJhbSBldmVudE5hbWUKLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ0Rlc2NyaXB0b3IoRXZlbnRDb250YWluZXIgZXZlbnQsIFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgIFN0cmluZyBkYXRlLCBTdHJpbmcgcGlkTmFtZSwgU3RyaW5nIGV2ZW50TmFtZSwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyKSB7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBldmVudC5nZXRWYWx1ZUFzU3RyaW5nKGRlc2NyaXB0b3IudmFsdWVJbmRleCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBFdmVudFZhbHVlRGVzY3JpcHRpb25bXSB2YWx1ZXMgPSBsb2dQYXJzZXIuZ2V0RXZlbnRJbmZvTWFwKCkuZ2V0KGV2ZW50Lm1UYWcpOwotCi0gICAgICAgIEV2ZW50VmFsdWVEZXNjcmlwdGlvbiB2YWx1ZURlc2NyaXB0aW9uID0gdmFsdWVzW2Rlc2NyaXB0b3IudmFsdWVJbmRleF07Ci0KLSAgICAgICAgbG9nVmFsdWUoZGF0ZSwgcGlkTmFtZSwgZXZlbnROYW1lLCBkZXNjcmlwdG9yLnZhbHVlTmFtZSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgdmFsdWVEZXNjcmlwdGlvbi5nZXRFdmVudFZhbHVlVHlwZSgpLCB2YWx1ZURlc2NyaXB0aW9uLmdldFZhbHVlVHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBVSSBmb3IgYSBsb2cgZGlzcGxheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgICB0aGUgcGFyZW50IHtAbGluayBDb21wb3NpdGV9Ci0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSB7QGxpbmsgSUxvZ0NvbHVtbkxpc3RlbmVyfSB0byBub3RpZnkgb24gY29sdW1uIHJlc2l6ZSBldmVudHMuCi0gICAgICogQHJldHVybiB0aGUgdG9wIENvbXBvc2l0ZSBvZiB0aGUgVUkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUxvZ1VJKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIElMb2dDb2x1bW5MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdsOwotICAgICAgICBtYWluQ29tcC5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIG1haW5Db21wLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtTG9nVGFibGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgbC5zZXRUZXh0KG1OYW1lKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBtTG9nVGFibGUgPSBuZXcgVGFibGUobWFpbkNvbXAsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8Ci0gICAgICAgICAgICAgICAgU1dULkJPUkRFUik7Ci0gICAgICAgIG1Mb2dUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIGNvbCA9IFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1Mb2dUYWJsZSwgIlRpbWUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiMDAwMC0wMC0wMCAwMDowMDowMCIsIFBSRUZTX0NPTF9EQVRFLCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbHVtblJlc2l6ZWQoMCwgKFRhYmxlQ29sdW1uKSBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbUxvZ1RhYmxlLCAicGlkIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwgIjAwMDAiLCBQUkVGU19DT0xfUElELCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbHVtblJlc2l6ZWQoMSwgKFRhYmxlQ29sdW1uKSBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbUxvZ1RhYmxlLCAiRXZlbnQiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiYWJjZGVqZ2hpamtsbW5vIiwgUFJFRlNfQ09MX0VWRU5UVEFHLCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbHVtblJlc2l6ZWQoMiwgKFRhYmxlQ29sdW1uKSBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbUxvZ1RhYmxlLCAiTmFtZSIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsICJQcm9jZXNzIE5hbWUiLCBQUkVGU19DT0xfVkFMVUVOQU1FLCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbHVtblJlc2l6ZWQoMywgKFRhYmxlQ29sdW1uKSBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4oCi0gICAgICAgICAgICAgICAgbUxvZ1RhYmxlLCAiVmFsdWUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiMDAwMDAwMCIsIFBSRUZTX0NPTF9WQUxVRSwgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbikgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jb2x1bW5SZXNpemVkKDQsIChUYWJsZUNvbHVtbikgc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNvbCA9IFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKAotICAgICAgICAgICAgICAgIG1Mb2dUYWJsZSwgIlR5cGUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAibG9uZywgc2Vjb25kcyIsIFBSRUZTX0NPTF9UWVBFLCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29sLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbHVtblJlc2l6ZWQoNSwgKFRhYmxlQ29sdW1uKSBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUxvZ1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1Mb2dUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIG1haW5Db21wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2l6ZXMgdGhlIDxjb2RlPmluZGV4PC9jb2RlPi10aCBjb2x1bW4gb2YgdGhlIGxvZyB7QGxpbmsgVGFibGV9IChpZiBhcHBsaWNhYmxlKS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBkb2VzIG5vdGhpbmcgaWYgdGhlIDxjb2RlPlRhYmxlPC9jb2RlPiBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gKGJlY2F1c2UgdGhlIGRpc3BsYXkKLSAgICAgKiB0eXBlIGRvZXMgbm90IHVzZSBhIGNvbHVtbikgb3IgaWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPi10aCBjb2x1bW4gaXMgaW4gZmFjdCB0aGUgb3JpZ2luYXRpbmcKLSAgICAgKiBjb2x1bW4gcGFzc2VkIGFzIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZXNpemUKLSAgICAgKiBAcGFyYW0gc291cmNlQ29sdW1uIHRoZSBvcmlnaW5hbCBjb2x1bW4gdGhhdCB3YXMgcmVzaXplLCBhbmQgb24gd2hpY2ggd2UgbmVlZCB0byBzeW5jIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgaW5kZXgtdGggY29sdW1uIHdpZHRoLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgcmVzaXplQ29sdW1uKGludCBpbmRleCwgVGFibGVDb2x1bW4gc291cmNlQ29sdW1uKSB7Ci0gICAgICAgIGlmIChtTG9nVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sID0gbUxvZ1RhYmxlLmdldENvbHVtbihpbmRleCk7Ci0gICAgICAgICAgICBpZiAoY29sICE9IHNvdXJjZUNvbHVtbikgewotICAgICAgICAgICAgICAgIGNvbC5zZXRXaWR0aChzb3VyY2VDb2x1bW4uZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGRpc3BsYXkgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBkaXNwbGF5IHR5cGUgYXMgYW4gaW50ZWdlcgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIGludCBnZXREaXNwbGF5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERJU1BMQVlfVFlQRV9MT0dfQUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlTeW5jLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5U3luYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzAwNmJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlTeW5jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuSW52YWxpZFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LmxhYmVscy5DdXN0b21YWVRvb2xUaXBHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnBsb3QuWFlQbG90OwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5yZW5kZXJlci54eS5YWUJhclJlbmRlcmVyOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5yZW5kZXJlci54eS5YWUxpbmVBbmRTaGFwZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuRml4ZWRNaWxsaXNlY29uZDsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlNpbXBsZVRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5UaW1lUGVyaW9kVmFsdWVzOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuVGltZVBlcmlvZFZhbHVlc0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5UaW1lU2VyaWVzOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuVGltZVNlcmllc0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmpmcmVlLnV0aWwuU2hhcGVVdGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheVN5bmMgZXh0ZW5kcyBTeW5jQ29tbW9uIHsKLQotICAgIC8vIEluZm9ybWF0aW9uIHRvIGdyYXBoIGZvciBlYWNoIGF1dGhvcml0eQotICAgIHByaXZhdGUgVGltZVBlcmlvZFZhbHVlcyBtRGF0YXNldHNTeW5jW107Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRvb2x0aXBzU3luY1tdOwotICAgIHByaXZhdGUgQ3VzdG9tWFlUb29sVGlwR2VuZXJhdG9yIG1Ub29sdGlwR2VuZXJhdG9yc1tdOwotICAgIHByaXZhdGUgVGltZVNlcmllcyBtRGF0YXNldHNTeW5jVGlja2xlW107Ci0KLSAgICAvLyBEYXRhc2V0IG9mIGVycm9yIGV2ZW50cyB0byBncmFwaAotICAgIHByaXZhdGUgVGltZVNlcmllcyBtRGF0YXNldEVycm9yOwotCi0gICAgcHVibGljIERpc3BsYXlTeW5jKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFVJIGZvciB0aGUgZXZlbnQgZGlzcGxheS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIgdGhlIGN1cnJlbnQgbG9nIHBhcnNlci4KLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wgKHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLAotICAgICAgICAgICAgZmluYWwgSUxvZ0NvbHVtbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIENvbnRyb2wgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlQ2hhcnQocGFyZW50LCBsb2dQYXJzZXIsICJTeW5jIFN0YXR1cyIpOwotICAgICAgICByZXNldFVJKCk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgcmVzZXRVSSgpIHsKLSAgICAgICAgc3VwZXIucmVzZXRVSSgpOwotICAgICAgICBYWVBsb3QgeHlQbG90ID0gbUNoYXJ0LmdldFhZUGxvdCgpOwotCi0gICAgICAgIFhZQmFyUmVuZGVyZXIgYnIgPSBuZXcgWFlCYXJSZW5kZXJlcigpOwotICAgICAgICBtRGF0YXNldHNTeW5jID0gbmV3IFRpbWVQZXJpb2RWYWx1ZXNbTlVNX0FVVEhTXTsKLSAgICAgICAgbVRvb2x0aXBzU3luYyA9IG5ldyBMaXN0W05VTV9BVVRIU107Ci0gICAgICAgIG1Ub29sdGlwR2VuZXJhdG9ycyA9IG5ldyBDdXN0b21YWVRvb2xUaXBHZW5lcmF0b3JbTlVNX0FVVEhTXTsKLQotICAgICAgICBUaW1lUGVyaW9kVmFsdWVzQ29sbGVjdGlvbiB0cHZjID0gbmV3IFRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIHh5UGxvdC5zZXREYXRhc2V0KHRwdmMpOwotICAgICAgICB4eVBsb3Quc2V0UmVuZGVyZXIoMCwgYnIpOwotCi0gICAgICAgIFhZTGluZUFuZFNoYXBlUmVuZGVyZXIgbHMgPSBuZXcgWFlMaW5lQW5kU2hhcGVSZW5kZXJlcigpOwotICAgICAgICBscy5zZXRCYXNlTGluZXNWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbURhdGFzZXRzU3luY1RpY2tsZSA9IG5ldyBUaW1lU2VyaWVzW05VTV9BVVRIU107Ci0gICAgICAgIFRpbWVTZXJpZXNDb2xsZWN0aW9uIHRzYyA9IG5ldyBUaW1lU2VyaWVzQ29sbGVjdGlvbigpOwotICAgICAgICB4eVBsb3Quc2V0RGF0YXNldCgxLCB0c2MpOwotICAgICAgICB4eVBsb3Quc2V0UmVuZGVyZXIoMSwgbHMpOwotCi0gICAgICAgIG1EYXRhc2V0RXJyb3IgPSBuZXcgVGltZVNlcmllcygiRXJyb3JzIiwgRml4ZWRNaWxsaXNlY29uZC5jbGFzcyk7Ci0gICAgICAgIHh5UGxvdC5zZXREYXRhc2V0KDIsIG5ldyBUaW1lU2VyaWVzQ29sbGVjdGlvbihtRGF0YXNldEVycm9yKSk7Ci0gICAgICAgIFhZTGluZUFuZFNoYXBlUmVuZGVyZXIgZXJybHMgPSBuZXcgWFlMaW5lQW5kU2hhcGVSZW5kZXJlcigpOwotICAgICAgICBlcnJscy5zZXRCYXNlTGluZXNWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgZXJybHMuc2V0U2VyaWVzUGFpbnQoMCwgQ29sb3IuUkVEKTsKLSAgICAgICAgeHlQbG90LnNldFJlbmRlcmVyKDIsIGVycmxzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9BVVRIUzsgaSsrKSB7Ci0gICAgICAgICAgICBici5zZXRTZXJpZXNQYWludChpLCBBVVRIX0NPTE9SU1tpXSk7Ci0gICAgICAgICAgICBscy5zZXRTZXJpZXNQYWludChpLCBBVVRIX0NPTE9SU1tpXSk7Ci0gICAgICAgICAgICBtRGF0YXNldHNTeW5jW2ldID0gbmV3IFRpbWVQZXJpb2RWYWx1ZXMoQVVUSF9OQU1FU1tpXSk7Ci0gICAgICAgICAgICB0cHZjLmFkZFNlcmllcyhtRGF0YXNldHNTeW5jW2ldKTsKLSAgICAgICAgICAgIG1Ub29sdGlwc1N5bmNbaV0gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIG1Ub29sdGlwR2VuZXJhdG9yc1tpXSA9IG5ldyBDdXN0b21YWVRvb2xUaXBHZW5lcmF0b3IoKTsKLSAgICAgICAgICAgIGJyLnNldFNlcmllc1Rvb2xUaXBHZW5lcmF0b3IoaSwgbVRvb2x0aXBHZW5lcmF0b3JzW2ldKTsKLSAgICAgICAgICAgIG1Ub29sdGlwR2VuZXJhdG9yc1tpXS5hZGRUb29sVGlwU2VyaWVzKG1Ub29sdGlwc1N5bmNbaV0pOwotCi0gICAgICAgICAgICBtRGF0YXNldHNTeW5jVGlja2xlW2ldID0gbmV3IFRpbWVTZXJpZXMoQVVUSF9OQU1FU1tpXSArICIgdGlja2xlIiwKLSAgICAgICAgICAgICAgICAgICAgRml4ZWRNaWxsaXNlY29uZC5jbGFzcyk7Ci0gICAgICAgICAgICB0c2MuYWRkU2VyaWVzKG1EYXRhc2V0c1N5bmNUaWNrbGVbaV0pOwotICAgICAgICAgICAgbHMuc2V0U2VyaWVzU2hhcGUoaSwgU2hhcGVVdGlsaXRpZXMuY3JlYXRlVXBUcmlhbmdsZSgyLjVmKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBkaXNwbGF5IHdpdGggYSBuZXcgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgICAgIFRoZSBldmVudAotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIgVGhlIHBhcnNlciBwcm92aWRpbmcgdGhlIGV2ZW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgbmV3RXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgICAgICBzdXBlci5uZXdFdmVudChldmVudCwgbG9nUGFyc2VyKTsgLy8gSGFuZGxlIHN5bmMgb3BlcmF0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQubVRhZyA9PSBFVkVOVF9USUNLTEUpIHsKLSAgICAgICAgICAgICAgICBpbnQgYXV0aCA9IGdldEF1dGgoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dGggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBsb25nIG1zZWMgPSAobG9uZylldmVudC5zZWMgKiAxMDAwTCArIChldmVudC5uc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YXNldHNTeW5jVGlja2xlW2F1dGhdLmFkZE9yVXBkYXRlKG5ldyBGaXhlZE1pbGxpc2Vjb25kKG1zZWMpLCAtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSB0aGUgaGVpZ2h0IGZvciBhbiBldmVudC4KLSAgICAgKiBIZWlnaHQgaXMgc29tZXdoYXQgYXJiaXRyYXJpbHkgdGhlIGNvdW50IG9mICJ0aGluZ3MiIHRoYXQgaGFwcGVuZWQKLSAgICAgKiBkdXJpbmcgdGhlIHN5bmMuCi0gICAgICogV2hlbiBuZXR3b3JrIHRyYWZmaWMgbWVhc3VyZW1lbnRzIGFyZSBhdmFpbGFibGUsIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkCi0gICAgICogdG8gdXNlIHRoYXQgaW5zdGVhZC4KLSAgICAgKiBAcGFyYW0gZGV0YWlscyBUaGUgZGV0YWlscyBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAotICAgICAqIEByZXR1cm4gVGhlIGhlaWdodCBpbiBhcmJpcmFyeSB1bml0cyAoMC0xMDApCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0SGVpZ2h0RnJvbURldGFpbHMoU3RyaW5nIGRldGFpbHMpIHsKLSAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEFyYml0cmFyeQotICAgICAgICB9Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIFN0cmluZyBwYXJ0c1tdID0gZGV0YWlscy5zcGxpdCgiW2EtekEtWl0iKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcGFydCA6IHBhcnRzKSB7Ci0gICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHBhcnQpKSBjb250aW51ZTsKLSAgICAgICAgICAgIHRvdGFsICs9IEludGVnZXIucGFyc2VJbnQocGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvdGFsID09IDApIHsKLSAgICAgICAgICAgIHRvdGFsID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSB0b29sdGlwcyB0ZXh0IGZvciBhbiBldmVudC4KLSAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBjcnlwdGljIGRldGFpbHMgc3RyaW5nLgotICAgICAqIEBwYXJhbSBhdXRoIFRoZSBhdXRob3JpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAotICAgICAqIEBwYXJhbSBkZXRhaWxzIFRoZSBkZXRhaWxzIHN0cmluZwotICAgICAqIEBwYXJhbSBldmVudFNvdXJjZSBzZXJ2ZXIsIHBvbGwsIGV0Yy4KLSAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIHRvb2x0aXBzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZyb21EZXRhaWxzKGludCBhdXRoLCBTdHJpbmcgZGV0YWlscywgaW50IGV2ZW50U291cmNlKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoQVVUSF9OQU1FU1thdXRoXSkuYXBwZW5kKCI6IFxuIik7Ci0KLSAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZGV0YWlscyk7Ci0gICAgICAgIFBhdHRlcm4gY2hhclBhdCA9IFBhdHRlcm4uY29tcGlsZSgiW2EtekEtWl0iKTsKLSAgICAgICAgUGF0dGVybiBudW1QYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIlswLTldKyIpOwotICAgICAgICB3aGlsZSAoc2Nhbm5lci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBzY2FubmVyLmZpbmRJbkxpbmUoY2hhclBhdCk7Ci0gICAgICAgICAgICBpbnQgdmFsID0gSW50ZWdlci5wYXJzZUludChzY2FubmVyLmZpbmRJbkxpbmUobnVtUGF0KSk7Ci0gICAgICAgICAgICBpZiAoYXV0aCA9PSBHTUFJTCAmJiAiTSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm1lc3NhZ2VzIGZyb20gc2VydmVyOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGggPT0gR01BSUwgJiYgIkwiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJsYWJlbHMgZnJvbSBzZXJ2ZXI6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBHTUFJTCAmJiAiQyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImNoZWNrIGNvbnZlcnNhdGlvbiByZXF1ZXN0cyBmcm9tIHNlcnZlcjogIikuYXBwZW5kKHZhbCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoID09IEdNQUlMICYmICJBIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiYXR0YWNobWVudHMgZnJvbSBzZXJ2ZXI6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBHTUFJTCAmJiAiVSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm9wIHVwZGF0ZXMgZnJvbSBzZXJ2ZXI6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBHTUFJTCAmJiAidSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm9wIHVwZGF0ZXMgdG8gc2VydmVyOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGggPT0gR01BSUwgJiYgIlMiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJzZW5kL3JlY2VpdmUgY3ljbGVzOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJRIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgicXVlcmllcyB0byBzZXJ2ZXI6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJlbnRyaWVzIGZyb20gc2VydmVyOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJ1Ii5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgidXBkYXRlcyBmcm9tIGNsaWVudDogIikuYXBwZW5kKHZhbCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiaSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImluc2VydHMgZnJvbSBjbGllbnQ6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImQiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJkZWxldGVzIGZyb20gY2xpZW50OiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJmIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiZnVsbCBzeW5jIHJlcXVlc3RlZFxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJyIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgicGFydGlhbCBzeW5jIHVuYXZhaWxhYmxlXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlgiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJoYXJkIGVycm9yXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJudW1iZXIgb2YgcGFyc2UgZXhjZXB0aW9uczogIikuYXBwZW5kKHZhbCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiYyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm51bWJlciBvZiBjb25mbGljdHM6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImEiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJudW1iZXIgb2YgYXV0aCBleGNlcHRpb25zOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJEIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgidG9vIG1hbnkgZGVsZXRpb25zXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlIiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJ0b28gbWFueSByZXRyaWVzOiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJiIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiZGF0YWJhc2UgZXJyb3JcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgieCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInNvZnQgZXJyb3JcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgibCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInN5bmMgYWxyZWFkeSBpbiBwcm9ncmVzc1xuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJJIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiaW8gZXhjZXB0aW9uXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBDT05UQUNUUyAmJiAiZyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImFnZ3JlZ2F0aW9uIHF1ZXJ5OiAiKS5hcHBlbmQodmFsKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGggPT0gQ09OVEFDVFMgJiYgIkciLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJhZ2dyZWdhdGlvbiBtZXJnZTogIikuYXBwZW5kKHZhbCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoID09IENPTlRBQ1RTICYmICJuIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibnVtIGVudHJpZXM6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBDT05UQUNUUyAmJiAicCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInBob3RvcyB1cGxvYWRlZCBmcm9tIHNlcnZlcjogIikuYXBwZW5kKHZhbCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoID09IENPTlRBQ1RTICYmICJQIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgicGhvdG9zIGRvd25sb2FkZWQgZnJvbSBzZXJ2ZXI6ICIpLmFwcGVuZCh2YWwpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBDQUxFTkRBUiAmJiAiRiIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInNlcnZlciByZWZyZXNoXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aCA9PSBDQUxFTkRBUiAmJiAicyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInNlcnZlciBkaWZmcyBmZXRjaGVkXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGtleSkuYXBwZW5kKCI9IikuYXBwZW5kKHZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50U291cmNlID09IDApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKHNlcnZlcikiKTsKLSAgICAgICAgfSBlbHNlIGlmIChldmVudFNvdXJjZSA9PSAxKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIihsb2NhbCkiKTsKLSAgICAgICAgfSBlbHNlIGlmIChldmVudFNvdXJjZSA9PSAyKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIihwb2xsKSIpOwotICAgICAgICB9IGVsc2UgaWYgKGV2ZW50U291cmNlID09IDMpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKHVzZXIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB0byBwcm9jZXNzIGEgc3luYyBldmVudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHByb2Nlc3NTeW5jRXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIGludCBhdXRoLCBsb25nIHN0YXJ0VGltZSwgbG9uZyBzdG9wVGltZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzLCBib29sZWFuIG5ld0V2ZW50LCBpbnQgc3luY1NvdXJjZSkgewotICAgICAgICBpZiAoIW5ld0V2ZW50KSB7Ci0gICAgICAgICAgICAvLyBEZXRhaWxzIGFycml2ZWQgZm9yIGEgcHJldmlvdXMgc3luYyBldmVudAotICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZW50IGJlZm9yZSByZWluc2VydGluZy4KLSAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IG1EYXRhc2V0c1N5bmNbYXV0aF0uZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICBtRGF0YXNldHNTeW5jW2F1dGhdLmRlbGV0ZShsYXN0SXRlbS0xLCBsYXN0SXRlbS0xKTsKLSAgICAgICAgICAgIG1Ub29sdGlwc1N5bmNbYXV0aF0ucmVtb3ZlKGxhc3RJdGVtLTEpOwotICAgICAgICB9Ci0gICAgICAgIGRvdWJsZSBoZWlnaHQgPSBnZXRIZWlnaHRGcm9tRGV0YWlscyhkZXRhaWxzKTsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC8gKHN0b3BUaW1lIC0gc3RhcnRUaW1lICsgMSkgKiAxMDAwMDsKLSAgICAgICAgaWYgKGhlaWdodCA+IDMwKSB7Ci0gICAgICAgICAgICBoZWlnaHQgPSAzMDsKLSAgICAgICAgfQotICAgICAgICBtRGF0YXNldHNTeW5jW2F1dGhdLmFkZChuZXcgU2ltcGxlVGltZVBlcmlvZChzdGFydFRpbWUsIHN0b3BUaW1lKSwgaGVpZ2h0KTsKLSAgICAgICAgbVRvb2x0aXBzU3luY1thdXRoXS5hZGQoZ2V0VGV4dEZyb21EZXRhaWxzKGF1dGgsIGRldGFpbHMsIHN5bmNTb3VyY2UpKTsKLSAgICAgICAgbVRvb2x0aXBHZW5lcmF0b3JzW2F1dGhdLmFkZFRvb2xUaXBTZXJpZXMobVRvb2x0aXBzU3luY1thdXRoXSk7Ci0gICAgICAgIGlmIChkZXRhaWxzLmluZGV4T2YoJ3gnKSA+PSAwIHx8IGRldGFpbHMuaW5kZXhPZignWCcpID49IDApIHsKLSAgICAgICAgICAgIGxvbmcgbXNlYyA9IChsb25nKWV2ZW50LnNlYyAqIDEwMDBMICsgKGV2ZW50Lm5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICBtRGF0YXNldEVycm9yLmFkZE9yVXBkYXRlKG5ldyBGaXhlZE1pbGxpc2Vjb25kKG1zZWMpLCAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGRpc3BsYXkgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBkaXNwbGF5IHR5cGUgYXMgYW4gaW50ZWdlcgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIGludCBnZXREaXNwbGF5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERJU1BMQVlfVFlQRV9TWU5DOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlTeW5jSGlzdG9ncmFtLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5U3luY0hpc3RvZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ5MGNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0Rpc3BsYXlTeW5jSGlzdG9ncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5wbG90LlhZUGxvdDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucmVuZGVyZXIueHkuQWJzdHJhY3RYWUl0ZW1SZW5kZXJlcjsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucmVuZGVyZXIueHkuWFlCYXJSZW5kZXJlcjsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlJlZ3VsYXJUaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuU2ltcGxlVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlRpbWVQZXJpb2RWYWx1ZXM7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5UaW1lUGVyaW9kVmFsdWVzQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotcHVibGljIGNsYXNzIERpc3BsYXlTeW5jSGlzdG9ncmFtIGV4dGVuZHMgU3luY0NvbW1vbiB7Ci0KLSAgICBNYXA8U2ltcGxlVGltZVBlcmlvZCwgSW50ZWdlcj4gbVRpbWVQZXJpb2RNYXBbXTsKLQotICAgIC8vIEluZm9ybWF0aW9uIHRvIGdyYXBoIGZvciBlYWNoIGF1dGhvcml0eQotICAgIHByaXZhdGUgVGltZVBlcmlvZFZhbHVlcyBtRGF0YXNldHNTeW5jSGlzdFtdOwotCi0gICAgcHVibGljIERpc3BsYXlTeW5jSGlzdG9ncmFtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFVJIGZvciB0aGUgZXZlbnQgZGlzcGxheS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIgdGhlIGN1cnJlbnQgbG9nIHBhcnNlci4KLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wgKHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLAotICAgICAgICAgICAgZmluYWwgSUxvZ0NvbHVtbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIENvbnRyb2wgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlQ2hhcnQocGFyZW50LCBsb2dQYXJzZXIsICJTeW5jIEhpc3RvZ3JhbSIpOwotICAgICAgICByZXNldFVJKCk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgcmVzZXRVSSgpIHsKLSAgICAgICAgc3VwZXIucmVzZXRVSSgpOwotICAgICAgICBYWVBsb3QgeHlQbG90ID0gbUNoYXJ0LmdldFhZUGxvdCgpOwotCi0gICAgICAgIEFic3RyYWN0WFlJdGVtUmVuZGVyZXIgYnIgPSBuZXcgWFlCYXJSZW5kZXJlcigpOwotICAgICAgICBtRGF0YXNldHNTeW5jSGlzdCA9IG5ldyBUaW1lUGVyaW9kVmFsdWVzW05VTV9BVVRIUysxXTsKLSAgICAgICAgbVRpbWVQZXJpb2RNYXAgPSBuZXcgSGFzaE1hcFtOVU1fQVVUSFMgKyAxXTsKLQotICAgICAgICBUaW1lUGVyaW9kVmFsdWVzQ29sbGVjdGlvbiB0cHZjID0gbmV3IFRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIHh5UGxvdC5zZXREYXRhc2V0KHRwdmMpOwotICAgICAgICB4eVBsb3Quc2V0UmVuZGVyZXIoYnIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0FVVEhTICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBici5zZXRTZXJpZXNQYWludChpLCBBVVRIX0NPTE9SU1tpXSk7Ci0gICAgICAgICAgICBtRGF0YXNldHNTeW5jSGlzdFtpXSA9IG5ldyBUaW1lUGVyaW9kVmFsdWVzKEFVVEhfTkFNRVNbaV0pOwotICAgICAgICAgICAgdHB2Yy5hZGRTZXJpZXMobURhdGFzZXRzU3luY0hpc3RbaV0pOwotICAgICAgICAgICAgbVRpbWVQZXJpb2RNYXBbaV0gPSBuZXcgSGFzaE1hcDxTaW1wbGVUaW1lUGVyaW9kLCBJbnRlZ2VyPigpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB0byBwcm9jZXNzIGEgc3luYyBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCAgICAgIFRoZSBzeW5jIGV2ZW50Ci0gICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIChtcykgb2YgZXZlbnRzCi0gICAgICogQHBhcmFtIHN0b3BUaW1lIFN0b3AgdGltZSAobXMpIG9mIGV2ZW50cwotICAgICAqIEBwYXJhbSBkZXRhaWxzIERldGFpbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gbmV3RXZlbnQgVHJ1ZSBpZiB0aGlzIGV2ZW50IGlzIGEgbmV3IHN5bmMgZXZlbnQuICBGYWxzZSBpZiB0aGlzIGV2ZW50Ci0gICAgICogQHBhcmFtIHN5bmNTb3VyY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHByb2Nlc3NTeW5jRXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIGludCBhdXRoLCBsb25nIHN0YXJ0VGltZSwgbG9uZyBzdG9wVGltZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzLCBib29sZWFuIG5ld0V2ZW50LCBpbnQgc3luY1NvdXJjZSkgewotICAgICAgICBpZiAobmV3RXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChkZXRhaWxzLmluZGV4T2YoJ3gnKSA+PSAwIHx8IGRldGFpbHMuaW5kZXhPZignWCcpID49IDApIHsKLSAgICAgICAgICAgICAgICBhdXRoID0gRVJST1JTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG91YmxlIGRlbHRhID0gKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSAqIDEwMC4gLyAxMDAwIC8gMzYwMDsgLy8gUGVyY2VudCBvZiBob3VyCi0gICAgICAgICAgICBhZGRIaXN0RXZlbnQoMCwgYXV0aCwgZGVsdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc3luY19kZXRhaWxzIGFycml2ZWQgZm9yIGFuIGV2ZW50IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBncmFwaGVkLgotICAgICAgICAgICAgaWYgKGRldGFpbHMuaW5kZXhPZigneCcpID49IDAgfHwgZGV0YWlscy5pbmRleE9mKCdYJykgPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIEl0ZW0gdHVybnMgb3V0IHRvIGJlIGluIGVycm9yLCBzbyB0cmFuc2ZlciB0aW1lIGZyb20gb2xkIGF1dGggdG8gZXJyb3IuCi0gICAgICAgICAgICAgICAgZG91YmxlIGRlbHRhID0gKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSAqIDEwMC4gLyAxMDAwIC8gMzYwMDsgLy8gUGVyY2VudCBvZiBob3VyCi0gICAgICAgICAgICAgICAgYWRkSGlzdEV2ZW50KDAsIGF1dGgsIC1kZWx0YSk7Ci0gICAgICAgICAgICAgICAgYWRkSGlzdEV2ZW50KDAsIEVSUk9SUywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIGFkZCBhbiBldmVudCB0byB0aGUgZGF0YSBzZXJpZXMuCi0gICAgICogQWxzbyB1cGRhdGVzIGVycm9yIHNlcmllcyBpZiBhcHByb3ByaWF0ZSAoeCBvciBYIGluIGRldGFpbHMpLgotICAgICAqIEBwYXJhbSBzdG9wVGltZSBUaW1lIGV2ZW50IGVuZHMKLSAgICAgKiBAcGFyYW0gYXV0aCBTeW5jIGF1dGhvcml0eQotICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBncmFwaCBmb3IgZXZlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSGlzdEV2ZW50KGxvbmcgc3RvcFRpbWUsIGludCBhdXRoLCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgU2ltcGxlVGltZVBlcmlvZCBob3VyID0gZ2V0VGltZVBlcmlvZChzdG9wVGltZSwgbUhpc3RXaWR0aCk7Ci0KLSAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCBkYXRhc2V0cyB0byBkbyB0aGUgc3RhY2tpbmcuCi0gICAgICAgIGZvciAoaW50IGkgPSBhdXRoOyBpIDw9IEVSUk9SUzsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUb1BlcmlvZChtRGF0YXNldHNTeW5jSGlzdCwgaSwgaG91ciwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvUGVyaW9kKFRpbWVQZXJpb2RWYWx1ZXMgdHB2W10sIGludCBhdXRoLCBTaW1wbGVUaW1lUGVyaW9kIHBlcmlvZCwKLSAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIGlmIChtVGltZVBlcmlvZE1hcFthdXRoXS5jb250YWluc0tleShwZXJpb2QpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IG1UaW1lUGVyaW9kTWFwW2F1dGhdLmdldChwZXJpb2QpOwotICAgICAgICAgICAgZG91YmxlIG9sZFZhbHVlID0gdHB2W2F1dGhdLmdldFZhbHVlKGluZGV4KS5kb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgdHB2W2F1dGhdLnVwZGF0ZShpbmRleCwgb2xkVmFsdWUgKyB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmRleCA9IHRwdlthdXRoXS5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgIG1UaW1lUGVyaW9kTWFwW2F1dGhdLnB1dChwZXJpb2QsIGluZGV4KTsKLSAgICAgICAgICAgIHRwdlthdXRoXS5hZGQocGVyaW9kLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbXVsdGlwbGUtaG91ciB0aW1lIHBlcmlvZCBmb3IgdGhlIGhpc3RvZ3JhbS4KLSAgICAgKiBAcGFyYW0gdGltZSBUaW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAcGFyYW0gbnVtSG91cnNXaWRlOiBzaG91bGQgZGl2aWRlIGludG8gYSBkYXkuCi0gICAgICogQHJldHVybiBTaW1wbGVUaW1lUGVyaW9kIGNvdmVyaW5nIHRoZSBudW1iZXIgb2YgaG91cnMgYW5kIGNvbnRhaW5pbmcgdGltZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNpbXBsZVRpbWVQZXJpb2QgZ2V0VGltZVBlcmlvZChsb25nIHRpbWUsIGxvbmcgbnVtSG91cnNXaWRlKSB7Ci0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpOwotICAgICAgICBUaW1lWm9uZSB6b25lID0gUmVndWxhclRpbWVQZXJpb2QuREVGQVVMVF9USU1FX1pPTkU7Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2Uoem9uZSk7Ci0gICAgICAgIGNhbGVuZGFyLnNldFRpbWUoZGF0ZSk7Ci0gICAgICAgIGxvbmcgaG91cnNPZlllYXIgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpICsKLSAgICAgICAgICAgICAgICBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1lFQVIpICogMjQ7Ci0gICAgICAgIGludCB5ZWFyID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICBob3Vyc09mWWVhciA9IChob3Vyc09mWWVhciAvIG51bUhvdXJzV2lkZSkgKiBudW1Ib3Vyc1dpZGU7Ci0gICAgICAgIGNhbGVuZGFyLmNsZWFyKCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldCh5ZWFyLCAwLCAxLCAwLCAwKTsgLy8gSmFuIDEKLSAgICAgICAgbG9uZyBzdGFydCA9IGNhbGVuZGFyLmdldFRpbWVJbk1pbGxpcygpICsgaG91cnNPZlllYXIgKiAzNjAwICogMTAwMDsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUaW1lUGVyaW9kKHN0YXJ0LCBzdGFydCArIG51bUhvdXJzV2lkZSAqIDM2MDAgKiAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGRpc3BsYXkgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBkaXNwbGF5IHR5cGUgYXMgYW4gaW50ZWdlcgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIGludCBnZXREaXNwbGF5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERJU1BMQVlfVFlQRV9TWU5DX0hJU1Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRGlzcGxheVN5bmNQZXJmLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5U3luY1BlcmYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlNzA0NS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9EaXNwbGF5U3luY1BlcmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5JbnZhbGlkVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQubGFiZWxzLkN1c3RvbVhZVG9vbFRpcEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucGxvdC5YWVBsb3Q7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnJlbmRlcmVyLnh5LlhZQmFyUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5TaW1wbGVUaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnRpbWUuVGltZVBlcmlvZFZhbHVlczsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIERpc3BsYXlTeW5jUGVyZiBleHRlbmRzIFN5bmNDb21tb24gewotCi0gICAgQ3VzdG9tWFlUb29sVGlwR2VuZXJhdG9yIG1Ub29sdGlwR2VuZXJhdG9yOwotICAgIExpc3QgbVRvb2x0aXBzW107Ci0KLSAgICAvLyBUaGUgc2VyaWVzIG51bWJlciBmb3IgZWFjaCBncmFwaGVkIGl0ZW0uCi0gICAgLy8gc3luYyBhdXRob3JpdGllcyBhcmUgMC0zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERCX1FVRVJZID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREJfV1JJVEUgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX05FVFdPUksgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1BST0NFU1NJTkcgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fU0VSSUVTID0gKEhUVFBfUFJPQ0VTU0lORyArIDEpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJRVNfTkFNRVNbXSA9IHsiQ2FsZW5kYXIiLCAiR21haWwiLCAiRmVlZHMiLCAiQ29udGFjdHMiLAotICAgICAgICAgICAgIkRCIFF1ZXJ5IiwgIkRCIFdyaXRlIiwgIkhUVFAgUmVzcG9uc2UiLCAiSFRUUCBQcm9jZXNzaW5nIix9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIFNFUklFU19DT0xPUlNbXSA9IHtDb2xvci5NQUdFTlRBLCBDb2xvci5HUkVFTiwgQ29sb3IuQkxVRSwKLSAgICAgICAgICAgIENvbG9yLk9SQU5HRSwgQ29sb3IuUkVELCBDb2xvci5DWUFOLCBDb2xvci5QSU5LLCBDb2xvci5EQVJLX0dSQVl9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBTRVJJRVNfWUNPT1JEW10gPSB7MCwgMCwgMCwgMCwgMSwgMSwgMiwgMn07Ci0KLSAgICAvLyBWYWx1ZXMgZnJvbSBkYXRhL2V0Yy9ldmVudC1sb2ctdGFncwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9PUEVSQVRJT04gPSA1MjAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSFRUUF9TVEFUUyA9IDUyMDAxOwotICAgIC8vIG9wIHR5cGVzIGZvciBFVkVOVF9EQl9PUEVSQVRJT04KLSAgICBmaW5hbCBpbnQgRVZFTlRfREJfUVVFUlkgPSAwOwotICAgIGZpbmFsIGludCBFVkVOVF9EQl9XUklURSA9IDE7Ci0KLSAgICAvLyBJbmZvcm1hdGlvbiB0byBncmFwaCBmb3IgZWFjaCBhdXRob3JpdHkKLSAgICBwcml2YXRlIFRpbWVQZXJpb2RWYWx1ZXMgbURhdGFzZXRzW107Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lUGVyaW9kVmFsdWVzQ29sbGVjdGlvbiB0aGF0IHN1cHBvcnRzIFkgaW50ZXJ2YWxzLiAgVGhpcyBhbGxvd3MgdGhlCi0gICAgICogY3JlYXRpb24gb2YgImZsb2F0aW5nIiBiYXJzLCByYXRoZXIgdGhhbiBiYXJzIHJvb3RlZCB0byB0aGUgYXhpcy4KLSAgICAgKi8KLSAgICBjbGFzcyBZSW50ZXJ2YWxUaW1lUGVyaW9kVmFsdWVzQ29sbGVjdGlvbiBleHRlbmRzIFRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uIHsKLSAgICAgICAgLyoqIGRlZmF1bHQgc2VyaWFsIFVJRCAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwcml2YXRlIGRvdWJsZSB5aGVpZ2h0OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgY29sbGVjdGlvbiBvZiBiYXJzIHdpdGggYSBmaXhlZCBZIGhlaWdodC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHloZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgYmFycy4KLSAgICAgICAgICovCi0gICAgICAgIFlJbnRlcnZhbFRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uKGRvdWJsZSB5aGVpZ2h0KSB7Ci0gICAgICAgICAgICB0aGlzLnloZWlnaHQgPSB5aGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgZW5kaW5nIFkgdmFsdWUgdGhhdCBpcyBhIGZpeGVkIGFtb3VudCBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0aW5nIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VyaWVzIHRoZSBzZXJpZXMgKHplcm8tYmFzZWQgaW5kZXgpLgotICAgICAgICAgKiBAcGFyYW0gaXRlbSAgIHRoZSBpdGVtICh6ZXJvLWJhc2VkIGluZGV4KS4KLSAgICAgICAgICogQHJldHVybiBUaGUgZW5kaW5nIFkgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgc2VyaWVzIGFuZCBpdGVtLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBOdW1iZXIgZ2V0RW5kWShpbnQgc2VyaWVzLCBpbnQgaXRlbSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFkoc2VyaWVzLCBpdGVtKS5kb3VibGVWYWx1ZSgpICsgeWhlaWdodDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBncmFwaCBvZiBuZXR3b3JrIGFuZCBkYXRhYmFzZSBzdGF0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgZ3JhcGggaW4gdGhlIGdyYXBoIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIERpc3BsYXlTeW5jUGVyZihTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBVSSBmb3IgdGhlIGV2ZW50IGRpc3BsYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIgdGhlIGN1cnJlbnQgbG9nIHBhcnNlci4KLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wgKHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLAotICAgICAgICAgICAgZmluYWwgSUxvZ0NvbHVtbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIENvbnRyb2wgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlQ2hhcnQocGFyZW50LCBsb2dQYXJzZXIsICJTeW5jIFBlcmZvcm1hbmNlIik7Ci0gICAgICAgIHJlc2V0VUkoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCByZXNldFVJKCkgewotICAgICAgICBzdXBlci5yZXNldFVJKCk7Ci0gICAgICAgIFhZUGxvdCB4eVBsb3QgPSBtQ2hhcnQuZ2V0WFlQbG90KCk7Ci0gICAgICAgIHh5UGxvdC5nZXRSYW5nZUF4aXMoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbVRvb2x0aXBHZW5lcmF0b3IgPSBuZXcgQ3VzdG9tWFlUb29sVGlwR2VuZXJhdG9yKCk7Ci0gICAgICAgIG1Ub29sdGlwcyA9IG5ldyBMaXN0W05VTV9TRVJJRVNdOwotCi0gICAgICAgIFhZQmFyUmVuZGVyZXIgYnIgPSBuZXcgWFlCYXJSZW5kZXJlcigpOwotICAgICAgICBici5zZXRVc2VZSW50ZXJ2YWwodHJ1ZSk7Ci0gICAgICAgIG1EYXRhc2V0cyA9IG5ldyBUaW1lUGVyaW9kVmFsdWVzW05VTV9TRVJJRVNdOwotCi0gICAgICAgIFRpbWVQZXJpb2RWYWx1ZXNDb2xsZWN0aW9uIHRwdmMgPSBuZXcgWUludGVydmFsVGltZVBlcmlvZFZhbHVlc0NvbGxlY3Rpb24oMSk7Ci0gICAgICAgIHh5UGxvdC5zZXREYXRhc2V0KHRwdmMpOwotICAgICAgICB4eVBsb3Quc2V0UmVuZGVyZXIoYnIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NFUklFUzsgaSsrKSB7Ci0gICAgICAgICAgICBici5zZXRTZXJpZXNQYWludChpLCBTRVJJRVNfQ09MT1JTW2ldKTsKLSAgICAgICAgICAgIG1EYXRhc2V0c1tpXSA9IG5ldyBUaW1lUGVyaW9kVmFsdWVzKFNFUklFU19OQU1FU1tpXSk7Ci0gICAgICAgICAgICB0cHZjLmFkZFNlcmllcyhtRGF0YXNldHNbaV0pOwotICAgICAgICAgICAgbVRvb2x0aXBzW2ldID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBtVG9vbHRpcEdlbmVyYXRvci5hZGRUb29sVGlwU2VyaWVzKG1Ub29sdGlwc1tpXSk7Ci0gICAgICAgICAgICBici5zZXRTZXJpZXNUb29sVGlwR2VuZXJhdG9yKGksIG1Ub29sdGlwR2VuZXJhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRpc3BsYXkgd2l0aCBhIG5ldyBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCAgICAgVGhlIGV2ZW50Ci0gICAgICogQHBhcmFtIGxvZ1BhcnNlciBUaGUgcGFyc2VyIHByb3ZpZGluZyB0aGUgZXZlbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCBuZXdFdmVudChFdmVudENvbnRhaW5lciBldmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyKSB7Ci0gICAgICAgIHN1cGVyLm5ld0V2ZW50KGV2ZW50LCBsb2dQYXJzZXIpOyAvLyBIYW5kbGUgc3luYyBvcGVyYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChldmVudC5tVGFnID09IEVWRU5UX0RCX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIC8vIDUyMDAwIGRiX29wZXJhdGlvbiAobmFtZXwzKSwob3BfdHlwZXwxfDUpLCh0aW1lfDJ8MykKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGlwID0gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKTsKLSAgICAgICAgICAgICAgICBsb25nIGVuZFRpbWUgPSAobG9uZykgZXZlbnQuc2VjICogMTAwMEwgKyAoZXZlbnQubnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICBpbnQgb3BUeXBlID0gSW50ZWdlci5wYXJzZUludChldmVudC5nZXRWYWx1ZUFzU3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygyKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BUeXBlID09IEVWRU5UX0RCX1FVRVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0c1tEQl9RVUVSWV0uYWRkKG5ldyBTaW1wbGVUaW1lUGVyaW9kKGVuZFRpbWUgLSBkdXJhdGlvbiwgZW5kVGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSSUVTX1lDT09SRFtEQl9RVUVSWV0pOwotICAgICAgICAgICAgICAgICAgICBtVG9vbHRpcHNbREJfUVVFUlldLmFkZCh0aXApOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3BUeXBlID09IEVWRU5UX0RCX1dSSVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhc2V0c1tEQl9XUklURV0uYWRkKG5ldyBTaW1wbGVUaW1lUGVyaW9kKGVuZFRpbWUgLSBkdXJhdGlvbiwgZW5kVGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSSUVTX1lDT09SRFtEQl9XUklURV0pOwotICAgICAgICAgICAgICAgICAgICBtVG9vbHRpcHNbREJfV1JJVEVdLmFkZCh0aXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQubVRhZyA9PSBFVkVOVF9IVFRQX1NUQVRTKSB7Ci0gICAgICAgICAgICAgICAgLy8gNTIwMDEgaHR0cF9zdGF0cyAodXNlcmFnZW50fDMpLChyZXNwb25zZXwyfDMpLChwcm9jZXNzaW5nfDJ8MyksKHR4fDF8MiksKHJ4fDF8MikKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGlwID0gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKSArICIsIHR4OiIgKyBldmVudC5nZXRWYWx1ZUFzU3RyaW5nKDMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIHJ4OiAiICsgZXZlbnQuZ2V0VmFsdWVBc1N0cmluZyg0KTsKLSAgICAgICAgICAgICAgICBsb25nIGVuZFRpbWUgPSAobG9uZykgZXZlbnQuc2VjICogMTAwMEwgKyAoZXZlbnQubnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICBsb25nIG5ldEVuZFRpbWUgPSBlbmRUaW1lIC0gTG9uZy5wYXJzZUxvbmcoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygyKSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBuZXRTdGFydFRpbWUgPSBuZXRFbmRUaW1lIC0gTG9uZy5wYXJzZUxvbmcoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgbURhdGFzZXRzW0hUVFBfTkVUV09SS10uYWRkKG5ldyBTaW1wbGVUaW1lUGVyaW9kKG5ldFN0YXJ0VGltZSwgbmV0RW5kVGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBTRVJJRVNfWUNPT1JEW0hUVFBfTkVUV09SS10pOwotICAgICAgICAgICAgICAgIG1EYXRhc2V0c1tIVFRQX1BST0NFU1NJTkddLmFkZChuZXcgU2ltcGxlVGltZVBlcmlvZChuZXRFbmRUaW1lLCBlbmRUaW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFUklFU19ZQ09PUkRbSFRUUF9QUk9DRVNTSU5HXSk7Ci0gICAgICAgICAgICAgICAgbVRvb2x0aXBzW0hUVFBfTkVUV09SS10uYWRkKHRpcCk7Ci0gICAgICAgICAgICAgICAgbVRvb2x0aXBzW0hUVFBfUFJPQ0VTU0lOR10uYWRkKHRpcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZyb20gc3VwZXIubmV3RXZlbnQgdG8gcHJvY2VzcyBhIHN5bmMgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgICAgICBUaGUgc3luYyBldmVudAotICAgICAqIEBwYXJhbSBzdGFydFRpbWUgIFN0YXJ0IHRpbWUgKG1zKSBvZiBldmVudHMKLSAgICAgKiBAcGFyYW0gc3RvcFRpbWUgICBTdG9wIHRpbWUgKG1zKSBvZiBldmVudHMKLSAgICAgKiBAcGFyYW0gZGV0YWlscyAgICBEZXRhaWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIG5ld0V2ZW50ICAgVHJ1ZSBpZiB0aGlzIGV2ZW50IGlzIGEgbmV3IHN5bmMgZXZlbnQuICBGYWxzZSBpZiB0aGlzIGV2ZW50Ci0gICAgICogQHBhcmFtIHN5bmNTb3VyY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHByb2Nlc3NTeW5jRXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIGludCBhdXRoLCBsb25nIHN0YXJ0VGltZSwgbG9uZyBzdG9wVGltZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzLCBib29sZWFuIG5ld0V2ZW50LCBpbnQgc3luY1NvdXJjZSkgewotICAgICAgICBpZiAobmV3RXZlbnQpIHsKLSAgICAgICAgICAgIG1EYXRhc2V0c1thdXRoXS5hZGQobmV3IFNpbXBsZVRpbWVQZXJpb2Qoc3RhcnRUaW1lLCBzdG9wVGltZSksIFNFUklFU19ZQ09PUkRbYXV0aF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBkaXNwbGF5IHR5cGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gZGlzcGxheSB0eXBlIGFzIGFuIGludGVnZXIKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0RGlzcGxheVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBESVNQTEFZX1RZUEVfU1lOQ19QRVJGOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50RGlzcGxheS5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRXZlbnREaXNwbGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjNhNGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRXZlbnREaXNwbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRDb250YWluZXIuQ29tcGFyZU1ldGhvZDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyLkV2ZW50VmFsdWVUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudFZhbHVlRGVzY3JpcHRpb24uVmFsdWVUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuSW52YWxpZFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LkNoYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuSkZyZWVDaGFydDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuZXZlbnQuQ2hhcnRDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuZXZlbnQuQ2hhcnRDaGFuZ2VFdmVudFR5cGU7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LmV2ZW50LkNoYXJ0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnBsb3QuWFlQbG90OwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC50aXRsZS5UZXh0VGl0bGU7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5NaWxsaXNlY29uZDsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlRpbWVTZXJpZXM7Ci1pbXBvcnQgb3JnLmpmcmVlLmRhdGEudGltZS5UaW1lU2VyaWVzQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuamZyZWUuZXhwZXJpbWVudGFsLmNoYXJ0LnN3dC5DaGFydENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuamZyZWUuZXhwZXJpbWVudGFsLnN3dC5TV1RVdGlsczsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjdXN0b20gZGlzcGxheSBvZiBvbmUgb3IgbW9yZSBldmVudHMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEV2ZW50RGlzcGxheSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTUExBWV9EQVRBX1NUT1JBR0VfU0VQQVJBVE9SID0gIjoiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBJRF9TVE9SQUdFX1NFUEFSQVRPUiA9ICIsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVE9SX1NUT1JBR0VfU0VQQVJBVE9SID0gIiQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1JfREFUQV9TVE9SQUdFX1NFUEFSQVRPUiA9ICIhIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTFRFUl9WQUxVRV9OVUxMID0gIjxudWxsPiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJU1BMQVlfVFlQRV9MT0dfQUxMID0gMDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQTEFZX1RZUEVfRklMVEVSRURfTE9HID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQTEFZX1RZUEVfR1JBUEggPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJU1BMQVlfVFlQRV9TWU5DID0gMzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQTEFZX1RZUEVfU1lOQ19ISVNUID0gNDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQTEFZX1RZUEVfU1lOQ19QRVJGID0gNTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBFVkVOVF9DSEVDS19GQUlMRUQgPSAwOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEVWRU5UX0NIRUNLX1NBTUVfVEFHID0gMTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBFVkVOVF9DSEVDS19TQU1FX1ZBTFVFID0gMjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIEV2ZW50RGlzcGxheSBzdWJjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGRpc3BsYXkgKERJU1BMQVlfVFlQRV9MT0dfQUxMLCBldGMpCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRpc3BsYXkKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheUZhY3RvcnkoaW50IHR5cGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBESVNQTEFZX1RZUEVfTE9HX0FMTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERpc3BsYXlMb2cobmFtZSk7Ci0gICAgICAgICAgICBjYXNlIERJU1BMQVlfVFlQRV9GSUxURVJFRF9MT0c6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXNwbGF5RmlsdGVyZWRMb2cobmFtZSk7Ci0gICAgICAgICAgICBjYXNlIERJU1BMQVlfVFlQRV9TWU5DOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGlzcGxheVN5bmMobmFtZSk7Ci0gICAgICAgICAgICBjYXNlIERJU1BMQVlfVFlQRV9TWU5DX0hJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXNwbGF5U3luY0hpc3RvZ3JhbShuYW1lKTsKLSAgICAgICAgICAgIGNhc2UgRElTUExBWV9UWVBFX0dSQVBIOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGlzcGxheUdyYXBoKG5hbWUpOwotICAgICAgICAgICAgY2FzZSBESVNQTEFZX1RZUEVfU1lOQ19QRVJGOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGlzcGxheVN5bmNQZXJmKG5hbWUpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigiVW5rbm93biBEaXNwbGF5IFR5cGUgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGV2ZW50IHRvIHRoZSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQKLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyIFRoZSBsb2cgcGFyc2VyLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgbmV3RXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGRpc3BsYXkuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCByZXNldFVJKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGRpc3BsYXkgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBkaXNwbGF5IHR5cGUgYXMgYW4gaW50ZWdlcgotICAgICAqLwotICAgIGFic3RyYWN0IGludCBnZXREaXNwbGF5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgVUkgZm9yIHRoZSBldmVudCBkaXNwbGF5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyIHRoZSBjdXJyZW50IGxvZyBwYXJzZXIuCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sICh3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbikuCi0gICAgICovCi0gICAgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyLAotICAgICAgICAgICAgZmluYWwgSUxvZ0NvbHVtbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIGludGVyZmFjZSBJTG9nQ29sdW1uTGlzdGVuZXIgewotICAgICAgICB2b2lkIGNvbHVtblJlc2l6ZWQoaW50IGluZGV4LCBUYWJsZUNvbHVtbiBzb3VyY2VDb2x1bW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2NyaWJlcyBhbiBldmVudCB0byBiZSBkaXNwbGF5ZWQuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciB7Ci0KLSAgICAgICAgaW50IGV2ZW50VGFnID0gLTE7Ci0gICAgICAgIGludCBzZXJpZXNWYWx1ZUluZGV4ID0gLTE7Ci0gICAgICAgIGJvb2xlYW4gaW5jbHVkZVBpZCA9IGZhbHNlOwotICAgICAgICBpbnQgZmlsdGVyVmFsdWVJbmRleCA9IC0xOwotICAgICAgICBDb21wYXJlTWV0aG9kIGZpbHRlckNvbXBhcmVNZXRob2QgPSBDb21wYXJlTWV0aG9kLkVRVUFMX1RPOwotICAgICAgICBPYmplY3QgZmlsdGVyVmFsdWUgPSBudWxsOwotCi0gICAgICAgIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcihPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgcmVwbGFjZVdpdGgoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IoaW50IGV2ZW50VGFnKSB7Ci0gICAgICAgICAgICB0aGlzLmV2ZW50VGFnID0gZXZlbnRUYWc7Ci0gICAgICAgIH0KLQotICAgICAgICBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IoaW50IGV2ZW50VGFnLCBpbnQgc2VyaWVzVmFsdWVJbmRleCkgewotICAgICAgICAgICAgdGhpcy5ldmVudFRhZyA9IGV2ZW50VGFnOwotICAgICAgICAgICAgdGhpcy5zZXJpZXNWYWx1ZUluZGV4ID0gc2VyaWVzVmFsdWVJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVwbGFjZVdpdGgoT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGV2ZW50VGFnID0gZGVzY3JpcHRvci5ldmVudFRhZzsKLSAgICAgICAgICAgIHNlcmllc1ZhbHVlSW5kZXggPSBkZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXg7Ci0gICAgICAgICAgICBpbmNsdWRlUGlkID0gZGVzY3JpcHRvci5pbmNsdWRlUGlkOwotICAgICAgICAgICAgZmlsdGVyVmFsdWVJbmRleCA9IGRlc2NyaXB0b3IuZmlsdGVyVmFsdWVJbmRleDsKLSAgICAgICAgICAgIGZpbHRlckNvbXBhcmVNZXRob2QgPSBkZXNjcmlwdG9yLmZpbHRlckNvbXBhcmVNZXRob2Q7Ci0gICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IGRlc2NyaXB0b3IuZmlsdGVyVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTG9hZHMgdGhlIGRlc2NyaXB0b3IgcGFyYW1ldGVyIGZyb20gYSBzdG9yYWdlIHN0cmluZy4gVGhlIHN0b3JhZ2Ugc3RyaW5nIG11c3QgaGF2ZQotICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCB3aXRoIHtAbGluayAjZ2V0U3RvcmFnZVN0cmluZygpfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0b3JhZ2VTdHJpbmcgdGhlIHN0b3JhZ2Ugc3RyaW5nCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCB2b2lkIGxvYWRGcm9tKFN0cmluZyBzdG9yYWdlU3RyaW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBzdG9yYWdlU3RyaW5nLnNwbGl0KFBhdHRlcm4ucXVvdGUoREVTQ1JJUFRPUl9EQVRBX1NUT1JBR0VfU0VQQVJBVE9SKSk7Ci0gICAgICAgICAgICBsb2FkRnJvbSh2YWx1ZXMsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvYWRzIHRoZSBwYXJhbWV0ZXJzIGZyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0b3JhZ2VTdHJpbmdzIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyBlYWNoIHBhcmFtZXRlci4KLSAgICAgICAgICogQHBhcmFtIGluZGV4ICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICAgICAgICogQHJldHVybiB0aGUgbmV3IGluZGV4IGluIHRoZSBhcnJheS4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBpbnQgbG9hZEZyb20oU3RyaW5nW10gc3RvcmFnZVN0cmluZ3MsIGludCBpbmRleCkgewotICAgICAgICAgICAgZXZlbnRUYWcgPSBJbnRlZ2VyLnBhcnNlSW50KHN0b3JhZ2VTdHJpbmdzW2luZGV4KytdKTsKLSAgICAgICAgICAgIHNlcmllc1ZhbHVlSW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHN0b3JhZ2VTdHJpbmdzW2luZGV4KytdKTsKLSAgICAgICAgICAgIGluY2x1ZGVQaWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihzdG9yYWdlU3RyaW5nc1tpbmRleCsrXSk7Ci0gICAgICAgICAgICBmaWx0ZXJWYWx1ZUluZGV4ID0gSW50ZWdlci5wYXJzZUludChzdG9yYWdlU3RyaW5nc1tpbmRleCsrXSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbHRlckNvbXBhcmVNZXRob2QgPSBDb21wYXJlTWV0aG9kLnZhbHVlT2Yoc3RvcmFnZVN0cmluZ3NbaW5kZXgrK10pOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkga25vd24gQ29tcGFyZU1ldGhvZCwgd2UgaW5pdCBpdCB0byB0aGUgZGVmYXVsdCBvbmUKLSAgICAgICAgICAgICAgICBmaWx0ZXJDb21wYXJlTWV0aG9kID0gQ29tcGFyZU1ldGhvZC5FUVVBTF9UTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHN0b3JhZ2VTdHJpbmdzW2luZGV4KytdOwotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlSW5kZXggIT0gLTEgJiYgRklMVEVSX1ZBTFVFX05VTEwuZXF1YWxzKHZhbHVlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gRXZlbnRWYWx1ZVR5cGUuZ2V0T2JqZWN0RnJvbVN0b3JhZ2VTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RvcmFnZSBzdHJpbmcgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBnZXRTdG9yYWdlU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZXZlbnRUYWcpOwotICAgICAgICAgICAgc2IuYXBwZW5kKERFU0NSSVBUT1JfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc2VyaWVzVmFsdWVJbmRleCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoREVTQ1JJUFRPUl9EQVRBX1NUT1JBR0VfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChCb29sZWFuLnRvU3RyaW5nKGluY2x1ZGVQaWQpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChERVNDUklQVE9SX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGZpbHRlclZhbHVlSW5kZXgpOwotICAgICAgICAgICAgc2IuYXBwZW5kKERFU0NSSVBUT1JfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZmlsdGVyQ29tcGFyZU1ldGhvZC5uYW1lKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKERFU0NSSVBUT1JfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEV2ZW50VmFsdWVUeXBlLmdldFN0b3JhZ2VTdHJpbmcoZmlsdGVyVmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEZJTFRFUl9WQUxVRV9OVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGSUxURVJfVkFMVUVfTlVMTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIGFuIGV2ZW50IHZhbHVlIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVmFsdWVEaXNwbGF5RGVzY3JpcHRvciBleHRlbmRzIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZU5hbWU7Ci0gICAgICAgIGludCB2YWx1ZUluZGV4ID0gLTE7Ci0KLSAgICAgICAgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yKFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHJlcGxhY2VXaXRoKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcihpbnQgZXZlbnRUYWcsIFN0cmluZyB2YWx1ZU5hbWUsIGludCB2YWx1ZUluZGV4KSB7Ci0gICAgICAgICAgICBzdXBlcihldmVudFRhZyk7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlTmFtZSA9IHZhbHVlTmFtZTsKLSAgICAgICAgICAgIHRoaXMudmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yKGludCBldmVudFRhZywgU3RyaW5nIHZhbHVlTmFtZSwgaW50IHZhbHVlSW5kZXgsCi0gICAgICAgICAgICAgICAgaW50IHNlcmllc1ZhbHVlSW5kZXgpIHsKLSAgICAgICAgICAgIHN1cGVyKGV2ZW50VGFnLCBzZXJpZXNWYWx1ZUluZGV4KTsKLSAgICAgICAgICAgIHRoaXMudmFsdWVOYW1lID0gdmFsdWVOYW1lOwotICAgICAgICAgICAgdGhpcy52YWx1ZUluZGV4ID0gdmFsdWVJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHJlcGxhY2VXaXRoKE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBzdXBlci5yZXBsYWNlV2l0aChkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIFZhbHVlRGlzcGxheURlc2NyaXB0b3IgdmFsdWVEZXNjcmlwdG9yID0gKFZhbHVlRGlzcGxheURlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgdmFsdWVOYW1lID0gdmFsdWVEZXNjcmlwdG9yLnZhbHVlTmFtZTsKLSAgICAgICAgICAgICAgICB2YWx1ZUluZGV4ID0gdmFsdWVEZXNjcmlwdG9yLnZhbHVlSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTG9hZHMgdGhlIHBhcmFtZXRlcnMgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RvcmFnZVN0cmluZ3MgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIGVhY2ggcGFyYW1ldGVyLgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSBvZiBzdHJpbmdzLgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgaW5kZXggaW4gdGhlIGFycmF5LgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBpbnQgbG9hZEZyb20oU3RyaW5nW10gc3RvcmFnZVN0cmluZ3MsIGludCBpbmRleCkgewotICAgICAgICAgICAgaW5kZXggPSBzdXBlci5sb2FkRnJvbShzdG9yYWdlU3RyaW5ncywgaW5kZXgpOwotICAgICAgICAgICAgdmFsdWVOYW1lID0gc3RvcmFnZVN0cmluZ3NbaW5kZXgrK107Ci0gICAgICAgICAgICB2YWx1ZUluZGV4ID0gSW50ZWdlci5wYXJzZUludChzdG9yYWdlU3RyaW5nc1tpbmRleCsrXSk7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RvcmFnZSBzdHJpbmcgZm9yIHRoZSByZWNlaXZlci4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBTdHJpbmcgZ2V0U3RvcmFnZVN0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdXBlclN0b3JhZ2UgPSBzdXBlci5nZXRTdG9yYWdlU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHN1cGVyU3RvcmFnZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoREVTQ1JJUFRPUl9EQVRBX1NUT1JBR0VfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZU5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKERFU0NSSVBUT1JfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQodmFsdWVJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09Ci0gICAgICogRXZlbnQgRGlzcGxheSBwYXJhbWV0ZXJzLgotICAgICAqID09PT09PT09PT09PT09PT09PSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbU5hbWU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBpZEZpbHRlcmluZyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVBpZEZpbHRlckxpc3QgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiBtVmFsdWVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFZhbHVlRGlzcGxheURlc2NyaXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8T2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBtT2NjdXJyZW5jZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8T2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPigpOwotCi0gICAgLyogPT09PT09PT09PT09PT09PT09Ci0gICAgICogRXZlbnQgRGlzcGxheSBtZW1iZXJzIGZvciBkaXNwbGF5IHB1cnBvc2UuCi0gICAgICogPT09PT09PT09PT09PT09PT09ICovCi0gICAgLy8gY2hhcnQgb2JqZWN0cwotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBtYXAgb2YgKGRlc2NyaXB0b3IsIG1hcDIpIHdoZXJlIG1hcDIgaXMgYSBtYXAgb2YgKHBpZCwgY2hhcnQtc2VyaWVzKQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFZhbHVlRGlzcGxheURlc2NyaXB0b3IsIEhhc2hNYXA8SW50ZWdlciwgVGltZVNlcmllcz4+IG1WYWx1ZURlc2NyaXB0b3JTZXJpZXNNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8VmFsdWVEaXNwbGF5RGVzY3JpcHRvciwgSGFzaE1hcDxJbnRlZ2VyLCBUaW1lU2VyaWVzPj4oKTsKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgbWFwIG9mIChkZXNjcmlwdG9yLCBtYXAyKSB3aGVyZSBtYXAyIGlzIGEgbWFwIG9mIChwaWQsIGNoYXJ0LXNlcmllcykKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IsIEhhc2hNYXA8SW50ZWdlciwgVGltZVNlcmllcz4+IG1PY3VycmVuY2VEZXNjcmlwdG9yU2VyaWVzTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciwgSGFzaE1hcDxJbnRlZ2VyLCBUaW1lU2VyaWVzPj4oKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBtYXAgb2YgKFZhbHVlVHlwZSwgZGF0YXNldCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxWYWx1ZVR5cGUsIFRpbWVTZXJpZXNDb2xsZWN0aW9uPiBtVmFsdWVUeXBlRGF0YVNldE1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxWYWx1ZVR5cGUsIFRpbWVTZXJpZXNDb2xsZWN0aW9uPigpOwotCi0gICAgcHJvdGVjdGVkIEpGcmVlQ2hhcnQgbUNoYXJ0OwotICAgIHByb3RlY3RlZCBUaW1lU2VyaWVzQ29sbGVjdGlvbiBtT2NjdXJyZW5jZURhdGFTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGF0YVNldENvdW50OwotICAgIHByaXZhdGUgQ2hhcnRDb21wb3NpdGUgbUNoYXJ0Q29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBsb25nIG1NYXhpbXVtQ2hhcnRJdGVtQWdlID0gLTE7Ci0gICAgcHJvdGVjdGVkIGxvbmcgbUhpc3RXaWR0aCA9IDE7Ci0KLSAgICAvLyBsb2cgb2JqZWN0cy4KLSAgICBwcm90ZWN0ZWQgVGFibGUgbUxvZ1RhYmxlOwotCi0gICAgLyogPT09PT09PT09PT09PT09PT09Ci0gICAgICogTWlzYyBkYXRhLgotICAgICAqID09PT09PT09PT09PT09PT09PSAqLwotICAgIHByb3RlY3RlZCBpbnQgbVZhbHVlRGVzY3JpcHRvckNoZWNrID0gRVZFTlRfQ0hFQ0tfRkFJTEVEOwotCi0gICAgRXZlbnREaXNwbGF5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRXZlbnREaXNwbGF5IGNsb25lKEV2ZW50RGlzcGxheSBmcm9tKSB7Ci0gICAgICAgIEV2ZW50RGlzcGxheSBlZCA9IGV2ZW50RGlzcGxheUZhY3RvcnkoZnJvbS5nZXREaXNwbGF5VHlwZSgpLCBmcm9tLmdldE5hbWUoKSk7Ci0gICAgICAgIGVkLm1OYW1lID0gZnJvbS5tTmFtZTsKLSAgICAgICAgZWQubVBpZEZpbHRlcmluZyA9IGZyb20ubVBpZEZpbHRlcmluZzsKLSAgICAgICAgZWQubU1heGltdW1DaGFydEl0ZW1BZ2UgPSBmcm9tLm1NYXhpbXVtQ2hhcnRJdGVtQWdlOwotICAgICAgICBlZC5tSGlzdFdpZHRoID0gZnJvbS5tSGlzdFdpZHRoOwotCi0gICAgICAgIGlmIChmcm9tLm1QaWRGaWx0ZXJMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVkLm1QaWRGaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgICAgICAgICAgZWQubVBpZEZpbHRlckxpc3QuYWRkQWxsKGZyb20ubVBpZEZpbHRlckxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChWYWx1ZURpc3BsYXlEZXNjcmlwdG9yIGRlc2MgOiBmcm9tLm1WYWx1ZURlc2NyaXB0b3JzKSB7Ci0gICAgICAgICAgICBlZC5tVmFsdWVEZXNjcmlwdG9ycy5hZGQobmV3IFZhbHVlRGlzcGxheURlc2NyaXB0b3IoZGVzYykpOwotICAgICAgICB9Ci0gICAgICAgIGVkLm1WYWx1ZURlc2NyaXB0b3JDaGVjayA9IGZyb20ubVZhbHVlRGVzY3JpcHRvckNoZWNrOwotCi0gICAgICAgIGZvciAoT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2MgOiBmcm9tLm1PY2N1cnJlbmNlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgIGVkLm1PY2N1cnJlbmNlRGVzY3JpcHRvcnMuYWRkKG5ldyBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IoZGVzYykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByZWNlaXZlciBhcyBhIHNpbmdsZSBTdHJpbmcgZm9yIHN0b3JhZ2UuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFN0b3JhZ2VTdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZChtTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotICAgICAgICBzYi5hcHBlbmQoZ2V0RGlzcGxheVR5cGUoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotICAgICAgICBzYi5hcHBlbmQoQm9vbGVhbi50b1N0cmluZyhtUGlkRmlsdGVyaW5nKSk7Ci0gICAgICAgIHNiLmFwcGVuZChESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotICAgICAgICBzYi5hcHBlbmQoZ2V0UGlkU3RvcmFnZVN0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKERJU1BMQVlfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgIHNiLmFwcGVuZChnZXREZXNjcmlwdG9yU3RvcmFnZVN0cmluZyhtVmFsdWVEZXNjcmlwdG9ycykpOwotICAgICAgICBzYi5hcHBlbmQoRElTUExBWV9EQVRBX1NUT1JBR0VfU0VQQVJBVE9SKTsKLSAgICAgICAgc2IuYXBwZW5kKGdldERlc2NyaXB0b3JTdG9yYWdlU3RyaW5nKG1PY2N1cnJlbmNlRGVzY3JpcHRvcnMpKTsKLSAgICAgICAgc2IuYXBwZW5kKERJU1BMQVlfREFUQV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgIHNiLmFwcGVuZChtTWF4aW11bUNoYXJ0SXRlbUFnZSk7Ci0gICAgICAgIHNiLmFwcGVuZChESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotICAgICAgICBzYi5hcHBlbmQobUhpc3RXaWR0aCk7Ci0gICAgICAgIHNiLmFwcGVuZChESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpOwotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFBpZEZpbHRlcmluZyhib29sZWFuIGZpbHRlckJ5UGlkKSB7Ci0gICAgICAgIG1QaWRGaWx0ZXJpbmcgPSBmaWx0ZXJCeVBpZDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGdldFBpZEZpbHRlcmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1QaWRGaWx0ZXJpbmc7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQaWRGaWx0ZXJMaXN0KEFycmF5TGlzdDxJbnRlZ2VyPiBwaWRzKSB7Ci0gICAgICAgIGlmIChtUGlkRmlsdGVyaW5nID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBpZEZpbHRlckxpc3QgPSBwaWRzOwotICAgIH0KLQotICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRQaWRGaWx0ZXJMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBpZEZpbHRlckxpc3Q7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRQaWRGaWxlcihpbnQgcGlkKSB7Ci0gICAgICAgIGlmIChtUGlkRmlsdGVyaW5nID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1QaWRGaWx0ZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaWRGaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBpZEZpbHRlckxpc3QuYWRkKHBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgbGlzdCBvZiB7QGxpbmsgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcn0uCi0gICAgICovCi0gICAgSXRlcmF0b3I8VmFsdWVEaXNwbGF5RGVzY3JpcHRvcj4gZ2V0VmFsdWVEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGNoZWNrcyBvbiB0aGUgZGVzY3JpcHRvcnMuIE11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIGEgZGVzY3JpcHRvciBpcyBtb2RpZmllZCBvdXRzaWRlCi0gICAgICogb2YgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVZhbHVlRGVzY3JpcHRvckNoZWNrKCkgewotICAgICAgICBtVmFsdWVEZXNjcmlwdG9yQ2hlY2sgPSBjaGVja0Rlc2NyaXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgbGlzdCBvZiB7QGxpbmsgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yfS4KLSAgICAgKi8KLSAgICBJdGVyYXRvcjxPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3I+IGdldE9jY3VycmVuY2VEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1PY2N1cnJlbmNlRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZGVzY3JpcHRvci4gVGhpcyBjYW4gYmUgYSB7QGxpbmsgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yfSBvciBhCi0gICAgICoge0BsaW5rIFZhbHVlRGlzcGxheURlc2NyaXB0b3J9LgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgdm9pZCBhZGREZXNjcmlwdG9yKE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgbVZhbHVlRGVzY3JpcHRvcnMuYWRkKChWYWx1ZURpc3BsYXlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIG1WYWx1ZURlc2NyaXB0b3JDaGVjayA9IGNoZWNrRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1PY2N1cnJlbmNlRGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgYnkgaW5kZXggYW5kIGNsYXNzIChleHRlbmRpbmcge0BsaW5rIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcn0pLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JDbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGRlc2NyaXB0b3IgdG8gcmV0dXJuLgotICAgICAqIEBwYXJhbSBpbmRleCAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBkZXNjcmlwdG9yIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuIGVpdGhlciBhIHtAbGluayBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3J9IG9yIGEge0BsaW5rIFZhbHVlRGlzcGxheURlc2NyaXB0b3J9Ci0gICAgICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5kZXNjcmlwdG9yQ2xhc3M8L2NvZGU+IGlzIGFub3RoZXIgY2xhc3MuCi0gICAgICovCi0gICAgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yQ2xhc3MsIGludCBpbmRleCkgewotCi0gICAgICAgIGlmIChkZXNjcmlwdG9yQ2xhc3MgPT0gT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU9jY3VycmVuY2VEZXNjcmlwdG9ycy5nZXQoaW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3JDbGFzcyA9PSBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlRGVzY3JpcHRvcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBkZXNjcmlwdG9yIGJhc2VkIG9uIGl0cyBjbGFzcyBhbmQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvckNsYXNzIHRoZSBjbGFzcyBvZiB0aGUgZGVzY3JpcHRvci4KLSAgICAgKiBAcGFyYW0gaW5kZXggICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGVzY3JpcHRvciB0byBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihDbGFzczw/IGV4dGVuZHMgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yQ2xhc3MsIGludCBpbmRleCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvckNsYXNzID09IE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvci5jbGFzcykgewotICAgICAgICAgICAgbU9jY3VycmVuY2VEZXNjcmlwdG9ycy5yZW1vdmUoaW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3JDbGFzcyA9PSBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yLmNsYXNzKSB7Ci0gICAgICAgICAgICBtVmFsdWVEZXNjcmlwdG9ycy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgbVZhbHVlRGVzY3JpcHRvckNoZWNrID0gY2hlY2tEZXNjcmlwdG9ycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udHJvbCBjcmVhdGVDb21wb3NpdGVDaGFydChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgbUNoYXJ0ID0gQ2hhcnRGYWN0b3J5LmNyZWF0ZVRpbWVTZXJpZXNDaGFydCgKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwgLyogdGltZUF4aXNMYWJlbCAqLywKLSAgICAgICAgICAgICAgICBudWxsIC8qIHZhbHVlQXhpc0xhYmVsICovLAotICAgICAgICAgICAgICAgIG51bGwsIC8qIGRhdGFzZXQuIHNldCBiZWxvdyAqLwotICAgICAgICAgICAgICAgIHRydWUgLyogbGVnZW5kICovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIHRvb2x0aXBzICovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIHVybHMgKi8pOwotCi0gICAgICAgIC8vIGdldCB0aGUgZm9udCB0byBtYWtlIGEgcHJvcGVyIHRpdGxlLiBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHN3dCBmb250LAotICAgICAgICAvLyBpbnRvIGFuIGF3dCBmb250LgotICAgICAgICBGb250IGYgPSBwYXJlbnQuZ2V0Rm9udCgpOwotICAgICAgICBGb250RGF0YVtdIGZEYXRhID0gZi5nZXRGb250RGF0YSgpOwotCi0gICAgICAgIC8vIGV2ZW50IHRob3VnaCBvbiBNYWMgT1MgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBmb250RGF0YSwgd2UnbGwgb25seSB1c2UKLSAgICAgICAgLy8gdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgRm9udERhdGEgZmlyc3RGb250RGF0YSA9IGZEYXRhWzBdOwotCi0gICAgICAgIGphdmEuYXd0LkZvbnQgYXd0Rm9udCA9IFNXVFV0aWxzLnRvQXd0Rm9udChwYXJlbnQuZ2V0RGlzcGxheSgpLAotICAgICAgICAgICAgICAgIGZpcnN0Rm9udERhdGEsIHRydWUgLyogZW5zdXJlU2FtZVNpemUgKi8pOwotCi0KLSAgICAgICAgbUNoYXJ0LnNldFRpdGxlKG5ldyBUZXh0VGl0bGUodGl0bGUsIGF3dEZvbnQpKTsKLQotICAgICAgICBmaW5hbCBYWVBsb3QgeHlQbG90ID0gbUNoYXJ0LmdldFhZUGxvdCgpOwotICAgICAgICB4eVBsb3Quc2V0UmFuZ2VDcm9zc2hhaXJWaXNpYmxlKHRydWUpOwotICAgICAgICB4eVBsb3Quc2V0UmFuZ2VDcm9zc2hhaXJMb2NrZWRPbkRhdGEodHJ1ZSk7Ci0gICAgICAgIHh5UGxvdC5zZXREb21haW5Dcm9zc2hhaXJWaXNpYmxlKHRydWUpOwotICAgICAgICB4eVBsb3Quc2V0RG9tYWluQ3Jvc3NoYWlyTG9ja2VkT25EYXRhKHRydWUpOwotCi0gICAgICAgIG1DaGFydC5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgQ2hhcnRDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJ0Q2hhbmdlZChDaGFydENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgQ2hhcnRDaGFuZ2VFdmVudFR5cGUgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBDaGFydENoYW5nZUV2ZW50VHlwZS5HRU5FUkFMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHZhbHVlIHdlIG5lZWQgKHJhbmdlQ3Jvc3NoYWlyIGFuZCBkb21haW5Dcm9zc2hhaXIpIGFyZQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIG9uIHRoZSBkcmF3LCBidXQgdGhlIG5vdGlmaWNhdGlvbiBoYXBwZW5zIGJlZm9yZSB0aGUgZHJhdywKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyB0aGUgY2xpY2sgaW4gYSBmdXR1cmUgcnVubmFibGUhCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ2xpY2soeHlQbG90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtQ2hhcnRDb21wb3NpdGUgPSBuZXcgQ2hhcnRDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSLCBtQ2hhcnQsCi0gICAgICAgICAgICAgICAgQ2hhcnRDb21wb3NpdGUuREVGQVVMVF9XSURUSCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX0hFSUdIVCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX01JTklNVU1fRFJBV19XSURUSCwKLSAgICAgICAgICAgICAgICBDaGFydENvbXBvc2l0ZS5ERUZBVUxUX01JTklNVU1fRFJBV19IRUlHSFQsCi0gICAgICAgICAgICAgICAgMzAwMCwgLy8gbWF4IGRyYXcgd2lkdGguIFdlIGRvbid0IHdhbnQgaXQgdG8gem9vbSwgc28gd2UgcHV0IGEgYmlnIG51bWJlcgotICAgICAgICAgICAgICAgIDMwMDAsIC8vIG1heCBkcmF3IGhlaWdodC4gV2UgZG9uJ3Qgd2FudCBpdCB0byB6b29tLCBzbyB3ZSBwdXQgYSBiaWcgbnVtYmVyCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIG9mZi1zY3JlZW4gYnVmZmVyCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICB0cnVlLCAgLy8gc2F2ZQotICAgICAgICAgICAgICAgIHRydWUsICAvLyBwcmludAotICAgICAgICAgICAgICAgIHRydWUsICAvLyB6b29tCi0gICAgICAgICAgICAgICAgdHJ1ZSk7ICAgLy8gdG9vbHRpcHMKLQotICAgICAgICBtQ2hhcnRDb21wb3NpdGUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGVEYXRhU2V0TWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbURhdGFTZXRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbU9jY3VycmVuY2VEYXRhU2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQ2hhcnQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1DaGFydENvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbVZhbHVlRGVzY3JpcHRvclNlcmllc01hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1PY3VycmVuY2VEZXNjcmlwdG9yU2VyaWVzTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBtQ2hhcnRDb21wb3NpdGU7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NsaWNrKFhZUGxvdCB4eVBsb3QpIHsKLSAgICAgICAgZG91YmxlIHJhbmdlVmFsdWUgPSB4eVBsb3QuZ2V0UmFuZ2VDcm9zc2hhaXJWYWx1ZSgpOwotICAgICAgICBpZiAocmFuZ2VWYWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICBkb3VibGUgZG9tYWluVmFsdWUgPSB4eVBsb3QuZ2V0RG9tYWluQ3Jvc3NoYWlyVmFsdWUoKTsKLQotICAgICAgICAgICAgTWlsbGlzZWNvbmQgbXNlYyA9IG5ldyBNaWxsaXNlY29uZChuZXcgRGF0ZSgobG9uZykgZG9tYWluVmFsdWUpKTsKLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgdmFsdWVzIGluIHRoZSBkYXRhc2V0IHRoYXQgY29udGFpbnMgZGF0YSBhdCB0aGlzIFRpbWVQZXJpb2QKLSAgICAgICAgICAgIFNldDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiBkZXNjS2V5cyA9IG1WYWx1ZURlc2NyaXB0b3JTZXJpZXNNYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoVmFsdWVEaXNwbGF5RGVzY3JpcHRvciBkZXNjS2V5IDogZGVzY0tleXMpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwPEludGVnZXIsIFRpbWVTZXJpZXM+IG1hcCA9IG1WYWx1ZURlc2NyaXB0b3JTZXJpZXNNYXAuZ2V0KGRlc2NLZXkpOwotCi0gICAgICAgICAgICAgICAgU2V0PEludGVnZXI+IHBpZEtleXMgPSBtYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEludGVnZXIgcGlkS2V5IDogcGlkS2V5cykgewotICAgICAgICAgICAgICAgICAgICBUaW1lU2VyaWVzIHNlcmllcyA9IG1hcC5nZXQocGlkS2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSBzZXJpZXMuZ2V0VmFsdWUobXNlYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIG1hdGNoLiBsZXRzIGNoZWNrIGFnYWluc3QgdGhlIGFjdHVhbCB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kb3VibGVWYWx1ZSgpID09IHJhbmdlVmFsdWUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzaXplcyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+LXRoIGNvbHVtbiBvZiB0aGUgbG9nIHtAbGluayBUYWJsZX0gKGlmIGFwcGxpY2FibGUpLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBkb2VzIG5vdGhpbmcgaWYgdGhlIDxjb2RlPlRhYmxlPC9jb2RlPiBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gKGJlY2F1c2UgdGhlIGRpc3BsYXkKLSAgICAgKiB0eXBlIGRvZXMgbm90IHVzZSBhIGNvbHVtbikgb3IgaWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPi10aCBjb2x1bW4gaXMgaW4gZmFjdCB0aGUgb3JpZ2luYXRpbmcKLSAgICAgKiBjb2x1bW4gcGFzc2VkIGFzIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZXNpemUKLSAgICAgKiBAcGFyYW0gc291cmNlQ29sdW1uIHRoZSBvcmlnaW5hbCBjb2x1bW4gdGhhdCB3YXMgcmVzaXplLCBhbmQgb24gd2hpY2ggd2UgbmVlZCB0byBzeW5jIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgaW5kZXgtdGggY29sdW1uIHdpZHRoLgotICAgICAqLwotICAgIHZvaWQgcmVzaXplQ29sdW1uKGludCBpbmRleCwgVGFibGVDb2x1bW4gc291cmNlQ29sdW1uKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB7QGxpbmsgRXZlbnRMb2dQYXJzZXJ9IG9iamVjdC4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TmV3TG9nUGFyc2VyKEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZXBhcmVzIHRoZSB7QGxpbmsgRXZlbnREaXNwbGF5fSBmb3IgYSBtdWx0aSBldmVudCBkaXNwbGF5LgotICAgICAqLwotICAgIHZvaWQgc3RhcnRNdWx0aUV2ZW50RGlzcGxheSgpIHsKLSAgICAgICAgaWYgKG1Mb2dUYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTG9nVGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmFsaXplcyB0aGUge0BsaW5rIEV2ZW50RGlzcGxheX0gYWZ0ZXIgYSBtdWx0aSBldmVudCBkaXNwbGF5LgotICAgICAqLwotICAgIHZvaWQgZW5kTXVsdGlFdmVudERpc3BsYXkoKSB7Ci0gICAgICAgIGlmIChtTG9nVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxvZ1RhYmxlLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUYWJsZX0gb2JqZWN0IHVzZWQgdG8gZGlzcGxheSBldmVudHMsIGlmIGFueS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBUYWJsZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgVGFibGUgZ2V0VGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBtTG9nVGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBuZXcge0BsaW5rIEV2ZW50RGlzcGxheX0gZnJvbSBhIHN0b3JhZ2Ugc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0U3RvcmFnZVN0cmluZygpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdG9yYWdlU3RyaW5nIHRoZSBzdG9yYWdlIHN0cmluZwotICAgICAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEV2ZW50RGlzcGxheX0gb3IgbnVsbCBpZiB0aGUgbG9hZCBmYWlsZWQuCi0gICAgICovCi0gICAgc3RhdGljIEV2ZW50RGlzcGxheSBsb2FkKFN0cmluZyBzdG9yYWdlU3RyaW5nKSB7Ci0gICAgICAgIGlmIChzdG9yYWdlU3RyaW5nLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gdGhlIHN0b3JhZ2Ugc3RyaW5nIGlzIHNlcGFyYXRlZCBieSAnOicKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHN0b3JhZ2VTdHJpbmcuc3BsaXQoUGF0dGVybi5xdW90ZShESVNQTEFZX0RBVEFfU1RPUkFHRV9TRVBBUkFUT1IpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2YWx1ZXNbaW5kZXgrK107Ci0gICAgICAgICAgICAgICAgaW50IGRpc3BsYXlUeXBlID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZXNbaW5kZXgrK10pOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGlkRmlsdGVyaW5nID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWVzW2luZGV4KytdKTsKLQotICAgICAgICAgICAgICAgIEV2ZW50RGlzcGxheSBlZCA9IGV2ZW50RGlzcGxheUZhY3RvcnkoZGlzcGxheVR5cGUsIG5hbWUpOwotICAgICAgICAgICAgICAgIGVkLnNldFBpZEZpbHRlcmluZyhwaWRGaWx0ZXJpbmcpOwotCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBlbXB0eSBzZWN0aW9ucyBhcmUgcmVtb3ZlZCBieSBTdHJpbmcuc3BsaXQoKSwgd2UgaGF2ZSB0byBjaGVjawotICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCBmb3IgdGhvc2UuCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBlZC5sb2FkUGlkRmlsdGVycyh2YWx1ZXNbaW5kZXgrK10pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgZWQubG9hZFZhbHVlRGVzY3JpcHRvcnModmFsdWVzW2luZGV4KytdKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCB2YWx1ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkLmxvYWRPY2N1cnJlbmNlRGVzY3JpcHRvcnModmFsdWVzW2luZGV4KytdKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlZC51cGRhdGVWYWx1ZURlc2NyaXB0b3JDaGVjaygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBlZC5tTWF4aW11bUNoYXJ0SXRlbUFnZSA9IExvbmcucGFyc2VMb25nKHZhbHVlc1tpbmRleCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBlZC5tSGlzdFdpZHRoID0gTG9uZy5wYXJzZUxvbmcodmFsdWVzW2luZGV4KytdKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UnbGwgcmV0dXJuIG51bGwgYmVsb3cuCi0gICAgICAgICAgICAgICAgTG9nLmUoImRkbXMiLCByZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQaWRTdG9yYWdlU3RyaW5nKCkgewotICAgICAgICBpZiAobVBpZEZpbHRlckxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogbVBpZEZpbHRlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFBJRF9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkUGlkRmlsdGVycyhTdHJpbmcgc3RvcmFnZVN0cmluZykgewotICAgICAgICBpZiAoc3RvcmFnZVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHN0b3JhZ2VTdHJpbmcuc3BsaXQoUGF0dGVybi5xdW90ZShQSURfU1RPUkFHRV9TRVBBUkFUT1IpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVBpZEZpbHRlckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGlkRmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBpZEZpbHRlckxpc3QuYWRkKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlc2NyaXB0b3JTdG9yYWdlU3RyaW5nKAotICAgICAgICAgICAgQXJyYXlMaXN0PD8gZXh0ZW5kcyBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3I+IGRlc2NyaXB0b3JMaXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGVzY3JpcHRvckxpc3QpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChERVNDUklQVE9SX1NUT1JBR0VfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjcmlwdG9yLmdldFN0b3JhZ2VTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE9jY3VycmVuY2VEZXNjcmlwdG9ycyhTdHJpbmcgc3RvcmFnZVN0cmluZykgewotICAgICAgICBpZiAoc3RvcmFnZVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBzdG9yYWdlU3RyaW5nLnNwbGl0KFBhdHRlcm4ucXVvdGUoREVTQ1JJUFRPUl9TVE9SQUdFX1NFUEFSQVRPUikpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgZGVzYyA9IG5ldyBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIGRlc2MubG9hZEZyb20odmFsdWUpOwotICAgICAgICAgICAgbU9jY3VycmVuY2VEZXNjcmlwdG9ycy5hZGQoZGVzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFZhbHVlRGVzY3JpcHRvcnMoU3RyaW5nIHN0b3JhZ2VTdHJpbmcpIHsKLSAgICAgICAgaWYgKHN0b3JhZ2VTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gc3RvcmFnZVN0cmluZy5zcGxpdChQYXR0ZXJuLnF1b3RlKERFU0NSSVBUT1JfU1RPUkFHRV9TRVBBUkFUT1IpKTsKLQotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgVmFsdWVEaXNwbGF5RGVzY3JpcHRvciBkZXNjID0gbmV3IFZhbHVlRGlzcGxheURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIGRlc2MubG9hZEZyb20odmFsdWUpOwotICAgICAgICAgICAgbVZhbHVlRGVzY3JpcHRvcnMuYWRkKGRlc2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgYSBsaXN0IHdpdGgge0BsaW5rIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcn0gKG9yIGEgc3ViY2xhc3Mgb2YgaXQpIGZyb20gYW5vdGhlcgotICAgICAqIGxpc3QgaWYgdGhleSBhcmUgY29uZmlndXJlZCB0byBkaXNwbGF5IHRoZSB7QGxpbmsgRXZlbnRDb250YWluZXJ9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgICAgdGhlIGV2ZW50IGNvbnRhaW5lcgotICAgICAqIEBwYXJhbSBmdWxsTGlzdCB0aGUgbGlzdCB3aXRoIGFsbCB0aGUgZGVzY3JpcHRvcnMuCi0gICAgICogQHBhcmFtIG91dExpc3QgIHRoZSBsaXN0IHRvIGZpbGwuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGdldERlc2NyaXB0b3JzKEV2ZW50Q29udGFpbmVyIGV2ZW50LAotICAgICAgICAgICAgQXJyYXlMaXN0PD8gZXh0ZW5kcyBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3I+IGZ1bGxMaXN0LAotICAgICAgICAgICAgQXJyYXlMaXN0IG91dExpc3QpIHsKLSAgICAgICAgZm9yIChPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGZ1bGxMaXN0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBldmVudCB0YWcuCi0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZXZlbnRUYWcgPT0gZXZlbnQubVRhZykgewotICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgaWYgd2UgaGF2ZSBhIGZpbHRlciBvbiBhIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbHRlclZhbHVlSW5kZXggPT0gLTEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50ZXN0VmFsdWUoZGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4LCBkZXNjcmlwdG9yLmZpbHRlclZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWx0ZXJDb21wYXJlTWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0TGlzdC5hZGQoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsdGVyIGZvciB0aGUgZGVzY3JpcHRvciB3YXMgaW5jb3JyZWN0LCB3ZSBpZ25vcmUgdGhlIGRlc2NyaXB0b3IuCi0gICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluZGV4IHdhcyB3cm9uZyAodGhlIGV2ZW50IGNvbnRlbnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBzZXR1cCB0aGUKLSAgICAgICAgICAgICAgICAvLyBkaXNwbGF5KSwgd2UgZG8gbm90aGluZyBidXQgbG9nIHRoZSBlcnJvcgotICAgICAgICAgICAgICAgIExvZy5lKCJFdmVudCBMb2ciLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvY2N1cmVkIHdoZW4gY2hlY2tpbmcgJTEkZC10aCB2YWx1ZSBvZiBldmVudCAlMiRkIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4LCBkZXNjcmlwdG9yLmV2ZW50VGFnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXJzIHRoZSB7QGxpbmsgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcn0sIGFuZCBmaWxscyB0d28gbGlzdCBvZiB7QGxpbmsgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50LkV2ZW50RGlzcGxheS5WYWx1ZURpc3BsYXlEZXNjcmlwdG9yfQotICAgICAqIGFuZCB7QGxpbmsgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50LkV2ZW50RGlzcGxheS5PY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3J9IGNvbmZpZ3VyZWQgdG8gZGlzcGxheSB0aGUgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKiBAcGFyYW0gdmFsdWVEZXNjcmlwdG9ycwotICAgICAqIEBwYXJhbSBvY2N1cnJlbmNlRGVzY3JpcHRvcnMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXJFdmVudChFdmVudENvbnRhaW5lciBldmVudCwKLSAgICAgICAgICAgIEFycmF5TGlzdDxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiB2YWx1ZURlc2NyaXB0b3JzLAotICAgICAgICAgICAgQXJyYXlMaXN0PE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcj4gb2NjdXJyZW5jZURlc2NyaXB0b3JzKSB7Ci0KLSAgICAgICAgLy8gdGVzdCB0aGUgcGlkIGZpcnN0IChpZiBuZWVkZWQpCi0gICAgICAgIGlmIChtUGlkRmlsdGVyaW5nICYmIG1QaWRGaWx0ZXJMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IHBpZCA6IG1QaWRGaWx0ZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBpZCA9PSBldmVudC5waWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIGxpc3Qgb2YgbWF0Y2hpbmcgZGVzY3JpcHRvcnMKLSAgICAgICAgZ2V0RGVzY3JpcHRvcnMoZXZlbnQsIG1WYWx1ZURlc2NyaXB0b3JzLCB2YWx1ZURlc2NyaXB0b3JzKTsKLSAgICAgICAgZ2V0RGVzY3JpcHRvcnMoZXZlbnQsIG1PY2N1cnJlbmNlRGVzY3JpcHRvcnMsIG9jY3VycmVuY2VEZXNjcmlwdG9ycyk7Ci0KLSAgICAgICAgLy8gYW5kIHJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBtYXRjaCBpbiBlaXRoZXIgbGlzdC4KLSAgICAgICAgcmV0dXJuICh2YWx1ZURlc2NyaXB0b3JzLnNpemUoKSA+IDAgfHwgb2NjdXJyZW5jZURlc2NyaXB0b3JzLnNpemUoKSA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhbGwgdGhlIHtAbGluayBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yfSBmb3Igc2ltaWxhcml0eS4KLSAgICAgKiBJZiBhbGwgdGhlIGV2ZW50IHZhbHVlcyBhcmUgZnJvbSB0aGUgc2FtZSB0YWcsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gRVZFTlRfQ0hFQ0tfU0FNRV9UQUcuCi0gICAgICogSWYgYWxsIHRoZSBldmVudC92YWx1ZSBhcmUgdGhlIHNhbWUsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gRVZFTlRfQ0hFQ0tfU0FNRV9WQUxVRQotICAgICAqCi0gICAgICogQHJldHVybiBmbGFnIGFzIGRlc2NyaWJlZCBhYm92ZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNoZWNrRGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIGlmIChtVmFsdWVEZXNjcmlwdG9ycy5zaXplKCkgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVZFTlRfQ0hFQ0tfU0FNRV9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB0YWcgPSAtMTsKLSAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgIGZvciAoVmFsdWVEaXNwbGF5RGVzY3JpcHRvciBkaXNwbGF5IDogbVZhbHVlRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgIGlmICh0YWcgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0YWcgPSBkaXNwbGF5LmV2ZW50VGFnOwotICAgICAgICAgICAgICAgIGluZGV4ID0gZGlzcGxheS52YWx1ZUluZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAodGFnICE9IGRpc3BsYXkuZXZlbnRUYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVWRU5UX0NIRUNLX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBkaXNwbGF5LnZhbHVlSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVZFTlRfQ0hFQ0tfU0FNRV9UQUc7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRVZFTlRfQ0hFQ0tfU0FNRV9WQUxVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIHRpbWUgbGltaXQgb24gdGhlIGNoYXJ0IHRvIGJlIGluZmluaXRlLgotICAgICAqLwotICAgIHZvaWQgcmVzZXRDaGFydFRpbWVMaW1pdCgpIHsKLSAgICAgICAgbU1heGltdW1DaGFydEl0ZW1BZ2UgPSAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lIGxpbWl0IG9uIHRoZSBjaGFydHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZUxpbWl0IHRoZSB0aW1lIGxpbWl0IGluIHNlY29uZHMuCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGFydFRpbWVMaW1pdChsb25nIHRpbWVMaW1pdCkgewotICAgICAgICBtTWF4aW11bUNoYXJ0SXRlbUFnZSA9IHRpbWVMaW1pdDsKLSAgICB9Ci0KLSAgICBsb25nIGdldENoYXJ0VGltZUxpbWl0KCkgewotICAgICAgICByZXR1cm4gbU1heGltdW1DaGFydEl0ZW1BZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbQotICAgICAqIFJlc2V0cyB0aGUgaGlzdG9ncmFtIHdpZHRoCi0gICAgICovCi0gICAgdm9pZCByZXNldEhpc3RXaWR0aCgpIHsKLSAgICAgICAgbUhpc3RXaWR0aCA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaGlzdG9ncmFtIHdpZHRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGlzdFdpZHRoIHRoZSB3aWR0aCBpbiBob3VycwotICAgICAqLwotICAgIHZvaWQgc2V0SGlzdFdpZHRoKGxvbmcgaGlzdFdpZHRoKSB7Ci0gICAgICAgIG1IaXN0V2lkdGggPSBoaXN0V2lkdGg7Ci0gICAgfQotCi0gICAgbG9uZyBnZXRIaXN0V2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtSGlzdFdpZHRoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50RGlzcGxheU9wdGlvbnMuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50RGlzcGxheU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjM2NiMi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9FdmVudERpc3BsYXlPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLkRkbVVpUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSUltYWdlTG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudC5FdmVudERpc3BsYXkuT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudC5FdmVudERpc3BsYXkuVmFsdWVEaXNwbGF5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWNsYXNzIEV2ZW50RGlzcGxheU9wdGlvbnMgIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRExHX1dJRFRIID0gNzAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBETEdfSEVJR0hUID0gNzAwOwotICAgIAotICAgIHByaXZhdGUgSUltYWdlTG9hZGVyIG1JbWFnZUxvYWRlcjsKLQotICAgIHByaXZhdGUgU2hlbGwgbVBhcmVudDsKLSAgICBwcml2YXRlIFNoZWxsIG1TaGVsbDsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVkaXRTdGF0dXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFdmVudERpc3BsYXk+IG1EaXNwbGF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RXZlbnREaXNwbGF5PigpOwotCi0gICAgLyogTEVGVCBMSVNUICovCi0gICAgcHJpdmF0ZSBMaXN0IG1FdmVudERpc3BsYXlMaXN0OwotICAgIHByaXZhdGUgQnV0dG9uIG1FdmVudERpc3BsYXlOZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUV2ZW50RGlzcGxheURlbGV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRXZlbnREaXNwbGF5VXBCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUV2ZW50RGlzcGxheURvd25CdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0IG1EaXNwbGF5V2lkdGhUZXh0OwotICAgIHByaXZhdGUgVGV4dCBtRGlzcGxheUhlaWdodFRleHQ7Ci0KLSAgICAvKiBXSURHRVRTIE9OIFRIRSBSSUdIVCAqLwotICAgIHByaXZhdGUgVGV4dCBtRGlzcGxheU5hbWVUZXh0OwotICAgIHByaXZhdGUgQ29tYm8gbURpc3BsYXlUeXBlQ29tYm87Ci0gICAgcHJpdmF0ZSBHcm91cCBtQ2hhcnRPcHRpb25zOwotICAgIHByaXZhdGUgR3JvdXAgbUhpc3RPcHRpb25zOwotICAgIHByaXZhdGUgQnV0dG9uIG1QaWRGaWx0ZXJDaGVja0JveDsKLSAgICBwcml2YXRlIFRleHQgbVBpZFRleHQ7Ci0KLSAgICAvKiogTWFwIHdpdGggKGV2ZW50LXRhZywgZXZlbnQgbmFtZSkgKi8KLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IG1FdmVudFRhZ01hcDsKLQotICAgIC8qKiBNYXAgd2l0aCAoZXZlbnQtdGFnLCBhcnJheSBvZiB2YWx1ZSBpbmZvIGZvciB0aGUgZXZlbnQpICovCi0gICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRXZlbnRWYWx1ZURlc2NyaXB0aW9uW10+IG1FdmVudERlc2NyaXB0aW9uTWFwOwotCi0gICAgLyoqIGxpc3Qgb2YgY3VycmVudCBwaWRzICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVBpZExpc3Q7Ci0KLSAgICBwcml2YXRlIEV2ZW50TG9nUGFyc2VyIG1Mb2dQYXJzZXI7Ci0KLSAgICBwcml2YXRlIEdyb3VwIG1JbmZvR3JvdXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25XaWRnZXRzIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IG1MaXN0OwotICAgICAgICBwcml2YXRlIEJ1dHRvbiBtTmV3QnV0dG9uOwotICAgICAgICBwcml2YXRlIEJ1dHRvbiBtRWRpdEJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBCdXR0b24gbURlbGV0ZUJ1dHRvbjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtTGlzdC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgICAgICBtTmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgICAgIG1FZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgICAgIG1EZWxldGVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU2VsZWN0aW9uV2lkZ2V0cyBtVmFsdWVTZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBTZWxlY3Rpb25XaWRnZXRzIG1PY2N1cnJlbmNlU2VsZWN0aW9uOwotICAgIAotICAgIC8qKiBmbGFnIHRvIHRlbXBvcmFybHkgZGlzYWJsZSBwcm9jZXNzaW5nIG9mIHtAbGluayBUZXh0fSBjaGFuZ2VzLCBzbyB0aGF0IAotICAgICAqIHtAbGluayBUZXh0I3NldFRleHQoU3RyaW5nKX0gY2FuIGJlIGNhbGxlZCBzYWZlbHkuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcm9jZXNzVGV4dENoYW5nZXMgPSB0cnVlOwotICAgIHByaXZhdGUgVGV4dCBtVGltZUxpbWl0VGV4dDsKLSAgICBwcml2YXRlIFRleHQgbUhpc3RXaWR0aFRleHQ7Ci0KLSAgICBFdmVudERpc3BsYXlPcHRpb25zKElJbWFnZUxvYWRlciBpbWFnZUxvYWRlciwgU2hlbGwgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULkJPUkRFUiB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gICAgICAgIG1JbWFnZUxvYWRlciA9IGltYWdlTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBkaXNwbGF5IG9wdGlvbiBkaWFsb2csIHRvIGVkaXQgdGhlIHtAbGluayBFdmVudERpc3BsYXl9IG9iamVjdHMgcHJvdmlkZWQgaW4gdGhlCi0gICAgICogbGlzdC4KLSAgICAgKiBAcGFyYW0gbG9nUGFyc2VyCi0gICAgICogQHBhcmFtIGRpc3BsYXlMaXN0Ci0gICAgICogQHBhcmFtIGV2ZW50TGlzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdCBvZiB7QGxpbmsgRXZlbnREaXNwbGF5fSBvYmplY3RzIHdhcyB1cGRhdGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gb3BlbihFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIsIEFycmF5TGlzdDxFdmVudERpc3BsYXk+IGRpc3BsYXlMaXN0LAotICAgICAgICAgICAgQXJyYXlMaXN0PEV2ZW50Q29udGFpbmVyPiBldmVudExpc3QpIHsKLSAgICAgICAgbUxvZ1BhcnNlciA9IGxvZ1BhcnNlcjsKLQotICAgICAgICBpZiAobG9nUGFyc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgMiB0aGluZ3MgZnJvbSB0aGUgcGFyc2VyLgotICAgICAgICAgICAgLy8gdGhlIGV2ZW50IHRhZyAvIGV2ZW50IG5hbWUgbWFwCi0gICAgICAgICAgICBtRXZlbnRUYWdNYXAgPSBsb2dQYXJzZXIuZ2V0VGFnTWFwKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBldmVudCBpbmZvIG1hcAotICAgICAgICAgICAgbUV2ZW50RGVzY3JpcHRpb25NYXAgPSBsb2dQYXJzZXIuZ2V0RXZlbnRJbmZvTWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgRXZlbnREaXNwbGF5IGxpc3Qgc2luY2Ugd2UnbGwgdXNlIHdvcmtpbmcgY29waWVzLgotICAgICAgICBkdXBsaWNhdGVFdmVudERpc3BsYXkoZGlzcGxheUxpc3QpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgYSBsaXN0IG9mIHBpZCBmcm9tIHRoZSBsaXN0IG9mIGV2ZW50cy4KLSAgICAgICAgYnVpbGRQaWRMaXN0KGV2ZW50TGlzdCk7Ci0KLSAgICAgICAgY3JlYXRlVUkoKTsKLQotICAgICAgICBpZiAobVBhcmVudCA9PSBudWxsIHx8IG1TaGVsbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIGRpYWxvZyBzaXplLgotICAgICAgICBtU2hlbGwuc2V0TWluaW11bVNpemUoRExHX1dJRFRILCBETEdfSEVJR0hUKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBtUGFyZW50LmdldEJvdW5kcygpOwotICAgICAgICAvLyBnZXQgdGhlIGNlbnRlciBuZXcgdG9wIGxlZnQuCi0gICAgICAgIGludCBjeCA9IHIueCArIHIud2lkdGgvMjsKLSAgICAgICAgaW50IHggPSBjeCAtIERMR19XSURUSCAvIDI7Ci0gICAgICAgIGludCBjeSA9IHIueSArIHIuaGVpZ2h0LzI7Ci0gICAgICAgIGludCB5ID0gY3kgLSBETEdfSEVJR0hUIC8gMjsKLSAgICAgICAgbVNoZWxsLnNldEJvdW5kcyh4LCB5LCBETEdfV0lEVEgsIERMR19IRUlHSFQpOwotCi0gICAgICAgIG1TaGVsbC5sYXlvdXQoKTsKLQotICAgICAgICAvLyBhY3R1YWxseSBvcGVuIHRoZSBkaWFsb2cKLSAgICAgICAgbVNoZWxsLm9wZW4oKTsKLQotICAgICAgICAvLyBldmVudCBsb29wIHVudGlsIHRoZSBkaWFsb2cgaXMgY2xvc2VkLgotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBtUGFyZW50LmdldERpc3BsYXkoKTsKLSAgICAgICAgd2hpbGUgKCFtU2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICAgICAgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbUVkaXRTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIEFycmF5TGlzdDxFdmVudERpc3BsYXk+IGdldEV2ZW50RGlzcGxheXMoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzcGxheUxpc3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVVSSgpIHsKLSAgICAgICAgbVBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICBtU2hlbGwgPSBuZXcgU2hlbGwobVBhcmVudCwgZ2V0U3R5bGUoKSk7Ci0gICAgICAgIG1TaGVsbC5zZXRUZXh0KCJFdmVudCBEaXNwbGF5IENvbmZpZ3VyYXRpb24iKTsKLQotICAgICAgICBtU2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgdG9wUGFuZWwgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICB0b3BQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgdG9wUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgdGhlIHRyZWUgb24gdGhlIGxlZnQgYW5kIHRoZSBjb250cm9scyBvbiB0aGUgcmlnaHQuCi0gICAgICAgIENvbXBvc2l0ZSBsZWZ0UGFuZWwgPSBuZXcgQ29tcG9zaXRlKHRvcFBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIENvbXBvc2l0ZSByaWdodFBhbmVsID0gbmV3IENvbXBvc2l0ZSh0b3BQYW5lbCwgU1dULk5PTkUpOwotCi0gICAgICAgIGNyZWF0ZUxlZnRQYW5lbChsZWZ0UGFuZWwpOwotICAgICAgICBjcmVhdGVSaWdodFBhbmVsKHJpZ2h0UGFuZWwpOwotCi0gICAgICAgIG1TaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGJvdHRvbUJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21CdXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBHcmlkTGF5b3V0IGdsOwotICAgICAgICBib3R0b21CdXR0b25zLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAKLSAgICAgICAgQnV0dG9uIG9rQnV0dG9uID0gbmV3IEJ1dHRvbihib3R0b21CdXR0b25zLCBTV1QuUFVTSCk7Ci0gICAgICAgIG9rQnV0dG9uLnNldFRleHQoIk9LIik7Ci0gICAgICAgIG9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUJ1dHRvbnMsIFNXVC5QVVNIKTsKLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldFRleHQoIkNhbmNlbCIpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIG1vZGlmaWNhdGlvbiBmbGFnLgotICAgICAgICAgICAgICAgIG1FZGl0U3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gYW5kIGNsb3NlCi0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGVuYWJsZShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBmaWxsIHRoZSBsaXN0IHdpdGggdGhlIGN1cnJlbnQgZGlzcGxheQotICAgICAgICBmaWxsRXZlbnREaXNwbGF5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVMZWZ0UGFuZWwoQ29tcG9zaXRlIGxlZnRQYW5lbCkgewotICAgICAgICBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ2w7Ci0KLSAgICAgICAgbGVmdFBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLSAgICAgICAgbGVmdFBhbmVsLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0gICAgICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0KLSAgICAgICAgbUV2ZW50RGlzcGxheUxpc3QgPSBuZXcgTGlzdChsZWZ0UGFuZWwsCi0gICAgICAgICAgICAgICAgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbUV2ZW50RGlzcGxheUxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFdmVudERpc3BsYXlTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJvdHRvbUNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShsZWZ0UGFuZWwsIFNXVC5OT05FKTsKLSAgICAgICAgYm90dG9tQ29udHJvbHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbnRyb2xzLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZ2wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCi0gICAgICAgIG1FdmVudERpc3BsYXlOZXdCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUNvbnRyb2xzLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgbUV2ZW50RGlzcGxheU5ld0J1dHRvbi5zZXRJbWFnZShtSW1hZ2VMb2FkZXIubG9hZEltYWdlKCJhZGQucG5nIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBsZWZ0UGFuZWwuZ2V0RGlzcGxheSgpKSk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlOZXdCdXR0b24uc2V0VG9vbFRpcFRleHQoIkFkZHMgYSBuZXcgZXZlbnQgZGlzcGxheSIpOwotICAgICAgICBtRXZlbnREaXNwbGF5TmV3QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlOZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVOZXdFdmVudERpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBtRXZlbnREaXNwbGF5RGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihib3R0b21Db250cm9scywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEZWxldGVCdXR0b24uc2V0SW1hZ2UobUltYWdlTG9hZGVyLmxvYWRJbWFnZSgiZGVsZXRlLnBuZyIsIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbGVmdFBhbmVsLmdldERpc3BsYXkoKSkpOwotICAgICAgICBtRXZlbnREaXNwbGF5RGVsZXRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJEZWxldGVzIHRoZSBzZWxlY3RlZCBldmVudCBkaXNwbGF5Iik7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLSAgICAgICAgbUV2ZW50RGlzcGxheURlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZUV2ZW50RGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtRXZlbnREaXNwbGF5VXBCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUNvbnRyb2xzLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgbUV2ZW50RGlzcGxheVVwQnV0dG9uLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoInVwLnBuZyIsIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbGVmdFBhbmVsLmdldERpc3BsYXkoKSkpOwotICAgICAgICBtRXZlbnREaXNwbGF5VXBCdXR0b24uc2V0VG9vbFRpcFRleHQoIk1vdmVzIHRoZSBzZWxlY3RlZCBldmVudCBkaXNwbGF5IHVwIik7Ci0gICAgICAgIG1FdmVudERpc3BsYXlVcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0aW9uID0gbUV2ZW50RGlzcGxheUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGxpc3Qgb2YgRXZlbnREaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICBFdmVudERpc3BsYXkgZGlzcGxheSA9IG1EaXNwbGF5TGlzdC5yZW1vdmUoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlMaXN0LmFkZChzZWxlY3Rpb24gLSAxLCBkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlzdCB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgbUV2ZW50RGlzcGxheUxpc3QucmVtb3ZlKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlMaXN0LmFkZChkaXNwbGF5LmdldE5hbWUoKSwgc2VsZWN0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiBhbmQgcmVzZXQgdGhlIHVpLgotICAgICAgICAgICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5zZWxlY3Qoc2VsZWN0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50RGlzcGxheVNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5zaG93U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1FdmVudERpc3BsYXlEb3duQnV0dG9uID0gbmV3IEJ1dHRvbihib3R0b21Db250cm9scywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEb3duQnV0dG9uLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoImRvd24ucG5nIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBsZWZ0UGFuZWwuZ2V0RGlzcGxheSgpKSk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEb3duQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJNb3ZlcyB0aGUgc2VsZWN0ZWQgZXZlbnQgZGlzcGxheSBkb3duIik7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAgICAgICAgICAgIGludCBzZWxlY3Rpb24gPSBtRXZlbnREaXNwbGF5TGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gLTEgJiYgc2VsZWN0aW9uIDwgbUV2ZW50RGlzcGxheUxpc3QuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlzdCBvZiBFdmVudERpc3BsYXkuCi0gICAgICAgICAgICAgICAgICAgIEV2ZW50RGlzcGxheSBkaXNwbGF5ID0gbURpc3BsYXlMaXN0LnJlbW92ZShzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBtRGlzcGxheUxpc3QuYWRkKHNlbGVjdGlvbiArIDEsIGRpc3BsYXkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBsaXN0IHdpZGdldAotICAgICAgICAgICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5yZW1vdmUoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbUV2ZW50RGlzcGxheUxpc3QuYWRkKGRpc3BsYXkuZ2V0TmFtZSgpLCBzZWxlY3Rpb24gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGFuZCByZXNldCB0aGUgdWkuCi0gICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlMaXN0LnNlbGVjdChzZWxlY3Rpb24gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXZlbnREaXNwbGF5U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlMaXN0LnNob3dTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBHcm91cCBzaXplR3JvdXAgPSBuZXcgR3JvdXAobGVmdFBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNpemVHcm91cC5zZXRUZXh0KCJEaXNwbGF5IFNpemU6Iik7Ci0gICAgICAgIHNpemVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc2l6ZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoc2l6ZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiV2lkdGg6Iik7Ci0gICAgICAgIAotICAgICAgICBtRGlzcGxheVdpZHRoVGV4dCA9IG5ldyBUZXh0KHNpemVHcm91cCwgU1dULkxFRlQgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1EaXNwbGF5V2lkdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRGlzcGxheVdpZHRoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgc3RvcmUuZ2V0SW50KEV2ZW50TG9nUGFuZWwuUFJFRlNfRElTUExBWV9XSURUSCkpKTsKLSAgICAgICAgbURpc3BsYXlXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBtRGlzcGxheVdpZHRoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKEV2ZW50TG9nUGFuZWwuUFJFRlNfRElTUExBWV9XSURUSCwgSW50ZWdlci5wYXJzZUludCh0ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmc/Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKHNpemVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIkhlaWdodDoiKTsKLQotICAgICAgICBtRGlzcGxheUhlaWdodFRleHQgPSBuZXcgVGV4dChzaXplR3JvdXAsIFNXVC5MRUZUIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBtRGlzcGxheUhlaWdodFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0VGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgc3RvcmUuZ2V0SW50KEV2ZW50TG9nUGFuZWwuUFJFRlNfRElTUExBWV9IRUlHSFQpKSk7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1EaXNwbGF5SGVpZ2h0VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKEV2ZW50TG9nUGFuZWwuUFJFRlNfRElTUExBWV9IRUlHSFQsIEludGVnZXIucGFyc2VJbnQodGV4dCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nPwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJpZ2h0UGFuZWwoQ29tcG9zaXRlIHJpZ2h0UGFuZWwpIHsKLSAgICAgICAgcmlnaHRQYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotICAgICAgICByaWdodFBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIG1JbmZvR3JvdXAgPSBuZXcgR3JvdXAocmlnaHRQYW5lbCwgU1dULk5PTkUpOwotICAgICAgICBtSW5mb0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKG1JbmZvR3JvdXAsIFNXVC5MRUZUKTsKLSAgICAgICAgbmFtZUxhYmVsLnNldFRleHQoIk5hbWU6Iik7Ci0KLSAgICAgICAgbURpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KG1JbmZvR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTEVGVCB8IFNXVC5TSU5HTEUpOwotICAgICAgICBtRGlzcGxheU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRGlzcGxheU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc1RleHRDaGFuZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgPSBnZXRDdXJyZW50RXZlbnREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudERpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LnNldE5hbWUobURpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUV2ZW50RGlzcGxheUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlMaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5hZGQoZXZlbnREaXNwbGF5LmdldE5hbWUoKSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUV2ZW50RGlzcGxheUxpc3Quc2VsZWN0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50RGlzcGxheVNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgZGlzcGxheUxhYmVsID0gbmV3IExhYmVsKG1JbmZvR3JvdXAsIFNXVC5MRUZUKTsKLSAgICAgICAgZGlzcGxheUxhYmVsLnNldFRleHQoIlR5cGU6Iik7Ci0gICAgICAgIAotICAgICAgICBtRGlzcGxheVR5cGVDb21ibyA9IG5ldyBDb21ibyhtSW5mb0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkRST1BfRE9XTik7Ci0gICAgICAgIG1EaXNwbGF5VHlwZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAvLyBhZGQgdGhlIGNvbWJvIHZhbHVlcy4gVGhpcyBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgRXZlbnREaXNwbGF5LkRJU1BMQVlfVFlQRV8qCi0gICAgICAgIG1EaXNwbGF5VHlwZUNvbWJvLmFkZCgiTG9nIEFsbCIpOwotICAgICAgICBtRGlzcGxheVR5cGVDb21iby5hZGQoIkZpbHRlcmVkIExvZyIpOwotICAgICAgICBtRGlzcGxheVR5cGVDb21iby5hZGQoIkdyYXBoIik7Ci0gICAgICAgIG1EaXNwbGF5VHlwZUNvbWJvLmFkZCgiU3luYyIpOwotICAgICAgICBtRGlzcGxheVR5cGVDb21iby5hZGQoIlN5bmMgSGlzdG9ncmFtIik7Ci0gICAgICAgIG1EaXNwbGF5VHlwZUNvbWJvLmFkZCgiU3luYyBQZXJmb3JtYW5jZSIpOwotICAgICAgICBtRGlzcGxheVR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgPSBnZXRDdXJyZW50RXZlbnREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50RGlzcGxheSAhPSBudWxsICYmIGV2ZW50RGlzcGxheS5nZXREaXNwbGF5VHlwZSgpICE9IG1EaXNwbGF5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSB0aGUgRXZlbnREaXNwbGF5IG9iamVjdCB3aXRoIGEgZGlmZmVyZW50IHN1YmNsYXNzICovCi0gICAgICAgICAgICAgICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnREaXNwbGF5LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IG5ld0V2ZW50RGlzcGxheSA9IEV2ZW50RGlzcGxheS5ldmVudERpc3BsYXlGYWN0b3J5KG1EaXNwbGF5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCksIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50RXZlbnREaXNwbGF5KG5ld0V2ZW50RGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxVaVdpdGgobmV3RXZlbnREaXNwbGF5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbUNoYXJ0T3B0aW9ucyA9IG5ldyBHcm91cChtSW5mb0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1DaGFydE9wdGlvbnMuc2V0VGV4dCgiQ2hhcnQgT3B0aW9ucyIpOwotICAgICAgICBHcmlkRGF0YSBnZDsKLSAgICAgICAgbUNoYXJ0T3B0aW9ucy5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1DaGFydE9wdGlvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKG1DaGFydE9wdGlvbnMsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJUaW1lIExpbWl0IChzZWNvbmRzKToiKTsKLSAgICAgICAgCi0gICAgICAgIG1UaW1lTGltaXRUZXh0ID0gbmV3IFRleHQobUNoYXJ0T3B0aW9ucywgU1dULkJPUkRFUik7Ci0gICAgICAgIG1UaW1lTGltaXRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtVGltZUxpbWl0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1UaW1lTGltaXRUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IGdldEN1cnJlbnRFdmVudERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERpc3BsYXkucmVzZXRDaGFydFRpbWVMaW1pdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERpc3BsYXkuc2V0Q2hhcnRUaW1lTGltaXQoTG9uZy5wYXJzZUxvbmcodGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudERpc3BsYXkucmVzZXRDaGFydFRpbWVMaW1pdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUhpc3RPcHRpb25zID0gbmV3IEdyb3VwKG1JbmZvR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbUhpc3RPcHRpb25zLnNldFRleHQoIkhpc3RvZ3JhbSBPcHRpb25zIik7Ci0gICAgICAgIEdyaWREYXRhIGdkaDsKLSAgICAgICAgbUhpc3RPcHRpb25zLnNldExheW91dERhdGEoZ2RoID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZGguaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBtSGlzdE9wdGlvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBsaCA9IG5ldyBMYWJlbChtSGlzdE9wdGlvbnMsIFNXVC5OT05FKTsKLSAgICAgICAgbGguc2V0VGV4dCgiSGlzdG9ncmFtIHdpZHRoIChob3Vycyk6Iik7Ci0gICAgICAgIAotICAgICAgICBtSGlzdFdpZHRoVGV4dCA9IG5ldyBUZXh0KG1IaXN0T3B0aW9ucywgU1dULkJPUkRFUik7Ci0gICAgICAgIG1IaXN0V2lkdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtSGlzdFdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1IaXN0V2lkdGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IGdldEN1cnJlbnRFdmVudERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERpc3BsYXkucmVzZXRIaXN0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LnNldEhpc3RXaWR0aChMb25nLnBhcnNlTG9uZyh0ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5yZXNldEhpc3RXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVBpZEZpbHRlckNoZWNrQm94ID0gbmV3IEJ1dHRvbihtSW5mb0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBtUGlkRmlsdGVyQ2hlY2tCb3guc2V0VGV4dCgiRW5hYmxlIGZpbHRlcmluZyBieSBwaWQiKTsKLSAgICAgICAgbVBpZEZpbHRlckNoZWNrQm94LnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbVBpZEZpbHRlckNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IGdldEN1cnJlbnRFdmVudERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LnNldFBpZEZpbHRlcmluZyhtUGlkRmlsdGVyQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBtUGlkVGV4dC5zZXRFbmFibGVkKG1QaWRGaWx0ZXJDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBwaWRMYWJlbCA9IG5ldyBMYWJlbChtSW5mb0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIHBpZExhYmVsLnNldFRleHQoIlBpZCBGaWx0ZXI6Iik7Ci0gICAgICAgIHBpZExhYmVsLnNldFRvb2xUaXBUZXh0KCJFbnRlciBhbGwgcGlkcywgc2VwYXJhdGVkIGJ5IGNvbW1hcyIpOwotICAgICAgICAKLSAgICAgICAgbVBpZFRleHQgPSBuZXcgVGV4dChtSW5mb0dyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVBpZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1QaWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc1RleHRDaGFuZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgPSBnZXRDdXJyZW50RXZlbnREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudERpc3BsYXkgIT0gbnVsbCAmJiBldmVudERpc3BsYXkuZ2V0UGlkRmlsdGVyaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaWRUZXh0ID0gbVBpZFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBpZHMgPSBwaWRUZXh0LnNwbGl0KCJcXHMqLFxccyoiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwaWQgOiBwaWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoSW50ZWdlci52YWx1ZU9mKHBpZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgbm9uIHZhbGlkIHBpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LnNldFBpZEZpbHRlckxpc3QobGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgKiBFVkVOVCBWQUxVRS9PQ0NVUlJFTkNFIFNFTEVDVElPTgotICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgbVZhbHVlU2VsZWN0aW9uID0gY3JlYXRlRXZlbnRTZWxlY3Rpb24ocmlnaHRQYW5lbCwgVmFsdWVEaXNwbGF5RGVzY3JpcHRvci5jbGFzcywKLSAgICAgICAgICAgICAgICAiRXZlbnQgVmFsdWUgRGlzcGxheSIpOwotICAgICAgICBtT2NjdXJyZW5jZVNlbGVjdGlvbiA9IGNyZWF0ZUV2ZW50U2VsZWN0aW9uKHJpZ2h0UGFuZWwsIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvci5jbGFzcywKLSAgICAgICAgICAgICAgICAiRXZlbnQgT2NjdXJyZW5jZSBEaXNwbGF5Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZWxlY3Rpb25XaWRnZXRzIGNyZWF0ZUV2ZW50U2VsZWN0aW9uKENvbXBvc2l0ZSByaWdodFBhbmVsLAotICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvcj4gZGVzY3JpcHRvckNsYXNzLAotICAgICAgICAgICAgU3RyaW5nIGdyb3VwTWVzc2FnZSkgewotCi0gICAgICAgIEdyb3VwIGV2ZW50U2VsZWN0aW9uUGFuZWwgPSBuZXcgR3JvdXAocmlnaHRQYW5lbCwgU1dULk5PTkUpOwotICAgICAgICBldmVudFNlbGVjdGlvblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBHcmlkTGF5b3V0IGdsOwotICAgICAgICBldmVudFNlbGVjdGlvblBhbmVsLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZXZlbnRTZWxlY3Rpb25QYW5lbC5zZXRUZXh0KGdyb3VwTWVzc2FnZSk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZWxlY3Rpb25XaWRnZXRzIHdpZGdldHMgPSBuZXcgU2VsZWN0aW9uV2lkZ2V0cygpOwotICAgICAgICAKLSAgICAgICAgd2lkZ2V0cy5tTGlzdCA9IG5ldyBMaXN0KGV2ZW50U2VsZWN0aW9uUGFuZWwsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMKTsKLSAgICAgICAgd2lkZ2V0cy5tTGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgd2lkZ2V0cy5tTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHdpZGdldHMubUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd2lkZ2V0cy5tRGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpZGdldHMubUVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3aWRnZXRzLm1EZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpZGdldHMubUVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBDb21wb3NpdGUgcmlnaHRDb250cm9scyA9IG5ldyBDb21wb3NpdGUoZXZlbnRTZWxlY3Rpb25QYW5lbCwgU1dULk5PTkUpOwotICAgICAgICByaWdodENvbnRyb2xzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLSAgICAgICAgcmlnaHRDb250cm9scy5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgIGdsLmhvcml6b250YWxTcGFjaW5nID0gMDsKLQotICAgICAgICB3aWRnZXRzLm1OZXdCdXR0b24gPSBuZXcgQnV0dG9uKHJpZ2h0Q29udHJvbHMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICB3aWRnZXRzLm1OZXdCdXR0b24uc2V0VGV4dCgiTmV3Li4uIik7Ci0gICAgICAgIHdpZGdldHMubU5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgd2lkZ2V0cy5tTmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB3aWRnZXRzLm1OZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGV2ZW50Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IGdldEN1cnJlbnRFdmVudERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50RGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFZhbHVlU2VsZWN0b3IgZGlhbG9nID0gbmV3IEV2ZW50VmFsdWVTZWxlY3RvcihtU2hlbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKGRlc2NyaXB0b3JDbGFzcywgbUxvZ1BhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERpc3BsYXkuYWRkRGVzY3JpcHRvcihkaWFsb2cuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsVWlXaXRoKGV2ZW50RGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdpZGdldHMubUVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKHJpZ2h0Q29udHJvbHMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICB3aWRnZXRzLm1FZGl0QnV0dG9uLnNldFRleHQoIkVkaXQuLi4iKTsKLSAgICAgICAgd2lkZ2V0cy5tRWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgd2lkZ2V0cy5tRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgd2lkZ2V0cy5tRWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZXZlbnQKLSAgICAgICAgICAgICAgICBFdmVudERpc3BsYXkgZXZlbnREaXNwbGF5ID0gZ2V0Q3VycmVudEV2ZW50RGlzcGxheSgpOwotICAgICAgICAgICAgICAgIGlmIChldmVudERpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBpbmRleAotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB3aWRnZXRzLm1MaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZXNjcmlwdG9yIGl0c2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBldmVudERpc3BsYXkuZ2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckNsYXNzLCBpbmRleCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIHRoZSBlZGl0IGRpYWxvZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VmFsdWVTZWxlY3RvciBkaWFsb2cgPSBuZXcgRXZlbnRWYWx1ZVNlbGVjdG9yKG1TaGVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oZGVzY3JpcHRvciwgbUxvZ1BhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlcGxhY2VXaXRoKGRpYWxvZy5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS51cGRhdGVWYWx1ZURlc2NyaXB0b3JDaGVjaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxVaVdpdGgoZXZlbnREaXNwbGF5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VsZWN0IHRoZSBpdGVtIHNpbmNlIGZpbGxVaVdpdGggcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0cy5tTGlzdC5zZWxlY3QoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldHMubUxpc3Qubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdpZGdldHMubURlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocmlnaHRDb250cm9scywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIHdpZGdldHMubURlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgd2lkZ2V0cy5tRGVsZXRlQnV0dG9uLnNldFRleHQoIkRlbGV0ZSIpOwotICAgICAgICB3aWRnZXRzLm1EZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHdpZGdldHMubURlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZXZlbnQKLSAgICAgICAgICAgICAgICBFdmVudERpc3BsYXkgZXZlbnREaXNwbGF5ID0gZ2V0Q3VycmVudEV2ZW50RGlzcGxheSgpOwotICAgICAgICAgICAgICAgIGlmIChldmVudERpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBpbmRleAotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB3aWRnZXRzLm1MaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LnJlbW92ZURlc2NyaXB0b3IoZGVzY3JpcHRvckNsYXNzLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxsVWlXaXRoKGV2ZW50RGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gd2lkZ2V0czsKLSAgICB9Ci0gICAKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZHVwbGljYXRlRXZlbnREaXNwbGF5KEFycmF5TGlzdDxFdmVudERpc3BsYXk+IGRpc3BsYXlMaXN0KSB7Ci0gICAgICAgIGZvciAoRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA6IGRpc3BsYXlMaXN0KSB7Ci0gICAgICAgICAgICBtRGlzcGxheUxpc3QuYWRkKEV2ZW50RGlzcGxheS5jbG9uZShldmVudERpc3BsYXkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYnVpbGRQaWRMaXN0KEFycmF5TGlzdDxFdmVudENvbnRhaW5lcj4gZXZlbnRMaXN0KSB7Ci0gICAgICAgIG1QaWRMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgICAgICBmb3IgKEV2ZW50Q29udGFpbmVyIGV2ZW50IDogZXZlbnRMaXN0KSB7Ci0gICAgICAgICAgICBpZiAobVBpZExpc3QuaW5kZXhPZihldmVudC5waWQpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVBpZExpc3QuYWRkKGV2ZW50LnBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0TW9kaWZpZWQoKSB7Ci0gICAgICAgIG1FZGl0U3RhdHVzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlKGJvb2xlYW4gc3RhdHVzKSB7Ci0gICAgICAgIG1FdmVudERpc3BsYXlEZWxldGVCdXR0b24uc2V0RW5hYmxlZChzdGF0dXMpOwotCi0gICAgICAgIC8vIGVuYWJsZSB1cC9kb3duCi0gICAgICAgIGludCBzZWxlY3Rpb24gPSBtRXZlbnREaXNwbGF5TGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpbnQgY291bnQgPSBtRXZlbnREaXNwbGF5TGlzdC5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgbUV2ZW50RGlzcGxheVVwQnV0dG9uLnNldEVuYWJsZWQoc3RhdHVzICYmIHNlbGVjdGlvbiA+IDApOwotICAgICAgICBtRXZlbnREaXNwbGF5RG93bkJ1dHRvbi5zZXRFbmFibGVkKHN0YXR1cyAmJiBzZWxlY3Rpb24gIT0gLTEgJiYgc2VsZWN0aW9uIDwgY291bnQgLSAxKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVUZXh0LnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgICAgbURpc3BsYXlUeXBlQ29tYm8uc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgICBtUGlkRmlsdGVyQ2hlY2tCb3guc2V0RW5hYmxlZChzdGF0dXMpOwotCi0gICAgICAgIG1WYWx1ZVNlbGVjdGlvbi5zZXRFbmFibGVkKHN0YXR1cyk7Ci0gICAgICAgIG1PY2N1cnJlbmNlU2VsZWN0aW9uLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgICAgbVZhbHVlU2VsZWN0aW9uLm1OZXdCdXR0b24uc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgICBtT2NjdXJyZW5jZVNlbGVjdGlvbi5tTmV3QnV0dG9uLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVBpZFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxFdmVudERpc3BsYXlMaXN0KCkgewotICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRGlzcGxheUxpc3QpIHsKLSAgICAgICAgICAgIG1FdmVudERpc3BsYXlMaXN0LmFkZChldmVudERpc3BsYXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTmV3RXZlbnREaXNwbGF5KCkgewotICAgICAgICBpbnQgY291bnQgPSBtRGlzcGxheUxpc3Quc2l6ZSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmcuZm9ybWF0KCJkaXNwbGF5ICUxJGQiLCBjb3VudCArIDEpOwotICAgICAgICAKLSAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IEV2ZW50RGlzcGxheS5ldmVudERpc3BsYXlGYWN0b3J5KDAgLyogdHlwZSovLCBuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIG1EaXNwbGF5TGlzdC5hZGQoZXZlbnREaXNwbGF5KTsKLSAgICAgICAgbUV2ZW50RGlzcGxheUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgbUV2ZW50RGlzcGxheUxpc3Quc2VsZWN0KGNvdW50KTsKLSAgICAgICAgaGFuZGxlRXZlbnREaXNwbGF5U2VsZWN0aW9uKCk7Ci0gICAgICAgIG1FdmVudERpc3BsYXlMaXN0LnNob3dTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkZWxldGVFdmVudERpc3BsYXkoKSB7Ci0gICAgICAgIGludCBzZWxlY3Rpb24gPSBtRXZlbnREaXNwbGF5TGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUxpc3QucmVtb3ZlKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5yZW1vdmUoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIGlmIChtRGlzcGxheUxpc3Quc2l6ZSgpIDwgc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRXZlbnREaXNwbGF5TGlzdC5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIGhhbmRsZUV2ZW50RGlzcGxheVNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFdmVudERpc3BsYXkgZ2V0Q3VycmVudEV2ZW50RGlzcGxheSgpIHsKLSAgICAgICAgaW50IHNlbGVjdGlvbiA9IG1FdmVudERpc3BsYXlMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUxpc3QuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDdXJyZW50RXZlbnREaXNwbGF5KEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkpIHsKLSAgICAgICAgaW50IHNlbGVjdGlvbiA9IG1FdmVudERpc3BsYXlMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gLTEpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TGlzdC5zZXQoc2VsZWN0aW9uLCBldmVudERpc3BsYXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFdmVudERpc3BsYXlTZWxlY3Rpb24oKSB7Ci0gICAgICAgIEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgPSBnZXRDdXJyZW50RXZlbnREaXNwbGF5KCk7Ci0gICAgICAgIGlmIChldmVudERpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBVSQotICAgICAgICAgICAgZW5hYmxlKHRydWUpOwotCi0gICAgICAgICAgICAvLyBhbmQgZmlsbCBpdAotICAgICAgICAgICAgZmlsbFVpV2l0aChldmVudERpc3BsYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgVUkKLSAgICAgICAgICAgIGVuYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBlbXB0eSBpdC4KLSAgICAgICAgICAgIGVtcHR5VWkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbXB0eVVpKCkgewotICAgICAgICBtRGlzcGxheU5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICBtRGlzcGxheVR5cGVDb21iby5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICBtVmFsdWVTZWxlY3Rpb24ubUxpc3QucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1PY2N1cnJlbmNlU2VsZWN0aW9uLm1MaXN0LnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsVWlXaXRoKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkpIHsKLSAgICAgICAgbVByb2Nlc3NUZXh0Q2hhbmdlcyA9IGZhbHNlOwotCi0gICAgICAgIG1EaXNwbGF5TmFtZVRleHQuc2V0VGV4dChldmVudERpc3BsYXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW50IGRpc3BsYXlNb2RlID0gZXZlbnREaXNwbGF5LmdldERpc3BsYXlUeXBlKCk7Ci0gICAgICAgIG1EaXNwbGF5VHlwZUNvbWJvLnNlbGVjdChkaXNwbGF5TW9kZSk7Ci0gICAgICAgIGlmIChkaXNwbGF5TW9kZSA9PSBFdmVudERpc3BsYXkuRElTUExBWV9UWVBFX0dSQVBIKSB7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbUNoYXJ0T3B0aW9ucy5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICBnZC5leGNsdWRlID0gZmFsc2U7Ci0gICAgICAgICAgICBtQ2hhcnRPcHRpb25zLnNldFZpc2libGUoIWdkLmV4Y2x1ZGUpOwotICAgICAgICAgICAgbG9uZyBsaW1pdCA9IGV2ZW50RGlzcGxheS5nZXRDaGFydFRpbWVMaW1pdCgpOwotICAgICAgICAgICAgaWYgKGxpbWl0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVMaW1pdFRleHQuc2V0VGV4dChMb25nLnRvU3RyaW5nKGxpbWl0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UaW1lTGltaXRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbUNoYXJ0T3B0aW9ucy5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgICAgICBnZC5leGNsdWRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1DaGFydE9wdGlvbnMuc2V0VmlzaWJsZSghZ2QuZXhjbHVkZSk7Ci0gICAgICAgICAgICBtVGltZUxpbWl0VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpc3BsYXlNb2RlID09IEV2ZW50RGlzcGxheS5ESVNQTEFZX1RZUEVfU1lOQ19ISVNUKSB7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgbUhpc3RPcHRpb25zLmdldExheW91dERhdGEoKTsKLSAgICAgICAgICAgIGdkLmV4Y2x1ZGUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1IaXN0T3B0aW9ucy5zZXRWaXNpYmxlKCFnZC5leGNsdWRlKTsKLSAgICAgICAgICAgIGxvbmcgbGltaXQgPSBldmVudERpc3BsYXkuZ2V0SGlzdFdpZHRoKCk7Ci0gICAgICAgICAgICBpZiAobGltaXQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtSGlzdFdpZHRoVGV4dC5zZXRUZXh0KExvbmcudG9TdHJpbmcobGltaXQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUhpc3RXaWR0aFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKSBtSGlzdE9wdGlvbnMuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICAgICAgZ2QuZXhjbHVkZSA9IHRydWU7Ci0gICAgICAgICAgICBtSGlzdE9wdGlvbnMuc2V0VmlzaWJsZSghZ2QuZXhjbHVkZSk7Ci0gICAgICAgICAgICBtSGlzdFdpZHRoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIG1JbmZvR3JvdXAubGF5b3V0KHRydWUpOwotICAgICAgICBtU2hlbGwubGF5b3V0KHRydWUpOwotICAgICAgICBtU2hlbGwucGFjaygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGV2ZW50RGlzcGxheS5nZXRQaWRGaWx0ZXJpbmcoKSkgewotICAgICAgICAgICAgbVBpZEZpbHRlckNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIG1QaWRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBwaWQgbGlzdC4KLSAgICAgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gZXZlbnREaXNwbGF5LmdldFBpZEZpbHRlckxpc3QoKTsKLSAgICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGlkVGV4dC5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBpZEZpbHRlckNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBtUGlkVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1QaWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBtUHJvY2Vzc1RleHRDaGFuZ2VzID0gdHJ1ZTsKLQotICAgICAgICBtVmFsdWVTZWxlY3Rpb24ubUxpc3QucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1PY2N1cnJlbmNlU2VsZWN0aW9uLm1MaXN0LnJlbW92ZUFsbCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGV2ZW50RGlzcGxheS5nZXREaXNwbGF5VHlwZSgpID09IEV2ZW50RGlzcGxheS5ESVNQTEFZX1RZUEVfRklMVEVSRURfTE9HIHx8Ci0gICAgICAgICAgICAgICAgZXZlbnREaXNwbGF5LmdldERpc3BsYXlUeXBlKCkgPT0gRXZlbnREaXNwbGF5LkRJU1BMQVlfVFlQRV9HUkFQSCkgewotICAgICAgICAgICAgbU9jY3VycmVuY2VTZWxlY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1WYWx1ZVNlbGVjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxWYWx1ZURpc3BsYXlEZXNjcmlwdG9yPiB2YWx1ZUl0ZXJhdG9yID0gZXZlbnREaXNwbGF5LmdldFZhbHVlRGVzY3JpcHRvcnMoKTsKLSAgICAKLSAgICAgICAgICAgIHdoaWxlICh2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFZhbHVlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHZhbHVlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIG1WYWx1ZVNlbGVjdGlvbi5tTGlzdC5hZGQoU3RyaW5nLmZvcm1hdCgiJTEkczogJTIkcyBbJTMkc10lNCRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FdmVudFRhZ01hcC5nZXQoZGVzY3JpcHRvci5ldmVudFRhZyksIGRlc2NyaXB0b3IudmFsdWVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VyaWVzTGFiZWxEZXNjcmlwdGlvbihkZXNjcmlwdG9yKSwgZ2V0RmlsdGVyRGVzY3JpcHRpb24oZGVzY3JpcHRvcikpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3I8T2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBvY2N1cnJlbmNlSXRlcmF0b3IgPQotICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5nZXRPY2N1cnJlbmNlRGVzY3JpcHRvcnMoKTsKLSAgICAKLSAgICAgICAgICAgIHdoaWxlIChvY2N1cnJlbmNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBvY2N1cnJlbmNlSXRlcmF0b3IubmV4dCgpOwotICAgIAotICAgICAgICAgICAgICAgIG1PY2N1cnJlbmNlU2VsZWN0aW9uLm1MaXN0LmFkZChTdHJpbmcuZm9ybWF0KCIlMSRzIFslMiRzXSUzJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUV2ZW50VGFnTWFwLmdldChkZXNjcmlwdG9yLmV2ZW50VGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcmllc0xhYmVsRGVzY3JpcHRpb24oZGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJEZXNjcmlwdGlvbihkZXNjcmlwdG9yKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVmFsdWVTZWxlY3Rpb24ubUxpc3Qubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG51bGwpOwotICAgICAgICAgICAgbU9jY3VycmVuY2VTZWxlY3Rpb24ubUxpc3Qubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU9jY3VycmVuY2VTZWxlY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVmFsdWVTZWxlY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTdHJpbmcgZGVzY3JpYmluZyB3aGF0IGlzIHVzZWQgYXMgdGhlIHNlcmllcyBsYWJlbAotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcmllc0xhYmVsRGVzY3JpcHRpb24oT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2VyaWVzVmFsdWVJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuaW5jbHVkZVBpZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzICsgcGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FdmVudERlc2NyaXB0aW9uTWFwLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5ldmVudFRhZylbZGVzY3JpcHRvci5zZXJpZXNWYWx1ZUluZGV4XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUV2ZW50RGVzY3JpcHRpb25NYXAuZ2V0KGRlc2NyaXB0b3IuZXZlbnRUYWcpW2Rlc2NyaXB0b3Iuc2VyaWVzVmFsdWVJbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJwaWQiOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRGaWx0ZXJEZXNjcmlwdGlvbihPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAoZGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiIFslMSRzICUyJHMgJTMkc10iLAotICAgICAgICAgICAgICAgICAgICBtRXZlbnREZXNjcmlwdGlvbk1hcC5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5ldmVudFRhZylbZGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4XS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWx0ZXJDb21wYXJlTWV0aG9kLnRlc3RTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbHRlclZhbHVlICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWx0ZXJWYWx1ZS50b1N0cmluZygpIDogIj8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRXZlbnRMb2dJbXBvcnRlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRXZlbnRMb2dJbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMwM2Y2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50TG9nSW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEltcG9ydHMgYSB0ZXh0dWFsIGV2ZW50IGxvZy4gIEdldHMgdGFncyBmcm9tIGJ1aWxkIHBhdGguCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudExvZ0ltcG9ydGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gbVRhZ3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtTG9nOwotCi0gICAgcHVibGljIEV2ZW50TG9nSW1wb3J0ZXIoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRvcCA9IFN5c3RlbS5nZXRlbnYoIkFORFJPSURfQlVJTERfVE9QIik7Ci0gICAgICAgIGlmICh0b3AgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0YWdGaWxlID0gdG9wICsgIi9zeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQtbG9nLXRhZ3MiOwotICAgICAgICBCdWZmZXJlZFJlYWRlciB0YWdSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0odGFnRmlsZSkpKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgZXZlbnRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVBhdGgpKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkVGFncyh0YWdSZWFkZXIpOwotICAgICAgICAgICAgcmVhZExvZyhldmVudFJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUYWdzKCkgewotICAgICAgICByZXR1cm4gbVRhZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldExvZygpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRUYWdzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY29udGVudCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudC5hZGQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRhZ3MgPSBjb250ZW50LnRvQXJyYXkobmV3IFN0cmluZ1tjb250ZW50LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkTG9nKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY29udGVudCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudC5hZGQobGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTG9nID0gY29udGVudC50b0FycmF5KG5ldyBTdHJpbmdbY29udGVudC5zaXplKCldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50TG9nUGFuZWwuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L0V2ZW50TG9nUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMzhkMS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9FdmVudExvZ1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5Mb2dSZWNlaXZlci5JTG9nTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5Mb2dSZWNlaXZlci5Mb2dFbnRyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5EZG1VaVByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklJbWFnZUxvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5UYWJsZVBhbmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmFjdGlvbnMuSUNvbW1vbkFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5hbm5vdGF0aW9uLlVpVGhyZWFkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmFubm90YXRpb24uV29ya2VyVGhyZWFkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudC5FdmVudERpc3BsYXkuSUxvZ0NvbHVtbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEV2ZW50IGxvZyB2aWV3ZXIKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50TG9nUGFuZWwgZXh0ZW5kcyBUYWJsZVBhbmVsIGltcGxlbWVudHMgSUxvZ0xpc3RlbmVyLAotICAgICAgICBJTG9nQ29sdW1uTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19GSUxFX0VYVCA9ICIudGFnIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0VWRU5UX0RJU1BMQVkgPSAiRXZlbnRMb2dQYW5lbC5ldmVudERpc3BsYXkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVWRU5UX0RJU1BMQVlfU1RPUkFHRV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfRElTUExBWV9XSURUSCA9ICJFdmVudExvZ1BhbmVsLndpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfRElTUExBWV9IRUlHSFQgPSAiRXZlbnRMb2dQYW5lbC5oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9ESVNQTEFZX1dJRFRIID0gNTAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUID0gNDAwOwotCi0gICAgcHJpdmF0ZSBJSW1hZ2VMb2FkZXIgbUltYWdlTG9hZGVyOwotCi0gICAgcHJpdmF0ZSBJRGV2aWNlIG1DdXJyZW50TG9nZ2VkRGV2aWNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50TG9nRmlsZTsKLSAgICBwcml2YXRlIExvZ1JlY2VpdmVyIG1DdXJyZW50TG9nUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBFdmVudExvZ1BhcnNlciBtQ3VycmVudEV2ZW50TG9nUGFyc2VyOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAvKiogbGlzdCBvZiBhbGwgdGhlIGV2ZW50cy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFdmVudENvbnRhaW5lcj4gbUV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8RXZlbnRDb250YWluZXI+KCk7Ci0KLSAgICAvKiogbGlzdCBvZiBhbGwgdGhlIG5ldyBldmVudHMsIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSB1aSAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEV2ZW50Q29udGFpbmVyPiBtTmV3RXZlbnRzID0gbmV3IEFycmF5TGlzdDxFdmVudENvbnRhaW5lcj4oKTsKLSAgICAvKiogaW5kaWNhdGVzIGEgcGVuZGluZyB1aSB0aHJlYWQgZGlzcGxheSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc3BsYXkgPSBmYWxzZTsKLQotICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgY3VzdG9tIGV2ZW50IGRpc3BsYXlzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RXZlbnREaXNwbGF5PiBtRXZlbnREaXNwbGF5cyA9IG5ldyBBcnJheUxpc3Q8RXZlbnREaXNwbGF5PigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBOdW1iZXJGb3JtYXQgbUZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1QYXJlbnQ7Ci0gICAgcHJpdmF0ZSBTY3JvbGxlZENvbXBvc2l0ZSBtQm90dG9tUGFyZW50UGFuZWw7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUJvdHRvbVBhbmVsOwotICAgIHByaXZhdGUgSUNvbW1vbkFjdGlvbiBtT3B0aW9uc0FjdGlvbjsKLSAgICBwcml2YXRlIElDb21tb25BY3Rpb24gbUNsZWFyQWN0aW9uOwotICAgIHByaXZhdGUgSUNvbW1vbkFjdGlvbiBtU2F2ZUFjdGlvbjsKLSAgICBwcml2YXRlIElDb21tb25BY3Rpb24gbUxvYWRBY3Rpb247Ci0gICAgcHJpdmF0ZSBJQ29tbW9uQWN0aW9uIG1JbXBvcnRBY3Rpb247Ci0KLSAgICAvKiogZmlsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IGxvZyByYXcgZGF0YS4gKi8KLSAgICBwcml2YXRlIEZpbGUgbVRlbXBGaWxlID0gbnVsbDsKLQotICAgIHB1YmxpYyBFdmVudExvZ1BhbmVsKElJbWFnZUxvYWRlciBpbWFnZUxvYWRlcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtSW1hZ2VMb2FkZXIgPSBpbWFnZUxvYWRlcjsKLSAgICAgICAgbUZvcm1hdHRlci5zZXRHcm91cGluZ1VzZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXh0ZXJuYWwgYWN0aW9ucy4KLSAgICAgKiA8cC8+VGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUge0BsaW5rIElDb21tb25BY3Rpb259IG9iamVjdHMgdG8gZXhlY3V0ZSB0aGUgcHJvcGVyIGNvZGUKLSAgICAgKiB3aGVuIHRyaWdnZXJlZCBieSB1c2luZyB7QGxpbmsgSUNvbW1vbkFjdGlvbiNzZXRSdW5uYWJsZShSdW5uYWJsZSl9LgotICAgICAqIDxwLz5JdCB3aWxsIGFsc28gbWFrZSBzdXJlIHRoZXkgYXJlIGVuYWJsZWQgb25seSB3aGVuIHBvc3NpYmxlLgotICAgICAqIEBwYXJhbSBvcHRpb25zQWN0aW9uCi0gICAgICogQHBhcmFtIGNsZWFyQWN0aW9uCi0gICAgICogQHBhcmFtIHNhdmVBY3Rpb24KLSAgICAgKiBAcGFyYW0gbG9hZEFjdGlvbgotICAgICAqIEBwYXJhbSBpbXBvcnRBY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25zKElDb21tb25BY3Rpb24gb3B0aW9uc0FjdGlvbiwgSUNvbW1vbkFjdGlvbiBjbGVhckFjdGlvbiwKLSAgICAgICAgICAgIElDb21tb25BY3Rpb24gc2F2ZUFjdGlvbiwgSUNvbW1vbkFjdGlvbiBsb2FkQWN0aW9uLCBJQ29tbW9uQWN0aW9uIGltcG9ydEFjdGlvbikgewotICAgICAgICBtT3B0aW9uc0FjdGlvbiA9IG9wdGlvbnNBY3Rpb247Ci0gICAgICAgIG1PcHRpb25zQWN0aW9uLnNldFJ1bm5hYmxlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBvcGVuT3B0aW9uUGFuZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUNsZWFyQWN0aW9uID0gY2xlYXJBY3Rpb247Ci0gICAgICAgIG1DbGVhckFjdGlvbi5zZXRSdW5uYWJsZShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJMb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVNhdmVBY3Rpb24gPSBzYXZlQWN0aW9uOwotICAgICAgICBtU2F2ZUFjdGlvbi5zZXRSdW5uYWJsZShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2cobVBhcmVudC5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRUZXh0KCJTYXZlIEV2ZW50IExvZyIpOwotICAgICAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCJldmVudC5sb2ciKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2coZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1Mb2FkQWN0aW9uID0gbG9hZEFjdGlvbjsKLSAgICAgICAgbUxvYWRBY3Rpb24uc2V0UnVubmFibGUobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKG1QYXJlbnQuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCi0gICAgICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRUZXh0KCJMb2FkIEV2ZW50IExvZyIpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZExvZyhmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtSW1wb3J0QWN0aW9uID0gaW1wb3J0QWN0aW9uOwotICAgICAgICBtSW1wb3J0QWN0aW9uLnNldFJ1bm5hYmxlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhtUGFyZW50LmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQotICAgICAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dCgiSW1wb3J0IEJ1ZyBSZXBvcnQiKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydEJ1Z1JlcG9ydChmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtT3B0aW9uc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUNsZWFyQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtU2F2ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgb3B0aW9uIHBhbmVsLgotICAgICAqIDwvcD4KLSAgICAgKiA8Yj5UaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZDwvYj4KLSAgICAgKi8KLSAgICBAVWlUaHJlYWQKLSAgICBwdWJsaWMgdm9pZCBvcGVuT3B0aW9uUGFuZWwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFdmVudERpc3BsYXlPcHRpb25zIGRpYWxvZyA9IG5ldyBFdmVudERpc3BsYXlPcHRpb25zKG1JbWFnZUxvYWRlciwgbVBhcmVudC5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbihtQ3VycmVudEV2ZW50TG9nUGFyc2VyLCBtRXZlbnREaXNwbGF5cywgbUV2ZW50cykpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV3IEV2ZW50RGlzcGxheSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1FdmVudERpc3BsYXlzLmFkZEFsbChkaWFsb2cuZ2V0RXZlbnREaXNwbGF5cygpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgbGlzdCBvZiBFdmVudERpc3BsYXkgY2hhbmdlZCwgd2Ugc3RvcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgIHNhdmVFdmVudERpc3BsYXlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVidWlsZFVpKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoIkV2ZW50TG9nIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgbG9nLgotICAgICAqIDxwLz4KLSAgICAgKiA8Yj5UaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZDwvYj4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckxvZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtRXZlbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbU5ld0V2ZW50cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGlzcGxheSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA6IG1FdmVudERpc3BsYXlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5yZXNldFVJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoIkV2ZW50TG9nIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBjb250ZW50IG9mIHRoZSBldmVudCBsb2cgaW50byBhIGZpbGUuIFRoZSBsb2cgaXMgc2F2ZWQgaW4gdGhlIHNhbWUKLSAgICAgKiBiaW5hcnkgZm9ybWF0IHRoYW4gb24gdGhlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gZmlsZVBhdGgKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZUxvZyhTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtQ3VycmVudExvZ2dlZERldmljZSAhPSBudWxsICYmIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICAgICAgICAgIGRlc3RGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1UZW1wRmlsZSk7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQotICAgICAgICAgICAgaW50IGNvdW50OwotCi0gICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gZmlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBmb3Mud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyB3ZSBzYXZlIHRoZSB0YWcgZmlsZQotICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aCArIFRBR19GSUxFX0VYVDsKLSAgICAgICAgICAgIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIuc2F2ZVRhZ3MoZmlsZVBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBiaW5hcnkgZXZlbnQgbG9nIChpZiBoYXMgYXNzb2NpYXRlZCAudGFnIGZpbGUpIG9yCi0gICAgICogb3RoZXJ3aXNlIGxvYWRzIGEgdGV4dHVhbCBldmVudCBsb2cuCi0gICAgICogQHBhcmFtIGZpbGVQYXRoIEV2ZW50IGxvZyBwYXRoIChhbmQgYmFzZSBvZiBwb3RlbnRpYWwgdGFnIGZpbGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZExvZyhTdHJpbmcgZmlsZVBhdGgpIHsKLSAgICAgICAgaWYgKChuZXcgRmlsZShmaWxlUGF0aCArIFRBR19GSUxFX0VYVCkpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBzdGFydEV2ZW50TG9nRnJvbUZpbGVzKGZpbGVQYXRoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2dJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBFdmVudExvZ0ltcG9ydGVyKGZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB0YWdzID0gaW1wb3J0ZXIuZ2V0VGFncygpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxvZyA9IGltcG9ydGVyLmdldExvZygpOwotICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnRMb2dGcm9tQ29udGVudCh0YWdzLCBsb2cpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGZyb20gc3RhcnRFdmVudExvZ0Zyb21GaWxlcywKLSAgICAgICAgICAgICAgICAvLyBhbmQgcHJldGVuZCB3ZSBuZXZlciB0cmllZCBFdmVudExvZ0ltcG9ydGVyCi0gICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nLkxvZ0xldmVsLkVSUk9SLCAiRXZlbnRMb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbHVyZSB0byByZWFkICUxJHMiLCBmaWxlUGF0aCArIFRBR19GSUxFX0VYVCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbXBvcnRCdWdSZXBvcnQoU3RyaW5nIGZpbGVQYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWdSZXBvcnRJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBCdWdSZXBvcnRJbXBvcnRlcihmaWxlUGF0aCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHRhZ3MgPSBpbXBvcnRlci5nZXRUYWdzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsb2cgPSBpbXBvcnRlci5nZXRMb2coKTsKLQotICAgICAgICAgICAgc3RhcnRFdmVudExvZ0Zyb21Db250ZW50KHRhZ3MsIGxvZyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLkVSUk9SLCAiSW1wb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbXBvcnQgYnVnIHJlcG9ydDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbXVpbGliLlNlbGVjdGlvbkRlcGVuZGVudFBhbmVsI2NsaWVudFNlbGVjdGVkKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRTZWxlY3RlZCgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbXVpbGliLlNlbGVjdGlvbkRlcGVuZGVudFBhbmVsI2RldmljZVNlbGVjdGVkKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VTZWxlY3RlZCgpIHsKLSAgICAgICAgc3RhcnRFdmVudExvZyhnZXRDdXJyZW50RGV2aWNlKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xpZW50Q2hhbmdlZChDbGllbnQgY2xpZW50LCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtdWlsaWIuUGFuZWwjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIG1QYXJlbnQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50TG9nUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRMb2dSZWNlaXZlci5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nUmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRFdmVudExvZ1BhcnNlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudExvZ2dlZERldmljZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXZlbnREaXNwbGF5cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUV2ZW50cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIC8vIGluaXQgc29tZSBzdG9yZSBzdHVmZgotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFBSRUZTX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9XSURUSCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoUFJFRlNfRElTUExBWV9IRUlHSFQsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpOwotCi0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbCA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbUJvdHRvbVBhcmVudFBhbmVsLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQotICAgICAgICBtQm90dG9tUGFyZW50UGFuZWwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJvdHRvbVBhbmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBtQm90dG9tUGFyZW50UGFuZWwuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgICAgICBtQm90dG9tUGFyZW50UGFuZWwuc2V0TWluU2l6ZShtQm90dG9tUGFuZWwuY29tcHV0ZVNpemUoci53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxUKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwcmVwYXJlRGlzcGxheVVpKCk7Ci0KLSAgICAgICAgLy8gbG9hZCB0aGUgRXZlbnREaXNwbGF5IGZyb20gc3RvcmFnZS4KLSAgICAgICAgbG9hZEV2ZW50RGlzcGxheXMoKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHVpCi0gICAgICAgIGNyZWF0ZURpc3BsYXlVaSgpOwotCi0gICAgICAgIHJldHVybiBtQm90dG9tUGFyZW50UGFuZWw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtdWlsaWIuUGFuZWwjcG9zdENyZWF0aW9uKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0Q3JlYXRpb24oKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG11aWxpYi5QYW5lbCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5zZXRGb2N1cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIG5ldyBsb2djYXQgYW5kIHNldCBtQ3VycmVudExvZ0NhdCBhcyB0aGUgY3VycmVudCByZWNlaXZlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2UgdG8gY29ubmVjdCBsb2djYXQgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RXZlbnRMb2coZmluYWwgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBtQ3VycmVudExvZ2dlZERldmljZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGxvZ2NhdCBhbHJlYWR5IHJ1bm5pbmcKLSAgICAgICAgaWYgKG1DdXJyZW50TG9nUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RvcEV2ZW50TG9nKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudExvZ2dlZERldmljZSA9IG51bGw7Ci0gICAgICAgIG1DdXJyZW50TG9nRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgb3V0cHV0IHJlY2VpdmVyCi0gICAgICAgICAgICBtQ3VycmVudExvZ1JlY2VpdmVyID0gbmV3IExvZ1JlY2VpdmVyKHRoaXMpOwotCi0gICAgICAgICAgICAvLyBzdGFydCB0aGUgbG9nY2F0IGluIGEgZGlmZmVyZW50IHRocmVhZAotICAgICAgICAgICAgbmV3IFRocmVhZCgiRXZlbnRMb2ciKSAgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGV2aWNlLmlzT25saW5lKCkgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudExvZ1JlY2VpdmVyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudExvZ1JlY2VpdmVyLmlzQ2FuY2VsbGVkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50TG9nUmVjZWl2ZXIgPT0gbnVsbCB8fCBtQ3VycmVudExvZ1JlY2VpdmVyLmlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ2NhdCB3YXMgc3RvcHBlZC9jYW5jZWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgYmVjYW1lIHJlYWR5LgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nZ2VkRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIgPSBuZXcgRXZlbnRMb2dQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEV2ZW50TG9nUGFyc2VyLmluaXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBldmVudCBkaXNwbGF5IHdpdGggdGhlIG5ldyBwYXJzZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudERpc3BsYXlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgdGhlIHRlbXAgZmlsZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmF3IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFuZHJvaWQtZXZlbnQtIiwgIi5sb2ciKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnJ1bkV2ZW50TG9nU2VydmljZShtQ3VycmVudExvZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJFdmVudExvZyIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RXZlbnRMb2dGcm9tRmlsZXMoZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBsb2djYXQgYWxyZWFkeSBydW5uaW5nCi0gICAgICAgIGlmIChtQ3VycmVudExvZ1JlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0b3BFdmVudExvZyhmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRMb2dnZWREZXZpY2UgPSBudWxsOwotICAgICAgICBtQ3VycmVudExvZ0ZpbGUgPSBudWxsOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvdXRwdXQgcmVjZWl2ZXIKLSAgICAgICAgbUN1cnJlbnRMb2dSZWNlaXZlciA9IG5ldyBMb2dSZWNlaXZlcih0aGlzKTsKLQotICAgICAgICBtU2F2ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyBzdGFydCB0aGUgbG9nY2F0IGluIGEgZGlmZmVyZW50IHRocmVhZAotICAgICAgICBuZXcgVGhyZWFkKCJFdmVudExvZyIpICB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nRmlsZSA9IGZpbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEV2ZW50TG9nUGFyc2VyID0gbmV3IEV2ZW50TG9nUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRFdmVudExvZ1BhcnNlci5pbml0KGZpbGVOYW1lICsgVEFHX0ZJTEVfRVhUKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLkVSUk9SLCAiRXZlbnRMb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbHVyZSB0byByZWFkICUxJHMiLCBmaWxlTmFtZSArIFRBR19GSUxFX0VYVCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZXZlbnQgZGlzcGxheSB3aXRoIHRoZSBuZXcgcGFyc2VyLgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudERpc3BsYXlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcnVuTG9jYWxFdmVudExvZ1NlcnZpY2UoZmlsZU5hbWUsIG1DdXJyZW50TG9nUmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJFdmVudExvZyIsIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RXZlbnRMb2dGcm9tQ29udGVudChmaW5hbCBTdHJpbmdbXSB0YWdzLCBmaW5hbCBTdHJpbmdbXSBsb2cpIHsKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGxvZ2NhdCBhbHJlYWR5IHJ1bm5pbmcKLSAgICAgICAgaWYgKG1DdXJyZW50TG9nUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RvcEV2ZW50TG9nKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudExvZ2dlZERldmljZSA9IG51bGw7Ci0gICAgICAgIG1DdXJyZW50TG9nRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG91dHB1dCByZWNlaXZlcgotICAgICAgICBtQ3VycmVudExvZ1JlY2VpdmVyID0gbmV3IExvZ1JlY2VpdmVyKHRoaXMpOwotCi0gICAgICAgIG1TYXZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIHN0YXJ0IHRoZSBsb2djYXQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkCi0gICAgICAgIG5ldyBUaHJlYWQoIkV2ZW50TG9nIikgIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRFdmVudExvZ1BhcnNlciA9IG5ldyBFdmVudExvZ1BhcnNlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50RXZlbnRMb2dQYXJzZXIuaW5pdCh0YWdzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZXZlbnQgZGlzcGxheSB3aXRoIHRoZSBuZXcgcGFyc2VyLgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudERpc3BsYXlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcnVuTG9jYWxFdmVudExvZ1NlcnZpY2UobG9nLCBtQ3VycmVudExvZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRXZlbnRMb2ciLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc3RvcEV2ZW50TG9nKGJvb2xlYW4gaW5VaVRocmVhZCkgewotICAgICAgICBpZiAobUN1cnJlbnRMb2dSZWNlaXZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudExvZ1JlY2VpdmVyLmNhbmNlbCgpOwotCi0gICAgICAgICAgICAvLyB3aGVuIHRoZSB0aHJlYWQgZmluaXNoZXMsIG5vIG9uZSB3aWxsIHJlZmVyZW5jZSB0aGF0IG9iamVjdAotICAgICAgICAgICAgLy8gYW5kIGl0J2xsIGJlIGRlc3Ryb3llZAotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nUmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRMb2dnZWREZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIG1FdmVudHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtTmV3RXZlbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdEaXNwbGF5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc2V0VUkoaW5VaVRocmVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRlbXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZW1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIG1UZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRVSShib29sZWFuIGluVWlUaHJlYWQpIHsKLSAgICAgICAgbUV2ZW50cy5jbGVhcigpOwotCi0gICAgICAgIC8vIHRoZSB1aSBpcyBzdGF0aWMgd2UganVzdCBlbXB0eSBpdC4KLSAgICAgICAgaWYgKGluVWlUaHJlYWQpIHsKLSAgICAgICAgICAgIHJlc2V0VWlGcm9tVWlUaHJlYWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBkID0gbUJvdHRvbVBhcmVudFBhbmVsLmdldERpc3BsYXkoKTsKLQotICAgICAgICAgICAgICAgIC8vIHJ1biBzeW5jIGFzIHdlIG5lZWQgdG8gdXBkYXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgICAgICBkLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb3R0b21QYXJlbnRQYW5lbC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFVpRnJvbVVpVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSBpcyBkaXNwb3NlZCwgd2UncmUgcXVpdHRpbmcuIERvIG5vdGhpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRVaUZyb21VaVRocmVhZCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5yZXNldFVJKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbU9wdGlvbnNBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1DbGVhckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVNhdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVEaXNwbGF5VWkoKSB7Ci0gICAgICAgIG1Cb3R0b21QYW5lbCA9IG5ldyBDb21wb3NpdGUobUJvdHRvbVBhcmVudFBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5zZXRDb250ZW50KG1Cb3R0b21QYW5lbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURpc3BsYXlVaSgpIHsKLSAgICAgICAgUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLSAgICAgICAgcm93TGF5b3V0LndyYXAgPSB0cnVlOwotICAgICAgICByb3dMYXlvdXQucGFjayA9IGZhbHNlOwotICAgICAgICByb3dMYXlvdXQuanVzdGlmeSA9IHRydWU7Ci0gICAgICAgIHJvd0xheW91dC5maWxsID0gdHJ1ZTsKLSAgICAgICAgcm93TGF5b3V0LnR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKLSAgICAgICAgbUJvdHRvbVBhbmVsLnNldExheW91dChyb3dMYXlvdXQpOwotCi0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1VaVByZWZlcmVuY2VzLmdldFN0b3JlKCk7Ci0gICAgICAgIGludCBkaXNwbGF5V2lkdGggPSBzdG9yZS5nZXRJbnQoUFJFRlNfRElTUExBWV9XSURUSCk7Ci0gICAgICAgIGludCBkaXNwbGF5SGVpZ2h0ID0gc3RvcmUuZ2V0SW50KFBSRUZTX0RJU1BMQVlfSEVJR0hUKTsKLQotICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgQ29udHJvbCBjID0gZXZlbnREaXNwbGF5LmNyZWF0ZUNvbXBvc2l0ZShtQm90dG9tUGFuZWwsIG1DdXJyZW50RXZlbnRMb2dQYXJzZXIsIHRoaXMpOwotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJvd0RhdGEgcmQgPSBuZXcgUm93RGF0YSgpOwotICAgICAgICAgICAgICAgIHJkLmhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcmQud2lkdGggPSBkaXNwbGF5V2lkdGg7Ci0gICAgICAgICAgICAgICAgYy5zZXRMYXlvdXREYXRhKHJkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVGFibGUgdGFibGUgPSBldmVudERpc3BsYXkuZ2V0VGFibGUoKTsKLSAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkVGFibGVUb0ZvY3VzTGlzdGVuZXIodGFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUJvdHRvbVBhbmVsLmxheW91dCgpOwotICAgICAgICBtQm90dG9tUGFyZW50UGFuZWwuc2V0TWluU2l6ZShtQm90dG9tUGFuZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0gICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5sYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWJ1aWxkIHRoZSBkaXNwbGF5IHVpLgotICAgICAqLwotICAgIEBVaVRocmVhZAotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVWkoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgdWkuIEZpcnN0IHdlIGdldCByaWQgb2YgaXQuCi0gICAgICAgICAgICBtQm90dG9tUGFuZWwuZGlzcG9zZSgpOwotICAgICAgICAgICAgbUJvdHRvbVBhbmVsID0gbnVsbDsKLQotICAgICAgICAgICAgcHJlcGFyZURpc3BsYXlVaSgpOwotICAgICAgICAgICAgY3JlYXRlRGlzcGxheVVpKCk7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBmaWxsIGl0Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gc3RhcnRfZXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5ld0V2ZW50cykgewotICAgICAgICAgICAgICAgIG1OZXdFdmVudHMuYWRkQWxsKDAsIG1FdmVudHMpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nRGlzcGxheSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0Rpc3BsYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzdGFydF9ldmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnRfZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVVJRXZlbnRIYW5kbGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gbUJvdHRvbVBhcmVudFBhbmVsLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgIG1Cb3R0b21QYXJlbnRQYW5lbC5zZXRNaW5TaXplKG1Cb3R0b21QYW5lbC5jb21wdXRlU2l6ZShyLndpZHRoLAotICAgICAgICAgICAgICAgIFNXVC5ERUZBVUxUKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG5ldyB7QGxpbmsgTG9nRW50cnl9IGJ5IHBhcnNpbmcgaXQgd2l0aCB7QGxpbmsgRXZlbnRMb2dQYXJzZXJ9IGFuZCBkaXNwbGF5aW5nIGl0LgotICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgbmV3IGxvZyBlbnRyeQotICAgICAqIEBzZWUgTG9nUmVjZWl2ZXIuSUxvZ0xpc3RlbmVyI25ld0VudHJ5KExvZ0VudHJ5KQotICAgICAqLwotICAgIEBXb3JrZXJUaHJlYWQKLSAgICBwdWJsaWMgdm9pZCBuZXdFbnRyeShMb2dFbnRyeSBlbnRyeSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRFdmVudExvZ1BhcnNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRXZlbnRDb250YWluZXIgZXZlbnQgPSBtQ3VycmVudEV2ZW50TG9nUGFyc2VyLnBhcnNlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXdFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFdvcmtlclRocmVhZAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXdFdmVudChFdmVudENvbnRhaW5lciBldmVudCkgewotICAgICAgICAvLyBhZGQgdGhlIGV2ZW50IHRvIHRoZSBnZW5lcmljIGxpc3QKLSAgICAgICAgbUV2ZW50cy5hZGQoZXZlbnQpOwotCi0gICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdCBvZiBldmVudHMgdGhhdCBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGFuZCB0cmlnZ2VyIGEKLSAgICAgICAgLy8gbmV3IGRpc3BsYXkgaWYgbmVlZGVkLgotICAgICAgICBib29sZWFuIHN0YXJ0X2V2ZW50ID0gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobU5ld0V2ZW50cykgewotICAgICAgICAgICAgbU5ld0V2ZW50cy5hZGQoZXZlbnQpOwotCi0gICAgICAgICAgICBpZiAobVBlbmRpbmdEaXNwbGF5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdEaXNwbGF5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzdGFydF9ldmVudCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnRfZXZlbnQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVkdWxlVUlFdmVudEhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2hlZHVsZXMgdGhlIFVJIHRocmVhZCB0byBleGVjdXRlIGEge0BsaW5rIFJ1bm5hYmxlfSBjYWxsaW5nIHtAbGluayAjZGlzcGxheU5ld0V2ZW50cygpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVVSUV2ZW50SGFuZGxlcigpIHsKLSAgICAgICAgdHJ5ICB7Ci0gICAgICAgICAgICBEaXNwbGF5IGQgPSBtQm90dG9tUGFyZW50UGFuZWwuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgZC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb3R0b21QYXJlbnRQYW5lbC5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEV2ZW50TG9nUGFyc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmV3RXZlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSB1aSBpcyBkaXNwb3NlZCwgZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHJhdyBkYXRhIGNvbWluZyBmcm9tIHRoZSBsb2cgc2VydmljZS4KLSAgICAgKiBAc2VlIExvZ1JlY2VpdmVyLklMb2dMaXN0ZW5lciNuZXdEYXRhKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbmV3RGF0YShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBpZiAobVRlbXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtVGVtcEZpbGUsIHRydWUgLyogYXBwZW5kICovKTsKLSAgICAgICAgICAgICAgICBmb3Mud3JpdGUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBVaVRocmVhZAotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5TmV3RXZlbnRzKCkgewotICAgICAgICAvLyBuZXZlciBkaXNwbGF5IG1vcmUgdGhhbiAxLDAwMCBldmVudHMgaW4gdGhpcyBsb29wLiBXZSBjYW4ndCBkbyB0b28gbXVjaCBpbiB0aGUgVUkgdGhyZWFkLgotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIC8vIHByZXBhcmUgdGhlIGRpc3BsYXlzCi0gICAgICAgIGZvciAoRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA6IG1FdmVudERpc3BsYXlzKSB7Ci0gICAgICAgICAgICBldmVudERpc3BsYXkuc3RhcnRNdWx0aUV2ZW50RGlzcGxheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGlzcGxheSB0aGUgbmV3IGV2ZW50cwotICAgICAgICBFdmVudENvbnRhaW5lciBldmVudCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gbmVlZF90b19yZWxvb3AgPSBmYWxzZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IGV2ZW50IHRvIGRpc3BsYXkuCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1OZXdFdmVudHMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5ld0V2ZW50cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDIwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIHN0aWxsIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGhvZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVJIHRocmVhZCBmb3IgdG9vIGxvbmcsIHNvIHdlIHN0b3AgdGhpcyBydW5uYWJsZSwgYnV0IGxhdW5jaCBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIHRvIGtlZXAgZ29pbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3RvX3JlbG9vcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG1OZXdFdmVudHMucmVtb3ZlKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdEaXNwbGF5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgZXZlbnQgZGlzcGxheQotICAgICAgICAgICAgICAgIGZvciAoRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA6IG1FdmVudERpc3BsYXlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5uZXdFdmVudChldmVudCwgbUN1cnJlbnRFdmVudExvZ1BhcnNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChldmVudCAhPSBudWxsKTsKLQotICAgICAgICAvLyB3ZSdyZSBkb25lIGRpc3BsYXlpbmcgZXZlbnRzLgotICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgZXZlbnREaXNwbGF5LmVuZE11bHRpRXZlbnREaXNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBuZWVkZWQsIGFzayB0aGUgVUkgdGhyZWFkIHRvIHJlLXJ1biB0aGlzIG1ldGhvZC4KLSAgICAgICAgaWYgKG5lZWRfdG9fcmVsb29wKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVVJRXZlbnRIYW5kbGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUge0BsaW5rIEV2ZW50RGlzcGxheX1zIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRFdmVudERpc3BsYXlzKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotICAgICAgICBTdHJpbmcgc3RvcmFnZSA9IHN0b3JlLmdldFN0cmluZyhQUkVGU19FVkVOVF9ESVNQTEFZKTsKLQotICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHN0b3JhZ2Uuc3BsaXQoUGF0dGVybi5xdW90ZShFVkVOVF9ESVNQTEFZX1NUT1JBR0VfU0VQQVJBVE9SKSk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgRXZlbnREaXNwbGF5IGV2ZW50RGlzcGxheSA9IEV2ZW50RGlzcGxheS5sb2FkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnREaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUV2ZW50RGlzcGxheXMuYWRkKGV2ZW50RGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHtAbGluayBFdmVudERpc3BsYXl9cyBpbnRvIHRoZSB7QGxpbmsgRGRtVWlQcmVmZXJlbmNlc30gc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVFdmVudERpc3BsYXlzKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotCi0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgU3RyaW5nIHN0b3JhZ2UgPSBldmVudERpc3BsYXkuZ2V0U3RvcmFnZVN0cmluZygpOwotICAgICAgICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRVZFTlRfRElTUExBWV9TVE9SQUdFX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RvcmFnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdG9yZS5zZXRWYWx1ZShQUkVGU19FVkVOVF9ESVNQTEFZLCBzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB7QGxpbmsgRXZlbnREaXNwbGF5fSB3aXRoIHRoZSBuZXcge0BsaW5rIEV2ZW50TG9nUGFyc2VyfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyB3aWxsIHJ1biBhc3luY2hyb25vdXNseSBpbiB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIEBXb3JrZXJUaHJlYWQKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRXZlbnREaXNwbGF5cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkgZCA9IG1Cb3R0b21QYXJlbnRQYW5lbC5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGQuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQm90dG9tUGFyZW50UGFuZWwuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGlzcGxheS5zZXROZXdMb2dQYXJzZXIobUN1cnJlbnRFdmVudExvZ1BhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1PcHRpb25zQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xlYXJBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudExvZ0ZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYXZlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYXZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkaXNwbGF5IGlzIGRpc3Bvc2VkOiBkbyBub3RoaW5nLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFVpVGhyZWFkCi0gICAgcHVibGljIHZvaWQgY29sdW1uUmVzaXplZChpbnQgaW5kZXgsIFRhYmxlQ29sdW1uIHNvdXJjZUNvbHVtbikgewotICAgICAgICBmb3IgKEV2ZW50RGlzcGxheSBldmVudERpc3BsYXkgOiBtRXZlbnREaXNwbGF5cykgewotICAgICAgICAgICAgZXZlbnREaXNwbGF5LnJlc2l6ZUNvbHVtbihpbmRleCwgc291cmNlQ29sdW1uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gZXZlbnQgbG9nIHNlcnZpY2Ugb3V0IG9mIGEgbG9jYWwgZmlsZS4KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZ1bGwgZmlsZSBuYW1lIG9mIHRoZSBsb2NhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIGV2ZW50IGxvZy4KLSAgICAgKiBAcGFyYW0gbG9nUmVjZWl2ZXIgdGhlIHJlY2VpdmVyIHRoYXQgd2lsbCBoYW5kbGUgdGhlIGxvZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAV29ya2VyVGhyZWFkCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkxvY2FsRXZlbnRMb2dTZXJ2aWNlKFN0cmluZyBmaWxlTmFtZSwgTG9nUmVjZWl2ZXIgbG9nUmVjZWl2ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjU2XTsKLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0KLSAgICAgICAgaW50IGNvdW50OwotICAgICAgICB3aGlsZSAoKGNvdW50ID0gZmlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGxvZ1JlY2VpdmVyLnBhcnNlTmV3RGF0YShidWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBXb3JrZXJUaHJlYWQKLSAgICBwcml2YXRlIHZvaWQgcnVuTG9jYWxFdmVudExvZ1NlcnZpY2UoU3RyaW5nW10gbG9nLCBMb2dSZWNlaXZlciBjdXJyZW50TG9nUmVjZWl2ZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxvZykgewotICAgICAgICAgICAgICAgIEV2ZW50Q29udGFpbmVyIGV2ZW50ID0gbUN1cnJlbnRFdmVudExvZ1BhcnNlci5wYXJzZShsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXdFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvRXZlbnRWYWx1ZVNlbGVjdG9yLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9FdmVudFZhbHVlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMmUyYy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9FdmVudFZhbHVlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRWYWx1ZURlc2NyaXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRDb250YWluZXIuQ29tcGFyZU1ldGhvZDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyLkV2ZW50VmFsdWVUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudC5FdmVudERpc3BsYXkuT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZy5ldmVudC5FdmVudERpc3BsYXkuVmFsdWVEaXNwbGF5RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWZpbmFsIGNsYXNzIEV2ZW50VmFsdWVTZWxlY3RvciBleHRlbmRzIERpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMR19XSURUSCA9IDQwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRExHX0hFSUdIVCA9IDMwMDsKLQotICAgIHByaXZhdGUgU2hlbGwgbVBhcmVudDsKLSAgICBwcml2YXRlIFNoZWxsIG1TaGVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVkaXRTdGF0dXM7Ci0gICAgcHJpdmF0ZSBDb21ibyBtRXZlbnRDb21ibzsKLSAgICBwcml2YXRlIENvbWJvIG1WYWx1ZUNvbWJvOwotICAgIHByaXZhdGUgQ29tYm8gbVNlcmllc0NvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNwbGF5UGlkQ2hlY2tCb3g7Ci0gICAgcHJpdmF0ZSBDb21ibyBtRmlsdGVyQ29tYm87Ci0gICAgcHJpdmF0ZSBDb21ibyBtRmlsdGVyTWV0aG9kQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IG1GaWx0ZXJWYWx1ZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtT2tCdXR0b247Ci0KLSAgICBwcml2YXRlIEV2ZW50TG9nUGFyc2VyIG1Mb2dQYXJzZXI7Ci0gICAgcHJpdmF0ZSBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgCi0gICAgLyoqIGxpc3Qgb2YgZXZlbnQgaW50ZWdlciBpbiB0aGUgb3JkZXIgb2YgdGhlIGNvbWJvLiAqLwotICAgIHByaXZhdGUgSW50ZWdlcltdIG1FdmVudFRhZ3M7Ci0gICAgCi0gICAgLyoqIGxpc3Qgb2YgaW5kaWNlcyBpbiB0aGUge0BsaW5rIEV2ZW50VmFsdWVEZXNjcmlwdGlvbn0gYXJyYXkgb2YgdGhlIGN1cnJlbnQgZXZlbnQKLSAgICAgKiB0aGF0IGFyZSBvZiB0eXBlIHN0cmluZy4gVGhpcyBsZXRzIHVzIGdldCBiYWNrIHRoZSB7QGxpbmsgRXZlbnRWYWx1ZURlc2NyaXB0aW9ufSBmcm9tIHRoZQotICAgICAqIGluZGV4IGluIHRoZSBTZXJpZXMge0BsaW5rIENvbWJvfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtU2VyaWVzSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAKLSAgICBwdWJsaWMgRXZlbnRWYWx1ZVNlbGVjdG9yKFNoZWxsIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5CT1JERVIgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBkaXNwbGF5IG9wdGlvbiBkaWFsb2cgdG8gZWRpdCBhIG5ldyBkZXNjcmlwdG9yLgotICAgICAqIEBwYXJhbSBkZWNyaXB0b3JDbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byBpbnN0YW50aWF0ZS4gTXVzdCBleHRlbmQKLSAgICAgKiB7QGxpbmsgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yfQotICAgICAqIEBwYXJhbSBsb2dQYXJzZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0byBiZSBjcmVhdGVkLCBmYWxzZSBpZiB0aGUgY3JlYXRpb24gd2FzIGNhbmNlbGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gb3BlbihDbGFzczw/IGV4dGVuZHMgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yQ2xhc3MsCi0gICAgICAgICAgICBFdmVudExvZ1BhcnNlciBsb2dQYXJzZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9jY3VycmVuY2VEaXNwbGF5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgcmV0dXJuIG9wZW4oZGVzY3JpcHRvciwgbG9nUGFyc2VyKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgdGhlIGRpc3BsYXkgb3B0aW9uIGRpYWxvZywgdG8gZWRpdCBhIHtAbGluayBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3J9IG9iamVjdCBvcgotICAgICAqIGEge0BsaW5rIFZhbHVlRGlzcGxheURlc2NyaXB0b3J9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciB0byBlZGl0LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBib29sZWFuIG9wZW4oT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEV2ZW50TG9nUGFyc2VyIGxvZ1BhcnNlcikgewotICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgZGVzY3JpcHRvciBhcyB3ZSdsbCB1c2UgYSB3b3JraW5nIGNvcHkuCi0gICAgICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBuZXcgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcigoVmFsdWVEaXNwbGF5RGVzY3JpcHRvcilkZXNjcmlwdG9yKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IG5ldyBPY2N1cnJlbmNlRGlzcGxheURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtTG9nUGFyc2VyID0gbG9nUGFyc2VyOwotCi0gICAgICAgIGNyZWF0ZVVJKCk7Ci0KLSAgICAgICAgaWYgKG1QYXJlbnQgPT0gbnVsbCB8fCBtU2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZFZhbHVlRGVzY3JpcHRvcigpOwotICAgICAgICAKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotCi0gICAgICAgIC8vIFNldCB0aGUgZGlhbG9nIHNpemUuCi0gICAgICAgIHRyeSB7IAotICAgICAgICAgICAgbVNoZWxsLnNldE1pbmltdW1TaXplKERMR19XSURUSCwgRExHX0hFSUdIVCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgciA9IG1QYXJlbnQuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNlbnRlciBuZXcgdG9wIGxlZnQuCi0gICAgICAgICAgICBpbnQgY3ggPSByLnggKyByLndpZHRoLzI7Ci0gICAgICAgICAgICBpbnQgeCA9IGN4IC0gRExHX1dJRFRIIC8gMjsKLSAgICAgICAgICAgIGludCBjeSA9IHIueSArIHIuaGVpZ2h0LzI7Ci0gICAgICAgICAgICBpbnQgeSA9IGN5IC0gRExHX0hFSUdIVCAvIDI7Ci0gICAgICAgICAgICBtU2hlbGwuc2V0Qm91bmRzKHgsIHksIERMR19XSURUSCwgRExHX0hFSUdIVCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNoZWxsLmxheW91dCgpOwotCi0gICAgICAgIC8vIGFjdHVhbGx5IG9wZW4gdGhlIGRpYWxvZwotICAgICAgICBtU2hlbGwub3BlbigpOwotCi0gICAgICAgIC8vIGV2ZW50IGxvb3AgdW50aWwgdGhlIGRpYWxvZyBpcyBjbG9zZWQuCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1QYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoIW1TaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtRWRpdFN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgT2NjdXJyZW5jZURpc3BsYXlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVJKCkgewotICAgICAgICBHcmlkRGF0YSBnZDsKLQotICAgICAgICBtUGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIG1TaGVsbCA9IG5ldyBTaGVsbChtUGFyZW50LCBnZXRTdHlsZSgpKTsKLSAgICAgICAgbVNoZWxsLnNldFRleHQoIkV2ZW50IERpc3BsYXkgQ29uZmlndXJhdGlvbiIpOwotCi0gICAgICAgIG1TaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiRXZlbnQ6Iik7Ci0gICAgICAgIAotICAgICAgICBtRXZlbnRDb21ibyA9IG5ldyBDb21ibyhtU2hlbGwsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbUV2ZW50Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgLy8gdGhlIGV2ZW50IHRhZyAvIGV2ZW50IG5hbWUgbWFwCi0gICAgICAgIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGV2ZW50VGFnTWFwID0gbUxvZ1BhcnNlci5nZXRUYWdNYXAoKTsKLSAgICAgICAgTWFwPEludGVnZXIsIEV2ZW50VmFsdWVEZXNjcmlwdGlvbltdPiBldmVudEluZm9NYXAgPSBtTG9nUGFyc2VyLmdldEV2ZW50SW5mb01hcCgpOwotICAgICAgICBTZXQ8SW50ZWdlcj4ga2V5cyA9IGV2ZW50VGFnTWFwLmtleVNldCgpOwotICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBrZXlzKSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnRJbmZvTWFwLmdldChpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IGV2ZW50VGFnTWFwLmdldChpKTsKLSAgICAgICAgICAgICAgICBtRXZlbnRDb21iby5hZGQoZXZlbnROYW1lKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtRXZlbnRUYWdzID0gbGlzdC50b0FycmF5KG5ldyBJbnRlZ2VyW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIAotICAgICAgICBtRXZlbnRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50Q29tYm9TZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIlZhbHVlOiIpOwotICAgICAgICAKLSAgICAgICAgbVZhbHVlQ29tYm8gPSBuZXcgQ29tYm8obVNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIG1WYWx1ZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtVmFsdWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVZhbHVlQ29tYm9TZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIlNlcmllcyBOYW1lOiIpOwotCi0gICAgICAgIG1TZXJpZXNDb21ibyA9IG5ldyBDb21ibyhtU2hlbGwsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbVNlcmllc0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtU2VyaWVzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZXJpZXNDb21ib1NlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHNldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGVtcHR5IGNvbXAKLSAgICAgICAgbmV3IENvbXBvc2l0ZShtU2hlbGwsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gZ2Qud2lkdGhIaW50ID0gMDsKLQotICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94ID0gbmV3IEJ1dHRvbihtU2hlbGwsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG1EaXNwbGF5UGlkQ2hlY2tCb3guc2V0VGV4dCgiQWxzbyBTaG93IHBpZCIpOwotICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IuaW5jbHVkZVBpZCA9IG1EaXNwbGF5UGlkQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChtU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJGaWx0ZXIgQnk6Iik7Ci0KLSAgICAgICAgbUZpbHRlckNvbWJvID0gbmV3IENvbWJvKG1TaGVsbCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtRmlsdGVyQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1GaWx0ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUZpbHRlckNvbWJvU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc2V0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChtU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJGaWx0ZXIgTWV0aG9kOiIpOwotCi0gICAgICAgIG1GaWx0ZXJNZXRob2RDb21ibyA9IG5ldyBDb21ibyhtU2hlbGwsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBmb3IgKENvbXBhcmVNZXRob2QgbWV0aG9kIDogQ29tcGFyZU1ldGhvZC52YWx1ZXMoKSkgewotICAgICAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLmFkZChtZXRob2QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRmlsdGVyTWV0aG9kQ29tYm9TZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIkZpbHRlciBWYWx1ZToiKTsKLSAgICAgICAgCi0gICAgICAgIG1GaWx0ZXJWYWx1ZSA9IG5ldyBUZXh0KG1TaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgICAgICBtRmlsdGVyVmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1GaWx0ZXJWYWx1ZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobURlc2NyaXB0b3IuZmlsdGVyVmFsdWVJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBldmVudCBjb21ibwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtRXZlbnRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIGl0IHRvIGFuIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnRUYWcgPSBtRXZlbnRUYWdzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmV2ZW50VGFnID0gZXZlbnRUYWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgRXZlbnRWYWx1ZURlc2NyaXB0aW9uIGZvciB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRWYWx1ZURlc2NyaXB0aW9uIHZhbHVlRGVzYyA9IG1Mb2dQYXJzZXIuZ2V0RXZlbnRJbmZvTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGV2ZW50VGFnKVttRGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBFdmVudFZhbHVlRGVzY3JpcHRpb24gY29udmVydCB0aGUgU3RyaW5nIHZhbHVlIGludG8gYW4gb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcHJvcGVyIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci5maWx0ZXJWYWx1ZSA9IHZhbHVlRGVzYy5nZXRPYmplY3RGcm9tU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsdGVyVmFsdWUuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCBhIHNlcGFyYXRvciBzcGFubmluZyB0aGUgMiBjb2x1bW5zCi0gICAgICAgIAotICAgICAgICBsID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIGEgY29tcG9zaXRlIHRvIGhvbGQgdGhlIG9rL2NhbmNlbCBidXR0b24sIG5vIG1hdHRlciB3aGF0IHRoZSBjb2x1bW5zIHNpemUgYXJlLgotICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgR3JpZExheW91dCBnbDsKLSAgICAgICAgYnV0dG9uQ29tcC5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCg2LCB0cnVlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLQotICAgICAgICBDb21wb3NpdGUgcGFkZGluZyA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHBhZGRpbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbU9rQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1Pa0J1dHRvbi5zZXRUZXh0KCJPSyIpOwotICAgICAgICBtT2tCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQ0VOVEVSKSk7Ci0gICAgICAgIG1Pa0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1TaGVsbC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWRkaW5nID0gbmV3IENvbXBvc2l0ZShtU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgcGFkZGluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBwYWRkaW5nID0gbmV3IENvbXBvc2l0ZShtU2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgcGFkZGluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXAsIFNXVC5QVVNIKTsKLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldFRleHQoIkNhbmNlbCIpOwotICAgICAgICBjYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQ0VOVEVSKSk7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgZWRpdAotICAgICAgICAgICAgICAgIG1FZGl0U3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhZGRpbmcgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBwYWRkaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAKLSAgICAgICAgbVNoZWxsLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1vZGlmaWVkKCkgewotICAgICAgICBtRWRpdFN0YXR1cyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV2ZW50Q29tYm9TZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGV2ZW50IGNvbWJvCi0gICAgICAgIGludCBpbmRleCA9IG1FdmVudENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAvLyBtYXRjaCBpdCB0byBhbiBldmVudAotICAgICAgICAgICAgaW50IGV2ZW50VGFnID0gbUV2ZW50VGFnc1tpbmRleF07Ci0gICAgICAgICAgICBtRGVzY3JpcHRvci5ldmVudFRhZyA9IGV2ZW50VGFnOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIEV2ZW50VmFsdWVEZXNjcmlwdGlvbiBmb3IgdGhpcyB0YWcKLSAgICAgICAgICAgIEV2ZW50VmFsdWVEZXNjcmlwdGlvbltdIHZhbHVlcyA9IG1Mb2dQYXJzZXIuZ2V0RXZlbnRJbmZvTWFwKCkuZ2V0KGV2ZW50VGFnKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZmlsbCB0aGUgY29tYm8gZm9yIHRoZSB2YWx1ZXMKLSAgICAgICAgICAgIG1WYWx1ZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yIGluc3RhbmNlb2YgVmFsdWVEaXNwbGF5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZURpc3BsYXlEZXNjcmlwdG9yIHZhbHVlRGVzY3JpcHRvciA9IChWYWx1ZURpc3BsYXlEZXNjcmlwdG9yKW1EZXNjcmlwdG9yOwotICAgIAotICAgICAgICAgICAgICAgICAgICBtVmFsdWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEV2ZW50VmFsdWVEZXNjcmlwdGlvbiB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlQ29tYm8uYWRkKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVEZXNjcmlwdG9yLnZhbHVlSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZUNvbWJvLnNlbGVjdCh2YWx1ZURlc2NyaXB0b3IudmFsdWVJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVDb21iby5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVZhbHVlQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgYXhpcyBjb21ibwotICAgICAgICAgICAgICAgIG1TZXJpZXNDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBtU2VyaWVzQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVNlcmllc0luZGljZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgYXhpc0luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKEV2ZW50VmFsdWVEZXNjcmlwdGlvbiB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZ2V0RXZlbnRWYWx1ZVR5cGUoKSA9PSBFdmVudFZhbHVlVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJpZXNDb21iby5hZGQodmFsdWUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJpZXNDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcmllc0luZGljZXMuYWRkKGF4aXNJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvci5zZXJpZXNWYWx1ZUluZGV4ICE9IC0xICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXggPT0gYXhpc0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSBheGlzSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0luZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TZXJpZXNDb21iby5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtU2VyaWVzQ29tYm8uYWRkKCJkZWZhdWx0IChwaWQpIiwgMCAvKiBpbmRleCAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXJpZXNJbmRpY2VzLmFkZCgwIC8qIGluZGV4ICovLCAtMSAvKiB2YWx1ZSAqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gKzEgYmVjYXVzZSB3ZSBhZGRlZCBhbm90aGVyIGl0ZW0gYXQgaW5kZXggMAotICAgICAgICAgICAgICAgICAgICBtU2VyaWVzQ29tYm8uc2VsZWN0KHNlbGVjdGlvbkluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlQaWRDaGVja0JveC5zZXRTZWxlY3Rpb24obURlc2NyaXB0b3IuaW5jbHVkZVBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlQaWRDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlQaWRDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBmaWx0ZXIgY29tYm8KLSAgICAgICAgICAgICAgICBtRmlsdGVyQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtRmlsdGVyQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgbUZpbHRlckNvbWJvLmFkZCgiKG5vIGZpbHRlcikiKTsKLSAgICAgICAgICAgICAgICBmb3IgKEV2ZW50VmFsdWVEZXNjcmlwdGlvbiB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBtRmlsdGVyQ29tYm8uYWRkKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIGN1cnJlbnQgZmlsdGVyCi0gICAgICAgICAgICAgICAgbUZpbHRlckNvbWJvLnNlbGVjdChtRGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLnNlbGVjdChnZXRGaWx0ZXJNZXRob2RJbmRleChtRGVzY3JpcHRvci5maWx0ZXJDb21wYXJlTWV0aG9kKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBjdXJyZW50IGZpbHRlciB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIEV2ZW50VmFsdWVEZXNjcmlwdGlvbiB2YWx1ZUluZm8gPSB2YWx1ZXNbbURlc2NyaXB0b3IuZmlsdGVyVmFsdWVJbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUluZm8uY2hlY2tGb3JUeXBlKG1EZXNjcmlwdG9yLmZpbHRlclZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZpbHRlclZhbHVlLnNldFRleHQobURlc2NyaXB0b3IuZmlsdGVyVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmlsdGVyVmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRmlsdGVyVmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNhYmxlU3ViQ29tYm9zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNhYmxlU3ViQ29tYm9zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVN1YkNvbWJvcygpIHsKLSAgICAgICAgbVZhbHVlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1WYWx1ZUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIG1WYWx1ZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIG1TZXJpZXNDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgbVNlcmllc0NvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIG1TZXJpZXNDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG1EaXNwbGF5UGlkQ2hlY2tCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1EaXNwbGF5UGlkQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG1GaWx0ZXJDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgbUZpbHRlckNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIG1GaWx0ZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG1GaWx0ZXJWYWx1ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUZpbHRlclZhbHVlLnNldFRleHQoIiIpOwotICAgICAgICBtRmlsdGVyTWV0aG9kQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbHVlQ29tYm9TZWxlY3Rpb24oKSB7Ci0gICAgICAgIFZhbHVlRGlzcGxheURlc2NyaXB0b3IgdmFsdWVEZXNjcmlwdG9yID0gKFZhbHVlRGlzcGxheURlc2NyaXB0b3IpbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgdmFsdWUgY29tYm8KLSAgICAgICAgaW50IGluZGV4ID0gbVZhbHVlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgdmFsdWVEZXNjcmlwdG9yLnZhbHVlSW5kZXggPSBpbmRleDsKLSAgICAgICAgCi0gICAgICAgIC8vIGZvciBub3cgc2V0IHRoZSBidWlsdC1pbiBuYW1lCi0KLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgZXZlbnQgY29tYm8KLSAgICAgICAgaW50IGV2ZW50SW5kZXggPSBtRXZlbnRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAKLSAgICAgICAgLy8gbWF0Y2ggaXQgdG8gYW4gZXZlbnQKLSAgICAgICAgaW50IGV2ZW50VGFnID0gbUV2ZW50VGFnc1tldmVudEluZGV4XTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCB0aGUgRXZlbnRWYWx1ZURlc2NyaXB0aW9uIGZvciB0aGlzIHRhZwotICAgICAgICBFdmVudFZhbHVlRGVzY3JpcHRpb25bXSB2YWx1ZXMgPSBtTG9nUGFyc2VyLmdldEV2ZW50SW5mb01hcCgpLmdldChldmVudFRhZyk7Ci0KLSAgICAgICAgdmFsdWVEZXNjcmlwdG9yLnZhbHVlTmFtZSA9IHZhbHVlc1tpbmRleF0uZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXJpZXNDb21ib1NlbGVjdGlvbigpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgYXhpcyBjb21ibwotICAgICAgICBpbnQgaW5kZXggPSBtU2VyaWVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCB0aGUgYWN0dWFsIHZhbHVlIGluZGV4IGZyb20gdGhlIGxpc3QuCi0gICAgICAgIGludCB2YWx1ZUluZGV4ID0gbVNlcmllc0luZGljZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgCi0gICAgICAgIG1EZXNjcmlwdG9yLnNlcmllc1ZhbHVlSW5kZXggPSB2YWx1ZUluZGV4OwotICAgICAgICAKLSAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlQaWRDaGVja0JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbURpc3BsYXlQaWRDaGVja0JveC5zZXRTZWxlY3Rpb24obURlc2NyaXB0b3IuaW5jbHVkZVBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBtRGlzcGxheVBpZENoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbHRlckNvbWJvU2VsZWN0aW9uKCkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBheGlzIGNvbWJvCi0gICAgICAgIGludCBpbmRleCA9IG1GaWx0ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAKLSAgICAgICAgLy8gZGVjcmVtZW50IGluZGV4IGJ5IDEgc2luY2UgdGhlIGl0ZW0gMCBtZWFucwotICAgICAgICAvLyBubyBmaWx0ZXIgKGluZGV4ID0gLTEpLCBhbmQgdGhlIHJlc3QgaXMgb2Zmc2V0IGJ5IDEKLSAgICAgICAgaW5kZXgtLTsKLQotICAgICAgICBtRGVzY3JpcHRvci5maWx0ZXJWYWx1ZUluZGV4ID0gaW5kZXg7Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIG1GaWx0ZXJWYWx1ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbUZpbHRlck1ldGhvZENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IuZmlsdGVyVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBtRmlsdGVyVmFsdWUuc2V0VGV4dCgoU3RyaW5nKW1EZXNjcmlwdG9yLmZpbHRlclZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaWx0ZXJWYWx1ZS5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIG1GaWx0ZXJWYWx1ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1GaWx0ZXJNZXRob2RDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRmlsdGVyTWV0aG9kQ29tYm9TZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGF4aXMgY29tYm8KLSAgICAgICAgaW50IGluZGV4ID0gbUZpbHRlck1ldGhvZENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIENvbXBhcmVNZXRob2QgbWV0aG9kID0gQ29tcGFyZU1ldGhvZC52YWx1ZXMoKVtpbmRleF07Ci0gICAgICAgIAotICAgICAgICBtRGVzY3JpcHRvci5maWx0ZXJDb21wYXJlTWV0aG9kID0gbWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaWx0ZXIgbWV0aG9kCi0gICAgICogQHBhcmFtIGZpbHRlckNvbXBhcmVNZXRob2QgdGhlIHtAbGluayBDb21wYXJlTWV0aG9kfSBlbnVtLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldEZpbHRlck1ldGhvZEluZGV4KENvbXBhcmVNZXRob2QgZmlsdGVyQ29tcGFyZU1ldGhvZCkgewotICAgICAgICBDb21wYXJlTWV0aG9kW10gdmFsdWVzID0gQ29tcGFyZU1ldGhvZC52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PSBmaWx0ZXJDb21wYXJlTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRWYWx1ZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgaW5kZXggZnJvbSB0aGUgZXZlbnRUYWcuCi0gICAgICAgIGludCBldmVudEluZGV4ID0gMDsKLSAgICAgICAgaW50IGNvbWJvSW5kZXggPSAtMTsKLSAgICAgICAgZm9yIChpbnQgaSA6IG1FdmVudFRhZ3MpIHsKLSAgICAgICAgICAgIGlmIChpID09IG1EZXNjcmlwdG9yLmV2ZW50VGFnKSB7Ci0gICAgICAgICAgICAgICAgY29tYm9JbmRleCA9IGV2ZW50SW5kZXg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldmVudEluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb21ib0luZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBtRXZlbnRDb21iby5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUV2ZW50Q29tYm8uc2VsZWN0KGNvbWJvSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBldmVudCBmcm9tIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgIGhhbmRsZUV2ZW50Q29tYm9TZWxlY3Rpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKG1FdmVudENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEgJiYKLSAgICAgICAgICAgICAgICAoKChtRGVzY3JpcHRvciBpbnN0YW5jZW9mIFZhbHVlRGlzcGxheURlc2NyaXB0b3IpID09IGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L09jY3VycmVuY2VSZW5kZXJlci5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvT2NjdXJyZW5jZVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjE0NDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2cvZXZlbnQvT2NjdXJyZW5jZVJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2cuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuamZyZWUuY2hhcnQuYXhpcy5WYWx1ZUF4aXM7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnBsb3QuQ3Jvc3NoYWlyU3RhdGU7Ci1pbXBvcnQgb3JnLmpmcmVlLmNoYXJ0LnBsb3QuUGxvdE9yaWVudGF0aW9uOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5wbG90LlBsb3RSZW5kZXJpbmdJbmZvOwotaW1wb3J0IG9yZy5qZnJlZS5jaGFydC5wbG90LlhZUGxvdDsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucmVuZGVyZXIueHkuWFlJdGVtUmVuZGVyZXJTdGF0ZTsKLWltcG9ydCBvcmcuamZyZWUuY2hhcnQucmVuZGVyZXIueHkuWFlMaW5lQW5kU2hhcGVSZW5kZXJlcjsKLWltcG9ydCBvcmcuamZyZWUuZGF0YS50aW1lLlRpbWVTZXJpZXNDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5qZnJlZS5kYXRhLnh5LlhZRGF0YXNldDsKLWltcG9ydCBvcmcuamZyZWUudWkuUmVjdGFuZ2xlRWRnZTsKLQotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuUGFpbnQ7Ci1pbXBvcnQgamF2YS5hd3QuU3Ryb2tlOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uTGluZTJEOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7Ci0KLS8qKgotICogQ3VzdG9tIHJlbmRlcmVyIHRvIHJlbmRlciBldmVudCBvY2N1cnJlbmNlLiBUaGlzIHJlbmRlcmVkIGlnbm9yZXMgdGhlIHkgdmFsdWUsIGFuZCBzaW1wbHkKLSAqIGRyYXdzIGEgbGluZSBmcm9tIG1pbiB0byBtYXggYXQgdGhlIHRpbWUgb2YgdGhlIGl0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlUmVuZGVyZXIgZXh0ZW5kcyBYWUxpbmVBbmRTaGFwZVJlbmRlcmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhd0l0ZW0oR3JhcGhpY3MyRCBnMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgWFlJdGVtUmVuZGVyZXJTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUyRCBkYXRhQXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbG90UmVuZGVyaW5nSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhZUGxvdCBwbG90LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUF4aXMgZG9tYWluQXhpcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBeGlzIHJhbmdlQXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBYWURhdGFzZXQgZGF0YXNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcmllcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NoYWlyU3RhdGUgY3Jvc3NoYWlyU3RhdGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzKSB7Ci0gICAgICAgIFRpbWVTZXJpZXNDb2xsZWN0aW9uIHRpbWVEYXRhU2V0ID0gKFRpbWVTZXJpZXNDb2xsZWN0aW9uKWRhdGFzZXQ7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIHggdmFsdWUgZm9yIHRoZSBzZXJpZXMvaXRlbS4KLSAgICAgICAgZG91YmxlIHggPSB0aW1lRGF0YVNldC5nZXRYKHNlcmllcywgaXRlbSkuZG91YmxlVmFsdWUoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIG1pbi9tYXggb2YgdGhlIHJhbmdlIGF4aXMKLSAgICAgICAgZG91YmxlIHlNaW4gPSByYW5nZUF4aXMuZ2V0TG93ZXJCb3VuZCgpOwotICAgICAgICBkb3VibGUgeU1heCA9IHJhbmdlQXhpcy5nZXRVcHBlckJvdW5kKCk7Ci0KLSAgICAgICAgUmVjdGFuZ2xlRWRnZSBkb21haW5FZGdlID0gcGxvdC5nZXREb21haW5BeGlzRWRnZSgpOwotICAgICAgICBSZWN0YW5nbGVFZGdlIHJhbmdlRWRnZSA9IHBsb3QuZ2V0UmFuZ2VBeGlzRWRnZSgpOwotCi0gICAgICAgIC8vIGNvbnZlcnQgdGhlIGNvb3JkaW5hdGVzIHRvIGphdmEyZC4KLSAgICAgICAgZG91YmxlIHgyRCA9IGRvbWFpbkF4aXMudmFsdWVUb0phdmEyRCh4LCBkYXRhQXJlYSwgZG9tYWluRWRnZSk7Ci0gICAgICAgIGRvdWJsZSB5TWluMkQgPSByYW5nZUF4aXMudmFsdWVUb0phdmEyRCh5TWluLCBkYXRhQXJlYSwgcmFuZ2VFZGdlKTsKLSAgICAgICAgZG91YmxlIHlNYXgyRCA9IHJhbmdlQXhpcy52YWx1ZVRvSmF2YTJEKHlNYXgsIGRhdGFBcmVhLCByYW5nZUVkZ2UpOwotCi0gICAgICAgIC8vIGdldCB0aGUgcGFpbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJpZXMvaXRlbQotICAgICAgICBQYWludCBwID0gZ2V0SXRlbVBhaW50KHNlcmllcywgaXRlbSk7Ci0gICAgICAgIFN0cm9rZSBzID0gZ2V0SXRlbVN0cm9rZShzZXJpZXMsIGl0ZW0pOwotICAgICAgICAKLSAgICAgICAgTGluZTJEIGxpbmUgPSBudWxsOwotICAgICAgICBQbG90T3JpZW50YXRpb24gb3JpZW50YXRpb24gPSBwbG90LmdldE9yaWVudGF0aW9uKCk7Ci0gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PSBQbG90T3JpZW50YXRpb24uSE9SSVpPTlRBTCkgewotICAgICAgICAgICAgbGluZSA9IG5ldyBMaW5lMkQuRG91YmxlKHlNaW4yRCwgeDJELCB5TWF4MkQsIHgyRCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT0gUGxvdE9yaWVudGF0aW9uLlZFUlRJQ0FMKSB7Ci0gICAgICAgICAgICBsaW5lID0gbmV3IExpbmUyRC5Eb3VibGUoeDJELCB5TWluMkQsIHgyRCwgeU1heDJEKTsKLSAgICAgICAgfQotICAgICAgICBnMi5zZXRQYWludChwKTsKLSAgICAgICAgZzIuc2V0U3Ryb2tlKHMpOwotICAgICAgICBnMi5kcmF3KGxpbmUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L1N5bmNDb21tb24uamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nL2V2ZW50L1N5bmNDb21tb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzNTVkMS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZy9ldmVudC9TeW5jQ29tbW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5FdmVudENvbnRhaW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50TG9nUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuSW52YWxpZFR5cGVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFN5bmNDb21tb24gZXh0ZW5kcyBFdmVudERpc3BsYXkgewotCi0gICAgLy8gU3RhdGUgaW5mb3JtYXRpb24gd2hpbGUgcHJvY2Vzc2luZyB0aGUgZXZlbnQgc3RyZWFtCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RTdGF0ZTsgLy8gMCBpZiBldmVudCBzdGFydGVkLCAxIGlmIGV2ZW50IHN0b3BwZWQKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RTdGFydFRpbWU7IC8vIG1zCi0gICAgcHJpdmF0ZSBsb25nIG1MYXN0U3RvcFRpbWU7IC8vbXMKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdERldGFpbHM7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RTeW5jU291cmNlOyAvLyBwb2xsLCBzZXJ2ZXIsIHVzZXIsIGV0Yy4KLQotICAgIC8vIFNvbWUgY29tbW9uIHZhcmlhYmxlcyBmb3Igc3luYyBkaXNwbGF5LiAgVGhlc2UgZGVmaW5lIHRoZSBzeW5jIGJhY2tlbmRzCi0gICAgLy9hbmQgaG93IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDQUxFTkRBUiA9IDA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR01BSUwgPSAxOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZFRURTID0gMjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUUyA9IDM7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JTID0gNDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOVU1fQVVUSFMgPSAoQ09OVEFDVFMgKyAxKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX05BTUVTW10gPSB7IkNhbGVuZGFyIiwgIkdtYWlsIiwgIkZlZWRzIiwgIkNvbnRhY3RzIiwKLSAgICAgICAgICAgICJFcnJvcnMifTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIEFVVEhfQ09MT1JTW10gPSB7Q29sb3IuTUFHRU5UQSwgQ29sb3IuR1JFRU4sIENvbG9yLkJMVUUsCi0gICAgICAgICAgICBDb2xvci5PUkFOR0UsIENvbG9yLlJFRH07Ci0KLSAgICAvLyBWYWx1ZXMgZnJvbSBkYXRhL2V0Yy9ldmVudC1sb2ctdGFncwotICAgIGZpbmFsIGludCBFVkVOVF9TWU5DID0gMjcyMDsKLSAgICBmaW5hbCBpbnQgRVZFTlRfVElDS0xFID0gMjc0MjsKLSAgICBmaW5hbCBpbnQgRVZFTlRfU1lOQ19ERVRBSUxTID0gMjc0MzsKLSAgICBmaW5hbCBpbnQgRVZFTlRfQ09OVEFDVFNfQUdHUkVHQVRJT04gPSAyNzQ3OwotCi0gICAgcHJvdGVjdGVkIFN5bmNDb21tb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHZvaWQgcmVzZXRVSSgpIHsKLSAgICAgICAgbUxhc3RTdGFydFRpbWUgPSAwOwotICAgICAgICBtTGFzdFN0b3BUaW1lID0gMDsKLSAgICAgICAgbUxhc3RTdGF0ZSA9IC0xOwotICAgICAgICBtTGFzdFN5bmNTb3VyY2UgPSAtMTsKLSAgICAgICAgbUxhc3REZXRhaWxzID0gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZGlzcGxheSB3aXRoIGEgbmV3IGV2ZW50LiAgVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IKLSAgICAgKiBlYWNoIGV2ZW50LiAgVGhpcyBtZXRob2QgaGFzIHRoZSBsb2dpYyB0byB0aWUgdG9nZXRoZXIgdGhlIHN0YXJ0IGV2ZW50LAotICAgICAqIHN0b3AgZXZlbnQsIGFuZCBkZXRhaWxzIGV2ZW50IGludG8gb25lIGdyYXBoIGl0ZW0uICBUaGUgY29tYmluZWQgc3luYyBldmVudAotICAgICAqIGlzIGhhbmRlZCB0byB0aGUgc3ViY2xhc3MgdmlhIHByb2Nlc3NTeWNuRXZlbnQuICBOb3RlIHRoYXQgdGhlIGRldGFpbHMKLSAgICAgKiBjYW4gaGFwcGVuIGJlZm9yZSBvciBhZnRlciB0aGUgc3RvcCBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCAgICAgVGhlIGV2ZW50Ci0gICAgICogQHBhcmFtIGxvZ1BhcnNlciBUaGUgcGFyc2VyIHByb3ZpZGluZyB0aGUgZXZlbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCBuZXdFdmVudChFdmVudENvbnRhaW5lciBldmVudCwgRXZlbnRMb2dQYXJzZXIgbG9nUGFyc2VyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQubVRhZyA9PSBFVkVOVF9TWU5DKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gSW50ZWdlci5wYXJzZUludChldmVudC5nZXRWYWx1ZUFzU3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgeyAvLyBzdGFydAotICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXJ0VGltZSA9IChsb25nKSBldmVudC5zZWMgKiAxMDAwTCArIChldmVudC5uc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTeW5jU291cmNlID0gSW50ZWdlci5wYXJzZUludChldmVudC5nZXRWYWx1ZUFzU3RyaW5nKDIpKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtTGFzdERldGFpbHMgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IDEpIHsgLy8gc3RvcAotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFN0b3BUaW1lID0gKGxvbmcpIGV2ZW50LnNlYyAqIDEwMDBMICsgKGV2ZW50Lm5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RTdGFydFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBzdGFydHMgd2l0aCBhIHN0b3AgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXJ0VGltZSA9IG1MYXN0U3RvcFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aCA9IGdldEF1dGgoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3luY0V2ZW50KGV2ZW50LCBhdXRoLCBtTGFzdFN0YXJ0VGltZSwgbUxhc3RTdG9wVGltZSwgbUxhc3REZXRhaWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBtTGFzdFN5bmNTb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm1UYWcgPT0gRVZFTlRfU1lOQ19ERVRBSUxTKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3REZXRhaWxzID0gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygzKTsKLSAgICAgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSAhPSAwKSB7IC8vIE5vdCBpbnNpZGUgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB1cGRhdGVUaW1lID0gKGxvbmcpIGV2ZW50LnNlYyAqIDEwMDBMICsgKGV2ZW50Lm5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVUaW1lIC0gbUxhc3RTdG9wVGltZSA8PSAyNTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvdCBkZXRhaWxzIHdpdGhpbiAyNTBtcyBhZnRlciBldmVudCwgc28gZGVsZXRlIGFuZCByZS1pbnNlcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGFpbHMgbGF0ZXIgdGhhbiAyNTBtcyAoYXJiaXRyYXJ5KSBhcmUgZGlzY2FyZGVkIGFzIHByb2JhYmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnJlbGF0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aCA9IGdldEF1dGgoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3luY0V2ZW50KGV2ZW50LCBhdXRoLCBtTGFzdFN0YXJ0VGltZSwgbUxhc3RTdG9wVGltZSwgbUxhc3REZXRhaWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbUxhc3RTeW5jU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQubVRhZyA9PSBFVkVOVF9DT05UQUNUU19BR0dSRUdBVElPTikgewotICAgICAgICAgICAgICAgIGxvbmcgc3RvcFRpbWUgPSAobG9uZykgZXZlbnQuc2VjICogMTAwMEwgKyAoZXZlbnQubnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0VGltZSA9IHN0b3BUaW1lIC0gTG9uZy5wYXJzZUxvbmcoZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRldGFpbHM7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gSW50ZWdlci5wYXJzZUludChldmVudC5nZXRWYWx1ZUFzU3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHMgPSAiZyIgKyAoLWNvdW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXRhaWxzID0gIkciICsgY291bnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb2Nlc3NTeW5jRXZlbnQoZXZlbnQsIENPTlRBQ1RTLCBzdGFydFRpbWUsIHN0b3BUaW1lLCBkZXRhaWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZXdFdmVudCAqLywgbUxhc3RTeW5jU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFR5cGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgaG9vayBmb3Igc3ViY2xhc3MgdG8gcHJvY2VzcyBhIHN5bmMgZXZlbnQuICBuZXdFdmVudCBoYXMgdGhlIGxvZ2ljCi0gICAgICogdG8gY29tYmluZSBzdGFydCBhbmQgc3RvcCBldmVudHMgYW5kIHBhc3NlcyBhIHByb2Nlc3NlZCBldmVudCB0byB0aGUKLSAgICAgKiBzdWJjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCAgICAgVGhlIHN5bmMgZXZlbnQKLSAgICAgKiBAcGFyYW0gYXV0aCAgICAgIFRoZSBzeW5jIGF1dGhvcml0eQotICAgICAqIEBwYXJhbSBzdGFydFRpbWUgU3RhcnQgdGltZSAobXMpIG9mIGV2ZW50cwotICAgICAqIEBwYXJhbSBzdG9wVGltZSAgU3RvcCB0aW1lIChtcykgb2YgZXZlbnRzCi0gICAgICogQHBhcmFtIGRldGFpbHMgICBEZXRhaWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIG5ld0V2ZW50ICBUcnVlIGlmIHRoaXMgZXZlbnQgaXMgYSBuZXcgc3luYyBldmVudC4gIEZhbHNlIGlmIHRoaXMgZXZlbnQKLSAgICAgKiBAcGFyYW0gc3luY1NvdXJjZSBQb2xsLCB1c2VyLCBzZXJ2ZXIsIGV0Yy4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIHByb2Nlc3NTeW5jRXZlbnQoRXZlbnRDb250YWluZXIgZXZlbnQsIGludCBhdXRoLCBsb25nIHN0YXJ0VGltZSwgbG9uZyBzdG9wVGltZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzLCBib29sZWFuIG5ld0V2ZW50LCBpbnQgc3luY1NvdXJjZSk7Ci0gICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGF1dGhvcml0eSBuYW1lIHRvIGF1dGggbnVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGF1dGhuYW1lICJjYWxlbmRhciIsIGV0Yy4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBzZXJpZXMgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aG9yaXR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRBdXRoKFN0cmluZyBhdXRobmFtZSkgdGhyb3dzIEludmFsaWRUeXBlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCJjYWxlbmRhciIuZXF1YWxzKGF1dGhuYW1lKSB8fCAiY2wiLmVxdWFscyhhdXRobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBDQUxFTkRBUjsKLSAgICAgICAgfSBlbHNlIGlmICgiY29udGFjdHMiLmVxdWFscyhhdXRobmFtZSkgfHwgImNwIi5lcXVhbHMoYXV0aG5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzIi5lcXVhbHMoYXV0aG5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09OVEFDVFM7Ci0gICAgICAgIH0gZWxzZSBpZiAoInN1YnNjcmliZWRmZWVkcyIuZXF1YWxzKGF1dGhuYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIEZFRURTOwotICAgICAgICB9IGVsc2UgaWYgKCJnbWFpbC1scyIuZXF1YWxzKGF1dGhuYW1lKSB8fCAibWFpbCIuZXF1YWxzKGF1dGhuYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIEdNQUlMOwotICAgICAgICB9IGVsc2UgaWYgKCJnbWFpbC1saXZlIi5lcXVhbHMoYXV0aG5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gR01BSUw7Ci0gICAgICAgIH0gZWxzZSBpZiAoInVua25vd24iLmVxdWFscyhhdXRobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsgLy8gVW5rbm93biB0aWNrbGVzOyBkaXNjYXJkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFR5cGVFeGNlcHRpb24oIlVua25vd24gYXV0aG5hbWUgIiArIGF1dGhuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nY2F0L0VkaXRGaWx0ZXJEaWFsb2cuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nY2F0L0VkaXRGaWx0ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2ZmU0OC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZ2NhdC9FZGl0RmlsdGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nY2F0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSUltYWdlTG9hZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogU21hbGwgZGlhbG9nIGJveCB0byBlZGl0IGEgc3RhdGljIHBvcnQgbnVtYmVyLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdEZpbHRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRExHX1dJRFRIID0gNDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBETEdfSEVJR0hUID0gMjUwOwotCi0gICAgcHJpdmF0ZSBTaGVsbCBtUGFyZW50OwotCi0gICAgcHJpdmF0ZSBTaGVsbCBtU2hlbGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbU9rID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIElJbWFnZUxvYWRlciBtSW1hZ2VMb2FkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXIgYmVpbmcgZWRpdGVkIG9yIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIExvZ0ZpbHRlciBtRmlsdGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKLSAgICBwcml2YXRlIFN0cmluZyBtUGlkOwotCi0gICAgLyoqIExvZyBsZXZlbCBhcyBhbiBpbmRleCBvZiB0aGUgZHJvcC1kb3duIGNvbWJvCi0gICAgICogQHNlZSBnZXRMb2dMZXZlbAotICAgICAqIEBzZWUgZ2V0Q29tYm9JbmRleAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Mb2dMZXZlbDsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1Pa0J1dHRvbjsKLQotICAgIHByaXZhdGUgTGFiZWwgbVBpZFdhcm5pbmc7Ci0KLSAgICBwdWJsaWMgRWRpdEZpbHRlckRpYWxvZyhJSW1hZ2VMb2FkZXIgaW1hZ2VMb2FkZXIsIFNoZWxsIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5CT1JERVIgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICAgICAgICBtSW1hZ2VMb2FkZXIgPSBpbWFnZUxvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdEZpbHRlckRpYWxvZyhJSW1hZ2VMb2FkZXIgaW1hZ2VMb2FkZXIsIFNoZWxsIHNoZWxsLAotICAgICAgICAgICAgTG9nRmlsdGVyIGZpbHRlcikgewotICAgICAgICB0aGlzKGltYWdlTG9hZGVyLCBzaGVsbCk7Ci0gICAgICAgIG1GaWx0ZXIgPSBmaWx0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgdGhlIGRpYWxvZy4gVGhlIG1ldGhvZCB3aWxsIHJldHVybiB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgZGlhbG9nCi0gICAgICogc29tZWhvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvayB3YXMgcHJlc3NlZCwgZmFsc2UgaWYgY2FuY2VsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9wZW4oKSB7Ci0gICAgICAgIGNyZWF0ZVVJKCk7Ci0KLSAgICAgICAgaWYgKG1QYXJlbnQgPT0gbnVsbCB8fCBtU2hlbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNoZWxsLnNldE1pbmltdW1TaXplKERMR19XSURUSCwgRExHX0hFSUdIVCk7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gbVBhcmVudC5nZXRCb3VuZHMoKTsKLSAgICAgICAgLy8gZ2V0IHRoZSBjZW50ZXIgbmV3IHRvcCBsZWZ0LgotICAgICAgICBpbnQgY3ggPSByLnggKyByLndpZHRoLzI7Ci0gICAgICAgIGludCB4ID0gY3ggLSBETEdfV0lEVEggLyAyOwotICAgICAgICBpbnQgY3kgPSByLnkgKyByLmhlaWdodC8yOwotICAgICAgICBpbnQgeSA9IGN5IC0gRExHX0hFSUdIVCAvIDI7Ci0gICAgICAgIG1TaGVsbC5zZXRCb3VuZHMoeCwgeSwgRExHX1dJRFRILCBETEdfSEVJR0hUKTsKLQotICAgICAgICBtU2hlbGwub3BlbigpOwotCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1QYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICB3aGlsZSAoIW1TaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSdyZSBxdWl0dGluZyB3aXRoIE9LLgotICAgICAgICAvLyBMZXRzIHVwZGF0ZSB0aGUgZmlsdGVyIGlmIG5lZWRlZAotICAgICAgICBpZiAobU9rKSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCB3YXMgYSAiQ3JlYXRlIGZpbHRlciIgYWN0aW9uIHdlIG5lZWQgdG8gY3JlYXRlIGl0IGZpcnN0LgotICAgICAgICAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1GaWx0ZXIgPSBuZXcgTG9nRmlsdGVyKG1OYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0dXAgdGhlIGZpbHRlcgotICAgICAgICAgICAgbUZpbHRlci5zZXRUYWdNb2RlKG1UYWcpOwotCi0gICAgICAgICAgICBpZiAobVBpZCAhPSBudWxsICYmIG1QaWQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbHRlci5zZXRQaWRNb2RlKEludGVnZXIucGFyc2VJbnQobVBpZCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRmlsdGVyLnNldFBpZE1vZGUoLTEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRmlsdGVyLnNldExvZ0xldmVsKGdldExvZ0xldmVsKG1Mb2dMZXZlbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1PazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9nRmlsdGVyIGdldEZpbHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1GaWx0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVJKCkgewotICAgICAgICBtUGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIG1TaGVsbCA9IG5ldyBTaGVsbChtUGFyZW50LCBnZXRTdHlsZSgpKTsKLSAgICAgICAgbVNoZWxsLnNldFRleHQoIkxvZyBGaWx0ZXIiKTsKLQotICAgICAgICBtU2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgbVNoZWxsLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gdG9wIHBhcnQgd2l0aCB0aGUgZmlsdGVyIG5hbWUKLSAgICAgICAgQ29tcG9zaXRlIG5hbWVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBuYW1lQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBuYW1lQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwobmFtZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIkZpbHRlciBOYW1lOiIpOwotCi0gICAgICAgIGZpbmFsIFRleHQgZmlsdGVyTmFtZVRleHQgPSBuZXcgVGV4dChuYW1lQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU5hbWUgPSBtRmlsdGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyTmFtZVRleHQuc2V0VGV4dChtTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGZpbHRlck5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1OYW1lID0gZmlsdGVyTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBzZXBhcmF0b3IKLSAgICAgICAgbCA9IG5ldyBMYWJlbChtU2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQotICAgICAgICAvLyBjZW50ZXIgcGFydCB3aXRoIHRoZSBmaWx0ZXIgcGFyYW1ldGVycwotICAgICAgICBDb21wb3NpdGUgbWFpbiA9IG5ldyBDb21wb3NpdGUobVNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1haW4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1haW4uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChtYWluLCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiYnkgTG9nIFRhZzoiKTsKLQotICAgICAgICBmaW5hbCBUZXh0IHRhZ1RleHQgPSBuZXcgVGV4dChtYWluLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UYWcgPSBtRmlsdGVyLmdldFRhZ0ZpbHRlcigpOwotICAgICAgICAgICAgaWYgKG1UYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhZ1RleHQuc2V0VGV4dChtVGFnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHRhZ1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHRhZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbVRhZyA9IHRhZ1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKG1haW4sIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJieSBwaWQ6Iik7Ci0KLSAgICAgICAgZmluYWwgVGV4dCBwaWRUZXh0ID0gbmV3IFRleHQobWFpbiwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUZpbHRlci5nZXRQaWRGaWx0ZXIoKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1QaWQgPSBJbnRlZ2VyLnRvU3RyaW5nKG1GaWx0ZXIuZ2V0UGlkRmlsdGVyKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGlkID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaWRUZXh0LnNldFRleHQobVBpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGlkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcGlkVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtUGlkID0gcGlkVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1QaWRXYXJuaW5nID0gbmV3IExhYmVsKG1haW4sIFNXVC5OT05FKTsKLSAgICAgICAgbVBpZFdhcm5pbmcuc2V0SW1hZ2UobUltYWdlTG9hZGVyLmxvYWRJbWFnZSgiZW1wdHkucG5nIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtU2hlbGwuZ2V0RGlzcGxheSgpKSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChtYWluLCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiYnkgTG9nIGxldmVsOiIpOwotCi0gICAgICAgIGZpbmFsIENvbWJvIGxvZ0NvbWJvID0gbmV3IENvbWJvKG1haW4sIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsb2dDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGxhYmVscwotICAgICAgICBsb2dDb21iby5hZGQoIjxub25lPiIpOwotICAgICAgICBsb2dDb21iby5hZGQoIkVycm9yIik7Ci0gICAgICAgIGxvZ0NvbWJvLmFkZCgiV2FybmluZyIpOwotICAgICAgICBsb2dDb21iby5hZGQoIkluZm8iKTsKLSAgICAgICAgbG9nQ29tYm8uYWRkKCJEZWJ1ZyIpOwotICAgICAgICBsb2dDb21iby5hZGQoIlZlcmJvc2UiKTsKLQotICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTG9nTGV2ZWwgPSBnZXRDb21ib0luZGV4KG1GaWx0ZXIuZ2V0TG9nTGV2ZWwoKSk7Ci0gICAgICAgICAgICBsb2dDb21iby5zZWxlY3QobUxvZ0xldmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZ0NvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBtTG9nTGV2ZWwgPSBsb2dDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNlcGFyYXRvcgotICAgICAgICBsID0gbmV3IExhYmVsKG1TaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICAvLyBib3R0b20gcGFydCB3aXRoIHRoZSBvay9jYW5jZWwKLSAgICAgICAgQ29tcG9zaXRlIGJvdHRvbUNvbXAgPSBuZXcgQ29tcG9zaXRlKG1TaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wCi0gICAgICAgICAgICAgICAgLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0gICAgICAgIGJvdHRvbUNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotICAgICAgICBtT2tCdXR0b24gPSBuZXcgQnV0dG9uKGJvdHRvbUNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgbU9rQnV0dG9uLnNldFRleHQoIk9LIik7Ci0gICAgICAgIG1Pa0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1PayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVNoZWxsLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtT2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1TaGVsbC5zZXREZWZhdWx0QnV0dG9uKG1Pa0J1dHRvbik7Ci0KLSAgICAgICAgQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oYm90dG9tQ29tcCwgU1dULk5PTkUpOwotICAgICAgICBjYW5jZWxCdXR0b24uc2V0VGV4dCgiQ2FuY2VsIik7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1TaGVsbC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvZyBsZXZlbCBmcm9tIGEgY29tYm8gaW5kZXguCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBDb21ibyBpbmRleAotICAgICAqIEByZXR1cm4gYSBsb2cgbGV2ZWwgdmFsaWQgZm9yIHRoZSBMb2cgY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRMb2dMZXZlbChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA3IC0gaW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIGNvbWJvIHRoYXQgbWF0Y2hlcyB0aGUgbG9nIGxldmVsCi0gICAgICogQHBhcmFtIGxvZ0xldmVsIFRoZSBMb2cgbGV2ZWwuCi0gICAgICogQHJldHVybiB0aGUgY29tYm8gaW5kZXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRDb21ib0luZGV4KGludCBsb2dMZXZlbCkgewotICAgICAgICBpZiAobG9nTGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDcgLSBsb2dMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIDIgdGV4dCBmaWVsZHMgYW5kIGVuYWJsZS9kaXNhYmxlICJvayIsIHdoaWxlCi0gICAgICogc2V0dGluZyB1cCB0aGUgd2FybmluZy9lcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQotICAgICAgICAvLyB0aGVuIHdlIGNoZWNrIGl0IG9ubHkgY29udGFpbnMgZGlnaXRzLgotICAgICAgICBpZiAobVBpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVBpZC5tYXRjaGVzKCJbMC05XSoiKSA9PSBmYWxzZSkgeyAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtUGlkV2FybmluZy5zZXRJbWFnZShtSW1hZ2VMb2FkZXIubG9hZEltYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmcucG5nIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGVsbC5nZXREaXNwbGF5KCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QaWRXYXJuaW5nLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZW1wdHkucG5nIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGVsbC5nZXREaXNwbGF5KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmFtZSA9PSBudWxsIHx8IG1OYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtdWlsaWIvbG9nY2F0L0xvZ0NvbG9ycy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2djYXQvTG9nQ29sb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmY2NTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2djYXQvTG9nQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBMb2dDb2xvcnMgewotICAgIHB1YmxpYyBDb2xvciBpbmZvQ29sb3I7Ci0gICAgcHVibGljIENvbG9yIGRlYnVnQ29sb3I7Ci0gICAgcHVibGljIENvbG9yIGVycm9yQ29sb3I7Ci0gICAgcHVibGljIENvbG9yIHdhcm5pbmdDb2xvcjsKLSAgICBwdWJsaWMgQ29sb3IgdmVyYm9zZUNvbG9yOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2djYXQvTG9nRmlsdGVyLmphdmEgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZ2NhdC9Mb2dGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZGUyZi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZ2NhdC9Mb2dGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuYW5ub3RhdGlvbi5VaVRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQuTG9nUGFuZWwuTG9nTWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotCi0vKiogbG9nY2F0IG91dHB1dCBmaWx0ZXIgY2xhc3MgKi8KLXB1YmxpYyBjbGFzcyBMb2dGaWx0ZXIgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTU9ERV9QSUQgPSAweDAxOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1PREVfVEFHID0gMHgwMjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNT0RFX0xFVkVMID0gMHgwNDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotCi0gICAgLyoqCi0gICAgICogRmlsdGVyaW5nIG1vZGUuIFZhbHVlIGNhbiBiZSBhIG1peCBvZiBNT0RFX1BJRCwgTU9ERV9UQUcsIE1PREVfTEVWRUwKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTW9kZSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBwaWQgdXNlZCBmb3IgZmlsdGVyaW5nLiBPbmx5IHZhbGlkIGlmIG1Nb2RlIGlzIE1PREVfUElELgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1QaWQ7Ci0KLSAgICAvKiogU2luZ2xlIGxldmVsIGxvZyBsZXZlbCBhcyBkZWZpbmVkIGluIExvZy5tTGV2ZWxDaGFyLiBPbmx5IHZhbGlkCi0gICAgICogaWYgbU1vZGUgaXMgTU9ERV9MRVZFTCAqLwotICAgIHByaXZhdGUgaW50IG1Mb2dMZXZlbDsKLQotICAgIC8qKgotICAgICAqIGxvZyB0YWcgZmlsdGVyaW5nLiBPbmx5IHZhbGlkIGlmIG1Nb2RlIGlzIE1PREVfVEFHCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKLQotICAgIHByaXZhdGUgVGFibGUgbVRhYmxlOwotICAgIHByaXZhdGUgVGFiSXRlbSBtVGFiSXRlbTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ3VycmVudFRhYkl0ZW0gPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtVW5yZWFkQ291bnQgPSAwOwotCi0gICAgLyoqIFRlbXAga2V5d29yZCBmaWx0ZXJpbmcgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1UZW1wS2V5d29yZEZpbHRlcnM7Ci0KLSAgICAvKiogdGVtcCBwaWQgZmlsdGVyaW5nICovCi0gICAgcHJpdmF0ZSBpbnQgbVRlbXBQaWQgPSAtMTsKLQotICAgIC8qKiB0ZW1wIHRhZyBmaWx0ZXJpbmcgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVGVtcFRhZzsKLQotICAgIC8qKiB0ZW1wIGxvZyBsZXZlbCBmaWx0ZXJpbmcgKi8KLSAgICBwcml2YXRlIGludCBtVGVtcExvZ0xldmVsID0gLTE7Ci0KLSAgICBwcml2YXRlIExvZ0NvbG9ycyBtQ29sb3JzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UZW1wRmlsdGVyaW5nU3RhdHVzID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TG9nTWVzc2FnZT4gbU1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxMb2dNZXNzYWdlPigpOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExvZ01lc3NhZ2U+IG1OZXdNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TG9nTWVzc2FnZT4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydHNEZWxldGUgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydHNFZGl0ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGludCBtUmVtb3ZlZE1lc3NhZ2VDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZmlsdGVyIHdpdGggYSBwYXJ0aWN1bGFyIG1vZGUuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSQotICAgICAqLwotICAgIHB1YmxpYyBMb2dGaWx0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2dGaWx0ZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobU5hbWUpOwotCi0gICAgICAgIHNiLmFwcGVuZCgnOicpOwotICAgICAgICBzYi5hcHBlbmQobU1vZGUpOwotICAgICAgICBpZiAoKG1Nb2RlICYgTU9ERV9QSUQpID09IE1PREVfUElEKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtUGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobU1vZGUgJiBNT0RFX0xFVkVMKSA9PSBNT0RFX0xFVkVMKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtTG9nTGV2ZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfVEFHKSA9PSBNT0RFX1RBRykgewotICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2FkRnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gc3RyaW5nLnNwbGl0KCI6Iik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBuYW1lCi0gICAgICAgIG1OYW1lID0gc2VnbWVudHNbaW5kZXgrK107Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBtb2RlCi0gICAgICAgIG1Nb2RlID0gSW50ZWdlci5wYXJzZUludChzZWdtZW50c1tpbmRleCsrXSk7Ci0KLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfUElEKSA9PSBNT0RFX1BJRCkgewotICAgICAgICAgICAgbVBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VnbWVudHNbaW5kZXgrK10pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfTEVWRUwpID09IE1PREVfTEVWRUwpIHsKLSAgICAgICAgICAgIG1Mb2dMZXZlbCA9IEludGVnZXIucGFyc2VJbnQoc2VnbWVudHNbaW5kZXgrK10pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfVEFHKSA9PSBNT0RFX1RBRykgewotICAgICAgICAgICAgbVRhZyA9IHNlZ21lbnRzW2luZGV4KytdOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKiogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsdGVyLiAqLwotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVUkgZGlzcGxheSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgVGFibGUgdWkgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlci4KLSAgICAgKiBAcGFyYW0gdGFiSXRlbSBUaGUgaXRlbSBpbiB0aGUgVGFiRm9sZGVyCi0gICAgICogQHBhcmFtIHRhYmxlIFRoZSBUYWJsZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWRnZXRzKFRhYkl0ZW0gdGFiSXRlbSwgVGFibGUgdGFibGUpIHsKLSAgICAgICAgbVRhYmxlID0gdGFibGU7Ci0gICAgICAgIG1UYWJJdGVtID0gdGFiSXRlbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbHRlciBpcyByZWFkeSBmb3IgdWkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdWlSZWFkeSgpIHsKLSAgICAgICAgcmV0dXJuIChtVGFibGUgIT0gbnVsbCAmJiBtVGFiSXRlbSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVSSB0YWJsZSBvYmplY3QuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBtVGFibGUuZGlzcG9zZSgpOwotICAgICAgICBtVGFiSXRlbS5kaXNwb3NlKCk7Ci0gICAgICAgIG1UYWJsZSA9IG51bGw7Ci0gICAgICAgIG1UYWJJdGVtID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGZpbHRlcmluZyBtb2RlIHRvIGJlIDAgKGkuZS4gbm8gZmlsdGVyKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcmluZ01vZGUoKSB7Ci0gICAgICAgIG1Nb2RlID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbHRlcmluZyBtb2RlLgotICAgICAqIEByZXR1cm4gQSBiaXRtYXNrLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIE1PREVfUElELCBNT0RFX1RBRywgTU9ERV9MRVZFTAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmlsdGVyaW5nTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Nb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgUElEIHRvIHRoZSBjdXJyZW50IGZpbHRlcmluZyBtb2RlLgotICAgICAqIEBwYXJhbSBwaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaWRNb2RlKGludCBwaWQpIHsKLSAgICAgICAgaWYgKHBpZCAhPSAtMSkgewotICAgICAgICAgICAgbU1vZGUgfD0gTU9ERV9QSUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTW9kZSAmPSB+TU9ERV9QSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbVBpZCA9IHBpZDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgcGlkIGZpbHRlciBpZiB2YWxpZCwgb3RoZXJ3aXNlIC0xICovCi0gICAgcHVibGljIGludCBnZXRQaWRGaWx0ZXIoKSB7Ci0gICAgICAgIGlmICgobU1vZGUgJiBNT0RFX1BJRCkgPT0gTU9ERV9QSUQpCi0gICAgICAgICAgICByZXR1cm4gbVBpZDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhZ01vZGUoU3RyaW5nIHRhZykgewotICAgICAgICBpZiAodGFnICE9IG51bGwgJiYgdGFnLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbU1vZGUgfD0gTU9ERV9UQUc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTW9kZSAmPSB+TU9ERV9UQUc7Ci0gICAgICAgIH0KLSAgICAgICAgbVRhZyA9IHRhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0ZpbHRlcigpIHsKLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfVEFHKSA9PSBNT0RFX1RBRykKLSAgICAgICAgICAgIHJldHVybiBtVGFnOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2dMZXZlbChpbnQgbGV2ZWwpIHsKLSAgICAgICAgaWYgKGxldmVsID09IC0xKSB7Ci0gICAgICAgICAgICBtTW9kZSAmPSB+TU9ERV9MRVZFTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Nb2RlIHw9IE1PREVfTEVWRUw7Ci0gICAgICAgICAgICBtTG9nTGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMb2dMZXZlbCgpIHsKLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfTEVWRUwpID09IE1PREVfTEVWRUwpIHsKLSAgICAgICAgICAgIHJldHVybiBtTG9nTGV2ZWw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0c0RlbGV0ZSA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFZGl0KCkgewotICAgICAgICByZXR1cm4gbVN1cHBvcnRzRWRpdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgZmlsdGVyLgotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBzZWxlY3Rpb24gc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRTdGF0ZShib29sZWFuIHNlbGVjdGVkKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZCkgewotICAgICAgICAgICAgaWYgKG1UYWJJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVGFiSXRlbS5zZXRUZXh0KG1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1VbnJlYWRDb3VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUlzQ3VycmVudFRhYkl0ZW0gPSBzZWxlY3RlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBtZXNzYWdlIGFuZCBvcHRpb25hbGx5IHJlbW92ZXMgYW4gb2xkIG1lc3NhZ2UuCi0gICAgICogPHAvPlRoZSBuZXcgbWVzc2FnZSBpcyBmaWx0ZXJlZCB0aHJvdWdoIHtAbGluayAjYWNjZXB0KExvZ01lc3NhZ2UpfS4KLSAgICAgKiBDYWxscyB0byB7QGxpbmsgI2ZsdXNoKCl9IGZyb20gYSBVSSB0aHJlYWQgd2lsbCBkaXNwbGF5IGl0IChhbmQgb3RoZXIKLSAgICAgKiBwZW5kaW5nIG1lc3NhZ2VzKSB0byB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgVGFibGV9LgotICAgICAqIEBwYXJhbSBsb2dNZXNzYWdlIHRoZSBNZXNzYWdlRGF0YSBvYmplY3QgdG8gZmlsdGVyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBhY2NlcHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRNZXNzYWdlKExvZ01lc3NhZ2UgbmV3TWVzc2FnZSwgTG9nTWVzc2FnZSBvbGRNZXNzYWdlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobU1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICBpZiAob2xkTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbU1lc3NhZ2VzLmluZGV4T2Yob2xkTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgdGhhdCBpbmRleCB3aWxsIGFsd2F5cyBiZSAtMSBvciAwLCBhcyBvbmx5IHRoZSBvbGRlc3QgbWVzc2FnZSBpcyBldmVyIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtUmVtb3ZlZE1lc3NhZ2VDb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBub3cgd2UgbG9vayBmb3IgaXQgaW4gbU5ld01lc3NhZ2VzLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5ldyBtZXNzYWdlIGlzIGFkZGVkCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gcmVtb3ZlZCBiZWNhdXNlIHRvbyBtYW55IG1lc3NhZ2VzIGFyZSBhZGRlZCBiZXR3ZWVuIGNhbGxzIHRvICNmbHVzaCgpCi0gICAgICAgICAgICAgICAgaW5kZXggPSBtTmV3TWVzc2FnZXMuaW5kZXhPZihvbGRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayB0aGF0IGluZGV4IHdpbGwgYWx3YXlzIGJlIC0xIG9yIDAsIGFzIG9ubHkgdGhlIG9sZGVzdCBtZXNzYWdlIGlzIGV2ZXIgcmVtb3ZlZC4KLSAgICAgICAgICAgICAgICAgICAgbU5ld01lc3NhZ2VzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGZpbHRlciA9IGFjY2VwdChuZXdNZXNzYWdlKTsKLQotICAgICAgICAgICAgaWYgKGZpbHRlcikgewotICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIG1lc3NhZ2UgaXMgYWNjZXB0ZWQsIHdlIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgIG1NZXNzYWdlcy5hZGQobmV3TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgbU5ld01lc3NhZ2VzLmFkZChuZXdNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGZpbHRlciBhbmQgaXRzIHtAbGluayBUYWJsZX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1SZW1vdmVkTWVzc2FnZUNvdW50ID0gMDsKLSAgICAgICAgbU5ld01lc3NhZ2VzLmNsZWFyKCk7Ci0gICAgICAgIG1NZXNzYWdlcy5jbGVhcigpOwotICAgICAgICBtVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbHRlcnMgYSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBsb2dNZXNzYWdlIHRoZSBNZXNzYWdlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBhY2NlcHQoTG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7Ci0gICAgICAgIC8vIGRvIHRoZSByZWd1bGFyIGZpbHRlcmluZyBub3cKLSAgICAgICAgaWYgKChtTW9kZSAmIE1PREVfUElEKSA9PSBNT0RFX1BJRCAmJiBtUGlkICE9IGxvZ01lc3NhZ2UuZGF0YS5waWQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobU1vZGUgJiBNT0RFX1RBRykgPT0gTU9ERV9UQUcgJiYgKAotICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2UuZGF0YS50YWcgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2UuZGF0YS50YWcuZXF1YWxzKG1UYWcpID09IGZhbHNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1zZ0xvZ0xldmVsID0gbG9nTWVzc2FnZS5kYXRhLmxvZ0xldmVsLmdldFByaW9yaXR5KCk7Ci0KLSAgICAgICAgLy8gdGVzdCB0aGUgdGVtcCBsb2cgZmlsdGVyaW5nIGZpcnN0LCBhcyBpdCByZXBsYWNlcyB0aGUgb2xkIG9uZQotICAgICAgICBpZiAobVRlbXBMb2dMZXZlbCAhPSAtMSkgewotICAgICAgICAgICAgaWYgKG1UZW1wTG9nTGV2ZWwgPiBtc2dMb2dMZXZlbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobU1vZGUgJiBNT0RFX0xFVkVMKSA9PSBNT0RFX0xFVkVMICYmCi0gICAgICAgICAgICAgICAgbUxvZ0xldmVsID4gbXNnTG9nTGV2ZWwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvIHRoZSB0ZW1wIGZpbHRlcmluZyBub3cuCi0gICAgICAgIGlmIChtVGVtcEtleXdvcmRGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBsb2dNZXNzYWdlLm1zZzsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcga3cgOiBtVGVtcEtleXdvcmRGaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jb250YWlucyhrdykgPT0gZmFsc2UgJiYgbXNnLm1hdGNoZXMoa3cpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmluZyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGVtcFBpZCAhPSAtMSAmJiBtVGVtcFBpZCAhPSBsb2dNZXNzYWdlLmRhdGEucGlkKSB7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGVtcFRhZyAhPSBudWxsICYmIG1UZW1wVGFnLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKG1UZW1wVGFnLmVxdWFscyhsb2dNZXNzYWdlLmRhdGEudGFnKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRha2VzIGFsbCB0aGUgYWNjZXB0ZWQgbWVzc2FnZXMgYW5kIGRpc3BsYXkgdGhlbS4KLSAgICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gYSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgQFVpVGhyZWFkCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAgIC8vIGlmIHNjcm9sbCBiYXIgaXMgYXQgdGhlIGJvdHRvbSwgd2Ugd2lsbCBzY3JvbGwKLSAgICAgICAgU2Nyb2xsQmFyIGJhciA9IG1UYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICBib29sZWFuIHNjcm9sbCA9IGJhci5nZXRNYXhpbXVtKCkgPT0gYmFyLmdldFNlbGVjdGlvbigpICsgYmFyLmdldFRodW1iKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IGdvaW5nIHRvIHNjcm9sbCwgZ2V0IHRoZSBjdXJyZW50IGZpcnN0IGl0ZW0gYmVpbmcgc2hvd24uCi0gICAgICAgIGludCB0b3BJbmRleCA9IG1UYWJsZS5nZXRUb3BJbmRleCgpOwotCi0gICAgICAgIC8vIGRpc2FibGUgZHJhd2luZwotICAgICAgICBtVGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGludCB0b3RhbENvdW50ID0gbU5ld01lc3NhZ2VzLnNpemUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpdGVtcyBvZiB0aGUgb2xkIG1lc3NhZ2VzLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbVJlbW92ZWRNZXNzYWdlQ291bnQgJiYgbVRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCA7IGkrKykgewotICAgICAgICAgICAgICAgIG1UYWJsZS5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpZiAobVVucmVhZENvdW50ID4gbVRhYmxlLmdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgbVVucmVhZENvdW50ID0gbVRhYmxlLmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgaXRlbXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwICA7IGkgPCB0b3RhbENvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTG9nTWVzc2FnZSBtc2cgPSBtTmV3TWVzc2FnZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGFkZFRhYmxlSXRlbShtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbG9nIHRoZSBlcnJvciBhbmQga2VlcCBnb2luZy4gQ29udGVudCBvZiB0aGUgbG9nY2F0IHRhYmxlIG1heWJlIHVuZXhwZWN0ZWQKLSAgICAgICAgICAgIC8vIGJ1dCBhdCBsZWFzdCBkZG1zIHdvbid0IGNyYXNoLgotICAgICAgICAgICAgTG9nLmUoIkxvZ0ZpbHRlciIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyByZWRyYXcKLSAgICAgICAgbVRhYmxlLnNldFJlZHJhdyh0cnVlKTsKLQotICAgICAgICAvLyBzY3JvbGwgaWYgbmVlZGVkLCBieSBzaG93aW5nIHRoZSBsYXN0IGl0ZW0KLSAgICAgICAgaWYgKHNjcm9sbCkgewotICAgICAgICAgICAgdG90YWxDb3VudCA9IG1UYWJsZS5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgIGlmICh0b3RhbENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIG1UYWJsZS5zaG93SXRlbShtVGFibGUuZ2V0SXRlbSh0b3RhbENvdW50LTEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3ZlZE1lc3NhZ2VDb3VudCA+IDApIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSB0b3BJbmRleCBpcyBzdGlsbCB2aXNpYmxlLgotICAgICAgICAgICAgLy8gQmVjYXVzZSByZWFsbHkgb2xkIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIGxpc3QsIHRoaXMgY291bGQgbWFrZSBpdCBkaXNhcHBlYXIKLSAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGNoYW5nZSB0aGUgc2Nyb2xsIHZhbHVlIGF0IGFsbC4KLQotICAgICAgICAgICAgdG9wSW5kZXggLT0gbVJlbW92ZWRNZXNzYWdlQ291bnQ7Ci0gICAgICAgICAgICBpZiAodG9wSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBpdCBkaXNhcHBlYXJlZC4gTGV0cyBqdXN0IHNob3cgdGhlIGZpcnN0IGl0ZW0KLSAgICAgICAgICAgICAgICBtVGFibGUuc2hvd0l0ZW0obVRhYmxlLmdldEl0ZW0oMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGFibGUuc2hvd0l0ZW0obVRhYmxlLmdldEl0ZW0odG9wSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoaXMgZmlsdGVyIGlzIG5vdCB0aGUgY3VycmVudCBvbmUsIHdlIHVwZGF0ZSB0aGUgdGFiIHRleHQKLSAgICAgICAgLy8gd2l0aCB0aGUgYW1vdW50IG9mIHVucmVhZCBtZXNzYWdlCi0gICAgICAgIGlmIChtSXNDdXJyZW50VGFiSXRlbSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVVucmVhZENvdW50ICs9IG1OZXdNZXNzYWdlcy5zaXplKCk7Ci0gICAgICAgICAgICB0b3RhbENvdW50ID0gbVRhYmxlLmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgaWYgKG1VbnJlYWRDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBtVGFiSXRlbS5zZXRUZXh0KG1OYW1lICsgIiAoIiAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgKyAobVVucmVhZENvdW50ID4gdG90YWxDb3VudCA/IHRvdGFsQ291bnQgOiBtVW5yZWFkQ291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIpIik7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGFiSXRlbS5zZXRUZXh0KG1OYW1lKTsgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1OZXdNZXNzYWdlcy5jbGVhcigpOwotICAgIH0KLQotICAgIHZvaWQgc2V0Q29sb3JzKExvZ0NvbG9ycyBjb2xvcnMpIHsKLSAgICAgICAgbUNvbG9ycyA9IGNvbG9yczsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0VW5yZWFkQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtVW5yZWFkQ291bnQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRVbnJlYWRDb3VudChpbnQgdW5yZWFkQ291bnQpIHsKLSAgICAgICAgbVVucmVhZENvdW50ID0gdW5yZWFkQ291bnQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRTdXBwb3J0c0RlbGV0ZShib29sZWFuIHN1cHBvcnQpIHsKLSAgICAgICAgbVN1cHBvcnRzRGVsZXRlID0gc3VwcG9ydDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFN1cHBvcnRzRWRpdChib29sZWFuIHN1cHBvcnQpIHsKLSAgICAgICAgbVN1cHBvcnRzRWRpdCA9IHN1cHBvcnQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUZW1wS2V5d29yZEZpbHRlcmluZyhTdHJpbmdbXSBzZWdtZW50cykgewotICAgICAgICBtVGVtcEtleXdvcmRGaWx0ZXJzID0gc2VnbWVudHM7Ci0gICAgICAgIG1UZW1wRmlsdGVyaW5nU3RhdHVzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFRlbXBQaWRGaWx0ZXJpbmcoaW50IHBpZCkgewotICAgICAgICBtVGVtcFBpZCA9IHBpZDsKLSAgICAgICAgbVRlbXBGaWx0ZXJpbmdTdGF0dXMgPSB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgc2V0VGVtcFRhZ0ZpbHRlcmluZyhTdHJpbmcgdGFnKSB7Ci0gICAgICAgIG1UZW1wVGFnID0gdGFnOwotICAgICAgICBtVGVtcEZpbHRlcmluZ1N0YXR1cyA9IHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldFRlbXBGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtVGVtcFBpZCAhPSAtMSB8fCBtVGVtcFRhZyAhPSBudWxsIHx8IG1UZW1wS2V5d29yZEZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlbXBGaWx0ZXJpbmdTdGF0dXMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlbXBQaWQgPSAtMTsKLSAgICAgICAgbVRlbXBUYWcgPSBudWxsOwotICAgICAgICBtVGVtcEtleXdvcmRGaWx0ZXJzID0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2V0VGVtcEZpbHRlcmluZ1N0YXR1cygpIHsKLSAgICAgICAgbVRlbXBGaWx0ZXJpbmdTdGF0dXMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGdldFRlbXBGaWx0ZXJTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBtVGVtcEZpbHRlcmluZ1N0YXR1czsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIFRhYmxlSXRlbSBmb3IgdGhlIGluZGV4LXRoIGl0ZW0gb2YgdGhlIGJ1ZmZlcgotICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGluZGV4IG9mIHRoZSB0YWJsZSBpbiB3aGljaCB0byBpbnNlcnQgdGhlIGl0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRhYmxlSXRlbShMb2dNZXNzYWdlIG1zZykgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgwLCBtc2cuZGF0YS50aW1lKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KDEsIG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IG1zZy5kYXRhLmxvZ0xldmVsLmdldFByaW9yaXR5TGV0dGVyKCkgfSkpOwotICAgICAgICBpdGVtLnNldFRleHQoMiwgbXNnLmRhdGEucGlkU3RyaW5nKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KDMsIG1zZy5kYXRhLnRhZyk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCg0LCBtc2cubXNnKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGJ1ZmZlciBpbmRleCBhcyBkYXRhCi0gICAgICAgIGl0ZW0uc2V0RGF0YShtc2cpOwotCi0gICAgICAgIGlmIChtc2cuZGF0YS5sb2dMZXZlbCA9PSBMb2dMZXZlbC5JTkZPKSB7Ci0gICAgICAgICAgICBpdGVtLnNldEZvcmVncm91bmQobUNvbG9ycy5pbmZvQ29sb3IpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy5kYXRhLmxvZ0xldmVsID09IExvZ0xldmVsLkRFQlVHKSB7Ci0gICAgICAgICAgICBpdGVtLnNldEZvcmVncm91bmQobUNvbG9ycy5kZWJ1Z0NvbG9yKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2cuZGF0YS5sb2dMZXZlbCA9PSBMb2dMZXZlbC5FUlJPUikgewotICAgICAgICAgICAgaXRlbS5zZXRGb3JlZ3JvdW5kKG1Db2xvcnMuZXJyb3JDb2xvcik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLmRhdGEubG9nTGV2ZWwgPT0gTG9nTGV2ZWwuV0FSTikgewotICAgICAgICAgICAgaXRlbS5zZXRGb3JlZ3JvdW5kKG1Db2xvcnMud2FybmluZ0NvbG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGl0ZW0uc2V0Rm9yZWdyb3VuZChtQ29sb3JzLnZlcmJvc2VDb2xvcik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZ2NhdC9Mb2dQYW5lbC5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9jb20vYW5kcm9pZC9kZG11aWxpYi9sb2djYXQvTG9nUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0ZTJmYS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliL2xvZ2NhdC9Mb2dQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5NdWx0aUxpbmVSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLkRkbVVpUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSUltYWdlTG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklUYWJsZUZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuU2VsZWN0aW9uRGVwZW5kZW50UGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuVGFibGVIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSVRhYmxlRm9jdXNMaXN0ZW5lci5JRm9jdXNlZFRhYmxlQWN0aXZhdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmFjdGlvbnMuSUNvbW1vbkFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBMb2dQYW5lbCBleHRlbmRzIFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfQlVGRkVSX0xFTkdUSCA9IDEwMDAwOwotCi0gICAgLyoqIG5vIGZpbHRlcmluZy4gT25seSBvbmUgdGFiIHdpdGggZXZlcnl0aGluZy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfTk9ORSA9IDA7Ci0gICAgLyoqIG1hbnVhbCBtb2RlIGZvciBmaWx0ZXIuIGFsbCBmaWx0ZXJzIGFyZSBtYW51YWxseSBjcmVhdGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9NQU5VQUwgPSAxOwotICAgIC8qKiBhdXRvbWF0aWMgbW9kZSBmb3IgZmlsdGVyIChwaWQgbW9kZSkuCi0gICAgICogQWxsIGZpbHRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfQVVUT19QSUQgPSAyOwotICAgIC8qKiBhdXRvbWF0aWMgbW9kZSBmb3IgZmlsdGVyICh0YWcgbW9kZSkuCi0gICAgICogQWxsIGZpbHRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfQVVUT19UQUcgPSAzOwotICAgIC8qKiBNYW51YWwgZmlsdGVyaW5nIG1vZGUgKyBuZXcgZmlsdGVyIGZvciBkZWJ1ZyBhcHAsIGlmIG5lZWRlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9ERUJVRyA9IDQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTU9ERV9NQU5VQUwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NT0RFX0FVVE8gPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRlNfVElNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGU19MRVZFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGU19QSUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRlNfVEFHOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZTX01FU1NBR0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHBhdHRlcm4gaXMgbWVhbnQgdG8gcGFyc2UgdGhlIGZpcnN0IGxpbmUgb2YgYSBsb2cgbWVzc2FnZSB3aXRoIHRoZSBvcHRpb24KLSAgICAgKiAnbG9nY2F0IC12IGxvbmcnLiBUaGUgZmlyc3QgbGluZSByZXByZXNlbnRzIHRoZSBkYXRlLCB0YWcsIHNldmVyaXR5LCBldGMuLiB3aGlsZSB0aGUKLSAgICAgKiBmb2xsb3dpbmcgbGluZXMgYXJlIHRoZSBtZXNzYWdlIChjYW4gYmUgc2V2ZXJhbCBsaW5lKS48YnI+Ci0gICAgICogVGhpcyBmaXJzdCBsaW5lIGxvb2tzIHNvbWV0aGluZyBsaWtlPGJyPgotICAgICAqIDxjb2RlPiJbIDAwLTAwIDAwOjAwOjAwLjAwMCAmbHQ7cGlkJmd0OzoweCZsdDs/Pz8mZ3Q7ICZsdDtzZXZlcml0eSZndDsvJmx0O3RhZyZndDtdIjwvY29kZT4KLSAgICAgKiA8YnI+Ci0gICAgICogTm90ZTogc2V2ZXJpdHkgaXMgb25lIG9mIFYsIEQsIEksIFcsIG9yIEVNPGJyPgotICAgICAqIE5vdGU6IHRoZSBmcmFjdGlvbiBvZiBzZWNvbmQgdmFsdWUgY2FuIGhhdmUgYW55IG51bWJlciBvZiBkaWdpdC4KLSAgICAgKiBOb3RlIHRoZSB0YWcgc2hvdWxkIGJlIHRyaW0gYXMgaXQgbWF5IGhhdmUgc3BhY2VzIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBzTG9nUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJeXFxbXFxzKFxcZFxcZC1cXGRcXGRcXHNcXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCspIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJcXHMrKFxcZCopOigweFswLTlhLWZBLUZdKylcXHMoW1ZESVdFXSkvKC4qKVxcXSQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBTdG9yYWdlIEZpbHRlciBtYW5hZ2VyLiBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZQotICAgICAqIHByb3ZpZGUgYSBjdXN0b20gd2F5IHRvIGFyY2hpdmUgYW4gcmVsb2FkIGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJTG9nRmlsdGVyU3RvcmFnZU1hbmFnZXIgewotCi0gICAgICAgIHB1YmxpYyBMb2dGaWx0ZXJbXSBnZXRGaWx0ZXJGcm9tU3RvcmUoKTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzYXZlRmlsdGVycyhMb2dGaWx0ZXJbXSBmaWx0ZXJzKTsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0RlZmF1bHRGaWx0ZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtUGFyZW50OwotICAgIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBtU3RvcmU7Ci0KLSAgICAvKiogdG9wIG9iamVjdCBpbiB0aGUgdmlldyAqLwotICAgIHByaXZhdGUgVGFiRm9sZGVyIG1Gb2xkZXJzOwotCi0gICAgcHJpdmF0ZSBMb2dDb2xvcnMgbUNvbG9yczsKLQotICAgIHByaXZhdGUgSUxvZ0ZpbHRlclN0b3JhZ2VNYW5hZ2VyIG1GaWx0ZXJTdG9yYWdlOwotCi0gICAgcHJpdmF0ZSBMb2dDYXRPdXB1dFJlY2VpdmVyIG1DdXJyZW50TG9nQ2F0OwotCi0gICAgLyoqCi0gICAgICogQ2lyY3VsYXIgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGxvZ2NhdCBvdXRwdXQuIFRoaXMgaXMgdW5maWx0ZXJlZC4KLSAgICAgKiBUaGUgdmFsaWQgY29udGVudCBnb2VzIGZyb20gPGNvZGU+bUJ1ZmZlclN0YXJ0PC9jb2RlPiB0bwotICAgICAqIDxjb2RlPm1CdWZmZXJFbmQgLSAxPC9jb2RlPi4gVGhlcmVmb3JlIGl0cyBudW1iZXIgb2YgaXRlbSBpcwotICAgICAqIDxjb2RlPm1CdWZmZXJFbmQgLSBtQnVmZmVyU3RhcnQ8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgTG9nTWVzc2FnZVtdIG1CdWZmZXIgPSBuZXcgTG9nTWVzc2FnZVtTVFJJTkdfQlVGRkVSX0xFTkdUSF07Ci0KLSAgICAvKiogUmVwcmVzZW50cyB0aGUgb2xkZXN0IG1lc3NhZ2UgaW4gdGhlIGJ1ZmZlciAqLwotICAgIHByaXZhdGUgaW50IG1CdWZmZXJTdGFydCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyB0aGUgbmV4dCB1c2FibGUgaXRlbSBpbiB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgbmV3IG1lc3NhZ2UuCi0gICAgICogVGhpcyBjYW4gYmUgZXF1YWwgdG8gbUJ1ZmZlclN0YXJ0LCBidXQgd2hlbiB1c2VkIG1CdWZmZXJTdGFydCB3aWxsIGJlCi0gICAgICogaW5jcmVtZW50ZWQgYXMgd2VsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQnVmZmVyRW5kID0gLTE7Ci0KLSAgICAvKiogRmlsdGVyIGxpc3QgKi8KLSAgICBwcml2YXRlIExvZ0ZpbHRlcltdIG1GaWx0ZXJzOwotCi0gICAgLyoqIERlZmF1bHQgZmlsdGVyICovCi0gICAgcHJpdmF0ZSBMb2dGaWx0ZXIgbURlZmF1bHRGaWx0ZXI7Ci0KLSAgICAvKiogQ3VycmVudCBmaWx0ZXIgYmVpbmcgZGlzcGxheWVkICovCi0gICAgcHJpdmF0ZSBMb2dGaWx0ZXIgbUN1cnJlbnRGaWx0ZXI7Ci0KLSAgICAvKiogRmlsdGVyaW5nIG1vZGUgKi8KLSAgICBwcml2YXRlIGludCBtRmlsdGVyTW9kZSA9IEZJTFRFUl9OT05FOwotCi0gICAgLyoqIERldmljZSBjdXJyZW50bHkgcnVubmluZyBsb2djYXQgKi8KLSAgICBwcml2YXRlIElEZXZpY2UgbUN1cnJlbnRMb2dnZWREZXZpY2UgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJQ29tbW9uQWN0aW9uIG1EZWxldGVGaWx0ZXJBY3Rpb247Ci0gICAgcHJpdmF0ZSBJQ29tbW9uQWN0aW9uIG1FZGl0RmlsdGVyQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBJQ29tbW9uQWN0aW9uW10gbUxvZ0xldmVsQWN0aW9uczsKLQotICAgIC8qKiBtZXNzYWdlIGRhdGEsIHNlcGFyYXRlZCBmcm9tIGNvbnRlbnQgZm9yIG11bHRpIGxpbmUgbWVzc2FnZXMgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvZ01lc3NhZ2VJbmZvIHsKLSAgICAgICAgcHVibGljIExvZ0xldmVsIGxvZ0xldmVsOwotICAgICAgICBwdWJsaWMgaW50IHBpZDsKLSAgICAgICAgcHVibGljIFN0cmluZyBwaWRTdHJpbmc7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGFnOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRpbWU7Ci0gICAgfQotCi0gICAgLyoqIHBvaW50ZXIgdG8gdGhlIGxhdGVzdCBMb2dNZXNzYWdlSW5mby4gdGhpcyBpcyB1c2VkIGZvciBtdWx0aSBsaW5lCi0gICAgICogbG9nIG1lc3NhZ2UsIHRvIHJldXNlIHRoZSBpbmZvIHJlZ2FyZGluZyBsZXZlbCwgcGlkLCBldGMuLi4KLSAgICAgKi8KLSAgICBwcml2YXRlIExvZ01lc3NhZ2VJbmZvIG1MYXN0TWVzc2FnZUluZm8gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nQXN5bmNSZWZyZXNoID0gZmFsc2U7Ci0KLSAgICAvKiogbG9hZGVyIGZvciB0aGUgaW1hZ2VzLiB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCB2YXJpZSBiZXR3ZWVuIHN0YW5kYWxvbmUKLSAgICAgKiBhcHAgYW5kIGVjbGlwc2UgcGx1Z2luIGFwcCBhbmQgZWNsaXBzZSBwbHVnaW4uICovCi0gICAgcHJpdmF0ZSBJSW1hZ2VMb2FkZXIgbUltYWdlTG9hZGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURlZmF1bHRMb2dTYXZlOwotCi0gICAgcHJpdmF0ZSBpbnQgbUNvbHVtbk1vZGUgPSBDT0xVTU5fTU9ERV9NQU5VQUw7Ci0gICAgcHJpdmF0ZSBGb250IG1EaXNwbGF5Rm9udDsKLQotICAgIHByaXZhdGUgSVRhYmxlRm9jdXNMaXN0ZW5lciBtR2xvYmFsTGlzdGVuZXI7Ci0KLSAgICAvKiogbWVzc2FnZSBkYXRhLCBzZXBhcmF0ZWQgZnJvbSBjb250ZW50IGZvciBtdWx0aSBsaW5lIG1lc3NhZ2VzICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2dNZXNzYWdlIHsKLSAgICAgICAgcHVibGljIExvZ01lc3NhZ2VJbmZvIGRhdGE7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgbXNnOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGEudGltZSArICI6ICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgZGF0YS5sb2dMZXZlbCArICIvIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBkYXRhLnRhZyArICIoIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBkYXRhLnBpZFN0cmluZyArICIpOiAiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIG1zZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIG9iamVjdHMgYWJsZSB0byByZWNlaXZlIHRoZSBvdXRwdXQgb2YgYSByZW1vdGUgc2hlbGwgY29tbWFuZCwKLSAgICAgKiBzcGVjaWZpY2FsbHkgYSBsb2djYXQgY29tbWFuZCBpbiB0aGlzIGNhc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIExvZ0NhdE91cHV0UmVjZWl2ZXIgZXh0ZW5kcyBNdWx0aUxpbmVSZWNlaXZlciB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgTG9nQ2F0T3VwdXRSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgICAgIHNldFRyaW1MaW5lKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3TGluZXMoU3RyaW5nW10gbGluZXMpIHsKLSAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NMb2dMaW5lcyhsaW5lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0NhbmNlbGxlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlciBjbGFzcyBmb3IgdGhlIG91dHB1dCBvZiBhICJwcyIgc2hlbGwgY29tbWFuZCBleGVjdXRlZCBvbiBhIGRldmljZS4KLSAgICAgKiBUaGlzIGNsYXNzIGxvb2tzIGZvciBhIHNwZWNpZmljIHBpZCB0byBmaW5kIHRoZSBwcm9jZXNzIG5hbWUgZnJvbSBpdC4KLSAgICAgKiBPbmNlIGZvdW5kLCB0aGUgbmFtZSBpcyB1c2VkIHRvIHVwZGF0ZSBhIGZpbHRlciBhbmQgYSB0YWIgb2JqZWN0Ci0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFBzT3V0cHV0UmVjZWl2ZXIgZXh0ZW5kcyBNdWx0aUxpbmVSZWNlaXZlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBMb2dGaWx0ZXIgbUZpbHRlcjsKLQotICAgICAgICBwcml2YXRlIFRhYkl0ZW0gbVRhYkl0ZW07Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBpZDsKLQotICAgICAgICAvKiogc2V0IHRvIHRydWUgd2hlbiB3ZSd2ZSBmb3VuZCB0aGUgcGlkIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZSA9IGZhbHNlOwotCi0gICAgICAgIFBzT3V0cHV0UmVjZWl2ZXIoaW50IHBpZCwgTG9nRmlsdGVyIGZpbHRlciwgVGFiSXRlbSB0YWJJdGVtKSB7Ci0gICAgICAgICAgICBtUGlkID0gcGlkOwotICAgICAgICAgICAgbUZpbHRlciA9IGZpbHRlcjsKLSAgICAgICAgICAgIG1UYWJJdGVtID0gdGFiSXRlbTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Eb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiVVNFUiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcGlkLgotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZignICcpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIG5leHQgbm9uIGJsYW5rIGNoYXIKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdChpbmRleCkgPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIHBpZC4KLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgZW5kLgotICAgICAgICAgICAgICAgIGludCBpbmRleDIgPSBsaW5lLmluZGV4T2YoJyAnLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGlkU3RyID0gbGluZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4Mik7Ci0gICAgICAgICAgICAgICAgaW50IHBpZCA9IEludGVnZXIucGFyc2VJbnQocGlkU3RyKTsKLSAgICAgICAgICAgICAgICBpZiAocGlkICE9IG1QaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9jZXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBsaW5lLmxhc3RJbmRleE9mKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbGluZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICBtRmlsdGVyLnNldE5hbWUobmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB0YWIKLSAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBkID0gbUZvbGRlcnMuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBkLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJJdGVtLnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHMuCi0gICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGxvZyB2aWV3IHdpdGggc29tZSBkZWZhdWx0IHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gaW1hZ2VMb2FkZXIgdGhlIGltYWdlIGxvYWRlci4KLSAgICAgKiBAcGFyYW0gY29sb3JzIFRoZSBkaXNwbGF5IGNvbG9yIG9iamVjdAotICAgICAqIEBwYXJhbSBmaWx0ZXJTdG9yYWdlIHRoZSBzdG9yYWdlIGZvciB1c2VyIGRlZmluZWQgZmlsdGVycy4KLSAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZmlsdGVyaW5nIG1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9nUGFuZWwoSUltYWdlTG9hZGVyIGltYWdlTG9hZGVyLCBMb2dDb2xvcnMgY29sb3JzLAotICAgICAgICAgICAgSUxvZ0ZpbHRlclN0b3JhZ2VNYW5hZ2VyIGZpbHRlclN0b3JhZ2UsIGludCBtb2RlKSB7Ci0gICAgICAgIG1JbWFnZUxvYWRlciA9IGltYWdlTG9hZGVyOwotICAgICAgICBtQ29sb3JzID0gY29sb3JzOwotICAgICAgICBtRmlsdGVyTW9kZSA9IG1vZGU7Ci0gICAgICAgIG1GaWx0ZXJTdG9yYWdlID0gZmlsdGVyU3RvcmFnZTsKLSAgICAgICAgbVN0b3JlID0gRGRtVWlQcmVmZXJlbmNlcy5nZXRTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbnMoSUNvbW1vbkFjdGlvbiBkZWxldGVBY3Rpb24sIElDb21tb25BY3Rpb24gZWRpdEFjdGlvbiwKLSAgICAgICAgICAgIElDb21tb25BY3Rpb25bXSBsb2dMZXZlbEFjdGlvbnMpIHsKLSAgICAgICAgbURlbGV0ZUZpbHRlckFjdGlvbiA9IGRlbGV0ZUFjdGlvbjsKLSAgICAgICAgbUVkaXRGaWx0ZXJBY3Rpb24gPSBlZGl0QWN0aW9uOwotICAgICAgICBtTG9nTGV2ZWxBY3Rpb25zID0gbG9nTGV2ZWxBY3Rpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbHVtbiBtb2RlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRVSQotICAgICAqIEBwYXJhbSBtb2RlIHRoZSBjb2x1bW4gbW9kZS4gVmFsaWQgdmFsdWVzIGFyZSBDT0xVTU5fTU9EX01BTlVBTCBhbmQKLSAgICAgKiAgQ09MVU1OX01PREVfQVVUTwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbk1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgbUNvbHVtbk1vZGUgID0gbW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkaXNwbGF5IGZvbnQuCi0gICAgICogQHBhcmFtIGZvbnQgVGhlIGRpc3BsYXkgZm9udC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICBtRGlzcGxheUZvbnQgPSBmb250OwotCi0gICAgICAgIGlmIChtRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExvZ0ZpbHRlciBmIDogbUZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZSA9IGYuZ2V0VGFibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXRGb250KGZvbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGVmYXVsdEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUYWJsZSB0YWJsZSA9IG1EZWZhdWx0RmlsdGVyLmdldFRhYmxlKCk7Ci0gICAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYmxlLnNldEZvbnQoZm9udCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgZGV2aWNlIGlzIHNlbGVjdGVkLiBUaGUgbmV3IGRldmljZSBjYW4gYmUgYWNjZXNzZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0Q3VycmVudERldmljZSgpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VTZWxlY3RlZCgpIHsKLSAgICAgICAgc3RhcnRMb2dDYXQoZ2V0Q3VycmVudERldmljZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcgY2xpZW50IGlzIHNlbGVjdGVkLiBUaGUgbmV3IGNsaWVudCBjYW4gYmUgYWNjZXNzZWQKLSAgICAgKiB3aXRoIHtAbGluayAjZ2V0Q3VycmVudENsaWVudCgpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGllbnRTZWxlY3RlZCgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIHNvbWUgaW5mb3JtYXRpb24uICBUaGlzIGlzCi0gICAgICogY2FsbGVkIG9uY2UsIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZywgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtUGFyZW50ID0gcGFyZW50OwotCi0gICAgICAgIENvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0b3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRhYiBmb2xkZXIKLSAgICAgICAgbUZvbGRlcnMgPSBuZXcgVGFiRm9sZGVyKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBtRm9sZGVycy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgbUZvbGRlcnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEZpbHRlci5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRGaWx0ZXIgPSBnZXRDdXJyZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRGaWx0ZXIuc2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5zKG1DdXJyZW50RmlsdGVyLmdldFRhYmxlKCkpOwotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEZpbHRlci5nZXRUZW1wRmlsdGVyU3RhdHVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcihtQ3VycmVudEZpbHRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQobUN1cnJlbnRGaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIENvbXBvc2l0ZSBib3R0b20gPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBib3R0b20uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChib3R0b20sIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiRmlsdGVyOiIpOwotCi0gICAgICAgIGZpbmFsIFRleHQgZmlsdGVyVGV4dCA9IG5ldyBUZXh0KGJvdHRvbSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBmaWx0ZXJUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBmaWx0ZXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcmluZ1dpdGgoZmlsdGVyVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvKgotICAgICAgICBCdXR0b24gYWRkRmlsdGVyQnRuID0gbmV3IEJ1dHRvbihib3R0b20sIFNXVC5OT05FKTsKLSAgICAgICAgYWRkRmlsdGVyQnRuLnNldEltYWdlKG1JbWFnZUxvYWRlci5sb2FkSW1hZ2UoImFkZC5wbmciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYWRkRmlsdGVyQnRuLmdldERpc3BsYXkoKSkpOwotICAgICAgICAqLwotCi0gICAgICAgIC8vIGdldCB0aGUgZmlsdGVycwotICAgICAgICBjcmVhdGVGaWx0ZXJzKCk7Ci0KLSAgICAgICAgLy8gZm9yIGVhY2ggZmlsdGVyLCBjcmVhdGUgYSB0YWIuCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWF0ZVRhYihtRGVmYXVsdEZpbHRlciwgaW5kZXgrKywgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBtRmlsdGVycykgewotICAgICAgICAgICAgICAgIGNyZWF0ZVRhYihmLCBpbmRleCsrLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RDcmVhdGlvbigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZvY3VzIHRvIHRoZSBwcm9wZXIgb2JqZWN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtRm9sZGVycy5zZXRGb2N1cygpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGEgbmV3IGxvZ2NhdCBhbmQgc2V0IG1DdXJyZW50TG9nQ2F0IGFzIHRoZSBjdXJyZW50IHJlY2VpdmVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB0byBjb25uZWN0IGxvZ2NhdCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydExvZ0NhdChmaW5hbCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG1DdXJyZW50TG9nZ2VkRGV2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbG9nY2F0IGFscmVhZHkgcnVubmluZwotICAgICAgICBpZiAobUN1cnJlbnRMb2dnZWREZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RvcExvZ0NhdChmYWxzZSk7Ci0gICAgICAgICAgICBtQ3VycmVudExvZ2dlZERldmljZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXNldFVJKGZhbHNlKTsKLQotICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvdXRwdXQgcmVjZWl2ZXIKLSAgICAgICAgICAgIG1DdXJyZW50TG9nQ2F0ID0gbmV3IExvZ0NhdE91cHV0UmVjZWl2ZXIoKTsKLQotICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGxvZ2NhdCBpbiBhIGRpZmZlcmVudCB0aHJlYWQKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoIkxvZ2NhdCIpICB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRldmljZS5pc09ubGluZSgpID09IGZhbHNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRMb2dDYXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nQ2F0LmlzQ2FuY2VsbGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDIwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudExvZ0NhdCA9PSBudWxsIHx8IG1DdXJyZW50TG9nQ2F0LmlzQ2FuY2VsbGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2djYXQgd2FzIHN0b3BwZWQvY2FuY2VsbGVkIGJlZm9yZSB0aGUgZGV2aWNlIGJlY2FtZSByZWFkeS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudExvZ2dlZERldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLXYgbG9uZyIsIG1DdXJyZW50TG9nQ2F0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkxvZ2NhdCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgY29tbWFuZCBpcyB0ZXJtaW5hdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRMb2dDYXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRMb2dnZWREZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFN0b3AgdGhlIGN1cnJlbnQgbG9nY2F0ICovCi0gICAgcHVibGljIHZvaWQgc3RvcExvZ0NhdChib29sZWFuIGluVWlUaHJlYWQpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50TG9nQ2F0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJyZW50TG9nQ2F0LmlzQ2FuY2VsbGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGhyZWFkIGZpbmlzaGVzLCBubyBvbmUgd2lsbCByZWZlcmVuY2UgdGhhdCBvYmplY3QKLSAgICAgICAgICAgIC8vIGFuZCBpdCdsbCBiZSBkZXN0cm95ZWQKLSAgICAgICAgICAgIG1DdXJyZW50TG9nQ2F0ID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGNvbnRlbnQgYnVmZmVyCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBTVFJJTkdfQlVGRkVSX0xFTkdUSDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcltpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBhIGNpcmN1bGFyIGJ1ZmZlciwgaXQncyBoYXJkIHRvIGtub3cgaWYKLSAgICAgICAgICAgIC8vIHRoZSBhcnJheSBpcyBlbXB0eSB3aXRoIGJvdGggc3RhcnQvZW5kIGF0IDAgb3IgaWYgaXQncyBmdWxsCi0gICAgICAgICAgICAvLyB3aXRoIGJvdGggc3RhcnQvZW5kIGF0IDAgYXMgd2VsbC4gU28gdG8gbWVhbiBlbXB0eSwgd2UgdXNlIC0xCi0gICAgICAgICAgICBtQnVmZmVyU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIG1CdWZmZXJFbmQgPSAtMTsKLQotICAgICAgICAgICAgcmVzZXRGaWx0ZXJzKCk7Ci0gICAgICAgICAgICByZXNldFVJKGluVWlUaHJlYWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBGaWx0ZXIuIFRoaXMgbWV0aG9kcyBkaXNwbGF5cyB0aGUgVUkgdG8gY3JlYXRlIHRoZSBmaWx0ZXIKLSAgICAgKiBhbmQgc2V0IHVwIGl0cyBwYXJhbWV0ZXJzLjxicj4KLSAgICAgKiA8Yj5NVVNUPC9iPiBiZSBjYWxsZWQgZnJvbSB0aGUgdWkgdGhyZWFkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsdGVyKCkgewotICAgICAgICBFZGl0RmlsdGVyRGlhbG9nIGRsZyA9IG5ldyBFZGl0RmlsdGVyRGlhbG9nKG1JbWFnZUxvYWRlciwKLSAgICAgICAgICAgICAgICBtRm9sZGVycy5nZXRTaGVsbCgpKTsKLSAgICAgICAgaWYgKGRsZy5vcGVuKCkpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUJ1ZmZlcikgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV3IGZpbHRlciBpbiB0aGUgYXJyYXkKLSAgICAgICAgICAgICAgICBMb2dGaWx0ZXIgZmlsdGVyID0gZGxnLmdldEZpbHRlcigpOwotICAgICAgICAgICAgICAgIGFkZEZpbHRlclRvQXJyYXkoZmlsdGVyKTsKLQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1GaWx0ZXJzLmxlbmd0aCAtIDE7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKExvZ0ZpbHRlciBmIDogbUZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLnVpUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVmYXVsdEZpbHRlciAhPSBudWxsICYmIG1EZWZhdWx0RmlsdGVyLnVpUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggZmlsdGVyLCBjcmVhdGUgYSB0YWIuCi0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBtRmlsdGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYihmLCBpKyssIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVmYXVsdEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUYWIobURlZmF1bHRGaWx0ZXIsIGkrKywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB1aSBmb3IgdGhlIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGFiKGZpbHRlciwgaW5kZXgsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBkZWZhdWx0IGFzIGl0IHNob3VsZG4ndCBjb250YWluIHRoZSBjb250ZW50IG9mCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbmV3IGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXREZWZhdWx0RmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIG5ldyBmaWx0ZXIKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEZpbHRlci5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUZvbGRlcnMuc2V0U2VsZWN0aW9uKGluZGV4KTsKLSAgICAgICAgICAgICAgICBmaWx0ZXIuc2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEZpbHRlciA9IGZpbHRlcjsKLQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQoZmlsdGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgd2UgdXBkYXRlIHRoZSBmaWx0ZXJpbmcgbW9kZSBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBpZiAobUZpbHRlck1vZGUgPT0gRklMVEVSX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbHRlck1vZGUgPSBGSUxURVJfTUFOVUFMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1GaWx0ZXJTdG9yYWdlLnNhdmVGaWx0ZXJzKG1GaWx0ZXJzKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdHMgdGhlIGN1cnJlbnQgZmlsdGVyLiBUaGUgbWV0aG9kIGRpc3BsYXlzIHRoZSBVSSB0byBlZGl0IHRoZSBmaWx0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWRpdEZpbHRlcigpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50RmlsdGVyICE9IG51bGwgJiYgbUN1cnJlbnRGaWx0ZXIgIT0gbURlZmF1bHRGaWx0ZXIpIHsKLSAgICAgICAgICAgIEVkaXRGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEVkaXRGaWx0ZXJEaWFsb2cobUltYWdlTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICBtRm9sZGVycy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEZpbHRlcik7Ci0gICAgICAgICAgICBpZiAoZGxnLm9wZW4oKSkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmaWx0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgdXBkYXRlIGl0cyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGluaXRGaWx0ZXIobUN1cnJlbnRGaWx0ZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgY29udGVudCBvZiB0aGUgIm90aGVyIiBmaWx0ZXIgYXMgd2VsbC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXREZWZhdWx0RmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtRmlsdGVyU3RvcmFnZS5zYXZlRmlsdGVycyhtRmlsdGVycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgY3VycmVudCBmaWx0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlRmlsdGVyKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1CdWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudEZpbHRlciAhPSBudWxsICYmIG1DdXJyZW50RmlsdGVyICE9IG1EZWZhdWx0RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmaWx0ZXIgZnJvbSB0aGUgbGlzdAotICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlckZyb21BcnJheShtQ3VycmVudEZpbHRlcik7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRGaWx0ZXIuZGlzcG9zZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBuZXcgZmlsdGVyCi0gICAgICAgICAgICAgICAgbUZvbGRlcnMuc2V0U2VsZWN0aW9uKDApOwotICAgICAgICAgICAgICAgIGlmIChtRmlsdGVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RmlsdGVyID0gbUZpbHRlcnNbMF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRGaWx0ZXIgPSBtRGVmYXVsdEZpbHRlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkKG1DdXJyZW50RmlsdGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgIm90aGVyIiBmaWx0ZXIgdG8gaW5jbHVkZSB3aGF0IHdhcyBmaWx0ZXJlZCBvdXQKLSAgICAgICAgICAgICAgICAvLyBieSB0aGUgZGVsZXRlZCBmaWx0ZXIuCi0gICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5pdERlZmF1bHRGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtRmlsdGVyU3RvcmFnZS5zYXZlRmlsdGVycyhtRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzYXZlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gYSB0ZXh0IGZpbGUuCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgc2F2aW5nIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzYXZlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1CdWZmZXIpIHsKLSAgICAgICAgICAgIEZpbGVEaWFsb2cgZGxnID0gbmV3IEZpbGVEaWFsb2cobVBhcmVudC5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWU7Ci0KLSAgICAgICAgICAgIGRsZy5zZXRUZXh0KCJTYXZlIGxvZy4uLiIpOwotICAgICAgICAgICAgZGxnLnNldEZpbGVOYW1lKCJsb2cudHh0Iik7Ci0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhdGggPSBtRGVmYXVsdExvZ1NhdmU7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHRQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGxnLnNldEZpbHRlclBhdGgoZGVmYXVsdFBhdGgpOwotICAgICAgICAgICAgZGxnLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgIlRleHQgRmlsZXMgKCoudHh0KSIKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZGxnLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAiKi50eHQiCi0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgZmlsZU5hbWUgPSBkbGcub3BlbigpOwotICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdExvZ1NhdmUgPSBkbGcuZ2V0RmlsdGVyUGF0aCgpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHRhYmxlIGFuZCBpdHMgc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgVGFibGUgY3VycmVudFRhYmxlID0gbUN1cnJlbnRGaWx0ZXIuZ2V0VGFibGUoKTsKLQotICAgICAgICAgICAgICAgIGludFtdIHNlbGVjdGlvbiA9IGN1cnJlbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNvcnQgdGhlIGl0ZW1zIHRvIGJlIHN1cmUuCi0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoc2VsZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgIC8vIGxvb3Agb24gdGhlIHNlbGVjdGlvbiBhbmQgb3V0cHV0IHRoZSBmaWxlLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgOiBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY3VycmVudFRhYmxlLmdldEl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlIG1zZyA9IChMb2dNZXNzYWdlKWl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBtc2cudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtcHR5IHRoZSBjdXJyZW50IGNpcmN1bGFyIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQnVmZmVyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBTVFJJTkdfQlVGRkVSX0xFTkdUSDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcltpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdWZmZXJTdGFydCA9IC0xOwotICAgICAgICAgICAgbUJ1ZmZlckVuZCA9IC0xOwotCi0gICAgICAgICAgICAvLyBub3cgd2UgY2xlYXIgdGhlIGV4aXN0aW5nIGZpbHRlcnMKLSAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGZpbHRlciA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFuZCB0aGUgZGVmYXVsdCBvbmUKLSAgICAgICAgICAgIGlmIChtRGVmYXVsdEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gb2YgdGhlIGN1cnJlbnQgZmlsdGVyIGFzIG11bHRpbGluZSB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaXBib2FyZCBUaGUgY2xpcGJvYXJkIHRvIHBsYWNlIHRoZSBjb3BpZWQgY29udGVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5KENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHRhYmxlIGFuZCBpdHMgc2VsZWN0aW9uCi0gICAgICAgIFRhYmxlIGN1cnJlbnRUYWJsZSA9IG1DdXJyZW50RmlsdGVyLmdldFRhYmxlKCk7Ci0KLSAgICAgICAgY29weVRhYmxlKGNsaXBib2FyZCwgY3VycmVudFRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGFsbCBsaW5lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7Ci0gICAgICAgIFRhYmxlIGN1cnJlbnRUYWJsZSA9IG1DdXJyZW50RmlsdGVyLmdldFRhYmxlKCk7Ci0gICAgICAgIGN1cnJlbnRUYWJsZS5zZWxlY3RBbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgVGFibGVGb2N1c0xpc3RlbmVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBvbmUgb2YgdGhlIHRhYmxlcwotICAgICAqIGdldHMgb3IgbG9zZXMgZm9jdXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZUZvY3VzTGlzdGVuZXIoSVRhYmxlRm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIGdsb2JhbCBsaXN0ZW5lciwgdG8gbWFrZSBzdXJlIHRhYmxlIGNyZWF0ZWQgYWZ0ZXIKLSAgICAgICAgLy8gdGhpcyBjYWxsIHdpbGwgc3RpbGwgYmUgc2V0dXAuCi0gICAgICAgIG1HbG9iYWxMaXN0ZW5lciA9IGxpc3RlbmVyOwotCi0gICAgICAgIC8vIG5vdyB3ZSBzZXR1cCB0aGUgZXhpc3RpbmcgZmlsdGVycwotICAgICAgICBmb3IgKExvZ0ZpbHRlciBmaWx0ZXIgOiBtRmlsdGVycykgewotICAgICAgICAgICAgVGFibGUgdGFibGUgPSBmaWx0ZXIuZ2V0VGFibGUoKTsKLQotICAgICAgICAgICAgYWRkVGFibGVUb0ZvY3VzTGlzdGVuZXIodGFibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIHRoZSBkZWZhdWx0IG9uZQotICAgICAgICBpZiAobURlZmF1bHRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVGFibGVUb0ZvY3VzTGlzdGVuZXIobURlZmF1bHRGaWx0ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIGEgVGFibGUgb2JqZWN0IHRvIG5vdGlmeSB0aGUgZ2xvYmFsIFRhYmxlIEZvY3VzIGxpc3RlbmVyIHdoZW4gaXQKLSAgICAgKiBnZXRzIG9yIGxvc2VzIHRoZSBmb2N1cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgVGFibGUgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcihmaW5hbCBUYWJsZSB0YWJsZSkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIGFjdGl2YXRvciBmb3IgdGhpcyB0YWJsZQotICAgICAgICBmaW5hbCBJRm9jdXNlZFRhYmxlQWN0aXZhdG9yIGFjdGl2YXRvciA9IG5ldyBJRm9jdXNlZFRhYmxlQWN0aXZhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29weShDbGlwYm9hcmQgY2xpcGJvYXJkKSB7Ci0gICAgICAgICAgICAgICAgY29weVRhYmxlKGNsaXBib2FyZCwgdGFibGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICAgICAgdGFibGUuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBmb2N1cyBsaXN0ZW5lciBvbiB0aGUgdGFibGUgdG8gbm90aWZ5IHRoZSBnbG9iYWwgbGlzdGVuZXIKLSAgICAgICAgdGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1HbG9iYWxMaXN0ZW5lci5mb2N1c0dhaW5lZChhY3RpdmF0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUdsb2JhbExpc3RlbmVyLmZvY3VzTG9zdChhY3RpdmF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIGEgVGFibGUgaW50byB0aGUgcHJvdmlkZWQgQ2xpcGJvYXJkLCBhcwotICAgICAqIG11bHRpLWxpbmUgdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGlwYm9hcmQgVGhlIGNsaXBib2FyZCB0byBwbGFjZSB0aGUgY29waWVkIGNvbnRlbnQuCi0gICAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBjb3B5IGZyb20uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5VGFibGUoQ2xpcGJvYXJkIGNsaXBib2FyZCwgVGFibGUgdGFibGUpIHsKLSAgICAgICAgaW50W10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGUgaXRlbXMgdG8gYmUgc3VyZS4KLSAgICAgICAgQXJyYXlzLnNvcnQoc2VsZWN0aW9uKTsKLQotICAgICAgICAvLyBhbGwgbGluZXMgbXVzdCBiZSBjb25jYXRlbmF0ZWQuCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIC8vIGxvb3Agb24gdGhlIHNlbGVjdGlvbiBhbmQgb3V0cHV0IHRoZSBmaWxlLgotICAgICAgICBmb3IgKGludCBpIDogc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBMb2dNZXNzYWdlIG1zZyA9IChMb2dNZXNzYWdlKWl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBtc2cudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBhZGQgdGhhdCB0byB0aGUgY2xpcGJvYXJkCi0gICAgICAgIGNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgc2IudG9TdHJpbmcoKQotICAgICAgICB9LCBuZXcgVHJhbnNmZXJbXSB7Ci0gICAgICAgICAgICBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2cgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGZpbHRlciwgYnV0IGRvZXMgbm90IHNhdmUgaXQuCi0gICAgICogQHBhcmFtIGkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RmlsdGVyTG9nTGV2ZWwoaW50IGkpIHsKLSAgICAgICAgTG9nRmlsdGVyIGZpbHRlciA9IGdldEN1cnJlbnRGaWx0ZXIoKTsKLQotICAgICAgICBmaWx0ZXIuc2V0TG9nTGV2ZWwoaSk7Ci0KLSAgICAgICAgaW5pdEZpbHRlcihmaWx0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdGFiIGluIHRoZSBmb2xkZXJUYWIgaXRlbS4gTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgdWkKLSAgICAgKiAgICAgIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWIuCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgdGFiLiBpZiAtMSwgdGhlIHRhYiB3aWxsIGJlIGFkZGVkIGF0IHRoZQotICAgICAqICAgICAgICAgIGVuZC4KLSAgICAgKiBAcGFyYW0gZmlsbFRhYmxlIElmIHRydWUgdGhlIHRhYmxlIGlzIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YKLSAgICAgKiAgICAgICAgICB0aGUgYnVmZmVyLgotICAgICAqIEByZXR1cm4gVGhlIFRhYkl0ZW0gb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWJJdGVtIGNyZWF0ZVRhYihMb2dGaWx0ZXIgZmlsdGVyLCBpbnQgaW5kZXgsIGJvb2xlYW4gZmlsbFRhYmxlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUJ1ZmZlcikgewotICAgICAgICAgICAgVGFiSXRlbSBpdGVtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgVGFiSXRlbShtRm9sZGVycywgU1dULk5PTkUsIGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBUYWJJdGVtKG1Gb2xkZXJzLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoZmlsdGVyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgY29udHJvbCAodGhlIHBhcmVudCBpcyB0aGUgVGFiRm9sZGVyIGl0ZW0sIGFsd2F5cykKLSAgICAgICAgICAgIENvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKG1Gb2xkZXJzLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBpdGVtLnNldENvbnRyb2wodG9wKTsKLQotICAgICAgICAgICAgdG9wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB1aSwgZmlyc3QgdGhlIHRhYmxlCi0gICAgICAgICAgICBmaW5hbCBUYWJsZSB0ID0gbmV3IFRhYmxlKHRvcCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICAgICAgaWYgKG1EaXNwbGF5Rm9udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdC5zZXRGb250KG1EaXNwbGF5Rm9udCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdpdmUgdGhlIHVpIG9iamVjdHMgdG8gdGhlIGZpbHRlcnMuCi0gICAgICAgICAgICBmaWx0ZXIuc2V0V2lkZ2V0cyhpdGVtLCB0KTsKLQotICAgICAgICAgICAgdC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgdC5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAobUdsb2JhbExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRUYWJsZVRvRm9jdXNMaXN0ZW5lcih0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgY29udHJvbGxpc3RlbmVyIHRoYXQgd2lsbCBoYW5kbGUgdGhlIHJlc2l6aW5nIG9mIGFsbCB0aGUKLSAgICAgICAgICAgIC8vIGNvbHVtbnMgKGV4Y2VwdCB0aGUgbGFzdCkgYW5kIG9mIHRoZSB0YWJsZSBpdHNlbGYuCi0gICAgICAgICAgICBDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1Db2x1bW5Nb2RlID09IENPTFVNTl9NT0RFX0FVVE8pIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gdC5nZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2l6ZSBvZiBhbGwgYnV0IHRoZSBsYXN0IGNvbHVtbgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvdGFsID0gdC5nZXRDb2x1bW4oMCkuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHQuZ2V0Q29sdW1uKDEpLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0LmdldENvbHVtbigyKS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdC5nZXRDb2x1bW4oMykuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIud2lkdGggPiB0b3RhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q29sdW1uKDQpLnNldFdpZHRoKHIud2lkdGgtdG90YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIHQuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhlbiBpdHMgY29sdW1uCi0gICAgICAgICAgICBUYWJsZUNvbHVtbiBjb2wgPSBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbih0LCAiVGltZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICAgICAiMDAtMDAgMDA6MDA6MDAiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFBSRUZTX1RJTUUsIG1TdG9yZSk7Ci0gICAgICAgICAgICBpZiAobUNvbHVtbk1vZGUgPT0gQ09MVU1OX01PREVfQVVUTykgewotICAgICAgICAgICAgICAgIGNvbC5hZGRDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb2wgPSBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbih0LCAiIiwgU1dULkNFTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgIkQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFBSRUZTX0xFVkVMLCBtU3RvcmUpOwotICAgICAgICAgICAgaWYgKG1Db2x1bW5Nb2RlID09IENPTFVNTl9NT0RFX0FVVE8pIHsKLSAgICAgICAgICAgICAgICBjb2wuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odCwgInBpZCIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICAgICAiOTk5OSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgUFJFRlNfUElELCBtU3RvcmUpOwotICAgICAgICAgICAgaWYgKG1Db2x1bW5Nb2RlID09IENPTFVNTl9NT0RFX0FVVE8pIHsKLSAgICAgICAgICAgICAgICBjb2wuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29sID0gVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4odCwgInRhZyIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICAgICAiYWJjZGVmZ2giLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBQUkVGU19UQUcsIG1TdG9yZSk7Ci0gICAgICAgICAgICBpZiAobUNvbHVtbk1vZGUgPT0gQ09MVU1OX01PREVfQVVUTykgewotICAgICAgICAgICAgICAgIGNvbC5hZGRDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb2wgPSBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbih0LCAiTWVzc2FnZSIsIFNXVC5MRUZULAotICAgICAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgUFJFRlNfTUVTU0FHRSwgbVN0b3JlKTsKLSAgICAgICAgICAgIGlmIChtQ29sdW1uTW9kZSA9PSBDT0xVTU5fTU9ERV9BVVRPKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBsaXN0ZW5pbmcgb24gcmVzaXplIGZvciB0aGUgbGFzdCBjb2x1bW4sIHdlIG1ha2UKLSAgICAgICAgICAgICAgICAvLyBpdCBub24gcmVzaXphYmxlLgotICAgICAgICAgICAgICAgIGNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlsbFRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgaW5pdEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb2x1bW5zKFRhYmxlIHRhYmxlKSB7Ci0gICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sOwotCi0gICAgICAgICAgICBjb2wgPSB0YWJsZS5nZXRDb2x1bW4oaW5kZXgrKyk7Ci0gICAgICAgICAgICBjb2wuc2V0V2lkdGgobVN0b3JlLmdldEludChQUkVGU19USU1FKSk7Ci0KLSAgICAgICAgICAgIGNvbCA9IHRhYmxlLmdldENvbHVtbihpbmRleCsrKTsKLSAgICAgICAgICAgIGNvbC5zZXRXaWR0aChtU3RvcmUuZ2V0SW50KFBSRUZTX0xFVkVMKSk7Ci0KLSAgICAgICAgICAgIGNvbCA9IHRhYmxlLmdldENvbHVtbihpbmRleCsrKTsKLSAgICAgICAgICAgIGNvbC5zZXRXaWR0aChtU3RvcmUuZ2V0SW50KFBSRUZTX1BJRCkpOwotCi0gICAgICAgICAgICBjb2wgPSB0YWJsZS5nZXRDb2x1bW4oaW5kZXgrKyk7Ci0gICAgICAgICAgICBjb2wuc2V0V2lkdGgobVN0b3JlLmdldEludChQUkVGU19UQUcpKTsKLQotICAgICAgICAgICAgY29sID0gdGFibGUuZ2V0Q29sdW1uKGluZGV4KyspOwotICAgICAgICAgICAgY29sLnNldFdpZHRoKG1TdG9yZS5nZXRJbnQoUFJFRlNfTUVTU0FHRSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRVSShib29sZWFuIGluVWlUaHJlYWQpIHsKLSAgICAgICAgaWYgKG1GaWx0ZXJNb2RlID09IEZJTFRFUl9BVVRPX1BJRCB8fCBtRmlsdGVyTW9kZSA9PSBGSUxURVJfQVVUT19UQUcpIHsKLSAgICAgICAgICAgIGlmIChpblVpVGhyZWFkKSB7Ci0gICAgICAgICAgICAgICAgbUZvbGRlcnMuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIG1QYXJlbnQucGFjayh0cnVlKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVDb250cm9sKG1QYXJlbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IGQgPSBtRm9sZGVycy5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBydW4gc3luYyBhcyB3ZSBuZWVkIHRvIHVwZGF0ZSByaWdodCBub3cuCi0gICAgICAgICAgICAgICAgZC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2xkZXJzLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQucGFjayh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRyb2wobVBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAvLyB0aGUgdWkgaXMgc3RhdGljIHdlIGp1c3QgZW1wdHkgaXQuCi0gICAgICAgICAgICBpZiAobUZvbGRlcnMuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluVWlUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1wdHlUYWJsZXMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGQgPSBtRm9sZGVycy5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHN5bmMgYXMgd2UgbmVlZCB0byB1cGRhdGUgcmlnaHQgbm93LgotICAgICAgICAgICAgICAgICAgICBkLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZvbGRlcnMuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5VGFibGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIG5ldyBMb2cgbGluZXMgY29taW5nIGZyb20ge0BsaW5rIExvZ0NhdE91cHV0UmVjZWl2ZXJ9LgotICAgICAqIEBwYXJhbSBsaW5lcyB0aGUgbmV3IGxpbmVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xvZ0xpbmVzKFN0cmluZ1tdIGxpbmVzKSB7Ci0gICAgICAgIC8vIFdBUk5JTkc6IHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG1vcmUgbGluZSB0aGFuCi0gICAgICAgIC8vIHRoZSBidWZmZXIgaG9sZHMuCi0KLSAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IFNUUklOR19CVUZGRVJfTEVOR1RIKSB7Ci0gICAgICAgICAgICBMb2cuZSgiTG9nQ2F0IiwgIlJlY2VpdmluZyBtb3JlIGxpbmVzIHRoYW4gU1RSSU5HX0JVRkZFUl9MRU5HVEgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlIHRoZSBsaW5lcyBhbmQgY3JlYXRlIExvZ01lc3NhZ2UgdGhhdCBhcmUgc3RvcmVkIGluIGEgdGVtcG9yYXJ5IGxpc3QKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PExvZ01lc3NhZ2U+IG5ld01lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxMb2dNZXNzYWdlPigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVtcHR5IGxpbmVzLgotICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaGVhZGVyIGxpbmVzLgotICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzTG9nUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBoZWFkZXIgbGluZSwgcGFyc2UgdGhlIGhlYWRlciBhbmQga2VlcCBpdCBhcm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvID0gbmV3IExvZ01lc3NhZ2VJbmZvKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0TWVzc2FnZUluZm8udGltZSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvLnBpZFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvLnBpZCA9IEludGVnZXIudmFsdWVPZihtTGFzdE1lc3NhZ2VJbmZvLnBpZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvLmxvZ0xldmVsID0gTG9nTGV2ZWwuZ2V0QnlMZXR0ZXJTdHJpbmcobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvLnRhZyA9IG1hdGNoZXIuZ3JvdXAoNSkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBoZWFkZXIgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMb2dNZXNzYWdlIGFuZCBwcm9jZXNzIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSBtYyA9IG5ldyBMb2dNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdE1lc3NhZ2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgd2Fzbid0IHByZWNlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSBoZWFkZXIgbGluZTsgbWFrZSBzb21ldGhpbmcgdXAgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHVzZXJzIG9mIG1jLmRhdGEgZG9uJ3QgTlBFLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0TWVzc2FnZUluZm8gPSBuZXcgTG9nTWVzc2FnZUluZm8oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2VJbmZvLnRpbWUgPSAiPz8tPz8gPz86Pz86Pz8uPz8/IjsgLy8kTk9OLU5MUzEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RNZXNzYWdlSW5mby5waWRTdHJpbmcgPSAiPHVua25vd24+IjsgLy8kTk9OLU5MUzEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RNZXNzYWdlSW5mby5waWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0TWVzc2FnZUluZm8ubG9nTGV2ZWwgPSBMb2dMZXZlbC5JTkZPOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0TWVzc2FnZUluZm8udGFnID0gIjx1bmtub3duPiI7IC8vJE5PTi1OTFMxJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzb21lb25lIHByaW50ZWQgYSBsb2cgbWVzc2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZGRlZCAnXG4nIGNoYXJhY3RlcnMsIHRoZXJlIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBtdWx0aXBsZSB0ZXh0IGxpbmVzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBsYXN0IGhlYWRlciB0aGF0IHdlIHNhdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1jLmRhdGEgPSBtTGFzdE1lc3NhZ2VJbmZvOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJzIHNlZW0gdG8gZGlzcGxheSBhcyBvbmx5IDEgdGFiIHNvIHdlIHJlcGxhY2UgdGhlIGxlYWRpbmcgdGFicwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgNCBzcGFjZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtYy5tc2cgPSBsaW5lLnJlcGxhY2VBbGwoIlx0IiwgIiAgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG5ldyBMb2dNZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05ld01lc3NhZ2UobWMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgbmV3IExvZ01lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzLmFkZChtYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBwZW5kaW5nIFJ1bm5hYmxlIHRoYXQgd2lsbCBkbyB0aGUgcmVmcmVzaCwgd2UgYXNrIHRoZSBEaXNwbGF5Ci0gICAgICAgICAgICAvLyB0byBydW4gb25lIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgICAgICBpZiAobVBlbmRpbmdBc3luY1JlZnJlc2ggPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0FzeW5jUmVmcmVzaCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBtRm9sZGVycy5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcnVuIGluIHN5bmMgYmVjYXVzZSB0aGlzIHdpbGwgdXBkYXRlIHRoZSBidWZmZXIgc3RhcnQvZW5kIGluZGljZXMKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGlzIGRpc3Bvc2VkLCB3ZSdyZSBwcm9iYWJseSBxdWl0dGluZy4gTGV0J3Mgc3RvcC4KLSAgICAgICAgICAgICAgICAgICAgc3RvcExvZ0NhdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaGVzIHRoZSBVSSB3aXRoIG5ldyBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXN5bmNSZWZyZXNoKCkgewotICAgICAgICBpZiAobUZvbGRlcnMuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1CdWZmZXIpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2lyY3VsYXIgYnVmZmVyIGhhcyBiZWVuIHVwZGF0ZWQsIGxldCBoYXZlIHRoZSBmaWx0ZXIgZmx1c2ggdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSB3aXRoIHRoZSBuZXcgbWVzc2FnZXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKExvZ0ZpbHRlciBmIDogbUZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobURlZmF1bHRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwZW5kaW5nIHJlZnJlc2ggaXMgZG9uZS4KLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdBc3luY1JlZnJlc2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdG9wTG9nQ2F0KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbmV3IE1lc3NhZ2UuCi0gICAgICogPHAvPlRoaXMgYWRkcyB0aGUgbmV3IG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciwgYW5kIGdpdmVzIGl0IHRvIHRoZSBleGlzdGluZyBmaWx0ZXJzLgotICAgICAqIEBwYXJhbSBuZXdNZXNzYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXdNZXNzYWdlKExvZ01lc3NhZ2UgbmV3TWVzc2FnZSkgewotICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gYXV0byBmaWx0ZXJpbmcgbW9kZSwgbWFrZSBzdXJlIHdlIGhhdmUKLSAgICAgICAgLy8gYSBmaWx0ZXIgZm9yIHRoaXMKLSAgICAgICAgaWYgKG1GaWx0ZXJNb2RlID09IEZJTFRFUl9BVVRPX1BJRCB8fAotICAgICAgICAgICAgICAgIG1GaWx0ZXJNb2RlID09IEZJTFRFUl9BVVRPX1RBRykgewotICAgICAgICAgICBjaGVja0ZpbHRlcihuZXdNZXNzYWdlLmRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgaW5kZXggd2hlcmUgdGhlIG1lc3NhZ2UgZ29lcy4KLSAgICAgICAgLy8gd2FzIHRoZSBidWZmZXIgZW1wdHk/Ci0gICAgICAgIGludCBtZXNzYWdlSW5kZXggPSAtMTsKLSAgICAgICAgaWYgKG1CdWZmZXJTdGFydCA9PSAtMSkgewotICAgICAgICAgICAgbWVzc2FnZUluZGV4ID0gbUJ1ZmZlclN0YXJ0ID0gMDsKLSAgICAgICAgICAgIG1CdWZmZXJFbmQgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZUluZGV4ID0gbUJ1ZmZlckVuZDsKLQotICAgICAgICAgICAgLy8gY2hlY2sgd2UgYXJlbid0IG92ZXJ3cml0aW5nIHN0YXJ0Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlckVuZCA9PSBtQnVmZmVyU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyU3RhcnQgPSAobUJ1ZmZlclN0YXJ0ICsgMSkgJSBTVFJJTkdfQlVGRkVSX0xFTkdUSDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBuZXh0IHVzYWJsZSBzbG90IGluZGV4Ci0gICAgICAgICAgICBtQnVmZmVyRW5kID0gKG1CdWZmZXJFbmQgKyAxKSAlIFNUUklOR19CVUZGRVJfTEVOR1RIOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nTWVzc2FnZSBvbGRNZXNzYWdlID0gbnVsbDsKLQotICAgICAgICAvLyByZWNvcmQgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgdGhlcmUgYmVmb3JlCi0gICAgICAgIGlmIChtQnVmZmVyW21lc3NhZ2VJbmRleF0gIT0gbnVsbCkgewotICAgICAgICAgICAgb2xkTWVzc2FnZSA9IG1CdWZmZXJbbWVzc2FnZUluZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZW4gYWRkIHRoZSBuZXcgb25lCi0gICAgICAgIG1CdWZmZXJbbWVzc2FnZUluZGV4XSA9IG5ld01lc3NhZ2U7Ci0KLSAgICAgICAgLy8gZ2l2ZSB0aGUgbmV3IG1lc3NhZ2UgdG8gZXZlcnkgZmlsdGVycy4KLSAgICAgICAgYm9vbGVhbiBmaWx0ZXJlZCA9IGZhbHNlOwotICAgICAgICBpZiAobUZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyZWQgfD0gZi5hZGRNZXNzYWdlKG5ld01lc3NhZ2UsIG9sZE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJlZCA9PSBmYWxzZSAmJiBtRGVmYXVsdEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGVmYXVsdEZpbHRlci5hZGRNZXNzYWdlKG5ld01lc3NhZ2UsIG9sZE1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbHRlcnMoKSB7Ci0gICAgICAgIGlmIChtRmlsdGVyTW9kZSA9PSBGSUxURVJfREVCVUcgfHwgbUZpbHRlck1vZGUgPT0gRklMVEVSX01BTlVBTCkgewotICAgICAgICAgICAgLy8gdW5hcmNoaXZlIHRoZSBmaWx0ZXJzLgotICAgICAgICAgICAgbUZpbHRlcnMgPSBtRmlsdGVyU3RvcmFnZS5nZXRGaWx0ZXJGcm9tU3RvcmUoKTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBjb2xvcnMKLSAgICAgICAgICAgIGlmIChtRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYuc2V0Q29sb3JzKG1Db2xvcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GaWx0ZXJTdG9yYWdlLnJlcXVpcmVzRGVmYXVsdEZpbHRlcigpKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIgPSBuZXcgTG9nRmlsdGVyKCJMb2ciKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdEZpbHRlci5zZXRDb2xvcnMobUNvbG9ycyk7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIuc2V0U3VwcG9ydHNEZWxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnNldFN1cHBvcnRzRWRpdChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUZpbHRlck1vZGUgPT0gRklMVEVSX05PTkUpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBmaWx0ZXJpbmcgbW9kZSBpcyAibm9uZSIsIHdlIGNyZWF0ZSBhIHNpbmdsZSBmaWx0ZXIgdGhhdAotICAgICAgICAgICAgLy8gd2lsbCByZWNlaXZlIGFsbAotICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIgPSBuZXcgTG9nRmlsdGVyKCJMb2ciKTsKLSAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnNldENvbG9ycyhtQ29sb3JzKTsKLSAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnNldFN1cHBvcnRzRGVsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnNldFN1cHBvcnRzRWRpdChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2hlY2tzIGlmIHRoZXJlJ3MgYW4gYXV0b21hdGljIGZpbHRlciBmb3IgdGhpcyBtZCBhbmQgaWYgbm90Ci0gICAgICogYWRkcyB0aGUgZmlsdGVyIGFuZCB0aGUgdWkuCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSEKLSAgICAgKiBAcGFyYW0gbWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbHRlciBleGlzdGVkIGFscmVhZHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWx0ZXIoZmluYWwgTG9nTWVzc2FnZUluZm8gbWQpIHsKLSAgICAgICAgaWYgKHRydWUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gbG9vayBmb3IgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIHRoZSBwaWQKLSAgICAgICAgaWYgKG1GaWx0ZXJNb2RlID09IEZJTFRFUl9BVVRPX1BJRCkgewotICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGYuZ2V0UGlkRmlsdGVyKCkgPT0gbWQucGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtRmlsdGVyTW9kZSA9PSBGSUxURVJfQVVUT19UQUcpIHsKLSAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBtRmlsdGVycykgewotICAgICAgICAgICAgICAgIGlmIChmLmdldFRhZ0ZpbHRlcigpLmVxdWFscyhtZC50YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIG5vIGZpbHRlciB3YXMgZm91bmQuCi0gICAgICAgIC8vIGNyZWF0ZSBhIGZpbHRlciB3aXRoIGEgdGVtcG9yYXJ5IG5hbWUgb2YgdGhlIHBpZAotICAgICAgICBmaW5hbCBMb2dGaWx0ZXIgbmV3RmlsdGVyID0gbmV3IExvZ0ZpbHRlcihtZC5waWRTdHJpbmcpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChtRmlsdGVyTW9kZSA9PSBGSUxURVJfQVVUT19QSUQpIHsKLSAgICAgICAgICAgIG5ld0ZpbHRlci5zZXRQaWRNb2RlKG1kLnBpZCk7Ci0KLSAgICAgICAgICAgIC8vIGFzayB0aGUgbW9uaXRvciB0aHJlYWQgaWYgaXQga25vd3MgdGhlIHBpZC4KLSAgICAgICAgICAgIG5hbWUgPSBtQ3VycmVudExvZ2dlZERldmljZS5nZXRDbGllbnROYW1lKG1kLnBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdGaWx0ZXIuc2V0VGFnTW9kZShtZC50YWcpOwotICAgICAgICAgICAgbmFtZSA9IG1kLnRhZzsKLSAgICAgICAgfQotICAgICAgICBhZGRGaWx0ZXJUb0FycmF5KG5ld0ZpbHRlcik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZuYW1lID0gbmFtZTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRhYml0ZW0KLSAgICAgICAgZmluYWwgVGFiSXRlbSBuZXdUYWJJdGVtID0gY3JlYXRlVGFiKG5ld0ZpbHRlciwgLTEsIHRydWUpOwotCi0gICAgICAgIC8vIGlmIHRoZSBuYW1lIGlzIHVua25vd24KLSAgICAgICAgaWYgKGZuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcHJvY2VzcyBydW5uaW5nIHVuZGVyIHRoYXQgcGlkLgotICAgICAgICAgICAgLy8gbGF1bmNoIGEgdGhyZWFkIGRvIGEgcHMgb24gdGhlIGRldmljZQotICAgICAgICAgICAgbmV3IFRocmVhZCgicmVtb3RlIFBTIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlY2VpdmVyCi0gICAgICAgICAgICAgICAgICAgIFBzT3V0cHV0UmVjZWl2ZXIgcHNvciA9IG5ldyBQc091dHB1dFJlY2VpdmVyKG1kLnBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWx0ZXIsIG5ld1RhYkl0ZW0pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgcHMKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TG9nZ2VkRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBzIiwgcHNvcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG1tLi4uCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBmaWx0ZXIgdG8gdGhlIGN1cnJlbnQgZmlsdGVyIGFycmF5LCBhbmQgc2V0IGl0cyBjb2xvcnMKLSAgICAgKiBAcGFyYW0gbmV3RmlsdGVyIFRoZSBmaWx0ZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpbHRlclRvQXJyYXkoTG9nRmlsdGVyIG5ld0ZpbHRlcikgewotICAgICAgICAvLyBzZXQgdGhlIGNvbG9ycwotICAgICAgICBuZXdGaWx0ZXIuc2V0Q29sb3JzKG1Db2xvcnMpOwotCi0gICAgICAgIC8vIGFkZCBpdCB0byB0aGUgYXJyYXkuCi0gICAgICAgIGlmIChtRmlsdGVycyAhPSBudWxsICYmIG1GaWx0ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIExvZ0ZpbHRlcltdIG5ld0ZpbHRlcnMgPSBuZXcgTG9nRmlsdGVyW21GaWx0ZXJzLmxlbmd0aCsxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUZpbHRlcnMsIDAsIG5ld0ZpbHRlcnMsIDAsIG1GaWx0ZXJzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdGaWx0ZXJzW21GaWx0ZXJzLmxlbmd0aF0gPSBuZXdGaWx0ZXI7Ci0gICAgICAgICAgICBtRmlsdGVycyA9IG5ld0ZpbHRlcnM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsdGVycyA9IG5ldyBMb2dGaWx0ZXJbMV07Ci0gICAgICAgICAgICBtRmlsdGVyc1swXSA9IG5ld0ZpbHRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVGaWx0ZXJGcm9tQXJyYXkoTG9nRmlsdGVyIG9sZEZpbHRlcikgewotICAgICAgICAvLyBsb29rIGZvciB0aGUgaW5kZXgKLSAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1GaWx0ZXJzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1GaWx0ZXJzW2ldID09IG9sZEZpbHRlcikgewotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgTG9nRmlsdGVyW10gbmV3RmlsdGVycyA9IG5ldyBMb2dGaWx0ZXJbbUZpbHRlcnMubGVuZ3RoLTFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRmlsdGVycywgMCwgbmV3RmlsdGVycywgMCwgaW5kZXgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRmlsdGVycywgaW5kZXggKyAxLCBuZXdGaWx0ZXJzLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgbmV3RmlsdGVycy5sZW5ndGgtaW5kZXgpOwotICAgICAgICAgICAgbUZpbHRlcnMgPSBuZXdGaWx0ZXJzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgZmlsdGVyIHdpdGggYWxyZWFkeSBleGlzdGluZyBidWZmZXIuCi0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0RmlsdGVyKExvZ0ZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgLy8gaXMgaXQgZW1wdHkKLSAgICAgICAgaWYgKGZpbHRlci51aVJlYWR5KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWx0ZXIgPT0gbURlZmF1bHRGaWx0ZXIpIHsKLSAgICAgICAgICAgIGluaXREZWZhdWx0RmlsdGVyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaWx0ZXIuY2xlYXIoKTsKLQotICAgICAgICBpZiAobUJ1ZmZlclN0YXJ0ICE9IC0xKSB7Ci0gICAgICAgICAgICBpbnQgbWF4ID0gbUJ1ZmZlckVuZDsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyRW5kIDwgbUJ1ZmZlclN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgbWF4ICs9IFNUUklOR19CVUZGRVJfTEVOR1RIOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbUJ1ZmZlclN0YXJ0OyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVhbEl0ZW1JbmRleCA9IGkgJSBTVFJJTkdfQlVGRkVSX0xFTkdUSDsKLQotICAgICAgICAgICAgICAgIGZpbHRlci5hZGRNZXNzYWdlKG1CdWZmZXJbcmVhbEl0ZW1JbmRleF0sIG51bGwgLyogb2xkIG1lc3NhZ2UgKi8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmlsdGVyLmZsdXNoKCk7Ci0gICAgICAgIGZpbHRlci5yZXNldFRlbXBGaWx0ZXJpbmdTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZpbGwgdGhlIGRlZmF1bHQgZmlsdGVyLiBOb3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LgotICAgICAqIEBzZWUgaW5pdEZpbHRlcigpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0RmlsdGVyKCkgewotICAgICAgICBtRGVmYXVsdEZpbHRlci5jbGVhcigpOwotCi0gICAgICAgIGlmIChtQnVmZmVyU3RhcnQgIT0gLTEpIHsKLSAgICAgICAgICAgIGludCBtYXggPSBtQnVmZmVyRW5kOwotICAgICAgICAgICAgaWYgKG1CdWZmZXJFbmQgPCBtQnVmZmVyU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBtYXggKz0gU1RSSU5HX0JVRkZFUl9MRU5HVEg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtQnVmZmVyU3RhcnQ7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgICAgIGludCByZWFsSXRlbUluZGV4ID0gaSAlIFNUUklOR19CVUZGRVJfTEVOR1RIOwotICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UgbXNnID0gbUJ1ZmZlcltyZWFsSXRlbUluZGV4XTsKLQotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHdlIGNoZWNrIHRoYXQgdGhlIG90aGVyIGZpbHRlcnMgZG9uJ3QgdGFrZSB0aGlzIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkIHw9IGYuYWNjZXB0KG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLmFkZE1lc3NhZ2UobXNnLCBudWxsIC8qIG9sZCBtZXNzYWdlICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtRGVmYXVsdEZpbHRlci5mbHVzaCgpOwotICAgICAgICBtRGVmYXVsdEZpbHRlci5yZXNldFRlbXBGaWx0ZXJpbmdTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgZmlsdGVycywgdG8gaGFuZGxlIGNoYW5nZSBpbiBkZXZpY2UgaW4gYXV0b21hdGljIGZpbHRlciBtb2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0RmlsdGVycygpIHsKLSAgICAgICAgLy8gaWYgd2UgYXJlIGluIGF1dG9tYXRpYyBtb2RlLCB0aGVuIHdlIG5lZWQgdG8gcm1vdmUgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gZmlsdGVyLgotICAgICAgICBpZiAobUZpbHRlck1vZGUgPT0gRklMVEVSX0FVVE9fUElEIHx8IG1GaWx0ZXJNb2RlID09IEZJTFRFUl9BVVRPX1RBRykgewotICAgICAgICAgICAgbUZpbHRlcnMgPSBudWxsOwotCi0gICAgICAgICAgICAvLyByZWNyZWF0ZSB0aGUgZmlsdGVycy4KLSAgICAgICAgICAgIGNyZWF0ZUZpbHRlcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBMb2dGaWx0ZXIgZ2V0Q3VycmVudEZpbHRlcigpIHsKLSAgICAgICAgaW50IGluZGV4ID0gbUZvbGRlcnMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotICAgICAgICAvLyBpZiBtRmlsdGVycyBpcyBudWxsIG9yIGluZGV4IGlzIGludmFsaWQsIHdlIHJldHVybiB0aGUgZGVmYXVsdAotICAgICAgICAvLyBmaWx0ZXIuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoYXQgb25lIGlzIG51bGwgYXMgd2VsbCwgc2luY2Ugd2UKLSAgICAgICAgLy8gd291bGQgcmV0dXJuIG51bGwgYW55d2F5LgotICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBtRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRGaWx0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUZpbHRlcnNbaW5kZXgtMV07Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgZW1wdHlUYWJsZXMoKSB7Ci0gICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBtRmlsdGVycykgewotICAgICAgICAgICAgZi5nZXRUYWJsZSgpLnJlbW92ZUFsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWx0ZXJpbmdXaXRoKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUJ1ZmZlcikgewotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHRlbXAgZmlsdGVyaW5nIGZvciBhbGwgdGhlIGZpbHRlcnMKLSAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBtRmlsdGVycykgewotICAgICAgICAgICAgICAgIGYucmVzZXRUZW1wRmlsdGVyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnJlc2V0VGVtcEZpbHRlcmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBuZXcgdGVtcCBmaWx0ZXJpbmcKLSAgICAgICAgICAgIC8vIHNwbGl0IGVhY2ggd29yZAotICAgICAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSB0ZXh0LnNwbGl0KCIgIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4ga2V5d29yZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VnbWVudHMubGVuZ3RoKTsKLQotICAgICAgICAgICAgLy8gbG9vcCBhbmQgbG9vayBmb3IgdGVtcCBpZC90YWcKLSAgICAgICAgICAgIGludCB0ZW1wUGlkID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcFRhZyA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc2VnbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXBQaWQgPT0gLTEgJiYgcy5zdGFydHNXaXRoKCJwaWQ6IikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBpZAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWcgPSBzLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ1sxXS5tYXRjaGVzKCJeWzAtOV0qJCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUGlkID0gSW50ZWdlci52YWx1ZU9mKHNlZ1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBUYWcgPT0gbnVsbCAmJiBzLnN0YXJ0c1dpdGgoInRhZzoiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWdbXSA9IHNlZ21lbnRzW2ldLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRhZyA9IHNlZ1sxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLmFkZChzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgdGVtcCBmaWx0ZXJpbmcgaW4gdGhlIGZpbHRlcnMKLSAgICAgICAgICAgIGlmICh0ZW1wUGlkICE9IC0xIHx8IHRlbXBUYWcgIT0gbnVsbCB8fCBrZXl3b3Jkcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5d29yZHNBcnJheSA9IGtleXdvcmRzLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW2tleXdvcmRzLnNpemUoKV0pOwotCi0gICAgICAgICAgICAgICAgZm9yIChMb2dGaWx0ZXIgZiA6IG1GaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUGlkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLnNldFRlbXBQaWRGaWx0ZXJpbmcodGVtcFBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBUYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXRUZW1wVGFnRmlsdGVyaW5nKHRlbXBUYWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGYuc2V0VGVtcEtleXdvcmRGaWx0ZXJpbmcoa2V5d29yZHNBcnJheSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBQaWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0RmlsdGVyLnNldFRlbXBQaWRGaWx0ZXJpbmcodGVtcFBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBUYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGaWx0ZXIuc2V0VGVtcFRhZ0ZpbHRlcmluZyh0ZW1wVGFnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEZpbHRlci5zZXRUZW1wS2V5d29yZEZpbHRlcmluZyhrZXl3b3Jkc0FycmF5KTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5pdEZpbHRlcihtQ3VycmVudEZpbHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBmaWx0ZXIgc2VsZWN0aW9uIGNoYW5nZXMuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkRmlsdGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoTG9nRmlsdGVyIHNlbGVjdGVkRmlsdGVyKSB7Ci0gICAgICAgIGlmIChtTG9nTGV2ZWxBY3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbG9nIGxldmVsCi0gICAgICAgICAgICBpbnQgbGV2ZWwgPSBzZWxlY3RlZEZpbHRlci5nZXRMb2dMZXZlbCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbUxvZ0xldmVsQWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb21tb25BY3Rpb24gYSA9IG1Mb2dMZXZlbEFjdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGV2ZWwgLSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGVsZXRlRmlsdGVyQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EZWxldGVGaWx0ZXJBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3RlZEZpbHRlci5zdXBwb3J0c0RlbGV0ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUVkaXRGaWx0ZXJBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUVkaXRGaWx0ZXJBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3RlZEZpbHRlci5zdXBwb3J0c0VkaXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvYWRkLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9hZGQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZjMmNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9hZGQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2FuZHJvaWQucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2FuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzc5ZDRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9iYWNrd2FyZC5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvYmFja3dhcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGE5NzEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9iYWNrd2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvY2xlYXIucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2NsZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwOWNmNi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvY2xlYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2QucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU1MDZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZWJ1Zy1hdHRhY2gucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlYnVnLWF0dGFjaC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOGExMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlYnVnLWF0dGFjaC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZGVidWctZXJyb3IucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlYnVnLWVycm9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZGExZi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZGVidWctZXJyb3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlYnVnLXdhaXQucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlYnVnLXdhaXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJiZTYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZWJ1Zy13YWl0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZWxldGUucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNWZhYjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2RlbGV0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZGV2aWNlLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZXZpY2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJiYmI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kZXZpY2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2Rvd24ucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2Rvd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQyNmNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9kb3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9lLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9lLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlN2M5Ny4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZWRpdC5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZWRpdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjY1YmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2VtcHR5LnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9lbXB0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjE1NDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2VtcHR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9lbXVsYXRvci5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZW11bGF0b3IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzE4MDQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9lbXVsYXRvci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZmlsZS5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZmlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2E4MTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ZpbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ZvbGRlci5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyOWIxYS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9mb3J3YXJkLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9mb3J3YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3YTYwNS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZm9yd2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZ2MucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2djLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5NDgwNi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvZ2MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2hhbHQucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2hhbHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUzNzIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9oYWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9oZWFwLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9oZWFwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhYTNmMC4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvaGVhcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvaHByb2YucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2hwcm9mLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzZDA2Mi4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvaHByb2YucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2kucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2kucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM4NWM1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pbXBvcnRCdWcucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ltcG9ydEJ1Zy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZGExNzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ltcG9ydEJ1Zy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvbG9hZC5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvbG9hZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2JmNmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2xvYWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3BhdXNlLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9wYXVzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDI4NmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3BhdXNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9wbGF5LnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9wbGF5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0ZjAxMy4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvcGxheS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvcHVsbC5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvcHVsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGYxYjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3B1bGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3B1c2gucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3B1c2gucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIyODY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9wdXNoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9zYXZlLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy9zYXZlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwZWJkYS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvc2F2ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvdGhyZWFkLnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy90aHJlYWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzgzOWU4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy90aHJlYWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3RyYWNpbmdfc3RhcnQucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3RyYWNpbmdfc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODc3MWNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy90cmFjaW5nX3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy90cmFjaW5nX3N0b3AucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3RyYWNpbmdfc3RvcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmQyMTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3RyYWNpbmdfc3RvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvdXAucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZGY1YS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3YucG5nIGIvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3YucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ0MDUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy92LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy93LnBuZyBiL3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy93LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5ZDBmOS4uMDAwMDAwMAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvdy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvd2FybmluZy5wbmcgYi90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL3Jlc291cmNlcy9pbWFnZXMvd2FybmluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2I2ZWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL3dhcm5pbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9BbmRyb2lkLm1rIGIvdG9vbHMvZHJhdzlwYXRjaC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ0OTVkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLURSQVc5UEFUQ0hfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoRFJBVzlQQVRDSF9MT0NBTF9ESVIpL2V0Yy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoRFJBVzlQQVRDSF9MT0NBTF9ESVIpL3NyYy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9kcmF3OXBhdGNoL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi90b29scy9kcmF3OXBhdGNoL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL0FuZHJvaWQubWsgYi90b29scy9kcmF3OXBhdGNoL2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdkMDgwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gZHJhdzlwYXRjaAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL2RyYXc5cGF0Y2ggYi90b29scy9kcmF3OXBhdGNoL2V0Yy9kcmF3OXBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDI3MmE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL2RyYXc5cGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLSMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXByb2c9IiQwIgotd2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KLSAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCi0gICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCi0gICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCi0gICAgZWxzZQotICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLSAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgotICAgIGZpCi1kb25lCi1vbGR3ZD1gcHdkYAotcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtvbGR3ZH0iCi0KLWphcmZpbGU9ZHJhdzlwYXRjaC5qYXIKLWZyYW1ld29ya2Rpcj0iJHByb2dkaXIiCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICRqYXJmaWxlIgotICAgIGV4aXQgMQotZmkKLQotaWYgWyAiJE9TVFlQRSIgPSAiY3lnd2luIiBdIDsgdGhlbgotICAgIGphcnBhdGg9YGN5Z3BhdGggLXcgICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlImAKLSAgICBwcm9nZGlyPWBjeWdwYXRoIC13ICAiJHByb2dkaXIiYAotZWxzZQotICAgIGphcnBhdGg9IiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiCi1maQotCi0jIG5lZWQgdG8gdXNlICJqYXZhLmV4dC5kaXJzIiBiZWNhdXNlICItamFyIiBjYXVzZXMgY2xhc3NwYXRoIHRvIGJlIGlnbm9yZWQKLSMgbWlnaHQgbmVlZCBtb3JlIG1lbW9yeSwgZS5nLiAtWG14MTI4TQotZXhlYyBqYXZhIC1EamF2YS5leHQuZGlycz0iJGZyYW1ld29ya2RpciIgLWphciAiJGphcnBhdGgiICIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL2RyYXc5cGF0Y2guYmF0IGIvdG9vbHMvZHJhdzlwYXRjaC9ldGMvZHJhdzlwYXRjaC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNjdiMDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9ldGMvZHJhdzlwYXRjaC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotcmVtCi1yZW0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1yZW0geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotcmVtIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotcmVtCi1yZW0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIGRvbid0IG1vZGlmeSB0aGUgY2FsbGVyJ3MgZW52aXJvbm1lbnQKLXNldGxvY2FsCi0KLXJlbSBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLXJlbSBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5Lgotc2V0IHByb2c9JX5mMAotCi1yZW0gQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBkcml2ZSB0byB3aGVyZSB0aGUgc2NyaXB0IGlzLCB0byBhdm9pZAotcmVtIGlzc3VlcyB3aXRoIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgd2hpdGVzcGFjZXMuCi1jZCAvZCAlfmRwMAotCi1zZXQgamFyZmlsZT1kcmF3OXBhdGNoLmphcgotc2V0IGZyYW1ld29ya2Rpcj0KLXNldCBsaWJkaXI9Ci0KLWlmIGV4aXN0ICVmcmFtZXdvcmtkaXIlJWphcmZpbGUlIGdvdG8gSmFyRmlsZU9rCi0gICAgc2V0IGZyYW1ld29ya2Rpcj1saWJcCi0KLWlmIGV4aXN0ICVmcmFtZXdvcmtkaXIlJWphcmZpbGUlIGdvdG8gSmFyRmlsZU9rCi0gICAgc2V0IGZyYW1ld29ya2Rpcj0uLlxmcmFtZXdvcmtcCi0KLTpKYXJGaWxlT2sKLQotc2V0IGphcnBhdGg9JWZyYW1ld29ya2RpciUlamFyZmlsZSUKLQotY2FsbCBqYXZhIC1EamF2YS5leHQuZGlycz0lZnJhbWV3b3JrZGlyJSAtamFyICVqYXJwYXRoJSAlKgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9ldGMvbWFuaWZlc3QudHh0IGIvdG9vbHMvZHJhdzlwYXRjaC9ldGMvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUzNTI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQuZHJhdzlwYXRjaC5BcHBsaWNhdGlvbgotQ2xhc3MtUGF0aDogc3dpbmctd29ya2VyLTEuMS5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL0FuZHJvaWQubWsgYi90b29scy9kcmF3OXBhdGNoL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGM5ZGI0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmVzb3VyY2VzCi0KLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0Jc3dpbmctd29ya2VyLTEuMQotTE9DQUxfTU9EVUxFIDo9IGRyYXc5cGF0Y2gKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC9BcHBsaWNhdGlvbi5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC9BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGM3OTJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2g7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpLk1haW5GcmFtZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5VbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFVzZXJJbnRlcmZhY2UoKSB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiYXBwbGUubGFmLnVzZVNjcmVlbk1lbnVCYXIiLCAidHJ1ZSIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNvbS5hcHBsZS5tcmouYXBwbGljYXRpb24uYXBwbGUubWVudS5hYm91dC5uYW1lIiwgIkRyYXcgOS1wYXRjaCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmcuLi4gYXJncykgewotICAgICAgICBpbml0VXNlckludGVyZmFjZSgpOwotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiBudWxsOwotICAgICAgICAgICAgICAgIE1haW5GcmFtZSBmcmFtZSA9IG5ldyBNYWluRnJhbWUoYXJnKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oTWFpbkZyYW1lLkVYSVRfT05fQ0xPU0UpOwotICAgICAgICAgICAgICAgIGZyYW1lLnNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL2dyYXBoaWNzL0dyYXBoaWNzVXRpbGl0aWVzLmphdmEgYi90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL2dyYXBoaWNzL0dyYXBoaWNzVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzE4MmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC9ncmFwaGljcy9HcmFwaGljc1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC5ncmFwaGljczsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NFbnZpcm9ubWVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5UcmFuc3BhcmVuY3k7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBHcmFwaGljc1V0aWxpdGllcyB7Ci0gICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGxvYWRDb21wYXRpYmxlSW1hZ2UoVVJMIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKHJlc291cmNlKTsKLSAgICAgICAgcmV0dXJuIHRvQ29tcGF0aWJsZUltYWdlKGltYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSB0b0NvbXBhdGlibGVJbWFnZShCdWZmZXJlZEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbWFnZS5nZXRDb2xvck1vZGVsKCkuZXF1YWxzKGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldENvbG9yTW9kZWwoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgY29tcGF0aWJsZUltYWdlID0gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKAotICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRXaWR0aCgpLCBpbWFnZS5nZXRIZWlnaHQoKSwgaW1hZ2UuZ2V0VHJhbnNwYXJlbmN5KCkpOwotICAgICAgICBHcmFwaGljcyBnID0gY29tcGF0aWJsZUltYWdlLmdldEdyYXBoaWNzKCk7Ci0gICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBudWxsKTsKLSAgICAgICAgZy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhdGlibGVJbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZUltYWdlKEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRUcmFuc3BhcmVuY3koKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0TG9jYWxHcmFwaGljc0Vudmlyb25tZW50KCk7Ci0gICAgICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGVhZGxlc3MoKSB7Ci0gICAgICAgIHJldHVybiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlVHJhbnNsdWNlbnRDb21wYXRpYmxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5jcmVhdGVDb21wYXRpYmxlSW1hZ2Uod2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2V0UGl4ZWxzKEJ1ZmZlcmVkSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50W10gcGl4ZWxzKSB7Ci0gICAgICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGludFswXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwaXhlbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGl4ZWxzID0gbmV3IGludFt3ICogaF07Ci0gICAgICAgIH0gZWxzZSBpZiAocGl4ZWxzLmxlbmd0aCA8IHcgKiBoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQaXhlbHMgYXJyYXkgbXVzdCBoYXZlIGEgbGVuZ3RoID49IHcgKiBoIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW1hZ2VUeXBlID0gaW1nLmdldFR5cGUoKTsKLSAgICAgICAgaWYgKGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgfHwgaW1hZ2VUeXBlID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCKSB7Ci0gICAgICAgICAgICBSYXN0ZXIgcmFzdGVyID0gaW1nLmdldFJhc3RlcigpOwotICAgICAgICAgICAgcmV0dXJuIChpbnRbXSkgcmFzdGVyLmdldERhdGFFbGVtZW50cyh4LCB5LCB3LCBoLCBwaXhlbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVW5tYW5hZ2VzIHRoZSBpbWFnZQotICAgICAgICByZXR1cm4gaW1nLmdldFJHQih4LCB5LCB3LCBoLCBwaXhlbHMsIDAsIHcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvR3JhZGllbnRQYW5lbC5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9HcmFkaWVudFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTQ2NWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9HcmFkaWVudFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5QYWludDsKLWltcG9ydCBqYXZhLmF3dC5HcmFkaWVudFBhaW50OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi1jbGFzcyBHcmFkaWVudFBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFSS19CTFVFID0gMHgyMDI3Mzc7Ci0KLSAgICBHcmFkaWVudFBhbmVsKCkgewotICAgICAgICBzdXBlcihuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgR3JhcGhpY3MyRCBnMiA9IChHcmFwaGljczJEKSBnOwotICAgICAgICBSZWN0YW5nbGUgY2xpcCA9IGcyLmdldENsaXBCb3VuZHMoKTsKLSAgICAgICAgUGFpbnQgcGFpbnQgPSBnMi5nZXRQYWludCgpOwotCi0gICAgICAgIGcyLnNldFBhaW50KG5ldyBHcmFkaWVudFBhaW50KDAuMGYsIGdldEhlaWdodCgpICogMC4yMmYsIG5ldyBDb2xvcihEQVJLX0JMVUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCBnZXRIZWlnaHQoKSAqIDAuOWYsIENvbG9yLkJMQUNLKSk7Ci0gICAgICAgIGcyLmZpbGxSZWN0KGNsaXAueCwgY2xpcC55LCBjbGlwLndpZHRoLCBjbGlwLmhlaWdodCk7Ci0KLSAgICAgICAgZzIuc2V0UGFpbnQocGFpbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvSW1hZ2VFZGl0b3JQYW5lbC5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9JbWFnZUVkaXRvclBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Yjk2YTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9JbWFnZUVkaXRvclBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2gudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLmdyYXBoaWNzLkdyYXBoaWNzVXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTbGlkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGaWxlQ2hvb3NlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmVuZGVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuVGV4dHVyZVBhaW50OwotaW1wb3J0IGphdmEuYXd0LlNoYXBlOwotaW1wb3J0IGphdmEuYXd0LkJhc2ljU3Ryb2tlOwotaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLWltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZU1vdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQVdURXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uTGluZTJEOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uQXJlYTsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLlJvdW5kUmVjdGFuZ2xlMkQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotY2xhc3MgSW1hZ2VFZGl0b3JQYW5lbCBleHRlbmRzIEpQYW5lbCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl85UEFUQ0ggPSAiLjkucG5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9aT09NID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1NDQUxFID0gMi4wZjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIGltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpczlQYXRjaDsKLQotICAgIHByaXZhdGUgSW1hZ2VWaWV3ZXIgdmlld2VyOwotICAgIHByaXZhdGUgU3RyZXRjaGVzVmlld2VyIHN0cmV0Y2hlc1ZpZXdlcjsKLSAgICBwcml2YXRlIEpMYWJlbCB4TGFiZWw7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgeUxhYmVsOwotCi0gICAgcHJpdmF0ZSBUZXh0dXJlUGFpbnQgdGV4dHVyZTsgICAgCi0KLSAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBwYXRjaGVzOwotICAgIHByaXZhdGUgTGlzdDxSZWN0YW5nbGU+IGhvcml6b250YWxQYXRjaGVzOwotICAgIHByaXZhdGUgTGlzdDxSZWN0YW5nbGU+IHZlcnRpY2FsUGF0Y2hlczsKLSAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBmaXhlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmVydGljYWxTdGFydFdpdGhQYXRjaDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaG9yaXpvbnRhbFN0YXJ0V2l0aFBhdGNoOwotCi0gICAgcHJpdmF0ZSBQYWlyPEludGVnZXI+IGhvcml6b250YWxQYWRkaW5nOwotICAgIHByaXZhdGUgUGFpcjxJbnRlZ2VyPiB2ZXJ0aWNhbFBhZGRpbmc7ICAgIAotCi0gICAgSW1hZ2VFZGl0b3JQYW5lbChNYWluRnJhbWUgbWFpbkZyYW1lLCBCdWZmZXJlZEltYWdlIGltYWdlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgc2V0VHJhbnNmZXJIYW5kbGVyKG5ldyBJbWFnZVRyYW5zZmVySGFuZGxlcihtYWluRnJhbWUpKTsKLQotICAgICAgICBjaGVja0ltYWdlKCk7Ci0KLSAgICAgICAgc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgbG9hZFN1cHBvcnQoKTsKLSAgICAgICAgYnVpbGRJbWFnZVZpZXdlcigpOwotICAgICAgICBidWlsZFN0YXR1c1BhbmVsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRTdXBwb3J0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2ltYWdlcy9jaGVja2VyLnBuZyIpOwotICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBjaGVja2VyID0gR3JhcGhpY3NVdGlsaXRpZXMubG9hZENvbXBhdGlibGVJbWFnZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmVQYWludChjaGVja2VyLCBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrZXIuZ2V0V2lkdGgoKSwgY2hlY2tlci5nZXRIZWlnaHQoKSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkSW1hZ2VWaWV3ZXIoKSB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBJbWFnZVZpZXdlcigpOwotCi0gICAgICAgIEpTcGxpdFBhbmUgc3BsaXR0ZXIgPSBuZXcgSlNwbGl0UGFuZSgpOwotICAgICAgICBzcGxpdHRlci5zZXRDb250aW51b3VzTGF5b3V0KHRydWUpOwotICAgICAgICBzcGxpdHRlci5zZXRSZXNpemVXZWlnaHQoMC44KTsKLSAgICAgICAgc3BsaXR0ZXIuc2V0Qm9yZGVyKG51bGwpOwotCi0gICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbGVyID0gbmV3IEpTY3JvbGxQYW5lKHZpZXdlcik7Ci0gICAgICAgIHNjcm9sbGVyLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIHNjcm9sbGVyLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgc2Nyb2xsZXIuZ2V0Vmlld3BvcnQoKS5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHNjcm9sbGVyLmdldFZpZXdwb3J0KCkuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBzcGxpdHRlci5zZXRMZWZ0Q29tcG9uZW50KHNjcm9sbGVyKTsKLSAgICAgICAgc3BsaXR0ZXIuc2V0UmlnaHRDb21wb25lbnQoYnVpbGRTdHJldGNoZXNWaWV3ZXIoKSk7Ci0KLSAgICAgICAgYWRkKHNwbGl0dGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpDb21wb25lbnQgYnVpbGRTdHJldGNoZXNWaWV3ZXIoKSB7Ci0gICAgICAgIHN0cmV0Y2hlc1ZpZXdlciA9IG5ldyBTdHJldGNoZXNWaWV3ZXIoKTsKLSAgICAgICAgSlNjcm9sbFBhbmUgc2Nyb2xsZXIgPSBuZXcgSlNjcm9sbFBhbmUoc3RyZXRjaGVzVmlld2VyKTsKLSAgICAgICAgc2Nyb2xsZXIuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICBzY3JvbGxlci5nZXRWaWV3cG9ydCgpLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgc2Nyb2xsZXIuc2V0SG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeShKU2Nyb2xsUGFuZS5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BTFdBWVMpOwotICAgICAgICBzY3JvbGxlci5zZXRWZXJ0aWNhbFNjcm9sbEJhclBvbGljeShKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQUxXQVlTKTsKLSAgICAgICAgcmV0dXJuIHNjcm9sbGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZFN0YXR1c1BhbmVsKCkgewotICAgICAgICBKUGFuZWwgc3RhdHVzID0gbmV3IEpQYW5lbChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgc3RhdHVzLnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICAgICAgSkxhYmVsIGxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiWm9vbTogIik7Ci0gICAgICAgIGxhYmVsLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHN0YXR1cy5hZGQobGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9FTkQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgNiwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIjEwMCUiKTsKLSAgICAgICAgbGFiZWwucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgc3RhdHVzLmFkZChsYWJlbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX0VORCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIEpTbGlkZXIgem9vbVNsaWRlciA9IG5ldyBKU2xpZGVyKDEsIDE2LCBERUZBVUxUX1pPT00pOwotICAgICAgICB6b29tU2xpZGVyLnNldFNuYXBUb1RpY2tzKHRydWUpOwotICAgICAgICB6b29tU2xpZGVyLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHpvb21TbGlkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IENoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHZpZXdlci5zZXRab29tKCgoSlNsaWRlcikgZXZ0LmdldFNvdXJjZSgpKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHN0YXR1cy5hZGQoem9vbVNsaWRlciwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAwLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgSkxhYmVsIG1heFpvb21MYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbWF4Wm9vbUxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICBtYXhab29tTGFiZWwucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgbWF4Wm9vbUxhYmVsLnNldFRleHQoIjgwMCUiKTsKLSAgICAgICAgc3RhdHVzLmFkZChtYXhab29tTGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMywgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiUGF0Y2ggc2NhbGU6ICIpOwotICAgICAgICBsYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBzdGF0dXMuYWRkKGxhYmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgNiwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIjJ4Iik7Ci0gICAgICAgIGxhYmVsLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHN0YXR1cy5hZGQobGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9FTkQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB6b29tU2xpZGVyID0gbmV3IEpTbGlkZXIoMjAwLCA2MDAsIChpbnQpIChERUZBVUxUX1NDQUxFICogMTAwLjBmKSk7Ci0gICAgICAgIHpvb21TbGlkZXIuc2V0U25hcFRvVGlja3ModHJ1ZSk7Ci0gICAgICAgIHpvb21TbGlkZXIucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgem9vbVNsaWRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgc3RyZXRjaGVzVmlld2VyLnNldFNjYWxlKCgoSlNsaWRlcikgZXZ0LmdldFNvdXJjZSgpKS5nZXRWYWx1ZSgpIC8gMTAwLjBmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHN0YXR1cy5hZGQoem9vbVNsaWRlciwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAxLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgbWF4Wm9vbUxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBtYXhab29tTGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIG1heFpvb21MYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBtYXhab29tTGFiZWwuc2V0VGV4dCgiNngiKTsKLSAgICAgICAgc3RhdHVzLmFkZChtYXhab29tTGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMywgMSwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIEpDaGVja0JveCBzaG93TG9jayA9IG5ldyBKQ2hlY2tCb3goIlNob3cgbG9jayIpOwotICAgICAgICBzaG93TG9jay5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBzaG93TG9jay5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgc2hvd0xvY2suc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIHNob3dMb2NrLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHNob3dMb2NrLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHZpZXdlci5zZXRMb2NrVmlzaWJsZSgoKEpDaGVja0JveCkgZXZlbnQuZ2V0U291cmNlKCkpLmlzU2VsZWN0ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBzdGF0dXMuYWRkKHNob3dMb2NrLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDQsIDAsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMTIsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgSkNoZWNrQm94IHNob3dQYXRjaGVzID0gbmV3IEpDaGVja0JveCgiU2hvdyBwYXRjaGVzIik7Ci0gICAgICAgIHNob3dQYXRjaGVzLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIHNob3dQYXRjaGVzLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICBzaG93UGF0Y2hlcy5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBzaG93UGF0Y2hlcy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB2aWV3ZXIuc2V0UGF0Y2hlc1Zpc2libGUoKChKQ2hlY2tCb3gpIGV2ZW50LmdldFNvdXJjZSgpKS5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc3RhdHVzLmFkZChzaG93UGF0Y2hlcywgbmV3IEdyaWRCYWdDb25zdHJhaW50cyg0LCAxLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDEyLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIEpDaGVja0JveCBzaG93UGFkZGluZyA9IG5ldyBKQ2hlY2tCb3goIlNob3cgY29udGVudCIpOwotICAgICAgICBzaG93UGFkZGluZy5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBzaG93UGFkZGluZy5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgc2hvd1BhZGRpbmcucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgc2hvd1BhZGRpbmcuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc3RyZXRjaGVzVmlld2VyLnNldFBhZGRpbmdWaXNpYmxlKCgoSkNoZWNrQm94KSBldmVudC5nZXRTb3VyY2UoKSkuaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHN0YXR1cy5hZGQoc2hvd1BhZGRpbmcsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoNSwgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAxMiwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBzdGF0dXMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDYsIDAsIDEsIDEsIDEuMGYsIDEuMGYsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBsYWJlbCA9IG5ldyBKTGFiZWwoIlg6ICIpOwotICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgbGFiZWwucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgc3RhdHVzLmFkZChsYWJlbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cyg3LCAwLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX0VORCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHhMYWJlbCA9IG5ldyBKTGFiZWwoIjBweCIpOwotICAgICAgICB4TGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIHhMYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBzdGF0dXMuYWRkKHhMYWJlbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cyg4LCAwLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX0VORCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCA2KSwgMCwgMCkpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IEpMYWJlbCgiWTogIik7Ci0gICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICBsYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBzdGF0dXMuYWRkKGxhYmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDcsIDEsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfRU5ELCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgeUxhYmVsID0gbmV3IEpMYWJlbCgiMHB4Iik7Ci0gICAgICAgIHlMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgeUxhYmVsLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHN0YXR1cy5hZGQoeUxhYmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDgsIDEsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfRU5ELCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDYpLCAwLCAwKSk7Ci0KLSAgICAgICAgYWRkKHN0YXR1cywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbWFnZSgpIHsKLSAgICAgICAgaXM5UGF0Y2ggPSBuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl85UEFUQ0gpOwotICAgICAgICBpZiAoIWlzOVBhdGNoKSB7Ci0gICAgICAgICAgICBjb252ZXJ0VG85UGF0Y2goKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuc3VyZTlQYXRjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZTlQYXRjaCgpIHsKLSAgICAgICAgaW50IHdpZHRoID0gaW1hZ2UuZ2V0V2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGltYWdlLmdldEhlaWdodCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBwaXhlbCA9IGltYWdlLmdldFJHQihpLCAwKTsKLSAgICAgICAgICAgIGlmIChwaXhlbCAhPSAwICYmIHBpeGVsICE9IDB4RkYwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBpbWFnZS5zZXRSR0IoaSwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbCA9IGltYWdlLmdldFJHQihpLCBoZWlnaHQgLSAxKTsKLSAgICAgICAgICAgIGlmIChwaXhlbCAhPSAwICYmIHBpeGVsICE9IDB4RkYwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBpbWFnZS5zZXRSR0IoaSwgaGVpZ2h0IC0gMSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgaW50IHBpeGVsID0gaW1hZ2UuZ2V0UkdCKDAsIGkpOwotICAgICAgICAgICAgaWYgKHBpeGVsICE9IDAgJiYgcGl4ZWwgIT0gMHhGRjAwMDAwMCkgewotICAgICAgICAgICAgICAgIGltYWdlLnNldFJHQigwLCBpLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeGVsID0gaW1hZ2UuZ2V0UkdCKHdpZHRoIC0gMSwgaSk7Ci0gICAgICAgICAgICBpZiAocGl4ZWwgIT0gMCAmJiBwaXhlbCAhPSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2Uuc2V0UkdCKHdpZHRoIC0gMSwgaSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29udmVydFRvOVBhdGNoKCkgewotICAgICAgICBCdWZmZXJlZEltYWdlIGJ1ZmZlciA9IEdyYXBoaWNzVXRpbGl0aWVzLmNyZWF0ZVRyYW5zbHVjZW50Q29tcGF0aWJsZUltYWdlKAotICAgICAgICAgICAgICAgIGltYWdlLmdldFdpZHRoKCkgKyAyLCBpbWFnZS5nZXRIZWlnaHQoKSArIDIpOwotCi0gICAgICAgIEdyYXBoaWNzMkQgZzIgPSBidWZmZXIuY3JlYXRlR3JhcGhpY3MoKTsKLSAgICAgICAgZzIuZHJhd0ltYWdlKGltYWdlLCAxLCAxLCBudWxsKTsKLSAgICAgICAgZzIuZGlzcG9zZSgpOwotCi0gICAgICAgIGltYWdlID0gYnVmZmVyOwotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKSArICIuOS5wbmciOwotICAgIH0KLQotICAgIEZpbGUgY2hvb3NlU2F2ZUZpbGUoKSB7Ci0gICAgICAgIGlmIChpczlQYXRjaCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IFBuZ0ZpbGVGaWx0ZXIoKSk7Ci0gICAgICAgICAgICBpbnQgY2hvaWNlID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyh0aGlzKTsKLSAgICAgICAgICAgIGlmIChjaG9pY2UgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoRVhURU5TSU9OXzlQQVRDSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLnBuZyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZigiLnBuZyIpKSArIEVYVEVOU0lPTl85UEFUQ0g7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCArIEVYVEVOU0lPTl85UEFUQ0g7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIGlzOVBhdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpczlQYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgUmVuZGVyZWRJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3RyZXRjaGVzVmlld2VyIGV4dGVuZHMgSlBhbmVsIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTiA9IDI0OwotCi0gICAgICAgIHByaXZhdGUgU3RyZXRjaFZpZXcgaG9yaXpvbnRhbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJldGNoVmlldyB2ZXJ0aWNhbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJldGNoVmlldyBib3RoOwotCi0gICAgICAgIHByaXZhdGUgRGltZW5zaW9uIHNpemU7Ci0KLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBob3Jpem9udGFsUGF0Y2hlc1N1bTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCB2ZXJ0aWNhbFBhdGNoZXNTdW07Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3dQYWRkaW5nOwotCi0gICAgICAgIFN0cmV0Y2hlc1ZpZXdlcigpIHsKLSAgICAgICAgICAgIHNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgICAgICBzZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0gICAgICAgICAgICBzZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcihNQVJHSU4sIE1BUkdJTiwgTUFSR0lOLCBNQVJHSU4pKTsKLQotICAgICAgICAgICAgaG9yaXpvbnRhbCA9IG5ldyBTdHJldGNoVmlldygpOwotICAgICAgICAgICAgdmVydGljYWwgPSBuZXcgU3RyZXRjaFZpZXcoKTsKLSAgICAgICAgICAgIGJvdGggPSBuZXcgU3RyZXRjaFZpZXcoKTsKLQotICAgICAgICAgICAgc2V0U2NhbGUoREVGQVVMVF9TQ0FMRSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFkZCh2ZXJ0aWNhbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAxLjAsIDEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLSAgICAgICAgICAgIGFkZChob3Jpem9udGFsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDEuMCwgMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICAgICAgYWRkKGJvdGgsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMS4wLCAxLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsCi0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILCBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgR3JhcGhpY3MyRCBnMiA9IChHcmFwaGljczJEKSBnLmNyZWF0ZSgpOwotICAgICAgICAgICAgZzIuc2V0UGFpbnQodGV4dHVyZSk7Ci0gICAgICAgICAgICBnMi5maWxsUmVjdCgwLCAwLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFNjYWxlKGZsb2F0IHNjYWxlKSB7Ci0gICAgICAgICAgICBpbnQgcGF0Y2hXaWR0aCA9IGltYWdlLmdldFdpZHRoKCkgLSAyOwotICAgICAgICAgICAgaW50IHBhdGNoSGVpZ2h0ID0gaW1hZ2UuZ2V0SGVpZ2h0KCkgLSAyOwotCi0gICAgICAgICAgICBpbnQgc2NhbGVkV2lkdGggPSAoaW50KSAocGF0Y2hXaWR0aCAqIHNjYWxlKTsKLSAgICAgICAgICAgIGludCBzY2FsZWRIZWlnaHQgPSAoaW50KSAocGF0Y2hIZWlnaHQgKiBzY2FsZSk7Ci0KLSAgICAgICAgICAgIGhvcml6b250YWwuc2NhbGVkV2lkdGggPSBzY2FsZWRXaWR0aDsKLSAgICAgICAgICAgIHZlcnRpY2FsLnNjYWxlZEhlaWdodCA9IHNjYWxlZEhlaWdodDsKLSAgICAgICAgICAgIGJvdGguc2NhbGVkV2lkdGggPSBzY2FsZWRXaWR0aDsKLSAgICAgICAgICAgIGJvdGguc2NhbGVkSGVpZ2h0ID0gc2NhbGVkSGVpZ2h0OwotCi0gICAgICAgICAgICBzaXplID0gbmV3IERpbWVuc2lvbihzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0KTsKLQotICAgICAgICAgICAgY29tcHV0ZVBhdGNoZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZVBhdGNoZXMoKSB7Ci0gICAgICAgICAgICBib29sZWFuIG1lYXN1cmVkV2lkdGggPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5kUm93ID0gdHJ1ZTsKLQotICAgICAgICAgICAgaW50IHJlbWFpbmRlckhvcml6b250YWwgPSAwOwotICAgICAgICAgICAgaW50IHJlbWFpbmRlclZlcnRpY2FsID0gMDsKLQotICAgICAgICAgICAgaWYgKGZpeGVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBmaXhlZC5nZXQoMCkueTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSByZWN0IDogZml4ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QueSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRSb3cgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWFzdXJlZFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXJIb3Jpem9udGFsICs9IHJlY3Qud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyVmVydGljYWwgKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRSb3cgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVjdC55OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBob3Jpem9udGFsLnJlbWFpbmRlckhvcml6b250YWwgPSBob3Jpem9udGFsLnNjYWxlZFdpZHRoIC0gcmVtYWluZGVySG9yaXpvbnRhbDsKLSAgICAgICAgICAgIHZlcnRpY2FsLnJlbWFpbmRlckhvcml6b250YWwgPSB2ZXJ0aWNhbC5zY2FsZWRXaWR0aCAtIHJlbWFpbmRlckhvcml6b250YWw7Ci0gICAgICAgICAgICBib3RoLnJlbWFpbmRlckhvcml6b250YWwgPSBib3RoLnNjYWxlZFdpZHRoIC0gcmVtYWluZGVySG9yaXpvbnRhbDsKLQotICAgICAgICAgICAgaG9yaXpvbnRhbC5yZW1haW5kZXJWZXJ0aWNhbCA9IGhvcml6b250YWwuc2NhbGVkSGVpZ2h0IC0gcmVtYWluZGVyVmVydGljYWw7Ci0gICAgICAgICAgICB2ZXJ0aWNhbC5yZW1haW5kZXJWZXJ0aWNhbCA9IHZlcnRpY2FsLnNjYWxlZEhlaWdodCAtIHJlbWFpbmRlclZlcnRpY2FsOwotICAgICAgICAgICAgYm90aC5yZW1haW5kZXJWZXJ0aWNhbCA9IGJvdGguc2NhbGVkSGVpZ2h0IC0gcmVtYWluZGVyVmVydGljYWw7Ci0KLSAgICAgICAgICAgIGhvcml6b250YWxQYXRjaGVzU3VtID0gMDsKLSAgICAgICAgICAgIGlmIChob3Jpem9udGFsUGF0Y2hlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcmVjdCA6IGhvcml6b250YWxQYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LnggPiBzdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBhdGNoZXNTdW0gKz0gcmVjdC53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVjdC54OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSByZWN0IDogcGF0Y2hlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC54ID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQYXRjaGVzU3VtICs9IHJlY3Qud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlY3QueDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmVydGljYWxQYXRjaGVzU3VtID0gMDsKLSAgICAgICAgICAgIGlmICh2ZXJ0aWNhbFBhdGNoZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IC0xOwotICAgICAgICAgICAgICAgIGZvciAoUmVjdGFuZ2xlIHJlY3QgOiB2ZXJ0aWNhbFBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QueSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFBhdGNoZXNTdW0gKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlY3QueTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcmVjdCA6IHBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QueSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFBhdGNoZXNTdW0gKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlY3QueTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0U2l6ZShzaXplKTsKLSAgICAgICAgICAgIEltYWdlRWRpdG9yUGFuZWwudGhpcy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRQYWRkaW5nVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIHNob3dQYWRkaW5nID0gdmlzaWJsZTsKLSAgICAgICAgICAgIHJlcGFpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgU3RyZXRjaFZpZXcgZXh0ZW5kcyBKQ29tcG9uZW50IHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgUEFERElOR19DT0xPUiA9IG5ldyBDb2xvcigwLjM3ZiwgMC4zN2YsIDEuMGYsIDAuNWYpOwotCi0gICAgICAgICAgICBpbnQgc2NhbGVkV2lkdGg7Ci0gICAgICAgICAgICBpbnQgc2NhbGVkSGVpZ2h0OwotCi0gICAgICAgICAgICBpbnQgcmVtYWluZGVySG9yaXpvbnRhbDsKLSAgICAgICAgICAgIGludCByZW1haW5kZXJWZXJ0aWNhbDsKLQotICAgICAgICAgICAgU3RyZXRjaFZpZXcoKSB7Ci0gICAgICAgICAgICAgICAgc2NhbGVkV2lkdGggPSBpbWFnZS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIHNjYWxlZEhlaWdodCA9IGltYWdlLmdldEhlaWdodCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgICAgICBpbnQgeCA9IChnZXRXaWR0aCgpIC0gc2NhbGVkV2lkdGgpIC8gMjsKLSAgICAgICAgICAgICAgICBpbnQgeSA9IChnZXRIZWlnaHQoKSAtIHNjYWxlZEhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICAgICAgR3JhcGhpY3MyRCBnMiA9IChHcmFwaGljczJEKSBnLmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGcyLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0lOVEVSUE9MQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5WQUxVRV9JTlRFUlBPTEFUSU9OX0JJTElORUFSKTsKLSAgICAgICAgICAgICAgICBnLnRyYW5zbGF0ZSh4LCB5KTsKLQotICAgICAgICAgICAgICAgIHggPSAwOwotICAgICAgICAgICAgICAgIHkgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhdGNoZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHNjYWxlZFdpZHRoLCBzY2FsZWRIZWlnaHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgZml4ZWRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhvcml6b250YWxJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IHZlcnRpY2FsSW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGludCBwYXRjaEluZGV4ID0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaFN0cmV0Y2g7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2U3RyZXRjaDsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHZXZWlnaHRTdW0gPSAxLjBmOwotICAgICAgICAgICAgICAgIGZsb2F0IHZSZW1haW5kZXIgPSByZW1haW5kZXJWZXJ0aWNhbDsKLQotICAgICAgICAgICAgICAgIHZTdHJldGNoID0gdmVydGljYWxTdGFydFdpdGhQYXRjaDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoeSA8IHNjYWxlZEhlaWdodCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaFN0cmV0Y2ggPSBob3Jpem9udGFsU3RhcnRXaXRoUGF0Y2g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHZFeHRyYSA9IDAuMGY7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaFdlaWdodFN1bSA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGhSZW1haW5kZXIgPSByZW1haW5kZXJIb3Jpem9udGFsOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgc2NhbGVkV2lkdGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdlN0cmV0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFN0cmV0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGhvcml6b250YWxQYXRjaGVzLmdldChob3Jpem9udGFsSW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGV4dHJhID0gci53aWR0aCAvIGhvcml6b250YWxQYXRjaGVzU3VtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSAoaW50KSAoZXh0cmEgKiBoUmVtYWluZGVyIC8gaFdlaWdodFN1bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXZWlnaHRTdW0gLT0gZXh0cmE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSZW1haW5kZXIgLT0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCB4LCB5LCB4ICsgd2lkdGgsIHkgKyByLmhlaWdodCwgci54LCByLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci54ICsgci53aWR0aCwgci55ICsgci5oZWlnaHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmaXhlZC5nZXQoZml4ZWRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHksIHggKyByLndpZHRoLCB5ICsgci5oZWlnaHQsIHIueCwgci55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueCArIHIud2lkdGgsIHIueSArIHIuaGVpZ2h0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSByLndpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSByLmhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhTdHJldGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBwYXRjaGVzLmdldChwYXRjaEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXh0cmEgPSByLmhlaWdodCAvIHZlcnRpY2FsUGF0Y2hlc1N1bTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gKGludCkgKHZFeHRyYSAqIHZSZW1haW5kZXIgLyB2V2VpZ2h0U3VtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZXh0cmEgPSByLndpZHRoIC8gaG9yaXpvbnRhbFBhdGNoZXNTdW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChleHRyYSAqIGhSZW1haW5kZXIgLyBoV2VpZ2h0U3VtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFdlaWdodFN1bSAtPSBleHRyYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJlbWFpbmRlciAtPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgci54LCByLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci54ICsgci53aWR0aCwgci55ICsgci5oZWlnaHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB2ZXJ0aWNhbFBhdGNoZXMuZ2V0KHZlcnRpY2FsSW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFeHRyYSA9IHIuaGVpZ2h0IC8gdmVydGljYWxQYXRjaGVzU3VtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAoaW50KSAodkV4dHJhICogdlJlbWFpbmRlciAvIHZXZWlnaHRTdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWFnZSwgeCwgeSwgeCArIHIud2lkdGgsIHkgKyBoZWlnaHQsIHIueCwgci55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueCArIHIud2lkdGgsIHIueSArIHIuaGVpZ2h0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSByLndpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhTdHJldGNoID0gIWhTdHJldGNoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHggPSAwOwotICAgICAgICAgICAgICAgICAgICB5ICs9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZTdHJldGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2V2VpZ2h0U3VtIC09IHZFeHRyYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZSZW1haW5kZXIgLT0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZTdHJldGNoID0gIXZTdHJldGNoOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzaG93UGFkZGluZykgewotICAgICAgICAgICAgICAgICAgICBnLnNldENvbG9yKFBBRERJTkdfQ09MT1IpOwotICAgICAgICAgICAgICAgICAgICBnLmZpbGxSZWN0KGhvcml6b250YWxQYWRkaW5nLmZpcnN0LCB2ZXJ0aWNhbFBhZGRpbmcuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkV2lkdGggLSBob3Jpem9udGFsUGFkZGluZy5maXJzdCAtIGhvcml6b250YWxQYWRkaW5nLnNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRIZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmcuZmlyc3QgLSB2ZXJ0aWNhbFBhZGRpbmcuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBJbWFnZVZpZXdlciBleHRlbmRzIEpDb21wb25lbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIENPUlJVUFRFRF9DT0xPUiA9IG5ldyBDb2xvcigxLjBmLCAwLjBmLCAwLjBmLCAwLjdmKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBMT0NLX0NPTE9SID0gbmV3IENvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuN2YpOwotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIFNUUklQRVNfQ09MT1IgPSBuZXcgQ29sb3IoMS4wZiwgMC4wZiwgMC4wZiwgMC41Zik7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgQkFDS19DT0xPUiA9IG5ldyBDb2xvcigweGMwYzBjMCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgSEVMUF9DT0xPUiA9IG5ldyBDb2xvcigweGZmZmZlMSk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgUEFUQ0hfQ09MT1IgPSBuZXcgQ29sb3IoMS4wZiwgMC4zN2YsIDAuOTlmLCAwLjVmKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBQQVRDSF9PTkVXQVlfQ09MT1IgPSBuZXcgQ29sb3IoMC4zN2YsIDEuMGYsIDAuMzdmLCAwLjVmKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTVFJJUEVTX1dJRFRIID0gNC4wZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNUUklQRVNfU1BBQ0lORyA9IDYuMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklQRVNfQU5HTEUgPSA0NTsKLQotICAgICAgICBwcml2YXRlIGludCB6b29tOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvd1BhdGNoZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TG9jayA9IHRydWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBEaW1lbnNpb24gc2l6ZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0gICAgICAgIHByaXZhdGUgaW50W10gcm93OwotICAgICAgICBwcml2YXRlIGludFtdIGNvbHVtbjsKLQotICAgICAgICBwcml2YXRlIGludCBsYXN0UG9zaXRpb25YOwotICAgICAgICBwcml2YXRlIGludCBsYXN0UG9zaXRpb25ZOwotICAgICAgICBwcml2YXRlIGludCBjdXJyZW50QnV0dG9uOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvd0N1cnNvcjsKLQotICAgICAgICBwcml2YXRlIEpMYWJlbCBoZWxwTGFiZWw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlcmFzZU1vZGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGNoZWNrQnV0dG9uOwotICAgICAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBjb3JydXB0ZWRQYXRjaGVzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvd0JhZFBhdGNoZXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgaGVscFBhbmVsOwotCi0gICAgICAgIEltYWdlVmlld2VyKCkgewotICAgICAgICAgICAgc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotICAgICAgICAgICAgaGVscFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgaGVscFBhbmVsLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCwgNiwgMCwgNikpOwotICAgICAgICAgICAgaGVscFBhbmVsLnNldEJhY2tncm91bmQoSEVMUF9DT0xPUik7Ci0gICAgICAgICAgICBoZWxwTGFiZWwgPSBuZXcgSkxhYmVsKCJQcmVzcyBTaGlmdCB0byBlcmFzZSBwaXhlbHMiKTsKLSAgICAgICAgICAgIGhlbHBMYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOyAgICAgICAgICAgIAotICAgICAgICAgICAgaGVscFBhbmVsLmFkZChoZWxwTGFiZWwsIEJvcmRlckxheW91dC5XRVNUKTsKLSAgICAgICAgICAgIGNoZWNrQnV0dG9uID0gbmV3IEpCdXR0b24oIlNob3cgYmFkIHBhdGNoZXMiKTsKLSAgICAgICAgICAgIGNoZWNrQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgICAgICBjaGVja0J1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5idXR0b25UeXBlIiwgInJvdW5kUmVjdCIpOwotICAgICAgICAgICAgaGVscFBhbmVsLmFkZChjaGVja0J1dHRvbiwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCi0gICAgICAgICAgICBhZGQoaGVscFBhbmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYsIDEuMGYsIEdyaWRCYWdDb25zdHJhaW50cy5GSVJTVF9MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgICAgICBzZXRPcGFxdWUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNldFpvb20oREVGQVVMVF9aT09NKTsKLSAgICAgICAgICAgIGZpbmRQYXRjaGVzKCk7Ci0KLSAgICAgICAgICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgYnV0dG9uIGhlcmUgaW5zdGVhZCBvZiByZXRyaWV2aW5nIGl0IGFnYWluIGluIE1vdXNlRHJhZ2dlZAotICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgYmVjYXVzZSBvbiBsaW51eCwgY2FsbGluZyBNb3VzZUV2ZW50LmdldEJ1dHRvbigpIGZvciB0aGUgZHJhZwotICAgICAgICAgICAgICAgICAgICAvLyBldmVudCByZXR1cm5zIDAsIHdoaWNoIGFwcGVhcnMgdG8gYmUgdGVjaG5pY2FsbHkgY29ycmVjdCAobm8gYnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZWQgc3RhdGUpLgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnV0dG9uID0gZXZlbnQuaXNTaGlmdERvd24oKSA/IE1vdXNlRXZlbnQuQlVUVE9OMyA6IGV2ZW50LmdldEJ1dHRvbigpOwotICAgICAgICAgICAgICAgICAgICBwYWludChldmVudC5nZXRYKCksIGV2ZW50LmdldFkoKSwgY3VycmVudEJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhZGRNb3VzZU1vdGlvbkxpc3RlbmVyKG5ldyBNb3VzZU1vdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEcmFnZ2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0xvY2tlZFJlZ2lvbihldmVudC5nZXRYKCksIGV2ZW50LmdldFkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RvcmVkIGJ1dHRvbiwgc2VlIG5vdGUgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KGV2ZW50LmdldFgoKSwgZXZlbnQuZ2V0WSgpLCAgY3VycmVudEJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2NrZWRSZWdpb24oZXZlbnQuZ2V0WCgpLCBldmVudC5nZXRZKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmFkZEFXVEV2ZW50TGlzdGVuZXIobmV3IEFXVEV2ZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXZlbnREaXNwYXRjaGVkKEFXVEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZUVyYXNlTW9kZSgoS2V5RXZlbnQpIGV2ZW50KTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKLQotICAgICAgICAgICAgY2hlY2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dCYWRQYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQmFkUGF0Y2hlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tCdXR0b24uc2V0VGV4dCgiSGlkZSBiYWQgcGF0Y2hlcyIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tCdXR0b24uc2V0VGV4dCgiU2hvdyBiYWQgcGF0Y2hlcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkUGF0Y2hlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93QmFkUGF0Y2hlcyA9ICFzaG93QmFkUGF0Y2hlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBmaW5kQmFkUGF0Y2hlcygpIHsKLSAgICAgICAgICAgIGNvcnJ1cHRlZFBhdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFJlY3RhbmdsZT4oKTsKLQotICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcGF0Y2ggOiBwYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcnJ1cHRQYXRjaChwYXRjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkUGF0Y2hlcy5hZGQocGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcGF0Y2ggOiBob3Jpem9udGFsUGF0Y2hlcykgewotICAgICAgICAgICAgICAgIGlmIChjb3JydXB0SG9yaXpvbnRhbFBhdGNoKHBhdGNoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3JydXB0ZWRQYXRjaGVzLmFkZChwYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSBwYXRjaCA6IHZlcnRpY2FsUGF0Y2hlcykgewotICAgICAgICAgICAgICAgIGlmIChjb3JydXB0VmVydGljYWxQYXRjaChwYXRjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkUGF0Y2hlcy5hZGQocGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb3JydXB0UGF0Y2goUmVjdGFuZ2xlIHBhdGNoKSB7Ci0gICAgICAgICAgICBpbnRbXSBwaXhlbHMgPSBHcmFwaGljc1V0aWxpdGllcy5nZXRQaXhlbHMoaW1hZ2UsIHBhdGNoLngsIHBhdGNoLnksCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoLndpZHRoLCBwYXRjaC5oZWlnaHQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAocGl4ZWxzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVmZXJlbmNlID0gcGl4ZWxzWzBdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHBpeGVsIDogcGl4ZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbCAhPSByZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY29ycnVwdEhvcml6b250YWxQYXRjaChSZWN0YW5nbGUgcGF0Y2gpIHsKLSAgICAgICAgICAgIGludFtdIHJlZmVyZW5jZSA9IG5ldyBpbnRbcGF0Y2guaGVpZ2h0XTsKLSAgICAgICAgICAgIGludFtdIGNvbHVtbiA9IG5ldyBpbnRbcGF0Y2guaGVpZ2h0XTsKLSAgICAgICAgICAgIHJlZmVyZW5jZSA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhpbWFnZSwgcGF0Y2gueCwgcGF0Y2gueSwKLSAgICAgICAgICAgICAgICAgICAgMSwgcGF0Y2guaGVpZ2h0LCByZWZlcmVuY2UpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhdGNoLndpZHRoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb2x1bW4gPSBHcmFwaGljc1V0aWxpdGllcy5nZXRQaXhlbHMoaW1hZ2UsIHBhdGNoLnggKyBpLCBwYXRjaC55LAotICAgICAgICAgICAgICAgICAgICAgICAgMSwgcGF0Y2guaGVpZ2h0LCBjb2x1bW4pOwotICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhyZWZlcmVuY2UsIGNvbHVtbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY29ycnVwdFZlcnRpY2FsUGF0Y2goUmVjdGFuZ2xlIHBhdGNoKSB7Ci0gICAgICAgICAgICBpbnRbXSByZWZlcmVuY2UgPSBuZXcgaW50W3BhdGNoLndpZHRoXTsKLSAgICAgICAgICAgIGludFtdIHJvdyA9IG5ldyBpbnRbcGF0Y2gud2lkdGhdOwotICAgICAgICAgICAgcmVmZXJlbmNlID0gR3JhcGhpY3NVdGlsaXRpZXMuZ2V0UGl4ZWxzKGltYWdlLCBwYXRjaC54LCBwYXRjaC55LAotICAgICAgICAgICAgICAgICAgICBwYXRjaC53aWR0aCwgMSwgcmVmZXJlbmNlKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXRjaC5oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJvdyA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhpbWFnZSwgcGF0Y2gueCwgcGF0Y2gueSArIGksIHBhdGNoLndpZHRoLCAxLCByb3cpOwotICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhyZWZlcmVuY2UsIHJvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW5hYmxlRXJhc2VNb2RlKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBib29sZWFuIG9sZEVyYXNlTW9kZSA9IGVyYXNlTW9kZTsKLSAgICAgICAgICAgIGVyYXNlTW9kZSA9IGV2ZW50LmlzU2hpZnREb3duKCk7Ci0gICAgICAgICAgICBpZiAoZXJhc2VNb2RlICE9IG9sZEVyYXNlTW9kZSkgewotICAgICAgICAgICAgICAgIGlmIChlcmFzZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGVscExhYmVsLnNldFRleHQoIlJlbGVhc2UgU2hpZnQgdG8gZHJhdyBwaXhlbHMiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoZWxwTGFiZWwuc2V0VGV4dCgiUHJlc3MgU2hpZnQgdG8gZXJhc2UgcGl4ZWxzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBhaW50KGludCB4LCBpbnQgeSwgaW50IGJ1dHRvbikgewotICAgICAgICAgICAgaW50IGNvbG9yOwotICAgICAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdXNlRXZlbnQuQlVUVE9OMToKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdXNlRXZlbnQuQlVUVE9OMzoKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBsZWZ0ID0gKGdldFdpZHRoKCkgLSBzaXplLndpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKGhlbHBQYW5lbC5nZXRIZWlnaHQoKSArIGdldEhlaWdodCgpIC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgeCA9ICh4IC0gbGVmdCkgLyB6b29tOwotICAgICAgICAgICAgeSA9ICh5IC0gdG9wKSAvIHpvb207Ci0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IGltYWdlLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gaW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoKCh4ID09IDAgfHwgeCA9PSB3aWR0aCAtIDEpICYmICh5ID4gMCAmJiB5IDwgaGVpZ2h0IC0gMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoeCA+IDAgJiYgeCA8IHdpZHRoIC0gMSkgJiYgKHkgPT0gMCB8fCB5ID09IGhlaWdodCAtIDEpKSkgewotICAgICAgICAgICAgICAgIGltYWdlLnNldFJHQih4LCB5LCBjb2xvcik7Ci0gICAgICAgICAgICAgICAgZmluZFBhdGNoZXMoKTsKLSAgICAgICAgICAgICAgICBzdHJldGNoZXNWaWV3ZXIuY29tcHV0ZVBhdGNoZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvd0JhZFBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZEJhZFBhdGNoZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrTG9ja2VkUmVnaW9uKGludCB4LCBpbnQgeSkgewotICAgICAgICAgICAgaW50IG9sZFggPSBsYXN0UG9zaXRpb25YOwotICAgICAgICAgICAgaW50IG9sZFkgPSBsYXN0UG9zaXRpb25ZOwotICAgICAgICAgICAgbGFzdFBvc2l0aW9uWCA9IHg7Ci0gICAgICAgICAgICBsYXN0UG9zaXRpb25ZID0geTsKLQotICAgICAgICAgICAgaW50IGxlZnQgPSAoZ2V0V2lkdGgoKSAtIHNpemUud2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGludCB0b3AgPSAoaGVscFBhbmVsLmdldEhlaWdodCgpICsgZ2V0SGVpZ2h0KCkgLSBzaXplLmhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICB4ID0gKHggLSBsZWZ0KSAvIHpvb207Ci0gICAgICAgICAgICB5ID0gKHkgLSB0b3ApIC8gem9vbTsKLQotICAgICAgICAgICAgaW50IHdpZHRoID0gaW1hZ2UuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSBpbWFnZS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgeExhYmVsLnNldFRleHQoTWF0aC5tYXgoMCwgTWF0aC5taW4oeCwgd2lkdGggLSAxKSkgKyAiIHB4Iik7Ci0gICAgICAgICAgICB5TGFiZWwuc2V0VGV4dChNYXRoLm1heCgwLCBNYXRoLm1pbih5LCBoZWlnaHQgLSAxKSkgKyAiIHB4Iik7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcHJldmlvdXNMb2NrID0gbG9ja2VkOwotICAgICAgICAgICAgbG9ja2VkID0geCA+IDAgJiYgeCA8IHdpZHRoIC0gMSAmJiB5ID4gMCAmJiB5IDwgaGVpZ2h0IC0gMTsKLQotICAgICAgICAgICAgYm9vbGVhbiBwcmV2aW91c0N1cnNvciA9IHNob3dDdXJzb3I7Ci0gICAgICAgICAgICBzaG93Q3Vyc29yID0gKCh4ID09IDAgfHwgeCA9PSB3aWR0aCAtIDEpICYmICh5ID4gMCAmJiB5IDwgaGVpZ2h0IC0gMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoeCA+IDAgJiYgeCA8IHdpZHRoIC0gMSkgJiYgKHkgPT0gMCB8fCB5ID09IGhlaWdodCAtIDEpKTsKLQotICAgICAgICAgICAgaWYgKGxvY2tlZCAhPSBwcmV2aW91c0xvY2spIHsKLSAgICAgICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dDdXJzb3IgfHwgKHNob3dDdXJzb3IgIT0gcHJldmlvdXNDdXJzb3IpKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGNsaXAgPSBuZXcgUmVjdGFuZ2xlKGxhc3RQb3NpdGlvblggLSAxIC0gem9vbSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zaXRpb25ZIC0gMSAtIHpvb20gLyAyLCB6b29tICsgMiwgem9vbSArIDIpOwotICAgICAgICAgICAgICAgIGNsaXAgPSBjbGlwLnVuaW9uKG5ldyBSZWN0YW5nbGUob2xkWCAtIDEgLSB6b29tIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZFkgLSAxIC0gem9vbSAvIDIsIHpvb20gKyAyLCB6b29tICsgMikpOwotICAgICAgICAgICAgICAgIHJlcGFpbnQoY2xpcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBsb2NrZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgaW50IHggPSAoZ2V0V2lkdGgoKSAtIHNpemUud2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGludCB5ID0gKGhlbHBQYW5lbC5nZXRIZWlnaHQoKSArIGdldEhlaWdodCgpIC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgR3JhcGhpY3MyRCBnMiA9IChHcmFwaGljczJEKSBnLmNyZWF0ZSgpOwotICAgICAgICAgICAgZzIuc2V0Q29sb3IoQkFDS19DT0xPUik7Ci0gICAgICAgICAgICBnMi5maWxsUmVjdCgwLCAwLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgIGcyLnRyYW5zbGF0ZSh4LCB5KTsKLSAgICAgICAgICAgIGcyLnNldFBhaW50KHRleHR1cmUpOwotICAgICAgICAgICAgZzIuZmlsbFJlY3QoMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotICAgICAgICAgICAgZzIuc2NhbGUoem9vbSwgem9vbSk7Ci0gICAgICAgICAgICBnMi5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzLlZBTFVFX0FOVElBTElBU19PTik7Ci0gICAgICAgICAgICBnMi5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9JTlRFUlBPTEFUSU9OLAotICAgICAgICAgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5WQUxVRV9JTlRFUlBPTEFUSU9OX05FQVJFU1RfTkVJR0hCT1IpOwotICAgICAgICAgICAgZzIuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHNob3dQYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgZzIuc2V0Q29sb3IoUEFUQ0hfQ09MT1IpOwotICAgICAgICAgICAgICAgIGZvciAoUmVjdGFuZ2xlIHBhdGNoIDogcGF0Y2hlcykgewotICAgICAgICAgICAgICAgICAgICBnMi5maWxsUmVjdChwYXRjaC54LCBwYXRjaC55LCBwYXRjaC53aWR0aCwgcGF0Y2guaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZzIuc2V0Q29sb3IoUEFUQ0hfT05FV0FZX0NPTE9SKTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSBwYXRjaCA6IGhvcml6b250YWxQYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGcyLmZpbGxSZWN0KHBhdGNoLngsIHBhdGNoLnksIHBhdGNoLndpZHRoLCBwYXRjaC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSBwYXRjaCA6IHZlcnRpY2FsUGF0Y2hlcykgewotICAgICAgICAgICAgICAgICAgICBnMi5maWxsUmVjdChwYXRjaC54LCBwYXRjaC55LCBwYXRjaC53aWR0aCwgcGF0Y2guaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3JydXB0ZWRQYXRjaGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihDT1JSVVBURURfQ09MT1IpOwotICAgICAgICAgICAgICAgIGcyLnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2UoMy4wZiAvIHpvb20pKTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSBwYXRjaCA6IGNvcnJ1cHRlZFBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZzIuZHJhdyhuZXcgUm91bmRSZWN0YW5nbGUyRC5GbG9hdChwYXRjaC54IC0gMi4wZiAvIHpvb20sIHBhdGNoLnkgLSAyLjBmIC8gem9vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC53aWR0aCArIDIuMGYgLyB6b29tLCBwYXRjaC5oZWlnaHQgKyAyLjBmIC8gem9vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjBmIC8gem9vbSwgNi4wZiAvIHpvb20pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaG93TG9jayAmJiBsb2NrZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBpbWFnZS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBpbWFnZS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGcyLnNldENvbG9yKExPQ0tfQ09MT1IpOwotICAgICAgICAgICAgICAgIGcyLmZpbGxSZWN0KDEsIDEsIHdpZHRoIC0gMiwgaGVpZ2h0IC0gMik7Ci0KLSAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihTVFJJUEVTX0NPTE9SKTsKLSAgICAgICAgICAgICAgICBnMi50cmFuc2xhdGUoMSwgMSk7Ci0gICAgICAgICAgICAgICAgcGFpbnRTdHJpcGVzKGcyLCB3aWR0aCAtIDIsIGhlaWdodCAtIDIpOwotICAgICAgICAgICAgICAgIGcyLnRyYW5zbGF0ZSgtMSwgLTEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0KLSAgICAgICAgICAgIGlmIChzaG93Q3Vyc29yKSB7Ci0gICAgICAgICAgICAgICAgR3JhcGhpY3MgY3Vyc29yID0gZy5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBjdXJzb3Iuc2V0WE9STW9kZShDb2xvci5XSElURSk7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLnNldENvbG9yKENvbG9yLkJMQUNLKTsKLSAgICAgICAgICAgICAgICBjdXJzb3IuZHJhd1JlY3QobGFzdFBvc2l0aW9uWCAtIHpvb20gLyAyLCBsYXN0UG9zaXRpb25ZIC0gem9vbSAvIDIsIHpvb20sIHpvb20pOwotICAgICAgICAgICAgICAgIGN1cnNvci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcGFpbnRTdHJpcGVzKEdyYXBoaWNzMkQgZywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAvL2RyYXdzIHBpbnN0cmlwZXMgYXQgdGhlIGFuZ2xlIHNwZWNpZmllZCBpbiB0aGlzIGNsYXNzCi0gICAgICAgICAgICAvL2FuZCBhdCB0aGUgZ2l2ZW4gZGlzdGFuY2UgYXBhcnQKLSAgICAgICAgICAgIFNoYXBlIG9sZENsaXAgPSBnLmdldENsaXAoKTsKLSAgICAgICAgICAgIEFyZWEgYXJlYSA9IG5ldyBBcmVhKG5ldyBSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgaWYob2xkQ2xpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJlYSA9IG5ldyBBcmVhKG9sZENsaXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJlYS5pbnRlcnNlY3QobmV3IEFyZWEobmV3IFJlY3RhbmdsZSgwLDAsd2lkdGgsaGVpZ2h0KSkpOwotICAgICAgICAgICAgZy5zZXRDbGlwKGFyZWEpOwotCi0gICAgICAgICAgICBnLnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2UoU1RSSVBFU19XSURUSCkpOwotCi0gICAgICAgICAgICBkb3VibGUgaHlwTGVuZ3RoID0gTWF0aC5zcXJ0KCh3aWR0aCAqIHdpZHRoKSArCi0gICAgICAgICAgICAgICAgICAgIChoZWlnaHQgKiBoZWlnaHQpKTsKLQotICAgICAgICAgICAgZG91YmxlIHJhZGlhbnMgPSBNYXRoLnRvUmFkaWFucyhTVFJJUEVTX0FOR0xFKTsKLSAgICAgICAgICAgIGcucm90YXRlKHJhZGlhbnMpOwotCi0gICAgICAgICAgICBkb3VibGUgc3BhY2luZyA9IFNUUklQRVNfU1BBQ0lORzsKLSAgICAgICAgICAgIHNwYWNpbmcgKz0gU1RSSVBFU19XSURUSDsKLSAgICAgICAgICAgIGludCBudW1MaW5lcyA9IChpbnQpKGh5cExlbmd0aCAvIHNwYWNpbmcpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtTGluZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gaSAqIHNwYWNpbmc7Ci0gICAgICAgICAgICAgICAgTGluZTJEIGxpbmUgPSBuZXcgTGluZTJELkRvdWJsZSh4LCAtaHlwTGVuZ3RoLCB4LCBoeXBMZW5ndGgpOwotICAgICAgICAgICAgICAgIGcuZHJhdyhsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGcuc2V0Q2xpcChvbGRDbGlwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Wm9vbShpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IGltYWdlLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gaW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIHpvb20gPSB2YWx1ZTsKLSAgICAgICAgICAgIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoICogem9vbSwgaGVpZ2h0ICogem9vbSk7Ci0KLSAgICAgICAgICAgIHNldFNpemUoc2l6ZSk7Ci0gICAgICAgICAgICBJbWFnZUVkaXRvclBhbmVsLnRoaXMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJlcGFpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UGF0Y2hlc1Zpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBzaG93UGF0Y2hlcyA9IHZpc2libGU7Ci0gICAgICAgICAgICBmaW5kUGF0Y2hlcygpOwotICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRQYXRjaGVzKCkgewotICAgICAgICAgICAgaW50IHdpZHRoID0gaW1hZ2UuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSBpbWFnZS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgcm93ID0gR3JhcGhpY3NVdGlsaXRpZXMuZ2V0UGl4ZWxzKGltYWdlLCAwLCAwLCB3aWR0aCwgMSwgcm93KTsKLSAgICAgICAgICAgIGNvbHVtbiA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhpbWFnZSwgMCwgMCwgMSwgaGVpZ2h0LCBjb2x1bW4pOwotCi0gICAgICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bMV07Ci0gICAgICAgICAgICBQYWlyPExpc3Q8UGFpcjxJbnRlZ2VyPj4+IGxlZnQgPSBnZXRQYXRjaGVzKGNvbHVtbiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRXaXRoUGF0Y2ggPSByZXN1bHRbMF07Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICAgICAgUGFpcjxMaXN0PFBhaXI8SW50ZWdlcj4+PiB0b3AgPSBnZXRQYXRjaGVzKHJvdywgcmVzdWx0KTsKLSAgICAgICAgICAgIGhvcml6b250YWxTdGFydFdpdGhQYXRjaCA9IHJlc3VsdFswXTsKLQotICAgICAgICAgICAgZml4ZWQgPSBnZXRSZWN0YW5nbGVzKGxlZnQuZmlyc3QsIHRvcC5maXJzdCk7Ci0gICAgICAgICAgICBwYXRjaGVzID0gZ2V0UmVjdGFuZ2xlcyhsZWZ0LnNlY29uZCwgdG9wLnNlY29uZCk7Ci0KLSAgICAgICAgICAgIGlmIChmaXhlZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBhdGNoZXMgPSBnZXRSZWN0YW5nbGVzKGxlZnQuZmlyc3QsIHRvcC5zZWNvbmQpOwotICAgICAgICAgICAgICAgIHZlcnRpY2FsUGF0Y2hlcyA9IGdldFJlY3RhbmdsZXMobGVmdC5zZWNvbmQsIHRvcC5maXJzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0b3AuZmlyc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsUGF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8UmVjdGFuZ2xlPigwKTsKLSAgICAgICAgICAgICAgICAgICAgdmVydGljYWxQYXRjaGVzID0gZ2V0VmVydGljYWxSZWN0YW5nbGVzKHRvcC5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LmZpcnN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBhdGNoZXMgPSBnZXRIb3Jpem9udGFsUmVjdGFuZ2xlcyhsZWZ0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgdmVydGljYWxQYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQYXRjaGVzID0gdmVydGljYWxQYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcm93ID0gR3JhcGhpY3NVdGlsaXRpZXMuZ2V0UGl4ZWxzKGltYWdlLCAwLCBoZWlnaHQgLSAxLCB3aWR0aCwgMSwgcm93KTsKLSAgICAgICAgICAgIGNvbHVtbiA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhpbWFnZSwgd2lkdGggLSAxLCAwLCAxLCBoZWlnaHQsIGNvbHVtbik7Ci0KLSAgICAgICAgICAgIHRvcCA9IGdldFBhdGNoZXMocm93LCByZXN1bHQpOwotICAgICAgICAgICAgaG9yaXpvbnRhbFBhZGRpbmcgPSBnZXRQYWRkaW5nKHRvcC5maXJzdCk7Ci0KLSAgICAgICAgICAgIGxlZnQgPSBnZXRQYXRjaGVzKGNvbHVtbiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmcobGVmdC5maXJzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBnZXRWZXJ0aWNhbFJlY3RhbmdsZXMoTGlzdDxQYWlyPEludGVnZXI+PiB0b3BQYWlycykgewotICAgICAgICAgICAgTGlzdDxSZWN0YW5nbGU+IHJlY3RhbmdsZXMgPSBuZXcgQXJyYXlMaXN0PFJlY3RhbmdsZT4oKTsKLSAgICAgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyPiB0b3AgOiB0b3BQYWlycykgewotICAgICAgICAgICAgICAgIGludCB4ID0gdG9wLmZpcnN0OwotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHRvcC5zZWNvbmQgLSB0b3AuZmlyc3Q7Ci0KLSAgICAgICAgICAgICAgICByZWN0YW5nbGVzLmFkZChuZXcgUmVjdGFuZ2xlKHgsIDEsIHdpZHRoLCBpbWFnZS5nZXRIZWlnaHQoKSAtIDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBMaXN0PFJlY3RhbmdsZT4gZ2V0SG9yaXpvbnRhbFJlY3RhbmdsZXMoTGlzdDxQYWlyPEludGVnZXI+PiBsZWZ0UGFpcnMpIHsKLSAgICAgICAgICAgIExpc3Q8UmVjdGFuZ2xlPiByZWN0YW5nbGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KCk7Ci0gICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlcj4gbGVmdCA6IGxlZnRQYWlycykgewotICAgICAgICAgICAgICAgIGludCB5ID0gbGVmdC5maXJzdDsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbGVmdC5zZWNvbmQgLSBsZWZ0LmZpcnN0OwotCi0gICAgICAgICAgICAgICAgcmVjdGFuZ2xlcy5hZGQobmV3IFJlY3RhbmdsZSgxLCB5LCBpbWFnZS5nZXRXaWR0aCgpIC0gMiwgaGVpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUGFpcjxJbnRlZ2VyPiBnZXRQYWRkaW5nKExpc3Q8UGFpcjxJbnRlZ2VyPj4gcGFpcnMpIHsKLSAgICAgICAgICAgIGlmIChwYWlycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxJbnRlZ2VyPigwLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFpcnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFpcnMuZ2V0KDApLmZpcnN0ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWlyPEludGVnZXI+KHBhaXJzLmdldCgwKS5zZWNvbmQgLSBwYWlycy5nZXQoMCkuZmlyc3QsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxJbnRlZ2VyPigwLCBwYWlycy5nZXQoMCkuc2Vjb25kIC0gcGFpcnMuZ2V0KDApLmZpcnN0KTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gcGFpcnMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhaXI8SW50ZWdlcj4ocGFpcnMuZ2V0KDApLnNlY29uZCAtIHBhaXJzLmdldCgwKS5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLmdldChpbmRleCkuc2Vjb25kIC0gcGFpcnMuZ2V0KGluZGV4KS5maXJzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBnZXRSZWN0YW5nbGVzKExpc3Q8UGFpcjxJbnRlZ2VyPj4gbGVmdFBhaXJzLAotICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxJbnRlZ2VyPj4gdG9wUGFpcnMpIHsKLSAgICAgICAgICAgIExpc3Q8UmVjdGFuZ2xlPiByZWN0YW5nbGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KCk7Ci0gICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlcj4gbGVmdCA6IGxlZnRQYWlycykgewotICAgICAgICAgICAgICAgIGludCB5ID0gbGVmdC5maXJzdDsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbGVmdC5zZWNvbmQgLSBsZWZ0LmZpcnN0OwotICAgICAgICAgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyPiB0b3AgOiB0b3BQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHRvcC5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gdG9wLnNlY29uZCAtIHRvcC5maXJzdDsKLQotICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGVzLmFkZChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUGFpcjxMaXN0PFBhaXI8SW50ZWdlcj4+PiBnZXRQYXRjaGVzKGludFtdIHBpeGVscywgYm9vbGVhbltdIHN0YXJ0V2l0aFBhdGNoKSB7Ci0gICAgICAgICAgICBpbnQgbGFzdEluZGV4ID0gMTsKLSAgICAgICAgICAgIGludCBsYXN0UGl4ZWwgPSBwaXhlbHNbMV07Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgTGlzdDxQYWlyPEludGVnZXI+PiBmaXhlZCA9IG5ldyBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyPj4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFpcjxJbnRlZ2VyPj4gcGF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyPj4oKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwaXhlbHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBpeGVsID0gcGl4ZWxzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwaXhlbCAhPSBsYXN0UGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQaXhlbCA9PSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHN0YXJ0V2l0aFBhdGNoWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMuYWRkKG5ldyBQYWlyPEludGVnZXI+KGxhc3RJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQuYWRkKG5ldyBQYWlyPEludGVnZXI+KGxhc3RJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFBpeGVsID0gcGl4ZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxhc3RQaXhlbCA9PSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSBzdGFydFdpdGhQYXRjaFswXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcGF0Y2hlcy5hZGQobmV3IFBhaXI8SW50ZWdlcj4obGFzdEluZGV4LCBwaXhlbHMubGVuZ3RoIC0gMSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaXhlZC5hZGQobmV3IFBhaXI8SW50ZWdlcj4obGFzdEluZGV4LCBwaXhlbHMubGVuZ3RoIC0gMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF0Y2hlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoZXMuYWRkKG5ldyBQYWlyPEludGVnZXI+KDEsIHBpeGVscy5sZW5ndGggLSAxKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnRXaXRoUGF0Y2hbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgIGZpeGVkLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxMaXN0PFBhaXI8SW50ZWdlcj4+PihmaXhlZCwgcGF0Y2hlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExvY2tWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICAgICAgc2hvd0xvY2sgPSB2aXNpYmxlOwotICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBhaXI8RT4gewotICAgICAgICBFIGZpcnN0OwotICAgICAgICBFIHNlY29uZDsKLQotICAgICAgICBQYWlyKEUgZmlyc3QsIEUgc2Vjb25kKSB7Ci0gICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQYWlyWyIgKyBmaXJzdCArICIsICIgKyBzZWNvbmQgKyAiXSI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL0ltYWdlVHJhbnNmZXJIYW5kbGVyLmphdmEgYi90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL0ltYWdlVHJhbnNmZXJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGNkNzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9JbWFnZVRyYW5zZmVySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC51aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlRyYW5zZmVySGFuZGxlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5UcmFuc2ZlcmFibGU7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkRhdGFGbGF2b3I7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLlVuc3VwcG9ydGVkRmxhdm9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotY2xhc3MgSW1hZ2VUcmFuc2ZlckhhbmRsZXIgZXh0ZW5kcyBUcmFuc2ZlckhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgTWFpbkZyYW1lIG1haW5GcmFtZTsKLQotICAgIEltYWdlVHJhbnNmZXJIYW5kbGVyKE1haW5GcmFtZSBtYWluRnJhbWUpIHsKLSAgICAgICAgdGhpcy5tYWluRnJhbWUgPSBtYWluRnJhbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaW1wb3J0RGF0YShKQ29tcG9uZW50IGNvbXBvbmVudCwgVHJhbnNmZXJhYmxlIHRyYW5zZmVyYWJsZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChEYXRhRmxhdm9yIGZsYXZvciA6IHRyYW5zZmVyYWJsZS5nZXRUcmFuc2ZlckRhdGFGbGF2b3JzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmxhdm9yLmlzRmxhdm9ySmF2YUZpbGVMaXN0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBkYXRhID0gdHJhbnNmZXJhYmxlLmdldFRyYW5zZmVyRGF0YShEYXRhRmxhdm9yLmphdmFGaWxlTGlzdEZsYXZvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSAoKExpc3Q8RmlsZT4pIGRhdGEpLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgbWFpbkZyYW1lLm9wZW4oZmlsZSkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYXZvci5pc0ZsYXZvclRleHRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXZvci5nZXRSZXByZXNlbnRhdGlvbkNsYXNzKCkgPT0gU3RyaW5nLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZsYXZvci5nZXRNaW1lVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUZsYXZvciBmbGF2ZSA9IG5ldyBEYXRhRmxhdm9yKG1pbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSB0cmFuc2ZlcmFibGUuZ2V0VHJhbnNmZXJEYXRhKGZsYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gY29udmVydFBhdGgoZGF0YS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1haW5GcmFtZS5vcGVuKG5ldyBGaWxlKHBhdGgpKS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRGbGF2b3JFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiZmlsZTovLyIpKSBwYXRoID0gcGF0aC5zdWJzdHJpbmcoImZpbGU6Ly8iLmxlbmd0aCgpKTsKLSAgICAgICAgaWYgKHBhdGguaW5kZXhPZignXG4nKSAhPSAtMSkgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZignXG4nKSk7Ci0gICAgICAgIGlmIChwYXRoLmluZGV4T2YoJ1xyJykgIT0gLTEpIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmluZGV4T2YoJ1xyJykpOwotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoSkNvbXBvbmVudCBjb21wb25lbnQsIERhdGFGbGF2b3JbXSBkYXRhRmxhdm9ycykgewotICAgICAgICBmb3IgKERhdGFGbGF2b3IgZmxhdm9yIDogZGF0YUZsYXZvcnMpIHsKLSAgICAgICAgICAgIGlmIChmbGF2b3IuaXNGbGF2b3JKYXZhRmlsZUxpc3RUeXBlKCkgfHwgZmxhdm9yLmlzRmxhdm9yVGV4dFR5cGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL01haW5GcmFtZS5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9NYWluRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViNjQwOS4uMDAwMDAwMAotLS0gYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL01haW5GcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2gudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpLmFjdGlvbi5FeGl0QWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2gudWkuYWN0aW9uLk9wZW5BY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC51aS5hY3Rpb24uU2F2ZUFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLmdyYXBoaWNzLkdyYXBoaWNzVXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51QmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51OwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb25NYXA7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZhLmF3dC5IZWFkbGVzc0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd3b3JrZXIuU3dpbmdXb3JrZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYWluRnJhbWUgZXh0ZW5kcyBKRnJhbWUgewotICAgIHByaXZhdGUgQWN0aW9uTWFwIGFjdGlvbnNNYXA7Ci0gICAgcHJpdmF0ZSBKTWVudUl0ZW0gc2F2ZU1lbnVJdGVtOwotICAgIHByaXZhdGUgSW1hZ2VFZGl0b3JQYW5lbCBpbWFnZUVkaXRvcjsKLQotICAgIHB1YmxpYyBNYWluRnJhbWUoU3RyaW5nIHBhdGgpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCJEcmF3IDktcGF0Y2giKTsKLQotICAgICAgICBidWlsZEFjdGlvbnMoKTsKLSAgICAgICAgYnVpbGRNZW51QmFyKCk7Ci0gICAgICAgIGJ1aWxkQ29udGVudCgpOwotCi0gICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHNob3dPcGVuRmlsZVBhbmVsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1nID0gR3JhcGhpY3NVdGlsaXRpZXMubG9hZENvbXBhdGlibGVJbWFnZShmaWxlLnRvVVJJKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgc2hvd0ltYWdlRWRpdG9yKGltZywgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBzaG93T3BlbkZpbGVQYW5lbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGFjaygpOwotICAgICAgICBzZXRTaXplKDEwMjQsIDYwMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQWN0aW9ucygpIHsKLSAgICAgICAgYWN0aW9uc01hcCA9IG5ldyBBY3Rpb25NYXAoKTsKLSAgICAgICAgYWN0aW9uc01hcC5wdXQoT3BlbkFjdGlvbi5BQ1RJT05fTkFNRSwgbmV3IE9wZW5BY3Rpb24odGhpcykpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChTYXZlQWN0aW9uLkFDVElPTl9OQU1FLCBuZXcgU2F2ZUFjdGlvbih0aGlzKSk7Ci0gICAgICAgIGFjdGlvbnNNYXAucHV0KEV4aXRBY3Rpb24uQUNUSU9OX05BTUUsIG5ldyBFeGl0QWN0aW9uKHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRNZW51QmFyKCkgewotICAgICAgICBKTWVudSBmaWxlTWVudSA9IG5ldyBKTWVudSgiRmlsZSIpOwotICAgICAgICBKTWVudUl0ZW0gb3Blbk1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgpOwotICAgICAgICBzYXZlTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIEpNZW51SXRlbSBleGl0TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0KLSAgICAgICAgb3Blbk1lbnVJdGVtLnNldEFjdGlvbihhY3Rpb25zTWFwLmdldChPcGVuQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIGZpbGVNZW51LmFkZChvcGVuTWVudUl0ZW0pOwotCi0gICAgICAgIHNhdmVNZW51SXRlbS5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoU2F2ZUFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBzYXZlTWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGZpbGVNZW51LmFkZChzYXZlTWVudUl0ZW0pOwotCi0gICAgICAgIGV4aXRNZW51SXRlbS5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoRXhpdEFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBmaWxlTWVudS5hZGQoZXhpdE1lbnVJdGVtKTsKLQotICAgICAgICBKTWVudUJhciBtZW51QmFyID0gbmV3IEpNZW51QmFyKCk7Ci0gICAgICAgIG1lbnVCYXIuYWRkKGZpbGVNZW51KTsKLSAgICAgICAgc2V0Sk1lbnVCYXIobWVudUJhcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udGVudCgpIHsKLSAgICAgICAgc2V0Q29udGVudFBhbmUobmV3IEdyYWRpZW50UGFuZWwoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dPcGVuRmlsZVBhbmVsKCkgewotICAgICAgICBhZGQobmV3IE9wZW5GaWxlUGFuZWwodGhpcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBTd2luZ1dvcmtlcjw/LCA/PiBvcGVuKEZpbGUgZmlsZSkgewotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBKRmlsZUNob29zZXIgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKLSAgICAgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgUG5nRmlsZUZpbHRlcigpKTsKLSAgICAgICAgICAgIGludCBjaG9pY2UgPSBjaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICAgICAgaWYgKGNob2ljZSA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5UYXNrKGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblRhc2soZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNob3dJbWFnZUVkaXRvcihCdWZmZXJlZEltYWdlIGltYWdlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOwotICAgICAgICBpbWFnZUVkaXRvciA9IG5ldyBJbWFnZUVkaXRvclBhbmVsKHRoaXMsIGltYWdlLCBuYW1lKTsKLSAgICAgICAgYWRkKGltYWdlRWRpdG9yKTsKLSAgICAgICAgc2F2ZU1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpbmdXb3JrZXI8PywgPz4gc2F2ZSgpIHsKLSAgICAgICAgaWYgKGltYWdlRWRpdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gaW1hZ2VFZGl0b3IuY2hvb3NlU2F2ZUZpbGUoKTsKLSAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbCA/IG5ldyBTYXZlVGFzayhmaWxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTYXZlVGFzayBleHRlbmRzIFN3aW5nV29ya2VyPEJvb2xlYW4sIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7Ci0KLSAgICAgICAgU2F2ZVRhc2soRmlsZSBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gZG9JbkJhY2tncm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VJTy53cml0ZShpbWFnZUVkaXRvci5nZXRJbWFnZSgpLCAiUE5HIiwgZmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgT3BlblRhc2sgZXh0ZW5kcyBTd2luZ1dvcmtlcjxCdWZmZXJlZEltYWdlLCBWb2lkPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCi0gICAgICAgIE9wZW5UYXNrKEZpbGUgZmlsZSkgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBCdWZmZXJlZEltYWdlIGRvSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gR3JhcGhpY3NVdGlsaXRpZXMubG9hZENvbXBhdGlibGVJbWFnZShmaWxlLnRvVVJJKCkudG9VUkwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2hvd0ltYWdlRWRpdG9yKGdldCgpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9PcGVuRmlsZVBhbmVsLmphdmEgYi90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL09wZW5GaWxlUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0NDMzMi4uMDAwMDAwMAotLS0gYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL09wZW5GaWxlUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2UgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC51aTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2guZ3JhcGhpY3MuR3JhcGhpY3NVdGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7LyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWNsYXNzIE9wZW5GaWxlUGFuZWwgZXh0ZW5kcyBKQ29tcG9uZW50IHsKLSAgICBwcml2YXRlIEJ1ZmZlcmVkSW1hZ2UgZHJvcEhlcmU7Ci0KLSAgICBPcGVuRmlsZVBhbmVsKE1haW5GcmFtZSBtYWluRnJhbWUpIHsKLSAgICAgICAgc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgbG9hZFN1cHBvcnRJbWFnZSgpOwotICAgICAgICBzZXRUcmFuc2ZlckhhbmRsZXIobmV3IEltYWdlVHJhbnNmZXJIYW5kbGVyKG1haW5GcmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkU3VwcG9ydEltYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2ltYWdlcy9kcm9wLnBuZyIpOwotICAgICAgICAgICAgZHJvcEhlcmUgPSBHcmFwaGljc1V0aWxpdGllcy5sb2FkQ29tcGF0aWJsZUltYWdlKHJlc291cmNlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgaW50IHggPSAoZ2V0V2lkdGgoKSAtIGRyb3BIZXJlLmdldFdpZHRoKCkpIC8gMjsKLSAgICAgICAgaW50IHkgPSAoZ2V0SGVpZ2h0KCkgLSBkcm9wSGVyZS5nZXRIZWlnaHQoKSkgLyAyOwotCi0gICAgICAgIGcuZHJhd0ltYWdlKGRyb3BIZXJlLCB4LCB5LCBudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvUG5nRmlsZUZpbHRlci5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9QbmdGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODg4NWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9QbmdGaWxlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWNsYXNzIFBuZ0ZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0gICAgICAgIHJldHVybiBmLmlzRGlyZWN0b3J5KCkgfHwgZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnBuZyIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiUE5HIEltYWdlICgqLnBuZykiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvYWN0aW9uL0JhY2tncm91bmRBY3Rpb24uamF2YSBiL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvYWN0aW9uL0JhY2tncm91bmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkOWQ0Zi4uMDAwMDAwMAotLS0gYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL2FjdGlvbi9CYWNrZ3JvdW5kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3dvcmtlci5Td2luZ1dvcmtlcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFja2dyb3VuZEFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlQmFja2dyb3VuZFRhc2soU3dpbmdXb3JrZXI8PywgPz4gd29ya2VyKSB7Ci0gICAgICAgIGlmICh3b3JrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgd29ya2VyLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvYWN0aW9uL0V4aXRBY3Rpb24uamF2YSBiL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvYWN0aW9uL0V4aXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMDQ3ZC4uMDAwMDAwMAotLS0gYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL2FjdGlvbi9FeGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpLmFjdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLQotcHVibGljIGNsYXNzIEV4aXRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05BTUUgPSAiZXhpdCI7Ci0gICAgcHJpdmF0ZSBKRnJhbWUgZnJhbWU7Ci0KLSAgICBwdWJsaWMgRXhpdEFjdGlvbihKRnJhbWUgZnJhbWUpIHsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIlF1aXQiKTsKLSAgICAgICAgcHV0VmFsdWUoU0hPUlRfREVTQ1JJUFRJT04sICJRdWl0Iik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJRdWl0Iik7Ci0gICAgICAgIHB1dFZhbHVlKE1ORU1PTklDX0tFWSwgS2V5RXZlbnQuVktfUSk7Ci0gICAgICAgIHB1dFZhbHVlKEFDQ0VMRVJBVE9SX0tFWSwgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19RLAotICAgICAgICAgICAgICAgIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRNZW51U2hvcnRjdXRLZXlNYXNrKCkpKTsKLSAgICAgICAgdGhpcy5mcmFtZSA9IGZyYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9hY3Rpb24vT3BlbkFjdGlvbi5qYXZhIGIvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9hY3Rpb24vT3BlbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWVlNWJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL2NvbS9hbmRyb2lkL2RyYXc5cGF0Y2gvdWkvYWN0aW9uL09wZW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmRyYXc5cGF0Y2gudWkuYWN0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC51aS5NYWluRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLQotcHVibGljIGNsYXNzIE9wZW5BY3Rpb24gZXh0ZW5kcyBCYWNrZ3JvdW5kQWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkFNRSA9ICJvcGVuIjsKLSAgICBwcml2YXRlIE1haW5GcmFtZSBmcmFtZTsKLQotICAgIHB1YmxpYyBPcGVuQWN0aW9uKE1haW5GcmFtZSBmcmFtZSkgewotICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7Ci0gICAgICAgIHB1dFZhbHVlKE5BTUUsICJPcGVuIDktcGF0Y2guLi4iKTsKLSAgICAgICAgcHV0VmFsdWUoU0hPUlRfREVTQ1JJUFRJT04sICJPcGVuLi4uIik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJPcGVuIDktcGF0Y2guLi4iKTsKLSAgICAgICAgcHV0VmFsdWUoTU5FTU9OSUNfS0VZLCBLZXlFdmVudC5WS19PKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX08sCi0gICAgICAgICAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldE1lbnVTaG9ydGN1dEtleU1hc2soKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kVGFzayhmcmFtZS5vcGVuKG51bGwpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL2FjdGlvbi9TYXZlQWN0aW9uLmphdmEgYi90b29scy9kcmF3OXBhdGNoL3NyYy9jb20vYW5kcm9pZC9kcmF3OXBhdGNoL3VpL2FjdGlvbi9TYXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWRjNTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvY29tL2FuZHJvaWQvZHJhdzlwYXRjaC91aS9hY3Rpb24vU2F2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZHJhdzlwYXRjaC51aS5hY3Rpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kcmF3OXBhdGNoLnVpLk1haW5GcmFtZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotCi1wdWJsaWMgY2xhc3MgU2F2ZUFjdGlvbiBleHRlbmRzIEJhY2tncm91bmRBY3Rpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9OQU1FID0gInNhdmUiOwotICAgIHByaXZhdGUgTWFpbkZyYW1lIGZyYW1lOwotCi0gICAgcHVibGljIFNhdmVBY3Rpb24oTWFpbkZyYW1lIGZyYW1lKSB7Ci0gICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIlNhdmUgOS1wYXRjaC4uLiIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlNhdmUuLi4iKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIlNhdmUgOS1wYXRjaC4uLiIpOwotICAgICAgICBwdXRWYWx1ZShNTkVNT05JQ19LRVksIEtleUV2ZW50LlZLX1MpOwotICAgICAgICBwdXRWYWx1ZShBQ0NFTEVSQVRPUl9LRVksIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfUywKLSAgICAgICAgICAgICAgICBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgZXhlY3V0ZUJhY2tncm91bmRUYXNrKGZyYW1lLnNhdmUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvcmVzb3VyY2VzL2ltYWdlcy9jaGVja2VyLnBuZyBiL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL3Jlc291cmNlcy9pbWFnZXMvY2hlY2tlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTA4ZjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJhdzlwYXRjaC9zcmMvcmVzb3VyY2VzL2ltYWdlcy9jaGVja2VyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL3Jlc291cmNlcy9pbWFnZXMvZHJvcC5wbmcgYi90b29scy9kcmF3OXBhdGNoL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2Ryb3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc0MzZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RyYXc5cGF0Y2gvc3JjL3Jlc291cmNlcy9pbWFnZXMvZHJvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kdW1wZXZlbnRsb2cvLmNsYXNzcGF0aCBiL3Rvb2xzL2R1bXBldmVudGxvZy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDMyNmM4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2R1bXBldmVudGxvZy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZGRtbGliIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2R1bXBldmVudGxvZy8ucHJvamVjdCBiL3Rvb2xzL2R1bXBldmVudGxvZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNmY0Zi4uMDAwMDAwMAotLS0gYS90b29scy9kdW1wZXZlbnRsb2cvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5kdW1wZXZlbnRsb2c8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHVtcGV2ZW50bG9nL0FuZHJvaWQubWsgYi90b29scy9kdW1wZXZlbnRsb2cvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiODcwZC4uMDAwMDAwMAotLS0gYS90b29scy9kdW1wZXZlbnRsb2cvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1EVU1QRVZFTlRMT0dfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoRFVNUEVWRU5UTE9HX0xPQ0FMX0RJUikvZXRjL0FuZHJvaWQubWsKLWluY2x1ZGUgJChEVU1QRVZFTlRMT0dfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvZHVtcGV2ZW50bG9nL2V0Yy9BbmRyb2lkLm1rIGIvdG9vbHMvZHVtcGV2ZW50bG9nL2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDk0NzM0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2R1bXBldmVudGxvZy9ldGMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gZHVtcGV2ZW50bG9nCi1pbmNsdWRlICQoQlVJTERfSE9TVF9QUkVCVUlMVCkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHVtcGV2ZW50bG9nL2V0Yy9kdW1wZXZlbnRsb2cgYi90b29scy9kdW1wZXZlbnRsb2cvZXRjL2R1bXBldmVudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZmOGMyMi4uMDAwMDAwMAotLS0gYS90b29scy9kdW1wZXZlbnRsb2cvZXRjL2R1bXBldmVudGxvZworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMhL2Jpbi9zaAotIyBDb3B5cmlnaHQgMjAwNS0yMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCi0jIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCi1wcm9nPSIkMCIKLXdoaWxlIFsgLWggIiR7cHJvZ30iIF07IGRvCi0gICAgbmV3UHJvZz1gL2Jpbi9scyAtbGQgIiR7cHJvZ30iYAotICAgIG5ld1Byb2c9YGV4cHIgIiR7bmV3UHJvZ30iIDogIi4qIC0+IFwoLipcKSQiYAotICAgIGlmIGV4cHIgIngke25ld1Byb2d9IiA6ICd4LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICBwcm9nPSIke25ld1Byb2d9IgotICAgIGVsc2UKLSAgICAgICAgcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi0gICAgICAgIHByb2c9IiR7cHJvZ2Rpcn0vJHtuZXdQcm9nfSIKLSAgICBmaQotZG9uZQotb2xkd2Q9YHB3ZGAKLXByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotY2QgIiR7cHJvZ2Rpcn0iCi1wcm9nZGlyPWBwd2RgCi1wcm9nPSIke3Byb2dkaXJ9Ii9gYmFzZW5hbWUgIiR7cHJvZ30iYAotY2QgIiR7b2xkd2R9IgotCi1qYXJmaWxlPWR1bXBldmVudGxvZy5qYXIKLWZyYW1ld29ya2Rpcj0iJHByb2dkaXIiCi1saWJkaXI9IiRwcm9nZGlyIgotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvZnJhbWV3b3JrCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIKLSAgICBleGl0IDEKLWZpCi0KLQotIyBDaGVjayBhcmdzLgotaWYgWyBkZWJ1ZyA9ICIkMSIgXTsgdGhlbgotICAgICMgYWRkIHRoaXMgaW4gZm9yIGRlYnVnZ2luZwotICAgIGphdmFfZGVidWc9LWFnZW50bGliOmpkd3A9dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxhZGRyZXNzPTgwNTAsc3VzcGVuZD15Ci0gICAgc2hpZnQgMQotZWxzZQotICAgIGphdmFfZGVidWc9Ci1maQotCi0jIE1hYyBPUyBYIG5lZWRzIGFuIGFkZGl0aW9uYWwgYXJnLCBvciB5b3UgZ2V0IGFuICJpbGxlZ2FsIHRocmVhZCIgY29tcGxhaW50LgotaWYgWyBgdW5hbWVgID0gIkRhcndpbiIgXTsgdGhlbgotICAgIG9zX29wdHM9Ii1Yc3RhcnRPbkZpcnN0VGhyZWFkIgotZWxzZQotICAgIG9zX29wdHM9Ci1maQotCi1pZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF0gOyB0aGVuCi0gICAgamFycGF0aD1gY3lncGF0aCAtdyAgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiYAotICAgIHByb2dkaXI9YGN5Z3BhdGggLXcgICIkcHJvZ2RpciJgCi1lbHNlCi0gICAgamFycGF0aD0iJGZyYW1ld29ya2Rpci8kamFyZmlsZSIKLWZpCi0KLSMgbmVlZCB0byB1c2UgImphdmEuZXh0LmRpcnMiIGJlY2F1c2UgIi1qYXIiIGNhdXNlcyBjbGFzc3BhdGggdG8gYmUgaWdub3JlZAotIyBtaWdodCBuZWVkIG1vcmUgbWVtb3J5LCBlLmcuIC1YbXgxMjhNCi1leGVjIGphdmEgLVhteDEyOE0gJG9zX29wdHMgJGphdmFfZGVidWcgLURqYXZhLmV4dC5kaXJzPSIkZnJhbWV3b3JrZGlyIiAtRGphdmEubGlicmFyeS5wYXRoPSIkbGliZGlyIiAtamFyICIkamFycGF0aCIgIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHVtcGV2ZW50bG9nL2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy9kdW1wZXZlbnRsb2cvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlYTkxNS4uMDAwMDAwMAotLS0gYS90b29scy9kdW1wZXZlbnRsb2cvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmR1bXBldmVudGxvZy5EdW1wRXZlbnRMb2cKZGlmZiAtLWdpdCBhL3Rvb2xzL2R1bXBldmVudGxvZy9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2R1bXBldmVudGxvZy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5OTM3NS4uMDAwMDAwMAotLS0gYS90b29scy9kdW1wZXZlbnRsb2cvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfSkFSX01BTklGRVNUIDo9IC4uL2V0Yy9tYW5pZmVzdC50eHQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlkZG1saWIKLUxPQ0FMX01PRFVMRSA6PSBkdW1wZXZlbnRsb2cKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS90b29scy9kdW1wZXZlbnRsb2cvc3JjL2NvbS9hbmRyb2lkL2R1bXBldmVudGxvZy9EdW1wRXZlbnRMb2cuamF2YSBiL3Rvb2xzL2R1bXBldmVudGxvZy9zcmMvY29tL2FuZHJvaWQvZHVtcGV2ZW50bG9nL0R1bXBFdmVudExvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTU1NzNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2R1bXBldmVudGxvZy9zcmMvY29tL2FuZHJvaWQvZHVtcGV2ZW50bG9nL0R1bXBFdmVudExvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXBldmVudGxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLklMb2dPdXRwdXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuSUxvZ0xpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuTG9nRW50cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb25uZWN0cyB0byBhIGRldmljZSB1c2luZyBkZG1saWIgYW5kIGR1bXBzIGl0cyBldmVudCBsb2cgYXMgbG9uZyBhcyB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAqLwotcHVibGljIGNsYXNzIER1bXBFdmVudExvZyB7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20ge0BsaW5rIElMb2dMaXN0ZW5lcn0gdG8gcmVjZWl2ZSBhbmQgc2F2ZSB0aGUgZXZlbnQgbG9nIHJhdyBvdXRwdXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9nV3JpdGVyIGltcGxlbWVudHMgSUxvZ0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgTG9nUmVjZWl2ZXIgbVJlY2VpdmVyOwotCi0gICAgICAgIHB1YmxpYyBMb2dXcml0ZXIoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVQYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG5ld0RhdGEoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShkYXRhLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbmV3RW50cnkoTG9nRW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKExvZ1JlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgICAgICBtUmVjZWl2ZXIgPSByZWNlaXZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogZHVtcGV2ZW50bG9nIDxkZXZpY2Ugcy9uPiA8ZmlsZXBhdGg+Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWRpcmVjdCB0aGUgbG9nIG91dHB1dCB0byAvZGV2L251bGwKLSAgICAgICAgTG9nLnNldExvZ091dHB1dChuZXcgSUxvZ091dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50QW5kUHJvbXB0TG9nKExvZ0xldmVsIGxvZ0xldmVsLCBTdHJpbmcgdGFnLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRMb2coTG9nTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBpbml0IHRoZSBsaWIKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLmluaXQoZmFsc2UgLyogZGVidWdnZXIgc3VwcG9ydCAqLyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZSBicmlkZ2UgPSBBbmRyb2lkRGVidWdCcmlkZ2UuY3JlYXRlQnJpZGdlKCk7Ci0KLSAgICAgICAgICAgIC8vIHdlIGNhbid0IGp1c3QgYXNrIGZvciB0aGUgZGV2aWNlIGxpc3QgcmlnaHQgYXdheSwgYXMgdGhlIGludGVybmFsIHRocmVhZCBnZXR0aW5nCi0gICAgICAgICAgICAvLyB0aGVtIGZyb20gQURCIG1heSBub3QgYmUgZG9uZSBnZXR0aW5nIHRoZSBmaXJzdCBsaXN0LgotICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgcmVhbGx5IHdhbnQgZ2V0RGV2aWNlcygpIHRvIGJlIGJsb2NraW5nLCB3ZSB3YWl0IGhlcmUgbWFudWFsbHkuCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGJyaWRnZS5oYXNJbml0aWFsRGV2aWNlTGlzdCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbGV0J3Mgbm90IHdhaXQgPiAxMCBzZWMuCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGltZW91dCBnZXR0aW5nIGRldmljZSBsaXN0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ2V0IHRoZSBkZXZpY2VzCi0gICAgICAgICAgICBJRGV2aWNlW10gZGV2aWNlcyA9IGJyaWRnZS5nZXREZXZpY2VzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSURldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKS5lcXVhbHMoYXJnc1swXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYWJMb2dGcm9tKGRldmljZSwgYXJnc1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgIiArIGFyZ3NbMF0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBncmFiTG9nRnJvbShJRGV2aWNlIGRldmljZSwgU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMb2dXcml0ZXIgd3JpdGVyID0gbmV3IExvZ1dyaXRlcihmaWxlUGF0aCk7Ci0gICAgICAgIExvZ1JlY2VpdmVyIHJlY2VpdmVyID0gbmV3IExvZ1JlY2VpdmVyKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0KLSAgICAgICAgZGV2aWNlLnJ1bkV2ZW50TG9nU2VydmljZShyZWNlaXZlcik7Ci0KLSAgICAgICAgd3JpdGVyLmRvbmUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL1JFQURNRV9XSU5ET1dTLnR4dCBiL3Rvb2xzL2VjbGlwc2UvUkVBRE1FX1dJTkRPV1MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDgwZjVkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvUkVBRE1FX1dJTkRPV1MudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotW1JNIDIwMDgwNjIzXQotCi0xLSBUbyBidWlsZCB0aGUgRWNsaXBzZSBwbHVnaW46Ci1VbmRlciBMaW51eDoKLSQgY2QgeW91ci1kZXZpY2UtZGlyZWN0b3J5Ci0kIHRvb2xzL2VjbGlwc2Uvc2NyaXB0cy9idWlsZF9zZXJ2ZXIuc2ggZGVzdGluYXRpb24tZGlyZWN0b3J5Ci0KLVRoaXMgd2lsbCBjcmVhdGUgYW4gImFuZHJvaWQtZWNsaXBzZS56aXAiIGluIHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi1UaGVuIGluIEVjbGlwc2UsIHlvdSBjYW4gdXNlIEhlbHAgPiBTb2Z0d2FyZSBVcGRhdGVzID4gRmluZCBhbmQgSW5zdGFsbCA+IFNlYXJjaCBmb3IgbmV3IEZlYXR1cmVzID4gTmV4dCA+IE5ldyBBcmNoaXZlZCBTaXRlID4gc2VsZWN0IHRoZSBuZXcgYW5kcm9pZC1lY2xpcHNlLnppcC4gVGhlbiB3aXRoIHRoZSBuZXcgYXJjaGl2ZSBjaGVja2VkLCBjbGljayBGaW5pc2gvTmV4dC4KLQotCi0yLSBUbyBidWlsZCBhIFdpbmRvd3MgU0RLLCB5b3UgbmVlZCB0d28gc3RlcHM6Ci1hLSBGaXJzdCB5b3UgbmVlZCB0byBjcmVhdGUgYSBMaW51eCBTREs6Ci0KLVVuZGVyIExpbnV4OgotJCBjZCB5b3VyLWRldmljZS1kaXJlY3RvcnkKLSQgbWFrZSBzZGsKLU5vdGU6IGlmIHlvdSBnZXQgYW4gZXJyb3Igd2hlbiBidWlsZGluZyB0aGUgamF2YWRvYywgbWFrZSBzdXJlIHlvdSB1c2UgYSBKYXZhIFNESyAxLjUKLU5vdGU6IGlmIHlvdSBnZXQgYW4gZXJyb3Igd2hlbiBidWlsZGluZyBsYXlvdXRsaWIsIG1ha2Ugc3VyZSB5b3UgdXNlIGEgSmF2YSBTREsgMS41LjAtYjEzLgotCi1iLSBPbmNlIHlvdSBoYXZlIGEgTGludXggU0RLLCB5b3UgY2FuIGNyZWF0ZSBhIFdpbmRvd3MgU0RLOgotCi1Zb3UgbmVlZCBhIFdpbmRvd3MgbWFjaGluZSB3aXRoIFhQIG9yIFZpc3RhIGFuZCBDeWd3aW4uCi0tIEluc3RhbGxlciBhdCBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2N5Z3dpbi8KLS0gU2V0IERlZmF1bHQgVGV4dCBGaWxlIFR5cGUgdG8gRE9TL3RleHQsIG5vdCBVbml4L2JpbmFyeS4KLS0gU2VsZWN0IHBhY2thZ2VzIGF1dG9jb25mLCBnY2MsIGcrKywgYmlzb24sIHB5dGhvbiwgemlwLCB1bnppcCwgbWluZ3ctemxpYgotLSBTdWdnZXN0ZWQgZXh0cmEgcGFja2FnZXM6IGVtYWNzLCB3Z2V0LCBvcGVuc3NoLCByc3luYwotCi1UaGVuIHVuZGVyIEN5Z3dpbjoKLSQgY2QgeW91ci1kZXZpY2UtZGlyZWN0b3J5Ci0kIHRvb2xzL2J1aWxkYm90L19tYWtlX3dpbmRvd3Nfc2RrLnNoIHBhdGgtdG8tdGhlLWxpbnV4LXNkay56aXAgZGVzdGluYXRpb24tZGlyZWN0b3J5Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvYnVpbGRDb25maWcvYWxsRWxlbWVudHMueG1sIGIvdG9vbHMvZWNsaXBzZS9idWlsZENvbmZpZy9hbGxFbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODIyOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9idWlsZENvbmZpZy9hbGxFbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEZlYXR1cmUgYnVpbGQgYW50IHRhcmdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRlbXBsYXRlIG9idGFpbmVkIGZyb20gb3JnLmVjbGlwc2UucGRlLmJ1aWxkL3RlbXBsYXRlcy9oZWFkbGVzcy1idWlsZCAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJhbGxFbGVtZW50cyBEZWxlZ2F0b3IiPgotICAgIAotICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgIDwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gICAgLS0+Ci0gICAgIDwhLS0gSWYgZWxlbWVudC5pZCBkb2VzIG5vdCBleGlzdCBpbiAke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcy9lbGVtZW50LmlkICAgLS0+Ci0gICAgIDwhLS0gb3IgJHtiYXNlTG9jYXRpb259L2ZlYXR1cmVzL2VsZW1lbnQuaWQsIHRoZW4geW91IG11c3QgcHJvdmlkZSB0aGUgICAgICAgLS0+Ci0gICAgIDwhLS0gbG9jYXRpb24gYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgInBsdWdpblBhdGgiICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgIDwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgICAgICAgICAgIC0tPgotICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50c0RlbGVnYXRvciI+Ci0gICAgICAgICAKLSAgICAgICAgIDxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iJHt0YXJnZXR9Ij4KLSAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImZlYXR1cmUiIC8+Ci0gICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcyIgLz4KLSAgICAgICAgIDwvYW50PgotCi0gICAgICAgICA8YW50IGFudGZpbGU9IiR7Z2VuZXJpY1RhcmdldHN9IiB0YXJnZXQ9IiR7dGFyZ2V0fSI+Ci0gICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJmZWF0dXJlIiAvPgotICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdCIgLz4KLSAgICAgICAgIDwvYW50PgotICAgICAgICAgCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGRJbnRlcm5hbEZlYXR1cmVzIi8+Ci0gICAgICAgICAKLSAgICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICA8IS0tIENvbmRpdGlvbmFsIHRhcmdldCBmb3IgYnVpbGRpbmcgdGhlIGludGVybmFsIGZlYXR1cmVzICAgICAgICAgICAgICAgICAtLT4KLSAgICAgPCEtLSBCdWlsZHMgaWYgcHJvcGVydHkgaW50ZXJuYWxTaXRlIGlzIHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkSW50ZXJuYWxGZWF0dXJlcyIgaWY9ImludGVybmFsU2l0ZSI+Ci0gICAgICAgIDxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iJHt0YXJnZXR9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiAvPgotICAgICAgICA8L2FudD4KLSAgICAgPC90YXJnZXQ+ICAgIAotICAgICAgICAgCi0gICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICA8IS0tIFRhcmdldHMgdG8gYXNzZW1ibGUgdGhlIGJ1aWx0IGVsZW1lbnRzIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb25zICAtLT4KLSAgICAgPCEtLSBUaGVzZSBnZW5lcmFsbHkgY2FsbCB0aGUgZ2VuZXJhdGVkIGFzc2VtYmxlIHNjcmlwdHMgKG5hbWVkIGluICAgICAgICAgLS0+Ci0gICAgIDwhLS0gJHthc3NlbWJsZVNjcmlwdE5hbWV9KSBidXQgbWF5IGFsc28gYWRkIHByZSBhbmQgcG9zdCBwcm9jZXNzaW5nICAgICAgIC0tPgotICAgICA8IS0tIEFkZCBvbmUgdGFyZ2V0IGZvciBlYWNoIHJvb3QgZWxlbWVudCBhbmQgZWFjaCBjb25maWd1cmF0aW9uICAgICAgICAgICAtLT4KLSAgICAgPCEtLSBSZXBsYWNlIGVsZW1lbnQuaWQgd2l0aCB0aGUgaWQgb2YgdGhlIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0ICAgLS0+Ci0gICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICA8dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLmNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdCI+Ci0gICAgICAgICA8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotICAgICA8L3RhcmdldD4KLQotICAgICA8dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLmNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMiPgotICAgICAgICAgPGFudCBhbnRmaWxlPSIke2Fzc2VtYmxlU2NyaXB0TmFtZX0iIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLSAgICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyI+Ci0gICAgICAgIDxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL2J1aWxkQ29uZmlnL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9lY2xpcHNlL2J1aWxkQ29uZmlnL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDc3ZDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9idWlsZENvbmZpZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBwZXIgdGhlIGluc3RydWN0aW9ucyBsb2NhdGVkIGluIEVjbGlwc2UgSGVscD5QbHVnLWluIERldmVsb3BtZW50Ci0jIEVudmlyb25tZW50ID4gIEd1aWRlID4gVGFza3MgPiBCdWlsZGluZyBmZWF0dXJlcyBhbmQgY3VzdG9taXplZCBmb3IgYnVpbGRpbmcgdGhlCi0jIEFuZHJvaWQgRWNsaXBzZSBwbHVnaW5zLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCi0jIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0jICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAotIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKLSMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCi0jCi0jIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCi0jIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQotCi0jIyMjIyMjIyMjIyMjIFBST0RVQ1QvUEFDS0FHSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIwotcHJvZHVjdD0vcGx1Z2luIG9yIGZlYXR1cmUgaWQvcGF0aC90by8ucHJvZHVjdAotcnVuUGFja2FnZXI9dHJ1ZQotCi0jU2V0IHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBidWlsZC4KLSNhcmNoaXZlTmFtZVByZWZpeD0KLQotIyBUaGUgcHJlZml4IHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgYXJjaGl2ZS4KLSMgb3ZlcnJpZGUgZGVmYXVsdCBvZiAiZWNsaXBzZSIgdG8gYWlkIGZvciBleHRlcm5hbCBzaXRlIGdlbmVyYXRpb24gCi1hcmNoaXZlUHJlZml4PWFuZHJvaWQtZWNsaXBzZQotCi0jIFRoZSBsb2NhdGlvbiB1bmRlcndoaWNoIGFsbCBvZiB0aGUgYnVpbGQgb3V0cHV0IHdpbGwgYmUgY29sbGVjdGVkLgotY29sbGVjdGluZ0ZvbGRlcj0ke2FyY2hpdmVQcmVmaXh9Ci0KLSMgVGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICBUaGlzIAotIyB2YWx1ZSBpcyBhICcmJyBzZXBhcmF0ZWQgbGlzdCBvZiAnLCcgc2VwYXJhdGUgdHJpcGxlcy4gIEZvciBleGFtcGxlLCAKLSMgICAgIGNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsbW90aWYseDg2Ci0jIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzICosKiwqCi1jb25maWdzID0gKiwgKiwgKgotI2NvbmZpZ3M9d2luMzIsIHdpbjMyLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHBwYyAmXAotIyBsaW51eCwgZ3RrLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAmIFwKLSMJbGludXgsIG1vdGlmLCB4ODYgJiBcCi0jCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjICYgXAotIwlocHV4LCBtb3RpZiwgUEFfUklTQyAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYwotCi0jIEJ5IGRlZmF1bHQgUERFIGNyZWF0ZXMgb25lIGFyY2hpdmUgKHJlc3VsdCkgcGVyIGVudHJ5IGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSMgU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRyeSB3aWxsIGNhdXNlIFBERSB0byBvbmx5IGNyZWF0ZSBvbmUgb3V0cHV0IGNvbnRhaW5pbmcgYWxsIAotIyBhcnRpZmFjdHMgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSNncm91cENvbmZpZ3VyYXRpb25zPXRydWUKLQotI1RoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUuIEJ5IGRlZmF1bHQgYSB6aXAgaXMgY3JlYXRlZCB1c2luZyBhbnRaaXAuCi0jVGhlIGxpc3QgY2FuIG9ubHkgY29udGFpbiB0aGUgY29uZmlndXJhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2lyZWQgZm9ybWF0IGlzIGRpZmZlcmVudCB0aGFuIHppcC4KLSNhcmNoaXZlc0Zvcm1hdD13aW4zMiwgd2luMzIsIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCBwcGMgLSBhbnRaaXAgJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gYW50WmlwJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAtIGFudFppcCYgXAotIyBsaW51eCwgbW90aWYsIHg4NiAtIGFudFppcCYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAtIGFudFppcCYgXAotIwlhaXgsIG1vdGlmLCBwcGMgLSBhbnRaaXAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgLSBhbnRaaXAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYyAtIGFudFppcAotCQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgcmVhZHkgZm9yIGFuIHVwZGF0ZSBqYXIgKG5vIHNpdGUueG1sIGdlbmVyYXRlZCkKLW91dHB1dFVwZGF0ZUphcnMgPSB0cnVlCi0KLSNTZXQgdG8gdHJ1ZSBmb3IgSm5scCBnZW5lcmF0aW9uCi0jY29kZWJhc2Ugc2hvdWxkIGJlIGEgVVJMIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IG9mIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoZSBvdXRwdXQuCi0jZ2VuZXJhdGVKbmxwPWZhbHNlCi0jam5scC5jb2RlYmFzZT08Y29kZWJhc2UgdXJsPgotI2pubHAuajJzZT08ajJzZSB2ZXJzaW9uPgotI2pubHAubG9jYWxlPTxhIGxvY2FsZT4KLSNqbmxwLmdlbmVyYXRlT2ZmbGluZUFsbG93ZWQ9dHJ1ZSBvciBmYWxzZSBnZW5lcmF0ZSA8b2ZmbGluZUFsbG93ZWQvPiBhdHRyaWJ1dGUgaW4gdGhlIGdlbmVyYXRlZCBmZWF0dXJlcwotI2pubHAuY29uZmlncz0ke2NvbmZpZ3N9CQkJI3VuY29tbWVudCB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGdlbmVyYXRlZCBqbmxwIGZpbGVzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIGJlaW5nIGJ1aWx0Ci0KLSNTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzaWduIGphcnMKLSNzaWduSmFycz1mYWxzZQotI3NpZ24uYWxpYXM9PGFsaWFzPgotI3NpZ24ua2V5c3RvcmU9PGtleXN0b3JlIGxvY2F0aW9uPgotI3NpZ24uc3RvcmVwYXNzPTxrZXlzdG9yZSBwYXNzd29yZD4KLQotI0FyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSB6aXAgZXhlY3V0YWJsZQotemlwYXJncz0KLQotI0FyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSB0YXIgZXhlY3V0YWJsZQotdGFyYXJncz0KLQotI0NvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIGluY2x1ZGVkIGluIGVhY2ggY29uZmlndXJhdGlvbiAtIG9uIGJ5IGRlZmF1bHQgCi0jZ2VuZXJhdGVWZXJzaW9uc0xpc3RzPWZhbHNlCi0KLSMjIyMjIyMjIyMjIyMjIEJVSUxEIE5BTUlORyBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBidWlsZCBlbGVtZW50cyBhcmUgZmV0Y2hlZCBhbmQgd2hlcmUKLSMgdGhlIGJ1aWxkIHRha2VzIHBsYWNlLgotYnVpbGREaXJlY3Rvcnk9LgotCi0jIFR5cGUgb2YgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LiAgVHlwaWNhbGx5IHRoaXMgdmFsdWUgaXMKLSMgb25lIG9mIEksIE4sIE0sIFMsIC4uLgotYnVpbGRUeXBlPWJ1aWxkCi0KLSMgSUQgb2YgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4KLSMgZm9yY2VDb250ZXh0UXVhbGlmZXIgPSBidWlsZCBsYWJlbAotYnVpbGRJZD0ke2ZvcmNlQ29udGV4dFF1YWxpZmllcn0KLQotIyBMYWJlbCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotYnVpbGRMYWJlbD0ke2J1aWxkSWR9Ci0KLSMgVGltZXN0YW1wIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci10aW1lc3RhbXA9MDA3Ci0KLSNUaGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHF1YWxpZmllciBvZiBhIHBsdWdpbiBvciBmZWF0dXJlIHdoZW4geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIGNvbXB1dGVkIGJ5IHBkZS4KLSNUaGUgdmFsdWUgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gcGx1Z2luIG9yIGZlYXR1cmVzIGluZGljYXRpbmcgYnVpbGQucHJvcGVydGllcywgcXVhbGlmaWVyID0gY29udGV4dCAKLSNmb3JjZUNvbnRleHRRdWFsaWZpZXI9PHRoZSB2YWx1ZSBmb3IgdGhlIHF1YWxpZmllcj4KLQotI0VuYWJsZSAvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgYSBzdWZmaXggZm9yIHRoZSBmZWF0dXJlcyB0aGF0IHVzZSAucXVhbGlmaWVyLiAKLSNUaGUgZ2VuZXJhdGVkIHN1ZmZpeCBpcyBjb21wdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZlYXR1cmUgICAKLSNnZW5lcmF0ZUZlYXR1cmVWZXJzaW9uU3VmZml4PXRydWUKLQotIyMjIyMjIyMjIyMjIyBCQVNFIENPTlRST0wgIyMjIyMjIyMjIyMjIwotIyBTZXR0aW5ncyBmb3IgdGhlIGJhc2UgRWNsaXBzZSBjb21wb25lbnRzIGFuZCBKYXZhIGNsYXNzIGxpYnJhcmllcyAKLSMgYWdhaW5zdCB3aGljaCB5b3UgYXJlIGJ1aWxkaW5nLgotIyBCYXNlIGxvY2F0aW9uIGZvciBhbnl0aGluZyB0aGUgYnVpbGQgbmVlZHMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgRm9yIGV4YW1wbGUsCi0jIGluIG1vc3QgUkNQIGFwcCBvciBhIHBsdWctaW4sICB0aGUgYmFzZUxvY2F0aW9uIHNob3VsZCBiZSB0aGUgbG9jYXRpb24gb2YgYSBwcmV2aW91c2x5Ci0jIGluc3RhbGxlZCBFY2xpcHNlIGFnYWluc3Qgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG9yIHBsdWctaW4gY29kZSB3aWxsIGJlIGNvbXBpbGVkIGFuZCB0aGUgUkNQIGRlbHRhIHBhY2suCi0KLWJhc2VMb2NhdGlvbj0ke0VDTElQU0VfSE9NRX0KLSNPcy9Xcy9BcmNoL25sIG9mIHRoZSBlY2xpcHNlIHNwZWNpZmllZCBieSBiYXNlTG9jYXRpb24KLWJhc2Vvcz1saW51eAotYmFzZXdzPWd0awotYmFzZWFyY2g9eDg2Ci0KLSN0aGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBzZXQgb2YgcGx1Zy1pbnMgYW5kIGZlYXR1cmVzIHRvIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHRoZSBidWlsZCB0byBiZSBsaW1pdGVkIHRvIHRoZSBvbmVzIHJlYWNoYWJsZSBmcm9tIHRoZSBmZWF0dXJlcyAvIHBsdWdpbnMgYmVpbmcgYnVpbHQKLWZpbHRlcmVkRGVwZW5kZW5jeUNoZWNrPWZhbHNlCi0KLSN0aGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIHNob3VsZCBiZSBkb25lIGluIGRldmVsb3BtZW50IG1vZGUgKGkuZS4gaWdub3JlIG11bHRpcGxlIGJ1bmRsZXMgd2l0aCBzaW5nbGV0b25zKQotcmVzb2x1dGlvbi5kZXZNb2RlPWZhbHNlCi0KLSNwbHVnaW5QYXRoIGlzIGEgbGlzdCBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdG8gZmluZCBwbHVnaW5zIGFuZCBmZWF0dXJlcy4gIFRoaXMgbGlzdCBpcyBzZXBhcmF0ZWQgYnkgdGhlIHBsYXRmb3JtIGZpbGUgc2VwYXJhdG9yICg7IG9yIDopCi0jYSBsb2NhdGlvbiBpcyBvbmUgb2Y6ICAKLSMtIHRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIG9yIGZvbGRlciB0aGF0IGlzIHRoZSBwbHVnaW4gb3IgZmVhdHVyZSA6IC9wYXRoL3RvL2Zvby5qYXIgb3IgL3BhdGgvdG8vZm9vCi0jLSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgL3BsdWdpbnMgb3IgL2ZlYXR1cmVzIHN1YmRpcmVjdG9yeQotIy0gdGhlIGxvY2F0aW9uIG9mIGEgZmVhdHVyZS54bWwsIG9yIGZvciAyLjEgc3R5bGUgcGx1Z2lucywgdGhlIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCi0jcGx1Z2luUGF0aD0KLQotc2tpcEJhc2U9dHJ1ZQotZWNsaXBzZVVSTD08dXJsIGZvciBlY2xpcHNlIGRvd25sb2FkIHNpdGU+Ci1lY2xpcHNlQnVpbGRJZD08SWQgb2YgRWNsaXBzZSBidWlsZCB0byBnZXQ+Ci1lY2xpcHNlQmFzZVVSTD0ke2VjbGlwc2VVUkx9L2VjbGlwc2UtcGxhdGZvcm0tJHtlY2xpcHNlQnVpbGRJZH0td2luMzIuemlwCi0KLQotIyMjIyMjIyMjIyMjIyBNQVAgRklMRSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgQ1ZTIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIG1hcCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5LgotIyBJZiB5b3Ugd2FudCB0byBmZXRjaCB0aGUgbWFwIGZpbGUgZnJvbSByZXBvc2l0b3J5IC8gbG9jYXRpb24sIGNoYW5nZSB0aGUgZ2V0TWFwRmlsZXMgdGFyZ2V0IGluIHRoZSBjdXN0b21UYXJnZXRzLnhtbAotCi1za2lwTWFwcz10cnVlCi1tYXBzUmVwbz06cHNlcnZlcjphbm9ueW1vdXNAZXhhbXBsZS5jb20vcGF0aC90by9yZXBvCi1tYXBzUm9vdD1wYXRoL3RvL21hcHMKLW1hcHNDaGVja291dFRhZz1IRUFECi0KLSN0YWdNYXBzPXRydWUKLW1hcHNUYWdUYWc9diR7YnVpbGRJZH0KLQotCi0jIyMjIyMjIyMjIyMgUkVQT1NJVE9SWSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIHNlY3Rpb24gZGVmaW5lcyBwcm9wZXJ0aWVzIHBhcmFtZXRlcml6aW5nIHRoZSByZXBvc2l0b3JpZXMgd2hlcmUgcGx1Z2lucywgZnJhZ21lbnRzCi0jIGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGFyZSBiZWluZyBvYnRhaW5lZCBmcm9tLiAKLQotIyBUaGUgdGFncyB0byB1c2Ugd2hlbiBmZXRjaGluZyBlbGVtZW50cyB0byBidWlsZC4KLSMgQnkgZGVmYXVsdCB0aGVidWlsZGVyIHdpbGwgdXNlIHdoYXRldmVyIGlzIGluIHRoZSBtYXBzLiAgCi0jIFRoaXMgdmFsdWUgdGFrZXMgdGhlIGZvcm0gb2YgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGlkZW50aWZpZXIgKGxpa2UgdXNlZCBpbiB0aGUgbWFwIGZpbGVzKSBhbmQgdGhlIAotIyBvdmVycmlkaW5nIHZhbHVlCi0jIEZvciBleGFtcGxlIGZldGNoVGFnPUNWUz1IRUFELCBTVk49djIwMDUwMTAxCi0jIGZldGNoVGFnPUhFQUQKLXNraXBGZXRjaD10cnVlCi0KLQotIyMjIyMjIyMjIyMjIyBKQVZBIENPTVBJTEVSIE9QVElPTlMgIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgVHlwaWNhbGx5IHRoZSBydC5qYXIgZm9yIHlvdXIgSkRLL0pSRQotI2Jvb3RjbGFzc3BhdGg9JHtqYXZhLmhvbWV9L2xpYi9ydC5qYXIKLQotIyBzcGVjaWZpYyBKUkUgbG9jYXRpb25zIHRvIGNvbXBpbGUgYWdhaW5zdC4gVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGNvbXBpbGUgYnVuZGxlcyBzcGVjaWZ5aW5nIGEgCi0jIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50LiBVbmNvbW1lbnQgYW5kIHNldCB2YWx1ZXMgZm9yIGVudmlyb25tZW50cyB0aGF0IHlvdSBzdXBwb3J0Ci0jQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMD0gL3BhdGgvdG8vcnQuamFyCi0jQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMT0KLSNPU0dpL01pbmltdW0tMS4wPQotI09TR2kvTWluaW11bS0xLjE9Ci0jSlJFLTEuMT0KLSNKMlNFLTEuMj0KLSNKMlNFLTEuMz0KLSNKMlNFLTEuND0KLSNKMlNFLTEuNT0KLSNKYXZhU0UtMS42PQotI1BlcnNvbmFsSmF2YS0xLjE9Ci0jUGVyc29uYWxKYXZhLTEuMj0KLSNDREMtMS4wL1BlcnNvbmFsQmFzaXMtMS4wPQotI0NEQy0xLjAvUGVyc29uYWxKYXZhLTEuMD0KLSNDREMtMS4xL1BlcnNvbmFsQmFzaXMtMS4xPQotI0NEQy0xLjEvUGVyc29uYWxKYXZhLTEuMT0KLQotIyBTcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBjb21waWxlciBsb2cgd2hlbiBlY2xpcHNlIGpkdCBpcyB1c2VkCi1sb2dFeHRlbnNpb249LmxvZwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZGVidWcgaW5mbyBpbiB0aGUgb3V0cHV0IGphcnMKLWphdmFjRGVidWdJbmZvPWZhbHNlIAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZXJlIGFyZSBjb21waWxlciBlcnJvcnMKLWphdmFjRmFpbE9uRXJyb3I9dHJ1ZQotCi0jIEVuYWJsZSBvciBkaXNhYmxlIHZlcmJvc2UgbW9kZSBvZiB0aGUgY29tcGlsZXIKLWphdmFjVmVyYm9zZT10cnVlCi0KLSMgRXh0cmEgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIuIFRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgamF2YSBjb21waWxlciBiZWluZyB1c2VkLgotI2NvbXBpbGVyQXJnPQotCi0jIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZS4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjU291cmNlIGluIGJ1aWxkLnByb3BlcnRpZXMKLWphdmFjU291cmNlPTEuNQotCi0jIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBieXRlIGNvZGUgdGFyZ2V0ZWQuIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBwbHVnLWlucyB0aGF0IGRvIG5vdCBzZXQgdGhlIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IG9yIHNldCBqYXZhY1RhcmdldCBpbiBidWlsZC5wcm9wZXJ0aWVzLgotamF2YWNUYXJnZXQ9MS41Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMgQ1VTVE9NIFBST1BFUlRJRVMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHJlcG9zaXRvcnkgbG9jYXRpb24gZm9yIHVwZGF0ZSBzaXRlCi0jIGNvbW1lbnQgb3V0IC0gdGhpcyBpcyBwYXNzZWQgaW4gZnJvbSBjb21tYW5kIGxpbmUgCi0jdXBkYXRlU2l0ZVNvdXJjZT0ke2J1aWxkRGlyZWN0b3J5fS9zaXRlcy9leHRlcm5hbAotIyB3aGVyZSB0byBwbGFjZSB1cGRhdGUgc2l0ZSBidWlsZAotdXBkYXRlU2l0ZVJvb3Q9JHt1c2VyLmhvbWV9L3d3dy9ub19jcmF3bC8KLXVwZGF0ZVNpdGVGb2xkZXI9JHthcmNoaXZlUHJlZml4fQotdXBkYXRlU2l0ZURlc3RpbmF0aW9uPSR7dXBkYXRlU2l0ZVJvb3R9LyR7dXBkYXRlU2l0ZUZvbGRlcn0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvYnVpbGRDb25maWcvYnVpbGRVcGRhdGVTaXRlLnhtbCBiL3Rvb2xzL2VjbGlwc2UvYnVpbGRDb25maWcvYnVpbGRVcGRhdGVTaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiN2M5OS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL2J1aWxkQ29uZmlnL2J1aWxkVXBkYXRlU2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJ1cGRhdGUgc2l0ZSI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gRXh0cmFjdHMgZmVhdHVyZSB6aXAgZm9yIHVwZGF0ZSBzaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIGV4cGVjdGVkIHByb3BlcnRpZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICBpZCAtIGZlYXR1cmUgaWQgdG8gZXh0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gICAgYnVpbGREaXJlY3RvcnkgLSBiYXNlIGRpcmVjdGdvcnkgd2hlcmUgYnVpbGQgdGFrZXMgcGxhY2UgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tICAgIGJ1aWxkTGFiZWwgLSBidWlsZCBpZCBsYWJlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICB1cGRhdGVTaXRlUm9vdCAtIHdoZXJlIHRvIGV4dHJhY3QgZmVhdHVyZSB6aXAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImV4dHJhY3RGZWF0dXJlIj4KLSAgICAgICAgPHVuemlwIHNyYz0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS8ke2lkfS0ke2J1aWxkTGFiZWx9LnppcCIgZGVzdD0iJHt1cGRhdGVTaXRlUm9vdH0iLz4gICAgICAgIAotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9idWlsZENvbmZpZy9jdXN0b21UYXJnZXRzLnhtbCBiL3Rvb2xzL2VjbGlwc2UvYnVpbGRDb25maWcvY3VzdG9tVGFyZ2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDZiZmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9idWlsZENvbmZpZy9jdXN0b21UYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEVjbGlwc2UgdGVtcGxhdGUgZmlsZSBmb3IgUERFIGJ1aWxkcyAtLT4KLTwhLS0gdGVtcGxhdGUgb3JpZ2luYWxseSBvYnRhaW5lZCBmcm9tIG9yZy5lY2xpcHNlLnBkZS5idWlsZC90ZW1wbGF0ZXMvaGVhZGxlc3MtYnVpbGQgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0IC0tPgotICAgIDwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxFbGVtZW50c0ZpbGUiIHZhbHVlPSIke2J1aWxkZXJ9L2FsbEVsZW1lbnRzLnhtbCIvPgotICAgIDxpbXBvcnQgZmlsZT0iJHthbGxFbGVtZW50c0ZpbGV9IiAvPgotICAgIDx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHMiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzRGVsZWdhdG9yIiAvPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZ2V0QmFzZUNvbXBvbmVudHMiIGRlcGVuZHM9ImNoZWNrTG9jYWxCYXNlIiB1bmxlc3M9InNraXBCYXNlIj4KLSAgICAgICAgPGdldCBzcmM9IiR7ZWNsaXBzZUJhc2VVUkx9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8uLi90ZW1wLWJhc2UuemlwIiAvPgotICAgICAgICA8dW56aXAgZGVzdD0iJHtiYXNlfSIgb3ZlcndyaXRlPSJ0cnVlIiBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrTG9jYWxCYXNlIj4KLSAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2V9IiBwcm9wZXJ0eT0ic2tpcEJhc2UiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENoZWNrIG91dCBtYXAgZmlsZXMgZnJvbSBjb3JyZWN0IHJlcG9zaXRvcnkgLS0+Ci0gICAgPCEtLSBSZXBsYWNlIHZhbHVlcyBmb3IgbWFwc0NoZWNrb3V0VGFnIGFzIGRlc2lyZWQuIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZ2V0TWFwRmlsZXMiIGRlcGVuZHM9ImNoZWNrTG9jYWxNYXBzIiB1bmxlc3M9InNraXBNYXBzIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcHNDaGVja291dFRhZyIgdmFsdWU9IkhFQUQiIC8+Ci0gICAgICAgIDxjdnMgY3ZzUm9vdD0iJHttYXBzUmVwb30iIHBhY2thZ2U9IiR7bWFwc1Jvb3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIiB0YWc9IiR7bWFwc0NoZWNrb3V0VGFnfSIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbE1hcHMiPgotICAgICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJza2lwTWFwcyIgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idGFnTWFwRmlsZXMiIGlmPSJ0YWdNYXBzIj4KLSAgICAgICAgPGN2cyBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzLyR7bWFwc1Jvb3R9IiBjb21tYW5kPSJ0YWcgJHttYXBzVGFnVGFnfSIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgdW5sZXNzPSJub2NsZWFuIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iY2xlYW5FbGVtZW50IiAvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdhdGhlckxvZ3MiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L2NvbXBpbGVsb2dzIiAvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJnYXRoZXJMb2dzIiAvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgICAgIDx1bnppcCBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L2NvbXBpbGVsb2dzIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5sb2cuemlwIiAvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L3VuemlwPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgc2V0dXAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwcmVTZXR1cCI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHNldHVwIGJ1dCBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHByb3BlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZ2V0QmFzZUNvbXBvbmVudHMiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwcmVGZXRjaCI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGZldGNoaW5nIHRoZSBidWlsZCBlbGVtZW50cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InBvc3RGZXRjaCI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InByZUdlbmVyYXRlIj4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwb3N0R2VuZXJhdGUiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InByZVByb2Nlc3MiPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0icG9zdFByb2Nlc3MiPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwcmVBc3NlbWJsZSI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InBvc3RBc3NlbWJsZSI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHBhY2thZ2UuIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0icHJlUGFja2FnZSI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIHBhY2thZ2UuIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0icG9zdFBhY2thZ2UiPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgYnVpbGQgaXMgZG9uZS4gLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwb3N0QnVpbGQiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlckxvZ3MiIC8+Ci0gICAgICAgIDwhLS0gQWRkZWQgdGhpcyBjdXN0b20gdGFyZ2V0ICEgLS0+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGVVcGRhdGVTaXRlIiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyB0byB0ZXN0IHRoZSBidWlsZCByZXN1bHRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0idGVzdCI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIj4KLSAgICAgICAgCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiIC8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDdXN0b20gdGFyZ2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTdGVwcyB0byBkbyB0byBnZW5lcmF0ZSB0aGUgdXBkYXRlIHNpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZVVwZGF0ZVNpdGUiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJDb3B5aW5nIHVwZGF0ZSBzaXRlIHNvdXJjZSAke3VwZGF0ZVNpdGVTb3VyY2V9IHRvIGRlc3RpbmF0aW9uIi8+Ci0gICAgCQotICAgICAgICA8Y29weSBmaWxlPSIke3VwZGF0ZVNpdGVTb3VyY2V9L3NpdGUueG1sIiBvdmVyd3JpdGU9InRydWUiIHRvZGlyPSIke3VwZGF0ZVNpdGVEZXN0aW5hdGlvbn0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt1cGRhdGVTaXRlU291cmNlfS9pbmRleC5odG1sIiBvdmVyd3JpdGU9InRydWUiIHRvZGlyPSIke3VwZGF0ZVNpdGVEZXN0aW5hdGlvbn0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt1cGRhdGVTaXRlU291cmNlfS93ZWIvc2l0ZS5jc3MiIG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7dXBkYXRlU2l0ZURlc3RpbmF0aW9ufS93ZWIiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt1cGRhdGVTaXRlU291cmNlfS93ZWIvc2l0ZS54c2wiIG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7dXBkYXRlU2l0ZURlc3RpbmF0aW9ufS93ZWIiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gcmVwbGFjZSBxdWFsaWZpZXIgdmVyc2lvbiByZWZlcmVuY2VzIHdpdGggYnVpbGQgbGFiZWwgLS0+Ci0gICAgICAgIDxyZXBsYWNlIGZpbGU9IiR7dXBkYXRlU2l0ZURlc3RpbmF0aW9ufS9zaXRlLnhtbCIgdG9rZW49InF1YWxpZmllciIgdmFsdWU9IiR7YnVpbGRJZH0iLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbm93IGV4dHJhY3QgZWFjaCBmZWF0dXJlcyB6aXAgdG8gdXBkYXRlIHNpdGUgLS0+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHMiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdlbmVyaWNUYXJnZXRzIiB2YWx1ZT0iJHtidWlsZGVyfS9idWlsZFVwZGF0ZVNpdGUueG1sIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZXh0cmFjdEZlYXR1cmUiIC8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICAgICAgCi0gICAgICAgIDxjaG1vZCBwZXJtPSI3NTUiIHR5cGU9ImJvdGgiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3VwZGF0ZVNpdGVEZXN0aW5hdGlvbn0iPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NobW9kPiAgICAKLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9jaGFuZ2VzLnR4dCBiL3Rvb2xzL2VjbGlwc2UvY2hhbmdlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNjUzYzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9jaGFuZ2VzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0wLjkuNDoKLS0gTmV3ICJDcmVhdGUgcHJvamVjdCBmcm9tIHNhbXBsZSIgY2hvaWNlIGluIHRoZSBOZXcgUHJvamVjdCBXaXphcmQuCi0KLTAuOS4zOgotLSBOZXcgd2l6YXJkIHRvIGNyZWF0ZSBBbmRyb2lkIEpVbml0IFRlc3QgUHJvamVjdHMuCi0tIE5ldyBBVkQgd2l6YXJkLgotLSBTREsgVXBkYXRlcgotLSB6aXBhbGlnbiBzdXBwb3J0Ci0KLTAuOS4xOgotLSBBZGRlZCBhbiBBVkQgY3JlYXRpb24gd2l6YXJkIHRvIEFEVC4gSXQgaXMgYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgZHVyaW5nIGEgbGF1bmNoIGlmIG5vIGNvbXBhdGlibGUgQVZEcyBhcmUgZm91bmQuCi0tIEZpeGVkIGlzc3VlIHdpdGggbGlicy8gZm9sZGVyIHdoZXJlIGZpbGVzIHdpdGggbm8gZXh0ZW5zaW9uIHdvdWxkIHByZXZlbnQgdGhlIGJ1aWxkIGZyb20gZmluaXNoaW5nLgotLSBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyBkdXJpbmcgdGhlIGZpbmFsIHN0ZXBzIG9mIHRoZSBidWlsZCB0byBtYXJrIHRoZSBwcm9qZWN0IGlmIGFuIHVuZXhwZWN0ZWQgZXJyb3IgcHJldmVudCB0aGUgYnVpbGQgZnJvbSBmaW5pc2hpbmcuCi0tIEZpeGVkIGlzc3VlIHdoZW4gbGF1bmNoaW5nIEFEVCBvbiBhIGNsZWFuIGluc3RhbGwgd291bGQgdHJpZ2dlciBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I6IE5vdCBpbXBsZW1lbnRlZCBbbXVsdGlwbGUgZGlzcGxheXNdLgotCi0KLTAuOS4wOgotLSBQcm9qZWN0cyBub3cgc3RvcmUgZ2VuZXJhdGVkIEphdmEgZmlsZXMgKFIuamF2YS9NYW5pZmVzdC5qYXZhIGFuZCBvdXRwdXQgZnJvbSBhaWRsKSBpbiBhICdnZW4nIHNvdXJjZSBmb2xkZXIuCi0tIFN1cHBvcnQgZm9yIHRoZSBuZXcgQW5kcm9pZCBTREsgd2l0aCBzdXBwb3J0IGZvciBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhbmQgZm9yIHZlbmRvciBzdXBwbGllZCBhZGQtb25zLgotICAgICogTmV3IFByb2plY3QgV2l6YXJkIGxldHMgeW91IGNob29zZSB3aGljaCBwbGF0Zm9ybS9hZGQtb24gdG8gdGFyZ2V0LgotICAgICogUHJvamVjdCBwcm9wZXJ0aWVzIChyaWdodCBjbGljayBwcm9qZWN0IGluIFBhY2thZ2UgRXhwbG9yZXIsIHRoZW4gIlByb3BlcnRpZXMiKSwgbGV0cyB5b3UgZWRpdCBwcm9qZWN0IHRhcmdldC4KLSAgICAqIE5ldyBMYXVuY2ggY29uZmlndXJhdGlvbiBvcHRpb24gdG8gY2hvb3NlIGRlYnVnIGRlcGxveW1lbnQgdGFyZ2V0LgotLSBBYmlsaXR5IHRvIGV4cG9ydCBtdWx0aXBsZSBhcGsgZnJvbSBvbmUgcHJvamVjdCwgdXNpbmcgcmVzb3VyY2UgZmlsdGVycy4gU2VlIHRoZSAnYW5kcm9pZCcgcHJvcGVydHkgZm9yIEFuZHJvaWQgcHJvamVjdHMuCi0tIFN1cHBvcnQgZm9yIHJ1bm5pbmcgSlVuaXQgdGVzdHMgb24gYSBkZXZpY2UvZW11bGF0b3IgZnJvbSBhIG5ldyAiQW5kcm9pZCBKVW5pdCB0ZXN0cyIgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0KLTAuOC4xOgotCi0tIEFsdGVybmF0ZSBMYXlvdXQgd2l6YXJkLiBJbiB0aGUgbGF5b3V0IGVkaXRvciwgdGhlICJjcmVhdGUiIGJ1dHRvbiBpcyBub3cgZW5hYmxlZCB0byBlYXNpbHkgY3JlYXRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiB0aGUgY3VycmVudCBsYXlvdXQuCi0tIEZpeGVkIGlzc3VlIHdpdGggY3VzdG9tIHRoZW1lcy9zdHlsZXMgaW4gdGhlIGxheW91dCBlZGl0b3IuCi0tIEV4cG9ydCBXaXphcmQ6IFRvIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBmb3IgcmVsZWFzZSwgYW5kIHNpZ24gaXQgd2l0aCBhIG5vbiBkZWJ1ZyBrZXkuIEFjY2Vzc2libGUgZnJvbSB0aGUgZXhwb3J0IG1lbnUsIGZyb20gdGhlIEFuZHJvaWQgVG9vbHMgY29udGV4dHVhbCBtZW51LCBvciBmcm9tIHRoZSBvdmVydmlldyBwYWdlIG9mIHRoZSBtYW5pZmVzdCBlZGl0b3IuCi0tIE5ldyBYTUwgRmlsZSBXaXphcmQ6IFRvIGVhc2lseSBjcmVhdGUgbmV3IFhNTCByZXNvdXJjZXMgZmlsZSBpbiB0aGUgL3JlcyBkaXJlY3RvcnkuCi0tIE5ldyBjaGVja3Mgb24gbGF1bmNoIHdoZW4gYXR0ZW1wdGluZyB0byBkZWJ1ZyBvbiBhIGRldmljZS4KLS0gQmFzaWMgc3VwcG9ydCBmb3IgZHJhZyduJ2Ryb3AgaW4gR3JhcGhpY2FsIGxheW91dCBlZGl0b3IuIFlvdSBjYW4gYWRkIG5ldyBpdGVtcyBieSBkcmFnJ24nZHJvcCBmcm9tIHRoZSBwYWxldHRlLiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBtb3ZpbmcvcmVzaXppbmcgeWV0LgotLSBVbmRvL3JlZG8gc3VwcG9ydCBpbiBhbGwgWE1MIGZvcm0gZWRpdG9ycyBhbmQgR3JhcGhpY2FsIGxheW91dCBlZGl0b3IuCi0KLTAuOC4wOgotCi0tIEZpeGVkIGlzc3VlIHdpdGggdXNpbmcgY3VzdG9tIGNsYXNzZXMgaW1wbGVtZW50aW5nIFBhcmNlbGFibGUgaW4gYWlkbCBmaWxlcy4gUmlnaHQgY2xpY2sgdGhlIHByb2plY3QgYW5kIGNob29zZSBBbmRyb2lkIFRvb2xzID4gQ3JlYXRlIGFpZGwgcHJlcHJvY2VzcyBmaWxlIGZvciBQYXJjZWxhYmxlIENsYXNzZXMuCi0tIEFkZGVkIEN1c3RvbSBUaGVtZXMgdG8gdGhlbWUgZHJvcCBkb3duIGluIHRoZSBsYXlvdXQgZWRpdG9yLgotLSBDdXN0b21pemFibGUgZGVidWcgc2lnbmluZyBrZXlzdG9yZSBwYXRoIGluIHByZWZlcmVuY2VzCi0tIEN1c3RvbWl6YWJsZSBIT01FIHBhY2thZ2UgbmFtZS4KLQotMC43LjE6Ci0KLS0gTGF5b3V0IEVkaXRvci4KLQotMC42LjE6Ci0KLS0gRml4ZWQgaW5zdGFsbCBpc3N1ZSB3aGVuIHByb2plY3QgbmFtZSBjb250YWlucyBzcGFjZXMgKHJlcXVpcmVzIG5ldyBlbXVsYXRvciBpbWFnZSkKLS0gRml4ZWQgc2V0dXAgb2YgdGhlIE5ldyBjbGFzcyB3aXphcmQgaW4gdGhlIG1hbmlmZXN0ICh3aGVuIGNsaWNraW5nIG9uICJuYW1lIiBmb3IgYSBjbGFzcyBhdHRyaWJ1dGUpIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgY2xhc3MgYW5kIHNvbWUgb2YgaXRzIHBhcmVudCBwYWNrYWdlcyB3ZXJlIG1pc3NpbmcuCi0tIFByb3Blcmx5IGtpbGwgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWJvdXQgdG8gYmUgcmVpbnN0YWxsZWQuCi0tIENyZWF0ZSBtaXNzaW5nIGFuZHJvaWQgZm9sZGVyIGF1dG9tYXRpY2FsbHkgd2hlbiBidWlsZGluZyBhcHBsaWNhdGlvbiAoY2F1c2VkIGEgc2lnbmluZyBlcnJvcikKLS0gTWFuaWZlc3QgZWRpdG9yOiBzdXBwb3J0IGZvciB1c2VzLWxpYnJhcnkgbm9kZQotLSBGaXhlZCBOUEUgaW4gZWRpdG9ycy54bWwuZGVzY3JpcHRvcnMuWG1sRGVzY3JpcHRvcnMuY3JlYXRlUHJlZmVyZW5jZQotLSBGaXhlZCBhc3NlcnQgaW4gTXVsdGlFZGl0b3JQYXJ0LnNldEFjdGl2ZVBhZ2UKLS0gRml4ZWQgImNvbm5lY3QgdG8gZGVidWdnZXIiIGJ1dHRvbiBpbiBEZXZpY2VWaWV3LiBBbHNvIGZpeGVkIHN1cHBvcnQgZm9yIGN1c3RvbSBwcm9jZXNzIG5hbWVzLgotCi0wLjYuMDoKLQotLSBuZXcgbGF1bmNoIG9wdGlvbiBmb3IgYWN0aXZpdHkuIENhbiBjaG9vc2UgdG8gbGF1bmNoIGRlZmF1bHQgYWN0aXZpdHkgKGZpbmRzIGFuIGFjdGl2aXR5IGNvbmZpZ3VyZWQgdG8gc2hvdyB1cCBpbiB0aGUgaG9tZSBzY3JlZW4pLCBvciBzcGVjaWZpYyBhY3Rpdml0eSwgb3Igbm9uZS4KLS0gbm9ybWFsIGphdmEgcmVzb3VyY2VzIChub24gamF2YSBmaWxlcyBwbGFjZWQgaW4gcGFja2FnZSBmb2xkZXJzKSBhcmUgbm93IHByb3Blcmx5IHBhY2thZ2VkIGluIHRoZSBmaW5hbCBwYWNrYWdlLCBhbmQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggbm9ybWFsIGphdmEgQVBJIHN1Y2ggYXMgQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpCi0tIGxhdW5jaCBjb25maWd1cmF0aW9uIG5vdyBoYXMgYW4gb3B0aW9uIHRvIHdpcGUgZW11bGF0b3IgZGF0YSBvbiBsYXVuY2guIFRoaXMgYWx3YXlzIGFza3MgZm9yIGNvbmZpcm1hdGlvbi4KLS0gbGF1bmNoIGNvbmZpZ3VyYXRpb24gbm93IGhhcyBhbiBvcHRpb24gdG8gZGlzYWJsZSB0aGUgYm9vdCBhbmltYXRpb24uIFRoaXMgd2lsbCBsZXQgdGhlIGVtdWxhdG9yIHN0YXJ0IGZhc3RlciBvbiBvbGRlciBjb21wdXRlcnMuCi0tIEFwcGxpY2F0aW9ucyBhcmUgbm93IHNpZ25lZCB3aXRoIGEgZGVidWcga2V5IChzdG9yZWQgaW4gZGVidWcua2V5c3RvcmUgaW4gfi8uYW5kcm9pZCkuCi0tIEluc3RhbGxhdGlvbiBvZiBhcHBsaWNhdGlvbiBpcyBub3cgbW9yZSByb2J1c3QgYW5kIHdpbGwgbm90aWZ5IG9mIGluc3RhbGxhdGlvbiBmYWlsdXJlLiBBbHNvIGluc3RhbGxhdGlvbiBpcyBibG9ja2luZywgcmVtb3ZpbmcgaXNzdWVzIHdoZXJlIEFEVCB0cmllZCB0byBsYXVuY2ggdGhlIGFjdGl2aXR5IGJlZm9yZSB0aGUgYXBwIHdhcyBpbnN0YWxsZWQuCi0tIFRyZWUtYmFzZWQgcmVzb3VyY2UgZWRpdG9yICsgY29udGVudCBhc3Npc3QgaW4gWE1MIGVkaXRvciBmb3IgbGF5b3V0LCBtZW51LCBwcmVmZXJlbmNlcywgdmFsdWVzIHhtbCBmaWxlcy4gV29yayBpbiBwcm9ncmVzcy4uLgotCi0KLTAuNC4wIChhZHQgMC40LjAsIGRkbXMgMC4zLjAsIGVkaXRvcnMgMC4yLjAsIGNvbW1vbiAwLjEuMCkKLQotLSBOZXcgQW5kcm9pZE1hbmlmZXN0IGVkaXRvci4KLS0gVHJ1ZSBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydCBhbGxvd2luZyBkZWJ1Z2dpbmcgYXBwcyBvbiBzZXZlcmFsIGRldmljZSBhdCB0aGUgc2FtZSB0aW1lCi0tIE5ldyBsYXVuY2ggbW9kZXMgZm9yIGRldmljZSBzZWxlY3Rpb246IGF1dG9tYXRpYyB3aWxsIGxhdW5jaCBhbiBlbXVsYXRvciBpZiBubyBkZXZpY2UgYXJlIHByZXNlbnQsIGF1dG9tYXRpY2FsbHkgdGFyZ2V0IHRoZSBkZXZpY2UgaWYgb25seSBvbmUgZXhpc3RzLCBhbmQgcHJvbXB0IHRoZSB1c2VyIGlmIDIrIGFyZSBjb25uZWN0ZWQuIE1hbnVhbCBtb2RlIGFsd2F5cyBwcm9tcHQgdGhlIHVzZXIuCi0tIE5ldyBjbGFzc3BhdGggY29udGFpbmVyIHJlbW92ZSB0aGUgZGVwZW5kZW5jaWVzIG9uIHRoZSBsb2NhdGlvbiBvZiBhbmRyb2lkLmphciBtYWtpbmcgaXQgZWFzaWVyIHRvIHNoYXJlIGEgcHJvamVjdCB0aHJvdWdoIGRzdm4sIGN2cywgZXRjLi4uIFlvdSBzaG91bGQgZml4IHlvdXIgcHJvamVjdCAocmlnaHQgY2xpY2sgcHJvamVjdCwgY2hvb3NlIEFuZHJvaWQgPiBGaXggUHJvamVjdCBwcm9wZXJ0aWVzKQotLSBGaXhlZCBhIGNhc2Ugd2hlcmUgcG0gd291bGQgZmFpbCBhbmQgd291bGQgdXAgZW5kIG91dHB1dHRpbmcgdGhlICJ1c2FnZSIgdGV4dCwgd2hpY2ggd291bGQgaW4gdHVybiBjb25mdXNlIHRoZSBwbHVnaW4gZHVyaW5nIHBhcnNpbmcuCi0tIEZpeGVkIGFuIGlzc3VlIHdpdGggY29tcGlsaW5nIGFpZGwgZmlsZSB3aGVuIHRoZXkgaW1wb3J0IHByb2plY3QgbG9jYWwgZmlsZXMuCi0KLTAuMy40IChhZHQgMC4zLjQsIGRkbXMgMC4yLjMsIGVkaXRvcnMgMC4xLjApCi0KLUludGVybmFsIHJlbGVhc2Ugb25seS4KLS0gRW5hYmxlZCBkZXZpY2Ugc3VwcG9ydC4KLQotMC4zLjMgKGFkdCAwLjMuMywgZGRtcyAwLjIuMywgZWRpdG9ycyAwLjEuMCkKLQotLSBTdXBwb3J0IGZvciByZWZlcmVuY2VkIHByb2plY3RzLgotLSBEdXJpbmcgbGF1bmNoLCBkaXNwbGF5IGlmIGEgcGFja2FnZSBjb25mbGljdCBvY2N1cnMgd2hlbiB0aGUgbmV3IGFwcGxpY2F0aW9uIGlzIHB1c2hlZCBvbnRvIHRoZSBkZXZpY2UuCi0tIFlvdSBjYW4gbm93IGNoYW5nZSB0aGUgZm9udCBvZiB0aGUgbG9nY2F0IHZpZXcuIEFsc28gaW5kZW50YXRpb24gaXMgbm93IHByb3Blcmx5IGRpc3BsYXllZC4KLS0gUGx1Z2luIGdlbmVyYXRlZCBmaWxlcyBhcmUgbm93IHByb3Blcmx5IG1hcmtlZCBhcyBkZXJpdmVkLiBUaGlzIHdpbGwgbWFrZSBUZWFtIHBsdWdpbnMgaWdub3JlIHRoZW0uCi0KLTAuMy4yCi0KLS0gWE1MIEhpZ2hsaWdodGluZyBmb3IgQW5kcm9pZE1hbmlmZXN0LnhtbCAocmVxdWlyZXMgV2ViVG9vbHMgV1NUIHBsdWdpbikKLS0gQ3VzdG9tIGphdmEgZWRpdG9yIGZvciBSLmphdmEvTWFuaWZlc3QuamF2YSB0byBtYWtlIHRob3NlIGZpbGVzIG5vbiBlZGl0YWJsZS4gVGhpcyBpcyB0byByZXBsYWNlIHRoZSBjdXJyZW50IGxvY2tpbmcgbWVjaGFuaXNtIHdoaWNoIGNhdXNlcyBpc3N1ZXMgb24gTWFjIE9TLgotLSBGaXhlZCBzb21lIGlzc3VlIGluIHRoZSAiUmVzdGFydCBhZGIiIGZlYXR1cmUgaW4gdGhlIGRldmljZSB2aWV3IG9mIGRkbXMuCi0tIEJldHRlciBoYW5kbGluZyBvZiBhaWRsIGZpbGVzIGFuZCB0aGUgamF2YSBmaWxlcyBnZW5lcmF0ZWQgZnJvbSB0aGVtLgotLSBQbHVnaW4gbm93IHJldHJpZXMgdG8gbGF1bmNoIHRoZSBhcHAgb24gdGhlIGVtdWxhdG9yIGlmIGl0IGZhaWxzIGR1ZSB0byB0aW1pbmcgaXNzdWVzLgotLSBTa2luIGRyb3Bkb3duIGluIHRoZSBFbXVsYXRvci9UYXJnZXQgdGFicyBpcyBub3cgYnVpbGQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgc2tpbiBkaXJlY3RvcnksIHRvIHN1cHBvcnQgZGV2ZWxvcGVyIG1hZGUgc2tpbnMuCi0tIEVtdWxhdG9yIGNvbnRyb2wgcGFuZWwuIFRoaXMgaXMgYSBVSSBvbiB0b3Agb2YgdGhlIGVtdWxhdG9yIGNvbnNvbGUuIGl0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgbmV0d29yayBhbmQgZ3NtIGNvbm5lY3Rpb24sIGFuZCB0byBpbml0aWF0ZSBpbmNvbWluZyB2b2ljZSBjYWxsLgotCi0wLjMuMQotCi0tIEZpeGVkIGlzc3VlIG9uIHdpblhQL0VjbGlwc2UgMy4yIHdoZXJlIGVycm9ycyBpbiB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHdvdWxkIG5vdCBkaXNwbGF5LgotLSBBZGRlZCBtaXNzaW5nIGludGVudCBkZWZpbml0aW9uIGluIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUgY3JlYXRlZCBieSB0aGUgTmV3IFByb2plY3QgV2l6YXJkLgotLSBGaXhlZCBwb3NzaWJsZSBOUEUgaW4gdGhlIGRlYnVnIGFjdGlvbiBmcm9tIHRoZSBQcm9jZXNzIFZpZXcKLS0gU3VwcG9ydCBmb3IgRWNsaXBzZSAzLjQKLQotMC4yLjYgLyAwLjMuMAotCi0tIE5ldyBQcm9qZWN0IFdpemFyZCBub3cgbWFrZXMgaXQgZWFzeSB0byBvcGVuIEFuZHJvaWQgc2FtcGxlIGNvZGUKLS0gUGx1Z2luIHdpbGwgb3V0cHV0IGEgd2FybmluZyBpZiB0aGUgYnVpbGQgaWQgb2YgdGhlIGRldmljZS9lbXVsYXRvciBkb2VzIG5vdCBtYXRjaCB0aGUgc2RrIGJ1aWxkIGlkLgotLSBKYXZhL0RlYnVnL2RkbXMgcGVyc3BlY3RpdmUgbm93IGNvbnRhaW5zIGRpcmVjdCBtZW51cyB0byBvcGVuIHNvbWUgb2YgdGhlIGRkbXMgdmlld3MsIGFuZCB0byBjcmVhdGUgYSBuZXcgYW5kcm9pZCBwcm9qZWN0LiBUaGlzIHdpbGwgcmVxdWlyZSB5b3UgdG8gcmVzZXQgeW91ciBwZXJzcGVjdGl2ZXMuCi0tIEVycm9yIGR1cmluZyBidWlsZHMgbm93IHB1dCBhbiBlcnJvciBtYXJrZXIgb24gdGhlIHByb2plY3QgaW5zdGVhZCBvZiBkaXNwbGF5aW5nIGFuIChhbm5veWluZykgZGlhbG9nIGJveC4KLS0gQ3VzdG9tIGJ1aWxkZXJzIG5vdyByZW1lbWJlciB0aGVpciBidWlsZCBzdGF0ZSB3aGVuIHJlc3RhcnRpbmcgZWNsaXBzZS4KLS0gUHJvcGVybHkgcGFyc2Ugc29tZSBhYXB0IHdhcm5pbmdzIGFuZCBkb24ndCBhYm9ydCB0aGUgYnVpbGQgd2hlbiB0aGV5IGhhcHBlbi4KLS0gQWJvcnQgbGF1bmNoIGFuZCBwcm9tcHQgdGhlIHVzZXIgaWYgdGhlIHByb2plY3QgY29udGFpbnMgZXJyb3JzLgotLSBOZXcgc2lsZW50L25vcm1hbC92ZXJib3NlIGJ1aWxkIG91dHB1dC4KLQotMC4yLjUKLQotLSBDaGVjayBjb21waWxlciBjb21wbGlhbmNlIGxldmVsIGJlZm9yZSBjb21waWxhdGlvbiBhbmQgYWJvcnQgaWYgZGlmZmVyZW50IGZyb20gMS41Ci0tIEZpeCBQcm9qZWN0IFByb3BlcnRpZXMgd2lsbCBmaXggdGhlIHByb2plY3QgY29tcGlsZXIgY29tcGxpYW5jZSBpZiBuZWVkZWQuCi0tIEZpeGVkIGFuIGlzc3VlIHdpdGggbXVsdGlwbGUgc291cmNlIGZvbGRlcnMuCi0tIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBNYW5pZmVzdC5qYXZhIGNsYXNzIChpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aXRoIFIuamF2YSBpZiB0aGUgY29udGVudCBvZiB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCByZXF1aXJlcyBpdCkKLS0gRml4ZWQgYW4gaXNzdWUgdGhhdCBjb3VsZCByZXN1bHQgaW4gbm90IHBhY2thZ2luZyBjb2RlIGNoYW5nZXMuCi0tIEF1dG9tYXRpYyBmaXggb2YgdGhlIExhdW5jaCBDb25maWd1cmF0aW9ucyB3aGVuIHRoZSBqYXZhIHBhY2thZ2UgaW4gdGhlIG1hbmlmZXN0IGlzIGNoYW5nZWQuIEFsc28gaW1wcm92ZWQgTGF1bmNoIENvbmZpZyBkaWFsb2cgYW5kIGVycm9yIGFsZXJ0IGZvciBlcnJvbmVvdXMgYWN0aXZpdHkgbmFtZXMgaW4gdGhlIExhdW5jaCBDb25maWd1cmF0aW9uLgotLSBTdXBwb3J0IGZvciBleHRlcm5hbCBqYXJzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KLS0gTmV3IHByb2plY3RzIGhhdmUgYSBkZWZhdWx0IGxheW91dC4KLS0gTWlzYyBmaXhlcyBmb3IgV2luZG93cyBzdXBwb3J0LgotCi0wLjIuNAotCi0tIGZpeGVkIGxhcmdlIHJlc291cmNlIGNvcnJ1cHRpb24gaXNzdWUuCi0KLTAuMi4zCi0KLS0gZml4ZWQgaXNzdWUgcmVsYXRlZCB0byB0aGUgaW50ZWdyYXRpb24gb2YgZHguCi0tIGZpeGVkIGlzc3VlIHJlbGF0ZWQgdG8gdGhlIHBhY2thZ2UgZ2VuZXJhdGlvbiB0aGF0IHdhcyBtb2RpZmllZCBmb3Igd2luZG93cyBzdXBwb3J0LiAKLQotMC4yLjIKLQotLSBDaGFuZ2luZyB0aGUgU0RLIGxvY2F0aW9uIGluIHRoZSBQcmVmZXJlbmNlcyBkb2VzIG5vdCByZXF1aXJlIHRvIHJlc3RhcnQgRWNsaXBzZSBhbnltb3JlLgotLSBOZXcgU0RLLVByb2plY3Qgc3luYyBtb2RlIGluIEFuZHJvaWQgcHJlZmVyZW5jZSBwYW5lLiBEZWZhdWx0IHZhbHVlIHNldCB0byB0cnVlLiBJZiB0cnVlLCBhbGwgYW5kcm9pZCBwcm9qZWN0cyBhcmUgYXV0b21hdGljYWxseSBzeW5jJ2VkIHRvIHRoZSBTREsgZGVmaW5lZCBpbiB0aGUgcHJlZmVyZW5jZXMuCi0tIENhc2VzIHdoZXJlIG5vIGVtdWxhdG9yIGlzIHJ1bm5pbmcgYnV0IGEgZGlhbG9nIHN0aWxsIHNheXMgIkFuIGVtdWxhdG9yIGlzIHJ1bm5pbmcuLi4iIHNob3VsZCBiZSBsZXNzIGZyZXF1ZW50LgotLSBQcm9qZWN0cyBkbyBub3QgcmVmZXJlbmNlIHRoZSBzdGFuZGFyZCBkZXNrdG9wIEpSRSBhbnltb3JlLCBhcyBhbmRyb2lkLnppcCBjb250YWlucyB0aGUgY29yZSBqYXZhIGxpYnJhcnkuIFRoaXMgd2lsbCBzb2x2ZSB0aGUgY2FzZSB3aGVyZSB1c2luZyBhIGNvcmUgY2xhc3Mgbm9uIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtIHdvdWxkIG5vdCBnZW5lcmF0ZSBhIGNvbXBpbGF0aW9uIGVycm9yLgotLSBDaGFuZ2luZyB0aGUgcGFja2FnZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCBub3cgZGVsZXRlcyB0aGUgUi5qYXZhIGNsYXNzIGZyb20gaXRzIHByZXZpb3VzIGxvY2F0aW9uLiBUaGlzIHdpbGwgcmVxdWlyZSAxIGJ1aWxkIGFmdGVyIHVwZ3JhZGluZyB0aGUgcGx1Z2luLCBiZWZvcmUgaXQgd29ya3MuCi0tIFByb2plY3Qgc2VsZWN0aW9uIGluIHRoZSBMYXVuY2ggQ29uZmlnIERpYWxvZyBub3cgb25seSBzaG93cyBBbmRyb2lkIHByb2plY3RzLgotLSBMYXVuY2hpbmcgYSBkZWJ1Zy9ydW4gc2Vzc2lvbiBub3cgY2hlY2tzIHRoYXQgdGhlIHByb2plY3QgdXNlcyB0aGUgU0RLIHNldCBpbiB0aGUgcHJlZmVyZW5jZXMgKFRoaXMgaXMgZm9yIHRoZSBub24gYXV0b21hdGljIHN5bmMgbW9kZSkuCi0tIFJlbW92ZWQgb2Jzb2xldGUgd2FsbHBhcGVyIG1vZGUgaW4gdGhlIE5ldyBQcm9qZWN0IENyZWF0aW9uIFdpemFyZC4KLS0gZHggKGRhbHZpayBjb2RlIGNvbnZlcnNpb24gdG9vbCkgbm93IGVtYmVkZGVkIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgZXh0ZXJuYWwgdmVyc2lvbi4KLS0gaW1wcm92ZW1lbnRzIGluIHRoZSBwYXJzaW5nIG9mIHRoZSBhYXB0IGVycm9ycy4KLS0gc29tZSBmaXhlcyBmb3Igd2luZG93cyBzdXBwb3J0LgotCi0wLjIuMQotCi0tIGZpeGVkIGJ1ZyBpbiBsb2djYXQgc2VhcmNoIHdoZXJlIGludmFsaWQgcmVnZXhwIHdvdWxkIGNhdXNlIGEgY3Jhc2gKLS0gbWlub3IgaW1wcm92ZW1lbnRzIHRvIHRoZSBidWlsZC9sYXVuY2ggcHJvY2Vzcy4KLQotMC4yLjAKLQotLSBMb2djYXQgdmlldy4KLS0gRmlsZSBFeHBsb3JlciB2aWV3LgotLSBDdXN0b20gb3B0aW9ucyBmb3IgZW11bGF0b3IuIEluIHRoZSBMYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cgeW91IGNhbiBzcGVjaWZ5IGN1c3RvbSBjb21tYW5kIGxpbmUgZW11bGF0b3Igb3B0aW9ucy4gU2VlICJlbXVsYXRvciAtaGVscCIgZm9yIGF2YWlsYWJsZSBvcHRpb25zLgotLSBBbmRyb2lkIFRvb2xzID4gRXhwb3J0IEFwcGxpY2F0aW9uIFBhY2thZ2UgaXMgbm93IGltcGxlbWVudGVkLgotLSBNaXNjIGluY3JlbWVudGFsIGJ1aWxkZXIgZml4ZXMuCi0tIEluY2x1ZGluZyBzdGF0aWMgLmphciBmaWxlcyBhcyBsaWJyYXJ5IGluIHlvdXIgcHJvamVjdCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSB0aGVtIGluIHRoZSBmaW5hbCBBUEsuIFdhcm5pbmc6IG9ubHkgdGhlIC5jbGFzcyBjb250ZW50IGlzIGluY2x1ZGVkLgotCi0wLjEuMTAKLQotLSByZXMgYW5kIGFzc2V0cyBmb2xkZXJzIG5vdyBmdWxseSByZWZyZXNoIGJlZm9yZSB0aGUgYnVpbGQsIGVuc3VyaW5nIFIuamF2YSBhbmQgcGFja2FnZWQgcmVzb3VyY2VzIGFyZSBhbHdheXMgdXAgdG8gZGF0ZS4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgaW4gdGhlIHByZWZlcmVuY2VzIHVuZGVyICJBbmRyb2lkIiBpZiB0aGlzIGJlY29tZXMgc2xvdyBkdWUgdG8gdG9vIG1hbnkgZmlsZXMuCi0KLTAuMS45Ci0KLS0gTmV3IEFjdGlvbiBpbiB0aGUgIlByb2Nlc3NlcyIgdmlldyB0byBkZWJ1ZyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFscmVhZHkgcnVubmluZy4gVGhlIHNvdXJjZSBwcm9qZWN0IGZvciB0aGlzIGFwcGxpY2F0aW9uIE1VU1QgYmUgb3BlbmVkIGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLS0gQnVpbGRpbmcgdGhlIHByb2plY3Qgbm93IGZvcmNlIHJlZnJlc2hlcyB0aGUgcmVzIGZvbGRlci4gVGhpcyBzaG91bGQgaGVscCByZWJ1aWxkaW5nIHRoZSByZXNvdXJjZXMgd2hlbiBvbmx5IGJpbmFyeSBmaWxlcyB3ZXJlIGNoYW5nZWQgZnJvbSBvdXRzaWRlIGVjbGlwc2UuCi0tIENsZWFuL2Z1bGwgYnVpbGRzIG5vdyBjb21waWxlIGFsbCBhaWRsIGZpbGVzIGZvdW5kIGluIHRoZSBidWlsZCBwYXRoIChwcmV2aW91c2x5IG9ubHkgaW5jcmVtZW50YWwgYnVpbGRzIHdvdWxkIGNvbXBpbGUgdGhlbSkuIEFsc28sIG1pc2MgaW1wcm92ZW1lbnRzIHRvIHRoZSBpbmNyZW1lbnRhbCBidWlsZGVycy4KLS0gU3RhcnRpbmcgYSBydW4vZGVidWcgc2Vzc2lvbiBub3cgYXNrcyB0byBzYXZlIHRoZSBmaWxlcyBhbmQgZm9yY2VzIGEgbmV3IGJ1aWxkIHRvIGVuc3VyZSB0aGF0IHRoZSBsYXRlc3QgcGFja2FnZSBpcyBwdXNoZWQgb24gdGhlIGRldmljZS4KLS0gUGx1Z2luIHNob3VsZCBiZSBsZXNzIGFnZ3Jlc3NpdmUgd2hlbiB3YWl0aW5nIGZvciB0aGUgZW11bGF0b3IgdG8gYmUgcmVhZHkuIFRoaXMgc2hvdWxkIHRyYW5zbGF0ZSBpbiBmZXdlciBmYWlsZWQgbGF1bmNoZXMuCi0KLTAuMS44Ci0KLS0gRml4ZWQgRGVidWdnZXIgaXNzdWUgaW50cm9kdWNlZCBpbiAwLjEuNgotLSBBZGRlZCBMb2cgbGV2ZWwgcHJlZmVyZW5jZXMgZm9yIERETVMuIExvb2sgdW5kZXIgQW5kcm9pZCA+IERETVMgPiBBZHZhbmNlZC4gRGVmYXVsdCBlcnJvciBsZXZlbCBpcyBFcnJvci4KLQotMC4xLjcKLQotLSBGaXhlZCBpc3N1ZSB3aGVyZSBqYXZhIHdhcm5pbmdzIHdvdWxkbid0IHRyaWdnZXIgYSBuZXcgcGFja2FnZS4gTm93IG9ubHkgZXJyb3JzIHN0b3AgdGhlIHBhY2thZ2luZyBsaWtlIGl0IHNob3VsZCBiZS4KLS0gQWRkZWQgbW9yZSBlcnJvciBvdXRwdXQgaW4gdGhlIGNvbnNvbGUgZHVyaW5nIGxhdW5jaC4KLQotMC4xLjYKLQotLSBOZXcgIkFuZHJvaWQiIENvbnNvbGUuIEl0IHJlY2VpdmVzIHRoZSBlcnJvciBvdXRwdXQgZnJvbSBleHRlcm5hbCB0b29scyBzdWNoIGFuZCBhaWRsLCBkeCwgYW5kIGFhcHQgKG9ubHkgd2hlbiB0aGV5IGNhbid0IGJlIHBhcnNlZCkuIEFueSBlcnJvciBmb3JjZSB0aGUgY29uc29sZSB0byBiZSBkaXNwbGF5ZWQuCi0tIFRoZSBBY3Rpdml0eSBNYW5hZ2VyIG9uIHRoZSBkZXZpY2UvZW11bGF0b3Igbm93IG91dHB1dHMgc29tZSBtZXNzYWdlcyBpbiB0aGUgIkFuZHJvaWQiIGNvbnNvbGUgd2hlbiBhc2tlZCB0byBzdGFydCBhbiBhY3Rpdml0eS4gVGhpcyBzaG91bGQgaGVscCB5b3UgZmlndXJlIG91dCB3aGF0IGlzIHdyb25nIGlmIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IHN0YXJ0LgotLSBGaXhlZCBhIGNhc2Ugd2hlcmUgdGhlIC5hcGsgZmlsZSB3b3VsZCBiZSB1cGRhdGVkIHdpdGggYnJva2VuIGNvZGUuIE5vdyBpZiB0aGVyZSBhcmUgamF2YSBjb21waWxlIGVycm9yLCB0aGUgLmFwayBpcyBub3QgdG91Y2hlZC4KLS0gQWRkZWQgc3VwcG9ydCBmb3IgbWFuaWZlc3Qgd2l0aCBub24gZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IGphdmEgbmFtZSwgeWV0IG5vdCBzdGFydGluZyB3aXRoIGEgZG90LgotLSBGaXhlZCBjcmVhdGlvbiBvZiBtYW5pZmVzdCBmaWxlcyAodGhyb3VnaCBOZXcgUHJvamVjdCB3aXphcmQpIHRvIHVzZSBwcm9wZXIgbmFtZXNwYWNlIGZvciBhdHRyaWJ1dGVzLgotLSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGZvciBuYW1lc3BhY2UgaXNzdWUgaW4gdGhlIG1hbmlmZXN0LgotLSAiUmVzZXQgQWRiIiBhY3Rpb24gZnJvbSB0aGUgZGV2aWNlIHZpZXcuIFVzZSB0aGlzIGlzIHRoZSBwbHVnaW4gdGVsbHMgeW91ICBhbiBlbXVsYXRvciBpcyBydW5uaW5nIHdoZW4gdGhlcmUgYXJlIG5vbmUuCi0tIE5ldyAiZGRtcyIgQ29uc29sZSB3aGljaCByZWNlaXZlcyB0aGUgc3RhbmRhcmQgb3V0cHV0IG9mIGRkbXMuCi0KLTAuMS41Ci0KLS0gU3VwcG9ydCBmb3IgbmV3IGFjdGl2aXR5IGRlY2xhcmF0aW9uIGluc2lkZSBBbmRyb2lkTWFuaWZlc3QueG1sCi0tIGZpeGVkIGlzc3VlIHRoYXQgcHJldmVudGVkIGJpbi8gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWlsZHBhdGggd2hlbiBjb252ZXJ0aW5nIHByb2plY3QuCi0KLTAuMS40Ci0KLS0gQ2hhbmdlcyBpbiB0aGUgTWFuaWZlc3QsIG5vdyBwcm9wZXJseSB0cmlnZ2VyIGEgbmV3IHBhY2thZ2Ugb2YgdGhlIHJlc291cmNlcy4KLQotMC4xLjMKLQotLSBGaXhlZCB0aGUgImZpeCBwcm9qZWN0IHByb3BlcnRpZXMiIGFjdGlvbiB0byByZW1vdmUgb2xkIGZyYW1ld29yayBsaWJyYXJpZXMsIGp1c3Qgbm90IGFkZCBuZXcgb25lcy4KLQotMC4xLjIKLQotLSBhaWRsIGJ1aWxkZXIuIFRoZSBBbmRyb2lkIFJlc291cmNlcyBQcmVCdWlsZGVyIG5vdyBhbHNvIGNvbnZlcnRzIGFpZGwgZmlsZXMgaW50byBqYXZhIGZpbGVzLgotLSBOZXcgUHJvamVjdCB3aXphcmQgbm93IGFsbG93cyB0byBtYWtlIFdhbGxwYXBlciBhY3Rpdml0aWVzIGluc3RlYWQgb2YgZ2FkZ2V0cyAod2hpY2ggYXJlIG9ic29sZXRlLikKLS0gTGF1bmNoIHNob3J0Y3V0cy4gUmlnaHQgY2xpY2sgaW4gdGhlIHBhY2thZ2UgZXhwbG9yZXIgYWxsb3cgeW91IHRvIGxhdW5jaCB0aGUgYXBwbGljYXRpb24gaW4gZGVidWcgb3IgcnVuIG1vZGUgZGlyZWN0bHkgd2l0aG91dCBjcmVhdGluZyBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0tIE5ldyBwcm9qZWN0IHdpemFyZCBhbmQgUHJvamVjdCBjb252ZXJzaW9uIG5vdyBzZXRzIHVwIHRoZSBqYXZhIGRvYyBwYXRoIGZvciBhbmRyb2lkLnppcAotLSBQYWNrYWdlIGJ1aWxkZXIgbm93IHN1cHBvcnRzIGN1c3RvbSBhcHBsaWNhdGlvbiBhc3NldHMgcGxhY2VkIGluIGFzc2V0cy8gKHdoaWNoIGlzIG5vdyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCkuCi0tIE5ldyBhY3Rpb246IEFuZHJvaWQgVG9vbHMgPiBGaXggUHJvamVjdCBQcm9wZXJ0aWVzLCBpbiB0aGUgcGFja2FnZSBleHBsb3JlciBjb250ZXh0dWFsIG1lbnUuIFRoaXMgYWxsb3dzIHlvdSB0byBmaXggdGhlIGZyYW1ld29yayBwYXRoIChhbmQgaXRzIGphdmFkb2MgcGF0aCkgaW4gY2FzZSB5b3UgY2hhbmdlIHRoZSBzZGsgbG9jYXRpb24uCi0KLTAuMS4xCi0KLS0gRml4ZWQgcHJvamVjdCBjb252ZXJ0b3IgdG8gYWRkIHRoZSBmcmFtZXdvcmsgbGlicmFyeSBpZiBtaXNzaW5nLgotCi0wLjEuMAotCi0tIE5ldyBwcm9qZWN0IHdpemFyZC4KLS0gUHl0aG9uIHNjcmlwdC1nZW5lcmF0ZWQgcHJvamVjdCBjb252ZXJ0b3IuCi0tIEluY3JlbWVudGFsIGJ1aWxkZXJzLgotLSBYTUwgdmFsaWRhdGlvbiBmb3IgcmVzb3VyY2UgZmlsZXMuCi0tIEFuZHJvaWQgTGF1bmNoIENvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8ucHJvamVjdCBiL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNhNTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+YWR0LWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ZlYXR1cmUueG1sIGIvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDNlNzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0IgotICAgICAgbGFiZWw9IkFuZHJvaWQgRGV2ZWxvcG1lbnQgVG9vbHMiCi0gICAgICB2ZXJzaW9uPSIwLjkuNS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgotICAgICAgcGx1Z2luPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICBBbmRyb2lkIERldmVsb3BlciBUb29scy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj4KLSAgICAgIE5vdGU6ICBreG1sMi0yLjMuMC5qYXIgaXMgdW5kZXIgdGhlIEJTRCBsaWNlbnNlIHJhdGhlciB0aGFuIHRoZSBFUEwuICBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBCU0QgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAotCi0gICAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKLQotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJmFwb3M7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgotCi0xLiBERUZJTklUSU9OUwotCi0mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6Ci0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKLQotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgotCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKLQotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKLQotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICZhcG9zO29yaWdpbmF0ZXMmYXBvczsgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3ImYXBvcztzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgotCi0mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0mcXVvdDtMaWNlbnNlZCBQYXRlbnRzJnF1b3Q7IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCi0KLSZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgotCi0mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCi0KLTIuIEdSQU5UIE9GIFJJR0hUUwotCi1hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KLQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgotCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmYXBvcztzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCi0KLTMuIFJFUVVJUkVNRU5UUwotCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6Ci0KLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbCBDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciZhcG9zO3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCZhcG9zO3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JmFwb3M7cyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotQWxsIFJlY2lwaWVudCZhcG9zO3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmYXBvcztzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmYXBvcztzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KLQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iQW5kcm9pZCBVcGRhdGUgU2l0ZSIgdXJsPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZWNsaXBzZS8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5nZWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvLnByb2plY3QgYi90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGZmNjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+ZGRtcy1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvZmVhdHVyZS54bWwgYi90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NWFjYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMiCi0gICAgICBsYWJlbD0iQW5kcm9pZCBERE1TIgotICAgICAgdmVyc2lvbj0iMC45LjUucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIEFuZHJvaWQgRGFsdmlrIERlYnVnIE1vbml0b3IgU2VydmljZQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPgotICAgICAgTm90ZTogIGpjb21tb24tMS4wLjEyLmphciBpcyB1bmRlciB0aGUgQlNEIGxpY2Vuc2UgcmF0aGVyIHRoYW4gdGhlIEFQTC4gIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIEJTRCBMaWNlbnNlIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCi0KLSAgIGpmcmVlY2hhcnQtMS4wLjkuamFyIGFuZCBqZnJlZWNoYXJ0LTEuMC45LXN3dC5qYXIgYXJlIHVuZGVyIHRoZSBMR1BMIHJhdGhlciB0aGFuIHRoZSBBUEwuICBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBMR1BMIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0LiAgWW91IGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGVzZSB0d28gY29tcG9uZW50cyBhdCBodHRwOi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy9wdWIvamZyZWVjaGFydC0xLjAuOS56aXAKLQotCi0gICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICZxdW90O0xpY2Vuc2UmcXVvdDsgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICZxdW90O0xpY2Vuc29yJnF1b3Q7IHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAmcXVvdDtMZWdhbCBFbnRpdHkmcXVvdDsgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICZxdW90O2NvbnRyb2wmcXVvdDsgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICZxdW90O1lvdSZxdW90OyAob3IgJnF1b3Q7WW91ciZxdW90Oykgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgJnF1b3Q7U291cmNlJnF1b3Q7IGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgJnF1b3Q7T2JqZWN0JnF1b3Q7IGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICZxdW90O1dvcmsmcXVvdDsgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAmcXVvdDtEZXJpdmF0aXZlIFdvcmtzJnF1b3Q7IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgJnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICZxdW90O3N1Ym1pdHRlZCZxdW90OwotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgJnF1b3Q7Tm90IGEgQ29udHJpYnV0aW9uLiZxdW90OwotCi0gICAgICAmcXVvdDtDb250cmlidXRvciZxdW90OyBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgJnF1b3Q7Tk9USUNFJnF1b3Q7IHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICZxdW90O1tdJnF1b3Q7Ci0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJmFwb3M7dCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICZxdW90O3ByaW50ZWQgcGFnZSZxdW90OyBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJnF1b3Q7TGljZW5zZSZxdW90Oyk7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJBbmRyb2lkIFVwZGF0ZSBTaXRlIiB1cmw9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9lY2xpcHNlLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLnByb2plY3QgYi90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE2Mjc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5hZHQtdGVzdHMtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL2ZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9mZWF0dXJlLnhtbCBiL3Rvb2xzL2VjbGlwc2UvZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YWJjZDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9mZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIgotICAgICAgbGFiZWw9IkFEVCBUZXN0cyIKLSAgICAgIHZlcnNpb249IjAuOS41LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2M4YzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvYmluCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2JpbgotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvYmluCi0KLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9hbmRyb2lkcHJlZnMuamFyCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvamFydXRpbHMuamFyCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQva3htbDItMi4zLjAuamFyCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvbGF5b3V0bGliX2FwaS5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9sYXlvdXRsaWJfdXRpbHMuamFyCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvbmluZXBhdGNoLmphcgotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3Nka2xpYi5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zZGtzdGF0cy5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zZGt1aWxpYi5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9jb21tb25zLWNvbXByZXNzLTEuMC5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvYWRkLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9iYWNrd2FyZC5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvY2xlYXIucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2QucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2RlYnVnLWF0dGFjaC5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvZGVidWctZXJyb3IucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2RlYnVnLXdhaXQucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2RlbGV0ZS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvZGV2aWNlLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9kb3duLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9lLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9lZGl0LnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9lbXB0eS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvZW11bGF0b3IucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2ZvcndhcmQucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2djLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9oYWx0LnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9oZWFwLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9ocHJvZi5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvaS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvaW1wb3J0QnVnLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9sb2FkLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9wYXVzZS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvcGxheS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvcHVsbC5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvcHVzaC5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvc2F2ZS5wbmcKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvdGhyZWFkLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy90cmFjaW5nX3N0YXJ0LnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy90cmFjaW5nX3N0b3AucG5nCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL3VwLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy92LnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy93LnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy93YXJuaW5nLnBuZwotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzL2pjb21tb24tMS4wLjEyLmphcgotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzL2pmcmVlY2hhcnQtMS4wLjktc3d0LmphcgotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzL2pmcmVlY2hhcnQtMS4wLjkuamFyCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9kZG1saWIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliCi1jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9reG1sMi0yLjMuMC5qYXIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9kZG1saWIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9zZGt1aWxpYgotY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2xheW91dGxpYgotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5jbGFzc3BhdGggYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODQxOTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0iTWFrZWZpbGV8cmVzb3VyY2VzLyIga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJqYXJ1dGlscy5qYXIiIHNvdXJjZXBhdGg9Ii9KYXJVdGlscyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImFuZHJvaWRwcmVmcy5qYXIiIHNvdXJjZXBhdGg9Ii9BbmRyb2lkUHJlZnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJzZGtzdGF0cy5qYXIiIHNvdXJjZXBhdGg9Ii9TZGtTdGF0c1NlcnZpY2UiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJreG1sMi0yLjMuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsYXlvdXRsaWJfYXBpLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxheW91dGxpYl91dGlscy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJuaW5lcGF0Y2guamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ic2RrbGliLmphciIgc291cmNlcGF0aD0iL1Nka0xpYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InNka3VpbGliLmphciIgc291cmNlcGF0aD0iL1Nka1VpTGliIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iY29tbW9ucy1jb21wcmVzcy0xLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmYwZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8ucHJvamVjdCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjFhZDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmFkdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5TZGtMaWI8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0PlNka1VpTGliPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L01FVEEtSU5GL01BTklGRVNULk1GIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYmM1Ni4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEFuZHJvaWQgRGV2ZWxvcG1lbnQgVG9vbGtpdAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuOS41LnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLiwKLSBqYXJ1dGlscy5qYXIsCi0gYW5kcm9pZHByZWZzLmphciwKLSBzZGtzdGF0cy5qYXIsCi0ga3htbDItMi4zLjAuamFyLAotIGxheW91dGxpYl9hcGkuamFyLAotIG5pbmVwYXRjaC5qYXIsCi0gbGF5b3V0bGliX3V0aWxzLmphciwKLSBzZGtsaWIuamFyLAotIHNka3VpbGliLmphciwKLSBjb21tb25zLWNvbXByZXNzLTEuMC5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLVJlcXVpcmUtQnVuZGxlOiBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmpkdCwKLSBvcmcuZWNsaXBzZS5hbnQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQudWksCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLmdlZiwKLSBvcmcuZWNsaXBzZS51aS5icm93c2VyLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLAotIG9yZy5lY2xpcHNlLmpkdC5qdW5pdCwKLSBvcmcuZWNsaXBzZS5qZHQuanVuaXQucnVudGltZSwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZywKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQ7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmFjdGlvbnM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5jb25maWd1cmF0aW9uLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9yczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQudWltb2RlbDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3Q7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5tb2RlbDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QucGFnZXM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnU7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnUuZGVzY3JpcHRvcnM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmRlc2NyaXB0b3JzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMudWltb2RlbDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWk7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWU7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWw7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnhtbDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sLmRlc2NyaXB0b3JzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0O3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWU7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3Q7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVmYWN0b3JpbmdzLmV4dHJhY3RzdHJpbmc7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmV4cG9ydDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3eG1sZmlsZTt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuamFydXRpbHM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGk7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlsczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQubmluZXBhdGNoO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5wcmVmczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuc2RrbGliO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdDt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5O3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5zZGtsaWIueG1sO3gtZnJpZW5kczo9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzIiwKLSBjb20uYW5kcm9pZC5zZGtzdGF0czt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5pY29uczt4LWZyaWVuZHM6PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIsCi0gY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHM7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiLAotIGNvbS5hbmRyb2lkLnNka3VpbGliLnJlcG9zaXRvcnk7eC1mcmllbmRzOj0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiCi0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9NT0RVTEVfTElDRU5TRV9FUEwgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L01PRFVMRV9MSUNFTlNFX0VQTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L01PRFVMRV9MSUNFTlNFX0VQTAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L05PVElDRSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMxMDFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLSpFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAqCi0KLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgotCi0qMS4gREVGSU5JVElPTlMqCi0KLSJDb250cmlidXRpb24iIG1lYW5zOgotCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQKLWRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgotCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKLQotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKLQotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kCi1hcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgotJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAotQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KLUNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlCi1zZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0KLXVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mCi10aGUgUHJvZ3JhbS4KLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKLWFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKLW9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KLQotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCi1BZ3JlZW1lbnQuCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCi1pbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KLQotKjIuIEdSQU5UIE9GIFJJR0hUUyoKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5Ci1ncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0Ci1saWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAotcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZAotb2JqZWN0IGNvZGUgZm9ybS4KLQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5Ci1ncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UKLXVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKLWNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUKLUNvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlCi1Db250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQKLVBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucwotd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgotCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKLWxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCi1wcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKLWNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0Ci1saWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KLQotKjMuIFJFUVVJUkVNRU5UUyoKLQotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybQotdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKLQotYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcwotYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLW9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YKLW1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvcgotZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kCi1jb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZQotb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoCi1Db250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlCi1tYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLSo0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTioKLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKLXdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcwotbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCi1Db250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcKLXNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKLW90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluCi1hIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMKLXNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IKLWFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4KLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCi1Db250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotKjUuIE5PIFdBUlJBTlRZKgotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQKLU9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAotRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMKLU9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbQotYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtCi1lcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCi1wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KLQotKjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZKgotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SCi1BTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotKjcuIEdFTkVSQUwqCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcKLWEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbQotaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKLWhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncwotcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscwotdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50Ci1hbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyCi1iZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIKLXRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncwotb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudAotcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKLWJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQotb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCi10aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMKLUFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUKLWluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlCi1lbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcKLXZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMKLXJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzCi1wdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLWl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluCi1TZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzCi10byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwKLXdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluCi10aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZQotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8KLXRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuCi1vbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzCi10byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgotCi0gCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvYWJvdXQuaW5pIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGFlZjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1mZWF0dXJlSW1hZ2U9aWNvbnMvYW5kcm9pZF8zMlgzMi5qcGcKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2MzgzYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBqYXJ1dGlscy5qYXIsXAotICAgICAgICAgICAgICAgYW5kcm9pZHByZWZzLmphcixcCi0gICAgICAgICAgICAgICBzZGtzdGF0cy5qYXIsXAotICAgICAgICAgICAgICAga3htbDItMi4zLjAuamFyLFwKLSAgICAgICAgICAgICAgIGxheW91dGxpYl9hcGkuamFyLFwKLSAgICAgICAgICAgICAgIGxheW91dGxpYl91dGlscy5qYXIsXAotICAgICAgICAgICAgICAgbmluZXBhdGNoLmphcixcCi0gICAgICAgICAgICAgICBzZGtsaWIuamFyLFwKLSAgICAgICAgICAgICAgIHNka3VpbGliLmphcixcCi0gICAgICAgICAgICAgICBjb21tb25zLWNvbXByZXNzLTEuMC5qYXIKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FkZC5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FkZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmMyY2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hZGQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hbmRyb2lkLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzlkNGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZF8zMlgzMi5qcGcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FuZHJvaWRfMzJYMzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM2NzBiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZF8zMlgzMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FuZHJvaWRfbGFyZ2UucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hbmRyb2lkX2xhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlMzYwMS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FuZHJvaWRfbGFyZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hbmRyb2lkX3Byb2plY3QucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hbmRyb2lkX3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzM0NTY4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZF9wcm9qZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZGp1bml0LnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYW5kcm9pZGp1bml0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MjZkYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2FuZHJvaWRqdW5pdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2F2ZF9tYW5hZ2VyLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYXZkX21hbmFnZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZGJiYmI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYXZkX21hbmFnZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hel9zb3J0LnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvYXpfc29ydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTJmNzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9hel9zb3J0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvY2xpcHBpbmcucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9jbGlwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmEzNWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9jbGlwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2RlbGV0ZS5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNWZhYjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9kZWxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9kaW1lbnNpb24ucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9kaW1lbnNpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA1N2M4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvZGltZW5zaW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvZG93bi5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2Rvd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNkMjIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvZG93bi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2RwaS5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2RwaS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTVlOTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9kcGkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9lcnJvci5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2Vycm9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlY2YyYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2Vycm9yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMva2V5Ym9hcmQucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9rZXlib2FyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTFhODUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9rZXlib2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL2xhbmd1YWdlLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbGFuZ3VhZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI3ZGQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbGFuZ3VhZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tYWluTGF1bmNoVGFiLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbWFpbkxhdW5jaFRhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDBmYmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tYWluTGF1bmNoVGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbWF0Y2gucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tYXRjaC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTM5YzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tYXRjaC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL21jYy5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL21jYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzk1ZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tY2MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tbmMucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9tbmMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZmZmU0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbW5jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbmF2cGFkLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbmF2cGFkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYjc5YS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL25hdnBhZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL25ld19hZHRfcHJvamVjdC5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL25ld19hZHRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMGU4ODMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9uZXdfYWR0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9uZXdfeG1sLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvbmV3X3htbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzMxODUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9uZXdfeG1sLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvb3JpZW50YXRpb24ucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9vcmllbnRhdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyM2MzY2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9vcmllbnRhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL3JlZ2lvbi5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL3JlZ2lvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDhjZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy9yZWdpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy90ZXh0X2lucHV0LnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvdGV4dF9pbnB1dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZGRjODcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy90ZXh0X2lucHV0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvdG91Y2gucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy90b3VjaC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzY1NzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy90b3VjaC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L2ljb25zL3VwLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvdXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI5YTQ2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy93YXJuaW5nLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvaWNvbnMvd2FybmluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2I2ZWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9pY29ucy93YXJuaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvcGx1Z2luLnhtbCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZjY2Ny4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLnhtbFByb2JsZW0iCi0gICAgICAgICBuYW1lPSJBbmRyb2lkIFhNTCBGb3JtYXQgUHJvYmxlbSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi5hYXB0UHJvYmxlbSIKLSAgICAgICAgIG5hbWU9IkFuZHJvaWQgQUFQVCBQcm9ibGVtIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLmFhcHQyUHJvYmxlbSIKLSAgICAgICAgIG5hbWU9IkFuZHJvaWQgQUFQVCBQcm9ibGVtIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLmFpZGxQcm9ibGVtIgotICAgICAgICAgbmFtZT0iQW5kcm9pZCBBSURMIFByb2JsZW0iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi5hbmRyb2lkUHJvYmxlbSIKLSAgICAgICAgbmFtZT0iQW5kcm9pZCBYTUwgQ29udGVudCBQcm9ibGVtIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJSZXNvdXJjZU1hbmFnZXJCdWlsZGVyIgotICAgICAgICAgbmFtZT0iQW5kcm9pZCBSZXNvdXJjZSBNYW5hZ2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyCi0gICAgICAgICAgICBoYXNOYXR1cmU9InRydWUiPgotICAgICAgICAgPHJ1biBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkLlJlc291cmNlTWFuYWdlckJ1aWxkZXIiLz4KLSAgICAgIDwvYnVpbGRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlByZUNvbXBpbGVyQnVpbGRlciIKLSAgICAgICAgIG5hbWU9IkFuZHJvaWQgUHJlIENvbXBpbGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyCi0gICAgICAgICAgICBoYXNOYXR1cmU9InRydWUiPgotICAgICAgICAgPHJ1biBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkLlByZUNvbXBpbGVyQnVpbGRlciIvPgotICAgICAgPC9idWlsZGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iQXBrQnVpbGRlciIKLSAgICAgICAgIG5hbWU9IkFuZHJvaWQgUGFja2FnZSBCdWlsZGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyCi0gICAgICAgICAgICBoYXNOYXR1cmU9InRydWUiPgotICAgICAgICAgPHJ1biBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkLkFwa0J1aWxkZXIiLz4KLSAgICAgIDwvYnVpbGRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkFuZHJvaWROYXR1cmUiCi0gICAgICAgICBuYW1lPSJBbmRyb2lkTmF0dXJlIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hdHVyZXMiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTmF0dXJlIi8+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICAgICA8YnVpbGRlciBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LlJlc291cmNlTWFuYWdlckJ1aWxkZXIiLz4KLSAgICAgIDxidWlsZGVyIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuUHJlQ29tcGlsZXJCdWlsZGVyIi8+Ci0gICAgICA8YnVpbGRlciBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFwa0J1aWxkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2Uud2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQiLz4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhbkZpbmlzaEVhcmx5PSJmYWxzZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS53aXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3QuTmV3UHJvamVjdFdpemFyZCIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBoYXNQYWdlcz0idHJ1ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL25ld19hZHRfcHJvamVjdC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnByb2plY3QuTmV3UHJvamVjdFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQgUHJvamVjdCIKLSAgICAgICAgICAgIHByZWZlcnJlZFBlcnNwZWN0aXZlcz0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIHByb2plY3Q9InRydWUiLz4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhbkZpbmlzaEVhcmx5PSJmYWxzZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS53aXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3QuTmV3VGVzdFByb2plY3RXaXphcmQiCi0gICAgICAgICAgICBmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaGFzUGFnZXM9InRydWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkanVuaXQucG5nIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5wcm9qZWN0Lk5ld1Rlc3RQcm9qZWN0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCBUZXN0IFByb2plY3QiCi0gICAgICAgICAgICBwcmVmZXJyZWRQZXJzcGVjdGl2ZXM9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2FuRmluaXNoRWFybHk9ImZhbHNlIgotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLndpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3eG1sZmlsZS5OZXdYbWxGaWxlV2l6YXJkIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGhhc1BhZ2VzPSJ0cnVlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbmV3X3htbC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy53aXphcmRzLk5ld1htbEZpbGVXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSJBbmRyb2lkIFhNTCBGaWxlIgotICAgICAgICAgICAgcHJlZmVycmVkUGVyc3BlY3RpdmVzPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgcHJvamVjdD0iZmFsc2UiPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgICAgIGRlbGVnYXRlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkxhdW5jaENvbmZpZ0RlbGVnYXRlIgotICAgICAgICAgICAgZGVsZWdhdGVEZXNjcmlwdGlvbj0iVGhlIEFuZHJvaWQgQXBwbGljYXRpb24gTGF1bmNoZXIgc3VwcG9ydHMgcnVubmluZyBhbmQgZGVidWdnaW5nIHJlbW90ZSBBbmRyb2lkIGFwcGxpY2F0aW9ucyBvbiBkZXZpY2VzIG9yIGVtdWxhdG9ycy4iCi0gICAgICAgICAgICBkZWxlZ2F0ZU5hbWU9IkFuZHJvaWQgTGF1bmNoZXIiCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmRlYnVnLkxhdW5jaENvbmZpZ1R5cGUiCi0gICAgICAgICAgICBtb2Rlcz0iZGVidWcsIHJ1biIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQgQXBwbGljYXRpb24iCi0gICAgICAgICAgICBwdWJsaWM9InRydWUiCi0gICAgICAgICAgICBzb3VyY2VMb2NhdG9ySWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlTG9jYXRvci5KYXZhU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb29rdXAuamF2YVNvdXJjZVBhdGhDb21wdXRlciI+Ci0gICAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgICAgICAgIGNvbmZpZ1R5cGVJRD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmRlYnVnLkxhdW5jaENvbmZpZ1R5cGUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuZGVidWcuTGF1bmNoQ29uZmlnVHlwZUltYWdlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkxhdW5jaENvbmZpZ1RhYkdyb3VwIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkFuZHJvaWQgQXBwbGljYXRpb24iCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmRlYnVnLkxhdW5jaENvbmZpZ1RhYkdyb3VwIgotICAgICAgICAgICAgdHlwZT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmRlYnVnLkxhdW5jaENvbmZpZ1R5cGUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaFNob3J0Y3V0cyI+Ci0gICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubGF1bmNoLkxhdW5jaENvbmZpZ1R5cGUiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5MYXVuY2hTaG9ydGN1dCIKLSAgICAgICAgICAgIGljb249Imljb25zL2FuZHJvaWQucG5nIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5kZWJ1Zy5sYXVuY2hpbmcuTGF1bmNoU2hvcnRjdXQiCi0gICAgICAgICAgICBsYWJlbD0iQW5kcm9pZCBBcHBsaWNhdGlvbiIKLSAgICAgICAgICAgIG1vZGVzPSJkZWJ1ZywgcnVuIj4KLSAgICAgICAgPGNvbnRleHR1YWxMYXVuY2g+Ci0gICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgPGNvdW50IHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICA8aXRlcmF0ZT4KLSAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5pc0NvbnRhaW5lciIvPgotICAgICAgICAgICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuaGFzUHJvamVjdE5hdHVyZSIgYXJncz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWROYXR1cmUiLz4KLSAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8L2NvbnRleHR1YWxMYXVuY2g+Ci0gICAgICAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLz4KLSAgICAgICAgIDxwZXJzcGVjdGl2ZSBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotICAgICAgICAgPGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyBhbiBBbmRyb2lkIEFwcGxpY2F0aW9uIgotICAgICAgICAgICAgICAgbW9kZT0icnVuIj4KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWJ1Z3MgYW4gQW5kcm9pZCBBcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgIG1vZGU9ImRlYnVnIj4KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Nob3J0Y3V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmNvbnRyaWJ1dGlvbjEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRUb29scyIKLSAgICAgICAgICAgICAgIGxhYmVsPSJBbmRyb2lkIFRvb2xzIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXAxIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxub3Q+Ci0gICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZE5hdHVyZSIvPgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgbmFtZT0ib3BlbiIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L25vdD4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYWN0aW9ucy5Db252ZXJ0VG9BbmRyb2lkQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQ29udmVydFRvQW5kcm9pZEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJDb252ZXJ0IFRvIEFuZHJvaWQgUHJvamVjdCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZFRvb2xzL2dyb3VwMSIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmNvbnRyaWJ1dGlvbjIiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRUb29scyIKLSAgICAgICAgICAgICAgIGxhYmVsPSJBbmRyb2lkIFRvb2xzIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXAxIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9Imdyb3VwMiIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZE5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zLk5ld1htbEZpbGVBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvbmV3X3htbC5wbmciCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LndpemFyZHMuYWN0aW9ucy5OZXdYbWxGaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9Ik5ldyBSZXNvdXJjZSBGaWxlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkVG9vbHMvZ3JvdXAxIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iT3BlbnMgYSB3aXphcmQgdG8gaGVscCBjcmVhdGUgYSBuZXcgQW5kcm9pZCBYTUwgUmVzb3VyY2UgZmlsZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zLk5ld1Rlc3RQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2FuZHJvaWRqdW5pdC5wbmciCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LndpemFyZHMuYWN0aW9ucy5OZXdUZXN0UHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJOZXcgVGVzdCBQcm9qZWN0Li4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkVG9vbHMvZ3JvdXAxIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iT3BlbnMgYSB3aXphcmQgdG8gaGVscCBjcmVhdGUgYSBuZXcgQW5kcm9pZCBUZXN0IFByb2plY3QiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuYWN0aW9ucy5FeHBvcnRBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5wcm9qZWN0LkV4cG9ydEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJFeHBvcnQgVW5zaWduZWQgQXBwbGljYXRpb24gUGFja2FnZS4uLiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZFRvb2xzL2dyb3VwMiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnMuRXhwb3J0V2l6YXJkQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucHJvamVjdC5FeHBvcnRXaXphcmRBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iRXhwb3J0IFNpZ25lZCBBcHBsaWNhdGlvbiBQYWNrYWdlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkVG9vbHMvZ3JvdXAyIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmFjdGlvbnMuRml4UHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnByb2plY3QuRml4UHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJGaXggUHJvamVjdCBQcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkVG9vbHMvZ3JvdXAzIi8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByZWZlcmVuY2VzLkFuZHJvaWRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5wcmVmZXJlbmNlcy5tYWluIgotICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5wcmVmZXJlbmNlcy5tYWluIgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlcy5CdWlsZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5wcmVmZXJlbmNlcy5CdWlsZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iQnVpbGQiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UucHJlZmVyZW5jZXMubWFpbiIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJlZmVyZW5jZXMuTGF1bmNoUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnByZWZlcmVuY2VzLkxhdW5jaFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iTGF1bmNoIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnByZWZlcmVuY2VzLm1haW4iCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByZWZlcmVuY2VzLlVzYWdlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLnByZWZlcmVuY2VzLlVzYWdlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJVc2FnZSBTdGF0cyI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuYWR0UHJvYmxlbSIKLSAgICAgICAgIG5hbWU9IkFuZHJvaWQgQURUIFByb2JsZW0iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC50YXJnZXRQcm9ibGVtIgotICAgICAgICAgbmFtZT0iQW5kcm9pZCBUYXJnZXQgUHJvYmxlbSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0iZmFsc2UiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiPgotICAgICAgICAgPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucHJvamVjdC5OZXdQcm9qZWN0V2l6YXJkIiAvPgotICAgICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy53aXphcmRzLk5ld1htbEZpbGVXaXphcmQiPgotICAgICAgICAgPC9uZXdXaXphcmRTaG9ydGN1dD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXdTaG9ydGN1dCBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5Mb2dDYXRWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0IGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkRldmljZVZpZXciLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUucHJvamVjdE5hdHVyZUltYWdlcyI+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2FuZHJvaWRfcHJvamVjdC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWROYXR1cmUuaW1hZ2UiCi0gICAgICAgICAgICBuYXR1cmVJZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWROYXR1cmUiPgotICAgICAgPC9pbWFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIj4KLSAgICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucHJvamVjdC5BbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotICAgICAgPC9jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcj4KLSAgICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQU5EUk9JRF9GUkFNRVdPUksiPgotICAgICAgPC9jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2Uud2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS53aXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmV4cG9ydC5FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucHJvamVjdC5FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSJFeHBvcnQgQW5kcm9pZCBBcHBsaWNhdGlvbiI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJEZWJ1ZyBBbmRyb2lkIEFwcGxpY2F0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlYnVnIEFuZHJvaWQgQXBwbGljYXRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jYXRlZ29yeS5ydW4iCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmxhdW5jaC5MYXVuY2hTaG9ydGN1dC5kZWJ1ZyI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iUnVuIEFuZHJvaWQgQXBwbGljYXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVuIEFuZHJvaWQgQXBwbGljYXRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jYXRlZ29yeS5ydW4iCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmxhdW5jaC5MYXVuY2hTaG9ydGN1dC5ydW4iPgotICAgICAgPC9jb21tYW5kPgotICAgICAgPGtleUJpbmRpbmcKLSAgICAgICAgICAgIGtleVNlcXVlbmNlPSJNMytNMitBIEQiCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgICAgICAgICAgY29tbWFuZElkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubGF1bmNoLkxhdW5jaFNob3J0Y3V0LmRlYnVnIgotICAgICAgICAgICAga2V5Q29uZmlndXJhdGlvbklkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDwva2V5QmluZGluZz4KLSAgICAgIDxrZXlCaW5kaW5nCi0gICAgICAgICAgICBrZXlTZXF1ZW5jZT0iTTMrTTIrQSBSIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmxhdW5jaC5MYXVuY2hTaG9ydGN1dC5ydW4iCi0gICAgICAgICAgICBrZXlDb25maWd1cmF0aW9uSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotICAgICAgPC9rZXlCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuRm9sZGVyRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5wcm9qZWN0LkZvbGRlckRlY29yYXRvciIKLSAgICAgICAgICAgIGxhYmVsPSJBbmRyb2lkIERlY29yYXRvciIKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9SSUdIVCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIgotICAgICAgICAgICAgc3RhdGU9InRydWUiPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBmaWxlbmFtZXM9IkFuZHJvaWRNYW5pZmVzdC54bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLm1hbmlmZXN0Lk1hbmlmZXN0RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCBNYW5pZmVzdCBFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLlJlc291cmNlc0VkaXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ieG1sIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5yZXNvdXJjZXMuUmVzb3VyY2VzRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCBSZXNvdXJjZSBFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LkxheW91dEVkaXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ieG1sIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5sYXlvdXQuTGF5b3V0RWRpdG9yIgotICAgICAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0Lk1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgICAgICBuYW1lPSJBbmRyb2lkIExheW91dCBFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWVudS5NZW51RWRpdG9yIgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ4bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLm1lbnUuTWVudUVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQgTWVudSBFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sLlhtbEVkaXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0ieG1sIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy54bWwuWG1sRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCBYbWwgUmVzb3VyY2VzIEVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5SZXNvdXJjZUV4cGxvcmVyVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2FuZHJvaWQucG5nIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLmV4cGxvcmVyLlJlc291cmNlRXhwbG9yZXJWaWV3IgotICAgICAgICAgICAgbmFtZT0iUmVzb3VyY2UgRXhwbG9yZXIiPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RTb3VyY2VWaWV3ZXJDb25maWciCi0gICAgICAgICAgICB0YXJnZXQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RFZGl0b3IiPgotICAgICAgPC9zb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uPgotICAgICAgPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuUmVzb3VyY2VzU291cmNlVmlld2VyQ29uZmlnIgotICAgICAgICAgICAgdGFyZ2V0PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLnJlc291cmNlcy5SZXNvdXJjZXNFZGl0b3IiPgotICAgICAgPC9zb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uPgotICAgICAgPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuTGF5b3V0U291cmNlVmlld2VyQ29uZmlnIgotICAgICAgICAgICAgdGFyZ2V0PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLmxheW91dC5MYXlvdXRFZGl0b3IiPgotICAgICAgPC9zb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uPgotICAgICAgPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tZW51Lk1lbnVTb3VyY2VWaWV3ZXJDb25maWciCi0gICAgICAgICAgICB0YXJnZXQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMubWVudS5NZW51RWRpdG9yIj4KLSAgICAgIDwvc291cmNlVmlld2VyQ29uZmlndXJhdGlvbj4KLSAgICAgIDxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sLlhtbFNvdXJjZVZpZXdlckNvbmZpZyIKLSAgICAgICAgICAgIHRhcmdldD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy54bWwuWG1sRWRpdG9yIj4KLSAgICAgIDwvc291cmNlVmlld2VyQ29uZmlndXJhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvcGVydGllcy5BbmRyb2lkUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5wcm9qZWN0LnByb3BlcnRpZXMuQW5kcm9pZFByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLmhhc1Byb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICBhcmdzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZE5hdHVyZSIvPgotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgZGVzY3JpcHRpb249IkFuZHJvaWQgV2l6YXJkcyIKLSAgICAgICAgICAgIGlkPSJhZHQuYWN0aW9uU2V0LndpemFyZHMiCi0gICAgICAgICAgICBsYWJlbD0iQW5kcm9pZCBXaXphcmRzIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuYWN0aW9ucy5OZXdYbWxGaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvbmV3X3htbC5wbmciCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LndpemFyZHMuYWN0aW9ucy5OZXdYbWxGaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9Ik5ldyBBbmRyb2lkIFhNTCBGaWxlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYW5kcm9pZF9wcm9qZWN0IgotICAgICAgICAgICAgICAgdG9vbHRpcD0iT3BlbnMgYSB3aXphcmQgdG8gaGVscCBjcmVhdGUgYSBuZXcgQW5kcm9pZCBYTUwgZmlsZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zLk5ld1Rlc3RQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZGp1bml0LnBuZyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQud2l6YXJkcy5hY3Rpb25zLk5ld1Rlc3RQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9Ik5ldyBBbmRyb2lkIFRlc3QgUHJvamVjdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFuZHJvaWRfcHJvamVjdCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9Ik9wZW5zIGEgd2l6YXJkIHRvIGhlbHAgY3JlYXRlIGEgbmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnMuTmV3UHJvamVjdEFjdGlvbiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL25ld19hZHRfcHJvamVjdC5wbmciCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LndpemFyZHMuYWN0aW9ucy5OZXdQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9Ik5ldyBBbmRyb2lkIFByb2plY3QiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhbmRyb2lkX3Byb2plY3QiCi0gICAgICAgICAgICAgICB0b29sdGlwPSJPcGVucyBhIHdpemFyZCB0byBoZWxwIGNyZWF0ZSBhIG5ldyBBbmRyb2lkIHByb2plY3QiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZWZhY3RvcmluZ3MgZm9yIEFuZHJvaWQiCi0gICAgICAgICAgICBpZD0iYWR0LmFjdGlvblNldC5yZWZhY3RvcmluZ3MiCi0gICAgICAgICAgICBsYWJlbD0iQW5kcm9pZCBSZWZhY3RvcmluZ3MiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLQotICAgICAgICAgPCEtLSBUaGlzIGR1cGxpY2F0ZXMgdGhlIFJlZmFjdG9yaW5nIE1lbnUgZGVmaW5pdGlvbiBmcm9tIHRoZSBqZHQudWkgcGx1Z2luLnhtbCwKLSAgICAgICAgICAgICAgd2hpY2ggYWxsb3dzIHVzIHRvIGluc2VydCBvdXIgY29udHJpYnV0aW9uIGV2ZW4gaWYgdGhlIEpEVCBpcyBub3QgbG9hZGVkLgotICAgICAgICAgICAgICBXZSBvdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB3aXRoIG91ciBuZXcgZ3JvdXAuLS0+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IlJlZmFjdG9yIgotICAgICAgICAgICAgICAgcGF0aD0iZWRpdCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcubWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InVuZG9SZWRvR3JvdXAiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0icmVvcmdHcm91cCIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJhbmRyb2lkR3JvdXAiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iY29kaW5nR3JvdXAiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0icmVvcmdHcm91cDIiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0idHlwZUdyb3VwIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InR5cGVHcm91cDIiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iY29kaW5nR3JvdXAyIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InR5cGVHcm91cDMiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0ic2NyaXB0R3JvdXAiLz4KLSAgICAgICAgIDwvbWVudT4KLQotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSJBbmRyb2lkIgotICAgICAgICAgICAgICAgcGF0aD0ib3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLm1lbnUvYW5kcm9pZEdyb3VwIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5yZWZhY3RvcmluZy5tZW51Ij4KLSAgICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJhbmRyb2lkIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nLkV4dHJhY3RTdHJpbmdBY3Rpb24iCi0gICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5yZWZhY3RvcmluZy5leHRyYWN0LnN0cmluZyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuYWN0aW9ucy5FeHRyYWN0U3RyaW5nIgotICAgICAgICAgICAgICAgbGFiZWw9IkV4dHJhY3QgQW5kcm9pZCBTdHJpbmcuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLm1lbnUvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnJlZmFjdG9yaW5nLm1lbnUvYW5kcm9pZCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iRXh0cmFjdHMgYSBzdHJpbmcgaW50byBBbmRyb2lkIHJlc291cmNlIHN0cmluZyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLm1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iUmVmYWN0b3IiPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQW5kcm9pZCBBVkQgYW5kIFNESyBNYW5hZ2VyIgotICAgICAgICAgICAgaWQ9ImFkdC5hY3Rpb25TZXQuYXZkTWFuYWdlciIKLSAgICAgICAgICAgIGxhYmVsPSJBbmRyb2lkIFNESyBhbmQgQVZEIE1hbmFnZXIiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zLkF2ZE1hbmFnZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9hdmRfbWFuYWdlci5wbmciCi0gICAgICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnVpLmF2ZG1hbmFnZXIiCi0gICAgICAgICAgICAgICBsYWJlbD0iQW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9IldpbmRvdy9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhbmRyb2lkX3Byb2plY3QiCi0gICAgICAgICAgICAgICB0b29sdGlwPSJPcGVucyB0aGUgQW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaERlbGVnYXRlcyI+Ci0gICAgICAgPGxhdW5jaERlbGVnYXRlCi0gICAgICAgICAgICAgZGVsZWdhdGU9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZSIKLSAgICAgICAgICAgICBkZWxlZ2F0ZURlc2NyaXB0aW9uPSJSZW1vdmVzIHRoZSBBbmRyb2lkIEpBUiBmcm9tIHRoZSBCb290c3RyYXAgQ2xhc3NwYXRoIgotICAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubGF1bmNoLkpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUubGF1bmNoQW5kcm9pZEp1bml0IgotICAgICAgICAgICAgIG1vZGVzPSJydW4sZGVidWciCi0gICAgICAgICAgICAgbmFtZT0iQW5kcm9pZCBKVW5pdCBUZXN0IgotICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sYXVuY2hjb25maWciPgotICAgICAgIDwvbGF1bmNoRGVsZWdhdGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgICAgIGRlbGVnYXRlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LkFuZHJvaWRKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5qdW5pdC5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgIG1vZGVzPSJydW4sZGVidWciCi0gICAgICAgICAgICBuYW1lPSJBbmRyb2lkIEpVbml0IFRlc3QiCi0gICAgICAgICAgICBwdWJsaWM9InRydWUiCi0gICAgICAgICAgICBzb3VyY2VMb2NhdG9ySWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlTG9jYXRvci5KYXZhU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb29rdXAuamF2YVNvdXJjZVBhdGhDb21wdXRlciI+Ci0gICAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgICAgICAgIGNvbmZpZ1R5cGVJRD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Lmp1bml0LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZGp1bml0LnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuanVuaXQubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSI+Ci0gICAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LkFuZHJvaWRKVW5pdFRhYkdyb3VwIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkFuZHJvaWQgSlVuaXQgVGVzdCIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuanVuaXQuQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnVGFiR3JvdXAiCi0gICAgICAgICAgICB0eXBlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuanVuaXQubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaFNob3J0Y3V0cyI+Ci0gICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LkFuZHJvaWRKVW5pdExhdW5jaFNob3J0Y3V0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvYW5kcm9pZGp1bml0LnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuanVuaXQubGF1bmNoU2hvcnRjdXQiCi0gICAgICAgICAgICBsYWJlbD0iQW5kcm9pZCBKVW5pdCBUZXN0IgotICAgICAgICAgICAgbW9kZXM9InJ1bixkZWJ1ZyI+Ci0gICAgICAgICAgPGNvbnRleHR1YWxMYXVuY2g+Ci0gICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgICAgPGNvdW50IHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICAgICA8aXRlcmF0ZT4KLSAgICAgICAgICAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5pc0luSmF2YVByb2plY3RXaXRoTmF0dXJlIiB2YWx1ZT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWROYXR1cmUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5oYXNUeXBlT25DbGFzc3BhdGgiIHZhbHVlPSJqdW5pdC5mcmFtZXdvcmsuVGVzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5jYW5MYXVuY2hBc0pVbml0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPC9jb250ZXh0dWFsTGF1bmNoPgotICAgICAgICAgPGNvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5qdW5pdC5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci0gICAgICAgICA8L2NvbmZpZ3VyYXRpb25UeXBlPgotICAgICAgPC9zaG9ydGN1dD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlZmFjdG9yaW5ncyBmb3IgQW5kcm9pZCBQcm9qZWN0cyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucmVmYWN0b3JpbmcuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJBbmRyb2lkIFJlZmFjdG9yaW5ncyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5yZWZhY3RvcmluZy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJFeHRyYWN0IFN0cmluZ3MgaW50byBBbmRyb2lkIFN0cmluZyBSZXNvdXJjZXMiCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnJlZmFjdG9yaW5nLmV4dHJhY3Quc3RyaW5nIgotICAgICAgICAgICAgbmFtZT0iRXh0cmFjdCBBbmRyb2lkIFN0cmluZyI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8a2V5QmluZGluZwotICAgICAgICAgICAgY29tbWFuZElkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucmVmYWN0b3JpbmcuZXh0cmFjdC5zdHJpbmciCi0gICAgICAgICAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgICAgICAgICAga2V5Q29uZmlndXJhdGlvbklkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIgotICAgICAgICAgICAga2V5U2VxdWVuY2U9Ik0zK00yK0EgUyI+Ci0gICAgICA8L2tleUJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZWZhY3RvcmluZ0NvbnRyaWJ1dGlvbnMiPgotICAgICAgPGNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZWZhY3RvcmluZ3MuZXh0cmFjdHN0cmluZy5FeHRyYWN0U3RyaW5nQ29udHJpYnV0aW9uIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5yZWZhY3RvcmluZy5leHRyYWN0LnN0cmluZyI+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9ImlzVGVzdCxjYW5MYXVuY2hBc0pVbml0IgotICAgICAgICAgICAgbmFtZXNwYWNlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LkFuZHJvaWRKVW5pdFByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkSlVuaXRQcm9wZXJ0eVRlc3RlciI+Ci0gICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9BZHRDb25zdGFudHMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9BZHRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxNzVjZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvQWR0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLQotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb24gY2xhc3MuPGJyPgotICogPGJyPgotICogTW9zdCBjb25zdGFudHMgaGF2ZSBhIHByZWZpeCBkZWZpbmluZyB0aGUgY29udGVudC4KLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5XU188L2NvZGU+IFdvcmtzcGFjZSBwYXRoIGNvbnN0YW50LiBUaG9zZSBhcmUgYWJzb2x1dGUgcGF0aHMsCi0gKiBmcm9tIHRoZSBwcm9qZWN0IHJvb3QuPC9saT4KLSAqIDxsaT48Y29kZT5PU188L2NvZGU+IE9TIHBhdGggY29uc3RhbnQuIFRoZXNlIHBhdGhzIGFyZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS48L2xpPgotICogPGxpPjxjb2RlPkZOXzwvY29kZT4gRmlsZSBuYW1lIGNvbnN0YW50LjwvbGk+Ci0gKiA8bGk+PGNvZGU+RkRfPC9jb2RlPiBGb2xkZXIgbmFtZSBjb25zdGFudC48L2xpPgotICogPGxpPjxjb2RlPk1BUktFUl88L2NvZGU+IFJlc291cmNlIE1hcmtlciBJZHMgY29uc3RhbnQuPC9saT4KLSAqIDxsaT48Y29kZT5FWFRfPC9jb2RlPiBGaWxlIGV4dGVuc2lvbiBjb25zdGFudC4gVGhpcyBkb2VzIE5PVCBpbmNsdWRlIGEgZG90LjwvbGk+Ci0gKiA8bGk+PGNvZGU+RE9UXzwvY29kZT4gRmlsZSBleHRlbnNpb24gY29uc3RhbnQuIFRoaXMgc3RhcnQgd2l0aCBhIGRvdC48L2xpPgotICogPGxpPjxjb2RlPlJFXzwvY29kZT4gUmVnZXhwIGNvbnN0YW50LjwvbGk+Ci0gKiA8bGk+PGNvZGU+QlVJTERfPC9jb2RlPiBCdWlsZCB2ZXJib3NpdHkgbGV2ZWwgY29uc3RhbnQuIFRvIHVzZSB3aXRoCi0gKiA8Y29kZT5BZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZSgpPC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQWR0Q29uc3RhbnRzIHsKLSAgICAvKiogR2VuZXJpYyBtYXJrZXIgZm9yIEFEVCBlcnJvcnMuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FEVCA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmFkdFByb2JsZW0iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogTWFya2VyIGZvciBBbmRyb2lkIFRhcmdldCBlcnJvcnMuCi0gICAgICogVGhpcyBpcyBub3QgY2xlYXJlZCBvbiBlYWNoIGxpa2Ugb3RoZXIgbWFya2Vycy4gSW5zdGVhZCwgaXQncyBjbGVhcmVkCi0gICAgICogd2hlbiBhbiB7QGxpbmsgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyfSBoYXMgc3VjY2VlZGVkIGluIGNyZWF0aW5nIGFuCi0gICAgICogQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lciAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUktFUl9UQVJHRVQgPSBBZHRQbHVnaW4uUExVR0lOX0lEICsgIi50YXJnZXRQcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIEJ1aWxkIHZlcmJvc2l0eSAiQWx3YXlzIi4gVGhvc2UgbWVzc2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVJTERfQUxXQVlTID0gMDsKLQotICAgIC8qKiBCdWlsZCB2ZXJib3NpdHkgbGV2ZWwgIk5vcm1hbCIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUlMRF9OT1JNQUwgPSAxOwotCi0gICAgLyoqIEJ1aWxkIHZlcmJvc2l0eSBsZXZlbCAiVmVyYm9zZSIuIFRob3NlIG1lc3NhZ2VzIGFyZSBvbmx5IGRpc3BsYXllZCBpbiB2ZXJib3NlIG1vZGUgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUlMRF9WRVJCT1NFID0gMjsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L0FkdFBsdWdpbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L0FkdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhiNmMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9BZHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5TdGFja1RyYWNlUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuU3RhY2tUcmFjZVBhbmVsLklTb3VyY2VSZXZlYWxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5jb25zb2xlLkRkbUNvbnNvbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuY29uc29sZS5JRGRtQ29uc29sZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuVmVyc2lvbkNoZWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5MYXlvdXRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWVudS5NZW51RWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5SZXNvdXJjZXNFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sLlhtbEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkFuZHJvaWRMYXVuY2hDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlcy5CdWlsZFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5FeHBvcnRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5FeHBvcnRIZWxwZXIuSUV4cG9ydENhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5Qcm9qZWN0UmVzb3VyY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuTG9hZFN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkay5JVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpLkVjbGlwc2VVaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5leHBvcnQuRXhwb3J0V2l6YXJkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLkltYWdlTG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3N0YXRzLlNka1N0YXRzU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLk1lc3NhZ2VDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuTWVzc2FnZUNvbnNvbGVTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWR0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgLyoqIFRoZSBwbHVnLWluIElEICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1NES19ESVIgPSBQTFVHSU5fSUQgKyAiLnNkayI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX1JFU19BVVRPX1JFRlJFU0ggPSBQTFVHSU5fSUQgKyAiLnJlc0F1dG9SZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQlVJTERfVkVSQk9TSVRZID0gUExVR0lOX0lEICsgIi5idWlsZFZlcmJvc2l0eSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0RFRkFVTFRfREVCVUdfS0VZU1RPUkUgPSBQTFVHSU5fSUQgKyAiLmRlZmF1bHREZWJ1Z0tleVN0b3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfQ1VTVE9NX0RFQlVHX0tFWVNUT1JFID0gUExVR0lOX0lEICsgIi5jdXN0b21EZWJ1Z0tleVN0b3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRlNfSE9NRV9QQUNLQUdFID0gUExVR0lOX0lEICsgIi5ob21lUGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0VNVV9PUFRJT05TID0gUExVR0lOX0lEICsgIi5lbXVPcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIHNpbmdsZXRvbiBpbnN0YW5jZSAqLwotICAgIHByaXZhdGUgc3RhdGljIEFkdFBsdWdpbiBzUGx1Z2luOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2Ugc0FuZHJvaWRMb2dvOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBzQW5kcm9pZExvZ29EZXNjOwotCi0gICAgLyoqIGRlZmF1bHQgc3RvcmUsIHByb3ZpZGVkIGJ5IGVjbGlwc2UgKi8KLSAgICBwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgbVN0b3JlOwotCi0gICAgLyoqIGNhY2hlZCBsb2NhdGlvbiBmb3IgdGhlIHNkayBmb2xkZXIgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtT3NTZGtMb2NhdGlvbjsKLQotICAgIC8qKiBUaGUgZ2xvYmFsIGFuZHJvaWQgY29uc29sZSAqLwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnNvbGUgbUFuZHJvaWRDb25zb2xlOwotCi0gICAgLyoqIFN0cmVhbSB0byB3cml0ZSBpbiB0aGUgYW5kcm9pZCBjb25zb2xlICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29uc29sZVN0cmVhbSBtQW5kcm9pZENvbnNvbGVTdHJlYW07Ci0KLSAgICAvKiogU3RyZWFtIHRvIHdyaXRlIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VDb25zb2xlU3RyZWFtIG1BbmRyb2lkQ29uc29sZUVycm9yU3RyZWFtOwotCi0gICAgLyoqIEltYWdlIGxvYWRlciBvYmplY3QgKi8KLSAgICBwcml2YXRlIEltYWdlTG9hZGVyIG1Mb2FkZXI7Ci0KLSAgICAvKiogVmVyYm9zaXR5IG9mIHRoZSBidWlsZCAqLwotICAgIHByaXZhdGUgaW50IG1CdWlsZFZlcmJvc2l0eSA9IEFkdENvbnN0YW50cy5CVUlMRF9OT1JNQUw7Ci0KLSAgICAvKiogQ29sb3IgdXNlZCBpbiB0aGUgZXJyb3IgY29uc29sZSAqLwotICAgIHByaXZhdGUgQ29sb3IgbVJlZDsKLQotICAgIC8qKiBMb2FkIHN0YXR1cyBvZiB0aGUgU0RLLiBBbnkgYWNjZXNzIE1VU1QgYmUgaW4gYSBzeW5jaHJvbml6ZWQobVBvc3RMb2FkUHJvamVjdHMpIGJsb2NrICovCi0gICAgcHJpdmF0ZSBMb2FkU3RhdHVzIG1TZGtJc0xvYWRlZCA9IExvYWRTdGF0dXMuTE9BRElORzsKLSAgICAvKiogUHJvamVjdCB0byB1cGRhdGUgb25jZSB0aGUgU0RLIGlzIGxvYWRlZC4KLSAgICAgKiBBbnkgYWNjZXNzIE1VU1QgYmUgaW4gYSBzeW5jaHJvbml6ZWQobVBvc3RMb2FkUHJvamVjdHNUb1Jlc29sdmUpIGJsb2NrICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PiBtUG9zdExvYWRQcm9qZWN0c1RvUmVzb2x2ZSA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4oKTsKLSAgICAvKiogUHJvamVjdCB0byBjaGVjayB2YWxpZGl0eSBvZiBjYWNoZSB2cyBhY3R1YWwgb25jZSB0aGUgU0RLIGlzIGxvYWRlZC4KLSAgICAgKiBBbnkgYWNjZXNzIE1VU1QgYmUgaW4gYSBzeW5jaHJvbml6ZWQobVBvc3RMb2FkUHJvamVjdHNUb1Jlc29sdmUpIGJsb2NrICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PiBtUG9zdExvYWRQcm9qZWN0c1RvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4oKTsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VNb25pdG9yIG1SZXNvdXJjZU1vbml0b3I7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SVRhcmdldENoYW5nZUxpc3RlbmVyPiBtVGFyZ2V0Q2hhbmdlTGlzdGVuZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldENoYW5nZUxpc3RlbmVyPigpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVNka0lzTG9hZGluZzsKLQotICAgIC8qKgotICAgICAqIEN1c3RvbSBQcmludFN0cmVhbSBmb3IgRHggb3V0cHV0LiBUaGlzIGNsYXNzIG92ZXJyaWRlcyB0aGUgbWV0aG9kCi0gICAgICogPGNvZGU+cHJpbnRsbigpPC9jb2RlPiBhbmQgYWRkcyB0aGUgc3RhbmRhcmQgb3V0cHV0IHRhZyB3aXRoIHRoZQotICAgICAqIGRhdGUgYW5kIHRoZSBwcm9qZWN0IG5hbWUgaW4gZnJvbnQgb2YgZXZlcnkgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQW5kcm9pZFByaW50U3RyZWFtIGV4dGVuZHMgUHJpbnRTdHJlYW0gewotICAgICAgICBwcml2YXRlIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtUHJlZml4OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggcHJvamVjdCBhbmQgb3V0cHV0IHN0cmVhbS4KLSAgICAgICAgICogVGhlIHByb2plY3QgaXMgdXNlZCB0byBnZXQgdGhlIHByb2plY3QgbmFtZSBmb3IgdGhlIG91dHB1dCB0YWcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBQcm9qZWN0Ci0gICAgICAgICAqIEBwYXJhbSBwcmVmaXggQSBwcmVmaXggdG8gYmUgcHJpbnRlZCBiZWZvcmUgdGhlIGFjdHVhbCBtZXNzYWdlLiBDYW4gYmUgbnVsbAotICAgICAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBTdHJlYW0KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBbmRyb2lkUHJpbnRTdHJlYW0oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZpeCwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICAgICAgc3VwZXIoc3RyZWFtKTsKLSAgICAgICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgZGF0ZS9wcm9qZWN0IHRhZyBmaXJzdC4KLSAgICAgICAgICAgIFN0cmluZyB0YWcgPSBnZXRNZXNzYWdlVGFnKG1Qcm9qZWN0ICE9IG51bGwgPyBtUHJvamVjdC5nZXROYW1lKCkgOiBudWxsKTsKLQotICAgICAgICAgICAgcHJpbnQodGFnKTsKLSAgICAgICAgICAgIGlmIChtUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludChtUHJlZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGUgcmVndWxhciBtZXNzYWdlCi0gICAgICAgICAgICBzdXBlci5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZXJyb3IgaGFuZGxlciBmb3IgY2hlY2tTZGtMb2NhdGlvbkFuZElkKCkgdGhhdCB3aWxsIGhhbmRsZSB0aGUgZ2VuZXJhdGVkIGVycm9yCi0gICAgICogb3Igd2FybmluZyBtZXNzYWdlLiBFYWNoIG1ldGhvZCBtdXN0IHJldHVybiBhIGJvb2xlYW4gdGhhdCB3aWxsIGluIHR1cm4gYmUgcmV0dXJuZWQgYnkKLSAgICAgKiBjaGVja1Nka0xvY2F0aW9uQW5kSWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDaGVja1Nka0Vycm9ySGFuZGxlciB7Ci0gICAgICAgIC8qKiBIYW5kbGUgYW4gZXJyb3IgbWVzc2FnZSBkdXJpbmcgc2RrIGxvY2F0aW9uIGNoZWNrLiBSZXR1cm5zIHdoYXRldmVyCi0gICAgICAgICAqIGNoZWNrU2RrTG9jYXRpb25BbmRJZCgpIHNob3VsZCByZXR1cm5zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlRXJyb3IoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgICAgIC8qKiBIYW5kbGUgYSB3YXJuaW5nIG1lc3NhZ2UgZHVyaW5nIHNkayBsb2NhdGlvbiBjaGVjay4gUmV0dXJucyB3aGF0ZXZlcgotICAgICAgICAgKiBjaGVja1Nka0xvY2F0aW9uQW5kSWQoKSBzaG91bGQgcmV0dXJucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhbmRsZVdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBBZHRQbHVnaW4oKSB7Ci0gICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IGFuZHJvaWQgY29uc29sZS4KLSAgICAgICAgbUFuZHJvaWRDb25zb2xlID0gbmV3IE1lc3NhZ2VDb25zb2xlKCJBbmRyb2lkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKS5hZGRDb25zb2xlcygKLSAgICAgICAgICAgICAgICBuZXcgSUNvbnNvbGVbXSB7IG1BbmRyb2lkQ29uc29sZSB9KTsKLQotICAgICAgICAvLyBnZXQgdGhlIHN0cmVhbSB0byB3cml0ZSBpbiB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAgICBtQW5kcm9pZENvbnNvbGVTdHJlYW0gPSBtQW5kcm9pZENvbnNvbGUubmV3TWVzc2FnZVN0cmVhbSgpOwotICAgICAgICBtQW5kcm9pZENvbnNvbGVFcnJvclN0cmVhbSA9IG1BbmRyb2lkQ29uc29sZS5uZXdNZXNzYWdlU3RyZWFtKCk7Ci0gICAgICAgIG1SZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhGRiwgMHgwMCwgMHgwMCk7Ci0KLSAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGNhbiBiZSBydW4sIGluIHNvbWUgY2FzZXMsIGJ5IGEgbm9uIHVpIHRocmVhZCwgYW5kIGJlY2NhdXNlCi0gICAgICAgIC8vIGNoYW5naW5nIHRoZSBjb25zb2xlIHByb3BlcnRpZXMgdXBkYXRlIHRoZSB1aSwgd2UgbmVlZCB0byBtYWtlIHRoaXMgY2hhbmdlCi0gICAgICAgIC8vIGluIHRoZSB1aSB0aHJlYWQuCi0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtQW5kcm9pZENvbnNvbGVFcnJvclN0cmVhbS5zZXRDb2xvcihtUmVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIHRoZSBkZG1zIGNvbnNvbGUgdG8gdXNlIHRoaXMgb2JqZWN0cwotICAgICAgICBEZG1Db25zb2xlLnNldENvbnNvbGUobmV3IElEZG1Db25zb2xlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRFcnJvclRvQ29uc29sZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKChTdHJpbmcpbnVsbCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludEVycm9yVG9Db25zb2xlKFN0cmluZ1tdIG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoKFN0cmluZyludWxsLCAoT2JqZWN0W10pbWVzc2FnZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRUb0NvbnNvbGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUoKFN0cmluZyludWxsLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50VG9Db25zb2xlKFN0cmluZ1tdIG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKChTdHJpbmcpbnVsbCwgKE9iamVjdFtdKW1lc3NhZ2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBlY2xpcHNlIHN0b3JlCi0gICAgICAgIG1TdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgICAgIC8vIHNldCB0aGUgbGlzdGVuZXIgZm9yIHRoZSBwcmVmZXJlbmNlIGNoYW5nZQotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgICAgIHByZWZzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgU0RLIGNoYW5nZWQsIHdlIHVwZGF0ZSB0aGUgY2FjaGVkIHZlcnNpb24KLSAgICAgICAgICAgICAgICBpZiAoUFJFRlNfU0RLX0RJUi5lcXVhbHMocHJvcGVydHkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgb25lIGZyb20gdGhlIHByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICAgICAgIG1Pc1Nka0xvY2F0aW9uID0gKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCBlbmRzIHdpdGggYSBzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Pc1Nka0xvY2F0aW9uLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU9zU2RrTG9jYXRpb24gPSBtT3NTZGtMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSByZXN0YXJ0IGFkYiwgaW4gY2FzZSBpdCdzIGEgZGlmZmVyZW50IHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgRGRtc1BsdWdpbi5zZXRBZGIoZ2V0T3NBYnNvbHV0ZUFkYigpLCB0cnVlIC8qIHN0YXJ0QWRiICovKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIFNESyBsb2NhdGlvbiBhbmQgYnVpbGQgaWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1Nka0xvY2F0aW9uQW5kSWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2RrIGlmIHZhbGlkLCByZXBhcnNlIGl0Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFyc2VTZGsoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUFJFRlNfQlVJTERfVkVSQk9TSVRZLmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkVmVyYm9zaXR5ID0gQnVpbGRQcmVmZXJlbmNlUGFnZS5nZXRCdWlsZExldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdG9yZS5nZXRTdHJpbmcoUFJFRlNfQlVJTERfVkVSQk9TSVRZKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtT3NTZGtMb2NhdGlvbiA9IG1TdG9yZS5nZXRTdHJpbmcoUFJFRlNfU0RLX0RJUik7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGVuZHMgd2l0aCBhIHNlcGFyYXRvci4gTm9ybWFsbHkgdGhpcyBpcyBkb25lIHdoZW4gdGhlIHByZWZlcmVuY2UKLSAgICAgICAgLy8gaXMgc2V0LiBCdXQgdG8gbWFrZSBzdXJlIG9sZGVyIHZlcnNpb24gc3RpbGwgd29yaywgd2UgZml4IGl0IGhlcmUgYXMgd2VsbC4KLSAgICAgICAgaWYgKG1Pc1Nka0xvY2F0aW9uLmxlbmd0aCgpID4gMCAmJiBtT3NTZGtMb2NhdGlvbi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIG1Pc1Nka0xvY2F0aW9uID0gbU9zU2RrTG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBsb2NhdGlvbiBvZiBTREsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Nka0xvY2F0aW9uVmFsaWQgPSBjaGVja1Nka0xvY2F0aW9uQW5kSWQoKTsKLQotICAgICAgICBtQnVpbGRWZXJib3NpdHkgPSBCdWlsZFByZWZlcmVuY2VQYWdlLmdldEJ1aWxkTGV2ZWwoCi0gICAgICAgICAgICAgICAgbVN0b3JlLmdldFN0cmluZyhQUkVGU19CVUlMRF9WRVJCT1NJVFkpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGxvYWRlciB0aGF0J3MgYWJsZSB0byBsb2FkIHRoZSBpbWFnZXMKLSAgICAgICAgbUxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcih0aGlzKTsKLQotICAgICAgICAvLyBzdGFydCB0aGUgRGRtc1BsdWdpbiBieSBzZXR0aW5nIHRoZSBhZGIgbG9jYXRpb24sIG9ubHkgaWYgaXQgaXMgc2V0IGFscmVhZHkuCi0gICAgICAgIGlmIChtT3NTZGtMb2NhdGlvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIERkbXNQbHVnaW4uc2V0QWRiKGdldE9zQWJzb2x1dGVBZGIoKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhbmQgZ2l2ZSBpdCB0aGUgZGVidWcgbGF1bmNoZXIgZm9yIGFuZHJvaWQgcHJvamVjdHMKLSAgICAgICAgRGRtc1BsdWdpbi5zZXRSdW5uaW5nQXBwRGVidWdMYXVuY2hlcihuZXcgRGRtc1BsdWdpbi5JRGVidWdMYXVuY2hlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRlYnVnKFN0cmluZyBhcHBOYW1lLCBpbnQgcG9ydCkgewotICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBmb3IgYW4gYW5kcm9pZCBwcm9qZWN0IG1hdGNoaW5nIHRoZSBwcm9jZXNzIG5hbWUKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdEhlbHBlci5maW5kQW5kcm9pZFByb2plY3RCeUFwcE5hbWUoYXBwTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci5kZWJ1Z1J1bm5pbmdBcHAocHJvamVjdCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFN0YWNrVHJhY2VQYW5lbC5zZXRTb3VyY2VSZXZlYWxlcihuZXcgSVNvdXJjZVJldmVhbGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmV2ZWFsKFN0cmluZyBhcHBsaWNhdGlvbk5hbWUsIFN0cmluZyBjbGFzc05hbWUsIGludCBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RIZWxwZXIuZmluZEFuZHJvaWRQcm9qZWN0QnlBcHBOYW1lKGFwcGxpY2F0aW9uTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5yZXZlYWxTb3VyY2UocHJvamVjdCwgY2xhc3NOYW1lLCBsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNldHVwIGV4cG9ydCBjYWxsYmFjayBmb3IgZWRpdG9ycwotICAgICAgICBFeHBvcnRIZWxwZXIuc2V0Q2FsbGJhY2sobmV3IElFeHBvcnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RXhwb3J0V2l6YXJkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgRXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFeHBvcnRXaXphcmQoKTsKLSAgICAgICAgICAgICAgICB3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgd2l6YXJkKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIGVkaXRvcnMKLSAgICAgICAgc3RhcnRFZGl0b3JzKCk7Ci0KLSAgICAgICAgLy8gUGluZyB0aGUgdXNhZ2Ugc2VydmVyIGFuZCBwYXJzZSB0aGUgU0RLIGNvbnRlbnQuCi0gICAgICAgIC8vIFRoaXMgaXMgZGVmZXJyZWQgaW4gc2VwYXJhdGUgam9icyB0byBhdm9pZCBibG9ja2luZyB0aGUgYnVuZGxlIHN0YXJ0LgotICAgICAgICAvLyBXZSBhbHNvIHNlcmlhbGl6ZSB0aGVtIHRvIGF2b2lkIHRvbyBtYW55IHBhcmFsbGVsIGpvYnMgd2hlbiBFY2xpcHNlIHN0YXJ0cy4KLSAgICAgICAgSm9iIHBpbmdKb2IgPSBjcmVhdGVQaW5nVXNhZ2VTZXJ2ZXJKb2IoKTsKLSAgICAgICAgcGluZ0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHN1cGVyLmRvbmUoZXZlbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgcGluZyBqb2IgaXMgZmluaXNoZWQsIHN0YXJ0IHRoZSBTREsgcGFyc2VyCi0gICAgICAgICAgICAgICAgaWYgKGlzU2RrTG9jYXRpb25WYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgU0RLIHJlc291cmNlcy4KLSAgICAgICAgICAgICAgICAgICAgcGFyc2VTZGtDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gYnVpbGQgam9icyBhcmUgcnVuIGFmdGVyIG90aGVyIGludGVyYWN0aXZlIGpvYnMKLSAgICAgICAgcGluZ0pvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOwotICAgICAgICAvLyBXYWl0IDIgc2Vjb25kcyBiZWZvcmUgc3RhcnRpbmcgdGhlIHBpbmcgam9iLiBUaGlzIGxlYXZlcyBzb21lIHRpbWUgdG8gdGhlCi0gICAgICAgIC8vIG90aGVyIGJ1bmRsZXMgdG8gaW5pdGlhbGl6ZS4KLSAgICAgICAgcGluZ0pvYi5zY2hlZHVsZSgyMDAwIC8qbWlsbGlzZWNvbmRzKi8pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLQotICAgICAgICBzdG9wRWRpdG9ycygpOwotCi0gICAgICAgIG1SZWQuZGlzcG9zZSgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5jbGFzcykgewotICAgICAgICAgICAgc1BsdWdpbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogUmV0dXJuIHRoZSBpbWFnZSBsb2FkZXIgZm9yIHRoZSBwbHVnaW4gKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBJbWFnZUxvYWRlciBnZXRJbWFnZUxvYWRlcigpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNQbHVnaW4ubUxvYWRlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEFkdFBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaCBiZW5jaCA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoQWR0UGx1Z2luLmNsYXNzKSB7Ci0gICAgICAgICAgICBiZW5jaCA9IHNQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVuY2ggIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGJlbmNoLmdldERpc3BsYXkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYWRiIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNkayBmb2xkZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPc1JlbGF0aXZlQWRiKCkgewotICAgICAgICByZXR1cm4gU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQURCOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSB6aXBhbGlnbiBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzZGsgZm9sZGVyICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3NSZWxhdGl2ZVppcEFsaWduKCkgewotICAgICAgICByZXR1cm4gU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fWklQQUxJR047Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIGVtdWxhdG9yIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNkayBmb2xkZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPc1JlbGF0aXZlRW11bGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBTZGtDb25zdGFudHMuT1NfU0RLX1RPT0xTX0ZPTERFUiArIFNka0NvbnN0YW50cy5GTl9FTVVMQVRPUjsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgYWRiIHBhdGggKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPc0Fic29sdXRlQWRiKCkgewotICAgICAgICByZXR1cm4gZ2V0T3NTZGtGb2xkZXIoKSArIGdldE9zUmVsYXRpdmVBZGIoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgemlwYWxpZ24gcGF0aCAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9zQWJzb2x1dGVaaXBBbGlnbigpIHsKLSAgICAgICAgcmV0dXJuIGdldE9zU2RrRm9sZGVyKCkgKyBnZXRPc1JlbGF0aXZlWmlwQWxpZ24oKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgdHJhY2V2aWV3IHBhdGggKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPc0Fic29sdXRlVHJhY2V2aWV3KCkgewotICAgICAgICByZXR1cm4gZ2V0T3NTZGtGb2xkZXIoKSArIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfRk9MREVSICsKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX1RSQUNFVklFVzsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgZW11bGF0b3IgcGF0aCAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9zQWJzb2x1dGVFbXVsYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldE9zU2RrRm9sZGVyKCkgKyBnZXRPc1JlbGF0aXZlRW11bGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVXJsIGZpbGUgcGF0aCB0byB0aGUgamF2YURvYyBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXJsRG9jKCkgewotICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5nZXRKYXZhRG9jUGF0aCgKLSAgICAgICAgICAgICAgICBnZXRPc1Nka0ZvbGRlcigpICsgQW5kcm9pZENvbnN0YW50cy5XU19KQVZBRE9DX0ZPTERFUl9MRUFGKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTREsgZm9sZGVyLgotICAgICAqIEd1YXJhbnRlZWQgdG8gYmUgdGVybWluYXRlZCBieSBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRPc1Nka0ZvbGRlcigpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1BsdWdpbi5tT3NTZGtMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzUGx1Z2luLm1Pc1Nka0xvY2F0aW9uID0gc1BsdWdpbi5tU3RvcmUuZ2V0U3RyaW5nKFBSRUZTX1NES19ESVIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzUGx1Z2luLm1Pc1Nka0xvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9zU2RrVG9vbHNGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPc1Nka0ZvbGRlcigpICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBnZXRBdXRvUmVzUmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzUGx1Z2luLm1TdG9yZS5nZXRCb29sZWFuKFBSRUZTX1JFU19BVVRPX1JFRlJFU0gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGludCBnZXRCdWlsZFZlcmJvc2l0eSgpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNQbHVnaW4ubUJ1aWxkVmVyYm9zaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLSAgICAgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IG9mIGEgdGV4dCBmaWxlIGVtYmVkZGVkIGluIHRoZSBwbHVnaW4gamFyCi0gICAgICogZmlsZS4KLSAgICAgKiBAcGFyYW0gZmlsZXBhdGggdGhlIGZpbGUgcGF0aCB0byB0aGUgdGV4dCBmaWxlCi0gICAgICogQHJldHVybiBudWxsIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSByZWFkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZEVtYmVkZGVkVGV4dEZpbGUoU3RyaW5nIGZpbGVwYXRoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5jbGFzcykgewotICAgICAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZSA9IHNQbHVnaW4uZ2V0QnVuZGxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXR0ZW1wdCB0byBnZXQgYSBmaWxlIHRvIG9uZSBvZiB0aGUgdGVtcGxhdGUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KEFuZHJvaWRDb25zdGFudHMuV1NfU0VQICsgZmlsZXBhdGgpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdG90YWwgPSBuZXcgU3RyaW5nQnVpbGRlcihyZWFkZXIucmVhZExpbmUoKSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICB0b3RhbC5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3ZSdsbCBqdXN0IHJldHVybiBudWxsLgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3ZSdsbCBqdXN0IHJldHVybiBudWxsLgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSBiaW5hcnkgZmlsZSBlbWJlZGRlZCBpbiB0aGUgcGx1Z2luIGphcgotICAgICAqIGZpbGUuCi0gICAgICogQHBhcmFtIGZpbGVwYXRoIHRoZSBmaWxlIHBhdGggdG8gdGhlIHRleHQgZmlsZQotICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgcmVhZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRFbWJlZGRlZEZpbGUoU3RyaW5nIGZpbGVwYXRoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5jbGFzcykgewotICAgICAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZSA9IHNQbHVnaW4uZ2V0QnVuZGxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXR0ZW1wdCB0byBnZXQgYSBmaWxlIHRvIG9uZSBvZiB0aGUgdGVtcGxhdGUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KEFuZHJvaWRDb25zdGFudHMuV1NfU0VQICsgZmlsZXBhdGgpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyZWQgcmVhZGVyIHRvIGZhY2lsaXRhdGUgcmVhZGluZy4KLSAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgdXJsLm9wZW5TdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHNpemUgdG8gcmVhZC4KLSAgICAgICAgICAgICAgICBpbnQgYXZhaWwgPSBzdHJlYW0uYXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGJ1ZmZlciBhbmQgcmVhZHMgaXQuCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2F2YWlsXTsKLSAgICAgICAgICAgICAgICBzdHJlYW0ucmVhZChidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybi4KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd2UnbGwganVzdCByZXR1cm4gbnVsbC4KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd2UnbGwganVzdCByZXR1cm4gbnVsbDsuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgYm94LiBUaGlzIGRpYWxvZyBib3ggaXMgcmFuIGFzeW5jaHJvbm91c2x5IGluIHRoZSB1aSB0aHJlYWQsCi0gICAgICogdGhlcmVmb3JlIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgotICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBib3gKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBkaXNwbGF5RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgRGlzcGxheQotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gZGlhbG9nIGJveCBvbmx5IHJ1biBpbiB1aSB0aHJlYWQuLgotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheXMgYSB3YXJuaW5nIGRpYWxvZyBib3guIFRoaXMgZGlhbG9nIGJveCBpcyByYW4gYXN5bmNocm9ub3VzbHkgaW4gdGhlIHVpIHRocmVhZCwKLSAgICAgKiB0aGVyZWZvcmUgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCi0gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveAotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIHZvaWQgZGlzcGxheVdhcm5pbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgRGlzcGxheQotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gZGlhbG9nIGJveCBvbmx5IHJ1biBpbiB1aSB0aHJlYWQuLgotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhzaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGEgeWVzL25vIHF1ZXN0aW9uIGRpYWxvZyBib3guIFRoaXMgZGlhbG9nIGlzIG9wZW5lZCBzeW5jaHJvbm91c2x5IGluIHRoZSB1aSB0aHJlYWQsCi0gICAgICogdGhlcmVmb3JlIHRoaXMgbWVzc2FnZSBjYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KLSAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYm94Ci0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgT0sgd2FzIGNsaWNrZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGRpc3BsYXlQcm9tcHQoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgRGlzcGxheSBhbmQgU2hlbGwKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gYXNrIHRoZSB1c2VyIHdoYXQgaGUgd2FudHMgdG8gZG8uCi0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0WzBdID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGRlZmF1bHQgRWNsaXBzZSBsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IGNvZGUuIFZhbGlkIHZhbHVlcyBhcmU6IHtAbGluayBJU3RhdHVzI09LfSwKLSAgICAgKiB7QGxpbmsgSVN0YXR1cyNFUlJPUn0sIHtAbGluayBJU3RhdHVzI0lORk99LCB7QGxpbmsgSVN0YXR1cyNXQVJOSU5HfSBvcgotICAgICAqIHtAbGluayBJU3RhdHVzI0NBTkNFTH0uCi0gICAgICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0IHN0cmluZywgbGlrZSBmb3Ige0BsaW5rIFN0cmluZyNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pfS4KLSAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSBmb3IKLSAgICAgKiB7QGxpbmsgU3RyaW5nI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLil9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgZm9ybWF0LCBPYmplY3QgLi4uIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UpOwotICAgICAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhbiBleGNlcHRpb24gdG8gdGhlIGRlZmF1bHQgRWNsaXBzZSBsb2cuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBzdGF0dXMgc2V2ZXJpdHkgaXMgYWx3YXlzIHNldCB0byBFUlJPUi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGV4Y2VwdGlvbiB0byBsb2cuCi0gICAgICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0IHN0cmluZywgbGlrZSBmb3Ige0BsaW5rIFN0cmluZyNmb3JtYXQoU3RyaW5nLCBPYmplY3QuLi4pfS4KLSAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSBmb3IKLSAgICAgKiB7QGxpbmsgU3RyaW5nI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLil9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbiwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0IC4uLiBhcmdzKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0gICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgbWl4IGJldHdlZW4gbG9nKFRocm93YWJsZSkgYW5kIHByaW50RXJyb3JUb0NvbnNvbGUuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbG9ncyB0aGUgZXhjZXB0aW9uIHdpdGggYW4gRVJST1Igc2V2ZXJpdHkgYW5kIHRoZSBnaXZlbiBwcmludGYtbGlrZSBmb3JtYXQgbWVzc2FnZS4KLSAgICAgKiBUaGUgc2FtZSBtZXNzYWdlIGlzIHRoZW4gcHJpbnRlZCBvbiB0aGUgQW5kcm9pZCBlcnJvciBjb25zb2xlIHdpdGggdGhlIGFzc29jaWF0ZWQgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBmb3JtYXQgc3RyaW5nLCBsaWtlIGZvciB7QGxpbmsgU3RyaW5nI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLil9LgotICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLCBsaWtlIGZvcgotICAgICAqIHtAbGluayBTdHJpbmcjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2dBbmRQcmludEVycm9yKFRocm93YWJsZSBleGNlcHRpb24sIFN0cmluZyB0YWcsCi0gICAgICAgICAgICBTdHJpbmcgZm9ybWF0LCBPYmplY3QgLi4uIGFyZ3MpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0gICAgICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICBwcmludFRvU3RyZWFtKHNQbHVnaW4ubUFuZHJvaWRDb25zb2xlRXJyb3JTdHJlYW0sIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgICAgICBzaG93QW5kcm9pZENvbnNvbGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBvbmUgb3IgbW9yZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUuCi0gICAgICogQHBhcmFtIHRhZyBBIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHByaW50IHRocm91Z2ggdGhlaXIgPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHByaW50RXJyb3JUb0NvbnNvbGUoU3RyaW5nIHRhZywgT2JqZWN0Li4uIG9iamVjdHMpIHsKLSAgICAgICAgaWYgKHNQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgcHJpbnRUb1N0cmVhbShzUGx1Z2luLm1BbmRyb2lkQ29uc29sZUVycm9yU3RyZWFtLCB0YWcsIG9iamVjdHMpOwotCi0gICAgICAgICAgICBzaG93QW5kcm9pZENvbnNvbGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBvbmUgb3IgbW9yZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUuCi0gICAgICogQHBhcmFtIG9iamVjdHMgdGhlIG9iamVjdHMgdG8gcHJpbnQgdGhyb3VnaCB0aGVpciA8Y29kZT50b1N0cmluZzwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEVycm9yVG9Db25zb2xlKE9iamVjdC4uLiBvYmplY3RzKSB7Ci0gICAgICAgIHByaW50RXJyb3JUb0NvbnNvbGUoKFN0cmluZyludWxsLCBvYmplY3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgb25lIG9yIG1vcmUgZXJyb3IgbWVzc2FnZSB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHByaW50IHRocm91Z2ggdGhlaXIgPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclRvQ29uc29sZShJUHJvamVjdCBwcm9qZWN0LCBPYmplY3QuLi4gb2JqZWN0cykgewotICAgICAgICBTdHJpbmcgdGFnID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICBwcmludEVycm9yVG9Db25zb2xlKHRhZywgb2JqZWN0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIG9uZSBvciBtb3JlIGJ1aWxkIG1lc3NhZ2VzIHRvIHRoZSBhbmRyb2lkIGNvbnNvbGUsIGZpbHRlcmVkIGJ5IEJ1aWxkIG91dHB1dCB2ZXJib3NpdHkuCi0gICAgICogQHBhcmFtIGxldmVsIFZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byB3aGljaCB0aGUgbWVzc2FnZSBpcyBhc3NvY2lhdGVkLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBwcmludCB0aHJvdWdoIHRoZWlyIDxjb2RlPnRvU3RyaW5nPC9jb2RlPiBtZXRob2QuCi0gICAgICogQHNlZSBBZHRDb25zdGFudHMjQlVJTERfQUxXQVlTCi0gICAgICogQHNlZSBBZHRDb25zdGFudHMjQlVJTERfTk9STUFMCi0gICAgICogQHNlZSBBZHRDb25zdGFudHMjQlVJTERfVkVSQk9TRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcHJpbnRCdWlsZFRvQ29uc29sZShpbnQgbGV2ZWwsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBPYmplY3QuLi4gb2JqZWN0cykgewotICAgICAgICBpZiAoc1BsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgPD0gc1BsdWdpbi5tQnVpbGRWZXJib3NpdHkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFnID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIHByaW50VG9TdHJlYW0oc1BsdWdpbi5tQW5kcm9pZENvbnNvbGVTdHJlYW0sIHRhZywgb2JqZWN0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgb25lIG9yIG1vcmUgbWVzc2FnZSB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHByaW50IHRocm91Z2ggdGhlaXIgPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHByaW50VG9Db25zb2xlKFN0cmluZyB0YWcsIE9iamVjdC4uLiBvYmplY3RzKSB7Ci0gICAgICAgIGlmIChzUGx1Z2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByaW50VG9TdHJlYW0oc1BsdWdpbi5tQW5kcm9pZENvbnNvbGVTdHJlYW0sIHRhZywgb2JqZWN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgb25lIG9yIG1vcmUgbWVzc2FnZSB0byB0aGUgYW5kcm9pZCBjb25zb2xlLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHByaW50IHRocm91Z2ggdGhlaXIgPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUb0NvbnNvbGUoSVByb2plY3QgcHJvamVjdCwgT2JqZWN0Li4uIG9iamVjdHMpIHsKLSAgICAgICAgU3RyaW5nIHRhZyA9IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0TmFtZSgpIDogbnVsbDsKLSAgICAgICAgcHJpbnRUb0NvbnNvbGUodGFnLCBvYmplY3RzKTsKLSAgICB9Ci0KLSAgICAvKiogRm9yY2UgdGhlIGRpc3BsYXkgb2YgdGhlIGFuZHJvaWQgY29uc29sZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93QW5kcm9pZENvbnNvbGUoKSB7Ci0gICAgICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGUgY29uc29sZSBpcyBpbiB0aGUgd29ya2JlbmNoCi0gICAgICAgIEVjbGlwc2VVaUhlbHBlci5zaG93VmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcsIHRydWUpOwotCi0gICAgICAgIC8vIG5vdyBtYWtlIHN1cmUgaXQncyBub3QgZG9ja2VkLgotICAgICAgICBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlTWFuYWdlcigpLnNob3dDb25zb2xlVmlldygKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFuZHJvaWRDb25zb2xlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gc3RhbmRhcmQgUHJpbnRTdHJlYW0gb2JqZWN0IGZvciBhIHNwZWNpZmljIHByb2plY3QuPGJyPgotICAgICAqIFRoaXMgUHJpbnRTdHJlYW0gd2lsbCBhZGQgYSBkYXRlL3Byb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeQotICAgICAqIDxjb2RlPnByaW50bG4oKTwvY29kZT4gb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3Qgb2JqZWN0Ci0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IFByaW50U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJpbnRTdHJlYW0gZ2V0T3V0UHJpbnRTdHJlYW0oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICBpZiAoc1BsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRQcmludFN0cmVhbShwcm9qZWN0LCBwcmVmaXgsIHNQbHVnaW4ubUFuZHJvaWRDb25zb2xlU3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZXJyb3IgUHJpbnRTdHJlYW0gb2JqZWN0IGZvciBhIHNwZWNpZmljIHByb2plY3QuPGJyPgotICAgICAqIFRoaXMgUHJpbnRTdHJlYW0gd2lsbCBhZGQgYSBkYXRlL3Byb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeQotICAgICAqIDxjb2RlPnByaW50bG4oKTwvY29kZT4gb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3Qgb2JqZWN0Ci0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IFByaW50U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJpbnRTdHJlYW0gZ2V0RXJyUHJpbnRTdHJlYW0oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICBpZiAoc1BsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRQcmludFN0cmVhbShwcm9qZWN0LCBwcmVmaXgsIHNQbHVnaW4ubUFuZHJvaWRDb25zb2xlRXJyb3JTdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBTZGsgaGFzIGJlZW4gbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBMb2FkU3RhdHVzIGdldFNka0xvYWRTdGF0dXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNka0lzTG9hZGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jayBvYmplY3QgZm9yIFNESyBsb2FkaW5nLiBJZiB5b3Ugd2lzaCB0byBkbyB0aGluZ3Mgd2hpbGUgdGhlIFNESyBpcyBsb2FkaW5nLAotICAgICAqIHlvdSBtdXN0IHN5bmNocm9uaXplIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0U2RrTG9ja09iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3N0TG9hZFByb2plY3RzVG9SZXNvbHZlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9IHRvIGhhdmUgaXRzIHRhcmdldCByZXNvbHZlZCBhZ2FpbiBvbmNlIHRoZSBTREsgZmluaXNoZXMKLSAgICAgKiB0byBsb2FkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2plY3RUb1Jlc29sdmUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICBtUG9zdExvYWRQcm9qZWN0c1RvUmVzb2x2ZS5hZGQoamF2YVByb2plY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhUHJvamVjdH0gdG8gaGF2ZSBpdHMgdGFyZ2V0IGNoZWNrZWQgZm9yIGNvbnNpc3RlbmN5Ci0gICAgICogb25jZSB0aGUgU0RLIGZpbmlzaGVzIHRvIGxvYWQuIFRoaXMgaXMgdXNlZCBpZiB0aGUgdGFyZ2V0IGlzIHJlc29sdmVkIHVzaW5nIGNhY2hlZAotICAgICAqIGluZm9ybWF0aW9uIHdoaWxlIHRoZSBTREsgaXMgbG9hZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9qZWN0VG9DaGVjayhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgLy8gb25seSBsb2NrIG9uCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICBtUG9zdExvYWRQcm9qZWN0c1RvQ2hlY2suYWRkKGphdmFQcm9qZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbG9jYXRpb24gb2YgdGhlIFNESyBpcyB2YWxpZCBhbmQgaWYgaXQgaXMsIGdyYWIgdGhlIFNESyBBUEkgdmVyc2lvbgotICAgICAqIGZyb20gdGhlIFNESy4KLSAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBsb2NhdGlvbiBpcyBub3QgY29ycmVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTZGtMb2NhdGlvbkFuZElkKCkgewotICAgICAgICBpZiAobU9zU2RrTG9jYXRpb24gPT0gbnVsbCB8fCBtT3NTZGtMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBkaXNwbGF5RXJyb3IoTWVzc2FnZXMuRGlhbG9nX1RpdGxlX1NES19Mb2NhdGlvbiwgTWVzc2FnZXMuU0RLX05vdF9TZXR1cCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hlY2tTZGtMb2NhdGlvbkFuZElkKG1Pc1Nka0xvY2F0aW9uLCBuZXcgQ2hlY2tTZGtFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcihNZXNzYWdlcy5EaWFsb2dfVGl0bGVfU0RLX0xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5FcnJvcl9DaGVja19QcmVmcywgbWVzc2FnZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlXYXJuaW5nKE1lc3NhZ2VzLkRpYWxvZ19UaXRsZV9TREtfTG9jYXRpb24sIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHNkayBsb2NhdGlvbiBhbmQgaWQgY2hlY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3NTZGtMb2NhdGlvbiBUaGUgc2RrIGRpcmVjdG9yeSwgYW4gT1MgcGF0aC4KLSAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIEFuIGNoZWNrU2RrRXJyb3JIYW5kbGVyIHRoYXQgY2FuIGRpc3BsYXkgYSB3YXJuaW5nIG9yIGFuIGVycm9yLgotICAgICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG9yIHRoZSByZXN1bHQgZnJvbSB0aGUgZXJyb3JIYW5kbGVyIGludm9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tTZGtMb2NhdGlvbkFuZElkKFN0cmluZyBvc1Nka0xvY2F0aW9uLCBDaGVja1Nka0Vycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKLSAgICAgICAgaWYgKG9zU2RrTG9jYXRpb24uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBvc1Nka0xvY2F0aW9uID0gb3NTZGtMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBvc1Nka0ZvbGRlciA9IG5ldyBGaWxlKG9zU2RrTG9jYXRpb24pOwotICAgICAgICBpZiAob3NTZGtGb2xkZXIuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5Db3VsZF9Ob3RfRmluZF9Gb2xkZXIsIG9zU2RrTG9jYXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBvc1Rvb2xzID0gb3NTZGtMb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfRk9MREVSOwotICAgICAgICBGaWxlIHRvb2xzRm9sZGVyID0gbmV3IEZpbGUob3NUb29scyk7Ci0gICAgICAgIGlmICh0b29sc0ZvbGRlci5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkNvdWxkX05vdF9GaW5kX0ZvbGRlcl9Jbl9TREssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZEX1RPT0xTLCBvc1Nka0xvY2F0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGUgcGF0aCB0byB2YXJpb3VzIHRvb2xzIHdlIHVzZQotICAgICAgICBTdHJpbmdbXSBmaWxlc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgIG9zU2RrTG9jYXRpb24gKyBnZXRPc1JlbGF0aXZlQWRiKCksCi0gICAgICAgICAgICAgICAgb3NTZGtMb2NhdGlvbiArIGdldE9zUmVsYXRpdmVFbXVsYXRvcigpCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlc1RvQ2hlY2spIHsKLSAgICAgICAgICAgIGlmIChjaGVja0ZpbGUoZmlsZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQ291bGRfTm90X0ZpbmQsIGZpbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBTREsgYnVpbGQgaWQvdmVyc2lvbiBhbmQgdGhlIHBsdWdpbiB2ZXJzaW9uLgotICAgICAgICByZXR1cm4gVmVyc2lvbkNoZWNrLmNoZWNrVmVyc2lvbihvc1Nka0xvY2F0aW9uLCBlcnJvckhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHBhdGggcmVmZXJlbmNlIGEgdmFsaWQgZXhpc3RpbmcgZmlsZS4KLSAgICAgKiBAcGFyYW0gb3NQYXRoIHRoZSBvcyBwYXRoIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzLCBpbiBmYWN0LCBhIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZShTdHJpbmcgb3NQYXRoKSB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG9zUGF0aCk7Ci0gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgam9iIHRoYW4gY2FuIHBpbmcgdGhlIHVzYWdlIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEpvYiBjcmVhdGVQaW5nVXNhZ2VTZXJ2ZXJKb2IoKSB7Ci0gICAgICAgIC8vIEluIG9yZGVyIHRvIG5vdCBibG9jayB0aGUgcGx1Z2luIGxvYWRpbmcsIHNvIHdlIHNwYXduIGFub3RoZXIgdGhyZWFkLgotICAgICAgICBKb2Igam9iID0gbmV3IEpvYigiQW5kcm9pZCBTREsgUGluZyIpIHsgIC8vIEpvYiBuYW1lLCB2aXNpYmxlIGluIHByb2dyZXNzIHZpZXcKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpbmdVc2FnZVNlcnZlcigpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKHQsICJwaW5nVXNhZ2VTZXJ2ZXIgZmFpbGVkIik7ICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaW5nVXNhZ2VTZXJ2ZXIgZmFpbGVkIiwgdCk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiBqb2I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBTREsgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZVNka0NvbnRlbnQoKSB7Ci0gICAgICAgIC8vIFBlcmZvcm0gdGhlIHVwZGF0ZSBpbiBhIHRocmVhZCAoaGVyZSBhbiBFY2xpcHNlIHJ1bnRpbWUgam9iKQotICAgICAgICAvLyBzaW5jZSB0aGlzIHNob3VsZCBuZXZlciBibG9jayB0aGUgY2FsbGVyIChlc3BlY2lhbGx5IHRoZSBzdGFydCBtZXRob2QpCi0gICAgICAgIEpvYiBqb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLkFkdFBsdWdpbl9BbmRyb2lkX1NES19Db250ZW50X0xvYWRlcikgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2RrSXNMb2FkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuIEFuZHJvaWQgU0RLIGlzIGFscmVhZHkgYmVpbmcgbG9hZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVNka0lzTG9hZGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3ViTW9uaXRvciBwcm9ncmVzcyA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0aWFsaXplIFNESyBNYW5hZ2VyIiwgMTAwKTsKLQotICAgICAgICAgICAgICAgICAgICBTZGsgc2RrID0gU2RrLmxvYWRTZGsobU9zU2RrTG9jYXRpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZGsgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zZXRUYXNrTmFtZShNZXNzYWdlcy5BZHRQbHVnaW5fUGFyc2luZ19SZXNvdXJjZXMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQW5kcm9pZFRhcmdldFtdIHRhcmdldHMgPSBzZGsuZ2V0VGFyZ2V0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG4gPSB0YXJnZXRzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHJlc3Qgb2YgdGhlIHRhcmdldHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIG9uLWRlbWFuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IDYwIC8gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IHRhcmdldHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViTW9uaXRvciBwMiA9IHByb2dyZXNzLm5ld0NoaWxkKHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBBbmRyb2lkVGFyZ2V0UGFyc2VyKHRhcmdldCkucnVuKHAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRDb2RlKCkgIT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChnZXRTZGtMb2NrT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2RrSXNMb2FkZWQgPSBMb2FkU3RhdHVzLkZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zdExvYWRQcm9qZWN0c1RvUmVzb2x2ZS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChnZXRTZGtMb2NrT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2RrSXNMb2FkZWQgPSBMb2FkU3RhdHVzLkxPQURFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnNldFRhc2tOYW1lKCJDaGVjayBQcm9qZWN0cyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJSmF2YVByb2plY3QgamF2YVByb2plY3QgOiBtUG9zdExvYWRQcm9qZWN0c1RvUmVzb2x2ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChqYXZhUHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIHdpdGggdGhpcyBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3N0TG9hZFByb2plY3RzVG9SZXNvbHZlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgY2hlY2tpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbWV0aG9kIG1vZGlmaWVzIHRoZSBsaXN0IChpdCByZW1vdmVzIHRoZSBwcm9qZWN0IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBuZWVkIHRvIGJlIHJlc29sdmVkIGFnYWluKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5jaGVja1Byb2plY3RzQ2FjaGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3N0TG9hZFByb2plY3RzVG9DaGVjayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKG1Qb3N0TG9hZFByb2plY3RzVG9DaGVjayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcHJvamVjdCB0aGF0IG5lZWRzIHJlY29tcGlsaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdFtdIGFycmF5ID0gbGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElKYXZhUHJvamVjdFtsaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci51cGRhdGVQcm9qZWN0cyhhcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLndvcmtlZCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VGFza05hbWUoIlJlZnJlc2ggVUkiKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0V29ya1JlbWFpbmluZyhtVGFyZ2V0Q2hhbmdlTGlzdGVuZXJzLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGxpc3QgYmVmb3JlIGl0ZXJhdGluZywgdG8gYXZvaWQgQ29uY3VycmVudCBNb2RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PElUYXJnZXRDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdDxJVGFyZ2V0Q2hhbmdlTGlzdGVuZXI+KW1UYXJnZXRDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3ViTW9uaXRvciBwcm9ncmVzczIgPSBwcm9ncmVzczsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uVGFyZ2V0c0xvYWRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRmFpbGVkIHRvIHVwZGF0ZSBhIFRhcmdldENoYW5nZUxpc3RlbmVyLiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MyLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKHQsICJVbmtub3duIGV4Y2VwdGlvbiBpbiBwYXJzZVNka0NvbnRlbnQuIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVNka0NvbnRlbnQgZmFpbGVkIiwgdCk7ICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbVNka0lzTG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBqb2Iuc2V0UHJpb3JpdHkoSm9iLkJVSUxEKTsgLy8gYnVpbGQgam9icyBhcmUgcnVuIGFmdGVyIG90aGVyIGludGVyYWN0aXZlIGpvYnMKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIGdsb2JhbCBhbmRyb2lkIGNvbnNvbGUgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnNvbGUgZ2V0QW5kcm9pZENvbnNvbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQW5kcm9pZENvbnNvbGU7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0gTWV0aG9kcyBmb3IgRWRpdG9ycyAtLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVkaXRvcnMoKSB7Ci0gICAgICAgIHNBbmRyb2lkTG9nb0Rlc2MgPSBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgIi9pY29ucy9hbmRyb2lkLnBuZyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNBbmRyb2lkTG9nbyA9IHNBbmRyb2lkTG9nb0Rlc2MuY3JlYXRlSW1hZ2UoKTsKLQotICAgICAgICAvLyBBZGQgYSByZXNvdXJjZSBsaXN0ZW5lciB0byBoYW5kbGUgY29tcGlsZWQgcmVzb3VyY2VzLgotICAgICAgICBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBtUmVzb3VyY2VNb25pdG9yID0gUmVzb3VyY2VNb25pdG9yLnN0YXJ0TW9uaXRvcmluZyh3cyk7Ci0KLSAgICAgICAgaWYgKG1SZXNvdXJjZU1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXR1cERlZmF1bHRFZGl0b3IobVJlc291cmNlTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLnNldHVwKG1SZXNvdXJjZU1vbml0b3IpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICBsb2codCwgIlJlc291cmNlTWFuYWdlci5zZXR1cCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkFic3RyYWN0VUlQbHVnaW48L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgPGNvZGU+UGx1Z2luPC9jb2RlPgotICAgICAqIG1ldGhvZCBzYXZlcyB0aGlzIHBsdWctaW4ncyBwcmVmZXJlbmNlIGFuZCBkaWFsb2cgc3RvcmVzIGFuZCBzaHV0cyBkb3duCi0gICAgICogaXRzIGltYWdlIHJlZ2lzdHJ5IChpZiB0aGV5IGFyZSBpbiB1c2UpLiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcwotICAgICAqIG1ldGhvZCwgYnV0IG11c3Qgc2VuZCBzdXBlciA8Yj5sYXN0PC9iPi4gQSB0cnktZmluYWxseSBzdGF0ZW1lbnQgc2hvdWxkCi0gICAgICogYmUgdXNlZCB3aGVyZSBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgPGNvZGU+c3VwZXIuc2h1dGRvd24oKTwvY29kZT4gaXMKLSAgICAgKiBhbHdheXMgZG9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wRWRpdG9ycygpIHsKLSAgICAgICAgc0FuZHJvaWRMb2dvLmRpc3Bvc2UoKTsKLQotICAgICAgICBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLkRpc3Bvc2UoKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHJlc291cmNlIGxpc3RlbmVyIHRoYXQgaGFuZGxlcyBjb21waWxlZCByZXNvdXJjZXMuCi0gICAgICAgIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIFJlc291cmNlTW9uaXRvci5zdG9wTW9uaXRvcmluZyh3cyk7Ci0KLSAgICAgICAgbVJlZC5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJbWFnZSBmb3IgdGhlIHNtYWxsIEFuZHJvaWQgbG9nby4KLSAgICAgKgotICAgICAqIENhbGxlcnMgc2hvdWxkIG5vdCBkaXNwb3NlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0QW5kcm9pZExvZ28oKSB7Ci0gICAgICAgIHJldHVybiBzQW5kcm9pZExvZ287Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGxpbmsgSW1hZ2VEZXNjcmlwdG9yfSBmb3IgdGhlIHNtYWxsIEFuZHJvaWQgbG9nby4KLSAgICAgKgotICAgICAqIENhbGxlcnMgc2hvdWxkIG5vdCBkaXNwb3NlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEFuZHJvaWRMb2dvRGVzYygpIHsKLSAgICAgICAgcmV0dXJuIHNBbmRyb2lkTG9nb0Rlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNb25pdG9yIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VNb25pdG9yIGdldFJlc291cmNlTW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1SZXNvdXJjZU1vbml0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgZWRpdG9yIHRvIHJlZ2lzdGVyIGRlZmF1bHQgZWRpdG9ycyBmb3IgcmVzb3VyY2UgZmlsZXMgd2hlbiBuZWVkZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUge0BsaW5rIEFkdFBsdWdpbn0gZHVyaW5nIGluaXRpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgVGhlIG1haW4gUmVzb3VyY2UgTW9uaXRvciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXBEZWZhdWx0RWRpdG9yKFJlc291cmNlTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIG1vbml0b3IuYWRkRmlsZUxpc3RlbmVyKG5ldyBJRmlsZUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9FRElUT1IgPSAidW5rbm93bi1lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAqIFNlbnQgd2hlbiBhIGZpbGUgY2hhbmdlZC4KLSAgICAgICAgICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgY2hhbmdlZC4KLSAgICAgICAgICAgICAqIEBwYXJhbSBtYXJrZXJEZWx0YXMgVGhlIG1hcmtlciBkZWx0YXMgZm9yIHRoZSBmaWxlLgotICAgICAgICAgICAgICogQHBhcmFtIGtpbmQgVGhlIGNoYW5nZSBraW5kLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICAgICAqIHtAbGluayBJUmVzb3VyY2VEZWx0YSNhY2NlcHQoSVJlc291cmNlRGVsdGFWaXNpdG9yKX0KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAc2VlIElGaWxlTGlzdGVuZXIjZmlsZUNoYW5nZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzLCBpbnQga2luZCkgewotICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9YTUwuZXF1YWxzKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVzb3VyY2VzIGZpbGVzIG11c3QgaGF2ZSBhIGZpbGUgcGF0aCBzaW1pbGFyIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIHByb2plY3QvcmVzLy4uLi8qLnhtbAotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzdWIgZm9sZGVycywgc28gdGhlIHNlZ21lbnQgY291bnQgbXVzdCBiZSA0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgcmVzIGZvbGRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWdtZW50ID0gZmlsZS5nZXRGdWxsUGF0aCgpLnNlZ21lbnQoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5lcXVhbHNJZ25vcmVDYXNlKFNka0NvbnN0YW50cy5GRF9SRVNPVVJDRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGluc2lkZSBhIHJlcy8gZm9sZGVyLCBnZXQgdGhlIGFjdHVhbCBSZXNvdXJjZUZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3RSZXNvdXJjZXMoZmlsZS5nZXRQcm9qZWN0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gaW1wb3J0aW5nIG9sZCBBbmRyb2lkIHByb2plY3RzIGluIEVjbGlwc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGxhY2sgdGhlIGNvbnRhaW5lciAocHJvYmFibHkgYmVjYXVzZSByZXNvdXJjZXMgZmFpbCB0byBidWlsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKElTdGF0dXMuSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UHJvamVjdFJlc291cmNlcyBmYWlsZWQgZm9yIHBhdGggJTEkcyBpbiBwcm9qZWN0ICUyJHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gcmVzb3VyY2VzLmdldFJlc291cmNlRm9sZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUZvbGRlcilmaWxlLmdldFBhcmVudCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VBZGRlZChmaWxlLCByZXNGb2xkZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ2hhbmdlZChmaWxlLCByZXNGb2xkZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZXMgZm9sZGVyIGlzIG51bGwsIHRoaXMgbWVhbnMgdGhlIG5hbWUgaXMgaW52YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHJlbW92ZSB3aGF0ZXZlciBhbmRyb2lkIGVkaXRvcnMgdGhhdCB3YXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBkZWZhdWx0IGVkaXRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWRpdG9ySWQgPSBkZXNjLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJZC5zdGFydHNXaXRoKEFuZHJvaWRDb25zdGFudHMuRURJVE9SU19OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZGVmYXVsdCBlZGl0b3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc291cmNlQWRkZWQoSUZpbGUgZmlsZSwgUmVzb3VyY2VGb2xkZXJUeXBlIHR5cGUpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgZWRpdG9yIGJhc2VkIG9uIHRoZSB0eXBlLgotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgTGF5b3V0RWRpdG9yLklEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUmVzb3VyY2VGb2xkZXJUeXBlLkRSQVdBQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IFJlc291cmNlRm9sZGVyVHlwZS5WQUxVRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgUmVzb3VyY2VzRWRpdG9yLklEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUmVzb3VyY2VGb2xkZXJUeXBlLk1FTlUpIHsKLSAgICAgICAgICAgICAgICAgICAgSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgTWVudUVkaXRvci5JRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFJlc291cmNlRm9sZGVyVHlwZS5YTUwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEVkaXRvci5jYW5IYW5kbGVGaWxlKGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlLCBYbWxFZGl0b3IuSUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGEgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIGxhdGVyIGlmIHRoZSBYTUwgY2FuIGJlIGhhbmRsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgcW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5LTk9XTl9FRElUT1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNldFBlcnNpc3RlbnRQcm9wZXJ0eShxbmFtZSwgIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElGaWxlIGZpbGUsIFJlc291cmNlRm9sZGVyVHlwZSB0eXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUmVzb3VyY2VGb2xkZXJUeXBlLlhNTCkgewotICAgICAgICAgICAgICAgICAgICBJRWRpdG9yRGVzY3JpcHRvciBlZCA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWQgPT0gbnVsbCB8fCBlZC5nZXRJZCgpICE9IFhtbEVkaXRvci5JRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBxbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTktOT1dOX0VESVRPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AgPSBmaWxlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShxbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmIFhtbEVkaXRvci5jYW5IYW5kbGVGaWxlKGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSAmIHNldCBlZGl0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zZXRQZXJzaXN0ZW50UHJvcGVydHkocW5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IG9sZEVkaXRvciA9IHBhZ2UuZmluZEVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEVkaXRvciAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlQcm9tcHQoIkFuZHJvaWQgWE1MIEVkaXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlRoZSBmaWxlIHlvdSBqdXN0IHNhdmVkIGFzIGJlZW4gcmVjb2duaXplZCBhcyBhIGZpbGUgdGhhdCBjb3VsZCBiZSBiZXR0ZXIgaGFuZGxlZCB1c2luZyB0aGUgQW5kcm9pZCBYTUwgRWRpdG9yLiBEbyB5b3Ugd2FudCB0byBlZGl0ICclMSRzJyB1c2luZyB0aGUgQW5kcm9pZCBYTUwgZWRpdG9yIGluc3RlYWQ/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEZ1bGxQYXRoKCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFLnNldERlZmF1bHRFZGl0b3IoZmlsZSwgWG1sRWRpdG9yLklEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IG5ld0VkaXRvciA9IHBhZ2Uub3BlbkVkaXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRWRpdG9yLklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKiBhY3RpdmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZS5NQVRDSF9OT05FKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0VkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5jbG9zZUVkaXRvcihvbGRFZGl0b3IsIHRydWUgLyogc2F2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0UGVyc2lzdGVudFByb3BlcnR5IG9yIHBhZ2Uub3BlbkVkaXRvciBtYXkgaGF2ZSBmYWlsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSwgSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IHtAbGluayBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXJ9IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBuZXcgU0RLIGlzIGxvYWRlZCwgb3Igd2hlbgotICAgICAqIGEgcHJvamVjdCBoYXMgaXRzIHRhcmdldCBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFRhcmdldExpc3RlbmVyKElUYXJnZXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGFyZ2V0Q2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyB7QGxpbmsgSVRhcmdldENoYW5nZUxpc3RlbmVyfS4KLSAgICAgKiBAc2VlICNhZGRUYXJnZXRMaXN0ZW5lcihJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVGFyZ2V0TGlzdGVuZXIoSVRhcmdldENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1UYXJnZXRDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFsbCB0aGUge0BsaW5rIElUYXJnZXRDaGFuZ2VMaXN0ZW5lcn0gdGhhdCBhIHRhcmdldCBoYXMgY2hhbmdlZCBmb3IgYSBnaXZlbiBwcm9qZWN0LgotICAgICAqIDxwLz5Pbmx5IGVkaXRvcnMgcmVsYXRlZCB0byB0aGF0IHByb2plY3Qgc2hvdWxkIHJlbG9hZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXRMaXN0ZW5lcihmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SVRhcmdldENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgKExpc3Q8SVRhcmdldENoYW5nZUxpc3RlbmVyPiltVGFyZ2V0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0KLSAgICAgICAgQWR0UGx1Z2luLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGZvciAoSVRhcmdldENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblByb2plY3RUYXJnZXRDaGFuZ2UocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJGYWlsZWQgdG8gdXBkYXRlIGEgVGFyZ2V0Q2hhbmdlTGlzdGVuZXIuIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE91dHB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW4ubUFuZHJvaWRDb25zb2xlRXJyb3JTdHJlYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGluZ3MgdGhlIHVzYWdlIHN0YXJ0IHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGluZ1VzYWdlU2VydmVyKCkgewotICAgICAgICAvLyBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbgotICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IChTdHJpbmcpIGdldEJ1bmRsZSgpLmdldEhlYWRlcnMoKS5nZXQoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24odmVyc2lvblN0cmluZyk7Ci0KLSAgICAgICAgdmVyc2lvblN0cmluZyA9IFN0cmluZy5mb3JtYXQoIiUxJGQuJTIkZC4lMyRkIiwgdmVyc2lvbi5nZXRNYWpvcigpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdmVyc2lvbi5nZXRNaW5vcigpLCB2ZXJzaW9uLmdldE1pY3JvKCkpOwotCi0gICAgICAgIFNka1N0YXRzU2VydmljZS5waW5nKCJhZHQiLCB2ZXJzaW9uU3RyaW5nLCBnZXREaXNwbGF5KCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwYXJzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIFNESyBhbmQgdXBkYXRlcyBvcGVuZWQgcHJvamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVwYXJzZVNkaygpIHsKLSAgICAgICAgLy8gYWRkIGFsbCB0aGUgb3BlbmVkIEFuZHJvaWQgcHJvamVjdHMgdG8gdGhlIGxpc3Qgb2YgcHJvamVjdHMgdG8gYmUgdXBkYXRlZAotICAgICAgICAvLyBhZnRlciB0aGUgU0RLIGlzIHJlbG9hZGVkCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgdG8gcmVmcmVzaC4KLSAgICAgICAgICAgIElKYXZhUHJvamVjdFtdIGFuZHJvaWRQcm9qZWN0cyA9IEJhc2VQcm9qZWN0SGVscGVyLmdldEFuZHJvaWRQcm9qZWN0cygpOwotICAgICAgICAgICAgbVBvc3RMb2FkUHJvamVjdHNUb1Jlc29sdmUuYWRkQWxsKEFycmF5cy5hc0xpc3QoYW5kcm9pZFByb2plY3RzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSB0aGUgU0RLIHJlc291cmNlcyBhdCB0aGUgbmV3IGxvY2F0aW9uCi0gICAgICAgIHBhcnNlU2RrQ29udGVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBtZXNzYWdlcywgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIHN0cmVhbSB0byB3cml0ZSB0bwotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBhc3NvY2lhdGVkIHRvIHRoZSBtZXNzYWdlLiBDYW4gYmUgbnVsbAotICAgICAqIEBwYXJhbSBvYmplY3RzIFRoZSBvYmplY3RzIHRvIHByaW50IHRocm91Z2ggdGhlaXIgdG9TdHJpbmcoKSBtZXRob2QgKG9yIGRpcmVjdGx5IGZvcgotICAgICAqIHtAbGluayBTdHJpbmd9IG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludFRvU3RyZWFtKE1lc3NhZ2VDb25zb2xlU3RyZWFtIHN0cmVhbSwgU3RyaW5nIHRhZywKLSAgICAgICAgICAgIE9iamVjdC4uLiBvYmplY3RzKSB7Ci0gICAgICAgIFN0cmluZyBkYXRlVGFnID0gZ2V0TWVzc2FnZVRhZyh0YWcpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN0cmVhbS5wcmludChkYXRlVGFnKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigoU3RyaW5nKW9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbS5wcmludGxuKG9iai50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudCBkYXRlL3RpbWUsIGFuZCB0aGUgdGFnCi0gICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGFzc29jaWF0ZWQgdG8gdGhlIG1lc3NhZ2UuIENhbiBiZSBudWxsCi0gICAgICogQHJldHVybiBUaGUgZGF0ZVRhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VUYWcoU3RyaW5nIHRhZykgewotICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkNvbnNvbGVfRGF0ZV9UYWcsIGMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQ29uc29sZV9EYXRhX1Byb2plY3RfVGFnLCBjLCB0YWcpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L0FuZHJvaWRDb25zdGFudHMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9BbmRyb2lkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWVlM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L0FuZHJvaWRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbiBjbGFzcy48YnI+Ci0gKiA8YnI+Ci0gKiBNb3N0IGNvbnN0YW50cyBoYXZlIGEgcHJlZml4IGRlZmluaW5nIHRoZSBjb250ZW50LgotICogPHVsPgotICogPGxpPjxjb2RlPldTXzwvY29kZT4gV29ya3NwYWNlIHBhdGggY29uc3RhbnQuIFRob3NlIGFyZSBhYnNvbHV0ZSBwYXRocywKLSAqIGZyb20gdGhlIHByb2plY3Qgcm9vdC48L2xpPgotICogPGxpPjxjb2RlPk9TXzwvY29kZT4gT1MgcGF0aCBjb25zdGFudC4gVGhlc2UgcGF0aHMgYXJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLjwvbGk+Ci0gKiA8bGk+PGNvZGU+Rk5fPC9jb2RlPiBGaWxlIG5hbWUgY29uc3RhbnQuPC9saT4KLSAqIDxsaT48Y29kZT5GRF88L2NvZGU+IEZvbGRlciBuYW1lIGNvbnN0YW50LjwvbGk+Ci0gKiA8bGk+PGNvZGU+TUFSS0VSXzwvY29kZT4gUmVzb3VyY2UgTWFya2VyIElkcyBjb25zdGFudC48L2xpPgotICogPGxpPjxjb2RlPkVYVF88L2NvZGU+IEZpbGUgZXh0ZW5zaW9uIGNvbnN0YW50LiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgYSBkb3QuPC9saT4KLSAqIDxsaT48Y29kZT5ET1RfPC9jb2RlPiBGaWxlIGV4dGVuc2lvbiBjb25zdGFudC4gVGhpcyBzdGFydCB3aXRoIGEgZG90LjwvbGk+Ci0gKiA8bGk+PGNvZGU+UkVfPC9jb2RlPiBSZWdleHAgY29uc3RhbnQuPC9saT4KLSAqIDxsaT48Y29kZT5OU188L2NvZGU+IE5hbWVzcGFjZSBjb25zdGFudC48L2xpPgotICogPGxpPjxjb2RlPkNMQVNTXzwvY29kZT4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuPC9saT4KLSAqIDwvdWw+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZENvbnN0YW50cyB7Ci0gICAgLyoqCi0gICAgICogVGhlIG9sZCBFZGl0b3JzIFBsdWdpbiBJRC4gSXQgaXMgc3RpbGwgdXNlZCBpbiBzb21lIHBsYWNlcyBmb3IgY29tcGF0aWJpbGl0eS4KLSAgICAgKiBQbGVhc2UgZG8gbm90IHVzZSBmb3IgbmV3IGZlYXR1cmVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUlNfTkFNRVNQQUNFID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMiOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgLyoqIE5hdHVyZSBvZiBhbmRyb2lkIHByb2plY3RzICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFUVVJFID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFNlcGFyYXRvciBmb3Igd29ya3NwYWNlIHBhdGgsIGkuZS4gIi8iLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTX1NFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBTZXBhcmF0b3IgY2hhcmFjdGVyIGZvciB3b3Jrc3BhY2UgcGF0aCwgaS5lLiAnLycuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFdTX1NFUF9DSEFSID0gJy8nOwotCi0gICAgLyoqIEV4dGVuc2lvbiBvZiB0aGUgQXBwbGljYXRpb24gcGFja2FnZSBGaWxlcywgaS5lLiAiYXBrIi4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFRfQU5EUk9JRF9QQUNLQUdFID0gImFwayI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRXh0ZW5zaW9uIG9mIGphdmEgZmlsZXMsIGkuZS4gImphdmEiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUX0pBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRXh0ZW5zaW9uIG9mIGNvbXBpbGVkIGphdmEgZmlsZXMsIGkuZS4gImNsYXNzIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRXh0ZW5zaW9uIG9mIHhtbCBmaWxlcywgaS5lLiAieG1sIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVF9YTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBFeHRlbnNpb24gb2YgamFyIGZpbGVzLCBpLmUuICJqYXIiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUX0pBUiA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIEV4dGVuc2lvbiBvZiBhaWRsIGZpbGVzLCBpLmUuICJhaWRsIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVF9BSURMID0gImFpZGwiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIEV4dGVuc2lvbiBvZiBuYXRpdmUgbGlicmFyaWVzLCBpLmUuICJzbyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFRfTkFUSVZFX0xJQiA9ICJzbyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBET1QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBEb3QtRXh0ZW5zaW9uIG9mIHRoZSBBcHBsaWNhdGlvbiBwYWNrYWdlIEZpbGVzLCBpLmUuICIuYXBrIi4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfQU5EUk9JRF9QQUNLQUdFID0gRE9UICsgRVhUX0FORFJPSURfUEFDS0FHRTsKLSAgICAvKiogRG90LUV4dGVuc2lvbiBvZiBqYXZhIGZpbGVzLCBpLmUuICIuamF2YSIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfSkFWQSA9IERPVCArIEVYVF9KQVZBOwotICAgIC8qKiBEb3QtRXh0ZW5zaW9uIG9mIGNvbXBpbGVkIGphdmEgZmlsZXMsIGkuZS4gIi5jbGFzcyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfQ0xBU1MgPSBET1QgKyBFWFRfQ0xBU1M7Ci0gICAgLyoqIERvdC1FeHRlbnNpb24gb2YgeG1sIGZpbGVzLCBpLmUuICIueG1sIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVF9YTUwgPSBET1QgKyBFWFRfWE1MOwotICAgIC8qKiBEb3QtRXh0ZW5zaW9uIG9mIGphciBmaWxlcywgaS5lLiAiLmphciIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfSkFSID0gRE9UICsgRVhUX0pBUjsKLSAgICAvKiogRG90LUV4dGVuc2lvbiBvZiBhaWRsIGZpbGVzLCBpLmUuICIuYWlkbCIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfQUlETCA9IERPVCArIEVYVF9BSURMOwotCi0gICAgLyoqIE5hbWUgb2YgdGhlIG1hbmlmZXN0IGZpbGUsIGkuZS4gIkFuZHJvaWRNYW5pZmVzdC54bWwiLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX0FORFJPSURfTUFOSUZFU1QgPSAiQW5kcm9pZE1hbmlmZXN0LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBOYW1lIG9mIHRoZSBhbmRyb2lkIHNvdXJjZXMgZGlyZWN0b3J5ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkRfQU5EUk9JRF9TT1VSQ0VTID0gInNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUmVzb3VyY2UgamF2YSBjbGFzcyAgZmlsZW5hbWUsIGkuZS4gIlIuamF2YSIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGTl9SRVNPVVJDRV9DTEFTUyA9ICJSLmphdmEiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIFJlc291cmNlIGNsYXNzIGZpbGUgIGZpbGVuYW1lLCBpLmUuICJSLmNsYXNzIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0NPTVBJTEVEX1JFU09VUkNFX0NMQVNTID0gIlIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIE1hbmlmZXN0IGphdmEgY2xhc3MgZmlsZW5hbWUsIGkuZS4gIk1hbmlmZXN0LmphdmEiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fTUFOSUZFU1RfQ0xBU1MgPSAiTWFuaWZlc3QuamF2YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGV4IGNvbnZlcnNpb24gb3V0cHV0IGZpbG5hbWUsIGkuZS4gImNsYXNzZXMuZGV4IiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0NMQVNTRVNfREVYID0gImNsYXNzZXMuZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBUZW1wb3JhcnkgcGFja2FnZWQgcmVzb3VyY2VzIGZpbGUgbmFtZSwgaS5lLiAicmVzb3VyY2VzLmFwXyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGTl9SRVNPVVJDRVNfQVBfID0gInJlc291cmNlcy5hcF8iOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIFRlbXBvcmFyeSBwYWNrYWdlZCByZXNvdXJjZXMgZmlsZSBuYW1lIGZvciBhIHNwZWNpZmljIHNldCBvZiBjb25maWd1cmF0aW9uICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fUkVTT1VSQ0VTX1NfQVBfID0gInJlc291cmNlcy0lcy5hcF8iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFBBVFRFUk5fUkVTT1VSQ0VTX1NfQVBfID0KLSAgICAgICAgUGF0dGVybi5jb21waWxlKCJyZXNvdXJjZXMtLipcXC5hcF8iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGTl9UUkFDRVZJRVcgPQotICAgICAgICAoU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJ0cmFjZXZpZXcuZXhlIiA6ICJ0cmFjZXZpZXciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSB3b3Jrc3BhY2Ugcm9vdCwgaS5lLiAiLyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU19ST09UID0gV1NfU0VQOwotCi0gICAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciwgZWcgIi9yZXMiLjxicj4gVGhpcyBpcyBhIHdvcmtzcGFjZSBwYXRoLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTX1JFU09VUkNFUyA9IFdTX1NFUCArIFNka0NvbnN0YW50cy5GRF9SRVNPVVJDRVM7Ci0KLSAgICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyLCBlZyAiL2Fzc2V0cyIuPGJyPiBUaGlzIGlzIGEgd29ya3NwYWNlIHBhdGguICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NfQVNTRVRTID0gV1NfU0VQICsgU2RrQ29uc3RhbnRzLkZEX0FTU0VUUzsKLQotICAgIC8qKiBMZWFmIG9mIHRoZSBqYXZhRG9jIGZvbGRlci4gRG9lcyBub3Qgc3RhcnQgd2l0aCBhIHNlcGFyYXRvci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU19KQVZBRE9DX0ZPTERFUl9MRUFGID0gU2RrQ29uc3RhbnRzLkZEX0RPQ1MgKyAiLyIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBTZGtDb25zdGFudHMuRkRfRE9DU19SRUZFUkVOQ0U7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgc2FtcGxlcyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHNkayBmb2xkZXIuCi0gICAgICogIFRoaXMgaXMgYW4gT1MgcGF0aCwgZW5kaW5nIHdpdGggYSBzZXBhcmF0b3IuCi0gICAgICogIEZJWE1FOiByZW1vdmUgb25jZSB0aGUgTlBXIGlzIGZpeGVkLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1NES19TQU1QTEVTX0ZPTERFUiA9IFNka0NvbnN0YW50cy5GRF9TQU1QTEVTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRV9ET1QgPSAiXFwuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBSZWdleHAgZm9yIGphdmEgZXh0ZW5zaW9uLCBpLmUuICJcLmphdmEkIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFX0pBVkFfRVhUID0gIlxcLmphdmEkIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBSZWdleHAgZm9yIGFpZGwgZXh0ZW5zaW9uLCBpLmUuICJcLmFpZGwkIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFX0FJRExfRVhUID0gIlxcLmFpZGwkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIE5hbWVzcGFjZSBwYXR0ZXJuIGZvciB0aGUgY3VzdG9tIHJlc291cmNlIFhNTCwgaS5lLiAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy8lcyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19DVVNUT01fUkVTT1VSQ0VTID0gImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvJTEkcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBUaGUgb2xkIGNvbW1vbiBwbHVnLWluIElELiBQbGVhc2UgZG8gbm90IHVzZSBmb3IgbmV3IGZlYXR1cmVzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1PTl9QTFVHSU5fSUQgPSAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGFhcHQgbWFya2VyIGVycm9yIHdoZW4gcnVubmluZyB0aGUgY29tcGlsZSBjb21tYW5kICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FBUFRfQ09NUElMRSA9IENPTU1PTl9QTFVHSU5fSUQgKyAiLmFhcHRQcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGFhcHQgbWFya2VyIGVycm9yIHdoZW4gcnVubmluZyB0aGUgcGFja2FnZSBjb21tYW5kICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FBUFRfUEFDS0FHRSA9IENPTU1PTl9QTFVHSU5fSUQgKyAiLmFhcHQyUHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBYTUwgbWFya2VyIGVycm9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUktFUl9YTUwgPSBDT01NT05fUExVR0lOX0lEICsgIi54bWxQcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGFpZGwgbWFya2VyIGVycm9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUktFUl9BSURMID0gQ09NTU9OX1BMVUdJTl9JRCArICIuYWlkbFByb2JsZW0iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogYW5kcm9pZCBtYXJrZXIgZXJyb3IgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVJLRVJfQU5EUk9JRCA9IENPTU1PTl9QTFVHSU5fSUQgKyAiLmFuZHJvaWRQcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIE5hbWUgZm9yIHRoZSAidHlwZSIgbWFya2VyIGF0dHJpYnV0ZSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUktFUl9BVFRSX1RZUEUgPSAiYW5kcm9pZC50eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBOYW1lIGZvciB0aGUgImNsYXNzIiBtYXJrZXIgYXR0cmlidXRlICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FUVFJfQ0xBU1MgPSAiYW5kcm9pZC5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogYWN0aXZpdHkgdmFsdWUgZm9yIG1hcmtlciBhdHRyaWJ1dGUgInR5cGUiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FUVFJfVFlQRV9BQ1RJVklUWSA9ICJhY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogc2VydmljZSB2YWx1ZSBmb3IgbWFya2VyIGF0dHJpYnV0ZSAidHlwZSIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVJLRVJfQVRUUl9UWVBFX1NFUlZJQ0UgPSAic2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogcmVjZWl2ZXIgdmFsdWUgZm9yIG1hcmtlciBhdHRyaWJ1dGUgInR5cGUiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FUVFJfVFlQRV9SRUNFSVZFUiA9ICJyZWNlaXZlciI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogcHJvdmlkZXIgdmFsdWUgZm9yIG1hcmtlciBhdHRyaWJ1dGUgInR5cGUiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFSS0VSX0FUVFJfVFlQRV9QUk9WSURFUiA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0FDVElWSVRZID0gImFuZHJvaWQuYXBwLkFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NFUlZJQ0UgPSAiYW5kcm9pZC5hcHAuU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19CUk9BRENBU1RSRUNFSVZFUiA9ICJhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ09OVEVOVFBST1ZJREVSID0gImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfSU5TVFJVTUVOVEFUSU9OID0gImFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19JTlNUUlVNRU5UQVRJT05fUlVOTkVSID0KLSAgICAgICAgImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0JVTkRMRSA9ICJhbmRyb2lkLm9zLkJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19SID0gImFuZHJvaWQuUiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19NQU5JRkVTVF9QRVJNSVNTSU9OID0gImFuZHJvaWQuTWFuaWZlc3QkcGVybWlzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19JTlRFTlQgPSAiYW5kcm9pZC5jb250ZW50LkludGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DT05URVhUID0gImFuZHJvaWQuY29udGVudC5Db250ZXh0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1ZJRVcgPSAiYW5kcm9pZC52aWV3LlZpZXciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfVklFV0dST1VQID0gImFuZHJvaWQudmlldy5WaWV3R3JvdXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTkFNRV9MQVlPVVRQQVJBTVMgPSAiTGF5b3V0UGFyYW1zIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1ZJRVdHUk9VUF9MQVlPVVRQQVJBTVMgPQotICAgICAgICBDTEFTU19WSUVXR1JPVVAgKyAiJCIgKyBDTEFTU19OQU1FX0xBWU9VVFBBUkFNUzsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfRlJBTUVMQVlPVVQgPSAiRnJhbWVMYXlvdXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRlJBTUVMQVlPVVQgPQotICAgICAgICAiYW5kcm9pZC53aWRnZXQuIiArIENMQVNTX05BTUVfRlJBTUVMQVlPVVQ7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QUkVGRVJFTkNFID0gImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfUFJFRkVSRU5DRV9TQ1JFRU4gPSAiUHJlZmVyZW5jZVNjcmVlbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QUkVGRVJFTkNFUyA9Ci0gICAgICAgICJhbmRyb2lkLnByZWZlcmVuY2UuIiArIENMQVNTX05BTUVfUFJFRkVSRU5DRV9TQ1JFRU47IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QUkVGRVJFTkNFR1JPVVAgPSAiYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VHcm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QQVJDRUxBQkxFID0gImFuZHJvaWQub3MuUGFyY2VsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0JSSURHRSA9ICJjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLkJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFByZWZlcmVkIGNvbXBpbGVyIGxldmVsLCBpLmUuICIxLjUiLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTVBJTEVSX0NPTVBMSUFOQ0VfUFJFRkVSUkVEID0gIjEuNSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIHZhbGlkIGNvbXBpbGVyIGxldmVsLCBpLmUuICIxLjUiIGFuZCAiMS42IgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gQ09NUElMRVJfQ09NUExJQU5DRSA9IHsKLSAgICAgICAgIjEuNSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIjEuNiIsIC8vJE5PTi1OTFMtMSQKLSAgICB9OwotCi0gICAgLyoqIFRoZSBiYXNlIFVSTCB3aGVyZSB0byBmaW5kIHRoZSBBbmRyb2lkIGNsYXNzICYgbWFuaWZlc3QgZG9jdW1lbnRhdGlvbiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVTSVRFX0JBU0VfVVJMID0gImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYW5kcm9pZCI7ICAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1RFU1RfUlVOTkVSID0gImFuZHJvaWQudGVzdC5ydW5uZXIiOyAvLyAkTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L01lc3NhZ2VzLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwNDZkYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBZHRQbHVnaW5fQW5kcm9pZF9TREtfQ29udGVudF9Mb2FkZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBZHRQbHVnaW5fQW5kcm9pZF9TREtfUmVzb3VyY2VfUGFyc2VyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQWR0UGx1Z2luX0ZhaWxlZF9Ub19QYXJzZV9zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQWR0UGx1Z2luX0ZhaWxlZF9Ub19TdGFydF9zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQWR0UGx1Z2luX1BhcnNpbmdfUmVzb3VyY2VzOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uc29sZV9EYXRhX1Byb2plY3RfVGFnOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uc29sZV9EYXRlX1RhZzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvdWxkX05vdF9GaW5kOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ291bGRfTm90X0ZpbmRfRm9sZGVyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ291bGRfTm90X0ZpbmRfRm9sZGVyX0luX1NESzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19UaXRsZV9TREtfTG9jYXRpb247Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9DaGVja19QcmVmczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNES19Ob3RfU2V0dXA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWZXJzaW9uQ2hlY2tfUGx1Z2luX1Rvb19PbGQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWZXJzaW9uQ2hlY2tfUGx1Z2luX1ZlcnNpb25fRmFpbGVkOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbkNoZWNrX1NES19CdWlsZF9Ub29fTG93OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbkNoZWNrX1NES19NaWxlc3RvbmVfVG9vX0xvdzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZlcnNpb25DaGVja19VbmFibGVfVG9fUGFyc2VfVmVyc2lvbl9zOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL1ZlcnNpb25DaGVjay5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL1ZlcnNpb25DaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk5ZWY5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9WZXJzaW9uQ2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Lk1lc3NhZ2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW4uQ2hlY2tTZGtFcnJvckhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIENsYXNzIGhhbmRsaW5nIHRoZSB2ZXJzaW9uIGNoZWNrIGZvciB0aGUgcGx1Z2luIHZzLiB0aGUgU0RLLjxicj4KLSAqIFRoZSBwbHVnaW4gbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgYWxsIHZlcnNpb24gb2YgdGhlIFNESy4KLSAqCi0gKiA8cC8+QW4gU0RLIGNhbiByZXF1aXJlIGEgbmV3IHZlcnNpb24gb2YgdGhlIHBsdWdpbi4KLSAqIDxwLz5UaGUgU0RLIGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoZSBtaW5pbXVtIHZlcnNpb24gZm9yIHRoZSBwbHVnaW4uIFRoaXMgZmlsZSBpcyBpbnNpZGUgdGhlCi0gKiA8Y29kZT50b29scy9saWI8L2NvZGU+IGRpcmVjdG9yeSwgYW5kIGlzIGNhbGxlZCA8Y29kZT5wbHVnaW4ucHJvcDwvY29kZT4uPGJyPgotICogSW5zaWRlIHRoYXQgdGV4dCBmaWxlLCB0aGVyZSBpcyBhIGxpbmUgaW4gdGhlIGZvcm1hdCAicGx1Z2luLnZlcnNpb249Iy4jLiMiLiBUaGlzIGlzIGNoZWNrZWQKLSAqIGFnYWluc3QgdGhlIGN1cnJlbnQgcGx1Z2luIHZlcnNpb24uPGJyPgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZlcnNpb25DaGVjayB7Ci0gICAgLyoqCi0gICAgICogUGF0dGVybiB0byBnZXQgdGhlIG1pbmltdW0gcGx1Z2luIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBTREsuIFRoaXMgaXMgcmVhZCBmcm9tCi0gICAgICogdGhlIGZpbGUgPGNvZGU+JFNESy90b29scy9saWIvcGx1Z2luLnByb3A8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BsdWdpblZlcnNpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl5wbHVnaW4udmVyc2lvbj0oXFxkKylcXC4oXFxkKylcXC4oXFxkKykuKiQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBwbHVnaW4gYW5kIHRoZSBTREsgaGF2ZSBjb21wYXRpYmxlIHZlcnNpb25zLgotICAgICAqIEBwYXJhbSBvc1Nka1BhdGggVGhlIHBhdGggdG8gdGhlIFNESwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21wYXRpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1ZlcnNpb24oU3RyaW5nIG9zU2RrUGF0aCwgQ2hlY2tTZGtFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgIEFkdFBsdWdpbiBwbHVnaW4gPSBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgb3NMaWJzID0gb3NTZGtQYXRoICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19MSUJfRk9MREVSOwotCi0gICAgICAgIC8vIGdldCB0aGUgcGx1Z2luIHByb3BlcnR5IGZpbGUsIGFuZCBncmFiIHRoZSBtaW5pbXVtIHBsdWdpbiB2ZXJzaW9uIHJlcXVpcmVkCi0gICAgICAgIC8vIHRvIHdvcmsgd2l0aCB0aGUgc2RrCi0gICAgICAgIGludCBtaW5NYWpvclZlcnNpb24gPSAtMTsKLSAgICAgICAgaW50IG1pbk1pbm9yVmVyc2lvbiA9IC0xOwotICAgICAgICBpbnQgbWluTWljcm9WZXJzaW9uID0gLTE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKG9zTGlicyArIFNka0NvbnN0YW50cy5GTl9QTFVHSU5fUFJPUCk7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHNQbHVnaW5WZXJzaW9uUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBtaW5NYWpvclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICBtaW5NaW5vclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgICAgICBtaW5NaWNyb1ZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGUgYnVpbGQgaWQgd2lsbCBiZSBudWxsLCBhbmQgdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBidWlsZGVycy4KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhlIGJ1aWxkIGlkIHdpbGwgYmUgbnVsbCwgYW5kIHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgYnVpbGRlcnMuCi0gICAgICAgIH0KLQotICAgICAgICAvLyBGYWlsZWQgdG8gZ2V0IHRoZSBtaW4gcGx1Z2luIHZlcnNpb24gbnVtYmVyPwotICAgICAgICBpZiAobWluTWFqb3JWZXJzaW9uID09IC0xIHx8IG1pbk1pbm9yVmVyc2lvbiA9PSAtMSB8fCBtaW5NaWNyb1ZlcnNpb24gPT0tMSkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlci5oYW5kbGVXYXJuaW5nKE1lc3NhZ2VzLlZlcnNpb25DaGVja19QbHVnaW5fVmVyc2lvbl9GYWlsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdCB0aGUgcGx1Z2luIG51bWJlcgotICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IChTdHJpbmcpIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRIZWFkZXJzKCkuZ2V0KAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0gICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb25TdHJpbmcpOwotCi0gICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwotICAgICAgICBpZiAodmVyc2lvbi5nZXRNYWpvcigpIDwgbWluTWFqb3JWZXJzaW9uKSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24uZ2V0TWFqb3IoKSA9PSBtaW5NYWpvclZlcnNpb24pIHsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uLmdldE1pbm9yKCkgPCBtaW5NaW5vclZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uLmdldE1pbm9yKCkgPT0gbWluTWlub3JWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24uZ2V0TWljcm8oKSA8IG1pbk1pY3JvVmVyc2lvbikgewotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWxpZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlci5oYW5kbGVXYXJuaW5nKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLlZlcnNpb25DaGVja19QbHVnaW5fVG9vX09sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5NYWpvclZlcnNpb24sIG1pbk1pbm9yVmVyc2lvbiwgbWluTWljcm9WZXJzaW9uLCB2ZXJzaW9uU3RyaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbm8gZXJyb3IhCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvQW5kcm9pZEFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvQW5kcm9pZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJjOTNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb0FuZHJvaWRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBDb252ZXJ0cyBhIHByb2plY3QgY3JlYXRlZCB3aXRoIHRoZSBhY3Rpdml0eSBjcmVhdG9yIGludG8gYW4KLSAqIEFuZHJvaWQgcHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRUb0FuZHJvaWRBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIG1TZWxlY3Rpb247Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAobVNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltU2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KSgoSUFkYXB0YWJsZSllbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5tU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvZ2dsZXMgc2FtcGxlIG5hdHVyZSBvbiBhIHByb2plY3QKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0byBoYXZlIHNhbXBsZSBuYXR1cmUgYWRkZWQgb3IgcmVtb3ZlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb252ZXJ0UHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIG5ldyBKb2IoIkNvbnZlcnQgUHJvamVjdCIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb252ZXJ0ICUxJHMgdG8gQW5kcm9pZCIsIHByb2plY3QuZ2V0TmFtZSgpKSwgNSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgYWxyZWFkeSBoYXMgdGhlIGFuZHJvaWQgbmF0dXJlLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRS5lcXVhbHMobmF0dXJlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgYmUgaGVyZSBhcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaXRlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGRlcGVuZGVudCBvbiB0aGUgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhTdGF0dXMuV0FSTklORywgQWR0UGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9qZWN0IGlzIGFscmVhZHkgYW4gQW5kcm9pZCBwcm9qZWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW25hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgbmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBuZXdOYXR1cmVzWzBdID0gQW5kcm9pZENvbnN0YW50cy5OQVRVUkU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgbmF0dXJlIGxpc3QgaW4gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBGaXggdGhlIGNsYXNzcGF0aCBlbnRyaWVzLgotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYSBqYXZhIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmZpeFByb2plY3RDbGFzc3BhdGhFbnRyaWVzKGphdmFQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc2NoZWR1bGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYWN0aW9ucy9GaXhQcm9qZWN0QWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYWN0aW9ucy9GaXhQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGY3ZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2FjdGlvbnMvRml4UHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTmF0dXJlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEFjdGlvbiB0byBmaXggdGhlIHByb2plY3QgcHJvcGVydGllczoKLSAqIDx1bD4KLSAqIDxsaT5NYWtlIHN1cmUgdGhlIGZyYW1ld29yayBhcmNoaXZlIGlzIHByZXNlbnQgd2l0aCB0aGUgbGluayB0byB0aGUgamF2YQotICogZG9jPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaXhQcm9qZWN0QWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBtU2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBJT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChJQWN0aW9uLCBJV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG1TZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpeFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5tU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXhQcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgbmV3IEpvYigiRml4IFByb2plY3QgUHJvcGVydGllcyIpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIkZpeCBQcm9qZWN0IFByb3BlcnRpZXMiLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RIZWxwZXIuZml4UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpeCB0aGUgbmF0dXJlIG9yZGVyIHRvIGhhdmUgdGhlIHByb3BlciBwcm9qZWN0IGljb24KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdEhlbHBlci5maXhQcm9qZWN0TmF0dXJlT3JkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIGZpeCB0aGUgYnVpbGRlcnMKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE5hdHVyZS5jb25maWd1cmVSZXNvdXJjZU1hbmFnZXJCdWlsZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWROYXR1cmUuY29uZmlndXJlUHJlQnVpbGRlcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTmF0dXJlLmNvbmZpZ3VyZUFwa0J1aWxkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYnVpbGQvQXBrQnVpbGRlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Fwa0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNTEyMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYnVpbGQvQXBrQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BcGtJbnN0YWxsTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5EZXhXcmFwcGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkRlYnVnS2V5UHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuSmF2YVJlc291cmNlRmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLlNpZ25lZEphckJ1aWxkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuRGVidWdLZXlQcm92aWRlci5JS2V5R2VuT3V0cHV0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkRlYnVnS2V5UHJvdmlkZXIuS2V5dG9vbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5TaWduZWRKYXJCdWlsZGVyLklaaXBFbnRyeUZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0LkFwa1NldHRpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBBcGtCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFwa0J1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09OVkVSVF9UT19ERVggPSAiY29udmVydFRvRGV4IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QQUNLQUdFX1JFU09VUkNFUyA9ICJwYWNrYWdlUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CVUlMRF9BUEsgPSAiYnVpbGRBcGsiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFhfUFJFRklYID0gIkR4IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogRGV4IGNvbnZlcnNpb24gZmxhZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNoYW5nZWQvYWRkZWQvcmVtb3ZlZAotICAgICAqIGZpbGUgaXMgYSAuY2xhc3MgZmlsZS4gVXBvbiB2aXNpdGluZyBhbGwgdGhlIGRlbHRhIHJlc291cmNlLCBpZiB0aGlzCi0gICAgICogZmxhZyBpcyB0cnVlLCB0aGVuIHdlIGtub3cgd2UnbGwgaGF2ZSB0byBtYWtlIHRoZSAiY2xhc3Nlcy5kZXgiIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Db252ZXJ0VG9EZXggPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgcmVzb3VyY2VzIGZsYWcuIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgb25lIG9mIHRoZSBjaGFuZ2VkL2FkZGVkL3JlbW92ZWQKLSAgICAgKiBmaWxlIGlzIGEgcmVzb3VyY2UgZmlsZS4gVXBvbiB2aXNpdGluZyBhbGwgdGhlIGRlbHRhIHJlc291cmNlLCBpZgotICAgICAqIHRoaXMgZmxhZyBpcyB0cnVlLCB0aGVuIHdlIGtub3cgd2UnbGwgaGF2ZSB0byByZXBhY2thZ2UgdGhlIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhY2thZ2VSZXNvdXJjZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEZpbmFsIHBhY2thZ2UgYnVpbGQgZmxhZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUJ1aWxkRmluYWxQYWNrYWdlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFByaW50U3RyZWFtIG1PdXRTdHJlYW0gPSBudWxsOwotICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gbUVyclN0cmVhbSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBSZXNvdXJjZSBEZWx0YSBWaXNpdG9yIGNsYXNzIHRvIGNoZWNrIGlmIGEgcmVmZXJlbmNlZCBwcm9qZWN0IGhhZCBhIGNoYW5nZSBpbiBpdHMKLSAgICAgKiBjb21waWxlZCBqYXZhIGZpbGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZWRQcm9qZWN0RGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbnZlcnRUb0RleCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1ha2VGaW5hbFBhY2thZ2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBJUGF0aCBtT3V0cHV0Rm9sZGVyOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJUGF0aD4gbVNvdXJjZUZvbGRlcnM7Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWZlcmVuY2VkUHJvamVjdERlbHRhVmlzaXRvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dEZvbGRlciA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZUZvbGRlcnMgPSBCYXNlUHJvamVjdEhlbHBlci5nZXRTb3VyY2VDbGFzc3BhdGhzKGphdmFQcm9qZWN0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gIG5vIG5lZWQgdG8ga2VlcCBsb29raW5nIGlmIHdlIGFscmVhZHkga25vdyB3ZSBuZWVkIHRvIGNvbnZlcnQKLSAgICAgICAgICAgIC8vIHRvIGRleCBhbmQgbWFrZSB0aGUgZmluYWwgcGFja2FnZS4KLSAgICAgICAgICAgIGlmIChtQ29udmVydFRvRGV4ICYmIG1NYWtlRmluYWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIGFuZCB0aGUgcGF0aCBzZWdtZW50cy4KLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICBJUGF0aCByZXNvdXJjZUZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICAgICAgaWYgKG1PdXRwdXRGb2xkZXIuaXNQcmVmaXhPZihyZXNvdXJjZUZ1bGxQYXRoKSkgewotICAgICAgICAgICAgICAgIGludCB0eXBlID0gcmVzb3VyY2UuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9DTEFTUy5lcXVhbHMoZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRUb0RleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoSVBhdGggc291cmNlRnVsbFBhdGggOiBtU291cmNlRm9sZGVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRnVsbFBhdGguaXNQcmVmaXhPZihyZXNvdXJjZUZ1bGxQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmaWxlIGlzIGEgdmFsaWQgZmlsZSB0aGF0IHdvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZWQgZHVyaW5nIHRoZSBmaW5hbCBwYWNrYWdpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZUZvclBhY2thZ2luZygoSUZpbGUpcmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYWtlRmluYWxQYWNrYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSVJlc291cmNlLkZPTERFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBmb2xkZXIsIHdlIGNoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBmb2xkZXIgYXMgd2VsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgZm9sZGVyIHRoYXQgbmVlZHMgdG8gYmUgaWdub3JlZCwgd2UgbXVzdCByZXR1cm4gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBpZ25vcmUgaXRzIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKChJRm9sZGVyKXJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBpZiBvbmUgb2YgdGhlIC5jbGFzcyBmaWxlIHdhcyBtb2RpZmllZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gbmVlZERleENvbnZlcnRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnZlcnRUb0RleDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZE1ha2VGaW5hbFBhY2thZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ha2VGaW5hbFBhY2thZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgSVppcEVudHJ5RmlsdGVyfSB0byBmaWx0ZXIgb3V0IGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYSBzdGFuZGFyZCBqYXZhIHJlc291cmNlcy4KLSAgICAgKiA8cC8+VXNlZCBpbiB7QGxpbmsgU2lnbmVkSmFyQnVpbGRlciN3cml0ZVppcChqYXZhLmlvLklucHV0U3RyZWFtLCBJWmlwRW50cnlGaWx0ZXIpfSB3aGVuCi0gICAgICogd2Ugb25seSB3YW50IHRoZSBqYXZhIHJlc291cmNlcyBmcm9tIGV4dGVybmFsIGphcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJWmlwRW50cnlGaWx0ZXIgbUphdmFSZXNvdXJjZXNGaWx0ZXIgPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7Ci0KLSAgICBwdWJsaWMgQXBrQnVpbGRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvLyBidWlsZCgpIHJldHVybnMgYSBsaXN0IG9mIHByb2plY3QgZnJvbSB3aGljaCB0aGlzIHByb2plY3QgZGVwZW5kcyBmb3IgZnV0dXJlIGNvbXBpbGF0aW9uLgotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBnZXQgYSBwcm9qZWN0IG9iamVjdAotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIC8vIGxpc3Qgb2YgcmVmZXJlbmNlZCBwcm9qZWN0cy4KLSAgICAgICAgSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUb3AgbGV2ZWwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBidWlsZCBjYW4gbW92ZSBmb3J3YXJkLgotICAgICAgICAgICAgYWJvcnRPbkJhZFNldHVwKHByb2plY3QpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBwcm9qZWN0cy4KLSAgICAgICAgICAgIHJlZmVyZW5jZWRQcm9qZWN0cyA9IFByb2plY3RIZWxwZXIuZ2V0UmVmZXJlbmNlZFByb2plY3RzKHByb2plY3QpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0W10gcmVmZXJlbmNlZEphdmFQcm9qZWN0cyA9IGdldEphdmFQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIG91dHB1dCBmb2xkZXIsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nCi0gICAgICAgICAgICAvLyBzZXBhcmF0b3IKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgICAgIElGb2xkZXIgb3V0cHV0Rm9sZGVyID0gQmFzZVByb2plY3RIZWxwZXIuZ2V0T3V0cHV0Rm9sZGVyKHByb2plY3QpOwotCi0gICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBnZXQgdGhlIGNsYXNzcGF0aCBsaXN0Ci0gICAgICAgICAgICBBcnJheUxpc3Q8SVBhdGg+IHNvdXJjZUxpc3QgPSBCYXNlUHJvamVjdEhlbHBlci5nZXRTb3VyY2VDbGFzc3BhdGhzKGphdmFQcm9qZWN0KTsKLQotICAgICAgICAgICAgLy8gRmlyc3QgdGhpbmcgd2UgZG8gaXMgZ28gdGhyb3VnaCB0aGUgcmVzb3VyY2UgZGVsdGEgdG8gbm90Ci0gICAgICAgICAgICAvLyBsb3NlIGl0IGlmIHdlIGhhdmUgdG8gYWJvcnQgdGhlIGJ1aWxkIGZvciBhbnkgcmVhc29uLgotICAgICAgICAgICAgQXBrRGVsdGFWaXNpdG9yIGR2ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChraW5kID09IEZVTExfQlVJTEQpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlN0YXJ0X0Z1bGxfQXBrX0J1aWxkKTsKLQotICAgICAgICAgICAgICAgIG1QYWNrYWdlUmVzb3VyY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQ29udmVydFRvRGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlN0YXJ0X0luY19BcGtfQnVpbGQpOwotCi0gICAgICAgICAgICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgcmVzb3VyY2VzIGFuZCBzZWUgaWYgc29tZXRoaW5nIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBnZXREZWx0YShwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVJlc291cmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Db252ZXJ0VG9EZXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGR2ID0gbmV3IEFwa0RlbHRhVmlzaXRvcih0aGlzLCBzb3VyY2VMaXN0LCBvdXRwdXRGb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICBkZWx0YS5hY2NlcHQoZHYpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlUmVzb3VyY2VzIHw9IGR2LmdldFBhY2thZ2VSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRUb0RleCB8PSBkdi5nZXRDb252ZXJ0VG9EZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkRmluYWxQYWNrYWdlIHw9IGR2LmdldE1ha2VGaW5hbFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhbHNvIGdvIHRocm91Z2ggdGhlIGRlbHRhIGZvciBhbGwgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMsIHVudGlsIHdlIGFyZSBmb3JjZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBjb21waWxlIGFueXdheQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHJlZmVyZW5jZWRKYXZhUHJvamVjdHMubGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobUJ1aWxkRmluYWxQYWNrYWdlID09IGZhbHNlIHx8IG1Db252ZXJ0VG9EZXggPT0gZmFsc2UpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IHJlZmVyZW5jZWRKYXZhUHJvamVjdCA9IHJlZmVyZW5jZWRKYXZhUHJvamVjdHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gZ2V0RGVsdGEocmVmZXJlbmNlZEphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VkUHJvamVjdERlbHRhVmlzaXRvciByZWZQcm9qZWN0RHYgPSBuZXcgUmVmZXJlbmNlZFByb2plY3REZWx0YVZpc2l0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRKYXZhUHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YS5hY2NlcHQocmVmUHJvamVjdER2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJ0VG9EZXggfD0gcmVmUHJvamVjdER2Lm5lZWREZXhDb252ZXJ0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgfD0gcmVmUHJvamVjdER2Lm5lZWRNYWtlRmluYWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBidWlsZCBzdGF0dXMgaW4gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZQotICAgICAgICAgICAgc2F2ZVByb2plY3RCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ09OVkVSVF9UT19ERVggLCBtQ29udmVydFRvRGV4KTsKLSAgICAgICAgICAgIHNhdmVQcm9qZWN0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX1BBQ0tBR0VfUkVTT1VSQ0VTLCBtUGFja2FnZVJlc291cmNlcyk7Ci0gICAgICAgICAgICBzYXZlUHJvamVjdEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9CVUlMRF9BUEssIG1CdWlsZEZpbmFsUGFja2FnZSk7Ci0KLSAgICAgICAgICAgIGlmIChkdiAhPSBudWxsICYmIGR2Lm1YbWxFcnJvcikgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlhtbF9FcnJvcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgc29tZSBYTUwgZXJyb3JzLCB3ZSBqdXN0IHJldHVybiB3L28gZG9pbmcKLSAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBzaW5jZSB3ZSd2ZSBwdXQgc29tZSBtYXJrZXJzIGluIHRoZSBmaWxlcyBhbnl3YXkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3V0cHV0Rm9sZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBtYXJrIHByb2plY3QgYW5kIGV4aXQKLSAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgTWVzc2FnZXMuRmFpbGVkX1RvX0dldF9PdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaXJzdCB0aGluZyB3ZSBkbyBpcyBjaGVjayB0aGF0IHRoZSBTREsgZGlyZWN0b3J5IGhhcyBiZWVuIHNldHVwLgotICAgICAgICAgICAgU3RyaW5nIG9zU2RrRm9sZGVyID0gQWR0UGx1Z2luLmdldE9zU2RrRm9sZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChvc1Nka0ZvbGRlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgaW4gdGhlIHByZWNvbXBpbGVyLiBUaGVyZWZvcmUsCi0gICAgICAgICAgICAgICAgLy8gd2hpbGUgd2UgZG8gaGF2ZSB0byBjYW5jZWwgdGhlIGJ1aWxkLCB3ZSBkb24ndCBoYXZlIHRvIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGFueSBlcnJvciBvciB0aHJvdyBhbnl0aGluZy4KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIEFQSyBjb25maWdzIGZvciB0aGUgcHJvamVjdC4KLSAgICAgICAgICAgIEFwa1NldHRpbmdzIGFwa1NldHRpbmdzID0gU2RrLmdldEN1cnJlbnQoKS5nZXRBcGtTZXR0aW5ncyhwcm9qZWN0KTsKLSAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIFN0cmluZz4+IGFwa2ZpbHRlcnMgPSBudWxsOwotICAgICAgICAgICAgaWYgKGFwa1NldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbHRlck1hcCA9IGFwa1NldHRpbmdzLmdldFJlc291cmNlRmlsdGVycygpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXAgIT0gbnVsbCAmJiBmaWx0ZXJNYXAuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhcGtmaWx0ZXJzID0gZmlsdGVyTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkbyBzb21lIGV4dHJhIGNoZWNrLCBpbiBjYXNlIHRoZSBvdXRwdXQgZmlsZXMgYXJlIG5vdCBwcmVzZW50LiBUaGlzCi0gICAgICAgICAgICAvLyB3aWxsIGZvcmNlIHRvIHJlY3JlYXRlIHRoZW0uCi0gICAgICAgICAgICBJUmVzb3VyY2UgdG1wID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1QYWNrYWdlUmVzb3VyY2VzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGZ1bGwgcmVzb3VyY2UgcGFja2FnZQotICAgICAgICAgICAgICAgIHRtcCA9IG91dHB1dEZvbGRlci5maW5kTWVtYmVyKEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VTX0FQXyk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsIHx8IHRtcC5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVJlc291cmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZEZpbmFsUGFja2FnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZ1bGwgcGFja2FnZSBpcyBwcmVzZW50LCB3ZSBjaGVjayB0aGUgZmlsdGVyZWQgcmVzb3VyY2UgcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gYXMgd2VsbAotICAgICAgICAgICAgICAgICAgICBpZiAoYXBrZmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGFwa2ZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBTdHJpbmcuZm9ybWF0KEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VTX1NfQVBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gb3V0cHV0Rm9sZGVyLmZpbmRNZW1iZXIoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gbnVsbCB8fCAodG1wIGluc3RhbmNlb2YgSUZpbGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5leGlzdHMoKSA9PSBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuc19NaXNzaW5nX1JlcGFja2FnaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGNsYXNzZXMuZGV4IGlzIHByZXNlbnQuIElmIG5vdCB3ZSBmb3JjZSB0byByZWNyZWF0ZSBpdC4KLSAgICAgICAgICAgIGlmIChtQ29udmVydFRvRGV4ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gb3V0cHV0Rm9sZGVyLmZpbmRNZW1iZXIoQW5kcm9pZENvbnN0YW50cy5GTl9DTEFTU0VTX0RFWCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsIHx8IHRtcC5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udmVydFRvRGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkRmluYWxQYWNrYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFsc28gY2hlY2sgdGhlIGZpbmFsIGZpbGUocykhCi0gICAgICAgICAgICBTdHJpbmcgZmluYWxQYWNrYWdlTmFtZSA9IFByb2plY3RIZWxwZXIuZ2V0QXBrRmlsZW5hbWUocHJvamVjdCwgbnVsbCAvKmNvbmZpZyovKTsKLSAgICAgICAgICAgIGlmIChtQnVpbGRGaW5hbFBhY2thZ2UgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBvdXRwdXRGb2xkZXIuZmluZE1lbWJlcihmaW5hbFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IG51bGwgfHwgKHRtcCBpbnN0YW5jZW9mIElGaWxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAuZXhpc3RzKCkgPT0gZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLnNfTWlzc2luZ19SZXBhY2thZ2luZywgZmluYWxQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBrZmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmdWxsIGFwayBpcyBwcmVzZW50LCB3ZSBjaGVjayB0aGUgZmlsdGVyZWQgYXBrIGFzIHdlbGwKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBhcGtmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBQcm9qZWN0SGVscGVyLmdldEFwa0ZpbGVuYW1lKHByb2plY3QsIGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gb3V0cHV0Rm9sZGVyLmZpbmRNZW1iZXIoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsIHx8ICh0bXAgaW5zdGFuY2VvZiBJRmlsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAuZXhpc3RzKCkgPT0gZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuc19NaXNzaW5nX1JlcGFja2FnaW5nLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIHByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkRmluYWxQYWNrYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IGlmIHdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIHRlbXBvcmFyeSBhcGsKLSAgICAgICAgICAgIC8vIG9yIHRoZSBkZXggZmlsZSwgYnV0IHdlIGRvbid0IGtub3cgaWYgd2Ugc2ltcGx5IG5lZWQgdG8gcmVjcmVhdGUgdGhlbQotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBtaXNzaW5nCi0KLSAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIG91dHB1dCBkaXJlY3RvcnkgZmlyc3QKLSAgICAgICAgICAgIElDb250YWluZXIgaWMgPSBvdXRwdXRGb2xkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoaWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB0ZXN0IGFsbCB0aHJlZSwgYXMgd2UgbWF5IG5lZWQgdG8gbWFrZSB0aGUgZmluYWwgcGFja2FnZQotICAgICAgICAgICAgLy8gYnV0IG5vdCB0aGUgaW50ZXJtZWRpYXJ5IG9uZXMuCi0gICAgICAgICAgICBpZiAobVBhY2thZ2VSZXNvdXJjZXMgfHwgbUNvbnZlcnRUb0RleCB8fCBtQnVpbGRGaW5hbFBhY2thZ2UpIHsKLSAgICAgICAgICAgICAgICBJUGF0aCBiaW5Mb2NhdGlvbiA9IG91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChiaW5Mb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBNZXNzYWdlcy5PdXRwdXRfTWlzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9zQmluUGF0aCA9IGJpbkxvY2F0aW9uLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIC5hcGsuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgYXBrIGlzIGNvcnJ1cHRlZCwgdGhlbiBkeCAod2hpY2ggd291bGQgYXR0ZW1wdAotICAgICAgICAgICAgICAgIC8vIHRvIG9wZW4gaXQpLCB3aWxsIG5vdCBmYWlsLgotICAgICAgICAgICAgICAgIFN0cmluZyBvc0ZpbmFsUGFja2FnZVBhdGggPSBvc0JpblBhdGggKyBGaWxlLnNlcGFyYXRvciArIGZpbmFsUGFja2FnZU5hbWU7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaW5hbFBhY2thZ2UgPSBuZXcgRmlsZShvc0ZpbmFsUGFja2FnZVBhdGgpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgZGVsZXRlIGZhaWxlZCwgdGhpcyBpcyBub3QgcmVhbGx5IGEgcHJvYmxlbSwgYXMgdGhlIGZpbmFsIHBhY2thZ2UgZ2VuZXJhdGlvbgotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhbHJlYWR5IHByZXNlbnQgLmFwaywgYW5kIGlmIHRoYXQgb25lIGZhaWxlZCBhcyB3ZWxsLCB0aGUgdXNlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gbm90aWZpZWQuCi0gICAgICAgICAgICAgICAgZmluYWxQYWNrYWdlLmRlbGV0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFwa2ZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGFwa2ZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlRmlsZXBhdGggPSBvc0JpblBhdGggKyBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RIZWxwZXIuZ2V0QXBrRmlsZW5hbWUocHJvamVjdCwgZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhY2thZ2UgPSBuZXcgRmlsZShwYWNrYWdlRmlsZXBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYWNrYWdlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd2UgY2hlY2sgaWYgd2UgbmVlZCB0byBwYWNrYWdlIHRoZSByZXNvdXJjZXMuCi0gICAgICAgICAgICAgICAgaWYgKG1QYWNrYWdlUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb21lIGFhcHRfcGFja2FnZSBvbmx5IG1hcmtlcnMuCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZU1hcmtlcnNGcm9tQ29udGFpbmVyKHByb2plY3QsIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FBUFRfUEFDS0FHRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBmaWd1cmUgb3V0IHNvbWUgcGF0aCBiZWZvcmUgd2UgY2FuIGV4ZWN1dGUgYWFwdDsKLQotICAgICAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSB0byB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSBtYW5pZmVzdFJlc291cmNlID0gcHJvamVjdCAuZmluZE1lbWJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUCArIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0UmVzb3VyY2UgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hbmlmZXN0UmVzb3VyY2UuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgcHJvamVjdCBhbmQgZXhpdAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuc19GaWxlX01pc3NpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIGZvbGRlcgotICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHJlc0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuV1NfUkVTT1VSQ0VTKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGFzc2V0cyBmb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBhc3NldHNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLldTX0FTU0VUUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBvbmUgZXhpc3RzLgotICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXRzRm9sZGVyLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NldHNGb2xkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgSVBhdGggcmVzTG9jYXRpb24gPSByZXNGb2xkZXIuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggbWFuaWZlc3RMb2NhdGlvbiA9IG1hbmlmZXN0UmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzTG9jYXRpb24gIT0gbnVsbCAmJiBtYW5pZmVzdExvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc1Jlc1BhdGggPSByZXNMb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3NNYW5pZmVzdFBhdGggPSBtYW5pZmVzdExvY2F0aW9uLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9zQXNzZXRzUGF0aCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXRzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc0Fzc2V0c1BhdGggPSBhc3NldHNGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBkZWZhdWx0IHJlc291cmNlIHBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlQWFwdChwcm9qZWN0LCBvc01hbmlmZXN0UGF0aCwgb3NSZXNQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc0Fzc2V0c1BhdGgsIG9zQmluUGF0aCArIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5GTl9SRVNPVVJDRVNfQVBfLCBudWxsIC8qY29uZmlnRmlsdGVyKi8pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWFwdCBmYWlsZWQuIFdoYXRldmVyIGZpbGVzIHRoYXQgbmVlZGVkIHRvIGJlIG1hcmtlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZC4gV2UganVzdCByZXR1cm4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRvIHRoZSBzYW1lIHRoaW5nIGZvciBhbGwgdGhlIGNvbmZpZ3VyZWQgcmVzb3VyY2UgcGFja2FnZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBrZmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBhcGtmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRQYXRoRm9ybWF0ID0gb3NCaW5QYXRoICsgRmlsZS5zZXBhcmF0b3IgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VTX1NfQVBfOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0UGF0aCA9IFN0cmluZy5mb3JtYXQob3V0UGF0aEZvcm1hdCwgZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZUFhcHQocHJvamVjdCwgb3NNYW5pZmVzdFBhdGgsIG9zUmVzUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc0Fzc2V0c1BhdGgsIG91dFBhdGgsIGVudHJ5LmdldFZhbHVlKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYXB0IGZhaWxlZC4gV2hhdGV2ZXIgZmlsZXMgdGhhdCBuZWVkZWQgdG8gYmUgbWFya2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGFscmVhZHkgYmVlbiBtYXJrZWQuIFdlIGp1c3QgcmV0dXJuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgaGFzIGJlZW4gZG9uZS4gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBidWlsZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVJlc291cmNlcyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RvcmUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVQcm9qZWN0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX1BBQ0tBR0VfUkVTT1VSQ0VTLCBtUGFja2FnZVJlc291cmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNoZWNrIGlmIHdlIG5lZWQgdG8gcGFja2FnZSB0aGUgLmNsYXNzIGludG8gY2xhc3Nlcy5kZXgKLSAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnRUb0RleCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZUR4KGphdmFQcm9qZWN0LCBvc0JpblBhdGgsIG9zQmluUGF0aCArIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX0NMQVNTRVNfREVYLCByZWZlcmVuY2VkSmF2YVByb2plY3RzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHggZmFpbGVkLCB3ZSByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBoYXMgYmVlbiBkb25lLiByZXNldCB0aGUgc3RhdGUgb2YgdGhlIGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRUb0RleCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdG9yZSBpdAotICAgICAgICAgICAgICAgICAgICBzYXZlUHJvamVjdEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DT05WRVJUX1RPX0RFWCwgbUNvbnZlcnRUb0RleCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gbWFrZSB0aGUgZmluYWwgcGFja2FnZSBmcm9tIHRoZSBpbnRlcm1lZGlhcnkgYXBrCi0gICAgICAgICAgICAgICAgLy8gYW5kIGNsYXNzZXMuZGV4LgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGFja2FnZSB3aXRoIGFsbCB0aGUgcmVzb3VyY2VzLgotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzZXNEZXhQYXRoID0gb3NCaW5QYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBBbmRyb2lkQ29uc3RhbnRzLkZOX0NMQVNTRVNfREVYOwotICAgICAgICAgICAgICAgIGlmIChmaW5hbFBhY2thZ2Uob3NCaW5QYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBBbmRyb2lkQ29uc3RhbnRzLkZOX1JFU09VUkNFU19BUF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXNEZXhQYXRoLG9zRmluYWxQYWNrYWdlUGF0aCwgamF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRKYXZhUHJvamVjdHMpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IGRvIHRoZSBzYW1lIHRoaW5nIGZvciBhbGwgdGhlIGNvbmZpZ3VyZWQgcmVzb3VyY2UgcGFja2FnZXMuCi0gICAgICAgICAgICAgICAgaWYgKGFwa2ZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGF0aEZvcm1hdCA9IG9zQmluUGF0aCArIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX1JFU09VUkNFU19TX0FQXzsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGFwa2ZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIGZpbGVuYW1lIGZvciB0aGUgcmVzb3VyY2UgcGFja2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNQYXRoID0gU3RyaW5nLmZvcm1hdChyZXNQYXRoRm9ybWF0LCBlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIGZpbGVuYW1lIGZvciB0aGUgYXBrIHRvIGdlbmVyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBrT3NGaWxlUGF0aCA9IG9zQmluUGF0aCArIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdEhlbHBlci5nZXRBcGtGaWxlbmFtZShwcm9qZWN0LCBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxQYWNrYWdlKHJlc1BhdGgsIGNsYXNzZXNEZXhQYXRoLCBhcGtPc0ZpbGVQYXRoLCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZEphdmFQcm9qZWN0cykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUuCi0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIHRvIGJpbgotICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBidWlsZCBoYXMgYmVlbiBkb25lLiByZXNldCB0aGUgc3RhdGUgb2YgdGhlIGJ1aWxkZXIKLSAgICAgICAgICAgICAgICBtQnVpbGRGaW5hbFBhY2thZ2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8vIGFuZCBzdG9yZSBpdAotICAgICAgICAgICAgICAgIHNhdmVQcm9qZWN0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0FQSywgbUJ1aWxkRmluYWxQYWNrYWdlKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBpbnN0YWxsYXRpb24gbWFuYWdlciB0byBmb3JjZSBuZXcgaW5zdGFsbHMgb2YgdGhpcyBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgQXBrSW5zdGFsbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXNldEluc3RhbGxhdGlvbkZvcihwcm9qZWN0KTsKLQotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiQnVpbGQgU3VjY2VzcyEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gdHJ5IHRvIGNhdGNoIG90aGVyIGV4Y2VwdGlvbiB0byBhY3R1YWxseSBkaXNwbGF5IGFuIGVycm9yLiBUaGlzIHdpbGwgYmUgdXNlZnVsCi0gICAgICAgICAgICAvLyBpZiB3ZSBnZXQgYW4gTlBFIG9yIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiBhdCBsZWFzdCBub3RpZnkgdGhlIHVzZXIgdGhhdCBzb21ldGhpbmcKLSAgICAgICAgICAgIC8vIHdlbnQgd3JvbmcuCi0KLSAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYSBDb3JlRXhjZXB0aW9uIHdlIHRocmV3IHRvIGNhbmNlbCB0aGUgYnVpbGQuCi0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGlmICgoKENvcmVFeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuQ0FOQ0VMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByb2plY3QgaXMgYWxyZWFkeSBtYXJrZWQgd2l0aCBhbiBlcnJvci4gTm90aGluZyB0byBkbwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1zZyA9IFN0cmluZy5mb3JtYXQoIlVua25vd24gZXJyb3I6ICUxJHMiLCBtc2cpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgbXNnKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydHVwT25Jbml0aWFsaXplKCkgewotICAgICAgICBzdXBlci5zdGFydHVwT25Jbml0aWFsaXplKCk7Ci0KLSAgICAgICAgLy8gbG9hZCB0aGUgYnVpbGQgc3RhdHVzLiBXZSBwYXNzIHRydWUgYXMgdGhlIGRlZmF1bHQgdmFsdWUgdG8KLSAgICAgICAgLy8gZm9yY2UgYSByZWNvbXBpbGUgaW4gY2FzZSB0aGUgcHJvcGVydHkgd2FzIG5vdCBmb3VuZAotICAgICAgICBtQ29udmVydFRvRGV4ID0gbG9hZFByb2plY3RCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ09OVkVSVF9UT19ERVggLCB0cnVlKTsKLSAgICAgICAgbVBhY2thZ2VSZXNvdXJjZXMgPSBsb2FkUHJvamVjdEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9QQUNLQUdFX1JFU09VUkNFUywgdHJ1ZSk7Ci0gICAgICAgIG1CdWlsZEZpbmFsUGFja2FnZSA9IGxvYWRQcm9qZWN0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0FQSywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYWFwdC4gSWYgYW55IGVycm9yIGhhcHBlbiwgZmlsZXMgb3IgdGhlIHByb2plY3Qgd2lsbCBiZSBtYXJrZWQuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIFByb2plY3QKLSAgICAgKiBAcGFyYW0gb3NNYW5pZmVzdFBhdGggVGhlIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGUKLSAgICAgKiBAcGFyYW0gb3NSZXNQYXRoIFRoZSBwYXRoIHRvIHRoZSByZXMgZm9sZGVyCi0gICAgICogQHBhcmFtIG9zQXNzZXRzUGF0aCBUaGUgcGF0aCB0byB0aGUgYXNzZXRzIGZvbGRlci4gVGhpcyBjYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gb3NPdXRGaWxlUGF0aCBUaGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5IHJlc291cmNlIGZpbGUgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBjb25maWdGaWx0ZXIgVGhlIGNvbmZpZ3VyYXRpb24gZmlsdGVyIGZvciB0aGUgcmVzb3VyY2VzIHRvIGluY2x1ZGUKLSAgICAgKiAodXNlZCB3aXRoIC1jIG9wdGlvbiwgZm9yIGV4YW1wbGUgInBvcnQsZW4sZnIiIHRvIGluY2x1ZGUgcG9ydHJhaXQsIEVuZ2xpc2ggYW5kIEZyZW5jaAotICAgICAqIHJlc291cmNlcy4pCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUFhcHQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG9zTWFuaWZlc3RQYXRoLAotICAgICAgICAgICAgU3RyaW5nIG9zUmVzUGF0aCwgU3RyaW5nIG9zQXNzZXRzUGF0aCwgU3RyaW5nIG9zT3V0RmlsZVBhdGgsIFN0cmluZyBjb25maWdGaWx0ZXIpIHsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNvbW1hbmRBcnJheSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21tYW5kQXJyYXkuYWRkKHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFBUFQpKTsKLSAgICAgICAgY29tbWFuZEFycmF5LmFkZCgicGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbW1hbmRBcnJheS5hZGQoIi1mIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoQWR0UGx1Z2luLmdldEJ1aWxkVmVyYm9zaXR5KCkgPT0gQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UpIHsKLSAgICAgICAgICAgIGNvbW1hbmRBcnJheS5hZGQoIi12Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlnRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbW1hbmRBcnJheS5hZGQoIi1jIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGNvbW1hbmRBcnJheS5hZGQoY29uZmlnRmlsdGVyKTsKLSAgICAgICAgfQotICAgICAgICBjb21tYW5kQXJyYXkuYWRkKCItTSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbW1hbmRBcnJheS5hZGQob3NNYW5pZmVzdFBhdGgpOwotICAgICAgICBjb21tYW5kQXJyYXkuYWRkKCItUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbW1hbmRBcnJheS5hZGQob3NSZXNQYXRoKTsKLSAgICAgICAgaWYgKG9zQXNzZXRzUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb21tYW5kQXJyYXkuYWRkKCItQSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjb21tYW5kQXJyYXkuYWRkKG9zQXNzZXRzUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZEFycmF5LmFkZCgiLUkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21tYW5kQXJyYXkuYWRkKHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFORFJPSURfSkFSKSk7Ci0gICAgICAgIGNvbW1hbmRBcnJheS5hZGQoIi1GIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29tbWFuZEFycmF5LmFkZChvc091dEZpbGVQYXRoKTsKLQotICAgICAgICBTdHJpbmcgY29tbWFuZFtdID0gY29tbWFuZEFycmF5LnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tjb21tYW5kQXJyYXkuc2l6ZSgpXSk7Ci0KLSAgICAgICAgaWYgKEFkdFBsdWdpbi5nZXRCdWlsZFZlcmJvc2l0eSgpID09IEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGMgOiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbGF1bmNoCi0gICAgICAgIGludCBleGVjRXJyb3IgPSAxOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbGF1bmNoIHRoZSBjb21tYW5kIGxpbmUgcHJvY2VzcwotICAgICAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLQotICAgICAgICAgICAgLy8gbGlzdCB0byBzdG9yZSBlYWNoIGxpbmUgb2Ygc3RkZXJyCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgb3V0cHV0IGFuZCByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgICAgICBleGVjRXJyb3IgPSBncmFiUHJvY2Vzc091dHB1dChwcm9jZXNzLCByZXN1bHRzKTsKLQotICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBwYXJzZSB0aGUgZXJyb3Igb3V0cHV0Ci0gICAgICAgICAgICBib29sZWFuIHBhcnNpbmdFcnJvciA9IHBhcnNlQWFwdE91dHB1dChyZXN1bHRzLCBwcm9qZWN0KTsKLQotICAgICAgICAgICAgLy8gaWYgd2UgY291bGRuJ3QgcGFyc2UgdGhlIG91dHB1dCB3ZSBkaXNwbGF5IGl0IGluIHRoZSBjb25zb2xlLgotICAgICAgICAgICAgaWYgKHBhcnNpbmdFcnJvcikgewotICAgICAgICAgICAgICAgIGlmIChleGVjRXJyb3IgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCByZXN1bHRzLnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX0FMV0FZUywgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFib3J0IGlmIHRoZSBleGVjIGZhaWxlZC4KLSAgICAgICAgICAgIGlmIChleGVjRXJyb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBleGVjIGZhaWxlZCwgYW5kIHdlIGNvdWxkbid0IHBhcnNlIHRoZSBlcnJvciBvdXRwdXQgKGFuZCB0aGVyZWZvcmUKLSAgICAgICAgICAgICAgICAvLyBub3QgYWxsIGZpbGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBtYXJrZWQsIHdlcmUgbWFya2VkKSwgd2UgcHV0IGEgZ2VuZXJpYwotICAgICAgICAgICAgICAgIC8vIG1hcmtlciBvbiB0aGUgcHJvamVjdCBhbmQgYWJvcnQuCi0gICAgICAgICAgICAgICAgaWYgKHBhcnNpbmdFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgTWVzc2FnZXMuVW5wYXJzZWRfQUFQVF9FcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYWJvcnQgaWYgZXhlYyBmYWlsZWQuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQUFQVF9FeGVjX0Vycm9yLCBjb21tYW5kWzBdKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5BQVBUX0V4ZWNfRXJyb3IsIGNvbW1hbmRbMF0pOwotICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBEeCB0b29sIGZvciBkYWx2aWsgY29kZSBjb252ZXJzaW9uLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIG9zQmluUGF0aCB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IGZvbGRlciBvZiB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBvc091dEZpbGVQYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXggZmlsZSB0byBjcmVhdGUuCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZWRKYXZhUHJvamVjdHMgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBwcm9qZWN0cyBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVEeChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBvc0JpblBhdGgsIFN0cmluZyBvc091dEZpbGVQYXRoLAotICAgICAgICAgICAgSUphdmFQcm9qZWN0W10gcmVmZXJlbmNlZEphdmFQcm9qZWN0cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICBBbmRyb2lkVGFyZ2V0RGF0YSB0YXJnZXREYXRhID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXREYXRhKHRhcmdldCk7Ci0gICAgICAgIGlmICh0YXJnZXREYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWR0UGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuQXBrQnVpbGRlcl9VbmFibGVCdWlsZF9EZXhfTm90X2xvYWRlZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBkZXggd3JhcHBlcgotICAgICAgICBEZXhXcmFwcGVyIHdyYXBwZXIgPSB0YXJnZXREYXRhLmdldERleFdyYXBwZXIoKTsKLQotICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFwa0J1aWxkZXJfVW5hYmxlQnVpbGRfRGV4X05vdF9sb2FkZWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSBkeCB1c2UgdGhlIHByb3BlciBvdXRwdXQgc3RyZWFtcy4KLSAgICAgICAgLy8gZmlyc3QgbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgdGhlIHN0cmVhbXMgYXZhaWxhYmxlLgotICAgICAgICBpZiAobU91dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgbU91dFN0cmVhbSA9IEFkdFBsdWdpbi5nZXRPdXRQcmludFN0cmVhbShwcm9qZWN0LCBEWF9QUkVGSVgpOwotICAgICAgICAgICAgbUVyclN0cmVhbSA9IEFkdFBsdWdpbi5nZXRFcnJQcmludFN0cmVhbShwcm9qZWN0LCBEWF9QUkVGSVgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdG8gaW5jbHVkZSB3aXRoIHRoZSBzb3VyY2UgY29kZQotICAgICAgICAgICAgU3RyaW5nW10gbGlicmFyaWVzID0gZ2V0RXh0ZXJuYWxKYXJzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIHByb2plY3RzIG91dHB1dCB0byBhZGQKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3RPdXRwdXRzID0gZ2V0UHJvamVjdE91dHB1dHMocmVmZXJlbmNlZEphdmFQcm9qZWN0cyk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbMSArIHByb2plY3RPdXRwdXRzLmxlbmd0aCArIGxpYnJhcmllcy5sZW5ndGhdOwotCi0gICAgICAgICAgICAvLyBmaXJzdCB0aGlzIHByb2plY3Qgb3V0cHV0Ci0gICAgICAgICAgICBmaWxlTmFtZXNbMF0gPSBvc0JpblBhdGg7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gb3RoZXIgcHJvamVjdCBvdXRwdXQKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJvamVjdE91dHB1dHMsIDAsIGZpbGVOYW1lcywgMSwgcHJvamVjdE91dHB1dHMubGVuZ3RoKTsKLQotICAgICAgICAgICAgLy8gdGhlbiBleHRlcm5hbCBqYXJzLgotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsaWJyYXJpZXMsIDAsIGZpbGVOYW1lcywgMSArIHByb2plY3RPdXRwdXRzLmxlbmd0aCwgbGlicmFyaWVzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGludCByZXMgPSB3cmFwcGVyLnJ1bihvc091dEZpbGVQYXRoLCBmaWxlTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5nZXRCdWlsZFZlcmJvc2l0eSgpID09IEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLAotICAgICAgICAgICAgICAgICAgICBtT3V0U3RyZWFtLCBtRXJyU3RyZWFtKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IGVycm9yIG1lc3NhZ2UgYW5kIG1hcmtlciB0aGUgcHJvamVjdC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuRGFsdmlrX0Vycm9yX2QsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGdldFByb2plY3QoKSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1lc3NhZ2UsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGV4LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gZXguZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5EYWx2aWtfRXJyb3JfcywgbWVzc2FnZSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShnZXRQcm9qZWN0KCksIG1lc3NhZ2UpOwotICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1lc3NhZ2UsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgaWYgKChleCBpbnN0YW5jZW9mIE5vQ2xhc3NEZWZGb3VuZEVycm9yKQotICAgICAgICAgICAgICAgICAgICB8fCAoZXggaW5zdGFuY2VvZiBOb1N1Y2hNZXRob2RFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShnZXRQcm9qZWN0KCksIE1lc3NhZ2VzLkluY29tcGF0aWJsZV9WTV9XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuUmVxdWlyZXNfMV81X0Vycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2VzIHRoZSBmaW5hbCBwYWNrYWdlLiBQYWNrYWdlIHRoZSBkZXggZmlsZXMsIHRoZSB0ZW1wb3JhcnkgcmVzb3VyY2UgZmlsZSBpbnRvIHRoZSBmaW5hbAotICAgICAqIHBhY2thZ2UgZmlsZS4KLSAgICAgKiBAcGFyYW0gaW50ZXJtZWRpYXRlQXBrIFRoZSBwYXRoIHRvIHRoZSB0ZW1wb3JhcnkgcmVzb3VyY2UgZmlsZS4KLSAgICAgKiBAcGFyYW0gZGV4IFRoZSBwYXRoIHRvIHRoZSBkZXggZmlsZS4KLSAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBwYXRoIHRvIHRoZSBmaW5hbCBwYWNrYWdlIGZpbGUgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdAotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkSmF2YVByb2plY3RzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmluYWxQYWNrYWdlKFN0cmluZyBpbnRlcm1lZGlhdGVBcGssIFN0cmluZyBkZXgsIFN0cmluZyBvdXRwdXQsCi0gICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElKYXZhUHJvamVjdFtdIHJlZmVyZW5jZWRKYXZhUHJvamVjdHMpIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3NLZXlQYXRoID0gc3RvcmUuZ2V0U3RyaW5nKEFkdFBsdWdpbi5QUkVGU19DVVNUT01fREVCVUdfS0VZU1RPUkUpOwotICAgICAgICAgICAgaWYgKG9zS2V5UGF0aCA9PSBudWxsIHx8IG5ldyBGaWxlKG9zS2V5UGF0aCkuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBvc0tleVBhdGggPSBEZWJ1Z0tleVByb3ZpZGVyLmdldERlZmF1bHRLZXlTdG9yZU9zUGF0aCgpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5BcGtCdWlsZGVyX1VzaW5nX0RlZmF1bHRfS2V5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQXBrQnVpbGRlcl9Vc2luZ19zX1RvX1NpZ24sIG9zS2V5UGF0aCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIHN0b3JlIHR5cGUgZnJvbSBzb21ld2hlcmUgZWxzZS4KLSAgICAgICAgICAgIERlYnVnS2V5UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGVidWdLZXlQcm92aWRlcihvc0tleVBhdGgsIG51bGwgLyogc3RvcmVUeXBlICovLAotICAgICAgICAgICAgICAgICAgICBuZXcgSUtleUdlbk91dHB1dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFwa0J1aWxkZXJfU2lnbmluZ19LZXlfQ3JlYXRpb25fcyArIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvdXQoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFwa0J1aWxkZXJfU2lnbmluZ19LZXlfQ3JlYXRpb25fcyArIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBQcml2YXRlS2V5IGtleSA9IHByb3ZpZGVyLmdldERlYnVnS2V5KCk7Ci0gICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSAoWDUwOUNlcnRpZmljYXRlKXByb3ZpZGVyLmdldENlcnRpZmljYXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkZpbmFsX0FyY2hpdmVfRXJyb3JfcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFwa0J1aWxkZXJfVW5hYmxlX1RvX0dleV9LZXkpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIGNlcnRpZmljYXRlIGV4cGlyYXRpb24gZGF0ZQotICAgICAgICAgICAgaWYgKGNlcnRpZmljYXRlICE9IG51bGwgJiYgY2VydGlmaWNhdGUuZ2V0Tm90QWZ0ZXIoKS5jb21wYXJlVG8obmV3IERhdGUoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETywgcmVnZW5lcmF0ZSBhIG5ldyBvbmUuCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuRmluYWxfQXJjaGl2ZV9FcnJvcl9zLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFwa0J1aWxkZXJfQ2VydGlmaWNhdGVfRXhwaXJlZF9vbl9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuZ2V0SW5zdGFuY2UoKS5mb3JtYXQoY2VydGlmaWNhdGUuZ2V0Tm90QWZ0ZXIoKSkpKTsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIG1zZyk7Ci0gICAgICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGphciBidWlsZGVyLgotICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLSAgICAgICAgICAgIFNpZ25lZEphckJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTaWduZWRKYXJCdWlsZGVyKGZvcywga2V5LCBjZXJ0aWZpY2F0ZSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgY29udGFpbmluZyB0aGUgY29tcGlsZWQgcmVzb3VyY2VzLgotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5BcGtCdWlsZGVyX1BhY2thZ2luZ19zLCBpbnRlcm1lZGlhdGVBcGspKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGludGVybWVkaWF0ZUFwayk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIud3JpdGVaaXAoZmlzLCBudWxsIC8qIGZpbHRlciAqLyk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3cgd2UgYWRkIHRoZSBuZXcgZmlsZSB0byB0aGUgemlwIGFyY2hpdmUgZm9yIHRoZSBjbGFzc2VzLmRleCBmaWxlLgotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5BcGtCdWlsZGVyX1BhY2thZ2luZ19zLCBBbmRyb2lkQ29uc3RhbnRzLkZOX0NMQVNTRVNfREVYKSk7Ci0gICAgICAgICAgICBGaWxlIGVudHJ5RmlsZSA9IG5ldyBGaWxlKGRleCk7Ci0gICAgICAgICAgICBidWlsZGVyLndyaXRlRmlsZShlbnRyeUZpbGUsIEFuZHJvaWRDb25zdGFudHMuRk5fQ0xBU1NFU19ERVgpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2Ugd3JpdGUgdGhlIHN0YW5kYXJkIHJlc291cmNlcyBmcm9tIHRoZSBwcm9qZWN0IGFuZCB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cy4KLSAgICAgICAgICAgIHdyaXRlU3RhbmRhcmRSZXNvdXJjZXMoYnVpbGRlciwgamF2YVByb2plY3QsIHJlZmVyZW5jZWRKYXZhUHJvamVjdHMpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2Ugd3JpdGUgdGhlIHN0YW5kYXJkIHJlc291cmNlcyBmcm9tIHRoZSBleHRlcm5hbCBsaWJyYXJpZXMKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpYnJhcnlPc1BhdGggOiBnZXRFeHRlcm5hbEphcnMoKSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFwa0J1aWxkZXJfUGFja2FnaW5nX3MsIGxpYnJhcnlPc1BhdGgpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxpYnJhcnlPc1BhdGgpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndyaXRlWmlwKGZpcywgbUphdmFSZXNvdXJjZXNGaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHdyaXRlIHRoZSBuYXRpdmUgbGlicmFyaWVzLgotICAgICAgICAgICAgLy8gRmlyc3QgbG9vayBpZiB0aGUgbGliIGZvbGRlciBpcyB0aGVyZS4KLSAgICAgICAgICAgIElSZXNvdXJjZSBsaWJGb2xkZXIgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcihTZGtDb25zdGFudHMuRkRfTkFUSVZFX0xJQlMpOwotICAgICAgICAgICAgaWYgKGxpYkZvbGRlciAhPSBudWxsICYmIGxpYkZvbGRlci5leGlzdHMoKSAmJgotICAgICAgICAgICAgICAgICAgICBsaWJGb2xkZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rIGluc2lkZSBhbmQgcHV0IC5zbyBpbiBsaWIvKiBieSBrZWVwaW5nIHRoZSByZWxhdGl2ZSBmb2xkZXIgcGF0aC4KLSAgICAgICAgICAgICAgICB3cml0ZU5hdGl2ZUxpYnJhcmllcyhsaWJGb2xkZXIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50Q291bnQoKSwgYnVpbGRlciwgbGliRm9sZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGphciBmaWxlIGFuZCB3cml0ZSB0aGUgbWFuaWZlc3QgYW5kIHNpZ24gaXQuCi0gICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgLy8gbWFyayBwcm9qZWN0IGFuZCByZXR1cm4KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkZpbmFsX0FyY2hpdmVfRXJyb3JfcywgZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgLy8gbWFyayBwcm9qZWN0IGFuZCByZXR1cm4KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkZpbmFsX0FyY2hpdmVfRXJyb3JfcywgZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChLZXl0b29sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlTWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBtYXJrIHRoZSBwcm9qZWN0IHdpdGggdGhlIHN0YW5kYXJkIG1lc3NhZ2UKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkZpbmFsX0FyY2hpdmVfRXJyb3JfcywgZU1lc3NhZ2UpOwotICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgIC8vIG91dHB1dCBtb3JlIGluZm8gaW4gdGhlIGNvbnNvbGUKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgbXNnLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFwa0J1aWxkZXJfSkFWQV9IT01FX2lzX3MsIGUuZ2V0SmF2YUhvbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFwa0J1aWxkZXJfVXBkYXRlX29yX0V4ZWN1dGVfbWFudWFsbHlfcywKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRDb21tYW5kTGluZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlTWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBtYXJrIHRoZSBwcm9qZWN0IHdpdGggdGhlIHN0YW5kYXJkIG1lc3NhZ2UKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkZpbmFsX0FyY2hpdmVfRXJyb3JfcywgZU1lc3NhZ2UpOwotICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBhbHNvIG91dHB1dCBpdCBpbiB0aGUgY29uc29sZQotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBtc2cpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG1hcmsgcHJvamVjdCBhbmQgcmV0dXJuCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5GaW5hbF9BcmNoaXZlX0Vycm9yX3MsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdHJ5IHRvIGNhdGNoIG90aGVyIGV4Y2VwdGlvbiB0byBhY3R1YWxseSBkaXNwbGF5IGFuIGVycm9yLiBUaGlzIHdpbGwgYmUgdXNlZnVsCi0gICAgICAgICAgICAvLyBpZiB3ZSBnZXQgYW4gTlBFIG9yIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiBhdCBsZWFzdCBub3RpZnkgdGhlIHVzZXIgdGhhdCBzb21ldGhpbmcKLSAgICAgICAgICAgIC8vIHdlbnQgd3JvbmcgKG90aGVyd2lzZSB0aGUgYnVpbGQgYXBwZWFycyB0byBzdWNjZWVkIGJ1dCB0aGUgemlwIGFyY2hpdmUgaXMgbm90IGNsb3NlZAotICAgICAgICAgICAgLy8gYW5kIHRoZXJlZm9yZSBpbnZhbGlkLgotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXNnID0gU3RyaW5nLmZvcm1hdCgiVW5rbm93biBlcnJvcjogJTEkcyIsIG1zZyk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIG1zZyk7Ci0gICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgbmF0aXZlIGxpYnJhcmllcyBpbnRvIGEge0BsaW5rIFNpZ25lZEphckJ1aWxkZXJ9LgotICAgICAqIDxwLz5UaGlzIHJlY3Vyc2l2ZWx5IGdvIHRocm91Z2ggZm9sZGVyIGFuZCB3cml0ZXMgLnNvIGZpbGVzLgotICAgICAqIFRoZSBwYXRoIGluIHRoZSBhcmNoaXZlIGlzIGJhc2VkIG9uIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZSBsaWJyYXJpZXMgaW4gdGhlIHByb2plY3QuCi0gICAgICogSXRzIHNlZ21lbnQgY291bnQgaXMgcGFzc2VkIHRvIHRoZSBtZXRob2QgdG8gY29tcHV0ZSB0aGUgcmVzb3VyY2VzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3QKLSAgICAgKiBmb2xkZXIuCi0gICAgICogTmF0aXZlIGxpYnJhcmllcyBpbiB0aGUgYXJjaGl2ZSBtdXN0IGJlIGluIGEgImxpYiIgZm9sZGVyLiBFdmVyeXRoaW5nIGluIHRoZSBwcm9qZWN0IG5hdGl2ZQotICAgICAqIGxpYiBmb2xkZXIgZGlyZWN0bHkgZ29lcyBpbiB0aGlzICJsaWIiIGZvbGRlciBpbiB0aGUgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3RTZWdtZW50Q291bnQgVGhlIG51bWJlciBvZiBzZWdtZW50IG9mIHRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGUKLSAgICAgKiBsaWJyYXJpZXMuIFRoaXMgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwYXRoIGluIHRoZSBhcmNoaXZlLgotICAgICAqIEBwYXJhbSBqYXJCdWlsZGVyIHRoZSB7QGxpbmsgU2lnbmVkSmFyQnVpbGRlcn0gdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBJUmVzb3VyY2UgdG8gd3JpdGUuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU5hdGl2ZUxpYnJhcmllcyhpbnQgcm9vdFNlZ21lbnRDb3VudCwgU2lnbmVkSmFyQnVpbGRlciBqYXJCdWlsZGVyLAotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGV4dGVuc2lvbi4KLSAgICAgICAgICAgIFN0cmluZyBleHQgPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShBbmRyb2lkQ29uc3RhbnRzLkVYVF9OQVRJVkVfTElCKSkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZmlyc3Qgc2VnbWVudCB0byBidWlsZCB0aGUgcGF0aCBpbnNpZGUgdGhlIGFyY2hpdmUuCi0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290U2VnbWVudENvdW50KTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgYXJjaGl2ZS4KLSAgICAgICAgICAgICAgICBJUGF0aCBhcGtQYXRoID0gbmV3IFBhdGgoU2RrQ29uc3RhbnRzLkZEX0FQS19OQVRJVkVfTElCUyk7Ci0gICAgICAgICAgICAgICAgYXBrUGF0aCA9IGFwa1BhdGguYXBwZW5kKHBhdGgpOwotCi0gICAgICAgICAgICAgICAgLy8gd3JpdGVzIHRoZSBmaWxlIGluIHRoZSBhcGsuCi0gICAgICAgICAgICAgICAgamFyQnVpbGRlci53cml0ZUZpbGUocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSwgYXBrUGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiAmJgotICAgICAgICAgICAgICAgIGNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKChJRm9sZGVyKXJlc291cmNlKSkgewotICAgICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUZvbGRlcilyZXNvdXJjZSkubWVtYmVycygpOwotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgbWVtYmVyIDogbWVtYmVycykgewotICAgICAgICAgICAgICAgIHdyaXRlTmF0aXZlTGlicmFyaWVzKHJvb3RTZWdtZW50Q291bnQsIGphckJ1aWxkZXIsIG1lbWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHN0YW5kYXJkIHJlc291cmNlcyBvZiBhIHByb2plY3QgYW5kIGl0cyByZWZlcmVuY2VkIHByb2plY3RzCi0gICAgICogaW50byBhIHtAbGluayBTaWduZWRKYXJCdWlsZGVyfS4KLSAgICAgKiBTdGFuZGFyZCByZXNvdXJjZXMgYXJlIG5vbiBqYXZhL2FpZGwgZmlsZXMgcGxhY2VkIGluIHRoZSBqYXZhIHBhY2thZ2UgZm9sZGVycy4KLSAgICAgKiBAcGFyYW0gamFyQnVpbGRlciB0aGUge0BsaW5rIFNpZ25lZEphckJ1aWxkZXJ9LgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgamF2YVByb2plY3Qgb2JqZWN0LgotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkSmF2YVByb2plY3RzIHRoZSBqYXZhIHByb2plY3RzIHRoYXQgdGhpcyBwcm9qZWN0IHJlZmVyZW5jZXMuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0YW5kYXJkUmVzb3VyY2VzKFNpZ25lZEphckJ1aWxkZXIgamFyQnVpbGRlciwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAotICAgICAgICAgICAgSUphdmFQcm9qZWN0W10gcmVmZXJlbmNlZEphdmFQcm9qZWN0cykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gd3MuZ2V0Um9vdCgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGxpc3Qgb2YgcGF0aCBhbHJlYWR5IHB1dCBpbnRvIHRoZSBhcmNoaXZlLCBpbiBvcmRlciB0byBkZXRlY3QgY29uZmxpY3QKLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHdyaXRlU3RhbmRhcmRQcm9qZWN0UmVzb3VyY2VzKGphckJ1aWxkZXIsIGphdmFQcm9qZWN0LCB3c1Jvb3QsIGxpc3QpOwotCi0gICAgICAgIGZvciAoSUphdmFQcm9qZWN0IHJlZmVyZW5jZWRKYXZhUHJvamVjdCA6IHJlZmVyZW5jZWRKYXZhUHJvamVjdHMpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgaW5jbHVkZSBvdXRwdXQgZnJvbSBub24gYW5kcm9pZCByZWZlcmVuY2VkIHByb2plY3QKLSAgICAgICAgICAgIC8vIChUaGlzIGlzIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWZlcmVuY2UgQW5kcm9pZCBwcm9qZWN0cyBpbiB0aGUgY29udGV4dCBvZgotICAgICAgICAgICAgLy8gaW5zdHJ1bWVudGF0aW9uIHByb2plY3RzIHRoYXQgbmVlZCB0byByZWZlcmVuY2UgdGhlIHByb2plY3RzIHRvIGJlIHRlc3RlZCkuCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNlZEphdmFQcm9qZWN0LmdldFByb2plY3QoKS5oYXNOYXR1cmUoQW5kcm9pZENvbnN0YW50cy5OQVRVUkUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdGFuZGFyZFByb2plY3RSZXNvdXJjZXMoamFyQnVpbGRlciwgcmVmZXJlbmNlZEphdmFQcm9qZWN0LCB3c1Jvb3QsIGxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzdGFuZGFyZCByZXNvdXJjZXMgb2YgYSB7QGxpbmsgSUphdmFQcm9qZWN0fSBpbnRvIGEge0BsaW5rIFNpZ25lZEphckJ1aWxkZXJ9LgotICAgICAqIFN0YW5kYXJkIHJlc291cmNlcyBhcmUgbm9uIGphdmEvYWlkbCBmaWxlcyBwbGFjZWQgaW4gdGhlIGphdmEgcGFja2FnZSBmb2xkZXJzLgotICAgICAqIEBwYXJhbSBqYXJCdWlsZGVyIHRoZSB7QGxpbmsgU2lnbmVkSmFyQnVpbGRlcn0uCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhUHJvamVjdCBvYmplY3QuCi0gICAgICogQHBhcmFtIHdzUm9vdCB0aGUge0BsaW5rIElXb3Jrc3BhY2VSb290fS4KLSAgICAgKiBAcGFyYW0gbGlzdCBhIGxpc3Qgb2YgZmlsZXMgYWxyZWFkeSBhZGRlZCB0byB0aGUgYXJjaGl2ZSwgdG8gZGV0ZWN0IGNvbmZsaWN0cy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3RhbmRhcmRQcm9qZWN0UmVzb3VyY2VzKFNpZ25lZEphckJ1aWxkZXIgamFyQnVpbGRlciwKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVdvcmtzcGFjZVJvb3Qgd3NSb290LCBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBzb3VyY2UgcGF0aGVzCi0gICAgICAgIEFycmF5TGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IEJhc2VQcm9qZWN0SGVscGVyLmdldFNvdXJjZUNsYXNzcGF0aHMoamF2YVByb2plY3QpOwotCi0gICAgICAgIC8vIGxvb3Agb24gdGhlbSBhbmQgdGhlbiByZWN1cnNpdmVseSBnbyB0aHJvdWdoIHRoZSBjb250ZW50IGxvb2tpbmcgZm9yIG1hdGNoaW5nIGZpbGVzLgotICAgICAgICBmb3IgKElQYXRoIHNvdXJjZVBhdGggOiBzb3VyY2VGb2xkZXJzKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSB3c1Jvb3QuZmluZE1lbWJlcihzb3VyY2VQYXRoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VSZXNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTdGFuZGFyZFNvdXJjZUZvbGRlclJlc291cmNlcyhqYXJCdWlsZGVyLCBzb3VyY2VQYXRoLCAoSUZvbGRlcilzb3VyY2VSZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlbHkgd3JpdGVzIHRoZSBzdGFuZGFyZCByZXNvdXJjZXMgb2YgYSBzb3VyY2UgZm9sZGVyIGludG8gYSB7QGxpbmsgU2lnbmVkSmFyQnVpbGRlcn0uCi0gICAgICogU3RhbmRhcmQgcmVzb3VyY2VzIGFyZSBub24gamF2YS9haWRsIGZpbGVzIHBsYWNlZCBpbiB0aGUgamF2YSBwYWNrYWdlIGZvbGRlcnMuCi0gICAgICogQHBhcmFtIGphckJ1aWxkZXIgdGhlIHtAbGluayBTaWduZWRKYXJCdWlsZGVyfS4KLSAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVyIHRoZSB7QGxpbmsgSVBhdGh9IG9mIHRoZSBzb3VyY2UgZm9sZGVyLgotICAgICAqIEBwYXJhbSBjdXJyZW50Rm9sZGVyIFRoZSBjdXJyZW50IGZvbGRlciB3ZSdyZSByZWN1cnNpdmVseSBwcm9jZXNzaW5nLgotICAgICAqIEBwYXJhbSBsaXN0IGEgbGlzdCBvZiBmaWxlcyBhbHJlYWR5IGFkZGVkIHRvIHRoZSBhcmNoaXZlLCB0byBkZXRlY3QgY29uZmxpY3RzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVTdGFuZGFyZFNvdXJjZUZvbGRlclJlc291cmNlcyhTaWduZWRKYXJCdWlsZGVyIGphckJ1aWxkZXIsIElQYXRoIHNvdXJjZUZvbGRlciwKLSAgICAgICAgICAgIElGb2xkZXIgY3VycmVudEZvbGRlciwgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjdXJyZW50Rm9sZGVyLm1lbWJlcnMoKTsKLQotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgbWVtYmVyIDogbWVtYmVycykgewotICAgICAgICAgICAgICAgIGludCB0eXBlID0gbWVtYmVyLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJiBtZW1iZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZUZvclBhY2thZ2luZygoSUZpbGUpbWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBmaWxlcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggZnVsbFBhdGggPSBtZW1iZXIuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgaXRzIHBhdGggaW5zaWRlIHRoZSBhcmNoaXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcmVsYXRpdmVQYXRoID0gZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRm9sZGVyLnNlZ21lbnRDb3VudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB6aXBQYXRoID0gcmVsYXRpdmVQYXRoLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHMgY2hlY2sgaXQncyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiBwYXRoIGFkZGVkIHRvIHRoZSBhcmNoaXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKHppcFBhdGgpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuQXBrQnVpbGRlcl9zX0NvbmZsaWN0X3dpdGhfZmlsZV9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUGF0aCwgemlwUGF0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEZpbGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBlbnRyeUZpbGUgPSBtZW1iZXIuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFwa0J1aWxkZXJfUGFja2FnaW5nX3NfaW50b19zLCBmdWxsUGF0aCwgemlwUGF0aCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgaXQgaW4gdGhlIHppcCBhcmNoaXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyQnVpbGRlci53cml0ZUZpbGUoZW50cnlGaWxlLCB6aXBQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgZW50cmllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHppcFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKChJRm9sZGVyKW1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RhbmRhcmRTb3VyY2VGb2xkZXJSZXNvdXJjZXMoamFyQnVpbGRlciwgc291cmNlRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUZvbGRlciltZW1iZXIsIGxpc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGdldCB0aGUgbWVtYmVycyBvZiB0aGUgZm9sZGVyLCB3ZSBqdXN0IGRvbid0IGRvIGFueXRoaW5nLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgb3V0cHV0IGZvbGRlcnMgZm9yIHRoZSBzcGVjaWZpZWQge0BsaW5rIElKYXZhUHJvamVjdH0gb2JqZWN0cywgaWYKLSAgICAgKiB0aGV5IGFyZSBBbmRyb2lkIHByb2plY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZWRKYXZhUHJvamVjdHMgdGhlIGphdmEgcHJvamVjdHMuCi0gICAgICogQHJldHVybiBhbiBhcnJheSwgYWx3YXlzLiBDYW4gYmUgZW1wdHkuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRQcm9qZWN0T3V0cHV0cyhJSmF2YVByb2plY3RbXSByZWZlcmVuY2VkSmF2YVByb2plY3RzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSB3cy5nZXRSb290KCk7Ci0KLSAgICAgICAgZm9yIChJSmF2YVByb2plY3QgamF2YVByb2plY3QgOiByZWZlcmVuY2VkSmF2YVByb2plY3RzKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGluY2x1ZGUgb3V0cHV0IGZyb20gbm9uIGFuZHJvaWQgcmVmZXJlbmNlZCBwcm9qZWN0Ci0gICAgICAgICAgICAvLyAoVGhpcyBpcyB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVmZXJlbmNlIEFuZHJvaWQgcHJvamVjdHMgaW4gdGhlIGNvbnRleHQgb2YKLSAgICAgICAgICAgIC8vIGluc3RydW1lbnRhdGlvbiBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSBwcm9qZWN0cyB0byBiZSB0ZXN0ZWQpLgotICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5oYXNOYXR1cmUoQW5kcm9pZENvbnN0YW50cy5OQVRVUkUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBvdXRwdXQgZm9sZGVyCi0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSVJlc291cmNlIG91dHB1dFJlc291cmNlID0gd3NSb290LmZpbmRNZW1iZXIocGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFJlc291cmNlICE9IG51bGwgJiYgb3V0cHV0UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dE9zUGF0aCA9IG91dHB1dFJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG91dHB1dE9zUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgSUphdmFQcm9qZWN0fSBtYXRjaGluZyB0aGUgcHJvdmlkZWQge0BsaW5rIElQcm9qZWN0fSBvYmplY3RzLgotICAgICAqIEBwYXJhbSBwcm9qZWN0cyB0aGUgSVByb2plY3Qgb2JqZWN0cy4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5LCBhbHdheXMuIENhbiBiZSBlbXB0eS4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdFtdIGdldEphdmFQcm9qZWN0cyhJUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxJSmF2YVByb2plY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4oKTsKLQotICAgICAgICBmb3IgKElQcm9qZWN0IHAgOiBwcm9qZWN0cykgewotICAgICAgICAgICAgaWYgKHAuaXNPcGVuKCkgJiYgcC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQoSmF2YUNvcmUuY3JlYXRlKHApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IElKYXZhUHJvamVjdFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhIHtAbGluayBJRmlsZX0gdG8gbWFrZSBzdXJlIGl0IHNob3VsZCBiZSBwYWNrYWdlZCBhcyBzdGFuZGFyZCByZXNvdXJjZXMuCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIElGaWxlIHJlcHJlc2VudGluZyB0aGUgZmlsZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHBhY2thZ2VkIGFzIHN0YW5kYXJkIGphdmEgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrRmlsZUZvclBhY2thZ2luZyhJRmlsZSBmaWxlKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICByZXR1cm4gSmF2YVJlc291cmNlRmlsdGVyLmNoZWNrRmlsZUZvclBhY2thZ2luZyhuYW1lLCBleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIHtAbGluayBJRm9sZGVyfSBhbmQgaXRzIGNvbnRlbnQgaXMgdmFsaWQgZm9yIHBhY2thZ2luZyBpbnRvIHRoZSAuYXBrIGFzCi0gICAgICogc3RhbmRhcmQgSmF2YSByZXNvdXJjZS4KLSAgICAgKiBAcGFyYW0gZm9sZGVyIHRoZSB7QGxpbmsgSUZvbGRlcn0gdG8gY2hlY2suCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gY2hlY2tGb2xkZXJGb3JQYWNrYWdpbmcoSUZvbGRlciBmb2xkZXIpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmb2xkZXIuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gSmF2YVJlc291cmNlRmlsdGVyLmNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGFib3J0T25CYWRTZXR1cChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmFib3J0T25CYWRTZXR1cChwcm9qZWN0KTsKLQotICAgICAgICAvLyBmb3IgdGhpcyB2ZXJzaW9uLCB3ZSBzdG9wIG9uIGFueSBtYXJrZXIgKGllIGFsc28gbWFya2VycyBjb21pbmcgZnJvbSBKRFQpCi0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhudWxsIC8qdHlwZSovLCBmYWxzZSAvKmluY2x1ZGVTdWJ0eXBlcyovLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQotICAgICAgICBpZiAobWFya2Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBzdG9wQnVpbGQoIiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Fwa0RlbHRhVmlzaXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Fwa0RlbHRhVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZDkxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9BcGtEZWx0YVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZC5CYXNlQnVpbGRlci5CYXNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBEZWx0YSByZXNvdXJjZSB2aXNpdG9yIGxvb2tpbmcgZm9yIGNoYW5nZXMgdGhhdCB3aWxsIHRyaWdnZXIgYSBuZXcgcGFja2FnaW5nIG9mIGFuIEFuZHJvaWQKLSAqIGFwcGxpY2F0aW9uLgotICogPHAvPgotICogVGhpcyBsb29rcyBmb3IgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotICogPHVsPgotICogPGxpPkFueSBjaGFuZ2UgdG8gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZTwvbGk+Ci0gKiA8bGk+QW55IGNoYW5nZSBpbnNpZGUgdGhlIGFzc2V0cy8gZm9sZGVyPC9saT4KLSAqIDxsaT5BbnkgZmlsZSBjaGFuZ2UgaW5zaWRlIHRoZSByZXMvIGZvbGRlcjwvbGk+Ci0gKiA8bGk+QW55IC5jbGFzcyBmaWxlIGNoYW5nZSBpbnNpZGUgdGhlIG91dHB1dCBmb2xkZXI8L2xpPgotICogPGxpPkFueSBjaGFuZ2UgdG8gdGhlIGNsYXNzZXMuZGV4IGluc2lkZSB0aGUgb3V0cHV0IGZvbGRlcjwvbGk+Ci0gKiA8bGk+QW55IGNoYW5nZSB0byB0aGUgcGFja2FnZWQgcmVzb3VyY2VzIGZpbGUgaW5zaWRlIHRoZSBvdXRwdXQgZm9sZGVyPC9saT4KLSAqIDxsaT5BbnkgY2hhbmdlIHRvIGEgbm9uIGphdmEvYWlkbCBmaWxlIGluc2lkZSB0aGUgc291cmNlIGZvbGRlcnM8L2xpPgotICogPGxpPkFueSBjaGFuZ2UgdG8gLnNvIGZpbGUgaW5zaWRlIHRoZSBsaWIgKG5hdGl2ZSBsaWJyYXJ5KSBmb2xkZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEFwa0RlbHRhVmlzaXRvciBleHRlbmRzIEJhc2VEZWx0YVZpc2l0b3IKLSAgICAgICAgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0gICAgLyoqCi0gICAgICogY29tcGlsZSBmbGFnLiBUaGlzIGlzIHNldCB0byB0cnVlIGlmIG9uZSBvZiB0aGUgY2hhbmdlZC9hZGRlZC9yZW1vdmVkCi0gICAgICogZmlsZSBpcyBhIC5jbGFzcyBmaWxlLiBVcG9uIHZpc2l0aW5nIGFsbCB0aGUgZGVsdGEgcmVzb3VyY2VzLCBpZiB0aGlzCi0gICAgICogZmxhZyBpcyB0cnVlLCB0aGVuIHdlIGtub3cgd2UnbGwgaGF2ZSB0byBtYWtlIHRoZSAiY2xhc3Nlcy5kZXgiIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Db252ZXJ0VG9EZXggPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIGNvbXBpbGUgZmxhZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNoYW5nZWQvYWRkZWQvcmVtb3ZlZAotICAgICAqIGZpbGUgaXMgYSByZXNvdXJjZSBmaWxlLiBVcG9uIHZpc2l0aW5nIGFsbCB0aGUgZGVsdGEgcmVzb3VyY2VzLCBpZgotICAgICAqIHRoaXMgZmxhZyBpcyB0cnVlLCB0aGVuIHdlIGtub3cgd2UnbGwgaGF2ZSB0byBtYWtlIHRoZSBpbnRlcm1lZGlhdGUKLSAgICAgKiBhcGsgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhY2thZ2VSZXNvdXJjZXMgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGaW5hbCBwYWNrYWdlIGZsYWcuIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgb25lIG9mIHRoZSBjaGFuZ2VkL2FkZGVkL3JlbW92ZWQKLSAgICAgKiBmaWxlIGlzIGEgbm9uIGphdmEgZmlsZSAob3IgYWlkbCkgaW4gdGhlIHJlc291cmNlIGZvbGRlci4gVXBvbiB2aXNpdGluZyBhbGwgdGhlCi0gICAgICogZGVsdGEgcmVzb3VyY2VzLCBpZiB0aGlzIGZsYWcgaXMgdHJ1ZSwgdGhlbiB3ZSBrbm93IHdlJ2xsIGhhdmUgdG8gbWFrZSB0aGUgZmluYWwKLSAgICAgKiBwYWNrYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWFrZUZpbmFsUGFja2FnZSA9IGZhbHNlOwotCi0gICAgLyoqIExpc3Qgb2Ygc291cmNlIGZvbGRlcnMuICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SVBhdGg+IG1Tb3VyY2VGb2xkZXJzOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBtT3V0cHV0UGF0aDsKLQotICAgIHByaXZhdGUgSVBhdGggbUFzc2V0UGF0aDsKLQotICAgIHByaXZhdGUgSVBhdGggbVJlc1BhdGg7Ci0KLSAgICBwcml2YXRlIElQYXRoIG1MaWJGb2xkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIG91dHB1dCBmb2xkZXIuCi0gICAgICogQHBhcmFtIGJ1aWxkZXIgdGhlIHhtbCBidWlsZGVyIHVzaW5nIHRoaXMgb2JqZWN0IHRvIHZpc2l0IHRoZQotICAgICAqICByZXNvdXJjZSBkZWx0YS4KLSAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVycyB0aGUgbGlzdCBvZiBzb3VyY2UgZm9sZGVycyBmb3IgdGhlIHByb2plY3QsIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIG91dHB1dGZvbGRlciB0aGUgb3V0cHV0IGZvbGRlciBvZiB0aGUgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBrRGVsdGFWaXNpdG9yKEJhc2VCdWlsZGVyIGJ1aWxkZXIsIEFycmF5TGlzdDxJUGF0aD4gc291cmNlRm9sZGVycywKLSAgICAgICAgICAgIElGb2xkZXIgb3V0cHV0Zm9sZGVyKSB7Ci0gICAgICAgIHN1cGVyKGJ1aWxkZXIpOwotICAgICAgICBtU291cmNlRm9sZGVycyA9IHNvdXJjZUZvbGRlcnM7Ci0gICAgICAgIAotICAgICAgICBpZiAob3V0cHV0Zm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdXRwdXRQYXRoID0gb3V0cHV0Zm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElSZXNvdXJjZSBhc3NldEZvbGRlciA9IGJ1aWxkZXIuZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoU2RrQ29uc3RhbnRzLkZEX0FTU0VUUyk7Ci0gICAgICAgIGlmIChhc3NldEZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQXNzZXRQYXRoID0gYXNzZXRGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZSByZXNGb2xkZXIgPSBidWlsZGVyLmdldFByb2plY3QoKS5maW5kTWVtYmVyKFNka0NvbnN0YW50cy5GRF9SRVNPVVJDRVMpOwotICAgICAgICBpZiAocmVzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXNQYXRoID0gcmVzRm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElSZXNvdXJjZSBsaWJGb2xkZXIgPSBidWlsZGVyLmdldFByb2plY3QoKS5maW5kTWVtYmVyKFNka0NvbnN0YW50cy5GRF9OQVRJVkVfTElCUyk7Ci0gICAgICAgIGlmIChsaWJGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpYkZvbGRlciA9IGxpYkZvbGRlci5nZXRGdWxsUGF0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q29udmVydFRvRGV4KCkgewotICAgICAgICByZXR1cm4gbUNvbnZlcnRUb0RleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYWNrYWdlUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gbVBhY2thZ2VSZXNvdXJjZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldE1ha2VGaW5hbFBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtTWFrZUZpbmFsUGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IKLSAgICAgKiAgICAgICN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBpZiBhbGwgZmxhZ3MgYXJlIHRydWUsIHdlIGNhbiBzdG9wIGdvaW5nIHRocm91Z2ggdGhlIHJlc291cmNlIGRlbHRhLgotICAgICAgICBpZiAobUNvbnZlcnRUb0RleCAmJiBtUGFja2FnZVJlc291cmNlcyAmJiBtTWFrZUZpbmFsUGFja2FnZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgYXJlIG9ubHkgZ29pbmcgdG8gbG9vayBmb3IgY2hhbmdlcyBpbiByZXMvLCBzcmMvIGFuZCBpbgotICAgICAgICAvLyBBbmRyb2lkTWFuaWZlc3QueG1sIHNpbmNlIHRoZSBkZWx0YSB2aXNpdG9yIGdvZXMgdGhyb3VnaCB0aGUgbWFpbgotICAgICAgICAvLyBmb2xkZXIgYmVmb3JlIGl0cyBjaGlsZHJlIHdlIGNhbiBjaGVjayB3aGVuIHRoZSBwYXRoIHNlZ21lbnQKLSAgICAgICAgLy8gY291bnQgaXMgMiAoZm9ybWF0IHdpbGwgYmUgLyRQcm9qZWN0L2ZvbGRlcikgYW5kIG1ha2Ugc3VyZSB3ZSBhcmUKLSAgICAgICAgLy8gcHJvY2Vzc2luZyByZXMvLCBzcmMvIG9yIEFuZHJvaWRNYW5pZmVzdC54bWwKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIFN0cmluZ1tdIHBhdGhTZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsKLSAgICAgICAgaW50IHR5cGUgPSByZXNvdXJjZS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIHZpc2l0b3IgYWxzbyB2aXNpdHMgdGhlIHJvb3Qgd2UgcmV0dXJuIHRydWUgaWYKLSAgICAgICAgLy8gc2VnbWVudHMubGVuZ3RoID0gMQotICAgICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBtYW5pZmVzdC4KLSAgICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT0gMiAmJgotICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVC5lcXVhbHNJZ25vcmVDYXNlKHBhdGhTZWdtZW50c1sxXSkpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBtYW5pZmVzdCBjaGFuZ2VkIHdlIGhhdmUgdG8gcmVwYWNrYWdlIHRoZQotICAgICAgICAgICAgLy8gcmVzb3VyY2VzLgotICAgICAgICAgICAgbVBhY2thZ2VSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGdvIHRvIHRoZSBjaGlsZHJlbiwgbm90IGxpa2UgdGhleSBhcmUKLSAgICAgICAgICAgIC8vIGFueSBmb3IgdGhpcyByZXNvdXJjZSBhbnl3YXkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRoZSBvdGhlciBmb2xkZXJzLgotICAgICAgICBpZiAobU91dHB1dFBhdGggIT0gbnVsbCAmJiBtT3V0cHV0UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0gICAgICAgICAgICAvLyBhIHJlc291cmNlIGNoYW5nZWQgaW5zaWRlIHRoZSBvdXRwdXQgZm9sZGVyLgotICAgICAgICAgICAgaWYgKHR5cGUgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHRoaXMgaXMgYSAuY2xhc3MgZmlsZS4gQW55IG1vZGlmaWNhdGlvbiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBhIGNoYW5nZSBpbiB0aGUgY2xhc3Nlcy5kZXggZmlsZQotICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRDb25zdGFudHMuRVhUX0NMQVNTLmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udmVydFRvRGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIHRoZSBjaGlsZHJlbiwgYXMgd2UgYXJlIGluIGEgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgY2FuIG9ubHkgYmUgc3VicGFja2FnZSBjaGlsZHJlbiBjb250YWluaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgLmNsYXNzIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBmZXcgZmlsZXMgZGlyZWN0bHkgaW4gdGhlIG91dHB1dCBmb2xkZXIgYW5kIGZvcmNlCi0gICAgICAgICAgICAgICAgLy8gcmVidWlsZCBpZiB0aGV5IGhhdmUgYmVlbiBkZWxldGVkLgotICAgICAgICAgICAgICAgIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXJlbnRQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0UGF0aC5lcXVhbHMocGFyZW50UGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjbGFzc2VzLmRleCB3YXMgcmVtb3ZlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFuZHJvaWRDb25zdGFudHMuRk5fQ0xBU1NFU19ERVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRUb0RleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5GTl9SRVNPVVJDRVNfQVBfKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLlBBVFRFUk5fUkVTT1VSQ0VTX1NfQVBfLm1hdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiB0aGUgZGVmYXVsdCByZXNvdXJjZXMuYXBfIG9yIGEgY29uZmlndXJlZCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHJlc291cmNlcy0jIyMuYXBfKSB3YXMgcmVtb3ZlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVJlc291cmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZm9sZGVyLCB3ZSBvbmx5IGdvIHZpc2l0IGl0IGlmIHdlIGRvbid0IGFscmVhZHkga25vdwotICAgICAgICAgICAgLy8gdGhhdCB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8gZGV4IGFscmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gbUNvbnZlcnRUb0RleCA9PSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVzUGF0aCAhPSBudWxsICYmIG1SZXNQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLSAgICAgICAgICAgIC8vIGluIHRoZSByZXMgZm9sZGVyIHdlIGFyZSBsb29raW5nIGZvciBhbnkgZmlsZSBtb2RpZmljYXRpb24KLSAgICAgICAgICAgIC8vICh3ZSBkb24ndCBjYXJlIGFib3V0IGZvbGRlciBiZWluZyBhZGRlZC9yZW1vdmVkLCBvbmx5IGNvbnRlbnQKLSAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCkKLSAgICAgICAgICAgIGlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgbVBhY2thZ2VSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1NYWtlRmluYWxQYWNrYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZvciBmb2xkZXJzLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkga25vdyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAvLyBwYWNrYWdlIHRoZSByZXNvdXJjZXMuCi0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VSZXNvdXJjZXMgPT0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAobUFzc2V0UGF0aCAhPSBudWxsICYmIG1Bc3NldFBhdGguaXNQcmVmaXhPZihwYXRoKSkgewotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgYXNzZXRzIGZvbGRlciB0aGF0IHdhcyBtb2RpZmllZC4KLSAgICAgICAgICAgIC8vIHdlIGRvbid0IGNhcmUgd2hhdCBjb250ZW50IHdhcyBjaGFuZ2VkLiBBbGwgd2UgY2FyZQotICAgICAgICAgICAgLy8gYWJvdXQgaXMgdGhhdCBzb21ldGhpbmcgY2hhbmdlZCBpbnNpZGUuIE5vIG5lZWQgdG8gdmlzaXQKLSAgICAgICAgICAgIC8vIHRoZSBjaGlsZHJlbiBldmVuLgotICAgICAgICAgICAgbVBhY2thZ2VSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG1MaWJGb2xkZXIgIT0gbnVsbCAmJiBtTGliRm9sZGVyLmlzUHJlZml4T2YocGF0aCkpIHsKLSAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgbmF0aXZlIGxpYnJhcnkgZm9sZGVyLiBUZXN0IGlmIHRoZSBjaGFuZ2VkIHJlc291cmNlIGlzIGEgLnNvIGZpbGUuCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJgotICAgICAgICAgICAgICAgICAgICBwYXRoLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKEFuZHJvaWRDb25zdGFudHMuRVhUX05BVElWRV9MSUIpKSB7Ci0gICAgICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlIGZvciBmaWxlLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3IgZm9sZGVycywgcmV0dXJuIHRydWUgb25seSBpZiB3ZSBkb24ndCBhbHJlYWR5IGtub3cgd2UgaGF2ZSB0byBtYWtlIHRoZQotICAgICAgICAgICAgLy8gZmluYWwgcGFja2FnZS4KLSAgICAgICAgICAgIHJldHVybiBtTWFrZUZpbmFsUGFja2FnZSA9PSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGZvbGRlciB0aGF0IGlzIG5laXRoZXIgdGhlIHJlc291cmNlIGZvbGRlcnMsIG5vciB0aGUgb3V0cHV0LgotICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBhbGwgdGhlIHNvdXJjZSBmb2xkZXJzLCB1bmxlc3Mgd2UgYWxyZWFkeSBrbm93IHdlIG5lZWQgdG8gZG8KLSAgICAgICAgICAgIC8vIHRoZSBmaW5hbCBwYWNrYWdlLgotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIHNvdXJjZSBmb2xkZXIgb3IgYSBmb2xkZXIgbGVhZGluZyB0byBhIHNvdXJjZSBmb2xkZXIuCi0gICAgICAgICAgICAvLyBIb3dldmVyIHdlIG9ubHkgY2hlY2sgdGhpcyBpZiB3ZSBkb24ndCBhbHJlYWR5IGtub3cgdGhhdCB3ZSBuZWVkIHRvIGJ1aWxkIHRoZQotICAgICAgICAgICAgLy8gcGFja2FnZSBhbnl3YXkKLSAgICAgICAgICAgIGlmIChtTWFrZUZpbmFsUGFja2FnZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGZvciAoSVBhdGggc291cmNlUGF0aCA6IG1Tb3VyY2VGb2xkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBzb3VyY2UgZm9sZGVycywgd2UgYXJlIGxvb2tpbmcgZm9yIGFueSBraW5kIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gcmVsYXRlZCB0byBmaWxlIHRoYXQgYXJlIG5vdCBqYXZhIGZpbGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBleGNsdWRlZCBhcmUgYWlkbCBmaWxlcywgYW5kIHBhY2thZ2UuaHRtbCBmaWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gSVJlc291cmNlLkZPTERFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyB2aXNpdCB0aGUgc3ViZm9sZGVycywgdW5sZXNzIHRoZSBmb2xkZXIgaXMgbm90IHRvIGJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFwa0J1aWxkZXIuY2hlY2tGb2xkZXJGb3JQYWNrYWdpbmcoKElGb2xkZXIpcmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFwa0J1aWxkZXIuY2hlY2tGaWxlRm9yUGFja2FnaW5nKChJRmlsZSlyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ha2VGaW5hbFBhY2thZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBpZiB0aGUgZm9sZGVyIGlzIG5vdCBpbnNpZGUgb25lIG9mIHRoZSBmb2xkZXJzIHdlIGFyZSBpbnRlcmVzdGVkIGluIChyZXMsIGFzc2V0cywgb3V0cHV0LAotICAgICAgICAvLyBzb3VyY2UgZm9sZGVycyksIGl0IGNvdWxkIGJlIGEgZm9sZGVyIGxlYWRpbmcgdG8gdGhlbSwgc28gd2UgcmV0dXJuIHRydWUuCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9CYXNlQnVpbGRlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Jhc2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTJkNGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Jhc2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYnVpbGQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0Q29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5YbWxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuWG1sRXJyb3JIYW5kbGVyLlhtbEVycm9yTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5Mb2FkU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLS8qKgotICogQmFzZSBidWlsZGVyIGZvciBYTUwgZmlsZXMuIFRoaXMgY2xhc3MgYWxsb3dzIGZvciBiYXNpYyBYTUwgcGFyc2luZyB3aXRoCi0gKiBlcnJvciBjaGVja2luZyBhbmQgbWFya2luZyB0aGUgZmlsZXMgZm9yIGVycm9ycy93YXJuaW5ncy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKLQotICAgIC8vIFRPRE86IHJlbmFtZSB0aGUgcGF0dGVybiB0byBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZSArIGphdmFkb2MgY29tbWVudHMuCi0KLSAgICAvKioKLSAgICAgKiBTaW5nbGUgbGluZSBhYXB0IHdhcm5pbmcgZm9yIHNraXBwaW5nIGZpbGVzLjxicj4KLSAgICAgKiAiICAoc2tpcHBpbmcgaGlkZGVuIGZpbGUgJyZsdDtmaWxlIHBhdGgmZ3Q7JyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuMExpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl5cXHMrXFwoc2tpcHBpbmcgaGlkZGVuIGZpbGVcXHMnKC4qKSdcXCkkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIEZpcnN0IGxpbmUgb2YgZHVhbCBsaW5lIGFhcHQgZXJyb3IuPGJyPgotICAgICAqICJFUlJPUiBhdCBsaW5lICZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyI8YnI+Ci0gICAgICogIiAoT2NjdXJyZWQgd2hpbGUgcGFyc2luZyAmbHQ7cGF0aCZndDspIgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BhdHRlcm4xTGluZTEgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXkVSUk9SXFxzK2F0XFxzK2xpbmVcXHMrKFxcZCspOlxccysoLiopJCIpOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogU2Vjb25kIGxpbmUgb2YgZHVhbCBsaW5lIGFhcHQgZXJyb3IuPGJyPgotICAgICAqICJFUlJPUiBhdCBsaW5lICZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyI8YnI+Ci0gICAgICogIiAoT2NjdXJyZWQgd2hpbGUgcGFyc2luZyAmbHQ7cGF0aCZndDspIjxicj4KLSAgICAgKiBAc2VlICNzUGF0dGVybjFMaW5lMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BhdHRlcm4xTGluZTIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXlxccytcXChPY2N1cnJlZCB3aGlsZSBwYXJzaW5nXFxzKyguKilcXCkkIik7ICAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogRmlyc3QgbGluZSBvZiBkdWFsIGxpbmUgYWFwdCBlcnJvci48YnI+Ci0gICAgICogIkVSUk9SOiAmbHQ7ZXJyb3ImZ3Q7Ijxicj4KLSAgICAgKiAiRGVmaW5lZCBhdCBmaWxlICZsdDtwYXRoJmd0OyBsaW5lICZsdDtsaW5lJmd0OyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuMkxpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl5FUlJPUjpcXHMrKC4rKSQiKTsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNlY29uZCBsaW5lIG9mIGR1YWwgbGluZSBhYXB0IGVycm9yLjxicj4KLSAgICAgKiAiRVJST1I6ICZsdDtlcnJvciZndDsiPGJyPgotICAgICAqICJEZWZpbmVkIGF0IGZpbGUgJmx0O3BhdGgmZ3Q7IGxpbmUgJmx0O2xpbmUmZ3Q7Ijxicj4KLSAgICAgKiBAc2VlICNzUGF0dGVybjJMaW5lMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BhdHRlcm4yTGluZTIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiRGVmaW5lZFxccythdFxccytmaWxlXFxzKyguKylcXHMrbGluZVxccysoXFxkKykiKTsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNpbmdsZSBsaW5lIGFhcHQgZXJyb3I8YnI+Ci0gICAgICogIiZsdDtwYXRoJmd0OyBsaW5lICZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuM0xpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4oLispXFxzbGluZVxccyhcXGQrKTpcXHMoLispJCIpOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogRmlyc3QgbGluZSBvZiBkdWFsIGxpbmUgYWFwdCBlcnJvci48YnI+Ci0gICAgICogIkVSUk9SIHBhcnNpbmcgWE1MIGZpbGUgJmx0O3BhdGgmZ3Q7Ijxicj4KLSAgICAgKiAiJmx0O2Vycm9yJmd0OyBhdCBsaW5lICZsdDtsaW5lJmd0OyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuNExpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl5FcnJvclxccytwYXJzaW5nXFxzK1hNTFxccytmaWxlXFxzKC4rKSQiKTsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNlY29uZCBsaW5lIG9mIGR1YWwgbGluZSBhYXB0IGVycm9yLjxicj4KLSAgICAgKiAiRVJST1IgcGFyc2luZyBYTUwgZmlsZSAmbHQ7cGF0aCZndDsiPGJyPgotICAgICAqICImbHQ7ZXJyb3ImZ3Q7IGF0IGxpbmUgJmx0O2xpbmUmZ3Q7Ijxicj4KLSAgICAgKiBAc2VlICNzUGF0dGVybjRMaW5lMQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BhdHRlcm40TGluZTIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXiguKylcXHMrYXRcXHMrbGluZVxccysoXFxkKykkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFNpbmdsZSBsaW5lIGFhcHQgd2FybmluZzxicj4KLSAgICAgKiAiJmx0O3BhdGgmZ3Q7OiZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuNUxpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4oLis/KTooXFxkKyk6XFxzK1dBUk5JTkc6KC4rKSQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU2luZ2xlIGxpbmUgYWFwdCBlcnJvcjxicj4KLSAgICAgKiAiJmx0O3BhdGgmZ3Q7OiZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuNkxpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4oLis/KTooXFxkKyk6XFxzKyguKykkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIDQgbGluZSBhYXB0IGVycm9yPGJyPgotICAgICAqICJFUlJPUjogOS1wYXRoIGltYWdlICZsdDtwYXRoJmd0OyBtYWxmb3JtZWQiPGJyPgotICAgICAqIExpbmUgMiBhbmQgMyBhcmUgdGFrZW4gYXMtaXMgd2hpbGUgbGluZSA0IGlzIGlnbm9yZWQgKGl0IHJlcGVhdHMgd2l0aDxicj4KLSAgICAgKiAnRVJST1I6IGZhaWx1cmUgcHJvY2Vzc2luZyAmbHQ7cGF0aCZndDspCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzUGF0dGVybjdMaW5lMSA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJeRVJST1I6XFxzKzktcGF0Y2hcXHMraW1hZ2VcXHMrKC4rKVxccyttYWxmb3JtZWRcXC4kIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc1BhdHRlcm44TGluZTEgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXihpbnZhbGlkIHJlc291cmNlIGRpcmVjdG9yeSBuYW1lKTogKC4qKSQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogMiBsaW5lIGFhcHQgZXJyb3I8YnI+Ci0gICAgICogIkVSUk9SOiBJbnZhbGlkIGNvbmZpZ3VyYXRpb246IGZvbyI8YnI+Ci0gICAgICogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXiI8YnI+Ci0gICAgICogVGhlcmUncyBubyBuZWVkIHRvIHBhcnNlIHRoZSAybmQgbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXR0ZXJuOUxpbmUxID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl5JbnZhbGlkIGNvbmZpZ3VyYXRpb246ICguKykkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBTQVggUGFyc2VyIGZhY3RvcnkuICovCi0gICAgcHJpdmF0ZSBTQVhQYXJzZXJGYWN0b3J5IG1QYXJzZXJGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogQmFzZSBSZXNvdXJjZSBEZWx0YSBWaXNpdG9yIHRvIGhhbmRsZSBYTUwgZXJyb3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJhc2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBYbWxFcnJvckxpc3RlbmVyIHsKLQotICAgICAgICAvKiogVGhlIFhtbCBidWlsZGVyIHVzZWQgdG8gdmFsaWRhdGUgWE1MIGNvcnJlY3RuZXNzLiAqLwotICAgICAgICBwcm90ZWN0ZWQgQmFzZUJ1aWxkZXIgbUJ1aWxkZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFhNTCBlcnJvciBmbGFnLiBpZiB0cnVlLCB3ZSBrZWVwIHBhcnNpbmcgdGhlIFJlc291cmNlRGVsdGEgYnV0IHRoZQotICAgICAgICAgKiBjb21waWxhdGlvbiB3aWxsIG5vdCBoYXBwZW4gKHdlJ3JlIHB1dHRpbmcgbWFya2VycykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1YbWxFcnJvciA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBCYXNlRGVsdGFWaXNpdG9yKEJhc2VCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyID0gYnVpbGRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5kcyBhIG1hdGNoaW5nIFNvdXJjZSBmb2xkZXIgZm9yIHRoZSBjdXJyZW50IHBhdGguIFRoaXMgY2hlY2tkcyBpZiB0aGUgY3VycmVudCBwYXRoCi0gICAgICAgICAqIGxlYWRzIHRvLCBvciBpcyBhIHNvdXJjZSBmb2xkZXIuCi0gICAgICAgICAqIEBwYXJhbSBzb3VyY2VGb2xkZXJzIFRoZSBsaXN0IG9mIHNvdXJjZSBmb2xkZXJzCi0gICAgICAgICAqIEBwYXJhbSBwYXRoU2VnbWVudHMgVGhlIHNlZ21lbnRzIG9mIHRoZSBjdXJyZW50IHBhdGgKLSAgICAgICAgICogQHJldHVybiBUaGUgc2VnbWVudHMgb2YgdGhlIHNvdXJjZSBmb2xkZXIsIG9yIG51bGwgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGZpbmRNYXRjaGluZ1NvdXJjZUZvbGRlcihBcnJheUxpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlcnMsCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGF0aFNlZ21lbnRzKSB7Ci0KLSAgICAgICAgICAgIGZvciAoSVBhdGggcCA6IHNvdXJjZUZvbGRlcnMpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgaW5zaWRlIG9uZSBvZiB0aG9zZSBzb3VyY2UgY2xhc3MgcGF0aAotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWdtZW50cwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNyY1NlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcGFyZSBzZWdtZW50cy4gV2Ugd2FudCB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSB2aXNpdGluZyB0byBiZQotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBzZWdtZW50Q291bnQgPSBwYXRoU2VnbWVudHMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2VnbWVudENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMxID0gcGF0aFNlZ21lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgczIgPSBzcmNTZWdtZW50c1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoczEuZXF1YWxzSWdub3JlQ2FzZShzMikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh2YWxpZCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZvbGRlciwgb3Igb25lIG9mIHRoaXMgY2hpbGRyZW4gaXMgYSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGVyIQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZXR1cm4gaXRzIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmNTZWdtZW50czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhbiBYTUwgZXJyb3IgaXMgZGV0ZWN0ZWQuCi0gICAgICAgICAqIEBzZWUgWG1sRXJyb3JMaXN0ZW5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3JGb3VuZCgpIHsKLSAgICAgICAgICAgIG1YbWxFcnJvciA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFzZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1QYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIEZJWE1FIHdoZW4gdGhlIGNvbXBpbGVkIFhNTCBzdXBwb3J0IGZvciBuYW1lc3BhY2UgaXMgaW4sIHNldCB0aGlzIHRvIHRydWUuCi0gICAgICAgIG1QYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgYW4gWG1sIGZpbGUgZm9yIHZhbGlkaXR5LiBFcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBtYXJrZWQgb24gdGhlCi0gICAgICogZmlsZQotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gY2hlY2sKLSAgICAgKiBAcGFyYW0gdmlzaXRvciBhIHZhbGlkIHJlc291cmNlIGRlbHRhIHZpc2l0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1hNTChJUmVzb3VyY2UgcmVzb3VyY2UsIEJhc2VEZWx0YVZpc2l0b3IgdmlzaXRvcikgewotCi0gICAgICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGlzIGlzIGFuIHhtbCBmaWxlCi0gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKXJlc291cmNlOwotCi0gICAgICAgICAgICAvLyByZW1vdmUgcHJldmlvdXMgbWFya2VycwotICAgICAgICAgICAgcmVtb3ZlTWFya2Vyc0Zyb21GaWxlKGZpbGUsIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX1hNTCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSAgdGhlIGVycm9yIGhhbmRsZXIKLSAgICAgICAgICAgIFhtbEVycm9ySGFuZGxlciByZXBvcnRlciA9IG5ldyBYbWxFcnJvckhhbmRsZXIoZmlsZSwgdmlzaXRvcik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHBhcnNlCi0gICAgICAgICAgICAgICAgZ2V0UGFyc2VyKCkucGFyc2UoZmlsZS5nZXRDb250ZW50cygpLCByZXBvcnRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNBWFBhcnNlckZhY3RvcnksIGluc3RhbnRpYXRpbmcgaXQgZmlyc3QgaWYgaXQncyBub3QgYWxyZWFkeQotICAgICAqIGNyZWF0ZWQuCi0gICAgICogQHJldHVybiB0aGUgU0FYUGFyc2VyRmFjdG9yeSBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTQVhQYXJzZXIgZ2V0UGFyc2VyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBTQVhFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1hcmtlciB0byB0aGUgY3VycmVudCBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcmtlcklkIFRoZSBpZCBvZiB0aGUgbWFya2VyIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1hcmsKLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IG9mIHRoZSBtYXJrZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWFya1Byb2plY3QoU3RyaW5nIG1hcmtlcklkLCBTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5KSB7Ci0gICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihnZXRQcm9qZWN0KCksIG1hcmtlcklkLCBtZXNzYWdlLCBzZXZlcml0eSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIG1hcmtlcnMgZnJvbSBhIGZpbGUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIG1hcmtlcnMuCi0gICAgICogQHBhcmFtIG1hcmtlcklkIFRoZSBpZCBvZiB0aGUgbWFya2VycyB0byByZW1vdmUuIElmIG51bGwsIGFsbCBtYXJrZXIgb2YKLSAgICAgKiB0eXBlIDxjb2RlPklNYXJrZXIuUFJPQkxFTTwvY29kZT4gd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZU1hcmtlcnNGcm9tRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbWFya2VySWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZmlsZS5kZWxldGVNYXJrZXJzKG1hcmtlcklkLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLk1hcmtlcl9EZWxldGVfRXJyb3IsIG1hcmtlcklkLCBmaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoZ2V0UHJvamVjdCgpLCBtc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBtYXJrZXJzIGZyb20gYSBjb250YWluZXIgYW5kIGl0cyBjaGlsZHJlbi4KLSAgICAgKiBAcGFyYW0gZm9sZGVyIFRoZSBjb250YWluZXIgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIG1hcmtlcnMuCi0gICAgICogQHBhcmFtIG1hcmtlcklkIFRoZSBpZCBvZiB0aGUgbWFya2VycyB0byByZW1vdmUuIElmIG51bGwsIGFsbCBtYXJrZXIgb2YKLSAgICAgKiB0eXBlIDxjb2RlPklNYXJrZXIuUFJPQkxFTTwvY29kZT4gd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZU1hcmtlcnNGcm9tQ29udGFpbmVyKElDb250YWluZXIgZm9sZGVyLCBTdHJpbmcgbWFya2VySWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBmb2xkZXIuZGVsZXRlTWFya2VycyhtYXJrZXJJZCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuTWFya2VyX0RlbGV0ZV9FcnJvciwgbWFya2VySWQsIGZvbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgbWFya2VycyBmcm9tIGEgcHJvamVjdCBhbmQgaXRzIGNoaWxkcmVuLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGZyb20gd2hpY2ggdG8gZGVsZXRlIHRoZSBtYXJrZXJzCi0gICAgICogQHBhcmFtIG1hcmtlcklkIFRoZSBpZCBvZiB0aGUgbWFya2VycyB0byByZW1vdmUuIElmIG51bGwsIGFsbCBtYXJrZXIgb2YKLSAgICAgKiB0eXBlIDxjb2RlPklNYXJrZXIuUFJPQkxFTTwvY29kZT4gd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgdm9pZCByZW1vdmVNYXJrZXJzRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBtYXJrZXJJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmRlbGV0ZU1hcmtlcnMobWFya2VySWQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLk1hcmtlcl9EZWxldGVfRXJyb3IsIG1hcmtlcklkLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCBtc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGRlcnIgb3V0cHV0IG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4KLSAgICAgKiBAcGFyYW0gcHJvY2VzcyBUaGUgcHJvY2VzcyB0byBnZXQgdGhlIG91cHV0IGZyb20KLSAgICAgKiBAcGFyYW0gcmVzdWx0cyBUaGUgYXJyYXkgdG8gc3RvcmUgdGhlIHN0ZGVyciBvdXRwdXQKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIHJldHVybiBjb2RlLgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGdyYWJQcm9jZXNzT3V0cHV0KGZpbmFsIFByb2Nlc3MgcHJvY2VzcywKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdHMpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAvLyBEdWUgdG8gdGhlIGxpbWl0ZWQgYnVmZmVyIHNpemUgb24gd2luZG93cyBmb3IgdGhlIHN0YW5kYXJkIGlvIChzdGRlcnIsIHN0ZG91dCksIHdlCi0gICAgICAgIC8vICpuZWVkKiB0byByZWFkIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgYWxsIHRoZSB0aW1lLiBJZiB3ZSBkb24ndCBhbmQgYSBwcm9jZXNzIG91dHB1dAotICAgICAgICAvLyBhIGxhcmdlIGFtb3VudCwgdGhpcyBjb3VsZCBkZWFkbG9jayB0aGUgcHJvY2Vzcy4KLQotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB0byByZWFkIHRoZSBzdGRlcnIgb3V0cHV0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZXJyUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIG5ldyBUaHJlYWQoIiIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBvdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG91dFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgIHJldHVybiBwcm9jZXNzLndhaXRGb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgb3V0cHV0IG9mIGFhcHQgYW5kIG1hcmsgdGhlIGluY29ycmVjdCBmaWxlIHdpdGggZXJyb3IgbWFya2VycwotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3VsdHMgdGhlIG91dHB1dCBvZiBhYXB0Ci0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZmlsZSB0byBtYXJrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJzaW5nIGZhaWxlZCwgZmFsc2UgaWYgc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwYXJzZUFhcHRPdXRwdXQoQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0cywKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBwYXJzZT8ganVzdCByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3Qgc28gdGhhdCB3ZSBjYW4gbWFrZSBJRmlsZSBmcm9tIGZ1bGwKLSAgICAgICAgLy8gZmlsZSBwYXRoCi0gICAgICAgIFN0cmluZyBvc1Jvb3QgPSBwcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0gICAgICAgIE1hdGNoZXIgbTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwID0gcmVzdWx0cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIG0gPSBzUGF0dGVybjBMaW5lMS5tYXRjaGVyKHApOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaWdub3JlIHRob3NlIChhcyB0aGlzIGlzIGFuIGlnbm9yZSBtZXNzYWdlIGZyb20gYWFwdCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbSA9IHNQYXR0ZXJuMUxpbmUxLm1hdGNoZXIocCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVN0ciA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IG0uZ3JvdXAoMik7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1hdGNoZXIgZm9yIHRoZSBuZXh0IGxpbmUuCi0gICAgICAgICAgICAgICAgbSA9IGdldE5leHRMaW5lTWF0Y2hlcihyZXN1bHRzLCArK2ksIHNQYXR0ZXJuMUxpbmUyKTsKLSAgICAgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdmFsdWVzIGFuZCBhdHRlbXB0IHRvIG1hcmsgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrQW5kTWFyayhsb2NhdGlvbiwgbGluZVN0ciwgbXNnLCBvc1Jvb3QsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BQVBUX0NPTVBJTEUsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhpcyBuZWVkcyB0byBiZSB0ZXN0ZWQgYmVmb3JlIFBhdHRlcm4yIHNpbmNlIHRoZXkgYm90aCBzdGFydCB3aXRoICdFUlJPUjonCi0gICAgICAgICAgICBtID0gc1BhdHRlcm43TGluZTEubWF0Y2hlcihwKTsKLSAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHA7IC8vIGRlZmF1bHQgbXNnIGlzIHRoZSBsaW5lIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhbnl0aGluZyBlbHNlCi0KLSAgICAgICAgICAgICAgICBpZiAoKytpIDwgcmVzdWx0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gcmVzdWx0cy5nZXQoaSkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKytpIDwgcmVzdWx0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArICIgLSAiICsgcmVzdWx0cy5nZXQoaSkudHJpbSgpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIG5leHQgbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZXJyb3IKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbmRNYXJrKGxvY2F0aW9uLCBudWxsLCBtc2csIG9zUm9vdCwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FBUFRfQ09NUElMRSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3VjY2VzcywgZ28gdG8gdGhlIG5leHQgbGluZQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtID0gIHNQYXR0ZXJuMkxpbmUxLm1hdGNoZXIocCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1zZwotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXRjaGVyIGZvciB0aGUgbmV4dCBsaW5lLgotICAgICAgICAgICAgICAgIG0gPSBnZXROZXh0TGluZU1hdGNoZXIocmVzdWx0cywgKytpLCBzUGF0dGVybjJMaW5lMik7Ci0gICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB2YWx1ZXMgYW5kIGF0dGVtcHQgdG8gbWFyayB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbmRNYXJrKGxvY2F0aW9uLCBsaW5lU3RyLCBtc2csIG9zUm9vdCwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FBUFRfQ09NUElMRSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtID0gc1BhdHRlcm4zTGluZTEubWF0Y2hlcihwKTsKLSAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVTdHIgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBtLmdyb3VwKDMpOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHZhbHVlcyBhbmQgYXR0ZW1wdCB0byBtYXJrIHRoZSBmaWxlLgotICAgICAgICAgICAgICAgIGlmIChjaGVja0FuZE1hcmsobG9jYXRpb24sIGxpbmVTdHIsIG1zZywgb3NSb290LCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQUFQVF9DT01QSUxFLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzdWNjZXNzLCBnbyB0byB0aGUgbmV4dCBsaW5lCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG0gPSBzUGF0dGVybjRMaW5lMS5tYXRjaGVyKHApOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaWxlbmFtZS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXRjaGVyIGZvciB0aGUgbmV4dCBsaW5lLgotICAgICAgICAgICAgICAgIG0gPSBnZXROZXh0TGluZU1hdGNoZXIocmVzdWx0cywgKytpLCBzUGF0dGVybjRMaW5lMik7Ci0gICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVN0ciA9IG0uZ3JvdXAoMik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdmFsdWVzIGFuZCBhdHRlbXB0IHRvIG1hcmsgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrQW5kTWFyayhsb2NhdGlvbiwgbGluZVN0ciwgbXNnLCBvc1Jvb3QsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BQVBUX0NPTVBJTEUsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MsIGdvIHRvIHRoZSBuZXh0IGxpbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbSA9IHNQYXR0ZXJuNUxpbmUxLm1hdGNoZXIocCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gbS5ncm91cCgzKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB2YWx1ZXMgYW5kIGF0dGVtcHQgdG8gbWFyayB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbmRNYXJrKGxvY2F0aW9uLCBsaW5lU3RyLCBtc2csIG9zUm9vdCwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FBUFRfQ09NUElMRSwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzdWNjZXNzLCBnbyB0byB0aGUgbmV4dCBsaW5lCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG0gPSBzUGF0dGVybjZMaW5lMS5tYXRjaGVyKHApOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVN0ciA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IG0uZ3JvdXAoMyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdmFsdWVzIGFuZCBhdHRlbXB0IHRvIG1hcmsgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrQW5kTWFyayhsb2NhdGlvbiwgbGluZVN0ciwgbXNnLCBvc1Jvb3QsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BQVBUX0NPTVBJTEUsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MsIGdvIHRvIHRoZSBuZXh0IGxpbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbSA9IHNQYXR0ZXJuOExpbmUxLm1hdGNoZXIocCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHZhbHVlcyBhbmQgYXR0ZW1wdCB0byBtYXJrIHRoZSBmaWxlLgotICAgICAgICAgICAgICAgIGlmIChjaGVja0FuZE1hcmsobG9jYXRpb24sIG51bGwsIG1zZywgb3NSb290LCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQUFQVF9DT01QSUxFLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzdWNjZXNzLCBnbyB0byB0aGUgbmV4dCBsaW5lCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG0gPSBzUGF0dGVybjlMaW5lMS5tYXRjaGVyKHApOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhZENvbmZpZyA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkFQSyBDb25maWd1cmF0aW9uIGZpbHRlciAnJTEkcycgaXMgaW52YWxpZCIsIGJhZENvbmZpZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBuZXh0IGxpbmUKLSAgICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdmFsdWVzIGFuZCBhdHRlbXB0IHRvIG1hcmsgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrQW5kTWFyayhudWxsIC8qbG9jYXRpb24qLywgbnVsbCwgbXNnLCBvc1Jvb3QsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BQVBUX1BBQ0tBR0UsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MsIGdvIHRvIHRoZSBuZXh0IGxpbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW52YWxpZCBsaW5lIGZvcm1hdCwgZmxhZyBhcyBlcnJvciwgYW5kIGJhaWwKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhIFN0cmluZyBwcm9wZXJ0eSBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBpZCBvZiB0aGUgcGx1Z2luIGlzIGFkZGVkIHRvIHRoaXMgc3RyaW5nLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2F2ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2F2ZSBzdWNjZWVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZVByb2plY3RTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIuc2F2ZVN0cmluZ1Byb3BlcnR5KHByb2plY3QsIHByb3BlcnR5TmFtZSwgdmFsdWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBTdHJpbmcgcHJvcGVydHkgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIG9mIHRoZSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgaWQgb2YgdGhlIHBsdWdpbiBpcyBhZGRlZCB0byB0aGlzIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBudWxsIGlmIGl0IHdhcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkUHJvamVjdFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIubG9hZFN0cmluZ1Byb3BlcnR5KHByb2plY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYSBwcm9wZXJ0eSBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBpZCBvZiB0aGUgcGx1Z2luIGlzIGFkZGVkIHRvIHRoaXMgc3RyaW5nLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2F2ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2F2ZSBzdWNjZWVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZVByb2plY3RCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5zYXZlU3RyaW5nUHJvcGVydHkocHJvamVjdCwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBib29sZWFuIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiB0aGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGlkIG9mIHRoZSBwbHVnaW4gaXMgYWRkZWQgdG8gdGhpcyBzdHJpbmcuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IHdhcyBub3QgZm91bmQuCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHByb3BlcnR5IHdhcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZFByb2plY3RCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIubG9hZEJvb2xlYW5Qcm9wZXJ0eShwcm9qZWN0LCBwcm9wZXJ0eU5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JhdGUgb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBpZCBvZiB0aGUgcGx1Z2luIGlzIGFkZGVkIHRvIHRoaXMgc3RyaW5nLgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2Ugd2hpY2ggcGF0aCBpcyBzYXZlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNhdmUgc3VjY2VlZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZVByb2plY3RSZXNvdXJjZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5zYXZlUmVzb3VyY2VQcm9wZXJ0eShnZXRQcm9qZWN0KCksIHByb3BlcnR5TmFtZSwgcmVzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIG9mIHRoZSBwcm9qZWN0LCBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIElSZXNvdXJjZSBvYmplY3QuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBpZCBvZiB0aGUgcGx1Z2luIGlzIGFkZGVkIHRvIHRoaXMgc3RyaW5nLgotICAgICAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgSVJlc291cmNlIG9iamVjdCAob3IgY2hpbGRyZW4gaW50ZXJmYWNlKSBvciBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElSZXNvdXJjZSBsb2FkUHJvamVjdFJlc291cmNlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5sb2FkUmVzb3VyY2VQcm9wZXJ0eShwcm9qZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXJzIGdvdHRlbiBmcm9tIHRoZSBlcnJvciBvdXRwdXQgYXJlIHZhbGlkLCBhbmQgbWFyawotICAgICAqIHRoZSBmaWxlIHdpdGggYW4gQUFQVCBtYXJrZXIuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBmdWxsIE9TIHBhdGggb2YgdGhlIGVycm9yIGZpbGUuIElmIG51bGwsIHRoZSBwcm9qZWN0IGlzIG1hcmtlZAotICAgICAqIEBwYXJhbSBsaW5lU3RyCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QsIGluIE9TIHNwZWNpZmljIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdAotICAgICAqIEBwYXJhbSBtYXJrZXJJZCBUaGUgbWFya2VyIGlkIHRvIHB1dC4KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtYXJrZXIgdG8gcHV0IChJTWFya2VyLlNFVkVSSVRZXyopCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgdmFsaWQgYW5kIHRoZSBmaWxlIHdhcyBtYXJrZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAqCi0gICAgICogQHNlZSBJTWFya2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCAgYm9vbGVhbiBjaGVja0FuZE1hcmsoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbGluZVN0ciwKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcm9vdCwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG1hcmtlcklkLCBpbnQgc2V2ZXJpdHkpIHsKLSAgICAgICAgLy8gY2hlY2sgdGhpcyBpcyBpbiBmYWN0IGEgZmlsZQotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGxpbmUgbnVtYmVyCi0gICAgICAgIGludCBsaW5lID0gLTE7IC8vIGRlZmF1bHQgdmFsdWUgZm9yIGVycm9yIHdpdGggbm8gbGluZS4KLQotICAgICAgICBpZiAobGluZVN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVTdHIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBzdHJpbmcgd2UgZXh0cmFjdGVkIHdhc24ndCBhIHZhbGlkCi0gICAgICAgICAgICAgICAgLy8gZmlsZSBudW1iZXIuIFBhcnNpbmcgZmFpbGVkIGFuZCB3ZSByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgbWFya2VyCi0gICAgICAgIElSZXNvdXJjZSBmMiA9IHByb2plY3Q7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmMiA9IGdldFJlc291cmNlRnJvbUZ1bGxQYXRoKGxvY2F0aW9uLCByb290LCBwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmIChmMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUncyBhIHNpbWlsYXIgbWFya2VyIGFscmVhZHksIHNpbmNlIGFhcHQgaXMgbGF1bmNoZWQgdHdpY2UKLSAgICAgICAgYm9vbGVhbiBtYXJrZXJBbHJlYWR5RXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IGYyLmZpbmRNYXJrZXJzKG1hcmtlcklkLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0KLSAgICAgICAgICAgIGZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRtcExpbmUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIC0xKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wTGluZSAhPSBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCB0bXBTZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotICAgICAgICAgICAgICAgIGlmICh0bXBTZXZlcml0eSAhPSBzZXZlcml0eSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wTXNnID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIG51bGwpOwotICAgICAgICAgICAgICAgIGlmICh0bXBNc2cgPT0gbnVsbCB8fCB0bXBNc2cuZXF1YWxzKG1lc3NhZ2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGhlcmUsIGFsbCB0aGUgbWFya2VyIGF0dHJpYnV0ZXMgYXJlIGVxdWFscywgd2UgZm91bmQgaXQKLSAgICAgICAgICAgICAgICAvLyBhbmQgZXhpdAotICAgICAgICAgICAgICAgIG1hcmtlckFscmVhZHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWYgd2UgY291bGRuJ3QgZ2V0IHRoZSBtYXJrZXJzLCB0aGVuIHdlIGp1c3QgbWFyayB0aGUgZmlsZSBhZ2FpbgotICAgICAgICAgICAgLy8gKHNpbmNlIG1hcmtlckFscmVhZHlFeGlzdHMgaXMgaW5pdGlhbGl6ZWQgdG8gZmFsc2UsIHdlIGRvIG5vdGhpbmcpCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFya2VyQWxyZWFkeUV4aXN0cyA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKGxpbmUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIoZjIsIG1hcmtlcklkLCBtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIoZjIsIG1hcmtlcklkLCBtZXNzYWdlLCBzZXZlcml0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgbWF0Y2hlciBmb3IgdGhlIG5leHQgbGluZQotICAgICAqIEBwYXJhbSBsaW5lcyBUaGUgYXJyYXkgb2YgbGluZXMKLSAgICAgKiBAcGFyYW0gbmV4dEluZGV4IFRoZSBpbmRleCBvZiB0aGUgbmV4dCBsaW5lCi0gICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgZXJyb3Igb3Igbm8gbWF0Y2gsIHRoZSBtYXRjaGVyIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hdGNoZXIgZ2V0TmV4dExpbmVNYXRjaGVyKEFycmF5TGlzdDxTdHJpbmc+IGxpbmVzLAotICAgICAgICAgICAgaW50IG5leHRJbmRleCwgUGF0dGVybiBwYXR0ZXJuKSB7Ci0gICAgICAgIC8vIHVubGVzcyB3ZSBjYW4ndCwgYmVjYXVzZSB3ZSByZWFjaGVkIHRoZSBsYXN0IGxpbmUKLSAgICAgICAgaWYgKG5leHRJbmRleCA9PSBsaW5lcy5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGV4cGVjdGVkIGEgMm5kIGxpbmUsIHNvIHdlIGZsYWcgYXMgZXJyb3IKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBiYWlsCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lcy5nZXQobmV4dEluZGV4KSk7Ci0gICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlRnJvbUZ1bGxQYXRoKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHJvb3QsCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKHJvb3QpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZQotICAgICAgICAgICAgSVJlc291cmNlIHIgPSBwcm9qZWN0LmZpbmRNZW1iZXIoZmlsZSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSByZXNvdXJjZSBpcyB2YWxpZCwgd2UgYWRkIHRoZSBtYXJrZXIKLSAgICAgICAgICAgIGlmIChyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGV4dGVybmFsIGphciBmaWxlcyB1c2VkIGJ5IHRoZSBwcm9qZWN0LgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgT1Mtc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRocwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBnZXRFeHRlcm5hbEphcnMoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBwcm9qZWN0Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgamF2YSBwcm9qZWN0IGZyb20gaXQKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gb3NsaWJyYXJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhzID0gamF2YVByb2plY3QucmVhZFJhd0NsYXNzcGF0aCgpOwotICAgICAgICBpZiAoY2xhc3NwYXRocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlIDogY2xhc3NwYXRocykgewotICAgICAgICAgICAgICAgIGlmIChlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjbGFzc3BhdGggdmFyaWFibGUgcmVmZXJlbmNlLCB3ZSByZXNvbHZlIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgSVBhdGgKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGUuZ2V0UGF0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCAuamFyCi0gICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9KQVIuZXF1YWxzSWdub3JlQ2FzZShwYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbG9jYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHdzUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbGlicmFyeUxpc3QuYWRkKHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGphciBwYXRoIGRvZXNuJ3QgbWF0Y2ggYSB3b3Jrc3BhY2UgcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBnZXQgYW4gT1NTdHJpbmcgYW5kIGNoZWNrIGlmIHRoaXMgbGlua3MgdG8gYSB2YWxpZCBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc0Z1bGxQYXRoID0gcGF0aC50b09TU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShvc0Z1bGxQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc2xpYnJhcnlMaXN0LmFkZChvc0Z1bGxQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIE1lc3NhZ2VzLkNvdWxkbnRfTG9jYXRlX3NfRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIG1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gcHV0IGEgd2FybmluZyBtYXJrZXIgb24gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3NsaWJyYXJ5TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbb3NsaWJyYXJ5TGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYm9ydHMgdGhlIGJ1aWxkIGlmIHRoZSBTREsvcHJvamVjdCBzZXR1cHMgYXJlIGJyb2tlbi4gVGhpcyBkb2VzIG5vdAotICAgICAqIGRpc3BsYXkgYW55IGVycm9ycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSBiZWluZyBjb21waWxlZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhYm9ydE9uQmFkU2V0dXAoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgdGhlIFNESy4KLSAgICAgICAgaWYgKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2RrTG9hZFN0YXR1cygpICE9IExvYWRTdGF0dXMuTE9BREVEKSB7Ci0gICAgICAgICAgICAvLyB3ZSBleGl0IHNpbGVudGx5Ci0gICAgICAgICAgICBzdG9wQnVpbGQoIlNESyBpcyBub3QgbG9hZGVkIHlldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWJvcnQgaWYgdGhlcmUgYXJlIFRBUkdFVCBvciBBRFQgdHlwZSBtYXJrZXJzCi0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhBZHRDb25zdGFudHMuTUFSS0VSX1RBUkdFVCwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKmluY2x1ZGVTdWJ0eXBlcyovLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0KLSAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgc3RvcEJ1aWxkKCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcmtlcnMgPSBwcm9qZWN0LmZpbmRNYXJrZXJzKEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBmYWxzZSAvKmluY2x1ZGVTdWJ0eXBlcyovLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQotICAgICAgICBpZiAobWFya2Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBzdG9wQnVpbGQoIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB0byBjYW5jZWwgdGhlIGJ1aWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIHByaW50Zi1zdHlsZSBhcmd1bWVudHMgdG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3RvcEJ1aWxkKFN0cmluZyBlcnJvciwgT2JqZWN0Li4uIGFyZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgQWR0UGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KGVycm9yLCBhcmdzKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgdGhlIGRlcml2ZWQgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZURlcml2ZWRSZXNvdXJjZXMoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBmb2xkZXIubWVtYmVycygpOwotICAgICAgICAgICAgICAgIGZvciAoSVJlc291cmNlIG1lbWJlciA6IG1lbWJlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGVyaXZlZFJlc291cmNlcyhtZW1iZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9NZXNzYWdlcy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNjk4ZGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZC5idWlsZF9tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFBUFRfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBQVBUX0V4ZWNfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRlZF9zX3NfTmVlZHNfVXBkYXRpbmc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBSURMX0V4ZWNfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBSURMX0phdmFfQ29uZmxpY3Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX0NlcnRpZmljYXRlX0V4cGlyZWRfb25fczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwa0J1aWxkZXJfSkFWQV9IT01FX2lzX3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX1BhY2thZ2luZ19zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQXBrQnVpbGRlcl9QYWNrYWdpbmdfc19pbnRvX3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX3NfQ29uZmxpY3Rfd2l0aF9maWxlX3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX1NpZ25pbmdfS2V5X0NyZWF0aW9uX3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX1VuYWJsZV9Ub19HZXlfS2V5OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQXBrQnVpbGRlcl9VbmFibGVCdWlsZF9EZXhfTm90X2xvYWRlZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwa0J1aWxkZXJfVXBkYXRlX29yX0V4ZWN1dGVfbWFudWFsbHlfczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwa0J1aWxkZXJfVXNpbmdfRGVmYXVsdF9LZXk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBcGtCdWlsZGVyX1VzaW5nX3NfVG9fU2lnbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNraW5nX1BhY2thZ2VfQ2hhbmdlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcGlsZXJfQ29tcGxpYW5jZV9FcnJvcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvdWxkbnRfTG9jYXRlX3NfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEYWx2aWtfRXJyb3JfZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERhbHZpa19FcnJvcl9zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX09ic29sZXRlX0Vycm9yOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGV4V3JhcHBlcl9EZXhfTG9hZGVyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGV4V3JhcHBlcl9GYWlsZWRfdG9fbG9hZF9zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGV4V3JhcHBlcl9zX2RvZXNfbm90X2V4aXN0czsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERleFdyYXBwZXJfU2VjdXJ5RXhfVW5hYmxlX1RvX0ZpbmRfQVBJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGV4V3JhcHBlcl9TZWN1cnlFeF9VbmFibGVfVG9fRmluZF9GaWVsZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERleFdyYXBwZXJfU2VjdXJ5RXhfVW5hYmxlX1RvX0ZpbmRfTWV0aG9kOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGV4V3JhcHBlcl9VbmFibGVfVG9fRXhlY3V0ZV9EZXhfczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERYX0phcl9FcnJvcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZhaWxlZF9Ub19HZXRfT3V0cHV0OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRmluYWxfQXJjaGl2ZV9FcnJvcl9zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSW5jb21wYXRpYmxlX1ZNX1dhcm5pbmc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJfRGVsZXRlX0Vycm9yOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fU0RLX1NldHVwX0Vycm9yOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTm90aGluZ19Ub19Db21waWxlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0X01pc3Npbmc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQYWNrYWdlX3NfRG9lc250X0V4aXN0X0Vycm9yOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlcGFyaW5nX0dlbmVyYXRlZF9GaWxlczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RfSGFzX0Vycm9yczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZnJlc2hpbmdfUmVzOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZpbmdfR2VuZXJhdGVkX0NsYXNzZXM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSZXF1aXJlc18xXzVfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSZXF1aXJlc19DbGFzc19Db21wYXRpYmlsaXR5XzU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSZXF1aXJlc19Db21waWxlcl9Db21wbGlhbmNlXzU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSZXF1aXJlc19Tb3VyY2VfQ29tcGF0aWJpbGl0eV81OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc19Db250YWluc19YbWxfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzX0RvZXNudF9EZWNsYXJlX1BhY2thZ2VfRXJyb3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzX0ZpbGVfTWlzc2luZzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNfTWlzc2luZ19SZXBhY2thZ2luZzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNfTW9kaWZpZWRfTWFudWFsbHlfUmVjcmVhdGluZ19zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc19Nb2RpZmllZF9SZWNyZWF0aW5nX3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzX1JlbW92ZWRfUmVjcmVhdGluZ19zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc19SZW1vdmVkX3NfTmVlZHNfVXBkYXRpbmc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydF9GdWxsX0Fwa19CdWlsZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0X0Z1bGxfUHJlX0NvbXBpbGVyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnRfSW5jX0Fwa19CdWlsZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0X0luY19QcmVfQ29tcGlsZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVbnBhcnNlZF9BQVBUX0Vycm9yczsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVucGFyc2VkX0FJRExfRXJyb3JzOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWG1sX0Vycm9yOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9QcmVDb21waWxlckJ1aWxkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9QcmVDb21waWxlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MjkzYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYnVpbGQvUHJlQ29tcGlsZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5GaXhMYXVuY2hDb25maWc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuWG1sRXJyb3JIYW5kbGVyLkJhc2ljWG1sRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFByZSBKYXZhIENvbXBpbGVyLgotICogVGhpcyBpbmNyZW1lbnRhbCBidWlsZGVyIHBlcmZvcm1zIDIgdGFza3M6Ci0gKiA8dWw+Ci0gKiA8bGk+Y29tcGlsZXMgdGhlIHJlc291cmNlcyBsb2NhdGVkIGluIHRoZSByZXMvIGZvbGRlciwgYWxvbmcgd2l0aCB0aGUKLSAqIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZSBpbnRvIHRoZSBSLmphdmEgY2xhc3MuPC9saT4KLSAqIDxsaT5jb21waWxlcyBhbnkgLmFpZGwgZmlsZXMgaW50byBhIGNvcnJlc3BvbmRpbmcgamF2YSBmaWxlLjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqLwotcHVibGljIGNsYXNzIFByZUNvbXBpbGVyQnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5QcmVDb21waWxlckJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEFDS0FHRSA9ICJtYW5pZmVzdFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09NUElMRV9SRVNPVVJDRVMgPSAiY29tcGlsZVJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09NUElMRV9BSURMID0gImNvbXBpbGVBaWRsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU2luZ2xlIGxpbmUgYWlkbCBlcnJvcjxicj4KLSAgICAgKiAiJmx0O3BhdGgmZ3Q7OiZsdDtsaW5lJmd0OzogJmx0O2Vycm9yJmd0OyIKLSAgICAgKiBvcgotICAgICAqICImbHQ7cGF0aCZndDs6Jmx0O2xpbmUmZ3Q7ICZsdDtlcnJvciZndDsiCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBzQWlkbFBhdHRlcm4xID0gUGF0dGVybi5jb21waWxlKCJeKC4rPyk6KFxcZCspOj9cXHMoLispJCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBEYXRhIHRvIHRlbXBvcmFybHkgc3RvcmUgYWlkbCBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBBaWRsRGF0YSB7Ci0gICAgICAgIElGaWxlIGFpZGxGaWxlOwotICAgICAgICBJRm9sZGVyIHNvdXJjZUZvbGRlcjsKLQotICAgICAgICBBaWRsRGF0YShJRm9sZGVyIHNvdXJjZUZvbGRlciwgSUZpbGUgYWlkbEZpbGUpIHsKLSAgICAgICAgICAgIHRoaXMuc291cmNlRm9sZGVyID0gc291cmNlRm9sZGVyOwotICAgICAgICAgICAgdGhpcy5haWRsRmlsZSA9IGFpZGxGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFpZGxEYXRhKSB7Ci0gICAgICAgICAgICAgICAgQWlkbERhdGEgZmlsZSA9IChBaWRsRGF0YSlvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFpZGxGaWxlLmVxdWFscyhmaWxlLmFpZGxGaWxlKSAmJiBzb3VyY2VGb2xkZXIuZXF1YWxzKGZpbGUuc291cmNlRm9sZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb3VyY2UgQ29tcGlsZSBmbGFnLiBUaGlzIGZsYWcgaXMgcmVzZXQgdG8gZmFsc2UgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uLCBhbmQKLSAgICAgKiBzdG9yZWQgaW4gdGhlIHByb2plY3QgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLiBUaGlzIGFsbG93cyB0aGUgYnVpbGRlciB0byByZW1lbWJlciBpdHMgc3RhdGUKLSAgICAgKiB3aGVuIHRoZSBwcm9qZWN0IGlzIGNsb3NlZC9vcGVuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1NdXN0Q29tcGlsZVJlc291cmNlcyA9IGZhbHNlOwotCi0gICAgLyoqIExpc3Qgb2YgLmFpZGwgZmlsZXMgZm91bmQgdGhhdCBhcmUgbW9kaWZpZWQgb3IgbmV3LiAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFpZGxEYXRhPiBtQWlkbFRvQ29tcGlsZSA9IG5ldyBBcnJheUxpc3Q8QWlkbERhdGE+KCk7Ci0KLSAgICAvKiogTGlzdCBvZiAuYWlkbCBmaWxlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFpZGxEYXRhPiBtQWlkbFRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxBaWRsRGF0YT4oKTsKLQotICAgIC8qKiBjYWNoZSBvZiB0aGUgamF2YSBwYWNrYWdlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU1hbmlmZXN0UGFja2FnZTsKLQotICAgIC8qKiBPdXRwdXQgZm9sZGVyIGZvciBnZW5lcmF0ZWQgSmF2YSBGaWxlLiBDcmVhdGVkIG9uIHRoZSBCdWlsZGVyIGluaXQKLSAgICAgKiBAc2VlICNzdGFydHVwT25Jbml0aWFsaXplKCkKLSAgICAgKi8KLSAgICBwcml2YXRlIElGb2xkZXIgbUdlbkZvbGRlcjsKLQotICAgIC8qKgotICAgICAqIFByb2dyZXNzIG1vbml0b3IgdXNlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGJ1aWxkIHRvIHJlZnJlc2ggdGhlIGNvbnRlbnQgb2YgdGhlICdnZW4nIGZvbGRlcgotICAgICAqIGFuZCBzZXQgdGhlIGdlbmVyYXRlZCBmaWxlcyBhcyBkZXJpdmVkLgotICAgICAqLwotICAgIHByaXZhdGUgRGVyaXZlZFByb2dyZXNzTW9uaXRvciBtRGVyaXZlZFByb2dyZXNzTW9uaXRvcjsKLQotICAgIC8qKgotICAgICAqIFByb2dyZXNzIG1vbml0b3Igd2FpdGluZyB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzIHRvIHNldCBhIHBlcnNpc3RlbnQgdmFsdWUKLSAgICAgKiBpbiBhIGZpbGUuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8Y29kZT5JUmVzb3VyY2UucmVmcmVzaCgpPC9jb2RlPiwKLSAgICAgKiBzaW5jZSB0aGlzIGNhbGwgaXMgYXN5c25jaHJvbm91cywgYW5kIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gZmluaXNoIGZvciB0aGUgZmlsZQotICAgICAqIHRvIGJlIGtub3duIGJ5IGVjbGlwc2UsIGJlZm9yZSB3ZSBjYW4gY2FsbCA8Y29kZT5yZXNvdXJjZS5zZXRQZXJzaXN0ZW50UHJvcGVydHk8L2NvZGU+IG9uCi0gICAgICogYSBuZXcgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXJpdmVkUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PElGaWxlPiBtRmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmUgPSBmYWxzZTsKLSAgICAgICAgcHVibGljIERlcml2ZWRQcm9ncmVzc01vbml0b3IoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICAgICAgbUZpbGVMaXN0LmFkZChmaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBtRmlsZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Eb25lID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICBpZiAobURvbmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChJRmlsZSBmaWxlIDogbUZpbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc2V0RGVyaXZlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2UgY2hlY2sgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29yc3QgY2FzZSBzY2VuYXJpbywgdGhlIHJlc291cmNlIGlzbid0IG1hcmtlZCBhcyBkZXJpdmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbmNlbGxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgICAgIG1DYW5jZWxsZWQgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQcmVDb21waWxlckJ1aWxkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLy8gYnVpbGQoKSByZXR1cm5zIGEgbGlzdCBvZiBwcm9qZWN0IGZyb20gd2hpY2ggdGhpcyBwcm9qZWN0IGRlcGVuZHMgZm9yIGZ1dHVyZSBjb21waWxhdGlvbi4KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EZXJpdmVkUHJvZ3Jlc3NNb25pdG9yLnJlc2V0KCk7Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IHRoaW5nIHdlIGRvIGlzIGdvIHRocm91Z2ggdGhlIHJlc291cmNlIGRlbHRhIHRvIG5vdAotICAgICAgICAgICAgLy8gbG9zZSBpdCBpZiB3ZSBoYXZlIHRvIGFib3J0IHRoZSBidWlsZCBmb3IgYW55IHJlYXNvbi4KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IG9iamVjdHMKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vIFRvcCBsZXZlbCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGNhbiBtb3ZlIGZvcndhcmQuCi0gICAgICAgICAgICBhYm9ydE9uQmFkU2V0dXAocHJvamVjdCk7Ci0KLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHByb2plY3RUYXJnZXQgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChwcm9qZWN0KTsKLQotICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gZ2V0IHRoZSBjbGFzc3BhdGggbGlzdAotICAgICAgICAgICAgQXJyYXlMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJQYXRoTGlzdCA9IEJhc2VQcm9qZWN0SGVscGVyLmdldFNvdXJjZUNsYXNzcGF0aHMoCi0gICAgICAgICAgICAgICAgICAgIGphdmFQcm9qZWN0KTsKLQotICAgICAgICAgICAgUHJlQ29tcGlsZXJEZWx0YVZpc2l0b3IgZHYgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGphdmFQYWNrYWdlID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBtaW5TZGtWZXJzaW9uID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGtpbmQgPT0gRlVMTF9CVUlMRCkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuU3RhcnRfRnVsbF9QcmVfQ29tcGlsZXIpOwotICAgICAgICAgICAgICAgIG1NdXN0Q29tcGlsZVJlc291cmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnVpbGRBaWRsQ29tcGlsYXRpb25MaXN0KHByb2plY3QsIHNvdXJjZUZvbGRlclBhdGhMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5TdGFydF9JbmNfUHJlX0NvbXBpbGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIHJlc291cmNlcyBhbmQgc2VlIGlmIHNvbWV0aGluZyBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIG1Db21waWxlUmVzb3VyY2VzIGZsYWcgaXMgdHJ1ZSBmcm9tIGEgcHJldmlvdXNseSBhYm9ydGVkCi0gICAgICAgICAgICAgICAgLy8gYnVpbGQsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVzb3VyY2UgZGVsdGEgdG8gZ2V0IGEgcG9zc2libGUKLSAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGFpZGwgZmlsZXMgdG8gY29tcGlsZS9yZW1vdmUuCi0gICAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBnZXREZWx0YShwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTXVzdENvbXBpbGVSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBidWlsZEFpZGxDb21waWxhdGlvbkxpc3QocHJvamVjdCwgc291cmNlRm9sZGVyUGF0aExpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGR2ID0gbmV3IFByZUNvbXBpbGVyRGVsdGFWaXNpdG9yKHRoaXMsIHNvdXJjZUZvbGRlclBhdGhMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEuYWNjZXB0KGR2KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIG1NdXN0Q29tcGlsZVJlc291cmNlcyB8PSBkdi5nZXRDb21waWxlUmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR2LmdldEZvcmNlQWlkbENvbXBpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRBaWRsQ29tcGlsYXRpb25MaXN0KHByb2plY3QsIHNvdXJjZUZvbGRlclBhdGhMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhaWRsIG1vZGlmaWNhdGlvbiwgYW5kIHVwZGF0ZSBtTXVzdENvbXBpbGVBaWRsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUFpZGxGaWxlTW9kaWZpY2F0aW9ucyhkdi5nZXRBaWRsVG9Db21waWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2LmdldEFpZGxUb1JlbW92ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgamF2YSBwYWNrYWdlIGZyb20gdGhlIHZpc2l0b3IKLSAgICAgICAgICAgICAgICAgICAgamF2YVBhY2thZ2UgPSBkdi5nZXRNYW5pZmVzdFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbWluU2RrVmVyc2lvbiA9IGR2LmdldE1pblNka1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBidWlsZCBzdGF0dXMgaW4gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZQotICAgICAgICAgICAgc2F2ZVByb2plY3RCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ09NUElMRV9SRVNPVVJDRVMgLCBtTXVzdENvbXBpbGVSZXNvdXJjZXMpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgc29tZSBYTUwgZXJyb3JzLCB3ZSBqdXN0IHJldHVybiB3L28gZG9pbmcKLSAgICAgICAgICAgIC8vIGFueXRoaW5nIHNpbmNlIHdlJ3ZlIHB1dCBzb21lIG1hcmtlcnMgaW4gdGhlIGZpbGVzIGFueXdheS4KLSAgICAgICAgICAgIGlmIChkdiAhPSBudWxsICYmIGR2Lm1YbWxFcnJvcikgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIE1lc3NhZ2VzLlhtbF9FcnJvcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGludGVycnVwdHMgdGhlIGJ1aWxkLiBUaGUgbmV4dCBidWlsZGVycyB3aWxsIG5vdCBydW4uCi0gICAgICAgICAgICAgICAgc3RvcEJ1aWxkKE1lc3NhZ2VzLlhtbF9FcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYW5pZmVzdCBmaWxlCi0gICAgICAgICAgICBJRmlsZSBtYW5pZmVzdCA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5nZXRNYW5pZmVzdChwcm9qZWN0KTsKLQotICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5zX0ZpbGVfTWlzc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgbXNnKTsKLSAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJydXB0cyB0aGUgYnVpbGQuIFRoZSBuZXh0IGJ1aWxkZXJzIHdpbGwgbm90IHJ1bi4KLSAgICAgICAgICAgICAgICBzdG9wQnVpbGQobXNnKTsKLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvY3VtZW50IHdoZXRoZXIgY29kZSBiZWxvdyB0aGF0IHVzZXMgbWFuaWZlc3QgKHdoaWNoIGlzIG5vdyBndWFyYW50ZWVkCi0gICAgICAgICAgICAgICAgLy8gdG8gYmUgbnVsbCkgd2lsbCBhY3R1YWxseSBiZSBleGVjdXRlZCBvciBub3QuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxldHMgY2hlY2sgdGhlIFhNTCBvZiB0aGUgbWFuaWZlc3QgZmlyc3QsIGlmIHRoYXQgaGFzbid0IGJlZW4gZG9uZSBieSB0aGUKLSAgICAgICAgICAgIC8vIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgeWV0LgotICAgICAgICAgICAgaWYgKGR2ID09IG51bGwgfHwgZHYuZ2V0Q2hlY2tlZE1hbmlmZXN0WG1sKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBCYXNpY1htbEVycm9yTGlzdGVuZXIgZXJyb3JMaXN0ZW5lciA9IG5ldyBCYXNpY1htbEVycm9yTGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgcGFyc2VyID0gQmFzZVByb2plY3RIZWxwZXIucGFyc2VNYW5pZmVzdEZvckVycm9yKG1hbmlmZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyb3JMaXN0ZW5lci5tSGFzWG1sRXJyb3IgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIG1hbmlmZXN0LCBpdHMgZmlsZSBoYXMgYmVlbiBtYXJrZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBYbWxFcnJvckhhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuc19Db250YWluc19YbWxfRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5GTl9BTkRST0lEX01BTklGRVNUKTsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIHByb2plY3QsIG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnRlcnJ1cHRzIHRoZSBidWlsZC4gVGhlIG5leHQgYnVpbGRlcnMgd2lsbCBub3QgcnVuLgotICAgICAgICAgICAgICAgICAgICBzdG9wQnVpbGQobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGphdmEgcGFja2FnZSBmcm9tIHRoZSBwYXJzZXIKLSAgICAgICAgICAgICAgICBqYXZhUGFja2FnZSA9IHBhcnNlci5nZXRQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgbWluU2RrVmVyc2lvbiA9IHBhcnNlci5nZXRBcGlMZXZlbFJlcXVpcmVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtaW5TZGtWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgbWluU2RrVmFsdWUgPSAtMTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtaW5TZGtWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQobWluU2RrVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvaywgaXQgbWVhbnMgbWluU2RrVmVyc2lvbiBjb250YWlucyBhIChob3BlZnVsbHkpIHZhbGlkIGNvZGVuYW1lLgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIHByb2plY3RWZXJzaW9uID0gcHJvamVjdFRhcmdldC5nZXRWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWluU2RrVmFsdWUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvZGVuYW1lID0gcHJvamVjdFZlcnNpb24uZ2V0Q29kZW5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVnZXIgbWluU2RrIHdoZW4gdGhlIHRhcmdldCBpcyBhIHByZXZpZXcgPT4gZmF0YWwgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGZvcm0gJTEkcyBpcyBhIHByZXZpZXcgYW5kIHJlcXVpcmVzIGFwcGljYXRpb24gbWFuaWZlc3QgdG8gc2V0ICUyJHMgdG8gJyUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUsIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIobWFuaWZlc3QsIEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJ1aWxkKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWluU2RrVmFsdWUgPCBwcm9qZWN0VmVyc2lvbi5nZXRBcGlMZXZlbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ2VyIG1pblNkayBpcyBub3QgaGlnaCBlbm91Z2ggZm9yIHRoZSB0YXJnZXQgPT4gd2FybmluZwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJTEkcyAoJTIkZCkgaXMgbG93ZXIgdGhhbiB0aGUgcHJvamVjdCB0YXJnZXQgQVBJIGxldmVsICglMyRkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TZGtWYWx1ZSwgcHJvamVjdFZlcnNpb24uZ2V0QXBpTGV2ZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwgcHJvamVjdCwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihtYW5pZmVzdCwgQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaW5TZGtWYWx1ZSA+IHByb2plY3RWZXJzaW9uLmdldEFwaUxldmVsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVnZXIgbWluU2RrIGlzIHRvbyBoaWdoIGZvciB0aGUgdGFyZ2V0ID0+IHdhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlICUxJHMgKCUyJGQpIGlzIGhpZ2hlciB0aGFuIHRoZSBwcm9qZWN0IHRhcmdldCBBUEkgbGV2ZWwgKCUzJGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9NSU5fU0RLX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNka1ZhbHVlLCBwcm9qZWN0VmVyc2lvbi5nZXRBcGlMZXZlbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuYWRkTWFya2VyKG1hbmlmZXN0LCBBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB0aGUgbWluIHNkayBpcyBhIGNvZGVuYW1lLCBjaGVjayBpdCBtYXRjaGVzIHRoZSBjb2RlbmFtZQotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvZGVuYW1lID0gcHJvamVjdFZlcnNpb24uZ2V0Q29kZW5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXRmb3JtIGlzIG5vdCBhIHByZXZpZXcgPT4gZmF0YWwgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFuaWZlc3QgYXR0cmlidXRlICclMSRzJyBpcyBzZXQgdG8gJyUyJHMnLiBJbnRlZ2VyIGlzIGV4cGVjdGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OLCBtaW5TZGtWZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIobWFuaWZlc3QsIEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJ1aWxkKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZW5hbWUuZXF1YWxzKG1pblNka1ZlcnNpb24pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF0Zm9ybSBhbmQgbWFuaWZlc3QgY29kZW5hbWVzIGRvbid0IG1hdGNoID0+IGZhdGFsIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZiBtYW5pZmVzdCBhdHRyaWJ1dGUgJyUxJHMnIGRvZXMgbm90IG1hdGNoIHBsYXRmb3JtIGNvZGVuYW1lICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OLCBjb2RlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuYWRkTWFya2VyKG1hbmlmZXN0LCBBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdWlsZChtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0VGFyZ2V0LmdldFZlcnNpb24oKS5pc1ByZXZpZXcoKSkgewotICAgICAgICAgICAgICAgIC8vIGVsc2UgdGhlIG1pblNka1ZlcnNpb24gaXMgbm90IHNldCBidXQgd2UgYXJlIHVzaW5nIGEgcHJldmlldyB0YXJnZXQuCi0gICAgICAgICAgICAgICAgLy8gRGlzcGxheSBhbiBlcnJvcgotICAgICAgICAgICAgICAgIFN0cmluZyBjb2RlbmFtZSA9IHByb2plY3RUYXJnZXQuZ2V0VmVyc2lvbigpLmdldENvZGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGZvcm0gJTEkcyBpcyBhIHByZXZpZXcgYW5kIHJlcXVpcmVzIGFwcGljYXRpb24gbWFuaWZlc3RzIHRvIHNldCAlMiRzIHRvICclMSRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSwgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9NSU5fU0RLX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuYWRkTWFya2VyKG1hbmlmZXN0LCBBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgc3RvcEJ1aWxkKG1zZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhUGFja2FnZSA9PSBudWxsIHx8IGphdmFQYWNrYWdlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBBbmRyb2lkTWFuaWZlc3QgZmlsZSBpc24ndCB2YWxpZC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5zX0RvZXNudF9EZWNsYXJlX1BhY2thZ2VfRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1QpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGludGVycnVwdHMgdGhlIGJ1aWxkLiBUaGUgbmV4dCBidWlsZGVycyB3aWxsIG5vdCBydW4uCi0gICAgICAgICAgICAgICAgc3RvcEJ1aWxkKG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb2N1bWVudCB3aGV0aGVyIGNvZGUgYmVsb3cgdGhhdCB1c2VzIGphdmFQYWNrYWdlICh3aGljaCBpcyBub3cgZ3VhcmFudGVlZAotICAgICAgICAgICAgICAgIC8vIHRvIGJlIG51bGwpIHdpbGwgYWN0dWFsbHkgYmUgZXhlY3V0ZWQgb3Igbm90LgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgdGhlIGphdmEgcGFja2FnZS4gV2UgbmVlZCB0byBtYWtlIHN1cmUgaXQncyBub3QgYSBkaWZmZXJlbnQKLSAgICAgICAgICAgIC8vIHBhY2thZ2UgdGhhbiB0aGUgcHJldmlvdXMgb25lIHRoYXQgd2VyZSBidWlsdC4KLSAgICAgICAgICAgIGlmIChqYXZhUGFja2FnZSAhPSBudWxsICYmIGphdmFQYWNrYWdlLmVxdWFscyhtTWFuaWZlc3RQYWNrYWdlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBtYW5pZmVzdCBwYWNrYWdlIGhhcyBjaGFuZ2VkLCB0aGUgdXNlciBtYXkgd2FudCB0byB1cGRhdGUKLSAgICAgICAgICAgICAgICAvLyB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBpZiAobU1hbmlmZXN0UGFja2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkNoZWNraW5nX1BhY2thZ2VfQ2hhbmdlKTsKLQotICAgICAgICAgICAgICAgICAgICBGaXhMYXVuY2hDb25maWcgZmxjID0gbmV3IEZpeExhdW5jaENvbmZpZyhwcm9qZWN0LCBtTWFuaWZlc3RQYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgZmxjLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHdlIGRlbGV0ZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgZnJvbSB0aGVpciBwcmV2aW91cyBsb2NhdGlvbgotICAgICAgICAgICAgICAgIGRlbGV0ZU9ic29sZXRlR2VuZXJhdGVkQ2xhc3MoQW5kcm9pZENvbnN0YW50cy5GTl9SRVNPVVJDRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5pZmVzdFBhY2thZ2UpOwotICAgICAgICAgICAgICAgIGRlbGV0ZU9ic29sZXRlR2VuZXJhdGVkQ2xhc3MoQW5kcm9pZENvbnN0YW50cy5GTl9NQU5JRkVTVF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5pZmVzdFBhY2thZ2UpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBuZXcgbWFuaWZlc3QgcGFja2FnZSwgYW5kIHNhdmUgaXQuCi0gICAgICAgICAgICAgICAgbU1hbmlmZXN0UGFja2FnZSA9IGphdmFQYWNrYWdlOwotICAgICAgICAgICAgICAgIHNhdmVQcm9qZWN0U3RyaW5nUHJvcGVydHkoUFJPUEVSVFlfUEFDS0FHRSwgbU1hbmlmZXN0UGFja2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTXVzdENvbXBpbGVSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc3RvcmUgdGhlIFIgY2xhc3MuCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgZm9sZGVyIGZvciBSLmphdmEgYW5kIHVwZGF0ZSBtTWFuaWZlc3RQYWNrYWdlU291cmNlRm9sZGVyCi0gICAgICAgICAgICAgICAgSUZvbGRlciBwYWNrYWdlRm9sZGVyID0gZ2V0R2VuTWFuaWZlc3RQYWNrYWdlRm9sZGVyKHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZSBmb2xkZXIKLSAgICAgICAgICAgICAgICBJRm9sZGVyIHJlc0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKEFuZHJvaWRDb25zdGFudHMuV1NfUkVTT1VSQ0VTKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZmlsZSBzeXN0ZW0gcGF0aAotICAgICAgICAgICAgICAgIElQYXRoIG91dHB1dExvY2F0aW9uID0gbUdlbkZvbGRlci5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIElQYXRoIHJlc0xvY2F0aW9uID0gcmVzRm9sZGVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgSVBhdGggbWFuaWZlc3RMb2NhdGlvbiA9IG1hbmlmZXN0ID09IG51bGwgPyBudWxsIDogbWFuaWZlc3QuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIHRob3NlIGxvY2F0aW9ucyBoYXZlIHRvIGV4aXN0IGZvciB1cyB0byBkbyBzb21ldGhpbmchCi0gICAgICAgICAgICAgICAgaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwgJiYgcmVzTG9jYXRpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFuaWZlc3RMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc091dHB1dFBhdGggPSBvdXRwdXRMb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc1Jlc1BhdGggPSByZXNMb2NhdGlvbi50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc01hbmlmZXN0UGF0aCA9IG1hbmlmZXN0TG9jYXRpb24udG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgYWFwdCBtYXJrZXJzCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZU1hcmtlcnNGcm9tRmlsZShtYW5pZmVzdCwgQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQUFQVF9DT01QSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTWFya2Vyc0Zyb21Db250YWluZXIocmVzRm9sZGVyLCBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BQVBUX0NPTVBJTEUpOwotCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlByZXBhcmluZ19HZW5lcmF0ZWRfRmlsZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBSLmphdmEgZmlsZSBtYXkgYmUgYWxyZWFkeSBleGlzdGluZyBpbiByZWFkLW9ubHkKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9kZSB3ZSBuZWVkIHRvIG1ha2UgaXQgcmVhZGFibGUgc28gdGhhdCBhYXB0IGNhbiBvdmVyd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgckphdmFGaWxlID0gcGFja2FnZUZvbGRlci5nZXRGaWxlKEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VfQ0xBU1MpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvIHRoZSBzYW1lIGZvciB0aGUgTWFuaWZlc3QuamF2YSBjbGFzcwotICAgICAgICAgICAgICAgICAgICBJRmlsZSBtYW5pZmVzdEphdmFGaWxlID0gcGFja2FnZUZvbGRlci5nZXRGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fTUFOSUZFU1RfQ0xBU1MpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFjdHVhbGx5IG5lZWQgdG8gZGVsZXRlIHRoZSBtYW5pZmVzdC5qYXZhIGFzIGl0IG1heSBiZWNvbWUgZW1wdHkgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSBhYXB0IGRvZXNuJ3QgZ2VuZXJhdGUgYW4gZW1wdHkgb25lLCBidXQgaW5zdGVhZCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoIGl0LgotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEphdmFGaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBsYXVuY2ggYWFwdDogY3JlYXRlIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXJyYXkgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXkuYWRkKHByb2plY3RUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5BQVBUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZCgicGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZCgiLW0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpZiAoQWR0UGx1Z2luLmdldEJ1aWxkVmVyYm9zaXR5KCkgPT0gQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZCgiLXYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZCgiLUoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBhcnJheS5hZGQob3NPdXRwdXRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXkuYWRkKCItTSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZChvc01hbmlmZXN0UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZCgiLVMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBhcnJheS5hZGQob3NSZXNQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXkuYWRkKCItSSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGFycmF5LmFkZChwcm9qZWN0VGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQU5EUk9JRF9KQVIpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoQWR0UGx1Z2luLmdldEJ1aWxkVmVyYm9zaXR5KCkgPT0gQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYyA6IGFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNtZF9saW5lID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShwcm9qZWN0LCBjbWRfbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBsYXVuY2gKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWNFcnJvciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXVuY2ggdGhlIGNvbW1hbmQgbGluZSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS50b0FycmF5KG5ldyBTdHJpbmdbYXJyYXkuc2l6ZSgpXSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHRvIHN0b3JlIGVhY2ggbGluZSBvZiBzdGRlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBvdXRwdXQgYW5kIHJldHVybiBjb2RlIGZyb20gdGhlIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNFcnJvciA9IGdyYWJQcm9jZXNzT3V0cHV0KHByb2Nlc3MsIHJlc3VsdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvIHBhcnNlIHRoZSBlcnJvciBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFyc2luZ0Vycm9yID0gcGFyc2VBYXB0T3V0cHV0KHJlc3VsdHMsIHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjb3VsZG4ndCBwYXJzZSB0aGUgb3V0cHV0IHdlIGRpc3BsYXkgaXQgaW4gdGhlIGNvbnNvbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2luZ0Vycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWNFcnJvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIHJlc3VsdHMudG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIHJlc3VsdHMudG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjRXJyb3IgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBleGVjIGZhaWxlZCwgYW5kIHdlIGNvdWxkbid0IHBhcnNlIHRoZSBlcnJvciBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIHRoZXJlZm9yZSBub3QgYWxsIGZpbGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBtYXJrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBtYXJrZWQpLCB3ZSBwdXQgYSBnZW5lcmljIG1hcmtlciBvbiB0aGUgcHJvamVjdCBhbmQgYWJvcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNpbmdFcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgTWVzc2FnZXMuVW5wYXJzZWRfQUFQVF9FcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5BQVBUX0Vycm9yKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3J0IGlmIGV4ZWMgZmFpbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJydXB0cyB0aGUgYnVpbGQuIFRoZSBuZXh0IGJ1aWxkZXJzIHdpbGwgbm90IHJ1bi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQnVpbGQoTWVzc2FnZXMuQUFQVF9FcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuIHdoaWxlIGV4ZWN1dGluZyB0aGUgcHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhlIHByb2plY3QgYW5kIGV4aXQKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFBUFRfRXhlY19FcnJvciwgYXJyYXkuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGludGVycnVwdHMgdGhlIGJ1aWxkLiBUaGUgbmV4dCBidWlsZGVycyB3aWxsIG5vdCBydW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBzdG9wQnVpbGQobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZ290IGludGVycnVwdGVkIHdhaXRpbmcgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgcHJvamVjdCBhbmQgZXhpdAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQUFQVF9FeGVjX0Vycm9yLCBhcnJheS5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFya1Byb2plY3QoQWR0Q29uc3RhbnRzLk1BUktFUl9BRFQsIG1zZywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJydXB0cyB0aGUgYnVpbGQuIFRoZSBuZXh0IGJ1aWxkZXJzIHdpbGwgbm90IHJ1bi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdWlsZChtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJldHVybiBjb2RlIHdhcyBPSywgd2UgcmVmcmVzaCB0aGUgZm9sZGVyIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbnMgUi5qYXZhIHRvIGZvcmNlIGEgamF2YSByZWNvbXBpbGUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChleGVjRXJyb3IgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGFkZCB0aGUgUi5qYXZhL01hbmlmZXN0LmphdmEgdG8gdGhlIGxpc3Qgb2YgZmlsZSB0byBiZSBtYXJrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGRlcml2ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVyaXZlZFByb2dyZXNzTW9uaXRvci5hZGRGaWxlKHJKYXZhRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVyaXZlZFByb2dyZXNzTW9uaXRvci5hZGRGaWxlKG1hbmlmZXN0SmF2YUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBoYXMgYmVlbiBkb25lLiByZXNldCB0aGUgc3RhdGUgb2YgdGhlIGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXN0Q29tcGlsZVJlc291cmNlcyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RvcmUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVQcm9qZWN0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0NPTVBJTEVfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXVzdENvbXBpbGVSZXNvdXJjZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyBoYW5kbGUgdGhlIGFpZGwgc3R1ZmYuCi0gICAgICAgICAgICBib29sZWFuIGFpZGxTdGF0dXMgPSBoYW5kbGVBaWRsKHByb2plY3RUYXJnZXQsIHNvdXJjZUZvbGRlclBhdGhMaXN0LCBtb25pdG9yKTsKLQotICAgICAgICAgICAgaWYgKGFpZGxTdGF0dXMgPT0gZmFsc2UgJiYgbU11c3RDb21waWxlUmVzb3VyY2VzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50QnVpbGRUb0NvbnNvbGUoQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0UsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5Ob3RoaW5nX1RvX0NvbXBpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgJ2dlbicgc291cmNlIGZvbGRlci4gT25jZSB0aGlzIGlzIGRvbmUgd2l0aCB0aGUgY3VzdG9tIHByb2dyZXNzCi0gICAgICAgICAgICAvLyBtb25pdG9yIHRvIG1hcmsgYWxsIG5ldyBmaWxlcyBhcyBkZXJpdmVkCi0gICAgICAgICAgICBtR2VuRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1EZXJpdmVkUHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBzdXBlci5jbGVhbihtb25pdG9yKTsKLQotICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwgZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlJlbW92aW5nX0dlbmVyYXRlZF9DbGFzc2VzKTsKLQotICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXJpdmVkIHJlc291cmNlcyBmcm9tIHRoZSAnZ2VuJyBzb3VyY2UgZm9sZGVyLgotICAgICAgICByZW1vdmVEZXJpdmVkUmVzb3VyY2VzKG1HZW5Gb2xkZXIsIG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0dXBPbkluaXRpYWxpemUoKSB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0dXBPbkluaXRpYWxpemUoKTsKLQotICAgICAgICBtRGVyaXZlZFByb2dyZXNzTW9uaXRvciA9IG5ldyBEZXJpdmVkUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQotICAgICAgICAvLyBsb2FkIHRoZSBwcmV2aW91cyBJRm9sZGVyIGFuZCBqYXZhIHBhY2thZ2UuCi0gICAgICAgIG1NYW5pZmVzdFBhY2thZ2UgPSBsb2FkUHJvamVjdFN0cmluZ1Byb3BlcnR5KFBST1BFUlRZX1BBQ0tBR0UpOwotCi0gICAgICAgIC8vIGdldCB0aGUgc291cmNlIGZvbGRlciBpbiB3aGljaCBhbGwgdGhlIEphdmEgZmlsZXMgYXJlIGNyZWF0ZWQKLSAgICAgICAgbUdlbkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKFNka0NvbnN0YW50cy5GRF9HRU5fU09VUkNFUyk7Ci0KLSAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCBjb21waWxlIGZsYWdzLiBXZSBhc2sgZm9yIHRydWUgaWYgbm90IGZvdW5kIHRvIGZvcmNlIGEKLSAgICAgICAgLy8gcmVjb21waWxlLgotICAgICAgICBtTXVzdENvbXBpbGVSZXNvdXJjZXMgPSBsb2FkUHJvamVjdEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DT01QSUxFX1JFU09VUkNFUywgdHJ1ZSk7Ci0gICAgICAgIGJvb2xlYW4gbXVzdENvbXBpbGVBaWRsID0gbG9hZFByb2plY3RCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ09NUElMRV9BSURMLCB0cnVlKTsKLQotICAgICAgICAvLyBpZiB3ZSBzdG9yZWQgdGhhdCB3ZSBoYXZlIHRvIGNvbXBpbGUgc29tZSBhaWRsLCB3ZSBidWlsZCB0aGUgbGlzdCB0aGF0IHdpbGwgY29tcGlsZSB0aGVtCi0gICAgICAgIC8vIGFsbAotICAgICAgICBpZiAobXVzdENvbXBpbGVBaWRsKSB7Ci0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlclBhdGhMaXN0ID0gQmFzZVByb2plY3RIZWxwZXIuZ2V0U291cmNlQ2xhc3NwYXRocygKLSAgICAgICAgICAgICAgICAgICAgamF2YVByb2plY3QpOwotCi0gICAgICAgICAgICBidWlsZEFpZGxDb21waWxhdGlvbkxpc3QocHJvamVjdCwgc291cmNlRm9sZGVyUGF0aExpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIHRoZSBhIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGphdmEgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gcmVtb3ZlLgotICAgICAqIEBwYXJhbSBqYXZhUGFja2FnZSB0aGUgb2xkIGphdmEgcGFja2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZWxldGVPYnNvbGV0ZUdlbmVyYXRlZENsYXNzKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGphdmFQYWNrYWdlKSB7Ci0gICAgICAgIGlmIChqYXZhUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBwYWNrYWdlUGF0aCA9IGdldEphdmFQYWNrYWdlUGF0aChqYXZhUGFja2FnZSk7Ci0gICAgICAgIElQYXRoIGlQYXRoID0gcGFja2FnZVBhdGguYXBwZW5kKGZpbGVuYW1lKTsKLQotICAgICAgICAvLyBGaW5kIGEgbWF0Y2hpbmcgcmVzb3VyY2Ugb2JqZWN0LgotICAgICAgICBJUmVzb3VyY2UgamF2YUZpbGUgPSBtR2VuRm9sZGVyLmZpbmRNZW1iZXIoaVBhdGgpOwotICAgICAgICBpZiAoamF2YUZpbGUgIT0gbnVsbCAmJiBqYXZhRmlsZS5leGlzdHMoKSAmJiBqYXZhRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlCi0gICAgICAgICAgICAgICAgamF2YUZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBwYXJlbnQKLSAgICAgICAgICAgICAgICBqYXZhRmlsZS5nZXRQYXJlbnQoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBkZWxldGUgaXQsIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBkZWxldGUgaXQgbWFudWFsbHkuCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkRlbGV0ZV9PYnNvbGV0ZV9FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFGaWxlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbGF0aXZlIHtAbGluayBJUGF0aH0gZnJvbSBhIGphdmEgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gamF2YVBhY2thZ2VOYW1lIHRoZSBqYXZhIHBhY2thZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUGF0aCBnZXRKYXZhUGFja2FnZVBhdGgoU3RyaW5nIGphdmFQYWNrYWdlTmFtZSkgewotICAgICAgICAvLyBjb252ZXJ0IHRoZSBqYXZhIHBhY2thZ2UgaW50byBwYXRoCi0gICAgICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gamF2YVBhY2thZ2VOYW1lLnNwbGl0KEFuZHJvaWRDb25zdGFudHMuUkVfRE9UKTsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogc2VnbWVudHMpIHsKLSAgICAgICAgICAgcGF0aC5hcHBlbmQoQW5kcm9pZENvbnN0YW50cy5XU19TRVBfQ0hBUik7Ci0gICAgICAgICAgIHBhdGguYXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGxpbmsgSUZvbGRlcn0gKGxvY2F0ZWQgaW5zaWRlIHRoZSAnZ2VuJyBzb3VyY2UgZm9sZGVyKSwgdGhhdCBtYXRjaGVzIHRoZQotICAgICAqIHBhY2thZ2UgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QuIFRoaXMge0BsaW5rIElGb2xkZXJ9IG1heSBub3QgYWN0dWFsbHkgZXhpc3QKLSAgICAgKiAoYWFwdCB3aWxsIGNyZWF0ZSBpdCBhbnl3YXkpLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0LgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJRm9sZGVyfSB0aGF0IHdpbGwgY29udGFpbiB0aGUgUiBjbGFzcyBvciBudWxsIGlmIHRoZSBmb2xkZXIgd2FzIG5vdCBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIElGb2xkZXIgZ2V0R2VuTWFuaWZlc3RQYWNrYWdlRm9sZGVyKElQcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdldCB0aGUgcGF0aCBmb3IgdGhlIHBhY2thZ2UKLSAgICAgICAgSVBhdGggcGFja2FnZVBhdGggPSBnZXRKYXZhUGFja2FnZVBhdGgobU1hbmlmZXN0UGFja2FnZSk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgZm9sZGVyIGZvciB0aGlzIHBhdGggdW5kZXIgdGhlICdnZW4nIHNvdXJjZSBmb2xkZXIsIGFuZCByZXR1cm4gaXQuCi0gICAgICAgIC8vIFRoaXMgSUZvbGRlciBtYXkgbm90IHJlZmVyZW5jZSBhbiBhY3R1YWwgZXhpc3RpbmcgZm9sZGVyLgotICAgICAgICByZXR1cm4gbUdlbkZvbGRlci5nZXRGb2xkZXIocGFja2FnZVBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFpZGwgZmlsZXMgaW50byBqYXZhLiBUaGlzIHdpbGwgYWxzbyByZW1vdmVzIG9sZCBqYXZhIGZpbGVzCi0gICAgICogY3JlYXRlZCBmcm9tIGFpZGwgZmlsZXMgdGhhdCBhcmUgbm93IGdvbmUuCi0gICAgICogQHBhcmFtIHByb2plY3RUYXJnZXQgVGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIHNvdXJjZUZvbGRlcnMgdGhlIGxpc3Qgb2Ygc291cmNlIGZvbGRlcnMsIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2plc3MgbW9uaXRvcgotICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgZGlkIHNvbWV0aGluZwotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVBaWRsKElBbmRyb2lkVGFyZ2V0IHByb2plY3RUYXJnZXQsIEFycmF5TGlzdDxJUGF0aD4gc291cmNlRm9sZGVycywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAobUFpZGxUb0NvbXBpbGUuc2l6ZSgpID09IDAgJiYgbUFpZGxUb1JlbW92ZS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgICAgU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbNCArIHNvdXJjZUZvbGRlcnMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgY29tbWFuZFtpbmRleCsrXSA9IHByb2plY3RUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5BSURMKTsKLSAgICAgICAgY29tbWFuZFtpbmRleCsrXSA9ICItcCIgKyBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChnZXRQcm9qZWN0KCkpLmdldFBhdGgoIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldC5BTkRST0lEX0FJREwpOwotCi0gICAgICAgIC8vIHNpbmNlIHRoZSBwYXRoIGFyZSByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIGFuZCBub3QgdGhlIHByb2plY3QgaXRzZWxmLCB3ZSBuZWVkCi0gICAgICAgIC8vIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgZm9yIChJUGF0aCBwIDogc291cmNlRm9sZGVycykgewotICAgICAgICAgICAgSUZvbGRlciBmID0gd3NSb290LmdldEZvbGRlcihwKTsKLSAgICAgICAgICAgIGNvbW1hbmRbaW5kZXgrK10gPSAiLUkiICsgZi5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgZmFpbGVkIGNvbXBpbGF0aW9uLgotICAgICAgICBBcnJheUxpc3Q8QWlkbERhdGE+IHN0aWxsTmVlZENvbXBpbGF0aW9uID0gbmV3IEFycmF5TGlzdDxBaWRsRGF0YT4oKTsKLQotICAgICAgICAvLyBpZiBhbiBhaWRsIGZpbGUgaXMgYmVpbmcgcmVtb3ZlZCBiZWZvcmUgd2UgbWFuYWdlZCB0byBjb21waWxlIGl0LCBpdCdsbCBiZSBpbgotICAgICAgICAvLyBib3RoIGxpc3QuIFdlICpuZWVkKiB0byByZW1vdmUgaXQgZnJvbSB0aGUgY29tcGlsZSBsaXN0IG9yIGl0J2xsIG5ldmVyIGdvIGF3YXkuCi0gICAgICAgIGZvciAoQWlkbERhdGEgYWlkbEZpbGUgOiBtQWlkbFRvUmVtb3ZlKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gbUFpZGxUb0NvbXBpbGUuaW5kZXhPZihhaWRsRmlsZSk7Ci0gICAgICAgICAgICBpZiAocG9zICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbUFpZGxUb0NvbXBpbGUucmVtb3ZlKHBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHVudGlsIHdlJ3ZlIGNvbXBpbGUgdGhlbSBhbGwKLSAgICAgICAgZm9yIChBaWRsRGF0YSBhaWRsRGF0YSA6IG1BaWRsVG9Db21waWxlKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEFJREwgZXJyb3IgbWFya2VycyBmcm9tIHRoZSBhaWRsIGZpbGUKLSAgICAgICAgICAgIHJlbW92ZU1hcmtlcnNGcm9tRmlsZShhaWRsRGF0YS5haWRsRmlsZSwgQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQUlETCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcGF0aCBvZiB0aGUgc291cmNlIGZpbGUuCi0gICAgICAgICAgICBJUGF0aCBzb3VyY2VQYXRoID0gYWlkbERhdGEuYWlkbEZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBvc1NvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICAgICAgSUZpbGUgamF2YUZpbGUgPSBnZXRHZW5EZXN0aW5hdGlvbkZpbGUoYWlkbERhdGEsIHRydWUgLypjcmVhdGVGb2xkZXJzKi8sIG1vbml0b3IpOwotCi0gICAgICAgICAgICAvLyBmaW5pc2ggdG8gc2V0IHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgICAgICBjb21tYW5kW2luZGV4XSA9IG9zU291cmNlUGF0aDsKLSAgICAgICAgICAgIGNvbW1hbmRbaW5kZXggKyAxXSA9IGphdmFGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBsYXVuY2ggdGhlIHByb2Nlc3MKLSAgICAgICAgICAgIGlmIChleGVjQWlkbChjb21tYW5kLCBhaWRsRGF0YS5haWRsRmlsZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBhaWRsIGZhaWxlZC4gRmlsZSBzaG91bGQgYmUgbWFya2VkLiBXZSBhZGQgdGhlIGZpbGUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAvLyBvZiBmaWxlIHRoYXQgd2lsbCBuZWVkIGNvbXBpbGF0aW9uIGFnYWluLgotICAgICAgICAgICAgICAgIHN0aWxsTmVlZENvbXBpbGF0aW9uLmFkZChhaWRsRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhbmQgd2UgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyBkZXJpdmVkIG9uY2Ugd2UgcmVmcmVzaCB0aGUgJ2dlbicgc291cmNlCi0gICAgICAgICAgICAgICAgLy8gZm9sZGVyLgotICAgICAgICAgICAgICAgIG1EZXJpdmVkUHJvZ3Jlc3NNb25pdG9yLmFkZEZpbGUoamF2YUZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSBsaXN0IHRvIG9ubHkgY29udGFpbnMgdGhlIGZpbGUgdGhhdCBoYXZlIGZhaWxlZCBjb21waWxhdGlvbgotICAgICAgICBtQWlkbFRvQ29tcGlsZS5jbGVhcigpOwotICAgICAgICBtQWlkbFRvQ29tcGlsZS5hZGRBbGwoc3RpbGxOZWVkQ29tcGlsYXRpb24pOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgamF2YSBmaWxlcyBjcmVhdGVkIGZyb20gYWlkbCBmaWxlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLgotICAgICAgICBmb3IgKEFpZGxEYXRhIGFpZGxEYXRhIDogbUFpZGxUb1JlbW92ZSkgewotICAgICAgICAgICAgSUZpbGUgamF2YUZpbGUgPSBnZXRHZW5EZXN0aW5hdGlvbkZpbGUoYWlkbERhdGEsIGZhbHNlIC8qY3JlYXRlRm9sZGVycyovLCBtb25pdG9yKTsKLSAgICAgICAgICAgIGlmIChqYXZhRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgY29uZmlybXMgdGhlIGphdmEgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZGVyLAotICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBkZWxldGUgdGhlIGFpZGxGaWxlLgotICAgICAgICAgICAgICAgIGphdmFGaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggcGFyZW50LgotICAgICAgICAgICAgICAgIGphdmFGaWxlLmdldFBhcmVudCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1BaWRsVG9SZW1vdmUuY2xlYXIoKTsKLQotICAgICAgICAvLyBzdG9yZSB0aGUgYnVpbGQgc3RhdGUuIElmIHRoZXJlIGFyZSBhbnkgZmlsZXMgdGhhdCBmYWlsZWQgdG8gY29tcGlsZSwgd2Ugd2lsbAotICAgICAgICAvLyBmb3JjZSBhIGZ1bGwgYWlkbCBjb21waWxlIG9uIHRoZSBuZXh0IHByb2plY3Qgb3Blbi4gKHVubGVzcyBhIGZ1bGwgY29tcGlsYXRpb24gc3VjY2VlZAotICAgICAgICAvLyBiZWZvcmUgdGhlIHByb2plY3QgaXMgY2xvc2VkL3JlLW9wZW5lZC4pCi0gICAgICAgIC8vIFRPRE86IE9wdGltaXplIGJ5IHNhdmluZyBvbmx5IHRoZSBmaWxlcyB0aGF0IG5lZWQgY29tcGlsYXRpb24KLSAgICAgICAgc2F2ZVByb2plY3RCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ09NUElMRV9BSURMICwgbUFpZGxUb0NvbXBpbGUuc2l6ZSgpID4gMCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGaWxlfSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZm9yIGEgZ2l2ZW4gYWlsZCBzb3VyY2UgZmlsZQotICAgICAqICh7QGxpbmsgQWlkbERhdGF9KS4KLSAgICAgKiBAcGFyYW0gYWlkbERhdGEgdGhlIGRhdGEgZm9yIHRoZSBhaWRsIHNvdXJjZSBmaWxlLgotICAgICAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSBkZXN0aW5hdGlvbiBzaG91bGQgYmUgY3JlYXRlZAotICAgICAqIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0gICAgICogQHJldHVybiB0aGUgaGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgSUZpbGUgZ2V0R2VuRGVzdGluYXRpb25GaWxlKEFpZGxEYXRhIGFpZGxEYXRhLCBib29sZWFuIGNyZWF0ZUZvbGRlcnMsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gYnVpbGQgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBwYXRoLgotICAgICAgICAvLyBVc2UgdGhlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlLCBleGNlcHQgZm9yIHRoZSBwYXRoIGxlYWRpbmcgdG8gaXRzIHNvdXJjZSBmb2xkZXIsCi0gICAgICAgIC8vIGFuZCBmb3IgdGhlIGxhc3Qgc2VnbWVudCB3aGljaCBpcyB0aGUgZmlsZW5hbWUuCi0gICAgICAgIGludCBzZWdtZW50VG9Tb3VyY2VGb2xkZXJDb3VudCA9IGFpZGxEYXRhLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotICAgICAgICBJUGF0aCBwYWNrYWdlUGF0aCA9IGFpZGxEYXRhLmFpZGxGaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygKLSAgICAgICAgICAgICAgICBzZWdtZW50VG9Tb3VyY2VGb2xkZXJDb3VudCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICBQYXRoIGRlc3RpbmF0aW9uUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VQYXRoLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIGdldCBhbiBJRm9sZGVyIGZvciB0aGlzIHBhdGguIEl0J3MgcmVsYXRpdmUgdG8gdGhlICdnZW4nIGZvbGRlciBhbHJlYWR5Ci0gICAgICAgIElGb2xkZXIgZGVzdGluYXRpb25Gb2xkZXIgPSBtR2VuRm9sZGVyLmdldEZvbGRlcihkZXN0aW5hdGlvblBhdGgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBpdCBpZiBuZWVkZWQuCi0gICAgICAgIGlmIChkZXN0aW5hdGlvbkZvbGRlci5leGlzdHMoKSA9PSBmYWxzZSAmJiBjcmVhdGVGb2xkZXJzKSB7Ci0gICAgICAgICAgICBjcmVhdGVGb2xkZXIoZGVzdGluYXRpb25Gb2xkZXIsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnVpbGQgdGhlIEphdmEgZmlsZSBuYW1lIGZyb20gdGhlIGFpZGwgbmFtZS4KLSAgICAgICAgU3RyaW5nIGphdmFOYW1lID0gYWlkbERhdGEuYWlkbEZpbGUuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoQW5kcm9pZENvbnN0YW50cy5SRV9BSURMX0VYVCwKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkRPVF9KQVZBKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIGZvciB0aGUgamF2YSBmaWxlLgotICAgICAgICBJRmlsZSBqYXZhRmlsZSA9IGRlc3RpbmF0aW9uRm9sZGVyLmdldEZpbGUoamF2YU5hbWUpOwotICAgICAgICByZXR1cm4gamF2YUZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGVzdGluYXRpb24gZm9sZGVyLiBCZWNhdXNlCi0gICAgICoge0BsaW5rIElGb2xkZXIjY3JlYXRlKGJvb2xlYW4sIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpfSBvbmx5IHdvcmtzIGlmIHRoZSBwYXJlbnQgZm9sZGVyCi0gICAgICogYWxyZWFkeSBleGlzdHMsIHRoaXMgZ29lcyBhbmQgZW5zdXJlIHRoYXQgYWxsIHRoZSBwYXJlbnQgZm9sZGVycyBhY3R1YWxseSBleGlzdCwgb3IgaXQKLSAgICAgKiBjcmVhdGVzIHRoZW0gYXMgd2VsbC4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Gb2xkZXIgVGhlIGZvbGRlciB0byBjcmVhdGUKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUge0BsaW5rIElQcm9ncmVzc01vbml0b3J9LAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXIoSUZvbGRlciBkZXN0aW5hdGlvbkZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBwYXJlbnQgZXhpc3QgYW5kIGNyZWF0ZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgIElDb250YWluZXIgcGFyZW50ID0gZGVzdGluYXRpb25Gb2xkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgJiYgcGFyZW50LmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBjcmVhdGVGb2xkZXIoKElGb2xkZXIpcGFyZW50LCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZm9sZGVyLgotICAgICAgICBkZXN0aW5hdGlvbkZvbGRlci5jcmVhdGUodHJ1ZSAvKmZvcmNlKi8sIHRydWUgLypsb2NhbCovLAotICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBhaWRsIGNvbW1hbmQgbGluZSwgcGFyc2UgdGhlIG91dHB1dCwgYW5kIG1hcmsgdGhlIGFpZGwgZmlsZQotICAgICAqIHdpdGggYW55IHJlcG9ydGVkIGVycm9ycy4KLSAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgU3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlLgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBJRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhaWRsIGZpbGUgYmVpbmcKLSAgICAgKiAgICAgIGNvbXBpbGVkLgotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGV4ZWMgZmFpbGVkLCBhbmQgYnVpbGQgbmVlZHMgdG8gYmUgYWJvcnRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY0FpZGwoU3RyaW5nW10gY29tbWFuZCwgSUZpbGUgZmlsZSkgewotICAgICAgICAvLyBkbyB0aGUgZXhlYwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvY2VzcyBwID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLQotICAgICAgICAgICAgLy8gbGlzdCB0byBzdG9yZSBlYWNoIGxpbmUgb2Ygc3RkZXJyCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgb3V0cHV0IGFuZCByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ3JhYlByb2Nlc3NPdXRwdXQocCwgcmVzdWx0cyk7Ci0KLSAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gcGFyc2UgdGhlIGVycm9yIG91dHB1dAotICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IHBhcnNlQWlkbE91dHB1dChyZXN1bHRzLCBmaWxlKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHByb2Nlc3MgZmFpbGVkIGFuZCB3ZSBjb3VsZG4ndCBwYXJzZSB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAvLyB3ZSBwcmluZyBhIG1lc3NhZ2UsIG1hcmsgdGhlIHByb2plY3QgYW5kIGV4aXQKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCAmJiBlcnJvciA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgbWVzc2FnZSBpbiB0aGUgY29uc29sZS4KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShnZXRQcm9qZWN0KCksIHJlc3VsdHMudG9BcnJheSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhlIHByb2plY3QgYW5kIGV4aXQKLSAgICAgICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgTWVzc2FnZXMuVW5wYXJzZWRfQUlETF9FcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG1hcmsgdGhlIHByb2plY3QgYW5kIGV4aXQKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkFJRExfRXhlY19FcnJvciwgY29tbWFuZFswXSk7Ci0gICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbXNnLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbWFyayB0aGUgcHJvamVjdCBhbmQgZXhpdAotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQUlETF9FeGVjX0Vycm9yLCBjb21tYW5kWzBdKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBtc2csIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR29lcyB0aHJvdWdoIHRoZSBidWlsZCBwYXRocyBhbmQgZmlsbHMgdGhlIGxpc3Qgb2YgYWlkbCBmaWxlcyB0byBjb21waWxlCi0gICAgICogKHtAbGluayAjbUFpZGxUb0NvbXBpbGV9KS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVyUGF0aExpc3QgVGhlIGxpc3Qgb2Ygc291cmNlIGZvbGRlciBwYXRocy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRBaWRsQ29tcGlsYXRpb25MaXN0KElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBBcnJheUxpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlclBhdGhMaXN0KSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBmb3IgKElQYXRoIHNvdXJjZUZvbGRlclBhdGggOiBzb3VyY2VGb2xkZXJQYXRoTGlzdCkgewotICAgICAgICAgICAgSUZvbGRlciBzb3VyY2VGb2xkZXIgPSByb290LmdldEZvbGRlcihzb3VyY2VGb2xkZXJQYXRoKTsKLSAgICAgICAgICAgIC8vIHdlIGRvbid0IGxvb2sgaW4gdGhlICdnZW4nIHNvdXJjZSBmb2xkZXIgYXMgdGhlcmUgd2lsbCBiZSBubyBzb3VyY2UgaW4gdGhlcmUuCi0gICAgICAgICAgICBpZiAoc291cmNlRm9sZGVyLmV4aXN0cygpICYmIHNvdXJjZUZvbGRlci5lcXVhbHMobUdlbkZvbGRlcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBzY2FuRm9sZGVyRm9yQWlkbChzb3VyY2VGb2xkZXIsIHNvdXJjZUZvbGRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FucyBhIGZvbGRlciBhbmQgZmlsbHMgdGhlIGxpc3Qgb2YgYWlkbCBmaWxlcyB0byBjb21waWxlLgotICAgICAqIEBwYXJhbSBzb3VyY2VGb2xkZXIgdGhlIHJvb3Qgc291cmNlIGZvbGRlci4KLSAgICAgKiBAcGFyYW0gZm9sZGVyIFRoZSBmb2xkZXIgdG8gc2Nhbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NhbkZvbGRlckZvckFpZGwoSUZvbGRlciBzb3VyY2VGb2xkZXIsIElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gZm9sZGVyLm1lbWJlcnMoKTsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHIgOiBtZW1iZXJzKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgICAgc3dpdGNoIChyLmdldFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZJTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgYSBmaWxlLCBjaGVjayB0aGF0IHRoZSBmaWxlIGFjdHVhbGx5IGV4aXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGl0J3MgYW4gYWlkbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmV4aXN0cygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5FWFRfQUlETC5lcXVhbHNJZ25vcmVDYXNlKHIuZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFpZGxUb0NvbXBpbGUuYWRkKG5ldyBBaWRsRGF0YShzb3VyY2VGb2xkZXIsIChJRmlsZSlyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotICAgICAgICAgICAgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBnbyB0aHJvdWdoIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgICAgIHNjYW5Gb2xkZXJGb3JBaWRsKHNvdXJjZUZvbGRlciwgKElGb2xkZXIpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd291bGQgbWVhbiBpdCdzIGEgcHJvamVjdCBvciB0aGUgd29ya3NwYWNlIHJvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgdW5saWtlbHkgdG8gaGFwcGVuLiB3ZSBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvdWxkbid0IGdldCB0aGUgbWVtYmVycyBsaXN0IGZvciBzb21lIHJlYXNvbi4gSnVzdCByZXR1cm4uCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBvdXRwdXQgb2YgYWlkbCBhbmQgbWFyayB0aGUgZmlsZSB3aXRoIGFueSBlcnJvcnMuCi0gICAgICogQHBhcmFtIGxpbmVzIFRoZSBvdXRwdXQgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gbWFyayB3aXRoIGVycm9yLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyc2luZyBmYWlsZWQsIGZhbHNlIGlmIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlQWlkbE91dHB1dChBcnJheUxpc3Q8U3RyaW5nPiBsaW5lcywgSUZpbGUgZmlsZSkgewotICAgICAgICAvLyBub3RoaW5nIHRvIHBhcnNlPyBqdXN0IHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGxpbmVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXRjaGVyIG07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHAgPSBsaW5lcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIG0gPSBzQWlkbFBhdHRlcm4xLm1hdGNoZXIocCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gaWdub3JlIGdyb3VwIDEgd2hpY2ggaXMgdGhlIGxvY2F0aW9uIHNpbmNlIHdlIGFscmVhZHkKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGEgSUZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWlkbCBmaWxlLgotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gbS5ncm91cCgzKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGluZSBudW1iZXIKLSAgICAgICAgICAgICAgICBpbnQgbGluZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IEludGVnZXIucGFyc2VJbnQobGluZVN0cik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB0aGUgc3RyaW5nIHdlIGV4dHJhY3RlZCB3YXNuJ3QgYSB2YWxpZAotICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIG51bWJlci4gUGFyc2luZyBmYWlsZWQgYW5kIHdlIHJldHVybiB0cnVlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIoZmlsZSwgQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQUlETCwgbXNnLCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAvLyBzdWNjZXNzLCBnbyB0byB0aGUgbmV4dCBsaW5lCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGludmFsaWQgbGluZSBmb3JtYXQsIGZsYWcgYXMgZXJyb3IsIGFuZCBiYWlsCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgY3VycmVudCBsaXN0IG9mIGFpZGwgZmlsZSB0byBjb21waWxlL3JlbW92ZSB3aXRoIHRoZSBuZXcgb25lLgotICAgICAqIEBwYXJhbSB0b0NvbXBpbGUgTGlzdCBvZiBmaWxlIHRvIGNvbXBpbGUKLSAgICAgKiBAcGFyYW0gdG9SZW1vdmUgTGlzdCBvZiBmaWxlIHRvIHJlbW92ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtZXJnZUFpZGxGaWxlTW9kaWZpY2F0aW9ucyhBcnJheUxpc3Q8QWlkbERhdGE+IHRvQ29tcGlsZSwKLSAgICAgICAgICAgIEFycmF5TGlzdDxBaWRsRGF0YT4gdG9SZW1vdmUpIHsKLSAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBuZXcgdG9SZW1vdmUgbGlzdCwgYW5kIGFkZCBpdCB0byB0aGUgb2xkIG9uZSwKLSAgICAgICAgLy8gcGx1cyByZW1vdmUgYW55IGZpbGUgdGhhdCB3YXMgc3RpbGwgdG8gY29tcGlsZSBhbmQgdGhhdCBhcmUgbm93Ci0gICAgICAgIC8vIHJlbW92ZWQKLSAgICAgICAgZm9yIChBaWRsRGF0YSByIDogdG9SZW1vdmUpIHsKLSAgICAgICAgICAgIGlmIChtQWlkbFRvUmVtb3ZlLmluZGV4T2YocikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtQWlkbFRvUmVtb3ZlLmFkZChyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGluZGV4ID0gbUFpZGxUb0NvbXBpbGUuaW5kZXhPZihyKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1BaWRsVG9Db21waWxlLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBuZXcgZmlsZXMgdG8gY29tcGlsZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgotICAgICAgICAvLyBBbHNvIGxvb2sgZm9yIHRoZW0gaW4gdGhlIHJlbW92ZSBsaXN0LCB0aGlzIHdvdWxkIG1lYW4gdGhhdCB0aGV5Ci0gICAgICAgIC8vIHdlcmUgcmVtb3ZlZCwgdGhlbiBhZGRlZCBiYWNrLCBhbmQgd2Ugc2hvdWxkbid0IHJlbW92ZSB0aGVtLCBqdXN0Ci0gICAgICAgIC8vIHJlY29tcGlsZSB0aGVtLgotICAgICAgICBmb3IgKEFpZGxEYXRhIHIgOiB0b0NvbXBpbGUpIHsKLSAgICAgICAgICAgIGlmIChtQWlkbFRvQ29tcGlsZS5pbmRleE9mKHIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbUFpZGxUb0NvbXBpbGUuYWRkKHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBtQWlkbFRvUmVtb3ZlLmluZGV4T2Yocik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtQWlkbFRvUmVtb3ZlLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYnVpbGQvUHJlQ29tcGlsZXJEZWx0YVZpc2l0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9QcmVDb21waWxlckRlbHRhVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU2MzY1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9QcmVDb21waWxlckRlbHRhVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZC5CYXNlQnVpbGRlci5CYXNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZC5QcmVDb21waWxlckJ1aWxkZXIuQWlkbERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkJhc2VQcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBSZXNvdXJjZSBEZWx0YSB2aXNpdG9yIGZvciB0aGUgcHJlLWNvbXBpbGVyLgotICogPHAvPlRoaXMgZGVsdGEgdmlzaXRvciBvbmx5IGNhcmVzIGFib3V0IGZpbGVzIHRoYXQgYXJlIHRoZSBzb3VyY2Ugb3IgdGhlIHJlc3VsdCBvZiBhY3Rpb25zIG9mIHRoZQotICoge0BsaW5rIFByZUNvbXBpbGVyQnVpbGRlcn06Ci0gKiA8dWw+PGxpPlIuamF2YS9NYW5pZmVzdC5qYXZhIGdlbmVyYXRlZCBieSBjb21waWxpbmcgdGhlIHJlc291cmNlczwvbGk+Ci0gKiA8bGk+QW55IEphdmEgZmlsZXMgZ2VuZXJhdGVkIGJ5IDxjb2RlPmFpZGw8L2NvZGU+PC9saT48L3VsPi4KLSAqCi0gKiBUaGVyZWZvcmUgaXQgbG9va3MgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiA8dWw+PGxpPkFueSBtb2RpZmljYXRpb24gaW4gdGhlIHJlc291cmNlIGZvbGRlcjwvbGk+Ci0gKiA8bGk+UmVtb3ZlZCBmaWxlcyBmcm9tIHRoZSBzb3VyY2UgZm9sZGVyIHJlY2VpdmluZyBnZW5lcmF0ZWQgSmF2YSBmaWxlczwvbGk+Ci0gKiA8bGk+QW55IG1vZGlmaWNhdGlvbiB0byBhaWRsIGZpbGVzLjwvbGk+Ci0gKgotICovCi1jbGFzcyBQcmVDb21waWxlckRlbHRhVmlzaXRvciBleHRlbmRzIEJhc2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cwotICAgICAgICBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0gICAgcHJpdmF0ZSBlbnVtIEFpZGxUeXBlIHsKLSAgICAgICAgVU5LTk9XTiwgSU5URVJGQUNFLCBQQVJDRUxBQkxFOwotICAgIH0KLQotICAgIC8vIFNlZSBjb21tZW50IGluICNnZXRBaWRsVHlwZSgpCi0vLyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNQYXJjZWxhYmxlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLS8vICAgICAgICAgICAgIl5cXHMqcGFyY2VsYWJsZVxccysoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXHMqO1xccyokIik7Ci0vLwotLy8gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBzSW50ZXJmYWNlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLS8vICAgICAgICAgICAgIl5cXHMqaW50ZXJmYWNlXFxzKyhbYS16QS1aX11bYS16QS1aMC05X10qKVxccyooPzpcXHsuKik/JCIpOwotCi0gICAgLy8gUmVzdWx0IGZpZWxkcy4KLSAgICAvKioKLSAgICAgKiBDb21waWxlIGZsYWcuIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgb25lIG9mIHRoZSBjaGFuZ2VkL2FkZGVkL3JlbW92ZWQKLSAgICAgKiBmaWxlIGlzIGEgcmVzb3VyY2UgZmlsZS4gVXBvbiB2aXNpdGluZyBhbGwgdGhlIGRlbHRhIHJlc291cmNlcywgaWYKLSAgICAgKiB0aGlzIGZsYWcgaXMgdHJ1ZSwgdGhlbiB3ZSBrbm93IHdlJ2xsIGhhdmUgdG8gY29tcGlsZSB0aGUgcmVzb3VyY2VzCi0gICAgICogaW50byBSLmphdmEKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNvbXBpbGVSZXNvdXJjZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEFpZGwgZm9yY2UgcmVjb21waWxhdGlvbiBmbGFnLiBJZiB0cnVlLCB3ZSdsbCBhdHRlbXB0IHRvIHJlY29tcGlsZSBhbGwgYWlkbCBmaWxlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlQWlkbENvbXBpbGUgPSBmYWxzZTsKLQotICAgIC8qKiBMaXN0IG9mIC5haWRsIGZpbGVzIGZvdW5kIHRoYXQgYXJlIG1vZGlmaWVkIG9yIG5ldy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxBaWRsRGF0YT4gbUFpZGxUb0NvbXBpbGUgPSBuZXcgQXJyYXlMaXN0PEFpZGxEYXRhPigpOwotCi0gICAgLyoqIExpc3Qgb2YgLmFpZGwgZmlsZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxBaWRsRGF0YT4gbUFpZGxUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QWlkbERhdGE+KCk7Ci0KLSAgICAvKiogTWFuaWZlc3QgY2hlY2svcGFyc2luZyBmbGFnLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZE1hbmlmZXN0WG1sID0gZmFsc2U7Ci0KLSAgICAvKiogQXBwbGljYXRpb24gUGFja2FnZSwgZ2F0aGVyZWQgZnJvbSB0aGUgcGFyc2luZyBvZiB0aGUgbWFuaWZlc3QgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtSmF2YVBhY2thZ2UgPSBudWxsOwotICAgIC8qKiBtaW5TREtWZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSwgZ2F0aGVyZWQgZnJvbSB0aGUgcGFyc2luZyBvZiB0aGUgbWFuaWZlc3QgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtTWluU2RrVmVyc2lvbiA9IG51bGw7Ci0KLSAgICAvLyBJbnRlcm5hbCB1c2FnZSBmaWVsZHMuCi0gICAgLyoqCi0gICAgICogSW4gUmVzb3VyY2UgZm9sZGVyIGZsYWcuIFRoaXMgYWxsb3dzIHVzIHRvIGtub3cgaWYgd2UncmUgaW4gdGhlCi0gICAgICogcmVzb3VyY2UgZm9sZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5SZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEN1cnJlbnQgU291cmNlIGZvbGRlci4gVGhpcyBhbGxvd3MgdXMgdG8ga25vdyBpZiB3ZSdyZSBpbiBhIHNvdXJjZQotICAgICAqIGZvbGRlciwgYW5kIHdoaWNoIGZvbGRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIElGb2xkZXIgbVNvdXJjZUZvbGRlciA9IG51bGw7Ci0KLSAgICAvKiogTGlzdCBvZiBzb3VyY2UgZm9sZGVycy4gKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxJUGF0aD4gbVNvdXJjZUZvbGRlcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0dlblNvdXJjZUZvbGRlciA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCBtUm9vdDsKLQotCi0gICAgcHVibGljIFByZUNvbXBpbGVyRGVsdGFWaXNpdG9yKEJhc2VCdWlsZGVyIGJ1aWxkZXIsIEFycmF5TGlzdDxJUGF0aD4gc291cmNlRm9sZGVycykgewotICAgICAgICBzdXBlcihidWlsZGVyKTsKLSAgICAgICAgbVNvdXJjZUZvbGRlcnMgPSBzb3VyY2VGb2xkZXJzOwotICAgICAgICBtUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q29tcGlsZVJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Db21waWxlUmVzb3VyY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmNlQWlkbENvbXBpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtRm9yY2VBaWRsQ29tcGlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEFpZGxEYXRhPiBnZXRBaWRsVG9Db21waWxlKCkgewotICAgICAgICByZXR1cm4gbUFpZGxUb0NvbXBpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxBaWRsRGF0YT4gZ2V0QWlkbFRvUmVtb3ZlKCkgewotICAgICAgICByZXR1cm4gbUFpZGxUb1JlbW92ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG1hbmlmZXN0IGZpbGUgd2FzIHBhcnNlZC9jaGVja2VkIGZvciBlcnJvciBkdXJpbmcgdGhlIHJlc291cmNlIGRlbHRhCi0gICAgICogdmlzaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tlZE1hbmlmZXN0WG1sKCkgewotICAgICAgICByZXR1cm4gbUNoZWNrZWRNYW5pZmVzdFhtbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYW5pZmVzdCBwYWNrYWdlIGlmIHRoZSBtYW5pZmVzdCB3YXMgY2hlY2tlZC9wYXJzZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgY2FuIHJldHVybiBudWxsIGluIHR3byBjYXNlczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBtYW5pZmVzdCB3YXMgbm90IHBhcnQgb2YgdGhlIHJlc291cmNlIGNoYW5nZSBkZWx0YSwgYW5kIHRoZSBtYW5pZmVzdCB3YXMKLSAgICAgKiBub3QgY2hlY2tlZC9wYXJzZWQgKHtAbGluayAjZ2V0Q2hlY2tlZE1hbmlmZXN0WG1sKCl9IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+KTwvbGk+Ci0gICAgICogPGxpPlRoZSBtYW5pZmVzdCB3YXMgcGFyc2VkICh7QGxpbmsgI2dldENoZWNrZWRNYW5pZmVzdFhtbCgpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+KSwKLSAgICAgKiBidXQgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gaXMgbWlzc2luZzwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHRoZSBtYW5pZmVzdCBwYWNrYWdlIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtSmF2YVBhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWluU0RrVmVyc2lvbiBhdHRyaWJ1dGUgZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgd2FzIGNoZWNrZWQvcGFyc2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGNhbiByZXR1cm4gbnVsbCBpbiB0d28gY2FzZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgbWFuaWZlc3Qgd2FzIG5vdCBwYXJ0IG9mIHRoZSByZXNvdXJjZSBjaGFuZ2UgZGVsdGEsIGFuZCB0aGUgbWFuaWZlc3Qgd2FzCi0gICAgICogbm90IGNoZWNrZWQvcGFyc2VkICh7QGxpbmsgI2dldENoZWNrZWRNYW5pZmVzdFhtbCgpfSByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPik8L2xpPgotICAgICAqIDxsaT5UaGUgbWFuaWZlc3Qgd2FzIHBhcnNlZCAoe0BsaW5rICNnZXRDaGVja2VkTWFuaWZlc3RYbWwoKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiksCi0gICAgICogYnV0IHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGlzIG1pc3Npbmc8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHJldHVybiB0aGUgbWluU2RrVmVyc2lvbiBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluU2RrVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1NaW5TZGtWZXJzaW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IKLSAgICAgKiAgICAgICN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyB3ZSBhcmUgb25seSBnb2luZyB0byBsb29rIGZvciBjaGFuZ2VzIGluIHJlcy8sIHNvdXJjZSBmb2xkZXJzIGFuZCBpbgotICAgICAgICAvLyBBbmRyb2lkTWFuaWZlc3QueG1sIHNpbmNlIHRoZSBkZWx0YSB2aXNpdG9yIGdvZXMgdGhyb3VnaCB0aGUgbWFpbgotICAgICAgICAvLyBmb2xkZXIgYmVmb3JlIGl0cyBjaGlsZHJlbiB3ZSBjYW4gY2hlY2sgd2hlbiB0aGUgcGF0aCBzZWdtZW50Ci0gICAgICAgIC8vIGNvdW50IGlzIDIgKGZvcm1hdCB3aWxsIGJlIC8kUHJvamVjdC9mb2xkZXIpIGFuZCBtYWtlIHN1cmUgd2UgYXJlCi0gICAgICAgIC8vIHByb2Nlc3NpbmcgcmVzLywgc291cmNlIGZvbGRlcnMgb3IgQW5kcm9pZE1hbmlmZXN0LnhtbAotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsKLQotICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgdmlzaXRvciBhbHNvIHZpc2l0cyB0aGUgcm9vdCB3ZSByZXR1cm4gdHJ1ZSBpZgotICAgICAgICAvLyBzZWdtZW50cy5sZW5ndGggPSAxCi0gICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgLy8gRklYTUU6IGNoZWNrIHRoaXMgaXMgYW4gQW5kcm9pZCBwcm9qZWN0LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudHMubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBhdCBhbiBpdGVtIGRpcmVjdGx5IHVuZGVyIHRoZSByb290IGRpcmVjdG9yeSwKLSAgICAgICAgICAgIC8vIHRoZW4gd2UgYXJlIG5vdCB5ZXQgaW4gYSBzb3VyY2Ugb3IgcmVzb3VyY2UgZm9sZGVyCi0gICAgICAgICAgICBtSW5SZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG1Tb3VyY2VGb2xkZXIgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUy5lcXVhbHNJZ25vcmVDYXNlKHNlZ21lbnRzWzFdKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHJlc291cmNlIGZvbGRlciB0aGF0IHdhcyBtb2RpZmllZC4gd2Ugd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIHNlZSBpdHMgY29udGVudC4KLQotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHZpc2l0IGl0cyBjaGlsZHJlbiBuZXh0LCB3ZSBzZXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gZmxhZwotICAgICAgICAgICAgICAgIG1JblJlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZUZvbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVC5lcXVhbHNJZ25vcmVDYXNlKHNlZ21lbnRzWzFdKSkgewotICAgICAgICAgICAgICAgIC8vIGFueSBjaGFuZ2UgaW4gdGhlIG1hbmlmZXN0IGNvdWxkIHRyaWdnZXIgYSBuZXcgUi5qYXZhCi0gICAgICAgICAgICAgICAgLy8gY2xhc3MsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGRlbHRhIGtpbmQKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIG1hbmlmZXN0IGZvciBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIHBhcnNlciA9IEJhc2VQcm9qZWN0SGVscGVyLnBhcnNlTWFuaWZlc3RGb3JFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUZpbGUpcmVzb3VyY2UsIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUphdmFQYWNrYWdlID0gcGFyc2VyLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5TZGtWZXJzaW9uID0gcGFyc2VyLmdldEFwaUxldmVsUmVxdWlyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1DaGVja2VkTWFuaWZlc3RYbWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ29tcGlsZVJlc291cmNlcyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGdvIHRvIHRoZSBjaGlsZHJlbiwgbm90IGxpa2UgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAvLyBhbnkgZm9yIHRoaXMgcmVzb3VyY2UgYW55d2F5LgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgY2FuIGVpdGhlciBiZSBpbiB0aGUgc291cmNlIGZvbGRlciBvciBpbiB0aGUKLSAgICAgICAgLy8gcmVzb3VyY2UgZm9sZGVyIG9yIGluIGEgZGlmZmVyZW50IGZvbGRlciB0aGF0IGNvbnRhaW5zIGEgc291cmNlCi0gICAgICAgIC8vIGZvbGRlci4KLSAgICAgICAgLy8gVGhpcyBpcyBkdWUgdG8gbm90IGFsbCBzb3VyY2UgZm9sZGVyIGJlaW5nIHNyYy8uIFNvbWUgY291bGQgYmUKLSAgICAgICAgLy8gc29tZXRoaW5nL3NvbWV0aGluZ2Vsc2Uvc3JjLwotCi0gICAgICAgIC8vIHNvIGZpcnN0IHdlIHRlc3QgaWYgd2UgYWxyZWFkeSBrbm93IHdlIGFyZSBpbiBhIHNvdXJjZSBvcgotICAgICAgICAvLyByZXNvdXJjZSBmb2xkZXIuCi0KLSAgICAgICAgaWYgKG1Tb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGluIHRoZSByZXMgZm9sZGVyLCB3ZSBhcmUgbG9va2luZyBmb3IgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotICAgICAgICAgICAgLy8gLSBhZGRlZC9yZW1vdmVkL21vZGlmaWVkIGFpZGwgZmlsZXMuCi0gICAgICAgICAgICAvLyAtIG1pc3NpbmcgUi5qYXZhIGZpbGUKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHJlc291cmNlIGlzIGEgZm9sZGVyLCB3ZSBqdXN0IGdvIHN0cmFpZ2h0IHRvIHRoZSBjaGlsZHJlbgotICAgICAgICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKXJlc291cmNlOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIG1vZGlmaWNhdGlvbiBraW5kCi0gICAgICAgICAgICBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQotICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBub3JtYWwgc291cmNlIGZvbGRlciBhbmQgdGhlICdnZW4nIHNvdXJjZSBmb2xkZXIgZGlmZmVyZW50bHkuCi0gICAgICAgICAgICBpZiAobUlzR2VuU291cmNlRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZ2VuZXJhdGVkIGphdmEgZmlsZSBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgICAgIC8vIC0gaWYgUi5qYXZhL01hbmlmZXN0LmphdmEgYXJlIHJlbW92ZWQvbW9kaWZpZWQsIHdlIHJlY29tcGlsZSB0aGUgcmVzb3VyY2VzCi0gICAgICAgICAgICAgICAgLy8gLSBpZiBhaWRsIGZpbGVzIGFyZSByZW1vdmVkL21vZGlmaWVkLCB3ZSByZWNvbXBpbGUgdGhlbS4KLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0V2FybmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIG9mIFIuamF2YS9NYW5pZmVzdC5qYXZhLgotICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkZOX1JFU09VUkNFX0NMQVNTLmVxdWFscyhmaWxlTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fTUFOSUZFU1RfQ0xBU1MuZXF1YWxzKGZpbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCB3YXMgcmVtb3ZlZCwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IHRoYXQgaXQgd2FzIHJlbW92ZWQgZHVlIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFja2FnZSBjaGFuZ2UsIG9yIGFuIGFpZGwgdGhhdCB3YXMgcmVtb3ZlZCwgYnV0IHRoZSBvbmx5IHRoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgd2lsbCBoYXBwZW4gaXMgdGhhdCB3ZSdsbCBoYXZlIGFuIGV4dHJhIGJ1aWxkLiBOb3QgbXVjaCBvZiBhIHByb2JsZW0uCi0gICAgICAgICAgICAgICAgICAgIG1Db21waWxlUmVzb3VyY2VzID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IGEgd2FybmluZwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcyB0byBiZSBhIEphdmEgZmlsZSBjcmVhdGVkIGZyb20gYW4gYWlkbCBmaWxlLgotICAgICAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgc291cmNlIGFpZGwgZmlsZSBpbiBhbGwgdGhlIHNvdXJjZSBmb2xkZXJzLgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWlkbEZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZUFsbChBbmRyb2lkQ29uc3RhbnRzLlJFX0pBVkFfRVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRE9UX0FJREwpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSVBhdGggc291cmNlRm9sZGVyUGF0aCA6IG1Tb3VyY2VGb2xkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc2VhcmNoIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmb2xkZXIgYXMgaXQgaXMgdGhlICdnZW4nIGZvbGRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGb2xkZXJQYXRoLmVxdWFscyhtU291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIElGb2xkZXIgc291cmNlRm9sZGVyID0gZ2V0Rm9sZGVyKHNvdXJjZUZvbGRlclBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gcmVjdXJzaXZlbHksIHNlZ21lbnQgYnkgc2VnbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBzdGFydHMgYXQgMiAoMCBpcyBwcm9qZWN0LCAxIGlzICdnZW4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgc291cmNlRmlsZSA9IGZpbmRGaWxlKHNvdXJjZUZvbGRlciwgc2VnbWVudHMsIDIsIGFpZGxGaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBzb3VyY2UuIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBjb21waWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BaWRsVG9Db21waWxlLmFkZChuZXcgQWlkbERhdGEoc291cmNlRm9sZGVyLCBzb3VyY2VGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFdhcm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0V2FybmluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBwcmluZyBhbiBlcnJvciBqdXN0IHNvIHRoYXQgaXQncyByZWQsIGJ1dCBpdCdzIGp1c3QgYSB3YXJuaW5nIHJlYWxseS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLnNfUmVtb3ZlZF9SZWNyZWF0aW5nX3MsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKG1CdWlsZGVyLmdldFByb2plY3QoKSwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIHdhcyBtb2RpZmllZCBtYW51YWxseSEgd2UgY2FuJ3QgYWxsb3cgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5zX01vZGlmaWVkX01hbnVhbGx5X1JlY3JlYXRpbmdfcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobUJ1aWxkZXIuZ2V0UHJvamVjdCgpLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFub3RoZXIgc291cmNlIGZvbGRlci4KLSAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgYWlkbCBmaWxlcyBiZWluZyBhZGRlZC9tb2RpZmllZC9yZW1vdmVkLgotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHJlc291cmNlCi0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dCA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoQW5kcm9pZENvbnN0YW50cy5FWFRfQUlETC5lcXVhbHNJZ25vcmVDYXNlKGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgd2hldGhlciBpdCdzIGEgcmVndWxhciBmaWxlIG9yIGEgcGFyY2VsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGUgdHlwZSA9IGdldEFpZGxUeXBlKGZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFpZGxUeXBlLklOVEVSRkFDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWlkbFRvUmVtb3ZlLmFkZChuZXcgQWlkbERhdGEobVNvdXJjZUZvbGRlciwgZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRm9yY2VBaWRsQ29tcGlsZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgYWlkbCBmaWxlIHRvIHRoZSBsaXN0IG9mIGZpbGUgdG8gKHJlKWNvbXBpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWlkbFRvQ29tcGlsZS5hZGQobmV3IEFpZGxEYXRhKG1Tb3VyY2VGb2xkZXIsIGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHJlY29tcGlsYXRpb25zIG9mIGFsbCBBaWRsIEZpbGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgbUZvcmNlQWlkbENvbXBpbGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFpZGxUb0NvbXBpbGUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm8gY2hpbGRyZW4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAobUluUmVzKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gdGhlIHJlcyBmb2xkZXIsIHdlIGFyZSBsb29raW5nIGZvciB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICAvLyBjaGFuZ2VzOgotICAgICAgICAgICAgLy8gLSBhZGRlZC9yZW1vdmVkL21vZGlmaWVkIHhtbCBmaWxlcy4KLSAgICAgICAgICAgIC8vIC0gYWRkZWQvcmVtb3ZlZCBmaWxlcyBvZiBhbnkgb3RoZXIgdHlwZQotCi0gICAgICAgICAgICAvLyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBmb2xkZXIsIHdlIGp1c3QgZ28gc3RyYWlnaHQgdG8gdGhlCi0gICAgICAgICAgICAvLyBjaGlsZHJlbgotICAgICAgICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgU3RyaW5nIGV4dCA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgICAgIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHZlcmJvc2UgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5zX01vZGlmaWVkX1JlY3JlYXRpbmdfcywgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX1JFU09VUkNFX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSB2ZXJib3NlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuQWRkZWRfc19zX05lZWRzX1VwZGF0aW5nLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VfQ0xBU1MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdmVyYm9zZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLnNfUmVtb3ZlZF9zX05lZWRzX1VwZGF0aW5nLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fUkVTT1VSQ0VfQ0xBU1MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmdldFByb2plY3QoKSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9YTUwuZXF1YWxzSWdub3JlQ2FzZShleHQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbmQgIT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB4bWwgVmFsaWRpdHkKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuY2hlY2tYTUwocmVzb3VyY2UsIHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBnb2luZyB0aHJvdWdoIHRoaXMgcmVzb3VyY2UsIGl0IHdhcyBtb2RpZmllZAotICAgICAgICAgICAgICAgIC8vIHNvbWVob3cuCi0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBpZiBpdCB3YXMgYW4gYWRkZWQvcmVtb3ZlZC9jaGFuZ2VkIGV2ZW50Ci0gICAgICAgICAgICAgICAgbUNvbXBpbGVSZXNvdXJjZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5vbiB4bWwgcmVzb3VyY2UuCi0gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZVJlc291cmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgbWF5IGJlIGluc2lkZSBhIGZvbGRlciB0aGF0IGNvbnRhaW5zIGEgc291cmNlCi0gICAgICAgICAgICAvLyBmb2xkZXIsIGdvIHRocm91Z2ggdGhlIGxpc3Qgb2Yga25vd24gc291cmNlIGZvbGRlcnMKLQotICAgICAgICAgICAgZm9yIChJUGF0aCBzb3VyY2VGb2xkZXJQYXRoIDogbVNvdXJjZUZvbGRlcnMpIHsKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGV5IG1hdGNoIGV4YWN0bHkuCi0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZvbGRlclBhdGguZXF1YWxzKHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzb3VyY2UgZm9sZGVyIQotICAgICAgICAgICAgICAgICAgICBtSW5SZXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZUZvbGRlciA9IGdldEZvbGRlcihzb3VyY2VGb2xkZXJQYXRoKTsgLy8gYWxsIG5vbiBudWxsIGR1ZSB0byB0ZXN0IGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIG1Jc0dlblNvdXJjZUZvbGRlciA9IHBhdGguc2VnbWVudENvdW50KCkgPT0gMiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc2VnbWVudCgxKS5lcXVhbHMoU2RrQ29uc3RhbnRzLkZEX0dFTl9TT1VSQ0VTKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG9uIHRoZSB3YXkgdG8gYSBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHNvdXJjZUZvbGRlclBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSBwYXRoLnNlZ21lbnRDb3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JblJlcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGhlcmUsIHdlIGFyZSB2aXNpdGluZyBhbm90aGVyIGZvbGRlcgotICAgICAgICAgICAgLy8gbGlrZSAvJFByb2plY3QvYmluLyBmb3IgaW5zdGFuY2UgKHdlIGdldCBub3RpZmllZCBmb3IgY2hhbmdlcwotICAgICAgICAgICAgLy8gaW4gLmNsYXNzISkKLSAgICAgICAgICAgIC8vIFRoaXMgY291bGQgYWxzbyBiZSBhbm90aGVyIHNvdXJjZSBmb2xkZXIgYW5kIHdlIGhhdmUgZm91bmQKLSAgICAgICAgICAgIC8vIFIuamF2YSBpbiBhIHByZXZpb3VzIHNvdXJjZSBmb2xkZXIKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdmlzaXQgaXRzIGNoaWxkcmVuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIGFuZCByZXR1cm4gYSBmaWxlIGluIGEgZm9sZGVyLiBUaGUgZmlsZSBpcyBkZWZpbmVkIGJ5IGl0cyBzZWdtZW50cywgYW5kIGEgbmV3Ci0gICAgICogbmFtZSAocmVwbGFjaW5nIHRoZSBsYXN0IHNlZ21lbnQpLgotICAgICAqIEBwYXJhbSBmb2xkZXIgdGhlIGZvbGRlciB3ZSBhcmUgc2VhcmNoaW5nCi0gICAgICogQHBhcmFtIHNlZ21lbnRzIHRoZSBzZWdtZW50cyBvZiB0aGUgZmlsZSB0byBzZWFyY2guCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWdtZW50IHdlIGFyZSBsb29raW5nIGZvcgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmV3IG5hbWUgdG8gcmVwbGFjZSB0aGUgbGFzdCBzZWdtZW50LgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJRmlsZX0gcmVwcmVzZW50aW5nIHRoZSBzZWFyY2hlZCBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgSUZpbGUgZmluZEZpbGUoSUZvbGRlciBmb2xkZXIsIFN0cmluZ1tdIHNlZ21lbnRzLCBpbnQgaW5kZXgsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBib29sZWFuIGxhc3RTZWdtZW50ID0gaW5kZXggPT0gc2VnbWVudHMubGVuZ3RoIC0gMTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZm9sZGVyLmZpbmRNZW1iZXIobGFzdFNlZ21lbnQgPyBmaWxlbmFtZSA6IHNlZ21lbnRzW2luZGV4XSk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUZpbGUpcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRGaWxlKChJRm9sZGVyKXJlc291cmNlLCBzZWdtZW50cywgaW5kZXgrMSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmb2xkZXIgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGlzIGNvbnRhaW5lci4KLSAgICAgKiA8cC8+VGhlIGRpZmZlcmVudCB3aXRoIHtAbGluayBJQ29udGFpbmVyI2dldEZvbGRlcihJUGF0aCl9IGlzIHRoYXQgdGhpcyByZXR1cm5zIGEgbm9uCi0gICAgICogbnVsbCBvYmplY3Qgb25seSBpZiB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzIGFuZCBpcyBhIGZvbGRlciAoYW5kIG5vdCBhIGZpbGUpCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byByZXR1cm4uCi0gICAgICogQHJldHVybiBhIGhhbmRsZSB0byB0aGUgZm9sZGVyIGlmIGl0IGV4aXN0cywgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRm9sZGVyIGdldEZvbGRlcihJUGF0aCBwYXRoKSB7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG1Sb290LmZpbmRNZW1iZXIocGF0aCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICByZXR1cm4gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBhaWRsIGZpbGUuIEFpZGwgZmlsZXMgY2FuIGVpdGhlciBkZWNsYXJlIGludGVyZmFjZXMsIG9yIGRlY2xhcmUKLSAgICAgKiBwYXJjZWxhYmxlcy4gVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlIGFuZCByZXR1cm4gdGhlIHR5cGUuIElmIHRoZSB0eXBlCi0gICAgICogY2Fubm90IGJlIGRldGVybWluZWQsIHRoZW4gaXQgd2lsbCByZXR1cm4ge0BsaW5rIEFpZGxUeXBlI1VOS05PV059LgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBhaWRsIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhaWRsLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgQWlkbFR5cGUgZ2V0QWlkbFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBBdCB0aGlzIHRpbWUsIHBhcnNpbmcgaXNuJ3QgYXZhaWxhYmxlLCBzbyB3ZSByZXR1cm4gVU5LTk9XTi4gVGhpcyB3aWxsIGZvcmNlCi0gICAgICAgIC8vIGEgcmVjb21waWxhdGlvbiBvZiBhbGwgYWlkbCBmaWxlIGFzIHNvb24gYXMgb25lIGlzIGNoYW5nZWQuCi0gICAgICAgIHJldHVybiBBaWRsVHlwZS5VTktOT1dOOwotCi0gICAgICAgIC8vIFRPRE86IHByb3Blcmx5IHBhcnNlIGFpZGwgZmlsZSB0byBkZXRlcm1pbmUgdHlwZSBhbmQgZ2VuZXJhdGUgZGVwZW5kZW5jeSBncmFwaHMuCi0vLwotLy8gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwKLS8vICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLmxlbmd0aCgpIC0gQW5kcm9pZENvbnN0YW50cy5ET1RfQUlETC5sZW5ndGgoKSk7Ci0vLwotLy8gICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gZmlsZS5nZXRDb250ZW50cyh0cnVlIC8qIGZvcmNlKi8pOwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXQpKTsKLS8vICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0vLyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gc1BhcmNlbGFibGVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0vLyAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkgJiYgbS5ncm91cCgxKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBBaWRsVHlwZS5QQVJDRUxBQkxFOwotLy8gICAgICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgICAgIG0gPSBzSW50ZXJmYWNlUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotLy8gICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpICYmIG0uZ3JvdXAoMSkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWlkbFR5cGUuSU5URVJGQUNFOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0vLyAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgYWlkbCBmaWxlIiwgZSkpOwotLy8gICAgICAgIH0gZmluYWxseSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGFpZGwgZmlsZSIsIGUpKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgcmV0dXJuIEFpZGxUeXBlLlVOS05PV047Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL1Jlc291cmNlTWFuYWdlckJ1aWxkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9SZXNvdXJjZU1hbmFnZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzdlODcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL1Jlc291cmNlTWFuYWdlckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZXNvdXJjZSBtYW5hZ2VyIGJ1aWxkZXIgd2hvc2Ugb25seSBwdXJwb3NlIGlzIHRvIHJlZnJlc2ggdGhlIHJlc291cmNlIGZvbGRlcgotICogc28gdGhhdCB0aGUgb3RoZXIgYnVpbGRlciB1c2UgYW4gdXAgdG8gZGF0ZSB2ZXJzaW9uLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyQnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5SZXNvdXJjZU1hbmFnZXJCdWlsZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIFJlc291cmNlTWFuYWdlckJ1aWxkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLy8gYnVpbGQoKSByZXR1cm5zIGEgbGlzdCBvZiBwcm9qZWN0IGZyb20gd2hpY2ggdGhpcyBwcm9qZWN0IGRlcGVuZHMgZm9yIGZ1dHVyZSBjb21waWxhdGlvbi4KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBwcm9qZWN0LgotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIC8vIENsZWFyIHRoZSBwcm9qZWN0IG9mIHRoZSBnZW5lcmljIG1hcmtlcnMKLSAgICAgICAgQmFzZUJ1aWxkZXIucmVtb3ZlTWFya2Vyc0Zyb21Qcm9qZWN0KHByb2plY3QsIEFkdENvbnN0YW50cy5NQVJLRVJfQURUKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIGZvciBleGlzdGluZyB0YXJnZXQgbWFya2VyLCBpbiB3aGljaCBjYXNlIHdlIGFib3J0LgotICAgICAgICAvLyAodGhpcyBtZWFuczogbm8gU0RLLCBubyB0YXJnZXQsIG9yIHVucmVzb2x2YWJsZSB0YXJnZXQuKQotICAgICAgICBhYm9ydE9uQmFkU2V0dXAocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwsIGRpc3BsYXlpbmcgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgYnVpbGRlci4KLSAgICAgICAgaW50IHJlcyA9IFByb2plY3RIZWxwZXIuY2hlY2tDb21waWxlckNvbXBsaWFuY2UocHJvamVjdCk7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKHJlcykgewotICAgICAgICAgICAgY2FzZSBQcm9qZWN0SGVscGVyLkNPTVBJTEVSX0NPTVBMSUFOQ0VfTEVWRUw6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMuUmVxdWlyZXNfQ29tcGlsZXJfQ29tcGxpYW5jZV81OwotICAgICAgICAgICAgY2FzZSBQcm9qZWN0SGVscGVyLkNPTVBJTEVSX0NPTVBMSUFOQ0VfU09VUkNFOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLlJlcXVpcmVzX1NvdXJjZV9Db21wYXRpYmlsaXR5XzU7Ci0gICAgICAgICAgICBjYXNlIFByb2plY3RIZWxwZXIuQ09NUElMRVJfQ09NUExJQU5DRV9DT0RFR0VOX1RBUkdFVDoKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5SZXF1aXJlc19DbGFzc19Db21wYXRpYmlsaXR5XzU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihwcm9qZWN0LCBBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgZXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIGVycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGludGVycnVwdCB0aGUgYnVpbGQuIFRoZSBuZXh0IGJ1aWxkZXJzIHdpbGwgbm90IHJ1bi4KLSAgICAgICAgICAgIHN0b3BCdWlsZChlcnJvck1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgU0RLIGRpcmVjdG9yeSBoYXMgYmVlbiBzZXR1cC4KLSAgICAgICAgU3RyaW5nIG9zU2RrRm9sZGVyID0gQWR0UGx1Z2luLmdldE9zU2RrRm9sZGVyKCk7Ci0KLSAgICAgICAgaWYgKG9zU2RrRm9sZGVyID09IG51bGwgfHwgb3NTZGtGb2xkZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgTWVzc2FnZXMuTm9fU0RLX1NldHVwX0Vycm9yKTsKLSAgICAgICAgICAgIG1hcmtQcm9qZWN0KEFkdENvbnN0YW50cy5NQVJLRVJfQURULCBNZXNzYWdlcy5Ob19TREtfU2V0dXBfRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCi0gICAgICAgICAgICAvLyBUaGlzIGludGVycnVwdHMgdGhlIGJ1aWxkLiBUaGUgbmV4dCBidWlsZGVycyB3aWxsIG5vdCBydW4uCi0gICAgICAgICAgICBzdG9wQnVpbGQoTWVzc2FnZXMuTm9fU0RLX1NldHVwX0Vycm9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBwcm9qZWN0IGhhcyBhIHRhcmdldAotICAgICAgICBJQW5kcm9pZFRhcmdldCBwcm9qZWN0VGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQocHJvamVjdCk7Ci0gICAgICAgIGlmIChwcm9qZWN0VGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vIHRhcmdldC4gbWFya2VyIGhhcyBiZWVuIHNldCBieSB0aGUgY29udGFpbmVyIGluaXRpYWxpemVyOiBleGl0IHNpbGVudGx5LgotICAgICAgICAgICAgLy8gVGhpcyBpbnRlcnJ1cHRzIHRoZSBidWlsZC4gVGhlIG5leHQgYnVpbGRlcnMgd2lsbCBub3QgcnVuLgotICAgICAgICAgICAgc3RvcEJ1aWxkKCJQcm9qZWN0IGhhcyBubyB0YXJnZXQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdGhlICdnZW4nIHNvdXJjZSBmb2xkZXIgaXMgcHJlc2VudAotICAgICAgICBib29sZWFuIGhhc0dlblNyY0ZvbGRlciA9IGZhbHNlOyAvLyB3aGV0aGVyIHRoZSBwcm9qZWN0IGhhcyBhICdnZW4nIHNvdXJjZSBmb2xkZXIgc2V0dXAKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRocyA9IGphdmFQcm9qZWN0LnJlYWRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgaWYgKGNsYXNzcGF0aHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZSA6IGNsYXNzcGF0aHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnNlZ21lbnQoMSkuZXF1YWxzKFNka0NvbnN0YW50cy5GRF9HRU5fU09VUkNFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc0dlblNyY0ZvbGRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZ2VuRm9sZGVyUHJlc2VudCA9IGZhbHNlOyAvLyB3aGV0aGVyIHRoZSBnZW4gZm9sZGVyIGFjdHVhbGx5IGV4aXN0cwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIoU2RrQ29uc3RhbnRzLkZEX0dFTl9TT1VSQ0VTKTsKLSAgICAgICAgZ2VuRm9sZGVyUHJlc2VudCA9IHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaGFzR2VuU3JjRm9sZGVyID09IGZhbHNlICYmIGdlbkZvbGRlclByZXNlbnQpIHsKLSAgICAgICAgICAgIC8vIE5vIHNvdXJjZSBmb2xkZXIgc2V0dXAgZm9yICdnZW4nIGluIHRoZSBwcm9qZWN0LCBidXQgdGhlcmUncyBhbHJlYWR5IGEKLSAgICAgICAgICAgIC8vICdnZW4nIHJlc291cmNlIChmaWxlIG9yIGZvbGRlcikuCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotICAgICAgICAgICAgICAgIC8vIGZvbGRlciBleGlzdHMgYWxyZWFkeSEgVGhpcyBpcyBhbiBlcnJvci4gSWYgdGhlIGZvbGRlciBoYWQgYmVlbiBjcmVhdGVkCi0gICAgICAgICAgICAgICAgLy8gYnkgdGhlIE5ld1Byb2plY3RXaXphcmQsIGl0J2QgYmUgYSBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCIlMSRzIGFscmVhZHkgZXhpc3RzIGJ1dCBpcyBub3QgYSBzb3VyY2UgZm9sZGVyLiBDb252ZXJ0IHRvIGEgc291cmNlIGZvbGRlciBvciByZW5hbWUgaXQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIGV4aXN0cyBidXQgaXMgbm90IGEgZm9sZGVyLgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlICUxJHMgaXMgaW4gdGhlIHdheS4gQURUIG5lZWRzIGEgc291cmNlIGZvbGRlciBjYWxsZWQgJ2dlbicgdG8gd29yay4gUmVuYW1lIG9yIGRlbGV0ZSByZXNvdXJjZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICBtYXJrUHJvamVjdChBZHRDb25zdGFudHMuTUFSS0VSX0FEVCwgbWVzc2FnZSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJydXB0cyB0aGUgYnVpbGQuIFRoZSBuZXh0IGJ1aWxkZXJzIHdpbGwgbm90IHJ1bi4KLSAgICAgICAgICAgIHN0b3BCdWlsZChtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIGlmIChoYXNHZW5TcmNGb2xkZXIgPT0gZmFsc2UgfHwgZ2VuRm9sZGVyUHJlc2VudCA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gZWl0aGVyIHRoZXJlIGlzIG5vICdnZW4nIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHByb2plY3QgKG9sZGVyIFNESyksCi0gICAgICAgICAgICAvLyBvciB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0ICh3YXMgZGVsZXRlZCwgb3Igd2FzIGEgZnJlc2ggc3ZuIGNoZWNrb3V0IG1heWJlLikKLQotICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBhcmUgbWlncmF0aW5nIGZyb20gYW4gb2xkZXIgU0RLLCB3ZSBnbyB0aHJvdWdoIHRoZSBjdXJyZW50IHNvdXJjZQotICAgICAgICAgICAgLy8gZm9sZGVycyBhbmQgZGVsZXRlIHRoZSBnZW5lcmF0ZWQgSmF2YSBmaWxlcy4KLSAgICAgICAgICAgIEFycmF5TGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IEJhc2VQcm9qZWN0SGVscGVyLmdldFNvdXJjZUNsYXNzcGF0aHMoamF2YVByb2plY3QpOwotICAgICAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgICAgICBmb3IgKElQYXRoIHBhdGggOiBzb3VyY2VGb2xkZXJzKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIG1lbWJlciA9IHJvb3QuZmluZE1lbWJlcihwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGVyaXZlZFJlc291cmNlcyhtZW1iZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgc291cmNlIGZvbGRlciwgaWYgbmVlZGVkCi0gICAgICAgICAgICBJRm9sZGVyIGdlbkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKFNka0NvbnN0YW50cy5GRF9HRU5fU09VUkNFUyk7Ci0gICAgICAgICAgICBpZiAoZ2VuRm9sZGVyUHJlc2VudCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nICdnZW4nIHNvdXJjZSBmb2xkZXIgZm9yIGdlbmVyYXRlZCBKYXZhIGZpbGVzIik7Ci0gICAgICAgICAgICAgICAgZ2VuRm9sZGVyLmNyZWF0ZSh0cnVlIC8qIGZvcmNlICovLCB0cnVlIC8qIGxvY2FsICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotICAgICAgICAgICAgICAgIGdlbkZvbGRlci5zZXREZXJpdmVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIHNvdXJjZSBmb2xkZXIgbGlzdCwgaWYgbmVlZGVkIG9ubHkgKG9yIGl0IHdpbGwgdGhyb3cpCi0gICAgICAgICAgICBpZiAoaGFzR2VuU3JjRm9sZGVyID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgICAgIGVudHJpZXMgPSBQcm9qZWN0SGVscGVyLmFkZEVudHJ5VG9DbGFzc3BhdGgoZW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGdlbkZvbGRlci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgd2hvbGUgcHJvamVjdAotICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGUgcHJlZmVyZW5jZSB0byBiZSBzdXJlIHdlIGFyZSBzdXBwb3NlZCB0byByZWZyZXNoCi0gICAgICAgIC8vIHRoZSBmb2xkZXJzLgotICAgICAgICBpZiAoQWR0UGx1Z2luLmdldEF1dG9SZXNSZWZyZXNoKCkpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEJ1aWxkVG9Db25zb2xlKEFkdENvbnN0YW50cy5CVUlMRF9WRVJCT1NFLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5SZWZyZXNoaW5nX1Jlcyk7Ci0KLSAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIHJlcyBmb2xkZXIuCi0gICAgICAgICAgICBJRm9sZGVyIHJlc0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLldTX1JFU09VUkNFUyk7Ci0gICAgICAgICAgICByZXNGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIEFsc28gcmVmcmVzaCB0aGUgYXNzZXRzIGZvbGRlciB0byBtYWtlIHN1cmUgdGhlIEFwa0J1aWxkZXIKLSAgICAgICAgICAgIC8vIHdpbGwgbm93IGl0J3MgY2hhbmdlZCBhbmQgd2lsbCBmb3JjZSBhIG5ldyByZXNvdXJjZSBwYWNrYWdpbmcuCi0gICAgICAgICAgICBJRm9sZGVyIGFzc2V0c0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLldTX0FTU0VUUyk7Ci0gICAgICAgICAgICBhc3NldHNGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvYnVpbGQvYnVpbGRfbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9idWlsZF9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE0M2Q0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9idWlsZF9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotU3RhcnRfRnVsbF9BcGtfQnVpbGQ9U3RhcnRpbmcgZnVsbCBQYWNrYWdlIGJ1aWxkLgotU3RhcnRfRnVsbF9QcmVfQ29tcGlsZXI9U3RhcnRpbmcgZnVsbCBQcmUgQ29tcGlsZXIuCi1TdGFydF9JbmNfQXBrX0J1aWxkPVN0YXJ0aW5nIGluY3JlbWVudGFsIFBhY2thZ2UgYnVpbGQ6IENoZWNraW5nIHJlc291cmNlIGNoYW5nZXMuCi1TdGFydF9JbmNfUHJlX0NvbXBpbGVyPVN0YXJ0aW5nIGluY3JlbWVudGFsIFByZSBDb21waWxlcjogQ2hlY2tpbmcgcmVzb3VyY2UgY2hhbmdlcy4KLVhtbF9FcnJvcj1FcnJvciBpbiBhbiBYTUwgZmlsZTogYWJvcnRpbmcgYnVpbGQuCi1zX01pc3NpbmdfUmVwYWNrYWdpbmc9JTEkcyBtaXNzaW5nLiBSZXBhY2thZ2luZy4KLVByb2plY3RfSGFzX0Vycm9ycz1Qcm9qZWN0IGNvbnRhaW5zIGVycm9yKHMpLiBQYWNrYWdlIEJ1aWxkZXIgYWJvcnRlZC4KLUZhaWxlZF9Ub19HZXRfT3V0cHV0PUZhaWxlZCB0byBnZXQgcHJvamVjdCBvdXRwdXQgZm9sZGVyXCEKLU91dHB1dF9NaXNzaW5nPU91dHB1dCBmb2xkZXIgbWlzc2luZ1whIE1ha2Ugc3VyZSB5b3VyIHByb2plY3QgaXMgY29uZmlndXJlZCBwcm9wZXJseS4KLXNfRmlsZV9NaXNzaW5nPSUxJHMgZmlsZSBtaXNzaW5nXCEKLVVucGFyc2VkX0FBUFRfRXJyb3JzPVVucGFyc2VkIGFhcHQgZXJyb3IocylcISBDaGVjayB0aGUgY29uc29sZSBmb3Igb3V0cHV0LgotVW5wYXJzZWRfQUlETF9FcnJvcnM9VW5wYXJzZWQgYWlkbCBlcnJvclwhIENoZWNrIHRoZSBjb25zb2xlIGZvciBvdXRwdXQuCi1BQVBUX0V4ZWNfRXJyb3I9RXJyb3IgZXhlY3V0aW5nIGFhcHQuIFBsZWFzZSBjaGVjayBhYXB0IGlzIHByZXNlbnQgYXQgJTEkcwotRGFsdmlrX0Vycm9yX2Q9Q29udmVyc2lvbiB0byBEYWx2aWsgZm9ybWF0IGZhaWxlZCB3aXRoIGVycm9yICUxJGQKLURYX0phcl9FcnJvcj1EeC5qYXIgaXMgbm90IGZvdW5kIGluc2lkZSB0aGUgcGx1Z2luLiBSZWluc3RhbGwgQURUXCEKLURhbHZpa19FcnJvcl9zPUNvbnZlcnNpb24gdG8gRGFsdmlrIGZvcm1hdCBmYWlsZWQ6ICUxJHMKLUluY29tcGF0aWJsZV9WTV9XYXJuaW5nPU5vdGU6IFlvdSBtYXkgYmUgdXNpbmcgYW4gaW5jb21wYXRpYmxlIHZpcnR1YWwgbWFjaGluZSBvciBjbGFzcyBsaWJyYXJ5LgotUmVxdWlyZXNfMV81X0Vycm9yPVRoaXMgcHJvZ3JhbSByZXF1aXJlcyBKREsgMS41IGNvbXBhdGliaWxpdHkuCi1GaW5hbF9BcmNoaXZlX0Vycm9yX3M9RXJyb3IgZ2VuZXJhdGluZyBmaW5hbCBhcmNoaXZlOiAlMSRzCi1NYXJrZXJfRGVsZXRlX0Vycm9yPUZhaWxlZCB0byBkZWxldGUgbWFya2VyICclMSRzJyBmb3IgJTIkcwotQ291bGRudF9Mb2NhdGVfc19FcnJvcj1Db3VsZCBub3QgbG9jYXRlICclMSRzJy4gVGhpcyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgcGFja2FnZS4KLUNvbXBpbGVyX0NvbXBsaWFuY2VfRXJyb3I9Q29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBub3QgY29tcGF0aWJsZTogQnVpbGQgYWJvcnRlZC4KLU5vX1NES19TZXR1cF9FcnJvcj1TREsgZGlyZWN0b3J5IGhhcyBub3QgYmVlbiBzZXR1cC4gUGxlYXNlIGdvIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIGFuZCBlbnRlciB0aGUgbG9jYXRpb24gb2YgdGhlIFNESy4KLXNfQ29udGFpbnNfWG1sX0Vycm9yPSUxJHMgY29udGFpbnMgWE1MIGVycm9yOiBCdWlsZCBhYm9ydGVkLgotc19Eb2VzbnRfRGVjbGFyZV9QYWNrYWdlX0Vycm9yPSUxJHMgZG9lcyBub3QgZGVjbGFyZSBhIEphdmEgcGFja2FnZTogQnVpbGQgYWJvcnRlZC4KLUNoZWNraW5nX1BhY2thZ2VfQ2hhbmdlPUNoZWNraW5nIEphdmEgcGFja2FnZSB2YWx1ZSBkaWQgbm90IGNoYW5nZS4uLgotUGFja2FnZV9zX0RvZXNudF9FeGlzdF9FcnJvcj1QYWNrYWdlICclMSRzJyBkb2VzIG5vdCBleGlzdFwhCi1QcmVwYXJpbmdfR2VuZXJhdGVkX0ZpbGVzPVByZXBhcmluZyBnZW5lcmF0ZWQgamF2YSBmaWxlcyBmb3IgdXBkYXRlL2NyZWF0aW9uLgotQUFQVF9FcnJvcj0nYWFwdCcgZXJyb3IuIFByZSBDb21waWxlciBCdWlsZCBhYm9ydGVkLgotTm90aGluZ19Ub19Db21waWxlPU5vdGhpbmcgdG8gcHJlIGNvbXBpbGVcIQotUmVtb3ZpbmdfR2VuZXJhdGVkX0NsYXNzZXM9UmVtb3ZpbmcgZ2VuZXJhdGVkIGphdmEgY2xhc3Nlcy4KLURlbGV0ZV9PYnNvbGV0ZV9FcnJvcj1GYWlsZWQgdG8gZGVsZXRlIG9ic29sZXRlICUxJHMsIHBsZWFzZSBkZWxldGUgaXQgbWFudWFsbHkKLURleFdyYXBwZXJfRGV4X0xvYWRlcj1EZXggTG9hZGVyCi1BSURMX0phdmFfQ29uZmxpY3Q9JTEkcyBpcyBpbiB0aGUgd2F5IG9mICUyJHMsIHJlbW92ZSBpdCBvciByZW5hbWUgb2Ygb25lIHRoZSBmaWxlcy4KLUFJRExfRXhlY19FcnJvcj1FcnJvciBleGVjdXRpbmcgYWlkbC4gUGxlYXNlIGNoZWNrIGFpZGwgaXMgcHJlc2VudCBhdCAlMSRzCi1zX1JlbW92ZWRfUmVjcmVhdGluZ19zPSUxJHMgd2FzIHJlbW92ZWRcISBSZWNyZWF0aW5nICUxJHNcIQotc19Nb2RpZmllZF9NYW51YWxseV9SZWNyZWF0aW5nX3M9JTEkcyB3YXMgbW9kaWZpZWQgbWFudWFsbHlcISBSZXZlcnRpbmcgdG8gZ2VuZXJhdGVkIHZlcnNpb25cIQotc19Nb2RpZmllZF9SZWNyZWF0aW5nX3M9JyUxJHMnIHdhcyBtb2RpZmllZCwgJTIkcyBuZWVkcyB0byBiZSB1cGRhdGVkLgotQWRkZWRfc19zX05lZWRzX1VwZGF0aW5nPU5ldyByZXNvdXJjZSBmaWxlOiAnJTEkcycsICUyJHMgbmVlZHMgdG8gYmUgdXBkYXRlZC4KLXNfUmVtb3ZlZF9zX05lZWRzX1VwZGF0aW5nPSclMSRzJyB3YXMgcmVtb3ZlZCwgJTIkcyBuZWVkcyB0byBiZSB1cGRhdGVkLgotUmVxdWlyZXNfQ29tcGlsZXJfQ29tcGxpYW5jZV81PUFuZHJvaWQgcmVxdWlyZXMgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCA1LjAuIFBsZWFzZSBmaXggcHJvamVjdCBwcm9wZXJ0aWVzLgotUmVxdWlyZXNfU291cmNlX0NvbXBhdGliaWxpdHlfNT1BbmRyb2lkIHJlcXVpcmVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IHNldCB0byA1LjAuIFBsZWFzZSBmaXggcHJvamVjdCBwcm9wZXJ0aWVzLgotUmVxdWlyZXNfQ2xhc3NfQ29tcGF0aWJpbGl0eV81PUFuZHJvaWQgcmVxdWlyZXMgLmNsYXNzIGNvbXBhdGliaWxpdHkgc2V0IHRvIDUuMC4gUGxlYXNlIGZpeCBwcm9qZWN0IHByb3BlcnRpZXMuCi1SZWZyZXNoaW5nX1Jlcz1SZWZyZXNoaW5nIHJlc291cmNlIGZvbGRlcnMuCi1EZXhXcmFwcGVyX3NfZG9lc19ub3RfZXhpc3RzPSUxJHMgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQotRGV4V3JhcHBlcl9GYWlsZWRfdG9fbG9hZF9zPUZhaWxlZCB0byBsb2FkICUxJHMKLURleFdyYXBwZXJfVW5hYmxlX1RvX0V4ZWN1dGVfRGV4X3M9VW5hYmxlIHRvIGV4ZWN1dGUgZGV4OiAlMSRzCi1EZXhXcmFwcGVyX1NlY3VyeUV4X1VuYWJsZV9Ub19GaW5kX0FQST1TZWN1cml0eUV4Y2VwdGlvbjogVW5hYmxlIHRvIGZpbmQgQVBJIGZvciBkZXguamFyCi1EZXhXcmFwcGVyX1NlY3VyeUV4X1VuYWJsZV9Ub19GaW5kX01ldGhvZD1TZWN1cml0eUV4Y2VwdGlvbjogVW5hYmxlIHRvIGZpbmQgbWV0aG9kIGZvciBkZXguamFyCi1EZXhXcmFwcGVyX1NlY3VyeUV4X1VuYWJsZV9Ub19GaW5kX0ZpZWxkPVNlY3VyaXR5RXhjZXB0aW9uOiBVbmFibGUgdG8gZmluZCBmaWVsZCBmb3IgZGV4LmphcgotQXBrQnVpbGRlcl9VbmFibGVCdWlsZF9EZXhfTm90X2xvYWRlZD1VbmFibGUgdG8gYnVpbGQ6IHRoZSBmaWxlIGRleC5qYXIgd2FzIG5vdCBsb2FkZWQgZnJvbSB0aGUgU0RLIGZvbGRlclwhCi1BcGtCdWlsZGVyX1VzaW5nX0RlZmF1bHRfS2V5PVVzaW5nIGRlZmF1bHQgZGVidWcga2V5IHRvIHNpZ24gcGFja2FnZQotQXBrQnVpbGRlcl9Vc2luZ19zX1RvX1NpZ249VXNpbmcgJyUxJHMnIHRvIHNpZ24gcGFja2FnZQotQXBrQnVpbGRlcl9TaWduaW5nX0tleV9DcmVhdGlvbl9zPVNpZ25pbmcgS2V5IENyZWF0aW9uOiAKLUFwa0J1aWxkZXJfVW5hYmxlX1RvX0dleV9LZXk9VW5hYmxlIHRvIGdldCBkZWJ1ZyBzaWduYXR1cmUga2V5Ci1BcGtCdWlsZGVyX0NlcnRpZmljYXRlX0V4cGlyZWRfb25fcz1EZWJ1ZyBjZXJ0aWZpY2F0ZSBleHBpcmVkIG9uICUxJHNcIQotQXBrQnVpbGRlcl9QYWNrYWdpbmdfcz1QYWNrYWdpbmcgJTEkcwotQXBrQnVpbGRlcl9KQVZBX0hPTUVfaXNfcz1UaGUgSmF2YSBWTSBIb21lIHVzZWQgaXM6ICUxJHMKLUFwa0J1aWxkZXJfVXBkYXRlX29yX0V4ZWN1dGVfbWFudWFsbHlfcz1VcGRhdGUgaXQgaWYgbmVjZXNzYXJ5LCBvciBtYW51YWxseSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLUFwa0J1aWxkZXJfc19Db25mbGljdF93aXRoX2ZpbGVfcz0lMSRzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZmlsZSBhbHJlYWR5IHB1dCBhdCAlMiRzCi1BcGtCdWlsZGVyX1BhY2thZ2luZ19zX2ludG9fcz1QYWNrYWdpbmcgJTEkcyBpbnRvICUyJHMKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0FuZHJvaWRDb250ZW50QXNzaXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9BbmRyb2lkQ29udGVudEFzc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQzM2IzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0FuZHJvaWRDb250ZW50QXNzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLklEZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0VmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUZsYWdBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogQ29udGVudCBBc3Npc3QgUHJvY2Vzc29yIGZvciBBbmRyb2lkIFhNTCBmaWxlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5kcm9pZENvbnRlbnRBc3Npc3QgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLSAgICAvKiogUmVnZXhwIHRvIGRldGVjdCBhIGZ1bGwgYXR0cmlidXRlIGFmdGVyIGFuIGVsZW1lbnQgdGFnLgotICAgICAqIDxwcmU+U3ludGF4OgotICAgICAqICAgIG5hbWUgPSAiLi4uIiBxdW90ZWQgc3RyaW5nIHdpdGggYWxsIGJ1dCA8IGFuZCAiCi0gICAgICogb3I6Ci0gICAgICogICAgbmFtZSA9ICcuLi4nIHF1b3RlZCBzdHJpbmcgd2l0aCBhbGwgYnV0IDwgYW5kICcKLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNGaXJzdEF0dHJpYnV0ZSA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJeICpbYS16QS1aXzpdKyAqPSAqKD86XCJbXjxcIl0qXCJ8J1tePCddKicpIik7ICAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUmVnZXhwIHRvIGRldGVjdCBhbiBlbGVtZW50IHRhZyBuYW1lICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBzRmlyc3RFbGVtZW50V29yZCA9IFBhdHRlcm4uY29tcGlsZSgiXlthLXpBLVowLTlfOl0rIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBSZWdleHAgdG8gZGV0ZWN0IHdoaXRlc3BhY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNXaGl0ZXNwYWNlID0gUGF0dGVybi5jb21waWxlKCJcXHMrIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFJPT1RfRUxFTUVOVCA9ICIiOwotCi0gICAgLyoqIERlc2NyaXB0b3Igb2YgdGhlIHJvb3Qgb2YgdGhlIFhNTCBoaWVyYXJjaHkuIFRoaXMgYSAiZmFrZSIgRWxlbWVudERlc2NyaXB0b3Igd2hpY2gKLSAgICAgKiAgaXMgdXNlZCB0byBsaXN0IGFsbCB0aGUgcG9zc2libGUgcm9vdHMgZ2l2ZW4gYnkgYWN0dWFsIGltcGxlbWVudGF0aW9ucy4KLSAgICAgKiAgRE8gTk9UIFVTRSBESVJFQ1RMWS4gQ2FsbCB7QGxpbmsgI2dldFJvb3REZXNjcmlwdG9yKCl9IGluc3RlYWQuICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciBtUm9vdERlc2NyaXB0b3I7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtRGVzY3JpcHRvcklkOwotCi0gICAgcHJpdmF0ZSBBbmRyb2lkRWRpdG9yIG1FZGl0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQW5kcm9pZENvbnRlbnRBc3Npc3QKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcklkIEFuIGlkIGZvciB7QGxpbmsgQW5kcm9pZFRhcmdldERhdGEjZ2V0RGVzY3JpcHRvclByb3ZpZGVyKGludCl9LgotICAgICAqICAgICAgVGhlIElkIGNhbiBiZSBvbmUgb2Yge0BsaW5rIEFuZHJvaWRUYXJnZXREYXRhI0RFU0NSSVBUT1JfTUFOSUZFU1R9LAotICAgICAqICAgICAge0BsaW5rIEFuZHJvaWRUYXJnZXREYXRhI0RFU0NSSVBUT1JfTEFZT1VUfSwKLSAgICAgKiAgICAgIHtAbGluayBBbmRyb2lkVGFyZ2V0RGF0YSNERVNDUklQVE9SX01FTlV9LAotICAgICAqICAgICAgb3Ige0BsaW5rIEFuZHJvaWRUYXJnZXREYXRhI0RFU0NSSVBUT1JfWE1MfS4KLSAgICAgKiAgICAgIEFsbCBvdGhlciB2YWx1ZXMgd2lsbCB0aHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBsYXRlciBhdCBydW50aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkQ29udGVudEFzc2lzdChpbnQgZGVzY3JpcHRvcklkKSB7Ci0gICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgYmFzZWQgb24gdGhlCi0gICAgICogc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0gICAgICogQHBhcmFtIG9mZnNldCBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkIGJlIGNvbXB1dGVkCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9wb3NhbHMgYXJlIHBvc3NpYmxlCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotICAgICAgICBpZiAobUVkaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRpdG9yID0gZ2V0QW5kcm9pZEVkaXRvcih2aWV3ZXIpOwotICAgICAgICAgICAgaWYgKG1FZGl0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uIER1Y2sgYW5kIGZvcmdldC4KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuRVJST1IsICJFZGl0b3Igbm90IGZvdW5kIGR1cmluZyBjb21wbGV0aW9uIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBVaUVsZW1lbnROb2RlIHJvb3RVaU5vZGUgPSBtRWRpdG9yLmdldFVpUm9vdE5vZGUoKTsKLQotICAgICAgICBPYmplY3RbXSBjaG9pY2VzID0gbnVsbDsgLyogQW4gYXJyYXkgb2YgRWxlbWVudERlc2NyaXB0b3IsIG9yIEF0dHJpYnV0ZURlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFN0cmluZyBvciBudWxsICovCi0gICAgICAgIFN0cmluZyBwYXJlbnQgPSAiIjsgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB3b3JkUHJlZml4ID0gZXh0cmFjdEVsZW1lbnRQcmVmaXgodmlld2VyLCBvZmZzZXQpOwotICAgICAgICBjaGFyIG5lZWRUYWcgPSAwOwotICAgICAgICBib29sZWFuIGlzRWxlbWVudCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzQXR0cmlidXRlID0gZmFsc2U7Ci0KLSAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGdldE5vZGUodmlld2VyLCBvZmZzZXQpOwotICAgICAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIFVpRWxlbWVudE5vZGUgbWF0Y2hpbmcgdGhpcyBYTUwgbm9kZQotICAgICAgICBVaUVsZW1lbnROb2RlIGN1cnJlbnRVaU5vZGUgPQotICAgICAgICAgICAgcm9vdFVpTm9kZSA9PSBudWxsID8gbnVsbCA6IHJvb3RVaU5vZGUuZmluZFhtbE5vZGUoY3VycmVudE5vZGUpOwotCi0gICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiAoYW4gWE1MIGRvYyBhbHdheXMgaGFzIGF0IGxlYXN0IGEgZG9jIG5vZGUpLiBKdXN0IGdpdmUgdXAuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAod29yZFByZWZpeC5lcXVhbHMocGFyZW50KSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBzdGlsbCBlZGl0aW5nIHRoZSBlbGVtZW50J3MgdGFnIG5hbWUsIG5vdCB0aGUgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vICh0aGUgZWxlbWVudCdzIHRhZyBuYW1lIG1heSBub3QgZXZlbiBiZSBjb21wbGV0ZSkKLSAgICAgICAgICAgICAgICBpc0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGNob2ljZXMgPSBnZXRDaG9pY2VzRm9yRWxlbWVudChwYXJlbnQsIGN1cnJlbnROb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGVkaXRpbmcgdGhlIGN1cnJlbnQgbm9kZSBuYW1lLCBzbyB3ZSBtaWdodCBiZSBlZGl0aW5nIGl0cwotICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgaW5zdGVhZC4uLgotICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBBdHRyaWJJbmZvIGluZm8gPSBwYXJzZUF0dHJpYnV0ZUluZm8odmlld2VyLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZWRpdGluZyBhdHRyaWJ1dGVzIGluIGFuIGVsZW1lbnQgbm9kZSAoZWl0aGVyIHRoZSBhdHRyaWJ1dGVzJyBuYW1lcwotICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGVpciB2YWx1ZXMpLgotICAgICAgICAgICAgICAgICAgICBjaG9pY2VzID0gZ2V0Q2hvaWNlc0ZvckF0dHJpYnV0ZShwYXJlbnQsIGN1cnJlbnROb2RlLCBjdXJyZW50VWlOb2RlLCBpbmZvKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5jb3JyZWN0ZWRQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd29yZFByZWZpeCA9IGluZm8uY29ycmVjdGVkUHJlZml4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRUYWcgPSBpbmZvLm5lZWRUYWc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgIGlzRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBFeGFtaW5lIHRoZSBwYXJlbnQgb2YgdGhlIHRleHQgbm9kZS4KLSAgICAgICAgICAgIGNob2ljZXMgPSBnZXRDaG9pY2VzRm9yVGV4dE5vZGUoY3VycmVudE5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWJvcnQgaWYgd2UgY2FuJ3QgcmVjb2duaXplIHRoZSBjb250ZXh0IG9yIHRoZXJlIGFyZSBubyBjb21wbGV0aW9uIGNob2ljZXMKLSAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCB8fCBjaG9pY2VzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLQotICAgICAgICBpZiAoaXNFbGVtZW50KSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBzb21lIHN1Z2dlc3Rpb25zLCBkbyB3ZSBuZWVkIHRvIGFkZCBhbiBvcGVuaW5nICI8IiBicmFja2V0Ci0gICAgICAgICAgICAvLyBmb3IgdGhlIGVsZW1lbnQ/IFdlIGRvbid0IGlmIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgIjwiIG9yICI8LyIuCi0gICAgICAgICAgICAvLyBQZXIgWE1MIFNwZWMsIHRoZXJlJ3Mgbm8gd2hpdGVzcGFjZSBiZXR3ZWVuICI8IiBvciAiPC8iIGFuZCB0aGUgdGFnIG5hbWUuCi0gICAgICAgICAgICBpbnQgb2Zmc2V0MiA9IG9mZnNldCAtIHdvcmRQcmVmaXgubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgaW50IGMxID0gZXh0cmFjdENoYXIodmlld2VyLCBvZmZzZXQyKTsKLSAgICAgICAgICAgIGlmICghKChjMSA9PSAnPCcpIHx8IChjMSA9PSAnLycgJiYgZXh0cmFjdENoYXIodmlld2VyLCBvZmZzZXQyIC0gMSkgPT0gJzwnKSkpIHsKLSAgICAgICAgICAgICAgICBuZWVkVGFnID0gJzwnOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3Rpb24gbGVuZ3RoCi0gICAgICAgIGludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKFRleHRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgICAgc2VsZWN0aW9uTGVuZ3RoID0gdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wdXRlUHJvcG9zYWxzKG9mZnNldCwgY3VycmVudE5vZGUsIGNob2ljZXMsIHdvcmRQcmVmaXgsIG5lZWRUYWcsCi0gICAgICAgICAgICAgICAgaXNBdHRyaWJ1dGUsIHNlbGVjdGlvbkxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBtYXRjaGluZyB0aGUgQW5kcm9pZCBSZXNvdXJjZSBVUkkuCi0gICAgICogSWYgbm8gc3VjaCBkZWNsYXJhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyB0aGUgZGVmYXVsdCAiYW5kcm9pZCIgcHJlZml4LgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIGN1cnJlbnQgbm9kZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gbnNVcmkgVGhlIG5hbWVzcGFjZSBVUkkgb2Ygd2hpY2ggdGhlIHByZWZpeCBpcyB0byBiZSBmb3VuZCwKLSAgICAgKiAgICAgICAgICAgICAgZS5nLiB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30KLSAgICAgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcmVmaXggZGVjbGFyZWQgb3IgdGhlIGRlZmF1bHQgImFuZHJvaWQiIHByZWZpeC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb29rdXBOYW1lc3BhY2VQcmVmaXgoTm9kZSBub2RlLCBTdHJpbmcgbnNVcmkpIHsKLSAgICAgICAgLy8gTm90ZTogTm9kZS5sb29rdXBQcmVmaXggaXMgbm90IGltcGxlbWVudGVkIGluIHdzdC94bWwvY29yZSBOb2RlSW1wbC5qYXZhCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZW11bGF0ZXMgdGhpczoKLSAgICAgICAgLy8gICBTdHJpbmcgcHJlZml4ID0gbm9kZS5sb29rdXBQcmVmaXgoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUyk7Ci0KLSAgICAgICAgaWYgKFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvci5YTUxOU19VUkkuZXF1YWxzKG5zVXJpKSkgewotICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICBmb3IgKDsgcHJlZml4ID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgbm9kZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERTsKLSAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBuID0gYXR0cnMuZ2V0TGVuZ3RoKCkgLSAxOyBuID49IDA7IC0tbikgewotICAgICAgICAgICAgICAgIE5vZGUgYXR0ciA9IGF0dHJzLml0ZW0obik7Ci0gICAgICAgICAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUy5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQodXJpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVc2UgYSBzZW5zaWJsZSBkZWZhdWx0IHByZWZpeCBpZiB3ZSBjYW4ndCBmaW5kIG9uZS4KLSAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBub3Qgb25lIHRoYXQgd2FzIGRlY2xhcmVkIGluIHRoZSBzY29wZQotICAgICAgICAvLyB2aXNpdGVkIGFib3ZlLgotICAgICAgICBwcmVmaXggPSBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLmVxdWFscyhuc1VyaSkgPyAiYW5kcm9pZCIgOiAibnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBwcmVmaXg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyB2aXNpdGVkLmNvbnRhaW5zKHByZWZpeCk7IGkrKykgewotICAgICAgICAgICAgcHJlZml4ID0gYmFzZSArIEludGVnZXIudG9TdHJpbmcoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjaG9pY2VzIHdoZW4gdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgbmFtZSBvZiBhbiBYTUwgZWxlbWVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgbmFtZSBvZiBhbiBlbGVtZW50ICh0aGUgInBhcmVudCIpLgotICAgICAqIEZpbmQgdGhlIGdyYW5kLXBhcmVudCBhbmQgaWYgb25lIGlzIGZvdW5kLCByZXR1cm4gaXRzIGNoaWxkcmVuIGVsZW1lbnQgbGlzdC4KLSAgICAgKiBUaGUgbmFtZSB3aGljaCBpcyBiZWluZyBlZGl0ZWQgc2hvdWxkIGJlIG9uZSBvZiB0aG9zZS4KLSAgICAgKiA8cC8+Ci0gICAgICogRXhhbXBsZTogPG1hbmlmZXN0PjxhcHBsaWMqY3Vyc29yKiA9PiByZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBlbGVtZW50cyB0aGF0Ci0gICAgICogY2FuIGJlIGZvdW5kIHVuZGVyIDxtYW5pZmVzdD4sIG9mIHdoaWNoIDxhcHBsaWNhdGlvbj4gaXMgb25lIG9mIHRoZSBjaG9pY2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBFbGVtZW50RGVzY3JpcHRvcltdIG9yIG51bGwgaWYgbm8gdmFsaWQgZWxlbWVudCB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBnZXRDaG9pY2VzRm9yRWxlbWVudChTdHJpbmcgcGFyZW50LCBOb2RlIGN1cnJlbnRfbm9kZSkgewotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBncmFuZHBhcmVudCA9IG51bGw7Ci0gICAgICAgIGlmIChjdXJyZW50X25vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgIGdyYW5kcGFyZW50ID0gZ2V0RGVzY3JpcHRvcihjdXJyZW50X25vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLSAgICAgICAgICAgIGdyYW5kcGFyZW50ID0gZ2V0Um9vdERlc2NyaXB0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ3JhbmRwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBlIDogZ3JhbmRwYXJlbnQuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFhtbE5hbWUoKS5zdGFydHNXaXRoKHBhcmVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYW5kcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2hvaWNlcyB3aGVuIHRoZSB1c2VyIGlzIGVkaXRpbmcgYW4gWE1MIGF0dHJpYnV0ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogSW4gaW5wdXQsIGF0dHJJbmZvIGNvbnRhaW5zIGRldGFpbHMgb24gdGhlIGFuYWx5emVkIGNvbnRleHQsIG5hbWVseSB3aGV0aGVyIHRoZQotICAgICAqIHVzZXIgaXMgZWRpdGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgKGlzSW5WYWx1ZSkgb3IgYW4gYXR0cmlidXRlIG5hbWUuCi0gICAgICogPHAvPgotICAgICAqIEluIG91dHB1dCwgYXR0ckluZm8gYWxzbyBjb250YWlucyB0d28gcG9zc2libGUgbmV3IHZhbHVlcyAodGhpcyBpcyBhIGhhY2sgdG8gY2lyY3VtdmVudAotICAgICAqIHRoZSBsYWNrIG9mIG91dC1wYXJhbWV0ZXJzIGluIEphdmEpOgotICAgICAqIC0gQXR0cmliSW5mby5jb3JyZWN0ZWRQcmVmaXggaWYgdGhlIHVzZXIgaGFzIGJlZW4gZWRpdGluZyBhbiBhdHRyaWJ1dGUgdmFsdWUgYW5kIGl0IGhhcwotICAgICAqICAgYmVlbiBkZXRlY3RlZCB0aGF0IHdoYXQgdGhlIHVzZXIgdHlwZWQgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBleHRyYWN0RWxlbWVudFByZWZpeCgpCi0gICAgICogICBwcmVkaWN0ZWQuIFRoaXMgaGFwcGVucyBiZWNhdXNlIGV4dHJhY3RFbGVtZW50UHJlZml4KCkgc3RvcHMgd2hlbiBhIGNoYXJhY3RlciB0aGF0Ci0gICAgICogICBjYW5ub3QgYmUgYW4gZWxlbWVudCBuYW1lIGFwcGVhcnMgd2hlcmVhcyBwYXJzZUF0dHJpYnV0ZUluZm8oKSB1c2VzIGEgZ3JhbW1hciBtb3JlCi0gICAgICogICBsZW5pZW50IGFzIHN1aXRhYmxlIGZvciBhdHRyaWJ1dGUgdmFsdWVzLgotICAgICAqIC0gQXR0cmliSW5mby5uZWVkVGFnIHdpbGwgYmUgbm9uLXplcm8gaWYgd2UgZmluZCB0aGF0IHRoZSBhdHRyaWJ1dGUgY29tcGxldGlvbiBwcm9wb3NhbAotICAgICAqICAgbXVzdCBiZSBkb3VibGUtcXVvdGVkLgotICAgICAqIEBwYXJhbSBjdXJyZW50VWlOb2RlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIEF0dHJpYnV0ZURlc2NyaXB0b3JbXSBpZiB0aGUgdXNlciBpcyBlZGl0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqICAgICAgICAgYSBTdHJpbmdbXSBpZiB0aGUgdXNlciBpcyBlZGl0aW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoIHNvbWUga25vd24gdmFsdWVzLAotICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBub3RoaW5nIGlzIGtub3duIGFib3V0IHRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gZ2V0Q2hvaWNlc0ZvckF0dHJpYnV0ZShTdHJpbmcgcGFyZW50LAotICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSwgVWlFbGVtZW50Tm9kZSBjdXJyZW50VWlOb2RlLCBBdHRyaWJJbmZvIGF0dHJJbmZvKSB7Ci0gICAgICAgIE9iamVjdFtdIGNob2ljZXMgPSBudWxsOwotICAgICAgICBpZiAoYXR0ckluZm8uaXNJblZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBFZGl0aW5nIGFuIGF0dHJpYnV0ZSdzIHZhbHVlLi4uIEdldCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHRoZW4gdGhlCi0gICAgICAgICAgICAvLyBwb3NzaWJsZSBjaG9pY2VzIGZvciB0aGUgdHVwbGUocGFyZW50LGF0dHJpYnV0ZSkKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJJbmZvLnZhbHVlOwotICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIiciKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7ICAgLy8kTk9OLU5MUy0xJCAgIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcHJlZml4IHRoYXQgd2FzIGZvdW5kIGF0IHRoZSBiZWdpbm5pbmcgb25seSBzY2FuIGZvciBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9yIHRhZyBuYW1lLiBXZSBub3cga25vdyB0aGUgcmVhbCBwcmVmaXggZm9yIHRoaXMgYXR0cmlidXRlJ3MKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZSwgd2hpY2ggaXMgbmVlZGVkIHRvIGdlbmVyYXRlIHRoZSBjb21wbGV0aW9uIGNob2ljZXMgYmVsb3cuCi0gICAgICAgICAgICAgICAgYXR0ckluZm8uY29ycmVjdGVkUHJlZml4ID0gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHJJbmZvLm5lZWRUYWcgPSAnIic7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50VWlOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhbiBVSSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgYXR0cmlidXRlIG5hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRySW5mby5uYW1lOwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgbmFtZXNwYWNlIHByZWZpeCBmcm9tIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAgICAgICAgICAgIGludCBwb3MgPSBhdHRyTmFtZS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ck5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFVpQXR0cmlidXRlTm9kZSBjdXJyQXR0ck5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIGF0dHJOb2RlIDogY3VycmVudFVpTm9kZS5nZXRVaUF0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFhtbExvY2FsTmFtZSgpLmVxdWFscyhhdHRyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJBdHRyTm9kZSA9IGF0dHJOb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VyckF0dHJOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGN1cnJBdHRyTm9kZS5nZXRQb3NzaWJsZVZhbHVlcyh2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJBdHRyTm9kZSBpbnN0YW5jZW9mIFVpRmxhZ0F0dHJpYnV0ZU5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgImZsYWciIGNhbiBjb25zaXN0IG9mIHNldmVyYWwgdmFsdWVzIHNlcGFyYXRlZCBieSAib3IiICh8KS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb3JyZWN0IHByZWZpeCBjb250YWlucyBzdWNoIGEgcGlwZSBjaGFyYWN0ZXIsIHdlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgc28gdGhhdCBvbmx5IHRoZSBjdXJyZW50bHkgZWRpdGVkIHZhbHVlIGlzIGNvbXBsZXRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHZhbHVlLmluZGV4T2YoJ3wnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJJbmZvLmNvcnJlY3RlZFByZWZpeCA9IHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJJbmZvLm5lZWRUYWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgb24gdGhlIG9sZGVyIGRlc2NyaXB0b3Itb25seSBiYXNlZCBsb29rdXAuCi0KLSAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBwcm9wZXJseSBoYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYWN0aW9uIHRhZywgd2UgbmVlZCB0aGUgZ3JhbmRwYXJlbnQgb2YgdGhlIGFjdGlvbiBub2RlLCB0byBrbm93Ci0gICAgICAgICAgICAgICAgLy8gd2hhdCB0eXBlIG9mIGFjdGlvbnMgd2UgbmVlZC4KLSAgICAgICAgICAgICAgICAvLyBlLmcuIGFjdGl2aXR5IC0+IGludGVudC1maWx0ZXIgLT4gYWN0aW9uW0BuYW1lXQotICAgICAgICAgICAgICAgIFN0cmluZyBncmVhdEdyYW5kUGFyZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgTm9kZSBncmFuZFBhcmVudCA9IGN1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3JhbmRQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBOb2RlIGdyZWF0R3JhbmRQYXJlbnQgPSBncmFuZFBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmVhdEdyYW5kUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0R3JhbmRQYXJlbnROYW1lID0gZ3JlYXRHcmFuZFBhcmVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBtRWRpdG9yLmdldFRhcmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNob2ljZXMgPSBkYXRhLmdldEF0dHJpYnV0ZVZhbHVlcyhwYXJlbnQsIGF0dHJJbmZvLm5hbWUsIGdyZWF0R3JhbmRQYXJlbnROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBFZGl0aW5nIGFuIGF0dHJpYnV0ZSdzIG5hbWUuLi4gR2V0IGF0dHJpYnV0ZXMgdmFsaWQgZm9yIHRoZSBwYXJlbnQgbm9kZS4KLSAgICAgICAgICAgIGlmIChjdXJyZW50VWlOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaG9pY2VzID0gY3VycmVudFVpTm9kZS5nZXRBdHRyaWJ1dGVEZXNjcmlwdG9ycygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBwYXJlbnRfZGVzYyA9IGdldERlc2NyaXB0b3IocGFyZW50KTsKLSAgICAgICAgICAgICAgICBjaG9pY2VzID0gcGFyZW50X2Rlc2MuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaG9pY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNob2ljZXMgd2hlbiB0aGUgdXNlciBpcyBlZGl0aW5nIGFuIFhNTCB0ZXh0IG5vZGUuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWVhbnMgdGhlIHVzZXIgaXMgZWRpdGluZyBvdXRzaWRlIG9mIGFueSBYTUwgZWxlbWVudCBvciBhdHRyaWJ1dGUuCi0gICAgICogU2ltcGx5IHJldHVybiB0aGUgbGlzdCBvZiBYTUwgZWxlbWVudHMgdGhhdCBjYW4gYmUgcHJlc2VudCB0aGVyZSwgYmFzZWQgb24gdGhlCi0gICAgICogcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFuIEVsZW1lbnREZXNjcmlwdG9yW10gb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdFtdIGdldENob2ljZXNGb3JUZXh0Tm9kZShOb2RlIGN1cnJlbnROb2RlKSB7Ci0gICAgICAgIE9iamVjdFtdIGNob2ljZXMgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGFyZW50OwotICAgICAgICBOb2RlIHBhcmVudF9ub2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50X25vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgLy8gV2UncmUgZWRpdGluZyBhIHRleHQgbm9kZSB3aGljaCBwYXJlbnQgaXMgYW4gZWxlbWVudCBub2RlLiBMaW1pdAotICAgICAgICAgICAgLy8gY29udGVudCBhc3Npc3QgdG8gZWxlbWVudHMgdmFsaWQgZm9yIHRoZSBwYXJlbnQuCi0gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRfbm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IGdldERlc2NyaXB0b3IocGFyZW50KTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaG9pY2VzID0gZGVzYy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudF9ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBlZGl0aW5nIGEgdGV4dCBub2RlIGF0IHRoZSBmaXJzdCBsZXZlbCAoaS5lLiByb290IG5vZGUpLgotICAgICAgICAgICAgLy8gTGltaXQgY29udGVudCBhc3Npc3QgdG8gdGhlIG9ubHkgdmFsaWQgcm9vdCBlbGVtZW50cy4KLSAgICAgICAgICAgIGNob2ljZXMgPSBnZXRSb290RGVzY3JpcHRvcigpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNob2ljZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBsaXN0IG9mIGNob2ljZXMgZm91bmQsIGdlbmVyYXRlcyB0aGUgcHJvcG9zYWxzIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2hvaWNlcyBpcyBhbiBvYmplY3QgYXJyYXkuIEl0ZW1zIG9mIHRoZSBhcnJheSBjYW4gYmU6Ci0gICAgICogLSBFbGVtZW50RGVzY3JpcHRvcjogYSBwb3NzaWJsZSBlbGVtZW50IGRlc2NyaXB0b3Igd2hpY2ggWE1MIG5hbWUgc2hvdWxkIGJlIGNvbXBsZXRlZC4KLSAgICAgKiAtIEF0dHJpYnV0ZURlc2NyaXB0b3I6IGEgcG9zc2libGUgYXR0cmlidXRlIGRlc2NyaXB0b3Igd2hpY2ggWE1MIG5hbWUgc2hvdWxkIGJlIGNvbXBsZXRlZC4KLSAgICAgKiAtIFN0cmluZzogc3RyaW5nIHZhbHVlcyB0byBkaXNwbGF5IGFzLWlzIHRvIHRoZSB1c2VyLiBUeXBpY2FsbHkgdGhvc2UgYXJlIHBvc3NpYmxlCi0gICAgICogICAgICAgICAgIHZhbHVlcyBmb3IgYSBnaXZlbiBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBJQ29tcGxldGlvblByb3Bvc2FsW10gdG8gZGlzcGxheSB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUHJvcG9zYWxzKGludCBvZmZzZXQsIE5vZGUgY3VycmVudE5vZGUsCi0gICAgICAgICAgICBPYmplY3RbXSBjaG9pY2VzLCBTdHJpbmcgd29yZFByZWZpeCwgY2hhciBuZWVkX3RhZywKLSAgICAgICAgICAgIGJvb2xlYW4gaXNfYXR0cmlidXRlLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8Q29tcGxldGlvblByb3Bvc2FsPigpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBuc1VyaU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXl3b3JkID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICBJbWFnZSBpY29uID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjaG9pY2UgaW5zdGFuY2VvZiBFbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGtleXdvcmQgPSAoKEVsZW1lbnREZXNjcmlwdG9yKWNob2ljZSkuZ2V0WG1sTmFtZSgpOwotICAgICAgICAgICAgICAgIGljb24gICAgPSAoKEVsZW1lbnREZXNjcmlwdG9yKWNob2ljZSkuZ2V0SWNvbigpOwotICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoKChFbGVtZW50RGVzY3JpcHRvciljaG9pY2UpLmdldFRvb2x0aXAoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNob2ljZSBpbnN0YW5jZW9mIFRleHRWYWx1ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gVmFsdWUgbm9kZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wbGV0aW9uIGNob2ljZXMKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hvaWNlIGluc3RhbmNlb2YgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgcmVhbCBhdHRyaWJ1dGUgZGVzY3JpcHRvcnMKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hvaWNlIGluc3RhbmNlb2YgQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGtleXdvcmQgPSAoKEF0dHJpYnV0ZURlc2NyaXB0b3IpY2hvaWNlKS5nZXRYbWxMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpY29uICAgID0gKChBdHRyaWJ1dGVEZXNjcmlwdG9yKWNob2ljZSkuZ2V0SWNvbigpOwotICAgICAgICAgICAgICAgIGlmIChjaG9pY2UgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gKChUZXh0QXR0cmlidXRlRGVzY3JpcHRvcikgY2hvaWNlKS5nZXRUb29sdGlwKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGUgYXR0cmlidXRlLiBOb3RlIHRoYXQgc29tZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGhhdmUgYSBuYW1lc3BhY2UgYW5kIHRodXMgcmV0dXJuIG51bGwgaGVyZS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbnNVcmkgPSAoKEF0dHJpYnV0ZURlc2NyaXB0b3IpY2hvaWNlKS5nZXROYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgICAgICAgICBpZiAobnNVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zVXJpTWFwLmdldChuc1VyaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuc1ByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGxvb2t1cE5hbWVzcGFjZVByZWZpeChjdXJyZW50Tm9kZSwgbnNVcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmlNYXAucHV0KG5zVXJpLCBuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5zUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggKz0gIjoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNob2ljZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGtleXdvcmQgPSAoU3RyaW5nKSBjaG9pY2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkaXNjYXJkIHVua25vd24gY2hvaWNlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuc0tleXdvcmQgPSBuc1ByZWZpeCA9PSBudWxsID8ga2V5d29yZCA6IChuc1ByZWZpeCArIGtleXdvcmQpOwotCi0gICAgICAgICAgICBpZiAoa2V5d29yZC5zdGFydHNXaXRoKHdvcmRQcmVmaXgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChuc1ByZWZpeCAhPSBudWxsICYmIGtleXdvcmQuc3RhcnRzV2l0aChuc1ByZWZpeCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChuc1ByZWZpeCAhPSBudWxsICYmIG5zS2V5d29yZC5zdGFydHNXaXRoKHdvcmRQcmVmaXgpKSkgewotICAgICAgICAgICAgICAgIGlmIChuc1ByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmQgPSBuc1ByZWZpeCArIGtleXdvcmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBlbmRfdGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAobmVlZF90YWcgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmVlZF90YWcgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkID0gbmVlZF90YWcgKyBrZXl3b3JkOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RhZyA9IFN0cmluZy52YWx1ZU9mKG5lZWRfdGFnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZWVkX3RhZyA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Q2FuSGF2ZUNoaWxkcmVuKGNob2ljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfdGFnID0gU3RyaW5nLmZvcm1hdCgiPjwvJTEkcz4iLCBrZXl3b3JkKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkID0gbmVlZF90YWcgKyBrZXl3b3JkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkID0gbmVlZF90YWcgKyBrZXl3b3JkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF90YWcgPSAiLz4iOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkICsgZW5kX3RhZywgICAgICAgICAgICAgICAgICAvLyBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtIHdvcmRQcmVmaXgubGVuZ3RoKCksICAgICAgICAgICAvLyBpbnQgcmVwbGFjZW1lbnRPZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRQcmVmaXgubGVuZ3RoKCkgKyBzZWxlY3Rpb25MZW5ndGgsICAvLyBpbnQgcmVwbGFjZW1lbnRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQubGVuZ3RoKCksICAgICAgICAgICAgICAgICAgIC8vIGludCBjdXJzb3JQb3NpdGlvbiAocmVsLiB0byBycGxjbW50T2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgaWNvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2UgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyBkaXNwbGF5U3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBwcm9wb3NhbHMuYWRkKHByb3Bvc2FsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkZXNjcmlwdG9yIGRlc2NyaWJlcyBhbiBlbGVtZW50IHRoYXQgY2FuIHBvdGVudGlhbGx5Ci0gICAgICogaGF2ZSBjaGlsZHJlbiAoZWl0aGVyIHN1Yi1lbGVtZW50cyBvciB0ZXh0IHZhbHVlKS4gSWYgYW4gZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiwKLSAgICAgKiB3ZSB3YW50IHRvIGV4cGxpY2l0bHkgd3JpdGUgYW4gb3BlbmluZyBhbmQgYSBzZXBhcmF0ZSBjbG9zaW5nIHRhZy4KLSAgICAgKiA8cC8+Ci0gICAgICogRWxlbWVudHMgY2FuIGhhdmUgY2hpbGRyZW4gaWYgdGhlIGRlc2NyaXB0b3IgaGFzIGNoaWxkcmVuIGVsZW1lbnQgZGVzY3JpcHRvcnMKLSAgICAgKiBvciBpZiBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMgaXMgYSBUZXh0VmFsdWVEZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgQW4gRWxlbWVudERlc2NyaXB0b3Igb3IgYW4gQXR0cmlidXRlRGVzY3JpcHRvcgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGVzY3JpcHRvciBpcyBhbiBFbGVtZW50RGVzY3JpcHRvciB0aGF0IGNhbiBoYXZlIGNoaWxkcmVuIG9yIGEgdGV4dCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBlbGVtZW50Q2FuSGF2ZUNoaWxkcmVuKE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRWxlbWVudERlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgPSAoRWxlbWVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoZGVzYy5oYXNDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0cl9kZXNjIDogZGVzYy5nZXRBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cl9kZXNjIGluc3RhbmNlb2YgVGV4dFZhbHVlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgZGVzY3JpcHRvciBtYXRjaGluZyBhIGdpdmVuIFhNTCBub2RlIG5hbWUgb3IgbnVsbCBpZiBpdCBjYW4ndCBiZQotICAgICAqIGZvdW5kLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNpbXBsaXN0aWM7IGlkZWFsbHkgd2Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJlbnQncyBjaGFpbiB0byBtYWtlIHN1cmUgd2UKLSAgICAgKiBjYW4gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRpZmZlcmVudCBoaWVyYXJjaHkgdHJlZXMuIFJpZ2h0IG5vdyB0aGUgZmlyc3QgbWF0Y2ggZm91bmQKLSAgICAgKiBpcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIG5vZGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRSb290RGVzY3JpcHRvcigpLmZpbmRDaGlsZHJlbkRlc2NyaXB0b3Iobm9kZU5hbWUsIHRydWUgLyogcmVjdXJzaXZlICovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotICAgICAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotICAgICAqCi0gICAgICogSW4gb3VyIGNhc2UsIHdlIGF1dG8tYWN0aXZhdGUgb24gb3BlbmluZyB0YWdzIGFuZCBhdHRyaWJ1dGVzIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICAgICBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotICAgICAqLwotICAgIHB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gbmV3IGNoYXJbXXsgJzwnLCAnOicsICc9JyB9OwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZXVyaXN0aWNhbGx5IGV4dHJhY3RzIHRoZSBwcmVmaXggdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGVtcGxhdGUgcmVsZXZhbmNlCi0gICAgICogZnJvbSB0aGUgdmlld2VyJ3MgZG9jdW1lbnQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIFN0cmluZyBmcm9tCi0gICAgICogb2Zmc2V0IGJhY2t3YXJkcyB0aGF0IGZvcm1zIGEgcG90ZW50aWFsIFhNTCBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lIG9yCi0gICAgICogYXR0cmlidXRlIHZhbHVlLgotICAgICAqCi0gICAgICogVGhlIHBhcnQgd2VyZSB3ZSBhY2Nlc3MgdGhlIGRvY21lbnQgd2FzIGV4dHJhY3RlZCBmcm9tCi0gICAgICogb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXNUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgYW5kIGFkYXB0ZWQgdG8gb3VyIG5lZWRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyCi0gICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byBkb2N1bWVudAotICAgICAqIEByZXR1cm4gdGhlIHByZWZpeCB0byBjb25zaWRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEVsZW1lbnRQcmVmaXgoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGludCBpID0gb2Zmc2V0OwotICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKGkgPiBkb2N1bWVudC5nZXRMZW5ndGgoKSkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IGRvY3VtZW50LmdldENoYXIoaSAtIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBmb3JtIGEgdmFsaWQ6Ci0gICAgICAgICAgICAgICAgLy8gLSBlbGVtZW50IG5hbWUsIGUuZy4gYW55dGhpbmcgdGhhdCBpcyBhIHZhbGlkIEphdmEgY2xhc3MvdmFyaWFibGUgbGl0ZXJhbC4KLSAgICAgICAgICAgICAgICAvLyAtIGF0dHJpYnV0ZSBuYW1lLCBpbmNsdWRpbmcgOiBmb3IgdGhlIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgIC8vIC0gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSB3ZXJlIGluY2x1c2l2ZSBhbmQgdGhhdCBtYWRlIHRoZSBjb2RlIGZyYWdpbGUuIFNvIG5vdyB3ZSdyZQotICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIGJlIGV4Y2x1c2l2ZTogdGFrZSBldmVyeXRoaW5nIHRpbGwgd2UgZ2V0IG9uZSBvZjoKLSAgICAgICAgICAgICAgICAvLyAtIGFueSBmb3JtIG9mIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAvLyAtIGFueSB4bWwgc2VwYXJhdG9yLCBlLmcuIDwgPiAnICIgYW5kID0KLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICc8JyB8fCBjaCA9PSAnPicgfHwgY2ggPT0gJ1wnJyB8fCBjaCA9PSAnIicgfHwgY2ggPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldChpLCBvZmZzZXQgLSBpKTsKLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0gICAgICogUmV0dXJucyAwIGlmIHRoZSBvZmZzZXQgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2hhciBleHRyYWN0Q2hhcihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLSAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPiBkb2N1bWVudC5nZXRMZW5ndGgoKSkgcmV0dXJuIDA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZWRpdCBvZiBhbiBhdHRyaWJ1dGUgYXMgcmVwb3J0ZWQgYnkgcGFyc2VBdHRyaWJ1dGVJbmZvLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQXR0cmliSW5mbyB7Ci0gICAgICAgIC8qKiBUcnVlIGlmIHRoZSBjdXJzb3IgaXMgbG9jYXRlZCBpbiBhbiBhdHRyaWJ1dGUncyB2YWx1ZSwgZmFsc2UgaWYgaW4gYW4gYXR0cmlidXRlIG5hbWUgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblZhbHVlID0gZmFsc2U7Ci0gICAgICAgIC8qKiBUaGUgYXR0cmlidXRlIG5hbWUuIE51bGwgd2hlbiBub3Qgc2V0LiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAvKiogVGhlIGF0dHJpYnV0ZSB2YWx1ZS4gTnVsbCB3aGVuIG5vdCBzZXQuIFRoZSB2YWx1ZSAqbWF5KiBzdGFydCB3aXRoIGEgcXVvdGUKLSAgICAgICAgICogICgnIG9yICIpLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byBxdW90ZSB0aGUgc3RyaW5nIGZvciB0aGUgdXNlciAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgLyoqIFN0cmluZyB0eXBlZCBieSB0aGUgdXNlciBzbyBmYXIgKGkuZS4gcmlnaHQgYmVmb3JlIHJlcXVlc3RpbmcgY29kZSBjb21wbGV0aW9uKSwKLSAgICAgICAgICogIHdoaWNoIHdpbGwgYmUgY29ycmVjdGVkIGlmIHdlIGZpbmQgYSBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciBhbiBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqICBTZWUgdGhlIGxvbmcgY29tbWVudCBpbiBnZXRDaG9pY2VzRm9yQXR0cmlidXRlKCkuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY29ycmVjdGVkUHJlZml4ID0gbnVsbDsKLSAgICAgICAgLyoqIE5vbi16ZXJvIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBuZWVkIGEgc3RhcnQvZW5kIHRhZyAoaS5lLiBxdW90ZXMgb3IgYnJhY2tldHMpICovCi0gICAgICAgIHB1YmxpYyBjaGFyIG5lZWRUYWcgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVHJ5IHRvIGd1ZXNzIGlmIHRoZSBjdXJzb3IgaXMgZWRpdGluZyBhbiBlbGVtZW50J3MgbmFtZSBvciBhbiBhdHRyaWJ1dGUgZm9sbG93aW5nIGFuCi0gICAgICogZWxlbWVudC4gSWYgaXQncyBhbiBhdHRyaWJ1dGUsIHRyeSB0byBmaW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGJlaW5nIGRlZmluZWQgb3IKLSAgICAgKiBpdHMgdmFsdWUuCi0gICAgICogPGJyLz4KLSAgICAgKiBUaGlzIGlzIGN1cnJlbnRseSAqb25seSogY2FsbGVkIHdoZW4gd2Uga25vdyB0aGUgY3Vyc29yIGlzIGFmdGVyIGEgY29tcGxldGUgZWxlbWVudAotICAgICAqIHRhZyBuYW1lLCBzbyBpdCBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0gICAgICogPGJyLz4KLSAgICAgKiBSZWZlcmVuY2UgZm9yIFhNTCBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvUkVDLXhtbC0yMDA2MDgxNi8jc2VjLXN0YXJ0dGFncwotICAgICAqIDxici8+Ci0gICAgICogQHJldHVybiBBbiBBdHRyaWJJbmZvIGRlc2NyaWJpbmcgd2hpY2ggYXR0cmlidXRlIGlzIGJlaW5nIGVkaXRlZCBvciBudWxsIGlmIHRoZSBjdXJzb3IgaXMKLSAgICAgKiAgICAgICAgIG5vdCBlZGl0aW5nIGFuIGF0dHJpYnV0ZSAoaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGFuIGVsZW1lbnQncyBuYW1lKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dHJpYkluZm8gcGFyc2VBdHRyaWJ1dGVJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotICAgICAgICBBdHRyaWJJbmZvIGluZm8gPSBuZXcgQXR0cmliSW5mbygpOwotCi0gICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotICAgICAgICBpbnQgbiA9IGRvY3VtZW50LmdldExlbmd0aCgpOwotICAgICAgICBpZiAob2Zmc2V0IDw9IG4pIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbiA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBmb3IgKDtvZmZzZXQgPiAwOyAtLW9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc8JykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGV4dCB3aWxsIGNvbnRhaW4gdGhlIGZ1bGwgc3RyaW5nIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgLy8gaS5lLiB3aGF0ZXZlciBpcyBhZnRlciB0aGUgIjwiIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgbiAtIG9mZnNldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgd2hpdGVzcGFjZSB0byBzaW5nbGUgc3BhY2VzCi0gICAgICAgICAgICAgICAgdGV4dCA9IHNXaGl0ZXNwYWNlLm1hdGNoZXIodGV4dCkucmVwbGFjZUFsbCgiICIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxlYWRpbmcgZWxlbWVudCBuYW1lLiBCeSBzcGVjLCBpdCBtdXN0IGJlIGFmdGVyIHRoZSA8IHdpdGhvdXQKLSAgICAgICAgICAgICAgICAvLyBhbnkgd2hpdGVzcGFjZS4gSWYgdGhlcmUncyBub3RoaW5nIGxlZnQsIG5vIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZWZpbmVkIHlldC4KLSAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRvIGtlZXAgYW55IHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGluaXRpYWwgd29yZCBpZiBhbnksIGFzIGl0IG1hdHRlcnMuCi0gICAgICAgICAgICAgICAgdGV4dCA9IHNGaXJzdEVsZW1lbnRXb3JkLm1hdGNoZXIodGV4dCkucmVwbGFjZUZpcnN0KCIiKTsgIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIC8vIFRoZXJlIE1VU1QgYmUgc3BhY2UgYWZ0ZXIgdGhlIGVsZW1lbnQgbmFtZS4gSWYgbm90LCB0aGUgY3Vyc29yIGlzIHN0aWxsCi0gICAgICAgICAgICAgICAgLy8gZGVmaW5pbmcgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICAgICAgICAgICAgICBpZiAoIXRleHQuc3RhcnRzV2l0aCgiICIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGZ1bGwgYXR0cmlidXRlczoKLSAgICAgICAgICAgICAgICAvLyBTeW50YXg6Ci0gICAgICAgICAgICAgICAgLy8gICAgbmFtZSA9ICIuLi4iIHF1b3RlZCBzdHJpbmcgd2l0aCBhbGwgYnV0IDwgYW5kICIKLSAgICAgICAgICAgICAgICAvLyBvcjoKLSAgICAgICAgICAgICAgICAvLyAgICBuYW1lID0gJy4uLicgcXVvdGVkIHN0cmluZyB3aXRoIGFsbCBidXQgPCBhbmQgJwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBzRmlyc3RBdHRyaWJ1dGUubWF0Y2hlcih0ZW1wKS5yZXBsYWNlRmlyc3QoIiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gd2hpbGUoIXRlbXAuZXF1YWxzKHRleHQpKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSdyZSBsZWZ0IHdpdGggMyBjYXNlczoKLSAgICAgICAgICAgICAgICAvLyAtIG5vdGhpbmc6IGVpdGhlciB0aGVyZSBpcyBubyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBvciB0aGUgY3Vyc29yIGxvY2F0ZWQgYWZ0ZXIKLSAgICAgICAgICAgICAgICAvLyAgIGEgY29tcGxldGVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uLgotICAgICAgICAgICAgICAgIC8vIC0gYSBzdHJpbmcgd2l0aCBubyA9OiB0aGUgdXNlciBpcyB3cml0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lLiBUaGlzIGNhc2UgY2FuIGJlCi0gICAgICAgICAgICAgICAgLy8gICBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICAgICAgICAgIC8vIC0gc3RyaW5nIHdpdGggYW4gPSBzaWduLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgcXVvdGUgKCcgb3IgIik6IHRoZSB1c2VyIGlzCi0gICAgICAgICAgICAgICAgLy8gICB3cml0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICAgIGludCBwb3NfZXF1YWwgPSB0ZXh0LmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zX2VxdWFsID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uaXNJblZhbHVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8ubmFtZSA9IHRleHQudHJpbSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uaXNJblZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5uYW1lID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zX2VxdWFsKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8udmFsdWUgPSB0ZXh0LnN1YnN0cmluZyhwb3NfZXF1YWwgKyAxKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgWE1MIERPTSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZShJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLSAgICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKG1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcig7IG9mZnNldCA+PSAwICYmIG5vZGUgPT0gbnVsbDsgLS1vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAoTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbnMuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyAoaWYgbmVlZGVkKSBhbmQgcmV0dXJucyB0aGUgcm9vdCBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgZ2V0Um9vdERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIGlmIChtUm9vdERlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IG1FZGl0b3IuZ2V0VGFyZ2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElEZXNjcmlwdG9yUHJvdmlkZXIgZGVzY3JpcHRvclByb3ZpZGVyID0gZGF0YS5nZXREZXNjcmlwdG9yUHJvdmlkZXIobURlc2NyaXB0b3JJZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvclByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvb3REZXNjcmlwdG9yID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKCIiLCAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQcm92aWRlci5nZXRSb290RWxlbWVudERlc2NyaXB0b3JzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtUm9vdERlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIHtAbGluayBBbmRyb2lkRWRpdG9yfSBtYXRjaGluZyB0aGlzIHNvdXJjZSB2aWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbmRyb2lkRWRpdG9yIGdldEFuZHJvaWRFZGl0b3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd3dpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGlmICh3d2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3d2luLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBBbmRyb2lkRWRpdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTb3VyY2VWaWV3ZXIgc3N2aWV3ZXIgPSAoKEFuZHJvaWRFZGl0b3IpIGVkaXRvcikuZ2V0U3RydWN0dXJlZFNvdXJjZVZpZXdlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3N2aWV3ZXIgPT0gdmlld2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFuZHJvaWRFZGl0b3IpIGVkaXRvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0FuZHJvaWRFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0FuZHJvaWRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2YjQ2YS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9BbmRyb2lkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGsuSVRhcmdldENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIE11bHRpLXBhZ2UgZm9ybSBlZGl0b3IgZm9yIEFuZHJvaWQgWE1MIGZpbGVzLgotICogPHAvPgotICogSXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGEge0BsaW5rIFN0cnVjdHVyZWRUZXh0RWRpdG9yfSB0aGF0IHdpbGwgZGlzcGxheSBhbiBYTUwgZmlsZS4KLSAqIDxici8+Ci0gKiBEZXJpdmVkIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgY3JlYXRlRm9ybVBhZ2VzIHRvIGNyZWF0ZSB0aGUgZm9ybXMgYmVmb3JlIHRoZQotICogc291cmNlIGVkaXRvci4gVGhpcyBjYW4gYmUgYSBuby1vcCBpZiBkZXNpcmVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5kcm9pZEVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICAvKiogUHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgY3VycmVudCBwYWdlIG9mIHRoaXMgZmlsZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NVUlJFTlRfUEFHRSA9ICJfY3VycmVudF9wYWdlIjsKLQotICAgIC8qKiBJZCBzdHJpbmcgdXNlZCB0byBjcmVhdGUgdGhlIEFuZHJvaWQgU0RLIGJyb3dzZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlJPV1NFUl9JRCA9ICJhbmRyb2lkIjsgLy8gJE5PTi1OTFMtMSQKLQotICAgIC8qKiBQYWdlIGlkIG9mIHRoZSBYTUwgc291cmNlIGVkaXRvciwgdXNlZCBmb3Igc3dpdGNoaW5nIHRhYnMgcHJvZ3JhbW1hdGljYWxseSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFWFRfRURJVE9SX0lEID0gImVkaXRvcl9wYXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFdpZHRoIGhpbnQgZm9yIHRleHQgZmllbGRzLiBIZWxwcyB0aGUgZ3JpZCBsYXlvdXQgcmVzaXplIHByb3Blcmx5IG9uIHNtYWxsZXIgc2NyZWVucyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfV0lEVEhfSElOVCA9IDUwOwotCi0gICAgLyoqIFBhZ2UgaW5kZXggb2YgdGhlIHRleHQgZWRpdG9yIChhbHdheXMgdGhlIGxhc3QgcGFnZSkgKi8KLSAgICBwcml2YXRlIGludCBtVGV4dFBhZ2VJbmRleDsKLSAgICAvKiogVGhlIHRleHQgZWRpdG9yICovCi0gICAgcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBtVGV4dEVkaXRvcjsKLSAgICAvKiogTGlzdGVuZXIgZm9yIHRoZSBYTUwgbW9kZWwgZnJvbSB0aGUgU3RydWN0dXJlZEVkaXRvciAqLwotICAgIHByaXZhdGUgWG1sTW9kZWxTdGF0ZUxpc3RlbmVyIG1YbWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0gICAgLyoqIExpc3RlbmVyIHRvIHVwZGF0ZSB0aGUgcm9vdCBub2RlIGlmIHRoZSB0YXJnZXQgb2YgdGhlIGZpbGUgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEKLSAgICAgKiBTREsgbG9jYXRpb24gY2hhbmdlIG9yIGEgcHJvamVjdCB0YXJnZXQgY2hhbmdlICovCi0gICAgcHJpdmF0ZSBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgbVRhcmdldExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvcm0gZWRpdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBtVGFyZ2V0TGlzdGVuZXIgPSBuZXcgSVRhcmdldENoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9qZWN0VGFyZ2V0Q2hhbmdlKElQcm9qZWN0IGNoYW5nZWRQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRQcm9qZWN0ID09IGdldFByb2plY3QoKSkgewotICAgICAgICAgICAgICAgICAgICBvblRhcmdldHNMb2FkZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFyZ2V0c0xvYWRlZCgpIHsKLSAgICAgICAgICAgICAgICBjb21taXRQYWdlcyhmYWxzZSAvKiBvblNhdmUgKi8pOwotCi0gICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHVpIHJvb3Qgbm9kZSBhbHdheXMKLSAgICAgICAgICAgICAgICBpbml0VWlSb290Tm9kZSh0cnVlIC8qZm9yY2UqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuYWRkVGFyZ2V0TGlzdGVuZXIobVRhcmdldExpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIEFic3RyYWN0IE1ldGhvZHMgLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBVSSBlbGVtZW50IGhpZXJhcmNoeSBtYW5pcHVsYXRlZCBieSB0aGUgY3VycmVudAotICAgICAqIFVJIG5vZGUgZWRpdG9yLgotICAgICAqLwotICAgIGFic3RyYWN0IHB1YmxpYyBVaUVsZW1lbnROb2RlIGdldFVpUm9vdE5vZGUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHZhcmlvdXMgZm9ybSBwYWdlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogRGVyaXZlZCBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gYWRkIHRoZWlyIG93biBzcGVjaWZpYyB0YWJzLgotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1QYWdlcygpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBVSSBSb290IE5vZGUsIGluY2x1ZGluZyB0aGUga25vd24gbWFuZGF0b3J5IGVsZW1lbnRzLgotICAgICAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlLCBhIG5ldyBVaU1hbmlmZXN0Tm9kZSBpcyByZWNyZWF0ZWQgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBpbml0VWlSb290Tm9kZShib29sZWFuIGZvcmNlKTsKLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb2Nlc3MgdGhlIG5ldyBYTUwgTW9kZWwsIHdoaWNoIFhNTAotICAgICAqIHJvb3Qgbm9kZSBpcyBnaXZlbi4KLSAgICAgKgotICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbF9kb2MgVGhlIFhNTCBkb2N1bWVudCwgaWYgYXZhaWxhYmxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHhtbE1vZGVsQ2hhbmdlZChEb2N1bWVudCB4bWxfZG9jKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvLyAtLS0tIEJhc2UgQ2xhc3MgT3ZlcnJpZGVzLCBJbnRlcmZhY2VzIEltcGxlbWVudGVkIC0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgY3JlYXRlQW5kcm9pZFBhZ2VzKCk7Ci0gICAgICAgIHNlbGVjdERlZmF1bHRQYWdlKG51bGwgLyogZGVmYXVsdFBhZ2VJZCAqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcGFnZSBmb3IgdGhlIEFuZHJvaWQgRWRpdG9ycwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZHJvaWRQYWdlcygpIHsKLSAgICAgICAgY3JlYXRlRm9ybVBhZ2VzKCk7Ci0gICAgICAgIGNyZWF0ZVRleHRFZGl0b3IoKTsKLQotICAgICAgICBjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHVuZG8gcmVkbyBhY3Rpb25zIGZvciB0aGUgZWRpdG9yIHNpdGUgKHNvIHRoYXQgaXQgd29ya3MgZm9yIGFueSBwYWdlIG9mIHRoaXMKLSAgICAgKiBtdWx0aS1wYWdlIGVkaXRvcikgYnkgcmUtdXNpbmcgdGhlIGFjdGlvbnMgZGVmaW5lZCBieSB0aGUge0BsaW5rIFN0cnVjdHVyZWRUZXh0RWRpdG9yfQotICAgICAqIChha2EgdGhlIFhNTCB0ZXh0IGVkaXRvci4pCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpIHsKLSAgICAgICAgSUFjdGlvbkJhcnMgYmFycyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGlmIChiYXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gbVRleHRFZGl0b3IuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLSAgICAgICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgYWN0aW9uKTsKLQotICAgICAgICAgICAgYWN0aW9uID0gbVRleHRFZGl0b3IuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKTsKLSAgICAgICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwgYWN0aW9uKTsKLQotICAgICAgICAgICAgYmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBkZWZhdWx0IGFjdGl2ZSBwYWdlLgotICAgICAqIEBwYXJhbSBkZWZhdWx0UGFnZUlkIHRoZSBpZCBvZiB0aGUgcGFnZSB0byBzaG93LiBJZiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgZWRpdG9yIGF0dGVtcHRzIHRvCi0gICAgICogZmluZCB0aGUgZGVmYXVsdCBwYWdlIGluIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgSVJlc291cmNlfSBvYmplY3QgYmVpbmcgZWRpdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdERlZmF1bHRQYWdlKFN0cmluZyBkZWZhdWx0UGFnZUlkKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0UGFnZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLQotICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgcW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyBQUkVGX0NVUlJFTlRfUEFHRSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VJZDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwYWdlSWQgPSBmaWxlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShxbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFBhZ2VJZCA9IHBhZ2VJZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRQYWdlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXRBY3RpdmVQYWdlKEludGVnZXIucGFyc2VJbnQoZGVmYXVsdFBhZ2VJZCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjYW4gZ2V0IE51bWJlckZvcm1hdEV4Y2VwdGlvbiBmcm9tIHBhcnNlSW50IGJ1dCBhbHNvCi0gICAgICAgICAgICAgICAgLy8gQXNzZXJ0aW9uRXJyb3IgZnJvbSBzZXRBY3RpdmVQYWdlIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuCi0gICAgICAgICAgICAgICAgLy8gR2VuZXJhbGx5IHNwZWFraW5nIHdlIGp1c3Qgd2FudCB0byBpZ25vcmUgYW55IGV4Y2VwdGlvbiBhbmQgZmFsbCBiYWNrIG9uIHRoZQotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBhZ2UgcmF0aGVyIHRoYW4gY3Jhc2ggdGhlIGVkaXRvciBsb2FkLiBMb2dnaW5nIHRoZSBlcnJvciBpcyBlbm91Z2guCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiU2VsZWN0aW5nIHBhZ2UgJyVzJyBpbiBBbmRyb2lkRWRpdG9yIGZhaWxlZCIsIGRlZmF1bHRQYWdlSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgdGhlIHBhZ2VzIGZyb20gdGhlIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVQYWdlcygpIHsKLSAgICAgICAgaW50IGNvdW50ID0gZ2V0UGFnZUNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDEgOyBpID49IDAgOyBpLS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVBhZ2UoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgdGhlIHBhcmVudCdzIHNldEFjdGl2ZVBhZ2UgdG8gYmUgYWJsZSB0byBzd2l0Y2ggdG8gdGhlIHhtbCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgc3BlY2lhbCBwYWdlSWQgVEVYVF9FRElUT1JfSUQgaXMgZ2l2ZW4sIHN3aXRjaGVzIHRvIHRoZSBtVGV4dFBhZ2VJbmRleCBwYWdlLgotICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGVkaXRvciBkb2Vzbid0IGFjdHVhbGx5IGRlcml2ZSBmcm9tIElGb3JtUGFnZSBhbmQgdGh1cwotICAgICAqIGRvZXNuJ3QgaGF2ZSB0aGUgZ2V0LWJ5LXBhZ2UtaWQgbWV0aG9kLiBJbiB0aGlzIGNhc2UsIHRoZSBtZXRob2QgcmV0dXJucyBudWxsIHNpbmNlCi0gICAgICogSUVkaXRvclBhcnQgZG9lcyBub3QgaW1wbGVtZW50IElGb3JtUGFnZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUZvcm1QYWdlIHNldEFjdGl2ZVBhZ2UoU3RyaW5nIHBhZ2VJZCkgewotICAgICAgICBpZiAocGFnZUlkLmVxdWFscyhURVhUX0VESVRPUl9JRCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldEFjdGl2ZVBhZ2UobVRleHRQYWdlSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuc2V0QWN0aXZlUGFnZShwYWdlSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yIHRoYXQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gaWQgaGFzIGJlZW4KLSAgICAgKiBhY3RpdmF0ZWQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBkaWZmZXJlbnQgdGFiLgotICAgICAqCi0gICAgICogQHNlZSBNdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotICAgICAgICBzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0KLSAgICAgICAgaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0KLSAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgcW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArIFBSRUZfQ1VSUkVOVF9QQUdFKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmlsZS5zZXRQZXJzaXN0ZW50UHJvcGVydHkocW5hbWUsIEludGVnZXIudG9TdHJpbmcobmV3UGFnZUluZGV4KSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBzb21lIHJlc291cmNlIGNoYW5nZXMKLSAgICAgKiBhcmUgaGFwcGVuaW5nLCBvciBoYXZlIGFscmVhZHkgaGFwcGVuZWQuCi0gICAgICoKLSAgICAgKiBDbG9zZXMgYWxsIHByb2plY3QgZmlsZXMgb24gcHJvamVjdCBjbG9zZS4KLSAgICAgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKSB7Ci0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYWdlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChGaWxlRWRpdG9ySW5wdXQpbVRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFJlc291cmNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHBhZ2VzW2ldLmZpbmRFZGl0b3IobVRleHRFZGl0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlc1tpXS5jbG9zZUVkaXRvcihlZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2hlY2tzIHRoYXQgdGhlIGlucHV0IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJRmlsZUVkaXRvcklucHV0fS4KLSAgICAgKgotICAgICAqIEBzZWUgRm9ybUVkaXRvcgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBpZiAoIShlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKCJJbnZhbGlkIElucHV0OiBNdXN0IGJlIElGaWxlRWRpdG9ySW5wdXQiKTsKLSAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhdHRhY2hlZCBsaXN0ZW5lcnMuCi0gICAgICoKLSAgICAgKiBAc2VlIFdvcmtiZW5jaFBhcnQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBJU3RydWN0dXJlZE1vZGVsIHhtbF9tb2RlbCA9IGdldE1vZGVsRm9yUmVhZCgpOwotICAgICAgICBpZiAoeG1sX21vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1YbWxNb2RlbFN0YXRlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB4bWxfbW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKG1YbWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB4bWxfbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgaWYgKG1UYXJnZXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZVRhcmdldExpc3RlbmVyKG1UYXJnZXRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtVGFyZ2V0TGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbW1pdCBhbGwgZGlydHkgcGFnZXMgdGhlbiBzYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIHRleHQgZWRpdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHdvcmtzIGJ5IGNvbW1pdHRpbmcgYWxsIGRhdGEgdG8gdGhlIFhNTCBtb2RlbCBhbmQgdGhlbgotICAgICAqIGFza2luZyB0aGUgU3RydWN0dXJlZCBYTUwgRWRpdG9yIHRvIHNhdmUgdGhlIFhNTC4KLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIGNvbW1pdFBhZ2VzKHRydWUgLyogb25TYXZlICovKTsKLQotICAgICAgICAvLyBUaGUgYWN0dWFsICJzYXZlIiBvcGVyYXRpb24gaXMgZG9uZSBieSB0aGUgU3RydWN0dXJlZCBYTUwgRWRpdG9yCi0gICAgICAgIGdldEVkaXRvcihtVGV4dFBhZ2VJbmRleCkuZG9TYXZlKG1vbml0b3IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IgdG8gYW5vdGhlciBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotICAgICAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBJRWRpdG9yUGFydAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgICAgICBjb21taXRQYWdlcyh0cnVlIC8qIG9uU2F2ZSAqLyk7Ci0KLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0RWRpdG9yKG1UZXh0UGFnZUluZGV4KTsKLSAgICAgICAgZWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgICAgIHNldFBhZ2VUZXh0KG1UZXh0UGFnZUluZGV4LCBlZGl0b3IuZ2V0VGl0bGUoKSk7Ci0gICAgICAgIHNldElucHV0KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXRzIGFsbCBkaXJ0eSBwYWdlcyBpbiB0aGUgZWRpdG9yLiBUaGlzIG1ldGhvZCBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgYXMgYSBmaXJzdCBzdGVwIG9mIGEgJ3NhdmUnIG9wZXJhdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyBpbiB7QGxpbmsgRm9ybUVkaXRvcn0KLSAgICAgKiBleGNlcHQgaXQgZml4ZXMgdHdvIGJ1Z3M6IGEgY2FzdCB0byBJRm9ybVBhZ2UgaXMgZG9uZQotICAgICAqIGZyb20gcGFnZS5nZXQoaSkgPGVtPmJlZm9yZTwvZW0+IGJlaW5nIHRlc3RlZCB3aXRoIGluc3RhbmNlb2YuCi0gICAgICogQW5vdGhlciBidWcgaXMgdGhhdCB0aGUgbGFzdCBwYWdlIG1pZ2h0IGJlIGEgbnVsbCBwb2ludGVyLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgaW5jb3JyZWN0IGNhc3RpbmcgbWFrZXMgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGNyYXNoIGR1ZQotICAgICAqIHRvIG91ciB7QGxpbmsgU3RydWN0dXJlZFRleHRFZGl0b3J9IG5vdCBiZWluZyBhbiB7QGxpbmsgSUZvcm1QYWdlfQotICAgICAqIHNvIHdlIGhhdmUgdG8gb3ZlcnJpZGUgYW5kIGR1cGxpY2F0ZSB0byBmaXggaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb25TYXZlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbW1pdCBpcyBwZXJmb3JtZWQgYXMgcGFydAotICAgICAqIG9mIHRoZSAnc2F2ZScgb3BlcmF0aW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEBzaW5jZSAzLjMKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb21taXRQYWdlcyhib29sZWFuIG9uU2F2ZSkgewotICAgICAgICBpZiAocGFnZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgcGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotICAgICAgICAgICAgICAgICAgICBJRm9ybVBhZ2UgZm9ybV9wYWdlID0gKElGb3JtUGFnZSkgcGFnZTsKLSAgICAgICAgICAgICAgICAgICAgSU1hbmFnZWRGb3JtIG1hbmFnZWRfZm9ybSA9IGZvcm1fcGFnZS5nZXRNYW5hZ2VkRm9ybSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFuYWdlZF9mb3JtICE9IG51bGwgJiYgbWFuYWdlZF9mb3JtLmlzRGlydHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZF9mb3JtLmNvbW1pdChvblNhdmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgInNhdmUgYXMiIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBlZGl0b3IuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotICAgICAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBJRWRpdG9yUGFydAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIC0tLS0gTG9jYWwgbWV0aG9kcyAtLS0tCi0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IGh5cGVyLWxpbmsgTGlzdGVuZXIuCi0gICAgICogVXNlZCBieSBkZXJpdmVkIGNsYXNzZXMgd2hpY2ggbmVlZCBhY3RpdmUgbGlua3MgaW4ge0BsaW5rIEZvcm1UZXh0fS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBsaW5rIGxpc3RlbmVyIGhhbmRsZXMgdHdvIGtpbmRzIG9mIFVSTHM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4gTGlua3Mgc3RhcnRpbmcgd2l0aCAiaHR0cCIgYXJlIHNpbXBseSBzZW50IHRvIGEgbG9jYWwgYnJvd3Nlci4KLSAgICAgKiA8bGk+IExpbmtzIHN0YXJ0aW5nIHdpdGggImZpbGU6LyIgYXJlIHNpbXBseSBzZW50IHRvIGEgbG9jYWwgYnJvd3Nlci4KLSAgICAgKiA8bGk+IExpbmtzIHN0YXJ0aW5nIHdpdGggInBhZ2U6IiBhcmUgZXhwZWN0ZWQgdG8gYmUgYW4gZWRpdG9yIHBhZ2UgaWQgdG8gc3dpdGNoIHRvLgotICAgICAqIDxsaT4gT3RoZXIgbGlua3MgYXJlIGlnbm9yZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBuZXcgaHlwZXItbGluayBsaXN0ZW5lciBmb3IgRm9ybVRleHQgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJSHlwZXJsaW5rTGlzdGVuZXIgY3JlYXRlSHlwZXJsaW5rTGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU3dpdGNoIHRvIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpbmsgdGhhdCBoYXMganVzdCBiZWVuIGNsaWNrZWQuCi0gICAgICAgICAgICAgKiBGb3IgdGhpcyBwdXJwb3NlLCB0aGUgSFJFRiBvZiB0aGUgJmx0O2EmZ3Q7IHRhZ3MgYWJvdmUgaXMgdGhlIHBhZ2UgSUQgdG8gc3dpdGNoIHRvLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN1cGVyLmxpbmtBY3RpdmF0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmsgPSBlLmRhdGEudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluay5zdGFydHNXaXRoKCJodHRwIikgfHwgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbGluay5zdGFydHNXaXRoKCJmaWxlOi8iKSkgeyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG9wZW5MaW5rSW5Ccm93c2VyKGxpbmspOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluay5zdGFydHNXaXRoKCJwYWdlOiIpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIC8vIFN3aXRjaCB0byBhbiBpbnRlcm5hbCBwYWdlCi0gICAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVBhZ2UobGluay5zdWJzdHJpbmcoNSAvKiBzdHJsZW4oInBhZ2U6IikgKi8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgaHR0cCBsaW5rIGludG8gYSBicm93c2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGluayBUaGUgVVJMIHRvIG9wZW4gaW4gYSBicm93c2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5MaW5rSW5Ccm93c2VyKFN0cmluZyBsaW5rKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgd2JzID0gV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHdicy5jcmVhdGVCcm93c2VyKEJST1dTRVJfSUQpLm9wZW5VUkwobmV3IFVSTChsaW5rKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIHNvdXJjZSBlZGl0b3IuCi0gICAgICogPHAvPgotICAgICAqIE1lbW9yaXplcyB0aGUgaW5kZXggcGFnZSBvZiB0aGUgc291cmNlIGVkaXRvciAoaXQncyBhbHdheXMgdGhlIGxhc3QgcGFnZSwgYnV0IHRoZSBudW1iZXIKLSAgICAgKiBvZiBwYWdlcyBiZWZvcmUgY2FuIGNoYW5nZS4pCi0gICAgICogPGJyLz4KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgWE1MIG1vZGVsIGZyb20gdGhlIFN0cnVjdHVyZWRFZGl0b3IgYW5kIGF0dGFjaGVzIGEgbGlzdGVuZXIgdG8gaXQuCi0gICAgICogRmluYWxseSB0cmlnZ2VycyBtb2RlbENoYW5nZWQoKSBvbiB0aGUgbW9kZWwgbGlzdGVuZXIgLS0gZGVyaXZlZCBjbGFzc2VzIGNhbiB1c2UgdGhpcwotICAgICAqIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsIHRoZSBmaXJzdCB0aW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsZWQgb25seSBvbmNlIDxlbT5hZnRlcjwvZW0+IGNyZWF0ZUZvcm1QYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGV4dEVkaXRvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UZXh0RWRpdG9yID0gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBhZGRQYWdlKG1UZXh0RWRpdG9yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgIG1UZXh0UGFnZUluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBzZXRQYWdlVGV4dChpbmRleCwgbVRleHRFZGl0b3IuZ2V0VGl0bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmICghKG1UZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9wZW5pbmcgdGhlIEFuZHJvaWQgWE1MIGVkaXRvci4gSXMgdGhlIGRvY3VtZW50IGFuIFhNTCBmaWxlPyIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbmRyb2lkIFhNTCBFZGl0b3IgRXJyb3IiLCBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCB4bWxfbW9kZWwgPSBnZXRNb2RlbEZvclJlYWQoKTsKLSAgICAgICAgICAgIGlmICh4bWxfbW9kZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1YbWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgWG1sTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbF9tb2RlbC5hZGRNb2RlbFN0YXRlTGlzdGVuZXIobVhtbE1vZGVsU3RhdGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIG1YbWxNb2RlbFN0YXRlTGlzdGVuZXIubW9kZWxDaGFuZ2VkKHhtbF9tb2RlbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRXJyb3Igd2hpbGUgbG9hZGluZyBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbF9tb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgIkFuZHJvaWQgWE1MIEVkaXRvciBFcnJvciIsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSVNvdXJjZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElTb3VyY2VWaWV3ZXIgZ2V0U3RydWN0dXJlZFNvdXJjZVZpZXdlcigpIHsKLSAgICAgICAgaWYgKG1UZXh0RWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdlIGNhbid0IGFjY2VzcyBtRWRpdG9yLmdldFNvdXJjZVZpZXdlcigpIGJlY2F1c2UgaXQgaXMgcHJvdGVjdGVkLAotICAgICAgICAgICAgLy8gaG93ZXZlciBnZXRUZXh0Vmlld2VyIHNpbXBseSByZXR1cm5zIHRoZSBTb3VyY2VWaWV3ZXIgY2FzdGVkLCBzbyB3ZQotICAgICAgICAgICAgLy8gY2FuIHVzZSBpdCBpbnN0ZWFkLgotICAgICAgICAgICAgcmV0dXJuIG1UZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSVN0cnVjdHVyZWREb2N1bWVudH0gdXNlZCBieSB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IgKGFrYSBTb3VyY2UKLSAgICAgKiBFZGl0b3IpIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0gICAgICAgIGlmIChtVGV4dEVkaXRvciAhPSBudWxsICYmIG1UZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG1UZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2ZXJzaW9uIG9mIHRoZSBtb2RlbCB0aGF0IGhhcyBiZWVuIHNoYXJlZCBmb3IgcmVhZC4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FsbGVycyA8ZW0+bXVzdDwvZW0+IGNhbGwgbW9kZWwucmVsZWFzZUZyb21SZWFkKCkgd2hlbiBkb25lLCB0eXBpY2FsbHkKLSAgICAgKiBpbiBhIHRyeS4uZmluYWxseSBjbGF1c2UuCi0gICAgICoKLSAgICAgKiBQb3J0YWJpbGl0eSBub3RlOiB0aGlzIHVzZXMgZ2V0TW9kZWxNYW5hZ2VyIHdoaWNoIGlzIHBhcnQgb2Ygd3N0LnNzZS5jb3JlOyBob3dldmVyCi0gICAgICogdGhlIGludGVyZmFjZSByZXR1cm5lZCBpcyBwYXJ0IG9mIHdzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbCBzbyB3ZSBjYW4KLSAgICAgKiBleHBlY3QgaXQgdG8gY2hhbmdlIGluIGEgZGlzdGFudCBmdXR1cmUgaWYgdGhleSBzdGFydCBjbGVhbmluZyB0aGVpciBjb2RlYmFzZSwKLSAgICAgKiBob3dldmVyIHVubGlrZWx5IHRoYXQgaXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtb2RlbCBmb3IgdGhlIFhNTCBkb2N1bWVudCBvciBudWxsIGlmIGNhbm5vdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKG1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW0uZ2V0TW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgbW9kZWwgdGhhdCBoYXMgYmVlbiBzaGFyZWQgZm9yIGVkaXQuCi0gICAgICogPHAvPgotICAgICAqIENhbGxlcnMgPGVtPm11c3Q8L2VtPiBjYWxsIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpIHdoZW4gZG9uZSwgdHlwaWNhbGx5Ci0gICAgICogaW4gYSB0cnkuLmZpbmFsbHkgY2xhdXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbW9kZWwgZm9yIHRoZSBYTUwgZG9jdW1lbnQgb3IgbnVsbCBpZiBjYW5ub3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgZWRpdG9yCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KCkgewotICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmIChtbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1tLmdldE1vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGNsYXNzIHRvIHBlcmZvcm0gZWRpdHMgb24gdGhlIFhNTCBtb2RlbCB3aGlsc3QgbWFraW5nIHN1cmUgdGhlCi0gICAgICogbW9kZWwgaGFzIGJlZW4gcHJlcGFyZWQgdG8gYmUgY2hhbmdlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogSXQgZmlyc3QgZ2V0cyBhIG1vZGVsIGZvciBlZGl0aW9uIHVzaW5nIHtAbGluayAjZ2V0TW9kZWxGb3JFZGl0KCl9LAotICAgICAqIHRoZW4gY2FsbHMge0BsaW5rIElTdHJ1Y3R1cmVkTW9kZWwjYWJvdXRUb0NoYW5nZU1vZGVsKCl9LAotICAgICAqIHRoZW4gcGVyZm9ybXMgdGhlIHJlcXVlc3RlZCBhY3Rpb24KLSAgICAgKiBhbmQgZmluYWxseSBjYWxscyB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbCNjaGFuZ2VkTW9kZWwoKX0KLSAgICAgKiBhbmQge0BsaW5rIElTdHJ1Y3R1cmVkTW9kZWwjcmVsZWFzZUZyb21FZGl0KCl9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgbWV0aG9kIGlzIHN5bmNocm9ub3VzLiBBcyBzb29uIGFzIHRoZSB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbCNjaGFuZ2VkTW9kZWwoKX0gbWV0aG9kCi0gICAgICogaXMgY2FsbGVkLCBYTUwgbW9kZWwgbGlzdGVuZXJzIHdpbGwgYmUgdHJpZ2dlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVkaXRfYWN0aW9uIFNvbWV0aGluZyB0aGF0IHdpbGwgY2hhbmdlIHRoZSBYTUwuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZWRpdFhtbE1vZGVsKFJ1bm5hYmxlIGVkaXRfYWN0aW9uKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAgICAgZWRpdF9hY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG1vZGVsIHdlJ3JlIGRvbmUgbW9kaWZ5aW5nIGl0LiBUaGlzIG11c3QgKmFsd2F5cyogYmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGFuICJ1bmRvIHJlY29yZGluZyIgc2Vzc2lvbi4gVGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSB1bmRlcmx5aW5nIHVuZG8gbWFuYWdlcgotICAgICAqIGFzc29jaWF0ZWQgdG8gdGhlIHN0cnVjdHVyZWQgWE1MIG1vZGVsLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGVyZSA8ZW0+bXVzdDwvZW0+IGJlIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvIHtAbGluayAjZW5kVW5kb1JlY29yZGluZygpfS4KLSAgICAgKiA8cC8+Ci0gICAgICogYmVnaW5VbmRvUmVjb3JkaW5nL2VuZFVuZG9SZWNvcmRpbmcgY2FsbHMgY2FuIGJlIG5lc3RlZCAoaW5uZXIgY2FsbHMgYXJlIGlnbm9yZWQsIG9ubHkgb25lCi0gICAgICogdW5kbyBvcGVyYXRpb24gaXMgcmVjb3JkZWQuKQotICAgICAqCi0gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBmb3IgdGhlIHVuZG8gb3BlcmF0aW9uLiBDYW4gYmUgbnVsbCBidXQgd2Ugc2hvdWxkIHJlYWxseSB0cnkgdG8gcHV0Ci0gICAgICogICAgICAgICAgICAgIHNvbWV0aGluZyBtZWFuaW5nZnVsIGlmIHBvc3NpYmxlLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdW5kbyByZWNvcmRpbmcgYWN0dWFsbHkgc3RhcnRlZCwgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJlZC4KLSAgICAgKiAgICAgICAgIHtAbGluayAjZW5kVW5kb1JlY29yZGluZygpfSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgVHJ1ZSBpcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYmVnaW5VbmRvUmVjb3JkaW5nKFN0cmluZyBsYWJlbCkgewotICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmIChtbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1tLmdldE1vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgbGFiZWwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZHMgYW4gInVuZG8gcmVjb3JkaW5nIiBzZXNzaW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHRoZSBjb3VudGVycGFydCBjYWxsIHRvIHtAbGluayAjYmVnaW5VbmRvUmVjb3JkaW5nKFN0cmluZyl9IGFuZCBzaG91bGQgb25seSBiZQotICAgICAqIHVzZWQgaWYgdGhlIGluaXRpYWwgY2FsbCByZXR1cm5lZCB0cnVlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBlbmRVbmRvUmVjb3JkaW5nKCkgewotICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmIChtbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1tLmdldE1vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gInVuZG8gcmVjb3JkaW5nIiBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIHVuZG9hYmxlQWN0aW9uIHJ1bm5hYmxlCi0gICAgICogdXNpbmcge0BsaW5rICNiZWdpblVuZG9SZWNvcmRpbmcoU3RyaW5nKX0gYW5kIHtAbGluayAjZW5kVW5kb1JlY29yZGluZygpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBZb3UgY2FuIG5lc3Qgc2V2ZXJhbCBjYWxscyB0byB7QGxpbmsgI3dyYXBVbmRvUmVjb3JkaW5nKFN0cmluZywgUnVubmFibGUpfSwgb25seSBvbmUKLSAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbiB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGZvciB0aGUgdW5kbyBvcGVyYXRpb24uIENhbiBiZSBudWxsLiBJZGVhbGx5IHdlIHNob3VsZCByZWFsbHkgdHJ5Ci0gICAgICogICAgICAgICAgICAgIHRvIHB1dCBzb21ldGhpbmcgbWVhbmluZ2Z1bCBpZiBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cmFwVW5kb1JlY29yZGluZyhTdHJpbmcgbGFiZWwsIFJ1bm5hYmxlIHVuZG9hYmxlQWN0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVjb3JkaW5nID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWNvcmRpbmcgPSBiZWdpblVuZG9SZWNvcmRpbmcobGFiZWwpOwotICAgICAgICAgICAgdW5kb2FibGVBY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVjb3JkaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kVW5kb1JlY29yZGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgWE1MIHtAbGluayBEb2N1bWVudH0gb3IgbnVsbCBpZiB3ZSBjYW4ndCBnZXQgaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgRG9jdW1lbnQgZ2V0WG1sRG9jdW1lbnQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsICJBbmRyb2lkIEVkaXRvcjogTm8gWE1MIG1vZGVsIGZvciByb290IG5vZGUuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0gICAgICAgICAgICBJRE9NTW9kZWwgZG9tX21vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0gICAgICAgICAgICByZXR1cm4gZG9tX21vZGVsLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElQcm9qZWN0fSBmb3IgdGhlIGVkaXRlZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICBpZiAobVRleHRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gbVRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgICAgIEZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KWlucHV0OwotICAgICAgICAgICAgICAgIElGaWxlIGlucHV0RmlsZSA9IGZpbGVJbnB1dC5nZXRGaWxlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0RmlsZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFuZHJvaWRUYXJnZXREYXRhfSBmb3IgdGhlIGVkaXRlZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkVGFyZ2V0RGF0YSBnZXRUYXJnZXREYXRhKCkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gY3VycmVudFNkay5nZXRUYXJnZXQocHJvamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZGsuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIHVuZGVybHlpbmcgWE1MIG1vZGVsIGluIHRoZSBzdHJ1Y3R1cmVkIGVkaXRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFhtbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoaXMgdHlwaWNhbGx5IGlzIGluaXRpYXRlZCBieSBvbmUKLSAgICAgICAgICogY2xpZW50IG9mIHRoZSBtb2RlbCwgdG8gc2lnbmFsIGEgbGFyZ2UgY2hhbmdlIGFuZC9vciBhIGNoYW5nZSB0byB0aGUKLSAgICAgICAgICogbW9kZWwncyBJRCBvciBiYXNlIExvY2F0aW9uLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIGlmIGEgY2xpZW50IG1pZ2h0Ci0gICAgICAgICAqIHdhbnQgdG8gc3VzcGVuZCBwcm9jZXNzaW5nIHVudGlsIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgQW5kcm9pZEVkaXRvciBpbXBsZW1lbnRhdGlvbiBvZiBJTW9kZWxDaGFuZ2VkTGlzdGVuZXIgaXMgZW1wdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNpZ25hbHMgdGhhdCB0aGUgY2hhbmdlcyBmb3JldG9sZCBieSBtb2RlbEFib3V0VG9CZUNoYW5nZWQgaGF2ZSBiZWVuCi0gICAgICAgICAqIG1hZGUuIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmUgdG8gcmVmcmVzaCwgb3IgdG8gcmVzdW1lIHByb2Nlc3NpbmcgdGhhdAotICAgICAgICAgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIEFuZHJvaWRFZGl0b3IgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhlIHhtbE1vZGVsQ2hhbmdlZCBjYWxsYmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgICAgICB4bWxNb2RlbENoYW5nZWQoZ2V0WG1sRG9jdW1lbnQobW9kZWwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBOb3RpZmllcyB0aGF0IGEgbW9kZWwncyBkaXJ0eSBzdGF0ZSBoYXMgY2hhbmdlZCwgYW5kIHBhc3NlcyB0aGF0IHN0YXRlCi0gICAgICAgICAqIGluIGlzRGlydHkuIEEgbW9kZWwgYmVjb21lcyBkaXJ0eSB3aGVuIGFueSBjaGFuZ2UgaXMgbWFkZSwgYW5kIGJlY29tZXMKLSAgICAgICAgICogbm90LWRpcnR5IHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgQW5kcm9pZEVkaXRvciBpbXBsZW1lbnRhdGlvbiBvZiBJTW9kZWxDaGFuZ2VkTGlzdGVuZXIgaXMgZW1wdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgbW9kZWxEZWxldGVkIG1lYW5zIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuIFRoZQotICAgICAgICAgKiBtb2RlbCBpdHNlbGYgaXMgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCBtYW5hZ2VtZW50IHVudGlsIGFsbCBoYXZlCi0gICAgICAgICAqIHJlbGVhc2VkIGl0LiBOb3RlOiBiYXNlTG9jYXRpb24gaXMgbm90IChuZWNlc3NhcmlseSkgY2hhbmdlZCBpbiB0aGlzCi0gICAgICAgICAqIGV2ZW50LCBidXQgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIEFuZHJvaWRFZGl0b3IgaW1wbGVtZW50YXRpb24gb2YgSU1vZGVsQ2hhbmdlZExpc3RlbmVyIGlzIGVtcHR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgbW9kZWwgaGFzIGJlZW4gcmVuYW1lZCBvciBjb3BpZWQgKGFzIGluIHNhdmVBcy4uKS4gSW4gdGhlIHJlbmFtZWQKLSAgICAgICAgICogY2FzZSwgdGhlIHR3byBwYXJhbWVudGVycyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIGFuZCBvbmx5IGNvbnRhaW4gdGhlCi0gICAgICAgICAqIG5ldyBpbmZvIGZvciBpZCBhbmQgYmFzZSBsb2NhdGlvbi4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIEFuZHJvaWRFZGl0b3IgaW1wbGVtZW50YXRpb24gb2YgSU1vZGVsQ2hhbmdlZExpc3RlbmVyIGlzIGVtcHR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIEFuZHJvaWRFZGl0b3IgaW1wbGVtZW50YXRpb24gb2YgSU1vZGVsQ2hhbmdlZExpc3RlbmVyIGlzIGVtcHR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBBbmRyb2lkRWRpdG9yIGltcGxlbWVudGF0aW9uIG9mIElNb2RlbENoYW5nZWRMaXN0ZW5lciBpcyBlbXB0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjQxMjUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0FuZHJvaWRTb3VyY2VWaWV3ZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JSW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2UgU291cmNlIFZpZXdlciBDb25maWd1cmF0aW9uIGZvciBBbmRyb2lkIHJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFuZHJvaWRTb3VyY2VWaWV3ZXJDb25maWcgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwgewotCi0gICAgLyoqIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciB0byB1c2UgZm9yIGFsbCBoYW5kbGVkIHBhcnRpdGlvbnMuICovCi0gICAgcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBtUHJvY2Vzc29yOwotCi0gICAgcHVibGljIEFuZHJvaWRTb3VyY2VWaWV3ZXJDb25maWcoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Qcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY29udGVudAotICAgICAqIGFzc2lzdCBpbiB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlciBhbmQgZm9yIHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlVmlld2VyIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcwotICAgICAqICAgICAgICBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIHBhcnRpdGlvblR5cGUgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgY29udGVudCBhc3Npc3QKLSAgICAgKiAgICAgICAgcHJvY2Vzc29ycyBhcmUgYXBwbGljYWJsZQotICAgICAqIEByZXR1cm4gSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygKLSAgICAgICAgICAgIElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotICAgICAgICBBcnJheUxpc3Q8SUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElDb250ZW50QXNzaXN0UHJvY2Vzc29yPigpOwotICAgICAgICBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04gfHwKLSAgICAgICAgICAgIHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OIHx8Ci0gICAgICAgICAgICBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSUlucHV0UHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICBJSW5wdXRQcm92aWRlciBpbnB1dCA9IChJSW5wdXRQcm92aWRlcikgc291cmNlVmlld2VyOwotICAgICAgICAgICAgICAgIE9iamVjdCBhID0gaW5wdXQuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElEb2N1bWVudCBkb2MgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkb2MudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvY2Vzc29ycy5hZGQobVByb2Nlc3Nvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIG90aGVycyA9IHN1cGVyLmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKHNvdXJjZVZpZXdlciwKLSAgICAgICAgICAgICAgICBwYXJ0aXRpb25UeXBlKTsKLSAgICAgICAgaWYgKG90aGVycyAhPSBudWxsICYmIG90aGVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgOiBvdGhlcnMpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzb3JzLmFkZChwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHByb2Nlc3NvcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NvcnMudG9BcnJheShuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbcHJvY2Vzc29ycy5zaXplKCldKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gdGV4dCBob3ZlciBmb3IgYW5kcm9pZCB4bWwKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoCi0gICAgICAgICAgICBJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gYXV0byBlZGl0IHN0cmF0ZWdpZXMgZm9yIGFuZHJvaWQgeG1sCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0gICAgICAgIC8vIFRPRE8gY29udGVudCBmb3JtYXR0ZXIgZm9yIGFuZHJvaWQgeG1sCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvRmlyc3RFbGVtZW50UGFyc2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9GaXJzdEVsZW1lbnRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4YjMyMS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9GaXJzdEVsZW1lbnRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotLyoqCi0gKiBRdWlja2x5IHBhcnNlcyBhIChwb3RlbnRpYWwpIFhNTCBmaWxlIHRvIGV4dHJhY3QgaXRzIGZpcnN0IGVsZW1lbnQgKGkuZS4gdGhlIHJvb3QgZWxlbWVudCkKLSAqIGFuZCBuYW1lc3BhY2UsIGlmIGFueS4KLSAqIDxwLz4KLSAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBmaWxlIGlzIGFuIFhNTCBkb2N1bWVudCB0aGF0IHRoZSBYbWxFZGl0b3IgY2FuIHByb2Nlc3MuCi0gKiA8cC8+Ci0gKiBUT0RPIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgaGFyZGNvZGVkICJhbmRyb2lkIiBuYW1lc3BhY2UgcHJlZml4IGxpbWl0YXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaXJzdEVsZW1lbnRQYXJzZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3Rvcnkgc1NheGZhY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzdWx0IGZyb20gdGhlIFhNTCBwYXJzaW5nLiA8YnIvPgotICAgICAqIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSByb290IFhNTCBlbGVtZW50LiA8YnIvPgotICAgICAqIElmIGFuIFhNTE5TIFVSSSB3YXMgc3BlY2lmaWVkIGFuZCBmb3VuZCwgdGhlIFhNTE5TIHByZWZpeCBpcyByZWNvcmRlZC4gT3RoZXJ3aXNlIGl0IGlzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXN1bHQgewotICAgICAgICBwcml2YXRlIFN0cmluZyBtRWxlbWVudDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVhtbG5zUHJlZml4OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtWG1sbnNVcmk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sbnNQcmVmaXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVhtbG5zUHJlZml4OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFhtbG5zVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1YbWxuc1VyaTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzZXRFbGVtZW50KFN0cmluZyBlbGVtZW50KSB7Ci0gICAgICAgICAgICBtRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc2V0WG1sbnNQcmVmaXgoU3RyaW5nIHhtbG5zUHJlZml4KSB7Ci0gICAgICAgICAgICBtWG1sbnNQcmVmaXggPSB4bWxuc1ByZWZpeDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzZXRYbWxuc1VyaShTdHJpbmcgeG1sbnNVcmkpIHsKLSAgICAgICAgICAgIG1YbWxuc1VyaSA9IHhtbG5zVXJpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3VsdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9zRmlsZW5hbWUgVGhlIGZpbGUgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIHhtbG5zVXJpIEFuIG9wdGlvbmFsIFVSTCBvZiB3aGljaCB3ZSB3YW50IHRvIGtub3cgdGhlIHByZWZpeC4gCi0gICAgICogQHJldHVybiBUaGUgZWxlbWVudCBkZXRhaWxzIGZvdW5kIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IHBhcnNlKFN0cmluZyBvc0ZpbGVuYW1lLCBTdHJpbmcgeG1sbnNVcmkpIHsKLSAgICAgICAgaWYgKHNTYXhmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8ganVzdCBjcmVhdGUgYSBzaW5nbGUgZmFjdG9yeSBpbiBDb21tb25QbHVnaW4gYW5kIHJldXNlIGl0Ci0gICAgICAgICAgICBzU2F4ZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHNTYXhmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICAgICAgaWYgKHhtbG5zVXJpICE9IG51bGwgJiYgeG1sbnNVcmkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0WG1sbnNVcmkoeG1sbnNVcmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBzU2F4ZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIFhtbEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYbWxIYW5kbGVyKHJlc3VsdCk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG9zRmlsZW5hbWUpKSwgaGFuZGxlcik7Ci0KLSAgICAgICAgfSBjYXRjaChSZXN1bHRGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBYTUwgaGFuZGxpbmcgd2FzIGFib3J0ZWQgYmVjYXVzZSB0aGUgcmVxdWlyZWQgZWxlbWVudCB3YXMgZm91bmQuCi0gICAgICAgICAgICAvLyBTaW1wbHkgcmV0dXJuIHRoZSByZXN1bHQuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4gVXNlIHRoZSBzdGF0aWMgcGFyc2UoKSBtZXRob2QgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpcnN0RWxlbWVudFBhcnNlcigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHNwZWNpYWxpemVkIFNBWCBoYW5kbGVyIHRoYXQgY2FwdHVyZXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgdmVyeSBmaXJzdCBlbGVtZW50Ci0gICAgICogKGkuZS4gdGhlIHJvb3QgZWxlbWVudCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3VsdCBtUmVzdWx0OwotCi0gICAgICAgIHB1YmxpYyBYbWxIYW5kbGVyKFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcm9jZXNzZXMgYSBuYW1lc3BhY2UgcHJlZml4IG1hcHBpbmcuCi0gICAgICAgICAqIEkuZS4gZm9yIHhtbG5zOmFuZHJvaWQ9InNvbWUtdXJpIiwgdGhpcyByZWNlaXZlZCBwcmVmaXg9ImFuZHJvaWQiIGFuZCB1cmk9InNvbWUtdXJpIi4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGUgcHJlZml4IGlzIHJlY29yZGVkIGluIHRoZSByZXN1bHQgc3RydWN0dXJlIGlmIHRoZSBVUkkgaXMgdGhlIG9uZSBzZWFyY2hlZCBmb3IuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogVGhpcyBldmVudCBoYXBwZW5zIDxlbT5iZWZvcmU8L2VtPiB0aGUgY29ycmVzcG9uZGluZyBzdGFydEVsZW1lbnQgZXZlbnQuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKG1SZXN1bHQuZ2V0WG1sbnNVcmkoKSkpIHsKLSAgICAgICAgICAgICAgICBtUmVzdWx0LnNldFhtbG5zUHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJvY2Vzc2VzIGEgbmV3IGVsZW1lbnQgc3RhcnQuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogVGhpcyBzaW1wbHkgcmVjb3JkcyB0aGUgZWxlbWVudCBuYW1lIGFuZCBhYm9ydCBwcm9jZXNzaW5nIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgbVJlc3VsdC5zZXRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvSWNvbkZhY3RvcnkuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL0ljb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzczNGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvSWNvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gZ2VuZXJhdGUgaWNvbnMgZm9yIEFuZHJvaWQgRWRpdG9ycy4KLSAqIDxwLz4KLSAqIEljb25zIGFyZSBrZXB0IGhlcmUgYW5kIHJldXNlZC4KLSAqLwotcHVibGljIGNsYXNzIEljb25GYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SX1JFRCAgICAgPSBTV1QuQ09MT1JfREFSS19SRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfR1JFRU4gICA9IFNXVC5DT0xPUl9EQVJLX0dSRUVOOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SX0JMVUUgICAgPSBTV1QuQ09MT1JfREFSS19CTFVFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RFRkFVTFQgPSBTV1QuQ09MT1JfQkxBQ0s7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9DSVJDTEUgID0gJ0MnOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1JFQ1QgICAgPSAnUic7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfREVGQVVMVCA9IFNIQVBFX0NJUkNMRTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJY29uRmFjdG9yeSBzSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4gbUljb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4gbUltYWdlRGVzY01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotICAgIAotICAgIHByaXZhdGUgSWNvbkZhY3RvcnkoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEljb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBJY29uRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIERpc3Bvc2UgaWNvbnMKLSAgICAgICAgZm9yIChJbWFnZSBpY29uIDogbUljb25NYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBtYXAgY2FuIGNvbnRhaW4gbnVsbCB2YWx1ZXMKLSAgICAgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtSWNvbk1hcC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW1hZ2UgZm9yIGEgZ2l2ZW4gaWNvbiBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsZXJzIHNob3VsZCBub3QgZGlzcG9zZSBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3NOYW1lIFRoZSBsZWFmIG5hbWUsIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiwgb2YgYW4gZXhpc3RpbmcgaWNvbiBpbiB0aGUKLSAgICAgKiAgICAgICAgZWRpdG9yJ3MgImljb25zIiBkaXJlY3RvcnkuIElmIGl0IGRvZXNuJ3QgZXhpc3RzLCBhIGRlZmF1bHQgaWNvbiB3aWxsIGJlCi0gICAgICogICAgICAgIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKFN0cmluZyBvc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEljb24ob3NOYW1lLCBDT0xPUl9ERUZBVUxULCBTSEFQRV9ERUZBVUxUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEltYWdlIGZvciBhIGdpdmVuIGljb24gbmFtZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FsbGVycyBzaG91bGQgbm90IGRpc3Bvc2UgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9zTmFtZSBUaGUgbGVhZiBuYW1lLCB3aXRob3V0IHRoZSBleHRlbnNpb24sIG9mIGFuIGV4aXN0aW5nIGljb24gaW4gdGhlCi0gICAgICogICAgICAgIGVkaXRvcidzICJpY29ucyIgZGlyZWN0b3J5LiBJZiBpdCBkb2Vzbid0IGV4aXN0cywgYSBkZWZhdWx0IGljb24gd2lsbCBiZQotICAgICAqICAgICAgICBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gY29sb3IgVGhlIGNvbG9yIG9mIHRoZSB0ZXh0IGluIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpY29ucywKLSAgICAgKiAgICAgICAgb25lIG9mIENPTE9SX0RFRkFVTFQsIENPTE9SX1JFRCwgQ09MT1JfQkxVRSBvciBDT0xPUl9SRUQuCi0gICAgICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgaWNvbiBpbiB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaWNvbnMsCi0gICAgICogICAgICAgIG9uZSBvZiBTSEFQRV9ERUZBVUxULCBTSEFQRV9DSVJDTEUgb3IgU0hBUEVfUkVDVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbihTdHJpbmcgb3NOYW1lLCBpbnQgY29sb3IsIGludCBzaGFwZSkgewotICAgICAgICBTdHJpbmcga2V5ID0gQ2hhcmFjdGVyLnRvU3RyaW5nKChjaGFyKSBzaGFwZSkgKyBJbnRlZ2VyLnRvU3RyaW5nKGNvbG9yKSArIG9zTmFtZTsKLSAgICAgICAgSW1hZ2UgaWNvbiA9IG1JY29uTWFwLmdldChrZXkpOwotICAgICAgICBpZiAoaWNvbiA9PSBudWxsICYmICFtSWNvbk1hcC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBnZXRJbWFnZURlc2NyaXB0b3Iob3NOYW1lLCBjb2xvciwgc2hhcGUpOwotICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uID0gaWQuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBzdG9yZSBudWxsIHJlZmVyZW5jZXMgaW4gdGhlIGljb24gbWFwLCB0byBhdm9pZCBsb29raW5nIHRoZW0KLSAgICAgICAgICAgIC8vIHVwIGV2ZXJ5IHRpbWUuIElmIGl0IGRpZG4ndCBleGlzdCBvbmNlLCBpdCB3aWxsIG5vdCBleGlzdCBsYXRlci4KLSAgICAgICAgICAgIG1JY29uTWFwLnB1dChrZXksIGljb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW1hZ2VEZXNjcmlwdG9yIGZvciBhIGdpdmVuIGljb24gbmFtZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FsbGVycyBzaG91bGQgbm90IGRpc3Bvc2UgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9zTmFtZSBUaGUgbGVhZiBuYW1lLCB3aXRob3V0IHRoZSBleHRlbnNpb24sIG9mIGFuIGV4aXN0aW5nIGljb24gaW4gdGhlCi0gICAgICogICAgICAgIGVkaXRvcidzICJpY29ucyIgZGlyZWN0b3J5LiBJZiBpdCBkb2Vzbid0IGV4aXN0cywgYSBkZWZhdWx0IGljb24gd2lsbCBiZQotICAgICAqICAgICAgICBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgb3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbWFnZURlc2NyaXB0b3Iob3NOYW1lLCBDT0xPUl9ERUZBVUxULCBTSEFQRV9ERUZBVUxUKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJbWFnZURlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gaWNvbiBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsZXJzIHNob3VsZCBub3QgZGlzcG9zZSBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3NOYW1lIFRoZSBsZWFmIG5hbWUsIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiwgb2YgYW4gZXhpc3RpbmcgaWNvbiBpbiB0aGUKLSAgICAgKiAgICAgICAgZWRpdG9yJ3MgImljb25zIiBkaXJlY3RvcnkuIElmIGl0IGRvZXNuJ3QgZXhpc3RzLCBhIGRlZmF1bHQgaWNvbiB3aWxsIGJlCi0gICAgICogICAgICAgIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBjb2xvciBUaGUgY29sb3Igb2YgdGhlIHRleHQgaW4gdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGljb25zLgotICAgICAqICAgICAgICBvbmUgb2YgQ09MT1JfREVGQVVMVCwgQ09MT1JfUkVELCBDT0xPUl9CTFVFIG9yIENPTE9SX1JFRC4KLSAgICAgKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBpY29uIGluIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpY29ucywKLSAgICAgKiAgICAgICAgb25lIG9mIFNIQVBFX0RFRkFVTFQsIFNIQVBFX0NJUkNMRSBvciBTSEFQRV9SRUNULgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBvc05hbWUsIGludCBjb2xvciwgaW50IHNoYXBlKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBDaGFyYWN0ZXIudG9TdHJpbmcoKGNoYXIpIHNoYXBlKSArIEludGVnZXIudG9TdHJpbmcoY29sb3IpICsgb3NOYW1lOwotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBtSW1hZ2VEZXNjTWFwLmdldChrZXkpOwotICAgICAgICBpZiAoaWQgPT0gbnVsbCAmJiAhbUltYWdlRGVzY01hcC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICBpZCA9IEFkdFBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIvaWNvbnMvJTEkcy5wbmciLCBvc05hbWUpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlkID0gbmV3IExldHRlckltYWdlRGVzY3JpcHRvcihvc05hbWUuY2hhckF0KDApLCBjb2xvciwgc2hhcGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2Ugc3RvcmUgbnVsbCByZWZlcmVuY2VzIGluIHRoZSBpY29uIG1hcCwgdG8gYXZvaWQgbG9va2luZyB0aGVtCi0gICAgICAgICAgICAvLyB1cCBldmVyeSB0aW1lLiBJZiBpdCBkaWRuJ3QgZXhpc3Qgb25jZSwgaXQgd2lsbCBub3QgZXhpc3QgbGF0ZXIuCi0gICAgICAgICAgICBtSW1hZ2VEZXNjTWFwLnB1dChrZXksIGlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBzaW1wbGUgaW1hZ2UgZGVzY3JpcHRpb24gdGhhdCBnZW5lcmF0ZXMgYSAxNngxNiBpbWFnZSB3aGljaCBjb25zaXN0cwotICAgICAqIG9mIGEgY29sb3JlZCBsZXR0ZXIgaW5zaWRlIGEgYmxhY2sgJiB3aGl0ZSBjaXJjbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGV0dGVySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNoYXIgbUxldHRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbG9yOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtU2hhcGU7Ci0KLSAgICAgICAgcHVibGljIExldHRlckltYWdlRGVzY3JpcHRvcihjaGFyIGxldHRlciwgaW50IGNvbG9yLCBpbnQgc2hhcGUpIHsKLSAgICAgICAgICAgIG1MZXR0ZXIgPSBsZXR0ZXI7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG1TaGFwZSA9IHNoYXBlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBTWCA9IDE1OwotICAgICAgICAgICAgZmluYWwgaW50IFNZID0gMTU7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgUlggPSA0OwotICAgICAgICAgICAgZmluYWwgaW50IFJZID0gNDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIFNYLCBTWSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGltYWdlLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotICAgICAgICAgICAgZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7Ci0gICAgICAgICAgICBnYy5zZXRBbnRpYWxpYXMoU1dULk9OKTsKLSAgICAgICAgICAgIGdjLnNldFRleHRBbnRpYWxpYXMoU1dULk9OKTsKLQotICAgICAgICAgICAgZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICAgICAgaWYgKG1TaGFwZSA9PSBTSEFQRV9DSVJDTEUpIHsKLSAgICAgICAgICAgICAgICBnYy5maWxsT3ZhbCgwLCAwLCBTWCAtIDEsIFNZIC0gMSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TaGFwZSA9PSBTSEFQRV9SRUNUKSB7Ci0gICAgICAgICAgICAgICAgZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDAsIDAsIFNYIC0gMSwgU1kgLSAxLCBSWCwgUlkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0gICAgICAgICAgICBnYy5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgICAgICAgICBpZiAobVNoYXBlID09IFNIQVBFX0NJUkNMRSkgewotICAgICAgICAgICAgICAgIGdjLmRyYXdPdmFsKDAsIDAsIFNYIC0gMSwgU1kgLSAxKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNoYXBlID09IFNIQVBFX1JFQ1QpIHsKLSAgICAgICAgICAgICAgICBnYy5kcmF3Um91bmRSZWN0YW5nbGUoMCwgMCwgU1ggLSAxLCBTWSAtIDEsIFJYLCBSWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCBhIGJvbGQgdmVyc2lvbiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gZm9udCwgaWYgcG9zc2libGUuCi0gICAgICAgICAgICBGb250IGZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLSAgICAgICAgICAgIEZvbnREYXRhW10gZmRzID0gZm9udC5nZXRGb250RGF0YSgpOwotICAgICAgICAgICAgZmRzWzBdLnNldFN0eWxlKFNXVC5CT0xEKTsKLSAgICAgICAgICAgIC8vIHVzZSAzLzR0aCBvZiB0aGUgY2lyY2xlIGRpYW1ldGVyIGZvciB0aGUgZm9udCBzaXplIChpbiBwaXhlbHMpCi0gICAgICAgICAgICAvLyBhbmQgY29udmVydCBpdCB0byAiZm9udCBwb2ludHMiIChmb250IHBvaW50cyBpbiBTV1QgYXJlIGhhcmRjb2RlZCBpbiBhbgotICAgICAgICAgICAgLy8gYXJiaXRyYXJ5IDcyIGRwaSBhbmQgdGhlbiBjb252ZXJ0ZWQgaW4gcmVhbCBwaXhlbHMgdXNpbmcgd2hhdGV2ZXIgaXMKLSAgICAgICAgICAgIC8vIGluZGljYXRlZCBieSBnZXREUEkgLS0gYXQgbGVhc3QgdGhhdCdzIGhvdyBpdCB3b3JrcyB1bmRlciBXaW4zMikuCi0gICAgICAgICAgICBmZHNbMF0uc2V0SGVpZ2h0KChpbnQpICgoU1kgKyAxKSAqIDMuLzQuICogNzIuL2Rpc3BsYXkuZ2V0RFBJKCkueSkpOwotICAgICAgICAgICAgLy8gTm90ZTogd2luMzIgaW1wbGVtZW50YXRpb24gYWx3YXlzIHVzZXMgZmRzWzBdIHNvIHdlIGNoYW5nZSBqdXN0IHRoYXQgb25lLgotICAgICAgICAgICAgLy8gZ2V0Rm9udERhdGEgaW5kaWNhdGVzIHRoYXQgdGhlIGFycmF5IG9mIGZkIGlzIHJlYWxseSBhbiB1bnVzdWFsIHRoaW5nIGZvciBYMTEuCi0gICAgICAgICAgICBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmRzKTsKLSAgICAgICAgICAgIGdjLnNldEZvbnQoZm9udCk7Ci0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IobUNvbG9yKSk7Ci0KLSAgICAgICAgICAgIC8vIFRleHQgbWVhc3VyZW1lbnQgdmFyaWVzIHNvIHNsaWdodGx5IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgIGludCBvZnggPSAwOwotICAgICAgICAgICAgaW50IG9meSA9IDA7Ci0gICAgICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX1dJTkRPV1MpIHsKLSAgICAgICAgICAgICAgICBvZnggPSArMTsKLSAgICAgICAgICAgICAgICBvZnkgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHMgPSBDaGFyYWN0ZXIudG9TdHJpbmcobUxldHRlcikudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgIFBvaW50IHAgPSBnYy50ZXh0RXh0ZW50KHMpOwotICAgICAgICAgICAgaW50IHR4ID0gKFNYICsgb2Z4IC0gcC54KSAvIDI7Ci0gICAgICAgICAgICBpbnQgdHkgPSAoU1kgKyBvZnkgLSBwLnkpIC8gMjsKLSAgICAgICAgICAgIGdjLmRyYXdUZXh0KHMsIHR4LCB0eSwgdHJ1ZSAvKiBpc1RyYW5zcGFyZW50ICovKTsKLQotICAgICAgICAgICAgZm9udC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEltYWdlRGF0YSBkYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOGEyZjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBkZXNjcmliZXMgYW4gWE1MIGF0dHJpYnV0ZSB3aXRoIGl0cyBYTUwgYXR0cmlidXRlIG5hbWUuCi0gKiA8cC8+Ci0gKiBBbiBhdHRyaWJ1dGUgZGVzY3JpcHRvciBhbHNvIGtub3dzIHdoaWNoIFVJIG5vZGUgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCB0byByZXByZXNlbnQKLSAqIHRoaXMgcGFydGljdWxhciBhdHRyaWJ1dGUgKGUuZy4gdGV4dCBmaWVsZCwgaWNvbiBjaG9vc2VyLCBjbGFzcyBzZWxlY3RvciwgZXRjLikKLSAqIFNvbWUgYXR0cmlidXRlcyBtYXkgYmUgaGlkZGVuIGFuZCBoYXZlIG5vIHVzZXIgaW50ZXJmYWNlIGF0IGFsbC4KLSAqIDxwLz4KLSAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuIERlcml2ZWQgY2xhc3NlcyBtdXN0IGltcGxlbWVudCBkYXRhIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4KLSAqIHRoZSBjb3JyZWN0IFVpQXR0cmlidXRlTm9kZS1kZXJpdmVkIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXR0cmlidXRlRGVzY3JpcHRvciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVhtbExvY2FsTmFtZTsKLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIG1QYXJlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5zVXJpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVwcmVjYXRlZDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfQotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxMb2NhbE5hbWUgVGhlIFhNTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKGNhc2Ugc2Vuc2l0aXZlKQotICAgICAqIEBwYXJhbSBuc1VyaSBUaGUgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuIENhbiBiZSBudWxsIGlmIGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlLgotICAgICAqICAgICAgICAgICAgICBTZWUge0BsaW5rIFNka0NvbnN0YW50cyNOU19SRVNPVVJDRVN9IGZvciBhIGNvbW1vbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgbnNVcmkpIHsKLSAgICAgICAgbVhtbExvY2FsTmFtZSA9IHhtbExvY2FsTmFtZTsKLSAgICAgICAgbU5zVXJpID0gbnNVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgWE1MIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAoY2FzZSBzZW5zaXRpdmUpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRYbWxMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtWG1sTG9jYWxOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsKLSAgICAgICAgcmV0dXJuIG1Oc1VyaTsKLSAgICB9Ci0gICAgCi0gICAgZmluYWwgdm9pZCBzZXRQYXJlbnQoRWxlbWVudERlc2NyaXB0b3IgcGFyZW50KSB7Ci0gICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlcHJlY2F0ZWQoYm9vbGVhbiBpc0RlcHJlY2F0ZWQpIHsKLSAgICAgICAgbURlcHJlY2F0ZWQgPSBpc0RlcHJlY2F0ZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXByZWNhdGVkOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGljb24gZm9yIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogPHAvPgotICAgICAqIEJ5IGRlZmF1bHQgdGhpcyB0cmllcyB0byByZXR1cm4gYW4gaWNvbiBiYXNlZCBvbiB0aGUgWE1MIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBJZiB0aGlzIGZhaWxzLCBpdCB0cmllcyB0byByZXR1cm4gdGhlIGRlZmF1bHQgQW5kcm9pZCBsb2dvIGFzIGRlZmluZWQgaW4gdGhlCi0gICAgICogcGx1Z2luLiBJZiBhbGwgZmFpbHMsIGl0IHJldHVybnMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGljb24gZm9yIHRoaXMgZWxlbWVudCBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotICAgICAgICBJY29uRmFjdG9yeSBmYWN0b3J5ID0gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSW1hZ2UgaWNvbjsKLSAgICAgICAgaWNvbiA9IGZhY3RvcnkuZ2V0SWNvbihnZXRYbWxMb2NhbE5hbWUoKSwgSWNvbkZhY3RvcnkuQ09MT1JfUkVELCBJY29uRmFjdG9yeS5TSEFQRV9DSVJDTEUpOwotICAgICAgICByZXR1cm4gaWNvbiAhPSBudWxsID8gaWNvbiA6IEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdWlQYXJlbnQgVGhlIHtAbGluayBVaUVsZW1lbnROb2RlfSBwYXJlbnQgb2YgdGhpcyBVSSBhdHRyaWJ1dGUuCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yIG9yIG51bGwgaWYgdGhpcwotICAgICAqICAgICAgICAgYXR0cmlidXRlIGhhcyBubyB1c2VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgVWlBdHRyaWJ1dGVOb2RlIGNyZWF0ZVVpTm9kZShVaUVsZW1lbnROb2RlIHVpUGFyZW50KTsKLX0gICAgCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9BdHRyaWJ1dGVEZXNjcmlwdG9yTGFiZWxQcm92aWRlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvQXR0cmlidXRlRGVzY3JpcHRvckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwMzQ0MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9BdHRyaWJ1dGVEZXNjcmlwdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciB7QGxpbmsgVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlfS4KLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZURlc2NyaXB0b3JMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEF0dHJpYnV0ZURlc2NyaXB0b3JMYWJlbFByb3ZpZGVyIHNUaGlzID0KLSAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JMYWJlbFByb3ZpZGVyKCk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJTGFiZWxQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNUaGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVpQWJzdHJhY3RUZXh0QXR0cmlidXRlTm9kZSkgewotICAgICAgICAgICAgVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlIG5vZGUgPSAoVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlKSBlbGVtZW50OwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmlzRGVwcmVjYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBub2RlLmdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSWNvbkZhY3RvcnkgZmFjdG9yeSA9IEljb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldEljb24oIndhcm5pbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVaUFic3RyYWN0VGV4dEF0dHJpYnV0ZU5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFVpQWJzdHJhY3RUZXh0QXR0cmlidXRlTm9kZSllbGVtZW50KS5nZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0Jvb2xlYW5BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9Cb29sZWFuQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGRkNDMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0Jvb2xlYW5BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUxpc3RBdHRyaWJ1dGVOb2RlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIHRleHQgYXR0cmlidXRlIHRoYXQgY2FuIG9ubHkgY29udGFpbiBib29sZWFuIHZhbHVlcy4KLSAqIEl0IGlzIGRpc3BsYXllZCBieSBhIHtAbGluayBVaUxpc3RBdHRyaWJ1dGVOb2RlfS4KLSAqLwotcHVibGljIGNsYXNzIEJvb2xlYW5BdHRyaWJ1dGVEZXNjcmlwdG9yIGV4dGVuZHMgTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3IgewotCi0gICAgcHVibGljIEJvb2xlYW5BdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAidHJ1ZSIsICJmYWxzZSIgfSApOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvRGVzY3JpcHRvcnNVdGlscy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvRGVzY3JpcHRvcnNVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M3MWI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0Rlc2NyaXB0b3JzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LkxheW91dENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRG9jdW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5EZWNsYXJlU3R5bGVhYmxlSW5mby5BdHRyaWJ1dGVJbmZvLkZvcm1hdDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gZGVzY3JpcHRvcnMgaGFuZGxpbmcuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9yc1V0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dJREdFVF9QUkVGSVggPSAid2lkZ2V0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX0JSRUFLX0xFTkdUSCA9IDYwOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhdGggaW4gdGhlIG9ubGluZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWFuaWZlc3QgZGVzY3JpcHRpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgTk9UIGEgY29tcGxldGUgVVJMLiBUbyBiZSB1c2VkLCBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZAotICAgICAqIHRvIHtAbGluayBBbmRyb2lkQ29uc3RhbnRzI0NPREVTSVRFX0JBU0VfVVJMfSBvciB0byB0aGUgbG9jYWwgU0RLCi0gICAgICogZG9jdW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9TREtfVVJMID0gIi9yZWZlcmVuY2UvYW5kcm9pZC9SLnN0eWxlYWJsZS5odG1sIyI7ICAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9LRVkgPSAiaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERSAgPSAiJGNvZGUiOyAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LICA9ICIkbGluayI7ICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU0gID0gIiRlbGVtIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUsgPSAiJGJyZWFrIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJVGV4dEF0dHJpYnV0ZUNyZWF0b3J9IGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBhcHBlbmRBdHRyaWJ1dGUoKSBtZXRob2QKLSAgICAgKiB0byBwcm92aWRlIGEgd2F5IGZvciBjYWxsZXIgdG8gb3ZlcnJpZGUgdGhlIGtpbmQgb2Yge0BsaW5rIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yfQotICAgICAqIGNyZWF0ZWQgZm9yIGEgZ2l2ZSBYTUwgYXR0cmlidXRlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJVGV4dEF0dHJpYnV0ZUNyZWF0b3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3J9IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gWE1MIG5hbWUsCi0gICAgICAgICAqIFVJIG5hbWUgYW5kIHRvb2x0aXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB4bWxOYW1lIFRoZSBYTUwgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAqIEBwYXJhbSB1aU5hbWUgVGhlIFVJIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgKiBAcGFyYW0gbnNVcmkgVGhlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiBDYW4gYmUgbnVsbCBpZiBhdHRyaWJ1dGUgaGFzIG5vIG5hbWVzcGFjZS4KLSAgICAgICAgICogICAgICAgICAgICAgIFNlZSB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30gZm9yIGEgY29tbW9uIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwLgotICAgICAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcn0gKG9yIGRlcml2ZWQpIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgeG1sTmFtZSwgU3RyaW5nIHVpTmFtZSwgU3RyaW5nIG5zVXJpLAotICAgICAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYWxsIHtAbGluayBBdHRyaWJ1dGVJbmZvfSB0byB0aGUgdGhlIGFycmF5IG9mIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBsaXN0IG9mIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSB0byBhcHBlbmQgdG8KLSAgICAgKiBAcGFyYW0gZWxlbWVudFhtbE5hbWUgT3B0aW9uYWwgWE1MIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYXR0cmlidXRlcyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgYmVpbmcgYWRkZWQuIFdoZW4gbm90IG51bGwsIHRoaXMgaXMgdXNlZCB0byBmaWx0ZXIgb3ZlcnJpZGVzLgotICAgICAqIEBwYXJhbSBuc1VyaSBUaGUgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuIENhbiBiZSBudWxsIGlmIGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlLgotICAgICAqICAgICAgICAgICAgICBTZWUge0BsaW5rIFNka0NvbnN0YW50cyNOU19SRVNPVVJDRVN9IGZvciBhIGNvbW1vbiB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gaW5mb3MgVGhlIGFycmF5IG9mIHtAbGluayBBdHRyaWJ1dGVJbmZvfSB0byByZWFkIGFuZCBhcHBlbmQgdG8gYXR0cmlidXRlcwotICAgICAqIEBwYXJhbSByZXF1aXJlZEF0dHJpYnV0ZXMgQW4gb3B0aW9uYWwgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gbWFyayBhcyAicmVxdWlyZWQiIChpLmUuIGFwcGVuZAotICAgICAqICAgICAgICBhICIqIiB0byB0aGVpciBVSSBuYW1lIGFzIGEgaGludCBmb3IgdGhlIHVzZXIuKSBJZiBub3QgbnVsbCwgbXVzdCBjb250YWlucwotICAgICAqICAgICAgICBlbnRyaWVzIGluIHRoZSBmb3JtICJlbGVtLW5hbWUvYXR0ci1uYW1lIi4gRWxlbS1uYW1lIGNhbiBiZSAiKiIuCi0gICAgICogQHBhcmFtIG92ZXJyaWRlcyBBIG1hcCBbYXR0cmlidXRlIG5hbWUgPT4gVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgY3JlYXRvcl0uIEEgY3JlYXRvcgotICAgICAqICAgICAgICBjYW4gZWl0aGVyIGJ5IGEgQ2xhc3M8PyBleHRlbmRzIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yPiBvciBhbiBpbnN0YW5jZSBvZgotICAgICAqICAgICAgICB7QGxpbmsgSVRleHRBdHRyaWJ1dGVDcmVhdG9yfSB0aGF0IGluc3RhbnRpYXRlcyB0aGUgcmlnaHQgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZEF0dHJpYnV0ZXMoQXJyYXlMaXN0PEF0dHJpYnV0ZURlc2NyaXB0b3I+IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudFhtbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbnNVcmksIEF0dHJpYnV0ZUluZm9bXSBpbmZvcywKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHJlcXVpcmVkQXR0cmlidXRlcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb3ZlcnJpZGVzKSB7Ci0gICAgICAgIGZvciAoQXR0cmlidXRlSW5mbyBpbmZvIDogaW5mb3MpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXF1aXJlZEF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyX25hbWUgPSBpbmZvLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKCIqLyIgKyBhdHRyX25hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMuY29udGFpbnMoZWxlbWVudFhtbE5hbWUgKyAiLyIgKyBhdHRyX25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRBdHRyaWJ1dGUoYXR0cmlidXRlcywgZWxlbWVudFhtbE5hbWUsIG5zVXJpLCBpbmZvLCByZXF1aXJlZCwgb3ZlcnJpZGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiB7QGxpbmsgQXR0cmlidXRlSW5mb30gdG8gdGhlIHRoZSBhcnJheSBvZiB7QGxpbmsgQXR0cmlidXRlRGVzY3JpcHRvcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgbGlzdCBvZiB7QGxpbmsgQXR0cmlidXRlRGVzY3JpcHRvcn0gdG8gYXBwZW5kIHRvCi0gICAgICogQHBhcmFtIGVsZW1lbnRYbWxOYW1lIE9wdGlvbmFsIFhNTCBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGF0dHJpYnV0ZXMgYXJlCi0gICAgICogICAgICAgICAgICAgIGJlaW5nIGFkZGVkLiBXaGVuIG5vdCBudWxsLCB0aGlzIGlzIHVzZWQgdG8gZmlsdGVyIG92ZXJyaWRlcy4KLSAgICAgKiBAcGFyYW0gaW5mbyBUaGUge0BsaW5rIEF0dHJpYnV0ZUluZm99IHRvIGFwcGVuZCB0byBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIG5zVXJpIFRoZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gQ2FuIGJlIG51bGwgaWYgYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2UuCi0gICAgICogICAgICAgICAgICAgIFNlZSB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30gZm9yIGEgY29tbW9uIHZhbHVlLgotICAgICAqIEBwYXJhbSByZXF1aXJlZCBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdG8gYmUgbWFya2VkIGFzICJyZXF1aXJlZCIgKGkuZS4gYXBwZW5kCi0gICAgICogICAgICAgIGEgIioiIHRvIGl0cyBVSSBuYW1lIGFzIGEgaGludCBmb3IgdGhlIHVzZXIuKQotICAgICAqIEBwYXJhbSBvdmVycmlkZXMgQSBtYXAgW2F0dHJpYnV0ZSBuYW1lID0+IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIGNyZWF0b3JdLiBBIGNyZWF0b3IKLSAgICAgKiAgICAgICAgY2FuIGVpdGhlciBieSBhIENsYXNzPD8gZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcj4gb3IgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiAgICAgICAge0BsaW5rIElUZXh0QXR0cmlidXRlQ3JlYXRvcn0gdGhhdCBpbnN0YW50aWF0ZXMgdGhlIHJpZ2h0IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRBdHRyaWJ1dGUoQXJyYXlMaXN0PEF0dHJpYnV0ZURlc2NyaXB0b3I+IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudFhtbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICBBdHRyaWJ1dGVJbmZvIGluZm8sIGJvb2xlYW4gcmVxdWlyZWQsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG92ZXJyaWRlcykgewotICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHIgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyB4bWxMb2NhbE5hbWUgPSBpbmZvLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVpTmFtZSA9IHByZXR0eUF0dHJpYnV0ZVVpTmFtZShpbmZvLmdldE5hbWUoKSk7IC8vIHVpX25hbWUKLSAgICAgICAgaWYgKHJlcXVpcmVkKSB7Ci0gICAgICAgICAgICB1aU5hbWUgKz0gIioiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdG9vbHRpcCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyByYXdUb29sdGlwID0gaW5mby5nZXRKYXZhRG9jKCk7Ci0gICAgICAgIGlmIChyYXdUb29sdGlwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJhd1Rvb2x0aXAgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkZXByZWNhdGVkID0gaW5mby5nZXREZXByZWNhdGVkRG9jKCk7Ci0gICAgICAgIGlmIChkZXByZWNhdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyYXdUb29sdGlwLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJhd1Rvb2x0aXAgKz0gIkBAIjsgLy8kTk9OLU5MUy0xJCBpbnNlcnQgYSBicmVhawotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmF3VG9vbHRpcCArPSAiKiBEZXByZWNhdGVkIjsKLSAgICAgICAgICAgIGlmIChkZXByZWNhdGVkLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICByYXdUb29sdGlwICs9ICI6ICIgKyBkZXByZWNhdGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVwcmVjYXRlZC5sZW5ndGgoKSA9PSAwIHx8ICFkZXByZWNhdGVkLmVuZHNXaXRoKCIuIikpIHsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJhd1Rvb2x0aXAgKz0gIi4iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUga25vd24gdHlwZXMgdG8gdGhlIHRvb2x0aXAKLSAgICAgICAgRm9ybWF0W10gZm9ybWF0c19saXN0ID0gaW5mby5nZXRGb3JtYXRzKCk7Ci0gICAgICAgIGludCBmbGVuID0gZm9ybWF0c19saXN0Lmxlbmd0aDsKLSAgICAgICAgaWYgKGZsZW4gPiAwKSB7Ci0gICAgICAgICAgICAvLyBGaWxsIHRoZSBmb3JtYXRzIGluIGEgc2V0IGZvciBmYXN0ZXIgYWNjZXNzCi0gICAgICAgICAgICBIYXNoU2V0PEZvcm1hdD4gZm9ybWF0c19zZXQgPSBuZXcgSGFzaFNldDxGb3JtYXQ+KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaWYgKHJhd1Rvb2x0aXAgIT0gbnVsbCAmJiByYXdUb29sdGlwLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyYXdUb29sdGlwKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkBAIik7ICAgIC8vJE5PTi1OTFMtMSQgIEBAIGluc2VydHMgYSBicmVhayBiZWZvcmUgdGhlIHR5cGVzCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlsiKTsgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsZW47IGkrKykgewotICAgICAgICAgICAgICAgIEZvcm1hdCBmID0gZm9ybWF0c19saXN0W2ldOwotICAgICAgICAgICAgICAgIGZvcm1hdHNfc2V0LmFkZChmKTsKLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCBmbGVuIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgZXh0cmEgc3BhY2UgYXQgdGhlIGVuZCBtYWtlcyB0aGUgdG9vbHRpcCBtb3JlIHJlYWRhYmxlIG9uIFdpbmRvd3MuCi0gICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi5AQCogIik7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQgQEAgaW5zZXJ0cyBhIGJyZWFrLgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVxdWlyZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBleHRyYSBzcGFjZSBhdCB0aGUgZW5kIG1ha2VzIHRoZSB0b29sdGlwIG1vcmUgcmVhZGFibGUgb24gV2luZG93cy4KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIHJhd1Rvb2x0aXAgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgdG9vbHRpcCA9IGZvcm1hdFRvb2x0aXAocmF3VG9vbHRpcCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIHNwZWNpYWxpemVkIGF0dHJpYnV0ZSBpZiB3ZSBjYW4KLSAgICAgICAgICAgIGlmIChvdmVycmlkZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5OiBvdmVycmlkZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50c1tdID0ga2V5LnNwbGl0KCIvIik7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG92ZXJyaWRlQXR0ckxvY2FsTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVBdHRyTG9jYWxOYW1lID0gZWxlbWVudHNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUF0dHJMb2NhbE5hbWUgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gZWxlbWVudHNbMF0uc3BsaXQoIiwiKTsgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlQXR0ckxvY2FsTmFtZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW92ZXJyaWRlQXR0ckxvY2FsTmFtZS5lcXVhbHMoeG1sTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9rX2VsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPCAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW9rX2VsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBlbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmVxdWFscygiKiIpICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtZW50LmVxdWFscyhlbGVtZW50WG1sTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2tfZWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghb2tfZWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb3ZlcnJpZGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGUgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3ZlcnJpZGUgaXMgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZSwgd2hpY2ggbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I+IGNsYXp6ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcj4pIG92ZXJyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcj4gY29uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ucyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzczw/PltdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBjb25zLm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3ZlcnJpZGUgaW5zdGFuY2VvZiBJVGV4dEF0dHJpYnV0ZUNyZWF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSAoKElUZXh0QXR0cmlidXRlQ3JlYXRvcikgb3ZlcnJpZGUpLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy8gaWYgb3ZlcnJpZGVzCi0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIHNwZWNpYWxpemVkIGRlc2NyaXB0b3IgaWYgd2UgY2FuLCBiYXNlZCBvbiB0eXBlCi0gICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdHNfc2V0LmNvbnRhaW5zKEZvcm1hdC5SRUZFUkVOQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZWl0aGVyIGEgbXVsdGktdHlwZSByZWZlcmVuY2Ugb3IgYSBnZW5lcmljIHJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAgICAgYXR0ciA9IG5ldyBSZWZlcmVuY2VBdHRyaWJ1dGVEZXNjcmlwdG9yKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRzX3NldC5jb250YWlucyhGb3JtYXQuRU5VTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0ciA9IG5ldyBMaXN0QXR0cmlidXRlRGVzY3JpcHRvcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRFbnVtVmFsdWVzKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0c19zZXQuY29udGFpbnMoRm9ybWF0LkZMQUcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHIgPSBuZXcgRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IoeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0RmxhZ1ZhbHVlcygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdHNfc2V0LmNvbnRhaW5zKEZvcm1hdC5CT09MRUFOKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyID0gbmV3IEJvb2xlYW5BdHRyaWJ1dGVEZXNjcmlwdG9yKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRzX3NldC5jb250YWlucyhGb3JtYXQuU1RSSU5HKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyID0gbmV3IFJlZmVyZW5jZUF0dHJpYnV0ZURlc2NyaXB0b3IoUmVzb3VyY2VUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnkgZGVmYXVsdCBhIHNpbXBsZSB0ZXh0IGZpZWxkIGlzIHVzZWQKLSAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRvb2x0aXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBmb3JtYXRUb29sdGlwKHJhd1Rvb2x0aXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ciA9IG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgICAgICB9Ci0gICAgICAgIGF0dHIuc2V0RGVwcmVjYXRlZChpbmZvLmdldERlcHJlY2F0ZWREb2MoKSAhPSBudWxsKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoZSB0aGUgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZUluZm99IGFscmVhZHkgZXhpc3RzIGluIHRoZSBBcnJheUxpc3Qgb2YKLSAgICAgKiB7QGxpbmsgQXR0cmlidXRlRGVzY3JpcHRvcn0uIFRoaXMgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgZGVzY3JpcHRvciB3aXRoIHRoZSBzYW1lCi0gICAgICogWE1MIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgbGlzdCBvZiB7QGxpbmsgQXR0cmlidXRlRGVzY3JpcHRvcn0gdG8gY29tcGFyZSB0by4KLSAgICAgKiBAcGFyYW0gbnNVcmkgVGhlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiBDYW4gYmUgbnVsbCBpZiBhdHRyaWJ1dGUgaGFzIG5vIG5hbWVzcGFjZS4KLSAgICAgKiAgICAgICAgICAgICAgU2VlIHtAbGluayBTZGtDb25zdGFudHMjTlNfUkVTT1VSQ0VTfSBmb3IgYSBjb21tb24gdmFsdWUuCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHtAbGluayBBdHRyaWJ1dGVJbmZvfSB0byBrbm93IHdoZXRoZXIgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGFib3ZlIGxpc3QuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMge0BsaW5rIEF0dHJpYnV0ZUluZm99IGlzIGFscmVhZHkgcHJlc2VudCBpbgotICAgICAqICAgICAgICAgdGhlIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZShBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4gYXR0cmlidXRlcywKLSAgICAgICAgICAgIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbykgewotICAgICAgICBTdHJpbmcgeG1sTG9jYWxOYW1lID0gaW5mby5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoQXR0cmlidXRlRGVzY3JpcHRvciBkZXNjIDogYXR0cmlidXRlcykgewotICAgICAgICAgICAgaWYgKGRlc2MuZ2V0WG1sTG9jYWxOYW1lKCkuZXF1YWxzKHhtbExvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobnNVcmkgPT0gZGVzYy5nZXROYW1lc3BhY2VVcmkoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG5zVXJpICE9IG51bGwgJiYgbnNVcmkuZXF1YWxzKGRlc2MuZ2V0TmFtZXNwYWNlVXJpKCkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZXR0eSBhdHRyaWJ1dGUgVUkgbmFtZSBmcm9tIGFuIFhNTCBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgb3JpZ2luYWwgeG1sIG5hbWUgc3RhcnRzIHdpdGggYSBsb3dlciBjYXNlIGFuZCBpcyBjYW1lbC1jYXNlLAotICAgICAqIGUuZy4gIm1heFdpZHRoRm9yVmlldyIuIFRoZSBwcmV0dHkgbmFtZSBzdGFydHMgd2l0aCBhbiB1cHBlciBjYXNlCi0gICAgICogYW5kIGhhcyBzcGFjZSBzZXBhcmF0b3JzLCBlLmcuICJNYXggd2lkdGggZm9yIHZpZXciLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eUF0dHJpYnV0ZVVpTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIC8vIFVzZSB1cHBlciBjYXNlIGluaXRpYWwgbGV0dGVyCi0gICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpKGMgPj0gJ2EnICYmIGMgPD0gJ3onID8gYyArICdBJyAtICdhJyA6IGMpKTsKLSAgICAgICAgaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGMgPSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewotICAgICAgICAgICAgICAgIC8vIEJyZWFrIGNhbWVsIGNhc2UgaW50byBzZXBhcmF0ZSB3b3JkcwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAvLyBVc2UgYSBsb3dlciBjYXNlIGluaXRpYWwgbGV0dGVyIGZvciB0aGUgbmV4dCB3b3JkLCBleGNlcHQgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gd29yZCBpcyBzb2xlbHkgWCwgWSBvciBaLgotICAgICAgICAgICAgICAgIGlmIChjID49ICdYJyAmJiBjIDw9ICdaJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGkgPT0gbGVuLTEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8IGxlbi0xICYmIG5hbWUuY2hhckF0KGkrMSkgPj0gJ0EnICYmIG5hbWUuY2hhckF0KGkrMSkgPD0gJ1onKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKShjIC0gJ0EnICsgJ2EnKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdfJykgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG5hbWUgPSBidWYudG9TdHJpbmcoKTsKLQotICAgICAgICAvLyBSZXBsYWNlIHRoZXNlIGFjcm9ueW1zIGJ5IHVwcGVyLWNhc2UgdmVyc2lvbnMKLSAgICAgICAgLy8gLSAoPzw9XnwgKSBtZWFucyAiaWYgcHJlY2VkZWQgYnkgYSBzcGFjZSBvciBiZWdpbm5pbmcgb2Ygc3RyaW5nIgotICAgICAgICAvLyAtICg/PSR8ICkgIG1lYW5zICJpZiBmb2xsb3dlZCBieSBhIHNwYWNlIG9yIGVuZCBvZiBzdHJpbmciCi0gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIig/PD1efCApc2RrKD89JHwgKSIsICJTREsiKTsKLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiKD88PV58ICl1cmkoPz0kfCApIiwgIlVSSSIpOwotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhcGl0YWxpemVzIHRoZSBzdHJpbmcsIGkuZS4gdHJhbnNmb3JtcyB0aGUgaW5pdGlhbCBbYS16XSBpbnRvIFtBLVpdLgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1bm1vZGlmaWVkIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IFthLXpdLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuCi0gICAgICogQHJldHVybiBUaGUgY2FwaXRhbGl6ZWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPCAxIHx8IHN0ci5jaGFyQXQoMCkgPCAnYScgfHwgc3RyLmNoYXJBdCgwKSA+ICd6JykgewotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzYi5hcHBlbmQoKGNoYXIpKHN0ci5jaGFyQXQoMCkgKyAnQScgLSAnYScpKTsKLSAgICAgICAgc2IuYXBwZW5kKHN0ci5zdWJzdHJpbmcoMSkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBqYXZhZG9jIHRvb2x0aXAgdG8gYmUgdXNhYmxlIGluIGEgdG9vbHRpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRUb29sdGlwKFN0cmluZyBqYXZhZG9jKSB7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNwYW5zID0gc2NhbkphdmFkb2MoamF2YWRvYyk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZEJyZWFrID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgbiA9IHNwYW5zLnNpemUoKSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gc3BhbnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKENPREUuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgcyA9IHNwYW5zLmdldCgrK2kpOwotICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCciJykuYXBwZW5kKHMpLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTElOSy5lcXVhbHMocykpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZSAgID0gc3BhbnMuZ2V0KCsraSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFuY2hvciA9IHNwYW5zLmdldCgrK2kpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ICAgPSBzcGFucy5nZXQoKytpKTsKLQotICAgICAgICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gYW5jaG9yLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyB0ZXh0LCB1c2UgdGhlIGFuY2hvciBpZiB0aGVyZSdzIG9uZQotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBhbmNob3I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCAmJiBiYXNlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBubyB0ZXh0LCB1c2UgdGhlIGJhc2UgYXMgdGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJhc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRUxFTS5lcXVhbHMocykpIHsKLSAgICAgICAgICAgICAgICBzID0gc3BhbnMuZ2V0KCsraSk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChCUkVBSy5lcXVhbHMocykpIHsKLSAgICAgICAgICAgICAgICBuZWVkQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZEJyZWFrICYmIHMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xyJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICBuZWVkQnJlYWsgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIGphdmFkb2MgdG9vbHRpcCB0byBiZSB1c2FibGUgaW4gYSBGb3JtVGV4dC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIGRlc2NyaXB0b3IgY2FuIHByb3ZpZGUgYW4gaWNvbiwgdGhlIGNhbGxlciBzaG91bGQgcHJvdmlkZQotICAgICAqIGVsZW1lbnRzRGVzY3JpcHRvci5nZXRJY29uKCkgYXMgImltYWdlIiB0byBGb3JtVGV4dCwgZS5nLjoKLSAgICAgKiA8Y29kZT5mb3JtVGV4dC5zZXRJbWFnZShJTUFHRV9LRVksIGVsZW1lbnRzRGVzY3JpcHRvci5nZXRJY29uKCkpOzwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXZhZG9jIFRoZSBqYXZhZG9jIHRvIGZvcm1hdC4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGVsZW1lbnREZXNjcmlwdG9yIFRoZSBlbGVtZW50IGRlc2NyaXB0b3IgcGFyZW50IG9mIHRoZSBqYXZhZG9jLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gYW5kcm9pZERvY0Jhc2VVcmwgVGhlIGJhc2UgVVJMIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4gQ2Fubm90IGJlIG51bGwuIFNob3VsZCBiZQotICAgICAqICAgPGNvZGU+RnJhbWV3b3JrUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnRhdGlvbkJhc2VVcmwoKTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRGb3JtVGV4dChTdHJpbmcgamF2YWRvYywKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yLAotICAgICAgICAgICAgU3RyaW5nIGFuZHJvaWREb2NCYXNlVXJsKSB7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNwYW5zID0gc2NhbkphdmFkb2MoamF2YWRvYyk7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxTZGtVcmwgPSBhbmRyb2lkRG9jQmFzZVVybCArIE1BTklGRVNUX1NES19VUkw7Ci0gICAgICAgIFN0cmluZyBzZGtVcmwgPSBlbGVtZW50RGVzY3JpcHRvci5nZXRTZGtVcmwoKTsKLSAgICAgICAgaWYgKHNka1VybCAhPSBudWxsICYmIHNka1VybC5zdGFydHNXaXRoKE1BTklGRVNUX1NES19VUkwpKSB7Ci0gICAgICAgICAgICBmdWxsU2RrVXJsID0gYW5kcm9pZERvY0Jhc2VVcmwgKyBzZGtVcmw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBJbWFnZSBpY29uID0gZWxlbWVudERlc2NyaXB0b3IuZ2V0SWNvbigpOwotICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIjxmb3JtPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCIiICsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSU1BR0VfS0VZICsgIlwiPiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8Zm9ybT48cD4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBuID0gc3BhbnMuc2l6ZSgpLCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBzcGFucy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoQ09ERS5lcXVhbHMocykpIHsKLSAgICAgICAgICAgICAgICBzID0gc3BhbnMuZ2V0KCsraSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnREZXNjcmlwdG9yLmdldFhtbE5hbWUoKS5lcXVhbHMocykgJiYgZnVsbFNka1VybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGEgaHJlZj1cIiIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGZ1bGxTZGtVcmwpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiPiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2E+Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpLmFwcGVuZChzKS5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKExJTksuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2UgICA9IHNwYW5zLmdldCgrK2kpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhbmNob3IgPSBzcGFucy5nZXQoKytpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCAgID0gc3BhbnMuZ2V0KCsraSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvci50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gdGV4dCwgdXNlIHRoZSBhbmNob3IgaWYgdGhlcmUncyBvbmUKLSAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYW5jaG9yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc3BlY2lhbGl6ZSB3aXRoIGEgYmFzZSBVUkwgZm9yIHZpZXdzLCBtZW51cyAmIG90aGVyIHJlc291cmNlcwotICAgICAgICAgICAgICAgIC8vIEJhc2UgaXMgZW1wdHkgZm9yIGEgbG9jYWwgcGFnZSBhbmNob3IsIGluIHdoaWNoIGNhc2Ugd2UnbGwgcmVwbGFjZSBpdAotICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBlbGVtZW50IFNESyBVUkwgaWYgaXQgZXhpc3RzLgotICAgICAgICAgICAgICAgIGlmICgoYmFzZSA9PSBudWxsIHx8IGJhc2UubGVuZ3RoKCkgPT0gMCkgJiYgZnVsbFNka1VybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBmdWxsU2RrVXJsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChiYXNlICE9IG51bGwgJiYgYmFzZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2Uuc3RhcnRzV2l0aCgiaHR0cCIpKSB7ICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYmFzZSBsb29rcyBhbiBVUkwsIHVzZSBpdCwgd2l0aCB0aGUgb3B0aW9uYWwgYW5jaG9yCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBiYXNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvciAhPSBudWxsICYmIGFuY2hvci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYmFzZSBVUkwgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBpdCBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgZmlyc3QuIElmIHRoZXJlJ3Mgbm8gYW5jaG9yLCB3ZSBuZWVkIHRvIGFkZCAiIyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gdXJsLmxhc3RJbmRleE9mKCcjJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICIjIjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zIDwgdXJsLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIHBvcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSBhbmNob3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBubyB0ZXh0LCB1c2UgdGhlIGJhc2UgYXMgdGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJhc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGEgaHJlZj1cIiIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCI+Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRleHQpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvYT4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8Yj4iKS5hcHBlbmQodGV4dCkuYXBwZW5kKCI8L2I+Iik7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEVMRU0uZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgcyA9IHNwYW5zLmdldCgrK2kpOwotICAgICAgICAgICAgICAgIGlmIChzZGtVcmwgIT0gbnVsbCAmJiBzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8YSBocmVmPVwiIik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2RrVXJsKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcIj4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9hPiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxiPiIpLmFwcGVuZChzKS5hcHBlbmQoIjwvYj4iKTsgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJSRUFLLmVxdWFscyhzKSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBsaW5lIGJyZWFrcyBpbiBwc2V1ZG8tSFRNTCByZW5kZXJpbmcKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2xpPjwvZm9ybT4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIjwvcD48L2Zvcm0+Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBzY2FuSmF2YWRvYyhTdHJpbmcgamF2YWRvYykgewotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzcGFucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIC8vIFN0YW5kYXJkaXplIGFsbCB3aGl0ZXNwYWNlIGluIHRoZSBqYXZhZG9jIHRvIHNpbmdsZSBzcGFjZXMuCi0gICAgICAgIGlmIChqYXZhZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmFkb2MgPSBqYXZhZG9jLnJlcGxhY2VBbGwoIlsgXHRcZlxyXG5dKyIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZWN0cyB7QGxpbmsgPGJhc2U+IzxuYW1lPiA8dGV4dD59IHdoZXJlIGFsbCAzIGFyZSBvcHRpb25hbAotICAgICAgICBQYXR0ZXJuIHBfbGluayA9IFBhdHRlcm4uY29tcGlsZSgiXFx7QGxpbmtcXHMrKFteI1xcfVxcc10qKSg/OiMoW15cXHNcXH1dKikpPyg/OlxccyooW15cXH1dKikpP1xcfSguKikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBEZXRlY3RzIDxjb2RlPmJsYWg8L2NvZGU+Ci0gICAgICAgIFBhdHRlcm4gcF9jb2RlID0gUGF0dGVybi5jb21waWxlKCI8Y29kZT4oLis/KTwvY29kZT4oLiopIik7ICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIERldGVjdHMgQGJsYWhALCB1c2VkIGluIGhhcmQtY29kZWQgdG9vbHRpcCBkZXNjcmlwdG9ycwotICAgICAgICBQYXR0ZXJuIHBfZWxlbSA9IFBhdHRlcm4uY29tcGlsZSgiQChbXFx3IC1dKylAKC4qKSIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBEZXRlY3RzIGEgYnVmZmVyIHRoYXQgc3RhcnRzIGJ5IEBAIChyZXF1ZXN0IGZvciBhIGJyZWFrKQotICAgICAgICBQYXR0ZXJuIHBfYnJlYWsgPSBQYXR0ZXJuLmNvbXBpbGUoIkBAKC4qKSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBEZXRlY3RzIGEgYnVmZmVyIHRoYXQgc3RhcnRzIGJ5IEAgPCBvciB7IChvbmUgdGhhdCB3YXMgbm90IG1hdGNoZWQgYWJvdmUpCi0gICAgICAgIFBhdHRlcm4gcF9vcGVuID0gUGF0dGVybi5jb21waWxlKCIoW0A8XFx7XSkoLiopIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIERldGVjdHMgZXZlcnl0aGluZyB0aWxsIHRoZSBuZXh0IHBvdGVudGlhbCBzZXBhcmF0b3IsIGkuZS4gQCA8IG9yIHsKLSAgICAgICAgUGF0dGVybiBwX3RleHQgPSBQYXR0ZXJuLmNvbXBpbGUoIihbXkA8XFx7XSspKC4qKSIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpbnQgY3VycmVudExlbmd0aCA9IDA7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKLQotICAgICAgICB3aGlsZShqYXZhZG9jICE9IG51bGwgJiYgamF2YWRvYy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbTsKLSAgICAgICAgICAgIFN0cmluZyBzID0gbnVsbDsKLSAgICAgICAgICAgIGlmICgobSA9IHBfY29kZS5tYXRjaGVyKGphdmFkb2MpKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBzcGFucy5hZGQoQ09ERSk7Ci0gICAgICAgICAgICAgICAgc3BhbnMuYWRkKHRleHQgPSBjbGVhbnVwSmF2YWRvY0h0bWwobS5ncm91cCgxKSkpOyAvLyA8Y29kZT4gdGV4dAotICAgICAgICAgICAgICAgIGphdmFkb2MgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExlbmd0aCArPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG0gPSBwX2xpbmsubWF0Y2hlcihqYXZhZG9jKSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgc3BhbnMuYWRkKExJTkspOwotICAgICAgICAgICAgICAgIHNwYW5zLmFkZChtLmdyb3VwKDEpKTsgLy8gQGxpbmsgYmFzZQotICAgICAgICAgICAgICAgIHNwYW5zLmFkZChtLmdyb3VwKDIpKTsgLy8gQGxpbmsgYW5jaG9yCi0gICAgICAgICAgICAgICAgc3BhbnMuYWRkKHRleHQgPSBjbGVhbnVwSmF2YWRvY0h0bWwobS5ncm91cCgzKSkpOyAvLyBAbGluayB0ZXh0Ci0gICAgICAgICAgICAgICAgamF2YWRvYyA9IG0uZ3JvdXAoNCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoICs9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgobSA9IHBfZWxlbS5tYXRjaGVyKGphdmFkb2MpKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBzcGFucy5hZGQoRUxFTSk7Ci0gICAgICAgICAgICAgICAgc3BhbnMuYWRkKHRleHQgPSBjbGVhbnVwSmF2YWRvY0h0bWwobS5ncm91cCgxKSkpOyAvLyBAdGV4dEAKLSAgICAgICAgICAgICAgICBqYXZhZG9jID0gbS5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZW5ndGggKz0gdGV4dC5sZW5ndGgoKSAtIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgobSA9IHBfYnJlYWsubWF0Y2hlcihqYXZhZG9jKSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgc3BhbnMuYWRkKEJSRUFLKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBqYXZhZG9jID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG0gPSBwX29wZW4ubWF0Y2hlcihqYXZhZG9jKSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcyA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgamF2YWRvYyA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtID0gcF90ZXh0Lm1hdGNoZXIoamF2YWRvYykpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHMgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIGphdmFkb2MgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4uIEluIGNhc2Ugb2YsIGp1c3QgdXNlIGV2ZXJ5dGhpbmcuCi0gICAgICAgICAgICAgICAgcyA9IGphdmFkb2M7Ci0gICAgICAgICAgICAgICAgamF2YWRvYyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcyA9IGNsZWFudXBKYXZhZG9jSHRtbChzKTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGVuZ3RoID49IEpBVkFET0NfQlJFQUtfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5zLmFkZChCUkVBSyk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudExlbmd0aCArIHMubGVuZ3RoKCkgPiBKQVZBRE9DX0JSRUFLX0xFTkdUSCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gcy5pbmRleE9mKCcgJywgSkFWQURPQ19CUkVBS19MRU5HVEggLSBjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcGFucy5hZGQocy5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBzcGFucy5hZGQoQlJFQUspOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwYW5zLmFkZChzKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoICs9IHMubGVuZ3RoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3BhbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBIVE1MIGZyb20gYSBqYXZhZG9jIHNuaXBwZXQsIGFzIGl0IGlzIHN1cHBvcnRlZAotICAgICAqIG5laXRoZXIgYnkgRm9ybVRleHQgbm9yIGEgc3RhbmRhcmQgdGV4dCB0b29sdGlwLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjbGVhbnVwSmF2YWRvY0h0bWwoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiJmx0OyIsICJcIiIpOyAgICAgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiJmd0OyIsICJcIiIpOyAgICAgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiPFtePl0rPiIsICIiKTsgICAgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGF0dHJpYnV0ZXMgZm9yIHRoZSBhIG5ldyBVaUVsZW1lbnROb2RlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgaWRlYWxseSB0aGUgbm9kZSBzaG91bGQgYWxyZWFkeSBiZSBwYXJ0IG9mIGEgaGllcmFyY2h5IHNvIHRoYXQgaXRzCi0gICAgICogcGFyZW50IGxheW91dCBhbmQgcHJldmlvdXMgc2libGluZyBjYW4gYmUgZGV0ZXJtaW5lZCwgaWYgYW55LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRvZXMgbm90IG92ZXJyaWRlIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIG5vdCBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdExheW91dEF0dHJpYnV0ZXMoVWlFbGVtZW50Tm9kZSB1aV9ub2RlLCBib29sZWFuIHVwZGF0ZUxheW91dCkgewotICAgICAgICAvLyBpZiB0aGlzIHVpX25vZGUgaXMgYSBsYXlvdXQgYW5kIHdlJ3JlIGFkZGluZyBpdCB0byBhIGRvY3VtZW50LCB1c2UgZmlsbF9wYXJlbnQgZm9yCi0gICAgICAgIC8vIGJvdGggVy9ILiBPdGhlcndpc2UgZGVmYXVsdCB0byB3cmFwX2xheW91dC4KLSAgICAgICAgYm9vbGVhbiBmaWxsID0gdWlfbm9kZS5nZXREZXNjcmlwdG9yKCkuaGFzQ2hpbGRyZW4oKSAmJgotICAgICAgICAgICAgICAgICAgICAgICB1aV9ub2RlLmdldFVpUGFyZW50KCkgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZTsKLSAgICAgICAgdWlfbm9kZS5zZXRBdHRyaWJ1dGVWYWx1ZShMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfV0lEVEgsCi0gICAgICAgICAgICAgICAgZmlsbCA/IExheW91dENvbnN0YW50cy5WQUxVRV9GSUxMX1BBUkVOVCA6IExheW91dENvbnN0YW50cy5WQUxVRV9XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogb3ZlcnJpZGUgKi8pOwotICAgICAgICB1aV9ub2RlLnNldEF0dHJpYnV0ZVZhbHVlKExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9IRUlHSFQsCi0gICAgICAgICAgICAgICAgZmlsbCA/IExheW91dENvbnN0YW50cy5WQUxVRV9GSUxMX1BBUkVOVCA6IExheW91dENvbnN0YW50cy5WQUxVRV9XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogb3ZlcnJpZGUgKi8pOwotCi0gICAgICAgIFN0cmluZyB3aWRnZXRfaWQgPSBnZXRGcmVlV2lkZ2V0SWQodWlfbm9kZSk7Ci0gICAgICAgIGlmICh3aWRnZXRfaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdWlfbm9kZS5zZXRBdHRyaWJ1dGVWYWx1ZShMYXlvdXRDb25zdGFudHMuQVRUUl9JRCwgd2lkZ2V0X2lkLCBmYWxzZSAvKiBvdmVycmlkZSAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aV9ub2RlLnNldEF0dHJpYnV0ZVZhbHVlKExheW91dENvbnN0YW50cy5BVFRSX1RFWFQsIHdpZGdldF9pZCwgZmFsc2UgLypvdmVycmlkZSovKTsKLQotICAgICAgICBpZiAodXBkYXRlTGF5b3V0KSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpX3BhcmVudCA9IHVpX25vZGUuZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmICh1aV9wYXJlbnQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICB1aV9wYXJlbnQuZ2V0RGVzY3JpcHRvcigpLmdldFhtbExvY2FsTmFtZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRDb25zdGFudHMuUkVMQVRJVkVfTEFZT1VUKSkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlfcHJldmlvdXMgPSB1aV9ub2RlLmdldFVpUHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVpX3ByZXZpb3VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gdWlfcHJldmlvdXMuZ2V0QXR0cmlidXRlVmFsdWUoTGF5b3V0Q29uc3RhbnRzLkFUVFJfSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaWQucmVwbGFjZSgiQCsiLCAiQCIpOyAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgdWlfbm9kZS5zZXRBdHRyaWJ1dGVWYWx1ZShMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfQkVMT1csIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBvdmVycmlkZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIFVJIHJvb3Qgbm9kZSwgcmV0dXJucyB0aGUgZmlyc3QgYXZhaWxhYmxlIGlkIHRoYXQgbWF0Y2hlcyB0aGUKLSAgICAgKiBwYXR0ZXJuICJwcmVmaXglMDJkIi4KLSAgICAgKiA8cC8+VGFiV2lkZ2V0IGlzIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGUgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiAiQGFuZHJvaWQ6aWQvdGFicyIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlOb2RlIFRoZSBVSSBub2RlIHRoYXQgZ2l2ZXMgdGhlIHByZWZpeCB0byBtYXRjaC4KLSAgICAgKiBAcmV0dXJuIEEgc3VpdGFibGUgZ2VuZXJhdGVkIGlkIGluIHRoZSBhdHRyaWJ1dGUgZm9ybSBuZWVkZWQgYnkgdGhlIFhNTCBpZCB0YWcKLSAgICAgKiAoZS5nLiAiQCtpZC9zb21ldGhpbmciKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZyZWVXaWRnZXRJZChVaUVsZW1lbnROb2RlIHVpTm9kZSkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHVpTm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTG9jYWxOYW1lKCk7Ci0gICAgICAgIGlmICgiVGFiV2lkZ2V0Ii5lcXVhbHMobmFtZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gIkBhbmRyb2lkOmlkL3RhYnMiOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIkAraWQvIiArIGdldEZyZWVXaWRnZXRJZCh1aU5vZGUuZ2V0VWlSb290KCksICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG5hbWUsIG51bGwsIG51bGwsIG51bGwgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBVSSByb290IG5vZGUsIHJldHVybnMgdGhlIGZpcnN0IGF2YWlsYWJsZSBpZCB0aGF0IG1hdGNoZXMgdGhlCi0gICAgICogcGF0dGVybiAicHJlZml4JTAyZCIuCi0gICAgICoKLSAgICAgKiBGb3IgcmVjdXJzaW9uIHB1cnBvc2VzLCBhICJjb250ZXh0IiBpcyBnaXZlbi4gU2luY2UgSmF2YSBkb2Vzbid0IGhhdmUgaW4tb3V0IHBhcmFtZXRlcnMKLSAgICAgKiBpbiBtZXRob2RzIGFuZCB3ZSdyZSBub3QgZ29pbmcgdG8gZG8gYSBkZWRpY2F0ZWQgdHlwZSwgd2UganVzdCB1c2UgYW4gb2JqZWN0IGFycmF5IHdoaWNoCi0gICAgICogbXVzdCBjb250YWluIG9uZSBpbml0aWFsIGl0ZW0gYW5kIHNldmVyYWwgYXJlIGJ1aWx0IG9uIHRoZSBmbHkganVzdCBmb3IgaW50ZXJuYWwgc3RvcmFnZToKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPiBwcmVmaXgoU3RyaW5nKTogVGhlIHByZWZpeCBvZiB0aGUgZ2VuZXJhdGVkIGlkLCBpLmUuICJ3aWRnZXQiLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiA8bGk+IGluZGV4KEludGVnZXIpOiBUaGUgbWluaW11bSBpbmRleCBvZiB0aGUgZ2VuZXJhdGVkIGlkLiBNdXN0IHN0YXJ0IHdpdGggbnVsbC4KLSAgICAgKiA8bGk+IGdlbmVyYXRlZChTdHJpbmcpOiBUaGUgZ2VuZXJhdGVkIHdpZGdldCBjdXJyZW50bHkgYmVpbmcgc2VhcmNoZWQuIE11c3Qgc3RhcnQgd2l0aCBudWxsLgotICAgICAqIDxsaT4gbWFwKFNldDxTdHJpbmc+KTogQSBzZXQgb2YgdGhlIGlkcyBjb2xsZWN0ZWQgc28gZmFyIHdoZW4gd2Fsa2luZyB0aHJvdWdoIHRoZSB3aWRnZXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gTXVzdCBzdGFydCB3aXRoIG51bGwuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1aVJvb3QgVGhlIFVpIHJvb3Qgbm9kZSB3aGVyZSB0byBzdGFydCBzZWFyY2hpbmcgcmVjdXJzaXZlbHkuIEZvciB0aGUgaW5pdGlhbCBjYWxsCi0gICAgICogICAgICAgICAgICAgICB5b3Ugd2FudCB0byBwYXNzIHRoZSBkb2N1bWVudCByb290LgotICAgICAqIEBwYXJhbSBwYXJhbXMgQW4gaW4tb3V0IGNvbnRleHQgb2YgcGFyYW1ldGVycyB1c2VkIGR1cmluZyByZWN1cnNpb24sIGFzIGV4cGxhaW5lZCBhYm92ZS4KLSAgICAgKiBAcmV0dXJuIEEgc3VpdGFibGUgZ2VuZXJhdGVkIGlkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZyZWVXaWRnZXRJZChVaUVsZW1lbnROb2RlIHVpUm9vdCwKLSAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcykgewotCi0gICAgICAgIFNldDxTdHJpbmc+IG1hcCA9IChTZXQ8U3RyaW5nPilwYXJhbXNbM107Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1zWzNdID0gbWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG51bSA9IHBhcmFtc1sxXSA9PSBudWxsID8gMCA6ICgoSW50ZWdlcilwYXJhbXNbMV0pLmludFZhbHVlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGdlbmVyYXRlZCA9IChTdHJpbmcpIHBhcmFtc1syXTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHBhcmFtc1swXTsKLSAgICAgICAgaWYgKGdlbmVyYXRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gcHJlZml4LmluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChwb3MgPj0gMCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgPSBwcmVmaXguaW5kZXhPZignJCcpOwotICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZyhwb3MgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlQWxsKCJbXmEtekEtWl0iLCAiIik7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IERFRkFVTFRfV0lER0VUX1BSRUZJWDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG51bSsrOwotICAgICAgICAgICAgICAgIGdlbmVyYXRlZCA9IFN0cmluZy5mb3JtYXQoIiUxJHMlMiQwMmQiLCBwcmVmaXgsIG51bSk7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSB3aGlsZSAobWFwLmNvbnRhaW5zKGdlbmVyYXRlZCkpOwotCi0gICAgICAgICAgICBwYXJhbXNbMF0gPSBwcmVmaXg7Ci0gICAgICAgICAgICBwYXJhbXNbMV0gPSBudW07Ci0gICAgICAgICAgICBwYXJhbXNbMl0gPSBnZW5lcmF0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaWQgPSB1aVJvb3QuZ2V0QXR0cmlidXRlVmFsdWUoTGF5b3V0Q29uc3RhbnRzLkFUVFJfSUQpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWQgPSBpZC5yZXBsYWNlKCJAK2lkLyIsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICAgICAgaWQgPSBpZC5yZXBsYWNlKCJAaWQvIiwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICAgICAgaWYgKG1hcC5hZGQoaWQpICYmIG1hcC5jb250YWlucyhnZW5lcmF0ZWQpKSB7Ci0KLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIG51bSsrOwotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgPSBTdHJpbmcuZm9ybWF0KCIlMSRzJTIkMDJkIiwgcHJlZml4LCBudW0pOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXAuY29udGFpbnMoZ2VuZXJhdGVkKSk7Ci0KLSAgICAgICAgICAgICAgICBwYXJhbXNbMV0gPSBudW07Ci0gICAgICAgICAgICAgICAgcGFyYW1zWzJdID0gZ2VuZXJhdGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpQ2hpbGQgOiB1aVJvb3QuZ2V0VWlDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBnZXRGcmVlV2lkZ2V0SWQodWlDaGlsZCwgcGFyYW1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGU6IHJldHVybiBwYXJhbXNbMl0gKG5vdCAiZ2VuZXJhdGVkIikgc2luY2UgaXQgY291bGQgaGF2ZSBjaGFuZ2VkIGR1cmluZyByZWN1cnNpb24uCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBwYXJhbXNbMl07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9Eb2N1bWVudERlc2NyaXB0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0RvY3VtZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA5ZDk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0RvY3VtZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi0vKioKLSAqIHtAbGluayBEb2N1bWVudERlc2NyaXB0b3J9IGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBleHBlY3RlZCBmb3IgYW4gWE1MIGRvY3VtZW50IG5vZGUuCi0gKiAKLSAqIENvbXBhcmVkIHRvIEVsZW1lbnREZXNjcmlwdG9yLCB7QGxpbmsgRG9jdW1lbnREZXNjcmlwdG9yfSBkb2VzIG5vdCBoYXZlIFhNTCBuYW1lIG5vciBVSSBuYW1lLAotICogdG9vbHRpcCwgU0RLIHVybCBhbmQgYXR0cmlidXRlcyBsaXN0LgotICogPHAvPgotICogSXQgaGFzIGEgY2hpbGRyZW4gbGlzdCB3aGljaCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSByb290cyBvZiB0aGUgZG9jdW1lbnQuCi0gKiA8cC8+Ci0gKiBUaGUgZG9jdW1lbnQgbm9kZXMgYXJlICJtYW5kYXRvcnkiLCBtZWFuaW5nIHRoZSBVSSBub2RlIGlzIG5ldmVyIGRlbGV0ZWQgYW5kIGl0IG1heSBsYWNrCi0gKiBhbiBhY3R1YWwgWE1MIG5vZGUgYXR0YWNoZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudERlc2NyaXB0b3IgZXh0ZW5kcyBFbGVtZW50RGVzY3JpcHRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBEb2N1bWVudERlc2NyaXB0b3J9IGJhc2VkIG9uIGl0cyBYTUwgbmFtZSBhbmQgY2hpbGRyZW4gbGlzdC4KLSAgICAgKiBUaGUgVUkgbmFtZSBpcyBidWlsZCBieSBjYXBpdGFsaXppbmcgdGhlIFhNTCBuYW1lLgotICAgICAqIFRoZSBVSSBub2RlcyB3aWxsIGJlIG5vbi1tYW5kYXRvcnkuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBYTUwgbmFtZSBpcyBuZXZlciBzaG93biBpbiB0aGUgVUkgZGlyZWN0bHkuIEl0IGlzIGhvd2V2ZXIgdXNlZCB3aGVuIGFuIGljb24KLSAgICAgKiBuZWVkcyB0byBiZSBmb3VuZCBmb3IgdGhlIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREZXNjcmlwdG9yKFN0cmluZyB4bWxfbmFtZSwgRWxlbWVudERlc2NyaXB0b3JbXSBjaGlsZHJlbikgewotICAgICAgICBzdXBlcih4bWxfbmFtZSwgY2hpbGRyZW4sIHRydWUgLyogbWFuZGF0b3J5ICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBVaUVsZW1lbnROb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUVsZW1lbnROb2RlIGNyZWF0ZVVpTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaURvY3VtZW50Tm9kZSh0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9FbGVtZW50RGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvRWxlbWVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzNTI0MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9FbGVtZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICoge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgZXhwZWN0ZWQgZm9yIGEgZ2l2ZW4gWE1MIGVsZW1lbnQgbm9kZS4KLSAqIAotICoge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBoYXZlIGFuIFhNTCBuYW1lLCBVSSBuYW1lLCBhIHRvb2x0aXAsIGFuIFNESyB1cmwsCi0gKiBhbiBhdHRyaWJ1dGVzIGxpc3QgYW5kIGEgY2hpbGRyZW4gbGlzdC4KLSAqIAotICogQW4gVUkgbm9kZSBjYW4gYmUgIm1hbmRhdG9yeSIsIG1lYW5pbmcgdGhlIFVJIG5vZGUgaXMgbmV2ZXIgZGVsZXRlZCBhbmQgaXQgbWF5IGxhY2sKLSAqIGFuIGFjdHVhbCBYTUwgbm9kZSBhdHRhY2hlZC4gQSBub24tbWFuZGF0b3J5IFVJIG5vZGUgTVVTVCBoYXZlIGFuIFhNTCBub2RlIGF0dGFjaGVkCi0gKiBhbmQgaXQgd2lsbCBjZWFzZSB0byBleGlzdCB3aGVuIHRoZSBYTUwgbm9kZSBjZWFzZXMgdG8gZXhpc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVzY3JpcHRvciB7Ci0gICAgLyoqIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1YbWxOYW1lOwotICAgIC8qKiBUaGUgWE1MIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLCB0eXBpY2FsbHkgY2FwaXRhbGl6ZWQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVVpTmFtZTsKLSAgICAvKiogVGhlIGxpc3Qgb2YgYWxsb3dlZCBhdHRyaWJ1dGVzLiAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlRGVzY3JpcHRvcltdIG1BdHRyaWJ1dGVzOwotICAgIC8qKiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvcltdIG1DaGlsZHJlbjsKLSAgICAvKiBBbiBvcHRpb25hbCB0b29sdGlwLiBDYW4gYmUgZW1wdHkuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRvb2x0aXA7Ci0gICAgLyoqIEFuIG9wdGlvbmFsIFNLRCBVUkwuIENhbiBiZSBlbXB0eS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtU2RrVXJsOwotICAgIC8qKiBXaGV0aGVyIHRoaXMgVUkgbm9kZSBtdXN0IGFsd2F5cyBleGlzdCAoZXZlbiBmb3IgZW1wdHkgbW9kZWxzKS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU1hbmRhdG9yeTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBiYXNlZCBvbiBpdHMgWE1MIG5hbWUsIFVJIG5hbWUsCi0gICAgICogdG9vbHRpcCwgU0RLIHVybCwgYXR0cmlidXRlcyBsaXN0LCBjaGlsZHJlbiBsaXN0IGFuZCBtYW5kYXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSB1aV9uYW1lIFRoZSBYTUwgZWxlbWVudCBuYW1lIGZvciB0aGUgdXNlciBpbnRlcmZhY2UsIHR5cGljYWxseSBjYXBpdGFsaXplZC4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gc2RrX3VybCBBbiBvcHRpb25hbCBTS0QgVVJMLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgbGlzdCBvZiBhbGxvd2VkIGF0dHJpYnV0ZXMuIENhbiBiZSBudWxsIG9yIGVtcHR5LgotICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gbWFuZGF0b3J5IFdoZXRoZXIgdGhpcyBub2RlIG11c3QgYWx3YXlzIGV4aXN0IChldmVuIGZvciBlbXB0eSBtb2RlbHMpLiBBIG1hbmRhdG9yeQotICAgICAqICBVSSBub2RlIGlzIG5ldmVyIGRlbGV0ZWQgYW5kIGl0IG1heSBsYWNrIGFuIGFjdHVhbCBYTUwgbm9kZSBhdHRhY2hlZC4gQSBub24tbWFuZGF0b3J5Ci0gICAgICogIFVJIG5vZGUgTVVTVCBoYXZlIGFuIFhNTCBub2RlIGF0dGFjaGVkIGFuZCBpdCB3aWxsIGNlYXNlIHRvIGV4aXN0IHdoZW4gdGhlIFhNTCBub2RlCi0gICAgICogIGNlYXNlcyB0byBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lLCBTdHJpbmcgdWlfbmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBzZGtfdXJsLAotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuLAotICAgICAgICAgICAgYm9vbGVhbiBtYW5kYXRvcnkpIHsKLSAgICAgICAgbU1hbmRhdG9yeSA9IG1hbmRhdG9yeTsKLSAgICAgICAgbVhtbE5hbWUgPSB4bWxfbmFtZTsKLSAgICAgICAgbVVpTmFtZSA9IHVpX25hbWU7Ci0gICAgICAgIG1Ub29sdGlwID0gKHRvb2x0aXAgIT0gbnVsbCAmJiB0b29sdGlwLmxlbmd0aCgpID4gMCkgPyB0b29sdGlwIDogbnVsbDsKLSAgICAgICAgbVNka1VybCA9IChzZGtfdXJsICE9IG51bGwgJiYgc2RrX3VybC5sZW5ndGgoKSA+IDApID8gc2RrX3VybCA6IG51bGw7Ci0gICAgICAgIHNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyAhPSBudWxsID8gYXR0cmlidXRlcyA6IG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW117fSk7Ci0gICAgICAgIG1DaGlsZHJlbiA9IGNoaWxkcmVuICE9IG51bGwgPyBjaGlsZHJlbiA6IG5ldyBFbGVtZW50RGVzY3JpcHRvcltde307Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGJhc2VkIG9uIGl0cyBYTUwgbmFtZSBhbmQgY2hpbGRyZW4gbGlzdC4KLSAgICAgKiBUaGUgVUkgbmFtZSBpcyBidWlsZCBieSBjYXBpdGFsaXppbmcgdGhlIFhNTCBuYW1lLgotICAgICAqIFRoZSBVSSBub2RlcyB3aWxsIGJlIG5vbi1tYW5kYXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gbWFuZGF0b3J5IFdoZXRoZXIgdGhpcyBub2RlIG11c3QgYWx3YXlzIGV4aXN0IChldmVuIGZvciBlbXB0eSBtb2RlbHMpLiBBIG1hbmRhdG9yeQotICAgICAqICBVSSBub2RlIGlzIG5ldmVyIGRlbGV0ZWQgYW5kIGl0IG1heSBsYWNrIGFuIGFjdHVhbCBYTUwgbm9kZSBhdHRhY2hlZC4gQSBub24tbWFuZGF0b3J5Ci0gICAgICogIFVJIG5vZGUgTVVTVCBoYXZlIGFuIFhNTCBub2RlIGF0dGFjaGVkIGFuZCBpdCB3aWxsIGNlYXNlIHRvIGV4aXN0IHdoZW4gdGhlIFhNTCBub2RlCi0gICAgICogIGNlYXNlcyB0byBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lLCBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuLCBib29sZWFuIG1hbmRhdG9yeSkgewotICAgICAgICB0aGlzKHhtbF9uYW1lLCBwcmV0dHlOYW1lKHhtbF9uYW1lKSwgbnVsbCwgbnVsbCwgbnVsbCwgY2hpbGRyZW4sIG1hbmRhdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGJhc2VkIG9uIGl0cyBYTUwgbmFtZSBhbmQgY2hpbGRyZW4gbGlzdC4KLSAgICAgKiBUaGUgVUkgbmFtZSBpcyBidWlsZCBieSBjYXBpdGFsaXppbmcgdGhlIFhNTCBuYW1lLgotICAgICAqIFRoZSBVSSBub2RlcyB3aWxsIGJlIG5vbi1tYW5kYXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lLCBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuKSB7Ci0gICAgICAgIHRoaXMoeG1sX25hbWUsIHByZXR0eU5hbWUoeG1sX25hbWUpLCBudWxsLCBudWxsLCBudWxsLCBjaGlsZHJlbiwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBiYXNlZCBvbiBpdHMgWE1MIG5hbWUuCi0gICAgICogVGhlIFVJIG5hbWUgaXMgYnVpbGQgYnkgY2FwaXRhbGl6aW5nIHRoZSBYTUwgbmFtZS4KLSAgICAgKiBUaGUgVUkgbm9kZXMgd2lsbCBiZSBub24tbWFuZGF0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lLiBDYXNlIHNlbnNpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lKSB7Ci0gICAgICAgIHRoaXMoeG1sX25hbWUsIHByZXR0eU5hbWUoeG1sX25hbWUpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgbXVzdCBhbHdheXMgZXhpc3QgKGV2ZW4gZm9yIGVtcHR5IG1vZGVscykgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hbmRhdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5kYXRvcnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFhNTCBlbGVtZW50IG5vZGUgbG9jYWwgbmFtZSAoY2FzZSBzZW5zaXRpdmUpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRYbWxMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGludCBwb3MgPSBtWG1sTmFtZS5pbmRleE9mKCc6Jyk7IAotICAgICAgICBpZiAocG9zICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVhtbE5hbWUuc3Vic3RyaW5nKHBvcysxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVhtbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIFhNTCBlbGVtZW50IG5vZGUgbmFtZS4gQ2FzZSBzZW5zaXRpdmUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxOYW1lKCkgewotICAgICAgICByZXR1cm4gbVhtbE5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICAvLyBGb3Igbm93IHdlIGhhcmQtY29kZSB0aGUgcHJlZml4IGFzIGJlaW5nICJhbmRyb2lkIgotICAgICAgICBpZiAobVhtbE5hbWUuc3RhcnRzV2l0aCgiYW5kcm9pZDoiKSkgeyAvLyROT04tTkxzLTEkCi0gICAgICAgICAgICByZXR1cm4gU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxzLTEkCi0gICAgfQotCi0KLSAgICAvKiogUmV0dXJucyB0aGUgWE1MIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLCB0eXBpY2FsbHkgY2FwaXRhbGl6ZWQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVaU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVWlOYW1lOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGljb24gZm9yIHRoZSBlbGVtZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBCeSBkZWZhdWx0IHRoaXMgdHJpZXMgdG8gcmV0dXJuIGFuIGljb24gYmFzZWQgb24gdGhlIFhNTCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAqIElmIHRoaXMgZmFpbHMsIGl0IHRyaWVzIHRvIHJldHVybiB0aGUgZGVmYXVsdCBBbmRyb2lkIGxvZ28gYXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiBwbHVnaW4uIElmIGFsbCBmYWlscywgaXQgcmV0dXJucyBudWxsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaWNvbiBmb3IgdGhpcyBlbGVtZW50IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0gICAgICAgIEljb25GYWN0b3J5IGZhY3RvcnkgPSBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICBpbnQgY29sb3IgPSBoYXNDaGlsZHJlbigpID8gSWNvbkZhY3RvcnkuQ09MT1JfQkxVRSA6IEljb25GYWN0b3J5LkNPTE9SX0dSRUVOOwotICAgICAgICBpbnQgc2hhcGUgPSBoYXNDaGlsZHJlbigpID8gSWNvbkZhY3RvcnkuU0hBUEVfUkVDVCA6IEljb25GYWN0b3J5LlNIQVBFX0NJUkNMRTsKLSAgICAgICAgSW1hZ2UgaWNvbiA9IGZhY3RvcnkuZ2V0SWNvbihtWG1sTmFtZSwgY29sb3IsIHNoYXBlKTsKLSAgICAgICAgcmV0dXJuIGljb24gIT0gbnVsbCA/IGljb24gOiBBZHRQbHVnaW4uZ2V0QW5kcm9pZExvZ28oKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyBhbiBvcHRpb25hbCBJbWFnZURlc2NyaXB0b3IgZm9yIHRoZSBlbGVtZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBCeSBkZWZhdWx0IHRoaXMgdHJpZXMgdG8gcmV0dXJuIGFuIGltYWdlIGJhc2VkIG9uIHRoZSBYTUwgbmFtZSBvZiB0aGUgZWxlbWVudC4KLSAgICAgKiBJZiB0aGlzIGZhaWxzLCBpdCB0cmllcyB0byByZXR1cm4gdGhlIGRlZmF1bHQgQW5kcm9pZCBsb2dvIGFzIGRlZmluZWQgaW4gdGhlCi0gICAgICogcGx1Z2luLiBJZiBhbGwgZmFpbHMsIGl0IHJldHVybnMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIEltYWdlRGVzY3JpcHRvciBmb3IgdGhpcyBlbGVtZW50IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIEljb25GYWN0b3J5IGZhY3RvcnkgPSBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICBpbnQgY29sb3IgPSBoYXNDaGlsZHJlbigpID8gSWNvbkZhY3RvcnkuQ09MT1JfQkxVRSA6IEljb25GYWN0b3J5LkNPTE9SX0dSRUVOOwotICAgICAgICBpbnQgc2hhcGUgPSBoYXNDaGlsZHJlbigpID8gSWNvbkZhY3RvcnkuU0hBUEVfUkVDVCA6IEljb25GYWN0b3J5LlNIQVBFX0NJUkNMRTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGlkID0gZmFjdG9yeS5nZXRJbWFnZURlc2NyaXB0b3IobVhtbE5hbWUsIGNvbG9yLCBzaGFwZSk7Ci0gICAgICAgIHJldHVybiBpZCAhPSBudWxsID8gaWQgOiBBZHRQbHVnaW4uZ2V0QW5kcm9pZExvZ29EZXNjKCk7Ci0gICAgfQotCi0gICAgLyogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGxvd2VkIGF0dHJpYnV0ZXMuICovCi0gICAgcHVibGljIEF0dHJpYnV0ZURlc2NyaXB0b3JbXSBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXM7Ci0gICAgfQotICAgIAotICAgIC8qIFNldHMgdGhlIGxpc3Qgb2YgYWxsb3dlZCBhdHRyaWJ1dGVzLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICBmb3IgKEF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0cmlidXRlIDogYXR0cmlidXRlcykgewotICAgICAgICAgICAgYXR0cmlidXRlLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbG93ZWQgY2hpbGRyZW4gKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3JbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIG1DaGlsZHJlbjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgZGVzY3JpcHRvciBoYXMgY2hpbGRyZW4gYXZhaWxhYmxlICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBtQ2hpbGRyZW4ubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKEVsZW1lbnREZXNjcmlwdG9yW10gbmV3Q2hpbGRyZW4pIHsKLSAgICAgICAgbUNoaWxkcmVuID0gbmV3Q2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGxpc3Qgb2YgYWxsb3dlZCBjaGlsZHJlbi4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29udmVydHMgYSBDb2xsZWN0aW9uIGludG8gYW4gYXJyYXkgYW5kCi0gICAgICogY2FsbHMge0BsaW5rICNzZXRDaGlsZHJlbihFbGVtZW50RGVzY3JpcHRvcltdKX0uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWVhbnMgYSA8ZW0+Y29weTwvZW0+IG9mIHRoZSBjb2xsZWN0aW9uIGlzIG1hZGUuIFRoZSBjb2xsZWN0aW9uIGlzIG5vdAotICAgICAqIHN0b3JlZCBieSB0aGUgcmVjaXBpZW50IGFuZCBjYW4gdGh1cyBiZSBhbHRlcmVkIGJ5IHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oQ29sbGVjdGlvbjxFbGVtZW50RGVzY3JpcHRvcj4gbmV3Q2hpbGRyZW4pIHsKLSAgICAgICAgc2V0Q2hpbGRyZW4obmV3Q2hpbGRyZW4udG9BcnJheShuZXcgRWxlbWVudERlc2NyaXB0b3JbbmV3Q2hpbGRyZW4uc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb3B0aW9uYWwgdG9vbHRpcC4gV2lsbCBiZSBudWxsIGlmIG5vdCBwcmVzZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgdG9vbHRpcCBpcyBiYXNlZCBvbiB0aGUgSmF2YWRvYyBvZiB0aGUgZWxlbWVudCBhbmQgYWxyZWFkeSBwcm9jZXNzZWQgdmlhCi0gICAgICoge0BsaW5rIERlc2NyaXB0b3JzVXRpbHMjZm9ybWF0VG9vbHRpcChTdHJpbmcpfSB0byBiZSBkaXNwbGF5ZWQgcmlnaHQgYXdheSBhcwotICAgICAqIGEgVUkgdG9vbHRpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0gICAgICAgIHJldHVybiBtVG9vbHRpcDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyBhbiBvcHRpb25hbCBTS0QgVVJMLiBXaWxsIGJlIG51bGwgaWYgbm90IHByZXNlbnQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZGtVcmwoKSB7Ci0gICAgICAgIHJldHVybiBtU2RrVXJsOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBvcHRpb25hbCB0b29sdGlwLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb29sdGlwKFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIG1Ub29sdGlwID0gdG9vbHRpcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFNldHMgdGhlIG9wdGlvbmFsIFNESyBVUkwuIENhbiBiZSBudWxsIG9yIGVtcHR5LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNka1VybChTdHJpbmcgc2RrVXJsKSB7Ci0gICAgICAgIG1TZGtVcmwgPSBzZGtVcmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gbGlua2VkIHRvIHRoaXMgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBjcmVhdGVVaU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlFbGVtZW50Tm9kZSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGRyZW4gb2YgdGhpcyBkZXNjcmlwdG9yIHRoYXQgZGVzY3JpYmVzIHRoZSBnaXZlbiBYTUwgZWxlbWVudCBuYW1lLiAKLSAgICAgKiA8cC8+Ci0gICAgICogSW4gcmVjdXJzaXZlIG1vZGUsIHNlYXJjaGVzIHRoZSBkaXJlY3QgY2hpbGRyZW4gZmlyc3QgYmVmb3JlIGRlc2NlbmRpbmcgaW4gdGhlIGhpZXJhcmNoeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBFbGVtZW50RGVzY3JpcHRvciBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIFhNTCBub2RlIGVsZW1lbnQgbmFtZSBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBmaW5kQ2hpbGRyZW5EZXNjcmlwdG9yKFN0cmluZyBlbGVtZW50X25hbWUsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0gICAgICAgIHJldHVybiBmaW5kQ2hpbGRyZW5EZXNjcmlwdG9ySW50ZXJuYWwoZWxlbWVudF9uYW1lLCByZWN1cnNpdmUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgZmluZENoaWxkcmVuRGVzY3JpcHRvckludGVybmFsKFN0cmluZyBlbGVtZW50X25hbWUsCi0gICAgICAgICAgICBib29sZWFuIHJlY3Vyc2l2ZSwKLSAgICAgICAgICAgIFNldDxFbGVtZW50RGVzY3JpcHRvcj4gdmlzaXRlZCkgewotICAgICAgICBpZiAocmVjdXJzaXZlICYmIHZpc2l0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdmlzaXRlZCA9IG5ldyBIYXNoU2V0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBlIDogZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0WG1sTmFtZSgpLmVxdWFscyhlbGVtZW50X25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlzaXRlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2aXNpdGVkLmFkZCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWN1cnNpdmUpIHsKLSAgICAgICAgICAgIGZvciAoRWxlbWVudERlc2NyaXB0b3IgZSA6IGdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmlzaXRlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5hZGQoZSkpIHsgIC8vIFNldC5hZGQoKSByZXR1cm5zIGZhbHNlIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBwcmVzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBmID0gZS5maW5kQ2hpbGRyZW5EZXNjcmlwdG9ySW50ZXJuYWwoZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlLCB2aXNpdGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgaGVscGVyIHRoYW4gcHJldHR5LWZvcm1hdHMgYW4gWE1MIE5hbWUgZm9yIHRoZSBVSS4KLSAgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHNpbXBsaWZpZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBvbmx5IGFuIFhNTCBlbGVtZW50IG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgbmFtZSB0byBjb252ZXJ0LgotICAgICAqIEByZXR1cm4gVGhlIFhNTCBuYW1lIHdpdGggZGFzaGVzIHJlcGxhY2VkIGJ5IHNwYWNlcyBhbmQgY2FwaXRhbGl6ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZXR0eU5hbWUoU3RyaW5nIHhtbF9uYW1lKSB7Ci0gICAgICAgIGNoYXIgY1tdID0geG1sX25hbWUudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaWYgKGMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgY1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjWzBdKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjKS5yZXBsYWNlKCItIiwgIiAiKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0VudW1BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9FbnVtQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc0ZTZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0VudW1BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlMaXN0QXR0cmlidXRlTm9kZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSB0ZXh0IGF0dHJpYnV0ZSB0aGF0IGNhbiBvbmx5IGNvbnRhaW5zIHNvbWUgcHJlZGVmaW5lZCB2YWx1ZXMuCi0gKiBJdCBpcyBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgVWlMaXN0QXR0cmlidXRlTm9kZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtQXR0cmlidXRlRGVzY3JpcHRvciBleHRlbmRzIExpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yIHsKLQotICAgIHB1YmxpYyBFbnVtQXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBVaUxpc3RBdHRyaWJ1dGVOb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgY3JlYXRlVWlOb2RlKFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaUxpc3RBdHRyaWJ1dGVOb2RlKHRoaXMsIHVpUGFyZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9GbGFnQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhOTBjNy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9GbGFnQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLkZsYWdWYWx1ZUNlbGxFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlGbGFnQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpTGlzdEF0dHJpYnV0ZU5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIHRleHQgYXR0cmlidXRlIHRoYXQgY2FuIG9ubHkgY29udGFpbnMgc29tZSBwcmVkZWZpbmVkIHZhbHVlcy4KLSAqIEl0IGlzIGRpc3BsYXllZCBieSBhIHtAbGluayBVaUxpc3RBdHRyaWJ1dGVOb2RlfS4KLSAqIAotICogTm90ZTogaW4gQW5kcm9pZCByZXNvdXJjZXMsIGEgImZsYWciIGlzIGEgbGlzdCBvZiBmaXhlZCB2YWx1ZXMgd2hlcmUgb25lIG9yCi0gKiBtb3JlIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgYW4gIm9yIiwgZS5nLiAiYWxpZ249J2xlZnR8dG9wJyIuCi0gKiBCeSBjb250cmFzdCwgYW4gImVudW0iIGlzIGEgbGlzdCBvZiBmaXhlZCB2YWx1ZXMgb2Ygd2hpY2ggb25seSBvbmUgY2FuIGJlCi0gKiBzZWxlY3RlZCBhdCBhIGdpdmVuIHRpbWUsIGUuZy4gImdyYXZpdHk9J3JpZ2h0JyIuCi0gKiA8cC8+Ci0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlICJmbGFnIiBjYXNlLgotICogVGhlICJlbnVtIiBjYXNlIGlzIGRvbmUgdXNpbmcge0BsaW5rIExpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yfS4KLSAqLwotcHVibGljIGNsYXNzIEZsYWdBdHRyaWJ1dGVEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtTmFtZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBGbGFnQXR0cmlidXRlRGVzY3JpcHRvcn0gd2hpY2ggYXV0b21hdGljYWxseSBnZXRzIGl0cwotICAgICAqIHZhbHVlcyBmcm9tIHRoZSBGcmFtZXdvcmtSZXNvdXJjZU1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIEZsYWdBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBGbGFnQXR0cmlidXRlRGVzY3JpcHRvcn0gd2hpY2ggdXNlcyB0aGUgcHJvdmlkZWQgdmFsdWVzLgotICAgICovCi0gICAgcHVibGljIEZsYWdBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwLCBTdHJpbmdbXSBuYW1lcykgewotICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgICAgbU5hbWVzID0gbmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgaW5pdGlhbCBuYW1lcyBvZiB0aGUgZmxhZ3MuIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBGcmFtZXdvcmsKLSAgICAgKiAgICAgICAgIHJlc291cmNlIHBhcnNlciBzaG91bGQgYmUgY2hlY2tlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFVpTGlzdEF0dHJpYnV0ZU5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZSBjcmVhdGVVaU5vZGUoVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IFVpRmxhZ0F0dHJpYnV0ZU5vZGUodGhpcywgdWlQYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICAvLyAtLS0tLS0tIElQcm9wZXJ0eURlc2NyaXB0b3IgTWV0aG9kcwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IEZsYWdWYWx1ZUNlbGxFZGl0b3IocGFyZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0lEZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0lEZXNjcmlwdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwZWQzOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9JRGVzY3JpcHRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNjcmlwdG9yUHJvdmlkZXIgewotCi0gICAgRWxlbWVudERlc2NyaXB0b3JbXSBnZXRSb290RWxlbWVudERlc2NyaXB0b3JzKCk7Ci0gICAgCi0gICAgRWxlbWVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0xpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjJlNDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5MaXN0VmFsdWVDZWxsRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpTGlzdEF0dHJpYnV0ZU5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIHRleHQgYXR0cmlidXRlIHRoYXQgY2FuIGNvbnRhaW5zIHNvbWUgcHJlZGVmaW5lZCB2YWx1ZXMuCi0gKiBJdCBpcyBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgVWlMaXN0QXR0cmlidXRlTm9kZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0QXR0cmlidXRlRGVzY3JpcHRvciBleHRlbmRzIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIHsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gbVZhbHVlcyA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3J9IHdoaWNoIGF1dG9tYXRpY2FsbHkgZ2V0cyBpdHMKLSAgICAgKiB2YWx1ZXMgZnJvbSB0aGUgRnJhbWV3b3JrUmVzb3VyY2VNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0QXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBMaXN0QXR0cmlidXRlRGVzY3JpcHRvcn0gd2hpY2ggdXNlcyB0aGUgcHJvdmlkZWQgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0QXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksIAotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAsIFN0cmluZ1tdIHZhbHVlcykgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgICAgICBtVmFsdWVzID0gdmFsdWVzOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFVpTGlzdEF0dHJpYnV0ZU5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZSBjcmVhdGVVaU5vZGUoVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IFVpTGlzdEF0dHJpYnV0ZU5vZGUodGhpcywgdWlQYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICAvLyAtLS0tLS0tIElQcm9wZXJ0eURlc2NyaXB0b3IgTWV0aG9kcwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IExpc3RWYWx1ZUNlbGxFZGl0b3IocGFyZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9SZWZlcmVuY2VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9SZWZlcmVuY2VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMGVkODMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvUmVmZXJlbmNlQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlJlc291cmNlVmFsdWVDZWxsRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhbiBYTUwgYXR0cmlidXRlIGRpc3BsYXllZCBjb250YWluaW5nIGEgdmFsdWUgb3IgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZS4KLSAqIEl0IGlzIGRpc3BsYXllZCBieSBhIHtAbGluayBVaVJlc291cmNlQXR0cmlidXRlTm9kZX0uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZWZlcmVuY2VBdHRyaWJ1dGVEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgewotCi0gICAgLyoqIFRoZSB7QGxpbmsgUmVzb3VyY2VUeXBlfSB0aGF0IHRoaXMgcmVmZXJlbmNlIGF0dHJpYnV0ZSBjYW4gYWNjZXB0LiBJdCBjYW4gYmUgbnVsbCwKLSAgICAgKiBpbiB3aGljaCBjYXNlIGFueSByZWZlcmVuY2UgdHlwZSBjYW4gYmUgdXNlZC4gKi8KLSAgICBwcml2YXRlIFJlc291cmNlVHlwZSBtUmVzb3VyY2VUeXBlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIHRoYXQgY2FuIGNvbnRhaW4gYW55IHR5cGUgb2YgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSB4bWxMb2NhbE5hbWUgVGhlIFhNTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKGNhc2Ugc2Vuc2l0aXZlKQotICAgICAqIEBwYXJhbSB1aU5hbWUgVGhlIFVJIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gQ2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyBhbmQgY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIG5zVXJpIFRoZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gQ2FuIGJlIG51bGwgaWYgYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2UuCi0gICAgICogICAgICAgICAgICAgIFNlZSB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30gZm9yIGEgY29tbW9uIHZhbHVlLgotICAgICAqIEBwYXJhbSB0b29sdGlwIEEgbm9uLWVtcHR5IHRvb2x0aXAgc3RyaW5nIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlQXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgYXR0cmlidXRlcyB0aGF0IGNhbiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgc3BlY2lmaWMKLSAgICAgKiB7QGxpbmsgUmVzb3VyY2VUeXBlfS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSBzcGVjaWZpYyB7QGxpbmsgUmVzb3VyY2VUeXBlfSB0aGF0IHRoaXMgcmVmZXJlbmNlIGF0dHJpYnV0ZSBzdXBwb3J0cy4KLSAgICAgKiBJdCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UsIGFsbCByZXNvdXJjZSB0eXBlcyBhcmUgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSB4bWxMb2NhbE5hbWUgVGhlIFhNTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKGNhc2Ugc2Vuc2l0aXZlKQotICAgICAqIEBwYXJhbSB1aU5hbWUgVGhlIFVJIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gQ2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyBhbmQgY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIG5zVXJpIFRoZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gQ2FuIGJlIG51bGwgaWYgYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2UuCi0gICAgICogICAgICAgICAgICAgIFNlZSB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30gZm9yIGEgY29tbW9uIHZhbHVlLgotICAgICAqIEBwYXJhbSB0b29sdGlwIEEgbm9uLWVtcHR5IHRvb2x0aXAgc3RyaW5nIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlQXR0cmlidXRlRGVzY3JpcHRvcihSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHhtbExvY2FsTmFtZSwgU3RyaW5nIHVpTmFtZSwgU3RyaW5nIG5zVXJpLAotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXApIHsKLSAgICAgICAgc3VwZXIoeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwKTsKLSAgICAgICAgbVJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLSAgICB9Ci0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVzb3VyY2VUeXBlfSB0aGF0IHRoaXMgcmVmZXJlbmNlIGF0dHJpYnV0ZSBjYW4gYWNjZXB0LgotICAgICAqIEl0IGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGFueSByZWZlcmVuY2UgdHlwZSBjYW4gYmUgdXNlZC4gKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXNvdXJjZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlSZXNvdXJjZUF0dHJpYnV0ZU5vZGV9IGxpbmtlZCB0byB0aGlzIHJlZmVyZW5jZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgY3JlYXRlVWlOb2RlKFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaVJlc291cmNlQXR0cmlidXRlTm9kZShtUmVzb3VyY2VUeXBlLCB0aGlzLCB1aVBhcmVudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLSBJUHJvcGVydHlEZXNjcmlwdG9yIE1ldGhvZHMKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDZWxsRWRpdG9yIGNyZWF0ZVByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVZhbHVlQ2VsbEVkaXRvcihwYXJlbnQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODA4NzdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL1NlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaVNlcGFyYXRvckF0dHJpYnV0ZU5vZGU7Ci0KLS8qKgotICoge0BsaW5rIFNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3J9IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgcmVhbCBhdHRyaWJ1dGUuCi0gKiA8cC8+Ci0gKiBJdCBpcyB1c2VkIHRvIHNlcGFyYXRlIGdyb3VwcyBvZiBhdHRyaWJ1dGVzIHZpc3VhbGx5LgotICovCi1wdWJsaWMgY2xhc3MgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvciBleHRlbmRzIEF0dHJpYnV0ZURlc2NyaXB0b3IgewotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3J9Ci0gICAgICovCi0gICAgcHVibGljIFNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3IoU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHN1cGVyKGxhYmVsIC8qIHhtbExvY2FsTmFtZSAqLywgbnVsbCAvKiBuc1VyaSAqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yIG9yIG51bGwgaWYgdGhpcwotICAgICAqICAgICAgICAgYXR0cmlidXRlIGhhcyBubyB1c2VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlBdHRyaWJ1dGVOb2RlIGNyZWF0ZVVpTm9kZShVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlTZXBhcmF0b3JBdHRyaWJ1dGVOb2RlKHRoaXMsIHVpUGFyZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9UZXh0QXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlY2E4OC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9UZXh0QXR0cmlidXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5UZXh0VmFsdWVDZWxsRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpVGV4dEF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIERlc2NyaWJlcyBhIHRleHR1YWwgWE1MIGF0dHJpYnV0ZS4KLSAqIDxwLz4KLSAqIFN1Y2ggYW4gYXR0cmlidXRlIGhhcyBhIHRvb2x0aXAgYW5kIHdvdWxkIHR5cGljYWxseSBiZSBkaXNwbGF5ZWQgYnkKLSAqIHtAbGluayBVaVRleHRBdHRyaWJ1dGVOb2RlfSB1c2luZyBhIGxhYmVsIHdpZGdldCBhbmQgdGV4dCBmaWVsZC4KLSAqIDxwLz4KLSAqIFRoaXMgaXMgdGhlICJkZWZhdWx0IiBraW5kIG9mIGF0dHJpYnV0ZS4gSWYgaW4gZG91YnQsIHVzZSB0aGlzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgZXh0ZW5kcyBBdHRyaWJ1dGVEZXNjcmlwdG9yIGltcGxlbWVudHMgSVByb3BlcnR5RGVzY3JpcHRvciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVVpTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtVG9vbHRpcDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcn0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geG1sTG9jYWxOYW1lIFRoZSBYTUwgbmFtZSBvZiB0aGUgYXR0cmlidXRlIChjYXNlIHNlbnNpdGl2ZSkKLSAgICAgKiBAcGFyYW0gdWlOYW1lIFRoZSBVSSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIENhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcgYW5kIGNhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBuc1VyaSBUaGUgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuIENhbiBiZSBudWxsIGlmIGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlLgotICAgICAqICAgICAgICAgICAgICBTZWUge0BsaW5rIFNka0NvbnN0YW50cyNOU19SRVNPVVJDRVN9IGZvciBhIGNvbW1vbiB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBIG5vbi1lbXB0eSB0b29sdGlwIHN0cmluZyBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbnNVcmksIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgbnNVcmkpOwotICAgICAgICBtVWlOYW1lID0gdWlOYW1lOwotICAgICAgICBtVG9vbHRpcCA9ICh0b29sdGlwICE9IG51bGwgJiYgdG9vbHRpcC5sZW5ndGgoKSA+IDApID8gdG9vbHRpcCA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgVUkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBDYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIGFuZCBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFVpTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1VaU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHRvb2x0aXAgc3RyaW5nIGlzIGVpdGhlciBudWxsIG9yIGEgbm9uLWVtcHR5IHN0cmluZy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHRvb2x0aXAgaXMgYmFzZWQgb24gdGhlIEphdmFkb2Mgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgYWxyZWFkeSBwcm9jZXNzZWQgdmlhCi0gICAgICoge0BsaW5rIERlc2NyaXB0b3JzVXRpbHMjZm9ybWF0VG9vbHRpcChTdHJpbmcpfSB0byBiZSBkaXNwbGF5ZWQgcmlnaHQgYXdheSBhcwotICAgICAqIGEgVUkgdG9vbHRpcC4KLSAgICAgKiA8cC8+Ci0gICAgICogQW4gZW1wdHkgc3RyaW5nIGlzIGNvbnZlcnRlZCB0byBudWxsLCB0byBtYXRjaCB0aGUgYmVoYXZpb3Igb2Ygc2V0VG9vbFRpcFRleHQoKSBpbgotICAgICAqIHtAbGluayBDb250cm9sfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgbm9uLWVtcHR5IHRvb2x0aXAgc3RyaW5nIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0gICAgICAgIHJldHVybiBtVG9vbHRpcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlUZXh0QXR0cmlidXRlTm9kZX0gbGlua2VkIHRvIHRoaXMgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlBdHRyaWJ1dGVOb2RlIGNyZWF0ZVVpTm9kZShVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlUZXh0QXR0cmlidXRlTm9kZSh0aGlzLCB1aVBhcmVudCk7Ci0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0gSVByb3BlcnR5RGVzY3JpcHRvciBNZXRob2RzCi0KLSAgICBwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dFZhbHVlQ2VsbEVkaXRvcihwYXJlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0gICAgICAgIGlmIChpc0RlcHJlY2F0ZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuICJEZXByZWNhdGVkIjsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VWlOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbVRvb2x0aXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1VaU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEZpbHRlckZsYWdzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEhlbHBDb250ZXh0SWRzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZURlc2NyaXB0b3JMYWJlbFByb3ZpZGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChJUHJvcGVydHlEZXNjcmlwdG9yIGFub3RoZXJQcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gYW5vdGhlclByb3BlcnR5ID09IHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvVGV4dFZhbHVlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvVGV4dFZhbHVlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODE4MjdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL1RleHRWYWx1ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaVRleHRWYWx1ZU5vZGU7Ci0KLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHZhbHVlIG9mIGFuIFhNTCBlbGVtZW50LgotICogPHAvPgotICogVGhlIHZhbHVlIGlzIGEgc2ltcGxlIHRleHQgc3RyaW5nLCBkaXNwbGF5ZWQgYnkgYW4ge0BsaW5rIFVpVGV4dFZhbHVlTm9kZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VmFsdWVEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgewotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRleHRWYWx1ZURlc2NyaXB0b3J9Ci0gICAgICogCi0gICAgICogQHBhcmFtIHVpTmFtZSBUaGUgVUkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBDYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIGFuZCBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBIG5vbi1lbXB0eSB0b29sdGlwIHN0cmluZyBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFRleHRWYWx1ZURlc2NyaXB0b3IoU3RyaW5nIHVpTmFtZSwgU3RyaW5nIHRvb2x0aXApIHsKLSAgICAgICAgc3VwZXIoIiN0ZXh0IiAvKiB4bWxMb2NhbE5hbWUgKi8sIHVpTmFtZSwgbnVsbCAvKiBuc1VyaSAqLywgdG9vbHRpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlUZXh0VmFsdWVOb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgY3JlYXRlVWlOb2RlKFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaVRleHRWYWx1ZU5vZGUodGhpcywgdWlQYXJlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL1htbG5zQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNmVmYWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvZGVzY3JpcHRvcnMvWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi0KLS8qKgotICogRGVzY3JpYmVzIGFuIFhNTE5TIGF0dHJpYnV0ZSB0aGF0IGlzIGhpZGRlbi4KLSAqIDxwLz4KLSAqIFN1Y2ggYW4gYXR0cmlidXRlIGhhcyBubyB1c2VyIGludGVyZmFjZSBhbmQgbm8gY29ycmVzcG9uZGluZyB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfS4KLSAqIEl0IGFsc28gaGFzIGEgc2luZ2xlIGNvbnN0YW50IGRlZmF1bHQgdmFsdWUuCi0gKiA8cC8+Ci0gKiBXaGVuIGxvYWRpbmcgYW4gWE1MLCB3ZSdsbCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCi0gKiBIb3dldmVyIHdoZW4gd3JpdGluZyBhIG5ldyBYTUwsIHdlIHNob3VsZCBhbHdheXMgd3JpdGUgdGhpcyBhdHRyaWJ1dGUuCi0gKiA8cC8+Ci0gKiBDdXJyZW50bHkgdGhpcyBpcyB1c2VkIGZvciB0aGUgeG1sbnM6YW5kcm9pZCBhdHRyaWJ1dGUgaW4gdGhlIG1hbmlmZXN0IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IgZXh0ZW5kcyBBdHRyaWJ1dGVEZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIFVSSSBvZiB0aGUgcmVzZXJ2ZWQgInhtbG5zIiAgcHJlZml4LCBhcyBkZXNjcmliZWQgaW4KLSAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1Db3JlLTIwMDQwNDA3L25hbWVzcGFjZXMtYWxnb3JpdGhtcy5odG1sI25vcm1hbGl6ZURvY3VtZW50QWxnbwotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTE5TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7IC8vJE5PTi1OTFMtMSQgCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVZhbHVlOwotCi0gICAgCi0gICAgcHVibGljIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcihTdHJpbmcgZGVmYXVsdFByZWZpeCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKGRlZmF1bHRQcmVmaXgsIFhNTE5TX1VSSSk7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgc3BlY2lhbGl6ZWQgYXR0cmlidXRlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIHRoZSBVUkkgYXNzb2NpYXRlZAotICAgICAqIHRvIHRoZSBkZWNsYXJlZCBuYW1lc3BhY2UgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgInhtbG5zIiBwcmVmaXggdGhhdCBpcyBhbHdheXMgdXNlZCBieSB0aGlzIG5vZGUgZm9yIGl0cyBuYW1lc3BhY2UgVVJJLgotICAgICAqIFRoaXMgaXMgZGVmaW5lZCBieSB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxOc1ByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbHktcXVhbGlmaWVkIGF0dHJpYnV0ZSBuYW1lLCBuYW1lbHkgInhtbG5zOnh4eCIgd2hlcmUgeHh4IGlzCi0gICAgICogdGhlIGRlZmF1bHRQcmVmaXggcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbE5zTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFhtbE5zUHJlZml4KCkgKyAiOiIgKyBnZXRYbWxMb2NhbE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsd2F5cyByZXR1cm5zIG51bGwuIHtAbGluayBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3J9IGhhcyBubyB1c2VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlBdHRyaWJ1dGVOb2RlIGNyZWF0ZVVpTm9kZShVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9CYXNlUHVsbFBhcnNlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0Jhc2VQdWxsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NGYxZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0Jhc2VQdWxsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklYbWxQdWxsUGFyc2VyOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiB7QGxpbmsgSVhtbFB1bGxQYXJzZXJ9IGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIGlzIG5vdCBzaXR0aW5nCi0gKiBvbiB0b3Agb2YgYW4gYWN0dWFsIFhNTCBmaWxlLgotICogPHAvPkl0J3MgZGVzaWduZWQgdG8gd29yayBvbiBsYXlvdXQgZmlsZXMsIGFuZCB3aWxsIG1vc3QgbGlrZWx5IG5vdCB3b3JrIG9uIG90aGVyIHJlc291cmNlCi0gKiBmaWxlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQdWxsUGFyc2VyIGltcGxlbWVudHMgSVhtbFB1bGxQYXJzZXIgewotICAgIAotICAgIHByb3RlY3RlZCBpbnQgbVBhcnNpbmdTdGF0ZSA9IFNUQVJUX0RPQ1VNRU5UOwotICAgIAotICAgIHB1YmxpYyBCYXNlUHVsbFBhcnNlcigpIHsKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tIG5ldyBtZXRob2RzIHRvIG92ZXJyaWRlIC0tLQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTmV4dEZyb21TdGFydERvY3VtZW50KCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25OZXh0RnJvbVN0YXJ0VGFnKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25OZXh0RnJvbUVuZFRhZygpOwotICAgIAotICAgIC8vIC0tLSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBJWG1sUHVsbFBhcnNlciAtLS0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChGRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUy5lcXVhbHMobmFtZSkgJiYgc3RhdGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoRkVBVFVSRV9SRVBPUlRfTkFNRVNQQUNFX0FUVFJJQlVURVMuZXF1YWxzKG5hbWUpICYmIHN0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGZlYXR1cmU6ICIgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChGRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUy5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGRUFUVVJFX1JFUE9SVF9OQU1FU1BBQ0VfQVRUUklCVVRFUy5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJzZXRQcm9wZXJ0eSgpIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KFJlYWRlciBpbikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigic2V0SW5wdXQoKSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpbnB1dEVuY29kaW5nKQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigic2V0SW5wdXQoKSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVmaW5lRW50aXR5UmVwbGFjZW1lbnRUZXh0KFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgcmVwbGFjZW1lbnRUZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiZGVmaW5lRW50aXR5UmVwbGFjZW1lbnRUZXh0KCkgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBwb3MpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oImdldE5hbWVzcGFjZVByZWZpeCgpIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldE5hbWVzcGFjZSgpIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KGludCBkZXB0aCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiZ2V0TmFtZXNwYWNlQ291bnQoKSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoaW50IHBvcykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiZ2V0TmFtZXNwYWNlVXJpKCkgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiAiQ0RBVEEiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gbVBhcnNpbmdTdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoaW50W10gYXJnMCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZURlZmF1bHQoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAobVBhcnNpbmdTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBFTkRfRE9DVU1FTlQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oIk5vdGhpbmcgYWZ0ZXIgdGhlIGVuZCIpOwotICAgICAgICAgICAgY2FzZSBTVEFSVF9ET0NVTUVOVDoKLSAgICAgICAgICAgICAgICBvbk5leHRGcm9tU3RhcnREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFSVF9UQUc6Ci0gICAgICAgICAgICAgICAgb25OZXh0RnJvbVN0YXJ0VGFnKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORF9UQUc6Ci0gICAgICAgICAgICAgICAgb25OZXh0RnJvbUVuZFRhZygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENEU0VDVDoKLSAgICAgICAgICAgICAgICAvLyBub3QgdXNlZAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTlRJVFlfUkVGOgotICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElHTk9SQUJMRV9XSElURVNQQUNFOgotICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT046Ci0gICAgICAgICAgICAgICAgLy8gbm90IHVzZWQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ09NTUVOVDoKLSAgICAgICAgICAgICAgICAvLyBub3QgdXNlZAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBET0NERUNMOgotICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtUGFyc2luZ1N0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IG5leHQoKTsKLSAgICAgICAgaWYgKGV2ZW50VHlwZSAhPSBTVEFSVF9UQUcgJiYgZXZlbnRUeXBlICE9IEVORF9UQUcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJleHBlY3RlZCBzdGFydCBvciBlbmQgdGFnIiwgdGhpcywgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG5leHRUZXh0KCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0RXZlbnRUeXBlKCkgIT0gU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigicGFyc2VyIG11c3QgYmUgb24gU1RBUlRfVEFHIHRvIHJlYWQgbmV4dCB0ZXh0IiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IG5leHQoKTsKLSAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBURVhUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgZXZlbnRUeXBlID0gbmV4dCgpOwotICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAhPSBFTkRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnQgVEVYVCBpdCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IEVORF9UQUciLCB0aGlzLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IEVORF9UQUcpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJwYXJzZXIgbXVzdCBiZSBvbiBTVEFSVF9UQUcgb3IgVEVYVCB0byByZWFkIHRleHQiLAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dFRva2VuKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IHR5cGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0eXBlICE9IGdldEV2ZW50VHlwZSgpIHx8IChuYW1lc3BhY2UgIT0gbnVsbCAmJiAhbmFtZXNwYWNlLmVxdWFscyhnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgICAgfHwgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoZ2V0TmFtZSgpKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiZXhwZWN0ZWQgIiArIFRZUEVTW3R5cGVdICsgZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvR3JhcGhpY2FsRWRpdG9yUGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0dyYXBoaWNhbEVkaXRvclBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAyZDNkYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvR3JhcGhpY2FsRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47DQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5MYXlvdXRSZWxvYWRNb25pdG9yLklMYXlvdXRSZWxvYWRMaXN0ZW5lcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmNvbmZpZ3VyYXRpb24uTGF5b3V0Q3JlYXRvckRpYWxvZzsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5JQ29uZmlnTGlzdGVuZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0cy5FbGVtZW50Q3JlYXRlQ29tbWFuZDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247DQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5Qcm9qZWN0UmVzb3VyY2VzOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGaWxlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkxvYWRTdGF0dXM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOw0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhLkxheW91dEJyaWRnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGsuSVRhcmdldENoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklMYXlvdXRCcmlkZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSUxheW91dExvZzsNCi1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JTGF5b3V0UmVzdWx0Ow0KLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklQcm9qZWN0Q2FsbGJhY2s7DQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVJlc291cmNlVmFsdWU7DQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVhtbFB1bGxQYXJzZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNlbGVjdGlvblN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogR3JhcGhpY2FsIGxheW91dCBlZGl0b3IgcGFydCwgdmVyc2lvbiAyLg0KLSAqDQotICogQHNpbmNlIEdMRTINCi0gKg0KLSAqIFRPRE8gTGlzdDoNCi0gKiAtIGRpc3BsYXkgZXJyb3IgaWNvbg0KLSAqIC0gZmluaXNoIHBhbGV0dGUgKHNlZSBwYWxldHRlJ3MgdG9kbyBsaXN0KQ0KLSAqIC0gZmluaXNoIGNhbnZhcyAoc2VlIGNhbnZhJ3MgdG9kbyBsaXN0KQ0KLSAqIC0gY29tcGxldGx5IHJldGhpbmsgdGhlIHByb3BlcnR5IHBhbmVsDQotICogLSBsaW5rIHRvIHRoZSBleGlzdGluZyBvdXRsaW5lIGVkaXRvciAocHJvbGx5IHJldXNlL2FkYXB0IGZvciBzaW1wbGllciBtb2RlbCBhbmQgd2lsbCBuZWVkDQotICogICB0byBhZGFwdCB0aGUgc2VsZWN0aW9uIHN5bmNocm9uaXplci4pDQotICovDQotcHVibGljIGNsYXNzIEdyYXBoaWNhbEVkaXRvclBhcnQgZXh0ZW5kcyBFZGl0b3JQYXJ0IGltcGxlbWVudHMgSUdyYXBoaWNhbExheW91dEVkaXRvciB7DQotDQotICAgIC8qDQotICAgICAqIFVzZWZ1bCBub3RlczoNCi0gICAgICogVG8gdW5kZXJzdGFuZCBEcmFnJ24nZHJvcDoNCi0gICAgICogICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtV29ya2JlbmNoLURORC9kcmFnX2Ryb3AuaHRtbA0KLSAgICAgKi8NCi0NCi0gICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgbGF5b3V0IGVkaXRvciAqLw0KLSAgICBwcml2YXRlIGZpbmFsIExheW91dEVkaXRvciBtTGF5b3V0RWRpdG9yOw0KLQ0KLSAgICAvKiogcmVmZXJlbmNlIHRvIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4gKi8NCi0gICAgcHJpdmF0ZSBJRmlsZSBtRWRpdGVkRmlsZTsNCi0NCi0gICAgLyoqIFRoZSBjdXJyZW50IGNsaXBib2FyZC4gTXVzdCBiZSBkaXNwb3NlZCBsYXRlci4gKi8NCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgbUNsaXBib2FyZDsNCi0NCi0gICAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGNvbXBvc2l0ZSBhdCB0aGUgdG9wIG9mIHRoZSBsYXlvdXQgZWRpdG9yLiAqLw0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db21wb3NpdGUgbUNvbmZpZ0NvbXBvc2l0ZTsNCi0NCi0gICAgLyoqIFRoZSBzYXNoIHRoYXQgc3BsaXRzIHRoZSBwYWxldHRlIGZyb20gdGhlIGNhbnZhcy4gKi8NCi0gICAgcHJpdmF0ZSBTYXNoRm9ybSBtU2FzaFBhbGV0dGU7DQotICAgIHByaXZhdGUgU2FzaEZvcm0gbVNhc2hFcnJvcjsNCi0NCi0gICAgLyoqIFRoZSBwYWxldHRlIGRpc3BsYXllZCBvbiB0aGUgbGVmdCBvZiB0aGUgc2FzaC4gKi8NCi0gICAgcHJpdmF0ZSBQYWxldHRlQ29tcG9zaXRlIG1QYWxldHRlOw0KLQ0KLSAgICAvKiogVGhlIGxheW91dCBjYW52YXMgZGlzcGxheWVkIG8gdGhlIHJpZ2h0IG9mIHRoZSBzYXNoLiAqLw0KLSAgICBwcml2YXRlIExheW91dENhbnZhcyBtTGF5b3V0Q2FudmFzOw0KLQ0KLSAgICBwcml2YXRlIFN0eWxlZFRleHQgbUVycm9yTGFiZWw7DQotDQotICAgIC8qKiBUaGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGJlaW5nIGVkaXRlZC4gKi8NCi0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIG1FZGl0ZWRDb25maWc7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBtQ29uZmlndXJlZEZyYW1ld29ya1JlczsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4+IG1Db25maWd1cmVkUHJvamVjdFJlczsNCi0gICAgcHJpdmF0ZSBQcm9qZWN0Q2FsbGJhY2sgbVByb2plY3RDYWxsYmFjazsNCi0gICAgcHJpdmF0ZSBJTGF5b3V0TG9nIG1Mb2dnZXI7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNYbWxSZWxvYWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkc1JlY29tcHV0ZSA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIFRhcmdldExpc3RlbmVyIG1UYXJnZXRMaXN0ZW5lcjsNCi0NCi0gICAgcHJpdmF0ZSBDb25maWdMaXN0ZW5lciBtQ29uZmlnTGlzdGVuZXI7DQotDQotICAgIHByaXZhdGUgUmVsb2FkTGlzdGVuZXIgbVJlbG9hZExpc3RlbmVyOw0KLQ0KLQ0KLSAgICBwdWJsaWMgR3JhcGhpY2FsRWRpdG9yUGFydChMYXlvdXRFZGl0b3IgbGF5b3V0RWRpdG9yKSB7DQotICAgICAgICBtTGF5b3V0RWRpdG9yID0gbGF5b3V0RWRpdG9yOw0KLSAgICAgICAgc2V0UGFydE5hbWUoIkdyYXBoaWNhbCBMYXlvdXQiKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gTWV0aG9kcyBvdmVycmlkZGVuIGZyb20gYmFzZSBjbGFzc2VzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0Lg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7DQotICAgICAgICBzZXRTaXRlKHNpdGUpOw0KLSAgICAgICAgdXNlTmV3RWRpdG9ySW5wdXQoaW5wdXQpOw0KLQ0KLSAgICAgICAgaWYgKG1UYXJnZXRMaXN0ZW5lciA9PSBudWxsKSB7DQotICAgICAgICAgICAgbVRhcmdldExpc3RlbmVyID0gbmV3IFRhcmdldExpc3RlbmVyKCk7DQotICAgICAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5hZGRUYXJnZXRMaXN0ZW5lcihtVGFyZ2V0TGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1SZWxvYWRMaXN0ZW5lciA9PSBudWxsKSB7DQotICAgICAgICAgICAgbVJlbG9hZExpc3RlbmVyID0gbmV3IFJlbG9hZExpc3RlbmVyKCk7DQotICAgICAgICAgICAgTGF5b3V0UmVsb2FkTW9uaXRvci5nZXRNb25pdG9yKCkuYWRkTGlzdGVuZXIobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpLCBtUmVsb2FkTGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZWxvYWRzIHRoaXMgZWRpdG9yLCBieSBnZXR0aW5nIHRoZSBuZXcgbW9kZWwgZnJvbSB0aGUge0BsaW5rIExheW91dEVkaXRvcn0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZWxvYWRFZGl0b3IoKSB7DQotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBtTGF5b3V0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVzZU5ld0VkaXRvcklucHV0KGlucHV0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyByZWFsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuISBMb2cgaXQgaW4gY2FzZSBpdCBoYXBwZW5zLg0KLSAgICAgICAgICAgIG1FZGl0ZWRGaWxlID0gbnVsbDsNCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJJbnB1dCBpcyBub3Qgb2YgdHlwZSBGaWxlRWRpdG9ySW5wdXQ6ICUxJHMiLCAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICBpbnB1dCA9PSBudWxsID8gIm51bGwiIDogaW5wdXQudG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1c2VOZXdFZGl0b3JJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBUaGUgY29udHJhY3Qgb2YgaW5pdCgpIG1lbnRpb25zIHdlIG5lZWQgdG8gZmFpbCBpZiB3ZSBjYW4ndCB1bmRlcnN0YW5kIHRoZSBpbnB1dC4NCi0gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW5wdXQgaXMgbm90IG9mIHR5cGUgRmlsZUVkaXRvcklucHV0OiAiICsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgIGlucHV0ID09IG51bGwgPyAibnVsbCIgOiBpbnB1dC50b1N0cmluZygpKTsgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICB9DQotDQotICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dClpbnB1dDsNCi0gICAgICAgIG1FZGl0ZWRGaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQ0KLSAgICAgICAgRGlzcGxheSBkID0gcGFyZW50LmdldERpc3BsYXkoKTsNCi0gICAgICAgIG1DbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGQpOw0KLQ0KLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsNCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQoZ2wpOw0KLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOw0KLQ0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0b3AgcGFydCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gY29udHJvbA0KLSAgICAgICAgbUNvbmZpZ0xpc3RlbmVyID0gbmV3IENvbmZpZ0xpc3RlbmVyKCk7DQotICAgICAgICBtQ29uZmlnQ29tcG9zaXRlID0gbmV3IENvbmZpZ3VyYXRpb25Db21wb3NpdGUobUNvbmZpZ0xpc3RlbmVyLCBwYXJlbnQsIFNXVC5CT1JERVIpOw0KLSAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS51cGRhdGVVSUZyb21SZXNvdXJjZXMoKTsNCi0NCi0gICAgICAgIG1TYXNoUGFsZXR0ZSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsNCi0gICAgICAgIG1TYXNoUGFsZXR0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsNCi0NCi0gICAgICAgIG1QYWxldHRlID0gbmV3IFBhbGV0dGVDb21wb3NpdGUobVNhc2hQYWxldHRlKTsNCi0NCi0gICAgICAgIG1TYXNoRXJyb3IgPSBuZXcgU2FzaEZvcm0obVNhc2hQYWxldHRlLCBTV1QuVkVSVElDQUwgfCBTV1QuQk9SREVSKTsNCi0gICAgICAgIG1TYXNoRXJyb3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7DQotDQotICAgICAgICBtTGF5b3V0Q2FudmFzID0gbmV3IExheW91dENhbnZhcyhtU2FzaEVycm9yLCBTV1QuTk9ORSk7DQotICAgICAgICBtRXJyb3JMYWJlbCA9IG5ldyBTdHlsZWRUZXh0KG1TYXNoRXJyb3IsIFNXVC5SRUFEX09OTFkpOw0KLSAgICAgICAgbUVycm9yTGFiZWwuc2V0RWRpdGFibGUoZmFsc2UpOw0KLSAgICAgICAgbUVycm9yTGFiZWwuc2V0QmFja2dyb3VuZChkLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsNCi0gICAgICAgIG1FcnJvckxhYmVsLnNldEZvcmVncm91bmQoZC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7DQotDQotICAgICAgICBtU2FzaFBhbGV0dGUuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAyMCwgODAgfSk7DQotICAgICAgICBtU2FzaEVycm9yLnNldFdlaWdodHMobmV3IGludFtdIHsgODAsIDIwIH0pOw0KLSAgICAgICAgbVNhc2hFcnJvci5zZXRNYXhpbWl6ZWRDb250cm9sKG1MYXlvdXRDYW52YXMpOw0KLQ0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUNCi0gICAgICAgIHJlbG9hZFBhbGV0dGUoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU3dpdGNoZXMgdGhlIHN0YWNrIHRvIGRpc3BsYXkgdGhlIGVycm9yIGxhYmVsIGFuZCBoaWRlIHRoZSBjYW52YXMuDQotICAgICAqIEBwYXJhbSBlcnJvckZvcm1hdCBUaGUgbmV3IGVycm9yIHRvIGRpc3BsYXkgaWYgbm90IG51bGwuDQotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFN0cmluZy5mb3JtYXQgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yIGZvcm1hdC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi5wYXJhbWV0ZXJzKSB7DQotICAgICAgICBpZiAoZXJyb3JGb3JtYXQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1FcnJvckxhYmVsLnNldFRleHQoU3RyaW5nLmZvcm1hdChlcnJvckZvcm1hdCwgcGFyYW1ldGVycykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbVNhc2hFcnJvci5zZXRNYXhpbWl6ZWRDb250cm9sKG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qKiBEaXNwbGF5cyB0aGUgY2FudmFzIGFuZCBoaWRlcyB0aGUgZXJyb3IgbGFiZWwuICovDQotICAgIHByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKSB7DQotICAgICAgICBtU2FzaEVycm9yLnNldE1heGltaXplZENvbnRyb2wobUxheW91dENhbnZhcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICBpZiAobVRhcmdldExpc3RlbmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZVRhcmdldExpc3RlbmVyKG1UYXJnZXRMaXN0ZW5lcik7DQotICAgICAgICAgICAgbVRhcmdldExpc3RlbmVyID0gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtUmVsb2FkTGlzdGVuZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIExheW91dFJlbG9hZE1vbml0b3IuZ2V0TW9uaXRvcigpLnJlbW92ZUxpc3RlbmVyKG1SZWxvYWRMaXN0ZW5lcik7DQotICAgICAgICAgICAgbVJlbG9hZExpc3RlbmVyID0gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtQ2xpcGJvYXJkICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtQ2xpcGJvYXJkLmRpc3Bvc2UoKTsNCi0gICAgICAgICAgICBtQ2xpcGJvYXJkID0gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTGlzdGVucyB0byBjaGFuZ2VzIGZyb20gdGhlIENvbmZpZ3VyYXRpb24gVUkgYmFubmVyIGFuZCB0cmlnZ2VycyBsYXlvdXQgcmVuZGVyaW5nIHdoZW4NCi0gICAgICogY2hhbmdlZC4gQWxzbyBwcm92aWRlIHRoZSBDb25maWd1cmF0aW9uIFVJIHdpdGggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzL2xheW91dCB0byBkaXNwbGF5Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBjbGFzcyBDb25maWdMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWdMaXN0ZW5lciB7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIExvb2tzIGZvciBhIGZpbGUgbWF0Y2hpbmcgdGhlIG5ldyB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0gYW5kIGF0dGVtcHRzIHRvIG9wZW4gaXQuDQotICAgICAgICAgKiA8cC8+SWYgdGhlcmUgaXMgbm8gbWF0Y2gsIG5vdGlmeSB0aGUgdXNlci4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlKCkgew0KLSAgICAgICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gbUNvbmZpZ3VyZWRQcm9qZWN0UmVzID0gbnVsbDsNCi0NCi0gICAgICAgICAgICBpZiAobUVkaXRlZEZpbGUgPT0gbnVsbCB8fCBtRWRpdGVkQ29uZmlnID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlcyBvZiB0aGUgZmlsZSdzIHByb2plY3QuDQotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyByZXNvdXJjZXMgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0UmVzb3VyY2VzKA0KLSAgICAgICAgICAgICAgICAgICAgbUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpKTsNCi0NCi0gICAgICAgICAgICAvLyBmcm9tIHRoZSByZXNvdXJjZXMsIGxvb2sgZm9yIGEgbWF0Y2hpbmcgZmlsZQ0KLSAgICAgICAgICAgIFJlc291cmNlRmlsZSBtYXRjaCA9IG51bGw7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG1hdGNoID0gcmVzb3VyY2VzLmdldE1hdGNoaW5nRmlsZShtRWRpdGVkRmlsZS5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlclR5cGUuTEFZT1VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAobWF0Y2guZ2V0RmlsZSgpLmVxdWFscyhtRWRpdGVkRmlsZSkgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guZ2V0RmlsZSgpLmdldElGaWxlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUhDQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBkbyBzb21ldGhpbmchDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBub3Qgb3BlbmVkIGEgbmV3IGZpbGUuDQotDQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBpY29ucyB3aXRoIHRoZSBuZXcgZWRpdGVkIGNvbmZpZy4NCi0gICAgICAgICAgICAgICAgc2V0Q29uZmlndXJhdGlvbihtRWRpdGVkQ29uZmlnLCBmYWxzZSAvKmZvcmNlKi8pOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBlbmFibGUgdGhlIGNyZWF0ZSBidXR0b24gaWYgdGhlIGN1cnJlbnQgYW5kIGVkaXRlZCBjb25maWcgYXJlIG5vdCBlcXVhbHMNCi0gICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5zZXRFbmFibGVkQ3JlYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRDb25maWcuZXF1YWxzKG1Db25maWdDb21wb3NpdGUuZ2V0Q3VycmVudENvbmZpZygpKSA9PSBmYWxzZSk7DQotDQotICAgICAgICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHRoZSBsYXlvdXQgZG9lc24ndCBjaGFuZ2UsIHRoZSBjb25maWcgY2hhbmdlZCwgYW5kIHJlZmVyZW5jZWQNCi0gICAgICAgICAgICAgICAgLy8gcmVzb3VyY2VzIG5lZWQgdG8gYmUgdXBkYXRlZC4NCi0gICAgICAgICAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBDcmVhdGUgYnV0dG9uDQotICAgICAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUuc2V0RW5hYmxlZENyZWF0ZSh0cnVlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZXJyb3IuDQotICAgICAgICAgICAgICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG1Db25maWdDb21wb3NpdGUuZ2V0Q3VycmVudENvbmZpZygpOw0KLSAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoDQotICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc291cmNlcyBtYXRjaCB0aGUgY29uZmlndXJhdGlvblxuIFxuXHQlMSRzXG4gXG5DaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb3IgY3JlYXRlOlxuIFxuXHRyZXMvJTIkcy8lMyRzXG4gXG5Zb3UgY2FuIGFsc28gY2xpY2sgdGhlICdDcmVhdGUnIGJ1dHRvbiBhYm92ZS4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb25maWcudG9EaXNwbGF5U3RyaW5nKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZy5nZXRGb2xkZXJOYW1lKFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWRpdGVkRmlsZS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGhlbWVDaGFuZ2UoKSB7DQotICAgICAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBPbkNsaXBwaW5nQ2hhbmdlKCkgew0KLSAgICAgICAgICAgIHJlY29tcHV0ZUxheW91dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7DQotICAgICAgICAgICAgTGF5b3V0Q3JlYXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTGF5b3V0Q3JlYXRvckRpYWxvZyhtQ29uZmlnQ29tcG9zaXRlLmdldFNoZWxsKCksDQotICAgICAgICAgICAgICAgICAgICBtRWRpdGVkRmlsZS5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpLA0KLSAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpOw0KLSAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IERpYWxvZy5PSykgew0KLSAgICAgICAgICAgICAgICBmaW5hbCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIGRpYWxvZy5nZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7DQotDQotICAgICAgICAgICAgICAgIGNyZWF0ZUFsdGVybmF0ZUxheW91dChjb25maWcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4+IGdldENvbmZpZ3VyZWRGcmFtZXdvcmtSZXNvdXJjZXMoKSB7DQotICAgICAgICAgICAgaWYgKG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID09IG51bGwgJiYgbUNvbmZpZ0NvbXBvc2l0ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgZnJhbWV3b3JrUmVzID0gZ2V0RnJhbWV3b3JrUmVzb3VyY2VzKCk7DQotDQotICAgICAgICAgICAgICAgIGlmIChmcmFtZXdvcmtSZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAiRmFpbGVkIHRvIGdldCBQcm9qZWN0UmVzb3VyY2UgZm9yIHRoZSBmcmFtZXdvcmsiKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZnJhbWV3b3JrIHJlc291cmNlIHZhbHVlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWcNCi0gICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gZnJhbWV3b3JrUmVzLmdldENvbmZpZ3VyZWRSZXNvdXJjZXMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUuZ2V0Q3VycmVudENvbmZpZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gbUNvbmZpZ3VyZWRGcmFtZXdvcmtSZXM7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBnZXRDb25maWd1cmVkUHJvamVjdFJlc291cmNlcygpIHsNCi0gICAgICAgICAgICBpZiAobUNvbmZpZ3VyZWRQcm9qZWN0UmVzID09IG51bGwgJiYgbUNvbmZpZ0NvbXBvc2l0ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdCA9IGdldFByb2plY3RSZXNvdXJjZXMoKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXkgYXJlIGxvYWRlZA0KLSAgICAgICAgICAgICAgICBwcm9qZWN0LmxvYWRBbGwoKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IHJlc291cmNlIHZhbHVlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWcNCi0gICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRQcm9qZWN0UmVzID0gcHJvamVjdC5nZXRDb25maWd1cmVkUmVzb3VyY2VzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUuZ2V0Q3VycmVudENvbmZpZygpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG1Db25maWd1cmVkUHJvamVjdFJlczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyBhIHtAbGluayBQcm9qZWN0UmVzb3VyY2VzfSBmb3IgdGhlIGZyYW1ld29yayByZXNvdXJjZXMuDQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBmcmFtZXdvcmsgcmVzb3VyY2VzIG9yIG51bGwgaWYgbm90IGZvdW5kLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgUHJvamVjdFJlc291cmNlcyBnZXRGcmFtZXdvcmtSZXNvdXJjZXMoKSB7DQotICAgICAgICAgICAgaWYgKG1FZGl0ZWRGaWxlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU2RrIGN1cnJlbnRTZGsgPSBTZGsuZ2V0Q3VycmVudCgpOw0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBjdXJyZW50U2RrLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGN1cnJlbnRTZGsuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RnJhbWV3b3JrUmVzb3VyY2VzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFByb2plY3RSZXNvdXJjZXMgZ2V0UHJvamVjdFJlc291cmNlcygpIHsNCi0gICAgICAgICAgICBpZiAobUVkaXRlZEZpbGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWFuYWdlci5nZXRQcm9qZWN0UmVzb3VyY2VzKG1FZGl0ZWRGaWxlLmdldFByb2plY3QoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGxheW91dCBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0uDQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbHRlcm5hdGVMYXlvdXQoZmluYWwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0gICAgICAgICAgICBuZXcgSm9iKCJDcmVhdGUgQWx0ZXJuYXRlIFJlc291cmNlIikgew0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmb2xkZXIgbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlck5hbWUgPSBjb25maWcuZ2V0Rm9sZGVyTmFtZShSZXNvdXJjZUZvbGRlclR5cGUuTEFZT1VULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vayB0byBzZWUgaWYgaXQgZXhpc3RzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzIGZvbGRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIElGb2xkZXIgcmVzID0gKElGb2xkZXIpbUVkaXRlZEZpbGUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSByZXMuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdMYXlvdXRGb2xkZXIgPSBuZXcgRmlsZShwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5b3V0Rm9sZGVyLmlzRmlsZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc2luY2UgYWFwdCB3b3VsZCBoYXZlIGNvbXBsYWluZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlLCBidXQgaWYgb25lIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBidWlsZCwgdGhpcyBjb3VsZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXBwZW4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiRmlsZSAncmVzLyUxJHMnIGlzIGluIHRoZSB3YXkhIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiTGF5b3V0IENyZWF0aW9uIiwgbWVzc2FnZSk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3TGF5b3V0Rm9sZGVyLmV4aXN0cygpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5b3V0Rm9sZGVyLm1rZGlyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIGZpbGUNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG5ld0xheW91dEZpbGUgPSBuZXcgRmlsZShuZXdMYXlvdXRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgbUVkaXRlZEZpbGUuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdMYXlvdXRGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG1FZGl0ZWRGaWxlLmdldENvbnRlbnRzKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdMYXlvdXRGaWxlKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzUxMl07DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpbnB1dC5yZWFkKGRhdGEpKSAhPSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Mud3JpdGUoZGF0YSwgMCwgY291bnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2hlcyB0aGUgcmVzIGZvbGRlciB0byBzaG93IHVwIHRoZSBuZXcNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgZm9sZGVyIChpZiBuZWVkZWQpIGFuZCB0aGUgZmlsZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgYSBwcm9ncmVzcyBtb25pdG9yIHRvIGNhdGNoIHRoZSBlbmQgb2YgdGhlIHJlZnJlc2gNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0cmlnZ2VyIHRoZSBlZGl0IG9mIHRoZSBuZXcgZmlsZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IElQcm9ncmVzc01vbml0b3IoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBGaWxlICdyZXMvJTEkcy8lMiRzJyA6ICUzJHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyTmFtZSwgbUVkaXRlZEZpbGUuZ2V0TmFtZSgpLCBlMi5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5kaXNwbGF5RXJyb3IoIkxheW91dCBDcmVhdGlvbiIsIG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlMik7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgRmlsZSAncmVzLyUxJHMvJTIkcycgOiAlMyRzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWUsIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSwgZTIuZ2V0TWVzc2FnZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheUVycm9yKCJMYXlvdXQgQ3JlYXRpb24iLCBtZXNzYWdlKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTIuZ2V0U3RhdHVzKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0uc2NoZWR1bGUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTGlzdGVucyB0byB0YXJnZXQgY2hhbmdlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LCB0byB0cmlnZ2VyIGEgbmV3IGxheW91dCByZW5kZXJpbmcuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGNsYXNzIFRhcmdldExpc3RlbmVyIGltcGxlbWVudHMgSVRhcmdldENoYW5nZUxpc3RlbmVyIHsNCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvamVjdFRhcmdldENoYW5nZShJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCkgew0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkUHJvamVjdCA9PSBnZXRMYXlvdXRFZGl0b3IoKS5nZXRQcm9qZWN0KCkpIHsNCi0gICAgICAgICAgICAgICAgb25UYXJnZXRzTG9hZGVkKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgb25UYXJnZXRzTG9hZGVkKCkgew0KLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIFNESyBjaGFuZ2VkIHdlIG11c3QgcmVzZXQgdGhlIGNvbmZpZ3VyZWQgZnJhbWV3b3JrIHJlc291cmNlLg0KLSAgICAgICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gbnVsbDsNCi0NCi0gICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnVwZGF0ZVVJRnJvbVJlc291cmNlcygpOw0KLQ0KLSAgICAgICAgICAgIC8vIHVwZGF0ZVVpRnJvbUZyYW1ld29yayB3aWxsIHJlc2V0IGxhbmd1YWdlL3JlZ2lvbiBjb21ibywgc28gd2UgbXVzdCBjYWxsDQotICAgICAgICAgICAgLy8gc2V0Q29uZmlndXJhdGlvbiBhZnRlciwgb3IgdGhlIHNldHRleHQgb24gbGFuZ3VhZ2UvcmVnaW9uIHdpbGwgYmUgbG9zdC4NCi0gICAgICAgICAgICBpZiAobUVkaXRlZENvbmZpZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHNldENvbmZpZ3VyYXRpb24obUVkaXRlZENvbmZpZywgZmFsc2UgLypmb3JjZSovKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgY3VzdG9tIHZpZXcgbG9hZGVyLCBzaW5jZSBpdHMgcGFyZW50IGNsYXNzIGxvYWRlciBpcyB0aGUNCi0gICAgICAgICAgICAvLyBicmlkZ2UgY2xhc3MgbG9hZGVyLg0KLSAgICAgICAgICAgIG1Qcm9qZWN0Q2FsbGJhY2sgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIHJlY29tcHV0ZUxheW91dCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVcGRhdGUgdGhlIFVJIGNvbnRyb2xzIHN0YXRlIHdpdGggYSBnaXZlbiB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0uDQotICAgICAqIDxwLz5JZiA8dmFyPmZvcmNlPC92YXI+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0aGUgVUkgd2lsbCBiZSBjaGFuZ2VkIHRvIGV4YWN0bHkgcmVmbGVjdA0KLSAgICAgKiA8dmFyPmNvbmZpZzwvdmFyPiwgb3RoZXJ3aXNlLCBpZiBhIHF1YWxpZmllciBpcyBub3QgcHJlc2VudCBpbiA8dmFyPmNvbmZpZzwvdmFyPiwNCi0gICAgICogdGhlIFVJIGNvbnRyb2wgaXMgbm90IG1vZGlmaWVkLiBIb3dldmVyIGlmIHRoZSB2YWx1ZSBpbiB0aGUgY29udHJvbCBpcyBub3QgdGhlIGRlZmF1bHQgdmFsdWUsDQotICAgICAqIGEgd2FybmluZyBpY29uIGlzIHNob3duLg0KLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0gdG8gc2V0Lg0KLSAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciB0aGUgVUkgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXhhY3RseSBtYXRjaCB0aGUgcmVjZWl2ZWQgY29uZmlndXJhdGlvbi4NCi0gICAgICovDQotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbihGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBmb3JjZSkgew0KLSAgICAgICAgbUVkaXRlZENvbmZpZyA9IGNvbmZpZzsNCi0gICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gbUNvbmZpZ3VyZWRQcm9qZWN0UmVzID0gbnVsbDsNCi0NCi0gICAgICAgIG1Db25maWdDb21wb3NpdGUuc2V0Q29uZmlndXJhdGlvbihjb25maWcsIGZvcmNlKTsNCi0NCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBTYXZlIG9wZXJhdGlvbiBpbiB0aGUgR3JhcGhpY2FsIEVkaXRvciBQYXJ0Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIEluIG91ciB3b3JrZmxvdywgdGhlIG1vZGVsIGlzIG93bmVkIGJ5IHRoZSBTdHJ1Y3R1cmVkIFhNTCBFZGl0b3IuDQotICAgICAqIFRoZSBncmFwaGljYWwgbGF5b3V0IGVkaXRvciBqdXN0IGRpc3BsYXlzIGl0IC0tIHRodXMgd2UgZG9uJ3QgcmVhbGx5DQotICAgICAqIHNhdmUgYW55dGhpbmcgaGVyZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGlzIG11c3QgTk9UIGNhbGwgdGhlIHBhcmVudCBlZGl0b3IgcGFydC4gQXQgdGhlIGNvbnRyYXJ5LCB0aGUgcGFyZW50IGVkaXRvcg0KLSAgICAgKiBwYXJ0IHdpbGwgY2FsbCB0aGlzICphZnRlciogaGF2aW5nIGRvbmUgdGhlIGFjdHVhbCBzYXZlIG9wZXJhdGlvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGUgb25seSBhY3Rpb24gdGhpcyBlZGl0b3IgbXVzdCBkbyBpcyBtYXJrIHRoZSB1bmRvIGNvbW1hbmQgc3RhY2sgYXMNCi0gICAgICogYmVpbmcgbm8gbG9uZ2VyIGRpcnR5Lg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGEgY29tbWFuZCBzdGFjaw0KLS8vICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7DQotLy8gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZSBvcGVyYXRpb24gaW4gdGhlIEdyYXBoaWNhbCBFZGl0b3IgUGFydC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBJbiBvdXIgd29ya2Zsb3csIHRoZSBtb2RlbCBpcyBvd25lZCBieSB0aGUgU3RydWN0dXJlZCBYTUwgRWRpdG9yLg0KLSAgICAgKiBUaGUgZ3JhcGhpY2FsIGxheW91dCBlZGl0b3IganVzdCBkaXNwbGF5cyBpdCAtLSB0aHVzIHdlIGRvbid0IHJlYWxseQ0KLSAgICAgKiBzYXZlIGFueXRoaW5nIGhlcmUuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7DQotICAgICAgICAvLyBwYXNzDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEluIG91ciB3b3JrZmxvdywgdGhlIG1vZGVsIGlzIG93bmVkIGJ5IHRoZSBTdHJ1Y3R1cmVkIFhNTCBFZGl0b3IuDQotICAgICAqIFRoZSBncmFwaGljYWwgbGF5b3V0IGVkaXRvciBqdXN0IGRpc3BsYXlzIGl0IC0tIHRodXMgd2UgZG9uJ3QgcmVhbGx5DQotICAgICAqIHNhdmUgYW55dGhpbmcgaGVyZS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbiBvdXIgd29ya2Zsb3csIHRoZSBtb2RlbCBpcyBvd25lZCBieSB0aGUgU3RydWN0dXJlZCBYTUwgRWRpdG9yLg0KLSAgICAgKiBUaGUgZ3JhcGhpY2FsIGxheW91dCBlZGl0b3IganVzdCBkaXNwbGF5cyBpdCAtLSB0aHVzIHdlIGRvbid0IHJlYWxseQ0KLSAgICAgKiBzYXZlIGFueXRoaW5nIGhlcmUuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzcG9uZHMgdG8gYSBwYWdlIGNoYW5nZSB0aGF0IG1hZGUgdGhlIEdyYXBoaWNhbCBlZGl0b3IgcGFnZSB0aGUgYWN0aXZhdGVkIHBhZ2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoKSB7DQotICAgICAgICBpZiAobU5lZWRzUmVjb21wdXRlIHx8IG1OZWVkc1htbFJlbG9hZCkgew0KLSAgICAgICAgICAgIHJlY29tcHV0ZUxheW91dCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNwb25kcyB0byBhIHBhZ2UgY2hhbmdlIHRoYXQgbWFkZSB0aGUgR3JhcGhpY2FsIGVkaXRvciBwYWdlIHRoZSBkZWFjdGl2YXRlZCBwYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlZCgpIHsNCi0gICAgICAgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlIGZvciBub3cuDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIFVJIGZvciB0aGUgZWRpdGlvbiBvZiBhIG5ldyBmaWxlLg0KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbmV3IGZpbGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBlZGl0TmV3RmlsZShGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsNCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBVSQ0KLSAgICAgICAgc2V0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uLCB0cnVlIC8qZm9yY2UqLyk7DQotDQotICAgICAgICAvLyBlbmFibGUgdGhlIGNyZWF0ZSBidXR0b24gaWYgdGhlIGN1cnJlbnQgYW5kIGVkaXRlZCBjb25maWcgYXJlIG5vdCBlcXVhbHMNCi0gICAgICAgIG1Db25maWdDb21wb3NpdGUuc2V0RW5hYmxlZENyZWF0ZSgNCi0gICAgICAgICAgICAgICAgbUVkaXRlZENvbmZpZy5lcXVhbHMobUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpID09IGZhbHNlKTsNCi0NCi0gICAgICAgIHJlbG9hZENvbmZpZ3VyYXRpb25VaShmYWxzZSAvKm5vdGlmeUxpc3RlbmVyKi8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGlwYm9hcmQgZ2V0Q2xpcGJvYXJkKCkgew0KLSAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExheW91dEVkaXRvciBnZXRMYXlvdXRFZGl0b3IoKSB7DQotICAgICAgICByZXR1cm4gbUxheW91dEVkaXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVWlEb2N1bWVudE5vZGUgZ2V0TW9kZWwoKSB7DQotICAgICAgICByZXR1cm4gbUxheW91dEVkaXRvci5nZXRVaVJvb3ROb2RlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlbGVjdGlvblN5bmNocm9uaXplciBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGJhY2sgZm9yIFhNTCBtb2RlbCBjaGFuZ2VkLiBPbmx5IHVwZGF0ZS9yZWNvbXB1dGUgdGhlIGxheW91dCBpZiB0aGUgZWRpdG9yIGlzIHZpc2libGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIG9uWG1sTW9kZWxDaGFuZ2VkKCkgew0KLSAgICAgICAgaWYgKG1MYXlvdXRFZGl0b3IuaXNHcmFwaGljYWxFZGl0b3JBY3RpdmUoKSkgew0KLSAgICAgICAgICAgIGRvWG1sUmVsb2FkKHRydWUgLyogZm9yY2UgKi8pOw0KLSAgICAgICAgICAgIHJlY29tcHV0ZUxheW91dCgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtTmVlZHNYbWxSZWxvYWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBY3R1YWxseSBwZXJmb3JtcyB0aGUgWE1MIHJlbG9hZA0KLSAgICAgKiBAc2VlICNvblhtbE1vZGVsQ2hhbmdlZCgpDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZG9YbWxSZWxvYWQoYm9vbGVhbiBmb3JjZSkgew0KLSAgICAgICAgaWYgKGZvcmNlIHx8IG1OZWVkc1htbFJlbG9hZCkgew0KLQ0KLSAgICAgICAgICAgIC8vIFRPRE8gOiB1cGRhdGUgdGhlIG1MYXlvdXRDYW52YXMsIHByZXNlcnZpbmcgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLg0KLQ0KLS8vICAgICAgICAgICAgR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOw0KLS8vDQotLy8gICAgICAgICAgICAvLyB0cnkgdG8gcHJlc2VydmUgdGhlIHNlbGVjdGlvbiBiZWZvcmUgY2hhbmdpbmcgdGhlIGNvbnRlbnQNCi0vLyAgICAgICAgICAgIFNlbGVjdGlvbk1hbmFnZXIgc2VsTWFuID0gdmlld2VyLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsNCi0vLyAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsTWFuLmdldFNlbGVjdGlvbigpOw0KLS8vDQotLy8gICAgICAgICAgICB0cnkgew0KLS8vICAgICAgICAgICAgICAgIHZpZXdlci5zZXRDb250ZW50cyhnZXRNb2RlbCgpKTsNCi0vLyAgICAgICAgICAgIH0gZmluYWxseSB7DQotLy8gICAgICAgICAgICAgICAgc2VsTWFuLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOw0KLS8vICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1OZWVkc1htbFJlbG9hZCA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlY29tcHV0ZUxheW91dCgpIHsNCi0gICAgICAgIGRvWG1sUmVsb2FkKGZhbHNlIC8qIGZvcmNlICovKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3RzLiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgYnV0IHRoZSBwcm9qZWN0IGlzIGNsb3NlZA0KLSAgICAgICAgICAgIC8vIG9yIGRlbGV0ZWQgZm9yIHNvbWUgcmVhc29uIChjaGFuZ2VkIGZyb20gb3V0c2lkZSBvZiBlY2xpcHNlKSwgdGhlbiB0aGlzIHdpbGwNCi0gICAgICAgICAgICAvLyByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgaWYgKG1FZGl0ZWRGaWxlLmV4aXN0cygpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiUmVzb3VyY2UgJyUxJHMnIGRvZXMgbm90IGV4aXN0LiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRpdGVkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIElQcm9qZWN0IGlQcm9qZWN0ID0gbUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtRWRpdGVkRmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCIlMSRzIGlzIG91dCBvZiBzeW5jLiBQbGVhc2UgcmVmcmVzaC4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcihtZXNzYWdlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gYWxzbyBwcmludCBpdCBpbiB0aGUgZXJyb3IgY29uc29sZS4NCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoaVByb2plY3QuZ2V0TmFtZSgpLCBtZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRTZGsgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBjdXJyZW50U2RrLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiVGhlIHByb2plY3QgdGFyZ2V0IGlzIG5vdCBzZXQuIik7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGN1cnJlbnRTZGsuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBJdCBjYW4gaGFwcGVuIHRoYXQgdGhlIHdvcmtzcGFjZSByZWZyZXNoZXMgd2hpbGUgdGhlIFNESyBpcyBsb2FkaW5nIGl0cw0KLSAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSwgd2hpY2ggY291bGQgdHJpZ2dlciBhIHJlZHJhdyBvZiB0aGUgb3BlbmVkIGxheW91dCBpZiBzb21lIHJlc291cmNlcw0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCB3aGlsZSBFY2xpcHNlIGlzIGNsb3NlZC4NCi0gICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBkYXRhIGNvdWxkIGJlIG51bGwsIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvci4NCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBqdXN0IHNpbGVudGx5IHJldHVybiwgYXMgYWxsIHRoZSBvcGVuZWQgZWRpdG9ycyBhcmUgYXV0b21hdGljYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaGVkIG9uY2UgdGhlIFNESyBmaW5pc2hlcyBsb2FkaW5nLg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2RrTG9hZFN0YXR1cygpICE9IExvYWRTdGF0dXMuTE9BRElORykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiVGhlIHByb2plY3QgdGFyZ2V0ICglcykgd2FzIG5vdCBwcm9wZXJseSBsb2FkZWQuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgaXMgYWN0dWFsbHkgYSBtb2RlbCAobWF5YmUgdGhlIGZpbGUgaXMgZW1wdHkpLg0KLSAgICAgICAgICAgICAgICBVaURvY3VtZW50Tm9kZSBtb2RlbCA9IGdldE1vZGVsKCk7DQotDQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigiTm8gWG1sIGNvbnRlbnQuIEdvIHRvIHRoZSBPdXRsaW5lIHZpZXcgYW5kIGFkZCBub2Rlcy4iKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBMYXlvdXRCcmlkZ2UgYnJpZGdlID0gZGF0YS5nZXRMYXlvdXRCcmlkZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGJyaWRnZS5icmlkZ2UgIT0gbnVsbCkgeyAvLyBicmlkZ2UgY2FuIG5ldmVyIGJlIG51bGwuDQotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIgcmVzTWFuYWdlciA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0UmVzID0gcmVzTWFuYWdlci5nZXRQcm9qZWN0UmVzb3VyY2VzKGlQcm9qZWN0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0UmVzID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIk1pc3NpbmcgcHJvamVjdCByZXNvdXJjZXMuIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZXMgb2YgdGhlIGZpbGUncyBwcm9qZWN0Lg0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBjb25maWd1cmVkUHJvamVjdFJlcyA9DQotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0xpc3RlbmVyLmdldENvbmZpZ3VyZWRQcm9qZWN0UmVzb3VyY2VzKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGZyYW1ld29yayByZXNvdXJjZXMNCi0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gZnJhbWV3b3JrUmVzb3VyY2VzID0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnTGlzdGVuZXIuZ2V0Q29uZmlndXJlZEZyYW1ld29ya1Jlc291cmNlcygpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyZWRQcm9qZWN0UmVzICE9IG51bGwgJiYgZnJhbWV3b3JrUmVzb3VyY2VzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb2plY3RDYWxsYmFjayA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0Q2FsbGJhY2sgPSBuZXcgUHJvamVjdENhbGxiYWNrKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZS5jbGFzc0xvYWRlciwgcHJvamVjdFJlcywgaVByb2plY3QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxvZ2dlciA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dnZXIgPSBuZXcgSUxheW91dExvZygpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobUVkaXRlZEZpbGUuZ2V0TmFtZSgpLCBtZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSBlcnJvcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXJyb3IuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShBZHRQbHVnaW4uZ2V0RXJyb3JTdHJlYW0oKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKHBzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobUVkaXRlZEZpbGUuZ2V0TmFtZSgpLCBtZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3RlZCB0aGVtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aGVtZSA9IG1Db25maWdDb21wb3NpdGUuZ2V0VGhlbWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gbnVsbCkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVWlFbGVtZW50UHVsbFBhcnNlciBwYXJzZXIgPSBuZXcgVWlFbGVtZW50UHVsbFBhcnNlcihnZXRNb2RlbCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRCb3VuZHMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Byb2plY3RUaGVtZSA9IG1Db25maWdDb21wb3NpdGUuaXNQcm9qZWN0VGhlbWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbnNpdHkgPSBtQ29uZmlnQ29tcG9zaXRlLmdldERlbnNpdHkoKS5nZXREcGlWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ZHBpID0gbUNvbmZpZ0NvbXBvc2l0ZS5nZXRYRHBpKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHlkcGkgPSBtQ29uZmlnQ29tcG9zaXRlLmdldFlEcGkoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUxheW91dFJlc3VsdCByZXN1bHQgPSBjb21wdXRlTGF5b3V0KGJyaWRnZSwgcGFyc2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQcm9qZWN0IC8qIHByb2plY3RLZXkgKi8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsICFtQ29uZmlnQ29tcG9zaXRlLmdldENsaXBwaW5nKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSwgeGRwaSwgeWRwaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZSwgaXNQcm9qZWN0VGhlbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZFByb2plY3RSZXMsIGZyYW1ld29ya1Jlc291cmNlcywgbVByb2plY3RDYWxsYmFjaywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9nZ2VyKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxheW91dENhbnZhcy5zZXRSZXN1bHQocmVzdWx0KTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBVaUVsZW1lbnROb2RlIHdpdGggdGhlIGxheW91dCBpbmZvLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFN1Y2Nlc3MoKSA9PSBJTGF5b3V0UmVzdWx0LlNVQ0NFU1MpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVFcnJvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKHJlc3VsdC5nZXRFcnJvck1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwucmVmcmVzaFVpKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgLy8gU0RLIGlzIGxvYWRlZCBidXQgbm90IHRoZSBsYXlvdXQgbGlicmFyeSENCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGJyaWRnZSBtYW5hZ2VkIHRvIGxvYWQsIG9yIG5vdA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyaWRnZS5zdGF0dXMgPT0gTG9hZFN0YXR1cy5MT0FESU5HKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKCJFY2xpcHNlIGlzIGxvYWRpbmcgZnJhbWV3b3JrIGluZm9ybWF0aW9uIGFuZCB0aGUgbGF5b3V0IGxpYnJhcnkgZnJvbSB0aGUgU0RLIGZvbGRlci5cbiUxJHMgd2lsbCByZWZyZXNoIGF1dG9tYXRpY2FsbHkgb25jZSB0aGUgcHJvY2VzcyBpcyBmaW5pc2hlZC4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRpdGVkRmlsZS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIkVjbGlwc2UgZmFpbGVkIHRvIGxvYWQgdGhlIGZyYW1ld29yayBpbmZvcm1hdGlvbiBhbmQgdGhlIGxheW91dCBsaWJyYXJ5ISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKCJFY2xpcHNlIGlzIGxvYWRpbmcgdGhlIFNESy5cbiUxJHMgd2lsbCByZWZyZXNoIGF1dG9tYXRpY2FsbHkgb25jZSB0aGUgcHJvY2VzcyBpcyBmaW5pc2hlZC4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkaXRlZEZpbGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIC8vIG5vIG1hdHRlciB0aGUgcmVzdWx0LCB3ZSBhcmUgZG9uZSBkb2luZyB0aGUgcmVjb21wdXRlIGJhc2VkIG9uIHRoZSBsYXRlc3QNCi0gICAgICAgICAgICAvLyByZXNvdXJjZS9jb2RlIGNoYW5nZS4NCi0gICAgICAgICAgICBtTmVlZHNSZWNvbXB1dGUgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29tcHV0ZXMgYSBsYXlvdXQgYnkgY2FsbGluZyB0aGUgY29ycmVjdCBjb21wdXRlTGF5b3V0IG1ldGhvZCBvZiBJTGF5b3V0QnJpZGdlIGJhc2VkIG9uDQotICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBBUEkgbGV2ZWwuDQotICAgICAqDQotICAgICAqIEltcGxlbWVudGF0aW9uIGRldGFpbDogdGhlIGJyaWRnZSdzIGNvbXB1dGVMYXlvdXQoKSBtZXRob2QgYWxyZWFkeSByZXR1cm5zIGEgbmV3bHkNCi0gICAgICogYWxsb2NhdGVkIElMYXlvdXJSZXN1bHQuDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBJTGF5b3V0UmVzdWx0IGNvbXB1dGVMYXlvdXQoTGF5b3V0QnJpZGdlIGJyaWRnZSwNCi0gICAgICAgICAgICBJWG1sUHVsbFBhcnNlciBsYXlvdXREZXNjcmlwdGlvbiwgT2JqZWN0IHByb2plY3RLZXksDQotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBib29sZWFuIHJlbmRlckZ1bGxTaXplLA0KLSAgICAgICAgICAgIGludCBkZW5zaXR5LCBmbG9hdCB4ZHBpLCBmbG9hdCB5ZHBpLA0KLSAgICAgICAgICAgIFN0cmluZyB0aGVtZU5hbWUsIGJvb2xlYW4gaXNQcm9qZWN0VGhlbWUsDQotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBwcm9qZWN0UmVzb3VyY2VzLA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gZnJhbWV3b3JrUmVzb3VyY2VzLA0KLSAgICAgICAgICAgIElQcm9qZWN0Q2FsbGJhY2sgcHJvamVjdENhbGxiYWNrLCBJTGF5b3V0TG9nIGxvZ2dlcikgew0KLQ0KLSAgICAgICAgaWYgKGJyaWRnZS5hcGlMZXZlbCA+PSBJTGF5b3V0QnJpZGdlLkFQSV9DVVJSRU5UKSB7DQotICAgICAgICAgICAgLy8gbmV3ZXN0IEFQSSB3aXRoIHN1cHBvcnQgZm9yICJyZW5kZXIgZnVsbCBoZWlnaHQiDQotICAgICAgICAgICAgLy8gVE9ETzogbGluayBib29sZWFuIHRvIFVJLg0KLSAgICAgICAgICAgIHJldHVybiBicmlkZ2UuYnJpZGdlLmNvbXB1dGVMYXlvdXQobGF5b3V0RGVzY3JpcHRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0S2V5LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0LCByZW5kZXJGdWxsU2l6ZSwNCi0gICAgICAgICAgICAgICAgICAgIGRlbnNpdHksIHhkcGksIHlkcGksDQotICAgICAgICAgICAgICAgICAgICB0aGVtZU5hbWUsIGlzUHJvamVjdFRoZW1lLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlcywgZnJhbWV3b3JrUmVzb3VyY2VzLCBwcm9qZWN0Q2FsbGJhY2ssDQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChicmlkZ2UuYXBpTGV2ZWwgPT0gMykgew0KLSAgICAgICAgICAgIC8vIG5ld2VyIGFwaSB3aXRoIGRlbnNpdHkgc3VwcG9ydC4NCi0gICAgICAgICAgICByZXR1cm4gYnJpZGdlLmJyaWRnZS5jb21wdXRlTGF5b3V0KGxheW91dERlc2NyaXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdEtleSwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCwgZGVuc2l0eSwgeGRwaSwgeWRwaSwNCi0gICAgICAgICAgICAgICAgICAgIHRoZW1lTmFtZSwgaXNQcm9qZWN0VGhlbWUsDQotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UmVzb3VyY2VzLCBmcmFtZXdvcmtSZXNvdXJjZXMsIHByb2plY3RDYWxsYmFjaywNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlcik7DQotICAgICAgICB9IGVsc2UgaWYgKGJyaWRnZS5hcGlMZXZlbCA9PSAyKSB7DQotICAgICAgICAgICAgLy8gYXBpIHdpdGggYm9vbGVhbiBmb3Igc2VwYXJhdGlvbiBvZiBwcm9qZWN0L2ZyYW1ld29yayB0aGVtZQ0KLSAgICAgICAgICAgIHJldHVybiBicmlkZ2UuYnJpZGdlLmNvbXB1dGVMYXlvdXQobGF5b3V0RGVzY3JpcHRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0S2V5LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0LCB0aGVtZU5hbWUsIGlzUHJvamVjdFRoZW1lLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlcywgZnJhbWV3b3JrUmVzb3VyY2VzLCBwcm9qZWN0Q2FsbGJhY2ssDQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBvbGRlc3QgYXBpIHdpdGggbm8gZGVuc2l0eS9kcGksIGFuZCBwcm9qZWN0IHRoZW1lIGJvb2xlYW4gbWl4ZWQNCi0gICAgICAgICAgICAvLyBpbnRvIHRoZSB0aGVtZSBuYW1lLg0KLQ0KLSAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgc3RyaW5nIGlmIGl0J3MgYSBjdXN0b20gdGhlbWUgdG8gbWFrZSBzdXJlIHdlIGNhbg0KLSAgICAgICAgICAgIC8vIGRpZmZlcmVudGlhdGUgdGhlbQ0KLSAgICAgICAgICAgIGlmIChpc1Byb2plY3RUaGVtZSkgew0KLSAgICAgICAgICAgICAgICB0aGVtZU5hbWUgPSAiKiIgKyB0aGVtZU5hbWU7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGJyaWRnZS5icmlkZ2UuY29tcHV0ZUxheW91dChsYXlvdXREZXNjcmlwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RLZXksIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHRoZW1lTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RSZXNvdXJjZXMsIGZyYW1ld29ya1Jlc291cmNlcywgcHJvamVjdENhbGxiYWNrLA0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsNCi0gICAgICAgIHJldHVybiBtQ29uZmlnQ29tcG9zaXRlLmdldFNjcmVlbkJvdW5kcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbG9hZFBhbGV0dGUoKSB7DQotICAgICAgICBpZiAobVBhbGV0dGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1QYWxldHRlLnJlbG9hZFBhbGV0dGUobUxheW91dEVkaXRvci5nZXRUYXJnZXREYXRhKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb25VaShib29sZWFuIG5vdGlmeUxpc3RlbmVyKSB7DQotICAgICAgICAvLyBlbmFibGUgdGhlIGNsaXBwaW5nIGJ1dHRvbiBpZiBpdCdzIHN1cHBvcnRlZC4NCi0gICAgICAgIFNkayBjdXJyZW50U2RrID0gU2RrLmdldEN1cnJlbnQoKTsNCi0gICAgICAgIGlmIChjdXJyZW50U2RrICE9IG51bGwpIHsNCi0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBjdXJyZW50U2RrLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOw0KLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBjdXJyZW50U2RrLmdldFRhcmdldERhdGEodGFyZ2V0KTsNCi0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIExheW91dEJyaWRnZSBicmlkZ2UgPSBkYXRhLmdldExheW91dEJyaWRnZSgpOw0KLSAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnJlbG9hZERldmljZXMobm90aWZ5TGlzdGVuZXIpOw0KLSAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnNldENsaXBwaW5nU3VwcG9ydChicmlkZ2UuYXBpTGV2ZWwgPj0gNCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVc2VkIGJ5IExheW91dEVkaXRvci5VaUVkaXRvckFjdGlvbnMuc2VsZWN0VWlOb2RlIHRvIHNlbGVjdCBhIG5ldyBVSSBOb2RlDQotICAgICAqIGNyZWF0ZWQgYnkge0BsaW5rIEVsZW1lbnRDcmVhdGVDb21tYW5kI2V4ZWN1dGUoKX0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aU5vZGVNb2RlbCBUaGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IHRvIHNlbGVjdC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdE1vZGVsKFVpRWxlbWVudE5vZGUgdWlOb2RlTW9kZWwpIHsNCi0NCi0gICAgICAgIC8vIFRPRE8gdGhpcyBtZXRob2Qgd2FzIHVzZWZ1bCBmb3IgR0xFMS4gV2UgbWF5IG5vdCBuZWVkIGl0IGFueW1vcmUgbm93Lg0KLQ0KLS8vICAgICAgICBHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7DQotLy8NCi0vLyAgICAgICAgLy8gR2l2ZSBmb2N1cyB0byB0aGUgZ3JhcGhpY2FsIHZpZXdlciAoaW4gY2FzZSB0aGUgb3V0bGluZSBoYXMgaXQpDQotLy8gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuZm9yY2VGb2N1cygpOw0KLS8vDQotLy8gICAgICAgIE9iamVjdCBlZGl0UGFydCA9IHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHVpTm9kZU1vZGVsKTsNCi0vLw0KLS8vICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgew0KLS8vICAgICAgICAgICAgdmlld2VyLnNlbGVjdCgoRWRpdFBhcnQpZWRpdFBhcnQpOw0KLS8vICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBSZWxvYWRMaXN0ZW5lciBpbXBsZW1lbnRzIElMYXlvdXRSZWxvYWRMaXN0ZW5lciB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLmxheW91dC5MYXlvdXRSZWxvYWRNb25pdG9yLklMYXlvdXRSZWxvYWRMaXN0ZW5lciNyZWxvYWRMYXlvdXQoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikNCi0gICAgICAgICAqDQotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIHRyaWdnZXJlZCBhIHJlZHJhdyBvZiB0aGUgbGF5b3V0DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZExheW91dChib29sZWFuIGNvZGVDaGFuZ2UsIGJvb2xlYW4gckNoYW5nZSwgYm9vbGVhbiByZXNDaGFuZ2UpIHsNCi0gICAgICAgICAgICBib29sZWFuIHJlY29tcHV0ZSA9IHJDaGFuZ2U7DQotDQotICAgICAgICAgICAgaWYgKHJlc0NoYW5nZSkgew0KLSAgICAgICAgICAgICAgICByZWNvbXB1dGUgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc2luZ2xlIGFuZCBtdWx0aSByZXNvdXJjZSBmaWxlIGNoYW5nZWQsIGFuZCB3aGV0aGVyIHRoZSByZXNvdXJjZSBjaGFuZ2UgYWZmZWN0cyB0aGUgY2FjaGUuDQotDQotICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgcmVwYXJzZSBpbiBjYXNlIGEgdmFsdWUgWE1MIGZpbGUgY2hhbmdlZC4NCi0gICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRQcm9qZWN0UmVzID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNhY2hlIGluIHRoZSBicmlkZ2UgaW4gY2FzZSBhIGJpdG1hcC85LXBhdGNoIGNoYW5nZWQuDQotICAgICAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KG1FZGl0ZWRGaWxlLmdldFByb2plY3QoKSk7DQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExheW91dEJyaWRnZSBicmlkZ2UgPSBkYXRhLmdldExheW91dEJyaWRnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmlkZ2UuYnJpZGdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlLmJyaWRnZS5jbGVhckNhY2hlcyhtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtTGF5b3V0Q2FudmFzLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUudXBkYXRlVUlGcm9tUmVzb3VyY2VzKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY29kZUNoYW5nZSkgew0KLSAgICAgICAgICAgICAgICAvLyBvbmx5IHJlY29tcHV0ZSBpZiB0aGUgY3VzdG9tIHZpZXcgbG9hZGVyIHdhcyB1c2VkIHRvIGxvYWQgc29tZSBjb2RlLg0KLSAgICAgICAgICAgICAgICBpZiAobVByb2plY3RDYWxsYmFjayAhPSBudWxsICYmIG1Qcm9qZWN0Q2FsbGJhY2suaXNVc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0Q2FsbGJhY2sgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgcmVjb21wdXRlID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocmVjb21wdXRlKSB7DQotICAgICAgICAgICAgICAgIG1MYXlvdXRDYW52YXMuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXlvdXRFZGl0b3IuaXNHcmFwaGljYWxFZGl0b3JBY3RpdmUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbXB1dGVMYXlvdXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmVlZHNSZWNvbXB1dGUgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9HcmFwaGljYWxMYXlvdXRFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9HcmFwaGljYWxMYXlvdXRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5MDU0Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvR3JhcGhpY2FsTGF5b3V0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5JY29uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuTGF5b3V0RWRpdG9yLlVpRWRpdG9yQWN0aW9uczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuTGF5b3V0UmVsb2FkTW9uaXRvci5JTGF5b3V0UmVsb2FkTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuY29uZmlndXJhdGlvbi5MYXlvdXRDcmVhdG9yRGlhbG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuSUNvbmZpZ0xpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9ycy5WaWV3RWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzLkVsZW1lbnRDcmVhdGVDb21tYW5kOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0cy5VaUVsZW1lbnRFZGl0UGFydDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuVWlFbGVtZW50c0VkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlLkNvcHlDdXRBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZS5QYXN0ZUFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRG9jdW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlByb2plY3RSZXNvdXJjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkxvYWRTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YS5MYXlvdXRCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGsuSVRhcmdldENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSUxheW91dEJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklMYXlvdXRMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JTGF5b3V0UmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVByb2plY3RDYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklSZXNvdXJjZVZhbHVlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JTGF5b3V0UmVzdWx0LklMYXlvdXRWaWV3SW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5kbmQuVGVtcGxhdGVUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aFBhbGV0dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNlbGVjdGlvblN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGF0YUJ1ZmZlckludDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogR3JhcGhpY2FsIGxheW91dCBlZGl0b3IsIGJhc2VkIG9uIEdFRi4KLSAqIDxwLz4KLSAqIFRvIHVuZGVyc3RhbmQgR0VGOiBodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWJyYXJ5L29zLWdlZi8KLSAqIDxwLz4KLSAqIFRvIHVuZGVyc3RhbmQgRHJhZyduJ2Ryb3A6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1Xb3JrYmVuY2gtRE5EL2RyYWdfZHJvcC5odG1sCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbExheW91dEVkaXRvciBleHRlbmRzIEdyYXBoaWNhbEVkaXRvcldpdGhQYWxldHRlCi0gICAgICAgIGltcGxlbWVudHMgSUdyYXBoaWNhbExheW91dEVkaXRvciwgSUNvbmZpZ0xpc3RlbmVyLCBJTGF5b3V0UmVsb2FkTGlzdGVuZXIgewotCi0KLSAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBsYXlvdXQgZWRpdG9yICovCi0gICAgcHJpdmF0ZSBmaW5hbCBMYXlvdXRFZGl0b3IgbUxheW91dEVkaXRvcjsKLQotICAgIC8qKiByZWZlcmVuY2UgdG8gdGhlIGZpbGUgYmVpbmcgZWRpdGVkLiAqLwotICAgIHByaXZhdGUgSUZpbGUgbUVkaXRlZEZpbGU7Ci0KLSAgICBwcml2YXRlIENsaXBib2FyZCBtQ2xpcGJvYXJkOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1QYXJlbnQ7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29tcG9zaXRlIG1Db25maWdDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIFBhbGV0dGVSb290IG1QYWxldHRlUm9vdDsKLQotICAgIC8qKiBUaGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGJlaW5nIGVkaXRlZC4gKi8KLSAgICBwcml2YXRlIEZvbGRlckNvbmZpZ3VyYXRpb24gbUVkaXRlZENvbmZpZzsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBtQ29uZmlndXJlZEZyYW1ld29ya1JlczsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gbUNvbmZpZ3VyZWRQcm9qZWN0UmVzOwotICAgIHByaXZhdGUgUHJvamVjdENhbGxiYWNrIG1Qcm9qZWN0Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBJTGF5b3V0TG9nIG1Mb2dnZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzWG1sUmVsb2FkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkc1JlY29tcHV0ZSA9IGZhbHNlOwotCi0gICAgLyoqIExpc3RlbmVyIHRvIHVwZGF0ZSB0aGUgcm9vdCBub2RlIGlmIHRoZSB0YXJnZXQgb2YgdGhlIGZpbGUgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEKLSAgICAgKiBTREsgbG9jYXRpb24gY2hhbmdlIG9yIGEgcHJvamVjdCB0YXJnZXQgY2hhbmdlICovCi0gICAgcHJpdmF0ZSBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgbVRhcmdldExpc3RlbmVyID0gbmV3IElUYXJnZXRDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9qZWN0VGFyZ2V0Q2hhbmdlKElQcm9qZWN0IGNoYW5nZWRQcm9qZWN0KSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlZFByb2plY3QgPT0gZ2V0TGF5b3V0RWRpdG9yKCkuZ2V0UHJvamVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgb25UYXJnZXRzTG9hZGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRhcmdldHNMb2FkZWQoKSB7Ci0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBTREsgY2hhbmdlZCB3ZSBtdXN0IHJlc2V0IHRoZSBjb25maWd1cmVkIGZyYW1ld29yayByZXNvdXJjZS4KLSAgICAgICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gbnVsbDsKLQotICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS51cGRhdGVVSUZyb21SZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gdXBkYXRlVWlGcm9tRnJhbWV3b3JrIHdpbGwgcmVzZXQgbGFuZ3VhZ2UvcmVnaW9uIGNvbWJvLCBzbyB3ZSBtdXN0IGNhbGwKLSAgICAgICAgICAgIC8vIHNldENvbmZpZ3VyYXRpb24gYWZ0ZXIsIG9yIHRoZSBzZXR0ZXh0IG9uIGxhbmd1YWdlL3JlZ2lvbiB3aWxsIGJlIGxvc3QuCi0gICAgICAgICAgICBpZiAobUVkaXRlZENvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlndXJhdGlvbihtRWRpdGVkQ29uZmlnLCBmYWxzZSAvKmZvcmNlKi8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgcmVtb3ZlIHRoZSBjdXN0b20gdmlldyBsb2FkZXIsIHNpbmNlIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVyIGlzIHRoZQotICAgICAgICAgICAgLy8gYnJpZGdlIGNsYXNzIGxvYWRlci4KLSAgICAgICAgICAgIG1Qcm9qZWN0Q2FsbGJhY2sgPSBudWxsOwotCi0gICAgICAgICAgICByZWNvbXB1dGVMYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1Db25kaXRpb25hbFJlY29tcHV0ZVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUxheW91dEVkaXRvci5pc0dyYXBoaWNhbEVkaXRvckFjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1OZWVkc1JlY29tcHV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVWlVcGRhdGVGcm9tUmVzb3VyY2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUudXBkYXRlVUlGcm9tUmVzb3VyY2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0KLSAgICBwdWJsaWMgR3JhcGhpY2FsTGF5b3V0RWRpdG9yKExheW91dEVkaXRvciBsYXlvdXRFZGl0b3IpIHsKLSAgICAgICAgbUxheW91dEVkaXRvciA9IGxheW91dEVkaXRvcjsKLSAgICAgICAgc2V0RWRpdERvbWFpbihuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcykpOwotICAgICAgICBzZXRQYXJ0TmFtZSgiTGF5b3V0Iik7Ci0KLSAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5hZGRUYXJnZXRMaXN0ZW5lcihtVGFyZ2V0TGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tIGJhc2UgY2xhc3NlcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2w7Ci0KLSAgICAgICAgbUNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLSAgICAgICAgcGFyZW50LnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRvcCBwYXJ0IGZvciB0aGUgY29uZmlndXJhdGlvbiBjb250cm9sCi0gICAgICAgIG1Db25maWdDb21wb3NpdGUgPSBuZXcgQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29tcG9zaXRlIHRoYXQgd2lsbCBjb250YWluIHRoZSBzdGFuZGFyZCBlZGl0b3IgY29udHJvbHMuCi0gICAgICAgIENvbXBvc2l0ZSBlZGl0b3JQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBlZGl0b3JQYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGVkaXRvclBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKGVkaXRvclBhcmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKG1UYXJnZXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZVRhcmdldExpc3RlbmVyKG1UYXJnZXRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtVGFyZ2V0TGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGF5b3V0UmVsb2FkTW9uaXRvci5nZXRNb25pdG9yKCkucmVtb3ZlTGlzdGVuZXIobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpLCB0aGlzKTsKLQotICAgICAgICBpZiAobUNsaXBib2FyZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpcGJvYXJkLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1DbGlwYm9hcmQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBzeW5jaHJvbml6ZXIgb2JqZWN0LgotICAgICAqIFRoZSBzeW5jaHJvbml6ZXIgY2FuIGJlIHVzZWQgdG8gc3luYyB0aGUgc2VsZWN0aW9uIG9mIDIgb3IgbW9yZSBFZGl0UGFydFZpZXdlcnMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgY2hhbmdlZCBmcm9tIHByb3RlY3RlZCB0byBwdWJsaWMgc28gdGhhdCB0aGUgb3V0bGluZSBjYW4gdXNlIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3luY2hyb25pemVyCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlbGVjdGlvblN5bmNocm9uaXplciBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBjaGFuZ2VkIGZyb20gcHJvdGVjdGVkIHRvIHB1YmxpYyBzbyB0aGF0IHRoZSBvdXRsaW5lIGNhbiB1c2UgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWRpdERvbWFpbigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBDcmVhdGVzIHRoZSBwYWxldHRlIHJvb3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBhbGV0dGVSb290IGdldFBhbGV0dGVSb290KCkgewotICAgICAgICBtUGFsZXR0ZVJvb3QgPSBQYWxldHRlRmFjdG9yeS5jcmVhdGVQYWxldHRlUm9vdChtUGFsZXR0ZVJvb3QsCi0gICAgICAgICAgICAgICAgbUxheW91dEVkaXRvci5nZXRUYXJnZXREYXRhKCkpOwotICAgICAgICByZXR1cm4gbVBhbGV0dGVSb290OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGlwYm9hcmQgZ2V0Q2xpcGJvYXJkKCkgewotICAgICAgICByZXR1cm4gbUNsaXBib2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIG9wZXJhdGlvbiBpbiB0aGUgR3JhcGhpY2FsIExheW91dCBFZGl0b3IuCi0gICAgICogPHAvPgotICAgICAqIEluIG91ciB3b3JrZmxvdywgdGhlIG1vZGVsIGlzIG93bmVkIGJ5IHRoZSBTdHJ1Y3R1cmVkIFhNTCBFZGl0b3IuCi0gICAgICogVGhlIGdyYXBoaWNhbCBsYXlvdXQgZWRpdG9yIGp1c3QgZGlzcGxheXMgaXQgLS0gdGh1cyB3ZSBkb24ndCByZWFsbHkKLSAgICAgKiBzYXZlIGFueXRoaW5nIGhlcmUuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbXVzdCBOT1QgY2FsbCB0aGUgcGFyZW50IGVkaXRvciBwYXJ0LiBBdCB0aGUgY29udHJhcnksIHRoZSBwYXJlbnQgZWRpdG9yCi0gICAgICogcGFydCB3aWxsIGNhbGwgdGhpcyAqYWZ0ZXIqIGhhdmluZyBkb25lIHRoZSBhY3R1YWwgc2F2ZSBvcGVyYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBvbmx5IGFjdGlvbiB0aGlzIGVkaXRvciBtdXN0IGRvIGlzIG1hcmsgdGhlIHVuZG8gY29tbWFuZCBzdGFjayBhcwotICAgICAqIGJlaW5nIG5vIGxvbmdlciBkaXJ0eS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIoKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIoKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBkcmFnIHNvdXJjZSBsaXN0ZW5lciBvbiBhbiBlZGl0IHBhcnQgdGhhdCBpcyBhIHZpZXdlci4KLSAgICAgICAgLy8gV2hhdCB0aGlzIGRvZXMgaXMgdXNlIERORCB3aXRoIGEgVGVtcGxhdGVUcmFuc2ZlciB0eXBlIHdoaWNoIGlzIGFjdHVhbGx5Ci0gICAgICAgIC8vIHRoZSBQYWxldHRlVGVtcGxhdGVFbnRyeSBoZWxkIGluIHRoZSBQYWxldHRlUm9vdC4KLSAgICAgICAgVGVtcGxhdGVUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciBkcmFnU291cmNlID0KLSAgICAgICAgICAgIG5ldyBUZW1wbGF0ZVRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKGdldFBhbGV0dGVWaWV3ZXIoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgZHJhZyBzb3VyY2Ugb24gdGhlIHBhbGV0dGUgdmlld2VyLgotICAgICAgICAvLyBTZWUgdGhlIGRyYWcgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgR3JhcGhpY2FsVmlld2VyIGluIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlci4KLSAgICAgICAgZ2V0UGFsZXR0ZVZpZXdlcigpLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihkcmFnU291cmNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmFkb2MpCi0gICAgICogQ29uZmlndXJlIHRoZSBncmFwaGljYWwgdmlld2VyIGJlZm9yZSBpdCByZWNlaXZlcyBpdHMgY29udGVudHMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQotICAgICAgICBHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgICAgIHZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkobmV3IFVpRWxlbWVudHNFZGl0UGFydEZhY3RvcnkobVBhcmVudC5nZXREaXNwbGF5KCkpKTsKLSAgICAgICAgdmlld2VyLnNldFJvb3RFZGl0UGFydChuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpKTsKLQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb2xsb3dpbmcgLS0gd2UgZG9uJ3QgZHJhZyAqZnJvbSogdGhlIEdyYXBoaWNhbFZpZXdlciB5ZXQ6Ci0gICAgICAgIC8vIHZpZXdlci5hZGREcmFnU291cmNlTGlzdGVuZXIobmV3IFRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIodmlld2VyKSk7Ci0KLSAgICAgICAgdmlld2VyLmFkZERyb3BUYXJnZXRMaXN0ZW5lcihuZXcgRHJvcExpc3RlbmVyKHZpZXdlcikpOwotICAgIH0KLQotICAgIGNsYXNzIERyb3BMaXN0ZW5lciBleHRlbmRzIFRlbXBsYXRlVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgRHJvcExpc3RlbmVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikgewotICAgICAgICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gZXhwbGFpbgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KGZpbmFsIE9iamVjdCB0ZW1wbGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIG5ld2x5IGNyZWF0ZWQgRWRpdFBhcnQgc2luY2UgImNyZWF0aW5nIiBuZXcKLSAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgaXMgZG9uZSBieSBFbGVtZW50Q3JlYXRlQ29tbWFuZC5leGVjdXRlKCkgZGlyZWN0bHkgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gbWFuaXB1bGF0aW5nIHRoZSBYTUwgZWxlbWVudHMuLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmFkb2MpCi0gICAgICogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgR3JhcGhpY2FsVmlld2VyIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpIHsKLSAgICAgICAgR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudHMoZ2V0TW9kZWwoKSk7Ci0KLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dClpbnB1dDsKLSAgICAgICAgICAgIG1FZGl0ZWRGaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLQotICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS51cGRhdGVVSUZyb21SZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgTGF5b3V0UmVsb2FkTW9uaXRvci5nZXRNb25pdG9yKCkuYWRkTGlzdGVuZXIobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpLCB0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlYWxseSB0aGlzIHNob3VsZG4ndCBoYXBwZW4hIExvZyBpdCBpbiBjYXNlIGl0IGhhcHBlbnMKLSAgICAgICAgICAgIG1FZGl0ZWRGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIklucHV0IGlzIG5vdCBvZiB0eXBlIEZpbGVFZGl0b3JJbnB1dDogJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1qYXZhZG9jKQotICAgICAqIFNldHMgdGhlIGdyYXBoaWNhbFZpZXdlciBmb3IgdGhpcyBFZGl0b3JQYXJ0LgotICAgICAqIEBwYXJhbSB2aWV3ZXIgdGhlIGdyYXBoaWNhbCB2aWV3ZXIKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotICAgICAgICBzdXBlci5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQotICAgICAgICAvLyBUT0RPOiB2aWV3ZXIuc2V0S2V5SGFuZGxlcigpCi0gICAgICAgIHZpZXdlci5zZXRDb250ZXh0TWVudShjcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IExheW91dEVkaXRvci5VaUVkaXRvckFjdGlvbnMuc2VsZWN0VWlOb2RlIHRvIHNlbGVjdCBhIG5ldyBVSSBOb2RlCi0gICAgICogY3JlYXRlZCBieSB7QGxpbmsgRWxlbWVudENyZWF0ZUNvbW1hbmQjZXhlY3V0ZSgpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1aU5vZGVNb2RlbCBUaGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RNb2RlbChVaUVsZW1lbnROb2RlIHVpTm9kZU1vZGVsKSB7Ci0gICAgICAgIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotICAgICAgICAvLyBHaXZlIGZvY3VzIHRvIHRoZSBncmFwaGljYWwgdmlld2VyIChpbiBjYXNlIHRoZSBvdXRsaW5lIGhhcyBpdCkKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5mb3JjZUZvY3VzKCk7Ci0KLSAgICAgICAgT2JqZWN0IGVkaXRQYXJ0ID0gdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQodWlOb2RlTW9kZWwpOwotCi0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICB2aWV3ZXIuc2VsZWN0KChFZGl0UGFydCllZGl0UGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBMb2NhbCBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIExheW91dEVkaXRvciBnZXRMYXlvdXRFZGl0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtTGF5b3V0RWRpdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVudU1hbmFnZXIgY3JlYXRlQ29udGV4dE1lbnUoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotICAgICAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBtZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgQWN0aW9uTWVudUxpc3RlbmVyKHZpZXdlcikpOwotCi0gICAgICAgIHJldHVybiBtZW51TWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEFjdGlvbk1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEdyYXBoaWNhbFZpZXdlciBtVmlld2VyOwotCi0gICAgICAgIHB1YmxpYyBBY3Rpb25NZW51TGlzdGVuZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotICAgICAgICAgICAgbVZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWVudSBpcyBhYm91dCB0byBiZSBzaG93bi4gVGhlIG1lbnUgbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAqIHJlcXVlc3RlZCB0byByZW1vdmUgYW55IGV4aXN0aW5nIG1lbnUgaXRlbS4gVGhpcyBtZXRob2QgZ2V0cyB0aGUKLSAgICAgICAgICogdHJlZSBzZWxlY3Rpb24gYW5kIGlmIGl0IGlzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGl0IHJlLWNyZWF0ZXMKLSAgICAgICAgICogdGhlIG5lY2Vzc2FyeSBhY3Rpb25zLgotICAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPigpOwotCi0gICAgICAgICAgIC8vIGZpbHRlciBzZWxlY3RlZCBpdGVtcyBhbmQgb25seSBrZWVwIHRob3NlIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogbVZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpKSB7Ci0gICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVWlFbGVtZW50RWRpdFBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICBVaUVsZW1lbnRFZGl0UGFydCBwYXJ0ID0gKFVpRWxlbWVudEVkaXRQYXJ0KSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5vZGUgPSBwYXJ0LmdldFVpTm9kZSgpOwotICAgICAgICAgICAgICAgICAgIGlmICh1aU5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5hZGQodWlOb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpZiAoc2VsZWN0ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgZG9DcmVhdGVNZW51QWN0aW9uKG1hbmFnZXIsIG1WaWV3ZXIsIHNlbGVjdGVkKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvQ3JlYXRlTWVudUFjdGlvbihJTWVudU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIGZpbmFsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIsCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4gc2VsZWN0ZWQpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzWG1sID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFVpRWxlbWVudE5vZGUgdWlOb2RlIDogc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAodWlOb2RlLmdldFhtbE5vZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1htbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1htbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBDb3B5Q3V0QWN0aW9uKG1MYXlvdXRFZGl0b3IsIGdldENsaXBib2FyZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2VsZWN0ZWQsIHRydWUgLyogY3V0ICovKSk7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IENvcHlDdXRBY3Rpb24obUxheW91dEVkaXRvciwgZ2V0Q2xpcGJvYXJkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZWxlY3RlZCwgZmFsc2UgLyogY3V0ICovKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW4ndCBwYXN0ZSB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBzZWxlY3RlZCAodGhlIHNlbGVjdGlvbiBpcyB0aGUgdGFyZ2V0KQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5zaXplKCkgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBQYXN0ZSBpcyBub3QgdmFsaWQgaWYgaXQgd291bGQgYWRkIGEgc2Vjb25kIGVsZW1lbnQgb24gYSB0ZXJtaW5hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHBhcmVudCBpcyBhIGRvY3VtZW50IC0tIGFuIFhNTCBkb2N1bWVudCBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyBwYXN0ZSBpcyB2YWxpZCBpZiB0aGUgY3VycmVudCBVSSBub2RlIGNhbiBoYXZlIGNoaWxkcmVuIG9yIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgaXMgbm90IGEgZG9jdW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlfcm9vdCA9IHNlbGVjdGVkLmdldCgwKS5nZXRVaVJvb3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVpX3Jvb3QuZ2V0RGVzY3JpcHRvcigpLmhhc0NoaWxkcmVuKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKHVpX3Jvb3QuZ2V0VWlQYXJlbnQoKSBpbnN0YW5jZW9mIFVpRG9jdW1lbnROb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IFBhc3RlQWN0aW9uKG1MYXlvdXRFZGl0b3IsIGdldENsaXBib2FyZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmdldCgwKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcHBlbmQgImFkZCIgYW5kICJyZW1vdmUiIGFjdGlvbnMuIFRoZXkgZG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGFkZC9yZW1vdmUKLSAgICAgICAgLy8gYnV0dG9ucyBvbiB0aGUgc2lkZS4KLSAgICAgICAgSWNvbkZhY3RvcnkgZmFjdG9yeSA9IEljb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgZmluYWwgVWlFZGl0b3JBY3Rpb25zIHVpQWN0aW9ucyA9IG1MYXlvdXRFZGl0b3IuZ2V0VWlFZGl0b3JBY3Rpb25zKCk7Ci0KLSAgICAgICAgLy8gIkFkZCIgbWFrZXMgc2Vuc2Ugb25seSBpZiB0aGVyZSdzIDAgb3IgMSBpdGVtIHNlbGVjdGVkIHNpbmNlIHRoZQotICAgICAgICAvLyBvbmUgc2VsZWN0ZWQgaXRlbSBiZWNvbWVzIHRoZSB0YXJnZXQuCi0gICAgICAgIGlmIChzZWxlY3RlZCA9PSBudWxsIHx8IHNlbGVjdGVkLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWN0aW9uKCJBZGQuLi4iLCBmYWN0b3J5LmdldEltYWdlRGVzY3JpcHRvcigiYWRkIikpIHsgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBub2RlID0gc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5zaXplKCkgPiAwID8gc2VsZWN0ZWQuZ2V0KDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHVpQWN0aW9ucy5kb0FkZChub2RlLCB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIlJlbW92ZSIsIGZhY3RvcnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJkZWxldGUiKSkgeyAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB1aUFjdGlvbnMuZG9SZW1vdmUoc2VsZWN0ZWQsIHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIlVwIiwgZmFjdG9yeS5nZXRJbWFnZURlc2NyaXB0b3IoInVwIikpIHsgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdWlBY3Rpb25zLmRvVXAoc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IEFjdGlvbigiRG93biIsIGZhY3RvcnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJkb3duIikpIHsgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdWlBY3Rpb25zLmRvRG93bihzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVJIGZvciB0aGUgZWRpdGlvbiBvZiBhIG5ldyBmaWxlLgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBuZXcgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlZGl0TmV3RmlsZShGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIFVJCi0gICAgICAgIHNldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiwgdHJ1ZSAvKmZvcmNlKi8pOwotCi0gICAgICAgIC8vIGVuYWJsZSB0aGUgY3JlYXRlIGJ1dHRvbiBpZiB0aGUgY3VycmVudCBhbmQgZWRpdGVkIGNvbmZpZyBhcmUgbm90IGVxdWFscwotICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnNldEVuYWJsZWRDcmVhdGUoCi0gICAgICAgICAgICAgICAgbUVkaXRlZENvbmZpZy5lcXVhbHMobUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpID09IGZhbHNlKTsKLQotICAgICAgICByZWxvYWRDb25maWd1cmF0aW9uVWkoZmFsc2UgLypub3RpZnlMaXN0ZW5lciovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgcmV0dXJuIG1Db25maWdDb21wb3NpdGUuZ2V0U2NyZWVuQm91bmRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbiBBbmRyb2lkIFZpZXcgZGVzY3JpYmVkIGJ5IGEge0BsaW5rIFZpZXdFbGVtZW50RGVzY3JpcHRvcn0uCi0gICAgICogPHAvPlRoaXMgdXNlcyB0aGUgPGNvZGU+d3JhcF9jb250ZW50PC9jb2RlPiBtb2RlIGZvciBib3RoIDxjb2RlPmxheW91dF93aWR0aDwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+bGF5b3V0X2hlaWdodDwvY29kZT4sIGFuZCB1c2UgdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSA8Y29kZT50ZXh0PC9jb2RlPiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBjbGFzcyB0byByZW5kZXIuCi0gICAgICogQHJldHVybiBhbiBJbWFnZURhdGEgY29udGFpbmluZyB0aGUgcmVuZGVyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlbmRlcmluZyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGF0YSByZW5kZXJXaWRnZXQoVmlld0VsZW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1FZGl0ZWRGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldERhdGEodGFyZ2V0KTsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMYXlvdXRCcmlkZ2UgYnJpZGdlID0gZGF0YS5nZXRMYXlvdXRCcmlkZ2UoKTsKLQotICAgICAgICBpZiAoYnJpZGdlLmJyaWRnZSAhPSBudWxsKSB7IC8vIGJyaWRnZSBjYW4gbmV2ZXIgYmUgbnVsbC4KLSAgICAgICAgICAgIFJlc291cmNlTWFuYWdlciByZXNNYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIFByb2plY3RDYWxsYmFjayBwcm9qZWN0Q2FsbGJhY2sgPSBudWxsOwotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBjb25maWd1cmVkUHJvamVjdFJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUVkaXRlZEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdFJlcyA9IHJlc01hbmFnZXIuZ2V0UHJvamVjdFJlc291cmNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRGaWxlLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdENhbGxiYWNrID0gbmV3IFByb2plY3RDYWxsYmFjayhicmlkZ2UuY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UmVzLCBtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25maWd1cmVkIHJlc291cmNlcyBmb3IgdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlcyBvZiB0aGUgZmlsZSdzIHByb2plY3QuCi0gICAgICAgICAgICAgICAgaWYgKG1Db25maWd1cmVkUHJvamVjdFJlcyA9PSBudWxsICYmIHByb2plY3RSZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhleSBhcmUgbG9hZGVkCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RSZXMubG9hZEFsbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCByZXNvdXJjZSB2YWx1ZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29uZmlnCi0gICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkUHJvamVjdFJlcyA9IHByb2plY3RSZXMuZ2V0Q29uZmlndXJlZFJlc291cmNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLmdldEN1cnJlbnRDb25maWcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uZmlndXJlZFByb2plY3RSZXNvdXJjZXMgPSBtQ29uZmlndXJlZFByb2plY3RSZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdlIGFic29sdXRlbHkgbmVlZCBhIE1hcCBvZiBjb25maWd1cmVkIHByb2plY3QgcmVzb3VyY2VzLgotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWRQcm9qZWN0UmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4+KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZnJhbWV3b3JrIHJlc291cmNlcwotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBmcmFtZXdvcmtSZXNvdXJjZXMgPQotICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmVkRnJhbWV3b3JrUmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIGlmIChjb25maWd1cmVkUHJvamVjdFJlc291cmNlcyAhPSBudWxsICYmIGZyYW1ld29ya1Jlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3RlZCB0aGVtZQotICAgICAgICAgICAgICAgIFN0cmluZyB0aGVtZSA9IG1Db25maWdDb21wb3NpdGUuZ2V0VGhlbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZW5kZXIgYSBzaW5nbGUgb2JqZWN0IGFzIGRlc2NyaWJlZCBieSB0aGUgVmlld0VsZW1lbnREZXNjcmlwdG9yLgotICAgICAgICAgICAgICAgICAgICBXaWRnZXRQdWxsUGFyc2VyIHBhcnNlciA9IG5ldyBXaWRnZXRQdWxsUGFyc2VyKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICBJTGF5b3V0UmVzdWx0IHJlc3VsdCA9IGNvbXB1dGVMYXlvdXQoYnJpZGdlLCBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBwcm9qZWN0S2V5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogd2lkdGggKi8sIDEgLyogaGVpZ2h0ICovLCB0cnVlIC8qIHJlbmRlckZ1bGxTaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCAvKmRlbnNpdHkqLywgMTYwLmYgLyp4ZHBpKi8sIDE2MC5mIC8qeWRwaSovLCB0aGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLmlzUHJvamVjdFRoZW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZFByb2plY3RSZXNvdXJjZXMsIGZyYW1ld29ya1Jlc291cmNlcywgcHJvamVjdENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbG9nZ2VyICovKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIFVpRWxlbWVudE5vZGUgd2l0aCB0aGUgbGF5b3V0IGluZm8uCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0U3VjY2VzcygpID09IElMYXlvdXRSZXN1bHQuU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBsYXJnZUltYWdlID0gcmVzdWx0LmdldEltYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzaXplIGl0IHRvIHRoZSBhY3R1YWwgd2lkZ2V0IHNpemUsIGFuZCBjb252ZXJ0IGl0IGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNXVCBpbWFnZSBvYmplY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSByZXN1bHQuZ2V0Um9vdFZpZXcoKS5nZXRSaWdodCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHJlc3VsdC5nZXRSb290VmlldygpLmdldEJvdHRvbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmFzdGVyIHJhc3RlciA9IGxhcmdlSW1hZ2UuZ2V0RGF0YShuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKHdpZHRoLCBoZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGltYWdlRGF0YUJ1ZmZlciA9ICgoRGF0YUJ1ZmZlckludClyYXN0ZXIuZ2V0RGF0YUJ1ZmZlcigpKS5nZXREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFsZXR0ZURhdGEoMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDAsIGltYWdlRGF0YUJ1ZmZlci5sZW5ndGgsIGltYWdlRGF0YUJ1ZmZlciwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZURhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkcyB0aGlzIGVkaXRvciwgYnkgZ2V0dGluZyB0aGUgbmV3IG1vZGVsIGZyb20gdGhlIHtAbGluayBMYXlvdXRFZGl0b3J9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbG9hZEVkaXRvcigpIHsKLSAgICAgICAgR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudHMoZ2V0TW9kZWwoKSk7Ci0KLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gbUxheW91dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0KLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dClpbnB1dDsKLSAgICAgICAgICAgIG1FZGl0ZWRGaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlYWxseSB0aGlzIHNob3VsZG4ndCBoYXBwZW4hIExvZyBpdCBpbiBjYXNlIGl0IGhhcHBlbnMKLSAgICAgICAgICAgIG1FZGl0ZWRGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIklucHV0IGlzIG5vdCBvZiB0eXBlIEZpbGVFZGl0b3JJbnB1dDogJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgZm9yIFhNTCBtb2RlbCBjaGFuZ2VkLiBPbmx5IHVwZGF0ZS9yZWNvbXB1dGUgdGhlIGxheW91dCBpZiB0aGUgZWRpdG9yIGlzIHZpc2libGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblhtbE1vZGVsQ2hhbmdlZCgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXRFZGl0b3IuaXNHcmFwaGljYWxFZGl0b3JBY3RpdmUoKSkgewotICAgICAgICAgICAgZG9YbWxSZWxvYWQodHJ1ZSAvKiBmb3JjZSAqLyk7Ci0gICAgICAgICAgICByZWNvbXB1dGVMYXlvdXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1OZWVkc1htbFJlbG9hZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3R1YWxseSBwZXJmb3JtcyB0aGUgWE1MIHJlbG9hZAotICAgICAqIEBzZWUgI29uWG1sTW9kZWxDaGFuZ2VkKCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9YbWxSZWxvYWQoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoZm9yY2UgfHwgbU5lZWRzWG1sUmVsb2FkKSB7Ci0gICAgICAgICAgICBHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLSAgICAgICAgICAgIC8vIHRyeSB0byBwcmVzZXJ2ZSB0aGUgc2VsZWN0aW9uIGJlZm9yZSBjaGFuZ2luZyB0aGUgY29udGVudAotICAgICAgICAgICAgU2VsZWN0aW9uTWFuYWdlciBzZWxNYW4gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uTWFuYWdlcigpOwotICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxNYW4uZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmlld2VyLnNldENvbnRlbnRzKGdldE1vZGVsKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzZWxNYW4uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1OZWVkc1htbFJlbG9hZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBVSSBjb250cm9scyBzdGF0ZSB3aXRoIGEgZ2l2ZW4ge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259LgotICAgICAqIDxwLz5JZiA8dmFyPmZvcmNlPC92YXI+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0aGUgVUkgd2lsbCBiZSBjaGFuZ2VkIHRvIGV4YWN0bHkgcmVmbGVjdAotICAgICAqIDx2YXI+Y29uZmlnPC92YXI+LCBvdGhlcndpc2UsIGlmIGEgcXVhbGlmaWVyIGlzIG5vdCBwcmVzZW50IGluIDx2YXI+Y29uZmlnPC92YXI+LAotICAgICAqIHRoZSBVSSBjb250cm9sIGlzIG5vdCBtb2RpZmllZC4gSG93ZXZlciBpZiB0aGUgdmFsdWUgaW4gdGhlIGNvbnRyb2wgaXMgbm90IHRoZSBkZWZhdWx0IHZhbHVlLAotICAgICAqIGEgd2FybmluZyBpY29uIGlzIHNob3duLgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufSB0byBzZXQuCi0gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgdGhlIFVJIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2VpdmVkIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgdm9pZCBzZXRDb25maWd1cmF0aW9uKEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIG1FZGl0ZWRDb25maWcgPSBjb25maWc7Ci0gICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gbUNvbmZpZ3VyZWRQcm9qZWN0UmVzID0gbnVsbDsKLQotICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnNldENvbmZpZ3VyYXRpb24oY29uZmlnLCBmb3JjZSk7Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBVaURvY3VtZW50Tm9kZSBnZXRNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXlvdXRFZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbG9hZFBhbGV0dGUoKSB7Ci0gICAgICAgIFBhbGV0dGVGYWN0b3J5LmNyZWF0ZVBhbGV0dGVSb290KG1QYWxldHRlUm9vdCwgbUxheW91dEVkaXRvci5nZXRUYXJnZXREYXRhKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb25VaShib29sZWFuIG5vdGlmeUxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIGVuYWJsZSB0aGUgY2xpcHBpbmcgYnV0dG9uIGlmIGl0J3Mgc3VwcG9ydGVkLgotICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyZW50U2RrICE9IG51bGwpIHsKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IGN1cnJlbnRTZGsuZ2V0VGFyZ2V0KG1FZGl0ZWRGaWxlLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBBbmRyb2lkVGFyZ2V0RGF0YSBkYXRhID0gY3VycmVudFNkay5nZXRUYXJnZXREYXRhKHRhcmdldCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGF5b3V0QnJpZGdlIGJyaWRnZSA9IGRhdGEuZ2V0TGF5b3V0QnJpZGdlKCk7Ci0gICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5yZWxvYWREZXZpY2VzKG5vdGlmeUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLnNldENsaXBwaW5nU3VwcG9ydChicmlkZ2UuYXBpTGV2ZWwgPj0gNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyBmb3IgYSBmaWxlIG1hdGNoaW5nIHRoZSBuZXcge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGFuZCBhdHRlbXB0cyB0byBvcGVuIGl0LgotICAgICAqIDxwLz5JZiB0aGVyZSBpcyBubyBtYXRjaCwgbm90aWZ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZSgpIHsKLSAgICAgICAgbUNvbmZpZ3VyZWRGcmFtZXdvcmtSZXMgPSBtQ29uZmlndXJlZFByb2plY3RSZXMgPSBudWxsOwotCi0gICAgICAgIGlmIChtRWRpdGVkRmlsZSA9PSBudWxsIHx8IG1FZGl0ZWRDb25maWcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZXMgb2YgdGhlIGZpbGUncyBwcm9qZWN0LgotICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHJlc291cmNlcyA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgbUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpKTsKLQotICAgICAgICAvLyBmcm9tIHRoZSByZXNvdXJjZXMsIGxvb2sgZm9yIGEgbWF0Y2hpbmcgZmlsZQotICAgICAgICBSZXNvdXJjZUZpbGUgbWF0Y2ggPSBudWxsOwotICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hdGNoID0gcmVzb3VyY2VzLmdldE1hdGNoaW5nRmlsZShtRWRpdGVkRmlsZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlLkxBWU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLmdldEN1cnJlbnRDb25maWcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1hdGNoLmdldEZpbGUoKS5lcXVhbHMobUVkaXRlZEZpbGUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5nZXRGaWxlKCkuZ2V0SUZpbGUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZSEKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGRvIHNvbWV0aGluZyEKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm90IG9wZW5lZCBhIG5ldyBmaWxlLgotCi0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaWNvbnMgd2l0aCB0aGUgbmV3IGVkaXRlZCBjb25maWcuCi0gICAgICAgICAgICBzZXRDb25maWd1cmF0aW9uKG1FZGl0ZWRDb25maWcsIGZhbHNlIC8qZm9yY2UqLyk7Ci0KLSAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY3JlYXRlIGJ1dHRvbiBpZiB0aGUgY3VycmVudCBhbmQgZWRpdGVkIGNvbmZpZyBhcmUgbm90IGVxdWFscwotICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5zZXRFbmFibGVkQ3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBtRWRpdGVkQ29uZmlnLmVxdWFscyhtQ29uZmlnQ29tcG9zaXRlLmdldEN1cnJlbnRDb25maWcoKSkgPT0gZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBFdmVuIHRob3VnaCB0aGUgbGF5b3V0IGRvZXNuJ3QgY2hhbmdlLCB0aGUgY29uZmlnIGNoYW5nZWQsIGFuZCByZWZlcmVuY2VkCi0gICAgICAgICAgICAvLyByZXNvdXJjZXMgbmVlZCB0byBiZSB1cGRhdGVkLgotICAgICAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBlbmFibGUgdGhlIENyZWF0ZSBidXR0b24KLSAgICAgICAgICAgIG1Db25maWdDb21wb3NpdGUuc2V0RW5hYmxlZENyZWF0ZSh0cnVlKTsKLQotICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgZXJyb3IuCi0gICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBtQ29uZmlnQ29tcG9zaXRlLmdldEN1cnJlbnRDb25maWcoKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIk5vIHJlc291cmNlcyBtYXRjaCB0aGUgY29uZmlndXJhdGlvblxuIFxuXHQlMSRzXG4gXG5DaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb3IgY3JlYXRlOlxuIFxuXHRyZXMvJTIkcy8lMyRzXG4gXG5Zb3UgY2FuIGFsc28gY2xpY2sgdGhlICdDcmVhdGUnIGJ1dHRvbiBhYm92ZS4iLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnLnRvRGlzcGxheVN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnLmdldEZvbGRlck5hbWUoUmVzb3VyY2VGb2xkZXJUeXBlLkxBWU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgbUVkaXRlZEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNob3dFcnJvckluRWRpdG9yKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UaGVtZUNoYW5nZSgpIHsKLSAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgT25DbGlwcGluZ0NoYW5nZSgpIHsKLSAgICAgICAgcmVjb21wdXRlTGF5b3V0KCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKLSAgICAgICAgTGF5b3V0Q3JlYXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTGF5b3V0Q3JlYXRvckRpYWxvZyhtUGFyZW50LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgbUVkaXRlZEZpbGUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KG1FZGl0ZWRGaWxlLmdldFByb2plY3QoKSksCi0gICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpOwotICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLSAgICAgICAgICAgIGZpbmFsIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGRpYWxvZy5nZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0KLSAgICAgICAgICAgIGNyZWF0ZUFsdGVybmF0ZUxheW91dChjb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb21wdXRlcyB0aGUgbGF5b3V0IHdpdGggdGhlIGhlbHAgb2YgbGF5b3V0bGliLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY29tcHV0ZUxheW91dCgpIHsKLSAgICAgICAgZG9YbWxSZWxvYWQoZmFsc2UgLyogZm9yY2UgKi8pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3RzLiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgYnV0IHRoZSBwcm9qZWN0IGlzIGNsb3NlZAotICAgICAgICAgICAgLy8gb3IgZGVsZXRlZCBmb3Igc29tZSByZWFzb24gKGNoYW5nZWQgZnJvbSBvdXRzaWRlIG9mIGVjbGlwc2UpLCB0aGVuIHRoaXMgd2lsbAotICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1FZGl0ZWRGaWxlLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJSZXNvdXJjZSAnJTEkcycgZG9lcyBub3QgZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBzaG93RXJyb3JJbkVkaXRvcihtZXNzYWdlKTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVByb2plY3QgaVByb2plY3QgPSBtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIGlmIChtRWRpdGVkRmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIiUxJHMgaXMgb3V0IG9mIHN5bmMuIFBsZWFzZSByZWZyZXNoLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWRpdGVkRmlsZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgc2hvd0Vycm9ySW5FZGl0b3IobWVzc2FnZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhbHNvIHByaW50IGl0IGluIHRoZSBlcnJvciBjb25zb2xlLgotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGlQcm9qZWN0LmdldE5hbWUoKSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gY3VycmVudFNkay5nZXRUYXJnZXQobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9ySW5FZGl0b3IoIlRoZSBwcm9qZWN0IHRhcmdldCBpcyBub3Qgc2V0LiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGN1cnJlbnRTZGsuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgY2FuIGhhcHBlbiB0aGF0IHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGVzIHdoaWxlIHRoZSBTREsgaXMgbG9hZGluZyBpdHMKLSAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSwgd2hpY2ggY291bGQgdHJpZ2dlciBhIHJlZHJhdyBvZiB0aGUgb3BlbmVkIGxheW91dCBpZiBzb21lIHJlc291cmNlcwotICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIHdoaWxlIEVjbGlwc2UgaXMgY2xvc2VkLgotICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZGF0YSBjb3VsZCBiZSBudWxsLCBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBqdXN0IHNpbGVudGx5IHJldHVybiwgYXMgYWxsIHRoZSBvcGVuZWQgZWRpdG9ycyBhcmUgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoZWQgb25jZSB0aGUgU0RLIGZpbmlzaGVzIGxvYWRpbmcuCi0gICAgICAgICAgICAgICAgICAgIGlmIChBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNka0xvYWRTdGF0dXMoKSAhPSBMb2FkU3RhdHVzLkxPQURJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvckluRWRpdG9yKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcHJvamVjdCB0YXJnZXQgKCVzKSB3YXMgbm90IHByb3Blcmx5IGxvYWRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZXJlIGlzIGFjdHVhbGx5IGEgbW9kZWwgKG1heWJlIHRoZSBmaWxlIGlzIGVtcHR5KS4KLSAgICAgICAgICAgICAgICBVaURvY3VtZW50Tm9kZSBtb2RlbCA9IGdldE1vZGVsKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dFcnJvckluRWRpdG9yKCJObyBYbWwgY29udGVudC4gR28gdG8gdGhlIE91dGxpbmUgdmlldyBhbmQgYWRkIG5vZGVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTGF5b3V0QnJpZGdlIGJyaWRnZSA9IGRhdGEuZ2V0TGF5b3V0QnJpZGdlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnJpZGdlLmJyaWRnZSAhPSBudWxsKSB7IC8vIGJyaWRnZSBjYW4gbmV2ZXIgYmUgbnVsbC4KLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyIHJlc01hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHByb2plY3RSZXMgPSByZXNNYW5hZ2VyLmdldFByb2plY3RSZXNvdXJjZXMoaVByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdFJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlcyBvZiB0aGUgZmlsZSdzIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gY29uZmlndXJlZFByb2plY3RSZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJlZFByb2plY3RSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGZyYW1ld29yayByZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBmcmFtZXdvcmtSZXNvdXJjZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJlZEZyYW1ld29ya1Jlc291cmNlcygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmVkUHJvamVjdFJlcyAhPSBudWxsICYmIGZyYW1ld29ya1Jlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb2plY3RDYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2plY3RDYWxsYmFjayA9IG5ldyBQcm9qZWN0Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2UuY2xhc3NMb2FkZXIsIHByb2plY3RSZXMsIGlQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dnZXIgPSBuZXcgSUxheW91dExvZygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKG1FZGl0ZWRGaWxlLmdldE5hbWUoKSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihUaHJvd2FibGUgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXJyb3IuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oQWR0UGx1Z2luLmdldEVycm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKHBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShtRWRpdGVkRmlsZS5nZXROYW1lKCksIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3RlZCB0aGVtZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRoZW1lID0gbUNvbmZpZ0NvbXBvc2l0ZS5nZXRUaGVtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZW1lICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudFB1bGxQYXJzZXIgcGFyc2VyID0gbmV3IFVpRWxlbWVudFB1bGxQYXJzZXIoZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJvamVjdFRoZW1lID0gbUNvbmZpZ0NvbXBvc2l0ZS5pc1Byb2plY3RUaGVtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbnNpdHkgPSBtQ29uZmlnQ29tcG9zaXRlLmdldERlbnNpdHkoKS5nZXREcGlWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhkcGkgPSBtQ29uZmlnQ29tcG9zaXRlLmdldFhEcGkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5ZHBpID0gbUNvbmZpZ0NvbXBvc2l0ZS5nZXRZRHBpKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGF5b3V0UmVzdWx0IHJlc3VsdCA9IGNvbXB1dGVMYXlvdXQoYnJpZGdlLCBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUHJvamVjdCAvKiBwcm9qZWN0S2V5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsICFtQ29uZmlnQ29tcG9zaXRlLmdldENsaXBwaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5zaXR5LCB4ZHBpLCB5ZHBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUsIGlzUHJvamVjdFRoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZFByb2plY3RSZXMsIGZyYW1ld29ya1Jlc291cmNlcywgbVByb2plY3RDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dnZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBVaUVsZW1lbnROb2RlIHdpdGggdGhlIGxheW91dCBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0U3VjY2VzcygpID09IElMYXlvdXRSZXN1bHQuU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRFZGl0RGF0YShyZXN1bHQuZ2V0SW1hZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTm9kZVdpdGhCb3VuZHMocmVzdWx0LmdldFJvb3RWaWV3KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzdWx0LmdldEVycm9yTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZGl0IGRhdGEgZm9yIGFsbCB0aGUgbm9kZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Tm9kZUJvdW5kcyhtb2RlbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBlcnJvciBpbiB0aGUgdG9wIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRFZGl0RGF0YShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnJlZnJlc2hVaSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU0RLIGlzIGxvYWRlZCBidXQgbm90IHRoZSBsYXlvdXQgbGlicmFyeSEKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBicmlkZ2UgbWFuYWdlZCB0byBsb2FkLCBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyaWRnZS5zdGF0dXMgPT0gTG9hZFN0YXR1cy5MT0FESU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjbGlwc2UgaXMgbG9hZGluZyBmcmFtZXdvcmsgaW5mb3JtYXRpb24gYW5kIHRoZSBMYXlvdXQgbGlicmFyeSBmcm9tIHRoZSBTREsgZm9sZGVyLlxuJTEkcyB3aWxsIHJlZnJlc2ggYXV0b21hdGljYWxseSBvbmNlIHRoZSBwcm9jZXNzIGlzIGZpbmlzaGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiRWNsaXBzZSBmYWlsZWQgdG8gbG9hZCB0aGUgZnJhbWV3b3JrIGluZm9ybWF0aW9uIGFuZCB0aGUgTGF5b3V0IGxpYnJhcnkhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9ySW5FZGl0b3IobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRWNsaXBzZSBpcyBsb2FkaW5nIHRoZSBTREsuXG4lMSRzIHdpbGwgcmVmcmVzaCBhdXRvbWF0aWNhbGx5IG9uY2UgdGhlIHByb2Nlc3MgaXMgZmluaXNoZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBzaG93RXJyb3JJbkVkaXRvcihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIG5vIG1hdHRlciB0aGUgcmVzdWx0LCB3ZSBhcmUgZG9uZSBkb2luZyB0aGUgcmVjb21wdXRlIGJhc2VkIG9uIHRoZSBsYXRlc3QKLSAgICAgICAgICAgIC8vIHJlc291cmNlL2NvZGUgY2hhbmdlLgotICAgICAgICAgICAgbU5lZWRzUmVjb21wdXRlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0Vycm9ySW5FZGl0b3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBtb2RlbCB0byBkaXNwbGF5IHRoZSBlcnJvciBkaXJlY3RseSBpbiB0aGUgZWRpdG9yCi0gICAgICAgIFVpRG9jdW1lbnROb2RlIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQotICAgICAgICAvLyBSZXNldCB0aGUgZWRpdCBkYXRhIGZvciBhbGwgdGhlIG5vZGVzLgotICAgICAgICByZXNldE5vZGVCb3VuZHMobW9kZWwpOwotCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNldCB0aGUgZXJyb3IgaW4gdGhlIHRvcCBlbGVtZW50LgotICAgICAgICAgICAgbW9kZWwuc2V0RWRpdERhdGEobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlbC5yZWZyZXNoVWkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXROb2RlQm91bmRzKFVpRWxlbWVudE5vZGUgbm9kZSkgewotICAgICAgICBub2RlLnNldEVkaXREYXRhKG51bGwpOwotCi0gICAgICAgIExpc3Q8VWlFbGVtZW50Tm9kZT4gY2hpbGRyZW4gPSBub2RlLmdldFVpQ2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIHJlc2V0Tm9kZUJvdW5kcyhjaGlsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm9kZVdpdGhCb3VuZHMoSUxheW91dFZpZXdJbmZvIHIpIHsKLSAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBub2RlIGl0c2VsZiwgYXMgdGhlIHZpZXdLZXkgaXMgdGhlIFhNTCBub2RlIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICBPYmplY3Qgdmlld0tleSA9IHIuZ2V0Vmlld0tleSgpOwotICAgICAgICAgICAgaWYgKHZpZXdLZXkgaW5zdGFuY2VvZiBVaUVsZW1lbnROb2RlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoci5nZXRMZWZ0KCksIHIuZ2V0VG9wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByLmdldFJpZ2h0KCktci5nZXRMZWZ0KCksIHIuZ2V0Qm90dG9tKCkgLSByLmdldFRvcCgpKTsKLQotICAgICAgICAgICAgICAgICgoVWlFbGVtZW50Tm9kZSl2aWV3S2V5KS5zZXRFZGl0RGF0YShib3VuZHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhbmQgdGhlbiBpdHMgY2hpbGRyZW4uCi0gICAgICAgICAgICBJTGF5b3V0Vmlld0luZm9bXSBjaGlsZHJlbiA9IHIuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJTGF5b3V0Vmlld0luZm8gY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb2RlV2l0aEJvdW5kcyhjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLmxheW91dC5MYXlvdXRSZWxvYWRNb25pdG9yLklMYXlvdXRSZWxvYWRMaXN0ZW5lciNyZWxvYWRMYXlvdXQoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKLSAgICAgKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgdHJpZ2dlcmVkIGEgcmVkcmF3IG9mIHRoZSBsYXlvdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxvYWRMYXlvdXQoYm9vbGVhbiBjb2RlQ2hhbmdlLCBib29sZWFuIHJDaGFuZ2UsIGJvb2xlYW4gcmVzQ2hhbmdlKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVjb21wdXRlID0gckNoYW5nZTsKLQotICAgICAgICBpZiAocmVzQ2hhbmdlKSB7Ci0gICAgICAgICAgICByZWNvbXB1dGUgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc2luZ2xlIGFuZCBtdWx0aSByZXNvdXJjZSBmaWxlIGNoYW5nZWQsIGFuZCB3aGV0aGVyIHRoZSByZXNvdXJjZSBjaGFuZ2UgYWZmZWN0cyB0aGUgY2FjaGUuCi0KLSAgICAgICAgICAgIC8vIGZvcmNlIGEgcmVwYXJzZSBpbiBjYXNlIGEgdmFsdWUgWE1MIGZpbGUgY2hhbmdlZC4KLSAgICAgICAgICAgIG1Db25maWd1cmVkUHJvamVjdFJlcyA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZSBpbiB0aGUgYnJpZGdlIGluIGNhc2UgYSBiaXRtYXAvOS1wYXRjaCBjaGFuZ2VkLgotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQobUVkaXRlZEZpbGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0QnJpZGdlIGJyaWRnZSA9IGRhdGEuZ2V0TGF5b3V0QnJpZGdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyaWRnZS5icmlkZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlLmJyaWRnZS5jbGVhckNhY2hlcyhtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUGFyZW50LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobVVpVXBkYXRlRnJvbVJlc291cmNlc1J1bm5hYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2RlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IHJlY29tcHV0ZSBpZiB0aGUgY3VzdG9tIHZpZXcgbG9hZGVyIHdhcyB1c2VkIHRvIGxvYWQgc29tZSBjb2RlLgotICAgICAgICAgICAgaWYgKG1Qcm9qZWN0Q2FsbGJhY2sgIT0gbnVsbCAmJiBtUHJvamVjdENhbGxiYWNrLmlzVXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByb2plY3RDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmVjb21wdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWNvbXB1dGUpIHsKLSAgICAgICAgICAgIG1QYXJlbnQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhtQ29uZGl0aW9uYWxSZWNvbXB1dGVSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNwb25kcyB0byBhIHBhZ2UgY2hhbmdlIHRoYXQgbWFkZSB0aGUgR3JhcGhpY2FsIGVkaXRvciBwYWdlIHRoZSBhY3RpdmF0ZWQgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoKSB7Ci0gICAgICAgIGlmIChtTmVlZHNSZWNvbXB1dGUgfHwgbU5lZWRzWG1sUmVsb2FkKSB7Ci0gICAgICAgICAgICByZWNvbXB1dGVMYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3BvbmRzIHRvIGEgcGFnZSBjaGFuZ2UgdGhhdCBtYWRlIHRoZSBHcmFwaGljYWwgZWRpdG9yIHBhZ2UgdGhlIGRlYWN0aXZhdGVkIHBhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlZCgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGhlcmUgZm9yIG5vdy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBnZXRDb25maWd1cmVkRnJhbWV3b3JrUmVzb3VyY2VzKCkgewotICAgICAgICBpZiAobUNvbmZpZ3VyZWRGcmFtZXdvcmtSZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyBmcmFtZXdvcmtSZXMgPSBnZXRGcmFtZXdvcmtSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgaWYgKGZyYW1ld29ya1JlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAiRmFpbGVkIHRvIGdldCBQcm9qZWN0UmVzb3VyY2UgZm9yIHRoZSBmcmFtZXdvcmsiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmcmFtZXdvcmsgcmVzb3VyY2UgdmFsdWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbmZpZwotICAgICAgICAgICAgICAgIG1Db25maWd1cmVkRnJhbWV3b3JrUmVzID0gZnJhbWV3b3JrUmVzLmdldENvbmZpZ3VyZWRSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnQ29tcG9zaXRlLmdldEN1cnJlbnRDb25maWcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbmZpZ3VyZWRGcmFtZXdvcmtSZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gZ2V0Q29uZmlndXJlZFByb2plY3RSZXNvdXJjZXMoKSB7Ci0gICAgICAgIGlmIChtQ29uZmlndXJlZFByb2plY3RSZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0ID0gZ2V0UHJvamVjdFJlc291cmNlcygpOwotCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhleSBhcmUgbG9hZGVkCi0gICAgICAgICAgICBwcm9qZWN0LmxvYWRBbGwoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IHJlc291cmNlIHZhbHVlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIG1Db25maWd1cmVkUHJvamVjdFJlcyA9IHByb2plY3QuZ2V0Q29uZmlndXJlZFJlc291cmNlcygKLSAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NvbXBvc2l0ZS5nZXRDdXJyZW50Q29uZmlnKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Db25maWd1cmVkUHJvamVjdFJlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFByb2plY3RSZXNvdXJjZXN9IGZvciB0aGUgZnJhbWV3b3JrIHJlc291cmNlcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBmcmFtZXdvcmsgcmVzb3VyY2VzIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0UmVzb3VyY2VzIGdldEZyYW1ld29ya1Jlc291cmNlcygpIHsKLSAgICAgICAgaWYgKG1FZGl0ZWRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNkayBjdXJyZW50U2RrID0gU2RrLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50U2RrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBjdXJyZW50U2RrLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBjdXJyZW50U2RrLmdldFRhcmdldERhdGEodGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5nZXRGcmFtZXdvcmtSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9qZWN0UmVzb3VyY2VzIGdldFByb2plY3RSZXNvdXJjZXMoKSB7Ci0gICAgICAgIGlmIChtRWRpdGVkRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXIuZ2V0UHJvamVjdFJlc291cmNlcyhtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBsYXlvdXQgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbHRlcm5hdGVMYXlvdXQoZmluYWwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgbmV3IEpvYigiQ3JlYXRlIEFsdGVybmF0ZSBSZXNvdXJjZSIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZm9sZGVyIG5hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGNvbmZpZy5nZXRGb2xkZXJOYW1lKFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChtRWRpdGVkRmlsZS5nZXRQcm9qZWN0KCkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgdG8gc2VlIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXMgZm9sZGVyCi0gICAgICAgICAgICAgICAgICAgIElGb2xkZXIgcmVzID0gKElGb2xkZXIpbUVkaXRlZEZpbGUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcmVzLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgbmV3TGF5b3V0Rm9sZGVyID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZm9sZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXlvdXRGb2xkZXIuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc2luY2UgYWFwdCB3b3VsZCBoYXZlIGNvbXBsYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSwgYnV0IGlmIG9uZSBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgYnVpbGQsIHRoaXMgY291bGQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiRmlsZSAncmVzLyUxJHMnIGlzIGluIHRoZSB3YXkhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5kaXNwbGF5RXJyb3IoIkxheW91dCBDcmVhdGlvbiIsIG1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdMYXlvdXRGb2xkZXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheW91dEZvbGRlci5ta2RpcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IGNyZWF0ZSB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICBGaWxlIG5ld0xheW91dEZpbGUgPSBuZXcgRmlsZShuZXdMYXlvdXRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbmV3TGF5b3V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBtRWRpdGVkRmlsZS5nZXRDb250ZW50cygpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3TGF5b3V0RmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVs1MTJdOwotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpbnB1dC5yZWFkKGRhdGEpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGRhdGEsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2hlcyB0aGUgcmVzIGZvbGRlciB0byBzaG93IHVwIHRoZSBuZXcKLSAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0IGZvbGRlciAoaWYgbmVlZGVkKSBhbmQgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBhIHByb2dyZXNzIG1vbml0b3IgdG8gY2F0Y2ggdGhlIGVuZCBvZiB0aGUgcmVmcmVzaAotICAgICAgICAgICAgICAgICAgICAvLyB0byB0cmlnZ2VyIHRoZSBlZGl0IG9mIHRoZSBuZXcgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgcmVzLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBJUHJvZ3Jlc3NNb25pdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyZW50LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBGaWxlICdyZXMvJTEkcy8lMiRzJyA6ICUzJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWUsIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSwgZTIuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheUVycm9yKCJMYXlvdXQgQ3JlYXRpb24iLCBtZXNzYWdlKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGUyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBGaWxlICdyZXMvJTEkcy8lMiRzJyA6ICUzJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWUsIG1FZGl0ZWRGaWxlLmdldE5hbWUoKSwgZTIuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheUVycm9yKCJMYXlvdXQgQ3JlYXRpb24iLCBtZXNzYWdlKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTIuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIGEgbGF5b3V0IGJ5IGNhbGxpbmcgdGhlIGNvcnJlY3QgY29tcHV0ZUxheW91dCBtZXRob2Qgb2YgSUxheW91dEJyaWRnZSBiYXNlZCBvbgotICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBBUEkgbGV2ZWwuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwcml2YXRlIHN0YXRpYyBJTGF5b3V0UmVzdWx0IGNvbXB1dGVMYXlvdXQoTGF5b3V0QnJpZGdlIGJyaWRnZSwKLSAgICAgICAgICAgIElYbWxQdWxsUGFyc2VyIGxheW91dERlc2NyaXB0aW9uLCBPYmplY3QgcHJvamVjdEtleSwKLSAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgYm9vbGVhbiByZW5kZXJGdWxsU2l6ZSwKLSAgICAgICAgICAgIGludCBkZW5zaXR5LCBmbG9hdCB4ZHBpLCBmbG9hdCB5ZHBpLAotICAgICAgICAgICAgU3RyaW5nIHRoZW1lTmFtZSwgYm9vbGVhbiBpc1Byb2plY3RUaGVtZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gcHJvamVjdFJlc291cmNlcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gZnJhbWV3b3JrUmVzb3VyY2VzLAotICAgICAgICAgICAgSVByb2plY3RDYWxsYmFjayBwcm9qZWN0Q2FsbGJhY2ssIElMYXlvdXRMb2cgbG9nZ2VyKSB7Ci0KLSAgICAgICAgaWYgKGJyaWRnZS5hcGlMZXZlbCA+PSBJTGF5b3V0QnJpZGdlLkFQSV9DVVJSRU5UKSB7Ci0gICAgICAgICAgICAvLyBuZXdlc3QgQVBJIHdpdGggc3VwcG9ydCBmb3IgInJlbmRlciBmdWxsIGhlaWdodCIKLSAgICAgICAgICAgIC8vIFRPRE86IGxpbmsgYm9vbGVhbiB0byBVSS4KLSAgICAgICAgICAgIHJldHVybiBicmlkZ2UuYnJpZGdlLmNvbXB1dGVMYXlvdXQobGF5b3V0RGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RLZXksIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHJlbmRlckZ1bGxTaXplLAotICAgICAgICAgICAgICAgICAgICBkZW5zaXR5LCB4ZHBpLCB5ZHBpLAotICAgICAgICAgICAgICAgICAgICB0aGVtZU5hbWUsIGlzUHJvamVjdFRoZW1lLAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UmVzb3VyY2VzLCBmcmFtZXdvcmtSZXNvdXJjZXMsIHByb2plY3RDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyKTsKLSAgICAgICAgfSBlbHNlIGlmIChicmlkZ2UuYXBpTGV2ZWwgPT0gMykgewotICAgICAgICAgICAgLy8gbmV3ZXIgYXBpIHdpdGggZGVuc2l0eSBzdXBwb3J0LgotICAgICAgICAgICAgcmV0dXJuIGJyaWRnZS5icmlkZ2UuY29tcHV0ZUxheW91dChsYXlvdXREZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdEtleSwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCwgZGVuc2l0eSwgeGRwaSwgeWRwaSwKLSAgICAgICAgICAgICAgICAgICAgdGhlbWVOYW1lLCBpc1Byb2plY3RUaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlcywgZnJhbWV3b3JrUmVzb3VyY2VzLCBwcm9qZWN0Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnJpZGdlLmFwaUxldmVsID09IDIpIHsKLSAgICAgICAgICAgIC8vIGFwaSB3aXRoIGJvb2xlYW4gZm9yIHNlcGFyYXRpb24gb2YgcHJvamVjdC9mcmFtZXdvcmsgdGhlbWUKLSAgICAgICAgICAgIHJldHVybiBicmlkZ2UuYnJpZGdlLmNvbXB1dGVMYXlvdXQobGF5b3V0RGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RLZXksIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHRoZW1lTmFtZSwgaXNQcm9qZWN0VGhlbWUsCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RSZXNvdXJjZXMsIGZyYW1ld29ya1Jlc291cmNlcywgcHJvamVjdENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICBsb2dnZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb2xkZXN0IGFwaSB3aXRoIG5vIGRlbnNpdHkvZHBpLCBhbmQgcHJvamVjdCB0aGVtZSBib29sZWFuIG1peGVkCi0gICAgICAgICAgICAvLyBpbnRvIHRoZSB0aGVtZSBuYW1lLgotCi0gICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHN0cmluZyBpZiBpdCdzIGEgY3VzdG9tIHRoZW1lIHRvIG1ha2Ugc3VyZSB3ZSBjYW4KLSAgICAgICAgICAgIC8vIGRpZmZlcmVudGlhdGUgdGhlbQotICAgICAgICAgICAgaWYgKGlzUHJvamVjdFRoZW1lKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVOYW1lID0gIioiICsgdGhlbWVOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBicmlkZ2UuYnJpZGdlLmNvbXB1dGVMYXlvdXQobGF5b3V0RGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RLZXksIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHRoZW1lTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlcywgZnJhbWV3b3JrUmVzb3VyY2VzLCBwcm9qZWN0Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvSUdyYXBoaWNhbExheW91dEVkaXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0lHcmFwaGljYWxMYXlvdXRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgxNmFmNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvSUdyYXBoaWNhbExheW91dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuRWxlbWVudENyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNlbGVjdGlvblN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgd2hhdCB7QGxpbmsgTGF5b3V0RWRpdG9yfSBleHBlY3RzIGZyb20gYSBHcmFwaGljYWxMYXlvdXRFZGl0b3IgcGFydC4KLSAqCi0gKiBAc2luY2UgR0xFMgotICovCi0vKnBhY2thZ2UqLyBpbnRlcmZhY2UgSUdyYXBoaWNhbExheW91dEVkaXRvciBleHRlbmRzIElFZGl0b3JQYXJ0IHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVJIGZvciB0aGUgZWRpdGlvbiBvZiBhIG5ldyBmaWxlLgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBuZXcgZmlsZS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGVkaXROZXdGaWxlKEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWRzIHRoaXMgZWRpdG9yLCBieSBnZXR0aW5nIHRoZSBuZXcgbW9kZWwgZnJvbSB0aGUge0BsaW5rIExheW91dEVkaXRvcn0uCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCByZWxvYWRFZGl0b3IoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciBYTUwgbW9kZWwgY2hhbmdlZC4gT25seSB1cGRhdGUvcmVjb21wdXRlIHRoZSBsYXlvdXQgaWYgdGhlIGVkaXRvciBpcyB2aXNpYmxlCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBvblhtbE1vZGVsQ2hhbmdlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmVzcG9uZHMgdG8gYSBwYWdlIGNoYW5nZSB0aGF0IG1hZGUgdGhlIEdyYXBoaWNhbCBlZGl0b3IgcGFnZSB0aGUgYWN0aXZhdGVkIHBhZ2UuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBhY3RpdmF0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJlc3BvbmRzIHRvIGEgcGFnZSBjaGFuZ2UgdGhhdCBtYWRlIHRoZSBHcmFwaGljYWwgZWRpdG9yIHBhZ2UgdGhlIGRlYWN0aXZhdGVkIHBhZ2UKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGRlYWN0aXZhdGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IExheW91dEVkaXRvci5VaUVkaXRvckFjdGlvbnMuc2VsZWN0VWlOb2RlIHRvIHNlbGVjdCBhIG5ldyBVSSBOb2RlCi0gICAgICogY3JlYXRlZCBieSAge0BsaW5rIEVsZW1lbnRDcmVhdGVDb21tYW5kI2V4ZWN1dGUoKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlOb2RlTW9kZWwgVGhlIHtAbGluayBVaUVsZW1lbnROb2RlfSB0byBzZWxlY3QuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBzZWxlY3RNb2RlbChVaUVsZW1lbnROb2RlIHVpTm9kZU1vZGVsKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBzeW5jaHJvbml6ZXIgb2JqZWN0LgotICAgICAqIFRoZSBzeW5jaHJvbml6ZXIgY2FuIGJlIHVzZWQgdG8gc3luYyB0aGUgc2VsZWN0aW9uIG9mIDIgb3IgbW9yZSBFZGl0UGFydFZpZXdlcnMuCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIFNlbGVjdGlvblN5bmNocm9uaXplciBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKTsKLQotICAgIGFic3RyYWN0IHZvaWQgcmVsb2FkUGFsZXR0ZSgpOwotCi0gICAgYWJzdHJhY3Qgdm9pZCByZWNvbXB1dGVMYXlvdXQoKTsKLQotICAgIGFic3RyYWN0IFVpRG9jdW1lbnROb2RlIGdldE1vZGVsKCk7Ci0KLSAgICBhYnN0cmFjdCBMYXlvdXRFZGl0b3IgZ2V0TGF5b3V0RWRpdG9yKCk7Ci0KLSAgICBhYnN0cmFjdCBDbGlwYm9hcmQgZ2V0Q2xpcGJvYXJkKCk7Ci0KLSAgICBhYnN0cmFjdCB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb25VaShib29sZWFuIG5vdGlmeUxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dENhbnZhcy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dENhbnZhcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGRlNjEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSUxheW91dFJlc3VsdDsNCi1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JTGF5b3V0UmVzdWx0LklMYXlvdXRWaWV3SW5mbzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLQ0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOw0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5EYXRhQnVmZmVySW50Ow0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBEaXNwbGF5cyB0aGUgaW1hZ2UgcmVuZGVyZWQgYnkgdGhlIHtAbGluayBHcmFwaGljYWxFZGl0b3JQYXJ0fSBhbmQgaGFuZGxlcw0KLSAqIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSB3aWRnZXRzLg0KLSAqIDxwLz4NCi0gKg0KLSAqIEBzaW5jZSBHTEUyDQotICoNCi0gKiBUT0RPIGxpc3Q6DQotICogLSBncmF5IG9uIGVycm9yLCBrZWVwIHNlbGVjdCBidXQgZGlzYWJsZSBkJ24nZC4NCi0gKiAtIG1ha2Ugc3VyZSBpdCBpcyBzY3JvbGxhYmxlIChDYW52YXMgZGVyaXZlcyBmcm9tIFNjcm9sbGFibGUsIHNvIHByb2xseSBqdXN0IHNldHRpbmcgYm91bmRzLikNCi0gKiAtIGhhbmRsZSBkcm9wIHRhcmdldCAoZnJvbSBwYWxldHRlKS4NCi0gKiAtIGhhbmRsZSBkcmFnJ24nZHJvcCAoaW50ZXJuYWwsIGZvciBtb3ZpbmcvZHVwbGljYXRpbmcpLg0KLSAqIC0gaGFuZGxlIGNvbnRleHQgbWVudSAoZGVwZW5kaW5nIG9uIHNlbGVjdGlvbikuDQotICogLSBzZWxlY3Rpb24gc3luY2hyb25pemF0aW9uIHdpdGggdGhlIG91dGxpbmUgKGJvdGggd2F5cykuDQotICovDQotcHVibGljIGNsYXNzIExheW91dENhbnZhcyBleHRlbmRzIENhbnZhcyB7DQotDQotICAgIC8qKg0KLSAgICAgKiBNYXJnaW4gYXJvdW5kIHRoZSByZW5kZXJlZCBpbWFnZS4gU2hvdWxkIGJlIGVub3VnaCBzcGFjZSB0byBkaXNwbGF5IHRoZSBsYXlvdXQNCi0gICAgICogd2lkdGggYW5kIGhlaWdodCBwc2V1ZG8gd2lkZ2V0cy4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUFHRV9NQVJHSU4gPSA1Ow0KLSAgICAvKioNCi0gICAgICogTWluaW1hbCBzaXplIG9mIHRoZSBzZWxlY3Rpb24sIGluIGNhc2UgYW4gZW1wdHkgdmlldyBvciBsYXlvdXQgaXMgc2VsZWN0ZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX01JTl9TSVpFID0gNjsNCi0NCi0gICAgcHJpdmF0ZSBJTGF5b3V0UmVzdWx0IG1MYXN0VmFsaWRSZXN1bHQ7DQotICAgIHByaXZhdGUgVmlld0luZm8gbUxhc3RWYWxpZFZpZXdJbmZvUm9vdDsNCi0NCi0gICAgLyoqIEN1cnJlbnQgYmFja2dyb3VuZCBpbWFnZS4gTnVsbCB3aGVuIHRoZXJlJ3Mgbm8gaW1hZ2UuICovDQotICAgIHByaXZhdGUgSW1hZ2UgbUltYWdlOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8U2VsZWN0aW9uPiBtU2VsZWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PFNlbGVjdGlvbj4oKTsNCi0NCi0gICAgLyoqIFNlbGVjdGlvbiBib3JkZXIgY29sb3IuIERvIG5vdCBkaXNwb3NlLCBpdCdzIGEgc3lzdGVtIGNvbG9yLiAqLw0KLSAgICBwcml2YXRlIENvbG9yIG1TZWxlY3Rpb25GZ0NvbG9yOw0KLQ0KLSAgICAvKiogU2VsZWN0aW9uIG5hbWUgZm9udC4gRG8gbm90IGRpc3Bvc2UsIGl0J3MgYSBzeXN0ZW0gZm9udC4gKi8NCi0gICAgcHJpdmF0ZSBGb250IG1TZWxlY3Rpb25Gb250Ow0KLQ0KLSAgICAvKiogUGl4ZWwgaGVpZ2h0IG9mIHRoZSBmb250IGRpc3BsYXlpbmcgdGhlIHNlbGVjdGlvbiBuYW1lLiBJbml0aWFsbHkgc2V0IHRvIDAgYW5kIG9ubHkNCi0gICAgICogaW5pdGlhbGl6ZWQgaW4gb25QYWludCgpIHdoZW4gd2UgaGF2ZSBhIEdDLiAqLw0KLSAgICBwcml2YXRlIGludCBtU2VsZWN0aW9uRm9udEhlaWdodDsNCi0NCi0gICAgLyoqIEN1cnJlbnQgaG92ZXIgdmlldyBpbmZvLiBOdWxsIHdoZW4gbm8gbW91c2UgaG92ZXIuICovDQotICAgIHByaXZhdGUgVmlld0luZm8gbUhvdmVyVmlld0luZm87DQotDQotICAgIC8qKiBDdXJyZW50IG1vdXNlIGhvdmVyIGJvcmRlciByZWN0YW5nbGUuIE51bGwgd2hlbiB0aGVyZSdzIG5vIG1vdXNlIGhvdmVyLiAqLw0KLSAgICBwcml2YXRlIFJlY3RhbmdsZSBtSG92ZXJSZWN0Ow0KLQ0KLSAgICAvKiogSG92ZXIgYm9yZGVyIGNvbG9yLiBNdXN0IGJlIGRpc3Bvc2VkLCBpdCdzIE5PVCBhIHN5c3RlbSBjb2xvci4gKi8NCi0gICAgcHJpdmF0ZSBDb2xvciBtSG92ZXJGZ0NvbG9yOw0KLQ0KLSAgICBwcml2YXRlIEFsdGVybmF0ZVNlbGVjdGlvbiBtQWx0U2VsZWN0aW9uOw0KLQ0KLSAgICAvKioNCi0gICAgICogVHJ1ZSB3aGVuIHRoZSBsYXN0IHtAbGluayAjc2V0UmVzdWx0KElMYXlvdXRSZXN1bHQpfSBwcm92aWRlZCBhIHZhbGlkIHtAbGluayBJTGF5b3V0UmVzdWx0fQ0KLSAgICAgKiBpbiB3aGljaCBjYXNlIGl0IGlzIGFsc28gYXZhaWxhYmxlIGluIHtAbGluayAjbUxhc3RWYWxpZFJlc3VsdH0uDQotICAgICAqIFdoZW4gZmFsc2UgdGhpcyBtZWFucyB0aGUgY2FudmFzIGlzIGRpc3BsYXlpbmcgYW4gb3V0LWRhdGVkIHJlc3VsdCBpbWFnZSAmIGJvdW5kcyBhbmQgc29tZQ0KLSAgICAgKiBmZWF0dXJlcyBzaG91bGQgYmUgZGlzYWJsZWQgYWNjb3JkaW5nbHkgc3VjaCBhIGRyYWcnbidkcm9wLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Jlc3VsdFZhbGlkOw0KLQ0KLQ0KLSAgICBwdWJsaWMgTGF5b3V0Q2FudmFzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOw0KLQ0KLSAgICAgICAgRGlzcGxheSBkID0gZ2V0RGlzcGxheSgpOw0KLSAgICAgICAgbVNlbGVjdGlvbkZnQ29sb3IgPSBkLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOw0KLSAgICAgICAgbUhvdmVyRmdDb2xvciAgICAgPSBuZXcgQ29sb3IoZCwgMHhGRiwgMHg5OSwgMHgwMCk7IC8vIG9yYW5nZQ0KLSAgICAgICAgbVNlbGVjdGlvbkZvbnQgICAgPSBkLmdldFN5c3RlbUZvbnQoKTsNCi0NCi0gICAgICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBvblBhaW50KGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25Nb3VzZU1vdmUoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uTW91c2VVcChlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBvbk1vdXNlRG93bihlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25Eb3VibGVDbGljayhlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgcmVzdWx0IG9mIHRoZSBsYXlvdXQgcmVuZGVyaW5nLiBUaGUgcmVzdWx0IG9iamVjdCBpbmRpY2F0ZXMgaWYgdGhlIGxheW91dA0KLSAgICAgKiByZW5kZXJpbmcgc3VjY2VlZGVkLiBJZiBpdCBkaWQsIGl0IGNvbnRhaW5zIGEgYml0bWFwIGFuZCB0aGUgb2JqZWN0cyByZWN0YW5nbGVzLg0KLSAgICAgKg0KLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6IHRoZSBicmlkZ2UncyBjb21wdXRlTGF5b3V0KCkgbWV0aG9kIGFscmVhZHkgcmV0dXJucyBhIG5ld2x5DQotICAgICAqIGFsbG9jYXRlZCBJTGF5b3VyUmVzdWx0LiBUaGF0IG1lYW5zIHdlIGNhbiBrZWVwIHRoaXMgcmVzdWx0IGFuZCBob2xkIG9uIHRvIGl0DQotICAgICAqIHdoZW4gaXQgaXMgdmFsaWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIG5ldyByZW5kZXJpbmcgcmVzdWx0LCBlaXRoZXIgdmFsaWQgb3Igbm90Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmVzdWx0KElMYXlvdXRSZXN1bHQgcmVzdWx0KSB7DQotDQotICAgICAgICAvLyBkaXNhYmxlIGFueSBob3Zlcg0KLSAgICAgICAgbUhvdmVyUmVjdCA9IG51bGw7DQotDQotICAgICAgICBtSXNSZXN1bHRWYWxpZCA9IChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZ2V0U3VjY2VzcygpID09IElMYXlvdXRSZXN1bHQuU1VDQ0VTUyk7DQotDQotICAgICAgICBpZiAobUlzUmVzdWx0VmFsaWQgJiYgcmVzdWx0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtTGFzdFZhbGlkUmVzdWx0ID0gcmVzdWx0Ow0KLSAgICAgICAgICAgIG1MYXN0VmFsaWRWaWV3SW5mb1Jvb3QgPSBuZXcgVmlld0luZm8ocmVzdWx0LmdldFJvb3RWaWV3KCkpOw0KLSAgICAgICAgICAgIHNldEltYWdlKHJlc3VsdC5nZXRJbWFnZSgpKTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VsZWN0aW9uIGlzIHN0aWxsIHRoZSBzYW1lIChiYXNlZCBvbiB0aGUgb2JqZWN0IGtleXMpDQotICAgICAgICAgICAgLy8gYW5kIGV2ZW50dWFsbHkgcmVjb21wdXRlIHRoZWlyIGJvdW5kcy4NCi0gICAgICAgICAgICBmb3IgKExpc3RJdGVyYXRvcjxTZWxlY3Rpb24+IGl0ID0gbVNlbGVjdGlvbnMubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7DQotICAgICAgICAgICAgICAgIFNlbGVjdGlvbiBzID0gaXQubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgaWYgdGhlIHNlbGVjdGVkIG9iamVjdCBzdGlsbCBleGlzdHMNCi0gICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IHMuZ2V0Vmlld0luZm8oKS5nZXRLZXkoKTsNCi0gICAgICAgICAgICAgICAgVmlld0luZm8gdmkgPSBmaW5kVmlld0luZm9LZXkoa2V5LCBtTGFzdFZhbGlkVmlld0luZm9Sb290KTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gLS0gaWYgdGhlIHNlbGVjdGVkIG9iamVjdCBzdGlsbCBleGlzdHMNCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbXB1dGUgaXRzIGJvdW5kcyBpbiBjYXNlIGl0IG1vdmVkIHNvIHdlJ2xsIGluc2VydCBhIG5ldyBvbmUNCi0gICAgICAgICAgICAgICAgLy8gYXQgdGhlIHNhbWUgcGxhY2UuDQotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAodmkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaXQuYWRkKG5ldyBTZWxlY3Rpb24odmkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIHNlbGVjdGlvbiB2aWV3cw0KLSAgICAgICAgICAgIG1BbHRTZWxlY3Rpb24gPSBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVkcmF3KCk7DQotICAgIH0NCi0NCi0gICAgLy8tLS0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGltYWdlIG9mIHRoZSBsYXN0ICpzdWNjZXNzZnVsKiByZW5kZXJpbmcuDQotICAgICAqIENvbnZlcnRzIHRoZSBBV1QgaW1hZ2UgaW50byBhbiBTV1QgaW1hZ2UuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW1hZ2UoQnVmZmVyZWRJbWFnZSBhd3RJbWFnZSkgew0KLSAgICAgICAgaW50IHdpZHRoID0gYXd0SW1hZ2UuZ2V0V2lkdGgoKTsNCi0gICAgICAgIGludCBoZWlnaHQgPSBhd3RJbWFnZS5nZXRIZWlnaHQoKTsNCi0NCi0gICAgICAgIFJhc3RlciByYXN0ZXIgPSBhd3RJbWFnZS5nZXREYXRhKG5ldyBqYXZhLmF3dC5SZWN0YW5nbGUod2lkdGgsIGhlaWdodCkpOw0KLSAgICAgICAgaW50W10gaW1hZ2VEYXRhQnVmZmVyID0gKChEYXRhQnVmZmVySW50KXJhc3Rlci5nZXREYXRhQnVmZmVyKCkpLmdldERhdGEoKTsNCi0NCi0gICAgICAgIEltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDMyLA0KLSAgICAgICAgICAgICAgICBuZXcgUGFsZXR0ZURhdGEoMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRikpOw0KLQ0KLSAgICAgICAgaW1hZ2VEYXRhLnNldFBpeGVscygwLCAwLCBpbWFnZURhdGFCdWZmZXIubGVuZ3RoLCBpbWFnZURhdGFCdWZmZXIsIDApOw0KLQ0KLSAgICAgICAgbUltYWdlID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgaW1hZ2VEYXRhKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFpbnRzIHRoZSBjYW52YXMgaW4gcmVzcG9uc2UgdG8gcGFpbnQgZXZlbnRzLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIG9uUGFpbnQoUGFpbnRFdmVudCBlKSB7DQotICAgICAgICBHQyBnYyA9IGUuZ2M7DQotDQotICAgICAgICBpZiAobUltYWdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoIW1Jc1Jlc3VsdFZhbGlkKSB7DQotICAgICAgICAgICAgICAgIGdjLnNldEFscGhhKDEyOCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGdjLmRyYXdJbWFnZShtSW1hZ2UsIElNQUdFX01BUkdJTiwgSU1BR0VfTUFSR0lOKTsNCi0NCi0gICAgICAgICAgICBpZiAoIW1Jc1Jlc3VsdFZhbGlkKSB7DQotICAgICAgICAgICAgICAgIGdjLnNldEFscGhhKDI1NSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1Ib3ZlclJlY3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUhvdmVyRmdDb2xvcik7DQotICAgICAgICAgICAgZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7DQotICAgICAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShtSG92ZXJSZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHNlbGVjdGlvbiBmb250IGhlaWdodCBvbmNlLiBXZSBuZWVkIHRoZSBHQyB0byBkbyB0aGF0Lg0KLSAgICAgICAgaWYgKG1TZWxlY3Rpb25Gb250SGVpZ2h0ID09IDApIHsNCi0gICAgICAgICAgICBnYy5zZXRGb250KG1TZWxlY3Rpb25Gb250KTsNCi0gICAgICAgICAgICBGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotICAgICAgICAgICAgbVNlbGVjdGlvbkZvbnRIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoU2VsZWN0aW9uIHMgOiBtU2VsZWN0aW9ucykgew0KLSAgICAgICAgICAgIGRyYXdTZWxlY3Rpb24oZ2MsIHMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBkcmF3U2VsZWN0aW9uKEdDIGdjLCBTZWxlY3Rpb24gcykgew0KLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBzLmdldFJlY3QoKTsNCi0NCi0gICAgICAgIGdjLnNldEZvcmVncm91bmQobVNlbGVjdGlvbkZnQ29sb3IpOw0KLSAgICAgICAgZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsNCi0gICAgICAgIGdjLmRyYXdSZWN0YW5nbGUocy5tUmVjdCk7DQotDQotICAgICAgICBTdHJpbmcgbmFtZSA9IHMuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGludCB4cyA9IHIueCArIDI7DQotICAgICAgICAgICAgaW50IHlzID0gci55IC0gbVNlbGVjdGlvbkZvbnRIZWlnaHQ7DQotICAgICAgICAgICAgaWYgKHlzIDwgMCkgew0KLSAgICAgICAgICAgICAgICB5cyA9IHIueSArIHIuaGVpZ2h0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBnYy5kcmF3U3RyaW5nKG5hbWUsIHhzLCB5cywgdHJ1ZSAvKnRyYW5zcGFyZW50Ki8pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBIb3ZlciBvbiB0b3Agb2YgYSBrbm93biBjaGlsZC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBvbk1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsNCi0gICAgICAgIGlmIChtTGFzdFZhbGlkUmVzdWx0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBWaWV3SW5mbyByb290ID0gbUxhc3RWYWxpZFZpZXdJbmZvUm9vdDsNCi0gICAgICAgICAgICBWaWV3SW5mbyB2aSA9IGZpbmRWaWV3SW5mb0F0KGUueCAtIElNQUdFX01BUkdJTiwgZS55IC0gSU1BR0VfTUFSR0lOLCByb290KTsNCi0NCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBob3ZlciBvbiB0aGUgcm9vdCBzaW5jZSBpdCdzIG5vdCBhIHdpZGdldCBwZXIgc2VlIGFuZCBpdCBpcyBhbHdheXMgdGhlcmUuDQotICAgICAgICAgICAgaWYgKHZpID09IHJvb3QpIHsNCi0gICAgICAgICAgICAgICAgdmkgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBib29sZWFuIG5lZWRzVXBkYXRlID0gdmkgIT0gbUhvdmVyVmlld0luZm87DQotICAgICAgICAgICAgbUhvdmVyVmlld0luZm8gPSB2aTsNCi0NCi0gICAgICAgICAgICBpZiAodmkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtSG92ZXJSZWN0ID0gbnVsbDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgciA9IHZpLmdldFNlbGVjdGlvblJlY3QoKTsNCi0gICAgICAgICAgICAgICAgbUhvdmVyUmVjdCA9IG5ldyBSZWN0YW5nbGUoci54ICsgSU1BR0VfTUFSR0lOLCByLnkgKyBJTUFHRV9NQVJHSU4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIud2lkdGgsIHIuaGVpZ2h0KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7DQotICAgICAgICAgICAgICAgIHJlZHJhdygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgb25Nb3VzZURvd24oTW91c2VFdmVudCBlKSB7DQotICAgICAgICAvLyBwYXNzLCBub3QgdXNlZCB5ZXQuDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBlcmZvcm1zIHNlbGVjdGlvbiBvbiBtb3VzZSB1cCAobm90IG1vdXNlIGRvd24pLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFNoaWZ0IGtleSBpcyB1c2VkIHRvIHRvZ2dsZSBpbiBtdWx0aS1zZWxlY3Rpb24uDQotICAgICAqIEFsdCBrZXkgaXMgdXNlZCB0byBjeWNsZSBzZWxlY3Rpb24gdGhyb3VnaCBvYmplY3RzIGF0IHRoZSBzYW1lIGxldmVsIHRoYW4gdGhlIG9uZQ0KLSAgICAgKiBwb2ludGVkIGF0IChpLmUuIGNsaWNrIG9uIGFuIG9iamVjdCB0aGVuIGFsdC1jbGljayB0byBjeWNsZSkuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25Nb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLSAgICAgICAgaWYgKG1MYXN0VmFsaWRSZXN1bHQgIT0gbnVsbCkgew0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNTaGlmdCA9IChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMDsNCi0gICAgICAgICAgICBib29sZWFuIGlzQWx0ICAgPSAoZS5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAgICE9IDA7DQotDQotICAgICAgICAgICAgaW50IHggPSBlLnggLSBJTUFHRV9NQVJHSU47DQotICAgICAgICAgICAgaW50IHkgPSBlLnkgLSBJTUFHRV9NQVJHSU47DQotICAgICAgICAgICAgVmlld0luZm8gdmkgPSBmaW5kVmlld0luZm9BdCh4LCB5LCBtTGFzdFZhbGlkVmlld0luZm9Sb290KTsNCi0NCi0gICAgICAgICAgICBpZiAoaXNTaGlmdCAmJiAhaXNBbHQpIHsNCi0gICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSBzaGlmdCBpcyBwcmVzc2VkOiBwb2ludGVkIG9iamVjdCBpcyB0b2dnbGVkLg0KLQ0KLSAgICAgICAgICAgICAgICAvLyByZXNldCBhbHRlcm5hdGUgc2VsZWN0aW9uIGlmIGFueQ0KLSAgICAgICAgICAgICAgICBtQWx0U2VsZWN0aW9uID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgLy8gSWYgbm90aGluZyBoYXMgYmVlbiBmb3VuZCBhdCB0aGUgY3Vyc29yLCBhc3N1bWUgaXQgbWlnaHQgYmUgYSB1c2VyIGVycm9yDQotICAgICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBjbGVhcmluZyB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uLg0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gdG9nZ2xlIHRoaXMgc2VsZWN0aW9uIG9uLW9mZjogcmVtb3ZlIGl0IGlmIGFscmVhZHkgc2VsZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNlbGVjdCh2aSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZWRyYXcoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGl0Lg0KLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbnMuYWRkKG5ldyBTZWxlY3Rpb24odmkpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlZHJhdygpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FsdCkgew0KLSAgICAgICAgICAgICAgICAvLyBDYXNlIHdoZXJlIGFsdCBpcyBwcmVzc2VkOiBzZWxlY3Qgb3IgY3ljbGUgdGhlIG9iamVjdCBwb2ludGVkIGF0Lg0KLQ0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBpZiBzaGlmdCBhbmQgYWx0IGFyZSBwcmVzc2VkLCBzaGlmdCBpcyBpZ25vcmVkLiBUaGUgYWx0ZXJuYXRlIHNlbGVjdGlvbg0KLSAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZG9lcyBub3QgcmVzZXQgdGhlIGN1cnJlbnQgbXVsdGlwbGUgc2VsZWN0aW9uIHVubGVzcyB0aGV5IGludGVyc2VjdC4NCi0NCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGUgIm9yaWdpbiIgb2YgdGhlIGFsdGVybmF0ZSBzZWxlY3Rpb24sIHRvIGJlDQotICAgICAgICAgICAgICAgIC8vIGFibGUgdG8gY29udGludWUgY3ljbGluZyB0aHJvdWdoIGl0IGxhdGVyLiBJZiB0aGVyZSdzIG5vIGFsdGVybmF0ZSBzZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBvbmUuIElmIHRoZXJlJ3Mgb25lIGJ1dCBub3QgZm9yIHRoZSBzYW1lIG9yaWdpbiBvYmplY3QsIGNyZWF0ZSBhIG5ldw0KLSAgICAgICAgICAgICAgICAvLyBvbmUgdG9vLg0KLSAgICAgICAgICAgICAgICBpZiAobUFsdFNlbGVjdGlvbiA9PSBudWxsIHx8IG1BbHRTZWxlY3Rpb24uZ2V0T3JpZ2luYXRpbmdWaWV3KCkgIT0gdmkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1BbHRTZWxlY3Rpb24gPSBuZXcgQWx0ZXJuYXRlU2VsZWN0aW9uKHZpLCBmaW5kQWx0Vmlld0luZm9BdCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgbUxhc3RWYWxpZFZpZXdJbmZvUm9vdCwgbnVsbCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gZGVzZWxlY3QgdGhlbSBhbGwsIGluIGNhc2UgdGhleSB3ZXJlIHBhcnRpYWxseSBzZWxlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RBbGwobUFsdFNlbGVjdGlvbi5nZXRBbHRWaWV3cygpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdCB0aGUgY3VycmVudCBvbmUNCi0gICAgICAgICAgICAgICAgICAgIFZpZXdJbmZvIHZpMiA9IG1BbHRTZWxlY3Rpb24uZ2V0Q3VycmVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpMiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbnMuYWRkRmlyc3QobmV3IFNlbGVjdGlvbih2aTIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHRyeWluZyB0byBjeWNsZSB0aHJvdWdoIHRoZSBjdXJyZW50IGFsdGVybmF0ZSBzZWxlY3Rpb24uDQotICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCByZW1vdmUgdGhlIGN1cnJlbnQgb2JqZWN0Lg0KLSAgICAgICAgICAgICAgICAgICAgVmlld0luZm8gdmkyID0gbUFsdFNlbGVjdGlvbi5nZXRDdXJyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdCh2aTIpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm93IHNlbGVjdCB0aGUgbmV4dCBvbmUuDQotICAgICAgICAgICAgICAgICAgICB2aTIgPSBtQWx0U2VsZWN0aW9uLmdldE5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh2aTIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25zLmFkZEZpcnN0KG5ldyBTZWxlY3Rpb24odmkyKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVkcmF3KCk7DQotDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSBubyBtb2RpZmllciBpcyBwcmVzc2VkOiBlaXRoZXIgc2VsZWN0IG9yIHJlc2V0IHRoZSBzZWxlY3Rpb24uDQotDQotICAgICAgICAgICAgICAgIC8vIHJlc2V0IGFsdGVybmF0ZSBzZWxlY3Rpb24gaWYgYW55DQotICAgICAgICAgICAgICAgIG1BbHRTZWxlY3Rpb24gPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyByZXNldCAobXVsdGkpc2VsZWN0aW9uIGlmIGFueQ0KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbnMuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25zLnNpemUoKSA9PSAxICYmIG1TZWxlY3Rpb25zLmdldEZpcnN0KCkuZ2V0Vmlld0luZm8oKSA9PSB2aSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdGlvbiByZW1haW5zIHRoZSBzYW1lLCBkb24ndCB0b3VjaCBpdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9ucy5jbGVhcigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICh2aSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9ucy5hZGQobmV3IFNlbGVjdGlvbih2aSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlZHJhdygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiogRGVzZWxlY3RzIGEgdmlldyBpbmZvLiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgYWN0dWFsbHkgc2VsZWN0ZWQuICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXNlbGVjdChWaWV3SW5mbyB2aWV3SW5mbykgew0KLSAgICAgICAgaWYgKHZpZXdJbmZvID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKExpc3RJdGVyYXRvcjxTZWxlY3Rpb24+IGl0ID0gbVNlbGVjdGlvbnMubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7DQotICAgICAgICAgICAgU2VsZWN0aW9uIHMgPSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKHZpZXdJbmZvID09IHMuZ2V0Vmlld0luZm8oKSkgew0KLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKiBEZXNlbGVjdHMgbXVsdGlwbGUgdmlldyBpbmZvcywgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGRlc2VsZWN0QWxsKExpc3Q8Vmlld0luZm8+IHZpZXdJbmZvcykgew0KLSAgICAgICAgZm9yIChMaXN0SXRlcmF0b3I8U2VsZWN0aW9uPiBpdCA9IG1TZWxlY3Rpb25zLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgew0KLSAgICAgICAgICAgIFNlbGVjdGlvbiBzID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgIGlmICh2aWV3SW5mb3MuY29udGFpbnMocy5nZXRWaWV3SW5mbygpKSkgew0KLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIG9uRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7DQotICAgICAgICAvLyBwYXNzLCBub3QgdXNlZCB5ZXQuDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIHRvIGZpbmQgYSBjaGlsZCB3aXRoIHRoZSBzYW1lIHZpZXcga2V5IGluIHRoZSB2aWV3IGluZm8gc3ViLXRyZWUuDQotICAgICAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFZpZXdJbmZvIGZpbmRWaWV3SW5mb0tleShPYmplY3Qgdmlld0tleSwgVmlld0luZm8gdmlld0luZm8pIHsNCi0gICAgICAgIGlmICh2aWV3SW5mby5nZXRLZXkoKSA9PSB2aWV3S2V5KSB7DQotICAgICAgICAgICAgcmV0dXJuIHZpZXdJbmZvOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBjaGlsZA0KLSAgICAgICAgZm9yIChWaWV3SW5mbyBjaGlsZCA6IHZpZXdJbmZvLmdldENoaWxkcmVuKCkpIHsNCi0gICAgICAgICAgICBWaWV3SW5mbyB2ID0gZmluZFZpZXdJbmZvS2V5KHZpZXdLZXksIGNoaWxkKTsNCi0gICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUcmllcyB0byBmaW5kIHRoZSBpbm5lciBtb3N0IGNoaWxkIG1hdGNoaW5nIHRoZSBnaXZlbiB4LHkgY29vcmRpbmF0ZXMgaW4gdGhlIHZpZXcNCi0gICAgICogaW5mbyBzdWItdHJlZS4gVGhpcyB1c2VzIHRoZSBwb3RlbnRpYWxseS1leHBhbmRlZCBzZWxlY3Rpb24gYm91bmRzLg0KLSAgICAgKg0KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBWaWV3SW5mbyBmaW5kVmlld0luZm9BdChpbnQgeCwgaW50IHksIFZpZXdJbmZvIHZpZXdJbmZvKSB7DQotICAgICAgICBSZWN0YW5nbGUgciA9IHZpZXdJbmZvLmdldFNlbGVjdGlvblJlY3QoKTsNCi0gICAgICAgIGlmIChyLmNvbnRhaW5zKHgsIHkpKSB7DQotDQotICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBjaGlsZCBmaXJzdA0KLSAgICAgICAgICAgIGZvciAoVmlld0luZm8gY2hpbGQgOiB2aWV3SW5mby5nZXRDaGlsZHJlbigpKSB7DQotICAgICAgICAgICAgICAgIFZpZXdJbmZvIHYgPSBmaW5kVmlld0luZm9BdCh4LCB5LCBjaGlsZCk7DQotICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGlmIG5vIGNoaWxkcmVuIG1hdGNoZWQsIHRoaXMgaXMgdGhlIHZpZXcgdGhhdCB3ZSdyZSBsb29raW5nIGZvcg0KLSAgICAgICAgICAgIHJldHVybiB2aWV3SW5mbzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQXJyYXlMaXN0PFZpZXdJbmZvPiBmaW5kQWx0Vmlld0luZm9BdCgNCi0gICAgICAgICAgICBpbnQgeCwgaW50IHksIFZpZXdJbmZvIHBhcmVudCwgQXJyYXlMaXN0PFZpZXdJbmZvPiBvdXRMaXN0KSB7DQotICAgICAgICBSZWN0YW5nbGUgcjsNCi0NCi0gICAgICAgIGlmIChvdXRMaXN0ID09IG51bGwpIHsNCi0gICAgICAgICAgICBvdXRMaXN0ID0gbmV3IEFycmF5TGlzdDxWaWV3SW5mbz4oKTsNCi0NCi0gICAgICAgICAgICAvLyBhZGQgdGhlIHBhcmVudCByb290IG9ubHkgb25jZQ0KLSAgICAgICAgICAgIHIgPSBwYXJlbnQuZ2V0U2VsZWN0aW9uUmVjdCgpOw0KLSAgICAgICAgICAgIGlmIChyLmNvbnRhaW5zKHgsIHkpKSB7DQotICAgICAgICAgICAgICAgIG91dExpc3QuYWRkKHBhcmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHBhcmVudC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAvLyB0aGVuIGFkZCBhbGwgY2hpbGRyZW4gdGhhdCBtYXRjaCB0aGUgcG9zaXRpb24NCi0gICAgICAgICAgICBmb3IgKFZpZXdJbmZvIGNoaWxkIDogcGFyZW50LmdldENoaWxkcmVuKCkpIHsNCi0gICAgICAgICAgICAgICAgciA9IGNoaWxkLmdldFNlbGVjdGlvblJlY3QoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHIuY29udGFpbnMoeCwgeSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG91dExpc3QuYWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBmaW5hbGx5IHJlY3Vyc2UgaW4gdGhlIGNoaWxkcmVuDQotICAgICAgICAgICAgZm9yIChWaWV3SW5mbyBjaGlsZCA6IHBhcmVudC5nZXRDaGlsZHJlbigpKSB7DQotICAgICAgICAgICAgICAgIHIgPSBjaGlsZC5nZXRTZWxlY3Rpb25SZWN0KCk7DQotICAgICAgICAgICAgICAgIGlmIChyLmNvbnRhaW5zKHgsIHkpKSB7DQotICAgICAgICAgICAgICAgICAgICBmaW5kQWx0Vmlld0luZm9BdCh4LCB5LCBjaGlsZCwgb3V0TGlzdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3V0TGlzdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWFwcyBhIHtAbGluayBJTGF5b3V0Vmlld0luZm99IGluIGEgc3RydWN0dXJlIG1vcmUgYWRhcHRlZCB0byBvdXIgbmVlZHMuDQotICAgICAqIFRoZSBvbmx5IGxhcmdlIGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBrZWVwIGJvdGggdGhlIG9yaWdpbmFsIGJvdW5kcyBvZiB0aGUgdmlldyBpbmZvDQotICAgICAqIGFuZCB3ZSBwcmUtY29tcHV0ZSB0aGUgc2VsZWN0aW9uIGJvdW5kcyB3aGljaCBhcmUgYWJzb2x1dGUgdG8gdGhlIHJlbmRlcmVkIGltYWdlICh3aGVyZQ0KLSAgICAgKiBhcyB0aGUgb3JpZ2luYWwgYm91bmRzIGFyZSByZWxhdGl2ZSB0byB0aGUgcGFyZW50IHZpZXcuKQ0KLSAgICAgKiA8cC8+DQotICAgICAqIEVhY2ggdmlldyBhbHNvIGtub3cgaXRzIHBhcmVudCwgd2hpY2ggc2hvdWxkIGJlIGhhbmR5IGxhdGVyLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFdlIGNhbid0IGFsdGVyIHtAbGluayBJTGF5b3V0Vmlld0luZm99IGFzIGl0IGlzIHBhcnQgb2YgdGhlIExheW91dEJyaWRnZSBhbmQgbmVlZHMgdG8NCi0gICAgICogaGF2ZSBhIGZpeGVkIEFQSS4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdJbmZvIHsNCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlIG1SZWFsUmVjdDsNCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlIG1TZWxlY3Rpb25SZWN0Ow0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7DQotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtS2V5Ow0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWaWV3SW5mbyBtUGFyZW50Ow0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlld0luZm8+IG1DaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Vmlld0luZm8+KCk7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgVmlld0luZm99IGhpZXJhcmNoeSBiYXNlZCBvbiBhIGdpdmVuIHtAbGluayBJTGF5b3V0Vmlld0luZm99DQotICAgICAgICAgKiBoaWVyYXJjaHkuIFRoaXMgY2FsbCBpcyByZWN1cnNpdmVzIGFuZCBidWlsZHMgYSBmdWxsIHRyZWUuDQotICAgICAgICAgKg0KLSAgICAgICAgICogQHBhcmFtIHZpZXdJbmZvIFRoZSByb290IG9mIHRoZSB7QGxpbmsgSUxheW91dFZpZXdJbmZvfSBoaWVyYXJjaHkuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBWaWV3SW5mbyhJTGF5b3V0Vmlld0luZm8gdmlld0luZm8pIHsNCi0gICAgICAgICAgICB0aGlzKHZpZXdJbmZvLCBudWxsIC8qcGFyZW50Ki8sIDAgLypwYXJlbnRYKi8sIDAgLypwYXJlbnRZKi8pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJpdmF0ZSBWaWV3SW5mbyhJTGF5b3V0Vmlld0luZm8gdmlld0luZm8sIFZpZXdJbmZvIHBhcmVudCwgaW50IHBhcmVudFgsIGludCBwYXJlbnRZKSB7DQotICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsNCi0gICAgICAgICAgICBtS2V5ICA9IHZpZXdJbmZvLmdldFZpZXdLZXkoKTsNCi0gICAgICAgICAgICBtTmFtZSA9IHZpZXdJbmZvLmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBpbnQgeCA9IHZpZXdJbmZvLmdldExlZnQoKTsNCi0gICAgICAgICAgICBpbnQgeSA9IHZpZXdJbmZvLmdldFRvcCgpOw0KLSAgICAgICAgICAgIGludCB3ID0gdmlld0luZm8uZ2V0UmlnaHQoKSAtIHg7DQotICAgICAgICAgICAgaW50IGggPSB2aWV3SW5mby5nZXRCb3R0b20oKSAtIHk7DQotDQotICAgICAgICAgICAgbVJlYWxSZWN0ID0gbmV3IFJlY3RhbmdsZSh4LCB5LCB3LCBoKTsNCi0NCi0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgeCArPSBwYXJlbnRYOw0KLSAgICAgICAgICAgICAgICB5ICs9IHBhcmVudFk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmICh2aWV3SW5mby5nZXRDaGlsZHJlbigpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChJTGF5b3V0Vmlld0luZm8gY2hpbGQgOiB2aWV3SW5mby5nZXRDaGlsZHJlbigpKSB7DQotICAgICAgICAgICAgICAgICAgICBtQ2hpbGRyZW4uYWRkKG5ldyBWaWV3SW5mbyhjaGlsZCwgdGhpcywgeCwgeSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGFkanVzdCBzZWxlY3Rpb24gYm91bmRzIGZvciB2aWV3cyB3aGljaCBhcmUgdG9vIHNtYWxsIHRvIHNlbGVjdA0KLQ0KLSAgICAgICAgICAgIGlmICh3IDwgU0VMRUNUSU9OX01JTl9TSVpFKSB7DQotICAgICAgICAgICAgICAgIGludCBkID0gKFNFTEVDVElPTl9NSU5fU0laRSAtIHcpIC8gMjsNCi0gICAgICAgICAgICAgICAgeCAtPSBkOw0KLSAgICAgICAgICAgICAgICB3ICs9IFNFTEVDVElPTl9NSU5fU0laRSAtIHc7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChoIDwgU0VMRUNUSU9OX01JTl9TSVpFKSB7DQotICAgICAgICAgICAgICAgIGludCBkID0gKFNFTEVDVElPTl9NSU5fU0laRSAtIGgpIC8gMjsNCi0gICAgICAgICAgICAgICAgeSAtPSBkOw0KLSAgICAgICAgICAgICAgICBoICs9IFNFTEVDVElPTl9NSU5fU0laRSAtIGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1TZWxlY3Rpb25SZWN0ID0gbmV3IFJlY3RhbmdsZSh4LCB5LCB3IC0gMSwgaCAtIDEpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIG9yaWdpbmFsIHtAbGluayBJTGF5b3V0UmVzdWx0fSBib3VuZHMsIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQuICovDQotICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldFJlYWxSZWN0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBtUmVhbFJlY3Q7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBzZWxlY3Rpb24gYm91bmRzIG9mIHRoZSB2aWV3IGluZm8gYXMgYSByZWN0YW5nbGUuDQotICAgICAgICAqIFRoZSBzZWxlY3Rpb24gYm91bmRzIHdpbGwgYWx3YXlzIGhhdmUgYSBzaXplIGdyZWF0ZXIgb3IgZXF1YWwgdG8NCi0gICAgICAgICoge0BsaW5rICNTRUxFQ1RJT05fTUlOX1NJWkV9Lg0KLSAgICAgICAgKiBUaGUgd2lkdGgvaGVpZ2h0IGlzIGluY2x1c2l2ZSAoaS5lLiB3aWR0aCA9IHJpZ2h0LWxlZnQtMSkuDQotICAgICAgICAqIFRoaXMgaXMgaW4gYWJzb2x1dGUgInNjcmVlbiIgY29vcmRpbmF0ZXMgKHJlbGF0aXZlIHRvIHRoZSByZW5kZXJlZCBiaXRtYXApLg0KLSAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGlvblJlY3Q7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdGhlIHZpZXcga2V5LiBDb3VsZCBiZSBudWxsLCBhbHRob3VnaCB1bmxpa2VseS4NCi0gICAgICAgICAqIEBzZWUgSUxheW91dFZpZXdJbmZvI2dldFZpZXdLZXkoKQ0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbUtleTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBWaWV3SW5mb30uDQotICAgICAgICAgKiBJdCBpcyBudWxsIGZvciB0aGUgcm9vdCBhbmQgbm9uLW51bGwgZm9yIGNoaWxkcmVuLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgVmlld0luZm8gZ2V0UGFyZW50KCkgew0KLSAgICAgICAgICAgIHJldHVybiBtUGFyZW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMge0BsaW5rIFZpZXdJbmZvfS4NCi0gICAgICAgICAqIFRoZSBsaXN0IGlzIG5ldmVyIG51bGwuIEl0IGNhbiBiZSBlbXB0eS4NCi0gICAgICAgICAqIEJ5IGNvbnRyYWN0LCB0aGlzLmdldENoaWxkcmVuKCkuZ2V0KDAuLm4tMSkuZ2V0UGFyZW50KCkgPT0gdGhpcy4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIEFycmF5TGlzdDxWaWV3SW5mbz4gZ2V0Q2hpbGRyZW4oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1DaGlsZHJlbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUge0BsaW5rIFZpZXdJbmZvfS4NCi0gICAgICAgICAqIENvdWxkIGJlIG51bGwsIGFsdGhvdWdoIHVubGlrZWx5Lg0KLSAgICAgICAgICogRXhwZXJpZW5jZSBzaG93cyB0aGlzIGlzIHRoZSBmdWxsIHF1YWxpZmllZCBKYXZhIG5hbWUgb2YgdGhlIFZpZXcuDQotICAgICAgICAgKiBAc2VlIElMYXlvdXRWaWV3SW5mbyNnZXROYW1lKCkNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVwcmVzZW50cyBvbmUgc2VsZWN0aW9uLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uIHsNCi0gICAgICAgIC8qKiBDdXJyZW50IHNlbGVjdGVkIHZpZXcgaW5mby4gQ2Fubm90IGJlIG51bGwuICovDQotICAgICAgICBwcml2YXRlIGZpbmFsIFZpZXdJbmZvIG1WaWV3SW5mbzsNCi0NCi0gICAgICAgIC8qKiBDdXJyZW50IHNlbGVjdGlvbiBib3JkZXIgcmVjdGFuZ2xlLiBDYW5ub3QgYmUgbnVsbC4gKi8NCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlIG1SZWN0Ow0KLQ0KLSAgICAgICAgLyoqIFRoZSBuYW1lIGRpc3BsYXllZCBvdmVyIHRoZSBzZWxlY3Rpb24sIHR5cGljYWxseSB0aGUgd2lkZ2V0IGNsYXNzIG5hbWUuIENhbiBiZSBudWxsLiAqLw0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNlbGVjdGlvbn0gb2JqZWN0Lg0KLSAgICAgICAgICogQHBhcmFtIHZpZXdJbmZvIFRoZSB2aWV3IGluZm8gYmVpbmcgc2VsZWN0ZWQuIE11c3Qgbm90IGJlIG51bGwuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBTZWxlY3Rpb24oVmlld0luZm8gdmlld0luZm8pIHsNCi0NCi0gICAgICAgICAgICBhc3NlcnQgdmlld0luZm8gIT0gbnVsbDsNCi0NCi0gICAgICAgICAgICBtVmlld0luZm8gPSB2aWV3SW5mbzsNCi0NCi0gICAgICAgICAgICBpZiAodmlld0luZm8gPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtUmVjdCA9IG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSB2aWV3SW5mby5nZXRTZWxlY3Rpb25SZWN0KCk7DQotICAgICAgICAgICAgICAgIG1SZWN0ID0gbmV3IFJlY3RhbmdsZShyLnggKyBJTUFHRV9NQVJHSU4sIHIueSArIElNQUdFX01BUkdJTiwgci53aWR0aCwgci5oZWlnaHQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZpZXdJbmZvID09IG51bGwgPyBudWxsIDogdmlld0luZm8uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgaXMgdHlwaWNhbGx5IGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUuIExldCdzIG1ha2UgaXQgYSB0YWQgc2hvcnRlci4NCi0NCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiYW5kcm9pZC4iKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBhbmRyb2lkIGNsYXNzZXMsIGNvbnZlcnQgYW5kcm9pZC5mb28uTmFtZSB0byBhbmRyb2lkLi4uTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0ID0gbmFtZS5pbmRleE9mKCcuJyk7DQotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gZmlyc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgZmlyc3QpICsgIi4uIiArIG5hbWUuc3Vic3RyaW5nKGxhc3QpOyAgIC8vICROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgY3VzdG9tIG5vbi1hbmRyb2lkIGNsYXNzZXMsIGl0J3MgYmVzdCB0byBrZWVwIHRoZSAyIGZpcnN0IHNlZ21lbnRzIG9mDQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmFtZXNwYWNlLCBlLmcuIHdlIHdhbnQgdG8gZ2V0IHNvbWV0aGluZyBsaWtlIGNvbS5leGFtcGxlLi4uTXlDbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0ID0gbmFtZS5pbmRleE9mKCcuJyk7DQotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IG5hbWUuaW5kZXhPZignLicsIGZpcnN0ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gZmlyc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgZmlyc3QpICsgIi4uIiArIG5hbWUuc3Vic3RyaW5nKGxhc3QpOyAgIC8vICROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbU5hbWUgPSBuYW1lOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB2aWV3IGluZm8uIENhbm5vdCBiZSBudWxsLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgVmlld0luZm8gZ2V0Vmlld0luZm8oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1WaWV3SW5mbzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGJvcmRlciByZWN0YW5nbGUuDQotICAgICAgICAgKiBDYW5ub3QgYmUgbnVsbC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRSZWN0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBtUmVjdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogVGhlIG5hbWUgZGlzcGxheWVkIG92ZXIgdGhlIHNlbGVjdGlvbiwgdHlwaWNhbGx5IHRoZSB3aWRnZXQgY2xhc3MgbmFtZS4NCi0gICAgICAgICAqIENhbiBiZSBudWxsLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIHNlbGVjdGlvbiwgaS5lLiB0aGUgcG9zc2libGUgc2VsZWN0ZWQgaXRlbXMNCi0gICAgICogdGhhdCBhcmUgbG9jYXRlZCBhdCB0aGUgc2FtZSB4L3kgYXMgdGhlIG9yaWdpbmFsIHZpZXcsIGVpdGhlciBzaWJsaW5nIG9yIHBhcmVudHMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbHRlcm5hdGVTZWxlY3Rpb24gew0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWaWV3SW5mbyBtT3JpZ2luYXRpbmdWaWV3Ow0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFZpZXdJbmZvPiBtQWx0Vmlld3M7DQotICAgICAgICBwcml2YXRlIGludCBtSW5kZXg7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYWx0ZXJuYXRlIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gb3JpZ2luYXRpbmcgdmlldyBhbmQgdGhlDQotICAgICAgICAgKiBnaXZlbiBsaXN0IG9mIGFsdGVybmF0ZSB2aWV3cy4gQm90aCBjYW5ub3QgYmUgbnVsbC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIEFsdGVybmF0ZVNlbGVjdGlvbihWaWV3SW5mbyBvcmlnaW5hdGluZ1ZpZXcsIExpc3Q8Vmlld0luZm8+IGFsdFZpZXdzKSB7DQotICAgICAgICAgICAgYXNzZXJ0IG9yaWdpbmF0aW5nVmlldyAhPSBudWxsOw0KLSAgICAgICAgICAgIGFzc2VydCBhbHRWaWV3cyAhPSBudWxsOw0KLSAgICAgICAgICAgIG1PcmlnaW5hdGluZ1ZpZXcgPSBvcmlnaW5hdGluZ1ZpZXc7DQotICAgICAgICAgICAgbUFsdFZpZXdzID0gYWx0Vmlld3M7DQotICAgICAgICAgICAgbUluZGV4ID0gYWx0Vmlld3Muc2l6ZSgpIC0gMTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsdGVybmF0ZSB2aWV3cy4gQ2Fubm90IGJlIG51bGwuICovDQotICAgICAgICBwdWJsaWMgTGlzdDxWaWV3SW5mbz4gZ2V0QWx0Vmlld3MoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1BbHRWaWV3czsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBvcmlnaW5hdGluZyB2aWV3LiBDYW5ub3QgYmUgbnVsbC4gKi8NCi0gICAgICAgIHB1YmxpYyBWaWV3SW5mbyBnZXRPcmlnaW5hdGluZ1ZpZXcoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1PcmlnaW5hdGluZ1ZpZXc7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIHZpZXcgdG8gc2VsZWN0Lg0KLSAgICAgICAgICogSW5pdGlhbGx5IHRoaXMgaXMgdGhlIHRvcC1tb3N0IHZpZXcuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBWaWV3SW5mbyBnZXRDdXJyZW50KCkgew0KLSAgICAgICAgICAgIHJldHVybiBtSW5kZXggPj0gMCA/IG1BbHRWaWV3cy5nZXQobUluZGV4KSA6IG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIENoYW5nZXMgdGhlIGN1cnJlbnQgdmlldyB0byBiZSB0aGUgbmV4dCBvbmUgYW5kIHRoZW4gcmV0dXJucyBpdC4NCi0gICAgICAgICAqIFRoaXMgbG9vcHMgdGhyb3VnaCB0aGUgYWx0ZXJuYXRlIHZpZXdzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgVmlld0luZm8gZ2V0TmV4dCgpIHsNCi0gICAgICAgICAgICBpZiAobUluZGV4ID09IDApIHsNCi0gICAgICAgICAgICAgICAgbUluZGV4ID0gbUFsdFZpZXdzLnNpemUoKSAtIDE7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5kZXggPiAwKSB7DQotICAgICAgICAgICAgICAgIG1JbmRleC0tOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRDb25zdGFudHMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2Yzk4NS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvTGF5b3V0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7Ci0KLS8qKgotICogQSBidW5jaCBvZiBjb25zdGFudHMgdGhhdCBtYXAgdG8gZWl0aGVyOgotICogPHVsPgotICogPGxpPkFuZHJvaWQgTGF5b3V0cyBYTUwgZWxlbWVudCBuYW1lcyAoTGluZWFyLCBSZWxhdGl2ZSwgQWJzb2x1dGUsIGV0Yy4pCi0gKiA8bGk+QXR0cmlidXRlcyBmb3IgbGF5b3V0IFhNTCBlbGVtZW50cy4gCi0gKiA8bGk+VmFsdWVzIGZvciBhdHRyaWJ1dGVzLgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIExheW91dENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxBVElWRV9MQVlPVVQgPSAiUmVsYXRpdmVMYXlvdXQiOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FQVJfTEFZT1VUICAgPSAiTGluZWFyTGF5b3V0IjsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNPTFVURV9MQVlPVVQgPSAiQWJzb2x1dGVMYXlvdXQiOyAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEVYVCA9ICJ0ZXh0IjsgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfSEVJR0hUID0gImxheW91dF9oZWlnaHQiOyAgICAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfV0lEVEggPSAibGF5b3V0X3dpZHRoIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9BTElHTl9QQVJFTlRfVE9QID0gImxheW91dF9hbGlnblBhcmVudFRvcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9BTElHTl9QQVJFTlRfQk9UVE9NID0gImxheW91dF9hbGlnblBhcmVudEJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9BTElHTl9QQVJFTlRfTEVGVCA9ICJsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0IjsvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfQUxJR05fUEFSRU5UX1JJR0hUID0gImxheW91dF9hbGlnblBhcmVudFJpZ2h0IjsgICAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfQUxJR05fQkFTRUxJTkUgPSAibGF5b3V0X2FsaWduQmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9DRU5URVJfVkVSVElDQUwgPSAibGF5b3V0X2NlbnRlclZlcnRpY2FsIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTEFZT1VUX0NFTlRFUl9IT1JJWk9OVEFMID0gImxheW91dF9jZW50ZXJIb3Jpem9udGFsIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTEFZT1VUX1RPX1JJR0hUX09GID0gImxheW91dF90b1JpZ2h0T2YiOyAgICAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfVE9fTEVGVF9PRiA9ICJsYXlvdXRfdG9MZWZ0T2YiOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9CRUxPVyA9ICJsYXlvdXRfYmVsb3ciOyAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTEFZT1VUX0FCT1ZFID0gImxheW91dF9hYm92ZSI7ICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVlPVVRfWSA9ICJsYXlvdXRfeSI7ICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBWU9VVF9YID0gImxheW91dF94IjsgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfV1JBUF9DT05URU5UID0gIndyYXBfY29udGVudCI7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9GSUxMX1BBUkVOVCA9ICJmaWxsX3BhcmVudCI7ICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RSVUUgPSAidHJ1ZSI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTl9ESVAgPSAiJWRkaXAiOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgTGF5b3V0Q29uc3RhbnRzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRDb250ZW50QXNzaXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvTGF5b3V0Q29udGVudEFzc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjMxM2Y2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRDb250ZW50QXNzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRDb250ZW50QXNzaXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci0KLS8qKgotICogQ29udGVudCBBc3Npc3QgUHJvY2Vzc29yIGZvciAvcmVzL2xheW91dCBYTUwgZmlsZXMKLSAqLwotY2xhc3MgTGF5b3V0Q29udGVudEFzc2lzdCBleHRlbmRzIEFuZHJvaWRDb250ZW50QXNzaXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBMYXlvdXRDb250ZW50QXNzaXN0IAotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRDb250ZW50QXNzaXN0KCkgewotICAgICAgICBzdXBlcihBbmRyb2lkVGFyZ2V0RGF0YS5ERVNDUklQVE9SX0xBWU9VVCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dEVkaXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY3MGQ4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5Eb2N1bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZS5VaUFjdGlvbnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRm9sZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuRWNsaXBzZVVpSGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNob3dFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBNdWx0aS1wYWdlIGZvcm0gZWRpdG9yIGZvciAvcmVzL2xheW91dCBYTUwgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRFZGl0b3IgZXh0ZW5kcyBBbmRyb2lkRWRpdG9yIGltcGxlbWVudHMgSVNob3dFZGl0b3JJbnB1dCwgSVBhcnRMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IEFuZHJvaWRDb25zdGFudHMuRURJVE9SU19OQU1FU1BBQ0UgKyAiLmxheW91dC5MYXlvdXRFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUm9vdCBub2RlIG9mIHRoZSBVSSBlbGVtZW50IGhpZXJhcmNoeSAqLwotICAgIHByaXZhdGUgVWlEb2N1bWVudE5vZGUgbVVpUm9vdE5vZGU7Ci0KLSAgICBwcml2YXRlIElHcmFwaGljYWxMYXlvdXRFZGl0b3IgbUdyYXBoaWNhbEVkaXRvcjsKLSAgICBwcml2YXRlIGludCBtR3JhcGhpY2FsRWRpdG9ySW5kZXg7Ci0gICAgLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSUNvbnRlbnRPdXRsaW5lUGFnZX0gZm9yIHRoaXMgZWRpdG9yICovCi0gICAgcHJpdmF0ZSBVaUNvbnRlbnRPdXRsaW5lUGFnZSBtT3V0bGluZTsKLSAgICAvKiogQ3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUHJvcGVydHlTaGVldFBhZ2V9IGZvciB0aGlzIGVkaXRvciAqLwotICAgIHByaXZhdGUgVWlQcm9wZXJ0eVNoZWV0UGFnZSBtUHJvcGVydHlQYWdlOwotCi0gICAgcHJpdmF0ZSBVaUVkaXRvckFjdGlvbnMgbVVpRWRpdG9yQWN0aW9uczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGZvcm0gZWRpdG9yIGZvciByZXNvdXJjZXMgWE1MIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRFZGl0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcm9vdCBub2RlIG9mIHRoZSBVSSBlbGVtZW50IGhpZXJhcmNoeQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaURvY3VtZW50Tm9kZSBnZXRVaVJvb3ROb2RlKCkgewotICAgICAgICByZXR1cm4gbVVpUm9vdE5vZGU7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBCYXNlIENsYXNzIE92ZXJyaWRlcyAtLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgWE1MLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgYWN0dWFsIHNhdmUgb3BlcmF0aW9uIGlzIGRvbmUgaW4gdGhlIHN1cGVyIGNsYXNzIGJ5IGNvbW1pdHRpbmcKLSAgICAgKiBhbGwgZGF0YSB0byB0aGUgWE1MIG1vZGVsIGFuZCB0aGVuIGhhdmluZyB0aGUgU3RydWN0dXJlZCBYTUwgRWRpdG9yCi0gICAgICogc2F2ZSB0aGUgWE1MLgotICAgICAqIDxwLz4KLSAgICAgKiBIZXJlIHdlIGp1c3QgbmVlZCB0byB0ZWxsIHRoZSBncmFwaGljYWwgZWRpdG9yIHRoYXQgdGhlIG1vZGVsIGhhcwotICAgICAqIGJlZW4gc2F2ZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0gICAgICAgIGlmIChtR3JhcGhpY2FsRWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGlzIGVkaXRvci4KLSAgICAgKiA8cC8+Ci0gICAgICogU2F2ZS1BcyBpcyBhIHZhbGlkIG9wZXJhdGlvbiBmb3IgdGhlIE1hbmlmZXN0RWRpdG9yIHNpbmNlIGl0IGFjdHMgb24gYQotICAgICAqIHNpbmdsZSBzb3VyY2UgZmlsZS4KLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmFyaW91cyBmb3JtIHBhZ2VzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1QYWdlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoZSBncmFwaGljYWwgbGF5b3V0IGVkaXRvciBpcyBub3cgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGVyZSdzIGFuIGlzc3VlIHdlIHByb3ZpZGUgYSB3YXkgdG8gZGlzYWJsZSBpdCB1c2luZyBhbgotICAgICAgICAgICAgLy8gZW52IHZhcmlhYmxlLgotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRlbnYoIkFORFJPSURfRElTQUJMRV9MQVlPVVQiKSA9PSBudWxsKSB7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChtR3JhcGhpY2FsRWRpdG9yID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldGVudigiVVNFX0dMRTIiKSAhPSBudWxsKSB7ICAgICAgICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JhcGhpY2FsRWRpdG9yID0gbmV3IEdyYXBoaWNhbEVkaXRvclBhcnQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtR3JhcGhpY2FsRWRpdG9yID0gbmV3IEdyYXBoaWNhbExheW91dEVkaXRvcih0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3JJbmRleCA9IGFkZFBhZ2UobUdyYXBoaWNhbEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VUZXh0KG1HcmFwaGljYWxFZGl0b3JJbmRleCwgbUdyYXBoaWNhbEVkaXRvci5nZXRUaXRsZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtR3JhcGhpY2FsRWRpdG9yLnJlbG9hZEVkaXRvcigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29uZmlnIGJhc2VkIG9uIHRoZSBvcGVuZWQgZmlsZS4KLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dClpbnB1dDsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VGb2xkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5lZGl0TmV3RmlsZShyZXNGb2xkZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHB1dCBpbiBwbGFjZSB0aGUgbGlzdGVuZXIgdG8gaGFuZGxlIGxheW91dCByZWNvbXB1dGUgb25seSB3aGVuIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRXJyb3IgY3JlYXRpbmcgbmVzdGVkIHBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ2hhbmdlIHRoZSB0YWIvdGl0bGUgbmFtZSB0byBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgaGFuZGxlTmV3SW5wdXQoaW5wdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I3NldElucHV0V2l0aE5vdGlmeShvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXRXaXRoTm90aWZ5KElFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBzdXBlci5zZXRJbnB1dFdpdGhOb3RpZnkoaW5wdXQpOwotICAgICAgICBoYW5kbGVOZXdJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQge0BsaW5rIElFZGl0b3JJbnB1dH0gd2l0aCBhbm90aGVyIG9uZS4KLSAgICAgKiA8cC8+VGhpcyBpcyB1c2VkIHdoZW4ge0BsaW5rIE1hdGNoaW5nU3RyYXRlZ3l9IHJldHVybmVkIDxjb2RlPnRydWU8L2NvZGU+IHdoaWNoIG1lYW5zIHdlJ3JlCi0gICAgICogb3BlbmluZyBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBzYW1lIGxheW91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93RWRpdG9ySW5wdXQoSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0gICAgICAgIC8vIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGlucHV0LgotICAgICAgICBkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHBhZ2UKLSAgICAgICAgaW50IGN1cnJlbnRQYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotCi0gICAgICAgIC8vIHJlbW92ZSB0aGUgcGFnZXMsIGV4Y2VwdCBmb3IgdGhlIGdyYXBoaWNhbCBlZGl0b3IsIHdoaWNoIHdpbGwgYmUgZHluYW1pY2FsbHkgYWRhcHRlZAotICAgICAgICAvLyB0byB0aGUgbmV3IG1vZGVsLgotICAgICAgICAvLyBwYWdlIGFmdGVyIHRoZSBncmFwaGljYWwgZWRpdG9yOgotICAgICAgICBpbnQgY291bnQgPSBnZXRQYWdlQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMSA7IGkgPiBtR3JhcGhpY2FsRWRpdG9ySW5kZXggOyBpLS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVBhZ2UoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcGFnZXMgYmVmb3JlIHRoZSBncmFwaGljYWwgZWRpdG9yCi0gICAgICAgIGZvciAoaW50IGkgPSBtR3JhcGhpY2FsRWRpdG9ySW5kZXggLSAxIDsgaSA+PSAwIDsgaS0tKSB7Ci0gICAgICAgICAgICByZW1vdmVQYWdlKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBjdXJyZW50IGlucHV0LgotICAgICAgICBzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOwotCi0gICAgICAgIC8vIHJlLWNyZWF0ZSBvciByZWxvYWQgdGhlIHBhZ2VzIHdpdGggdGhlIGRlZmF1bHQgcGFnZSBzaG93biBhcyB0aGUgcHJldmlvdXMgYWN0aXZlIHBhZ2UuCi0gICAgICAgIGNyZWF0ZUFuZHJvaWRQYWdlcygpOwotICAgICAgICBzZWxlY3REZWZhdWx0UGFnZShJbnRlZ2VyLnRvU3RyaW5nKGN1cnJlbnRQYWdlKSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRsaW5lCi0gICAgICAgIGlmIChtT3V0bGluZSAhPSBudWxsICYmIG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbU91dGxpbmUucmVsb2FkTW9kZWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgbmV3IFhNTCBNb2RlbCwgd2hpY2ggWE1MIHJvb3Qgbm9kZSBpcyBnaXZlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxfZG9jIFRoZSBYTUwgZG9jdW1lbnQsIGlmIGF2YWlsYWJsZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB4bWxNb2RlbENoYW5nZWQoRG9jdW1lbnQgeG1sX2RvYykgewotICAgICAgICAvLyBpbml0IHRoZSB1aSByb290IG9uIGRlbWFuZAotICAgICAgICBpbml0VWlSb290Tm9kZShmYWxzZSAvKmZvcmNlKi8pOwotCi0gICAgICAgIG1VaVJvb3ROb2RlLmxvYWRGcm9tWG1sTm9kZSh4bWxfZG9jKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIG1vZGVsIGZpcnN0LCBzaW5jZSBpdCBpcyB1c2VkIGJ5IHRoZSB2aWV3ZXJzLgotICAgICAgICBzdXBlci54bWxNb2RlbENoYW5nZWQoeG1sX2RvYyk7Ci0KLSAgICAgICAgaWYgKG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5vblhtbE1vZGVsQ2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1PdXRsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdXRsaW5lLnJlbG9hZE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIFJldHVybnMgdGhlIElDb250ZW50T3V0bGluZVBhZ2Ugd2hlbiBhc2tlZCBmb3IgaXQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLSAgICAgICAgLy8gZm9yIHRoZSBvdXRsaW5lLCBmb3JjZSBpdCB0byBjb21lIGZyb20gdGhlIEdyYXBoaWNhbCBFZGl0b3IuCi0gICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIGNhc2Ugd2hlcmUgYSBsYXlvdXQgZmlsZSBpcyBvcGVuZWQgaW4gWE1MIHZpZXcgZmlyc3QgYW5kIHRoZSBvdXRsaW5lCi0gICAgICAgIC8vIGdldHMgc3R1Y2sgaW4gdGhlIFhNTCBvdXRsaW5lLgotICAgICAgICBpZiAoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcyA9PSBhZGFwdGVyICYmIG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBpZiAobU91dGxpbmUgPT0gbnVsbCAmJiBtR3JhcGhpY2FsRWRpdG9yIGluc3RhbmNlb2YgR3JhcGhpY2FsTGF5b3V0RWRpdG9yKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgR0xFMgotICAgICAgICAgICAgICAgIG1PdXRsaW5lID0gbmV3IFVpQ29udGVudE91dGxpbmVQYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgKEdyYXBoaWNhbExheW91dEVkaXRvcikgbUdyYXBoaWNhbEVkaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlVmlld2VyKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbU91dGxpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzID09IGFkYXB0ZXIgJiYgbUdyYXBoaWNhbEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5UGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByb3BlcnR5UGFnZSA9IG5ldyBVaVByb3BlcnR5U2hlZXRQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtUHJvcGVydHlQYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0dXJuIGRlZmF1bHQKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0gICAgICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQotICAgICAgICBpZiAobUdyYXBoaWNhbEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobmV3UGFnZUluZGV4ID09IG1HcmFwaGljYWxFZGl0b3JJbmRleCkgewotICAgICAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3IuYWN0aXZhdGVkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3IuZGVhY3RpdmF0ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tIElQYXJ0TGlzdGVuZXIgTWV0aG9kcyAtLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gdGhpcykgewotICAgICAgICAgICAgaWYgKG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRBY3RpdmVQYWdlKCkgPT0gbUdyYXBoaWNhbEVkaXRvckluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3IuYWN0aXZhdGVkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5kZWFjdGl2YXRlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICBwYXJ0QWN0aXZhdGVkKHBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKHBhcnQgPT0gdGhpcykgewotICAgICAgICAgICAgaWYgKG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCAmJiBnZXRBY3RpdmVQYWdlKCkgPT0gbUdyYXBoaWNhbEVkaXRvckluZGV4KSB7Ci0gICAgICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5kZWFjdGl2YXRlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0gICAgICAgIEVjbGlwc2VVaUhlbHBlci5zaG93VmlldyhFY2xpcHNlVWlIZWxwZXIuQ09OVEVOVF9PVVRMSU5FX1ZJRVdfSUQsIGZhbHNlIC8qIGFjdGl2YXRlICovKTsKLSAgICAgICAgRWNsaXBzZVVpSGVscGVyLnNob3dWaWV3KEVjbGlwc2VVaUhlbHBlci5QUk9QRVJUWV9TSEVFVF9WSUVXX0lELCBmYWxzZSAvKiBhY3RpdmF0ZSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFVpRWRpdG9yQWN0aW9ucyBleHRlbmRzIFVpQWN0aW9ucyB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBVaURvY3VtZW50Tm9kZSBnZXRSb290Tm9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlSb290Tm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbGVjdCB0aGUgbmV3IGl0ZW0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFVpTm9kZShVaUVsZW1lbnROb2RlIHVpTm9kZVRvU2VsZWN0KSB7Ci0gICAgICAgICAgICBtR3JhcGhpY2FsRWRpdG9yLnNlbGVjdE1vZGVsKHVpTm9kZVRvU2VsZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjb21taXRQZW5kaW5nWG1sQ2hhbmdlcygpIHsKLSAgICAgICAgICAgIC8vIFBhc3MuIFRoZXJlIGlzIG5vdGhpbmcgdG8gY29tbWl0IGJlZm9yZSB0aGUgWE1MIGlzIGNoYW5nZWQgaGVyZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVaUVkaXRvckFjdGlvbnMgZ2V0VWlFZGl0b3JBY3Rpb25zKCkgewotICAgICAgICBpZiAobVVpRWRpdG9yQWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVWlFZGl0b3JBY3Rpb25zID0gbmV3IFVpRWRpdG9yQWN0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtVWlFZGl0b3JBY3Rpb25zOwotICAgIH0KLQotICAgIC8vIC0tLS0gTG9jYWwgTWV0aG9kcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEdyYXBoaWNzIGVkaXRvciBwYWdlIGlzIHZpc2libGUuIFRoaXMgPGI+bXVzdDwvYj4gYmUKLSAgICAgKiBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHcmFwaGljYWxFZGl0b3JBY3RpdmUoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSB3b3JrYmVuY2hTaXRlID0gZ2V0U2l0ZSgpOwotICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoU2l0ZS5nZXRQYWdlKCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBpcyB2aXNpYmxlIGluIHRoZSB3b3JrYmVuY2ggcGFnZQotICAgICAgICBpZiAod29ya2JlbmNoUGFnZS5pc1BhcnRWaXNpYmxlKHRoaXMpICYmIHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgewotICAgICAgICAgICAgLy8gYW5kIHRoZW4gaWYgdGhlIHBhZ2Ugb2YgdGhlIGVkaXRvciBpcyB2aXNpYmxlIChub3QgdG8gYmUgY29uZnVzZWQgd2l0aAotICAgICAgICAgICAgLy8gdGhlIHdvcmtiZW5jaCBwYWdlKQotICAgICAgICAgICAgcmV0dXJuIG1HcmFwaGljYWxFZGl0b3JJbmRleCA9PSBnZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFVpUm9vdE5vZGUoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAvLyBUaGUgcm9vdCBVSSBub2RlIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmIHRoZXJlJ3Mgbm8gY29ycmVzcG9uZGluZyBYTUwgbm9kZS4KLSAgICAgICAgaWYgKG1VaVJvb3ROb2RlID09IG51bGwgfHwgZm9yY2UpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0IGRhdGEgZnJvbSB0aGUgb3BlbmVkIGZpbGUgKGFuZCBpdHMgcHJvamVjdCkKLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBnZXRUYXJnZXREYXRhKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVVpUm9vdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvYyA9IG1VaVJvb3ROb2RlLmdldFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50RGVzY3JpcHRvciBkZXNjOwotICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgRG9jdW1lbnREZXNjcmlwdG9yKCJ0ZW1wIiwgbnVsbCAvKmNoaWxkcmVuKi8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZGF0YS5nZXRMYXlvdXREZXNjcmlwdG9ycygpLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZXNjcmlwdG9ycyBmcm9tIHRoZSBkYXRhLgotICAgICAgICAgICAgbVVpUm9vdE5vZGUgPSAoVWlEb2N1bWVudE5vZGUpIGRlc2MuY3JlYXRlVWlOb2RlKCk7Ci0gICAgICAgICAgICBtVWlSb290Tm9kZS5zZXRFZGl0b3IodGhpcyk7Ci0KLSAgICAgICAgICAgIG9uRGVzY3JpcHRvcnNDaGFuZ2VkKGRvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25EZXNjcmlwdG9yc0NoYW5nZWQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1VaVJvb3ROb2RlLmxvYWRGcm9tWG1sTm9kZShkb2N1bWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVWlSb290Tm9kZS5yZWxvYWRGcm9tWG1sTm9kZShtVWlSb290Tm9kZS5nZXRYbWxEb2N1bWVudCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3V0bGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3V0bGluZS5yZWxvYWRNb2RlbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1HcmFwaGljYWxFZGl0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5yZWxvYWRFZGl0b3IoKTsKLSAgICAgICAgICAgIG1HcmFwaGljYWxFZGl0b3IucmVsb2FkUGFsZXR0ZSgpOwotICAgICAgICAgICAgbUdyYXBoaWNhbEVkaXRvci5yZWxvYWRDb25maWd1cmF0aW9uVWkodHJ1ZSAvKm5vdGlmeSBsaXN0ZW5lciAqLyk7Ci0gICAgICAgICAgICBtR3JhcGhpY2FsRWRpdG9yLnJlY29tcHV0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIG5ldyBpbnB1dCwgYW5kIHVwZGF0ZSB0aGUgcGFydCBuYW1lLgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgbmV3IGlucHV0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXdJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgICAgIHNldFBhcnROYW1lKFN0cmluZy5mb3JtYXQoIiUxJHMiLAotICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dFJlbG9hZE1vbml0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRSZWxvYWRNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2NiMjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dFJlbG9hZE1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JUmVzb3VyY2VFdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIE1vbml0b3IgZm9yIGZpbGUgY2hhbmdlcyB0cmlnZ2VyaW5nIGEgbGF5b3V0IHJlZHJhdy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExheW91dFJlbG9hZE1vbml0b3IgaW1wbGVtZW50cyBJRmlsZUxpc3RlbmVyLCBJUmVzb3VyY2VFdmVudExpc3RlbmVyIHsKLQotICAgIC8vIHNpbmdsZXRvbiwgZW5mb3JjZWQgYnkgcHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMYXlvdXRSZWxvYWRNb25pdG9yIHNUaGlzID0gbmV3IExheW91dFJlbG9hZE1vbml0b3IoKTsKLQotICAgIC8qKgotICAgICAqIE1hcCBvZiBsaXN0ZW5lcnMgYnkgSVByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SVByb2plY3QsIExpc3Q8SUxheW91dFJlbG9hZExpc3RlbmVyPj4gbUxpc3RlbmVyTWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8SVByb2plY3QsIExpc3Q8SUxheW91dFJlbG9hZExpc3RlbmVyPj4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDSEFOR0VfQ09ERSA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENIQU5HRV9SRVNPVVJDRVMgPSAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDSEFOR0VfUiA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENIQU5HRV9DT1VOVCA9IDM7Ci0gICAgLyoqCi0gICAgICogTGlzdCBvZiBwcm9qZWN0cyBoYXZpbmcgcmVjZWl2ZWQgYSBmaWxlIGNoYW5nZS4gdGhlIGJvb2xlYW5bXSBjb250YWlucyAzIHZhbHVlczoKLSAgICAgKiA8dWw+PGxpPkNIQU5HRV9DT0RFOiBjb2RlIGNoYW5nZSBmbGFnLjwvbGk+Ci0gICAgICogPGxpPkNIQU5HRV9SRVNPVVJDRVM6IHJlc291cmNlIGNoYW5nZSBmbGFnLjwvbGk+Ci0gICAgICogPGxpPkNIQU5HRV9SOiBSIGNsYXMgY2hhbmdlIGZsYWc8L2xpPjwvdWw+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SVByb2plY3QsIGJvb2xlYW5bXT4gbUNoYW5nZWRQcm9qZWN0cyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBib29sZWFuW10+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBwcm92aWRlIGEgbWV0aG9kIHRvIHJlc3BvbmQgdG8gcmVzb3VyY2UgY2hhbmdlcwotICAgICAqIHRyaWdnZXJpbmcgYSBsYXlvdXQgcmVkcmF3Ci0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJTGF5b3V0UmVsb2FkTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIHRoZSBsYXlvdXQgbmVlZHMgdG8gYmUgcmVkcmF3bgotICAgICAgICAgKiBAcGFyYW0gY29kZUNoYW5nZSBUaGUgdHJpZ2dlciBoYXBwZW5lZCBkdWUgdG8gYSBjb2RlIGNoYW5nZS4KLSAgICAgICAgICogQHBhcmFtIHJDaGFuZ2UgVGhlIHRyaWdnZXIgaGFwcGVuZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSBSIGNsYXNzLgotICAgICAgICAgKiBAcGFyYW0gcmVzQ2hhbmdlIFRoZSB0cmlnZ2VyIGhhcHBlbmVkIGR1ZSB0byBhIHJlc291cmNlIGNoYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgcmVsb2FkTGF5b3V0KGJvb2xlYW4gY29kZUNoYW5nZSwgYm9vbGVhbiByQ2hhbmdlLCBib29sZWFuIHJlc0NoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHtAbGluayBMYXlvdXRSZWxvYWRNb25pdG9yfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExheW91dFJlbG9hZE1vbml0b3IgZ2V0TW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNUaGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGF5b3V0UmVsb2FkTW9uaXRvcigpIHsKLSAgICAgICAgUmVzb3VyY2VNb25pdG9yIG1vbml0b3IgPSBSZXNvdXJjZU1vbml0b3IuZ2V0TW9uaXRvcigpOwotICAgICAgICBtb25pdG9yLmFkZEZpbGVMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOwotICAgICAgICBtb25pdG9yLmFkZFJlc291cmNlRXZlbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4ge0BsaW5rIElQcm9qZWN0fS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdAotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQcm9qZWN0IHByb2plY3QsIElMYXlvdXRSZWxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lck1hcCkgewotICAgICAgICAgICAgTGlzdDxJTGF5b3V0UmVsb2FkTGlzdGVuZXI+IGxpc3QgPSBtTGlzdGVuZXJNYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PElMYXlvdXRSZWxvYWRMaXN0ZW5lcj4oKTsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXJNYXAucHV0KHByb2plY3QsIGxpc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4ge0BsaW5rIElQcm9qZWN0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJUHJvamVjdCBwcm9qZWN0LCBJTGF5b3V0UmVsb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJNYXApIHsKLSAgICAgICAgICAgIExpc3Q8SUxheW91dFJlbG9hZExpc3RlbmVyPiBsaXN0ID0gbUxpc3RlbmVyTWFwLmdldChwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIsIG5vIG1hdHRlciB3aGljaCB7QGxpbmsgSVByb2plY3R9IGl0IHdhcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxheW91dFJlbG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVyTWFwKSB7Ci0KLSAgICAgICAgICAgIGZvciAoTGlzdDxJTGF5b3V0UmVsb2FkTGlzdGVuZXI+IGxpc3QgOiBtTGlzdGVuZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxJTGF5b3V0UmVsb2FkTGlzdGVuZXI+IGl0ID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUxheW91dFJlbG9hZExpc3RlbmVyIGkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3IuSUZpbGVMaXN0ZW5lciNmaWxlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhW10sIGludCkKLSAgICAgKgotICAgICAqIENhbGxiYWNrIGZvciBSZXNvdXJjZU1vbml0b3IuSUZpbGVMaXN0ZW5lci4gQ2FsbGVkIHdoZW4gYSBmaWxlIGNoYW5nZWQuCi0gICAgICogVGhpcyByZWNvcmRzIHRoZSBjaGFuZ2VzIGZvciBlYWNoIHByb2plY3QsIGJ1dCBkb2VzIG5vdCBub3RpZnkgbGlzdGVuZXJzLgotICAgICAqIEBzZWUgI3Jlc291cmNlQ2hhbmdlRXZlbnRFbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxlQ2hhbmdlZChJRmlsZSBmaWxlLCBJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXMsIGludCBraW5kKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgZmlsZSBwcm9qZWN0Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQotICAgICAgICAvLyBpZiB0aGlzIHByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgbW9kaWZpZWQsIHdlIGRvIG5vdGhpbmcuCi0gICAgICAgIGJvb2xlYW5bXSBjaGFuZ2VGbGFncyA9IG1DaGFuZ2VkUHJvamVjdHMuZ2V0KHByb2plY3QpOwotICAgICAgICBpZiAoY2hhbmdlRmxhZ3MgIT0gbnVsbCAmJiBjaGFuZ2VGbGFnc1tDSEFOR0VfQ09ERV0gJiYgY2hhbmdlRmxhZ3NbQ0hBTkdFX1JFU09VUkNFU10gJiYKLSAgICAgICAgICAgICAgICBjaGFuZ2VGbGFnc1tDSEFOR0VfUl0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBjaGVjayB0aGF0IHRoZSBmaWxlIGlzICpOT1QqIGEgbGF5b3V0IGZpbGUgKHRob3NlIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciBhIGxheW91dAotICAgICAgICAvLyByZWxvYWQgYW5kIHdlIGRvbid0IHdhbnQgdG8gZG8gaXQgdHdpY2UuCi0gICAgICAgIFJlc291cmNlRm9sZGVyIHJlc0ZvbGRlciA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlRm9sZGVyKGZpbGUpOwotICAgICAgICBpZiAocmVzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXNGb2xkZXIuZ2V0VHlwZSgpICE9IFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcmVzb3VyY2UgY2hhbmdlIQotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VGbGFncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzID0gbmV3IGJvb2xlYW5bQ0hBTkdFX0NPVU5UXTsKLSAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWRQcm9qZWN0cy5wdXQocHJvamVjdCwgY2hhbmdlRmxhZ3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzW0NIQU5HRV9SRVNPVVJDRVNdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9DTEFTUy5lcXVhbHMoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0gICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkubWF0Y2hlcygiUltcXCRcXC5dKC4qKSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIFIgY2hhbmdlIQotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VGbGFncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzID0gbmV3IGJvb2xlYW5bQ0hBTkdFX0NPVU5UXTsKLSAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWRQcm9qZWN0cy5wdXQocHJvamVjdCwgY2hhbmdlRmxhZ3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzW0NIQU5HRV9SXSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb2RlIGNoYW5nZSEKLSAgICAgICAgICAgICAgICBpZiAoY2hhbmdlRmxhZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGbGFncyA9IG5ldyBib29sZWFuW0NIQU5HRV9DT1VOVF07Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VkUHJvamVjdHMucHV0KHByb2plY3QsIGNoYW5nZUZsYWdzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGFuZ2VGbGFnc1tDSEFOR0VfQ09ERV0gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JUmVzb3VyY2VFdmVudExpc3RlbmVyI3Jlc291cmNlQ2hhbmdlRXZlbnRTdGFydCgpCi0gICAgICoKLSAgICAgKiBDYWxsYmFjayBmb3IgUmVzb3VyY2VNb25pdG9yLklSZXNvdXJjZUV2ZW50TGlzdGVuZXIuIENhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVzb3VyY2UKLSAgICAgKiBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgY2FsbGVkIG9uY2UsIHdoaWxlIGZpbGVDaGFuZ2VkIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlRXZlbnRTdGFydCgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGhlcmUsIGl0IGFsbCBoYXBwZW5zIGluIHRoZSByZXNvdXJjZUNoYW5nZUV2ZW50RW5kCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JUmVzb3VyY2VFdmVudExpc3RlbmVyI3Jlc291cmNlQ2hhbmdlRXZlbnRFbmQoKQotICAgICAqCi0gICAgICogQ2FsbGJhY2sgZm9yIFJlc291cmNlTW9uaXRvci5JUmVzb3VyY2VFdmVudExpc3RlbmVyLiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHJlc291cmNlCi0gICAgICogY2hhbmdlIGV2ZW50LiBUaGlzIGlzIHdoZXJlIHdlIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlRXZlbnRFbmQoKSB7Ci0gICAgICAgIC8vIGZvciBlYWNoIElQcm9qZWN0IHRoYXQgd2FzIGNoYW5nZWQsIHdlIG5vdGlmeSBhbGwgdGhlIGxpc3RlbmVycy4KLSAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJNYXApIHsKLSAgICAgICAgICAgIGZvciAoRW50cnk8SVByb2plY3QsIGJvb2xlYW5bXT4gcHJvamVjdCA6IG1DaGFuZ2VkUHJvamVjdHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIExpc3Q8SUxheW91dFJlbG9hZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBtTGlzdGVuZXJNYXAuZ2V0KHByb2plY3QuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbltdIGZsYWdzID0gcHJvamVjdC5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSUxheW91dFJlbG9hZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZWxvYWRMYXlvdXQoZmxhZ3NbQ0hBTkdFX0NPREVdLCBmbGFnc1tDSEFOR0VfUl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzW0NIQU5HRV9SRVNPVVJDRVNdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVtcHR5IHRoZSBsaXN0LgotICAgICAgICBtQ2hhbmdlZFByb2plY3RzLmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dFNvdXJjZVZpZXdlckNvbmZpZy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L0xheW91dFNvdXJjZVZpZXdlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjlmOTdmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9MYXlvdXRTb3VyY2VWaWV3ZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0OwotCi0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkU291cmNlVmlld2VyQ29uZmlnOwotCi0vKioKLSAqIFNvdXJjZSBWaWV3ZXIgQ29uZmlndXJhdGlvbiB0aGF0IGNhbGxzIGluIExheW91dENvbnRlbnRBc3Npc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRTb3VyY2VWaWV3ZXJDb25maWcgZXh0ZW5kcyBBbmRyb2lkU291cmNlVmlld2VyQ29uZmlnIHsKLQotICAgIHB1YmxpYyBMYXlvdXRTb3VyY2VWaWV3ZXJDb25maWcoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBMYXlvdXRDb250ZW50QXNzaXN0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9NYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmExOWE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9NYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBNYXRjaGluZyBzdHJhdGVneSBmb3IgdGhlIExheW91dCBFZGl0b3IuIFRoaXMgaXMgdXNlZCB0byBvcGVuIGFsbCBjb25maWd1cmF0aW9ucyBvZiBhIGxheW91dAotICogaW4gdGhlIHNhbWUgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICAvLyBmaXJzdCBjaGVjayB0aGF0IHRoZSBmaWxlIGJlaW5nIG9wZW5lZCBpcyBhIGxheW91dCBmaWxlLgotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIEZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KWlucHV0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIElGaWxlIG9iamVjdCBhbmQgY2hlY2sgaXQncyBpbiBvbmUgb2YgdGhlIGxheW91dCBmb2xkZXJzLgotICAgICAgICAgICAgSUZpbGUgaUZpbGUgPSBmaWxlSW5wdXQuZ2V0RmlsZSgpOwotICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VGb2xkZXIoaUZpbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiBpdCdzIGEgbGF5b3V0LCB3ZSBrbm93IGNoZWNrIHRoZSBuYW1lIG9mIHRoZSBmaWxlSW5wdXQgYWdhaW5zdCB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vIGZpbGUgYmVpbmcgY3VycmVudGx5IGVkaXRlZCBieSB0aGUgZWRpdG9yIHNpbmNlIHRob3NlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29uZmlnLgotICAgICAgICAgICAgaWYgKHJlc0ZvbGRlciAhPSBudWxsICYmIHJlc0ZvbGRlci5nZXRUeXBlKCkgPT0gUmVzb3VyY2VGb2xkZXJUeXBlLkxBWU9VVCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVFZGl0b3JJbnB1dCBlZGl0b3JGaWxlSW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KWVkaXRvcklucHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgZWRpdG9ySUZpbGUgPSBlZGl0b3JGaWxlSW5wdXQuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWRpdG9ySUZpbGUuZ2V0UHJvamVjdCgpLmVxdWFscyhpRmlsZS5nZXRQcm9qZWN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWRpdG9ySUZpbGUuZ2V0TmFtZSgpLmVxdWFscyhpRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3RoaW5nLCB3ZSdsbCBqdXN0IHJldHVybiBmYWxzZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9QYWxldHRlQ29tcG9zaXRlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvUGFsZXR0ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjk0OTRjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9QYWxldHRlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEEgcGFsZXR0ZSBjb21wb3NpdGUgZm9yIHRoZSB7QGxpbmsgR3JhcGhpY2FsRWRpdG9yUGFydH0uDQotICogPHAvPg0KLSAqIFRoZSBwYWxldHRlIGNvbnRhaW5zIHNldmVyYWwgZ3JvdXBzLCBlYWNoIHdpdGggYSBVSSBuYW1lIChlLmcuIGxheW91dHMgYW5kIHZpZXdzKSBhbmQgZWFjaA0KLSAqIHdpdGggYSBsaXN0IG9mIGVsZW1lbnQgZGVzY3JpcHRvcnMuDQotICogPHAvPg0KLSAqDQotICogQHNpbmNlIEdMRTINCi0gKg0KLSAqIFRPRE8gbGlzdDoNCi0gKiAtICpNYW5kYXRvcnkqIGZvciBhIGZpcnN0IHJlbGVhc2U6DQotICogICAtIEN1cnJlbnRseSB0aGlzIGRpc3BsYXlzIGVsZW1lbnRzIGFzIGJ1dHRvbnMuIEV2ZW50dWFsbHkgdGhpcyBuZWVkcyB0byBlaXRoZXIgYmUgcmVwbGFjZWQNCi0gKiAgICAgYnkgY3VzdG9tIGRyYXdpbmcgcmlnaHQgaW4gaGVyZSBvciB3ZSBuZWVkIHRvIHVzZSBhIGN1c3RvbSBjb250cm9sLg0KLSAqICAgLSBOZWVkcyB0byBiZSBhYmxlIHRvIG9yaWdpbmF0ZSBkcmFnJ24nZHJvcCBmcm9tIHRoZXNlIGNvbnRyb2xzIG9udG8gdGhlIEdFUC4NCi0gKiAgIC0gU2Nyb2xsIHRoZSBsaXN0Lg0KLSAqIC0gRm9yIGxhdGVyIHJlbGVhc2VzOg0KLSAqICAgLSBBYmlsaXR5IHRvIGNvbGxhcHNlIHBhbGV0dGVzIG9yIGRvY2thYmxlIHBhbGV0dGVzLg0KLSAqICAgLSBEaWZmZXJlbnQgdmlldyBzdHJhdGVnaWVzOiBiaWcgaWNvbiwgc21hbGwgaWNvbnMsIHRleHQgdnMgbm8gdGV4dCwgY29tcGFjdCBncmlkLg0KLSAqICAgICAtIFRoaXMgd291bGQgb25seSBiZSB1c2VmdWwgd2l0aCBtZWFuaW5nZnVsIGljb25zLiBPdXQgY3VycmVudCAxLWxldHRlciBpY29ucyBhcmUgbm90IGVub3VnaA0KLSAqICAgICAgIHRvIGdldCByaWQgb2YgdGV4dCBsYWJlbHMuDQotICogICAtIFdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBjb250ZXh0LXNlbnNpdGl2ZSB0b29scyBpdGVtcywgZS5nLiBzZWxlY3Rpb24gYXJyb3cgdG9vbCwNCi0gKiAgICAgZ3JvdXAgc2VsZWN0aW9uIHRvb2wsIGFsaWdubWVudCwgZXRjLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYWxldHRlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSB0aGUgY29tcG9zaXRlLg0KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFBhbGV0dGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgew0KLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsNCi0gICAgICAgIC8vIERpc2FibGUgdGhlIGNoZWNrIHRoYXQgcHJldmVudHMgc3ViY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9hZCBvciByZWxvYWQgdGhlIHBhbGV0dGUgZWxlbWVudHMgYnkgdXNpbmcgdGhlIGxheW91ciBhbmQgdmlldyBkZXNjcmlwdG9ycyBmcm9tIHRoZQ0KLSAgICAgKiBnaXZlbiB0YXJnZXQgZGF0YS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHRhcmdldERhdGEgVGhlIHRhcmdldCBkYXRhIHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0b3JzLiBJZiBudWxsIG9yIGVtcHR5LA0KLSAgICAgKiAgIG5vIGdyb3VwcyB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZWxvYWRQYWxldHRlKEFuZHJvaWRUYXJnZXREYXRhIHRhcmdldERhdGEpIHsNCi0NCi0gICAgICAgIGZvciAoQ29udHJvbCBjIDogZ2V0Q2hpbGRyZW4oKSkgew0KLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHRhcmdldERhdGEgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7DQotICAgICAgICAgICAgZ2wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOw0KLSAgICAgICAgICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7DQotICAgICAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gMjsNCi0gICAgICAgICAgICBnbC5tYXJnaW5Cb3R0b20gPSAyOw0KLSAgICAgICAgICAgIGdsLm1hcmdpbkxlZnQgPSAyOw0KLSAgICAgICAgICAgIGdsLm1hcmdpblJpZ2h0ID0gMjsNCi0gICAgICAgICAgICBnbC5tYXJnaW5Ub3AgPSAyOw0KLSAgICAgICAgICAgIGdsLm1hcmdpbkJvdHRvbSA9IDI7DQotICAgICAgICAgICAgc2V0TGF5b3V0KGdsKTsNCi0NCi0gICAgICAgICAgICAvKiBUT0RPOiBBbGwgdGhpcyBpcyBURU1QT1JBUlkuICovDQotICAgICAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7DQotICAgICAgICAgICAgbC5zZXRUZXh0KCIqKiogUExBQ0VIT0xERVIgKioqIik7ICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbC5zZXRUb29sVGlwVGV4dCgiVGVtcG9yYXJ5IG1vY2sgZm9yIHRoZSBwYWxldHRlLiBOZWVkcyB0byBzY3JvbGwsIG5lZWRzIG5vIGJ1dHRvbnMsIG5lZWRzIHRvIGRyYWcnbidkcm9wLiIpOyAvLyROT04tTkxTLTEkDQotDQotICAgICAgICAgICAgYWRkR3JvdXAoIkxheW91dHMiLCB0YXJnZXREYXRhLmdldExheW91dERlc2NyaXB0b3JzKCkuZ2V0TGF5b3V0RGVzY3JpcHRvcnMoKSk7DQotICAgICAgICAgICAgYWRkR3JvdXAoIlZpZXdzIiwgdGFyZ2V0RGF0YS5nZXRMYXlvdXREZXNjcmlwdG9ycygpLmdldFZpZXdEZXNjcmlwdG9ycygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxheW91dCh0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkR3JvdXAoU3RyaW5nIHVpTmFtZSwgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMpIHsNCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsNCi0gICAgICAgIGxhYmVsLnNldFRleHQodWlOYW1lKTsNCi0NCi0gICAgICAgIGZvciAoRWxlbWVudERlc2NyaXB0b3IgZGVzYyA6IGRlc2NyaXB0b3JzKSB7DQotICAgICAgICAgICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5QVVNIKTsNCi0gICAgICAgICAgICBiLnNldFRleHQoZGVzYy5nZXRVaU5hbWUoKSk7DQotICAgICAgICAgICAgYi5zZXRJbWFnZShkZXNjLmdldEljb24oKSk7DQotICAgICAgICAgICAgYi5zZXRUb29sVGlwVGV4dChkZXNjLmdldFRvb2x0aXAoKSk7DQotICAgICAgICAgICAgYi5zZXREYXRhKGRlc2MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9QYWxldHRlRmFjdG9yeS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1BhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjZhY2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1BhbGV0dGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRHJhd2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlVGVtcGxhdGVFbnRyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBwYWxldHRlIGZvciB0aGUge0BsaW5rIEdyYXBoaWNhbExheW91dEVkaXRvcn0uCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGNsYXNzIFBhbGV0dGVGYWN0b3J5IHsKLQotICAgIC8qKiBTdGF0aWMgZmFjdG9yeSwgbm90aGluZyB0byBpbnN0YW50aWF0ZSBoZXJlLiAqLwotICAgIHByaXZhdGUgUGFsZXR0ZUZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYWxldHRlUm9vdCBjcmVhdGVQYWxldHRlUm9vdChQYWxldHRlUm9vdCBjdXJyZW50UGFsZXR0ZSwKLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIHRhcmdldERhdGEpIHsKLQotICAgICAgICBpZiAoY3VycmVudFBhbGV0dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudFBhbGV0dGUgPSBuZXcgUGFsZXR0ZVJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IG4gPSBjdXJyZW50UGFsZXR0ZS5nZXRDaGlsZHJlbigpLnNpemUoKSAtIDE7IG4gPj0gMDsgbi0tKSB7Ci0gICAgICAgICAgICBjdXJyZW50UGFsZXR0ZS5nZXRDaGlsZHJlbigpLnJlbW92ZShuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXREYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvb2xzKGN1cnJlbnRQYWxldHRlKTsKLSAgICAgICAgICAgIGFkZFZpZXdzKGN1cnJlbnRQYWxldHRlLCAiTGF5b3V0cyIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGEuZ2V0TGF5b3V0RGVzY3JpcHRvcnMoKS5nZXRMYXlvdXREZXNjcmlwdG9ycygpKTsKLSAgICAgICAgICAgIGFkZFZpZXdzKGN1cnJlbnRQYWxldHRlLCAiVmlld3MiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhLmdldExheW91dERlc2NyaXB0b3JzKCkuZ2V0Vmlld0Rlc2NyaXB0b3JzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWxldHRlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9vbHMoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLSAgICAgICAgUGFsZXR0ZUdyb3VwIGdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiVG9vbHMiKTsKLQotICAgICAgICAvLyBEZWZhdWx0IHRvb2xzOiBzZWxlY3Rpb24uCi0gICAgICAgIC8vIERvIG5vdCB1c2UgdGhlIE1hcnF1ZWVUb29sRW50cnkgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBzZWxlY3Rpb24uCi0gICAgICAgIC8qIC0tIERvIG5vdCBwdXQgdGhlIHNlbGVjdGlvbiB0b29sLiBJdCdzIHRoZSB1bmlxdWUgdG9vbCBzbyBpdCBsb29rcyB1c2VsZXNzLgotICAgICAgICAgICAgICBMZWF2ZSB0aGlzIHBpZWNlIG9mIGNvZGUgaGVyZSBpbiBjYXNlIHdlIHdhbnQgaXQgYmFjayBsYXRlci4KLSAgICAgICAgUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeSBlbnRyeSA9IG5ldyBQYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5KCk7Ci0gICAgICAgIGdyb3VwLmFkZChlbnRyeSk7Ci0gICAgICAgIHBhbGV0dGVSb290LnNldERlZmF1bHRFbnRyeShlbnRyeSk7Ci0gICAgICAgICovCi0KLSAgICAgICAgcGFsZXR0ZVJvb3QuYWRkKGdyb3VwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFZpZXdzKFBhbGV0dGVSb290IHBhbGV0dGVSb290LCBTdHJpbmcgZ3JvdXBOYW1lLAotICAgICAgICAgICAgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMpIHsKLSAgICAgICAgUGFsZXR0ZURyYXdlciBncm91cCA9IG5ldyBQYWxldHRlRHJhd2VyKGdyb3VwTmFtZSk7Ci0KLSAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBkZXNjIDogZGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgIFBhbGV0dGVUZW1wbGF0ZUVudHJ5IGVudHJ5ID0gbmV3IFBhbGV0dGVUZW1wbGF0ZUVudHJ5KAotICAgICAgICAgICAgICAgICAgICBkZXNjLmdldFVpTmFtZSgpLCAgICAgICAgICAgLy8gbGFiZWwKLSAgICAgICAgICAgICAgICAgICAgZGVzYy5nZXRUb29sdGlwKCksICAgICAgICAgIC8vIHNob3J0IGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGRlc2MsICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZQotICAgICAgICAgICAgICAgICAgICBkZXNjLmdldEltYWdlRGVzY3JpcHRvcigpLCAgLy8gc21hbGwgaWNvbgotICAgICAgICAgICAgICAgICAgICBkZXNjLmdldEltYWdlRGVzY3JpcHRvcigpICAgLy8gbGFyZ2UgaWNvbgotICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICBncm91cC5hZGQoZW50cnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFsZXR0ZVJvb3QuYWRkKGdyb3VwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvUHJvamVjdENhbGxiYWNrLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvUHJvamVjdENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmUzZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1Byb2plY3RDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTWFuaWZlc3RQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlByb2plY3RDbGFzc0xvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUHJvamVjdFJlc291cmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklQcm9qZWN0Q2FsbGJhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIExvYWRlciBmb3IgQW5kcm9pZCBQcm9qZWN0IGNsYXNzIGluIG9yZGVyIHRvIHVzZSB0aGVtIGluIHRoZSBsYXlvdXQgZWRpdG9yLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENhbGxiYWNrIGltcGxlbWVudHMgSVByb2plY3RDYWxsYmFjayB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1Mb2FkZWRDbGFzc2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgbVBhcmVudENsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgZmluYWwgUHJvamVjdFJlc291cmNlcyBtUHJvamVjdFJlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZXNwYWNlOwotICAgIAotICAgIFByb2plY3RDYWxsYmFjayhDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0UmVzLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIG1QYXJlbnRDbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICBtUHJvamVjdFJlcyA9IHByb2plY3RSZXM7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGdvZXMgdGhyb3VnaCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiB0aGUgRWNsaXBzZSBwcm9qZWN0IGFuZCBsb2FkcyB0aGUKLSAgICAgKiA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgZGlyZWN0bHkuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCBsb2FkVmlldyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc1tdIGNvbnN0cnVjdG9yU2lnbmF0dXJlLAotICAgICAgICAgICAgT2JqZWN0W10gY29uc3RydWN0b3JQYXJhbWV0ZXJzKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBsb29rIGZvciBhIGNhY2hlZCB2ZXJzaW9uCi0gICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbUxvYWRlZENsYXNzZXMuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzcyhjbGF6eiwgY29uc3RydWN0b3JTaWduYXR1cmUsIGNvbnN0cnVjdG9yUGFyYW1ldGVycyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGxvYWQgdGhlIGNsYXNzLgotICAgICAgICBQcm9qZWN0Q2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFByb2plY3RDbGFzc0xvYWRlcihtUGFyZW50Q2xhc3NMb2FkZXIsIG1Qcm9qZWN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Vc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtTG9hZGVkQ2xhc3Nlcy5wdXQoY2xhc3NOYW1lLCBjbGF6eik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3MoY2xhenosIGNvbnN0cnVjdG9yU2lnbmF0dXJlLCBjb25zdHJ1Y3RvclBhcmFtZXRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFcnJvciBlKSB7Ci0gICAgICAgICAgICAvLyBMb2cgdGhpcyBlcnJvciB3aXRoIHRoZSBjbGFzcyBuYW1lIHdlJ3JlIHRyeWluZyB0byBsb2FkIGFuZCBhYm9ydC4KLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlByb2plY3RDYWxsYmFjay5sb2FkVmlldyBmYWlsZWQgdG8gZmluZCBjbGFzcyAlMSRzIiwgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGZvciB0aGUgcHJvamVjdC4gVGhlIG5hbWVzcGFjZSBjb250YWlucyBhIHN0YW5kYXJkIHBhcnQgKyB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgcGFja2FnZSBuYW1lc3BhY2Ugb2YgdGhlIHByb2plY3Qgb3IgbnVsbCBpbiBjYXNlIG9mIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAobU5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIuZ2V0TWFuaWZlc3QobVByb2plY3QpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgZGF0YSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEobWFuaWZlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVBhY2thZ2UgPSBkYXRhLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICBtTmFtZXNwYWNlID0gU3RyaW5nLmZvcm1hdChBbmRyb2lkQ29uc3RhbnRzLk5TX0NVU1RPTV9SRVNPVVJDRVMsIGphdmFQYWNrYWdlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1OYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklQcm9qZWN0Q2FsbGJhY2sjcmVzb2x2ZVJlc291cmNlVmFsdWUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSByZXNvbHZlUmVzb3VyY2VWYWx1ZShpbnQgaWQpIHsKLSAgICAgICAgaWYgKG1Qcm9qZWN0UmVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvamVjdFJlcy5yZXNvbHZlUmVzb3VyY2VWYWx1ZShpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVByb2plY3RDYWxsYmFjayNyZXNvbHZlUmVzb3VyY2VWYWx1ZShpbnRbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVSZXNvdXJjZVZhbHVlKGludFtdIGlkKSB7Ci0gICAgICAgIGlmIChtUHJvamVjdFJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb2plY3RSZXMucmVzb2x2ZVJlc291cmNlVmFsdWUoaWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklQcm9qZWN0Q2FsbGJhY2sjZ2V0UmVzb3VyY2VWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFJlc291cmNlVmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChtUHJvamVjdFJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb2plY3RSZXMuZ2V0UmVzb3VyY2VWYWx1ZSh0eXBlLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbG9hZGVyIGhhcyByZWNlaXZlZCByZXF1ZXN0cyB0byBsb2FkIGN1c3RvbSB2aWV3cy4KLSAgICAgKiA8cC8+VGhpcyBhbGxvd3MgdG8gZWZmaWNpZW50bHkgb25seSByZWNyZWF0ZSB3aGVuIG5lZWRlZCB1cG9uIGNvZGUgY2hhbmdlIGluIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIGJvb2xlYW4gaXNVc2VkKCkgewotICAgICAgICByZXR1cm4gbVVzZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGUgYSBjbGFzcyBvYmplY3QsIHVzaW5nIGEgc3BlY2lmaWMgY29uc3RydWN0b3IgYW5kIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZQotICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvclNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBjb25zdHJ1Y3RvciB0byB1c2UKLSAgICAgKiBAcGFyYW0gY29uc3RydWN0b3JQYXJhbWV0ZXJzIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAgICogQHJldHVybiBBIG5ldyBjbGFzcyBvYmplY3QsIGNyZWF0ZWQgdXNpbmcgYSBzcGVjaWZpYyBjb25zdHJ1Y3RvciBhbmQgcGFyYW1ldGVycy4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzKENsYXNzPD8+IGNsYXp6LCBDbGFzc1tdIGNvbnN0cnVjdG9yU2lnbmF0dXJlLAotICAgICAgICAgICAgT2JqZWN0W10gY29uc3RydWN0b3JQYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvclNpZ25hdHVyZSk7Ci0gICAgICAgIGNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShjb25zdHJ1Y3RvclBhcmFtZXRlcnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9VaUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMTU2ODEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5JY29uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuVWlEb2N1bWVudFRyZWVFZGl0UGFydDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuVWlFbGVtZW50VHJlZUVkaXRQYXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0cy5VaUVsZW1lbnRUcmVlRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0cy5VaUxheW91dFRyZWVFZGl0UGFydDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuVWlWaWV3VHJlZUVkaXRQYXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWUuQ29weUN1dEFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlLlBhc3RlQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWUuVWlBY3Rpb25zOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5FY2xpcHNlVWlIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQ29udGVudE91dGxpbmVQYWdlfSB0byBkaXNwbGF5IHtAbGluayBVaUVsZW1lbnROb2RlfS4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1jbGFzcyBVaUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7Ci0KLSAgICBwcml2YXRlIEdyYXBoaWNhbExheW91dEVkaXRvciBtRWRpdG9yOwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gbUFkZEFjdGlvbjsKLSAgICBwcml2YXRlIEFjdGlvbiBtRGVsZXRlQWN0aW9uOwotICAgIHByaXZhdGUgQWN0aW9uIG1VcEFjdGlvbjsKLSAgICBwcml2YXRlIEFjdGlvbiBtRG93bkFjdGlvbjsKLQotICAgIHByaXZhdGUgVWlPdXRsaW5lQWN0aW9ucyBtVWlBY3Rpb25zID0gbmV3IFVpT3V0bGluZUFjdGlvbnMoKTsKLQotICAgIHB1YmxpYyBVaUNvbnRlbnRPdXRsaW5lUGFnZShHcmFwaGljYWxMYXlvdXRFZGl0b3IgZWRpdG9yLCBmaW5hbCBFZGl0UGFydFZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICAgICAgSWNvbkZhY3RvcnkgZmFjdG9yeSA9IEljb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgbUFkZEFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZC4uLiIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIExpc3Q8VWlFbGVtZW50Tm9kZT4gbm9kZXMgPSBnZXRNb2RlbFNlbGVjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSBub2RlcyAhPSBudWxsICYmIG5vZGVzLnNpemUoKSA+IDAgPyBub2Rlcy5nZXQoMCkgOiBudWxsOwotCi0gICAgICAgICAgICAgICAgbVVpQWN0aW9ucy5kb0FkZChub2RlLCB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQWRkQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGRzIGEgbmV3IGVsZW1lbnQuIik7Ci0gICAgICAgIG1BZGRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGZhY3RvcnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJhZGQiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBtRGVsZXRlQWN0aW9uID0gbmV3IEFjdGlvbigiUmVtb3ZlLi4uIikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxVaUVsZW1lbnROb2RlPiBub2RlcyA9IGdldE1vZGVsU2VsZWN0aW9ucygpOwotCi0gICAgICAgICAgICAgICAgbVVpQWN0aW9ucy5kb1JlbW92ZShub2Rlcywgdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbURlbGV0ZUFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlcyBhbiBleGlzdGluZyBzZWxlY3RlZCBlbGVtZW50LiIpOwotICAgICAgICBtRGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihmYWN0b3J5LmdldEltYWdlRGVzY3JpcHRvcigiZGVsZXRlIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbVVwQWN0aW9uID0gbmV3IEFjdGlvbigiVXAiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFVpRWxlbWVudE5vZGU+IG5vZGVzID0gZ2V0TW9kZWxTZWxlY3Rpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICBtVWlBY3Rpb25zLmRvVXAobm9kZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtVXBBY3Rpb24uc2V0VG9vbFRpcFRleHQoIk1vdmVzIHRoZSBzZWxlY3RlZCBlbGVtZW50IHVwIik7Ci0gICAgICAgIG1VcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoZmFjdG9yeS5nZXRJbWFnZURlc2NyaXB0b3IoInVwIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbURvd25BY3Rpb24gPSBuZXcgQWN0aW9uKCJEb3duIikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxVaUVsZW1lbnROb2RlPiBub2RlcyA9IGdldE1vZGVsU2VsZWN0aW9ucygpOwotCi0gICAgICAgICAgICAgICAgbVVpQWN0aW9ucy5kb0Rvd24obm9kZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtRG93bkFjdGlvbi5zZXRUb29sVGlwVGV4dCgiTW92ZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQgZG93biIpOwotICAgICAgICBtRG93bkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoZmFjdG9yeS5nZXRJbWFnZURlc2NyaXB0b3IoImRvd24iKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBhbGwgYWN0aW9ucyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAgICAgICBtQWRkQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtRGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVXBBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Eb3duQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gaXMgbmV2ZXIgZW1wdHkuIFRoZSBsZWFzdCBpdCdsbCBjb250YWluIGlzIHRoZQotICAgICAgICAgICAgICAgIC8vIFVpRG9jdW1lbnRUcmVlRWRpdFBhcnQgb2JqZWN0LgotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0U2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3RTZWwuc2l6ZSgpID09IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RTZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBVaURvY3VtZW50VHJlZUVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVVwQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXBBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgImFkZCIgYnV0dG9uIGlzIGFsd2F5cyBlbmFibGVkLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbCByb290IG5vZGUKLSAgICAgICAgICAgICAgICAgICAgbUFkZEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBjcmVhdGUgb3V0bGluZSB2aWV3ZXIgcGFnZQotICAgICAgICBnZXRWaWV3ZXIoKS5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIG91dGxpbmUgdmlld2VyCi0gICAgICAgIGdldFZpZXdlcigpLnNldEVkaXRQYXJ0RmFjdG9yeShuZXcgVWlFbGVtZW50VHJlZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQotICAgICAgICBzZXR1cE91dGxpbmUoKTsKLSAgICAgICAgc2V0dXBDb250ZXh0TWVudSgpOwotICAgICAgICBzZXR1cFRvb2x0aXAoKTsKLSAgICAgICAgc2V0dXBEb3VibGVDbGljaygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlI3NldEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0gICAgICoKLSAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBhZnRlciBjcmVhdGVDb250cm9sCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgICAgIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG1BZGRBY3Rpb24pOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobURlbGV0ZUFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobVVwQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG1Eb3duQWN0aW9uKTsKLQotICAgICAgICBJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtQWRkQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1EZWxldGVBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1VcEFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtRG93bkFjdGlvbik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBicmVha0Nvbm5lY3Rpb25XaXRoRWRpdG9yKCk7Ci0KLSAgICAgICAgLy8gZGlzcG9zZQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZSNnZXRDb250cm9sKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICByZXR1cm4gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TmV3RWRpdG9yKEdyYXBoaWNhbExheW91dEVkaXRvciBlZGl0b3IpIHsKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICAgICAgc2V0dXBPdXRsaW5lKCk7Ci0gICAgfQotCi0gICAgdm9pZCBicmVha0Nvbm5lY3Rpb25XaXRoRWRpdG9yKCkgewotICAgICAgICAvLyB1bmhvb2sgb3V0bGluZSB2aWV3ZXIKLSAgICAgICAgbUVkaXRvci5nZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKS5yZW1vdmVWaWV3ZXIoZ2V0Vmlld2VyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE91dGxpbmUoKSB7Ci0KLSAgICAgICAgZ2V0Vmlld2VyKCkuc2V0RWRpdERvbWFpbihtRWRpdG9yLmdldEVkaXREb21haW4oKSk7Ci0KLSAgICAgICAgLy8gaG9vayBvdXRsaW5lIHZpZXdlcgotICAgICAgICBtRWRpdG9yLmdldFNlbGVjdGlvblN5bmNocm9uaXplcigpLmFkZFZpZXdlcihnZXRWaWV3ZXIoKSk7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSBvdXRsaW5lIHZpZXdlciB3aXRoIG1vZGVsCi0gICAgICAgIGdldFZpZXdlcigpLnNldENvbnRlbnRzKG1FZGl0b3IuZ2V0TW9kZWwoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ29udGV4dE1lbnUoKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWVudSBpcyBhYm91dCB0byBiZSBzaG93bi4gVGhlIG1lbnUgbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAgICAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlIGFueSBleGlzdGluZyBtZW51IGl0ZW0uIFRoaXMgbWV0aG9kIGdldHMgdGhlCi0gICAgICAgICAgICAgKiB0cmVlIHNlbGVjdGlvbiBhbmQgaWYgaXQgaXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaXQgcmUtY3JlYXRlcwotICAgICAgICAgICAgICogdGhlIG5lY2Vzc2FyeSBhY3Rpb25zLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICAgICAgICAgTGlzdDxVaUVsZW1lbnROb2RlPiBzZWxlY3RlZCA9IGdldE1vZGVsU2VsZWN0aW9ucygpOwotCi0gICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIGRvQ3JlYXRlTWVudUFjdGlvbihtYW5hZ2VyLCBzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZG9DcmVhdGVNZW51QWN0aW9uKG1hbmFnZXIsIG51bGwgLyogdWlfbm9kZSAqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgIE1lbnUgY29udGV4dE1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShjb250cm9sKTsKLSAgICAgICAgY29udHJvbC5zZXRNZW51KGNvbnRleHRNZW51KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBtZW51IGFjdGlvbnMgdG8gdGhlIGNvbnRleHQgbWVudSB3aGVuIHRoZSBnaXZlbiBVSSBub2RlIGlzIHNlbGVjdGVkIGluCi0gICAgICogdGhlIHRyZWUgdmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBjb250ZXh0IG1lbnUgbWFuYWdlcgotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgVUkgbm9kZSBzZWxlY3RlZCBpbiB0aGUgdHJlZS4gQ2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIHJvb3QKLSAgICAgKiAgICAgICAgICAgICAgICBpcyB0byBiZSBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9DcmVhdGVNZW51QWN0aW9uKElNZW51TWFuYWdlciBtYW5hZ2VyLCBMaXN0PFVpRWxlbWVudE5vZGU+IHNlbGVjdGVkKSB7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzWG1sID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFVpRWxlbWVudE5vZGUgdWlOb2RlIDogc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAodWlOb2RlLmdldFhtbE5vZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1htbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1htbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBDb3B5Q3V0QWN0aW9uKG1FZGl0b3IuZ2V0TGF5b3V0RWRpdG9yKCksIG1FZGl0b3IuZ2V0Q2xpcGJvYXJkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZWxlY3RlZCwgdHJ1ZSAvKiBjdXQgKi8pKTsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQ29weUN1dEFjdGlvbihtRWRpdG9yLmdldExheW91dEVkaXRvcigpLCBtRWRpdG9yLmdldENsaXBib2FyZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2VsZWN0ZWQsIGZhbHNlIC8qIGN1dCAqLykpOwotCi0gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgcGFzdGUgd2l0aCBtb3JlIHRoYW4gb25lIGVsZW1lbnQgc2VsZWN0ZWQgKHRoZSBzZWxlY3Rpb24gaXMgdGhlIHRhcmdldCkKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQuc2l6ZSgpIDw9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUGFzdGUgaXMgbm90IHZhbGlkIGlmIGl0IHdvdWxkIGFkZCBhIHNlY29uZCBlbGVtZW50IG9uIGEgdGVybWluYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBwYXJlbnQgaXMgYSBkb2N1bWVudCAtLSBhbiBYTUwgZG9jdW1lbnQgY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbWVhbnMgcGFzdGUgaXMgdmFsaWQgaWYgdGhlIGN1cnJlbnQgVUkgbm9kZSBjYW4gaGF2ZSBjaGlsZHJlbiBvciBpZiB0aGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBhIGRvY3VtZW50LgotICAgICAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpX3Jvb3QgPSBzZWxlY3RlZC5nZXQoMCkuZ2V0VWlSb290KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1aV9yb290LmdldERlc2NyaXB0b3IoKS5oYXNDaGlsZHJlbigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgISh1aV9yb290LmdldFVpUGFyZW50KCkgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBQYXN0ZUFjdGlvbihtRWRpdG9yLmdldExheW91dEVkaXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRpdG9yLmdldENsaXBib2FyZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5nZXQoMCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwZW5kICJhZGQiIGFuZCAicmVtb3ZlIiBhY3Rpb25zLiBUaGV5IGRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBhZGQvcmVtb3ZlCi0gICAgICAgIC8vIGJ1dHRvbnMgb24gdGhlIHNpZGUuCi0gICAgICAgIC8vCi0gICAgICAgIC8vICJBZGQiIG1ha2VzIHNlbnNlIG9ubHkgaWYgdGhlcmUncyAwIG9yIDEgaXRlbSBzZWxlY3RlZCBzaW5jZSB0aGUKLSAgICAgICAgLy8gb25lIHNlbGVjdGVkIGl0ZW0gYmVjb21lcyB0aGUgdGFyZ2V0LgotICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gbnVsbCB8fCBzZWxlY3RlZC5zaXplKCkgPD0gMSkgewotICAgICAgICAgICAgbWFuYWdlci5hZGQobUFkZEFjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFuYWdlci5hZGQobURlbGV0ZUFjdGlvbik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgICAgICAgICBtYW5hZ2VyLmFkZChtVXBBY3Rpb24pOwotICAgICAgICAgICAgbWFuYWdlci5hZGQobURvd25BY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICAgICAgICAgIEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IEFjdGlvbigiUHJvcGVydGllcyIpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVjbGlwc2VVaUhlbHBlci5zaG93VmlldyhFY2xpcHNlVWlIZWxwZXIuUFJPUEVSVFlfU0hFRVRfVklFV19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFjdGl2YXRlICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcHJvcGVydGllc0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiRGlzcGxheXMgcHJvcGVydGllcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudC4iKTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgb3V0bGluZSB2aWV3IHdpdGggdGhlIG1vZGVsIG9mIHRoZSB7QGxpbmsgSUdyYXBoaWNhbExheW91dEVkaXRvcn0uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgYXR0ZW1wcyB0byBwcmVzZXJ2ZSB0aGUgc2VsZWN0aW9uLCBpZiBhbnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsb2FkTW9kZWwoKSB7Ci0gICAgICAgIC8vIEF0dGVtcHMgdG8gcHJlc2VydmUgdGhlIFVpTm9kZSBzZWxlY3Rpb24sIGlmIGFueQotICAgICAgICBMaXN0PFVpRWxlbWVudE5vZGU+IHVpTm9kZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IGN1cnJlbnQgc2VsZWN0aW9uIHVzaW5nIHRoZSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgZWRpdCBwYXJ0IGFzCi0gICAgICAgICAgICAvLyByZWxvYWRpbmcgdGhlIGNvbnRlbnQgbWF5IGNoYW5nZSB0aGUgYWN0dWFsIGVkaXQgcGFydC4KLSAgICAgICAgICAgIHVpTm9kZXMgPSBnZXRNb2RlbFNlbGVjdGlvbnMoKTsKLQotICAgICAgICAgICAgLy8gcGVyZm9ybSB0aGUgdXBkYXRlCi0gICAgICAgICAgICBnZXRWaWV3ZXIoKS5zZXRDb250ZW50cyhtRWRpdG9yLmdldE1vZGVsKCkpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyByZXN0b3JlIHNlbGVjdGlvbgotICAgICAgICAgICAgaWYgKHVpTm9kZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldE1vZGVsU2VsZWN0aW9uKHVpTm9kZXMuZ2V0KDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50LCBpZiBhbnksIGluIHRoZSB2aWV3ZXIuCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIncyBlbGVtZW50cyAoaS5lLiBhbiB7QGxpbmsgVWlFbGVtZW50VHJlZUVkaXRQYXJ0fSkKLSAgICAgKiBhbmQgbm90IHRoZSB1bmRlcmx5aW5nIG1vZGVsIG5vZGUuCi0gICAgICogPHAvPgotICAgICAqIFdoZW4gdGhlcmUgaXMgbm8gYWN0dWFsIHNlbGVjdGlvbiwgdGhpcyBtaWdodCBzdGlsbCByZXR1cm4gdGhlIHJvb3Qgbm9kZSwKLSAgICAgKiB3aGljaCBpcyBvZiB0eXBlIHtAbGluayBVaURvY3VtZW50VHJlZUVkaXRQYXJ0fS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIExpc3Q8VWlFbGVtZW50VHJlZUVkaXRQYXJ0PiBnZXRWaWV3ZXJTZWxlY3Rpb25zKCkgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCi0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFVpRWxlbWVudFRyZWVFZGl0UGFydD4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFVpRWxlbWVudFRyZWVFZGl0UGFydD4oKTsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZE9iaiA9IGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBVaUVsZW1lbnRUcmVlRWRpdFBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmFkZCgoVWlFbGVtZW50VHJlZUVkaXRQYXJ0KSBzZWxlY3RlZE9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQuc2l6ZSgpID4gMCA/IHNlbGVjdGVkIDogbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb2RlbCBlbGVtZW50LCB3aGljaCBpcyBlaXRoZXIgYW4KLSAgICAgKiB7QGxpbmsgVWlWaWV3VHJlZUVkaXRQYXJ0fSBvciBhbiB7QGxpbmsgVWlMYXlvdXRUcmVlRWRpdFBhcnR9LgotICAgICAqIDxwLz4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uIG9yIGlmIHRoZSBpbXBsaWNpdCByb290IGlzICJzZWxlY3RlZCIKLSAgICAgKiAod2hpY2ggYWN0dWFsbHkgcmVwcmVzZW50cyB0aGUgbGFjayBvZiBhIHJlYWwgZWxlbWVudCBzZWxlY3Rpb24uKQotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxVaUVsZW1lbnROb2RlPiBnZXRNb2RlbFNlbGVjdGlvbnMoKSB7Ci0KLSAgICAgICAgTGlzdDxVaUVsZW1lbnRUcmVlRWRpdFBhcnQ+IHBhcnRzID0gZ2V0Vmlld2VyU2VsZWN0aW9ucygpOwotCi0gICAgICAgIGlmIChwYXJ0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoVWlFbGVtZW50VHJlZUVkaXRQYXJ0IHBhcnQgOiBwYXJ0cykgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgVWlWaWV3VHJlZUVkaXRQYXJ0IHx8IHBhcnQgaW5zdGFuY2VvZiBVaUxheW91dFRyZWVFZGl0UGFydCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5hZGQoKFVpRWxlbWVudE5vZGUpIHBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQuc2l6ZSgpID4gMCA/IHNlbGVjdGVkIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBwYXJ0IGluIHRoZSB0cmVlIHZpZXdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uKFVpRWxlbWVudFRyZWVFZGl0UGFydCBzZWxlY3RlZFBhcnQpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkUGFydCAhPSBudWxsICYmICEoc2VsZWN0ZWRQYXJ0IGluc3RhbmNlb2YgVWlEb2N1bWVudFRyZWVFZGl0UGFydCkpIHsKLSAgICAgICAgICAgIExpbmtlZExpc3Q8VWlFbGVtZW50VHJlZUVkaXRQYXJ0PiBzZWdtZW50cyA9IG5ldyBMaW5rZWRMaXN0PFVpRWxlbWVudFRyZWVFZGl0UGFydD4oKTsKLSAgICAgICAgICAgIGZvciAoVWlFbGVtZW50VHJlZUVkaXRQYXJ0IHBhcnQgPSBzZWxlY3RlZFBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICEocGFydCBpbnN0YW5jZW9mIFVpRG9jdW1lbnRUcmVlRWRpdFBhcnQpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gKFVpRWxlbWVudFRyZWVFZGl0UGFydCkgcGFydC5nZXRQYXJlbnQoKSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnRzLmFkZCgwLCBwYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgVHJlZVNlbGVjdGlvbihuZXcgVHJlZVBhdGgoc2VnbWVudHMudG9BcnJheSgpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgY29ycmVzcG9uZGluZyBtb2RlbCBlbGVtZW50IGluIHRoZSB0cmVlIHZpZXdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TW9kZWxTZWxlY3Rpb24oVWlFbGVtZW50Tm9kZSB1aU5vZGVUb1NlbGVjdCkgewotICAgICAgICBpZiAodWlOb2RlVG9TZWxlY3QgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBmaW5kIGFuIGVkaXQgcGFydCB0aGF0IGhhcyB0aGUgcmVxdWVzdGVkIG1vZGVsIGVsZW1lbnQKLSAgICAgICAgICAgIFVpRWxlbWVudFRyZWVFZGl0UGFydCBwYXJ0ID0gZmluZFBhcnRGb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgKFVpRWxlbWVudFRyZWVFZGl0UGFydCkgZ2V0Vmlld2VyKCkuZ2V0Q29udGVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgdWlOb2RlVG9TZWxlY3QpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcnQsIHNlbGVjdCBpdCBhbmQgcmV2ZWFsIGl0Ci0gICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0Vmlld2VyU2VsZWN0aW9uKHBhcnQpOwotICAgICAgICAgICAgICAgIGdldFZpZXdlcigpLnJldmVhbChwYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdHJpZXMgdG8gZmluZCBhbiBlZGl0IHBhcnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gbW9kZWwgVUkgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb290UGFydCBUaGUgcm9vdCBvZiB0aGUgdmlld2VyIGVkaXQgcGFydHMKLSAgICAgKiBAcGFyYW0gdWlOb2RlIFRoZSBVSSBub2RlIG1vZGVsIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIFRoZSBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGUgbW9kZWwgb3IgbnVsbCBpZiBpdCdzIG5vdCBpbiB0aGUgc3ViIHRyZWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBVaUVsZW1lbnRUcmVlRWRpdFBhcnQgZmluZFBhcnRGb3JNb2RlbChVaUVsZW1lbnRUcmVlRWRpdFBhcnQgcm9vdFBhcnQsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpTm9kZSkgewotICAgICAgICBpZiAocm9vdFBhcnQuZ2V0TW9kZWwoKSA9PSB1aU5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb290UGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoT2JqZWN0IHBhcnQgOiByb290UGFydC5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFVpRWxlbWVudFRyZWVFZGl0UGFydCkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudFRyZWVFZGl0UGFydCBmb3VuZCA9IGZpbmRQYXJ0Rm9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAoVWlFbGVtZW50VHJlZUVkaXRQYXJ0KSBwYXJ0LCB1aU5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIGEgY3VzdG9tIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBvdmVyIHRyZWUgaXRlbXMuCi0gICAgICogPHAvPgotICAgICAqIFRoZSB0b29sdGlwIHdpbGwgZGlzcGxheSB0aGUgZWxlbWVudCdzIGphdmFkb2MsIGlmIGFueSwgb3IgdGhlIGl0ZW0ncyBnZXRUZXh0IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUb29sdGlwKCkgewotICAgICAgICBmaW5hbCBUcmVlIHRyZWUgPSAoVHJlZSkgZ2V0Q29udHJvbCgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlZmVyZW5jZToKLSAgICAgICAgICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmE/dmlldz1tYXJrdXAKLSAgICAgICAgICovCi0KLSAgICAgICAgZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBTaGVsbCB0aXAgPSBudWxsOwotICAgICAgICAgICAgTGFiZWwgbGFiZWwgID0gbnVsbDsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuS2V5RG93bjoKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VEb3duOgotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlTW92ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZUhvdmVyOgotICAgICAgICAgICAgICAgICAgICBpZiAodGlwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWlFbGVtZW50VHJlZUVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsID0gKChVaUVsZW1lbnRUcmVlRWRpdFBhcnQpIGRhdGEpLmdldE1vZGVsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gKChVaUVsZW1lbnROb2RlKSBtb2RlbCkuZ2V0RGVzY3JpcHRvcigpLmdldFRvb2x0aXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sdGlwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gaXRlbS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBpdGVtLmdldFRleHQoKSArICI6XHIiICsgdG9vbHRpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2x0aXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSB0cmVlLmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB0cmVlLmdldERpc3BsYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdGlwID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuT05fVE9QIHwgU1dULk5PX0ZPQ1VTIHwgU1dULlRPT0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwLnNldEJhY2tncm91bmQoZGlzcGxheSAuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHRpcCwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5zZXREYXRhKCJfVEFCTEVJVEVNIiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KHRvb2x0aXApOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYWRkTGlzdGVuZXIoU1dULk1vdXNlRXhpdCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHNpemUgPSB0aXAuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBwdCA9IHRyZWUudG9EaXNwbGF5KHJlY3QueCwgcmVjdC55KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5zZXRCb3VuZHMocHQueCwgcHQueSwgc2l6ZS54LCBzaXplLnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdHJlZS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotICAgICAgICB0cmVlLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0gICAgICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotICAgICAgICB0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCBkb3VibGUtY2xpY2sgYWN0aW9uIG9uIHRoZSB0cmVlLgotICAgICAqIDxwLz4KLSAgICAgKiBCeSBkZWZhdWx0LCBkb3VibGUtY2xpY2sgKGEuay5hLiAiZGVmYXVsdCBzZWxlY3Rpb24iKSBvbiBhIHZhbGlkIGxpc3QgaXRlbSB3aWxsCi0gICAgICogc2hvdyB0aGUgcHJvcGVydHkgdmlldy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBEb3VibGVDbGljaygpIHsKLSAgICAgICAgZmluYWwgVHJlZSB0cmVlID0gKFRyZWUpIGdldENvbnRyb2woKTsKLQotICAgICAgICB0cmVlLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEVjbGlwc2VVaUhlbHBlci5zaG93VmlldyhFY2xpcHNlVWlIZWxwZXIuUFJPUEVSVFlfU0hFRVRfVklFV19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYWN0aXZhdGUgKi8pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgY2xhc3MgVWlPdXRsaW5lQWN0aW9ucyBleHRlbmRzIFVpQWN0aW9ucyB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBVaURvY3VtZW50Tm9kZSBnZXRSb290Tm9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdG9yLmdldE1vZGVsKCk7IC8vIHRoaXMgaXMgTGF5b3V0RWRpdG9yLmdldFVpUm9vdE5vZGUoKQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VsZWN0IHRoZSBuZXcgaXRlbQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0VWlOb2RlKFVpRWxlbWVudE5vZGUgdWlOb2RlVG9TZWxlY3QpIHsKLSAgICAgICAgICAgIHNldE1vZGVsU2VsZWN0aW9uKHVpTm9kZVRvU2VsZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjb21taXRQZW5kaW5nWG1sQ2hhbmdlcygpIHsKLSAgICAgICAgICAgIC8vIFBhc3MuIFRoZXJlIGlzIG5vdGhpbmcgdG8gY29tbWl0IGJlZm9yZSB0aGUgWE1MIGlzIGNoYW5nZWQgaGVyZS4KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpRWxlbWVudFB1bGxQYXJzZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9VaUVsZW1lbnRQdWxsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDMyNzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpRWxlbWVudFB1bGxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklYbWxQdWxsUGFyc2VyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiB7QGxpbmsgSVhtbFB1bGxQYXJzZXJ9IGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gKiA8cC8+SXQncyBkZXNpZ25lZCB0byB3b3JrIG9uIGxheW91dCBmaWxlcywgYW5kIHdpbGwgbW9zdCBsaWtlbHkgbm90IHdvcmsgb24gb3RoZXIgcmVzb3VyY2UKLSAqIGZpbGVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVWlFbGVtZW50UHVsbFBhcnNlciBleHRlbmRzIEJhc2VQdWxsUGFyc2VyIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBtTm9kZVN0YWNrID0gbmV3IEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPigpOwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBtUm9vdDsKLSAgICAKLSAgICBwdWJsaWMgVWlFbGVtZW50UHVsbFBhcnNlcihVaUVsZW1lbnROb2RlIHRvcCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtUm9vdCA9IHRvcDsKLSAgICAgICAgcHVzaChtUm9vdCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBnZXRDdXJyZW50Tm9kZSgpIHsKLSAgICAgICAgaWYgKG1Ob2RlU3RhY2suc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob2RlU3RhY2suZ2V0KG1Ob2RlU3RhY2suc2l6ZSgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBOb2RlIGdldEF0dHJpYnV0ZShpbnQgaSkgewotICAgICAgICBpZiAobVBhcnNpbmdTdGF0ZSAhPSBTVEFSVF9UQUcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgdWlOb2RlCi0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0Q3VycmVudE5vZGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCBpdHMgeG1sIG5vZGUKLSAgICAgICAgTm9kZSB4bWxOb2RlID0gdWlOb2RlLmdldFhtbE5vZGUoKTsKLQotICAgICAgICBpZiAoeG1sTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4geG1sTm9kZS5nZXRBdHRyaWJ1dGVzKCkuaXRlbShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHVzaChVaUVsZW1lbnROb2RlIG5vZGUpIHsKLSAgICAgICAgbU5vZGVTdGFjay5hZGQobm9kZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBwb3AoKSB7Ci0gICAgICAgIHJldHVybiBtTm9kZVN0YWNrLnJlbW92ZShtTm9kZVN0YWNrLnNpemUoKS0xKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tIElYbWxQdWxsUGFyc2VyIC0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Vmlld0tleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnROb2RlKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLSBYbWxQdWxsUGFyc2VyIC0tLS0tLS0tCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvc2l0aW9uRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiWE1MIERPTSBlbGVtZW50IGRlcHRoOiIgKyBtTm9kZVN0YWNrLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSBnZXRDdXJyZW50Tm9kZSgpOwotICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoaW50IGkpIHsKLSAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUoaSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBpKSB7Ci0gICAgICAgIE5vZGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKGkpOwotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUoaSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIE5vZGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKGkpOwotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgdWlOb2RlCi0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0Q3VycmVudE5vZGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCBpdHMgeG1sIG5vZGUKLSAgICAgICAgTm9kZSB4bWxOb2RlID0gdWlOb2RlLmdldFhtbE5vZGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGUgYXR0cmlidXRlID0geG1sTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtTlMobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0gICAgICAgIHJldHVybiBtTm9kZVN0YWNrLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChtUGFyc2luZ1N0YXRlID09IFNUQVJUX1RBRyB8fCBtUGFyc2luZ1N0YXRlID09IEVORF9UQUcpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50Tm9kZSgpLmdldERlc2NyaXB0b3IoKS5nZXRYbWxMb2NhbE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAobVBhcnNpbmdTdGF0ZSA9PSBTVEFSVF9UQUcgfHwgbVBhcnNpbmdTdGF0ZSA9PSBFTkRfVEFHKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE5vZGUoKS5nZXREZXNjcmlwdG9yKCkuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKG1QYXJzaW5nU3RhdGUgPT0gU1RBUlRfVEFHIHx8IG1QYXJzaW5nU3RhdGUgPT0gRU5EX1RBRykgewotICAgICAgICAgICAgLy8gRklYTUUgd2lsbCBORVZFUiB3b3JrCi0gICAgICAgICAgICBpZiAoZ2V0Q3VycmVudE5vZGUoKS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTG9jYWxOYW1lKCkuc3RhcnRzV2l0aCgiYW5kcm9pZDoiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuICJhbmRyb2lkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnRUYWcoKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtUGFyc2luZ1N0YXRlID09IFNUQVJUX1RBRykgewotICAgICAgICAgICAgcmV0dXJuIGdldEN1cnJlbnROb2RlKCkuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSA9PSAwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiQ2FsbCB0byBpc0VtcHR5RWxlbWVudFRhZyB3aGlsZSBub3QgaW4gU1RBUlRfVEFHIiwKLSAgICAgICAgICAgICAgICB0aGlzLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25OZXh0RnJvbVN0YXJ0RG9jdW1lbnQoKSB7Ci0gICAgICAgIG9uTmV4dEZyb21TdGFydFRhZygpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk5leHRGcm9tU3RhcnRUYWcoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBub2RlLCBhbmQgbG9vayBmb3IgdGV4dCBvciBjaGlsZHJlbiAoY2hpbGRyZW4gZmlyc3QpCi0gICAgICAgIFVpRWxlbWVudE5vZGUgbm9kZSA9IGdldEN1cnJlbnROb2RlKCk7Ci0gICAgICAgIExpc3Q8VWlFbGVtZW50Tm9kZT4gY2hpbGRyZW4gPSBub2RlLmdldFVpQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5ldyBjaGlsZCwgYW5kIGRvbid0IGNoYW5nZSB0aGUgc3RhdGUuCi0gICAgICAgICAgICBwdXNoKGNoaWxkcmVuLmdldCgwKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIGN1cnJlbnQgc3RhdGUgaXMgQ1VSUkVOVF9ET0MsIHdlIHNldCB0aGUgcHJvcGVyIHN0YXRlLgotICAgICAgICAgICAgbVBhcnNpbmdTdGF0ZSA9IFNUQVJUX1RBRzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtUGFyc2luZ1N0YXRlID09IFNUQVJUX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3Mgbm8gbm9kZS4KLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXRlID0gRU5EX0RPQ1VNRU5UOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXRlID0gRU5EX1RBRzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk5leHRGcm9tRW5kVGFnKCkgewotICAgICAgICAvLyBsb29rIGZvciBhIHNpYmxpbmcuIGlmIG5vIHNpYmxpbmcsIGdvIGJhY2sgdG8gdGhlIHBhcmVudAotICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSBnZXRDdXJyZW50Tm9kZSgpOwotICAgICAgICBub2RlID0gbm9kZS5nZXRVaU5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRvIGdvIHRvIHRoZSBzaWJsaW5nLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgY3VycmVudCBub2RlLAotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICAvLyBhbmQgYWRkIGl0cyBzaWJsaW5nLgotICAgICAgICAgICAgcHVzaChub2RlKTsKLSAgICAgICAgICAgIG1QYXJzaW5nU3RhdGUgPSBTVEFSVF9UQUc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIGJhY2sgdG8gdGhlIHBhcmVudAotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgb25seSBvbmUgZWxlbWVudCBsZWZ0IChtUm9vdCksIHRoZW4gd2UncmUgZG9uZSB3aXRoIHRoZSBkb2N1bWVudC4KLSAgICAgICAgICAgIGlmIChtTm9kZVN0YWNrLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0ZSA9IEVORF9ET0NVTUVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0ZSA9IEVORF9UQUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvVWlQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiNzNiMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvVWlQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEEgY3VzdG9taXplZCBwcm9wZXJ0eSBzaGVldCBwYWdlIGZvciB0aGUgZ3JhcGhpY2FsIGxheW91dCBlZGl0b3IuCi0gKiA8cC8+Ci0gKiBDdXJyZW50bHkgaXQganVzdCBwcm92aWRlcyBhIGN1c3RvbSB0b29sdGlwIHRvIGRpc3BsYXkgYXR0cmlidXRlcyBqYXZhZG9jcy4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1wdWJsaWMgY2xhc3MgVWlQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFByb3BlcnR5U2hlZXRQYWdlIHsKLQotCi0gICAgcHVibGljIFVpUHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgICAgICBzZXR1cFRvb2x0aXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIGEgY3VzdG9tIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBvdmVyIHRyZWUgaXRlbXMuCi0gICAgICogPHAvPgotICAgICAqIFRoZSB0b29sdGlwIHdpbGwgZGlzcGxheSB0aGUgZWxlbWVudCdzIGphdmFkb2MsIGlmIGFueSwgb3IgdGhlIGl0ZW0ncyBnZXRUZXh0IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUb29sdGlwKCkgewotICAgICAgICBmaW5hbCBUcmVlIHRyZWUgPSAoVHJlZSkgZ2V0Q29udHJvbCgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlZmVyZW5jZToKLSAgICAgICAgICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmE/dmlldz1tYXJrdXAKLSAgICAgICAgICovCi0KLSAgICAgICAgZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBTaGVsbCB0aXAgPSBudWxsOwotICAgICAgICAgICAgTGFiZWwgbGFiZWwgID0gbnVsbDsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuS2V5RG93bjoKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTV1QuTW91c2VEb3duOgotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlTW92ZToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZUhvdmVyOgotICAgICAgICAgICAgICAgICAgICBpZiAodGlwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIFRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9ICgoUHJvcGVydHlTaGVldEVudHJ5KSBkYXRhKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHRpcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9IGl0ZW0uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gaXRlbS5nZXRUZXh0KCkgKyAiOlxyIiArIHRvb2x0aXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHRpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHRyZWUuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHRyZWUuZ2V0RGlzcGxheSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXAgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAuc2V0QmFja2dyb3VuZChkaXNwbGF5IC5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwodGlwLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnNldERhdGEoIl9UQUJMRUlURU0iLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQodG9vbHRpcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2l6ZSA9IHRpcC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcygwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHB0ID0gdHJlZS50b0Rpc3BsYXkocmVjdC54LCByZWN0LnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGlwLnNldEJvdW5kcyhwdC54LCBwdC55LCBzaXplLngsIHNpemUueSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0cmVlLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0gICAgICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGxpc3RlbmVyKTsKLSAgICAgICAgdHJlZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0gICAgICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIGxpc3RlbmVyKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1dpZGdldFB1bGxQYXJzZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9XaWRnZXRQdWxsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDI1OWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1dpZGdldFB1bGxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9ycy5WaWV3RWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiB7QGxpbmsgSVhtbFB1bGxQYXJzZXJ9IGltcGxlbWVudGF0aW9uIHRvIHJlbmRlciBhbmRyb2lkIHdpZGdldCBiaXRtYXAuCi0gKiA8cC8+VGhlIHBhcnNlciBlbXVsYXRlcyBhIGxheW91dCB0aGF0IGNvbnRhaW5zIGp1c3Qgb25lIHdpZGdldCwgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIFZpZXdFbGVtZW50RGVzY3JpcHRvcn0gcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIGNsYXNzIFdpZGdldFB1bGxQYXJzZXIgZXh0ZW5kcyBCYXNlUHVsbFBhcnNlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3RWxlbWVudERlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXVtdIG1BdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1tdW10gewotICAgICAgICAgICAgeyAidGV4dCIsIG51bGwgfSwKLSAgICAgICAgICAgIHsgImxheW91dF93aWR0aCIsICJ3cmFwX2NvbnRlbnQiIH0sCi0gICAgICAgICAgICB7ICJsYXlvdXRfaGVpZ2h0IiwgIndyYXBfY29udGVudCIgfSwKLSAgICB9OwotCi0gICAgcHVibGljIFdpZGdldFB1bGxQYXJzZXIoVmlld0VsZW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSBtRGVzY3JpcHRvci5nZXRDYW5vbmljYWxDbGFzc05hbWUoKS5zcGxpdChBbmRyb2lkQ29uc3RhbnRzLlJFX0RPVCk7Ci0gICAgICAgIG1BdHRyaWJ1dGVzWzBdWzFdID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Vmlld0tleSgpIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhIHZpZXdLZXkgb3IgdGhlIElMYXlvdXRSZXN1bHQgd2lsbCBub3QgY29udGFpbiBhbnkgSUxheW91dFZpZXdJbmZvCi0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXMubGVuZ3RoOyAvLyB0ZXh0IGF0dHJpYnV0ZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4IDwgbUF0dHJpYnV0ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXNbaW5kZXhdWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGluZGV4KSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4IDwgbUF0dHJpYnV0ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXNbaW5kZXhdWzFdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBucywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMuZXF1YWxzKG5zKSkgewotICAgICAgICAgICAgZm9yIChTdHJpbmdbXSBhdHRyaWJ1dGUgOiBtQXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhhdHRyaWJ1dGVbMF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVbMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yLmdldFhtbExvY2FsTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5RWxlbWVudFRhZygpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1QYXJzaW5nU3RhdGUgPT0gU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oIkNhbGwgdG8gaXNFbXB0eUVsZW1lbnRUYWcgd2hpbGUgbm90IGluIFNUQVJUX1RBRyIsCi0gICAgICAgICAgICAgICAgdGhpcywgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25OZXh0RnJvbVN0YXJ0RG9jdW1lbnQoKSB7Ci0gICAgICAgIC8vIGp1c3QgZ28gdG8gc3RhcnRfdGFnCi0gICAgICAgIG1QYXJzaW5nU3RhdGUgPSBTVEFSVF9UQUc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25OZXh0RnJvbVN0YXJ0VGFnKCkgewotICAgICAgICAvLyBzaW5jZSB3ZSBoYXZlIG5vIGNoaWxkcmVuLCBqdXN0IGdvIHRvIGVuZF90YWcKLSAgICAgICAgbVBhcnNpbmdTdGF0ZSA9IEVORF9UQUc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25OZXh0RnJvbUVuZFRhZygpIHsKLSAgICAgICAgLy8ganVzdCBvbmUgdGFnLiB3ZSBhcmUgZG9uZS4KLSAgICAgICAgbVBhcnNpbmdTdGF0ZSA9IEVORF9ET0NVTUVOVDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvY29uZmlndXJhdGlvbi9Db25maWdFZGl0RGlhbG9nLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvY29uZmlndXJhdGlvbi9Db25maWdFZGl0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWNlZWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2NvbmZpZ3VyYXRpb24vQ29uZmlnRWRpdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5JY29uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5MYW5ndWFnZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlJlZ2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlJlc291cmNlUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVmVyc2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkxheW91dERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuQ29uZmlndXJhdGlvblNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uU2VsZWN0b3IuQ29uZmlndXJhdGlvblN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uU2VsZWN0b3IuSVF1YWxpZmllckZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi51aS5HcmlkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIERpYWxvZyB0byBlZGl0IGJvdGggYSB7QGxpbmsgTGF5b3V0RGV2aWNlfSwgYW5kIGEge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGF0IHRoZSBzYW1lIHRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdFZGl0RGlhbG9nIGV4dGVuZHMgR3JpZERpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZMT0FUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcZCooXFwuXFxkPyk/Iik7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgRm9sZGVyQ29uZmlndXJhdGlvbiBtQ29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvblNlbGVjdG9yIG1Db25maWdTZWxlY3RvcjsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtU3RhdHVzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0xhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0ltYWdlOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBtRXJyb3I7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRGV2aWNlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ29uZmlnTmFtZTsKLSAgICBwcml2YXRlIGZsb2F0IG1YRHBpID0gRmxvYXQuTmFOOwotICAgIHByaXZhdGUgZmxvYXQgbVlEcGkgPSBGbG9hdC5OYU47Ci0KLQotICAgIHB1YmxpYyBDb25maWdFZGl0RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCwgMSwgZmFsc2UpOwotICAgICAgICBtQ29uZmlnLnNldChjb25maWcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERldmljZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbURldmljZU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhEcGkoZmxvYXQgeGRwaSkgewotICAgICAgICBtWERwaSA9IHhkcGk7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldFhEcGkoKSB7Ci0gICAgICAgIHJldHVybiBtWERwaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRZRHBpKGZsb2F0IHlkcGkpIHsKLSAgICAgICAgbVlEcGkgPSB5ZHBpOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRZRHBpKCkgewotICAgICAgICByZXR1cm4gbVlEcGk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtQ29uZmlnTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgICAgICByZXR1cm4gbUNvbmZpZ05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIG1Db25maWcuc2V0KGNvbmZpZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0Q29uZmlnKEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIGNvbmZpZy5zZXQobUNvbmZpZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRGlhbG9nQ29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1FcnJvciA9IEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEdyb3VwIGRldmljZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkZXZpY2VHcm91cC5zZXRUZXh0KCJEZXZpY2UiKTsKLSAgICAgICAgZGV2aWNlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGRldmljZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoZGV2aWNlR3JvdXAsIFNXVC5Ob25lKTsKLSAgICAgICAgbC5zZXRUZXh0KCJOYW1lIik7Ci0KLSAgICAgICAgZmluYWwgVGV4dCBkZXZpY2VOYW1lVGV4dCA9IG5ldyBUZXh0KGRldmljZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGV2aWNlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGlmIChtRGV2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXZpY2VOYW1lVGV4dC5zZXRUZXh0KG1EZXZpY2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlTmFtZSA9IGRldmljZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVPaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIFZlcmlmeUxpc3RlbmVyIGZsb2F0VmVyaWZpZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29tYmluZSB0aGUgY3VycmVudCBjb250ZW50IGFuZCB0aGUgbmV3IHRleHQKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICgoVGV4dClldmVudC53aWRnZXQpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpICsgZXZlbnQudGV4dCArIHRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgbWFrZSBzdXJlIGl0J3MgYSBtYXRjaCBmb3IgdGhlIHJlZ2V4Ci0gICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IEZMT0FUX1BBVFRFUk4ubWF0Y2hlcih0ZXh0KS5tYXRjaGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChkZXZpY2VHcm91cCwgU1dULk5vbmUpOwotICAgICAgICBsLnNldFRleHQoInggZHBpIik7Ci0KLSAgICAgICAgZmluYWwgVGV4dCBkZXZpY2VYRHBpVGV4dCA9IG5ldyBUZXh0KGRldmljZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGV2aWNlWERwaVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGlmIChGbG9hdC5pc05hTihtWERwaSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGRldmljZVhEcGlUZXh0LnNldFRleHQoU3RyaW5nLmZvcm1hdCgiJS4xZiIsIG1YRHBpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VYRHBpVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihmbG9hdFZlcmlmaWVyKTsKLSAgICAgICAgZGV2aWNlWERwaVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZGV2aWNlWERwaVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1YRHBpID0gRmxvYXQuTmFOOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1YRHBpID0gRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKGRldmljZUdyb3VwLCBTV1QuTm9uZSk7Ci0gICAgICAgIGwuc2V0VGV4dCgieSBkcGkiKTsKLQotICAgICAgICBmaW5hbCBUZXh0IGRldmljZVlEcGlUZXh0ID0gbmV3IFRleHQoZGV2aWNlR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBkZXZpY2VZRHBpVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgaWYgKEZsb2F0LmlzTmFOKG1ZRHBpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgZGV2aWNlWURwaVRleHQuc2V0VGV4dChTdHJpbmcuZm9ybWF0KCIlLjFmIiwgbVlEcGkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGRldmljZVlEcGlUZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGZsb2F0VmVyaWZpZXIpOwotICAgICAgICBkZXZpY2VZRHBpVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBkZXZpY2VZRHBpVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVlEcGkgPSBGbG9hdC5OYU47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVlEcGkgPSBGbG9hdC5wYXJzZUZsb2F0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEdyb3VwIGNvbmZpZ0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb25maWdHcm91cC5zZXRUZXh0KCJDb25maWd1cmF0aW9uIik7Ci0gICAgICAgIGNvbmZpZ0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjb25maWdHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKGNvbmZpZ0dyb3VwLCBTV1QuTm9uZSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiTmFtZSIpOwotCi0gICAgICAgIGZpbmFsIFRleHQgY29uZmlnTmFtZVRleHQgPSBuZXcgVGV4dChjb25maWdHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGNvbmZpZ05hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBpZiAobUNvbmZpZ05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnTmFtZVRleHQuc2V0VGV4dChtQ29uZmlnTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbUNvbmZpZ05hbWUgPSBjb25maWdOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlT2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUNvbmZpZ1NlbGVjdG9yID0gbmV3IENvbmZpZ3VyYXRpb25TZWxlY3Rvcihjb25maWdHcm91cCwgdHJ1ZSAvKmRldmljZU1vZGUqLyk7Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2VsZWN0b3IgdG8gYmUgaW4gImRldmljZSBtb2RlIiBhbmQgbm90IGFjY2VwdCBsYW5ndWFnZS9yZWdpb24vdmVyc2lvbgotICAgICAgICAvLyBzaW5jZSB0aG9zZSBhcmUgc2VsZWN0ZWQgZnJvbSBhIGRpZmZlcmVudCBjb21ibwotICAgICAgICAvLyBGSVhNRTogYWRkIHZlcnNpb24gY29tYm8uCi0gICAgICAgIG1Db25maWdTZWxlY3Rvci5zZXRRdWFsaWZpZXJGaWx0ZXIobmV3IElRdWFsaWZpZXJGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIExhbmd1YWdlUXVhbGlmaWVyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZXIgaW5zdGFuY2VvZiBSZWdpb25RdWFsaWZpZXIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllciBpbnN0YW5jZW9mIFZlcnNpb25RdWFsaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbUNvbmZpZ1NlbGVjdG9yLnNldENvbmZpZ3VyYXRpb24obUNvbmZpZyk7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICBtQ29uZmlnU2VsZWN0b3Iuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZC53aWR0aEhpbnQgPSBDb25maWd1cmF0aW9uU2VsZWN0b3IuV0lEVEhfSElOVDsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IENvbmZpZ3VyYXRpb25TZWxlY3Rvci5IRUlHSFRfSElOVDsKLQotICAgICAgICAvLyBhZGQgYSBsaXN0ZW5lciB0byBjaGVjayBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIEZvbGRlckNvbmZpZ3VyYXRpb24gYXMKLSAgICAgICAgLy8gdGhleSBhcmUgYnVpbHQuCi0gICAgICAgIG1Db25maWdTZWxlY3Rvci5zZXRPbkNoYW5nZUxpc3RlbmVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ1NlbGVjdG9yLmdldFN0YXRlKCkgPT0gQ29uZmlndXJhdGlvblN0YXRlLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25maWdTZWxlY3Rvci5nZXRDb25maWd1cmF0aW9uKG1Db25maWcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbGlkYXRlT2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVN0YXR1c0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TdGF0dXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIG1TdGF0dXNDb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgICAgIG1TdGF0dXNJbWFnZSA9IG5ldyBMYWJlbChtU3RhdHVzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChtU3RhdHVzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcmVzZXRTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgICAgIHZhbGlkYXRlT2soKTsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVzZXRzIHRoZSBzdGF0dXMgbGFiZWwgdG8gc2hvdyB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRTdGF0dXMoKSB7Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gRGlhbG9nLnNob3J0ZW5UZXh0KAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNvbmZpZzogJTEkcyIsIG1Db25maWcudG9TdHJpbmcoKSksCi0gICAgICAgICAgICAgICAgbVN0YXR1c0xhYmVsKTsKLSAgICAgICAgbVN0YXR1c0xhYmVsLnNldFRleHQoZGlzcGxheVN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEVycm9yKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gRGlhbG9nLnNob3J0ZW5UZXh0KHRleHQsIG1TdGF0dXNMYWJlbCk7Ci0gICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KGRpc3BsYXlTdHJpbmcpOwotICAgICAgICBtU3RhdHVzSW1hZ2Uuc2V0SW1hZ2UobUVycm9yKTsKLSAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9rKCkgewotICAgICAgICAvLyBjaGVjayB0aGUgZGV2aWNlIG5hbWUKLSAgICAgICAgaWYgKG1EZXZpY2VOYW1lID09IG51bGwgfHwgbURldmljZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3IoIkRldmljZSBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGUgY29uZmlnIG5hbWUKLSAgICAgICAgaWYgKG1Db25maWdOYW1lID09IG51bGwgfHwgbUNvbmZpZ05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3IoIkNvbmZpZ3VyYXRpb24gbmFtZSBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIGNoZWNrIHRoZSBjb25maWcgaXRzZWxmCi0gICAgICAgIENvbmZpZ3VyYXRpb25TdGF0ZSBzdGF0ZSA9IG1Db25maWdTZWxlY3Rvci5nZXRTdGF0ZSgpOwotCi0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9DT05GSUc6Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgaW52YWxpZFF1YWxpZmllciA9IG1Db25maWdTZWxlY3Rvci5nZXRJbnZhbGlkUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENvbmZpZ3VyYXRpb246ICUxJHMgaGFzIG5vIGZpbHRlciBzZXQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRRdWFsaWZpZXIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBSRUdJT05fV0lUSE9VVF9MQU5HVUFHRToKLSAgICAgICAgICAgICAgICBzZXRFcnJvcigiVGhlIFJlZ2lvbiBxdWFsaWZpZXIgcmVxdWlyZXMgdGhlIExhbmd1YWdlIHF1YWxpZmllci4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBubyBlcnJvcgotICAgICAgICBtU3RhdHVzSW1hZ2Uuc2V0SW1hZ2UobnVsbCk7Ci0gICAgICAgIHJlc2V0U3RhdHVzKCk7Ci0gICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgIC8vIG5lZWQgdG8gcmVsYXlvdXQsIGJlY2F1c2Ugb2YgdGhlIGNoYW5nZSBpbiBzaXplIGluIG1FcnJvckltYWdlLgotICAgICAgICBtU3RhdHVzQ29tcG9zaXRlLmxheW91dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9jb25maWd1cmF0aW9uL0NvbmZpZ01hbmFnZXJEaWFsb2cuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9jb25maWd1cmF0aW9uL0NvbmZpZ01hbmFnZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkODcwYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvY29uZmlndXJhdGlvbi9Db25maWdNYW5hZ2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlRhYmxlSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuTGF5b3V0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuTGF5b3V0RGV2aWNlTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi51aS5HcmlkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIERpYWxvZyB0byB2aWV3IHRoZSBsYXlvdXQgZGV2aWNlcyB3aXRoIGFjdGlvbiBidXR0b24gdG8gY3JlYXRlL2VkaXQvZGVsZXRlL2NvcHkgbGF5b3V0IGRldmljZXMKLSAqIGFuZCBjb25maWdzLgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ01hbmFnZXJEaWFsb2cgZXh0ZW5kcyBHcmlkRGlhbG9nIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT0xfTkFNRSA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmNvbmZpZ21hbmFnZXIubmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MX0NPTkZJRyA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmNvbmZpZ21hbmFnZXIuY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogZW51bSB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBvcmlnaW4gb2YgdGhlIGxheW91dCBkZXZpY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGVudW0gRGV2aWNlVHlwZSB7Ci0gICAgICAgIERFRkFVTFQoIkRlZmF1bHQiKSwKLSAgICAgICAgQURET04oIkFkZC1vbiIpLAotICAgICAgICBDVVNUT00oIkN1c3RvbSIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EaXNwbGF5OwotCi0gICAgICAgIERldmljZVR5cGUoU3RyaW5nIGRpc3BsYXkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5ID0gZGlzcGxheTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2ltcGxlIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgdHJlZSBzZWxlY3Rpb24gd2l0aCB0aGUgcHJvcGVyIHR5cGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERldmljZVNlbGVjdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBEZXZpY2VTZWxlY3Rpb24oRGV2aWNlVHlwZSB0eXBlLCBMYXlvdXREZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgIEVudHJ5PFN0cmluZywgRm9sZGVyQ29uZmlndXJhdGlvbj4gZW50cnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIERldmljZVR5cGUgdHlwZTsKLSAgICAgICAgZmluYWwgTGF5b3V0RGV2aWNlIGRldmljZTsKLSAgICAgICAgZmluYWwgRW50cnk8U3RyaW5nLCBGb2xkZXJDb25maWd1cmF0aW9uPiBlbnRyeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIExheW91dERldmljZU1hbmFnZXIgbU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgbVRyZWVWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbU5ld0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRWRpdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ29weUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRGVsZXRlQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ29udGVudCBwcm92aWRlciBvZiB0aGUge0BsaW5rIFRyZWVWaWV3ZXJ9LiBUaGUgZXhwZWN0ZWQgaW5wdXQgaXMKLSAgICAgKiB7QGxpbmsgTGF5b3V0RGV2aWNlTWFuYWdlcn0uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBEZXZpY2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIERldmljZVR5cGVbXSBzQ2F0ZWdvcnkgPSBuZXcgRGV2aWNlVHlwZVtdIHsKLSAgICAgICAgICAgIERldmljZVR5cGUuREVGQVVMVCwgRGV2aWNlVHlwZS5BRERPTiwgRGV2aWNlVHlwZS5DVVNUT00KLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIExheW91dERldmljZU1hbmFnZXIgbUxheW91dERldmljZU1hbmFnZXI7Ci0KLSAgICAgICAgcHVibGljIERldmljZUNvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gc0NhdGVnb3J5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoRGV2aWNlVHlwZS5ERUZBVUxULmVxdWFscyhwYXJlbnRFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUxheW91dERldmljZU1hbmFnZXIuZ2V0RGVmYXVsdExheW91dERldmljZXMoKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXZpY2VUeXBlLkFERE9OLmVxdWFscyhwYXJlbnRFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUxheW91dERldmljZU1hbmFnZXIuZ2V0QWRkT25MYXlvdXREZXZpY2UoKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXZpY2VUeXBlLkNVU1RPTS5lcXVhbHMocGFyZW50RWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1MYXlvdXREZXZpY2VNYW5hZ2VyLmdldFVzZXJMYXlvdXREZXZpY2VzKCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIExheW91dERldmljZSkgewotICAgICAgICAgICAgICAgIExheW91dERldmljZSBkZXZpY2UgPSAoTGF5b3V0RGV2aWNlKXBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5nZXRDb25maWdzKCkuZW50cnlTZXQoKS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIHBhcmVudCBjYW5ub3QgYmUgY29tcHV0ZWQuIHRoaXMgaXMgZmluZS4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGV2aWNlVHlwZSkgewotICAgICAgICAgICAgICAgIGlmIChEZXZpY2VUeXBlLkRFRkFVTFQuZXF1YWxzKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtTGF5b3V0RGV2aWNlTWFuYWdlci5nZXREZWZhdWx0TGF5b3V0RGV2aWNlcygpLnNpemUoKSA+IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXZpY2VUeXBlLkFERE9OLmVxdWFscyhlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUxheW91dERldmljZU1hbmFnZXIuZ2V0QWRkT25MYXlvdXREZXZpY2UoKS5zaXplKCkgPiAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRGV2aWNlVHlwZS5DVVNUT00uZXF1YWxzKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtTGF5b3V0RGV2aWNlTWFuYWdlci5nZXRVc2VyTGF5b3V0RGV2aWNlcygpLnNpemUoKSA+IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGF5b3V0RGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgTGF5b3V0RGV2aWNlIGRldmljZSA9IChMYXlvdXREZXZpY2UpZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmdldENvbmZpZ3MoKS5zaXplKCkgPiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRpc3Bvc2UKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGF5b3V0RGV2aWNlTWFuYWdlcikgewotICAgICAgICAgICAgICAgIG1MYXlvdXREZXZpY2VNYW5hZ2VyID0gKExheW91dERldmljZU1hbmFnZXIpbmV3SW5wdXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3aGVuIHRoZSBkaWFsb2cgY2xvc2VzIHdlIGdldCBudWxsIGlucHV0Ci0gICAgICAgICAgICBpZiAobmV3SW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlnQ29udGVudFByb3ZpZGVyIHJlcXVpcmVzIGlucHV0IHRvIGJlIExheW91dERldmljZU1hbmFnZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUge0BsaW5rIFRyZWVWaWV3ZXJ9LgotICAgICAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmUge0BsaW5rIERldmljZVR5cGV9LCB7QGxpbmsgTGF5b3V0RGV2aWNlfSwgYW5kIHtAbGluayBFbnRyeX0gKHdoZXJlCi0gICAgICogdGhlIGtleSBpcyBhIHtAbGluayBTdHJpbmd9IG9iamVjdCwgYW5kIHRoZSB2YWx1ZSBpcyBhIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufSBvYmplY3QpLgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgRGV2aWNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChEZXZpY2VUeXBlKWVsZW1lbnQpLmdldERpc3BsYXlTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMYXlvdXREZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChMYXlvdXREZXZpY2UpZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVudHJ5PD8sID8+KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpKChFbnRyeTw/LD8+KWVsZW1lbnQpLmdldEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEVudHJ5PD8sPz4pZWxlbWVudCkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIC8vIG5vIGltYWdlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIG5vIGxpc3RlbmVyCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAvLyBubyBsaXN0ZW5lcgotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZGlzcG9zZQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb25maWdNYW5hZ2VyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCAyLCBmYWxzZSk7Ci0gICAgICAgIG1NYW5hZ2VyID0gU2RrLmdldEN1cnJlbnQoKS5nZXRMYXlvdXREZXZpY2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgIG5ld1NoZWxsLnNldFRleHQoIkRldmljZSBDb25maWd1cmF0aW9ucyIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZURpYWxvZ0NvbnRlbnQoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBHcmlkRGF0YSBnZDsKLSAgICAgICAgR3JpZExheW91dCBnbDsKLQotICAgICAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICB0cmVlLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGdkLndpZHRoSGludCA9IDcwMDsKLQotICAgICAgICB0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIHRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUcmVlQ29sdW1uKHRyZWUsICJOYW1lIiwgU1dULkxFRlQsIDE1MCwgQ09MX05BTUUsCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRyZWVDb2x1bW4odHJlZSwgIkNvbmZpZ3VyYXRpb24iLCBTV1QuTEVGVCwgNTAwLCBDT0xfQ09ORklHLAotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0gICAgICAgIG1UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7Ci0gICAgICAgIG1UcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGV2aWNlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZXZpY2VMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLSAgICAgICAgbVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkKGdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLSAgICAgICAgYnV0dG9ucy5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgICAgIG1OZXdCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBtTmV3QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtTmV3QnV0dG9uLnNldFRleHQoIk5ldy4uLiIpOwotICAgICAgICBtTmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgQ29uZmlnRWRpdERpYWxvZyBkbGcgPSBuZXcgQ29uZmlnRWRpdERpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkbGcuc2V0RGV2aWNlTmFtZShzZWxlY3Rpb24uZGV2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRsZy5zZXRYRHBpKHNlbGVjdGlvbi5kZXZpY2UuZ2V0WERwaSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGxnLnNldFlEcGkoc2VsZWN0aW9uLmRldmljZS5nZXRZRHBpKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGxnLnNldENvbmZpZ05hbWUoc2VsZWN0aW9uLmVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGxnLnNldENvbmZpZyhzZWxlY3Rpb24uZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gZGxnLmdldERldmljZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ05hbWUgPSBkbGcuZ2V0Q29uZmlnTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRsZy5nZXRDb25maWcoY29uZmlnKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpZiB0aGVyZSB3YXMgbm8gb3JpZ2luYWwgZGV2aWNlLCB3ZSBjcmVhdGUgb25lLgotICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBuZXcgYnV0dG9uIGlzIGRpc2FibGVkIHdoZW4gc29tZXRoaW5nIGVsc2UgdGhhbiAiY3VzdG9tIiBpcwotICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCwgd2UgYWx3YXlzIGFkZCB0byB0aGUgdXNlciBkZXZpY2VzIHdpdGhvdXQgY2hlY2tpbmcuCi0gICAgICAgICAgICAgICAgICAgIExheW91dERldmljZSBkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBkb2Vzbid0IGNoZWNrIGlmIHRoZSBkZXZpY2UgbmFtZSBpcyB0YWtlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBtTWFuYWdlci5hZGRVc2VyRGV2aWNlKGRldmljZU5hbWUsIGRsZy5nZXRYRHBpKCksIGRsZy5nZXRZRHBpKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBtTWFuYWdlci5nZXRVc2VyTGF5b3V0RGV2aWNlKGRldmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBpZiB0aGVyZSB3YXMgbm8gY29uZmlnLCB3ZSBhZGQgaXQsIG90aGVyd2lzZSB3ZSBlZGl0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2QgdGhhdCBhZGRzL3JlcGxhY2UgYSBjb25maWcpLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBkb2Vzbid0IGNoZWNrIGlmIHRoZSBuYW1lIHdhcyBhbHJlYWR5IHRha2VuLgotICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkVXNlckNvbmZpZ3VyYXRpb24oZCwgY29uZmlnTmFtZSwgY29uZmlnKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGQsIGNvbmZpZ05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtRWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1FZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRWRpdEJ1dHRvbi5zZXRUZXh0KCJFZGl0Li4uIik7Ci0gICAgICAgIG1FZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIENvbmZpZ0VkaXREaWFsb2cgZGxnID0gbmV3IENvbmZpZ0VkaXREaWFsb2cocGFyZW50LmdldFNoZWxsKCksIG51bGwpOwotICAgICAgICAgICAgICAgIGRsZy5zZXREZXZpY2VOYW1lKHNlbGVjdGlvbi5kZXZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBkbGcuc2V0WERwaShzZWxlY3Rpb24uZGV2aWNlLmdldFhEcGkoKSk7Ci0gICAgICAgICAgICAgICAgZGxnLnNldFlEcGkoc2VsZWN0aW9uLmRldmljZS5nZXRZRHBpKCkpOwotICAgICAgICAgICAgICAgIGRsZy5zZXRDb25maWdOYW1lKHNlbGVjdGlvbi5lbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgZGxnLnNldENvbmZpZyhzZWxlY3Rpb24uZW50cnkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZU5hbWUgPSBkbGcuZ2V0RGV2aWNlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnTmFtZSA9IGRsZy5nZXRDb25maWdOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZGxnLmdldENvbmZpZyhjb25maWcpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGRldmljZSBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGRvZXNuJ3QgY2hlY2sgaWYgdGhlIHJlcGxhY2VtZW50IG5hbWUgZG9lc24ndCBleGlzdCBhbHJlYWR5LgotICAgICAgICAgICAgICAgICAgICBMYXlvdXREZXZpY2UgZCA9IG1NYW5hZ2VyLnJlcGxhY2VVc2VyRGV2aWNlKHNlbGVjdGlvbi5kZXZpY2UsIGRldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxnLmdldFhEcGkoKSwgZGxnLmdldFlEcGkoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFkZC9yZXBsYWNlIHRoZSBjb25maWcKLSAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVwbGFjZVVzZXJDb25maWd1cmF0aW9uKGQsIHNlbGVjdGlvbi5lbnRyeS5nZXRLZXkoKSwgY29uZmlnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcpOwotCi0gICAgICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGQsIGNvbmZpZ05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUNvcHlCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBtQ29weUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbUNvcHlCdXR0b24uc2V0VGV4dCgiQ29weSIpOwotICAgICAgICBtQ29weUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERldmljZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBzb3VyY2UgYSBkZWZhdWx0L2FkZC1vbiBkZXZpY2UsIG9yIGFyZSB3ZSBjb3B5aW5nIGEgZnVsbCBkZXZpY2U/Ci0gICAgICAgICAgICAgICAgLy8gaWYgc28gdGhlIHRhcmdldCBkZXZpY2UgaXMgYSBuZXcgZGV2aWNlLgotICAgICAgICAgICAgICAgIExheW91dERldmljZSB0YXJnZXREZXZpY2UgPSBzZWxlY3Rpb24uZGV2aWNlOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24udHlwZSA9PSBEZXZpY2VUeXBlLkRFRkFVTFQgfHwgc2VsZWN0aW9uLnR5cGUgPT0gRGV2aWNlVHlwZS5BRERPTiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGRldmljZQotICAgICAgICAgICAgICAgICAgICB0YXJnZXREZXZpY2UgPSBtTWFuYWdlci5hZGRVc2VyRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZXZpY2UuZ2V0TmFtZSgpICsgIiBDb3B5IiwgLy8gbmV3IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZGV2aWNlLmdldFhEcGkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZGV2aWNlLmdldFlEcGkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0NvbmZpZ05hbWUgPSBudWxsOyAvLyBuYW1lIG9mIHRoZSBzaW5nbGUgbmV3IGNvbmZpZy4gdXNlZCBmb3IgdGhlIHNlbGVjdC4KLQotICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBjb3B5aW5nIHRoZSBmdWxsIGRldmljZT8KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25maWcgZnJvbSB0aGUgb3JpZ2luIGRldmljZQotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBGb2xkZXJDb25maWd1cmF0aW9uPiBjb25maWdzID0gc2VsZWN0aW9uLmRldmljZS5nZXRDb25maWdzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvcHkgdGhlbSBpbiB0aGUgdGFyZ2V0IGRldmljZQotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgRm9sZGVyQ29uZmlndXJhdGlvbj4gZW50cnkgOiBjb25maWdzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGNvbmZpZyBvYmplY3QsIG9yIGl0IGNvdWxkIGJlIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBkZWZhdWx0L2FkZG9uIGJ5IGVkaXRpbmcgdGhlIHZlcnNpb24gaW4gdGhlIG5ldyBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvcHkgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weS5zZXQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lIGNhbiBzdGF5IHRoZSBzYW1lIHNpbmNlIHdlIGFyZSBjb3B5aW5nIGEgZnVsbCBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgdGFyZ2V0IGRldmljZSBoYXMgaXRzIG93biBuZXcgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZFVzZXJDb25maWd1cmF0aW9uKHRhcmdldERldmljZSwgZW50cnkuZ2V0S2V5KCksIGNvcHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb3B5IHRoZSBjb25maWcuIHRhcmdldCBkZXZpY2UgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzZWxlY3Rpb24sIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgY29uZmlnIG5hbWUgYXMgd2UgYWxyZWFkeSBjaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZ05hbWUgPSAoc2VsZWN0aW9uLmRldmljZSAhPSB0YXJnZXREZXZpY2UpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZW50cnkuZ2V0S2V5KCkgOiBzZWxlY3Rpb24uZW50cnkuZ2V0S2V5KCkgKyAiIENvcHkiOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGNvbmZpZwotICAgICAgICAgICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvcHkgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjb3B5LnNldChzZWxlY3Rpb24uZW50cnkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSB0aGUgY29uZmlnCi0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZFVzZXJDb25maWd1cmF0aW9uKHRhcmdldERldmljZSwgbmV3Q29uZmlnTmFtZSwgY29weSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgICAgICAgICAgc2VsZWN0KHRhcmdldERldmljZSwgbmV3Q29uZmlnTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1EZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBtRGVsZXRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRGVsZXRlQnV0dG9uLnNldFRleHQoIkRlbGV0ZSIpOwotICAgICAgICBtRGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5lbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZVVzZXJDb25maWd1cmF0aW9uKHNlbGVjdGlvbi5kZXZpY2UsIHNlbGVjdGlvbi5lbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlVXNlckRldmljZShzZWxlY3Rpb24uZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBlaXRoZXIgc2VsZWN0IHRoZSBkZXZpY2UgKGlmIHdlIHJlbW92ZWQgYSBlbnRyeSwgb3IgdGhlIHRvcCBjdXN0b20gbm9kZSBpZgotICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZWQgYSBkZXZpY2UpCi0gICAgICAgICAgICAgICAgc2VsZWN0KHNlbGVjdGlvbi5lbnRyeSAhPSBudWxsID8gc2VsZWN0aW9uLmRldmljZSA6IG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0gICAgICAgIG1UcmVlVmlld2VyLnNldElucHV0KG1NYW5hZ2VyKTsKLSAgICAgICAgc2V0RW5hYmxlZChudWxsKTsgLy8gbm8gc2VsZWN0aW9uIGF0IHRoZSBzdGFydAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgYW4gT0sgYnV0dG9uLgotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIERldmljZVNlbGVjdGlvbn0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VsZWN0ZWQgcGF0aCBpbiB0aGUKLSAgICAgKiB7QGxpbmsgVHJlZVZpZXdlcn0KLSAgICAgKi8KLSAgICBwcml2YXRlIERldmljZVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgc2VsZWN0aW9uIHBhdGhzCi0gICAgICAgIFRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pbVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIFRyZWVQYXRoW10gcGF0aHMgPXNlbGVjdGlvbi5nZXRQYXRocygpOwotCi0gICAgICAgIGlmIChwYXRocy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBUcmVlUGF0aCBwYXRoU2VsZWN0aW9uID0gcGF0aHNbMF07Ci0KLSAgICAgICAgRGV2aWNlVHlwZSB0eXBlID0gKERldmljZVR5cGUpcGF0aFNlbGVjdGlvbi5nZXRGaXJzdFNlZ21lbnQoKTsKLSAgICAgICAgTGF5b3V0RGV2aWNlIGRldmljZSA9IG51bGw7Ci0gICAgICAgIEVudHJ5PFN0cmluZywgRm9sZGVyQ29uZmlndXJhdGlvbj4gZW50cnkgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKHBhdGhTZWxlY3Rpb24uZ2V0U2VnbWVudENvdW50KCkpIHsKLSAgICAgICAgICAgIGNhc2UgMjogLy8gbGF5b3V0IGRldmljZSBpcyBzZWxlY3RlZAotICAgICAgICAgICAgICAgIGRldmljZSA9IChMYXlvdXREZXZpY2UpcGF0aFNlbGVjdGlvbi5nZXRMYXN0U2VnbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiAvLyBjb25maWcgaXMgc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSAoTGF5b3V0RGV2aWNlKXBhdGhTZWxlY3Rpb24uZ2V0U2VnbWVudCgxKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IChFbnRyeTxTdHJpbmcsIEZvbGRlckNvbmZpZ3VyYXRpb24+KXBhdGhTZWxlY3Rpb24uZ2V0TGFzdFNlZ21lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlU2VsZWN0aW9uKHR5cGUsIGRldmljZSwgZW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgdGhlIGFjdGlvbiBidXR0b24gYmFzZWQgb24gdGhlIHtAbGluayBEZXZpY2VTZWxlY3Rpb259LgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWQoRGV2aWNlU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1Db3B5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbURlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0aW9uLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERFRkFVTFQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBBRERPTjoKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyBjb3B5IGlmIGRldmljZSBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICBtTmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvcHlCdXR0b24uc2V0RW5hYmxlZChzZWxlY3Rpb24uZGV2aWNlICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENVU1RPTToKLSAgICAgICAgICAgICAgICAgICAgbU5ld0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOyAvLyBhbHdheXMgdHJ1ZSB0byBjcmVhdGUgbmV3IGRldmljZXMuCi0gICAgICAgICAgICAgICAgICAgIG1FZGl0QnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLmVudHJ5ICE9IG51bGwpOyAvLyBvbmx5IGVkaXQgY29uZmlnIGZvciBub3cKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBzZWxlY3Rpb24uZGV2aWNlICE9IG51bGw7IC8vIG5lZWQgYXQgbGVhc3Qgc2VsZWN0ZWQgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgIG1EZWxldGVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsgICAgICAgICAgLy8gZm9yIGRlbGV0ZSBhbmQgY29weSBidXR0b25zCi0gICAgICAgICAgICAgICAgICAgIG1Db3B5QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIGRldmljZSBhbmQgb3B0aW9uYWxseSBhIGNvbmZpZy4gQmVjYXVzZSB0aGlzIGlzIG1lYW50IHRvIHNob3cgbmV3bHkgY3JlYXRlZC9lZGl0ZWQKLSAgICAgKiBkZXZpY2UvY29uZmlnLCBpdCdsbCBvbmx5IGRvIHNvIGZvciB7QGxpbmsgRGV2aWNlVHlwZSNDVVNUT019IGRldmljZXMuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRvIHNlbGVjdAotICAgICAqIEBwYXJhbSBjb25maWdOYW1lIHRoZSBjb25maWcgdG8gc2VsZWN0IChvcHRpb25hbCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0KExheW91dERldmljZSBkZXZpY2UsIFN0cmluZyBjb25maWdOYW1lKSB7Ci0gICAgICAgIE9iamVjdFtdIHBhdGg7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSAiY3VzdG9tIiBub2RlCi0gICAgICAgICAgICBwYXRoID0gbmV3IE9iamVjdFtdIHsgRGV2aWNlVHlwZS5DVVNUT00gfTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWdOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGVhc3kgY2FzZS4gbm8gY29uZmlnIHRvIHNlbGVjdAotICAgICAgICAgICAgcGF0aCA9IG5ldyBPYmplY3RbXSB7IERldmljZVR5cGUuQ1VTVE9NLCBkZXZpY2UgfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgbW9yZSBjb21wbGV4LiB3ZSBoYXZlIHRoZSBjb25maWdOYW1lLCBidXQgdGhlIHRyZWUgY29udGFpbnMgRW50cnk8Pyw/PgotICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGVudHJ5LgotICAgICAgICAgICAgRW50cnk8PywgPz4gbWF0Y2ggPSBudWxsOwotICAgICAgICAgICAgZm9yIChFbnRyeTw/LCA/PiBlbnRyeSA6IGRldmljZS5nZXRDb25maWdzKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5lcXVhbHMoY29uZmlnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBlbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhdGggPSBuZXcgT2JqZWN0W10geyBEZXZpY2VUeXBlLkNVU1RPTSwgZGV2aWNlLCBtYXRjaCB9OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gbmV3IE9iamVjdFtdIHsgRGV2aWNlVHlwZS5DVVNUT00sIGRldmljZSB9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBUcmVlU2VsZWN0aW9uKG5ldyBUcmVlUGF0aChwYXRoKSksIHRydWUgLypyZXZlYWwqLyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc4NDQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTGFuZ3VhZ2VRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5QaXhlbERlbnNpdHlRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZWdpb25RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZXNvdXJjZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbkRpbWVuc2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVmVyc2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlBpeGVsRGVuc2l0eVF1YWxpZmllci5EZW5zaXR5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIuU2NyZWVuT3JpZW50YXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlByb2plY3RSZXNvdXJjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5MYXlvdXREZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5MYXlvdXREZXZpY2VNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uU2VsZWN0b3IuTGFuZ3VhZ2VSZWdpb25WZXJpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklSZXNvdXJjZVZhbHVlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVN0eWxlUmVzb3VyY2VWYWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSB0aGF0IGRpc3BsYXlzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZGlzcGxheWVkIGluIGEgR3JhcGhpY2FsIExheW91dCBFZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUSEVNRV9TRVBBUkFUT1IgPSAiLS0tLS0tLS0tLSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQnV0dG9uIG1DbGlwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIExhYmVsIG1DdXJyZW50TGF5b3V0TGFiZWw7Ci0KLSAgICBwcml2YXRlIENvbWJvIG1Mb2NhbGU7Ci0gICAgcHJpdmF0ZSBDb21ibyBtRGV2aWNlTGlzdDsKLSAgICBwcml2YXRlIENvbWJvIG1EZXZpY2VDb25maWdzOwotICAgIHByaXZhdGUgQ29tYm8gbVRoZW1lQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUNyZWF0ZUJ1dHRvbjsKLQotCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXRmb3JtVGhlbWVDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNhYmxlVXBkYXRlcyA9IGZhbHNlOwotCi0gICAgLyoqIFRoZSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgVUkgY29udHJvbHMgKi8KLSAgICBwcml2YXRlIGZpbmFsIEZvbGRlckNvbmZpZ3VyYXRpb24gbUN1cnJlbnRDb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PExheW91dERldmljZT4gbURldmljZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZXNvdXJjZVF1YWxpZmllcltdID4gbUxvY2FsZUxpc3QgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFJlc291cmNlUXVhbGlmaWVyW10+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElDb25maWdMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNsaXBwaW5nID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgTGF5b3V0RGV2aWNlIG1DdXJyZW50RGV2aWNlOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBwYXJ0IHdoaWNoIG93bnMgYSB7QGxpbmsgQ29uZmlndXJhdGlvbkNvbXBvc2l0ZX0uCi0gICAgICogVGhpcyBub3RpZmllcyB0aGUgb3duZXJzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgotICAgICAqIFRoZSBvd25lciBtdXN0IGFsc28gcHJvdmlkZSBtZXRob2RzIHRvIHByb3ZpZGUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsCi0gICAgICogYmUgZGlzcGxheWVkLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ0xpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgdm9pZCBvblRoZW1lQ2hhbmdlKCk7Ci0gICAgICAgIHZvaWQgb25DcmVhdGUoKTsKLSAgICAgICAgdm9pZCBPbkNsaXBwaW5nQ2hhbmdlKCk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlcyBnZXRQcm9qZWN0UmVzb3VyY2VzKCk7Ci0gICAgICAgIFByb2plY3RSZXNvdXJjZXMgZ2V0RnJhbWV3b3JrUmVzb3VyY2VzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gZ2V0Q29uZmlndXJlZFByb2plY3RSZXNvdXJjZXMoKTsKLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBnZXRDb25maWd1cmVkRnJhbWV3b3JrUmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db21wb3NpdGUoSUNvbmZpZ0xpc3RlbmVyIGxpc3RlbmVyLCBDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICBpbnQgY29scyA9IDEwOyAvLyBkZXZpY2UqMitjb25maWcqMitsb2NhbGUqMitzZXBhcmF0b3IqMit0aGVtZStjcmVhdGVCdG4KLQotICAgICAgICAvLyAtLS0tIEZpcnN0IGxpbmU6IGNvbGxhcHNlIGJ1dHRvbiwgY2xpcHBpbmcgYnV0dG9uLCBlZGl0aW5nIGNvbmZpZyBkaXNwbGF5LgotICAgICAgICBDb21wb3NpdGUgbGFiZWxQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWxQYXJlbnQuc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLSAgICAgICAgZ2wubWFyZ2luV2lkdGggPSBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYWJlbFBhcmVudC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHM7Ci0KLSAgICAgICAgbmV3IExhYmVsKGxhYmVsUGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dCgiRWRpdGluZyBjb25maWc6Iik7Ci0gICAgICAgIG1DdXJyZW50TGF5b3V0TGFiZWwgPSBuZXcgTGFiZWwobGFiZWxQYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbUN1cnJlbnRMYXlvdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSA1MDsKLQotICAgICAgICBtQ2xpcHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uKGxhYmVsUGFyZW50LCBTV1QuVE9HR0xFIHwgU1dULkZMQVQpOwotICAgICAgICBtQ2xpcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1DbGlwcGluZyk7Ci0gICAgICAgIG1DbGlwcGluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dCgiVG9nZ2xlcyBzY3JlZW4gY2xpcHBpbmcgb24vb2ZmIik7Ci0gICAgICAgIG1DbGlwcGluZ0J1dHRvbi5zZXRJbWFnZShJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEljb24oImNsaXBwaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1DbGlwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIE9uQ2xpcHBpbmdDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gLS0tLSAybmQgbGluZTogZGV2aWNlL2NvbmZpZy9sb2NhbGUvdGhlbWUgQ29tYm9zLCBjcmVhdGUgYnV0dG9uLgotCi0gICAgICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBzZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dChjb2xzLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBnbC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0KLSAgICAgICAgbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKS5zZXRUZXh0KCJEZXZpY2VzIik7Ci0gICAgICAgIG1EZXZpY2VMaXN0ID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbURldmljZUxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1EZXZpY2VMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25EZXZpY2VDaGFuZ2UodHJ1ZSAvKiByZWNvbXB1dGVMYXlvdXQqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSkuc2V0VGV4dCgiQ29uZmlnIik7Ci0gICAgICAgIG1EZXZpY2VDb25maWdzID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbURldmljZUNvbmZpZ3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1EZXZpY2VDb25maWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG9uRGV2aWNlQ29uZmlnQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSkuc2V0VGV4dCgiTG9jYWxlIik7Ci0gICAgICAgIG1Mb2NhbGUgPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtTG9jYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotICAgICAgICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotICAgICAgICBtTG9jYWxlLmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBMYW5ndWFnZVJlZ2lvblZlcmlmaWVyKCkpOwotICAgICAgICBtTG9jYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25Mb2NhbGVDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvbkxvY2FsZUNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBmaXJzdCBzZXBhcmF0b3IKLSAgICAgICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHRoaXMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMDsKLQotICAgICAgICBtVGhlbWVDb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZIHwgU1dULkRST1BfRE9XTik7Ci0gICAgICAgIG1UaGVtZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB1cGRhdGVVSUZyb21SZXNvdXJjZXMoKTsKLSAgICAgICAgbVRoZW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvblRoZW1lQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNlY29uZCBzZXBhcmF0b3IKLSAgICAgICAgc2VwYXJhdG9yID0gbmV3IExhYmVsKHRoaXMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMDsKLQotICAgICAgICBtQ3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgbUNyZWF0ZUJ1dHRvbi5zZXRUZXh0KCJDcmVhdGUuLi4iKTsKLSAgICAgICAgbUNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUNyZWF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DcmVhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGluaXRVaVdpdGhEZXZpY2VzKCk7Ci0KLSAgICAgICAgb25EZXZpY2VDb25maWdDaGFuZ2UoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBGb2xkZXJDb25maWd1cmF0aW9uIGdldEN1cnJlbnRDb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudENvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRDdXJyZW50Q29uZmlnKEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIGNvbmZpZy5zZXQobUN1cnJlbnRDb25maWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB7QGxpbmsgRGVuc2l0eX0uIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBub24gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVuc2l0eSBnZXREZW5zaXR5KCkgewotICAgICAgICBpZiAobUN1cnJlbnRDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgUGl4ZWxEZW5zaXR5UXVhbGlmaWVyIHF1YWwgPSBtQ3VycmVudENvbmZpZy5nZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIoKTsKLSAgICAgICAgICAgIGlmIChxdWFsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGEgc2FuaXR5IGNoZWNrCi0gICAgICAgICAgICAgICAgRGVuc2l0eSBkID0gcXVhbC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkICE9IERlbnNpdHkuTk9EUEkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8gY29uZmlnPyByZXR1cm4gbWVkaXVtIGFzIHRoZSBkZWZhdWx0IGRlbnNpdHkuCi0gICAgICAgIHJldHVybiBEZW5zaXR5Lk1FRElVTTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRldmljZSB4ZHBpLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRYRHBpKCkgewotICAgICAgICBpZiAobUN1cnJlbnREZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZmxvYXQgZHBpID0gbUN1cnJlbnREZXZpY2UuZ2V0WERwaSgpOwotICAgICAgICAgICAgaWYgKEZsb2F0LmlzTmFOKGRwaSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZHBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwaXhlbCBkZW5zaXR5IGFzIHRoZSBkZW5zaXR5LgotICAgICAgICByZXR1cm4gZ2V0RGVuc2l0eSgpLmdldERwaVZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkZXZpY2UgeWRwaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0WURwaSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZsb2F0IGRwaSA9IG1DdXJyZW50RGV2aWNlLmdldFlEcGkoKTsKLSAgICAgICAgICAgIGlmIChGbG9hdC5pc05hTihkcGkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRwaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgcGl4ZWwgZGVuc2l0eSBhcyB0aGUgZGVuc2l0eS4KLSAgICAgICAgcmV0dXJuIGdldERlbnNpdHkoKS5nZXREcGlWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0U2NyZWVuQm91bmRzKCkgewotICAgICAgICAvLyBnZXQgdGhlIG9yaWVudGF0aW9uIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIGNvbmZpZwotICAgICAgICBTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllciBxdWFsID0gbUN1cnJlbnRDb25maWcuZ2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKTsKLSAgICAgICAgU2NyZWVuT3JpZW50YXRpb24gb3JpZW50YXRpb24gPSBTY3JlZW5PcmllbnRhdGlvbi5QT1JUUkFJVDsKLSAgICAgICAgaWYgKHF1YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgb3JpZW50YXRpb24gPSBxdWFsLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGRldmljZSBzY3JlZW4gZGltZW5zaW9uCi0gICAgICAgIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBxdWFsMiA9IG1DdXJyZW50Q29uZmlnLmdldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpOwotICAgICAgICBpbnQgczEsIHMyOwotICAgICAgICBpZiAocXVhbDIgIT0gbnVsbCkgewotICAgICAgICAgICAgczEgPSBxdWFsMi5nZXRWYWx1ZTEoKTsKLSAgICAgICAgICAgIHMyID0gcXVhbDIuZ2V0VmFsdWUyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzMSA9IDQ4MDsKLSAgICAgICAgICAgIHMyID0gMzIwOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgUE9SVFJBSVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoMCwgMCwgczIsIHMxKTsKLSAgICAgICAgICAgIGNhc2UgTEFORFNDQVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKDAsIDAsIHMxLCBzMik7Ci0gICAgICAgICAgICBjYXNlIFNRVUFSRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSgwLCAwLCBzMSwgczEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgVUkgZnJvbSB2YWx1ZXMgaW4gdGhlIHJlc291cmNlcywgc3VjaCBhcyBsYW5ndWFnZXMsIHJlZ2lvbnMsIHRoZW1lcywgZXRjLi4uCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVUlGcm9tUmVzb3VyY2VzKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gY2FuJ3QgZG8gYW55dGhpbmcgdy9vIGl0LgotICAgICAgICB9Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlcyBmcmFtZXdvcmtQcm9qZWN0ID0gbUxpc3RlbmVyLmdldEZyYW1ld29ya1Jlc291cmNlcygpOwotCi0gICAgICAgIG1EaXNhYmxlVXBkYXRlcyA9IHRydWU7Ci0KLSAgICAgICAgLy8gUmVzZXQgc3R1ZmYKLSAgICAgICAgaW50IHNlbGVjdGlvbiA9IG1UaGVtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIG1UaGVtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICBtUGxhdGZvcm1UaGVtZUNvdW50ID0gMDsKLQotICAgICAgICBtTG9jYWxlLnJlbW92ZUFsbCgpOwotICAgICAgICBtTG9jYWxlTGlzdC5jbGVhcigpOwotCi0gICAgICAgIFNvcnRlZFNldDxTdHJpbmc+IGxhbmd1YWdlcyA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHRoZW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIC8vIGdldCB0aGUgdGhlbWVzLCBhbmQgbGFuZ3VhZ2VzIGZyb20gdGhlIEZyYW1ld29yay4KLSAgICAgICAgaWYgKGZyYW1ld29ya1Byb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25maWd1cmVkIHJlc291cmNlcyBmb3IgdGhlIGZyYW1ld29yawotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBmcmFtZXdvclJlc291cmNlcyA9Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLmdldENvbmZpZ3VyZWRGcmFtZXdvcmtSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgaWYgKGZyYW1ld29yUmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHN0eWxlcy4KLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4gc3R5bGVzID0gZnJhbWV3b3JSZXNvdXJjZXMuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLlNUWUxFLmdldE5hbWUoKSk7Ci0KLQotICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHRoZW1lcyBvdXQgb2YgYWxsIHRoZSBzdHlsZXMuCi0gICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2VWYWx1ZSB2YWx1ZSA6IHN0eWxlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZhbHVlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiVGhlbWUuIikgfHwgbmFtZS5lcXVhbHMoIlRoZW1lIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lcy5hZGQodmFsdWUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF0Zm9ybVRoZW1lQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlbSBhbmQgYWRkIHRoZW0gdG8gdGhlIGNvbWJvCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGVtZXMpOwotCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdGhlbWUgOiB0aGVtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRoZW1lQ29tYm8uYWRkKHRoZW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtUGxhdGZvcm1UaGVtZUNvdW50ID0gdGhlbWVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICB0aGVtZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIHRoZW1lcyBhbmQgbGFuZ3VhZ2VzIGZyb20gdGhlIHByb2plY3QuCi0gICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdCA9IG1MaXN0ZW5lci5nZXRQcm9qZWN0UmVzb3VyY2VzKCk7Ci0gICAgICAgIC8vIGluIGNhc2VzIHdoZXJlIHRoZSBvcGVuZWQgZmlsZSBpcyBub3QgbGlua2VkIHRvIGEgcHJvamVjdCwgdGhpcyBjb3VsZCBiZSBudWxsLgotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmZpZ3VyZWQgcmVzb3VyY2VzIGZvciB0aGUgcHJvamVjdAotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBjb25maWd1cmVkUHJvamVjdFJlcyA9Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLmdldENvbmZpZ3VyZWRQcm9qZWN0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIGlmIChjb25maWd1cmVkUHJvamVjdFJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzdHlsZXMuCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+IHN0eWxlTWFwID0gY29uZmlndXJlZFByb2plY3RSZXMuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLlNUWUxFLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3R5bGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IHRoZSB0aGVtZXMgb3V0IG9mIGFsbCB0aGUgc3R5bGVzLCBpZSBzdHlsZXMgdGhhdCBleHRlbmQsCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYSBwbGF0Zm9ybSB0aGVtZS4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2VWYWx1ZSB2YWx1ZSA6IHN0eWxlTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVtZSh2YWx1ZSwgc3R5bGVNYXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVzLmFkZCh2YWx1ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGVtIGFuZCBhZGQgdGhlbSB0aGUgdG8gdGhlIGNvbWJvLgotICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXRmb3JtVGhlbWVDb3VudCA+IDAgJiYgdGhlbWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaGVtZUNvbWJvLmFkZChUSEVNRV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGVtZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHRoZW1lIDogdGhlbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGhlbWVDb21iby5hZGQodGhlbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ2V0IHRoZSBsYW5ndWFnZXMgZnJvbSB0aGUgcHJvamVjdC4KLSAgICAgICAgICAgIGxhbmd1YWdlcyA9IHByb2plY3QuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhlIGxhbmd1YWdlcyB0byB0aGUgQ29tYm8KLSAgICAgICAgbUxvY2FsZS5hZGQoIkRlZmF1bHQiKTsKLSAgICAgICAgbUxvY2FsZUxpc3QuYWRkKG5ldyBSZXNvdXJjZVF1YWxpZmllcltdIHsgbnVsbCwgbnVsbCB9KTsKLQotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIGxhbmd1YWdlcyAhPSBudWxsICYmIGxhbmd1YWdlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBsYW5ndWFnZSA6IGxhbmd1YWdlcykgewotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRoZSBsYW5ndWFnZSBhbG9uZQotICAgICAgICAgICAgICAgIG1Mb2NhbGUuYWRkKGxhbmd1YWdlKTsKLSAgICAgICAgICAgICAgICBMYW5ndWFnZVF1YWxpZmllciBxdWFsID0gbmV3IExhbmd1YWdlUXVhbGlmaWVyKGxhbmd1YWdlKTsKLSAgICAgICAgICAgICAgICBtTG9jYWxlTGlzdC5hZGQobmV3IFJlc291cmNlUXVhbGlmaWVyW10geyBxdWFsLCBudWxsIH0pOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IGZpbmQgdGhlIG1hdGNoaW5nIHJlZ2lvbnMgYW5kIGFkZCB0aGVtCi0gICAgICAgICAgICAgICAgU29ydGVkU2V0PFN0cmluZz4gcmVnaW9ucyA9IHByb2plY3QuZ2V0UmVnaW9ucyhsYW5ndWFnZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVnaW9uIDogcmVnaW9ucykgewotICAgICAgICAgICAgICAgICAgICBtTG9jYWxlLmFkZChTdHJpbmcuZm9ybWF0KCIlMSRzXyUyJHMiLCBsYW5ndWFnZSwgcmVnaW9uKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgUmVnaW9uUXVhbGlmaWVyIHF1YWwyID0gbmV3IFJlZ2lvblF1YWxpZmllcihyZWdpb24pOwotICAgICAgICAgICAgICAgICAgICBtTG9jYWxlTGlzdC5hZGQobmV3IFJlc291cmNlUXVhbGlmaWVyW10geyBxdWFsLCBxdWFsMiB9KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1EaXNhYmxlVXBkYXRlcyA9IGZhbHNlOwotCi0gICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGVtZXMKLSAgICAgICAgaWYgKG1UaGVtZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotICAgICAgICAgICAgbVRoZW1lQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVRoZW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPD0gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbVRoZW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGhlbWVDb21iby5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UaGVtZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRoZW1lQ29tYm8uZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aGVtZSwgb3IgbnVsbCBpZiB0aGUgY29tYm8gaGFzIG5vIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRoZW1lKCkgewotICAgICAgICBpbnQgdGhlbWVJbmRleCA9IG1UaGVtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmICh0aGVtZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRoZW1lQ29tYm8uZ2V0SXRlbSh0aGVtZUluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB0aGVtZSBzZWxlY3Rpb24gaXMgYSBwcm9qZWN0IHRoZW1lLgotICAgICAqIDxwLz5UaGUgcmV0dXJuZWQgdmFsdWUgaXMgbWVhbmluZ2xlc3MgaWYge0BsaW5rICNnZXRUaGVtZSgpfSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgcHJvamVjdCB0aGVtZSwgZmFsc2UgZm9yIGZyYW1ld29yayB0aGVtZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvamVjdFRoZW1lKCkgewotICAgICAgICByZXR1cm4gbVRoZW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+PSBtUGxhdGZvcm1UaGVtZUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENsaXBwaW5nKCkgewotICAgICAgICByZXR1cm4gbUNsaXBwaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRDcmVhdGUoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGlwcGluZ1N1cHBvcnQoYm9vbGVhbiBiKSB7Ci0gICAgICAgIG1DbGlwcGluZ0J1dHRvbi5zZXRFbmFibGVkKGIpOwotICAgICAgICBpZiAoYikgewotICAgICAgICAgICAgbUNsaXBwaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJUb2dnbGVzIHNjcmVlbiBjbGlwcGluZyBvbi9vZmYiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DbGlwcGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtQ2xpcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgbUNsaXBwaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJOb24gY2xpcHBlZCByZW5kZXJpbmcgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBVSSBjb250cm9scyBzdGF0ZSB3aXRoIGEgZ2l2ZW4ge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259LgotICAgICAqIDxwLz5JZiA8dmFyPmZvcmNlPC92YXI+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0aGUgVUkgd2lsbCBiZSBjaGFuZ2VkIHRvIGV4YWN0bHkgcmVmbGVjdAotICAgICAqIDx2YXI+Y29uZmlnPC92YXI+LCBvdGhlcndpc2UsIGlmIGEgcXVhbGlmaWVyIGlzIG5vdCBwcmVzZW50IGluIDx2YXI+Y29uZmlnPC92YXI+LAotICAgICAqIHRoZSBVSSBjb250cm9sIGlzIG5vdCBtb2RpZmllZC4gSG93ZXZlciBpZiB0aGUgdmFsdWUgaW4gdGhlIGNvbnRyb2wgaXMgbm90IHRoZSBkZWZhdWx0IHZhbHVlLAotICAgICAqIGEgd2FybmluZyBpY29uIGlzIHNob3duLgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufSB0byBzZXQuCi0gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgdGhlIFVJIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2VpdmVkIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBtRGlzYWJsZVVwZGF0ZXMgPSB0cnVlOyAvLyB3ZSBkbyBub3Qgd2FudCB0byB0cmlnZ2VyIG9uWFhYQ2hhbmdlIHdoZW4gc2V0dGluZyBuZXcgdmFsdWVzIGluIHRoZSB3aWRnZXRzLgotCi0gICAgICAgIC8vIFRPRE86IGZpbmQgYSBkZXZpY2UgdGhhdCBjYW4gZGlzcGxheSB0aGlzIHBhcnRpY3VsYXIgY29uZmlnIG9yIGNyZWF0ZSBhIGN1c3RvbSBvbmUgaWYgbmVlZGVkLgotCi0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdHJpbmcgc2hvd2luZyB0aGUgZm9sZGVyIG5hbWUKLSAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBjb25maWcudG9EaXNwbGF5U3RyaW5nKCk7Ci0gICAgICAgIG1DdXJyZW50TGF5b3V0TGFiZWwuc2V0VGV4dChjdXJyZW50ICE9IG51bGwgPyBjdXJyZW50IDogIihEZWZhdWx0KSIpOwotCi0gICAgICAgIG1EaXNhYmxlVXBkYXRlcyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbG9hZHMgdGhlIGxpc3Qgb2Yge0BsaW5rIExheW91dERldmljZX0gZnJvbSB0aGUge0BsaW5rIFNka30uCi0gICAgICogQHBhcmFtIG5vdGlmeUxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsb2FkRGV2aWNlcyhib29sZWFuIG5vdGlmeUxpc3RlbmVyKSB7Ci0gICAgICAgIGxvYWREZXZpY2VzKCk7Ci0gICAgICAgIGluaXRVaVdpdGhEZXZpY2VzKCk7Ci0gICAgICAgIG9uRGV2aWNlQ2hhbmdlKG5vdGlmeUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZERldmljZXMoKSB7Ci0gICAgICAgIG1EZXZpY2VzID0gbnVsbDsKLQotICAgICAgICBTZGsgc2RrID0gU2RrLmdldEN1cnJlbnQoKTsKLSAgICAgICAgaWYgKHNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMYXlvdXREZXZpY2VNYW5hZ2VyIG1hbmFnZXIgPSBzZGsuZ2V0TGF5b3V0RGV2aWNlTWFuYWdlcigpOwotICAgICAgICAgICAgbURldmljZXMgPSBtYW5hZ2VyLmdldENvbWJpbmVkTGlzdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdCB0aGUgVUkgd2l0aCB0aGUgbGlzdCBvZiBEZXZpY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0VWlXaXRoRGV2aWNlcygpIHsKLSAgICAgICAgLy8gcmVtb3ZlIG9sZGVyIGRldmljZXMgaWYgYXBwbGljYWJsZQotICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBbGwoKTsKLSAgICAgICAgbURldmljZUNvbmZpZ3MucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgLy8gZmlsbCB3aXRoIHRoZSBkZXZpY2VzCi0gICAgICAgIGlmIChtRGV2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExheW91dERldmljZSBkZXZpY2UgOiBtRGV2aWNlcykgewotICAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChkZXZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EZXZpY2VMaXN0LnNlbGVjdCgwKTsKLQotICAgICAgICAgICAgaWYgKG1EZXZpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBGb2xkZXJDb25maWd1cmF0aW9uPiBjb25maWdzID0gbURldmljZXMuZ2V0KDApLmdldENvbmZpZ3MoKTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBjb25maWdOYW1lcyA9IGNvbmZpZ3Mua2V5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNvbmZpZ05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDb25maWdzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURldmljZUNvbmZpZ3Muc2VsZWN0KDApOwotICAgICAgICAgICAgICAgIGlmIChjb25maWdOYW1lcy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQ29uZmlncy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhlIGN1c3RvbSBpdGVtCi0gICAgICAgIG1EZXZpY2VMaXN0LmFkZCgiQ3VzdG9tLi4uIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCBiYWNrIGZvciBsYW5ndWFnZSBjb21ibyBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25Mb2NhbGVDaGFuZ2UoKSB7Ci0gICAgICAgIC8vIGJlY2F1c2UgbUxhbmd1YWdlIHRyaWdnZXJzIG9uTGFuZ3VhZ2VDaGFuZ2UgYXQgZWFjaCBtb2RpZmljYXRpb24sIHRoZSBmaWxsaW5nCi0gICAgICAgIC8vIG9mIHRoZSBjb21ibyB3aXRoIGRhdGEgd2lsbCB0cmlnZ2VyIG5vdGlmaWNhdGlvbnMsIGFuZCB3ZSBkb24ndCB3YW50IHRoYXQuCi0gICAgICAgIGlmIChtRGlzYWJsZVVwZGF0ZXMgPT0gdHJ1ZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxvY2FsZUluZGV4ID0gbUxvY2FsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBSZXNvdXJjZVF1YWxpZmllcltdIGxvY2FsZVF1YWxpZmllcnMgPSBtTG9jYWxlTGlzdC5nZXQobG9jYWxlSW5kZXgpOwotCi0gICAgICAgIG1DdXJyZW50Q29uZmlnLnNldExhbmd1YWdlUXVhbGlmaWVyKChMYW5ndWFnZVF1YWxpZmllcilsb2NhbGVRdWFsaWZpZXJzWzBdKTsgLy8gbGFuZ3VhZ2UKLSAgICAgICAgbUN1cnJlbnRDb25maWcuc2V0UmVnaW9uUXVhbGlmaWVyKChSZWdpb25RdWFsaWZpZXIpbG9jYWxlUXVhbGlmaWVyc1sxXSk7IC8vIHJlZ2lvbgotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uRGV2aWNlQ2hhbmdlKGJvb2xlYW4gcmVjb21wdXRlTGF5b3V0KSB7Ci0KLSAgICAgICAgaW50IGRldmljZUluZGV4ID0gbURldmljZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKGRldmljZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdXNlciBpcyBhc2sgZm9yIHRoZSBjdXN0b20gaXRlbQotICAgICAgICAgICAgaWYgKGRldmljZUluZGV4ID09IG1EZXZpY2VMaXN0LmdldEl0ZW1Db3VudCgpIC0gMSkgewotICAgICAgICAgICAgICAgIENvbmZpZ01hbmFnZXJEaWFsb2cgZGlhbG9nID0gbmV3IENvbmZpZ01hbmFnZXJEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLm9wZW4oKTsKLQotICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHVzZXIgZGV2aWNlcwotICAgICAgICAgICAgICAgIFNkay5nZXRDdXJyZW50KCkuZ2V0TGF5b3V0RGV2aWNlTWFuYWdlcigpLnNhdmUoKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlbG9hZCB0aGUgY29tYm8gd2l0aCB0aGUgbmV3IGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgbG9hZERldmljZXMoKTsKLSAgICAgICAgICAgICAgICBpbml0VWlXaXRoRGV2aWNlcygpOwotCi0gICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjb21ibyB0byBzb21ldGhpbmcgKGhvcGVmdWxseSkgdmFsaWQuCi0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHByZXZpb3VzIHNlbGVjdGVkIGRldmljZQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1EZXZpY2VzLmluZGV4T2YobUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5zZWxlY3QoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhdCBsZWFzdCBoYXZlIG9uZSBidWlsdC1pbiBkZXZpY2UsIHNvIHdlIHNlbGVjdCBpdAotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5zZWxlY3QoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZm9yY2UgYSByZWRyYXcKLSAgICAgICAgICAgICAgICBvbkRldmljZUNoYW5nZSh0cnVlIC8qcmVjb21wdXRlTGF5b3V0Ki8pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ3VycmVudERldmljZSA9IG1EZXZpY2VzLmdldChkZXZpY2VJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudERldmljZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGV2aWNlQ29uZmlncy5yZW1vdmVBbGwoKTsKLQotICAgICAgICBpZiAobUN1cnJlbnREZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gY29uZmlnTmFtZXMgPSBtQ3VycmVudERldmljZS5nZXRDb25maWdzKCkua2V5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogY29uZmlnTmFtZXMpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlQ29uZmlncy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EZXZpY2VDb25maWdzLnNlbGVjdCgwKTsKLSAgICAgICAgICAgIG1EZXZpY2VDb25maWdzLnNldEVuYWJsZWQoY29uZmlnTmFtZXMuc2l6ZSgpID4gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlY29tcHV0ZUxheW91dCkgewotICAgICAgICAgICAgb25EZXZpY2VDb25maWdDaGFuZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkRldmljZUNvbmZpZ0NoYW5nZSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBjb25maWdJbmRleCA9IG1EZXZpY2VDb25maWdzLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1EZXZpY2VDb25maWdzLmdldEl0ZW0oY29uZmlnSW5kZXgpOwotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBtQ3VycmVudERldmljZS5nZXRDb25maWdzKCkuZ2V0KG5hbWUpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgcXVhbGlmaWVycyBmcm9tIHRoZSBjdXJyZW50IGNvbmZpZwotICAgICAgICAgICAgTGFuZ3VhZ2VRdWFsaWZpZXIgbGFuZyA9IG1DdXJyZW50Q29uZmlnLmdldExhbmd1YWdlUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICBSZWdpb25RdWFsaWZpZXIgcmVnaW9uID0gbUN1cnJlbnRDb25maWcuZ2V0UmVnaW9uUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICBWZXJzaW9uUXVhbGlmaWVyIHZlcnNpb24gPSBtQ3VycmVudENvbmZpZy5nZXRWZXJzaW9uUXVhbGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGNvbmZpZyB3aXRoIHRoZSBvbmUgZnJvbSB0aGUgZGV2aWNlCi0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5zZXQoY29uZmlnKTsKLQotICAgICAgICAgICAgLy8gYW5kIHB1dCBiYWNrIHRoZSByZXN0IG9mIHRoZSBxdWFsaWZpZXJzCi0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5hZGRRdWFsaWZpZXIobGFuZyk7Ci0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5hZGRRdWFsaWZpZXIocmVnaW9uKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLmFkZFF1YWxpZmllcih2ZXJzaW9uKTsKLQotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uVGhlbWVDaGFuZ2UoKSB7Ci0gICAgICAgIGludCB0aGVtZUluZGV4ID0gbVRoZW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKHRoZW1lSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aGVtZSA9IG1UaGVtZUNvbWJvLmdldEl0ZW0odGhlbWVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGVtZS5lcXVhbHMoVEhFTUVfU0VQQVJBVE9SKSkgewotICAgICAgICAgICAgICAgIG1UaGVtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGhlbWVDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIE9uQ2xpcHBpbmdDaGFuZ2UoKSB7Ci0gICAgICAgIG1DbGlwcGluZyA9IG1DbGlwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIuT25DbGlwcGluZ0NoYW5nZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiA8dmFyPnN0eWxlPC92YXI+IGlzIGEgdGhlbWUuCi0gICAgICogVGhpcyBpcyBkb25lIGJ5IG1ha2luZyBzdXJlIHRoZSBwYXJlbnQgaXMgYSB0aGVtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0eWxlIHRvIGNoZWNrCi0gICAgICogQHBhcmFtIHN0eWxlTWFwIHRoZSBtYXAgb2Ygc3R5bGVzIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LiBLZXkgaXMgdGhlIHN0eWxlIG5hbWUuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiA8dmFyPnN0eWxlPC92YXI+IGlzIGEgdGhlbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGhlbWUoSVJlc291cmNlVmFsdWUgdmFsdWUsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPiBzdHlsZU1hcCkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3R5bGVSZXNvdXJjZVZhbHVlKSB7Ci0gICAgICAgICAgICBJU3R5bGVSZXNvdXJjZVZhbHVlIHN0eWxlID0gKElTdHlsZVJlc291cmNlVmFsdWUpdmFsdWU7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZnJhbWV3b3JrU3R5bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRTdHlsZSA9IHN0eWxlLmdldFBhcmVudFN0eWxlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50U3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCBwYXJlbnQgc3R5bGUgd2UgbG9vayBhbiBpbXBsaWVkIG9uZS4KLSAgICAgICAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UgJ1RoZW1lLmxpZ2h0JyBpcyBpbXBsaWVkIGNoaWxkIHN0eWxlIG9mICdUaGVtZScsCi0gICAgICAgICAgICAgICAgLy8gYW5kICdUaGVtZS5saWdodC5mdWxsc2NyZWVuJyBpcyBpbXBsaWVkIGNoaWxkIHN0eWxlIG9mICdUaGVtZS5saWdodCcKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN0eWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSB1c2VsZXNzIEAgaWYgaXQncyB0aGVyZQotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTdHlsZS5zdGFydHNXaXRoKCJAIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGZyYW1ld29yayBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTdHlsZS5zdGFydHNXaXRoKCJhbmRyb2lkOiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1ld29ya1N0eWxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZS5zdWJzdHJpbmcoImFuZHJvaWQ6Ii5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBjb3VsZCBoYXZlIHRoZSBmb3JtYXQgc3R5bGUvPG5hbWU+LiB3ZSB3YW50IG9ubHkgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50U3R5bGUuc3RhcnRzV2l0aCgic3R5bGUvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZS5zdWJzdHJpbmcoInN0eWxlLyIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmVudFN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWV3b3JrU3R5bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBpcyBhIGZyYW1ld29yayBzdHlsZSwgaXQgaGFzIHRvIGJlICdUaGVtZScgb3IgJ1RoZW1lLionCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRTdHlsZS5lcXVhbHMoIlRoZW1lIikgfHwgcGFyZW50U3R5bGUuc3RhcnRzV2l0aCgiVGhlbWUuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhIHByb2plY3Qgc3R5bGUsIHdlIGNoZWNrIHRoaXMgaXMgYSB0aGVtZS4KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHlsZU1hcC5nZXQocGFyZW50U3R5bGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzVGhlbWUodmFsdWUsIHN0eWxlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9jb25maWd1cmF0aW9uL0xheW91dENyZWF0b3JEaWFsb2cuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9jb25maWd1cmF0aW9uL0xheW91dENyZWF0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiYjM2Ni4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvY29uZmlndXJhdGlvbi9MYXlvdXRDcmVhdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlJlc291cmNlUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZvbGRlclR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpLkNvbmZpZ3VyYXRpb25TZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuQ29uZmlndXJhdGlvblNlbGVjdG9yLkNvbmZpZ3VyYXRpb25TdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIudWkuR3JpZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaWFsb2cgdG8gY2hvb3NlIGEgbm9uIGV4aXN0aW5nIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExheW91dENyZWF0b3JEaWFsb2cgZXh0ZW5kcyBHcmlkRGlhbG9nIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvblNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtU3RhdHVzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0xhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0ltYWdlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBGb2xkZXJDb25maWd1cmF0aW9uIG1Db25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GaWxlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIElBbmRyb2lkVGFyZ2V0IG1UYXJnZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGlhbG9nLCBhbmQgaW5pdCB0aGUgVUkgZnJvbSBhIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCB7QGxpbmsgU2hlbGx9LgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIHN0YXJ0aW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIExheW91dENyZWF0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBmaWxlTmFtZSwgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0LAotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIDEsIGZhbHNlKTsKLQotICAgICAgICBtRmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLQotICAgICAgICAvLyBGSVhNRTogYWRkIHNvbWUgZGF0YSB0byBrbm93IHdoYXQgY29uZmlndXJhdGlvbnMgYWxyZWFkeSBleGlzdC4KLSAgICAgICAgbUNvbmZpZy5zZXQoY29uZmlnKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVEaWFsb2dDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQ29uZmlndXJhdGlvbiBmb3IgdGhlIGFsdGVybmF0ZSB2ZXJzaW9uIG9mICUxJHMiLCBtRmlsZU5hbWUpKTsKLQotICAgICAgICBtU2VsZWN0b3IgPSBuZXcgQ29uZmlndXJhdGlvblNlbGVjdG9yKHBhcmVudCwgZmFsc2UgLypkZXZpY2VNb2RlKi8pOwotICAgICAgICBtU2VsZWN0b3Iuc2V0Q29uZmlndXJhdGlvbihtQ29uZmlnKTsKLQotICAgICAgICAvLyBwYXJlbnQncyBsYXlvdXQgaXMgYSBHcmlkTGF5b3V0IGFzIHNwZWNpZmllZCBpbiB0aGUgamF2YWRvYy4KLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gQ29uZmlndXJhdGlvblNlbGVjdG9yLldJRFRIX0hJTlQ7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBDb25maWd1cmF0aW9uU2VsZWN0b3IuSEVJR0hUX0hJTlQ7Ci0gICAgICAgIG1TZWxlY3Rvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICAvLyBhZGQgYSBsaXN0ZW5lciB0byBjaGVjayBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIEZvbGRlckNvbmZpZ3VyYXRpb24gYXMKLSAgICAgICAgLy8gdGhleSBhcmUgYnVpbHQuCi0gICAgICAgIG1TZWxlY3Rvci5zZXRPbkNoYW5nZUxpc3RlbmVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uU3RhdGUgc3RhdGUgPSBtU2VsZWN0b3IuZ2V0U3RhdGUoKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5nZXRDb25maWd1cmF0aW9uKG1Db25maWcpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0ltYWdlLnNldEltYWdlKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlZBTElEX0NPTkZJRzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIGludmFsaWRRdWFsaWZpZXIgPSBtU2VsZWN0b3IuZ2V0SW52YWxpZFF1YWxpZmllcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0xhYmVsLnNldFRleHQoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQ29uZmlndXJhdGlvbjogJTEkcyBoYXMgbm8gZmlsdGVyIHNldC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUXVhbGlmaWVyLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0ltYWdlLnNldEltYWdlKEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigid2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUkVHSU9OX1dJVEhPVVRfTEFOR1VBR0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBSZWdpb24gcXVhbGlmaWVyIHJlcXVpcmVzIHRoZSBMYW5ndWFnZSBxdWFsaWZpZXIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzSW1hZ2Uuc2V0SW1hZ2UoSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKCJ3YXJuaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHJlbGF5b3V0LCBiZWNhdXNlIG9mIHRoZSBjaGFuZ2UgaW4gc2l6ZSBpbiBtRXJyb3JJbWFnZS4KLSAgICAgICAgICAgICAgICBtU3RhdHVzQ29tcG9zaXRlLmxheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtU3RhdHVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbVN0YXR1c0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbVN0YXR1c0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0KLSAgICAgICAgbVN0YXR1c0ltYWdlID0gbmV3IExhYmVsKG1TdGF0dXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbVN0YXR1c0xhYmVsID0gbmV3IExhYmVsKG1TdGF0dXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbVN0YXR1c0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICByZXNldFN0YXR1cygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldENvbmZpZ3VyYXRpb24oRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgY29uZmlnLnNldChtQ29uZmlnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXNldHMgdGhlIHN0YXR1cyBsYWJlbCB0byBzaG93IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1cygpIHsKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBEaWFsb2cuc2hvcnRlblRleHQoU3RyaW5nLmZvcm1hdCgiTmV3IEZpbGU6IHJlcy8lMSRzLyUyJHMiLAotICAgICAgICAgICAgICAgIG1Db25maWcuZ2V0Rm9sZGVyTmFtZShSZXNvdXJjZUZvbGRlclR5cGUuTEFZT1VULCBtVGFyZ2V0KSwgbUZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICBtU3RhdHVzTGFiZWwpOwotICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dChkaXNwbGF5U3RyaW5nKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvZGVzY3JpcHRvcnMvQ3VzdG9tVmlld0Rlc2NyaXB0b3JTZXJ2aWNlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvZGVzY3JpcHRvcnMvQ3VzdG9tVmlld0Rlc2NyaXB0b3JTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjVhYmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2Rlc2NyaXB0b3JzL0N1c3RvbVZpZXdEZXNjcmlwdG9yU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU2VydmljZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcvbWFuYWdpbmcge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBvYmplY3RzIGZvciBjdXN0b20KLSAqIFZpZXcgY2xhc3NlcyBwZXIgcHJvamVjdC4KLSAqIDxwLz4KLSAqIFRoZSBzZXJ2aWNlIHByb3ZpZGVzIGFuIG9uLWRlbWFuZCBtb25pdG9yaW5nIG9mIGN1c3RvbSBjbGFzc2VzIHRvIGNoZWNrIGZvciBjaGFuZ2VzLiBNb25pdG9yaW5nCi0gKiBzdGFydHMgb25jZSBhIHJlcXVlc3QgZm9yIGFuIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gb2JqZWN0IGhhcyBiZWVuIGRvbmUgZm9yIGEgc3BlY2lmaWMKLSAqIGNsYXNzLjxicj4KLSAqIFRoZSBtb25pdG9yaW5nIHdpbGwgbm90aWZ5IGEgbGlzdGVuIG9mIGFueSBjaGFuZ2VzIGluIHRoZSBjbGFzcyB0cmlnZ2VyaW5nIGEgY2hhbmdlIGluIGl0cwotICogYXNzb2NpYXRlZCB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IG9iamVjdC4KLSAqIDxwLz4KLSAqIElmIHRoZSBjdXN0b20gY2xhc3MgZG9lcyBub3QgZXhpc3QsIG5vIG1vbml0b3JpbmcgaXMgcHV0IGluIHBsYWNlIHRvIGF2b2lkIGhhdmluZyB0byBsaXN0ZW4KLSAqIHRvIGFsbCBjbGFzcyBjaGFuZ2VzIGluIHRoZSBwcm9qZWN0cy4gCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEN1c3RvbVZpZXdEZXNjcmlwdG9yU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDdXN0b21WaWV3RGVzY3JpcHRvclNlcnZpY2Ugc1RoaXMgPSBuZXcgQ3VzdG9tVmlld0Rlc2NyaXB0b3JTZXJ2aWNlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFwIHdoZXJlIGtleXMgYXJlIHRoZSBwcm9qZWN0LCBhbmQgdmFsdWVzIGFyZSBhbm90aGVyIG1hcCBjb250YWluaW5nIGFsbCB0aGUga25vd24KLSAgICAgKiBjdXN0b20gVmlldyBjbGFzcyBmb3IgdGhpcyBwcm9qZWN0LiBUaGUgY3VzdG9tIFZpZXcgY2xhc3MgYXJlIHN0b3JlZCBpbiBhIG1hcAotICAgICAqIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGVpciBhc3NvY2lhdGVkCi0gICAgICoge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8SVByb2plY3QsIEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50RGVzY3JpcHRvcj4+IG1DdXN0b21EZXNjcmlwdG9yTWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8SVByb2plY3QsIEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50RGVzY3JpcHRvcj4+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUT0RPIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgdGhlIEVsZW1lbnREZXNjcmlwdG9yIG9mIHRoZSBjdXN0b20gdmlldyB3aGVuIGl0Ci0gICAgICogaXMgbW9kaWZpZWQgKGVpdGhlciB0aGUgY2xhc3MgaXRzZWxmIG9yIGl0cyBhdHRyaWJ1dGVzLnhtbCkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIElDdXN0b21WaWV3RGVzY3JpcHRvckxpc3RlbmVyIG1MaXN0ZW5lcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IGRlYWwgd2l0aCBtb2RpZmljYXRpb25zCi0gICAgICogaW4gY3VzdG9tIFZpZXcgY2xhc3MgdHJpZ2dlcmluZyBhIGNoYW5nZSBpbiBpdHMgYXNzb2NpYXRlZCB7QGxpbmsgVmlld0NsYXNzSW5mb30gb2JqZWN0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElDdXN0b21WaWV3RGVzY3JpcHRvckxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhIGN1c3RvbSBWaWV3IGNsYXNzIGhhcyBjaGFuZ2VkIGFuZCBpdHMge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSB3YXMgbW9kaWZpZWQuCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGNsYXNzLgotICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLSAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIHVwZGF0ZWQgRWxlbWVudERlc2NyaXB0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVkQ2xhc3NJbmZvKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjbGFzc05hbWUsIEVsZW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2Yge0BsaW5rIEN1c3RvbVZpZXdEZXNjcmlwdG9yU2VydmljZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDdXN0b21WaWV3RGVzY3JpcHRvclNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGlzdGVuZXIgcmVjZWl2aW5nIGN1c3RvbSBWaWV3IGNsYXNzIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb25zLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9ucy4KLSAgICAgKgotICAgICAqIFRPRE8gd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgRWxlbWVudERlc2NyaXB0b3Igb2YgdGhlIGN1c3RvbSB2aWV3IHdoZW4gaXQKLSAgICAgKiBpcyBtb2RpZmllZCAoZWl0aGVyIHRoZSBjbGFzcyBpdHNlbGYgb3IgaXRzIGF0dHJpYnV0ZXMueG1sKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyKElDdXN0b21WaWV3RGVzY3JpcHRvckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGZvciBhIHBhcnRpY3VsYXIgcHJvamVjdC9jbGFzcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIDxjb2RlPkVsZW1lbnREZXNjcmlwdG9yPC9jb2RlPiBpcyByZXF1ZXN0ZWQsIHRoZSBtZXRob2QKLSAgICAgKiB3aWxsIGNoZWNrIHRoYXQgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBpbiBmYWN0IGEgY3VzdG9tIFZpZXcgY2xhc3MuIE9uY2UgdGhpcyBpcwotICAgICAqIGVzdGFibGlzaGVkLCBhIG1vbml0b3JpbmcgZm9yIHRoYXQgcGFydGljdWxhciBjbGFzcyBpcyBpbml0aWF0ZWQuIEFueSBjaGFuZ2Ugd2lsbAotICAgICAqIHRyaWdnZXIgYSBub3RpZmljYXRpb24gdG8gdGhlIHtAbGluayBJQ3VzdG9tVmlld0Rlc2NyaXB0b3JMaXN0ZW5lcn0uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgY2xhc3MuCi0gICAgICogQHBhcmFtIGZxQ2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICogQHJldHVybiBhIDxjb2RlPkVsZW1lbnREZXNjcmlwdG9yPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2xhc3Mgd2FzIG5vdAotICAgICAqIGEgY3VzdG9tIFZpZXcgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZxQ2xhc3NOYW1lKSB7Ci0gICAgICAgIC8vIGxvb2sgaW4gdGhlIG1hcCBmaXJzdAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21EZXNjcmlwdG9yTWFwKSB7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRWxlbWVudERlc2NyaXB0b3I+IG1hcCA9IG1DdXN0b21EZXNjcmlwdG9yTWFwLmdldChwcm9qZWN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1hcC5nZXQoZnFDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHdlIHN0ZXAgaGVyZSwgaXQgbG9va3MgbGlrZSB3ZSBoYXZlbid0IGNyZWF0ZWQgaXQgeWV0LgotICAgICAgICAgICAgLy8gRmlyc3QgbGV0cyBjaGVjayB0aGlzIGlzIGluIGZhY3QgYSB2YWxpZCB0eXBlIGluIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHRoZSBwcm9qZWN0IHRvIGJlIGJvdGggb3BlbmVkIGFuZCBvZiBqYXZhIHR5cGUgKHNpbmNlIGl0J3MgYW4gYW5kcm9pZAotICAgICAgICAgICAgICAgIC8vIHByb2plY3QpLCBzbyB3ZSBjYW4gY3JlYXRlIGEgSUphdmFQcm9qZWN0IG9iamVjdCBmcm9tIG91ciBJUHJvamVjdC4KLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSAkIGJ5IC4gaW4gdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IGZxQ2xhc3NOYW1lLnJlcGxhY2VBbGwoIlxcJCIsICJcXC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBJVHlwZSBvYmplY3QgZm9yIHRoaXMgY2xhc3MKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0eXBlIGV4aXN0cy4gTGV0J3MgZ2V0IHRoZSBwYXJlbnQgY2xhc3MgYW5kIGl0cyBWaWV3Q2xhc3NJbmZvLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIGhpZXJhcmNoeQotICAgICAgICAgICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHBhcmVudERlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRTdXBlcmNsYXNzKHR5cGUpLCBwcm9qZWN0LCBoaWVyYXJjaHkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudERlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHZhbGlkIHBhcmVudCwgbGV0cyBjcmVhdGUgYSBuZXcgRWxlbWVudERlc2NyaXB0b3IuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFZpZXdFbGVtZW50RGVzY3JpcHRvcihmcUNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnFDbGFzc05hbWUsIC8vIHVpX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnFDbGFzc05hbWUsIC8vIGNhbm9uaWNhbCBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIHRvb2x0aXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gc2RrX3VybAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVEZXNjcmlwdG9yKHR5cGUsIHBhcmVudERlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBsYXlvdXQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21EZXNjcmlwdG9yTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbUN1c3RvbURlc2NyaXB0b3JNYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tRGVzY3JpcHRvck1hcC5wdXQocHJvamVjdCwgbWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGZxQ2xhc3NOYW1lLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHNldHVwIGxpc3RlbmVyIG9uIHRoaXMgcmVzb3VyY2UgY2hhbmdlLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIGFuIGVycm9yIGFjY2Vzc2luZyBhbnkgb2YgdGhlIElUeXBlLCB3ZSdsbCBqdXN0IHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgKGlmIG5lZWRlZCkgYW5kIHJldHVybnMgdGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCAKLSAgICAgKiBAcGFyYW0gdHlwZUhpZXJhcmNoeQotICAgICAqIEByZXR1cm4gQSBWaWV3RWxlbWVudERlc2NyaXB0b3Igb3IgbnVsbCBpZiB0eXBlIG9yIHR5cGVIaWVyYXJjaHkgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZpZXdFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKElUeXBlIHR5cGUsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0eXBlIGlzIGEgYnVpbHQtaW4gVmlldyBjbGFzcy4KLSAgICAgICAgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gYnVpbHRJbkxpc3QgPSBudWxsOwotCi0gICAgICAgIFNkayBjdXJyZW50U2RrID0gU2RrLmdldEN1cnJlbnQoKTsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gY3VycmVudFNkayA9PSBudWxsID8gbnVsbCA6IGN1cnJlbnRTZGsuZ2V0VGFyZ2V0KHByb2plY3QpOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBjdXJyZW50U2RrLmdldFRhcmdldERhdGEodGFyZ2V0KTsKLSAgICAgICAgICAgIGJ1aWx0SW5MaXN0ID0gZGF0YS5nZXRMYXlvdXREZXNjcmlwdG9ycygpLmdldFZpZXdEZXNjcmlwdG9ycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2l2ZSB1cCBpZiB0aGVyZSdzIG5vIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY2Fub25pY2FsTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYnVpbHRJbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBkZXNjIDogYnVpbHRJbkxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIFZpZXdFbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICBWaWV3RWxlbWVudERlc2NyaXB0b3Igdmlld0Rlc2NyaXB0b3IgPSAoVmlld0VsZW1lbnREZXNjcmlwdG9yKWRlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5vbmljYWxOYW1lLmVxdWFscyh2aWV3RGVzY3JpcHRvci5nZXRDYW5vbmljYWxDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3RGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gaXQncyBub3QgYSBidWlsdC1pbiBjbGFzcz8gTGV0cyBsb29rIGlmIHRoZSBzdXBlcmNsYXNzIGlzIGJ1aWx0LWluCi0gICAgICAgIC8vIGdpdmUgdXAgaWYgdGhlcmUncyBubyB0eXBlCi0gICAgICAgIGlmICh0eXBlSGllcmFyY2h5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSVR5cGUgcGFyZW50VHlwZSA9IHR5cGVIaWVyYXJjaHkuZ2V0U3VwZXJjbGFzcyh0eXBlKTsKLSAgICAgICAgaWYgKHBhcmVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgVmlld0VsZW1lbnREZXNjcmlwdG9yIHBhcmVudERlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHBhcmVudFR5cGUsIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVIaWVyYXJjaHkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGFyZW50RGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFyZW50IGNsYXNzIGlzIGEgdmFsaWQgVmlldyBjbGFzcyB3aXRoIGEgZGVzY3JpcHRvciwgc28gd2UgY3JlYXRlIG9uZQotICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgIFZpZXdFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFZpZXdFbGVtZW50RGVzY3JpcHRvcihjYW5vbmljYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsTmFtZSwgLy8gdWlfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsTmFtZSwgLy8gY2Fub25pY2FsIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIHRvb2x0aXAKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIHNka191cmwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZURlc2NyaXB0b3IodHlwZSwgcGFyZW50RGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBsYXlvdXQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG1hbmRhdG9yeSAqLyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBtYXAKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21EZXNjcmlwdG9yTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50RGVzY3JpcHRvcj4gbWFwID0gbUN1c3RvbURlc2NyaXB0b3JNYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUN1c3RvbURlc2NyaXB0b3JNYXAucHV0KHByb2plY3QsIG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoY2Fub25pY2FsTmFtZSwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vVE9ETyBzZXR1cCBsaXN0ZW5lciBvbiB0aGlzIHJlc291cmNlIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2xhc3MgaXMgbmVpdGhlciBhIGJ1aWx0LWluIHZpZXcgY2xhc3MsIG5vciBleHRlbmQgb25lLiByZXR1cm4gbnVsbC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgSVR5cGV9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgYXJyYXkgc2hvdWxkIGNvbnRhaW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgdHlwZSBhbmQgYWxsIGl0cyBzdXBlcnR5cGVzLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGZvciB3aGljaCB0aGUge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9IGFyZSByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gcGFyZW50RGVzY3JpcHRvciB0aGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBvZiB0aGUgZGlyZWN0IHN1cGVyY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gZ2V0QXR0cmlidXRlRGVzY3JpcHRvcihJVHlwZSB0eXBlLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgcGFyZW50RGVzY3JpcHRvcikgewotICAgICAgICAvLyBUT0RPIGFkZCB0aGUgY2xhc3MgYXR0cmlidXRlIGRlc2NyaXB0b3JzIHRvIHRoZSBwYXJlbnQgZGVzY3JpcHRvcnMuCi0gICAgICAgIHJldHVybiBwYXJlbnREZXNjcmlwdG9yLmdldEF0dHJpYnV0ZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvZGVzY3JpcHRvcnMvTGF5b3V0RGVzY3JpcHRvcnMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9kZXNjcmlwdG9ycy9MYXlvdXREZXNjcmlwdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU1NTg3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9kZXNjcmlwdG9ycy9MYXlvdXREZXNjcmlwdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRvY3VtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5JRGVzY3JpcHRvclByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5EZWNsYXJlU3R5bGVhYmxlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5EZWNsYXJlU3R5bGVhYmxlSW5mby5BdHRyaWJ1dGVJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuVmlld0NsYXNzSW5mby5MYXlvdXRQYXJhbXNJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIENvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXlvdXQgc3RydWN0dXJlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGF5b3V0RGVzY3JpcHRvcnMgaW1wbGVtZW50cyBJRGVzY3JpcHRvclByb3ZpZGVyIHsKLQotICAgIC8vIFB1YmxpYyBhdHRyaWJ1dGVzIG5hbWVzLCBhdHRyaWJ1dGVzIGRlc2NyaXB0b3JzIGFuZCBlbGVtZW50cyBkZXNjcmlwdG9ycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFIgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogVGhlIGRvY3VtZW50IGRlc2NyaXB0b3IuIENvbnRhaW5zIGFsbCBsYXlvdXRzIGFuZCB2aWV3cyBsaW5rZWQgdG9nZXRoZXIuICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudERlc2NyaXB0b3IgbVJvb3REZXNjcmlwdG9yID0KLSAgICAgICAgbmV3IERvY3VtZW50RGVzY3JpcHRvcigibGF5b3V0X2RvYyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogVGhlIGxpc3Qgb2YgYWxsIGtub3duIFZpZXdMYXlvdXQgZGVzY3JpcHRvcnMuICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG1MYXlvdXREZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+KCk7Ci0KLSAgICAvKiogUmVhZC1Pbmx5IGxpc3Qgb2YgVmlldyBEZXNjcmlwdG9ycy4gKi8KLSAgICBwcml2YXRlIExpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG1ST0xheW91dERlc2NyaXB0b3JzOwotCi0gICAgLyoqIFRoZSBsaXN0IG9mIGFsbCBrbm93biBWaWV3IChub3QgVmlld0xheW91dCkgZGVzY3JpcHRvcnMuICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG1WaWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgIAotICAgIC8qKiBSZWFkLU9ubHkgbGlzdCBvZiBWaWV3IERlc2NyaXB0b3JzLiAqLwotICAgIHByaXZhdGUgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gbVJPVmlld0Rlc2NyaXB0b3JzOwotICAgIAotICAgIC8qKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBkZXNjcmlwdG9yLiBDb250YWlucyBhbGwgbGF5b3V0cyBhbmQgdmlld3MgbGlua2VkIHRvZ2V0aGVyLiAqLwotICAgIHB1YmxpYyBEb2N1bWVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1Sb290RGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEByZXR1cm4gVGhlIHJlYWQtb25seSBsaXN0IG9mIGFsbCBrbm93biBWaWV3TGF5b3V0IGRlc2NyaXB0b3JzLiAqLwotICAgIHB1YmxpYyBMaXN0PEVsZW1lbnREZXNjcmlwdG9yPiBnZXRMYXlvdXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1ST0xheW91dERlc2NyaXB0b3JzOwotICAgIH0KLSAgICAKLSAgICAvKiogQHJldHVybiBUaGUgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIGtub3duIFZpZXcgKG5vdCBWaWV3TGF5b3V0KSBkZXNjcmlwdG9ycy4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gZ2V0Vmlld0Rlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gbVJPVmlld0Rlc2NyaXB0b3JzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3JbXSBnZXRSb290RWxlbWVudERlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gbVJvb3REZXNjcmlwdG9yLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZG9jdW1lbnQgZGVzY3JpcHRvci4KLSAgICAgKiA8cC8+Ci0gICAgICogSXQgZmlyc3QgY29tcHV0ZXMgdGhlIG5ldyBjaGlsZHJlbiBvZiB0aGUgZGVzY3JpcHRvciBhbmQgdGhlbiB1cGRhdGUgdGhlbQotICAgICAqIGFsbCBhdCBvbmNlLgotICAgICAqIDxwLz4gCi0gICAgICogIFRPRE86IGRpZmZlcmVudGlhdGUgZ3JvdXBzIGZyb20gdmlld3MgaW4gdGhlIHRyZWUgVUk/ID0+IHJlbHkgb24gaWNvbnMKLSAgICAgKiA8cC8+IAotICAgICAqIAotICAgICAqIEBwYXJhbSB2aWV3cyBUaGUgbGlzdCBvZiB2aWV3cyBpbiB0aGUgZnJhbWV3b3JrLgotICAgICAqIEBwYXJhbSBsYXlvdXRzIFRoZSBsaXN0IG9mIGxheW91dHMgaW4gdGhlIGZyYW1ld29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlRGVzY3JpcHRvcnMoVmlld0NsYXNzSW5mb1tdIHZpZXdzLCBWaWV3Q2xhc3NJbmZvW10gbGF5b3V0cykgewotICAgICAgICBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG5ld1ZpZXdzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4oKTsKLSAgICAgICAgaWYgKHZpZXdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoVmlld0NsYXNzSW5mbyBpbmZvIDogdmlld3MpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gY29udmVydFZpZXcoaW5mbyk7Ci0gICAgICAgICAgICAgICAgbmV3Vmlld3MuYWRkKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIDxpbmNsdWRlPiBhcyBhIHN5bnRoZXRpYyByZWd1bGFyIHZpZXcuCi0gICAgICAgIC8vIE5vdGU6IFZpZXdTdHViIGlzIGFscmVhZHkgZGVzY3JpYmVkIGJ5IGF0dHJzLnhtbAotICAgICAgICBpbnNlcnRJbmNsdWRlKG5ld1ZpZXdzKTsKLQotICAgICAgICBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG5ld0xheW91dHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBpZiAobGF5b3V0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFZpZXdDbGFzc0luZm8gaW5mbyA6IGxheW91dHMpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gY29udmVydFZpZXcoaW5mbyk7Ci0gICAgICAgICAgICAgICAgbmV3TGF5b3V0cy5hZGQoZGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG5ld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4oKTsKLSAgICAgICAgbmV3RGVzY3JpcHRvcnMuYWRkQWxsKG5ld0xheW91dHMpOwotICAgICAgICBuZXdEZXNjcmlwdG9ycy5hZGRBbGwobmV3Vmlld3MpOwotCi0gICAgICAgIC8vIExpbmsgYWxsIGxheW91dHMgdG8gZXZlcnl0aGluZyBlbHNlIGhlcmUuLiByZWN1cnNpdmVseQotICAgICAgICBmb3IgKEVsZW1lbnREZXNjcmlwdG9yIGxheW91dERlc2MgOiBuZXdMYXlvdXRzKSB7Ci0gICAgICAgICAgICBsYXlvdXREZXNjLnNldENoaWxkcmVuKG5ld0Rlc2NyaXB0b3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSA8bWVyZ2U+IHRhZyBjYW4gb25seSBiZSBhIHJvb3QgdGFnLCBzbyBpdCBpcyBhZGRlZCBhdCB0aGUgZW5kLgotICAgICAgICAvLyBJdCBnZXRzIGV2ZXJ5dGhpbmcgZWxzZSBhcyBjaGlsZHJlbiBidXQgaXQgaXMgbm90IG1hZGUgYSBjaGlsZCBpdHNlbGYuCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIG1lcmdlVGFnID0gY3JlYXRlTWVyZ2UobmV3TGF5b3V0cyk7Ci0gICAgICAgIG1lcmdlVGFnLnNldENoaWxkcmVuKG5ld0Rlc2NyaXB0b3JzKTsgIC8vIG1lcmdlVGFnIG1ha2VzIGEgY29weSBvZiB0aGUgbGlzdAotICAgICAgICBuZXdEZXNjcmlwdG9ycy5hZGQobWVyZ2VUYWcpOwotICAgICAgICBuZXdMYXlvdXRzLmFkZChtZXJnZVRhZyk7Ci0KLSAgICAgICAgbVZpZXdEZXNjcmlwdG9ycyA9IG5ld1ZpZXdzOwotICAgICAgICBtTGF5b3V0RGVzY3JpcHRvcnMgID0gbmV3TGF5b3V0czsKLSAgICAgICAgbVJvb3REZXNjcmlwdG9yLnNldENoaWxkcmVuKG5ld0Rlc2NyaXB0b3JzKTsKLSAgICAgICAgCi0gICAgICAgIG1ST0xheW91dERlc2NyaXB0b3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtTGF5b3V0RGVzY3JpcHRvcnMpOwotICAgICAgICBtUk9WaWV3RGVzY3JpcHRvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1WaWV3RGVzY3JpcHRvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCBkZXNjcmlwdG9yIGZyb20gYSBnaXZlbiB7QGxpbmsgVmlld0NsYXNzSW5mb30uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciBjb252ZXJ0VmlldyhWaWV3Q2xhc3NJbmZvIGluZm8pIHsKLSAgICAgICAgU3RyaW5nIHhtbF9uYW1lID0gaW5mby5nZXRTaG9ydENsYXNzTmFtZSgpOwotICAgICAgICBTdHJpbmcgdG9vbHRpcCA9IGluZm8uZ2V0SmF2YURvYygpOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0PEF0dHJpYnV0ZURlc2NyaXB0b3I+IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGwgdmlld3MgYW5kIGdyb3VwcyBoYXZlIGFuIGltcGxpY2l0ICJzdHlsZSIgYXR0cmlidXRlIHdoaWNoIGlzIGEgcmVmZXJlbmNlLgotICAgICAgICBBdHRyaWJ1dGVJbmZvIHN0eWxlSW5mbyA9IG5ldyBEZWNsYXJlU3R5bGVhYmxlSW5mby5BdHRyaWJ1dGVJbmZvKAotICAgICAgICAgICAgICAgICJzdHlsZSIsICAgIC8vJE5PTi1OTFMtMSQgeG1sTG9jYWxOYW1lCi0gICAgICAgICAgICAgICAgbmV3IERlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm8uRm9ybWF0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyZVN0eWxlYWJsZUluZm8uQXR0cmlidXRlSW5mby5Gb3JtYXQuUkVGRVJFTkNFCi0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBzdHlsZUluZm8uc2V0SmF2YURvYygiQSByZWZlcmVuY2UgdG8gYSBjdXN0b20gc3R5bGUiKTsgLy90b29sdGlwCi0gICAgICAgIERlc2NyaXB0b3JzVXRpbHMuYXBwZW5kQXR0cmlidXRlKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgInN0eWxlIiwgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG51bGwsICAgICAgIC8vbnNVcmkKLSAgICAgICAgICAgICAgICBzdHlsZUluZm8sCi0gICAgICAgICAgICAgICAgZmFsc2UsICAgICAgLy9yZXF1aXJlZAotICAgICAgICAgICAgICAgIG51bGwpOyAgICAgIC8vIG92ZXJyaWRlcwotICAgICAgICAKLSAgICAgICAgLy8gUHJvY2VzcyBhbGwgVmlldyBhdHRyaWJ1dGVzCi0gICAgICAgIERlc2NyaXB0b3JzVXRpbHMuYXBwZW5kQXR0cmlidXRlcyhhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICBpbmZvLmdldEF0dHJpYnV0ZXMoKSwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyByZXF1aXJlZEF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBudWxsIC8qIG92ZXJyaWRlcyAqLyk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKFZpZXdDbGFzc0luZm8gbGluayA9IGluZm8uZ2V0U3VwZXJDbGFzcygpOwotICAgICAgICAgICAgICAgIGxpbmsgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBsaW5rID0gbGluay5nZXRTdXBlckNsYXNzKCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZUluZm9bXSBhdHRyTGlzdCA9IGxpbmsuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKGF0dHJMaXN0Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkF0dHJpYnV0ZXMgZnJvbSAlMSRzIiwgbGluay5nZXRTaG9ydENsYXNzTmFtZSgpKSkpOyAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yc1V0aWxzLmFwcGVuZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyByZXF1aXJlZEF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogb3ZlcnJpZGVzICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgYWxsIExheW91dFBhcmFtcyBhdHRyaWJ1dGVzCi0gICAgICAgIEFycmF5TGlzdDxBdHRyaWJ1dGVEZXNjcmlwdG9yPiBsYXlvdXRBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGVEZXNjcmlwdG9yPigpOwotICAgICAgICBMYXlvdXRQYXJhbXNJbmZvIGxheW91dFBhcmFtcyA9IGluZm8uZ2V0TGF5b3V0RGF0YSgpOwotCi0gICAgICAgIGZvcig7IGxheW91dFBhcmFtcyAhPSBudWxsOyBsYXlvdXRQYXJhbXMgPSBsYXlvdXRQYXJhbXMuZ2V0U3VwZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBib29sZWFuIG5lZWRfc2VwYXJhdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoQXR0cmlidXRlSW5mbyBhdHRyX2luZm8gOiBsYXlvdXRQYXJhbXMuZ2V0QXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3JzVXRpbHMuY29udGFpbnNBdHRyaWJ1dGUobGF5b3V0QXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsIGF0dHJfaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZWVkX3NlcGFyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRQYXJhbXMuZ2V0U2hvcnRDbGFzc05hbWUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DTEFTU19OQU1FX0xBWU9VVFBBUkFNUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gU3RyaW5nLmZvcm1hdCgiTGF5b3V0IEF0dHJpYnV0ZXMgZnJvbSAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFBhcmFtcy5nZXRWaWV3TGF5b3V0Q2xhc3MoKS5nZXRTaG9ydENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gU3RyaW5nLmZvcm1hdCgiTGF5b3V0IEF0dHJpYnV0ZXMgZnJvbSAlMSRzICglMiRzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFBhcmFtcy5nZXRWaWV3TGF5b3V0Q2xhc3MoKS5nZXRTaG9ydENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRQYXJhbXMuZ2V0U2hvcnRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0QXR0cmlidXRlcy5hZGQobmV3IFNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3IodGl0bGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbmVlZF9zZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGUobGF5b3V0QXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG92ZXJyaWRlcyAqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFZpZXdFbGVtZW50RGVzY3JpcHRvcih4bWxfbmFtZSwKLSAgICAgICAgICAgICAgICB4bWxfbmFtZSwgLy8gdWlfbmFtZQotICAgICAgICAgICAgICAgIGluZm8uZ2V0Q2Fub25pY2FsQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgdG9vbHRpcCwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzZGtfdXJsCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy50b0FycmF5KG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW2F0dHJpYnV0ZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgbGF5b3V0QXR0cmlidXRlcy50b0FycmF5KG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW2xheW91dEF0dHJpYnV0ZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gY2hpbGRyZW4KLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGluY2x1ZGU+IGRlc2NyaXB0b3IgYW5kIGFkZHMgaXQgdG8gdGhlIGxpc3Qgb2YgdmlldyBkZXNjcmlwdG9ycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga25vd25WaWV3cyBBIGxpc3Qgb2YgdmlldyBkZXNjcmlwdG9ycyBiZWluZyBwb3B1bGF0ZWQuIEFsc28gdXNlZCB0byBmaW5kIHRoZQotICAgICAqICAgVmlldyBkZXNjcmlwdG9yIGFuZCBleHRyYWN0IGl0cyBsYXlvdXQgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0SW5jbHVkZShBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IGtub3duVmlld3MpIHsKLSAgICAgICAgU3RyaW5nIHhtbF9uYW1lID0gImluY2x1ZGUiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5jbHVkZSBjdXN0b20gYXR0cmlidXRlcwotICAgICAgICBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgImxheW91dCIgYXR0cmlidXRlIGRvZXMgTk9UIGhhdmUgdGhlIEFuZHJvaWQgbmFtZXNwYWNlCi0gICAgICAgIERlc2NyaXB0b3JzVXRpbHMuYXBwZW5kQXR0cmlidXRlKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgbnVsbCwgLy9lbGVtZW50WG1sTmFtZQotICAgICAgICAgICAgICAgIG51bGwsIC8vbnNVcmkKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQiLCAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSW5mby5Gb3JtYXRbXSB7IEF0dHJpYnV0ZUluZm8uRm9ybWF0LlJFRkVSRU5DRSB9Ci0gICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgICAgIHRydWUsICAvL3JlcXVpcmVkCi0gICAgICAgICAgICAgICAgbnVsbCk7IC8vb3ZlcnJpZGVzCi0KLSAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBudWxsLCAvL2VsZW1lbnRYbWxOYW1lCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgLy9uc1VyaQotICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVJbmZvLkZvcm1hdFtdIHsgQXR0cmlidXRlSW5mby5Gb3JtYXQuUkVGRVJFTkNFIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8vcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBudWxsKTsgLy9vdmVycmlkZXMKLQotICAgICAgICAvLyBGaW5kIFZpZXcgYW5kIGluaGVyaXQgYWxsIGl0cyBsYXlvdXQgYXR0cmlidXRlcwotICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gdmlld0xheW91dEF0dHJpYnMgPSBmaW5kVmlld0xheW91dEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DTEFTU19WSUVXLCBrbm93blZpZXdzKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGluY2x1ZGUgZGVzY3JpcHRvcgotICAgICAgICBWaWV3RWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG5ldyBWaWV3RWxlbWVudERlc2NyaXB0b3IoeG1sX25hbWUsICAvLyB4bWxfbmFtZQotICAgICAgICAgICAgICAgIHhtbF9uYW1lLCAvLyB1aV9uYW1lCi0gICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIGNhbm9uaWNhbCBjbGFzcyBuYW1lLCB3ZSBkb24ndCBoYXZlIG9uZQotICAgICAgICAgICAgICAgICJMZXRzIHlvdSBzdGF0aWNhbGx5IGluY2x1ZGUgWE1MIGxheW91dHMgaW5zaWRlIG90aGVyIFhNTCBsYXlvdXRzLiIsICAvLyB0b29sdGlwCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gc2RrX3VybAotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudG9BcnJheShuZXcgQXR0cmlidXRlRGVzY3JpcHRvclthdHRyaWJ1dGVzLnNpemUoKV0pLAotICAgICAgICAgICAgICAgIHZpZXdMYXlvdXRBdHRyaWJzLCAgLy8gbGF5b3V0IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBjaGlsZHJlbgotICAgICAgICAgICAgICAgIGZhbHNlIC8qIG1hbmRhdG9yeSAqLyk7Ci0gICAgICAgIAotICAgICAgICBrbm93blZpZXdzLmFkZChkZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm4gYSBuZXcgPG1lcmdlPiBkZXNjcmlwdG9yLgotICAgICAqIEBwYXJhbSBrbm93bkxheW91dHMgIEEgbGlzdCBvZiBhbGwga25vd24gbGF5b3V0IHZpZXcgZGVzY3JpcHRvcnMsIHVzZWQgdG8gZmluZCB0aGUKLSAgICAgKiAgIEZyYW1lTGF5b3V0IGRlc2NyaXB0b3IgYW5kIGV4dHJhY3QgaXRzIGxheW91dCBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgY3JlYXRlTWVyZ2UoQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPiBrbm93bkxheW91dHMpIHsKLSAgICAgICAgU3RyaW5nIHhtbF9uYW1lID0gIm1lcmdlIjsgIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBGaW5kIFZpZXcgYW5kIGluaGVyaXQgYWxsIGl0cyBsYXlvdXQgYXR0cmlidXRlcwotICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gdmlld0xheW91dEF0dHJpYnMgPSBmaW5kVmlld0xheW91dEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DTEFTU19GUkFNRUxBWU9VVCwga25vd25MYXlvdXRzKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGluY2x1ZGUgZGVzY3JpcHRvcgotICAgICAgICBWaWV3RWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG5ldyBWaWV3RWxlbWVudERlc2NyaXB0b3IoeG1sX25hbWUsICAvLyB4bWxfbmFtZQotICAgICAgICAgICAgICAgIHhtbF9uYW1lLCAvLyB1aV9uYW1lCi0gICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIGNhbm9uaWNhbCBjbGFzcyBuYW1lLCB3ZSBkb24ndCBoYXZlIG9uZQotICAgICAgICAgICAgICAgICJBIHJvb3QgdGFnIHVzZWZ1bCBmb3IgWE1MIGxheW91dHMgaW5mbGF0ZWQgdXNpbmcgYSBWaWV3U3R1Yi4iLCAgLy8gdG9vbHRpcAotICAgICAgICAgICAgICAgIG51bGwsICAvLyBzZGtfdXJsCi0gICAgICAgICAgICAgICAgbnVsbCwgIC8vIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICB2aWV3TGF5b3V0QXR0cmlicywgIC8vIGxheW91dCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgbnVsbCwgIC8vIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgZmFsc2UgIC8qIG1hbmRhdG9yeSAqLyk7Ci0KLSAgICAgICAgcmV0dXJuIGRlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGRlc2NyaXB0b3IgYW5kIHJldHJpZXZlcyBhbGwgaXRzIGxheW91dCBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlRGVzY3JpcHRvcltdIGZpbmRWaWV3TGF5b3V0QXR0cmlidXRlcygKLSAgICAgICAgICAgIFN0cmluZyB2aWV3RnFjbiwKLSAgICAgICAgICAgIEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4ga25vd25WaWV3cykgewotCi0gICAgICAgIGZvciAoRWxlbWVudERlc2NyaXB0b3IgZGVzYyA6IGtub3duVmlld3MpIHsKLSAgICAgICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgVmlld0VsZW1lbnREZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgVmlld0VsZW1lbnREZXNjcmlwdG9yIHZpZXdEZXNjID0gKFZpZXdFbGVtZW50RGVzY3JpcHRvcikgZGVzYzsKLSAgICAgICAgICAgICAgICBpZiAodmlld0ZxY24uZXF1YWxzKHZpZXdEZXNjLmdldENhbm9uaWNhbENsYXNzTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlld0Rlc2MuZ2V0TGF5b3V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2Rlc2NyaXB0b3JzL1ZpZXdFbGVtZW50RGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L2Rlc2NyaXB0b3JzL1ZpZXdFbGVtZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU5MjMxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9kZXNjcmlwdG9ycy9WaWV3RWxlbWVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnVpbW9kZWwuVWlWaWV3RWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi0vKioKLSAqIHtAbGluayBWaWV3RWxlbWVudERlc2NyaXB0b3J9IGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBleHBlY3RlZCBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBub2RlCi0gKiByZXByZXNlbnRpbmcgYSBjbGFzcyBpbiBhbiBYTUwgTGF5b3V0IGZpbGUuCi0gKiAKLSAqIEBzZWUgRWxlbWVudERlc2NyaXB0b3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdFbGVtZW50RGVzY3JpcHRvciBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9yIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBtQ2Fub25pY2FsQ2xhc3NOYW1lOwotCi0gICAgLyoqIFRoZSBsaXN0IG9mIGxheW91dCBhdHRyaWJ1dGVzLiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLiAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlRGVzY3JpcHRvcltdIG1MYXlvdXRBdHRyaWJ1dGVzOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVmlld0VsZW1lbnREZXNjcmlwdG9yfSBiYXNlZCBvbiBpdHMgWE1MIG5hbWUsIFVJIG5hbWUsCi0gICAgICogdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBjbGFzcyBpdCByZXByZXNlbnRzLCBpdHMgdG9vbHRpcCwgaXRzIFNESyB1cmwsIGl0cyBhdHRyaWJ1dGVzIGxpc3QsCi0gICAgICogaXRzIGNoaWxkcmVuIGxpc3QgYW5kIGl0cyBtYW5kYXRvcnkgZmxhZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geG1sX25hbWUgVGhlIFhNTCBlbGVtZW50IG5vZGUgbmFtZS4gQ2FzZSBzZW5zaXRpdmUuCi0gICAgICogQHBhcmFtIHVpX25hbWUgVGhlIFhNTCBlbGVtZW50IG5hbWUgZm9yIHRoZSB1c2VyIGludGVyZmFjZSwgdHlwaWNhbGx5IGNhcGl0YWxpemVkLgotICAgICAqIEBwYXJhbSBjYW5vbmljYWxDbGFzc05hbWUgVGhlIGNhbm9uaWNhbCBjbGFzcyBuYW1lIHRoZSB7QGxpbmsgVmlld0VsZW1lbnREZXNjcmlwdG9yfSBpcwotICAgICAqIHJlcHJlc2VudGluZy4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gc2RrX3VybCBBbiBvcHRpb25hbCBTS0QgVVJMLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgbGlzdCBvZiBhbGxvd2VkIGF0dHJpYnV0ZXMuIENhbiBiZSBudWxsIG9yIGVtcHR5LgotICAgICAqIEBwYXJhbSBsYXlvdXRBdHRyaWJ1dGVzIFRoZSBsaXN0IG9mIGxheW91dCBhdHRyaWJ1dGVzLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGxpc3Qgb2YgYWxsb3dlZCBjaGlsZHJlbi4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIG1hbmRhdG9yeSBXaGV0aGVyIHRoaXMgbm9kZSBtdXN0IGFsd2F5cyBleGlzdCAoZXZlbiBmb3IgZW1wdHkgbW9kZWxzKS4gQSBtYW5kYXRvcnkKLSAgICAgKiAgVUkgbm9kZSBpcyBuZXZlciBkZWxldGVkIGFuZCBpdCBtYXkgbGFjayBhbiBhY3R1YWwgWE1MIG5vZGUgYXR0YWNoZWQuIEEgbm9uLW1hbmRhdG9yeQotICAgICAqICBVSSBub2RlIE1VU1QgaGF2ZSBhbiBYTUwgbm9kZSBhdHRhY2hlZCBhbmQgaXQgd2lsbCBjZWFzZSB0byBleGlzdCB3aGVuIHRoZSBYTUwgbm9kZQotICAgICAqICBjZWFzZXMgdG8gZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIFZpZXdFbGVtZW50RGVzY3JpcHRvcihTdHJpbmcgeG1sX25hbWUsIFN0cmluZyB1aV9uYW1lLAotICAgICAgICAgICAgU3RyaW5nIGNhbm9uaWNhbENsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgc2RrX3VybCwKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3JbXSBhdHRyaWJ1dGVzLCBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gbGF5b3V0QXR0cmlidXRlcywKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gY2hpbGRyZW4sIGJvb2xlYW4gbWFuZGF0b3J5KSB7Ci0gICAgICAgIHN1cGVyKHhtbF9uYW1lLCB1aV9uYW1lLCB0b29sdGlwLCBzZGtfdXJsLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgbWFuZGF0b3J5KTsKLSAgICAgICAgbUNhbm9uaWNhbENsYXNzTmFtZSA9IGNhbm9uaWNhbENsYXNzTmFtZTsKLSAgICAgICAgbUxheW91dEF0dHJpYnV0ZXMgPSBsYXlvdXRBdHRyaWJ1dGVzICE9IG51bGwgPyBsYXlvdXRBdHRyaWJ1dGVzIDogbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGJhc2VkIG9uIGl0cyBYTUwgbmFtZSwgdGhlIGNhbm9uaWNhbAotICAgICAqIG5hbWUgb2YgdGhlIGNsYXNzIGl0IHJlcHJlc2VudHMsIGFuZCBpdHMgY2hpbGRyZW4gbGlzdC4KLSAgICAgKiBUaGUgVUkgbmFtZSBpcyBidWlsZCBieSBjYXBpdGFsaXppbmcgdGhlIFhNTCBuYW1lLgotICAgICAqIFRoZSBVSSBub2RlcyB3aWxsIGJlIG5vbi1tYW5kYXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSBjYW5vbmljYWxDbGFzc05hbWUgVGhlIGNhbm9uaWNhbCBjbGFzcyBuYW1lIHRoZSB7QGxpbmsgVmlld0VsZW1lbnREZXNjcmlwdG9yfSBpcwotICAgICAqIHJlcHJlc2VudGluZy4KLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGxpc3Qgb2YgYWxsb3dlZCBjaGlsZHJlbi4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIG1hbmRhdG9yeSBXaGV0aGVyIHRoaXMgbm9kZSBtdXN0IGFsd2F5cyBleGlzdCAoZXZlbiBmb3IgZW1wdHkgbW9kZWxzKS4gQSBtYW5kYXRvcnkKLSAgICAgKiAgVUkgbm9kZSBpcyBuZXZlciBkZWxldGVkIGFuZCBpdCBtYXkgbGFjayBhbiBhY3R1YWwgWE1MIG5vZGUgYXR0YWNoZWQuIEEgbm9uLW1hbmRhdG9yeQotICAgICAqICBVSSBub2RlIE1VU1QgaGF2ZSBhbiBYTUwgbm9kZSBhdHRhY2hlZCBhbmQgaXQgd2lsbCBjZWFzZSB0byBleGlzdCB3aGVuIHRoZSBYTUwgbm9kZQotICAgICAqICBjZWFzZXMgdG8gZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIFZpZXdFbGVtZW50RGVzY3JpcHRvcihTdHJpbmcgeG1sX25hbWUsIFN0cmluZyBjYW5vbmljYWxDbGFzc05hbWUsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuLAotICAgICAgICAgICAgYm9vbGVhbiBtYW5kYXRvcnkpIHsKLSAgICAgICAgc3VwZXIoeG1sX25hbWUsIGNoaWxkcmVuLCBtYW5kYXRvcnkpOwotICAgICAgICBtQ2Fub25pY2FsQ2xhc3NOYW1lID0gY2Fub25pY2FsQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBiYXNlZCBvbiBpdHMgWE1MIG5hbWUgYW5kIGNoaWxkcmVuIGxpc3QuCi0gICAgICogVGhlIFVJIG5hbWUgaXMgYnVpbGQgYnkgY2FwaXRhbGl6aW5nIHRoZSBYTUwgbmFtZS4KLSAgICAgKiBUaGUgVUkgbm9kZXMgd2lsbCBiZSBub24tbWFuZGF0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lLiBDYXNlIHNlbnNpdGl2ZS4KLSAgICAgKiBAcGFyYW0gY2Fub25pY2FsQ2xhc3NOYW1lIFRoZSBjYW5vbmljYWwgY2xhc3MgbmFtZSB0aGUge0BsaW5rIFZpZXdFbGVtZW50RGVzY3JpcHRvcn0gaXMKLSAgICAgKiByZXByZXNlbnRpbmcuCi0gICAgICogQHBhcmFtIGNoaWxkcmVuIFRoZSBsaXN0IG9mIGFsbG93ZWQgY2hpbGRyZW4uIENhbiBiZSBudWxsIG9yIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3RWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lLCBTdHJpbmcgY2Fub25pY2FsQ2xhc3NOYW1lLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3JbXSBjaGlsZHJlbikgewotICAgICAgICBzdXBlcih4bWxfbmFtZSwgY2hpbGRyZW4pOwotICAgICAgICBtQ2Fub25pY2FsQ2xhc3NOYW1lID0gY2Fub25pY2FsQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBiYXNlZCBvbiBpdHMgWE1MIG5hbWUgYW5kIG9uIHRoZSBjYW5vbmljYWwKLSAgICAgKiBuYW1lIG9mIHRoZSBjbGFzcyBpdCByZXByZXNlbnRzLgotICAgICAqIFRoZSBVSSBuYW1lIGlzIGJ1aWxkIGJ5IGNhcGl0YWxpemluZyB0aGUgWE1MIG5hbWUuCi0gICAgICogVGhlIFVJIG5vZGVzIHdpbGwgYmUgbm9uLW1hbmRhdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geG1sX25hbWUgVGhlIFhNTCBlbGVtZW50IG5vZGUgbmFtZS4gQ2FzZSBzZW5zaXRpdmUuCi0gICAgICogQHBhcmFtIGNhbm9uaWNhbENsYXNzTmFtZSBUaGUgY2Fub25pY2FsIGNsYXNzIG5hbWUgdGhlIHtAbGluayBWaWV3RWxlbWVudERlc2NyaXB0b3J9IGlzCi0gICAgICogcmVwcmVzZW50aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3RWxlbWVudERlc2NyaXB0b3IoU3RyaW5nIHhtbF9uYW1lLCBTdHJpbmcgY2Fub25pY2FsQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHhtbF9uYW1lKTsKLSAgICAgICAgbUNhbm9uaWNhbENsYXNzTmFtZSA9IGNhbm9uaWNhbENsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgZWxlbWVudCBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gbUNhbm9uaWNhbENsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhlIGxpc3Qgb2YgbGF5b3V0IGF0dHJpYnV0ZXMuIENhbiBiZSBlbXB0eSBidXQgbm90IG51bGwuICovCi0gICAgcHVibGljIEF0dHJpYnV0ZURlc2NyaXB0b3JbXSBnZXRMYXlvdXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbUxheW91dEF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlWaWV3RWxlbWVudE5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgY3JlYXRlVWlOb2RlKCkgewotICAgICAgICByZXR1cm4gbmV3IFVpVmlld0VsZW1lbnROb2RlKHRoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9Ecm9wRmVlZGJhY2suamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9Ecm9wRmVlZGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1ZTAxNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvRHJvcEZlZWRiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5MYXlvdXRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LkxheW91dEVkaXRvci5VaUVkaXRvckFjdGlvbnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzLlVpTGF5b3V0RWRpdFBhcnQuSGlnaGxpZ2h0SW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggZHJvcHBpbmcgRWRpdFBhcnQgb24gdGhlIEdMRS4KLSAqIDxwLz4KLSAqIFRoaXMgY2xhc3MgdXNlcyBzb21lIHRlbXBvcmFyeSBzdGF0aWMgc3RvcmFnZSB0byBhdm9pZCBleGNlc3NpdmUgYWxsb2NhdGlvbnMgZHVyaW5nCi0gKiBkcm9wIG9wZXJhdGlvbnMuIEl0IGlzIGV4cGVjdGVkIHRvIG9ubHkgYmUgaW52b2tlZCBmcm9tIHRoZSBtYWluIFVJIHRocmVhZCB3aXRoIG5vCi0gKiBjb25jdXJyZW50IGFjY2Vzcy4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1jbGFzcyBEcm9wRmVlZGJhY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPUCAgICA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFRlQgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJPVFRPTSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJJR0hUICA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ESVIgPSBSSUdIVDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzT3Bwb3NpdGVEaXJlY3Rpb25bXSA9IHsgQk9UVE9NLCBSSUdIVCwgVE9QLCBMRUZUIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVaUVsZW1lbnRFZGl0UGFydCBzVGVtcENsb3Nlc3RzW10gPSBuZXcgVWlFbGVtZW50RWRpdFBhcnRbNF07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNUZW1wTWluRGlzdHNbXSA9IG5ldyBpbnRbNF07Ci0KLQotICAgIC8qKgotICAgICAqIFRhcmdldCBpbmZvcm1hdGlvbiBjb21wdXRlZCBmcm9tIGEgZHJvcCBvbiBhIFJlbGF0aXZlTGF5b3V0LgotICAgICAqIFdlIG5lZWQgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBhbmQgaXQgaXMgc1JlbGF0aXZlSW5mby4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWxhdGl2ZUluZm8gewotICAgICAgICAvKiogVGhlIHR3byB0YXJnZXQgcGFydHMgMCBhbmQgMS4gVGhleSBjYW4gYmUgbnVsbCwgbWVhbmluZyBhIGJvcmRlciBpcyB1c2VkLgotICAgICAgICAgKiAgVGhlIGRpcmVjdGlvbiBmcm9tIHBhcnQgMCB0byAxIGlzIGFsd2F5cyB0by10aGUtcmlnaHQgb3IgdG8tdGhlLWJvdHRvbS4gKi8KLSAgICAgICAgZmluYWwgVWlFbGVtZW50RWRpdFBhcnQgdGFyZ2V0UGFydHNbXSA9IG5ldyBVaUVsZW1lbnRFZGl0UGFydFsyXTsKLSAgICAgICAgLyoqIERpcmVjdGlvbiBmcm9tIHRoZSBhbmNob3IgcGFydCB0byB0aGUgZHJvcCBwb2ludC4gKi8KLSAgICAgICAgaW50IGRpcmVjdGlvbjsKLSAgICAgICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgImFuY2hvciIgcGFydCwgaS5lLiB0aGUgY2xvc2VzdCBvbmUgc2VsZWN0ZWQgYnkgdGhlIGRyb3AuCi0gICAgICAgICAqICBUaGlzIGNhbiBiZSBlaXRoZXIgMCBvciAxLiBUaGUgY29ycmVzcG9uZGluZyBwYXJ0IGNhbiBiZSBudWxsLiAqLwotICAgICAgICBpbnQgYW5jaG9ySW5kZXg7Ci0gICAgfQotCi0gICAgLyoqIFRoZSBzaW5nbGUgUmVsYXRpdmVJbmZvIHVzZWQgdG8gY29tcHV0ZSByZXN1bHRzIGZyb20gYSBkcm9wIG9uIGEgUmVsYXRpdmVMYXlvdXQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWxhdGl2ZUluZm8gc1JlbGF0aXZlSW5mbyA9IG5ldyBSZWxhdGl2ZUluZm8oKTsKLSAgICAvKiogQSB0ZW1wb3JhcnkgYXJyYXkgb2YgMiB7QGxpbmsgVWlFbGVtZW50RWRpdFBhcnR9IHRvIGF2b2lkIGFsbG9jYXRpb25zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVpRWxlbWVudEVkaXRQYXJ0IHNUZW1wVHdvUGFydHNbXSA9IG5ldyBVaUVsZW1lbnRFZGl0UGFydFsyXTsKLQotCi0gICAgcHJpdmF0ZSBEcm9wRmVlZGJhY2soKSB7Ci0gICAgfQotCi0KLSAgICAvLy0tLS0tIFBhY2thZ2UgbWV0aG9kcyBjYWxsZWQgYnkgdXNlcnMgb2YgdGhpcyBoZWxwZXIgY2xhc3MgLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB7QGxpbmsgRWxlbWVudENyZWF0ZUNvbW1hbmQjZXhlY3V0ZSgpfSB3aGVuIGEgbmV3IGl0ZW0KLSAgICAgKiBuZWVkcyB0byBiZSAiZHJvcHBlZCIgaW4gdGhlIGN1cnJlbnQgWE1MIGRvY3VtZW50LiBJdCBjcmVhdGVzIHRoZSBuZXcgaXRlbSB1c2luZwotICAgICAqIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFzIGEgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudCBwYXJ0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFBhcnQgVGhlIHBhcmVudCBwYXJ0LgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSB3aGVyZSAgICAgIFRoZSBkcm9wIGxvY2F0aW9uIChpbiBwYXJlbnQgY29vcmRpbmF0ZXMpCi0gICAgICogQHBhcmFtIGFjdGlvbnMgICAgVGhlIGhlbHBlciB0aGF0IGFjdHVhbGx5IG1vZGlmaWVzIHRoZSBYTUwgbW9kZWwuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgYWRkRWxlbWVudFRvWG1sKFVpRWxlbWVudEVkaXRQYXJ0IHBhcmVudFBhcnQsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBQb2ludCB3aGVyZSwKLSAgICAgICAgICAgIFVpRWRpdG9yQWN0aW9ucyBhY3Rpb25zKSB7Ci0KLSAgICAgICAgU3RyaW5nIGxheW91dFhtbE5hbWUgPSBnZXRYbWxMb2NhbE5hbWUocGFyZW50UGFydCk7Ci0gICAgICAgIFJlbGF0aXZlSW5mbyBpbmZvID0gbnVsbDsKLSAgICAgICAgVWlFbGVtZW50RWRpdFBhcnQgc2libGluZyA9IG51bGw7Ci0KLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBtZXJnZSBsaWtlIGEgdmVydGljYWwgbGF5b3V0Ci0gICAgICAgIC8vIFRPRE8gY29uc2lkZXIgVGFibGVMYXlvdXQgbGlrZSBhIGxpbmVhcgotICAgICAgICBpZiAoTGF5b3V0Q29uc3RhbnRzLkxJTkVBUl9MQVlPVVQuZXF1YWxzKGxheW91dFhtbE5hbWUpKSB7Ci0gICAgICAgICAgICBzaWJsaW5nID0gZmluZExpbmVhclRhcmdldChwYXJlbnRQYXJ0LCB3aGVyZSlbMV07Ci0KLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXRDb25zdGFudHMuUkVMQVRJVkVfTEFZT1VULmVxdWFscyhsYXlvdXRYbWxOYW1lKSkgewotICAgICAgICAgICAgaW5mbyA9IGZpbmRSZWxhdGl2ZVRhcmdldChwYXJlbnRQYXJ0LCB3aGVyZSwgc1JlbGF0aXZlSW5mbyk7Ci0gICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2libGluZyA9IGluZm8udGFyZ2V0UGFydHNbaW5mby5hbmNob3JJbmRleF07Ci0gICAgICAgICAgICAgICAgc2libGluZyA9IGdldE5leHRVaVNpYmxpbmcoc2libGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpU2libGluZyA9IHNpYmxpbmcgIT0gbnVsbCA/IHNpYmxpbmcuZ2V0VWlOb2RlKCkgOiBudWxsOwotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aVBhcmVudCA9IHBhcmVudFBhcnQuZ2V0VWlOb2RlKCk7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpTm9kZSA9IGFjdGlvbnMuYWRkRWxlbWVudCh1aVBhcmVudCwgdWlTaWJsaW5nLCBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnVwZGF0ZUxheW91dCovKTsKLQotICAgICAgICAgICAgaWYgKExheW91dENvbnN0YW50cy5BQlNPTFVURV9MQVlPVVQuZXF1YWxzKGxheW91dFhtbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0QWJzb2x1dGVBdHRyaWJ1dGVzKHVpTm9kZSwgd2hlcmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChMYXlvdXRDb25zdGFudHMuUkVMQVRJVkVfTEFZT1VULmVxdWFscyhsYXlvdXRYbWxOYW1lKSkgewotICAgICAgICAgICAgICAgIGFkdXN0UmVsYXRpdmVBdHRyaWJ1dGVzKHVpTm9kZSwgaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHtAbGluayBVaUxheW91dEVkaXRQYXJ0I3Nob3dEcm9wVGFyZ2V0KFBvaW50KX0gdG8gY29tcHV0ZQotICAgICAqIGhpZ2hsaWdodCBpbmZvcm1hdGlvbiB3aGVuIGEgZHJvcCB0YXJnZXQgaXMgbW92ZWQgb3ZlciBhIHZhbGlkIGRyb3AgYXJlYS4KLSAgICAgKiA8cC8+Ci0gICAgICogU2luY2UgdGhlcmUgYXJlIG5vICJvdXQiIHBhcmFtZXRlcnMgaW4gSmF2YSwgYWxsIHRoZSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZAotICAgICAqIHZpYSB0aGUge0BsaW5rIEhpZ2hsaWdodEluZm99IHN0cnVjdHVyZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFBhcnQgICAgVGhlIHBhcmVudCBwYXJ0LCBhbHdheXMgYSBsYXlvdXQuCi0gICAgICogQHBhcmFtIGhpZ2hsaWdodEluZm8gQSBzdHJ1Y3R1cmUgd2hlcmUgcmVzdWx0IGlzIHN0b3JlZCB0byBwZXJmb3JtIGhpZ2hsaWdodC4KLSAgICAgKiBAcGFyYW0gd2hlcmUgICAgICAgICBUaGUgdGFyZ2V0IGRyb3AgcG9pbnQsIGluIHBhcmVudCdzIGNvb3JkaW5hdGVzCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIEhpZ2hsaWdodEluZm99IHN0cnVjdHVyZWQgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLCBmb3IgY29udmVuaWVuY2UuCi0gICAgICovCi0gICAgc3RhdGljIEhpZ2hsaWdodEluZm8gY29tcHV0ZURyb3BGZWVkYmFjayhVaUxheW91dEVkaXRQYXJ0IHBhcmVudFBhcnQsCi0gICAgICAgICAgICBIaWdobGlnaHRJbmZvIGhpZ2hsaWdodEluZm8sCi0gICAgICAgICAgICBQb2ludCB3aGVyZSkgewotICAgICAgICBTdHJpbmcgbGF5b3V0VHlwZSA9IGdldFhtbExvY2FsTmFtZShwYXJlbnRQYXJ0KTsKLQotICAgICAgICBpZiAoTGF5b3V0Q29uc3RhbnRzLkFCU09MVVRFX0xBWU9VVC5lcXVhbHMobGF5b3V0VHlwZSkpIHsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8uYW5jaG9yUG9pbnQgPSB3aGVyZTsKLQotICAgICAgICB9IGVsc2UgaWYgKExheW91dENvbnN0YW50cy5MSU5FQVJfTEFZT1VULmVxdWFscyhsYXlvdXRUeXBlKSkgewotICAgICAgICAgICAgYm9vbGVhbiBpc1ZlcnRpY2FsID0gaXNWZXJ0aWNhbChwYXJlbnRQYXJ0KTsKLQotICAgICAgICAgICAgaGlnaGxpZ2h0SW5mby5jaGlsZFBhcnRzID0gZmluZExpbmVhclRhcmdldChwYXJlbnRQYXJ0LCB3aGVyZSk7Ci0gICAgICAgICAgICBjb21wdXRlTGluZWFyTGluZShwYXJlbnRQYXJ0LCBpc1ZlcnRpY2FsLCBoaWdobGlnaHRJbmZvKTsKLQotICAgICAgICB9IGVsc2UgaWYgKExheW91dENvbnN0YW50cy5SRUxBVElWRV9MQVlPVVQuZXF1YWxzKGxheW91dFR5cGUpKSB7Ci0KLSAgICAgICAgICAgIFJlbGF0aXZlSW5mbyBpbmZvID0gZmluZFJlbGF0aXZlVGFyZ2V0KHBhcmVudFBhcnQsIHdoZXJlLCBzUmVsYXRpdmVJbmZvKTsKLSAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRJbmZvLmNoaWxkUGFydHMgPSBzUmVsYXRpdmVJbmZvLnRhcmdldFBhcnRzOwotICAgICAgICAgICAgICAgIGNvbXB1dGVSZWxhdGl2ZUxpbmUocGFyZW50UGFydCwgaW5mbywgaGlnaGxpZ2h0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGlnaGxpZ2h0SW5mbzsKLSAgICB9Ci0KLQotICAgIC8vLS0tLS0gTWlzYyB1dGlsaXRpZXMgLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgVUkgc2libGluZyBvZiB0aGlzIHBhcnQsIGkuZS4gdGhlIGVsZW1lbnQgd2hpY2ggaXMganVzdCBhZnRlciBpbgotICAgICAqIHRoZSBVSS9YTUwgb3JkZXIgaW4gdGhlIHNhbWUgcGFyZW50LiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBubyBzdWNoIHBhcnQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGU6IGJ5ICJVSSBzaWJsaW5nIiBoZXJlIHdlIG1lYW4gdGhlIHNpYmxpbmcgaW4gdGhlIFVpTm9kZSBoaWVyYXJjaHkuIEJ5IGRlc2lnbiB0aGUKLSAgICAgKiBVaU5vZGUgbW9kZWwgaGFzIHRoZSA8ZW0+ZXhhY3Q8L2VtPiBzYW1lIG9yZGVyIGFzIHRoZSBYTUwgbW9kZWwuIFRoaXMgaGFzIG5vdGhpbmcgdG8gZG8KLSAgICAgKiB3aXRoIHRoZSAidXNlciBpbnRlcmZhY2UiIG9yZGVyIHRoYXQgeW91IHNlZSBvbiB0aGUgcmVuZGVyZWQgQW5kcm9pZCBsYXlvdXRzIChlLmcuIGZvcgotICAgICAqIExpbmVhckxheW91dCB0aGV5IGFyZSB0aGUgc2FtZSBidXQgZm9yIEFic29sdXRlTGF5b3V0IG9yIFJlbGF0aXZlTGF5b3V0IHRoZSBVSS9YTUwgbW9kZWwKLSAgICAgKiBvcmRlciBjYW4gYmUgdmFzdGx5IGRpZmZlcmVudCBmcm9tIHRoZSB1c2VyIGludGVyZmFjZSBvcmRlci4pCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVWlFbGVtZW50RWRpdFBhcnQgZ2V0TmV4dFVpU2libGluZyhVaUVsZW1lbnRFZGl0UGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gcGFydC5nZXRVaU5vZGUoKTsKLSAgICAgICAgICAgIGlmICh1aU5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVpTm9kZSA9IHVpTm9kZS5nZXRVaU5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodWlOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBjaGlsZFBhcnQgOiBwYXJ0LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUGFydCBpbnN0YW5jZW9mIFVpRWxlbWVudEVkaXRQYXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVaUVsZW1lbnRFZGl0UGFydCkgY2hpbGRQYXJ0KS5nZXRVaU5vZGUoKSA9PSB1aU5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVWlFbGVtZW50RWRpdFBhcnQpIGNoaWxkUGFydDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYTUwgbG9jYWwgbmFtZSBvZiB0aGUgdWkgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGl0IHBhcnQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0WG1sTG9jYWxOYW1lKFVpRWxlbWVudEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZWRpdFBhcnQuZ2V0VWlOb2RlKCk7Ci0gICAgICAgIGlmICh1aU5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IHVpTm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0WG1sTG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRqdXN0cyB0aGUgYXR0cmlidXRlcyBvZiBhIG5ldyBub2RlIGRyb3BwZWQgaW4gYW4gQWJzb2x1dGVMYXlvdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlOb2RlIFRoZSBuZXcgbm9kZSBiZWluZyBkcm9wcGVkLgotICAgICAqIEBwYXJhbSB3aGVyZSAgVGhlIGRyb3AgbG9jYXRpb24gKGluIHBhcmVudCBjb29yZGluYXRlcykKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkanVzdEFic29sdXRlQXR0cmlidXRlcyhmaW5hbCBVaUVsZW1lbnROb2RlIHVpTm9kZSwgZmluYWwgUG9pbnQgd2hlcmUpIHsKLSAgICAgICAgaWYgKHdoZXJlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1aU5vZGUuZ2V0RWRpdG9yKCkuZWRpdFhtbE1vZGVsKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB1aU5vZGUuc2V0QXR0cmlidXRlVmFsdWUoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX1gsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KExheW91dENvbnN0YW50cy5WQUxVRV9OX0RJUCwgd2hlcmUueCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBvdmVycmlkZSAqLyk7Ci0gICAgICAgICAgICAgICAgdWlOb2RlLnNldEF0dHJpYnV0ZVZhbHVlKExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9ZLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMYXlvdXRDb25zdGFudHMuVkFMVUVfTl9ESVAsIHdoZXJlLnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogb3ZlcnJpZGUgKi8pOwotCi0gICAgICAgICAgICAgICAgdWlOb2RlLmNvbW1pdERpcnR5QXR0cmlidXRlc1RvWG1sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkanVzdHMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBuZXcgbm9kZSBkcm9wcGVkIGluIGEgUmVsYXRpdmVMYXlvdXQ6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4gYW5jaG9yIHBhcnQ6IHRoZSBvbmUgdGhlIHVzZXIgc2VsZWN0ZWQgKG9yIHRoZSBjbG9zZXN0KSBhbmQgdG8gd2hpY2ggdGhlIG5ldyBvbmUKLSAgICAgKiAgICAgIHdpbGwgImF0dGFjaCIuIFRoZSBhbmNob3IgcGFydCBjYW4gYmUgbnVsbCwgZWl0aGVyIGJlY2F1c2UgdGhlIGxheW91dCBpcyBjdXJyZW50bHkKLSAgICAgKiAgICAgIGVtcHR5IG9yIHRoZSB1c2VyIGlzIGF0dGFjaGluZyB0byBhbiBleGlzdGluZyBlbXB0eSBib3JkZXIuCi0gICAgICogPGxpPiBkaXJlY3Rpb246IHRoZSBkaXJlY3Rpb24gZnJvbSB0aGUgYW5jaG9yIHBhcnQgdG8gdGhlIGRyb3AgcG9pbnQuIFRoYXQncyBhbHNvIHRoZQotICAgICAqICAgICAgZGlyZWN0aW9uIGZyb20gdGhlIGFuY2hvciBwYXJ0IHRvIHRoZSBuZXcgcGFydC4KLSAgICAgKiA8bGk+IHRoZSBuZXcgbm9kZTsgaXQgaXMgY3JlYXRlZCBlaXRoZXIgYWZ0ZXIgdGhlIGFuY2hvciBmb3IgcmlnaHQgb3IgdG9wIGRpcmVjdGlvbnMKLSAgICAgKiAgICAgIG9yIGJlZm9yZSB0aGUgYW5jaG9yIGZvciBsZWZ0IG9yIGJvdHRvbSBkaXJlY3Rpb25zLiBUaGlzIG1lYW5zIHRoZSBuZXcgcGFydCBjYW4KLSAgICAgKiAgICAgIHJlZmVyZW5jZSB0aGUgaWQgb2YgdGhlIGFuY2hvciBwYXJ0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBTZXZlcmFsIGNhc2VzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IHNldDogIGxheW91dF9hYm92ZS9iZWxvdy90b0xlZnRPZi90b1JpZ2h0T2YgdG8gcG9pbnQgdG8gdGhlIGFuY2hvci4KLSAgICAgKiA8bGk+IGNvcHk6IGxheW91dF9jZW50ZXJIb3Jpem9udGFsIGZvciB0b3AvYm90dG9tIGRpcmVjdGlvbnMKLSAgICAgKiA8bGk+IGNvcHk6IGxheW91dF9jZW50ZXJWZXJ0aWNhbCBmb3IgbGVmdC9yaWdodCBkaXJlY3Rpb25zLgotICAgICAqIDxsaT4gY29weTogbGF5b3V0X2Fib3ZlL2JlbG93L3RvTGVmdE9mL3RvUmlnaHRPZiBmb3IgdGhlIG9ydGhvZ29uYWwgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgICAoaS5lLiB0b3AvYm90dG9tIG9yIGxlZnQvcmlnaHQuKQotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlOb2RlIFRoZSBuZXcgbm9kZSBiZWluZyBkcm9wcGVkLgotICAgICAqIEBwYXJhbSBpbmZvICAgVGhlIGNvbnRleHQgY29tcHV0ZWQgYnkge0BsaW5rICNmaW5kUmVsYXRpdmVUYXJnZXQoVWlFbGVtZW50RWRpdFBhcnQsIFBvaW50LCBSZWxhdGl2ZUluZm8pfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkdXN0UmVsYXRpdmVBdHRyaWJ1dGVzKGZpbmFsIFVpRWxlbWVudE5vZGUgdWlOb2RlLCBSZWxhdGl2ZUluZm8gaW5mbykgewotICAgICAgICBpZiAodWlOb2RlID09IG51bGwgfHwgaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBVaUVsZW1lbnRFZGl0UGFydCBhbmNob3JQYXJ0ID0gaW5mby50YXJnZXRQYXJ0c1tpbmZvLmFuY2hvckluZGV4XTsgIC8vIGNhbiBiZSBudWxsCi0gICAgICAgIGZpbmFsIGludCBkaXJlY3Rpb24gPSBpbmZvLmRpcmVjdGlvbjsKLQotICAgICAgICB1aU5vZGUuZ2V0RWRpdG9yKCkuZWRpdFhtbE1vZGVsKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgYW5jaG9yVWlOb2RlID0gYW5jaG9yUGFydCAhPSBudWxsID8gYW5jaG9yUGFydC5nZXRVaU5vZGUoKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFuY2hvcklkID0gYW5jaG9yVWlOb2RlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYW5jaG9yVWlOb2RlLmdldEF0dHJpYnV0ZVZhbHVlKCJpZCIpICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChhbmNob3JJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuY2hvcklkID0gRGVzY3JpcHRvcnNVdGlscy5nZXRGcmVlV2lkZ2V0SWQoYW5jaG9yVWlOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgYW5jaG9yVWlOb2RlLnNldEF0dHJpYnV0ZVZhbHVlKCJpZCIsIGFuY2hvcklkLCB0cnVlIC8qb3ZlcnJpZGUqLyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYW5jaG9ySWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9QOgotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfQUJPVkUsIGFuY2hvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX0JFTE9XLCBhbmNob3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUOgotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfVE9fTEVGVF9PRiwgYW5jaG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9UT19SSUdIVF9PRiwgYW5jaG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9QOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX0NFTlRFUl9IT1JJWk9OVEFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JVaU5vZGUuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX0NFTlRFUl9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX1RPX0xFRlRfT0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclVpTm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfVE9fTEVGVF9PRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfVE9fUklHSFRfT0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclVpTm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfVE9fUklHSFRfT0YpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9DRU5URVJfVkVSVElDQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclVpTm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfQ0VOVEVSX1ZFUlRJQ0FMKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BTElHTl9CQVNFTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yVWlOb2RlLmdldEF0dHJpYnV0ZVZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BTElHTl9CQVNFTElORSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BQk9WRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yVWlOb2RlLmdldEF0dHJpYnV0ZVZhbHVlKExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BQk9WRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfQkVMT1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclVpTm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZShMYXlvdXRDb25zdGFudHMuQVRUUl9MQVlPVVRfQkVMT1cpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBhbmNob3Igbm9kZS4gQXNzdW1lIHdlJ3JlIHRhcmdldGluZyBhIGJvcmRlciBhbmQgYWxpZ24KLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmVudC4KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX0FMSUdOX1BBUkVOVF9UT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoTGF5b3V0Q29uc3RhbnRzLkFUVFJfTEFZT1VUX0FMSUdOX1BBUkVOVF9CT1RUT00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BTElHTl9QQVJFTlRfTEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0Q29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KExheW91dENvbnN0YW50cy5BVFRSX0xBWU9VVF9BTElHTl9QQVJFTlRfUklHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICB1aU5vZGUuc2V0QXR0cmlidXRlVmFsdWUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIHRydWUgLyogb3ZlcnJpZGUgKi8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aU5vZGUuY29tbWl0RGlydHlBdHRyaWJ1dGVzVG9YbWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICAvLy0tLS0tIExpbmVhckxheW91dCAtLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRm9yIGEgZ2l2ZW4gcGFyZW50IGVkaXQgcGFydCB0aGF0IE1VU1QgcmVwcmVzZW50IGEgTGluZWFyTGF5b3V0LCBmaW5kcyB0aGUKLSAgICAgKiBlbGVtZW50IGJlZm9yZSB3aGljaCB0aGUgbG9jYXRpb24gcG9pbnRzLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGNvbXB1dGVzIHRoZSBlZGl0IHBhcnQgdGhhdCBjb3JyZXNwb25kcyB0byB3aGF0IHdpbGwgYmUgdGhlICJuZXh0IHNpYmxpbmciIG9mIHRoZSBuZXcKLSAgICAgKiBlbGVtZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBJdCByZXR1cm5zIG51bGwgaWYgaXQgY2FuJ3QgYmUgZGV0ZXJtaW5lZCwgaW4gd2hpY2ggY2FzZSB0aGUgZWxlbWVudCB3aWxsIGJlIGFkZGVkIGF0IHRoZQotICAgICAqIGVuZCBvZiB0aGUgcGFyZW50IGNoaWxkIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBlZGl0IHBhcnRzIHRoYXQgY29ycmVzcG9uZCB0byB3aGF0IHdpbGwgYmUgdGhlICJwcmV2IiBhbmQgIm5leHQgc2libGluZyIgb2YgdGhlCi0gICAgICogICAgICAgICBuZXcgZWxlbWVudC4gVGhlIHByZXZpb3VzIHNpYmxpbmcgY2FuIGJlIG51bGwgaWYgYWRkaW5nIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICAgKiAgICAgICAgIFRoZSBuZXh0IHNpYmxpbmcgY2FuIGJlIG51bGwgaWYgYWRkaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVWlFbGVtZW50RWRpdFBhcnRbXSBmaW5kTGluZWFyVGFyZ2V0KFVpRWxlbWVudEVkaXRQYXJ0IHBhcmVudCwgUG9pbnQgcG9pbnQpIHsKLSAgICAgICAgLy8gZGVmYXVsdCBvcmllbnRhdGlvbiBpcyBob3Jpem9udGFsCi0gICAgICAgIGJvb2xlYW4gaXNWZXJ0aWNhbCA9IGlzVmVydGljYWwocGFyZW50KTsKLQotICAgICAgICBpbnQgdGFyZ2V0ID0gaXNWZXJ0aWNhbCA/IHBvaW50LnkgOiBwb2ludC54OwotCi0gICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IHByZXYgPSBudWxsOwotICAgICAgICBVaUVsZW1lbnRFZGl0UGFydCBuZXh0ID0gbnVsbDsKLQotICAgICAgICBmb3IgKE9iamVjdCBjaGlsZCA6IHBhcmVudC5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBVaUVsZW1lbnRFZGl0UGFydCkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IGNoaWxkUGFydCA9IChVaUVsZW1lbnRFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcCA9IGNoaWxkUGFydC5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgbWlkZGxlID0gaXNWZXJ0aWNhbCA/IHAueSA6IHAueDsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IDwgbWlkZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBjaGlsZFBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGRQYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc1RlbXBUd29QYXJ0c1swXSA9IHByZXY7Ci0gICAgICAgIHNUZW1wVHdvUGFydHNbMV0gPSBuZXh0OwotICAgICAgICByZXR1cm4gc1RlbXBUd29QYXJ0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgaGlnaGxpZ2h0IGxpbmUgYmV0d2VlbiB0d28gcGFydHMuCi0gICAgICogPHAvPgotICAgICAqIFRoZSB0d28gcGFydHMgYXJlIGxpc3RlZCBpbiBIaWdobGlnaHRJbmZvLmNoaWxkUGFydHNbMl0uIEFueSBvZiB0aGUgcGFydHMKLSAgICAgKiBjYW4gYmUgbnVsbC4KLSAgICAgKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiBIaWdobGlnaHRJbmZvLgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsZXIgbXVzdCBjbGVhciB0aGUgSGlnaGxpZ2h0SW5mbyBhcyBhcHByb3ByaWF0ZSBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudFBhcnQgICAgVGhlIHBhcmVudCBwYXJ0LCBhbHdheXMgYSBsYXlvdXQuCi0gICAgICogQHBhcmFtIGlzVmVydGljYWwgICAgVHJ1ZSBmb3IgdmVydGljYWwgcGFydHMsIHRodXMgY29tcHV0aW5nIGFuIGhvcml6b250YWwgbGluZS4KLSAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0SW5mbyBUaGUgaW4tb3V0IGhpZ2hsaWdodCBpbmZvLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZUxpbmVhckxpbmUoVWlMYXlvdXRFZGl0UGFydCBwYXJlbnRQYXJ0LAotICAgICAgICAgICAgYm9vbGVhbiBpc1ZlcnRpY2FsLCBIaWdobGlnaHRJbmZvIGhpZ2hsaWdodEluZm8pIHsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBwYXJlbnRQYXJ0LmdldEJvdW5kcygpOwotCi0gICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7Ci0gICAgICAgICAgICBQb2ludCBwID0gbnVsbDsKLSAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IHBhcnQgPSBoaWdobGlnaHRJbmZvLmNoaWxkUGFydHNbMF07Ci0gICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcCA9IHBhcnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcnQgPSBoaWdobGlnaHRJbmZvLmNoaWxkUGFydHNbMV07Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwID0gcGFydC5nZXRCb3VuZHMoKS5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBsaW5lIHdpdGggbWlkZGxlIGFuY2hvciBwb2ludAotICAgICAgICAgICAgICAgIGhpZ2hsaWdodEluZm8udGVtcFBvaW50c1swXS5zZXRMb2NhdGlvbigwLCBwLnkpOwotICAgICAgICAgICAgICAgIGhpZ2hsaWdodEluZm8udGVtcFBvaW50c1sxXS5zZXRMb2NhdGlvbihyLndpZHRoLCBwLnkpOwotICAgICAgICAgICAgICAgIGhpZ2hsaWdodEluZm8ubGluZVBvaW50cyA9IGhpZ2hsaWdodEluZm8udGVtcFBvaW50czsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRJbmZvLmFuY2hvclBvaW50ID0gcC5zZXRMb2NhdGlvbihyLndpZHRoIC8gMiwgcC55KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFBvaW50IHAgPSBudWxsOwotICAgICAgICAgICAgVWlFbGVtZW50RWRpdFBhcnQgcGFydCA9IGhpZ2hsaWdodEluZm8uY2hpbGRQYXJ0c1swXTsKLSAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwID0gcGFydC5nZXRCb3VuZHMoKS5nZXRSaWdodCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXJ0ID0gaGlnaGxpZ2h0SW5mby5jaGlsZFBhcnRzWzFdOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcCA9IHBhcnQuZ2V0Qm91bmRzKCkuZ2V0TGVmdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBsaW5lIHdpdGggbWlkZGxlIGFuY2hvciBwb2ludAotICAgICAgICAgICAgICAgIGhpZ2hsaWdodEluZm8udGVtcFBvaW50c1swXS5zZXRMb2NhdGlvbihwLngsIDApOwotICAgICAgICAgICAgICAgIGhpZ2hsaWdodEluZm8udGVtcFBvaW50c1sxXS5zZXRMb2NhdGlvbihwLngsIHIuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRJbmZvLmxpbmVQb2ludHMgPSBoaWdobGlnaHRJbmZvLnRlbXBQb2ludHM7Ci0gICAgICAgICAgICAgICAgaGlnaGxpZ2h0SW5mby5hbmNob3JQb2ludCA9IHAuc2V0TG9jYXRpb24ocC54LCByLmhlaWdodCAvIDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsaW5lYXIgbGF5b3V0IGlzIG1hcmtlZCBhcyB2ZXJ0aWNhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGEgbGF5b3V0IHBhcnQgdGhhdCBtdXN0IGJlIGEgTGluZWFyTGF5b3V0Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsaW5lYXIgbGF5b3V0IGhhcyBhIHZlcnRpY2FsIG9yaWVudGF0aW9uIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmVydGljYWwoVWlFbGVtZW50RWRpdFBhcnQgcGFyZW50KSB7Ci0gICAgICAgIFN0cmluZyBvcmllbnRhdGlvbiA9IHBhcmVudC5nZXRTdHJpbmdBdHRyKCJvcmllbnRhdGlvbiIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBib29sZWFuIGlzVmVydGljYWwgPSAidmVydGljYWwiLmVxdWFscyhvcmllbnRhdGlvbikgfHwgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiLmVxdWFscyhvcmllbnRhdGlvbik7ICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsOwotICAgIH0KLQotCi0gICAgLy8tLS0tLSBSZWxhdGl2ZUxheW91dCAtLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlICJ0YXJnZXQiIHJlbGF0aXZlIGxheW91dCBpdGVtIGZvciB0aGUgZHJvcCBvcGVyYXRpb24gJiBmZWVkYmFjay4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIGRyb3AgcG9pbnQgaXMgZXhhY3RseSBvbiBhIGN1cnJlbnQgaXRlbSwgc2ltcGx5IHJldHVybnMgdGhlIHNpZGUgdGhlIGRyb3Agd2lsbCBvY2N1cgotICAgICAqIGNvbXBhcmVkIHRvIHRoZSBjZW50ZXIgb2YgdGhhdCBlbGVtZW50LiBGb3IgdGhlIGFjdHVhbCBYTUwsIHdlJ2xsIG5lZWQgdG8gaW5zZXJ0ICphZnRlcioKLSAgICAgKiB0aGF0IGVsZW1lbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVmZXJlbmNlZCBhcmUgZGVmaW5lZCBpbiB0aGUgcmlnaHQgb3JkZXIuCi0gICAgICogSW4gdGhhdCBjYXNlIHRoZSByZXN1bHQgY29udGFpbnMgdHdvIGVsZW1lbnRzLCB0aGUgc2Vjb25kIG9uZSBhbHdheXMgYmVpbmcgb24gdGhlIHJpZ2h0IG9yCi0gICAgICogYm90dG9tIHNpZGUgb2YgdGhlIGZpcnN0IG9uZS4gV2hlbiBpbnNlcnQgaW4gWE1MLCB3ZSB3YW50IHRvIGluc2VydCByaWdodCBiZWZvcmUgdGhhdAotICAgICAqIHNlY29uZCBlbGVtZW50IG9yIGF0IHRoZSBlbmQgb2YgdGhlIGNoaWxkIGxpc3QgaWYgdGhlIHNlY29uZCBlbGVtZW50IGlzIG51bGwuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBkcm9wIHBvaW50IGlzIG5vdCBleGFjdGx5IG9uIGEgY3VycmVudCBlbGVtZW50LCBmaW5kIHRoZSBjbG9zZXN0IGluIGVhY2gKLSAgICAgKiBkaXJlY3Rpb24gYW5kIGFsaWduIHdpdGggdGhlIHR3byBjbG9zZXN0IG9mIHRoZXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsIGlmIHdlIGZhaWwgdG8gZmluZCBhbnl0aGluZyAoc3VjaCBhcyB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGl0ZW1zIHRvIGNvbXBhcmUKLSAgICAgKiAgICAgICAgIHdpdGgpOyBvdGhlcndpc2UgZmlsbHMgdGhlIHtAbGluayBSZWxhdGl2ZUluZm99IGFuZCByZXR1cm4gaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVsYXRpdmVJbmZvIGZpbmRSZWxhdGl2ZVRhcmdldChVaUVsZW1lbnRFZGl0UGFydCBwYXJlbnQsCi0gICAgICAgICAgICBQb2ludCBwb2ludCwKLSAgICAgICAgICAgIFJlbGF0aXZlSW5mbyBvdXRJbmZvKSB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHNUZW1wTWluRGlzdHNbaV0gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIHNUZW1wQ2xvc2VzdHNbaV0gPSBudWxsOwotICAgICAgICB9Ci0KLQotICAgICAgICBmb3IgKE9iamVjdCBjaGlsZCA6IHBhcmVudC5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBVaUVsZW1lbnRFZGl0UGFydCkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IGNoaWxkUGFydCA9IChVaUVsZW1lbnRFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBjaGlsZFBhcnQuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIuY29udGFpbnMocG9pbnQpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgcnggPSAoKGZsb2F0KShwb2ludC54IC0gci54KSAvIChmbG9hdClyLndpZHRoICkgLSAwLjVmOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCByeSA9ICgoZmxvYXQpKHBvaW50LnkgLSByLnkpIC8gKGZsb2F0KXIuaGVpZ2h0KSAtIDAuNWY7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogICBUT1AKLSAgICAgICAgICAgICAgICAgICAgICogIFwgICAvCi0gICAgICAgICAgICAgICAgICAgICAqICAgXCAvCi0gICAgICAgICAgICAgICAgICAgICAqIEwgIFggIFIKLSAgICAgICAgICAgICAgICAgICAgICogICAvIFwKLSAgICAgICAgICAgICAgICAgICAgICogIC8gICBcCi0gICAgICAgICAgICAgICAgICAgICAqICAgQk9UCi0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhyeCkgPj0gTWF0aC5hYnMocnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5mby5kaXJlY3Rpb24gPSBMRUZUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5mby5kaXJlY3Rpb24gPSBSSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLmRpcmVjdGlvbiA9IFRPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZm8uZGlyZWN0aW9uID0gQk9UVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0SW5mby5hbmNob3JJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLnRhcmdldFBhcnRzW2luZGV4XSA9IGNoaWxkUGFydDsKLSAgICAgICAgICAgICAgICAgICAgb3V0SW5mby50YXJnZXRQYXJ0c1sxIC0gaW5kZXhdID0gZmluZENsb3Nlc3RQYXJ0KGNoaWxkUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLmRpcmVjdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dEluZm87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29tcHV0ZUNsb3Nlc3QocG9pbnQsIGNoaWxkUGFydCwgc1RlbXBDbG9zZXN0cywgc1RlbXBNaW5EaXN0cywgVE9QKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlQ2xvc2VzdChwb2ludCwgY2hpbGRQYXJ0LCBzVGVtcENsb3Nlc3RzLCBzVGVtcE1pbkRpc3RzLCBMRUZUKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlQ2xvc2VzdChwb2ludCwgY2hpbGRQYXJ0LCBzVGVtcENsb3Nlc3RzLCBzVGVtcE1pbkRpc3RzLCBCT1RUT00pOwotICAgICAgICAgICAgICAgIGNvbXB1dGVDbG9zZXN0KHBvaW50LCBjaGlsZFBhcnQsIHNUZW1wQ2xvc2VzdHMsIHNUZW1wTWluRGlzdHMsIFJJR0hUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IGNsb3Nlc3QgPSBudWxsOwotICAgICAgICBpbnQgbWluRGlzdCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgbWluRGlyID0gLTE7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gTUFYX0RJUjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc1RlbXBDbG9zZXN0c1tpXSAhPSBudWxsICYmIHNUZW1wTWluRGlzdHNbaV0gPCBtaW5EaXN0KSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VzdCA9IHNUZW1wQ2xvc2VzdHNbaV07Ci0gICAgICAgICAgICAgICAgbWluRGlzdCA9IHNUZW1wTWluRGlzdHNbaV07Ci0gICAgICAgICAgICAgICAgbWluRGlyID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbG9zZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBzd2l0Y2gobWluRGlyKSB7Ci0gICAgICAgICAgICBjYXNlIFRPUDoKLSAgICAgICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0SW5mby5hbmNob3JJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgb3V0SW5mby50YXJnZXRQYXJ0c1tpbmRleF0gPSBjbG9zZXN0OwotICAgICAgICAgICAgb3V0SW5mby50YXJnZXRQYXJ0c1sxIC0gaW5kZXhdID0gZmluZENsb3Nlc3RQYXJ0KGNsb3Nlc3QsIHNPcHBvc2l0ZURpcmVjdGlvblttaW5EaXJdKTsKLSAgICAgICAgICAgIG91dEluZm8uZGlyZWN0aW9uID0gc09wcG9zaXRlRGlyZWN0aW9uW21pbkRpcl07Ci0gICAgICAgICAgICByZXR1cm4gb3V0SW5mbzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBoaWdobGlnaHQgbGluZSBmb3IgYSBkcm9wIG9uIGEgUmVsYXRpdmVMYXlvdXQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBsaW5lIGlzIGFsd2F5cyBwbGFjZWQgb24gdGhlIHNpZGUgb2YgdGhlIGFuY2hvciBwYXJ0IGluZGljYXRlZCBieSB0aGUKLSAgICAgKiBkaXJlY3Rpb24uIFRoZSBkaXJlY3Rpb24gYWx3YXlzIHBvaW50IGZyb20gdGhlIGFuY2hvciBwYXJ0IHRvIHRoZSBkcm9wIHBvaW50LgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGVyZSdzIG5vIGFuY2hvciBwYXJ0LCB1c2UgdGhlIG90aGVyIG9uZSB3aXRoIGEgcmV2ZXJzZWQgZGlyZWN0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBPbiBvdXRwdXQsIHRoaXMgdXBkYXRlcyB0aGUge0BsaW5rIEhpZ2hsaWdodEluZm99LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZVJlbGF0aXZlTGluZShVaUxheW91dEVkaXRQYXJ0IHBhcmVudFBhcnQsCi0gICAgICAgICAgICBSZWxhdGl2ZUluZm8gcmVsSW5mbywKLSAgICAgICAgICAgIEhpZ2hsaWdodEluZm8gaGlnaGxpZ2h0SW5mbykgewotCi0gICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0W10gcGFydHMgPSByZWxJbmZvLnRhcmdldFBhcnRzOwotICAgICAgICBpbnQgZGlyID0gcmVsSW5mby5kaXJlY3Rpb247Ci0gICAgICAgIGludCBpbmRleCA9IHJlbEluZm8uYW5jaG9ySW5kZXg7Ci0gICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IHBhcnQgPSBwYXJ0c1tpbmRleF07Ci0KLSAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlyID0gc09wcG9zaXRlRGlyZWN0aW9uW2Rpcl07Ci0gICAgICAgICAgICBwYXJ0ID0gcGFydHNbMSAtIGluZGV4XTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnaXZlIHVwIGlmIGJvdGggcGFydHMgYXJlIG51bGwKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSByID0gcGFydC5nZXRCb3VuZHMoKTsKLSAgICAgICAgUG9pbnQgcCA9IG51bGw7Ci0gICAgICAgIHN3aXRjaChkaXIpIHsKLSAgICAgICAgY2FzZSBUT1A6Ci0gICAgICAgICAgICBwID0gci5nZXRUb3AoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgIHAgPSByLmdldEJvdHRvbSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAgICAgIHAgPSByLmdldExlZnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICAgICAgcCA9IHIuZ2V0UmlnaHQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGlnaGxpZ2h0SW5mby5hbmNob3JQb2ludCA9IHA7Ci0KLSAgICAgICAgciA9IHBhcmVudFBhcnQuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIHN3aXRjaChkaXIpIHsKLSAgICAgICAgY2FzZSBUT1A6Ci0gICAgICAgIGNhc2UgQk9UVE9NOgotICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBsaW5lIHdpdGggbWlkZGxlIGFuY2hvciBwb2ludAotICAgICAgICAgICAgaGlnaGxpZ2h0SW5mby50ZW1wUG9pbnRzWzBdLnNldExvY2F0aW9uKDAsIHAueSk7Ci0gICAgICAgICAgICBoaWdobGlnaHRJbmZvLnRlbXBQb2ludHNbMV0uc2V0TG9jYXRpb24oci53aWR0aCwgcC55KTsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8ubGluZVBvaW50cyA9IGhpZ2hsaWdodEluZm8udGVtcFBvaW50czsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8uYW5jaG9yUG9pbnQgPSBwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAgY2FzZSBSSUdIVDoKLSAgICAgICAgICAgIC8vIHZlcnRpY2FsIGxpbmUgd2l0aCBtaWRkbGUgYW5jaG9yIHBvaW50Ci0gICAgICAgICAgICBoaWdobGlnaHRJbmZvLnRlbXBQb2ludHNbMF0uc2V0TG9jYXRpb24ocC54LCAwKTsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8udGVtcFBvaW50c1sxXS5zZXRMb2NhdGlvbihwLngsIHIuaGVpZ2h0KTsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8ubGluZVBvaW50cyA9IGhpZ2hsaWdodEluZm8udGVtcFBvaW50czsKLSAgICAgICAgICAgIGhpZ2hsaWdodEluZm8uYW5jaG9yUG9pbnQgPSBwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIGNlcnRhaW4gcmVmZXJlbmNlIHBvaW50IChkcm9wIHBvaW50KSwgY29tcHV0ZXMgdGhlIGRpc3RhbmNlIHRvIHRoZSBnaXZlbgotICAgICAqIHBhcnQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gRm9yIGV4YW1wbGUgaWYgZGlyZWN0aW9uIGlzIHRvcCwgb25seSBhY2NlcHRzIHBhcnRzIHdoaWNoCi0gICAgICogYm90dG9tIGlzIGFib3ZlIHRoZSByZWZlcmVuY2UgcG9pbnQsIGNvbXB1dGVzIHRoZWlyIGRpc3RhbmNlIGFuZCB0aGVuIHVwZGF0ZXMgdGhlCi0gICAgICogY3VycmVudCBtaW5pbWFsIGRpc3RhbmNlcyBhbmQgY3VycmVudCBjbG9zZXN0IHBhcnRzIGFycmF5cyBhY2NvcmRpbmdseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVDbG9zZXN0KFBvaW50IHJlZlBvaW50LAotICAgICAgICAgICAgVWlFbGVtZW50RWRpdFBhcnQgY29tcGFyZVRvUGFydCwKLSAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0W10gY3VyckNsb3Nlc3RzLAotICAgICAgICAgICAgaW50W10gY3Vyck1pbkRpc3RzLAotICAgICAgICAgICAgaW50IGRpcmVjdGlvbikgewotICAgICAgICBSZWN0YW5nbGUgciA9IGNvbXBhcmVUb1BhcnQuZ2V0Qm91bmRzKCk7Ci0KLSAgICAgICAgUG9pbnQgcCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gdXNhYmxlID0gZmFsc2U7Ci0KLSAgICAgICAgc3dpdGNoKGRpcmVjdGlvbikgewotICAgICAgICBjYXNlIFRPUDoKLSAgICAgICAgICAgIHAgPSByLmdldEJvdHRvbSgpOwotICAgICAgICAgICAgdXNhYmxlID0gcC55IDw9IHJlZlBvaW50Lnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCT1RUT006Ci0gICAgICAgICAgICBwID0gci5nZXRUb3AoKTsKLSAgICAgICAgICAgIHVzYWJsZSA9IHAueSA+PSByZWZQb2ludC55OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAgICAgIHAgPSByLmdldFJpZ2h0KCk7Ci0gICAgICAgICAgICB1c2FibGUgPSBwLnggPD0gcmVmUG9pbnQueDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICAgICAgcCA9IHIuZ2V0TGVmdCgpOwotICAgICAgICAgICAgdXNhYmxlID0gcC54ID49IHJlZlBvaW50Lng7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2FibGUpIHsKLSAgICAgICAgICAgIGludCBkID0gcC5nZXREaXN0YW5jZTIocmVmUG9pbnQpOwotICAgICAgICAgICAgaWYgKGQgPCBjdXJyTWluRGlzdHNbZGlyZWN0aW9uXSkgewotICAgICAgICAgICAgICAgIGN1cnJNaW5EaXN0c1tkaXJlY3Rpb25dID0gZDsKLSAgICAgICAgICAgICAgICBjdXJyQ2xvc2VzdHNbZGlyZWN0aW9uXSA9IGNvbXBhcmVUb1BhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIHJlZmVyZW5jZSBwYXJ0cywgZmluZHMgdGhlIGNsb3Nlc3QgcGFydCBpbiB0aGUgcGFyZW50IGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uCi0gICAgICogRm9yIGV4YW1wbGUgaWYgZGlyZWN0aW9uIGlzIHRvcCwgZmluZHMgdGhlIGNsb3Nlc3Qgc2libGluZyBwYXJ0IHdoaWNoIGlzIGFib3ZlIHRoZQotICAgICAqIHJlZmVyZW5jZSBwYXJ0IGFuZCBub24tb3ZlcmxhcHBpbmcgKHRoZXkgY2FuIHRvdWNoLikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBVaUVsZW1lbnRFZGl0UGFydCBmaW5kQ2xvc2VzdFBhcnQoVWlFbGVtZW50RWRpdFBhcnQgcmVmZXJlbmNlUGFydCwKLSAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcnQgPT0gbnVsbCB8fCByZWZlcmVuY2VQYXJ0LmdldFBhcmVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIHIgPSByZWZlcmVuY2VQYXJ0LmdldEJvdW5kcygpOwotICAgICAgICBQb2ludCByZWYgPSBudWxsOwotICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgVE9QOgotICAgICAgICAgICAgcmVmID0gci5nZXRUb3AoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJPVFRPTToKLSAgICAgICAgICAgIHJlZiA9IHIuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMRUZUOgotICAgICAgICAgICAgcmVmID0gci5nZXRMZWZ0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSSUdIVDoKLSAgICAgICAgICAgIHJlZiA9IHIuZ2V0UmlnaHQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1pbkRpc3QgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgVWlFbGVtZW50RWRpdFBhcnQgY2xvc2VzdFBhcnQgPSBudWxsOwotCi0gICAgICAgIGZvciAoT2JqZWN0IGNoaWxkUGFydCA6IHJlZmVyZW5jZVBhcnQuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgaWYgKGNoaWxkUGFydCAhPSByZWZlcmVuY2VQYXJ0ICYmIGNoaWxkUGFydCBpbnN0YW5jZW9mIFVpRWxlbWVudEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgciA9ICgoVWlFbGVtZW50RWRpdFBhcnQpIGNoaWxkUGFydCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB1c2FibGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaChkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRPUDoKLSAgICAgICAgICAgICAgICAgICAgcCA9IHIuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWJsZSA9IHAueSA8PSByZWYueTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBCT1RUT006Ci0gICAgICAgICAgICAgICAgICAgIHAgPSByLmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICB1c2FibGUgPSBwLnkgPj0gcmVmLnk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgcCA9IHIuZ2V0UmlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhYmxlID0gcC54IDw9IHJlZi54OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICAgICAgICAgICAgICBwID0gci5nZXRMZWZ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWJsZSA9IHAueCA+PSByZWYueDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVzYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IHAuZ2V0RGlzdGFuY2UyKHJlZik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkIDwgbWluRGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlzdCA9IGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UGFydCA9IChVaUVsZW1lbnRFZGl0UGFydCkgY2hpbGRQYXJ0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsb3Nlc3RQYXJ0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL0VsZW1lbnRDcmVhdGVDb21tYW5kLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvRWxlbWVudENyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyNTcwZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvRWxlbWVudENyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuTGF5b3V0RWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5MYXlvdXRFZGl0b3IuVWlFZGl0b3JBY3Rpb25zOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBBIGNvbW1hbmQgdGhhdCBrbm93cyBob3cgdG8gaW5zdGFudGlhdGUgYSBuZXcgZWxlbWVudCBiYXNlZCBvbiBhIGdpdmVuIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0sCi0gKiB0aGUgcGFyZW50IHtAbGluayBVaUVsZW1lbnRFZGl0UGFydH0gYW5kIGFuIG9wdGlvbmFsIHRhcmdldCBsb2NhdGlvbi4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotICAgIC8qKiBEZXNjcmlwdG9yIG9mIHRoZSBuZXcgZWxlbWVudCB0byBjcmVhdGUgKi8KLSAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIC8qKiBUaGUgZWRpdCBwYXJ0IHRoYXQgaG9zdHMgdGhlIG5ldyBlZGl0IHBhcnQgKi8KLSAgICBwcml2YXRlIGZpbmFsIFVpRWxlbWVudEVkaXRQYXJ0IG1QYXJlbnRQYXJ0OwotICAgIC8qKiBUaGUgZHJvcCBsb2NhdGlvbiBpbiBwYXJlbnQgY29vcmRpbmF0ZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIFBvaW50IG1UYXJnZXRQb2ludDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVsZW1lbnRDcmVhdGVDb21tYW5kfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIERlc2NyaXB0b3Igb2YgdGhlIG5ldyBlbGVtZW50IHRvIGNyZWF0ZQotICAgICAqIEBwYXJhbSB0YXJnZXRQYXJ0IFRoZSBlZGl0IHBhcnQgdGhhdCBob3N0cyB0aGUgbmV3IGVkaXQgcGFydAotICAgICAqIEBwYXJhbSB0YXJnZXRQb2ludCBUaGUgZHJvcCBsb2NhdGlvbiBpbiBwYXJlbnQgY29vcmRpbmF0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudENyZWF0ZUNvbW1hbmQoRWxlbWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IHRhcmdldFBhcnQsIFBvaW50IHRhcmdldFBvaW50KSB7Ci0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIG1QYXJlbnRQYXJ0ID0gdGFyZ2V0UGFydDsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0UG9pbnQgPSB0YXJnZXRQb2ludDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gTWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBDb21tYW5kIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYKLSAgICAgICAgICAgIG1QYXJlbnRQYXJ0ICE9IG51bGwgJiYKLSAgICAgICAgICAgIG1QYXJlbnRQYXJ0LmdldFVpTm9kZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgIG1QYXJlbnRQYXJ0LmdldFVpTm9kZSgpLmdldEVkaXRvcigpIGluc3RhbmNlb2YgTGF5b3V0RWRpdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSB1aVBhcmVudCA9IG1QYXJlbnRQYXJ0LmdldFVpTm9kZSgpOwotICAgICAgICBpZiAodWlQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQW5kcm9pZEVkaXRvciBlZGl0b3IgPSB1aVBhcmVudC5nZXRFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBMYXlvdXRFZGl0b3IpIHsKLSAgICAgICAgICAgICAgICAoKExheW91dEVkaXRvcikgZWRpdG9yKS53cmFwVW5kb1JlY29yZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNyZWF0ZSAlMSRzIiwgbURlc2NyaXB0b3IuZ2V0WG1sTG9jYWxOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVaUVkaXRvckFjdGlvbnMgYWN0aW9ucyA9ICgoTGF5b3V0RWRpdG9yKSBlZGl0b3IpLmdldFVpRWRpdG9yQWN0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyb3BGZWVkYmFjay5hZGRFbGVtZW50VG9YbWwobVBhcmVudFBhcnQsIG1EZXNjcmlwdG9yLCBtVGFyZ2V0UG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVkbygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZWRvIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bmRvKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuZG8gbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL0VsZW1lbnRGaWd1cmUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9FbGVtZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzJjOWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL0VsZW1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotCi0vKioKLSAqIFRoZSBmaWd1cmUgdXNlZCB0byBkcmF3IGJhc2ljIGVsZW1lbnRzLgotICogPHAvPgotICogVGhlIGZpZ3VyZSBpcyB0b3RhbGx5IGVtcHR5IGFuZCB0cmFuc3BhcmVudCBleGNlcHQgZm9yIHRoZSBzZWxlY3Rpb24gYm9yZGVyLgotICoKLSAqIEBzaW5jZSBHTEUxCi0gKi8KLWNsYXNzIEVsZW1lbnRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NlbGVjdGVkOwotICAgIHByaXZhdGUgUmVjdGFuZ2xlIG1Jbm5lckJvdW5kczsKLQotICAgIHB1YmxpYyBFbGVtZW50RmlndXJlKCkgewotICAgICAgICBzZXRPcGFxdWUoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gaXNTZWxlY3RlZCkgewotICAgICAgICBpZiAoaXNTZWxlY3RlZCAhPSBtSXNTZWxlY3RlZCkgewotICAgICAgICAgICAgbUlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkOwotICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSByZWN0KSB7Ci0gICAgICAgIHN1cGVyLnNldEJvdW5kcyhyZWN0KTsKLQotICAgICAgICBtSW5uZXJCb3VuZHMgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgICAgIGlmIChtSW5uZXJCb3VuZHMud2lkdGggPiAwKSB7Ci0gICAgICAgICAgICBtSW5uZXJCb3VuZHMud2lkdGgtLTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlubmVyQm91bmRzLmhlaWdodCA+IDApIHsKLSAgICAgICAgICAgIG1Jbm5lckJvdW5kcy5oZWlnaHQtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0SW5uZXJCb3VuZHMoKSB7Ci0gICAgICAgIHJldHVybiBtSW5uZXJCb3VuZHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRCb3JkZXIoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLSAgICAgICAgc3VwZXIucGFpbnRCb3JkZXIoZ3JhcGhpY3MpOwotCi0gICAgICAgIGlmIChtSXNTZWxlY3RlZCkgewotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVdpZHRoKDEpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1JlY3RhbmdsZShnZXRJbm5lckJvdW5kcygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9MYXlvdXRGaWd1cmUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9MYXlvdXRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNDc1MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvTGF5b3V0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHMuVWlMYXlvdXRFZGl0UGFydC5IaWdobGlnaHRJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBUaGUgZmlndXJlIHVzZWQgdG8gZHJhdyB0aGUgZmVlZGJhY2sgb24gYSBsYXlvdXQuCi0gKiA8cC8+Ci0gKiBCeSBkZWZhdWx0IHRoZSBmaWd1cmUgaXMgdHJhbnNwYXJlbnQgYW5kIGVtcHR5LgotICogVGhlIGJhc2Uge0BsaW5rIEVsZW1lbnRGaWd1cmV9IGtub3dzIGhvdyB0byBkcmF3IHRoZSBzZWxlY3Rpb24gYm9yZGVyLgotICogVGhpcyBmaWd1cmUga25vd3MgaG93IHRvIGRyYXcgdGhlIGRyb3AgZmVlZGJhY2suCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotY2xhc3MgTGF5b3V0RmlndXJlIGV4dGVuZHMgRWxlbWVudEZpZ3VyZSB7Ci0KLSAgICBwcml2YXRlIEhpZ2hsaWdodEluZm8gbUhpZ2hsaWdodEluZm87Ci0KLSAgICBwdWJsaWMgTGF5b3V0RmlndXJlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdoSW5mbyhIaWdobGlnaHRJbmZvIGhpZ2hsaWdodEluZm8pIHsKLSAgICAgICAgbUhpZ2hsaWdodEluZm8gPSBoaWdobGlnaHRJbmZvOwotICAgICAgICByZXBhaW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFpbnRzIHRoZSAiYm9yZGVyIiBmb3IgdGhpcyBmaWd1cmUuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBwYXJlbnQge0BsaW5rIEZpZ3VyZSNwYWludChHcmFwaGljcyl9IGNhbGxzIHtAbGluayAjcGFpbnRGaWd1cmUoR3JhcGhpY3MpfSB0aGVuCi0gICAgICoge0BsaW5rICNwYWludENsaWVudEFyZWEoR3JhcGhpY3MpfSB0aGVuIHtAbGluayAjcGFpbnRCb3JkZXIoR3JhcGhpY3MpfS4gSGVyZSB3ZSB0aHVzCi0gICAgICogZHJhdyB0aGUgYWN0dWFsIGhpZ2hsaWdodCBib3JkZXIgYnV0IGFsc28gdGhlIGhpZ2hsaWdodCBhbmNob3IgbGluZXMgYW5kIHBvaW50cyBzbyB0aGF0Ci0gICAgICogd2UgY2FuIG1ha2Ugc3VyZSB0aGV5IGFyZSBhbGwgZHJhd24gb24gdG9wIG9mIHRoZSBib3JkZXIuCi0gICAgICogPHAvPgotICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gcmVzdG9yZSBpdHMgZ3JhcGhpYyBzdGF0ZS4gVGhlIHBhcmVudAotICAgICAqIEZpZ3VyZSB3aWxsIGRvIGl0IGZvciB1cy4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JhcGhpY3MgVGhlIEdyYXBoaWNzIG9iamVjdCB1c2VkIGZvciBwYWludGluZwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Qm9yZGVyKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0gICAgICAgIHN1cGVyLnBhaW50Qm9yZGVyKGdyYXBoaWNzKTsKLQotICAgICAgICBpZiAobUhpZ2hsaWdodEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRHJhdyB0aGUgYm9yZGVyLiBXZSB3YW50IG90aGVyIGhpZ2hsaWdodGluZyB0byBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIGJvcmRlci4KLSAgICAgICAgaWYgKG1IaWdobGlnaHRJbmZvLmRyYXdEcm9wQm9yZGVyKSB7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lV2lkdGgoMyk7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmdyZWVuKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdSZWN0YW5nbGUoZ2V0SW5uZXJCb3VuZHMoKS5nZXRDb3B5KCkuc2hyaW5rKDEsIDEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgaW50IGJ4ID0gYm91bmRzLng7Ci0gICAgICAgIGludCBieSA9IGJvdW5kcy55OwotICAgICAgICBpbnQgdyA9IGJvdW5kcy53aWR0aDsKLSAgICAgICAgaW50IGggPSBib3VuZHMuaGVpZ2h0OwotCi0gICAgICAgIC8vIERyYXcgZnJhbWVzIG9mIHRhcmdldCBjaGlsZCBwYXJ0cywgaWYgYW55Ci0gICAgICAgIGlmIChtSGlnaGxpZ2h0SW5mby5jaGlsZFBhcnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldExpbmVXaWR0aCgyKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0gICAgICAgICAgICBmb3IgKFVpRWxlbWVudEVkaXRQYXJ0IHBhcnQgOiBtSGlnaGxpZ2h0SW5mby5jaGlsZFBhcnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3UmVjdGFuZ2xlKHBhcnQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpLnRyYW5zbGF0ZShieCwgYnkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEcmF3IHRoZSB0YXJnZXQgbGluZSwgaWYgYW55Ci0gICAgICAgIGlmIChtSGlnaGxpZ2h0SW5mby5saW5lUG9pbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB4MSA9IG1IaWdobGlnaHRJbmZvLmxpbmVQb2ludHNbMF0ueDsKLSAgICAgICAgICAgIGludCB5MSA9IG1IaWdobGlnaHRJbmZvLmxpbmVQb2ludHNbMF0ueTsKLSAgICAgICAgICAgIGludCB4MiA9IG1IaWdobGlnaHRJbmZvLmxpbmVQb2ludHNbMV0ueDsKLSAgICAgICAgICAgIGludCB5MiA9IG1IaWdobGlnaHRJbmZvLmxpbmVQb2ludHNbMV0ueTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIGxpbmUgaXMgcmlnaHQgdG8gdGhlIGVkZ2UsIGRyYXcgaXQgb25lIHBpeGVsIG1vcmUgaW5zaWRlIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyBmdWxsIDItcGl4ZWwgd2lkdGggYmUgdmlzaWJsZS4KLSAgICAgICAgICAgIGlmICh4MSA8PSAwKSB4MSsrOwotICAgICAgICAgICAgaWYgKHgyIDw9IDApIHgyKys7Ci0gICAgICAgICAgICBpZiAoeTEgPD0gMCkgeTErKzsKLSAgICAgICAgICAgIGlmICh5MiA8PSAwKSB5MisrOwotCi0gICAgICAgICAgICBpZiAoeDEgPj0gdyAtIDEpIHgxLS07Ci0gICAgICAgICAgICBpZiAoeDIgPj0gdyAtIDEpIHgyLS07Ci0gICAgICAgICAgICBpZiAoeTEgPj0gaCAtIDEpIHkxLS07Ci0gICAgICAgICAgICBpZiAoeTIgPj0gaCAtIDEpIHkyLS07Ci0KLSAgICAgICAgICAgIHgxICs9IGJ4OwotICAgICAgICAgICAgeDIgKz0gYng7Ci0gICAgICAgICAgICB5MSArPSBieTsKLSAgICAgICAgICAgIHkyICs9IGJ5OwotCi0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lV2lkdGgoMik7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSCk7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lQ2FwKFNXVC5DQVBfUk9VTkQpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm9yYW5nZSk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEcmF3IHRoZSBhbmNob3IgcG9pbnQsIGlmIGFueQotICAgICAgICBpZiAobUhpZ2hsaWdodEluZm8uYW5jaG9yUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHggPSBtSGlnaGxpZ2h0SW5mby5hbmNob3JQb2ludC54OwotICAgICAgICAgICAgaW50IHkgPSBtSGlnaGxpZ2h0SW5mby5hbmNob3JQb2ludC55OwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgcG9pbnQgaXMgcmlnaHQgb24gdGhlIGVkZ2UsIGRyYXcgaXQgb25lIHBpeGVsIGluc2lkZSBzbyB0aGF0IGl0Ci0gICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBoaWdobGlnaHQgbGluZS4gSXQgbWFrZXMgaXQgc2xpZ2h0bHkgbW9yZSB2aXNpYmxlIHRoYXQgd2F5LgotICAgICAgICAgICAgaWYgKHggPD0gMCkgeCsrOwotICAgICAgICAgICAgaWYgKHkgPD0gMCkgeSsrOwotICAgICAgICAgICAgaWYgKHggPj0gdyAtIDEpIHgtLTsKLSAgICAgICAgICAgIGlmICh5ID49IGggLSAxKSB5LS07Ci0gICAgICAgICAgICB4ICs9IGJ4OwotICAgICAgICAgICAgeSArPSBieTsKLQotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVdpZHRoKDIpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldExpbmVDYXAoU1dULkNBUF9ST1VORCk7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMub3JhbmdlKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgtNSwgeS01LCB4KzUsIHkrNSk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4LTUsIHkrNSwgeCs1LCB5LTUpOwotICAgICAgICAgICAgLy8gNyAqIGNvcyg0NSkgPT0gNSBzbyB3ZSB1c2UgOCBmb3IgdGhlIGNpcmNsZSByYWRpdXMgKGl0IGxvb2tzIHNsaWdodGx5IGJldHRlciB0aGFuIDcpCi0gICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3T3ZhbCh4LTgsIHktOCwgMTYsIDE2KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaURvY3VtZW50RWRpdFBhcnQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaURvY3VtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2NTU3Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlEb2N1bWVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRG9jdW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdEJhY2tncm91bmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUm9vdENvbXBvbmVudEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRyb3BSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5EYXRhQnVmZmVySW50OwotCi0vKioKLSAqIEdyYXBoaWNhbCBlZGl0IHBhcnQgZm9yIHRoZSByb290IGRvY3VtZW50LgotICogPHAvPgotICogSXQgYWN0cyBhcyBhIHNpbXBsZSBjb250YWluZXIuCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGNsYXNzIFVpRG9jdW1lbnRFZGl0UGFydCBleHRlbmRzIFVpRWxlbWVudEVkaXRQYXJ0IHsKLQotICAgIHByaXZhdGUgRGlzcGxheSBtRGlzcGxheTsKLSAgICBwcml2YXRlIEZyZWVmb3JtTGF5ZXIgbUxheWVyOwotICAgIHByaXZhdGUgSW1hZ2VCYWNrZ3JvdW5kIG1JbWFnZTsKLSAgICBwcml2YXRlIExhYmVsIG1DaGlsZCA9IG51bGw7Ci0KLSAgICBmaW5hbCBzdGF0aWMgY2xhc3MgSW1hZ2VCYWNrZ3JvdW5kIGV4dGVuZHMgQWJzdHJhY3RCYWNrZ3JvdW5kIHsKLQotICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkSW1hZ2UgbUJ1ZmZlcmVkSW1hZ2U7Ci0gICAgICAgIHByaXZhdGUgSW1hZ2UgbUltYWdlOwotCi0gICAgICAgIEltYWdlQmFja2dyb3VuZCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEltYWdlQmFja2dyb3VuZChCdWZmZXJlZEltYWdlIGltYWdlLCBEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgICAgIHNldEltYWdlKGltYWdlLCBkaXNwbGF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludEJhY2tncm91bmQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGdyYXBoaWNzLCBJbnNldHMgaW5zZXRzKSB7Ci0gICAgICAgICAgICBpZiAobUltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLSAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3SW1hZ2UobUltYWdlLCByZWN0LngsIHJlY3QueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEltYWdlKEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBkYXRhID0gKChEYXRhQnVmZmVySW50KWltYWdlLmdldERhdGEoKS5nZXREYXRhQnVmZmVyKCkpLmdldERhdGEoKTsKLQotICAgICAgICAgICAgICAgIEltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGltYWdlLmdldFdpZHRoKCksIGltYWdlLmdldEhlaWdodCgpLCAzMiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFsZXR0ZURhdGEoMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRikpOwotCi0gICAgICAgICAgICAgICAgaW1hZ2VEYXRhLnNldFBpeGVscygwLCAwLCBkYXRhLmxlbmd0aCwgZGF0YSwgMCk7Ci0KLSAgICAgICAgICAgICAgICBtSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUltYWdlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgZ2V0QnVmZmVyZWRJbWFnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRJbWFnZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVaURvY3VtZW50RWRpdFBhcnQoVWlEb2N1bWVudE5vZGUgdWlEb2N1bWVudE5vZGUsIERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICBzdXBlcih1aURvY3VtZW50Tm9kZSk7Ci0gICAgICAgIG1EaXNwbGF5ID0gZGlzcGxheTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0gICAgICAgIG1MYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0gICAgICAgIG1MYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLQotICAgICAgICBtTGF5ZXIuc2V0T3BhcXVlKHRydWUpOwotICAgICAgICBtTGF5ZXIuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0KLSAgICAgICAgcmV0dXJuIG1MYXllcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBtb2RlbCA9IChVaUVsZW1lbnROb2RlKWdldE1vZGVsKCk7Ci0KLSAgICAgICAgT2JqZWN0IGVkaXREYXRhID0gbW9kZWwuZ2V0RWRpdERhdGEoKTsKLSAgICAgICAgaWYgKGVkaXREYXRhIGluc3RhbmNlb2YgQnVmZmVyZWRJbWFnZSkgewotICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSA9IChCdWZmZXJlZEltYWdlKWVkaXREYXRhOwotCi0gICAgICAgICAgICBpZiAobUltYWdlID09IG51bGwgfHwgaW1hZ2UgIT0gbUltYWdlLmdldEJ1ZmZlcmVkSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgIG1JbWFnZSA9IG5ldyBJbWFnZUJhY2tncm91bmQoaW1hZ2UsIG1EaXNwbGF5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxheWVyLnNldEJvcmRlcihtSW1hZ2UpOwotCi0gICAgICAgICAgICBpZiAobUNoaWxkICE9IG51bGwgJiYgbUNoaWxkLmdldFBhcmVudCgpID09IG1MYXllcikgewotICAgICAgICAgICAgICAgIG1MYXllci5yZW1vdmUobUNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlZGl0RGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgbUxheWVyLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgICAgIGlmIChtQ2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZCA9IG5ldyBMYWJlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoaWxkLnNldFRleHQoKFN0cmluZyllZGl0RGF0YSk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2hpbGQgIT0gbnVsbCAmJiBtQ2hpbGQuZ2V0UGFyZW50KCkgIT0gbUxheWVyKSB7Ci0gICAgICAgICAgICAgICAgbUxheWVyLmFkZChtQ2hpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG1DaGlsZC5nZXRUZXh0Qm91bmRzKCk7Ci0gICAgICAgICAgICBib3VuZHMueCA9IGJvdW5kcy55ID0gMDsKLSAgICAgICAgICAgIG1MYXllci5zZXRDb25zdHJhaW50KG1DaGlsZCwgYm91bmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlZnJlc2ggdGhlIGNoaWxkcmVuIGFzIHdlbGwKLSAgICAgICAgcmVmcmVzaENoaWxkcmVuVmlzdWFscygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIG5vIHNlbGVjdGlvbiBhdCB0aGlzIGxldmVsLgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0gICAgICAgIC8vIG5vIHNlbGVjdGlvbiBhdCB0aGlzIGxldmVsLgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0KLSAgICAgICAgLy8gVGhpcyBwb2xpY3kgaW5kaWNhdGVzIHRoaXMgYSByb290IGNvbXBvbmVudCB0aGF0IGNhbm5vdCBiZSByZW1vdmVkCi0gICAgICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBSb290Q29tcG9uZW50RWRpdFBvbGljeSgpKTsKLQotICAgICAgICBpbnN0YWxsTGF5b3V0RWRpdFBvbGljeSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBFZGl0UGFydCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgZm9yIHRoZSBzcGVjaWZpZWQgUmVxdWVzdC4KLSAgICAgKiBGb3IgaW5zdGFuY2UgdGhpcyBpcyBjYWxsZWQgZHVyaW5nIGRyYWcnbidkcm9wIHdpdGggYSBDcmVhdGVSZXF1ZXN0LgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgdGhlIHJvb3QgZG9jdW1lbnQsIHdlIHdhbnQgdGhlIGZpcnN0IGNoaWxkIGVkaXQgcGFydCB0byB0aGUgYmUgdGhlIHRhcmdldAotICAgICAqIHNpbmNlIGFuIFhNTCBkb2N1bWVudCBjYW4gaGF2ZSBvbmx5IG9uZSByb290IGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0NSRUFURSkgewotICAgICAgICAgICAgLy8gV2UgcmVmdXNlIHRoZSBkcm9wIGlmIGl0J3Mgbm90IGluIHRoZSBib3VuZHMgb2YgdGhlIGRvY3VtZW50LgotICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBEcm9wUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIFBvaW50IHdoZXJlID0gKChEcm9wUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCk7Ci0gICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5vZGUgPSBnZXRVaU5vZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodWlOb2RlIGluc3RhbmNlb2YgVWlEb2N1bWVudE5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSB0aGUgYm91bmRzIG9mIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGFzIHRoZSB2YWxpZCBkcm9wIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVkaXREYXRhID0gdWlOb2RlLmdldEVkaXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0RGF0YSBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW1hZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSllZGl0RGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ID0gaW1hZ2UuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBoID0gaW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hlcmUueCA+IHcgfHwgd2hlcmUueSA+IGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3IgdGhlIHJvb3QgZG9jdW1lbnQsIHdlIHdhbnQgdGhlIGZpcnN0IGNoaWxkIGVkaXQgcGFydCB0byB0aGUgYmUgdGhlIHRhcmdldAotICAgICAgICAgICAgLy8gc2luY2UgYW4gWE1MIGRvY3VtZW50IGNhbiBoYXZlIG9ubHkgb25lIHJvb3QgZWxlbWVudC4KLSAgICAgICAgICAgIGlmIChnZXRDaGlsZHJlbigpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRWRpdFBhcnQpIG8pLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpRG9jdW1lbnRUcmVlRWRpdFBhcnQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaURvY3VtZW50VHJlZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGM1MTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpRG9jdW1lbnRUcmVlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVaUVsZW1lbnRUcmVlRWRpdFBhcnR9IGZvciB0aGUgZG9jdW1lbnQgcm9vdC4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1wdWJsaWMgY2xhc3MgVWlEb2N1bWVudFRyZWVFZGl0UGFydCBleHRlbmRzIFVpRWxlbWVudFRyZWVFZGl0UGFydCB7Ci0KLSAgICBwdWJsaWMgVWlEb2N1bWVudFRyZWVFZGl0UGFydChVaURvY3VtZW50Tm9kZSBtb2RlbCkgewotICAgICAgICBzdXBlcihtb2RlbCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFVpTm9kZSgpLmdldFVpQ2hpbGRyZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlFbGVtZW50RWRpdFBhcnQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWM3YjZkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5JVWlVcGRhdGVMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Ecm9wUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuU2VsZWN0RWRpdFBhcnRUcmFja2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4ge0BsaW5rIEVkaXRQYXJ0fSBmb3IgYSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVpRWxlbWVudEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydAotICAgIGltcGxlbWVudHMgSVVpVXBkYXRlTGlzdGVuZXIgewotCi0gICAgcHVibGljIFVpRWxlbWVudEVkaXRQYXJ0KFVpRWxlbWVudE5vZGUgdWlFbGVtZW50Tm9kZSkgewotICAgICAgICBzZXRNb2RlbCh1aUVsZW1lbnROb2RlKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEZXJpdmVkIGNsYXNzZXMgbXVzdCBkZWZpbmUgdGhlc2UKLQotICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKTsKLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCk7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCYXNlIGNsYXNzIG92ZXJyaWRlcwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERyYWdUcmFja2VyIGdldERyYWdUcmFja2VyKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEVkaXRQYXJ0VHJhY2tlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYXMgYSBzZWxlY3Rpb24gZWRpdCBwb2xpY3kgaXMgc2V0IGJ5IHRoZSBwYXJlbnQgbGF5b3V0LgotICAgICAgICAgKiBMZWF2ZSB0aGlzIGNvZGUgY29tbWVudGVkIG91dCByaWdodCBub3csIEknbGwgd2FudCB0byBwbGF5IHdpdGggdGhpcyBsYXRlci4KLSAgICAgICAgICoKLSAgICAgICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLSAgICAgICAgICAgICAgICBuZXcgTm9uUmVzaXphYmxlU2VsZWN0aW9uRWRpdFBvbGljeSh0aGlzKSk7Ci0gICAgICAgICAqLwotICAgIH0KLQotICAgIC8qIChub24tamF2YWRvYykKLSAgICAgKiBSZXR1cm5zIGEgTGlzdCBjb250YWluaW5nIHRoZSBjaGlsZHJlbiBtb2RlbCBvYmplY3RzLgotICAgICAqIE11c3Qgbm90IHJldHVybiBudWxsLCBpbnN0ZWFkIHVzZSB0aGUgc3VwZXIgd2hpY2ggcmV0dXJucyBhbiBlbXB0eSBsaXN0LgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRVaU5vZGUoKS5nZXRVaUNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgICAgIGdldFVpTm9kZSgpLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0gICAgICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgZ2V0VWlOb2RlKCkucmVtb3ZlVXBkYXRlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0gICAgICAgIGlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLCBnZXRGaWd1cmUoKSwgZ2V0Qm91bmRzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSB2aXN1YWxzIG9mIHRoZSBjaGlsZHJlbiBhcyB3ZWxsCi0gICAgICAgIHJlZnJlc2hDaGlsZHJlblZpc3VhbHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW5WaXN1YWxzKCkgewotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFVpRWxlbWVudEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudEVkaXRQYXJ0IGNoaWxkUGFydCA9IChVaUVsZW1lbnRFZGl0UGFydCljaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQYXJ0LnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSVVpVXBkYXRlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KLQotICAgIHB1YmxpYyB2b2lkIHVpRWxlbWVudE5vZGVVcGRhdGVkKFVpRWxlbWVudE5vZGUgdWlfbm9kZSwgVWlVcGRhdGVTdGF0ZSBzdGF0ZSkgewotICAgICAgICAvLyBUT0RPOiBvcHRpbWl6ZSBieSByZWZyZXNoaW5nIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgQVRUUl9VUERBVEVEOgotICAgICAgICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENISUxEUkVOX0NIQU5HRUQ6Ci0gICAgICAgICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLQotICAgICAgICAgICAgLy8gbmV3IGNoaWxkcmVuIGxpc3QsIG5lZWQgdG8gdXBkYXRlIHRoZSBsYXlvdXQKLSAgICAgICAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUkVBVEVEOgotICAgICAgICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFTEVURUQ6Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIExvY2FsIG1ldGhvZHMKLQotICAgIC8qKiBAcmV0dXJuIFRoZSBvYmplY3QgbW9kZWwgY2FzdGVkIHRvIGFuIHtAbGluayBVaUVsZW1lbnROb2RlfSAqLwotICAgIHB1YmxpYyBmaW5hbCBVaUVsZW1lbnROb2RlIGdldFVpTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIChVaUVsZW1lbnROb2RlKSBnZXRNb2RlbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0VWlOb2RlKCkuZ2V0RGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBVaUVsZW1lbnRFZGl0UGFydCBnZXRFZGl0UGFydFBhcmVudCgpIHsKLSAgICAgICAgRWRpdFBhcnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBVaUVsZW1lbnRFZGl0UGFydCkgewotICAgICAgICAgICAgcmV0dXJuIChVaUVsZW1lbnRFZGl0UGFydClwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdpdmVuIFhNTCBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlIGFzIGEge0BsaW5rIFN0cmluZ30sIGlmIGl0IGV4aXN0cywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFN0cmluZ0F0dHIoU3RyaW5nIGF0dHJOYW1lKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0VWlOb2RlKCk7Ci0gICAgICAgIGlmICh1aU5vZGUuZ2V0WG1sTm9kZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGUgeG1sTm9kZSA9IHVpTm9kZS5nZXRYbWxOb2RlKCk7Ci0gICAgICAgICAgICBpZiAoeG1sTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIG5vZGVBdHRyaWJ1dGVzID0geG1sTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGVBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSBhdHRyID0gbm9kZUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBtb2RlbCA9IChVaUVsZW1lbnROb2RlKWdldE1vZGVsKCk7Ci0KLSAgICAgICAgT2JqZWN0IGVkaXREYXRhID0gbW9kZWwuZ2V0RWRpdERhdGEoKTsKLQotICAgICAgICBpZiAoZWRpdERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYXNzZXJ0IHdpdGggZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gcHJldmVudCBpbXBvcnQgY2hhbmdlcyB0byBhbm90aGVyCi0gICAgICAgICAgICAvLyBSZWN0YW5nbGUgY2xhc3MuCi0gICAgICAgICAgICBhc3NlcnQgKGVkaXREYXRhIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiAoUmVjdGFuZ2xlKWVkaXREYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0dXJuIGEgZHVtbXkgcmVjdAotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBFZGl0UGFydCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgZm9yIHRoZSBzcGVjaWZpZWQgUmVxdWVzdC4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGluc3RhbmNlIHRoaXMgaXMgY2FsbGVkIGR1cmluZyBkcmFnJ24nZHJvcCB3aXRoIGEgQ3JlYXRlUmVxdWVzdC4KLSAgICAgKiA8cC8+Ci0gICAgICogUmVqZWN0IGJlaW5nIGEgdGFyZ2V0IGZvciBlbGVtZW50cyB3aGljaCBkZXNjcmlwdG9yIGRvZXMgbm90IGFsbG93IGNoaWxkcmVuLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DUkVBVEUpIHsKLSAgICAgICAgICAgIC8vIFJlamVjdCBiZWluZyBhIHRhcmdldCBmb3IgZWxlbWVudHMgd2hpY2ggZGVzY3JpcHRvciBkb2VzIG5vdCBhbGxvdyBjaGlsZHJlbi4KLSAgICAgICAgICAgIGlmICghZ2V0VWlOb2RlKCkuZ2V0RGVzY3JpcHRvcigpLmhhc0NoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSBkZXJpdmVkIGNsYXNzZXMge0BsaW5rIFVpRG9jdW1lbnRFZGl0UGFydH0gYW5kIHtAbGluayBVaUxheW91dEVkaXRQYXJ0fQotICAgICAqIHRvIGFjY2VwdCBkcmFnJ24nZHJvcCBvZiBuZXcgaXRlbXMgZnJvbSB0aGUgcGFsZXR0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXlvdXRFZGl0UGFydCBUaGUgbGF5b3V0IGVkaXQgcGFydCB3aGVyZSB0aGlzIHBvbGljeSBpcyBpbnN0YWxsZWQuIEl0IGNhbgotICAgICAqICAgICAgICBiZSBlaXRoZXIgYSB7QGxpbmsgVWlEb2N1bWVudEVkaXRQYXJ0fSBvciBhIHtAbGluayBVaUxheW91dEVkaXRQYXJ0fS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGF5b3V0RWRpdFBvbGljeShmaW5hbCBVaUVsZW1lbnRFZGl0UGFydCBsYXlvdXRFZGl0UGFydCkgewotICAgICAgICAvLyBUaGlzIHBvbGljeSBpbmRpY2F0ZXMgaG93IGVsZW1lbnRzIGNhbiBiZSBjb25zdHJhaW5lZCBieSB0aGUgbGF5b3V0LgotICAgICAgICAvLyBUT0RPIFJpZ2h0IG5vdyB3ZSB1c2UgdGhlIFhZIGxheW91dCBwb2xpY3kgc2luY2Ugb3VyIGNvbnN0cmFpbnRzIGFyZQotICAgICAgICAvLyBoYW5kbGVkIGJ5IHRoZSBhbmRyb2lkIHJlbmRlcmluZyBlbmdpbmUgcmF0aGVyIHRoYW4gR0VGLiBUd2VhayBhcwotICAgICAgICAvLyBhcHByb3ByaWF0ZS4KLSAgICAgICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgIG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFdlIGRvbid0IGFsbG93IGxheW91dCBjaGlsZHJlbiB0byBiZSByZXNpemVkIHlldC4KLSAgICAgICAgICAgICAqIDxwLz4KLSAgICAgICAgICAgICAqIFR5cGljYWwgY2hvaWNlcyB3b3VsZCBiZToKLSAgICAgICAgICAgICAqIDx1bD4KLSAgICAgICAgICAgICAqIDxsaT4gUmVzaXphYmxlRWRpdFBvbGljeSwgdG8gYWxsb3cgZm9yIHNlbGVjdGlvbiwgbW92ZSBhbmQgcmVzaXplLgotICAgICAgICAgICAgICogPGxpPiBOb25SZXNpemFibGVFZGl0UG9saWN5LCB0byBhbGxvdyBmb3Igc2VsZWN0aW9uLCBtb3ZlIGJ1dCBub3QgcmVzaXplLgotICAgICAgICAgICAgICogPGxpPiBTZWxlY3Rpb25FZGl0UG9saWN5IHRvIGFsbG93IGZvciBvbmx5IHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAgICAgKiBUT0RPOiBtYWtlIHRoaXMgZGVwZW5kIG9uIHRoZSBwYXJ0IGxheW91dC4gRm9yIGFuIEFic29sdXRlTGF5b3V0IHdlIHNob3VsZAotICAgICAgICAgICAgICogcHJvYmFibHkgdXNlIGEgTm9uUmVzaXphYmxlRWRpdFBvbGljeSBhbmQgU2VsZWN0aW9uRWRpdFBvbGljeSBmb3IgdGhlIHJlc3QuCi0gICAgICAgICAgICAgKiBXaGV0aGVyIHRvIHVzZSBSZXNpemFibGVFZGl0UG9saWN5IG9yIE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgc2hvdWxkIGRlcGVuZAotICAgICAgICAgICAgICogb24gdGhlIGNoaWxkIGluIGFuIEFic29sdXRlTGF5b3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFVpRWxlbWVudEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUmVzaXphYmxlU2VsZWN0aW9uRWRpdFBvbGljeSgoVWlFbGVtZW50RWRpdFBhcnQpIGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgRWxlbWVudERlc2NyaXB0b3IgaW4gdGhlIHJlcXVlc3QuZmFjdG9yeS50eXBlCi0gICAgICAgICAgICAgICAgT2JqZWN0IG5ld1R5cGUgPSByZXF1ZXN0LmdldE5ld09iamVjdFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3VHlwZSBpbnN0YW5jZW9mIEVsZW1lbnREZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IHdoZXJlID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgb3JpZ2luID0gZ2V0TGF5b3V0Q29udGFpbmVyKCkuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoZXJlLnRyYW5zbGF0ZShvcmlnaW4uZ2V0TmVnYXRlZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaG9zdCBpcyB0aGUgRWRpdFBhcnQgd2hlcmUgdGhpcyBwb2xpY3kgaXMgaW5zdGFsbGVkLAotICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHRoaXMgVWlFbGVtZW50RWRpdFBhcnQuCi0gICAgICAgICAgICAgICAgICAgIEVkaXRQYXJ0IGhvc3QgPSBnZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0IGluc3RhbmNlb2YgVWlFbGVtZW50RWRpdFBhcnQpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50Q3JlYXRlQ29tbWFuZCgoRWxlbWVudERlc2NyaXB0b3IpIG5ld1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVaUVsZW1lbnRFZGl0UGFydCkgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2hvd0xheW91dFRhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgICAgIHN1cGVyLnNob3dMYXlvdXRUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQotICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldDogIiArIHJlcXVlc3QudG9TdHJpbmcoKSArICIgLS0gIiArIGxheW91dEVkaXRQYXJ0LmdldFVpTm9kZSgpLmdldEJyZWFkY3J1bWJUcmFpbERlc2NyaXB0aW9uKGZhbHNlKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0RWRpdFBhcnQgaW5zdGFuY2VvZiBVaUxheW91dEVkaXRQYXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IGluc3RhbmNlb2YgRHJvcFJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgd2hlcmUgPSAoKERyb3BSZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgb3JpZ2luID0gZ2V0TGF5b3V0Q29udGFpbmVyKCkuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoZXJlLnRyYW5zbGF0ZShvcmlnaW4uZ2V0TmVnYXRlZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAoKFVpTGF5b3V0RWRpdFBhcnQpIGxheW91dEVkaXRQYXJ0KS5zaG93RHJvcFRhcmdldCh3aGVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVyYXNlTGF5b3V0VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuZXJhc2VMYXlvdXRUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0RWRpdFBhcnQgaW5zdGFuY2VvZiBVaUxheW91dEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICgoVWlMYXlvdXRFZGl0UGFydCkgbGF5b3V0RWRpdFBhcnQpLmhpZGVEcm9wVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNpemVPbkRyb3BGZWVkYmFjayhDcmVhdGVSZXF1ZXN0IGNyZWF0ZVJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHVuZGVyc3RhbmQgaWYgdGhpcyBpcyB1c2VmdWwgZm9yIHVzIG9yIHJlbW92ZQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVTaXplT25Ecm9wRmVlZGJhY2soY3JlYXRlUmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOb25SZXNpemFibGVTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVaUVsZW1lbnRFZGl0UGFydCBtRWRpdFBhcnQ7Ci0KLSAgICAgICAgcHVibGljIE5vblJlc2l6YWJsZVNlbGVjdGlvbkVkaXRQb2xpY3koVWlFbGVtZW50RWRpdFBhcnQgZWRpdFBhcnQpIHsKLSAgICAgICAgICAgIG1FZGl0UGFydCA9IGVkaXRQYXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICBtRWRpdFBhcnQuaGlkZVNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICBtRWRpdFBhcnQuc2hvd1NlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpRWxlbWVudFRyZWVFZGl0UGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpRWxlbWVudFRyZWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTczN2Y4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRUcmVlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdFRyZWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLQotLyoqCi0gKiBCYXNlIHtAbGluayBBYnN0cmFjdFRyZWVFZGl0UGFydH0gdG8gcmVwcmVzZW50IHtAbGluayBVaUVsZW1lbnROb2RlfSBvYmplY3RzIGluIHRoZQotICoge0BsaW5rIElDb250ZW50T3V0bGluZVBhZ2V9IGxpbmtlZCB0byB0aGUgbGF5b3V0IGVkaXRvci4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1wdWJsaWMgY2xhc3MgVWlFbGVtZW50VHJlZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RUcmVlRWRpdFBhcnQgewotCi0gICAgcHVibGljIFVpRWxlbWVudFRyZWVFZGl0UGFydChVaUVsZW1lbnROb2RlIHVpRWxlbWVudE5vZGUpIHsKLSAgICAgICAgc2V0TW9kZWwodWlFbGVtZW50Tm9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFVpTm9kZSgpLmdldERlc2NyaXB0b3IoKS5nZXRJY29uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gZ2V0VWlOb2RlKCkuZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotICAgICAgICBpZiAoIWlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgLy8gVE9ETwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FzdGVkIG1vZGVsIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIHtAbGluayBBYnN0cmFjdFRyZWVFZGl0UGFydH0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVpRWxlbWVudE5vZGUgZ2V0VWlOb2RlKCkgewotICAgICAgICByZXR1cm4gKFVpRWxlbWVudE5vZGUpZ2V0TW9kZWwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRUcmVlRWRpdFBhcnRGYWN0b3J5LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlFbGVtZW50VHJlZUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAyOThjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRUcmVlRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdFRyZWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotCi0vKioKLSAqIHtAbGluayBFZGl0UGFydEZhY3Rvcnl9IHRvIGNyZWF0ZSB7QGxpbmsgQWJzdHJhY3RUcmVlRWRpdFBhcnR9IGZvciB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gb2JqZWN0cy4KLSAqIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgaW4gdGhlIHtAbGluayBJQ29udGVudE91dGxpbmVQYWdlfSBsaW5rZWQgdG8gdGhlIGxheW91dCBlZGl0b3IuCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGNsYXNzIFVpRWxlbWVudFRyZWVFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0gICAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVaURvY3VtZW50VHJlZUVkaXRQYXJ0KChVaURvY3VtZW50Tm9kZSkgbW9kZWwpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBub2RlID0gKFVpRWxlbWVudE5vZGUpIG1vZGVsOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmhhc0NoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpTGF5b3V0VHJlZUVkaXRQYXJ0KG5vZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpVmlld1RyZWVFZGl0UGFydChub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRzRWRpdFBhcnRGYWN0b3J5LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlFbGVtZW50c0VkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE3OTM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUVsZW1lbnRzRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIGZhY3RvcnkgdGhhdCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgRWRpdFBhcnR9IGZvciBhIGdpdmVuIG1vZGVsIG9iamVjdC4KLSAqIDxwLz4KLSAqIFRoZSBvbmx5IG1vZGVsIG9iamVjdHMgd2UgdXNlIGFyZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gb2JqZWN0cyBhbmQgdGhleSBhcmUKLSAqIGVkaXRlZCB1c2luZyB7QGxpbmsgVWlFbGVtZW50RWRpdFBhcnR9LgotICoKLSAqIEBzaW5jZSBHTEUxCi0gKi8KLXB1YmxpYyBjbGFzcyBVaUVsZW1lbnRzRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgRGlzcGxheSBtRGlzcGxheTsKLQotICAgIHB1YmxpYyBVaUVsZW1lbnRzRWRpdFBhcnRGYWN0b3J5KERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICBtRGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgfQotCi0gICAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVaURvY3VtZW50RWRpdFBhcnQoKFVpRG9jdW1lbnROb2RlKSBtb2RlbCwgbURpc3BsYXkpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBub2RlID0gKFVpRWxlbWVudE5vZGUpIG1vZGVsOwotCi0gICAgICAgICAgICBpZiAobm9kZS5nZXREZXNjcmlwdG9yKCkuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWlMYXlvdXRFZGl0UGFydChub2RlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBVaVZpZXdFZGl0UGFydChub2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUxheW91dEVkaXRQYXJ0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlMYXlvdXRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ2ZWRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaUxheW91dEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQucGFydHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBHcmFwaGljYWwgZWRpdCBwYXJ0IGZvciBhbiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gdGhhdCByZXByZXNlbnRzIGEgVmlld0xheW91dC4KLSAqIDxwLz4KLSAqIEl0IGFjdHMgYXMgYSBzaW1wbGUgY29udGFpbmVyLgotICoKLSAqIEBzaW5jZSBHTEUxCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVaUxheW91dEVkaXRQYXJ0IGV4dGVuZHMgVWlFbGVtZW50RWRpdFBhcnQgewotCi0gICAgc3RhdGljIGNsYXNzIEhpZ2hsaWdodEluZm8gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBkcmF3RHJvcEJvcmRlcjsKLSAgICAgICAgcHVibGljIFVpRWxlbWVudEVkaXRQYXJ0W10gY2hpbGRQYXJ0czsKLSAgICAgICAgcHVibGljIFBvaW50IGFuY2hvclBvaW50OwotICAgICAgICBwdWJsaWMgUG9pbnQgbGluZVBvaW50c1tdOwotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBQb2ludCB0ZW1wUG9pbnRzW10gPSBuZXcgUG9pbnRbXSB7IG5ldyBQb2ludCgpLCBuZXcgUG9pbnQoKSB9OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgZHJhd0Ryb3BCb3JkZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoaWxkUGFydHMgPSBudWxsOwotICAgICAgICAgICAgYW5jaG9yUG9pbnQgPSBudWxsOwotICAgICAgICAgICAgbGluZVBvaW50cyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhpZ2hsaWdodEluZm8gbUhpZ2hsaWdodEluZm8gPSBuZXcgSGlnaGxpZ2h0SW5mbygpOwotCi0gICAgcHVibGljIFVpTGF5b3V0RWRpdFBhcnQoVWlFbGVtZW50Tm9kZSB1aUVsZW1lbnROb2RlKSB7Ci0gICAgICAgIHN1cGVyKHVpRWxlbWVudE5vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0KLSAgICAgICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwgbmV3IENvbnRhaW5lckVkaXRQb2xpY3koKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGluc3RhbGxMYXlvdXRFZGl0UG9saWN5KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLSAgICAgICAgSUZpZ3VyZSBmID0gbmV3IExheW91dEZpZ3VyZSgpOwotICAgICAgICBmLnNldExheW91dE1hbmFnZXIobmV3IFhZTGF5b3V0KCkpOwotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotICAgICAgICBJRmlndXJlIGYgPSBnZXRGaWd1cmUoKTsKLSAgICAgICAgaWYgKGYgaW5zdGFuY2VvZiBFbGVtZW50RmlndXJlKSB7Ci0gICAgICAgICAgICAoKEVsZW1lbnRGaWd1cmUpIGYpLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLSAgICAgICAgSUZpZ3VyZSBmID0gZ2V0RmlndXJlKCk7Ci0gICAgICAgIGlmIChmIGluc3RhbmNlb2YgRWxlbWVudEZpZ3VyZSkgewotICAgICAgICAgICAgKChFbGVtZW50RmlndXJlKSBmKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93RHJvcFRhcmdldChQb2ludCB3aGVyZSkgewotICAgICAgICBpZiAod2hlcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhpZ2hsaWdodEluZm8uY2xlYXIoKTsKLSAgICAgICAgICAgIG1IaWdobGlnaHRJbmZvLmRyYXdEcm9wQm9yZGVyID0gdHJ1ZTsKLSAgICAgICAgICAgIERyb3BGZWVkYmFjay5jb21wdXRlRHJvcEZlZWRiYWNrKHRoaXMsIG1IaWdobGlnaHRJbmZvLCB3aGVyZSk7Ci0KLSAgICAgICAgICAgIElGaWd1cmUgZiA9IGdldEZpZ3VyZSgpOwotICAgICAgICAgICAgaWYgKGYgaW5zdGFuY2VvZiBMYXlvdXRGaWd1cmUpIHsKLSAgICAgICAgICAgICAgICAoKExheW91dEZpZ3VyZSkgZikuc2V0SGlnaGxpZ2hJbmZvKG1IaWdobGlnaHRJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGVEcm9wVGFyZ2V0KCkgewotICAgICAgICBtSGlnaGxpZ2h0SW5mby5jbGVhcigpOwotICAgICAgICBJRmlndXJlIGYgPSBnZXRGaWd1cmUoKTsKLSAgICAgICAgaWYgKGYgaW5zdGFuY2VvZiBMYXlvdXRGaWd1cmUpIHsKLSAgICAgICAgICAgICgoTGF5b3V0RmlndXJlKSBmKS5zZXRIaWdobGlnaEluZm8obUhpZ2hsaWdodEluZm8pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpTGF5b3V0VHJlZUVkaXRQYXJ0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlMYXlvdXRUcmVlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3OGI0Ni4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvcGFydHMvVWlMYXlvdXRUcmVlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFVpRWxlbWVudFRyZWVFZGl0UGFydH0gZm9yIGxheW91dCBvYmplY3RzLgotICoKLSAqIEBzaW5jZSBHTEUxCi0gKi8KLXB1YmxpYyBjbGFzcyBVaUxheW91dFRyZWVFZGl0UGFydCBleHRlbmRzIFVpRWxlbWVudFRyZWVFZGl0UGFydCB7Ci0KLSAgICBwdWJsaWMgVWlMYXlvdXRUcmVlRWRpdFBhcnQoVWlFbGVtZW50Tm9kZSBub2RlKSB7Ci0gICAgICAgIHN1cGVyKG5vZGUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRVaU5vZGUoKS5nZXRVaUNoaWxkcmVuKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaVZpZXdFZGl0UGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpVmlld0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGUxY2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpVmlld0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5wYXJ0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLQotLyoqCi0gKiBHcmFwaGljYWwgZWRpdCBwYXJ0IGZvciBhbiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gdGhhdCByZXByZXNlbnRzIGEgVmlldy4KLSAqCi0gKiBAc2luY2UgR0xFMQotICovCi1wdWJsaWMgY2xhc3MgVWlWaWV3RWRpdFBhcnQgZXh0ZW5kcyBVaUVsZW1lbnRFZGl0UGFydCB7Ci0KLSAgICBwdWJsaWMgVWlWaWV3RWRpdFBhcnQoVWlFbGVtZW50Tm9kZSB1aUVsZW1lbnROb2RlKSB7Ci0gICAgICAgIHN1cGVyKHVpRWxlbWVudE5vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLSAgICAgICAgSUZpZ3VyZSBmID0gbmV3IEVsZW1lbnRGaWd1cmUoKTsKLSAgICAgICAgZi5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBYWUxheW91dCgpKTsKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLSAgICAgICAgSUZpZ3VyZSBmID0gZ2V0RmlndXJlKCk7Ci0gICAgICAgIGlmIChmIGluc3RhbmNlb2YgRWxlbWVudEZpZ3VyZSkgewotICAgICAgICAgICAgKChFbGVtZW50RmlndXJlKSBmKS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0gICAgICAgIElGaWd1cmUgZiA9IGdldEZpZ3VyZSgpOwotICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEVsZW1lbnRGaWd1cmUpIHsKLSAgICAgICAgICAgICgoRWxlbWVudEZpZ3VyZSkgZikuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpVmlld1RyZWVFZGl0UGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L3BhcnRzL1VpVmlld1RyZWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNjOTUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9wYXJ0cy9VaVZpZXdUcmVlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LnBhcnRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVaUVsZW1lbnRUcmVlRWRpdFBhcnR9IGZvciB2aWV3IG9iamVjdHMuCi0gKgotICogQHNpbmNlIEdMRTEKLSAqLwotcHVibGljIGNsYXNzIFVpVmlld1RyZWVFZGl0UGFydCBleHRlbmRzIFVpRWxlbWVudFRyZWVFZGl0UGFydCB7Ci0KLSAgICBwdWJsaWMgVWlWaWV3VHJlZUVkaXRQYXJ0KFVpRWxlbWVudE5vZGUgbm9kZSkgewotICAgICAgICBzdXBlcihub2RlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC91aW1vZGVsL1VpVmlld0VsZW1lbnROb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9sYXlvdXQvdWltb2RlbC9VaVZpZXdFbGVtZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDNmMzM5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC91aW1vZGVsL1VpVmlld0VsZW1lbnROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9ycy5WaWV3RWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gZm9yIHRoZSB7QGxpbmsgVmlld0VsZW1lbnREZXNjcmlwdG9yfXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVaVZpZXdFbGVtZW50Tm9kZSBleHRlbmRzIFVpRWxlbWVudE5vZGUgewotCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gbUNhY2hlZEF0dHJpYnV0ZURlc2NyaXB0b3JzOwotCi0gICAgcHVibGljIFVpVmlld0VsZW1lbnROb2RlKFZpZXdFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICBzdXBlcihlbGVtZW50RGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBBdHRyaWJ1dGVEZXNjcmlwdG9yIGFycmF5IHRoYXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBVaVBhcmVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGFycmF5IG1lcmdlcyBib3RoICJkaXJlY3QiIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZGVzY3JpcHRvciBsYXlvdXQgYXR0cmlidXRlcy4KLSAgICAgKiBUaGUgYXJyYXkgaW5zdGFuY2UgaXMgY2FjaGVkIGFuZCBjbGVhcmVkIGlmIHRoZSBVaVBhcmVudCBpcyBjaGFuZ2VkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gZ2V0QXR0cmlidXRlRGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVkQXR0cmlidXRlRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9yczsKLSAgICAgICAgfQotCi0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlfcGFyZW50ID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGRpcmVjdF9hdHRycyA9IHN1cGVyLmdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9ycyA9IGRpcmVjdF9hdHRyczsKLQotICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gbGF5b3V0X2F0dHJzID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBuZWVkX3htbG5zID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHVpX3BhcmVudCBpbnN0YW5jZW9mIFVpRG9jdW1lbnROb2RlKSB7Ci0gICAgICAgICAgICAvLyBMaW1pdGF0aW9uOiByaWdodCBub3cgdGhlIGxheW91dCBiZWhhdmVzIGFzIGlmIGV2ZXJ5dGhpbmcgd2FzCi0gICAgICAgICAgICAvLyBvd25lZCBieSBhIEZyYW1lTGF5b3V0LgotICAgICAgICAgICAgLy8gVE9ETyByZXBsYWNlIGJ5IHNvbWV0aGluZyB1c2VyLWNvbmZpZ3VyYWJsZS4KLQotICAgICAgICAgICAgTGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gbGF5b3V0RGVzY3JpcHRvcnMgPSBudWxsOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldEVkaXRvcigpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gY3VycmVudFNkay5nZXRUYXJnZXQocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBjdXJyZW50U2RrLmdldFRhcmdldERhdGEodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0RGVzY3JpcHRvcnMgPSBkYXRhLmdldExheW91dERlc2NyaXB0b3JzKCkuZ2V0TGF5b3V0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsYXlvdXREZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBkZXNjIDogbGF5b3V0RGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgaW5zdGFuY2VvZiBWaWV3RWxlbWVudERlc2NyaXB0b3IgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmdldFhtbE5hbWUoKS5lcXVhbHMoQW5kcm9pZENvbnN0YW50cy5DTEFTU19OQU1FX0ZSQU1FTEFZT1VUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X2F0dHJzID0gKChWaWV3RWxlbWVudERlc2NyaXB0b3IpIGRlc2MpLmdldExheW91dEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfeG1sbnMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodWlfcGFyZW50IGluc3RhbmNlb2YgVWlWaWV3RWxlbWVudE5vZGUpewotICAgICAgICAgICAgbGF5b3V0X2F0dHJzID0KLSAgICAgICAgICAgICAgICAoKFZpZXdFbGVtZW50RGVzY3JpcHRvcikgdWlfcGFyZW50LmdldERlc2NyaXB0b3IoKSkuZ2V0TGF5b3V0QXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxheW91dF9hdHRycyA9PSBudWxsIHx8IGxheW91dF9hdHRycy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9yczsKLSAgICAgICAgfQotCi0gICAgICAgIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltkaXJlY3RfYXR0cnMubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dF9hdHRycy5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5lZWRfeG1sbnMgPyAxIDogMCldOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRpcmVjdF9hdHRycywgMCwKLSAgICAgICAgICAgICAgICBtQ2FjaGVkQXR0cmlidXRlRGVzY3JpcHRvcnMsIDAsCi0gICAgICAgICAgICAgICAgZGlyZWN0X2F0dHJzLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGF5b3V0X2F0dHJzLCAwLAotICAgICAgICAgICAgICAgIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9ycywgZGlyZWN0X2F0dHJzLmxlbmd0aCwKLSAgICAgICAgICAgICAgICBsYXlvdXRfYXR0cnMubGVuZ3RoKTsKLSAgICAgICAgaWYgKG5lZWRfeG1sbnMpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IG5ldyBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUyk7Ci0gICAgICAgICAgICBtQ2FjaGVkQXR0cmlidXRlRGVzY3JpcHRvcnNbZGlyZWN0X2F0dHJzLmxlbmd0aCArIGxheW91dF9hdHRycy5sZW5ndGhdID0gZGVzYzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtQ2FjaGVkQXR0cmlidXRlRGVzY3JpcHRvcnM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIFVJIG5vZGUuCi0gICAgICogPHAvPgotICAgICAqIEFsc28gcmVtb3ZlcyB0aGUgY2FjaGVkIEF0dHJpYnV0ZURlc2NyaXB0b3IgYXJyYXkgdGhhdCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IFVpUGFyZW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVpUGFyZW50KFVpRWxlbWVudE5vZGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyLnNldFVpUGFyZW50KHBhcmVudCk7Ci0gICAgICAgIG1DYWNoZWRBdHRyaWJ1dGVEZXNjcmlwdG9ycyA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvTWFuaWZlc3RDb250ZW50QXNzaXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9NYW5pZmVzdENvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5MDQ4Zi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9NYW5pZmVzdENvbnRlbnRBc3Npc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkQ29udGVudEFzc2lzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOwotCi0vKioKLSAqIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBmb3IgQW5kcm9pZE1hbmlmZXN0LnhtbAotICovCi1maW5hbCBjbGFzcyBNYW5pZmVzdENvbnRlbnRBc3Npc3QgZXh0ZW5kcyBBbmRyb2lkQ29udGVudEFzc2lzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RDb250ZW50QXNzaXN0IAotICAgICAqLwotICAgIHB1YmxpYyBNYW5pZmVzdENvbnRlbnRBc3Npc3QoKSB7Ci0gICAgICAgIHN1cGVyKEFuZHJvaWRUYXJnZXREYXRhLkRFU0NSSVBUT1JfTUFOSUZFU1QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L01hbmlmZXN0RWRpdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9NYW5pZmVzdEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM3Njg3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L01hbmlmZXN0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlcy5BcHBsaWNhdGlvblBhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QucGFnZXMuSW5zdHJ1bWVudGF0aW9uUGFnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlcy5PdmVydmlld1BhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QucGFnZXMuUGVybWlzc2lvblBhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JRmlsZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkWFBhdGhGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KLS8qKgotICogTXVsdGktcGFnZSBmb3JtIGVkaXRvciBmb3IgQW5kcm9pZE1hbmlmZXN0LnhtbC4gCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYW5pZmVzdEVkaXRvciBleHRlbmRzIEFuZHJvaWRFZGl0b3IgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBBbmRyb2lkQ29uc3RhbnRzLkVESVRPUlNfTkFNRVNQQUNFICsgIi5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKiBSb290IG5vZGUgb2YgdGhlIFVJIGVsZW1lbnQgaGllcmFyY2h5ICovCi0gICAgcHJpdmF0ZSBVaUVsZW1lbnROb2RlIG1VaU1hbmlmZXN0Tm9kZTsKLSAgICAvKiogVGhlIEFwcGxpY2F0aW9uIFBhZ2UgdGFiICovCi0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvblBhZ2UgbUFwcFBhZ2U7Ci0gICAgLyoqIFRoZSBPdmVydmlldyBNYW5pZmVzdCBQYWdlIHRhYiAqLwotICAgIHByaXZhdGUgT3ZlcnZpZXdQYWdlIG1PdmVydmlld1BhZ2U7Ci0gICAgLyoqIFRoZSBQZXJtaXNzaW9uIFBhZ2UgdGFiICovCi0gICAgcHJpdmF0ZSBQZXJtaXNzaW9uUGFnZSBtUGVybWlzc2lvblBhZ2U7Ci0gICAgLyoqIFRoZSBJbnN0cnVtZW50YXRpb24gUGFnZSB0YWIgKi8KLSAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvblBhZ2UgbUluc3RydW1lbnRhdGlvblBhZ2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBJRmlsZUxpc3RlbmVyIG1NYXJrZXJNb25pdG9yOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9ybSBlZGl0b3IgZm9yIEFuZHJvaWRNYW5pZmVzdC54bWwuCi0gICAgICovCi0gICAgcHVibGljIE1hbmlmZXN0RWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VNb25pdG9yLmdldE1vbml0b3IoKS5yZW1vdmVGaWxlTGlzdGVuZXIobU1hcmtlck1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBVSSBlbGVtZW50IGhpZXJhcmNoeSwgd2hpY2ggaGVyZQotICAgICAqIGlzIHRoZSAibWFuaWZlc3QiIG5vZGUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgZ2V0VWlSb290Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1VaU1hbmlmZXN0Tm9kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTWFuaWZlc3QgZGVzY3JpcHRvcnMgZm9yIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpIHsKLSAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGdldFRhcmdldERhdGEoKTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLSBCYXNlIENsYXNzIE92ZXJyaWRlcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlICJzYXZlIGFzIiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgZWRpdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBTYXZlLUFzIGlzIGEgdmFsaWQgb3BlcmF0aW9uIGZvciB0aGUgTWFuaWZlc3RFZGl0b3Igc2luY2UgaXQgYWN0cyBvbiBhCi0gICAgICogc2luZ2xlIHNvdXJjZSBmaWxlLiAKLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHZhcmlvdXMgZm9ybSBwYWdlcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtUGFnZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRQYWdlKG1PdmVydmlld1BhZ2UgPSBuZXcgT3ZlcnZpZXdQYWdlKHRoaXMpKTsKLSAgICAgICAgICAgIGFkZFBhZ2UobUFwcFBhZ2UgPSBuZXcgQXBwbGljYXRpb25QYWdlKHRoaXMpKTsKLSAgICAgICAgICAgIGFkZFBhZ2UobVBlcm1pc3Npb25QYWdlID0gbmV3IFBlcm1pc3Npb25QYWdlKHRoaXMpKTsKLSAgICAgICAgICAgIGFkZFBhZ2UobUluc3RydW1lbnRhdGlvblBhZ2UgPSBuZXcgSW5zdHJ1bWVudGF0aW9uUGFnZSh0aGlzKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkVycm9yIGNyZWF0aW5nIG5lc3RlZCBwYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ2hhbmdlIHRoZSB0YWIvdGl0bGUgbmFtZSB0byBpbmNsdWRlIHRoZSBwcm9qZWN0IG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gZ2V0SW5wdXRGaWxlKCk7Ci0gICAgICAgIGlmIChpbnB1dEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnRNb25pdG9yaW5nTWFya2VycygpOwotICAgICAgICAgICAgc2V0UGFydE5hbWUoU3RyaW5nLmZvcm1hdCgiJTEkcyBNYW5pZmVzdCIsIGlucHV0RmlsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIG5ldyBYTUwgTW9kZWwsIHdoaWNoIFhNTCByb290IG5vZGUgaXMgZ2l2ZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9kb2MgVGhlIFhNTCBkb2N1bWVudCwgaWYgYXZhaWxhYmxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHhtbE1vZGVsQ2hhbmdlZChEb2N1bWVudCB4bWxfZG9jKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgdWkgcm9vdCBub2RlIG9uIGRlbWFuZC4KLSAgICAgICAgaW5pdFVpUm9vdE5vZGUoZmFsc2UgLypmb3JjZSovKTsKLQotICAgICAgICBsb2FkRnJvbVhtbCh4bWxfZG9jKTsKLQotICAgICAgICBzdXBlci54bWxNb2RlbENoYW5nZWQoeG1sX2RvYyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBsb2FkRnJvbVhtbChEb2N1bWVudCB4bWxEb2MpIHsKLSAgICAgICAgbVVpTWFuaWZlc3ROb2RlLnNldFhtbERvY3VtZW50KHhtbERvYyk7Ci0gICAgICAgIGlmICh4bWxEb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgbWFuaWZlc3RfZGVzYyA9IG1VaU1hbmlmZXN0Tm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFhQYXRoIHhwYXRoID0gQW5kcm9pZFhQYXRoRmFjdG9yeS5uZXdYUGF0aCgpOwotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB4cGF0aC5ldmFsdWF0ZSgiLyIgKyBtYW5pZmVzdF9kZXNjLmdldFhtbE5hbWUoKSwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLk5PREUpOwotICAgICAgICAgICAgICAgIGFzc2VydCBub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhtYW5pZmVzdF9kZXNjLmdldFhtbE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBtYW5pZmVzdCBVSSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIAotICAgICAgICAgICAgICAgIG1VaU1hbmlmZXN0Tm9kZS5sb2FkRnJvbVhtbE5vZGUobm9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlhQYXRoIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGZpbmQgJyVzJyBlbGVtZW50IGluIFhNTC4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdF9kZXNjLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25EZXNjcmlwdG9yc0NoYW5nZWQoVWlFbGVtZW50Tm9kZSBvbGRNYW5pZmVzdE5vZGUpIHsKLSAgICAgICAgbVVpTWFuaWZlc3ROb2RlLnJlbG9hZEZyb21YbWxOb2RlKG9sZE1hbmlmZXN0Tm9kZS5nZXRYbWxOb2RlKCkpOwotCi0gICAgICAgIGlmIChtT3ZlcnZpZXdQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVydmlld1BhZ2UucmVmcmVzaFVpQXBwbGljYXRpb25Ob2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFwcFBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUFwcFBhZ2UucmVmcmVzaFVpQXBwbGljYXRpb25Ob2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtUGVybWlzc2lvblBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVBlcm1pc3Npb25QYWdlLnJlZnJlc2hVaU5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1JbnN0cnVtZW50YXRpb25QYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb25QYWdlLnJlZnJlc2hVaU5vZGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFuZCBwcm9jZXNzZXMgdGhlIGN1cnJlbnQgbWFya2VycyBhbmQgYWRkcyBhIGxpc3RlbmVyIGZvciBtYXJrZXIgY2hhbmdlcy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TW9uaXRvcmluZ01hcmtlcnMoKSB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGlucHV0RmlsZSA9IGdldElucHV0RmlsZSgpOwotICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZUZyb21FeGlzdGluZ01hcmtlcnMoaW5wdXRGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbU1hcmtlck1vbml0b3IgPSBuZXcgSUZpbGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWxlQ2hhbmdlZChJRmlsZSBmaWxlLCBJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXMsIGludCBraW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmVxdWFscyhpbnB1dEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWFya2VyQ2hhbmdlcyhtYXJrZXJEZWx0YXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmVzb3VyY2VNb25pdG9yLmdldE1vbml0b3IoKS5hZGRGaWxlTGlzdGVuZXIobU1hcmtlck1vbml0b3IsIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBtYXJrZXJzIG9mIHRoZSBzcGVjaWZpZWQge0BsaW5rIElGaWxlfSBhbmQgdXBkYXRlcyB0aGUgZXJyb3Igc3RhdHVzIG9mIAotICAgICAqIHtAbGluayBVaUVsZW1lbnROb2RlfXMgYW5kIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9cy4KLSAgICAgKiBAcGFyYW0gaW5wdXRGaWxlIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRnJvbUV4aXN0aW5nTWFya2VycyhJRmlsZSBpbnB1dEZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbWFya2VycyBmb3IgdGhlIGZpbGUKLSAgICAgICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gaW5wdXRGaWxlLmZpbmRNYXJrZXJzKEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FORFJPSUQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgZGVzYyA9IGdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBhcHBFbGVtZW50ID0gZGVzYy5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoYXBwRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgYXBwX3VpX25vZGUgPSBtVWlNYW5pZmVzdE5vZGUuZmluZFVpQ2hpbGROb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEVsZW1lbnQuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxVaUVsZW1lbnROb2RlPiBjaGlsZHJlbiA9IGFwcF91aV9ub2RlLmdldFVpQ2hpbGRyZW4oKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01hcmtlcihtYXJrZXIsIGNoaWxkcmVuLCBJUmVzb3VyY2VEZWx0YS5BRERFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBmaW5kTWFya2VycyBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uLCBpbiB3aGljaCBjYXNlLCB3ZSdsbCBkbyBub3RoaW5nLgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIHtAbGluayBJTWFya2VyfSBjaGFuZ2UuCi0gICAgICogQHBhcmFtIG1hcmtlckRlbHRhcyB0aGUgbGlzdCBvZiB7QGxpbmsgSU1hcmtlckRlbHRhfQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWFya2VyQ2hhbmdlcyhJTWFya2VyRGVsdGFbXSBtYXJrZXJEZWx0YXMpIHsKLSAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgZGVzY3JpcHRvcnMgPSBnZXRNYW5pZmVzdERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9ycyAhPSBudWxsICYmIGRlc2NyaXB0b3JzLmdldEFwcGxpY2F0aW9uRWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgYXBwX3VpX25vZGUgPSBtVWlNYW5pZmVzdE5vZGUuZmluZFVpQ2hpbGROb2RlKAotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycy5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKS5nZXRYbWxOYW1lKCkpOwotICAgICAgICAgICAgTGlzdDxVaUVsZW1lbnROb2RlPiBjaGlsZHJlbiA9IGFwcF91aV9ub2RlLmdldFVpQ2hpbGRyZW4oKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoSU1hcmtlckRlbHRhIG1hcmtlckRlbHRhIDogbWFya2VyRGVsdGFzKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc01hcmtlcihtYXJrZXJEZWx0YS5nZXRNYXJrZXIoKSwgY2hpbGRyZW4sIG1hcmtlckRlbHRhLmdldEtpbmQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBuZXcvb2xkL3VwZGF0ZWQgbWFya2VyLgotICAgICAqIEBwYXJhbSBtYXJrZXIgVGhlIG1hcmtlciBiZWluZyBhZGRlZC9yZW1vdmVkL2NoYW5nZWQKLSAgICAgKiBAcGFyYW0gbm9kZUxpc3QgdGhlIGxpc3Qgb2YgYWN0aXZpdHkvc2VydmljZS9wcm92aWRlci9yZWNlaXZlciBub2Rlcy4KLSAgICAgKiBAcGFyYW0ga2luZCB0aGUgY2hhbmdlIGtpbmQuIENhbiBiZSB7QGxpbmsgSVJlc291cmNlRGVsdGEjQURERUR9LAotICAgICAqIHtAbGluayBJUmVzb3VyY2VEZWx0YSNSRU1PVkVEfSwgb3Ige0BsaW5rIElSZXNvdXJjZURlbHRhI0NIQU5HRUR9Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNYXJrZXIoSU1hcmtlciBtYXJrZXIsIExpc3Q8VWlFbGVtZW50Tm9kZT4gbm9kZUxpc3QsIGludCBraW5kKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBtYXJrZXIKLSAgICAgICAgU3RyaW5nIG5vZGVUeXBlID0gbWFya2VyLmdldEF0dHJpYnV0ZShBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BVFRSX1RZUEUsIEVNUFRZKTsKLSAgICAgICAgaWYgKG5vZGVUeXBlID09IEVNUFRZKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FUVFJfQ0xBU1MsIEVNUFRZKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBFTVBUWSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpX25vZGUgOiBub2RlTGlzdCkgewotICAgICAgICAgICAgaWYgKHVpX25vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKS5lcXVhbHMobm9kZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChVaUF0dHJpYnV0ZU5vZGUgYXR0ciA6IHVpX25vZGUuZ2V0VWlBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuZ2V0RGVzY3JpcHRvcigpLmdldFhtbExvY2FsTmFtZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy5BTkRST0lEX05BTUVfQVRUUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmdldEN1cnJlbnRWYWx1ZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnNldEhhc0Vycm9yKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnNldEhhc0Vycm9yKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBpbml0aWFsIFVJIFJvb3QgTm9kZSwgaW5jbHVkaW5nIHRoZSBrbm93biBtYW5kYXRvcnkgZWxlbWVudHMuCi0gICAgICogQHBhcmFtIGZvcmNlIGlmIHRydWUsIGEgbmV3IFVpTWFuaWZlc3ROb2RlIGlzIHJlY3JlYXRlZCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRVaVJvb3ROb2RlKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgLy8gVGhlIG1hbmlmZXN0IFVJIG5vZGUgaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYgdGhlcmUncyBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlLgotICAgICAgICBpZiAobVVpTWFuaWZlc3ROb2RlICE9IG51bGwgJiYgZm9yY2UgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgbWFuaWZlc3REZXNjcmlwdG9yID0gZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1hbmlmZXN0RGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIHRoZSBvbGQgbWFuaWZlc3Qgbm9kZSBpZiBpdCBleGlzdHMKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgb2xkTWFuaWZlc3ROb2RlID0gbVVpTWFuaWZlc3ROb2RlOwotCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBtYW5pZmVzdEVsZW1lbnQgPSBtYW5pZmVzdERlc2NyaXB0b3IuZ2V0TWFuaWZlc3RFbGVtZW50KCk7ICAgCi0gICAgICAgICAgICBtVWlNYW5pZmVzdE5vZGUgPSBtYW5pZmVzdEVsZW1lbnQuY3JlYXRlVWlOb2RlKCk7Ci0gICAgICAgICAgICBtVWlNYW5pZmVzdE5vZGUuc2V0RWRpdG9yKHRoaXMpOwotICAgIAotICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBhbHdheXMgY3JlYXRlIHRoZSAvbWFuaWZlc3QvYXBwbGljYXRpb24gYW5kIC9tYW5pZmVzdC91c2VzLXNkayBub2RlcwotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgYXBwRWxlbWVudCA9IG1hbmlmZXN0RGVzY3JpcHRvci5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VudCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpX25vZGUgOiBtVWlNYW5pZmVzdE5vZGUuZ2V0VWlDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVpX25vZGUuZ2V0RGVzY3JpcHRvcigpID09IGFwcEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcHJlc2VudCkgewotICAgICAgICAgICAgICAgIG1VaU1hbmlmZXN0Tm9kZS5hcHBlbmROZXdVaUNoaWxkKGFwcEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcHBFbGVtZW50ID0gbWFuaWZlc3REZXNjcmlwdG9yLmdldFVzZXNTZGtFbGVtZW50KCk7Ci0gICAgICAgICAgICBwcmVzZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFVpRWxlbWVudE5vZGUgdWlfbm9kZSA6IG1VaU1hbmlmZXN0Tm9kZS5nZXRVaUNoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodWlfbm9kZS5nZXREZXNjcmlwdG9yKCkgPT0gYXBwRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwcmVzZW50KSB7Ci0gICAgICAgICAgICAgICAgbVVpTWFuaWZlc3ROb2RlLmFwcGVuZE5ld1VpQ2hpbGQoYXBwRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvbGRNYW5pZmVzdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9uRGVzY3JpcHRvcnNDaGFuZ2VkKG9sZE1hbmlmZXN0Tm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBkdW1teSBkZXNjcmlwdG9yL3Vpbm9kZSB1bnRpbCB3ZSBoYXZlIHJlYWwgZGVzY3JpcHRvcnMKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgPSBuZXcgRWxlbWVudERlc2NyaXB0b3IoIm1hbmlmZXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJ5IGRlc2NyaXB0b3JzIGR1ZSB0byBtaXNzaW5nIGRlY3JpcHRvcnMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyp0b29sdGlwKi8sIG51bGwgLypzZGtfdXJsKi8sIG51bGwgLyphdHRyaWJ1dGVzKi8sCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLypjaGlsZHJlbiovLCBmYWxzZSAvKm1hbmRhdG9yeSovKTsKLSAgICAgICAgICAgIG1VaU1hbmlmZXN0Tm9kZSA9IGRlc2MuY3JlYXRlVWlOb2RlKCk7Ci0gICAgICAgICAgICBtVWlNYW5pZmVzdE5vZGUuc2V0RWRpdG9yKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJRmlsZX0gYmVpbmcgZWRpdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb3VsZG4ndCBiZSBjb21wdXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElGaWxlIGdldElucHV0RmlsZSgpIHsKLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvTWFuaWZlc3RFZGl0b3JDb250cmlidXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvTWFuaWZlc3RFZGl0b3JDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmVjYTMwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L01hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGluc3RhbGxhdGlvbi9kZWluc3RhbGxhdGlvbiBvZiBnbG9iYWwgYWN0aW9ucyBmb3IgbXVsdGktcGFnZQotICogZWRpdG9ycy4gUmVzcG9uc2libGUgZm9yIHRoZSByZWRpcmVjdGlvbiBvZiBnbG9iYWwgYWN0aW9ucyB0byB0aGUgYWN0aXZlCi0gKiBlZGl0b3IuIE11bHRpLXBhZ2UgY29udHJpYnV0b3IgcmVwbGFjZXMgdGhlIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGluZGl2aWR1YWwKLSAqIGVkaXRvcnMgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotICogCi0gKiBUT0RPOiBEb2Vzbid0IGxvb2sgbGlrZSB3ZSBuZWVkIHRoaXMuIFJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotICogQGRlcHJlY2F0ZWQKLSAqLwotZmluYWwgY2xhc3MgTWFuaWZlc3RFZGl0b3JDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IG1BY3RpdmVFZGl0b3JQYXJ0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG11bHRpLXBhZ2UgY29udHJpYnV0b3IuCi0gICAgICogCi0gICAgICogTWFya2VkIGFzIFByaXZhdGUgc28gaXQgY2FuJ3QgYmUgaW5zdGFuY2lhdGVkLiBUaGlzIGlzIGEgY2hlYXAgd2F5IHRvIG1ha2Ugc3VyZQotICAgICAqIGl0J3Mgbm90IGJlaW5nIHVzZWQuIEFzIG5vdGVkIGluIGNvbnN0cnVjdG9yLCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBub3QgdXNlZC4KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgTWFuaWZlc3RFZGl0b3JDb250cmlidXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBlZGl0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIElBY3Rpb24gb3IgbnVsbCBpZiBlZGl0b3IgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpIHsKLSAgICAgICAgcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklEKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFEb2MpIE1ldGhvZCBkZWNsYXJlZCBpbgotICAgICAqIEFic3RyYWN0TXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAgICovCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgbUFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgSVRleHRFZGl0b3IgZWRpdG9yID0KLSAgICAgICAgICAgICAgICAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSA/IChJVGV4dEVkaXRvcilwYXJ0IDogbnVsbDsKLQotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRFTEVURSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0VMRUNUX0FMTCkpOwotICAgICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5GSU5EKSk7Ci0gICAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgIElERUFjdGlvbkZhY3RvcnkuQk9PS01BUksuZ2V0SWQoKSwgZ2V0QWN0aW9uKGVkaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCkpKTsKLSAgICAgICAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvTWFuaWZlc3RTb3VyY2VWaWV3ZXJDb25maWcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L01hbmlmZXN0U291cmNlVmlld2VyQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Zjc1ZWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvTWFuaWZlc3RTb3VyY2VWaWV3ZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3Q7Ci0KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRTb3VyY2VWaWV3ZXJDb25maWc7Ci0KLS8qKgotICogU291cmNlIFZpZXdlciBDb25maWd1cmF0aW9uIHRoYXQgY2FsbHMgaW4gTWFuaWZlc3RDb250ZW50QXNzaXN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFuaWZlc3RTb3VyY2VWaWV3ZXJDb25maWcgZXh0ZW5kcyBBbmRyb2lkU291cmNlVmlld2VyQ29uZmlnIHsKLQotICAgIHB1YmxpYyBNYW5pZmVzdFNvdXJjZVZpZXdlckNvbmZpZygpIHsKLSAgICAgICAgc3VwZXIobmV3IE1hbmlmZXN0Q29udGVudEFzc2lzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9kZXNjcmlwdG9ycy9BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2Nzg3MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9kZXNjcmlwdG9ycy9BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRGVzY3JpcHRvcnNVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5JRGVzY3JpcHRvclByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkxpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlJlZmVyZW5jZUF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuRGVjbGFyZVN0eWxlYWJsZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLQotLyoqCi0gKiBDb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBzdHJ1Y3R1cmUuCi0gKiA8cC8+Ci0gKiBUaGUgcm9vdCBlbGVtZW50IGFyZSBzdGF0aWMgaW5zdGFuY2VzIHdoaWNoIGFsd2F5cyBleGlzdHMuCi0gKiBIb3dldmVyIHRoZWlyIHN1Yi1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4gdGhlIFNESyBjaGFuZ2VzIG9yIGlzCi0gKiBsb2FkZWQgdGhlIGZpcnN0IHRpbWUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBpbXBsZW1lbnRzIElEZXNjcmlwdG9yUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX05PREVfTkFNRSA9ICJtYW5pZmVzdCI7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9NQU5JRkVTVF9TVFlMRUFCTEUgPSAiQW5kcm9pZE1hbmlmZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gUHVibGljIGF0dHJpYnV0ZXMgbmFtZXMsIGF0dHJpYnV0ZXMgZGVzY3JpcHRvcnMgYW5kIGVsZW1lbnRzIGRlc2NyaXB0b3JzCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9MQUJFTF9BVFRSID0gImxhYmVsIjsgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfTkFNRV9BVFRSICA9ICJuYW1lIjsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX0FUVFIgICAgICAgPSAicGFja2FnZSI7ICAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IE1hbmlmZXN0IGVsZW1lbnQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBNQU5JRkVTVF9FTEVNRU5UOwotICAgIC8qKiBUaGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBmb3IgdGhlIHJvb3QgQXBwbGljYXRpb24gZWxlbWVudC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIEFQUExJQ0FUSU9OX0VMRU1FTlQ7Ci0KLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IEluc3RydW1lbnRhdGlvbiBlbGVtZW50LiAqLwotICAgIHByaXZhdGUgZmluYWwgRWxlbWVudERlc2NyaXB0b3IgSU5UUlVNRU5UQVRJT05fRUxFTUVOVDsKLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IFBlcm1pc3Npb24gZWxlbWVudC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIFBFUk1JU1NJT05fRUxFTUVOVDsKLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IFVzZXNQZXJtaXNzaW9uIGVsZW1lbnQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBVU0VTX1BFUk1JU1NJT05fRUxFTUVOVDsKLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IFVzZXNTZGsgZWxlbWVudC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIFVTRVNfU0RLX0VMRU1FTlQ7Ci0KLSAgICAvKiogVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSByb290IFBlcm1pc3Npb25Hcm91cCBlbGVtZW50LiAqLwotICAgIHByaXZhdGUgZmluYWwgRWxlbWVudERlc2NyaXB0b3IgUEVSTUlTU0lPTl9HUk9VUF9FTEVNRU5UOwotICAgIC8qKiBUaGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBmb3IgdGhlIHJvb3QgUGVybWlzc2lvblRyZWUgZWxlbWVudC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIFBFUk1JU1NJT05fVFJFRV9FTEVNRU5UOwotCi0gICAgLyoqIFByaXZhdGUgcGFja2FnZSBhdHRyaWJ1dGUgZm9yIHRoZSBtYW5pZmVzdCBlbGVtZW50LiBOZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5LiAqLwotICAgIHByaXZhdGUgZmluYWwgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgUEFDS0FHRV9BVFRSX0RFU0M7Ci0gICAgCi0gICAgcHVibGljIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzKCkgewotICAgICAgICBBUFBMSUNBVElPTl9FTEVNRU5UID0gY3JlYXRlRWxlbWVudCgiYXBwbGljYXRpb24iLCBudWxsLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCArIG5vIGNoaWxkICYgbWFuZGF0b3J5Ci0gICAgICAgIElOVFJVTUVOVEFUSU9OX0VMRU1FTlQgPSBjcmVhdGVFbGVtZW50KCJpbnN0cnVtZW50YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFBFUk1JU1NJT05fRUxFTUVOVCA9IGNyZWF0ZUVsZW1lbnQoInBlcm1pc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBVU0VTX1BFUk1JU1NJT05fRUxFTUVOVCA9IGNyZWF0ZUVsZW1lbnQoInVzZXMtcGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFVTRVNfU0RLX0VMRU1FTlQgPSBjcmVhdGVFbGVtZW50KCJ1c2VzLXNkayIsIG51bGwsIHRydWUpOyAvLyROT04tTkxTLTEkICsgbm8gY2hpbGQgJiBtYW5kYXRvcnkKLQotICAgICAgICBQRVJNSVNTSU9OX0dST1VQX0VMRU1FTlQgPSBjcmVhdGVFbGVtZW50KCJwZXJtaXNzaW9uLWdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgUEVSTUlTU0lPTl9UUkVFX0VMRU1FTlQgPSBjcmVhdGVFbGVtZW50KCJwZXJtaXNzaW9uLXRyZWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIE1BTklGRVNUX0VMRU1FTlQgPSBjcmVhdGVFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgTUFOSUZFU1RfTk9ERV9OQU1FLCAvLyB4bWwgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExJQ0FUSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UUlVNRU5UQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFU19QRVJNSVNTSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9HUk9VUF9FTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fVFJFRV9FTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVNfU0RLX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgIC8vIFRoZSAicGFja2FnZSIgYXR0cmlidXRlIGlzIHRyZWF0ZWQgZGlmZmVyZW50bHkgYXMgaXQgZG9lc24ndCBoYXZlIHRoZSBzdGFuZGFyZAotICAgICAgICAvLyBBbmRyb2lkIFhNTCBuYW1lc3BhY2UuCi0gICAgICAgIFBBQ0tBR0VfQVRUUl9ERVNDID0gbmV3IFBhY2thZ2VBdHRyaWJ1dGVEZXNjcmlwdG9yKFBBQ0tBR0VfQVRUUiwKLSAgICAgICAgICAgICAgICAiUGFja2FnZSIsCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAiVGhpcyBhdHRyaWJ1dGUgZ2l2ZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHBhY2thZ2UsIHVzaW5nIGEgSmF2YS1zdHlsZSBuYW1pbmcgY29udmVudGlvbiB0byBhdm9pZCBuYW1lIGNvbGxpc2lvbnMuXG5Gb3IgZXhhbXBsZSwgYXBwbGljYXRpb25zIHB1Ymxpc2hlZCBieSBHb29nbGUgY291bGQgaGF2ZSBuYW1lcyBvZiB0aGUgZm9ybSBjb20uZ29vZ2xlLmFwcC5hcHBuYW1lIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvcltdIGdldFJvb3RFbGVtZW50RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7IE1BTklGRVNUX0VMRU1FTlQgfTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRNYW5pZmVzdEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldEFwcGxpY2F0aW9uRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIEFQUExJQ0FUSU9OX0VMRU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBnZXRNYW5pZmVzdEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBNQU5JRkVTVF9FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IgZ2V0VXNlc1Nka0VsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBVU0VTX1NES19FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IgZ2V0SW5zdHJ1bWVudGF0aW9uRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIElOVFJVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBnZXRQZXJtaXNzaW9uRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fRUxFTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldFVzZXNQZXJtaXNzaW9uRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIFVTRVNfUEVSTUlTU0lPTl9FTEVNRU5UOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IgZ2V0UGVybWlzc2lvbkdyb3VwRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fR1JPVVBfRUxFTUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldFBlcm1pc3Npb25UcmVlRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fVFJFRV9FTEVNRU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRvY3VtZW50IGRlc2NyaXB0b3IuCi0gICAgICogPHAvPgotICAgICAqIEl0IGZpcnN0IGNvbXB1dGVzIHRoZSBuZXcgY2hpbGRyZW4gb2YgdGhlIGRlc2NyaXB0b3IgYW5kIHRoZW4gdXBkYXRlcyB0aGVtCi0gICAgICogYWxsIGF0IG9uY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmlmZXN0TWFwIFRoZSBtYXAgc3R5bGUgPT4gYXR0cmlidXRlcyBmcm9tIHRoZSBhdHRyc19tYW5pZmVzdC54bWwgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBtYW5pZmVzdE1hcCkgewotCi0gICAgICAgIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvciB4bWxucyA9IG5ldyBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgImFuZHJvaWQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUyk7IAotCi0gICAgICAgIC8vIC0tIHNldHVwIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIG92ZXJyaWRlcyAtLQotICAgICAgICAKLSAgICAgICAgU2V0PFN0cmluZz4gcmVxdWlyZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHJlcXVpcmVkLmFkZCgicHJvdmlkZXIvYXV0aG9yaXRpZXMiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIC8vIC0tIHNldHVwIHRoZSB2YXJpb3VzIGF0dHJpYnV0ZSBmb3JtYXQgb3ZlcnJpZGVzIC0tCi0gICAgICAgIAotICAgICAgICAvLyBUaGUga2V5IGZvciBlYWNoIG92ZXJyaWRlIGlzICJlbGVtZW50MSxlbGVtZW50MiwuLi4vYXR0ci14bWwtbG9jYWwtbmFtZSIgb3IKLSAgICAgICAgLy8gIiovYXR0ci14bWwtbG9jYWwtbmFtZSIgdG8gbWF0Y2ggdGhlIGF0dHJpYnV0ZSBpbiBhbnkgZWxlbWVudC4KLSAgICAgICAgCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb3ZlcnJpZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgb3ZlcnJpZGVzLnB1dCgiKi9pY29uIiwgbmV3IERlc2NyaXB0b3JzVXRpbHMuSVRleHRBdHRyaWJ1dGVDcmVhdG9yKCkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwdWJsaWMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgY3JlYXRlKFN0cmluZyB4bWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VBdHRyaWJ1dGVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLkRSQVdBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmFtZSwgdWlOYW1lLCBuc1VyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG92ZXJyaWRlcy5wdXQoIiovdGhlbWUiLCAgICAgICAgIFRoZW1lQXR0cmlidXRlRGVzY3JpcHRvci5jbGFzcyk7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdmVycmlkZXMucHV0KCIqL3Blcm1pc3Npb24iLCAgICBMaXN0QXR0cmlidXRlRGVzY3JpcHRvci5jbGFzcyk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3ZlcnJpZGVzLnB1dCgiKi90YXJnZXRQYWNrYWdlIiwgTWFuaWZlc3RQa2dBdHRyRGVzY3JpcHRvci5jbGFzcyk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBvdmVycmlkZXMucHV0KCJ1c2VzLWxpYnJhcnkvbmFtZSIsIExpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yLmNsYXNzKTsgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIG92ZXJyaWRlcy5wdXQoImFjdGlvbixjYXRlZ29yeSx1c2VzLXBlcm1pc3Npb24vIiArIEFORFJPSURfTkFNRV9BVFRSLCAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3IuY2xhc3MpOwotICAgICAgICBvdmVycmlkZXMucHV0KCJhcHBsaWNhdGlvbi8iICsgQU5EUk9JRF9OQU1FX0FUVFIsIEFwcGxpY2F0aW9uQXR0cmlidXRlRGVzY3JpcHRvci5jbGFzcyk7ICAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgb3ZlcnJpZGVDbGFzc05hbWUob3ZlcnJpZGVzLCAiYWN0aXZpdHkiLCBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0FDVElWSVRZKTsgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3ZlcnJpZGVDbGFzc05hbWUob3ZlcnJpZGVzLCAicmVjZWl2ZXIiLCBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0JST0FEQ0FTVFJFQ0VJVkVSKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3ZlcnJpZGVDbGFzc05hbWUob3ZlcnJpZGVzLCAic2VydmljZSIsIEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfU0VSVklDRSk7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3ZlcnJpZGVDbGFzc05hbWUob3ZlcnJpZGVzLCAicHJvdmlkZXIiLCBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0NPTlRFTlRQUk9WSURFUik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3ZlcnJpZGVDbGFzc05hbWUob3ZlcnJpZGVzLCAiaW5zdHJ1bWVudGF0aW9uIiwgQW5kcm9pZENvbnN0YW50cy5DTEFTU19JTlNUUlVNRU5UQVRJT04pOyAgICAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gLS0gbGlzdCBlbGVtZW50IG5vZGVzIGFscmVhZHkgY3JlYXRlZCAtLQotICAgICAgICAvLyBUaGVzZSBlbGVtZW50cyBhcmUgcmVmZXJlbmNlZCBieSBhbHJlYWR5IG9wZW5lZCBlZGl0b3JzLCBzbyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGVtCi0gICAgICAgIC8vIGJ1dCBub3QgcmUtY3JlYXRlIHRoZW0gd2hlbiByZWxvYWRpbmcgYW4gU0RLIG9uIHRoZSBmbHkuCi0gICAgICAgIAotICAgICAgICBIYXNoTWFwPFN0cmluZywgRWxlbWVudERlc2NyaXB0b3I+IGVsZW1lbnREZXNjcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBlbGVtZW50RGVzY3MucHV0KE1BTklGRVNUX0VMRU1FTlQuZ2V0WG1sTG9jYWxOYW1lKCksICAgICAgICAgTUFOSUZFU1RfRUxFTUVOVCk7Ci0gICAgICAgIGVsZW1lbnREZXNjcy5wdXQoQVBQTElDQVRJT05fRUxFTUVOVC5nZXRYbWxMb2NhbE5hbWUoKSwgICAgICBBUFBMSUNBVElPTl9FTEVNRU5UKTsKLSAgICAgICAgZWxlbWVudERlc2NzLnB1dChJTlRSVU1FTlRBVElPTl9FTEVNRU5ULmdldFhtbExvY2FsTmFtZSgpLCAgIElOVFJVTUVOVEFUSU9OX0VMRU1FTlQpOwotICAgICAgICBlbGVtZW50RGVzY3MucHV0KFBFUk1JU1NJT05fRUxFTUVOVC5nZXRYbWxMb2NhbE5hbWUoKSwgICAgICAgUEVSTUlTU0lPTl9FTEVNRU5UKTsKLSAgICAgICAgZWxlbWVudERlc2NzLnB1dChVU0VTX1BFUk1JU1NJT05fRUxFTUVOVC5nZXRYbWxMb2NhbE5hbWUoKSwgIFVTRVNfUEVSTUlTU0lPTl9FTEVNRU5UKTsKLSAgICAgICAgZWxlbWVudERlc2NzLnB1dChVU0VTX1NES19FTEVNRU5ULmdldFhtbExvY2FsTmFtZSgpLCAgICAgICAgIFVTRVNfU0RLX0VMRU1FTlQpOwotICAgICAgICBlbGVtZW50RGVzY3MucHV0KFBFUk1JU1NJT05fR1JPVVBfRUxFTUVOVC5nZXRYbWxMb2NhbE5hbWUoKSwgUEVSTUlTU0lPTl9HUk9VUF9FTEVNRU5UKTsKLSAgICAgICAgZWxlbWVudERlc2NzLnB1dChQRVJNSVNTSU9OX1RSRUVfRUxFTUVOVC5nZXRYbWxMb2NhbE5hbWUoKSwgIFBFUk1JU1NJT05fVFJFRV9FTEVNRU5UKTsKLQotICAgICAgICAvLyAtLQotCi0gICAgICAgIGluZmxhdGVFbGVtZW50KG1hbmlmZXN0TWFwLAotICAgICAgICAgICAgICAgIG92ZXJyaWRlcywKLSAgICAgICAgICAgICAgICByZXF1aXJlZCwKLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3MsCi0gICAgICAgICAgICAgICAgTUFOSUZFU1RfRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAiQW5kcm9pZE1hbmlmZXN0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5zZXJ0QXR0cmlidXRlKE1BTklGRVNUX0VMRU1FTlQsIFBBQ0tBR0VfQVRUUl9ERVNDKTsKLSAgICAgICAgCi0gICAgICAgIHNhbml0eUNoZWNrKG1hbmlmZXN0TWFwLCBNQU5JRkVTVF9FTEVNRU5UKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgZm9yIEFORFJPSURfTkFNRV9BVFRSIHVzaW5nIGEgQ2xhc3NBdHRyaWJ1dGVEZXNjcmlwdG9yCi0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdmVycmlkZUNsYXNzTmFtZShNYXA8U3RyaW5nLCBPYmplY3Q+IG92ZXJyaWRlcywKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBvdmVycmlkZXMucHV0KGVsZW1lbnROYW1lICsgIi8iICsgQU5EUk9JRF9OQU1FX0FUVFIsCi0gICAgICAgICAgICAgICAgbmV3IERlc2NyaXB0b3JzVXRpbHMuSVRleHRBdHRyaWJ1dGVDcmVhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgeG1sTmFtZSwgU3RyaW5nIHVpTmFtZSwgU3RyaW5nIG5zVXJpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICAgICAgICAgIHVpTmFtZSArPSAiKiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfQUNUSVZJVFkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uLmdldEFjdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKm1hbmRhdG9yeSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZGVmYXVsdFRvUHJvamVjdE9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0JST0FEQ0FTVFJFQ0VJVkVSLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NBdHRyaWJ1dGVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3N0UmVjZWl2ZXJDcmVhdGlvbkFjdGlvbi5nZXRBY3Rpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyptYW5kYXRvcnkgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmRlZmF1bHRUb1Byb2plY3RPbmx5Ki8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQW5kcm9pZENvbnN0YW50cy5DTEFTU19JTlNUUlVNRU5UQVRJT04uZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIG5vIHBvc3QgYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbWFuZGF0b3J5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qZGVmYXVsdFRvUHJvamVjdE9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKm1hbmRhdG9yeSAqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEVsZW1lbnREZXNjcmlwdG9yIGNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGdpdmVuIGhlcmUKLSAgICAgKiBhbmQgdGhlIGphdmFkb2MgJiBhdHRyaWJ1dGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHlsZSBtYXAgaWYgYW55LgotICAgICAqIDxwLz4KLSAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBubyBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgY3JlYXRlRWxlbWVudCgKLSAgICAgICAgICAgIFN0cmluZyB4bWxOYW1lLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3JbXSBjaGlsZHJlbkVsZW1lbnRzLAotICAgICAgICAgICAgYm9vbGVhbiBtYW5kYXRvcnkpIHsKLSAgICAgICAgLy8gQ3JlYXRlcyBhbiBlbGVtZW50IHdpdGggbm8gYXR0cmlidXRlIG92ZXJyaWRlcy4KLSAgICAgICAgU3RyaW5nIHN0eWxlTmFtZSA9IGd1ZXNzU3R5bGVOYW1lKHhtbE5hbWUpOwotICAgICAgICBTdHJpbmcgc2RrVXJsID0gRGVzY3JpcHRvcnNVdGlscy5NQU5JRkVTVF9TREtfVVJMICsgc3R5bGVOYW1lOyAKLSAgICAgICAgU3RyaW5nIHVpTmFtZSA9IGdldFVpTmFtZSh4bWxOYW1lKTsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50ID0gbmV3IE1hbmlmZXN0RWxlbWVudERlc2NyaXB0b3IoeG1sTmFtZSwgdWlOYW1lLCBudWxsLCBzZGtVcmwsCi0gICAgICAgICAgICAgICAgbnVsbCwgY2hpbGRyZW5FbGVtZW50cywgbWFuZGF0b3J5KTsKLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEVsZW1lbnREZXNjcmlwdG9yIGNvbnN0cnVjdGVkIGZyb20gaXRzIFhNTCBsb2NhbCBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHZlcnNpb24gY3JlYXRlcyBhbiBlbGVtZW50IG5vdCBtYW5kYXRvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciBjcmVhdGVFbGVtZW50KFN0cmluZyB4bWxOYW1lKSB7Ci0gICAgICAgIC8vIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoIG5vIGNoaWxkIGFuZCBub3QgbWFuZGF0b3J5Ci0gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KHhtbE5hbWUsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGFuIGF0dHJpYnV0ZSBpbiB0aGlzIGVsZW1lbnQgYXR0cmlidXRlIGxpc3QgaWYgaXQgaXMgbm90IHByZXNlbnQgdGhlcmUgeWV0Ci0gICAgICogKGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgWE1MIG5hbWUuKQotICAgICAqIFRoZSBhdHRyaWJ1dGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXR0cmlidXRlIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEF0dHJpYnV0ZShFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50LCBBdHRyaWJ1dGVEZXNjcmlwdG9yIG5ld0F0dHIpIHsKLSAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgZm9yIChBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHIgOiBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICBpZiAoYXR0ci5nZXRYbWxMb2NhbE5hbWUoKS5lcXVhbHMobmV3QXR0ci5nZXRYbWxMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3JbXSBuZXdBcnJheSA9IG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW2F0dHJpYnV0ZXMubGVuZ3RoICsgMV07Ci0gICAgICAgIG5ld0FycmF5WzBdID0gbmV3QXR0cjsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhdHRyaWJ1dGVzLCAwLCBuZXdBcnJheSwgMSwgYXR0cmlidXRlcy5sZW5ndGgpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZXMobmV3QXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICJJbmZsYXRlcyIgdGhlIHByb3BlcnRpZXMgb2YgYW4ge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBmcm9tIHRoZSBzdHlsZWFibGUgZGVjbGFyYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZmlyc3QgY3JlYXRlcyBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBFbGVtZW50RGVzY3JpcHRvci4KLSAgICAgKiBJdCB0aGVuIGZpbmRzIGFsbCBjaGlsZHJlbiBvZiB0aGUgZGVzY3JpcHRvciwgaW5mbGF0ZSB0aGVtIHJlY3Vyc2l2ZWx5IGFuZCBzZXQgdGhlbQotICAgICAqIGFzIGNoaWxkIHRvIHRoaXMgRWxlbWVudERlc2NyaXB0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlTWFwIFRoZSBpbnB1dCBzdHlsZWFibGUgbWFwIGZvciBtYW5pZmVzdCBlbGVtZW50cyAmIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIG92ZXJyaWRlcyBBIGxpc3Qgb2YgYXR0cmlidXRlIG92ZXJyaWRlcyAodG8gY3VzdG9taXplIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiAgICAgICAgICBkZXNjcmlwdG9ycykuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkQXR0cmlidXRlcyBTZXQgb2YgYXR0cmlidXRlcyB0byBiZSBtYXJrZWQgYXMgcmVxdWlyZWQuCi0gICAgICogQHBhcmFtIGV4aXN0aW5nRWxlbWVudERlc2NzIEEgbWFwIG9mIGFscmVhZHkgY3JlYXRlZCBlbGVtZW50IGRlc2NyaXB0b3JzLCBrZXllZCBieQotICAgICAqICAgICAgICAgIFhNTCBsb2NhbCBuYW1lLiBUaGlzIGlzIHVzZWQgdG8gdXNlIHRoZSBzdGF0aWMgZWxlbWVudHMgY3JlYXRlZCBpbml0aWFsbHkgYnkgdGhpcwotICAgICAqICAgICAgICAgIGNsYXNzLCB3aGljaCBhcmUgcmVmZXJlbmNlZCBkaXJlY3RseSBieSBlZGl0b3JzIChzbyB0aGF0IHJlbG9hZGluZyBhbiBTREsgd29uJ3QKLSAgICAgKiAgICAgICAgICBicmVhayB0aGVzZSByZWZlcmVuY2VzKS4KLSAgICAgKiBAcGFyYW0gZWxlbURlc2MgVGhlIGN1cnJlbnQge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSB0byBpbmZsYXRlLgotICAgICAqIEBwYXJhbSBzdHlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gdG8gaW5mbGF0ZS4gSXRzIFhNTCBsb2NhbCBuYW1lCi0gICAgICogICAgICAgICAgd2lsbCBiZSBndWVzc2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgc3R5bGUgbmFtZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVFbGVtZW50KAotICAgICAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IHN0eWxlTWFwLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvdmVycmlkZXMsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiByZXF1aXJlZEF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRWxlbWVudERlc2NyaXB0b3I+IGV4aXN0aW5nRWxlbWVudERlc2NzLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbURlc2MsCi0gICAgICAgICAgICBTdHJpbmcgc3R5bGVOYW1lKSB7Ci0gICAgICAgIGFzc2VydCBlbGVtRGVzYyAhPSBudWxsOwotICAgICAgICBhc3NlcnQgc3R5bGVOYW1lICE9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBkZWZpbmUgYXR0cmlidXRlcwotICAgICAgICBEZWNsYXJlU3R5bGVhYmxlSW5mbyBzdHlsZSA9IHN0eWxlTWFwICE9IG51bGwgPyBzdHlsZU1hcC5nZXQoc3R5bGVOYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4gYXR0ckRlc2NzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGVEZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGVzKGF0dHJEZXNjcywKLSAgICAgICAgICAgICAgICAgICAgZWxlbURlc2MuZ2V0WG1sTG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLmdldEF0dHJpYnV0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXMpOwotICAgICAgICAgICAgZWxlbURlc2Muc2V0VG9vbHRpcChzdHlsZS5nZXRKYXZhRG9jKCkpOwotICAgICAgICAgICAgZWxlbURlc2Muc2V0QXR0cmlidXRlcyhhdHRyRGVzY3MudG9BcnJheShuZXcgQXR0cmlidXRlRGVzY3JpcHRvclthdHRyRGVzY3Muc2l6ZSgpXSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBmaW5kIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBvbmUgYXMgcGFyZW50Ci0gICAgICAgIEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IGVudHJ5IDogc3R5bGVNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgRGVjbGFyZVN0eWxlYWJsZUluZm8gY2hpbGRTdHlsZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzUGFyZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJlbnRzID0gY2hpbGRTdHlsZS5nZXRQYXJlbnRzKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFyZW50OiBwYXJlbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZU5hbWUuZXF1YWxzKHBhcmVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFyZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzUGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkU3R5bGVOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkWG1sTmFtZSA9IGd1ZXNzWG1sTmFtZShjaGlsZFN0eWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG9yIHJlLXVzZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgY2hpbGQgPSBleGlzdGluZ0VsZW1lbnREZXNjcy5nZXQoY2hpbGRYbWxOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNyZWF0ZUVsZW1lbnQoY2hpbGRYbWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50RGVzY3MucHV0KGNoaWxkWG1sTmFtZSwgY2hpbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGluZmxhdGVFbGVtZW50KHN0eWxlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50RGVzY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3R5bGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbGVtRGVzYy5zZXRDaGlsZHJlbihjaGlsZHJlbi50b0FycmF5KG5ldyBFbGVtZW50RGVzY3JpcHRvcltjaGlsZHJlbi5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIFVJIG5hbWUgZnJvbSB0aGUgZWxlbWVudCBYTUwgbmFtZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciBhbmQgcmVwbGFjZSBub24tYWxwaGFiZXQgYnkgYSBzcGFjZSBmb2xsb3dlZCBieSBhIGNhcGl0YWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VWlOYW1lKFN0cmluZyB4bWxOYW1lKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGJvb2xlYW4gY2FwaXRhbGl6ZSA9IHRydWU7Ci0gICAgICAgIGZvciAoY2hhciBjIDogeG1sTmFtZS50b0NoYXJBcnJheSgpKSB7Ci0gICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZSAmJiBjID49ICdhJyAmJiBjIDw9ICd6JykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikoYyArICdBJyAtICdhJykpOwotICAgICAgICAgICAgICAgIGNhcGl0YWxpemUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPCAnQScgfHwgYyA+ICdaJykgJiYgKGMgPCAnYScgfHwgYyA+ICd6JykpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICBjYXBpdGFsaXplID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzc2VzIHRoZSBzdHlsZSBuYW1lIGZvciBhIGdpdmVuIFhNTCBlbGVtZW50IG5hbWUuCi0gICAgICogPHAvPiAKLSAgICAgKiBUaGUgcnVsZXMgYXJlOgotICAgICAqIC0gY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyOiAKLSAgICAgKiAtIGlmIHRoZXJlJ3MgYSBkYXNoLCBza2lwIGl0IGFuZCBjYXBpdGFsaXplIHRoZSBuZXh0IG9uZQotICAgICAqIC0gcHJlZml4IEFuZHJvaWRNYW5pZmVzdAotICAgICAqIFRoZSBleGNlcHRpb24gaXMgIm1hbmlmZXN0IiB3aGljaCBqdXN0IGJlY29tZXMgQW5kcm9pZE1hbmlmZXN0LgotICAgICAqIDxwLz4KLSAgICAgKiBFeGFtcGxlczoKLSAgICAgKiAtIG1hbmlmZXN0ICAgICAgICA9PiBBbmRyb2lkTWFuaWZlc3QKLSAgICAgKiAtIGFwcGxpY2F0aW9uICAgICA9PiBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbgotICAgICAqIC0gdXNlcy1wZXJtaXNzaW9uID0+IEFuZHJvaWRNYW5pZmVzdFVzZXNQZXJtaXNzaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ3Vlc3NTdHlsZU5hbWUoU3RyaW5nIHhtbE5hbWUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgaWYgKCF4bWxOYW1lLmVxdWFscyhNQU5JRkVTVF9OT0RFX05BTUUpKSB7Ci0gICAgICAgICAgICBib29sZWFuIGNhcGl0YWxpemUgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChjaGFyIGMgOiB4bWxOYW1lLnRvQ2hhckFycmF5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZSAmJiBjID49ICdhJyAmJiBjIDw9ICd6JykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpKGMgKyAnQScgLSAnYScpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPCAnQScgfHwgYyA+ICdaJykgJiYgKGMgPCAnYScgfHwgYyA+ICd6JykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgbGV0dGVyIC0tIHNraXAgdGhlIGNoYXJhY3RlciBhbmQgY2FwaXRhbGl6ZSB0aGUgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2IuaW5zZXJ0KDAsIEFORFJPSURfTUFOSUZFU1RfU1RZTEVBQkxFKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSBzYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIGFsbCB0aGUgc3R5bGVzIGRlY2xhcmVkIGluIHRoZQotICAgICAqIG1hbmlmZXN0TWFwIGFyZSBhY3R1YWxseSBkZWZpbmVkIGluIHRoZSBhY3R1YWwgZWxlbWVudCBkZXNjcmlwdG9ycyBhbmQgcmVhY2hhYmxlIGZyb20KLSAgICAgKiB0aGUgbWFuaWZlc3RFbGVtZW50IHJvb3Qgbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2FuaXR5Q2hlY2soTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IG1hbmlmZXN0TWFwLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgbWFuaWZlc3RFbGVtZW50KSB7Ci0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBlbGVtZW50c0RlY2xhcmVkID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBmaW5kQWxsRWxlbWVudE5hbWVzKG1hbmlmZXN0RWxlbWVudCwgZWxlbWVudHNEZWNsYXJlZCk7Ci0KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHN0eWxlc0RlY2xhcmVkID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBzdHlsZU5hbWUgOiBtYW5pZmVzdE1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWYgKHN0eWxlTmFtZS5zdGFydHNXaXRoKEFORFJPSURfTUFOSUZFU1RfU1RZTEVBQkxFKSkgewotICAgICAgICAgICAgICAgIHN0eWxlc0RlY2xhcmVkLmFkZChzdHlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBlbGVtZW50c0RlY2xhcmVkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyB4bWxOYW1lID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHN0eWxlTmFtZSA9IGd1ZXNzU3R5bGVOYW1lKHhtbE5hbWUpOwotICAgICAgICAgICAgaWYgKHN0eWxlc0RlY2xhcmVkLnJlbW92ZShzdHlsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKCFzdHlsZXNEZWNsYXJlZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2FybmluZywgQURUL1NESyBNaXNtYXRjaCEgVGhlIGZvbGxvd2luZyBlbGVtZW50cyBhcmUgZGVjbGFyZWQgYnkgdGhlIFNESyBidXQgdW5rbm93biB0byBBRFQ6ICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IHN0eWxlc0RlY2xhcmVkKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGd1ZXNzWG1sTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBzdHlsZXNEZWNsYXJlZC5sYXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywgIiVzIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUoKFN0cmluZyludWxsLCBzYik7Ci0gICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVsZW1lbnRzRGVjbGFyZWQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldhcm5pbmcsIEFEVC9TREsgTWlzbWF0Y2ghIFRoZSBmb2xsb3dpbmcgZWxlbWVudHMgYXJlIGRlY2xhcmVkIGJ5IEFEVCBidXQgbm90IGJ5IHRoZSBTREs6ICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGVsZW1lbnRzRGVjbGFyZWQpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gZWxlbWVudHNEZWNsYXJlZC5sYXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywgIiVzIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUoKFN0cmluZyludWxsLCBzYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhbiBhcHByb3hpbWF0ZSB0cmFuc2xhdGlvbiBvZiB0aGUgc3R5bGUgbmFtZSBpbnRvIGEgcG90ZW50aWFsCi0gICAgICogeG1sIG5hbWUuIFRoaXMgaXMgbW9yZSBvciBsZXNzIHRoZSByZXZlcnNlIGZyb20gZ3Vlc3NTdHlsZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBYTUwgbG9jYWwgbmFtZSBmb3IgYSBnaXZlbiBzdHlsZSBuYW1lLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBndWVzc1htbE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGlmIChBTkRST0lEX01BTklGRVNUX1NUWUxFQUJMRS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChNQU5JRkVTVF9OT0RFX05BTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShBTkRST0lEX01BTklGRVNUX1NUWUxFQUJMRSwgIiIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBib29sZWFuIGZpcnN0X2NoYXIgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChjaGFyIGMgOiBuYW1lLnRvQ2hhckFycmF5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9jaGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjID0gKGNoYXIpIChjIC0gJ0EnICsgJ2EnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIGZpcnN0X2NoYXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNzYW5pdHlDaGVjayhNYXAsIEVsZW1lbnREZXNjcmlwdG9yKX0gdG8gZmluZCBhbGwgdGhlCi0gICAgICoge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBuYW1lcyBkZWZpbmVkIGJ5IHRoZSB0cmVlIG9mIGRlc2NyaXB0b3JzLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlOiB0aGlzIGFzc3VtZXMgbm8gY2lyY3VsYXIgcmVmZXJlbmNlIGluIHRoZSB0cmVlIG9mIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn1zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5kQWxsRWxlbWVudE5hbWVzKEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnQsIFRyZWVTZXQ8U3RyaW5nPiBkZWNsYXJlZCkgewotICAgICAgICBkZWNsYXJlZC5hZGQoZWxlbWVudC5nZXRYbWxOYW1lKCkpOwotICAgICAgICBmb3IgKEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgOiBlbGVtZW50LmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGZpbmRBbGxFbGVtZW50TmFtZXMoZGVzYywgZGVjbGFyZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL0FwcGxpY2F0aW9uQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvQXBwbGljYXRpb25BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmM2ODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvQXBwbGljYXRpb25BdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWwuVWlDbGFzc0F0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhbiAnQXBwbGljYXRpb24nIGNsYXNzIFhNTCBhdHRyaWJ1dGUuIEl0IGlzIGRpc3BsYXllZCBieSBhCi0gKiB7QGxpbmsgVWlDbGFzc0F0dHJpYnV0ZU5vZGV9LCB0aGF0IHJlc3RyaWN0cyBjcmVhdGlvbiBhbmQgc2VsZWN0aW9uIHRvIGNsYXNzZXMKLSAqIGluaGVyaXRpbmcgZnJvbSBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQXR0cmlidXRlRGVzY3JpcHRvciBleHRlbmRzIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIHsKLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkF0dHJpYnV0ZURlc2NyaXB0b3IoU3RyaW5nIHhtbExvY2FsTmFtZSwgU3RyaW5nIHVpTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBuc1VyaSwgU3RyaW5nIHRvb2x0aXApIHsKLSAgICAgICAgc3VwZXIoeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlDbGFzc0F0dHJpYnV0ZU5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZSBjcmVhdGVVaU5vZGUoVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IFVpQ2xhc3NBdHRyaWJ1dGVOb2RlKCJhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsIC8qIHBvc3RDcmVhdGlvbkFjdGlvbiAqLywgZmFsc2UgLyogbWFuZGF0b3J5ICovLCB0aGlzLCB1aVBhcmVudCwKLSAgICAgICAgICAgICAgICB0cnVlIC8qZGVmYXVsdFRvUHJvamVjdE9ubHkqLyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvQ2xhc3NBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9kZXNjcmlwdG9ycy9DbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzN2RjZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9kZXNjcmlwdG9ycy9DbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWwuVWlDbGFzc0F0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWwuVWlDbGFzc0F0dHJpYnV0ZU5vZGUuSVBvc3RUeXBlQ3JlYXRpb25BY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIGFuIFhNTCBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIGEgY2xhc3MgbmFtZS4KLSAqIEl0IGlzIGRpc3BsYXllZCBieSBhIHtAbGluayBVaUNsYXNzQXR0cmlidXRlTm9kZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3IgZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciB7Ci0KLSAgICAvKiogU3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgdmFsdWUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1cGVyQ2xhc3NOYW1lOwotICAgIAotICAgIHByaXZhdGUgSVBvc3RUeXBlQ3JlYXRpb25BY3Rpb24gbVBvc3RDcmVhdGlvbkFjdGlvbjsKLSAgICAKLSAgICAvKiogaW5kaWNhdGVzIGlmIHRoZSBjbGFzcyBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5ICovCi0gICAgYm9vbGVhbiBtTWFuZGF0b3J5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EZWZhdWx0VG9Qcm9qZWN0T25seTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3J9Ci0gICAgICogQHBhcmFtIHN1cGVyQ2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQKLSAgICAgKiBieSB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB4bWxMb2NhbE5hbWUgVGhlIFhNTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKGNhc2Ugc2Vuc2l0aXZlLCB3aXRoIGFuZHJvaWQ6IHByZWZpeCkuCi0gICAgICogQHBhcmFtIHVpTmFtZSBUaGUgVUkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBDYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIGFuZCBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gbnNVcmkgVGhlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiBDYW4gYmUgbnVsbCBpZiBhdHRyaWJ1dGUgaGFzIG5vIG5hbWVzcGFjZS4KLSAgICAgKiAgICAgICAgICAgICAgU2VlIHtAbGluayBTZGtDb25zdGFudHMjTlNfUkVTT1VSQ0VTfSBmb3IgYSBjb21tb24gdmFsdWUuCi0gICAgICogQHBhcmFtIHRvb2x0aXAgQSBub24tZW1wdHkgdG9vbHRpcCBzdHJpbmcgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gbWFuZGF0b3J5IGluZGljYXRlcyBpZiB0aGUgY2xhc3MgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyBzdXBlckNsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB4bWxMb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdWlOYW1lLAotICAgICAgICAgICAgU3RyaW5nIG5zVXJpLAotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAsCi0gICAgICAgICAgICBib29sZWFuIG1hbmRhdG9yeSkgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgICAgICBtU3VwZXJDbGFzc05hbWUgPSBzdXBlckNsYXNzTmFtZTsKLSAgICAgICAgbURlZmF1bHRUb1Byb2plY3RPbmx5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDbGFzc0F0dHJpYnV0ZURlc2NyaXB0b3J9Ci0gICAgICogQHBhcmFtIHN1cGVyQ2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQKLSAgICAgKiBieSB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBwb3N0Q3JlYXRpb25BY3Rpb24gdGhlIHtAbGluayBJUG9zdFR5cGVDcmVhdGlvbkFjdGlvbn0gdG8gYmUgZXhlY3V0ZWQgb24gdGhlCi0gICAgICogICAgICAgIG5ld2x5IGNyZWF0ZWQgY2xhc3MuCi0gICAgICogQHBhcmFtIHhtbExvY2FsTmFtZSBUaGUgWE1MIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAoY2FzZSBzZW5zaXRpdmUpLgotICAgICAqIEBwYXJhbSB1aU5hbWUgVGhlIFVJIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gQ2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyBhbmQgY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIG5zVXJpIFRoZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gQ2FuIGJlIG51bGwgaWYgYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2UuCi0gICAgICogICAgICAgICAgICAgIFNlZSB7QGxpbmsgU2RrQ29uc3RhbnRzI05TX1JFU09VUkNFU30gZm9yIGEgY29tbW9uIHZhbHVlLgotICAgICAqIEBwYXJhbSB0b29sdGlwIEEgbm9uLWVtcHR5IHRvb2x0aXAgc3RyaW5nIG9yIG51bGwuCi0gICAgICogQHBhcmFtIG1hbmRhdG9yeSBpbmRpY2F0ZXMgaWYgdGhlIGNsYXNzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuCi0gICAgICogQHBhcmFtIGRlZmF1bHRUb1Byb2plY3RPbmx5IFRydWUgaWYgb25seSBjbGFzc2VzIGZyb20gdGhlIHNvdXJjZXMgb2YgdGhpcyBwcm9qZWN0IHNob3VsZAotICAgICAqICAgICAgICAgYmUgc2hvd24gYnkgZGVmYXVsdCBpbiB0aGUgY2xhc3MgYnJvd3Nlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyBzdXBlckNsYXNzTmFtZSwKLSAgICAgICAgICAgIElQb3N0VHlwZUNyZWF0aW9uQWN0aW9uIHBvc3RDcmVhdGlvbkFjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyB4bWxMb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdWlOYW1lLAotICAgICAgICAgICAgU3RyaW5nIG5zVXJpLAotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAsCi0gICAgICAgICAgICBib29sZWFuIG1hbmRhdG9yeSwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFRvUHJvamVjdE9ubHkpIHsKLSAgICAgICAgc3VwZXIoeG1sTG9jYWxOYW1lLCB1aU5hbWUsIG5zVXJpLCB0b29sdGlwKTsKLSAgICAgICAgbVN1cGVyQ2xhc3NOYW1lID0gc3VwZXJDbGFzc05hbWU7Ci0gICAgICAgIG1Qb3N0Q3JlYXRpb25BY3Rpb24gPSBwb3N0Q3JlYXRpb25BY3Rpb247Ci0gICAgICAgIG1EZWZhdWx0VG9Qcm9qZWN0T25seSA9IGRlZmF1bHRUb1Byb2plY3RPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFVpQ2xhc3NBdHRyaWJ1dGVOb2RlfSBsaW5rZWQgdG8gdGhpcyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgY3JlYXRlVWlOb2RlKFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaUNsYXNzQXR0cmlidXRlTm9kZShtU3VwZXJDbGFzc05hbWUsIG1Qb3N0Q3JlYXRpb25BY3Rpb24sCi0gICAgICAgICAgICAgICAgbU1hbmRhdG9yeSwgdGhpcywgdWlQYXJlbnQsIG1EZWZhdWx0VG9Qcm9qZWN0T25seSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzAyODUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL01hbmlmZXN0RWxlbWVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lm1vZGVsLlVpTWFuaWZlc3RFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLS8qKgotICoge0BsaW5rIE1hbmlmZXN0RWxlbWVudERlc2NyaXB0b3J9IGRlc2NyaWJlcyBhbiBYTUwgZWxlbWVudCBub2RlLCB3aXRoIGl0cwotICogZWxlbWVudCBuYW1lLCBpdHMgcG9zc2libGUgYXR0cmlidXRlcywgaXRzIHBvc3NpYmxlIGNoaWxkIGVsZW1lbnRzIGJ1dCBhbHNvCi0gKiBpdHMgZGlzcGxheSBuYW1lIGFuZCB0b29sdGlwLgotICogCi0gKiBUaGlzIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gaXMgc3BlY2lhbGl6ZWQgdG8gY3JlYXRlIHtAbGluayBVaU1hbmlmZXN0RWxlbWVudE5vZGV9IFVJIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvciBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1hbmlmZXN0RWxlbWVudERlc2NyaXB0b3J9LgotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lLiBDYXNlIHNlbnNpdGl2ZS4KLSAgICAgKiBAcGFyYW0gdWlfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLCB0eXBpY2FsbHkgY2FwaXRhbGl6ZWQuCi0gICAgICogQHBhcmFtIHRvb2x0aXAgQW4gb3B0aW9uYWwgdG9vbHRpcC4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIHNka191cmwgQW4gb3B0aW9uYWwgU0tEIFVSTC4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGxpc3Qgb2YgYWxsb3dlZCBhdHRyaWJ1dGVzLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGxpc3Qgb2YgYWxsb3dlZCBjaGlsZHJlbi4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIG1hbmRhdG9yeSBXaGV0aGVyIHRoaXMgbm9kZSBtdXN0IGFsd2F5cyBleGlzdCAoZXZlbiBmb3IgZW1wdHkgbW9kZWxzKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvcihTdHJpbmcgeG1sX25hbWUsIFN0cmluZyB1aV9uYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIHNka191cmwsCi0gICAgICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gYXR0cmlidXRlcywKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gY2hpbGRyZW4sCi0gICAgICAgICAgICBib29sZWFuIG1hbmRhdG9yeSkgewotICAgICAgICBzdXBlcih4bWxfbmFtZSwgdWlfbmFtZSwgdG9vbHRpcCwgc2RrX3VybCwgYXR0cmlidXRlcywgY2hpbGRyZW4sIG1hbmRhdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvcn0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSB1aV9uYW1lIFRoZSBYTUwgZWxlbWVudCBuYW1lIGZvciB0aGUgdXNlciBpbnRlcmZhY2UsIHR5cGljYWxseSBjYXBpdGFsaXplZC4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gc2RrX3VybCBBbiBvcHRpb25hbCBTS0QgVVJMLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgbGlzdCBvZiBhbGxvd2VkIGF0dHJpYnV0ZXMuIENhbiBiZSBudWxsIG9yIGVtcHR5LgotICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgbGlzdCBvZiBhbGxvd2VkIGNoaWxkcmVuLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvcihTdHJpbmcgeG1sX25hbWUsIFN0cmluZyB1aV9uYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIHNka191cmwsCi0gICAgICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gYXR0cmlidXRlcywKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gY2hpbGRyZW4pIHsKLSAgICAgICAgc3VwZXIoeG1sX25hbWUsIHVpX25hbWUsIHRvb2x0aXAsIHNka191cmwsIGF0dHJpYnV0ZXMsIGNoaWxkcmVuLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvcgotICAgICAqIE1hbmlmZXN0RWxlbWVudERlc2NyaXB0b3IoeG1sX25hbWUsIHhtbF9uYW1lLmNhcGl0YWxpemUoKSwgbnVsbCwgbnVsbCwgbnVsbCwgY2hpbGRyZW4pLgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgbW9zdGx5IHVzZWQgZm9yIHVuaXQgdGVzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBNYW5pZmVzdEVsZW1lbnREZXNjcmlwdG9yKFN0cmluZyB4bWxfbmFtZSwgRWxlbWVudERlc2NyaXB0b3JbXSBjaGlsZHJlbikgewotICAgICAgICBzdXBlcih4bWxfbmFtZSwgY2hpbGRyZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IKLSAgICAgKiBNYW5pZmVzdEVsZW1lbnREZXNjcmlwdG9yKHhtbF9uYW1lLCB4bWxfbmFtZS5jYXBpdGFsaXplKCksIG51bGwsIG51bGwsIG51bGwsIG51bGwpLgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgbW9zdGx5IHVzZWQgZm9yIHVuaXQgdGVzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9uYW1lIFRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUuIENhc2Ugc2Vuc2l0aXZlLgotICAgICAqLwotICAgIHB1YmxpYyBNYW5pZmVzdEVsZW1lbnREZXNjcmlwdG9yKFN0cmluZyB4bWxfbmFtZSkgewotICAgICAgICBzdXBlcih4bWxfbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gbGlua2VkIHRvIHRoaXMgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBjcmVhdGVVaU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlNYW5pZmVzdEVsZW1lbnROb2RlKHRoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL01hbmlmZXN0UGtnQXR0ckRlc2NyaXB0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL01hbmlmZXN0UGtnQXR0ckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVkODZiYjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvTWFuaWZlc3RQa2dBdHRyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lm1vZGVsLlVpTWFuaWZlc3RQa2dBdHRyTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgcGFja2FnZSBYTUwgYXR0cmlidXRlLiBJdCBpcyBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgVWlNYW5pZmVzdFBrZ0F0dHJOb2RlfS4KLSAqLwotcHVibGljIGNsYXNzIE1hbmlmZXN0UGtnQXR0ckRlc2NyaXB0b3IgZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciB7Ci0KLSAgICBwdWJsaWMgTWFuaWZlc3RQa2dBdHRyRGVzY3JpcHRvcihTdHJpbmcgeG1sTG9jYWxOYW1lLCBTdHJpbmcgdWlOYW1lLCBTdHJpbmcgbnNVcmksCi0gICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBzdXBlcih4bWxMb2NhbE5hbWUsIHVpTmFtZSwgbnNVcmksIHRvb2x0aXApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBVaU1hbmlmZXN0UGtnQXR0ck5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZSBjcmVhdGVVaU5vZGUoVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IFVpTWFuaWZlc3RQa2dBdHRyTm9kZSh0aGlzLCB1aVBhcmVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvUGFja2FnZUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL1BhY2thZ2VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTMyZTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvUGFja2FnZUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5tb2RlbC5VaVBhY2thZ2VBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBwYWNrYWdlIFhNTCBhdHRyaWJ1dGUuIEl0IGlzIGRpc3BsYXllZCBieSBhIHtAbGluayBVaVBhY2thZ2VBdHRyaWJ1dGVOb2RlfS4KLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VBdHRyaWJ1dGVEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgewotCi0gICAgcHVibGljIFBhY2thZ2VBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFVpUGFja2FnZUF0dHJpYnV0ZU5vZGV9IGxpbmtlZCB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZSBjcmVhdGVVaU5vZGUoVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IFVpUGFja2FnZUF0dHJpYnV0ZU5vZGUodGhpcywgdWlQYXJlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL1Bvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9kZXNjcmlwdG9ycy9Qb3N0QWN0aXZpdHlDcmVhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBlMGU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL1Bvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWwuVWlDbGFzc0F0dHJpYnV0ZU5vZGUuSVBvc3RUeXBlQ3JlYXRpb25BY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLS8qKgotICogQWN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGFuIEFjdGl2aXR5IGNsYXNzIGlzIGNyZWF0ZWQuCi0gKi8KLWNsYXNzIFBvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uIGltcGxlbWVudHMgSVBvc3RUeXBlQ3JlYXRpb25BY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uIHNBY3Rpb24gPSBuZXcgUG9zdEFjdGl2aXR5Q3JlYXRpb25BY3Rpb24oKTsKLSAgICAKLSAgICBwcml2YXRlIFBvc3RBY3Rpdml0eUNyZWF0aW9uQWN0aW9uKCkgewotICAgICAgICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uLgotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUG9zdFR5cGVDcmVhdGlvbkFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzQWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG5ld2x5IGNyZWF0ZWQgQWN0aXZpdHkuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc05ld1R5cGUoSVR5cGUgbmV3VHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZENvbnRlbnQgPSAKLSAgICAgICAgICAgICAgICAiICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi9cbiIgKwotICAgICAgICAgICAgICAgICIgICAgQE92ZXJyaWRlXG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHtcbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7XG4iICsKLSAgICAgICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXG4iICsKLSAgICAgICAgICAgICAgICAiICAgIH0iOwotICAgICAgICAgICAgbmV3VHlwZS5jcmVhdGVNZXRob2QobWV0aG9kQ29udGVudCwgbnVsbCAvKiBzaWJsaW5nKi8sIGZhbHNlIC8qIGZvcmNlICovLAotICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdGhlIGltcG9ydCBmb3IgQnVuZGxlLCBzbyB3ZSBuZWVkIHRoZSBjb21waWxhdGlvbiB1bml0LgotICAgICAgICAgICAgLy8gU2luY2UgdGhlIHR5cGUgY291bGQgYmUgZW5jbG9zZWQgaW4gb3RoZXIgdHlwZXMsIHdlIGxvb3AgdGlsbCB3ZSBmaW5kIGl0LgotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBudWxsOwotICAgICAgICAgICAgSUphdmFFbGVtZW50IGVsZW1lbnQgPSBuZXdUeXBlOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIElKYXZhRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSAgbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnRFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gcGFyZW50RWxlbWVudDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChjb21waWxhdGlvblVuaXQgPT0gbnVsbCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5jcmVhdGVJbXBvcnQoQW5kcm9pZENvbnN0YW50cy5DTEFTU19CVU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNpYmxpbmcgKi8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvUG9zdFJlY2VpdmVyQ3JlYXRpb25BY3Rpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL1Bvc3RSZWNlaXZlckNyZWF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNmE3ZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvUG9zdFJlY2VpdmVyQ3JlYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5tb2RlbC5VaUNsYXNzQXR0cmlidXRlTm9kZS5JUG9zdFR5cGVDcmVhdGlvbkFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgYW4gQnJvYWRjYXN0UmVjZWl2ZXIgY2xhc3MgaXMgY3JlYXRlZC4KLSAqLwotY2xhc3MgUG9zdFJlY2VpdmVyQ3JlYXRpb25BY3Rpb24gaW1wbGVtZW50cyBJUG9zdFR5cGVDcmVhdGlvbkFjdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUG9zdFJlY2VpdmVyQ3JlYXRpb25BY3Rpb24gc0FjdGlvbiA9IG5ldyBQb3N0UmVjZWl2ZXJDcmVhdGlvbkFjdGlvbigpOwotICAgIAotICAgIHByaXZhdGUgUG9zdFJlY2VpdmVyQ3JlYXRpb25BY3Rpb24oKSB7Ci0gICAgICAgIC8vIHByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5mb3JjZSBzaW5nbGV0b24uCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQb3N0VHlwZUNyZWF0aW9uQWN0aW9uIGdldEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNBY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbmV3bHkgY3JlYXRlZCBBY3Rpdml0eS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3VHlwZShJVHlwZSBuZXdUeXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kQ29udGVudCA9IAotICAgICAgICAgICAgICAgICIgICAgQE92ZXJyaWRlXG4iICsKLSAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHtcbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcbiIgKwotICAgICAgICAgICAgICAgICIgICAgfSI7Ci0gICAgICAgICAgICBuZXdUeXBlLmNyZWF0ZU1ldGhvZChtZXRob2RDb250ZW50LCBudWxsIC8qIHNpYmxpbmcqLywgZmFsc2UgLyogZm9yY2UgKi8sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0aGUgaW1wb3J0IGZvciBCdW5kbGUsIHNvIHdlIG5lZWQgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGUgdHlwZSBjb3VsZCBiZSBlbmNsb3NlZCBpbiBvdGhlciB0eXBlcywgd2UgbG9vcCB0aWxsIHdlIGZpbmQgaXQuCi0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IG51bGw7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG5ld1R5cGU7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgSUphdmFFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9ICBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KXBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmNyZWF0ZUltcG9ydChBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNpYmxpbmcgKi8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5jcmVhdGVJbXBvcnQoQW5kcm9pZENvbnN0YW50cy5DTEFTU19JTlRFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNpYmxpbmcgKi8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB0aGUgY2xhc3MgYWxyZWFkeSBleGlzdGVkICh0aGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlciBjaGVjayB0byBjcmVhdGUKLSAgICAgICAgICAgIC8vIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzKS4KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L2Rlc2NyaXB0b3JzL1RoZW1lQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvVGhlbWVBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDFmMTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvZGVzY3JpcHRvcnMvVGhlbWVBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlSZXNvdXJjZUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgVGhlbWUvU3R5bGUgWE1MIGF0dHJpYnV0ZSBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgVWlSZXNvdXJjZUF0dHJpYnV0ZU5vZGV9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUaGVtZUF0dHJpYnV0ZURlc2NyaXB0b3IgZXh0ZW5kcyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciB7Ci0KLSAgICBwdWJsaWMgVGhlbWVBdHRyaWJ1dGVEZXNjcmlwdG9yKFN0cmluZyB4bWxMb2NhbE5hbWUsIFN0cmluZyB1aU5hbWUsIFN0cmluZyBuc1VyaSwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIHN1cGVyKHhtbExvY2FsTmFtZSwgdWlOYW1lLCBuc1VyaSwgdG9vbHRpcCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFVpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlfSBsaW5rZWQgdG8gdGhpcyB0aGVtZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgY3JlYXRlVWlOb2RlKFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVaVJlc291cmNlQXR0cmlidXRlTm9kZShSZXNvdXJjZVR5cGUuU1RZTEUsIHRoaXMsIHVpUGFyZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaUNsYXNzQXR0cmlidXRlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvbW9kZWwvVWlDbGFzc0F0dHJpYnV0ZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYmMwOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaUNsYXNzQXR0cmlidXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5TZWN0aW9uSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpVGV4dEF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5PcGVuTmV3Q2xhc3NXaXphcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmRpYWxvZ3MuSVR5cGVJbmZvRmlsdGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5kaWFsb2dzLklUeXBlSW5mb1JlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuZGlhbG9ncy5JVHlwZVNlbGVjdGlvbkNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuZGlhbG9ncy5UeXBlU2VsZWN0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBhdHRyaWJ1dGUgZm9yIGEgY2xhc3MsIHRoYXQgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGEgc2ltcGxlIHRleHQgZmllbGQgb3IKLSAqIGEgZGlhbG9nIHRvIGNob29zZSBhbiBleGlzdGluZyBjbGFzcy4gQWxzbywgdGhlcmUncyBhIGxpbmsgdG8gY3JlYXRlIGEgbmV3IGNsYXNzLgotICogPHAvPgotICogU2VlIHtAbGluayBVaVRleHRBdHRyaWJ1dGVOb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVpQ2xhc3NBdHRyaWJ1dGVOb2RlIGV4dGVuZHMgVWlUZXh0QXR0cmlidXRlTm9kZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUmVmZXJlbmNlQ2xhc3M7Ci0gICAgcHJpdmF0ZSBJUG9zdFR5cGVDcmVhdGlvbkFjdGlvbiBtUG9zdENyZWF0aW9uQWN0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWFuZGF0b3J5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtRGVmYXVsdFRvUHJvamVjdE9ubHk7Ci0KLSAgICBwcml2YXRlIGNsYXNzIEhpZXJhcmNoeVR5cGVTZWxlY3Rpb24gZXh0ZW5kcyBUeXBlU2VsZWN0aW9uRXh0ZW5zaW9uIHsKLQotICAgICAgICBwcml2YXRlIElKYXZhUHJvamVjdCBtSmF2YVByb2plY3Q7Ci0gICAgICAgIHByaXZhdGUgSVR5cGUgbVJlZmVyZW5jZVR5cGU7Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIG1Qcm9qZWN0T25seTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VQcm9qZWN0T25seTsKLQotICAgICAgICBwdWJsaWMgSGllcmFyY2h5VHlwZVNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcmVmZXJlbmNlQ2xhc3MpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtSmF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgICAgICBtUmVmZXJlbmNlVHlwZSA9IG1KYXZhUHJvamVjdC5maW5kVHlwZShyZWZlcmVuY2VDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIElUeXBlSW5mb0ZpbHRlckV4dGVuc2lvbiBnZXRGaWx0ZXJFeHRlbnNpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElUeXBlSW5mb0ZpbHRlckV4dGVuc2lvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoSVR5cGVJbmZvUmVxdWVzdG9yIHR5cGVJbmZvUmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9qZWN0T25seSA9IG1Vc2VQcm9qZWN0T25seTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlSW5mb1JlcXVlc3Rvci5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0eXBlSW5mb1JlcXVlc3Rvci5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jbG9zaW5nVHlwZSA9IHR5cGVJbmZvUmVxdWVzdG9yLmdldEVuY2xvc2luZ05hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgZnVsbCBjbGFzcyBuYW1lLgotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuY2xvc2luZ1R5cGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZW5jbG9zaW5nVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodHlwZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBzYi50b1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gbUphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGRpc3BsYXkgYWJzdHJhY3QgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlLmdldEZsYWdzKCkgJiBGbGFncy5BY2NBYnN0cmFjdCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcHJvamVjdC1vbmx5IGlzIHNlbGVjdGVkLCBtYWtlIHN1cmUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFjdHVhbCBzb3VyY2UgKHRodXMgImZyb20gdGhpcyBwcm9qZWN0IikuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdE9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IGZyYWcgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnID09IG51bGwgfHwgZnJhZy5nZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIGhpZXJhcmNoeSBhbmQgcmVmZXJlbmNlIHR5cGUgaXMgb25lIG9mIHRoZSBzdXBlciBjbGFzc2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZVtdIHN1cGVydHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJ0eXBlcyh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gc3VwZXJ0eXBlcy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHN0ID0gc3VwZXJ0eXBlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlZmVyZW5jZVR5cGUuZXF1YWxzKHN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgICAgIG1Qcm9qZWN0T25seSA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICAgICAgbVByb2plY3RPbmx5LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbVByb2plY3RPbmx5LnNldFRleHQoU3RyaW5nLmZvcm1hdCgiRGlzcGxheSBjbGFzc2VzIGZyb20gc291cmNlcyBvZiBwcm9qZWN0ICclcycgb25seSIsCi0gICAgICAgICAgICAgICAgICAgIG1KYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIG1Vc2VQcm9qZWN0T25seSA9IG1EZWZhdWx0VG9Qcm9qZWN0T25seTsKLSAgICAgICAgICAgIG1Qcm9qZWN0T25seS5zZXRTZWxlY3Rpb24obVVzZVByb2plY3RPbmx5KTsKLQotICAgICAgICAgICAgbVByb2plY3RPbmx5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Vc2VQcm9qZWN0T25seSA9IG1Qcm9qZWN0T25seS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZVNlbGVjdGlvbkNvbXBvbmVudCgpLnRyaWdnZXJTZWFyY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbnRlbnRBcmVhKHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBwcm92aWRlIGEgbWV0aG9kIHByb2Nlc3NpbmcgbmV3bHkgY3JlYXRlZCBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElQb3N0VHlwZUNyZWF0aW9uQWN0aW9uIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgdG8gcHJvY2VzcyBhIG5ld2x5IGNyZWF0ZWQgY2xhc3MuCi0gICAgICAgICAqIEBwYXJhbSBuZXdUeXBlIHRoZSBJVHlwZSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3VHlwZShJVHlwZSBuZXdUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFVpQ2xhc3NBdHRyaWJ1dGVOb2RlfSBvYmplY3QgdGhhdCB3aWxsIGRpc3BsYXkgdWkgdG8gc2VsZWN0IG9yIGNyZWF0ZQotICAgICAqIGNsYXNzZXMuCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZUNsYXNzIFRoZSBhbGxvd2VkIHN1cGVydHlwZSBvZiB0aGUgY2xhc3NlcyB0aGF0IGFyZSB0byBiZSBzZWxlY3RlZAotICAgICAqIG9yIGNyZWF0ZWQuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBwb3N0Q3JlYXRpb25BY3Rpb24gYSB7QGxpbmsgSVBvc3RUeXBlQ3JlYXRpb25BY3Rpb259IG9iamVjdCBoYW5kbGluZyBwb3N0IGNyZWF0aW9uCi0gICAgICogbW9kaWZpY2F0aW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gbWFuZGF0b3J5IGluZGljYXRlcyBpZiB0aGUgY2xhc3MgdmFsdWUgaXMgbWFuZGF0b3J5Ci0gICAgICogQHBhcmFtIGF0dHJpYnV0ZURlc2NyaXB0b3IgdGhlIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBvYmplY3QgbGlua2VkIHRvIHRoZSBVaSBOb2RlLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VG9Qcm9qZWN0T25seSBXaGVuIHRydWUgZGlzcGxheSBjbGFzc2VzIG9mIHRoaXMgcHJvamVjdCBvbmx5IGJ5IGRlZmF1bHQuCi0gICAgICogICAgICAgICBXaGVuIGZhbHNlIGFueSBjbGFzcyBwYXRoIHdpbGwgYmUgY29uc2lkZXJlZC4gVGhlIHVzZXIgY2FuIGFsd2F5cyB0b2dnbGUgdGhpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlDbGFzc0F0dHJpYnV0ZU5vZGUoU3RyaW5nIHJlZmVyZW5jZUNsYXNzLCBJUG9zdFR5cGVDcmVhdGlvbkFjdGlvbiBwb3N0Q3JlYXRpb25BY3Rpb24sCi0gICAgICAgICAgICBib29sZWFuIG1hbmRhdG9yeSwgQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUVsZW1lbnROb2RlIHVpUGFyZW50LAotICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VG9Qcm9qZWN0T25seSkgewotICAgICAgICBzdXBlcihhdHRyaWJ1dGVEZXNjcmlwdG9yLCB1aVBhcmVudCk7Ci0KLSAgICAgICAgbVJlZmVyZW5jZUNsYXNzID0gcmVmZXJlbmNlQ2xhc3M7Ci0gICAgICAgIG1Qb3N0Q3JlYXRpb25BY3Rpb24gPSBwb3N0Q3JlYXRpb25BY3Rpb247Ci0gICAgICAgIG1NYW5kYXRvcnkgPSBtYW5kYXRvcnk7Ci0gICAgICAgIG1EZWZhdWx0VG9Qcm9qZWN0T25seSA9IGRlZmF1bHRUb1Byb2plY3RPbmx5OwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ3JlYXRlcyBhIGxhYmVsIHdpZGdldCBhbmQgYW4gYXNzb2NpYXRlZCB0ZXh0IGZpZWxkLgotICAgICAqIDxwLz4KLSAgICAgKiBBcyBtb3N0IG90aGVyIHBhcnRzIG9mIHRoZSBhbmRyb2lkIG1hbmlmZXN0IGVkaXRvciwgdGhpcyBhc3N1bWVzIHRoZQotICAgICAqIHBhcmVudCB1c2VzIGEgdGFibGUgbGF5b3V0IHdpdGggMiBjb2x1bW5zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVVpQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgc2V0TWFuYWdlZEZvcm0obWFuYWdlZEZvcm0pOwotICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciBkZXNjID0gKFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGxhYmVsLmFwcGVuZCgiPGZvcm0+PHA+PGEgaHJlZj0ndW51c2VkJz4iKTsKLSAgICAgICAgbGFiZWwuYXBwZW5kKGRlc2MuZ2V0VWlOYW1lKCkpOwotICAgICAgICBsYWJlbC5hcHBlbmQoIjwvYT48L3A+PC9mb3JtPiIpOwotICAgICAgICBGb3JtVGV4dCBmb3JtVGV4dCA9IFNlY3Rpb25IZWxwZXIuY3JlYXRlRm9ybVRleHQocGFyZW50LCB0b29sa2l0LCB0cnVlIC8qIGlzSHRtbCAqLywKLSAgICAgICAgICAgICAgICBsYWJlbC50b1N0cmluZygpLCB0cnVlIC8qIHNldHVwTGF5b3V0RGF0YSAqLyk7Ci0gICAgICAgIGZvcm1UZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5saW5rQWN0aXZhdGVkKGUpOwotICAgICAgICAgICAgICAgIGhhbmRsZUxhYmVsQ2xpY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZvcm1UZXh0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5MRUZULCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBTZWN0aW9uSGVscGVyLmFkZENvbnRyb2xUb29sdGlwKGZvcm1UZXh0LCBkZXNjLmdldFRvb2x0aXAoKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgICAgICAvLyBGaXhlcyBtaXNzaW5nIHRleHQgYm9yZGVycyB1bmRlciBHVEsuLi4gYWxzbyByZXF1aXJlcyBhZGRpbmcgYSAxLXBpeGVsIG1hcmdpbgotICAgICAgICAvLyBmb3IgdGhlIHRleHQgZmllbGQgYmVsb3cKLSAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQotICAgICAgICBmaW5hbCBUZXh0IHRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBnZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAxOyAgLy8gTmVlZGVkIGJ5IHRoZSBmaXhlZCBjb21wb3NpdGUgYm9yZGVycyB1bmRlciBHVEsKLSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIkJyb3dzZS4uLiIsIFNXVC5QVVNIKTsKLQotICAgICAgICBzZXRUZXh0V2lkZ2V0KHRleHQpOwotCi0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZUNsaWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICoKLSAgICAgKiBBZGQgYSBtb2RpZnkgbGlzdGVuZXIgdGhhdCB3aWxsIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY2xhc3MKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkFkZFZhbGlkYXRvcnMoZmluYWwgVGV4dCB0ZXh0KSB7Ci0gICAgICAgIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHRWYWx1ZSA9IHRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmRhdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiVmFsdWUgaXMgbWFuZGF0b3J5IiwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsLCB0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB3ZSBuZWVkIHRoZSBjdXJyZW50IGphdmEgcGFja2FnZS4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFQYWNrYWdlID0gZ2V0TWFuaWZlc3RQYWNrYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gQW5kcm9pZE1hbmlmZXN0LmNvbWJpbmVQYWNrYWdlQW5kQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFQYWNrYWdlLCB0ZXh0VmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdGVzdCB0aGUgdmlsaWJpbGl0eSBmb3IgYWN0aXZpdGllcy4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0ZXN0VmlzaWJpbGl0eSA9IEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfQUNUSVZJVFkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZlcmVuY2VDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCB0aGUgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKEJhc2VQcm9qZWN0SGVscGVyLnRlc3RDbGFzc0Zvck1hbmlmZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmdldEphdmFQcm9qZWN0KGdldFByb2plY3QoKSksIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVmZXJlbmNlQ2xhc3MsIHRlc3RWaXNpYmlsaXR5KSwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoY2UuZ2V0TWVzc2FnZSgpLCB0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWxpZGF0b3IgcmVtb3ZlcyBpdHMgbWVzc2FnZShzKSB3aGVuIHRoZSB3aWRnZXQgaXMgZGlzcG9zZWQKLSAgICAgICAgdGV4dC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byB1c2Ugc2V0RXJyb3JNZXNzYWdlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQKLSAgICAgICAgICAgICAgICAvLyB0aGUgZXJyb3IgZmxhZyBpbiB0aGUgVWlBdHRyaWJ1dGVOb2RlCi0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UodGV4dCwgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZpbmFsbHkgY2FsbCB0aGUgdmFsaWRhdG9yIG9uY2UgdG8gbWFrZSBzdXJlIHRoZSBpbml0aWFsIHZhbHVlIGlzIHByb2Nlc3NlZAotICAgICAgICBsaXN0ZW5lci5tb2RpZnlUZXh0KG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VDbGljaygpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dFdpZGdldCgpOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBwcm9qZWN0IG9mIHRoZSBtYW5pZmVzdC4KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBzZWFyY2ggc2NvcGUgaW5jbHVkaW5nIG9ubHkgdGhlIHNvdXJjZSBmb2xkZXIgb2YgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgIC8vIHByb2plY3QuCi0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmluY2x1ZGVfY29udGFpbmVycyovKTsKLSAgICAgICAgICAgIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlRnJhZ21lbnRSb290cywKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyh0ZXh0LmdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksCi0gICAgICAgICAgICAgICAgICAgIHNjb3BlLAotICAgICAgICAgICAgICAgICAgICBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgIC8vIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBubyBtdWx0aXBsZSBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgIioqIiwgIC8vJE5PTi1OTFMtMSQgLy9maWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgbmV3IEhpZXJhcmNoeVR5cGVTZWxlY3Rpb24ocHJvamVjdCwgbVJlZmVyZW5jZUNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgZGxnLnNldE1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiU2VsZWN0IGNsYXNzIG5hbWUgZm9yIGVsZW1lbnQgJTEkczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlQYXJlbnQoKS5nZXRCcmVhZGNydW1iVHJhaWxEZXNjcmlwdGlvbihmYWxzZSAvKiBpbmNsdWRlX3Jvb3QgKi8pKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRsZyBpbnN0YW5jZW9mIElUeXBlU2VsZWN0aW9uQ29tcG9uZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICgoSVR5cGVTZWxlY3Rpb25Db21wb25lbnQpZGxnKS50cmlnZ2VyU2VhcmNoKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdHMgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXdUeXBlKChJVHlwZSlyZXN1bHRzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZTEsICJVaUNsYXNzQXR0cmlidXRlTm9kZSBIYW5kbGVCcm93c2VyIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxhYmVsQ2xpY2soKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCB2YWx1ZQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgZnJvbSB0aGUgbWFuaWZlc3QuCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldE1hbmlmZXN0UGFja2FnZSgpOwotCi0gICAgICAgIGlmIChjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY3JlYXRlTmV3Q2xhc3MocGFja2FnZU5hbWUsIG51bGwgLyogY2xhc3NOYW1lICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGJ1aWxkIGJhY2sgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotICAgICAgICAgICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZnVsbENsYXNzTmFtZSA9IHBhY2thZ2VOYW1lICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IGNsYXNzTmFtZS5zcGxpdChBbmRyb2lkQ29uc3RhbnRzLlJFX0RPVCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZ1bGxDbGFzc05hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIGNsYXNzTmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGUgdHlwZSBpcyBlbmNsb3NlZCwgd2UgbmVlZCB0byByZXBsYWNlIHRoZSAkIHdpdGggLgotICAgICAgICAgICAgZnVsbENsYXNzTmFtZSA9IGZ1bGxDbGFzc05hbWUucmVwbGFjZUFsbCgiXFwkIiwgIlxcLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMyJAotCi0gICAgICAgICAgICAvLyBub3cgd2UgdHJ5IHRvIGZpbmQgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIGNsYXNzIGFuZCB3ZSBvcGVuIGl0IGluIHRoZSBlZGl0b3IuCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElUeXBlIHJlc3VsdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGZ1bGxDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBKYXZhVUkub3BlbkluRWRpdG9yKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIGxhc3Qgc2VnbWVudCBmcm9tIHRoZSBmdWxsQ2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZ1bGxDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVOZXdDbGFzcyhmdWxsQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxDbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4KzEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU5ld0NsYXNzKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJVaUNsYXNzQXR0cmlidXRlTm9kZSBIYW5kbGVMYWJlbCBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJVaUNsYXNzQXR0cmlidXRlTm9kZSBIYW5kbGVMYWJlbCBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5vZGUgPSBnZXRVaVBhcmVudCgpOwotICAgICAgICBBbmRyb2lkRWRpdG9yIGVkaXRvciA9IHVpTm9kZS5nZXRFZGl0b3IoKTsKLSAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpbGUgZWRpdG9yIHdlIGNhbiBnZXQgdGhlIElGaWxlIG9iamVjdCwgYW5kIGZyb20gaXQsIHRoZSBJUHJvamVjdC4KLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmdldFByb2plY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgL21hbmlmZXN0L3BhY2thZ2UgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldE1hbmlmZXN0UGFja2FnZSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSByb290IHVpTm9kZSB0byBnZXQgdGhlICdwYWNrYWdlJyBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgIFVpRWxlbWVudE5vZGUgcm9vdE5vZGUgPSBnZXRVaVBhcmVudCgpLmdldFVpUm9vdCgpOwotCi0gICAgICAgIEVsZW1lbnQgeG1sRWxlbWVudCA9IChFbGVtZW50KSByb290Tm9kZS5nZXRYbWxOb2RlKCk7Ci0KLSAgICAgICAgaWYgKHhtbEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHhtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzLlBBQ0tBR0VfQVRUUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzb3VyY2UgZm9sZGVycyBvZgotICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBpbmNsdWRlX2NvbnRhaW5lcnMgVHJ1ZSB0byBpbmNsdWRlIGNvbnRhaW5lcnMKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIElQYWNrYWdlRnJhZ21lbnRSb290LgotICAgICAqLwotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlX2NvbnRhaW5lcnMpIHsKLSAgICAgICAgQXJyYXlMaXN0PElQYWNrYWdlRnJhZ21lbnRSb290PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElQYWNrYWdlRnJhZ21lbnRSb290PigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcm9vdHNbaV0uZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbmNsdWRlX2NvbnRhaW5lcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocm9vdHNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXdUeXBlKElUeXBlIHR5cGUpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dFdpZGdldCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2l0aCAkIHRvIHByb3Blcmx5IGRldGVjdCB0aGUgZW5jbG9zaW5nIHR5cGVzLgotICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VWYWx1ZSA9IGdldE1hbmlmZXN0UGFja2FnZSgpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGFzcyBkb2Vzbid0IHN0YXJ0IHdpdGggdGhlIHBhY2thZ2UuCi0gICAgICAgIGlmIChwYWNrYWdlVmFsdWUubGVuZ3RoKCkgPiAwICYmIG5hbWUuc3RhcnRzV2l0aChwYWNrYWdlVmFsdWUpKSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBkb2VzLCB3ZSByZW1vdmUgdGhlIHBhY2thZ2UgYW5kIHRoZSBmaXJzdCBkb3QuCi0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcocGFja2FnZVZhbHVlLmxlbmd0aCgpICsgMSk7Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIGhvdyBtYW55IHNlZ21lbnRzIHdlIGhhdmUgbGVmdC4KLSAgICAgICAgICAgIC8vIGlmIG9uZSwganVzdCB3cml0ZSBpdCB0aGF0IHdheS4KLSAgICAgICAgICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUsIHdyaXRlIGl0IHdpdGggYSBsZWFkaW5nIGRvdC4KLSAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VzID0gbmFtZS5zcGxpdChBbmRyb2lkQ29uc3RhbnRzLlJFX0RPVCk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dCgiLiIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld0NsYXNzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIHdpemFyZCBwYWdlIGZvciB0aGUgY2xhc3MgY3JlYXRpb24sIGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgTmV3Q2xhc3NXaXphcmRQYWdlIHBhZ2UgPSBuZXcgTmV3Q2xhc3NXaXphcmRQYWdlKCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBwYXJlbnQgY2xhc3MKLSAgICAgICAgcGFnZS5zZXRTdXBlckNsYXNzKG1SZWZlcmVuY2VDbGFzcywgdHJ1ZSAvKiBjYW5CZU1vZGlmaWVkICovKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNvdXJjZSBmb2xkZXJzIGFzIGphdmEgZWxlbWVudHMuCi0gICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKmluY2x1ZGVfY29udGFpbmVycyovKTsKLQotICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBjdXJyZW50Um9vdCA9IG51bGw7Ci0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgY3VycmVudEZyYWdtZW50ID0gbnVsbDsKLSAgICAgICAgaW50IHBhY2thZ2VNYXRjaENvdW50ID0gLTE7Ci0KLSAgICAgICAgZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogcm9vdHMpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgamF2YSBlbGVtZW50IGZvciB0aGUgcGFja2FnZS4KLSAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHNhaWQgdG8gYWx3YXlzIHJldHVybiBhIElQYWNrYWdlRnJhZ21lbnQgZXZlbiBpZiB0aGUKLSAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgZm9sZGVyIGRvZXNuJ3QgZXhpc3QuLi4KLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCAmJiBmcmFnbWVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwZXJmZWN0IG1hdGNoISB3ZSB1c2UgaXQuCi0gICAgICAgICAgICAgICAgY3VycmVudFJvb3QgPSByb290OwotICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFnbWVudCA9IGZyYWdtZW50OwotICAgICAgICAgICAgICAgIHBhY2thZ2VNYXRjaENvdW50ID0gLTE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBtYXRjaC4gd2UgbG9vayBmb3IgdGhlIGZyYWdtZW50IHdpdGggdGhlIGJlc3QgbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyAoaWUgdGhlIGNsb3Nlc3QgcGFyZW50IHBhY2thZ2Ugd2UgY2FuIGZpbmQpCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSUphdmFFbGVtZW50W10gY2hpbGRyZW47Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKElKYXZhRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuc3RhcnRzV2l0aChmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgYSBtYXRjaC4gZ2V0IHRoZSBudW1iZXIgb2Ygc2VnbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSBmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLnNwbGl0KCJcXC4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoID4gcGFja2FnZU1hdGNoQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VNYXRjaENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um9vdCA9IHJvb3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBnZXQgdGhlIGNoaWxkcmVuOiB3ZSBqdXN0IGlnbm9yZSB0aGlzIHBhY2thZ2Ugcm9vdC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudD4gY3JlYXRlZEZyYWdtZW50cyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBwZXJmZWN0IG1hdGNoLCB3ZSBzZXQgaXQgYW5kIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoQ291bnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBwYWdlLnNldFBhY2thZ2VGcmFnbWVudFJvb3QoY3VycmVudFJvb3QsIHRydWUgLyogY2FuQmVNb2RpZmllZCovKTsKLSAgICAgICAgICAgICAgICBwYWdlLnNldFBhY2thZ2VGcmFnbWVudChjdXJyZW50RnJhZ21lbnQsIHRydWUgLyogY2FuQmVNb2RpZmllZCAqLyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwYXJ0aWFsIG1hdGNoLgotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGFja2FnZS4gV2UgaGF2ZSB0byBzdGFydCB3aXRoIHRoZSBmaXJzdCBzZWdtZW50IHNvIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAvLyBrbm93IHdoYXQgdG8gZGVsZXRlIGluIGNhc2Ugb2YgYSBjYW5jZWwuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudD4oKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWxDb3VudCA9IHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKS5sZW5ndGg7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIG1hdGNoaW5nIHBhY2thZ2VzCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IHBhY2thZ2VNYXRjaENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBhY2thZ2VOYW1lLmluZGV4T2YoJy4nLCBpbmRleCsxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlc3Qgb2YgdGhlIHNlZ21lbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IG9uZSBhcyBpbmRleE9mIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQgPCB0b3RhbENvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYWNrYWdlTmFtZS5pbmRleE9mKCcuJywgaW5kZXgrMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEZyYWdtZW50cy5hZGQoY3VycmVudFJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGZvcmNlKi8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbGFzdCBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRGcmFnbWVudHMuYWRkKGN1cnJlbnRSb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgdHJ1ZSAvKiBmb3JjZSovLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSByb290IGFuZCBmcmFnbWVudCBpbiB0aGUgV2l6YXJkIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5zZXRQYWNrYWdlRnJhZ21lbnRSb290KGN1cnJlbnRSb290LCB0cnVlIC8qIGNhbkJlTW9kaWZpZWQqLyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UGFja2FnZUZyYWdtZW50KGNyZWF0ZWRGcmFnbWVudHMuZ2V0KGNyZWF0ZWRGcmFnbWVudHMuc2l6ZSgpLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FuQmVNb2RpZmllZCAqLyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgY3JlYXRlIHRoZSBwYWNrYWdlcywgdGhlcmUncyBhIHByb2JsZW0uIHdlIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAvLyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IHJvb3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGphdmEgZWxlbWVudCBmb3IgdGhlIHBhY2thZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBzYWlkIHRvIGFsd2F5cyByZXR1cm4gYSBJUGFja2FnZUZyYWdtZW50IGV2ZW4gaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcmx5aW5nIGZvbGRlciBkb2Vzbid0IGV4aXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLnNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCwgdHJ1ZSAvKiBjYW5CZU1vZGlmaWVkKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Uuc2V0UGFja2FnZUZyYWdtZW50KGZyYWdtZW50LCB0cnVlIC8qIGNhbkJlTW9kaWZpZWQgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJvb3RzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgYSB2YWxpZCBmcmFnbWVudCwgd2Ugc2V0IHRoZSByb290IHRvIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyLgotICAgICAgICAgICAgcGFnZS5zZXRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3RzWzBdLCB0cnVlIC8qIGNhbkJlTW9kaWZpZWQqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RhcnRpbmcgY2xhc3MgbmFtZSB3ZSB1c2UgaXQKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWdlLnNldFR5cGVOYW1lKGNsYXNzTmFtZSwgdHJ1ZSAvKiBjYW5CZU1vZGlmaWVkKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBhY3Rpb24gdGhhdCB3aWxsIG9wZW4gaXQgdGhlIHdpemFyZC4KLSAgICAgICAgT3Blbk5ld0NsYXNzV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuTmV3Q2xhc3NXaXphcmRBY3Rpb24oKTsKLSAgICAgICAgYWN0aW9uLnNldENvbmZpZ3VyZWRXaXphcmRQYWdlKHBhZ2UpOwotICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIElKYXZhRWxlbWVudCBlbGVtZW50ID0gYWN0aW9uLmdldENyZWF0ZWRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotCi0gICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSllbGVtZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKG1Qb3N0Q3JlYXRpb25BY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUG9zdENyZWF0aW9uQWN0aW9uLnByb2Nlc3NOZXdUeXBlKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGhhbmRsZU5ld1R5cGUodHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBsZXRzIGRlbGV0ZSB0aGUgcGFja2FnZXMgd2UgY3JlYXRlZCBqdXN0IGZvciB0aGlzLgotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBzdGFydCB3aXRoIHRoZSBsZWFmIGFuZCBnbyB1cAotICAgICAgICAgICAgaWYgKGNyZWF0ZWRGcmFnbWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjcmVhdGVkRnJhZ21lbnRzLnNpemUoKSAtIDEgOyBpID49IDAgOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRGcmFnbWVudHMuZ2V0KGkpLmRlbGV0ZSh0cnVlIC8qIGZvcmNlKi8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlcy4gSWYgbWVzc2FnZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIG1lc3NhZ2UgaXMgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgY3VycmVudCBtZXNzYWdlCi0gICAgICogQHBhcmFtIHRleHRXaWRnZXQgdGhlIHtAbGluayBUZXh0fSB3aWRnZXQgYXNzb2NpYXRlZCB0byB0aGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBUZXh0IHRleHRXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0SGFzRXJyb3IodHJ1ZSk7Ci0gICAgICAgICAgICBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZSh0ZXh0V2lkZ2V0LCBtZXNzYWdlLCBudWxsIC8qIGRhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHRleHRXaWRnZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpOwotICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UodGV4dFdpZGdldCwgdGV4dFdpZGdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoU3RyaW5nIHByZWZpeCkgewotICAgICAgICAvLyBUT0RPOiBjb21wdXRlIGEgbGlzdCBvZiBleGlzdGluZyBjbGFzc2VzIGZvciBjb250ZW50IGFzc2lzdCBjb21wbGV0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvbW9kZWwvVWlNYW5pZmVzdEVsZW1lbnROb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaU1hbmlmZXN0RWxlbWVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjODU0NC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaU1hbmlmZXN0RWxlbWVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5NYW5pZmVzdEVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIG5vZGUgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIgaW50ZXJmYWNlIGluIHRoZSBYTUwgZWRpdG9yLgotICogPHAvPgotICogRWFjaCB0cmVlIHZpZXdlciB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBwYWdlJ3MgcGFydHMgbmVlZHMgdG8ga2VlcCBhIG1vZGVsIHJlcHJlc2VudGluZwotICogZWFjaCB1bmRlcmx5aW5nIG5vZGUgaW4gdGhlIHRyZWUuIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIGJhc2UgdHlwZSBmb3Igc3VjaCBhIG5vZGUuCi0gKiA8cC8+Ci0gKiBFYWNoIG5vZGUgYWN0cyBhcyBhbiBpbnRlcm1lZGlhcnkgbW9kZWwgYmV0d2VlbiB0aGUgYWN0dWFsIFhNTCBtb2RlbCAodGhlIHJlYWwgZGF0YSBzdXBwb3J0KQotICogYW5kIHRoZSB0cmVlIHZpZXdlcnMgb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFnZSBwYXJ0cy4KLSAqIDxwLz4KLSAqIEVsZW1lbnQgbm9kZXMgZG9uJ3QgY29udGFpbiBkYXRhIHBlciBzZS4gVGhlaXIgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlaXIgYXR0cmlidXRlcwotICogYXMgd2VsbCBhcyB0aGVpciBjaGlsZHJlbidzIGF0dHJpYnV0ZXMsIHNlZSB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfS4KLSAqIDxwLz4KLSAqIFRoZSBzdHJ1Y3R1cmUgb2YgYSBnaXZlbiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gaXMgZGVjbGFyZWQgYnkgYSBjb3JyZXNwb25kaW5nCi0gKiB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVWlNYW5pZmVzdEVsZW1lbnROb2RlIGV4dGVuZHMgVWlFbGVtZW50Tm9kZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVaUVsZW1lbnROb2RlfSBkZXNjcmliZWQgYnkgYSBnaXZlbiB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnREZXNjcmlwdG9yIFRoZSB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGZvciB0aGUgWE1MIG5vZGUuIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBVaU1hbmlmZXN0RWxlbWVudE5vZGUoTWFuaWZlc3RFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICBzdXBlcihlbGVtZW50RGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgYSBzaG9ydCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVUkgbm9kZSBzdWl0YWJsZSBmb3IgdHJlZSB2aWV3cy4KLSAgICAgKiBVc2VzIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlICJhbmRyb2lkOm5hbWUiIGlmIHByZXNlbnQsIG9yIHRoZSAiYW5kcm9pZDpsYWJlbCIgb25lCi0gICAgICogZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQncyBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBBIHNob3J0IHN0cmluZyBkZXNjcmliaW5nIHRoZSBVSSBub2RlIHN1aXRhYmxlIGZvciB0cmVlIHZpZXdzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgdGFyZ2V0ID0gZ2V0QW5kcm9pZFRhcmdldCgpOwotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3JzID0gbnVsbDsKLSAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYW5pZmVzdERlc2NyaXB0b3JzID0gdGFyZ2V0LmdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYW5pZmVzdERlc2NyaXB0b3JzICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBnZXRYbWxOb2RlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGdldFhtbE5vZGUoKSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYKLSAgICAgICAgICAgICAgICBnZXRYbWxOb2RlKCkuaGFzQXR0cmlidXRlcygpKSB7Ci0KLQotICAgICAgICAgICAgLy8gQXBwbGljYXRpb24gYW5kIE1hbmlmZXN0IG5vZGVzIGhhdmUgYSBzcGVjaWFsIHRyZWF0bWVudDogdGhleSBhcmUgdW5pcXVlIG5vZGVzCi0gICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGRpZmZlcmVudGlhdGUgdGhlaXIgc3RyaW5ncyBhbmQgd2UgZmFsbCBiYWNrIHRvCi0gICAgICAgICAgICAvLyBqdXN0IHVzaW5nIHRoZSBVSSBuYW1lIGJlbG93LgotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IGdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG1hbmlmZXN0RGVzY3JpcHRvcnMuZ2V0TWFuaWZlc3RFbGVtZW50KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVzYyAhPSBtYW5pZmVzdERlc2NyaXB0b3JzLmdldEFwcGxpY2F0aW9uRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIGdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlTlMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMuQU5EUk9JRF9OQU1FX0FUVFIpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwgfHwgYXR0ci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZU5TKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzLkFORFJPSURfTEFCRUxfQVRUUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHMgKCUyJHMpIiwgYXR0ciwgZ2V0RGVzY3JpcHRvcigpLmdldFVpTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyIsIGdldERlc2NyaXB0b3IoKS5nZXRVaU5hbWUoKSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaU1hbmlmZXN0UGtnQXR0ck5vZGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L21vZGVsL1VpTWFuaWZlc3RQa2dBdHRyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Njg3ZWNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L21vZGVsL1VpTWFuaWZlc3RQa2dBdHRyTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QubW9kZWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuU2VjdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaVRleHRBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zLk5ld1Byb2plY3RBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdQcm9qZWN0V2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgYXR0cmlidXRlIHRvIHNlbGVjdCBhbiBleGlzaW50ZyBtYW5pZmVzdCBwYWNrYWdlLCB0aGF0IGNhbiBiZSBtb2RpZmllZCB1c2luZwotICogYSBzaW1wbGUgdGV4dCBmaWVsZCBvciBhIGRpYWxvZyB0byBjaG9vc2UgYW4gZXhpc3RpbmcgcGFja2FnZS4KLSAqIDxwLz4KLSAqIFNlZSB7QGxpbmsgVWlUZXh0QXR0cmlidXRlTm9kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVaU1hbmlmZXN0UGtnQXR0ck5vZGUgZXh0ZW5kcyBVaVRleHRBdHRyaWJ1dGVOb2RlIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVWlNYW5pZmVzdFBrZ0F0dHJOb2RlfSBvYmplY3QgdGhhdCB3aWxsIGRpc3BsYXkgdWkgdG8gc2VsZWN0IG9yIGNyZWF0ZQotICAgICAqIGEgbWFuaWZlc3QgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlRGVzY3JpcHRvciB0aGUge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9IG9iamVjdCBsaW5rZWQgdG8gdGhlIFVpIE5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFVpTWFuaWZlc3RQa2dBdHRyTm9kZShBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoYXR0cmlidXRlRGVzY3JpcHRvciwgdWlQYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ3JlYXRlcyBhIGxhYmVsIHdpZGdldCBhbmQgYW4gYXNzb2NpYXRlZCB0ZXh0IGZpZWxkLgotICAgICAqIDxwLz4KLSAgICAgKiBBcyBtb3N0IG90aGVyIHBhcnRzIG9mIHRoZSBhbmRyb2lkIG1hbmlmZXN0IGVkaXRvciwgdGhpcyBhc3N1bWVzIHRoZQotICAgICAqIHBhcmVudCB1c2VzIGEgdGFibGUgbGF5b3V0IHdpdGggMiBjb2x1bW5zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVVpQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgc2V0TWFuYWdlZEZvcm0obWFuYWdlZEZvcm0pOwotICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciBkZXNjID0gKFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGxhYmVsLmFwcGVuZCgiPGZvcm0+PHA+PGEgaHJlZj0ndW51c2VkJz4iKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbGFiZWwuYXBwZW5kKGRlc2MuZ2V0VWlOYW1lKCkpOwotICAgICAgICBsYWJlbC5hcHBlbmQoIjwvYT48L3A+PC9mb3JtPiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBGb3JtVGV4dCBmb3JtVGV4dCA9IFNlY3Rpb25IZWxwZXIuY3JlYXRlRm9ybVRleHQocGFyZW50LCB0b29sa2l0LCB0cnVlIC8qIGlzSHRtbCAqLywKLSAgICAgICAgICAgICAgICBsYWJlbC50b1N0cmluZygpLCB0cnVlIC8qIHNldHVwTGF5b3V0RGF0YSAqLyk7Ci0gICAgICAgIGZvcm1UZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5saW5rQWN0aXZhdGVkKGUpOwotICAgICAgICAgICAgICAgIGRvTGFiZWxDbGljaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZm9ybVRleHQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkxFRlQsIFRhYmxlV3JhcERhdGEuTUlERExFKSk7Ci0gICAgICAgIFNlY3Rpb25IZWxwZXIuYWRkQ29udHJvbFRvb2x0aXAoZm9ybVRleHQsIGRlc2MuZ2V0VG9vbHRpcCgpKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQiwgVGFibGVXcmFwRGF0YS5NSURETEUpKTsKLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgLy8gRml4ZXMgbWlzc2luZyB0ZXh0IGJvcmRlcnMgdW5kZXIgR1RLLi4uIGFsc28gcmVxdWlyZXMgYWRkaW5nIGEgMS1waXhlbCBtYXJnaW4KLSAgICAgICAgLy8gZm9yIHRoZSB0ZXh0IGZpZWxkIGJlbG93Ci0gICAgICAgIHRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBUZXh0IHRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBnZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAxOyAgLy8gTmVlZGVkIGJ5IHRoZSBmaXhlZCBjb21wb3NpdGUgYm9yZGVycyB1bmRlciBHVEsKLSAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICBzZXRUZXh0V2lkZ2V0KHRleHQpOwotCi0gICAgICAgIEJ1dHRvbiBicm93c2VCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJCcm93c2UuLi4iLCBTV1QuUFVTSCk7Ci0gICAgICAgIAotICAgICAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBkb0Jyb3dzZUNsaWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBBZGRzIGEgdmFsaWRhdG9yIHRvIHRoZSB0ZXh0IGZpZWxkIHRoYXQgY2FsbHMgbWFuYWdlZEZvcm0uZ2V0TWVzc2FnZU1hbmFnZXIoKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkFkZFZhbGlkYXRvcnMoZmluYWwgVGV4dCB0ZXh0KSB7Ci0gICAgICAgIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VfbmFtZSA9IHRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlX25hbWUuaW5kZXhPZignLicpIDwgMSkgewotICAgICAgICAgICAgICAgICAgICBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZSh0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYWNrYWdlIG5hbWUgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgdHdvIGlkZW50aWZpZXJzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBkYXRhICovLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SLCB0ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZSh0ZXh0LCB0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWxpZGF0b3IgcmVtb3ZlcyBpdHMgbWVzc2FnZShzKSB3aGVuIHRoZSB3aWRnZXQgaXMgZGlzcG9zZWQKLSAgICAgICAgdGV4dC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UodGV4dCwgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZpbmFsbHkgY2FsbCB0aGUgdmFsaWRhdG9yIG9uY2UgdG8gbWFrZSBzdXJlIHRoZSBpbml0aWFsIHZhbHVlIGlzIHByb2Nlc3NlZAotICAgICAgICBsaXN0ZW5lci5tb2RpZnlUZXh0KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgcmVzcG9uc2UgdG8gdGhlIEJyb3dzZSBidXR0b24gYnkgY3JlYXRpbmcgYSBQYWNrYWdlIGRpYWxvZy4KLSAgICAgKiAqLwotICAgIHByaXZhdGUgdm9pZCBkb0Jyb3dzZUNsaWNrKCkgewotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGxheSB0aGUgbGlzdCBvZiBBbmRyb2lkTWFuaWZlc3QgcGFja2FnZXMgaW4gYSBzZWxlY3Rpb24gZGlhbG9nCi0gICAgICAgIEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBuZXcgSUxhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIGRpYWxvZy5zZXRUaXRsZSgiQW5kcm9pZCBNYW5pZmVzdCBQYWNrYWdlIFNlbGVjdGlvbiIpOwotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZSgiU2VsZWN0IHRoZSBBbmRyb2lkIE1hbmlmZXN0IHBhY2thZ2UgdG8gdGFyZ2V0LiIpOwotCi0gICAgICAgIGRpYWxvZy5zZXRFbGVtZW50cyhnZXRQb3NzaWJsZVZhbHVlcyhudWxsKSk7Ci0KLSAgICAgICAgLy8gb3BlbiB0aGUgZGlhbG9nIGFuZCB1c2UgdGhlIG9iamVjdCBzZWxlY3RlZCBpZiBPSyB3YXMgY2xpY2tlZCwgb3IgbnVsbCBvdGhlcndpc2UKLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGdldFRleHRXaWRnZXQoKS5zZXRUZXh0KHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHJlc3BvbnNlIHRvIHRoZSBMYWJlbCBoeXBlciBsaW5rIGJlaW5nIGFjdGl2YXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9MYWJlbENsaWNrKCkgewotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgcGFja2FnZSBuYW1lCi0gICAgICAgIFN0cmluZyBwYWNrYWdlX25hbWUgPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwYWNrYWdlX25hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY3JlYXRlTmV3UHJvamVjdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGxheUV4aXN0aW5nTWFuaWZlc3QocGFja2FnZV9uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIGxhYmVsIGlzIGNsaWNrZWQgYW5kIHRoZXJlJ3MgYWxyZWFkeSBhIHBhY2thZ2UgbmFtZSwgdGhpcyBtZXRob2QKLSAgICAgKiBhdHRlbXB0cyB0byBmaW5kIHRoZSBwcm9qZWN0IG1hdGNoaW5nIHRoZSBhbmRyb2lkIHBhY2thZ2UgbmFtZSBhbmQgaXQgYXR0ZW1wdHMKLSAgICAgKiB0byBvcGVuIHRoZSBtYW5pZmVzdCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2thZ2VfbmFtZSBUaGUgYW5kcm9pZCBwYWNrYWdlIG5hbWUgdG8gZmluZC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUV4aXN0aW5nTWFuaWZlc3QoU3RyaW5nIHBhY2thZ2VfbmFtZSkgewotCi0gICAgICAgIC8vIExvb2sgZm9yIHRoZSBmaXJzdCBwcm9qZWN0IHRoYXQgdXNlcyB0aGlzIHBhY2thZ2UgbmFtZQotICAgICAgICBmb3IgKElKYXZhUHJvamVjdCBwcm9qZWN0IDogQmFzZVByb2plY3RIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3RzKCkpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgaW5kZWVkIGEgbWFuaWZlc3QgZmlsZS4KLSAgICAgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5nZXRNYW5pZmVzdChwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBmaWxlPyBza2lwIHRoaXMgcHJvamVjdC4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlciA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEobWFuaWZlc3RGaWxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgaGFuZGxlZCBiZWxvdy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBwcm9qZWN0LgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFja2FnZV9uYW1lLmVxdWFscyhwYXJzZXIuZ2V0UGFja2FnZSgpKSkgewotICAgICAgICAgICAgICAgIC8vIEZvdW5kIHRoZSBwcm9qZWN0LiAKLQotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgICAgICBpZiAod2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbi5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5vcGVuRWRpdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3RFZGl0b3IuSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKiBhY3RpdmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGVuaW5nIGVkaXRvciBmYWlsZWQgZm9yICVzIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBwcm9qZWN0OyBldmVuIGlmIHdlIGZhaWxlZCB0aGVyZSdzIG5vIG5lZWQgdG8ga2VlcCBsb29raW5nLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXlzIHRoZSBOZXcgUHJvamVjdCBXaXphcmQgdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi0gICAgICogSWYgb25lIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCB1c2UgdGhlIEFuZHJvaWQgUGFja2FnZSBuYW1lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdQcm9qZWN0KCkgewotCi0gICAgICAgIE5ld1Byb2plY3RBY3Rpb24gbnB3QWN0aW9uID0gbmV3IE5ld1Byb2plY3RBY3Rpb24oKTsKLSAgICAgICAgbnB3QWN0aW9uLnJ1bihudWxsIC8qYWN0aW9uKi8pOwotICAgICAgICBpZiAobnB3QWN0aW9uLmdldERpYWxvZ1Jlc3VsdCgpID09IERpYWxvZy5PSykgewotICAgICAgICAgICAgTmV3UHJvamVjdFdpemFyZCBucHcgPSAoTmV3UHJvamVjdFdpemFyZCkgbnB3QWN0aW9uLmdldFdpemFyZCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBucHcuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBnZXRUZXh0V2lkZ2V0KCkuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBwb3NzaWJsZSBhbmRyb2lkIHBhY2thZ2UgbmFtZXMgdGhhdCBjb3VsZCBiZSB1c2VkLgotICAgICAqIFRoZSBwcmVmaXggaXMgbm90IHVzZWQuCi0gICAgICogCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKElKYXZhUHJvamVjdCBwcm9qZWN0IDogQmFzZVByb2plY3RIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3RzKCkpIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgaW5kZWVkIGEgbWFuaWZlc3QgZmlsZS4KLSAgICAgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5nZXRNYW5pZmVzdChwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBmaWxlPyBza2lwIHRoaXMgcHJvamVjdC4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlciA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEobWFuaWZlc3RGaWxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgaGFuZGxlZCBiZWxvdy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBwcm9qZWN0LgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYWNrYWdlcy5hZGQocGFyc2VyLmdldFBhY2thZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFja2FnZXMudG9BcnJheShuZXcgU3RyaW5nW3BhY2thZ2VzLnNpemUoKV0pOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvbW9kZWwvVWlQYWNrYWdlQXR0cmlidXRlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvbW9kZWwvVWlQYWNrYWdlQXR0cmlidXRlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ1ZDMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L21vZGVsL1VpUGFja2FnZUF0dHJpYnV0ZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lm1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuU2VjdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaVRleHRBdHRyaWJ1dGVOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5PcGVuTmV3UGFja2FnZVdpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TaG93SW5QYWNrYWdlVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIGF0dHJpYnV0ZSBmb3IgYSBwYWNrYWdlLCB0aGF0IGNhbiBiZSBtb2RpZmllZCB1c2luZyBhIHNpbXBsZSB0ZXh0IGZpZWxkIG9yCi0gKiBhIGRpYWxvZyB0byBjaG9vc2UgYW4gZXhpc3RpbmcgcGFja2FnZS4gQWxzbywgdGhlcmUncyBhIGxpbmsgdG8gY3JlYXRlIGEgbmV3IHBhY2thZ2UuCi0gKiA8cC8+Ci0gKiBTZWUge0BsaW5rIFVpVGV4dEF0dHJpYnV0ZU5vZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVWlQYWNrYWdlQXR0cmlidXRlTm9kZSBleHRlbmRzIFVpVGV4dEF0dHJpYnV0ZU5vZGUgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBVaVBhY2thZ2VBdHRyaWJ1dGVOb2RlfSBvYmplY3QgdGhhdCB3aWxsIGRpc3BsYXkgdWkgdG8gc2VsZWN0IG9yIGNyZWF0ZQotICAgICAqIGEgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlRGVzY3JpcHRvciB0aGUge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9IG9iamVjdCBsaW5rZWQgdG8gdGhlIFVpIE5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFVpUGFja2FnZUF0dHJpYnV0ZU5vZGUoQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIENyZWF0ZXMgYSBsYWJlbCB3aWRnZXQgYW5kIGFuIGFzc29jaWF0ZWQgdGV4dCBmaWVsZC4KLSAgICAgKiA8cC8+Ci0gICAgICogQXMgbW9zdCBvdGhlciBwYXJ0cyBvZiB0aGUgYW5kcm9pZCBtYW5pZmVzdCBlZGl0b3IsIHRoaXMgYXNzdW1lcyB0aGUKLSAgICAgKiBwYXJlbnQgdXNlcyBhIHRhYmxlIGxheW91dCB3aXRoIDIgY29sdW1ucy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVVaUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHNldE1hbmFnZWRGb3JtKG1hbmFnZWRGb3JtKTsKLSAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLSAgICAgICAgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IChUZXh0QXR0cmlidXRlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBsYWJlbC5hcHBlbmQoIjxmb3JtPjxwPjxhIGhyZWY9J3VudXNlZCc+Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGxhYmVsLmFwcGVuZChkZXNjLmdldFVpTmFtZSgpKTsKLSAgICAgICAgbGFiZWwuYXBwZW5kKCI8L2E+PC9wPjwvZm9ybT4iKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRm9ybVRleHQgZm9ybVRleHQgPSBTZWN0aW9uSGVscGVyLmNyZWF0ZUZvcm1UZXh0KHBhcmVudCwgdG9vbGtpdCwgdHJ1ZSAvKiBpc0h0bWwgKi8sCi0gICAgICAgICAgICAgICAgbGFiZWwudG9TdHJpbmcoKSwgdHJ1ZSAvKiBzZXR1cExheW91dERhdGEgKi8pOwotICAgICAgICBmb3JtVGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIubGlua0FjdGl2YXRlZChlKTsKLSAgICAgICAgICAgICAgICBkb0xhYmVsQ2xpY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZvcm1UZXh0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5MRUZULCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBTZWN0aW9uSGVscGVyLmFkZENvbnRyb2xUb29sdGlwKGZvcm1UZXh0LCBkZXNjLmdldFRvb2x0aXAoKSk7Ci0gICAgICAgIAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsIFRhYmxlV3JhcERhdGEuTUlERExFKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgICAgIC8vIEZpeGVzIG1pc3NpbmcgdGV4dCBib3JkZXJzIHVuZGVyIEdUSy4uLiBhbHNvIHJlcXVpcmVzIGFkZGluZyBhIDEtcGl4ZWwgbWFyZ2luCi0gICAgICAgIC8vIGZvciB0aGUgdGV4dCBmaWVsZCBiZWxvdwotICAgICAgICB0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgZ2V0Q3VycmVudFZhbHVlKCkpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMTsgIC8vIE5lZWRlZCBieSB0aGUgZml4ZWQgY29tcG9zaXRlIGJvcmRlcnMgdW5kZXIgR1RLCi0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgc2V0VGV4dFdpZGdldCh0ZXh0KTsKLQotICAgICAgICBCdXR0b24gYnJvd3NlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiQnJvd3NlLi4uIiwgU1dULlBVU0gpOwotICAgICAgICAKLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgZG9Ccm93c2VDbGljaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQWRkcyBhIHZhbGlkYXRvciB0byB0aGUgdGV4dCBmaWVsZCB0aGF0IGNhbGxzIG1hbmFnZWRGb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BZGRWYWxpZGF0b3JzKGZpbmFsIFRleHQgdGV4dCkgewotICAgICAgICBNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlX25hbWUgPSB0ZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZV9uYW1lLmluZGV4T2YoJy4nKSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UodGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFja2FnZSBuYW1lIHNob3VsZCBjb250YWluIGF0IGxlYXN0IHR3byBpZGVudGlmaWVycy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogZGF0YSAqLywgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UodGV4dCwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmFsaWRhdG9yIHJlbW92ZXMgaXRzIG1lc3NhZ2Uocykgd2hlbiB0aGUgd2lkZ2V0IGlzIGRpc3Bvc2VkCi0gICAgICAgIHRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlKHRleHQsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBGaW5hbGx5IGNhbGwgdGhlIHZhbGlkYXRvciBvbmNlIHRvIG1ha2Ugc3VyZSB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBwcm9jZXNzZWQKLSAgICAgICAgbGlzdGVuZXIubW9kaWZ5VGV4dChudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHJlc3BvbnNlIHRvIHRoZSBCcm93c2UgYnV0dG9uIGJ5IGNyZWF0aW5nIGEgUGFja2FnZSBkaWFsb2cuCi0gICAgICogKi8KLSAgICBwcml2YXRlIHZvaWQgZG9Ccm93c2VDbGljaygpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dFdpZGdldCgpOwotICAgICAgICAKLSAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIHByb2plY3Qgb2YgdGhlIG1hbmlmZXN0LgotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uRGlhbG9nIGRsZyA9IEphdmFVSS5jcmVhdGVQYWNrYWdlRGlhbG9nKHRleHQuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgMCk7Ci0gICAgICAgICAgICAgICAgZGxnLnNldFRpdGxlKCJTZWxlY3QgQW5kcm9pZCBQYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgZGxnLnNldE1lc3NhZ2UoIlNlbGVjdCB0aGUgcGFja2FnZSBmb3IgdGhlIEFuZHJvaWQgcHJvamVjdC4iKTsKLSAgICAgICAgICAgICAgICBTZWxlY3Rpb25EaWFsb2cuc2V0RGVmYXVsdEltYWdlKEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpKTsKLQotICAgICAgICAgICAgICAgIGlmIChkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSByZXN1bHRzID0gZGxnLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFja2FnZVRleHRGaWVsZCgoSVBhY2thZ2VGcmFnbWVudClyZXN1bHRzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyByZXNwb25zZSB0byB0aGUgTGFiZWwgaHlwZXIgbGluayBiZWluZyBhY3RpdmF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvTGFiZWxDbGljaygpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBTdHJpbmcgcGFja2FnZV9uYW1lID0gZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocGFja2FnZV9uYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNyZWF0ZU5ld1BhY2thZ2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIHBhY2thZ2UgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIgZm9yIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAvLyBwcm9qZWN0IGFuZCB0aGUgY3VycmVudCBlZGl0b3IncyBzaXRlLgotCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIkZhaWxlZCB0byBnZXQgcHJvamVjdCBmb3IgVWlQYWNrYWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gZ2V0VWlQYXJlbnQoKS5nZXRFZGl0b3IoKS5nZXRTaXRlKCk7Ci0gICAgICAgICAgICBpZiAoc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAiRmFpbGVkIHRvIGdldCBlZGl0b3Igc2l0ZSBmb3IgVWlQYWNrYWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKHByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2hvd0luUGFja2FnZVZpZXdBY3Rpb24gYWN0aW9uID0gbmV3IFNob3dJblBhY2thZ2VWaWV3QWN0aW9uKHNpdGUpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKGZyYWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhY3Rpb24ncyBydW4oKSBkb2Vzbid0IHByb3ZpZGUgdGhlIHN0YXR1cyAoYWx0aG91Z2ggaW50ZXJuYWxseSBpdCBjb3VsZCkKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UganVzdCBhc3N1bWUgaXQgd29ya2VkLgotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBwcm9qZWN0IGZvciB0aGUgY3VycmVudCBmaWxlIGJlaW5nIGVkaXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBJUHJvamVjdCBmb3IgdGhlIGN1cnJlbnQgZmlsZSBiZWluZyBlZGl0ZWQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgQW5kcm9pZEVkaXRvciBlZGl0b3IgPSB1aU5vZGUuZ2V0RWRpdG9yKCk7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAvLyBmcm9tIHRoZSBmaWxlIGVkaXRvciB3ZSBjYW4gZ2V0IHRoZSBJRmlsZSBvYmplY3QsIGFuZCBmcm9tIGl0LCB0aGUgSVByb2plY3QuCi0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2Yge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fQotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBJUGFja2FnZUZyYWdtZW50Um9vdC4gQ2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSByb290c1tpXS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHJvb3RzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IElQYWNrYWdlRnJhZ21lbnRSb290W3Jlc3VsdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBzZXRzIHRoZSBwYWNrYWdlJ3MgdGV4dCBmaWVsZCB0byB0aGUgcGFja2FnZSBmcmFnbWVudCdzIG5hbWUuCi0gICAgICogKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UGFja2FnZVRleHRGaWVsZChJUGFja2FnZUZyYWdtZW50IHR5cGUpIHsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZ2V0VGV4dFdpZGdldCgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgdGV4dC5zZXRUZXh0KG5hbWUpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIERpc3BsYXlzIGFuZCBoYW5kbGVzIGEgIkNyZWF0ZSBQYWNrYWdlIFdpemFyZCIuCi0gICAgICogCi0gICAgICogVGhpcyBpcyBpbnZva2VkIGJ5IGRvTGFiZWxDbGljaygpIHdoZW4gY2xpY2tpbmcgb24gdGhlIGh5cGVybGluayBsYWJlbCB3aXRoIGFuCi0gICAgICogZW1wdHkgcGFja2FnZSB0ZXh0IGZpZWxkLiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1BhY2thZ2UoKSB7Ci0gICAgICAgIE9wZW5OZXdQYWNrYWdlV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuTmV3UGFja2FnZVdpemFyZEFjdGlvbigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGFjdGlvbi5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvamVjdCkpOwotICAgICAgICBhY3Rpb24ucnVuKCk7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGVsZW1lbnQgPSBhY3Rpb24uZ2V0Q3JlYXRlZEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhpc3RzKCkgJiYKLSAgICAgICAgICAgICAgICBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLSAgICAgICAgICAgIHNldFBhY2thZ2VUZXh0RmllbGQoKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIC8vIFRPRE86IGNvbXB1dGUgYSBsaXN0IG9mIGV4aXN0aW5nIHBhY2thZ2VzIGZvciBjb250ZW50IGFzc2lzdCBjb21wbGV0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvQXBwbGljYXRpb25BdHRyaWJ1dGVzUGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvQXBwbGljYXRpb25BdHRyaWJ1dGVzUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWY4MmRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0FwcGxpY2F0aW9uQXR0cmlidXRlc1BhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LnBhZ2VzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5VaUVsZW1lbnRQYXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuSVVpVXBkYXRlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEFwcGxpY2F0aW9uJ3MgYXR0cmlidXRlcyBzZWN0aW9uIHBhcnQgZm9yIEFwcGxpY2F0aW9uIHBhZ2UuCi0gKiA8cC8+Ci0gKiBUaGlzIHBhcnQgaXMgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGFwcGxpY2F0aW9uIHBhZ2UgYW5kIGRpc3BsYXlzIGFsbCB0aGUgcG9zc2libGUKLSAqIGF0dHJpYnV0ZXMgb2YgYW4gYXBwbGljYXRpb24gbm9kZSBpbiB0aGUgQW5kcm9pZE1hbmlmZXN0IChpY29uLCBjbGFzcyBuYW1lLCBsYWJlbCwgZXRjLikKLSAqLwotZmluYWwgY2xhc3MgQXBwbGljYXRpb25BdHRyaWJ1dGVzUGFydCBleHRlbmRzIFVpRWxlbWVudFBhcnQgewotCi0gICAgLyoqIExpc3RlbiB0byBjaGFuZ2VzIHRvIHRoZSBVSSBub2RlIGZvciA8YXBwbGljYXRpb24+IGFuZCB1cGRhdGVzIHRoZSBVSSAqLwotICAgIHByaXZhdGUgQXBwTm9kZVVwZGF0ZUxpc3RlbmVyIG1BcHBOb2RlVXBkYXRlTGlzdGVuZXI7Ci0gICAgLyoqIE1hbmFnZWRGb3JtIG5lZWRlZCB0byBjcmVhdGUgdGhlIFVJIGNvbnRyb2xzICovIAotICAgIHByaXZhdGUgSU1hbmFnZWRGb3JtIG1NYW5hZ2VkRm9ybTsKLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkF0dHJpYnV0ZXNQYXJ0KENvbXBvc2l0ZSBib2R5LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBNYW5pZmVzdEVkaXRvciBlZGl0b3IsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIGFwcGxpY2F0aW9uVWlOb2RlKSB7Ci0gICAgICAgIHN1cGVyKGJvZHksIHRvb2xraXQsIGVkaXRvciwgYXBwbGljYXRpb25VaU5vZGUsCi0gICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIEF0dHJpYnV0ZXMiLCAvLyBzZWN0aW9uIHRpdGxlCi0gICAgICAgICAgICAgICAgIkRlZmluZXMgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gdGhlIGFwcGxpY2F0aW9uLiIsIC8vIHNlY3Rpb24gZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyBhbmQgcmVmcmVzaGVzIHRoZSBBcHBsaWNhdGlvbiBVSSBub2RlIGhhbmRsZSBieSB0aGUgdGhpcyBwYXJ0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVpRWxlbWVudE5vZGUoVWlFbGVtZW50Tm9kZSB1aUVsZW1lbnROb2RlKSB7Ci0gICAgICAgIHN1cGVyLnNldFVpRWxlbWVudE5vZGUodWlFbGVtZW50Tm9kZSk7Ci0KLSAgICAgICAgY3JlYXRlVWlBdHRyaWJ1dGVzKG1NYW5hZ2VkRm9ybSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHRvIGVkaXQgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBFbGVtZW50RGVzY3JpcHRvci4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBNVVNUIG5vdCBiZSBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLiBJbnN0ZWFkIGl0IG11c3QgYmUgY2FsbGVkIGZyb20KLSAgICAgKiA8Y29kZT5pbml0aWFsaXplPC9jb2RlPiAoaS5lLiByaWdodCBhZnRlciB0aGUgZm9ybSBwYXJ0IGlzIGFkZGVkIHRvIHRoZSBtYW5hZ2VkIGZvcm0uKQotICAgICAqIDxwLz4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VkRm9ybSBUaGUgb3duZXIgbWFuYWdlZCBmb3JtCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRyb2xzKGZpbmFsIElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBtTWFuYWdlZEZvcm0gPSBtYW5hZ2VkRm9ybTsgCi0gICAgICAgIHNldFRhYmxlKGNyZWF0ZVRhYmxlTGF5b3V0KG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKSwgNCAvKiBudW1Db2x1bW5zICovKSk7Ci0KLSAgICAgICAgbUFwcE5vZGVVcGRhdGVMaXN0ZW5lciA9IG5ldyBBcHBOb2RlVXBkYXRlTGlzdGVuZXIoKTsKLSAgICAgICAgZ2V0VWlFbGVtZW50Tm9kZSgpLmFkZFVwZGF0ZUxpc3RlbmVyKG1BcHBOb2RlVXBkYXRlTGlzdGVuZXIpOwotCi0gICAgICAgIGNyZWF0ZVVpQXR0cmlidXRlcyhtTWFuYWdlZEZvcm0pOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChnZXRVaUVsZW1lbnROb2RlKCkgIT0gbnVsbCAmJiBtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFVpRWxlbWVudE5vZGUoKS5yZW1vdmVVcGRhdGVMaXN0ZW5lcihtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1BcHBOb2RlVXBkYXRlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVWlBdHRyaWJ1dGVzKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBDb21wb3NpdGUgdGFibGUgPSBnZXRUYWJsZSgpOwotICAgICAgICBpZiAodGFibGUgPT0gbnVsbCB8fCBtYW5hZ2VkRm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlbW92ZSBhbnkgb2xkIFVJIGNvbnRyb2xzIAotICAgICAgICBmb3IgKENvbnRyb2wgYyA6IHRhYmxlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBVaUVsZW1lbnROb2RlIHVpRWxlbWVudE5vZGUgPSBnZXRVaUVsZW1lbnROb2RlKCk7IAotICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gYXR0cl9kZXNjX2xpc3QgPSB1aUVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7Ci0KLSAgICAgICAgLy8gRGlzcGxheSB0aGUgYXR0cmlidXRlcyBpbiAyIGNvbHVtbnM6Ci0gICAgICAgIC8vIGF0dHIgMCB8IGF0dHIgNCAKLSAgICAgICAgLy8gYXR0ciAxIHwgYXR0ciA1Ci0gICAgICAgIC8vIGF0dHIgMiB8IGF0dHIgNgotICAgICAgICAvLyBhdHRyIDMgfCBhdHRyIDcKLSAgICAgICAgLy8gdGhhdCBpcyB3ZSBoYXZlIHRvIGZpbGwgdGhlIGdyaWQgaW4gb3JkZXIgMCwgNCwgMSwgNSwgMiwgNiwgMywgNwotICAgICAgICAvLyB0aHVzIGluZGV4ID0gaS8yICsgKGkgaXMgb2RkICogbi8yKQotICAgICAgICBpbnQgbiA9IGF0dHJfZGVzY19saXN0Lmxlbmd0aDsKLSAgICAgICAgaW50IG4yID0gKGludCkgTWF0aC5jZWlsKG4gLyAyLjApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyX2Rlc2MgPSBhdHRyX2Rlc2NfbGlzdFtpIC8gMiArIChpICYgMSkgKiBuMl07Ci0gICAgICAgICAgICBpZiAoYXR0cl9kZXNjIGluc3RhbmNlb2YgWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNob3cgaGlkZGVuIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgPSB1aUVsZW1lbnROb2RlLmZpbmRVaUF0dHJpYnV0ZShhdHRyX2Rlc2MpOwotICAgICAgICAgICAgaWYgKHVpX2F0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVpX2F0dHIuY3JlYXRlVWlDb250cm9sKHRhYmxlLCBtYW5hZ2VkRm9ybSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBYTUwgaGFzIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aGljaCB3YXNuJ3QgZGVjbGFyZWQgaW4KLSAgICAgICAgICAgICAgICAvLyBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy4gVGhpcyBpcyBub3QgYSBwcm9ibGVtLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJTEkcyBub3QgZGVjbGFyZWQgaW4gbm9kZSAlMiRzLCBpZ25vcmVkLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfZGVzYy5nZXRYbWxMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRWxlbWVudE5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIGNyZWF0ZUxhYmVsKHRhYmxlLCBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCksCi0gICAgICAgICAgICAgICAgICAgICJObyBhdHRyaWJ1dGVzIHRvIGRpc3BsYXksIHdhaXRpbmcgZm9yIFNESyB0byBmaW5pc2ggbG9hZGluZy4uLiIsCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyogdG9vbHRpcCAqLyApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZQotICAgICAgICBpZiAobUFwcE5vZGVVcGRhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyLnVpRWxlbWVudE5vZGVVcGRhdGVkKHVpRWxlbWVudE5vZGUsIG51bGwgLyogc3RhdGUsIG5vdCB1c2VkICovKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVGVsbCB0aGUgc2VjdGlvbiB0aGF0IHRoZSBsYXlvdXQgaGFzIGNoYW5nZWQuCi0gICAgICAgIGxheW91dENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGxpc3RlbmVyIHN5bmNocm9uaXplcyB0aGUgVUkgd2l0aCB0aGUgYWN0dWFsIHByZXNlbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiBYTUwgbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEFwcE5vZGVVcGRhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElVaVVwZGF0ZUxpc3RlbmVyIHsgICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCB1aUVsZW1lbnROb2RlVXBkYXRlZChVaUVsZW1lbnROb2RlIHVpX25vZGUsIFVpVXBkYXRlU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgIC8vIFRoZSBVaUVsZW1lbnROb2RlIGZvciB0aGUgYXBwbGljYXRpb24gWE1MIG5vZGUgYWx3YXlzIGV4aXN0cywgZXZlbgotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBYTUwgbm9kZSBpbiB0aGUgWE1MIGZpbGUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gV2UgZW5hYmxlIHRoZSBVSSBoZXJlIGlmIHRoZSBYTUwgbm9kZSBpcyBub3QgbnVsbC4KLSAgICAgICAgICAgIENvbXBvc2l0ZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGV4aXN0cyA9ICh1aV9ub2RlLmdldFhtbE5vZGUoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsICYmIHRhYmxlLmdldEVuYWJsZWQoKSAhPSBleGlzdHMpIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKGV4aXN0cyk7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250cm9sIGMgOiB0YWJsZS5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuc2V0RW5hYmxlZChleGlzdHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0FwcGxpY2F0aW9uUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvQXBwbGljYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjJhMWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvQXBwbGljYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnMuQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZS5VaVRyZWVCbG9jazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIFBhZ2UgZm9yICJBcHBsaWNhdGlvbiIgc2V0dGluZ3MsIHBhcnQgb2YgdGhlIEFuZHJvaWRNYW5pZmVzdCBmb3JtIGVkaXRvci4KLSAqIDxwLz4KLSAqIFVzZWZ1bCByZWZlcmVuY2U6Ci0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtRm9ybXMvYXJ0aWNsZS5odG1sIj4KLSAqICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUZvcm1zL2FydGljbGUuaHRtbDwvYT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLSAgICAvKiogUGFnZSBpZCB1c2VkIGZvciBzd2l0Y2hpbmcgdGFicyBwcm9ncmFtbWF0aWNhbGx5ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9JRCA9ICJhcHBsaWNhdGlvbl9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIENvbnRhaW5lciBlZGl0b3IgKi8KLSAgICBNYW5pZmVzdEVkaXRvciBtRWRpdG9yOwotICAgIC8qKiBUaGUgQXBwbGljYXRpb24gVG9vZ2xlIHBhcnQgKi8KLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uVG9nZ2xlIG1Ub29nbGVQYXJ0OwotICAgIC8qKiBUaGUgQXBwbGljYXRpb24gQXR0cmlidXRlcyBwYXJ0ICovIAotICAgIHByaXZhdGUgQXBwbGljYXRpb25BdHRyaWJ1dGVzUGFydCBtQXR0clBhcnQ7Ci0gICAgLyoqIFRoZSB0cmVlIHZpZXcgYmxvY2sgKi8KLSAgICBwcml2YXRlIFVpVHJlZUJsb2NrIG1UcmVlQmxvY2s7Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25QYWdlKE1hbmlmZXN0RWRpdG9yIGVkaXRvcikgewotICAgICAgICBzdXBlcihlZGl0b3IsIFBBR0VfSUQsICJBcHBsaWNhdGlvbiIpOyAvLyB0YWIncyBsYWJlbCwga2VlcCBpdCBzaG9ydAotICAgICAgICBtRWRpdG9yID0gZWRpdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNvbnRlbnQgaW4gdGhlIGZvcm0gaG9zdGVkIGluIHRoaXMgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFuYWdlZEZvcm0gdGhlIGZvcm0gaG9zdGVkIGluIHRoaXMgcGFnZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotICAgICAgICBTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRUZXh0KCJBbmRyb2lkIE1hbmlmZXN0IEFwcGxpY2F0aW9uIik7Ci0gICAgICAgIGZvcm0uc2V0SW1hZ2UoQWR0UGx1Z2luLmdldEFuZHJvaWRMb2dvKCkpOwotCi0gICAgICAgIFVpRWxlbWVudE5vZGUgYXBwVWlOb2RlID0gZ2V0VWlBcHBsaWNhdGlvbk5vZGUoKTsKLQotICAgICAgICBDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwotICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gV2UgdXN1YWxseSBwcmVmZXIgdG8gaGF2ZSBhIENvbHVtbkxheW91dCBoZXJlLiBIb3dldmVyCi0gICAgICAgIC8vIE1hc3RlckRldGFpbHNCbG9jay5jcmVhdGVDb250ZW50KCkgYmVsb3cgd2lsbCByZXNldCB0aGUgYm9keSdzIGxheW91dCB0byBhIGdyaWQgbGF5b3V0LgotICAgICAgICBtVG9vZ2xlUGFydCA9IG5ldyBBcHBsaWNhdGlvblRvZ2dsZShib2R5LCB0b29sa2l0LCBtRWRpdG9yLCBhcHBVaU5vZGUpOwotICAgICAgICBtVG9vZ2xlUGFydC5nZXRTZWN0aW9uKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgIG1hbmFnZWRGb3JtLmFkZFBhcnQobVRvb2dsZVBhcnQpOwotICAgICAgICBtQXR0clBhcnQgPSBuZXcgQXBwbGljYXRpb25BdHRyaWJ1dGVzUGFydChib2R5LCB0b29sa2l0LCBtRWRpdG9yLCBhcHBVaU5vZGUpOwotICAgICAgICBtQXR0clBhcnQuZ2V0U2VjdGlvbigpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KG1BdHRyUGFydCk7Ci0KLSAgICAgICAgbVRyZWVCbG9jayA9IG5ldyBVaVRyZWVCbG9jayhtRWRpdG9yLCBhcHBVaU5vZGUsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogYXV0b0NyZWF0ZVJvb3QgKi8sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBlbGVtZW50IGZpbHRlcnMgKi8sCi0gICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIE5vZGVzIiwKLSAgICAgICAgICAgICAgICAiTGlzdCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIik7Ci0gICAgICAgIG1UcmVlQmxvY2suY3JlYXRlQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBhcHBsaWNhdGlvbiBVSSBub2RlLiBTaW5jZSB0aGlzIGlzIGEgbWFuZGF0b3J5IG5vZGUsIGl0ICphbHdheXMqCi0gICAgICogZXhpc3RzLCBldmVuIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIFhNTCBub2RlLgotICAgICAqLwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBnZXRVaUFwcGxpY2F0aW9uTm9kZSgpIHsKLSAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgbWFuaWZlc3REZXNjcmlwdG9yID0gbUVkaXRvci5nZXRNYW5pZmVzdERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChtYW5pZmVzdERlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG1hbmlmZXN0RGVzY3JpcHRvci5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdG9yLmdldFVpUm9vdE5vZGUoKS5maW5kVWlDaGlsZE5vZGUoZGVzYy5nZXRYbWxOYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSB1aSByb290IG5vZGUsIGFzIGEgZHVtbXkgYXBwbGljYXRpb24gcm9vdCBub2RlLgotICAgICAgICAgICAgcmV0dXJuIG1FZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyBhbmQgcmVmcmVzaGVzIHRoZSBBcHBsaWNhdGlvbiBVSSBub2RlIGhhbmRsZWQgYnkgdGhlIHN1YiBwYXJ0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoVWlBcHBsaWNhdGlvbk5vZGUoKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgYXBwVWlOb2RlID0gZ2V0VWlBcHBsaWNhdGlvbk5vZGUoKTsKLSAgICAgICAgaWYgKG1Ub29nbGVQYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Ub29nbGVQYXJ0LnNldFVpRWxlbWVudE5vZGUoYXBwVWlOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF0dHJQYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BdHRyUGFydC5zZXRVaUVsZW1lbnROb2RlKGFwcFVpTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UcmVlQmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRyZWVCbG9jay5jaGFuZ2VSb290QW5kRGVzY3JpcHRvcnMoYXBwVWlOb2RlLAotICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGVsZW1lbnQgZmlsdGVycyAqLywKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZWZyZXNoICovKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0FwcGxpY2F0aW9uVG9nZ2xlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9BcHBsaWNhdGlvblRvZ2dsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmEwNDQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0FwcGxpY2F0aW9uVG9nZ2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRGVzY3JpcHRvcnNVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5VaUVsZW1lbnRQYXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuSVVpVXBkYXRlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuSVVpVXBkYXRlTGlzdGVuZXIuVWlVcGRhdGVTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIEFwcGxsaWNhdGlvbiBUb29nbGUgc2VjdGlvbiBwYXJ0IGZvciBhcHBsaWNhdGlvbiBwYWdlLgotICovCi1maW5hbCBjbGFzcyBBcHBsaWNhdGlvblRvZ2dsZSBleHRlbmRzIFVpRWxlbWVudFBhcnQgewotICAgIAotICAgIC8qKiBDaGVja2JveCBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gYXBwbGljYXRpb24gbm9kZSBpcyBwcmVzZW50ICovIAotICAgIHByaXZhdGUgQnV0dG9uIG1DaGVja2JveDsKLSAgICAvKiogTGlzdGVuIHRvIGNoYW5nZXMgdG8gdGhlIFVJIG5vZGUgZm9yIDxhcHBsaWNhdGlvbj4gYW5kIHVwZGF0ZXMgdGhlIGNoZWNrYm94ICovCi0gICAgcHJpdmF0ZSBBcHBOb2RlVXBkYXRlTGlzdGVuZXIgbUFwcE5vZGVVcGRhdGVMaXN0ZW5lcjsKLSAgICAvKiogSW50ZXJuYWwgZmxhZyB0byBrbm93IHdoZXJlIHdlJ3JlIHByb2dyYW1tYXRpY2FsbHkgbW9kaWZ5aW5nIHRoZSBjaGVja2JveCBhbmQgd2Ugd2FudCB0bwotICAgICAqICBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBjaGVja2JveCdzIGNhbGxiYWNrLiAqLwotICAgIHB1YmxpYyBib29sZWFuIG1JbnRlcm5hbE1vZGlmaWNhdGlvbjsKLSAgICBwcml2YXRlIEZvcm1UZXh0IG1Ub29sdGlwRm9ybVRleHQ7Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25Ub2dnbGUoQ29tcG9zaXRlIGJvZHksIEZvcm1Ub29sa2l0IHRvb2xraXQsIE1hbmlmZXN0RWRpdG9yIGVkaXRvciwKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgYXBwbGljYXRpb25VaU5vZGUpIHsKLSAgICAgICAgc3VwZXIoYm9keSwgdG9vbGtpdCwgZWRpdG9yLCBhcHBsaWNhdGlvblVpTm9kZSwKLSAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gVG9nZ2xlIiwKLSAgICAgICAgICAgICAgICBudWxsLCAvKiBkZXNjcmlwdGlvbiAqLwotICAgICAgICAgICAgICAgIFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChnZXRVaUVsZW1lbnROb2RlKCkgIT0gbnVsbCAmJiBtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFVpRWxlbWVudE5vZGUoKS5yZW1vdmVVcGRhdGVMaXN0ZW5lcihtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1BcHBOb2RlVXBkYXRlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoYW5nZXMgYW5kIHJlZnJlc2hlcyB0aGUgQXBwbGljYXRpb24gVUkgbm9kZSBoYW5kbGUgYnkgdGhlIHRoaXMgcGFydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVaUVsZW1lbnROb2RlKFVpRWxlbWVudE5vZGUgdWlFbGVtZW50Tm9kZSkgewotICAgICAgICBzdXBlci5zZXRVaUVsZW1lbnROb2RlKHVpRWxlbWVudE5vZGUpOwotCi0gICAgICAgIHVwZGF0ZVRvb2x0aXAoKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHN0YXRlIG9mIHRoZSBjaGVja2JveAotICAgICAgICBtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyLnVpRWxlbWVudE5vZGVVcGRhdGVkKGdldFVpRWxlbWVudE5vZGUoKSwKLSAgICAgICAgICAgICAgICBVaVVwZGF0ZVN0YXRlLkNISUxEUkVOX0NIQU5HRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29udHJvbHMgdG8gZWRpdCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIEVsZW1lbnREZXNjcmlwdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIE1VU1Qgbm90IGJlIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IuIEluc3RlYWQgaXQgbXVzdCBiZSBjYWxsZWQgZnJvbQotICAgICAqIDxjb2RlPmluaXRpYWxpemU8L2NvZGU+IChpLmUuIHJpZ2h0IGFmdGVyIHRoZSBmb3JtIHBhcnQgaXMgYWRkZWQgdG8gdGhlIG1hbmFnZWQgZm9ybS4pCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIFRoZSBvd25lciBtYW5hZ2VkIGZvcm0KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udHJvbHMoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0gICAgICAgIENvbXBvc2l0ZSB0YWJsZSA9IGNyZWF0ZVRhYmxlTGF5b3V0KHRvb2xraXQsIDEgLyogbnVtQ29sdW1ucyAqLyk7Ci0KLSAgICAgICAgbVRvb2x0aXBGb3JtVGV4dCA9IGNyZWF0ZUZvcm1UZXh0KHRhYmxlLCB0b29sa2l0LCB0cnVlLCAiPGZvcm0+PC9mb3JtPiIsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogc2V0dXBMYXlvdXREYXRhICovKTsKLSAgICAgICAgdXBkYXRlVG9vbHRpcCgpOwotCi0gICAgICAgIG1DaGVja2JveCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHRhYmxlLAotICAgICAgICAgICAgICAgICJEZWZpbmUgYW4gPGFwcGxpY2F0aW9uPiB0YWcgaW4gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwiLAotICAgICAgICAgICAgICAgIFNXVC5DSEVDSyk7Ci0gICAgICAgIG1DaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLCBUYWJsZVdyYXBEYXRhLlRPUCkpOwotICAgICAgICBtQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgbUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgICAgIG1BcHBOb2RlVXBkYXRlTGlzdGVuZXIgPSBuZXcgQXBwTm9kZVVwZGF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgIGdldFVpRWxlbWVudE5vZGUoKS5hZGRVcGRhdGVMaXN0ZW5lcihtQXBwTm9kZVVwZGF0ZUxpc3RlbmVyKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzdGF0ZSBvZiB0aGUgY2hlY2tib3gKLSAgICAgICAgbUFwcE5vZGVVcGRhdGVMaXN0ZW5lci51aUVsZW1lbnROb2RlVXBkYXRlZChnZXRVaUVsZW1lbnROb2RlKCksCi0gICAgICAgICAgICAgICAgVWlVcGRhdGVTdGF0ZS5DSElMRFJFTl9DSEFOR0VEKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlbGwgdGhlIHNlY3Rpb24gdGhhdCB0aGUgbGF5b3V0IGhhcyBjaGFuZ2VkLgotICAgICAgICBsYXlvdXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgYXBwbGljYXRpb24gdG9vbHRpcCBpbiB0aGUgZm9ybSB0ZXh0LgotICAgICAqIElmIHRoZXJlIGlzIG5vIHRvb2x0aXAsIHRoZSBmb3JtIHRleHQgaXMgaGlkZGVuLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVG9vbHRpcCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Zpc2libGUgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgdG9vbHRpcCA9IGdldFVpRWxlbWVudE5vZGUoKS5nZXREZXNjcmlwdG9yKCkuZ2V0VG9vbHRpcCgpOwotICAgICAgICBpZiAodG9vbHRpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0b29sdGlwID0gRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRGb3JtVGV4dCh0b29sdGlwLAotICAgICAgICAgICAgICAgICAgICBnZXRVaUVsZW1lbnROb2RlKCkuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldERvY3VtZW50YXRpb25CYXNlVXJsKCkpOwotICAgIAotICAgICAgICAgICAgbVRvb2x0aXBGb3JtVGV4dC5zZXRUZXh0KHRvb2x0aXAsIHRydWUgLyogcGFyc2VUYWdzICovLCB0cnVlIC8qIGV4cGFuZFVSTHMgKi8pOwotICAgICAgICAgICAgbVRvb2x0aXBGb3JtVGV4dC5zZXRJbWFnZShEZXNjcmlwdG9yc1V0aWxzLklNQUdFX0tFWSwgQWR0UGx1Z2luLmdldEFuZHJvaWRMb2dvKCkpOwotICAgICAgICAgICAgbVRvb2x0aXBGb3JtVGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcihnZXRFZGl0b3IoKS5jcmVhdGVIeXBlcmxpbmtMaXN0ZW5lcigpKTsKLSAgICAgICAgICAgIGlzVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1Ub29sdGlwRm9ybVRleHQuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbGlzdGVuZXIgc3luY2hyb25pemVzIHRoZSBYTUwgYXBwbGljYXRpb24gbm9kZSB3aGVuIHRoZSBjaGVja2JveAotICAgICAqIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTm9kZSBtVW5kb1htbE5vZGU7Ci0gICAgICAgIHByaXZhdGUgTm9kZSBtVW5kb1htbFBhcmVudDsKLSAgICAgICAgcHJpdmF0ZSBOb2RlIG1VbmRvWG1sTmV4dE5vZGU7Ci0gICAgICAgIHByaXZhdGUgTm9kZSBtVW5kb1htbE5leHRFbGVtZW50OwotICAgICAgICBwcml2YXRlIERvY3VtZW50IG1VbmRvWG1sRG9jdW1lbnQ7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIHN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgaWYgKCFtSW50ZXJuYWxNb2RpZmljYXRpb24gJiYgZ2V0VWlFbGVtZW50Tm9kZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRVaUVsZW1lbnROb2RlKCkuZ2V0RWRpdG9yKCkud3JhcFVuZG9SZWNvcmRpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJDcmVhdGUgb3IgcmVzdG9yZSBBcHBsaWNhdGlvbiBub2RlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlJlbW92ZSBBcHBsaWNhdGlvbiBub2RlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVpRWxlbWVudE5vZGUoKS5nZXRFZGl0b3IoKS5lZGl0WG1sTW9kZWwobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgd2FudHMgYW4gPGFwcGxpY2F0aW9uPiBub2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgcmVzdG9yZSBhIHByZXZpb3VzIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBjcmVhdGUgYSBmdWxsIG5ldyBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VbmRvWG1sTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgPSAhcmVzdG9yZUFwcGxpY2F0aW9uTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVpRWxlbWVudE5vZGUoKS5jcmVhdGVYbWxOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VycyBubyBsb25nZXIgd2FudHMgdGhlIDxhcHBsaWNhdGlvbj4gbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQXBwbGljYXRpb25Ob2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVzdG9yZSBhIHByZXZpb3VzbHkgInNhdmVkIiBhcHBsaWNhdGlvbiBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGNvdWxkIGJlIHJlc3RvcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzdG9yZUFwcGxpY2F0aW9uTm9kZSgpIHsKLSAgICAgICAgICAgIGlmIChtVW5kb1htbERvY3VtZW50ID09IG51bGwgfHwgbVVuZG9YbWxOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFZhbGlkYXRlIG5vZGUgcmVmZXJlbmNlcy4uLgotICAgICAgICAgICAgbVVuZG9YbWxQYXJlbnQgPSB2YWxpZGF0ZU5vZGUobVVuZG9YbWxEb2N1bWVudCwgbVVuZG9YbWxQYXJlbnQpOwotICAgICAgICAgICAgbVVuZG9YbWxOZXh0Tm9kZSA9IHZhbGlkYXRlTm9kZShtVW5kb1htbERvY3VtZW50LCBtVW5kb1htbE5leHROb2RlKTsKLSAgICAgICAgICAgIG1VbmRvWG1sTmV4dEVsZW1lbnQgPSB2YWxpZGF0ZU5vZGUobVVuZG9YbWxEb2N1bWVudCwgbVVuZG9YbWxOZXh0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGlmIChtVW5kb1htbFBhcmVudCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZG9lc24ndCBleGlzdCwgdHJ5IHRvIGZpbmQgYSBuZXcgbWFuaWZlc3Qgbm9kZS4KLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgbVVuZG9YbWxQYXJlbnQgPSBnZXRVaUVsZW1lbnROb2RlKCkuZ2V0VWlQYXJlbnQoKS5wcmVwYXJlQ29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgbVVuZG9YbWxOZXh0Tm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbVVuZG9YbWxOZXh0RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1VbmRvWG1sUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHN0aWxsIGFyb3VuZCwgcmV1c2UgdGhlIHNhbWUgbm9kZS4KLQotICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd2FudCB0byBpbnNlcnQgdGhlIG5vZGUgYmVmb3JlIHdoYXQgdXNlZCB0byBiZSBpdHMgbmV4dCBzaWJsaW5nLgotICAgICAgICAgICAgICAgIC8vIElmIHRoYXQncyBub3QgcG9zc2libGUsIHdlIHRyeSB0byBpbnNlcnQgaXQgYmVmb3JlIGl0cyBuZXh0IHNpYmxpbmcgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlIGVpdGhlciwgaXQgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQncy4KLSAgICAgICAgICAgICAgICBOb2RlIG5leHQgPSBtVW5kb1htbE5leHROb2RlOwotICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG1VbmRvWG1sTmV4dEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1VbmRvWG1sUGFyZW50Lmluc2VydEJlZm9yZShtVW5kb1htbE5vZGUsIG5leHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVGV4dCBzZXAgPSBtVW5kb1htbERvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcbiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBtVW5kb1htbFBhcmVudC5pbnNlcnRCZWZvcmUoc2VwLCBudWxsKTsgIC8vIGluc2VydCBzZXBhcmF0b3IgYmVmb3JlIGVuZCB0YWcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICB9IAotCi0gICAgICAgICAgICAvLyBSZW1vdmUgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byBhdm9pZCB1c2luZyB0aGVtIHR3aWNlCi0gICAgICAgICAgICBtVW5kb1htbFBhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICBtVW5kb1htbE5leHROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIG1VbmRvWG1sTmV4dEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgbVVuZG9YbWxOb2RlID0gbnVsbDsKLSAgICAgICAgICAgIG1VbmRvWG1sRG9jdW1lbnQgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHhtbF9ub2RlIGlzIHN0aWxsIGVpdGhlciB0aGUgcm9vdCBub2RlIG9yIG9uZSBvZiBpdHMKLSAgICAgICAgICogZGlyZWN0IGRlc2NlbmRhbnRzLiAKLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSByb290X25vZGUgVGhlIHJvb3Qgb2YgdGhlIG5vZGUgaGllcmFyY2h5IHRvIGV4YW1pbmUuCi0gICAgICAgICAqIEBwYXJhbSB4bWxfbm9kZSBUaGUgWE1MIG5vZGUgdG8gZmluZC4KLSAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHhtbF9ub2RlIGlmIGl0IGlzLCBvdGhlcndpc2UgcmV0dXJucyBudWxsLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBOb2RlIHZhbGlkYXRlTm9kZShOb2RlIHJvb3Rfbm9kZSwgTm9kZSB4bWxfbm9kZSkgewotICAgICAgICAgICAgaWYgKHJvb3Rfbm9kZSA9PSB4bWxfbm9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB4bWxfbm9kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgPSByb290X25vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb290X25vZGUgPT0geG1sX25vZGUgfHwgdmFsaWRhdGVOb2RlKG5vZGUsIHhtbF9ub2RlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW1vdmVzIHRoZSA8YXBwbGljYXRpb24+IG5vZGUgZnJvbSB0aGUgaGllcmFyY2h5LgotICAgICAgICAgKiBCZWZvcmUgZG9pbmcgdGhhdCwgd2UgdHJ5IHRvIHJlbWVtYmVyIHdoZXJlIGl0IHdhcyBzbyB0aGF0IHdlIGNhbiBwdXQgaXQgYmFjawotICAgICAgICAgKiBpbiB0aGUgc2FtZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVBcHBsaWNhdGlvbk5vZGUoKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG5vZGUgYWN0dWFsbHkgZXhpc3RzLi4uCi0gICAgICAgICAgICBOb2RlIHhtbF9ub2RlID0gZ2V0VWlFbGVtZW50Tm9kZSgpLmdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgIGlmICh4bWxfbm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTYXZlIGl0cyBwYXJlbnQsIG5leHQgc2libGluZyBhbmQgbmV4dCBlbGVtZW50Ci0gICAgICAgICAgICBtVW5kb1htbERvY3VtZW50ID0geG1sX25vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgbVVuZG9YbWxQYXJlbnQgPSB4bWxfbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBtVW5kb1htbE5leHROb2RlID0geG1sX25vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIG1VbmRvWG1sTmV4dEVsZW1lbnQgPSBtVW5kb1htbE5leHROb2RlOwotICAgICAgICAgICAgd2hpbGUgKG1VbmRvWG1sTmV4dEVsZW1lbnQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBtVW5kb1htbE5leHRFbGVtZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICBtVW5kb1htbE5leHRFbGVtZW50ID0gbVVuZG9YbWxOZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBY3R1YWxseSByZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgaGllcmFyY2h5IGFuZCBrZWVwIGl0IGhlcmUuCi0gICAgICAgICAgICAvLyBUaGUgcmV0dXJuZWQgbm9kZSBsb29zZXMgaXRzIHBhcmVudHMvc2libGluZ3MgcG9pbnRlcnMuCi0gICAgICAgICAgICBtVW5kb1htbE5vZGUgPSBnZXRVaUVsZW1lbnROb2RlKCkuZGVsZXRlWG1sTm9kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBsaXN0ZW5lciBzeW5jaHJvbml6ZXMgdGhlIFVJIChpLmUuIHRoZSBjaGVja2JveCkgd2l0aCB0aGUKLSAgICAgKiBhY3R1YWwgcHJlc2VuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIFhNTCBub2RlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQXBwTm9kZVVwZGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSVVpVXBkYXRlTGlzdGVuZXIgeyAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHVpRWxlbWVudE5vZGVVcGRhdGVkKFVpRWxlbWVudE5vZGUgdWlfbm9kZSwgVWlVcGRhdGVTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVGhlIFVpRWxlbWVudE5vZGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBYTUwgbm9kZSBhbHdheXMgZXhpc3RzLCBldmVuCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlIGluIHRoZSBYTUwgZmlsZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUbyB1cGRhdGUgdGhlIGNoZWNrYm94IHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBzdGF0ZSwgd2UganVzdCBuZWVkCi0gICAgICAgICAgICAvLyB0byBjaGVjayBpZiB0aGUgWE1MIG5vZGUgaXMgbnVsbC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsTW9kaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4aXN0cyA9IHVpX25vZGUuZ2V0WG1sTm9kZSgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2JveC5nZXRTZWxlY3Rpb24oKSAhPSBleGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrYm94LnNldFNlbGVjdGlvbihleGlzdHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsTW9kaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0luc3RydW1lbnRhdGlvblBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL0luc3RydW1lbnRhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNjNkNS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9JbnN0cnVtZW50YXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LnBhZ2VzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlLlVpVHJlZUJsb2NrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci0KLS8qKgotICogUGFnZSBmb3IgaW5zdHJ1bWVudGF0aW9uIHNldHRpbmdzLCBwYXJ0IG9mIHRoZSBBbmRyb2lkTWFuaWZlc3QgZm9ybSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnN0cnVtZW50YXRpb25QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotICAgIC8qKiBQYWdlIGlkIHVzZWQgZm9yIHN3aXRjaGluZyB0YWJzIHByb2dyYW1tYXRpY2FsbHkgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX0lEID0gImluc3RydW1lbnRhdGlvbl9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIENvbnRhaW5lciBlZGl0b3IgKi8KLSAgICBNYW5pZmVzdEVkaXRvciBtRWRpdG9yOwotCi0gICAgcHJpdmF0ZSBVaVRyZWVCbG9jayBtVHJlZUJsb2NrOwotCi0gICAgcHVibGljIEluc3RydW1lbnRhdGlvblBhZ2UoTWFuaWZlc3RFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIHN1cGVyKGVkaXRvciwgUEFHRV9JRCwgIkluc3RydW1lbnRhdGlvbiIpOyAgLy8gdGFiJ3MgbGFiZWwsIGtlZXAgaXQgc2hvcnQKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IGluIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0VGV4dCgiQW5kcm9pZCBNYW5pZmVzdCBJbnN0cnVtZW50YXRpb24iKTsKLSAgICAgICAgZm9ybS5zZXRJbWFnZShBZHRQbHVnaW4uZ2V0QW5kcm9pZExvZ28oKSk7Ci0KLSAgICAgICAgVWlFbGVtZW50Tm9kZSBtYW5pZmVzdCA9IG1FZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3IgPSBtRWRpdG9yLmdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JGaWx0ZXJzID0gbnVsbDsKLSAgICAgICAgaWYgKG1hbmlmZXN0RGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yRmlsdGVycyA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3REZXNjcmlwdG9yLmdldEluc3RydW1lbnRhdGlvbkVsZW1lbnQoKSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJlZUJsb2NrID0gbmV3IFVpVHJlZUJsb2NrKG1FZGl0b3IsIG1hbmlmZXN0LAotICAgICAgICAgICAgICAgIHRydWUgLyogYXV0b0NyZWF0ZVJvb3QgKi8sCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvckZpbHRlcnMsCi0gICAgICAgICAgICAgICAgIkluc3RydW1lbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgIkxpc3Qgb2YgaW5zdHJ1bWVudGF0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCIpOwotICAgICAgICBtVHJlZUJsb2NrLmNyZWF0ZUNvbnRlbnQobWFuYWdlZEZvcm0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIGFuZCByZWZyZXNoZXMgdGhlIEFwcGxpY2F0aW9uIFVJIG5vZGUgaGFuZGxlZCBieSB0aGUgc3ViIHBhcnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hVaU5vZGUoKSB7Ci0gICAgICAgIGlmIChtVHJlZUJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgbWFuaWZlc3QgPSBtRWRpdG9yLmdldFVpUm9vdE5vZGUoKTsKLSAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzIG1hbmlmZXN0RGVzY3JpcHRvciA9IG1FZGl0b3IuZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpOwotCi0gICAgICAgICAgICBtVHJlZUJsb2NrLmNoYW5nZVJvb3RBbmREZXNjcmlwdG9ycyhtYW5pZmVzdCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3REZXNjcmlwdG9yLmdldEluc3RydW1lbnRhdGlvbkVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHJlZnJlc2ggKi8pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvT3ZlcnZpZXdFeHBvcnRQYXJ0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0V4cG9ydFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5NDdjNS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0V4cG9ydFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QucGFnZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5NYW5pZmVzdEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5TZWN0aW9uSGVscGVyLk1hbmlmZXN0U2VjdGlvblBhcnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuRXhwb3J0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBFeHBvcnQgc2VjdGlvbiBwYXJ0IGZvciBvdmVydmlldyBwYWdlLgotICovCi1maW5hbCBjbGFzcyBPdmVydmlld0V4cG9ydFBhcnQgZXh0ZW5kcyBNYW5pZmVzdFNlY3Rpb25QYXJ0IHsKLQotICAgIHByaXZhdGUgZmluYWwgT3ZlcnZpZXdQYWdlIG1PdmVydmlld1BhZ2U7Ci0KLSAgICBwdWJsaWMgT3ZlcnZpZXdFeHBvcnRQYXJ0KE92ZXJ2aWV3UGFnZSBvdmVydmlld1BhZ2UsIENvbXBvc2l0ZSBib2R5LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBNYW5pZmVzdEVkaXRvciBlZGl0b3IpIHsKLSAgICAgICAgc3VwZXIoYm9keSwgdG9vbGtpdCwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCwgdHJ1ZSAvKiBkZXNjcmlwdGlvbiAqLyk7Ci0gICAgICAgIG1PdmVydmlld1BhZ2UgPSBvdmVydmlld1BhZ2U7Ci0gICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFNlY3Rpb24oKTsKLSAgICAgICAgc2VjdGlvbi5zZXRUZXh0KCJFeHBvcnRpbmciKTsKLSAgICAgICAgc2VjdGlvbi5zZXREZXNjcmlwdGlvbigiVG8gZXhwb3J0IHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzdHJpYnV0aW9uLCB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Iik7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHRhYmxlID0gY3JlYXRlVGFibGVMYXlvdXQodG9vbGtpdCwgMiAvKiBudW1Db2x1bW5zICovKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjxmb3JtPjxsaT48YSBocmVmPVwid2l6YXJkXCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCgiVXNlIHRoZSBFeHBvcnQgV2l6YXJkIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvYT4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCIgdG8gZXhwb3J0IGFuZCBzaWduIGFuIEFQSyIpOwotICAgICAgICBidWYuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjxsaT48YSBocmVmPVwibWFudWFsXCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCgiRXhwb3J0IGFuIHVuc2lnbmVkIEFQSyIpOwotICAgICAgICBidWYuYXBwZW5kKCI8L2E+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCgiIGFuZCBzaWduIGl0IG1hbnVhbGx5Iik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvbGk+PC9mb3JtPiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRm9ybVRleHQgdGV4dCA9IGNyZWF0ZUZvcm1UZXh0KHRhYmxlLCB0b29sa2l0LCB0cnVlLCBidWYudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBzZXR1cExheW91dERhdGEgKi8pOwotICAgICAgICB0ZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgZnJvbSB0aGUgZWRpdG9yCi0gICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gbU92ZXJ2aWV3UGFnZS5tRWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KWlucHV0OwotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJtYW51YWwiLmVxdWFscyhlLmRhdGEpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBjYW4gZXhwb3J0IGFuIHVuc2lnbmVkIGFwayBmb3IgdGhlIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRIZWxwZXIuZXhwb3J0UHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGV4cG9ydCB3aXphcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydEhlbHBlci5zdGFydEV4cG9ydFdpemFyZChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBsYXlvdXRDaGFuZ2VkKCk7Ci0gICAgfSAgICAgICAgCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0luZm9QYXJ0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0luZm9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjJmOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvT3ZlcnZpZXdJbmZvUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lk1hbmlmZXN0RWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzLkFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlVpRWxlbWVudFBhcnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljIGluZm8gc2VjdGlvbiBwYXJ0IGZvciBvdmVydmlldyBwYWdlOiBpdCBkaXNwbGF5cyBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbQotICogdGhlIG1hbmlmZXN0IGVsZW1lbnQuCi0gKi8KLWZpbmFsIGNsYXNzIE92ZXJ2aWV3SW5mb1BhcnQgZXh0ZW5kcyBVaUVsZW1lbnRQYXJ0IHsKLQotICAgIHByaXZhdGUgSU1hbmFnZWRGb3JtIG1NYW5hZ2VkRm9ybTsKLQotICAgIHB1YmxpYyBPdmVydmlld0luZm9QYXJ0KENvbXBvc2l0ZSBib2R5LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBNYW5pZmVzdEVkaXRvciBlZGl0b3IpIHsKLSAgICAgICAgc3VwZXIoYm9keSwgdG9vbGtpdCwgZWRpdG9yLAotICAgICAgICAgICAgICAgIGdldE1hbmlmZXN0VWlOb2RlKGVkaXRvciksICAvLyB1aUVsZW1lbnROb2RlCi0gICAgICAgICAgICAgICAgIk1hbmlmZXN0IEdlbmVyYWwgQXR0cmlidXRlcyIsIC8vIHNlY3Rpb24gdGl0bGUKLSAgICAgICAgICAgICAgICAiRGVmaW5lcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIiwgLy8gc2VjdGlvbiBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgVWlFbGVtZW50Tm9kZSB0aGF0IHRoaXMgcGFydCB3aWxsIGVkaXQuIFRoZSBub2RlIG11c3QgZXhpc3QKLSAgICAgKiBhbmQgY2FuJ3QgYmUgbnVsbCwgYnkgZGVzaWduLCBiZWNhdXNlIGl0J3MgYSBtYW5kYXRvcnkgbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBVaUVsZW1lbnROb2RlIGdldE1hbmlmZXN0VWlOb2RlKE1hbmlmZXN0RWRpdG9yIGVkaXRvcikgewotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3JzID0gZWRpdG9yLmdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKG1hbmlmZXN0RGVzY3JpcHRvcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG1hbmlmZXN0RGVzY3JpcHRvcnMuZ2V0TWFuaWZlc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yLmdldFVpUm9vdE5vZGUoKS5nZXREZXNjcmlwdG9yKCkgPT0gZGVzYykgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdG9yLmdldFVpUm9vdE5vZGUoKS5maW5kVWlDaGlsZE5vZGUoZGVzYy5nZXRYbWxOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBObyBtYW5pZmVzdCBkZXNjcmlwdG9yOiB3ZSBoYXZlIGEgZHVtbXkgVWlSb290Tm9kZSwgc28gd2UgcmV0dXJuIHRoYXQuCi0gICAgICAgIC8vIFRoZSBlZGl0b3Igd2lsbCBiZSByZWxvYWRlZCBvbmNlIHdlIGhhdmUgdGhlIHByb3BlciBkZXNjcmlwdG9ycyBhbnl3YXkuCi0gICAgICAgIHJldHVybiBlZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRkZW4gaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgY3VycmVudCBtYW5hZ2VkIGZvcm0uCi0gICAgICogCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250cm9scyhmaW5hbCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgbU1hbmFnZWRGb3JtID0gbWFuYWdlZEZvcm07IAotICAgICAgICBzdXBlci5jcmVhdGVGb3JtQ29udHJvbHMobWFuYWdlZEZvcm0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW55IGV4aXN0aW5nIEF0dHJpYnV0ZSBVSSB3aWRnZXRzIGFuZCByZWNyZWF0ZSB0aGVtIGlmIHRoZSBTREsgaGFzIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayBPdmVydmlld1BhZ2UjcmVmcmVzaFVpQXBwbGljYXRpb25Ob2RlKCl9IHdoZW4gdGhlCi0gICAgICogU0RLIGhhcyBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2RrQ2hhbmdlZCgpIHsKLSAgICAgICAgc2V0VWlFbGVtZW50Tm9kZShnZXRNYW5pZmVzdFVpTm9kZShnZXRFZGl0b3IoKSkpOwotICAgICAgICBjcmVhdGVVaUF0dHJpYnV0ZXMobU1hbmFnZWRGb3JtKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0xpbmtzUGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvT3ZlcnZpZXdMaW5rc1BhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmMDg4NS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9PdmVydmlld0xpbmtzUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QucGFnZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lk1hbmlmZXN0RWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzLkFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlNlY3Rpb25IZWxwZXIuTWFuaWZlc3RTZWN0aW9uUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBMaW5rcyBzZWN0aW9uIHBhcnQgZm9yIG92ZXJ2aWV3IHBhZ2UuCi0gKi8KLWZpbmFsIGNsYXNzIE92ZXJ2aWV3TGlua3NQYXJ0IGV4dGVuZHMgTWFuaWZlc3RTZWN0aW9uUGFydCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hbmlmZXN0RWRpdG9yIG1FZGl0b3I7Ci0gICAgcHJpdmF0ZSBGb3JtVGV4dCBtRm9ybVRleHQ7Ci0KLSAgICBwdWJsaWMgT3ZlcnZpZXdMaW5rc1BhcnQoQ29tcG9zaXRlIGJvZHksIEZvcm1Ub29sa2l0IHRvb2xraXQsIE1hbmlmZXN0RWRpdG9yIGVkaXRvcikgewotICAgICAgICBzdXBlcihib2R5LCB0b29sa2l0LCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVELCB0cnVlIC8qIGRlc2NyaXB0aW9uICovKTsKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0U2VjdGlvbigpOwotICAgICAgICBzZWN0aW9uLnNldFRleHQoIkxpbmtzIik7Ci0gICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oIlRoZSBjb250ZW50IG9mIHRoZSBBbmRyb2lkIE1hbmlmZXN0IGlzIG1hZGUgdXAgb2YgdGhyZWUgc2VjdGlvbnMuIFlvdSBjYW4gYWxzbyBlZGl0IHRoZSBYTUwgZGlyZWN0bHkuIik7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHRhYmxlID0gY3JlYXRlVGFibGVMYXlvdXQodG9vbGtpdCwgMiAvKiBudW1Db2x1bW5zICovKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPGZvcm0+PGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImFwcF9pbWdcIj48YSBocmVmPVwicGFnZTolMSRzXCI+IiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblBhZ2UuUEFHRV9JRCkpOwotICAgICAgICBidWYuYXBwZW5kKCJBcHBsaWNhdGlvbiIpOwotICAgICAgICBidWYuYXBwZW5kKCI8L2E+Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjogQWN0aXZpdGllcywgaW50ZW50IGZpbHRlcnMsIHByb3ZpZGVycywgc2VydmljZXMgYW5kIHJlY2VpdmVycy4iKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiPC9saT4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cInBlcm1faW1nXCI+PGEgaHJlZj1cInBhZ2U6JTEkc1wiPiIsIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgUGVybWlzc2lvblBhZ2UuUEFHRV9JRCkpOwotICAgICAgICBidWYuYXBwZW5kKCJQZXJtaXNzaW9uIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvYT4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCI6IFBlcm1pc3Npb25zIGRlZmluZWQgYW5kIHBlcm1pc3Npb25zIHVzZWQuIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJpbnN0X2ltZ1wiPjxhIGhyZWY9XCJwYWdlOiUxJHNcIj4iLCAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblBhZ2UuUEFHRV9JRCkpOwotICAgICAgICBidWYuYXBwZW5kKCJJbnN0cnVtZW50YXRpb24iKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiPC9hPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjogSW5zdHJ1bWVudGF0aW9uIGRlZmluZWQuIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJhbmRyb2lkX2ltZ1wiPjxhIGhyZWY9XCJwYWdlOiUxJHNcIj4iLCAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1hbmlmZXN0RWRpdG9yLlRFWFRfRURJVE9SX0lEKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlhNTCBTb3VyY2UiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiPC9hPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjogRGlyZWN0bHkgZWRpdCB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlLiIpOwotICAgICAgICBidWYuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYnVmLmFwcGVuZCgiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImFuZHJvaWRfaW1nXCI+Iik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjxhIGhyZWY9XCJodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvZGV2ZWwvYmJsb2Nrcy1tYW5pZmVzdC5odG1sXCI+RG9jdW1lbnRhdGlvbjwvYT46IERvY3VtZW50YXRpb24gZnJvbSB0aGUgQW5kcm9pZCBTREsgZm9yIEFuZHJvaWRNYW5pZmVzdC54bWwuIik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCgiPC9mb3JtPiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbUZvcm1UZXh0ID0gY3JlYXRlRm9ybVRleHQodGFibGUsIHRvb2xraXQsIHRydWUsIGJ1Zi50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIHNldHVwTGF5b3V0RGF0YSAqLyk7Ci0gICAgICAgIAotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3IgPSBlZGl0b3IuZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpOwotCi0gICAgICAgIEltYWdlIGFuZHJvaWRMb2dvID0gQWR0UGx1Z2luLmdldEFuZHJvaWRMb2dvKCk7Ci0gICAgICAgIG1Gb3JtVGV4dC5zZXRJbWFnZSgiYW5kcm9pZF9pbWciLCBhbmRyb2lkTG9nbyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGlmIChtYW5pZmVzdERlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZvcm1UZXh0LnNldEltYWdlKCJhcHBfaW1nIiwgZ2V0SWNvbihtYW5pZmVzdERlc2NyaXB0b3IuZ2V0QXBwbGljYXRpb25FbGVtZW50KCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbUZvcm1UZXh0LnNldEltYWdlKCJwZXJtX2ltZyIsIGdldEljb24obWFuaWZlc3REZXNjcmlwdG9yLmdldFBlcm1pc3Npb25FbGVtZW50KCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbUZvcm1UZXh0LnNldEltYWdlKCJpbnN0X2ltZyIsIGdldEljb24obWFuaWZlc3REZXNjcmlwdG9yLmdldEluc3RydW1lbnRhdGlvbkVsZW1lbnQoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybVRleHQuc2V0SW1hZ2UoImFwcF9pbWciLCBhbmRyb2lkTG9nbyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1Gb3JtVGV4dC5zZXRJbWFnZSgicGVybV9pbWciLCBhbmRyb2lkTG9nbyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1Gb3JtVGV4dC5zZXRJbWFnZSgiaW5zdF9pbWciLCBhbmRyb2lkTG9nbyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBtRm9ybVRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIoZWRpdG9yLmNyZWF0ZUh5cGVybGlua0xpc3RlbmVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIFVJIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgbmV3IGRlc2NyaXB0b3JzLgotICAgICAqIDxwLz5BdCB0aGlzIHBvaW50LCB0aGlzIG9ubHkgcmVmcmVzaGVzIHRoZSBpY29ucy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBjYWxsZWQgYnkge0BsaW5rIE92ZXJ2aWV3UGFnZSNyZWZyZXNoVWlBcHBsaWNhdGlvbk5vZGUoKX0gd2hlbiB0aGUKLSAgICAgKiBTREsgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TZGtDaGFuZ2VkKCkgewotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3IgPSBtRWRpdG9yLmdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKG1hbmlmZXN0RGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRm9ybVRleHQuc2V0SW1hZ2UoImFwcF9pbWciLCBnZXRJY29uKG1hbmlmZXN0RGVzY3JpcHRvci5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtRm9ybVRleHQuc2V0SW1hZ2UoInBlcm1faW1nIiwgZ2V0SWNvbihtYW5pZmVzdERlc2NyaXB0b3IuZ2V0UGVybWlzc2lvbkVsZW1lbnQoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtRm9ybVRleHQuc2V0SW1hZ2UoImluc3RfaW1nIiwgZ2V0SWNvbihtYW5pZmVzdERlc2NyaXB0b3IuZ2V0SW5zdHJ1bWVudGF0aW9uRWxlbWVudCgpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEltYWdlIGdldEljb24oRWxlbWVudERlc2NyaXB0b3IgZGVzYykgewotICAgICAgICBpZiAoZGVzYyAhPSBudWxsICYmIGRlc2MuZ2V0SWNvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmdldEljb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL092ZXJ2aWV3UGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvT3ZlcnZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjgwMTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvcGFnZXMvT3ZlcnZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnMuQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZS5VaVRyZWVCbG9jazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLQotLyoqCi0gKiBQYWdlIGZvciBvdmVydmlldyBzZXR0aW5ncywgcGFydCBvZiB0aGUgQW5kcm9pZE1hbmlmZXN0IGZvcm0gZWRpdG9yLgotICogPHAvPgotICogVXNlZnVsIHJlZmVyZW5jZToKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1Gb3Jtcy9hcnRpY2xlLmh0bWwiPgotICogICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtRm9ybXMvYXJ0aWNsZS5odG1sPC9hPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcnZpZXdQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0gICAgLyoqIFBhZ2UgaWQgdXNlZCBmb3Igc3dpdGNoaW5nIHRhYnMgcHJvZ3JhbW1hdGljYWxseSAqLwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9JRCA9ICJvdmVydmlld19wYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKiBDb250YWluZXIgZWRpdG9yICovCi0gICAgTWFuaWZlc3RFZGl0b3IgbUVkaXRvcjsKLSAgICAvKiogT3ZlcnZpZXcgcGFydCAoYXR0cmlidXRlcyBmb3IgbWFuaWZlc3QpICovCi0gICAgcHJpdmF0ZSBPdmVydmlld0luZm9QYXJ0IG1PdmVydmlld1BhcnQ7Ci0gICAgLyoqIE92ZXJ2aWV3IGxpbmsgcGFydCAqLwotICAgIHByaXZhdGUgT3ZlcnZpZXdMaW5rc1BhcnQgbU92ZXJ2aWV3TGlua1BhcnQ7Ci0KLSAgICBwcml2YXRlIFVpVHJlZUJsb2NrIG1UcmVlQmxvY2s7Ci0gICAgCi0gICAgcHVibGljIE92ZXJ2aWV3UGFnZShNYW5pZmVzdEVkaXRvciBlZGl0b3IpIHsKLSAgICAgICAgc3VwZXIoZWRpdG9yLCBQQUdFX0lELCAiTWFuaWZlc3QiKTsgIC8vIHRhYidzIGxhYmVsLCB1c2VyIHZpc2libGUsIGtlZXAgaXQgc2hvcnQKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IGluIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0VGV4dCgiQW5kcm9pZCBNYW5pZmVzdCIpOwotICAgICAgICBmb3JtLnNldEltYWdlKEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvc2l0ZSBib2R5ID0gZm9ybS5nZXRCb2R5KCk7Ci0gICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBVc3VhbGx5IHdlIHdvdWxkIHNldCBhIENvbHVtbkxheW91dCBvbiBib2R5IGhlcmUuIEhvd2V2ZXIgdGhlIHByZXNlbmNlIG9mIHRoZQotICAgICAgICAvLyBVaVRyZWVCbG9jayBmb3JjZXMgYSBHcmlkTGF5b3V0IHdpdGggb25lIGNvbHVtbiBzbyB3ZSBjb21wbHkgd2l0aCBpdC4KLQotICAgICAgICBtT3ZlcnZpZXdQYXJ0ID0gbmV3IE92ZXJ2aWV3SW5mb1BhcnQoYm9keSwgdG9vbGtpdCwgbUVkaXRvcik7Ci0gICAgICAgIG1PdmVydmlld1BhcnQuZ2V0U2VjdGlvbigpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KG1PdmVydmlld1BhcnQpOwotICAgICAgICAKLSAgICAgICAgbmV3TWFuaWZlc3RFeHRyYXNQYXJ0KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgCi0gICAgICAgIE92ZXJ2aWV3RXhwb3J0UGFydCBleHBvcnRQYXJ0ID0gbmV3IE92ZXJ2aWV3RXhwb3J0UGFydCh0aGlzLCBib2R5LCB0b29sa2l0LCBtRWRpdG9yKTsKLSAgICAgICAgZXhwb3J0UGFydC5nZXRTZWN0aW9uKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgIG1hbmFnZWRGb3JtLmFkZFBhcnQoZXhwb3J0UGFydCk7Ci0gICAgICAgIAotICAgICAgICBtT3ZlcnZpZXdMaW5rUGFydCA9IG5ldyBPdmVydmlld0xpbmtzUGFydChib2R5LCB0b29sa2l0LCBtRWRpdG9yKTsKLSAgICAgICAgbU92ZXJ2aWV3TGlua1BhcnQuZ2V0U2VjdGlvbigpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KG1PdmVydmlld0xpbmtQYXJ0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV3TWFuaWZlc3RFeHRyYXNQYXJ0KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBVaUVsZW1lbnROb2RlIG1hbmlmZXN0ID0gbUVkaXRvci5nZXRVaVJvb3ROb2RlKCk7Ci0gICAgICAgIG1UcmVlQmxvY2sgPSBuZXcgVWlUcmVlQmxvY2sobUVkaXRvciwgbWFuaWZlc3QsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdXRvQ3JlYXRlUm9vdCAqLywKLSAgICAgICAgICAgICAgICBjb21wdXRlTWFuaWZlc3RFeHRyYUZpbHRlcnMoKSwKLSAgICAgICAgICAgICAgICAiTWFuaWZlc3QgRXh0cmFzIiwKLSAgICAgICAgICAgICAgICAiRXh0cmEgbWFuaWZlc3QgZWxlbWVudHMiKTsKLSAgICAgICAgbVRyZWVCbG9jay5jcmVhdGVDb250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIGFuZCByZWZyZXNoZXMgdGhlIEFwcGxpY2F0aW9uIFVJIG5vZGUgaGFuZGxlIGJ5IHRoZSBzdWIgcGFydHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFVpQXBwbGljYXRpb25Ob2RlKCkgewotICAgICAgICBpZiAobU92ZXJ2aWV3UGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcnZpZXdQYXJ0Lm9uU2RrQ2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobU92ZXJ2aWV3TGlua1BhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJ2aWV3TGlua1BhcnQub25TZGtDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRyZWVCbG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIG1hbmlmZXN0ID0gbUVkaXRvci5nZXRVaVJvb3ROb2RlKCk7Ci0gICAgICAgICAgICBtVHJlZUJsb2NrLmNoYW5nZVJvb3RBbmREZXNjcmlwdG9ycyhtYW5pZmVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1hbmlmZXN0RXh0cmFGaWx0ZXJzKCksCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVmcmVzaCAqLyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvcltdIGNvbXB1dGVNYW5pZmVzdEV4dHJhRmlsdGVycygpIHsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBtYW5pZmVzdCA9IG1FZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3IgPSBtRWRpdG9yLmdldE1hbmlmZXN0RGVzY3JpcHRvcnMoKTsKLQotICAgICAgICBpZiAobWFuaWZlc3REZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50cyB3ZSB3YW50IHRvIGV4Y2x1ZGUKLSAgICAgICAgSGFzaFNldDxFbGVtZW50RGVzY3JpcHRvcj4gZXhjbHVkZXMgPSBuZXcgSGFzaFNldDxFbGVtZW50RGVzY3JpcHRvcj4oKTsKLSAgICAgICAgZXhjbHVkZXMuYWRkKG1hbmlmZXN0RGVzY3JpcHRvci5nZXRBcHBsaWNhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgIGV4Y2x1ZGVzLmFkZChtYW5pZmVzdERlc2NyaXB0b3IuZ2V0SW5zdHJ1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgZXhjbHVkZXMuYWRkKG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uRWxlbWVudCgpKTsKLSAgICAgICAgZXhjbHVkZXMuYWRkKG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uR3JvdXBFbGVtZW50KCkpOwotICAgICAgICBleGNsdWRlcy5hZGQobWFuaWZlc3REZXNjcmlwdG9yLmdldFBlcm1pc3Npb25UcmVlRWxlbWVudCgpKTsKLSAgICAgICAgZXhjbHVkZXMuYWRkKG1hbmlmZXN0RGVzY3JpcHRvci5nZXRVc2VzUGVybWlzc2lvbkVsZW1lbnQoKSk7Ci0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBrbm93biBjaGlsZHJlbiBvZiB0aGUgbWFuaWZlc3QgZGVzY3JpcHRvciBhbmQga2VlcCB3aGF0J3Mgbm90IGV4Y2x1ZGVkCi0gICAgICAgIEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4gZGVzY3JpcHRvckZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBmb3IgKEVsZW1lbnREZXNjcmlwdG9yIGNoaWxkIDogbWFuaWZlc3QuZ2V0RGVzY3JpcHRvcigpLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGlmICghZXhjbHVkZXMuY29udGFpbnMoY2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvckZpbHRlcnMuYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXNjcmlwdG9yRmlsdGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JGaWx0ZXJzLnRvQXJyYXkobmV3IEVsZW1lbnREZXNjcmlwdG9yW2Rlc2NyaXB0b3JGaWx0ZXJzLnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL1Blcm1pc3Npb25QYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9wYWdlcy9QZXJtaXNzaW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNlN2ZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21hbmlmZXN0L3BhZ2VzL1Blcm1pc3Npb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5wYWdlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuTWFuaWZlc3RFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnMuQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZS5VaVRyZWVCbG9jazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0vKioKLSAqIFBhZ2UgZm9yIHBlcm1pc3Npb25zIHNldHRpbmdzLCBwYXJ0IG9mIHRoZSBBbmRyb2lkTWFuaWZlc3QgZm9ybSBlZGl0b3IuCi0gKiA8cC8+Ci0gKiBVc2VmdWwgcmVmZXJlbmNlOgotICogPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUZvcm1zL2FydGljbGUuaHRtbCI+Ci0gKiAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1Gb3Jtcy9hcnRpY2xlLmh0bWw8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJtaXNzaW9uUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLSAgICAvKiogUGFnZSBpZCB1c2VkIGZvciBzd2l0Y2hpbmcgdGFicyBwcm9ncmFtbWF0aWNhbGx5ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9JRCA9ICJwZXJtaXNzaW9uX3BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogQ29udGFpbmVyIGVkaXRvciAqLwotICAgIE1hbmlmZXN0RWRpdG9yIG1FZGl0b3I7Ci0KLSAgICBwcml2YXRlIFVpVHJlZUJsb2NrIG1UcmVlQmxvY2s7Ci0KLSAgICBwdWJsaWMgUGVybWlzc2lvblBhZ2UoTWFuaWZlc3RFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIHN1cGVyKGVkaXRvciwgUEFHRV9JRCwgIlBlcm1pc3Npb25zIik7ICAvLyB0YWIgbGFiZWwsIGtlZXAgaXQgc2hvcnQKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IGluIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0VGV4dCgiQW5kcm9pZCBNYW5pZmVzdCBQZXJtaXNzaW9ucyIpOwotICAgICAgICBmb3JtLnNldEltYWdlKEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpKTsKLQotICAgICAgICBVaUVsZW1lbnROb2RlIG1hbmlmZXN0ID0gbUVkaXRvci5nZXRVaVJvb3ROb2RlKCk7Ci0gICAgICAgIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzIG1hbmlmZXN0RGVzY3JpcHRvciA9IG1FZGl0b3IuZ2V0TWFuaWZlc3REZXNjcmlwdG9ycygpOwotICAgICAgICAKLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3JbXSBkZXNjcmlwdG9yRmlsdGVycyA9IG51bGw7Ci0gICAgICAgIGlmIChtYW5pZmVzdERlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRvckZpbHRlcnMgPSBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uRWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdERlc2NyaXB0b3IuZ2V0VXNlc1Blcm1pc3Npb25FbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uR3JvdXBFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uVHJlZUVsZW1lbnQoKQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICBtVHJlZUJsb2NrID0gbmV3IFVpVHJlZUJsb2NrKG1FZGl0b3IsIG1hbmlmZXN0LAotICAgICAgICAgICAgICAgIHRydWUgLyogYXV0b0NyZWF0ZVJvb3QgKi8sCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvckZpbHRlcnMsCi0gICAgICAgICAgICAgICAgIlBlcm1pc3Npb25zIiwKLSAgICAgICAgICAgICAgICAiTGlzdCBvZiBwZXJtaXNzaW9ucyBkZWZpbmVkIGFuZCB1c2VkIGJ5IHRoZSBtYW5pZmVzdCIpOwotICAgICAgICBtVHJlZUJsb2NrLmNyZWF0ZUNvbnRlbnQobWFuYWdlZEZvcm0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgYW5kIHJlZnJlc2hlcyB0aGUgQXBwbGljYXRpb24gVUkgbm9kZSBoYW5kbGVkIGJ5IHRoZSBzdWIgcGFydHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFVpTm9kZSgpIHsKLSAgICAgICAgaWYgKG1UcmVlQmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBtYW5pZmVzdCA9IG1FZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMgbWFuaWZlc3REZXNjcmlwdG9yID0gbUVkaXRvci5nZXRNYW5pZmVzdERlc2NyaXB0b3JzKCk7Ci0KLSAgICAgICAgICAgIG1UcmVlQmxvY2suY2hhbmdlUm9vdEFuZERlc2NyaXB0b3JzKG1hbmlmZXN0LAotICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdERlc2NyaXB0b3IuZ2V0UGVybWlzc2lvbkVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGVzY3JpcHRvci5nZXRVc2VzUGVybWlzc2lvbkVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGVzY3JpcHRvci5nZXRQZXJtaXNzaW9uR3JvdXBFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdERlc2NyaXB0b3IuZ2V0UGVybWlzc2lvblRyZWVFbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZWZyZXNoICovKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudUNvbnRlbnRBc3Npc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudUNvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNjhlOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tZW51L01lbnVDb250ZW50QXNzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkQ29udGVudEFzc2lzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOwotCi0vKioKLSAqIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBmb3IgL3Jlcy9tZW51IFhNTCBmaWxlcwotICovCi1jbGFzcyBNZW51Q29udGVudEFzc2lzdCBleHRlbmRzIEFuZHJvaWRDb250ZW50QXNzaXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBMYXlvdXRDb250ZW50QXNzaXN0IAotICAgICAqLwotICAgIHB1YmxpYyBNZW51Q29udGVudEFzc2lzdCgpIHsKLSAgICAgICAgc3VwZXIoQW5kcm9pZFRhcmdldERhdGEuREVTQ1JJUFRPUl9NRU5VKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tZW51L01lbnVFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E1ZDNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWVudTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIueG1sLkFuZHJvaWRYUGF0aEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNdWx0aS1wYWdlIGZvcm0gZWRpdG9yIGZvciAvcmVzL21lbnUgWE1MIGZpbGVzLiAKLSAqLwotcHVibGljIGNsYXNzIE1lbnVFZGl0b3IgZXh0ZW5kcyBBbmRyb2lkRWRpdG9yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQW5kcm9pZENvbnN0YW50cy5FRElUT1JTX05BTUVTUEFDRSArICIubWVudS5NZW51RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFJvb3Qgbm9kZSBvZiB0aGUgVUkgZWxlbWVudCBoaWVyYXJjaHkgKi8KLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgbVVpUm9vdE5vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmb3JtIGVkaXRvciBmb3IgcmVzb3VyY2VzIFhNTCBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudUVkaXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIFVJIGVsZW1lbnQgaGllcmFyY2h5LCB3aGljaCBoZXJlIGlzCi0gICAgICogdGhlICJtZW51IiBub2RlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVaUVsZW1lbnROb2RlIGdldFVpUm9vdE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtVWlSb290Tm9kZTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIEJhc2UgQ2xhc3MgT3ZlcnJpZGVzIC0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgInNhdmUgYXMiIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBlZGl0b3IuCi0gICAgICogPHAvPgotICAgICAqIFNhdmUtQXMgaXMgYSB2YWxpZCBvcGVyYXRpb24gZm9yIHRoZSBNYW5pZmVzdEVkaXRvciBzaW5jZSBpdCBhY3RzIG9uIGEKLSAgICAgKiBzaW5nbGUgc291cmNlIGZpbGUuIAotICAgICAqCi0gICAgICogQHNlZSBJRWRpdG9yUGFydAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YXJpb3VzIGZvcm0gcGFnZXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybVBhZ2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkUGFnZShuZXcgTWVudVRyZWVQYWdlKHRoaXMpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRXJyb3IgY3JlYXRpbmcgbmVzdGVkIHBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIENoYW5nZSB0aGUgdGFiL3RpdGxlIG5hbWUgdG8gaW5jbHVkZSB0aGUgcHJvamVjdCBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgRmlsZUVkaXRvcklucHV0IGZpbGVJbnB1dCA9IChGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGZpbGVJbnB1dC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBzZXRQYXJ0TmFtZShTdHJpbmcuZm9ybWF0KCIlMSRzIiwgZmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIG5ldyBYTUwgTW9kZWwsIHdoaWNoIFhNTCByb290IG5vZGUgaXMgZ2l2ZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9kb2MgVGhlIFhNTCBkb2N1bWVudCwgaWYgYXZhaWxhYmxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHhtbE1vZGVsQ2hhbmdlZChEb2N1bWVudCB4bWxfZG9jKSB7Ci0gICAgICAgIC8vIGluaXQgdGhlIHVpIHJvb3Qgb24gZGVtYW5kCi0gICAgICAgIGluaXRVaVJvb3ROb2RlKGZhbHNlIC8qZm9yY2UqLyk7Ci0KLSAgICAgICAgbVVpUm9vdE5vZGUuc2V0WG1sRG9jdW1lbnQoeG1sX2RvYyk7Ci0gICAgICAgIGlmICh4bWxfZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHJvb3RfZGVzYyA9IG1VaVJvb3ROb2RlLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWFBhdGggeHBhdGggPSBBbmRyb2lkWFBhdGhGYWN0b3J5Lm5ld1hQYXRoKCk7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHhwYXRoLmV2YWx1YXRlKCIvIiArIHJvb3RfZGVzYy5nZXRYbWxOYW1lKCksICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCAmJiByb290X2Rlc2MuaXNNYW5kYXRvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJvb3QgZWxlbWVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoZm9yIGVtcHR5IG5ldyBkb2N1bWVudHMpCi0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBtVWlSb290Tm9kZS5jcmVhdGVYbWxOb2RlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgbWFuaWZlc3QgVUkgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyAKLSAgICAgICAgICAgICAgICBtVWlSb290Tm9kZS5sb2FkRnJvbVhtbE5vZGUobm9kZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVE9ETyA/IHN0YXJ0TW9uaXRvcmluZ01hcmtlcnMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiWFBhdGggZXJyb3Igd2hlbiB0cnlpbmcgdG8gZmluZCAnJXMnIGVsZW1lbnQgaW4gWE1MLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfZGVzYy5nZXRYbWxOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdXBlci54bWxNb2RlbENoYW5nZWQoeG1sX2RvYyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGluaXRpYWwgVUkgUm9vdCBOb2RlLCBpbmNsdWRpbmcgdGhlIGtub3duIG1hbmRhdG9yeSBlbGVtZW50cy4KLSAgICAgKiBAcGFyYW0gZm9yY2UgaWYgdHJ1ZSwgYSBuZXcgVWlSb290Tm9kZSBpcyByZWNyZWF0ZWQgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VWlSb290Tm9kZShib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIC8vIFRoZSByb290IFVJIG5vZGUgaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYgdGhlcmUncyBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlLgotICAgICAgICBpZiAobVVpUm9vdE5vZGUgPT0gbnVsbCB8fCBmb3JjZSkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtVWlSb290Tm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZG9jID0gbVVpUm9vdE5vZGUuZ2V0WG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSB0YXJnZXQgZGF0YSBmcm9tIHRoZSBvcGVuZWQgZmlsZSAoYW5kIGl0cyBwcm9qZWN0KQotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGdldFRhcmdldERhdGEoKTsKLQotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYzsKLSAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJ0ZW1wIiwgbnVsbCAvKmNoaWxkcmVuKi8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZGF0YS5nZXRNZW51RGVzY3JpcHRvcnMoKS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1VaVJvb3ROb2RlID0gZGVzYy5jcmVhdGVVaU5vZGUoKTsKLSAgICAgICAgICAgIG1VaVJvb3ROb2RlLnNldEVkaXRvcih0aGlzKTsKLQotICAgICAgICAgICAgb25EZXNjcmlwdG9yc0NoYW5nZWQoZG9jKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0gTG9jYWwgTWV0aG9kcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZWxvYWRzIHRoZSBVSSBtYW5pZmVzdCBub2RlIGZyb20gdGhlIFhNTCwgYW5kIGNhbGxzIHRoZSBwYWdlcyB0byB1cGRhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uRGVzY3JpcHRvcnNDaGFuZ2VkKERvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVWlSb290Tm9kZS5sb2FkRnJvbVhtbE5vZGUoZG9jdW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVpUm9vdE5vZGUucmVsb2FkRnJvbVhtbE5vZGUobVVpUm9vdE5vZGUuZ2V0WG1sTm9kZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudVNvdXJjZVZpZXdlckNvbmZpZy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWVudS9NZW51U291cmNlVmlld2VyQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDg5YTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWVudS9NZW51U291cmNlVmlld2VyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnU7Ci0KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRTb3VyY2VWaWV3ZXJDb25maWc7Ci0KLS8qKgotICogU291cmNlIFZpZXdlciBDb25maWd1cmF0aW9uIHRoYXQgY2FsbHMgaW4gTWVudUNvbnRlbnRBc3Npc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW51U291cmNlVmlld2VyQ29uZmlnIGV4dGVuZHMgQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZyB7Ci0KLSAgICBwdWJsaWMgTWVudVNvdXJjZVZpZXdlckNvbmZpZygpIHsKLSAgICAgICAgc3VwZXIobmV3IE1lbnVDb250ZW50QXNzaXN0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudVRyZWVQYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tZW51L01lbnVUcmVlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI0ODAyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvTWVudVRyZWVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWUuVWlUcmVlQmxvY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotLyoqCi0gKiBQYWdlIGZvciB0aGUgbWVudSBmb3JtIGVkaXRvci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lbnVUcmVlUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLSAgICAvKiogUGFnZSBpZCB1c2VkIGZvciBzd2l0Y2hpbmcgdGFicyBwcm9ncmFtbWF0aWNhbGx5ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9JRCA9ICJsYXlvdXRfdHJlZV9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIENvbnRhaW5lciBlZGl0b3IgKi8KLSAgICBNZW51RWRpdG9yIG1FZGl0b3I7Ci0KLSAgICBwdWJsaWMgTWVudVRyZWVQYWdlKE1lbnVFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIHN1cGVyKGVkaXRvciwgUEFHRV9JRCwgIkxheW91dCIpOyAgLy8gdGFiJ3MgbGFiZWwsIGtlZXAgaXQgc2hvcnQKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IGluIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0VGV4dCgiQW5kcm9pZCBNZW51Iik7Ci0gICAgICAgIGZvcm0uc2V0SW1hZ2UoQWR0UGx1Z2luLmdldEFuZHJvaWRMb2dvKCkpOwotCi0gICAgICAgIFVpRWxlbWVudE5vZGUgcm9vdE5vZGUgPSBtRWRpdG9yLmdldFVpUm9vdE5vZGUoKTsKLSAgICAgICAgVWlUcmVlQmxvY2sgYmxvY2sgPSBuZXcgVWlUcmVlQmxvY2sobUVkaXRvciwgcm9vdE5vZGUsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdXRvQ3JlYXRlUm9vdCAqLywKLSAgICAgICAgICAgICAgICBudWxsIC8qIG5vIGVsZW1lbnQgZmlsdGVycyAqLywKLSAgICAgICAgICAgICAgICAiTWVudSBFbGVtZW50cyIsCi0gICAgICAgICAgICAgICAgIkxpc3Qgb2YgYWxsIG1lbnUgZWxlbWVudHMgaW4gdGhpcyBYTUwgZmlsZS4iKTsKLSAgICAgICAgYmxvY2suY3JlYXRlQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWVudS9kZXNjcmlwdG9ycy9NZW51RGVzY3JpcHRvcnMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21lbnUvZGVzY3JpcHRvcnMvTWVudURlc2NyaXB0b3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzYzZjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWVudS9kZXNjcmlwdG9ycy9NZW51RGVzY3JpcHRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnUuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuSURlc2NyaXB0b3JQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5YbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5EZWNsYXJlU3R5bGVhYmxlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQ29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lbnUgc3RydWN0dXJlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVudURlc2NyaXB0b3JzIGltcGxlbWVudHMgSURlc2NyaXB0b3JQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX1JPT1RfRUxFTUVOVCA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFRoZSByb290IGVsZW1lbnQgZGVzY3JpcHRvci4gKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIG1EZXNjcmlwdG9yID0gbnVsbDsKLQotICAgIC8qKiBAcmV0dXJuIHRoZSByb290IGRlc2NyaXB0b3IuICovCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yW10gZ2V0Um9vdEVsZW1lbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yLmdldENoaWxkcmVuKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRvY3VtZW50IGRlc2NyaXB0b3IuCi0gICAgICogPHAvPgotICAgICAqIEl0IGZpcnN0IGNvbXB1dGVzIHRoZSBuZXcgY2hpbGRyZW4gb2YgdGhlIGRlc2NyaXB0b3IgYW5kIHRoZW4gdXBkYXRlcyB0aGVtCi0gICAgICogYWxsIGF0IG9uY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlTWFwIFRoZSBtYXAgc3R5bGUgPT4gYXR0cmlidXRlcyBmcm9tIHRoZSBhdHRycy54bWwgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycyhNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gc3R5bGVNYXApIHsKLQotICAgICAgICAvLyBUaGVyZSBhcmUgMyBlbGVtZW50czogbWVudSwgaXRlbSBhbmQgZ3JvdXAuCi0gICAgICAgIC8vIFRoZSByb290IGVsZW1lbnQgTVVTVCBiZSBhIG1lbnUuCi0gICAgICAgIC8vIEEgdG9wIG1lbnUgY2FuIGNvbnRhaW4gaXRlbXMgb3IgZ3JvdXA6Ci0gICAgICAgIC8vICAtIHRvcCBncm91cHMgY2FuIGNvbnRhaW4gdG9wIGl0ZW1zCi0gICAgICAgIC8vICAtIHRvcCBpdGVtcyBjYW4gY29udGFpbiBzdWItbWVudXMKLSAgICAgICAgLy8gQSBzdWIgbWVudSBjYW4gY29udGFpbnMgc3ViIGl0ZW1zIG9yIHN1YiBncm91cHM6Ci0gICAgICAgIC8vICAtIHN1YiBncm91cHMgY2FuIGNvbnRhaW4gc3ViIGl0ZW1zCi0gICAgICAgIC8vICAtIHN1YiBpdGVtcyBjYW5ub3QgY29udGFpbiBhbnl0aGluZwotICAgICAgICAKLSAgICAgICAgaWYgKG1EZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gY3JlYXRlRWxlbWVudChzdHlsZU1hcCwKLSAgICAgICAgICAgICAgICBNRU5VX1JPT1RfRUxFTUVOVCwgLy8geG1sTmFtZQotICAgICAgICAgICAgICAgICJNZW51IiwgLy8gdWlOYW1lLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIFRPRE8gU0RLIFVSTAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGV4dHJhQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gY2hpbGRyZW5FbGVtZW50cywKLSAgICAgICAgICAgICAgICB0cnVlIC8qIG1hbmRhdG9yeSAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLSBzdWIgbWVudSBjYW4gaGF2ZSBzdWJfaXRlbXMsIHN1Yl9ncm91cHMgYnV0IG5vdCBzdWJfbWVudXMKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBzdWJfaXRlbSA9IGNyZWF0ZUVsZW1lbnQoc3R5bGVNYXAsCi0gICAgICAgICAgICAgICAgIml0ZW0iLCAvLyB4bWxOYW1lIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiSXRlbSIsIC8vIHVpTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBUT0RPIFNESyBVUkwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBleHRyYUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIGNoaWxkcmVuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogbWFuZGF0b3J5ICovKTsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBzdWJfZ3JvdXAgPSBjcmVhdGVFbGVtZW50KHN0eWxlTWFwLAotICAgICAgICAgICAgICAgICJncm91cCIsIC8vIHhtbE5hbWUgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJHcm91cCIsIC8vIHVpTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBUT0RPIFNESyBVUkwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBleHRyYUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsgc3ViX2l0ZW0gfSwgLy8gY2hpbGRyZW5FbGVtZW50cywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHN1Yl9tZW51ID0gY3JlYXRlRWxlbWVudChzdHlsZU1hcCwKLSAgICAgICAgICAgICAgICBNRU5VX1JPT1RfRUxFTUVOVCwgLy8geG1sTmFtZSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIlN1Yi1NZW51IiwgLy8gdWlOYW1lLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIFRPRE8gU0RLIFVSTAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGV4dHJhQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10geyBzdWJfaXRlbSwgc3ViX2dyb3VwIH0sIC8vIGNoaWxkcmVuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgIC8vIC0tIHRvcCBtZW51IGNhbiBoYXZlIGFsbCB0b3AgZ3JvdXBzIGFuZCB0b3AgaXRlbXMgKHdoaWNoIGNhbiBoYXZlIHN1YiBtZW51cykKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciB0b3BfaXRlbSA9IGNyZWF0ZUVsZW1lbnQoc3R5bGVNYXAsCi0gICAgICAgICAgICAgICAgIml0ZW0iLCAvLyB4bWxOYW1lIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiSXRlbSIsIC8vIHVpTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBUT0RPIFNESyBVUkwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBleHRyYUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsgc3ViX21lbnUgfSwgLy8gY2hpbGRyZW5FbGVtZW50cywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHRvcF9ncm91cCA9IGNyZWF0ZUVsZW1lbnQoc3R5bGVNYXAsCi0gICAgICAgICAgICAgICAgImdyb3VwIiwgLy8geG1sTmFtZSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIkdyb3VwIiwgLy8gdWlOYW1lLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIFRPRE8gU0RLIFVSTAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGV4dHJhQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10geyB0b3BfaXRlbSB9LCAvLyBjaGlsZHJlbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIG1hbmRhdG9yeSAqLyk7Ci0KLSAgICAgICAgWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yIHhtbG5zID0gbmV3IFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcigiYW5kcm9pZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTKTsgCi0KLSAgICAgICAgdXBkYXRlRWxlbWVudChtRGVzY3JpcHRvciwgc3R5bGVNYXAsICJNZW51IiwgeG1sbnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1EZXNjcmlwdG9yLnNldENoaWxkcmVuKG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsgdG9wX2l0ZW0sIHRvcF9ncm91cCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEVsZW1lbnREZXNjcmlwdG9yIGNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGdpdmVuIGhlcmUKLSAgICAgKiBhbmQgdGhlIGphdmFkb2MgJiBhdHRyaWJ1dGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHlsZSBtYXAgaWYgYW55LgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgY3JlYXRlRWxlbWVudCgKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBzdHlsZU1hcCwgCi0gICAgICAgICAgICBTdHJpbmcgeG1sTmFtZSwgU3RyaW5nIHVpTmFtZSwgU3RyaW5nIHNka1VybCwKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgZXh0cmFBdHRyaWJ1dGUsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuRWxlbWVudHMsIGJvb2xlYW4gbWFuZGF0b3J5KSB7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcih4bWxOYW1lLCB1aU5hbWUsIG51bGwsIHNka1VybCwKLSAgICAgICAgICAgICAgICBudWxsLCBjaGlsZHJlbkVsZW1lbnRzLCBtYW5kYXRvcnkpOwotCi0gICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KGVsZW1lbnQsIHN0eWxlTWFwLAotICAgICAgICAgICAgICAgIGdldFN0eWxlTmFtZSh4bWxOYW1lKSwKLSAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYW4gRWxlbWVudERlc2NyaXB0b3Igd2l0aCB0aGUgamF2YWRvYyAmIGF0dHJpYnV0ZXMgZXh0cmFjdGVkIGZyb20gdGhlIHN0eWxlCi0gICAgICogbWFwIGlmIGFueS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIHVwZGF0ZUVsZW1lbnQoRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBzdHlsZU1hcCwKLSAgICAgICAgICAgIFN0cmluZyBzdHlsZU5hbWUsCi0gICAgICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yIGV4dHJhQXR0cmlidXRlKSB7Ci0gICAgICAgIEFycmF5TGlzdDxBdHRyaWJ1dGVEZXNjcmlwdG9yPiBkZXNjcyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4oKTsKLQotICAgICAgICBEZWNsYXJlU3R5bGVhYmxlSW5mbyBzdHlsZSA9IHN0eWxlTWFwICE9IG51bGwgPyBzdHlsZU1hcC5nZXQoc3R5bGVOYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yc1V0aWxzLmFwcGVuZEF0dHJpYnV0ZXMoZGVzY3MsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsICAgLy8gZWxlbWVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUuZ2V0QXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICBudWxsLCAgIC8vIHJlcXVpcmVkQXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICBudWxsKTsgIC8vIG92ZXJyaWRlcwotICAgICAgICAgICAgZWxlbWVudC5zZXRUb29sdGlwKHN0eWxlLmdldEphdmFEb2MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0cmFBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3MuYWRkKGV4dHJhQXR0cmlidXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlcyhkZXNjcy50b0FycmF5KG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW2Rlc2NzLnNpemUoKV0pKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3R5bGUgbmFtZSAoaS5lLiB0aGUgPGRlY2xhcmUtc3R5bGVhYmxlPiBuYW1lIGZvdW5kIGluIGF0dHJzLnhtbCkKLSAgICAgKiBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgcnVsZSBpcyB0aGF0IGFsbCBlbGVtZW50cyBoYXZlIGZvciBzdHlsZSBuYW1lOgotICAgICAqIC0gdGhlaXIgeG1sIG5hbWUgY2FwaXRhbGl6ZWQKLSAgICAgKiAtIGEgIk1lbnUiIHByZWZpeCwgZXhjZXB0IGZvciA8bWVudT4gaXRzZWxmIHdoaWNoIGlzIGp1c3QgIk1lbnUiLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFN0eWxlTmFtZShTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBTdHJpbmcgc3R5bGVOYW1lID0gRGVzY3JpcHRvcnNVdGlscy5jYXBpdGFsaXplKHhtbE5hbWUpOwotCi0gICAgICAgIC8vIFRoaXMgaXMgTk9UIHRoZSBVSSBOYW1lIGJ1dCB0aGUgZXhwZWN0ZWQgaW50ZXJuYWwgc3R5bGUgbmFtZQotICAgICAgICBmaW5hbCBTdHJpbmcgTUVOVV9TVFlMRV9CQVNFX05BTUUgPSAiTWVudSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGlmICghc3R5bGVOYW1lLmVxdWFscyhNRU5VX1NUWUxFX0JBU0VfTkFNRSkpIHsgICAgICAgIAotICAgICAgICAgICAgc3R5bGVOYW1lID0gTUVOVV9TVFlMRV9CQVNFX05BTUUgKyBzdHlsZU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0eWxlTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvUmVzb3VyY2VzQ29udGVudEFzc2lzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL1Jlc291cmNlc0NvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNDk3Zi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvUmVzb3VyY2VzQ29udGVudEFzc2lzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkQ29udGVudEFzc2lzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOwotCi0vKioKLSAqIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBmb3IgL3Jlcy92YWx1ZXMgYW5kIC9yZXMvZHJhd2FibGUgWE1MIGZpbGVzCi0gKi8KLWNsYXNzIFJlc291cmNlc0NvbnRlbnRBc3Npc3QgZXh0ZW5kcyBBbmRyb2lkQ29udGVudEFzc2lzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVzb3VyY2VzQ29udGVudEFzc2lzdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VzQ29udGVudEFzc2lzdCgpIHsKLSAgICAgICAgc3VwZXIoQW5kcm9pZFRhcmdldERhdGEuREVTQ1JJUFRPUl9SRVNPVVJDRVMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4YjcxMi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvUmVzb3VyY2VzRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmRlc2NyaXB0b3JzLlJlc291cmNlc0Rlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIueG1sLkFuZHJvaWRYUGF0aEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNdWx0aS1wYWdlIGZvcm0gZWRpdG9yIGZvciAvcmVzL3ZhbHVlcyBhbmQgL3Jlcy9kcmF3YWJsZSBYTUwgZmlsZXMuIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzRWRpdG9yIGV4dGVuZHMgQW5kcm9pZEVkaXRvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IEFuZHJvaWRDb25zdGFudHMuRURJVE9SU19OQU1FU1BBQ0UgKyAiLnJlc291cmNlcy5SZXNvdXJjZXNFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUm9vdCBub2RlIG9mIHRoZSBVSSBlbGVtZW50IGhpZXJhcmNoeSAqLwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBtVWlSZXNvdXJjZXNOb2RlOwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmb3JtIGVkaXRvciBmb3IgcmVzb3VyY2VzIFhNTCBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VzRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgVUkgZWxlbWVudCBoaWVyYXJjaHksIHdoaWNoCi0gICAgICogaGVyZSBpcyB0aGUgInJlc291cmNlcyIgbm9kZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBnZXRVaVJvb3ROb2RlKCkgewotICAgICAgICByZXR1cm4gbVVpUmVzb3VyY2VzTm9kZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLSBCYXNlIENsYXNzIE92ZXJyaWRlcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlICJzYXZlIGFzIiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgZWRpdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBTYXZlLUFzIGlzIGEgdmFsaWQgb3BlcmF0aW9uIGZvciB0aGUgTWFuaWZlc3RFZGl0b3Igc2luY2UgaXQgYWN0cyBvbiBhCi0gICAgICogc2luZ2xlIHNvdXJjZSBmaWxlLiAKLSAgICAgKgotICAgICAqIEBzZWUgSUVkaXRvclBhcnQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmFyaW91cyBmb3JtIHBhZ2VzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1QYWdlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZFBhZ2UobmV3IFJlc291cmNlc1RyZWVQYWdlKHRoaXMpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAiRXJyb3IgY3JlYXRpbmcgbmVzdGVkIHBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBDaGFuZ2UgdGhlIHRhYi90aXRsZSBuYW1lIHRvIGluY2x1ZGUgdGhlIHByb2plY3QgbmFtZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLSAgICAgICAgc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIEZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSBmaWxlSW5wdXQuZ2V0RmlsZSgpOwotICAgICAgICAgICAgc2V0UGFydE5hbWUoU3RyaW5nLmZvcm1hdCgiJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBuZXcgWE1MIE1vZGVsLCB3aGljaCBYTUwgcm9vdCBub2RlIGlzIGdpdmVuLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxfZG9jIFRoZSBYTUwgZG9jdW1lbnQsIGlmIGF2YWlsYWJsZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB4bWxNb2RlbENoYW5nZWQoRG9jdW1lbnQgeG1sX2RvYykgewotICAgICAgICAvLyBpbml0IHRoZSB1aSByb290IG9uIGRlbWFuZAotICAgICAgICBpbml0VWlSb290Tm9kZShmYWxzZSAvKmZvcmNlKi8pOwotCi0gICAgICAgIG1VaVJlc291cmNlc05vZGUuc2V0WG1sRG9jdW1lbnQoeG1sX2RvYyk7Ci0gICAgICAgIGlmICh4bWxfZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHJlc291cmNlc19kZXNjID0KLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzRGVzY3JpcHRvcnMuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYUGF0aCB4cGF0aCA9IEFuZHJvaWRYUGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKLSAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgeHBhdGguZXZhbHVhdGUoIi8iICsgcmVzb3VyY2VzX2Rlc2MuZ2V0WG1sTmFtZSgpLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLk5PREUpOwotICAgICAgICAgICAgICAgIGFzc2VydCBub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhyZXNvdXJjZXNfZGVzYy5nZXRYbWxOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgbWFuaWZlc3QgVUkgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyAKLSAgICAgICAgICAgICAgICBtVWlSZXNvdXJjZXNOb2RlLmxvYWRGcm9tWG1sTm9kZShub2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiWFBhdGggZXJyb3Igd2hlbiB0cnlpbmcgdG8gZmluZCAnJXMnIGVsZW1lbnQgaW4gWE1MLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlc19kZXNjLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnhtbE1vZGVsQ2hhbmdlZCh4bWxfZG9jKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBVSSBSb290IE5vZGUsIGluY2x1ZGluZyB0aGUga25vd24gbWFuZGF0b3J5IGVsZW1lbnRzLgotICAgICAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlLCBhIG5ldyBVaVJvb3ROb2RlIGlzIHJlY3JlYXRlZCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRVaVJvb3ROb2RlKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgLy8gVGhlIG1hbmlmZXN0IFVJIG5vZGUgaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYgdGhlcmUncyBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlLgotICAgICAgICBpZiAobVVpUmVzb3VyY2VzTm9kZSA9PSBudWxsIHx8IGZvcmNlKSB7Ci0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciByZXNvdXJjZXNfZGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlc0Rlc2NyaXB0b3JzLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudERlc2NyaXB0b3IoKTsgICAKLSAgICAgICAgICAgIG1VaVJlc291cmNlc05vZGUgPSByZXNvdXJjZXNfZGVzYy5jcmVhdGVVaU5vZGUoKTsKLSAgICAgICAgICAgIG1VaVJlc291cmNlc05vZGUuc2V0RWRpdG9yKHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvbkRlc2NyaXB0b3JzQ2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLSBMb2NhbCBNZXRob2RzIC0tLS0KLQotICAgIHByaXZhdGUgdm9pZCBvbkRlc2NyaXB0b3JzQ2hhbmdlZCgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lLCBhcyB0aGUgZGVzY3JpcHRvciBhcmUgc3RhdGljIGZvciBub3cuCi0gICAgICAgIC8vIEZJWE1FIFVwZGF0ZSB3aGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgbm90IHN0YXRpYwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNTb3VyY2VWaWV3ZXJDb25maWcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNTb3VyY2VWaWV3ZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyOTRiMS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvUmVzb3VyY2VzU291cmNlVmlld2VyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlczsKLQotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZzsKLQotLyoqCi0gKiBTb3VyY2UgVmlld2VyIENvbmZpZ3VyYXRpb24gdGhhdCBjYWxscyBpbiBSZXNvdXJjZXNDb250ZW50QXNzaXN0LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzU291cmNlVmlld2VyQ29uZmlnIGV4dGVuZHMgQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZyB7Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VzU291cmNlVmlld2VyQ29uZmlnKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VzQ29udGVudEFzc2lzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvUmVzb3VyY2VzVHJlZVBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNUcmVlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWM1OTNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9SZXNvdXJjZXNUcmVlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWUuVWlUcmVlQmxvY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogUGFnZSBmb3IgaW5zdHJ1bWVudGF0aW9uIHNldHRpbmdzLCBwYXJ0IG9mIHRoZSBBbmRyb2lkTWFuaWZlc3QgZm9ybSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXNUcmVlUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLSAgICAvKiogUGFnZSBpZCB1c2VkIGZvciBzd2l0Y2hpbmcgdGFicyBwcm9ncmFtbWF0aWNhbGx5ICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9JRCA9ICJyZXNfdHJlZV9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIENvbnRhaW5lciBlZGl0b3IgKi8KLSAgICBSZXNvdXJjZXNFZGl0b3IgbUVkaXRvcjsKLQotICAgIHB1YmxpYyBSZXNvdXJjZXNUcmVlUGFnZShSZXNvdXJjZXNFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIHN1cGVyKGVkaXRvciwgUEFHRV9JRCwgIlJlc291cmNlcyIpOyAgLy8gdGFiJ3MgbGFiZWwsIGtlZXAgaXQgc2hvcnQKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IGluIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIHRoZSBmb3JtIGhvc3RlZCBpbiB0aGlzIHBhZ2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLSAgICAgICAgU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgY29uZmlnVGV4dCA9IG51bGw7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IG1FZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dClpbnB1dDsKLSAgICAgICAgICAgIElGaWxlIGlGaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VGb2xkZXIoaUZpbGUpOwotICAgICAgICAgICAgaWYgKHJlc0ZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnVGV4dCA9IHJlc0ZvbGRlci5nZXRDb25maWd1cmF0aW9uKCkudG9EaXNwbGF5U3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb25maWdUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm0uc2V0VGV4dChTdHJpbmcuZm9ybWF0KCJBbmRyb2lkIFJlc291cmNlcyAoJTEkcykiLCBjb25maWdUZXh0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JtLnNldFRleHQoIkFuZHJvaWQgUmVzb3VyY2VzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3JtLnNldEltYWdlKEFkdFBsdWdpbi5nZXRBbmRyb2lkTG9nbygpKTsKLQotICAgICAgICBVaUVsZW1lbnROb2RlIHJlc291cmNlcyA9IG1FZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICBVaVRyZWVCbG9jayBibG9jayA9IG5ldyBVaVRyZWVCbG9jayhtRWRpdG9yLCByZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdXRvQ3JlYXRlUm9vdCAqLywKLSAgICAgICAgICAgICAgICBudWxsIC8qIG5vIGVsZW1lbnQgZmlsdGVycyAqLywKLSAgICAgICAgICAgICAgICAiUmVzb3VyY2VzIEVsZW1lbnRzIiwKLSAgICAgICAgICAgICAgICAiTGlzdCBvZiBhbGwgcmVzb3VyY2VzIGVsZW1lbnRzIGluIHRoaXMgWE1MIGZpbGUuIik7Ci0gICAgICAgIGJsb2NrLmNyZWF0ZUNvbnRlbnQobWFuYWdlZEZvcm0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9kZXNjcmlwdG9ycy9Db2xvclZhbHVlRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2Rlc2NyaXB0b3JzL0NvbG9yVmFsdWVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmU5Y2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2Rlc2NyaXB0b3JzL0NvbG9yVmFsdWVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlRleHRWYWx1ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLnVpbW9kZWwuVWlDb2xvclZhbHVlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaVJlc291cmNlQXR0cmlidXRlTm9kZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBDb2xvciBYTUwgZWxlbWVudCB2YWx1ZSBkaXNwbGF5ZWQgYnkgYW4ge0BsaW5rIFVpQ29sb3JWYWx1ZU5vZGV9LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sb3JWYWx1ZURlc2NyaXB0b3IgZXh0ZW5kcyBUZXh0VmFsdWVEZXNjcmlwdG9yIHsKLQotICAgIHB1YmxpYyBDb2xvclZhbHVlRGVzY3JpcHRvcihTdHJpbmcgdWlOYW1lLCBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBzdXBlcih1aU5hbWUsIHRvb2x0aXApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBVaVJlc291cmNlQXR0cmlidXRlTm9kZX0gbGlua2VkIHRvIHRoaXMgdGhlbWUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlBdHRyaWJ1dGVOb2RlIGNyZWF0ZVVpTm9kZShVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlDb2xvclZhbHVlTm9kZSh0aGlzLCB1aVBhcmVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2Rlc2NyaXB0b3JzL0l0ZW1FbGVtZW50RGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2Rlc2NyaXB0b3JzL0l0ZW1FbGVtZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDNiZjhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9kZXNjcmlwdG9ycy9JdGVtRWxlbWVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmRlc2NyaXB0b3JzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMudWltb2RlbC5VaUl0ZW1FbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLS8qKgotICoge0BsaW5rIEl0ZW1FbGVtZW50RGVzY3JpcHRvcn0gaXMgYSBzcGVjaWFsIHZlcnNpb24gb2Yge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSB0aGF0Ci0gKiB1c2VzIGEgc3BlY2lhbGl6ZWQge0BsaW5rIFVpSXRlbUVsZW1lbnROb2RlfSBmb3IgZGlzcGxheS4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1FbGVtZW50RGVzY3JpcHRvciBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEl0ZW1FbGVtZW50RGVzY3JpcHRvcn0gYmFzZWQgb24gaXRzIFhNTCBuYW1lLCBVSSBuYW1lLAotICAgICAqIHRvb2x0aXAsIFNESyB1cmwsIGF0dHJpYnV0ZXMgbGlzdCwgY2hpbGRyZW4gbGlzdCBhbmQgbWFuZGF0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB4bWxfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lLiBDYXNlIHNlbnNpdGl2ZS4KLSAgICAgKiBAcGFyYW0gdWlfbmFtZSBUaGUgWE1MIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLCB0eXBpY2FsbHkgY2FwaXRhbGl6ZWQuCi0gICAgICogQHBhcmFtIHRvb2x0aXAgQW4gb3B0aW9uYWwgdG9vbHRpcC4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIHNka191cmwgQW4gb3B0aW9uYWwgU0tEIFVSTC4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGxpc3Qgb2YgYWxsb3dlZCBhdHRyaWJ1dGVzLiBDYW4gYmUgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGxpc3Qgb2YgYWxsb3dlZCBjaGlsZHJlbi4gQ2FuIGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICogQHBhcmFtIG1hbmRhdG9yeSBXaGV0aGVyIHRoaXMgbm9kZSBtdXN0IGFsd2F5cyBleGlzdCAoZXZlbiBmb3IgZW1wdHkgbW9kZWxzKS4gQSBtYW5kYXRvcnkKLSAgICAgKiAgVUkgbm9kZSBpcyBuZXZlciBkZWxldGVkIGFuZCBpdCBtYXkgbGFjayBhbiBhY3R1YWwgWE1MIG5vZGUgYXR0YWNoZWQuIEEgbm9uLW1hbmRhdG9yeQotICAgICAqICBVSSBub2RlIE1VU1QgaGF2ZSBhbiBYTUwgbm9kZSBhdHRhY2hlZCBhbmQgaXQgd2lsbCBjZWFzZSB0byBleGlzdCB3aGVuIHRoZSBYTUwgbm9kZQotICAgICAqICBjZWFzZXMgdG8gZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIEl0ZW1FbGVtZW50RGVzY3JpcHRvcihTdHJpbmcgeG1sX25hbWUsIFN0cmluZyB1aV9uYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBzZGtfdXJsLCBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gYXR0cmlidXRlcywKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gY2hpbGRyZW4sIGJvb2xlYW4gbWFuZGF0b3J5KSB7Ci0gICAgICAgIHN1cGVyKHhtbF9uYW1lLCB1aV9uYW1lLCB0b29sdGlwLCBzZGtfdXJsLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgbWFuZGF0b3J5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBjcmVhdGVVaU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVWlJdGVtRWxlbWVudE5vZGUodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2Rlc2NyaXB0b3JzL1Jlc291cmNlc0Rlc2NyaXB0b3JzLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvZGVzY3JpcHRvcnMvUmVzb3VyY2VzRGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhOGE5NC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvZGVzY3JpcHRvcnMvUmVzb3VyY2VzRGVzY3JpcHRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuSURlc2NyaXB0b3JQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5MaXN0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0VmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotCi0KLS8qKgotICogQ29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBmb3IgcmVzb3VyY2VzIFhNTCBmaWxlcyAodW5kZXIgcmVzL3ZhbHVlcy8pCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZXNEZXNjcmlwdG9ycyBpbXBsZW1lbnRzIElEZXNjcmlwdG9yUHJvdmlkZXIgewotCi0gICAgLy8gUHVibGljIGF0dHJpYnV0ZXMgbmFtZXMsIGF0dHJpYnV0ZXMgZGVzY3JpcHRvcnMgYW5kIGVsZW1lbnRzIGRlc2NyaXB0b3JzCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0VMRU1FTlQgPSAicmVzb3VyY2VzIjsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUiA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUiA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VzRGVzY3JpcHRvcnMgc1RoaXMgPSBuZXcgUmVzb3VyY2VzRGVzY3JpcHRvcnMoKTsKLQotICAgIC8qKiBUaGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBmb3IgdGhlIHJvb3QgUmVzb3VyY2VzIGVsZW1lbnQuICovCi0gICAgcHVibGljIGZpbmFsIEVsZW1lbnREZXNjcmlwdG9yIG1SZXNvdXJjZXNFbGVtZW50OwotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZXNEZXNjcmlwdG9ycyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIHNUaGlzOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5kZXNjcmlwdG9ycy5JRGVzY3JpcHRvclByb3ZpZGVyI2dldFJvb3RFbGVtZW50RGVzY3JpcHRvcnMoKQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvcltdIGdldFJvb3RFbGVtZW50RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7IG1SZXNvdXJjZXNFbGVtZW50IH07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbVJlc291cmNlc0VsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBnZXRFbGVtZW50RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXNFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFJlc291cmNlc0Rlc2NyaXB0b3JzKCkgewotCi0gICAgICAgIC8vIENvbW1vbiBhdHRyaWJ1dGVzIHVzZWQgaW4gbWFueSBwbGFjZWQKLQotICAgICAgICAvLyBFbGVtZW50cwotCi0gICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBjb2xvcl9lbGVtZW50ID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICJjb2xvciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiQ29sb3IiLCAKLSAgICAgICAgICAgICAgICAiQSBAY29sb3JAIHZhbHVlIHNwZWNpZmllcyBhbiBSR0IgdmFsdWUgd2l0aCBhbiBhbHBoYSBjaGFubmVsLCB3aGljaCBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyBzdWNoIGFzIHNwZWNpZnlpbmcgYSBzb2xpZCBjb2xvciBmb3IgYSBEcmF3YWJsZSBvciB0aGUgY29sb3IgdG8gdXNlIGZvciB0ZXh0LiAgSXQgYWx3YXlzIGJlZ2lucyB3aXRoIGEgIyBjaGFyYWN0ZXIgYW5kIHRoZW4gaXMgZm9sbG93ZWQgYnkgdGhlIGFscGhhLXJlZC1ncmVlbi1ibHVlIGluZm9ybWF0aW9uIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICNSR0IsICNBUkdCLCAjUlJHR0JCIG9yICNBQVJSR0dCQi4iLAotICAgICAgICAgICAgICAgICJodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvcmVmZXJlbmNlL2F2YWlsYWJsZS1yZXNvdXJjZXMuaHRtbCNjb2xvcnZhbHMiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKE5BTUVfQVRUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYW5kYXRvcnkgbmFtZSB1c2VkIGluIHJlZmVycmluZyB0byB0aGlzIGNvbG9yLiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbG9yVmFsdWVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWFuZGF0b3J5IGNvbG9yIHZhbHVlLiIpCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBudWxsLCAgLy8gbm8gY2hpbGQgbm9kZXMKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBub3QgbWFuZGF0b3J5ICovKTsKLQotICAgICAgICAgRWxlbWVudERlc2NyaXB0b3Igc3RyaW5nX2VsZW1lbnQgPSBuZXcgRWxlbWVudERlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgInN0cmluZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiU3RyaW5nIiwgCi0gICAgICAgICAgICAgICAgIkBTdHJpbmdzQCwgd2l0aCBvcHRpb25hbCBzaW1wbGUgZm9ybWF0dGluZywgY2FuIGJlIHN0b3JlZCBhbmQgcmV0cmlldmVkIGFzIHJlc291cmNlcy4gWW91IGNhbiBhZGQgZm9ybWF0dGluZyB0byB5b3VyIHN0cmluZyBieSB1c2luZyB0aHJlZSBzdGFuZGFyZCBIVE1MIHRhZ3M6IGIsIGksIGFuZCB1LiBJZiB5b3UgdXNlIGFuIGFwb3N0cm9waGUgb3IgYSBxdW90ZSBpbiB5b3VyIHN0cmluZywgeW91IG11c3QgZWl0aGVyIGVzY2FwZSBpdCBvciBlbmNsb3NlIHRoZSB3aG9sZSBzdHJpbmcgaW4gdGhlIG90aGVyIGtpbmQgb2YgZW5jbG9zaW5nIHF1b3Rlcy4iLAotICAgICAgICAgICAgICAgICJodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvcmVmZXJlbmNlL2F2YWlsYWJsZS1yZXNvdXJjZXMuaHRtbCNzdHJpbmdyZXNvdXJjZXMiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKE5BTUVfQVRUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYW5kYXRvcnkgbmFtZSB1c2VkIGluIHJlZmVycmluZyB0byB0aGlzIHN0cmluZy4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0VmFsdWVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWFuZGF0b3J5IHN0cmluZyB2YWx1ZS4iKQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbnVsbCwgIC8vIG5vIGNoaWxkIG5vZGVzCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogbm90IG1hbmRhdG9yeSAqLyk7Ci0KLSAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGl0ZW1fZWxlbWVudCA9IG5ldyBJdGVtRWxlbWVudERlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICJpdGVtIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAiSXRlbSIsIAotICAgICAgICAgICAgICAgICBudWxsLCAgLy8gVE9ETyBmaW5kIGphdmFkb2MKLSAgICAgICAgICAgICAgICAgbnVsbCwgIC8vIFRPRE8gZmluZCBsaW5rIHRvIGphdmFkb2MKLSAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKE5BTUVfQVRUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG5zVXJpICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYW5kYXRvcnkgbmFtZSB1c2VkIGluIHJlZmVycmluZyB0byB0aGlzIHJlc291cmNlLiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0QXR0cmlidXRlRGVzY3JpcHRvcihUWVBFX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWFuZGF0b3J5IHR5cGUgb2YgdGhpcyByZXNvdXJjZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLmdldE5hbWVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbGFnQXR0cmlidXRlRGVzY3JpcHRvcigiZm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3B0aW9uYWwgZm9ybWF0IG9mIHRoaXMgcmVzb3VyY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iLCAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciIsICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGltZW5zaW9uIiwgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiwgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFjdGlvbiIsICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciIsICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSIsICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dFZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBzdGFuZGFyZCBzdHJpbmcsIGhleCBjb2xvciB2YWx1ZSwgb3IgcmVmZXJlbmNlIHRvIGFueSBvdGhlciByZXNvdXJjZSB0eXBlLiIpCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIG51bGwsICAvLyBubyBjaGlsZCBub2RlcwotICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub3QgbWFuZGF0b3J5ICovKTsKLQotICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZHJhd2FibGVfZWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAiZHJhd2FibGUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIkRyYXdhYmxlIiwgCi0gICAgICAgICAgICAgICAgIkEgQGRyYXdhYmxlQCBkZWZpbmVzIGEgcmVjdGFuZ2xlIG9mIGNvbG9yLiBBbmRyb2lkIGFjY2VwdHMgY29sb3IgdmFsdWVzIHdyaXR0ZW4gaW4gdmFyaW91cyB3ZWItc3R5bGUgZm9ybWF0cyAtLSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOiAjUkdCLCAjQVJHQiwgI1JSR0dCQiwgI0FBUlJHR0JCLiBaZXJvIGluIHRoZSBhbHBoYSBjaGFubmVsIG1lYW5zIHRyYW5zcGFyZW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcGFxdWUuIiwKLSAgICAgICAgICAgICAgICAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlZmVyZW5jZS9hdmFpbGFibGUtcmVzb3VyY2VzLmh0bWwjY29sb3JkcmF3YWJsZXJlc291cmNlcyIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IoTkFNRV9BVFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG5zVXJpICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG1hbmRhdG9yeSBuYW1lIHVzZWQgaW4gcmVmZXJyaW5nIHRvIHRoaXMgZHJhd2FibGUuIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dFZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIG1hbmRhdG9yeSBjb2xvciB2YWx1ZSBpbiB0aGUgZm9ybSAjUkdCLCAjQVJHQiwgI1JSR0dCQiBvciAjQUFSUkdHQkIuIikKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIG51bGwsICAvLyBubyBjaGlsZCBub2RlcwotICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vdCBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkaW1lbl9lbGVtZW50ID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICJkaW1lbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiRGltZW5zaW9uIiwgCi0gICAgICAgICAgICAgICAgIllvdSBjYW4gY3JlYXRlIGNvbW1vbiBkaW1lbnNpb25zIHRvIHVzZSBmb3IgdmFyaW91cyBzY3JlZW4gZWxlbWVudHMgYnkgZGVmaW5pbmcgQGRpbWVuc2lvbkAgdmFsdWVzIGluIFhNTC4gQSBkaW1lbnNpb24gcmVzb3VyY2UgaXMgYSBudW1iZXIgZm9sbG93ZWQgYnkgYSB1bml0IG9mIG1lYXN1cmVtZW50LiBTdXBwb3J0ZWQgdW5pdHMgYXJlIHB4IChwaXhlbHMpLCBpbiAoaW5jaGVzKSwgbW0gKG1pbGxpbWV0ZXJzKSwgcHQgKHBvaW50cyBhdCA3MiBEUEkpLCBkcCAoZGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMpIGFuZCBzcCAoc2NhbGUtaW5kZXBlbmRlbnQgcGl4ZWxzKSIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYW5kcm9pZC9yZWZlcmVuY2UvYXZhaWxhYmxlLXJlc291cmNlcy5odG1sI2RpbWVuc2lvbiIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IoTkFNRV9BVFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG5zVXJpICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG1hbmRhdG9yeSBuYW1lIHVzZWQgaW4gcmVmZXJyaW5nIHRvIHRoaXMgZGltZW5zaW9uLiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRWYWx1ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBtYW5kYXRvcnkgZGltZW5zaW9uIHZhbHVlIGlzIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IGEgdW5pdCBvZiBtZWFzdXJlbWVudC4gRm9yIGV4YW1wbGU6IDEwcHgsIDJpbiwgNXNwLiIpCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBudWxsLCAgLy8gbm8gY2hpbGQgbm9kZXMKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBub3QgbWFuZGF0b3J5ICovKTsKLQotICAgICAgICAgRWxlbWVudERlc2NyaXB0b3Igc3R5bGVfZWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAic3R5bGUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIlN0eWxlL1RoZW1lIiwgCi0gICAgICAgICAgICAgICAgIkJvdGggQHN0eWxlcyBhbmQgdGhlbWVzQCBhcmUgZGVmaW5lZCBpbiBhIHN0eWxlIGJsb2NrIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc3RyaW5nIG9yIG51bWVyaWNhbCB2YWx1ZXMgKHR5cGljYWxseSBjb2xvciB2YWx1ZXMpLCBvciByZWZlcmVuY2VzIHRvIG90aGVyIHJlc291cmNlcyAoZHJhd2FibGVzIGFuZCBzbyBvbikuIiwKLSAgICAgICAgICAgICAgICAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlZmVyZW5jZS9hdmFpbGFibGUtcmVzb3VyY2VzLmh0bWwjc3R5bGVzYW5kdGhlbWVzIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcihOQU1FX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbnNVcmkgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWFuZGF0b3J5IG5hbWUgdXNlZCBpbiByZWZlcnJpbmcgdG8gdGhpcyB0aGVtZS4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcigicGFyZW50IiwgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbnNVcmkgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbiBvcHRpb25hbCBwYXJlbnQgdGhlbWUuIEFsbCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHRoZW1lIHdpbGwgYmUgaW5oZXJpdGVkIGludG8gdGhpcyB0aGVtZS4gQW55IHZhbHVlcyB3aXRoIGlkZW50aWNhbCBuYW1lcyB0aGF0IHlvdSBzcGVjaWZ5IHdpbGwgb3ZlcnJpZGUgaW5oZXJpdGVkIHZhbHVlcy4iKSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW0iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAiSXRlbSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIkEgdmFsdWUgdG8gdXNlIGluIHRoaXMgQHRoZW1lQC4gSXQgY2FuIGJlIGEgc3RhbmRhcmQgc3RyaW5nLCBhIGhleCBjb2xvciB2YWx1ZSwgb3IgYSByZWZlcmVuY2UgdG8gYW55IG90aGVyIHJlc291cmNlIHR5cGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvcmVmZXJlbmNlL2F2YWlsYWJsZS1yZXNvdXJjZXMuaHRtbCNzdHlsZXNhbmR0aGVtZXMiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKE5BTUVfQVRUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYW5kYXRvcnkgbmFtZSB1c2VkIGluIHJlZmVycmluZyB0byB0aGlzIGl0ZW0uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRWYWx1ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBtYW5kYXRvcnkgc3RhbmRhcmQgc3RyaW5nLCBoZXggY29sb3IgdmFsdWUsIG9yIHJlZmVyZW5jZSB0byBhbnkgb3RoZXIgcmVzb3VyY2UgdHlwZS4iKQotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAvLyBubyBjaGlsZCBub2RlcwotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm90IG1hbmRhdG9yeSAqLykKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vdCBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBzdHJpbmdfYXJyYXlfZWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgInN0cmluZy1hcnJheSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIlN0cmluZyBBcnJheSIsCi0gICAgICAgICAgICAgICAgICJBbiBhcnJheSBvZiBzdHJpbmdzLiBTdHJpbmdzIGFyZSBhZGRlZCBhcyB1bmRlcmx5aW5nIGl0ZW0gZWxlbWVudHMgdG8gdGhlIGFycmF5LiIsCi0gICAgICAgICAgICAgICAgIG51bGwsIC8vIHRvb2x0aXBzCi0gICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcihOQU1FX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWFuZGF0b3J5IG5hbWUgdXNlZCBpbiByZWZlcnJpbmcgdG8gdGhpcyBzdHJpbmcgYXJyYXkuIiksCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAiSXRlbSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJBIHN0cmluZyB2YWx1ZSB0byB1c2UgaW4gdGhpcyBzdHJpbmcgYXJyYXkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyB0b29sdGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0VmFsdWVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBtYW5kYXRvcnkgc3RyaW5nLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgLy8gbm8gY2hpbGQgbm9kZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub3QgbWFuZGF0b3J5ICovKQotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub3QgbWFuZGF0b3J5ICovKTsKLQotICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgaW50ZWdlcl9hcnJheV9lbGVtZW50ID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAiaW50ZWdlci1hcnJheSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIkludGVnZXIgQXJyYXkiLAotICAgICAgICAgICAgICAgICAiQW4gYXJyYXkgb2YgaW50ZWdlcnMuIEludGVnZXJzIGFyZSBhZGRlZCBhcyB1bmRlcmx5aW5nIGl0ZW0gZWxlbWVudHMgdG8gdGhlIGFycmF5LiIsCi0gICAgICAgICAgICAgICAgIG51bGwsIC8vIHRvb2x0aXBzCi0gICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcihOQU1FX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBuc1VyaSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWFuZGF0b3J5IG5hbWUgdXNlZCBpbiByZWZlcnJpbmcgdG8gdGhpcyBpbnRlZ2VyIGFycmF5LiIpLAotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudERlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW0iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkl0ZW0iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQW4gaW50ZWdlciB2YWx1ZSB0byB1c2UgaW4gdGhpcyBpbnRlZ2VyIGFycmF5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gdG9vbHRpcAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dFZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWFuZGF0b3J5IGludGVnZXIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAvLyBubyBjaGlsZCBub2RlcwotICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vdCBtYW5kYXRvcnkgKi8pCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vdCBtYW5kYXRvcnkgKi8pOwotCi0gICAgICAgICBtUmVzb3VyY2VzRWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIFJPT1RfRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlZmVyZW5jZS9hdmFpbGFibGUtcmVzb3VyY2VzLmh0bWwiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgIC8vIG5vIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FycmF5X2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXJfYXJyYXlfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG1hbmRhdG9yeSAqLyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL3VpbW9kZWwvVWlDb2xvclZhbHVlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL3VpbW9kZWwvVWlDb2xvclZhbHVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg4ZTBiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy91aW1vZGVsL1VpQ29sb3JWYWx1ZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLnVpbW9kZWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0VmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpVGV4dFZhbHVlTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIERpc3BsYXlzIGFuZCBlZGl0cyBhIGNvbG9yIFhNTCBlbGVtZW50IHZhbHVlIHdpdGggYSBjdXN0b20gdmFsaWRhdG9yLgotICogPHAvPgotICogU2VlIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVWlDb2xvclZhbHVlTm9kZSBleHRlbmRzIFVpVGV4dFZhbHVlTm9kZSB7Ci0KLSAgICAvKiogQWNjZXB0ZWQgUkdCQSBmb3JtYXRzIGFyZSBvbmUgb2YgI1JHQiwgI0FSR0IsICNSUkdHQkIgb3IgI0FBUlJHR0JCLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkdCQV9SRUdFWFAgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiIyg/OlswLTlhLWZBLUZdezMsNH18WzAtOWEtZkEtRl17Nn18WzAtOWEtZkEtRl17OH0pIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgVWlDb2xvclZhbHVlTm9kZShUZXh0VmFsdWVEZXNjcmlwdG9yIGF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoYXR0cmlidXRlRGVzY3JpcHRvciwgdWlQYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogCi0gICAgICogQWRkIGEgbW9kaWZ5IGxpc3RlbmVyIHRoYXQgd2lsbCBjaGVjayBjb2xvcnMgaGF2ZSB0aGUgcHJvcGVyIGZvcm1hdCwKLSAgICAgKiB0aGF0IGlzIG9uZSBvZiAjUkdCLCAjQVJHQiwgI1JSR0dCQiBvciAjQUFSUkdHQkIuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BZGRWYWxpZGF0b3JzKGZpbmFsIFRleHQgdGV4dCkgewotICAgICAgICBNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb2xvciA9IHRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChSR0JBX1JFR0VYUC5tYXRjaGVyKGNvbG9yKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UodGV4dCwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UodGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXB0ZWQgY29sb3IgZm9ybWF0cyBhcmUgb25lIG9mICNSR0IsICNBUkdCLCAjUlJHR0JCIG9yICNBQVJSR0dCQi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogZGF0YSAqLywgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmFsaWRhdG9yIHJlbW92ZXMgaXRzIG1lc3NhZ2Uocykgd2hlbiB0aGUgd2lkZ2V0IGlzIGRpc3Bvc2VkCi0gICAgICAgIHRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlKHRleHQsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBGaW5hbGx5IGNhbGwgdGhlIHZhbGlkYXRvciBvbmNlIHRvIG1ha2Ugc3VyZSB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBwcm9jZXNzZWQKLSAgICAgICAgbGlzdGVuZXIubW9kaWZ5VGV4dChudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvdWltb2RlbC9VaUl0ZW1FbGVtZW50Tm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL3VpbW9kZWwvVWlJdGVtRWxlbWVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiMGY1OC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvdWltb2RlbC9VaUl0ZW1FbGVtZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmRlc2NyaXB0b3JzLkl0ZW1FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuZGVzY3JpcHRvcnMuUmVzb3VyY2VzRGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIHtAbGluayBVaUl0ZW1FbGVtZW50Tm9kZX0gaXMgYXBlY2lhbCB2ZXJzaW9uIG9mIHtAbGluayBVaUVsZW1lbnROb2RlfSB0aGF0IAotICogY3VzdG9taXplcyB0aGUgZWxlbWVudCBkaXNwbGF5IHRvIGluY2x1ZGUgdGhlIGl0ZW0gdHlwZSBhdHRyaWJ1dGUgaWYgcHJlc2VudC4KLSAqLwotcHVibGljIGNsYXNzIFVpSXRlbUVsZW1lbnROb2RlIGV4dGVuZHMgVWlFbGVtZW50Tm9kZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVaUVsZW1lbnROb2RlfSBkZXNjcmliZWQgYnkgYSBnaXZlbiB7QGxpbmsgSXRlbUVsZW1lbnREZXNjcmlwdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudERlc2NyaXB0b3IgVGhlIHtAbGluayBJdGVtRWxlbWVudERlc2NyaXB0b3J9IGZvciB0aGUgWE1MIG5vZGUuIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBVaUl0ZW1FbGVtZW50Tm9kZShJdGVtRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IpIHsKLSAgICAgICAgc3VwZXIoZWxlbWVudERlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgTm9kZSB4bWxOb2RlID0gZ2V0WG1sTm9kZSgpOwotICAgICAgICBpZiAoeG1sTm9kZSAhPSBudWxsICYmIHhtbE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHhtbE5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbSA9IChFbGVtZW50KSB4bWxOb2RlOwotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShSZXNvdXJjZXNEZXNjcmlwdG9ycy5UWVBFX0FUVFIpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShSZXNvdXJjZXNEZXNjcmlwdG9ycy5OQU1FX0FUVFIpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgdHlwZS5sZW5ndGgoKSA+IDAgJiYgbmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gRGVzY3JpcHRvcnNVdGlscy5jYXBpdGFsaXplKHR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzICglMiRzICUzJHMpIiwgbmFtZSwgdHlwZSwgZ2V0RGVzY3JpcHRvcigpLmdldFVpTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvRWRpdGFibGVEaWFsb2dDZWxsRWRpdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9FZGl0YWJsZURpYWxvZ0NlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2MDBmNy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9FZGl0YWJsZURpYWxvZ0NlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogQ3VzdG9tIERpYWxvZ0NlbGxFZGl0b3IsIHJlcGxhY2luZyB0aGUgTGFiZWwgd2l0aCBhbiBlZGl0YWJsZSB7QGxpbmsgVGV4dH0gd2lkZ2V0LgotICogPHAvPkFsc28gc2V0IHRoZSBidXR0b24gdG8ge0BsaW5rIFNXVCNGTEFUfSB0byBtYWtlIHN1cmUgaXQgbG9va3MgZ29vZCBvbiBNYWNPUyBYLgotICogPHAvPk1vc3Qgb2YgdGhlIGNvZGUgY29tZXMgZnJvbSBUZXh0Q2VsbEVkaXRvci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVkaXRhYmxlRGlhbG9nQ2VsbEVkaXRvciBleHRlbmRzIERpYWxvZ0NlbGxFZGl0b3IgewotICAgIAotICAgIHByaXZhdGUgVGV4dCB0ZXh0OyAKLSAgICAKLSAgICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogU3RhdGUgaW5mb3JtYXRpb24gZm9yIHVwZGF0aW5nIGFjdGlvbiBlbmFibGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0aW9uID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWxldGVhYmxlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RhYmxlID0gZmFsc2U7Ci0gICAgCi0gICAgRWRpdGFibGVEaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCBvbmx5IHRvIHByb3Blcmx5IHNldCB0aGUgc3R5bGUgaW4gdGhlIGJ1dHRvbiwgb3IgaXQgd29uJ3QgbG9vawotICAgICAqIGdvb2QgaW4gTWFjT1MgWAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHJlc3VsdCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuRE9XTiB8IFNXVC5GTEFUKTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoIi4uLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNlbGwpIHsKLSAgICAgICAgdGV4dCA9IG5ldyBUZXh0KGNlbGwsIFNXVC5TSU5HTEUpOwotICAgICAgICB0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgLy8gaG9vayBrZXkgcHJlc3NlZCAtIHNlZSBQUiAxNDIwMSAgCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGtleVJlbGVhc2VPY2N1cmVkKGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgYWJvdmUgY2FsbCwgY2xpZW50cyBtYXkgaGF2ZQotICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2VkIHRoaXMgY2VsbCBlZGl0b3IKLSAgICAgICAgICAgICAgICBpZiAoKGdldENvbnRyb2woKSA9PSBudWxsKSB8fCBnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsgLy8gc2VlIGV4cGxhbmF0aW9uIGJlbG93Ci0gICAgICAgICAgICAgICAgY2hlY2tEZWxldGVhYmxlKCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tTZWxlY3RhYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gV2UgcmVhbGx5IHdhbnQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgYnV0IGl0IGlzIG5vdCBzdXBwb3J0ZWQgc28gd2UKLSAgICAgICAgLy8gdXNlIGEga2V5IGxpc3RlbmVyIGFuZCBhIG1vdXNlIGxpc3RlbmVyIHRvIGtub3cgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAvLyBtYXkgaGF2ZSBvY2N1cnJlZAotICAgICAgICB0ZXh0LmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNoZWNrRGVsZXRlYWJsZSgpOwotICAgICAgICAgICAgICAgIGNoZWNrU2VsZWN0YWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZURpYWxvZ0NlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRleHQuc2V0Rm9udChjZWxsLmdldEZvbnQoKSk7Ci0gICAgICAgIHRleHQuc2V0QmFja2dyb3VuZChjZWxsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeUxpc3RlbmVyKCkpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlICJkZWxldGFibGUiIHN0YXRlIChjYW4gZGVsZXRlLwotICAgICAqIG5vdGhpbmcgdG8gZGVsZXRlKSBoYXMgY2hhbmdlZCBhbmQgaWYgc28gZmlyZSBhbgotICAgICAqIGVuYWJsZW1lbnQgY2hhbmdlZCBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGVsZXRlYWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRJc0RlbGV0ZWFibGUgPSBpc0RlbGV0ZWFibGU7Ci0gICAgICAgIGlzRGVsZXRlYWJsZSA9IGlzRGVsZXRlRW5hYmxlZCgpOwotICAgICAgICBpZiAob2xkSXNEZWxldGVhYmxlICE9IGlzRGVsZXRlYWJsZSkgewotICAgICAgICAgICAgZmlyZUVuYWJsZW1lbnRDaGFuZ2VkKERFTEVURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSAic2VsZWN0YWJsZSIgc3RhdGUgKGNhbiBzZWxlY3QpCi0gICAgICogaGFzIGNoYW5nZWQgYW5kIGlmIHNvIGZpcmUgYW4gZW5hYmxlbWVudCBjaGFuZ2VkIG5vdGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3RhYmxlKCkgewotICAgICAgICBib29sZWFuIG9sZElzU2VsZWN0YWJsZSA9IGlzU2VsZWN0YWJsZTsKLSAgICAgICAgaXNTZWxlY3RhYmxlID0gaXNTZWxlY3RBbGxFbmFibGVkKCk7Ci0gICAgICAgIGlmIChvbGRJc1NlbGVjdGFibGUgIT0gaXNTZWxlY3RhYmxlKSB7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoU0VMRUNUX0FMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBzZWxlY3Rpb24gc3RhdGUgKHNlbGVjdGlvbiAvCi0gICAgICogbm8gc2VsZWN0aW9uKSBoYXMgY2hhbmdlZCBhbmQgaWYgc28gZmlyZSBhbgotICAgICAqIGVuYWJsZW1lbnQgY2hhbmdlZCBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2VsZWN0aW9uKCkgewotICAgICAgICBib29sZWFuIG9sZElzU2VsZWN0aW9uID0gaXNTZWxlY3Rpb247Ci0gICAgICAgIGlzU2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMDsKLSAgICAgICAgaWYgKG9sZElzU2VsZWN0aW9uICE9IGlzU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoQ09QWSk7Ci0gICAgICAgICAgICBmaXJlRW5hYmxlbWVudENoYW5nZWQoQ1VUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldEZvY3VzKCkgewotICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0LnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGNoZWNrRGVsZXRlYWJsZSgpOwotICAgICAgICAgICAgY2hlY2tTZWxlY3RhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGlhbG9nQ2VsbEVkaXRvciN1cGRhdGVDb250ZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnRzKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKHRleHQgIT0gbnVsbCAmJiAodmFsdWUgPT0gbnVsbCB8fCAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeUxpc3RlbmVyKCkpOwotICAgICAgICAgICAgdGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0TW9kaWZ5TGlzdGVuZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHRoaXMgPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zCi0gICAgICogdGhlIHRleHQgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGV4dCBzdHJpbmcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG1vZGlmeSBldmVudCB0aGF0IG9jY3VycmVkIGluIHRoaXMgdGV4dCBjZWxsIGVkaXRvci4KLSAgICAgKiBUaGlzIGZyYW1ld29yayBtZXRob2QgcGVyZm9ybXMgdmFsaWRhdGlvbiBhbmQgc2V0cyB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqIGFjY29yZGluZ2x5LCBhbmQgdGhlbiByZXBvcnRzIGEgY2hhbmdlIHZpYSA8Y29kZT5maXJlRWRpdG9yVmFsdWVDaGFuZ2VkPC9jb2RlPi4KLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGF0IGFwcHJvcHJpYXRlIHRpbWVzLiBTdWJjbGFzc2VzCi0gICAgICogbWF5IGV4dGVuZCBvciByZWltcGxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSBTV1QgbW9kaWZ5IGV2ZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZWRpdE9jY3VyZWQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0LmdldFRleHQoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIiI7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB0eXBlZFZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSA9IGlzVmFsdWVWYWxpZCgpOwotICAgICAgICBib29sZWFuIG5ld1ZhbGlkU3RhdGUgPSBpc0NvcnJlY3QodHlwZWRWYWx1ZSk7Ci0KLSAgICAgICAgaWYgKCFuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZUNoYW5nZWQob2xkVmFsaWRTdGF0ZSwgbmV3VmFsaWRTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBtb2RpZnkgbGlzdGVuZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBnZXRNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKG1vZGlmeUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBlZGl0T2NjdXJlZChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RpZnlMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgZGVmYXVsdCBzZWxlY3Rpb24gZXZlbnQgZnJvbSB0aGUgdGV4dCBjb250cm9sIGJ5IGFwcGx5aW5nIHRoZSBlZGl0b3IKLSAgICAgKiB2YWx1ZSBhbmQgZGVhY3RpdmF0aW5nIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbihTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAvLyBzYW1lIHdpdGggZW50ZXIta2V5IGhhbmRsaW5nIGNvZGUgaW4ga2V5UmVsZWFzZU9jY3VyZWQoZSk7Ci0gICAgICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+ICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIAotICAgICAqIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBub3QgZW1wdHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb3B5RW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gICAgICogPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgCi0gICAgICogdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG5vdCBlbXB0eS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0N1dEVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+ICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gb3IgaWYgdGhlIGNhcmV0IGlzIG5vdCBwb3NpdGlvbmVkIAotICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVFbmFibGVkKCkgewotICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDAKLSAgICAgICAgICAgICAgICB8fCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA8IHRleHQuZ2V0Q2hhckNvdW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXN0ZUVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBzYXZlIGFsbCBpcyBlbmFibGVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFsbEVuYWJsZWQoKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2VsbCBlZGl0b3IgaXMKLSAgICAgKiBhYmxlIHRvIHBlcmZvcm0gdGhlIHNlbGVjdCBhbGwgYWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyAKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0gICAgICogPC9wPgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2VsZWN0IGFsbCBpcyBwb3NzaWJsZSwKLSAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0QWxsRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0LmdldENoYXJDb3VudCgpID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBrZXkgcmVsZWFzZSBldmVudCB0aGF0IG9jY3VycmVkIGluIHRoaXMgY2VsbCBlZGl0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgCi0gICAgICogaWdub3JlcyB3aGVuIHRoZSBSRVRVUk4ga2V5IGlzIHByZXNzZWQgc2luY2UgdGhpcyBpcyBoYW5kbGVkIGluIAotICAgICAqIDxjb2RlPmhhbmRsZURlZmF1bHRTZWxlY3Rpb248L2NvZGU+LgotICAgICAqIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciBDdHJsK0VudGVyIGZvciBtdWx0aS1saW5lIHRleHRzLCBzaW5jZQotICAgICAqIGEgZGVmYXVsdCBzZWxlY3Rpb24gZXZlbnQgaXMgbm90IHNlbnQgaW4gdGhpcyBjYXNlLiAKLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5RXZlbnQgdGhlIGtleSBldmVudAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGtleVJlbGVhc2VPY2N1cmVkKEtleUV2ZW50IGtleUV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlFdmVudC5jaGFyYWN0ZXIgPT0gJ1xyJykgeyAvLyBSZXR1cm4ga2V5Ci0gICAgICAgICAgICAvLyBFbnRlciBpcyBoYW5kbGVkIGluIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24uCi0gICAgICAgICAgICAvLyBEbyBub3QgYXBwbHkgdGhlIGVkaXRvciB2YWx1ZSBpbiByZXNwb25zZSB0byBhbiBFbnRlciBrZXkgZXZlbnQKLSAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgY2FuIGJlIHJlY2VpdmVkIGZyb20gdGhlIElNRSB3aGVuIHRoZSBpbnRlbnQgaXMgLW5vdC0KLSAgICAgICAgICAgIC8vIHRvIGFwcGx5IHRoZSB2YWx1ZS4gIAotICAgICAgICAgICAgLy8gU2VlIGJ1ZyAzOTA3NCBbQ2VsbEVkaXRvcnNdIFtEQkNTXSBjYW5uYSBpbnB1dCBtb2RlIGZpcmVzIGJvZ3VzIGV2ZW50IGZyb20gVGV4dCBDb250cm9sCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIG1hZGUgZm9yIEN0cmwrRW50ZXIgZm9yIG11bHRpLWxpbmUgdGV4dHMsIHNpbmNlCi0gICAgICAgICAgICAvLyBhIGRlZmF1bHQgc2VsZWN0aW9uIGV2ZW50IGlzIG5vdCBzZW50IGluIHRoaXMgY2FzZS4gCi0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKQotICAgICAgICAgICAgICAgICAgICAmJiAodGV4dC5nZXRTdHlsZSgpICYgU1dULk1VTFRJKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChrZXlFdmVudC5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5rZXlSZWxlYXNlT2NjdXJlZChrZXlFdmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmtleVJlbGVhc2VPY2N1cmVkKGtleUV2ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgY29waWVzIHRoZQotICAgICAqIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1Db3B5KCkgewotICAgICAgICB0ZXh0LmNvcHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2QgY3V0cyB0aGUKLSAgICAgKiBjdXJyZW50IHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkLiAKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQ3V0KCkgewotICAgICAgICB0ZXh0LmN1dCgpOwotICAgICAgICBjaGVja1NlbGVjdGlvbigpOwotICAgICAgICBjaGVja0RlbGV0ZWFibGUoKTsKLSAgICAgICAgY2hlY2tTZWxlY3RhYmxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlRleHRDZWxsRWRpdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogPGNvZGU+Q2VsbEVkaXRvcjwvY29kZT4gbWV0aG9kIGRlbGV0ZXMgdGhlCi0gICAgICogY3VycmVudCBzZWxlY3Rpb24gb3IsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiwKLSAgICAgKiB0aGUgY2hhcmFjdGVyIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0gICAgICAgIGlmICh0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAgICAgICAgdGV4dC5pbnNlcnQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIG5leHQgY2hhcmFjdGVyCi0gICAgICAgICAgICBpbnQgcG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5nZXRDaGFyQ291bnQoKSkgewotICAgICAgICAgICAgICAgIHRleHQuc2V0U2VsZWN0aW9uKHBvcywgcG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgdGV4dC5pbnNlcnQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tTZWxlY3Rpb24oKTsKLSAgICAgICAgY2hlY2tEZWxldGVhYmxlKCk7Ci0gICAgICAgIGNoZWNrU2VsZWN0YWJsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5UZXh0Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICAgICAqIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IG1ldGhvZCBwYXN0ZXMgdGhlCi0gICAgICogdGhlIGNsaXBib2FyZCBjb250ZW50cyBvdmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybVBhc3RlKCkgewotICAgICAgICB0ZXh0LnBhc3RlKCk7Ci0gICAgICAgIGNoZWNrU2VsZWN0aW9uKCk7Ci0gICAgICAgIGNoZWNrRGVsZXRlYWJsZSgpOwotICAgICAgICBjaGVja1NlbGVjdGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VGV4dENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBtZXRob2Qgc2VsZWN0cyBhbGwgb2YgdGhlCi0gICAgICogY3VycmVudCB0ZXh0LiAKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtU2VsZWN0QWxsKCkgewotICAgICAgICB0ZXh0LnNlbGVjdEFsbCgpOwotICAgICAgICBjaGVja1NlbGVjdGlvbigpOwotICAgICAgICBjaGVja0RlbGV0ZWFibGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9FcnJvckltYWdlQ29tcG9zaXRlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9FcnJvckltYWdlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGNmOTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvRXJyb3JJbWFnZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW9uT3ZlcmxheUljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbWFnZURlc2NyaXB0b3IgdGhhdCBhZGRzIGEgZXJyb3IgbWFya2VyLgotICogQmFzZWQgb24ge0BsaW5rIERlY29yYXRpb25PdmVybGF5SWNvbn0gb25seSBhdmFpbGFibGUgaW4gRWNsaXBzZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySW1hZ2VDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBJbWFnZSBtQmFzZUltYWdlOwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIG1FcnJvckltYWdlRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIFBvaW50IG1TaXplOwotCi0gICAgcHVibGljIEVycm9ySW1hZ2VDb21wb3NpdGUoSW1hZ2UgYmFzZUltYWdlKSB7Ci0gICAgICAgIG1CYXNlSW1hZ2UgPSBiYXNlSW1hZ2U7Ci0gICAgICAgIG1FcnJvckltYWdlRGVzY3JpcHRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLSAgICAgICAgbVNpemUgPSBuZXcgUG9pbnQoYmFzZUltYWdlLmdldEJvdW5kcygpLndpZHRoLCBiYXNlSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBJbWFnZURhdGEgYmFzZURhdGEgPSBtQmFzZUltYWdlLmdldEltYWdlRGF0YSgpOwotICAgICAgICBkcmF3SW1hZ2UoYmFzZURhdGEsIDAsIDApOwotCi0gICAgICAgIEltYWdlRGF0YSBvdmVybGF5RGF0YSA9IG1FcnJvckltYWdlRGVzY3JpcHRvci5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgaWYgKG92ZXJsYXlEYXRhLndpZHRoID09IGJhc2VEYXRhLndpZHRoICYmIGJhc2VEYXRhLmhlaWdodCA9PSBiYXNlRGF0YS5oZWlnaHQpIHsKLSAgICAgICAgICAgIG92ZXJsYXlEYXRhID0gb3ZlcmxheURhdGEuc2NhbGVkVG8oMTQsIDE0KTsKLSAgICAgICAgICAgIGRyYXdJbWFnZShvdmVybGF5RGF0YSwgLTMsIG1TaXplLnkgLSBvdmVybGF5RGF0YS5oZWlnaHQgKyAzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRyYXdJbWFnZShvdmVybGF5RGF0YSwgMCwgbVNpemUueSAtIG92ZXJsYXlEYXRhLmhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaXplOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL0ZsYWdWYWx1ZUNlbGxFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL0ZsYWdWYWx1ZUNlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExYmMzNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9GbGFnVmFsdWVDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUZsYWdBdHRyaWJ1dGVOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogRGlhbG9nQ2VsbEVkaXRvciBhYmxlIHRvIHJlY2VpdmUgYSB7QGxpbmsgVWlGbGFnQXR0cmlidXRlTm9kZX0gaW4gdGhlIHtAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIDxwLz5UaGUgZGlhbG9nIGJveCBvcGVuZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBpbiB0aGUgdWkgY3JlYXRlZCBieQotICoge0BsaW5rIFVpRmxhZ0F0dHJpYnV0ZU5vZGUjY3JlYXRlVWlDb250cm9sKENvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKX0KLSAqLwotcHVibGljIGNsYXNzIEZsYWdWYWx1ZUNlbGxFZGl0b3IgZXh0ZW5kcyBFZGl0YWJsZURpYWxvZ0NlbGxFZGl0b3IgewotICAgIAotICAgIHByaXZhdGUgVWlGbGFnQXR0cmlidXRlTm9kZSBtVWlGbGFnQXR0cmlidXRlOwotCi0gICAgcHVibGljIEZsYWdWYWx1ZUNlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KSB7Ci0gICAgICAgIGlmIChtVWlGbGFnQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWUgPSAoU3RyaW5nKWdldFZhbHVlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVVpRmxhZ0F0dHJpYnV0ZS5zaG93RGlhbG9nKGNlbGxFZGl0b3JXaW5kb3cuZ2V0U2hlbGwoKSwgY3VycmVudFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpRmxhZ0F0dHJpYnV0ZU5vZGUpIHsKLSAgICAgICAgICAgIG1VaUZsYWdBdHRyaWJ1dGUgPSAoVWlGbGFnQXR0cmlidXRlTm9kZSl2YWx1ZTsKLSAgICAgICAgICAgIHN1cGVyLmRvU2V0VmFsdWUobVVpRmxhZ0F0dHJpYnV0ZS5nZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN1cGVyLmRvU2V0VmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL0xpc3RWYWx1ZUNlbGxFZGl0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL0xpc3RWYWx1ZUNlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3ODBhOC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9MaXN0VmFsdWVDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUxpc3RBdHRyaWJ1dGVOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb21ib0JveENlbGxFZGl0b3IgYWJsZSB0byByZWNlaXZlIGEge0BsaW5rIFVpTGlzdEF0dHJpYnV0ZU5vZGV9IGluIHRoZSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9Ci0gKiBtZXRob2QsIGFuZCByZXR1cm5pbmcgYSB7QGxpbmsgU3RyaW5nfSBpbiB7QGxpbmsgI2dldFZhbHVlKCl9IGluc3RlYWQgb2YgYW4ge0BsaW5rIEludGVnZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgTGlzdFZhbHVlQ2VsbEVkaXRvciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtSXRlbXM7Ci0gICAgcHJpdmF0ZSBDQ29tYm8gbUNvbWJvOwotICAgIAotICAgIHB1YmxpYyBMaXN0VmFsdWVDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBuZXcgU3RyaW5nWzBdLCBTV1QuRFJPUF9ET1dOKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1Db21ibyA9IChDQ29tYm8pIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgcmV0dXJuIG1Db21ibzsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWlMaXN0QXR0cmlidXRlTm9kZSkgewotICAgICAgICAgICAgVWlMaXN0QXR0cmlidXRlTm9kZSB1aUxpc3RBdHRyaWJ1dGUgPSAoVWlMaXN0QXR0cmlidXRlTm9kZSl2YWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gc2V0IHRoZSBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIGNvbWJvCi0gICAgICAgICAgICBTdHJpbmdbXSBpdGVtcyA9IHVpTGlzdEF0dHJpYnV0ZS5nZXRQb3NzaWJsZVZhbHVlcyhudWxsKTsKLSAgICAgICAgICAgIG1JdGVtcyA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaXRlbXMsIDAsIG1JdGVtcywgMCwgaXRlbXMubGVuZ3RoKTsKLSAgICAgICAgICAgIHNldEl0ZW1zKG1JdGVtcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vdyBlZGl0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSB1aUxpc3RBdHRyaWJ1dGUuZ2V0Q3VycmVudFZhbHVlKCk7Ci0gICAgICAgICAgICBtQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IKLSAgICAgICAgc3VwZXIuZG9TZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgICAgU3RyaW5nIGNvbWJvVGV4dCA9IG1Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChjb21ib1RleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbWJvVGV4dDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL1Jlc291cmNlVmFsdWVDZWxsRWRpdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9SZXNvdXJjZVZhbHVlQ2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZlMjk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL1Jlc291cmNlVmFsdWVDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUZsYWdBdHRyaWJ1dGVOb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlSZXNvdXJjZUF0dHJpYnV0ZU5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBEaWFsb2dDZWxsRWRpdG9yIGFibGUgdG8gcmVjZWl2ZSBhIHtAbGluayBVaUZsYWdBdHRyaWJ1dGVOb2RlfSBpbiB0aGUge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogbWV0aG9kLgotICogPHAvPlRoZSBkaWFsb2cgYm94IG9wZW5lZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGluIHRoZSB1aSBjcmVhdGVkIGJ5Ci0gKiB7QGxpbmsgVWlGbGFnQXR0cmlidXRlTm9kZSNjcmVhdGVVaUNvbnRyb2woQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pfQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VWYWx1ZUNlbGxFZGl0b3IgZXh0ZW5kcyBFZGl0YWJsZURpYWxvZ0NlbGxFZGl0b3IgewotCi0gICAgcHJpdmF0ZSBVaVJlc291cmNlQXR0cmlidXRlTm9kZSBtVWlSZXNvdXJjZUF0dHJpYnV0ZTsKLQotICAgIHB1YmxpYyBSZXNvdXJjZVZhbHVlQ2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBvcGVuRGlhbG9nQm94KENvbnRyb2wgY2VsbEVkaXRvcldpbmRvdykgewotICAgICAgICBpZiAobVVpUmVzb3VyY2VBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiBtVWlSZXNvdXJjZUF0dHJpYnV0ZS5zaG93RGlhbG9nKGNlbGxFZGl0b3JXaW5kb3cuZ2V0U2hlbGwoKSwgY3VycmVudFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlKSB7Ci0gICAgICAgICAgICBtVWlSZXNvdXJjZUF0dHJpYnV0ZSA9IChVaVJlc291cmNlQXR0cmlidXRlTm9kZSl2YWx1ZTsKLSAgICAgICAgICAgIHN1cGVyLmRvU2V0VmFsdWUobVVpUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0Q3VycmVudFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdXBlci5kb1NldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9TZWN0aW9uSGVscGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9TZWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzIxZTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvU2VjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuU2VjdGlvblBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogSGVscGVyIGZvciB0aGUgQW5kcm9pZE1hbmlmZXN0IGZvcm0gZWRpdG9yLgotICogCi0gKiBIZWxwcyBjcmVhdGUgYSBuZXcgU2VjdGlvblBhcnQgd2l0aCBzZW5zaWJsZSBkZWZhdWx0IHBhcmFtZXRlcnMsCi0gKiBjcmVhdGUgZGVmYXVsdCBsYXlvdXQgb3IgYWRkIHR5cGljYWwgd2lkZ2V0cy4KLSAqIAotICogSU1QT1JUQU5UOiBUaGlzIGlzIE5PVCBhIGdlbmVyaWMgY2xhc3MuIEl0IG1ha2VzIGEgbG90IG9mIGFzc3VtcHRpb25zIG9uIHRoZQotICogVUkgYXMgdXNlZCBieSB0aGUgZm9ybSBlZGl0b3IgZm9yIHRoZSBBbmRyb2lkTWFuaWZlc3QuCi0gKiAKLSAqIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhIGNvbW1vbiBwYWNrYWdlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VjdGlvbkhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGNsYXNzIHRoYXQgZGVyaXZlcyBmcm9tIFNlY3Rpb25QYXJ0LCBjb25zdHJ1Y3RzIHRoZSBTZWN0aW9uIHdpdGgKLSAgICAgKiBzZW5zaWJsZSBkZWZhdWx0cyAod2l0aCBhIHRpdGxlIGFuZCBhIGRlc2NyaXB0aW9uKSBhbmQgcHJvdmlkZSBzb21lIHNob3J0aGFuZAotICAgICAqIG1ldGhvZHMgZm9yIGNyZWF0aW5nIHR5cGljYWxseSBVSSAobGFiZWwgYW5kIHRleHQsIGZvcm0gdGV4dC4pCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBNYW5pZmVzdFNlY3Rpb25QYXJ0IGV4dGVuZHMgU2VjdGlvblBhcnQgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3QgYSBTZWN0aW9uUGFydCB0aGF0IHVzZXMgYSB0aXRsZSBiYXIgYW5kIGEgZGVzY3JpcHRpb24uCi0gICAgICAgICAqIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBjYWxsIHNldFRleHQoKSBhbmQgc2V0RGVzY3JpcHRpb24oKS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGUgc2VjdGlvbiBzdHlsZSBpbmNsdWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBhIHRpdGxlIGJhciBieSBkZWZhdWx0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGJvZHkgVGhlIHBhcmVudCAoZS5nLiBGb3JtUGFnZSBib2R5KQotICAgICAgICAgKiBAcGFyYW0gdG9vbGtpdCBGb3JtIFRvb2xraXQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNYW5pZmVzdFNlY3Rpb25QYXJ0KENvbXBvc2l0ZSBib2R5LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0gICAgICAgICAgICB0aGlzKGJvZHksIHRvb2xraXQsIDAsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3QgYSBTZWN0aW9uUGFydCB0aGF0IHVzZXMgYSB0aXRsZSBiYXIgYW5kIGEgZGVzY3JpcHRpb24uCi0gICAgICAgICAqIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBjYWxsIHNldFRleHQoKSBhbmQgc2V0RGVzY3JpcHRpb24oKS4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGUgc2VjdGlvbiBzdHlsZSBpbmNsdWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBhIHRpdGxlIGJhciBieSBkZWZhdWx0LgotICAgICAgICAgKiBZb3UgY2FuIGFkZCBleHRyYSBzdHlsZXMsIGxpa2UgU2VjdGlvbi5UV0lTVElFLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGJvZHkgVGhlIHBhcmVudCAoZS5nLiBGb3JtUGFnZSBib2R5KS4KLSAgICAgICAgICogQHBhcmFtIHRvb2xraXQgRm9ybSBUb29sa2l0LgotICAgICAgICAgKiBAcGFyYW0gZXh0cmFfc3R5bGUgRXh0cmEgc3R5bGVzIChvbiB0b3Agb2YgZGVzY3JpcHRpb24gYW5kIHRpdGxlIGJhcikuCi0gICAgICAgICAqIEBwYXJhbSB1c2VfZGVzY3JpcHRpb24gVHJ1ZSBpZiB0aGUgU2VjdGlvbi5ERVNDUklQVElPTiBzdHlsZSBzaG91bGQgYmUgYWRkZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWFuaWZlc3RTZWN0aW9uUGFydChDb21wb3NpdGUgYm9keSwgRm9ybVRvb2xraXQgdG9vbGtpdCwKLSAgICAgICAgICAgICAgICBpbnQgZXh0cmFfc3R5bGUsIGJvb2xlYW4gdXNlX2Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICBzdXBlcihib2R5LCB0b29sa2l0LCBleHRyYV9zdHlsZSB8Ci0gICAgICAgICAgICAgICAgICAgIFNlY3Rpb24uVElUTEVfQkFSIHwKLSAgICAgICAgICAgICAgICAgICAgKHVzZV9kZXNjcmlwdGlvbiA/IFNlY3Rpb24uREVTQ1JJUFRJT04gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgbm9uLXN0YXRpYyBtZXRob2RzIG9mIGhlbHBlcnMganVzdCBmb3IgY29udmVuaWVuY2UKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBvc2l0ZSB3aXRoIGEgVGFibGVXcmFwTGF5b3V0IHNldCB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiB0aGUgcGFyZW50IGNvbXBvc2l0ZSBpcyBhIFNlY3Rpb24sIHRoZSBuZXcgY29tcG9zaXRlIGlzIHNldCBhcyBhIGNsaWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB0b29sa2l0IEZvcm0gVG9vbGtpdAotICAgICAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyBEZXNpcmVkIG51bWJlciBvZiBjb2x1bW5zLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY29tcG9zaXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVUYWJsZUxheW91dChGb3JtVG9vbGtpdCB0b29sa2l0LCBpbnQgbnVtQ29sdW1ucykgewotICAgICAgICAgICAgcmV0dXJuIFNlY3Rpb25IZWxwZXIuY3JlYXRlVGFibGVMYXlvdXQoZ2V0U2VjdGlvbigpLCB0b29sa2l0LCBudW1Db2x1bW5zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbGFiZWwgd2lkZ2V0LgotICAgICAgICAgKiBJZiB0aGUgcGFyZW50IGxheW91dCBpZiBhIFRhYmxlV3JhcExheW91dCwgbWF4aW1pemUgaXQgdG8gc3BhbiBvdmVyIGFsbCBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IChlLmcuIGNvbXBvc2l0ZSBmcm9tIENyZWF0ZVRhYmxlTGF5b3V0KCkpCi0gICAgICAgICAqIEBwYXJhbSB0b29sa2l0IEZvcm0gVG9vbGtpdAotICAgICAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIHN0cmluZyBmb3IgdGhlIGxhYmVsLgotICAgICAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwIGZvciB0aGUgbGFiZWwgYW5kIHRleHQuIENhbiBiZSBudWxsLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY3JlYXRlZCBsYWJlbCAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXApIHsKLSAgICAgICAgICAgIHJldHVybiBTZWN0aW9uSGVscGVyLmNyZWF0ZUxhYmVsKHBhcmVudCwgdG9vbGtpdCwgbGFiZWwsIHRvb2x0aXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgdHdvIHdpZGdldHM6IGEgbGFiZWwgYW5kIGEgdGV4dCBmaWVsZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRoaXMgZXhwZWN0cyB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBoYXZlIGEgVGFibGVXcmFwTGF5b3V0IHdpdGggMiBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IChlLmcuIGNvbXBvc2l0ZSBmcm9tIENyZWF0ZVRhYmxlTGF5b3V0KCkpCi0gICAgICAgICAqIEBwYXJhbSB0b29sa2l0IEZvcm0gVG9vbGtpdAotICAgICAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIHN0cmluZyBmb3IgdGhlIGxhYmVsLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQuIENhbiBiZSBudWxsLgotICAgICAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwIGZvciB0aGUgbGFiZWwgYW5kIHRleHQuIENhbiBiZSBudWxsLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY3JlYXRlZCBUZXh0IGZpZWxkICh0aGUgbGFiZWwgaXMgbm90IHJldHVybmVkKSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUZXh0IGNyZWF0ZUxhYmVsQW5kVGV4dChDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICAgICAgcmV0dXJuIFNlY3Rpb25IZWxwZXIuY3JlYXRlTGFiZWxBbmRUZXh0KHBhcmVudCwgdG9vbGtpdCwgbGFiZWwsIHZhbHVlLCB0b29sdGlwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgRm9ybVRleHQgd2lkZ2V0LgotICAgICAgICAgKiAKLSAgICAgICAgICogVGhpcyBleHBlY3RzIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGhhdmUgYSBUYWJsZVdyYXBMYXlvdXQgd2l0aCAyIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgKGUuZy4gY29tcG9zaXRlIGZyb20gQ3JlYXRlVGFibGVMYXlvdXQoKSkKLSAgICAgICAgICogQHBhcmFtIHRvb2xraXQgRm9ybSBUb29sa2l0Ci0gICAgICAgICAqIEBwYXJhbSBpc0h0bWwgVHJ1ZSBpZiB0aGUgZm9ybSB0ZXh0IHdpbGwgY29udGFpbiBIVE1MIHRoYXQgbXVzdCBiZSBpbnRlcnByZXRlZCBhcwotICAgICAgICAgKiAgICAgICAgICAgICAgIHJpY2ggdGV4dCAoaS5lLiBwYXJzZSB0YWdzICYgZXhwYW5kIFVSTHMpLgotICAgICAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIHN0cmluZyBmb3IgdGhlIGxhYmVsLgotICAgICAgICAgKiBAcGFyYW0gc2V0dXBMYXlvdXREYXRhIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjcmVhdGVkIGZvcm0gdGV4dCByZWNlaXZlcyBhIFRhYmxlV3JhcERhdGEKLSAgICAgICAgICogdGhyb3VnaCB0aGUgc2V0TGF5b3V0RGF0YSBtZXRob2QuIEluIHNvbWUgY2FzZSwgY3JlYXRpbmcgaXQgd2lsbCBtYWtlIHRoZSB0YWJsZSBwYXJlbnQKLSAgICAgICAgICogaHVnZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KLSAgICAgICAgICogQHJldHVybiBUaGUgbmV3IGNyZWF0ZWQgRm9ybVRleHQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRm9ybVRleHQgY3JlYXRlRm9ybVRleHQoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgYm9vbGVhbiBpc0h0bWwsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsLCBib29sZWFuIHNldHVwTGF5b3V0RGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIFNlY3Rpb25IZWxwZXIuY3JlYXRlRm9ybVRleHQocGFyZW50LCB0b29sa2l0LCBpc0h0bWwsIGxhYmVsLCBzZXR1cExheW91dERhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlcyB0aGUgc2VjdGlvbiB0byByZWNvbXB1dGUgaXRzIGxheW91dCBhbmQgcmVkcmF3LgotICAgICAgICAgKiBUaGlzIGlzIG5lZWRlZCBhZnRlciB0aGUgY29udGVudCBvZiB0aGUgc2VjdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIGF0IHJ1bnRpbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBsYXlvdXRDaGFuZ2VkKCkgewotICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0U2VjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBDYWxscyBnZXRTZWN0aW9uKCkucmVmbG93KCksIHdoaWNoIGlzIHRoZSBzYW1lIHRoYXQgU2VjdGlvbiBjYWxscwotICAgICAgICAgICAgLy8gd2hlbiB0aGUgZXhwYW5kYWJsZSBzdGF0ZSBpcyBjaGFuZ2VkIGFuZCB0aGUgaGVpZ2h0IGNoYW5nZXMuCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHByb3RlY3RlZCwgc29tZSByZWZsZWN0aW9uIGlzIG5lZWRlZCB0byBpbnZva2UgaXQuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCByZWZsb3c7Ci0gICAgICAgICAgICAgICAgcmVmbG93ID0gc2VjdGlvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJyZWZsb3ciLCAoQ2xhc3M8Pz5bXSludWxsKTsKLSAgICAgICAgICAgICAgICByZWZsb3cuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICByZWZsb3cuaW52b2tlKHNlY3Rpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJFcnJvciB3aGVuIGludm9raW5nIFNlY3Rpb24ucmVmbG93Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNlY3Rpb24ubGF5b3V0KHRydWUgLyogY2hhbmdlZCAqLywgdHJ1ZSAvKiBhbGwgKi8pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcG9zaXRlIHdpdGggYSBUYWJsZVdyYXBMYXlvdXQgc2V0IHdpdGggYSBnaXZlbiBudW1iZXIgb2YgY29sdW1ucy4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgcGFyZW50IGNvbXBvc2l0ZSBpcyBhIFNlY3Rpb24sIHRoZSBuZXcgY29tcG9zaXRlIGlzIHNldCBhcyBhIGNsaWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIFRoZSBwYXJlbnQgKGUuZy4gYSBTZWN0aW9uIG9yIFNlY3Rpb25QYXJ0KQotICAgICAqIEBwYXJhbSB0b29sa2l0IEZvcm0gVG9vbGtpdAotICAgICAqIEBwYXJhbSBudW1Db2x1bW5zIERlc2lyZWQgbnVtYmVyIG9mIGNvbHVtbnMuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNvbXBvc2l0ZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVUYWJsZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBGb3JtVG9vbGtpdCB0b29sa2l0LAotICAgICAgICAgICAgaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgQ29tcG9zaXRlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLSAgICAgICAgVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgICAgICB0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFibGUpOwotICAgICAgICBpZiAoY29tcG9zaXRlIGluc3RhbmNlb2YgU2VjdGlvbikgewotICAgICAgICAgICAgKChTZWN0aW9uKSBjb21wb3NpdGUpLnNldENsaWVudCh0YWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcG9zaXRlIHdpdGggYSBHcmlkTGF5b3V0IHNldCB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGNvbHVtbnMuCi0gICAgICogCi0gICAgICogSWYgdGhlIHBhcmVudCBjb21wb3NpdGUgaXMgYSBTZWN0aW9uLCB0aGUgbmV3IGNvbXBvc2l0ZSBpcyBzZXQgYXMgYSBjbGllbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSBUaGUgcGFyZW50IChlLmcuIGEgU2VjdGlvbiBvciBTZWN0aW9uUGFydCkKLSAgICAgKiBAcGFyYW0gdG9vbGtpdCBGb3JtIFRvb2xraXQKLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyBEZXNpcmVkIG51bWJlciBvZiBjb2x1bW5zLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjb21wb3NpdGUuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBGb3JtVG9vbGtpdCB0b29sa2l0LAotICAgICAgICAgICAgaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgQ29tcG9zaXRlIGdyaWQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgZ3JpZC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ3JpZCk7Ci0gICAgICAgIGlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTZWN0aW9uKSB7Ci0gICAgICAgICAgICAoKFNlY3Rpb24pIGNvbXBvc2l0ZSkuc2V0Q2xpZW50KGdyaWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncmlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdHdvIHdpZGdldHM6IGEgbGFiZWwgYW5kIGEgdGV4dCBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGV4cGVjdHMgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gaGF2ZSBhIFRhYmxlV3JhcExheW91dCB3aXRoIDIgY29sdW1ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgKGUuZy4gY29tcG9zaXRlIGZyb20gQ3JlYXRlVGFibGVMYXlvdXQoKSkKLSAgICAgKiBAcGFyYW0gdG9vbGtpdCBGb3JtIFRvb2xraXQKLSAgICAgKiBAcGFyYW0gbGFiZWxfdGV4dCBUaGUgc3RyaW5nIGZvciB0aGUgbGFiZWwuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSB0ZXh0IGZpZWxkLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdG9vbHRpcCBBbiBvcHRpb25hbCB0b29sdGlwIGZvciB0aGUgbGFiZWwgYW5kIHRleHQuIENhbiBiZSBudWxsLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjcmVhdGVkIFRleHQgZmllbGQgKHRoZSBsYWJlbCBpcyBub3QgcmV0dXJuZWQpIAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgVGV4dCBjcmVhdGVMYWJlbEFuZFRleHQoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgU3RyaW5nIGxhYmVsX3RleHQsCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUsIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsX3RleHQpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuTEVGVCwgVGFibGVXcmFwRGF0YS5NSURETEUpKTsKLSAgICAgICAgVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUpOwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsIFRhYmxlV3JhcERhdGEuTUlERExFKSk7Ci0KLSAgICAgICAgYWRkQ29udHJvbFRvb2x0aXAobGFiZWwsIHRvb2x0aXApOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGFiZWwgd2lkZ2V0LgotICAgICAqIElmIHRoZSBwYXJlbnQgbGF5b3V0IGlmIGEgVGFibGVXcmFwTGF5b3V0LCBtYXhpbWl6ZSBpdCB0byBzcGFuIG92ZXIgYWxsIGNvbHVtbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IChlLmcuIGNvbXBvc2l0ZSBmcm9tIENyZWF0ZVRhYmxlTGF5b3V0KCkpCi0gICAgICogQHBhcmFtIHRvb2xraXQgRm9ybSBUb29sa2l0Ci0gICAgICogQHBhcmFtIGxhYmVsX3RleHQgVGhlIHN0cmluZyBmb3IgdGhlIGxhYmVsLgotICAgICAqIEBwYXJhbSB0b29sdGlwIEFuIG9wdGlvbmFsIHRvb2x0aXAgZm9yIHRoZSBsYWJlbCBhbmQgdGV4dC4gQ2FuIGJlIG51bGwuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNyZWF0ZWQgbGFiZWwgCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBTdHJpbmcgbGFiZWxfdGV4dCwKLSAgICAgICAgICAgIFN0cmluZyB0b29sdGlwKSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsX3RleHQpOwotCi0gICAgICAgIFRhYmxlV3JhcERhdGEgdHdkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotICAgICAgICBpZiAocGFyZW50LmdldExheW91dCgpIGluc3RhbmNlb2YgVGFibGVXcmFwTGF5b3V0KSB7Ci0gICAgICAgICAgICB0d2QuY29sc3BhbiA9ICgoVGFibGVXcmFwTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnM7Ci0gICAgICAgIH0KLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSh0d2QpOwotCi0gICAgICAgIGFkZENvbnRyb2xUb29sdGlwKGxhYmVsLCB0b29sdGlwKTsKLSAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc29jaWF0ZXMgYSB0b29sdGlwIHdpdGggYSBjb250cm9sLgotICAgICAqIAotICAgICAqIFRoaXMgbWlycm9ycyB0aGUgYmVoYXZpb3IgZnJvbSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuUERFVGV4dEhvdmVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gd2hpY2ggYXNzb2NpYXRlIHRoZSB0b29sdGlwLgotICAgICAqIEBwYXJhbSB0b29sdGlwIFRoZSB0b29sdGlwIHN0cmluZy4gQ2FuIHVzZSBcbiBmb3IgbXVsdGktbGluZXMuIFdpbGwgbm90IGRpc3BsYXkgaWYgbnVsbC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgYWRkQ29udHJvbFRvb2x0aXAoZmluYWwgQ29udHJvbCBjb250cm9sLCBTdHJpbmcgdG9vbHRpcCkgewotICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsIHx8IHRvb2x0aXAgPT0gbnVsbCB8fCB0b29sdGlwLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU29tZSBraW5kcyBvZiBjb250cm9scyBhbHJlYWR5IHByb3Blcmx5IGltcGxlbWVudCB0b29sdGlwIGRpc3BsYXkuIAotICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEJ1dHRvbikgewotICAgICAgICAgICAgY29udHJvbC5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRyb2wuc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbCBpYyA9IG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKGNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGljLnNldEluZm9ybWF0aW9uKHRvb2x0aXApOwotICAgICAgICBQb2ludCBzeiA9IGljLmNvbXB1dGVTaXplSGludCgpOwotICAgICAgICBpYy5zZXRTaXplKHN6LngsIHN6LnkpOwotICAgICAgICBpYy5zZXRWaXNpYmxlKGZhbHNlKTsgLy8gaW5pdGlhbGx5IGhpZGRlbgotICAgICAgICAKLSAgICAgICAgY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpYy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpYy5zZXRMb2NhdGlvbihjb250cm9sLnRvRGlzcGxheSgxMCwgMjUpKTsgIC8vIHNhbWUgb2Zmc2V0IGFzIGluIFBERVRleHRIb3ZlcgotICAgICAgICAgICAgICAgIGljLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGb3JtVGV4dCB3aWRnZXQuCi0gICAgICogCi0gICAgICogVGhpcyBleHBlY3RzIHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGhhdmUgYSBUYWJsZVdyYXBMYXlvdXQgd2l0aCAyIGNvbHVtbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IChlLmcuIGNvbXBvc2l0ZSBmcm9tIENyZWF0ZVRhYmxlTGF5b3V0KCkpCi0gICAgICogQHBhcmFtIHRvb2xraXQgRm9ybSBUb29sa2l0Ci0gICAgICogQHBhcmFtIGlzSHRtbCBUcnVlIGlmIHRoZSBmb3JtIHRleHQgd2lsbCBjb250YWluIEhUTUwgdGhhdCBtdXN0IGJlIGludGVycHJldGVkIGFzCi0gICAgICogICAgICAgICAgICAgICByaWNoIHRleHQgKGkuZS4gcGFyc2UgdGFncyAmIGV4cGFuZCBVUkxzKS4KLSAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIHN0cmluZyBmb3IgdGhlIGxhYmVsLgotICAgICAqIEBwYXJhbSBzZXR1cExheW91dERhdGEgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNyZWF0ZWQgZm9ybSB0ZXh0IHJlY2VpdmVzIGEgVGFibGVXcmFwRGF0YQotICAgICAqIHRocm91Z2ggdGhlIHNldExheW91dERhdGEgbWV0aG9kLiBJbiBzb21lIGNhc2UsIGNyZWF0aW5nIGl0IHdpbGwgbWFrZSB0aGUgdGFibGUgcGFyZW50Ci0gICAgICogaHVnZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY3JlYXRlZCBGb3JtVGV4dC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIEZvcm1UZXh0IGNyZWF0ZUZvcm1UZXh0KENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsCi0gICAgICAgICAgICBib29sZWFuIGlzSHRtbCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIHNldHVwTGF5b3V0RGF0YSkgewotICAgICAgICBGb3JtVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChwYXJlbnQsIHRydWUgLyogdHJhY2sgZm9jdXMgKi8pOwotICAgICAgICBpZiAoc2V0dXBMYXlvdXREYXRhKSB7Ci0gICAgICAgICAgICBUYWJsZVdyYXBEYXRhIHR3ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLSAgICAgICAgICAgIHR3ZC5tYXhXaWR0aCA9IEFuZHJvaWRFZGl0b3IuVEVYVF9XSURUSF9ISU5UOwotICAgICAgICAgICAgaWYgKHBhcmVudC5nZXRMYXlvdXQoKSBpbnN0YW5jZW9mIFRhYmxlV3JhcExheW91dCkgewotICAgICAgICAgICAgICAgIHR3ZC5jb2xzcGFuID0gKChUYWJsZVdyYXBMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1uczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YSh0d2QpOwotICAgICAgICB9Ci0gICAgICAgIHRleHQuc2V0V2hpdGVzcGFjZU5vcm1hbGl6ZWQodHJ1ZSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dChsYWJlbCwgaXNIdG1sIC8qIHBhcnNlVGFncyAqLywgaXNIdG1sIC8qIGV4cGFuZFVSTHMgKi8pOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9UZXh0VmFsdWVDZWxsRWRpdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9UZXh0VmFsdWVDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTBjMzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvVGV4dFZhbHVlQ2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlBdHRyaWJ1dGVOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGV4dENlbGxFZGl0b3IgYWJsZSB0byByZWNlaXZlIGEge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gaW4gdGhlIHtAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIFRleHRWYWx1ZUNlbGxFZGl0b3IgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvciB7Ci0gICAgCi0gICAgcHVibGljIFRleHRWYWx1ZUNlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpQXR0cmlidXRlTm9kZSkgewotICAgICAgICAgICAgc3VwZXIuZG9TZXRWYWx1ZSgoKFVpQXR0cmlidXRlTm9kZSl2YWx1ZSkuZ2V0Q3VycmVudFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdXBlci5kb1NldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9VaUVsZW1lbnRQYXJ0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS9VaUVsZW1lbnRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDk1MjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvVWlFbGVtZW50UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lk1hbmlmZXN0RWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlNlY3Rpb25IZWxwZXIuTWFuaWZlc3RTZWN0aW9uUGFydDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogR2VuZXJpYyBwYWdlJ3Mgc2VjdGlvbiBwYXJ0IHRoYXQgZGlzcGxheXMgYWxsIGF0dHJpYnV0ZXMgb2YgYSBnaXZlbiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gKiA8cC8+Ci0gKiBUaGlzIHBhcnQgaXMgZGVzaWduZWQgdG8gYmUgZGlzcGxheWVkIGluIGEgcGFnZSB0aGF0IGhhcyBhIHRhYmxlIGNvbHVtbiBsYXlvdXQuCi0gKiBJdCBpcyBsaW5rZWQgdG8gYSBzcGVjaWZpYyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gYW5kIGF1dG9tYXRpY2FsbHkgZGlzcGxheXMgYWxsIG9mIGl0cwotICogYXR0cmlidXRlcywgbWFuYWdlcyBpdHMgZGlydHkgc3RhdGUgYW5kIGNvbW1pdHMgdGhlIGF0dHJpYnV0ZXMgd2hlbiBuZWNlc3NhcnkuCi0gKiA8cC8+Ci0gKiBObyBkZXJpdmF0aW9uIGlzIG5lZWRlZCB1bmxlc3MgdGhlIFVJIG9yIHdvcmtmbG93IG5lZWRzIHRvIGJlIGV4dGVuZGVkLgotICovCi1wdWJsaWMgY2xhc3MgVWlFbGVtZW50UGFydCBleHRlbmRzIE1hbmlmZXN0U2VjdGlvblBhcnQgewotCi0gICAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgZWRpdG9yICovCi0gICAgcHJpdmF0ZSBNYW5pZmVzdEVkaXRvciBtRWRpdG9yOwotICAgIC8qKiBUaGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IG1hbmlwdWxhdGVkIGJ5IHRoaXMgU2VjdGlvblBhcnQuIEl0IGNhbiBiZSBudWxsLiAqLwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBtVWlFbGVtZW50Tm9kZTsKLSAgICAvKiogVGFibGUgdGhhdCBjb250YWlucyBhbGwgdGhlIGF0dHJpYnV0ZXMgKi8KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtVGFibGU7Ci0KLSAgICBwdWJsaWMgVWlFbGVtZW50UGFydChDb21wb3NpdGUgYm9keSwgRm9ybVRvb2xraXQgdG9vbGtpdCwgTWFuaWZlc3RFZGl0b3IgZWRpdG9yLAotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aUVsZW1lbnROb2RlLCBTdHJpbmcgc2VjdGlvblRpdGxlLCBTdHJpbmcgc2VjdGlvbkRlc2NyaXB0aW9uLAotICAgICAgICAgICAgaW50IGV4dHJhX3N0eWxlKSB7Ci0gICAgICAgIHN1cGVyKGJvZHksIHRvb2xraXQsIGV4dHJhX3N0eWxlLCBzZWN0aW9uRGVzY3JpcHRpb24gIT0gbnVsbCk7Ci0gICAgICAgIG1FZGl0b3IgPSBlZGl0b3I7Ci0gICAgICAgIG1VaUVsZW1lbnROb2RlID0gdWlFbGVtZW50Tm9kZTsKLSAgICAgICAgc2V0dXBTZWN0aW9uKHNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQotICAgICAgICBpZiAodWlFbGVtZW50Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHNlcmlvdXMgYW5kIHNob3VsZCBuZXZlciBoYXBwZW4uIEluc3RlYWQgb2YgY3Jhc2hpbmcsIHNpbXBseSBhYm9ydC4KLSAgICAgICAgICAgIC8vIFRoZXJlIHdpbGwgYmUgbm8gVUksIHdoaWNoIHdpbGwgcHJldmVudCBmdXJ0aGVyIGRhbWFnZS4KLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIk1pc3Npbmcgbm9kZSB0byBlZGl0ISIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBFZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFuaWZlc3RFZGl0b3IgZ2V0RWRpdG9yKCkgewotICAgICAgICByZXR1cm4gbUVkaXRvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhcnQuCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgZ2V0VWlFbGVtZW50Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1VaUVsZW1lbnROb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIGVsZW1lbnQgbm9kZSBoYW5kbGVkIGJ5IHRoaXMgcGFydC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdWlFbGVtZW50Tm9kZSBUaGUgbmV3IGVsZW1lbnQgbm9kZSBmb3IgdGhlIHBhcnQuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVpRWxlbWVudE5vZGUoVWlFbGVtZW50Tm9kZSB1aUVsZW1lbnROb2RlKSB7Ci0gICAgICAgIG1VaUVsZW1lbnROb2RlID0gdWlFbGVtZW50Tm9kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0gcGFydC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIG93bmluZyBtYW5hZ2VkIGZvcm0gYXMgc29vbiBhcyB0aGUgcGFydCBpcyBhZGRlZCB0byB0aGUgZm9ybSwKLSAgICAgKiB3aGljaCBoYXBwZW5zIHJpZ2h0IGFmdGVyIHRoZSBwYXJ0IGlzIGFjdHVhbGx5IGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJTWFuYWdlZEZvcm0gZm9ybSkgewotICAgICAgICBzdXBlci5pbml0aWFsaXplKGZvcm0pOwotICAgICAgICBjcmVhdGVGb3JtQ29udHJvbHMoZm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dXAgdGhlIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGlzIHBhcnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvciB0byBzZXQgdGhlIHNlY3Rpb24ncyB0aXRsZSBhbmQgZGVzY3JpcHRpb24KLSAgICAgKiB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqIDxici8+Ci0gICAgICogRGVyaXZlZCBjbGFzcyBvdmVycmlkZSB0aGlzIGlmIG5lZWRlZCwgaG93ZXZlciBpbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0Ci0gICAgICogaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGVub3VnaC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VjdGlvblRpdGxlIFRoZSBzZWN0aW9uIHBhcnQncyB0aXRsZQotICAgICAqIEBwYXJhbSBzZWN0aW9uRGVzY3JpcHRpb24gVGhlIHNlY3Rpb24gcGFydCdzIGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTZWN0aW9uKFN0cmluZyBzZWN0aW9uVGl0bGUsIFN0cmluZyBzZWN0aW9uRGVzY3JpcHRpb24pIHsKLSAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0U2VjdGlvbigpOwotICAgICAgICBzZWN0aW9uLnNldFRleHQoc2VjdGlvblRpdGxlKTsKLSAgICAgICAgc2VjdGlvbi5zZXREZXNjcmlwdGlvbihzZWN0aW9uRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29udHJvbHMgdG8gZWRpdCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIEVsZW1lbnREZXNjcmlwdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIE1VU1Qgbm90IGJlIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IuIEluc3RlYWQgaXQgbXVzdCBiZSBjYWxsZWQgZnJvbQotICAgICAqIDxjb2RlPmluaXRpYWxpemU8L2NvZGU+IChpLmUuIHJpZ2h0IGFmdGVyIHRoZSBmb3JtIHBhcnQgaXMgYWRkZWQgdG8gdGhlIG1hbmFnZWQgZm9ybS4pCi0gICAgICogPHAvPgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIFRoZSBvd25lciBtYW5hZ2VkIGZvcm0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udHJvbHMoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHNldFRhYmxlKGNyZWF0ZVRhYmxlTGF5b3V0KG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKSwgMiAvKiBudW1Db2x1bW5zICovKSk7Ci0KLSAgICAgICAgY3JlYXRlVWlBdHRyaWJ1dGVzKG1hbmFnZWRGb3JtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YWJsZSB3aGVyZSB0aGUgYXR0cmlidXRlIFVJIG5lZWRzIHRvIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGFibGUoQ29tcG9zaXRlIHRhYmxlKSB7Ci0gICAgICAgIG1UYWJsZSA9IHRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhYmxlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgVUkgbmVlZHMgdG8gYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGdldFRhYmxlKCkgewotICAgICAgICByZXR1cm4gbVRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgdGhlIGF0dHJpYnV0ZSBVSSB3aWRnZXRzIGludG8gdGhlIHVuZGVybHlpbmcgdGFibGUgbGF5b3V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VkRm9ybSBUaGUgb3duZXIgbWFuYWdlZCBmb3JtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVWlBdHRyaWJ1dGVzKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBDb21wb3NpdGUgdGFibGUgPSBnZXRUYWJsZSgpOwotICAgICAgICBpZiAodGFibGUgPT0gbnVsbCB8fCBtYW5hZ2VkRm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgYW55IG9sZCBVSSBjb250cm9scyAKLSAgICAgICAgZm9yIChDb250cm9sIGMgOiB0YWJsZS5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGxUYWJsZSh0YWJsZSwgbWFuYWdlZEZvcm0pOwotCi0gICAgICAgIC8vIFRlbGwgdGhlIHNlY3Rpb24gdGhhdCB0aGUgbGF5b3V0IGhhcyBjaGFuZ2VkLgotICAgICAgICBsYXlvdXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0dWFsbHkgZmlsbHMgdGhlIHRhYmxlLiAKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI2NyZWF0ZVVpQXR0cmlidXRlcyhJTWFuYWdlZEZvcm0pfSB0byBwb3B1bGF0ZSB0aGUgbmV3Ci0gICAgICogdGFibGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHVzZQotICAgICAqIHtAbGluayAjaW5zZXJ0VWlBdHRyaWJ1dGVzKFVpRWxlbWVudE5vZGUsIENvbXBvc2l0ZSwgSU1hbmFnZWRGb3JtKX0gdG8gYWN0dWFsbHkKLSAgICAgKiBwbGFjZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZGVmYXVsdCB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gaW4gdGhlIHRhYmxlLgotICAgICAqIDxwLz4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gYWRkIGNvbnRyb2xzIGluIHRoZSB0YWJsZSBiZWZvcmUgb3IgYWZ0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBmaWxsLiBJdCBtdXN0IGhhdmUgMiBjb2x1bW5zLgotICAgICAqIEBwYXJhbSBtYW5hZ2VkRm9ybSBUaGUgbWFuYWdlZCBmb3JtIGZvciBuZXcgY29udHJvbHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbFRhYmxlKENvbXBvc2l0ZSB0YWJsZSwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIGludCBpbnNlcnRlZCA9IGluc2VydFVpQXR0cmlidXRlcyhtVWlFbGVtZW50Tm9kZSwgdGFibGUsIG1hbmFnZWRGb3JtKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbnNlcnRlZCA9PSAwKSB7Ci0gICAgICAgICAgICBjcmVhdGVMYWJlbCh0YWJsZSwgbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpLAotICAgICAgICAgICAgICAgICAgICAiTm8gYXR0cmlidXRlcyB0byBkaXNwbGF5LCB3YWl0aW5nIGZvciBTREsgdG8gZmluaXNoIGxvYWRpbmcuLi4iLAotICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHRvb2x0aXAgKi8gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgVUkgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIFVpRWxlbWVudE5vZGV9IGluIHRoZSBnaXZlbiB0YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdWlOb2RlIFRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gdGhhdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyB0byBkaXNwbGF5LgotICAgICAqICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGZpbGwuIEl0IG11c3QgaGF2ZSAyIGNvbHVtbnMuCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIFRoZSBtYW5hZ2VkIGZvcm0gZm9yIG5ldyBjb250cm9scy4KLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgVUkgYXR0cmlidXRlcyBpbnNlcnRlZC4gSXQgaXMgPj0gMC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGluc2VydFVpQXR0cmlidXRlcyhVaUVsZW1lbnROb2RlIHVpTm9kZSwgQ29tcG9zaXRlIHRhYmxlLCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgaWYgKHVpTm9kZSA9PSBudWxsIHx8IHRhYmxlID09IG51bGwgfHwgbWFuYWdlZEZvcm0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUbyBpdGVyYXRlIG92ZXIgYWxsIGF0dHJpYnV0ZXMsIHdlIHVzZSB0aGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBpbnN0ZWFkCi0gICAgICAgIC8vIG9mIHRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gYmVjYXVzZSB0aGUgYXR0cmlidXRlcycgb3JkZXIgaXMgZ3VhcmFudGVlZCBpbiB0aGUKLSAgICAgICAgLy8gZGVzY3JpcHRvciBidXQgbm90IGluIHRoZSBub2RlIGl0c2VsZi4KLSAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJfZGVzY19saXN0ID0gdWlOb2RlLmdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyX2Rlc2MgOiBhdHRyX2Rlc2NfbGlzdCkgewotICAgICAgICAgICAgaWYgKGF0dHJfZGVzYyBpbnN0YW5jZW9mIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzaG93IGhpZGRlbiBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyID0gdWlOb2RlLmZpbmRVaUF0dHJpYnV0ZShhdHRyX2Rlc2MpOwotICAgICAgICAgICAgaWYgKHVpX2F0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVpX2F0dHIuY3JlYXRlVWlDb250cm9sKHRhYmxlLCBtYW5hZ2VkRm9ybSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBYTUwgaGFzIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aGljaCB3YXNuJ3QgZGVjbGFyZWQgaW4KLSAgICAgICAgICAgICAgICAvLyBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy4gVGhpcyBpcyBub3QgYSBwcm9ibGVtLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJTEkcyBub3QgZGVjbGFyZWQgaW4gbm9kZSAlMiRzLCBpZ25vcmVkLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfZGVzYy5nZXRYbWxMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpTm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cl9kZXNjX2xpc3QubGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHBhcnQgaXMgZGlydHkgaS5lLiBpdHMgd2lkZ2V0cyBoYXZlIHN0YXRlIHRoYXQgaXMKLSAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBtb2RlbC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBkb25lIGJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBhdHRyaWJ1dGVzIGFuZCB1cGRhdGluZyB0aGUgc3VwZXIncwotICAgICAqIGludGVybmFsIGRpcnR5IGZsYWcuIFN0b3Agb25jZSBhdCBsZWFzdCBvbmUgYXR0cmlidXRlIGlzIGRpcnR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhcnQgaXMgZGlydHksIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgICAgIGlmIChtVWlFbGVtZW50Tm9kZSAhPSBudWxsICYmICFzdXBlci5pc0RpcnR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgOiBtVWlFbGVtZW50Tm9kZS5nZXRVaUF0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh1aV9hdHRyLmlzRGlydHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIHBhcnQgaXMgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSBhIG1vZGVsLCB0aGlzIG1ldGhvZAotICAgICAqIGluc3RydWN0cyBpdCB0byBjb21taXQgdGhlIG5ldyAobW9kaWZpZWQpIGRhdGEgYmFjayBpbnRvIHRoZSBtb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb25TYXZlCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgY29tbWl0IGlzIGNhbGxlZCBkdXJpbmcgJ3NhdmUnIG9wZXJhdGlvbiBvciBmb3IKLSAgICAgKiAgICAgICAgICAgIHNvbWUgb3RoZXIgcmVhc29uIChmb3IgZXhhbXBsZSwgaWYgZm9ybSBpcyBjb250YWluZWQgaW4gYQotICAgICAqICAgICAgICAgICAgd2l6YXJkIG9yIGEgbXVsdGktcGFnZSBlZGl0b3IgYW5kIHRoZSB1c2VyIGlzIGFib3V0IHRvIGxlYXZlCi0gICAgICogICAgICAgICAgICB0aGUgcGFnZSkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gb25TYXZlKSB7Ci0gICAgICAgIGlmIChtVWlFbGVtZW50Tm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRpdG9yLmVkaXRYbWxNb2RlbChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyIDogbVVpRWxlbWVudE5vZGUuZ2V0VWlBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpX2F0dHIuY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBzdXBlcidzIGNvbW1pdCBhZnRlciB3ZSBzeW5jaHJvbml6ZWQgdGhlIG5vZGVzIHRvIG1ha2Ugc3VyZSB3ZQotICAgICAgICAvLyByZXNldCB0aGUgZGlydHkgZmxhZyBhZnRlciBhbGwgdGhlIHNpZGUgZWZmZWN0cyBmcm9tIGNvbW1pdHRpbmcgaGF2ZSBvY2N1cnJlZC4KLSAgICAgICAgc3VwZXIuY29tbWl0KG9uU2F2ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9Db3B5Q3V0QWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL0NvcHlDdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MjU2Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL0NvcHlDdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLk1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIEN1dCBhbmQgQ29weSBhY3Rpb25zIGZvciB0aGUgdHJlZSBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIENvcHlDdXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByaXZhdGUgTGlzdDxVaUVsZW1lbnROb2RlPiBtVWlOb2RlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlcmZvcm1DdXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkRWRpdG9yIG1FZGl0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGlwYm9hcmQgbUNsaXBib2FyZDsKLSAgICBwcml2YXRlIGZpbmFsIElDb21taXRYbWwgbVhtbENvbW1pdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQ29weSBvciBDdXQgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgVUkgbm9kZSB0byBjdXQgb3IgY29weS4gSXQgKm11c3QqIGhhdmUgYSBub24tbnVsbCBYTUwgbm9kZS4KLSAgICAgKiBAcGFyYW0gcGVyZm9ybV9jdXQgVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIGlzIGN1dCwgZmFsc2UgaWYgaXQgaXMgY29weS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29weUN1dEFjdGlvbihBbmRyb2lkRWRpdG9yIGVkaXRvciwgQ2xpcGJvYXJkIGNsaXBib2FyZCwgSUNvbW1pdFhtbCB4bWxDb21taXQsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHNlbGVjdGVkLCBib29sZWFuIHBlcmZvcm1fY3V0KSB7Ci0gICAgICAgIHRoaXMoZWRpdG9yLCBjbGlwYm9hcmQsIHhtbENvbW1pdCwgdG9MaXN0KHNlbGVjdGVkKSwgcGVyZm9ybV9jdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQ29weSBvciBDdXQgYWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgVUkgbm9kZXMgdG8gY3V0IG9yIGNvcHkuIFRoZXkgKm11c3QqIGhhdmUgYSBub24tbnVsbCBYTUwgbm9kZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgVGhlIGxpc3QgYmVjb21lcyBvd25lZCBieSB0aGUge0BsaW5rIENvcHlDdXRBY3Rpb259LgotICAgICAqIEBwYXJhbSBwZXJmb3JtX2N1dCBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgY3V0LCBmYWxzZSBpZiBpdCBpcyBjb3B5LgotICAgICAqLwotICAgIHB1YmxpYyBDb3B5Q3V0QWN0aW9uKEFuZHJvaWRFZGl0b3IgZWRpdG9yLCBDbGlwYm9hcmQgY2xpcGJvYXJkLCBJQ29tbWl0WG1sIHhtbENvbW1pdCwKLSAgICAgICAgICAgIExpc3Q8VWlFbGVtZW50Tm9kZT4gc2VsZWN0ZWQsIGJvb2xlYW4gcGVyZm9ybV9jdXQpIHsKLSAgICAgICAgc3VwZXIocGVyZm9ybV9jdXQgPyAiQ3V0IiA6ICJDb3B5Iik7Ci0gICAgICAgIG1FZGl0b3IgPSBlZGl0b3I7Ci0gICAgICAgIG1DbGlwYm9hcmQgPSBjbGlwYm9hcmQ7Ci0gICAgICAgIG1YbWxDb21taXQgPSB4bWxDb21taXQ7Ci0gICAgICAgIAotICAgICAgICBJU2hhcmVkSW1hZ2VzIGltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0gICAgICAgIGlmIChwZXJmb3JtX2N1dCkgewotICAgICAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLSAgICAgICAgICAgIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLSAgICAgICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICBpbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ1VUX0RJU0FCTEVEKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLSAgICAgICAgICAgIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0gICAgICAgICAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFlfRElTQUJMRUQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1VaU5vZGVzID0gc2VsZWN0ZWQ7Ci0gICAgICAgIG1QZXJmb3JtQ3V0ID0gcGVyZm9ybV9jdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGN1dCBvciBjb3B5IGFjdGlvbi4KLSAgICAgKiBGaXJzdCBhbiBYTUwgc2VyaWFsaXplciBpcyB1c2VkIHRvIHR1cm4gdGhlIGV4aXN0aW5nIFhNTCBub2RlIGludG8gYSB2YWxpZAotICAgICAqIFhNTCBmcmFnbWVudCwgd2hpY2ggaXMgYWRkZWQgYXMgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgc3VwZXIucnVuKCk7Ci0gICAgICAgIGlmIChtVWlOb2RlcyA9PSBudWxsIHx8IG1VaU5vZGVzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbW1pdCB0aGUgY3VycmVudCBwYWdlcyBmaXJzdCwgdG8gbWFrZSBzdXJlIHRoZSBYTUwgaXMgaW4gc3luYy4KLSAgICAgICAgLy8gQ29tbWl0dGluZyBtYXkgY2hhbmdlIHRoZSBYTUwgc3RydWN0dXJlLgotICAgICAgICBpZiAobVhtbENvbW1pdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtWG1sQ29tbWl0LmNvbW1pdFBlbmRpbmdYbWxDaGFuZ2VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIGFsbFRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4gbm9kZXNUb0N1dCA9IG1QZXJmb3JtQ3V0ID8gbmV3IEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPigpIDogbnVsbDsKLQotICAgICAgICBmb3IgKFVpRWxlbWVudE5vZGUgdWlOb2RlIDogbVVpTm9kZXMpIHsKLSAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTm9kZSB4bWxfbm9kZSA9IHVpTm9kZS5nZXRYbWxOb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbF9ub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGdldFhtbFRleHRGcm9tRWRpdG9yKHhtbF9ub2RlKTsKLSAKLSAgICAgICAgICAgICAgICAvLyBJbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBJU3RydWN0dXJlZERvY3VtZW50IGZhaWxlZCB0byBleHRyYWN0IHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgZnJvbSB0aGUgZWRpdG9yLCB0cnkgdG8gZmFsbCBiYWNrIG9uIGEgZGlyZWN0IFhNTCBzZXJpYWxpemF0aW9uCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIFhNTCBub2RlLiBUaGlzIHVzZXMgdGhlIGdlbmVyaWMgTm9kZSBpbnRlcmZhY2Ugd2l0aCBubyBTU0UgdHJpY2tzLgotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGdldFhtbFRleHRGcm9tU2VyaWFsaXphdGlvbih4bWxfbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsVGV4dC5hcHBlbmQoZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUGVyZm9ybUN1dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSByZW1vdmUgbm90ZXMgdG8gY3V0IGlmIHdlIGFjdHVhbGx5IGdvdCBzb21lIFhNTCB0ZXh0IGZyb20gdGhlbQotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0N1dC5hZGQodWlOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiQ29weUN1dEFjdGlvbiBmYWlsZWQgZm9yIFVJIG5vZGUgJTEkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpTm9kZS5nZXRCcmVhZGNydW1iVHJhaWxEZXNjcmlwdGlvbih0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLy8gZm9yIHVpTm9kZQotCi0gICAgICAgIGlmIChhbGxUZXh0ICE9IG51bGwgJiYgYWxsVGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIG1DbGlwYm9hcmQuc2V0Q29udGVudHMoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGFsbFRleHQudG9TdHJpbmcoKSB9LAotICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotICAgICAgICAgICAgaWYgKG1QZXJmb3JtQ3V0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpTm9kZSA6IG5vZGVzVG9DdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdWlOb2RlLmRlbGV0ZVhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhlIGVkaXRvci4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRYbWxUZXh0RnJvbUVkaXRvcihOb2RlIHhtbF9ub2RlKSB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0gbnVsbDsKLSAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1FZGl0b3IuZ2V0TW9kZWxGb3JSZWFkKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50IHNzZV9kb2MgPSBtRWRpdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKHhtbF9ub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgIC8vIFRoZSBlYXN5IHdheSB0byBnZXQgdGhlIHNvdXJjZSBvZiBhbiBTU0UgWE1MIG5vZGUuCi0gICAgICAgICAgICAgICAgZGF0YSA9ICgoTm9kZUNvbnRhaW5lcikgeG1sX25vZGUpLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgfSBlbHNlICBpZiAoeG1sX25vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uICYmIHNzZV9kb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRyeSBoYXJkZXIuCi0gICAgICAgICAgICAgICAgSW5kZXhlZFJlZ2lvbiByZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgeG1sX25vZGU7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLSAgIAotICAgICAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3NlX2RvYy5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRoZSByZWdpb24gb2Zmc2V0IHdhcyBpbnZhbGlkLiBpZ25vcmUuCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGlyZWN0IFhNTCBzZXJpYWxpemF0aW9uIG9mIHRoZSBYTUwgbm9kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyB1c2VzIHRoZSBnZW5lcmljIE5vZGUgaW50ZXJmYWNlIHdpdGggbm8gU1NFIHRyaWNrcy4gSXQncyBob3dldmVyIHNsb3dlcgotICAgICAqIGFuZCBkb2Vzbid0IHJlc3BlY3QgZm9ybWF0dGluZyAoc2luY2Ugc2VyaWFsaXphdGlvbiBpcyBpbnZvbHZlZCBpbnN0ZWFkIG9mIHJlYWRpbmcKLSAgICAgKiB0aGUgYWN0dWFsIHRleHQgYnVmZmVyLikKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRYbWxUZXh0RnJvbVNlcmlhbGl6YXRpb24oTm9kZSB4bWxfbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGRhdGE7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoc3csCi0gICAgICAgICAgICAgICAgbmV3IE91dHB1dEZvcm1hdChNZXRob2QuWE1MLAotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Rm9ybWF0LkRlZmF1bHRzLkVuY29kaW5nIC8qIHV0Zi04ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmRlbnQgKi8pKTsKLSAgICAgICAgLy8gU2VyaWFsaXplIHdpbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgaXQgZmFpbHMuCi0gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKChFbGVtZW50KSB4bWxfbm9kZSk7Ci0gICAgICAgIGRhdGEgPSBzdy50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGF0aWMgaGVscGVyIGNsYXNzIHRvIHdyYXAgb24gbm9kZSBpbnRvIGEgbGlzdCBmb3IgdGhlIGNvbnN0cnVjdG9ycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4gdG9MaXN0KFVpRWxlbWVudE5vZGUgc2VsZWN0ZWQpIHsKLSAgICAgICAgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+IGxpc3QgPSBudWxsOwotICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4oMSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChzZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL0lDb21taXRYbWwuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvSUNvbW1pdFhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjdkMTQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvSUNvbW1pdFhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHRoYXQgY2FuIGNvbW1pdCBpdHMgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBYTUwgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWl0WG1sIHsKLQotICAgIC8qKiBDb21taXRzIHBlbmRpbmcgZGF0YSB0byB0aGUgdW5kZXJseWluZyBYTUwgbW9kZWwuICovCi0gICAgcHVibGljIHZvaWQgY29tbWl0UGVuZGluZ1htbENoYW5nZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9OZXdJdGVtU2VsZWN0aW9uRGlhbG9nLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL05ld0l0ZW1TZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkYjdhYS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL05ld0l0ZW1TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzLlZpZXdFbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQWJzdHJhY3RFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBBIHNlbGVjdGlvbiBkaWFsb2cgdG8gc2VsZWN0IHRoZSB0eXBlIG9mIHRoZSBuZXcgZWxlbWVudCBub2RlIHRvCi0gKiBjcmVhdGUsIGVpdGhlciBpbiB0aGUgYXBwbGljYXRpb24gbm9kZSBvciB0aGUgc2VsZWN0ZWQgc3ViIG5vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdJdGVtU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLSAgICAvKiogVGhlIFVJIG5vZGUgc2VsZWN0ZWQgaW4gdGhlIHRyZWUgdmlldyBiZWZvcmUgY3JlYXRpbmcgdGhlIG5ldyBpdGVtIHNlbGVjdGlvbiBkaWFsb2cuCi0gICAgICogIENhbiBiZSBudWxsIC0tIHdoaWNoIG1lYW5zIG5ldyBpdGVtcyBtdXN0IGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Rfbm9kZS4gKi8KLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgbVNlbGVjdGVkVWlOb2RlOwotICAgIC8qKiBUaGUgcm9vdCBub2RlIGNob3NlbiBieSB0aGUgdXNlciwgZWl0aGVyIHJvb3Rfbm9kZSBvciB0aGUgb25lIHBhc3NlZAotICAgICAqICB0byB0aGUgY29uc3RydWN0b3IgaWYgbm90IG51bGwgKi8KLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgbUNob3NlblJvb3ROb2RlOwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBtTG9jYWxSb290Tm9kZTsKLSAgICAvKiogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGRpc3BsYXllZCBhcyByb290IGluIHRoaXMgdHJlZSB2aWV3LiBBbGwgZWxlbWVudHMKLSAgICAgKiAgb2YgdGhlIHNhbWUgdHlwZSBpbiB0aGUgcm9vdCB3aWxsIGJlIGRpc3BsYXllZC4gQ2FuIGJlIG51bGwuICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvcltdIG1EZXNjcmlwdG9yRmlsdGVyczsKLSAgICAvKiogVGhlIGtleSBmb3IgdGhlIHtAbGluayAjc2V0TGFzdFVzZWRYbWxOYW1lKE9iamVjdFtdKX0uIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBmdWxsCi0gICAgICogd29ya3NwYWNlIHBhdGggb2YgdGhlIGN1cnJlbnRseSBlZGl0ZWQgZmlsZSwgaWYgdGhpcyBjYW4gYmUgY29tcHV0ZWQuIFRoaXMgaXMgY29tcHV0ZWQKLSAgICAgKiBieSB7QGxpbmsgI2dldExhc3RVc2VkWG1sTmFtZShVaUVsZW1lbnROb2RlKX0sIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3Rvci4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdFVzZWRLZXk7Ci0gICAgLyoqIEEgc3RhdGljIG1hcCBvZiBrbm93biBYTUwgTmFtZXMgdXNlZCBmb3IgYSBnaXZlbiBmaWxlLiBUaGUgbWFwIGhhcyBmdWxsIHdvcmtzcGFjZQotICAgICAqIHBhdGhzIGFzIGtleSBhbmQgWE1MIG5hbWVzIGFzIHZhbHVlcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNMYXN0VXNlZFhtbE5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAvKiogVGhlIHBvdGVudGlhbCBYTUwgTmFtZSB0byBpbml0aWFsbHkgc2VsZWN0IGluIHRoZSBzZWxlY3Rpb24gZGlhbG9nLiBUaGlzIGlzIGNvbXB1dGVkCi0gICAgICogaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBzZXQgYnkge0BsaW5rICNzZXRJbml0aWFsU2VsZWN0aW9uKFVpRWxlbWVudE5vZGUpfS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtSW5pdGlhbFhtbE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBuZXcgaXRlbSBzZWxlY3Rpb24gZGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaGVsbCBUaGUgcGFyZW50IHNoZWxsIGZvciB0aGUgbGlzdC4KLSAgICAgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBJTGFiZWxQcm92aWRlciBmb3IgdGhlIGxpc3QuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWx0ZXJzIFRoZSBlbGVtZW50IGFsbG93cyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gQ2FuIGJlIG51bGwuCi0gICAgICogQHBhcmFtIHVpX25vZGUgVGhlIHNlbGVjdGVkIG5vZGUsIG9yIG51bGwgaWYgbm9uZSBpcyBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gcm9vdF9ub2RlIFRoZSByb290IG9mIHRoZSBVaSBUcmVlLCBlaXRoZXIgdGhlIFVpRG9jdW1lbnROb2RlIG9yIGEgc3ViLW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE5ld0l0ZW1TZWxlY3Rpb25EaWFsb2coU2hlbGwgc2hlbGwsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JGaWx0ZXJzLAotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aV9ub2RlLAotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSByb290X25vZGUpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotICAgICAgICBtRGVzY3JpcHRvckZpbHRlcnMgPSBkZXNjcmlwdG9yRmlsdGVyczsKLSAgICAgICAgbUxvY2FsUm9vdE5vZGUgPSByb290X25vZGU7Ci0KLSAgICAgICAgLy8gT25seSBhY2NlcHQgdGhlIFVJIG5vZGUgaWYgaXQgaXMgbm90IHRoZSBVSSByb290IG5vZGUgYW5kIGl0IGNhbiBoYXZlIGNoaWxkcmVuLgotICAgICAgICAvLyBJZiB0aGUgbm9kZSBjYW5ub3QgaGF2ZSBjaGlsZHJlbiwgc2VsZWN0IGl0cyBwYXJlbnQgYXMgYSBwb3RlbnRpYWwgdGFyZ2V0LgotICAgICAgICBpZiAodWlfbm9kZSAhPSBudWxsICYmIHVpX25vZGUgIT0gbUxvY2FsUm9vdE5vZGUpIHsKLSAgICAgICAgICAgIGlmICh1aV9ub2RlLmdldERlc2NyaXB0b3IoKS5oYXNDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkVWlOb2RlID0gdWlfbm9kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBwYXJlbnQgPSB1aV9ub2RlLmdldFVpUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBtTG9jYWxSb290Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRVaU5vZGUgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLSAgICAgICAgc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSAmJiBzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBWaWV3RWxlbWVudERlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgLy8gc2V2ZXJpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uUExVR0lOX0lELCAvL3BsdWdpbiBpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuT0ssIC8vIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZpZXdFbGVtZW50RGVzY3JpcHRvcikgc2VsZWN0aW9uWzBdKS5nZXRDYW5vbmljYWxDbGFzc05hbWUoKSwgLy9tc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7IC8vIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxICYmIHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIEVsZW1lbnREZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIC8vIHNldmVyaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLlBMVUdJTl9JRCwgLy9wbHVnaW4gaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLCAvLyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIC8vJE5PTi1OTFMtMSQgLy8gbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7IC8vIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIC8vIHNldmVyaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLlBMVUdJTl9JRCwgLy9wbHVnaW4gaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLCAvLyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc2VsZWN0aW9uIiwgLy8gbXNnLCB0cmFuc2xhdGFibGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7IC8vIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHVzaW5nIGEgY291cGxlIGhldXJpc3RpY3MuCi0gICAgICAgIAotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB3ZSBjYW4gZ2V0IHRoZSBsYXN0IHVzZWQgbm9kZSB0eXBlIGZvciB0aGlzIGZpbGUuCi0gICAgICAgIC8vIFRoZSBoZXVyaXN0aWMgaXMgdGhhdCBnZW5lcmFsbHkgb25lIGtlZXBzIGFkZGluZyB0aGUgc2FtZSBraW5kIG9mIGl0ZW1zIHRvIHRoZQotICAgICAgICAvLyBzYW1lIGZpbGUsIHNvIHJldXNpbmcgdGhlIGxhc3QgdXNlZCBpdGVtIHR5cGUgbWFrZXMgbW9zdCBzZW5zZS4KLSAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBnZXRMYXN0VXNlZFhtbE5hbWUocm9vdF9ub2RlKTsKLSAgICAgICAgaWYgKHhtbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQW5vdGhlciBoZXVyaXN0aWMgaXMgdG8gZmluZCB0aGUgbW9zdCB1c2VkIGl0ZW0gYW5kIGRlZmF1bHQgdG8gdGhhdC4KLSAgICAgICAgICAgIHhtbE5hbWUgPSBnZXRNb3N0VXNlZFhtbE5hbWUocm9vdF9ub2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeG1sTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGaW5hbGx5IHRoZSBsYXN0IGhldXJpc3RpYyBpcyB0byBzZWUgaWYgdGhlcmUncyBhbiBpdGVtIHdpdGggYSBuYW1lCi0gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIHRoZSBlZGl0ZWQgZmlsZSBuYW1lLgotICAgICAgICAgICAgeG1sTmFtZSA9IGdldExlYWZGaWxlTmFtZShyb290X25vZGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCB0aGUgcG90ZW50aWFsIG5hbWUuIFNlbGVjdGluZyB0aGUgcmlnaHQgaXRlbSBpcyBkb25lIGxhdGVyIGJ5IHNldEluaXRpYWxTZWxlY3Rpb24oKS4KLSAgICAgICAgbUluaXRpYWxYbWxOYW1lID0geG1sTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcG90ZW50aWFsIFhNTCBuYW1lIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUuCi0gICAgICogVGhlIGl0ZW0gbmFtZSBpcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayB0byBpZGVudGlmeSBpdCBhcyBhIHBhcnRpYWwgbWF0Y2guCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGVhZkZpbGVOYW1lKFVpRWxlbWVudE5vZGUgdWlfbm9kZSkgewotICAgICAgICBpZiAodWlfbm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkRWRpdG9yIGVkaXRvciA9IHVpX25vZGUuZ2V0RWRpdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZiA9ICgoRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGVhZk5hbWUgPSBmLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIioiICsgbGVhZk5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwb3RlbnRpYWwgbm9uLW51bGwgcm9vdCBub2RlLCB0aGlzIG1ldGhvZCBsb29rcyBmb3IgdGhlIGN1cnJlbnRseSBlZGl0ZWQKLSAgICAgKiBmaWxlIHBhdGggYW5kIHVzZXMgaXQgYXMgYSBrZXkgdG8gcmV0cmlldmUgdGhlIGxhc3QgdXNlZCBpdGVtIGZvciB0aGlzIGZpbGUgYnkgdGhpcwotICAgICAqIHNlbGVjdGlvbiBkaWFsb2cuIFJldHVybnMgbnVsbCBpZiBub3RoaW5nIGNhbiBiZSBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN0cmluZwotICAgICAqIG5hbWUgb2YgdGhlIGl0ZW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdFVzZWRYbWxOYW1lKFVpRWxlbWVudE5vZGUgdWlfbm9kZSkgewotICAgICAgICBpZiAodWlfbm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkRWRpdG9yIGVkaXRvciA9IHVpX25vZGUuZ2V0RWRpdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZiA9ICgoRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFVzZWRLZXkgPSBmLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpOwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNMYXN0VXNlZFhtbE5hbWUuZ2V0KG1MYXN0VXNlZEtleSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhc3QgdXNlZCBpdGVtIGZvciB0aGlzIHNlbGVjdGlvbiBkaWFsb2cgZm9yIHRoaXMgZmlsZS4KLSAgICAgKiBAcGFyYW0gb2JqZWN0cyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zLiBPbmx5IHRoZSBmaXJzdCBvbmUgaXMgdXNlZCBpZiBpdCBpcyBhbgotICAgICAqICAgICAgICAgICAgICAgIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldExhc3RVc2VkWG1sTmFtZShPYmplY3RbXSBvYmplY3RzKSB7Ci0gICAgICAgIGlmIChtTGFzdFVzZWRLZXkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIG9iamVjdHMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIG9iamVjdHMubGVuZ3RoID4gMCAmJgotICAgICAgICAgICAgICAgIG9iamVjdHNbMF0gaW5zdGFuY2VvZiBFbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IChFbGVtZW50RGVzY3JpcHRvcikgb2JqZWN0c1swXTsKLSAgICAgICAgICAgIHNMYXN0VXNlZFhtbE5hbWUucHV0KG1MYXN0VXNlZEtleSwgZGVzYy5nZXRYbWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9zdCB1c2VkIHN1Yi1lbGVtZW50IG5hbWUsIGlmIGFueSwgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNb3N0VXNlZFhtbE5hbWUoVWlFbGVtZW50Tm9kZSB1aV9ub2RlKSB7Ci0gICAgICAgIGlmICh1aV9ub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRyZWVNYXA8U3RyaW5nLCBJbnRlZ2VyPiBjb3VudHMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgICAgICBpbnQgbWF4ID0gLTE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSBjaGlsZCA6IHVpX25vZGUuZ2V0VWlDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpOwotICAgICAgICAgICAgICAgIEludGVnZXIgaSA9IGNvdW50cy5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gaSA9PSBudWxsID8gMSA6IGkuaW50VmFsdWUoKSArIDE7Ci0gICAgICAgICAgICAgICAgY291bnRzLnB1dChuYW1lLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtYXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBrZXkgd2l0aCB0aGlzIG1heCBhbmQgcmV0dXJuIGl0Ci0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIEludGVnZXI+IGVudHJ5IDogY291bnRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuaW50VmFsdWUoKSA9PSBtYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByb290IG5vZGUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIsIGVpdGhlciByb290IG5vZGUgb3IgdGhlCi0gICAgICogICAgICAgICBvbmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBpZiBub3QgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBnZXRDaG9zZW5Sb290Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9zZW5Sb290Tm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZnJvbQotICAgICAqIHRoZSBsaXN0IHZpZXcsIGlmIGFueS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotICAgICAgICBzZXRSZXN1bHQoQXJyYXlzLmFzTGlzdChnZXRTZWxlY3RlZEVsZW1lbnRzKCkpKTsKLSAgICAgICAgc2V0TGFzdFVzZWRYbWxOYW1lKGdldFNlbGVjdGVkRWxlbWVudHMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGlhbG9nIGFyZWEuCi0gICAgICogCi0gICAgICogRmlyc3QgYWRkIGEgcmFkaW8gYXJlYSwgd2hpY2ggbWF5IGJlIGVpdGhlciAyIHJhZGlvIGNvbnRyb2xzIG9yCi0gICAgICoganVzdCBhIG1lc3NhZ2UgYXJlYSBpZiB0aGVyZSdzIG9ubHkgb25lIGNob2ljZSAodGhlIGFwcCByb290IG5vZGUpLgotICAgICAqIAotICAgICAqIFRoZW4gdXNlcyB0aGUgZGVmYXVsdCBmcm9tIHRoZSBBYnN0cmFjdEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nCi0gICAgICogd2hpY2ggaXMgdG8gYWRkIGJvdGggYSBmaWx0ZXIgdGV4dCBhbmQgYSBmaWx0ZXJlZCBsaXN0LiBBZGRpbmcgYm90aAotICAgICAqIGlzIG5lY2Vzc2FyeSAoc2luY2UgdGhlIGJhc2UgY2xhc3MgYWNjZXNzZXMgYm90aCBpbnRlcm5hbCBkaXJlY3RseQotICAgICAqIGZpZWxkcyB3aXRob3V0IGNoZWNraW5nIGZvciBudWxsIHBvaW50ZXJzLikgCi0gICAgICogCi0gICAgICogRmluYWxseSBzZXRzIHRoZSBpbml0aWFsIHNlbGVjdGlvbiBsaXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29udGVudHMgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgY3JlYXRlUmFkaW9Db250cm9sKGNvbnRlbnRzKTsKLSAgICAgICAgY3JlYXRlRmlsdGVyVGV4dChjb250ZW50cyk7Ci0gICAgICAgIGNyZWF0ZUZpbHRlcmVkTGlzdChjb250ZW50cyk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBzdGF0ZS4KLSAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcmVkIGxpc3QgYXMgYmVlbiBjcmVhdGVkLgotICAgICAgICBjaG9vc2VOb2RlKG1DaG9zZW5Sb290Tm9kZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICAgIHNldEluaXRpYWxTZWxlY3Rpb24obUNob3NlblJvb3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBzZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSB7QGxpbmsgI21Jbml0aWFsWG1sTmFtZX0gY29tcHV0ZWQKLSAgICAgKiBpbiB0aGUgY29uc3RydWN0b3IuIFRoZSBzZWxlY3Rpb24gaXMgb25seSBzZXQgaWYgdGhlcmUncyBhbiBlbGVtZW50IGRlc2NyaXB0b3IKLSAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHNhbWUgZXhhY3QgWE1MIG5hbWUuIFdoZW4ge0BsaW5rICNtSW5pdGlhbFhtbE5hbWV9IHN0YXJ0cyB3aXRoIGFuCi0gICAgICogYXN0ZXJpc2ssIGl0IG1lYW5zIHRvIGRvIGEgcGFydGlhbCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIG9uIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgKiBzdHJpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKFVpRWxlbWVudE5vZGUgcm9vdE5vZGUpIHsKLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgaW5pdGlhbEVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIGlmIChtSW5pdGlhbFhtbE5hbWUgIT0gbnVsbCAmJiBtSW5pdGlhbFhtbE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1Jbml0aWFsWG1sTmFtZTsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFydGlhbCA9IG5hbWUuc3RhcnRzV2l0aCgiKiIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChwYXJ0aWFsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoRWxlbWVudERlc2NyaXB0b3IgZGVzYyA6IGdldEFsbG93ZWREZXNjcmlwdG9ycyhyb290Tm9kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcnRpYWwgJiYgZGVzYy5nZXRYbWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxFbGVtZW50ID0gZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0aWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiA9IGRlc2MuZ2V0WG1sTG9jYWxOYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChuYW1lMikgfHwgbmFtZTIuc3RhcnRzV2l0aChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEVsZW1lbnQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNldFNlbGVjdGlvbihpbml0aWFsRWxlbWVudCA9PSBudWxsID8gbnVsbCA6IG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsgaW5pdGlhbEVsZW1lbnQgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWVzc2FnZSB0ZXh0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLSAgICAgKiBAcGFyYW0gY29udGVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgbWVzc2FnZSBhcmVhLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVJhZGlvQ29udHJvbChDb21wb3NpdGUgY29udGVudCkgewotICAgICAgICAKLSAgICAgICAgaWYgKG1TZWxlY3RlZFVpTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdXR0b24gcmFkaW8xID0gbmV3IEJ1dHRvbihjb250ZW50LCBTV1QuUkFESU8pOwotICAgICAgICAgICAgcmFkaW8xLnNldFRleHQoU3RyaW5nLmZvcm1hdCgiQ3JlYXRlIGEgbmV3IGVsZW1lbnQgYXQgdGhlIHRvcCBsZXZlbCwgaW4gJTEkcy4iLAotICAgICAgICAgICAgICAgICAgICBtTG9jYWxSb290Tm9kZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkpKTsKLQotICAgICAgICAgICAgQnV0dG9uIHJhZGlvMiA9IG5ldyBCdXR0b24oY29udGVudCwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIHJhZGlvMi5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIkNyZWF0ZSBhIG5ldyBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCBlbGVtZW50LCAlMSRzLiIsCi0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFVpTm9kZS5nZXRCcmVhZGNydW1iVHJhaWxEZXNjcmlwdGlvbihmYWxzZSAvKiBpbmNsdWRlX3Jvb3QgKi8pKSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gYmVmb3JlIGFkZGluZyB0aGUgbGlzdGVuZXJzCi0gICAgICAgICAgICAvLyAodGhleSBjYW4ndCBiZSBydW4gdGlsbCB0aGUgZmlsdGVyZWQgbGlzdCBoYXMgYmVlbiBjcmVhdGVkKQotICAgICAgICAgICAgcmFkaW8xLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICByYWRpbzIuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgbUNob3NlblJvb3ROb2RlID0gbVNlbGVjdGVkVWlOb2RlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByYWRpbzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hvb3NlTm9kZShtTG9jYWxSb290Tm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJhZGlvMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgICAgICBjaG9vc2VOb2RlKG1TZWxlY3RlZFVpTm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKFN0cmluZy5mb3JtYXQoIkNyZWF0ZSBhIG5ldyBlbGVtZW50IGF0IHRoZSB0b3AgbGV2ZWwsIGluICUxJHMuIiwKLSAgICAgICAgICAgICAgICAgICAgbUxvY2FsUm9vdE5vZGUuZ2V0U2hvcnREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgICAgICBjcmVhdGVNZXNzYWdlQXJlYShjb250ZW50KTsKLQotICAgICAgICAgICAgbUNob3NlblJvb3ROb2RlID0gbUxvY2FsUm9vdE5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gcmVtZW1iZXIgdGhlIHJvb3Qgbm9kZSBjaG9vc2VuIGJ5IHRoZSB1c2VyLgotICAgICAqIEl0IGFsc28gc2V0cyB0aGUgbGlzdCB2aWV3IHRvIHRoZSBhZGVxdWF0ZSBsaXN0IG9mIGNoaWxkcmVuIHRoYXQgY2FuCi0gICAgICogYmUgYWRkZWQgdG8gdGhlIGNob3NlbiByb290IG5vZGUuCi0gICAgICogCi0gICAgICogSWYgdGhlIGNob3NlbiByb290IG5vZGUgaXMgbUxvY2FsUm9vdE5vZGUgYW5kIGEgZGVzY3JpcHRvciBmaWx0ZXIgd2FzIHNwZWNpZmllZAotICAgICAqIHdoZW4gY3JlYXRpbmcgdGhlIG1hc3Rlci1kZXRhaWwgcGFydCwgd2UgdXNlIHRoaXMgYXMgdGhlIHNldCBvZiBub2RlcyB0aGF0Ci0gICAgICogY2FuIGJlIGNyZWF0ZWQgb24gdGhlIHJvb3Qgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdWlfbm9kZSBUaGUgY2hvc2VuIHJvb3Qgbm9kZSwgZWl0aGVyIG1Mb2NhbFJvb3ROb2RlIG9yCi0gICAgICogICAgICAgICAgICAgICAgbVNlbGVjdGVkVWlOb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaG9vc2VOb2RlKFVpRWxlbWVudE5vZGUgdWlfbm9kZSkgewotICAgICAgICBtQ2hvc2VuUm9vdE5vZGUgPSB1aV9ub2RlOwotICAgICAgICBzZXRMaXN0RWxlbWVudHMoZ2V0QWxsb3dlZERlc2NyaXB0b3JzKHVpX25vZGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn1zIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBnaXZlbgotICAgICAqIFVJIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVpX25vZGUgVGhlIFVJIG5vZGUgdG8gd2hpY2ggZWxlbWVudCBzaG91bGQgYmUgYWRkZWQuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gQSBub24tbnVsbCBhcnJheSBvZiB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9LiBUaGUgYXJyYXkgbWlnaHQgYmUgZW1wdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvcltdIGdldEFsbG93ZWREZXNjcmlwdG9ycyhVaUVsZW1lbnROb2RlIHVpX25vZGUpIHsKLSAgICAgICAgaWYgKHVpX25vZGUgPT0gbUxvY2FsUm9vdE5vZGUgJiYgCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3JGaWx0ZXJzICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvckZpbHRlcnMubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvckZpbHRlcnM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdWlfbm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvUGFzdGVBY3Rpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvUGFzdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlNTJjNC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1Bhc3RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIFBhc3RlIG9wZXJhdGlvbiBmb3IgdGhlIHRyZWUgbm9kZXMKLSAqLwotcHVibGljIGNsYXNzIFBhc3RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgbVVpTm9kZTsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRFZGl0b3IgbUVkaXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIENsaXBib2FyZCBtQ2xpcGJvYXJkOwotCi0gICAgcHVibGljIFBhc3RlQWN0aW9uKEFuZHJvaWRFZGl0b3IgZWRpdG9yLCBDbGlwYm9hcmQgY2xpcGJvYXJkLCBVaUVsZW1lbnROb2RlIHVpX25vZGUpIHsKLSAgICAgICAgc3VwZXIoIlBhc3RlIik7Ci0gICAgICAgIG1FZGl0b3IgPSBlZGl0b3I7Ci0gICAgICAgIG1DbGlwYm9hcmQgPSBjbGlwYm9hcmQ7Ci0KLSAgICAgICAgSVNoYXJlZEltYWdlcyBpbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0gICAgICAgIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURSkpOwotICAgICAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBpbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEVfRElTQUJMRUQpKTsKLQotICAgICAgICBtVWlOb2RlID0gdWlfbm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgcGFzdGUgb3BlcmF0aW9uLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgc3VwZXIucnVuKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IChTdHJpbmcpIG1DbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbUVkaXRvci5nZXRNb2RlbEZvckVkaXQoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWREb2N1bWVudCBzc2VfZG9jID0gbUVkaXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3NlX2RvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVWlOb2RlLmdldERlc2NyaXB0b3IoKS5oYXNDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIFVJIE5vZGUgY2FuIGhhdmUgY2hpbGRyZW4uIFRoZSBuZXcgWE1MIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnRlZCBhcyB0aGUgZmlyc3QgY2hpbGQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVWlOb2RlLmdldFVpQ2hpbGRyZW4oKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBhbHJlYWR5IGF0IGxlYXN0IG9uZSBjaGlsZCwgc28gaW5zZXJ0IHJpZ2h0IGJlZm9yZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHhtbF9ub2RlID0gbVVpTm9kZS5nZXRVaUNoaWxkcmVuKCkuZ2V0KDApLmdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sX25vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7IC8vIGltcGxpZXMgeG1sX25vZGUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSB4bWxfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NlX2RvYy5yZXBsYWNlKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCAwLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyB3ZSdyZSBkb25lLCBubyBuZWVkIHRvIHRyeSB0aGUgb3RoZXIgY2FzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBmaXJzdCBYTUwgbm9kZSBjaGlsZC4gQ3JlYXRlIG9uZSBieQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlICpzdGFydCogdGFnLgotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB4bWxfbm9kZSA9IG1VaU5vZGUuZ2V0WG1sTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbF9ub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVDb250YWluZXIgY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHhtbF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRfdGFnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X3RhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzZV9kb2MucmVwbGFjZShzdGFydF90YWcuZ2V0RW5kT2Zmc2V0KCksIDAsIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHdlJ3JlIGRvbmUsIG5vIG5lZWQgdG8gdHJ5IHRoZSBvdGhlciBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIFVJIE5vZGUgZG9lc24ndCBhY2NlcHQgY2hpbGRyZW4uIFRoZSBuZXcgWE1MIGlzIGluc2VydGVkIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHNpYmxpbmcuIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSBmYWxsYmFjayBpZiBhbGwgdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRzIGZhaWxlZC4gSG93ZXZlciwgdGhpcyBpcyBub3QgcG9zc2libGUgaWYgdGhlIGN1cnJlbnQgbm9kZQotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZm9yIHBhcmVudCBhIGRvY3VtZW50IC0tIGFuIFhNTCBkb2N1bWVudCBjYW4gb25seSBoYXZlIG9uZSByb290LAotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG5vIHNpYmxpbmdzLgotICAgICAgICAgICAgICAgICAgICBpZiAoIShtVWlOb2RlLmdldFVpUGFyZW50KCkgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgeG1sX25vZGUgPSBtVWlOb2RlLmdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxfbm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSB4bWxfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2VfZG9jLnJlcGxhY2UocmVnaW9uLmdldEVuZE9mZnNldCgpLCAwLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlBhcnNlQWN0aW9uIGZhaWxlZCBmb3IgVUkgTm9kZSAlMiRzLCBjb250ZW50ICclMSRzJyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VaU5vZGUuZ2V0QnJlYWRjcnVtYlRyYWlsRGVzY3JpcHRpb24odHJ1ZSksIGRhdGEpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaUFjdGlvbnMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvVWlBY3Rpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmRiMWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaUFjdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlEb2N1bWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFBlcmZvcm1zIGJhc2ljIGFjdGlvbnMgb24gYW4gWE1MIHRyZWU6IGFkZCBub2RlLCByZW1vdmUgbm9kZSwgbW92ZSB1cC9kb3duLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVWlBY3Rpb25zIGltcGxlbWVudHMgSUNvbW1pdFhtbCB7Ci0KLSAgICBwdWJsaWMgVWlBY3Rpb25zKCkgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWN0dWFsIGltcGxlbWVudGF0aW9ucyBtdXN0IG92ZXJyaWRlIHRoZXNlIHRvIHByb3ZpZGUgc3BlY2lmaWMgaG9va3MKLQotICAgIC8qKiBSZXR1cm5zIHRoZSBVaURvY3VtZW50Tm9kZSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIFVpRWxlbWVudE5vZGUgZ2V0Um9vdE5vZGUoKTsKLQotICAgIC8qKiBDb21taXRzIHBlbmRpbmcgZGF0YSBiZWZvcmUgdGhlIFhNTCBtb2RlbCBpcyBtb2RpZmllZC4gKi8KLSAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBjb21taXRQZW5kaW5nWG1sQ2hhbmdlcygpOwotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gc2VsZWN0IGFuIG91dGxpbmUgaXRlbSBiYXNlZCBvbiBpdHMgbW9kZWwgbm9kZQotICAgICAqIAotICAgICAqIEBwYXJhbSB1aU5vZGUgVGhlIG5vZGUgdG8gc2VsZWN0LiBDYW4gYmUgbnVsbCAoaW4gd2hpY2ggY2FzZSBub3RoaW5nIHNob3VsZCBoYXBwZW4pCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2VsZWN0VWlOb2RlKFVpRWxlbWVudE5vZGUgdWlOb2RlKTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgIkFkZC4uLiIgYnV0dG9uIG5leHQgdG8gdGhlIHRyZWUgdmlldyBpcyBzZWxlY3RlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBzaW1wbGlmaWVkIHZlcnNpb24gb2YgZG9BZGQgZG9lcyBub3Qgc3VwcG9ydCBkZXNjcmlwdG9yIGZpbHRlcnMgYW5kIGNyZWF0ZXMKLSAgICAgKiBhIG5ldyB7QGxpbmsgVWlNb2RlbFRyZWVMYWJlbFByb3ZpZGVyfSBmb3IgZWFjaCBjYWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvQWRkKFVpRWxlbWVudE5vZGUgdWlOb2RlLCBTaGVsbCBzaGVsbCkgewotICAgICAgICBkb0FkZCh1aU5vZGUsIG51bGwgLyogZGVzY3JpcHRvckZpbHRlcnMgKi8sIHNoZWxsLCBuZXcgVWlNb2RlbFRyZWVMYWJlbFByb3ZpZGVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgIkFkZC4uLiIgYnV0dG9uIG5leHQgdG8gdGhlIHRyZWUgdmlldyBpcyBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBEaXNwbGF5cyBhIHNlbGVjdGlvbiBkaWFsb2cgdGhhdCBsZXRzIHRoZSB1c2VyIHNlbGVjdCB3aGljaCBraW5kIG9mIG5vZGUKLSAgICAgKiB0byBjcmVhdGUsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9BZGQoVWlFbGVtZW50Tm9kZSB1aU5vZGUsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JGaWx0ZXJzLAotICAgICAgICAgICAgU2hlbGwgc2hlbGwsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLSAgICAgICAgLy8gSWYgdGhlIHJvb3Qgbm9kZSBpcyBhIGRvY3VtZW50IHdpdGggYWxyZWFkeSBhIHJvb3QsIHVzZSBpdCBhcyB0aGUgcm9vdCBub2RlCi0gICAgICAgIFVpRWxlbWVudE5vZGUgcm9vdE5vZGUgPSBnZXRSb290Tm9kZSgpOwotICAgICAgICBpZiAocm9vdE5vZGUgaW5zdGFuY2VvZiBVaURvY3VtZW50Tm9kZSAmJiByb290Tm9kZS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcm9vdE5vZGUgPSByb290Tm9kZS5nZXRVaUNoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgTmV3SXRlbVNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTmV3SXRlbVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICBzaGVsbCwKLSAgICAgICAgICAgICAgICBsYWJlbFByb3ZpZGVyLAotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JGaWx0ZXJzLAotICAgICAgICAgICAgICAgIHVpTm9kZSwgcm9vdE5vZGUpOwotICAgICAgICBkbGcub3BlbigpOwotICAgICAgICBPYmplY3RbXSByZXN1bHRzID0gZGxnLmdldFJlc3VsdCgpOwotICAgICAgICBpZiAocmVzdWx0cyAhPSBudWxsICYmIHJlc3VsdHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgYWRkRWxlbWVudChkbGcuZ2V0Q2hvc2VuUm9vdE5vZGUoKSwgbnVsbCwgKEVsZW1lbnREZXNjcmlwdG9yKSByZXN1bHRzWzBdLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qdXBkYXRlTGF5b3V0Ki8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBYTUwgZWxlbWVudCBiYXNlZCBvbiB0aGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSB0byB0aGUgZ2l2ZW4gcGFyZW50Ci0gICAgICoge0BsaW5rIFVpRWxlbWVudE5vZGV9LCBhbmQgdGhlbiBzZWxlY3QgaXQuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBwYXJlbnQgaXMgYSBkb2N1bWVudCByb290IHdoaWNoIGFscmVhZHkgY29udGFpbnMgYSByb290IGVsZW1lbnQsIHRoZSBpbm5lcgotICAgICAqIHJvb3QgZWxlbWVudCBpcyB1c2VkIGFzIHRoZSBhY3R1YWwgcGFyZW50LiBUaGlzIGVuc3VyZSB5b3UgY2FuJ3QgY3JlYXRlIGEgYnJva2VuCi0gICAgICogWE1MIGZpbGUgd2l0aCBtb3JlIHRoYW4gb25lIHJvb3QgZWxlbWVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgYSBzaWJsaW5nIGlzIGdpdmVuIGFuZCB0aGF0IHNpYmxpbmcgaGFzIHRoZSBzYW1lIHBhcmVudCwgdGhlIG5ldyBub2RlIGlzIGFkZGVkCi0gICAgICogcmlnaHQgYWZ0ZXIgdGhhdCBzaWJsaW5nLiBPdGhlcndpc2UgdGhlIG5ldyBub2RlIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudAotICAgICAqIGNoaWxkIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVpUGFyZW50IEFuIGV4aXN0aW5nIFVJIG5vZGUgb3IgbnVsbCB0byBhZGQgdG8gdGhlIHRyZWUgcm9vdAotICAgICAqIEBwYXJhbSB1aVNpYmxpbmcgQW4gZXhpc3RpbmcgVUkgbm9kZSBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBuZXcgbm9kZS4gQ2FuIGJlIG51bGwuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVsZW1lbnQgdG8gYWRkCi0gICAgICogQHBhcmFtIHVwZGF0ZUxheW91dCBUcnVlIGlmIGxheW91dCBhdHRyaWJ1dGVzIHNob3VsZCBiZSBzZXQKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcge0BsaW5rIFVpRWxlbWVudE5vZGV9IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgYWRkRWxlbWVudChVaUVsZW1lbnROb2RlIHVpUGFyZW50LAotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aVNpYmxpbmcsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVMYXlvdXQpIHsKLSAgICAgICAgaWYgKHVpUGFyZW50IGluc3RhbmNlb2YgVWlEb2N1bWVudE5vZGUgJiYgdWlQYXJlbnQuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHVpUGFyZW50ID0gdWlQYXJlbnQuZ2V0VWlDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodWlTaWJsaW5nICE9IG51bGwgJiYgdWlTaWJsaW5nLmdldFVpUGFyZW50KCkgIT0gdWlQYXJlbnQpIHsKLSAgICAgICAgICAgIHVpU2libGluZyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBVaUVsZW1lbnROb2RlIHVpTmV3ID0gYWRkTmV3VHJlZUVsZW1lbnQodWlQYXJlbnQsIHVpU2libGluZywgZGVzY3JpcHRvciwgdXBkYXRlTGF5b3V0KTsKLSAgICAgICAgc2VsZWN0VWlOb2RlKHVpTmV3KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB1aU5ldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgIlJlbW92ZSIgYnV0dG9uIGlzIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIElmIHRoZSB0cmVlIGhhcyBhIHNlbGVjdGlvbiwgcmVtb3ZlIGl0LgotICAgICAqIFRoaXMgc2ltcGx5IGRlbGV0ZXMgdGhlIFhNTCBub2RlIGF0dGFjaGVkIHRvIHRoZSBVSSBub2RlOiB3aGVuIHRoZSBYTUwgbW9kZWwgZmlyZXMgdGhlCi0gICAgICogdXBkYXRlIGV2ZW50LCB0aGUgdHJlZSB3aWxsIGdldCByZWZyZXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9SZW1vdmUoZmluYWwgTGlzdDxVaUVsZW1lbnROb2RlPiBub2RlcywgU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGludCBsZW4gPSBub2Rlcy5zaXplKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIG5vZGUgOiBub2RlcykgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJcbi0gIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNiLmFwcGVuZChub2RlLmdldEJyZWFkY3J1bWJUcmFpbERlc2NyaXB0aW9uKGZhbHNlIC8qIGluY2x1ZGVfcm9vdCAqLykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsCi0gICAgICAgICAgICAgICAgbGVuID4gMSA/ICJSZW1vdmUgZWxlbWVudHMgZnJvbSBBbmRyb2lkIFhNTCIgIC8vIHRpdGxlCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICJSZW1vdmUgZWxlbWVudCBmcm9tIEFuZHJvaWQgWE1MIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVtb3ZlICUxJHM/Iiwgc2IudG9TdHJpbmcoKSkpKSB7Ci0gICAgICAgICAgICBjb21taXRQZW5kaW5nWG1sQ2hhbmdlcygpOwotICAgICAgICAgICAgZ2V0Um9vdE5vZGUoKS5nZXRFZGl0b3IoKS5lZGl0WG1sTW9kZWwobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBwcmV2aW91cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgcGFyZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgbm9kZSA9IG5vZGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbm9kZS5nZXRVaVByZXZpb3VzU2libGluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5nZXRVaVBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgbm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWxldGVYbWxOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzZWxlY3QgdGhlIGxhc3QgcHJldmlvdXMgc2libGluZyBvciB0aGUgbGFzdCBwYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFVpTm9kZShwcmV2aW91cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFVpTm9kZShwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgIlVwIiBidXR0b24gaXMgc2VsZWN0ZWQuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSB0cmVlIGhhcyBhIHNlbGVjdGlvbiwgbW92ZSBpdCB1cCwgZWl0aGVyIGluIHRoZSBjaGlsZCBsaXN0IG9yIGFzIHRoZSBsYXN0IGNoaWxkCi0gICAgICogb2YgdGhlIHByZXZpb3VzIHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1VwKGZpbmFsIExpc3Q8VWlFbGVtZW50Tm9kZT4gbm9kZXMpIHsKLSAgICAgICAgaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuc2l6ZSgpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBOb2RlW10gc2VsZWN0X3htbF9ub2RlID0geyBudWxsIH07Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgbGFzdF9ub2RlID0gbnVsbDsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBzZWFyY2hfcm9vdCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBVaUVsZW1lbnROb2RlIG5vZGUgPSBsYXN0X25vZGUgPSBub2Rlcy5nZXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBub2RlIHdpbGwgbW92ZSBlaXRoZXIgdXAgdG8gaXRzIHBhcmVudCBvciBncmFuZC1wYXJlbnQKLSAgICAgICAgICAgIHNlYXJjaF9yb290ID0gbm9kZS5nZXRVaVBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHNlYXJjaF9yb290ICE9IG51bGwgJiYgc2VhcmNoX3Jvb3QuZ2V0VWlQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VhcmNoX3Jvb3QgPSBzZWFyY2hfcm9vdC5nZXRVaVBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgY29tbWl0UGVuZGluZ1htbENoYW5nZXMoKTsKLSAgICAgICAgICAgIGdldFJvb3ROb2RlKCkuZ2V0RWRpdG9yKCkuZWRpdFhtbE1vZGVsKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGUgeG1sX25vZGUgPSBub2RlLmdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhtbF9ub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgeG1sX3BhcmVudCA9IHhtbF9ub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxfcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpX3ByZXYgPSBub2RlLmdldFVpUHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpX3ByZXYgIT0gbnVsbCAmJiB1aV9wcmV2LmdldFhtbE5vZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBub3QgdGhlIGZpcnN0IG9uZSBvZiB0aGUgcGFyZW50LCBzbyBpdCBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCBhbmQgdGhlbiBpbnNlcnRlZCBiZWZvcmUgaXRzIHByZXZpb3VzIHNpYmxpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzaWJsaW5nIGNhbiBoYXZlIGNoaWxkcmVuLCB0aG91Z2gsIHRoZW4gaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY2hpbGRyZW4gbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB4bWxfcHJldiA9IHVpX3ByZXYuZ2V0WG1sTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWlfcHJldi5nZXREZXNjcmlwdG9yKCkuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX3ByZXYuYXBwZW5kQ2hpbGQoeG1sX3BhcmVudC5yZW1vdmVDaGlsZCh4bWxfbm9kZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3htbF9ub2RlWzBdID0geG1sX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxfcGFyZW50Lmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX3BhcmVudC5yZW1vdmVDaGlsZCh4bWxfbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9wcmV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdF94bWxfbm9kZVswXSA9IHhtbF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKHhtbF9wYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9wYXJlbnQuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoeG1sX3BhcmVudC5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgdGhlIGZpcnN0IG9uZSBvZiB0aGUgY2hpbGQgbGlzdCBvZiBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50LCBtb3ZlIGl0IHVwIGluIHRoZSBoaWVyYXJjaHkgYXMgcHJldmlvdXMgc2libGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgcGFyZW50LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHBhcmVudCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGlzIG5vdCBhIGRvY3VtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGdyYW5kX3BhcmVudCA9IHhtbF9wYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZF9wYXJlbnQuaW5zZXJ0QmVmb3JlKHhtbF9wYXJlbnQucmVtb3ZlQ2hpbGQoeG1sX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9wYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RfeG1sX25vZGVbMF0gPSB4bWxfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWxlY3RfeG1sX25vZGVbMF0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIFhNTCBub2RlIGhhcyBub3QgYmVlbiBtb3ZlZCwgd2UgY2FuIGp1c3Qgc2VsZWN0IHRoZSBzYW1lIFVJIG5vZGUKLSAgICAgICAgICAgIHNlbGVjdFVpTm9kZShsYXN0X25vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlIFhNTCBub2RlIGhhcyBtb3ZlZC4gQXQgdGhpcyBwb2ludCB0aGUgVUkgbW9kZWwgaGFzIGJlZW4gcmVsb2FkZWQKLSAgICAgICAgICAgIC8vIGFuZCB0aGUgWE1MIG5vZGUgaGFzIGJlZW4gYWZmZWN0ZWQgdG8gYSBuZXcgVUkgbm9kZS4gRmluZCB0aGF0IG5ldyBVSQotICAgICAgICAgICAgLy8gbm9kZSBhbmQgc2VsZWN0IGl0LgotICAgICAgICAgICAgaWYgKHNlYXJjaF9yb290ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWFyY2hfcm9vdCA9IGxhc3Rfbm9kZS5nZXRVaVJvb3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWFyY2hfcm9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0VWlOb2RlKHNlYXJjaF9yb290LmZpbmRYbWxOb2RlKHNlbGVjdF94bWxfbm9kZVswXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlICJEb3duIiBidXR0b24gaXMgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogSWYgdGhlIHRyZWUgaGFzIGEgc2VsZWN0aW9uLCBtb3ZlIGl0IGRvd24sIGVpdGhlciBpbiB0aGUgc2FtZSBjaGlsZCBsaXN0IG9yIGFzIHRoZQotICAgICAqIGZpcnN0IGNoaWxkIG9mIHRoZSBuZXh0IHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0Rvd24oZmluYWwgTGlzdDxVaUVsZW1lbnROb2RlPiBub2RlcykgewotICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5zaXplKCkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIE5vZGVbXSBzZWxlY3RfeG1sX25vZGUgPSB7IG51bGwgfTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBsYXN0X25vZGUgPSBudWxsOwotICAgICAgICBVaUVsZW1lbnROb2RlIHNlYXJjaF9yb290ID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gbm9kZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFVpRWxlbWVudE5vZGUgbm9kZSA9IGxhc3Rfbm9kZSA9IG5vZGVzLmdldChpKTsKLSAgICAgICAgICAgIC8vIHRoZSBub2RlIHdpbGwgbW92ZSBlaXRoZXIgZG93biB0byBpdHMgcGFyZW50IG9yIGdyYW5kLXBhcmVudAotICAgICAgICAgICAgc2VhcmNoX3Jvb3QgPSBub2RlLmdldFVpUGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoc2VhcmNoX3Jvb3QgIT0gbnVsbCAmJiBzZWFyY2hfcm9vdC5nZXRVaVBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWFyY2hfcm9vdCA9IHNlYXJjaF9yb290LmdldFVpUGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBjb21taXRQZW5kaW5nWG1sQ2hhbmdlcygpOwotICAgICAgICAgICAgZ2V0Um9vdE5vZGUoKS5nZXRFZGl0b3IoKS5lZGl0WG1sTW9kZWwobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSB4bWxfbm9kZSA9IG5vZGUuZ2V0WG1sTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sX25vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB4bWxfcGFyZW50ID0geG1sX25vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbF9wYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlOZXh0ID0gbm9kZS5nZXRVaU5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpTmV4dCAhPSBudWxsICYmIHVpTmV4dC5nZXRYbWxOb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgbm90IHRoZSBsYXN0IG9uZSBvZiB0aGUgcGFyZW50LCBzbyBpdCBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCBhbmQgdGhlbiBpbnNlcnRlZCBhZnRlciBpdHMgbmV4dCBzaWJsaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBzaWJsaW5nIGlzIGEgbm9kZSB0aGF0IGNhbiBoYXZlIGNoaWxkcmVuLCB0aG91Z2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhlIG5vZGUgaXMgaW5zZXJ0ZWQgYXMgdGhlIGZpcnN0IGNoaWxkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHhtbF9uZXh0ID0gdWlOZXh0LmdldFhtbE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpTmV4dC5nZXREZXNjcmlwdG9yKCkuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogaW5zZXJ0QmVmb3JlIHdvcmtzIGFzIGFwcGVuZCBpZiB0aGUgcmVmIG5vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bGwsIGkuZS4gd2hlbiB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgY2hpbGRyZW4geWV0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX25leHQuaW5zZXJ0QmVmb3JlKHhtbF9wYXJlbnQucmVtb3ZlQ2hpbGQoeG1sX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxfbmV4dC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3htbF9ub2RlWzBdID0geG1sX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgImJlZm9yZSBhZnRlciBuZXh0IiA7LSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9wYXJlbnQuaW5zZXJ0QmVmb3JlKHhtbF9wYXJlbnQucmVtb3ZlQ2hpbGQoeG1sX25vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxfbmV4dC5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdF94bWxfbm9kZVswXSA9IHhtbF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKHhtbF9wYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9wYXJlbnQuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoeG1sX3BhcmVudC5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIHRoZSBsYXN0IG5vZGUgb2YgaXRzIHBhcmVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmVpdGhlciB0aGUgcGFyZW50IG5vciB0aGUgZ3JhbmRwYXJlbnQgaXMgYSBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGUgbm9kZSBjYW4gYmUgaW5zZXJ0IHJpZ2h0IGFmdGVyIHRoZSBwYXJlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgZ3JhbmRfcGFyZW50ID0geG1sX3BhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kX3BhcmVudC5pbnNlcnRCZWZvcmUoeG1sX3BhcmVudC5yZW1vdmVDaGlsZCh4bWxfbm9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX3BhcmVudC5nZXROZXh0U2libGluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3htbF9ub2RlWzBdID0geG1sX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VsZWN0X3htbF9ub2RlWzBdID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSBYTUwgbm9kZSBoYXMgbm90IGJlZW4gbW92ZWQsIHdlIGNhbiBqdXN0IHNlbGVjdCB0aGUgc2FtZSBVSSBub2RlCi0gICAgICAgICAgICBzZWxlY3RVaU5vZGUobGFzdF9ub2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBYTUwgbm9kZSBoYXMgbW92ZWQuIEF0IHRoaXMgcG9pbnQgdGhlIFVJIG1vZGVsIGhhcyBiZWVuIHJlbG9hZGVkCi0gICAgICAgICAgICAvLyBhbmQgdGhlIFhNTCBub2RlIGhhcyBiZWVuIGFmZmVjdGVkIHRvIGEgbmV3IFVJIG5vZGUuIEZpbmQgdGhhdCBuZXcgVUkKLSAgICAgICAgICAgIC8vIG5vZGUgYW5kIHNlbGVjdCBpdC4KLSAgICAgICAgICAgIGlmIChzZWFyY2hfcm9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VhcmNoX3Jvb3QgPSBsYXN0X25vZGUuZ2V0VWlSb290KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VhcmNoX3Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlbGVjdFVpTm9kZShzZWFyY2hfcm9vdC5maW5kWG1sTm9kZShzZWxlY3RfeG1sX25vZGVbMF0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yJ3MgdHlwZSB0byB0aGUgZ2l2ZW4gVUkgcGFyZW50IG5vZGUuCi0gICAgICogCi0gICAgICogVGhpcyBhY3R1YWxseSBjcmVhdGVzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBub2RlIGluIHRoZSBYTUwgbW9kZWwsIHdoaWNoIGluIHR1cm4KLSAgICAgKiB3aWxsIHJlZnJlc2ggdGhlIGN1cnJlbnQgdHJlZSB2aWV3LgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gdWlQYXJlbnQgQW4gZXhpc3RpbmcgVUkgbm9kZSBvciBudWxsIHRvIGFkZCB0byB0aGUgdHJlZSByb290Ci0gICAgICogQHBhcmFtIHVpU2libGluZyBBbiBleGlzdGluZyBVSSBub2RlIHRvIGluc2VydCByaWdodCBiZWZvcmUuIENhbiBiZSBudWxsLiAKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZWxlbWVudCB0byBhZGQKLSAgICAgKiBAcGFyYW0gdXBkYXRlTGF5b3V0IFRydWUgaWYgbGF5b3V0IGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHNldAotICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBVaUVsZW1lbnROb2RlfSB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBVSSB0cmVlLgotICAgICAqLwotICAgIHByaXZhdGUgVWlFbGVtZW50Tm9kZSBhZGROZXdUcmVlRWxlbWVudChVaUVsZW1lbnROb2RlIHVpUGFyZW50LAotICAgICAgICAgICAgZmluYWwgVWlFbGVtZW50Tm9kZSB1aVNpYmxpbmcsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQpIHsKLSAgICAgICAgY29tbWl0UGVuZGluZ1htbENoYW5nZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSB1aUNoaWxkIDogdWlQYXJlbnQuZ2V0VWlDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAodWlDaGlsZCA9PSB1aVNpYmxpbmcpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFVpRWxlbWVudE5vZGUgdWlOZXcgPSB1aVBhcmVudC5pbnNlcnROZXdVaUNoaWxkKGluZGV4LCBkZXNjcmlwdG9yKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSByb290Tm9kZSA9IGdldFJvb3ROb2RlKCk7Ci0KLSAgICAgICAgcm9vdE5vZGUuZ2V0RWRpdG9yKCkuZWRpdFhtbE1vZGVsKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yc1V0aWxzLnNldERlZmF1bHRMYXlvdXRBdHRyaWJ1dGVzKHVpTmV3LCB1cGRhdGVMYXlvdXQpOwotICAgICAgICAgICAgICAgIE5vZGUgeG1sTm9kZSA9IHVpTmV3LmNyZWF0ZVhtbE5vZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB1aU5ldzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1VpRWxlbWVudERldGFpbC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaUVsZW1lbnREZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjMzg3MC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1VpRWxlbWVudERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5YbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuU2VjdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5TZWN0aW9uSGVscGVyLk1hbmlmZXN0U2VjdGlvblBhcnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5JVWlVcGRhdGVMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpQXR0cmlidXRlTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JRXhwYW5zaW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi0vKioKLSAqIERldGFpbHMgcGFnZSBmb3IgdGhlIHtAbGluayBVaUVsZW1lbnROb2RlfSBub2RlcyBpbiB0aGUgdHJlZSB2aWV3LgotICogPHAvPgotICogU2VlIElEZXRhaWxzQmFzZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1jbGFzcyBVaUVsZW1lbnREZXRhaWwgaW1wbGVtZW50cyBJRGV0YWlsc1BhZ2UgewotCi0gICAgLyoqIFRoZSBtYXN0ZXItZGV0YWlsIHBhcnQsIGNvbXBvc2VkIG9mIGEgbWFpbiB0cmVlIGFuZCBhbiBhdXhpbGlhcnkgZGV0YWlsIHBhcnQgKi8KLSAgICBwcml2YXRlIE1hbmlmZXN0U2VjdGlvblBhcnQgbU1hc3RlclBhcnQ7Ci0KLSAgICBwcml2YXRlIFNlY3Rpb24gbU1hc3RlclNlY3Rpb247Ci0gICAgcHJpdmF0ZSBVaUVsZW1lbnROb2RlIG1DdXJyZW50VWlFbGVtZW50Tm9kZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtQ3VycmVudFRhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEaXJ0eTsKLQotICAgIHByaXZhdGUgSU1hbmFnZWRGb3JtIG1NYW5hZ2VkRm9ybTsKLQotICAgIHByaXZhdGUgZmluYWwgVWlUcmVlQmxvY2sgbVRyZWU7Ci0gICAgCi0gICAgcHVibGljIFVpRWxlbWVudERldGFpbChVaVRyZWVCbG9jayB0cmVlKSB7Ci0gICAgICAgIG1UcmVlID0gdHJlZTsKLSAgICAgICAgbU1hc3RlclBhcnQgPSBtVHJlZS5nZXRNYXN0ZXJQYXJ0KCk7Ci0gICAgICAgIG1NYW5hZ2VkRm9ybSA9IG1NYXN0ZXJQYXJ0LmdldE1hbmFnZWRGb3JtKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJTWFuYWdlZEZvcm0gZm9ybSkgewotICAgICAgICBtTWFuYWdlZEZvcm0gPSBmb3JtOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgaW4gdGhlIHByb3ZpZGVkIHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1NYXN0ZXJTZWN0aW9uID0gY3JlYXRlTWFzdGVyU2VjdGlvbihwYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHByb3ZpZGVkIHBhcnQgaGFzIGNoYW5nZWQgc2VsZWN0aW9uIHN0YXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBPbmx5IHJlcGx5IHdoZW4gb3VyIG1hc3RlciBwYXJ0IG9yaWdpbmF0ZXMgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElGb3JtUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAocGFydCA9PSBtTWFzdGVyUGFydCAmJgotICAgICAgICAgICAgICAgICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElUcmVlU2VsZWN0aW9uIHRyZWVfc2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLSAgICAgICAgICAgIE9iamVjdCBmaXJzdCA9IHRyZWVfc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlfbm9kZSA9IChVaUVsZW1lbnROb2RlKSBmaXJzdDsKLSAgICAgICAgICAgICAgICBjcmVhdGVVaUF0dHJpYnV0ZUNvbnRyb2xzKG1NYW5hZ2VkRm9ybSwgdWlfbm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIEluc3RydWN0cyBpdCB0byBjb21taXQgdGhlIG5ldyAobW9kaWZpZWQpIGRhdGEgYmFjayBpbnRvIHRoZSBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpIHsKLSAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtVHJlZS5nZXRFZGl0b3IoKS5nZXRNb2RlbEZvckVkaXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgbW9kZWwgd2UncmUgYWJvdXQgdG8gY2hhbmdlIGRhdGEuLi4KLSAgICAgICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRVaUVsZW1lbnROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFVpRWxlbWVudE5vZGUuY29tbWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpbmFsbHkgcmVzZXQgdGhlIGRpcnR5IGZsYWcgaWYgZXZlcnl0aGluZyB3YXMgc2F2ZWQgcHJvcGVybHkKLSAgICAgICAgICAgIG1Jc0RpcnR5ID0gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJEZXRhaWwgbm9kZSBmYWlsZWQgdG8gY29tbWl0IFhNTCBhdHRyaWJ1dGUhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgbW9kZWwgd2UncmUgZG9uZSBtb2RpZnlpbmcgaXQuIFRoaXMgbXVzdCAqYWx3YXlzKiBiZSBleGVjdXRlZC4KLSAgICAgICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotICAgICAgICAgICAgbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFydCBoYXMgYmVlbiBtb2RpZmllZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGRhdGEKLSAgICAgKiBsb2FkZWQgZnJvbSB0aGUgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VWlFbGVtZW50Tm9kZSAhPSBudWxsICYmIG1DdXJyZW50VWlFbGVtZW50Tm9kZS5pc0RpcnR5KCkpIHsKLSAgICAgICAgICAgIG1hcmtEaXJ0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtSXNEaXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1hc3RlciBwYXJ0IHdoZW4gdGhlIHRyZWUgaXMgcmVmcmVzaGVkIGFmdGVyIHRoZSBmcmFtZXdvcmsgcmVzb3VyY2VzCi0gICAgICogaGF2ZSBiZWVuIHJlbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudFRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VGFibGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgbUN1cnJlbnRUYWJsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRVaUVsZW1lbnROb2RlID0gbnVsbDsKLSAgICAgICAgbU1hc3RlclNlY3Rpb24uZ2V0UGFyZW50KCkucGFjayh0cnVlIC8qIGNoYW5nZWQgKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Rm9ybUlucHV0KE9iamVjdCBpbnB1dCkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgVGFibGVXcmFwTGF5b3V0IGluIHRoZSBEZXRhaWxzUGFnZSwgd2hpY2ggaW4gdHVybnMgY29udGFpbnMgYSBTZWN0aW9uLgotICAgICAqIAotICAgICAqIEFsbCB0aGUgVUkgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gYSBsYXlvdXQgd2hpY2ggcGFyZW50IGlzIHRoZSBtU2VjdGlvbiBpdHNlbGYuCi0gICAgICogVGhlIGhpZXJhcmNoeSBpczoKLSAgICAgKiA8cHJlPgotICAgICAqIERldGFpbFBhZ2UKLSAgICAgKiArIFRhYmxlV3JhcExheW91dAotICAgICAqICAgKyBTZWN0aW9uICh3aXRoIHRpdGxlL2Rlc2NyaXB0aW9uICYmIGZpbGxfZ3JhYiBob3Jpem9udGFsKQotICAgICAqICAgICArIFRhYmxlV3JhcExheW91dCBbKl0KLSAgICAgKiAgICAgICArIExhYmVscy9Gb3Jtcy9ldGMuLi4gWypdCi0gICAgICogPC9wcmU+Ci0gICAgICogQm90aCBpdGVtcyBtYXJrZWQgd2l0aCBbKl0gYXJlIGNyZWF0ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3NlcyB0byBmaXQgdGhlaXIgbmVlZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgb2YgdGhlIG1TZWN0aW9uIChmcm9tIGNyZWF0ZUNvbnRlbnRzKQotICAgICAqIEByZXR1cm4gVGhlIG5ldyBTZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWN0aW9uIGNyZWF0ZU1hc3RlclNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotICAgICAgICBsYXlvdXQudG9wTWFyZ2luID0gMDsKLSAgICAgICAgcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBtTWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLlRJVExFX0JBUik7Ci0gICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQiwgVGFibGVXcmFwRGF0YS5UT1ApKTsKLSAgICAgICAgcmV0dXJuIHNlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB1aSBhdHRyaWJ1dGUgY29udHJvbHMgdG8gZWRpdCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuCi0gICAgICogRWxlbWVudERlc2NyaXB0b3IuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VkRm9ybSBUaGUgbWFuYWdlZCBmb3JtCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVpQXR0cmlidXRlQ29udHJvbHMoCi0gICAgICAgICAgICBmaW5hbCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sCi0gICAgICAgICAgICBmaW5hbCBVaUVsZW1lbnROb2RlIHVpX25vZGUpIHsKLQotICAgICAgICBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBlbGVtX2Rlc2MgPSB1aV9ub2RlLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgbU1hc3RlclNlY3Rpb24uc2V0VGV4dChTdHJpbmcuZm9ybWF0KCJBdHRyaWJ1dGVzIGZvciAlMSRzIiwgdWlfbm9kZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkpKTsKLQotICAgICAgICBpZiAobUN1cnJlbnRVaUVsZW1lbnROb2RlICE9IHVpX25vZGUpIHsKLSAgICAgICAgICAgIC8vIEJlZm9yZSBjaGFuZ2luZyB0aGUgdGFibGUsIGNvbW1pdCBhbGwgZGlydHkgc3RhdGUuCi0gICAgICAgICAgICBpZiAobUlzRGlydHkpIHsKLSAgICAgICAgICAgICAgICBjb21taXQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJyZW50VGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50VGFibGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50VGFibGUgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUbyBpdGVyYXRlIG92ZXIgYWxsIGF0dHJpYnV0ZXMsIHdlIHVzZSB0aGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSBpbnN0ZWFkCi0gICAgICAgICAgICAvLyBvZiB0aGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IGJlY2F1c2UgdGhlIGF0dHJpYnV0ZXMgb3JkZXIgaXMgZ3VhcmFudGVlZCBpbiB0aGUKLSAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgYnV0IG5vdCBpbiB0aGUgbm9kZSBpdHNlbGYuCi0gICAgICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gYXR0cl9kZXNjX2xpc3QgPSB1aV9ub2RlLmdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvciwKLSAgICAgICAgICAgIC8vIHN1Yi1zZWN0aW9ucyB3aWxsIGJlIHVzZWQuIFRoaXMgbmVlZHMgdG8gYmUga25vd24gZWFybHkgYXMgaXQgaW5mbHVlbmNlcyB0aGUKLSAgICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHRoZSBtYXN0ZXIgdGFibGUuCi0gICAgICAgICAgICBib29sZWFuIHVzZVN1YnNlY3Rpb25zID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0cl9kZXNjIDogYXR0cl9kZXNjX2xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cl9kZXNjIGluc3RhbmNlb2YgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICAvLyBTdWItc2VjdGlvbnMgd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCBzZWN0aW9ucyBzaG91bGQgbm8gbG9uZ2VyIGJlCi0gICAgICAgICAgICAgICAgICAgIHVzZVN1YnNlY3Rpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICAgICAgQ29tcG9zaXRlIG1hc3RlclRhYmxlID0gU2VjdGlvbkhlbHBlci5jcmVhdGVUYWJsZUxheW91dChtTWFzdGVyU2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgdG9vbGtpdCwgdXNlU3Vic2VjdGlvbnMgPyAxIDogMiAvKiBudW1Db2x1bW5zICovKTsKLSAgICAgICAgICAgIG1DdXJyZW50VGFibGUgPSBtYXN0ZXJUYWJsZTsKLQotICAgICAgICAgICAgbUN1cnJlbnRVaUVsZW1lbnROb2RlID0gdWlfbm9kZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbGVtX2Rlc2MuZ2V0VG9vbHRpcCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9vbHRpcDsKLSAgICAgICAgICAgICAgICBpZiAoU2RrLmdldEN1cnJlbnQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldERvY3VtZW50YXRpb25CYXNlVXJsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRGb3JtVGV4dChlbGVtX2Rlc2MuZ2V0VG9vbHRpcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLmdldERvY3VtZW50YXRpb25CYXNlVXJsKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBlbGVtX2Rlc2MuZ2V0VG9vbHRpcCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZvcm1UZXh0IHRleHQgPSBTZWN0aW9uSGVscGVyLmNyZWF0ZUZvcm1UZXh0KG1hc3RlclRhYmxlLCB0b29sa2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNIdG1sICovLCB0b29sdGlwLCB0cnVlIC8qIHNldHVwTGF5b3V0RGF0YSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIobVRyZWUuZ2V0RWRpdG9yKCkuY3JlYXRlSHlwZXJsaW5rTGlzdGVuZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlIGljb24gPSBlbGVtX2Rlc2MuZ2V0SWNvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldEltYWdlKERlc2NyaXB0b3JzVXRpbHMuSU1BR0VfS0VZLCBpY29uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEZvcm1UZXh0IHBhcnNlciBpcyByZWFsbHkgcmVhbGx5IGJhc2ljIGFuZCB3aWxsIGZhaWwgYXMgc29vbiBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gSFRNTCBqYXZhZG9jIGlzIGV2ZXIgc28gc2xpZ2h0bHkgbWFsZm9ybWF0dGVkLgotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBqYXZhZG9jLCByZWplY3RlZCBieSBGb3JtVGV4dCBmb3Igbm9kZSAlMSRzOiAnJTIkcyciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfbm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gYSBwdXJlIHRleHQgdG9vbHRpcCwgbm8gZmFuY3kgSFRNTAotICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKGVsZW1fZGVzYy5nZXRUb29sdGlwKCkpOwotICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IFNlY3Rpb25IZWxwZXIuY3JlYXRlTGFiZWwobWFzdGVyVGFibGUsIHRvb2xraXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCwgdG9vbHRpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb21wb3NpdGUgdGFibGUgPSB1c2VTdWJzZWN0aW9ucyA/IG51bGwgOiBtYXN0ZXJUYWJsZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJfZGVzYyA6IGF0dHJfZGVzY19saXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJfZGVzYyBpbnN0YW5jZW9mIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc2hvdyBoaWRkZW4gYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhYmxlID09IG51bGwgfHwgYXR0cl9kZXNjIGluc3RhbmNlb2YgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cl9kZXNjIGluc3RhbmNlb2YgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1sTmFtZSBpcyBhY3R1YWxseSB0aGUgbGFiZWwgb2YgdGhlIHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBhdHRyX2Rlc2MuZ2V0WG1sTG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFN0cmluZy5mb3JtYXQoIkF0dHJpYnV0ZXMgZnJvbSAlMSRzIiwgZWxlbV9kZXNjLmdldFVpTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlID0gY3JlYXRlU3ViU2VjdGlvblRhYmxlKHRvb2xraXQsIG1hc3RlclRhYmxlLCB0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyX2Rlc2MgaW5zdGFuY2VvZiBTZXBhcmF0b3JBdHRyaWJ1dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyID0gdWlfbm9kZS5maW5kVWlBdHRyaWJ1dGUoYXR0cl9kZXNjKTsKLQotICAgICAgICAgICAgICAgIGlmICh1aV9hdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWlfYXR0ci5jcmVhdGVVaUNvbnRyb2wodGFibGUsIG1hbmFnZWRGb3JtKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh1aV9hdHRyLmdldEN1cnJlbnRWYWx1ZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9hdHRyLmdldEN1cnJlbnRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTZWN0aW9uKSB0YWJsZS5nZXRQYXJlbnQoKSkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgWE1MIGhhcyBhbiBleHRyYSB1bmtub3duIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gaGFwcGVuIHNvIGl0IGlzIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJTEkcyBub3QgZGVjbGFyZWQgaW4gbm9kZSAlMiRzLCBpZ25vcmVkLiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2Rlc2MuZ2V0WG1sTG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfbm9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIHN1Yi1zZWN0aW9uIGZvciB0aGUgdW5rbm93biBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgLy8gSXQgaXMgaW5pdGlhbGx5IGhpZGRlbiB0aWxsIHRoZXJlIGFyZSBzb21lIGF0dHJpYnV0ZXMgdG8gc2hvdyBoZXJlLgotICAgICAgICAgICAgZmluYWwgQ29tcG9zaXRlIHVua25vd25UYWJsZSA9IGNyZWF0ZVN1YlNlY3Rpb25UYWJsZSh0b29sa2l0LCBtYXN0ZXJUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIlVua25vd24gWE1MIEF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIHVua25vd25UYWJsZS5nZXRQYXJlbnQoKS5zZXRWaXNpYmxlKGZhbHNlKTsgLy8gc2V0IHNlY3Rpb24gdG8gbm90IHZpc2libGUKLSAgICAgICAgICAgIGZpbmFsIEhhc2hTZXQ8VWlBdHRyaWJ1dGVOb2RlPiByZWZlcmVuY2UgPSBuZXcgSGFzaFNldDxVaUF0dHJpYnV0ZU5vZGU+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElVaVVwZGF0ZUxpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyID0gbmV3IElVaVVwZGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVpRWxlbWVudE5vZGVVcGRhdGVkKFVpRWxlbWVudE5vZGUgdWlfbm9kZSwgVWlVcGRhdGVTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gVWlVcGRhdGVTdGF0ZS5BVFRSX1VQREFURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVua25vd25BdHRyaWJ1dGVzU2VjdGlvbih1aV9ub2RlLCB1bmtub3duVGFibGUsIG1hbmFnZWRGb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHVpX25vZGUuYWRkVXBkYXRlTGlzdGVuZXIodXBkYXRlTGlzdGVuZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVyIHdoZW4gdGhlIFVJIGlzIGRpc3Bvc2VkCi0gICAgICAgICAgICB1bmtub3duVGFibGUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdWlfbm9kZS5yZW1vdmVVcGRhdGVMaXN0ZW5lcih1cGRhdGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVwZGF0ZVVua25vd25BdHRyaWJ1dGVzU2VjdGlvbih1aV9ub2RlLCB1bmtub3duVGFibGUsIG1hbmFnZWRGb3JtLCByZWZlcmVuY2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtTWFzdGVyU2VjdGlvbi5nZXRQYXJlbnQoKS5wYWNrKHRydWUgLyogY2hhbmdlZCAqLyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzdWIgU2VjdGlvbiBhbmQgaXRzIGVtYmVkZGluZyB3cmFwcGVyIHRhYmxlIHdpdGggMiBjb2x1bW5zLgotICAgICAqIEByZXR1cm4gVGhlIHRhYmxlLCBjaGlsZCBvZiBhIG5ldyBzZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVN1YlNlY3Rpb25UYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LAotICAgICAgICAgICAgQ29tcG9zaXRlIG1hc3RlclRhYmxlLCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBTZWN0aW9uIGNvbXBvc2l0ZSBzZWVtcyB0byBpZ25vcmUgY29sc3BhbiB3aGVuIGFzc2lnbmVkIGEgVGFibGVXcmFwRGF0YSBzbwotICAgICAgICAvLyBpZiB0aGUgcGFyZW50IGlzIGEgdGFibGUgd2l0aCBtb3JlIHRoYW4gb25lIGNvbHVtbiBhbiBleHRyYSB0YWJsZSB3aXRoIG9uZSBjb2x1bW4KLSAgICAgICAgLy8gaXMgaW5zZXJ0ZWQgdG8gcmVzcGVjdCBjb2xzcGFuLgotICAgICAgICBpbnQgcGFyZW50TnVtQ29sID0gKChUYWJsZVdyYXBMYXlvdXQpIG1hc3RlclRhYmxlLmdldExheW91dCgpKS5udW1Db2x1bW5zOwotICAgICAgICBpZiAocGFyZW50TnVtQ29sID4gMSkgewotICAgICAgICAgICAgbWFzdGVyVGFibGUgPSBTZWN0aW9uSGVscGVyLmNyZWF0ZVRhYmxlTGF5b3V0KG1hc3RlclRhYmxlLCB0b29sa2l0LCAxKTsKLSAgICAgICAgICAgIFRhYmxlV3JhcERhdGEgdHdkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotICAgICAgICAgICAgdHdkLm1heFdpZHRoID0gQW5kcm9pZEVkaXRvci5URVhUX1dJRFRIX0hJTlQ7Ci0gICAgICAgICAgICB0d2QuY29sc3BhbiA9IHBhcmVudE51bUNvbDsKLSAgICAgICAgICAgIG1hc3RlclRhYmxlLnNldExheW91dERhdGEodHdkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIHRhYmxlOwotICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24obWFzdGVyVGFibGUsCi0gICAgICAgICAgICAgICAgU2VjdGlvbi5USVRMRV9CQVIgfCBTZWN0aW9uLlRXSVNUSUUpOwotCi0gICAgICAgIC8vIEFkZCBhbiBleHBhbnNpb24gbGlzdGVuZXIgdGhhdCB3aWxsIHRyaWdnZXIgYSByZWZsb3cgb24gdGhlIHBhcmVudAotICAgICAgICAvLyBTY3JvbGxlZFBhZ2VCb29rICh3aGljaCBpcyBhY3R1YWxseSBhIFNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlKS4gVGhpcyB3aWxsCi0gICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgY29ycmVjdCBzaXplIGFuZCBhZGp1c3QgdGhlIHNjcm9sbGJhciBhcyBuZWVkZWQuCi0gICAgICAgIHNlY3Rpb24uYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IElFeHBhbnNpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgcmVmbG93TWFzdGVyU2VjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5naW5nKEV4cGFuc2lvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlV3JhcERhdGEuVE9QKSk7Ci0gICAgICAgIHRhYmxlID0gU2VjdGlvbkhlbHBlci5jcmVhdGVUYWJsZUxheW91dChzZWN0aW9uLCB0b29sa2l0LCAyIC8qIG51bUNvbHVtbnMgKi8pOwotICAgICAgICByZXR1cm4gdGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmbG93IHRoZSBwYXJlbnQgU2Nyb2xsZWRQYWdlQm9vayAod2hpY2ggaXMgYWN0dWFsbHkgYSBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSkuCi0gICAgICogVGhpcyB3aWxsIHJlY29tcHV0ZSB0aGUgY29ycmVjdCBzaXplIGFuZCBhZGp1c3QgdGhlIHNjcm9sbGJhciBhcyBuZWVkZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZmxvd01hc3RlclNlY3Rpb24oKSB7Ci0gICAgICAgIGZvcihDb21wb3NpdGUgYyA9IG1NYXN0ZXJTZWN0aW9uOyBjICE9IG51bGw7IGMgPSBjLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAgICAgKChTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSkgYykucmVmbG93KHRydWUgLyogZmx1c2hDYWNoZSAqLyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB1bmtub3duIGF0dHJpYnV0ZXMgc2VjdGlvbiBmb3IgdGhlIFVJIE5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVua25vd25BdHRyaWJ1dGVzU2VjdGlvbihVaUVsZW1lbnROb2RlIHVpX25vZGUsCi0gICAgICAgICAgICBmaW5hbCBDb21wb3NpdGUgdW5rbm93blRhYmxlLCBmaW5hbCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sCi0gICAgICAgICAgICBIYXNoU2V0PFVpQXR0cmlidXRlTm9kZT4gcmVmZXJlbmNlKSB7Ci0gICAgICAgIENvbGxlY3Rpb248VWlBdHRyaWJ1dGVOb2RlPiB1aV9hdHRycyA9IHVpX25vZGUuZ2V0VW5rbm93blVpQXR0cmlidXRlcygpOwotICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSAoKFNlY3Rpb24pIHVua25vd25UYWJsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNfcmVmbG93ID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGhlIHRhYmxlIHdhcyBjcmVhdGVkIGhpZGRlbiwgc2hvdyBpdCBpZiB0aGVyZSBhcmUgdW5rbm93biBhdHRyaWJ1dGVzIG5vdwotICAgICAgICBpZiAodWlfYXR0cnMuc2l6ZSgpID4gMCAmJiAhc2VjdGlvbi5pc1Zpc2libGUoKSkgewotICAgICAgICAgICAgc2VjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgbmVlZHNfcmVmbG93ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXBhcmUgdGhlIG5ldyBhdHRyaWJ1dGUgc2V0IHdpdGggdGhlIG9sZCAicmVmZXJlbmNlIiBvbmUKLSAgICAgICAgYm9vbGVhbiBoYXNfZGlmZmVyZW5jZXMgPSB1aV9hdHRycy5zaXplKCkgIT0gcmVmZXJlbmNlLnNpemUoKTsKLSAgICAgICAgaWYgKCFoYXNfZGlmZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgOiB1aV9hdHRycykgewotICAgICAgICAgICAgICAgIGlmICghcmVmZXJlbmNlLmNvbnRhaW5zKHVpX2F0dHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc19kaWZmZXJlbmNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNfZGlmZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIG5lZWRzX3JlZmxvdyA9IHRydWU7Ci0gICAgICAgICAgICByZWZlcmVuY2UuY2xlYXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBjaGlsZHJlbiBvZiB0aGUgdGFibGUKLSAgICAgICAgICAgIGZvciAoQ29udHJvbCBjIDogdW5rbm93blRhYmxlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIC8vIFJlY3JlYXRlIGFsbCBhdHRyaWJ1dGVzIFVJCi0gICAgICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyIDogdWlfYXR0cnMpIHsKLSAgICAgICAgICAgICAgICByZWZlcmVuY2UuYWRkKHVpX2F0dHIpOwotICAgICAgICAgICAgICAgIHVpX2F0dHIuY3JlYXRlVWlDb250cm9sKHVua25vd25UYWJsZSwgbWFuYWdlZEZvcm0pOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh1aV9hdHRyLmdldEN1cnJlbnRWYWx1ZSgpICE9IG51bGwgJiYgdWlfYXR0ci5nZXRDdXJyZW50VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChuZWVkc19yZWZsb3cpIHsKLSAgICAgICAgICAgIHJlZmxvd01hc3RlclNlY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYXJrcyB0aGUgcGFydCBkaXJ0eS4gQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgd2lkZ2V0cyBpbiB0aGUKLSAgICAgKiBzZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICAgIGlmICghbUlzRGlydHkpIHsKLSAgICAgICAgICAgIG1Jc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1NYW5hZ2VkRm9ybS5kaXJ0eVN0YXRlQ2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvVWlNb2RlbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvVWlNb2RlbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlZjljMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1VpTW9kZWxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS50cmVlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVWlNb2RlbFRyZWVDb250ZW50UHJvdmlkZXIgaXMgYSB0cml2aWFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJVHJlZUNvbnRlbnRQcm92aWRlcn0KLSAqIHdoZXJlIGVsZW1lbnRzIGFyZSBleHBlY3RlZCB0byBiZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFVpRWxlbWVudE5vZGV9LgotICovCi1jbGFzcyBVaU1vZGVsVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLSAgICAKLSAgICAvKiogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGRpc3BsYXllZCBhcyByb290IGluIHRoaXMgdHJlZSB2aWV3LiBBbGwgZWxlbWVudHMKLSAgICAgKiAgb2YgdGhlIHNhbWUgdHlwZSBpbiB0aGUgcm9vdCB3aWxsIGJlIGRpc3BsYXllZC4gKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yW10gbURlc2NyaXB0b3JGaWx0ZXJzOwotICAgIC8qKiBUaGUgdWlSb290Tm9kZSBvZiB0aGUgbW9kZWwuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBVaUVsZW1lbnROb2RlIG1VaVJvb3ROb2RlOwotCi0gICAgcHVibGljIFVpTW9kZWxUcmVlQ29udGVudFByb3ZpZGVyKFVpRWxlbWVudE5vZGUgdWlSb290Tm9kZSwKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gZGVzY3JpcHRvckZpbHRlcnMpIHsKLSAgICAgICAgbVVpUm9vdE5vZGUgPSB1aVJvb3ROb2RlOwotICAgICAgICBtRGVzY3JpcHRvckZpbHRlcnMgPSBkZXNjcmlwdG9yRmlsdGVyczsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgVUkgbm9kZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBvciBudWxsIGlmIG5vdCB0aGUgcmlnaHQga2luZAotICAgICAqIG9mIG9iamVjdC4gKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBVaUVsZW1lbnROb2RlKSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSAoVWlFbGVtZW50Tm9kZSkgcGFyZW50RWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFVpQ2hpbGRyZW4oKS50b0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgYSBnaXZlbiBVSSBub2RlIG9yIG51bGwgaWYgaXQncyBhIHJvb3Qgbm9kZSBvciBpdCdzIG5vdCB0aGUKLSAgICAgKiByaWdodCBraW5kIG9mIG5vZGUuICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVaUVsZW1lbnROb2RlKSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSAoVWlFbGVtZW50Tm9kZSkgZWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFVpUGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFVJIG5vZGUgaGFzIGFueSBVSSBjaGlsZHJlbiBub2Rlcy4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVpRWxlbWVudE5vZGUpIHsKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgbm9kZSA9IChVaUVsZW1lbnROb2RlKSBlbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSA+IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogR2V0IHJvb3QgZWxlbWVudHMgZm9yIHRoZSB0cmVlLiBUaGVzZSBhcmUgYWxsIHRoZSBVSSBub2RlcyB0aGF0Ci0gICAgICogbWF0Y2ggdGhlIGZpbHRlciBkZXNjcmlwdG9yIGluIHRoZSBjdXJyZW50IHJvb3Qgbm9kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQWx0aG91Z2ggbm90IGRvY3VtZW50ZWQsIGl0IHNlZW1zIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgcmV0dXJuIG51bGwuCi0gICAgICogQXQgd29yc2UsIGl0IHNob3VsZCByZXR1cm4gbmV3IE9iamVjdFswXS4KLSAgICAgKiA8cC8+Ci0gICAgICogaW5wdXRFbGVtZW50IGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gVGhlIHJvb3Qgbm9kZSBhbmQgdGhlIGZpbHRlciBhcmUgZ2l2ZW4KLSAgICAgKiBieSB0aGUgZW5jbG9zaW5nIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiByb290cyA9IG5ldyBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4oKTsKLSAgICAgICAgaWYgKG1VaVJvb3ROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSB1aV9ub2RlIDogbVVpUm9vdE5vZGUuZ2V0VWlDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yRmlsdGVycyA9PSBudWxsIHx8IG1EZXNjcmlwdG9yRmlsdGVycy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByb290cy5hZGQodWlfbm9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBmaWx0ZXIgOiBtRGVzY3JpcHRvckZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aV9ub2RlLmdldERlc2NyaXB0b3IoKSA9PSBmaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290cy5hZGQodWlfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByb290cy50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1VpTW9kZWxUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaU1vZGVsVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMGE2Yi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aS90cmVlL1VpTW9kZWxUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkudHJlZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuRXJyb3JJbWFnZUNvbXBvc2l0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVWlNb2RlbFRyZWVMYWJlbFByb3ZpZGVyIGlzIGEgdHJpdmlhbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9Ci0gKiB3aGVyZSBlbGVtZW50cyBhcmUgZXhwZWN0ZWQgdG8gZGVyaXZlIGZyb20ge0BsaW5rIFVpRWxlbWVudE5vZGV9IG9yCi0gKiBmcm9tIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0uCi0gKiAKLSAqIEl0IGlzIHVzZWQgYnkgYm90aCB0aGUgbWFzdGVyIHRyZWUgdmlld2VyIGFuZCBieSB0aGUgbGlzdCBpbiB0aGUgQWRkLi4uIHNlbGVjdGlvbiBkaWFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBVaU1vZGVsVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgVWlNb2RlbFRyZWVMYWJlbFByb3ZpZGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBsb2dvIHdpdGggYSBmYWxsYmFjayBvbiB0aGUgYW5kcm9pZCBsb2dvLgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICAgICAgSW1hZ2UgaW1nID0gKChFbGVtZW50RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0SWNvbigpOwotICAgICAgICAgICAgaWYgKGltZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBub2RlID0gKFVpRWxlbWVudE5vZGUpIGVsZW1lbnQ7Ci0gICAgICAgICAgICBkZXNjID0gbm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2UgaW1nID0gZGVzYy5nZXRJY29uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmhhc0Vycm9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY2FjaGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3JJbWFnZUNvbXBvc2l0ZShpbWcpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBZHRQbHVnaW4uZ2V0QW5kcm9pZExvZ28oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VzIFVpRWxlbWVudE5vZGUuc2hvcnREZXNjcmlwdGlvbiBmb3IgdGhlIGxhYmVsIGZvciB0aGlzIHRyZWUgaXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGVzY3JpcHRvcikgewotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IChFbGVtZW50RGVzY3JpcHRvcikgZWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmdldFVpTmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVaUVsZW1lbnROb2RlKSB7Ci0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIG5vZGUgPSAoVWlFbGVtZW50Tm9kZSkgZWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFNob3J0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAvLyBwYXNzCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaVRyZWVCbG9jay5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWkvdHJlZS9VaVRyZWVCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjQxMjg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpL3RyZWUvVWlUcmVlQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuU2VjdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aS5TZWN0aW9uSGVscGVyLk1hbmlmZXN0U2VjdGlvblBhcnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5JVWlVcGRhdGVMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRG9jdW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuVWlFbGVtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkay5JVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRGV0YWlsc1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklEZXRhaWxzUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5NYXN0ZXJEZXRhaWxzQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotLyoqCi0gKiB7QGxpbmsgVWlUcmVlQmxvY2t9IGlzIGEge0BsaW5rIE1hc3RlckRldGFpbHNCbG9ja30gd2hpY2ggZGlzcGxheXMgYSB0cmVlIHZpZXcgZm9yCi0gKiBhIHNwZWNpZmljIHNldCBvZiB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gKiA8cC8+Ci0gKiBGb3IgYSBnaXZlbiBVSSBlbGVtZW50IG5vZGUsIHRoZSB0cmVlIHZpZXcgZGlzcGxheXMgYWxsIGZpcnN0LWxldmVsIGNoaWxkcmVuIHRoYXQKLSAqIG1hdGNoIGEgZ2l2ZW4gdHlwZSAoZ2l2ZW4gYnkgYW4ge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfS4gQWxsIGNoaWxkcmVuIGZyb20gdGhlc2UKLSAqIG5vZGVzIGFyZSBhbHNvIGRpc3BsYXllZC4KLSAqIDxwLz4KLSAqIEluIHRoZSBtaWRkbGUgbmV4dCB0byB0aGUgdHJlZSBhcmUgc29tZSBjb250cm9scyB0byBhZGQgb3IgZGVsZXRlIHRyZWUgbm9kZXMuCi0gKiBPbiB0aGUgbGVmdCBpcyBhIGRldGFpbHMgcGFydCB0aGF0IGRpc3BsYXlzIGFsbCB0aGUgdmlzaWJsZSBVSSBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuCi0gKiBzZWxlY3RlZCBVSSBlbGVtZW50IG5vZGUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVaVRyZWVCbG9jayBleHRlbmRzIE1hc3RlckRldGFpbHNCbG9jayBpbXBsZW1lbnRzIElDb21taXRYbWwgewotCi0gICAgLyoqIEhlaWdodCBoaW50IGZvciB0aGUgdHJlZSB2aWV3LiBIZWxwcyB0aGUgZ3JpZCBsYXlvdXQgcmVzaXplIHByb3Blcmx5IG9uIHNtYWxsZXIgc2NyZWVucy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJFRV9IRUlHSFRfSElOVCA9IDUwOwotCi0gICAgLyoqIENvbnRhaW5lciBlZGl0b3IgKi8KLSAgICBBbmRyb2lkRWRpdG9yIG1FZGl0b3I7Ci0gICAgLyoqIFRoZSByb290IHtAbGluayBVaUVsZW1lbnROb2RlfSB3aGljaCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHRvIGJlCi0gICAgICogIG1hbmlwdWxhdGVkIGJ5IHRoaXMgdHJlZSB2aWV3LiBJbiBnZW5lcmFsIHRoaXMgaXMgdGhlIG1hbmlmZXN0IFVJIG5vZGUuICovCi0gICAgcHJpdmF0ZSBVaUVsZW1lbnROb2RlIG1VaVJvb3ROb2RlOwotICAgIC8qKiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGlzcGxheWVkIGFzIHJvb3QgaW4gdGhpcyB0cmVlIHZpZXcuIEFsbCBlbGVtZW50cwotICAgICAqICBvZiB0aGUgc2FtZSB0eXBlIGluIHRoZSByb290IHdpbGwgYmUgZGlzcGxheWVkLiAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3JbXSBtRGVzY3JpcHRvckZpbHRlcnM7Ci0gICAgLyoqIFRoZSB0aXRsZSBmb3IgdGhlIG1hc3Rlci1kZXRhaWwgcGFydCAoZGlzcGxheWVkIG9uIHRoZSB0b3AgInRhYiIgb24gdG9wIG9mIHRoZSB0cmVlKSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKLSAgICAvKiogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgbWFzdGVyLWRldGFpbCBwYXJ0IChkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSB0cmVlIHZpZXcpICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgIC8qKiBUaGUgbWFzdGVyLWRldGFpbCBwYXJ0LCBjb21wb3NlZCBvZiBhIG1haW4gdHJlZSBhbmQgYW4gYXV4aWxpYXJ5IGRldGFpbCBwYXJ0ICovCi0gICAgcHJpdmF0ZSBNYW5pZmVzdFNlY3Rpb25QYXJ0IG1NYXN0ZXJQYXJ0OwotICAgIC8qKiBUaGUgdHJlZSB2aWV3ZXIgaW4gdGhlIG1hc3Rlci1kZXRhaWwgcGFydCAqLwotICAgIHByaXZhdGUgVHJlZVZpZXdlciBtVHJlZVZpZXdlcjsKLSAgICAvKiogVGhlICJhZGQiIGJ1dHRvbiBmb3IgdGhlIHRyZWUgdmlldyAqLwotICAgIHByaXZhdGUgQnV0dG9uIG1BZGRCdXR0b247Ci0gICAgLyoqIFRoZSAicmVtb3ZlIiBidXR0b24gZm9yIHRoZSB0cmVlIHZpZXcgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBtUmVtb3ZlQnV0dG9uOwotICAgIC8qKiBUaGUgInVwIiBidXR0b24gZm9yIHRoZSB0cmVlIHZpZXcgKi8KLSAgICBwcml2YXRlIEJ1dHRvbiBtVXBCdXR0b247Ci0gICAgLyoqIFRoZSAiZG93biIgYnV0dG9uIGZvciB0aGUgdHJlZSB2aWV3ICovCi0gICAgcHJpdmF0ZSBCdXR0b24gbURvd25CdXR0b247Ci0gICAgLyoqIFRoZSBNYW5hZ2VkIEZvcm0gdXNlZCB0byBjcmVhdGUgdGhlIG1hc3RlciBwYXJ0ICovCi0gICAgcHJpdmF0ZSBJTWFuYWdlZEZvcm0gbU1hbmFnZWRGb3JtOwotICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGRldGFpbHMgcGFydCBvZiB0aGUgdHJlZSBtYXN0ZXIgYmxvY2suICovCi0gICAgcHJpdmF0ZSBEZXRhaWxzUGFydCBtRGV0YWlsc1BhcnQ7Ci0gICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgY2xpcGJvYXJkIGZvciBjb3B5LXBhc3RlICovCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgbUNsaXBib2FyZDsKLSAgICAvKiogTGlzdGVuZXIgdG8gcmVmcmVzaCB0aGUgdHJlZSB2aWV3ZXIgd2hlbiB0aGUgcGFyZW50J3Mgbm9kZSBoYXMgYmVlbiB1cGRhdGVkICovCi0gICAgcHJpdmF0ZSBJVWlVcGRhdGVMaXN0ZW5lciBtVWlSZWZyZXNoTGlzdGVuZXI7Ci0gICAgLyoqIExpc3RlbmVyIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBVSSBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gbm9kZSdzIHByZXNlbmNlICovCi0gICAgcHJpdmF0ZSBJVWlVcGRhdGVMaXN0ZW5lciBtVWlFbmFibGVMaXN0ZW5lcjsKLSAgICAvKiogQW4gYWRhcHRlci93cmFwcGVyIHRvIHVzZSB0aGUgYWRkL3JlbW92ZS91cC9kb3duIHRyZWUgZWRpdCBhY3Rpb25zLiAqLwotICAgIHByaXZhdGUgVWlUcmVlQWN0aW9ucyBtVWlUcmVlQWN0aW9uczsKLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoZSByb290IG5vZGUgY2FuIGJlIGNyZWF0ZWQgb24tZGVtYW5kIChpLmUuIGFzIG5lZWRlZCBhcwotICAgICAqIHNvb24gYXMgY2hpbGRyZW4gZXhpc3QpLiBGYWxzZSBpZiBhbiBleHRlcm5hbCBlbnRpdHkgY29udHJvbHMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUKLSAgICAgKiByb290IG5vZGUuIEluIHByYWN0aXNlLCB0aGlzIGlzIGZhbHNlIGZvciB0aGUgbWFuaWZlc3QgYXBwbGljYXRpb24gcGFnZSAodGhlIGFjdHVhbAotICAgICAqICJhcHBsaWNhdGlvbiIgbm9kZSBpcyBtYW5hZ2VkIGJ5IHRoZSBBcHBsaWNhdGlvblRvZ2dsZSBwYXJ0KSB3aGVyZWFzIGl0IGlzIHRydWUKLSAgICAgKiBmb3IgYWxsIG90aGVyIHRyZWUgcGFnZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1BdXRvQ3JlYXRlUm9vdDsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWFzdGVyRGV0YWlsc0Jsb2NrfSB0aGF0IHdpbGwgZGlzcGxheSBhbGwgVUkgbm9kZXMgbWF0Y2hpbmcgdGhlCi0gICAgICogZ2l2ZW4gZmlsdGVyIGluIHRoZSBnaXZlbiByb290IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWRpdG9yIFRoZSBwYXJlbnQgbWFuaWZlc3QgZWRpdG9yLgotICAgICAqIEBwYXJhbSB1aVJvb3ROb2RlIFRoZSByb290IHtAbGluayBVaUVsZW1lbnROb2RlfSB3aGljaCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlCi0gICAgICogICAgICAgIHRvIGJlIG1hbmlwdWxhdGVkIGJ5IHRoaXMgdHJlZSB2aWV3LiBJbiBnZW5lcmFsIHRoaXMgaXMgdGhlIG1hbmlmZXN0IFVJIG5vZGUgb3IgdGhlCi0gICAgICogICAgICAgIGFwcGxpY2F0aW9uIFVJIG5vZGUuIFRoaXMgY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGF1dG9DcmVhdGVSb290IFRydWUgaWYgdGhlIHJvb3Qgbm9kZSBjYW4gYmUgY3JlYXRlZCBvbi1kZW1hbmQgKGkuZS4gYXMgbmVlZGVkIGFzCi0gICAgICogICAgICAgIHNvb24gYXMgY2hpbGRyZW4gZXhpc3QpLiBGYWxzZSBpZiBhbiBleHRlcm5hbCBlbnRpdHkgY29udHJvbHMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUKLSAgICAgKiAgICAgICAgcm9vdCBub2RlLiBJbiBwcmFjdGlzZSwgdGhpcyBpcyBmYWxzZSBmb3IgdGhlIG1hbmlmZXN0IGFwcGxpY2F0aW9uIHBhZ2UgKHRoZSBhY3R1YWwKLSAgICAgKiAgICAgICAgImFwcGxpY2F0aW9uIiBub2RlIGlzIG1hbmFnZWQgYnkgdGhlIEFwcGxpY2F0aW9uVG9nZ2xlIHBhcnQpIHdoZXJlYXMgaXQgaXMgdHJ1ZQotICAgICAqICAgICAgICBmb3IgYWxsIG90aGVyIHRyZWUgcGFnZXMuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWx0ZXJzIEEgbGlzdCBvZiBkZXNjcmlwdG9ycyBvZiB0aGUgZWxlbWVudHMgdG8gYmUgZGlzcGxheWVkIGFzIHJvb3QgaW4KLSAgICAgKiAgICAgICAgdGhpcyB0cmVlIHZpZXcuIFVzZSBudWxsIG9yIGFuIGVtcHR5IGxpc3QgdG8gYWNjZXB0IGFueSBraW5kIG9mIG5vZGUuCi0gICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIGZvciB0aGUgc2VjdGlvbgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHNlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlUcmVlQmxvY2soQW5kcm9pZEVkaXRvciBlZGl0b3IsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpUm9vdE5vZGUsCi0gICAgICAgICAgICBib29sZWFuIGF1dG9DcmVhdGVSb290LAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3JbXSBkZXNjcmlwdG9yRmlsdGVycywKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtRWRpdG9yID0gZWRpdG9yOwotICAgICAgICBtVWlSb290Tm9kZSA9IHVpUm9vdE5vZGU7Ci0gICAgICAgIG1BdXRvQ3JlYXRlUm9vdCA9IGF1dG9DcmVhdGVSb290OwotICAgICAgICBtRGVzY3JpcHRvckZpbHRlcnMgPSBkZXNjcmlwdG9yRmlsdGVyczsKLSAgICAgICAgbVRpdGxlID0gdGl0bGU7Ci0gICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJucyBUaGUgY29udGFpbmVyIGVkaXRvciAqLwotICAgIEFuZHJvaWRFZGl0b3IgZ2V0RWRpdG9yKCkgewotICAgICAgICByZXR1cm4gbUVkaXRvcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybnMgVGhlIHJlZmVyZW5jZSB0byB0aGUgY2xpcGJvYXJkIGZvciBjb3B5LXBhc3RlICovCi0gICAgQ2xpcGJvYXJkIGdldENsaXBib2FyZCgpIHsKLSAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm5zIFRoZSBtYXN0ZXItZGV0YWlsIHBhcnQsIGNvbXBvc2VkIG9mIGEgbWFpbiB0cmVlIGFuZCBhbiBhdXhpbGlhcnkgZGV0YWlsIHBhcnQgKi8KLSAgICBNYW5pZmVzdFNlY3Rpb25QYXJ0IGdldE1hc3RlclBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBtTWFzdGVyUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gZm9yIHRoZSBjdXJyZW50IG1vZGVsLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXR0YWNoZWQgdG8ge0BsaW5rICNtVHJlZVZpZXdlcn0gc2luY2UKLSAgICAgKiB0aGUgdWlSb290Tm9kZSBjaGFuZ2VzIGFmdGVyIGVhY2ggY2FsbCB0bwotICAgICAqIHtAbGluayAjY2hhbmdlUm9vdEFuZERlc2NyaXB0b3JzKFVpRWxlbWVudE5vZGUsIEVsZW1lbnREZXNjcmlwdG9yW10sIGJvb2xlYW4pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBnZXRSb290Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1VaVJvb3ROb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hc3RlclBhcnQoZmluYWwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0KLSAgICAgICAgbU1hbmFnZWRGb3JtID0gbWFuYWdlZEZvcm07Ci0gICAgICAgIG1NYXN0ZXJQYXJ0ID0gbmV3IE1hbmlmZXN0U2VjdGlvblBhcnQocGFyZW50LCB0b29sa2l0KTsKLSAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gbU1hc3RlclBhcnQuZ2V0U2VjdGlvbigpOwotICAgICAgICBzZWN0aW9uLnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgc2VjdGlvbi5zZXREZXNjcmlwdGlvbihtRGVzY3JpcHRpb24pOwotICAgICAgICBzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBDb21wb3NpdGUgZ3JpZCA9IFNlY3Rpb25IZWxwZXIuY3JlYXRlR3JpZExheW91dChzZWN0aW9uLCB0b29sa2l0LCAyKTsKLQotICAgICAgICBUcmVlIHRyZWUgPSBjcmVhdGVUcmVlVmlld2VyKHRvb2xraXQsIGdyaWQsIG1hbmFnZWRGb3JtKTsKLSAgICAgICAgY3JlYXRlQnV0dG9ucyh0b29sa2l0LCBncmlkKTsKLSAgICAgICAgY3JlYXRlVHJlZUNvbnRleHRNZW51KHRyZWUpOwotICAgICAgICBjcmVhdGVTZWN0aW9uQWN0aW9ucyhzZWN0aW9uLCB0b29sa2l0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbkFjdGlvbnMoU2VjdGlvbiBzZWN0aW9uLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0gICAgICAgIFRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQpOwotICAgICAgICBtYW5hZ2VyLnJlbW92ZUFsbCgpOwotCi0gICAgICAgIFRvb2xCYXIgdG9vbGJhciA9IG1hbmFnZXIuY3JlYXRlQ29udHJvbChzZWN0aW9uKTsKLSAgICAgICAgc2VjdGlvbi5zZXRUZXh0Q2xpZW50KHRvb2xiYXIpOwotCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gZGVzY3MgPSBtRGVzY3JpcHRvckZpbHRlcnM7Ci0gICAgICAgIGlmIChkZXNjcyA9PSBudWxsICYmIG1VaVJvb3ROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NzID0gbVVpUm9vdE5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzY3MgIT0gbnVsbCAmJiBkZXNjcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgOiBkZXNjcykgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBEZXNjcmlwdG9yRmlsdGVyQWN0aW9uKGRlc2MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBUcmVlU29ydEFjdGlvbigpKTsKLQotICAgICAgICBtYW5hZ2VyLnVwZGF0ZSh0cnVlIC8qZm9yY2UqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdHJlZSBhbmQgaXRzIHZpZXdlcgotICAgICAqIEByZXR1cm4gVGhlIHRyZWUgY29udHJvbAotICAgICAqLwotICAgIHByaXZhdGUgVHJlZSBjcmVhdGVUcmVlVmlld2VyKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBncmlkLAotICAgICAgICAgICAgZmluYWwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIC8vIE5vdGU6IHdlICpjb3VsZCogdXNlIGEgRmlsdGVyZWRUcmVlIGluc3RlYWQgb2YgdGhlIFRyZWUrVHJlZVZpZXdlciBoZXJlLgotICAgICAgICAvLyBIb3dldmVyIHRoZSBjbGFzcyBtdXN0IGJlIGFkYXB0ZWQgdG8gY3JlYXRlIGFuIGFkYXB0ZWQgdG9vbGtpdCB0cmVlLgotICAgICAgICBmaW5hbCBUcmVlIHRyZWUgPSB0b29sa2l0LmNyZWF0ZVRyZWUoZ3JpZCwgU1dULk1VTFRJKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gQW5kcm9pZEVkaXRvci5URVhUX1dJRFRIX0hJTlQ7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBUUkVFX0hFSUdIVF9ISU5UOwotICAgICAgICB0cmVlLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIG1UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7Ci0gICAgICAgIG1UcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVWlNb2RlbFRyZWVDb250ZW50UHJvdmlkZXIobVVpUm9vdE5vZGUsIG1EZXNjcmlwdG9yRmlsdGVycykpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBVaU1vZGVsVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIG1UcmVlVmlld2VyLnNldElucHV0KCJ1bnVzZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIENyZWF0ZSBhIGxpc3RlbmVyIHRoYXQgcmVhY3RzIHRvIHNlbGVjdGlvbnMgb24gdGhlIHRyZWUgdmlld2VyLgotICAgICAgICAvLyBXaGVuIGEgc2VsZWN0aW9uIGlzIG1hZGUsIGFzayB0aGUgbWFuYWdlZCBmb3JtIHRvIHByb3BhZ2F0ZSBhbiBldmVudCB0bwotICAgICAgICAvLyBhbGwgcGFydHMgaW4gdGhlIG1hbmFnZWQgZm9ybS4KLSAgICAgICAgLy8gVGhpcyBpcyBwaWNrZWQgdXAgYnkgVWlFbGVtZW50RGV0YWlsLnNlbGVjdGlvbkNoYW5nZWQoKS4KLSAgICAgICAgbVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VkRm9ybS5maXJlU2VsZWN0aW9uQ2hhbmdlZChtTWFzdGVyUGFydCwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGFkanVzdFRyZWVCdXR0b25zKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRocmVlIGxpc3RlbmVyczoKLSAgICAgICAgLy8gLSBPbmUgdG8gcmVmcmVzaCB0aGUgdHJlZSB2aWV3ZXIgd2hlbiB0aGUgcGFyZW50J3Mgbm9kZSBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgIC8vIC0gT25lIHRvIHJlZnJlc2ggdGhlIHRyZWUgdmlld2VyIHdoZW4gdGhlIGZyYW1ld29yayByZXNvdXJjZXMgaGF2ZSBjaGFuZ2VkCi0gICAgICAgIC8vIC0gT25lIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBVSSBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gbm9kZSdzIHByZXNlbmNlLgotICAgICAgICBtVWlSZWZyZXNoTGlzdGVuZXIgPSBuZXcgSVVpVXBkYXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1aUVsZW1lbnROb2RlVXBkYXRlZChVaUVsZW1lbnROb2RlIHVpX25vZGUsIFVpVXBkYXRlU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVVpRW5hYmxlTGlzdGVuZXIgPSBuZXcgSVVpVXBkYXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1aUVsZW1lbnROb2RlVXBkYXRlZChVaUVsZW1lbnROb2RlIHVpX25vZGUsIFVpVXBkYXRlU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgVWlFbGVtZW50Tm9kZSBmb3IgdGhlIGFwcGxpY2F0aW9uIFhNTCBub2RlIGFsd2F5cyBleGlzdHMsIGV2ZW4KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlIGluIHRoZSBYTUwgZmlsZS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5LCB3ZSBlbmFibGUgdGhlIFVJIGhlcmUgaWYgdGhlIFhNTCBub2RlIGlzIG5vdCBudWxsLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gSG93ZXZlciBpZiBtQXV0b0NyZWF0ZVJvb3QgaXMgdHJ1ZSwgdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIGNyZWF0ZWQgb24tZGVtYW5kCi0gICAgICAgICAgICAgICAgLy8gc28gdGhlIHRyZWUvYmxvY2sgaXMgYWx3YXlzIGVuYWJsZWQuCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBleGlzdHMgPSBtQXV0b0NyZWF0ZVJvb3QgfHwgKHVpX25vZGUuZ2V0WG1sTm9kZSgpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChtTWFzdGVyUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IG1NYXN0ZXJQYXJ0LmdldFNlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24uZ2V0RW5hYmxlZCgpICE9IGV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXRFbmFibGVkKGV4aXN0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENvbnRyb2wgYyA6IHNlY3Rpb24uZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0RW5hYmxlZChleGlzdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8qKiBMaXN0ZW5lciB0byB1cGRhdGUgdGhlIHJvb3Qgbm9kZSBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBmaWxlIGlzIGNoYW5nZWQgYmVjYXVzZSBvZiBhCi0gICAgICAgICAqIFNESyBsb2NhdGlvbiBjaGFuZ2Ugb3IgYSBwcm9qZWN0IHRhcmdldCBjaGFuZ2UgKi8KLSAgICAgICAgZmluYWwgSVRhcmdldENoYW5nZUxpc3RlbmVyIHRhcmdldExpc3RlbmVyID0gbmV3IElUYXJnZXRDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvamVjdFRhcmdldENoYW5nZShJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCkgewotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkUHJvamVjdCA9PSBtRWRpdG9yLmdldFByb2plY3QoKSkgewotICAgICAgICAgICAgICAgICAgICBvblRhcmdldHNMb2FkZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFyZ2V0c0xvYWRlZCgpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBhIGRldGFpbHMgcGFydCBoYXMgYmVlbiBjcmVhdGVkLCB3ZSBuZWVkIHRvICJyZWZyZXNoIiBpdCB0b28uCi0gICAgICAgICAgICAgICAgaWYgKG1EZXRhaWxzUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZXRhaWxzIHBhcnQgZG9lcyBub3QgZGlyZWN0bHkgZXhwb3NlIGFjY2VzcyB0byBpdHMgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFnZSBib29rLiBJbnN0ZWFkIGl0IGlzIHBvc3NpYmxlIHRvIHJlc2l6ZSB0aGUgcGFnZSBib29rIHRvIDAgYW5kIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUsIHdoaWNoIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgYWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGNhY2hlZCBwYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0ID0gbURldGFpbHNQYXJ0LmdldFBhZ2VMaW1pdCgpOwotICAgICAgICAgICAgICAgICAgICBtRGV0YWlsc1BhcnQuc2V0UGFnZUxpbWl0KDApOwotICAgICAgICAgICAgICAgICAgICBtRGV0YWlsc1BhcnQuc2V0UGFnZUxpbWl0KGxpbWl0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgdHJlZSwgcHJlc2VydmluZyB0aGUgc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgotICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBTZXR1cCB0aGUgbGlzdGVuZXJzCi0gICAgICAgIGNoYW5nZVJvb3RBbmREZXNjcmlwdG9ycyhtVWlSb290Tm9kZSwgbURlc2NyaXB0b3JGaWx0ZXJzLCBmYWxzZSAvKiByZWZyZXNoICovKTsKLQotICAgICAgICAvLyBMaXN0ZW4gb24gcmVzb3VyY2UgZnJhbWV3b3JrIGNoYW5nZXMgdG8gcmVmcmVzaCB0aGUgdHJlZQotICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZFRhcmdldExpc3RlbmVyKHRhcmdldExpc3RlbmVyKTsKLQotICAgICAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIHdoZW4gdGhlIHRyZWUgd2lkZ2V0IGdldHMgZGlzcG9zZWQuCi0gICAgICAgIHRyZWUuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgbm9kZSA9IG1VaVJvb3ROb2RlLmdldFVpUGFyZW50KCkgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpUm9vdE5vZGUuZ2V0VWlQYXJlbnQoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpUm9vdE5vZGU7Ci0KLSAgICAgICAgICAgICAgICBub2RlLnJlbW92ZVVwZGF0ZUxpc3RlbmVyKG1VaVJlZnJlc2hMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgbVVpUm9vdE5vZGUucmVtb3ZlVXBkYXRlTGlzdGVuZXIobVVpRW5hYmxlTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVUYXJnZXRMaXN0ZW5lcih0YXJnZXRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1DbGlwYm9hcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ2xpcGJvYXJkLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNsaXBib2FyZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBHZXQgYSBuZXcgY2xpcGJvYXJkIHJlZmVyZW5jZS4gSXQgaXMgZGlzcG9zZWQgd2hlbiB0aGUgdHJlZSBpcyBkaXNwb3NlZC4KLSAgICAgICAgbUNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodHJlZS5nZXREaXNwbGF5KCkpOwotCi0gICAgICAgIHJldHVybiB0cmVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIFVJIHJvb3Qgbm9kZSBhbmQgdGhlIGRlc2NyaXB0b3IgZmlsdGVycyBvZiB0aGUgdHJlZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyByZW1vdmVzIHRoZSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIG9sZCByb290IG5vZGUgYW5kIHJlYXR0YWNoZXMgdGhlbSB0byB0aGUKLSAgICAgKiBuZXcgb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIHVpUm9vdE5vZGUgVGhlIHJvb3Qge0BsaW5rIFVpRWxlbWVudE5vZGV9IHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBhcmUKLSAgICAgKiAgICAgICAgdG8gYmUgbWFuaXB1bGF0ZWQgYnkgdGhpcyB0cmVlIHZpZXcuIEluIGdlbmVyYWwgdGhpcyBpcyB0aGUgbWFuaWZlc3QgVUkgbm9kZSBvciB0aGUKLSAgICAgKiAgICAgICAgYXBwbGljYXRpb24gVUkgbm9kZS4gVGhpcyBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvckZpbHRlcnMgQSBsaXN0IG9mIGRlc2NyaXB0b3JzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkaXNwbGF5ZWQgYXMgcm9vdCBpbgotICAgICAqICAgICAgICB0aGlzIHRyZWUgdmlldy4gVXNlIG51bGwgb3IgYW4gZW1wdHkgbGlzdCB0byBhY2NlcHQgYW55IGtpbmQgb2Ygbm9kZS4KLSAgICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIElmIHRyZWUsIGZvcmNlcyB0aGUgdHJlZSB0byByZWZyZXNoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhbmdlUm9vdEFuZERlc2NyaXB0b3JzKFVpRWxlbWVudE5vZGUgdWlSb290Tm9kZSwKLSAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gZGVzY3JpcHRvckZpbHRlcnMsIGJvb2xlYW4gZm9yY2VSZWZyZXNoKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgbm9kZTsKLQotICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgbGlzdGVuZXJzIGlmIGFueQotICAgICAgICBpZiAobVVpUm9vdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbm9kZSA9IG1VaVJvb3ROb2RlLmdldFVpUGFyZW50KCkgIT0gbnVsbCA/IG1VaVJvb3ROb2RlLmdldFVpUGFyZW50KCkgOiBtVWlSb290Tm9kZTsKLSAgICAgICAgICAgIG5vZGUucmVtb3ZlVXBkYXRlTGlzdGVuZXIobVVpUmVmcmVzaExpc3RlbmVyKTsKLSAgICAgICAgICAgIG1VaVJvb3ROb2RlLnJlbW92ZVVwZGF0ZUxpc3RlbmVyKG1VaUVuYWJsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1VaVJvb3ROb2RlID0gdWlSb290Tm9kZTsKLSAgICAgICAgbURlc2NyaXB0b3JGaWx0ZXJzID0gZGVzY3JpcHRvckZpbHRlcnM7Ci0KLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBVaU1vZGVsVHJlZUNvbnRlbnRQcm92aWRlcihtVWlSb290Tm9kZSwgbURlc2NyaXB0b3JGaWx0ZXJzKSk7Ci0KLSAgICAgICAgLy8gTGlzdGVuIG9uIHN0cnVjdHVyYWwgY2hhbmdlcyBvbiB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlCi0gICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBhIHBhcmVudCwgbGlzdGVuIG9uIHRoZSBwYXJlbnQgaW5zdGVhZC4KLSAgICAgICAgbm9kZSA9IG1VaVJvb3ROb2RlLmdldFVpUGFyZW50KCkgIT0gbnVsbCA/IG1VaVJvb3ROb2RlLmdldFVpUGFyZW50KCkgOiBtVWlSb290Tm9kZTsKLSAgICAgICAgbm9kZS5hZGRVcGRhdGVMaXN0ZW5lcihtVWlSZWZyZXNoTGlzdGVuZXIpOwotCi0gICAgICAgIC8vIFVzZSB0aGUgcm9vdCBub2RlIHRvIGxpc3RlbiB0byBpdHMgcHJlc2VuY2UuCi0gICAgICAgIG1VaVJvb3ROb2RlLmFkZFVwZGF0ZUxpc3RlbmVyKG1VaUVuYWJsZUxpc3RlbmVyKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlCi0gICAgICAgIG1VaUVuYWJsZUxpc3RlbmVyLnVpRWxlbWVudE5vZGVVcGRhdGVkKG1VaVJvb3ROb2RlLCBudWxsIC8qIHN0YXRlLCBub3QgdXNlZCAqLyk7Ci0KLSAgICAgICAgaWYgKGZvcmNlUmVmcmVzaCkgewotICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRlU2VjdGlvbkFjdGlvbnMobU1hc3RlclBhcnQuZ2V0U2VjdGlvbigpLCBtTWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBidXR0b25zIG5leHQgdG8gdGhlIHRyZWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbnMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIGdyaWQpIHsKLQotICAgICAgICBtVWlUcmVlQWN0aW9ucyA9IG5ldyBVaVRyZWVBY3Rpb25zKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbl9ncmlkID0gU2VjdGlvbkhlbHBlci5jcmVhdGVHcmlkTGF5b3V0KGdyaWQsIHRvb2xraXQsIDEpOwotICAgICAgICBidXR0b25fZ3JpZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLSAgICAgICAgbUFkZEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbl9ncmlkLCAiQWRkLi4uIiwgU1dULlBVU0gpOwotICAgICAgICBTZWN0aW9uSGVscGVyLmFkZENvbnRyb2xUb29sdGlwKG1BZGRCdXR0b24sICJBZGRzIGEgbmV3IGVsZW1lbnQuIik7Ci0gICAgICAgIG1BZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwKLSAgICAgICAgICAgICAgICBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotICAgICAgICBtQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgZG9UcmVlQWRkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1SZW1vdmVCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25fZ3JpZCwgIlJlbW92ZS4uLiIsIFNXVC5QVVNIKTsKLSAgICAgICAgU2VjdGlvbkhlbHBlci5hZGRDb250cm9sVG9vbHRpcChtUmVtb3ZlQnV0dG9uLCAiUmVtb3ZlcyBhbiBleGlzdGluZyBzZWxlY3RlZCBlbGVtZW50LiIpOwotICAgICAgICBtUmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIG1SZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBkb1RyZWVSZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVVwQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uX2dyaWQsICJVcCIsIFNXVC5QVVNIKTsKLSAgICAgICAgU2VjdGlvbkhlbHBlci5hZGRDb250cm9sVG9vbHRpcChtUmVtb3ZlQnV0dG9uLCAiTW92ZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQgdXAuIik7Ci0gICAgICAgIG1VcEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBtVXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBkb1RyZWVVcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtRG93bkJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbl9ncmlkLCAiRG93biIsIFNXVC5QVVNIKTsKLSAgICAgICAgU2VjdGlvbkhlbHBlci5hZGRDb250cm9sVG9vbHRpcChtUmVtb3ZlQnV0dG9uLCAiTW92ZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQgZG93bi4iKTsKLSAgICAgICAgbURvd25CdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbURvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBkb1RyZWVEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkanVzdFRyZWVCdXR0b25zKFRyZWVTZWxlY3Rpb24uRU1QVFkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUcmVlQ29udGV4dE1lbnUoVHJlZSB0cmVlKSB7Ci0gICAgICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWVudSBpcyBhYm91dCB0byBiZSBzaG93bi4gVGhlIG1lbnUgbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAgICAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlIGFueSBleGlzdGluZyBtZW51IGl0ZW0uIFRoaXMgbWV0aG9kIGdldHMgdGhlCi0gICAgICAgICAgICAgKiB0cmVlIHNlbGVjdGlvbiBhbmQgaWYgaXQgaXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaXQgcmUtY3JlYXRlcwotICAgICAgICAgICAgICogdGhlIG5lY2Vzc2FyeSBhY3Rpb25zLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBzZWxlY3RlZCA9IGZpbHRlclNlbGVjdGlvbigoSVRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgZG9DcmVhdGVNZW51QWN0aW9uKG1hbmFnZXIsIHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBkb0NyZWF0ZU1lbnVBY3Rpb24obWFuYWdlciwgbnVsbCAvKiB1aV9ub2RlICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIE1lbnUgY29udGV4dE1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlKTsKLSAgICAgICAgdHJlZS5zZXRNZW51KGNvbnRleHRNZW51KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBtZW51IGFjdGlvbnMgdG8gdGhlIGNvbnRleHQgbWVudSB3aGVuIHRoZSBnaXZlbiBVSSBub2RlIGlzIHNlbGVjdGVkIGluCi0gICAgICogdGhlIHRyZWUgdmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBjb250ZXh0IG1lbnUgbWFuYWdlcgotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgVUkgbm9kZXMgc2VsZWN0ZWQgaW4gdGhlIHRyZWUuIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSByb290Ci0gICAgICogICAgICAgICAgICAgICAgaXMgdG8gYmUgbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvQ3JlYXRlTWVudUFjdGlvbihJTWVudU1hbmFnZXIgbWFuYWdlciwgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+IHNlbGVjdGVkKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1htbCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpTm9kZSA6IHNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVpTm9kZS5nZXRYbWxOb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYXNYbWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNYbWwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQ29weUN1dEFjdGlvbihnZXRFZGl0b3IoKSwgZ2V0Q2xpcGJvYXJkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZWxlY3RlZCwgdHJ1ZSAvKiBjdXQgKi8pKTsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQ29weUN1dEFjdGlvbihnZXRFZGl0b3IoKSwgZ2V0Q2xpcGJvYXJkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZWxlY3RlZCwgZmFsc2UgLyogY3V0ICovKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW4ndCBwYXN0ZSB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBzZWxlY3RlZCAodGhlIHNlbGVjdGlvbiBpcyB0aGUgdGFyZ2V0KQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5zaXplKCkgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBQYXN0ZSBpcyBub3QgdmFsaWQgaWYgaXQgd291bGQgYWRkIGEgc2Vjb25kIGVsZW1lbnQgb24gYSB0ZXJtaW5hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHBhcmVudCBpcyBhIGRvY3VtZW50IC0tIGFuIFhNTCBkb2N1bWVudCBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyBwYXN0ZSBpcyB2YWxpZCBpZiB0aGUgY3VycmVudCBVSSBub2RlIGNhbiBoYXZlIGNoaWxkcmVuIG9yIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgaXMgbm90IGEgZG9jdW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlfcm9vdCA9IHNlbGVjdGVkLmdldCgwKS5nZXRVaVJvb3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVpX3Jvb3QuZ2V0RGVzY3JpcHRvcigpLmhhc0NoaWxkcmVuKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKHVpX3Jvb3QuZ2V0VWlQYXJlbnQoKSBpbnN0YW5jZW9mIFVpRG9jdW1lbnROb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IFBhc3RlQWN0aW9uKGdldEVkaXRvcigpLCBnZXRDbGlwYm9hcmQoKSwgc2VsZWN0ZWQuZ2V0KDApKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFwcGVuZCAiYWRkIiBhbmQgInJlbW92ZSIgYWN0aW9ucy4gVGhleSBkbyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgYWRkL3JlbW92ZQotICAgICAgICAvLyBidXR0b25zIG9uIHRoZSBzaWRlLgotICAgICAgICBJY29uRmFjdG9yeSBmYWN0b3J5ID0gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAvLyAiQWRkIiBtYWtlcyBzZW5zZSBvbmx5IGlmIHRoZXJlJ3MgMCBvciAxIGl0ZW0gc2VsZWN0ZWQgc2luY2UgdGhlCi0gICAgICAgIC8vIG9uZSBzZWxlY3RlZCBpdGVtIGJlY29tZXMgdGhlIHRhcmdldC4KLSAgICAgICAgaWYgKHNlbGVjdGVkID09IG51bGwgfHwgc2VsZWN0ZWQuc2l6ZSgpIDw9IDEpIHsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIkFkZC4uLiIsIGZhY3RvcnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJhZGQiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5ydW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZG9UcmVlQWRkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWN0aW9uKCJSZW1vdmUiLCBmYWN0b3J5LmdldEltYWdlRGVzY3JpcHRvcigiZGVsZXRlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb1RyZWVSZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IEFjdGlvbigiVXAiLCBmYWN0b3J5LmdldEltYWdlRGVzY3JpcHRvcigidXAiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5ydW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZG9UcmVlVXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIkRvd24iLCBmYWN0b3J5LmdldEltYWdlRGVzY3JpcHRvcigiZG93biIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICBkb1RyZWVEb3duKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB0cmVlIHdoZW4gYSBzZWxlY3Rpb24gaXMgbWFkZS4KLSAgICAgKiBJdCBlbmFibGVzL2Rpc2FibGVzIHRoZSBidXR0b25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQKLSAgICAgKiBzZWxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBjdXJyZW50IHRyZWUgc2VsZWN0aW9uIChzYW1lIGFzIG1UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGp1c3RUcmVlQnV0dG9ucyhJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBtUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pOwotICAgICAgICBtVXBCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbik7Ci0gICAgICAgIG1Eb3duQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGFkYXB0ZXIvd3JhcHBlciB0byB1c2UgdGhlIGFkZC9yZW1vdmUvdXAvZG93biB0cmVlIGVkaXQgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFVpVHJlZUFjdGlvbnMgZXh0ZW5kcyBVaUFjdGlvbnMgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFVpRWxlbWVudE5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpUm9vdE5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0VWlOb2RlKFVpRWxlbWVudE5vZGUgdWlOb2RlVG9TZWxlY3QpIHsKLSAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgbmV3IGl0ZW0KLSAgICAgICAgICAgIGlmICh1aU5vZGVUb1NlbGVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGlua2VkTGlzdDxVaUVsZW1lbnROb2RlPiBzZWdtZW50cyA9IG5ldyBMaW5rZWRMaXN0PFVpRWxlbWVudE5vZGU+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpX25vZGUgPSB1aU5vZGVUb1NlbGVjdDsgdWlfbm9kZSAhPSBtVWlSb290Tm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpX25vZGUgPSB1aV9ub2RlLmdldFVpUGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMuYWRkKDAsIHVpX25vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFRyZWVTZWxlY3Rpb24obmV3IFRyZWVQYXRoKHNlZ21lbnRzLnRvQXJyYXkoKSkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdFBlbmRpbmdYbWxDaGFuZ2VzKCkgewotICAgICAgICAgICAgY29tbWl0TWFuYWdlZEZvcm0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbHRlcnMgYW4gSVRyZWVTZWxlY3Rpb24gdG8gb25seSBrZWVwIHRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX1zIChpbiBjYXNlIHRoZXJlJ3MKLSAgICAgKiBzb21ldGhpbmcgZWxzZSBpbiB0aGVyZSkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgbmV3IGxpc3Qgb2Yge0BsaW5rIFVpRWxlbWVudE5vZGV9IHdpdGggYXQgbGVhc3Qgb25lIGl0ZW0gb3IgbnVsbC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBmaWx0ZXJTZWxlY3Rpb24oSVRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8VWlFbGVtZW50Tm9kZT4oKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRPYmogPSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZE9iaiBpbnN0YW5jZW9mIFVpRWxlbWVudE5vZGUpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZC5hZGQoKFVpRWxlbWVudE5vZGUpIHNlbGVjdGVkT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWxlY3RlZC5zaXplKCkgPiAwID8gc2VsZWN0ZWQgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSAiQWRkLi4uIiBidXR0b24gbmV4dCB0byB0aGUgdHJlZSB2aWV3IGlzIHNlbGVjdGVkLgotICAgICAqCi0gICAgICogRGlzcGxheXMgYSBzZWxlY3Rpb24gZGlhbG9nIHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3Qgd2hpY2gga2luZCBvZiBub2RlCi0gICAgICogdG8gY3JlYXRlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1RyZWVBZGQoKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlfbm9kZSA9IG1VaVJvb3ROb2RlOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElUcmVlU2VsZWN0aW9uIHRyZWVfc2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICBPYmplY3QgZmlyc3QgPSB0cmVlX3NlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdCAhPSBudWxsICYmIGZpcnN0IGluc3RhbmNlb2YgVWlFbGVtZW50Tm9kZSkgewotICAgICAgICAgICAgICAgIHVpX25vZGUgPSAoVWlFbGVtZW50Tm9kZSkgZmlyc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtVWlUcmVlQWN0aW9ucy5kb0FkZCgKLSAgICAgICAgICAgICAgICB1aV9ub2RlLAotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yRmlsdGVycywKLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAoSUxhYmVsUHJvdmlkZXIpIG1UcmVlVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlICJSZW1vdmUiIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLSAgICAgKgotICAgICAqIElmIHRoZSB0cmVlIGhhcyBhIHNlbGVjdGlvbiwgcmVtb3ZlIGl0LgotICAgICAqIFRoaXMgc2ltcGx5IGRlbGV0ZXMgdGhlIFhNTCBub2RlIGF0dGFjaGVkIHRvIHRoZSBVSSBub2RlOiB3aGVuIHRoZSBYTUwgbW9kZWwgZmlyZXMgdGhlCi0gICAgICogdXBkYXRlIGV2ZW50LCB0aGUgdHJlZSB3aWxsIGdldCByZWZyZXNoZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UcmVlUmVtb3ZlKCkgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBzZWxlY3RlZCA9IGZpbHRlclNlbGVjdGlvbigoSVRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBtVWlUcmVlQWN0aW9ucy5kb1JlbW92ZShzZWxlY3RlZCwgbVRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlICJVcCIgYnV0dG9uIGlzIHNlbGVjdGVkLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgdHJlZSBoYXMgYSBzZWxlY3Rpb24sIG1vdmUgaXQgdXAsIGVpdGhlciBpbiB0aGUgY2hpbGQgbGlzdCBvciBhcyB0aGUgbGFzdCBjaGlsZAotICAgICAqIG9mIHRoZSBwcmV2aW91cyBwYXJlbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UcmVlVXAoKSB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikgewotICAgICAgICAgICAgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+IHNlbGVjdGVkID0gZmlsdGVyU2VsZWN0aW9uKChJVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIG1VaVRyZWVBY3Rpb25zLmRvVXAoc2VsZWN0ZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlICJEb3duIiBidXR0b24gaXMgc2VsZWN0ZWQuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgdHJlZSBoYXMgYSBzZWxlY3Rpb24sIG1vdmUgaXQgZG93biwgZWl0aGVyIGluIHRoZSBzYW1lIGNoaWxkIGxpc3Qgb3IgYXMgdGhlCi0gICAgICogZmlyc3QgY2hpbGQgb2YgdGhlIG5leHQgcGFyZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvVHJlZURvd24oKSB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikgewotICAgICAgICAgICAgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+IHNlbGVjdGVkID0gZmlsdGVyU2VsZWN0aW9uKChJVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIG1VaVRyZWVBY3Rpb25zLmRvRG93bihzZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXRzIHRoZSBjdXJyZW50IG1hbmFnZWQgZm9ybSAodGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggb3VyIG1hc3RlciBwYXJ0KS4KLSAgICAgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIHdpbGwgY29tbWl0IHRoZSBjdXJyZW50IFVpRWxlbWVudERldGFpbHMgcGFnZS4KLSAgICAgKi8KLSAgICB2b2lkIGNvbW1pdE1hbmFnZWRGb3JtKCkgewotICAgICAgICBpZiAobU1hbmFnZWRGb3JtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NYW5hZ2VkRm9ybS5jb21taXQoZmFsc2UgLyogb25TYXZlICovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEltcGxlbWVudHMgSUNvbW1pdFhtbCBmb3IgQ29weUN1dEFjdGlvbiAqLwotICAgIHB1YmxpYyB2b2lkIGNvbW1pdFBlbmRpbmdYbWxDaGFuZ2VzKCkgewotICAgICAgICBjb21taXRNYW5hZ2VkRm9ybSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRvb2xCYXJBY3Rpb25zKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICAvLyBQYXNzLiBOb3QgdXNlZCwgdG9vbGJhciBhY3Rpb25zIGFyZSBkZWZpbmVkIGJ5IGNyZWF0ZVNlY3Rpb25BY3Rpb25zKCkuCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQYWdlcyhEZXRhaWxzUGFydCBkZXRhaWxzUGFydCkgewotICAgICAgICAvLyBLZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBkZXRhaWxzIHBhcnQgKHRoZSBzdXBlciBjbGFzcyBkb2Vzbid0IHByb3ZpZGUgYSBnZXR0ZXIKLSAgICAgICAgLy8gZm9yIGl0LikKLSAgICAgICAgbURldGFpbHNQYXJ0ID0gZGV0YWlsc1BhcnQ7Ci0KLSAgICAgICAgLy8gVGhlIHBhZ2Ugc2VsZWN0aW9uIG1lY2hhbmlzbSBkb2VzIG5vdCB1c2UgcGFnZXMgcmVnaXN0ZXJlZCBieSBhc3NvY2lhdGlvbiB3aXRoCi0gICAgICAgIC8vIGEgbm9kZSBjbGFzcy4gSW5zdGVhZCBpdCB1c2VzIGEgY3VzdG9tIGRldGFpbHMgcGFnZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIGEKLSAgICAgICAgLy8gbmV3IFVpRWxlbWVudERldGFpbCBpbnN0YW5jZSBmb3IgZWFjaCBub2RlIGluc3RhbmNlLiBBIGxpbWl0IG9mIDUgcGFnZXMgaXMKLSAgICAgICAgLy8gdGhlbiBzZXQgKHRoZSB2YWx1ZSBpcyBhcmJpdHJhcnkgYnV0IHNob3VsZCBiZSByZWFzb25hYmxlKSBmb3IgdGhlIGludGVybmFsCi0gICAgICAgIC8vIHBhZ2UgYm9vay4KLSAgICAgICAgZGV0YWlsc1BhcnQuc2V0UGFnZUxpbWl0KDUpOwotCi0gICAgICAgIGZpbmFsIFVpVHJlZUJsb2NrIHRyZWUgPSB0aGlzOwotCi0gICAgICAgIGRldGFpbHNQYXJ0LnNldFBhZ2VQcm92aWRlcihuZXcgSURldGFpbHNQYWdlUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgSURldGFpbHNQYWdlIGdldFBhZ2UoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBVaUVsZW1lbnROb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWlFbGVtZW50RGV0YWlsKHRyZWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYWdlS2V5KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgLy8gdXNlIG5vZGUgb2JqZWN0IGFzIGtleQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhbHBoYWJldGljIHNvcnQgYWN0aW9uIGZvciB0aGUgdHJlZSB2aWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUcmVlU29ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBWaWV3ZXJDb21wYXJhdG9yIG1Db21wYXJhdG9yOwotCi0gICAgICAgIHB1YmxpYyBUcmVlU29ydEFjdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCJTb3J0cyBlbGVtZW50cyBhbHBoYWJldGljYWxseS4iLCBBU19DSEVDS19CT1gpOwotICAgICAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJhel9zb3J0IikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIGlmIChtVHJlZVZpZXdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc19zb3J0ZWQgPSBtVHJlZVZpZXdlci5nZXRDb21wYXJhdG9yKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2VkKGlzX3NvcnRlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBzZWxlY3RlZC4gVG9nZ2xlcyB0aGUgdHJlZSB2aWV3ZXIgY29tcGFyYXRvci4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobVRyZWVWaWV3ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vdGlmeVJlc3VsdChmYWxzZSAvKnN1Y2Nlc3MqLyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBWaWV3ZXJDb21wYXJhdG9yIGNvbXAgPSBtVHJlZVZpZXdlci5nZXRDb21wYXJhdG9yKCk7Ci0gICAgICAgICAgICBpZiAoY29tcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJlZSBpcyBjdXJyZW50bHkgc29ydGVkLgotICAgICAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudGx5IGNvbXBhcmF0b3IgYW5kIHJlbW92ZSBpdAotICAgICAgICAgICAgICAgIG1Db21wYXJhdG9yID0gY29tcDsKLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUcmVlIGlzIG5vdCBjdXJyZW50bHkgc29ydGVkLgotICAgICAgICAgICAgICAgIC8vIFJldXNlIG9yIGFkZCBhIG5ldyBjb21wYXJhdG9yLgotICAgICAgICAgICAgICAgIGlmIChtQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db21wYXJhdG9yID0gbmV3IFZpZXdlckNvbXBhcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihtQ29tcGFyYXRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vdGlmeVJlc3VsdCh0cnVlIC8qc3VjY2VzcyovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZmlsdGVyIG9uIGRlc2NyaXB0b3IgZm9yIHRoZSB0cmVlIHZpZXdlci4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHRyZWUgdmlld2VyIHdpbGwgY29udGFpbiBtYW55IG9mIHRoZXNlIGFjdGlvbnMgYW5kIG9ubHkgb25lIGNhbiBiZSBlbmFibGVkIGF0IGEKLSAgICAgKiBnaXZlbiB0aW1lLiBXaGVuIG5vIGFjdGlvbiBpcyBzZWxlY3RlZCwgZXZlcnl0aGluZyBpcyBkaXNwbGF5ZWQuCi0gICAgICogPHAvPgotICAgICAqIFNpbmNlICJyYWRpbyItbGlrZSBhY3Rpb25zIGRvIG5vdCBhbGxvdyBmb3IgdW5zZWxlY3RpbmcgYWxsIG9mIHRoZW0sIHdlIG1hbnVhbGx5Ci0gICAgICogaGFuZGxlIHRoZSBleGNsdXNpdmUgcmFkaW8gYnV0dG9uLWxpa2UgcHJvcGVydHk6IHdoZW4gYW4gYWN0aW9uIGlzIHNlbGVjdGVkLCBpdCBtYW51YWxseQotICAgICAqIHJlbW92ZXMgYWxsIG90aGVyIGFjdGlvbnMgYXMgbmVlZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRGVzY3JpcHRvckZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50RGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLSAgICAgICAgcHJpdmF0ZSBWaWV3ZXJGaWx0ZXIgbUZpbHRlcjsKLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvckZpbHRlckFjdGlvbihFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihTdHJpbmcuZm9ybWF0KCJEaXNwbGF5cyBvbmx5ICUxJHMgZWxlbWVudHMuIiwgZGVzY3JpcHRvci5nZXRVaU5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIEFTX0NIRUNLX0JPWCk7Ci0KLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIEZpbmQgYW55IGV4aXN0aW5nIHtAbGluayBEZXNjcmlwdG9yRmlsdGVyfXMgYW5kIHJlbW92ZSB0aGVtLiBJbnN0YWxsIG91cnMuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc3VwZXIucnVuKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZpbHRlciB3aGVuIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIG1GaWx0ZXIgPSBuZXcgRGVzY3JpcHRvckZpbHRlcih0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBhZGQgb3VyIGZpbHRlciBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBVSSBtaWdodCBzaG93IHRoZSBmdWxsIGxpc3QKLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5hZGRGaWx0ZXIobUZpbHRlcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGVuIHJlbW92ZSB0aGUgYW55IG90aGVyIGZpbHRlcnMgZXhjZXB0IG91cnMuIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0Ci0gICAgICAgICAgICAgICAgLy8gb25lIG90aGVyIGZpbHRlciwgc2luY2UgdGhhdCdzIGhvdyB0aGUgYWN0aW9ucyBhcmUgbWFkZSB0byBsb29rIGxpa2UKLSAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgcmFkaW8gYnV0dG9ucy4KLSAgICAgICAgICAgICAgICBmb3IgKFZpZXdlckZpbHRlciBmaWx0ZXIgOiBtVHJlZVZpZXdlci5nZXRGaWx0ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JGaWx0ZXIgJiYgZmlsdGVyICE9IG1GaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JGaWx0ZXJBY3Rpb24gYWN0aW9uID0gKChEZXNjcmlwdG9yRmlsdGVyKSBmaWx0ZXIpLmdldEFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1GaWx0ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVtb3ZlRmlsdGVyKG1GaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZpbHRlcnMgdGhlIHRyZWUgdmlld2VyIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGUgZmlsdGVyIGlzIGxpbmtlZCB0byB0aGUgYWN0aW9uIHNvIHRoYXQgYW4gYWN0aW9uIGNhbiBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QKLSAgICAgICAgICogb2YgZmlsdGVycyBhbmQgdW4tc2VsZWN0IHRoZSBhY3Rpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBEZXNjcmlwdG9yRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yRmlsdGVyQWN0aW9uIG1BY3Rpb247Ci0KLSAgICAgICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yRmlsdGVyKERlc2NyaXB0b3JGaWx0ZXJBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIERlc2NyaXB0b3JGaWx0ZXJBY3Rpb24gZ2V0QWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBlbGVtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQsIHRoYXQgaWYgdGhlIGVsZW1lbnQgb3IKLSAgICAgICAgICAgICAqIGFueSBvZiBpdHMgcGFyZW50IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIFVpRWxlbWVudE5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5vZGUgPSAoVWlFbGVtZW50Tm9kZSllbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAodWlOb2RlLmdldERlc2NyaXB0b3IoKSA9PSBtRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHVpTm9kZS5nZXRVaVBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvSVVpU2V0dGFibGVBdHRyaWJ1dGVOb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL0lVaVNldHRhYmxlQXR0cmlidXRlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkwOGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvSVVpU2V0dGFibGVBdHRyaWJ1dGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVjb3JhdGlvbiBpbmRpY2F0ZXMgdGhhdCBhIGdpdmVuIFVpQXR0cmlidXRlTm9kZSBjYW4gYm90aAotICogc2V0IGFuZCBnZXQgaXRzIGN1cnJlbnQgdmFsdWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVpU2V0dGFibGVBdHRyaWJ1dGVOb2RlIHsKLQotICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBub2RlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFZhbHVlKCk7Ci0gICAgCi0gICAgLyoqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG5vZGUuIENhbm5vdCBiZSBudWxsICh1c2UgYW4gZW1wdHkgc3RyaW5nKS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9JVWlVcGRhdGVMaXN0ZW5lci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9JVWlVcGRhdGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYxZjc0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvSVVpVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbDsKLQotCi0vKioKLSAqIExpc3RlbiB0byB1cGRhdGUgbm90aWZpY2F0aW9ucyBpbiBVSSBub2Rlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVWlVcGRhdGVMaXN0ZW5lciB7Ci0KLSAgICAvKiogVXBkYXRlIHN0YXRlIG9mIHRoZSBVSSBub2RlICovCi0gICAgcHVibGljIGVudW0gVWlVcGRhdGVTdGF0ZSB7Ci0gICAgICAgIC8qKiBUaGUgbm9kZSdzIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHVwZGF0ZWQuIFRoZXkgbWF5IG9yIG1heSBub3QgYWN0dWFsbHkgaGF2ZSBjaGFuZ2VkLiAqLwotICAgICAgICBBVFRSX1VQREFURUQsCi0gICAgICAgIC8qKiBUaGUgbm9kZSBzdWItc3RydWN0dXJlIChpLmUuIGNoaWxkIG5vZGVzKSBoYXMgY2hhbmdlZCAqLwotICAgICAgICBDSElMRFJFTl9DSEFOR0VELAotICAgICAgICAvKiogVGhlIFhNTCBjb3VudGVycGFydCBmb3IgdGhlIFVJIG5vZGUgaGFzIGp1c3QgYmVlbiBjcmVhdGVkLiAqLwotICAgICAgICBDUkVBVEVELAotICAgICAgICAvKiogVGhlIFhNTCBjb3VudGVycGFydCBmb3IgdGhlIFVJIG5vZGUgaGFzIGp1c3QgYmVlbiBkZWxldGVkLgotICAgICAgICAgKiAgTm90ZSB0aGF0IG1hbmRhdG9yeSBVSSBub2RlcyBhcmUgbmV2ZXIgYWN0dWFsbHkgZGVsZXRlZC4gKi8KLSAgICAgICAgREVMRVRFRAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IGFuIFVpRWxlbWVudE5vZGUgaGFzIGJlZW4gdXBkYXRlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBoYXBwZW5zIHdoZW4gYW4ge0BsaW5rIFVpRWxlbWVudE5vZGV9IGlzIHJlZnJlc2hlZCB0byBtYXRjaCB0aGUKLSAgICAgKiBYTUwgbW9kZWwuIFRoZSBhY3R1YWwgVUkgZWxlbWVudCBub2RlIG1heSBvciBtYXkgbm90IGhhdmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdWlfbm9kZSBUaGUge0BsaW5rIFVpRWxlbWVudE5vZGV9IGJlaW5nIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdWlFbGVtZW50Tm9kZVVwZGF0ZWQoVWlFbGVtZW50Tm9kZSB1aV9ub2RlLCBVaVVwZGF0ZVN0YXRlIHN0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpQWJzdHJhY3RUZXh0QXR0cmlidXRlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEwODM5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgYXR0cmlidXRlIGluIHRoYXQgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGEgc2ltcGxlIHRleHQgZmllbGQKLSAqIGluIHRoZSBYTUwgZWRpdG9yJ3MgdXNlciBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiBUaGUgWE1MIGF0dHJpYnV0ZSBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4gV2hlbiB1bnNldCwgdGhlIHRleHQgZmllbGQgaXMgYmxhbmsuCi0gKiBXaGVuIHVwZGF0aW5nIHRoZSBYTUwsIGlmIHRoZSBmaWVsZCBpcyBlbXB0eSwgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQKLSAqIGZyb20gdGhlIFhNTCBlbGVtZW50LiAgCi0gKiA8cC8+Ci0gKiBTZWUge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVaUFic3RyYWN0VGV4dEF0dHJpYnV0ZU5vZGUgZXh0ZW5kcyBVaUF0dHJpYnV0ZU5vZGUKLSAgICBpbXBsZW1lbnRzIElVaVNldHRhYmxlQXR0cmlidXRlTm9kZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTFVFID0gIiI7ICAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogUHJldmVudCBpbnRlcm5hbCBsaXN0ZW5lciBmcm9tIGZpcmluZyB3aGVuIGludGVybmFsbHkgbW9kaWZ5aW5nIHRoZSB0ZXh0ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1JbnRlcm5hbFRleHRNb2RpZmljYXRpb247Ci0gICAgLyoqIExhc3QgdmFsdWUgcmVhZCBmcm9tIHRoZSBYTUwgbW9kZWwuIENhbm5vdCBiZSBudWxsLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50VmFsdWUgPSBERUZBVUxUX1ZBTFVFOwotCi0gICAgcHVibGljIFVpQWJzdHJhY3RUZXh0QXR0cmlidXRlTm9kZShBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJpYnV0ZURlc2NyaXB0b3IsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG5vZGUuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDdXJyZW50VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKiogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbm9kZS4gQ2Fubm90IGJlIG51bGwgKHVzZSBhbiBlbXB0eSBzdHJpbmcpLiAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEN1cnJlbnRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKiogUmV0dXJucyBpZiB0aGUgYXR0cmlidXRlIG5vZGUgaXMgdmFsaWQsIGFuZCBpdHMgVUkgaGFzIGJlZW4gY3JlYXRlZC4gKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgdGV4dCB2YWx1ZSBwcmVzZW50IGluIHRoZSBVSS4gKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHRXaWRnZXRWYWx1ZSgpOwotICAgIAotICAgIC8qKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dFdpZGdldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHRleHQgZmllbGQncyB2YWx1ZSB3aGVuIHRoZSBYTUwgaGFzIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgZG9lc24ndCByZWFsbHkga25vdyBpZiBhdHRyaWJ1dGVzIGhhdmUgY2hhbmdlZCwKLSAgICAgKiBzbyBpdCB3aWxsIGNhbGwgdGhpcyB0byByZWZyZXNoIHRoZSBhdHRyaWJ1dGUgYW55d2F5LiBUaGUgdmFsdWUKLSAgICAgKiBpcyBvbmx5IHNldCBpZiBpdCBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhbHNvIHJlc2V0cyB0aGUgImRpcnR5IiBmbGFnLgotICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVmFsdWUoTm9kZSB4bWxfYXR0cmlidXRlX25vZGUpIHsKLSAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IERFRkFVTFRfVkFMVUU7Ci0gICAgICAgIGlmICh4bWxfYXR0cmlidXRlX25vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IHhtbF9hdHRyaWJ1dGVfbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ZhbGlkKCkgJiYgIWdldFRleHRXaWRnZXRWYWx1ZSgpLmVxdWFscyhtQ3VycmVudFZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxUZXh0TW9kaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZXRUZXh0V2lkZ2V0VmFsdWUobUN1cnJlbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RGlydHkoZmFsc2UpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxUZXh0TW9kaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIENhbGxlZCBieSB0aGUgdXNlciBpbnRlcmZhY2Ugd2hlbiB0aGUgZWRpdG9yIGlzIHNhdmVkIG9yIGl0cyBzdGF0ZSBjaGFuZ2VkCi0gICAgICogYW5kIHRoZSBtb2RpZmllZCBhdHRyaWJ1dGVzIG11c3QgYmUgY29tbWl0dGVkIChpLmUuIHdyaXR0ZW4pIHRvIHRoZSBYTUwgbW9kZWwuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29tbWl0KCkgewotICAgICAgICBVaUVsZW1lbnROb2RlIHBhcmVudCA9IGdldFVpUGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBpc1ZhbGlkKCkgJiYgaXNEaXJ0eSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRUZXh0V2lkZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQuY29tbWl0QXR0cmlidXRlVG9YbWwodGhpcywgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0luSW50ZXJuYWxUZXh0TW9kaWZpY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbUludGVybmFsVGV4dE1vZGlmaWNhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0SW5JbnRlcm5hbFRleHRNb2RpZmljYXRpb24oYm9vbGVhbiBpbnRlcm5hbFRleHRNb2RpZmljYXRpb24pIHsKLSAgICAgICAgbUludGVybmFsVGV4dE1vZGlmaWNhdGlvbiA9IGludGVybmFsVGV4dE1vZGlmaWNhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpQXR0cmlidXRlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaUF0dHJpYnV0ZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2Y2ZlMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpQXR0cmlidXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSBYTUwgZWRpdG9yJ3MgdXNlciBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiBUaGUgY2hhcmFjdGVyaXN0aWNzIG9mIGFuIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9IGFyZSBkZWNsYXJlZCBieSBhCi0gKiBjb3JyZXNwb25kaW5nIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfS4KLSAqIDxwLz4KLSAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuIERlcml2ZWQgY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgY3JlYXRpb24gb2YgdGhlIFVJCi0gKiBhbmQgbWFuYWdlIGl0cyBzeW5jaHJvbml6YXRpb24gd2l0aCB0aGUgWE1MLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVWlBdHRyaWJ1dGVOb2RlIHsKLQotICAgIHByaXZhdGUgQXR0cmlidXRlRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgbVVpUGFyZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEaXJ0eTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0Vycm9yOwotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gbGlua2VkIHRvIGEgc3BlY2lmaWMge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9IAotICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBydW50aW5lIHtAbGluayBVaUVsZW1lbnROb2RlfSBwYXJlbnQuICovCi0gICAgcHVibGljIFVpQXR0cmlidXRlTm9kZShBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgbURlc2NyaXB0b3IgPSBhdHRyaWJ1dGVEZXNjcmlwdG9yOwotICAgICAgICBtVWlQYXJlbnQgPSB1aVBhcmVudDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9IHNwZWNpZmljIHRvIHRoaXMgVUkgYXR0cmlidXRlIG5vZGUgKi8KLSAgICBwdWJsaWMgZmluYWwgQXR0cmlidXRlRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHtAbGluayBVaUVsZW1lbnROb2RlfSB0aGF0IG93bnMgdGhpcyB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfSAqLwotICAgIHB1YmxpYyBmaW5hbCBVaUVsZW1lbnROb2RlIGdldFVpUGFyZW50KCkgewotICAgICAgICByZXR1cm4gbVVpUGFyZW50OwotICAgIH0KLSAgICAKLSAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbm9kZS4gKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEN1cnJlbnRWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBsb2FkZWQKLSAgICAgKiAgICAgICAgIGZyb20gdGhlIFhNTCBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gbUlzRGlydHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgZGlydHkgYW5kIGFsc28gbm90aWZpZXMgdGhlIGVkaXRvciBzb21lIHBhcnQncyBkaXJ0eQotICAgICAqIGZsYWcgYXMgY2hhbmdlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogU3ViY2xhc3NlcyBzaG91bGQgc2V0IHRoZSB0byB0cnVlIGFzIGEgcmVzdWx0IG9mIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgd2lkZ2V0cyBpbgotICAgICAqIHRoZSBzZWN0aW9uIGFuZCB0aGVuIHNob3VsZCBzZXQgdG8gZmFsc2Ugd2hlbiB0aGUgY29tbWl0KCkgbWV0aG9kIGNvbXBsZXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGlzRGlydHkpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRfdmFsdWUgPSBtSXNEaXJ0eTsKLSAgICAgICAgbUlzRGlydHkgPSBpc0RpcnR5OwotICAgICAgICAvLyBUT0RPOiBmb3IgdW5rbm93biBhdHRyaWJ1dGVzLCBnZXRQYXJlbnQoKSAhPSBudWxsICYmIGdldFBhcmVudCgpLmdldEVkaXRvcigpICE9IG51bGwKLSAgICAgICAgaWYgKG9sZF92YWx1ZSAhPSBpc0RpcnR5KSB7Ci0gICAgICAgICAgICBnZXRVaVBhcmVudCgpLmdldEVkaXRvcigpLmVkaXRvckRpcnR5U3RhdGVDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXJyb3IgZmxhZyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZXJyb3JGbGFnIHRoZSBlcnJvciBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0SGFzRXJyb3IoYm9vbGVhbiBlcnJvckZsYWcpIHsKLSAgICAgICAgbUhhc0Vycm9yID0gZXJyb3JGbGFnOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBub2RlIGhhcyBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0gICAgICAgIHJldHVybiBtSGFzRXJyb3I7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwYXJlbnQgdXNlciBpbnRlcmZhY2UgdG8gY3JlYXRlcyB0aGUgbmVjZXNzYXJ5Ci0gICAgICogdXNlciBpbnRlcmZhY2UgdG8gZWRpdCB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgbGlmZSBjeWNsZSBvZiBhbiBVSSBub2RlLAotICAgICAqIHR5cGljYWxseSB3aGVuIHRoZSBVSSBpcyBwYXJ0IG9mIGEgbWFzdGVyLWRldGFpbCB0cmVlLCBhcyBwYWdlcyBhcmUgc3dhcHBlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBjb21wb3NpdGUgd2hlcmUgdG8gY3JlYXRlIHRoZSB1c2VyIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlZEZvcm0gVGhlIG1hbmFnZWQgZm9ybSBvd25pbmcgdGhpcyBwYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVVpQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBnZXQgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgVUkgYXR0cmlidXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHVzZWQsIGFtb25nIG90aGVyIHRoaW5ncywgYnkgdGhlIFhNTCBDb250ZW50IEFzc2lzdHMgdG8gY29tcGxldGUgdmFsdWVzCi0gICAgICogZm9yIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGhhdmUgYW55IGtub3duIHZhbHVlcyBzaG91bGQgcmV0dXJuIG51bGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWZpeCBBbiBvcHRpb25hbCBwcmVmaXggc3RyaW5nLCB3aGljaCBpcyB3aGF0ZXZlciB0aGUgdXNlciBoYXMgYWxyZWFkeSBzdGFydGVkCi0gICAgICogICB0eXBpbmcuIENhbiBiZSBudWxsIG9yIGFuIGVtcHR5IHN0cmluZy4gVGhlIGltcGxlbWVudGF0aW9uIGNhbiB1c2UgdGhpcyB0byBmaWx0ZXIgY2hvaWNlcwotICAgICAqICAgYW5kIG9ubHkgcmV0dXJuIHN0cmluZ3MgdGhhdCBtYXRjaCB0aGlzIHByZWZpeC4gQSBsYXp5IG9yIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuCi0gICAgICogICBzaW1wbHkgaWdub3JlIHRoaXMgYW5kIHJldHVybiBldmVyeXRoaW5nLgotICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb24gdmFsdWVzLCBhbmQgZW1wdHkgYXJyYXkgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoU3RyaW5nIHByZWZpeCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIGlzIGJlaW5nIGxvYWRlZCBvciBoYXMgY2hhbmdlZCB0bwotICAgICAqIHVwZGF0ZSB0aGUgdmFsdWUgaGVsZCBieSB0aGlzIHVzZXIgaW50ZXJmYWNlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgWE1MIE5vZGUgPGVtPm1heTwvZW0+IGJlIG51bGwsIHdoaWNoIGRlbm90ZXMgdGhhdCB0aGUgYXR0cmlidXRlIGlzIG5vdAotICAgICAqIHNwZWNpZmllZCBpbiB0aGUgWE1MIG1vZGVsLiBJbiBnZW5lcmFsLCB0aGlzIG1lYW5zIHRoZSAiZGVmYXVsdCIgdmFsdWUgb2YgdGhlCi0gICAgICogYXR0cmlidXRlIHNob3VsZCBiZSB1c2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgY2FsbGVyIGRvZXNuJ3QgcmVhbGx5IGtub3cgaWYgYXR0cmlidXRlcyBoYXZlIGNoYW5nZWQsCi0gICAgICogc28gaXQgd2lsbCBjYWxsIHRoaXMgdG8gcmVmcmVzaCB0aGUgYXR0cmlidXRlIGFueXdheS4gSXQncyB1cCB0byB0aGUKLSAgICAgKiBVSSBpbXBsZW1lbnRhdGlvbiB0byBtaW5pbWl6ZSByZWZyZXNoZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9hdHRyaWJ1dGVfbm9kZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVZhbHVlKE5vZGUgeG1sX2F0dHJpYnV0ZV9ub2RlKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgdXNlciBpbnRlcmZhY2Ugd2hlbiB0aGUgZWRpdG9yIGlzIHNhdmVkIG9yIGl0cyBzdGF0ZSBjaGFuZ2VkCi0gICAgICogYW5kIHRoZSBtb2RpZmllZCBhdHRyaWJ1dGVzIG11c3QgYmUgY29tbWl0dGVkIChpLmUuIHdyaXR0ZW4pIHRvIHRoZSBYTUwgbW9kZWwuCi0gICAgICogPHAvPgotICAgICAqIEltcG9ydGFudCBiZWhhdmlvcnM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgY2FsbGVyICptdXN0KiBoYXZlIGNhbGxlZCBJU3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCBiZWZvcmUuCi0gICAgICogICAgIFRoZSBpbXBsZW1lbnRlZCBtZXRob2RzIG11c3QgYXNzdW1lIGl0IGlzIHNhZmUgdG8gbW9kaWZ5IHRoZSBYTUwgbW9kZWwuCi0gICAgICogPGxpPk9uIHN1Y2Nlc3MsIHRoZSBpbXBsZW1lbnRhdGlvbiAqbXVzdCogY2FsbCBzZXREaXJ0eShmYWxzZSkuCi0gICAgICogPGxpPk9uIGZhaWx1cmUsIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbiwgd2hpY2gKLSAgICAgKiAgICAgaXMgdHJhcHBlZCBhbmQgbG9nZ2VkIGJ5IHRoZSBjYWxsZXIsIG9yIGRvIG5vdGhpbmcsIHdoaWNoZXZlciBpcyBtb3JlCi0gICAgICogICAgIGFwcHJvcHJpYXRlLgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgY29tbWl0KCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpRG9jdW1lbnROb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpRG9jdW1lbnROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWM1ZTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaURvY3VtZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRvY3VtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLklVaVVwZGF0ZUxpc3RlbmVyLlVpVXBkYXRlU3RhdGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIGRvY3VtZW50IG5vZGUgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIgaW50ZXJmYWNlIGluIHRoZSBYTUwgZWRpdG9yLgotICogPHAvPgotICogVGhlIHN0cnVjdHVyZSBvZiBhIGdpdmVuIHtAbGluayBVaURvY3VtZW50Tm9kZX0gaXMgZGVjbGFyZWQgYnkgYSBjb3JyZXNwb25kaW5nCi0gKiB7QGxpbmsgRG9jdW1lbnREZXNjcmlwdG9yfS4KLSAqLwotcHVibGljIGNsYXNzIFVpRG9jdW1lbnROb2RlIGV4dGVuZHMgVWlFbGVtZW50Tm9kZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVWlEb2N1bWVudE5vZGV9IGRlc2NyaWJlZCBieSBhIGdpdmVuIHtAbGluayBEb2N1bWVudERlc2NyaXB0b3J9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudERlc2NyaXB0b3IgVGhlIHtAbGluayBEb2N1bWVudERlc2NyaXB0b3J9IGZvciB0aGUgWE1MIG5vZGUuIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBVaURvY3VtZW50Tm9kZShEb2N1bWVudERlc2NyaXB0b3IgZG9jdW1lbnREZXNjcmlwdG9yKSB7Ci0gICAgICAgIHN1cGVyKGRvY3VtZW50RGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgYSBzaG9ydCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVUkgbm9kZSBzdWl0YWJsZSBmb3IgdHJlZSB2aWV3cy4KLSAgICAgKiBVc2VzIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlICJhbmRyb2lkOm5hbWUiIGlmIHByZXNlbnQsIG9yIHRoZSAiYW5kcm9pZDpsYWJlbCIgb25lCi0gICAgICogZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQncyBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBzaG9ydCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVUkgbm9kZSBzdWl0YWJsZSBmb3IgdHJlZSB2aWV3cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiRG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbXB1dGVzIGEgImJyZWFkY3J1bWIgdHJhaWwiIGRlc2NyaXB0aW9uIGZvciB0aGlzIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluY2x1ZGVfcm9vdCBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHJvb3QgKGUuZy4gIk1hbmlmZXN0Iikgb3Igbm90LiBIYXMgbm8gZWZmZWN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB3aGVuIGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlIGl0c2VsZi4KLSAgICAgKiBAcmV0dXJuIFRoZSAiYnJlYWRjcnVtYiB0cmFpbCIgZGVzY3JpcHRpb24gZm9yIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJyZWFkY3J1bWJUcmFpbERlc2NyaXB0aW9uKGJvb2xlYW4gaW5jbHVkZV9yb290KSB7Ci0gICAgICAgIHJldHVybiAiRG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0ZWQgdG8gYXNzaWduIGEgcGFyZW50LCBzaW5jZSBYTUwgZG9jdW1lbnRzCi0gICAgICogY2Fubm90IGhhdmUgYSBwYXJlbnQuIEl0IGlzIE9LIHRvIGFzc2lnbiBudWxsLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVpUGFyZW50KFVpRWxlbWVudE5vZGUgcGFyZW50KSB7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gREVCVUcuIENoYW5nZSB0byBsb2cgd2FybmluZy4KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRG9jdW1lbnRzIGNhbid0IGhhdmUgVUkgcGFyZW50cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0VWlQYXJlbnQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhpcyBlbGVtZW50IG5vZGUgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhlIGdpdmVuIFhNTCBub2RlLgotICAgICAqIAotICAgICAqIFRoaXMgZmFpbHMgaWYgdGhlIGdpdmVuIFhNTCBub2RlIGhhcyBhIGRpZmZlcmVudCBlbGVtZW50IG5hbWUgLS0gaXQgd29uJ3QgY2hhbmdlIHRoZQotICAgICAqIHR5cGUgb2YgdGhpcyB1aSBub2RlLgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBib3RoIHVzZWQgZm9yIHBvcHVsYXRpbmcgdmFsdWVzIHRoZSBmaXJzdCB0aW1lIGFuZCB1cGRhdGluZyB2YWx1ZXMKLSAgICAgKiBhZnRlciB0aGUgWE1MIG1vZGVsIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9ub2RlIFRoZSBYTUwgbm9kZSB0byBtaXJyb3IKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgWE1MIHN0cnVjdHVyZSBoYXMgY2hhbmdlZCAobm9kZXMgYWRkZWQsIHJlbW92ZWQgb3IgcmVwbGFjZWQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbG9hZEZyb21YbWxOb2RlKE5vZGUgeG1sX25vZGUpIHsKLSAgICAgICAgYm9vbGVhbiBzdHJ1Y3R1cmVfY2hhbmdlZCA9IChnZXRYbWxEb2N1bWVudCgpICE9IHhtbF9ub2RlKTsKLSAgICAgICAgc2V0WG1sRG9jdW1lbnQoKERvY3VtZW50KSB4bWxfbm9kZSk7Ci0gICAgICAgIHN0cnVjdHVyZV9jaGFuZ2VkIHw9IHN1cGVyLmxvYWRGcm9tWG1sTm9kZSh4bWxfbm9kZSk7Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmVfY2hhbmdlZCkgewotICAgICAgICAgICAgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5DSElMRFJFTl9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RydWN0dXJlX2NoYW5nZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBYTUwgZG9jdW1lbnQuCi0gICAgICogPHAvPgotICAgICAqIFhNTCBkb2N1bWVudHMgY2Fubm90IGJlIGNyZWF0ZWQgcGVyIHNlIC0tIHRoZXkgYXJlIGEgYnktcHJvZHVjdCBvZiB0aGUgU3RydWN0dXJlZEVkaXRvcgotICAgICAqIFhNTCBwYXJzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiBnZXRYbWxEb2N1bWVudCgpLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGNyZWF0ZVhtbE5vZGUoKSB7Ci0gICAgICAgIGlmIChnZXRYbWxEb2N1bWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEJ5IGRlc2lnbiwgYSBkb2N1bWVudCBub2RlIGNhbm5vdCBiZSBjcmVhdGVkLCBpdCBpcyBvd25lZCBieSB0aGUgWE1MIHBhcnNlci4KLSAgICAgICAgICAgIC8vIEJ5ICJkZXNpZ24iIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSB0aGUgWE1MIHBhcnNlciBhbHdheXMgY3JlYXRlcyBhbiBYTUwKLSAgICAgICAgICAgIC8vIGRvY3VtZW50IGNvbnRhaW5lciwgZXZlbiBmb3IgYW4gZW1wdHkgZmlsZS4KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRG9jdW1lbnRzIGNhbm5vdCBiZSBjcmVhdGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0WG1sRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGFuZCBkb2VzIG5vdCBldmVuIHRyeSB0byBkZWxldGUgdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogWE1MIGRvY3VtZW50cyBjYW5ub3QgYmUgZGVsZXRlZCBwZXIgc2UgLS0gdGhleSBhcmUgYSBieS1wcm9kdWN0IG9mIHRoZSBTdHJ1Y3R1cmVkRWRpdG9yCi0gICAgICogWE1MIHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZW1vdmVkIG5vZGUgb3IgbnVsbCBpZiBpdCBkaWRuJ3QgZXhpc3QgaW4gdGhlIGZpcnRzdCBwbGFjZS4gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZGVsZXRlWG1sTm9kZSgpIHsKLSAgICAgICAgLy8gREVCVUcuIENoYW5nZSB0byBsb2cgd2FybmluZy4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJEb2N1bWVudHMgY2Fubm90IGJlIGRlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaUVsZW1lbnROb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpRWxlbWVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxOTE3ZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpRWxlbWVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5UZXh0QXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5YbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzLkN1c3RvbVZpZXdEZXNjcmlwdG9yU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQuZGVzY3JpcHRvcnMuTGF5b3V0RGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubWFuaWZlc3QuZGVzY3JpcHRvcnMuQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmRlc2NyaXB0b3JzLlJlc291cmNlc0Rlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpbW9kZWwuSVVpVXBkYXRlTGlzdGVuZXIuVWlVcGRhdGVTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy54bWwuZGVzY3JpcHRvcnMuWG1sRGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgbm9kZSB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSB0aGUgdXNlciBpbnRlcmZhY2UgaW4gdGhlIFhNTCBlZGl0b3IuCi0gKiA8cC8+Ci0gKiBFYWNoIHRyZWUgdmlld2VyIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHBhZ2UncyBwYXJ0cyBuZWVkcyB0byBrZWVwIGEgbW9kZWwgcmVwcmVzZW50aW5nCi0gKiBlYWNoIHVuZGVybHlpbmcgbm9kZSBpbiB0aGUgdHJlZS4gVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgYmFzZSB0eXBlIGZvciBzdWNoIGEgbm9kZS4KLSAqIDxwLz4KLSAqIEVhY2ggbm9kZSBhY3RzIGFzIGFuIGludGVybWVkaWFyeSBtb2RlbCBiZXR3ZWVuIHRoZSBhY3R1YWwgWE1MIG1vZGVsICh0aGUgcmVhbCBkYXRhIHN1cHBvcnQpCi0gKiBhbmQgdGhlIHRyZWUgdmlld2VycyBvciB0aGUgY29ycmVzcG9uZGluZyBwYWdlIHBhcnRzLgotICogPHAvPgotICogRWxlbWVudCBub2RlcyBkb24ndCBjb250YWluIGRhdGEgcGVyIHNlLiBUaGVpciBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGVpciBhdHRyaWJ1dGVzCi0gKiBhcyB3ZWxsIGFzIHRoZWlyIGNoaWxkcmVuJ3MgYXR0cmlidXRlcywgc2VlIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9LgotICogPHAvPgotICogVGhlIHN0cnVjdHVyZSBvZiBhIGdpdmVuIHtAbGluayBVaUVsZW1lbnROb2RlfSBpcyBkZWNsYXJlZCBieSBhIGNvcnJlc3BvbmRpbmcKLSAqIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0uCi0gKiA8cC8+Ci0gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyB7QGxpbmsgSVByb3BlcnR5U291cmNlfSwgaW4gb3JkZXIgdG8gZmlsbCB0aGUgRWNsaXBzZSBwcm9wZXJ0eSB0YWIgd2hlbgotICogYW4gZWxlbWVudCBpcyBzZWxlY3RlZC4gVGhlIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBhcmUgdXNlZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFVpRWxlbWVudE5vZGUgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UgewotCi0gICAgLyoqIExpc3Qgb2YgcHJlZml4ZXMgcmVtb3ZlZCBmcm9tIGFuZHJvaWQ6aWQgc3RyaW5ncyB3aGVuIGNyZWF0aW5nIHNob3J0IGRlc2NyaXB0aW9ucy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBJRF9QUkVGSVhFUyA9IHsKLSAgICAgICAgIkBhbmRyb2lkOmlkLyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIkAraWQvIiwgIkBpZC8iLCAiQCsiLCAiQCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCi0gICAgLyoqIFRoZSBlbGVtZW50IGRlc2NyaXB0b3IgZm9yIHRoZSBub2RlLiBBbHdheXMgcHJlc2VudCwgbmV2ZXIgbnVsbC4gKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIC8qKiBUaGUgcGFyZW50IGVsZW1lbnQgbm9kZSBpbiB0aGUgVUkgbW9kZWwuIEl0IGlzIG51bGwgZm9yIGEgcm9vdCBlbGVtZW50IG9yIHVudGlsCi0gICAgICogIHRoZSBub2RlIGlzIGF0dGFjaGVkIHRvIGl0cyBwYXJlbnQuICovCi0gICAgcHJpdmF0ZSBVaUVsZW1lbnROb2RlIG1VaVBhcmVudDsKLSAgICAvKiogVGhlIHtAbGluayBBbmRyb2lkRWRpdG9yfSBoYW5kbGluZyB0aGUgVUkgaGllcmFyY2h5LiBUaGlzIGlzIGRlZmluZWQgb25seSBmb3IgdGhlCi0gICAgICogIHJvb3Qgbm9kZS4gQWxsIGNoaWxkcmVuIGhhdmUgdGhlIHZhbHVlIHNldCB0byBudWxsIGFuZCBxdWVyeSB0aGVpciBwYXJlbnQuICovCi0gICAgcHJpdmF0ZSBBbmRyb2lkRWRpdG9yIG1FZGl0b3I7Ci0gICAgLyoqIFRoZSBYTUwge0BsaW5rIERvY3VtZW50fSBtb2RlbCB0aGF0IGlzIGJlaW5nIG1pcnJvciBieSB0aGUgVUkgbW9kZWwuIFRoaXMgaXMgZGVmaW5lZAotICAgICAqICBvbmx5IGZvciB0aGUgcm9vdCBub2RlLiBBbGwgY2hpbGRyZW4gaGF2ZSB0aGUgdmFsdWUgc2V0IHRvIG51bGwgYW5kIHF1ZXJ5IHRoZWlyIHBhcmVudC4gKi8KLSAgICBwcml2YXRlIERvY3VtZW50IG1YbWxEb2N1bWVudDsKLSAgICAvKiogVGhlIFhNTCB7QGxpbmsgTm9kZX0gbWlycm9yIGJ5IHRoaXMgVUkgbm9kZS4gVGhpcyBjYW4gYmUgbnVsbCBmb3IgbWFuZGF0b3J5IFVJIG5vZGUgd2hpY2gKLSAgICAgKiAgaGF2ZSBubyBjb3JyZXNwb25kaW5nIFhNTCBub2RlIG9yIGZvciBuZXcgVUkgbm9kZXMgYmVmb3JlIHRoZWlyIFhNTCBub2RlIGlzIHNldC4gKi8KLSAgICBwcml2YXRlIE5vZGUgbVhtbE5vZGU7Ci0gICAgLyoqIFRoZSBsaXN0IG9mIGFsbCBVSSBjaGlsZHJlbiBub2Rlcy4gQ2FuIGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsLiBUaGVyZSdzIG9uZSBVSSBjaGlsZHJlbgotICAgICAqICBub2RlIHBlciBleGlzdGluZyBYTUwgY2hpbGRyZW4gbm9kZS4gKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxVaUVsZW1lbnROb2RlPiBtVWlDaGlsZHJlbjsKLSAgICAvKiogVGhlIGxpc3Qgb2YgPGVtPmFsbDwvZW0+IFVJIGF0dHJpYnV0ZXMsIGFzIGRlY2xhcmVkIGluIHRoZSB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9LgotICAgICAqICBUaGUgbGlzdCBpcyBhbHdheXMgZGVmaW5lZCBhbmQgbmV2ZXIgbnVsbC4gVW5saWtlIHRoZSBVaUVsZW1lbnROb2RlIGNoaWxkcmVuIGxpc3QsIHRoaXMKLSAgICAgKiAgaXMgYWx3YXlzIGRlZmluZWQsIGV2ZW4gZm9yIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIFhNTCBtb2RlbCAtLSB0aGF0J3MgYmVjYXVzZQotICAgICAqICAibWlzc2luZyIgYXR0cmlidXRlcyBpbiB0aGUgWE1MIG1vZGVsIHNpbXBseSBtZWFuIGEgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLiBBbHNvIG5vdGUgdGhhdAotICAgICAqICB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGlzIGEgbWFwLCBzbyBvcmRlciBpcyBub3QgcmVzcGVjdGVkLiBUbyBnZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlCi0gICAgICogIG9yZGVyLCBpdGVyYXRlIHRocm91Z2ggdGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0ncyBhdHRyaWJ1dGUgbGlzdC4gKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBtVWlBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgSGFzaFNldDxVaUF0dHJpYnV0ZU5vZGU+IG1Vbmtub3duVWlBdHRyaWJ1dGVzOwotICAgIC8qKiBBIHJlYWQtb25seSB2aWV3IG9mIHRoZSBVSSBjaGlsZHJlbiBub2RlIGNvbGxlY3Rpb24uICovCi0gICAgcHJpdmF0ZSBMaXN0PFVpRWxlbWVudE5vZGU+IG1SZWFkT25seVVpQ2hpbGRyZW47Ci0gICAgLyoqIEEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIFVJIGF0dHJpYnV0ZXMgY29sbGVjdGlvbi4gKi8KLSAgICBwcml2YXRlIENvbGxlY3Rpb248VWlBdHRyaWJ1dGVOb2RlPiBtUmVhZE9ubHlVaUF0dHJpYnV0ZXM7Ci0gICAgLyoqIEEgbWFwIG9mIGhpZGRlbiBhdHRyaWJ1dGUgZGVzY3JpcHRvcnMuIEtleSBpcyB0aGUgWE1MIG5hbWUuICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZXNjcmlwdG9yPiBtQ2FjaGVkSGlkZGVuQXR0cmlidXRlczsKLSAgICAvKiogQW4gb3B0aW9uYWwgbGlzdCBvZiB7QGxpbmsgSVVpVXBkYXRlTGlzdGVuZXJ9LiBNb3N0IGVsZW1lbnQgbm9kZXMgd2lsbCBub3QgaGF2ZSBhbnkKLSAgICAgKiAgbGlzdGVuZXJzIGF0dGFjaGVkLCBzbyB0aGUgbGlzdCBpcyBvbmx5IGNyZWF0ZWQgb24gZGVtYW5kIGFuZCBjYW4gYmUgbnVsbC4gKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxJVWlVcGRhdGVMaXN0ZW5lcj4gbVVpVXBkYXRlTGlzdGVuZXJzOwotICAgIC8qKiBFcnJvciBGbGFnICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXNFcnJvcjsKLSAgICAvKiogVGVtcG9yYXJ5IGRhdGEgdXNlZCBieSB0aGUgZWRpdG9ycy4gVGhpcyBkYXRhIGlzIG5vdCBzeW5jJ2VkIHdpdGggdGhlIFhNTCAqLwotICAgIHByaXZhdGUgT2JqZWN0IG1FZGl0RGF0YTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFVpRWxlbWVudE5vZGV9IGRlc2NyaWJlZCBieSBhIGdpdmVuIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudERlc2NyaXB0b3IgVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gZm9yIHRoZSBYTUwgbm9kZS4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUoRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IpIHsKLSAgICAgICAgbURlc2NyaXB0b3IgPSBlbGVtZW50RGVzY3JpcHRvcjsKLSAgICAgICAgY2xlYXJDb250ZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gYnkgcmVzZXR0aW5nIHRoZSBjaGlsZHJlbiBsaXN0IGFuZAotICAgICAqIHRoZSB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfXMgbGlzdC4KLSAgICAgKiBBbHNvIHJlc2V0cyB0aGUgYXR0YWNoZWQgWE1MIG5vZGUsIGRvY3VtZW50LCBlZGl0b3IgaWYgYW55LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgcGFyZW50IHtAbGluayBVaUVsZW1lbnROb2RlfSBub2RlIGlzIG5vdCByZXNldCBzbyB0aGF0IGl0J3MgcG9zaXRpb24KLSAgICAgKiBpbiB0aGUgaGllcmFyY2h5IGJlIGxlZnQgaW50YWN0LCBpZiBhbnkuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGNsZWFyQ29udGVudCgpIHsKLSAgICAgICAgbVhtbE5vZGUgPSBudWxsOwotICAgICAgICBtWG1sRG9jdW1lbnQgPSBudWxsOwotICAgICAgICBtRWRpdG9yID0gbnVsbDsKLSAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIG1SZWFkT25seVVpQ2hpbGRyZW4gPSBudWxsOwotICAgICAgICBpZiAobVVpQ2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgbVVpQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFVpRWxlbWVudE5vZGU+KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSBjYW4ndCByZW1vdmUgbWFuZGF0b3J5IG5vZGVzLCB3ZSBqdXN0IGNsZWFyIHRoZW0uCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbVVpQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVVaUNoaWxkQXRJbmRleChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgaW50ZXJuYWwgbGlzdCBvZiBhdHRyaWJ1dGVzLCB0aGUgcmVhZC1vbmx5IGNhY2hlZCB2ZXJzaW9uIG9mIGl0Ci0gICAgICogYW5kIHRoZSByZWFkLW9ubHkgY2FjaGVkIGhpZGRlbiBhdHRyaWJ1dGUgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYXJBdHRyaWJ1dGVzKCkgewotICAgICAgICBtVWlBdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgbVJlYWRPbmx5VWlBdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgbUNhY2hlZEhpZGRlbkF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBtVW5rbm93blVpQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PFVpQXR0cmlidXRlTm9kZT4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIGludGVybmFsIFVpQXR0cmlidXRlcyBsaXN0LgotICAgICAqIDxwLz4KLSAgICAgKiBXaGVuIHRoZSBkZXNjcmlwdG9yIGRlcml2ZXMgZnJvbSBWaWV3RWxlbWVudERlc2NyaXB0b3IsIHRoaXMgbGlzdCBkZXBlbmRzIG9uIHRoZQotICAgICAqIGN1cnJlbnQgVWlQYXJlbnQgbm9kZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBuZXcgc2V0IG9mIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9IHRoYXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQKLSAgICAgKiAgICAgICAgIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpIHsKLSAgICAgICAgaWYgKG1VaUF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJfbGlzdCA9IGdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBtVWlBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPihhdHRyX2xpc3QubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoQXR0cmlidXRlRGVzY3JpcHRvciBkZXNjIDogYXR0cl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIHVpX25vZGUgPSBkZXNjLmNyZWF0ZVVpTm9kZSh0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAodWlfbm9kZSAhPSBudWxsKSB7ICAvLyBTb21lIEF0dHJpYnV0ZURlc2NyaXB0b3JzIGRvIG5vdCBoYXZlIFVJIGFzc29jaWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgbVVpQXR0cmlidXRlcy5wdXQoZGVzYywgdWlfbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtVWlBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIGEgc2hvcnQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIFVJIG5vZGUgc3VpdGFibGUgZm9yIHRyZWUgdmlld3MuCi0gICAgICogVXNlcyB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZSAiYW5kcm9pZDpuYW1lIiBpZiBwcmVzZW50LCBvciB0aGUgImFuZHJvaWQ6bGFiZWwiIG9uZQotICAgICAqIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50J3MgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzaG9ydCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVUkgbm9kZSBzdWl0YWJsZSBmb3IgdHJlZSB2aWV3cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChtWG1sTm9kZSAhPSBudWxsICYmIG1YbWxOb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBtWG1sTm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQotICAgICAgICAgICAgLy8gQXBwbGljYXRpb24gYW5kIE1hbmlmZXN0IG5vZGVzIGhhdmUgYSBzcGVjaWFsIHRyZWF0bWVudDogdGhleSBhcmUgdW5pcXVlIG5vZGVzCi0gICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGRpZmZlcmVudGlhdGUgdGhlaXIgc3RyaW5ncyBhbmQgd2UgZmFsbCBiYWNrIHRvCi0gICAgICAgICAgICAvLyBqdXN0IHVzaW5nIHRoZSBVSSBuYW1lIGJlbG93LgotICAgICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIG1YbWxOb2RlOwotCi0gICAgICAgICAgICBTdHJpbmcgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlTlMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycy5BTkRST0lEX05BTUVfQVRUUik7Ci0gICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsIHx8IGF0dHIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZU5TKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0RGVzY3JpcHRvcnMuQU5EUk9JRF9MQUJFTF9BVFRSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwgfHwgYXR0ci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlTlMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxEZXNjcmlwdG9ycy5QUkVGX0tFWV9BVFRSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwgfHwgYXR0ci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFJlc291cmNlc0Rlc2NyaXB0b3JzLk5BTUVfQVRUUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsIHx8IGF0dHIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZU5TKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0RGVzY3JpcHRvcnMuSURfQVRUUik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IElEX1BSRUZJWEVTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5zdGFydHNXaXRoKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gYXR0ci5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyAoJTIkcykiLCBhdHRyLCBtRGVzY3JpcHRvci5nZXRVaU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyIsIG1EZXNjcmlwdG9yLmdldFVpTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyBhICJicmVhZGNydW1iIHRyYWlsIiBkZXNjcmlwdGlvbiBmb3IgdGhpcyBub2RlLgotICAgICAqIEl0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSAiTWFuaWZlc3QgPiBBcHBsaWNhdGlvbiA+IC5teWFjdGl2aXR5IChBY3Rpdml0eSkgPiBJbnRlbnQtRmlsdGVyIgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2x1ZGVfcm9vdCBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHJvb3QgKGUuZy4gIk1hbmlmZXN0Iikgb3Igbm90LiBIYXMgbm8gZWZmZWN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB3aGVuIGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlIGl0c2VsZi4KLSAgICAgKiBAcmV0dXJuIFRoZSAiYnJlYWRjcnVtYiB0cmFpbCIgZGVzY3JpcHRpb24gZm9yIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJyZWFkY3J1bWJUcmFpbERlc2NyaXB0aW9uKGJvb2xlYW4gaW5jbHVkZV9yb290KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRTaG9ydERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSB1aV9ub2RlID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB1aV9ub2RlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgdWlfbm9kZSA9IHVpX25vZGUuZ2V0VWlQYXJlbnQoKSkgewotICAgICAgICAgICAgaWYgKCFpbmNsdWRlX3Jvb3QgJiYgdWlfbm9kZS5nZXRVaVBhcmVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmluc2VydCgwLCBTdHJpbmcuZm9ybWF0KCIlMSRzID4gIiwgdWlfbm9kZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgWE1MIHtAbGluayBEb2N1bWVudH0uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBYTUwge0BsaW5rIERvY3VtZW50fSBpcyBpbml0aWFsbHkgbnVsbC4gVGhlIFhNTCB7QGxpbmsgRG9jdW1lbnR9IG11c3QgYmUgc2V0IG9ubHkgb24gdGhlCi0gICAgICogVUkgcm9vdCBlbGVtZW50IG5vZGUgKHRoaXMgbWV0aG9kIHRha2VzIGNhcmUgb2YgdGhhdC4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WG1sRG9jdW1lbnQoRG9jdW1lbnQgeG1sX2RvYykgewotICAgICAgICBpZiAobVVpUGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1YbWxEb2N1bWVudCA9IHhtbF9kb2M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVWlQYXJlbnQuc2V0WG1sRG9jdW1lbnQoeG1sX2RvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYTUwge0BsaW5rIERvY3VtZW50fS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHZhbHVlIGlzIGluaXRpYWxseSBudWxsIHVudGlsIHRoZSBVSSBub2RlIGlzIGF0dGFjaGVkIHRvIGl0cyBVSSBwYXJlbnQgLS0gdGhlIHZhbHVlCi0gICAgICogb2YgdGhlIGRvY3VtZW50IGlzIHRoZW4gcHJvcGFnYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFhNTCB7QGxpbmsgRG9jdW1lbnR9IG9yIHRoZSBwYXJlbnQncyBYTUwge0BsaW5rIERvY3VtZW50fSBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRYbWxEb2N1bWVudCgpIHsKLSAgICAgICAgaWYgKG1YbWxEb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVhtbERvY3VtZW50OwotICAgICAgICB9IGVsc2UgaWYgKG1VaVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpUGFyZW50LmdldFhtbERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgWE1MIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVUkgbm9kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogU29tZSB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGFyZSBkZWNsYXJlZCBhcyBiZWluZyAibWFuZGF0b3J5Ii4gVGhpcyBtZWFucyB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIFVJIG5vZGUgd2lsbCBleGlzdCBldmVuIGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgWE1MIG5vZGUuIFN1Y2ggc3RydWN0dXJlCi0gICAgICogaXMgY3JlYXRlZCBhbmQgZW5mb3JjZWQgYnkgdGhlIHBhcmVudCBvZiB0aGUgdHJlZSwgbm90IHRoZSBlbGVtZW50IHRoZW1zZWx2ZXMuIEhvd2V2ZXIKLSAgICAgKiBzdWNoIG5vZGVzIHdpbGwgbGlrZWx5IG5vdCBoYXZlIGFuIFhNTCBub2RlIGFzc29jaWF0ZWQsIHNvIGdldFhtbE5vZGUoKSBjYW4gcmV0dXJuIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIFhNTCBub2RlLiBDYW4gYmUgbnVsbCBmb3IgbWFuZGF0b3J5IG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldFhtbE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtWG1sTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3J9IGZvciB0aGlzIG5vZGUuIFRoaXMgaXMgbmV2ZXIgbnVsbC4KLSAgICAgKiA8cC8+Ci0gICAgICogRG8gbm90IHVzZSB0aGlzIHRvIGNhbGwgZ2V0RGVzY3JpcHRvcigpLmdldEF0dHJpYnV0ZXMoKSwgaW5zdGVhZCBjYWxsCi0gICAgICogZ2V0QXR0cmlidXRlRGVzY3JpcHRvcnMoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSBhcnJheSBmb3IgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBub2RlLgotICAgICAqIDxwLz4KLSAgICAgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGdldERlc2NyaXB0b3IoKS5nZXRBdHRyaWJ1dGVzKCkgLS0gZGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZQotICAgICAqIHRoaXMgdG8gbWFuaXB1bGF0ZSB0aGUgYXR0cmlidXRlIGRlc2NyaXB0b3IgbGlzdCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgVUkgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlRGVzY3JpcHRvcltdIGdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3IuZ2V0QXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhpZGRlbiB7QGxpbmsgQXR0cmlidXRlRGVzY3JpcHRvcn0gYXJyYXkgZm9yIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgbm9kZS4KLSAgICAgKiBUaGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBnZXRBdHRyaWJ1dGVEZXNjcmlwdG9ycygpIGxpc3QuCi0gICAgICogPHAvPgotICAgICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZ2V0RGVzY3JpcHRvcigpLmdldEhpZGRlbkF0dHJpYnV0ZXMoKSAtLSBwb3RlbnRpYWxseSBkZXJpdmVkIGNsYXNzZXMKLSAgICAgKiBjb3VsZCBvdmVycmlkZSB0aGlzIHRvIG1hbmlwdWxhdGUgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIGxpc3QgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50Ci0gICAgICogVUkgbm9kZS4gVGhlcmUncyBubyBuZWVkIGZvciBpdCByaWdodCBub3cgc28ga2VlcCBpdCBwcml2YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQXR0cmlidXRlRGVzY3JpcHRvcj4gZ2V0SGlkZGVuQXR0cmlidXRlRGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVkSGlkZGVuQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FjaGVkSGlkZGVuQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0cmlidXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIGZvciAoQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyX2Rlc2MgOiBnZXRBdHRyaWJ1dGVEZXNjcmlwdG9ycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJfZGVzYyBpbnN0YW5jZW9mIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkSGlkZGVuQXR0cmlidXRlcy5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IpIGF0dHJfZGVzYykuZ2V0WG1sTnNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9kZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DYWNoZWRIaWRkZW5BdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIFVpRWxlbWVudE5vZGUuCi0gICAgICogPHAvPgotICAgICAqIFRoZSByb290IG5vZGUgaGFzIG5vIHBhcmVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVaVBhcmVudChVaUVsZW1lbnROb2RlIHBhcmVudCkgewotICAgICAgICBtVWlQYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGludGVybmFsIFVpQXR0cmlidXRlcyBsaXN0LCBhcyBpdCBtYXkgZGVwZW5kIG9uIHRoZSBhY3R1YWwgVWlQYXJlbnQuCi0gICAgICAgIGNsZWFyQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHBhcmVudCB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gb3IgbnVsbCBpZiB0aGlzIGlzIHRoZSByb290IG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgZ2V0VWlQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtVWlQYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBUaGUgcm9vdCB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgZ2V0VWlSb290KCkgewotICAgICAgICBVaUVsZW1lbnROb2RlIHJvb3QgPSB0aGlzOwotICAgICAgICB3aGlsZSAocm9vdC5tVWlQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdCA9IHJvb3QubVVpUGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgVUkgc2libGluZyBvZiB0aGlzIFVJIG5vZGUuCi0gICAgICogSWYgdGhlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHByZXZpb3VzIHNpYmxpbmcsIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBnZXRVaVByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgaWYgKG1VaVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFVpRWxlbWVudE5vZGU+IGNoaWxkbGlzdCA9IG1VaVBhcmVudC5nZXRVaUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRsaXN0ICE9IG51bGwgJiYgY2hpbGRsaXN0LnNpemUoKSA+IDEgJiYgY2hpbGRsaXN0LmdldCgwKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY2hpbGRsaXN0LmluZGV4T2YodGhpcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID4gMCA/IGNoaWxkbGlzdC5nZXQoaW5kZXggLSAxKSA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBVSSBzaWJsaW5nIG9mIHRoaXMgVUkgbm9kZS4KLSAgICAgKiBJZiB0aGUgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmV4dCBzaWJsaW5nLCByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFVpRWxlbWVudE5vZGUgZ2V0VWlOZXh0U2libGluZygpIHsKLSAgICAgICAgaWYgKG1VaVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFVpRWxlbWVudE5vZGU+IGNoaWxkbGlzdCA9IG1VaVBhcmVudC5nZXRVaUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGNoaWxkbGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAxICYmIGNoaWxkbGlzdC5nZXQoc2l6ZSAtIDEpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY2hpbGRsaXN0LmluZGV4T2YodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSAtIDEgPyBjaGlsZGxpc3QuZ2V0KGluZGV4ICsgMSkgOiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgQW5kcm9pZEVkaXRvcn0gaGFuZGxpbmcgdGhpcyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gaGllcmFyY2h5LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgZWRpdG9yIG11c3QgYWx3YXlzIGJlIHNldCBvbiB0aGUgcm9vdCBub2RlLiBUaGlzIG1ldGhvZCB0YWtlcyBjYXJlIG9mIHRoYXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWRpdG9yKEFuZHJvaWRFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIGlmIChtVWlQYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VaVBhcmVudC5zZXRFZGl0b3IoZWRpdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbmRyb2lkRWRpdG9yfSB0aGF0IGVtYmVkcyB0aGlzIHtAbGluayBVaUVsZW1lbnROb2RlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHZhbHVlIGlzIGluaXRpYWxseSBudWxsIHVudGlsIHRoZSBub2RlIGlzIGF0dGFjaGVkIHRvIGl0cyBwYXJlbnQgLS0gdGhlIHZhbHVlCi0gICAgICogb2YgdGhlIHJvb3Qgbm9kZSBpcyB0aGVuIHByb3BhZ2F0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBlbWJlZGRpbmcge0BsaW5rIEFuZHJvaWRFZGl0b3J9IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEFuZHJvaWRFZGl0b3IgZ2V0RWRpdG9yKCkgewotICAgICAgICByZXR1cm4gbVVpUGFyZW50ID09IG51bGwgPyBtRWRpdG9yIDogbVVpUGFyZW50LmdldEVkaXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFuZHJvaWQgdGFyZ2V0IGRhdGEgZm9yIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZFRhcmdldERhdGEgZ2V0QW5kcm9pZFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEVkaXRvcigpLmdldFRhcmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IHZlcnNpb24gb2YgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8VWlFbGVtZW50Tm9kZT4gZ2V0VWlDaGlsZHJlbigpIHsKLSAgICAgICAgaWYgKG1SZWFkT25seVVpQ2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgbVJlYWRPbmx5VWlDaGlsZHJlbiA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobVVpQ2hpbGRyZW4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUmVhZE9ubHlVaUNoaWxkcmVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSByZWFkLW9ubHkgdmVyc2lvbiBvZiB0aGUgYXR0cmlidXRlcyBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFVpQXR0cmlidXRlTm9kZT4gZ2V0VWlBdHRyaWJ1dGVzKCkgewotICAgICAgICBpZiAobVJlYWRPbmx5VWlBdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1SZWFkT25seVVpQXR0cmlidXRlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCkudmFsdWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUmVhZE9ubHlVaUF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIHJlYWQtb25seSB2ZXJzaW9uIG9mIHRoZSB1bmtub3duIGF0dHJpYnV0ZXMgY29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxVaUF0dHJpYnV0ZU5vZGU+IGdldFVua25vd25VaUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1Vbmtub3duVWlBdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlcnJvciBmbGFnIHZhbHVlLgotICAgICAqIEBwYXJhbSBlcnJvckZsYWcgdGhlIGVycm9yIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRIYXNFcnJvcihib29sZWFuIGVycm9yRmxhZykgewotICAgICAgICBtSGFzRXJyb3IgPSBlcnJvckZsYWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSwgaXRzIGF0dHJpYnV0ZXMsIG9yIG9uZSBvZiB0aGUgY2hpbGRyZW4gbm9kZXMgKGFuZCBhdHRyaWJ1dGVzKQotICAgICAqIGhhcyBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0gICAgICAgIGlmIChtSGFzRXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBlcnJvciB2YWx1ZSBmcm9tIHRoZSBhdHRyaWJ1dGVzLgotICAgICAgICBDb2xsZWN0aW9uPFVpQXR0cmlidXRlTm9kZT4gYXR0cmlidXRlcyA9IGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCkudmFsdWVzKCk7Ci0gICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIGF0dHJpYnV0ZSA6IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuaGFzRXJyb3IoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYW5kIG5vdyBmcm9tIHRoZSBjaGlsZHJlbi4KLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIGNoaWxkIDogbVVpQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5oYXNFcnJvcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgSVVpVXBkYXRlTGlzdGVuZXJ9IHRvIHRoZSBpbnRlcm5hbCB1cGRhdGUgbGlzdGVuZXIgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRVcGRhdGVMaXN0ZW5lcihJVWlVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgIGlmIChtVWlVcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICBtVWlVcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElVaVVwZGF0ZUxpc3RlbmVyPigpOwotICAgICAgIH0KLSAgICAgICBpZiAoIW1VaVVwZGF0ZUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgbVVpVXBkYXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gZXhpc3Rpbmcge0BsaW5rIElVaVVwZGF0ZUxpc3RlbmVyfSBmcm9tIHRoZSBpbnRlcm5hbCB1cGRhdGUgbGlzdGVuZXIgbGlzdC4KLSAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGxpc3QgaXMgZW1wdHkgb3IgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZUxpc3RlbmVyKElVaVVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgaWYgKG1VaVVwZGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1VaVVwZGF0ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhIGNoaWxkIG5vZGUgcmVsYXRpdmUgdG8gdGhpcyBub2RlIHVzaW5nIGEgcGF0aC1saWtlIGV4cHJlc3Npb24uCi0gICAgICogRi5leC4gIm5vZGUxL25vZGUyIiB3b3VsZCBmaW5kIGEgY2hpbGQgIm5vZGUxIiB0aGF0IGNvbnRhaW5zIGEgY2hpbGQgIm5vZGUyIiBhbmQKLSAgICAgKiByZXR1cm5zIHRoZSBsYXR0ZXIuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXQgdGhlIHNhbWUKLSAgICAgKiBsZXZlbCwgYWx3YXlzIHVzZXMgdGhlIGZpcnN0IG9uZSBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGxpa2UgZXhwcmVzc2lvbiB0byBzZWxlY3QgYSBjaGlsZCBub2RlLgotICAgICAqIEByZXR1cm4gVGhlIHVpIG5vZGUgZm91bmQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlFbGVtZW50Tm9kZSBmaW5kVWlDaGlsZE5vZGUoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBwYXRoLnNwbGl0KCIvIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlfbm9kZSA9IHRoaXM7Ci0gICAgICAgIGZvciAoU3RyaW5nIGl0ZW0gOiBpdGVtcykgewotICAgICAgICAgICAgYm9vbGVhbiBuZXh0X3NlZ21lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSBjIDogdWlfbm9kZS5tVWlDaGlsZHJlbikgewotICAgICAgICAgICAgICAgIGlmIChjLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCkuZXF1YWxzKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpX25vZGUgPSBjOwotICAgICAgICAgICAgICAgICAgICBuZXh0X3NlZ21lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW5leHRfc2VnbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1aV9ub2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGFuIHtAbGluayBVaUVsZW1lbnROb2RlfSB3aGljaCBjb250YWlucyB0aGUgZ2l2ZSBYTUwge0BsaW5rIE5vZGV9LgotICAgICAqIExvb2tzIHJlY3Vyc2l2ZWx5IGluIGFsbCBjaGlsZHJlbiBVSSBub2Rlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxOb2RlIFRoZSBYTUwgbm9kZSB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gdGhhdCBjb250YWlucyB4bWxOb2RlIG9yIG51bGwgaWYgbm90IGZvdW5kLAotICAgICAqLwotICAgIHB1YmxpYyBVaUVsZW1lbnROb2RlIGZpbmRYbWxOb2RlKE5vZGUgeG1sTm9kZSkgewotICAgICAgICBpZiAoeG1sTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0WG1sTm9kZSgpID09IHhtbE5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChVaUVsZW1lbnROb2RlIHVpQ2hpbGQgOiBtVWlDaGlsZHJlbikgewotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBmb3VuZCA9IHVpQ2hpbGQuZmluZFhtbE5vZGUoeG1sTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBVaUF0dHJpYnV0ZU5vZGV9IG1hdGNoaW5nIHRoaXMgYXR0cmlidXRlIGRlc2NyaXB0b3Igb3IKLSAgICAgKiBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyX2Rlc2MgVGhlIHtAbGluayBBdHRyaWJ1dGVEZXNjcmlwdG9yfSB0byBtYXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVWlBdHRyaWJ1dGVOb2RlfSBtYXRjaGluZyB0aGlzIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVWlBdHRyaWJ1dGVOb2RlIGZpbmRVaUF0dHJpYnV0ZShBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJfZGVzYykgewotICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxVaUF0dHJpYnV0ZXMoKS5nZXQoYXR0cl9kZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGlzIGVsZW1lbnQgbm9kZSB3aXRoIGFsbCB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gWE1MIG5vZGUuCi0gICAgICoKLSAgICAgKiBUaGlzIGZhaWxzIGlmIHRoZSBnaXZlbiBYTUwgbm9kZSBoYXMgYSBkaWZmZXJlbnQgZWxlbWVudCBuYW1lIC0tIGl0IHdvbid0IGNoYW5nZSB0aGUKLSAgICAgKiB0eXBlIG9mIHRoaXMgdWkgbm9kZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBib3RoIHVzZWQgZm9yIHBvcHVsYXRpbmcgdmFsdWVzIHRoZSBmaXJzdCB0aW1lIGFuZCB1cGRhdGluZyB2YWx1ZXMKLSAgICAgKiBhZnRlciB0aGUgWE1MIG1vZGVsIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sX25vZGUgVGhlIFhNTCBub2RlIHRvIG1pcnJvcgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBYTUwgc3RydWN0dXJlIGhhcyBjaGFuZ2VkIChub2RlcyBhZGRlZCwgcmVtb3ZlZCBvciByZXBsYWNlZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2FkRnJvbVhtbE5vZGUoTm9kZSB4bWxfbm9kZSkgewotICAgICAgICBib29sZWFuIHN0cnVjdHVyZV9jaGFuZ2VkID0gKG1YbWxOb2RlICE9IHhtbF9ub2RlKTsKLSAgICAgICAgbVhtbE5vZGUgPSB4bWxfbm9kZTsKLSAgICAgICAgaWYgKHhtbF9ub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZUxpc3QoeG1sX25vZGUpOwotICAgICAgICAgICAgc3RydWN0dXJlX2NoYW5nZWQgfD0gdXBkYXRlRWxlbWVudExpc3QoeG1sX25vZGUpOwotICAgICAgICAgICAgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoc3RydWN0dXJlX2NoYW5nZWQgPyBVaVVwZGF0ZVN0YXRlLkNISUxEUkVOX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVWlVcGRhdGVTdGF0ZS5BVFRSX1VQREFURUQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVfY2hhbmdlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIFVJIG5vZGUgYW5kIHJlbG9hZCBpdCBmcm9tIHRoZSBnaXZlbiBYTUwgbm9kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyB3b3JrcyBieSBjbGVhcmluZyBhbGwgcmVmZXJlbmNlcyB0byBhbnkgcHJldmlvdXMgWE1MIG9yIFVJIG5vZGVzIGFuZAotICAgICAqIHRoZW4gcmVsb2FkcyB0aGUgWE1MIGRvY3VtZW50IGZyb20gc2NyYXRjaC4gVGhlIGVkaXRvciByZWZlcmVuY2UgaXMga2VwdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyB1c2VkIGluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIEVsZW1lbnREZXNjcmlwdG9yIHN0cnVjdHVyZSBoYXMgY2hhbmdlZC4KLSAgICAgKiBSYXRoZXIgdGhhbiB0cnkgdG8gZGlmZiBpbmZsYXRlZCBVSSBub2RlcyAoYXMgbG9hZEZyb21YbWxOb2RlIGRvZXMpLCB3ZSBkb24ndCBib3RoZXIKLSAgICAgKiBhbmQgcmVsb2FkIGV2ZXJ5dGhpbmcuIFRoaXMgaXMgbm90IHN1YnRsZSBhbmQgc2hvdWxkIGJlIHVzZWQgdmVyeSByYXJlbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sX25vZGUgVGhlIFhNTCBub2RlIG9yIGRvY3VtZW50IHRvIHJlbG9hZC4gQ2FuIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsb2FkRnJvbVhtbE5vZGUoTm9kZSB4bWxfbm9kZSkgewotICAgICAgICAvLyBUaGUgZWRpdG9yIG5lZWRzIHRvIGJlIHByZXNlcnZlZCwgaXQgaXMgbm90IGFmZmVjdGVkIGJ5IGFuIFhNTCBjaGFuZ2UuCi0gICAgICAgIEFuZHJvaWRFZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0gICAgICAgIGNsZWFyQ29udGVudCgpOwotICAgICAgICBzZXRFZGl0b3IoZWRpdG9yKTsKLSAgICAgICAgaWYgKHhtbF9ub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFhtbERvY3VtZW50KHhtbF9ub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyB3aWxsIHJlbG9hZCBhbGwgdGhlIFhNTCBhbmQgcmVjcmVhdGUgdGhlIFVJIHN0cnVjdHVyZSBmcm9tIHNjcmF0Y2guCi0gICAgICAgIGxvYWRGcm9tWG1sTm9kZSh4bWxfbm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGF0dHJpYnV0ZXMgd2hlbiB0aGV5IHdhbnQgdG8gY29tbWl0IHRoZWlyIHZhbHVlCi0gICAgICogdG8gYW4gWE1MIG5vZGUuCi0gICAgICogPHAvPgotICAgICAqIEZvciBtYW5kYXRvcnkgbm9kZXMsIHRoaXMgbWFrZXMgc3VyZSB0aGUgdW5kZXJseWluZyBYTUwgZWxlbWVudCBub2RlCi0gICAgICogZXhpc3RzIGluIHRoZSBtb2RlbC4gSWYgbm90LCBpdCBpcyBjcmVhdGVkIGFuZCBhc3NpZ25lZCBhcyB0aGUgdW5kZXJseWluZwotICAgICAqIFhNTCBub2RlLgotICAgICAqIDwvYnI+Ci0gICAgICogRm9yIG5vbi1tYW5kYXRvcnkgbm9kZXMsIHNpbXBseSByZXR1cm4gdGhlIHVuZGVybHlpbmcgWE1MIG5vZGUsIHdoaWNoCi0gICAgICogbXVzdCBhbHdheXMgZXhpc3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgWE1MIG5vZGUgbWF0Y2hpbmcgdGhpcyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBwcmVwYXJlQ29tbWl0KCkgewotICAgICAgICBpZiAoZ2V0RGVzY3JpcHRvcigpLmlzTWFuZGF0b3J5KCkpIHsKLSAgICAgICAgICAgIGNyZWF0ZVhtbE5vZGUoKTsKLSAgICAgICAgICAgIC8vIFRoZSBuZXcgWE1MIG5vZGUgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVmcmVzaCB1c2luZyBsb2FkRnJvbVhtbE5vZGUoKSBzaW5jZSB0aGVyZSBhcmUKLSAgICAgICAgICAgIC8vIG5vIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIGxvYWRpbmcgaW50byB0aGlzIG5vZGUuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFhtbE5vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXRzIHRoZSBhdHRyaWJ1dGVzIChhbGwgaW50ZXJuYWwsIGluaGVyaXRlZCBmcm9tIFVJIHBhcmVudCAmIHVua25vd24gYXR0cmlidXRlcykuCi0gICAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFVJIHdoZW4gdGhlIGVtYmVkZGluZyBwYXJ0IG5lZWRzIHRvIGJlIGNvbW1pdHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0gICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgOiBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICB1aV9hdHRyLmNvbW1pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChVaUF0dHJpYnV0ZU5vZGUgdWlfYXR0ciA6IG1Vbmtub3duVWlBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB1aV9hdHRyLmNvbW1pdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJ0IGhhcyBiZWVuIG1vZGlmaWVkIHdpdGggcmVzcGVjdCB0byB0aGUgZGF0YQotICAgICAqIGxvYWRlZCBmcm9tIHRoZSBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyIDogZ2V0SW50ZXJuYWxVaUF0dHJpYnV0ZXMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKHVpX2F0dHIuaXNEaXJ0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyIDogbVVua25vd25VaUF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgIGlmICh1aV9hdHRyLmlzRGlydHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgWE1MIGVsZW1lbnQgbm9kZSBmb3IgdGhpcyBVSSBub2RlIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQotICAgICAqIGV4aXN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyB2YWx1ZSBvZiBnZXRYbWxOb2RlKCkgKGNhbiBiZSBudWxsIGlmIGNyZWF0aW9uIGZhaWxlZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBjcmVhdGVYbWxOb2RlKCkgewotICAgICAgICBpZiAobVhtbE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSBwYXJlbnRYbWxOb2RlID0gbnVsbDsKLSAgICAgICAgaWYgKG1VaVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnRYbWxOb2RlID0gbVVpUGFyZW50LnByZXBhcmVDb21taXQoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRYbWxOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IGZhaWxlZCB0byBjcmVhdGUgaXRzIG93biBiYWNraW5nIFhNTCBub2RlLiBBYm9ydC4KLSAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgdGhlIHBhcmVudCB3aWxsIG1vc3QgbGlrZWx5Ci0gICAgICAgICAgICAgICAgLy8gaGF2ZSBkb25lIHNvIGl0c2VsZi4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBlbGVtZW50X25hbWUgPSBnZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRYbWxEb2N1bWVudCgpOwotCi0gICAgICAgIC8vIFdlICptdXN0KiBoYXZlIGEgcm9vdCBub2RlLiBJZiBub3QsIHdlIG5lZWQgdG8gYWJvcnQuCi0gICAgICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk1pc3NpbmcgWE1MIGRvY3VtZW50IGZvciAlMSRzIFhNTCBub2RlLiIsIGVsZW1lbnRfbmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgYW5kIHBhcmVudF94bWxfbm9kZSBpcyBudWxsLCB0aGUgbm9kZSBpcyB0byBiZSBjcmVhdGVkCi0gICAgICAgIC8vIGFzIHRoZSByb290IG5vZGUgb2YgdGhlIGRvY3VtZW50ICh3aGljaCBjYW4ndCBiZSBudWxsLCBjZiBjaGVjayBhYm92ZSkuCi0gICAgICAgIGlmIChwYXJlbnRYbWxOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudFhtbE5vZGUgPSBkb2M7Ci0gICAgICAgIH0KLQotICAgICAgICBtWG1sTm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50KGVsZW1lbnRfbmFtZSk7Ci0KLSAgICAgICAgTm9kZSB4bWxOZXh0U2libGluZyA9IG51bGw7Ci0KLSAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5leHRTaWJsaW5nID0gZ2V0VWlOZXh0U2libGluZygpOwotICAgICAgICBpZiAodWlOZXh0U2libGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxOZXh0U2libGluZyA9IHVpTmV4dFNpYmxpbmcuZ2V0WG1sTm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50WG1sTm9kZS5pbnNlcnRCZWZvcmUobVhtbE5vZGUsIHhtbE5leHRTaWJsaW5nKTsKLQotICAgICAgICAvLyBJbnNlcnQgYSBzZXBhcmF0b3IgYWZ0ZXIgdGhlIHRhZywgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZAotICAgICAgICBUZXh0IHNlcCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsKLSAgICAgICAgcGFyZW50WG1sTm9kZS5hcHBlbmRDaGlsZChzZXApOwotCi0gICAgICAgIC8vIFNldCBhbGwgaW5pdGlhbCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgbm9kZSBpZiB0aGV5IGFyZSBub3QgZW1wdHkuCi0gICAgICAgIC8vIEl0ZXJhdGUgb24gdGhlIGRlc2NyaXB0b3IgbGlzdCB0byBnZXQgdGhlIGRlc2lyZWQgb3JkZXIgYW5kIHRoZW4gdXNlIHRoZQotICAgICAgICAvLyBpbnRlcm5hbCB2YWx1ZXMsIGlmIGFueS4KLSAgICAgICAgZm9yIChBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJfZGVzYyA6IGdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCkpIHsKLSAgICAgICAgICAgIGlmIChhdHRyX2Rlc2MgaW5zdGFuY2VvZiBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IChYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IpIGF0dHJfZGVzYzsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlTlMoWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yLlhNTE5TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZ2V0WG1sTnNOYW1lKCkpOwotICAgICAgICAgICAgICAgIGF0dHIuc2V0VmFsdWUoZGVzYy5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBhdHRyLnNldFByZWZpeChkZXNjLmdldFhtbE5zUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIG1YbWxOb2RlLmdldEF0dHJpYnV0ZXMoKS5zZXROYW1lZEl0ZW1OUyhhdHRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgPSBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpLmdldChhdHRyX2Rlc2MpOwotICAgICAgICAgICAgICAgIGNvbW1pdEF0dHJpYnV0ZVRvWG1sKHVpX2F0dHIsIHVpX2F0dHIuZ2V0Q3VycmVudFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5DUkVBVEVEKTsKLSAgICAgICAgcmV0dXJuIG1YbWxOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFhNTCBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBVSSBub2RlIGlmIGl0IGV4aXN0cwotICAgICAqIGFuZCBhbHNvIHJlbW92ZXMgYWxsIG1pcnJvcmVkIGluZm9ybWF0aW9uIGluIHRoaXMgVUkgbm9kZSAoaS5lLiBjaGlsZHJlbiwgYXR0cmlidXRlcykKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHJlbW92ZWQgbm9kZSBvciBudWxsIGlmIGl0IGRpZG4ndCBleGlzdCBpbiB0aGUgZmlydHN0IHBsYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGRlbGV0ZVhtbE5vZGUoKSB7Ci0gICAgICAgIGlmIChtWG1sTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpcnN0IGNsZWFyIHRoZSBpbnRlcm5hbHMgb2YgdGhlIG5vZGUgYW5kICp0aGVuKiBhY3R1YWxseSBkZWxldGVzIHRoZSBYTUwKLSAgICAgICAgLy8gbm9kZSAoYmVjYXVzZSBkb2luZyBzbyB3aWxsIGdlbmVyYXRlIGFuIHVwZGF0ZSBldmVuIGFuZCB0aGlzIG5vZGUgbWF5IGJlCi0gICAgICAgIC8vIHJldmlzaXRlZCB2aWEgbG9hZEZyb21YbWxOb2RlKS4KLSAgICAgICAgTm9kZSBvbGRfeG1sX25vZGUgPSBtWG1sTm9kZTsKLSAgICAgICAgY2xlYXJDb250ZW50KCk7Ci0KLSAgICAgICAgTm9kZSB4bWxfcGFyZW50ID0gb2xkX3htbF9ub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHhtbF9wYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgeG1sX3BhcmVudCA9IGdldFhtbERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkX3htbF9ub2RlID0geG1sX3BhcmVudC5yZW1vdmVDaGlsZChvbGRfeG1sX25vZGUpOwotCi0gICAgICAgIGludm9rZVVpVXBkYXRlTGlzdGVuZXJzKFVpVXBkYXRlU3RhdGUuREVMRVRFRCk7Ci0gICAgICAgIHJldHVybiBvbGRfeG1sX25vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgZWxlbWVudCBsaXN0IGZvciB0aGlzIFVpRWxlbWVudE5vZGUuCi0gICAgICogQXQgdGhlIGVuZCwgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gVWlFbGVtZW50Tm9kZSBoZXJlIHdpbGwgbWF0Y2ggdGhlIG9uZSBmcm9tIHRoZQotICAgICAqIHByb3ZpZGVkIFhNTCB7QGxpbmsgTm9kZX06Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4gV2FsayBib3RoIHRoZSBjdXJyZW50IHVpIGNoaWxkcmVuIGxpc3QgYW5kIHRoZSB4bWwgY2hpbGRyZW4gbGlzdCBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAqIDxsaT4gSWYgd2UgaGF2ZSBhIG5ldyB4bWwgY2hpbGQgYnV0IGFscmVhZHkgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB1aSBjaGlsZCBsaXN0LCBhZGQgdGhlCi0gICAgICogICAgICBuZXcgeG1sIG5vZGUuCi0gICAgICogPGxpPiBPdGhlcndpc2UsIGNoZWNrIGlmIHRoZSB4bWwgbm9kZSBpcyByZWZlcmVuY2VkIGxhdGVyIGluIHRoZSB1aSBjaGlsZCBsaXN0IGFuZCBpZiBzbywKLSAgICAgKiAgICAgIG1vdmUgaXQgaGVyZS4gSXQgbWVhbnMgdGhlIFhNTCBjaGlsZCBsaXN0IGhhcyBiZWVuIHJlb3JkZXJlZC4KLSAgICAgKiA8bGk+IE90aGVyd2lzZSwgdGhpcyBpcyBhIG5ldyBYTUwgbm9kZSB0aGF0IHdlIGFkZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB1aSBjaGlsZCBsaXN0LgotICAgICAqIDxsaT4gQXQgdGhlIGVuZCwgd2UgbWF5IGhhdmUgZmluaXNoZWQgd2Fsa2luZyB0aGUgeG1sIGNoaWxkIGxpc3QgYnV0IHN0aWxsIGhhdmUgcmVtYWluaW5nCi0gICAgICogICAgICB1aSBjaGlsZHJlbiwgc2ltcGx5IGRlbGV0ZSB0aGVtIGFzIHRoZXkgbWF0Y2hpbmcgdHJhaWxpbmcgeG1sIG5vZGVzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICogICAgICByZW1vdmVkIHVubGVzcyB0aGV5IGFyZSBtYW5kYXRvcnkgdWkgbm9kZXMuCi0gICAgICogPC91bD4KLSAgICAgKiBOb3RlIHRoYXQgb25seSB0aGUgZmlyc3QgY2FzZSBpcyB1c2VkIHdoZW4gcG9wdWxhdGluZyB0aGUgdWkgbGlzdCB0aGUgZmlyc3QgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxfbm9kZSBUaGUgWE1MIG5vZGUgdG8gbWlycm9yCi0gICAgICogQHJldHVybiBUcnVlIHdoZW4gdGhlIFhNTCBzdHJ1Y3R1cmUgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlRWxlbWVudExpc3QoTm9kZSB4bWxfbm9kZSkgewotICAgICAgICBib29sZWFuIHN0cnVjdHVyZV9jaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGludCB1aV9pbmRleCA9IDA7Ci0gICAgICAgIE5vZGUgeG1sX2NoaWxkID0geG1sX25vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICB3aGlsZSAoeG1sX2NoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh4bWxfY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50X25hbWUgPSB4bWxfY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpX25vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtVWlDaGlsZHJlbi5zaXplKCkgPD0gdWlfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQSBuZXcgbm9kZSBpcyBiZWluZyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgPSBtRGVzY3JpcHRvci5maW5kQ2hpbGRyZW5EZXNjcmlwdG9yKGVsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiByZWN1cnNpdmUgKi8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIG5vZGUuIENyZWF0ZSBhIHRlbXBvcmFyeSBkZXNjcmlwdG9yIGZvciBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgaW1wb3J0YW50IHdlIHdhbnQgdG8gYXV0by1hZGQgdW5rbm93biBhdHRyaWJ1dGVzIHRvIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZEVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9ySW5wdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IEN1c3RvbVZpZXdEZXNjcmlwdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZ2V0RmlsZSgpLmdldFByb2plY3QoKSwgZWxlbWVudF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgRWxlbWVudERlc2NyaXB0b3IoZWxlbWVudF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgRWxlbWVudERlc2NyaXB0b3IoZWxlbWVudF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGFzc29jaWF0ZSBhIG5ldyAiPyIgaWNvbiB0byB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlX2NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB1aV9ub2RlID0gYXBwZW5kTmV3VWlDaGlsZChkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgdWlfaW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBIG5ldyBub2RlIGlzIGJlaW5nIGluc2VydGVkIG9yIG1vdmVkLgotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBtYW5kYXRvcnkgbm9kZXMgY2FuIGJlIGNyZWF0ZWQgd2l0aG91dCBhbiBYTUwgbm9kZSBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldFhtbE5vZGUoKSBpcyBudWxsLgotICAgICAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpX2NoaWxkOwotICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IG1VaUNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHVpX2luZGV4OyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aV9jaGlsZCA9IG1VaUNoaWxkcmVuLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aV9jaGlsZC5nZXRYbWxOb2RlKCkgIT0gbnVsbCAmJiB1aV9jaGlsZC5nZXRYbWxOb2RlKCkgPT0geG1sX2NoaWxkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPiB1aV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgc2FtZSBYTUwgbm9kZSBhdCBzb21lIGxhdGVyIGluZGV4LCBub3cgbW92ZSBpdCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlDaGlsZHJlbi5yZW1vdmUoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaUNoaWxkcmVuLmFkZCh1aV9pbmRleCwgdWlfY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVfY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpX25vZGUgPSB1aV9jaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9pbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVpX25vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gdW51c2VkIG1hbmRhdG9yeSBub2RlIHdpdGggbm8gWE1MIG5vZGUgYXR0YWNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jaW5nIHRoZSBzYW1lIFhNTCBlbGVtZW50IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB1aV9pbmRleDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpX2NoaWxkID0gbVVpQ2hpbGRyZW4uZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aV9jaGlsZC5nZXRYbWxOb2RlKCkgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfY2hpbGQuZ2V0RGVzY3JpcHRvcigpLmlzTWFuZGF0b3J5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpX2NoaWxkLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCkuZXF1YWxzKGVsZW1lbnRfbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPiB1aV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQsIG5vdyBtb3ZlIGl0IGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaUNoaWxkcmVuLnJlbW92ZShqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaUNoaWxkcmVuLmFkZCh1aV9pbmRleCwgdWlfY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbiB0aGUgWE1MIG5vZGUgdG8gdGhpcyBlbXB0eSBtYW5kYXRvcnkgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfY2hpbGQubVhtbE5vZGUgPSB4bWxfY2hpbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZV9jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfbm9kZSA9IHVpX2NoaWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9pbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh1aV9ub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydGluZyBuZXcgbm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG1EZXNjcmlwdG9yLmZpbmRDaGlsZHJlbkRlc2NyaXB0b3IoZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiByZWN1cnNpdmUgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gZWxlbWVudC4gU2ltcGx5IGlnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbmRyb2lkTWFuaWZlc3Q6IElnbm9yaW5nIHVua25vd24gJyVzJyBYTUwgZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZV9jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9ub2RlID0gaW5zZXJ0TmV3VWlDaGlsZCh1aV9pbmRleCwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfaW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodWlfbm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHRvdWNoZWQgYW4gVUkgTm9kZSwgZXZlbiBhbiBleGlzdGluZyBvbmUsIHJlZnJlc2ggaXRzIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBuZXcgbm9kZXMsIHRoaXMgd2lsbCBwb3B1bGF0ZSB0aGVtIHJlY3Vyc2l2ZWx5LgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVfY2hhbmdlZCB8PSB1aV9ub2RlLmxvYWRGcm9tWG1sTm9kZSh4bWxfY2hpbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbF9jaGlsZCA9IHhtbF9jaGlsZC5nZXROZXh0U2libGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgZXh0cmEgVUkgbm9kZXMgYXQgdGhlIGVuZCBpZiB0aGUgWE1MIG5vZGUgbGlzdCBnb3Qgc2hvcnRlci4KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSBtVWlDaGlsZHJlbi5zaXplKCkgLSAxOyBpbmRleCA+PSB1aV9pbmRleDsgLS1pbmRleCkgewotICAgICAgICAgICAgIHN0cnVjdHVyZV9jaGFuZ2VkIHw9IHJlbW92ZVVpQ2hpbGRBdEluZGV4KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVfY2hhbmdlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gcmVtb3ZlIGFuIFVJIGNoaWxkIG5vZGUgZ2l2ZW4gYnkgaXRzIGluZGV4IGluIHRoZQotICAgICAqIGludGVybmFsIGNoaWxkIGxpc3QuCi0gICAgICoKLSAgICAgKiBBbHNvIGludm9rZXMgdGhlIHVwZGF0ZSBsaXN0ZW5lciBvbiB0aGUgbm9kZSB0byBiZSBkZWxldGVkICphZnRlciogdGhlIG5vZGUgaGFzCi0gICAgICogYmVlbiByZW1vdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHVpX2luZGV4IFRoZSBpbmRleCBvZiB0aGUgVUkgY2hpbGQgdG8gcmVtb3ZlLCByYW5nZSAwIC4uIG1VaUNoaWxkcmVuLnNpemUoKS0xCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzdHJ1Y3R1cmUgaGFzIGNoYW5nZWQKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggaXMgb3V0IG9mIG1VaUNoaWxkcmVuJ3MgYm91bmRzLiBPZiBjb3Vyc2UgeW91Ci0gICAgICogICAgICAgICBrbm93IHRoYXQgY291bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB0aGUgY29tcHV0ZXIgaXMgb24gZmlyZSBvciBzb21ldGhpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVVpQ2hpbGRBdEluZGV4KGludCB1aV9pbmRleCkgewotICAgICAgICBVaUVsZW1lbnROb2RlIHVpX25vZGUgPSBtVWlDaGlsZHJlbi5nZXQodWlfaW5kZXgpOwotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gdWlfbm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh1aV9ub2RlLmdldERlc2NyaXB0b3IoKS5pc01hbmRhdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG1hbmRhdG9yeSBub2RlLiBTdWNoIGEgbm9kZSBtdXN0IGV4aXN0IGluIHRoZSBVaU5vZGUgaGllcmFyY2h5Ci0gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGVyZSdzIG5vIFhNTCBjb3VudGVycGFydC4gSG93ZXZlciB3ZSBvbmx5IG5lZWQgdG8ga2VlcCBvbmUuCi0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IChlLmcuIHRoaXMgbm9kZSkgaGFzIGFub3RoZXIgc2ltaWxhciB1aSBjaGlsZCBub2RlLgotICAgICAgICAgICAgICAgIGJvb2xlYW4ga2VlcE5vZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoVWlFbGVtZW50Tm9kZSBjaGlsZCA6IG1VaUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSB1aV9ub2RlICYmIGNoaWxkLmdldERlc2NyaXB0b3IoKSA9PSBkZXNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhbm90aGVyIGNoaWxkIHdpdGggdGhlIHNhbWUgZGVzY3JpcHRvciB0aGF0IGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgd2Ugd2FudCB0byByZW1vdmUuIFRoaXMgbWVhbnMgd2UgaGF2ZSBvbmUgbWFuZGF0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub2RlIHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIHVpX25vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwTm9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoa2VlcE5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVtb3ZlIGEgbWFuZGF0b3J5IG5vZGUgYXMgd2UgbmVlZCB0byBrZWVwIGF0IGxlYXN0IG9uZQotICAgICAgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkgbm9kZSBpbiB0aGUgcGFyZW50LiBJbnN0ZWFkIHdlIGp1c3QgY2xlYXIgaXRzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gKGluY2x1ZGluZyBpdHMgWE1MIE5vZGUgcmVmZXJlbmNlKS4KLQotICAgICAgICAgICAgICAgICAgICAvLyBBIG1hbmRhdG9yeSBub2RlIHdpdGggbm8gWE1MIG1lYW5zIGl0IGRvZXNuJ3QgcmVhbGx5IGV4aXN0LCBzbyBpdCBjYW4ndCBiZQotICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVkLiBTbyB0aGUgc3RydWN0dXJlIHdpbGwgY2hhbmdlIG9ubHkgaWYgdGhlIHVpIG5vZGUgaXMgYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB0byBhbiBYTUwgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4bWxfZXhpc3RzID0gKHVpX25vZGUuZ2V0WG1sTm9kZSgpICE9IG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIHVpX25vZGUuY2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB4bWxfZXhpc3RzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVpQ2hpbGRyZW4ucmVtb3ZlKHVpX2luZGV4KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgdGhhdCBhIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoZSBtb2RlbCBoYXMgYWxyZWFkeSBiZWVuIG1vZGlmaWVkLgotICAgICAgICAgICAgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5ERUxFVEVEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFVpRWxlbWVudE5vZGV9IGZyb20gdGhlIGdpdmVuIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0KLSAgICAgKiBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50IGNoaWxkcmVuIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfSB0aGF0IGtub3dzIGhvdyB0byBjcmVhdGUgdGhlIFVJIG5vZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IFVJIG5vZGUgdGhhdCBoYXMgYmVlbiBhcHBlbmRlZAotICAgICAqLwotICAgIHB1YmxpYyBVaUVsZW1lbnROb2RlIGFwcGVuZE5ld1VpQ2hpbGQoRWxlbWVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBVaUVsZW1lbnROb2RlIHVpX25vZGU7Ci0gICAgICAgIHVpX25vZGUgPSBkZXNjcmlwdG9yLmNyZWF0ZVVpTm9kZSgpOwotICAgICAgICBtVWlDaGlsZHJlbi5hZGQodWlfbm9kZSk7Ci0gICAgICAgIHVpX25vZGUuc2V0VWlQYXJlbnQodGhpcyk7Ci0gICAgICAgIHVpX25vZGUuaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5DUkVBVEVEKTsKLSAgICAgICAgcmV0dXJuIHVpX25vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0gZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfQotICAgICAqIGFuZCBpbnNlcnRzIGl0IGluIHRoZSBlbGVtZW50IGNoaWxkcmVuIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IGluIHRoZSBlbGVtZW50IGNoaWxkcmVuIGxpc3QuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0gdGhhdCBrbm93cyBob3cgdG8gY3JlYXRlIHRoZSBVSSBub2RlLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBVSSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBVaUVsZW1lbnROb2RlIGluc2VydE5ld1VpQ2hpbGQoaW50IGluZGV4LCBFbGVtZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgdWlfbm9kZTsKLSAgICAgICAgdWlfbm9kZSA9IGRlc2NyaXB0b3IuY3JlYXRlVWlOb2RlKCk7Ci0gICAgICAgIG1VaUNoaWxkcmVuLmFkZChpbmRleCwgdWlfbm9kZSk7Ci0gICAgICAgIHVpX25vZGUuc2V0VWlQYXJlbnQodGhpcyk7Ci0gICAgICAgIHVpX25vZGUuaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5DUkVBVEVEKTsKLSAgICAgICAgcmV0dXJuIHVpX25vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gbGlzdCBmb3IgdGhpcyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0uCi0gICAgICogPHAvPgotICAgICAqIEZvciBhIGdpdmVuIHtAbGluayBVaUVsZW1lbnROb2RlfSwgdGhlIGF0dHJpYnV0ZSBsaXN0IGFsd2F5cyBleGlzdHMgaW4KLSAgICAgKiBmdWxsIGFuZCBpcyB0b3RhbGx5IGluZGVwZW5kZW50IG9mIHdoZXRoZXIgdGhlIFhNTCBtb2RlbCBhY3R1YWxseQotICAgICAqIGhhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzLgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZWFjaCBhdHRyaWJ1dGUgZGVjbGFyZWQgaW4gdGhpcyB7QGxpbmsgVWlFbGVtZW50Tm9kZX0sIGdldAotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBhdHRyaWJ1dGUuIEl0IG1heSBub3QgZXhpc3QsIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgICogdmFsdWUgd2lsbCBiZSBudWxsLiBXZSBkb24ndCByZWFsbHkga25vdyBpZiBhIHZhbHVlIGhhcyBjaGFuZ2VkLCBzbwotICAgICAqIHRoZSB1cGRhdGVWYWx1ZSgpIGlzIGNhbGxlZCBvbiB0aGUgVUkgc2F0dHJpYnV0ZSBpbiBhbGwgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sTm9kZSBUaGUgWE1MIG5vZGUgdG8gbWlycm9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXR0cmlidXRlTGlzdChOb2RlIHhtbE5vZGUpIHsKLSAgICAgICAgTmFtZWROb2RlTWFwIHhtbEF0dHJNYXAgPSB4bWxOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgSGFzaFNldDxOb2RlPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKLQotICAgICAgICAvLyBGb3IgYWxsIGtub3duIChpLmUuIGV4cGVjdGVkKSBVSSBhdHRyaWJ1dGVzLCBmaW5kIGFuIGV4aXN0aW5nIFhNTCBhdHRyaWJ1dGUgb2YKLSAgICAgICAgLy8gc2FtZSAodXJpLCBsb2NhbCBuYW1lKSBhbmQgdXBkYXRlIHRoZSBpbnRlcm5hbCBVaSBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVpQXR0ciA6IGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IHVpQXR0ci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpZiAoIShkZXNjIGluc3RhbmNlb2YgU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICBOb2RlIHhtbEF0dHIgPSB4bWxBdHRyTWFwID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgeG1sQXR0ck1hcC5nZXROYW1lZEl0ZW1OUyhkZXNjLmdldE5hbWVzcGFjZVVyaSgpLCBkZXNjLmdldFhtbExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB1aUF0dHIudXBkYXRlVmFsdWUoeG1sQXR0cik7Ci0gICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQoeG1sQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbG9uZSB0aGUgY3VycmVudCBsaXN0IG9mIHVua25vd24gYXR0cmlidXRlcy4gV2UnbGwgdGhlbiByZW1vdmUgZnJvbSB0aGlzIGxpc3Qgd2hlbgotICAgICAgICAvLyB3ZSBzdGlsbCBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBzdGlsbCB1bmtub3duLiBXaGF0IHdpbGwgYmUgbGVmdCBhcmUgdGhlIG9sZCB1bmtub3duCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBpbiB0aGUgY3VycmVudCBYTUwgYXR0cmlidXRlIGxpc3QuCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyROT04tTkxTLTEkCi0gICAgICAgIEhhc2hTZXQ8VWlBdHRyaWJ1dGVOb2RlPiBkZWxldGVkID0gKEhhc2hTZXQ8VWlBdHRyaWJ1dGVOb2RlPikgbVVua25vd25VaUF0dHJpYnV0ZXMuY2xvbmUoKTsKLQotICAgICAgICAvLyBXZSBuZWVkIHRvIGlnbm9yZSBoaWRkZW4gYXR0cmlidXRlcy4KLSAgICAgICAgTWFwPFN0cmluZywgQXR0cmlidXRlRGVzY3JpcHRvcj4gaGlkZGVuQXR0ckRlc2MgPSBnZXRIaWRkZW5BdHRyaWJ1dGVEZXNjcmlwdG9ycygpOwotCi0gICAgICAgIC8vIFRyYXZlcnNlIHRoZSBhY3R1YWwgWE1MIGF0dHJpYnV0ZSBsaXN0IHRvIGZpbmQgdW5rbm93biBhdHRyaWJ1dGVzCi0gICAgICAgIGlmICh4bWxBdHRyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeG1sQXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSB4bWxBdHRyID0geG1sQXR0ck1hcC5pdGVtKGkpOwotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhdHRyaWJ1dGVzIHdoaWNoIGhhdmUgYWN0dWFsIGRlc2NyaXB0b3JzCi0gICAgICAgICAgICAgICAgaWYgKHZpc2l0ZWQuY29udGFpbnMoeG1sQXR0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbEZ1bGxOYW1lID0geG1sQXR0ci5nZXROb2RlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gSWdub3JlIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIGhpZGRlbiAoYmFzZWQgb24gdGhlIHByZWZpeDpsb2NhbE5hbWUga2V5KQotICAgICAgICAgICAgICAgIGlmIChoaWRkZW5BdHRyRGVzYy5jb250YWluc0tleSh4bWxGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbEF0dHJMb2NhbE5hbWUgPSB4bWxBdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxOc1VyaSA9IHhtbEF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBVaUF0dHJpYnV0ZU5vZGUgdWlBdHRyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSBhIDogbVVua25vd25VaUF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFMb2NhbE5hbWUgPSBhLmdldERlc2NyaXB0b3IoKS5nZXRYbWxMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFOc1VyaSA9IGEuZ2V0RGVzY3JpcHRvcigpLmdldE5hbWVzcGFjZVVyaSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYUxvY2FsTmFtZS5lcXVhbHMoeG1sQXR0ckxvY2FsTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYU5zVXJpID09IHhtbE5zVXJpIHx8IChhTnNVcmkgIT0gbnVsbCAmJiBhTnNVcmkuZXF1YWxzKHhtbE5zVXJpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSB1bmtub3duIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQXR0ciA9IGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBoYXMgbm90IGJlZW4gZGVsZXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZC5yZW1vdmUoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodWlBdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHVua25vd24gYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIGRlc2MgPSBuZXcgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQXR0ckxvY2FsTmFtZSwgLy8geG1sIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxGdWxsTmFtZSwgLy8gdWkgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5zVXJpLCAvLyBOUyB1cmkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBYTUwgYXR0cmlidXRlIik7IC8vIHRvb2x0aXAsIHRyYW5zbGF0YWJsZQotICAgICAgICAgICAgICAgICAgICB1aUF0dHIgPSBkZXNjLmNyZWF0ZVVpTm9kZSh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgbVVua25vd25VaUF0dHJpYnV0ZXMuYWRkKHVpQXR0cik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWlBdHRyLnVwZGF0ZVZhbHVlKHhtbEF0dHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSB0aGUgaW50ZXJuYWwgbGlzdCB1bmtub3duIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSB4bWwKLSAgICAgICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIGEgOiBkZWxldGVkKSB7Ci0gICAgICAgICAgICAgICAgbVVua25vd25VaUF0dHJpYnV0ZXMucmVtb3ZlKGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIGFsbCByZWdpc3RlcmVkIHtAbGluayBJVWlVcGRhdGVMaXN0ZW5lcn0gbGlzdGVuaW5nIG9uIHRoaXMgVUkgdXBkYXRlIGZvciB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZSBzdGF0ZSkgewotICAgICAgICBpZiAobVVpVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSVVpVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIgOiBtVWlVcGRhdGVMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci51aUVsZW1lbnROb2RlVXBkYXRlZCh0aGlzLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBhIGNyYXNoaW5nIGxpc3RlbmVyIGZyb20gY3Jhc2hpbmcgdGhlIHdob2xlIGludm9jYXRpb24gY2hhaW4KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiVUlFbGVtZW50IExpc3RlbmVyIGZhaWxlZDogJXMsIHN0YXRlPSVzIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCcmVhZGNydW1iVHJhaWxEZXNjcmlwdGlvbih0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gZm9yIGRlcml2ZWQgaW1wbGVtZW50YXRpb25zIG9ubHkgLS0tCi0KLSAgICAvLyBUT0RPIGRvYwotICAgIHByb3RlY3RlZCB2b2lkIHNldFhtbE5vZGUoTm9kZSB4bWxfbm9kZSkgewotICAgICAgICBtWG1sTm9kZSA9IHhtbF9ub2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRlbXBvcmFyeSBkYXRhIHVzZWQgYnkgdGhlIGVkaXRvcnMuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEuCi0gICAgICoKLSAgICAgKiBAc2luY2UgR0xFMQotICAgICAqIEBkZXByZWNhdGVkIFVzZWQgYnkgR0xFMS4gU2hvdWxkIGJlIGRlcHJlY2F0ZWQgZm9yIEdMRTIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWRpdERhdGEoT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgbUVkaXREYXRhID0gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgZGF0YSB1c2VkIGJ5IHRoZSBlZGl0b3JzIGZvciB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVkaXREYXRhKCkgewotICAgICAgICByZXR1cm4gbUVkaXREYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hVaSgpIHsKLSAgICAgICAgaW52b2tlVWlVcGRhdGVMaXN0ZW5lcnMoVWlVcGRhdGVTdGF0ZS5BVFRSX1VQREFURUQpOwotICAgIH0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLSBIZWxwZXJzCi0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNvbW1pdCBhIHNpbmdsZSBhdHRyaWJ1dGUgdmFsdWUgdG8gWE1MLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBYTUwgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBYTUwgdmFsdWUuCi0gICAgICogQ2FsbGVycyBzaG91bGQgY2hlY2sgZmlyc3QgaWYgYW4gdXBkYXRlIGlzIG5lZWRlZC4KLSAgICAgKiBJZiB0aGUgbmV3IHZhbHVlIGlzIGVtcHR5LCB0aGUgWE1MIGF0dHJpYnV0ZSB3aWxsIGJlIGFjdHVhbGx5IHJlbW92ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY2FsbGVyIE1VU1QgZW5zdXJlIHRoYXQgbW9kaWZ5aW5nIHRoZSB1bmRlcmx5aW5nIFhNTCBtb2RlbCBpcwotICAgICAqIHNhZmUgYW5kIG11c3QgdGFrZSBjYXJlIG9mIG1hcmtpbmcgdGhlIG1vZGVsIGFzIGRpcnR5IGlmIG5lY2Vzc2FyeS4KLSAgICAgKgotICAgICAqIEBzZWUgQW5kcm9pZEVkaXRvciNlZGl0WG1sTW9kZWwoUnVubmFibGUpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlBdHRyIFRoZSBhdHRyaWJ1dGUgbm9kZSB0byBjb21taXQuIE11c3QgYmUgYSBjaGlsZCBvZiB0aGlzIFVpRWxlbWVudE5vZGUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gc2V0LgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgWE1MIGF0dHJpYnV0ZSB3YXMgbW9kaWZpZWQgb3IgcmVtb3ZlZCwgZmFsc2UgaWYgbm90aGluZyBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdEF0dHJpYnV0ZVRvWG1sKFVpQXR0cmlidXRlTm9kZSB1aUF0dHIsIFN0cmluZyBuZXdWYWx1ZSkgewotICAgICAgICAvLyBHZXQgKG9yIGNyZWF0ZSkgdGhlIHVuZGVybHlpbmcgWE1MIGVsZW1lbnQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzLgotICAgICAgICBOb2RlIGVsZW1lbnQgPSBwcmVwYXJlQ29tbWl0KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgdWlBdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyTG9jYWxOYW1lID0gdWlBdHRyLmdldERlc2NyaXB0b3IoKS5nZXRYbWxMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyTnNVcmkgPSB1aUF0dHIuZ2V0RGVzY3JpcHRvcigpLmdldE5hbWVzcGFjZVVyaSgpOwotCi0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhdHRyaWJ1dGUgaWYgaXQncyBlbXB0eQotICAgICAgICAgICAgICAgIGlmIChhdHRyTWFwLmdldE5hbWVkSXRlbU5TKGF0dHJOc1VyaSwgYXR0ckxvY2FsTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyTWFwLnJlbW92ZU5hbWVkSXRlbU5TKGF0dHJOc1VyaSwgYXR0ckxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIG9yIHJlcGxhY2UgYW4gYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHIgYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyhhdHRyTnNVcmksIGF0dHJMb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhdHRyLnNldFZhbHVlKG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0ci5zZXRQcmVmaXgobG9va3VwTmFtZXNwYWNlUHJlZml4KGVsZW1lbnQsIGF0dHJOc1VyaSkpOwotICAgICAgICAgICAgICAgICAgICBhdHRyTWFwLnNldE5hbWVkSXRlbU5TKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gY29tbWl0IGFsbCBkaXJ0eSBhdHRyaWJ1dGVzIHZhbHVlcyB0byBYTUwuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB7QGxpbmsgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0gaGFzIGJlZW4KLSAgICAgKiBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYW5kIGFsbCB0aGUgYXR0cmlidXRlcyBtYXJrZWQgYXMgZGlydHkgbXVzdCBiZSBjb21taXRlZCB0byB0aGUKLSAgICAgKiBYTUwuIEl0IGNhbGxzIHtAbGluayAjY29tbWl0QXR0cmlidXRlVG9YbWwoVWlBdHRyaWJ1dGVOb2RlLCBTdHJpbmcpfSBvbiBlYWNoIGRpcnR5Ci0gICAgICogYXR0cmlidXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBNVVNUIGVuc3VyZSB0aGF0IG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyBYTUwgbW9kZWwgaXMKLSAgICAgKiBzYWZlIGFuZCBtdXN0IHRha2UgY2FyZSBvZiBtYXJraW5nIHRoZSBtb2RlbCBhcyBkaXJ0eSBpZiBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiBAc2VlIEFuZHJvaWRFZGl0b3IjZWRpdFhtbE1vZGVsKFJ1bm5hYmxlKQotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIG9uZSBvciBtb3JlIHZhbHVlcyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkIG9yIHJlbW92ZWQsCi0gICAgICogICAgICAgICBmYWxzZSBpZiBub3RoaW5nIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0RGlydHlBdHRyaWJ1dGVzVG9YbWwoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBhdHRyaWJ1dGVNYXAgPSBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpOwotCi0gICAgICAgIGZvciAoRW50cnk8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBlbnRyeSA6IGF0dHJpYnV0ZU1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBVaUF0dHJpYnV0ZU5vZGUgdWlfYXR0ciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodWlfYXR0ci5pc0RpcnR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gY29tbWl0QXR0cmlidXRlVG9YbWwodWlfYXR0ciwgdWlfYXR0ci5nZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgdWlfYXR0ci5zZXREaXJ0eShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IG1hdGNoaW5nIHRoZSByZXF1ZXN0ZWQgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiBJZiBubyBzdWNoIGRlY2xhcmF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIHRoZSBkZWZhdWx0ICJhbmRyb2lkIiBwcmVmaXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgY3VycmVudCBub2RlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBuc1VyaSBUaGUgbmFtZXNwYWNlIFVSSSBvZiB3aGljaCB0aGUgcHJlZml4IGlzIHRvIGJlIGZvdW5kLAotICAgICAqICAgICAgICAgICAgICBlLmcuIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMKLSAgICAgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcmVmaXggZGVjbGFyZWQgb3IgdGhlIGRlZmF1bHQgImFuZHJvaWQiIHByZWZpeC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb29rdXBOYW1lc3BhY2VQcmVmaXgoTm9kZSBub2RlLCBTdHJpbmcgbnNVcmkpIHsKLSAgICAgICAgLy8gTm90ZTogTm9kZS5sb29rdXBQcmVmaXggaXMgbm90IGltcGxlbWVudGVkIGluIHdzdC94bWwvY29yZSBOb2RlSW1wbC5qYXZhCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBlbXVsYXRlcyB0aGlzIHNpbXBsZSBjYWxsOgotICAgICAgICAvLyAgIFN0cmluZyBwcmVmaXggPSBub2RlLmxvb2t1cFByZWZpeChTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTKTsKLQotICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdGVkIFVSSSBpcyBudWxsLCBpdCBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKG5zVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGVyIFhNTCBzcGVjaWZpY2F0aW9uLCB0aGUgInhtbG5zIiBVUkkgaXMgcmVzZXJ2ZWQKLSAgICAgICAgaWYgKFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvci5YTUxOU19VUkkuZXF1YWxzKG5zVXJpKSkgewotICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgICAgZm9yICg7IG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREU7Ci0gICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLSAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgbiA9IGF0dHJzLmdldExlbmd0aCgpIC0gMTsgbiA+PSAwOyAtLW4pIHsKLSAgICAgICAgICAgICAgICBOb2RlIGF0dHIgPSBhdHRycy5pdGVtKG4pOwotICAgICAgICAgICAgICAgIGlmICgieG1sbnMiLmVxdWFscyhhdHRyLmdldFByZWZpeCgpKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyB0aGUgVVJJIHdlIGFyZSBsb29raW5nIGZvcj8gSWYgeWVzLCB3ZSBmb3VuZCBpdHMgcHJlZml4LgotICAgICAgICAgICAgICAgICAgICBpZiAobnNVcmkuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuc1ByZWZpeDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXNlIGEgc2Vuc2libGUgZGVmYXVsdCBwcmVmaXggaWYgd2UgY2FuJ3QgZmluZCBvbmUuCi0gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBwcmVmaXggaXMgbm90IG9uZSB0aGF0IHdhcyBkZWNsYXJlZCBpbiB0aGUgc2NvcGUKLSAgICAgICAgLy8gdmlzaXRlZCBhYm92ZS4gVXNlIGEgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4ICJhbmRyb2lkIiBmb3IgdGhlIEFuZHJvaWQgcmVzb3VyY2UKLSAgICAgICAgLy8gTlMgYW5kIHVzZSAibnMiIGZvciBhbGwgb3RoZXIgY3VzdG9tIG5hbWVzcGFjZXMuCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLmVxdWFscyhuc1VyaSkgPyAiYW5kcm9pZCIgOiAibnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBwcmVmaXg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyB2aXNpdGVkLmNvbnRhaW5zKHByZWZpeCk7IGkrKykgewotICAgICAgICAgICAgcHJlZml4ID0gYmFzZSArIEludGVnZXIudG9TdHJpbmcoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHNvIGNyZWF0ZSAmIGRlZmluZSB0aGlzIHByZWZpeC9VUkkgaW4gdGhlIFhNTCBkb2N1bWVudCBhcyBhbiBhdHRyaWJ1dGUgaW4gdGhlCi0gICAgICAgIC8vIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LgotICAgICAgICBpZiAoZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF0dHIgYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyhYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IuWE1MTlNfVVJJLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgIGF0dHIuc2V0VmFsdWUobnNVcmkpOwotICAgICAgICAgICAgICAgIGF0dHIuc2V0UHJlZml4KCJ4bWxucyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuc2V0TmFtZWRJdGVtTlMoYXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGludGVybmFsbHkgc2V0IHRoZSB2YWx1ZSBvZiBhIHRleHQgYXR0cmlidXRlIGZvciB0aGUgY3VycmVudAotICAgICAqIFVpRWxlbWVudE5vZGUuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgaGVscGVyLiBJdCBzaWxlbnRseSBpZ25vcmVzIHRoZSBlcnJvcnMgc3VjaCBhcyB0aGUgcmVxdWVzdGVkCi0gICAgICogYXR0cmlidXRlIG5vdCBiZWluZyBwcmVzZW50IGluIHRoZSBlbGVtZW50IG9yIGF0dHJpYnV0ZSBub3QgYmVpbmcgc2V0dGFibGUuCi0gICAgICogSXQgYWNjZXB0cyBpbmhlcml0ZWQgYXR0cmlidXRlcyAoc3VjaCBhcyBsYXlvdXQpLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRvZXMgbm90IGNvbW1pdCB0byB0aGUgWE1MIG1vZGVsLiBJdCBkb2VzIG1hcmsgdGhlIGF0dHJpYnV0ZSBub2RlIGFzIGRpcnR5LgotICAgICAqIFRoaXMgaXMgdXAgdG8gdGhlIGNhbGxlci4KLSAgICAgKgotICAgICAqIEBzZWUgI2NvbW1pdEF0dHJpYnV0ZVRvWG1sKFVpQXR0cmlidXRlTm9kZSwgU3RyaW5nKQotICAgICAqIEBzZWUgI2NvbW1pdERpcnR5QXR0cmlidXRlc1RvWG1sKCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyWG1sTmFtZSBUaGUgWE1MIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gSWYgc2V0IHRvIG51bGwsIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gb3ZlcnJpZGUgVHJ1ZSBpZiB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgZXZlbiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBVaUF0dHJpYnV0ZU5vZGUgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJYbWxOYW1lLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gb3ZlcnJpZGUpIHsKLSAgICAgICAgSGFzaE1hcDxBdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUF0dHJpYnV0ZU5vZGU+IGF0dHJpYnV0ZU1hcCA9IGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQgLS0gdGhpcyByZW1vdmVzIGFuIGF0dHJpYnV0ZQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxBdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUF0dHJpYnV0ZU5vZGU+IGVudHJ5IDogYXR0cmlidXRlTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgdWlfZGVzYyA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgaWYgKHVpX2Rlc2MuZ2V0WG1sTG9jYWxOYW1lKCkuZXF1YWxzKGF0dHJYbWxOYW1lKSkgewotICAgICAgICAgICAgICAgIFVpQXR0cmlidXRlTm9kZSB1aV9hdHRyID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYWxsIGF0dHJpYnV0ZXMgYXJlIGVkaXRhYmxlLCBpZ25vcmUgdGhvc2Ugd2hpY2ggYXJlIG5vdAotICAgICAgICAgICAgICAgIGlmICh1aV9hdHRyIGluc3RhbmNlb2YgSVVpU2V0dGFibGVBdHRyaWJ1dGVOb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gdWlfYXR0ci5nZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgKGFuZCBtYXJrIGFzIGRpcnR5KSBpZiB0aGUgYXR0cmlidXRlIGRpZCBub3QgaGF2ZSBhbnkKLSAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgb3IgaWYgdGhlIHZhbHVlIHdhcyBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZSB8fCBjdXJyZW50ID09IG51bGwgfHwgIWN1cnJlbnQuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChJVWlTZXR0YWJsZUF0dHJpYnV0ZU5vZGUpIHVpX2F0dHIpLnNldEN1cnJlbnRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBhdHRyaWJ1dGUgYXMgZGlydHkgc2luY2UgdGhlaXIgaW50ZXJuYWwgY29udGVudAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYmVlbiBtb2RpZmllZCwgYnV0IG5vdCB0aGUgdW5kZXJseWluZyBYTUwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpX2F0dHIuc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWlfYXR0cjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW50ZXJuYWwgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyByZXRyaWV2ZXMgdGhlICpmaWVsZCogdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgc29tZSBVSSwgYW5kCi0gICAgICogbm90IHRoZSBhY3R1YWwgWE1MIHZhbHVlLiBUaGV5IG1heSBkaWZmZXIgaWYgdGhlIGF0dHJpYnV0ZSBpcyBkaXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyWG1sTmFtZSBUaGUgWE1MIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBtb2RpZnkKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGludGVybmFsIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIG9yIG51bGwgaW4gY2FzZSBvZiBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRyWG1sTmFtZSkgewotICAgICAgICBIYXNoTWFwPEF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpQXR0cmlidXRlTm9kZT4gYXR0cmlidXRlTWFwID0gZ2V0SW50ZXJuYWxVaUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBmb3IgKEVudHJ5PEF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpQXR0cmlidXRlTm9kZT4gZW50cnkgOiBhdHRyaWJ1dGVNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvciB1aV9kZXNjID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAodWlfZGVzYy5nZXRYbWxMb2NhbE5hbWUoKS5lcXVhbHMoYXR0clhtbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIHVpX2F0dHIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB1aV9hdHRyLmdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIC0tLS0tLSBJUHJvcGVydHlTb3VyY2UgbWV0aG9kcwotCi0gICAgcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhpcyBub2RlLiBTaW5jZSB0aGUgZGVzY3JpcHRvcnMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlCi0gICAgICogZGF0YSwgdGhlIEF0dHJpYnV0ZURlc2NyaXB0b3IgYXJlIHVzZWQgZGlyZWN0bHkuCi0gICAgICovCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICBMaXN0PElQcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IG5ldyBBcnJheUxpc3Q8SVByb3BlcnR5RGVzY3JpcHRvcj4oKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHN0YW5kYXJkIGRlc2NyaXB0b3JzCi0gICAgICAgIEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBhdHRyaWJ1dGVNYXAgPSBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpOwotICAgICAgICBTZXQ8QXR0cmlidXRlRGVzY3JpcHRvcj4ga2V5cyA9IGF0dHJpYnV0ZU1hcC5rZXlTZXQoKTsKLQotCi0gICAgICAgIC8vIHdlIG9ubHkgd2FudCB0aGUgZGVzY3JpcHRvciB0aGF0IGRvIGltcGxlbWVudCB0aGUgSVByb3BlcnR5RGVzY3JpcHRvciBpbnRlcmZhY2UuCi0gICAgICAgIGZvciAoQXR0cmlidXRlRGVzY3JpcHRvciBrZXkgOiBrZXlzKSB7Ci0gICAgICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgSVByb3BlcnR5RGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHByb3BEZXNjcy5hZGQoKElQcm9wZXJ0eURlc2NyaXB0b3Ipa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUgdW5rbm93biBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVua25vd25Ob2RlIDogbVVua25vd25VaUF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgIGlmICh1bmtub3duTm9kZS5nZXREZXNjcmlwdG9yKCkgaW5zdGFuY2VvZiBJUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgcHJvcERlc2NzLmFkZCgoSVByb3BlcnR5RGVzY3JpcHRvcil1bmtub3duTm9kZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyBjYWNoZSB0aGlzIG1heWJlLCBhcyBpdCdzIG5vdCBnb2luZyB0byBjaGFuZ2UgKGV4Y2VwdCBmb3IgdW5rbm93biBkZXNjcmlwdG9ycykKLSAgICAgICAgcmV0dXJuIHByb3BEZXNjcy50b0FycmF5KG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW3Byb3BEZXNjcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcHJvcGVydHkuIFRoZSBpZCBpcyB0aGUgcmVzdWx0IG9mIElQcm9wZXJ0eURlc2NyaXB0b3IuZ2V0SWQoKSwKLSAgICAgKiB3aGljaCByZXR1cm4gdGhlIEF0dHJpYnV0ZURlc2NyaXB0b3IgaXRzZWxmLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLSAgICAgICAgSGFzaE1hcDxBdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUF0dHJpYnV0ZU5vZGU+IGF0dHJpYnV0ZU1hcCA9IGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcC5nZXQoaWQpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIGlkIGluIHRoZSB1bmtub3duIGF0dHJpYnV0ZXMuCi0gICAgICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1bmtub3duQXR0ciA6IG1Vbmtub3duVWlBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlkID09IHVua25vd25BdHRyLmdldERlc2NyaXB0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5rbm93bkF0dHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc2V0LiBJbiBvdXIgY2FzZSB0aGlzIGlzIGlmIHRoZSBzdHJpbmcgaXMgbm9uIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0gICAgICAgIEhhc2hNYXA8QXR0cmlidXRlRGVzY3JpcHRvciwgVWlBdHRyaWJ1dGVOb2RlPiBhdHRyaWJ1dGVNYXAgPSBnZXRJbnRlcm5hbFVpQXR0cmlidXRlcygpOwotCi0gICAgICAgIFVpQXR0cmlidXRlTm9kZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXAuZ2V0KGlkKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0Q3VycmVudFZhbHVlKCkubGVuZ3RoKCkgPiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9vayBmb3IgdGhlIGlkIGluIHRoZSB1bmtub3duIGF0dHJpYnV0ZXMuCi0gICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVua25vd25BdHRyIDogbVVua25vd25VaUF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSB1bmtub3duQXR0ci5nZXREZXNjcmlwdG9yKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5rbm93bkF0dHIuZ2V0Q3VycmVudFZhbHVlKCkubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjcmVzZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICoKLSAgICAgKiBSZXNldCB0aGUgcHJvcGVydHkgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIEZvciBub3cgd2Ugc2ltcGx5IGVtcHR5IGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLSAgICAgICAgSGFzaE1hcDxBdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUF0dHJpYnV0ZU5vZGU+IGF0dHJpYnV0ZU1hcCA9IGdldEludGVybmFsVWlBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgVWlBdHRyaWJ1dGVOb2RlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcC5nZXQoaWQpOwotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBpZCBpbiB0aGUgdW5rbm93biBhdHRyaWJ1dGVzLgotICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSB1bmtub3duQXR0ciA6IG1Vbmtub3duVWlBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gdW5rbm93bkF0dHIuZ2V0RGVzY3JpcHRvcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogcmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2Ujc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqCi0gICAgICogU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZS4gaWQgaXMgdGhlIHJlc3VsdCBvZiBJUHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCksIHdoaWNoIGlzIHRoZQotICAgICAqIEF0dHJpYnV0ZURlc2NyaXB0b3IgaXRzZWxmLiBWYWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBIYXNoTWFwPEF0dHJpYnV0ZURlc2NyaXB0b3IsIFVpQXR0cmlidXRlTm9kZT4gYXR0cmlidXRlTWFwID0gZ2V0SW50ZXJuYWxVaUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBVaUF0dHJpYnV0ZU5vZGUgYXR0cmlidXRlID0gYXR0cmlidXRlTWFwLmdldChpZCk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgaWQgaW4gdGhlIHVua25vd24gYXR0cmlidXRlcy4KLSAgICAgICAgICAgIGZvciAoVWlBdHRyaWJ1dGVOb2RlIHVua25vd25BdHRyIDogbVVua25vd25VaUF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaWQgPT0gdW5rbm93bkF0dHIuZ2V0RGVzY3JpcHRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IHVua25vd25BdHRyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBuZXcgdmFsdWUKLSAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZSA9IGF0dHJpYnV0ZS5nZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBVaUF0dHJpYnV0ZU5vZGUgZkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgICAgICAgICAgIEFuZHJvaWRFZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0gICAgICAgICAgICBlZGl0b3IuZWRpdFhtbE1vZGVsKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1pdEF0dHJpYnV0ZVRvWG1sKGZBdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlGbGFnQXR0cmlidXRlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaUZsYWdBdHRyaWJ1dGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTkwM2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaUZsYWdBdHRyaWJ1dGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkZsYWdBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlNlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkZvbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgYXR0cmlidXRlIHRoYXQgaXMgZGVmaW5lZCBieSBhIHNldCBvZiBmbGFnIHZhbHVlcywKLSAqIGkuZS4gZW51bSBuYW1lcyBzZXBhcmF0ZWQgYnkgcGlwZSAofCkgY2hhcmFjdGVycy4KLSAqIAotICogTm90ZTogaW4gQW5kcm9pZCByZXNvdXJjZXMsIGEgImZsYWciIGlzIGEgbGlzdCBvZiBmaXhlZCB2YWx1ZXMgd2hlcmUgb25lIG9yCi0gKiBtb3JlIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgYW4gIm9yIiwgZS5nLiAiYWxpZ249J2xlZnR8dG9wJyIuCi0gKiBCeSBjb250cmFzdCwgYW4gImVudW0iIGlzIGEgbGlzdCBvZiBmaXhlZCB2YWx1ZXMgb2Ygd2hpY2ggb25seSBvbmUgY2FuIGJlCi0gKiBzZWxlY3RlZCBhdCBhIGdpdmVuIHRpbWUsIGUuZy4gImdyYXZpdHk9J3JpZ2h0JyIuCi0gKiA8cC8+Ci0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlICJmbGFnIiBjYXNlLgotICogVGhlICJlbnVtIiBjYXNlIGlzIGRvbmUgdXNpbmcge0BsaW5rIFVpTGlzdEF0dHJpYnV0ZU5vZGV9LgotICovCi1wdWJsaWMgY2xhc3MgVWlGbGFnQXR0cmlidXRlTm9kZSBleHRlbmRzIFVpVGV4dEF0dHJpYnV0ZU5vZGUgewotCi0gICAgcHVibGljIFVpRmxhZ0F0dHJpYnV0ZU5vZGUoRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IgYXR0cmlidXRlRGVzY3JpcHRvciwKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlQYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoYXR0cmlidXRlRGVzY3JpcHRvciwgdWlQYXJlbnQpOwotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ3JlYXRlcyBhIGxhYmVsIHdpZGdldCBhbmQgYW4gYXNzb2NpYXRlZCB0ZXh0IGZpZWxkLgotICAgICAqIDxwLz4KLSAgICAgKiBBcyBtb3N0IG90aGVyIHBhcnRzIG9mIHRoZSBhbmRyb2lkIG1hbmlmZXN0IGVkaXRvciwgdGhpcyBhc3N1bWVzIHRoZQotICAgICAqIHBhcmVudCB1c2VzIGEgdGFibGUgbGF5b3V0IHdpdGggMiBjb2x1bW5zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVVpQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLSAgICAgICAgc2V0TWFuYWdlZEZvcm0obWFuYWdlZEZvcm0pOwotICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciBkZXNjID0gKFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhcmVudCwgZGVzYy5nZXRVaU5hbWUoKSk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5MRUZULCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBTZWN0aW9uSGVscGVyLmFkZENvbnRyb2xUb29sdGlwKGxhYmVsLCBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoZGVzYy5nZXRUb29sdGlwKCkpKTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsIFRhYmxlV3JhcERhdGEuTUlERExFKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgICAgIC8vIEZpeGVzIG1pc3NpbmcgdGV4dCBib3JkZXJzIHVuZGVyIEdUSy4uLiBhbHNvIHJlcXVpcmVzIGFkZGluZyBhIDEtcGl4ZWwgbWFyZ2luCi0gICAgICAgIC8vIGZvciB0aGUgdGV4dCBmaWVsZCBiZWxvdwotICAgICAgICB0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgZ2V0Q3VycmVudFZhbHVlKCkpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMTsgIC8vIE5lZWRlZCBieSB0aGUgZml4ZWQgY29tcG9zaXRlIGJvcmRlcnMgdW5kZXIgR1RLCi0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBzZWxlY3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJTZWxlY3QuLi4iLCBTV1QuUFVTSCk7Ci0gICAgICAgIAotICAgICAgICBzZXRUZXh0V2lkZ2V0KHRleHQpOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRleHQgPSBnZXRUZXh0V2lkZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2hvd0RpYWxvZyhzZWxlY3RCdXR0b24uZ2V0U2hlbGwoKSwgY3VycmVudFRleHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRUZXh0V2lkZ2V0VmFsdWUocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmxhZyBuYW1lcywgZWl0aGVyIGZyb20gdGhlIGluaXRpYWwgbmFtZXMgc2V0IGluIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBvciBieSBxdWVyeWluZyB0aGUgZnJhbWV3b3JrIHJlc291cmNlIHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgU3RyaW5nIGF0dHJfbmFtZSA9IGdldERlc2NyaXB0b3IoKS5nZXRYbWxMb2NhbE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnRfbmFtZSA9IGdldFVpUGFyZW50KCkuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoZ2V0RGVzY3JpcHRvcigpIGluc3RhbmNlb2YgRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IgJiYKLSAgICAgICAgICAgICAgICAoKEZsYWdBdHRyaWJ1dGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKCkpLmdldE5hbWVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IGVudW0gdmFsdWVzIGZyb20gdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgIHZhbHVlcyA9ICgoRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoKSkuZ2V0TmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gb3IgZnJvbSB0aGUgQW5kcm9pZFRhcmdldERhdGEKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgICAgIEFuZHJvaWRFZGl0b3IgZWRpdG9yID0gdWlOb2RlLmdldEVkaXRvcigpOwotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGVkaXRvci5nZXRUYXJnZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gZGF0YS5nZXRBdHRyaWJ1dGVWYWx1ZXMoZWxlbWVudF9uYW1lLCBhdHRyX25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG93cyBhIGRpYWxvZyBsZXR0aW5nIHRoZSB1c2VyIGNob29zZSBhIHNldCBvZiBlbnVtLCBhbmQgcmV0dXJucyBhIHN0cmluZwotICAgICAqIGNvbnRhaW5pbmcgdGhlIHJlc3VsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNob3dEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBjdXJyZW50VmFsdWUpIHsKLSAgICAgICAgRmxhZ1NlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgRmxhZ1NlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICBzaGVsbCwgY3VycmVudFZhbHVlLnRyaW0oKS5zcGxpdCgiXFxzKlxcfFxccyoiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGxnLm9wZW4oKTsKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGxnLmdldFJlc3VsdCgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG5hbWUgOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgifCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGlzcGxheXMgYSBsaXN0IG9mIGZsYWcgbmFtZXMgd2l0aCBjaGVja2JveGVzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRmxhZ1NlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtQ3VycmVudFNldDsKLSAgICAgICAgcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0KLSAgICAgICAgcHVibGljIEZsYWdTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGN1cnJlbnROYW1lcykgewotICAgICAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtQ3VycmVudFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBjdXJyZW50TmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZXQuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHNoZWxsU3R5bGUgPSBnZXRTaGVsbFN0eWxlKCk7Ci0gICAgICAgICAgICBzZXRTaGVsbFN0eWxlKHNoZWxsU3R5bGUgfCBTV1QuTUFYIHwgU1dULlJFU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgICAgIGlmIChtVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKFRhYmxlSXRlbSBpdGVtIDogbVRhYmxlLmdldEl0ZW1zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZCgoU3RyaW5nKWl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIlNlbGVjdCB0aGUgZmxhZyB2YWx1ZXMgZm9yIGF0dHJpYnV0ZSAlMSRzOiIsCi0gICAgICAgICAgICAgICAgICAgICgoRmxhZ0F0dHJpYnV0ZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoKSkuZ2V0VWlOYW1lKCkpKTsKLSAKLSAgICAgICAgICAgIG1UYWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIpOwotICAgICAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICAgICAgLy8gVGhlIDYwLDE4IGhpbnRzIGFyZSB0aGUgb25lcyB1c2VkIGJ5IEFic3RyYWN0RWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cKLSAgICAgICAgICAgIGRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDYwKTsKLSAgICAgICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTgpOwotICAgICAgICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICAgICAgbVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgICAgIG1UYWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtVGFibGUsIFNXVC5OT05FKTsKLQotICAgICAgICAgICAgLy8gTGlzdCBhbGwgdGhlIGV4cGVjdGVkIGZsYWcgbmFtZXMgYW5kIGNoZWNrIHRob3NlIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZAotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBnZXRQb3NzaWJsZVZhbHVlcyhudWxsKTsKLSAgICAgICAgICAgIGlmIChuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShtVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc05hbWUgPSBtQ3VycmVudFNldC5jb250YWlucyhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKGhhc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZXQucmVtb3ZlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgdW5rbm93biBmbGFnIG5hbWVzIGN1cnJlbnRseSB1c2VkLCBkaXNwbGF5IHRoZW0gYXQgdGhlIGVuZCBpZiB0aGUKLSAgICAgICAgICAgIC8vIHRhYmxlIGFscmVhZHkgY2hlY2tlZC4KLSAgICAgICAgICAgIGlmICghbUN1cnJlbnRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgRm9udERlc2NyaXB0b3IgZm9udERlc2MgPSBKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgIGZvbnREZXNjID0gZm9udERlc2Mud2l0aFN0eWxlKFNXVC5JVEFMSUMpOwotICAgICAgICAgICAgICAgIEZvbnQgZm9udCA9IGZvbnREZXNjLmNyZWF0ZUZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpLmdldERldmljZSgpKTsKLQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtQ3VycmVudFNldCkgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dChTdHJpbmcuZm9ybWF0KCIlMSRzICh1bmtub3duIGZsYWcpIiwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRGb250KGZvbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIHJlc2l6ZSB0aGUgY29sdW1uIHRvIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB0YWJsZQotICAgICAgICAgICAgLy8gc28gdGhhdCBvbmx5IG9uZSBjb2x1bW4gYXBwZWFycyBpbiB0aGUgdGFibGUgZXZlbiBpZiB0aGUgZGlhbG9nIGlzIHJlc2l6ZWQuCi0gICAgICAgICAgICBDb250cm9sQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgciA9IG1UYWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRXaWR0aChyLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtVGFibGUuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLmNvbnRyb2xSZXNpemVkKG51bGwgLyogZXZlbnQgbm90IHVzZWQgKi8pOwotCi0gICAgICAgICAgICAvLyBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdGhhdCB3aWxsIGNoZWNrL3VuY2hlY2sgaXRlbXMgd2hlbiB0aGV5IGFyZSBkb3VibGUtY2xpY2tlZAotICAgICAgICAgICAgbVRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIC8qKiBEZWZhdWx0IHNlbGVjdGlvbiBtZWFucyBkb3VibGUtY2xpY2sgb24gIm1vc3QiIHBsYXRmb3JtcyAqLwotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlLml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpID0gKFRhYmxlSXRlbSkgZS5pdGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgaS5zZXRDaGVja2VkKCFpLmdldENoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOyAgICAgICAgICAgIAotICAgICAgICAgICAgc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpTGlzdEF0dHJpYnV0ZU5vZGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlMaXN0QXR0cmlidXRlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU0Yjc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlMaXN0QXR0cmlidXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlNlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBhdHRyaWJ1dGUgd2hpY2ggaGFzIHBvc3NpYmxlIGJ1aWx0LWluIHZhbHVlcywgYW5kIGNhbiBiZSBtb2RpZmllZCBieQotICogYW4gZWRpdGFibGUgQ29tYm8gYm94LgotICogPHAvPgotICogU2VlIHtAbGluayBVaVRleHRBdHRyaWJ1dGVOb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVpTGlzdEF0dHJpYnV0ZU5vZGUgZXh0ZW5kcyBVaUFic3RyYWN0VGV4dEF0dHJpYnV0ZU5vZGUgewotCi0gICAgcHJvdGVjdGVkIENvbWJvIG1Db21ibzsKLQotICAgIHB1YmxpYyBVaUxpc3RBdHRyaWJ1dGVOb2RlKExpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJpYnV0ZURlc2NyaXB0b3IsCi0gICAgICAgICAgICBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBDcmVhdGVzIGEgbGFiZWwgd2lkZ2V0IGFuZCBhbiBhc3NvY2lhdGVkIHRleHQgZmllbGQuCi0gICAgICogPHAvPgotICAgICAqIEFzIG1vc3Qgb3RoZXIgcGFydHMgb2YgdGhlIGFuZHJvaWQgbWFuaWZlc3QgZWRpdG9yLCB0aGlzIGFzc3VtZXMgdGhlCi0gICAgICogcGFyZW50IHVzZXMgYSB0YWJsZSBsYXlvdXQgd2l0aCAyIGNvbHVtbnMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlVWlDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotICAgICAgICBUZXh0QXR0cmlidXRlRGVzY3JpcHRvciBkZXNjID0gKFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhcmVudCwgZGVzYy5nZXRVaU5hbWUoKSk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5MRUZULCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBTZWN0aW9uSGVscGVyLmFkZENvbnRyb2xUb29sdGlwKGxhYmVsLCBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoZGVzYy5nZXRUb29sdGlwKCkpKTsKLQotICAgICAgICBpbnQgc3R5bGUgPSBTV1QuRFJPUF9ET1dOOwotICAgICAgICBtQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7IAotICAgICAgICBUYWJsZVdyYXBEYXRhIHR3ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLCBUYWJsZVdyYXBEYXRhLk1JRERMRSk7Ci0gICAgICAgIHR3ZC5tYXhXaWR0aCA9IDEwMDsKLSAgICAgICAgbUNvbWJvLnNldExheW91dERhdGEodHdkKTsKLSAgICAgICAgCi0gICAgICAgIGZpbGxDb21ibygpOwotICAgICAgICAKLSAgICAgICAgc2V0VGV4dFdpZGdldFZhbHVlKGdldEN1cnJlbnRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG1Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNlbnQgd2hlbiB0aGUgdGV4dCBpcyBtb2RpZmllZCwgd2hldGhlciBieSB0aGUgdXNlciB2aWEgbWFudWFsCi0gICAgICAgICAgICAgKiBpbnB1dCBvciBwcm9ncmFtbWF0aWMgaW5wdXQgdmlhIHNldFRleHQoKS4KLSAgICAgICAgICAgICAqIDxwLz4KLSAgICAgICAgICAgICAqIFNpbXBseSBtYXJrIHRoZSBhdHRyaWJ1dGUgYXMgZGlydHkgaWYgaXQgcmVhbGx5IGNoYW5nZWQuCi0gICAgICAgICAgICAgKiBUaGUgY29udGFpbmVyIFNlY3Rpb25QYXJ0IHdpbGwgY29sbGVjdCB0aGVzZSBmbGFnIGFuZCBtYW5hZ2UgdGhlbS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0luSW50ZXJuYWxUZXh0TW9kaWZpY2F0aW9uKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc0RpcnR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21ibyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50VmFsdWUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhbUNvbWJvLmdldFRleHQoKS5lcXVhbHMoZ2V0Q3VycmVudFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERpcnR5KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHNlbGYtcmVmZXJlbmNlIHdoZW4gdGhlIHdpZGdldCBpcyBkaXNwb3NlZAotICAgICAgICBtQ29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1Db21ibyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29tYm8oKSB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldFBvc3NpYmxlVmFsdWVzKG51bGwpOwotCi0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAiRnJhbWV3b3JrUmVzb3VyY2VNYW5hZ2VyIGRpZCBub3QgcHJvdmlkZSB2YWx1ZXMgeWV0IGZvciAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRvcigpLmdldFhtbExvY2FsTmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbWJvLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IHZhbHVlcywgZWl0aGVyIGZyb20gdGhlIGluaXRpYWwgdmFsdWVzIHNldCBpbiB0aGUgYXR0cmlidXRlCi0gICAgICogb3IgYnkgcXVlcnlpbmcgdGhlIGZyYW1ld29yayByZXNvdXJjZSBwYXJzZXIuCi0gICAgICogCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSB1aVBhcmVudCA9IGdldFVpUGFyZW50KCk7Ci0KLSAgICAgICAgU3RyaW5nIGF0dHJfbmFtZSA9IGRlc2NyaXB0b3IuZ2V0WG1sTG9jYWxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50X25hbWUgPSB1aVBhcmVudC5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gRnJhbWV3b3JrUmVzb3VyY2VNYW5hZ2VyIGV4cGVjdHMgYSBzcGVjaWZpYyBwcmVmaXggZm9yIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgIFN0cmluZyBuc1ByZWZpeCA9ICIiOwotICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUy5lcXVhbHMoZGVzY3JpcHRvci5nZXROYW1lc3BhY2VVcmkoKSkpIHsKLSAgICAgICAgICAgIG5zUHJlZml4ID0gImFuZHJvaWQ6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgaWYgKFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvci5YTUxOU19VUkkuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0TmFtZXNwYWNlVXJpKCkpKSB7Ci0gICAgICAgICAgICBuc1ByZWZpeCA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgYXR0cl9uYW1lID0gbnNQcmVmaXggKyBhdHRyX25hbWU7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBMaXN0QXR0cmlidXRlRGVzY3JpcHRvciAmJgotICAgICAgICAgICAgICAgICgoTGlzdEF0dHJpYnV0ZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFZhbHVlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCBlbnVtIHZhbHVlcyBmcm9tIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgICAgICB2YWx1ZXMgPSAoKExpc3RBdHRyaWJ1dGVEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gb3IgZnJvbSB0aGUgQW5kcm9pZFRhcmdldERhdGEKLSAgICAgICAgICAgIFVpRWxlbWVudE5vZGUgdWlOb2RlID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgICAgIEFuZHJvaWRFZGl0b3IgZWRpdG9yID0gdWlOb2RlLmdldEVkaXRvcigpOwotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IGVkaXRvci5nZXRUYXJnZXREYXRhKCk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBncmVhdC1ncmFuZC1wYXJlbnQgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNob3VsZCBhbHdheXMgZXhpc3QuCi0gICAgICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSBncmFuZFBhcmVudE5vZGUgPSB1aVBhcmVudC5nZXRVaVBhcmVudCgpOwotICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBncmVhdEdyYW5kUGFyZW50Tm9kZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChncmFuZFBhcmVudE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBVaUVsZW1lbnROb2RlIGdyZWF0R3JhbmRQYXJlbnROb2RlID0gZ3JhbmRQYXJlbnROb2RlLmdldFVpUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmVhdEdyYW5kUGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVhdEdyYW5kUGFyZW50Tm9kZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0R3JhbmRQYXJlbnROb2RlLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBkYXRhLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50X25hbWUsIGF0dHJfbmFtZSwgZ3JlYXRHcmFuZFBhcmVudE5vZGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRXaWRnZXRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKG1Db21ibyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db21ibyAhPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRleHRXaWRnZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1Db21ibyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29tYm8uc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjM4NGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaVJlc291cmNlQXR0cmlidXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkFuZHJvaWRFZGl0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5EZXNjcmlwdG9yc1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLlNlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuUmVmZXJlbmNlQ2hvb3NlckRpYWxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuUmVzb3VyY2VDaG9vc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gWE1MIGF0dHJpYnV0ZSBmb3IgYSByZXNvdXJjZSB0aGF0IGNhbiBiZSBtb2RpZmllZCB1c2luZyBhIHNpbXBsZSB0ZXh0IGZpZWxkIG9yCi0gKiBhIGRpYWxvZyB0byBjaG9vc2UgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCi0gKiA8cC8+Ci0gKiBJdCBjYW4gYmUgY29uZmlndXJlZCB0byByZXByZXNlbnQgYW55IGtpbmQgb2YgcmVzb3VyY2UsIGJ5IHByb3ZpZGluZyB0aGUgZGVzaXJlZAotICoge0BsaW5rIFJlc291cmNlVHlwZX0gaW4gdGhlIGNvbnN0cnVjdG9yLgotICogPHAvPgotICogU2VlIHtAbGluayBVaVRleHRBdHRyaWJ1dGVOb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlIGV4dGVuZHMgVWlUZXh0QXR0cmlidXRlTm9kZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBSZXNvdXJjZVR5cGUgbVR5cGU7Ci0gICAgCi0gICAgcHVibGljIFVpUmVzb3VyY2VBdHRyaWJ1dGVOb2RlKFJlc291cmNlVHlwZSB0eXBlLAotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIENyZWF0ZXMgYSBsYWJlbCB3aWRnZXQgYW5kIGFuIGFzc29jaWF0ZWQgdGV4dCBmaWVsZC4KLSAgICAgKiA8cC8+Ci0gICAgICogQXMgbW9zdCBvdGhlciBwYXJ0cyBvZiB0aGUgYW5kcm9pZCBtYW5pZmVzdCBlZGl0b3IsIHRoaXMgYXNzdW1lcyB0aGUKLSAgICAgKiBwYXJlbnQgdXNlcyBhIHRhYmxlIGxheW91dCB3aXRoIDIgY29sdW1ucy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVVaUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIHNldE1hbmFnZWRGb3JtKG1hbmFnZWRGb3JtKTsKLSAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLSAgICAgICAgVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IChUZXh0QXR0cmlidXRlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIGRlc2MuZ2V0VWlOYW1lKCkpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuTEVGVCwgVGFibGVXcmFwRGF0YS5NSURETEUpKTsKLSAgICAgICAgU2VjdGlvbkhlbHBlci5hZGRDb250cm9sVG9vbHRpcChsYWJlbCwgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKGRlc2MuZ2V0VG9vbHRpcCgpKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLCBUYWJsZVdyYXBEYXRhLk1JRERMRSkpOwotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgICAgICAvLyBGaXhlcyBtaXNzaW5nIHRleHQgYm9yZGVycyB1bmRlciBHVEsuLi4gYWxzbyByZXF1aXJlcyBhZGRpbmcgYSAxLXBpeGVsIG1hcmdpbgotICAgICAgICAvLyBmb3IgdGhlIHRleHQgZmllbGQgYmVsb3cKLSAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFRleHQgdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsIGdldEN1cnJlbnRWYWx1ZSgpKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IDE7ICAvLyBOZWVkZWQgYnkgdGhlIGZpeGVkIGNvbXBvc2l0ZSBib3JkZXJzIHVuZGVyIEdUSwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBCdXR0b24gYnJvd3NlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiQnJvd3NlLi4uIiwgU1dULlBVU0gpOwotICAgICAgICAKLSAgICAgICAgc2V0VGV4dFdpZGdldCh0ZXh0KTsKLQotICAgICAgICAvLyBUT0RPIEFkZCBhIHZhbGlkYXRvciB1c2luZyBvbkFkZE1vZGlmeUxpc3RlbmVyCi0gICAgICAgIAotICAgICAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2hvd0RpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSwgdGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2hvd3MgYSBkaWFsb2cgbGV0dGluZyB0aGUgdXNlciBjaG9vc2UgYSBzZXQgb2YgZW51bSwgYW5kIHJldHVybnMgYSBzdHJpbmcKLSAgICAgKiBjb250YWluaW5nIHRoZSByZXN1bHQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzaG93RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgY3VycmVudFZhbHVlKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBwcm9qZWN0IG9mIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4KLSAgICAgICAgVWlFbGVtZW50Tm9kZSB1aU5vZGUgPSBnZXRVaVBhcmVudCgpOwotICAgICAgICBBbmRyb2lkRWRpdG9yIGVkaXRvciA9IHVpTm9kZS5nZXRFZGl0b3IoKTsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGVkaXRvci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2UgcmVwb3NpdG9yeSBmb3IgdGhpcyBwcm9qZWN0IGFuZCB0aGUgc3lzdGVtIHJlc291cmNlcy4KLSAgICAgICAgICAgIElSZXNvdXJjZVJlcG9zaXRvcnkgcHJvamVjdFJlcG9zaXRvcnkgPQotICAgICAgICAgICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RSZXNvdXJjZXMocHJvamVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBUYXJnZXQgRGF0YSB0byBnZXQgdGhlIHN5c3RlbSByZXNvdXJjZXMKLSAgICAgICAgICAgICAgICBBbmRyb2lkVGFyZ2V0RGF0YSBkYXRhID0gZWRpdG9yLmdldFRhcmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VSZXBvc2l0b3J5IHN5c3RlbVJlcG9zaXRvcnkgPSBkYXRhLmdldFN5c3RlbVJlc291cmNlcygpOwotCi0gICAgICAgICAgICAgICAgLy8gb3BlbiBhIHJlc291cmNlIGNob29zZXIgZGlhbG9nIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KLSAgICAgICAgICAgICAgICBSZXNvdXJjZUNob29zZXIgZGxnID0gbmV3IFJlc291cmNlQ2hvb3Nlcihwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0UmVwb3NpdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbVJlcG9zaXRvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCk7Ci0KLSAgICAgICAgICAgICAgICBkbGcuc2V0Q3VycmVudFJlc291cmNlKGN1cnJlbnRWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRsZy5nZXRDdXJyZW50UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJlZmVyZW5jZUNob29zZXJEaWFsb2cgZGxnID0gbmV3IFJlZmVyZW5jZUNob29zZXJEaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlcG9zaXRvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCk7Ci0KLSAgICAgICAgICAgICAgICBkbGcuc2V0Q3VycmVudFJlc291cmNlKGN1cnJlbnRWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRsZy5nZXRDdXJyZW50UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgdGhlIHZhbHVlcyBvbmUgY291bGQgdXNlIHRvIGF1dG8tY29tcGxldGUgYSAicmVzb3VyY2UiIHZhbHVlIGluIGFuIFhNTAotICAgICAqIGNvbnRlbnQgYXNzaXN0LgotICAgICAqIDxwLz4KLSAgICAgKiBUeXBpY2FsbHkgdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIGluIGEgcmVzb3VyY2UgWE1MLCBlLmcuCi0gICAgICogICA8cHJlPiAiJmx0O0J1dHRvbiBhbmRyb2lkOnRlc3Q9IkBzdHJpbmcvbXlfW2NhcmV0XV9zdHJpbmcuLi4iIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiAKLSAgICAgKiAicHJlZml4IiBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgdXNlciBoYXMgdHlwZWQgc28gZmFyIChvciBtb3JlIGV4YWN0bHkgd2hhdGV2ZXIgaXMgb24gdGhlCi0gICAgICogbGVmdCBzaWRlIG9mIHRoZSBpbnNlcnRpb24gcG9pbnQpLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSBpdCB3b3VsZCBiZSAiQHN0eWxlL215XyIuCi0gICAgICogPHAvPgotICAgICAqIAotICAgICAqIFRvIGF2b2lkIGEgaHVnZSBsb25nIGxpc3Qgb2YgdmFsdWVzLCB0aGUgY29tcGxldGlvbiB3b3JrcyBvbiB0d28gbGV2ZWxzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IElmIGEgcmVzb3VyY2UgdHlwZSBhcyBiZWVuIHR5cGVkIHNvIGZhciAoZS5nLiAiQHN0eWxlLyIpLCB0aGVuIGxpbWl0IHRoZSB2YWx1ZXMgdG8KLSAgICAgKiAgICAgIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyB0aGF0IG1hdGNoIHRoaXMgdHlwZS4KLSAgICAgKiA8bGk+IElmIG5vIHJlc291cmNlIHR5cGUgYXMgYmVlbiB0eXBlZCBzbyBmYXIsIHRoZW4gcmV0dXJuIHRoZSB2YXJpb3VzIHR5cGVzIHRoYXQgY291bGQgYmUKLSAgICAgKiAgICAgIGNvbXBsZXRlZC4gU28gaWYgdGhlIHByb2plY3QgaGFzIG9ubHkgc3RyaW5ncyBhbmQgbGF5b3V0cyByZXNvdXJjZXMsIGZvciBleGFtcGxlLAotICAgICAqICAgICAgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBvbmx5IGluY2x1ZGUgIkBzdHJpbmcvIiBhbmQgIkBsYXlvdXQvIi4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEZpbmFsbHkgaWYgYW55d2hlcmUgaW4gdGhlIHN0cmluZyB3ZSBmaW5kIHRoZSBzcGVjaWFsIHRva2VuICJhbmRyb2lkOiIsIHdlIHVzZSB0aGUKLSAgICAgKiBjdXJyZW50IGZyYW1ld29yayBzeXN0ZW0gcmVzb3VyY2VzIHJhdGhlciB0aGFuIHRoZSBwcm9qZWN0IHJlc291cmNlcy4KLSAgICAgKiBUaGlzIHdvcmtzIGZvciBib3RoICJAYW5kcm9pZDpzdHlsZS9mb28iIGFuZCAiQHN0eWxlL2FuZHJvaWQ6Zm9vIiBjb252ZW50aW9ucyBldmVuIHRob3VnaAotICAgICAqIHRoZSByZWNvbnN0cnVjdGVkIG5hbWUgd2lsbCBhbHdheXMgYmUgb2YgdGhlIGZvcm1lciBmb3JtLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCAiYW5kcm9pZDoiIGhlcmUgaXMgYSBrZXl3b3JkIHNwZWNpZmljIHRvIEFuZHJvaWQgcmVzb3VyY2VzIGFuZCBzaG91bGQgbm90IGJlCi0gICAgICogbWl4ZWQgd2l0aCBhbiBYTUwgbmFtZXNwYWNlIGZvciBhbiBYTUwgYXR0cmlidXRlIG5hbWUuIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIElSZXNvdXJjZVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNTeXN0ZW0gPSBmYWxzZTsKLQotICAgICAgICBVaUVsZW1lbnROb2RlIHVpTm9kZSA9IGdldFVpUGFyZW50KCk7Ci0gICAgICAgIEFuZHJvaWRFZGl0b3IgZWRpdG9yID0gdWlOb2RlLmdldEVkaXRvcigpOwotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguaW5kZXhPZigiYW5kcm9pZDoiKSA8IDApIHsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBlZGl0b3IuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2UgcmVwb3NpdG9yeSBmb3IgdGhpcyBwcm9qZWN0IGFuZCB0aGUgc3lzdGVtIHJlc291cmNlcy4KLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdFJlc291cmNlcyhwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBwcmVmaXggd2l0aCAiYW5kcm9pZDoiIGluIGl0LCB1c2UgdGhlIHN5c3RlbSByZXNvdXJjZXMKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUT0RPIGZpbmQgYSB3YXkgdG8gb25seSBsaXN0ICpwdWJsaWMqIGZyYW1ld29yayByZXNvdXJjZXMgaGVyZS4KLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBlZGl0b3IuZ2V0VGFyZ2V0RGF0YSgpOwotICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGRhdGEuZ2V0U3lzdGVtUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBpc1N5c3RlbSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgbGlzdCBvZiBwb3RlbnRpYWwgcmVzb3VyY2UgdHlwZXMsIGVpdGhlciBzcGVjaWZpYyB0byB0aGlzIHByb2plY3QKLSAgICAgICAgLy8gb3IgdGhlIGdlbmVyaWMgbGlzdC4KLSAgICAgICAgUmVzb3VyY2VUeXBlW10gcmVzVHlwZXMgPSAocmVwb3NpdG9yeSAhPSBudWxsKSA/Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuZ2V0QXZhaWxhYmxlUmVzb3VyY2VUeXBlcygpIDoKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLnZhbHVlcygpOwotCi0gICAgICAgIC8vIEdldCB0aGUgdHlwZSBuYW1lIGZyb20gdGhlIHByZWZpeCwgaWYgYW55LiBJdCdzIGFueSB3b3JkIGJlZm9yZSB0aGUgLyBpZiB0aGVyZSdzIG9uZQotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBhdHRlcm4uY29tcGlsZSgiLio/KFthLXpdKykvLioiKS5tYXRjaGVyKHByZWZpeCk7Ci0gICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgY29sbGVjdCByZXN1bHRzCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBwcmVmaXggZG9lcyBub3QgaGF2ZSBhIC8gaW4gaXQsIHNvIHRoZSByZXNvdXJjZSBzdHJpbmcgaXMgZWl0aGVyIGVtcHR5Ci0gICAgICAgICAgICAvLyBvciBkb2VzIG5vdCBoYXZlIHRoZSByZXNvdXJjZSB0eXBlIGluIGl0LiBTaW1wbHkgb2ZmZXIgdGhlIGxpc3Qgb2YgcG90ZW50aWFsCi0gICAgICAgICAgICAvLyByZXNvdXJjZSB0eXBlcy4KLQotICAgICAgICAgICAgZm9yIChSZXNvdXJjZVR5cGUgcmVzVHlwZSA6IHJlc1R5cGVzKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoIkAiICsgcmVzVHlwZS5nZXROYW1lKCkgKyAiLyIpOwotICAgICAgICAgICAgICAgIGlmIChyZXNUeXBlID09IFJlc291cmNlVHlwZS5JRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIG9mZmVyIHRoZSArIHZlcnNpb24gdG8gY3JlYXRlIGFuIGlkIGZyb20gc2NyYXRjaAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZCgiQCsiICsgcmVzVHlwZS5nZXROYW1lKCkgKyAiLyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBzdHlsZSBuYW1lIGFuZCBhIHJlcG9zaXRvcnkuIEZpbmQgYWxsIHJlc291cmNlcyB0aGF0IG1hdGNoIHRoaXMKLSAgICAgICAgICAgIC8vIHR5cGUgYW5kIHJlY3JlYXRlIHN1Z2dlc3Rpb25zIG91dCBvZiB0aGVtLgotCi0gICAgICAgICAgICBSZXNvdXJjZVR5cGUgcmVzVHlwZSA9IFJlc291cmNlVHlwZS5nZXRFbnVtKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXNUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ0AnKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LmluZGV4T2YoJysnKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnKycpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJhbmRyb2lkOiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQodHlwZU5hbWUpLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VJdGVtIGl0ZW0gOiByZXBvc2l0b3J5LmdldFJlc291cmNlcyhyZXNUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChiYXNlICsgaXRlbS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlTZXBhcmF0b3JBdHRyaWJ1dGVOb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpU2VwYXJhdG9yQXR0cmlidXRlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDIwMDYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlTZXBhcmF0b3JBdHRyaWJ1dGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5TZXBhcmF0b3JBdHRyaWJ1dGVEZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICoge0BsaW5rIFVpU2VwYXJhdG9yQXR0cmlidXRlTm9kZX0gZG9lcyBub3QgcmVwcmVzZW50IGFueSByZWFsIGF0dHJpYnV0ZS4KLSAqIDxwLz4KLSAqIEl0IGlzIHVzZWQgdG8gc2VwYXJhdGUgZ3JvdXBzIG9mIGF0dHJpYnV0ZXMgdmlzdWFsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBVaVNlcGFyYXRvckF0dHJpYnV0ZU5vZGUgZXh0ZW5kcyBVaUF0dHJpYnV0ZU5vZGUgewotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gbGlua2VkIHRvIGEgc3BlY2lmaWMge0BsaW5rIEF0dHJpYnV0ZURlc2NyaXB0b3J9ICovCi0gICAgcHVibGljIFVpU2VwYXJhdG9yQXR0cmlidXRlTm9kZShTZXBhcmF0b3JBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dHJEZXNjLAotICAgICAgICAgICAgVWlFbGVtZW50Tm9kZSB1aVBhcmVudCkgewotICAgICAgICBzdXBlcihhdHRyRGVzYywgdWlQYXJlbnQpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBub2RlLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFZhbHVlKCkgewotICAgICAgICAvLyBUaGVyZSBpcyBubyB2YWx1ZSBoZXJlLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBkaXJ0eSBhbmQgYWxzbyBub3RpZmllcyB0aGUgZWRpdG9yIHNvbWUgcGFydCdzIGRpcnR5Ci0gICAgICogZmxhZyBhcyBjaGFuZ2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBzZXQgdGhlIHRvIHRydWUgYXMgYSByZXN1bHQgb2YgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSB3aWRnZXRzIGluCi0gICAgICogdGhlIHNlY3Rpb24gYW5kIHRoZW4gc2hvdWxkIHNldCB0byBmYWxzZSB3aGVuIHRoZSBjb21taXQoKSBtZXRob2QgY29tcGxldGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gaXNEaXJ0eSkgewotICAgICAgICAvLyBUaGlzIGlzIG5ldmVyIGRpcnR5LgotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgb25jZSBieSB0aGUgcGFyZW50IHVzZXIgaW50ZXJmYWNlIHRvIGNyZWF0ZXMgdGhlIG5lY2Vzc2FyeQotICAgICAqIHVzZXIgaW50ZXJmYWNlIHRvIGVkaXQgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGxpZmUgY3ljbGUgb2YgYW4gVUkgbm9kZSwKLSAgICAgKiB0eXBpY2FsbHkgd2hlbiB0aGUgVUkgaXMgcGFydCBvZiBhIG1hc3Rlci1kZXRhaWwgdHJlZSwgYXMgcGFnZXMgYXJlIHN3YXBwZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgY29tcG9zaXRlIHdoZXJlIHRvIGNyZWF0ZSB0aGUgdXNlciBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIG1hbmFnZWRGb3JtIFRoZSBtYW5hZ2VkIGZvcm0gb3duaW5nIHRoaXMgcGFydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVVaUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0gICAgICAgIENvbXBvc2l0ZSByb3cgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgICAKLSAgICAgICAgVGFibGVXcmFwRGF0YSB0d2QgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBUYWJsZVdyYXBMYXlvdXQpIHsKLSAgICAgICAgICAgIHR3ZC5jb2xzcGFuID0gKChUYWJsZVdyYXBMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1uczsKLSAgICAgICAgfQotICAgICAgICByb3cuc2V0TGF5b3V0RGF0YSh0d2QpOwotICAgICAgICByb3cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlIC8qIGVxdWFsIHdpZHRoICovKSk7Ci0KLSAgICAgICAgTGFiZWwgc2VwID0gdG9vbGtpdC5jcmVhdGVTZXBhcmF0b3Iocm93LCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSAxNjsKLSAgICAgICAgc2VwLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChyb3csIGdldERlc2NyaXB0b3IoKS5nZXRYbWxMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICBzZXAgPSB0b29sa2l0LmNyZWF0ZVNlcGFyYXRvcihyb3csIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgc2VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBObyBjb21wbGV0aW9uIHZhbHVlcyBmb3IgdGhpcyBVSSBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIGlzIGJlaW5nIGxvYWRlZCBvciBoYXMgY2hhbmdlZCB0bwotICAgICAqIHVwZGF0ZSB0aGUgdmFsdWUgaGVsZCBieSB0aGlzIHVzZXIgaW50ZXJmYWNlIGF0dHJpYnV0ZSBub2RlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgWE1MIE5vZGUgPGVtPm1heTwvZW0+IGJlIG51bGwsIHdoaWNoIGRlbm90ZXMgdGhhdCB0aGUgYXR0cmlidXRlIGlzIG5vdAotICAgICAqIHNwZWNpZmllZCBpbiB0aGUgWE1MIG1vZGVsLiBJbiBnZW5lcmFsLCB0aGlzIG1lYW5zIHRoZSAiZGVmYXVsdCIgdmFsdWUgb2YgdGhlCi0gICAgICogYXR0cmlidXRlIHNob3VsZCBiZSB1c2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgY2FsbGVyIGRvZXNuJ3QgcmVhbGx5IGtub3cgaWYgYXR0cmlidXRlcyBoYXZlIGNoYW5nZWQsCi0gICAgICogc28gaXQgd2lsbCBjYWxsIHRoaXMgdG8gcmVmcmVzaCB0aGUgYXR0cmlidXRlIGFueXdheS4gSXQncyB1cCB0byB0aGUKLSAgICAgKiBVSSBpbXBsZW1lbnRhdGlvbiB0byBtaW5pbWl6ZSByZWZyZXNoZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhtbF9hdHRyaWJ1dGVfbm9kZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZhbHVlKE5vZGUgeG1sX2F0dHJpYnV0ZV9ub2RlKSB7Ci0gICAgICAgIC8vIE5vIHZhbHVlIHRvIHVwZGF0ZS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHVzZXIgaW50ZXJmYWNlIHdoZW4gdGhlIGVkaXRvciBpcyBzYXZlZCBvciBpdHMgc3RhdGUgY2hhbmdlZAotICAgICAqIGFuZCB0aGUgbW9kaWZpZWQgYXR0cmlidXRlcyBtdXN0IGJlIGNvbW1pdHRlZCAoaS5lLiB3cml0dGVuKSB0byB0aGUgWE1MIG1vZGVsLgotICAgICAqIDxwLz4KLSAgICAgKiBJbXBvcnRhbnQgYmVoYXZpb3JzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VGhlIGNhbGxlciAqbXVzdCogaGF2ZSBjYWxsZWQgSVN0cnVjdHVyZWRNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwgYmVmb3JlLgotICAgICAqICAgICBUaGUgaW1wbGVtZW50ZWQgbWV0aG9kcyBtdXN0IGFzc3VtZSBpdCBpcyBzYWZlIHRvIG1vZGlmeSB0aGUgWE1MIG1vZGVsLgotICAgICAqIDxsaT5PbiBzdWNjZXNzLCB0aGUgaW1wbGVtZW50YXRpb24gKm11c3QqIGNhbGwgc2V0RGlydHkoZmFsc2UpLgotICAgICAqIDxsaT5PbiBmYWlsdXJlLCB0aGUgaW1wbGVtZW50YXRpb24gY2FuIGZhaWwgd2l0aCBhbiBleGNlcHRpb24sIHdoaWNoCi0gICAgICogICAgIGlzIHRyYXBwZWQgYW5kIGxvZ2dlZCBieSB0aGUgY2FsbGVyLCBvciBkbyBub3RoaW5nLCB3aGljaGV2ZXIgaXMgbW9yZQotICAgICAqICAgICBhcHByb3ByaWF0ZS4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLSAgICAgICAgLy8gTm8gdmFsdWUgdG8gY29tbWl0LgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlUZXh0QXR0cmlidXRlTm9kZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaVRleHRBdHRyaWJ1dGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDk2YWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvdWltb2RlbC9VaVRleHRBdHRyaWJ1dGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWkuU2VjdGlvbkhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBYTUwgYXR0cmlidXRlIGluIHRoYXQgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGEgc2ltcGxlIHRleHQgZmllbGQKLSAqIGluIHRoZSBYTUwgZWRpdG9yJ3MgdXNlciBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiBUaGUgWE1MIGF0dHJpYnV0ZSBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4gV2hlbiB1bnNldCwgdGhlIHRleHQgZmllbGQgaXMgYmxhbmsuCi0gKiBXaGVuIHVwZGF0aW5nIHRoZSBYTUwsIGlmIHRoZSBmaWVsZCBpcyBlbXB0eSwgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQKLSAqIGZyb20gdGhlIFhNTCBlbGVtZW50LiAgCi0gKiA8cC8+Ci0gKiBTZWUge0BsaW5rIFVpQXR0cmlidXRlTm9kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVaVRleHRBdHRyaWJ1dGVOb2RlIGV4dGVuZHMgVWlBYnN0cmFjdFRleHRBdHRyaWJ1dGVOb2RlIHsKLQotICAgIC8qKiBUZXh0IGZpZWxkICovCi0gICAgcHJpdmF0ZSBUZXh0IG1UZXh0OwotICAgIC8qKiBUaGUgbWFuYWdlZCBmb3JtLCBzZXQgb25seSBvbmNlIGNyZWF0ZVVpQ29udHJvbCBoYXMgYmVlbiBjYWxsZWQuICovCi0gICAgcHJpdmF0ZSBJTWFuYWdlZEZvcm0gbU1hbmFnZWRGb3JtOwotCi0gICAgcHVibGljIFVpVGV4dEF0dHJpYnV0ZU5vZGUoQXR0cmlidXRlRGVzY3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBDcmVhdGVzIGEgbGFiZWwgd2lkZ2V0IGFuZCBhbiBhc3NvY2lhdGVkIHRleHQgZmllbGQuCi0gICAgICogPHAvPgotICAgICAqIEFzIG1vc3Qgb3RoZXIgcGFydHMgb2YgdGhlIGFuZHJvaWQgbWFuaWZlc3QgZWRpdG9yLCB0aGlzIGFzc3VtZXMgdGhlCi0gICAgICogcGFyZW50IHVzZXMgYSB0YWJsZSBsYXlvdXQgd2l0aCAyIGNvbHVtbnMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVWlDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBzZXRNYW5hZ2VkRm9ybShtYW5hZ2VkRm9ybSk7Ci0gICAgICAgIFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yIGRlc2MgPSAoVGV4dEF0dHJpYnV0ZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgVGV4dCB0ZXh0ID0gU2VjdGlvbkhlbHBlci5jcmVhdGVMYWJlbEFuZFRleHQocGFyZW50LCBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCksCi0gICAgICAgICAgICAgICAgZGVzYy5nZXRVaU5hbWUoKSwgZ2V0Q3VycmVudFZhbHVlKCksCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKGRlc2MuZ2V0VG9vbHRpcCgpKSk7Ci0KLSAgICAgICAgc2V0VGV4dFdpZGdldCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBObyBjb21wbGV0aW9uIHZhbHVlcyBmb3IgdGhpcyBVSSBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbnRlcm5hbCBtYW5hZ2VkIGZvcm0uCi0gICAgICogVGhpcyBpcyB1c3VhbGx5IHNldCBieSBjcmVhdGVVaUNvbnRyb2wuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlZEZvcm0oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0gICAgICAgICBtTWFuYWdlZEZvcm0gPSBtYW5hZ2VkRm9ybTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWFuYWdlZCBmb3JtLCBzZXQgb25seSBvbmNlIGNyZWF0ZVVpQ29udHJvbCBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElNYW5hZ2VkRm9ybSBnZXRNYW5hZ2VkRm9ybSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VkRm9ybTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1qYXZhIGRvYykKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBhdHRyaWJ1dGUgbm9kZSBpcyB2YWxpZCwgYW5kIGl0cyBVSSBoYXMgYmVlbiBjcmVhdGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGV4dCAhPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dFdpZGdldFZhbHVlKCkgewotICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1UZXh0LmdldFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dFdpZGdldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUZXh0IHdpZGdldCBvYmplY3QsIGFuZCBwcmVwYXJlcyBpdCB0byBoYW5kbGUgbW9kaWZpY2F0aW9uIGFuZCBzeW5jaHJvbml6YXRpb24KLSAgICAgKiB3aXRoIHRoZSBYTUwgbm9kZS4KLSAgICAgKiBAcGFyYW0gdGV4dFdpZGdldAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFRleHRXaWRnZXQoVGV4dCB0ZXh0V2lkZ2V0KSB7Ci0gICAgICAgIG1UZXh0ID0gdGV4dFdpZGdldDsKLSAKLSAgICAgICAgaWYgKHRleHRXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU2V0cyB0aGUgd2l0aCBoaW50IGZvciB0aGUgdGV4dCBmaWVsZC4gRGVyaXZlZCBjbGFzc2VzIGNhbiBhbHdheXMgb3ZlcnJpZGUgaXQuCi0gICAgICAgICAgICAvLyBUaGlzIGhlbHBzIHRoZSBncmlkIGxheW91dCB0byByZXNpemUgY29ycmVjdGx5IG9uIHNtYWxsZXIgc2NyZWVuIHNpemVzLgotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSB0ZXh0V2lkZ2V0LmdldExheW91dERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEdyaWREYXRhKSB7Ci0gICAgICAgICAgICAgICAgKChHcmlkRGF0YSlkYXRhKS53aWR0aEhpbnQgPSBBbmRyb2lkRWRpdG9yLlRFWFRfV0lEVEhfSElOVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFRhYmxlV3JhcERhdGEpIHsKLSAgICAgICAgICAgICAgICAoKFRhYmxlV3JhcERhdGEpZGF0YSkubWF4V2lkdGggPSAxMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBTZW50IHdoZW4gdGhlIHRleHQgaXMgbW9kaWZpZWQsIHdoZXRoZXIgYnkgdGhlIHVzZXIgdmlhIG1hbnVhbAotICAgICAgICAgICAgICAgICAqIGlucHV0IG9yIHByb2dyYW1tYXRpYyBpbnB1dCB2aWEgc2V0VGV4dCgpLgotICAgICAgICAgICAgICAgICAqIDxwLz4KLSAgICAgICAgICAgICAgICAgKiBTaW1wbHkgbWFyayB0aGUgYXR0cmlidXRlIGFzIGRpcnR5IGlmIGl0IHJlYWxseSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb250YWluZXIgU2VjdGlvblBhcnQgd2lsbCBjb2xsZWN0IHRoZXNlIGZsYWcgYW5kIG1hbmFnZSB0aGVtLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5JbnRlcm5hbFRleHRNb2RpZmljYXRpb24oKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0RpcnR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFZhbHVlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtVGV4dC5nZXRUZXh0KCkuZXF1YWxzKGdldEN1cnJlbnRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlydHkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVtb3ZlIHNlbGYtcmVmZXJlbmNlIHdoZW4gdGhlIHdpZGdldCBpcyBkaXNwb3NlZAotICAgICAgICAgICAgbVRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvbkFkZFZhbGlkYXRvcnMobVRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBhZnRlciB0aGUgdGV4dCB3aWRnZXQgYXMgYmVlbiBjcmVhdGVkLgotICAgICAqIDxwLz4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgdHlwaWNhbGx5IHdhbnQgdG86Ci0gICAgICogPGxpPiBDcmVhdGUgYSBuZXcge0BsaW5rIE1vZGlmeUxpc3RlbmVyfSBhbmQgYXR0YWNoIGl0IHRvIHRoZSBnaXZlbiB7QGxpbmsgVGV4dH0gd2lkZ2V0LgotICAgICAqIDxsaT4gSW4gdGhlIG1vZGlmeSBsaXN0ZW5lciwgY2FsbCBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZSgpCi0gICAgICogICAgICBhbmQgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UoKSBhcyBuZWNlc3NhcnkuCi0gICAgICogPGxpPiBDYWxsIHJlbW92ZU1lc3NhZ2UgaW4gYSBuZXcgdGV4dC5hZGREaXNwb3NlTGlzdGVuZXIuCi0gICAgICogPGxpPiBDYWxsIHRoZSB2YWxpZGF0b3Igb25jZSB0byBzZXR1cCB0aGUgaW5pdGlhbCBtZXNzYWdlcyBhcyBuZWVkZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGV4dCBUaGUge0BsaW5rIFRleHR9IHdpZGdldCB0byB2YWxpZGF0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkFkZFZhbGlkYXRvcnMoVGV4dCB0ZXh0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCB3aWRnZXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFRleHQgZ2V0VGV4dFdpZGdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlUZXh0VmFsdWVOb2RlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy91aW1vZGVsL1VpVGV4dFZhbHVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZhOWZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3VpbW9kZWwvVWlUZXh0VmFsdWVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuVGV4dFZhbHVlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIFhNTCBlbGVtZW50IHZhbHVlIGluIHRoYXQgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGEgc2ltcGxlIHRleHQgZmllbGQKLSAqIGluIHRoZSBYTUwgZWRpdG9yJ3MgdXNlciBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBVaVRleHRWYWx1ZU5vZGUgZXh0ZW5kcyBVaVRleHRBdHRyaWJ1dGVOb2RlIHsKLQotICAgIHB1YmxpYyBVaVRleHRWYWx1ZU5vZGUoVGV4dFZhbHVlRGVzY3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yLCBVaUVsZW1lbnROb2RlIHVpUGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKGF0dHJpYnV0ZURlc2NyaXB0b3IsIHVpUGFyZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHRleHQgZmllbGQncyB2YWx1ZSB3aGVuIHRoZSBYTUwgaGFzIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgZG9lc24ndCByZWFsbHkga25vdyBpZiB2YWx1ZSBvZiB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZCwKLSAgICAgKiBzbyBpdCB3aWxsIGNhbGwgdGhpcyB0byByZWZyZXNoIHRoZSB2YWx1ZSBhbnl3YXkuIFRoZSB2YWx1ZQotICAgICAqIGlzIG9ubHkgc2V0IGlmIGl0IGhhcyBjaGFuZ2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFsc28gcmVzZXRzIHRoZSAiZGlydHkiIGZsYWcuCi0gICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZShOb2RlIHhtbF9hdHRyaWJ1dGVfbm9kZSkgewotICAgICAgICBzZXRDdXJyZW50VmFsdWUoREVGQVVMVF9WQUxVRSk7Ci0KLSAgICAgICAgLy8gVGhlIGFyZ3VtZW50IHhtbF9hdHRyaWJ1dGVfbm9kZSBpcyBub3QgdXNlZCBoZXJlLiBJdCBzaG91bGQgYWx3YXlzIGJlCi0gICAgICAgIC8vIG51bGwgc2luY2UgdGhpcyBpcyBub3QgYW4gYXR0cmlidXRlLiBXaGF0IHdlIHdhbnQgaXMgdGhlICJ0ZXh0IHZhbHVlIiBvZgotICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQsIHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBmaXJzdCB0ZXh0IG5vZGUgb2YgdGhlIGVsZW1lbnQuCi0gICAgICAgIAotICAgICAgICBVaUVsZW1lbnROb2RlIHBhcmVudCA9IGdldFVpUGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZSB4bWxfbm9kZSA9IHBhcmVudC5nZXRYbWxOb2RlKCk7Ci0gICAgICAgICAgICBpZiAoeG1sX25vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoTm9kZSB4bWxfY2hpbGQgPSB4bWxfbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbF9jaGlsZCAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB4bWxfY2hpbGQgPSB4bWxfY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sX2NoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRWYWx1ZSh4bWxfY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNWYWxpZCgpICYmICFnZXRUZXh0V2lkZ2V0VmFsdWUoKS5lcXVhbHMoZ2V0Q3VycmVudFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldEluSW50ZXJuYWxUZXh0TW9kaWZpY2F0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIHNldFRleHRXaWRnZXRWYWx1ZShnZXRDdXJyZW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RGlydHkoZmFsc2UpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzZXRJbkludGVybmFsVGV4dE1vZGlmaWNhdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLWphdmEgZG9jKQotICAgICAqIENhbGxlZCBieSB0aGUgdXNlciBpbnRlcmZhY2Ugd2hlbiB0aGUgZWRpdG9yIGlzIHNhdmVkIG9yIGl0cyBzdGF0ZSBjaGFuZ2VkCi0gICAgICogYW5kIHRoZSBtb2RpZmllZCAiYXR0cmlidXRlcyIgbXVzdCBiZSBjb21taXR0ZWQgKGkuZS4gd3JpdHRlbikgdG8gdGhlIFhNTCBtb2RlbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0gICAgICAgIFVpRWxlbWVudE5vZGUgcGFyZW50ID0gZ2V0VWlQYXJlbnQoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIGlzVmFsaWQoKSAmJiBpc0RpcnR5KCkpIHsKLSAgICAgICAgICAgIC8vIEdldCAob3IgY3JlYXRlKSB0aGUgdW5kZXJseWluZyBYTUwgZWxlbWVudCBub2RlIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlLgotICAgICAgICAgICAgTm9kZSBlbGVtZW50ID0gcGFyZW50LnByZXBhcmVDb21taXQoKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRUZXh0V2lkZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIHRleHQgY2hpbGQgdG8gdXBkYXRlLgotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZm9yIChOb2RlIHhtbF9jaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sX2NoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxfY2hpbGQgPSB4bWxfY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sX2NoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9jaGlsZC5zZXROb2RlVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgdGV4dCBjaGlsZCB0byB1cGRhdGUsIHdlIG5lZWQgdG8gY3JlYXRlIG9uZS4KLSAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2V0Q3VycmVudFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXREaXJ0eShmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMveG1sL1htbENvbnRlbnRBc3Npc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9YbWxDb250ZW50QXNzaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMGIyNTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMveG1sL1htbENvbnRlbnRBc3Npc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZENvbnRlbnRBc3Npc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkVGFyZ2V0RGF0YTsKLQotLyoqCi0gKiBDb250ZW50IEFzc2lzdCBQcm9jZXNzb3IgZm9yIC9yZXMveG1sIFhNTCBmaWxlcwotICovCi1jbGFzcyBYbWxDb250ZW50QXNzaXN0IGV4dGVuZHMgQW5kcm9pZENvbnRlbnRBc3Npc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIExheW91dENvbnRlbnRBc3Npc3QgCi0gICAgICovCi0gICAgcHVibGljIFhtbENvbnRlbnRBc3Npc3QoKSB7Ci0gICAgICAgIHN1cGVyKEFuZHJvaWRUYXJnZXREYXRhLkRFU0NSSVBUT1JfWE1MKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy94bWwvWG1sRWRpdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy94bWwvWG1sRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTZjOGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMveG1sL1htbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMueG1sOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5BbmRyb2lkRWRpdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkZpcnN0RWxlbWVudFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5Eb2N1bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaURvY3VtZW50Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIE11bHRpLXBhZ2UgZm9ybSBlZGl0b3IgZm9yIC9yZXMveG1sIFhNTCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFhtbEVkaXRvciBleHRlbmRzIEFuZHJvaWRFZGl0b3IgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBBbmRyb2lkQ29uc3RhbnRzLkVESVRPUlNfTkFNRVNQQUNFICsgIi54bWwuWG1sRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFJvb3Qgbm9kZSBvZiB0aGUgVUkgZWxlbWVudCBoaWVyYXJjaHkgKi8KLSAgICBwcml2YXRlIFVpRG9jdW1lbnROb2RlIG1VaVJvb3ROb2RlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9ybSBlZGl0b3IgZm9yIHJlc291cmNlcyBYTUwgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIFhtbEVkaXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIFVJIGVsZW1lbnQgaGllcmFyY2h5LCB3aGljaCBoZXJlCi0gICAgICogaXMgdGhlIGRvY3VtZW50IG5vZGUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVpRG9jdW1lbnROb2RlIGdldFVpUm9vdE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtVWlSb290Tm9kZTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIFN0YXRpYyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIGZpbGUgdGhhdCB0aGlzIHtAbGluayBYbWxFZGl0b3J9IGNhbiBoYW5kbGUuCi0gICAgICogPHAvPgotICAgICAqIFRoZSB7QGxpbmsgWG1sRWRpdG9yfSBjYW4gaGFuZGxlIFhNTCBmaWxlcyB0aGF0IGhhdmUgYSA8c2VhcmNoYWJsZT4gb3IKLSAgICAgKiA8UHJlZmVyZW5jZXM+IHJvb3QgWE1MIGVsZW1lbnQgd2l0aCB0aGUgYWRlcXVhdGUgeG1sbnM6YW5kcm9pZCBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHtAbGluayBYbWxFZGl0b3J9IGNhbiBoYW5kbGUgdGhhdCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5IYW5kbGVGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0aGUgdGFyZ2V0IG9mIHRoZSBmaWxlJ3MgcHJvamVjdCB0byBhY2Nlc3MgdGhlIGRlc2NyaXB0b3JzLgotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KHByb2plY3QpOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB0YXJnZXQgZGF0YSBjYW4gYmUgbnVsbCB3aGVuIGFuIFNESyBpcyBub3QgZmluaXNoZWQgbG9hZGluZyB5ZXQuCi0gICAgICAgICAgICAvLyBXZSBjYW4gcG90ZW50aWFsbHkgYXJyaXZlIGhlcmUgd2hlbiBFY2xpcHNlIGlzIHN0YXJ0ZWQgd2l0aCBhIGZpbGUgcHJldmlvdXNseQotICAgICAgICAgICAgLy8gb3BlbiBhbmQgdGhlIHJlc291cmNlIGdldHMgcmVmcmVzaGVkIC0tIGF0IHRoYXQgcG9pbnQgd2UgbWF5IG5vdCBoYXZlIHRoZSBTREsgeWV0LgotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOwotCi0gICAgICAgICAgICBGaXJzdEVsZW1lbnRQYXJzZXIuUmVzdWx0IHJlc3VsdCA9IEZpcnN0RWxlbWVudFBhcnNlci5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiBkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc3VsdC5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiByZXN1bHQuZ2V0WG1sbnNQcmVmaXgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50RGVzY3JpcHRvciBkZXNjID0gZGF0YS5nZXRYbWxEZXNjcmlwdG9ycygpLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBlbGVtIDogZGVzYy5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRYbWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBlbGVtZW50IHRoYXQgdGhpcyBkb2N1bWVudCBjYW4gaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBCYXNlIENsYXNzIE92ZXJyaWRlcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlICJzYXZlIGFzIiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgZWRpdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBTYXZlLUFzIGlzIGEgdmFsaWQgb3BlcmF0aW9uIGZvciB0aGUgTWFuaWZlc3RFZGl0b3Igc2luY2UgaXQgYWN0cyBvbiBhCi0gICAgICogc2luZ2xlIHNvdXJjZSBmaWxlLgotICAgICAqCi0gICAgICogQHNlZSBJRWRpdG9yUGFydAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YXJpb3VzIGZvcm0gcGFnZXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybVBhZ2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkUGFnZShuZXcgWG1sVHJlZVBhZ2UodGhpcykpOwotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJFcnJvciBjcmVhdGluZyBuZXN0ZWQgcGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIChub24tamF2YSBkb2MpCi0gICAgICogQ2hhbmdlIHRoZSB0YWIvdGl0bGUgbmFtZSB0byBpbmNsdWRlIHRoZSBwcm9qZWN0IG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLSAgICAgICAgICAgIHNldFBhcnROYW1lKFN0cmluZy5mb3JtYXQoIiUxJHMiLCBmaWxlLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBuZXcgWE1MIE1vZGVsLCB3aGljaCBYTUwgcm9vdCBub2RlIGlzIGdpdmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbF9kb2MgVGhlIFhNTCBkb2N1bWVudCwgaWYgYXZhaWxhYmxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHhtbE1vZGVsQ2hhbmdlZChEb2N1bWVudCB4bWxfZG9jKSB7Ci0gICAgICAgIC8vIGluaXQgdGhlIHVpIHJvb3Qgb24gZGVtYW5kCi0gICAgICAgIGluaXRVaVJvb3ROb2RlKGZhbHNlIC8qZm9yY2UqLyk7Ci0KLSAgICAgICAgbVVpUm9vdE5vZGUubG9hZEZyb21YbWxOb2RlKHhtbF9kb2MpOwotCi0gICAgICAgIHN1cGVyLnhtbE1vZGVsQ2hhbmdlZCh4bWxfZG9jKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBpbml0aWFsIFVJIFJvb3QgTm9kZSwgaW5jbHVkaW5nIHRoZSBrbm93biBtYW5kYXRvcnkgZWxlbWVudHMuCi0gICAgICogQHBhcmFtIGZvcmNlIGlmIHRydWUsIGEgbmV3IFVpUm9vdE5vZGUgaXMgcmVjcmVhdGVkIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFVpUm9vdE5vZGUoYm9vbGVhbiBmb3JjZSkgewotICAgICAgICAvLyBUaGUgcm9vdCBVSSBub2RlIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmIHRoZXJlJ3Mgbm8gY29ycmVzcG9uZGluZyBYTUwgbm9kZS4KLSAgICAgICAgaWYgKG1VaVJvb3ROb2RlID09IG51bGwgfHwgZm9yY2UpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVVpUm9vdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvYyA9IG1VaVJvb3ROb2RlLmdldFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0IGRhdGEgZnJvbSB0aGUgb3BlbmVkIGZpbGUgKGFuZCBpdHMgcHJvamVjdCkKLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBnZXRUYXJnZXREYXRhKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50RGVzY3JpcHRvciBkZXNjOwotICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgRG9jdW1lbnREZXNjcmlwdG9yKCJ0ZW1wIiwgbnVsbCAvKmNoaWxkcmVuKi8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZGF0YS5nZXRYbWxEZXNjcmlwdG9ycygpLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVpUm9vdE5vZGUgPSAoVWlEb2N1bWVudE5vZGUpIGRlc2MuY3JlYXRlVWlOb2RlKCk7Ci0gICAgICAgICAgICBtVWlSb290Tm9kZS5zZXRFZGl0b3IodGhpcyk7Ci0KLSAgICAgICAgICAgIG9uRGVzY3JpcHRvcnNDaGFuZ2VkKGRvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tIExvY2FsIE1ldGhvZHMgLS0tLQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkcyB0aGUgVUkgbWFuaWZlc3Qgbm9kZSBmcm9tIHRoZSBYTUwsIGFuZCBjYWxscyB0aGUgcGFnZXMgdG8gdXBkYXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkRlc2NyaXB0b3JzQ2hhbmdlZChEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVVpUm9vdE5vZGUubG9hZEZyb21YbWxOb2RlKGRvY3VtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VaVJvb3ROb2RlLnJlbG9hZEZyb21YbWxOb2RlKG1VaVJvb3ROb2RlLmdldFhtbE5vZGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9YbWxTb3VyY2VWaWV3ZXJDb25maWcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9YbWxTb3VyY2VWaWV3ZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNDNlZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy94bWwvWG1sU291cmNlVmlld2VyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnhtbDsKLQotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZzsKLQotLyoqCi0gKiBTb3VyY2UgVmlld2VyIENvbmZpZ3VyYXRpb24gdGhhdCBjYWxscyBpbiBYbWxDb250ZW50QXNzaXN0LgotICovCi1wdWJsaWMgY2xhc3MgWG1sU291cmNlVmlld2VyQ29uZmlnIGV4dGVuZHMgQW5kcm9pZFNvdXJjZVZpZXdlckNvbmZpZyB7Ci0KLSAgICBwdWJsaWMgWG1sU291cmNlVmlld2VyQ29uZmlnKCkgewotICAgICAgICBzdXBlcihuZXcgWG1sQ29udGVudEFzc2lzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy94bWwvWG1sVHJlZVBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9YbWxUcmVlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI0NjYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9YbWxUcmVlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy54bWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnVpLnRyZWUuVWlUcmVlQmxvY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotLyoqCi0gKiBQYWdlIGZvciB0aGUgeG1sIGZvcm0gZWRpdG9yLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sVHJlZVBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0gICAgLyoqIFBhZ2UgaWQgdXNlZCBmb3Igc3dpdGNoaW5nIHRhYnMgcHJvZ3JhbW1hdGljYWxseSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfSUQgPSAieG1sX3RyZWVfcGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBDb250YWluZXIgZWRpdG9yICovCi0gICAgWG1sRWRpdG9yIG1FZGl0b3I7Ci0KLSAgICBwdWJsaWMgWG1sVHJlZVBhZ2UoWG1sRWRpdG9yIGVkaXRvcikgewotICAgICAgICBzdXBlcihlZGl0b3IsIFBBR0VfSUQsICJTdHJ1Y3R1cmUiKTsgIC8vIHRhYidzIGxhYmVsLCBrZWVwIGl0IHNob3J0Ci0gICAgICAgIG1FZGl0b3IgPSBlZGl0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudCBpbiB0aGUgZm9ybSBob3N0ZWQgaW4gdGhpcyBwYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VkRm9ybSB0aGUgZm9ybSBob3N0ZWQgaW4gdGhpcyBwYWdlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotICAgICAgICBzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0gICAgICAgIFNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotICAgICAgICBmb3JtLnNldFRleHQoIkFuZHJvaWQgWG1sIik7Ci0gICAgICAgIGZvcm0uc2V0SW1hZ2UoQWR0UGx1Z2luLmdldEFuZHJvaWRMb2dvKCkpOwotCi0gICAgICAgIFVpRWxlbWVudE5vZGUgcm9vdE5vZGUgPSBtRWRpdG9yLmdldFVpUm9vdE5vZGUoKTsKLSAgICAgICAgVWlUcmVlQmxvY2sgYmxvY2sgPSBuZXcgVWlUcmVlQmxvY2sobUVkaXRvciwgcm9vdE5vZGUsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdXRvQ3JlYXRlUm9vdCAqLywKLSAgICAgICAgICAgICAgICBudWxsIC8qIG5vIGVsZW1lbnQgZmlsdGVycyAqLywKLSAgICAgICAgICAgICAgICAiWG1sIEVsZW1lbnRzIiwKLSAgICAgICAgICAgICAgICAiTGlzdCBvZiBhbGwgeG1sIGVsZW1lbnRzIGluIHRoaXMgWE1MIGZpbGUuIik7Ci0gICAgICAgIGJsb2NrLmNyZWF0ZUNvbnRlbnQobWFuYWdlZEZvcm0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3htbC9kZXNjcmlwdG9ycy9YbWxEZXNjcmlwdG9ycy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMveG1sL2Rlc2NyaXB0b3JzL1htbERlc2NyaXB0b3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTNiZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMveG1sL2Rlc2NyaXB0b3JzL1htbERlc2NyaXB0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy54bWwuZGVzY3JpcHRvcnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRG9jdW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLklEZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuU2VwYXJhdG9yQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5YbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzLlZpZXdFbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuVmlld0NsYXNzSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uIG9mIHRoZSAvcmVzL3htbCBzdHJ1Y3R1cmUuCi0gKiBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIDxzZWFyY2hhYmxlPiBhbmQgPHByZWZlcmVuY2VzPiByb290IG5vZGVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sRGVzY3JpcHRvcnMgaW1wbGVtZW50cyBJRGVzY3JpcHRvclByb3ZpZGVyIHsKLQotICAgIC8vIFB1YmxpYyBhdHRyaWJ1dGVzIG5hbWVzLCBhdHRyaWJ1dGVzIGRlc2NyaXB0b3JzIGFuZCBlbGVtZW50cyBkZXNjcmlwdG9ycyByZWZlcmVuY2VkCi0gICAgLy8gZWxzZXdoZXJlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfS0VZX0FUVFIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFRoZSByb290IGRvY3VtZW50IGRlc2NyaXB0b3IgZm9yIGJvdGggc2VhcmNoYWJsZSBhbmQgcHJlZmVyZW5jZXMuICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudERlc2NyaXB0b3IgbURlc2NyaXB0b3IgPSBuZXcgRG9jdW1lbnREZXNjcmlwdG9yKCJ4bWxfZG9jIiwgbnVsbCAvKiBjaGlsZHJlbiAqLyk7IC8vJE5PTi1OTFMtMSQgCi0KLSAgICAvKiogVGhlIHJvb3QgZG9jdW1lbnQgZGVzY3JpcHRvciBmb3Igc2VhcmNoYWJsZS4gKi8KLSAgICBwcml2YXRlIERvY3VtZW50RGVzY3JpcHRvciBtU2VhcmNoRGVzY3JpcHRvciA9IG5ldyBEb2N1bWVudERlc2NyaXB0b3IoInhtbF9kb2MiLCBudWxsIC8qIGNoaWxkcmVuICovKTsgLy8kTk9OLU5MUy0xJCAKLQotICAgIC8qKiBUaGUgcm9vdCBkb2N1bWVudCBkZXNjcmlwdG9yIGZvciBwcmVmZXJlbmNlcy4gKi8KLSAgICBwcml2YXRlIERvY3VtZW50RGVzY3JpcHRvciBtUHJlZkRlc2NyaXB0b3IgPSBuZXcgRG9jdW1lbnREZXNjcmlwdG9yKCJ4bWxfZG9jIiwgbnVsbCAvKiBjaGlsZHJlbiAqLyk7IC8vJE5PTi1OTFMtMSQgCi0KLSAgICAvKiogVGhlIHJvb3QgZG9jdW1lbnQgZGVzY3JpcHRvciBmb3Igd2lkZ2V0IHByb3ZpZGVyLiAqLwotICAgIHByaXZhdGUgRG9jdW1lbnREZXNjcmlwdG9yIG1BcHBXaWRnZXREZXNjcmlwdG9yID0gbmV3IERvY3VtZW50RGVzY3JpcHRvcigieG1sX2RvYyIsIG51bGwgLyogY2hpbGRyZW4gKi8pOyAvLyROT04tTkxTLTEkIAotCi0gICAgLyoqIEByZXR1cm4gdGhlIHJvb3QgZGVzY3JpcHRvciBmb3IgYm90aCBzZWFyY2hhYmxlIGFuZCBwcmVmZXJlbmNlcy4gKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yW10gZ2V0Um9vdEVsZW1lbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yLmdldENoaWxkcmVuKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBAcmV0dXJuIHRoZSByb290IGRlc2NyaXB0b3IgZm9yIHNlYXJjaGFibGUuICovCi0gICAgcHVibGljIERvY3VtZW50RGVzY3JpcHRvciBnZXRTZWFyY2hhYmxlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZWFyY2hEZXNjcmlwdG9yOwotICAgIH0KLSAgICAKLSAgICAvKiogQHJldHVybiB0aGUgcm9vdCBkZXNjcmlwdG9yIGZvciBwcmVmZXJlbmNlcy4gKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREZXNjcmlwdG9yIGdldFByZWZlcmVuY2VzRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1QcmVmRGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEByZXR1cm4gdGhlIHJvb3QgZGVzY3JpcHRvciBmb3Igd2lkZ2V0IHByb3ZpZGVycy4gKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREZXNjcmlwdG9yIGdldEFwcFdpZGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQXBwV2lkZ2V0RGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElEZXNjcmlwdG9yUHJvdmlkZXIgZ2V0U2VhcmNoYWJsZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IElEZXNjcmlwdG9yUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgRWxlbWVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlYXJjaERlc2NyaXB0b3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvcltdIGdldFJvb3RFbGVtZW50RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZWFyY2hEZXNjcmlwdG9yLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIElEZXNjcmlwdG9yUHJvdmlkZXIgZ2V0UHJlZmVyZW5jZXNQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJRGVzY3JpcHRvclByb3ZpZGVyKCkgewotICAgICAgICAgICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QcmVmRGVzY3JpcHRvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yW10gZ2V0Um9vdEVsZW1lbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByZWZEZXNjcmlwdG9yLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIElEZXNjcmlwdG9yUHJvdmlkZXIgZ2V0QXBwV2lkZ2V0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSURlc2NyaXB0b3JQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwV2lkZ2V0RGVzY3JpcHRvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yW10gZ2V0Um9vdEVsZW1lbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcFdpZGdldERlc2NyaXB0b3IuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBkb2N1bWVudCBkZXNjcmlwdG9yLgotICAgICAqIDxwLz4KLSAgICAgKiBJdCBmaXJzdCBjb21wdXRlcyB0aGUgbmV3IGNoaWxkcmVuIG9mIHRoZSBkZXNjcmlwdG9yIGFuZCB0aGVuIHVwZGF0ZXMgdGhlbQotICAgICAqIGFsbCBhdCBvbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hhYmxlU3R5bGVNYXAgVGhlIG1hcCBzdHlsZT0+YXR0cmlidXRlcyBmb3IgPHNlYXJjaGFibGU+IGZyb20gdGhlIGF0dHJzLnhtbCBmaWxlCi0gICAgICogQHBhcmFtIGFwcFdpZGdldFN0eWxlTWFwIFRoZSBtYXAgc3R5bGU9PmF0dHJpYnV0ZXMgZm9yIDxhcHB3aWRnZXQtcHJvdmlkZXI+IGZyb20gdGhlIGF0dHJzLnhtbCBmaWxlCi0gICAgICogQHBhcmFtIHByZWZzIFRoZSBsaXN0IG9mIG5vbi1ncm91cCBwcmVmZXJlbmNlIGRlc2NyaXB0aW9ucyAKLSAgICAgKiBAcGFyYW0gcHJlZkdyb3VwcyBUaGUgbGlzdCBvZiBwcmVmZXJlbmNlIGdyb3VwIGRlc2NyaXB0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBzZWFyY2hhYmxlU3R5bGVNYXAsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gYXBwV2lkZ2V0U3R5bGVNYXAsCi0gICAgICAgICAgICBWaWV3Q2xhc3NJbmZvW10gcHJlZnMsIFZpZXdDbGFzc0luZm9bXSBwcmVmR3JvdXBzKSB7Ci0KLSAgICAgICAgWG1sbnNBdHRyaWJ1dGVEZXNjcmlwdG9yIHhtbG5zID0gbmV3IFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAiYW5kcm9pZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTKTsgCi0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3Igc2VhcmNoYWJsZSA9IGNyZWF0ZVNlYXJjaGFibGUoc2VhcmNoYWJsZVN0eWxlTWFwLCB4bWxucyk7Ci0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGFwcFdpZGdldCA9IGNyZWF0ZUFwcFdpZGdldFByb3ZpZGVySW5mbyhhcHBXaWRnZXRTdHlsZU1hcCwgeG1sbnMpOwotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBwcmVmZXJlbmNlcyA9IGNyZWF0ZVByZWZlcmVuY2UocHJlZnMsIHByZWZHcm91cHMsIHhtbG5zKTsKLSAgICAgICAgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPiBsaXN0ID0gIG5ldyBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+KCk7Ci0gICAgICAgIGlmIChzZWFyY2hhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHNlYXJjaGFibGUpOwotICAgICAgICAgICAgbVNlYXJjaERlc2NyaXB0b3Iuc2V0Q2hpbGRyZW4obmV3IEVsZW1lbnREZXNjcmlwdG9yW117IHNlYXJjaGFibGUgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcFdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChhcHBXaWRnZXQpOwotICAgICAgICAgICAgbUFwcFdpZGdldERlc2NyaXB0b3Iuc2V0Q2hpbGRyZW4obmV3IEVsZW1lbnREZXNjcmlwdG9yW117IGFwcFdpZGdldCB9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5hZGQocHJlZmVyZW5jZXMpOwotICAgICAgICAgICAgbVByZWZEZXNjcmlwdG9yLnNldENoaWxkcmVuKG5ldyBFbGVtZW50RGVzY3JpcHRvcltdeyBwcmVmZXJlbmNlcyB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLnNldENoaWxkcmVuKGxpc3QudG9BcnJheShuZXcgRWxlbWVudERlc2NyaXB0b3JbbGlzdC5zaXplKCldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDcmVhdGlvbiBvZiA8c2VhcmNoYWJsZT4KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXcgRWxlbWVudERlc2NyaXB0b3IgZm9yIDxzZWFyY2hhYmxlPgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgY3JlYXRlU2VhcmNoYWJsZSgKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBzZWFyY2hhYmxlU3R5bGVNYXAsCi0gICAgICAgICAgICBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IgeG1sbnMpIHsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBhY3Rpb25fa2V5ID0gY3JlYXRlRWxlbWVudChzZWFyY2hhYmxlU3R5bGVNYXAsCi0gICAgICAgICAgICAgICAgIlNlYXJjaGFibGVBY3Rpb25LZXkiLCAvLyROT04tTkxTLTEkIHN0eWxlTmFtZQotICAgICAgICAgICAgICAgICJhY3Rpb25rZXkiLCAvLyROT04tTkxTLTEkIHhtbE5hbWUKLSAgICAgICAgICAgICAgICAiQWN0aW9uIEtleSIsIC8vIHVpTmFtZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNkayB1cmwKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBleHRyYUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIGNoaWxkcmVuRWxlbWVudHMKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8gKTsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBzZWFyY2hhYmxlID0gY3JlYXRlRWxlbWVudChzZWFyY2hhYmxlU3R5bGVNYXAsCi0gICAgICAgICAgICAgICAgIlNlYXJjaGFibGUiLCAvLyROT04tTkxTLTEkIHN0eWxlTmFtZQotICAgICAgICAgICAgICAgICJzZWFyY2hhYmxlIiwgLy8kTk9OLU5MUy0xJCB4bWxOYW1lCi0gICAgICAgICAgICAgICAgIlNlYXJjaGFibGUiLCAvLyB1aU5hbWUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzZGsgdXJsCi0gICAgICAgICAgICAgICAgeG1sbnMsIC8vIGV4dHJhQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10geyBhY3Rpb25fa2V5IH0sIC8vIGNoaWxkcmVuRWxlbWVudHMKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8gKTsKLSAgICAgICAgcmV0dXJuIHNlYXJjaGFibGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyBFbGVtZW50RGVzY3JpcHRvciBmb3IgPGFwcHdpZGdldC1wcm92aWRlcj4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIGNyZWF0ZUFwcFdpZGdldFByb3ZpZGVySW5mbygKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBhcHBXaWRnZXRTdHlsZU1hcCwKLSAgICAgICAgICAgIFhtbG5zQXR0cmlidXRlRGVzY3JpcHRvciB4bWxucykgewotCi0gICAgICAgIGlmIChhcHBXaWRnZXRTdHlsZU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgYXBwV2lkZ2V0ID0gY3JlYXRlRWxlbWVudChhcHBXaWRnZXRTdHlsZU1hcCwKLSAgICAgICAgICAgICAgICAiQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIiwgLy8kTk9OLU5MUy0xJCBzdHlsZU5hbWUKLSAgICAgICAgICAgICAgICAiYXBwd2lkZ2V0LXByb3ZpZGVyIiwgLy8kTk9OLU5MUy0xJCB4bWxOYW1lCi0gICAgICAgICAgICAgICAgIkFwcFdpZGdldCBQcm92aWRlciIsIC8vIHVpTmFtZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNkayB1cmwKLSAgICAgICAgICAgICAgICB4bWxucywgLy8gZXh0cmFBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBjaGlsZHJlbkVsZW1lbnRzCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogbWFuZGF0b3J5ICovICk7Ci0gICAgICAgIHJldHVybiBhcHBXaWRnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBFbGVtZW50RGVzY3JpcHRvciBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBoZXJlCi0gICAgICogYW5kIHRoZSBqYXZhZG9jICYgYXR0cmlidXRlcyBleHRyYWN0ZWQgZnJvbSB0aGUgc3R5bGUgbWFwIGlmIGFueS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIGNyZWF0ZUVsZW1lbnQoCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gc3R5bGVNYXAsIFN0cmluZyBzdHlsZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgeG1sTmFtZSwgU3RyaW5nIHVpTmFtZSwgU3RyaW5nIHNka1VybCwKLSAgICAgICAgICAgIEF0dHJpYnV0ZURlc2NyaXB0b3IgZXh0cmFBdHRyaWJ1dGUsCi0gICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvcltdIGNoaWxkcmVuRWxlbWVudHMsIGJvb2xlYW4gbWFuZGF0b3J5KSB7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudCA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcih4bWxOYW1lLCB1aU5hbWUsIG51bGwsIHNka1VybCwKLSAgICAgICAgICAgICAgICBudWxsLCBjaGlsZHJlbkVsZW1lbnRzLCBtYW5kYXRvcnkpOwotCi0gICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KGVsZW1lbnQsIHN0eWxlTWFwLCBzdHlsZU5hbWUsIGV4dHJhQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFuIEVsZW1lbnREZXNjcmlwdG9yIHdpdGggdGhlIGphdmFkb2MgJiBhdHRyaWJ1dGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHlsZQotICAgICAqIG1hcCBpZiBhbnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciB1cGRhdGVFbGVtZW50KEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnQsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gc3R5bGVNYXAsCi0gICAgICAgICAgICBTdHJpbmcgc3R5bGVOYW1lLAotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvciBleHRyYUF0dHJpYnV0ZSkgewotICAgICAgICBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4gZGVzY3MgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZURlc2NyaXB0b3I+KCk7Ci0KLSAgICAgICAgRGVjbGFyZVN0eWxlYWJsZUluZm8gc3R5bGUgPSBzdHlsZU1hcCAhPSBudWxsID8gc3R5bGVNYXAuZ2V0KHN0eWxlTmFtZSkgOiBudWxsOwotICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGVzKGRlc2NzLAotICAgICAgICAgICAgICAgICAgICBudWxsLCAgIC8vIGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLmdldEF0dHJpYnV0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAvLyByZXF1aXJlZEF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7ICAvLyBvdmVycmlkZXMKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0VG9vbHRpcChzdHlsZS5nZXRKYXZhRG9jKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NzLmFkZChleHRyYUF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZXMoZGVzY3MudG9BcnJheShuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltkZXNjcy5zaXplKCldKSk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDcmVhdGlvbiBvZiA8UHJlZmVyZW5jZXM+Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3IEVsZW1lbnREZXNjcmlwdG9yIGZvciA8UHJlZmVyZW5jZXM+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciBjcmVhdGVQcmVmZXJlbmNlKFZpZXdDbGFzc0luZm9bXSBwcmVmcywKLSAgICAgICAgICAgIFZpZXdDbGFzc0luZm9bXSBwcmVmR3JvdXBzLCBYbWxuc0F0dHJpYnV0ZURlc2NyaXB0b3IgeG1sbnMpIHsKLQotICAgICAgICBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IG5ld1ByZWZzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50RGVzY3JpcHRvcj4oKTsKLSAgICAgICAgaWYgKHByZWZzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoVmlld0NsYXNzSW5mbyBpbmZvIDogcHJlZnMpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gY29udmVydFByZWYoaW5mbyk7Ci0gICAgICAgICAgICAgICAgbmV3UHJlZnMuYWRkKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgdG9wUHJlZmVyZW5jZXMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPiBuZXdHcm91cHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBpZiAocHJlZkdyb3VwcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFZpZXdDbGFzc0luZm8gaW5mbyA6IHByZWZHcm91cHMpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0gY29udmVydFByZWYoaW5mbyk7Ci0gICAgICAgICAgICAgICAgbmV3R3JvdXBzLmFkZChkZXNjKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRDYW5vbmljYWxDbGFzc05hbWUoKSA9PSBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1BSRUZFUkVOQ0VTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvcFByZWZlcmVuY2VzID0gZGVzYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8RWxlbWVudERlc2NyaXB0b3I+IGV2ZXJ5dGhpbmcgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnREZXNjcmlwdG9yPigpOwotICAgICAgICBldmVyeXRoaW5nLmFkZEFsbChuZXdHcm91cHMpOwotICAgICAgICBldmVyeXRoaW5nLmFkZEFsbChuZXdQcmVmcyk7Ci0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yW10gbmV3QXJyYXkgPSBldmVyeXRoaW5nLnRvQXJyYXkobmV3IEVsZW1lbnREZXNjcmlwdG9yW2V2ZXJ5dGhpbmcuc2l6ZSgpXSk7Ci0KLSAgICAgICAgLy8gTGluayBhbGwgZ3JvdXBzIHRvIGV2ZXJ5dGhpbmcgZWxzZSBoZXJlLi4gcmVjdXJzaXZlbHkKLSAgICAgICAgZm9yIChFbGVtZW50RGVzY3JpcHRvciBsYXlvdXREZXNjIDogbmV3R3JvdXBzKSB7Ci0gICAgICAgICAgICBsYXlvdXREZXNjLnNldENoaWxkcmVuKG5ld0FycmF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSAidG9wIiBlbGVtZW50IHRvIGJlIHJldHVybmVkIGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFzcyAiUHJlZmVyZW5jZXMiLgotICAgICAgICAvLyBJdHMgZGVzY3JpcHRvciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuIEhvd2V2ZXIgdGhlIHJvb3Qgb25lIGFsc28gbmVlZHMKLSAgICAgICAgLy8gdGhlIGhpZGRlbiB4bWxuczphbmRyb2lkIGRlZmluaXRpb24uLgotICAgICAgICBpZiAodG9wUHJlZmVyZW5jZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIGF0dHJzID0gdG9wUHJlZmVyZW5jZXMuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgQXR0cmlidXRlRGVzY3JpcHRvcltdIG5ld0F0dHJzID0gbmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbYXR0cnMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGF0dHJzLCAwLCBuZXdBdHRycywgMCwgYXR0cnMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0F0dHJzW2F0dHJzLmxlbmd0aF0gPSB4bWxuczsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudERlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgIHRvcFByZWZlcmVuY2VzLmdldFhtbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdG9wUHJlZmVyZW5jZXMuZ2V0VWlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHRvcFByZWZlcmVuY2VzLmdldFRvb2x0aXAoKSwKLSAgICAgICAgICAgICAgICAgICAgdG9wUHJlZmVyZW5jZXMuZ2V0U2RrVXJsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ld0F0dHJzLAotICAgICAgICAgICAgICAgICAgICB0b3BQcmVmZXJlbmNlcy5nZXRDaGlsZHJlbigpLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBtYW5kYXRvcnkgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgZGVzY3JpcHRvciBmcm9tIGEgZ2l2ZW4ge0BsaW5rIFZpZXdDbGFzc0luZm99LgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IgY29udmVydFByZWYoVmlld0NsYXNzSW5mbyBpbmZvKSB7Ci0gICAgICAgIFN0cmluZyB4bWxfbmFtZSA9IGluZm8uZ2V0U2hvcnRDbGFzc05hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRvb2x0aXAgPSBpbmZvLmdldEphdmFEb2MoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFByb2Nlc3MgYWxsIFByZWZlcmVuY2UgYXR0cmlidXRlcwotICAgICAgICBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgbnVsbCwgICAvLyBlbGVtZW50TmFtZQotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgaW5mby5nZXRBdHRyaWJ1dGVzKCksCi0gICAgICAgICAgICAgICAgbnVsbCwgICAvLyByZXF1aXJlZEF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBudWxsKTsgIC8vIG92ZXJyaWRlcwotICAgICAgICAKLSAgICAgICAgZm9yIChWaWV3Q2xhc3NJbmZvIGxpbmsgPSBpbmZvLmdldFN1cGVyQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBsaW5rICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgbGluayA9IGxpbmsuZ2V0U3VwZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVJbmZvW10gYXR0ckxpc3QgPSBsaW5rLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChhdHRyTGlzdC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IFNlcGFyYXRvckF0dHJpYnV0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJBdHRyaWJ1dGVzIGZyb20gJTEkcyIsIGxpbmsuZ2V0U2hvcnRDbGFzc05hbWUoKSkpKTsgCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5hcHBlbmRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgIC8vIGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgIC8vIHJlcXVpcmVkQXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7ICAvLyBvdmVycmlkZXMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgVmlld0VsZW1lbnREZXNjcmlwdG9yKHhtbF9uYW1lLAotICAgICAgICAgICAgICAgIHhtbF9uYW1lLCAvLyB1aV9uYW1lCi0gICAgICAgICAgICAgICAgaW5mby5nZXRDYW5vbmljYWxDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICB0b29sdGlwLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNka191cmwKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEF0dHJpYnV0ZURlc2NyaXB0b3JbYXR0cmlidXRlcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogbWFuZGF0b3J5ICovKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FNUmVjZWl2ZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQU1SZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzlhMjViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQU1SZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2g7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTXVsdGlMaW5lUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLQotLyoqCi0gKiBPdXRwdXQgcmVjZWl2ZXIgZm9yIGFtIHByb2Nlc3MgKEFjdGl2aXR5IE1hbmFnZXIpCi0gKiAKLSAqIE1vbml0b3JzIGFkYiBvdXRwdXQgZm9yIGFtIGVycm9ycywgYW5kIHJldHJpZXMgbGF1bmNoIGFzIGFwcHJvcHJpYXRlLiAKLSAqLwotcHVibGljIGNsYXNzIEFNUmVjZWl2ZXIgZXh0ZW5kcyBNdWx0aUxpbmVSZWNlaXZlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FUVEVNUFRfQ09VTlQgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0FtRXJyb3JUeXBlID0gUGF0dGVybi5jb21waWxlKCJFcnJvciB0eXBlIChcXGQrKSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIERlbGF5ZWRMYXVuY2hJbmZvIG1MYXVuY2hJbmZvOwotICAgIHByaXZhdGUgZmluYWwgSURldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgZmluYWwgSUxhdW5jaENvbnRyb2xsZXIgbUxhdW5jaENvbnRyb2xsZXI7Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyB0aGUge0BsaW5rIERlbGF5ZWRMYXVuY2hJbmZvfSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtIHByb2Nlc3MuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgQW5kcm9pZCBkZXZpY2Ugb24gd2hpY2ggdGhlIGxhdW5jaCBpcyBkb25lLgotICAgICAqIEBwYXJhbSBsYXVuY2hDb250cm9sbGVyIHRoZSB7QGxpbmsgSUxhdW5jaENvbnRyb2xsZXJ9IHRoYXQgaXMgbWFuYWdpbmcgdGhlIGxhdW5jaAotICAgICAqLwotICAgIHB1YmxpYyBBTVJlY2VpdmVyKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sIElEZXZpY2UgZGV2aWNlLCAKLSAgICAgICAgICAgIElMYXVuY2hDb250cm9sbGVyIGxhdW5jaENvbnRyb2xsZXIpIHsKLSAgICAgICAgbUxhdW5jaEluZm8gPSBsYXVuY2hJbmZvOwotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBtTGF1bmNoQ29udHJvbGxlciA9IGxhdW5jaENvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW9uaXRvcnMgdGhlIGFtIHByb2Nlc3MgZm9yIGVycm9yIG1lc3NhZ2VzLiBJZiBhbiBlcnJvciBvY2N1cnMsIHdpbGwgcmVhdHRlbXB0IGxhdW5jaCB1cCB0bwotICAgICAqIDxjb2RlPk1BWF9BVFRFTVBUX0NPVU5UPC9jb2RlPiB0aW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGluZXMgYSBwb3J0aW9uIG9mIHRoZSBhbSBvdXRwdXQKLSAgICAgKiAKLSAgICAgKiBAc2VlIE11bHRpTGluZVJlY2VpdmVyI3Byb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3TGluZXMoU3RyaW5nW10gbGluZXMpIHsKLSAgICAgICAgLy8gZmlyc3Qgd2UgY2hlY2sgaWYgb25lIHN0YXJ0cyB3aXRoIGVycm9yCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB3YXJuaW5nID0gZmFsc2U7Ci0gICAgICAgIGZvciAoU3RyaW5nIHMgOiBsaW5lcykgewotICAgICAgICAgICAgLy8gaWdub3JlIGVtcHR5IGxpbmVzLgotICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgZXJyb3JzIHRoYXQgb3V0cHV0IGFuIGVycm9yIHR5cGUsIGlmIHRoZSBhdHRlbXB0IGNvdW50IGlzIHN0aWxsCi0gICAgICAgICAgICAvLyB2YWxpZC4gSWYgbm90IHRoZSB3aG9sZSB0ZXh0IHdpbGwgYmUgb3V0cHV0IGluIHRoZSBjb25zb2xlCi0gICAgICAgICAgICBpZiAobUxhdW5jaEluZm8uZ2V0QXR0ZW1wdENvdW50KCkgPCBNQVhfQVRURU1QVF9DT1VOVCAmJgotICAgICAgICAgICAgICAgICAgICBtTGF1bmNoSW5mby5pc0NhbmNlbGxlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gc0FtRXJyb3JUeXBlLm1hdGNoZXIocyk7Ci0gICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZXJyb3IgdHlwZQotICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdhaXRUaW1lID0gMzsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZzsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlbmRlZCBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRldmljZSBub3QgcmVhZHkuIFdhaXRpbmcgJTEkZCBzZWNvbmRzIGJlZm9yZSBuZXh0IGF0dGVtcHQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ldyBwYWNrYWdlIG5vdCB5ZXQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzeXN0ZW0uIFdhaXRpbmcgJTEkZCBzZWNvbmRzIGJlZm9yZSBuZXh0IGF0dGVtcHQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXZpY2Ugbm90IHJlYWR5ICglMiRkKS4gV2FpdGluZyAlMSRkIHNlY29uZHMgYmVmb3JlIG5leHQgYXR0ZW1wdC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWUsIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShtTGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbGF1bmNoIGFub3RoZXIgdGhyZWFkLCB0aGF0IHdhaXRzIGEgYml0IGFuZCBhdHRlbXB0cyBhbm90aGVyIGxhdW5jaAotICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCJEZWxheWVkIExhdW5jaCBhdHRlbXB0IikgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAod2FpdFRpbWUgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXVuY2hDb250cm9sbGVyLmxhdW5jaEFwcChtTGF1bmNoSW5mbywgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0uc3RhcnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHBhcnNlIHRoZSByZXN0Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBlcnJvciBpZiBuZWVkZWQKLSAgICAgICAgICAgIGlmIChlcnJvciA9PSBmYWxzZSAmJiBzLnN0YXJ0c1dpdGgoIkVycm9yOiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2FybmluZyA9PSBmYWxzZSAmJiBzLnN0YXJ0c1dpdGgoIldhcm5pbmc6IikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHdhcm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGxpbmUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgIGFycmF5LmFkZCgiQWN0aXZpdHlNYW5hZ2VyOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZW4gd2UgZGlzcGxheSB0aGVtIGluIHRoZSBjb25zb2xlCi0gICAgICAgIGlmICh3YXJuaW5nIHx8IGVycm9yKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShtTGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIGFycmF5LnRvQXJyYXkoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobUxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBhcnJheS50b0FycmF5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgZXJyb3IgdGhlbiB3ZSBjYW5jZWwgdGhlIGxhdW5jaCwgYW5kIHJlbW92ZSB0aGUgZGVsYXllZCBpbmZvCi0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgbUxhdW5jaENvbnRyb2xsZXIuc3RvcExhdW5jaChtTGF1bmNoSW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgbGF1bmNoIGhhcyBiZWVuIGNhbmNlbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICByZXR1cm4gbUxhdW5jaEluZm8uaXNDYW5jZWxsZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FjdGl2aXR5TGF1bmNoQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FjdGl2aXR5TGF1bmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTAyZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9BY3Rpdml0eUxhdW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogTGF1bmNoZXMgdGhlIGdpdmVuIGFjdGl2aXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxhdW5jaEFjdGlvbiBpbXBsZW1lbnRzIElBbmRyb2lkTGF1bmNoQWN0aW9uIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BY3Rpdml0eTsKLSAgICBwcml2YXRlIGZpbmFsIElMYXVuY2hDb250cm9sbGVyIG1MYXVuY2hDb250cm9sbGVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEFjdGl2aXR5TGF1bmNoQWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aXZpdHkgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUgdG8gbGF1bmNoCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgdGhlIHtAbGluayBJTGF1bmNoQ29udHJvbGxlcn0gdGhhdCBwZXJmb3JtcyBsYXVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aXZpdHlMYXVuY2hBY3Rpb24oU3RyaW5nIGFjdGl2aXR5LCBJTGF1bmNoQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OwotICAgICAgICBtTGF1bmNoQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgdGhlIGFjdGl2aXR5IG9uIHRhcmdldGVkIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gdGhlIHtAbGluayBEZWxheWVkTGF1bmNoSW5mb30gdGhhdCBjb250YWlucyBsYXVuY2ggZGV0YWlscwotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIEFuZHJvaWQgZGV2aWNlIHRvIHBlcmZvcm0gYWN0aW9uIG9uCi0gICAgICoKLSAgICAgKiBAc2VlIElBbmRyb2lkTGF1bmNoQWN0aW9uI2RvTGF1bmNoQWN0aW9uKERlbGF5ZWRMYXVuY2hJbmZvLCBJRGV2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvTGF1bmNoQWN0aW9uKERlbGF5ZWRMYXVuY2hJbmZvIGluZm8sIElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiU3RhcnRpbmcgYWN0aXZpdHkgJTEkcyBvbiBkZXZpY2UgIiwgbUFjdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGluZm8uZ2V0UHJvamVjdCgpLCBtc2cpOwotCi0gICAgICAgICAgICAvLyBJbiBkZWJ1ZyBtb2RlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgaW5mbyB0byB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBtb25pdG9yaW5nCi0gICAgICAgICAgICAvLyBjbGllbnQgY2hhbmdlcy4KLSAgICAgICAgICAgIC8vIGluY3JlbWVudCBsYXVuY2ggYXR0ZW1wdCBjb3VudCwgdG8gaGFuZGxlIHJldHJpZXMgYW5kIHRpbWVvdXRzCi0gICAgICAgICAgICBpbmZvLmluY3JlbWVudEF0dGVtcHRDb3VudCgpOwotCi0gICAgICAgICAgICAvLyBub3cgd2UgYWN0dWFsbHkgbGF1bmNoIHRoZSBhcHAuCi0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgKyAoaW5mby5pc0RlYnVnTW9kZSgpID8gIiAtRCIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgKyAiIC1uICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICArIGluZm8uZ2V0UGFja2FnZU5hbWUoKSArICIvIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICsgbUFjdGl2aXR5LnJlcGxhY2VBbGwoIlxcJCIsICJcXFxcXFwkIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICsgIiAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgKyAiIC1jIGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3IEFNUmVjZWl2ZXIoaW5mbywgZGV2aWNlLCBtTGF1bmNoQ29udHJvbGxlcikpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgYXBwIGlzIG5vdCBhIGRlYnVnIGFwcCwgd2UgbmVlZCB0byBkbyBzb21lIGNsZWFuIHVwLCBhcwotICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgZG9uZSEKLSAgICAgICAgICAgIGlmIChpbmZvLmlzRGVidWdNb2RlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9wIHRoZSBsYXVuY2ggb2JqZWN0LCBzaW5jZSB0aGVyZSdzIG5vIGRlYnVnLCBhbmQgaXQgY2FuJ3QKLSAgICAgICAgICAgICAgICAvLyBwcm92aWRlIGFueSBjb250cm9sIG92ZXIgdGhlIGFwcAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcgdHJ5aW5nIHRvIGxhdW5jaCB0aGUgYXBwLgotICAgICAgICAgICAgLy8gbGV0cyBzdG9wIHRoZSBMYXVuY2gKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJMYXVuY2ggZXJyb3I6ICVzIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGl2aXR5IGJlaW5nIGxhdW5jaGVkCi0gICAgICoKLSAgICAgKiBAc2VlIElBbmRyb2lkTGF1bmNoQWN0aW9uI2dldExhdW5jaERlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaERlc2NyaXB0aW9uKCkgewotICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzIGFjdGl2aXR5IGxhdW5jaCIsIG1BY3Rpdml0eSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FuZHJvaWRMYXVuY2guamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQW5kcm9pZExhdW5jaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJjMTMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQW5kcm9pZExhdW5jaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5MYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU291cmNlTG9jYXRvcjsKLQotLyoqCi0gKiBDdXN0b20gaW1wbGVtZW50YXRpb24gb2YgTGF1bmNoIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgTGF1bmNoTWFuYWdlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEFuZHJvaWRMYXVuY2ggZXh0ZW5kcyBMYXVuY2ggewotCi0gICAgLyoqCi0gICAgICogQmFzaWMgY29uc3RydWN0b3IgZG9lcyBub3RoaW5nIHNwZWNpYWwKLSAgICAgKiBAcGFyYW0gbGF1bmNoQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogQHBhcmFtIGxvY2F0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZExhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwKLSAgICAgICAgICAgIElTb3VyY2VMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgc3VwZXIobGF1bmNoQ29uZmlndXJhdGlvbiwgbW9kZSwgbG9jYXRvcik7Ci0gICAgfQotCi0gICAgLyoqIFN0b3BzIHRoZSBsYXVuY2gsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGxhdW5jaCBtYW5hZ2VyICovCi0gICAgcHVibGljIHZvaWQgc3RvcExhdW5jaCgpIHsKLSAgICAgICAgSUxhdW5jaE1hbmFnZXIgbWdyID0gZ2V0TGF1bmNoTWFuYWdlcigpOwotCi0gICAgICAgIGlmIChjYW5UZXJtaW5hdGUoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0ZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZWxsIGxvb2tzIGxpa2Ugd2UgY291bGRuJ3Qgc3RvcCBpdC4gbm90aGluZyBlbHNlIHRvIGJlCi0gICAgICAgICAgICAgICAgLy8gZG9uZSByZWFsbHkKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgdGhlIGxhdW5jaAotICAgICAgICBtZ3IucmVtb3ZlTGF1bmNoKHRoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMmM1OS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FuZHJvaWRMYXVuY2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBMYXVuY2ggY29uZmlndXJhdGlvbiBkYXRhLiBUaGlzIHN0b3JlcyB0aGUgcmVzdWx0IG9mIHF1ZXJ5aW5nIHRoZQotICoge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9ufSBzbyB0aGF0IGl0J3Mgb25seSBkb25lIG9uY2UuIAotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24gewotICAgIAotICAgIC8qKgotICAgICAqIExhdW5jaCBhY3Rpb24uIFNlZSB7QGxpbmsgTGF1bmNoQ29uZmlnRGVsZWdhdGUjQUNUSU9OX0RFRkFVTFR9LAotICAgICAqIHtAbGluayBMYXVuY2hDb25maWdEZWxlZ2F0ZSNBQ1RJT05fQUNUSVZJVFl9LAotICAgICAqIHtAbGluayBMYXVuY2hDb25maWdEZWxlZ2F0ZSNBQ1RJT05fRE9fTk9USElOR30KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1MYXVuY2hBY3Rpb24gPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX0xBVU5DSF9BQ1RJT047Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGFyZ2V0IHNlbGVjdGlvbiBtb2RlIGZvciB0aGUgY29uZmlndXJhdGlvbjogZWl0aGVyIHtAbGluayAjQVVUT30gb3Ige0BsaW5rICNNQU5VQUx9LgotICAgICAqLwotICAgIHB1YmxpYyBlbnVtIFRhcmdldE1vZGUgewotICAgICAgICAvKiogQXV0b21hdGljIHRhcmdldCBzZWxlY3Rpb24gbW9kZS4gKi8KLSAgICAgICAgQVVUTyh0cnVlKSwKLSAgICAgICAgLyoqIE1hbnVhbCB0YXJnZXQgc2VsZWN0aW9uIG1vZGUuICovCi0gICAgICAgIE1BTlVBTChmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVZhbHVlOwotCi0gICAgICAgIFRhcmdldE1vZGUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICAgICAgbVZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBUYXJnZXRNb2RlIGdldE1vZGUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChUYXJnZXRNb2RlIG1vZGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlLm1WYWx1ZSA9PSB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRhcmdldCBzZWxlY3Rpb24gbW9kZS4KLSAgICAgKiBAc2VlIFRhcmdldE1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFyZ2V0TW9kZSBtVGFyZ2V0TW9kZSA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfVEFSR0VUX01PREU7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW11bGF0b3Igc2hvdWxkIGJlIGNhbGxlZCB3aXRoIC13aXBlLWRhdGEKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtV2lwZURhdGEgPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1dJUEVfREFUQTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbXVsYXRvciBzaG91bGQgYmUgY2FsbGVkIHdpdGggLW5vLWJvb3QtYW5pbQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1Ob0Jvb3RBbmltID0gTGF1bmNoQ29uZmlnRGVsZWdhdGUuREVGQVVMVF9OT19CT09UX0FOSU07Ci0gICAgCi0gICAgLyoqCi0gICAgICogQVZEIE5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBtQXZkTmFtZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBtTmV0d29ya1NwZWVkID0gRW11bGF0b3JDb25maWdUYWIuZ2V0U3BlZWQoCi0gICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1NQRUVEKTsKLSAgICBwdWJsaWMgU3RyaW5nIG1OZXR3b3JrRGVsYXkgPSBFbXVsYXRvckNvbmZpZ1RhYi5nZXREZWxheSgKLSAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfREVMQVkpOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwgY3VzdG9tIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgdG8gbGF1bmNoIHRoZSBlbXVsYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbUVtdWxhdG9yQ29tbWFuZExpbmU7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplZCB0aGUgc3RydWN0dXJlIGZyb20gYW4gSUxhdW5jaENvbmZpZ3VyYXRpb24gb2JqZWN0LgotICAgICAqIEBwYXJhbSBjb25maWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTGF1bmNoQWN0aW9uID0gY29uZmlnLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0xBVU5DSF9BQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgIG1MYXVuY2hBY3Rpb24pOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZSwgd2UnbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9UQVJHRVRfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldE1vZGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBtVGFyZ2V0TW9kZSA9IFRhcmdldE1vZGUuZ2V0TW9kZSh2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BdmROYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0FWRF9OQU1FLCBtQXZkTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1NQRUVEOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5kZXggPSBjb25maWcuZ2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfU1BFRUQsIGluZGV4KTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZSwgd2UnbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgIH0KLSAgICAgICAgbU5ldHdvcmtTcGVlZCA9IEVtdWxhdG9yQ29uZmlnVGFiLmdldFNwZWVkKGluZGV4KTsKLQotICAgICAgICBpbmRleCA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfREVMQVk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbmRleCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9ERUxBWSwgaW5kZXgpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlLCB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgfQotICAgICAgICBtTmV0d29ya0RlbGF5ID0gRW11bGF0b3JDb25maWdUYWIuZ2V0RGVsYXkoaW5kZXgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtRW11bGF0b3JDb21tYW5kTGluZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQ09NTUFORExJTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGxldHMgbm90IGRvIGFueXRoaW5nIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1XaXBlRGF0YSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9XSVBFX0RBVEEsIG1XaXBlRGF0YSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Ob0Jvb3RBbmltID0gY29uZmlnLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX05PX0JPT1RfQU5JTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9Cb290QW5pbSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FuZHJvaWRMYXVuY2hDb250cm9sbGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0FuZHJvaWRMYXVuY2hDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjBjNmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9BbmRyb2lkTGF1bmNoQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2g7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklDbGllbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnREYXRhLkRlYnVnZ2VyU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5BbmRyb2lkTGF1bmNoQ29uZmlndXJhdGlvbi5UYXJnZXRNb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guRGVsYXllZExhdW5jaEluZm8uSW5zdGFsbFJldHJ5TW9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkRldmljZUNob29zZXJEaWFsb2cuRGV2aWNlQ2hvb3NlclJlc3BvbnNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BcGtJbnN0YWxsTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnMuQXZkTWFuYWdlckFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLk51bGxTZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdVSVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogQ29udHJvbHMgdGhlIGxhdW5jaCBvZiBBbmRyb2lkIGFwcGxpY2F0aW9uIGVpdGhlciBvbiBhIGRldmljZSBvciBvbiB0aGUKLSAqIGVtdWxhdG9yLiBJZiBhbiBlbXVsYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRoaXMgY2xhc3Mgd2lsbCBhdHRlbXB0IHRvIHJldXNlCi0gKiBpdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyIGltcGxlbWVudHMgSURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciwgSUNsaWVudENoYW5nZUxpc3RlbmVyLCBJTGF1bmNoQ29udHJvbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19BVkQgPSAiLWF2ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ORVRERUxBWSA9ICItbmV0ZGVsYXkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTkVUU1BFRUQgPSAiLW5ldHNwZWVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1dJUEVfREFUQSA9ICItd2lwZS1kYXRhIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PX0JPT1RfQU5JTSA9ICItbm8tYm9vdC1hbmltIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogTWFwIHRvIHN0b3JlIHtAbGluayBJTGF1bmNoQ29uZmlndXJhdGlvbn0gb2JqZWN0cyB0aGF0IG11c3QgYmUgbGF1bmNoZWQgYXMgc2ltcGxlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBydW5uaW5nIGFwcGxpY2F0aW9uLiBUaGUgaW50ZWdlciBpcyB0aGUgcG9ydCBvbiB3aGljaCB0byBjb25uZWN0LgotICAgICAqIDxiPkFMTCBBQ0NFU1MgTVVTVCBCRSBJTlNJREUgQSA8Y29kZT5zeW5jaHJvbml6ZWQgKHNMaXN0TG9jayk8L2NvZGU+IGJsb2NrITwvYj4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPElMYXVuY2hDb25maWd1cmF0aW9uLCBJbnRlZ2VyPiBzUnVubmluZ0FwcE1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPElMYXVuY2hDb25maWd1cmF0aW9uLCBJbnRlZ2VyPigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMaXN0TG9jayA9IHNSdW5uaW5nQXBwTWFwOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiB7QGxpbmsgRGVsYXllZExhdW5jaEluZm99IHdhaXRpbmcgZm9yIGFuIGVtdWxhdG9yIHRvIGNvbm5lY3QuCi0gICAgICogPHA+T25jZSBhbiBlbXVsYXRvciBoYXMgY29ubmVjdGVkLCB7QGxpbmsgRGVsYXllZExhdW5jaEluZm8jZ2V0RGV2aWNlKCl9IGlzIHNldCBhbmQgdGhlCi0gICAgICogRGVsYXllZExhdW5jaEluZm8gb2JqZWN0IGlzIG1vdmVkIHRvCi0gICAgICoge0BsaW5rIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyI21XYWl0aW5nRm9yUmVhZHlFbXVsYXRvckxpc3R9LgotICAgICAqIDxiPkFMTCBBQ0NFU1MgTVVTVCBCRSBJTlNJREUgQSA8Y29kZT5zeW5jaHJvbml6ZWQgKHNMaXN0TG9jayk8L2NvZGU+IGJsb2NrITwvYj4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4gbVdhaXRpbmdGb3JFbXVsYXRvckxhdW5jaGVzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4oKTsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgYXBwbGljYXRpb24gd2FpdGluZyB0byBiZSBsYXVuY2hlZCBvbiBhIGRldmljZS9lbXVsYXRvci48YnI+Ci0gICAgICogPGI+QUxMIEFDQ0VTUyBNVVNUIEJFIElOU0lERSBBIDxjb2RlPnN5bmNocm9uaXplZCAoc0xpc3RMb2NrKTwvY29kZT4gYmxvY2shPC9iPgotICAgICAqICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RGVsYXllZExhdW5jaEluZm8+IG1XYWl0aW5nRm9yUmVhZHlFbXVsYXRvckxpc3QgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PERlbGF5ZWRMYXVuY2hJbmZvPigpOwotCi0gICAgLyoqCi0gICAgICogQXBwbGljYXRpb24gd2FpdGluZyB0byBzaG93IHVwIGFzIHdhaXRpbmcgZm9yIGRlYnVnZ2VyLgotICAgICAqIDxiPkFMTCBBQ0NFU1MgTVVTVCBCRSBJTlNJREUgQSA8Y29kZT5zeW5jaHJvbml6ZWQgKHNMaXN0TG9jayk8L2NvZGU+IGJsb2NrITwvYj4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4gbVdhaXRpbmdGb3JEZWJ1Z2dlckFwcGxpY2F0aW9ucyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8RGVsYXllZExhdW5jaEluZm8+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIGNsaWVudHMgdGhhdCBoYXZlIGFwcGVhcmVkIGFzIHdhaXRpbmcgZm9yIGRlYnVnZ2VyIGJlZm9yZSB0aGVpciBuYW1lIHdhcyBhdmFpbGFibGUuCi0gICAgICogPGI+QUxMIEFDQ0VTUyBNVVNUIEJFIElOU0lERSBBIDxjb2RlPnN5bmNocm9uaXplZCAoc0xpc3RMb2NrKTwvY29kZT4gYmxvY2shPC9iPgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudD4gbVVua25vd25DbGllbnRzV2FpdGluZ0ZvckRlYnVnZ2VyID0gbmV3IEFycmF5TGlzdDxDbGllbnQ+KCk7Ci0KLSAgICAvKiogc3RhdGljIGluc3RhbmNlIGZvciBzaW5nbGV0b24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbmRyb2lkTGF1bmNoQ29udHJvbGxlciBzVGhpcyA9IG5ldyBBbmRyb2lkTGF1bmNoQ29udHJvbGxlcigpOwotCi0gICAgLyoqIHByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5mb3JjZSBzaW5nbGV0b24gKi8KLSAgICBwcml2YXRlIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyKCkgewotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuYWRkRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLmFkZERldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuYWRkQ2xpZW50Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhIHJlbW90ZSBqYXZhIGRlYnVnZ2luZyBzZXNzaW9uIG9uIGFuIGFscmVhZHkgcnVubmluZyBhcHBsaWNhdGlvbgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB0byBkZWJ1Zy4KLSAgICAgKiBAcGFyYW0gZGVidWdQb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3QgdGhlIGRlYnVnZ2VyIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1J1bm5pbmdBcHAoSVByb2plY3QgcHJvamVjdCwgaW50IGRlYnVnUG9ydCkgewotICAgICAgICAvLyBnZXQgYW4gZXhpc3Rpbmcgb3IgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IEFuZHJvaWRMYXVuY2hDb250cm9sbGVyLmdldExhdW5jaENvbmZpZyhwcm9qZWN0KTsKLQotICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFBvcnRMYXVuY2hDb25maWdBc3NvY2lhdGlvbihjb25maWcsIGRlYnVnUG9ydCk7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBsYXVuY2gKLSAgICAgICAgICAgIERlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4ge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9ufSBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgSVByb2plY3R9LgotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIDxjb2RlPklMYXVuY2hDb25maWd1cmF0aW9uPC9jb2RlPiBvciBudWxsIGlmIHRoZXJlIHdhcwotICAgICAqIGFuIGVycm9yIHdoZW4gY3JlYXRpbmcgYSBuZXcgb25lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlnKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBsYXVuY2ggbWFuYWdlcgotICAgICAgICBJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQotICAgICAgICAvLyBub3cgZ2V0IHRoZSBjb25maWcgdHlwZSBmb3Igb3VyIHBhcnRpY3VsYXIgYW5kcm9pZCB0eXBlLgotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IG1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5BTkRST0lEX0xBVU5DSF9UWVBFX0lEKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIHNlYXJjaCBmb3IgYW4gZXhpc3RpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZmluZENvbmZpZyhtYW5hZ2VyLCBjb25maWdUeXBlLCBuYW1lKTsKLQotICAgICAgICAvLyB0ZXN0IGlmIHdlIGZvdW5kIG9uZSBvciBub3QKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBEaWRuJ3QgZmluZCBhIG1hdGNoaW5nIGNvbmZpZywgc28gd2UgbWFrZSBvbmUuCi0gICAgICAgICAgICAvLyBJdCdsbCBiZSBtYWRlIGluIHRoZSAid29ya2luZyBjb3B5IiBvYmplY3QgZmlyc3QuCi0gICAgICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSB3b3JraW5nIGNvcHkgb2JqZWN0Ci0gICAgICAgICAgICAgICAgd2MgPSBjb25maWdUeXBlLm5ld0luc3RhbmNlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKG5hbWUpKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcHJvamVjdCBuYW1lCi0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGxhdW5jaCBtb2RlIHRvIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfTEFVTkNIX0FDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfTEFVTkNIX0FDVElPTik7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCB0YXJnZXQgbW9kZQotICAgICAgICAgICAgICAgIHdjLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX1RBUkdFVF9NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgTGF1bmNoQ29uZmlnRGVsZWdhdGUuREVGQVVMVF9UQVJHRVRfTU9ERS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgQVZEOiBOb25lCi0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQVZEX05BTUUsIChTdHJpbmcpIG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IG5ldHdvcmsgc3BlZWQKLSAgICAgICAgICAgICAgICB3Yy5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfU1BFRUQpOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIGRlbGF5Ci0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX0RFTEFZKTsKLQotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgd2lwZSBkYXRhIG1vZGUKLSAgICAgICAgICAgICAgICB3Yy5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9XSVBFX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1dJUEVfREFUQSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGRpc2FibGUgYm9vdCBhbmltYXRpb24gb3B0aW9uCi0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfTk9fQk9PVF9BTklNLAotICAgICAgICAgICAgICAgICAgICAgICAgTGF1bmNoQ29uZmlnRGVsZWdhdGUuREVGQVVMVF9OT19CT09UX0FOSU0pOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgZW11bGF0b3Igb3B0aW9ucwotICAgICAgICAgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbXVPcHRpb25zID0gc3RvcmUuZ2V0U3RyaW5nKEFkdFBsdWdpbi5QUkVGU19FTVVfT1BUSU9OUyk7Ci0gICAgICAgICAgICAgICAgd2Muc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQ09NTUFORExJTkUsIGVtdU9wdGlvbnMpOwotCi0gICAgICAgICAgICAgICAgLy8gbWFwIHRoZSBjb25maWcgYW5kIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgd2Muc2V0TWFwcGVkUmVzb3VyY2VzKGdldFJlc291cmNlc1RvTWFwKHByb2plY3QpKTsKLQotICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHdvcmtpbmcgY29weSB0byBnZXQgdGhlIGxhdW5jaCBjb25maWcgb2JqZWN0IHdoaWNoIHdlIHJldHVybi4KLSAgICAgICAgICAgICAgICByZXR1cm4gd2MuZG9TYXZlKCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgYSBMYXVuY2ggY29uZmlnIGZvciBwcm9qZWN0ICclMSRzJzogJTIkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldE5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBubyBsYXVuY2ghCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIG1hcCB0byBhIExhdW5jaCBDb25maWd1cmF0aW9uLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgdG8gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlW10gZ2V0UmVzb3VyY2VzVG9NYXAoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBBcnJheUxpc3Q8SVJlc291cmNlPiBhcnJheSA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigyKTsKLSAgICAgICAgYXJyYXkuYWRkKHByb2plY3QpOwotCi0gICAgICAgIElGaWxlIG1hbmlmZXN0ID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmdldE1hbmlmZXN0KHByb2plY3QpOwotICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYXJyYXkuYWRkKG1hbmlmZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcnJheS50b0FycmF5KG5ldyBJUmVzb3VyY2VbYXJyYXkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgYW4gYW5kcm9pZCBhcHAgb24gdGhlIGRldmljZSBvciBlbXVsYXRvcgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3Qgd2UncmUgbGF1bmNoaW5nCi0gICAgICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgaW4gd2hpY2ggdG8gbGF1bmNoLCBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzCi0gICAgICogICAgICBkZWZpbmVkIGJ5IDxjb2RlPklMYXVuY2hNYW5hZ2VyPC9jb2RlPiAtIDxjb2RlPlJVTl9NT0RFPC9jb2RlPiBvcgotICAgICAqICAgICAgPGNvZGU+REVCVUdfTU9ERTwvY29kZT4uCi0gICAgICogQHBhcmFtIGFwayB0aGUgcmVzb3VyY2UgdG8gdGhlIGFwayB0byBsYXVuY2guCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwCi0gICAgICogQHBhcmFtIGRlYnVnUGFja2FnZU5hbWUgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIHRvIGRlYnVnCi0gICAgICogQHBhcmFtIGRlYnVnZ2FibGUgdGhlIGRlYnVnZ2FibGUgdmFsdWUgb2YgdGhlIGFwcCwgb3IgbnVsbCBpZiBub3Qgc2V0LgotICAgICAqIEBwYXJhbSByZXF1aXJlZEFwaVZlcnNpb25OdW1iZXIgdGhlIGFwaSB2ZXJzaW9uIHJlcXVpcmVkIGJ5IHRoZSBhcHAsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gbGF1bmNoQWN0aW9uIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSBhZnRlciBhcHAgc3luYwotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGxhdW5jaCB0aGUgbGF1bmNoIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhdW5jaChmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbW9kZSwgSUZpbGUgYXBrLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZGVidWdQYWNrYWdlTmFtZSwgQm9vbGVhbiBkZWJ1Z2dhYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlcXVpcmVkQXBpVmVyc2lvbk51bWJlciwgZmluYWwgSUFuZHJvaWRMYXVuY2hBY3Rpb24gbGF1bmNoQWN0aW9uLAotICAgICAgICAgICAgZmluYWwgQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBBbmRyb2lkTGF1bmNoIGxhdW5jaCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiUGVyZm9ybWluZyAlMSRzIiwgbGF1bmNoQWN0aW9uLmdldExhdW5jaERlc2NyaXB0aW9uKCkpOwotICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgbWVzc2FnZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBsYXVuY2ggaW5mbwotICAgICAgICBmaW5hbCBEZWxheWVkTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gbmV3IERlbGF5ZWRMYXVuY2hJbmZvKHByb2plY3QsIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGRlYnVnUGFja2FnZU5hbWUsIGxhdW5jaEFjdGlvbiwgYXBrLCBkZWJ1Z2dhYmxlLCByZXF1aXJlZEFwaVZlcnNpb25OdW1iZXIsIGxhdW5jaCwKLSAgICAgICAgICAgICAgICBtb25pdG9yKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGRlYnVnIG1vZGUKLSAgICAgICAgbGF1bmNoSW5mby5zZXREZWJ1Z01vZGUobW9kZS5lcXVhbHMoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkpOwotCi0gICAgICAgIC8vIGdldCB0aGUgU0RLCi0gICAgICAgIFNkayBjdXJyZW50U2RrID0gU2RrLmdldEN1cnJlbnQoKTsKLSAgICAgICAgQXZkTWFuYWdlciBhdmRNYW5hZ2VyID0gY3VycmVudFNkay5nZXRBdmRNYW5hZ2VyKCk7Ci0KLSAgICAgICAgLy8gcmVsb2FkIHRoZSBBVkRzIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgdXAgdG8gZGF0ZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXZkTWFuYWdlci5yZWxvYWRBdmRzKE51bGxTZGtMb2cuZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiB0aGUgQVZEIE1hbmFnZXIgZmFpbGVkIHRvIGZpbmQgdGhlIGZvbGRlciBpbiB3aGljaCB0aGUgQVZEcyBhcmUKLSAgICAgICAgICAgIC8vIHN0b3JlZC4gVGhpcyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCB3ZSBzaG91bGQgZm9yY2UgdG8gZ28gbWFudWFsCi0gICAgICAgICAgICAvLyB0byBhbGxvdyB1c2luZyBwaHlzaWNhbCBkZXZpY2VzLgotICAgICAgICAgICAgY29uZmlnLm1UYXJnZXRNb2RlID0gVGFyZ2V0TW9kZS5NQU5VQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgdGFyZ2V0Ci0gICAgICAgIGZpbmFsIElBbmRyb2lkVGFyZ2V0IHByb2plY3RUYXJnZXQgPSBjdXJyZW50U2RrLmdldFRhcmdldChwcm9qZWN0KTsKLQotICAgICAgICAvLyBGSVhNRTogY2hlY2sgZXJyb3JzIG9uIG1pc3Npbmcgc2RrLCBBVkQgbWFuYWdlciwgb3IgcHJvamVjdCB0YXJnZXQuCi0KLSAgICAgICAgLy8gZGV2aWNlIGNob29zZXIgcmVzcG9uc2Ugb2JqZWN0LgotICAgICAgICBmaW5hbCBEZXZpY2VDaG9vc2VyUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgRGV2aWNlQ2hvb3NlclJlc3BvbnNlKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTGF1bmNoIGxvZ2ljOgotICAgICAgICAgKiAtIE1hbnVhbGx5IE1vZGUKLSAgICAgICAgICogICAgICAgQWx3YXlzIGRpc3BsYXkgYSBVSSB0aGF0IGxldHMgYSB1c2VyIHNlZSB0aGUgY3VycmVudCBydW5uaW5nIGVtdWxhdG9ycy9kZXZpY2VzLgotICAgICAgICAgKiAgICAgICBUaGUgVUkgbXVzdCBzaG93IHdoaWNoIGRldmljZXMgYXJlIGNvbXBhdGlibGVzLCBhbmQgYWxsb3cgbGF1bmNoaW5nIG5ldyBlbXVsYXRvcnMKLSAgICAgICAgICogICAgICAgd2l0aCBjb21wYXRpYmxlIChhbmQgbm90IHlldCBydW5uaW5nKSBBVkQuCi0gICAgICAgICAqIC0gQXV0b21hdGljIFdheQotICAgICAgICAgKiAgICAgKiBQcmVmZXJyZWQgQVZEIHNldC4KLSAgICAgICAgICogICAgICAgICAgIElmIFByZWZlcnJlZCBBVkQgaXMgbm90IHJ1bm5pbmc6IGxhdW5jaCBpdC4KLSAgICAgICAgICogICAgICAgICAgIExhdW5jaCB0aGUgYXBwbGljYXRpb24gb24gdGhlIHByZWZlcnJlZCBBVkQuCi0gICAgICAgICAqICAgICAqIE5vIHByZWZlcnJlZCBBVkQuCi0gICAgICAgICAqICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbXBhdGlibGUgZW11bGF0b3JzL2RldmljZXMuCi0gICAgICAgICAqICAgICAgICAgICBJZiAhPSAxLCBkaXNwbGF5IGEgVUkgc2ltaWxhciB0byBtYW51YWwgbW9kZS4KLSAgICAgICAgICogICAgICAgICAgIElmID09IDEsIGxhdW5jaCB0aGUgYXBwbGljYXRpb24gb24gdGhpcyBBVkQvZGV2aWNlLgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoY29uZmlnLm1UYXJnZXRNb2RlID09IFRhcmdldE1vZGUuQVVUTykgewotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGluIGF1dG9tYXRpYyB0YXJnZXQgbW9kZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBjdXJyZW50IGRldmljZXMKLSAgICAgICAgICAgIElEZXZpY2VbXSBkZXZpY2VzID0gQW5kcm9pZERlYnVnQnJpZGdlLmdldEJyaWRnZSgpLmdldERldmljZXMoKTsKLQotICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhIHByZWZlcnJlZCBBVkQgbmFtZSwgYW5kIGlmIGl0IGFjdHVhbGx5IGV4aXN0cywgYW5kIGlzIHZhbGlkCi0gICAgICAgICAgICAvLyAoaWUgYWJsZSB0byBydW4gdGhlIHByb2plY3QpLgotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0aGlzIGluIGNhc2UgdGhlIEFWRCB3YXMgcmVjcmVhdGVkIHdpdGggYSBkaWZmZXJlbnQgdGFyZ2V0IHRoYXQgaXMKLSAgICAgICAgICAgIC8vIG5vdCBjb21wYXRpYmxlLgotICAgICAgICAgICAgQXZkSW5mbyBwcmVmZXJyZWRBdmQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5tQXZkTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZmVycmVkQXZkID0gYXZkTWFuYWdlci5nZXRBdmQoY29uZmlnLm1BdmROYW1lLCB0cnVlIC8qdmFsaWRBdmRPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0VGFyZ2V0LmlzQ29tcGF0aWJsZUJhc2VGb3IocHJlZmVycmVkQXZkLmdldFRhcmdldCgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRBdmQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlcnJlZCBBVkQgJyUxJHMnIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QgdGFyZ2V0ICclMiRzJy4gTG9va2luZyBmb3IgYSBjb21wYXRpYmxlIEFWRC4uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm1BdmROYW1lLCBwcm9qZWN0VGFyZ2V0LmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZWZlcnJlZEF2ZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBtYXRjaGluZyBkZXZpY2UKLSAgICAgICAgICAgICAgICBmb3IgKElEZXZpY2UgZCA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZUF2ZCA9IGQuZ2V0QXZkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlQXZkICE9IG51bGwgJiYgZGV2aWNlQXZkLmVxdWFscyhjb25maWcubUF2ZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXREZXZpY2VUb1VzZShkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRvbWF0aWMgVGFyZ2V0IE1vZGU6IFByZWZlcnJlZCBBVkQgJyUxJHMnIGlzIGF2YWlsYWJsZSBvbiBlbXVsYXRvciAnJTIkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubUF2ZE5hbWUsIGQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVMYXVuY2gocmVzcG9uc2UsIHByb2plY3QsIGxhdW5jaCwgbGF1bmNoSW5mbywgY29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhIHZhbGlkIHByZWZlcnJlZCBBVkQgdGhhdCBpcyBub3QgcnVubmluZy4KLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0YXJ0IGl0LgotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEF2ZFRvTGF1bmNoKHByZWZlcnJlZEF2ZCk7Ci0KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJBdXRvbWF0aWMgVGFyZ2V0IE1vZGU6IFByZWZlcnJlZCBBVkQgJyUxJHMnIGlzIG5vdCBhdmFpbGFibGUuIExhdW5jaGluZyBuZXcgZW11bGF0b3IuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5tQXZkTmFtZSkpOwotCi0gICAgICAgICAgICAgICAgY29udGludWVMYXVuY2gocmVzcG9uc2UsIHByb2plY3QsIGxhdW5jaCwgbGF1bmNoSW5mbywgY29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vICh2YWxpZCkgcHJlZmVycmVkIEFWRD8gbG9vayBmb3Igb25lLgotICAgICAgICAgICAgSGFzaE1hcDxJRGV2aWNlLCBBdmRJbmZvPiBjb21wYXRpYmxlUnVubmluZ0F2ZHMgPSBuZXcgSGFzaE1hcDxJRGV2aWNlLCBBdmRJbmZvPigpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEZXZpY2UgPSBmYWxzZTsgLy8gaWYgdGhlcmUncyAxKyBkZXZpY2UgcnVubmluZywgd2UgbWF5IGZvcmNlIG1hbnVhbCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgd2UgY2Fubm90IGFsd2F5cyBkZXRlY3QgcHJvcGVyIGNvbXBhdGliaWxpdHkgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlcy4gVGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgcHJvamVjdCB0YXJnZXQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0YW5kYXJkIHBsYXRmb3JtCi0gICAgICAgICAgICBmb3IgKElEZXZpY2UgZCA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlQXZkID0gZC5nZXRBdmROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZUF2ZCAhPSBudWxsKSB7IC8vIHBoeXNpY2FsIGRldmljZXMgcmV0dXJuIG51bGwuCi0gICAgICAgICAgICAgICAgICAgIEF2ZEluZm8gaW5mbyA9IGF2ZE1hbmFnZXIuZ2V0QXZkKGRldmljZUF2ZCwgdHJ1ZSAvKnZhbGlkQXZkT25seSovKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJiBwcm9qZWN0VGFyZ2V0LmlzQ29tcGF0aWJsZUJhc2VGb3IoaW5mby5nZXRUYXJnZXQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGVSdW5uaW5nQXZkcy5wdXQoZCwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdFRhcmdldC5pc1BsYXRmb3JtKCkpIHsgLy8gbWVhbnMgdGhpcyBjYW4gcnVuIG9uIGFueSBkZXZpY2UgYXMgbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYXBpIGxldmVsIGlzIGhpZ2ggZW5vdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVmVyc2lvbiBkZXZpY2VWZXJzaW9uID0gU2RrLmdldERldmljZVZlcnNpb24oZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbi5jYW5SdW4ocHJvamVjdFRhcmdldC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGlzIGNvbXBhdGlibGUgd2l0aCBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZVJ1bm5pbmdBdmRzLnB1dChkLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub24gcHJvamVjdCBwbGF0Zm9ybSwgd2UgY2FuJ3QgYmUgc3VyZSBpZiBhIGRldmljZSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBhbiBhcHBsaWNhdGlvbiBvciBub3QsIHNpbmNlIHdlIGRvbid0IHF1ZXJ5IHRoZSBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgbGlzdCBvZiBvcHRpb25hbCBsaWJyYXJpZXMgdGhhdCBpdCBzdXBwb3J0cy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYXNEZXZpY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgZGV2aWNlcywgd2UnbGwgc2ltdWxhdGUgYW4gYXV0b21hdGljIGNob2ljZQotICAgICAgICAgICAgLy8gZnJvbSB0aGUgZGV2aWNlIGNob29zZXIgb3Igc2ltcGx5IHNob3cgdXAgdGhlIGRldmljZSBjaG9vc2VyLgotICAgICAgICAgICAgaWYgKGhhc0RldmljZSA9PSBmYWxzZSAmJiBjb21wYXRpYmxlUnVubmluZ0F2ZHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB6ZXJvIGVtdWxhdG9ycy9kZXZpY2VzLCB3ZSBsYXVuY2ggYW4gZW11bGF0b3IuCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIEFWRCBmaXJzdC4KLQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBnb2luZyB0byB0YWtlIHRoZSBjbG9zZXN0IEFWRC4gaWUgYSBjb21wYXRpYmxlIEFWRCB0aGF0IGhhcyB0aGUgQVBJIGxldmVsCi0gICAgICAgICAgICAgICAgLy8gY2xvc2VzdCB0byB0aGUgcHJvamVjdCB0YXJnZXQuCi0gICAgICAgICAgICAgICAgQXZkSW5mbyBkZWZhdWx0QXZkID0gZmluZE1hdGNoaW5nQXZkKGF2ZE1hbmFnZXIsIHByb2plY3RUYXJnZXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRBdmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRBdmRUb0xhdW5jaChkZWZhdWx0QXZkKTsKLQotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXV0b21hdGljIFRhcmdldCBNb2RlOiBsYXVuY2hpbmcgbmV3IGVtdWxhdG9yIHdpdGggY29tcGF0aWJsZSBBVkQgJyUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXZkLmdldE5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlTGF1bmNoKHJlc3BvbnNlLCBwcm9qZWN0LCBsYXVuY2gsIGxhdW5jaEluZm8sIGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgYW4gQVZEIGNvbXBhdGlibGUgd2l0aCB0YXJnZXQgJyUxJHMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdFRhcmdldC5nZXROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBBZHRQbHVnaW4uZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuW10gc2VhcmNoQWdhaW4gPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgIkFuZHJvaWQgQVZEIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb21wYXRpYmxlIHRhcmdldHMgd2VyZSBmb3VuZC4gRG8geW91IHdpc2ggdG8gYSBhZGQgbmV3IEFuZHJvaWQgVmlydHVhbCBEZXZpY2U/IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkTWFuYWdlckFjdGlvbiBhY3Rpb24gPSBuZXcgQXZkTWFuYWdlckFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKG51bGwgLyphY3Rpb24qLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEFnYWluWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoQWdhaW5bMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gcmVsb2FkIHRoZSBBVkRzIGFuZCBmaW5kIG9uZSBjb21wYXRpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEF2ZCA9IGZpbmRNYXRjaGluZ0F2ZChhdmRNYW5hZ2VyLCBwcm9qZWN0VGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRBdmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RpbGwgbm8gY29tcGF0aWJsZSBBVkRzIHdpdGggdGFyZ2V0ICclMSRzJzogQWJvcnRpbmcgbGF1bmNoLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VGFyZ2V0LmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEF2ZFRvTGF1bmNoKGRlZmF1bHRBdmQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoaW5nIG5ldyBlbXVsYXRvciB3aXRoIGNvbXBhdGlibGUgQVZEICclMSRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXZkLmdldE5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVMYXVuY2gocmVzcG9uc2UsIHByb2plY3QsIGxhdW5jaCwgbGF1bmNoSW5mbywgY29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0RldmljZSA9PSBmYWxzZSAmJiBjb21wYXRpYmxlUnVubmluZ0F2ZHMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBFbnRyeTxJRGV2aWNlLCBBdmRJbmZvPiBlID0gY29tcGF0aWJsZVJ1bm5pbmdBdmRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGV2aWNlVG9Vc2UoZS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEF2ZEluZm8sIGlmIG51bGwsIHRoZSBkZXZpY2UgaXMgYSBwaHlzaWNhbCBkZXZpY2UuCi0gICAgICAgICAgICAgICAgQXZkSW5mbyBhdmRJbmZvID0gZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChhdmRJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkF1dG9tYXRpYyBUYXJnZXQgTW9kZTogdXNpbmcgZXhpc3RpbmcgZW11bGF0b3IgJyUxJHMnIHJ1bm5pbmcgY29tcGF0aWJsZSBBVkQgJyUyJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXREZXZpY2VUb1VzZSgpLCBlLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiQXV0b21hdGljIFRhcmdldCBNb2RlOiB1c2luZyBkZXZpY2UgJyUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXREZXZpY2VUb1VzZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIG1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgY29udGludWVMYXVuY2gocmVzcG9uc2UsIHByb2plY3QsIGxhdW5jaCwgbGF1bmNoSW5mbywgY29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgZGV2aWNlLCB3ZSdsbCBicmluZyB1cCB0aGUgRGV2aWNlQ2hvb3NlciBkaWFsb2cgYmVsb3cuCi0gICAgICAgICAgICBpZiAoY29tcGF0aWJsZVJ1bm5pbmdBdmRzLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJBdXRvbWF0aWMgVGFyZ2V0IE1vZGU6IFNldmVyYWwgY29tcGF0aWJsZSB0YXJnZXRzLiBQbGVhc2Ugc2VsZWN0IGEgdGFyZ2V0IGRldmljZS4iOwotICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNEZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkF1dG9tYXRpYyBUYXJnZXQgTW9kZTogVW5hYmxlIHRvIGRldGVjdCBkZXZpY2UgY29tcGF0aWJpbGl0eS4gUGxlYXNlIHNlbGVjdCBhIHRhcmdldCBkZXZpY2UuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnJpbmcgdXAgdGhlIGRldmljZSBjaG9vc2VyLgotICAgICAgICBBZHRQbHVnaW4uZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiB0aGUgY2hvb3NlciBkaWFsb2cuIEl0J2xsIGZpbGwgJ3Jlc3BvbnNlJyB3aXRoIHRoZSBkZXZpY2UgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBBVkQgdG8gbGF1bmNoLgotICAgICAgICAgICAgICAgICAgICBEZXZpY2VDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IG5ldyBEZXZpY2VDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgbGF1bmNoSW5mby5nZXRQYWNrYWdlTmFtZSgpLCBwcm9qZWN0VGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci50aGlzLmNvbnRpbnVlTGF1bmNoKHJlc3BvbnNlLCBwcm9qZWN0LCBsYXVuY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8sIGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCAiTGF1bmNoIGNhbmNlbGVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcExhdW5jaChsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgY2FzZSB3aGVyZSB0aGUgc2hlbGwgd2lsbCBiZSBudWxsLiAobWlnaHQgYmUKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gT1MgWCBidWcpLiBCZWNhdXNlIG9mIHRoaXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBkaWFsb2cgd2lsbCB0aHJvdwotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgSWxsZWdhbEFyZyBleGNlcHRpb24gaW50ZXJydXB0aW5nIHRoZSBsYXVuY2ggd2l0aCBubyB1c2VyIGZlZWRiYWNrLgotICAgICAgICAgICAgICAgICAgICAvLyBTbyB3ZSB0cmFwIGFsbCB0aGUgZXhjZXB0aW9uIGFuZCBkaXNwbGF5IHNvbWV0aGluZy4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJFcnJvciBkdXJpbmcgbGF1bmNoOiAlcyIsIG1zZykpOwotICAgICAgICAgICAgICAgICAgICBzdG9wTGF1bmNoKGxhdW5jaEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIG1hdGNoaW5nIEFWRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF2ZEluZm8gZmluZE1hdGNoaW5nQXZkKEF2ZE1hbmFnZXIgYXZkTWFuYWdlciwgZmluYWwgSUFuZHJvaWRUYXJnZXQgcHJvamVjdFRhcmdldCkgewotICAgICAgICBBdmRJbmZvW10gYXZkcyA9IGF2ZE1hbmFnZXIuZ2V0VmFsaWRBdmRzKCk7Ci0gICAgICAgIEF2ZEluZm8gZGVmYXVsdEF2ZCA9IG51bGw7Ci0gICAgICAgIGZvciAoQXZkSW5mbyBhdmQgOiBhdmRzKSB7Ci0gICAgICAgICAgICBpZiAocHJvamVjdFRhcmdldC5pc0NvbXBhdGlibGVCYXNlRm9yKGF2ZC5nZXRUYXJnZXQoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGNhbiBpZ25vcmUgdGhlIGNvZGUgbmFtZSBpc3N1ZSBzaW5jZQotICAgICAgICAgICAgICAgIC8vIElBbmRyb2lkVGFyZ2V0LmlzQ29tcGF0aWJsZUJhc2VGb3IoKSB3aWxsIGFscmVhZHkgaGF2ZSBmaWx0ZXJlZCB0aGUgbm9uCi0gICAgICAgICAgICAgICAgLy8gY29tcGF0aWJsZSBBVkRzLgotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0QXZkID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZC5nZXRUYXJnZXQoKS5nZXRWZXJzaW9uKCkuZ2V0QXBpTGV2ZWwoKSA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEF2ZC5nZXRUYXJnZXQoKS5nZXRWZXJzaW9uKCkuZ2V0QXBpTGV2ZWwoKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXZkID0gYXZkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdEF2ZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250aW51ZXMgdGhlIGxhdW5jaCBiYXNlZCBvbiB0aGUgRGV2aWNlQ2hvb3NlciByZXNwb25zZS4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIGRldmljZSBjaG9vc2VyIHJlc3BvbnNlCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgYmVpbmcgbGF1bmNoZWQKLSAgICAgKiBAcGFyYW0gbGF1bmNoIFRoZSBlY2xpcHNlIGxhdW5jaCBpbmZvCi0gICAgICogQHBhcmFtIGxhdW5jaEluZm8gVGhlIHtAbGluayBEZWxheWVkTGF1bmNoSW5mb30KLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWcgbmVlZGVkIHRvIHN0YXJ0IGEgbmV3IGVtdWxhdG9yLgotICAgICAqLwotICAgIHZvaWQgY29udGludWVMYXVuY2goZmluYWwgRGV2aWNlQ2hvb3NlclJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgZmluYWwgQW5kcm9pZExhdW5jaCBsYXVuY2gsIGZpbmFsIERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sCi0gICAgICAgICAgICBmaW5hbCBBbmRyb2lkTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgd2Ugc3Bhd24gYSBuZXcgdGhyZWFkCi0gICAgICAgIC8vIHRvIGZpbmlzaCB0aGUgbGF1bmNoLgotICAgICAgICBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldEF2ZFRvTGF1bmNoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgbm8gc2VsZWN0ZWQgZGV2aWNlLCB3ZSBzdGFydCBhIG5ldyBlbXVsYXRvci4KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm8gaW5mbyA9IHJlc3BvbnNlLmdldEF2ZFRvTGF1bmNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvckVtdWxhdG9yTGF1bmNoZXMuYWRkKGxhdW5jaEluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKHByb2plY3QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXVuY2hpbmcgYSBuZXcgZW11bGF0b3Igd2l0aCBWaXJ0dWFsIERldmljZSAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBsYXVuY2hFbXVsYXRvcihjb25maWcsIGluZm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF1bmNoaW5nIHRoZSBlbXVsYXRvciBmYWlsZWQhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiRW11bGF0b3IgTGF1bmNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBsYXVuY2ggdGhlIGVtdWxhdG9yISBNYWtlIHN1cmUgdGhlIFNESyBkaXJlY3RvcnkgaXMgcHJvcGVybHkgc2V0dXAgYW5kIHRoZSBlbXVsYXRvciBpcyBub3QgbWlzc2luZy4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgdGhlIGxhdW5jaCBhbmQgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRpbmdGb3JFbXVsYXRvckxhdW5jaGVzLnJlbW92ZShsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCAiTGF1bmNoIGNhbmNlbGVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmdldERldmljZVRvVXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLnNldERldmljZShyZXNwb25zZS5nZXREZXZpY2VUb1VzZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2ltcGxlTGF1bmNoKGxhdW5jaEluZm8sIGxhdW5jaEluZm8uZ2V0RGV2aWNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgZm9yIGEgZGVidWdnZXIgcG9ydCBmb3IgYSBzcGVjaWZpYyB7QGxpbmsgSUxhdW5jaENvbmZpZ3VyYXRpb259LgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgY29uZmlndXJhdGlvbiBhbmQgYSBkZWJ1Z2dlciBwb3J0IHdoZXJlIGFkZGVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgI3NldFBvcnRMYXVuY2hDb25maWdBc3NvY2lhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiwgaW50KX0sIHRoZW4gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0aGUgZGVidWdnZXIgcG9ydCwgYW5kIHJlbW92ZSB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBsaXN0LgotICAgICAqIEBwYXJhbSBsYXVuY2hDb25maWcgdGhlIHtAbGluayBJTGF1bmNoQ29uZmlndXJhdGlvbn0KLSAgICAgKiBAcmV0dXJuIHRoZSBkZWJ1Z2dlciBwb3J0IG9yIHtAbGluayBMYXVuY2hDb25maWdEZWxlZ2F0ZSNJTlZBTElEX0RFQlVHX1BPUlR9IGlmIHRoZQotICAgICAqIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBzZXR1cC4KLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IGdldFBvcnRGb3JDb25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xpc3RMb2NrKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIHBvcnQgPSBzUnVubmluZ0FwcE1hcC5nZXQobGF1bmNoQ29uZmlnKTsKLSAgICAgICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUnVubmluZ0FwcE1hcC5yZW1vdmUobGF1bmNoQ29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBMYXVuY2hDb25maWdEZWxlZ2F0ZS5JTlZBTElEX0RFQlVHX1BPUlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9ufSBhbmQgaXRzIGFzc29jaWF0ZWQgZGVidWcgcG9ydCwgaW4gdGhlIGxpc3Qgb2YKLSAgICAgKiBsYXVuY2ggY29uZmlnIHRvIGNvbm5lY3QgZGlyZWN0bHkgdG8gYSBydW5uaW5nIGFwcCBpbnN0ZWFkIG9mIGRvaW5nIGZ1bGwgbGF1bmNoIChzeW5jLAotICAgICAqIGxhdW5jaCwgYW5kIGNvbm5lY3QgdG8pLgotICAgICAqIEBwYXJhbSBsYXVuY2hDb25maWcgdGhlIHtAbGluayBJTGF1bmNoQ29uZmlndXJhdGlvbn0gb2JqZWN0LgotICAgICAqIEBwYXJhbSBwb3J0IFRoZSBkZWJ1Z2dlciBwb3J0IHRvIGNvbm5lY3QgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQb3J0TGF1bmNoQ29uZmlnQXNzb2NpYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnLAotICAgICAgICAgICAgaW50IHBvcnQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgIHNSdW5uaW5nQXBwTWFwLnB1dChsYXVuY2hDb25maWcsIHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBidWlsZCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgbGF1bmNoIHNob3VsZCBjb250aW51ZS4KLSAgICAgKiA8cC8+VGhlIHZhbHVlIHRlc3RlZCBhcmU6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5NaW5pbXVtIEFQSSB2ZXJzaW9uIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uIElmIHRoZSB0YXJnZXQgZGV2aWNlIGRvZXMgbm90IG1hdGNoLAotICAgICAqIHRoZSBsYXVuY2ggaXMgY2FuY2VsZWQuPC9saT4KLSAgICAgKiA8bGk+RGVidWdnYWJsZSBhdHRyaWJ1dGUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIHJlcXVpcmVzIGl0LiBJZgotICAgICAqIHRoZSBkZXZpY2UgcmVxdWlyZXMgaXQgYW5kIGl0IGlzIG5vdCBzZXQgaW4gdGhlIG1hbmlmZXN0LCB0aGUgbGF1bmNoIHdpbGwgYmUgZm9yY2VkIHRvCi0gICAgICogInJlbGVhc2UiIG1vZGUgaW5zdGVhZCBvZiAiZGVidWciPC9saT4KLSAgICAgKiA8dWw+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVpbGRJbmZvKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sIElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGFwcCByZXF1aXJlZCBBUEkgbGV2ZWwgdmVyc3VzIHRoZSB0YXJnZXQgZGV2aWNlIEFQSSBsZXZlbAotCi0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlVmVyc2lvbiA9IGRldmljZS5nZXRQcm9wZXJ0eShJRGV2aWNlLlBST1BfQlVJTERfVkVSU0lPTik7Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlQXBpTGV2ZWxTdHJpbmcgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0JVSUxEX0FQSV9MRVZFTCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlQ29kZU5hbWUgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0JVSUxEX0NPREVOQU1FKTsKLQotICAgICAgICAgICAgaW50IGRldmljZUFwaUxldmVsID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRldmljZUFwaUxldmVsID0gSW50ZWdlci5wYXJzZUludChkZXZpY2VBcGlMZXZlbFN0cmluZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHBhc3MsIHdlJ2xsIGtlZXAgdGhlIGFwaUxldmVsIHZhbHVlIGF0IC0xLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWlyZWRBcGlTdHJpbmcgPSBsYXVuY2hJbmZvLmdldFJlcXVpcmVkQXBpVmVyc2lvbk51bWJlcigpOwotICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXBpU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVxdWlyZWRBcGkgPSAtMTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEFwaSA9IEludGVnZXIucGFyc2VJbnQocmVxdWlyZWRBcGlTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MsIHdlJ2xsIGtlZXAgcmVxdWlyZWRBcGkgdmFsdWUgYXQgLTEuCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXBpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhlIG1hbmlmZXN0IHVzZXMgYSBjb2RlbmFtZSBmb3IgbWluU2RrVmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBkZXZpY2UgaXMgdXNpbmcgdGhlIHNhbWUgY29kZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXBpU3RyaW5nLmVxdWFscyhkZXZpY2VDb2RlTmFtZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUjogQXBwbGljYXRpb24gcmVxdWlyZXMgYSBkZXZpY2UgcnVubmluZyAnJTEkcychIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEFwaVN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwIHJlcXVpcmVzIGEgc3BlY2lmaWMgQVBJIGxldmVsCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VBcGlMZXZlbCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogVW5rbm93biBkZXZpY2UgQVBJIHZlcnNpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlQXBpTGV2ZWwgPCByZXF1aXJlZEFwaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUjogQXBwbGljYXRpb24gcmVxdWlyZXMgQVBJIHZlcnNpb24gJTEkZC4gRGV2aWNlIEFQSSB2ZXJzaW9uIGlzICUyJGQgKEFuZHJvaWQgJTMkcykuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRBcGksIGRldmljZUFwaUxldmVsLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtc2cpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm9ydCB0aGUgbGF1bmNoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdhcm4gdGhlIGFwcGxpY2F0aW9uIEFQSSBsZXZlbCByZXF1aXJlbWVudCBpcyBub3Qgc2V0LgotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IEFwcGxpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgYW4gQVBJIGxldmVsIHJlcXVpcmVtZW50ISIpOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIGRpc3BsYXkgdGhlIHRhcmdldCBkZXZpY2UgQVBJIGxldmVsIChpZiBrbm93bikKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlQXBpTGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFVua25vd24gZGV2aWNlIEFQSSB2ZXJzaW9uISIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXZpY2UgQVBJIHZlcnNpb24gaXMgJTEkZCAoQW5kcm9pZCAlMiRzKSIsIGRldmljZUFwaUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gbm93IGNoZWNrcyB0aGF0IHRoZSBkZXZpY2UvYXBwIGNhbiBiZSBkZWJ1Z2dlZCAoaWYgbmVlZGVkKQotICAgICAgICAgICAgaWYgKGRldmljZS5pc0VtdWxhdG9yKCkgPT0gZmFsc2UgJiYgbGF1bmNoSW5mby5pc0RlYnVnTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlYnVnZ2FibGVEZXZpY2UgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0RFQlVHR0FCTEUpOwotICAgICAgICAgICAgICAgIGlmIChkZWJ1Z2dhYmxlRGV2aWNlICE9IG51bGwgJiYgZGVidWdnYWJsZURldmljZS5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXZpY2UgaXMgInNlY3VyZSIgYW5kIHJlcXVpcmVzIGFwcHMgdG8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGRlYnVnZ2FibGUhCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYXVuY2hJbmZvLmdldERlYnVnZ2FibGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZTEgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlICclMSRzJyByZXF1aXJlcyB0aGF0IGFwcGxpY2F0aW9ucyBleHBsaWNpdGVseSBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgZGVidWdnYWJsZSBpbiB0aGVpciBtYW5pZmVzdC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UyID0gU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gJyUxJHMnIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSAnZGVidWdnYWJsZScgc2V0IHRvIFRSVUUgaW4gaXRzIG1hbmlmZXN0IGFuZCBjYW5ub3QgYmUgZGVidWdnZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoSW5mby5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtZXNzYWdlMSwgbWVzc2FnZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGFtIC1EIGRvZXMgbm90IGNoZWNrIGZvciByby5kZWJ1Z2dhYmxlIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICdkZWJ1Z2dhYmxlJyBhdHRyaWJ1dGUsIGl0IGlzIGltcG9ydGFudCB3ZSBkbyBub3QgdXNlIHRoZSAtRCBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSBvciB0aGUgYXBwIHdpbGwgd2FpdCBmb3IgYSBkZWJ1Z2dlciBmb3JldmVyIGFuZCBuZXZlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGx5IGxhdW5jaC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uc2V0RGVidWdNb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXVuY2hJbmZvLmdldERlYnVnZ2FibGUoKSA9PSBCb29sZWFuLkZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uICclMSRzJyBoYXMgaXRzICdkZWJ1Z2dhYmxlJyBhdHRyaWJ1dGUgc2V0IHRvIEZBTFNFIGFuZCBjYW5ub3QgYmUgZGVidWdnZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoSW5mby5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtZXNzYWdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBhbSAtRCBkb2VzIG5vdCBjaGVjayBmb3Igcm8uZGVidWdnYWJsZSBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAnZGVidWdnYWJsZScgYXR0cmlidXRlLCBpdCBpcyBpbXBvcnRhbnQgd2UgZG8gbm90IHVzZSB0aGUgLUQgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugb3IgdGhlIGFwcCB3aWxsIHdhaXQgZm9yIGEgZGVidWdnZXIgZm9yZXZlciBhbmQgbmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBsYXVuY2guCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLnNldERlYnVnTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBhIHNpbXBsZSBsYXVuY2ggb24gdGhlIHNwZWNpZmllZCBkZXZpY2UsIGF0dGVtcHRpbmcgdG8gc3luYyB0aGUgbmV3Ci0gICAgICogcGFja2FnZSwgYW5kIHRoZW4gbGF1bmNoaW5nIHRoZSBhcHBsaWNhdGlvbi4gRmFpbGVkIHN5bmMvbGF1bmNoIHdpbGwKLSAgICAgKiBzdG9wIHRoZSBjdXJyZW50IEFuZHJvaWRMYXVuY2ggYW5kIHJldHVybiBmYWxzZTsKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbwotICAgICAqIEBwYXJhbSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaW1wbGVMYXVuY2goRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbywgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gQVBJIGxldmVsIGNoZWNrCi0gICAgICAgIGlmIChjaGVja0J1aWxkSW5mbyhsYXVuY2hJbmZvLCBkZXZpY2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShsYXVuY2hJbmZvLmdldFByb2plY3QoKSwgIkxhdW5jaCBjYW5jZWxlZCEiKTsKLSAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzeW5jIHRoZSBhcHAKLSAgICAgICAgaWYgKHN5bmNBcHAobGF1bmNoSW5mbywgZGV2aWNlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksICJMYXVuY2ggY2FuY2VsZWQhIik7Ci0gICAgICAgICAgICBzdG9wTGF1bmNoKGxhdW5jaEluZm8pOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbGF1bmNoIHRoZSBhcHAKLSAgICAgICAgbGF1bmNoQXBwKGxhdW5jaEluZm8sIGRldmljZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJZiBuZWVkZWQsIHN5bmNzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYWxsIGl0cyBkZXBlbmRlbmNpZXMgb24gdGhlIGRldmljZS9lbXVsYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXVuY2hJbmZvIFRoZSBMYXVuY2ggaW5mb3JtYXRpb24gb2JqZWN0LgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSBvbiB3aGljaCB0byBzeW5jIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdGFsbCBzdWNjZWVkZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHN5bmNBcHAoRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbywgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgYm9vbGVhbiBhbHJlYWR5SW5zdGFsbGVkID0gQXBrSW5zdGFsbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKAotICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBkZXZpY2UpOwotCi0gICAgICAgIGlmIChhbHJlYWR5SW5zdGFsbGVkKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAiQXBwbGljYXRpb24gYWxyZWFkeSBkZXBsb3llZC4gTm8gbmVlZCB0byByZWluc3RhbGwuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZG9TeW5jQXBwKGxhdW5jaEluZm8sIGRldmljZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgYXBwIGlzIG5vdyBpbnN0YWxsZWQsIG5vdyB0cnkgdGhlIGRlcGVuZGVudCBwcm9qZWN0cwotICAgICAgICBmb3IgKERlbGF5ZWRMYXVuY2hJbmZvIGRlcGVuZGVudExhdW5jaEluZm8gOiBnZXREZXBlbmRlbmNpZXNMYXVuY2hJbmZvKGxhdW5jaEluZm8pKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiUHJvamVjdCBkZXBlbmRlbmN5IGZvdW5kLCBpbnN0YWxsaW5nOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudExhdW5jaEluZm8uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIG1zZyk7Ci0gICAgICAgICAgICBpZiAoc3luY0FwcChkZXBlbmRlbnRMYXVuY2hJbmZvLCBkZXZpY2UpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3luY3MgdGhlIGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2UvZW11bGF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyBUaGUgTGF1bmNoIGluZm9ybWF0aW9uIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2Ugb24gd2hpY2ggdG8gc3luYyB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluc3RhbGwgc3VjY2VlZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkb1N5bmNBcHAoRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbywgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IGxhdW5jaEluZm8uZ2V0UGFja2FnZUZpbGUoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIlVwbG9hZGluZyAlMSRzIG9udG8gZGV2aWNlICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtZXNzYWdlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlbW90ZVBhY2thZ2VQYXRoID0gZGV2aWNlLnN5bmNQYWNrYWdlVG9EZXZpY2UocGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgYm9vbGVhbiBpbnN0YWxsUmVzdWx0ID0gaW5zdGFsbFBhY2thZ2UobGF1bmNoSW5mbywgcmVtb3RlUGFja2FnZVBhdGgsIGRldmljZSk7Ci0gICAgICAgICAgICBkZXZpY2UucmVtb3ZlUmVtb3RlUGFja2FnZShyZW1vdGVQYWNrYWdlUGF0aCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBpbnN0YWxsYXRpb24gc3VjY2VlZGVkLCB3ZSByZWdpc3RlciBpdC4KLSAgICAgICAgICAgIGlmIChpbnN0YWxsUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICBBcGtJbnN0YWxsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVySW5zdGFsbGF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldFByb2plY3QoKSwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YWxsUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHVwbG9hZCAlMSRzIG9uIGRldmljZSAnJTIkcyciLCBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtc2csIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdGhlIGN1cnJlbnQgbGF1bmNoSW5mbywgY3JlYXRlIGFkZGl0aW9uYWwgRGVsYXllZExhdW5jaEluZm8gdGhhdCBzaG91bGQgYmUgdXNlZCB0bwotICAgICAqIHN5bmMgQVBLcyB0aGF0IHdlIGFyZSBkZXBlbmRlbnQgb24gdG8gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXVuY2hJbmZvIHRoZSBvcmlnaW5hbCBsYXVuY2ggaW5mbyB0aGF0IHdlIHdhbnQgdG8gZmluZCB0aGUKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBEZWxheWVkTGF1bmNoSW5mbyAobWF5IGJlIGVtcHR5IGlmIG5vIGRlcGVuZGVuY2llcyB3ZXJlIGZvdW5kIG9yIGVycm9yKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlbGF5ZWRMYXVuY2hJbmZvPiBnZXREZXBlbmRlbmNpZXNMYXVuY2hJbmZvKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHsKLSAgICAgICAgTGlzdDxEZWxheWVkTGF1bmNoSW5mbz4gZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4oKTsKLQotICAgICAgICAvLyBDb252ZXJ0IHRvIGVxdWl2YWxlbnQgSmF2YVByb2plY3QKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9hc3N1bWluZyB0aGlzIGlzIGFuIEFuZHJvaWQgKGFuZCBKYXZhKSBwcm9qZWN0IHNpbmNlIGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBsYXVuY2hJbmZvLgotICAgICAgICAgICAgamF2YVByb2plY3QgPSBCYXNlUHJvamVjdEhlbHBlci5nZXRKYXZhUHJvamVjdChsYXVuY2hJbmZvLmdldFByb2plY3QoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IGRlcGVuZGVuY2llcwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIGUpOwotICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCBhbGwgcHJvamVjdHMgdGhhdCB0aGlzIGRlcGVuZHMgb24KLSAgICAgICAgTGlzdDxJSmF2YVByb2plY3Q+IGFuZHJvaWRQcm9qZWN0TGlzdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFuZHJvaWRQcm9qZWN0TGlzdCA9IFByb2plY3RIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3REZXBlbmRlbmNpZXMoamF2YVByb2plY3QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IGRlcGVuZGVuY2llcwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIGUpOwotICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvciBlYWNoIHByb2plY3QsIHBhcnNlIG1hbmlmZXN0IGFuZCBjcmVhdGUgbGF1bmNoIGluZm9ybWF0aW9uCi0gICAgICAgIGZvciAoSUphdmFQcm9qZWN0IGFuZHJvaWRQcm9qZWN0IDogYW5kcm9pZFByb2plY3RMaXN0KSB7Ci0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgTWFuaWZlc3QgdG8gZ2V0IHZhcmlvdXMgcmVxdWlyZWQgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIC8vIGNvcGllZCBmcm9tIExhdW5jaENvbmZpZ0RlbGVnYXRlCi0gICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3RQYXJzZXI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1hbmlmZXN0UGFyc2VyID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFByb2plY3QsIG51bGwgLyogZXJyb3JMaXN0ZW5lciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZ2F0aGVyRGF0YSAqLywgZmFsc2UgLyogbWFya0Vycm9ycyAqLyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRXJyb3IgcGFyc2luZyBtYW5pZmVzdCBvZiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBBUEsgbG9jYXRpb24gKGNhbiByZXR1cm4gbnVsbCkKLSAgICAgICAgICAgIElGaWxlIGFwayA9IFByb2plY3RIZWxwZXIuZ2V0QXBwbGljYXRpb25QYWNrYWdlKGFuZHJvaWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpZiAoYXBrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXRBcHBsaWNhdGlvblBhY2thZ2Ugd2lsbCBoYXZlIGxvZ2dlZCBhbiBlcnJvciBtZXNzYWdlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgbGF1bmNoSW5mbyBhcyBhbiBoeWJyaWQgYmV0d2VlbiBwYXJlbnQgYW5kIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIERlbGF5ZWRMYXVuY2hJbmZvIGRlbGF5ZWRMYXVuY2hJbmZvID0gbmV3IERlbGF5ZWRMYXVuY2hJbmZvKAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkUHJvamVjdC5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0UGFyc2VyLmdldFBhY2thZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RQYXJzZXIuZ2V0UGFja2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldExhdW5jaEFjdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBhcGssCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0UGFyc2VyLmdldERlYnVnZ2FibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RQYXJzZXIuZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldExhdW5jaCgpLAotICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldE1vbml0b3IoKSk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgbGlzdAotICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChkZWxheWVkTGF1bmNoSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIG9uIHRoZSBkZXZpY2UsIGFuZCBoYW5kbGVzIHJldHVybiByZXN1bHQKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyBUaGUgbGF1bmNoIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIHJlbW90ZVBhdGggVGhlIHJlbW90ZSBwYXRoIG9mIHRoZSBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBvbiB3aGljaCB0aGUgbGF1bmNoIGlzIGRvbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluc3RhbGxQYWNrYWdlKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sIGZpbmFsIFN0cmluZyByZW1vdGVQYXRoLAotICAgICAgICAgICAgZmluYWwgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJJbnN0YWxsaW5nICUxJHMuLi4iLCBsYXVuY2hJbmZvLmdldFBhY2thZ2VGaWxlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtZXNzYWdlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRyeSBhIHJlaW5zdGFsbCBmaXJzdCwgYmVjYXVzZSB0aGUgbW9zdCBjb21tb24gY2FzZSBpcyB0aGUgYXBwIGlzIGFscmVhZHkgaW5zdGFsbGVkCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZG9JbnN0YWxsKGxhdW5jaEluZm8sIHJlbW90ZVBhdGgsIGRldmljZSwgdHJ1ZSAvKiByZWluc3RhbGwgKi8pOwotCi0gICAgICAgICAgICAvKiBGb3Igbm93IHdlIGZvcmNlIHRvIHJldHJ5IHRoZSBpbnN0YWxsIChhZnRlciB1bmluc3RhbGxpbmcpIGJlY2F1c2UgdGhlcmUncyBubwotICAgICAgICAgICAgICogb3RoZXIgd2F5IGFyb3VuZCBpdDogYWRiIGluc3RhbGwgZG9lcyBub3Qgd2FudCB0byB1cGRhdGUgYSBwYWNrYWdlIHcvbyB1bmluc3RhbGxpbmcKLSAgICAgICAgICAgICAqIHRoZSBvbGQgb25lIGZpcnN0IQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tJbnN0YWxsUmVzdWx0KHJlc3VsdCwgZGV2aWNlLCBsYXVuY2hJbmZvLCByZW1vdGVQYXRoLAotICAgICAgICAgICAgICAgICAgICBJbnN0YWxsUmV0cnlNb2RlLkFMV0FZUyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluc3RhbGwgJTEkcyBvbiBkZXZpY2UgJyUyJHMhIiwKLSAgICAgICAgICAgICAgICAgICAgbGF1bmNoSW5mby5nZXRQYWNrYWdlRmlsZSgpLmdldE5hbWUoKSwgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtc2csIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHJlc3VsdCBvZiBhbiBpbnN0YWxsYXRpb24sIGFuZCB0YWtlcyBvcHRpb25hbCBhY3Rpb25zIGJhc2VkIG9uIGl0LgotICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzdHJpbmcgZnJvbSB0aGUgaW5zdGFsbGF0aW9uCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIG9uIHdoaWNoIHRoZSBpbnN0YWxsYXRpb24gb2NjdXJlZC4KLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyB0aGUge0BsaW5rIERlbGF5ZWRMYXVuY2hJbmZvfQotICAgICAqIEBwYXJhbSByZW1vdGVQYXRoIHRoZSB0ZW1wb3JhcnkgcGF0aCBvZiB0aGUgcGFja2FnZSBvbiB0aGUgZGV2aWNlCi0gICAgICogQHBhcmFtIHJldHJ5TW9kZSBpbmRpY2F0ZXMgd2hhdCB0byBkbyBpbiBjYXNlLCBhIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPGNvZGU+IGlmIHN1Y2Nlc3MsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0luc3RhbGxSZXN1bHQoU3RyaW5nIHJlc3VsdCwgSURldmljZSBkZXZpY2UsIERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sCi0gICAgICAgICAgICBTdHJpbmcgcmVtb3RlUGF0aCwgSW5zdGFsbFJldHJ5TW9kZSByZXRyeU1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCAiU3VjY2VzcyEiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoIklOU1RBTExfRkFJTEVEX0FMUkVBRFlfRVhJU1RTIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSByZWluc3RhbGwgbW9kZSBpcyB1c2VkIG9uIHRoZSBmaXJzdCBhdHRlbXB0Ci0gICAgICAgICAgICBpZiAocmV0cnlNb2RlID09IEluc3RhbGxSZXRyeU1vZGUuUFJPTVBUKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9tcHQgPSBBZHRQbHVnaW4uZGlzcGxheVByb21wdCgiQXBwbGljYXRpb24gSW5zdGFsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQSBwcmV2aW91cyBpbnN0YWxsYXRpb24gbmVlZHMgdG8gYmUgdW5pbnN0YWxsZWQgYmVmb3JlIHRoZSBuZXcgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkLlxuRG8geW91IHdhbnQgdG8gdW5pbnN0YWxsPyIpOwotICAgICAgICAgICAgICAgIGlmIChwcm9tcHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0cnlNb2RlID0gSW5zdGFsbFJldHJ5TW9kZS5BTFdBWVM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW5zdGFsbGF0aW9uIGVycm9yISBUaGUgcGFja2FnZSBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHJ5TW9kZSA9PSBJbnN0YWxsUmV0cnlNb2RlLkFMV0FZUykgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVE9ETzogY3JlYXRlIGEgVUkgdGhhdCBnaXZlcyB0aGUgZGV2IHRoZSBjaG9pY2UgdG86Ci0gICAgICAgICAgICAgICAgICogLSBjbGVhbiB1bmluc3RhbGwgb24gbGF1bmNoCi0gICAgICAgICAgICAgICAgICogLSBmdWxsIHVuaW5zdGFsbCBpZiBhcHBsaWNhdGlvbiBleGlzdHMuCi0gICAgICAgICAgICAgICAgICogLSBzb2Z0IHVuaW5zdGFsbCBpZiBhcHBsaWNhdGlvbiBleGlzdHMgKGtlZXBzIHRoZSBhcHAgZGF0YSBhcm91bmQpLgotICAgICAgICAgICAgICAgICAqIC0gYWx3YXlzIGFzayAoY2hvaWNlIG9mIHNvZnQtcmVpbnN0YWxsLCBmdWxsIHJlaW5zdGFsbCkKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShsYXVuY2hJbmZvLm1Qcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIGFscmVhZHkgZXhpc3RzLCB1bmluc3RhbGxpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzID0gZG9Vbmluc3RhbGwoZGV2aWNlLCBsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8ubVByb2plY3QsICJTdWNjZXNzISIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8ubVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHVuaW5zdGFsbDogJTEkcyIsIHJlcykpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gYWxyZWFkeSBleGlzdHMuIEF0dGVtcHRpbmcgdG8gcmUtaW5zdGFsbCBpbnN0ZWFkLi4uIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcyA9IGRvSW5zdGFsbChsYXVuY2hJbmZvLCByZW1vdGVQYXRoLCBkZXZpY2UsIHRydWUgLyogcmVpbnN0YWxsICovICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrSW5zdGFsbFJlc3VsdChyZXMsIGRldmljZSwgbGF1bmNoSW5mbywgcmVtb3RlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGxSZXRyeU1vZGUuTkVWRVIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICJJbnN0YWxsYXRpb24gZXJyb3IhIFRoZSBwYWNrYWdlIGFscmVhZHkgZXhpc3RzLiIpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoIklOU1RBTExfRkFJTEVEX0lOVkFMSURfQVBLIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgIkluc3RhbGxhdGlvbiBmYWlsZWQgZHVlIHRvIGludmFsaWQgQVBLIGZpbGUhIiwKLSAgICAgICAgICAgICAgICAiUGxlYXNlIGNoZWNrIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXF1YWxzKCJJTlNUQUxMX0ZBSUxFRF9JTlZBTElEX1VSSSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICJJbnN0YWxsYXRpb24gZmFpbGVkIGR1ZSB0byBpbnZhbGlkIFVSSSEiLAotICAgICAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzLiIpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoIklOU1RBTExfRkFJTEVEX0NPVUxETlRfQ09QWSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkluc3RhbGxhdGlvbiBmYWlsZWQ6IENvdWxkIG5vdCBjb3B5ICUxJHMgdG8gaXRzIGZpbmFsIGxvY2F0aW9uISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldFBhY2thZ2VGaWxlKCkuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAiUGxlYXNlIGNoZWNrIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXF1YWxzKCJJTlNUQUxMX1BBUlNFX0ZBSUxFRF9JTkNPTlNJU1RFTlRfQ0VSVElGSUNBVEVTIikpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAiUmUtaW5zdGFsbGF0aW9uIGZhaWxlZCBkdWUgdG8gZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNpZ25hdHVyZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHBlcmZvcm0gYSBmdWxsIHVuaW5zdGFsbCBvZiB0aGUgYXBwbGljYXRpb24uIFdBUk5JTkc6IFRoaXMgd2lsbCByZW1vdmUgdGhlIGFwcGxpY2F0aW9uIGRhdGEhIiwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiUGxlYXNlIGV4ZWN1dGUgJ2FkYiB1bmluc3RhbGwgJTEkcycgaW4gYSBzaGVsbC4iLCBsYXVuY2hJbmZvLmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkluc3RhbGxhdGlvbiBlcnJvcjogJTEkcyIsIHJlc3VsdCksCi0gICAgICAgICAgICAgICAgIlBsZWFzZSBjaGVjayBsb2djYXQgb3V0cHV0IGZvciBtb3JlIGRldGFpbHMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHVuaW5zdGFsbGF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSBvbiB3aGljaCB0byBpbnN0YWxsIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyB0aGUge0BsaW5rIERlbGF5ZWRMYXVuY2hJbmZvfS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gd2l0aCBhbiBlcnJvciBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNjZXNzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIFN0cmluZyBkb1VuaW5zdGFsbChJRGV2aWNlIGRldmljZSwgRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2UudW5pbnN0YWxsUGFja2FnZShsYXVuY2hJbmZvLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1bmluc3RhbGwgJTEkczogJTIkcyIsIGxhdW5jaEluZm8uZ2V0UGFja2FnZU5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksIG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGluc3RhbGxhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBiZWVuIHVwbG9hZGVkIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyB0aGUge0BsaW5rIERlbGF5ZWRMYXVuY2hJbmZvfS4KLSAgICAgKiBAcGFyYW0gcmVtb3RlUGF0aCB0aGUgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBpbiB0aGUgZGV2aWNlIHRtcCBmb2xkZXIuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGluc3RhbGwgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSByZWluc3RhbGwKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gd2l0aCBhbiBlcnJvciBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNjZXNzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkb0luc3RhbGwoRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbywgZmluYWwgU3RyaW5nIHJlbW90ZVBhdGgsCi0gICAgICAgICAgICBmaW5hbCBJRGV2aWNlIGRldmljZSwgYm9vbGVhbiByZWluc3RhbGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZXZpY2UuaW5zdGFsbFJlbW90ZVBhY2thZ2UocmVtb3RlUGF0aCwgcmVpbnN0YWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBsYXVuY2hlcyBhbiBhcHBsaWNhdGlvbiBvbiBhIGRldmljZSBvciBlbXVsYXRvcgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gdGhlIHtAbGluayBEZWxheWVkTGF1bmNoSW5mb30gdGhhdCBpbmRpY2F0ZXMgdGhlIGxhdW5jaCBhY3Rpb24KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiBvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhdW5jaEFwcChmaW5hbCBEZWxheWVkTGF1bmNoSW5mbyBpbmZvLCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoaW5mby5pc0RlYnVnTW9kZSgpKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNMaXN0TG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtV2FpdGluZ0ZvckRlYnVnZ2VyQXBwbGljYXRpb25zLmNvbnRhaW5zKGluZm8pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yRGVidWdnZXJBcHBsaWNhdGlvbnMuYWRkKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mby5nZXRMYXVuY2hBY3Rpb24oKS5kb0xhdW5jaEFjdGlvbihpbmZvLCBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgYXBwIGlzIG5vdCBhIGRlYnVnIGFwcCwgd2UgbmVlZCB0byBkbyBzb21lIGNsZWFuIHVwLCBhcwotICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgZG9uZSEKLSAgICAgICAgICAgIGlmIChpbmZvLmlzRGVidWdNb2RlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9wIHRoZSBsYXVuY2ggb2JqZWN0LCBzaW5jZSB0aGVyZSdzIG5vIGRlYnVnLCBhbmQgaXQgY2FuJ3QKLSAgICAgICAgICAgICAgICAvLyBwcm92aWRlIGFueSBjb250cm9sIG92ZXIgdGhlIGFwcAotICAgICAgICAgICAgICAgIHN0b3BMYXVuY2goaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZyBvciBubyBmdXJ0aGVyIGxhdW5jaCBhY3Rpb24gbmVlZGVkCi0gICAgICAgICAgICAvLyBsZXRzIHN0b3AgdGhlIExhdW5jaAotICAgICAgICAgICAgc3RvcExhdW5jaChpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBsYXVuY2hFbXVsYXRvcihBbmRyb2lkTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIEF2ZEluZm8gYXZkVG9MYXVuY2gpIHsKLQotICAgICAgICAvLyBzcGxpdCB0aGUgY3VzdG9tIGNvbW1hbmQgbGluZSBpbiBzZWdtZW50cwotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjdXN0b21BcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzV2lwZURhdGEgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbmZpZy5tRW11bGF0b3JDb21tYW5kTGluZSAhPSBudWxsICYmIGNvbmZpZy5tRW11bGF0b3JDb21tYW5kTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gY29uZmlnLm1FbXVsYXRvckNvbW1hbmRMaW5lLnNwbGl0KCJcXHMrIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIGVtcHR5IHN0cmluZ3MKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzZWdtZW50cykgewotICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjdXN0b21BcmdzLmFkZChzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNXaXBlRGF0YSAmJiBzLmVxdWFscyhGTEFHX1dJUEVfREFUQSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1dpcGVEYXRhID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZHNXaXBlRGF0YSA9IGNvbmZpZy5tV2lwZURhdGEgJiYgIWhhc1dpcGVEYXRhOwotICAgICAgICBpZiAobmVlZHNXaXBlRGF0YSkgewotICAgICAgICAgICAgaWYgKCFBZHRQbHVnaW4uZGlzcGxheVByb21wdCgiQW5kcm9pZCBMYXVuY2giLCAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHdpcGUgYWxsIHVzZXIgZGF0YSB3aGVuIHN0YXJ0aW5nIHRoaXMgZW11bGF0b3I/IikpIHsKLSAgICAgICAgICAgICAgICBuZWVkc1dpcGVEYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcGFyYW1ldGVycy4KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGxpc3QuYWRkKEFkdFBsdWdpbi5nZXRPc0Fic29sdXRlRW11bGF0b3IoKSk7Ci0gICAgICAgIGxpc3QuYWRkKEZMQUdfQVZEKTsKLSAgICAgICAgbGlzdC5hZGQoYXZkVG9MYXVuY2guZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoY29uZmlnLm1OZXR3b3JrU3BlZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRkxBR19ORVRTUEVFRCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjb25maWcubU5ldHdvcmtTcGVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uZmlnLm1OZXR3b3JrRGVsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRkxBR19ORVRERUxBWSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjb25maWcubU5ldHdvcmtEZWxheSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZHNXaXBlRGF0YSkgewotICAgICAgICAgICAgbGlzdC5hZGQoRkxBR19XSVBFX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZy5tTm9Cb290QW5pbSkgewotICAgICAgICAgICAgbGlzdC5hZGQoRkxBR19OT19CT09UX0FOSU0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbGlzdC5hZGRBbGwoY3VzdG9tQXJncyk7Ci0KLSAgICAgICAgLy8gY29udmVydCB0aGUgbGlzdCBpbnRvIGFuIGFycmF5IGZvciB0aGUgY2FsbCB0byBleGVjLgotICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQotICAgICAgICAvLyBsYXVuY2ggdGhlIGVtdWxhdG9yCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotICAgICAgICAgICAgZ3JhYkVtdWxhdG9yT3V0cHV0KHByb2Nlc3MpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyBmb3IgYW5kIHJldHVybnMgYW4gZXhpc3Rpbmcge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9ufSBvYmplY3QgZm9yIGEKLSAgICAgKiBzcGVjaWZpZWQgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUge0BsaW5rIElMYXVuY2hNYW5hZ2VyfS4KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZX0uCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBhbiBleGlzdGluZyA8Y29kZT5JTGF1bmNoQ29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IG1hdGNoaW5nIHRoZSBwcm9qZWN0LCBvcgotICAgICAqICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZmluZENvbmZpZyhJTGF1bmNoTWFuYWdlciBtYW5hZ2VyLAotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyh0eXBlKTsKLQotICAgICAgICAgICAgZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIiIpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoQWR0UGx1Z2luLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAiTGF1bmNoIEVycm9yIiwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGlkbid0IGZpbmQgYW55dGhpbmcgdGhhdCBtYXRjaGVzLiBSZXR1cm4gbnVsbAotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdHMgYSByZW1vdGUgZGVidWdnZXIgb24gdGhlIHNwZWNpZmllZCBwb3J0LgotICAgICAqIEBwYXJhbSBkZWJ1Z1BvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCB0aGUgZGVidWdnZXIgdG8KLSAgICAgKiBAcGFyYW0gbGF1bmNoIFRoZSBhc3NvY2lhdGVkIEFuZHJvaWRMYXVuY2ggb2JqZWN0LgotICAgICAqIEBwYXJhbSBtb25pdG9yIEEgUHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgY2FuY2VsbGVkIGJ5IHRoZSBtb25pdG9yCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbm5lY3RSZW1vdGVEZWJ1Z2dlcihpbnQgZGVidWdQb3J0LAotICAgICAgICAgICAgQW5kcm9pZExhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdldCBzb21lIGRlZmF1bHQgcGFyYW1ldGVycy4KLSAgICAgICAgaW50IGNvbm5lY3RUaW1lb3V0ID0gSmF2YVJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoSmF2YVJ1bnRpbWUuUFJFRl9DT05ORUNUX1RJTUVPVVQpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIG5ld01hcC5wdXQoImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgbmV3TWFwLnB1dCgicG9ydCIsIEludGVnZXIudG9TdHJpbmcoZGVidWdQb3J0KSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBuZXdNYXAucHV0KCJ0aW1lb3V0IiwgSW50ZWdlci50b1N0cmluZyhjb25uZWN0VGltZW91dCkpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCBWTSBjb25uZWN0b3IKLSAgICAgICAgSVZNQ29ubmVjdG9yIGNvbm5lY3RvciA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUNvbm5lY3RvcigpOwotCi0gICAgICAgIC8vIGNvbm5lY3QgdG8gcmVtb3RlIFZNCi0gICAgICAgIGNvbm5lY3Rvci5jb25uZWN0KG5ld01hcCwgbW9uaXRvciwgbGF1bmNoKTsKLQotICAgICAgICAvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgSURlYnVnVGFyZ2V0W10gZGVidWdUYXJnZXRzID0gbGF1bmNoLmdldERlYnVnVGFyZ2V0cygpOwotICAgICAgICAgICAgZm9yIChJRGVidWdUYXJnZXQgdGFyZ2V0IDogZGVidWdUYXJnZXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jYW5EaXNjb25uZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2ggYSBuZXcgdGhyZWFkIHRoYXQgY29ubmVjdHMgYSByZW1vdGUgZGVidWdnZXIgb24gdGhlIHNwZWNpZmllZCBwb3J0LgotICAgICAqIEBwYXJhbSBkZWJ1Z1BvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCB0aGUgZGVidWdnZXIgdG8KLSAgICAgKiBAcGFyYW0gYW5kcm9pZExhdW5jaCBUaGUgYXNzb2NpYXRlZCBBbmRyb2lkTGF1bmNoIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBIFByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAc2VlICNjb25uZWN0UmVtb3RlRGVidWdnZXIoaW50LCBBbmRyb2lkTGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsYXVuY2hSZW1vdGVEZWJ1Z2dlcihmaW5hbCBpbnQgZGVidWdQb3J0LCBmaW5hbCBBbmRyb2lkTGF1bmNoIGFuZHJvaWRMYXVuY2gsCi0gICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgbmV3IFRocmVhZCgiRGVidWdnZXIgY29ubmVjdGlvbiIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdFJlbW90ZURlYnVnZ2VyKGRlYnVnUG9ydCwgYW5kcm9pZExhdW5jaCwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRMYXVuY2guc3RvcExhdW5jaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfSBpcyBzdGFydGVkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGJyaWRnZSB0aGUgbmV3IHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBzZWUgSURlYnVnQnJpZGdlQ2hhbmdlTGlzdGVuZXIjYnJpZGdlQ2hhbmdlZChBbmRyb2lkRGVidWdCcmlkZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnJpZGdlQ2hhbmdlZChBbmRyb2lkRGVidWdCcmlkZ2UgYnJpZGdlKSB7Ci0gICAgICAgIC8vIFRoZSBhZGIgc2VydmVyIGhhcyBjaGFuZ2VkLiBXZSBjYW5jZWwgYW55IHBlbmRpbmcgbGF1bmNoZXMuCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gImFkYiBzZXJ2ZXIgY2hhbmdlOiBjYW5jZWxsaW5nICclMSRzJyEiOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMaXN0TG9jaykgewotICAgICAgICAgICAgZm9yIChEZWxheWVkTGF1bmNoSW5mbyBsYXVuY2hJbmZvIDogbVdhaXRpbmdGb3JSZWFkeUVtdWxhdG9yTGlzdCkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsIGxhdW5jaEluZm8uZ2V0TGF1bmNoQWN0aW9uKCkuZ2V0TGF1bmNoRGVzY3JpcHRpb24oKSkpOwotICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8gOiBtV2FpdGluZ0ZvckRlYnVnZ2VyQXBwbGljYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0TGF1bmNoQWN0aW9uKCkuZ2V0TGF1bmNoRGVzY3JpcHRpb24oKSkpOwotICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1XYWl0aW5nRm9yUmVhZHlFbXVsYXRvckxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1XYWl0aW5nRm9yRGVidWdnZXJBcHBsaWNhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiB0aGUgYSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBzZW50IGZyb20gYSBub24gVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIG5ldyBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDb25uZWN0ZWQoSURldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VDb25uZWN0ZWQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgIC8vIGxvb2sgaWYgdGhlcmUncyBhbiBhcHAgd2FpdGluZyBmb3IgYSBkZXZpY2UKLSAgICAgICAgICAgIGlmIChtV2FpdGluZ0ZvckVtdWxhdG9yTGF1bmNoZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGdldC9yZW1vdmUgZmlyc3QgbGF1bmNoIGl0ZW0gZnJvbSB0aGUgbGlzdAotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3aGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgbGF1bmNoZXMgd2FpdGluZz8KLSAgICAgICAgICAgICAgICBEZWxheWVkTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gbVdhaXRpbmdGb3JFbXVsYXRvckxhdW5jaGVzLmdldCgwKTsKLSAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvckVtdWxhdG9yTGF1bmNoZXMucmVtb3ZlKDApOwotCi0gICAgICAgICAgICAgICAgLy8gZ2l2ZSB0aGUgbGF1bmNoIGl0ZW0gaXRzIGRldmljZSBmb3IgbGF0ZXIgdXNlLgotICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uc2V0RGV2aWNlKGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhbmQgbW92ZSBpdCB0byB0aGUgb3RoZXIgbGlzdAotICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yUmVhZHlFbXVsYXRvckxpc3QuYWRkKGxhdW5jaEluZm8pOwotCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRlbGwgdGhlIHVzZXIgYWJvdXQgaXQKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJOZXcgZW11bGF0b3IgZm91bmQ6ICUxJHMiLCBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpKTsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobGF1bmNoSW5mby5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJXYWl0aW5nIGZvciBIT01FICgnJTEkcycpIHRvIGJlIGxhdW5jaGVkLi4uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5QUkVGU19IT01FX1BBQ0tBR0UpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gdGhlIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byB0aGUge0BsaW5rIEFuZHJvaWREZWJ1Z0JyaWRnZX0uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBuZXcgZGV2aWNlLgotICAgICAqCi0gICAgICogQHNlZSBJRGV2aWNlQ2hhbmdlTGlzdGVuZXIjZGV2aWNlRGlzY29ubmVjdGVkKElEZXZpY2UpCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgZGV2aWNlRGlzY29ubmVjdGVkKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIC8vIGFueSBwZW5kaW5nIGxhdW5jaCBvbiB0aGlzIGRldmljZSBtdXN0IGJlIGNhbmNlbGVkLgotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIlMSRzIGRpc2Nvbm5lY3RlZCEgQ2FuY2VsbGluZyAnJTIkcychIjsKLSAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4gY29weUxpc3QgPQotICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8RGVsYXllZExhdW5jaEluZm8+KSBtV2FpdGluZ0ZvclJlYWR5RW11bGF0b3JMaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICBmb3IgKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8gOiBjb3B5TGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChsYXVuY2hJbmZvLmdldERldmljZSgpID09IGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShsYXVuY2hJbmZvLmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0TGF1bmNoQWN0aW9uKCkuZ2V0TGF1bmNoRGVzY3JpcHRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICBzdG9wTGF1bmNoKGxhdW5jaEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvcHlMaXN0ID0gKEFycmF5TGlzdDxEZWxheWVkTGF1bmNoSW5mbz4pIG1XYWl0aW5nRm9yRGVidWdnZXJBcHBsaWNhdGlvbnMuY2xvbmUoKTsKLSAgICAgICAgICAgIGZvciAoRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbyA6IGNvcHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhdW5jaEluZm8uZ2V0RGV2aWNlKCkgPT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQobWVzc2FnZSwgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoSW5mby5nZXRMYXVuY2hBY3Rpb24oKS5nZXRMYXVuY2hEZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgZGV2aWNlIGRhdGEgY2hhbmdlZCwgb3Igd2hlbiBjbGllbnRzIGFyZSBzdGFydGVkL3Rlcm1pbmF0ZWQgb24gdGhlIGRldmljZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBzZW50IGZyb20gYSBub24gVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB0aGF0IHdhcyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBjaGFuZ2VNYXNrIHRoZSBtYXNrIGluZGljYXRpbmcgd2hhdCBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHNlZSBJRGV2aWNlQ2hhbmdlTGlzdGVuZXIjZGV2aWNlQ2hhbmdlZChJRGV2aWNlLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV2aWNlQ2hhbmdlZChJRGV2aWNlIGRldmljZSwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgLy8gV2UgY291bGQgY2hlY2sgaWYgYW55IHN0YXJ0aW5nIGRldmljZSB3ZSBjYXJlIGFib3V0IGlzIG5vdyByZWFkeSwgYnV0IHdlIGNhbiB3YWl0IGZvcgotICAgICAgICAvLyBpdHMgaG9tZSBhcHAgdG8gc2hvdyB1cCwgc28uLi4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXhpc3RpbmcgY2xpZW50IGluZm9ybWF0aW9uIGNoYW5nZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgc2VudCBmcm9tIGEgbm9uIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSB1cGRhdGVkIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2hhbmdlTWFzayB0aGUgYml0IG1hc2sgZGVzY3JpYmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLiBJdCBjYW4gY29udGFpbgotICAgICAqIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoge0BsaW5rIENsaWVudCNDSEFOR0VfSU5GT30sIHtAbGluayBDbGllbnQjQ0hBTkdFX05BTUV9Ci0gICAgICoge0BsaW5rIENsaWVudCNDSEFOR0VfREVCVUdHRVJfU1RBVFVTfSwge0BsaW5rIENsaWVudCNDSEFOR0VfVEhSRUFEX01PREV9LAotICAgICAqIHtAbGluayBDbGllbnQjQ0hBTkdFX1RIUkVBRF9EQVRBfSwge0BsaW5rIENsaWVudCNDSEFOR0VfSEVBUF9NT0RFfSwKLSAgICAgKiB7QGxpbmsgQ2xpZW50I0NIQU5HRV9IRUFQX0RBVEF9LCB7QGxpbmsgQ2xpZW50I0NIQU5HRV9OQVRJVkVfSEVBUF9EQVRBfQotICAgICAqCi0gICAgICogQHNlZSBJQ2xpZW50Q2hhbmdlTGlzdGVuZXIjY2xpZW50Q2hhbmdlZChDbGllbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGllbnRDaGFuZ2VkKGZpbmFsIENsaWVudCBjbGllbnQsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdERlYnVnZ2VyID0gZmFsc2U7Ci0gICAgICAgIGlmICgoY2hhbmdlTWFzayAmIENsaWVudC5DSEFOR0VfTkFNRSkgPT0gQ2xpZW50LkNIQU5HRV9OQU1FKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXBwbGljYXRpb25OYW1lID0gY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhvbWUgPSBzdG9yZS5nZXRTdHJpbmcoQWR0UGx1Z2luLlBSRUZTX0hPTUVfUEFDS0FHRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaG9tZS5lcXVhbHMoYXBwbGljYXRpb25OYW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgaG9tZSBpcyB1cCwgZ2V0IGl0cyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgSURldmljZSBkZXZpY2UgPSBjbGllbnQuZ2V0RGV2aWNlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYXBwbGljYXRpb24gd2FpdGluZyBmb3IgaG9tZQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNMaXN0TG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtV2FpdGluZ0ZvclJlYWR5RW11bGF0b3JMaXN0LnNpemUoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXllZExhdW5jaEluZm8gbGF1bmNoSW5mbyA9IG1XYWl0aW5nRm9yUmVhZHlFbXVsYXRvckxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXVuY2hJbmZvLmdldERldmljZSgpID09IGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG1hdGNoLCByZW1vdmUgZnJvbSB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvclJlYWR5RW11bGF0b3JMaXN0LnJlbW92ZShpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCBjaGVjayBlYXJsaWVyIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoaXQncyBhc3luY2hyb25vdXMgd2hlbiB0aGUgZGV2aWNlIGJvb3QsIGFuZCB1c3VhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZUNvbm5lY3RlZCBpcyBjYWxsZWQgYmVmb3JlIGl0J3MgcXVlcmllZCBmb3IgaXRzIGJ1aWxkIGluZm8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNoZWNrIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tCdWlsZEluZm8obGF1bmNoSW5mbywgZGV2aWNlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGlzIG5vdCB0aGUgcHJvcGVyIEFQSSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoIGNhbmNlbGVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcExhdW5jaChsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShsYXVuY2hJbmZvLmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJIT01FIGlzIHVwIG9uIGRldmljZSAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBzeW5jIHRoZSBuZXcgcGFja2FnZSBvbnRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW5jQXBwKGxhdW5jaEluZm8sIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIHBhY2thZ2UgaXMgc3luYydlZCwgbGV0cyBhdHRlbXB0IHRvIGxhdW5jaCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEFwcChsYXVuY2hJbmZvLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSEgQ2FuY2VsIGFuZCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdW5jaCBjYW5jZWxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BMYXVuY2gobGF1bmNoSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhbHJlYWR5IHdhaXRpbmcgZm9yIGEgZGVidWdnZXIsIGFuZCBpZiBzbyB3ZSBjb25uZWN0IHRvIGl0LgotICAgICAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldERlYnVnZ2VyQ29ubmVjdGlvblN0YXR1cygpID09IERlYnVnZ2VyU3RhdHVzLldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciB0aGlzIGNsaWVudCBpbiB0aGUgbGlzdDsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Vbmtub3duQ2xpZW50c1dhaXRpbmdGb3JEZWJ1Z2dlci5pbmRleE9mKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0RGVidWdnZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vbmtub3duQ2xpZW50c1dhaXRpbmdGb3JEZWJ1Z2dlci5yZW1vdmUoY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGl0J3Mgbm90IGhvbWUsIGl0IGNvdWxkIGJlIGFuIGFwcCB0aGF0IGlzIG5vdyBpbiBkZWJ1Z2dlciBtb2RlIHRoYXQgd2UncmUgd2FpdGluZyBmb3IKLSAgICAgICAgLy8gbGV0cyBjaGVjayBpdAotCi0gICAgICAgIGlmICgoY2hhbmdlTWFzayAmIENsaWVudC5DSEFOR0VfREVCVUdHRVJfU1RBVFVTKSA9PSBDbGllbnQuQ0hBTkdFX0RFQlVHR0VSX1NUQVRVUykgewotICAgICAgICAgICAgQ2xpZW50RGF0YSBjbGllbnREYXRhID0gY2xpZW50LmdldENsaWVudERhdGEoKTsKLSAgICAgICAgICAgIFN0cmluZyBhcHBsaWNhdGlvbk5hbWUgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldENsaWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50RGF0YS5nZXREZWJ1Z2dlckNvbm5lY3Rpb25TdGF0dXMoKSA9PSBEZWJ1Z2dlclN0YXR1cy5XQUlUSU5HKSB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lLCBhbmQgbWFrZSBzdXJlIGl0cyB2YWxpZC4KLSAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB3ZSBkb24ndCBoYXZlIHRoZSBjbGllbnQgeWV0LCBzbyB3ZSBrZWVwIGl0IGFyb3VuZCBmb3Igd2hlbiBpdHMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzTGlzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Vbmtub3duQ2xpZW50c1dhaXRpbmdGb3JEZWJ1Z2dlci5hZGQoY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdERlYnVnZ2VyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29ubmVjdERlYnVnZ2VyKSB7Ci0gICAgICAgICAgICBMb2cuZCgiYWR0IiwgIkRlYnVnZ2luZyAiICsgY2xpZW50KTsKLSAgICAgICAgICAgIC8vIG5vdyBjaGVjayBpdCBhZ2FpbnN0IHRoZSBhcHBzIHdhaXRpbmcgZm9yIGEgZGVidWdnZXIKLSAgICAgICAgICAgIFN0cmluZyBhcHBsaWNhdGlvbk5hbWUgPSBjbGllbnQuZ2V0Q2xpZW50RGF0YSgpLmdldENsaWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBMb2cuZCgiYWR0IiwgIkFwcCBOYW1lOiAiICsgYXBwbGljYXRpb25OYW1lKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0xpc3RMb2NrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtV2FpdGluZ0ZvckRlYnVnZ2VyQXBwbGljYXRpb25zLnNpemUoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8gPSBtV2FpdGluZ0ZvckRlYnVnZ2VyQXBwbGljYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudC5nZXREZXZpY2UoKSA9PSBsYXVuY2hJbmZvLmdldERldmljZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25OYW1lLmVxdWFscyhsYXVuY2hJbmZvLmdldERlYnVnUGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBtYXRjaC4gV2UgcmVtb3ZlIHRoZSBsYXVuY2ggaW5mbyBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvckRlYnVnZ2VyQXBwbGljYXRpb25zLnJlbW92ZShpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbm5lY3QgdGhlIGRlYnVnZ2VyLgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGNvbm5lY3QgZGVidWdnZXIgdG8gJyUxJHMnIG9uIHBvcnQgJTIkZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0RGVidWdQYWNrYWdlTmFtZSgpLCBjbGllbnQuZ2V0RGVidWdnZXJMaXN0ZW5Qb3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCBtc2cpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCJEZWJ1Z2dlciBDb25uZWN0aW9uIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RSZW1vdGVEZWJ1Z2dlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldERlYnVnZ2VyTGlzdGVuUG9ydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldExhdW5jaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hJbmZvLmdldE1vbml0b3IoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsbCBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJMYXVuY2ggZXJyb3I6ICVzIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgdGhlIGxhdW5jaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcExhdW5jaChsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEluZm8uZ2V0TW9uaXRvcigpLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZyB0aGlzIGNsaWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZW4ndCBmb3VuZCBhbiBhcHAgdGhhdCB3ZSB3ZXJlIGxhdW5jaGluZywgc28gd2UgbG9vawotICAgICAgICAgICAgLy8gZm9yIG9wZW5lZCBhbmRyb2lkIHByb2plY3RzIHRoYXQgY29udGFpbnMgdGhlIGFwcCBhc2tpbmcgZm9yIGEgZGVidWdnZXIuCi0gICAgICAgICAgICAvLyBJZiB3ZSBmaW5kIG9uZSwgd2UgYXV0b21hdGljYWxseSBjb25uZWN0IHRvIGl0LgotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RIZWxwZXIuZmluZEFuZHJvaWRQcm9qZWN0QnlBcHBOYW1lKGFwcGxpY2F0aW9uTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWJ1Z1J1bm5pbmdBcHAocHJvamVjdCwgY2xpZW50LmdldERlYnVnZ2VyTGlzdGVuUG9ydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RkZXJyL3N0ZG91dCBvdXRwdXRzIG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4KLSAgICAgKiBCb3RoIDxiPm11c3Q8L2I+IGJlIHJlYWQgb3IgdGhlIHByb2Nlc3Mgd2lsbCBibG9jayBvbiB3aW5kb3dzLgotICAgICAqIEBwYXJhbSBwcm9jZXNzIFRoZSBwcm9jZXNzIHRvIGdldCB0aGUgb3V0cHV0IGZyb20KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ3JhYkVtdWxhdG9yT3V0cHV0KGZpbmFsIFByb2Nlc3MgcHJvY2VzcykgewotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB0byByZWFkIHRoZSBzdGRlcnIgb3V0cHV0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZXJyUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoIkVtdWxhdG9yIiwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIG5ldyBUaHJlYWQoIiIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBvdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gb3V0UmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKCJFbXVsYXRvciIsIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubGF1bmNoLklMYXVuY2hDb250cm9sbGVyI3N0b3BMYXVuY2goY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmxhdW5jaC5BbmRyb2lkTGF1bmNoQ29udHJvbGxlci5EZWxheWVkTGF1bmNoSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wTGF1bmNoKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHsKLSAgICAgICAgbGF1bmNoSW5mby5nZXRMYXVuY2goKS5zdG9wTGF1bmNoKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xpc3RMb2NrKSB7Ci0gICAgICAgICAgICBtV2FpdGluZ0ZvclJlYWR5RW11bGF0b3JMaXN0LnJlbW92ZShsYXVuY2hJbmZvKTsKLSAgICAgICAgICAgIG1XYWl0aW5nRm9yRGVidWdnZXJBcHBsaWNhdGlvbnMucmVtb3ZlKGxhdW5jaEluZm8pOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0RlbGF5ZWRMYXVuY2hJbmZvLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0RlbGF5ZWRMYXVuY2hJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzk0ZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9EZWxheWVkTGF1bmNoSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQSBkZWxheWVkIGxhdW5jaCB3YWl0aW5nIGZvciBhIGRldmljZSB0byBiZSBwcmVzZW50IG9yIHJlYWR5IGJlZm9yZSB0aGUKLSAqIGFwcGxpY2F0aW9uIGlzIGxhdW5jaGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVsYXllZExhdW5jaEluZm8gewotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBpbmRpY2F0ZSBiZWhhdmlvciB3aGVuIEFuZHJvaWQgYXBwIGFscmVhZHkgZXhpc3RzCi0gICAgICovCi0gICAgZW51bSBJbnN0YWxsUmV0cnlNb2RlIHsKLSAgICAgICAgTkVWRVIsIEFMV0FZUywgUFJPTVBUOwotICAgIH0KLQotICAgIC8qKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHRvIGxhdW5jaCB0aGUgYXBwICovCi0gICAgcHJpdmF0ZSBJRGV2aWNlIG1EZXZpY2UgPSBudWxsOwotCi0gICAgLyoqIFRoZSBlY2xpcHNlIHByb2plY3QgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IG1Qcm9qZWN0OwotCi0gICAgLyoqIFBhY2thZ2UgbmFtZSAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLQotICAgIC8qKiBEZWJ1ZyBwYWNrYWdlIG5hbWUgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVidWdQYWNrYWdlTmFtZTsKLQotICAgIC8qKiBJRmlsZSB0byB0aGUgcGFja2FnZSAoLmFwaykgZmlsZSAqLwotICAgIHByaXZhdGUgZmluYWwgSUZpbGUgbVBhY2thZ2VGaWxlOwotCi0gICAgLyoqIGRlYnVnZ2FibGUgYXR0cmlidXRlIG9mIHRoZSBtYW5pZmVzdCBmaWxlLiAqLwotICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBtRGVidWdnYWJsZTsKLQotICAgIC8qKiBSZXF1aXJlZCBBcGkgbGV2ZWwgYnkgdGhlIGFwcC4gbnVsbCBtZWFucyBubyByZXF1aXJlbWVudHMgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUmVxdWlyZWRBcGlWZXJzaW9uTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBJbnN0YWxsUmV0cnlNb2RlIG1SZXRyeU1vZGUgPSBJbnN0YWxsUmV0cnlNb2RlLk5FVkVSOwotCi0gICAgLyoqIExhdW5jaCBhY3Rpb24uICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJQW5kcm9pZExhdW5jaEFjdGlvbiBtTGF1bmNoQWN0aW9uOwotCi0gICAgLyoqIHRoZSBsYXVuY2ggb2JqZWN0ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkTGF1bmNoIG1MYXVuY2g7Ci0KLSAgICAvKiogdGhlIG1vbml0b3Igb2JqZWN0ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1Nb25pdG9yOwotCi0gICAgLyoqIGRlYnVnIG1vZGUgZmxhZyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVidWdNb2RlOwotCi0gICAgLyoqIGN1cnJlbnQgbnVtYmVyIG9mIGxhdW5jaCBhdHRlbXB0cyAqLwotICAgIHByaXZhdGUgaW50IG1BdHRlbXB0Q291bnQgPSAwOwotCi0gICAgLyoqIGNhbmNlbGxhdGlvbiBzdGF0ZSBvZiBsYXVuY2ggKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQmFzaWMgY29uc3RydWN0b3Igd2l0aCBhY3Rpdml0eSBhbmQgcGFja2FnZSBpbmZvLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGVjbGlwc2UgcHJvamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIEFuZHJvaWQgYXBwCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2UgbmFtZSBvZiBBbmRyb2lkIGFwcAotICAgICAqIEBwYXJhbSBkZWJ1Z1BhY2thZ2VOYW1lIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIEFuZHJpb2QgYXBwIHRvIGRlYnVnCi0gICAgICogQHBhcmFtIGxhdW5jaEFjdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBhZnRlciBhcHAgaW5zdGFsbAotICAgICAqIEBwYXJhbSBwYWNrIElGaWxlIHRvIHRoZSBwYWNrYWdlICguYXBrKSBmaWxlCi0gICAgICogQHBhcmFtIGRlYnVnZ2FibGUgZGVidWdnYWJsZSBhdHRyaWJ1dGUgb2YgdGhlIGFwcCdzIG1hbmlmZXN0IGZpbGUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkQXBpVmVyc2lvbk51bWJlciByZXF1aXJlZCBTREsgdmVyc2lvbiBieSB0aGUgYXBwLiBudWxsIG1lYW5zIG5vIHJlcXVpcmVtZW50cy4KLSAgICAgKiBAcGFyYW0gbGF1bmNoIHRoZSBsYXVuY2ggb2JqZWN0Ci0gICAgICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgbGF1bmNoCi0gICAgICovCi0gICAgcHVibGljIERlbGF5ZWRMYXVuY2hJbmZvKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGRlYnVnUGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJQW5kcm9pZExhdW5jaEFjdGlvbiBsYXVuY2hBY3Rpb24sIElGaWxlIHBhY2ssIEJvb2xlYW4gZGVidWdnYWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZXF1aXJlZEFwaVZlcnNpb25OdW1iZXIsIEFuZHJvaWRMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgbVByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbURlYnVnUGFja2FnZU5hbWUgPSBkZWJ1Z1BhY2thZ2VOYW1lOwotICAgICAgICBtUGFja2FnZUZpbGUgPSBwYWNrOwotICAgICAgICBtTGF1bmNoQWN0aW9uID0gbGF1bmNoQWN0aW9uOwotICAgICAgICBtTGF1bmNoID0gbGF1bmNoOwotICAgICAgICBtTW9uaXRvciA9IG1vbml0b3I7Ci0gICAgICAgIG1EZWJ1Z2dhYmxlID0gZGVidWdnYWJsZTsKLSAgICAgICAgbVJlcXVpcmVkQXBpVmVyc2lvbk51bWJlciA9IHJlcXVpcmVkQXBpVmVyc2lvbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXZpY2Ugb24gd2hpY2ggdG8gbGF1bmNoIHRoZSBhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgSURldmljZSBnZXREZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGxhdW5jaCB0aGUgYXBwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV2aWNlKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZWNsaXBzZSBwcm9qZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gQW5kcm9pZCBhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9qZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgQW5kcm9pZCBhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFuZHJvaWQgYXBwIHByb2Nlc3MgbmFtZSB0aGF0IHRoZSBkZWJ1Z2dlciBzaG91bGQgY29ubmVjdCB0by4gVHlwaWNhbGx5IHRoaXMgaXMKLSAgICAgKiB0aGUgc2FtZSB2YWx1ZSBhcyB7QGxpbmsgI2dldFBhY2thZ2VOYW1lKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVidWdQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgaWYgKG1EZWJ1Z1BhY2thZ2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGVidWdQYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0UGFja2FnZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtUGFja2FnZUZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIEFuZHJvaWQgYXBwIGlzIG1hcmtlZCBhcyBkZWJ1Z2dhYmxlIGluIGl0cyBtYW5pZmVzdAotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGdldERlYnVnZ2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBtRGVidWdnYWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBhcGkgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBBbmRyb2lkIGFwcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkQXBpVmVyc2lvbk51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIG1SZXF1aXJlZEFwaVZlcnNpb25OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJldHJ5TW9kZSB0aGUgaW5zdGFsbCByZXRyeSBtb2RlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5TW9kZShJbnN0YWxsUmV0cnlNb2RlIHJldHJ5TW9kZSkgewotICAgICAgICB0aGlzLm1SZXRyeU1vZGUgPSByZXRyeU1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaW5zdGFsbGF0aW9uIHJldHJ5IG1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5zdGFsbFJldHJ5TW9kZSBnZXRSZXRyeU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmV0cnlNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxhdW5jaCBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFuZHJvaWRMYXVuY2hBY3Rpb24gZ2V0TGF1bmNoQWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUxhdW5jaEFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXVuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZExhdW5jaCBnZXRMYXVuY2goKSB7Ci0gICAgICAgIHJldHVybiBtTGF1bmNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGxhdW5jaCBwcm9ncmVzcyBtb25pdG9yCi0gICAgICovCi0gICAgcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1Nb25pdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZWJ1Z01vZGUgdGhlIGRlYnVnIG1vZGUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWdNb2RlKGJvb2xlYW4gZGVidWdNb2RlKSB7Ci0gICAgICAgIHRoaXMubURlYnVnTW9kZSA9IGRlYnVnTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGRlYnVnIGxhdW5jaAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWdNb2RlKCkgewotICAgICAgICByZXR1cm4gbURlYnVnTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZWFzZXMgdGhlIG51bWJlciBvZiBsYXVuY2ggYXR0ZW1wdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRBdHRlbXB0Q291bnQoKSB7Ci0gICAgICAgIG1BdHRlbXB0Q291bnQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGF1bmNoIGF0dGVtcHRzIG1hZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEF0dGVtcHRDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1BdHRlbXB0Q291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGlmIGxhdW5jaCBoYXMgYmVlbiBjYW5jZWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxsZWQoYm9vbGVhbiBjYW5jZWxsZWQpIHsKLSAgICAgICAgdGhpcy5tQ2FuY2VsbGVkID0gY2FuY2VsbGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBsYXVuY2ggaGFzIGJlZW4gY2FuY2VsbGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FuY2VsbGVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvRGV2aWNlQ2hvb3NlckRpYWxvZy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9EZXZpY2VDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWY0NTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9EZXZpY2VDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlLkRldmljZVN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklJbWFnZUxvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5JbWFnZUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5UYWJsZUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHMuQXZkU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0cy5BdmRTZWxlY3Rvci5EaXNwbGF5TW9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzLkF2ZFNlbGVjdG9yLklBdmRGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQSBkaWFsb2cgdGhhdCBsZXRzIHRoZSB1c2VyIGNob29zZSBhIGRldmljZSB0byBkZXBsb3kgYW4gYXBwbGljYXRpb24uCi0gKiBUaGUgdXNlciBjYW4gZWl0aGVyIGNob29zZSBhbiBleGl0aW5nIHJ1bm5pbmcgZGV2aWNlIChpbmNsdWRpbmcgcnVubmluZyBlbXVsYXRvcnMpCi0gKiBvciBzdGFydCBhIG5ldyBlbXVsYXRvciB1c2luZyBhbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzCi0gKiB0aGUgY3VycmVudCBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRGV2aWNlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9XSURUSCA9IDE2OwotCi0gICAgcHJpdmF0ZSBUYWJsZSBtRGV2aWNlVGFibGU7Ci0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBtVmlld2VyOwotICAgIHByaXZhdGUgQXZkU2VsZWN0b3IgbVByZWZlcnJlZEF2ZFNlbGVjdG9yOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBtRGV2aWNlSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtRW11bGF0b3JJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1NYXRjaEltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgbU5vTWF0Y2hJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1XYXJuaW5nSW1hZ2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERldmljZUNob29zZXJSZXNwb25zZSBtUmVzcG9uc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgSUFuZHJvaWRUYXJnZXQgbVByb2plY3RUYXJnZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZGsgbVNkazsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EZXZpY2VSYWRpb0J1dHRvbjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzYWJsZUF2ZFNlbGVjdGlvbkNoYW5nZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQmFzaWMgQ29udGVudCBQcm92aWRlciBmb3IgYSB0YWJsZSBmdWxsIG9mIHtAbGluayBJRGV2aWNlfSBvYmplY3RzLiBUaGUgaW5wdXQgaXMKLSAgICAgKiBhIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFuZHJvaWREZWJ1Z0JyaWRnZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEFuZHJvaWREZWJ1Z0JyaWRnZSlpbnB1dEVsZW1lbnQpLmdldERldmljZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgTGFiZWwgUHJvdmlkZXIgZm9yIHRoZSB7QGxpbmsgVGFibGVWaWV3ZXJ9IGluIHtAbGluayBEZXZpY2VDaG9vc2VyRGlhbG9nfS4KLSAgICAgKiBJdCBwcm92aWRlcyBsYWJlbHMgYW5kIGltYWdlcyBmb3Ige0BsaW5rIElEZXZpY2V9IG9iamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURldmljZSkgewotICAgICAgICAgICAgICAgIElEZXZpY2UgZGV2aWNlID0gKElEZXZpY2UpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuaXNFbXVsYXRvcigpID8gbUVtdWxhdG9ySW1hZ2UgOiBtRGV2aWNlSW1hZ2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNvbXBhdGliaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmlzRW11bGF0b3IoKSA9PSBmYWxzZSkgeyAvLyBwaHlzaWNhbCBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIGRldmljZVZlcnNpb24gPSBTZGsuZ2V0RGV2aWNlVmVyc2lvbihkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1XYXJuaW5nSW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24uY2FuUnVuKG1Qcm9qZWN0VGFyZ2V0LmdldFZlcnNpb24oKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTm9NYXRjaEltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb2plY3QgaXMgY29tcGlsaW5nIGFnYWluc3QgYW4gYWRkLW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3B0aW9uYWwgQVBJIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIGRldmljZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm9qZWN0VGFyZ2V0LmlzUGxhdGZvcm0oKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoSW1hZ2UgOiBtV2FybmluZ0ltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBBdmRJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkSW5mbyBpbmZvID0gbVNkay5nZXRBdmRNYW5hZ2VyKCkuZ2V0QXZkKGRldmljZS5nZXRBdmROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qdmFsaWRBdmRPbmx5Ki8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1XYXJuaW5nSW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUHJvamVjdFRhcmdldC5pc0NvbXBhdGlibGVCYXNlRm9yKGluZm8uZ2V0VGFyZ2V0KCkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRjaEltYWdlIDogbU5vTWF0Y2hJbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURldmljZSkgewotICAgICAgICAgICAgICAgIElEZXZpY2UgZGV2aWNlID0gKElEZXZpY2UpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuaXNFbXVsYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5nZXRBdmROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTi9BIjsgLy8gZGV2aWNlcyBkb24ndCBoYXZlIEFWRCBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5pc0VtdWxhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmRJbmZvIGluZm8gPSBtU2RrLmdldEF2ZE1hbmFnZXIoKS5nZXRBdmQoZGV2aWNlLmdldEF2ZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyp2YWxpZEF2ZE9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIj8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby5nZXRUYXJnZXQoKS5nZXRGdWxsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlQnVpbGQgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0JVSUxEX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VCdWlsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VCdWlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlYnVnZ2FibGUgPSBkZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0RFQlVHR0FCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnZ2FibGUgIT0gbnVsbCAmJiBkZWJ1Z2dhYmxlLmVxdWFscygiMSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlllcyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRlU3RyaW5nKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXZpY2VDaG9vc2VyUmVzcG9uc2UgewotICAgICAgICBwcml2YXRlIEF2ZEluZm8gbUF2ZFRvTGF1bmNoOwotICAgICAgICBwcml2YXRlIElEZXZpY2UgbURldmljZVRvVXNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERldmljZVRvVXNlKElEZXZpY2UgZCkgewotICAgICAgICAgICAgbURldmljZVRvVXNlID0gZDsKLSAgICAgICAgICAgIG1BdmRUb0xhdW5jaCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdmRUb0xhdW5jaChBdmRJbmZvIGF2ZCkgewotICAgICAgICAgICAgbUF2ZFRvTGF1bmNoID0gYXZkOwotICAgICAgICAgICAgbURldmljZVRvVXNlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJRGV2aWNlIGdldERldmljZVRvVXNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUb1VzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBdmRJbmZvIGdldEF2ZFRvTGF1bmNoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdmRUb0xhdW5jaDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEZXZpY2VDaG9vc2VyRGlhbG9nKFNoZWxsIHBhcmVudCwgRGV2aWNlQ2hvb3NlclJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldCBwcm9qZWN0VGFyZ2V0KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIG1SZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVByb2plY3RUYXJnZXQgPSBwcm9qZWN0VGFyZ2V0OwotICAgICAgICBtU2RrID0gU2RrLmdldEN1cnJlbnQoKTsKLQotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuYWRkRGV2aWNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGxvYWRJbWFnZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgLy8gZG9uZSBsaXN0ZW5pbmcuCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5yZW1vdmVEZXZpY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBtRW11bGF0b3JJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIG1EZXZpY2VJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIG1NYXRjaEltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgbU5vTWF0Y2hJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIG1XYXJuaW5nSW1hZ2UuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgY2xlYW51cCgpOwotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotICAgICAgICBjbGVhbnVwKCk7Ci0gICAgICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbnRyb2wgY29udGVudCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0KLSAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBjcmVhdGVDb250ZW50cygpIGhhcyBoYXBwZW5lZCBzbyB0aGF0IHRoZQotICAgICAgICAvLyBvayBidXR0b24gaGFzIGJlZW4gY3JlYXRlZCAoaXQncyBjcmVhdGVkIGFmdGVyIHRoZSBjYWxsIHRvIGNyZWF0ZURpYWxvZ0FyZWEpCi0gICAgICAgIHVwZGF0ZURlZmF1bHRTZWxlY3Rpb24oKTsKLQotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBzZXQgZGlhbG9nIHRpdGxlCi0gICAgICAgIGdldFNoZWxsKCkuc2V0VGV4dCgiQW5kcm9pZCBEZXZpY2UgQ2hvb3NlciIpOwotCi0gICAgICAgIENvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChTdHJpbmcuZm9ybWF0KCJTZWxlY3QgYSBkZXZpY2UgY29tcGF0aWJsZSB3aXRoIHRhcmdldCAlcy4iLAotICAgICAgICAgICAgICAgIG1Qcm9qZWN0VGFyZ2V0LmdldEZ1bGxOYW1lKCkpKTsKLQotICAgICAgICBtRGV2aWNlUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKHRvcCwgU1dULlJBRElPKTsKLSAgICAgICAgbURldmljZVJhZGlvQnV0dG9uLnNldFRleHQoIkNob29zZSBhIHJ1bm5pbmcgQW5kcm9pZCBkZXZpY2UiKTsKLSAgICAgICAgbURldmljZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkZXZpY2VNb2RlID0gbURldmljZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgbURldmljZVRhYmxlLnNldEVuYWJsZWQoZGV2aWNlTW9kZSk7Ci0gICAgICAgICAgICAgICAgbVByZWZlcnJlZEF2ZFNlbGVjdG9yLnNldEVuYWJsZWQoIWRldmljZU1vZGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGV2aWNlU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlLnNldEF2ZFRvTGF1bmNoKG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5nZXRTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbmFibGVPa0J1dHRvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURldmljZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCi0gICAgICAgIC8vIG9mZnNldCB0aGUgc2VsZWN0b3IgZnJvbSB0aGUgcmFkaW8gYnV0dG9uCi0gICAgICAgIENvbXBvc2l0ZSBvZmZzZXRDb21wID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgb2Zmc2V0Q29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luTGVmdCA9IDMwOwotICAgICAgICBvZmZzZXRDb21wLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIG1EZXZpY2VUYWJsZSA9IG5ldyBUYWJsZShvZmZzZXRDb21wLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICBtRGV2aWNlVGFibGUuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IDEwMDsKLQotICAgICAgICBtRGV2aWNlVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbURldmljZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUhlbHBlci5jcmVhdGVUYWJsZUNvbHVtbihtRGV2aWNlVGFibGUsICJTZXJpYWwgTnVtYmVyIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwgIkFBQStBQUFBQUFBQUFBQUFBQUFBQUFBIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG51bGwgLyogcHJlZnMgbmFtZSAqLywgbnVsbCAvKiBwcmVmcyBzdG9yZSAqLyk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obURldmljZVRhYmxlLCAiQVZEIE5hbWUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiQUFBQUFBQUFBQUFBQUFBQUFBQSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsIC8qIHByZWZzIG5hbWUgKi8sIG51bGwgLyogcHJlZnMgc3RvcmUgKi8pOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1EZXZpY2VUYWJsZSwgIlRhcmdldCIsCi0gICAgICAgICAgICAgICAgU1dULkxFRlQsICJBQUErQW5kcm9pZCA5LjkuOSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsIC8qIHByZWZzIG5hbWUgKi8sIG51bGwgLyogcHJlZnMgc3RvcmUgKi8pOwotCi0gICAgICAgIFRhYmxlSGVscGVyLmNyZWF0ZVRhYmxlQ29sdW1uKG1EZXZpY2VUYWJsZSwgIkRlYnVnIiwKLSAgICAgICAgICAgICAgICBTV1QuTEVGVCwgIkRlYnVnIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG51bGwgLyogcHJlZnMgbmFtZSAqLywgbnVsbCAvKiBwcmVmcyBzdG9yZSAqLyk7Ci0KLSAgICAgICAgVGFibGVIZWxwZXIuY3JlYXRlVGFibGVDb2x1bW4obURldmljZVRhYmxlLCAiU3RhdGUiLAotICAgICAgICAgICAgICAgIFNXVC5MRUZULCAiYm9vdGxvYWRlciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBudWxsIC8qIHByZWZzIG5hbWUgKi8sIG51bGwgLyogcHJlZnMgc3RvcmUgKi8pOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgdmlld2VyIGZvciBpdAotICAgICAgICBtVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG1EZXZpY2VUYWJsZSk7Ci0gICAgICAgIG1WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIG1WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgbVZpZXdlci5zZXRJbnB1dChBbmRyb2lkRGVidWdCcmlkZ2UuZ2V0QnJpZGdlKCkpOwotCi0gICAgICAgIG1EZXZpY2VUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSGFuZGxlcyBzaW5nbGUtY2xpY2sgc2VsZWN0aW9uIG9uIHRoZSBkZXZpY2Ugc2VsZWN0b3IuCi0gICAgICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZURldmljZVNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEhhbmRsZXMgZG91YmxlLWNsaWNrIHNlbGVjdGlvbiBvbiB0aGUgZGV2aWNlIHNlbGVjdG9yLgotICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoZSBzaW5nbGUtY2xpY2sgaGFuZGxlciB3aWxsIHByb2JhYmx5IGFscmVhZHkgaGF2ZSBiZWVuIGNhbGxlZC4KLSAgICAgICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZURldmljZVNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChpc09rQnV0dG9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQnV0dG9uIHJhZGlvMiA9IG5ldyBCdXR0b24odG9wLCBTV1QuUkFESU8pOwotICAgICAgICByYWRpbzIuc2V0VGV4dCgiTGF1bmNoIGEgbmV3IEFuZHJvaWQgVmlydHVhbCBEZXZpY2UiKTsKLQotICAgICAgICAvLyBvZmZzZXQgdGhlIHNlbGVjdG9yIGZyb20gdGhlIHJhZGlvIGJ1dHRvbgotICAgICAgICBvZmZzZXRDb21wID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgb2Zmc2V0Q29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkxlZnQgPSAzMDsKLSAgICAgICAgb2Zmc2V0Q29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3IgPSBuZXcgQXZkU2VsZWN0b3Iob2Zmc2V0Q29tcCwKLSAgICAgICAgICAgICAgICBtU2RrLmdldFNka0xvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgbVNkay5nZXRBdmRNYW5hZ2VyKCksCi0gICAgICAgICAgICAgICAgbmV3IE5vblJ1bm5pbmdBdmRGaWx0ZXIoKSwKLSAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZS5TSU1QTEVfU0VMRUNUSU9OKTsKLSAgICAgICAgbVByZWZlcnJlZEF2ZFNlbGVjdG9yLnNldFRhYmxlSGVpZ2h0SGludCgxMDApOwotICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5zZXRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSGFuZGxlcyBzaW5nbGUtY2xpY2sgc2VsZWN0aW9uIG9uIHRoZSBBVkQgc2VsZWN0b3IuCi0gICAgICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtRGlzYWJsZUF2ZFNlbGVjdGlvbkNoYW5nZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0QXZkVG9MYXVuY2gobVByZWZlcnJlZEF2ZFNlbGVjdG9yLmdldFNlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVPa0J1dHRvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBIYW5kbGVzIGRvdWJsZS1jbGljayBzZWxlY3Rpb24gb24gdGhlIEFWRCBzZWxlY3Rvci4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHNpbmdsZS1jbGljayBoYW5kbGVyIHdpbGwgcHJvYmFibHkgYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkCi0gICAgICAgICAgICAgKiBidXQgdGhlIHNlbGVjdGVkIGl0ZW0gY2FuIGhhdmUgY2hhbmdlZCBpbiBiZXR3ZWVuLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgIGlmIChpc09rQnV0dG9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rUHJlc3NlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICByZXR1cm4gdG9wOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotICAgICAgICBJSW1hZ2VMb2FkZXIgZGRtc0xvYWRlciA9IERkbXNQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKTsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGRtc1BsdWdpbi5nZXREaXNwbGF5KCk7Ci0gICAgICAgIElJbWFnZUxvYWRlciBhZHRMb2FkZXIgPSBBZHRQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKTsKLQotICAgICAgICBpZiAobURldmljZUltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1EZXZpY2VJbWFnZSA9IEltYWdlSGVscGVyLmxvYWRJbWFnZShkZG1zTG9hZGVyLCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAiZGV2aWNlLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9XSURUSCwgSUNPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FbXVsYXRvckltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbXVsYXRvckltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGRkbXNMb2FkZXIsIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICJlbXVsYXRvci5wbmciLCBJQ09OX1dJRFRILCBJQ09OX1dJRFRILCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWF0Y2hJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWF0Y2hJbWFnZSA9IEltYWdlSGVscGVyLmxvYWRJbWFnZShhZHRMb2FkZXIsIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICJtYXRjaC5wbmciLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIElDT05fV0lEVEgsIElDT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5vTWF0Y2hJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTm9NYXRjaEltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGFkdExvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgImVycm9yLnBuZyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9XSURUSCwgSUNPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVdhcm5pbmdJbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtV2FybmluZ0ltYWdlID0gSW1hZ2VIZWxwZXIubG9hZEltYWdlKGFkdExvYWRlciwgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgIndhcm5pbmcucG5nIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBJQ09OX1dJRFRILCBJQ09OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRpc3BsYXkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gZCB0aGUgZGV2aWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0YXRlU3RyaW5nKElEZXZpY2UgZCkgewotICAgICAgICBEZXZpY2VTdGF0ZSBkZXZpY2VTdGF0ZSA9IGQuZ2V0U3RhdGUoKTsKLSAgICAgICAgaWYgKGRldmljZVN0YXRlID09IERldmljZVN0YXRlLk9OTElORSkgewotICAgICAgICAgICAgcmV0dXJuICJPbmxpbmUiOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZVN0YXRlID09IERldmljZVN0YXRlLk9GRkxJTkUpIHsKLSAgICAgICAgICAgIHJldHVybiAiT2ZmbGluZSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlU3RhdGUgPT0gRGV2aWNlU3RhdGUuQk9PVExPQURFUikgewotICAgICAgICAgICAgcmV0dXJuICJCb290bG9hZGVyIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiPz8iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiB0aGUgYSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSB7QGxpbmsgQW5kcm9pZERlYnVnQnJpZGdlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBzZW50IGZyb20gYSBub24gVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIG5ldyBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDb25uZWN0ZWQoSURldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VDb25uZWN0ZWQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgZmluYWwgRGV2aWNlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSB0aGlzOwotICAgICAgICBleGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobURldmljZVRhYmxlLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIGFsbAotICAgICAgICAgICAgICAgICAgICBtVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWZhdWx0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5IG9mIEF2ZEluZm8gKHNpbmNlIGl0J3MgZmlsdGVyZWQgdG8gb25seSBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBydW5uaW5nIEFWRC4pCi0gICAgICAgICAgICAgICAgICAgIHJlZmlsbEF2ZExpc3QoZmFsc2UgLypyZWxvYWRBdmRzKi8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGlzIGRpc3Bvc2VkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZy4KLSAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RlbmVyLgotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UucmVtb3ZlRGV2aWNlQ2hhbmdlTGlzdGVuZXIoZGlhbG9nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIHRoZSBhIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgbmV3IGRldmljZS4KLSAgICAgKgotICAgICAqIEBzZWUgSURldmljZUNoYW5nZUxpc3RlbmVyI2RldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlIGRldmljZSkgewotICAgICAgICBkZXZpY2VDb25uZWN0ZWQoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBkZXZpY2UgZGF0YSBjaGFuZ2VkLCBvciB3aGVuIGNsaWVudHMgYXJlIHN0YXJ0ZWQvdGVybWluYXRlZCBvbiB0aGUgZGV2aWNlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRoYXQgd2FzIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIGNoYW5nZU1hc2sgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDaGFuZ2VkKElEZXZpY2UsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VDaGFuZ2VkKGZpbmFsIElEZXZpY2UgZGV2aWNlLCBpbnQgY2hhbmdlTWFzaykgewotICAgICAgICBpZiAoKGNoYW5nZU1hc2sgJiAoSURldmljZS5DSEFOR0VfU1RBVEUgfCBJRGV2aWNlLkNIQU5HRV9CVUlMRF9JTkZPKSkgIT0gMCkgewotICAgICAgICAgICAgZmluYWwgRGV2aWNlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSB0aGlzOwotICAgICAgICAgICAgZXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobURldmljZVRhYmxlLmlzRGlzcG9zZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmlld2VyLnJlZnJlc2goZGV2aWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWZhdWx0U2VsZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVmYXVsdFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXkgb2YgQXZkSW5mbyAoc2luY2UgaXQncyBmaWx0ZXJlZCB0byBvbmx5IGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbiBydW5uaW5nIEFWRCkuIFRoaXMgaXMgZG9uZSBvbiBkZXZpY2VDaGFuZ2VkIGJlY2F1c2UgdGhlIGF2ZCBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBhIChlbXVsYXRvcikgZGV2aWNlIG1heSBiZSB1cGRhdGVkIGFzIHRoZSBlbXVsYXRvciBib290cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWxsQXZkTGlzdChmYWxzZSAvKnJlbG9hZEF2ZHMqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFuZ2VkIGRldmljZSBpcyB0aGUgY3VycmVudCBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1cGRhdGUgdGhlIE9LIGJ1dHRvbiBiYXNlZCBvbiBpdHMgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IG1SZXNwb25zZS5nZXREZXZpY2VUb1VzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlT2tCdXR0b24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUgaXMgZGlzcG9zZWQsIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RlbmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKGRpYWxvZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZGlhbG9nIGlzIGluICJkZXZpY2UiIG1vZGUgKHRydWUpLCBvciBpbiAiYXZkIiBtb2RlIChmYWxzZSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGV2aWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBPSyBidXR0b24gb2YgdGhlIGRpYWxvZyBiYXNlZCBvbiB2YXJpb3VzIHNlbGVjdGlvbnMgaW4gdGhlIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlT2tCdXR0b24oKSB7Ci0gICAgICAgIEJ1dHRvbiBva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotICAgICAgICBpZiAoaXNEZXZpY2VNb2RlKCkpIHsKLSAgICAgICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQobVJlc3BvbnNlLmdldERldmljZVRvVXNlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBtUmVzcG9uc2UuZ2V0RGV2aWNlVG9Vc2UoKS5pc09ubGluZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQobVJlc3BvbnNlLmdldEF2ZFRvTGF1bmNoKCkgIT0gbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9rIGJ1dHRvbiBpcyBlbmFibGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc09rQnV0dG9uRW5hYmxlZCgpIHsKLSAgICAgICAgQnV0dG9uIG9rQnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotICAgICAgICByZXR1cm4gb2tCdXR0b24uaXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIHtAbGluayBSdW5uYWJsZX0gaW4gdGhlIFVJIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIHJ1bm5hYmxlIHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1EZXZpY2VUYWJsZS5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0cmVlIGlzIGRpc3Bvc2VkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZy4gbGV0cyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGxpc3RlbmVyLgotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURldmljZVNlbGVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbURldmljZVRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0gICAgICAgIGlmIChjb3VudCAhPSAxKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb24obnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBtRGV2aWNlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIE9iamVjdCBkYXRhID0gbVZpZXdlci5nZXRFbGVtZW50QXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBJRGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uKChJRGV2aWNlKWRhdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb24obnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1SZXNwb25zZS5zZXREZXZpY2VUb1VzZShkZXZpY2UpOwotICAgICAgICBlbmFibGVPa0J1dHRvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgZm9yIGEgZGVmYXVsdCBkZXZpY2UgdG8gc2VsZWN0LiBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBmb3IgdGhlIHJ1bm5pbmcKLSAgICAgKiBjbGllbnRzIG9uIGVhY2ggZGV2aWNlIGFuZCBmaW5kaW5nIG9uZSBzaW1pbGFyIHRvIHRoZSBvbmUgYmVpbmcgbGF1bmNoZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgZG9uZSBldmVyeSB0aW1lIHRoZSBkZXZpY2UgbGlzdCBjaGFuZ2VkIHVubGVzcyB0aGVyZSBpcyBhIGFscmVhZHkgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZWZhdWx0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobURldmljZVRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSA9IEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRCcmlkZ2UoKTsKLQotICAgICAgICAgICAgSURldmljZVtdIGRldmljZXMgPSBicmlkZ2UuZ2V0RGV2aWNlcygpOwotCi0gICAgICAgICAgICBmb3IgKElEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgIENsaWVudFtdIGNsaWVudHMgPSBkZXZpY2UuZ2V0Q2xpZW50cygpOwotCi0gICAgICAgICAgICAgICAgZm9yIChDbGllbnQgY2xpZW50IDogY2xpZW50cykgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUGFja2FnZU5hbWUuZXF1YWxzKGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0Q2xpZW50RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2ghIFNlbGVjdCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uKGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSdyZSBkb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlRGV2aWNlU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBOb25SdW5uaW5nQXZkRmlsdGVyIGltcGxlbWVudHMgSUF2ZEZpbHRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBJRGV2aWNlW10gbURldmljZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgICAgIG1EZXZpY2VzID0gQW5kcm9pZERlYnVnQnJpZGdlLmdldEJyaWRnZSgpLmdldERldmljZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChBdmRJbmZvIGF2ZCkgewotICAgICAgICAgICAgaWYgKG1EZXZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKElEZXZpY2UgZCA6IG1EZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUHJvamVjdFRhcmdldC5pc0NvbXBhdGlibGVCYXNlRm9yKGF2ZC5nZXRUYXJnZXQoKSkgPT0gZmFsc2UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmQuZ2V0TmFtZSgpLmVxdWFscyhkLmdldEF2ZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICAgICAgbURldmljZXMgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmaWxscyB0aGUgQVZEIGxpc3Qga2VlcGluZyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZmlsbEF2ZExpc3QoYm9vbGVhbiByZWxvYWRBdmRzKSB7Ci0gICAgICAgIC8vIHNhdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICAgIEF2ZEluZm8gc2VsZWN0ZWQgPSBtUHJlZmVycmVkQXZkU2VsZWN0b3IuZ2V0U2VsZWN0ZWQoKTsKLQotICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdGlvbiBjaGFuZ2UuCi0gICAgICAgIG1EaXNhYmxlQXZkU2VsZWN0aW9uQ2hhbmdlID0gdHJ1ZTsKLQotICAgICAgICAvLyByZWZyZXNoIHRoZSBsaXN0Ci0gICAgICAgIG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5yZWZyZXNoKGZhbHNlKTsKLQotICAgICAgICAvLyBhdHRlbXB0IHRvIHJlc2VsZWN0IHRoZSBwcm9wZXIgYXZkIGlmIG5lZWRlZAotICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB0aGUgc2VsZWN0aW9uIGlzIGxvc3QuIHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBlbXVsYXRvcgotICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcgdGhlIEFWRCB0aGF0IHdhcyBzZWxlY3RlZCB3YXMgbGF1bmNoZWQgZnJvbSBvdXRzaWRlIG9mIEVjbGlwc2UpLgotICAgICAgICAgICAgICAgIG1SZXNwb25zZS5zZXRBdmRUb0xhdW5jaChudWxsKTsKLSAgICAgICAgICAgICAgICBlbmFibGVPa0J1dHRvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZW5hYmxlIHRoZSBzZWxlY3Rpb24gY2hhbmdlCi0gICAgICAgIG1EaXNhYmxlQXZkU2VsZWN0aW9uQ2hhbmdlID0gZmFsc2U7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0VtcHR5TGF1bmNoQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0VtcHR5TGF1bmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NmQ3MmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9FbXB0eUxhdW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci0KLS8qKgotICogQSBsYXVuY2ggYWN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGFmdGVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbnN0YWxsZWQKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5TGF1bmNoQWN0aW9uIGltcGxlbWVudHMgSUFuZHJvaWRMYXVuY2hBY3Rpb24gewotCi0gICAgcHVibGljIGJvb2xlYW4gZG9MYXVuY2hBY3Rpb24oRGVsYXllZExhdW5jaEluZm8gaW5mbywgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gd2UncmUgbm90IHN1cHBvc2VkIHRvIGRvIGFueXRoaW5nLCBqdXN0IHJldHVybjsKLSAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIiUxJHMgaW5zdGFsbGVkIG9uIGRldmljZSIsCi0gICAgICAgICAgICAgICAgaW5mby5nZXRQYWNrYWdlRmlsZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKGluZm8uZ2V0UHJvamVjdCgpLCBtc2csICJEb25lISIpOwotICAgICAgICAvLyByZXR1cm4gZmFsc2Ugc28gbGF1bmNoIGNvbnRyb2xsZXIgd2lsbCBub3Qgd2FpdCBmb3IgZGVidWdnZXIgdG8gYXR0YWNoCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gInN5bmMiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvRW11bGF0b3JDb25maWdUYWIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvRW11bGF0b3JDb25maWdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkNGM0Yi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0VtdWxhdG9yQ29uZmlnVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkFuZHJvaWRMYXVuY2hDb25maWd1cmF0aW9uLlRhcmdldE1vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbi5BbmRyb2lkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5OdWxsU2RrTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkF2ZE1hbmFnZXIuQXZkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzLkF2ZFNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHMuQXZkU2VsZWN0b3IuRGlzcGxheU1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIExhdW5jaCBjb25maWd1cmF0aW9uIHRhYiB0byBjb250cm9sIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBFbXVsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRW11bGF0b3JDb25maWdUYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW11bXSBORVRXT1JLX1NQRUVEUyA9IG5ldyBTdHJpbmdbXVtdIHsKLSAgICAgICAgeyAiRnVsbCIsICJmdWxsIiB9LCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsgIkdTTSIsICJnc20iIH0sIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgeyAiSFNDU0QiLCAiaHNjc2QiIH0sIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgeyAiR1BSUyIsICJncHJzIiB9LCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsgIkVER0UiLCAiZWRnZSIgfSwgLy8kTk9OLU5MUy0yJAotICAgICAgICB7ICJVTVRTIiwgInVtdHMiIH0sIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgeyAiSFNQREEiLCAiaHNkcGEiIH0sIC8vJE5PTi1OTFMtMiQKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW11bXSBORVRXT1JLX0xBVEVOQ0lFUyA9IG5ldyBTdHJpbmdbXVtdIHsKLSAgICAgICAgeyAiTm9uZSIsICJub25lIiB9LCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsgIkdQUlMiLCAiZ3BycyIgfSwgLy8kTk9OLU5MUy0yJAotICAgICAgICB7ICJFREdFIiwgImVkZ2UiIH0sIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgeyAiVU1UUyIsICJ1bXRzIiB9LCAvLyROT04tTkxTLTIkCi0gICAgfTsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1BdXRvVGFyZ2V0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1NYW51YWxUYXJnZXRCdXR0b247Ci0KLSAgICBwcml2YXRlIEF2ZFNlbGVjdG9yIG1QcmVmZXJyZWRBdmRTZWxlY3RvcjsKLQotICAgIHByaXZhdGUgQ29tYm8gbVNwZWVkQ29tYm87Ci0KLSAgICBwcml2YXRlIENvbWJvIG1EZWxheUNvbWJvOwotCi0gICAgcHJpdmF0ZSBHcm91cCBtRW11bGF0b3JPcHRpb25zR3JvdXA7Ci0KLSAgICBwcml2YXRlIFRleHQgbUVtdWxhdG9yQ0xPcHRpb25zOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVdpcGVEYXRhQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbU5vQm9vdEFuaW1CdXR0b247Ci0KLSAgICBwcml2YXRlIExhYmVsIG1QcmVmZXJyZWRBdmRMYWJlbDsKLQotICAgIHByaXZhdGUgSUFuZHJvaWRUYXJnZXQgbVByb2plY3RUYXJnZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbXVsYXRvciByZWFkeSBzcGVlZCBvcHRpb24gdmFsdWUuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBpbmRleCBvZiB0aGUgY29tYm8gc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNwZWVkKGludCB2YWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIE5FVFdPUktfU1BFRURTW3ZhbHVlXVsxXTsKLSAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBORVRXT1JLX1NQRUVEU1tMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1NQRUVEXVsxXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVtdWxhdG9yIHJlYWR5IG5ldHdvcmsgbGF0ZW5jeSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGluZGV4IG9mIHRoZSBjb21ibyBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVsYXkoaW50IHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gTkVUV09SS19MQVRFTkNJRVNbdmFsdWVdWzFdOwotICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIE5FVFdPUktfTEFURU5DSUVTW0xhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfREVMQVldWzFdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgRW11bGF0b3JDb25maWdUYWIoKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLSAgICAgICAgLy8gcmVsb2FkIHRoZSBBVkRzIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgdXAgdG8gZGF0ZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2RrLmdldEN1cnJlbnQoKS5nZXRBdmRNYW5hZ2VyKCkucmVsb2FkQXZkcyhOdWxsU2RrTG9nLmdldExvZ2dlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgdGhlIEFWRCBNYW5hZ2VyIGZhaWxlZCB0byBmaW5kIHRoZSBmb2xkZXIgaW4gd2hpY2ggdGhlIEFWRHMgYXJlCi0gICAgICAgICAgICAvLyBzdG9yZWQuIFRoZXJlIGlzbid0IG11Y2ggd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIH0KLQotICAgICAgICBDb21wb3NpdGUgdG9wQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNldENvbnRyb2wodG9wQ29tcCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdG9wTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICB0b3BMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgdG9wQ29tcC5zZXRMYXlvdXQodG9wTGF5b3V0KTsKLSAgICAgICAgdG9wQ29tcC5zZXRGb250KGZvbnQpOwotCi0gICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dDsKLQotICAgICAgICAvLyByYWRpbyBidXR0b24gZm9yIHRoZSB0YXJnZXQgbW9kZQotICAgICAgICBHcm91cCB0YXJnZXRNb2RlR3JvdXAgPSBuZXcgR3JvdXAodG9wQ29tcCwgU1dULk5PTkUpOwotICAgICAgICB0YXJnZXRNb2RlR3JvdXAuc2V0VGV4dCgiRGVwbG95bWVudCBUYXJnZXQgU2VsZWN0aW9uIE1vZGUiKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgdGFyZ2V0TW9kZUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIHRhcmdldE1vZGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGFyZ2V0TW9kZUdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgbU1hbnVhbFRhcmdldEJ1dHRvbiA9IG5ldyBCdXR0b24odGFyZ2V0TW9kZUdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtTWFudWFsVGFyZ2V0QnV0dG9uLnNldFRleHQoIk1hbnVhbCIpOwotICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgb25seSAyIHJhZGlvIGJ1dHRvbnMsIHdlIGNhbiBwdXQgYSBsaXN0ZW5lciBvbiBvbmx5IG9uZSAodGhleQotICAgICAgICAvLyBhcmUgYm90aCBjYWxsZWQgb24gc2VsZWN0IGFuZCB1bnNlbGVjdCBldmVudC4KLQotICAgICAgICAvLyBhZGQgdGhlIHJhZGlvIGJ1dHRvbgotICAgICAgICBtQXV0b1RhcmdldEJ1dHRvbiA9IG5ldyBCdXR0b24odGFyZ2V0TW9kZUdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtQXV0b1RhcmdldEJ1dHRvbi5zZXRUZXh0KCJBdXRvbWF0aWMiKTsKLSAgICAgICAgbUF1dG9UYXJnZXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBtQXV0b1RhcmdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGF1dG8gPSBtQXV0b1RhcmdldEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3Iuc2V0RW5hYmxlZChhdXRvKTsKLSAgICAgICAgICAgICAgICBtUHJlZmVycmVkQXZkTGFiZWwuc2V0RW5hYmxlZChhdXRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIG9mZnNldENvbXAgPSBuZXcgQ29tcG9zaXRlKHRhcmdldE1vZGVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBvZmZzZXRDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luTGVmdCA9IDMwOwotICAgICAgICBvZmZzZXRDb21wLnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIG1QcmVmZXJyZWRBdmRMYWJlbCA9IG5ldyBMYWJlbChvZmZzZXRDb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1QcmVmZXJyZWRBdmRMYWJlbC5zZXRUZXh0KCJTZWxlY3QgYSBwcmVmZXJyZWQgQW5kcm9pZCBWaXJ0dWFsIERldmljZSBmb3IgZGVwbG95bWVudDoiKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHNlbGVjdG9yIHdpdGggbm8gbWFuYWdlciwgd2UnbGwgcmVzZXQgdGhlIG1hbmFnZXIgZXZlcnkgdGltZSB0aGlzIGlzCi0gICAgICAgIC8vIGRpc3BsYXllZCB0byBlbnN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IG9uZSAoZGlhbG9nIGlzIHJldXNlZCBidXQgU0RLIGNvdWxkIGhhdmUKLSAgICAgICAgLy8gYmVlbiBjaGFuZ2VkIGluIGJldHdlZW4uCi0gICAgICAgIG1QcmVmZXJyZWRBdmRTZWxlY3RvciA9IG5ldyBBdmRTZWxlY3RvcihvZmZzZXRDb21wLAotICAgICAgICAgICAgICAgIFNkay5nZXRDdXJyZW50KCkuZ2V0U2RrTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICBudWxsIC8qIGF2ZCBtYW5hZ2VyICovLAotICAgICAgICAgICAgICAgIERpc3BsYXlNb2RlLlNJTVBMRV9DSEVDSyk7Ci0gICAgICAgIG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5zZXRUYWJsZUhlaWdodEhpbnQoMTAwKTsKLSAgICAgICAgbVByZWZlcnJlZEF2ZFNlbGVjdG9yLnNldFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBlbXVsYXRvciBzaXplCi0gICAgICAgIG1FbXVsYXRvck9wdGlvbnNHcm91cCA9IG5ldyBHcm91cCh0b3BDb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1FbXVsYXRvck9wdGlvbnNHcm91cC5zZXRUZXh0KCJFbXVsYXRvciBsYXVuY2ggcGFyYW1ldGVyczoiKTsKLSAgICAgICAgbUVtdWxhdG9yT3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIG1FbXVsYXRvck9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgbUVtdWxhdG9yT3B0aW9uc0dyb3VwLnNldEZvbnQoZm9udCk7Ci0KLSAgICAgICAgLy8gbmV0d29yayBvcHRpb25zCi0gICAgICAgIG5ldyBMYWJlbChtRW11bGF0b3JPcHRpb25zR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJOZXR3b3JrIFNwZWVkOiIpOwotCi0gICAgICAgIG1TcGVlZENvbWJvID0gbmV3IENvbWJvKG1FbXVsYXRvck9wdGlvbnNHcm91cCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGZvciAoU3RyaW5nW10gc3BlZWQgOiBORVRXT1JLX1NQRUVEUykgewotICAgICAgICAgICAgbVNwZWVkQ29tYm8uYWRkKHNwZWVkWzBdKTsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtU3BlZWRDb21iby5wYWNrKCk7Ci0KLSAgICAgICAgbmV3IExhYmVsKG1FbXVsYXRvck9wdGlvbnNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk5ldHdvcmsgTGF0ZW5jeToiKTsKLQotICAgICAgICBtRGVsYXlDb21ibyA9IG5ldyBDb21ibyhtRW11bGF0b3JPcHRpb25zR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCi0gICAgICAgIGZvciAoU3RyaW5nW10gZGVsYXkgOiBORVRXT1JLX0xBVEVOQ0lFUykgewotICAgICAgICAgICAgbURlbGF5Q29tYm8uYWRkKGRlbGF5WzBdKTsKLSAgICAgICAgfQotICAgICAgICBtRGVsYXlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtRGVsYXlDb21iby5wYWNrKCk7Ci0KLSAgICAgICAgLy8gd2lwZSBkYXRhIG9wdGlvbgotICAgICAgICBtV2lwZURhdGFCdXR0b24gPSBuZXcgQnV0dG9uKG1FbXVsYXRvck9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgbVdpcGVEYXRhQnV0dG9uLnNldFRleHQoIldpcGUgVXNlciBEYXRhIik7Ci0gICAgICAgIG1XaXBlRGF0YUJ1dHRvbi5zZXRUb29sVGlwVGV4dCgiQ2hlY2sgdGhpcyBpZiB5b3Ugd2FudCB0byB3aXBlIHlvdXIgdXNlciBkYXRhIGVhY2ggdGltZSB5b3Ugc3RhcnQgdGhlIGVtdWxhdG9yLiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgY29uZmlybWF0aW9uIHdoZW4gdGhlIGVtdWxhdG9yIHN0YXJ0cy4iKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBtV2lwZURhdGFCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1XaXBlRGF0YUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gbm8gYm9vdCBhbmltIG9wdGlvbgotICAgICAgICBtTm9Cb290QW5pbUJ1dHRvbiA9IG5ldyBCdXR0b24obUVtdWxhdG9yT3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBtTm9Cb290QW5pbUJ1dHRvbi5zZXRUZXh0KCJEaXNhYmxlIEJvb3QgQW5pbWF0aW9uIik7Ci0gICAgICAgIG1Ob0Jvb3RBbmltQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJDaGVjayB0aGlzIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGJvb3QgYW5pbWF0aW9uLiBUaGlzIGNhbiBoZWxwIHRoZSBlbXVsYXRvciBzdGFydCBmYXN0ZXIgb24gc2xvdyBtYWNoaW5lcy4iKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBtTm9Cb290QW5pbUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbU5vQm9vdEFuaW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGN1c3RvbSBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBlbXVsYXRvcgotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKG1FbXVsYXRvck9wdGlvbnNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIkFkZGl0aW9uYWwgRW11bGF0b3IgQ29tbWFuZCBMaW5lIE9wdGlvbnMiKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIG1FbXVsYXRvckNMT3B0aW9ucyA9IG5ldyBUZXh0KG1FbXVsYXRvck9wdGlvbnNHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbUVtdWxhdG9yQ0xPcHRpb25zLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtRW11bGF0b3JDTE9wdGlvbnMuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiVGFyZ2V0IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBEZG1zUGx1Z2luLmdldEltYWdlTG9hZGVyKCkubG9hZEltYWdlKCJlbXVsYXRvci5wbmciLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF2ZExpc3QoQXZkTWFuYWdlciBhdmRNYW5hZ2VyKSB7Ci0gICAgICAgIGlmIChhdmRNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGF2ZE1hbmFnZXIgPSBTZGsuZ2V0Q3VycmVudCgpLmdldEF2ZE1hbmFnZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmVmZXJyZWRBdmRTZWxlY3Rvci5zZXRNYW5hZ2VyKGF2ZE1hbmFnZXIpOwotICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3Iuc2V0RmlsdGVyKG1Qcm9qZWN0VGFyZ2V0KTsKLSAgICAgICAgbVByZWZlcnJlZEF2ZFNlbGVjdG9yLnJlZnJlc2goZmFsc2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBBdmRNYW5hZ2VyIGF2ZE1hbmFnZXIgPSBTZGsuZ2V0Q3VycmVudCgpLmdldEF2ZE1hbmFnZXIoKTsKLQotICAgICAgICBUYXJnZXRNb2RlIG1vZGUgPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1RBUkdFVF9NT0RFOyAvLyB0cnVlID09IGF1dG9tYXRpYwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9kZSA9IFRhcmdldE1vZGUuZ2V0TW9kZShjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9UQVJHRVRfTU9ERSwgbW9kZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbGV0J3Mgbm90IGRvIGFueXRoaW5nIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0gICAgICAgIG1BdXRvVGFyZ2V0QnV0dG9uLnNldFNlbGVjdGlvbihtb2RlLmdldFZhbHVlKCkpOwotICAgICAgICBtTWFudWFsVGFyZ2V0QnV0dG9uLnNldFNlbGVjdGlvbighbW9kZS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAvLyBsb29rIGZvciB0aGUgcHJvamVjdCBuYW1lIHRvIGdldCBpdHMgdGFyZ2V0LgotICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSAiIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgc3RyaW5nVmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBsZXQncyBub3QgZG8gYW55dGhpbmcgaGVyZSwgd2UnbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgIH0KLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgQW5kcm9pZCBwcm9qZWN0cyBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0gICAgICAgIElKYXZhUHJvamVjdFtdIHByb2plY3RzID0gQmFzZVByb2plY3RIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3RzKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgcHJvamVjdCB3aG9zZSBuYW1lIHdlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgIGZvciAoSUphdmFQcm9qZWN0IHAgOiBwcm9qZWN0cykgewotICAgICAgICAgICAgICAgIGlmIChwLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHN0cmluZ1ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgQVZEIGxpc3QKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb2plY3RUYXJnZXQgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldChwcm9qZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUF2ZExpc3QoYXZkTWFuYWdlcik7Ci0KLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9BVkRfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGxldCdzIG5vdCBkbyBhbnl0aGluZyBoZXJlLCB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJpbmdWYWx1ZSAhPSBudWxsICYmIHN0cmluZ1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBhdmRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF2ZEluZm8gdGFyZ2V0QXZkID0gYXZkTWFuYWdlci5nZXRBdmQoc3RyaW5nVmFsdWUsIHRydWUgLyp2YWxpZEF2ZE9ubHkqLyk7Ci0gICAgICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3Iuc2V0U2VsZWN0aW9uKHRhcmdldEF2ZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJlZmVycmVkQXZkU2VsZWN0b3Iuc2V0U2VsZWN0aW9uKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfV0lQRV9EQVRBOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX1dJUEVfREFUQSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGxldCdzIG5vdCBkbyBhbnl0aGluZyBoZXJlLCB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgfQotICAgICAgICBtV2lwZURhdGFCdXR0b24uc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQotICAgICAgICB2YWx1ZSA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfTk9fQk9PVF9BTklNOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX05PX0JPT1RfQU5JTSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGxldCdzIG5vdCBkbyBhbnl0aGluZyBoZXJlLCB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgfQotICAgICAgICBtTm9Cb290QW5pbUJ1dHRvbi5zZXRTZWxlY3Rpb24odmFsdWUpOwotCi0gICAgICAgIGludCBpbmRleCA9IC0xOwotCi0gICAgICAgIGluZGV4ID0gTGF1bmNoQ29uZmlnRGVsZWdhdGUuREVGQVVMVF9TUEVFRDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluZGV4ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGxldCdzIG5vdCBkbyBhbnl0aGluZyBoZXJlLCB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIG1TcGVlZENvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3BlZWRDb21iby5zZWxlY3QoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXggPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX0RFTEFZOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5kZXggPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbGV0J3Mgbm90IGRvIGFueXRoaW5nIGhlcmUsIHdlJ2xsIHB1dCBhIHByb3BlciB2YWx1ZSBpbgotICAgICAgICAgICAgLy8gcGVyZm9ybUFwcGx5IGFueXdheQotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgbURlbGF5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1EZWxheUNvbWJvLnNlbGVjdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29tbWFuZExpbmUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29tbWFuZExpbmUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9DT01NQU5ETElORSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbGV0J3Mgbm90IGRvIGFueXRoaW5nIGhlcmUsIHdlJ2xsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRW11bGF0b3JDTE9wdGlvbnMuc2V0VGV4dChjb21tYW5kTGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9UQVJHRVRfTU9ERSwKLSAgICAgICAgICAgICAgICBtQXV0b1RhcmdldEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIEF2ZEluZm8gYXZkID0gbVByZWZlcnJlZEF2ZFNlbGVjdG9yLmdldFNlbGVjdGVkKCk7Ci0gICAgICAgIGlmIChhdmQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9BVkRfTkFNRSwgYXZkLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0FWRF9OQU1FLCAoU3RyaW5nKW51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfU1BFRUQsCi0gICAgICAgICAgICAgICAgbVNwZWVkQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfREVMQVksCi0gICAgICAgICAgICAgICAgbURlbGF5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQ09NTUFORExJTkUsCi0gICAgICAgICAgICAgICAgbUVtdWxhdG9yQ0xPcHRpb25zLmdldFRleHQoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfV0lQRV9EQVRBLAotICAgICAgICAgICAgICAgIG1XaXBlRGF0YUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfTk9fQk9PVF9BTklNLAotICAgICAgICAgICAgICAgIG1Ob0Jvb3RBbmltQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9UQVJHRVRfTU9ERSwKLSAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1RBUkdFVF9NT0RFLmdldFZhbHVlKCkpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX1NQRUVELAotICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfU1BFRUQpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0RFTEFZLAotICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfREVMQVkpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX1dJUEVfREFUQSwKLSAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX1dJUEVfREFUQSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfTk9fQk9PVF9BTklNLAotICAgICAgICAgICAgICAgIExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfTk9fQk9PVF9BTklNKTsKLQotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgU3RyaW5nIGVtdU9wdGlvbnMgPSBzdG9yZS5nZXRTdHJpbmcoQWR0UGx1Z2luLlBSRUZTX0VNVV9PUFRJT05TKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9DT01NQU5ETElORSwgZW11T3B0aW9ucyk7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0lBbmRyb2lkTGF1bmNoQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0lBbmRyb2lkTGF1bmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODNmOGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9JQW5kcm9pZExhdW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5EZWxheWVkTGF1bmNoSW5mbzsKLQotLyoqCi0gKiBBbiBhY3Rpb24gdG8gcGVyZm9ybSBhZnRlciBwZXJmb3JtaW5nIGEgbGF1bmNoIG9mIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW5kcm9pZExhdW5jaEFjdGlvbiB7Ci0KLSAgICAvKiogCi0gICAgICogRG8gdGhlIGxhdW5jaAotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmZvIHRoZSB7QGxpbmsgRGVsYXllZExhdW5jaEluZm99IHRoYXQgY29udGFpbnMgbGF1bmNoIGRldGFpbHMKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBBbmRyb2lkIGRldmljZSB0byBwZXJmb3JtIGFjdGlvbiBvbgotICAgICAqIEByZXR1cm5zIHRydWUgaWYgbGF1bmNoIHdhcyBzdWNjZXNzZnVsbHksIGFuZCBjb250cm9sbGVyIHNob3VsZCB3YWl0IGZvciBkZWJ1Z2dlciB0byBhdHRhY2gKLSAgICAgKiAgICAgKGlmIGFwcGxpY2FibGUpCi0gICAgICovCi0gICAgYm9vbGVhbiBkb0xhdW5jaEFjdGlvbihEZWxheWVkTGF1bmNoSW5mbyBpbmZvLCBJRGV2aWNlIGRldmljZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgbGF1bmNoLCB0byBiZSB1c2VkIGZvciBsb2dnaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotICAgICAqLwotICAgIFN0cmluZyBnZXRMYXVuY2hEZXNjcmlwdGlvbigpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9JTGF1bmNoQ29udHJvbGxlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9JTGF1bmNoQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTVjMDA5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvSUxhdW5jaENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgbWFuYWdpbmcgQW5kcm9pZCBsYXVuY2hlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXVuY2hDb250cm9sbGVyIHsKLQotICAgLyoqCi0gICAgKiBMYXVuY2hlcyBhbiBhcHBsaWNhdGlvbiBvbiBhIGRldmljZSBvciBlbXVsYXRvcgotICAgICoKLSAgICAqIEBwYXJhbSBsYXVuY2hJbmZvIHRoZSB7QGxpbmsgRGVsYXllZExhdW5jaEluZm99IHRoYXQgaW5kaWNhdGVzIHRoZSBsYXVuY2ggYWN0aW9uCi0gICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiBvbgotICAgICovCi0gICAgcHVibGljIHZvaWQgbGF1bmNoQXBwKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8sIElEZXZpY2UgZGV2aWNlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGEgbGF1bmNoCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhdW5jaEluZm8gdGhlIHtAbGluayBEZWxheWVkTGF1bmNoSW5mb30gdG8gY2FuY2VsCi0gICAgICovCi0gICAgdm9pZCBzdG9wTGF1bmNoKERlbGF5ZWRMYXVuY2hJbmZvIGxhdW5jaEluZm8pOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9KVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0pVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmY2IyNC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0pVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2g7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0Lmp1bml0LmxhdW5jaGVyLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogPHA+Ci0gKiBGb3IgQW5kcm9pZCBwcm9qZWN0cywgYW5kcm9pZC5qYXIgZ2V0cyBhZGRlZCB0byB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gb2YKLSAqIEpVbml0IHRlc3RzIGFzIGEgYm9vdHN0cmFwIGVudHJ5LiBUaGlzIGJyZWFrcyBKVW5pdCB0ZXN0cyBhcyBhbmRyb2lkLmphcgotICogY29udGFpbnMgYSBza2VsZXRvbiB2ZXJzaW9uIG9mIEpVbml0IGNsYXNzZXMgYW5kIHRoZSBKVk0gd2lsbCBzdG9wIHdpdGggYW4gZXJyb3Igc2ltaWxhcgotICogdG86IDxibG9ja3F1b3RlPiBFcnJvciBvY2N1cnJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgVk0KLSAqIGphdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvcjogamF2YS9sYW5nL3JlZi9GaW5hbFJlZmVyZW5jZSA8L2Jsb2NrcXVvdGU+Ci0gKiA8cD4KLSAqIEF0IGNvbXBpbGUgdGltZSwgRWNsaXBzZSBkb2VzIG5vdCBrbm93IHRoYXQgdGhlcmUgaXMgbm8gdmFsaWQganVuaXQuamFyIGluCi0gKiB0aGUgY2xhc3NwYXRoIHNpbmNlIGl0IGNhbiBmaW5kIGEgY29ycmVjdCByZWZlcmVuY2UgdG8gYWxsIHRoZSBuZWNlc3NhcnkKLSAqIG9yZy5qdW5pdC4qIGNsYXNzZXMgaW4gdGhlIGFuZHJvaWQuamFyIHNvIGl0IGRvZXMgbm90IHByb21wdCB0aGUgdXNlciB0byBhZGQKLSAqIHRoZSBKVW5pdDMgb3IgSlVuaXQ0IGphci4KLSAqIDxwPgotICogVGhpcyBkZWxlZ2F0ZXMgcmVtb3ZlcyB0aGUgYW5kcm9pZC5qYXIgZnJvbSB0aGUgYm9vdHN0cmFwIHBhdGggYW5kIGlmCi0gKiBuZWNlc3NhcnkgYWxzbyBwdXRzIGJhY2sgdGhlIGp1bml0LmphciBpbiB0aGUgdXNlciBjbGFzc3BhdGguCi0gKiA8cD4KLSAqIFRoaXMgZGVsZWdhdGUgd2lsbCBiZSBwcmVzZW50IGZvciBib3RoIEphdmEgYW5kIEFuZHJvaWQgcHJvamVjdHMgKGRlbGVnYXRlcwotICogc2V0dGluZyBpbnN0ZWFkIG9mIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCkgYnV0IHRoZSBiZWhhdmlvciBmb3IgSmF2YQotICogcHJvamVjdHMgc2hvdWxkIGJlIG5ldXRyYWwgc2luY2U6Ci0gKiA8b2w+Ci0gKiA8bGk+SmF2YSB0ZXN0cyBjYW4gb25seSBjb21waWxlIChhbmQgdGhlbiBydW4pIHdoZW4gYSB2YWxpZCBqdW5pdC5qYXIgaXMKLSAqIHByZXNlbnQKLSAqIDxsaT5UaGVyZSBpcyBubyBhbmRyb2lkLmphciBpbiBKYXZhIHByb2plY3RzCi0gKiA8L29sPgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZSBleHRlbmRzIEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKVU5JVF9KQVIgPSAianVuaXQuamFyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdW10gZ2V0Qm9vdHBhdGhFeHQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXVtdIGJvb3RwYXRoID0gc3VwZXIuZ2V0Qm9vdHBhdGhFeHQoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBmaXhCb290cGF0aEV4dChib290cGF0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzcGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzcGF0aCA9IHN1cGVyLmdldENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGZpeENsYXNzcGF0aChjbGFzc3BhdGgsIGdldEphdmFQcm9qZWN0TmFtZShjb25maWd1cmF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgYW5kcm9pZC5qYXIgZnJvbSB0aGUgYm9vdHN0cmFwIHBhdGggaWYgcHJlc2VudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYm9vdHBhdGggQXJyYXkgb2YgQXJyYXlzIG9mIGJvb3RzdHJhcCBjbGFzcyBwYXRocwotICAgICAqIEByZXR1cm4gYSBuZXcgbW9kaWZpZWQgKGlmIGFwcGxpY2FibGUpIGJvb3RwYXRoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXVtdIGZpeEJvb3RwYXRoRXh0KFN0cmluZ1tdW10gYm9vdHBhdGgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib290cGF0aC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGJvb3RwYXRoW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGUgYW5kcm9pZC5qYXIgY2FuIG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKLSAgICAgICAgICAgICAgICAvLyBib290c3RyYXAgcGF0aCBvZiBhbmRyb2lkIHRlc3RzCi0gICAgICAgICAgICAgICAgaWYgKGJvb3RwYXRoW2ldWzBdLmVuZHNXaXRoKFNka0NvbnN0YW50cy5GTl9GUkFNRVdPUktfTElCUkFSWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vdHBhdGhbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9vdHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBqdW5pdC5qYXIgdG8gdGhlIHVzZXIgY2xhc3NwYXRoOyBzaW5jZSBFY2xpcHNlIHdhcyByZWx5aW5nIG9uCi0gICAgICogYW5kcm9pZC5qYXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgb3JnLmp1bml0IGNsYXNzZXMsIGl0IGRvZXMgbm90Ci0gICAgICoga25vdyBpdCBhY3R1YWxseSBuZWVkcyB0aGUganVuaXQuamFyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc3BhdGggQXJyYXkgY29udGFpbmluZyBjbGFzc3BhdGggCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IChmb3IgbG9nZ2luZyBwdXJwb3NlcykgCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBtb2RpZmllZCAoaWYgYXBwbGljYWJsZSkgY2xhc3NwYXRoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBmaXhDbGFzc3BhdGgoU3RyaW5nW10gY2xhc3NwYXRoLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgLy8gc2VhcmNoIGZvciBqdW5pdC5qYXI7IGlmIGFueSBhcmUgZm91bmQgcmV0dXJuIGltbWVkaWF0ZWx5Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoW2ldLmVuZHNXaXRoKEpVTklUX0pBUikpIHsgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZGVsZWdhdGUgYmVpbmcgY2FsbGVkIHdpdGhvdXQgYSBqdW5pdC5qYXIgcHJlc2VudCBpcyBvbmx5Ci0gICAgICAgIC8vIHBvc3NpYmxlIGZvciBBbmRyb2lkIHByb2plY3RzLiBJbiBhIG5vbi1BbmRyb2lkIHByb2plY3QsIHRoZSB0ZXN0Ci0gICAgICAgIC8vIHdvdWxkIG5vdCBjb21waWxlIGFuZCB3b3VsZCBiZSB1bmFibGUgdG8gcnVuLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8ganVuaXQ0IGlzIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBqdW5pdDMgYW5kIHRoZXkgdXNlcyB0aGUKLSAgICAgICAgICAgIC8vIHNhbWUganVuaXQuamFyIGZyb20gYnVuZGxlIG9yZy5qdW5pdDoKLSAgICAgICAgICAgIC8vIFdoZW4gYSBwcm9qZWN0IGhhcyBtaXhlZCBKVW5pdDMgYW5kIEpVbml0NCB0ZXN0cywgaWYgSlVuaXQzIGphcgotICAgICAgICAgICAgLy8gaXMgYWRkZWQgZmlyc3QgaXQgaXMgdGhlbiByZXBsYWNlZCBieSB0aGUgSlVuaXQ0IGphciB3aGVuIHVzZXIgaXMKLSAgICAgICAgICAgIC8vIHByb21wdGVkIHRvIGZpeCB0aGUgSlVuaXQ0IHRlc3QgZmFpbHVyZQotICAgICAgICAgICAgU3RyaW5nIGphckxvY2F0aW9uID0gZ2V0SnVuaXRKYXJMb2NhdGlvbigpOwotICAgICAgICAgICAgLy8gd2UgZXh0ZW5kIHRoZSBjbGFzc3BhdGggYnkgb25lIGVsZW1lbnQgYW5kIGFwcGVuZCBqdW5pdC5qYXIKLSAgICAgICAgICAgIFN0cmluZ1tdIG5ld0NsYXNzcGF0aCA9IG5ldyBTdHJpbmdbY2xhc3NwYXRoLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdDbGFzc3BhdGhbbmV3Q2xhc3NwYXRoLmxlbmd0aCAtIDFdID0gamFyTG9jYXRpb247Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXdDbGFzc3BhdGg7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXMgd2UgZGVwZW5kIG9uIHRoZSBvcmcuanVuaXQKLSAgICAgICAgICAgIC8vIHBsdWdpbiBleHBsaWNpdGx5OyB0aGUgZXJyb3IgaXMgbG9nZ2VkIGhlcmUgc28gdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgICAgICAgIC8vIHRyYWNlIGJhY2sgdGhlIGNhdXNlIHdoZW4gdGhlIHRlc3QgZmFpbHMgdG8gcnVuCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJDb3VsZCBub3QgZmluZCBhIHZhbGlkIGp1bml0LmphciIpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhIHZhbGlkIGp1bml0LmphciIpOwotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjbGFzc3BhdGggYXMtaXMgKHdpdGggbm8ganVuaXQuamFyKSBhbnl3YXkgYmVjYXVzZSB3ZQotICAgICAgICAgICAgLy8gd2lsbCBsZXQgdGhlIGFjdHVhbCBsYXVuY2ggY29uZmlnIGZhaWxzLgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBqdW5pdCBqYXIgaW4gdGhlIGhpZ2hlc3QgdmVyc2lvbiBidW5kbGUuCi0gICAgICogCi0gICAgICogKFRoaXMgaXMgcHVibGljIG9ubHkgc28gdGhhdCB0aGUgdGVzdCBjYW4gY2FsbCBpdCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIGFzIGEgc3RyaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEp1bml0SmFyTG9jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuanVuaXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGZpbmQgb3JnLmp1bml0IGJ1bmRsZSIpOwotICAgICAgICB9Ci0gICAgICAgIFVSTCBqYXJVcmwgPSBidW5kbGUuZ2V0RW50cnkoQW5kcm9pZENvbnN0YW50cy5XU19TRVAgKyBKVU5JVF9KQVIpOwotICAgICAgICByZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZShqYXJVcmwpLmdldEZpbGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0xhdW5jaENvbmZpZ0RlbGVnYXRlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0xhdW5jaENvbmZpZ0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzYyZTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9MYXVuY2hDb25maWdEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkFuZHJvaWRMYXVuY2hDb25maWd1cmF0aW9uLlRhcmdldE1vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkJhc2VQcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyLkFjdGl2aXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhbiBlY2xpcHNlIExhdW5jQ29uZmlndXJhdGlvbkRlbGVnYXRlIHRvIGxhdW5jaCBhbmRyb2lkCi0gKiBhcHBsaWNhdGlvbiBpbiBkZWJ1Zy4KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ0RlbGVnYXRlIGV4dGVuZHMgTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLSAgICBmaW5hbCBzdGF0aWMgaW50IElOVkFMSURfREVCVUdfUE9SVCA9IC0xOwotICAgIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFORFJPSURfTEFVTkNIX1RZUEVfSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmRlYnVnLkxhdW5jaENvbmZpZ1R5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogVGFyZ2V0IG1vZGUgcGFyYW1ldGVyczogdHJ1ZSBpcyBhdXRvbWF0aWMsIGZhbHNlIGlzIG1hbnVhbCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEFSR0VUX01PREUgPSBBZHRQbHVnaW4uUExVR0lOX0lEICsgIi50YXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXRNb2RlIERFRkFVTFRfVEFSR0VUX01PREUgPSBUYXJnZXRNb2RlLkFVVE87Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2ggYWN0aW9uOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+MDogbGF1bmNoIGRlZmF1bHQgYWN0aXZpdHk8L2xpPgotICAgICAqIDxsaT4xOiBsYXVuY2ggc3BlY2lmaWVkIGFjdGl2aXR5LiBTZWUge0BsaW5rICNBVFRSX0FDVElWSVRZfTwvbGk+Ci0gICAgICogPGxpPjI6IERvIE5vdGhpbmc8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9MQVVOQ0hfQUNUSU9OID0gQWR0UGx1Z2luLlBMVUdJTl9JRCArICIuYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKiBEZWZhdWx0IGxhdW5jaCBhY3Rpb24uIFRoaXMgbGF1bmNoZXMgdGhlIGFjdGl2aXR5IHRoYXQgaXMgc2V0dXAgdG8gYmUgZm91bmQgaW4gdGhlIEhPTUUKLSAgICAgKiBzY3JlZW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUNUSU9OX0RFRkFVTFQgPSAwOwotICAgIC8qKiBMYXVuY2ggYWN0aW9uIHN0YXJ0aW5nIGEgc3BlY2lmaWMgYWN0aXZpdHkuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUNUSU9OX0FDVElWSVRZID0gMTsKLSAgICAvKiogTGF1bmNoIGFjdGlvbiB0aGF0IGRvZXMgbm90aGluZy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBQ1RJT05fRE9fTk9USElORyA9IDI7Ci0gICAgLyoqIERlZmF1bHQgbGF1bmNoIGFjdGlvbiB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0xBVU5DSF9BQ1RJT04gPSBBQ1RJT05fREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIEFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGlmIHtAbGluayAjQVRUUl9MQVVOQ0hfQUNUSU9OfSBpcyAxCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BQ1RJVklUWSA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BVkRfTkFNRSA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmF2ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NQRUVEID0gQWR0UGx1Z2luLlBMVUdJTl9JRCArICIuc3BlZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbmRleCBvZiB0aGUgZGVmYXVsdCBuZXR3b3JrIHNwZWVkIHNldHRpbmcgZm9yIHRoZSBlbXVsYXRvci48YnI+Ci0gICAgICogR2V0IHRoZSBlbXVsYXRvciBvcHRpb24gd2l0aCA8Y29kZT5FbXVsYXRvckNvbmZpZ1RhYi5nZXRTcGVlZChpbmRleCk8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TUEVFRCA9IDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFTEFZID0gQWR0UGx1Z2luLlBMVUdJTl9JRCArICIuZGVsYXkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbmRleCBvZiB0aGUgZGVmYXVsdCBuZXR3b3JrIGxhdGVuY3kgc2V0dGluZyBmb3IgdGhlIGVtdWxhdG9yLjxicj4KLSAgICAgKiBHZXQgdGhlIGVtdWxhdG9yIG9wdGlvbiB3aXRoIDxjb2RlPkVtdWxhdG9yQ29uZmlnVGFiLmdldERlbGF5KGluZGV4KTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RFTEFZID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09NTUFORExJTkUgPSBBZHRQbHVnaW4uUExVR0lOX0lEICsgIi5jb21tYW5kbGluZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV0lQRV9EQVRBID0gQWR0UGx1Z2luLlBMVUdJTl9JRCArICIud2lwZWRhdGEiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfV0lQRV9EQVRBID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05PX0JPT1RfQU5JTSA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLm5vYm9vdGFuaW0iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfTk9fQk9PVF9BTklNID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFQlVHX1BPUlQgPSAKLSAgICAgICAgQWR0UGx1Z2luLlBMVUdJTl9JRCArICIuZGVidWdQb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLAotICAgICAgICAgICAgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYSBzdGFuZGFyZCBsYXVuY2ggb3IgaWYgaXQncyBhIGxhdW5jaAotICAgICAgICAvLyB0byBkZWJ1ZyBhbiBhcHBsaWNhdGlvbiBhbHJlYWR5IHJ1bm5pbmcuCi0gICAgICAgIGludCBkZWJ1Z1BvcnQgPSBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci5nZXRQb3J0Rm9yQ29uZmlnKGNvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIC8vIGdldCB0aGUgcHJvamVjdAotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChjb25maWd1cmF0aW9uKTsKLQotICAgICAgICAvLyBmaXJzdCB3ZSBtYWtlIHN1cmUgdGhlIGxhdW5jaCBpcyBvZiB0aGUgcHJvcGVyIHR5cGUKLSAgICAgICAgQW5kcm9pZExhdW5jaCBhbmRyb2lkTGF1bmNoID0gbnVsbDsKLSAgICAgICAgaWYgKGxhdW5jaCBpbnN0YW5jZW9mIEFuZHJvaWRMYXVuY2gpIHsKLSAgICAgICAgICAgIGFuZHJvaWRMYXVuY2ggPSAoQW5kcm9pZExhdW5jaClsYXVuY2g7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3cm9uZyB0eXBlLCBub3Qgc3VyZSBob3cgd2UgZ290IHRoZXJlLCBidXQgd2UgZG9uJ3QgZG8KLSAgICAgICAgICAgIC8vIGFueXRoaW5nIGVsc2UKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsICJXcm9uZyBMYXVuY2ggVHlwZSEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSB2YWxpZCBkZWJ1ZyBwb3J0LCB0aGlzIG1lYW5zIHdlJ3JlIGRlYnVnZ2luZyBhbiBhcHAKLSAgICAgICAgLy8gdGhhdCdzIGFscmVhZHkgbGF1bmNoZWQuCi0gICAgICAgIGlmIChkZWJ1Z1BvcnQgIT0gSU5WQUxJRF9ERUJVR19QT1JUKSB7Ci0gICAgICAgICAgICBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci5sYXVuY2hSZW1vdGVEZWJ1Z2dlcihkZWJ1Z1BvcnQsIGFuZHJvaWRMYXVuY2gsIG1vbml0b3IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoIkNvdWxkbid0IGdldCBwcm9qZWN0IG9iamVjdCEiKTsKLSAgICAgICAgICAgIGFuZHJvaWRMYXVuY2guc3RvcExhdW5jaCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGVycm9ycywgYW5kIGFib3J0IGluIHRoaXMgY2FzZS4KLSAgICAgICAgaWYgKFByb2plY3RIZWxwZXIuaGFzRXJyb3IocHJvamVjdCwgdHJ1ZSkpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5kaXNwbGF5RXJyb3IoIkFuZHJvaWQgTGF1bmNoIiwKLSAgICAgICAgICAgICAgICAgICAgIllvdXIgcHJvamVjdCBjb250YWlucyBlcnJvcihzKSwgcGxlYXNlIGZpeCB0aGVtIGJlZm9yZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShwcm9qZWN0LCAiQW5kcm9pZCBMYXVuY2ghIik7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgaXMgdXNpbmcgdGhlIHByb3BlciBzZGsuCi0gICAgICAgIC8vIGlmIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgd2Ugc2ltcGx5IGxldCBpdCBwcm9wYWdhdGUgdG8gdGhlIGNhbGxlci4KLSAgICAgICAgaWYgKGNoZWNrQW5kcm9pZFByb2plY3QocHJvamVjdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsICJQcm9qZWN0IGlzIG5vdCBhbiBBbmRyb2lkIFByb2plY3QuIEFib3J0aW5nISIpOwotICAgICAgICAgICAgYW5kcm9pZExhdW5jaC5zdG9wTGF1bmNoKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBhZGIgc3RhdHVzIGFuZCBhYm9ydCBpZiBuZWVkZWQuCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZSBicmlkZ2UgPSBBbmRyb2lkRGVidWdCcmlkZ2UuZ2V0QnJpZGdlKCk7Ci0gICAgICAgIGlmIChicmlkZ2UgPT0gbnVsbCB8fCBicmlkZ2UuaXNDb25uZWN0ZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgY29ubmVjdGlvbnMgPSAtMTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdGFydHMgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoYnJpZGdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgPSBicmlkZ2UuZ2V0Q29ubmVjdGlvbkF0dGVtcHRDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICByZXN0YXJ0cyA9IGJyaWRnZS5nZXRSZXN0YXJ0QXR0ZW1wdENvdW50KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IC0xLCB0aGUgZGV2aWNlIG1vbml0b3IgaXMgbm90IGV2ZW4gc2V0dXAgKGFueW1vcmU/KS4KLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFzayB0aGUgdXNlciB0byByZXN0YXJ0IGVjbGlwc2UuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gbGV0IHRoZSB1c2VyIGtub3cgaW4gY2FzZSBpdCBkb2VzLgotICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9ucyA9PSAtMSB8fCByZXN0YXJ0cyA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGNvbm5lY3Rpb24gdG8gYWRiIGlzIGRvd24sIGFuZCBhIHNldmVyZSBlcnJvciBoYXMgb2NjdXJlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCByZXN0YXJ0IGFkYiBhbmQgRWNsaXBzZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGVuc3VyZSB0aGF0IGFkYiBpcyBjb3JyZWN0bHkgbG9jYXRlZCBhdCAnJTEkcycgYW5kIGNhbiBiZSBleGVjdXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldE9zQWJzb2x1dGVBZGIoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gd2l0aCBhZGIgd2FzIGludGVycnVwdGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJTEkcyBhdHRlbXB0cyBoYXZlIGJlZW4gbWFkZSB0byByZWNvbm5lY3QuIiwgY29ubmVjdGlvbnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gbWFudWFsbHkgcmVzdGFydCBhZGIgZnJvbSB0aGUgRGV2aWNlcyB2aWV3LiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gd2l0aCBhZGIgd2FzIGludGVycnVwdGVkLCBhbmQgYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGhhdmUgZmFpbGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJTEkcyBhdHRlbXB0cyBoYXZlIGJlZW4gbWFkZSB0byByZXN0YXJ0IGFkYi4iLCByZXN0YXJ0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgd2FudCB0byBtYW51YWxseSByZXN0YXJ0IGFkYiBmcm9tIHRoZSBEZXZpY2VzIHZpZXcuIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRMYXVuY2guc3RvcExhdW5jaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzaW5jZSBhZGIgaXMgd29ya2luZywgd2UgbGV0IHRoZSB1c2VyIGtub3cKLSAgICAgICAgLy8gVE9ETyBoYXZlIGEgdmVyYm9zZSBtb2RlIGZvciBsYXVuY2ggd2l0aCBtb3JlIGluZm8gKG9yIHNvbWUgb2YgdGhlIGxlc3MgdXNlZnVsIGluZm8gd2Ugbm93IGhhdmUpLgotICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUocHJvamVjdCwgImFkYiBpcyBydW5uaW5nIG5vcm1hbGx5LiIpOwotCi0gICAgICAgIC8vIG1ha2UgYSBjb25maWcgY2xhc3MKLSAgICAgICAgQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEFuZHJvaWRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gZmlsbCBpdCB3aXRoIHRoZSBjb25maWcgY29taW5nIGZyb20gdGhlIElMYXVuY2hDb25maWd1cmF0aW9uIG9iamVjdAotICAgICAgICBjb25maWcuc2V0KGNvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIC8vIGdldCB0aGUgbGF1bmNoIGNvbnRyb2xsZXIgc2luZ2xldG9uCi0gICAgICAgIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgYXBwbGljYXRpb24gcGFja2FnZQotICAgICAgICBJRmlsZSBhcHBsaWNhdGlvblBhY2thZ2UgPSBQcm9qZWN0SGVscGVyLmdldEFwcGxpY2F0aW9uUGFja2FnZShwcm9qZWN0KTsKLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbmRyb2lkTGF1bmNoLnN0b3BMYXVuY2goKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIG5lZWQgc29tZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtYW5pZmVzdAotICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3RQYXJzZXIgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIucGFyc2UoCi0gICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG51bGwgLyogZXJyb3JMaXN0ZW5lciAqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGdhdGhlckRhdGEgKi8sIGZhbHNlIC8qIG1hcmtFcnJvcnMgKi8pOwotICAgICAgICAKLSAgICAgICAgaWYgKG1hbmlmZXN0UGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsICJGYWlsZWQgdG8gcGFyc2UgQW5kcm9pZE1hbmlmZXN0OiBhYm9ydGluZyEiKTsKLSAgICAgICAgICAgIGFuZHJvaWRMYXVuY2guc3RvcExhdW5jaCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9MYXVuY2goY29uZmlndXJhdGlvbiwgbW9kZSwgbW9uaXRvciwgcHJvamVjdCwgYW5kcm9pZExhdW5jaCwgY29uZmlnLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uUGFja2FnZSwgbWFuaWZlc3RQYXJzZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvTGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBBbmRyb2lkTGF1bmNoIGFuZHJvaWRMYXVuY2gsCi0gICAgICAgICAgICBBbmRyb2lkTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIEFuZHJvaWRMYXVuY2hDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBJRmlsZSBhcHBsaWNhdGlvblBhY2thZ2UsIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBtYW5pZmVzdFBhcnNlcikgewotICAgICAgICAKLSAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb25maWcubUxhdW5jaEFjdGlvbiA9PSBBQ1RJT05fQUNUSVZJVFkpIHsgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGFjdGl2aXR5IG5hbWUgZGVmaW5lZCBpbiB0aGUgY29uZmlnCi0gICAgICAgICAgICBhY3Rpdml0eU5hbWUgPSBnZXRBY3Rpdml0eU5hbWUoY29uZmlndXJhdGlvbik7Ci0gICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgYWN0aXZpdHkgbGlzdCBhbmQgbWFrZSBzdXJlIHRoZSBvbmUgd2UgZ290IG1hdGNoZXMuCi0gICAgICAgICAgICBBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBtYW5pZmVzdFBhcnNlci5nZXRBY3Rpdml0aWVzKCk7Ci0gICAgCi0gICAgICAgICAgICAvLyBmaXJzdCB3ZSBjaGVjayB0aGF0IHRoZXJlIGFyZSwgaW4gZmFjdCwgYWN0aXZpdGllcy4KLSAgICAgICAgICAgIGlmIChhY3Rpdml0aWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGFjdGl2aXRpZXMgbGlzdCBpcyBudWxsLCB0aGVuIHRoZSBtYW5pZmVzdCBpcyBlbXB0eQotICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBjYW4ndCBsYXVuY2ggdGhlIGFwcC4gV2UnbGwgcmV2ZXJ0IHRvIGEgc3luYy1vbmx5IGxhdW5jaAotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIE1hbmlmZXN0IGRlZmluZXMgbm8gYWN0aXZpdHkhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbGF1bmNoIHdpbGwgb25seSBzeW5jIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIG9uIHRoZSBkZXZpY2UhIik7Ci0gICAgICAgICAgICAgICAgY29uZmlnLm1MYXVuY2hBY3Rpb24gPSBBQ1RJT05fRE9fTk9USElORzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZpdHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYWN0aXZpdHkgd2UgZ290IGlzIG51bGwsIHdlIGxvb2sgZm9yIHRoZSBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGFjdGl2aXR5IHNwZWNpZmllZCEgR2V0dGluZyB0aGUgbGF1bmNoZXIgYWN0aXZpdHkuIik7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgbGF1bmNoZXJBY3Rpdml0eSA9IG1hbmlmZXN0UGFyc2VyLmdldExhdW5jaGVyQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBpZiAobGF1bmNoZXJBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSA9IGxhdW5jaGVyQWN0aXZpdHkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gZGVmYXVsdCBhY3Rpdml0eS4gV2UgcmV2ZXJ0IHRvIGEgc3luYy1vbmx5IGxhdW5jaC4KLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9Ob0FjdGlvbkxhdW5jaChwcm9qZWN0LCBjb25maWcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG9uZSB3ZSBnb3QgZnJvbSB0aGUgY29uZmlnIG1hdGNoZXMgYW55IGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhIDogYWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYSAhPSBudWxsICYmIGEuZ2V0TmFtZSgpLmVxdWFscyhhY3Rpdml0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB3ZSByZXZlcnQgdG8gdGhlIGRlZmF1bHQgYWN0aXZpdHkgaWYgYW55LgotICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWVkIGFjdGl2aXR5IGRvZXMgbm90IGV4aXN0ISBHZXR0aW5nIHRoZSBsYXVuY2hlciBhY3Rpdml0eS4iKTsKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHkgbGF1bmNoZXJBY3Rpdml0eSA9IG1hbmlmZXN0UGFyc2VyLmdldExhdW5jaGVyQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhdW5jaGVyQWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gbGF1bmNoZXJBY3Rpdml0eS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGRlZmF1bHQgYWN0aXZpdHkuIFdlIHJldmVydCB0byBhIHN5bmMtb25seSBsYXVuY2guCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9Ob0FjdGlvbkxhdW5jaChwcm9qZWN0LCBjb25maWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5tTGF1bmNoQWN0aW9uID09IEFDVElPTl9ERUZBVUxUKSB7Ci0gICAgICAgICAgICBBY3Rpdml0eSBsYXVuY2hlckFjdGl2aXR5ID0gbWFuaWZlc3RQYXJzZXIuZ2V0TGF1bmNoZXJBY3Rpdml0eSgpOwotICAgICAgICAgICAgaWYgKGxhdW5jaGVyQWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSA9IGxhdW5jaGVyQWN0aXZpdHkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGRlZmF1bHQgYWN0aXZpdHkuIFdlIHJldmVydCB0byBhIHN5bmMtb25seSBsYXVuY2guCi0gICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb05vQWN0aW9uTGF1bmNoKHByb2plY3QsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJQW5kcm9pZExhdW5jaEFjdGlvbiBsYXVuY2hBY3Rpb24gPSBuZXcgRW1wdHlMYXVuY2hBY3Rpb24oKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsYXVuY2hBY3Rpb24gPSBuZXcgQWN0aXZpdHlMYXVuY2hBY3Rpb24oYWN0aXZpdHlOYW1lLCBjb250cm9sbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2VlbXMgZmluZSwgd2UgYXNrIHRoZSBsYXVuY2ggY29udHJvbGxlciB0byBoYW5kbGUKLSAgICAgICAgLy8gdGhlIHJlc3QKLSAgICAgICAgY29udHJvbGxlci5sYXVuY2gocHJvamVjdCwgbW9kZSwgYXBwbGljYXRpb25QYWNrYWdlLG1hbmlmZXN0UGFyc2VyLmdldFBhY2thZ2UoKSwKLSAgICAgICAgICAgICAgICBtYW5pZmVzdFBhcnNlci5nZXRQYWNrYWdlKCksIG1hbmlmZXN0UGFyc2VyLmdldERlYnVnZ2FibGUoKSwKLSAgICAgICAgICAgICAgICBtYW5pZmVzdFBhcnNlci5nZXRBcGlMZXZlbFJlcXVpcmVtZW50KCksIGxhdW5jaEFjdGlvbiwgY29uZmlnLCBhbmRyb2lkTGF1bmNoLAotICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBidWlsZEZvckxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgU3RyaW5nIG1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgd2UgaGF2ZSBldmVyeXRoaW5nCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KGNvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZvcmNlIGFuIGluY3JlbWVudGFsIGJ1aWxkIHRvIGJlIHN1cmUgdGhlIHJlc291cmNlcyB3aWxsCi0gICAgICAgICAgICAvLyBiZSB1cGRhdGVkIGlmIHRoZXkgd2VyZSBub3Qgc2F2ZWQgYmVmb3JlIHRoZSBsYXVuY2ggd2FzIGxhdW5jaGVkLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAxIC8qIGNvZGUsIHVudXNlZCAqLywgIkNhbid0IGZpbmQgdGhlIHByb2plY3QhIiwgbnVsbCAvKiBleGNlcHRpb24gKi8pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRMYXVuY2goY29uZmlndXJhdGlvbiwgbW9kZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSVByb2plY3Qgb2JqZWN0IG1hdGNoaW5nIHRoZSBuYW1lIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogb2JqZWN0IHVuZGVyIHRoZSBuYW1lCi0gICAgICogPGNvZGU+SUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FPC9jb2RlPgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybiBUaGUgSVByb2plY3Qgb2JqZWN0IG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbil7Ci0gICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCBuYW1lIGZyb20gdGhlIGNvbmZpZwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9qZWN0TmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsICIiKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCB3b3Jrc3BhY2UKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0KLSAgICAgICAgLy8gYW5kIHJldHVybiB0aGUgcHJvamVjdCB3aXRoIHRoZSBuYW1lIGZyb20gdGhlIGNvbmZpZwotICAgICAgICByZXR1cm4gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHByb2plY3QgaXMgYW4gYW5kcm9pZCBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFuIGFuZHJvaWQgU0RLLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FuZHJvaWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgaXMgYSBqYXZhIGFuZCBhbiBhbmRyb2lkIHByb2plY3QuCi0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJTEkcyBpcyBub3QgYSBKYXZhIHByb2plY3QhIiwgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiQW5kcm9pZCBMYXVuY2giLCBtc2cpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIiUxJHMgaXMgbm90IGFuIEFuZHJvaWQgcHJvamVjdCEiLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheUVycm9yKCJBbmRyb2lkIExhdW5jaCIsIG1zZyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldEFjdGl2aXR5TmFtZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBlbXB0eSA9ICIiOwotICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9BQ1RJVklUWSwgZW1wdHkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChhY3Rpdml0eU5hbWUgIT0gZW1wdHkpID8gYWN0aXZpdHlOYW1lIDogbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJldmVydFRvTm9BY3Rpb25MYXVuY2goSVByb2plY3QgcHJvamVjdCwgQW5kcm9pZExhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKHByb2plY3QsCi0gICAgICAgICAgICAgICAgIk5vIExhdW5jaGVyIGFjdGl2aXR5IGZvdW5kISIsCi0gICAgICAgICAgICAgICAgIlRoZSBsYXVuY2ggd2lsbCBvbmx5IHN5bmMgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2Ugb24gdGhlIGRldmljZSEiKTsKLSAgICAgICAgY29uZmlnLm1MYXVuY2hBY3Rpb24gPSBBQ1RJT05fRE9fTk9USElORzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0xhdW5jaENvbmZpZ1RhYkdyb3VwLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL0xhdW5jaENvbmZpZ1RhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDk2ZWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9MYXVuY2hDb25maWdUYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQ29tbW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCi0vKioKLSAqIFRhYiBncm91cCBvYmplY3QgZm9yIEFuZHJvaWQgTGF1bmNoIENvbmZpZyB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoQ29uZmlnVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0KLSAgICBwdWJsaWMgTGF1bmNoQ29uZmlnVGFiR3JvdXAoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9IG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHsKLSAgICAgICAgICAgICAgICBuZXcgTWFpbkxhdW5jaENvbmZpZ1RhYigpLAotICAgICAgICAgICAgICAgIG5ldyBFbXVsYXRvckNvbmZpZ1RhYigpLAotICAgICAgICAgICAgICAgIG5ldyBDb21tb25UYWIoKQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHNldFRhYnModGFicyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9MYXVuY2hTaG9ydGN1dC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9MYXVuY2hTaG9ydGN1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM1ZjlkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvTGF1bmNoU2hvcnRjdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogTGF1bmNoIHNob3J0Y3V0IHRvIGxhdW5jaCBkZWJ1Zy9ydW4gY29uZmlndXJhdGlvbiBkaXJlY3RseS4KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaFNob3J0Y3V0IGltcGxlbWVudHMgSUxhdW5jaFNob3J0Y3V0IHsKLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaFNob3J0Y3V0I2xhdW5jaCgKLSAgICAgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGF1bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgbW9kZSkgewotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBvYmplY3QgYW5kIHRoZSBwcm9qZWN0IGZyb20gaXQKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbGVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgICAgICBPYmplY3QgbyA9IHN0cnVjdFNlbGVjdC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCAoYW5kIG5vcm1hbGx5IG9ubHkpIGVsZW1lbnQKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByID0gKElSZXNvdXJjZSkoKElBZGFwdGFibGUpbykuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IGZyb20gdGhlIHJlc291cmNlCi0gICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gci5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsYXVuY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaChwcm9qZWN0LCBtb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hTaG9ydGN1dCNsYXVuY2goCi0gICAgICogb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGF1bmNoKElFZGl0b3JQYXJ0IGVkaXRvciwgU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgLy8gc2luY2Ugd2UgZm9yY2UgdGhlIHNob3J0Y3V0IHRvIG9ubHkgd29yayBvbiBzZWxlY3Rpb24gaW4gdGhlCi0gICAgICAgIC8vIHBhY2thZ2UgZXhwbG9yZXIsIHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMYXVuY2ggYSBjb25maWcgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBsYXVuY2gKLSAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbGF1bmNoIG1vZGUgKCJkZWJ1ZyIsICJydW4iIG9yICJwcm9maWxlIikKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGF1bmNoKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIC8vIGdldCBhbiBleGlzdGluZyBvciBuZXcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gQW5kcm9pZExhdW5jaENvbnRyb2xsZXIuZ2V0TGF1bmNoQ29uZmlnKHByb2plY3QpOwotCi0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYW5kIGxhdW5jaCEKLSAgICAgICAgICAgIERlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBtb2RlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvTWFpbkxhdW5jaENvbmZpZ1RhYi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9NYWluTGF1bmNoQ29uZmlnVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTdmMzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9NYWluTGF1bmNoQ29uZmlnVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTWFuaWZlc3RQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdENob29zZXJIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyLkFjdGl2aXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBDbGFzcyBmb3IgdGhlIG1haW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiLgotICovCi1wdWJsaWMgY2xhc3MgTWFpbkxhdW5jaENvbmZpZ1RhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfVEFCX0lNQUdFID0gIm1haW5MYXVuY2hUYWIucG5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcm90ZWN0ZWQgVGV4dCBtUHJvalRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVByb2pCdXR0b247Ci0KLSAgICBwcml2YXRlIENvbWJvIG1BY3Rpdml0eUNvbWJvOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFjdGl2aXR5PiBtQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0KLSAgICBwcml2YXRlIFdpZGdldExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBXaWRnZXRMaXN0ZW5lcigpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbURlZmF1bHRBY3Rpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUFjdGl2aXR5QWN0aW9uQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1Eb05vdGhpbmdBY3Rpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBpbnQgbUxhdW5jaEFjdGlvbiA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkRFRkFVTFRfTEFVTkNIX0FDVElPTjsKLSAgICAKLSAgICBwcml2YXRlIFByb2plY3RDaG9vc2VySGVscGVyIG1Qcm9qZWN0Q2hvb3NlckhlbHBlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGxpc3RlbmVyIHdoaWNoIGhhbmRsZXMgd2lkZ2V0IGNoYW5nZSBldmVudHMgZm9yIHRoZSBjb250cm9scyBpbiB0aGlzCi0gICAgICogdGFiLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGNoZWNrUGFyYW1ldGVycygpOwotICAgICAgICAgICAgbG9hZEFjdGl2aXRpZXMocHJvamVjdCk7Ci0gICAgICAgICAgICBzZXREaXJ0eSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7LyogZG8gbm90aGluZyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG1Qcm9qQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUHJvamVjdEJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1ldGVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1haW5MYXVuY2hDb25maWdUYWIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1Qcm9qZWN0Q2hvb3NlckhlbHBlciA9IG5ldyBQcm9qZWN0Q2hvb3NlckhlbHBlcihwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0KLSAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXRDb250cm9sKGNvbXApOwotICAgICAgICBHcmlkTGF5b3V0IHRvcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHRvcExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICBjb21wLnNldExheW91dCh0b3BMYXlvdXQpOwotICAgICAgICBjb21wLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIGNyZWF0ZVByb2plY3RFZGl0b3IoY29tcCk7Ci0gICAgICAgIGNyZWF0ZVZlcnRpY2FsU3BhY2VyKGNvbXAsIDEpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29tYm8gZm9yIHRoZSBhY3Rpdml0eSBjaG9vc2VyCi0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dCgiTGF1bmNoIEFjdGlvbjoiKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgZ3JvdXAuc2V0Rm9udChmb250KTsKLQotICAgICAgICBtRGVmYXVsdEFjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbURlZmF1bHRBY3Rpb25CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1EZWZhdWx0QWN0aW9uQnV0dG9uLnNldFRleHQoIkxhdW5jaCBEZWZhdWx0IEFjdGl2aXR5Iik7Ci0gICAgICAgIG1EZWZhdWx0QWN0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXZlbnQgYXJlIHJlY2VpdmVkIGZvciBib3RoIHNlbGVjdGlvbiBhbmQgZGVzZWxlY3Rpb24sIHNvIHdlIG9ubHkgcHJvY2VzcwotICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gZXZlbnQgdG8gYXZvaWQgZG9pbmcgaXQgdHdpY2UuCi0gICAgICAgICAgICAgICAgaWYgKG1EZWZhdWx0QWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhdW5jaEFjdGlvbiA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkFDVElPTl9ERUZBVUxUOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtQWN0aXZpdHlBY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtQWN0aXZpdHlBY3Rpb25CdXR0b24uc2V0VGV4dCgiTGF1bmNoOiIpOwotICAgICAgICBtQWN0aXZpdHlBY3Rpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBldmVudCBhcmUgcmVjZWl2ZWQgZm9yIGJvdGggc2VsZWN0aW9uIGFuZCBkZXNlbGVjdGlvbiwgc28gd2Ugb25seSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiBldmVudCB0byBhdm9pZCBkb2luZyBpdCB0d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2aXR5QWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhdW5jaEFjdGlvbiA9IExhdW5jaENvbmZpZ0RlbGVnYXRlLkFDVElPTl9BQ1RJVklUWTsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtQWN0aXZpdHlDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBtQWN0aXZpdHlDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbUFjdGl2aXR5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgbUFjdGl2aXR5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1BY3Rpdml0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbURvTm90aGluZ0FjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbURvTm90aGluZ0FjdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbURvTm90aGluZ0FjdGlvbkJ1dHRvbi5zZXRUZXh0KCJEbyBOb3RoaW5nIik7Ci0gICAgICAgIG1Eb05vdGhpbmdBY3Rpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBldmVudCBhcmUgcmVjZWl2ZWQgZm9yIGJvdGggc2VsZWN0aW9uIGFuZCBkZXNlbGVjdGlvbiwgc28gd2Ugb25seSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiBldmVudCB0byBhdm9pZCBkb2luZyBpdCB0d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAobURvTm90aGluZ0FjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXVuY2hBY3Rpb24gPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5BQ1RJT05fRE9fTk9USElORzsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJBbmRyb2lkIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBBZHRQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKS5sb2FkSW1hZ2UoTEFVTkNIX1RBQl9JTUFHRSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgbVByb2pUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FMTE9XX1RFUk1JTkFURSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBsYXVuY2ggbW9kZQotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0xBVU5DSF9BQ1RJT04sIG1MYXVuY2hBY3Rpb24pOwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIHRoZSBhY3Rpdml0eQotICAgICAgICBpbnQgc2VsZWN0aW9uID0gbUFjdGl2aXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKG1BY3Rpdml0aWVzICE9IG51bGwgJiYgc2VsZWN0aW9uID49MCAmJiBzZWxlY3Rpb24gPCBtQWN0aXZpdGllcy5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLmdldChzZWxlY3Rpb24pLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGxpbmsgdGhlIHByb2plY3QgYW5kIHRoZSBsYXVuY2ggY29uZmlnLgotICAgICAgICBtYXBSZXNvdXJjZXMoY29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfTEFVTkNIX0FDVElPTiwKLSAgICAgICAgICAgICAgICBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX0xBVU5DSF9BQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHdpZGdldHMgZm9yIHNwZWNpZnlpbmcgYSBtYWluIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBncm91cC5zZXRUZXh0KCJQcm9qZWN0OiIpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBncm91cC5zZXRGb250KGZvbnQpOwotICAgICAgICBtUHJvalRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBtUHJvalRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1Qcm9qVGV4dC5zZXRGb250KGZvbnQpOwotICAgICAgICBtUHJvalRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobUxpc3RlbmVyKTsKLSAgICAgICAgbVByb2pCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGdyb3VwLCAiQnJvd3NlLi4uIiwgbnVsbCk7Ci0gICAgICAgIG1Qcm9qQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0aGUgZGVmYXVsdCBsaXN0ZW5lciBmcm9tIHRoaXMgY2xhc3MuIEZvciBhbGwgc3ViY2xhc3NlcyB0aGlzCi0gICAgICogbGlzdGVuZXIgd2lsbCBvbmx5IHByb3ZpZGUgdGhlIGZ1bmN0aSBKYW9uYWxpdHkgb2YgdXBkYXRpbmcgdGhlIGN1cnJlbnQKLSAgICAgKiB0YWIKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSB3aWRnZXQgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2lkZ2V0TGlzdGVuZXIgZ2V0RGVmYXVsdExpc3RlbmVyKCkgewotICAgICAgICByZXR1cm4gbUxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSBwcm9qZWN0Ci0gICAgICogbmFtZSB0ZXh0IGZpZWxkLCBvciBudWxsIGlmIHRoZSB0ZXh0IGRvZXMgbm90IG1hdGNoIGEgcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBqYXZhTW9kZWwgdGhlIEphdmEgTW9kZWwgb2JqZWN0IGNvcnJlc3BvbmRpbmcgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSByb290LgotICAgICAqIEByZXR1cm4gYSBJSmF2YVByb2plY3Qgb2JqZWN0IG9yIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJSmF2YU1vZGVsIGphdmFNb2RlbCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtUHJvalRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lLmxlbmd0aCgpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgcHJvamVjdC4gVGhpcyBpbiB0dXJuIHByb3ZpZGVzCi0gICAgICogY29udGV4dCBmb3IgdGhlIG1haW4gdHlwZSwgYWxsb3dpbmcgdGhlIHVzZXIgdG8ga2V5IGEgbWFpbiB0eXBlIG5hbWUsIG9yCi0gICAgICogY29uc3RyYWluaW5nIHRoZSBzZWFyY2ggZm9yIG1haW4gdHlwZXMgdG8gdGhlIHNwZWNpZmllZCBwcm9qZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbVByb2plY3RDaG9vc2VySGVscGVyLmNob29zZUphdmFQcm9qZWN0KAotICAgICAgICAgICAgICAgIG1Qcm9qVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfS8vIGVuZCBpZgotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICBtUHJvalRleHQuc2V0VGV4dChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgYWN0aXZpdGllcyBhbmQgZmlsbCB0aGUgY29tYm8KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLSAgICAgICAgbG9hZEFjdGl2aXRpZXMocHJvamVjdCk7Ci0gICAgfS8vIGVuZCBoYW5kbGUgc2VsZWN0ZWQKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgdGFiJ3MgY29udHJvbHMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKiBsYXVuY2ggY29uZmlndXJhdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4KLSAgICAgKiBhIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQgdG8gdmlldyBvciBlZGl0LCBhZnRlciB0aGlzCi0gICAgICogdGFiJ3MgY29udHJvbCBoYXMgYmVlbiBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLSAgICAgKiAKLSAgICAgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2plY3ROYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIEVNUFRZX1NUUklORyk7Ci0gICAgICAgIH0vLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2pUZXh0LnNldFRleHQocHJvamVjdE5hbWUpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2ogPSBtUHJvamVjdENob29zZXJIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBsb2FkQWN0aXZpdGllcyhwcm9qKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGxvYWQgdGhlIGxhdW5jaCBhY3Rpb24uCi0gICAgICAgIG1MYXVuY2hBY3Rpb24gPSBMYXVuY2hDb25maWdEZWxlZ2F0ZS5ERUZBVUxUX0xBVU5DSF9BQ1RJT047Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTGF1bmNoQWN0aW9uID0gY29uZmlnLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0xBVU5DSF9BQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgIG1MYXVuY2hBY3Rpb24pOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZSByZWFsbHkuIGxhdW5jaEFjdGlvbiB3aWxsIGtlZXAgaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1EZWZhdWx0QWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihtTGF1bmNoQWN0aW9uID09IExhdW5jaENvbmZpZ0RlbGVnYXRlLkFDVElPTl9ERUZBVUxUKTsKLSAgICAgICAgbUFjdGl2aXR5QWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihtTGF1bmNoQWN0aW9uID09IExhdW5jaENvbmZpZ0RlbGVnYXRlLkFDVElPTl9BQ1RJVklUWSk7Ci0gICAgICAgIG1Eb05vdGhpbmdBY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uKAotICAgICAgICAgICAgICAgIG1MYXVuY2hBY3Rpb24gPT0gTGF1bmNoQ29uZmlnRGVsZWdhdGUuQUNUSU9OX0RPX05PVEhJTkcpOwotCi0gICAgICAgIC8vIG5vdyBsb29rIGZvciB0aGUgYWN0aXZpdHkgYW5kIGxvYWQgaXQgaWYgcHJlc2VudCwgb3RoZXJ3aXNlLCByZXZlcnQKLSAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgb25lLgotICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0FDVElWSVRZLCBFTVBUWV9TVFJJTkcpOwotICAgICAgICB9Ly8gZW5kIHRyeQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIHJlYWxseS4gYWN0aXZpdHlOYW1lIHdpbGwgc3RheSBlbXB0eQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1MYXVuY2hBY3Rpb24gIT0gTGF1bmNoQ29uZmlnRGVsZWdhdGUuQUNUSU9OX0FDVElWSVRZKSB7Ci0gICAgICAgICAgICBtQWN0aXZpdHlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQWN0aXZpdHlDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2aXR5TmFtZSA9PSBudWxsIHx8IGFjdGl2aXR5TmFtZS5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3Rpdml0aWVzICE9IG51bGwgJiYgbUFjdGl2aXRpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBuYW1lIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgY29tYm8uCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1BY3Rpdml0aWVzLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lLmVxdWFscyhtQWN0aXZpdGllcy5nZXQoaSkuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uc2VsZWN0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoaW5nIGFjdGl2aXR5IHdlIGNsZWFyIHRoZSBjb21ibyBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NvY2lhdGVzIHRoZSBsYXVuY2ggY29uZmlnIGFuZCB0aGUgcHJvamVjdC4gVGhpcyBhbGxvd3MgRWNsaXBzZSB0byBkZWxldGUgdGhlIGxhdW5jaAotICAgICAqIGNvbmZpZyB3aGVuIHRoZSBwcm9qZWN0IGlzIGRlbGV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBsYXVuY2ggY29uZmlnIHdvcmtpbmcgY29weS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXBSZXNvdXJjZXMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBqYXZhIG1vZGVsCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZSh3b3Jrc3BhY2VSb290KTsKLQotICAgICAgICAvLyBnZXQgdGhlIElKYXZhUHJvamVjdCBkZXNjcmliZWQgYnkgdGhlIHRleHQgZmllbGQuCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KGphdmFNb2RlbCk7Ci0gICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZXMgPSBBbmRyb2lkTGF1bmNoQ29udHJvbGxlci5nZXRSZXNvdXJjZXNUb01hcChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZpZy5zZXRNYXBwZWRSZXNvdXJjZXMocmVzb3VyY2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgdWkgd2l0aCB0aGUgYWN0aXZpdGllcyBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QsIGFuZCBzdG9yZXMgdGhlCi0gICAgICogYWN0aXZpdGllcyBpbiA8Y29kZT5tQWN0aXZpdGllczwvY29kZT4uCi0gICAgICogPHAvPgotICAgICAqIEZpcnN0IGFjdGl2aXR5IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQgaWYgcHJlc2VudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBsb2FkIHRoZSBhY3Rpdml0aWVzIGZyb20uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRBY3Rpdml0aWVzKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBsaXN0IG9mIGFjdGl2aXRpZXMuCi0gICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG51bGwgLyogZXJyb3JMaXN0ZW5lciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZ2F0aGVyRGF0YSAqLywgZmFsc2UgLyogbWFya0Vycm9ycyAqLyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0UGFyc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlbXSBhY3Rpdml0aWVzID0gbWFuaWZlc3RQYXJzZXIuZ2V0QWN0aXZpdGllcygpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IGFjdGl2aXRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5pc0V4cG9ydGVkKCkgJiYgYWN0aXZpdHkuaGFzQWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvbWJvLmFkZChhY3Rpdml0eS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2aXRpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXVuY2hBY3Rpb24gPT0gTGF1bmNoQ29uZmlnRGVsZWdhdGUuQUNUSU9OX0FDVElWSVRZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gd2lsbCBiZSBzZXQgd2hlbiB3ZSB1cGRhdGUgdGhlIHVpIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnIG9iamVjdC4KLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIEFuZHJvaWRNYW5pZmVzdCBwYXJzaW5nIGZhaWxlZC4gVGhlIGJ1aWxkZXJzIG11c3QgaGF2ZSByZXBvcnRlZCB0aGUgZXJyb3JzCi0gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIGVpdGhlciBwcm9qZWN0IGlzIG51bGwsIG9yIHdlIGdvdCBhbiBleGNlcHRpb24gZHVyaW5nCi0gICAgICAgIC8vIHRoZSBwYXJzaW5nLiBJbiBlaXRoZXIgY2FzZSwgd2UgZW1wdHkgdGhlIGFjdGl2aXR5IGxpc3QuCi0gICAgICAgIG1BY3Rpdml0eUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICBtQWN0aXZpdGllcy5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHBhcmFtZXRlcnMgZm9yIGNvcnJlY3RuZXNzLCBhbmQgdXBkYXRlIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBidXR0b25zLgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgSVByb2plY3Qgb2YgdGhpcyBsYXVuY2ggY29uZmlnLgotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3QgY2hlY2tQYXJhbWV0ZXJzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy90ZXN0IHRoZSBwcm9qZWN0IG5hbWUgZmlyc3QhCi0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1Qcm9qVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJQcm9qZWN0IE5hbWUgaXMgcmVxdWlyZWQhIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2hlcygiW2EtekEtWjAtOV8gXFwuLV0rIikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIlByb2plY3QgbmFtZSBjb250YWlucyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzISIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1Qcm9qZWN0Q2hvb3NlckhlbHBlci5nZXRBbmRyb2lkUHJvamVjdHMobnVsbCk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgZm91bmQgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0IDogcHJvamVjdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkuZXF1YWxzKHRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFN0cmluZy5mb3JtYXQoIlRoZXJlIGlzIG5vIGFuZHJvaWQgcHJvamVjdCBuYW1lZCAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0FuZHJvaWRKVW5pdExhdW5jaEFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRMYXVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzZGIzZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0FuZHJvaWRKVW5pdExhdW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guanVuaXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guRGVsYXllZExhdW5jaEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5JQW5kcm9pZExhdW5jaEFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWUuQW5kcm9pZEpVbml0TGF1bmNoSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWUuUmVtb3RlQWR0VGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0Lmp1bml0LmxhdW5jaGVyLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEEgbGF1bmNoIGFjdGlvbiB0aGF0IGV4ZWN1dGVzIGEgaW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVuIG9uIGFuIEFuZHJvaWQgZGV2aWNlLgotICovCi1jbGFzcyBBbmRyb2lkSlVuaXRMYXVuY2hBY3Rpb24gaW1wbGVtZW50cyBJQW5kcm9pZExhdW5jaEFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRKVW5pdExhdW5jaEluZm8gbUxhdW5jaEluZm87Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEFuZHJvaWRKVW5pdExhdW5jaEFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF1bmNoSW5mbyB0aGUge0BsaW5rIEFuZHJvaWRKVW5pdExhdW5jaEluZm99IGZvciB0aGUgSlVuaXQgcnVuIAotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkSlVuaXRMYXVuY2hBY3Rpb24oQW5kcm9pZEpVbml0TGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB7Ci0gICAgICAgIG1MYXVuY2hJbmZvID0gbGF1bmNoSW5mbzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTGF1bmNoIGEgaW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVuIG9uIGdpdmVuIEFuZHJvaWQgZGV2aWNlLiAKLSAgICAgKiBSZXVzZXMgSkRUIEpVbml0IGxhdW5jaCBkZWxlZ2F0ZSBzbyByZXN1bHRzIGNhbiBiZSBjb21tdW5pY2F0ZWQgYmFjayB0byBKRFQgSlVuaXQgVUkuCi0gICAgICogCi0gICAgICogQHNlZSBJQW5kcm9pZExhdW5jaEFjdGlvbiNkb0xhdW5jaEFjdGlvbihEZWxheWVkTGF1bmNoSW5mbywgSURldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb0xhdW5jaEFjdGlvbihEZWxheWVkTGF1bmNoSW5mbyBpbmZvLCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTGF1bmNoaW5nIGluc3RydW1lbnRhdGlvbiAlcyBvbiBkZXZpY2UgJXMiLAotICAgICAgICAgICAgICAgIG1MYXVuY2hJbmZvLmdldFJ1bm5lcigpLCBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUoaW5mby5nZXRQcm9qZWN0KCksIG1zZyk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICBtTGF1bmNoSW5mby5zZXREZWJ1Z01vZGUoaW5mby5pc0RlYnVnTW9kZSgpKTsKLSAgICAgICAgICAgbUxhdW5jaEluZm8uc2V0RGV2aWNlKGluZm8uZ2V0RGV2aWNlKCkpOwotICAgICAgICAgICBKVW5pdExhdW5jaERlbGVnYXRlIGp1bml0RGVsZWdhdGUgPSBuZXcgSlVuaXRMYXVuY2hEZWxlZ2F0ZShtTGF1bmNoSW5mbyk7Ci0gICAgICAgICAgIGZpbmFsIFN0cmluZyBtb2RlID0gaW5mby5pc0RlYnVnTW9kZSgpID8gSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSA6IAotICAgICAgICAgICAgICAgSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7IAotCi0gICAgICAgICAgIGp1bml0RGVsZWdhdGUubGF1bmNoKGluZm8uZ2V0TGF1bmNoKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLCBtb2RlLCBpbmZvLmdldExhdW5jaCgpLAotICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0TW9uaXRvcigpKTsKLQotICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGFkZCBBTVJlY2VpdmVyLXR5cGUgZnVuY3Rpb25hbGl0eSBzb21ld2hlcmUKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShpbmZvLmdldFByb2plY3QoKSwgIkZhaWxlZCB0byBsYXVuY2ggdGVzdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgSlVuaXQgbGF1bmNoIiwgbUxhdW5jaEluZm8uZ2V0UnVubmVyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZHMgdGhlIEpEVCBKVW5pdCBsYXVuY2ggZGVsZWdhdGUgdG8gYWxsb3cgZm9yIEpVbml0IFVJIHJldXNlLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKVW5pdExhdW5jaERlbGVnYXRlIGV4dGVuZHMgSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBBbmRyb2lkSlVuaXRMYXVuY2hJbmZvIG1MYXVuY2hJbmZvOwotCi0gICAgICAgIHB1YmxpYyBKVW5pdExhdW5jaERlbGVnYXRlKEFuZHJvaWRKVW5pdExhdW5jaEluZm8gbGF1bmNoSW5mbykgewotICAgICAgICAgICAgbUxhdW5jaEluZm8gPSBsYXVuY2hJbmZvOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sYXVuY2hlci5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLAotICAgICAgICAgICAgICAgIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGlzIHByb2dyZXNzIG1vbml0b3IgYWRqdXN0bWVudCBuZWVkZWQgaGVyZT8KLSAgICAgICAgICAgIHN1cGVyLmxhdW5jaChjb25maWd1cmF0aW9uLCBtb2RlLCBsYXVuY2gsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoZXIuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUjdmVyaWZ5TWFpblR5cGVOYW1lKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB2ZXJpZnlNYWluVHlwZU5hbWUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuanVuaXQuaW50ZXJuYWwucnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE92ZXJyaWRlcyBwYXJlbnQgdG8gcmV0dXJuIGEgVk0gUnVubmVyIGltcGxlbWVudGF0aW9uIHdoaWNoIGxhdW5jaGVzIGEgdGhyZWFkLCByYXRoZXIKLSAgICAgICAgICogdGhhbiBhIHNlcGFyYXRlIFZNIHByb2Nlc3MKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgSVZNUnVubmVyIGdldFZNUnVubmVyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZNVGVzdFJ1bm5lcihtTGF1bmNoSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2dldExhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJTGF1bmNoIGdldExhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG1MYXVuY2hJbmZvLmdldExhdW5jaCgpOwotICAgICAgICB9ICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhIFZNIHJ1bm5lciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdGFydHMgYSB0aHJlYWQgaW1wbGVtZW50YXRpb24gb2YgYSBsYXVuY2ggcHJvY2VzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZNVGVzdFJ1bm5lciBpbXBsZW1lbnRzIElWTVJ1bm5lciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRKVW5pdExhdW5jaEluZm8gbUpVbml0SW5mbzsKLSAgICAgICAgCi0gICAgICAgIFZNVGVzdFJ1bm5lcihBbmRyb2lkSlVuaXRMYXVuY2hJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIG1KVW5pdEluZm8gPSBpbmZvOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgVk1SdW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZywgSUxhdW5jaCBsYXVuY2gsCi0gICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRlc3RSdW5uZXJQcm9jZXNzIHJ1bm5lclByb2Nlc3MgPSAKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFJ1bm5lclByb2Nlc3MoY29uZmlnLCBtSlVuaXRJbmZvKTsKLSAgICAgICAgICAgIHJ1bm5lclByb2Nlc3Muc3RhcnQoKTsKLSAgICAgICAgICAgIGxhdW5jaC5hZGRQcm9jZXNzKHJ1bm5lclByb2Nlc3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF1bmNoIHByb2Nlc3MgdGhhdCBleGVjdXRlcyB0aGUgdGVzdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJ1bm5lclByb2Nlc3MgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBJUHJvY2VzcyAgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgVk1SdW5uZXJDb25maWd1cmF0aW9uIG1SdW5Db25maWc7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyBtSlVuaXRJbmZvOwotICAgICAgICBwcml2YXRlIFJlbW90ZUFkdFRlc3RSdW5uZXIgbVRlc3RSdW5uZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGVybWluYXRlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgVGVzdFJ1bm5lclByb2Nlc3MoVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZywgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBtUnVuQ29uZmlnID0gcnVuQ29uZmlnOwotICAgICAgICAgICAgbUpVbml0SW5mbyA9IGluZm87Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGtleSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3MjZ2V0RXhpdFZhbHVlKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RXhpdFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzcyNnZXRMYWJlbCgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1KVW5pdEluZm8uZ2V0TGF1bmNoKCkuZ2V0TGF1bmNoTW9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3MjZ2V0TGF1bmNoKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSlVuaXRJbmZvLmdldExhdW5jaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3MjZ2V0U3RyZWFtc1Byb3h5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJU3RyZWFtc1Byb3h5IGdldFN0cmVhbXNQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3Mjc2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIAotICAgICAgICAgKiBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgLy8gaWdub3JlICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLSAgICAgICAgICovCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2NhblRlcm1pbmF0ZSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjaXNUZXJtaW5hdGVkKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNUZXJtaW5hdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjdGVybWluYXRlKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtVGVzdFJ1bm5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RSdW5uZXIudGVybWluYXRlKCk7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICAgICAgbUlzVGVybWluYXRlZCA9IHRydWU7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExhdW5jaGVzIGEgdGVzdCBydW5uZXIgdGhhdCB3aWxsIGNvbW11bmljYXRlIHJlc3VsdHMgYmFjayB0byBKRFQgSlVuaXQgVUkKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtVGVzdFJ1bm5lciA9IG5ldyBSZW1vdGVBZHRUZXN0UnVubmVyKCk7Ci0gICAgICAgICAgICBtVGVzdFJ1bm5lci5ydW5UZXN0cyhtUnVuQ29uZmlnLmdldFByb2dyYW1Bcmd1bWVudHMoKSwgbUpVbml0SW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg3MmJjOC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0FuZHJvaWRKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkFuZHJvaWRMYXVuY2g7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5BbmRyb2lkTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLkFuZHJvaWRMYXVuY2hDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guSUFuZHJvaWRMYXVuY2hBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5MYXVuY2hDb25maWdEZWxlZ2F0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWUuQW5kcm9pZEpVbml0TGF1bmNoSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTWFuaWZlc3RQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyLkluc3RydW1lbnRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQubGF1bmNoZXIuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5sYXVuY2hlci5UZXN0S2luZFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIFJ1biBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGV4ZWN1dGUgSlVuaXQgdGVzdHMgb24gYW4gQW5kcm9pZCBwbGF0Zm9ybS4KLSAqIDxwLz4KLSAqIFdpbGwgZGVwbG95IGFwcHMgb24gdGFyZ2V0IEFuZHJvaWQgcGxhdGZvcm0gYnkgcmV1c2luZyBmdW5jdGlvbmFsaXR5IGZyb20gQURUCi0gKiBMYXVuY2hDb25maWdEZWxlZ2F0ZSwgYW5kIHRoZW4gcnVuIEpVbml0cyB0ZXN0cyBieSByZXVzaW5nIGZ1bmN0aW9uYWxpdHkgZnJvbSBKRFQKLSAqIEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hDb25maWdEZWxlZ2F0ZSB7Ci0KLSAgICAvKiogTGF1bmNoIGNvbmZpZyBhdHRyaWJ1dGUgdGhhdCBzdG9yZXMgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lci4gKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU5TVFJfTkFNRSA9IEFkdFBsdWdpbi5QTFVHSU5fSUQgKyAiLmluc3RydW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9MYXVuY2goZmluYWwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgU3RyaW5nIG1vZGUsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIEFuZHJvaWRMYXVuY2ggYW5kcm9pZExhdW5jaCwKLSAgICAgICAgICAgIEFuZHJvaWRMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywgQW5kcm9pZExhdW5jaENvbnRyb2xsZXIgY29udHJvbGxlciwKLSAgICAgICAgICAgIElGaWxlIGFwcGxpY2F0aW9uUGFja2FnZSwgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyKSB7Ci0KLSAgICAgICAgU3RyaW5nIHJ1bm5lciA9IGdldFJ1bm5lcihwcm9qZWN0LCBjb25maWd1cmF0aW9uLCBtYW5pZmVzdFBhcnNlcik7Ci0gICAgICAgIGlmIChydW5uZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiQW5kcm9pZCBMYXVuY2giLAotICAgICAgICAgICAgICAgICAgICAiQW4gaW5zdHJ1bWVudGlvbiB0ZXN0IHJ1bm5lciBpcyBub3Qgc3BlY2lmaWVkISIpOwotICAgICAgICAgICAgYW5kcm9pZExhdW5jaC5zdG9wTGF1bmNoKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ2V0IHRoZSB0YXJnZXQgYXBwJ3MgcGFja2FnZQotICAgICAgICBTdHJpbmcgdGFyZ2V0QXBwUGFja2FnZSA9IGdldFRhcmdldFBhY2thZ2UobWFuaWZlc3RQYXJzZXIsIHJ1bm5lcik7IAotICAgICAgICBpZiAodGFyZ2V0QXBwUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheUVycm9yKCJBbmRyb2lkIExhdW5jaCIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkEgdGFyZ2V0IHBhY2thZ2UgZm9yIGluc3RydW1lbnRpb24gdGVzdCBydW5uZXIgJTEkcyBjb3VsZCBub3QgYmUgZm91bmQhIiwgCi0gICAgICAgICAgICAgICAgICAgIHJ1bm5lcikpOwotICAgICAgICAgICAgYW5kcm9pZExhdW5jaC5zdG9wTGF1bmNoKCk7Ci0gICAgICAgICAgICByZXR1cm47IAotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB0ZXN0QXBwUGFja2FnZSA9IG1hbmlmZXN0UGFyc2VyLmdldFBhY2thZ2UoKTsKLSAgICAgICAgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyBqdW5pdExhdW5jaEluZm8gPSBuZXcgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyhwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICB0ZXN0QXBwUGFja2FnZSwgcnVubmVyKTsKLSAgICAgICAganVuaXRMYXVuY2hJbmZvLnNldFRlc3RDbGFzcyhnZXRUZXN0Q2xhc3MoY29uZmlndXJhdGlvbikpOwotICAgICAgICBqdW5pdExhdW5jaEluZm8uc2V0VGVzdFBhY2thZ2UoZ2V0VGVzdFBhY2thZ2UoY29uZmlndXJhdGlvbikpOwotICAgICAgICBqdW5pdExhdW5jaEluZm8uc2V0VGVzdE1ldGhvZChnZXRUZXN0TWV0aG9kKGNvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAganVuaXRMYXVuY2hJbmZvLnNldExhdW5jaChhbmRyb2lkTGF1bmNoKTsKLSAgICAgICAgSUFuZHJvaWRMYXVuY2hBY3Rpb24ganVuaXRMYXVuY2ggPSBuZXcgQW5kcm9pZEpVbml0TGF1bmNoQWN0aW9uKGp1bml0TGF1bmNoSW5mbyk7Ci0gICAgICAgIAotICAgICAgICBjb250cm9sbGVyLmxhdW5jaChwcm9qZWN0LCBtb2RlLCBhcHBsaWNhdGlvblBhY2thZ2UsIHRlc3RBcHBQYWNrYWdlLCB0YXJnZXRBcHBQYWNrYWdlLAotICAgICAgICAgICAgICAgIG1hbmlmZXN0UGFyc2VyLmdldERlYnVnZ2FibGUoKSwgbWFuaWZlc3RQYXJzZXIuZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpLAotICAgICAgICAgICAgICAgIGp1bml0TGF1bmNoLCBjb25maWcsIGFuZHJvaWRMYXVuY2gsIG1vbml0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGFyZ2V0IEFuZHJvaWQgYXBwbGljYXRpb24ncyBwYWNrYWdlIGZvciB0aGUgZ2l2ZW4gaW5zdHJ1bWVudGF0aW9uIHJ1bm5lciwgb3IgCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY291bGQgbm90IGJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmlmZXN0UGFyc2VyIHRoZSB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfSBmb3IgdGhlIHRlc3QgcHJvamVjdAotICAgICAqIEBwYXJhbSBydW5uZXIgdGhlIGluc3RydW1lbnRhdGlvbiBydW5uZXIgY2xhc3MgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UGFja2FnZShBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3RQYXJzZXIsIFN0cmluZyBydW5uZXIpIHsKLSAgICAgICAgZm9yIChJbnN0cnVtZW50YXRpb24gaW5zdHIgOiBtYW5pZmVzdFBhcnNlci5nZXRJbnN0cnVtZW50YXRpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChpbnN0ci5nZXROYW1lKCkuZXF1YWxzKHJ1bm5lcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHIuZ2V0VGFyZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlc3QgcGFja2FnZSBzdG9yZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgCi0gICAgICogc3BlY2lmaWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSB7QGxpbmsgSUxhdW5jaENvbmZpZ3VyYXRpb259IHRvIHJldHJpZXZlIHRoZSB0ZXN0IHBhY2thZ2UgaW5mbyBmcm9tCi0gICAgICogQHJldHVybiB0aGUgdGVzdCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFRlc3RQYWNrYWdlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgLy8gdHJ5IHRvIHJldHJpZXZlIGEgcGFja2FnZSBuYW1lIGZyb20gdGhlIEpVbml0IGNvbnRhaW5lciBhdHRyaWJ1dGUKLSAgICAgICAgU3RyaW5nIGNvbnRhaW5lckhhbmRsZSA9IGdldFN0cmluZ0xhdW5jaEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9URVNUX0NPTlRBSU5FUiwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIGlmIChjb250YWluZXJIYW5kbGUgIT0gbnVsbCAmJiBjb250YWluZXJIYW5kbGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShjb250YWluZXJIYW5kbGUpOwotICAgICAgICAgICAgLy8gY29udGFpbmVySGFuZGxlIGNvdWxkIGJlIGEgSVByb2plY3QsIGNoZWNrIGlmIGl0cyBhIGphdmEgcGFja2FnZQotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVzdCBjbGFzcyBzdG9yZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIHtAbGluayBJTGF1bmNoQ29uZmlndXJhdGlvbn0gdG8gcmV0cmlldmUgdGhlIHRlc3QgY2xhc3MgaW5mbyBmcm9tCi0gICAgICogQHJldHVybiB0aGUgdGVzdCBjbGFzcy4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0Q2xhc3MoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nTGF1bmNoQXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0IG1ldGhvZCBzdG9yZWQgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIHtAbGluayBJTGF1bmNoQ29uZmlndXJhdGlvbn0gdG8gcmV0cmlldmUgdGhlIHRlc3QgbWV0aG9kIGluZm8gZnJvbQotICAgICAqIEByZXR1cm4gdGhlIHRlc3QgbWV0aG9kLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFRlc3RNZXRob2QoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nTGF1bmNoQXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGluc3RydW1lbnRhdGlvbiBydW5uZXIgZm9yIHRoZSBsYXVuY2guIAotICAgICAqIDxwLz4KLSAgICAgKiBJZiBhIHJ1bm5lciBpcyBzdG9yZWQgaW4gdGhlIGdpdmVuIDxjb2RlPmNvbmZpZ3VyYXRpb248L2NvZGU+LCB3aWxsIHJldHVybiB0aGF0LgotICAgICAqIE90aGVyd2lzZSwgd2lsbCB0cnkgdG8gZmluZCB0aGUgZmlyc3QgdmFsaWQgcnVubmVyIGZvciB0aGUgcHJvamVjdC4KLSAgICAgKiBJZiBhIHJ1bm5lciBjYW4gc3RpbGwgbm90IGJlIGZvdW5kLCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUge0BsaW5rIElQcm9qZWN0fSBmb3IgdGhlIGFwcCAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9ufSBmb3IgdGhlIGxhdW5jaAotICAgICAqIEBwYXJhbSBtYW5pZmVzdFBhcnNlciB0aGUge0BsaW5rIEFuZHJvaWRNYW5pZmVzdFBhcnNlcn0gZm9yIHRoZSBwcm9qZWN0Ci0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbnN0cnVtZW50YXRpb24gcnVubmVyIGNhbiBiZSBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybgotICAgICAqICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBydW5uZXIgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSdW5uZXIoSVByb2plY3QgcHJvamVjdCwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBtYW5pZmVzdFBhcnNlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHJ1bm5lciA9IGdldFJ1bm5lckZyb21Db25maWcoY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAocnVubmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcnVubmVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yIGluc3RyRmluZGVyID0gbmV3IEluc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG1hbmlmZXN0UGFyc2VyKTsKLSAgICAgICAgICAgIHJ1bm5lciA9IGluc3RyRmluZGVyLmdldFZhbGlkSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcigpOwotICAgICAgICAgICAgaWYgKHJ1bm5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIldhcm5pbmc6IE5vIGluc3RydW1lbnRhdGlvbiBydW5uZXIgZm91bmQgZm9yIHRoZSBsYXVuY2gsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgJTEkcyIsIHJ1bm5lcikpOwotICAgICAgICAgICAgICAgIHJldHVybiBydW5uZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJFUlJPUjogQXBwbGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhICUxJHMgaW5zdHJ1bWVudGF0aW9uIG9yIGRvZXMgbm90IGRlY2xhcmUgdXNlcy1saWJyYXJ5ICUyJHMiLAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0lOU1RSVU1FTlRBVElPTl9SVU5ORVIsIAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkxJQlJBUllfVEVTVF9SVU5ORVIpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkVycm9yIHdoZW4gcmV0cmlldmluZyBpbnN0cnVtZW50YXRpb24gaW5mbyIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFJ1bm5lckZyb21Db25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nTGF1bmNoQXR0cmlidXRlKEFUVFJfSU5TVFJfTkFNRSwgY29uZmlndXJhdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgYSBzdHJpbmcgYXR0cmlidXRlIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgbmFtZSBvZiB0aGUgbGF1bmNoIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSB7QGxpbmsgSUxhdW5jaENvbmZpZ3VyYXRpb259IHRvIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nTGF1bmNoQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIEVNUFRZX1NUUklORyk7Ci0gICAgICAgICAgICBpZiAoYXR0clZhbHVlLmxlbmd0aCgpIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGF0dHJWYWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsIFN0cmluZy5mb3JtYXQoIkVycm9yIHdoZW4gcmV0cmlldmluZyBsYXVuY2ggaW5mbyAlMSRzIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gc2V0IEpVbml0LXJlbGF0ZWQgYXR0cmlidXRlcyBleHBlY3RlZCBieSBKRFQgSlVuaXQgcnVubmVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gbW9kaWZ5Ci0gICAgICovCi0gICAgc3RhdGljIHZvaWQgc2V0SlVuaXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotICAgICAgICAvLyBzZXQgdGhlIHRlc3QgcnVubmVyIHRvIEpVbml0MyB0byBwbGFjYXRlIEpEVCBKVW5pdCBydW5uZXIgbG9naWMKLSAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9URVNUX1JVTk5FUl9LSU5ELCAKLSAgICAgICAgICAgICAgICBUZXN0S2luZFJlZ2lzdHJ5LkpVTklUM19URVNUX0tJTkRfSUQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTYyYTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5qdW5pdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5NYWluTGF1bmNoQ29uZmlnVGFiOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkJhc2VQcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RDaG9vc2VySGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQubGF1bmNoZXIuSVRlc3RLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5sYXVuY2hlci5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLkpVbml0TWlncmF0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLlRlc3RLaW5kUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLlRlc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnVpLkpVbml0TWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnV0aWwuTGF5b3V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQudXRpbC5UZXN0U2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLlR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZFZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBsYXVuY2ggY29uZmlnIFVJIHRhYiBmb3IgQW5kcm9pZCBKVW5pdAotICogPHAvPgotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0Lmp1bml0LmxhdW5jaGVyLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEFuZHJvaWRKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCi0gICAgLy8gUHJvamVjdCBVSSB3aWRnZXRzCi0gICAgcHJpdmF0ZSBMYWJlbCBtUHJvakxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBtUHJvalRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVByb2pCdXR0b247Ci0gICAgCi0gICAgLy8gVGVzdCBjbGFzcyBVSSB3aWRnZXRzCi0gICAgcHJpdmF0ZSBUZXh0IG1UZXN0VGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU2VhcmNoQnV0dG9uOwotICAgIHByaXZhdGUgU3RyaW5nIG1PcmlnaW5hbFRlc3RNZXRob2ROYW1lOwotICAgIHByaXZhdGUgTGFiZWwgbVRlc3RNZXRob2RMYWJlbDsKLSAgICBwcml2YXRlIFRleHQgbUNvbnRhaW5lclRleHQ7Ci0gICAgcHJpdmF0ZSBJSmF2YUVsZW1lbnQgbUNvbnRhaW5lckVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJTGFiZWxQcm92aWRlciBtSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyID0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbUNvbnRhaW5lclNlYXJjaEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtVGVzdENvbnRhaW5lclJhZGlvQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1UZXN0UmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBMYWJlbCBtVGVzdExhYmVsOyAKLQotICAgIC8vIEFuZHJvaWQgc3BlY2lmaWMgbWVtYmVycwotICAgIHByaXZhdGUgSW1hZ2UgbVRhYkljb24gPSBudWxsOwotICAgIHByaXZhdGUgQ29tYm8gbUluc3RydW1lbnRhdGlvbkNvbWJvOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1JbnN0cnVtZW50YXRpb25zID0gbnVsbDsKLSAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvciBtSW5zdHJWYWxpZGF0b3IgPSBudWxsOwotICAgIHByaXZhdGUgUHJvamVjdENob29zZXJIZWxwZXIgbVByb2plY3RDaG9vc2VySGVscGVyOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1Qcm9qZWN0Q2hvb3NlckhlbHBlciA9IG5ldyBQcm9qZWN0Q2hvb3NlckhlbHBlcihwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXRDb250cm9sKGNvbXApOwotCi0gICAgICAgIEdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdG9wTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBjb21wLnNldExheW91dCh0b3BMYXlvdXQpOyAgICAgIAotICAgICAgICAKLSAgICAgICAgY3JlYXRlU2luZ2xlVGVzdFNlY3Rpb24oY29tcCk7Ci0gICAgICAgIGNyZWF0ZVRlc3RDb250YWluZXJTZWxlY3Rpb25Hcm91cChjb21wKTsKLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZVNwYWNlcihjb21wKTsKLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdyb3VwKGNvbXApOwotCi0gICAgICAgIGNyZWF0ZVNwYWNlcihjb21wKTsKLSAgICAgICAgCi0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcCk7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBoZWxwIGxpbmsgaGVyZSB3aGVuIGF2YWlsYWJsZQotICAgICAgICAvL1BsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgLy8gICAgICBJSlVuaXRIZWxwQ29udGV4dElkcy5MQVVOQ0hfQ09ORklHVVJBVElPTl9ESUFMT0dfSlVOSVRfTUFJTl9UQUIpOwotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTcGFjZXIoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2luZ2xlVGVzdFNlY3Rpb24oQ29tcG9zaXRlIGNvbXApIHsKLSAgICAgICAgbVRlc3RSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlJBRElPKTsKLSAgICAgICAgbVRlc3RSYWRpb0J1dHRvbi5zZXRUZXh0KEpVbml0TWVzc2FnZXMuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiX2xhYmVsX29uZVRlc3QpOyAKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBtVGVzdFJhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOyAKLSAgICAgICAgbVRlc3RSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtVGVzdFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbVByb2pMYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Qcm9qTGFiZWwuc2V0VGV4dChKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl9sYWJlbF9wcm9qZWN0KTsgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAyNTsKLSAgICAgICAgbVByb2pMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgCi0gICAgICAgIG1Qcm9qVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVByb2pUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtUHJvalRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtU2VhcmNoQnV0dG9uLnNldEVuYWJsZWQobVRlc3RSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9qVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgbVByb2pCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLSAgICAgICAgbVByb2pCdXR0b24uc2V0VGV4dChKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl9sYWJlbF9icm93c2UpOyAKLSAgICAgICAgbVByb2pCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2V0QnV0dG9uR3JpZERhdGEobVByb2pCdXR0b24pOwotICAgICAgICAKLSAgICAgICAgbVRlc3RMYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAyNTsKLSAgICAgICAgbVRlc3RMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbVRlc3RMYWJlbC5zZXRUZXh0KEpVbml0TWVzc2FnZXMuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiX2xhYmVsX3Rlc3QpOyAKLSAgICAgICAgCi0gICAgCi0gICAgICAgIG1UZXN0VGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVRlc3RUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtVGVzdFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbVNlYXJjaEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotICAgICAgICBtU2VhcmNoQnV0dG9uLnNldEVuYWJsZWQobVByb2pUZXh0LmdldFRleHQoKS5sZW5ndGgoKSA+IDApOwotICAgICAgICBtU2VhcmNoQnV0dG9uLnNldFRleHQoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfbGFiZWxfc2VhcmNoKTsgCi0gICAgICAgIG1TZWFyY2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlYXJjaEJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBzZXRCdXR0b25HcmlkRGF0YShtU2VhcmNoQnV0dG9uKTsKLSAgICAgICAgCi0gICAgICAgIG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICBtVGVzdE1ldGhvZExhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLSAgICAgICAgbVRlc3RNZXRob2RMYWJlbC5zZXRUZXh0KCIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBtVGVzdE1ldGhvZExhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXN0Q29udGFpbmVyU2VsZWN0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAgICAgbVRlc3RDb250YWluZXJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlJBRElPKTsKLSAgICAgICAgbVRlc3RDb250YWluZXJSYWRpb0J1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgICJSdW4gYWxsIHRlc3RzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0LCBvciBwYWNrYWdlIik7IAotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG1UZXN0Q29udGFpbmVyUmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1UZXN0Q29udGFpbmVyUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChtVGVzdENvbnRhaW5lclJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1Db250YWluZXJUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IDI1OwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1Db250YWluZXJUZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtQ29udGFpbmVyVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUNvbnRhaW5lclNlYXJjaEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotICAgICAgICBtQ29udGFpbmVyU2VhcmNoQnV0dG9uLnNldFRleHQoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfbGFiZWxfc2VhcmNoKTsgCi0gICAgICAgIG1Db250YWluZXJTZWFyY2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNvbnRhaW5lclNlYXJjaEJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBzZXRCdXR0b25HcmlkRGF0YShtQ29udGFpbmVyU2VhcmNoQnV0dG9uKTsgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlSW5zdHJ1bWVudGF0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAgICAgTGFiZWwgbG9hZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotICAgICAgICBsb2FkZXJMYWJlbC5zZXRUZXh0KCJJbnN0cnVtZW50YXRpb24gcnVubmVyOiIpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMDsKLSAgICAgICAgbG9hZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIAotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uQ29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb25Db21iby5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb250YWluZXJTZWFyY2hCdXR0b25TZWxlY3RlZCgpIHsKLSAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gY2hvb3NlQ29udGFpbmVyKG1Db250YWluZXJFbGVtZW50KTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldENvbnRhaW5lckVsZW1lbnQoamF2YUVsZW1lbnQpOwotICAgICAgICB9ICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDb250YWluZXJFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBtQ29udGFpbmVyRWxlbWVudCA9IGphdmFFbGVtZW50OwotICAgICAgICBtQ29udGFpbmVyVGV4dC5zZXRUZXh0KGdldFByZXNlbnRhdGlvbk5hbWUoamF2YUVsZW1lbnQpKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIHVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSB1cGRhdGVQcm9qZWN0RnJvbUNvbmZpZyhjb25maWcpOwotICAgICAgICBTdHJpbmcgY29udGFpbmVySGFuZGxlID0gRU1QVFlfU1RSSU5HOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGFpbmVySGFuZGxlID0gY29uZmlnLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVEVTVF9DT05UQUlORVIsIEVNUFRZX1NUUklORyk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoY29udGFpbmVySGFuZGxlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdXBkYXRlVGVzdENvbnRhaW5lckZyb21Db25maWcoY29uZmlnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVwZGF0ZVRlc3RUeXBlRnJvbUNvbmZpZyhjb25maWcpOwotICAgICAgICB9ICAgIAotCi0gICAgICAgIElQcm9qZWN0IHByb2ogPSBtUHJvamVjdENob29zZXJIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBsb2FkSW5zdHJ1bWVudGF0aW9ucyhwcm9qKTsKLSAgICAgICAgdXBkYXRlSW5zdHJ1bWVudGF0aW9uRnJvbUNvbmZpZyhjb25maWcpOwotICAgICAgICAKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUluc3RydW1lbnRhdGlvbkZyb21Db25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjdXJyZW50SW5zdHJ1bWVudGF0aW9uID0gY29uZmlnLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9JTlNUUl9OQU1FLCBFTVBUWV9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKG1JbnN0cnVtZW50YXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIGluIHRoZSBjb21iby4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1JbnN0cnVtZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbnN0cnVtZW50YXRpb24uZXF1YWxzKG1JbnN0cnVtZW50YXRpb25zW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb25Db21iby5zZWxlY3QoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgfSAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1cGRhdGVQcm9qZWN0RnJvbUNvbmZpZyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdE5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgRU1QVFlfU1RSSU5HKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgbVByb2pUZXh0LnNldFRleHQocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gcHJvamVjdE5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRlc3RUeXBlRnJvbUNvbmZpZyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgU3RyaW5nIHRlc3RUeXBlTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgbU9yaWdpbmFsVGVzdE1ldGhvZE5hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0VHlwZU5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtT3JpZ2luYWxUZXN0TWV0aG9kTmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgICAgICBtVGVzdFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgc2V0RW5hYmxlU2luZ2xlVGVzdEdyb3VwKHRydWUpOwotICAgICAgICBzZXRFbmFibGVDb250YWluZXJUZXN0R3JvdXAoZmFsc2UpOyAgICAgCi0gICAgICAgIG1UZXN0Q29udGFpbmVyUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgbVRlc3RUZXh0LnNldFRleHQodGVzdFR5cGVOYW1lKTsKLSAgICAgICAgbUNvbnRhaW5lclRleHQuc2V0VGV4dChFTVBUWV9TVFJJTkcpOyAKLSAgICAgICAgc2V0VGVzdE1ldGhvZExhYmVsKG1PcmlnaW5hbFRlc3RNZXRob2ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VGVzdE1ldGhvZExhYmVsKFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkgewotICAgICAgICBpZiAoIUVNUFRZX1NUUklORy5lcXVhbHModGVzdE1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICBtVGVzdE1ldGhvZExhYmVsLnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgIEpVbml0TWVzc2FnZXMuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiX2xhYmVsX21ldGhvZCArIAotICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxUZXN0TWV0aG9kTmFtZSk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRlc3RNZXRob2RMYWJlbC5zZXRUZXh0KEVNUFRZX1NUUklORyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGVzdENvbnRhaW5lckZyb21Db25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIFN0cmluZyBjb250YWluZXJIYW5kbGUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgIElKYXZhRWxlbWVudCBjb250YWluZXJFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRhaW5lckhhbmRsZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfQ09OVEFJTkVSLCBFTVBUWV9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKGNvbnRhaW5lckhhbmRsZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKGNvbnRhaW5lckhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250YWluZXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudDsKLSAgICAgICAgfSAgICAKLSAgICAgICAgbVRlc3RDb250YWluZXJSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHNldEVuYWJsZVNpbmdsZVRlc3RHcm91cChmYWxzZSk7Ci0gICAgICAgIHNldEVuYWJsZUNvbnRhaW5lclRlc3RHcm91cCh0cnVlKTsgICAgICAgICAgICAgIAotICAgICAgICBtVGVzdFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGlmIChtQ29udGFpbmVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udGFpbmVyVGV4dC5zZXRUZXh0KGdldFByZXNlbnRhdGlvbk5hbWUobUNvbnRhaW5lckVsZW1lbnQpKTsKLSAgICAgICAgfSAgICAKLSAgICAgICAgbVRlc3RUZXh0LnNldFRleHQoRU1QVFlfU1RSSU5HKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3BlcmZvcm1BcHBseShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0gICAgICAgIGlmIChtVGVzdENvbnRhaW5lclJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIG1Db250YWluZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRhaW5lckVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVEVTVF9DT05UQUlORVIsIAotICAgICAgICAgICAgICAgICAgICBtQ29udGFpbmVyRWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgRU1QVFlfU1RSSU5HKTsKLSAgICAgICAgICAgICAvL3dvcmthcm91bmQgZm9yIEVjbGlwc2UgYnVnIDY1Mzk5Ci0gICAgICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIEVNUFRZX1NUUklORyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgbVByb2pUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICBtVGVzdFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVEVTVF9DT05UQUlORVIsCi0gICAgICAgICAgICAgICAgICAgIEVNUFRZX1NUUklORyk7Ci0gICAgICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFRlc3RNZXRob2ROYW1lKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwUmVzb3VyY2VzKGNvbmZpZyk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETzogZG9lcyB0aGUgcmVhbCBlcnJvciBuZWVkIHRvIGJlIGV4dHJhY3RlZCBvdXQgb2YgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRXJyb3Igb2NjdXJyZWQgc2F2aW5nIGNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIEFuZHJvaWRKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLnNldEpVbml0RGVmYXVsdHMoY29uZmlnKTsKLSAgICAgICAgCi0gICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9JTlNUUl9OQU1FLAotICAgICAgICAgICAgICAgIGdldFNlbGVjdGVkSW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXBSZXNvdXJjZXMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEpVbml0TWlncmF0aW9uRGVsZWdhdGUubWFwUmVzb3VyY2VzKGNvbmZpZyk7Ci0gICAgfSAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKG1UYWJJY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UYWJJY29uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1UYWJJY29uID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBtSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0SW1hZ2UoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgLy8gcmV1c2UgaWNvbiBmcm9tIHRoZSBBbmRyb2lkIEFwcCBMYXVuY2ggY29uZmlnIHRhYgotICAgICAgICBpZiAobVRhYkljb24gPT0gbnVsbCkgewotICAgICAgICAgICAgbVRhYkljb24gPSBBZHRQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKS5sb2FkSW1hZ2UoTWFpbkxhdW5jaENvbmZpZ1RhYi5MQVVOQ0hfVEFCX0lNQUdFLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVRhYkljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBhIGRpYWxvZyB0aGF0IGxpc3RzIGFsbCBtYWluIHR5cGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlYXJjaEJ1dHRvblNlbGVjdGVkKCkgewotICAgICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQotICAgICAgICBJVHlwZVtdIHR5cGVzID0gbmV3IElUeXBlWzBdOwotICAgICAgICBib29sZWFuW10gcmFkaW9TZXR0aW5nID0gbmV3IGJvb2xlYW5bMl07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXggZm9yIEVjbGlwc2UgYnVnIDY2OTIyIFdyb25nIHJhZGlvIGJlaGF2aW91ciB3aGVuIHN3aXRjaGluZwotICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbgotICAgICAgICAgICAgcmFkaW9TZXR0aW5nWzBdID0gbVRlc3RSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHJhZGlvU2V0dGluZ1sxXSA9IG1UZXN0Q29udGFpbmVyUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHR5cGVzID0gVGVzdFNlYXJjaEVuZ2luZS5maW5kVGVzdHMoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpLCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEtpbmQoKSk7IAotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgIkVycm9yIGZpbmRpbmcgdGVzdCB0eXBlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtVGVzdFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihyYWRpb1NldHRpbmdbMF0pOwotICAgICAgICAgICAgbVRlc3RDb250YWluZXJSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocmFkaW9TZXR0aW5nWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgVGVzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgdHlwZXMpOwotICAgICAgICBkaWFsb2cuc2V0VGl0bGUoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfdGVzdGRpYWxvZ190aXRsZSk7IAotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl90ZXN0ZGlhbG9nX21lc3NhZ2UpOyAKLSAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0W10gcmVzdWx0cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgaWYgKChyZXN1bHRzID09IG51bGwpIHx8IChyZXN1bHRzLmxlbmd0aCA8IDEpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIHJlc3VsdHNbMF07Ci0KLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RUZXh0LnNldFRleHQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdCA9IHR5cGUuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgIG1Qcm9qVGV4dC5zZXRUZXh0KGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJVGVzdEtpbmQgZ2V0VGVzdEtpbmQoKSB7Ci0gICAgICAgIC8vIGhhcmRkY29kZSB0aGlzIHRvIEpVbml0IDMKLSAgICAgICAgcmV0dXJuIFRlc3RLaW5kUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldEtpbmQoVGVzdEtpbmRSZWdpc3RyeS5KVU5JVDNfVEVTVF9LSU5EX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IGEgZGlhbG9nIHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgYSBBbmRyb2lkIHByb2plY3QuICBUaGlzIGluIHR1cm4gcHJvdmlkZXMKLSAgICAgKiBjb250ZXh0IGZvciB0aGUgbWFpbiB0eXBlLCBhbGxvd2luZyB0aGUgdXNlciB0byBrZXkgYSBtYWluIHR5cGUgbmFtZSwgb3IKLSAgICAgKiBjb25zdHJhaW5pbmcgdGhlIHNlYXJjaCBmb3IgbWFpbiB0eXBlcyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBtUHJvamVjdENob29zZXJIZWxwZXIuY2hvb3NlSmF2YVByb2plY3QoZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgbVByb2pUZXh0LnNldFRleHQocHJvamVjdE5hbWUpOwotICAgICAgICBsb2FkSW5zdHJ1bWVudGF0aW9ucyhwcm9qZWN0LmdldFByb2plY3QoKSk7ICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJSmF2YVByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKiB0ZXh0IGZpZWxkLCBvciBudWxsIGlmIHRoZSB0ZXh0IGRvZXMgbm90IG1hdGNoIGEgQW5kcm9pZCBwcm9qZWN0IG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7ICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHNwZWNpZmllZCBwcm9qZWN0LiBOdWxsIGlmIG5vIHByb2plY3QgaXMgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1Qcm9qVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBpZiAocHJvamVjdE5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGFjY2VzcyB0byB0aGUgamF2YSBtb2RlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNb2RlQ2hhbmdlZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1NpbmdsZVRlc3RNb2RlID0gbVRlc3RSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgc2V0RW5hYmxlU2luZ2xlVGVzdEdyb3VwKGlzU2luZ2xlVGVzdE1vZGUpOwotICAgICAgICBzZXRFbmFibGVDb250YWluZXJUZXN0R3JvdXAoIWlzU2luZ2xlVGVzdE1vZGUpOwotICAgICAgICBpZiAoIWlzU2luZ2xlVGVzdE1vZGUgJiYgbUNvbnRhaW5lclRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qVGV4dCA9IG1Qcm9qVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoUGF0aC5FTVBUWS5pc1ZhbGlkU2VnbWVudChwcm9qVGV4dCkpIHsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChwcm9qVGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGFpbmVyRWxlbWVudChqYXZhUHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7ICAgICAgIAotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAgICAgaWYgKG1UZXN0Q29udGFpbmVyUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGlmIChtQ29udGFpbmVyRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKEpVbml0TWVzc2FnZXMuSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uVGFiX2Vycm9yX25vQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxpZGF0ZUphdmFQcm9qZWN0KG1Db250YWluZXJFbGVtZW50LmdldEphdmFQcm9qZWN0KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbVByb2pUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfZXJyb3JfcHJvamVjdG5vdGRlZmluZWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVQYXRoKElQYXRoLlNFUEFSQVRPUiArIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZS5QUk9KRUNUKTsKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpIHx8ICFQYXRoLlJPT1QuaXNWYWxpZFNlZ21lbnQocHJvamVjdE5hbWUpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICBKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl9lcnJvcl9pbnZhbGlkUHJvamVjdE5hbWUsIAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0TmFtZSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfZXJyb3JfcHJvamVjdG5vdGV4aXN0cyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICB2YWxpZGF0ZUphdmFQcm9qZWN0KGphdmFQcm9qZWN0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIlNwZWNpZmllZCBwcm9qZWN0IGlzIG5vdCBhbiBBbmRyb2lkIHByb2plY3QiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbVRlc3RUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfZXJyb3JfdGVzdG5vdGRlZmluZWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfZXJyb3JfdGVzdF9jbGFzc19ub3RfZm91bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBjbGFzc05hbWUsIHByb2plY3ROYW1lIH0pKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgInZhbGlkYXRlUGFnZSBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVJbnN0cnVtZW50YXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVKYXZhUHJvamVjdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgaWYgKCFUZXN0U2VhcmNoRW5naW5lLmhhc1Rlc3RDYXNlVHlwZShqYXZhUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl9lcnJvcl90ZXN0Y2FzZW5vdG9ucGF0aCk7IAotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUluc3RydW1lbnRhdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGluc3RydW1lbnRhdGlvbiA9IGdldFNlbGVjdGVkSW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIGlmIChpbnN0cnVtZW50YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJJbnN0cnVtZW50YXRpb24gcnVubmVyIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbUluc3RyVmFsaWRhdG9yLnZhbGlkYXRlSW5zdHJ1bWVudGF0aW9uUnVubmVyKGluc3RydW1lbnRhdGlvbik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yLklOU1RSVU1FTlRBVElPTl9PSykgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZEluc3RydW1lbnRhdGlvbigpIHsKLSAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gbUluc3RydW1lbnRhdGlvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChtSW5zdHJ1bWVudGF0aW9ucyAhPSBudWxsICYmIHNlbGVjdGlvbkluZGV4ID49IDAgJiYgCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPCBtSW5zdHJ1bWVudGF0aW9ucy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdHJ1bWVudGF0aW9uc1tzZWxlY3Rpb25JbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZUNvbnRhaW5lclRlc3RHcm91cChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgbUNvbnRhaW5lclNlYXJjaEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBtQ29udGFpbmVyVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVTaW5nbGVUZXN0R3JvdXAoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1Qcm9qTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgbVByb2pUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1Qcm9qQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1UZXN0TGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgbVRlc3RUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIG1TZWFyY2hCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIG1Qcm9qVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgbVRlc3RNZXRob2RMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplSmF2YVByb2plY3QoamF2YUVsZW1lbnQsIGNvbmZpZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSBzZXQgZW1wdHkgYXR0cmlidXRlcyBmb3IgcHJvamVjdCAmIG1haW4gdHlwZSBzbyB0aGF0IHdoZW4gb25lIGNvbmZpZyBpcwotICAgICAgICAgICAgLy8gY29tcGFyZWQgdG8gYW5vdGhlciwgdGhlIGV4aXN0ZW5jZSBvZiBlbXB0eSBhdHRyaWJ1dGVzIGRvZXNuJ3QgY2F1c2UgYW4KLSAgICAgICAgICAgIC8vIGluY29ycmVjdCByZXN1bHQgKHRoZSBwZXJmb3JtQXBwbHkoKSBtZXRob2QgY2FuIHJlc3VsdCBpbiBlbXB0eSB2YWx1ZXMKLSAgICAgICAgICAgIC8vIGZvciB0aGVzZSBhdHRyaWJ1dGVzIGJlaW5nIHNldCBvbiBhIGNvbmZpZyBpZiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZQotICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0ZXh0IGJveGVzKQotICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIEVNUFRZX1NUUklORyk7Ci0gICAgICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfQ09OVEFJTkVSLAotICAgICAgICAgICAgICAgICAgICBFTVBUWV9TVFJJTkcpOwotICAgICAgICB9Ci0gICAgICAgIGluaXRpYWxpemVUZXN0QXR0cmlidXRlcyhqYXZhRWxlbWVudCwgY29uZmlnKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRlc3RBdHRyaWJ1dGVzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsICYmIGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeyAKLSAgICAgICAgICAgIGluaXRpYWxpemVUZXN0Q29udGFpbmVyKGphdmFFbGVtZW50LCBjb25maWcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5pdGlhbGl6ZVRlc3RUeXBlKGphdmFFbGVtZW50LCBjb25maWcpOwotICAgICAgICB9ICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVGVzdENvbnRhaW5lcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfQ09OVEFJTkVSLAotICAgICAgICAgICAgICAgIGphdmFFbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKSk7Ci0gICAgICAgIGluaXRpYWxpemVOYW1lKGNvbmZpZywgamF2YUVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVOYW1lKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGdldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKS5nZW5lcmF0ZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBjb25maWcucmVuYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFpbiB0eXBlICYgbmFtZSBhdHRyaWJ1dGVzIG9uIHRoZSB3b3JraW5nIGNvcHkgYmFzZWQgb24gdGhlIElKYXZhRWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVGVzdFR5cGUoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgIFN0cmluZyB0ZXN0S2luZElkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIG9ubHkgZG8gYSBzZWFyY2ggZm9yIGNvbXBpbGF0aW9uIHVuaXRzIG9yIGNsYXNzIGZpbGVzIG9yIHNvdXJjZSByZWZlcmVuY2VzCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAgICAgSVRlc3RLaW5kIHRlc3RLaW5kID0gVGVzdEtpbmRSZWdpc3RyeS5nZXRDb250YWluZXJUZXN0S2luZChqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgdGVzdEtpbmRJZCA9IHRlc3RLaW5kLmdldElkKCk7Ci0KLSAgICAgICAgICAgICAgICBJVHlwZVtdIHR5cGVzID0gVGVzdFNlYXJjaEVuZ2luZS5maW5kVGVzdHMoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUVsZW1lbnQsIHRlc3RLaW5kKTsgCi0gICAgICAgICAgICAgICAgaWYgKCh0eXBlcyA9PSBudWxsKSB8fCAodHlwZXMubGVuZ3RoIDwgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTaW1wbHkgZ3JhYiB0aGUgZmlyc3QgbWFpbiB0eXBlIGZvdW5kIGluIHRoZSBzZWFyY2hlZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgbmFtZSA9IHR5cGVzWzBdLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgIAotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgICAgICBjb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLCBuYW1lKTsKLSAgICAgICAgaWYgKHRlc3RLaW5kSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9URVNUX1JVTk5FUl9LSU5ELAotICAgICAgICAgICAgICAgICAgICB0ZXN0S2luZElkKTsKLSAgICAgICAgfSAgICAKLSAgICAgICAgaW5pdGlhbGl6ZU5hbWUoY29uZmlnLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl90YWJfbGFiZWw7IAotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgSUphdmFFbGVtZW50IGNob29zZUNvbnRhaW5lcihJSmF2YUVsZW1lbnQgaW5pdEVsZW1lbnQpIHsKLSAgICAgICAgQ2xhc3NbXSBhY2NlcHRlZENsYXNzZXMgPSBuZXcgQ2xhc3NbXSB7IElKYXZhUHJvamVjdC5jbGFzcywKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50LmNsYXNzIH07Ci0gICAgICAgIFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgIGFjY2VwdGVkQ2xhc3NlcywgZmFsc2UpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZFZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYWNjZXB0ZWRDbGFzc2VzID0gbmV3IENsYXNzW10geyBJSmF2YU1vZGVsLmNsYXNzLCBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnQuY2xhc3MgfTsKLSAgICAgICAgVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBUeXBlZFZpZXdlckZpbHRlcihhY2NlcHRlZENsYXNzZXMpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzQXJjaGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgISgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2VsZWN0KHZpZXdlciwgcGFyZW50LCBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAKLQotICAgICAgICBBbmRyb2lkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQW5kcm9pZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotICAgICAgICAgICAgICAgIEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpOyAKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIAotICAgICAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotICAgICAgICBkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgSmF2YUVsZW1lbnRDb21wYXJhdG9yKCkpOwotICAgICAgICBkaWFsb2cuc2V0VGl0bGUoSlVuaXRNZXNzYWdlcy5KVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWJfZm9sZGVyZGlhbG9nX3RpdGxlKTsgIAotICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShKVW5pdE1lc3NhZ2VzLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYl9mb2xkZXJkaWFsb2dfbWVzc2FnZSk7ICAKLSAgICAgICAgZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotICAgICAgICBkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSkpOwotICAgICAgICBkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihpbml0RWxlbWVudCk7Ci0gICAgICAgIGRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLQotICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICByZXR1cm4gKElKYXZhRWxlbWVudCkgZWxlbWVudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBtSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBKYXZhIGVsZW1lbnQgY29udGV4dCBmcm9tIHdoaWNoIHRvIGluaXRpYWxpemUKLSAgICAgKiBkZWZhdWx0IHNldHRpbmdzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gSmF2YSBlbGVtZW50IGNvbnRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPQotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgaWYgKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwYWdlLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAoIXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUphdmFFbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUphdmFFbGVtZW50IGplID0gSmF2YUNvcmUuY3JlYXRlKChJUmVzb3VyY2UpIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHBybyA9ICgoSVJlc291cmNlKSBvYmopLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZSA9IEphdmFDb3JlLmNyZWF0ZShwcm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGplICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBwYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJSmF2YUVsZW1lbnQpIGlucHV0LmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphdmFQcm9qZWN0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCBuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QnV0dG9uR3JpZERhdGEoQnV0dG9uIGJ1dHRvbikgewotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIExheW91dFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChidXR0b24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJZCgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQubGF1bmNoLkFuZHJvaWRKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25UYWIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIFVJIHdpdGggdGhlIGluc3RydW1lbnRhdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0LCBhbmQgc3RvcmVzIHRoZQotICAgICAqIGluc3RydW1lbnRhdGlvbnMgaW4gPGNvZGU+bUluc3RydW1lbnRhdGlvbnM8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSB7QGxpbmsgSVByb2plY3R9IHRvIGxvYWQgdGhlIGluc3RydW1lbnRhdGlvbnMgZnJvbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEluc3RydW1lbnRhdGlvbnMoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICBtSW5zdHJWYWxpZGF0b3IgPSBuZXcgSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yKHByb2plY3QpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9ucyA9IChtSW5zdHJWYWxpZGF0b3IgPT0gbnVsbCA/IG51bGwgOiAKLSAgICAgICAgICAgIG1JbnN0clZhbGlkYXRvci5nZXRJbnN0cnVtZW50YXRpb25OYW1lcygpKTsKLSAgICAgICAgaWYgKG1JbnN0cnVtZW50YXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb25Db21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGluc3RydW1lbnRhdGlvbiA6IG1JbnN0cnVtZW50YXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbkNvbWJvLmFkZChpbnN0cnVtZW50YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiB3aWxsIGJlIHNldCB3aGVuIHdlIHVwZGF0ZSB0aGUgdWkgZnJvbSB0aGUgY3VycmVudAotICAgICAgICAgICAgLy8gY29uZmlnIG9iamVjdC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIFRBRywgIkVSUk9SOiBGYWlsZWQgdG8gZ2V0IGluc3RydW1lbnRhdGlvbnMgZm9yICUxJHMiLAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgd2UgcmVhY2ggdGhpcyBwb2ludCwgZWl0aGVyIHByb2plY3QgaXMgbnVsbCwgb3Igd2UgZ290IGFuIGV4Y2VwdGlvbiBkdXJpbmcKLSAgICAgICAgLy8gdGhlIHBhcnNpbmcuIEluIGVpdGhlciBjYXNlLCB3ZSBlbXB0eSB0aGUgaW5zdHJ1bWVudGF0aW9uIGxpc3QuCi0gICAgICAgIG1JbnN0clZhbGlkYXRvciA9IG51bGw7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb25zID0gbnVsbDsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbkNvbWJvLnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyB0aGUge0BsaW5rIFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXJ9IHRvIG9ubHkgZGlzcGxheSBBbmRyb2lkIHByb2plY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5kcm9pZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyCi0gICAgICAgICAgICBleHRlbmRzIFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdmVycmlkZSBwYXJlbnQgdG8gcmV0dXJuIG9ubHkgQW5kcm9pZCBwcm9qZWN0cyBpZiBhdCB0aGUgcm9vdC4gT3RoZXJ3aXNlLCB1c2UgcGFyZW50IAotICAgICAgICAgKiBmdW5jdGlvbmFsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YU1vZGVsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJhc2VQcm9qZWN0SGVscGVyLmdldEFuZHJvaWRQcm9qZWN0cygoSUphdmFNb2RlbCkgZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0FuZHJvaWRKVW5pdExhdW5jaFNob3J0Y3V0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0FuZHJvaWRKVW5pdExhdW5jaFNob3J0Y3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5NGNlZDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRMYXVuY2hTaG9ydGN1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoZXIuSlVuaXRMYXVuY2hTaG9ydGN1dDsKLQotLyoqCi0gKiBMYXVuY2ggc2hvcnRjdXQgdG8gbGF1bmNoIGRlYnVnL3J1biBBbmRyb2lkIEpVbml0IGNvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkSlVuaXRMYXVuY2hTaG9ydGN1dCBleHRlbmRzIEpVbml0TGF1bmNoU2hvcnRjdXQgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZUlkKCkgewotICAgICAgICByZXR1cm4gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5qdW5pdC5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBBbmRyb2lkIEpVbml0IGxhdW5jaCBjb25maWd1cmF0aW9uLiBTZXRzIHRoZSBpbnN0cnVtZW50YXRpb24gcnVubmVyIHRvIHRoZQotICAgICAqIGZpcnN0IGluc3RydW1lbnRhdGlvbiBmb3VuZCBpbiB0aGUgQW5kcm9pZE1hbmlmZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnID0gc3VwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgLy8ganVzdCBnZXQgZmlyc3QgdmFsaWQgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lcgotICAgICAgICBTdHJpbmcgaW5zdHJ1bWVudGF0aW9uID0gbmV3IEluc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvcihlbGVtZW50LmdldEphdmFQcm9qZWN0KCkpLgotICAgICAgICAgICAgICAgIGdldFZhbGlkSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcigpOwotICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBdHRyaWJ1dGUoQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuQVRUUl9JTlNUUl9OQU1FLCAKLSAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBhIHZhbGlkIHJ1bm5lciBpcyBub3QgZm91bmQsIHJlbHkgb24gbGF1bmNoIGRlbGVnYXRlIHRvIGxvZyBlcnJvci4KLSAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGhvdXQgZXhwbGljaXQgdXNlciBhY3Rpb24gdG8gbGF1bmNoIEFuZHJvaWQgSlVuaXQsIHNvIGF2b2lkCi0gICAgICAgIC8vIGxvZ2dpbmcgYW4gZXJyb3IgaGVyZS4KLQotICAgICAgICBBbmRyb2lkSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZS5zZXRKVW5pdERlZmF1bHRzKGNvbmZpZyk7Ci0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDVjYzQxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvQW5kcm9pZEpVbml0UHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC51dGlsLlRlc3RTZWFyY2hFbmdpbmU7Ci0KLS8qKgotICogQSB7QGxpbmsgUHJvcGVydHlUZXN0ZXJ9IHRoYXQgY2hlY2tzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBydW4gYXMgQW5kcm9pZAotICogSlVuaXQgdGVzdHMuCi0gKiA8cC8+Ci0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQuSlVuaXRQcm9wZXJ0eVRlc3Rlci4gVGhlIG9ubHkgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZSBpbgotICogdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzb3VyY2UgZm9sZGVycyBjYW5ub3QgYmUgcnVuIGFzIEFuZHJvaWQgSlVuaXQuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQW5kcm9pZEpVbml0UHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lTX1RFU1QgPSAiaXNUZXN0IjsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FOX0xBVU5DSF9BU19KVU5JVF9URVNUID0gImNhbkxhdW5jaEFzSlVuaXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eUV2YWx1YXRvciN0ZXN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLSAgICAgICAgaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lID0gKHJlY2VpdmVyID09IG51bGwgPyAibnVsbCIgOiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgSUFkYXB0YWJsZSwgaXMgJXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIElKYXZhRWxlbWVudCBlbGVtZW50OwotICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSByZWNlaXZlcjsKLSAgICAgICAgfSBlbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSgoSVJlc291cmNlKSByZWNlaXZlcik7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBpcyBJQWRhcHRhYmxlCi0gICAgICAgICAgICBlbGVtZW50PSAoSUphdmFFbGVtZW50KSAoKElBZGFwdGFibGUpIHJlY2VpdmVyKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSByZWNlaXZlcikuZ2V0QWRhcHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChQUk9QRVJUWV9JU19URVNULmVxdWFscyhwcm9wZXJ0eSkpIHsgCi0gICAgICAgICAgICByZXR1cm4gaXNKVW5pdFRlc3QoZWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoUFJPUEVSVFlfQ0FOX0xBVU5DSF9BU19KVU5JVF9URVNULmVxdWFscyhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgIHJldHVybiBjYW5MYXVuY2hBc0pVbml0VGVzdChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVua25vd24gdGVzdCBwcm9wZXJ0eSAnJXMnIiwgcHJvcGVydHkpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuTGF1bmNoQXNKVW5pdFRlc3QoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY2FuIHJ1biwgbGV0IEpEVCBkZXRlY3QgaWYgdGhlcmUgYXJlIHRlc3RzCi0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCB0ZXN0IHJ1bm5lcgotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7IAotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRToKLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5UWVBFOgotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSlVuaXRUZXN0KGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSB0YXJnZXQgcmVzb3VyY2UgaXMgYSBKVW5pdCB0ZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0pVbml0VGVzdChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGUgdGVzdFR5cGUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgdGVzdFR5cGUgPSAoKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KSkuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFR5cGUgPSAoKChJQ2xhc3NGaWxlKSBlbGVtZW50KSkuZ2V0VHlwZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICB0ZXN0VHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLSAgICAgICAgICAgICAgICB0ZXN0VHlwZSA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRlc3RUeXBlICE9IG51bGwgJiYgdGVzdFR5cGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFNlYXJjaEVuZ2luZS5pc1Rlc3RPclRlc3RTdWl0ZSh0ZXN0VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCByZXR1cm4gZmFsc2UKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRUYWJHcm91cC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9BbmRyb2lkSlVuaXRUYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU1ZGVhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvQW5kcm9pZEpVbml0VGFiR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkNvbW1vblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guRW11bGF0b3JDb25maWdUYWI7Ci0KLS8qKgotICogVGFiIGdyb3VwIG9iamVjdCBmb3IgQW5kcm9pZCBKVW5pdCBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZEpVbml0VGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBVSSB0YWJzIGZvciB0aGUgQW5kcm9pZCBKVW5pdCBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9IG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHsKLSAgICAgICAgICAgICAgICBuZXcgQW5kcm9pZEpVbml0TGF1bmNoQ29uZmlndXJhdGlvblRhYigpLAotICAgICAgICAgICAgICAgIG5ldyBFbXVsYXRvckNvbmZpZ1RhYigpLAotICAgICAgICAgICAgICAgIG5ldyBDb21tb25UYWIoKQotICAgICAgICB9OwotICAgICAgICBzZXRUYWJzKHRhYnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L0luc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTZiMjBiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5qdW5pdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkJhc2VQcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlci5JbnN0cnVtZW50YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgdmFsaWRhdGlvbiBmb3IgQW5kcm9pZCBpbnN0cnVtZW50YXRpb24gdGVzdCBydW5uZXIgCi0gKi8KLWNsYXNzIEluc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgbUphdmFQcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nW10gbUluc3RydW1lbnRhdGlvbk5hbWVzID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1J1bm5lckxpYnJhcnkgPSBmYWxzZTsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RSVU1FTlRBVElPTl9PSyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gZm9yIHRoZSBBbmRyb2lkIHByb2plY3QgdG8gdmFsaWRhdGUKLSAgICAgKi8KLSAgICBJbnN0cnVtZW50YXRpb25SdW5uZXJWYWxpZGF0b3IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIG1KYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLnBhcnNlKGphdmFQcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBlcnJvckxpc3RlbmVyICovLCB0cnVlIC8qIGdhdGhlckRhdGEgKi8sIGZhbHNlIC8qIG1hcmtFcnJvcnMgKi8pOwotICAgICAgICAgICAgaW5pdChtYW5pZmVzdFBhcnNlcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCAiRVJST1I6IEZhaWxlZCB0byBwYXJzZSAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5GTl9BTkRST0lEX01BTklGRVNUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBJbnN0cnVtZW50YXRpb25SdW5uZXJWYWxpZGF0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHtAbGluayBJUHJvamVjdH0gZm9yIHRoZSBBbmRyb2lkIHByb2plY3QgdG8gdmFsaWRhdGUKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYSBmYXRhbCBlcnJvciBvY2N1cnJlZCBpbiBpbml0aWFsaXphdGlvbgotICAgICAqLwotICAgIEluc3RydW1lbnRhdGlvblJ1bm5lclZhbGlkYXRvcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoQmFzZVByb2plY3RIZWxwZXIuZ2V0SmF2YVByb2plY3QocHJvamVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBJbnN0cnVtZW50YXRpb25SdW5uZXJWYWxpZGF0b3Igd2l0aCBhbiBleGlzdGluZyB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfQotICAgICAqIAotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gZm9yIHRoZSBBbmRyb2lkIHByb2plY3QgdG8gdmFsaWRhdGUKLSAgICAgKiBAcGFyYW0gbWFuaWZlc3RQYXJzZXIgdGhlIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9IGZvciB0aGUgQW5kcm9pZCBwcm9qZWN0Ci0gICAgICovCi0gICAgSW5zdHJ1bWVudGF0aW9uUnVubmVyVmFsaWRhdG9yKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyKSB7Ci0gICAgICAgIG1KYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICBpbml0KG1hbmlmZXN0UGFyc2VyKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyKSB7Ci0gICAgICAgIEluc3RydW1lbnRhdGlvbltdIGluc3RydW1lbnRhdGlvbnMgPSBtYW5pZmVzdFBhcnNlci5nZXRJbnN0cnVtZW50YXRpb25zKCk7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb25OYW1lcyA9IG5ldyBTdHJpbmdbaW5zdHJ1bWVudGF0aW9ucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydW1lbnRhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb25OYW1lc1tpXSA9IGluc3RydW1lbnRhdGlvbnNbaV0uZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1IYXNSdW5uZXJMaWJyYXJ5ID0gaGFzVGVzdFJ1bm5lckxpYnJhcnkobWFuaWZlc3RQYXJzZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSBpZiBnaXZlbiBtYW5pZmVzdCBoYXMgYSA8Y29kZT5BbmRyb2lkQ29uc3RhbnRzLkxJQlJBUllfVEVTVF9SVU5ORVIKLSAgICAgKiA8L2NvZGU+IGxpYnJhcnkgcmVmZXJlbmNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFuaWZlc3RQYXJzZXIgdGhlIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9IHRvIHNlYXJjaAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0ZXN0IHJ1bm5lciBsaWJyYXJ5IGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVGVzdFJ1bm5lckxpYnJhcnkoQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1hbmlmZXN0UGFyc2VyKSB7Ci0gICAgICAgZm9yIChTdHJpbmcgbGliIDogbWFuaWZlc3RQYXJzZXIuZ2V0VXNlc0xpYnJhcmllcygpKSB7Ci0gICAgICAgICAgIGlmIChsaWIuZXF1YWxzKEFuZHJvaWRDb25zdGFudHMuTElCUkFSWV9URVNUX1JVTk5FUikpIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBpbnN0cnVtZW50YXRpb24gbmFtZXMgZm9yIHRoZSBBbmRyb2lkIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlIGlmIGVycm9yIG9jY3VycmVkIHBhcnNpbmcgaW5zdHJ1bWVudGF0aW9ucywgb3RoZXJ3aXNlIHJldHVybnMgYXJyYXkKLSAgICAgKiBvZiBpbnN0cnVtZW50YXRpb24gY2xhc3MgbmFtZXMKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRJbnN0cnVtZW50YXRpb25OYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0cnVtZW50YXRpb25OYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgZmlyc3QgaW5zdHJ1bWVudGF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB0ZXN0IHJ1bm5lci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBpbnN0cnVtZW50YXRpb24gY2xhc3MgbmFtZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsaWQKLSAgICAgKiBpbnN0cnVtZW50YXRpb24gY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIFN0cmluZyBnZXRWYWxpZEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIoKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGluc3RydW1lbnRhdGlvbiA6IGdldEluc3RydW1lbnRhdGlvbk5hbWVzKCkpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZUluc3RydW1lbnRhdGlvblJ1bm5lcihpbnN0cnVtZW50YXRpb24pID09IElOU1RSVU1FTlRBVElPTl9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVtZW50YXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgc3BlY2lmaWVkIGluc3RydW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHRlc3QgcnVubmVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbiB0aGUgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIG5hbWUgdG8gdmFsaWRhdGUuIEFzc3VtZXMgdGhpcwotICAgICAqICAgaW5zdHJ1bWVudGF0aW9uIGlzIG9uZSBvZiB7QGxpbmsgI2dldEluc3RydW1lbnRhdGlvbk5hbWVzKCl9Ci0gICAgICogQHJldHVybiA8Y29kZT5JTlNUUlVNRU5UQVRJT05fT0s8L2NvZGU+IGlmIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJucyBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgU3RyaW5nIHZhbGlkYXRlSW5zdHJ1bWVudGF0aW9uUnVubmVyKFN0cmluZyBpbnN0cnVtZW50YXRpb24pIHsKLSAgICAgICAgaWYgKCFtSGFzUnVubmVyTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBkZWNsYXJlIHVzZXMtbGlicmFyeSAlMSRzIiwgCi0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTElCUkFSWV9URVNUX1JVTk5FUik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpbnN0cnVtZW50YXRpb24gaXMgdGhlIHN0YW5kYXJkIHRlc3QgcnVubmVyCi0gICAgICAgIGlmICghaW5zdHJ1bWVudGF0aW9uLmVxdWFscyhBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0lOU1RSVU1FTlRBVElPTl9SVU5ORVIpKSB7Ci0gICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBleHRlbmRzIHRoZSBzdGFuZGFyZCB0ZXN0IHJ1bm5lcgotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IEJhc2VQcm9qZWN0SGVscGVyLnRlc3RDbGFzc0Zvck1hbmlmZXN0KG1KYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLCBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0lOU1RSVU1FTlRBVElPTl9SVU5ORVIsIHRydWUpOwotICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQmFzZVByb2plY3RIZWxwZXIuVEVTVF9DTEFTU19PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJUaGUgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lciBtdXN0IGJlIG9mIHR5cGUgJXMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfSU5TVFJVTUVOVEFUSU9OX1JVTk5FUik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJTlNUUlVNRU5UQVRJT05fT0s7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL0FuZHJvaWRKVW5pdExhdW5jaEluZm8uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9BbmRyb2lkSlVuaXRMYXVuY2hJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTk5OWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL0FuZHJvaWRKVW5pdExhdW5jaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvIGFib3V0IEFuZHJvaWQgSlVuaXQgbGF1bmNoCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkSlVuaXRMYXVuY2hJbmZvIHsKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BcHBQYWNrYWdlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1SdW5uZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbURlYnVnTW9kZSA9IGZhbHNlOwotICAgIHByaXZhdGUgSURldmljZSBtRGV2aWNlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtVGVzdFBhY2thZ2UgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0Q2xhc3MgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0TWV0aG9kID0gbnVsbDsKLSAgICBwcml2YXRlIElMYXVuY2ggbUxhdW5jaCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgYXBwUGFja2FnZSwgU3RyaW5nIHJ1bm5lcikgewotICAgICAgICBtUHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIG1BcHBQYWNrYWdlID0gYXBwUGFja2FnZTsKLSAgICAgICAgbVJ1bm5lciA9IHJ1bm5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BcHBQYWNrYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVubmVyKCkgewotICAgICAgICByZXR1cm4gbVJ1bm5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZWJ1Z01vZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlYnVnTW9kZShib29sZWFuIGRlYnVnTW9kZSkgewotICAgICAgICBtRGVidWdNb2RlID0gZGVidWdNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGV2aWNlKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0byBydW4gYWxsIHRlc3RzIHdpdGhpbiBnaXZlbiBwYWNrYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3RQYWNrYWdlIGZ1bGx5IHF1YWxpZmllZCBqYXZhIHBhY2thZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0UGFja2FnZShTdHJpbmcgdGVzdFBhY2thZ2UpIHsKLSAgICAgICAgbVRlc3RQYWNrYWdlID0gdGVzdFBhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwYWNrYWdlIG9mIHRlc3RzIHRvIHJ1bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIGphdmEgcGFja2FnZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gbVRlc3RQYWNrYWdlOyAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXN0IGNsYXNzIHRvIHJ1bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdENsYXNzIGZ1bGx5IHF1YWxmaWVkIHRlc3QgY2xhc3MgdG8gcnVuCi0gICAgICogICAgRXhwZWN0ZWQgZm9ybWF0OiB4LnkueC50ZXN0Y2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Q2xhc3MoU3RyaW5nIHRlc3RDbGFzcykgewotICAgICAgICBtVGVzdENsYXNzID0gdGVzdENsYXNzOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0IGNsYXNzIHRvIHJ1bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZnVsbHkgcXVhbGZpZWQgdGVzdCBjbGFzcyB0byBydW4uCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdENsYXNzKCkgewotICAgICAgICByZXR1cm4gbVRlc3RDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGVzdCBtZXRob2QgdG8gcnVuLiB0ZXN0Q2xhc3MgbXVzdCBhbHNvIGJlIHNldC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3RNZXRob2QgdGVzdCBtZXRob2QgdG8gcnVuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdE1ldGhvZChTdHJpbmcgdGVzdE1ldGhvZCkgewotICAgICAgICBtVGVzdE1ldGhvZCA9IHRlc3RNZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFJldHVybnMgdGhlIHRlc3QgbWV0aG9kIHRvIHJ1bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGVzdCBtZXRob2QgdG8gcnVuLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZXN0TWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXVuY2g7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGF1bmNoKElMYXVuY2ggbGF1bmNoKSB7Ci0gICAgICAgIG1MYXVuY2ggPSBsYXVuY2g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL0FuZHJvaWRUZXN0UmVmZXJlbmNlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvQW5kcm9pZFRlc3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3N2NhOC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvQW5kcm9pZFRlc3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5qdW5pdC5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5JVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5JVGVzdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLlRlc3RFeGVjdXRpb247Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSB7QGxpbmsgSVRlc3RSZWZlcmVuY2V9IGFuZCB7QGxpbmsgSVRlc3RJZGVudGlmaWVyfSBpbnRlcmZhY2VzCi0gKiBmb3IgQW5kcm9pZCB0ZXN0cy4KLSAqIDxwLz4KLSAqIFByb3ZpZGVzIGdlbmVyaWMgZXF1YWxpdHkvaGFzaGNvZGUgc2VydmljZXMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikgIC8vJE5PTi1OTFMtMSQKLWFic3RyYWN0IGNsYXNzIEFuZHJvaWRUZXN0UmVmZXJlbmNlIGltcGxlbWVudHMgSVRlc3RSZWZlcmVuY2UsIElUZXN0SWRlbnRpZmllciB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgSVRlc3RJZGVudGlmaWVyfSBmb3IgdGhpcyB0ZXN0IHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVRlc3RJZGVudGlmaWVyIGdldElkZW50aWZpZXIoKSB7Ci0gICAgICAgIC8vIHRoaXMgY2xhc3Mgc2VydmVzIGFzIGl0cyBvd24gdGVzdCBpZGVudGlmaWVyCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdCBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKFRlc3RFeGVjdXRpb24gZXhlY3V0aW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHtAbGluayBJVGVzdElkZW50aWZpZXJ9IHVzaW5nIG5hbWVzCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElUZXN0SWRlbnRpZmllcikgewotICAgICAgICAgICAgSVRlc3RJZGVudGlmaWVyIHRlc3RpZCA9IChJVGVzdElkZW50aWZpZXIpIG9iajsKLSAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCkuZXF1YWxzKHRlc3RpZC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL1JlbW90ZUFkdFRlc3RSdW5uZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9SZW1vdGVBZHRUZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYWZjNDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL1JlbW90ZUFkdFRlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guanVuaXQucnVudGltZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLklUZXN0UnVuTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuTWVzc2FnZUlkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLlJlbW90ZVRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5UZXN0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuVGVzdFJlZmVyZW5jZUZhaWx1cmU7Ci0KLS8qKgotICogU3VwcG9ydHMgRWNsaXBzZSBKVW5pdCBleGVjdXRpb24gb2YgQW5kcm9pZCB0ZXN0cy4KLSAqIDxwLz4KLSAqIENvbW11bmljYXRlcyBiYWNrIHRvIGEgRWNsaXBzZSBKRFQgSlVuaXQgY2xpZW50IHZpYSBhIHNvY2tldCBjb25uZWN0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuUmVtb3RlVGVzdFJ1bm5lciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBwcm90b2NvbAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFJlbW90ZUFkdFRlc3RSdW5uZXIgZXh0ZW5kcyBSZW1vdGVUZXN0UnVubmVyIHsKLQotICAgIHByaXZhdGUgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyBtTGF1bmNoSW5mbzsKLSAgICBwcml2YXRlIFRlc3RFeGVjdXRpb24gbUV4ZWN1dGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBKRFQgSlVuaXQgdGVzdCBydW5uZXIgcGFyYW1ldGVycyBmcm9tIHRoZSB7QGNvZGUgYXJnc30uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ3MgbmFtZS12YWx1ZSBwYWlyIG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHBhcmVudCBKVW5pdCBydW5uZXIuIAotICAgICAqIEBwYXJhbSBsYXVuY2hJbmZvIHRoZSBBbmRyb2lkIHNwZWNpZmljIHRlc3QgbGF1bmNoIGluZm8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZ1tdIGFyZ3MsIEFuZHJvaWRKVW5pdExhdW5jaEluZm8gbGF1bmNoSW5mbykgewotICAgICAgICBkZWZhdWx0SW5pdChhcmdzKTsKLSAgICAgICAgbUxhdW5jaEluZm8gPSBsYXVuY2hJbmZvOwotICAgIH0gICAKLQotICAgIC8qKgotICAgICAqIFJ1bnMgYSBzZXQgb2YgdGVzdHMsIGFuZCByZXBvcnRzIGJhY2sgcmVzdWx0cyB1c2luZyBwYXJlbnQgY2xhc3MuCi0gICAgICogPHAvPgotICAgICAqIEpEVCBVbml0IGV4cGVjdHMgdG8gYmUgc2VudCBkYXRhIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6Ci0gICAgICogPG9sPgotICAgICAqICAgPGxpPlRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgdG8gYmUgZXhlY3V0ZWQuPC9saT4KLSAgICAgKiAgIDxsaT5UaGUgdGVzdCAndHJlZScgZGF0YSBhYm91dCB0aGUgdGVzdHMgdG8gYmUgZXhlY3V0ZWQsIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHRoZSBzZXQgb2YKLSAgICAgKiAgIHRlc3QgY2xhc3MgbmFtZXMsIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gZWFjaCBjbGFzcywgYW5kIHRoZSBuYW1lcyBvZiBlYWNoIHRlc3QgaW4gdGhlCi0gICAgICogICBjbGFzcy48L2xpPgotICAgICAqICAgPGxpPlRoZSB0ZXN0IGV4ZWN1dGlvbiByZXN1bHQgZm9yIGVhY2ggdGVzdCBtZXRob2QuIEV4cGVjdHMgaW5kaXZpZHVhbCBub3RpZmljYXRpb25zIG9mCi0gICAgICogICB0aGUgdGVzdCBleGVjdXRpb24gc3RhcnQsIGFueSBmYWlsdXJlcywgYW5kIHRoZSBlbmQgb2YgdGhlIHRlc3QgZXhlY3V0aW9uLjwvbGk+Ci0gICAgICogICA8bGk+VGhlIGVuZCBvZiB0aGUgdGVzdCBydW4sIHdpdGggaXRzIGVsYXBzZWQgdGltZS48L2xpPgotICAgICAqIDwvb2w+ICAKLSAgICAgKiA8cC8+Ci0gICAgICogSW4gb3JkZXIgdG8gc2F0aXNmeSB0aGlzLCB0aGlzIG1ldGhvZCBwZXJmb3JtcyB0d28gYWN0dWFsIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIHJ1bnMuCi0gICAgICogVGhlIGZpcnN0IGlzIGEgJ2xvZyBvbmx5JyBydW4gdGhhdCB3aWxsIGNvbGxlY3QgdGhlIHRlc3QgdHJlZSBkYXRhLCB3aXRob3V0IGFjdHVhbGx5Ci0gICAgICogZXhlY3V0aW5nIHRoZSB0ZXN0cywgIGFuZCBzZW5kIGl0IGJhY2sgdG8gSkRUIEpVbml0LiBUaGUgc2Vjb25kIGlzIHRoZSBhY3R1YWwgdGVzdCBleGVjdXRpb24sCi0gICAgICogd2hvc2UgcmVzdWx0cyB3aWxsIGJlIGNvbW11bmljYXRlZCBiYWNrIGluIHJlYWwtdGltZSB0byBKRFQgSlVuaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3RDbGFzc05hbWVzIGlnbm9yZWQgLSB0aGUgQW5kcm9pZEpVbml0TGF1bmNoSW5mbyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoCi0gICAgICogICAgIHRlc3RzIHRvIHJ1bi4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgaWdub3JlZAotICAgICAqIEBwYXJhbSBleGVjdXRpb24gdXNlZCB0byByZXBvcnQgdGVzdCBwcm9ncmVzcwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RzKFN0cmluZ1tdIHRlc3RDbGFzc05hbWVzLCBTdHJpbmcgdGVzdE5hbWUsIFRlc3RFeGVjdXRpb24gZXhlY3V0aW9uKSB7Ci0gICAgICAgIC8vIGhvbGQgb250byB0aGlzIGV4ZWN1dGlvbiByZWZlcmVuY2Ugc28gaXQgY2FuIGJlIHVzZWQgdG8gcmVwb3J0IHRlc3QgcHJvZ3Jlc3MKLSAgICAgICAgbUV4ZWN1dGlvbiA9IGV4ZWN1dGlvbjsKLSAgICAgICAgCi0gICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHJ1bm5lciA9IG5ldyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcihtTGF1bmNoSW5mby5nZXRBcHBQYWNrYWdlKCksIAotICAgICAgICAgICAgICAgIG1MYXVuY2hJbmZvLmdldFJ1bm5lcigpLCBtTGF1bmNoSW5mby5nZXREZXZpY2UoKSk7IAotCi0gICAgICAgIGlmIChtTGF1bmNoSW5mby5nZXRUZXN0Q2xhc3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUxhdW5jaEluZm8uZ2V0VGVzdE1ldGhvZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW5uZXIuc2V0TWV0aG9kTmFtZShtTGF1bmNoSW5mby5nZXRUZXN0Q2xhc3MoKSwgbUxhdW5jaEluZm8uZ2V0VGVzdE1ldGhvZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7ICAgIAotICAgICAgICAgICAgICAgIHJ1bm5lci5zZXRDbGFzc05hbWUobUxhdW5jaEluZm8uZ2V0VGVzdENsYXNzKCkpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGF1bmNoSW5mby5nZXRUZXN0UGFja2FnZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJ1bm5lci5zZXRUZXN0UGFja2FnZU5hbWUobUxhdW5jaEluZm8uZ2V0VGVzdFBhY2thZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgbG9nIG9ubHkgdG8gZmlyc3QgY29sbGVjdCB0ZXN0IGNhc2UgaW5mbywgc28gRWNsaXBzZSBoYXMgY29ycmVjdCB0ZXN0IGNhc2UgY291bnQvCi0gICAgICAgIC8vIHRyZWUgaW5mbwotICAgICAgICBydW5uZXIuc2V0TG9nT25seSh0cnVlKTsKLSAgICAgICAgVGVzdENvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVGVzdENvbGxlY3RvcigpOyAgICAgICAgCi0gICAgICAgIHJ1bm5lci5ydW4oY29sbGVjdG9yKTsKLSAgICAgICAgaWYgKGNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGVzdCBjb2xsZWN0aW9uLgotICAgICAgICAgICAgcmVwb3J0RXJyb3IoY29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIC8vIGFib3J0IGhlcmUKLSAgICAgICAgICAgIG5vdGlmeVRlc3RSdW5FbmRlZCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlUZXN0UnVuU3RhcnRlZChjb2xsZWN0b3IuZ2V0VGVzdENhc2VDb3VudCgpKTsKLSAgICAgICAgY29sbGVjdG9yLnNlbmRUcmVlcyh0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyBkbyByZWFsIGV4ZWN1dGlvbgotICAgICAgICBydW5uZXIuc2V0TG9nT25seShmYWxzZSk7Ci0gICAgICAgIGlmIChtTGF1bmNoSW5mby5pc0RlYnVnTW9kZSgpKSB7Ci0gICAgICAgICAgICBydW5uZXIuc2V0RGVidWcodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcnVubmVyLnJ1bihuZXcgVGVzdFJ1bkxpc3RlbmVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYWluIGVudHJ5IG1ldGhvZCB0byBydW4gdGVzdHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZ3JhbUFyZ3MgSkRUIEpVbml0IHByb2dyYW0gYXJndW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBieSBwYXJlbnQKLSAgICAgKiBAcGFyYW0ganVuaXRJbmZvIHRoZSB7QGxpbmsgQW5kcm9pZEpVbml0TGF1bmNoSW5mb30gY29udGFpbmluZyBpbmZvIGFib3V0IHRoaXMgdGVzdCBydQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3RzKFN0cmluZ1tdIHByb2dyYW1BcmdzLCBBbmRyb2lkSlVuaXRMYXVuY2hJbmZvIGp1bml0SW5mbykgewotICAgICAgICBpbml0KHByb2dyYW1BcmdzLCBqdW5pdEluZm8pOwotICAgICAgICBydW4oKTsKLSAgICB9IAotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobUV4ZWN1dGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRXhlY3V0aW9uLnN0b3AoKTsKLSAgICAgICAgfSAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5VGVzdFJ1bkVuZGVkKGxvbmcgZWxhcHNlZFRpbWUpIHsKLSAgICAgICAgLy8gY29weSBmcm9tIHBhcmVudCAtIG5vdCBpZGVhbCwgYnV0IG1ldGhvZCBpcyBwcml2YXRlCi0gICAgICAgIHNlbmRNZXNzYWdlKE1lc3NhZ2VJZHMuVEVTVF9SVU5fRU5EICsgZWxhcHNlZFRpbWUpOwotICAgICAgICBmbHVzaCgpOwotICAgICAgICAvL3NodXREb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKG1MYXVuY2hJbmZvLmdldFByb2plY3QoKSwgCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVGVzdCBydW4gZmFpbGVkOiAlcyIsIGVycm9yTWVzc2FnZSkpOwotICAgICAgICAvLyBpcyB0aGlzIG5lZWRlZD8KLSAgICAgICAgLy9ub3RpZnlUZXN0UnVuU3RvcHBlZCgtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdFJ1bkxpc3RlbmVyIHRoYXQgY29tbXVuaWNhdGVzIHJlc3VsdHMgaW4gcmVhbC10aW1lIGJhY2sgdG8gSkRUIEpVbml0IAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGVzdFJ1bkxpc3RlbmVyIGltcGxlbWVudHMgSVRlc3RSdW5MaXN0ZW5lciB7Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLklUZXN0UnVuTGlzdGVuZXIjdGVzdEVuZGVkKGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEVuZGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgICAgIG1FeGVjdXRpb24uZ2V0TGlzdGVuZXIoKS5ub3RpZnlUZXN0RW5kZWQobmV3IFRlc3RDYXNlUmVmZXJlbmNlKHRlc3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RGYWlsZWQoY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lci5UZXN0RmFpbHVyZSwgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXIsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkKFRlc3RGYWlsdXJlIHN0YXR1cywgVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhdHVzU3RyaW5nOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBUZXN0RmFpbHVyZS5FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1c1N0cmluZyA9IE1lc3NhZ2VJZHMuVEVTVF9FUlJPUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzU3RyaW5nID0gTWVzc2FnZUlkcy5URVNUX0ZBSUxFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRlc3RSZWZlcmVuY2VGYWlsdXJlIGZhaWx1cmUgPSAKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFJlZmVyZW5jZUZhaWx1cmUobmV3IFRlc3RDYXNlUmVmZXJlbmNlKHRlc3QpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0cmluZywgdHJhY2UsIG51bGwpOwotICAgICAgICAgICAgbUV4ZWN1dGlvbi5nZXRMaXN0ZW5lcigpLm5vdGlmeVRlc3RGYWlsZWQoZmFpbHVyZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lciN0ZXN0UnVuRW5kZWQobG9uZykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lKSB7Ci0gICAgICAgICAgICBub3RpZnlUZXN0UnVuRW5kZWQoZWxhcHNlZFRpbWUpOwotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50VG9Db25zb2xlKG1MYXVuY2hJbmZvLmdldFByb2plY3QoKSwgIlRlc3QgcnVuIGNvbXBsZXRlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lciN0ZXN0UnVuRmFpbGVkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHJlcG9ydEVycm9yKGVycm9yTWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lciN0ZXN0UnVuU3RhcnRlZChpbnQpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3RhcnRlZChpbnQgdGVzdENvdW50KSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RSdW5TdG9wcGVkKGxvbmcpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3RvcHBlZChsb25nIGVsYXBzZWRUaW1lKSB7Ci0gICAgICAgICAgICBub3RpZnlUZXN0UnVuU3RvcHBlZChlbGFwc2VkVGltZSk7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRUb0NvbnNvbGUobUxhdW5jaEluZm8uZ2V0UHJvamVjdCgpLCAiVGVzdCBydW4gc3RvcHBlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLklUZXN0UnVuTGlzdGVuZXIjdGVzdFN0YXJ0ZWQoY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZVJlZmVyZW5jZSB0ZXN0SWQgPSBuZXcgVGVzdENhc2VSZWZlcmVuY2UodGVzdCk7Ci0gICAgICAgICAgICBtRXhlY3V0aW9uLmdldExpc3RlbmVyKCkubm90aWZ5VGVzdFN0YXJ0ZWQodGVzdElkKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvVGVzdENhc2VSZWZlcmVuY2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9UZXN0Q2FzZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY0OTU2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9UZXN0Q2FzZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5qdW5pdC5ydW5uZXIuSVZpc2l0c1Rlc3RUcmVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLk1lc3NhZ2VJZHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiBSZWZlcmVuY2UgZm9yIGEgc2luZ2xlIEFuZHJvaWQgdGVzdCBtZXRob2QuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1jbGFzcyBUZXN0Q2FzZVJlZmVyZW5jZSBleHRlbmRzIEFuZHJvaWRUZXN0UmVmZXJlbmNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRlc3ROYW1lOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUZXN0Q2FzZVJlZmVyZW5jZSBmcm9tIGEgY2xhc3MgYW5kIG1ldGhvZCBuYW1lCi0gICAgICovCi0gICAgVGVzdENhc2VSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIG1DbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIG1UZXN0TmFtZSA9IHRlc3ROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUZXN0Q2FzZVJlZmVyZW5jZSBmcm9tIGEge0BsaW5rIFRlc3RJZGVudGlmaWVyfQotICAgICAqIEBwYXJhbSB0ZXN0Ci0gICAgICovCi0gICAgVGVzdENhc2VSZWZlcmVuY2UoVGVzdElkZW50aWZpZXIgdGVzdCkgewotICAgICAgICBtQ2xhc3NOYW1lID0gdGVzdC5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgbVRlc3ROYW1lID0gdGVzdC5nZXRUZXN0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgcmVmZXJlbmNlZC4gSXMgYWx3YXlzIG9uZSBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyB0ZXN0IGlkZW50aWZpZXIgYW5kIHRlc3QgY291bnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgdGVzdAotICAgICAqIAotICAgICAqIEBwYXJhbSBub3RpZmllZCB0aGUge0BsaW5rIElWaXNpdHNUZXN0VHJlZXN9IHRvIHNlbmQgdGVzdCBpbmZvIHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZFRyZWUoSVZpc2l0c1Rlc3RUcmVlcyBub3RpZmllZCkgewotICAgICAgICBub3RpZmllZC52aXNpdFRyZWVFbnRyeShnZXRJZGVudGlmaWVyKCksIGZhbHNlLCBjb3VudFRlc3RDYXNlcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgdGVzdCwgaW4gYSBmb3JtYXQgZXhwZWN0ZWQgYnkgSkRUIEpVbml0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZUlkcy5URVNUX0lERU5USUZJRVJfTUVTU0FHRV9GT1JNQVQsIAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG1UZXN0TmFtZSwgbUNsYXNzTmFtZX0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9UZXN0Q29sbGVjdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvVGVzdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRlZGUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvanVuaXQvcnVudGltZS9UZXN0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LnJ1bm5lci5JVGVzdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLklWaXNpdHNUZXN0VHJlZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENvbGxlY3RzIGluZm8gYWJvdXQgdGVzdHMgdG8gYmUgZXhlY3V0ZWQgYnkgbGlzdGVuaW5nIHRvIHRoZSByZXN1bHRzIG9mIGFuIEFuZHJvaWQgdGVzdCBydW4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1jbGFzcyBUZXN0Q29sbGVjdG9yIGltcGxlbWVudHMgSVRlc3RSdW5MaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7Ci0gICAgLyoqIHRlc3QgbmFtZSB0byB0ZXN0IHN1aXRlIHJlZmVyZW5jZSBtYXAuICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZXN0U3VpdGVSZWZlcmVuY2U+IG1UZXN0VHJlZTsKLSAgICBwcml2YXRlIFN0cmluZyBtRXJyb3JNZXNzYWdlID0gbnVsbDsKLQotICAgIFRlc3RDb2xsZWN0b3IoKSB7Ci0gICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IDA7IAotICAgICAgICBtVGVzdFRyZWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRlc3RTdWl0ZVJlZmVyZW5jZT4oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RFbmRlZChjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kZWQoVGVzdElkZW50aWZpZXIgdGVzdCkgewotICAgICAgICAvLyBpZ25vcmUKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RGYWlsZWQoY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lci5UZXN0RmFpbHVyZSwgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXIsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0RmFpbHVyZSBzdGF0dXMsIFRlc3RJZGVudGlmaWVyIHRlc3QsIFN0cmluZyB0cmFjZSkgewotICAgICAgICAvLyBpZ25vcmUgLSBzaG91bGQgYmUgaW1wb3NzaWJsZSBzaW5jZSB0aGlzIGlzIG9ubHkgY29sbGVjdGluZyB0ZXN0IGluZm9ybWF0aW9uCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lciN0ZXN0UnVuRW5kZWQobG9uZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRW5kZWQobG9uZyBlbGFwc2VkVGltZSkgewotICAgICAgICAvLyBpZ25vcmUKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RSdW5GYWlsZWQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgbUVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RSdW5TdGFydGVkKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3RhcnRlZChpbnQgdGVzdENvdW50KSB7Ci0gICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IHRlc3RDb3VudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RSdW5TdG9wcGVkKGxvbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1blN0b3BwZWQobG9uZyBlbGFwc2VkVGltZSkgewotICAgICAgICAvLyBpZ25vcmUKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyI3Rlc3RTdGFydGVkKGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgVGVzdFN1aXRlUmVmZXJlbmNlIHN1aXRlUmVmID0gbVRlc3RUcmVlLmdldCh0ZXN0LmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgaWYgKHN1aXRlUmVmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBzdWl0ZSBoYXMgbm90IGJlZW4gc2VlbiBiZWZvcmUsIGNyZWF0ZSBpdAotICAgICAgICAgICAgc3VpdGVSZWYgPSBuZXcgVGVzdFN1aXRlUmVmZXJlbmNlKHRlc3QuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgbVRlc3RUcmVlLnB1dCh0ZXN0LmdldENsYXNzTmFtZSgpLCBzdWl0ZVJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VpdGVSZWYuYWRkVGVzdChuZXcgVGVzdENhc2VSZWZlcmVuY2UodGVzdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIHRlc3QgY291bnQgaW4gdGhlIHRlc3QgcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGVzdENhc2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3RhbFRlc3RDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBpbmZvIGFib3V0IHRoZSB0ZXN0IHRyZWUgdG8gYmUgZXhlY3V0ZWQgKGllIHRoZSBzdWl0ZXMgYW5kIHRoZWlyIGVuY2xvc2VkIHRlc3RzKSAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm90aWZpZWQgdGhlIHtAbGluayBJVmlzaXRzVGVzdFRyZWVzfSB0byBzZW5kIHRlc3QgZGF0YSB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRUcmVlcyhJVmlzaXRzVGVzdFRyZWVzIG5vdGlmaWVkKSB7Ci0gICAgICAgIGZvciAoSVRlc3RSZWZlcmVuY2UgcmVmIDogbVRlc3RUcmVlLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICByZWYuc2VuZFRyZWUobm90aWZpZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IHdhcyByZXBvcnRlZCB3aGVuIGNvbGxlY3RpbmcgdGVzdCBpbmZvLiAKLSAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yIG9jY3VycmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbUVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvVGVzdFN1aXRlUmVmZXJlbmNlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvbGF1bmNoL2p1bml0L3J1bnRpbWUvVGVzdFN1aXRlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjFlOGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9qdW5pdC9ydW50aW1lL1Rlc3RTdWl0ZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwubGF1bmNoLmp1bml0LnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuanVuaXQucnVubmVyLklWaXNpdHNUZXN0VHJlZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlZmVyZW5jZSBmb3IgYW4gQW5kcm9pZCB0ZXN0IHN1aXRlIGFrYSBjbGFzcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLWNsYXNzIFRlc3RTdWl0ZVJlZmVyZW5jZSBleHRlbmRzIEFuZHJvaWRUZXN0UmVmZXJlbmNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFRlc3RDYXNlUmVmZXJlbmNlPiBtVGVzdHM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgVGVzdFN1aXRlUmVmZXJlbmNlCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MKLSAgICAgKi8KLSAgICBUZXN0U3VpdGVSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICAgbUNsYXNzTmFtZSA9IGNsYXNzTmFtZTsgCi0gICAgICAgICBtVGVzdHMgPSBuZXcgQXJyYXlMaXN0PFRlc3RDYXNlUmVmZXJlbmNlPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgaW5jbHVkZWQgaW4gdGhpcyBzdWl0ZS4gCi0gICAgICovCi0gICAgcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1UZXN0cy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgdGVzdCBpZGVudGlmaWVyIGFuZCB0ZXN0IGNvdW50IGluZm9ybWF0aW9uIGZvciB0aGlzIHRlc3QgY2xhc3MsIGFuZCBhbGwgaXRzIGluY2x1ZGVkCi0gICAgICogdGVzdCBtZXRob2RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub3RpZmllZCB0aGUge0BsaW5rIElWaXNpdHNUZXN0VHJlZXN9IHRvIHNlbmQgdGVzdCBpbmZvIHRvbwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRUcmVlKElWaXNpdHNUZXN0VHJlZXMgbm90aWZpZWQpIHsKLSAgICAgICAgbm90aWZpZWQudmlzaXRUcmVlRW50cnkoZ2V0SWRlbnRpZmllcigpLCB0cnVlLCBjb3VudFRlc3RDYXNlcygpKTsKLSAgICAgICAgZm9yIChUZXN0Q2FzZVJlZmVyZW5jZSByZWYgOiBtVGVzdHMpIHsKLSAgICAgICAgICAgIHJlZi5zZW5kVHJlZShub3RpZmllZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHRlc3QgbWV0aG9kIHRvIHRoaXMgc3VpdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3RSZWYgdGhlIHtAbGluayBUZXN0Q2FzZVJlZmVyZW5jZX0gdG8gYWRkCi0gICAgICovCi0gICAgdm9pZCBhZGRUZXN0KFRlc3RDYXNlUmVmZXJlbmNlIHRlc3RSZWYpIHsKLSAgICAgICAgbVRlc3RzLmFkZCh0ZXN0UmVmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQW5kcm9pZFByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQW5kcm9pZFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDc3MmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3ByZWZlcmVuY2VzL0FuZHJvaWRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkay5JVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHMuU2RrVGFyZ2V0U2VsZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkRpcmVjdG9yeUZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaXMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiBQcmVmZXJlbmNlcyBkaWFsb2cuIEJ5IHN1YmNsYXNzaW5nIDxzYW1wPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L3NhbXA+LAotICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKLSAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKLSAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEFuZHJvaWRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgcHJpdmF0ZSBTZGtEaXJlY3RvcnlGaWVsZEVkaXRvciBtRGlyZWN0b3J5RmllbGQ7Ci0KLSAgICBwdWJsaWMgQW5kcm9pZFByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBzdXBlcihHUklEKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5BbmRyb2lkUHJlZmVyZW5jZVBhZ2VfVGl0bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZiB0aGUgY29tbW9uCi0gICAgICogR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzIG9mIHByZWZlcmVuY2VzLiBFYWNoIGZpZWxkCi0gICAgICogZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZCByZXN0b3JlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0KLSAgICAgICAgbURpcmVjdG9yeUZpZWxkID0gbmV3IFNka0RpcmVjdG9yeUZpZWxkRWRpdG9yKEFkdFBsdWdpbi5QUkVGU19TREtfRElSLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFuZHJvaWRQcmVmZXJlbmNlUGFnZV9TREtfTG9jYXRpb25fLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQotICAgICAgICBhZGRGaWVsZChtRGlyZWN0b3J5RmllbGQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0KLSAgICAgICAgaWYgKG1EaXJlY3RvcnlGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlyZWN0b3J5RmllbGQuZGlzcG9zZSgpOwotICAgICAgICAgICAgbURpcmVjdG9yeUZpZWxkID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN1c3RvbSB2ZXJzaW9uIG9mIERpcmVjdG9yeUZpZWxkRWRpdG9yIHdoaWNoIHZhbGlkYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkgcmVhbGx5Ci0gICAgICogY29udGFpbnMgYW4gU0RLLgotICAgICAqCi0gICAgICogVGhlcmUncyBhIGtub3duIGlzc3VlIGhlcmUsIHdoaWNoIGlzIHJlYWxseSBhIHJhcmUgZWRnZS1jYXNlOiBpZiB0aGUgcHJlZiBkaWFsb2cgaXMgb3BlbgotICAgICAqIHdoaWNoIGEgZ2l2ZW4gc2RrIGRpcmVjdG9yeSBhbmQgdGhlICpjb250ZW50KiBvZiB0aGUgZGlyZWN0b3J5IGNoYW5nZXMgc3VjaCB0aGF0IHRoZSBzZGsKLSAgICAgKiBzdGF0ZSBjaGFuZ2VkIChpLmUuIGZyb20gdmFsaWQgdG8gaW52YWxpZCBvciB2aWNlIHZlcnNhKSwgdGhlIHByZWYgcGFuZWwgd2lsbCBkaXNwbGF5IG9yCi0gICAgICogaGlkZSB0aGUgZXJyb3IgYXMgYXBwcm9wcmlhdGUgYnV0IHRoZSBwcmVmIHBhbmVsIHdpbGwgZmFpbCB0byB2YWxpZGF0ZSB0aGUgYXBwbHkvb2sgYnV0dG9ucwotICAgICAqIGFwcHJvcHJpYXRlbHkuIFRoZSBlYXN5IHdvcmthcm91bmQgaXMgdG8gY2FuY2VsIHRoZSBwcmVmIHBhbmVsIGFuZCBlbnRlciBpdCBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZGtEaXJlY3RvcnlGaWVsZEVkaXRvciBleHRlbmRzIERpcmVjdG9yeUZpZWxkRWRpdG9yIHsKLQotICAgICAgICBwcml2YXRlIFNka1RhcmdldFNlbGVjdG9yIG1UYXJnZXRTZWxlY3RvcjsKLSAgICAgICAgcHJpdmF0ZSBUYXJnZXRDaGFuZ2VkTGlzdGVuZXIgbVRhcmdldENoYW5nZUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBTZGtEaXJlY3RvcnlGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotICAgICAgICAgICAgc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RyaW5nRmllbGRFZGl0b3IgYW5kIG92ZXJyaWRkZW4gaW4gRGlyZWN0b3J5RmllbGRFZGl0b3IuCi0gICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSB0ZXh0IGlucHV0IGZpZWxkIGNvbnRhaW5zIGEgdmFsaWQgZGlyZWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFwcGx5L29rIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZCBpbiB0aGUgcHJlZiBwYW5lbAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGRvQ2hlY2tTdGF0ZSgpIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldFRleHRDb250cm9sKCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS50cmltKCk7Ci0KLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCcsJykgPj0gMCB8fCBmaWxlTmFtZS5pbmRleE9mKCc7JykgPj0gMCkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5BbmRyb2lkUHJlZmVyZW5jZVBhZ2VfRVJST1JfUmVzZXJ2ZWRfQ2hhcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQXBwbHkvT0sgbXVzdCBiZSBkaXNhYmxlZAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJEaXJlY3RvcnlGaWVsZEVkaXRvci5lcnJvck1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gb2sgPSBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmNoZWNrU2RrTG9jYXRpb25BbmRJZChmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEFkdFBsdWdpbi5DaGVja1Nka0Vycm9ySGFuZGxlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZS5yZXBsYWNlQWxsKCJcbiIsICIgIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQXBwbHkvT0sgbXVzdCBiZSBkaXNhYmxlZAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UobWVzc2FnZS5yZXBsYWNlQWxsKCJcbiIsICIgIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBcHBseS9PSyBtdXN0IGJlIGVuYWJsZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmIChvaykgY2xlYXJNZXNzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gb2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRleHQgZ2V0VGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc2V0VmFsaWRhdGVTdHJhdGVneShWQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0Q29udHJvbChwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RyaW5nRmllbGRFZGl0b3IgKGFuZCBGaWVsZEVkaXRvcikuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9GaWxsSW50b0dyaWQoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLSAgICAgICAgICAgIHN1cGVyLmRvRmlsbEludG9HcmlkKHBhcmVudCwgbnVtQ29sdW1ucyk7Ci0KLSAgICAgICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGwuc2V0VGV4dCgiTm90ZTogVGhlIGxpc3Qgb2YgU0RLIFRhcmdldHMgYmVsb3cgaXMgb25seSByZWxvYWRlZCBvbmNlIHlvdSBoaXQgJ0FwcGx5JyBvciAnT0snLiIpOwotICAgICAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgIGwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IG5vdCBoYXZlIGFuIHNkayBpZiB0aGUgc2RrIHBhdGggcHJlZiBpcyBlbXB0eSBvciBub3QgdmFsaWQuCi0gICAgICAgICAgICAgICAgU2RrIHNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gc2RrICE9IG51bGwgPyBzZGsuZ2V0VGFyZ2V0cygpIDogbnVsbDsKLQotICAgICAgICAgICAgICAgIG1UYXJnZXRTZWxlY3RvciA9IG5ldyBTZGtUYXJnZXRTZWxlY3RvcihwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyphbGxvd1NlbGVjdGlvbiovKTsKLSAgICAgICAgICAgICAgICBnZCA9IChHcmlkRGF0YSkgbVRhcmdldFNlbGVjdG9yLmdldExheW91dERhdGEoKTsKLSAgICAgICAgICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVRhcmdldENoYW5nZUxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldENoYW5nZUxpc3RlbmVyID0gbmV3IFRhcmdldENoYW5nZWRMaXN0ZW5lcigpOwotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZFRhcmdldExpc3RlbmVyKG1UYXJnZXRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhdGNoICphbnkqIGV4Y2VwdGlvbiB0aGF0IGFyaXNlcyBoZXJlLCBvdGhlcndpc2UgaXQgZGlzYWJsZXMKLSAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgcHJlZiBwYW5lbC4gV2UgY2FuIGxpdmUgd2l0aG91dCB0aGUgU2RrIHRhcmdldCBzZWxlY3RvciBidXQKLSAgICAgICAgICAgICAgICAvLyBub3QgYmVpbmcgYWJsZSB0byBhY3R1YWxseSBzZXQgYW4gc2RrIHBhdGguCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiU2RrVGFyZ2V0U2VsZWN0b3IgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGlmIChtVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlVGFyZ2V0TGlzdGVuZXIobVRhcmdldENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBUYXJnZXRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9qZWN0VGFyZ2V0Q2hhbmdlKElQcm9qZWN0IGNoYW5nZWRQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25UYXJnZXRzTG9hZGVkKCkgewotICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0U2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgbm90IGhhdmUgYW4gc2RrIGlmIHRoZSBzZGsgcGF0aCBwcmVmIGlzIGVtcHR5IG9yIG5vdCB2YWxpZC4KLSAgICAgICAgICAgICAgICAgICAgU2RrIHNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cyA9IHNkayAhPSBudWxsID8gc2RrLmdldFRhcmdldHMoKSA6IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldFNlbGVjdG9yLnNldFRhcmdldHModGFyZ2V0cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3ByZWZlcmVuY2VzL0J1aWxkUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9CdWlsZFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGZjMjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3ByZWZlcmVuY2VzL0J1aWxkUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5EZWJ1Z0tleVByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkRlYnVnS2V5UHJvdmlkZXIuS2V5dG9vbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmlsZUZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGJ1aWxkIG9wdGlvbnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQnVpbGRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9TVFJfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEJVSUxEX1NUUl9OT1JNQUwgPSAibm9ybWFsIjsgLy8kTk9OLU5MUy0xJAotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVJTERfU1RSX1ZFUkJPU0UgPSAidmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBCdWlsZFByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBzdXBlcihHUklEKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5CdWlsZFByZWZlcmVuY2VQYWdlX1RpdGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRCdWlsZExldmVsKFN0cmluZyBidWlsZFByZWZWYWx1ZSkgewotICAgICAgICBpZiAoQlVJTERfU1RSX1NJTEVOVC5lcXVhbHMoYnVpbGRQcmVmVmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWR0Q29uc3RhbnRzLkJVSUxEX0FMV0FZUzsKLSAgICAgICAgfSBlbHNlIGlmIChCVUlMRF9TVFJfVkVSQk9TRS5lcXVhbHMoYnVpbGRQcmVmVmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWR0Q29uc3RhbnRzLkJVSUxEX1ZFUkJPU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQWR0Q29uc3RhbnRzLkJVSUxEX05PUk1BTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0gICAgICAgIGFkZEZpZWxkKG5ldyBCb29sZWFuRmllbGRFZGl0b3IoQWR0UGx1Z2luLlBSRUZTX1JFU19BVVRPX1JFRlJFU0gsCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuQnVpbGRQcmVmZXJlbmNlUGFnZV9BdXRvX1JlZnJlc2hfUmVzb3VyY2VzX29uX0J1aWxkLAotICAgICAgICAgICAgICAgIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQotICAgICAgICBSYWRpb0dyb3VwRmllbGRFZGl0b3IgcmdmZSA9IG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLlBSRUZTX0JVSUxEX1ZFUkJPU0lUWSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5CdWlsZFByZWZlcmVuY2VQYWdlX0J1aWxkX091dHB1dCwgMSwgbmV3IFN0cmluZ1tdW10gewotICAgICAgICAgICAgICAgICAgICB7IE1lc3NhZ2VzLkJ1aWxkUHJlZmVyZW5jZVBhZ2VfU2lsZW50LCBCVUlMRF9TVFJfU0lMRU5UIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgTWVzc2FnZXMuQnVpbGRQcmVmZXJlbmNlUGFnZV9Ob3JtYWwsIEJVSUxEX1NUUl9OT1JNQUwgfSwKLSAgICAgICAgICAgICAgICAgICAgeyBNZXNzYWdlcy5CdWlsZFByZWZlcmVuY2VQYWdlX1ZlcmJvc2UsIEJVSUxEX1NUUl9WRVJCT1NFIH0KLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpLCB0cnVlKTsKLSAgICAgICAgYWRkRmllbGQocmdmZSk7Ci0KLSAgICAgICAgYWRkRmllbGQobmV3IFJlYWRPbmx5RmllbGRFZGl0b3IoQWR0UGx1Z2luLlBSRUZTX0RFRkFVTFRfREVCVUdfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuQnVpbGRQcmVmZXJlbmNlUGFnZV9EZWZhdWx0X0tleVN0b3JlLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0KLSAgICAgICAgYWRkRmllbGQobmV3IEtleXN0b3JlRmllbGRFZGl0b3IoQWR0UGx1Z2luLlBSRUZTX0NVU1RPTV9ERUJVR19LRVlTVE9SRSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5CdWlsZFByZWZlcmVuY2VQYWdlX0N1c3RvbV9LZXlzdG9yZSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgcmVhZC1vbmx5IHN0cmluZyBmaWVsZCBlZGl0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhZE9ubHlGaWVsZEVkaXRvciBleHRlbmRzIFN0cmluZ0ZpZWxkRWRpdG9yIHsKLQotICAgICAgICBwdWJsaWMgUmVhZE9ubHlGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBUZXh0IGNvbnRyb2wgPSBnZXRUZXh0Q29udHJvbCgpOwotICAgICAgICAgICAgY29udHJvbC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIHtAbGluayBGaWxlRmllbGRFZGl0b3J9IHRoYXQgY2hlY2tzIHRoYXQgdGhlIGtleXN0b3JlIGlzIHZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleXN0b3JlRmllbGRFZGl0b3IgZXh0ZW5kcyBGaWxlRmllbGRFZGl0b3IgewotICAgICAgICBwdWJsaWMgS2V5c3RvcmVGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihuYW1lLCBsYWJlbCwgcGFyZW50KTsKLSAgICAgICAgICAgIHNldFZhbGlkYXRlU3RyYXRlZ3koVkFMSURBVEVfT05fS0VZX1NUUk9LRSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1N0YXRlKCkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0VGV4dENvbnRyb2woKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnRyaW0oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZW1wdHkgdmFsdWVzIGFyZSBjb25zaWRlcmVkIG9rLgotICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGxvYWQgdGhlIGRlYnVnIGtleS4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnS2V5UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGVidWdLZXlQcm92aWRlcihmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzdG9yZVR5cGUgKi8sIG51bGwgLyoga2V5IGdlbiBvdXRwdXQgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUtleSBrZXkgPSBwcm92aWRlci5nZXREZWJ1Z0tleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gKFg1MDlDZXJ0aWZpY2F0ZSlwcm92aWRlci5nZXRDZXJ0aWZpY2F0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgY2VydGlmaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoIlVuYWJsZSB0byBmaW5kIGRlYnVnIGtleSBpbiBrZXlzdG9yZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnRpZmljYXRlLmdldE5vdEFmdGVyKCkuY29tcGFyZVRvKHRvZGF5KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKCJDZXJ0aWZpY2F0ZSBpcyBleHBpcmVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnRpZmljYXRlLmdldE5vdEJlZm9yZSgpLmNvbXBhcmVUbyh0b2RheSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZSgiQ2VydGlmaWNhdGUgdmFsaWRpdHkgaXMgaW4gdGhlIGZ1dHVyZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGdvb2QhCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoS2V5dG9vbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZSgiTm90IGEgdmFsaWQga2V5c3RvcmUgcGF0aC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQXBwbHkvT0sgbXVzdCBiZSBkaXNhYmxlZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xlYXJFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRleHQgZ2V0VGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc2V0VmFsaWRhdGVTdHJhdGVneShWQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0Q29udHJvbChwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIGEge0BsaW5rIFRocm93YWJsZX0uIElmIHRoZSBleGNlcHRpb24gaGFzIG5vIG1lc3NhZ2UsIHRyeQotICAgICAgICAgKiB0byBnZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY2F1c2UuCi0gICAgICAgICAqIEBwYXJhbSB0IHRoZSBUaHJvd2FibGUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSB0LmdldENhdXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGNhdXNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIlVrbm93biBlcnJvciB3aGVuIGdldHRpbmcgdGhlIGRlYnVnIGtleSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB2YWxpZCB0ZXh0LCBkaXNwbGF5IGl0LgotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3ByZWZlcmVuY2VzL0xhdW5jaFByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTGF1bmNoUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzMGViNS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTGF1bmNoUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFNldHRpbmdzIHBhZ2UgZm9yIGxhdW5jaCByZWxhdGVkIHByZWZlcmVuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLSAgICAKLSAgICBwdWJsaWMgTGF1bmNoUHJlZmVyZW5jZVBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKEdSSUQpOwotICAgICAgICBzZXRQcmVmZXJlbmNlU3RvcmUoQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkxhdW5jaFByZWZlcmVuY2VQYWdlX1RpdGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0gICAgICAgIGFkZEZpZWxkKG5ldyBTdHJpbmdGaWVsZEVkaXRvcihBZHRQbHVnaW4uUFJFRlNfRU1VX09QVElPTlMsCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuTGF1bmNoUHJlZmVyZW5jZVBhZ2VfRGVmYXVsdF9FbXVfT3B0aW9ucywgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotCi0gICAgICAgIGFkZEZpZWxkKG5ldyBTdHJpbmdGaWVsZEVkaXRvcihBZHRQbHVnaW4uUFJFRlNfSE9NRV9QQUNLQUdFLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkxhdW5jaFByZWZlcmVuY2VQYWdlX0RlZmF1bHRfSE9NRV9QYWNrYWdlLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc0MTAyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFuZHJvaWRQcmVmZXJlbmNlUGFnZV9FUlJPUl9SZXNlcnZlZF9DaGFyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW5kcm9pZFByZWZlcmVuY2VQYWdlX1NES19Mb2NhdGlvbl87Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbmRyb2lkUHJlZmVyZW5jZVBhZ2VfVGl0bGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZFByZWZlcmVuY2VQYWdlX0F1dG9fUmVmcmVzaF9SZXNvdXJjZXNfb25fQnVpbGQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZFByZWZlcmVuY2VQYWdlX0J1aWxkX091dHB1dDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkUHJlZmVyZW5jZVBhZ2VfQ3VzdG9tX0tleXN0b3JlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRQcmVmZXJlbmNlUGFnZV9EZWZhdWx0X0tleVN0b3JlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRQcmVmZXJlbmNlUGFnZV9Ob3JtYWw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZFByZWZlcmVuY2VQYWdlX1NpbGVudDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkUHJlZmVyZW5jZVBhZ2VfVGl0bGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZFByZWZlcmVuY2VQYWdlX1ZlcmJvc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hQcmVmZXJlbmNlUGFnZV9EZWZhdWx0X0VtdV9PcHRpb25zOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoUHJlZmVyZW5jZVBhZ2VfRGVmYXVsdF9IT01FX1BhY2thZ2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hQcmVmZXJlbmNlUGFnZV9UaXRsZTsKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTdlOTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmphcnV0aWxzLkRlYnVnS2V5UHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuRGVidWdLZXlQcm92aWRlci5LZXl0b29sRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbi5BbmRyb2lkTG9jYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcgotICAgICAqICNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEFkdFBsdWdpbi5QUkVGU19SRVNfQVVUT19SRUZSRVNILCB0cnVlKTsKLQotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEFkdFBsdWdpbi5QUkVGU19CVUlMRF9WRVJCT1NJVFksIEJ1aWxkUHJlZmVyZW5jZVBhZ2UuQlVJTERfU1RSX05PUk1BTCk7Ci0gICAgICAgIAotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEFkdFBsdWdpbi5QUkVGU19IT01FX1BBQ0tBR0UsICJhbmRyb2lkLnByb2Nlc3MuYWNvcmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0b3JlLnNldERlZmF1bHQoQWR0UGx1Z2luLlBSRUZTX0RFRkFVTFRfREVCVUdfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgICAgIERlYnVnS2V5UHJvdmlkZXIuZ2V0RGVmYXVsdEtleVN0b3JlT3NQYXRoKCkpOwotICAgICAgICB9IGNhdGNoIChLZXl0b29sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkdldCBkZWZhdWx0IGRlYnVnIGtleXN0b3JlIHBhdGggZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkdldCBkZWZhdWx0IGRlYnVnIGtleXN0b3JlIHBhdGggZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Vc2FnZVByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVXNhZ2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2RmZWZkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Vc2FnZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtzdGF0cy5TZGtTdGF0c1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVc2FnZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgcHJpdmF0ZSBCb29sZWFuRmllbGRFZGl0b3IgbU9wdEluQ2hlY2tCb3g7Ci0KLSAgICBwdWJsaWMgVXNhZ2VQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBMaW5rIHRleHQgPSBuZXcgTGluayh0b3AsIFNXVC5XUkFQKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gMjAwOwotICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICB0ZXh0LnNldFRleHQoU2RrU3RhdHNTZXJ2aWNlLkJPRFlfVEVYVCk7Ci0KLSAgICAgICAgdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTZGtTdGF0c1NlcnZpY2Uub3BlblVybChldmVudC50ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbU9wdEluQ2hlY2tCb3ggPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFNka1N0YXRzU2VydmljZS5QSU5HX09QVF9JTiwKLSAgICAgICAgICAgICAgICBTZGtTdGF0c1NlcnZpY2UuQ0hFQ0tCT1hfVEVYVCwgdG9wKTsKLSAgICAgICAgbU9wdEluQ2hlY2tCb3guc2V0UGFnZSh0aGlzKTsKLSAgICAgICAgbU9wdEluQ2hlY2tCb3guc2V0UHJlZmVyZW5jZVN0b3JlKFNka1N0YXRzU2VydmljZS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gICAgICAgIG1PcHRJbkNoZWNrQm94LmxvYWQoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQ2FuY2VsKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgICAgICBtT3B0SW5DaGVja0JveC5sb2FkKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLSAgICAgICAgbU9wdEluQ2hlY2tCb3gubG9hZERlZmF1bHQoKTsKLSAgICAgICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgc2F2ZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLSAgICAgICAgc2F2ZSgpOwotICAgICAgICBzdXBlci5wZXJmb3JtQXBwbHkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBTZGtTdGF0c1NlcnZpY2UuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICBpZiAoc3RvcmUgIT0gIG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdG9yZS5zZXRWYWx1ZShTZGtTdGF0c1NlcnZpY2UuUElOR19PUFRfSU4sIG1PcHRJbkNoZWNrQm94LmdldEJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdG9yZS5zYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVhYzE5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQnVpbGRQcmVmZXJlbmNlUGFnZV9UaXRsZT1CdWlsZCBTZXR0aW5nczoKLUJ1aWxkUHJlZmVyZW5jZVBhZ2VfQXV0b19SZWZyZXNoX1Jlc291cmNlc19vbl9CdWlsZD1BdXRvbWF0aWNhbGx5IHJlZnJlc2ggUmVzb3VyY2VzIGFuZCBBc3NldHMgZm9sZGVyIG9uIGJ1aWxkCi1CdWlsZFByZWZlcmVuY2VQYWdlX0J1aWxkX091dHB1dD1CdWlsZCBvdXRwdXQKLUJ1aWxkUHJlZmVyZW5jZVBhZ2VfU2lsZW50PVNpbGVudAotQnVpbGRQcmVmZXJlbmNlUGFnZV9Ob3JtYWw9Tm9ybWFsCi1CdWlsZFByZWZlcmVuY2VQYWdlX1ZlcmJvc2U9VmVyYm9zZQotQnVpbGRQcmVmZXJlbmNlUGFnZV9EZWZhdWx0X0tleVN0b3JlPURlZmF1bHQgZGVidWcga2V5c3RvcmU6Ci1CdWlsZFByZWZlcmVuY2VQYWdlX0N1c3RvbV9LZXlzdG9yZT1DdXN0b20gZGVidWcga2V5c3RvcmU6Ci1MYXVuY2hQcmVmZXJlbmNlUGFnZV9UaXRsZT1MYXVuY2ggU2V0dGluZ3M6Ci1MYXVuY2hQcmVmZXJlbmNlUGFnZV9EZWZhdWx0X0VtdV9PcHRpb25zPURlZmF1bHQgZW11bGF0b3Igb3B0aW9uczoKLUxhdW5jaFByZWZlcmVuY2VQYWdlX0RlZmF1bHRfSE9NRV9QYWNrYWdlPURlZmF1bHQgSE9NRSBwYWNrYWdlOgotQW5kcm9pZFByZWZlcmVuY2VQYWdlX1RpdGxlPUFuZHJvaWQgUHJlZmVyZW5jZXMKLUFuZHJvaWRQcmVmZXJlbmNlUGFnZV9TREtfTG9jYXRpb25fPVNESyBMb2NhdGlvbjoKLUFuZHJvaWRQcmVmZXJlbmNlUGFnZV9FUlJPUl9SZXNlcnZlZF9DaGFyPVJlc2VydmVkIGNoYXJhY3RlcnMgJywnIGFuZCAnOycgY2Fubm90IGJlIHVzZWQgaW4gdGhlIFNESyBMb2NhdGlvbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0FuZHJvaWRDbGFzc3BhdGhDb250YWluZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0FuZHJvaWRDbGFzc3BhdGhDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlZjZiOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotCi0vKioKLSAqIENsYXNzcGF0aCBjb250YWluZXIgZm9yIHRoZSBBbmRyb2lkIHByb2plY3RzLgotICovCi1jbGFzcyBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBtQ2xhc3NwYXRoRW50cnk7Ci0gICAgcHJpdmF0ZSBJUGF0aCBtQ29udGFpbmVyUGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIHRoZSBjb250YWluZXIgd2l0aCB0aGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gcmVwcmVzZW50aW5nIHRoZSBhbmRyb2lkCi0gICAgICogZnJhbWV3b3JrIGphciBmaWxlIGFuZCB0aGUgY29udGFpbmVyIGlkCi0gICAgICogQHBhcmFtIGVudHJpZXMgdGhlIGVudHJpZXMgcmVwcmVzZW50aW5nIHRoZSBhbmRyb2lkIGZyYW1ld29yayBhbmQgb3B0aW9uYWwgbGlicmFyaWVzLgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgaWQuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byBkaXNwbGF5LgotICAgICAqLwotICAgIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXIoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywgSVBhdGggcGF0aCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUNsYXNzcGF0aEVudHJ5ID0gZW50cmllczsKLSAgICAgICAgbUNvbnRhaW5lclBhdGggPSBwYXRoOwotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotICAgICAgICByZXR1cm4gbUNsYXNzcGF0aEVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBJQ2xhc3NwYXRoQ29udGFpbmVyLktfREVGQVVMVF9TWVNURU07Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGFpbmVyUGF0aDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0FuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk1NmJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0FuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0Q29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5Mb2FkU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQuSU9wdGlvbmFsTGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIENsYXNzcGF0aCBjb250YWluZXIgaW5pdGlhbGl6ZXIgcmVzcG9uc2libGUgZm9yIGJpbmRpbmcge0BsaW5rIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJ9IHRvCi0gKiB7QGxpbmsgSVByb2plY3R9cy4gVGhpcyByZW1vdmVzIHRoZSBoYXJkLWNvZGVkIHBhdGggdG8gdGhlIGFuZHJvaWQuamFyLgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgewotICAgIC8qKiBUaGUgY29udGFpbmVyIGlkIGZvciB0aGUgYW5kcm9pZCBmcmFtZXdvcmsgamFyIGZpbGUgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX0lEID0KLSAgICAgICAgImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BTkRST0lEX0ZSQU1FV09SSyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBwYXRoIHNlcGFyYXRvciB0byBzdG9yZSBtdWx0aXBsZSBwYXRocyBpbiBhIHNpbmdsZSBwcm9wZXJ0eS4gVGhpcyBpcyBndWFyYW50ZWVkIHRvIG5vdAotICAgICAqIGJlIGluIGEgcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSAiXHUwMDFDIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0NPTlRBSU5FUl9DQUNIRSA9ICJhbmRyb2lkQ29udGFpbmVyQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX1RBUkdFVF9OQU1FID0gImFuZHJvaWRUYXJnZXRDYWNoZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FDSEVfVkVSU0lPTiA9ICIwMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FDSEVfVkVSU0lPTl9TRVAgPSBDQUNIRV9WRVJTSU9OICsgUEFUSF9TRVBBUkFUT1I7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENBQ0hFX0lOREVYX0pBUiA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENBQ0hFX0lOREVYX1NSQyA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENBQ0hFX0lOREVYX0RPQ1NfVVJJID0gMjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0FDSEVfSU5ERVhfT1BUX0RPQ1NfVVJJID0gMzsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0FDSEVfSU5ERVhfQUREX09OX1NUQVJUID0gQ0FDSEVfSU5ERVhfT1BUX0RPQ1NfVVJJOwotICAgIAotICAgIHB1YmxpYyBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCaW5kcyBhIGNsYXNzcGF0aCBjb250YWluZXIgIHRvIGEge0BsaW5rIElDbGFzc3BhdGhDb250YWluZXJ9IGZvciBhIGdpdmVuIHByb2plY3QsCi0gICAgICogb3Igc2lsZW50bHkgZmFpbHMgaWYgdW5hYmxlIHRvIGRvIHNvLgotICAgICAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBjb250YWluZXIgcGF0aCB0aGF0IGlzIHRoZSBjb250YWluZXIgaWQuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gYmluZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKENPTlRBSU5FUl9JRC5lcXVhbHMoY29udGFpbmVyUGF0aC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKG5ldyBQYXRoKENPTlRBSU5FUl9JRCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJSmF2YVByb2plY3RbXSB7IHByb2plY3QgfSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGFsbG9jYXRlQW5kcm9pZENvbnRhaW5lcihwcm9qZWN0KSB9LAotICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gb2YgdHlwZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9DT05UQUlORVJ9Ci0gICAgICogbGlua2luZyB0byB0aGUgQW5kcm9pZCBGcmFtZXdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0Q29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChDT05UQUlORVJfSUQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHtAbGluayBJUGF0aH0gb2JqZWN0cyBhZ2FpbnN0IHRoZSBhbmRyb2lkIGZyYW1ld29yayBjb250YWluZXIgaWQgYW5kCi0gICAgICogcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGV5IGFyZSBpZGVudGljYWwuCi0gICAgICogQHBhcmFtIHBhdGggdGhlIDxjb2RlPklQYXRoPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tQYXRoKElQYXRoIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIENPTlRBSU5FUl9JRC5lcXVhbHMocGF0aC50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gb2JqZWN0cyB3aXRoIG5ldyBhbmRyb2lkIGZyYW1ld29yayBjb250YWluZXIuIFRoaXMgZm9yY2VzCi0gICAgICogSkRUIHRvIHJlY29tcGlsZSB0aGVtLgotICAgICAqIEBwYXJhbSBhbmRyb2lkUHJvamVjdHMgdGhlIHByb2plY3RzIHRvIHVwZGF0ZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3MsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVwZGF0ZVByb2plY3RzKElKYXZhUHJvamVjdFtdIGFuZHJvaWRQcm9qZWN0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQWxsb2NhdGUgYSBuZXcgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lciwgYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgYW5kcm9pZCBmcmFtZXdvcmsgCi0gICAgICAgICAgICAvLyBjb250YWluZXIgaWQgZm9yIGVhY2ggcHJvamVjdHMuCi0gICAgICAgICAgICAvLyBCeSBwcm92aWRpbmcgYSBuZXcgYXNzb2NpYXRpb24gYmV0d2VlbiBhIGNvbnRhaW5lciBpZCBhbmQgYSBJQ2xhc3NwYXRoQ29udGFpbmVyLAotICAgICAgICAgICAgLy8gdGhpcyBmb3JjZXMgdGhlIEpEVCB0byBxdWVyeSB0aGUgSUNsYXNzcGF0aENvbnRhaW5lciBmb3IgbmV3IElDbGFzc3BhdGhFbnRyeSAod2l0aAotICAgICAgICAgICAgLy8gSUNsYXNzcGF0aENvbnRhaW5lciNnZXRDbGFzc3BhdGhFbnRyaWVzKCkpLCBhbmQgdGhlcmVmb3JlIGZvcmNlIHJlY29tcGlsYXRpb24gb2YgCi0gICAgICAgICAgICAvLyB0aGUgcHJvamVjdHMuCi0gICAgICAgICAgICBpbnQgcHJvamVjdENvdW50ID0gYW5kcm9pZFByb2plY3RzLmxlbmd0aDsKLQotICAgICAgICAgICAgSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltwcm9qZWN0Q291bnRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcHJvamVjdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb250YWluZXJzW2ldID0gYWxsb2NhdGVBbmRyb2lkQ29udGFpbmVyKGFuZHJvaWRQcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdpdmUgZWFjaCBwcm9qZWN0IHRoZWlyIG5ldyBjb250YWluZXIgaW4gb25lIGNhbGwuCi0gICAgICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKENPTlRBSU5FUl9JRCksCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQcm9qZWN0cywgY29udGFpbmVycywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGFuIHtAbGluayBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVyfSBvYmplY3Qgd2l0aCB0aGUgcHJvcGVyCi0gICAgICogcGF0aCB0byB0aGUgZnJhbWV3b3JrIGphciBmaWxlLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgamF2YSBwcm9qZWN0IHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb250YWluZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNsYXNzcGF0aENvbnRhaW5lciBhbGxvY2F0ZUFuZHJvaWRDb250YWluZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IGlQcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIFN0cmluZyBtYXJrZXJNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBvdXRwdXRUb0NvbnNvbGUgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkdFBsdWdpbiBwbHVnaW4gPSBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGxvY2sgb2JqZWN0IGZvciBwcm9qZWN0IG1hbmlwdWxhdGlvbiBkdXJpbmcgU0RLIGxvYWQuCi0gICAgICAgICAgICBPYmplY3QgbG9jayA9IHBsdWdpbi5nZXRTZGtMb2NrT2JqZWN0KCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNka0lzTG9hZGVkID0gcGx1Z2luLmdldFNka0xvYWRTdGF0dXMoKSA9PSBMb2FkU3RhdHVzLkxPQURFRDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcHJvamVjdCBoYXMgYSB2YWxpZCB0YXJnZXQuCi0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc2RrSXNMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQoaVByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBsb2FkZWQgYW5kIHRoZSB0YXJnZXQgaXMgbm9uIG51bGwsIHdlIGNyZWF0ZSBhIHZhbGlkIENsYXNzUGF0aENvbnRhaW5lcgotICAgICAgICAgICAgICAgIGlmIChzZGtJc0xvYWRlZCAmJiB0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSB0YXJnZXQuZ2V0Q2xhc3NwYXRoTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzKGlQcm9qZWN0LCB0YXJnZXQsIHRhcmdldE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKENPTlRBSU5FUl9JRCksIHRhcmdldE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZXJyb3IsIHdlJ2xsIHRyeSBkaWZmZXJlbnQgdGhpbmcgdG8gcHJvdmlkZSB0aGUgYmVzdCBlcnJvciBtZXNzYWdlCi0gICAgICAgICAgICAgICAgLy8gcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcm9qZWN0J3MgdGFyZ2V0J3MgaGFzaCBzdHJpbmcgKGlmIGl0IGV4aXN0cykKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaFN0cmluZyA9IFNkay5nZXRQcm9qZWN0VGFyZ2V0SGFzaFN0cmluZyhpUHJvamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFzaFN0cmluZyA9PSBudWxsIHx8IGhhc2hTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBoYXNoIHN0cmluZyB3ZSBvbmx5IHNob3cgdGhpcyBpZiB0aGUgU0RLIGlzIGxvYWRlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGEgcHJvamVjdCBvcGVuZWQgYXQgc3RhcnQtdXAgd2l0aCBubyB0YXJnZXQsIHRoaXMgd291bGQgYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHR3aWNlLCBvbmNlIHdoZW4gdGhlIHByb2plY3QgaXMgb3BlbmVkLCBhbmQgb25jZSBhZnRlciB0aGUgU0RLIGhhcwotICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCBsb2FkaW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBCeSB0ZXN0aW5nIHRoZSBzZGsgaXMgbG9hZGVkLCB3ZSBvbmx5IHNob3cgdGhpcyBvbmNlIGluIHRoZSBjb25zb2xlLgotICAgICAgICAgICAgICAgICAgICBpZiAoc2RrSXNMb2FkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvamVjdCBoYXMgbm8gdGFyZ2V0IHNldC4gRWRpdCB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHRvIHNldCBvbmUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNka0lzTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmtlck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVzb2x2ZSB0YXJnZXQgJyVzJyIsIGhhc2hTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSBoYXNoU3RyaW5nIGJ1dCB0aGUgU0RLIGlzIG5vdCB5ZXQKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFuZCB0aGVyZWZvcmUgd2UgY2FuJ3QgZ2V0IHRoZSB0YXJnZXQgeWV0LgotICAgICAgICAgICAgICAgICAgICAvLyBXZSBjaGVjayBpZiB0aGVyZSBpcyBhIGNhY2hlIG9mIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRnJvbUNhY2hlKGlQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIHRoZSBjYWNoZSB3YXMgd3JvbmcgKGllIGZvbGRlciBkb2VzIG5vdCBleGlzdHMgYW55bW9yZSksIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIGNhY2hlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlc29sdmVkIGFnYWluIGFmdGVyIHRoZSBTREsgaXMgbG9hZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldFByb2plY3RUb1Jlc29sdmUoamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZXNvbHZlIHRhcmdldCAnJXMnIHVudGlsIHRoZSBTREsgaXMgbG9hZGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hTdHJpbmcpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBub3QgbG9nIHRoaXMgb25lIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdpbGwgaGFwcGVuIGF0IGV2ZXJ5IGJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaXQncyBleHBlY3RlZC4gKHdlIGRvIGtlZXAgdGhlIGVycm9yIG1hcmtlciB0aG91Z2gpLgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Db25zb2xlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZWQgYSBjb250YWluZXIgZnJvbSB0aGUgY2FjaGUsIHNvIHdlIHJlZ2lzdGVyIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBjaGVja2VkIGZvciBjYWNoZSB2YWxpZGl0eSBvbmNlIHRoZSBTREsgaXMgbG9hZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0UHJvamVjdFRvQ2hlY2soamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmV0dXJuIHRoZSBjb250YWluZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIGR1bW15IGNvbnRhaW5lciB0byByZXBsYWNlIHRoZSBvbmUgd2UgbWF5IGhhdmUgaGFkIGJlZm9yZS4KLSAgICAgICAgICAgICAgICAvLyBJdCdsbCBiZSByZXBsYWNlZCBieSB0aGUgcmVhbCB3aGVuIGlmL3doZW4gdGhlIHRhcmdldCBpcyByZXNvbHZlZCBpZi93aGVuIHRoZQotICAgICAgICAgICAgICAgIC8vIFNESyBmaW5pc2hlcyBsb2FkaW5nLgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuYWJsZSB0byBnZXQgc3lzdGVtIGxpYnJhcnkgZm9yIHRoZSBwcm9qZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJQ2xhc3NwYXRoQ29udGFpbmVyLktfREVGQVVMVF9TWVNURU07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChtYXJrZXJNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBsb2cgdGhlIGVycm9yIGFuZCBwdXQgdGhlIG1hcmtlciBvbiB0aGUgcHJvamVjdCBpZiB3ZSBjYW4uCi0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFRvQ29uc29sZSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZShpUHJvamVjdCwgbWFya2VyTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihpUHJvamVjdCwgQWR0Q29uc3RhbnRzLk1BUktFUl9UQVJHRVQsIG1hcmtlck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuUFJJT1JJVFlfSElHSCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMsIHRoZSB3b3Jrc3BhY2UgbWF5IGJlIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIHdoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBoZXJlLgotICAgICAgICAgICAgICAgICAgICAvLyBXZSBzY2hlZHVsZSBhIG5ldyBqb2IgdG8gcHV0IHRoZSBtYXJrZXIgYWZ0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmbWVzc2FnZSA9IG1hcmtlck1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgIEpvYiBtYXJrZXJKb2IgPSBuZXcgSm9iKCJBbmRyb2lkIFNESzogUmVzb2x2aW5nIGVycm9yIG1hcmtlcnMiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlUHJvamVjdEhlbHBlci5hZGRNYXJrZXIoaVByb2plY3QsIEFkdENvbnN0YW50cy5NQVJLRVJfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtZXNzYWdlLCAtMSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlBSSU9SSVRZX0hJR0gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUyLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGpvYnMgYXJlIHJ1biBhZnRlciBvdGhlciBpbnRlcmFjdGl2ZSBqb2JzCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOwotICAgICAgICAgICAgICAgICAgICBtYXJrZXJKb2Iuc2NoZWR1bGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vIGVycm9yLCByZW1vdmUgcG90ZW50aWFsIE1BUktFUl9UQVJHRVRzLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaVByb2plY3QuZGVsZXRlTWFya2VycyhBZHRDb25zdGFudHMuTUFSS0VSX1RBUkdFVCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcywgdGhlIHdvcmtzcGFjZSBtYXkgYmUgbG9ja2VkIGZvciBtb2RpZmljYXRpb24gd2hlbiB3ZSBwYXNzCi0gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHNvIHdlIHNjaGVkdWxlIGEgbmV3IGpvYiB0byBwdXQgdGhlIG1hcmtlciBhZnRlci4KLSAgICAgICAgICAgICAgICAgICAgSm9iIG1hcmtlckpvYiA9IG5ldyBKb2IoIkFuZHJvaWQgU0RLOiBSZXNvbHZpbmcgZXJyb3IgbWFya2VycyIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQcm9qZWN0LmRlbGV0ZU1hcmtlcnMoQWR0Q29uc3RhbnRzLk1BUktFUl9UQVJHRVQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlMi5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBqb2JzIGFyZSBydW4gYWZ0ZXIgb3RoZXIgaW50ZXJhY3RpdmUgam9icwotICAgICAgICAgICAgICAgICAgICBtYXJrZXJKb2Iuc2V0UHJpb3JpdHkoSm9iLkJVSUxEKTsKLSAgICAgICAgICAgICAgICAgICAgbWFya2VySm9iLnNjaGVkdWxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSBvYmplY3RzIGZvciB0aGUgYW5kcm9pZAotICAgICAqIGZyYW1ld29yayBhbmQgb3B0aW9uYWwgbGlicmFyaWVzLgotICAgICAqIDxwLz5UaGlzIHJlZmVyZW5jZXMgdGhlIE9TIHBhdGggdG8gdGhlIGFuZHJvaWQuamFyIGFuZCB0aGUKLSAgICAgKiBqYXZhIGRvYyBkaXJlY3RvcnkuIFRoaXMgaXMgZHluYW1pY2FsbHkgY3JlYXRlZCB3aGVuIGEgcHJvamVjdCBpcyBvcGVuZWQsCi0gICAgICogYW5kIG5ldmVyIHNhdmVkIGluIHRoZSBwcm9qZWN0IGl0c2VsZiwgc28gdGhlcmUncyBubyByaXNrIG9mIHN0b3JpbmcgYW4KLSAgICAgKiBvYnNvbGV0ZSBwYXRoLgotICAgICAqIFRoZSBtZXRob2QgYWxzbyBzdG9yZXMgdGhlIHBhdGhzIHVzZWQgdG8gY3JlYXRlIHRoZSBlbnRyaWVzIGluIHRoZSBwcm9qZWN0IHBlcnNpc3RlbnQKLSAgICAgKiBwcm9wZXJ0aWVzLiBBIG5ldyB7QGxpbmsgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lcn0gY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgc3RvcmVkIHBhdGgKLSAgICAgKiB1c2luZyB0aGUge0BsaW5rICNnZXRDb250YWluZXJGcm9tQ2FjaGUoSVByb2plY3QpfSBtZXRob2QuCi0gICAgICogQHBhcmFtIHByb2plY3QgCi0gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRoYXQgY29udGFpbnMgdGhlIGxpYnJhcmllcy4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZSAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzKElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQsIFN0cmluZyB0YXJnZXROYW1lKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIHBhdGggZnJvbSB0aGUgdGFyZ2V0Ci0gICAgICAgIFN0cmluZ1tdIHBhdGhzID0gZ2V0VGFyZ2V0UGF0aHModGFyZ2V0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIHBhdGhzCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzRnJvbVBhdGhzKHBhdGhzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHBhdGhzIG5vdyBjb250YWlucyBhbGwgdGhlIHBhdGggcmVxdWlyZWQgdG8gcmVjcmVhdGUgdGhlIElDbGFzc3BhdGhFbnRyeSB3aXRoIG5vCi0gICAgICAgIC8vIHRhcmdldCBpbmZvLiBXZSBlbmNvZGUgdGhlbSBpbiBhIHNpbmdsZSBzdHJpbmcsIHdpdGggZWFjaCBwYXRoIHNlcGFyYXRlZCBieQotICAgICAgICAvLyBPUyBwYXRoIHNlcGFyYXRvci4KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKENBQ0hFX1ZFUlNJT04pOwotICAgICAgICBmb3IgKFN0cmluZyBwIDogcGF0aHMpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChQQVRIX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHN0b3JlIHRoaXMgaW4gYSBwcm9qZWN0IHBlcnNpc3RlbnQgcHJvcGVydHkKLSAgICAgICAgUHJvamVjdEhlbHBlci5zYXZlU3RyaW5nUHJvcGVydHkocHJvamVjdCwgUFJPUEVSVFlfQ09OVEFJTkVSX0NBQ0hFLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgUHJvamVjdEhlbHBlci5zYXZlU3RyaW5nUHJvcGVydHkocHJvamVjdCwgUFJPUEVSVFlfVEFSR0VUX05BTUUsIHRhcmdldE5hbWUpOwotCi0gICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4ge0BsaW5rIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJ9IGZyb20gdGhlIHByb2plY3QgY2FjaGUsIGlmIHBvc3NpYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXIgZ2V0Q29udGFpbmVyRnJvbUNhY2hlKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjYWNoZWQgaW5mbyBmcm9tIHRoZSBwcm9qZWN0IHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLSAgICAgICAgU3RyaW5nIGNhY2hlID0gUHJvamVjdEhlbHBlci5sb2FkU3RyaW5nUHJvcGVydHkocHJvamVjdCwgUFJPUEVSVFlfQ09OVEFJTkVSX0NBQ0hFKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVDYWNoZSA9IFByb2plY3RIZWxwZXIubG9hZFN0cmluZ1Byb3BlcnR5KHByb2plY3QsIFBST1BFUlRZX1RBUkdFVF9OQU1FKTsKLSAgICAgICAgaWYgKGNhY2hlID09IG51bGwgfHwgdGFyZ2V0TmFtZUNhY2hlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0aGUgZmlyc3QgMiBjaGFycyBtdXN0IG1hdGNoIENBQ0hFX1ZFUlNJT04uIFRoZSAzcmQgY2hhciBpcyB0aGUgbm9ybWFsIHNlcGFyYXRvci4KLSAgICAgICAgaWYgKGNhY2hlLnN0YXJ0c1dpdGgoQ0FDSEVfVkVSU0lPTl9TRVApID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2FjaGUgPSBjYWNoZS5zdWJzdHJpbmcoQ0FDSEVfVkVSU0lPTl9TRVAubGVuZ3RoKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gdGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIHBhdGhzLCBzZXBhcmF0ZWQgYnkgYSBjaGFyYWN0ZXIgZ3VhcmFudGVlZCB0byBub3QgYmUgaW4KLSAgICAgICAgLy8gdGhlIHBhdGggKFx1MDAxQykuCi0gICAgICAgIC8vIFRoZSBmaXJzdCAzIGFyZSBmb3IgYW5kcm9pZC5qYXIgKGphciwgc291cmNlLCBkb2MpLCB0aGUgcmVzdCBhcmUgZm9yIHRoZSBvcHRpb25hbAotICAgICAgICAvLyBsaWJyYXJpZXMgYW5kIHNob3VsZCBjb250YWluIGF0IGxlYXN0IG9uZSBkb2MgYW5kIGEgamFyIChpZiB0aGVyZSBhcmUgYW55IGxpYnJhcmllcykuCi0gICAgICAgIC8vIFRoZXJlZm9yZSwgdGhlIHBhdGggY291bnQgc2hvdWxkIGJlIDMgb3IgNSsKLSAgICAgICAgU3RyaW5nW10gcGF0aHMgPSBjYWNoZS5zcGxpdChQYXR0ZXJuLnF1b3RlKFBBVEhfU0VQQVJBVE9SKSk7Ci0gICAgICAgIGlmIChwYXRocy5sZW5ndGggPCAzIHx8IHBhdGhzLmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm93IHdlIGNoZWNrIHRoZSBwYXRocyBhY3R1YWxseSBleGlzdC4KLSAgICAgICAgLy8gVGhlcmUncyBhbiBleGNlcHRpb246IElmIHRoZSBzb3VyY2UgZm9sZGVyIGZvciBhbmRyb2lkLmphciBkb2VzIG5vdCBleGlzdCwgdGhpcyBpcwotICAgICAgICAvLyBub3QgYSBwcm9ibGVtLCBzbyB3ZSBza2lwIGl0LgotICAgICAgICAvLyBBbHNvIHBhdGhzW0NBQ0hFX0lOREVYX0RPQ1NfVVJJXSBpcyBhIFVSSSB0byB0aGUgamF2YWRvYywgc28gd2UgdGVzdCBpdCBhCi0gICAgICAgIC8vIGJpdCBkaWZmZXJlbnRseS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShwYXRoc1tDQUNIRV9JTkRFWF9KQVJdKS5leGlzdHMoKSA9PSBmYWxzZSB8fAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShuZXcgVVJJKHBhdGhzW0NBQ0hFX0lOREVYX0RPQ1NfVVJJXSkpLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHBhdGggZm9yIHRoZSBhZGQtb25zLCBpZiB0aGV5IGV4aXN0LgotICAgICAgICAgICAgaWYgKHBhdGhzLmxlbmd0aCA+IENBQ0hFX0lOREVYX0FERF9PTl9TVEFSVCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBkb2NzIHBhdGggc2VwYXJhdGVseSBmcm9tIHRoZSByZXN0IG9mIHRoZSBwYXRocyBhcyBpdCdzIGEgVVJJLgotICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShuZXcgVVJJKHBhdGhzW0NBQ0hFX0lOREVYX09QVF9ET0NTX1VSSV0pKS5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cganVzdCBjaGVjayB0aGUgcmVtYWluaW5nIHBhdGhzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBDQUNIRV9JTkRFWF9BRERfT05fU1RBUlQgKyAxOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBwYXRoc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzRnJvbVBhdGhzKHBhdGhzKTsKLQotICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRDbGFzc3BhdGhDb250YWluZXIoZW50cmllcywKLSAgICAgICAgICAgICAgICBuZXcgUGF0aChDT05UQUlORVJfSUQpLCB0YXJnZXROYW1lQ2FjaGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2Yge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gZnJvbSBhIHNldCBvZiBwYXRocy4KLSAgICAgKiBAc2VlICNnZXRUYXJnZXRQYXRocyhJQW5kcm9pZFRhcmdldCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzRnJvbVBhdGhzKFN0cmluZ1tdIHBhdGhzKSB7Ci0gICAgICAgIEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEZpcnN0LCB3ZSBjcmVhdGUgdGhlIElDbGFzc3BhdGhFbnRyeSBmb3IgdGhlIGZyYW1ld29yay4KLSAgICAgICAgLy8gbm93IGFkZCB0aGUgYW5kcm9pZCBmcmFtZXdvcmsgdG8gdGhlIGNsYXNzIHBhdGguCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcGF0aCBvYmplY3QuCi0gICAgICAgIElQYXRoIGFuZHJvaWRfbGliID0gbmV3IFBhdGgocGF0aHNbQ0FDSEVfSU5ERVhfSkFSXSk7Ci0gICAgICAgIElQYXRoIGFuZHJvaWRfc3JjID0gbmV3IFBhdGgocGF0aHNbQ0FDSEVfSU5ERVhfU1JDXSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBqYXZhIGRvYyBsaW5rLgotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlIGNwQXR0cmlidXRlID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElDbGFzc3BhdGhBdHRyaWJ1dGUuSkFWQURPQ19MT0NBVElPTl9BVFRSSUJVVEVfTkFNRSwKLSAgICAgICAgICAgICAgICBwYXRoc1tDQUNIRV9JTkRFWF9ET0NTX1VSSV0pOwotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBhY2Nlc3MgcnVsZSB0byByZXN0cmljdCBhY2Nlc3MgdG8gY2xhc3NlcyBpbiBjb20uYW5kcm9pZC5pbnRlcm5hbAotICAgICAgICBJQWNjZXNzUnVsZSBhY2Nlc3NSdWxlID0gSmF2YUNvcmUubmV3QWNjZXNzUnVsZSgKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCgiY29tL2FuZHJvaWQvaW50ZXJuYWwvKioiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEUpOwotCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeSBmcmFtZXdvcmtDbGFzc3BhdGhFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShhbmRyb2lkX2xpYiwKLSAgICAgICAgICAgICAgICBhbmRyb2lkX3NyYywgLy8gc291cmNlIGF0dGFjaG1lbnQgcGF0aAotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAvLyBkZWZhdWx0IHNvdXJjZSBhdHRhY2htZW50IHJvb3QgcGF0aC4KLSAgICAgICAgICAgICAgICBuZXcgSUFjY2Vzc1J1bGVbXSB7IGFjY2Vzc1J1bGUgfSwKLSAgICAgICAgICAgICAgICBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHsgY3BBdHRyaWJ1dGUgfSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvLyBub3QgZXhwb3J0ZWQuCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBsaXN0LmFkZChmcmFtZXdvcmtDbGFzc3BhdGhFbnRyeSk7Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgZGVhbCB3aXRoIG9wdGlvbmFsIGxpYnJhcmllcwotICAgICAgICBpZiAocGF0aHMubGVuZ3RoID49IDUpIHsKLSAgICAgICAgICAgIFN0cmluZyBkb2NQYXRoID0gcGF0aHNbQ0FDSEVfSU5ERVhfT1BUX0RPQ1NfVVJJXTsKLSAgICAgICAgICAgIGludCBpID0gNDsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgcGF0aHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgUGF0aCBqYXJQYXRoID0gbmV3IFBhdGgocGF0aHNbaSsrXSk7Ci0KLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY1BhdGgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlLkpBVkFET0NfTE9DQVRJT05fQVRUUklCVVRFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NQYXRoKQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXJQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gZGVmYXVsdCBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGguCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8vIG5vdCBleHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoZW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHByb2plY3RzJyBjYWNoZXMuIElmIHRoZSBjYWNoZSB3YXMgdmFsaWQsIHRoZSBwcm9qZWN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdHMgdGhlIGxpc3Qgb2YgcHJvamVjdHMgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUHJvamVjdHNDYWNoZShBcnJheUxpc3Q8SUphdmFQcm9qZWN0PiBwcm9qZWN0cykgewotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHByb2plY3RMb29wOiB3aGlsZSAoaSA8IHByb2plY3RzLnNpemUoKSkgewotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcHJvamVjdHMuZ2V0KGkpOwotICAgICAgICAgICAgSVByb2plY3QgaVByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IGlzIG9wZW5lZAotICAgICAgICAgICAgaWYgKGlQcm9qZWN0LmlzT3BlbigpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaW5jcmVtZW50IGkgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgIHByb2plY3RzLnJlbW92ZShpKTsKLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHRhcmdldCBmcm9tIHRoZSBwcm9qZWN0IGFuZCBpdHMgcGF0aHMKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuLiBUaGlzIHdvdWxkIG1lYW4gdGhlcmUgYXJlIGNhY2hlZCBwYXRocywKLSAgICAgICAgICAgICAgICAvLyBidXQgZGVmYXVsdC5wcm9wZXJ0aWVzIHdhcyBkZWxldGVkLiBLZWVwIHRoZSBwcm9qZWN0IGluIHRoZSBsaXN0IHRvIGZvcmNlCi0gICAgICAgICAgICAgICAgLy8gYSByZXNvbHZlIHdoaWNoIHdpbGwgZGlzcGxheSB0aGUgZXJyb3IuCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmdbXSB0YXJnZXRQYXRocyA9IGdldFRhcmdldFBhdGhzKHRhcmdldCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vdyBnZXQgdGhlIGNhY2hlZCBwYXRocwotICAgICAgICAgICAgU3RyaW5nIGNhY2hlID0gUHJvamVjdEhlbHBlci5sb2FkU3RyaW5nUHJvcGVydHkoaVByb2plY3QsIFBST1BFUlRZX0NPTlRBSU5FUl9DQUNIRSk7Ci0gICAgICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uIFdlJ2xsIGZvcmNlIHJlc29sdmUgYWdhaW4gYW55d2F5LgotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nW10gY2FjaGVkUGF0aHMgPSBjYWNoZS5zcGxpdChQYXR0ZXJuLnF1b3RlKFBBVEhfU0VQQVJBVE9SKSk7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkUGF0aHMubGVuZ3RoIDwgMyB8fCBjYWNoZWRQYXRocy5sZW5ndGggPT0gNCkgewotICAgICAgICAgICAgICAgIC8vIHBhdGhzIGxlbmd0aCBpcyB3cm9uZy4gc2ltcGx5IHJlc29sdmUgdGhlIHByb2plY3QgYWdhaW4KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdyB3ZSBjb21wYXJlIHRoZSBwYXRocy4gVGhlIGZpcnN0IDQgY2FuIGJlIGNvbXBhcmVkIGRpcmVjdGx5LgotICAgICAgICAgICAgLy8gYmVjYXVzZSBvZiBjYXNlIHNlbnNpdGl2ZW5lc3Mgd2UgbmVlZCB0byB1c2UgRmlsZSBvYmplY3RzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0YXJnZXRQYXRocy5sZW5ndGggIT0gY2FjaGVkUGF0aHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHBhdGhzLCBmb3JjZSByZXNvbHZlIGFnYWluLgotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgbWFpbiBwYXRocyAoYW5kcm9pZC5qYXIsIG1haW4gc291cmNlcywgbWFpbiBqYXZhZG9jKQotICAgICAgICAgICAgaWYgKG5ldyBGaWxlKHRhcmdldFBhdGhzW0NBQ0hFX0lOREVYX0pBUl0pLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShjYWNoZWRQYXRoc1tDQUNIRV9JTkRFWF9KQVJdKSkgPT0gZmFsc2UgfHwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodGFyZ2V0UGF0aHNbQ0FDSEVfSU5ERVhfU1JDXSkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNhY2hlZFBhdGhzW0NBQ0hFX0lOREVYX1NSQ10pKSA9PSBmYWxzZSB8fAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0YXJnZXRQYXRoc1tDQUNIRV9JTkRFWF9ET0NTX1VSSV0pLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShjYWNoZWRQYXRoc1tDQUNIRV9JTkRFWF9ET0NTX1VSSV0pKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBwYXRocywgZm9yY2UgcmVzb2x2ZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYWNoZWRQYXRocy5sZW5ndGggPiBDQUNIRV9JTkRFWF9PUFRfRE9DU19VUkkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb21wYXJlIG9wdGlvbmFsIGxpYnJhcmllcyBqYXZhZG9jCi0gICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKHRhcmdldFBhdGhzW0NBQ0hFX0lOREVYX09QVF9ET0NTX1VSSV0pLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNhY2hlZFBhdGhzW0NBQ0hFX0lOREVYX09QVF9ET0NTX1VSSV0pKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgcGF0aHMsIGZvcmNlIHJlc29sdmUgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgdGhlIG9wdGlvbmFsIGphciBmaWxlcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2tpZXIuCi0gICAgICAgICAgICAgICAgLy8gVGhlIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGlkZW50aWNhbC4KLSAgICAgICAgICAgICAgICAvLyBGcm9tIGEgcHJldmlvdXMgdGVzdCwgd2UgZG8ga25vdyBob3dldmVyIHRoYXQgdGhlcmUgaXMgdGhlIHNhbWUgbnVtYmVyLgotICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgbGlicmFyaWVzIHNob3VsZCBiZSBsb3cgZW5vdWdoIHRoYXQgd2UgY2FuIHNpbXBseSBnbyB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgIC8vIGxpc3RzIG1hbnVhbGx5LgotICAgICAgICAgICAgICAgIHRhcmdldExvb3A6IGZvciAoaW50IHRwaSA9IDQgOyB0cGkgPCB0YXJnZXRQYXRocy5sZW5ndGg7IHRwaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aHNbdHBpXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgbWF0Y2ggaW4gdGhlIG90aGVyIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNwaSA9IDQgOyBjcGkgPCBjYWNoZWRQYXRocy5sZW5ndGg7IGNwaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUodGFyZ2V0UGF0aCkuZXF1YWxzKG5ldyBGaWxlKGNhY2hlZFBhdGhzW2NwaV0pKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2guIFRyeSB0aGUgbmV4dCB0YXJnZXRQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdGFyZ2V0TG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2Ugc3RvcCBoZXJlLCB3ZSBoYXZlbid0IGZvdW5kIGEgbWF0Y2gsIHdoaWNoIG1lYW5zIHRoZXJlJ3MgYQotICAgICAgICAgICAgICAgICAgICAvLyBkaXNjcmVwYW5jeSBpbiB0aGUgbGlicmFyaWVzLiBXZSBmb3JjZSBhIHJlc29sdmUuCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgcHJvamVjdExvb3A7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdCB0aGUgcG9pbnQgdGhlIGNoZWNrIHBhc3NlcywgYW5kIHdlIGNhbiByZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBpbmNyZW1lbnQgaSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICBwcm9qZWN0cy5yZW1vdmUoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aHMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gZm9yIHRoaXMgdGFyZ2V0cy4KLSAgICAgKiA8cC8+VGhlIHBhdGhzIGFyZSBhbHdheXMgaW4gdGhlIHNhbWUgb3JkZXIuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5QYXRoIHRvIGFuZHJvaWQuamFyPC9saT4KLSAgICAgKiA8bGk+UGF0aCB0byB0aGUgc291cmNlIGNvZGUgZm9yIGFuZHJvaWQuamFyPC9saT4KLSAgICAgKiA8bGk+UGF0aCB0byB0aGUgamF2YWRvYyBmb3IgdGhlIGFuZHJvaWQgcGxhdGZvcm08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQWRkaXRpb25hbGx5LCBpZiB0aGVyZSBhcmUgb3B0aW9uYWwgbGlicmFyaWVzLCB0aGUgYXJyYXkgd2lsbCBjb250YWluOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+UGF0aCB0byB0aGUgbGlicmFpcmllcyBqYXZhZG9jPC9saT4KLSAgICAgKiA8bGk+UGF0aCB0byB0aGUgZmlyc3QgLmphciBmaWxlPC9saT4KLSAgICAgKiA8bGk+KG1vcmUgLmphciBhcyBuZWVkZWQpPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFRhcmdldFBhdGhzKElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3QsIHdlIGdldCB0aGUgcGF0aCBmb3IgYW5kcm9pZC5qYXIKLSAgICAgICAgLy8gVGhlIG9yZGVyIGlzOiBhbmRyb2lkLmphciwgc291cmNlIGZvbGRlciwgZG9jcyBmb2xkZXIKLSAgICAgICAgcGF0aHMuYWRkKHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFORFJPSURfSkFSKSk7Ci0gICAgICAgIHBhdGhzLmFkZCh0YXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5TT1VSQ0VTKSk7Ci0gICAgICAgIHBhdGhzLmFkZChBZHRQbHVnaW4uZ2V0VXJsRG9jKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbm93IGRlYWwgd2l0aCBvcHRpb25hbCBsaWJyYXJpZXMuCi0gICAgICAgIElPcHRpb25hbExpYnJhcnlbXSBsaWJyYXJpZXMgPSB0YXJnZXQuZ2V0T3B0aW9uYWxMaWJyYXJpZXMoKTsKLSAgICAgICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhbGwgdGhlIG9wdGlvbmFsIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgamF2YWRvYywgc28gd2Ugc3RhcnQgd2l0aCB0aGlzCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0RG9jUGF0aCA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkRPQ1MpOwotICAgICAgICAgICAgaWYgKHRhcmdldERvY1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhdGhzLmFkZChQcm9qZWN0SGVscGVyLmdldEphdmFEb2NQYXRoKHRhcmdldERvY1BhdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgYWRkIGFuIGVtcHR5IHN0cmluZywgdG8gYWx3YXlzIGhhdmUgdGhlIHNhbWUgY291bnQuCi0gICAgICAgICAgICAgICAgcGF0aHMuYWRkKCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYmVjYXVzZSBkaWZmZXJlbnQgbGlicmFyaWVzIGNvdWxkIHVzZSB0aGUgc2FtZSBqYXIgZmlsZSwgd2UgbWFrZSBzdXJlIHdlIGFkZAotICAgICAgICAgICAgLy8gZWFjaCBqYXIgZmlsZSBvbmx5IG9uY2UuCi0gICAgICAgICAgICBIYXNoU2V0PFN0cmluZz4gdmlzaXRlZEphcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKElPcHRpb25hbExpYnJhcnkgbGlicmFyeSA6IGxpYnJhcmllcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBqYXJQYXRoID0gbGlicmFyeS5nZXRKYXJQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2l0ZWRKYXJzLmNvbnRhaW5zKGphclBhdGgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRKYXJzLmFkZChqYXJQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgcGF0aHMuYWRkKGphclBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXRocy50b0FycmF5KG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTWFuaWZlc3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNzQ5Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTWFuaWZlc3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5YbWxFcnJvckhhbmRsZXIuWG1sRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi54bWwuQW5kcm9pZE1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFuZHJvaWRNYW5pZmVzdFBhcnNlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTEVWRUxfTUFOSUZFU1QgPSAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBMRVZFTF9BUFBMSUNBVElPTiA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExFVkVMX0FDVElWSVRZID0gMjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTEVWRUxfSU5URU5UX0ZJTFRFUiA9IDM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExFVkVMX0NBVEVHT1JZID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTUFJTiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTEFVTkNIRVIgPSAiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbnN0cnVtZW50YXRpb24gaW5mbyBvYnRhaW5lZCBmcm9tIG1hbmlmZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnN0cnVtZW50YXRpb24gewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRhcmdldFBhY2thZ2U7Ci0KLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0UGFja2FnZSkgewotICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgbVRhcmdldFBhY2thZ2UgPSB0YXJnZXRQYWNrYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBpbnN0cnVtZW50YXRpb24gY2xhc3MgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIEFuZHJvaWQgYXBwIHBhY2thZ2UgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFBhY2thZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRhcmdldFBhY2thZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBpbmZvIG9idGFpbmVkIGZyb20gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aXZpdHkgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0V4cG9ydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0FjdGlvbiA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc01haW5BY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNMYXVuY2hlckNhdGVnb3J5ID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIEFjdGl2aXR5KFN0cmluZyBuYW1lLCBib29sZWFuIGV4cG9ydGVkKSB7Ci0gICAgICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBtSXNFeHBvcnRlZCA9IGV4cG9ydGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNFeHBvcnRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0FjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtSGFzQWN0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNIb21lQWN0aXZpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUhhc01haW5BY3Rpb24gJiYgbUhhc0xhdW5jaGVyQ2F0ZWdvcnk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEhhc0FjdGlvbihib29sZWFuIGhhc0FjdGlvbikgewotICAgICAgICAgICAgbUhhc0FjdGlvbiA9IGhhc0FjdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBJZiB0aGUgYWN0aXZpdHkgZG9lc24ndCB5ZXQgaGF2ZSBhIGZpbHRlciBzZXQgZm9yIHRoZSBsYXVuY2hlciwgdGhpcyByZXNldHMgYm90aAotICAgICAgICAgKiBmbGFncy4gVGhpcyBpcyB0byBoYW5kbGUgbXVsdGlwbGUgaW50ZW50LWZpbHRlcnMgd2hlcmUgb25lIGNvdWxkIGhhdmUgdGhlIHZhbGlkCi0gICAgICAgICAqIGFjdGlvbiwgYW5kIGFub3RoZXIgb25lIG9mIHRoZSB2YWxpZCBjYXRlZ29yeS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgcmVzZXRJbnRlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBpZiAoaXNIb21lQWN0aXZpdHkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIG1IYXNNYWluQWN0aW9uID0gbUhhc0xhdW5jaGVyQ2F0ZWdvcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0SGFzTWFpbkFjdGlvbihib29sZWFuIGhhc01haW5BY3Rpb24pIHsKLSAgICAgICAgICAgIG1IYXNNYWluQWN0aW9uID0gaGFzTWFpbkFjdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0SGFzTGF1bmNoZXJDYXRlZ29yeShib29sZWFuIGhhc0xhdW5jaGVyQ2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIG1IYXNMYXVuY2hlckNhdGVnb3J5ID0gaGFzTGF1bmNoZXJDYXRlZ29yeTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFhNTCBlcnJvciAmIGRhdGEgaGFuZGxlciB1c2VkIHdoZW4gcGFyc2luZyB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHNlcnZlcyBib3RoIGFzIGFuIHtAbGluayBYbWxFcnJvckhhbmRsZXJ9IHRvIHJlcG9ydCBlcnJvcnMgYW5kIGFzIGEgZGF0YSByZXBvc2l0b3J5Ci0gICAgICogdG8gY29sbGVjdCBkYXRhIGZyb20gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hbmlmZXN0SGFuZGxlciBleHRlbmRzIFhtbEVycm9ySGFuZGxlciB7Ci0KLSAgICAgICAgLy8tLS0gZGF0YSByZWFkIGZyb20gdGhlIHBhcnNpbmcKLQotICAgICAgICAvKiogQXBwbGljYXRpb24gcGFja2FnZSAqLwotICAgICAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZTsKLSAgICAgICAgLyoqIExpc3Qgb2YgYWxsIGFjdGl2aXRpZXMgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8QWN0aXZpdHk+IG1BY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eT4oKTsKLSAgICAgICAgLyoqIExhdW5jaGVyIGFjdGl2aXR5ICovCi0gICAgICAgIHByaXZhdGUgQWN0aXZpdHkgbUxhdW5jaGVyQWN0aXZpdHkgPSBudWxsOwotICAgICAgICAvKiogbGlzdCBvZiBwcm9jZXNzIG5hbWVzIGRlY2xhcmVkIGJ5IHRoZSBtYW5pZmVzdCAqLwotICAgICAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1Qcm9jZXNzZXMgPSBudWxsOwotICAgICAgICAvKiogZGVidWdnYWJsZSBhdHRyaWJ1dGUgdmFsdWUuIElmIG51bGwsIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQuICovCi0gICAgICAgIHByaXZhdGUgQm9vbGVhbiBtRGVidWdnYWJsZSA9IG51bGw7Ci0gICAgICAgIC8qKiBBUEkgbGV2ZWwgcmVxdWlyZW1lbnQuIGlmIG51bGwgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHByZXNlbnQuICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1BcGlMZXZlbFJlcXVpcmVtZW50ID0gbnVsbDsKLSAgICAgICAgLyoqIExpc3Qgb2YgYWxsIGluc3RydW1lbnRhdGlvbnMgZGVjbGFyZWQgYnkgdGhlIG1hbmlmZXN0ICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEluc3RydW1lbnRhdGlvbj4gbUluc3RydW1lbnRhdGlvbnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJbnN0cnVtZW50YXRpb24+KCk7Ci0gICAgICAgIC8qKiBMaXN0IG9mIGFsbCBsaWJyYXJpZXMgaW4gdXNlIGRlY2xhcmVkIGJ5IHRoZSBtYW5pZmVzdCAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1MaWJyYXJpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvLy0tLSB0ZW1wb3JhcnkgZGF0YS9mbGFncyB1c2VkIGR1cmluZyBwYXJzaW5nCi0gICAgICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IG1KYXZhUHJvamVjdDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1HYXRoZXJEYXRhID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTWFya0Vycm9ycyA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGludCBtQ3VycmVudExldmVsID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZhbGlkTGV2ZWwgPSAwOwotICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1DdXJyZW50QWN0aXZpdHkgPSBudWxsOwotICAgICAgICBwcml2YXRlIExvY2F0b3IgbUxvY2F0b3I7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1hbmlmZXN0SGFuZGxlcn0sIHdoaWNoIGlzIGFsc28gYW4ge0BsaW5rIFhtbEVycm9ySGFuZGxlcn0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgVGhlIG1hbmlmZXN0IGZpbGUgYmVpbmcgcGFyc2VkLiBDYW4gYmUgbnVsbC4KLSAgICAgICAgICogQHBhcmFtIGVycm9yTGlzdGVuZXIgQW4gb3B0aW9uYWwgZXJyb3IgbGlzdGVuZXIuCi0gICAgICAgICAqIEBwYXJhbSBnYXRoZXJEYXRhIFRydWUgaWYgZGF0YSBzaG91bGQgYmUgZ2F0aGVyZWQuCi0gICAgICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgamF2YSBwcm9qZWN0IGhvbGRpbmcgdGhlIG1hbmlmZXN0IGZpbGUuIENhbiBiZSBudWxsLgotICAgICAgICAgKiBAcGFyYW0gbWFya0Vycm9ycyBUcnVlIGlmIGVycm9ycyBzaG91bGQgYmUgbWFya2VkIGFzIEVjbGlwc2UgTWFya2VycyBvbiB0aGUgcmVzb3VyY2UuCi0gICAgICAgICAqLwotICAgICAgICBNYW5pZmVzdEhhbmRsZXIoSUZpbGUgbWFuaWZlc3RGaWxlLCBYbWxFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBnYXRoZXJEYXRhLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gbWFya0Vycm9ycykgewotICAgICAgICAgICAgc3VwZXIobWFuaWZlc3RGaWxlLCBlcnJvckxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1HYXRoZXJEYXRhID0gZ2F0aGVyRGF0YTsKLSAgICAgICAgICAgIG1KYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICAgICAgbU1hcmtFcnJvcnMgPSBtYXJrRXJyb3JzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2UgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIGlmIGZvdW5kLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIG5hbWUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFjdGl2aXRpZXMgZm91bmQgaW4gdGhlIG1hbmlmZXN0LgotICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcywgb3IgZW1wdHkgaWYgbm8gYWN0aXZpdHkgd2VyZSBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIEFjdGl2aXR5W10gZ2V0QWN0aXZpdGllcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZpdGllcy50b0FycmF5KG5ldyBBY3Rpdml0eVttQWN0aXZpdGllcy5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIG9uZSBhY3Rpdml0eSBmb3VuZCBpbiB0aGUgbWFuaWZlc3QsIHRoYXQgaXMgY29uZmlndXJlZCB0byBzaG93Ci0gICAgICAgICAqIHVwIGluIHRoZSBIT01FIHNjcmVlbi4KLSAgICAgICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBIT01FIGFjdGl2aXR5IG9yIG51bGwgaWYgbm9uZSB3ZXJlIGZvdW5kLgotICAgICAgICAgKi8KLSAgICAgICAgQWN0aXZpdHkgZ2V0TGF1bmNoZXJBY3Rpdml0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTGF1bmNoZXJBY3Rpdml0eTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb2Nlc3MgbmFtZXMgZGVjbGFyZWQgYnkgdGhlIG1hbmlmZXN0LgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nW10gZ2V0UHJvY2Vzc2VzKCkgewotICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUHJvY2Vzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttUHJvY2Vzc2VzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5kZWJ1Z2dhYmxlPC9jb2RlPiBhdHRyaWJ1dGUgdmFsdWUgb3IgbnVsbCBpZiBpdCBpcyBub3Qgc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgQm9vbGVhbiBnZXREZWJ1Z2dhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZWJ1Z2dhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIDxjb2RlPm1pblNka1ZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiBpdCdzIG5vdCBzZXQuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBpTGV2ZWxSZXF1aXJlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGluc3RydW1lbnRhdGlvbnMgZm91bmQgaW4gdGhlIG1hbmlmZXN0LgotICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBJbnN0cnVtZW50YXRpb259LCBvciBlbXB0eSBpZiBubyBpbnN0cnVtZW50YXRpb25zIHdlcmUKLSAgICAgICAgICogZm91bmQuCi0gICAgICAgICAqLwotICAgICAgICBJbnN0cnVtZW50YXRpb25bXSBnZXRJbnN0cnVtZW50YXRpb25zKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0cnVtZW50YXRpb25zLnRvQXJyYXkobmV3IEluc3RydW1lbnRhdGlvblttSW5zdHJ1bWVudGF0aW9ucy5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGxpYnJhcmllcyBpbiB1c2UgZm91bmQgaW4gdGhlIG1hbmlmZXN0LgotICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGxpYnJhcnkgbmFtZXMsIG9yIGVtcHR5IGlmIG5vIGxpYnJhcmllcyB3ZXJlIGZvdW5kLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nW10gZ2V0VXNlc0xpYnJhcmllcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtTGlicmFyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1ttTGlicmFyaWVzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yKG9yZy54bWwuc2F4LkxvY2F0b3IpCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgewotICAgICAgICAgICAgbUxvY2F0b3IgPSBsb2NhdG9yOwotICAgICAgICAgICAgc3VwZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0gICAgICAgICAqIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChtR2F0aGVyRGF0YSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgYSB2YWxpZCBsZXZlbAotICAgICAgICAgICAgICAgIGlmIChtVmFsaWRMZXZlbCA9PSBtQ3VycmVudExldmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtVmFsaWRMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRVZFTF9NQU5JRkVTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5kcm9pZE1hbmlmZXN0Lk5PREVfTUFOSUZFU1QuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBnZXQgdGhlIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2UgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfUEFDS0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBoYXNOYW1lc3BhY2UgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsaWRMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVWRUxfQVBQTElDQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRNYW5pZmVzdC5OT0RFX0FQUExJQ0FUSU9OLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX1BST0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBoYXNOYW1lc3BhY2UgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUHJvY2Vzc05hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfREVCVUdHQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z2dhYmxlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbGlkTGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFuZHJvaWRNYW5pZmVzdC5OT0RFX1VTRVNfU0RLLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcGlMZXZlbFJlcXVpcmVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX01JTl9TREtfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBbmRyb2lkTWFuaWZlc3QuTk9ERV9JTlNUUlVNRU5UQVRJT04uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0luc3RydW1lbnRhdGlvbk5vZGUoYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRVZFTF9BQ1RJVklUWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5kcm9pZE1hbmlmZXN0Lk5PREVfQUNUSVZJVFkuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FjdGl2aXR5Tm9kZShhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbGlkTGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFuZHJvaWRNYW5pZmVzdC5OT0RFX1NFUlZJQ0UuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05vZGUoYXR0cmlidXRlcywgQW5kcm9pZENvbnN0YW50cy5DTEFTU19TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbGlkTGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFuZHJvaWRNYW5pZmVzdC5OT0RFX1JFQ0VJVkVSLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOb2RlKGF0dHJpYnV0ZXMsIEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfQlJPQURDQVNUUkVDRUlWRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsaWRMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQW5kcm9pZE1hbmlmZXN0Lk5PREVfUFJPVklERVIuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05vZGUoYXR0cmlidXRlcywgQW5kcm9pZENvbnN0YW50cy5DTEFTU19DT05URU5UUFJPVklERVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsaWRMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQW5kcm9pZE1hbmlmZXN0Lk5PREVfVVNFU19MSUJSQVJZLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBoYXNOYW1lc3BhY2UgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpYnJhcmllcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRVZFTF9JTlRFTlRfRklMVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyB0aGlzIGxldmVsIGlmIHdlIGFyZSBpbiBhbiBhY3Rpdml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjdGl2aXR5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5OT0RFX0lOVEVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2aXR5LnJlc2V0SW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWxpZExldmVsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRVZFTF9DQVRFR09SWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkTWFuaWZlc3QuTk9ERV9BQ1RJT04uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaGFzTmFtZXNwYWNlICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWN0aXZpdHkuc2V0SGFzQWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWN0aXZpdHkuc2V0SGFzTWFpbkFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9NQUlOLmVxdWFscyhhY3Rpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBbmRyb2lkTWFuaWZlc3QuTk9ERV9DQVRFR09SWS5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5ID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ0FURUdPUllfTEFVTkNIRVIuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWN0aXZpdHkuc2V0SGFzTGF1bmNoZXJDYXRlZ29yeSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gaW5jcmVhc2UgbVZhbGlkTGV2ZWwgYXMgd2UgZG9uJ3QgcHJvY2VzcyBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyB0aGlzIGxldmVsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1DdXJyZW50TGV2ZWwrKzsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLSAgICAgICAgICogamF2YS5sYW5nLlN0cmluZykKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1HYXRoZXJEYXRhID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgdGhlIGxldmVscy4KLSAgICAgICAgICAgICAgICBpZiAobVZhbGlkTGV2ZWwgPT0gbUN1cnJlbnRMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICBtVmFsaWRMZXZlbC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudExldmVsLS07Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBhIHZhbGlkIGxldmVsCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZW5kIG9mIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgaWYgKG1WYWxpZExldmVsID09IG1DdXJyZW50TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtVmFsaWRMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRVZFTF9BQ1RJVklUWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVWRUxfSU5URU5UX0ZJTFRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmb3VuZCBib3RoIGEgbWFpbiBhY3Rpb24gYW5kIGEgbGF1bmNoZXIgY2F0ZWdvcnksIHRoaXMgaXMgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF1bmNoZXIgYWN0aXZpdHkhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXVuY2hlckFjdGl2aXR5ID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWN0aXZpdHkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRBY3Rpdml0eS5pc0hvbWVBY3Rpdml0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2aXR5LmlzRXhwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGF1bmNoZXJBY3Rpdml0eSA9IG1DdXJyZW50QWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtTWFya0Vycm9ycykgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGUuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobU1hcmtFcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlLCBlLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobU1hcmtFcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53YXJuaW5nKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByb2Nlc3NlcyB0aGUgYWN0aXZpdHkgbm9kZS4KLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBhY3Rpdml0eSBub2RlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpdml0eU5vZGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICAvLyBsZXRzIGdldCB0aGUgYWN0aXZpdHkgbmFtZSwgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXMsIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBoYXNOYW1lc3BhY2UgKi8pOwotICAgICAgICAgICAgaWYgKGFjdGl2aXR5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gQW5kcm9pZE1hbmlmZXN0LmNvbWJpbmVQYWNrYWdlQW5kQ2xhc3NOYW1lKG1QYWNrYWdlLCBhY3Rpdml0eU5hbWUpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBleHBvcnRlZCBmbGFnLgotICAgICAgICAgICAgICAgIFN0cmluZyBleHBvcnRlZFN0ciA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX0VYUE9SVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cG9ydGVkID0gZXhwb3J0ZWRTdHIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRTdHIudG9Mb3dlckNhc2UoKS5lcXVhbHMoInRydWUiKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2aXR5ID0gbmV3IEFjdGl2aXR5KGFjdGl2aXR5TmFtZSwgZXhwb3J0ZWQpOwotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLmFkZChtQ3VycmVudEFjdGl2aXR5KTsKLQotICAgICAgICAgICAgICAgIGlmIChtTWFya0Vycm9ycykgewotICAgICAgICAgICAgICAgICAgICBjaGVja0NsYXNzKGFjdGl2aXR5TmFtZSwgQW5kcm9pZENvbnN0YW50cy5DTEFTU19BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHRlc3RWaXNpYmlsaXR5ICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vIGFjdGl2aXR5IGZvdW5kISBBYXB0IHdpbGwgb3V0cHV0IGFuIGVycm9yLAotICAgICAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKLSAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NOYW1lID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9QUk9DRVNTLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSAqLyk7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFByb2Nlc3NOYW1lKHByb2Nlc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIHNlcnZpY2UvcmVjZWl2ZXIvcHJvdmlkZXIgbm9kZXMuCi0gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgYWN0aXZpdHkgbm9kZS4KLSAgICAgICAgICogQHBhcmFtIHN1cGVyQ2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgdGhhdCB0aGlzCi0gICAgICAgICAqIG5vZGUgaXMgcmVwcmVzZW50aW5nCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05vZGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIC8vIGxldHMgZ2V0IHRoZSBjbGFzcyBuYW1lLCBhbmQgY2hlY2sgaXQgaWYgcmVxdWlyZWQuCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLCBBbmRyb2lkTWFuaWZlc3QuQVRUUklCVVRFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogaGFzTmFtZXNwYWNlICovKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBBbmRyb2lkTWFuaWZlc3QuY29tYmluZVBhY2thZ2VBbmRDbGFzc05hbWUobVBhY2thZ2UsIHNlcnZpY2VOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtTWFya0Vycm9ycykgewotICAgICAgICAgICAgICAgICAgICBjaGVja0NsYXNzKHNlcnZpY2VOYW1lLCBzdXBlckNsYXNzTmFtZSwgZmFsc2UgLyogdGVzdFZpc2liaWxpdHkgKi8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NOYW1lID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9QUk9DRVNTLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSAqLyk7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFByb2Nlc3NOYW1lKHByb2Nlc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBub2Rlcy4KLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBhY3Rpdml0eSBub2RlLgotICAgICAgICAgKiBub2RlIGlzIHJlcHJlc2VudGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnN0cnVtZW50YXRpb25Ob2RlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICAgICAgLy8gbGV0cyBnZXQgdGhlIGNsYXNzIG5hbWUsIGFuZCBjaGVjayBpdCBpZiByZXF1aXJlZC4KLSAgICAgICAgICAgIFN0cmluZyBpbnN0cnVtZW50YXRpb25OYW1lID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGhhc05hbWVzcGFjZSAqLyk7Ci0gICAgICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluc3RyQ2xhc3NOYW1lID0gQW5kcm9pZE1hbmlmZXN0LmNvbWJpbmVQYWNrYWdlQW5kQ2xhc3NOYW1lKG1QYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uTmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2UgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE1hbmlmZXN0LkFUVFJJQlVURV9UQVJHRVRfUEFDS0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaGFzTmFtZXNwYWNlICovKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9ucy5hZGQobmV3IEluc3RydW1lbnRhdGlvbihpbnN0ckNsYXNzTmFtZSwgdGFyZ2V0UGFja2FnZSkpOwotICAgICAgICAgICAgICAgIGlmIChtTWFya0Vycm9ycykgewotICAgICAgICAgICAgICAgICAgICBjaGVja0NsYXNzKGluc3RyQ2xhc3NOYW1lLCBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0lOU1RSVU1FTlRBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHRlc3RWaXNpYmlsaXR5ICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIHRoYXQgYSBjbGFzcyBpcyB2YWxpZCBhbmQgY2FuIGJlIHVzZWQgaW4gdGhlIEFuZHJvaWQgTWFuaWZlc3QuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogRXJyb3JzIGFyZSBwdXQgYXMge0BsaW5rIElNYXJrZXJ9IG9uIHRoZSBtYW5pZmVzdCBmaWxlLgotICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdGVzdC4KLSAgICAgICAgICogQHBhcmFtIHN1cGVyQ2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgaXQgaXMgc3VwcG9zZWQgdG8gZXh0ZW5kLgotICAgICAgICAgKiBAcGFyYW0gdGVzdFZpc2liaWxpdHkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBtZXRob2Qgd2lsbCBjaGVjayB0aGUgdmlzaWJpbGl0eSBvZgotICAgICAgICAgKiB0aGUgY2xhc3Mgb3Igb2YgaXRzIGNvbnN0cnVjdG9ycy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0NsYXNzKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSwgYm9vbGVhbiB0ZXN0VmlzaWJpbGl0eSkgewotICAgICAgICAgICAgaWYgKG1KYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGFjdGl2aXR5LgotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IEJhc2VQcm9qZWN0SGVscGVyLnRlc3RDbGFzc0Zvck1hbmlmZXN0KG1KYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLCBzdXBlckNsYXNzTmFtZSwgdGVzdFZpc2liaWxpdHkpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBCYXNlUHJvamVjdEhlbHBlci5URVNUX0NMQVNTX09LKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaW5lIG51bWJlcgotICAgICAgICAgICAgICAgIGludCBsaW5lID0gbUxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotCi0gICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZmlsZQotICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gQmFzZVByb2plY3RIZWxwZXIuYWRkTWFya2VyKGdldEZpbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX0FORFJPSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIGxpbmUsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGN1c3RvbSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgYnkgdGhlIG1hbmlmZXN0IGVkaXRvci4KLSAgICAgICAgICAgICAgICBpZiAobWFya2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQVRUUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BVFRSX1RZUEVfQUNUSVZJVFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9BVFRSX0NMQVNTLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSBhdHRyaWJ1dGVzIGxpc3QgZm9yIGEgcGFydGljdWxhciBvbmUgYW5kIHJldHVybnMgaXRzIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgYXR0cmlidXRlIGxpc3QgdG8gc2VhcmNoIHRocm91Z2gKLSAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBsb29rIGZvci4KLSAgICAgICAgICogQHBhcmFtIGhhc05hbWVzcGFjZSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXR0cmlidXRlIGhhcyBhbiBhbmRyb2lkIG5hbWVzcGFjZS4KLSAgICAgICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB2YWx1ZSBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBmb3VuZC4KLSAgICAgICAgICogQHNlZSBTZGtDb25zdGFudHMjTlNfUkVTT1VSQ0VTCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKGhhc05hbWVzcGFjZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLmVxdWFscyhhdHRyaWJ1dGVzLmdldFVSSShpKSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYXNOYW1lc3BhY2UgPT0gZmFsc2UgJiYgYXR0cmlidXRlcy5nZXRVUkkoaSkubGVuZ3RoKCkgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc05hbWUoU3RyaW5nIHByb2Nlc3NOYW1lKSB7Ci0gICAgICAgICAgICBpZiAobVByb2Nlc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByb2Nlc3NlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVByb2Nlc3Nlcy5hZGQocHJvY2Vzc05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBzUGFyc2VyRmFjdG9yeTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1KYXZhUGFja2FnZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5W10gbUFjdGl2aXRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eSBtTGF1bmNoZXJBY3Rpdml0eTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1Qcm9jZXNzZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCb29sZWFuIG1EZWJ1Z2dhYmxlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BcGlMZXZlbFJlcXVpcmVtZW50OwotICAgIHByaXZhdGUgZmluYWwgSW5zdHJ1bWVudGF0aW9uW10gbUluc3RydW1lbnRhdGlvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtTGlicmFyaWVzOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1BhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNQYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgQW5kcm9pZCBNYW5pZmVzdCwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgcGFyc2luZy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIHBhcnNlIGEgc3BlY2lmaWMge0BsaW5rIElGaWxlfSBpbiBhIEphdmEgcHJvamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgeW91IG9ubHkgd2FudCB0byBnYXRoZXIgZGF0YSwgY29uc2lkZXIge0BsaW5rICNwYXJzZUZvckRhdGEoSUZpbGUpfSBpbnN0ZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IFRoZSBqYXZhIHByb2plY3QuCi0gICAgICogQHBhcmFtIG1hbmlmZXN0RmlsZSB0aGUge0BsaW5rIElGaWxlfSByZXByZXNlbnRpbmcgdGhlIG1hbmlmZXN0IGZpbGUuCi0gICAgICogQHBhcmFtIGVycm9yTGlzdGVuZXIKLSAgICAgKiBAcGFyYW0gZ2F0aGVyRGF0YSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyc2luZyB3aWxsIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBtYW5pZmVzdC4KLSAgICAgKiBAcGFyYW0gbWFya0Vycm9ycyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZm91bmQgZHVyaW5nIHBhcnNpbmcgc2hvdWxkIHB1dCBhCi0gICAgICogbWFya2VyIG9uIHRoZSBmaWxlLiBGb3IgY2xhc3MgdmFsaWRhdGlvbiBlcnJvcnMgdG8gcHV0IGEgbWFya2VyLCA8Y29kZT5nYXRoZXJEYXRhPC9jb2RlPgotICAgICAqIG11c3QgYmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogQHJldHVybiBhbiB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfSBvciBudWxsIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBwYXJzZSgKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgSUZpbGUgbWFuaWZlc3RGaWxlLAotICAgICAgICAgICAgICAgIFhtbEVycm9yTGlzdGVuZXIgZXJyb3JMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBib29sZWFuIGdhdGhlckRhdGEsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBtYXJrRXJyb3JzKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IHNQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCi0gICAgICAgICAgICAgICAgTWFuaWZlc3RIYW5kbGVyIG1hbmlmZXN0SGFuZGxlciA9IG5ldyBNYW5pZmVzdEhhbmRsZXIobWFuaWZlc3RGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lciwgZ2F0aGVyRGF0YSwgamF2YVByb2plY3QsIG1hcmtFcnJvcnMpOwotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCkpLCBtYW5pZmVzdEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgaGFuZGxlcgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZE1hbmlmZXN0UGFyc2VyKG1hbmlmZXN0SGFuZGxlci5nZXRQYWNrYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0QWN0aXZpdGllcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RIYW5kbGVyLmdldExhdW5jaGVyQWN0aXZpdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRQcm9jZXNzZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXREZWJ1Z2dhYmxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RIYW5kbGVyLmdldEluc3RydW1lbnRhdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRVc2VzTGlicmFyaWVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIEFuZHJvaWRNYW5pZmVzdFBhcnNlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICJCYWQgcGFyc2VyIGNvbmZpZ3VyYXRpb24gZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5nZXRGdWxsUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nQW5kUHJpbnRFcnJvcihlLCBBbmRyb2lkTWFuaWZlc3RQYXJzZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAiUGFyc2VyIGV4Y2VwdGlvbiBmb3IgJXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmdldEZ1bGxQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIGEgY29uc29sZSBlcnJvciB3aGVuIGZhaWxpbmcgdG8gcmVhZCBhIG5vbi1leGlzdGluZyBmaWxlCi0gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIEFuZHJvaWRNYW5pZmVzdFBhcnNlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiSS9PIGVycm9yIGZvciAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmdldEZ1bGxQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIEFuZHJvaWQgTWFuaWZlc3QsIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIHBhcnNpbmcuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgdmVyc2lvbiBwYXJzZXMgYSByZWFsIHtAbGluayBGaWxlfSBmaWxlIGdpdmVuIGJ5IGFuIGFjdHVhbCBwYXRoLCB3aGljaCBpcyB1c2VmdWwgZm9yCi0gICAgICogcGFyc2luZyBhIGZpbGUgdGhhdCBpcyBub3QgcGFydCBvZiBhbiBFY2xpcHNlIEphdmEgcHJvamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogSXQgYXNzdW1lcyBlcnJvcnMgY2Fubm90IGJlIG1hcmtlZCBvbiB0aGUgZmlsZSBhbmQgdGhhdCBkYXRhIGdhdGhlcmluZyBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmlmZXN0RmlsZSB0aGUgbWFuaWZlc3QgZmlsZSB0byBwYXJzZS4KLSAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9IG9yIG51bGwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBwYXJzZShGaWxlIG1hbmlmZXN0RmlsZSkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBzUGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgICAgICAgTWFuaWZlc3RIYW5kbGVyIG1hbmlmZXN0SGFuZGxlciA9IG5ldyBNYW5pZmVzdEhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIC8vbWFuaWZlc3RGaWxlCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIC8vZXJyb3JMaXN0ZW5lcgotICAgICAgICAgICAgICAgICAgICB0cnVlLCAvL2dhdGhlckRhdGEKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy9qYXZhUHJvamVjdAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvL21hcmtFcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihtYW5pZmVzdEZpbGUpKSwgbWFuaWZlc3RIYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgaGFuZGxlcgotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRNYW5pZmVzdFBhcnNlcihtYW5pZmVzdEhhbmRsZXIuZ2V0UGFja2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0QWN0aXZpdGllcygpLAotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0TGF1bmNoZXJBY3Rpdml0eSgpLAotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0UHJvY2Vzc2VzKCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXREZWJ1Z2dhYmxlKCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRBcGlMZXZlbFJlcXVpcmVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRJbnN0cnVtZW50YXRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRVc2VzTGlicmFyaWVzKCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIEFuZHJvaWRNYW5pZmVzdFBhcnNlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICJCYWQgcGFyc2VyIGNvbmZpZ3VyYXRpb24gZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZ0FuZFByaW50RXJyb3IoZSwgQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlBhcnNlciBleGNlcHRpb24gZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBsb2cgYSBjb25zb2xlIGVycm9yIHdoZW4gZmFpbGluZyB0byByZWFkIGEgbm9uLWV4aXN0aW5nIGZpbGUKLSAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZ0FuZFByaW50RXJyb3IoZSwgQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJL08gZXJyb3IgZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIEFuZHJvaWQgTWFuaWZlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdCwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgcmVzdWx0IG9mIHRoZSBwYXJzaW5nLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgamF2YSBwcm9qZWN0LiBSZXF1aXJlZCBpZiA8dmFyPm1hcmtFcnJvcnM8L3Zhcj4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gZXJyb3JMaXN0ZW5lciB0aGUge0BsaW5rIFhtbEVycm9yTGlzdGVuZXJ9IG9iamVjdCBiZWluZyBub3RpZmllZCBvZiB0aGUgcHJlc2VuY2UKLSAgICAgKiBvZiBlcnJvcnMuIE9wdGlvbmFsLgotICAgICAqIEBwYXJhbSBnYXRoZXJEYXRhIGluZGljYXRlcyB3aGV0aGVyIHRoZSBwYXJzaW5nIHdpbGwgZXh0cmFjdCBkYXRhIGZyb20gdGhlIG1hbmlmZXN0LgotICAgICAqIEBwYXJhbSBtYXJrRXJyb3JzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciBmb3VuZCBkdXJpbmcgcGFyc2luZyBzaG91bGQgcHV0IGEKLSAgICAgKiBtYXJrZXIgb24gdGhlIGZpbGUuIEZvciBjbGFzcyB2YWxpZGF0aW9uIGVycm9ycyB0byBwdXQgYSBtYXJrZXIsIDxjb2RlPmdhdGhlckRhdGE8L2NvZGU+Ci0gICAgICogbXVzdCBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9IG9yIG51bGwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIHBhcnNlKAotICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICBYbWxFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBnYXRoZXJEYXRhLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFya0Vycm9ycykKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBnZXRNYW5pZmVzdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gc1BhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hbmlmZXN0SGFuZGxlciBtYW5pZmVzdEhhbmRsZXIgPSBuZXcgTWFuaWZlc3RIYW5kbGVyKG1hbmlmZXN0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdGVuZXIsIGdhdGhlckRhdGEsIGphdmFQcm9qZWN0LCBtYXJrRXJyb3JzKTsKLQotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCkpLCBtYW5pZmVzdEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgaGFuZGxlcgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZE1hbmlmZXN0UGFyc2VyKG1hbmlmZXN0SGFuZGxlci5nZXRQYWNrYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEhhbmRsZXIuZ2V0QWN0aXZpdGllcygpLCBtYW5pZmVzdEhhbmRsZXIuZ2V0TGF1bmNoZXJBY3Rpdml0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RIYW5kbGVyLmdldFByb2Nlc3NlcygpLCBtYW5pZmVzdEhhbmRsZXIuZ2V0RGVidWdnYWJsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RIYW5kbGVyLmdldEFwaUxldmVsUmVxdWlyZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0SGFuZGxlci5nZXRJbnN0cnVtZW50YXRpb25zKCksIG1hbmlmZXN0SGFuZGxlci5nZXRVc2VzTGlicmFyaWVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIEFuZHJvaWRNYW5pZmVzdFBhcnNlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICJCYWQgcGFyc2VyIGNvbmZpZ3VyYXRpb24gZm9yICVzIiwgbWFuaWZlc3RGaWxlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZ0FuZFByaW50RXJyb3IoZSwgQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlBhcnNlciBleGNlcHRpb24gZm9yICVzIiwgbWFuaWZlc3RGaWxlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nQW5kUHJpbnRFcnJvcihlLCBBbmRyb2lkTWFuaWZlc3RQYXJzZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAiSS9PIGVycm9yIGZvciAlcyIsIG1hbmlmZXN0RmlsZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgbWFuaWZlc3QgZmlsZSwgY29sbGVjdHMgZGF0YSwgYW5kIGNoZWNrcyBmb3IgZXJyb3JzLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgamF2YSBwcm9qZWN0LiBSZXF1aXJlZC4KLSAgICAgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIFRoZSBtYW5pZmVzdCBmaWxlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBlcnJvckxpc3RlbmVyIHRoZSB7QGxpbmsgWG1sRXJyb3JMaXN0ZW5lcn0gb2JqZWN0IGJlaW5nIG5vdGlmaWVkIG9mIHRoZSBwcmVzZW5jZQotICAgICAqIG9mIGVycm9ycy4gT3B0aW9uYWwuCi0gICAgICogQHJldHVybiBhbiB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfSBvciBudWxsIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBwYXJzZUZvckVycm9yKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUZpbGUgbWFuaWZlc3RGaWxlLAotICAgICAgICAgICAgWG1sRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZShqYXZhUHJvamVjdCwgbWFuaWZlc3RGaWxlLCBlcnJvckxpc3RlbmVyLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIG1hbmlmZXN0IGZpbGUsIGFuZCBjb2xsZWN0cyBkYXRhLgotICAgICAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgVGhlIG1hbmlmZXN0IGZpbGUgdG8gcGFyc2UuCi0gICAgICogQHJldHVybiBhbiB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfSBvciBudWxsIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gZm9yIGV4YW1wbGUgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBvcgotICAgICAqICAgICAgICAgdGhlIHdvcmtzcGFjZSBuZWVkcyB0byBiZSByZWZyZXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgcGFyc2VGb3JEYXRhKElGaWxlIG1hbmlmZXN0RmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGFyc2UobnVsbCAvKiBqYXZhUHJvamVjdCAqLywgbWFuaWZlc3RGaWxlLCBudWxsIC8qIGVycm9yTGlzdGVuZXIgKi8sCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBnYXRoZXJEYXRhICovLCBmYWxzZSAvKiBtYXJrRXJyb3JzICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIG1hbmlmZXN0IGZpbGUsIGFuZCBjb2xsZWN0cyBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIG9zTWFuaWZlc3RGaWxlUGF0aCBUaGUgT1MgcGF0aCBvZiB0aGUgbWFuaWZlc3QgZmlsZSB0byBwYXJzZS4KLSAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9IG9yIG51bGwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIHBhcnNlRm9yRGF0YShTdHJpbmcgb3NNYW5pZmVzdEZpbGVQYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2UobmV3IEZpbGUob3NNYW5pZmVzdEZpbGVQYXRoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWdub3JlIHdvcmtzcGFjZSBlcnJvcnMgKHVubGlrZWx5IHRvIGhhcHBlbiBzaW5jZSB0aGlzIHBhcnNlcyBhbiBhY3R1YWwgZmlsZSwKLSAgICAgICAgICAgIC8vIG5vdCBhIHdvcmtzcGFjZSByZXNvdXJjZSkuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2UgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIGlmIGZvdW5kLgotICAgICAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtSmF2YVBhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhY3Rpdml0aWVzIGZvdW5kIGluIHRoZSBtYW5pZmVzdC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBBY3Rpdml0eX0sIG9yIGVtcHR5IGlmIG5vIGFjdGl2aXR5IHdlcmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEFjdGl2aXR5W10gZ2V0QWN0aXZpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIG1BY3Rpdml0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2Ygb25lIGFjdGl2aXR5IGZvdW5kIGluIHRoZSBtYW5pZmVzdCwgdGhhdCBpcyBjb25maWd1cmVkIHRvIHNob3cKLSAgICAgKiB1cCBpbiB0aGUgSE9NRSBzY3JlZW4uCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIEFjdGl2aXR5fSByZXByZXNlbnRpbmcgYSBIT01FIGFjdGl2aXR5IG9yIG51bGwgaWYgbm9uZSB3ZXJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpdml0eSBnZXRMYXVuY2hlckFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbUxhdW5jaGVyQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm9jZXNzIG5hbWVzIGRlY2xhcmVkIGJ5IHRoZSBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvY2Vzc2VzKCkgewotICAgICAgICByZXR1cm4gbVByb2Nlc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWJ1Z2dhYmxlIGF0dHJpYnV0ZSB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3Qgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGdldERlYnVnZ2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBtRGVidWdnYWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5taW5TZGtWZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgaXQncyBub3Qgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1BcGlMZXZlbFJlcXVpcmVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgaW5zdHJ1bWVudGF0aW9ucyBmb3VuZCBpbiB0aGUgbWFuaWZlc3QuCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiB7QGxpbmsgSW5zdHJ1bWVudGF0aW9ufSwgb3IgZW1wdHkgaWYgbm8gaW5zdHJ1bWVudGF0aW9ucyB3ZXJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBJbnN0cnVtZW50YXRpb25bXSBnZXRJbnN0cnVtZW50YXRpb25zKCkgewotICAgICAgICByZXR1cm4gbUluc3RydW1lbnRhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgaW4gdXNlIGZvdW5kIGluIHRoZSBtYW5pZmVzdC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGxpYnJhcnkgbmFtZXMsIG9yIGVtcHR5IGlmIG5vIHVzZXMtbGlicmFyeSBkZWNsYXJhdGlvbnMgd2VyZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXNlc0xpYnJhcmllcygpIHsKLSAgICAgICAgcmV0dXJuIG1MaWJyYXJpZXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2UgdXNpbmcKLSAgICAgKiB7QGxpbmsgI3BhcnNlKElKYXZhUHJvamVjdCwgWG1sRXJyb3JMaXN0ZW5lciwgYm9vbGVhbiwgYm9vbGVhbil9LAotICAgICAqIHtAbGluayAjcGFyc2UoSUphdmFQcm9qZWN0LCBJRmlsZSwgWG1sRXJyb3JMaXN0ZW5lciwgYm9vbGVhbiwgYm9vbGVhbil9LAotICAgICAqIG9yIHtAbGluayAjcGFyc2VGb3JFcnJvcihJSmF2YVByb2plY3QsIElGaWxlLCBYbWxFcnJvckxpc3RlbmVyKX0gdG8gZ2V0IGFuCi0gICAgICoge0BsaW5rIEFuZHJvaWRNYW5pZmVzdFBhcnNlcn0gb2JqZWN0LgotICAgICAqIEBwYXJhbSBqYXZhUGFja2FnZSB0aGUgcGFja2FnZSBwYXJzZWQgZnJvbSB0aGUgbWFuaWZlc3QuCi0gICAgICogQHBhcmFtIGFjdGl2aXRpZXMgdGhlIGxpc3Qgb2YgYWN0aXZpdGllcyBwYXJzZWQgZnJvbSB0aGUgbWFuaWZlc3QuCi0gICAgICogQHBhcmFtIGxhdW5jaGVyQWN0aXZpdHkgdGhlIGxhdW5jaGVyIGFjdGl2aXR5IHBhcnNlciBmcm9tIHRoZSBtYW5pZmVzdC4KLSAgICAgKiBAcGFyYW0gcHJvY2Vzc2VzIHRoZSBsaXN0IG9mIGN1c3RvbSBwcm9jZXNzZXMgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0LgotICAgICAqIEBwYXJhbSBkZWJ1Z2dhYmxlIHRoZSBkZWJ1Z2dhYmxlIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiBub3Qgc2V0LgotICAgICAqIEBwYXJhbSBhcGlMZXZlbFJlcXVpcmVtZW50IHRoZSBtaW5TZGtWZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSBvciBudWxsIGlmIG5vdCBzZXQuCi0gICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbnMgdGhlIGxpc3Qgb2YgaW5zdHJ1bWVudGF0aW9ucyBwYXJzZWQgZnJvbSB0aGUgbWFuaWZlc3QuCi0gICAgICogQHBhcmFtIGxpYnJhcmllcyB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgaW4gdXNlIHBhcnNlZCBmcm9tIHRoZSBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFuZHJvaWRNYW5pZmVzdFBhcnNlcihTdHJpbmcgamF2YVBhY2thZ2UsIEFjdGl2aXR5W10gYWN0aXZpdGllcywKLSAgICAgICAgICAgIEFjdGl2aXR5IGxhdW5jaGVyQWN0aXZpdHksIFN0cmluZ1tdIHByb2Nlc3NlcywgQm9vbGVhbiBkZWJ1Z2dhYmxlLAotICAgICAgICAgICAgU3RyaW5nIGFwaUxldmVsUmVxdWlyZW1lbnQsIEluc3RydW1lbnRhdGlvbltdIGluc3RydW1lbnRhdGlvbnMsIFN0cmluZ1tdIGxpYnJhcmllcykgewotICAgICAgICBtSmF2YVBhY2thZ2UgPSBqYXZhUGFja2FnZTsKLSAgICAgICAgbUFjdGl2aXRpZXMgPSBhY3Rpdml0aWVzOwotICAgICAgICBtTGF1bmNoZXJBY3Rpdml0eSA9IGxhdW5jaGVyQWN0aXZpdHk7Ci0gICAgICAgIG1Qcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0gICAgICAgIG1EZWJ1Z2dhYmxlID0gZGVidWdnYWJsZTsKLSAgICAgICAgbUFwaUxldmVsUmVxdWlyZW1lbnQgPSBhcGlMZXZlbFJlcXVpcmVtZW50OwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9ucyA9IGluc3RydW1lbnRhdGlvbnM7Ci0gICAgICAgIG1MaWJyYXJpZXMgPSBsaWJyYXJpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmb3IgdGhlIHNwZWNpZmllZAotICAgICAqIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBtYW5pZmVzdCBmaWxlLgotICAgICAqIEByZXR1cm4gQW4gSUZpbGUgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBtYW5pZmVzdCBvciBudWxsIGlmIHRoZSBtYW5pZmVzdAotICAgICAqICAgICAgICAgaXMgbWlzc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldE1hbmlmZXN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSVJlc291cmNlIHIgPSBwcm9qZWN0LmZpbmRNZW1iZXIoQW5kcm9pZENvbnN0YW50cy5XU19TRVAKLSAgICAgICAgICAgICAgICArIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCk7Ci0KLSAgICAgICAgaWYgKHIgPT0gbnVsbCB8fCByLmV4aXN0cygpID09IGZhbHNlIHx8IChyIGluc3RhbmNlb2YgSUZpbGUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKElGaWxlKSByOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgZnVsbHkgcXVhbGlmaWVkIGFjdGl2aXR5IG5hbWUgKGUuZy4gY29tLmZvby50ZXN0Lk15Q2xhc3MpIGFuZCBnaXZlbiBhIHByb2plY3QKLSAgICAgKiBwYWNrYWdlIGJhc2UgbmFtZSAoZS5nLiBjb20uZm9vKSwgcmV0dXJucyB0aGUgcmVsYXRpdmUgYWN0aXZpdHkgbmFtZSB0aGF0IHdvdWxkIGJlIHVzZWQKLSAgICAgKiB0aGUgIm5hbWUiIGF0dHJpYnV0ZSBvZiBhbiAiYWN0aXZpdHkiIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnVsbEFjdGl2aXR5TmFtZSBhIGZ1bGx5IHF1YWxpZmllZCBhY3Rpdml0eSBjbGFzcyBuYW1lLCBlLmcuICJjb20uZm9vLnRlc3QuTXlDbGFzcyIKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIHByb2plY3QgYmFzZSBwYWNrYWdlIG5hbWUsIGUuZy4gImNvbS5mb28iCi0gICAgICogQHJldHVybiBUaGUgcmVsYXRpdmUgYWN0aXZpdHkgbmFtZSBpZiBpdCBjYW4gYmUgY29tcHV0ZWQgb3IgdGhlIG9yaWdpbmFsIGZ1bGxBY3Rpdml0eU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdEFjdGl2aXR5TmFtZShTdHJpbmcgZnVsbEFjdGl2aXR5TmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIGZ1bGxBY3Rpdml0eU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCAmJiBmdWxsQWN0aXZpdHlOYW1lLnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmdWxsQWN0aXZpdHlOYW1lLnN1YnN0cmluZyhwYWNrYWdlTmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAwICYmIG5hbWUuY2hhckF0KDApID09ICcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZnVsbEFjdGl2aXR5TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTmF0dXJlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDk3YWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvQW5kcm9pZE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYnVpbGQuQXBrQnVpbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYnVpbGQuUHJlQ29tcGlsZXJCdWlsZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5idWlsZC5SZXNvdXJjZU1hbmFnZXJCdWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIFByb2plY3QgbmF0dXJlIGZvciB0aGUgQW5kcm9pZCBQcm9qZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFuZHJvaWROYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSB7Ci0KLSAgICAvKiogdGhlIHByb2plY3QgdGhpcyBuYXR1cmUgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCAqLwotICAgIHByaXZhdGUgSVByb2plY3QgbVByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoaXMgbmF0dXJlIGZvciBpdHMgcHJvamVjdC4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHdvcmtzcGFjZQotICAgICAqIHdoZW4gbmF0dXJlcyBhcmUgYWRkZWQgdG8gdGhlIHByb2plY3QgdXNpbmcKLSAgICAgKiA8Y29kZT5JUHJvamVjdC5zZXREZXNjcmlwdGlvbjwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5Ci0gICAgICogYnkgY2xpZW50cy4gVGhlIG5hdHVyZSBleHRlbnNpb24gaWQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmF0dXJlcwotICAgICAqIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGFuZCBuZWVkIG5vdCBiZSBhZGRlZCBoZXJlLgotICAgICAqCi0gICAgICogRXhjZXB0aW9ucyB0aHJvd24gYnkgdGhpcyBtZXRob2Qgd2lsbCBiZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIGNhbGxlciBvZgotICAgICAqIDxjb2RlPklQcm9qZWN0LnNldERlc2NyaXB0aW9uPC9jb2RlPiwgYnV0IHRoZSBuYXR1cmUgd2lsbCByZW1haW4gaW4KLSAgICAgKiB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIFRoZSBBbmRyb2lkIG5hdHVyZSBhZGRzIHRoZSBwcmUtYnVpbGRlciBhbmQgdGhlIEFQSyBidWlsZGVyIGlmIG5lY2Vzc2FyeS4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjY29uZmlndXJlKCkKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgY29uZmlndXJhdGlvbiBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbmZpZ3VyZVJlc291cmNlTWFuYWdlckJ1aWxkZXIobVByb2plY3QpOwotICAgICAgICBjb25maWd1cmVQcmVCdWlsZGVyKG1Qcm9qZWN0KTsKLSAgICAgICAgY29uZmlndXJlQXBrQnVpbGRlcihtUHJvamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGUtY29uZmlndXJlcyB0aGlzIG5hdHVyZSBmb3IgaXRzIHByb2plY3QuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgICAqIHdvcmtzcGFjZSB3aGVuIG5hdHVyZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdCB1c2luZwotICAgICAqIDxjb2RlPklQcm9qZWN0LnNldERlc2NyaXB0aW9uPC9jb2RlPiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkKLSAgICAgKiBieSBjbGllbnRzLiBUaGUgbmF0dXJlIGV4dGVuc2lvbiBpZCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgbmF0dXJlcwotICAgICAqIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGFuZCBuZWVkIG5vdCBiZSByZW1vdmVkIGhlcmUuCi0gICAgICoKLSAgICAgKiBFeGNlcHRpb25zIHRocm93biBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgY2FsbGVyIG9mCi0gICAgICogPGNvZGU+SVByb2plY3Quc2V0RGVzY3JpcHRpb248L2NvZGU+LCBidXQgdGhlIG5hdHVyZSB3aWxsIHN0aWxsIGJlCi0gICAgICogcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uLgotICAgICAqCi0gICAgICogVGhlIEFuZHJvaWQgbmF0dXJlIHJlbW92ZXMgdGhlIGN1c3RvbSBwcmUgYnVpbGRlciBhbmQgQVBLIGJ1aWxkZXIuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI2RlY29uZmlndXJlKCkKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgY29uZmlndXJhdGlvbiBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBhbmRyb2lkIGJ1aWxkZXJzCi0gICAgICAgIHJlbW92ZUJ1aWxkZXIobVByb2plY3QsIFJlc291cmNlTWFuYWdlckJ1aWxkZXIuSUQpOwotICAgICAgICByZW1vdmVCdWlsZGVyKG1Qcm9qZWN0LCBQcmVDb21waWxlckJ1aWxkZXIuSUQpOwotICAgICAgICByZW1vdmVCdWlsZGVyKG1Qcm9qZWN0LCBBcGtCdWlsZGVyLklEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgcHJvamVjdCBuYXR1cmUgYXBwbGllcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNnZXRQcm9qZWN0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9qZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcy4gVXNlZCB3aGVuIGluc3RhbnRpYXRpbmcKLSAgICAgKiB0aGlzIHByb2plY3QgbmF0dXJlIHJ1bnRpbWUuIFRoaXMgaXMgY2FsbGVkIGJ5Ci0gICAgICogPGNvZGU+SVByb2plY3QuY3JlYXRlKCk8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+SVByb2plY3Quc2V0RGVzY3JpcHRpb24oKTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkCi0gICAgICogZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI3NldFByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBBbmRyb2lkIE5hdHVyZSBhbmQgdGhlIEphdmEgTmF0dXJlIHRvIHRoZSBwcm9qZWN0IGlmIGl0IGRvZXNuJ3QKLSAgICAgKiBhbHJlYWR5IGhhdmUgdGhlbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IEFuIGV4aXN0aW5nIG9yIG5ldyBwcm9qZWN0IHRvIHVwZGF0ZQotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIG9wdGlvbmFsIHByb2dyZXNzIG1vbml0b3IuIENhbiBiZSBudWxsLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlscyB0byBjaGFuZ2UgdGhlIG5hdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldHVwUHJvamVjdE5hdHVyZXMoSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzT3BlbigpKSByZXR1cm47Ci0gICAgICAgIGlmIChtb25pdG9yID09IG51bGwpIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgbmF0dXJlcy4gV2UgbmVlZCB0byBhZGQgdGhlIEphdmEgbmF0dXJlIGZpcnN0LCBzbyBpdCBhZGRzIGl0cyBidWlsZGVyIHRvIHRoZQotICAgICAgICAvLyBwcm9qZWN0IGZpcnN0LiBUaGlzIHdheSwgd2hlbiB0aGUgYW5kcm9pZCBuYXR1cmUgaXMgYWRkZWQsIHdlIGNhbiBjb250cm9sIHdoZXJlIHRvIHB1dAotICAgICAgICAvLyB0aGUgYW5kcm9pZCBidWlsZGVycyBpbiByZWxhdGlvbiB0byB0aGUgamF2YSBidWlsZGVyLgotICAgICAgICAvLyBBZGRpbmcgdGhlIGphdmEgbmF0dXJlIGFmdGVyIHRoZSBhbmRyb2lkIG9uZSwgd291bGQgcGxhY2UgdGhlIGphdmEgYnVpbGRlciBiZWZvcmUgdGhlCi0gICAgICAgIC8vIGFuZHJvaWQgYnVpbGRlcnMuCi0gICAgICAgIGFkZE5hdHVyZVRvUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCwgbW9uaXRvcik7Ci0gICAgICAgIGFkZE5hdHVyZVRvUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QsIEFuZHJvaWRDb25zdGFudHMuTkFUVVJFLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBuYXR1cmUgdG8gdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBUaGUgbmF0dXJlIGlzIG9ubHkKLSAgICAgKiBhZGRlZCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBBbmRyb2lkIE5hdHVyZXMgYXJlIGFsd2F5cyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9mIG5hdHVyZXMgaW4gb3JkZXIgdG8KLSAgICAgKiBoYXZlIHRoZSBqZHQgdmlld3MvZGlhbG9ncyBkaXNwbGF5IHRoZSBwcm9wZXIgaWNvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIG1vZGlmeS4KLSAgICAgKiBAcGFyYW0gbmF0dXJlSWQgVGhlIElkIG9mIHRoZSBuYXR1cmUgdG8gYWRkLgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIHByb2dyZXNzIG1vbml0b3IuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxzIHRvIGNoYW5nZSB0aGUgbmF0dXJlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBuYXR1cmVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvamVjdC5oYXNOYXR1cmUobmF0dXJlSWQpKSB7Ci0KLSAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuYXR1cmVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbmRyb2lkIG5hdHVyZXMgYWx3YXlzIGNvbWUgZmlyc3QuCi0gICAgICAgICAgICBpZiAobmF0dXJlSWQuZXF1YWxzKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgbmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBuYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbmV3TmF0dXJlc1tuYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgUmVzb3VyY2VNYW5hZ2VyQnVpbGRlciwgaWYgaXRzIG5vdCBhbHJlYWR5IHRoZXJlLiBJdCdsbCBpbnNlcnQKLSAgICAgKiBpdHNlbGYgYXMgdGhlIGZpcnN0IGJ1aWxkZXIuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlUmVzb3VyY2VNYW5hZ2VyQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBnZXQgdGhlIGJ1aWxkZXIgbGlzdAotICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIElDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjLmdldEJ1aWxkU3BlYygpOwotCi0gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBidWlsZGVyIGluIGNhc2UgaXQncyBhbHJlYWR5IHRoZXJlLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoUmVzb3VyY2VNYW5hZ2VyQnVpbGRlci5JRC5lcXVhbHMoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpdCdzIG5vdCB0aGVyZSwgbGV0cyBhZGQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVpbGRlcnMKLSAgICAgICAgSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggKyAxXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDEsIGNvbW1hbmRzLmxlbmd0aCk7Ci0gICAgICAgIElDb21tYW5kIGNvbW1hbmQgPSBkZXNjLm5ld0NvbW1hbmQoKTsKLSAgICAgICAgY29tbWFuZC5zZXRCdWlsZGVyTmFtZShSZXNvdXJjZU1hbmFnZXJCdWlsZGVyLklEKTsKLSAgICAgICAgbmV3Q29tbWFuZHNbMF0gPSBjb21tYW5kOwotICAgICAgICBkZXNjLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0gICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgUHJlQ29tcGlsZXJCdWlsZGVyIGlmIGl0cyBub3QgYWxyZWFkeSB0aGVyZS4gSXQnbGwgY2hlY2sgZm9yCi0gICAgICogcHJlc2VuY2Ugb2YgdGhlIFJlc291cmNlTWFuYWdlciBhbmQgaW5zZXJ0IGl0c2VsZiByaWdodCBhZnRlci4KLSAgICAgKiBAcGFyYW0gcHJvamVjdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVQcmVCdWlsZGVyKElQcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdldCB0aGUgYnVpbGRlciBsaXN0Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2MuZ2V0QnVpbGRTcGVjKCk7Ci0KLSAgICAgICAgLy8gbG9vayBmb3IgdGhlIGJ1aWxkZXIgaW4gY2FzZSBpdCdzIGFscmVhZHkgdGhlcmUuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChQcmVDb21waWxlckJ1aWxkZXIuSUQuZXF1YWxzKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgaXQgYWZ0ZXIgdGhlIHJlc291cmNlIG1hbmFnZXIgYnVpbGRlci4KLSAgICAgICAgLy8gTGV0J3MgbG9vayBmb3IgaXQKLSAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChSZXNvdXJjZU1hbmFnZXJCdWlsZGVyLklELmVxdWFscyhjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlJ3JlIGluc2VydGluZyBhZnRlcgotICAgICAgICBpbmRleCsrOwotCi0gICAgICAgIC8vIGRvIHRoZSBpbnNlcnRpb24KLQotICAgICAgICAvLyBjb3B5IHRoZSBidWlsZGVycyBiZWZvcmUuCi0gICAgICAgIElDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAwLCBpbmRleCk7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IHRoZSBuZXcgYnVpbGRlcgotICAgICAgICBJQ29tbWFuZCBjb21tYW5kID0gZGVzYy5uZXdDb21tYW5kKCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0QnVpbGRlck5hbWUoUHJlQ29tcGlsZXJCdWlsZGVyLklEKTsKLSAgICAgICAgbmV3Q29tbWFuZHNbaW5kZXhdID0gY29tbWFuZDsKLQotICAgICAgICAvLyBjb3B5IHRoZSBidWlsZGVyIGFmdGVyCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tbWFuZHMsIGluZGV4LCBuZXdDb21tYW5kcywgaW5kZXggKyAxLCBjb21tYW5kcy5sZW5ndGgtaW5kZXgpOwotCi0gICAgICAgIC8vIHNldCB0aGUgbmV3IGJ1aWxkZXJzIGluIHRoZSBwcm9qZWN0Ci0gICAgICAgIGRlc2Muc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLSAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQXBrQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBBZGQgdGhlIC5hcGsgYnVpbGRlciBhdCB0aGUgZW5kIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKLSAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzYy5nZXRCdWlsZFNwZWMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoQXBrQnVpbGRlci5JRC5lcXVhbHMoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW2NvbW1hbmRzLmxlbmd0aCArIDFdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbW1hbmRzLCAwLCBuZXdDb21tYW5kcywgMCwgY29tbWFuZHMubGVuZ3RoKTsKLSAgICAgICAgSUNvbW1hbmQgY29tbWFuZCA9IGRlc2MubmV3Q29tbWFuZCgpOwotICAgICAgICBjb21tYW5kLnNldEJ1aWxkZXJOYW1lKEFwa0J1aWxkZXIuSUQpOwotICAgICAgICBuZXdDb21tYW5kc1tjb21tYW5kcy5sZW5ndGhdID0gY29tbWFuZDsKLSAgICAgICAgZGVzYy5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBidWlsZGVyIGZyb20gdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gcmVtb3ZlIHRoZSBidWlsZGVyIGZyb20uCi0gICAgICogQHBhcmFtIGlkIFRoZSBTdHJpbmcgSUQgb2YgdGhlIGJ1aWxkZXIgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYnVpbGRlciB3YXMgZm91bmQgYW5kIHJlbW92ZWQuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUJ1aWxkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIElDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIGkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tbWFuZHMsIGkgKyAxLCBuZXdDb21tYW5kcywgaSwgY29tbWFuZHMubGVuZ3RoIC0gaSAtIDEpOwotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvQXBrSW5zdGFsbE1hbmFnZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0Fwa0luc3RhbGxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTU2YzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvQXBrSW5zdGFsbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklEZWJ1Z0JyaWRnZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JUHJvamVjdExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlZ2lzdGVycyB3aGljaCBhcGsgd2FzIGluc3RhbGxlZCBvbiB3aGljaCBkZXZpY2UuCi0gKiA8cC8+Ci0gKiBUaGUgZ29hbCBvZiB0aGlzIGNsYXNzIGlzIHRvIHJlbWVtYmVyIHRoZSBpbnN0YWxsYXRpb24gb2YgQVBLcyBvbiBkZXZpY2VzLCBhbmQgcHJvdmlkZQotICogaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBhIG5ldyBBUEsgc2hvdWxkIGJlIGluc3RhbGxlZCBvbiBhIGRldmljZSBwcmlvciB0byBydW5uaW5nIHRoZQotICogYXBwbGljYXRpb24gZnJvbSBhIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICogPHAvPgotICogVGhlIG1hbmFnZXIgdXNlcyB7QGxpbmsgSVByb2plY3R9IGFuZCB7QGxpbmsgSURldmljZX0gdG8gaWRlbnRpZnkgdGhlIHRhcmdldCBkZXZpY2UgYW5kIHRoZQotICogKHByb2plY3QgZ2VuZXJhdGluZyB0aGUpIEFQSy4gVGhpcyBlbnN1cmVzIHRoYXQgZGlzY29ubmVjdGVkIGFuZCByZWNvbm5lY3RlZCBkZXZpY2VzIHdpbGwKLSAqIGFsd2F5cyByZWNlaXZlIG5ldyBBUEtzIChzaW5jZSB0aGUgQVBLIGNvdWxkIGJlIHVuaW5zdGFsbGVkIG1hbnVhbGx5KS4KLSAqIDxwLz4KLSAqIE1hbnVhbGx5IHVuaW5zdGFsbGluZyBhbiBBUEsgZnJvbSBhIGNvbm5lY3RlZCBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBhIHByb2JsZW0sIGJ1dCB0aGlzIHNob3VsZAotICogYmUgYSBsaW1pdGVkIHVzZSBjYXNlLgotICogPHAvPgotICogVGhpcyBpcyBhIHNpbmdsZXRvbi4gVG8gZ2V0IHRoZSBpbnN0YW5jZSwgdXNlIHtAbGluayAjZ2V0SW5zdGFuY2UoKX0KLSAqLwotcHVibGljIGNsYXNzIEFwa0luc3RhbGxNYW5hZ2VyIGltcGxlbWVudHMgSURldmljZUNoYW5nZUxpc3RlbmVyLCBJRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgSVByb2plY3RMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBcGtJbnN0YWxsTWFuYWdlciBzVGhpcyA9IG5ldyBBcGtJbnN0YWxsTWFuYWdlcigpOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgc3RydWN0IHRvIGFzc29jaWF0ZSBhIHByb2plY3QgYW5kIGEgZGV2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwa0luc3RhbGwgewotICAgICAgICBwdWJsaWMgQXBrSW5zdGFsbChJUHJvamVjdCBwcm9qZWN0LCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlOwotICAgICAgICB9Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgICAgIElEZXZpY2UgZGV2aWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFwa0luc3RhbGw+IG1JbnN0YWxsTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXBrSW5zdGFsbD4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgQXBrSW5zdGFsbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYW4gaW5zdGFsbGF0aW9uIG9mIDx2YXI+cHJvamVjdDwvdmFyPiBvbnRvIDx2YXI+ZGV2aWNlPC92YXI+Ci0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdGhhdCB3YXMgaW5zdGFsbGVkLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBpbnN0YWxsYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJJbnN0YWxsYXRpb24oSVByb2plY3QgcHJvamVjdCwgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtSW5zdGFsbExpc3QpIHsKLSAgICAgICAgICAgIG1JbnN0YWxsTGlzdC5hZGQobmV3IEFwa0luc3RhbGwocHJvamVjdCwgZGV2aWNlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSA8dmFyPnByb2plY3Q8L3Zhcj4gd2FzIGluc3RhbGxlZCBvbiB0aGUgPHZhcj5kZXZpY2U8L3Zhcj4uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBtYXkgaGF2ZSBiZWVuIGluc3RhbGxlZC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2UgdGhhdCBtYXkgaGF2ZSByZWNlaXZlZCB0aGUgaW5zdGFsbGF0aW9uLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5zdGFsbGVkKElQcm9qZWN0IHByb2plY3QsIElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUluc3RhbGxMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKEFwa0luc3RhbGwgaW5zdGFsbCA6IG1JbnN0YWxsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ID09IGluc3RhbGwucHJvamVjdCAmJiBkZXZpY2UgPT0gaW5zdGFsbC5kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgcmVnaXN0ZXJlZCBpbnN0YWxsYXRpb25zIGZvciBhIHNwZWNpZmljIHtAbGluayBJUHJvamVjdH0uCi0gICAgICogPHAvPlRoaXMgZW5zdXJlcyB0aGF0IHtAbGluayAjaXNBcHBsaWNhdGlvbkluc3RhbGxlZChJUHJvamVjdCwgSURldmljZSl9IHdpbGwgYWx3YXlzIHJldHVybgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0aGlzIHNwZWNpZmllZCBwcm9qZWN0LCBmb3IgYW55IGRldmljZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBmb3Igd2hpY2ggdG8gcmVzZXQgYWxsIGluc3RhbGxhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRJbnN0YWxsYXRpb25Gb3IoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnN0YWxsTGlzdCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbUluc3RhbGxMaXN0LnNpemUoKSA7KSB7Ci0gICAgICAgICAgICAgICAgQXBrSW5zdGFsbCBpbnN0YWxsID0gbUluc3RhbGxMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbC5wcm9qZWN0ID09IHByb2plY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbGxMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcGtJbnN0YWxsTWFuYWdlcigpIHsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLmFkZERldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuYWRkRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgUmVzb3VyY2VNb25pdG9yLmdldE1vbml0b3IoKS5hZGRQcm9qZWN0TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXNwb25kcyB0byBhIGJyaWRnZSBjaGFuZ2UgYnkgY2xlYXJpbmcgdGhlIGZ1bGwgaW5zdGFsbGF0aW9uIGxpc3QuCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JRGVidWdCcmlkZ2VDaGFuZ2VMaXN0ZW5lciNicmlkZ2VDaGFuZ2VkKGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnJpZGdlQ2hhbmdlZChBbmRyb2lkRGVidWdCcmlkZ2UgYnJpZGdlKSB7Ci0gICAgICAgIC8vIHRoZSBicmlkZ2UgY2hhbmdlZCwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hpY2ggSURldmljZSB3aWxsIGJlIHdoaWNoLgotICAgICAgICAvLyBXZSByZXNldCBldmVyeXRoaW5nCi0gICAgICAgIHN5bmNocm9uaXplZCAobUluc3RhbGxMaXN0KSB7Ci0gICAgICAgICAgICBtSW5zdGFsbExpc3QuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzcG9uZHMgdG8gYSBkZXZpY2UgYmVpbmcgZGlzY29ubmVjdGVkIGJ5IHJlbW92aW5nIGFsbCBpbnN0YWxsYXRpb25zIHJlbGF0ZWQgdG8gdGhpcyBkZXZpY2UuCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JRGV2aWNlQ2hhbmdlTGlzdGVuZXIjZGV2aWNlRGlzY29ubmVjdGVkKGNvbS5hbmRyb2lkLmRkbWxpYi5EZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV2aWNlRGlzY29ubmVjdGVkKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUluc3RhbGxMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtSW5zdGFsbExpc3Quc2l6ZSgpIDspIHsKLSAgICAgICAgICAgICAgICBBcGtJbnN0YWxsIGluc3RhbGwgPSBtSW5zdGFsbExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsLmRldmljZSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbGxMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXNwb25kcyB0byBhIGNsb3NlIHByb2plY3QgYnkgcmVzZXR0aW5nIGFsbCBpdHMgaW5zdGFsbGF0aW9uLgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklQcm9qZWN0TGlzdGVuZXIjcHJvamVjdENsb3NlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0Q2xvc2VkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgcmVzZXRJbnN0YWxsYXRpb25Gb3IocHJvamVjdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXNwb25kcyB0byBhIGNsb3NlIHByb2plY3QgYnkgcmVzZXR0aW5nIGFsbCBpdHMgaW5zdGFsbGF0aW9uLgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklQcm9qZWN0TGlzdGVuZXIjcHJvamVjdERlbGV0ZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvamVjdERlbGV0ZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXNldEluc3RhbGxhdGlvbkZvcihwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERvZXMgbm90aGluZwotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyI2RldmljZUNoYW5nZWQoY29tLmFuZHJvaWQuZGRtbGliLkRldmljZSwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldmljZUNoYW5nZWQoSURldmljZSBkZXZpY2UsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEb2VzIG5vdGhpbmcKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5kZG1saWIuQW5kcm9pZERlYnVnQnJpZGdlLklEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDb25uZWN0ZWQoY29tLmFuZHJvaWQuZGRtbGliLkRldmljZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VDb25uZWN0ZWQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkby4KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERvZXMgbm90aGluZwotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklQcm9qZWN0TGlzdGVuZXIjcHJvamVjdE9wZW5lZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0T3BlbmVkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkby4KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERvZXMgbm90aGluZwotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklQcm9qZWN0TGlzdGVuZXIjcHJvamVjdE9wZW5lZFdpdGhXb3Jrc3BhY2Uob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvamVjdE9wZW5lZFdpdGhXb3Jrc3BhY2UoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0Jhc2VQcm9qZWN0SGVscGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9CYXNlUHJvamVjdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZjZDA0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0Jhc2VQcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuWG1sRXJyb3JIYW5kbGVyLlhtbEVycm9yTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuT3BlbkphdmFQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBwcm9qZWN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJhc2VQcm9qZWN0SGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NfT0sgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyBhIGxpc3Qgb2Ygc291cmNlIGNsYXNzcGF0aCBmb3IgYSBzcGVjaWZpZWQgcHJvamVjdAotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PElQYXRoPiBnZXRTb3VyY2VDbGFzc3BhdGhzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICBBcnJheUxpc3Q8SVBhdGg+IHNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhzID0gamF2YVByb2plY3QucmVhZFJhd0NsYXNzcGF0aCgpOwotICAgICAgICBpZiAoY2xhc3NwYXRocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlIDogY2xhc3NwYXRocykgewotICAgICAgICAgICAgICAgIGlmIChlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkKGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvdXJjZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1hcmtlciB0byBhIGZpbGUgb24gYSBzcGVjaWZpYyBsaW5lLiBUaGlzIG1ldGhvZHMgY2F0Y2hlcyB0aHJvd24KLSAgICAgKiB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0sIGFuZCByZXR1cm5zIG51bGwgaW5zdGVhZC4KLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBtYXJrZWQKLSAgICAgKiBAcGFyYW0gbWFya2VySWQgVGhlIGlkIG9mIHRoZSBtYXJrZXIgdG8gYWRkLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFyawotICAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0byBwdXQgdGhlIG1hcmsuIElmIGxpbmUgaXMgPCAxLCBpdCBwdXRzIHRoZSBtYXJrZXIKLSAgICAgKiBvbiBsaW5lIDEuCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSBvZiB0aGUgbWFya2VyLgotICAgICAqIEByZXR1cm4gdGhlIElNYXJrZXIgdGhhdCB3YXMgYWRkZWQgb3IgbnVsbCBpZiBpdCBmYWlsZWQgdG8gYWRkIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIElNYXJrZXIgYWRkTWFya2VyKElSZXNvdXJjZSBmaWxlLCBTdHJpbmcgbWFya2VySWQsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBzZXZlcml0eSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBmaWxlLmNyZWF0ZU1hcmtlcihtYXJrZXJJZCk7Ci0gICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5KTsKLSAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyIDwgMSkgewotICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCBsaW5lTnVtYmVyKTsKLQotICAgICAgICAgICAgLy8gb24gV2luZG93cywgd2hlbiBhZGRpbmcgYSBtYXJrZXIgdG8gYSBwcm9qZWN0LCBpdCB0YWtlcyBhIHJlZnJlc2ggZm9yIHRoZSBtYXJrZXIKLSAgICAgICAgICAgIC8vIHRvIHNob3cuIEluIG9yZGVyIHRvIGZpeCB0aGlzIHdlJ3JlIGZvcmNpbmcgYSByZWZyZXNoIG9mIGVsZW1lbnRzIHJlY2VpdmluZwotICAgICAgICAgICAgLy8gbWFya2VycyAoYW5kIG9ubHkgdGhlIGVsZW1lbnQsIG5vdCBpdHMgY2hpbGRyZW4pLCB0byBmb3JjZSB0aGUgbWFya2VyIGRpc3BsYXkuCi0gICAgICAgICAgICBmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXJrZXI7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRmFpbGVkIHRvIGFkZCBtYXJrZXIgJyUxJHMnIHRvICclMiRzJyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbWFya2VySWQsIGZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBtYXJrZXIgdG8gYSByZXNvdXJjZS4gVGhpcyBtZXRob2RzIGNhdGNoZXMgdGhyb3duIHtAbGluayBDb3JlRXhjZXB0aW9ufSwKLSAgICAgKiBhbmQgcmV0dXJucyBudWxsIGluc3RlYWQuCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBmaWxlIHRvIGJlIG1hcmtlZAotICAgICAqIEBwYXJhbSBtYXJrZXJJZCBUaGUgaWQgb2YgdGhlIG1hcmtlciB0byBhZGQuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXJrCi0gICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSBvZiB0aGUgbWFya2VyLgotICAgICAqIEByZXR1cm4gdGhlIElNYXJrZXIgdGhhdCB3YXMgYWRkZWQgb3IgbnVsbCBpZiBpdCBmYWlsZWQgdG8gYWRkIG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIElNYXJrZXIgYWRkTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1hcmtlcklkLAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIobWFya2VySWQpOwotICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIG1lc3NhZ2UpOwotICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBzZXZlcml0eSk7Ci0KLSAgICAgICAgICAgIC8vIG9uIFdpbmRvd3MsIHdoZW4gYWRkaW5nIGEgbWFya2VyIHRvIGEgcHJvamVjdCwgaXQgdGFrZXMgYSByZWZyZXNoIGZvciB0aGUgbWFya2VyCi0gICAgICAgICAgICAvLyB0byBzaG93LiBJbiBvcmRlciB0byBmaXggdGhpcyB3ZSdyZSBmb3JjaW5nIGEgcmVmcmVzaCBvZiBlbGVtZW50cyByZWNlaXZpbmcKLSAgICAgICAgICAgIC8vIG1hcmtlcnMgKGFuZCBvbmx5IHRoZSBlbGVtZW50LCBub3QgaXRzIGNoaWxkcmVuKSwgdG8gZm9yY2UgdGhlIG1hcmtlciBkaXNwbGF5LgotICAgICAgICAgICAgcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIG1hcmtlcjsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJGYWlsZWQgdG8gYWRkIG1hcmtlciAnJTEkcycgdG8gJyUyJHMnIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBtYXJrZXJJZCwgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBtYXJrZXIgdG8gYSByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2F0Y2gge0BsaW5rIENvcmVFeGNlcHRpb259IGFuZCBpbnN0ZWFkCi0gICAgICogdGhyb3cgdGhlbS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIGZpbGUgdG8gYmUgbWFya2VkCi0gICAgICogQHBhcmFtIG1hcmtlcklkIFRoZSBpZCBvZiB0aGUgbWFya2VyIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1hcmsKLSAgICAgKiBAcGFyYW0gbGluZU51bWJlciB0aGUgbGluZSBudW1iZXIgd2hlcmUgdG8gcHV0IHRoZSBtYXJrIGlmICE9IC0xLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1hcmtlci4KLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IG9mIHRoZSBtYXJrZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBJTWFya2VyIHRoYXQgd2FzIGFkZGVkLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIElNYXJrZXIgYWRkTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1hcmtlcklkLAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgc2V2ZXJpdHksIGludCBwcmlvcml0eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihtYXJrZXJJZCk7Ci0gICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKLSAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBzZXZlcml0eSk7Ci0gICAgICAgIGlmIChsaW5lTnVtYmVyICE9IC0xKSB7Ci0gICAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGxpbmVOdW1iZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgcHJpb3JpdHkpOwotCi0gICAgICAgIC8vIG9uIFdpbmRvd3MsIHdoZW4gYWRkaW5nIGEgbWFya2VyIHRvIGEgcHJvamVjdCwgaXQgdGFrZXMgYSByZWZyZXNoIGZvciB0aGUgbWFya2VyCi0gICAgICAgIC8vIHRvIHNob3cuIEluIG9yZGVyIHRvIGZpeCB0aGlzIHdlJ3JlIGZvcmNpbmcgYSByZWZyZXNoIG9mIGVsZW1lbnRzIHJlY2VpdmluZwotICAgICAgICAvLyBtYXJrZXJzIChhbmQgb25seSB0aGUgZWxlbWVudCwgbm90IGl0cyBjaGlsZHJlbiksIHRvIGZvcmNlIHRoZSBtYXJrZXIgZGlzcGxheS4KLSAgICAgICAgcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYSBjbGFzcyBuYW1lIGlzIHZhbGlkIGZvciB1c2FnZSBpbiB0aGUgbWFuaWZlc3QuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgdGVzdHMgdGhlIGNsYXNzIGV4aXN0ZW5jZSwgdGhhdCBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIChpZSBpdCBtdXN0IG5vdCBiZSBhYnN0cmFjdCwKLSAgICAgKiBub3Igbm9uIHN0YXRpYyBpZiBlbmNsb3NlZCksIGFuZCB0aGF0IGl0IGV4dGVuZHMgdGhlIHByb3BlciBzdXBlciBjbGFzcyAobm90IG5lY2Vzc2FyaWx5Ci0gICAgICogZGlyZWN0bHkpCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSBjb250YWluaW5nIHRoZSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdGVzdC4KLSAgICAgKiBAcGFyYW0gc3VwZXJDbGFzc05hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBleHBlY3RlZCBzdXBlciBjbGFzcy4KLSAgICAgKiBAcGFyYW0gdGVzdFZpc2liaWxpdHkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBtZXRob2Qgd2lsbCBjaGVjayB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY2xhc3MKLSAgICAgKiBvciBvZiBpdHMgY29uc3RydWN0b3JzLgotICAgICAqIEByZXR1cm4ge0BsaW5rICNURVNUX0NMQVNTX09LfSBvciBhbiBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHRlc3RDbGFzc0Zvck1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBzdXBlckNsYXNzTmFtZSwgYm9vbGVhbiB0ZXN0VmlzaWJpbGl0eSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcmVwbGFjZSAkIGJ5IC4KLSAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2VBbGwoIlxcJCIsICJcXC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBJVHlwZSBvYmplY3QgZm9yIHRoaXMgY2xhc3MKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShqYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIHRlc3QgdGhhdCB0aGUgY2xhc3MgaXMgbm90IGFic3RyYWN0Ci0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdHlwZS5nZXRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmIChGbGFncy5pc0Fic3RyYWN0KGZsYWdzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyBpcyBhYnN0cmFjdCIsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRlc3Qgd2hldGhlciB0aGUgY2xhc3MgaXMgcHVibGljIG9yIG5vdC4KLSAgICAgICAgICAgICAgICBpZiAodGVzdFZpc2liaWxpdHkgJiYgRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0cyBub3QgcHVibGljLCBpdCBtYXkgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLAotICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3b3VsZCB0aGVuIGJlIGZpbmUuCi0gICAgICAgICAgICAgICAgICAgIElNZXRob2QgYmFzaWNDb25zdHJ1Y3RvciA9IHR5cGUuZ2V0TWV0aG9kKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNpY0NvbnN0cnVjdG9yICE9IG51bGwgJiYgYmFzaWNDb25zdHJ1Y3Rvci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0cnVjdEZsYWdzID0gYmFzaWNDb25zdHJ1Y3Rvci5nZXRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZsYWdzLmlzUHVibGljKGNvbnN0cnVjdEZsYWdzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxJHMgb3IgaXRzIGRlZmF1bHQgY29uc3RydWN0b3IgbXVzdCBiZSBwdWJsaWMgZm9yIHRoZSBzeXN0ZW0gdG8gYmUgYWJsZSB0byBpbnN0YW50aWF0ZSBpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgcHVibGljLCBvciB0aGUgc3lzdGVtIHdpbGwgbm90IGJlIGFibGUgdG8gaW5zdGFudGlhdGUgaXQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgZW5jbG9zZWQsIHRlc3QgdGhhdCBpdCdzIHN0YXRpYy4gSWYgaXRzIGRlY2xhcmluZyBjbGFzcyBpcyBlbmNsb3NlZAotICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwsIHRlc3QgdGhhdCBpdCBpcyBhbHNvIHN0YXRpYywgYW5kIHB1YmxpYy4KLSAgICAgICAgICAgICAgICBJVHlwZSBkZWNsYXJpbmdUeXBlID0gdHlwZTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHRtcFR5cGUgPSBkZWNsYXJpbmdUeXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFR5cGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGRlY2xhcmluZ1R5cGUuZ2V0RmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmxhZ3MuaXNTdGF0aWMoZmxhZ3MpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzIGlzIGVuY2xvc2VkLCBidXQgbm90IHN0YXRpYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyaW5nVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gdG1wVHlwZS5nZXRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0VmlzaWJpbGl0eSAmJiBGbGFncy5pc1B1YmxpYyhmbGFncykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHMgaXMgbm90IHB1YmxpYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB3ZSBuZWVkIHRvIGV4aXQgc28gd2UgbWF5IGFzIHdlbGwgbWFyayBpdCBudWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmluZ1R5cGUgPSB0bXBUeXBlOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0ZXN0IHRoZSBjbGFzcyBpbmhlcml0IGZyb20gdGhlIHNwZWNpZmllZCBzdXBlciBjbGFzcy4KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHR5cGUgaGllcmFyY2h5Ci0gICAgICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN1cGVyIGNsYXNzIGlzIG5vdCB0aGUgcmVmZXJlbmNlIGNsYXNzLCBpdCBtYXkgaW5oZXJpdCBmcm9tCi0gICAgICAgICAgICAgICAgLy8gaXQgc28gd2UgZ2V0IGl0cyBzdXBlcnR5cGUuIEF0IHNvbWUgcG9pbnQgaXQgd2lsbCBiZSBudWxsIGFuZCB3ZQotICAgICAgICAgICAgICAgIC8vIHdpbGwgc3RvcAotICAgICAgICAgICAgICAgIElUeXBlIHN1cGVyVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFByb3BlclN1cGVyQ2xhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHN1cGVyVHlwZSA9IGhpZXJhcmNoeS5nZXRTdXBlcmNsYXNzKHN1cGVyVHlwZSkpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyVHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXJDbGFzc05hbWUuZXF1YWxzKHN1cGVyVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUHJvcGVyU3VwZXJDbGFzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgdGhlIHByb3BlciBzdXBlcmNsYXNzPyByZXR1cm4gZmFsc2UuCi0gICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvcGVyU3VwZXJDbGFzcyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkcyBkb2VzIG5vdCBleHRlbmQgJTIkcyIsIGNsYXNzTmFtZSwgc3VwZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9DTEFTU19PSzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkNsYXNzICUxJHMgZG9lcyBub3QgZXhpc3QiLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHM6ICUyJHMiLCBjbGFzc05hbWUsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIG1hbmlmZXN0IGZpbGUgZm9yIGVycm9ycy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBzdGFydHMgYnkgcmVtb3ZpbmcgdGhlIGN1cnJlbnQgWE1MIG1hcmtlciwgYW5kIHRoZW4gcGFyc2VzIHRoZSB4bWwgZm9yIGVycm9ycywgYm90aAotICAgICAqIG9mIFhNTCB0eXBlIGFuZCBvZiBBbmRyb2lkIHR5cGUgKGNoZWNraW5nIHZhbGlkaXR5IG9mIGNsYXNzIGZpbGVzKS4KLSAgICAgKiBAcGFyYW0gbWFuaWZlc3RGaWxlCi0gICAgICogQHBhcmFtIGVycm9yTGlzdGVuZXIKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBwYXJzZU1hbmlmZXN0Rm9yRXJyb3IoSUZpbGUgbWFuaWZlc3RGaWxlLAotICAgICAgICAgICAgWG1sRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBtYXJrZXJzCi0gICAgICAgIGlmIChtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5kZWxldGVNYXJrZXJzKEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX1hNTCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmRlbGV0ZU1hcmtlcnMoQW5kcm9pZENvbnN0YW50cy5NQVJLRVJfQU5EUk9JRCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBhbmQgcGFyc2UKLSAgICAgICAgcmV0dXJuIEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckVycm9yKAotICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmdldEphdmFQcm9qZWN0KG1hbmlmZXN0RmlsZS5nZXRQcm9qZWN0KCkpLAotICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZSwgZXJyb3JMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gZm9yIGEge0BsaW5rIElQcm9qZWN0fSBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IGhhcyB0aGUgSmF2YSBOYXR1cmUgZmlyc3QuCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBJSmF2YVByb2plY3Qgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBjb3VsZG4ndCBiZSBjcmVhdGVkIG9yIGlmIHRoZSBwcm9qZWN0Ci0gICAgICogZG9lcyBub3QgaGF2ZSB0aGUgSmF2YSBOYXR1cmUuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldmVhbHMgYSBzcGVjaWZpYyBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSBkZWZpbmluZyBhIHNwZWNpZmllZCBjbGFzcywKLSAgICAgKiBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEBwYXJhbSBsaW5lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJldmVhbFNvdXJjZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY2xhc3NOYW1lLCBpbnQgbGluZSkgewotICAgICAgICAvLyBpbiBjYXNlIHRoZSB0eXBlIGlzIGVuY2xvc2VkLCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlICQgd2l0aCAuCi0gICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlQWxsKCJcXCQiLCAiXFwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUzIkCi0KLSAgICAgICAgLy8gZ2V0IHRoZSBqYXZhIHByb2plY3QKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBJVHlwZSBtYXRjaGluZyB0aGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgIElUeXBlIHJlc3VsdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHNob3cgdGhlIHR5cGUgaW4gYW4gZWRpdG9yIHdpbmRvdywgd2UgbWFrZSBzdXJlIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgLy8gd29ya2JlbmNoIHBhZ2UgaGFzIGFuIGVkaXRvciBhcmVhICh0eXBpY2FsbHkgdGhlIGRkbXMgcGVyc3BlY3RpdmUgZG9lc24ndCkuCi0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYWdlLmlzRWRpdG9yQXJlYVZpc2libGUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBubyBlZGl0b3IgYXJlYT8gd2Ugb3BlbiB0aGUgamF2YSBwZXJzcGVjdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgbmV3IE9wZW5KYXZhUGVyc3BlY3RpdmVBY3Rpb24oKS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gSmF2YVVJLm9wZW5JbkVkaXRvcihyZXN1bHQpOwotICAgICAgICAgICAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHRleHQgZWRpdG9yIHRoYXQgd2FzIGp1c3Qgb3BlbmVkLgotICAgICAgICAgICAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvcjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGxpbmUgdG8gc2hvdy4KLSAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudFByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3QgYW5kIHJldmVhbCB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwobGluZUluZm8uZ2V0T2Zmc2V0KCksIGxpbmVJbmZvLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYW5kcm9pZC1mbGFnZ2VkIHByb2plY3RzLiBUaGlzIGxpc3QgY29udGFpbnMgcHJvamVjdHMgdGhhdCBhcmUgb3BlbmVkCi0gICAgICogaW4gdGhlIHdvcmtzcGFjZSBhbmQgdGhhdCBhcmUgZmxhZ2dlZCBhcyBhbmRyb2lkIHByb2plY3QgKHRocm91Z2ggdGhlIGFuZHJvaWQgbmF0dXJlKQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSUphdmFQcm9qZWN0LCB3aGljaCBjYW4gYmUgZW1wdHkgaWYgbm8gcHJvamVjdHMgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3RbXSBnZXRBbmRyb2lkUHJvamVjdHMoKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZSh3b3Jrc3BhY2VSb290KTsKLQotICAgICAgICByZXR1cm4gZ2V0QW5kcm9pZFByb2plY3RzKGphdmFNb2RlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbmRyb2lkLWZsYWdnZWQgcHJvamVjdHMgZm9yIHRoZSBzcGVjaWZpZWQgamF2YSBNb2RlbC4KLSAgICAgKiBUaGlzIGxpc3QgY29udGFpbnMgcHJvamVjdHMgdGhhdCBhcmUgb3BlbmVkIGluIHRoZSB3b3Jrc3BhY2UgYW5kIHRoYXQgYXJlIGZsYWdnZWQgYXMgYW5kcm9pZAotICAgICAqIHByb2plY3QgKHRocm91Z2ggdGhlIGFuZHJvaWQgbmF0dXJlKQotICAgICAqIEBwYXJhbSBqYXZhTW9kZWwgdGhlIEphdmEgTW9kZWwgb2JqZWN0IGNvcnJlc3BvbmRpbmcgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSByb290LgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSUphdmFQcm9qZWN0LCB3aGljaCBjYW4gYmUgZW1wdHkgaWYgbm8gcHJvamVjdHMgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3RbXSBnZXRBbmRyb2lkUHJvamVjdHMoSUphdmFNb2RlbCBqYXZhTW9kZWwpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBqYXZhIHByb2plY3RzCi0gICAgICAgIElKYXZhUHJvamVjdFtdIGphdmFQcm9qZWN0TGlzdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdExpc3QgID0gamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElKYXZhUHJvamVjdFswXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRlbXAgbGlzdCB0byBidWlsZCB0aGUgYW5kcm9pZCBwcm9qZWN0IGFycmF5Ci0gICAgICAgIEFycmF5TGlzdDxJSmF2YVByb2plY3Q+IGFuZHJvaWRQcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PigpOwotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgcHJvamVjdHMgYW5kIGFkZCB0aGUgYW5kcm9pZCBmbGFnZ2VkIHByb2plY3RzIHRvIHRoZSB0ZW1wIGxpc3QuCi0gICAgICAgIGZvciAoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0IDogamF2YVByb2plY3RMaXN0KSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHdvcmtzcGFjZSBwcm9qZWN0IG9iamVjdAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhbiBhbmRyb2lkIHByb2plY3QgYmFzZWQgb24gaXRzIG5hdHVyZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoQW5kcm9pZENvbnN0YW50cy5OQVRVUkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQcm9qZWN0TGlzdC5hZGQoamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgZXhjZXB0aW9uLCB0aHJvd24gYnkgSVByb2plY3QuaGFzTmF0dXJlKCksIG1lYW5zIHRoZSBwcm9qZWN0IGVpdGhlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3Qgb3IgaXNuJ3Qgb3BlbmVkLiBTbywgaW4gYW55IGNhc2Ugd2UganVzdCBza2lwIGl0ICh0aGUgZXhjZXB0aW9uIHdpbGwKLSAgICAgICAgICAgICAgICAvLyBieXBhc3MgdGhlIEFycmF5TGlzdC5hZGQoKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSBhbmRyb2lkIHByb2plY3RzIGxpc3QuCi0gICAgICAgIHJldHVybiBhbmRyb2lkUHJvamVjdExpc3QudG9BcnJheShuZXcgSUphdmFQcm9qZWN0W2FuZHJvaWRQcm9qZWN0TGlzdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGb2xkZXJ9IHJlcHJlc2VudGluZyB0aGUgb3V0cHV0IGZvciB0aGUgcHJvamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvamVjdCBtdXN0IGJlIGEgamF2YSBwcm9qZWN0IGFuZCBiZSBvcGVuZWQsIG9yIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUge0BsaW5rIElQcm9qZWN0fQotICAgICAqIEByZXR1cm4gYW4gSUZvbGRlciBpdGVtIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBJRm9sZGVyIGdldE91dHB1dEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHJvamVjdC5pc09wZW4oKSAmJiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGEgamF2YSBwcm9qZWN0IGZyb20gdGhlIG5vcm1hbCBwcm9qZWN0IG9iamVjdAotICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgICAgIElSZXNvdXJjZSBvdXRwdXRSZXNvdXJjZSA9IHdzUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRSZXNvdXJjZSAhPSBudWxsICYmIG91dHB1dFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUZvbGRlcilvdXRwdXRSZXNvdXJjZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBMZXQncyBkbyBub3RoaW5nIGFuZCByZXR1cm4gbnVsbAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIExldCdzIGRvIG5vdGhpbmcgYW5kIHJldHVybiBudWxsCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvRXhwb3J0SGVscGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9FeHBvcnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1YmE3Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9FeHBvcnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogRXhwb3J0IGhlbHBlciBmb3IgcHJvamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydEhlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJRXhwb3J0Q2FsbGJhY2sgc0NhbGxiYWNrOwotCi0gICAgcHVibGljIGludGVyZmFjZSBJRXhwb3J0Q2FsbGJhY2sgewotICAgICAgICB2b2lkIHN0YXJ0RXhwb3J0V2l6YXJkKElQcm9qZWN0IHByb2plY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDYWxsYmFjayhJRXhwb3J0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0RXhwb3J0V2l6YXJkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgaWYgKHNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzQ2FsbGJhY2suc3RhcnRFeHBvcnRXaXphcmQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBvcnRzIGFuIDxiPnVuc2lnbmVkPC9iPiB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGV4cG9ydAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBvcnRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgamF2YSBwcm9qZWN0IHRvIGdldCB0aGUgb3V0cHV0IGRpcmVjdG9yeQotICAgICAgICBJRm9sZGVyIG91dHB1dEZvbGRlciA9IEJhc2VQcm9qZWN0SGVscGVyLmdldE91dHB1dEZvbGRlcihwcm9qZWN0KTsKLSAgICAgICAgaWYgKG91dHB1dEZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJUGF0aCBiaW5Mb2NhdGlvbiA9IG91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBtYWtlIHRoZSBmdWxsIHBhdGggdG8gdGhlIHBhY2thZ2UKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpICsgQW5kcm9pZENvbnN0YW50cy5ET1RfQU5EUk9JRF9QQUNLQUdFOwotCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiaW5Mb2NhdGlvbi50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgPT0gZmFsc2UgfHwgZmlsZS5pc0ZpbGUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZCBJREUgUGx1Zy1pbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gZXhwb3J0ICUxJHM6ICUyJHMgZG9lc24ndCBleGlzdCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldE5hbWUoKSwgZmlsZS5nZXRQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9rIG5vdyBwb3AgdXAgdGhlIGZpbGUgc2F2ZSB3aW5kb3cKLSAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dCgiRXhwb3J0IFByb2plY3QiKTsKLSAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICBTdHJpbmcgc2F2ZUxvY2F0aW9uID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICBpZiAoc2F2ZUxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHN0cmVhbSBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlCi0KLSAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotICAgICAgICAgICAgICAgIFppcE91dHB1dFN0cmVhbSB6b3MgPSBudWxsOwotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW5wdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhbiBvdXRwdXQgc3RyZWFtIGludG8gdGhlIG5ldyBmaWxlCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgc2F2ZUZpbGUgPSBuZXcgRmlsZShzYXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzYXZlRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSBpbnB1dC9vdXRwdXQgc3RyZWFtIGFyZSB0aHJvd2luZyB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBoYXZlIHRvIGNsb3NlIHppcyBpZiBvdXRwdXQgaXMgdGhlIG9uZSB0aGF0IHRocmV3LgotICAgICAgICAgICAgICAgICAgICBpZiAoemlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiQW5kcm9pZCBJREUgUGx1Zy1pbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGV4cG9ydCAlMSRzOiAlMiRzIGRvZXNuJ3QgZXhpc3QhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TmFtZSgpLCBmaWxlLmdldFBhdGgoKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgdGFrZSBkaXJlY3RvcmllcyBvciBhbnl0aGluZyBpbnNpZGUgdGhlIE1FVEEtSU5GIGZvbGRlciBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBzdHJpcCB0aGUgc2lnbmF0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSkgeyAvLyROT04tTkwxJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBuZXdFbnRyeTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIFNUT1JFRCBtZXRob2Qgb2YgdGhlIGlucHV0IGVudHJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE1ldGhvZCgpID09IEphckVudHJ5LlNUT1JFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5ID0gbmV3IEphckVudHJ5KGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGVudHJ5IHNvIHRoYXQgdGhlIGNvbXByZXNzZWQgbGVuIGlzIHJlY29tcHV0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkgPSBuZXcgSmFyRW50cnkobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZW50cnkgdG8gdGhlIGphciBhcmNoaXZlCi0gICAgICAgICAgICAgICAgICAgICAgICB6b3MucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgY29udGVudCBvZiB0aGUgZW50cnkgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbmQgd3JpdGUgaXQgaW50byB0aGUgYXJjaGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSB6aXMucmVhZChidWZmZXIpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvcy53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGVudHJ5IGZvciB0aGlzIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHpvcy5jbG9zZUVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aXMuY2xvc2VFbnRyeSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiQW5kcm9pZCBJREUgUGx1Zy1pbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGV4cG9ydCAlMSRzOiAlMiRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TmFtZSgpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6b3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB1bnNpZ25lZCBleHBvcnQuIExldCdzIHRlbGwgdGhlIGRldmVsb3BlcnMgdG8gcnVuIHppcCBhbGlnbgotICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsICJBbmRyb2lkIElERSBQbHVnLWluIiwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJBbiB1bnNpZ25lZCBwYWNrYWdlIG9mIHRoZSBhcHBsaWNhdGlvbiB3YXMgc2F2ZWQgYXRcbiUxJHNcblxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiQmVmb3JlIHB1Ymxpc2hpbmcgdGhlIGFwcGxpY2F0aW9uIHlvdSB3aWxsIG5lZWQgdG86XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICItIFNpZ24gdGhlIGFwcGxpY2F0aW9uIHdpdGggeW91ciByZWxlYXNlIGtleSxcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIi0gcnVuIHppcGFsaWduIG9uIHRoZSBzaWduZWQgcGFja2FnZS4gWmlwQWxpZ24gaXMgbG9jYXRlZCBpbiA8U0RLPi90b29scy9cblxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiQWxpZ25pbmcgYXBwbGljYXRpb25zIGFsbG93cyBBbmRyb2lkIHRvIHVzZSBhcHBsaWNhdGlvbiByZXNvdXJjZXNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgZWZmaWNpZW50bHkuIiwgc2F2ZUxvY2F0aW9uKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiQW5kcm9pZCBJREUgUGx1Zy1pbiIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBleHBvcnQgJTEkczogQ291bGQgbm90IGdldCBwcm9qZWN0IG91dHB1dCBsb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0ZpeExhdW5jaENvbmZpZy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvRml4TGF1bmNoQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTFiZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvRml4TGF1bmNoQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaC5MYXVuY2hDb25maWdEZWxlZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgdG8gZml4IHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBvZiBhIHByb2plY3QgaWYgdGhlIGphdmEgcGFja2FnZQotICogZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gY2hhbmdlZC48YnI+Ci0gKiBUaGlzIGZpeCBjYW4gYmUgZG9uZSBzeW5jaHJvbm91c2x5LCBvciBhc3luY2hyb25vdXNseS48YnI+Ci0gKiA8Y29kZT5zdGFydCgpPC9jb2RlPiB3aWxsIHN0YXJ0IGEgdGhyZWFkIHRoYXQgd2lsbCBkbyB0aGUgZml4Ljxicj4KLSAqIDxjb2RlPnJ1bigpPC9jb2RlPiB3aWxsIGRvIHRoZSBmaXggaW4gdGhlIGN1cnJlbnQgdGhyZWFkLjxicj48YnI+Ci0gKiBCeSBkZWZhdWx0LCB0aGUgZml4IGZpcnN0IGRpc3BsYXkgYSBkaWFsb2cgdG8gdGhlIHVzZXIgYXNraW5nIGlmIGhlL3NoZSB3YW50cyB0bwotICogZG8gdGhlIGZpeC4gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNhbGxpbmcgPGNvZGU+c2V0RGlzcGxheVByb21wdChmYWxzZSk8L2NvZGU+LgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpeExhdW5jaENvbmZpZyBleHRlbmRzIFRocmVhZCB7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIG1PbGRQYWNrYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG1OZXdQYWNrYWdlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNwbGF5UHJvbXB0ID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBGaXhMYXVuY2hDb25maWcoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG9sZFBhY2thZ2UsIFN0cmluZyBuZXdQYWNrYWdlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgbVByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBtT2xkUGFja2FnZSA9IG9sZFBhY2thZ2U7Ci0gICAgICAgIG1OZXdQYWNrYWdlID0gbmV3UGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpc3BsYXkgcHJvbXB0LiBJZiB0cnVlIHJ1bigpL3N0YXJ0KCkgZmlyc3QgYXNrIHRoZSB1c2VyIGlmIGhlL3NoZSB3YW50cwotICAgICAqIHRvIGZpeCB0aGUgTGF1bmNoIENvbmZpZwotICAgICAqIEBwYXJhbSBkaXNwbGF5UHJvbXB0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVByb21wdChib29sZWFuIGRpc3BsYXlQcm9tcHQpIHsKLSAgICAgICAgbURpc3BsYXlQcm9tcHQgPSBkaXNwbGF5UHJvbXB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpeCB0aGUgTGF1bmNoIGNvbmZpZ3VyYXRpb25zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICBpZiAobURpc3BsYXlQcm9tcHQpIHsKLSAgICAgICAgICAgIC8vIGFzayB0aGUgdXNlciBpZiBoZSByZWFsbHkgd2FudHMgdG8gZml4IHRoZSBsYXVuY2ggY29uZmlnCi0gICAgICAgICAgICBib29sZWFuIHJlcyA9IEFkdFBsdWdpbi5kaXNwbGF5UHJvbXB0KAotICAgICAgICAgICAgICAgICAgICAiTGF1bmNoIENvbmZpZ3VyYXRpb24gVXBkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBwYWNrYWdlIGRlZmluaXRpb24gaW4gdGhlIG1hbmlmZXN0IGNoYW5nZWQuXG5EbyB5b3Ugd2FudCB0byB1cGRhdGUgeW91ciBMYXVuY2ggQ29uZmlndXJhdGlvbihzKT8iKTsKLQotICAgICAgICAgICAgaWYgKHJlcyA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBjb25maWcgZm9yIHRoZSBwcm9qZWN0Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1Qcm9qZWN0LmdldE5hbWUoKTsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gZmluZENvbmZpZ3MobVByb2plY3QuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBjb25maWcgYW5kIHVwZGF0ZSB0aGUgcGFja2FnZQotICAgICAgICBmb3IgKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB3b3JraW5nIGNvcHkgc28gdGhhdCB3ZSBjYW4gbWFrZSBjaGFuZ2VzLgotICAgICAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weSA9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHkgPSBjb25maWcuZ2V0QXR0cmlidXRlKExhdW5jaENvbmZpZ0RlbGVnYXRlLkFUVFJfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIC8vIG1hbmlmZXN0cyBjYW4gZGVmaW5lIGFjdGl2aXRpZXMgdGhhdCBhcmUgbm90IGluIHRoZSBkZWZpbmVkIHBhY2thZ2UsCi0gICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGlzIGluc2lkZSB0aGUgb2xkIHBhY2thZ2UuCi0gICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5LnN0YXJ0c1dpdGgobU9sZFBhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IGFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ID0gbU5ld1BhY2thZ2UgKyBhY3Rpdml0eS5zdWJzdHJpbmcobU9sZFBhY2thZ2UubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHB1dCBpdCBpbiB0aGUgY29weQotICAgICAgICAgICAgICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BVFRSX0FDVElWSVRZLCBhY3Rpdml0eSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgY29uZmlnCi0gICAgICAgICAgICAgICAgICAgIGNvcHkuZG9TYXZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZ2V0IHRoZSB3b3JraW5nIGNvcHkuIHdlIG91dHB1dCB0aGUgZXJyb3IgaW4gdGhlIGNvbnNvbGUKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIG1vZGlmeSAlMSRzOiAlMiRzIiwgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUobVByb2plY3QsIG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIGZvciBhbmQgcmV0dXJucyBhbGwgZXhpc3RpbmcgTGF1bmNoIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBhCi0gICAgICogc3BlY2lmaWVkIHByb2plY3QuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBhbGwgdGhlIElMYXVuY2hDb25maWd1cmF0aW9uIG9iamVjdC4gSWYgbm9uZSBhcmUgcHJlc2VudCwgYW4gZW1wdHkgYXJyYXkgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJTGF1bmNoQ29uZmlndXJhdGlvbltdIGZpbmRDb25maWdzKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICAvLyBnZXQgdGhlIGxhdW5jaCBtYW5hZ2VyCi0gICAgICAgIElMYXVuY2hNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIGNvbmZpZyB0eXBlIGZvciBvdXIgcGFydGljdWxhciBhbmRyb2lkIHR5cGUuCi0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gbWFuYWdlci4KLSAgICAgICAgICAgICAgICBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShMYXVuY2hDb25maWdEZWxlZ2F0ZS5BTkRST0lEX0xBVU5DSF9UWVBFX0lEKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wIGxpc3QgdG8gaG9sZCBhbGwgdGhlIHZhbGlkIGNvbmZpZ3MKLSAgICAgICAgQXJyYXlMaXN0PElMYXVuY2hDb25maWd1cmF0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTGF1bmNoQ29uZmlndXJhdGlvbj4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyhjb25maWdUeXBlKTsKLQotICAgICAgICAgICAgZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiIikuZXF1YWxzKHByb2plY3ROYW1lKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChjb25maWcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvbltsaXN0LnNpemUoKV0pOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9Gb2xkZXJEZWNvcmF0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0ZvbGRlckRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRlMjJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L0ZvbGRlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLQotLyoqCi0gKiBBIHtAbGluayBJTGFiZWxEZWNvcmF0b3J9IGFzc29jaWF0ZWQgd2l0aCBhbiBvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIGV4dGVuc2lvbi4KLSAqIFRoaXMgaXMgdXNlZCB0byBhZGQgYW5kcm9pZCBpY29ucyBpbiBzb21lIHNwZWNpYWwgZm9sZGVycyBpbiB0aGUgcGFja2FnZSBleHBsb3Jlci4KLSAqLwotcHVibGljIGNsYXNzIEZvbGRlckRlY29yYXRvciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLSAgICAKLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBGb2xkZXJEZWNvcmF0b3IoKSB7Ci0gICAgICAgIG1EZXNjcmlwdG9yID0gQWR0UGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiL2ljb25zL2FuZHJvaWRfcHJvamVjdC5wbmciKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcillbGVtZW50OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIGFuIGFuZHJvaWQgcHJvamVjdAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGZvbGRlci5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgZm9sZGVyIGlzIGRpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmdldFBhcmVudCgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmb2xkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFNka0NvbnN0YW50cy5GRF9BU1NFVFMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9EZWNvcmF0aW9uKGRlY29yYXRpb24sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTZGtDb25zdGFudHMuRkRfUkVTT1VSQ0VTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRGVjb3JhdGlvbihkZWNvcmF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoU2RrQ29uc3RhbnRzLkZEX0dFTl9TT1VSQ0VTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRGVjb3JhdGlvbihkZWNvcmF0aW9uLCAiIFtHZW5lcmF0ZWQgSmF2YSBGaWxlc10iKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFNka0NvbnN0YW50cy5GRF9OQVRJVkVfTElCUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG9EZWNvcmF0aW9uKGRlY29yYXRpb24sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9nIHRoZSBlcnJvcgotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlVuYWJsZSB0byBnZXQgbmF0dXJlIG9mIHByb2plY3QgJyVzJy4iLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9EZWNvcmF0aW9uKElEZWNvcmF0aW9uIGRlY29yYXRpb24sIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KG1EZXNjcmlwdG9yLCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0KLSAgICAgICAgaWYgKHN1ZmZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWNvcmF0aW9uLmFkZFN1ZmZpeChzdWZmaXgpOwotCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGJyb2tlbiBhcyBpdCBjaGFuZ2VzIHRoZSBjb2xvciBvZiB0aGUgd2hvbGUgdGV4dCwgbm90IG9ubHkgb2YgdGhlIGRlY29yYXRpb24uCi0gICAgICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBjaGFuZ2UgdGhlIGNvbG9yIG9mIHRoZSBkZWNvcmF0aW9uIG9ubHkuCi0vLyAgICAgICAgICAgIElUaGVtZSB0aGVtZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0VGhlbWVNYW5hZ2VyKCkuZ2V0Q3VycmVudFRoZW1lKCk7Ci0vLyAgICAgICAgICAgIENvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSB0aGVtZS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0vLyAgICAgICAgICAgIGRlY29yYXRpb24uc2V0Rm9yZWdyb3VuZENvbG9yKAotLy8gICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LmdldCgib3JnLmVjbGlwc2UuamR0LnVpLkNvbG9yZWRMYWJlbHMuZGVjb3JhdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgLy8gUHJvcGVydHkgY2hhbmdlIGRvIG5vdCBhZmZlY3QgdGhlIGxhYmVsCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIC8vIE5vIHN0YXRlIGNoYW5nZSB3aWxsIGFmZmVjdCB0aGUgcmVuZGVyaW5nLgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgLy8gTm8gc3RhdGUgY2hhbmdlIHdpbGwgYWZmZWN0IHRoZSByZW5kZXJpbmcuCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkaXNwb3NlCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvUHJvamVjdENob29zZXJIZWxwZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RDaG9vc2VySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2FjOGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvUHJvamVjdENob29zZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGRlYWwgd2l0aCBkaXNwbGF5aW5nIGEgcHJvamVjdCBjaG9vc2luZyBkaWFsb2cgdGhhdCBsaXN0cyBvbmx5IHRoZQotICogcHJvamVjdHMgd2l0aCB0aGUgQW5kcm9pZCBuYXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q2hvb3NlckhlbHBlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNoZWxsIG1QYXJlbnRTaGVsbDsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgY3VycmVudCBhbmRyb2lkIHByb2plY3RzLiBTaW5jZSB0aGUgZGlhbG9nIGlzIG1vZGFsLCB3ZSdsbCBqdXN0IGdldAotICAgICAqIHRoZSBsaXN0IG9uY2Ugb24tZGVtYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0W10gbUFuZHJvaWRQcm9qZWN0czsKLQotICAgIHB1YmxpYyBQcm9qZWN0Q2hvb3NlckhlbHBlcihTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICBtUGFyZW50U2hlbGwgPSBwYXJlbnRTaGVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogRGlzcGxheXMgYSBwcm9qZWN0IGNob29zZXIgZGlhbG9nIHdoaWNoIGxpc3RzIGFsbCBhdmFpbGFibGUgcHJvamVjdHMgd2l0aCB0aGUgQW5kcm9pZCBuYXR1cmUuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBsaXN0IG9mIHByb2plY3QgaXMgYnVpbHQgZnJvbSBBbmRyb2lkIGZsYWdnZWQgcHJvamVjdHMgY3VycmVudGx5IG9wZW5lZCBpbiB0aGUgd29ya3NwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIElmIG5vbiBudWxsIGFuZCBub3QgZW1wdHksIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gQW5kcm9pZCBwcm9qZWN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgY2hvc2VuIGJ5IHRoZSB1c2VyIGluIHRoZSBkaWFsb2csIG9yIG51bGwgaWYgdGhlIGRpYWxvZyB3YXMgY2FuY2VsZWQuCi0gICAgICovCi0gICAgcHVibGljIElKYXZhUHJvamVjdCBjaG9vc2VKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0gICAgICAgIEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICBtUGFyZW50U2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotICAgICAgICBkaWFsb2cuc2V0VGl0bGUoIlByb2plY3QgU2VsZWN0aW9uIik7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKCJTZWxlY3QgYSBwcm9qZWN0IHRvIGNvbnN0cmFpbiB5b3VyIHNlYXJjaC4iKTsKLQotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlUm9vdCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBlbGVtZW50cyBpbiB0aGUgZGlhbG9nLiBUaGVzZSBhcmUgb3BlbmVkIGFuZHJvaWQgcHJvamVjdHMuCi0gICAgICAgIGRpYWxvZy5zZXRFbGVtZW50cyhnZXRBbmRyb2lkUHJvamVjdHMoamF2YU1vZGVsKSk7Ci0KLSAgICAgICAgLy8gbG9vayBmb3IgdGhlIHByb2plY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIHByb2plY3QgbmFtZQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGphdmFQcm9qZWN0ID0gamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGZvdW5kIGl0LCB3ZSBzZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGluIHRoZSBkaWFsb2cgdG8gdGhpcyBvbmUuCi0gICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgamF2YVByb2plY3QgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvcGVuIHRoZSBkaWFsb2cgYW5kIHJldHVybiB0aGUgb2JqZWN0IHNlbGVjdGVkIGlmIE9LIHdhcyBjbGlja2VkLCBvciBudWxsIG90aGVyd2lzZQotICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIHJldHVybiAoSUphdmFQcm9qZWN0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBBbmRyb2lkIHByb2plY3RzLgotICAgICAqIDxwLz4KLSAgICAgKiBCZWNhdXNlIHRoaXMgbGlzdCBjYW4gYmUgdGltZSBjb25zdW1pbmcsIHRoaXMgY2xhc3MgY2FjaGVzIHRoZSBsaXN0IG9mIHByb2plY3QuCi0gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rIEJhc2VQcm9qZWN0SGVscGVyI2dldEFuZHJvaWRQcm9qZWN0cygpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gamF2YU1vZGVsIHRoZSBqYXZhIG1vZGVsLiBDYW4gYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUphdmFQcm9qZWN0W10gZ2V0QW5kcm9pZFByb2plY3RzKElKYXZhTW9kZWwgamF2YU1vZGVsKSB7Ci0gICAgICAgIGlmIChtQW5kcm9pZFByb2plY3RzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChqYXZhTW9kZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BbmRyb2lkUHJvamVjdHMgPSBCYXNlUHJvamVjdEhlbHBlci5nZXRBbmRyb2lkUHJvamVjdHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFuZHJvaWRQcm9qZWN0cyA9IEJhc2VQcm9qZWN0SGVscGVyLmdldEFuZHJvaWRQcm9qZWN0cyhqYXZhTW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbUFuZHJvaWRQcm9qZWN0czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIEFuZHJvaWQgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSVByb2plY3R9IGZvciB0aGUgQW5kcm9pZCBwcm9qZWN0LiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0IGdldEFuZHJvaWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJUHJvamVjdCBpcHJvamVjdCA9IG51bGw7Ci0gICAgICAgIElKYXZhUHJvamVjdFtdIGphdmFQcm9qZWN0cyA9IGdldEFuZHJvaWRQcm9qZWN0cyhudWxsKTsKLSAgICAgICAgaWYgKGphdmFQcm9qZWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA6IGphdmFQcm9qZWN0cykgewotICAgICAgICAgICAgICAgIGlmIChqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAKLSAgICAgICAgcmV0dXJuIGlwcm9qZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RIZWxwZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhNzVkYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIG1hbmlwdWxhdGUgUHJvamVjdCBwYXJhbWV0ZXJzL3Byb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0SGVscGVyIHsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QSUxFUl9DT01QTElBTkNFX09LID0gMDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QSUxFUl9DT01QTElBTkNFX0xFVkVMID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QSUxFUl9DT01QTElBTkNFX1NPVVJDRSA9IDI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUElMRVJfQ09NUExJQU5DRV9DT0RFR0VOX1RBUkdFVCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmb2xkZXIgdG8gdGhlIGNsYXNzIHBhdGggZW50cmllcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBjbGFzcyBwYXRoIGVudHJpZXMgdG8gcmVhZC4gQSBjb3B5IHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIG5ld19lbnRyeSBUaGUgcGFyZW50IHNvdXJjZSBmb2xkZXIgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gQSBuZXcgY2xhc3MgcGF0aCBlbnRyaWVzIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5W10gYWRkRW50cnlUb0NsYXNzcGF0aCgKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElDbGFzc3BhdGhFbnRyeSBuZXdfZW50cnkpIHsKLSAgICAgICAgaW50IG4gPSBlbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbiArIDFdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG4pOwotICAgICAgICBuZXdFbnRyaWVzW25dID0gbmV3X2VudHJ5OwotICAgICAgICByZXR1cm4gbmV3RW50cmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmb2xkZXIgdG8gdGhlIHByb2plY3QncyBjbGFzcyBwYXRoIGVudHJpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgVGhlIGphdmEgcHJvamVjdCBvZiB3aGljaCBwYXRoIGVudHJpZXMgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSBuZXdfZW50cnkgVGhlIHBhcmVudCBzb3VyY2UgZm9sZGVyIHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRW50cnlUb0NsYXNzcGF0aCgKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IG5ld19lbnRyeSkKLSAgICAgICAgICAgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgZW50cmllcyA9IGFkZEVudHJ5VG9DbGFzc3BhdGgoZW50cmllcywgbmV3X2VudHJ5KTsKLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gZW50cmllcyBUaGUgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIHJlYWQuIEEgY29weSB3aWxsIGJlIHJldHVybmVkCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byByZW1vdmUuCi0gICAgICogQHJldHVybiBBIG5ldyBjbGFzcyBwYXRoIGVudHJpZXMgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSByZW1vdmVFbnRyeUZyb21DbGFzc3BhdGgoCi0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50IG4gPSBlbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbi0xXTsKLQotICAgICAgICAvLyBjb3B5IHRoZSBlbnRyaWVzIGJlZm9yZSBpbmRleAotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGluZGV4KTsKLQotICAgICAgICAvLyBjb3B5IHRoZSBlbnRyaWVzIGFmdGVyIGluZGV4Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgaW5kZXggKyAxLCBuZXdFbnRyaWVzLCBpbmRleCwKLSAgICAgICAgICAgICAgICBlbnRyaWVzLmxlbmd0aCAtIGluZGV4IC0gMSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ld0VudHJpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBPUyBzcGVjaWZpYyBwYXRoIGludG8gYSBwYXRoIHZhbGlkIGZvciB0aGUgamF2YSBkb2MgbG9jYXRpb24KLSAgICAgKiBhdHRyaWJ1dGVzIG9mIGEgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gamF2YURvY09TTG9jYXRpb24gVGhlIE9TIHNwZWNpZmljIHBhdGguCi0gICAgICogQHJldHVybiBhIHZhbGlkIHBhdGggZm9yIHRoZSBqYXZhIGRvYyBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhRG9jUGF0aChTdHJpbmcgamF2YURvY09TTG9jYXRpb24pIHsKLSAgICAgICAgLy8gZmlyc3QgdGhpbmcgd2UgZG8gaXMgY29udmVydCB0aGUgXCBpbnRvIC8KLSAgICAgICAgU3RyaW5nIGphdmFEb2MgPSBqYXZhRG9jT1NMb2NhdGlvbi5yZXBsYWNlQWxsKCJcXFxcIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQKTsKLQotICAgICAgICAvLyB0aGVuIHdlIGFkZCBmaWxlOiBhdCB0aGUgYmVnaW5uaW5nIGZvciB1bml4IHBhdGgsIGFuZCBmaWxlOi8gZm9yIG5vbgotICAgICAgICAvLyB1bml4IHBhdGgKLSAgICAgICAgaWYgKGphdmFEb2Muc3RhcnRzV2l0aChBbmRyb2lkQ29uc3RhbnRzLldTX1NFUCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiZmlsZToiICsgamF2YURvYzsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJmaWxlOi8iICsgamF2YURvYzsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGVudHJ5IGJ5IGZ1bGwgcGF0aCBhbmQgcmV0dXJuIGl0cyBpbmRleC4KLSAgICAgKiBAcGFyYW0gZW50cmllcyBUaGUgZW50cnkgYXJyYXkgdG8gc2VhcmNoIGluLgotICAgICAqIEBwYXJhbSBlbnRyeVBhdGggVGhlIE9TIHNwZWNpZmljIHBhdGggb2YgdGhlIGVudHJ5LgotICAgICAqIEBwYXJhbSBlbnRyeUtpbmQgVGhlIGtpbmQgb2YgdGhlIGVudHJ5LiBBY2NlcHRlZCB2YWx1ZXMgYXJlIDAKLSAgICAgKiAobm8gZmlsdGVyKSwgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZLCBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QsCi0gICAgICogSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UsIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUsCi0gICAgICogYW5kIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGNsYXNzcGF0aCBlbnRyeSBvciAtMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBmaW5kQ2xhc3NwYXRoRW50cnlCeVBhdGgoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywKLSAgICAgICAgICAgIFN0cmluZyBlbnRyeVBhdGgsIGludCBlbnRyeUtpbmQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZW50cmllcy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0KLSAgICAgICAgICAgIGludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0KLSAgICAgICAgICAgIGlmIChraW5kID09IGVudHJ5S2luZCB8fCBlbnRyeUtpbmQgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcGF0aAotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb3NQYXRoU3RyaW5nID0gcGF0aC50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9zUGF0aFN0cmluZy5lcXVhbHMoZW50cnlQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3QgZm91bmQsIHJldHVybiBiYWQgaW5kZXguCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciBhIHNwZWNpZmljIGNsYXNzcGF0aCBlbnRyeSBmb3IgZmlsZSBuYW1lIG9ubHkgYW5kIHJldHVybiBpdHMKLSAgICAgKiAgaW5kZXguCi0gICAgICogQHBhcmFtIGVudHJpZXMgVGhlIGVudHJ5IGFycmF5IHRvIHNlYXJjaCBpbi4KLSAgICAgKiBAcGFyYW0gZW50cnlOYW1lIFRoZSBmaWxlbmFtZSBvZiB0aGUgZW50cnkuCi0gICAgICogQHBhcmFtIGVudHJ5S2luZCBUaGUga2luZCBvZiB0aGUgZW50cnkuIEFjY2VwdGVkIHZhbHVlcyBhcmUgMAotICAgICAqIChubyBmaWx0ZXIpLCBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwKLSAgICAgKiBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSwgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSwKLSAgICAgKiBhbmQgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIKLSAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBJbmRleCB3aGVyZSB0byBzdGFydCB0aGUgc2VhcmNoCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGNsYXNzcGF0aCBlbnRyeSBvciAtMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBmaW5kQ2xhc3NwYXRoRW50cnlCeU5hbWUoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywKLSAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUsIGludCBlbnRyeUtpbmQsIGludCBzdGFydEluZGV4KSB7Ci0gICAgICAgIGlmIChzdGFydEluZGV4IDwgMCkgewotICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXggOyBpIDwgZW50cmllcy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0KLSAgICAgICAgICAgIGludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0KLSAgICAgICAgICAgIGlmIChraW5kID09IGVudHJ5S2luZCB8fCBlbnRyeUtpbmQgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcGF0aAotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoLnNlZ21lbnQocGF0aC5zZWdtZW50Q291bnQoKS0xKTsKLQotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhlbnRyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdCBmb3VuZCwgcmV0dXJuIGJhZCBpbmRleC4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpeCB0aGUgcHJvamVjdC4gVGhpcyBjaGVja3MgdGhlIFNESyBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBmaXguCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZml4UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKEFkdFBsdWdpbi5nZXRPc1Nka0ZvbGRlcigpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZShwcm9qZWN0LCAiVW5rbm93biBTREsgTG9jYXRpb24sIHByb2plY3Qgbm90IGZpeGVkLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgYSBqYXZhIHByb2plY3QKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBmaXhQcm9qZWN0Q2xhc3NwYXRoRW50cmllcyhqYXZhUHJvamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRml4IHRoZSBwcm9qZWN0IGNsYXNzcGF0aCBlbnRyaWVzLiBUaGUgbWV0aG9kIGVuc3VyZXMgdGhhdDoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBwcm9qZWN0IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgb2xkIGFuZHJvaWQuemlwL2FuZHJvaWQuamFyIGFyY2hpdmUuPC9saT4KLSAgICAgKiA8bGk+VGhlIHByb2plY3QgZG9lcyBub3QgdXNlIGl0cyBvdXRwdXQgZm9sZGVyIGFzIGEgc291cmMgZm9sZGVyLjwvbGk+Ci0gICAgICogPGxpPlRoZSBwcm9qZWN0IGRvZXMgbm90IHJlZmVyZW5jZSBhIGRlc2t0b3AgSlJFPC9saT4KLSAgICAgKiA8bGk+VGhlIHByb2plY3QgcmVmZXJlbmNlcyB0aGUgQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lci4KLSAgICAgKiA8L3VsPgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgcHJvamVjdCB0byBmaXguCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZml4UHJvamVjdENsYXNzcGF0aEVudHJpZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KQotICAgICAgICAgICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBlbnRyaWVzOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBKUkUgaXMgc2V0IGFzIGxpYnJhcnkKLSAgICAgICAgaW50IGpyZUluZGV4ID0gUHJvamVjdEhlbHBlci5maW5kQ2xhc3NwYXRoRW50cnlCeVBhdGgoZW50cmllcywgSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUiwKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUik7Ci0gICAgICAgIGlmIChqcmVJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgLy8gdGhlIHByb2plY3QgaGFzIGEgSlJFIGluY2x1ZGVkLCB3ZSByZW1vdmUgaXQKLSAgICAgICAgICAgIGVudHJpZXMgPSBQcm9qZWN0SGVscGVyLnJlbW92ZUVudHJ5RnJvbUNsYXNzcGF0aChlbnRyaWVzLCBqcmVJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG91dHB1dCBmb2xkZXIKLSAgICAgICAgSVBhdGggb3V0cHV0Rm9sZGVyID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZm91bmRDb250YWluZXIgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBlbnRyaWVzLmxlbmd0aCA7KSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGVudHJ5IGFuZCBraW5kCi0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgaW50IGtpbmQgPSBlbnRyeS5nZXRFbnRyeUtpbmQoKTsKLQotICAgICAgICAgICAgaWYgKGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscyhvdXRwdXRGb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBQcm9qZWN0SGVscGVyLnJlbW92ZUVudHJ5RnJvbUNsYXNzcGF0aChlbnRyaWVzLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlLCB0byBza2lwIHRoZSBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuY2hlY2tQYXRoKGVudHJ5LmdldFBhdGgoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRDb250YWluZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIGZyYW1ld29yayBjb250YWluZXIgaXMgbm90IHRoZXJlLCB3ZSBhZGQgaXQKLSAgICAgICAgaWYgKGZvdW5kQ29udGFpbmVyID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyBhZGQgdGhlIGFuZHJvaWQgY29udGFpbmVyIHRvIHRoZSBhcnJheQotICAgICAgICAgICAgZW50cmllcyA9IFByb2plY3RIZWxwZXIuYWRkRW50cnlUb0NsYXNzcGF0aChlbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZ2V0Q29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIG5ldyBsaXN0IG9mIGVudHJpZXMgdG8gdGhlIHByb2plY3QKLSAgICAgICAgaWYgKGVudHJpZXMgIT0gb2xkRW50cmllcykgewotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgbmVlZGVkLCBjaGVjayBhbmQgZml4IGNvbXBpbGVyIGNvbXBsaWFuY2UgYW5kIHNvdXJjZSBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFByb2plY3RIZWxwZXIuY2hlY2tBbmRGaXhDb21waWxlckNvbXBsaWFuY2UoamF2YVByb2plY3QpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHByb2plY3QgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBpcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IFRoZSBwcm9qZWN0IHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8dWw+Ci0gICAgICogPGxpPjxjb2RlPkNPTVBJTEVSX0NPTVBMSUFOQ0VfT0s8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQ8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT01QSUxFUl9DT01QTElBTkNFX0xFVkVMPC9jb2RlPiBmb3IgdW5zdXBwb3J0ZWQgY29tcGlsZXIgbGV2ZWw8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT01QSUxFUl9DT01QTElBTkNFX1NPVVJDRTwvY29kZT4gZm9yIHVuc3VwcG9ydGVkIHNvdXJjZSBjb21wYXRpYmlsaXR5PC9saT4KLSAgICAgKiA8bGk+PGNvZGU+Q09NUElMRVJfQ09NUExJQU5DRV9DT0RFR0VOX1RBUkdFVDwvY29kZT4gZm9yIHVuc3VwcG9ydGVkIC5jbGFzcyBmb3JtYXQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tDb21waWxlckNvbXBsaWFuY2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCBjb21wbGlhbmNlIGxldmVsIG9wdGlvbgotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZSA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKTsKLQotICAgICAgICAvLyBjaGVjayBpdCBhZ2FpbnN0IGEgbGlzdCBvZiB2YWxpZCBjb21wbGlhbmNlIGxldmVsIHN0cmluZ3MuCi0gICAgICAgIGlmIChjaGVja0NvbXBsaWFuY2UoY29tcGxpYW5jZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIHRoZSBwcm9wZXIgY29tcGxpYW5jZSBsZXZlbCwgd2UgcmV0dXJuIGFuIGVycm9yCi0gICAgICAgICAgICByZXR1cm4gQ09NUElMRVJfQ09NUExJQU5DRV9MRVZFTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG90aGVyd2lzZSB3ZSBjaGVjayBzb3VyY2UgY29tcGF0aWJpbGl0eQotICAgICAgICBTdHJpbmcgc291cmNlID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaXQgYWdhaW5zdCBhIGxpc3Qgb2YgdmFsaWQgY29tcGxpYW5jZSBsZXZlbCBzdHJpbmdzLgotICAgICAgICBpZiAoY2hlY2tDb21wbGlhbmNlKHNvdXJjZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIHRoZSBwcm9wZXIgY29tcGxpYW5jZSBsZXZlbCwgd2UgcmV0dXJuIGFuIGVycm9yCi0gICAgICAgICAgICByZXR1cm4gQ09NUElMRVJfQ09NUExJQU5DRV9TT1VSQ0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvdGhlcndpc2UgY2hlY2sgY29kZWdlbiBsZXZlbAotICAgICAgICBTdHJpbmcgY29kZUdlbiA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaXQgYWdhaW5zdCBhIGxpc3Qgb2YgdmFsaWQgY29tcGxpYW5jZSBsZXZlbCBzdHJpbmdzLgotICAgICAgICBpZiAoY2hlY2tDb21wbGlhbmNlKGNvZGVHZW4pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCB0aGUgcHJvcGVyIGNvbXBsaWFuY2UgbGV2ZWwsIHdlIHJldHVybiBhbiBlcnJvcgotICAgICAgICAgICAgcmV0dXJuIENPTVBJTEVSX0NPTVBMSUFOQ0VfQ09ERUdFTl9UQVJHRVQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ09NUElMRVJfQ09NUExJQU5DRV9PSzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHByb2plY3QgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBpcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIDx1bD4KLSAgICAgKiA8bGk+PGNvZGU+Q09NUElMRVJfQ09NUExJQU5DRV9PSzwvY29kZT4gaWYgdGhlIHByb2plY3QgaXMgcHJvcGVybHkgY29uZmlndXJlZDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTVBJTEVSX0NPTVBMSUFOQ0VfTEVWRUw8L2NvZGU+IGZvciB1bnN1cHBvcnRlZCBjb21waWxlciBsZXZlbDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPkNPTVBJTEVSX0NPTVBMSUFOQ0VfU09VUkNFPC9jb2RlPiBmb3IgdW5zdXBwb3J0ZWQgc291cmNlIGNvbXBhdGliaWxpdHk8L2xpPgotICAgICAqIDxsaT48Y29kZT5DT01QSUxFUl9DT01QTElBTkNFX0NPREVHRU5fVEFSR0VUPC9jb2RlPiBmb3IgdW5zdXBwb3J0ZWQgLmNsYXNzIGZvcm1hdDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja0NvbXBpbGVyQ29tcGxpYW5jZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIGdldCB0aGUgamF2YSBwcm9qZWN0IGZyb20gdGhlIElQcm9qZWN0IHJlc291cmNlIG9iamVjdAotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotICAgICAgICByZXR1cm4gY2hlY2tDb21waWxlckNvbXBsaWFuY2UoamF2YVByb2plY3QpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzLCBhbmQgZml4ZXMgaWYgbmVlZGVkLCB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCwgYW5kIHRoZSBzb3VyY2UgY29tcGF0aWJpbGl0eQotICAgICAqIGxldmVsCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gY2hlY2sgYW5kIGZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2hlY2tBbmRGaXhDb21waWxlckNvbXBsaWFuY2UoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvLyBnZXQgdGhlIGphdmEgcHJvamVjdCBmcm9tIHRoZSBJUHJvamVjdCByZXNvdXJjZSBvYmplY3QKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBhbmQgbWFrZSBzdXJlIGl0IGlzIHZhbGlkCi0gICAgICAgIGNoZWNrQW5kRml4Q29tcGlsZXJDb21wbGlhbmNlKGphdmFQcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MsIGFuZCBmaXhlcyBpZiBuZWVkZWQsIHRoZSBjb21waWxlciBjb21wbGlhbmNlIGxldmVsLCBhbmQgdGhlIHNvdXJjZSBjb21wYXRpYmlsaXR5Ci0gICAgICogbGV2ZWwKLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgVGhlIEphdmEgcHJvamVjdCB0byBjaGVjayBhbmQgZml4LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjaGVja0FuZEZpeENvbXBpbGVyQ29tcGxpYW5jZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgaWYgKGNoZWNrQ29tcGlsZXJDb21wbGlhbmNlKGphdmFQcm9qZWN0KSAhPSBDT01QSUxFUl9DT01QTElBTkNFX09LKSB7Ci0gICAgICAgICAgICAvLyBzZXR1cCB0aGUgcHJlZmVycmVkIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwuCi0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DT01QSUxFUl9DT01QTElBTkNFX1BSRUZFUlJFRCk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNPTVBJTEVSX0NPTVBMSUFOQ0VfUFJFRkVSUkVEKTsKLSAgICAgICAgICAgIGphdmFQcm9qZWN0LnNldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DT01QSUxFUl9DT01QTElBTkNFX1BSRUZFUlJFRCk7Ci0KLSAgICAgICAgICAgIC8vIGNsZWFuIHRoZSBwcm9qZWN0IHRvIG1ha2Ugc3VyZSB3ZSByZWNvbXBpbGUKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJQcm9qZWN0IGNvbXBpbGVyIHNldHRpbmdzIGNoYW5nZWQuIENsZWFuIHlvdXIgcHJvamVjdC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgSVByb2plY3R9IGJ5IGl0cyBydW5uaW5nIGFwcGxpY2F0aW9uIG5hbWUsIGFzIGl0IHJldHVybmVkIGJ5IHRoZSBBVkQuCi0gICAgICogPHAvPgotICAgICAqIDx2YXI+YXBwbGljYXRpb25OYW1lPC92YXI+IHdpbGwgaW4gbW9zdCBjYXNlIGJlIHRoZSBwYWNrYWdlIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdCwgYnV0Ci0gICAgICogY2FuLCBpbiBzb21lIGNhc2VzLCBiZSBhIGN1c3RvbSBwcm9jZXNzIG5hbWUgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0LCBpbiB0aGUKLSAgICAgKiA8Y29kZT5hcHBsaWNhdGlvbjwvY29kZT4sIDxjb2RlPmFjdGl2aXR5PC9jb2RlPiwgPGNvZGU+cmVjZWl2ZXI8L2NvZGU+LCBvcgotICAgICAqIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG5vZGVzLgotICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbk5hbWUgVGhlIGFwcGxpY2F0aW9uIG5hbWUuCi0gICAgICogQHJldHVybiBhIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWF0Y2hpbmcgcHJvamVjdCB3ZXJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZEFuZHJvaWRQcm9qZWN0QnlBcHBOYW1lKFN0cmluZyBhcHBsaWNhdGlvbk5hbWUpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHByb2plY3QgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZQotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGxvb2sgZm9yIGEgcHJvamVjdCB0aGF0IG1hdGNoZXMgdGhlIHBhY2thZ2VOYW1lIG9mIHRoZSBhcHAKLSAgICAgICAgLy8gd2UncmUgdHJ5aW5nIHRvIGRlYnVnCi0gICAgICAgIGZvciAoSVByb2plY3QgcCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAocC5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwLmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gYW5kcm9pZCBwcm9qZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGdldCB0aGUgbmF0dXJlPyBza2lwIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgaW5kZWVkIGEgbWFuaWZlc3QgZmlsZS4KLSAgICAgICAgICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIuZ2V0TWFuaWZlc3QocCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIGZpbGU/IHNraXAgdGhpcyBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgcGFyc2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIucGFyc2VGb3JEYXRhKG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgaGFuZGxlZCBiZWxvdy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RQYWNrYWdlID0gcGFyc2VyLmdldFBhY2thZ2UoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdFBhY2thZ2UgIT0gbnVsbCAmJiBtYW5pZmVzdFBhY2thZ2UuZXF1YWxzKGFwcGxpY2F0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcHJvamVjdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yIQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFja2FnZSBhbmQgYXBwbGljYXRpb24gbmFtZSBkb24ndCBtYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9vayBmb3Igb3RoZXIgcG9zc2libGUgcHJvY2VzcyBuYW1lcyBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QuCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2Nlc3NlcyA9IHBhcnNlci5nZXRQcm9jZXNzZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvY2VzcyA6IHByb2Nlc3NlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZXF1YWxzKGFwcGxpY2F0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpeFByb2plY3ROYXR1cmVPcmRlcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFN0cmluZ1tdIG5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGlmIHRoZSBhbmRyb2lkIG5hdHVyZSBpcyBub3QgdGhlIGZpcnN0IG9uZSwgd2UgcmVvcmRlciB0aGVtCi0gICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRS5lcXVhbHMobmF0dXJlc1swXSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBpbmRleAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmF0dXJlcy5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoQW5kcm9pZENvbnN0YW50cy5OQVRVUkUuZXF1YWxzKG5hdHVyZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRyeSB0byBqdXN0IHJlb3JkZXIgdGhlIGFycmF5IGluIG9uZSBwYXNzLCB0aGlzIGRvZXNuJ3QgZG8gCi0gICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nLiBJIGd1ZXNzIEpEVCBjaGVjayB0aGF0IHdlIGFyZSBhY3R1YWxseSBhZGRpbmcvcmVtb3ZpbmcgbmF0dXJlLgotICAgICAgICAgICAgICAgICAgICAvLyBTbywgZmlyc3Qgd2UnbGwgcmVtb3ZlIHRoZSBhbmRyb2lkIG5hdHVyZSwgYW5kIHRoZW4gYWRkIGl0IGJhY2suCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhbmRyb2lkIG5hdHVyZQotICAgICAgICAgICAgICAgICAgICByZW1vdmVOYXR1cmUocHJvamVjdCwgQW5kcm9pZENvbnN0YW50cy5OQVRVUkUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IGFkZCBpdCBiYWNrIGF0IHRoZSBmaXJzdCBpbmRleC4KLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW25hdHVyZXMubGVuZ3RoICsgMV07Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgb25lIGlzIGFuZHJvaWQKLSAgICAgICAgICAgICAgICAgICAgbmV3TmF0dXJlc1swXSA9IEFuZHJvaWRDb25zdGFudHMuTkFUVVJFOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCB0aGUgcmVzdCB0aGF0IHdhcyBiZWZvcmUgdGhlIGFuZHJvaWQgbmF0dXJlCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgbmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgbmF0dXJlcwotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdG9wCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHNwZWNpZmljIG5hdHVyZSBmcm9tIGEgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byByZW1vdmUgdGhlIG5hdHVyZSBmcm9tLgotICAgICAqIEBwYXJhbSBuYXR1cmUgVGhlIG5hdHVyZSBpZCB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFN0cmluZ1tdIG5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgcHJvamVjdCBhbHJlYWR5IGhhcyB0aGUgYW5kcm9pZCBuYXR1cmUuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKG5hdHVyZS5lcXVhbHMobmF0dXJlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuYXR1cmVzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hdHVyZXMsIGkgKyAxLCBuZXdOYXR1cmVzLCBpLCBuYXR1cmVzLmxlbmd0aCAtIGkgLSAxKTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHByb2plY3QgaGFzIGVycm9yIGxldmVsIG1hcmtlcnMuCi0gICAgICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMgZmxhZyB0byBhbHNvIHRlc3QgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0Vycm9yKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cykKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgIGlmIChtYXJrZXJzICE9IG51bGwgJiYgbWFya2Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAvLyB0aGUgcHJvamVjdCBoYXMgbWFya2VyKHMpLiBldmVuIHRob3VnaCB0aGV5IGFyZSAicHJvYmxlbSIgd2UKLSAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhlaXIgc2V2ZXJpdHkuIHNvIHdlIGxvb3Agb24gdGhlbSBhbmQgZmlndXJlIGlmIHRoZXkKLSAgICAgICAgICAgIC8vIGFyZSB3YXJuaW5ncyBvciBlcnJvcnMKLSAgICAgICAgICAgIGZvciAoSU1hcmtlciBtIDogbWFya2VycykgewotICAgICAgICAgICAgICAgIGludCBzID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotICAgICAgICAgICAgICAgIGlmIChzID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHRoZSByZWZlcmVuY2VkIHByb2plY3RzIGlmIG5lZWRlZC4KLSAgICAgICAgaWYgKGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMpIHsKLSAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRSZWZlcmVuY2VkUHJvamVjdHMocHJvamVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoSVByb2plY3QgcCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0Vycm9yKHAsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYSBTdHJpbmcgcHJvcGVydHkgaW50byB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIG9mIGEgcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSBpbnRvIHdoaWNoIHRoZSBzdHJpbmcgdmFsdWUgaXMgc2F2ZWQuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBpZCBvZiB0aGUgcGx1Z2luIGlzIGFkZGVkIHRvIHRoaXMgc3RyaW5nLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2F2ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2F2ZSBzdWNjZWVkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVTdHJpbmdQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKEFkdFBsdWdpbi5QTFVHSU5fSUQsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlLnNldFBlcnNpc3RlbnRQcm9wZXJ0eShxbmFtZSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgU3RyaW5nIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiBhIHJlc291cmNlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgZnJvbSB3aGljaCB0aGUgc3RyaW5nIHZhbHVlIGlzIGxvYWRlZC4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGlkIG9mIHRoZSBwbHVnaW4gaXMgYWRkZWQgdG8gdGhpcyBzdHJpbmcuCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRTdHJpbmdQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKEFkdFBsdWdpbi5QTFVHSU5fSUQsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlc291cmNlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShxbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhIHByb3BlcnR5IGludG8gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBvZiBhIHJlc291cmNlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgaW50byB3aGljaCB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBzYXZlZC4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGlkIG9mIHRoZSBwbHVnaW4gaXMgYWRkZWQgdG8gdGhpcyBzdHJpbmcuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzYXZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzYXZlIHN1Y2NlZWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZUJvb2xlYW5Qcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzYXZlU3RyaW5nUHJvcGVydHkocmVzb3VyY2UsIHByb3BlcnR5TmFtZSwgQm9vbGVhbi50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgYm9vbGVhbiBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSBmcm9tIHdoaWNoIHRoZSBib29sZWFuIHZhbHVlIGlzIGxvYWRlZC4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGlkIG9mIHRoZSBwbHVnaW4gaXMgYWRkZWQgdG8gdGhpcyBzdHJpbmcuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IHdhcyBub3QgZm91bmQuCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHByb3BlcnR5IHdhcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxvYWRCb29sZWFuUHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbG9hZFN0cmluZ1Byb3BlcnR5KHJlc291cmNlLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JhdGUgb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSBpbnRvIHdoaWNoIHRoZSByZXNvdXJjZSBwYXRoIGlzIHNhdmVkLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgaWQgb2YgdGhlIHBsdWdpbiBpcyBhZGRlZCB0byB0aGlzIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHJlc291cmNlIHRvIHNhdmUuIEl0J3MgaXRzIHBhdGggdGhhdCBpcyBhY3R1YWxseSBzdG9yZWQuIElmIG51bGwsIGFuCi0gICAgICogICAgICBlbXB0eSBzdHJpbmcgaXMgc3RvcmVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2F2ZSBzdWNjZWVkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlUHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgSVJlc291cmNlIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJUGF0aCBpUGF0aCA9IHZhbHVlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLSAgICAgICAgICAgIHJldHVybiBzYXZlU3RyaW5nUHJvcGVydHkocmVzb3VyY2UsIHByb3BlcnR5TmFtZSwgaVBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2F2ZVN0cmluZ1Byb3BlcnR5KHJlc291cmNlLCBwcm9wZXJ0eU5hbWUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIG9mIHRoZSBwcm9qZWN0LCBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIElSZXNvdXJjZSBvYmplY3QsIGlmIGl0IGV4aXN0cyBpbiB0aGUgc2FtZSBwcm9qZWN0IGFzIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIGZyb20gd2hpY2ggdGhlIHJlc291cmNlIHBhdGggaXMgbG9hZGVkLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgaWQgb2YgdGhlIHBsdWdpbiBpcyBhZGRlZCB0byB0aGlzIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIElSZXNvdXJjZSBvYmplY3QgKG9yIGNoaWxkcmVuIGludGVyZmFjZSkgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGxvYWRSZXNvdXJjZVByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBsb2FkU3RyaW5nUHJvcGVydHkocmVzb3VyY2UsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBwcm9qZWN0IHRoYXQgYXJlIG9wZW5lZCBhbmQgSmF2YSBwcm9qZWN0cy4KLSAgICAgKiBAcGFyYW0gcHJvamVjdAotICAgICAqIEByZXR1cm4gbGlzdCBvZiBvcGVuZWQgcmVmZXJlbmNlZCBqYXZhIHByb2plY3QuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFJlZmVyZW5jZWRQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBwcm9qZWN0LmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0PElQcm9qZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSVByb2plY3QgcCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAocC5pc09wZW4oKSAmJiBwLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGEgSmF2YSBwcm9qZWN0IGNvbXBpbGVyIGxldmVsIG9wdGlvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmVyc2lvbnMuCi0gICAgICogQHBhcmFtIG9wdGlvblZhbHVlIHRoZSBDb21waWxlciBsZXZlbCBvcHRpb24uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcHRpb24gdmFsdWUgaXMgc3VwcHJvdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDb21wbGlhbmNlKFN0cmluZyBvcHRpb25WYWx1ZSkgewotICAgICAgICBmb3IgKFN0cmluZyBzIDogQW5kcm9pZENvbnN0YW50cy5DT01QSUxFUl9DT01QTElBTkNFKSB7Ci0gICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIHMuZXF1YWxzKG9wdGlvblZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcGsgZmlsZW5hbWUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIGNvbmZpZyBBbiBvcHRpb25hbCBjb25maWcgbmFtZS4gQ2FuIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBrRmlsZW5hbWUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbmZpZykgewotICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKSArICItIiArIGNvbmZpZyArIEFuZHJvaWRDb25zdGFudHMuRE9UX0FORFJPSURfUEFDS0FHRTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpICsgQW5kcm9pZENvbnN0YW50cy5ET1RfQU5EUk9JRF9QQUNLQUdFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGxpc3Qgb2YgcHJvamVjdHMgb24gd2hpY2ggdGhpcyBKYXZhUHJvamVjdCBpcyBkZXBlbmRlbnQgb24gYXQgdGhlIGNvbXBpbGF0aW9uIGxldmVsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBKYXZhIHByb2plY3QgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IgdGhlIGRlcGVuZGVuY2llcy4KLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBKYXZhIHByb2plY3RzIGZvciB3aGljaCBqYXZhUHJvamVjdCBkZXBlbmQgb24uCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8SUphdmFQcm9qZWN0PiBnZXRBbmRyb2lkUHJvamVjdERlcGVuZGVuY2llcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIAotICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gcmVxdWlyZWRQcm9qZWN0TmFtZXMgPSBqYXZhUHJvamVjdC5nZXRSZXF1aXJlZFByb2plY3ROYW1lcygpOwotICAgIAotICAgICAgICAvLyBHbyBmcm9tIGphdmEgcHJvamVjdCBuYW1lIHRvIEphdmFQcm9qZWN0IG5hbWUKLSAgICAgICAgSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKTsKLSAgICAKLSAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMgYW5kIGtlZXAgb25seSB0aG9zZSB0aGF0IGFyZSBBbmRyb2lkIHByb2plY3RzCi0gICAgICAgIExpc3Q8SUphdmFQcm9qZWN0PiBwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PihyZXF1aXJlZFByb2plY3ROYW1lcy5sZW5ndGgpOwotICAgICAgICBmb3IgKFN0cmluZyBqYXZhUHJvamVjdE5hbWUgOiByZXF1aXJlZFByb2plY3ROYW1lcykgewotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGFuZHJvaWRKYXZhUHJvamVjdCA9IGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChqYXZhUHJvamVjdE5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IHRoZSBwcm9qZWN0IGhhcyBhbHNvIHRoZSBBbmRyb2lkIE5hdHVyZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWRKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvamVjdExpc3QuYWRkKGFuZHJvaWRKYXZhUHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9qZWN0TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbmRyb2lkIHBhY2thZ2UgZmlsZSBhcyBhbiBJRmlsZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBUaGUgYW5kcm9pZCBwYWNrYWdlIGFzIGFuIElGaWxlIG9iamVjdCBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldEFwcGxpY2F0aW9uUGFja2FnZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIGdldCB0aGUgb3V0cHV0IGZvbGRlcgotICAgICAgICBJRm9sZGVyIG91dHB1dExvY2F0aW9uID0gQmFzZVByb2plY3RIZWxwZXIuZ2V0T3V0cHV0Rm9sZGVyKHByb2plY3QpOwotICAgIAotICAgICAgICBpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdGhlIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdC4gQ2hlY2sgYnVpbGQgcGF0aCBwcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgCi0gICAgICAgIC8vIGdldCB0aGUgcGFja2FnZSBwYXRoCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpICsgQW5kcm9pZENvbnN0YW50cy5ET1RfQU5EUk9JRF9QQUNLQUdFOwotICAgICAgICBJUmVzb3VyY2UgciA9IG91dHB1dExvY2F0aW9uLmZpbmRNZW1iZXIocGFja2FnZU5hbWUpOwotICAgIAotICAgICAgICAvLyBjaGVjayB0aGUgcGFja2FnZSBpcyBwcmVzZW50Ci0gICAgICAgIGlmIChyIGluc3RhbmNlb2YgSUZpbGUgJiYgci5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIChJRmlsZSlyOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgZmluZCAlMSRzISIsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUocHJvamVjdCwgbXNnKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvWG1sRXJyb3JIYW5kbGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9YbWxFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3M2Q0OS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9YbWxFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFhNTCBlcnJvciBoYW5kbGVyIHVzZWQgYnkgdGhlIHBhcnNlciB0byByZXBvcnQgZXJyb3JzL3dhcm5pbmdzLgotICovCi1wdWJsaWMgY2xhc3MgWG1sRXJyb3JIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0gICAgLyoqIGZpbGUgYmVpbmcgcGFyc2VkICovCi0gICAgcHJpdmF0ZSBJRmlsZSBtRmlsZTsKLQotICAgIC8qKiBsaW5rIHRvIHRoZSBkZWx0YSB2aXNpdG9yLCB0byBzZXQgdGhlIHhtbCBlcnJvciBmbGFnICovCi0gICAgcHJpdmF0ZSBYbWxFcnJvckxpc3RlbmVyIG1FcnJvckxpc3RlbmVyOwotICAgIAotICAgIC8qKgotICAgICAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgYSBtZXRob2QgdGhhdCBkZWFscwotICAgICAqIHdpdGggWE1MIGVycm9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFhtbEVycm9yTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIGFuIFhNTCBlcnJvciBpcyBkZXRlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yRm91bmQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY1htbEVycm9yTGlzdGVuZXIgaW1wbGVtZW50cyBYbWxFcnJvckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gbUhhc1htbEVycm9yID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvckZvdW5kKCkgewotICAgICAgICAgICAgbUhhc1htbEVycm9yID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFcnJvckhhbmRsZXIoSUZpbGUgZmlsZSwgWG1sRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyKSB7Ci0gICAgICAgIG1GaWxlID0gZmlsZTsKLSAgICAgICAgbUVycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFhtbCBFcnJvciBjYWxsIGJhY2sKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBwYXJzaW5nIGV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZUVycm9yKGV4Y2VwdGlvbiwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogWG1sIEZhdGFsIEVycm9yIGNhbGwgYmFjawotICAgICAqIEBwYXJhbSBleGNlcHRpb24gdGhlIHBhcnNpbmcgZXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVFcnJvcihleGNlcHRpb24sIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFhtbCBXYXJuaW5nIGNhbGwgYmFjawotICAgICAqIEBwYXJhbSBleGNlcHRpb24gdGhlIHBhcnNpbmcgZXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuYWRkTWFya2VyKG1GaWxlLAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLk1BUktFUl9YTUwsCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIElGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtRmlsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHBhcnNpbmcgZXJyb3IgYW5kIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyLgotICAgICAqIEBwYXJhbSBleGNlcHRpb24KLSAgICAgKiBAcGFyYW0gbGluZU51bWJlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBsaW5lTnVtYmVyKSB7Ci0gICAgICAgIGlmIChtRXJyb3JMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JMaXN0ZW5lci5lcnJvckZvdW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZSA9ICJVbmtub3duIGVycm9yICIgKyBleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSAtMSkgewotICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihtRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX1hNTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJhc2VQcm9qZWN0SGVscGVyLmFkZE1hcmtlcihtRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuTUFSS0VSX1hNTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FuZHJvaWRQcm9wZXJ0eVBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9wcm9wZXJ0aWVzL0FuZHJvaWRQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkNjZlOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvcGVydGllcy9BbmRyb2lkUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5BcGtTZXR0aW5nczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzLlNka1RhcmdldFNlbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIFByb3BlcnR5IHBhZ2UgZm9yICJBbmRyb2lkIiBwcm9qZWN0LgotICogVGhpcyBpcyBhY2Nlc3NpYmxlIGZyb20gdGhlIFBhY2thZ2UgRXhwbG9yZXIgd2hlbiByaWdodCBjbGlja2luZyBhIHByb2plY3QgYW5kIGNob29zaW5nCi0gKiAiUHJvcGVydGllcyIuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZFByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBtUHJvamVjdDsKLSAgICBwcml2YXRlIFNka1RhcmdldFNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAvLyBBUEstU1BMSVQ6IFRoaXMgaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvIHdlIGhpZGUgdGhlIFVJCi0vLyAgICBwcml2YXRlIEJ1dHRvbiBtU3BsaXRCeURlbnNpdHk7Ci0KLSAgICBwdWJsaWMgQW5kcm9pZFByb3BlcnR5UGFnZSgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50ICh0aGlzIGlzIG5vdCB5ZXQgdmFsaWQgaW4gdGhlIGNvbnN0cnVjdG9yKS4KLSAgICAgICAgbVByb2plY3QgPSAoSVByb2plY3QpZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBzZGsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gbnVsbDsKLSAgICAgICAgaWYgKFNkay5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0cyA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIFVJLgotICAgICAgICBDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgdG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICB0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLSAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbCh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJQcm9qZWN0IEJ1aWxkIFRhcmdldCIpOwotCi0gICAgICAgIG1TZWxlY3RvciA9IG5ldyBTZGtUYXJnZXRTZWxlY3Rvcih0b3AsIHRhcmdldHMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFQSy1TUExJVDogVGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28gd2UgaGlkZSB0aGUgVUkKLSAgICAgICAgR3JvdXAgZyA9IG5ldyBHcm91cCh0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLSAgICAgICAgZy5zZXRUZXh0KCJBUEsgR2VuZXJhdGlvbiIpOwotCi0gICAgICAgIG1TcGxpdEJ5RGVuc2l0eSA9IG5ldyBCdXR0b24oZywgU1dULkNIRUNLKTsKLSAgICAgICAgbVNwbGl0QnlEZW5zaXR5LnNldFRleHQoIk9uZSBBUEsgcGVyIGRlbnNpdHkiKTsKLQotKi8KLSAgICAgICAgLy8gZmlsbCB0aGUgdWkKLSAgICAgICAgU2RrIGN1cnJlbnRTZGsgPSBTZGsuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsICYmIG1Qcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHRhcmdldAotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gY3VycmVudFNkay5nZXRUYXJnZXQobVByb2plY3QpOwotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFNlbGVjdGlvbih0YXJnZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQVBLLVNQTElUOiBUaGlzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbyB3ZSBoaWRlIHRoZSBVSQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IHNldHRpbmdzCi0gICAgICAgICAgICBBcGtTZXR0aW5ncyBzZXR0aW5ncyA9IGN1cnJlbnRTZGsuZ2V0QXBrU2V0dGluZ3MobVByb2plY3QpOwotICAgICAgICAgICAgbVNwbGl0QnlEZW5zaXR5LnNldFNlbGVjdGlvbihzZXR0aW5ncy5pc1NwbGl0QnlEcGkoKSk7Ci0gICAgICAgICAgICAqLwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yLnNldFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHNlbGVjdGlvbiBhbmQgdmFsaWRhdGUgdGhlIHBhZ2UgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBtU2VsZWN0b3IuZ2V0U2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICBzZXRWYWxpZCh0YXJnZXQgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChtUHJvamVjdC5pc09wZW4oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgdWkuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgU2RrIGN1cnJlbnRTZGsgPSBTZGsuZ2V0Q3VycmVudCgpOwotICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcGtTZXR0aW5ncyBhcGtTZXR0aW5ncyA9IG5ldyBBcGtTZXR0aW5ncygpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFQSy1TUExJVDogVGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28gd2UgaGlkZSB0aGUgVUkKLSAgICAgICAgICAgIGFwa1NldHRpbmdzLnNldFNwbGl0QnlEZW5zaXR5KG1TcGxpdEJ5RGVuc2l0eS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgY3VycmVudFNkay5zZXRQcm9qZWN0KG1Qcm9qZWN0LCBtU2VsZWN0b3IuZ2V0U2VsZWN0ZWQoKSwgYXBrU2V0dGluZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdBY3Rpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9FeHRyYWN0U3RyaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWY5NjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZWZhY3RvcmluZ3MuZXh0cmFjdHN0cmluZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoKLSAqIFF1aWNrIFJlZmVyZW5jZSBMaW5rOgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9hcnRpY2xlLnBocD9maWxlPUFydGljbGUtVW5sZWFzaGluZy10aGUtUG93ZXItb2YtUmVmYWN0b3JpbmcvaW5kZXguaHRtbAotICogYW5kCi0gKiBodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWJyYXJ5L29zLWVjamR0LwotICovCi0KLS8qKgotICogQWN0aW9uIGV4ZWN1dGVkIHdoZW4gdGhlICJFeHRyYWN0IFN0cmluZyIgbWVudSBpdGVtIGlzIGludm9rZWQuCi0gKiA8cC8+Ci0gKiBUaGUgaW50ZW50IG9mIHRoZSBhY3Rpb24gaXMgdG8gc3RhcnQgYSByZWZhY3RvcmluZyB0aGF0IGV4dHJhY3RzIGEgc291cmNlIHN0cmluZyBhbmQKLSAqIHJlcGxhY2VzIGl0IGJ5IGFuIEFuZHJvaWQgc3RyaW5nIHJlc291cmNlIElELgotICogPHAvPgotICogV29ya2Zsb3c6Ci0gKiA8dWw+Ci0gKiA8bGk+IFRoZSBhY3Rpb24gaXMgY3VycmVudGx5IGxvY2F0ZWQgaW4gdGhlIFJlZmFjdG9yaW5nIG1lbnUgaW4gdGhlIG1haW4gbWVudS4KLSAqIDxsaT4gVE9ETzogZXh0ZW5kIHRoZSBwb3B1cCByZWZhY3RvcmluZyBtZW51IGluIGEgSmF2YSBvciBBbmRyb2lkIFhNTCBmaWxlLgotICogPGxpPiBUaGUgYWN0aW9uIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgc2VsZWN0aW9uIGlzIDEgY2hhcmFjdGVyIG9yIG1vcmUuIFRoYXQgaXMgYXQgbGVhc3QgcGFydAotICogICAgIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSBzZWxlY3RlZCwgaXQncyBub3QgZW5vdWdoIHRvIGp1c3QgbW92ZSB0aGUgaW5zZXJ0aW9uIHBvaW50LiBUaGlzIGlzCi0gKiAgICAgYSBsaW1pdGF0aW9uIGR1ZSB0byB7QGxpbmsgI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbil9IG5vdCBiZWluZyBjYWxsZWQgd2hlbgotICogICAgIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgbWVyZWx5IG1vdmVkLiBUT0RPOiBhZGRyZXNzIHRoaXMgbGltaXRhdGlvbi4KLSAqIDx1bD4gVGhlIGFjdGlvbiBnZXRzIHRoZSBjdXJyZW50IHtAbGluayBJU2VsZWN0aW9ufS4gSXQgYWxzbyBrbm93cyB0aGUgY3VycmVudAotICogICAgIHtAbGluayBJV29ya2JlbmNoV2luZG93fS4gSG93ZXZlciBmb3IgdGhlIHJlZmFjdG9yaW5nIHdlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gaGF2aW5nIHRoZQotICogICAgIGFjdHVhbCByZXNvdXJjZSBmaWxlLiBCeSBsb29raW5nIGF0IHRoZSBBY3RpdmUgV2luZG93ID4gQWN0aXZlIFBhZ2UgPiBBY3RpdmUgRWRpdG9yIHdlCi0gKiAgICAgY2FuIGdldCB0aGUge0BsaW5rIElFZGl0b3JJbnB1dH0gYW5kIGZpbmQgdGhlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSAoYWthIEphdmEgZmlsZSkKLSAqICAgICB0aGF0IGlzIGJlaW5nIGVkaXRlZC4KLSAqIDx1bD4gVE9ETzogY2hhbmdlIHRoaXMgdG8gZmluZCB0aGUge0BsaW5rIElGaWxlfSBiZWluZyBtYW5pcHVsYXRlZC4gVGhlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fQotICogICAgIGNhbiBiZSBpbmZlcnJlZCB1c2luZyB7QGxpbmsgSmF2YUNvcmUjY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSl9LiBUaGlzIHdpbGwgYWxsb3cKLSAqICAgICB1cyB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBmcm9tIGFuIEFuZHJvaWQgWE1MIGZpbGUgbGF0ZXIuCi0gKiA8bGk+IFRoZSBhY3Rpb24gY3JlYXRlcyBhIG5ldyB7QGxpbmsgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nfSBhbmQgbWFrZSBpdCBydW4gb24gaW4gYSBuZXcKLSAqICAgICB7QGxpbmsgRXh0cmFjdFN0cmluZ1dpemFyZH0uCi0gKiA8dWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHRyYWN0U3RyaW5nQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCB3aW5kb3cuICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IG1XaW5kb3c7Ci0gICAgcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBtU2VsZWN0aW9uOwotICAgIHByaXZhdGUgSUVkaXRvclBhcnQgbUVkaXRvcjsKLSAgICBwcml2YXRlIElGaWxlIG1GaWxlOwotCi0gICAgLyoqCi0gICAgICogS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCB3b3JrYmVuY2ggd2luZG93LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgbVdpbmRvdyA9IHdpbmRvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhhbWluZSB0aGUgc2VsZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC4KLSAgICAgKiA8cC8+Ci0gICAgICogS2VlcCBhIGxpbmsgdG8gdGhlIHJlbGV2YW50IHNlbGVjdGlvbiBzdHJ1Y3R1cmUgKGkuZS4gYSBwYXJ0IG9mIHRoZSBKYXZhIEFTVCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotICAgICAgICAvLyBOb3RlLCB0d28ga2luZHMgb2Ygc2VsZWN0aW9ucyBhcmUgcmV0dXJuZWQgaGVyZToKLSAgICAgICAgLy8gSVRleHRTZWxlY3Rpb24gb24gYSBKYXZhIHNvdXJjZSB3aW5kb3cKLSAgICAgICAgLy8gSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW4gdGhlIG91dGxpbmUgb3IgbmF2aWdhdG9yCi0gICAgICAgIC8vIFRoaXMgc2ltcGx5IGRlYWxzIHdpdGggdGhlIHJlZmFjdG9yaW5nIGJhc2VkIG9uIGEgbm9uLWVtcHR5IHNlbGVjdGlvbi4KLSAgICAgICAgLy8gQXQgdGhhdCBwb2ludCwganVzdCBlbmFibGUgdGhlIGFjdGlvbiBhbmQgbGF0ZXIgZGVjaWRlIGlmIGl0J3MgdmFsaWQgd2hlbiBpdCBhY3R1YWxseQotICAgICAgICAvLyBydW5zIHNpbmNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBBU1QgeWV0LgotCi0gICAgICAgIG1TZWxlY3Rpb24gPSBudWxsOwotICAgICAgICBtRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGlvbi5nZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtRWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgbUZpbGUgPSBnZXRTZWxlY3RlZEZpbGUobUVkaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhY3Rpb24uc2V0RW5hYmxlZChtU2VsZWN0aW9uICE9IG51bGwgJiYgbUZpbGUgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIG91ciByZWZhY3RvcmluZyBhbmQgYSB3aXphcmQgdG8gY29uZmlndXJlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAobVNlbGVjdGlvbiAhPSBudWxsICYmIG1GaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyByZWYgPSBuZXcgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nKG1GaWxlLCBtRWRpdG9yLCBtU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBFeHRyYWN0U3RyaW5nV2l6YXJkKHJlZiwgbUZpbGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3AucnVuKG1XaW5kb3cuZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJydXB0ZWQuIFBhc3MuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgZWRpdG9yIChob3BlZnVsbHkgbWF0Y2hpbmcgb3VyIHNlbGVjdGlvbikgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3d2luID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgaWYgKHd3aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHd3aW4uZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aXZlIHtAbGluayBJRmlsZX0gKGhvcGVmdWxseSBtYXRjaGluZyBvdXIgc2VsZWN0aW9uKSBvciBudWxsLgotICAgICAqIFRoZSBmaWxlIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQncyBhIGZpbGUgZnJvbSBhIHByb2plY3Qgd2l0aCBhbiBBbmRyb2lkIG5hdHVyZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQXQgdGhhdCBwb2ludCB3ZSBkbyBub3QgdHJ5IHRvIGFuYWx5emUgaWYgdGhlIHNlbGVjdGlvbiBub3IgdGhlIGZpbGUgaXMgc3VpdGFibGUKLSAgICAgKiBmb3IgdGhlIHJlZmFjdG9yaW5nLiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCB3aGVuIHRoZSByZWZhY3RvcmluZyBpcyBpbnZva2VkIHNpbmNlCi0gICAgICogaXQgY2FuIHRoZW4gcHJvZHVjZSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2VzIGFzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElGaWxlIGdldFNlbGVjdGVkRmlsZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAgICAgRmlsZUVkaXRvcklucHV0IGZpID0gKEZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGZpLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvaiAhPSBudWxsICYmIHByb2ouaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdDb250cmlidXRpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9FeHRyYWN0U3RyaW5nQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmQ1MDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZWZhY3RvcmluZ3MuZXh0cmFjdHN0cmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nRGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQHNlZSBFeHRyYWN0U3RyaW5nRGVzY3JpcHRvcgotICovCi1wdWJsaWMgY2xhc3MgRXh0cmFjdFN0cmluZ0NvbnRyaWJ1dGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nQ29udHJpYnV0aW9uIHsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvbnRyaWJ1dGlvbiNjcmVhdGVEZXNjcmlwdG9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5NYXAsIGludCkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVmYWN0b3JpbmdEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICBTdHJpbmcgaWQsCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBjb21tZW50LAotICAgICAgICAgICAgTWFwIGFyZ3VtZW50cywKLSAgICAgICAgICAgIGludCBmbGFncykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRyYWN0U3RyaW5nRGVzY3JpcHRvcihwcm9qZWN0LCBkZXNjcmlwdGlvbiwgY29tbWVudCwgYXJndW1lbnRzKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwIHJldHJpZXZlQXJndW1lbnRNYXAoUmVmYWN0b3JpbmdEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBFeHRyYWN0U3RyaW5nRGVzY3JpcHRvcikgewotICAgICAgICAgICAgcmV0dXJuICgoRXh0cmFjdFN0cmluZ0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldEFyZ3VtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5yZXRyaWV2ZUFyZ3VtZW50TWFwKGRlc2NyaXB0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9FeHRyYWN0U3RyaW5nRGVzY3JpcHRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDczNmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVmYWN0b3JpbmdzLmV4dHJhY3RzdHJpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZGVzY3JpcHRvciB0aGF0IGFsbG93cyBhbiB7QGxpbmsgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nfSB0byBiZSBjcmVhdGVkIGZyb20KLSAqIGEgcHJldmlvdXMgaW5zdGFuY2Ugb2YgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgRXh0cmFjdFN0cmluZ0Rlc2NyaXB0b3IgZXh0ZW5kcyBSZWZhY3RvcmluZ0Rlc2NyaXB0b3IgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnJlZmFjdG9yaW5nLmV4dHJhY3Quc3RyaW5nIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbUFyZ3VtZW50czsKLQotICAgIHB1YmxpYyBFeHRyYWN0U3RyaW5nRGVzY3JpcHRvcihTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgY29tbWVudCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJndW1lbnRzKSB7Ci0gICAgICAgIHN1cGVyKElELCBwcm9qZWN0LCBkZXNjcmlwdGlvbiwgY29tbWVudCwKLSAgICAgICAgICAgICAgICBSZWZhY3RvcmluZ0Rlc2NyaXB0b3IuU1RSVUNUVVJBTF9DSEFOR0UgfCBSZWZhY3RvcmluZ0Rlc2NyaXB0b3IuTVVMVElfQ0hBTkdFIC8vZmxhZ3MKLSAgICAgICAgKTsKLSAgICAgICAgbUFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QXJndW1lbnRzKCkgewotICAgICAgICByZXR1cm4gbUFyZ3VtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlZmFjdG9yaW5nIGluc3RhbmNlIGZvciB0aGlzIHJlZmFjdG9yaW5nIGRlc2NyaXB0b3IgYmFzZWQgb24KLSAgICAgKiBhbiBhcmd1bWVudCBtYXAuIFRoZSBhcmd1bWVudCBtYXAgaXMgY3JlYXRlZCBieSB0aGUgcmVmYWN0b3JpbmcgaXRzZWxmIGluCi0gICAgICoge0BsaW5rIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfQotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIGFwcGFyZW50bHkgdXNlZCB0byByZXBsYXkgYSByZWZhY3RvcmluZy4KLSAgICAgKiAKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlZmFjdG9yaW5nIGNyZWF0ZVJlZmFjdG9yaW5nKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nIHJlZiA9IG5ldyBFeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcobUFyZ3VtZW50cyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVmOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigiRmFpbGVkIHRvIHJlY3JlYXRlIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyBmcm9tIGRlc2NyaXB0b3IiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvRXh0cmFjdFN0cmluZ0lucHV0UGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdJbnB1dFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0ZjhiNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvRXh0cmFjdFN0cmluZ0lucHV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nOwotCi0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRm9sZGVyVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuQ29uZmlndXJhdGlvblNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlVzZXJJbnB1dFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEBzZWUgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nCi0gKi8KLWNsYXNzIEV4dHJhY3RTdHJpbmdJbnB1dFBhZ2UgZXh0ZW5kcyBVc2VySW5wdXRXaXphcmRQYWdlIGltcGxlbWVudHMgSVdpemFyZFBhZ2UgewotCi0gICAgLyoqIExhc3QgcmVzIGZpbGUgcGF0aCB1c2VkLCBzaGFyZWQgYWNyb3NzIHRoZSBzZXNzaW9uIGluc3RhbmNlcyBidXQgc3BlY2lmaWMgdG8gdGhlCi0gICAgICogIGN1cnJlbnQgcHJvamVjdC4gVGhlIGRlZmF1bHQgZm9yIHVua25vd24gcHJvamVjdHMgaXMge0BsaW5rICNERUZBVUxUX1JFU19GSUxFX1BBVEh9LiAqLwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNMYXN0UmVzRmlsZVBhdGggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIC8qKiBUaGUgcHJvamVjdCB3aGVyZSB0aGUgdXNlciBzZWxlY3Rpb24gaGFwcGVuZWQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBtUHJvamVjdDsKLQotICAgIC8qKiBUZXh0IGZpZWxkIHdoZXJlIHRoZSB1c2VyIGVudGVycyB0aGUgbmV3IElEIHRvIGJlIGdlbmVyYXRlZCBvciByZXBsYWNlZCB3aXRoLiAqLwotICAgIHByaXZhdGUgQ29tYm8gbVN0cmluZ0lkQ29tYm87Ci0gICAgLyoqIFRleHQgZmllbGQgd2hlcmUgdGhlIHVzZXIgZW50ZXJzIHRoZSBuZXcgc3RyaW5nIHZhbHVlLiAqLwotICAgIHByaXZhdGUgVGV4dCBtU3RyaW5nVmFsdWVGaWVsZDsKLSAgICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0b3IsIHRvIHNlbGVjdCB0aGUgcmVzb3VyY2UgcGF0aCBvZiB0aGUgWE1MIGZpbGUuICovCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uU2VsZWN0b3IgbUNvbmZpZ1NlbGVjdG9yOwotICAgIC8qKiBUaGUgY29tYm8gdG8gZGlzcGxheSB0aGUgZXhpc3RpbmcgWE1MIGZpbGVzIG9yIGVudGVyIGEgbmV3IG9uZS4gKi8KLSAgICBwcml2YXRlIENvbWJvIG1SZXNGaWxlQ29tYm87Ci0KLSAgICAvKiogUmVnZXggcGF0dGVybiB0byByZWFkIGEgdmFsaWQgcmVzIFhNTCBmaWxlIHBhdGguIEl0IGNoZWNrcyB0aGF0IHRoZSBhcmUgMiBmb2xkZXJzIGFuZAotICAgICAqICBhIGxlYWYgZmlsZSBuYW1lIGVuZGluZyB3aXRoIC54bWwgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFU19YTUxfRklMRV9SRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3Jlcy9bYS16XVthLXpBLVowLTlfLV0rL1teLl0rXFwueG1sIik7ICAvLyROT04tTkxTLTEkCi0gICAgLyoqIEFic29sdXRlIGRlc3RpbmF0aW9uIGZvbGRlciByb290LCBlLmcuICIvcmVzLyIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0ZPTERFUl9BQlMgPQotICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLldTX1JFU09VUkNFUyArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOwotICAgIC8qKiBSZWxhdGl2ZSBkZXN0aW5hdGlvbiBmb2xkZXIgcm9vdCwgZS5nLiAicmVzLyIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0ZPTERFUl9SRUwgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfUkVTT1VSQ0VTICsgQW5kcm9pZENvbnN0YW50cy5XU19TRVA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVNfRklMRV9QQVRIID0gIi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIjsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgWG1sU3RyaW5nRmlsZUhlbHBlciBtWG1sSGVscGVyID0gbmV3IFhtbFN0cmluZ0ZpbGVIZWxwZXIoKTsKLQotCi0gICAgcHVibGljIEV4dHJhY3RTdHJpbmdJbnB1dFBhZ2UoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcigiRXh0cmFjdFN0cmluZ0lucHV0UGFnZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtUHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBVSSBmb3IgdGhlIHJlZmFjdG9yaW5nIHdpemFyZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGF0IHRoYXQgcG9pbnQgdGhlIGluaXRpYWwgY29uZGl0aW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBpbgotICAgICAqIHtAbGluayBFeHRyYWN0U3RyaW5nUmVmYWN0b3Jpbmd9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBjb250ZW50LnNldExheW91dChsYXlvdXQpOwotCi0gICAgICAgIGNyZWF0ZVN0cmluZ0dyb3VwKGNvbnRlbnQpOwotICAgICAgICBjcmVhdGVSZXNGaWxlR3JvdXAoY29udGVudCk7Ci0KLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdG9wIGdyb3VwIHdpdGggdGhlIGZpZWxkIHRvIHJlcGxhY2Ugd2hpY2ggc3RyaW5nIGFuZCBieSB3aGF0Ci0gICAgICogYW5kIGJ5IHdoaWNoIG9wdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudCBBIGNvbXBvc2l0ZSB3aXRoIGEgMS1jb2x1bW4gZ3JpZCBsYXlvdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdHJpbmdHcm91cChDb21wb3NpdGUgY29udGVudCkgewotCi0gICAgICAgIGZpbmFsIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyByZWYgPSBnZXRPdXJSZWZhY3RvcmluZygpOwotCi0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbnRlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGlmIChyZWYuZ2V0TW9kZSgpID09IEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZy5Nb2RlLkVESVRfU09VUkNFKSB7Ci0gICAgICAgICAgICBncm91cC5zZXRUZXh0KCJTdHJpbmcgUmVwbGFjZW1lbnQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyb3VwLnNldFRleHQoIk5ldyBTdHJpbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICAvLyBsaW5lOiBUZXh0ZmllbGQgZm9yIHN0cmluZyB2YWx1ZSAoYmFzZWQgb24gc2VsZWN0aW9uLCBpZiBhbnkpCi0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiJlN0cmluZyIpOwotCi0gICAgICAgIFN0cmluZyBzZWxlY3RlZFN0cmluZyA9IHJlZi5nZXRUb2tlblN0cmluZygpOwotCi0gICAgICAgIG1TdHJpbmdWYWx1ZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuTEVGVCB8IFNXVC5CT1JERVIpOwotICAgICAgICBtU3RyaW5nVmFsdWVGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVN0cmluZ1ZhbHVlRmllbGQuc2V0VGV4dChzZWxlY3RlZFN0cmluZyAhPSBudWxsID8gc2VsZWN0ZWRTdHJpbmcgOiAiIik7ICAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcmVmLnNldE5ld1N0cmluZ1ZhbHVlKG1TdHJpbmdWYWx1ZUZpZWxkLmdldFRleHQoKSk7Ci0KLSAgICAgICAgbVN0cmluZ1ZhbHVlRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0KLSAgICAgICAgLy8gVE9ETyBwcm92aWRlIGFuIG9wdGlvbiB0byByZXBsYWNlIGFsbCBvY2N1cmVuY2VzIG9mIHRoaXMgc3RyaW5nIGluc3RlYWQgb2YKLSAgICAgICAgLy8ganVzdCB0aGUgb25lLgotCi0gICAgICAgIC8vIGxpbmUgOiBUZXh0ZmllbGQgZm9yIG5ldyBJRAotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGlmIChyZWYuZ2V0TW9kZSgpID09IEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZy5Nb2RlLkVESVRfU09VUkNFKSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCImUmVwbGFjZSBieSBSLnN0cmluZy4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZWYuZ2V0TW9kZSgpID09IEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZy5Nb2RlLlNFTEVDVF9ORVdfSUQpIHsKLSAgICAgICAgICAgIGxhYmVsLnNldFRleHQoIk5ldyAmUi5zdHJpbmcuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCJJRCAmUi5zdHJpbmcuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RyaW5nSWRDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULlNJTkdMRSB8IFNXVC5MRUZUIHwgU1dULkJPUkRFUiB8IFNXVC5EUk9QX0RPV04pOwotICAgICAgICBtU3RyaW5nSWRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVN0cmluZ0lkQ29tYm8uc2V0VGV4dChndWVzc0lkKHNlbGVjdGVkU3RyaW5nKSk7Ci0gICAgICAgIG1TdHJpbmdJZENvbWJvLmZvcmNlRm9jdXMoKTsKLQotICAgICAgICByZWYuc2V0TmV3U3RyaW5nSWQobVN0cmluZ0lkQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0KLSAgICAgICAgbVN0cmluZ0lkQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtU3RyaW5nSWRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBsb3dlciBncm91cCB3aXRoIHRoZSBmaWVsZHMgdG8gY2hvb3NlIHRoZSByZXNvdXJjZSBjb25maXJtYXRpb24gYW5kCi0gICAgICogdGhlIHRhcmdldCBYTUwgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IEEgY29tcG9zaXRlIHdpdGggYSAxLWNvbHVtbiBncmlkIGxheW91dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXNGaWxlR3JvdXAoQ29tcG9zaXRlIGNvbnRlbnQpIHsKLQotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChjb250ZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBncm91cC5zZXRUZXh0KCJYTUwgcmVzb3VyY2UgdG8gZWRpdCIpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICAvLyBsaW5lOiBzZWxlY3Rpb24gb2YgdGhlIHJlcyBjb25maWcKLQotICAgICAgICBMYWJlbCBsYWJlbDsKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiJkNvbmZpZ3VyYXRpb246Iik7Ci0KLSAgICAgICAgbUNvbmZpZ1NlbGVjdG9yID0gbmV3IENvbmZpZ3VyYXRpb25TZWxlY3Rvcihncm91cCwgZmFsc2UgLypkZXZpY2VNb2RlKi8pOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZC53aWR0aEhpbnQgPSBDb25maWd1cmF0aW9uU2VsZWN0b3IuV0lEVEhfSElOVDsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IENvbmZpZ3VyYXRpb25TZWxlY3Rvci5IRUlHSFRfSElOVDsKLSAgICAgICAgbUNvbmZpZ1NlbGVjdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBPbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZCBvbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZCA9IG5ldyBPbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZCgpOwotICAgICAgICBtQ29uZmlnU2VsZWN0b3Iuc2V0T25DaGFuZ2VMaXN0ZW5lcihvbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZCk7Ci0KLSAgICAgICAgLy8gbGluZTogc2VsZWN0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZQotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlJlc291cmNlICZmaWxlOiIpOwotCi0gICAgICAgIG1SZXNGaWxlQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04pOwotICAgICAgICBtUmVzRmlsZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgbVJlc0ZpbGVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVJlc0ZpbGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihvbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZCk7Ci0KLSAgICAgICAgLy8gc2V0IG91dHB1dCBmaWxlIG5hbWUgdG8gdGhlIGxhc3Qgb25lIHVzZWQKLQotICAgICAgICBTdHJpbmcgcHJvalBhdGggPSBtUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gc0xhc3RSZXNGaWxlUGF0aC5nZXQocHJvalBhdGgpOwotCi0gICAgICAgIG1SZXNGaWxlQ29tYm8uc2V0VGV4dChmaWxlUGF0aCAhPSBudWxsID8gZmlsZVBhdGggOiBERUZBVUxUX1JFU19GSUxFX1BBVEgpOwotICAgICAgICBvbkNvbmZpZ1NlbGVjdG9yVXBkYXRlZC5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBndWVzcyBhIHN1aXRhYmxlIG5ldyBYTUwgSUQgYmFzZWQgb24gdGhlIHNlbGVjdGVkIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBndWVzc0lkKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2UgbG93ZXIgY2FzZQotICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcgbm90IGFscGhhbnVtZXJpYyBiZWNvbWVzIGFuIHVuZGVyc2NvcmUKLSAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgiW15hLXpBLVowLTldKyIsICJfIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAvLyB0aGUgaWQgbXVzdCBiZSBhIHByb3BlciBKYXZhIGlkZW50aWZpZXIsIHNvIGl0IGNhbid0IHN0YXJ0IHdpdGggYSBudW1iZXIKLSAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwICYmICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRleHQuY2hhckF0KDApKSkgewotICAgICAgICAgICAgdGV4dCA9ICJfIiArIHRleHQ7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZ30gaW5zdGFuY2UgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nIGdldE91clJlZmFjdG9yaW5nKCkgewotICAgICAgICByZXR1cm4gKEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZykgZ2V0UmVmYWN0b3JpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgZmllbGRzIG9mIHRoZSB3aXphcmQgaW5wdXQgcGFnZS4gRGlzcGxheXMgZXJyb3JzIGFzIGFwcHJvcHJpYXRlIGFuZAotICAgICAqIGVuYWJsZSB0aGUgIk5leHQiIGJ1dHRvbiAob3Igbm90KSBieSBjYWxsaW5nIHtAbGluayAjc2V0UGFnZUNvbXBsZXRlKGJvb2xlYW4pfS4KLSAgICAgKgotICAgICAqIElmIHZhbGlkYXRpb24gc3VjY2VlZHMsIHRoaXMgdWRwYXRlcyB0aGUgdGV4dCBpZCAmIHZhbHVlIGluIHRoZSByZWZhY3RvcmluZyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gcG9zaXRpdmVseSB2YWxpZGF0ZWQuIEl0IG1heSBzdGlsbCBoYXZlIHdhcm5pbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7Ci0KLSAgICAgICAgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nIHJlZiA9IGdldE91clJlZmFjdG9yaW5nKCk7Ci0KLSAgICAgICAgLy8gQW5hbHl6ZSBmYXRhbCBlcnJvcnMuCi0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBtU3RyaW5nSWRDb21iby5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIlBsZWFzZSBwcm92aWRlIGEgcmVzb3VyY2UgSUQuIik7Ci0gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gb2sgPSBpID09IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJlc291cmNlIElEIG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuIFRoZSBjaGFyYWN0ZXIgJTEkYyBhdCBwb3NpdGlvbiAlMiRkIGlzIG5vdCBhY2NlcHRhYmxlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgaSsxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZpZWxkIGluIHRoZSByZWZhY3RvcmluZyBvYmplY3QgaW4gY2FzZSBvZiBzdWNjZXNzCi0gICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgIHJlZi5zZXROZXdTdHJpbmdJZCh0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXNGaWxlID0gbVJlc0ZpbGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBpZiAocmVzRmlsZSA9PSBudWxsIHx8IHJlc0ZpbGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiQSByZXNvdXJjZSBmaWxlIG5hbWUgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghUkVTX1hNTF9GSUxFX1JFR0VYLm1hdGNoZXIocmVzRmlsZSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJUaGUgWE1MIGZpbGUgbmFtZSBpcyBub3QgdmFsaWQuIik7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQW5hbHl6ZSBpbmZvICYgd2FybmluZ3MuCi0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgICAgICAgICAgcmVmLnNldFRhcmdldEZpbGUocmVzRmlsZSk7Ci0gICAgICAgICAgICBzTGFzdFJlc0ZpbGVQYXRoLnB1dChtUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSwgcmVzRmlsZSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZFZhbHVlID0gbVhtbEhlbHBlci52YWx1ZU9mU3RyaW5nSWQobVByb2plY3QsIHJlc0ZpbGUsIHRleHQpOwotICAgICAgICAgICAgaWYgKGlkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlMSRzIGFscmVhZHkgY29udGFpbnMgYSBzdHJpbmcgSUQgJyUyJHMnIHdpdGggdmFsdWUgJyUzJHMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkVmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChyZWYuZ2V0TW9kZSgpID09IEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZy5Nb2RlLlNFTEVDVF9ORVdfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKG1zZywgV2l6YXJkUGFnZS5XQVJOSU5HKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Qcm9qZWN0LmZpbmRNZW1iZXIocmVzRmlsZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGaWxlICUyJHMgZG9lcyBub3QgZXhpc3QgYW5kIHdpbGwgYmUgY3JlYXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCByZXNGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZFBhZ2UuSU5GT1JNQVRJT04pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIC8vIEFsc28gdXBkYXRlIHRoZSB0ZXh0IHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KLSAgICAgICAgICAgIHJlZi5zZXROZXdTdHJpbmdWYWx1ZShtU3RyaW5nVmFsdWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHN1Y2Nlc3MpOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RyaW5nVmFsdWVDb21ibygpIHsKLSAgICAgICAgU3RyaW5nIHJlc0ZpbGUgPSBtUmVzRmlsZUNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpZHMgPSBtWG1sSGVscGVyLmdldFJlc0lkc0ZvckZpbGUobVByb2plY3QsIHJlc0ZpbGUpOwotCi0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCB0ZXh0IGZyb20gdGhlIGNvbWJvLCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2hhbmdlIGl0Ci0gICAgICAgIFN0cmluZyBjdXJyVGV4dCA9IG1TdHJpbmdJZENvbWJvLmdldFRleHQoKTsKLQotICAgICAgICAvLyBlcmFzZSB0aGUgY2hvaWNlcyBhbmQgZmlsbCB3aXRoIHRoZSBnaXZlbiBpZHMKLSAgICAgICAgbVN0cmluZ0lkQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1TdHJpbmdJZENvbWJvLnNldEl0ZW1zKGlkcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbaWRzLnNpemUoKV0pKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgdGV4dCB0byBwcmVzZXJ2ZSBpdCBpbiBjYXNlIGl0IGNoYW5nZWQKLSAgICAgICAgaWYgKCFjdXJyVGV4dC5lcXVhbHMobVN0cmluZ0lkQ29tYm8uZ2V0VGV4dCgpKSkgewotICAgICAgICAgICAgbVN0cmluZ0lkQ29tYm8uc2V0VGV4dChjdXJyVGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgT25Db25maWdTZWxlY3RvclVwZGF0ZWQgaW1wbGVtZW50cyBSdW5uYWJsZSwgTW9kaWZ5TGlzdGVuZXIgewotCi0gICAgICAgIC8qKiBSZWdleCBwYXR0ZXJuIHRvIHBhcnNlIGEgdmFsaWQgcmVzIHBhdGg6IGl0IHJlYWRzICgvcmVzL2ZvbGRlci1uYW1lLykrKGZpbGVuYW1lKS4gKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1QYXRoUmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiKC9yZXMvW2Etel1bYS16QS1aMC05Xy1dKy8pKC4rKSIpOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8qKiBUZW1wb3JhcnkgY29uZmlnIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBDb25maWcgU2VsZWN0b3IgdmFsdWUuICovCi0gICAgICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBtVGVtcENvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgVHJlZVNldDxTdHJpbmc+PiBtRm9sZGVyQ2FjaGUgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlU2V0PFN0cmluZz4+KCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0Rm9sZGVyVXNlZEluQ29tYm8gPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsQ29uZmlnQ2hhbmdlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsRmlsZUNvbWJvQ2hhbmdlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHtAbGluayBDb25maWd1cmF0aW9uU2VsZWN0b3J9IGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogVGhlIGNhbGxiYWNrIGRvZXMgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+IEV4YW1pbmUgdGhlIGN1cnJlbnQgZmlsZSBuYW1lIHRvIHJldHJpZXZlIHRoZSBYTUwgZmlsZW5hbWUsIGlmIGFueS4KLSAgICAgICAgICogPGxpPiBSZWNvbXB1dGUgdGhlIHBhdGggYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0b3IgKGUuZy4gL3Jlcy92YWx1ZXMtZnIvKS4KLSAgICAgICAgICogPGxpPiBFeGFtaW5lIHRoZSBwYXRoIHRvIHJldHJpZXZlIGFsbCB0aGUgZmlsZXMgaW4gaXQuIEtlZXAgdGhvc2UgaW4gYSBsb2NhbCBjYWNoZS4KLSAgICAgICAgICogPGxpPiBJZiB0aGUgWE1MIGZpbGVuYW1lIGZyb20gc3RlcCAxIGlzIG5vdCBpbiB0aGUgZmlsZSBsaXN0LCBpdCdzIGEgY3VzdG9tIGZpbGUgbmFtZS4KLSAgICAgICAgICogICAgICBJbnNlcnQgaXQgYW5kIHNvcnQgaXQuCi0gICAgICAgICAqIDxsaT4gUmUtcG9wdWxhdGUgdGhlIGZpbGUgY29tYm8gd2l0aCBhbGwgdGhlIGNob2ljZXMuCi0gICAgICAgICAqIDxsaT4gU2VsZWN0IHRoZSBvcmlnaW5hbCBYTUwgZmlsZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtSW50ZXJuYWxDb25maWdDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IGxlYWZuYW1lLCBpZiBhbnkKLSAgICAgICAgICAgIFN0cmluZyBsZWFmTmFtZSA9ICIiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIGN1cnJQYXRoID0gbVJlc0ZpbGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBNYXRjaGVyIG0gPSBtUGF0aFJlZ2V4Lm1hdGNoZXIoY3VyclBhdGgpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogZ3JvdXBzIDEgYW5kIDIgY2Fubm90IGJlIG51bGwuCi0gICAgICAgICAgICAgICAgbGVhZk5hbWUgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIGN1cnJQYXRoID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgd2FzIGEgcGF0aCBidXQgaXQgd2FzIGludmFsaWQuIElnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICBjdXJyUGF0aCA9ICIiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWNyZWF0ZSB0aGUgcmVzIHBhdGggZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBtQ29uZmlnU2VsZWN0b3IuZ2V0Q29uZmlndXJhdGlvbihtVGVtcENvbmZpZyk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFJFU19GT0xERVJfQUJTKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtVGVtcENvbmZpZy5nZXRGb2xkZXJOYW1lKFJlc291cmNlRm9sZGVyVHlwZS5WQUxVRVMsIG1Qcm9qZWN0KSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJy8nKTsKLQotICAgICAgICAgICAgU3RyaW5nIG5ld1BhdGggPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKG5ld1BhdGguZXF1YWxzKGN1cnJQYXRoKSAmJiBuZXdQYXRoLmVxdWFscyhtTGFzdEZvbGRlclVzZWRJbkNvbWJvKSkgewotICAgICAgICAgICAgICAgIC8vIFBhdGggaGFzIG5vdCBjaGFuZ2VkLiBObyBuZWVkIHRvIHJlbG9hZC4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGZpbGVzIGF0IHRoZSBuZXcgcGF0aAotCi0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gZmlsZVBhdGhzID0gbUZvbGRlckNhY2hlLmdldChuZXdQYXRoKTsKLQotICAgICAgICAgICAgaWYgKGZpbGVQYXRocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlsZVBhdGhzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIgPSBtUHJvamVjdC5nZXRGb2xkZXIobmV3UGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvbGRlciAhPSBudWxsICYmIGZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzIDogZm9sZGVyLm1lbWJlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBuYW1lLmVuZHNXaXRoKCIueG1sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGhzLmFkZChuZXdQYXRoICsgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1Gb2xkZXJDYWNoZS5wdXQobmV3UGF0aCwgZmlsZVBhdGhzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VyclBhdGggPSBuZXdQYXRoICsgbGVhZk5hbWU7Ci0gICAgICAgICAgICBpZiAobGVhZk5hbWUubGVuZ3RoKCkgPiAwICYmICFmaWxlUGF0aHMuY29udGFpbnMoY3VyclBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgZmlsZVBhdGhzLmFkZChjdXJyUGF0aCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpbGwgdGhlIGNvbWJvCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1JbnRlcm5hbEZpbGVDb21ib0NoYW5nZSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBtUmVzRmlsZUNvbWJvLnJlbW92ZUFsbCgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZVBhdGggOiBmaWxlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc0ZpbGVDb21iby5hZGQoZmlsZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChsZWFmTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtUmVzRmlsZUNvbWJvLmluZGV4T2YoY3VyclBhdGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc0ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNGaWxlQ29tYm8uc2V0VGV4dChjdXJyUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUxhc3RGb2xkZXJVc2VkSW5Db21ibyA9IG5ld1BhdGg7Ci0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsRmlsZUNvbWJvQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZpbmFsbHkgdmFsaWRhdGUgdGhlIHdob2xlIHBhZ2UKLSAgICAgICAgICAgIHVwZGF0ZVN0cmluZ1ZhbHVlQ29tYm8oKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiB7QGxpbmsgRXh0cmFjdFN0cmluZ0lucHV0UGFnZSNtUmVzRmlsZUNvbWJvfSBoYXMgYmVlbgotICAgICAgICAgKiBtb2RpZmllZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKG1JbnRlcm5hbEZpbGVDb21ib0NoYW5nZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHdzRm9sZGVyUGF0aCA9IG1SZXNGaWxlQ29tYm8uZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgY3VzdG9tIHBhdGgsIHdlIG5lZWQgdG8gc2FuaXRpemUgaXQuCi0gICAgICAgICAgICAvLyBGaXJzdCBpdCBzaG91bGQgc3RhcnQgd2l0aCAiL3Jlcy8iLiBUaGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubwotICAgICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aHMsIHRoaW5ncyBsaWtlICIuLi8iIG9yICIuLyIgb3IgZXZlbiAiLy8iLgotICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gd3NGb2xkZXJQYXRoLnJlcGxhY2VBbGwoIi8rXFwuXFwuLyt8LytcXC4vK3wvLyt8XFxcXCt8Xi8rIiwgIi8iKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gd3NGb2xkZXJQYXRoLnJlcGxhY2VBbGwoIl5cXC5cXC4vK3xeXFwuLysiLCAiIik7ICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gd3NGb2xkZXJQYXRoLnJlcGxhY2VBbGwoIi8rXFwuXFwuJHwvK1xcLiR8LyskIiwgIiIpOyAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgICAgICAvLyBXZSBnZXQgInJlcy9mb28iIGZyb20gc2VsZWN0aW9ucyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCB3aGVuIHdlIHdhbnQgYSAiL3Jlcy9mb28iIHBhdGguCi0gICAgICAgICAgICBpZiAod3NGb2xkZXJQYXRoLnN0YXJ0c1dpdGgoUkVTX0ZPTERFUl9SRUwpKSB7Ci0gICAgICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gUkVTX0ZPTERFUl9BQlMgKyB3c0ZvbGRlclBhdGguc3Vic3RyaW5nKFJFU19GT0xERVJfUkVMLmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIG1JbnRlcm5hbEZpbGVDb21ib0NoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVJlc0ZpbGVDb21iby5zZXRUZXh0KHdzRm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsRmlsZUNvbWJvQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3c0ZvbGRlclBhdGguc3RhcnRzV2l0aChSRVNfRk9MREVSX0FCUykpIHsKLSAgICAgICAgICAgICAgICB3c0ZvbGRlclBhdGggPSB3c0ZvbGRlclBhdGguc3Vic3RyaW5nKFJFU19GT0xERVJfQUJTLmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIGludCBwb3MgPSB3c0ZvbGRlclBhdGguaW5kZXhPZihBbmRyb2lkQ29uc3RhbnRzLldTX1NFUF9DSEFSKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gd3NGb2xkZXJQYXRoLnN1YnN0cmluZygwLCBwb3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzID0gd3NGb2xkZXJQYXRoLnNwbGl0KEZvbGRlckNvbmZpZ3VyYXRpb24uUVVBTElGSUVSX1NFUCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9sZGVyU2VnbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGZvbGRlclNlZ21lbnRzWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXJOYW1lICE9IG51bGwgJiYgIWZvbGRlck5hbWUuZXF1YWxzKHdzRm9sZGVyUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25maWcgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbENvbmZpZ0NoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnU2VsZWN0b3Iuc2V0Q29uZmlndXJhdGlvbihmb2xkZXJTZWdtZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxDb25maWdDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlU3RyaW5nVmFsdWVDb21ibygpOwotICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9FeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9FeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZjM1NS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuQW5kcm9pZEVkaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlJlZmVyZW5jZUF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUF0dHJpYnV0ZU5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkltcG9ydFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDaGFuZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRFZGl0Q2hhbmdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyByZWZhY3RvcmluZyBleHRyYWN0cyBhIHN0cmluZyBmcm9tIGEgZmlsZSBhbmQgcmVwbGFjZXMgaXQgYnkgYW4gQW5kcm9pZCByZXNvdXJjZSBJRAotICogc3VjaCBhcyBSLnN0cmluZy5mb28uCi0gKiA8cC8+Ci0gKiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygc2NlbmFyaW9zLCB3aGljaCBhcmUgbm90IGFsbCBzdXBwb3J0ZWQgeWV0LiBUaGUgd29ya2Zsb3cgd29ya3MgYXMKLSAqIHN1Y2g6Ci0gKiA8dWw+Ci0gKiA8bGk+IFVzZXIgc2VsZWN0cyBhIHN0cmluZyBpbiBhIEphdmEgKFRPRE86IG9yIFhNTCBmaWxlKSBhbmQgaW52b2tlcwotICogICAgICB0aGUge0BsaW5rIEV4dHJhY3RTdHJpbmdBY3Rpb259LgotICogPGxpPiBUaGUgYWN0aW9uIGZpbmRzIHRoZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gYmVpbmcgZWRpdGVkIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAqICAgICAge0BsaW5rIElUZXh0U2VsZWN0aW9ufS4gVGhlIGFjdGlvbiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVmYWN0b3JpbmcgYXMKLSAqICAgICAgd2VsbCBhcyBhbiB7QGxpbmsgRXh0cmFjdFN0cmluZ1dpemFyZH0gYW5kIHJ1bnMgdGhlIG9wZXJhdGlvbi4KLSAqIDxsaT4gU3RlcCAxIG9mIHRoZSByZWZhY3RvcmluZyBpcyB0byBjaGVjayB0aGUgcHJlbGltaW5hcnkgY29uZGl0aW9ucy4gUmlnaHQgbm93IHdlIGNoZWNrCi0gKiAgICAgIHRoYXQgdGhlIGphdmEgc291cmNlIGlzIG5vdCByZWFkLW9ubHkgYW5kIGlzIGluIHN5bmMuIFdlIGFsc28gdHJ5IHRvIGZpbmQgYSBzdHJpbmcgdW5kZXIKLSAqICAgICAgdGhlIHNlbGVjdGlvbi4gSWYgdGhpcyBmYWlscywgdGhlIHJlZmFjdG9yaW5nIGlzIGFib3J0ZWQuCi0gKiA8bGk+IFRPRE86IEZpbmQgdGhlIHN0cmluZyBpbiBhbiBYTUwgZmlsZSBiYXNlZCBvbiBzZWxlY3Rpb24uCi0gKiA8bGk+IE9uIHN1Y2Nlc3MsIHRoZSB3aXphcmQgaXMgc2hvd24sIHdoaWNoIGxldCB0aGUgdXNlciBpbnB1dCB0aGUgbmV3IElEIHRvIHVzZS4KLSAqIDxsaT4gVGhlIHdpemFyZCBzZXRzIHRoZSB1c2VyIGlucHV0IHZhbHVlcyBpbnRvIHRoaXMgcmVmYWN0b3JpbmcgaW5zdGFuY2UsIGUuZy4gdGhlIG5ldyBzdHJpbmcKLSAqICAgICAgSUQsIHRoZSBYTUwgZmlsZSB0byB1cGRhdGUsIGV0Yy4gVGhlIHdpemFyZCBkb2VzIHVzZSB0aGUgdXRpbGl0eSBtZXRob2QKLSAqICAgICAge0BsaW5rIFhtbFN0cmluZ0ZpbGVIZWxwZXIjdmFsdWVPZlN0cmluZ0lkKElQcm9qZWN0LCBTdHJpbmcsIFN0cmluZyl9IHRvIGNoZWNrIHdoZXRoZXIKLSAqICAgICAgdGhlIG5ldyBJRCBpcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHRhcmdldCBYTUwgZmlsZS4KLSAqIDxsaT4gT25jZSBQcmV2aWV3IG9yIEZpbmlzaCBpcyBzZWxlY3RlZCBpbiB0aGUgd2l6YXJkLCB0aGUKLSAqICAgICAge0BsaW5rICNjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yKX0gaXMgY2FsbGVkIHRvIGRvdWJsZS1jaGVjayB0aGUgdXNlciBpbnB1dAotICogICAgICBhbmQgY29tcHV0ZSB0aGUgYWN0dWFsIGNoYW5nZXMuCi0gKiA8bGk+IFdoZW4gYWxsIGNoYW5nZXMgYXJlIGNvbXB1dGVkLCB7QGxpbmsgI2NyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yKX0gaXMgaW52b2tlZC4KLSAqIDwvdWw+Ci0gKgotICogVGhlIGxpc3Qgb2YgY2hhbmdlcyBhcmU6Ci0gKiA8dWw+Ci0gKiA8bGk+IElmIHRoZSB0YXJnZXQgWE1MIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgd2l0aCB0aGUgbmV3IHN0cmluZyBJRC4KLSAqIDxsaT4gSWYgdGhlIHRhcmdldCBYTUwgZXhpc3RzLCBmaW5kIHRoZSA8cmVzb3VyY2VzPiBub2RlIGFuZCBhZGQgdGhlIG5ldyBzdHJpbmcgSUQgcmlnaHQgYWZ0ZXIuCi0gKiAgICAgIElmIHRoZSBub2RlIGlzIDxyZXNvdXJjZXMvPiwgaXQgbmVlZHMgdG8gYmUgb3BlbmVkLgotICogPGxpPiBDcmVhdGUgYW4gQVNUIHJld3JpdGVyIHRvIGVkaXQgdGhlIHNvdXJjZSBKYXZhIGZpbGUgYW5kIHJlcGxhY2UgYWxsIG9jY3VyZW5jZXMgYnkgdGhlCi0gKiAgICAgIG5ldyBjb21wdXRlZCBSLnN0cmluZy5mb28uIEFsc28gbmVlZCB0byByZXdyaXRlIGltcG9ydHMgdG8gaW1wb3J0IFIgYXMgbmVlZGVkLgotICogICAgICBJZiB0aGVyZSdzIGFscmVhZHkgYSBjb25mbGljdGluZyBSIGluY2x1ZGVkLCB3ZSBuZWVkIHRvIGluc2VydCB0aGUgRlFDTiBpbnN0ZWFkLgotICogPGxpPiBUT0RPOiBIYXZlIGEgcHJlZiBpbiB0aGUgd2l6YXJkOiBbeF0gQ2hhbmdlIG90aGVyIFhNTCBGaWxlcwotICogPGxpPiBUT0RPOiBIYXZlIGEgcHJlZiBpbiB0aGUgd2l6YXJkOiBbeF0gQ2hhbmdlIG90aGVyIEphdmEgRmlsZXMKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcgZXh0ZW5kcyBSZWZhY3RvcmluZyB7Ci0KLSAgICBwdWJsaWMgZW51bSBNb2RlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHRoZSBFeHRyYWN0IFN0cmluZyByZWZhY3RvcmluZyBpcyBjYWxsZWQgb24gYW4gPGVtPmV4aXN0aW5nPC9lbT4gc291cmNlIGZpbGUuCi0gICAgICAgICAqIEl0cyBwdXJwb3NlIGlzIHRoZW4gdG8gZ2V0IHRoZSBzZWxlY3RlZCBzdHJpbmcgb2YgdGhlIHNvdXJjZSBhbmQgcHJvcG9zZSB0bwotICAgICAgICAgKiBjaGFuZ2UgaXQgYnkgYW4gWE1MIGlkLiBUaGUgWE1MIGlkIG1heSBiZSBhIG5ldyBvbmUgb3IgYW4gZXhpc3Rpbmcgb25lLgotICAgICAgICAgKi8KLSAgICAgICAgRURJVF9TT1VSQ0UsCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXh0cmFjdCBTdHJpbmcgcmVmYWN0b3JpbmcgaXMgY2FsbGVkIHdpdGhvdXQgYW55IHNvdXJjZSBmaWxlLgotICAgICAgICAgKiBJdHMgcHVycG9zZSBpcyB0aGVuIHRvIGNyZWF0ZSBhIG5ldyBYTUwgc3RyaW5nIElEIG9yIHNlbGVjdC9tb2RpZnkgYW4gZXhpc3Rpbmcgb25lLgotICAgICAgICAgKi8KLSAgICAgICAgU0VMRUNUX0lELAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEV4dHJhY3QgU3RyaW5nIHJlZmFjdG9yaW5nIGlzIGNhbGxlZCB3aXRob3V0IGFueSBzb3VyY2UgZmlsZS4KLSAgICAgICAgICogSXRzIHB1cnBvc2UgaXMgdGhlbiB0byBjcmVhdGUgYSBuZXcgWE1MIHN0cmluZyBJRC4gVGhlIElEIG11c3Qgbm90IGFscmVhZHkgZXhpc3QuCi0gICAgICAgICAqLwotICAgICAgICBTRUxFQ1RfTkVXX0lECi0gICAgfQotCi0gICAgLyoqIFRoZSB7QGxpbmsgTW9kZX0gb2Ygb3BlcmF0aW9uIG9mIHRoZSByZWZhY3RvcmluZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1vZGUgbU1vZGU7Ci0gICAgLyoqIE5vbi1udWxsIHdoZW4gZWRpdGluZyBhbiBBbmRyb2lkIFJlc291cmNlIFhNTCBmaWxlOiBpZGVudGlmaWVzIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIG9mIHRoZSB2YWx1ZSBiZWluZyBlZGl0ZWQuIFdoZW4gbnVsbCwgdGhlIHNvdXJjZSBpcyBhbiBBbmRyb2lkIEphdmEgZmlsZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtWG1sQXR0cmlidXRlTmFtZTsKLSAgICAvKiogVGhlIGZpbGUgbW9kZWwgYmVpbmcgbWFuaXB1bGF0ZWQuCi0gICAgICogVmFsdWUgaXMgbnVsbCB3aGVuIG5vdCBvbiB7QGxpbmsgTW9kZSNFRElUX1NPVVJDRX0gbW9kZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIElGaWxlIG1GaWxlOwotICAgIC8qKiBUaGUgZWRpdG9yLiBOb24tbnVsbCB3aGVuIGludm9rZWQgZnJvbSB7QGxpbmsgRXh0cmFjdFN0cmluZ0FjdGlvbn0uIE51bGwgb3RoZXJ3aXNlLiAqLwotICAgIHByaXZhdGUgZmluYWwgSUVkaXRvclBhcnQgbUVkaXRvcjsKLSAgICAvKiogVGhlIHByb2plY3QgdGhhdCBjb250YWlucyB7QGxpbmsgI21GaWxlfSBhbmQgdGhhdCBjb250YWlucyB0aGUgdGFyZ2V0IFhNTCBmaWxlIHRvIG1vZGlmeS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIC8qKiBUaGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBpbiB7QGxpbmsgI21GaWxlfS4KLSAgICAgKiBWYWx1ZSBpcyAtMSB3aGVuIG5vdCBvbiB7QGxpbmsgTW9kZSNFRElUX1NPVVJDRX0gbW9kZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBtU2VsZWN0aW9uU3RhcnQ7Ci0gICAgLyoqIFRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpbiB7QGxpbmsgI21GaWxlfS4KLSAgICAgKiBWYWx1ZSBpcyAtMSB3aGVuIG5vdCBvbiB7QGxpbmsgTW9kZSNFRElUX1NPVVJDRX0gbW9kZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBtU2VsZWN0aW9uRW5kOwotCi0gICAgLyoqIFRoZSBjb21waWxhdGlvbiB1bml0LCBvbmx5IGRlZmluZWQgaWYge0BsaW5rICNtRmlsZX0gcG9pbnRzIHRvIGEgdXNhYmxlIEphdmEgc291cmNlIGZpbGUuICovCi0gICAgcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IG1Vbml0OwotICAgIC8qKiBUaGUgYWN0dWFsIHN0cmluZyBzZWxlY3RlZCwgYWZ0ZXIgVVRGIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIGVzY2FwZWQsIGdvb2QgZm9yIGRpc3BsYXkuCi0gICAgICogVmFsdWUgaXMgbnVsbCB3aGVuIG5vdCBvbiB7QGxpbmsgTW9kZSNFRElUX1NPVVJDRX0gbW9kZS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVG9rZW5TdHJpbmc7Ci0KLSAgICAvKiogVGhlIFhNTCBzdHJpbmcgSUQgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIHdpemFyZC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtWG1sU3RyaW5nSWQ7Ci0gICAgLyoqIFRoZSBYTUwgc3RyaW5nIHZhbHVlLiBNaWdodCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgaW5pdGlhbCBzZWxlY3RlZCBzdHJpbmcuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVhtbFN0cmluZ1ZhbHVlOwotICAgIC8qKiBUaGUgcGF0aCBvZiB0aGUgWE1MIGZpbGUgdGhhdCB3aWxsIGRlZmluZSB7QGxpbmsgI21YbWxTdHJpbmdJZH0sIHNlbGVjdGVkIGJ5IHRoZSB1c2VyCi0gICAgICogIGluIHRoZSB3aXphcmQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldFhtbEZpbGVXc1BhdGg7Ci0KLSAgICAvKiogVGhlIGxpc3Qgb2YgY2hhbmdlcyBjb21wdXRlZCBieSB7QGxpbmsgI2NoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IpfSBhbmQKLSAgICAgKiAgdXNlZCBieSB7QGxpbmsgI2NyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yKX0uICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8Q2hhbmdlPiBtQ2hhbmdlczsKLQotICAgIHByaXZhdGUgWG1sU3RyaW5nRmlsZUhlbHBlciBtWG1sSGVscGVyID0gbmV3IFhtbFN0cmluZ0ZpbGVIZWxwZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTU9ERSA9ICJtb2RlIjsgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZJTEUgPSAiZmlsZSI7ICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUk9KRUNUID0gInByb2oiOyAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMX1NUQVJUID0gInNlbC1zdGFydCI7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTF9FTkQgPSAic2VsLWVuZCI7ICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UT0tfRVNDID0gInRvay1lc2MiOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWE1MX0FUVFJfTkFNRSA9ICJ4bWwtYXR0ci1uYW1lIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nKE1hcDxTdHJpbmcsIFN0cmluZz4gYXJndW1lbnRzKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gewotICAgICAgICBtTW9kZSA9IE1vZGUudmFsdWVPZihhcmd1bWVudHMuZ2V0KEtFWV9NT0RFKSk7Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKGFyZ3VtZW50cy5nZXQoS0VZX1BST0pFQ1QpKTsKLSAgICAgICAgbVByb2plY3QgPSAoSVByb2plY3QpIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTW9kZS5FRElUX1NPVVJDRSkgewotICAgICAgICAgICAgcGF0aCA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKGFyZ3VtZW50cy5nZXQoS0VZX0ZJTEUpKTsKLSAgICAgICAgICAgIG1GaWxlID0gKElGaWxlKSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0KLSAgICAgICAgICAgIG1TZWxlY3Rpb25TdGFydCA9IEludGVnZXIucGFyc2VJbnQoYXJndW1lbnRzLmdldChLRVlfU0VMX1NUQVJUKSk7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uRW5kICAgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3VtZW50cy5nZXQoS0VZX1NFTF9FTkQpKTsKLSAgICAgICAgICAgIG1Ub2tlblN0cmluZyAgICA9IGFyZ3VtZW50cy5nZXQoS0VZX1RPS19FU0MpOwotICAgICAgICAgICAgbVhtbEF0dHJpYnV0ZU5hbWUgPSBhcmd1bWVudHMuZ2V0KEtFWV9YTUxfQVRUUl9OQU1FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaWxlID0gbnVsbDsKLSAgICAgICAgICAgIG1TZWxlY3Rpb25TdGFydCA9IG1TZWxlY3Rpb25FbmQgPSAtMTsKLSAgICAgICAgICAgIG1Ub2tlblN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICBtWG1sQXR0cmlidXRlTmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBtRWRpdG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlQXJndW1lbnRNYXAoKSB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgYXJncy5wdXQoS0VZX01PREUsICAgICAgbU1vZGUubmFtZSgpKTsKLSAgICAgICAgYXJncy5wdXQoS0VZX1BST0pFQ1QsICAgbVByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotICAgICAgICBpZiAobU1vZGUgPT0gTW9kZS5FRElUX1NPVVJDRSkgewotICAgICAgICAgICAgYXJncy5wdXQoS0VZX0ZJTEUsICAgICAgbUZpbGUuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotICAgICAgICAgICAgYXJncy5wdXQoS0VZX1NFTF9TVEFSVCwgSW50ZWdlci50b1N0cmluZyhtU2VsZWN0aW9uU3RhcnQpKTsKLSAgICAgICAgICAgIGFyZ3MucHV0KEtFWV9TRUxfRU5ELCAgIEludGVnZXIudG9TdHJpbmcobVNlbGVjdGlvbkVuZCkpOwotICAgICAgICAgICAgYXJncy5wdXQoS0VZX1RPS19FU0MsICAgbVRva2VuU3RyaW5nKTsKLSAgICAgICAgICAgIGFyZ3MucHV0KEtFWV9YTUxfQVRUUl9OQU1FLCBtWG1sQXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gdGhlIEV4dHJhY3QgU3RyaW5nIHJlZmFjdG9yaW5nIGlzIGNhbGxlZCBvbiBhbgotICAgICAqICpleGlzdGluZyogc291cmNlIGZpbGUuIEl0cyBwdXJwb3NlIGlzIHRoZW4gdG8gZ2V0IHRoZSBzZWxlY3RlZCBzdHJpbmcgb2YKLSAgICAgKiB0aGUgc291cmNlIGFuZCBwcm9wb3NlIHRvIGNoYW5nZSBpdCBieSBhbiBYTUwgaWQuIFRoZSBYTUwgaWQgbWF5IGJlIGEgbmV3IG9uZQotICAgICAqIG9yIGFuIGV4aXN0aW5nIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBzb3VyY2UgZmlsZSB0byBwcm9jZXNzLiBDYW5ub3QgYmUgbnVsbC4gRmlsZSBtdXN0IGV4aXN0IGluIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gZWRpdG9yCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbiBUaGUgc2VsZWN0aW9uIGluIHRoZSBzb3VyY2UgZmlsZS4gQ2Fubm90IGJlIG51bGwgb3IgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyhJRmlsZSBmaWxlLCBJRWRpdG9yUGFydCBlZGl0b3IsIElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBtTW9kZSA9IE1vZGUuRURJVF9TT1VSQ0U7Ci0gICAgICAgIG1GaWxlID0gZmlsZTsKLSAgICAgICAgbUVkaXRvciA9IGVkaXRvcjsKLSAgICAgICAgbVByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLSAgICAgICAgbVNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpOwotICAgICAgICBtU2VsZWN0aW9uRW5kID0gbVNlbGVjdGlvblN0YXJ0ICsgTWF0aC5tYXgoMCwgc2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gdGhlIEV4dHJhY3QgU3RyaW5nIHJlZmFjdG9yaW5nIGlzIGNhbGxlZCB3aXRob3V0Ci0gICAgICogYW55IHNvdXJjZSBmaWxlLiBJdHMgcHVycG9zZSBpcyB0aGVuIHRvIGNyZWF0ZSBhIG5ldyBYTUwgc3RyaW5nIElELgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3Qgd2hlcmUgdGhlIHRhcmdldCBYTUwgZmlsZSB0byBtb2RpZnkgaXMgbG9jYXRlZC4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGVuZm9yY2VOZXcgSWYgdHJ1ZSB0aGUgWE1MIElEIG11c3QgYmUgYSBuZXcgb25lLiBJZiBmYWxzZSwgYW4gZXhpc3RpbmcgSUQgY2FuIGJlCi0gICAgICogIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyhJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGVuZm9yY2VOZXcpIHsKLSAgICAgICAgbU1vZGUgPSBlbmZvcmNlTmV3ID8gTW9kZS5TRUxFQ1RfTkVXX0lEIDogTW9kZS5TRUxFQ1RfSUQ7Ci0gICAgICAgIG1GaWxlID0gbnVsbDsKLSAgICAgICAgbUVkaXRvciA9IG51bGw7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgbVNlbGVjdGlvblN0YXJ0ID0gbVNlbGVjdGlvbkVuZCA9IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmcjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICBpZiAobU1vZGUgPT0gTW9kZS5TRUxFQ1RfSUQpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ3JlYXRlIG9yIFVTZSBBbmRyb2lkIFN0cmluZyI7Ci0gICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTW9kZS5TRUxFQ1RfTkVXX0lEKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNyZWF0ZSBOZXcgQW5kcm9pZCBTdHJpbmciOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJFeHRyYWN0IEFuZHJvaWQgU3RyaW5nIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTW9kZSBnZXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWN0dWFsIHN0cmluZyBzZWxlY3RlZCwgYWZ0ZXIgVVRGIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIGVzY2FwZWQsCi0gICAgICogZ29vZCBmb3IgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbVRva2VuU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sU3RyaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBtWG1sU3RyaW5nSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RlcCAxIG9mIDMgb2YgdGhlIHJlZmFjdG9yaW5nOgotICAgICAqIENoZWNrcyB0aGF0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtZWV0cyB0aGUgaW5pdGlhbCBjb25kaXRpb24gYmVmb3JlIHRoZSBFeHRyYWN0U3RyaW5nCi0gICAgICogd2l6YXJkIGlzIHNob3duLiBUaGUgY2hlY2sgaXMgc3VwcG9zZWQgdG8gYmUgbGlnaHR3ZWlnaHQgYW5kIHF1aWNrLiBOb3RlIHRoYXQgYXQgdGhhdAotICAgICAqIHBvaW50IHRoZSB3aXphcmQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgotICAgICAqIDxwLz4KLSAgICAgKiBIZXJlIHdlIHNjYW4gdGhlIHNvdXJjZSBidWZmZXIgdG8gZmluZCB0aGUgdG9rZW4gbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiBUaGUgY2hlY2sgaXMgc3VjY2Vzc2Z1bCBpcyBhIEphdmEgc3RyaW5nIGxpdGVyYWwgaXMgc2VsZWN0ZWQsIHRoZSBzb3VyY2UgaXMgaW4gc3luYwotICAgICAqIGFuZCBpcyBub3QgcmVhZC1vbmx5LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCB0byBleHRyYWN0IHRoZSBzdHJpbmcgdG8gYmUgbW9kaWZpZWQsIHNvIHRoYXQgd2UgY2FuIGRpc3BsYXkgaXQgaW4KLSAgICAgKiB0aGUgcmVmYWN0b3Jpbmcgd2l6YXJkLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZyNjaGVja0luaXRpYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQotICAgICAgICBtVW5pdCA9IG51bGw7Ci0gICAgICAgIG1Ub2tlblN0cmluZyA9IG51bGw7Ci0KLSAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJDaGVja2luZyBwcmVjb25kaXRpb25zLi4uIiwgNik7Ci0KLSAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNb2RlLkVESVRfU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoNik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjaGVja1NvdXJjZUZpbGUobUZpbGUsIHN0YXR1cywgbW9uaXRvcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IGEgY29tcGlsYXRpb24gdW5pdCBmcm9tIHRoaXMgZmlsZS4gSWYgaXQgZmFpbHMsIG1Vbml0IGlzIG51bGwuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShtRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVuaXQgaXMgbm90IHJlYWQtb25seSwgZS5nLiBpdCdzIG5vdCBhIGNsYXNzIGZpbGUgb3IgaW5zaWRlIGEgSmFyCi0gICAgICAgICAgICAgICAgaWYgKG1Vbml0LmlzUmVhZE9ubHkoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigiVGhlIGZpbGUgaXMgcmVhZC1vbmx5LCBwbGVhc2UgbWFrZSBpdCB3cml0ZWFibGUgZmlyc3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIEphdmEgZmlsZS4gQ2hlY2sgaWYgaXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiB3ZSB3YW50LgotICAgICAgICAgICAgICAgIGlmICghZmluZFNlbGVjdGlvbkluSmF2YVVuaXQobVVuaXQsIHN0YXR1cywgbW9uaXRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhhdCB3YXMgbm90IGEgSmF2YSBmaWxlLiBJZ25vcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVW5pdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhpcyBhIExheW91dCBYTUwgZmlsZSBhbmQgZ2V0IHRoZSBzZWxlY3Rpb24gYW5kIGl0cyBjb250ZXh0LgotICAgICAgICAgICAgaWYgKG1GaWxlICE9IG51bGwgJiYgQW5kcm9pZENvbnN0YW50cy5FWFRfWE1MLmVxdWFscyhtRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IEFuZHJvaWQgcmVzb3VyY2UgWE1MIGZpbGVzLCBzbyB0aGV5IG11c3QgaGF2ZSBhIHBhdGgKLSAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvCi0gICAgICAgICAgICAgICAgLy8gICAgcHJvamVjdC9yZXMvPHR5cGU+Wy08Y29uZmlndXJhdGlvbj5dLyoueG1sCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc3ViIGZvbGRlcnMsIHNvIHRoZSBzZWdtZW50IGNvdW50IG11c3QgYmUgNC4KLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB0eXBlIGZvbGRlciBuYW1lIGJlY2F1c2UgYS8gd2Ugb25seSBhY2NlcHQKLSAgICAgICAgICAgICAgICAvLyBhbiBBbmRyb2lkRWRpdG9yIHNvdXJjZSBhbmQgYi8gYWFwdCBnZW5lcmF0ZXMgYSBjb21waWxhdGlvbiBlcnJvciBmb3IKLSAgICAgICAgICAgICAgICAvLyB1bmtub3duIGZvbGRlcnMuCi0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IG1GaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgcHJvamVjdC9yZXMvKiBmb2xkZXIuCi0gICAgICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gNCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50KDEpLmVxdWFsc0lnbm9yZUNhc2UoU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZFNlbGVjdGlvbkluWG1sRmlsZShtRmlsZSwgc3RhdHVzLCBtb25pdG9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdGlvbiBtdXN0IGJlIGluc2lkZSBhIEphdmEgc291cmNlIG9yIGFuIEFuZHJvaWQgTGF5b3V0IFhNTCBmaWxlLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJ5IHRvIGZpbmQgdGhlIHNlbGVjdGVkIEphdmEgZWxlbWVudCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKgotICAgICAqIElmIHNlbGVjdGlvbiBtYXRjaGVzIGEgc3RyaW5nIGxpdGVyYWwsIGNhcHR1cmUgaXQsIG90aGVyd2lzZSBhZGQgYSBmYXRhbCBlcnJvcgotICAgICAqIHRvIHRoZSBzdGF0dXMuCi0gICAgICoKLSAgICAgKiBPbiBzdWNjZXNzLCBhZHZhbmNlIHRoZSBtb25pdG9yIGJ5IDMuCi0gICAgICogUmV0dXJucyBzdGF0dXMuaXNPSygpLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kU2VsZWN0aW9uSW5KYXZhVW5pdChJQ29tcGlsYXRpb25Vbml0IHVuaXQsCi0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUJ1ZmZlciBidWZmZXIgPSB1bml0LmdldEJ1ZmZlcigpOwotCi0gICAgICAgICAgICBJU2Nhbm5lciBzY2FubmVyID0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcigKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vdG9rZW5pemVDb21tZW50cwotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy90b2tlbml6ZVdoaXRlU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vYXNzZXJ0TW9kZQotICAgICAgICAgICAgICAgICAgICBmYWxzZSAgLy9yZWNvcmRMaW5lU2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBzY2FubmVyLnNldFNvdXJjZShidWZmZXIuZ2V0Q2hhcmFjdGVycygpKTsKLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotCi0gICAgICAgICAgICBmb3IoaW50IHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0Y7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgewotICAgICAgICAgICAgICAgIGlmIChzY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSA8PSBtU2VsZWN0aW9uU3RhcnQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSA+PSBtU2VsZWN0aW9uRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSB0b2tlbiwgYnV0IG9ubHkga2VlcCBpZiB0aGUgcmlnaHQgdHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVTdHJpbmdMaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkgPiBtU2VsZWN0aW9uRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNjYW5uZXIgaXMgcGFzdCB0aGUgc2VsZWN0aW9uLCBhYm9ydC4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIC8vIEVycm9yIGluIHVuaXQuZ2V0QnVmZmVyLiBJZ25vcmUuCi0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgLy8gRXJyb3IgaW4gc2Nhbm5lci5nZXROZXh0VG9rZW4uIElnbm9yZS4KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ub2tlblN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBcyBhIGxpdGVyYWwgc3RyaW5nLCB0aGUgdG9rZW4gc2hvdWxkIGhhdmUgc3Vycm91bmRpbmcgcXVvdGVzLiBSZW1vdmUgdGhlbS4KLSAgICAgICAgICAgIGludCBsZW4gPSBtVG9rZW5TdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJgotICAgICAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcuY2hhckF0KDApID09ICciJyAmJgotICAgICAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcuY2hhckF0KGxlbiAtIDEpID09ICciJykgewotICAgICAgICAgICAgICAgIG1Ub2tlblN0cmluZyA9IG1Ub2tlblN0cmluZy5zdWJzdHJpbmcoMSwgbGVuIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIGEgbm9uLWVtcHR5IHN0cmluZyBsaXRlcmFsCi0gICAgICAgICAgICBpZiAobVRva2VuU3RyaW5nLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ub2tlblN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigiUGxlYXNlIHNlbGVjdCBhIEphdmEgc3RyaW5nIGxpdGVyYWwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRyeSB0byBmaW5kIHRoZSBzZWxlY3RlZCBYTUwgZWxlbWVudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXBsaWVzIG9uIHRoZSByZWZhY3RvcmluZwotICAgICAqIG9yaWdpbmF0aW5nIGZyb20gYW4gQW5kcm9pZCBMYXlvdXQgRWRpdG9yLiBXZSByZWx5IG9uIHNvbWUgaW50ZXJuYWwgcHJvcGVydGllcyBvZiB0aGUKLSAgICAgKiBTdHJ1Y3R1cmVkIFhNTCBlZGl0b3IgdG8gcmV0cmlldmUgZmlsZSBjb250ZW50IHRvIGF2b2lkIHBhcnNpbmcgaXQgYWdhaW4uIFdlIGFsc28gcmVseQotICAgICAqIG9uIG91ciBzcGVjaWZpYyBBbmRyb2lkIFhNTCBtb2RlbCB0byBnZXQgZWxlbWVudCAmIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiBJZiBzZWxlY3Rpb24gbWF0Y2hlcyBhIHN0cmluZyBsaXRlcmFsLCBjYXB0dXJlIGl0LCBvdGhlcndpc2UgYWRkIGEgZmF0YWwgZXJyb3IKLSAgICAgKiB0byB0aGUgc3RhdHVzLgotICAgICAqCi0gICAgICogT24gc3VjY2VzcywgYWR2YW5jZSB0aGUgbW9uaXRvciBieSAxLgotICAgICAqIFJldHVybnMgc3RhdHVzLmlzT0soKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmluZFNlbGVjdGlvbkluWG1sRmlsZShJRmlsZSBmaWxlLAotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghKG1FZGl0b3IgaW5zdGFuY2VvZiBBbmRyb2lkRWRpdG9yKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKCJPbmx5IHRoZSBBbmRyb2lkIFhNTCBFZGl0b3IgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmlzT0soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5kcm9pZEVkaXRvciBlZGl0b3IgPSAoQW5kcm9pZEVkaXRvcikgbUVkaXRvcjsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgc21vZGVsID0gbnVsbDsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgY3VyckF0dHJOYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIHBvcnRhYmlsaXR5IG5vdGUgaW4gQW5kcm9pZEVkaXRvciNnZXRNb2RlbEZvclJlYWQoKSBqYXZhZG9jLgotICAgICAgICAgICAgICAgIHNtb2RlbCA9IGVkaXRvci5nZXRNb2RlbEZvclJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc21vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0cnVjdHVyZWQgbW9kZWwgZ2l2ZXMgdGhlIHVzIHRoZSBhY3R1YWwgWE1MIE5vZGUgZWxlbWVudCB3aGVyZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGlzLiBCeSB1c2luZyB0aGlzIE5vZGUsIHdlIGNhbiBmaW5kIHRoZSBleGFjdCBVaUVsZW1lbnROb2RlIG9mIG91cgotICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbCBhbmQgdGh1cyB3ZSdsbCBiZSBhYmxlIHRvIGdldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXR0cmlidXRlIC0tIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGFjY2VwdHMgYSBzdHJpbmcgcmVmZXJlbmNlLiBUaGlzIGRvZXMgbm90IGhvd2V2ZXIgdGVsbCB1cyBpZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VsZWN0aW9uIGlzIGFjdHVhbGx5IGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgbm9yIHdoaWNoIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBlZGl0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgb2Zmc2V0ID0gbVNlbGVjdGlvblN0YXJ0OyBvZmZzZXQgPj0gMCAmJiBub2RlID09IG51bGw7IC0tb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gKE5vZGUpIHNtb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZWxlY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW55IGVsZW1lbnQgaW4gdGhlIFhNTCBkb2N1bWVudC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuaXNPSygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoIlRoZSBzZWxlY3Rpb24gaXMgbm90IGluc2lkZSBhbiBhY3R1YWwgWE1MIGVsZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmlzT0soKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc2RvYyA9IHNtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNkb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9ydGFiaWxpdHkgbm90ZTogYWxsIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGltcGxlbWVudGF0aW9uIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciB3c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwgc28gd2UgY2FuIGV4cGVjdCBpdCB0byBjaGFuZ2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZGlzdGFudCBmdXR1cmUgaWYgdGhleSBzdGFydCBjbGVhbmluZyB0aGVpciBjb2RlYmFzZSwgaG93ZXZlciB1bmxpa2VseQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBpcy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gbVNlbGVjdGlvblN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2VsU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgaWYgYW55IHN1Yi1yZWdpb24gcmVwcmVzZW50aW5nIGFuIGF0dHJpYnV0ZSBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24uIElmIGl0IGRvZXMsIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJBdHRyTmFtZSBhbmQgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGZpZWxkIG1Ub2tlblN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyQXR0ck5hbWUgPSBmaW5kU2VsZWN0aW9uSW5SZWdpb24ocmVnaW9uLCBzZWxTdGFydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRva2VuU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlbGVjdGlvbiBpcyBub3QgaW5zaWRlIGFuIGFjdHVhbCBYTUwgYXR0cmlidXRlIHZhbHVlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVG9rZW5TdHJpbmcgIT0gbnVsbCAmJiBub2RlICE9IG51bGwgJiYgY3VyckF0dHJOYW1lICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgYXR0cmlidXRlIGFjY2VwdHMgYSBzdHJpbmcgcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzZXRzIG1Ub2tlblN0cmluZyB0byBudWxsIGJ5IHNpZGUtZWZmZWN0IHdoZW4gaXQgZmFpbHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRzIGEgZmF0YWwgZXJyb3IgdG8gdGhlIHN0YXR1cyBhcyBuZWVkZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNlbGVjdGVkQXR0cmlidXRlKGVkaXRvciwgbm9kZSwgY3VyckF0dHJOYW1lLCBzdGF0dXMpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmU6IHdlJ3JlIG1pc3Npbmcgb25lIG9mIHRoZSB0b2tlbiBzdHJpbmcsIHRoZSBub2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGUgYXR0cmlidXRlIG5hbWUuIEFsbCBvZiB0aGVtIGhhdmUgYmVlbiBjaGVja2VkIGVhcmxpZXIgc28gZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBhbnkgc3BlY2lmaWMgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoc21vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc21vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzLmlzT0soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcmVnaW9uIGdpdmVzIHVzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBYTUwgZWxlbWVudAotICAgICAqIHdoZXJlIHRoZSBzZWxlY3Rpb24gc3RhcnRzLCBzcGxpdCB1c2luZyBzdWItcmVnaW9ucy4gV2Ugbm93IGp1c3QKLSAgICAgKiBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc3ViLXJlZ2lvbnMgdG8gZmluZCB3aGljaCBvbmUKLSAgICAgKiBjb250YWlucyB0aGUgYWN0dWFsIHNlbGVjdGlvbi4gV2UncmUgaW50ZXJlc3RlZCBpbiBhbiBhdHRyaWJ1dGUKLSAgICAgKiB2YWx1ZSBob3dldmVyIHdoZW4gd2UgZmluZCBvbmUgd2Ugd2FudCB0byBtZW1vcml6ZSB0aGUgYXR0cmlidXRlCi0gICAgICogbmFtZSB0aGF0IHdhcyBkZWZpbmVkIGp1c3QgYmVmb3JlLgotICAgICAqCi0gICAgICogQHJldHVybiBXaGVuIHRoZSBjdXJzb3IgaXMgb24gYSB2YWxpZCBhdHRyaWJ1dGUgbmFtZSBvciB2YWx1ZSwgcmV0dXJucyB0aGUgc3RyaW5nIG9mCi0gICAgICogYXR0cmlidXRlIG5hbWUuIEFzIGEgc2lkZS1lZmZlY3QsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW4ge0BsaW5rICNtVG9rZW5TdHJpbmd9Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZFNlbGVjdGlvbkluUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2VsU3RhcnQpIHsKLQotICAgICAgICBTdHJpbmcgY3VyckF0dHJOYW1lID0gbnVsbDsKLQotICAgICAgICBpbnQgc3RhcnRJblJlZ2lvbiA9IHNlbFN0YXJ0IC0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLSAgICAgICAgaW50IG5iID0gcmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpOwotICAgICAgICBJVGV4dFJlZ2lvbkxpc3QgbGlzdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0gICAgICAgIFN0cmluZyBjdXJyQXR0clZhbHVlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iOyBpKyspIHsKLSAgICAgICAgICAgIElUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzdWJSZWdpb24uZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgIGN1cnJBdHRyTmFtZSA9IHJlZ2lvbi5nZXRUZXh0KHN1YlJlZ2lvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJIGxpa2UgdG8gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBhbmQgaW52b2tlCi0gICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3Qgc3RyaW5nIHdpemFyZC4gU28gaWYgdGhlIHNlbGVjdGlvbiBpcyBvbgotICAgICAgICAgICAgICAgIC8vIHRoZSBhdHRyaWJ1dGUgbmFtZSBwYXJ0LCBmaW5kIHRoZSB2YWx1ZSB0aGF0IGlzIGp1c3QKLSAgICAgICAgICAgICAgICAvLyBhZnRlciBhbmQgdXNlIGl0IGFzIGlmIGl0IHdlcmUgdGhlIHNlbGVjdGlvbi4KLQotICAgICAgICAgICAgICAgIGlmIChzdWJSZWdpb24uZ2V0U3RhcnQoKSA8PSBzdGFydEluUmVnaW9uICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluUmVnaW9uIDwgc3ViUmVnaW9uLmdldFRleHRFbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBIHdlbGwtZm9ybWVkIGF0dHJpYnV0ZSBpcyBjb21wb3NlZCBvZiBhIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGVxdWFsIHNpZ24gYW5kIHRoZSB2YWx1ZS4gVGhlcmUgY2FuJ3QgYmUgYW55IHNwYWNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIGJldHdlZW4sIHdoaWNoIG1ha2VzIHRoZSBwYXJzaW5nIGEgbG90IGVhc2llci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPD0gbmIgLSAzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5nZXQoaSArIDEpLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlZ2lvbiA9IGxpc3QuZ2V0KGkgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBzdWJSZWdpb24uZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJBdHRyVmFsdWUgPSByZWdpb24uZ2V0VGV4dChzdWJSZWdpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHN1YlJlZ2lvbi5nZXRTdGFydCgpIDw9IHN0YXJ0SW5SZWdpb24gJiYKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRJblJlZ2lvbiA8IHN1YlJlZ2lvbi5nZXRUZXh0RW5kKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyQXR0clZhbHVlID0gcmVnaW9uLmdldFRleHQoc3ViUmVnaW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGN1cnJBdHRyVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSB2YWx1ZS4gT25seSBhY2NlcHQgaXQgaWYgbm90IGVtcHR5Ci0gICAgICAgICAgICAgICAgLy8gYW5kIGlmIHdlIGZvdW5kIGFuIGF0dHJpYnV0ZSBuYW1lIGJlZm9yZS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGN1cnJBdHRyVmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgYXR0cmlidXRlIHZhbHVlIHdpbGwgY29udGFpbiB0aGUgWE1MIHF1b3Rlcy4gUmVtb3ZlIHRoZW0uCi0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA+PSAyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNoYXJBdCgwKSA9PSAnIicgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuY2hhckF0KGxlbiAtIDEpID09ICciJykgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgbGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoMCkgPT0gJ1wnJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQobGVuIC0gMSkgPT0gJ1wnJykgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgbGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCAmJiBjdXJyQXR0ck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG1Ub2tlblN0cmluZyB0byBub24tbnVsbCBtYXJrcyB0aGUgZmFjdCB3ZQotICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgICAgIG1Ub2tlblN0cmluZyA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VyckF0dHJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBhdHRyaWJ1dGUgYWNjZXB0cyBhIHN0cmluZyByZWZlcmVuY2UuCi0gICAgICogVGhpcyBzZXRzIG1Ub2tlblN0cmluZyB0byBudWxsIGJ5IHNpZGUtZWZmZWN0IHdoZW4gaXQgZmFpbHMgYW5kCi0gICAgICogYWRkcyBhIGZhdGFsIGVycm9yIHRvIHRoZSBzdGF0dXMgYXMgbmVlZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNlbGVjdGVkQXR0cmlidXRlKEFuZHJvaWRFZGl0b3IgZWRpdG9yLCBOb2RlIG5vZGUsCi0gICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUsIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgewotICAgICAgICBVaUVsZW1lbnROb2RlIHJvb3RVaU5vZGUgPSBlZGl0b3IuZ2V0VWlSb290Tm9kZSgpOwotICAgICAgICBVaUVsZW1lbnROb2RlIGN1cnJlbnRVaU5vZGUgPQotICAgICAgICAgICAgcm9vdFVpTm9kZSA9PSBudWxsID8gbnVsbCA6IHJvb3RVaU5vZGUuZmluZFhtbE5vZGUobm9kZSk7Ci0gICAgICAgIFJlZmVyZW5jZUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0ckRlc2MgPSBudWxsOwotCi0gICAgICAgIGlmIChjdXJyZW50VWlOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgbmFtZXNwYWNlIHByZWZpeCBmcm9tIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyTmFtZTsKLSAgICAgICAgICAgIGludCBwb3MgPSBuYW1lLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChwb3MgPiAwICYmIHBvcyA8IG5hbWUubGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFVpQXR0cmlidXRlTm9kZSBhdHRyTm9kZSA6IGN1cnJlbnRVaU5vZGUuZ2V0VWlBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ck5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFhtbExvY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVEZXNjcmlwdG9yIGRlc2MgPSBhdHRyTm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgUmVmZXJlbmNlQXR0cmlidXRlRGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckRlc2MgPSAoUmVmZXJlbmNlQXR0cmlidXRlRGVzY3JpcHRvcikgZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgYXR0cmlidXRlIGRlc2NyaXB0b3IgaXMgYSByZXNvdXJjZSByZWZlcmVuY2UuIEl0IG11c3QgZWl0aGVyIGFjY2VwdAotICAgICAgICAvLyBvZiBhbnkgcmVzb3VyY2UgdHlwZSBvciBzcGVjaWZpY2FsbHkgYWNjZXB0IHN0cmluZyB0eXBlcy4KLSAgICAgICAgaWYgKGF0dHJEZXNjICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXR0ckRlc2MuZ2V0UmVzb3VyY2VUeXBlKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICBhdHRyRGVzYy5nZXRSZXNvdXJjZVR5cGUoKSA9PSBSZXNvdXJjZVR5cGUuU1RSSU5HKSkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmUgbW9yZSBjaGVjayB0byBkbzogaXMgdGhlIGN1cnJlbnQgc3RyaW5nIHZhbHVlIGFscmVhZHkKLSAgICAgICAgICAgIC8vIGFuIEFuZHJvaWQgWE1MIHN0cmluZyByZWZlcmVuY2U/IElmIHNvLCB3ZSBjYW4ndCBlZGl0IGl0LgotICAgICAgICAgICAgaWYgKG1Ub2tlblN0cmluZy5zdGFydHNXaXRoKCJAIikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpbnQgcG9zMSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ub2tlblN0cmluZy5sZW5ndGgoKSA+IDEgJiYgbVRva2VuU3RyaW5nLmNoYXJBdCgxKSA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zMSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcG9zMiA9IG1Ub2tlblN0cmluZy5pbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvczIgPiBwb3MxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBraW5kID0gbVRva2VuU3RyaW5nLnN1YnN0cmluZyhwb3MxICsgMSwgcG9zMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZVR5cGUuU1RSSU5HLmdldE5hbWUoKS5lcXVhbHMoa2luZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYXR0cmlidXRlICUxJHMgYWxyZWFkeSBjb250YWlucyBhICUyJHMgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVG9rZW5TdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCBhbGwgb3VyIGNoZWNrcy4gbVRva2VuU3RyaW5nIGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlLiBXZSBkb24ndCBtZW1vcml6ZSB0aGUgcmVnaW9uIG5vciB0aGUKLSAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUsIGhvd2V2ZXIgd2UgbWVtb3JpemUgdGhlIHRleHR1YWwgYXR0cmlidXRlIG5hbWUgc28KLSAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIGNhbiBvZmZlciByZXBsYWNlbWVudCBmb3IgYWxsIGl0cyBvY2N1cnJlbmNlcy4KLSAgICAgICAgICAgICAgICBtWG1sQXR0cmlidXRlTmFtZSA9IGF0dHJOYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVG9rZW5TdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBhdHRyaWJ1dGUgJTEkcyBkb2VzIG5vdCBhY2NlcHQgYSBzdHJpbmcgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmdDaGVja3MjdmFsaWRhdGVFZGl0KCkKLSAgICAgKiBNaWdodCBub3QgYmUgdXNlZnVsLgotICAgICAqCi0gICAgICogT24gc3VjY2VzcywgYWR2YW5jZSB0aGUgbW9uaXRvciBieSAyLgotICAgICAqCi0gICAgICogQHJldHVybiBGYWxzZSBpZiBjYWxsZXIgc2hvdWxkIGFib3J0LCB0cnVlIGlmIGNhbGxlciBzaG91bGQgY29udGludWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU291cmNlRmlsZShJRmlsZSBmaWxlLAotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHNvdXJjZSBmaWxlIGlzIGluIHN5bmMKLSAgICAgICAgaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoIlRoZSBmaWxlIGlzIG5vdCBzeW5jaHJvbml6ZWQuIFBsZWFzZSBzYXZlIGl0IGZpcnN0LiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gaXQuCi0gICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNBdHRyID0gZmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKHJlc0F0dHIgPT0gbnVsbCB8fCByZXNBdHRyLmlzUmVhZE9ubHkoKSkgewotICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoIlRoZSBmaWxlIGlzIHJlYWQtb25seSwgcGxlYXNlIG1ha2UgaXQgd3JpdGVhYmxlIGZpcnN0LiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0ZXAgMiBvZiAzIG9mIHRoZSByZWZhY3RvcmluZzoKLSAgICAgKiBDaGVjayB0aGUgY29uZGl0aW9ucyBvbmNlIHRoZSB1c2VyIGZpbGxlZCB2YWx1ZXMgaW4gdGhlIHJlZmFjdG9yaW5nIHdpemFyZCwKLSAgICAgKiB0aGVuIHByZXBhcmUgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZC4KLSAgICAgKiA8cC8+Ci0gICAgICogSW4gdGhpcyBjYXNlLCBtb3N0IG9mIHRoZSBzYW5pdHkgY2hlY2tzIGFyZSBkb25lIGJ5IHRoZSB3aXphcmQgc28gZXNzZW50aWFsbHkgdGhpcwotICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgd2l6YXJkIHBvc2l0aXZlbHkgdmFsaWRhdGVkIHRoZSB1c2VyIGlucHV0LgotICAgICAqCi0gICAgICogSGVyZSB3ZSBkbyBjaGVjayB0aGF0IHRoZSB0YXJnZXQgcmVzb3VyY2UgWE1MIGZpbGUgZWl0aGVyIGRvZXMgbm90IGV4aXN0cyBvcgotICAgICAqIGlzIG5vdCByZWFkLW9ubHkuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nI2NoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IpCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLSAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJDaGVja2luZyBwb3N0LWNvbmRpdGlvbnMuLi4iLCAzKTsKLQotICAgICAgICAgICAgaWYgKG1YbWxTdHJpbmdJZCA9PSBudWxsIHx8IG1YbWxTdHJpbmdJZC5sZW5ndGgoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuCi0gICAgICAgICAgICAgICAgc3RhdHVzLmFkZEZhdGFsRXJyb3IoIk1pc3NpbmcgcmVwbGFjZW1lbnQgc3RyaW5nIElEIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1UYXJnZXRYbWxGaWxlV3NQYXRoID09IG51bGwgfHwgbVRhcmdldFhtbEZpbGVXc1BhdGgubGVuZ3RoKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbgotICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKCJNaXNzaW5nIHRhcmdldCB4bWwgZmlsZSBwYXRoIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLQotICAgICAgICAgICAgLy8gRWl0aGVyIHRoYXQgcmVzb3VyY2UgbXVzdCBub3QgZXhpc3Qgb3IgaXQgbXVzdCBiZSBhIHdyaXRlYWJsZSBmaWxlLgotICAgICAgICAgICAgSVJlc291cmNlIHRhcmdldFhtbCA9IGdldFRhcmdldFhtbFJlc291cmNlKG1UYXJnZXRYbWxGaWxlV3NQYXRoKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRYbWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRYbWwuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlhNTCBmaWxlICclMSRzJyBpcyBub3QgYSBmaWxlLiIsIG1UYXJnZXRYbWxGaWxlV3NQYXRoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHIgPSB0YXJnZXRYbWwuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJYTUwgZmlsZSAnJTEkcycgaXMgcmVhZC1vbmx5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFhtbEZpbGVXc1BhdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzLmhhc0Vycm9yKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOwotCi0KLSAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGNoYW5nZSBmb3IgdGhlIFhNTCBmaWxlLgotCi0gICAgICAgICAgICBpZiAobVhtbEhlbHBlci52YWx1ZU9mU3RyaW5nSWQobVByb2plY3QsIG1UYXJnZXRYbWxGaWxlV3NQYXRoLCBtWG1sU3RyaW5nSWQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgaXQgb25seSBpZiB0aGUgSUQgZG9lc24ndCBleGlzdCB5ZXQKLSAgICAgICAgICAgICAgICBDaGFuZ2UgY2hhbmdlID0gY3JlYXRlWG1sQ2hhbmdlKChJRmlsZSkgdGFyZ2V0WG1sLCBtWG1sU3RyaW5nSWQsIG1YbWxTdHJpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoYW5nZXMuYWRkKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhdHVzLmhhc0Vycm9yKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTW9kZS5FRElUX1NPVVJDRSkgewotICAgICAgICAgICAgICAgIExpc3Q8Q2hhbmdlPiBjaGFuZ2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobVhtbEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBjaGFuZ2UgdG8gdGhlIEFuZHJvaWQgcmVzb3VyY2UgWE1MIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IGNvbXB1dGVYbWxTb3VyY2VDaGFuZ2VzKG1GaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1YbWxTdHJpbmdJZCwgbVRva2VuU3RyaW5nLCBtWG1sQXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgY2hhbmdlIHRvIHRoZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IGNvbXB1dGVKYXZhQ2hhbmdlcyhtVW5pdCwgbVhtbFN0cmluZ0lkLCBtVG9rZW5TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VzLmFkZEFsbChjaGFuZ2VzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGhlbHBlciB0aGF0IGFjdHVhbGx5IHByZXBhcmVzIHRoZSB7QGxpbmsgQ2hhbmdlfSB0aGF0IGFkZHMgdGhlIGdpdmVuCi0gICAgICogSUQgdG8gdGhlIGdpdmVuIFhNTCBGaWxlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IG1vZGlmeSB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXRYbWwgVGhlIGZpbGUgcmVzb3VyY2UgdG8gbW9kaWZ5LgotICAgICAqIEBwYXJhbSB4bWxTdHJpbmdJZCBUaGUgbmV3IElEIHRvIGluc2VydC4KLSAgICAgKiBAcGFyYW0gdG9rZW5TdHJpbmcgVGhlIG9sZCBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgdGhlIHZhbHVlIGluIHRoZSBYTUwgc3RyaW5nLgotICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIFRleHRFZGl0fSB0aGF0IGRlc2NyaWJlcyBob3cgdG8gY2hhbmdlIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgQ2hhbmdlIGNyZWF0ZVhtbENoYW5nZShJRmlsZSB0YXJnZXRYbWwsCi0gICAgICAgICAgICBTdHJpbmcgeG1sU3RyaW5nSWQsCi0gICAgICAgICAgICBTdHJpbmcgdG9rZW5TdHJpbmcsCi0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICBTdWJNb25pdG9yIHN1Yk1vbml0b3IpIHsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB4bWxDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZ2V0TmFtZSgpLCB0YXJnZXRYbWwpOwotICAgICAgICB4bWxDaGFuZ2Uuc2V0VGV4dFR5cGUoInhtbCIpOyAgIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBUZXh0RWRpdCBlZGl0ID0gbnVsbDsKLSAgICAgICAgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXAgPSBudWxsOwotCi0gICAgICAgIGlmICghdGFyZ2V0WG1sLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgWE1MIGZpbGUgZG9lcyBub3QgZXhpc3QuIFNpbXBseSBjcmVhdGUgaXQuCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGNvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgY29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKCI8cmVzb3VyY2VzPlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjb250ZW50LmFwcGVuZCgiICAgIDxzdHJpbmcgbmFtZT1cIiIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHhtbFN0cmluZ0lkKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiXCI+IikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQodG9rZW5TdHJpbmcpLgotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCI8L3N0cmluZz5cbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKCI8L3Jlc291cmNlcz5cbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBlZGl0ID0gbmV3IEluc2VydEVkaXQoMCwgY29udGVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGVkaXRHcm91cCA9IG5ldyBUZXh0RWRpdEdyb3VwKCJDcmVhdGUgPHN0cmluZz4gaW4gbmV3IFhNTCBmaWxlIiwgZWRpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgZmlsZSBleGlzdC4gQXR0ZW1wdCB0byBwYXJzZSBpdCBhcyBhIHZhbGlkIFhNTCBkb2N1bWVudC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbMl07Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIGNhc2Ugd2hlcmUgd2UgcmVwbGFjZSB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgWE1MIFN0cmluZyBJRAotCi0gICAgICAgICAgICAgICAgaWYgKGZpbmRYbWxPcGVuaW5nVGFnUG9zKHRhcmdldFhtbC5nZXRDb250ZW50cygpLCAicmVzb3VyY2VzIiwgaW5kaWNlcykpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNlc1sxXSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBmb3VuZCA+IG9yIC8+LiBJdCBjYW4gb25seSBiZSAxIG9yIDIuCi0gICAgICAgICAgICAgICAgICAgIC8vIEluZGljZXNbMF0gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWl0aGVyID4gb3IgLz4uCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdlIGRvbid0IGV2ZW4gdHJ5IHRvIGFkYXB0IG91ciBmb3JtYXR0aW5nIHRvIHRoZSBleGlzdGluZyBzdHJ1Y3R1cmUgKHdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGJ5IGNhcHR1cmluZyB3aGF0ZXZlciB3aGl0ZXNwYWNlIGlzIGFmdGVyIHRoZSBjbG9zaW5nIGJyYWNrZXQgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5aW5nIGl0IGhlcmUgYmVmb3JlIG91ciB0YWcsIHVubGVzcyB3ZSB3ZXJlIGRlYWxpbmcgd2l0aCBhbiBlbXB0eQotICAgICAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSB0YWcuKQotCi0gICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpbmRpY2VzWzBdOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gaW5kaWNlc1sxXTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBjb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmQoIj5cbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjb250ZW50LmFwcGVuZCgiICAgIDxzdHJpbmcgbmFtZT1cIiIpLiAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCh4bWxTdHJpbmdJZCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiXCI+IikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHRva2VuU3RyaW5nKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCI8L3N0cmluZz4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKCJcbjwvcmVzb3VyY2VzPiIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZWRpdCA9IG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIGxlbiwgY29udGVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgZWRpdEdyb3VwID0gbmV3IFRleHRFZGl0R3JvdXAoIkluc2VydCA8c3RyaW5nPiBpbiBYTUwgZmlsZSIsIGVkaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEZhaWxlZCB0byByZWFkIGZpbGUuIElnbm9yZS4gV2lsbCByZXR1cm4gbnVsbCBiZWxvdy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlZGl0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBtb2RpZnkgZmlsZSAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldFhtbEZpbGVXc1BhdGgpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgeG1sQ2hhbmdlLnNldEVkaXQoZWRpdCk7Ci0gICAgICAgIC8vIFRoZSBUZXh0RWRpdENoYW5nZUdyb3VwIGxldCB0aGUgdXNlciB0b2dnbGUgdGhpcyBjaGFuZ2Ugb24gYW5kIG9mZiBsYXRlci4KLSAgICAgICAgeG1sQ2hhbmdlLmFkZFRleHRFZGl0Q2hhbmdlR3JvdXAobmV3IFRleHRFZGl0Q2hhbmdlR3JvdXAoeG1sQ2hhbmdlLCBlZGl0R3JvdXApKTsKLQotICAgICAgICBzdWJNb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgcmV0dXJuIHhtbENoYW5nZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbiBYTUwgaW5wdXQgc3RyZWFtLCBsb29raW5nIGZvciBhbiBvcGVuaW5nIHRhZy4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgZm91bmQsIHJldHVybnMgdGhlIGNoYXJhY3RlciBvZmZlc3QgaW4gdGhlIGJ1ZmZlciBvZiB0aGUgY2xvc2luZyBicmFja2V0IG9mIHRoYXQKLSAgICAgKiB0YWcsIGUuZy4gdGhlIHBvc2l0aW9uIG9mID4gaW4gIjxyZXNvdXJjZXM+Ii4gVGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhdCBvZmZzZXQgMC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGltcGxlbWVudGF0aW9uIGhlcmUgcmVsaWVzIG9uIGEgc2ltcGxlIGNoYXJhY3Rlci1iYXNlZCBwYXJzZXIuIE5vIERPTSBub3IgU0FYCi0gICAgICogcGFyc2luZyBpcyB1c2VkLCBkdWUgdG8gdGhlIHNpbXBsaWZpZWQgbmF0dXJlIG9mIHRoZSB0YXNrOiB3ZSBqdXN0IHdhbnQgdGhlIGZpcnN0Ci0gICAgICogb3BlbmluZyB0YWcsIHdoaWNoIGluIG91ciBjYXNlIHNob3VsZCBiZSB0aGUgZG9jdW1lbnQgcm9vdC4gV2UgZGVhbCBob3dldmVyIHdpdGgKLSAgICAgKiB3aXRoIHRoZSB0YWcgYmVpbmcgY29tbWVudGVkIG91dCwgc28gY29tbWVudHMgYXJlIHNraXBwZWQuIFdlIGFzc3VtZSB0aGUgWE1MIGRvYwotICAgICAqIGlzIHNhbmUsIGUuZy4gd2UgZG9uJ3QgZXhwZWN0IHRoZSB0YWcgdG8gYXBwZWFyIGluIHRoZSBtaWRkbGUgb2YgYSBzdHJpbmcuIEJ1dAotICAgICAqIGFnYWluIHNpbmNlIGluIGZhY3Qgd2Ugd2FudCB0aGUgcm9vdCBlbGVtZW50LCB0aGF0J3MgdW5saWtlbHkgdG8gaGFwcGVuLgotICAgICAqIDxwLz4KLSAgICAgKiBXZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgZWxlbWVudCBpcyB3cml0dGVuIGFzIDxyZXNvdXJjZXMvPiwgaW4KLSAgICAgKiB3aGljaCBjYXNlIHRoZSBjYWxsZXIgd2lsbCB3YW50IHRvIHJlcGxhY2UgLz4gYnkgIj4uLi48Ly4uLj4iLiBUbyBkbyB0aGF0IHdlIHJldHVybgotICAgICAqIHR3byB2YWx1ZXM6IHRoZSBmaXJzdCBvZmZzZXQgb2YgdGhlIGNsb3NpbmcgdGFnIChlLmcuIC8gb3IgPikgYW5kIHRoZSBsZW5ndGgsIHdoaWNoCi0gICAgICogY2FuIG9ubHkgYmUgMSBvciAyLiBJZiBpdCdzIDIsIHRoZSBjYWxsZXIgaGFzIHRvIGRlYWwgd2l0aCAvPiBpbnN0ZWFkIG9mIGp1c3QgPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50cyBBbiBleGlzdGluZyBidWZmZXIgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIHRvIGxvb2sgZm9yLgotICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSByZXR1cm4gdmFsdWVzOiBbMF0gaXMgdGhlIG9mZnNldCBvZiB0aGUgY2xvc2luZyBicmFja2V0IGFuZCBbMV0gaXMKLSAgICAgKiAgICAgICAgICB0aGUgbGVuZ3RoIHdoaWNoIGNhbiBiZSBvbmx5IDEgZm9yID4gYW5kIDIgZm9yIC8+Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHdlIGZvdW5kIHRoZSB0YWcsIGluIHdoaWNoIGNhc2UgPGNvZGU+aW5kaWNlczwvY29kZT4gY2FuIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmRYbWxPcGVuaW5nVGFnUG9zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBTdHJpbmcgdGFnLCBpbnRbXSBpbmRpY2VzKSB7Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRzKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAvLyBzY3JhdGNoIGFyZWEKLQotICAgICAgICB0YWcgPSAiPCIgKyB0YWc7Ci0gICAgICAgIGludCB0YWdMZW4gPSB0YWcubGVuZ3RoKCk7Ci0gICAgICAgIGludCBtYXhMZW4gPSB0YWdMZW4gPCAzID8gMyA6IHRhZ0xlbjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBjaGFyIHNlYXJjaGluZyA9ICc8JzsgLy8gd2Ugd2FudCBvcGVuaW5nIHRhZ3MKLSAgICAgICAgICAgIGJvb2xlYW4gY2FwdHVyZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBpbkNvbW1lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gaW5UYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlICgoaSA9IGJyLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgaTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSBzZWFyY2hpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5Db21tZW50ICYmIGMgPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgY29tbWVudCBiZWluZyBjbG9zZWQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID49IDMgJiYgc2Iuc3Vic3RyaW5nKGxlbi0zKS5lcXVhbHMoIi0tPiIpKSB7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5ZXMsIGNvbW1lbnQgaXMgY2xvc2luZywgc3RvcCBjYXB0dXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluVGFnICYmIGMgPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBjYXB0dXJpbmcgaW4gb3VyIHRhZywgd2FpdGluZyBmb3IgdGhlIGNsb3NpbmcgPiwgd2UganVzdCBnb3QgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlJ3JlIHRvdGFsbHkgZG9uZSBoZXJlLiBTaW1wbHkgZGV0ZWN0IHdoZXRoZXIgaXQncyAvPiBvciA+LgotICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1swXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbMV0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNiLmNoYXJBdChsZW4gLSAyKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzBdLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1sxXSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5Db21tZW50ICYmICFpblRhZykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgY29tbWVudCBhbmQgbm90IG91ciB0YWcgeWV0LCBzbyB3ZSdyZSBjYXB0dXJpbmcgYmVjYXVzZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWcgaXMgYmVpbmcgb3BlbmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIG9uZSB5ZXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGVpdGhlciB0aGUgb3BlbmluZyBvciBhIGNvbW1lbnQgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcGVuaW5nIG9mIG91ciB0YWcuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IDMgJiYgc2IuZXF1YWxzKCI8LS0iKSkgeyAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gdGFnTGVuICYmIHNiLnRvU3RyaW5nKCkuZXF1YWxzKHRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgdGFnIHlldCwgZGVhbCB3aXRoIHdoZW4gdG8gc3RvcAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyaW5nOiB0aGUgb3BlbmluZyB0YWcgZW5kcyB3aXRoIGVpdGhlciBhbnkga2luZCBvZiB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIGEgPiBvciBtYXliZSB0aGVyZSdzIGEgUEkgdGhhdCBzdGFydHMgd2l0aCA8PwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkNvbW1lbnQgJiYgIWluVGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJz4nIHx8IGMgPT0gJz8nIHx8IGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBjYXB0dXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmUgJiYgbGVuID4gbWF4TGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbnkgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGNhcHR1cmUgbW9yZSB0aGFuIHRoZSBzaXplIG9mIG91ciB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBjb21tZW50IG9wZW5pbmcgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICBzYi5kZWxldGVDaGFyQXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZS4KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBvaCBjb21lIG9uLi4uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgY2hhbmdlcyB0byBiZSBtYWRlIHRvIHRoZSBzb3VyY2UgQW5kcm9pZCBYTUwgZmlsZShzKSBhbmQKLSAgICAgKiByZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgQ2hhbmdlfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8Q2hhbmdlPiBjb21wdXRlWG1sU291cmNlQ2hhbmdlcyhJRmlsZSBzb3VyY2VGaWxlLAotICAgICAgICAgICAgU3RyaW5nIHhtbFN0cmluZ0lkLAotICAgICAgICAgICAgU3RyaW5nIHRva2VuU3RyaW5nLAotICAgICAgICAgICAgU3RyaW5nIHhtbEF0dHJOYW1lLAotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgaWYgKCFzb3VyY2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcihTdHJpbmcuZm9ybWF0KCJYTUwgZmlsZSAnJTEkcycgZG9lcyBub3QgZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbiB0aGUgaW5pdGlhbCBjb25kaXRpb24gY2hlY2sgd2UgdmFsaWRhdGVkIHRoYXQgdGhpcyBmaWxlIGlzIHBhcnQgb2YKLSAgICAgICAgLy8gYW4gQW5kcm9pZCByZXNvdXJjZSBmb2xkZXIsIHdpdGggYSBmb2xkZXIgcGF0aCB0aGF0IGxvb2tzIGxpa2UKLSAgICAgICAgLy8gICAvcHJvamVjdC9yZXMvPHR5cGU+LTxjb25maWd1cmF0aW9uPi88ZmlsZW5hbWUueG1sPgotICAgICAgICAvLyBIZXJlIHdlIGFyZSBnb2luZyB0byBvZmZlciBYTUwgc291cmNlIGNoYW5nZSBmb3IgdGhlIHNhbWUgZmlsZW5hbWUgYWNjcm9zcyBhbGwKLSAgICAgICAgLy8gY29uZmlndXJhdGlvbnMgb2YgdGhlIHNhbWUgcmVzIHR5cGUuIEUuZy4gaWYgd2UncmUgcHJvY2Vzc2luZyBhIHJlcy9sYXlvdXQvbWFpbi54bWwKLSAgICAgICAgLy8gZmlsZSB0aGVuIHdlIHdhbnQgdG8gb2ZmZXIgY2hhbmdlcyBmb3IgcmVzL2xheW91dC1mci9tYWluLnhtbC4gV2UgY29tcHV0ZSBzdWNoIGEKLSAgICAgICAgLy8gbGlzdCBoZXJlLgotICAgICAgICBIYXNoU2V0PElGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotICAgICAgICBmaWxlcy5hZGQoc291cmNlRmlsZSk7Ci0KLSAgICAgICAgaWYgKEFuZHJvaWRDb25zdGFudHMuRVhUX1hNTC5lcXVhbHMoc291cmNlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlRmlsZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gNCAmJiBwYXRoLnNlZ21lbnQoMSkuZXF1YWxzKFNka0NvbnN0YW50cy5GRF9SRVNPVVJDRVMpKSB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHNvdXJjZUZpbGUuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGguc2VnbWVudCgzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5pdGlhbFR5cGVOYW1lID0gcGF0aC5zZWdtZW50KDIpOwotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZSB0eXBlID0gUmVzb3VyY2VGb2xkZXJUeXBlLmdldEZvbGRlclR5cGUoaW5pdGlhbFR5cGVOYW1lKTsKLQotICAgICAgICAgICAgICAgIElDb250YWluZXIgcmVzID0gc291cmNlRmlsZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHJlcyAhPSBudWxsICYmIHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgciA6IHJlcy5tZW1iZXJzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBmb2xkZXIgbmFtZSwgaXQncyBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKGluaXRpYWxUeXBlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYWNjZXB0IHRoZSBzYW1lIGZvbGRlciB0eXBlIChlLmcuIGxheW91dC0qKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlIHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZS5nZXRGb2xkZXJUeXBlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcCA9IHJlcy5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuYXBwZW5kKG5hbWUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZChmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIGYgPSBwcm9qZWN0LmZpbmRNZW1iZXIocCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKChJRmlsZSkgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBNYXRoLm1pbigxLCBmaWxlcy5zaXplKCkpKTsKLQotICAgICAgICBBcnJheUxpc3Q8Q2hhbmdlPiBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdDxDaGFuZ2U+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFBvcnRhYmlsaXR5IG5vdGU6IGdldE1vZGVsTWFuYWdlciBpcyBwYXJ0IG9mIHdzdC5zc2UuY29yZSBob3dldmVyIHRoZQotICAgICAgICAgICAgLy8gaW50ZXJmYWNlIHJldHVybmVkIGlzIHBhcnQgb2Ygd3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsIHNvIHdlIGNhbgotICAgICAgICAgICAgLy8gZXhwZWN0IGl0IHRvIGNoYW5nZSBpbiBhIGRpc3RhbnQgZnV0dXJlIGlmIHRoZXkgc3RhcnQgY2xlYW5pbmcgdGhlaXIgY29kZWJhc2UsCi0gICAgICAgICAgICAvLyBob3dldmVyIHVubGlrZWx5IHRoYXQgaXMuCi0gICAgICAgICAgICBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSUZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0KLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50IHNkb2MgPSBtb2RlbE1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGZpbGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigiWE1MIHN0cnVjdHVyZWQgZG9jdW1lbnQgbm90IGZvdW5kIik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHhtbENoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZShnZXROYW1lKCksIGZpbGUpOwotICAgICAgICAgICAgICAgIHhtbENoYW5nZS5zZXRUZXh0VHlwZSgieG1sIik7ICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxUZXh0RWRpdEdyb3VwPiBlZGl0R3JvdXBzID0gbmV3IEFycmF5TGlzdDxUZXh0RWRpdEdyb3VwPigpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHF1b3RlZFJlcGxhY2VtZW50ID0gcXVvdGVkQXR0clZhbHVlKCJAc3RyaW5nLyIgKyB4bWxTdHJpbmdJZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBjaGFuZ2Ugc2V0Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA6IHNkb2MuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGxvb2sgYXQgWE1MICJ0b3AgcmVnaW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUuZXF1YWxzKHJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYiA9IHJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUZXh0UmVnaW9uTGlzdCBsaXN0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0QXR0ck5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGV4dFJlZ2lvbiBzdWJSZWdpb24gPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHN1YlJlZ2lvbi5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcml6ZSB0aGUgbGFzdCBhdHRyaWJ1dGUgbmFtZSBzZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyTmFtZSA9IHJlZ2lvbi5nZXRUZXh0KHN1YlJlZ2lvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoaXMgaXMgdGhlIGF0dHJpYnV0ZSBhbmQgdGhlIG9yaWdpbmFsIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KHN1YlJlZ2lvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gMiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuY2hhckF0KDApID09ICciJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuY2hhckF0KGxlbiAtIDEpID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEsIGxlbiAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSAyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoMCkgPT0gJ1wnJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuY2hhckF0KGxlbiAtIDEpID09ICdcJycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxLCBsZW4gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxBdHRyTmFtZS5lcXVhbHMobGFzdEF0dHJOYW1lKSAmJiB0b2tlblN0cmluZy5lcXVhbHModGV4dCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gb2NjdXJyZW5jZS4gQ3JlYXRlIGEgY2hhbmdlIGZvciBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0IGVkaXQgPSBuZXcgUmVwbGFjZUVkaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgc3ViUmVnaW9uLmdldFN0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlZFJlcGxhY2VtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwID0gbmV3IFRleHRFZGl0R3JvdXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBsYWNlIGF0dHJpYnV0ZSBzdHJpbmcgYnkgSUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlFZGl0LmFkZENoaWxkKGVkaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdEdyb3Vwcy5hZGQoZWRpdEdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIHVzZSBzb21lIGludGVybmFsIEFQSXMsIHVzZSBhIGJyb2FkIGNhdGNoLWFsbCB0byByZXBvcnQgYW55Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgaXNzdWUgcmF0aGVyIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlZmFjdG9yaW5nLgotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJYTUwgcmVmYWN0b3JpbmcgZXJyb3I6ICUxJHMiLCB0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aUVkaXQuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhbmdlLnNldEVkaXQobXVsdGlFZGl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoVGV4dEVkaXRHcm91cCBncm91cCA6IGVkaXRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFuZ2UuYWRkVGV4dEVkaXRDaGFuZ2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0RWRpdENoYW5nZUdyb3VwKHhtbENoYW5nZSwgZ3JvdXApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKHhtbENoYW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvLyBmb3IgZmlsZXMKLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcihTdHJpbmcuZm9ybWF0KCJYTUwgbW9kZWwgSU8gZXJyb3I6ICUxJHMuIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcihTdHJpbmcuZm9ybWF0KCJYTUwgbW9kZWwgY29yZSBlcnJvcjogJTEkcy4iLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNoYW5nZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUgc3VpdGFibGUgdG8gYmUgcGxhY2VkIGFmdGVyIGFuIGF0dHJpYnV0ZU5hbWU9Ci0gICAgICogc3RhdGVtZW50IGluIGFuIFhNTCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBBY2NvcmRpbmcgdG8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMteG1sLTIwMDgxMTI2LyNOVC1BdHRWYWx1ZQotICAgICAqIHRoZSBhdHRyaWJ1dGUgdmFsdWUgY2FuIGJlIGVpdGhlciBxdW90ZWQgdXNpbmcgJyBvciAiIGFuZCB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIGVudGl0aWVzICZhcG9zOyBvciAmcXVvdDsgbXVzdCBiZSB1c2VkIGluc2lkZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBxdW90ZWRBdHRyVmFsdWUoU3RyaW5nIGF0dHJWYWx1ZSkgewotICAgICAgICBpZiAoYXR0clZhbHVlLmluZGV4T2YoJyInKSA9PSAtMSkgewotICAgICAgICAgICAgLy8gbm8gZG91YmxlLXF1b3RlcyBpbnNpZGUsIHVzZSBkb3VibGUtcXVvdGVzIGFyb3VuZC4KLSAgICAgICAgICAgIHJldHVybiAnIicgKyBhdHRyVmFsdWUgKyAnIic7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF0dHJWYWx1ZS5pbmRleE9mKCdcJycpID09IC0xKSB7Ci0gICAgICAgICAgICAvLyBubyBzaW5nbGUtcXVvdGVzIGluc2lkZSwgdXNlIHNpbmdsZS1xdW90ZXMgYXJvdW5kLgotICAgICAgICAgICAgcmV0dXJuICdcJycgKyBhdHRyVmFsdWUgKyAnXCcnOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGVyZSdzIGEgbWl4LiBPcHQgZm9yIGRvdWJsZS1xdW90ZSBhcm91bmQgYW5kIHJlcGxhY2UKLSAgICAgICAgLy8gaW5uZXIgZG91YmxlLXF1b3Rlcy4KLSAgICAgICAgYXR0clZhbHVlID0gYXR0clZhbHVlLnJlcGxhY2UoIlwiIiwgIiZxdW90OyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJldHVybiAnIicgKyBhdHRyVmFsdWUgKyAnIic7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIGNoYW5nZXMgdG8gYmUgbWFkZSB0byBKYXZhIGZpbGUocykgYW5kIHJldHVybnMgYSBsaXN0IG9mIHtAbGluayBDaGFuZ2V9LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxDaGFuZ2U+IGNvbXB1dGVKYXZhQ2hhbmdlcyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsCi0gICAgICAgICAgICBTdHJpbmcgeG1sU3RyaW5nSWQsCi0gICAgICAgICAgICBTdHJpbmcgdG9rZW5TdHJpbmcsCi0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICBTdWJNb25pdG9yIHN1Yk1vbml0b3IpIHsKLQotICAgICAgICAvLyBHZXQgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGZyb20gdGhlIEFuZHJvaWQgTWFuaWZlc3QuIFdlIG5lZWQgaXQgdG8gY3JlYXRlCi0gICAgICAgIC8vIHRoZSBGUUNOIG9mIHRoZSBSIGNsYXNzLgotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOwotICAgICAgICBJUmVzb3VyY2UgbWFuaWZlc3RGaWxlID0gbVByb2plY3QuZmluZE1lbWJlcihBbmRyb2lkQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1QpOwotICAgICAgICBpZiAobWFuaWZlc3RGaWxlID09IG51bGwgfHwgbWFuaWZlc3RGaWxlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgZXJyb3IgPSAiRmlsZSBub3QgZm91bmQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3QgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIucGFyc2VGb3JEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgKElGaWxlKSBtYW5pZmVzdEZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludmFsaWQgY29udGVudCI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBtYW5pZmVzdC5nZXRQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJNaXNzaW5nIHBhY2thZ2UgZGVmaW5pdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcGFyc2UgZmlsZSAlMSRzOiAlMiRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlID09IG51bGwgPyAiIiA6IG1hbmlmZXN0RmlsZS5nZXRGdWxsUGF0aCgpLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gaW4gYSBmdXR1cmUgdmVyc2lvbiB3ZSBtaWdodCB3YW50IHRvIGNvbGxlY3QgdmFyaW91cyBKYXZhIGZpbGVzIHRoYXQKLSAgICAgICAgLy8gbmVlZCB0byBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHByb2plY3QgYW5kIHByb2Nlc3MgdGhlbSBhbGwgdG9nZXRoZXIuCi0gICAgICAgIC8vIFRvIGRvIHRoYXQgd2UgbmVlZCB0byB1c2UgYW4gQVNUUmVxdWVzdG9yIGFuZCBwYXJzZXIuY3JlYXRlQVNUcywga2luZCBvZgotICAgICAgICAvLyBsaWtlIHRoaXM6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEFTVFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQVNUUmVxdWVzdG9yKCkgewotICAgICAgICAvLyAgICBAT3ZlcnJpZGUKLSAgICAgICAgLy8gICAgcHVibGljIHZvaWQgYWNjZXB0QVNUKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQ29tcGlsYXRpb25Vbml0IGFzdE5vZGUpIHsKLSAgICAgICAgLy8gICAgICAgIHN1cGVyLmFjY2VwdEFTVChzb3VyY2VVbml0LCBhc3ROb2RlKTsKLSAgICAgICAgLy8gICAgICAgIC8vIFRPRE8gcHJvY2VzcyBhc3ROb2RlCi0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gfTsKLSAgICAgICAgLy8gLi4uCi0gICAgICAgIC8vIHBhcnNlci5jcmVhdGVBU1RzKGNvbXBpbGF0aW9uVW5pdHMsIGJpbmRpbmdLZXlzLCByZXF1ZXN0b3IsIG1vbml0b3IpCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGFuZCB0aGVuIGFkZCBtdWx0aXBsZSBUZXh0RmlsZUNoYW5nZSB0byB0aGUgY2hhbmdlcyBhcnJheWxpc3QuCi0KLSAgICAgICAgLy8gUmlnaHQgbm93IHRoZSBjaGFuZ2VzIGFycmF5IHdpbGwgY29udGFpbiBvbmUgVGV4dEZpbGVDaGFuZ2UgYXQgbW9zdC4KLSAgICAgICAgQXJyYXlMaXN0PENoYW5nZT4gY2hhbmdlcyA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOwotCi0gICAgICAgIC8vIFRoaXMgaXMgdGhlIHVuaXQgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLgotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZ2V0TmFtZSgpLCAoSUZpbGUpIHVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIGNoYW5nZS5zZXRUZXh0VHlwZSgiamF2YSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gQ3JlYXRlIGFuIEFTVCBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0gICAgICAgIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLSAgICAgICAgcGFyc2VyLnNldFByb2plY3QodW5pdC5nZXRKYXZhUHJvamVjdCgpKTsKLSAgICAgICAgcGFyc2VyLnNldFNvdXJjZSh1bml0KTsKLSAgICAgICAgcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLSAgICAgICAgQVNUTm9kZSBub2RlID0gcGFyc2VyLmNyZWF0ZUFTVChzdWJNb25pdG9yLm5ld0NoaWxkKDEpKTsKLQotICAgICAgICAvLyBUaGUgQVNUTm9kZSBtdXN0IGJlIGEgQ29tcGlsYXRpb25Vbml0LCBieSBkZXNpZ24KLSAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkpIHsKLSAgICAgICAgICAgIHN0YXR1cy5hZGRGYXRhbEVycm9yKFN0cmluZy5mb3JtYXQoIkludGVybmFsIGVycm9yOiBBU1ROb2RlIGNsYXNzICVzIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDbGFzcygpKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEltcG9ydFJld3JpdGUgd2lsbCBhbGxvdyB1cyB0byBhZGQgdGhlIG5ldyB0eXBlIHRvIHRoZSBpbXBvcnRzIGFuZCB3aWxsIHJlc29sdmUKLSAgICAgICAgLy8gd2hhdCB0aGUgSmF2YSBzb3VyY2UgbXVzdCByZWZlcmVuY2UsIGUuZy4gdGhlIEZRQ04gb3IganVzdCB0aGUgc2ltcGxlIG5hbWUuCi0gICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IEltcG9ydFJld3JpdGUuY3JlYXRlKChDb21waWxhdGlvblVuaXQpIG5vZGUsIHRydWUpOwotICAgICAgICBTdHJpbmcgUnF1YWxpZmllciA9IHBhY2thZ2VOYW1lICsgIi5SIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBScXVhbGlmaWVyID0gaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoUnF1YWxpZmllcik7Ci0KLSAgICAgICAgLy8gUmV3cml0ZSB0aGUgQVNUIGl0c2VsZiB2aWEgYW4gQVNUVmlzaXRvcgotICAgICAgICBBU1QgYXN0ID0gbm9kZS5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSBhc3RSZXdyaXRlID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgQXJyYXlMaXN0PFRleHRFZGl0R3JvdXA+IGFzdEVkaXRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PFRleHRFZGl0R3JvdXA+KCk7Ci0gICAgICAgIFJlcGxhY2VTdHJpbmdzVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlcGxhY2VTdHJpbmdzVmlzaXRvcigKLSAgICAgICAgICAgICAgICBhc3QsIGFzdFJld3JpdGUsIGFzdEVkaXRHcm91cHMsCi0gICAgICAgICAgICAgICAgdG9rZW5TdHJpbmcsIFJxdWFsaWZpZXIsIHhtbFN0cmluZ0lkKTsKLSAgICAgICAgbm9kZS5hY2NlcHQodmlzaXRvcik7Ci0KLSAgICAgICAgLy8gRmluYWxseSBwcmVwYXJlIHRoZSBjaGFuZ2Ugc2V0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IGVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGVkaXQgdG8gY2hhbmdlIHRoZSBpbXBvcnRzLCBvbmx5IGlmIGFueXRoaW5nIGNoYW5nZWQKLSAgICAgICAgICAgIFRleHRFZGl0IHN1YkVkaXQgPSBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKHN1Yk1vbml0b3IubmV3Q2hpbGQoMSkpOwotICAgICAgICAgICAgaWYgKHN1YkVkaXQuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGVkaXQuYWRkQ2hpbGQoc3ViRWRpdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZWRpdCB0byBjaGFuZ2UgdGhlIEphdmEgc291cmNlLCBvbmx5IGlmIGFueXRoaW5nIGNoYW5nZWQKLSAgICAgICAgICAgIHN1YkVkaXQgPSBhc3RSZXdyaXRlLnJld3JpdGVBU1QoKTsKLSAgICAgICAgICAgIGlmIChzdWJFZGl0Lmhhc0NoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBlZGl0LmFkZENoaWxkKHN1YkVkaXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIGNoYW5nZSBzZXQgaWYgYW55IGVkaXQgd2FzIGNvbGxlY3RlZAotICAgICAgICAgICAgaWYgKGVkaXQuaGFzQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRFZGl0KGVkaXQpOwotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIFRleHRFZGl0Q2hhbmdlR3JvdXBzIHdoaWNoIGxldCB0aGUgdXNlciB0dXJuIGNoYW5nZXMgb24gb3Igb2ZmCi0gICAgICAgICAgICAgICAgLy8gaW5kaXZpZHVhbGx5LiBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgY2hhbmdlLnNldEVkaXQoKSBjYWxsIGFib3ZlLgotICAgICAgICAgICAgICAgIGZvciAoVGV4dEVkaXRHcm91cCBlZGl0R3JvdXAgOiBhc3RFZGl0R3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5hZGRUZXh0RWRpdENoYW5nZUdyb3VwKG5ldyBUZXh0RWRpdENoYW5nZUdyb3VwKGNoYW5nZSwgZWRpdEdyb3VwKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoY2hhbmdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVE9ETyB0byBtb2RpZnkgYW5vdGhlciBKYXZhIHNvdXJjZSwgbG9vcCBiYWNrIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIC8vIFRleHRGaWxlQ2hhbmdlIGFuZCBhY2N1bXVsYXRlIGluIGNoYW5nZXMuIFJpZ2h0IG5vdyBvbmx5IG9uZSBzb3VyY2UgaXMKLSAgICAgICAgICAgIC8vIG1vZGlmaWVkLgotCi0gICAgICAgICAgICBzdWJNb25pdG9yLndvcmtlZCgxKTsKLQotICAgICAgICAgICAgaWYgKGNoYW5nZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSW1wb3J0UmV3cml0ZS5yZXdyaXRlSW1wb3J0cyBmYWlsZWQuCi0gICAgICAgICAgICBzdGF0dXMuYWRkRmF0YWxFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RlcCAzIG9mIDMgb2YgdGhlIHJlZmFjdG9yaW5nOiByZXR1cm5zIHRoZSB7QGxpbmsgQ2hhbmdlfSB0aGF0IHdpbGwgYmUgYWJsZSB0byBkbyB0aGUKLSAgICAgKiB3b3JrIGFuZCBjcmVhdGVzIGEgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcGxheSB0aGF0IHJlZmFjdG9yaW5nIGxhdGVyLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZyNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiQXBwbHlpbmcgY2hhbmdlcy4uLiIsIDEpOwotCi0gICAgICAgICAgICBDb21wb3NpdGVDaGFuZ2UgY2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlcy50b0FycmF5KG5ldyBDaGFuZ2VbbUNoYW5nZXMuc2l6ZSgpXSkpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgQ2hhbmdlRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tZW50ID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjdHMgc3RyaW5nICclMSRzJyBpbnRvIFIuc3RyaW5nLiUyJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub2tlblN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWG1sU3RyaW5nSWQpOwotCi0gICAgICAgICAgICAgICAgICAgIEV4dHJhY3RTdHJpbmdEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRXh0cmFjdFN0cmluZ0Rlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2plY3QuZ2V0TmFtZSgpLCAvL3Byb2plY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCAvL2Rlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgLy9jb21tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXJndW1lbnRNYXAoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZhY3RvcmluZ0NoYW5nZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIGZpbGUgcHJvamVjdCBwYXRoLCByZXR1cm5zIGl0cyByZXNvdXJjZSBpbiB0aGUgc2FtZSBwcm9qZWN0IHRoYW4gdGhlCi0gICAgICogY29tcGlsYXRpb24gdW5pdC4gVGhlIHJlc291cmNlIG1heSBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0VGFyZ2V0WG1sUmVzb3VyY2UoU3RyaW5nIHhtbEZpbGVXc1BhdGgpIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbVByb2plY3QuZ2V0RmlsZSh4bWxGaWxlV3NQYXRoKTsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBJRC4gVXNlZCBieSB0aGUgd2l6YXJkIHRvIHNldCB0aGUgdXNlciBpbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdTdHJpbmdJZChTdHJpbmcgbmV3U3RyaW5nSWQpIHsKLSAgICAgICAgbVhtbFN0cmluZ0lkID0gbmV3U3RyaW5nSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIElELiBVc2VkIGJ5IHRoZSB3aXphcmQgdG8gc2V0IHRoZSB1c2VyIGlucHV0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld1N0cmluZ1ZhbHVlKFN0cmluZyBuZXdTdHJpbmdWYWx1ZSkgewotICAgICAgICBtWG1sU3RyaW5nVmFsdWUgPSBuZXdTdHJpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YXJnZXQgZmlsZS4gVGhpcyBpcyBhIHByb2plY3QgcGF0aCwgZS5nLiAiL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwiLgotICAgICAqIFVzZWQgYnkgdGhlIHdpemFyZCB0byBzZXQgdGhlIHVzZXIgaW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RmlsZShTdHJpbmcgdGFyZ2V0WG1sRmlsZVdzUGF0aCkgewotICAgICAgICBtVGFyZ2V0WG1sRmlsZVdzUGF0aCA9IHRhcmdldFhtbEZpbGVXc1BhdGg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvRXh0cmFjdFN0cmluZ1dpemFyZC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL0V4dHJhY3RTdHJpbmdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZGZmMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvRXh0cmFjdFN0cmluZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotCi0vKioKLSAqIEEgd2l6YXJkIGZvciBFeHRyYWN0U3RyaW5nIGJhc2VkIG9uIGEgc2ltcGxlIGRpYWxvZyB3aXRoIG9uZSBwYWdlLgotICogCi0gKiBAc2VlIEV4dHJhY3RTdHJpbmdJbnB1dFBhZ2UKLSAqIEBzZWUgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRyYWN0U3RyaW5nV2l6YXJkIGV4dGVuZHMgUmVmYWN0b3JpbmdXaXphcmQgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBtUHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHdpemFyZCBmb3IgRXh0cmFjdFN0cmluZyBiYXNlZCBvbiBhIHNpbXBsZSBkaWFsb2cgd2l0aCBvbmUgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVmIFRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nfSB0byBhc3NvY2lhdGUgdG8gdGhlIHdpemFyZC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB3aGVyZSB0aGUgd2l6YXJkIHdhcyBpbnZva2VkIGZyb20gKGUuZy4gd2hlcmUgdGhlIHVzZXIgc2VsZWN0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaGFwcGVuZWQsIHNvIHRoYXQgd2UgY2FuIHJldHJpZXZlIHByb2plY3QgcmVzb3VyY2VzLikKLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0cmFjdFN0cmluZ1dpemFyZChFeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcgcmVmLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHN1cGVyKHJlZiwgRElBTE9HX0JBU0VEX1VTRVJfSU5URVJGQUNFIHwgUFJFVklFV19FWFBBTkRfRklSU1RfTk9ERSk7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VUaXRsZShyZWYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRVc2VySW5wdXRQYWdlcygpIHsKLSAgICAgICAgYWRkUGFnZShuZXcgRXh0cmFjdFN0cmluZ0lucHV0UGFnZShtUHJvamVjdCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL1JlcGxhY2VTdHJpbmdzVmlzaXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL1JlcGxhY2VTdHJpbmdzVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDBmOWY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZWZhY3RvcmluZ3MvZXh0cmFjdHN0cmluZy9SZXBsYWNlU3RyaW5nc1Zpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVmYWN0b3JpbmdzLmV4dHJhY3RzdHJpbmc7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdEdyb3VwOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7DQotDQotLyoqDQotICogVmlzaXRvciB1c2VkIGJ5IHtAbGluayBFeHRyYWN0U3RyaW5nUmVmYWN0b3Jpbmd9IHRvIGV4dHJhY3QgYSBzdHJpbmcgZnJvbSBhbiBleGlzdGluZw0KLSAqIEphdmEgc291cmNlIGFuZCByZXBsYWNlIGl0IGJ5IGFuIEFuZHJvaWQgWE1MIHN0cmluZyByZWZlcmVuY2UuDQotICoNCi0gKiBAc2VlIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyNjb21wdXRlSmF2YUNoYW5nZXMNCi0gKi8NCi1jbGFzcyBSZXBsYWNlU3RyaW5nc1Zpc2l0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FORFJPSURfQ09OVEVYVCAgICA9ICJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0pBVkFfQ0hBUl9TRVFVRU5DRSA9ICJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIjsgIC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0pBVkFfU1RSSU5HICAgICAgICA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBBU1QgbUFzdDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBBU1RSZXdyaXRlIG1SZXdyaXRlcjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU9sZFN0cmluZzsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJRdWFsaWZpZXI7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1YbWxJZDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8VGV4dEVkaXRHcm91cD4gbUVkaXRHcm91cHM7DQotDQotICAgIHB1YmxpYyBSZXBsYWNlU3RyaW5nc1Zpc2l0b3IoQVNUIGFzdCwNCi0gICAgICAgICAgICBBU1RSZXdyaXRlIGFzdFJld3JpdGUsDQotICAgICAgICAgICAgQXJyYXlMaXN0PFRleHRFZGl0R3JvdXA+IGVkaXRHcm91cHMsDQotICAgICAgICAgICAgU3RyaW5nIG9sZFN0cmluZywNCi0gICAgICAgICAgICBTdHJpbmcgclF1YWxpZmllciwNCi0gICAgICAgICAgICBTdHJpbmcgeG1sSWQpIHsNCi0gICAgICAgIG1Bc3QgPSBhc3Q7DQotICAgICAgICBtUmV3cml0ZXIgPSBhc3RSZXdyaXRlOw0KLSAgICAgICAgbUVkaXRHcm91cHMgPSBlZGl0R3JvdXBzOw0KLSAgICAgICAgbU9sZFN0cmluZyA9IG9sZFN0cmluZzsNCi0gICAgICAgIG1SUXVhbGlmaWVyID0gclF1YWxpZmllcjsNCi0gICAgICAgIG1YbWxJZCA9IHhtbElkOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAgICAvLyROT04tTkxTLTEkDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsNCi0gICAgICAgIGlmIChub2RlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscyhtT2xkU3RyaW5nKSkgew0KLQ0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYW5hbHl6ZSB0aGUgY2FsbGluZyBjb250ZXh0IHRvIHVuZGVyc3RhbmQgd2hldGhlciB3ZSBjYW4NCi0gICAgICAgICAgICAvLyBqdXN0IHJlcGxhY2UgdGhlIHN0cmluZyBsaXRlcmFsIGJ5IHRoZSBuYW1lZCBpbnQgY29uc3RhbnQgKFIuaWQuZm9vKQ0KLSAgICAgICAgICAgIC8vIG9yIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIENvbnRleHQuZ2V0U3RyaW5nKCkgY2FsbC4NCi0gICAgICAgICAgICBib29sZWFuIHVzZUdldFJlc291cmNlID0gZmFsc2U7DQotICAgICAgICAgICAgdXNlR2V0UmVzb3VyY2UgPSBleGFtaW5lVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZU1ldGhvZEludm9jYXRpb24obm9kZSk7DQotDQotICAgICAgICAgICAgTmFtZSBxdWFsaWZpZXJOYW1lID0gbUFzdC5uZXdOYW1lKG1SUXVhbGlmaWVyICsgIi5zdHJpbmciKTsgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBTaW1wbGVOYW1lIGlkTmFtZSA9IG1Bc3QubmV3U2ltcGxlTmFtZShtWG1sSWQpOw0KLSAgICAgICAgICAgIEFTVE5vZGUgbmV3Tm9kZSA9IG1Bc3QubmV3UXVhbGlmaWVkTmFtZShxdWFsaWZpZXJOYW1lLCBpZE5hbWUpOw0KLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJSZXBsYWNlIHN0cmluZyBieSBJRCI7DQotDQotICAgICAgICAgICAgaWYgKHVzZUdldFJlc291cmNlKSB7DQotDQotICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gY29udGV4dCA9IG1ldGhvZEhhc0NvbnRleHRBcmd1bWVudChub2RlKTsNCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCAmJiAhaXNDbGFzc0Rlcml2ZWRGcm9tQ29udGV4dChub2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIGNsYXNzIHRoYXQgZGVyaXZlcyBmcm9tIENvbnRleHQgYW5kDQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgQ29udGV4dCBtZXRob2QgYXJndW1lbnQsIHRoZW4gdHJ5IGEgYml0IGhhcmRlcjoNCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhbiB3ZSBmaW5kIGEgbWV0aG9kIG9yIGEgZmllbGQgdGhhdCB3aWxsIGdpdmUgdXMgYSBjb250ZXh0Pw0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGZpbmRDb250ZXh0RmllbGRPck1ldGhvZChub2RlKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIGxldCdzICB3cml0ZSBDb250ZXh0LmdldFN0cmluZygpLCB3aGljaCBpcyB0ZWNobmljYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgYnV0IG1ha2VzIGl0IGEgZ29vZCBjbHVlIG9uIGhvdyB0byBmaXggaXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IG1Bc3QubmV3U2ltcGxlTmFtZSgiQ29udGV4dCIpOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBNZXRob2RJbnZvY2F0aW9uIG1pMiA9IG1Bc3QubmV3TWV0aG9kSW52b2NhdGlvbigpOw0KLSAgICAgICAgICAgICAgICBtaTIuc2V0TmFtZShtQXN0Lm5ld1NpbXBsZU5hbWUoImdldFN0cmluZyIpKTsgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIG1pMi5zZXRFeHByZXNzaW9uKGNvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBtaTIuYXJndW1lbnRzKCkuYWRkKG5ld05vZGUpOw0KLQ0KLSAgICAgICAgICAgICAgICBuZXdOb2RlID0gbWkyOw0KLSAgICAgICAgICAgICAgICB0aXRsZSA9ICJSZXBsYWNlIHN0cmluZyBieSBDb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy4uLikiOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCA9IG5ldyBUZXh0RWRpdEdyb3VwKHRpdGxlKTsNCi0gICAgICAgICAgICBtRWRpdEdyb3Vwcy5hZGQoZWRpdEdyb3VwKTsNCi0gICAgICAgICAgICBtUmV3cml0ZXIucmVwbGFjZShub2RlLCBuZXdOb2RlLCBlZGl0R3JvdXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0KG5vZGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBFeGFtaW5lcyBpZiB0aGUgU3RyaW5nTGl0ZXJhbCBpcyBwYXJ0IG9mIG9mIGFuIGFzc2lnbm1lbnQgdG8gYSBzdHJpbmcsDQotICAgICAqIGUuZy4gU3RyaW5nIGZvbyA9IGlkLg0KLSAgICAgKg0KLSAgICAgKiBUaGUgcGFyZW50IGZyYWdtZW50IGlzIG9mIHN5bnRheCAidmFyID0gZXhwciIgb3IgInZhcltdID0gZXhwciIuDQotICAgICAqIFdlIHdhbnQgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLCB3aGljaCBpcyBlaXRoZXIgaGVsZCBieSBhDQotICAgICAqIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgKCJ0eXBlIFtmcmFnbWVudF0iKSBvciBieSBhDQotICAgICAqIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLiBJbiBlaXRoZXIgY2FzZSwgdGhlIHR5cGUgY2FuIGJlIGFuIGFycmF5DQotICAgICAqIGJ1dCBmb3IgdXMgYWxsIHRoYXQgbWF0dGVycyBpcyB0byBrbm93IHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gaW50IG9yDQotICAgICAqIGEgc3RyaW5nLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4YW1pbmVWYXJpYWJsZURlY2xhcmF0aW9uKFN0cmluZ0xpdGVyYWwgbm9kZSkgew0KLSAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gZmluZFBhcmVudENsYXNzKG5vZGUsDQotICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5jbGFzcyk7DQotDQotICAgICAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEFTVE5vZGUgcGFyZW50ID0gZnJhZ21lbnQuZ2V0UGFyZW50KCk7DQotDQotICAgICAgICAgICAgVHlwZSB0eXBlID0gbnVsbDsNCi0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgew0KLSAgICAgICAgICAgICAgICB0eXBlID0gKChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBwYXJlbnQpLmdldFR5cGUoKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSB7DQotICAgICAgICAgICAgICAgIHR5cGUgPSAoKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSBwYXJlbnQpLmdldFR5cGUoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBTaW1wbGVUeXBlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBpc0phdmFTdHJpbmcodHlwZS5yZXNvbHZlQmluZGluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIElmIHRoZSBleHByZXNzaW9uIGlzIHBhcnQgb2YgYSBtZXRob2QgaW52b2NhdGlvbiAoYWthIGEgZnVuY3Rpb24gY2FsbCkgb3IgYQ0KLSAgICAgKiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiAoYWthIGEgIm5ldyBTb21lQ2xhc3MiIGNvbnN0cnVjdG9yIGNhbGwpLCB3ZSB0cnkgdG8NCi0gICAgICogZmluZCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgYmVpbmcgdXNlZC4gSWYgaXQgaXMgYSBTdHJpbmcgKG1vc3QgbGlrZWx5KSwgd2UNCi0gICAgICogd2FudCB0byByZXR1cm4gdHJ1ZSAodG8gZ2VuZXJhdGUgYSBnZXRTdHJpbmcoKSBjYWxsKS4gSG93ZXZlciBpZiB0aGVyZSBtaWdodA0KLSAgICAgKiBiZSBhIHNpbWlsYXIgbWV0aG9kIHRoYXQgdGFrZXMgYW4gaW50LCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdC4NCi0gICAgICoNCi0gICAgICogVGhpcyBjb3ZlcnMgdGhlIGNhc2Ugb2YgQWN0aXZpdHkuc2V0VGl0bGUoaW50IHJlc0lkKSB2cyBzZXRUaXRsZShTdHJpbmcgc3RyKS4NCi0gICAgICovDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhhbWluZU1ldGhvZEludm9jYXRpb24oU3RyaW5nTGl0ZXJhbCBub2RlKSB7DQotDQotICAgICAgICBBU1ROb2RlIHBhcmVudCA9IG51bGw7DQotICAgICAgICBMaXN0IGFyZ3VtZW50cyA9IG51bGw7DQotICAgICAgICBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbnVsbDsNCi0NCi0gICAgICAgIE1ldGhvZEludm9jYXRpb24gaW52b2tlID0gZmluZFBhcmVudENsYXNzKG5vZGUsIE1ldGhvZEludm9jYXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGludm9rZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcGFyZW50ID0gaW52b2tlOw0KLSAgICAgICAgICAgIGFyZ3VtZW50cyA9IGludm9rZS5hcmd1bWVudHMoKTsNCi0gICAgICAgICAgICBtZXRob2RCaW5kaW5nID0gaW52b2tlLnJlc29sdmVNZXRob2RCaW5kaW5nKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBuZXdjbGFzcyA9IGZpbmRQYXJlbnRDbGFzcyhub2RlLCBDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MpOw0KLSAgICAgICAgICAgIGlmIChuZXdjbGFzcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHBhcmVudCA9IG5ld2NsYXNzOw0KLSAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSBuZXdjbGFzcy5hcmd1bWVudHMoKTsNCi0gICAgICAgICAgICAgICAgbWV0aG9kQmluZGluZyA9IG5ld2NsYXNzLnJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgYXJndW1lbnRzICE9IG51bGwgJiYgbWV0aG9kQmluZGluZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrbm93IHdoaWNoIGFyZ3VtZW50IHRoaXMgaXMuDQotICAgICAgICAgICAgLy8gV2FsayB1cCB0aGUgaGllcmFyY2h5IGFnYWluIHRvIGZpbmQgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgcGFyZW50LA0KLSAgICAgICAgICAgIC8vIHdoaWNoIHNob3VsZCB0dXJuIG91dCB0byBiZSBvbmUgb2YgdGhlIGludm9jYXRpb24gYXJndW1lbnRzLg0KLSAgICAgICAgICAgIEFTVE5vZGUgY2hpbGQgPSBudWxsOw0KLSAgICAgICAgICAgIGZvciAoQVNUTm9kZSBuID0gbm9kZTsgbiAhPSBwYXJlbnQ7ICkgew0KLSAgICAgICAgICAgICAgICBBU1ROb2RlIHAgPSBuLmdldFBhcmVudCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBwYXJlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbjsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG4gPSBwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbid0IGhhcHBlbjogYSBwYXJlbnQgb2YgJ25vZGUnIG11c3QgYmUgdGhlIGNoaWxkIG9mICdwYXJlbnQnLg0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGluZGV4DQotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBhcmcgOiBhcmd1bWVudHMpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBjaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW5kZXgrKzsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyZ3VtZW50cy5zaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4ndCBoYXBwZW46IG9uZSBvZiB0aGUgYXJndW1lbnRzIG9mICdpbnZva2UnIG11c3QgYmUgJ2NoaWxkJy4NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBFdmVudHVhbGx5IHdlIHdhbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdHlwZSwNCi0gICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIGEgQ29udGV4dC5nZXRTdHJpbmcoKSBjYWxsIG11c3QgYmUgZ2VuZXJhdGVkLg0KLSAgICAgICAgICAgIGJvb2xlYW4gdXNlU3RyaW5nVHlwZSA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHR5cGUgb2YgdGhhdCBhcmd1bWVudA0KLSAgICAgICAgICAgIElUeXBlQmluZGluZ1tdIHR5cGVzID0gbWV0aG9kQmluZGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IHR5cGVzLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICBJVHlwZUJpbmRpbmcgdHlwZSA9IHR5cGVzW2luZGV4XTsNCi0gICAgICAgICAgICAgICAgdXNlU3RyaW5nVHlwZSA9IGlzSmF2YVN0cmluZyh0eXBlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgbWV0aG9kIHRha2VzIGEgU3RyaW5nIHBhcmFtZXRlciwgY2FuIHdlIGZpbmQNCi0gICAgICAgICAgICAvLyBhIHZhcmlhbnQgdGhhdCB3b3VsZCBhY2NlcHQgYW4gaW50IGZvciB0aGUgc2FtZSBwYXJhbWV0ZXIgcG9zaXRpb24/DQotICAgICAgICAgICAgaWYgKHVzZVN0cmluZ1R5cGUpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2RCaW5kaW5nLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgSVR5cGVCaW5kaW5nIGNsYXp6ID0gbWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOw0KLSAgICAgICAgICAgICAgICBuZXh0TWV0aG9kOiBmb3IgKElNZXRob2RCaW5kaW5nIG1iMiA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kQmluZGluZyA9PSBtYjIgfHwgIW1iMi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUuIFdlIHdhbnQgdGhlIHNhbWUgcGFyYW1ldGVycw0KLSAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0IHRoYXQgdGhlIG9uZSBhdCAnaW5kZXgnIG11c3QgYmUgYW4gaW50IHR5cGUuDQotICAgICAgICAgICAgICAgICAgICBJVHlwZUJpbmRpbmdbXSB0eXBlczIgPSBtYjIuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCBsZW4yID0gdHlwZXMyLmxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gbGVuMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGluZGV4KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZUJpbmRpbmcgdHlwZTIgPSB0eXBlczJbaV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgiaW50Ii5lcXVhbHModHlwZTIuZ2V0UXVhbGlmaWVkTmFtZSgpKSkpIHsgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFyZ3VtZW50IGF0ICdpbmRleCcgaXMgbm90IGFuIGludC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBuZXh0TWV0aG9kOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBlc1tpXS5lcXVhbHModHlwZXMyW2ldKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIG9mIHRoZSBvdGhlciBhcmd1bWVudHMgZG8gbm90IG1hdGNoIG91ciBvcmlnaW5hbCBtZXRob2QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG5leHRNZXRob2Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHdlIGZvdW5kIGEgcGVyZmVjdCBtYXRjaDogYSBtZXRob2Qgd2l0aCB0aGUgc2FtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ3VtZW50cyBleGNlcHQgdGhlIG9uZSBhdCAnaW5kZXgnIGlzIGFuIGludC4gSW4gdGhpcyBjYXNlIHdlDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjb252ZXJ0IG91ciBSLmlkIGludG8gYSBzdHJpbmcuDQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlU3RyaW5nVHlwZSA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiB1c2VTdHJpbmdUeXBlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBFeGFtaW5lcyBpZiB0aGUgU3RyaW5nTGl0ZXJhbCBpcyBwYXJ0IG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uIChhLmsuYS4gYSBmdW5jdGlvbg0KLSAgICAgKiBkZWZpbml0aW9uKSB3aGljaCB0YWtlcyBhIENvbnRleHQgYXJndW1lbnQuDQotICAgICAqIElmIHN1Y2gsIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGFzIGEge0BsaW5rIFNpbXBsZU5hbWV9Lg0KLSAgICAgKiBPdGhlcndpc2UgaXQgcmV0dXJucyBudWxsLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTaW1wbGVOYW1lIG1ldGhvZEhhc0NvbnRleHRBcmd1bWVudChTdHJpbmdMaXRlcmFsIG5vZGUpIHsNCi0gICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSBmaW5kUGFyZW50Q2xhc3Mobm9kZSwgTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGRlY2wgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGRlY2wucGFyYW1ldGVycygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHZhciA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBvYmo7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbmRyb2lkQ29udGV4dCh2YXIuZ2V0VHlwZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQXN0Lm5ld1NpbXBsZU5hbWUodmFyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFdhbGtzIHVwIHRoZSBub2RlIGhpZXJhcmNoeSB0byBmaW5kIHRoZSBjbGFzcyAoYWthIHR5cGUpIHdoZXJlIHRoaXMgc3RhdGVtZW50DQotICAgICAqIGlzIHVzZWQgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIGRlcml2ZXMgZnJvbSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsYXNzRGVyaXZlZEZyb21Db250ZXh0KFN0cmluZ0xpdGVyYWwgbm9kZSkgew0KLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIGNsYXp6ID0gZmluZFBhcmVudENsYXNzKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7DQotICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IHdyaXRpbmcsIHNvIGl0IGNhbid0IGJlDQotICAgICAgICAgICAgLy8gYSBDb250ZXh0IGJ5IGl0c2VsZiwgaXQgaGFzIHRvIGJlIGRlcml2ZWQgZnJvbSBpdC4NCi0gICAgICAgICAgICByZXR1cm4gaXNBbmRyb2lkQ29udGV4dChjbGF6ei5nZXRTdXBlcmNsYXNzVHlwZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEV4cHJlc3Npb24gZmluZENvbnRleHRGaWVsZE9yTWV0aG9kKFN0cmluZ0xpdGVyYWwgbm9kZSkgew0KLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIGNsYXp6ID0gZmluZFBhcmVudENsYXNzKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7DQotICAgICAgICBJVHlwZUJpbmRpbmcgY2xhenpUeXBlID0gY2xhenogPT0gbnVsbCA/IG51bGwgOiBjbGF6ei5yZXNvbHZlQmluZGluZygpOw0KLSAgICAgICAgcmV0dXJuIGZpbmRDb250ZXh0RmllbGRPck1ldGhvZChjbGF6elR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRXhwcmVzc2lvbiBmaW5kQ29udGV4dEZpZWxkT3JNZXRob2QoSVR5cGVCaW5kaW5nIGNsYXp6VHlwZSkgew0KLSAgICAgICAgVHJlZU1hcDxJbnRlZ2VyLCBFeHByZXNzaW9uPiByZXN1bHRzID0gbmV3IFRyZWVNYXA8SW50ZWdlciwgRXhwcmVzc2lvbj4oKTsNCi0gICAgICAgIGZpbmRDb250ZXh0Q2FuZGlkYXRlcyhyZXN1bHRzLCBjbGF6elR5cGUsIDAgLypzdXBlclR5cGUqLyk7DQotICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgSW50ZWdlciBiZXN0UmF0aW5nID0gcmVzdWx0cy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5nZXQoYmVzdFJhdGluZyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCBhbGwgbWV0aG9kIG9yIGZpZWxkcyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciBwcm92aWRpbmcgYSBDb250ZXh0Lg0KLSAgICAgKiBUaGVyZSBjYW4gYmUgdmFyaW91cyBjaG9pY2VzIGFtb25nc3QgdGhpcyBjbGFzcyBvciBpdHMgc3VwZXIgY2xhc3Nlcy4NCi0gICAgICogU29ydCB0aGVtIGJ5IHJhdGluZyBpbiB0aGUgcmVzdWx0cyBtYXAuDQotICAgICAqDQotICAgICAqIFRoZSBiZXN0IGV2ZXIgY2hvaWNlIGlzIHRvIGZpbmQgYSBtZXRob2Qgd2l0aCBubyBhcmd1bWVudCB0aGF0IHJldHVybnMgYSBDb250ZXh0Lg0KLSAgICAgKiBUaGUgc2Vjb25kIHN1aXRhYmxlIGNob2ljZSBpcyB0byBmaW5kIGEgQ29udGV4dCBmaWVsZC4NCi0gICAgICogVGhlIGxlYXN0IGRlc2lyYWJsZSBjaG9pY2UgaXMgdG8gZmluZCBhIG1ldGhvZCB3aXRoIGFyZ3VtZW50cy4gSXQncyBub3QgcmVhbGx5DQotICAgICAqIGRlc2lyYWJsZSBzaW5jZSB3ZSBjYW4ndCBnZW5lcmF0ZSB0aGVzZSBhcmd1bWVudHMgYXV0b21hdGljYWxseS4NCi0gICAgICoNCi0gICAgICogTWV0aG9kcyBhbmQgZmllbGRzIGZyb20gc3VwZXJ0eXBlcyBhcmUgaWdub3JlZCBpZiB0aGV5IGFyZSBwcml2YXRlLg0KLSAgICAgKg0KLSAgICAgKiBUaGUgcmF0aW5nIGlzIHJldmVyc2VkOiB0aGUgbG93ZXN0IHJhdGluZyBpbnRlZ2VyIGlzIHVzZWQgZm9yIHRoZSBiZXN0IGNhbmRpZGF0ZS4NCi0gICAgICogQmVjYXVzZSB0aGUgc3VwZXJUeXBlIGFyZ3VtZW50IGlzIGFjdHVhbGx5IGEgcmVjdXJzaW9uIGluZGV4LCB0aGlzIG1ha2VzIHRoZSBtb3N0DQotICAgICAqIGltbWVkaWF0ZSBjbGFzc2VzIG1vcmUgZGVzaXJhYmxlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVzdWx0cyBUaGUgbWFwIHRoYXQgYWNjdW11bGF0ZXMgdGhlIHJhdGluZz0+ZXhwcmVzc2lvbiByZXN1bHRzLiBUaGUgbG93ZXINCi0gICAgICogICAgICAgICAgICAgICAgcmF0aW5nIG51bWJlciBpcyB0aGUgYmVzdCBjYW5kaWRhdGUuDQotICAgICAqIEBwYXJhbSBjbGF6elR5cGUgVGhlIGNsYXNzIGV4YW1pbmVkLg0KLSAgICAgKiBAcGFyYW0gc3VwZXJUeXBlIFRoZSByZWN1cnNpb24gaW5kZXguDQotICAgICAqICAgICAgICAgICAgICAgICAgMCBmb3IgdGhlIGltbWVkaWF0ZSBjbGFzcywgMSBmb3IgaXRzIHN1cGVyIGNsYXNzLCBldGMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZmluZENvbnRleHRDYW5kaWRhdGVzKFRyZWVNYXA8SW50ZWdlciwgRXhwcmVzc2lvbj4gcmVzdWx0cywNCi0gICAgICAgICAgICBJVHlwZUJpbmRpbmcgY2xhenpUeXBlLA0KLSAgICAgICAgICAgIGludCBzdXBlclR5cGUpIHsNCi0gICAgICAgIGZvciAoSU1ldGhvZEJpbmRpbmcgbWIgOiBjbGF6elR5cGUuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsNCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBsb29raW5nIGF0IHN1cGVydHlwZXMsIHdlIGNhbid0IHVzZSBwcml2YXRlIG1ldGhvZHMuDQotICAgICAgICAgICAgaWYgKHN1cGVyVHlwZSAhPSAwICYmIE1vZGlmaWVyLmlzUHJpdmF0ZShtYi5nZXRNb2RpZmllcnMoKSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChpc0FuZHJvaWRDb250ZXh0KG1iLmdldFJldHVyblR5cGUoKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtZXRob2QgdGhhdCByZXR1cm5zIHNvbWV0aGluZyBkZXJpdmVkIGZyb20gQ29udGV4dC4NCi0NCi0gICAgICAgICAgICAgICAgaW50IGFyZ3NMZW4gPSBtYi5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsNCi0gICAgICAgICAgICAgICAgaWYgKGFyZ3NMZW4gPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgZmF2b3IgYW55IG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCB3b3VsZCBiZSB0aGUgYmVzdCBjYW5kaWRhdGUgZXZlciwgc28gd2UgY2FuIHN0b3AgaGVyZS4NCi0gICAgICAgICAgICAgICAgICAgIE1ldGhvZEludm9jYXRpb24gbWkgPSBtQXN0Lm5ld01ldGhvZEludm9jYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgIG1pLnNldE5hbWUobUFzdC5uZXdTaW1wbGVOYW1lKG1iLmdldE5hbWUoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoSW50ZWdlci5NSU5fVkFMVUUsIG1pKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIEEgbWV0aG9kIHdpdGggYXJndW1lbnRzIGlzbid0IGFzIGludGVyZXN0aW5nIHNpbmNlIHdlIHdvdWxkbid0DQotICAgICAgICAgICAgICAgICAgICAvLyBrbm93IGhvdyB0byBwb3B1bGF0ZSBzdWNoIGFyZ3VtZW50cy4gV2UnbGwgdXNlIGl0IGlmIHRoZXJlIGFyZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm8gb3RoZXIgYWx0ZXJuYXRpdmVzLiBXZSdsbCBmYXZvciB0aGUgb25lIHdpdGggdGhlIGxlc3MgYXJndW1lbnRzLg0KLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciByYXRpbmcgPSBJbnRlZ2VyLnZhbHVlT2YoMTAwMDAgKyAxMDAwICogc3VwZXJUeXBlICsgYXJnc0xlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMuY29udGFpbnNLZXkocmF0aW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZEludm9jYXRpb24gbWkgPSBtQXN0Lm5ld01ldGhvZEludm9jYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtaS5zZXROYW1lKG1Bc3QubmV3U2ltcGxlTmFtZShtYi5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChyYXRpbmcsIG1pKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIEEgZGlyZWN0IENvbnRleHQgZmllbGQgd291bGQgYmUgbW9yZSBpbnRlcmVzdGluZyB0aGFuIGEgbWV0aG9kIHdpdGgNCi0gICAgICAgIC8vIGFyZ3VtZW50cy4gVHJ5IHRvIGZpbmQgb25lLg0KLSAgICAgICAgZm9yIChJVmFyaWFibGVCaW5kaW5nIHZhciA6IGNsYXp6VHlwZS5nZXREZWNsYXJlZEZpZWxkcygpKSB7DQotICAgICAgICAgICAgLy8gSWYgd2UncmUgbG9va2luZyBhdCBzdXBlcnR5cGVzLCB3ZSBjYW4ndCB1c2UgcHJpdmF0ZSBmaWVsZC4NCi0gICAgICAgICAgICBpZiAoc3VwZXJUeXBlICE9IDAgJiYgTW9kaWZpZXIuaXNQcml2YXRlKHZhci5nZXRNb2RpZmllcnMoKSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChpc0FuZHJvaWRDb250ZXh0KHZhci5nZXRUeXBlKCkpKSB7DQotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHN1Y2ggYSBmaWVsZC4gTGV0J3MgdXNlIGl0Lg0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHJhdGluZyA9IEludGVnZXIudmFsdWVPZihzdXBlclR5cGUpOw0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChyYXRpbmcsIG1Bc3QubmV3U2ltcGxlTmFtZSh2YXIuZ2V0TmFtZSgpKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIEV4YW1pbmUgdGhlIHN1cGVyIGNsYXNzIHRvIHNlZSBpZiB3ZSBjYW4gbG9jYXRlIGEgYmV0dGVyIG1hdGNoDQotICAgICAgICBjbGF6elR5cGUgPSBjbGF6elR5cGUuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgaWYgKGNsYXp6VHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZmluZENvbnRleHRDYW5kaWRhdGVzKHJlc3VsdHMsIGNsYXp6VHlwZSwgc3VwZXJUeXBlICsgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFdhbGtzIHVwIHRoZSBub2RlIGhpZXJhcmNoeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgQVNUTm9kZSBvZiB0aGUgcmVxdWVzdGVkIGNsYXNzLg0KLSAgICAgKiBPbmx5IGxvb2sgYXQgcGFyZW50cy4NCi0gICAgICoNCi0gICAgICogSW1wbGVtZW50YXRpb24gbm90ZTogdGhpcyBpcyBhIGdlbmVyaWMgbWV0aG9kIHNvIHRoYXQgaXQgcmV0dXJucyB0aGUgbm9kZSBhbHJlYWR5DQotICAgICAqIGNhc3RlZCB0byB0aGUgcmVxdWVzdGVkIHR5cGUuDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJpdmF0ZSA8VCBleHRlbmRzIEFTVE5vZGU+IFQgZmluZFBhcmVudENsYXNzKEFTVE5vZGUgbm9kZSwgQ2xhc3M8VD4gY2xhenopIHsNCi0gICAgICAgIGZvciAobm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50KCkpIHsNCi0gICAgICAgICAgICBpZiAobm9kZS5nZXRDbGFzcygpLmVxdWFscyhjbGF6eikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChUKSBub2RlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgaXMgb3IgZGVyaXZlcyBmcm9tIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQW5kcm9pZENvbnRleHQoVHlwZSB0eXBlKSB7DQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlzQW5kcm9pZENvbnRleHQodHlwZS5yZXNvbHZlQmluZGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIGlzIG9yIGRlcml2ZXMgZnJvbSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FuZHJvaWRDb250ZXh0KElUeXBlQmluZGluZyB0eXBlKSB7DQotICAgICAgICBmb3IgKDsgdHlwZSAhPSBudWxsOyB0eXBlID0gdHlwZS5nZXRTdXBlcmNsYXNzKCkpIHsNCi0gICAgICAgICAgICBpZiAoQ0xBU1NfQU5EUk9JRF9DT05URVhULmVxdWFscyh0eXBlLmdldFF1YWxpZmllZE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhIFN0cmluZyBvciBDaGFyU2VxdWVuY2UgdHlwZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmFTdHJpbmcoSVR5cGVCaW5kaW5nIHR5cGUpIHsNCi0gICAgICAgIGZvciAoOyB0eXBlICE9IG51bGw7IHR5cGUgPSB0eXBlLmdldFN1cGVyY2xhc3MoKSkgew0KLSAgICAgICAgICAgIGlmIChDTEFTU19KQVZBX1NUUklORy5lcXVhbHModHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgIENMQVNTX0pBVkFfQ0hBUl9TRVFVRU5DRS5lcXVhbHModHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvWG1sU3RyaW5nRmlsZUhlbHBlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3JlZmFjdG9yaW5ncy9leHRyYWN0c3RyaW5nL1htbFN0cmluZ0ZpbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhZWNkMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVmYWN0b3JpbmdzL2V4dHJhY3RzdHJpbmcvWG1sU3RyaW5nRmlsZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkWFBhdGhGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBoZWxwZXIgdXRpbGl0eSB0byBnZXQgSURzIG91dCBvZiBhbiBBbmRyb2lkIFhNTCByZXNvdXJjZSBmaWxlLgotICovCi1jbGFzcyBYbWxTdHJpbmdGaWxlSGVscGVyIHsKLQotICAgIC8qKiBBIHRlbXBvcmFyeSBjYWNoZSBvZiBSLnN0cmluZyBJRHMgZGVmaW5lZCBieSBhIGdpdmVuIHhtbCBmaWxlLiBUaGUga2V5IGlzIHRoZQotICAgICAqIHByb2plY3QgcGF0aCBvZiB0aGUgZmlsZSwgdGhlIGRhdGEgaXMgYSBzZXQgb2Yga25vd24gc3RyaW5nIElkcyBmb3IgdGhhdCBmaWxlLgotICAgICAqCi0gICAgICogTWFwIHR5cGU6IG1hcCBbU3RyaW5nIGZpbGVuYW1lXSA9PiBtYXAgW1N0cmluZyBpZCA9PiBTdHJpbmcgdmFsdWVdLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IG1SZXNJZENhY2hlID0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgIC8qKiBBbiBpbnN0YW5jZSBvZiBYUGF0aCwgY3JlYXRlZCBsYXppbHkgb24gZGVtYW5kLiAqLwotICAgIHByaXZhdGUgWFBhdGggbVhQYXRoOwotCi0gICAgcHVibGljIFhtbFN0cmluZ0ZpbGVIZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdXNlZCBieSB0aGUgd2l6YXJkIHRvIHJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUgZGVmaW5pdGlvbiBvZiBhIGdpdmVuCi0gICAgICogc3RyaW5nIElELgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgY29udGFpbiB0aGUgWE1MIGZpbGUuCi0gICAgICogQHBhcmFtIHhtbEZpbGVXc1BhdGggVGhlIHByb2plY3QgcGF0aCBvZiB0aGUgWE1MIGZpbGUsIGUuZy4gIi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIi4KLSAgICAgKiAgICAgICAgICBUaGUgZ2l2ZW4gZmlsZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gc3RyaW5nSWQgVGhlIHN0cmluZyBJRCB0byBmaW5kLgotICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIHN0cmluZyBpZiB0aGUgSUQgaXMgZGVmaW5lZCwgbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZU9mU3RyaW5nSWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHhtbEZpbGVXc1BhdGgsIFN0cmluZyBzdHJpbmdJZCkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhY2hlID0gZ2V0UmVzSWRzRm9yRmlsZShwcm9qZWN0LCB4bWxGaWxlV3NQYXRoKTsKLSAgICAgICAgcmV0dXJuIGNhY2hlLmdldChzdHJpbmdJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCByZXRyaWV2ZXMgYWxsIHRoZSAqc3RyaW5nKiBJRHMgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gQW5kcm9pZCByZXNvdXJjZQotICAgICAqIGZpbGUuIFRoZSBpbnN0YW5jZSBtYWludGFpbnMgYW4gaW50ZXJuYWwgY2FjaGUgc28gYSBnaXZlbiBmaWxlIGlzIHJldHJpZXZlZCBvbmx5IG9uY2UuCi0gICAgICogQ2FsbGVycyBzaG91bGQgY29uc2lkZXIgdGhlIHNldCB0byBiZSByZWFkLW9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBjb250YWluIHRoZSBYTUwgZmlsZS4KLSAgICAgKiBAcGFyYW0geG1sRmlsZVdzUGF0aCBUaGUgcHJvamVjdCBwYXRoIG9mIHRoZSBYTUwgZmlsZSwgZS5nLiAiL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwiLgotICAgICAqICAgICAgICAgIFRoZSBnaXZlbiBmaWxlIG1heSBvciBtYXkgbm90IGV4aXN0LgotICAgICAqIEByZXR1cm4gVGhlIG1hcCBvZiBzdHJpbmcgSURzID0+IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBnaXZlbiBmaWxlLiBDYWNoZWQuIE5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVzSWRzRm9yRmlsZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgeG1sRmlsZVdzUGF0aCkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhY2hlID0gbVJlc0lkQ2FjaGUuZ2V0KHhtbEZpbGVXc1BhdGgpOwotICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGUgPSBpbnRlcm5hbEdldFJlc0lkc0ZvckZpbGUocHJvamVjdCwgeG1sRmlsZVdzUGF0aCk7Ci0gICAgICAgICAgICBtUmVzSWRDYWNoZS5wdXQoeG1sRmlsZVdzUGF0aCwgY2FjaGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IGFsbCB0aGUgZGVmaW5lZCBzdHJpbmcgSURzIGZyb20gYSBnaXZlbiBmaWxlIHVzaW5nIFhQYXRoLgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGNvbnRhaW4gdGhlIFhNTCBmaWxlLgotICAgICAqIEBwYXJhbSB4bWxGaWxlV3NQYXRoIFRoZSBwcm9qZWN0IHBhdGggb2YgdGhlIGZpbGUgdG8gcGFyc2UuIEl0IG1heSBub3QgZXhpc3QuCi0gICAgICogQHJldHVybiBUaGUgbWFwIG9mIGFsbCBzdHJpbmcgSURzID0+IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBmaWxlLgotICAgICAqICAgVGhlIHJldHVybmVkIHNldCBpcyBhbHdheXMgbm9uIG51bGwuIEl0IGlzIGVtcHR5IGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbnRlcm5hbEdldFJlc0lkc0ZvckZpbGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHhtbEZpbGVXc1BhdGgpIHsKLSAgICAgICAgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gaWRzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgaWYgKG1YUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWFBhdGggPSBBbmRyb2lkWFBhdGhGYWN0b3J5Lm5ld1hQYXRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBY2Nlc3MgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgY29tcGlsYXRpb24gdW5pdAotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmdldEZpbGUoeG1sRmlsZVdzUGF0aCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2U7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudHMoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IGFsbCB0aGUgSURzIGluIGFuIFhNTCBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgotICAgICAgICAgICAgICAgIC8vIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgLy8gICAgPHN0cmluZyBuYW1lPSJJRCI+c29tZXRoaW5nPC9zdHJpbmc+Ci0gICAgICAgICAgICAgICAgLy8gPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgeHBhdGhFeHByID0gIi9yZXNvdXJjZXMvc3RyaW5nIjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1YUGF0aC5ldmFsdWF0ZSh4cGF0aEV4cHIsIHNvdXJjZSwgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IGxpc3QgPSAoTm9kZUxpc3QpIHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBuID49IDA7IG4tLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBzdHJOb2RlID0gbGlzdC5pdGVtKG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gc3RyTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIik7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gbmFtZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzdHJOb2RlLmdldFRleHRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzLnB1dChpZCwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBJRmlsZS5nZXRDb250ZW50cyBmYWlsZWQuIElnbm9yZS4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIC8vIG1YUGF0aC5ldmFsdWF0ZSBmYWlsZWQuIElnbm9yZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZHM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0F0dHJzWG1sUGFyc2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0F0dHJzWG1sUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTc2YzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9BdHRyc1htbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRGVzY3JpcHRvcnNVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5EZWNsYXJlU3R5bGVhYmxlSW5mby5BdHRyaWJ1dGVJbmZvLkZvcm1hdDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm8uTGF5b3V0UGFyYW1zSW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogUGFyc2VyIGZvciBhdHRyaWJ1dGVzIGRlc2NyaXB0aW9uIGZpbGVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0cnNYbWxQYXJzZXIgewotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBtRG9jdW1lbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU9zQXR0cnNYbWxQYXRoOwotICAgIC8vIGFsbCBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFyZSBzdXBwb3NlZCB0byBoYXZlIHRoZSBzYW1lCi0gICAgLy8gcGFyYW1ldGVycyBzbyB3ZSdsbCBrZWVwIGEgY2FjaGUgb2YgdGhlbSB0byBhdm9pZCBwcm9jZXNzaW5nIHRoZW0gdHdpY2UuCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXR0cmlidXRlSW5mbz4gbUF0dHJpYnV0ZU1hcDsKLQotICAgIC8qKiBNYXAgb2YgYWxsIGF0dHJpYnV0ZSBuYW1lcyBmb3IgYSBnaXZlbiBlbGVtZW50ICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IG1TdHlsZU1hcDsKLSAgICAKLSAgICAvKiogTWFwIG9mIGFsbCAoY29uc3RhbnQsIHZhbHVlKSBwYWlycyBmb3IgYXR0cmlidXRlcyBvZiBmb3JtYXQgZW51bSBvciBmbGFnLgotICAgICAqIEUuZy4gZm9yIGF0dHJpYnV0ZSBuYW1lPWdyYXZpdHksIHRoaXMgdGVsbHMgdXMgdGhlcmUncyBhbiBlbnVtL2ZsYWcgY2FsbGVkICJjZW50ZXIiCi0gICAgICogd2l0aCB2YWx1ZSAweDExLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBtRW51bUZsYWdWYWx1ZXM7Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQXR0cnNYbWxQYXJzZXJ9LCBzZXQgdG8gbG9hZCB0aGluZ3MgZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKiBYTUwgZmlsZS4gTm90aGluZyBoYXMgYmVlbiBwYXJzZWQgeWV0LiBDYWxsZXJzIHNob3VsZCBjYWxsIHtAbGluayAjcHJlbG9hZCgpfQotICAgICAqIG5leHQuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJzWG1sUGFyc2VyKFN0cmluZyBvc0F0dHJzWG1sUGF0aCkgewotICAgICAgICB0aGlzKG9zQXR0cnNYbWxQYXRoLCBudWxsIC8qIGluaGVyaXRhYmxlQXR0cmlidXRlcyAqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQXR0cnNYbWxQYXJzZXJ9IHNldCB0byBsb2FkIHRoaW5ncyBmcm9tIHRoZSBnaXZlbgotICAgICAqIFhNTCBmaWxlLiBJZiBpbmhlcml0YWJsZUF0dHJpYnV0ZXMgaXMgbm9uLW51bGwsIGl0IG11c3QgcG9pbnQgdG8gYSBwcmVsb2FkZWQKLSAgICAgKiB7QGxpbmsgQXR0cnNYbWxQYXJzZXJ9IHdoaWNoIGF0dHJpYnV0ZXMgd2lsbCBiZSB1c2VkIGZvciB0aGlzIG9uZS4gU2luY2UKLSAgICAgKiBhbHJlYWR5IGRlZmluZWQgYXR0cmlidXRlcyBhcmUgbm90IG1vZGlmaWFibGUsIHRoZXkgYXJlIHRodXMgImluaGVyaXRlZCIuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJzWG1sUGFyc2VyKFN0cmluZyBvc0F0dHJzWG1sUGF0aCwgQXR0cnNYbWxQYXJzZXIgaW5oZXJpdGFibGVBdHRyaWJ1dGVzKSB7Ci0gICAgICAgIG1Pc0F0dHJzWG1sUGF0aCA9IG9zQXR0cnNYbWxQYXRoOwotCi0gICAgICAgIC8vIHN0eWxlcyBhcmUgbm90IGluaGVyaXRhYmxlLgotICAgICAgICBtU3R5bGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPigpOwotCi0gICAgICAgIGlmIChpbmhlcml0YWJsZUF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUF0dHJpYnV0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0cmlidXRlSW5mbz4oKTsKLSAgICAgICAgICAgIG1FbnVtRmxhZ1ZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxJbnRlZ2VyPj4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdHRyaWJ1dGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dHJpYnV0ZUluZm8+KGluaGVyaXRhYmxlQXR0cmlidXRlcy5tQXR0cmlidXRlTWFwKTsKLSAgICAgICAgICAgIG1FbnVtRmxhZ1ZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxJbnRlZ2VyPj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFibGVBdHRyaWJ1dGVzLm1FbnVtRmxhZ1ZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBPUyBwYXRoIG9mIHRoZSBhdHRycy54bWwgZmlsZSBwYXJzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9zQXR0cnNYbWxQYXRoKCkgewotICAgICAgICByZXR1cm4gbU9zQXR0cnNYbWxQYXRoOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmVsb2FkcyB0aGUgZG9jdW1lbnQsIHBhcnNpbmcgYWxsIGF0dHJpYnV0ZXMgYW5kIGRlY2xhcmVkIHN0eWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFNlbGYsIGZvciBjb21tYW5kIGNoYWluaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyc1htbFBhcnNlciBwcmVsb2FkKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCi0gICAgICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsICJGYWlsZWQgdG8gZmluZCAlMSRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBtT3NBdHRyc1htbFBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlIHJlcyA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHdoaWxlIChyZXMgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIHJlcy5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFICYmCi0gICAgICAgICAgICAgICAgIXJlcy5nZXROb2RlTmFtZSgpLmVxdWFscygicmVzb3VyY2VzIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmVzID0gcmVzLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsICJGYWlsZWQgdG8gZmluZCBhIDxyZXNvdXJjZXM+IG5vZGUgaW4gJTEkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbU9zQXR0cnNYbWxQYXRoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwYXJzZVJlc291cmNlcyhyZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhbGwgYXR0cmlidXRlcyAmIGphdmFkb2MgZm9yIHRoZSB2aWV3IGNsYXNzIGluZm8gYmFzZWQgb24gdGhlIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZFZpZXdBdHRyaWJ1dGVzKFZpZXdDbGFzc0luZm8gaW5mbykgewotICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sTmFtZSA9IGluZm8uZ2V0U2hvcnRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIERlY2xhcmVTdHlsZWFibGVJbmZvIHN0eWxlID0gbVN0eWxlTWFwLmdldCh4bWxOYW1lKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRBdHRyaWJ1dGVzKHN0eWxlLmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRKYXZhRG9jKHN0eWxlLmdldEphdmFEb2MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhbGwgYXR0cmlidXRlcyBmb3IgdGhlIGxheW91dCBkYXRhIGluZm8gYmFzZWQgb24gdGhlIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZExheW91dFBhcmFtc0F0dHJpYnV0ZXMoTGF5b3V0UGFyYW1zSW5mbyBpbmZvKSB7Ci0gICAgICAgIGlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRyYW5zZm9ybXMgIkxpbmVhckxheW91dCIgYW5kICJMYXlvdXRQYXJhbXMiIGludG8gIkxpbmVhckxheW91dF9MYXlvdXQiLgotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBTdHJpbmcuZm9ybWF0KCIlMSRzXyUyJHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0Vmlld0xheW91dENsYXNzKCkuZ2V0U2hvcnRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRTaG9ydENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIHhtbE5hbWUgPSB4bWxOYW1lLnJlcGxhY2VGaXJzdCgiUGFyYW1zJCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgICAgIERlY2xhcmVTdHlsZWFibGVJbmZvIHN0eWxlID0gbVN0eWxlTWFwLmdldCh4bWxOYW1lKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRBdHRyaWJ1dGVzKHN0eWxlLmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRlY2xlYXJlLXN0eWxlYWJsZSBmb3VuZCBpbiB0aGUgeG1sIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBnZXREZWNsYXJlU3R5bGVhYmxlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtU3R5bGVNYXApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCBlbnVtIGFuZCBmbGFnIGNvbnN0YW50cyBzb3J0ZWQgYnkgcGFyZW50IGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIFRoZSBtYXAgaXMgYXR0cmlidXRlX25hbWUgPT4gKGNvbnN0YW50X25hbWUgPT4gaW50ZWdlcl92YWx1ZSkuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBnZXRFbnVtRmxhZ1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG1FbnVtRmxhZ1ZhbHVlczsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gdGhlIGF0dHJzLnhtbCBPUyBwYXRoLgotICAgICAqIE1heSByZXR1cm4gbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbm5vdCBiZSBwYXJzZWQuIAotICAgICAqLwotICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIGlmIChtRG9jdW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXRJZ25vcmluZ0NvbW1lbnRzKGZhbHNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIG1Eb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UobmV3IEZpbGUobU9zQXR0cnNYbWxQYXRoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJGYWlsZWQgdG8gY3JlYXRlIFhNTCBkb2N1bWVudCBidWlsZGVyIGZvciAlMSRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbU9zQXR0cnNYbWxQYXRoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRmFpbGVkIHRvIHBhcnNlIFhNTCBkb2N1bWVudCAlMSRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbU9zQXR0cnNYbWxQYXRoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJGYWlsZWQgdG8gcmVhZCBYTUwgZG9jdW1lbnQgJTEkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pc0F0dHJzWG1sUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Eb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbGwgdGhlIDxkZWNsYXJlLXN0eWxlYWJsZT4gYW5kIDxhdHRyPiBub2RlcyBpbiB0aGUgdG9wIDxyZXNvdXJjZXM+IG5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVzb3VyY2VzKE5vZGUgcmVzKSB7Ci0gICAgICAgIE5vZGUgbGFzdENvbW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IHJlcy5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6Ci0gICAgICAgICAgICAgICAgbGFzdENvbW1lbnQgPSBub2RlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygiZGVjbGFyZS1zdHlsZWFibGUiKSkgeyAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIE5vZGUgbmFtZU5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZU5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJwYXJlbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudHMgPSBwYXJlbnROb2RlID09IG51bGwgPyBudWxsIDogcGFyZW50Tm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbVN0eWxlTWFwLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyZVN0eWxlYWJsZUluZm8gc3R5bGUgPSBwYXJzZURlY2xhcmVkU3R5bGVhYmxlKG5hbWUsIG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2V0UGFyZW50cyhwYXJlbnRzLnNwbGl0KCJbICx8XSIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0eWxlTWFwLnB1dChuYW1lLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDb21tZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2V0SmF2YURvYyhwYXJzZUphdmFkb2MobGFzdENvbW1lbnQuZ2V0Tm9kZVZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImF0dHIiKSkgeyAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlQXR0cihub2RlLCBsYXN0Q29tbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3RDb21tZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbiA8YXR0cj4gbm9kZSBhbmQgY29udmVydCBpdCBpbnRvIGFuIHtAbGluayBBdHRyaWJ1dGVJbmZvfSBpZiBpdCBpcyB2YWxpZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZUluZm8gcGFyc2VBdHRyKE5vZGUgYXR0ck5vZGUsIE5vZGUgbGFzdENvbW1lbnQpIHsKLSAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gbnVsbDsKLSAgICAgICAgTm9kZSBuYW1lTm9kZSA9IGF0dHJOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmFtZU5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmZvID0gbUF0dHJpYnV0ZU1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmtub3duIHlldCwgcGFyc2UgaXQuCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBrbm93IGJ1dCBpdHMgZm9ybWF0IGlzIHVua25vd24sIHBhcnNlIGl0IHRvby4KLSAgICAgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsIHx8IGluZm8uZ2V0Rm9ybWF0cygpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBwYXJzZUF0dHJpYnV0ZVR5cGVzKGF0dHJOb2RlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU1hcC5wdXQobmFtZSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RDb21tZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG5ldyBBdHRyaWJ1dGVJbmZvKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNldEphdmFEb2MocGFyc2VKYXZhZG9jKGxhc3RDb21tZW50LmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNldERlcHJlY2F0ZWREb2MocGFyc2VEZXByZWNhdGVkRG9jKGxhc3RDb21tZW50LmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgc3R5bGUgbm9kZSwKLSAgICAgKiBlLmcuIGEgZGVjbGFyZS1zdHlsZWFibGUgb2YgbmFtZSAiVGV4dFZpZXciIG9yICJMaW5lYXJMYXlvdXRfTGF5b3V0Ii4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3R5bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWNsYXJlLXN0eWxlYWJsZSBub2RlCi0gICAgICogQHBhcmFtIGRlY2xhcmVTdHlsZWFibGVOb2RlIFRoZSBkZWNsYXJlLXN0eWxlYWJsZSBub2RlIGl0c2VsZiAKLSAgICAgKi8KLSAgICBwcml2YXRlIERlY2xhcmVTdHlsZWFibGVJbmZvIHBhcnNlRGVjbGFyZWRTdHlsZWFibGUoU3RyaW5nIHN0eWxlTmFtZSwKLSAgICAgICAgICAgIE5vZGUgZGVjbGFyZVN0eWxlYWJsZU5vZGUpIHsKLSAgICAgICAgQXJyYXlMaXN0PEF0dHJpYnV0ZUluZm8+IGF0dHJzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGVJbmZvPigpOwotICAgICAgICBOb2RlIGxhc3RDb21tZW50ID0gbnVsbDsKLSAgICAgICAgZm9yIChOb2RlIG5vZGUgPSBkZWNsYXJlU3R5bGVhYmxlTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgbm9kZSAhPSBudWxsOwotICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQotICAgICAgICAgICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6Ci0gICAgICAgICAgICAgICAgbGFzdENvbW1lbnQgPSBub2RlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscygiYXR0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IHBhcnNlQXR0cihub2RlLCBsYXN0Q29tbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFkZChpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXN0Q29tbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJlU3R5bGVhYmxlSW5mbyhzdHlsZU5hbWUsIGF0dHJzLnRvQXJyYXkobmV3IEF0dHJpYnV0ZUluZm9bYXR0cnMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBdHRyaWJ1dGVJbmZvfSBmb3IgYSBzcGVjaWZpYyA8YXR0cj4gWE1MIG5vZGUuCi0gICAgICogVGhpcyBnZXRzIHRoZSBqYXZhZG9jLCB0aGUgdHlwZSwgdGhlIG5hbWUgYW5kIHRoZSBlbnVtL2ZsYWcgdmFsdWVzIGlmIGFueS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIFhNTCBub2RlIGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+Im5hbWUiLCB3aGljaCBpcyBtYW5kYXRvcnkuIFRoZSBub2RlIGlzIHNraXBwZWQgaWYgdGhpcyBpcyBtaXNzaW5nLjwvbGk+Ci0gICAgICogPGxpPiJmb3JtYXQiLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBUaGUgZm9ybWF0IG1heSBiZSBvbmUgdHlwZSBvciB0d28gdHlwZXMgKGUuZy4gInJlZmVyZW5jZXxjb2xvciIpLgotICAgICAqIEFuIGV4dHJhIGZvcm1hdCBjYW4gYmUgaW1wbGllZDogImVudW0iIG9yICJmbGFnIiBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgImZvcm1hdCIgYXR0cmlidXRlLAotICAgICAqIHRoZXkgYXJlIGltcGxpY2l0ZWx5IHN0YXRlZCBieSB0aGUgcHJlc2VuY2Ugb2Ygc3ViLW5vZGVzIDxlbnVtPiBvciA8ZmxhZz4uCi0gICAgICogPHAvPgotICAgICAqIEJ5IGRlc2lnbiwgPGF0dHI+IG5vZGVzIG9mIHRoZSBzYW1lIG5hbWUgTVVTVCBoYXZlIHRoZSBzYW1lIHR5cGUuCi0gICAgICogQXR0cmlidXRlIG5vZGVzIGFyZSB0aHVzIGNhY2hlZCBieSBuYW1lIGFuZCByZXVzZWQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KLSAgICAgKiBXaGVuIHJldXNpbmcgYSBub2RlLCBpdCBpcyBkdXBsaWNhdGVkIGFuZCBpdHMgamF2YWRvYyByZWFzc2lnbmVkLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZUluZm8gcGFyc2VBdHRyaWJ1dGVUeXBlcyhOb2RlIGF0dHJOb2RlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBUcmVlU2V0PEF0dHJpYnV0ZUluZm8uRm9ybWF0PiBmb3JtYXRzID0gbmV3IFRyZWVTZXQ8QXR0cmlidXRlSW5mby5Gb3JtYXQ+KCk7Ci0gICAgICAgIFN0cmluZ1tdIGVudW1WYWx1ZXMgPSBudWxsOwotICAgICAgICBTdHJpbmdbXSBmbGFnVmFsdWVzID0gbnVsbDsKLQotICAgICAgICBOb2RlIGF0dHJGb3JtYXQgPSBhdHRyTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYXR0ckZvcm1hdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBmIDogYXR0ckZvcm1hdC5nZXROb2RlVmFsdWUoKS5zcGxpdCgiXFx8IikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZvcm1hdCBmb3JtYXQgPSBBdHRyaWJ1dGVJbmZvLkZvcm1hdC52YWx1ZU9mKGYudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVudW0gYW5kIGZsYWdzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IHJpZ2h0IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCAhPSBBdHRyaWJ1dGVJbmZvLkZvcm1hdC5FTlVNICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICE9IEF0dHJpYnV0ZUluZm8uRm9ybWF0LkZMQUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJVbmtub3duIGZvcm1hdCBuYW1lICclcycgaW4gPGF0dHIgbmFtZT1cIiVzXCI+LCBmaWxlICclcycuIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIG5hbWUsIGdldE9zQXR0cnNYbWxQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvZXMgdGhpcyA8YXR0cj4gaGF2ZSA8ZW51bT4gY2hpbGRyZW4/Ci0gICAgICAgIGVudW1WYWx1ZXMgPSBwYXJzZUVudW1GbGFnVmFsdWVzKGF0dHJOb2RlLCAiZW51bSIsIG5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChlbnVtVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKEF0dHJpYnV0ZUluZm8uRm9ybWF0LkVOVU0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG9lcyB0aGlzIDxhdHRyPiBoYXZlIDxmbGFnPiBjaGlsZHJlbj8KLSAgICAgICAgZmxhZ1ZhbHVlcyA9IHBhcnNlRW51bUZsYWdWYWx1ZXMoYXR0ck5vZGUsICJmbGFnIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGZsYWdWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoQXR0cmlidXRlSW5mby5Gb3JtYXQuRkxBRyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBdHRyaWJ1dGVJbmZvIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbyhuYW1lLAotICAgICAgICAgICAgICAgIGZvcm1hdHMudG9BcnJheShuZXcgQXR0cmlidXRlSW5mby5Gb3JtYXRbZm9ybWF0cy5zaXplKCldKSk7Ci0gICAgICAgIGluZm8uc2V0RW51bVZhbHVlcyhlbnVtVmFsdWVzKTsKLSAgICAgICAgaW5mby5zZXRGbGFnVmFsdWVzKGZsYWdWYWx1ZXMpOwotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhbiBYTUwgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gPGF0dHI+IG5vZGUsIHRoaXMgbWV0aG9kIHNlYXJjaGVzCi0gICAgICogaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZHJlbiBub2RlcyBuYW1lZCAidGFyZ2V0IiAoZS5nLiAiZW51bSIgb3IgImZsYWciKS4KLSAgICAgKiBTdWNoIG5vZGVzIG11c3QgaGF2ZSBhICJuYW1lIiBhdHRyaWJ1dGUuCi0gICAgICogPHAvPgotICAgICAqIElmICJhdHRyTm9kZSIgaXMgbnVsbCwgbG9vayBmb3IgYW55IDxhdHRyPiB0aGF0IGhhcyB0aGUgZ2l2ZW4gYXR0ck5vZGUKLSAgICAgKiBhbmQgdGhlIHJlcXVlc3RlZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgY29sbGVjdHMgYWxsIHRoZSBwb3NzaWJsZSBuYW1lcyBvZiB0aGVzZSBjaGlsZHJlbiBub2RlcyBhbmQKLSAgICAgKiByZXR1cm4gdGhlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXR0ck5vZGUgVGhlIDxhdHRyPiBYTUwgbm9kZQotICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGNoaWxkIG5vZGUgdG8gbG9vayBmb3IsIGVpdGhlciAiZW51bSIgb3IgImZsYWciLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgdmFsdWUgb2YgdGhlIG5hbWUgYXR0cmlidXRlIG9mIDxhdHRyPiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE51bGwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggY2hpbGRyZW4gbm9kZXMsIG90aGVyd2lzZSBhbiBhcnJheSBvZiBsZW5ndGggPj0gMQotICAgICAqICAgICAgICAgb2YgYWxsIHRoZSBuYW1lcyBvZiB0aGVzZSBjaGlsZHJlbiBub2Rlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIHBhcnNlRW51bUZsYWdWYWx1ZXMoTm9kZSBhdHRyTm9kZSwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChOb2RlIGNoaWxkID0gYXR0ck5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKGZpbHRlcikpIHsKLSAgICAgICAgICAgICAgICBOb2RlIG5hbWVOb2RlID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibmFtZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChuYW1lTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG5hbWUgYXR0cmlidXRlIGluIDxhdHRyIG5hbWU9XCIlc1wiPjwlcz48L2F0dHI+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLCBmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIE5vZGUgdmFsdWVOb2RlID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidmFsdWUiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgdmFsdWUgYXR0cmlidXRlIGluIDxhdHRyIG5hbWU9XCIlc1wiPjwlcyBuYW1lPVwiJXNcIj48L2F0dHI+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSwgZmlsdGVyLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSB2YWx1ZS5zdGFydHNXaXRoKCIweCIpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDIpLCAxNiAvKiByYWRpeCAqLykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwID0gbUVudW1GbGFnVmFsdWVzLmdldChhdHRyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVudW1GbGFnVmFsdWVzLnB1dChhdHRyTmFtZSwgbWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChuYW1lLCBJbnRlZ2VyLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBpbiA8YXR0ciBuYW1lPVwiJXNcIj48JXMgbmFtZT1cIiVzXCIgdmFsdWU9XCIlc1wiPjwvYXR0cj4gaXMgbm90IGEgdmFsaWQgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLCBmaWx0ZXIsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZXMgPT0gbnVsbCA/IG51bGwgOiBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgamF2YWRvYyBjb21tZW50LgotICAgICAqIE9ubHkga2VlcHMgdGhlIGZpcnN0IHNlbnRlbmNlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRvZXMgbm90IHJlbW92ZSBub3Igc2ltcGxpZnkgbGlua3MgYW5kIHJlZmVyZW5jZXMuIFN1Y2ggYSB0cmFuc2Zvcm1hdGlvbgotICAgICAqIGlzIGRvbmUgbGF0ZXIgYXQgImRpc3BsYXkiIHRpbWUgaW4ge0BsaW5rIERlc2NyaXB0b3JzVXRpbHMjZm9ybWF0VG9vbHRpcChTdHJpbmcpfSBhbmQgY28uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VKYXZhZG9jKFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIGlmIChjb21tZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzYW5pdGl6ZSAmIGNvbGxhcHNlIHdoaXRlc3BhY2UKLSAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZUFsbCgiXFxzKyIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFueSBAZGVwcmVjYXRlZCB0YWdzIHNpbmNlIHRoZXkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLSAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZUFsbCgiKD86XFx7QGRlcHJlY2F0ZWRbXn1dKlxcfXxAZGVwcmVjYXRlZFteQH1dKikiLCAiIik7Ci0KLSAgICAgICAgLy8gdGFrZSBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCBkb3QgdGhhdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0gICAgICAgIC8vIEkgbG92ZSByZWdleHBzIDotKS4gRm9yIHRoZSBjdXJpb3VzLCB0aGUgcmVnZXhwIGlzOgotICAgICAgICAvLyAtIHN0YXJ0IG9mIGxpbmUKLSAgICAgICAgLy8gLSBpZ25vcmUgd2hpdGVzcGFjZQotICAgICAgICAvLyAtIGdyb3VwOgotICAgICAgICAvLyAgIC0gZXZlcnl0aGluZywgbm90IGdyZWVkeQotICAgICAgICAvLyAgIC0gbm9uLWNhcHR1cmluZyBncm91cCAoPzogKQotICAgICAgICAvLyAgICAgIC0gZW5kIG9mIHN0cmluZwotICAgICAgICAvLyAgICAgIG9yCi0gICAgICAgIC8vICAgICAgLSBub3QgcHJlY2VkZWQgYnkgYSBsZXR0ZXIsIGEgZG90IGFuZCBhbm90aGVyIGxldHRlciAoZm9yICJpLmUiIGFuZCAiZS5nIiApCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8ISBub24tY2FwdHVyaW5nIHplcm8td2lkdGggbmVnYXRpdmUgbG9vay1iZWhpbmQpCi0gICAgICAgIC8vICAgICAgLSBhIGRvdAotICAgICAgICAvLyAgICAgIC0gZm9sbG93ZWQgYnkgYSBzcGFjZSAoPz0gbm9uLWNhcHR1cmluZyB6ZXJvLXdpZHRoIHBvc2l0aXZlIGxvb2stYWhlYWQpCi0gICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSBpcyBpZ25vcmVkCi0gICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnJlcGxhY2VGaXJzdCgiXlxccyooLio/KD86JHwoPzwhW2EtekEtWl1cXC5bYS16QS1aXSlcXC4oPz1cXHMpKSkuKiIsICIkMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb21tZW50OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBqYXZhZG9jIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBAZGVwcmVjYXRlZCB0YWcsIGlmIGFueS4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBubyBAZGVwcmVjYXRlZCB0YWcuCi0gICAgICogVGhlIGRlcHJlY2F0ZWQgdGFnIGNhbiBiZSBvZiB0d28gZm9ybXM6Ci0gICAgICogLSB7K0BkZXByZWNhdGVkIC4uLnRleHQgdGlsbCB0aGUgbmV4dCBicmFja2V0IH0KLSAgICAgKiAgIE5vdGU6IHRoZXJlIHNob3VsZCBiZSBubyBzcGFjZSBvciArIGJldHdlZW4geyBhbmQgQC4gSSBuZWVkIG9uZSBpbiB0aGlzIGNvbW1lbnQgb3RoZXJ3aXNlCi0gICAgICogICB0aGlzIG1ldGhvZCB3aWxsIGJlIHRhZ2dlZCBhcyBkZXByZWNhdGVkIDstKQotICAgICAqIC0gQGRlcHJlY2F0ZWQgLi4udGV4dCB0aWxsIHRoZSBuZXh0IEB0YWcgb3IgZW5kIG9mIHRoZSBjb21tZW50LgotICAgICAqIEluIGJvdGggY2FzZXMgdGhlIGNvbW1lbnQgY2FuIGJlIG11bHRpLWxpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VEZXByZWNhdGVkRG9jKFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIC8vIFNraXAgaWYgd2UgY2FuJ3QgZXZlbiBmaW5kIHRoZSB0YWcgaW4gdGhlIGNvbW1lbnQuCi0gICAgICAgIGlmIChjb21tZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzYW5pdGl6ZSAmIGNvbGxhcHNlIHdoaXRlc3BhY2UKLSAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZUFsbCgiXFxzKyIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIGludCBwb3MgPSBjb21tZW50LmluZGV4T2YoIntAZGVwcmVjYXRlZCIpOwotICAgICAgICBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZyhwb3MgKyAxMiAvKiBsZW4gb2Yge0BkZXByZWNhdGVkICovKTsKLSAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnJlcGxhY2VGaXJzdCgiXihbXn1dKikuKiIsICIkMSIpOwotICAgICAgICB9IGVsc2UgaWYgKChwb3MgPSBjb21tZW50LmluZGV4T2YoIkBkZXByZWNhdGVkIikpID49IDApIHsKLSAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZyhwb3MgKyAxMSAvKiBsZW4gb2YgQGRlcHJlY2F0ZWQgKi8pOwotICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZUZpcnN0KCJeKC4qPykoPzpALip8JCkiLCAiJDEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tbWVudC50cmltKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9EZWNsYXJlU3R5bGVhYmxlSW5mby5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9EZWNsYXJlU3R5bGVhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZhNzY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvRGVjbGFyZVN0eWxlYWJsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLQotLyoqCi0gKiBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVwcmVzZW50IGEgVmlldyBvciBWaWV3R3JvdXAgKGFrYSBMYXlvdXQpIGl0ZW0KLSAqIGluIHRoZSBsYXlvdXQgaGllcmFyY2h5LCBhcyBleHRyYWN0ZWQgZnJvbSB0aGUgbWFpbiBhbmRyb2lkLmphciBhbmQgdGhlCi0gKiBhc3NvY2lhdGVkIGF0dHJzLnhtbC4KLSAqLwotcHVibGljIGNsYXNzIERlY2xhcmVTdHlsZWFibGVJbmZvIHsKLSAgICAvKiogVGhlIHN0eWxlIG5hbWUsIG5ldmVyIG51bGwuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVN0eWxlTmFtZTsKLSAgICAvKiogQXR0cmlidXRlcyBmb3IgdGhpcyB2aWV3IG9yIHZpZXcgZ3JvdXAuIENhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4gKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZUluZm9bXSBtQXR0cmlidXRlczsKLSAgICAvKiogU2hvcnQgamF2YWRvYy4gQ2FuIGJlIG51bGwuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUphdmFEb2M7Ci0gICAgLyoqIE9wdGlvbmFsIG5hbWUgb2YgdGhlIHBhcmVudHMgc3R5bGFibGUuIENhbiBiZSBudWxsLiAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbVBhcmVudHM7ICAgIAotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVJbmZvIHsKLSAgICAgICAgLyoqIFhNTCBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZW51bSBGb3JtYXQgewotICAgICAgICAgICAgU1RSSU5HLAotICAgICAgICAgICAgQk9PTEVBTiwKLSAgICAgICAgICAgIElOVEVHRVIsCi0gICAgICAgICAgICBGTE9BVCwKLSAgICAgICAgICAgIFJFRkVSRU5DRSwKLSAgICAgICAgICAgIENPTE9SLAotICAgICAgICAgICAgRElNRU5TSU9OLAotICAgICAgICAgICAgRlJBQ1RJT04sCi0gICAgICAgICAgICBFTlVNLAotICAgICAgICAgICAgRkxBRywKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEZvcm1hdHMgb2YgdGhlIGF0dHJpYnV0ZS4gQ2Fubm90IGJlIG51bGwuIFNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBmb3JtYXQuICovCi0gICAgICAgIHByaXZhdGUgRm9ybWF0W10gbUZvcm1hdHM7Ci0gICAgICAgIC8qKiBWYWx1ZXMgZm9yIGVudW0uIG51bGwgZm9yIG90aGVyIHR5cGVzLiAqLwotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1FbnVtVmFsdWVzOwotICAgICAgICAvKiogVmFsdWVzIGZvciBmbGFnLiBudWxsIGZvciBvdGhlciB0eXBlcy4gKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtRmxhZ1ZhbHVlczsKLSAgICAgICAgLyoqIFNob3J0IGphdmFkb2MgKGkuZS4gdGhlIGZpcnN0IHNlbnRlbmNlKS4gKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUphdmFEb2M7Ci0gICAgICAgIC8qKiBEb2N1bWVudGF0aW9uIGZvciBkZXByZWNhdGVkIGF0dHJpYnV0ZXMuIE51bGwgaWYgbm90IGRlcHJlY2F0ZWQuICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EZXByZWNhdGVkRG9jOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgWE1MIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0cyBUaGUgZm9ybWF0cyBvZiB0aGUgYXR0cmlidXRlLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGZvcm1hdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJbmZvKFN0cmluZyBuYW1lLCBGb3JtYXRbXSBmb3JtYXRzKSB7Ci0gICAgICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICBtRm9ybWF0cyA9IGZvcm1hdHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIFhNTCBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdHMgVGhlIGZvcm1hdHMgb2YgdGhlIGF0dHJpYnV0ZS4gQ2Fubm90IGJlIG51bGwuCi0gICAgICAgICAqICAgICAgICAgICAgICAgIFNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBmb3JtYXQuCi0gICAgICAgICAqIEBwYXJhbSBqYXZhZG9jIFNob3J0IGphdmFkb2MgKGkuZS4gdGhlIGZpcnN0IHNlbnRlbmNlKS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJbmZvKFN0cmluZyBuYW1lLCBGb3JtYXRbXSBmb3JtYXRzLCBTdHJpbmcgamF2YWRvYykgewotICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgbUZvcm1hdHMgPSBmb3JtYXRzOwotICAgICAgICAgICAgbUphdmFEb2MgPSBqYXZhZG9jOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEF0dHJpYnV0ZUluZm8oQXR0cmlidXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBtTmFtZSA9IGluZm8ubU5hbWU7Ci0gICAgICAgICAgICBtRm9ybWF0cyA9IGluZm8ubUZvcm1hdHM7Ci0gICAgICAgICAgICBtRW51bVZhbHVlcyA9IGluZm8ubUVudW1WYWx1ZXM7Ci0gICAgICAgICAgICBtRmxhZ1ZhbHVlcyA9IGluZm8ubUZsYWdWYWx1ZXM7Ci0gICAgICAgICAgICBtSmF2YURvYyA9IGluZm8ubUphdmFEb2M7Ci0gICAgICAgICAgICBtRGVwcmVjYXRlZERvYyA9IGluZm8ubURlcHJlY2F0ZWREb2M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBYTUwgTmFtZSBvZiB0aGUgYXR0cmlidXRlICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiogUmV0dXJucyB0aGUgZm9ybWF0cyBvZiB0aGUgYXR0cmlidXRlLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgICAgICogIFNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBmb3JtYXQuICovCi0gICAgICAgIHB1YmxpYyBGb3JtYXRbXSBnZXRGb3JtYXRzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXRzOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZm9yIGVudW1zLiBudWxsIGZvciBvdGhlciB0eXBlcy4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEVudW1WYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVudW1WYWx1ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlcyBmb3IgZmxhZ3MuIG51bGwgZm9yIG90aGVyIHR5cGVzLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RmxhZ1ZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlczsKLSAgICAgICAgfQotICAgICAgICAvKiogUmV0dXJucyBhIHNob3J0IGphdmFkb2MsIC5pLmUuIHRoZSBmaXJzdCBzZW50ZW5jZS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRG9jKCkgewotICAgICAgICAgICAgcmV0dXJuIG1KYXZhRG9jOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXByZWNhdGVkIGF0dHJpYnV0ZXMuIE51bGwgaWYgbm90IGRlcHJlY2F0ZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwcmVjYXRlZERvYygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVwcmVjYXRlZERvYzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBTZXRzIHRoZSB2YWx1ZXMgZm9yIGVudW1zLiBudWxsIGZvciBvdGhlciB0eXBlcy4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1FbnVtVmFsdWVzID0gdmFsdWVzOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBTZXRzIHRoZSB2YWx1ZXMgZm9yIGZsYWdzLiBudWxsIGZvciBvdGhlciB0eXBlcy4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmxhZ1ZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1GbGFnVmFsdWVzID0gdmFsdWVzOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBTZXRzIGEgc2hvcnQgamF2YWRvYywgLmkuZS4gdGhlIGZpcnN0IHNlbnRlbmNlLiAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRG9jKFN0cmluZyBqYXZhRG9jKSB7Ci0gICAgICAgICAgICBtSmF2YURvYyA9IGphdmFEb2M7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFNldHMgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRlcHJlY2F0ZWQgYXR0cmlidXRlcy4gTnVsbCBpZiBub3QgZGVwcmVjYXRlZC4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwcmVjYXRlZERvYyhTdHJpbmcgZGVwcmVjYXRlZERvYykgewotICAgICAgICAgICAgbURlcHJlY2F0ZWREb2MgPSBkZXByZWNhdGVkRG9jOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBEZWNsYXJlU3R5bGVhYmxlSW5mb30uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3R5bGUuIFNob3VsZCBub3QgYmUgZW1wdHkgbm9yIG51bGwuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgbGlzdCBvZiBhdHRyaWJ1dGVzLiBDYW4gYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVjbGFyZVN0eWxlYWJsZUluZm8oU3RyaW5nIHN0eWxlTmFtZSwgQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgbVN0eWxlTmFtZSA9IHN0eWxlTmFtZTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzID09IG51bGwgPyBuZXcgQXR0cmlidXRlSW5mb1swXSA6IGF0dHJpYnV0ZXM7Ci0gICAgfQotICAgIAotICAgIC8qKiBSZXR1cm5zIHN0eWxlIG5hbWUgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdHlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgdmlldyBvciB2aWV3IGdyb3VwLiBNYXliZSBlbXB0eSBidXQgbm90IG51bGwuICovCi0gICAgcHVibGljIEF0dHJpYnV0ZUluZm9bXSBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhpcyBWaWV3IG9yIFZpZXdHcm91cC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZUluZm9bXSBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFJldHVybnMgYSBzaG9ydCBqYXZhZG9jICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhRG9jKCkgewotICAgICAgICByZXR1cm4gbUphdmFEb2M7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGphdmFkb2MuICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YURvYyhTdHJpbmcgamF2YURvYykgewotICAgICAgICBtSmF2YURvYyA9IGphdmFEb2M7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHBhcmVudHMgc3R5bGVhYmxlLiBDYW4gYmUgbnVsbC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRzKFN0cmluZ1tdIHBhcmVudHMpIHsKLSAgICAgICAgbVBhcmVudHMgPSBwYXJlbnRzOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnRzIHN0eWxlYWJsZS4gQ2FuIGJlIG51bGwuICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmVudHMoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0lJZFJlc291cmNlSXRlbS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9JSWRSZXNvdXJjZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkNjgzNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0lJZFJlc291cmNlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzOwotCi0vKioKLSAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBwcm92aWRlcyBhIG1ldGhvZCBpbmRpY2F0aW5nIHRoZSBzdGF0ZSBvZiBhIHJlc291cmNlIG9mCi0gKiB0eXBlIHtAbGluayBSZXNvdXJjZVR5cGUjSUR9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJZFJlc291cmNlSXRlbSB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBJRCByZXNvdXJjZSBoYXMgYmVlbiBkZWNsYXJlZCBpbmxpbmUgaW5zaWRlIGFub3RoZXIgcmVzb3VyY2UgWE1MIGZpbGUuIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjbGFyZWRJbmxpbmUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvSVJlc291cmNlUmVwb3NpdG9yeS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9JUmVzb3VyY2VSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjVkYzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9JUmVzb3VyY2VSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLS8qKgotICogQSByZXBvc2l0b3J5IG9mIHJlc291cmNlcy4gVGhpcyBhbGxvd3MgYWNjZXNzIHRvIHRoZSByZXNvdXJjZSBieSB7QGxpbmsgUmVzb3VyY2VUeXBlfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VSZXBvc2l0b3J5IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZXNlbnQge0BsaW5rIFJlc291cmNlVHlwZX1zIGluIHRoZSBwcm9qZWN0LgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHR5cGUgb2YgcmVzb3VyY2VzIGV4aXN0aW5nIGluIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZVR5cGVbXSBnZXRBdmFpbGFibGVSZXNvdXJjZVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBleGlzdGluZyByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZXMgdG8gcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlc291cmNlSXRlbVtdIGdldFJlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcmVzb3VyY2VzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhcmUgcHJlc2VudC4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2VzIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1Jlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZXBvc2l0b3J5IGlzIGEgc3lzdGVtIHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTeXN0ZW1SZXBvc2l0b3J5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvUmVzb3VyY2VJdGVtLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQwZmZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvUmVzb3VyY2VJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLS8qKgotICogQmFzZSBjbGFzcyByZXByZXNlbnRpbmcgYSBSZXNvdXJjZSBJdGVtLCBhcyByZXR1cm5lZCBieSBhIHtAbGluayBJUmVzb3VyY2VSZXBvc2l0b3J5fS4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSXRlbSBpbXBsZW1lbnRzIENvbXBhcmFibGU8UmVzb3VyY2VJdGVtPiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZUl0ZW0KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYXMgaXQgYXBwZWFycyBpbiB0aGUgWE1MIGFuZCBSLmphdmEgZmlsZXMuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlSXRlbShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgaXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIFJlc291cmNlSXRlbX0gdG8gYW5vdGhlci4KLSAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIFJlc291cmNlSXRlbSB0byBiZSBjb21wYXJlZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhSZXNvdXJjZUl0ZW0gb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lLmNvbXBhcmVUbyhvdGhlci5tTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVR5cGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvUmVzb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOGUxZmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLS8qKgotICogRW51bSByZXByZXNlbnRpbmcgYSB0eXBlIG9mIGNvbXBpbGVkIHJlc291cmNlLgotICovCi1wdWJsaWMgZW51bSBSZXNvdXJjZVR5cGUgewotICAgIEFOSU0oImFuaW0iLCAiQW5pbWF0aW9uIiksIC8vJE5PTi1OTFMtMSQKLSAgICBBUlJBWSgiYXJyYXkiLCAiQXJyYXkiLCAic3RyaW5nLWFycmF5IiwgImludGVnZXItYXJyYXkiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLSAgICBBVFRSKCJhdHRyIiwgIkF0dHIiKSwgLy8kTk9OLU5MUy0xJAotICAgIENPTE9SKCJjb2xvciIsICJDb2xvciIpLCAvLyROT04tTkxTLTEkCi0gICAgRElNRU4oImRpbWVuIiwgIkRpbWVuc2lvbiIpLCAvLyROT04tTkxTLTEkCi0gICAgRFJBV0FCTEUoImRyYXdhYmxlIiwgIkRyYXdhYmxlIiksIC8vJE5PTi1OTFMtMSQKLSAgICBJRCgiaWQiLCAiSUQiKSwgLy8kTk9OLU5MUy0xJAotICAgIExBWU9VVCgibGF5b3V0IiwgIkxheW91dCIpLCAvLyROT04tTkxTLTEkCi0gICAgTUVOVSgibWVudSIsICJNZW51IiksIC8vJE5PTi1OTFMtMSQKLSAgICBSQVcoInJhdyIsICJSYXciKSwgLy8kTk9OLU5MUy0xJAotICAgIFNUUklORygic3RyaW5nIiwgIlN0cmluZyIpLCAvLyROT04tTkxTLTEkCi0gICAgU1RZTEUoInN0eWxlIiwgIlN0eWxlIiksIC8vJE5PTi1OTFMtMSQKLSAgICBTVFlMRUFCTEUoInN0eWxlYWJsZSIsICJTdHlsZWFibGUiKSwgLy8kTk9OLU5MUy0xJAotICAgIFhNTCgieG1sIiwgIlhNTCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQWx0ZXJuYXRlWG1sTmFtZXM7Ci0KLSAgICBSZXNvdXJjZVR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkaXNwbGF5TmFtZSwgU3RyaW5nLi4uIGFsdGVybmF0ZVhtbE5hbWVzKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgIG1BbHRlcm5hdGVYbWxOYW1lcyA9IGFsdGVybmF0ZVhtbE5hbWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSB0eXBlIG5hbWUsIGFzIHVzZWQgYnkgWE1MIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0cmFuc2xhdGVkIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW51bSBieSBpdHMgbmFtZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBYTUwgb3IgdGhlIFIgY2xhc3MuCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyB7QGxpbmsgUmVzb3VyY2VUeXBlfSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZVR5cGUgZ2V0RW51bShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKFJlc291cmNlVHlwZSByVHlwZSA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoclR5cGUubU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJUeXBlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyVHlwZS5tQWx0ZXJuYXRlWG1sTmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbHRlcm5hdGUgWG1sIE5hbWVzLCB3ZSB0ZXN0IHRob3NlIHRvbwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFsdGVybmF0ZSA6IHJUeXBlLm1BbHRlcm5hdGVYbWxOYW1lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRlLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJUeXBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyB1c2FibGUgaW4gYW4gWE1MIHRvIHVzZSB0aGUgc3BlY2lmaWVkIHtAbGluayBSZXNvdXJjZUl0ZW19LgotICAgICAqIEBwYXJhbSByZXNvdXJjZUl0ZW0gVGhlIHJlc291cmNlIGl0ZW0uCi0gICAgICogQHBhcmFtIHN5c3RlbSBXaGV0aGVyIHRoaXMgaXMgYSBzeXN0ZW0gcmVzb3VyY2Ugb3IgYSBwcm9qZWN0IHJlc291cmNlLgotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBAW3R5cGVdL1tuYW1lXSAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFN0cmluZyhSZXNvdXJjZUl0ZW0gcmVzb3VyY2VJdGVtLCBib29sZWFuIHN5c3RlbSkgewotICAgICAgICBpZiAodGhpcyA9PSBJRCAmJiByZXNvdXJjZUl0ZW0gaW5zdGFuY2VvZiBJSWRSZXNvdXJjZUl0ZW0pIHsKLSAgICAgICAgICAgIElJZFJlc291cmNlSXRlbSBpZFJlc291cmNlID0gKElJZFJlc291cmNlSXRlbSlyZXNvdXJjZUl0ZW07Ci0gICAgICAgICAgICBpZiAoaWRSZXNvdXJjZS5pc0RlY2xhcmVkSW5saW5lKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHN5c3RlbT8iQGFuZHJvaWQ6IjoiQCsiKSArIG1OYW1lICsgIi8iICsgcmVzb3VyY2VJdGVtLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoc3lzdGVtPyJAYW5kcm9pZDoiOiJAIikgKyBtTmFtZSArICIvIiArIHJlc291cmNlSXRlbS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgdGhlIG5hbWVzIGRlZmluZWQgYnkgdGhpcyBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0TmFtZXMoKSB7Ci0gICAgICAgIFJlc291cmNlVHlwZVtdIHZhbHVlcyA9IHZhbHVlcygpOwotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSB2YWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIG5hbWVzW2ldID0gdmFsdWVzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9WaWV3Q2xhc3NJbmZvLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpZXdDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlYjFlNC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpZXdDbGFzc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm87Ci0KLS8qKgotICogSW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlcHJlc2VudCBhIFZpZXcgb3IgVmlld0dyb3VwIChha2EgTGF5b3V0KSBpdGVtCi0gKiBpbiB0aGUgbGF5b3V0IGhpZXJhcmNoeSwgYXMgZXh0cmFjdGVkIGZyb20gdGhlIG1haW4gYW5kcm9pZC5qYXIgYW5kIHRoZQotICogYXNzb2NpYXRlZCBhdHRycy54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3Q2xhc3NJbmZvIHsKLSAgICAvKiogSXMgdGhpcyBhIGxheW91dCBjbGFzcyAoaS5lLiBWaWV3R3JvdXApIG9yIGp1c3QgYSB2aWV3PyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNMYXlvdXQ7Ci0gICAgLyoqIEZRQ04gZS5nLiBhbmRyb2lkLnZpZXcuVmlldywgbmV2ZXIgbnVsbC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtQ2Fub25pY2FsQ2xhc3NOYW1lOwotICAgIC8qKiBTaG9ydCBjbGFzcyBuYW1lLCBlLmcuIFZpZXcsIG5ldmVyIG51bGwuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNob3J0Q2xhc3NOYW1lOwotICAgIC8qKiBTdXBlciBjbGFzcy4gQ2FuIGJlIG51bGwuICovCi0gICAgcHJpdmF0ZSBWaWV3Q2xhc3NJbmZvIG1TdXBlckNsYXNzOwotICAgIC8qKiBTaG9ydCBqYXZhZG9jLiBDYW4gYmUgbnVsbC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtSmF2YURvYzsgICAgCi0gICAgLyoqIEF0dHJpYnV0ZXMgZm9yIHRoaXMgdmlldyBvciB2aWV3IGdyb3VwLiBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbmZvW10gbUF0dHJpYnV0ZXM7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYXlvdXRQYXJhbXNJbmZvIHsKLSAgICAgICAgLyoqIFNob3J0IGNsYXNzIG5hbWUsIGUuZy4gTGF5b3V0RGF0YSwgbmV2ZXIgbnVsbC4gKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVNob3J0Q2xhc3NOYW1lOwotICAgICAgICAvKiogVmlld0xheW91dCBjbGFzcyBpbmZvIG93bmluZyB0aGlzIGxheW91dCBkYXRhICovCi0gICAgICAgIHByaXZhdGUgVmlld0NsYXNzSW5mbyBtVmlld0xheW91dENsYXNzOwotICAgICAgICAvKiogU3VwZXIgY2xhc3MuIENhbiBiZSBudWxsLiAqLwotICAgICAgICBwcml2YXRlIExheW91dFBhcmFtc0luZm8gbVN1cGVyQ2xhc3M7IAotICAgICAgICAvKiogTGF5b3V0IERhdGEgQXR0cmlidXRlcyBmb3IgbGF5b3V0IGNsYXNzZXMuIENhbiBiZSBlbXB0eSBidXQgbm90IG51bGwuICovCi0gICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW5mb1tdIG1BdHRyaWJ1dGVzOwotCi0gICAgICAgIHB1YmxpYyBMYXlvdXRQYXJhbXNJbmZvKFZpZXdDbGFzc0luZm8gZW5jbG9zaW5nVmlld0NsYXNzSW5mbywKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRDbGFzc05hbWUsIExheW91dFBhcmFtc0luZm8gc3VwZXJDbGFzc0luZm8pIHsKLSAgICAgICAgICAgIG1TaG9ydENsYXNzTmFtZSA9IHNob3J0Q2xhc3NOYW1lOwotICAgICAgICAgICAgbVZpZXdMYXlvdXRDbGFzcyA9IGVuY2xvc2luZ1ZpZXdDbGFzc0luZm87Ci0gICAgICAgICAgICBtU3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3NJbmZvOwotICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlSW5mb1swXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIFJldHVybnMgc2hvcnQgY2xhc3MgbmFtZSwgZS5nLiAiTGF5b3V0RGF0YSIgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaG9ydENsYXNzTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2hvcnRDbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIFZpZXdMYXlvdXQgY2xhc3MgaW5mbyBlbmNsb3NpbmcgdGhpcyBsYXlvdXQgZGF0YS4gQ2Fubm90IG51bGwuICovCi0gICAgICAgIHB1YmxpYyBWaWV3Q2xhc3NJbmZvIGdldFZpZXdMYXlvdXRDbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmlld0xheW91dENsYXNzOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzdXBlciBjbGFzcyBpbmZvLiBDYW4gYmUgbnVsbC4gKi8KLSAgICAgICAgcHVibGljIExheW91dFBhcmFtc0luZm8gZ2V0U3VwZXJDbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VwZXJDbGFzczsKLSAgICAgICAgfQotICAgICAgICAvKiogUmV0dXJucyB0aGUgTGF5b3V0RGF0YSBhdHRyaWJ1dGVzLiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLiAqLwotICAgICAgICBwdWJsaWMgQXR0cmlidXRlSW5mb1tdIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUF0dHJpYnV0ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFNldHMgdGhlIExheW91dERhdGEgYXR0cmlidXRlcy4gQ2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbC4gKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVJbmZvW10gYXR0cmlidXRlcykgewotICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIExheW91dCBkYXRhIGluZm8gZm9yIGEgbGF5b3V0IGNsYXNzLiBOdWxsIGZvciBhbGwgbm9uLWxheW91dCBjbGFzc2VzIGFuZCBhbHdheXMKLSAgICAgKiAgbm9uLW51bGwgZm9yIGEgbGF5b3V0IGNsYXNzLiAqLwotICAgIHB1YmxpYyBMYXlvdXRQYXJhbXNJbmZvIG1MYXlvdXREYXRhOwotCi0gICAgLy8gLS0tLS0tLS0KLSAgICAKLSAgICBwdWJsaWMgVmlld0NsYXNzSW5mbyhib29sZWFuIGlzTGF5b3V0LCBTdHJpbmcgY2Fub25pY2FsQ2xhc3NOYW1lLCBTdHJpbmcgc2hvcnRDbGFzc05hbWUpIHsKLSAgICAgICAgbUlzTGF5b3V0ID0gaXNMYXlvdXQ7Ci0gICAgICAgIG1DYW5vbmljYWxDbGFzc05hbWUgPSBjYW5vbmljYWxDbGFzc05hbWU7Ci0gICAgICAgIG1TaG9ydENsYXNzTmFtZSA9IHNob3J0Q2xhc3NOYW1lOwotICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVJbmZvWzBdOwotICAgIH0KLSAgICAKLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBsYXlvdXQgY2xhc3MgKGkuZS4gVmlld0dyb3VwKSBvciBqdXN0IGEgVmlldyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0KCkgewotICAgICAgICByZXR1cm4gbUlzTGF5b3V0OwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIEZRQ04gZS5nLiAiYW5kcm9pZC52aWV3LlZpZXciICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYW5vbmljYWxDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQ2Fub25pY2FsQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHNob3J0IGNsYXNzIG5hbWUsIGUuZy4gIlZpZXciICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaG9ydENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MuIENhbiBiZSBudWxsLiAqLwotICAgIHB1YmxpYyBWaWV3Q2xhc3NJbmZvIGdldFN1cGVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyBhIHNob3J0IGphdmFkb2MgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFEb2MoKSB7Ci0gICAgICAgIHJldHVybiBtSmF2YURvYzsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyB2aWV3IG9yIHZpZXcgZ3JvdXAuIE1heWJlIGVtcHR5IGJ1dCBub3QgbnVsbC4gKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlSW5mb1tdIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgTGF5b3V0RGF0YSBpbmZvIGZvciBsYXlvdXQgY2xhc3Nlcy4gTnVsbCBmb3Igbm9uLWxheW91dCB2aWV3IGNsYXNzZXMuICovCi0gICAgcHVibGljIExheW91dFBhcmFtc0luZm8gZ2V0TGF5b3V0RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXlvdXREYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBsaW5rIG9uIHRoZSBpbmZvIG9mIHRoZSBzdXBlciBjbGFzcyBvZiB0aGlzIFZpZXcgb3IgVmlld0dyb3VwLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgc3VwZXIgY2xhc3MgaW5mbyBtdXN0IGJlIG9mIHRoZSBzYW1lIGtpbmQgKGkuZS4gZ3JvdXAgdG8gZ3JvdXAgb3IgdmlldyB0byB2aWV3KQotICAgICAqIGV4Y2VwdCBmb3IgdGhlIHRvcCBWaWV3R3JvdXAgd2hpY2ggbGlua3MgdG8gdGhlIFZpZXcgaW5mby4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHN1cGVyIGNsYXNzIGNhbm5vdCBiZSBudWxsIGV4Y2VwdCBmb3IgdGhlIHRvcCBWaWV3IGluZm8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VwZXJDbGFzcyhWaWV3Q2xhc3NJbmZvIHN1cGVyQ2xhc3MpIHsKLSAgICAgICAgbVN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBqYXZhZG9jIGZvciB0aGlzIFZpZXcgb3IgVmlld0dyb3VwLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFEb2MoU3RyaW5nIGphdmFEb2MpIHsKLSAgICAgICAgbUphdmFEb2MgPSBqYXZhRG9jOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgVmlldyBvciBWaWV3R3JvdXAuICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVJbmZvW10gYXR0cmlidXRlcykgewotICAgICAgICBtQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIExheW91dFBhcmFtc0luZm99IGZvciBsYXlvdXQgY2xhc3Nlcy4KLSAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIG5vbi1sYXlvdXQgdmlldyBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXNJbmZvIGxheW91dERhdGEpIHsKLSAgICAgICAgaWYgKG1Jc0xheW91dCkgewotICAgICAgICAgICAgbUxheW91dERhdGEgPSBsYXlvdXREYXRhOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Db3VudHJ5Q29kZVF1YWxpZmllci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Db3VudHJ5Q29kZVF1YWxpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzAyOGU5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvQ291bnRyeUNvZGVRdWFsaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5JY29uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBSZXNvdXJjZSBRdWFsaWZpZXIgZm9yIE1vYmlsZSBDb3VudHJ5IENvZGUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb3VudHJ5Q29kZVF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLSAgICAvKiogRGVmYXVsdCBwaXhlbCBkZW5zaXR5IHZhbHVlLiBUaGlzIG1lYW5zIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPREUgPSAtMTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc0NvdW50cnlDb2RlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXm1jYyhcXGR7M30pJCIpOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1Db2RlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2JpbGUgQ291bnRyeSBDb2RlIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBxdWFsaWZpZXIgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyIHNlZ21lbnQuIElmIHRoZSBzZWdtZW50IGlzIGluY29ycmVjdCwKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgZm9sZGVyIHNlZ21lbnQgZnJvbSB3aGljaCB0byBjcmVhdGUgYSBxdWFsaWZpZXIuCi0gICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgQ291bnRyeUNvZGVRdWFsaWZpZXJ9IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ291bnRyeUNvZGVRdWFsaWZpZXIgZ2V0UXVhbGlmaWVyKFN0cmluZyBzZWdtZW50KSB7Ci0gICAgICAgIE1hdGNoZXIgbSA9IHNDb3VudHJ5Q29kZVBhdHRlcm4ubWF0Y2hlcihzZWdtZW50KTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgIGludCBjb2RlID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHYpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBzdHJpbmcgd2UgZXh0cmFjdGVkIHdhc24ndCBhIHZhbGlkIG51bWJlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ291bnRyeUNvZGVRdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IENvdW50cnlDb2RlUXVhbGlmaWVyKGNvZGUpOwotICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvbGRlciBuYW1lIHNlZ21lbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3RvU3RyaW5nKCl9IG9uIGEge0BsaW5rIENvdW50cnlDb2RlUXVhbGlmaWVyfSBvYmplY3QuCi0gICAgICogQHBhcmFtIGNvZGUgdGhlIHZhbHVlIG9mIHRoZSBxdWFsaWZpZXIsIGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Q29kZSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KGludCBjb2RlKSB7Ci0gICAgICAgIGlmIChjb2RlICE9IERFRkFVTFRfQ09ERSAmJiBjb2RlID49IDEwMCAmJiBjb2RlIDw9OTk5KSB7IC8vIGNvZGUgaXMgMyBkaWdpdC4pIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJtY2MlMSRkIiwgY29kZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBDb3VudHJ5Q29kZVF1YWxpZmllcigpIHsKLSAgICAgICAgdGhpcyhERUZBVUxUX0NPREUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb3VudHJ5Q29kZVF1YWxpZmllcihpbnQgY29kZSkgewotICAgICAgICBtQ29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb2RlKCkgewotICAgICAgICByZXR1cm4gbUNvZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDb3VudHJ5IENvZGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotICAgICAgICByZXR1cm4gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKCJtY2MiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29kZSAhPSBERUZBVUxUX0NPREU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBDb3VudHJ5Q29kZVF1YWxpZmllciBxdWFsaWZpZXIgPSBnZXRRdWFsaWZpZXIodmFsdWUpOwotICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRDb3VudHJ5Q29kZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIENvdW50cnlDb2RlUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvZGUgPT0gKChDb3VudHJ5Q29kZVF1YWxpZmllcilxdWFsaWZpZXIpLm1Db2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXNlZCB0byByZXByZXNlbnQgdGhpcyBxdWFsaWZpZXIgaW4gdGhlIGZvbGRlciBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEZvbGRlclNlZ21lbnQobUNvZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtQ29kZSAhPSBERUZBVUxUX0NPREUpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJNQ0MgJTEkZCIsIG1Db2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvRm9sZGVyQ29uZmlndXJhdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Gb2xkZXJDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWM4Y2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Gb2xkZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRm9sZGVyVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIFJlc291cmNlIEZvbGRlcnMuIEFsbCB0aGUgcHJvcGVydGllcyBoYXZlIGEgZGVmYXVsdAotICogdmFsdWUgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvbGRlckNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPEZvbGRlckNvbmZpZ3VyYXRpb24+IHsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBRVUFMSUZJRVJfU0VQID0gIi0iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlUXVhbGlmaWVyW10gbVF1YWxpZmllcnMgPSBuZXcgUmVzb3VyY2VRdWFsaWZpZXJbSU5ERVhfQ09VTlRdOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX0NPVU5UUllfQ09ERSAgICAgICA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX05FVFdPUktfQ09ERSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX0xBTkdVQUdFICAgICAgICAgICA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1JFR0lPTiAgICAgICAgICAgICA9IDM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1NDUkVFTl9TSVpFICAgICAgICA9IDQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1NDUkVFTl9SQVRJTyAgICAgICA9IDU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1NDUkVFTl9PUklFTlRBVElPTiA9IDY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1BJWEVMX0RFTlNJVFkgICAgICA9IDc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1RPVUNIX1RZUEUgICAgICAgICA9IDg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX0tFWUJPQVJEX1NUQVRFICAgICA9IDk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1RFWFRfSU5QVVRfTUVUSE9EICA9IDEwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkRFWF9OQVZJR0FUSU9OX01FVEhPRCAgPSAxMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSU5ERVhfU0NSRUVOX0RJTUVOU0lPTiAgID0gMTI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVYX1ZFUlNJT04gICAgICAgICAgICA9IDEzOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkRFWF9DT1VOVCAgICAgICAgICAgICAgPSAxNDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB7QGxpbmsgUmVzb3VyY2VRdWFsaWZpZXJ9IHRoYXQgbWFrZSB1cCBhIEZvbGRlciBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFF1YWxpZmllckNvdW50KCkgewotICAgICAgICByZXR1cm4gSU5ERVhfQ09VTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29uZmlnIGZyb20gdGhlIHF1YWxpZmllcnMgb2YgYSBnaXZlbiA8dmFyPmNvbmZpZzwvdmFyPi4KLSAgICAgKiBAcGFyYW0gY29uZmlnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0KEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgSU5ERVhfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUXVhbGlmaWVyc1tpXSA9IGNvbmZpZy5tUXVhbGlmaWVyc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHF1YWxpZmllcnMgZnJvbSB0aGUgcmVjZWl2ZXIgaWYgdGhleSBhcmUgcHJlc2VudCAoYW5kIHZhbGlkKQotICAgICAqIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN1YnN0cmFjdChGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBJTkRFWF9DT1VOVCA7IGkrKykgewotICAgICAgICAgICAgaWYgKGNvbmZpZy5tUXVhbGlmaWVyc1tpXSAhPSBudWxsICYmIGNvbmZpZy5tUXVhbGlmaWVyc1tpXS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICBtUXVhbGlmaWVyc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBpbnZhbGlkIHF1YWxpZmllciwgb3IgPGNvZGU+bnVsbDxjb2RlPiBpZiB0aGV5IGFyZSBhbGwgdmFsaWQgKG9yIGlmIG5vbmUKLSAgICAgKiBleGlzdHMpLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVF1YWxpZmllciBnZXRJbnZhbGlkUXVhbGlmaWVyKCkgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBJTkRFWF9DT1VOVCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1RdWFsaWZpZXJzW2ldICE9IG51bGwgJiYgbVF1YWxpZmllcnNbaV0uaXNWYWxpZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1RdWFsaWZpZXJzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsIGFsbG9jYXRlZCBxdWFsaWZpZXJzIGFyZSB2YWxpZCwgd2UgcmV0dXJuIG51bGwuCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgUmVnaW9uIHF1YWxpZmllciBpcyB2YWxpZC4gUmVnaW9uIHF1YWxpZmllciBjYW4gb25seSBiZSBwcmVzZW50IGlmIGEKLSAgICAgKiBMYW5ndWFnZSBxdWFsaWZpZXIgaXMgcHJlc2VudCBhcyB3ZWxsLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgUmVnaW9uIHF1YWxpZmllciBpcyB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1JlZ2lvbigpIHsKLSAgICAgICAgaWYgKG1RdWFsaWZpZXJzW0lOREVYX0xBTkdVQUdFXSA9PSBudWxsICYmIG1RdWFsaWZpZXJzW0lOREVYX1JFR0lPTl0gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHF1YWxpZmllciB0byB0aGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259Ci0gICAgICogQHBhcmFtIHF1YWxpZmllciB0aGUge0BsaW5rIFJlc291cmNlUXVhbGlmaWVyfSB0byBhZGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgQ291bnRyeUNvZGVRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0NPVU5UUllfQ09ERV0gPSBxdWFsaWZpZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgTmV0d29ya0NvZGVRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX05FVFdPUktfQ09ERV0gPSBxdWFsaWZpZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgTGFuZ3VhZ2VRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0xBTkdVQUdFXSA9IHF1YWxpZmllcjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBSZWdpb25RdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1JFR0lPTl0gPSBxdWFsaWZpZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgU2NyZWVuU2l6ZVF1YWxpZmllcikgewotICAgICAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX1NJWkVdID0gcXVhbGlmaWVyOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFNjcmVlblJhdGlvUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fUkFUSU9dID0gcXVhbGlmaWVyOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fT1JJRU5UQVRJT05dID0gcXVhbGlmaWVyOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFBpeGVsRGVuc2l0eVF1YWxpZmllcikgewotICAgICAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfUElYRUxfREVOU0lUWV0gPSBxdWFsaWZpZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgVG91Y2hTY3JlZW5RdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1RPVUNIX1RZUEVdID0gcXVhbGlmaWVyOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0tFWUJPQVJEX1NUQVRFXSA9IHF1YWxpZmllcjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1RFWFRfSU5QVVRfTUVUSE9EXSA9IHF1YWxpZmllcjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9OQVZJR0FUSU9OX01FVEhPRF0gPSBxdWFsaWZpZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fRElNRU5TSU9OXSA9IHF1YWxpZmllcjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBWZXJzaW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9WRVJTSU9OXSA9IHF1YWxpZmllcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBnaXZlbiBxdWFsaWZpZXIgZnJvbSB0aGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259LgotICAgICAqIEBwYXJhbSBxdWFsaWZpZXIgdGhlIHtAbGluayBSZXNvdXJjZVF1YWxpZmllcn0gdG8gcmVtb3ZlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVF1YWxpZmllcihSZXNvdXJjZVF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgSU5ERVhfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtUXVhbGlmaWVyc1tpXSA9PSBxdWFsaWZpZXIpIHsKLSAgICAgICAgICAgICAgICBtUXVhbGlmaWVyc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHF1YWxpZmllciBieSBpdHMgaW5kZXguIFRoZSB0b3RhbCBudW1iZXIgb2YgcXVhbGlmaWVycyBjYW4gYmUgYWNjZXNzZWQgYnkKLSAgICAgKiB7QGxpbmsgI2dldFF1YWxpZmllckNvdW50KCl9LgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHF1YWxpZmllciB0byByZXR1cm4uCi0gICAgICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUgYXQgdGhlIGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVF1YWxpZmllciBnZXRRdWFsaWZpZXIoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtUXVhbGlmaWVyc1tpbmRleF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUNvZGVRdWFsaWZpZXIoQ291bnRyeUNvZGVRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0NPVU5UUllfQ09ERV0gPSBxdWFsaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIENvdW50cnlDb2RlUXVhbGlmaWVyIGdldENvdW50cnlDb2RlUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gKENvdW50cnlDb2RlUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX0NPVU5UUllfQ09ERV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmV0d29ya0NvZGVRdWFsaWZpZXIoTmV0d29ya0NvZGVRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX05FVFdPUktfQ09ERV0gPSBxdWFsaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE5ldHdvcmtDb2RlUXVhbGlmaWVyIGdldE5ldHdvcmtDb2RlUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gKE5ldHdvcmtDb2RlUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX05FVFdPUktfQ09ERV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2VRdWFsaWZpZXIoTGFuZ3VhZ2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0xBTkdVQUdFXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGFuZ3VhZ2VRdWFsaWZpZXIgZ2V0TGFuZ3VhZ2VRdWFsaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoTGFuZ3VhZ2VRdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfTEFOR1VBR0VdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlZ2lvblF1YWxpZmllcihSZWdpb25RdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1JFR0lPTl0gPSBxdWFsaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlZ2lvblF1YWxpZmllciBnZXRSZWdpb25RdWFsaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoUmVnaW9uUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX1JFR0lPTl07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NyZWVuU2l6ZVF1YWxpZmllcihTY3JlZW5TaXplUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fU0laRV0gPSBxdWFsaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFNjcmVlblNpemVRdWFsaWZpZXIgZ2V0U2NyZWVuU2l6ZVF1YWxpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIChTY3JlZW5TaXplUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX1NDUkVFTl9TSVpFXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JlZW5SYXRpb1F1YWxpZmllcihTY3JlZW5SYXRpb1F1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX1JBVElPXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuUmF0aW9RdWFsaWZpZXIgZ2V0U2NyZWVuUmF0aW9RdWFsaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoU2NyZWVuUmF0aW9RdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX1JBVElPXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcihTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX09SSUVOVEFUSU9OXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIgZ2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX09SSUVOVEFUSU9OXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIoUGl4ZWxEZW5zaXR5UXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9QSVhFTF9ERU5TSVRZXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGl4ZWxEZW5zaXR5UXVhbGlmaWVyIGdldFBpeGVsRGVuc2l0eVF1YWxpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIChQaXhlbERlbnNpdHlRdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfUElYRUxfREVOU0lUWV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG91Y2hUeXBlUXVhbGlmaWVyKFRvdWNoU2NyZWVuUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9UT1VDSF9UWVBFXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVG91Y2hTY3JlZW5RdWFsaWZpZXIgZ2V0VG91Y2hUeXBlUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gKFRvdWNoU2NyZWVuUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX1RPVUNIX1RZUEVdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfS0VZQk9BUkRfU1RBVEVdID0gcXVhbGlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyIGdldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllciltUXVhbGlmaWVyc1tJTkRFWF9LRVlCT0FSRF9TVEFURV07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKFRleHRJbnB1dE1ldGhvZFF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfVEVYVF9JTlBVVF9NRVRIT0RdID0gcXVhbGlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIgZ2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gKFRleHRJbnB1dE1ldGhvZFF1YWxpZmllciltUXVhbGlmaWVyc1tJTkRFWF9URVhUX0lOUFVUX01FVEhPRF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcihOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9OQVZJR0FUSU9OX01FVEhPRF0gPSBxdWFsaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIgZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIChOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKW1RdWFsaWZpZXJzW0lOREVYX05BVklHQVRJT05fTUVUSE9EXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIoU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fRElNRU5TSU9OXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyIGdldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIChTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX0RJTUVOU0lPTl07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvblF1YWxpZmllcihWZXJzaW9uUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9WRVJTSU9OXSA9IHF1YWxpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVyc2lvblF1YWxpZmllciBnZXRWZXJzaW9uUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gKFZlcnNpb25RdWFsaWZpZXIpbVF1YWxpZmllcnNbSU5ERVhfVkVSU0lPTl07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGFuIG9iamVjdCBpcyBlcXVhbHMgdG8gdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9sZGVyQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBmYyA9IChGb2xkZXJDb25maWd1cmF0aW9uKW9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IElOREVYX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyID0gbVF1YWxpZmllcnNbaV07Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgZmNRdWFsaWZpZXIgPSBmYy5tUXVhbGlmaWVyc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllci5lcXVhbHMoZmNRdWFsaWZpZXIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZjUXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIENvbmZpZ3VyYXRpb24gaGFzIG9ubHkgZGVmYXVsdCB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotICAgICAgICBmb3IgKFJlc291cmNlUXVhbGlmaWVyIGlycSA6IG1RdWFsaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoaXJxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgZm9sZGVyIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJOYW1lKFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXIsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKGZvbGRlci5nZXROYW1lKCkpOwotCi0gICAgICAgIGZvciAoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyIDogbVF1YWxpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZWdtZW50ID0gcXVhbGlmaWVyLmdldEZvbGRlclNlZ21lbnQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCAhPSBudWxsICYmIHNlZ21lbnQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoUVVBTElGSUVSX1NFUCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBmb2xkZXIgd2l0aCB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlck5hbWUoUmVzb3VyY2VGb2xkZXJUeXBlIGZvbGRlciwgSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBudWxsOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZGsgY3VycmVudFNkayA9IFNkay5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gY3VycmVudFNkay5nZXRUYXJnZXQocHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0Rm9sZGVyTmFtZShmb2xkZXIsIHRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgI3RvRGlzcGxheVN0cmluZygpfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdG9EaXNwbGF5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyB2YWxpZCBmb3IgZGlzcGxheSBwdXJwb3NlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCkgewotICAgICAgICBpZiAoaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllciA9IG51bGw7Ci0KLSAgICAgICAgLy8gcHJlLSBsYW5ndWFnZS9yZWdpb24gcXVhbGlmaWVycwotICAgICAgICB3aGlsZSAoaW5kZXggPCBJTkRFWF9MQU5HVUFHRSkgewotICAgICAgICAgICAgcXVhbGlmaWVyID0gbVF1YWxpZmllcnNbaW5kZXgrK107Ci0gICAgICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocXVhbGlmaWVyLmdldFN0cmluZ1ZhbHVlKCkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzIHRoZSBsYW5ndWFnZS9yZWdpb24gcXVhbGlmaWVyIGluIGEgY3VzdG9tIHdheSwgaWYgdGhlcmUgYXJlIGJvdGggbm9uIG51bGwuCi0gICAgICAgIGlmIChtUXVhbGlmaWVyc1tJTkRFWF9MQU5HVUFHRV0gIT0gbnVsbCAmJiBtUXVhbGlmaWVyc1tJTkRFWF9SRUdJT05dICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IG1RdWFsaWZpZXJzW0lOREVYX0xBTkdVQUdFXS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgU3RyaW5nIHJlZ2lvbiA9IG1RdWFsaWZpZXJzW0lOREVYX1JFR0lPTl0uZ2V0U3RyaW5nVmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlc18lcyIsIGxhbmd1YWdlLCByZWdpb24pKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9zdCBsYW5ndWFnZS9yZWdpb24gcXVhbGlmaWVycy4KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgSU5ERVhfQ09VTlQpIHsKLSAgICAgICAgICAgIHF1YWxpZmllciA9IG1RdWFsaWZpZXJzW2luZGV4KytdOwotICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHF1YWxpZmllci5nZXRTdHJpbmdWYWx1ZSgpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEZvbGRlckNvbmZpZ3VyYXRpb24gZm9sZGVyQ29uZmlnKSB7Ci0gICAgICAgIC8vIGRlZmF1bHQgYXJlIGFsd2F5cyBhdCB0aGUgdG9wLgotICAgICAgICBpZiAoaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIGlmIChmb2xkZXJDb25maWcuaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyB3ZSBjb21wYXJlIHRoZSBxdWFsaWZpZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IElOREVYX0NPVU5UOyBpKyspIHsKLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcjEgPSBtUXVhbGlmaWVyc1tpXTsKLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcjIgPSBmb2xkZXJDb25maWcubVF1YWxpZmllcnNbaV07Ci0KLSAgICAgICAgICAgIGlmIChxdWFsaWZpZXIxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVyMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZXIyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHF1YWxpZmllcjEuY29tcGFyZVRvKHF1YWxpZmllcjIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGFycml2ZSBoZXJlLCBhbGwgdGhlIHF1YWxpZmllciBtYXRjaGVzCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBpcyBhIG1hdGNoIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlIGNvbmZpZy4KLSAgICAgKiA8cC8+QSBtYXRjaCBtZWFucyB0aGF0LCBmb3IgZWFjaCBxdWFsaWZpZXIgb2YgdGhpcyBjb25maWcKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSByZWZlcmVuY2UgY29uZmlnIGhhcyBubyB2YWx1ZSBzZXQKLSAgICAgKiA8bGk+b3IsIHRoZSBxdWFsaWZpZXIgb2YgdGhlIHJlZmVyZW5jZSBjb25maWcgaXMgYSBtYXRjaC4gRGVwZW5kaW5nIG9uIHRoZSBxdWFsaWZpZXIgdHlwZQotICAgICAqIHRoaXMgZG9lcyBub3QgbWVhbiB0aGUgc2FtZSBleGFjdCB2YWx1ZS48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHBhcmFtIHJlZmVyZW5jZUNvbmZpZyBUaGUgcmVmZXJlbmNlIGNvbmZpZ3VyYXRpb24gdG8gdGVzdCBhZ2FpbnN0LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZmlndXJhdGlvbiBtYXRjaGVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hGb3IoRm9sZGVyQ29uZmlndXJhdGlvbiByZWZlcmVuY2VDb25maWcpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgSU5ERVhfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHRlc3RRdWFsaWZpZXIgPSBtUXVhbGlmaWVyc1tpXTsKLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHJlZmVyZW5jZVF1YWxpZmllciA9IHJlZmVyZW5jZUNvbmZpZy5tUXVhbGlmaWVyc1tpXTsKLQotICAgICAgICAgICAgLy8gaXQncyBvbmx5IGEgbm9uIG1hdGNoIGlmIGJvdGggcXVhbGlmaWVycyBhcmUgbm9uLW51bGwsIGFuZCB0aGV5IGRvbid0IG1hdGNoLgotICAgICAgICAgICAgaWYgKHRlc3RRdWFsaWZpZXIgIT0gbnVsbCAmJiByZWZlcmVuY2VRdWFsaWZpZXIgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFF1YWxpZmllci5pc01hdGNoRm9yKHJlZmVyZW5jZVF1YWxpZmllcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbiBudWxsIHtAbGluayBSZXNvdXJjZVF1YWxpZmllcn0gc3RhcnRpbmcgYXQgaW5kZXgKLSAgICAgKiA8dmFyPnN0YXJ0SW5kZXg8L3Zhcj4KLSAgICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgICAqIEByZXR1cm4gLTEgaWYgbm8gcXVhbGlmaWVyIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEhpZ2hlc3RQcmlvcml0eVF1YWxpZmllcihpbnQgc3RhcnRJbmRleCkgewotICAgICAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleCA7IGkgPCBJTkRFWF9DT1VOVCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1RdWFsaWZpZXJzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgZGVmYXVsdCBxdWFsaWZpZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHQoKSB7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX0NPVU5UUllfQ09ERV0gPSBuZXcgQ291bnRyeUNvZGVRdWFsaWZpZXIoKTsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfTkVUV09SS19DT0RFXSA9IG5ldyBOZXR3b3JrQ29kZVF1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9MQU5HVUFHRV0gPSBuZXcgTGFuZ3VhZ2VRdWFsaWZpZXIoKTsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfUkVHSU9OXSA9IG5ldyBSZWdpb25RdWFsaWZpZXIoKTsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX1NJWkVdID0gbmV3IFNjcmVlblNpemVRdWFsaWZpZXIoKTsKLSAgICAgICAgbVF1YWxpZmllcnNbSU5ERVhfU0NSRUVOX1JBVElPXSA9IG5ldyBTY3JlZW5SYXRpb1F1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9TQ1JFRU5fT1JJRU5UQVRJT05dID0gbmV3IFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCk7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1BJWEVMX0RFTlNJVFldID0gbmV3IFBpeGVsRGVuc2l0eVF1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9UT1VDSF9UWVBFXSA9IG5ldyBUb3VjaFNjcmVlblF1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9LRVlCT0FSRF9TVEFURV0gPSBuZXcgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9URVhUX0lOUFVUX01FVEhPRF0gPSBuZXcgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCk7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX05BVklHQVRJT05fTUVUSE9EXSA9IG5ldyBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCk7Ci0gICAgICAgIG1RdWFsaWZpZXJzW0lOREVYX1NDUkVFTl9ESU1FTlNJT05dID0gbmV3IFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpOwotICAgICAgICBtUXVhbGlmaWVyc1tJTkRFWF9WRVJTSU9OXSA9IG5ldyBWZXJzaW9uUXVhbGlmaWVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG5vbiBudWxsIHF1YWxpZmllcnMuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlUXVhbGlmaWVyW10gZ2V0UXVhbGlmaWVycygpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgSU5ERVhfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtUXVhbGlmaWVyc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlUXVhbGlmaWVyW10gYXJyYXkgPSBuZXcgUmVzb3VyY2VRdWFsaWZpZXJbY291bnRdOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBJTkRFWF9DT1VOVCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1RdWFsaWZpZXJzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnJheVtpbmRleCsrXSA9IG1RdWFsaWZpZXJzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvS2V5Ym9hcmRTdGF0ZVF1YWxpZmllci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9LZXlib2FyZFN0YXRlUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDQyOGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9LZXlib2FyZFN0YXRlUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLQotLyoqCi0gKiBSZXNvdXJjZSBRdWFsaWZpZXIgZm9yIGtleWJvYXJkIHN0YXRlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiS2V5Ym9hcmQgU3RhdGUiOwotCi0gICAgcHJpdmF0ZSBLZXlib2FyZFN0YXRlIG1WYWx1ZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTY3JlZW4gT3JpZW50YXRpb24gZW51bS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGVudW0gS2V5Ym9hcmRTdGF0ZSB7Ci0gICAgICAgIEVYUE9TRUQoImtleXNleHBvc2VkIiwgIkV4cG9zZWQiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBISURERU4oImtleXNoaWRkZW4iLCAiSGlkZGVuIiksICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU09GVCgia2V5c3NvZnQiLCAiU29mdCIpOyAgICAgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVZhbHVlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheVZhbHVlOwotCi0gICAgICAgIHByaXZhdGUgS2V5Ym9hcmRTdGF0ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBkaXNwbGF5VmFsdWUpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgbURpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtIGZvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHJldHVybiB0aGUgZW51bSBmb3IgdGhlIHF1YWxpZmllciB2YWx1ZSBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHdhcyBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgS2V5Ym9hcmRTdGF0ZSBnZXRFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChLZXlib2FyZFN0YXRlIG9yaWVudCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9yaWVudC5tVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleChLZXlib2FyZFN0YXRlIHZhbHVlKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKEtleWJvYXJkU3RhdGUgaW5wdXQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBpbnB1dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgS2V5Ym9hcmRTdGF0ZSBnZXRCeUluZGV4KGludCBpbmRleCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChLZXlib2FyZFN0YXRlIHZhbHVlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcihLZXlib2FyZFN0YXRlIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBLZXlib2FyZFN0YXRlIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiS2V5Ym9hcmQiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotICAgICAgICByZXR1cm4gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKCJrZXlib2FyZCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZSAhPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQW5kU2V0KFN0cmluZyB2YWx1ZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgS2V5Ym9hcmRTdGF0ZSBvcmllbnRhdGlvbiA9IEtleWJvYXJkU3RhdGUuZ2V0RW51bSh2YWx1ZSk7Ci0gICAgICAgIGlmIChvcmllbnRhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBLZXlib2FyZFN0YXRlUXVhbGlmaWVyIHF1YWxpZmllciA9IG5ldyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICBxdWFsaWZpZXIubVZhbHVlID0gb3JpZW50YXRpb247Ci0gICAgICAgICAgICBjb25maWcuc2V0S2V5Ym9hcmRTdGF0ZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaEZvcihSZXNvdXJjZVF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIgcmVmZXJlbmNlUXVhbGlmaWVyID0gKEtleWJvYXJkU3RhdGVRdWFsaWZpZXIpcXVhbGlmaWVyOwotCi0gICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgRVhQT1NFRCBjYW4gYmUgdXNlZCBmb3IgU09GVAotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVF1YWxpZmllci5tVmFsdWUgPT0gS2V5Ym9hcmRTdGF0ZS5TT0ZUICYmCi0gICAgICAgICAgICAgICAgICAgIG1WYWx1ZSA9PSBLZXlib2FyZFN0YXRlLkVYUE9TRUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZVF1YWxpZmllci5tVmFsdWUgPT0gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQmV0dGVyTWF0Y2hUaGFuKFJlc291cmNlUXVhbGlmaWVyIGNvbXBhcmVUbywgUmVzb3VyY2VRdWFsaWZpZXIgcmVmZXJlbmNlKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBLZXlib2FyZFN0YXRlUXVhbGlmaWVyIGNvbXBhcmVRdWFsaWZpZXIgPSAoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllciljb21wYXJlVG87Ci0gICAgICAgIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIgcmVmZXJlbmNlUXVhbGlmaWVyID0gKEtleWJvYXJkU3RhdGVRdWFsaWZpZXIpcmVmZXJlbmNlOwotICAgICAgICBpZiAocmVmZXJlbmNlUXVhbGlmaWVyLm1WYWx1ZSA9PSBLZXlib2FyZFN0YXRlLlNPRlQpIHsgLy8gb25seSBjYXNlIHdoZXJlIHRoZXJlIGNvdWxkIGJlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHRlciBxdWFsaWZpZXIKLSAgICAgICAgICAgIC8vIG9ubHkgcmV0dXJuIHRydWUgaWYgaXQncyBhIGJldHRlciB2YWx1ZS4KLSAgICAgICAgICAgIGlmIChjb21wYXJlUXVhbGlmaWVyLm1WYWx1ZSA9PSBLZXlib2FyZFN0YXRlLkVYUE9TRUQgJiYgbVZhbHVlID09IEtleWJvYXJkU3RhdGUuU09GVCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBLZXlib2FyZFN0YXRlUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlID09ICgoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcilxdWFsaWZpZXIpLm1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXREaXNwbGF5VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTGFuZ3VhZ2VRdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTGFuZ3VhZ2VRdWFsaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmNWM1Mi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL0xhbmd1YWdlUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUmVzb3VyY2UgUXVhbGlmaWVyIGZvciBMYW5ndWFnZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExhbmd1YWdlUXVhbGlmaWVyIGV4dGVuZHMgUmVzb3VyY2VRdWFsaWZpZXIgewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc0xhbmd1YWdlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXlthLXpdezJ9JCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkxhbmd1YWdlIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBxdWFsaWZpZXIgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyIHNlZ21lbnQuIElmIHRoZSBzZWdtZW50IGlzIGluY29ycmVjdCwKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgZm9sZGVyIHNlZ21lbnQgZnJvbSB3aGljaCB0byBjcmVhdGUgYSBxdWFsaWZpZXIuCi0gICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgTGFuZ3VhZ2VRdWFsaWZpZXJ9IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2VRdWFsaWZpZXIgZ2V0UXVhbGlmaWVyKFN0cmluZyBzZWdtZW50KSB7Ci0gICAgICAgIGlmIChzTGFuZ3VhZ2VQYXR0ZXJuLm1hdGNoZXIoc2VnbWVudCkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBMYW5ndWFnZVF1YWxpZmllciBxdWFsaWZpZXIgPSBuZXcgTGFuZ3VhZ2VRdWFsaWZpZXIoKTsKLSAgICAgICAgICAgIHF1YWxpZmllci5tVmFsdWUgPSBzZWdtZW50OwotCi0gICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvbGRlciBuYW1lIHNlZ21lbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3RvU3RyaW5nKCl9IG9uIGEge0BsaW5rIExhbmd1YWdlUXVhbGlmaWVyfSBvYmplY3QuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcXVhbGlmaWVyLCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZhbHVlKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvbGRlclNlZ21lbnQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyBzZWdtZW50ID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKHNMYW5ndWFnZVBhdHRlcm4ubWF0Y2hlcihzZWdtZW50KS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZWdtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExhbmd1YWdlUXVhbGlmaWVyKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIExhbmd1YWdlUXVhbGlmaWVyKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWUgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0FuZFNldChTdHJpbmcgdmFsdWUsIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIExhbmd1YWdlUXVhbGlmaWVyIHF1YWxpZmllciA9IGdldFF1YWxpZmllcih2YWx1ZSk7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldExhbmd1YWdlUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgTGFuZ3VhZ2VRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIGlmIChtVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKExhbmd1YWdlUXVhbGlmaWVyKXF1YWxpZmllcikubVZhbHVlID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmVxdWFscygoKExhbmd1YWdlUXVhbGlmaWVyKXF1YWxpZmllcikubVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRGb2xkZXJTZWdtZW50KG1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNiOWNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0KLS8qKgotICogUmVzb3VyY2UgUXVhbGlmaWVyIGZvciBOYXZpZ2F0aW9uIE1ldGhvZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIgZXh0ZW5kcyBSZXNvdXJjZVF1YWxpZmllciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIk5hdmlnYXRpb24gTWV0aG9kIjsKLQotICAgIHByaXZhdGUgTmF2aWdhdGlvbk1ldGhvZCBtVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBOYXZpZ2F0aW9uIE1ldGhvZCBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBOYXZpZ2F0aW9uTWV0aG9kIHsKLSAgICAgICAgRFBBRCgiZHBhZCIsICJELXBhZCIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIFRSQUNLQkFMTCgidHJhY2tiYWxsIiwgIlRyYWNrYmFsbCIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIFdIRUVMKCJ3aGVlbCIsICJXaGVlbCIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgIE5PTkFWKCJub25hdiIsICJObyBOYXZpZ2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5OwotCi0gICAgICAgIHByaXZhdGUgTmF2aWdhdGlvbk1ldGhvZChTdHJpbmcgdmFsdWUsIFN0cmluZyBkaXNwbGF5KSB7Ci0gICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIG1EaXNwbGF5ID0gZGlzcGxheTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtIGZvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHJldHVybiB0aGUgZW51bSBmb3IgdGhlIHF1YWxpZmllciB2YWx1ZSBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHdhcyBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvbk1ldGhvZCBnZXRFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChOYXZpZ2F0aW9uTWV0aG9kIG9yaWVudCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9yaWVudC5tVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXgoTmF2aWdhdGlvbk1ldGhvZCB2YWx1ZSkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChOYXZpZ2F0aW9uTWV0aG9kIG5hdiA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hdiA9PSB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvbk1ldGhvZCBnZXRCeUluZGV4KGludCBpbmRleCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChOYXZpZ2F0aW9uTWV0aG9kIHZhbHVlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcihOYXZpZ2F0aW9uTWV0aG9kIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBOYXZpZ2F0aW9uTWV0aG9kIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTmF2aWdhdGlvbiI7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigibmF2cGFkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBOYXZpZ2F0aW9uTWV0aG9kIG1ldGhvZCA9IE5hdmlnYXRpb25NZXRob2QuZ2V0RW51bSh2YWx1ZSk7Ci0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllciBxdWFsaWZpZXIgPSBuZXcgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcihtZXRob2QpOwotICAgICAgICAgICAgY29uZmlnLnNldE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIocXVhbGlmaWVyKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlID09ICgoTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcilxdWFsaWZpZXIpLm1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXREaXNwbGF5VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTmV0d29ya0NvZGVRdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTmV0d29ya0NvZGVRdWFsaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ZmU0ZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05ldHdvcmtDb2RlUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUmVzb3VyY2UgUXVhbGlmaWVyIGZvciBNb2JpbGUgTmV0d29yayBDb2RlIFBpeGVsIERlbnNpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOZXR3b3JrQ29kZVF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLSAgICAvKiogRGVmYXVsdCBwaXhlbCBkZW5zaXR5IHZhbHVlLiBUaGlzIG1lYW5zIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPREUgPSAtMTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gc05ldHdvcmtDb2RlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXm1uYyhcXGR7MSwzfSkkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1Db2RlOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJNb2JpbGUgTmV0d29yayBDb2RlIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBxdWFsaWZpZXIgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyIHNlZ21lbnQuIElmIHRoZSBzZWdtZW50IGlzIGluY29ycmVjdCwKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgZm9sZGVyIHNlZ21lbnQgZnJvbSB3aGljaCB0byBjcmVhdGUgYSBxdWFsaWZpZXIuCi0gICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgQ291bnRyeUNvZGVRdWFsaWZpZXJ9IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmV0d29ya0NvZGVRdWFsaWZpZXIgZ2V0UXVhbGlmaWVyKFN0cmluZyBzZWdtZW50KSB7Ci0gICAgICAgIE1hdGNoZXIgbSA9IHNOZXR3b3JrQ29kZVBhdHRlcm4ubWF0Y2hlcihzZWdtZW50KTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgIGludCBjb2RlID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHYpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBzdHJpbmcgd2UgZXh0cmFjdGVkIHdhc24ndCBhIHZhbGlkIG51bWJlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTmV0d29ya0NvZGVRdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IE5ldHdvcmtDb2RlUXVhbGlmaWVyKGNvZGUpOwotICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvbGRlciBuYW1lIHNlZ21lbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3RvU3RyaW5nKCl9IG9uIGEge0BsaW5rIE5ldHdvcmtDb2RlUXVhbGlmaWVyfSBvYmplY3QuCi0gICAgICogQHBhcmFtIGNvZGUgdGhlIHZhbHVlIG9mIHRoZSBxdWFsaWZpZXIsIGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Q29kZSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KGludCBjb2RlKSB7Ci0gICAgICAgIGlmIChjb2RlICE9IERFRkFVTFRfQ09ERSAmJiBjb2RlID49IDEgJiYgY29kZSA8PSA5OTkpIHsgLy8gY29kZSBpcyAxLTMgZGlnaXQuCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgibW5jJTEkZCIsIGNvZGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmV0d29ya0NvZGVRdWFsaWZpZXIoKSB7Ci0gICAgICAgIHRoaXMoREVGQVVMVF9DT0RFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmV0d29ya0NvZGVRdWFsaWZpZXIoaW50IGNvZGUpIHsKLSAgICAgICAgbUNvZGUgPSBjb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Db2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTmV0d29yayBDb2RlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigibW5jIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbUNvZGUgIT0gREVGQVVMVF9DT0RFOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQW5kU2V0KFN0cmluZyB2YWx1ZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgTWF0Y2hlciBtID0gc05ldHdvcmtDb2RlUGF0dGVybi5tYXRjaGVyKHZhbHVlKTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgIGludCBjb2RlID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHYpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBzdHJpbmcgd2UgZXh0cmFjdGVkIHdhc24ndCBhIHZhbGlkIG51bWJlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5ldHdvcmtDb2RlUXVhbGlmaWVyIHF1YWxpZmllciA9IG5ldyBOZXR3b3JrQ29kZVF1YWxpZmllcihjb2RlKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXROZXR3b3JrQ29kZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIE5ldHdvcmtDb2RlUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvZGUgPT0gKChOZXR3b3JrQ29kZVF1YWxpZmllcilxdWFsaWZpZXIpLm1Db2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXNlZCB0byByZXByZXNlbnQgdGhpcyBxdWFsaWZpZXIgaW4gdGhlIGZvbGRlciBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEZvbGRlclNlZ21lbnQobUNvZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtQ29kZSAhPSBERUZBVUxUX0NPREUpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJNTkMgJTEkZCIsIG1Db2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1BpeGVsRGVuc2l0eVF1YWxpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDMzOTk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JRGVuc2l0eUJhc2VkUmVzb3VyY2VWYWx1ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUmVzb3VyY2UgUXVhbGlmaWVyIGZvciBTY3JlZW4gUGl4ZWwgRGVuc2l0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBpeGVsRGVuc2l0eVF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNEZW5zaXR5TGVnYWN5UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXihcXGQrKWRwaSQiKTsvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlBpeGVsIERlbnNpdHkiOwotCi0gICAgcHJpdmF0ZSBEZW5zaXR5IG1WYWx1ZSA9IERlbnNpdHkuTUVESVVNOwotCi0gICAgLyoqCi0gICAgICogU2NyZWVuIE9yaWVudGF0aW9uIGVudW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIERlbnNpdHkgewotICAgICAgICBISUdIKCJoZHBpIiwgIkhpZ2ggRGVuc2l0eSIsIElEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlLkRlbnNpdHkuSElHSCksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTUVESVVNKCJtZHBpIiwgIk1lZGl1bSBEZW5zaXR5IiwgSURlbnNpdHlCYXNlZFJlc291cmNlVmFsdWUuRGVuc2l0eS5NRURJVU0pLCAvLyROT04tTkxTLTEkCi0gICAgICAgIExPVygibGRwaSIsICJMb3cgRGVuc2l0eSIsIElEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlLkRlbnNpdHkuTE9XKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBOT0RQSSgibm9kcGkiLCAiTm8gRGVuc2l0eSIsIElEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlLkRlbnNpdHkuTk9EUEkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZhbHVlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGlzcGxheVZhbHVlOwotICAgICAgICBwcml2YXRlIGZpbmFsIElEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlLkRlbnNpdHkgbURlbnNpdHk7Ci0KLSAgICAgICAgcHJpdmF0ZSBEZW5zaXR5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRpc3BsYXlWYWx1ZSwKLSAgICAgICAgICAgICAgICBJRGVuc2l0eUJhc2VkUmVzb3VyY2VWYWx1ZS5EZW5zaXR5IGRlbnNpdHkpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgbURpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTsKLSAgICAgICAgICAgIG1EZW5zaXR5ID0gZGVuc2l0eTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtIGZvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHJldHVybiB0aGUgZW51bSBmb3IgdGhlIHF1YWxpZmllciB2YWx1ZSBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHdhcyBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGVuc2l0eSBnZXRFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChEZW5zaXR5IG9yaWVudCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9yaWVudC5tVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgRGVuc2l0eSBnZXRMZWdhY3lFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgTWF0Y2hlciBtID0gc0RlbnNpdHlMZWdhY3lQYXR0ZXJuLm1hdGNoZXIodmFsdWUpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRlbnNpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHYpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKERlbnNpdHkgb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmllbnQubURlbnNpdHkuZ2V0VmFsdWUoKSA9PSBkZW5zaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgdGhlIHN0cmluZyB3ZSBleHRyYWN0ZWQgd2Fzbid0IGEgdmFsaWQgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSByZWdleHAgd291bGQgaGF2ZSBmYWlsZWQuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RHBpVmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlbnNpdHkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGVnYWN5VmFsdWUoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyAhPSBOT0RQSSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRkZHBpIiwgZ2V0RHBpVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSURlbnNpdHlCYXNlZFJlc291cmNlVmFsdWUuRGVuc2l0eX0gdmFsdWUKLSAgICAgICAgICogYXNzb2NpYXRlZCB0byB0aGlzIHtAbGluayBEZW5zaXR5fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJRGVuc2l0eUJhc2VkUmVzb3VyY2VWYWx1ZS5EZW5zaXR5IGdldERlbnNpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlbnNpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleChEZW5zaXR5IHZhbHVlKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKERlbnNpdHkgaW5wdXQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBpbnB1dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGVuc2l0eSBnZXRCeUluZGV4KGludCBpbmRleCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChEZW5zaXR5IHZhbHVlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBpeGVsRGVuc2l0eVF1YWxpZmllcigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyBQaXhlbERlbnNpdHlRdWFsaWZpZXIoRGVuc2l0eSB2YWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVuc2l0eSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigiZHBpIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBEZW5zaXR5IGRlbnNpdHkgPSBEZW5zaXR5LmdldEVudW0odmFsdWUpOwotICAgICAgICBpZiAoZGVuc2l0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZW5zaXR5ID0gRGVuc2l0eS5nZXRMZWdhY3lFbnVtKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZW5zaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBpeGVsRGVuc2l0eVF1YWxpZmllciBxdWFsaWZpZXIgPSBuZXcgUGl4ZWxEZW5zaXR5UXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICBxdWFsaWZpZXIubVZhbHVlID0gZGVuc2l0eTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIocXVhbGlmaWVyKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hGb3IoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBQaXhlbERlbnNpdHlRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUncyBhIGRlbnNpdHkgcXVhbGlmaWVyLCBpdCdzIGFsd2F5cyBhIG1hdGNoLgotICAgICAgICAgICAgLy8gVGhlIGJlc3QgbWF0Y2ggd2lsbCBiZSBmb3VuZCBsYXRlci4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQmV0dGVyTWF0Y2hUaGFuKFJlc291cmNlUXVhbGlmaWVyIGNvbXBhcmVUbywgUmVzb3VyY2VRdWFsaWZpZXIgcmVmZXJlbmNlKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBQaXhlbERlbnNpdHlRdWFsaWZpZXIgY29tcGFyZVEgPSAoUGl4ZWxEZW5zaXR5UXVhbGlmaWVyKWNvbXBhcmVUbzsKLSAgICAgICAgUGl4ZWxEZW5zaXR5UXVhbGlmaWVyIHJlZmVyZW5jZVEgPSAoUGl4ZWxEZW5zaXR5UXVhbGlmaWVyKXJlZmVyZW5jZTsKLQotICAgICAgICBpZiAobVZhbHVlID09IHJlZmVyZW5jZVEubVZhbHVlICYmIGNvbXBhcmVRLm1WYWx1ZSAhPSByZWZlcmVuY2VRLm1WYWx1ZSkgewotICAgICAgICAgICAgLy8gZ290IGV4YWN0IHZhbHVlLCB0aGlzIGlzIHRoZSBiZXN0IQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpbiBhbGwgY2FzZSB3ZSdyZSBnb2luZyB0byBwcmVmZXIgdGhlIGhpZ2hlciBkcGkuCi0gICAgICAgICAgICAvLyBpZiByZWZlcmVuY2UgaXMgaGlnaCwgd2Ugd2FudCBoaWdoZXN0IGRwaS4KLSAgICAgICAgICAgIC8vIGlmIHJlZmVyZW5jZSBpcyBtZWRpdW0sIHdlJ2xsIHByZWZlciB0byBzY2FsZSBkb3duIGhpZ2ggZHBpLCB0aGFuIHNjYWxlIHVwIGxvdyBkcGkKLSAgICAgICAgICAgIC8vIGlmIHJlZmVyZW5jZSBpZiBsb3csIHdlJ2xsIHByZWZlciB0byBzY2FsZSBkb3duIGhpZ2ggdGhhbiBtZWRpdW0gKDI6MSBvdmVyIDQ6MykKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUubURlbnNpdHkuZ2V0VmFsdWUoKSA+IGNvbXBhcmVRLm1WYWx1ZS5tRGVuc2l0eS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFBpeGVsRGVuc2l0eVF1YWxpZmllcikgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSAoKFBpeGVsRGVuc2l0eVF1YWxpZmllcilxdWFsaWZpZXIpLm1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIHZlcnNpb24gPSB0YXJnZXQuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmdldEFwaUxldmVsKCkgPD0gMyAmJiB2ZXJzaW9uLmdldENvZGVuYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldExlZ2FjeVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKLSAgICAgICAgaWYgKG1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldERpc3BsYXlWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9SZWdpb25RdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUmVnaW9uUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTkyYzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9SZWdpb25RdWFsaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5JY29uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBSZXNvdXJjZSBRdWFsaWZpZXIgZm9yIFJlZ2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlZ2lvblF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNSZWdpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJecihbQS1aXXsyfSkkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiUmVnaW9uIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBxdWFsaWZpZXIgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyIHNlZ21lbnQuIElmIHRoZSBzZWdtZW50IGlzIGluY29ycmVjdCwKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgZm9sZGVyIHNlZ21lbnQgZnJvbSB3aGljaCB0byBjcmVhdGUgYSBxdWFsaWZpZXIuCi0gICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgUmVnaW9uUXVhbGlmaWVyfSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlZ2lvblF1YWxpZmllciBnZXRRdWFsaWZpZXIoU3RyaW5nIHNlZ21lbnQpIHsKLSAgICAgICAgTWF0Y2hlciBtID0gc1JlZ2lvblBhdHRlcm4ubWF0Y2hlcihzZWdtZW50KTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBSZWdpb25RdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFJlZ2lvblF1YWxpZmllcigpOwotICAgICAgICAgICAgcXVhbGlmaWVyLm1WYWx1ZSA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9sZGVyIG5hbWUgc2VnbWVudCBmb3IgdGhlIGdpdmVuIHZhbHVlLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAgICAqIHtAbGluayAjdG9TdHJpbmcoKX0gb24gYSB7QGxpbmsgUmVnaW9uUXVhbGlmaWVyfSBvYmplY3QuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcXVhbGlmaWVyLCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZhbHVlKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvbGRlclNlZ21lbnQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VnbWVudCA9ICJyIiArIHZhbHVlLnRvVXBwZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChzUmVnaW9uUGF0dGVybi5tYXRjaGVyKHNlZ21lbnQpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZWdtZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBSZWdpb25RdWFsaWZpZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVnaW9uUXVhbGlmaWVyKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigicmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBSZWdpb25RdWFsaWZpZXIgcXVhbGlmaWVyID0gZ2V0UXVhbGlmaWVyKHZhbHVlKTsKLSAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0UmVnaW9uUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgUmVnaW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBpZiAobVZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChSZWdpb25RdWFsaWZpZXIpcXVhbGlmaWVyKS5tVmFsdWUgPT0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZXF1YWxzKCgoUmVnaW9uUXVhbGlmaWVyKXF1YWxpZmllcikubVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gZ2V0Rm9sZGVyU2VnbWVudChtVmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUmVzb3VyY2VRdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUmVzb3VyY2VRdWFsaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1NGFkMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1Jlc291cmNlUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHJlc291cmNlIHF1YWxpZmllcnMuCi0gKiA8cC8+VGhlIHJlc291cmNlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBkZXNpZ25lZCBhcyBpbW11dGFibGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZVF1YWxpZmllciBpbXBsZW1lbnRzIENvbXBhcmFibGU8UmVzb3VyY2VRdWFsaWZpZXI+IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHF1YWxpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaG9ydGVyIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSBxdWFsaWZpZXIuCi0gICAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGljb24gZm9yIHRoZSBxdWFsaWZpZXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEltYWdlIGdldEljb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcXVhbGlmaWVyIGhhcyBhIHZhbGlkIGZpbHRlciB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgdmFsdWUgaXMgdmFsaWQgZm9yIHRoaXMgcXVhbGlmaWVyLCBhbmQgaWYgc28gc2V0cyB0aGUgdmFsdWUKLSAgICAgKiBpbnRvIGEgRm9sZGVyIENvbmZpZ3VyYXRpb24uCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjayBhbmQgc2V0LiBNdXN0IG5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGZvbGRlciBjb25maWd1cmF0aW9uIHRvIHJlY2VpdmUgdGhlIHZhbHVlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHZhbGlkIGFuZCB3YXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNoZWNrQW5kU2V0KFN0cmluZyB2YWx1ZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBmb3JtYXRlZCB0byBiZSB1c2VkIGluIGEgZm9sZGVyIG5hbWUuCi0gICAgICogPHAvPlRoaXMgaXMgZGVjbGFyZWQgYXMgYWJzdHJhY3QgdG8gZm9yY2UgY2hpbGRyZW4gY2xhc3NlcyB0byBpbXBsZW1lbnQgaXQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHF1YWxpZmllciBpcyBhIG1hdGNoIGZvciB0aGUgcmVjZWl2ZXIuCi0gICAgICogPHAvPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfS4KLSAgICAgKiA8cC8+Q2hpbGRyZW4gY2xhc3MgdGhhdCByZS1pbXBsZW1lbnRzIHRoaXMgbXVzdCBpbXBsZW1lbnQKLSAgICAgKiB7QGxpbmsgI2lzQmV0dGVyTWF0Y2hUaGFuKFJlc291cmNlUXVhbGlmaWVyLCBSZXNvdXJjZVF1YWxpZmllcil9IHRvby4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVyIHRoZSByZWZlcmVuY2UgcXVhbGlmaWVyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2hGb3IoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgIHJldHVybiBlcXVhbHMocXVhbGlmaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgYmV0dGVyIG1hdGNoIGZvciB0aGUgZ2l2ZW4gPHZhcj5yZWZlcmVuY2U8L3Zhcj4gdGhhbgotICAgICAqIHRoZSBnaXZlbiA8dmFyPmNvbXBhcmVUbzwvdmFyPiBjb21wYXJhYmxlLgotICAgICAqIEBwYXJhbSBjb21wYXJlVG8gVGhlIHtAbGluayBSZXNvdXJjZVF1YWxpZmllcn0gdG8gY29tcGFyZSB0by4gQ2FuIGJlIG51bGwsIGluIHdoaWNoCi0gICAgICogY2FzZSB0aGUgbWV0aG9kIG11c3QgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBxdWFsaWZpZXIgdmFsdWUgZm9yIHdoaWNoIHRoZSBtYXRjaCBpcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgYmV0dGVyIG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQmV0dGVyTWF0Y2hUaGFuKFJlc291cmNlUXVhbGlmaWVyIGNvbXBhcmVUbywgUmVzb3VyY2VRdWFsaWZpZXIgcmVmZXJlbmNlKSB7Ci0gICAgICAgIC8vIHRoZSBkZWZhdWx0IGlzIHRvIGFsd2F5cyByZXR1cm4gZmFsc2UuIFRoaXMgZ2l2ZXMgbGVzcyBvdmVyaGVhZCB0aGFuIGFsd2F5cyByZXR1cm5pbmcKLSAgICAgICAgLy8gdHJ1ZSwgYXMgaXQgd291bGQgb25seSBjb21wYXJlIHNhbWUgdmFsdWVzIGFueXdheS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGb2xkZXJTZWdtZW50KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgZm9ybWF0dGVkIGZvciBkaXNwbGF5IHB1cnBvc2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIG9iamVjdHMgYXJlIGVxdWFsLgotICAgICAqIDxwLz5UaGlzIGlzIGRlY2xhcmVkIGFzIGFic3RyYWN0IHRvIGZvcmNlIGNoaWxkcmVuIGNsYXNzZXMgdG8gaW1wbGVtZW50IGl0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICogPHAvPlRoaXMgaXMgZGVjbGFyZWQgYXMgYWJzdHJhY3QgdG8gZm9yY2UgY2hpbGRyZW4gY2xhc3NlcyB0byBpbXBsZW1lbnQgaXQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpOwotCi0gICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oUmVzb3VyY2VRdWFsaWZpZXIgbykgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5jb21wYXJlVG8oby50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbkRpbWVuc2lvblF1YWxpZmllci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5MjliMi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbkRpbWVuc2lvblF1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFJlc291cmNlIFF1YWxpZmllciBmb3IgU2NyZWVuIERpbWVuc2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLSAgICAvKiogRGVmYXVsdCBzY3JlZW4gc2l6ZSB2YWx1ZS4gVGhpcyBtZWFucyB0aGUgcHJvcGVydHkgaXMgbm90IHNldCAqLwotICAgIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9TSVpFID0gLTE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNEaW1lbnNpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4oXFxkKyl4KFxcZCspJCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlNjcmVlbiBEaW1lbnNpb24iOwotCi0gICAgLyoqIFNjcmVlbiBzaXplIDEgdmFsdWUuIFRoaXMgaXMgbm90IHNpemUgWCBvciBZIGJlY2F1c2UgdGhlIGZvbGRlciBuYW1lIGFsd2F5cwotICAgICAqIGNvbnRhaW5zIHRoZSBiaWdnZXN0IHNpemUgZmlyc3QuIFNvIGlmIHRoZSBxdWFsaWZpZXIgaXMgNDAweDIwMCwgc2l6ZSAxIHdpbGwgYWx3YXlzIGJlCi0gICAgICogNDAwIGJ1dCB0aGF0J2xsIGJlIFggaW4gbGFuZHNjYXBlIGFuZCBZIGluIHBvcnRyYWl0LgotICAgICAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+REVGQVVMVF9TSVpFPC9jb2RlPiAqLwotICAgIHByaXZhdGUgaW50IG1WYWx1ZTEgPSBERUZBVUxUX1NJWkU7Ci0KLSAgICAvKiogU2NyZWVuIHNpemUgMiB2YWx1ZS4gVGhpcyBpcyBub3Qgc2l6ZSBYIG9yIFkgYmVjYXVzZSB0aGUgZm9sZGVyIG5hbWUgYWx3YXlzCi0gICAgICogY29udGFpbnMgdGhlIGJpZ2dlc3Qgc2l6ZSBmaXJzdC4gU28gaWYgdGhlIHF1YWxpZmllciBpcyA0MDB4MjAwLCBzaXplIDIgd2lsbCBhbHdheXMgYmUKLSAgICAgKiAyMDAgYnV0IHRoYXQnbGwgYmUgWSBpbiBsYW5kc2NhcGUgYW5kIFggaW4gcG9ydHJhaXQuCi0gICAgICogRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5ERUZBVUxUX1NJWkU8L2NvZGU+ICovCi0gICAgcHJpdmF0ZSBpbnQgbVZhbHVlMiA9IERFRkFVTFRfU0laRTsKLQotICAgIHB1YmxpYyBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIoKSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKGludCB2YWx1ZTEsIGludCB2YWx1ZTIpIHsKLSAgICAgICAgbVZhbHVlMSA9IHZhbHVlMTsKLSAgICAgICAgbVZhbHVlMiA9IHZhbHVlMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlMSgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWYWx1ZTIoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWUyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiRGltZW5zaW9uIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigiZGltZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlMSAhPSBERUZBVUxUX1NJWkUgJiYgbVZhbHVlMiAhPSBERUZBVUxUX1NJWkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBNYXRjaGVyIG0gPSBzRGltZW5zaW9uUGF0dGVybi5tYXRjaGVyKHZhbHVlKTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZDEgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgU3RyaW5nIGQyID0gbS5ncm91cCgyKTsKLQotICAgICAgICAgICAgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyIHF1YWxpZmllciA9IGdldFF1YWxpZmllcihkMSwgZDIpOwotICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIgcSA9IChTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIpcXVhbGlmaWVyOwotICAgICAgICAgICAgcmV0dXJuIChtVmFsdWUxID09IHEubVZhbHVlMSAmJiBtVmFsdWUyID09IHEubVZhbHVlMik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBnZXRRdWFsaWZpZXIoU3RyaW5nIHNpemUxLCBTdHJpbmcgc2l6ZTIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBzMSA9IEludGVnZXIucGFyc2VJbnQoc2l6ZTEpOwotICAgICAgICAgICAgaW50IHMyID0gSW50ZWdlci5wYXJzZUludChzaXplMik7Ci0KLSAgICAgICAgICAgIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBxdWFsaWZpZXIgPSBuZXcgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChzMSA+IHMyKSB7Ci0gICAgICAgICAgICAgICAgcXVhbGlmaWVyLm1WYWx1ZTEgPSBzMTsKLSAgICAgICAgICAgICAgICBxdWFsaWZpZXIubVZhbHVlMiA9IHMyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBxdWFsaWZpZXIubVZhbHVlMSA9IHMyOwotICAgICAgICAgICAgICAgIHF1YWxpZmllci5tVmFsdWUyID0gczE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZXI7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBzdHJpbmcgd2UgZXh0cmFjdGVkIHdhc24ndCBhIHZhbGlkIG51bWJlci4KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkZHglMiRkIiwgbVZhbHVlMSwgbVZhbHVlMik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlMSAhPSAtMSAmJiBtVmFsdWUyICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkZHglMiRkIiwgbVZhbHVlMSwgbVZhbHVlMik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGYyMTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBSZXNvdXJjZSBRdWFsaWZpZXIgZm9yIFNjcmVlbiBPcmllbnRhdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyIGV4dGVuZHMgUmVzb3VyY2VRdWFsaWZpZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJTY3JlZW4gT3JpZW50YXRpb24iOwotCi0gICAgcHJpdmF0ZSBTY3JlZW5PcmllbnRhdGlvbiBtVmFsdWUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU2NyZWVuIE9yaWVudGF0aW9uIGVudW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIFNjcmVlbk9yaWVudGF0aW9uIHsKLSAgICAgICAgUE9SVFJBSVQoInBvcnQiLCAiUG9ydHJhaXQiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBMQU5EU0NBUEUoImxhbmQiLCAiTGFuZHNjYXBlIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU1FVQVJFKCJzcXVhcmUiLCAiU3F1YXJlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5VmFsdWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBTY3JlZW5PcmllbnRhdGlvbihTdHJpbmcgdmFsdWUsIFN0cmluZyBkaXNwbGF5VmFsdWUpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgbURpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtIGZvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHJldHVybiB0aGUgZW51bSBmb3IgdGhlIHF1YWxpZmllciB2YWx1ZSBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHdhcyBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2NyZWVuT3JpZW50YXRpb24gZ2V0RW51bShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGZvciAoU2NyZWVuT3JpZW50YXRpb24gb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3JpZW50Lm1WYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEluZGV4KFNjcmVlbk9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKFNjcmVlbk9yaWVudGF0aW9uIG9yaWVudCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9yaWVudCA9PSBvcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2NyZWVuT3JpZW50YXRpb24gZ2V0QnlJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU2NyZWVuT3JpZW50YXRpb24gb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcihTY3JlZW5PcmllbnRhdGlvbiB2YWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuT3JpZW50YXRpb24gZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJPcmllbnRhdGlvbiI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0gICAgICAgIHJldHVybiBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEljb24oIm9yaWVudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBTY3JlZW5PcmllbnRhdGlvbiBvcmllbnRhdGlvbiA9IFNjcmVlbk9yaWVudGF0aW9uLmdldEVudW0odmFsdWUpOwotICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKG9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlID09ICgoU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIpcXVhbGlmaWVyKS5tVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaWYgKG1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXNlZCB0byByZXByZXNlbnQgdGhpcyBxdWFsaWZpZXIgaW4gdGhlIGZvbGRlciBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKG1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0RGlzcGxheVZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlblJhdGlvUXVhbGlmaWVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlblJhdGlvUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmNlNGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5SYXRpb1F1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBTY3JlZW5SYXRpb1F1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiU2NyZWVuIFJhdGlvIjsKLQotICAgIHByaXZhdGUgU2NyZWVuUmF0aW8gbVZhbHVlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFNjcmVlbiBPcmllbnRhdGlvbiBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBTY3JlZW5SYXRpbyB7Ci0gICAgICAgIE5PVExPTkcoIm5vdGxvbmciLCAiTm90IExvbmciKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBMT05HKCJsb25nIiwgIkxvbmciKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlWYWx1ZTsKLQotICAgICAgICBwcml2YXRlIFNjcmVlblJhdGlvKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRpc3BsYXlWYWx1ZSkgewotICAgICAgICAgICAgbVZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICBtRGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGVudW0gZm9yIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBxdWFsaWZpZXIgdmFsdWUuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtIGZvciB0aGUgcXVhbGlmaWVyIHZhbHVlIG9yIG51bGwgaWYgbm8gbWF0Y2hpbmcgd2FzIGZvdW5kLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTY3JlZW5SYXRpbyBnZXRFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChTY3JlZW5SYXRpbyBvcmllbnQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChvcmllbnQubVZhbHVlLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXgoU2NyZWVuUmF0aW8gb3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU2NyZWVuUmF0aW8gb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3JpZW50ID09IG9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTY3JlZW5SYXRpbyBnZXRCeUluZGV4KGludCBpbmRleCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTY3JlZW5SYXRpbyBvcmllbnQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuUmF0aW9RdWFsaWZpZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFNjcmVlblJhdGlvUXVhbGlmaWVyKFNjcmVlblJhdGlvIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTY3JlZW5SYXRpbyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gIlJhdGlvIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigicmF0aW8iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWUgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0FuZFNldChTdHJpbmcgdmFsdWUsIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIFNjcmVlblJhdGlvIHNpemUgPSBTY3JlZW5SYXRpby5nZXRFbnVtKHZhbHVlKTsKLSAgICAgICAgaWYgKHNpemUgIT0gbnVsbCkgewotICAgICAgICAgICAgU2NyZWVuUmF0aW9RdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFNjcmVlblJhdGlvUXVhbGlmaWVyKHNpemUpOwotICAgICAgICAgICAgY29uZmlnLnNldFNjcmVlblJhdGlvUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgU2NyZWVuUmF0aW9RdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUgPT0gKChTY3JlZW5SYXRpb1F1YWxpZmllcilxdWFsaWZpZXIpLm1WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgKHdoZW4gdGFyZ2V0PT1udWxsKSBpcyBxdWFsaWZpZXIgaXMgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbmRyb2lkVmVyc2lvbiB2ZXJzaW9uID0gdGFyZ2V0LmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uLmdldEFwaUxldmVsKCkgPj0gNCB8fAotICAgICAgICAgICAgICAgICAgICAodmVyc2lvbi5nZXRBcGlMZXZlbCgpID09IDMgJiYgIkRvbnV0Ii5lcXVhbHModmVyc2lvbi5nZXRDb2RlbmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0RGlzcGxheVZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlblNpemVRdWFsaWZpZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvU2NyZWVuU2l6ZVF1YWxpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhmNTRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvU2NyZWVuU2l6ZVF1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUmVzb3VyY2UgUXVhbGlmaWVyIGZvciBTY3JlZW4gU2l6ZS4gU2l6ZSBjYW4gYmUgInNtYWxsIiwgIm5vcm1hbCIsIGFuZCAibGFyZ2UiCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JlZW5TaXplUXVhbGlmaWVyIGV4dGVuZHMgUmVzb3VyY2VRdWFsaWZpZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJTY3JlZW4gU2l6ZSI7Ci0KLSAgICBwcml2YXRlIFNjcmVlblNpemUgbVZhbHVlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFNjcmVlbiBPcmllbnRhdGlvbiBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBTY3JlZW5TaXplIHsKLSAgICAgICAgU01BTEwoInNtYWxsIiwgIlNtYWxsIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTk9STUFMKCJub3JtYWwiLCAiTm9ybWFsIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTEFSR0UoImxhcmdlIiwgIkxhcmdlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5VmFsdWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBTY3JlZW5TaXplKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRpc3BsYXlWYWx1ZSkgewotICAgICAgICAgICAgbVZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICBtRGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGVudW0gZm9yIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBxdWFsaWZpZXIgdmFsdWUuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtIGZvciB0aGUgcXVhbGlmaWVyIHZhbHVlIG9yIG51bGwgaWYgbm8gbWF0Y2hpbmcgd2FzIGZvdW5kLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTY3JlZW5TaXplIGdldEVudW0oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBmb3IgKFNjcmVlblNpemUgb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3JpZW50Lm1WYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEluZGV4KFNjcmVlblNpemUgb3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU2NyZWVuU2l6ZSBvcmllbnQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChvcmllbnQgPT0gb3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFNjcmVlblNpemUgZ2V0QnlJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU2NyZWVuU2l6ZSBvcmllbnQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuU2l6ZVF1YWxpZmllcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NyZWVuU2l6ZVF1YWxpZmllcihTY3JlZW5TaXplIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTY3JlZW5TaXplIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiU2l6ZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0gICAgICAgIHJldHVybiBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEljb24oInNpemUiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWUgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0FuZFNldChTdHJpbmcgdmFsdWUsIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIFNjcmVlblNpemUgc2l6ZSA9IFNjcmVlblNpemUuZ2V0RW51bSh2YWx1ZSk7Ci0gICAgICAgIGlmIChzaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNjcmVlblNpemVRdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFNjcmVlblNpemVRdWFsaWZpZXIoc2l6ZSk7Ci0gICAgICAgICAgICBjb25maWcuc2V0U2NyZWVuU2l6ZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBxdWFsaWZpZXIpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFNjcmVlblNpemVRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUgPT0gKChTY3JlZW5TaXplUXVhbGlmaWVyKXF1YWxpZmllcikubVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHVzZWQgdG8gcmVwcmVzZW50IHRoaXMgcXVhbGlmaWVyIGluIHRoZSBmb2xkZXIgbmFtZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlclNlZ21lbnQoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBiZWhhdmlvciAod2hlbiB0YXJnZXQ9PW51bGwpIGlzIHF1YWxpZmllciBpcyBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIHZlcnNpb24gPSB0YXJnZXQuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgaWYgKHZlcnNpb24uZ2V0QXBpTGV2ZWwoKSA+PSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLmdldEFwaUxldmVsKCkgPT0gMyAmJiAiRG9udXQiLmVxdWFscyh2ZXJzaW9uLmdldENvZGVuYW1lKCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXREaXNwbGF5VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1RleHRJbnB1dE1ldGhvZFF1YWxpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM3NzZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLQotCi0vKioKLSAqIFJlc291cmNlIFF1YWxpZmllciBmb3IgVGV4dCBJbnB1dCBNZXRob2QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIgZXh0ZW5kcyBSZXNvdXJjZVF1YWxpZmllciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlRleHQgSW5wdXQgTWV0aG9kIjsKLQotICAgIHByaXZhdGUgVGV4dElucHV0TWV0aG9kIG1WYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFNjcmVlbiBPcmllbnRhdGlvbiBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUZXh0SW5wdXRNZXRob2QgewotICAgICAgICBOT0tFWSgibm9rZXlzIiwgIk5vIEtleXMiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBRV0VSVFkoInF3ZXJ0eSIsICJRd2VydHkiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBUV0VMVkVLRVlTKCIxMmtleSIsICIxMiBLZXkiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlWYWx1ZTsKLQotICAgICAgICBwcml2YXRlIFRleHRJbnB1dE1ldGhvZChTdHJpbmcgdmFsdWUsIFN0cmluZyBkaXNwbGF5VmFsdWUpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgbURpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtIGZvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcXVhbGlmaWVyIHZhbHVlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHJldHVybiB0aGUgZW51bSBmb3IgdGhlIHF1YWxpZmllciB2YWx1ZSBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHdhcyBmb3VuZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGV4dElucHV0TWV0aG9kIGdldEVudW0oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBmb3IgKFRleHRJbnB1dE1ldGhvZCBvcmllbnQgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChvcmllbnQubVZhbHVlLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZXgoVGV4dElucHV0TWV0aG9kIHZhbHVlKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKFRleHRJbnB1dE1ldGhvZCBpbnB1dCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGlucHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBUZXh0SW5wdXRNZXRob2QgZ2V0QnlJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoVGV4dElucHV0TWV0aG9kIHZhbHVlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIoVGV4dElucHV0TWV0aG9kIHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0SW5wdXRNZXRob2QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJUZXh0IElucHV0IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIEljb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0SWNvbigidGV4dF9pbnB1dCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZSAhPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQW5kU2V0KFN0cmluZyB2YWx1ZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgVGV4dElucHV0TWV0aG9kIG1ldGhvZCA9IFRleHRJbnB1dE1ldGhvZC5nZXRFbnVtKHZhbHVlKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpOwotICAgICAgICAgICAgcXVhbGlmaWVyLm1WYWx1ZSA9IG1ldGhvZDsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIocXVhbGlmaWVyKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUgPT0gKChUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIpcXVhbGlmaWVyKS5tVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaWYgKG1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXNlZCB0byByZXByZXNlbnQgdGhpcyBxdWFsaWZpZXIgaW4gdGhlIGZvbGRlciBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKG1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0RGlzcGxheVZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1RvdWNoU2NyZWVuUXVhbGlmaWVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1RvdWNoU2NyZWVuUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYmFkNDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Ub3VjaFNjcmVlblF1YWxpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFJlc291cmNlIFF1YWxpZmllciBmb3IgVG91Y2ggU2NyZWVuIHR5cGUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUb3VjaFNjcmVlblF1YWxpZmllciBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiVG91Y2ggU2NyZWVuIjsKLQotICAgIHByaXZhdGUgVG91Y2hTY3JlZW5UeXBlIG1WYWx1ZTsKLQotICAgIC8qKgotICAgICAqIFNjcmVlbiBPcmllbnRhdGlvbiBlbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUb3VjaFNjcmVlblR5cGUgewotICAgICAgICBOT1RPVUNIKCJub3RvdWNoIiwgIk5vIFRvdWNoIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU1RZTFVTKCJzdHlsdXMiLCAiU3R5bHVzIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRklOR0VSKCJmaW5nZXIiLCAiRmluZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5VmFsdWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBUb3VjaFNjcmVlblR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGlzcGxheVZhbHVlKSB7Ci0gICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIG1EaXNwbGF5VmFsdWUgPSBkaXNwbGF5VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgZW51bSBmb3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHF1YWxpZmllciB2YWx1ZS4KLSAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBxdWFsaWZpZXIgdmFsdWUuCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGVudW0gZm9yIHRoZSBxdWFsaWZpZXIgdmFsdWUgb3IgbnVsbCBpZiBubyBtYXRjaGluZyB3YXMgZm91bmQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFRvdWNoU2NyZWVuVHlwZSBnZXRFbnVtKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgZm9yIChUb3VjaFNjcmVlblR5cGUgb3JpZW50IDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3JpZW50Lm1WYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEluZGV4KFRvdWNoU2NyZWVuVHlwZSB0b3VjaCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChUb3VjaFNjcmVlblR5cGUgdCA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHQgPT0gdG91Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFRvdWNoU2NyZWVuVHlwZSBnZXRCeUluZGV4KGludCBpbmRleCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChUb3VjaFNjcmVlblR5cGUgdmFsdWUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUb3VjaFNjcmVlblF1YWxpZmllcigpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyBUb3VjaFNjcmVlblF1YWxpZmllcihUb3VjaFNjcmVlblR5cGUgdG91Y2hWYWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB0b3VjaFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBUb3VjaFNjcmVlblR5cGUgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0gICAgICAgIHJldHVybiBJY29uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEljb24oInRvdWNoIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tBbmRTZXQoU3RyaW5nIHZhbHVlLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBUb3VjaFNjcmVlblR5cGUgdHlwZSA9IFRvdWNoU2NyZWVuVHlwZS5nZXRFbnVtKHZhbHVlKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgVG91Y2hTY3JlZW5RdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFRvdWNoU2NyZWVuUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICBxdWFsaWZpZXIubVZhbHVlID0gdHlwZTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRUb3VjaFR5cGVRdWFsaWZpZXIocXVhbGlmaWVyKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgaW5zdGFuY2VvZiBUb3VjaFNjcmVlblF1YWxpZmllcikgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSAoKFRvdWNoU2NyZWVuUXVhbGlmaWVyKXF1YWxpZmllcikubVZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHF1YWxpZmllciBpbiB0aGUgZm9sZGVyIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJTZWdtZW50KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAobVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7Ci0gICAgICAgIGlmIChtVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXREaXNwbGF5VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVmVyc2lvblF1YWxpZmllci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9WZXJzaW9uUXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDRmZWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9WZXJzaW9uUXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuSWNvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLkFuZHJvaWRWZXJzaW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFJlc291cmNlIFF1YWxpZmllciBmb3IgUGxhdGZvcm0gVmVyc2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZlcnNpb25RdWFsaWZpZXIgZXh0ZW5kcyBSZXNvdXJjZVF1YWxpZmllciB7Ci0gICAgLyoqIERlZmF1bHQgcGl4ZWwgZGVuc2l0eSB2YWx1ZS4gVGhpcyBtZWFucyB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9WRVJTSU9OID0gLTE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNDb3VudHJ5Q29kZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIl52KFxcZCspJCIpOy8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgaW50IG1WZXJzaW9uID0gREVGQVVMVF9WRVJTSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJQbGF0Zm9ybSBWZXJzaW9uIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBxdWFsaWZpZXIgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyIHNlZ21lbnQuIElmIHRoZSBzZWdtZW50IGlzIGluY29ycmVjdCwKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgZm9sZGVyIHNlZ21lbnQgZnJvbSB3aGljaCB0byBjcmVhdGUgYSBxdWFsaWZpZXIuCi0gICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgVmVyc2lvblF1YWxpZmllcn0gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBWZXJzaW9uUXVhbGlmaWVyIGdldFF1YWxpZmllcihTdHJpbmcgc2VnbWVudCkgewotICAgICAgICBNYXRjaGVyIG0gPSBzQ291bnRyeUNvZGVQYXR0ZXJuLm1hdGNoZXIoc2VnbWVudCk7Ci0gICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSBtLmdyb3VwKDEpOwotCi0gICAgICAgICAgICBpbnQgY29kZSA9IC0xOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb2RlID0gSW50ZWdlci5wYXJzZUludCh2KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSB0aGUgc3RyaW5nIHdlIGV4dHJhY3RlZCB3YXNuJ3QgYSB2YWxpZCBudW1iZXIuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFZlcnNpb25RdWFsaWZpZXIgcXVhbGlmaWVyID0gbmV3IFZlcnNpb25RdWFsaWZpZXIoKTsKLSAgICAgICAgICAgIHF1YWxpZmllci5tVmVyc2lvbiA9IGNvZGU7Ci0gICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9sZGVyIG5hbWUgc2VnbWVudCBmb3IgdGhlIGdpdmVuIHZhbHVlLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAgICAqIHtAbGluayAjdG9TdHJpbmcoKX0gb24gYSB7QGxpbmsgVmVyc2lvblF1YWxpZmllcn0gb2JqZWN0LgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2YWx1ZSBvZiB0aGUgcXVhbGlmaWVyLCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZlcnNpb24oKX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiAhPSBERUZBVUxUX1ZFUlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ2JTEkZCIsIHZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gIlZlcnNpb24iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKCkgewotICAgICAgICByZXR1cm4gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICByZXR1cm4gbVZlcnNpb24gIT0gREVGQVVMVF9WRVJTSU9OOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQW5kU2V0KFN0cmluZyB2YWx1ZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgVmVyc2lvblF1YWxpZmllciBxdWFsaWZpZXIgPSBnZXRRdWFsaWZpZXIodmFsdWUpOwotICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRWZXJzaW9uUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHF1YWxpZmllcikgewotICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgVmVyc2lvblF1YWxpZmllcikgewotICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uID09ICgoVmVyc2lvblF1YWxpZmllcilxdWFsaWZpZXIpLm1WZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXNlZCB0byByZXByZXNlbnQgdGhpcyBxdWFsaWZpZXIgaW4gdGhlIGZvbGRlciBuYW1lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyU2VnbWVudChJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yICh3aGVuIHRhcmdldD09bnVsbCkgaXMgcXVhbGlmaWVyIGlzIHN1cHBvcnRlZAotICAgICAgICAgICAgcmV0dXJuIGdldEZvbGRlclNlZ21lbnQobVZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQW5kcm9pZFZlcnNpb24gdmVyc2lvbiA9IHRhcmdldC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIGlmICh2ZXJzaW9uLmdldEFwaUxldmVsKCkgPj0gMykgewotICAgICAgICAgICAgcmV0dXJuIGdldEZvbGRlclNlZ21lbnQobVZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKLSAgICAgICAgaWYgKG1WZXJzaW9uICE9IERFRkFVTFRfVkVSU0lPTikgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkFQSSAlMSRkIiwgbVZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL0NvbXBpbGVkUmVzb3VyY2VzTW9uaXRvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL0NvbXBpbGVkUmVzb3VyY2VzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjcxNmIyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Db21waWxlZFJlc291cmNlc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3IuSUZpbGVMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yLklQcm9qZWN0TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIG1vbml0b3IgZm9yIHRoZSBjb21waWxlZCByZXNvdXJjZXMuIFRoaXMgb25seSBtb25pdG9ycyBjaGFuZ2VzIGluIHRoZSByZXNvdXJjZXMgb2YgdHlwZQotICogIHtAbGluayBSZXNvdXJjZVR5cGUjSUR9LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGlsZWRSZXNvdXJjZXNNb25pdG9yIGltcGxlbWVudHMgSUZpbGVMaXN0ZW5lciwgSVByb2plY3RMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDb21waWxlZFJlc291cmNlc01vbml0b3Igc1RoaXMgPSBuZXcgQ29tcGlsZWRSZXNvdXJjZXNNb25pdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHRoZSBtb25pdG9yaW5nIHN5c3RlbS4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBUaGUgbWFpbiBSZXNvdXJjZSBNb25pdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cE1vbml0b3IoUmVzb3VyY2VNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgbW9uaXRvci5hZGRGaWxlTGlzdGVuZXIoc1RoaXMsIElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCk7Ci0gICAgICAgIG1vbml0b3IuYWRkUHJvamVjdExpc3RlbmVyKHNUaGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY29uc3RydWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgQ29tcGlsZWRSZXNvdXJjZXNNb25pdG9yKCkgewotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFNlbnQgd2hlbiBhIGZpbGUgY2hhbmdlZCA6IGlmIHRoZSBmaWxlIGlzIHRoZSBSIGNsYXNzLCB0aGVuIGl0IGlzIHBhcnNlZCBhZ2FpbiB0byB1cGRhdGUKLSAgICAgKiB0aGUgaW50ZXJuYWwgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbWFya2VyRGVsdGFzIFRoZSBtYXJrZXIgZGVsdGFzIGZvciB0aGUgZmlsZS4KLSAgICAgKiBAcGFyYW0ga2luZCBUaGUgY2hhbmdlIGtpbmQuIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgICAqIHtAbGluayBJUmVzb3VyY2VEZWx0YSNhY2NlcHQoSVJlc291cmNlRGVsdGFWaXNpdG9yKX0KLSAgICAgKgotICAgICAqIEBzZWUgSUZpbGVMaXN0ZW5lciNmaWxlQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGVDaGFuZ2VkKElGaWxlIGZpbGUsIElNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcywgaW50IGtpbmQpIHsKLSAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhBbmRyb2lkQ29uc3RhbnRzLkZOX0NPTVBJTEVEX1JFU09VUkNFX0NMQVNTKSkgewotICAgICAgICAgICAgbG9hZEFuZFBhcnNlUkNsYXNzKGZpbGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBwcm9qZWN0IGNsb3NlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvLyB0aGUgUHJvamVjdFJlc291cmNlcyBvYmplY3Qgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBSZXNvdXJjZU1hbmFnZXIuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHByb2plY3QgZGVsZXRlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2plY3REZWxldGVkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gdGhlIFByb2plY3RSZXNvdXJjZXMgb2JqZWN0IHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgUmVzb3VyY2VNYW5hZ2VyLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBwcm9qZWN0IG9wZW4gZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvamVjdE9wZW5lZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIHByb2plY3QgaXMgb3BlbmVkLCB3ZSBnZXQgYW4gQURERUQgZXZlbnQgZm9yIGVhY2ggZmlsZSwgc28gd2UgZG9uJ3QKLSAgICAgICAgLy8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBleGlzdGluZyBwcm9qZWN0IGF0IGluaXQgdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0T3BlbmVkV2l0aFdvcmtzcGFjZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjaGVjayB0aGlzIGlzIGFuIGFuZHJvaWQgcHJvamVjdAotICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgIGxvYWRBbmRQYXJzZVJDbGFzcyhwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEFuZFBhcnNlUkNsYXNzKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRoZXJlJ3MgYSBQcm9qZWN0UmVzb3VyY2VzIHRvIHN0b3JlIHRoZSBjb250ZW50Ci0gICAgICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHByb2plY3RSZXNvdXJjZXMgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0UmVzb3VyY2VzKAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KTsKLQotICAgICAgICAgICAgaWYgKHByb2plY3RSZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldFJDbGFzc05hbWUocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWJvcnQuCi0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZEFuZFBhcnNlUkNsYXNzOiBmYWlsZWQgdG8gZmluZCBtYW5pZmVzdCBwYWNrYWdlIGZvciBwcm9qZWN0ICUxJHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IGNsYXNzIGxvYWRlciB0byBsb2FkIGl0LgotICAgICAgICAgICAgICAgIFByb2plY3RDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgUHJvamVjdENsYXNzTG9hZGVyKG51bGwgLyogcGFyZW50Q2xhc3NMb2FkZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIG1hcHMgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgcGFyc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+IHJlc291cmNlVmFsdWVNYXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgU3RyaW5nW10+IGdlbmVyaWNWYWx1ZVRvTmFtZU1hcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nW10+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8SW50QXJyYXlXcmFwcGVyLCBTdHJpbmc+IHN0eWxlYWJsZVZhbHVlVG9OYW1lTWFwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRBcnJheVdyYXBwZXIsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VDbGFzcyhjbGF6eiwgZ2VuZXJpY1ZhbHVlVG9OYW1lTWFwLCBzdHlsZWFibGVWYWx1ZVRvTmFtZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VWYWx1ZU1hcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgYXNzb2NpYXRlIHRoZSBtYXBzIHRvIHRoZSBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RSZXNvdXJjZXMuc2V0Q29tcGlsZWRSZXNvdXJjZXMoZ2VuZXJpY1ZhbHVlVG9OYW1lTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVhYmxlVmFsdWVUb05hbWVNYXAsIHJlc291cmNlVmFsdWVNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBMb2cgdGhpcyBlcnJvciB3aXRoIHRoZSBjbGFzcyBuYW1lIHdlJ3JlIHRyeWluZyB0byBsb2FkIGFuZCBhYm9ydC4KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAibG9hZEFuZFBhcnNlUkNsYXNzIGZhaWxlZCB0byBmaW5kIGNsYXNzICUxJHMiLCBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIFIgY2xhc3MsIGFuZCBmaWxscyBtYXBzLgotICAgICAqIEBwYXJhbSByQ2xhc3MgdGhlIGNsYXNzIHRvIHBhcnNlCi0gICAgICogQHBhcmFtIGdlbmVyaWNWYWx1ZVRvTmFtZU1hcAotICAgICAqIEBwYXJhbSBzdHlsZWFibGVWYWx1ZVRvTmFtZU1hcAotICAgICAqIEBwYXJhbSByZXNvdXJjZVZhbHVlTWFwCi0gICAgICogQHJldHVybiBUcnVlIGlmIHdlIG1hbmFnZWQgdG8gcGFyc2UgdGhlIFIgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlQ2xhc3MoQ2xhc3M8Pz4gckNsYXNzLCBNYXA8SW50ZWdlciwgU3RyaW5nW10+IGdlbmVyaWNWYWx1ZVRvTmFtZU1hcCwKLSAgICAgICAgICAgIE1hcDxJbnRBcnJheVdyYXBwZXIsIFN0cmluZz4gc3R5bGVhYmxlVmFsdWVUb05hbWVNYXAsIE1hcDxTdHJpbmcsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gcmVzb3VyY2VWYWx1ZU1hcCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChDbGFzczw/PiBpbm5lciA6IHJDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXNUeXBlID0gaW5uZXIuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gZnVsbE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgICAgICAgICByZXNvdXJjZVZhbHVlTWFwLnB1dChyZXNUeXBlLCBmdWxsTWFwKTsKLQotICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGlubmVyLmdldERlY2xhcmVkRmllbGRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRpYyBmaW5hbCBmaWVsZHMuCi0gICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMgPSBmLmdldE1vZGlmaWVycygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSAmJiBNb2RpZmllci5pc0ZpbmFsKG1vZGlmaWVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSAmJiB0eXBlLmdldENvbXBvbmVudFR5cGUoKSA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb2JqZWN0IGlzIGFuIGludFtdIHdlIHB1dCBpdCBpbiB0aGUgc3R5bGVhYmxlIG1hcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlYWJsZVZhbHVlVG9OYW1lTWFwLnB1dChuZXcgSW50QXJyYXlXcmFwcGVyKChpbnRbXSkgZi5nZXQobnVsbCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSAoSW50ZWdlcikgZi5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1ZhbHVlVG9OYW1lTWFwLnB1dCh2YWx1ZSwgbmV3IFN0cmluZ1tdIHsgZi5nZXROYW1lKCksIHJlc1R5cGUgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbE1hcC5wdXQoZi5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIFIgY2xhc3MsIGJhc2VkIG9uIHRoZSBwcm9qZWN0J3MgbWFuaWZlc3QncyBwYWNrYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGNsYXNzIG5hbWUgKGUuZy4gIm15LmFwcC5SIikgb3IgbnVsbCBpZiB0aGVyZSdzIG5vIHZhbGlkIHBhY2thZ2UgaW4gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFJDbGFzc05hbWUoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUZpbGUgbWFuaWZlc3RGaWxlID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmdldE1hbmlmZXN0KHByb2plY3QpOwotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmIG1hbmlmZXN0RmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLSAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgZGF0YSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEobWFuaWZlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhUGFja2FnZSA9IGRhdGEuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gamF2YVBhY2thZ2UgKyAiLlIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0eXBpY2FsbHkgaGFwcGVuIGVpdGhlciBiZWNhdXNlIHRoZSBtYW5pZmVzdCBmaWxlIGlzIG5vdCBwcmVzZW50Ci0gICAgICAgICAgICAvLyBhbmQvb3IgdGhlIHdvcmtzcGFjZSBuZWVkcyB0byBiZSByZWZyZXNoZWQuCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nQW5kUHJpbnRFcnJvcihlLAotICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZCBSZXNvdXJjZXMiLAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgdGhlIHBhY2thZ2Ugb2YgdGhlIEFuZHJvaWRNYW5pZmVzdCBvZiBwcm9qZWN0ICUxJHMuIFJlYXNvbjogJTIkcyIsCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTk4ZjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL0NvbmZpZ3VyYWJsZVJlc291cmNlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlc291cmNlIGl0ZW0gdGhhdCBjYW4gZXhpc3QgaW4gbXVsdGlwbGUgImFsdGVybmF0ZSIgdmVyc2lvbnMuIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtIGV4dGVuZHMgUHJvamVjdFJlc291cmNlSXRlbSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZSBJdGVtLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBYTUwgYW5kIFIuamF2YSBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHJlc291cmNlIGl0ZW0gaGFzIGF0IGxlYXN0IG9uZSBub24tZGVmYXVsdCBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0FsdGVybmF0ZXMoKSB7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VGaWxlIGZpbGUgOiBtRmlsZXMpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmdldEZvbGRlcigpLmdldENvbmZpZ3VyYXRpb24oKS5pc0RlZmF1bHQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZXNvdXJjZSBoYXMgYSBkZWZhdWx0IHZlcnNpb24sIHdpdGggbm8gcXVhbGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHQoKSB7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VGaWxlIGZpbGUgOiBtRmlsZXMpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmdldEZvbGRlcigpLmdldENvbmZpZ3VyYXRpb24oKS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmV0dXJuIGZhbHNlIGlmIHRoZXJlJ3Mgbm8gZGVmYXVsdCBhbmQgbW9yZSB0aGFuIDAgaXRlbXMuCi0gICAgICAgIHJldHVybiAobUZpbGVzLnNpemUoKSA9PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoaXMgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRBbHRlcm5hdGVDb3VudCgpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChSZXNvdXJjZUZpbGUgZmlsZSA6IG1GaWxlcykgewotICAgICAgICAgICAgaWYgKGZpbGUuZ2V0Rm9sZGVyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmlzRGVmYXVsdCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGl0ZW0gY2FuIGJlIGVkaXRlZCBkaXJlY3RseSAoaWUgaXQgZG9lcyBub3QgaGF2ZSBhbHRlcm5hdGUgdmVyc2lvbnMpLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdGFibGVEaXJlY3RseSgpIHsKLSAgICAgICAgcmV0dXJuIGhhc0FsdGVybmF0ZXMoKSA9PSBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Gb2xkZXJUeXBlUmVsYXRpb25zaGlwLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvRm9sZGVyVHlwZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ1ZjZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Gb2xkZXJUeXBlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGdpdmVzIGFjY2VzcyB0byB0aGUgYmkgZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGJldHdlZW4ge0BsaW5rIFJlc291cmNlVHlwZX0gYW5kCi0gKiB7QGxpbmsgUmVzb3VyY2VGb2xkZXJUeXBlfS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvbGRlclR5cGVSZWxhdGlvbnNoaXAgewotICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXA8UmVzb3VyY2VUeXBlLCBSZXNvdXJjZUZvbGRlclR5cGVbXT4gbVR5cGVUb0ZvbGRlck1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlVHlwZSwgUmVzb3VyY2VGb2xkZXJUeXBlW10+KCk7Ci0gICAgICAgIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXA8UmVzb3VyY2VGb2xkZXJUeXBlLCBSZXNvdXJjZVR5cGVbXT4gbUZvbGRlclRvVHlwZU1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlRm9sZGVyVHlwZSwgUmVzb3VyY2VUeXBlW10+KCk7Ci0gICAgCi0gICAgLy8gZ2VuZXJhdGUgdGhlIHJlbGF0aW9uc2hpcHMuCi0gICAgc3RhdGljIHsKLSAgICAgICAgSGFzaE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UmVzb3VyY2VGb2xkZXJUeXBlPj4gdHlwZVRvRm9sZGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlVHlwZSwgTGlzdDxSZXNvdXJjZUZvbGRlclR5cGU+PigpOwotICAgICAgICAKLSAgICAgICAgSGFzaE1hcDxSZXNvdXJjZUZvbGRlclR5cGUsIExpc3Q8UmVzb3VyY2VUeXBlPj4gZm9sZGVyVG9UeXBlTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlRm9sZGVyVHlwZSwgTGlzdDxSZXNvdXJjZVR5cGU+PigpOwotCi0gICAgICAgIGFkZChSZXNvdXJjZVR5cGUuQU5JTSwgUmVzb3VyY2VGb2xkZXJUeXBlLkFOSU0sIHR5cGVUb0ZvbGRlck1hcCwgZm9sZGVyVG9UeXBlTWFwKTsKLSAgICAgICAgYWRkKFJlc291cmNlVHlwZS5BUlJBWSwgUmVzb3VyY2VGb2xkZXJUeXBlLlZBTFVFUywgdHlwZVRvRm9sZGVyTWFwLCBmb2xkZXJUb1R5cGVNYXApOwotICAgICAgICBhZGQoUmVzb3VyY2VUeXBlLkNPTE9SLCBSZXNvdXJjZUZvbGRlclR5cGUuVkFMVUVTLCB0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgICAgIGFkZChSZXNvdXJjZVR5cGUuQ09MT1IsIFJlc291cmNlRm9sZGVyVHlwZS5DT0xPUiwgdHlwZVRvRm9sZGVyTWFwLCBmb2xkZXJUb1R5cGVNYXApOwotICAgICAgICBhZGQoUmVzb3VyY2VUeXBlLkRJTUVOLCBSZXNvdXJjZUZvbGRlclR5cGUuVkFMVUVTLCB0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgICAgIGFkZChSZXNvdXJjZVR5cGUuRFJBV0FCTEUsIFJlc291cmNlRm9sZGVyVHlwZS5WQUxVRVMsIHR5cGVUb0ZvbGRlck1hcCwgZm9sZGVyVG9UeXBlTWFwKTsKLSAgICAgICAgYWRkKFJlc291cmNlVHlwZS5EUkFXQUJMRSwgUmVzb3VyY2VGb2xkZXJUeXBlLkRSQVdBQkxFLCB0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgICAgIGFkZChSZXNvdXJjZVR5cGUuSUQsIFJlc291cmNlRm9sZGVyVHlwZS5WQUxVRVMsIHR5cGVUb0ZvbGRlck1hcCwgZm9sZGVyVG9UeXBlTWFwKTsKLSAgICAgICAgYWRkKFJlc291cmNlVHlwZS5MQVlPVVQsIFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQsIHR5cGVUb0ZvbGRlck1hcCwgZm9sZGVyVG9UeXBlTWFwKTsKLSAgICAgICAgYWRkKFJlc291cmNlVHlwZS5NRU5VLCBSZXNvdXJjZUZvbGRlclR5cGUuTUVOVSwgdHlwZVRvRm9sZGVyTWFwLCBmb2xkZXJUb1R5cGVNYXApOwotICAgICAgICBhZGQoUmVzb3VyY2VUeXBlLlJBVywgUmVzb3VyY2VGb2xkZXJUeXBlLlJBVywgdHlwZVRvRm9sZGVyTWFwLCBmb2xkZXJUb1R5cGVNYXApOwotICAgICAgICBhZGQoUmVzb3VyY2VUeXBlLlNUUklORywgUmVzb3VyY2VGb2xkZXJUeXBlLlZBTFVFUywgdHlwZVRvRm9sZGVyTWFwLCBmb2xkZXJUb1R5cGVNYXApOwotICAgICAgICBhZGQoUmVzb3VyY2VUeXBlLlNUWUxFLCBSZXNvdXJjZUZvbGRlclR5cGUuVkFMVUVTLCB0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgICAgIGFkZChSZXNvdXJjZVR5cGUuWE1MLCBSZXNvdXJjZUZvbGRlclR5cGUuWE1MLCB0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgICAgIAotICAgICAgICBvcHRpbWl6ZSh0eXBlVG9Gb2xkZXJNYXAsIGZvbGRlclRvVHlwZU1hcCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBSZXNvdXJjZVR5cGV9cyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSBmaWxlcyBpbnNpZGUgYSBmb2xkZXIKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgICogQHBhcmFtIGZvbGRlclR5cGUgVGhlIGZvbGRlciB0eXBlLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0BsaW5rIFJlc291cmNlVHlwZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlVHlwZVtdIGdldFJlbGF0ZWRSZXNvdXJjZVR5cGVzKFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXJUeXBlKSB7Ci0gICAgICAgIFJlc291cmNlVHlwZVtdIGFycmF5ID0gbUZvbGRlclRvVHlwZU1hcC5nZXQoZm9sZGVyVHlwZSk7Ci0gICAgICAgIGlmIChhcnJheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVR5cGVbMF07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9IHRoYXQgY2FuIGNvbnRhaW4gZmlsZXMgZ2VuZXJhdGluZyByZXNvdXJjZXMKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgICogQHBhcmFtIHJlc1R5cGUgdGhlIHR5cGUgb2YgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGxpbmsgUmVzb3VyY2VGb2xkZXJUeXBlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VGb2xkZXJUeXBlW10gZ2V0UmVsYXRlZEZvbGRlcnMoUmVzb3VyY2VUeXBlIHJlc1R5cGUpIHsKLSAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlW10gYXJyYXkgPSBtVHlwZVRvRm9sZGVyTWFwLmdldChyZXNUeXBlKTsKLSAgICAgICAgaWYgKGFycmF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRm9sZGVyVHlwZVswXTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB7QGxpbmsgUmVzb3VyY2VUeXBlfSBhbmQgdGhlIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9IHZhbHVlcyBtYXRjaC4KLSAgICAgKiBAcGFyYW0gcmVzVHlwZSB0aGUgcmVzb3VyY2UgdHlwZS4KLSAgICAgKiBAcGFyYW0gZm9sZGVyVHlwZSB0aGUgZm9sZGVyIHR5cGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGZpbGVzIGluc2lkZSB0aGUgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJlc291cmNlRm9sZGVyVHlwZX0KLSAgICAgKiBjb3VsZCBnZW5lcmF0ZSBhIHJlc291cmNlIG9mIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJlc291cmNlVHlwZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2goUmVzb3VyY2VUeXBlIHJlc1R5cGUsIFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXJUeXBlKSB7Ci0gICAgICAgIFJlc291cmNlRm9sZGVyVHlwZVtdIGFycmF5ID0gbVR5cGVUb0ZvbGRlck1hcC5nZXQocmVzVHlwZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXJyYXkgIT0gbnVsbCAmJiBhcnJheS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyVHlwZSBmVHlwZSA6IGFycmF5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZUeXBlID09IGZvbGRlclR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSB7QGxpbmsgUmVzb3VyY2VUeXBlfSAtIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9IHJlbGF0aW9uc2hpcC4gdGhpcyBpbmRpY2F0ZXMgdGhhdAotICAgICAqIGEgZmlsZSBpbiB0aGUgZm9sZGVyIGNhbiBnZW5lcmF0ZSBhIHJlc291cmNlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgcmVzb3VyY2VUeXBlCi0gICAgICogQHBhcmFtIGZvbGRlciBUaGUge0BsaW5rIFJlc291cmNlRm9sZGVyVHlwZX0KLSAgICAgKiBAcGFyYW0gZm9sZGVyVG9UeXBlTWFwIAotICAgICAqIEBwYXJhbSB0eXBlVG9Gb2xkZXJNYXAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoUmVzb3VyY2VUeXBlIHR5cGUsIFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXIsCi0gICAgICAgICAgICBIYXNoTWFwPFJlc291cmNlVHlwZSwgTGlzdDxSZXNvdXJjZUZvbGRlclR5cGU+PiB0eXBlVG9Gb2xkZXJNYXAsCi0gICAgICAgICAgICBIYXNoTWFwPFJlc291cmNlRm9sZGVyVHlwZSwgTGlzdDxSZXNvdXJjZVR5cGU+PiBmb2xkZXJUb1R5cGVNYXApIHsKLSAgICAgICAgLy8gZmlyc3Qgd2UgYWRkIHRoZSBmb2xkZXIgdG8gdGhlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlLgotICAgICAgICBMaXN0PFJlc291cmNlRm9sZGVyVHlwZT4gZm9sZGVyTGlzdCA9IHR5cGVUb0ZvbGRlck1hcC5nZXQodHlwZSk7Ci0gICAgICAgIGlmIChmb2xkZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlRm9sZGVyVHlwZT4oKTsKLSAgICAgICAgICAgIHR5cGVUb0ZvbGRlck1hcC5wdXQodHlwZSwgZm9sZGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvbGRlckxpc3QuaW5kZXhPZihmb2xkZXIpID09IC0xKSB7Ci0gICAgICAgICAgICBmb2xkZXJMaXN0LmFkZChmb2xkZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgd2UgYWRkIHRoZSB0eXBlIHRvIHRoZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9sZGVyLgotICAgICAgICBMaXN0PFJlc291cmNlVHlwZT4gdHlwZUxpc3QgPSBmb2xkZXJUb1R5cGVNYXAuZ2V0KGZvbGRlcik7Ci0gICAgICAgIGlmICh0eXBlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VUeXBlPigpOwotICAgICAgICAgICAgZm9sZGVyVG9UeXBlTWFwLnB1dChmb2xkZXIsIHR5cGVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZUxpc3QuaW5kZXhPZih0eXBlKSA9PSAtMSkgewotICAgICAgICAgICAgdHlwZUxpc3QuYWRkKHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3B0aW1pemUgdGhlIG1hcCB0byBjb250YWlucyBhcnJheSBpbnN0ZWFkIG9mIGxpc3RzIChzaW5jZSB0aGUgYXBpIHJldHVybnMgYXJyYXlzKQotICAgICAqIEBwYXJhbSB0eXBlVG9Gb2xkZXJNYXAKLSAgICAgKiBAcGFyYW0gZm9sZGVyVG9UeXBlTWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvcHRpbWl6ZShIYXNoTWFwPFJlc291cmNlVHlwZSwgTGlzdDxSZXNvdXJjZUZvbGRlclR5cGU+PiB0eXBlVG9Gb2xkZXJNYXAsCi0gICAgICAgICAgICBIYXNoTWFwPFJlc291cmNlRm9sZGVyVHlwZSwgTGlzdDxSZXNvdXJjZVR5cGU+PiBmb2xkZXJUb1R5cGVNYXApIHsKLSAgICAgICAgU2V0PFJlc291cmNlVHlwZT4gdHlwZXMgPSB0eXBlVG9Gb2xkZXJNYXAua2V5U2V0KCk7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgTGlzdDxSZXNvdXJjZUZvbGRlclR5cGU+IGxpc3QgPSB0eXBlVG9Gb2xkZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICAgICAgbVR5cGVUb0ZvbGRlck1hcC5wdXQodHlwZSwgbGlzdC50b0FycmF5KG5ldyBSZXNvdXJjZUZvbGRlclR5cGVbbGlzdC5zaXplKCldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQ8UmVzb3VyY2VGb2xkZXJUeXBlPiBmb2xkZXJzID0gZm9sZGVyVG9UeXBlTWFwLmtleVNldCgpOwotICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXIgOiBmb2xkZXJzKSB7Ci0gICAgICAgICAgICBMaXN0PFJlc291cmNlVHlwZT4gbGlzdCA9IGZvbGRlclRvVHlwZU1hcC5nZXQoZm9sZGVyKTsKLSAgICAgICAgICAgIG1Gb2xkZXJUb1R5cGVNYXAucHV0KGZvbGRlciwgbGlzdC50b0FycmF5KG5ldyBSZXNvdXJjZVR5cGVbbGlzdC5zaXplKCldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvSWRSZXNvdXJjZUl0ZW0uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9JZFJlc291cmNlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U0MmM2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9JZFJlc291cmNlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLklJZFJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcmVzb3VyY2UgaXRlbSBvZiB0eXBlIHtAbGluayBSZXNvdXJjZVR5cGUjSUR9Ci0gKi8KLXB1YmxpYyBjbGFzcyBJZFJlc291cmNlSXRlbSBleHRlbmRzIFByb2plY3RSZXNvdXJjZUl0ZW0gaW1wbGVtZW50cyBJSWRSZXNvdXJjZUl0ZW0gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RlY2xhcmVkSW5saW5lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZUl0ZW0uCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGFzIGl0IGFwcGVhcnMgaW4gdGhlIFhNTCBhbmQgUi5qYXZhIGZpbGVzLgotICAgICAqIEBwYXJhbSBpc0RlY2xhcmVkSW5saW5lIFdoZXRoZXIgdGhpcyBpZCB3YXMgZGVjbGFyZWQgaW5saW5lLgotICAgICAqLwotICAgIElkUmVzb3VyY2VJdGVtKFN0cmluZyBuYW1lLCBib29sZWFuIGlzRGVjbGFyZWRJbmxpbmUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIG1Jc0RlY2xhcmVkSW5saW5lID0gaXNEZWNsYXJlZElubGluZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIElEIHJlc291cmNlIGhhcyBiZWVuIGRlY2xhcmVkIGlubGluZSBpbnNpZGUgYW5vdGhlciByZXNvdXJjZSBYTUwgZmlsZS4gCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlZElubGluZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0RlY2xhcmVkSW5saW5lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGl0ZW0gY2FuIGJlIGVkaXRlZCAoaWUsIHRoZSBpZCB3YXMgbm90IGRlY2xhcmVkIGlubGluZSkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZURpcmVjdGx5KCkgewotICAgICAgICByZXR1cm4gIW1Jc0RlY2xhcmVkSW5saW5lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9JbnRBcnJheVdyYXBwZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9JbnRBcnJheVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxYjE1ZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvSW50QXJyYXlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLQotLyoqCi0gKiBXcmFwcGVyIGFyb3VuZCBhIGludFtdIHRvIHByb3ZpZGUgaGFzaENvZGUvZXF1YWxzIHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnRBcnJheVdyYXBwZXIgewotICAgIAotICAgIHByaXZhdGUgaW50W10gbURhdGE7Ci0gICAgCi0gICAgcHVibGljIEludEFycmF5V3JhcHBlcihpbnRbXSBkYXRhKSB7Ci0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0KGludFtdIGRhdGEpIHsKLSAgICAgICAgbURhdGEgPSBkYXRhOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKG1EYXRhKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKGdldENsYXNzKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMobURhdGEsICgoSW50QXJyYXlXcmFwcGVyKW9iaikubURhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9NdWx0aVJlc291cmNlRmlsZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL011bHRpUmVzb3VyY2VGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjc0OWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL011bHRpUmVzb3VyY2VGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuSUFic3RyYWN0RmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklSZXNvdXJjZVZhbHVlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlscy5SZXNvdXJjZVZhbHVlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlscy5WYWx1ZVJlc291cmNlUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlscy5WYWx1ZVJlc291cmNlUGFyc2VyLklWYWx1ZVJlc291cmNlUmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcmVzb3VyY2UgZmlsZSBhYmxlIHRvIGRlY2xhcmUgbXVsdGlwbGUgcmVzb3VyY2VzLCB3aGljaCBjb3VsZCBiZSBvZgotICogZGlmZmVyZW50IHtAbGluayBSZXNvdXJjZVR5cGV9LgotICogPHAvPgotICogVGhpcyBpcyB0eXBpY2FsbHkgYW4gWE1MIGZpbGUgaW5zaWRlIHJlcy92YWx1ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aVJlc291cmNlRmlsZSBleHRlbmRzIFJlc291cmNlRmlsZSBpbXBsZW1lbnRzIElWYWx1ZVJlc291cmNlUmVwb3NpdG9yeSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHNQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFJlc291cmNlVHlwZSwgSGFzaE1hcDxTdHJpbmcsIFJlc291cmNlVmFsdWU+PiBtUmVzb3VyY2VJdGVtcyA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlVHlwZSwgSGFzaE1hcDxTdHJpbmcsIFJlc291cmNlVmFsdWU+PigpOwotCi0gICAgcHVibGljIE11bHRpUmVzb3VyY2VGaWxlKElBYnN0cmFjdEZpbGUgZmlsZSwgUmVzb3VyY2VGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIHN1cGVyKGZpbGUsIGZvbGRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlVHlwZVtdIGdldFJlc291cmNlVHlwZXMoKSB7Ci0gICAgICAgIHVwZGF0ZSgpOwotCi0gICAgICAgIFNldDxSZXNvdXJjZVR5cGU+IGtleXMgPSBtUmVzb3VyY2VJdGVtcy5rZXlTZXQoKTsKLQotICAgICAgICByZXR1cm4ga2V5cy50b0FycmF5KG5ldyBSZXNvdXJjZVR5cGVba2V5cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZXMoUmVzb3VyY2VUeXBlIHR5cGUpIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFJlc291cmNlVmFsdWU+IGxpc3QgPSBtUmVzb3VyY2VJdGVtcy5nZXQodHlwZSk7Ci0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248UHJvamVjdFJlc291cmNlSXRlbT4gZ2V0UmVzb3VyY2VzKFJlc291cmNlVHlwZSB0eXBlLAotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0UmVzb3VyY2VzKSB7Ci0gICAgICAgIHVwZGF0ZSgpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiBsaXN0ID0gbVJlc291cmNlSXRlbXMuZ2V0KHR5cGUpOwotCi0gICAgICAgIEFycmF5TGlzdDxQcm9qZWN0UmVzb3VyY2VJdGVtPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdFJlc291cmNlSXRlbT4oKTsKLQotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFJlc291cmNlVmFsdWU+IHZhbHVlcyA9IGxpc3QudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlVmFsdWUgcmVzIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgUHJvamVjdFJlc291cmNlSXRlbSBpdGVtID0gcHJvamVjdFJlc291cmNlcy5maW5kUmVzb3VyY2VJdGVtKHR5cGUsIHJlcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBSZXNvdXJjZVR5cGUuSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgSWRSZXNvdXJjZUl0ZW0ocmVzLmdldE5hbWUoKSwgZmFsc2UgLyogaXNEZWNsYXJlZElubGluZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbmV3IENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbShyZXMuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpdGVtcy5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaXRlbS5hZGQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgUmVzb3VyY2UgaXRlbXMgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIGlmIChpc1RvdWNoZWQoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAvLyByZXNldCBjdXJyZW50IGNvbnRlbnQuCi0gICAgICAgICAgICBtUmVzb3VyY2VJdGVtcy5jbGVhcigpOwotCi0gICAgICAgICAgICAvLyBuZWVkIHRvIHBhcnNlIHRoZSBmaWxlIGFuZCBmaW5kIHRoZSBjb250ZW50LgotICAgICAgICAgICAgcGFyc2VGaWxlKCk7Ci0KLSAgICAgICAgICAgIHJlc2V0VG91Y2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhbmQgY3JlYXRlcyBhIGxpc3Qgb2Yge0BsaW5rIFJlc291cmNlVHlwZX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBzUGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShnZXRGaWxlKCkuZ2V0Q29udGVudHMoKSwgbmV3IFZhbHVlUmVzb3VyY2VQYXJzZXIodGhpcywgaXNGcmFtZXdvcmsoKSkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZXNvdXJjZSBpdGVtIHRvIHRoZSBsaXN0Ci0gICAgICogQHBhcmFtIHJlc1R5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VWYWx1ZShTdHJpbmcgcmVzVHlwZSwgUmVzb3VyY2VWYWx1ZSB2YWx1ZSkgewotICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IFJlc291cmNlVHlwZS5nZXRFbnVtKHJlc1R5cGUpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gbGlzdCA9IG1SZXNvdXJjZUl0ZW1zLmdldCh0eXBlKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBpdC4KLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPigpOwotICAgICAgICAgICAgICAgIG1SZXNvdXJjZUl0ZW1zLnB1dCh0eXBlLCBsaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBwb3NzaWJsZSB2YWx1ZSBhbHJlYWR5IGV4aXN0aW5nLgotICAgICAgICAgICAgICAgIFJlc291cmNlVmFsdWUgb2xkVmFsdWUgPSBsaXN0LmdldCh2YWx1ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUucmVwbGFjZVdpdGgodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBlbXB0eSBsaXN0IG9yIG5vIG1hdGNoIGZvdW5kPyBhZGQgdGhlIGdpdmVuIHJlc291cmNlCi0gICAgICAgICAgICBsaXN0LnB1dCh2YWx1ZS5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUmVzb3VyY2VWYWx1ZSBnZXRWYWx1ZShSZXNvdXJjZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZvciB0aGUgZ2l2ZW4gdHlwZQotICAgICAgICBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gbGlzdCA9IG1SZXNvdXJjZUl0ZW1zLmdldCh0eXBlKTsKLQotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUHJvamVjdENsYXNzTG9hZGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUHJvamVjdENsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTI1OWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Byb2plY3RDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIENsYXNzTG9hZGVyIGFibGUgdG8gbG9hZCBjbGFzcyBmcm9tIG91dHB1dCBvZiBhbiBFY2xpcHNlIHByb2plY3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0Q2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBtSmF2YVByb2plY3Q7Ci0gICAgcHJpdmF0ZSBVUkxDbGFzc0xvYWRlciBtSmFyQ2xhc3NMb2FkZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1JbnNpZGVKYXJDbGFzc0xvYWRlciA9IGZhbHNlOwotCi0gICAgcHVibGljIFByb2plY3RDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlciwgSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcihwYXJlbnRDbGFzc0xvYWRlcik7Ci0gICAgICAgIG1KYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3Qgb3V0cHV0IGZvbGRlci4KLSAgICAgICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgSVBhdGggb3V0cHV0TG9jYXRpb24gPSBtSmF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIElSZXNvdXJjZSBvdXRSZXMgPSByb290LmZpbmRNZW1iZXIob3V0cHV0TG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKG91dFJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGUgb3V0Rm9sZGVyID0gbmV3IEZpbGUob3V0UmVzLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjbGFzcyBuYW1lIHNlZ21lbnRzCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IG5hbWUuc3BsaXQoIlxcLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgY2xhc3NGaWxlID0gZ2V0RmlsZShvdXRGb2xkZXIsIHNlZ21lbnRzLCAwKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0ZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtSW5zaWRlSmFyQ2xhc3NMb2FkZXIgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gZmlsZSBtYXRjaGluZyB0aGUgY2xhc3MgbmFtZSB3YXMgZm91bmQsIGxvb2sgaW4gdGhlIDNyZCBwYXJ0eSBqYXJzCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3NGcm9tSmFyKG5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbG9hZCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBhbmQgY3JlYXRlIHRoZSBjbGFzcy4KLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNsYXNzRmlsZSk7Ci0gICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWyhpbnQpY2xhc3NGaWxlLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIGludCByZWFkID0gMDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVhZCA9IGZpcy5yZWFkKGRhdGEpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGRhdGEgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGRlZmluZUNsYXNzKG51bGwsIGRhdGEsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ejsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRmlsZSBtYXRjaGluZyB0aGUgYSBjZXJ0YWluIHBhdGggZnJvbSBhIHJvb3Qge0BsaW5rIEZpbGV9LgotICAgICAqIDxwLz5UaGUgbWV0aG9kcyBjaGVja3MgdGhhdCB0aGUgZmlsZSBlbmRzIGluIC5jbGFzcyBldmVuIHRob3VnaCB0aGUgbGFzdCBzZWdtZW50Ci0gICAgICogZG9lcyBub3QuCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcm9vdCBvZiB0aGUgZmlsZS4KLSAgICAgKiBAcGFyYW0gc2VnbWVudHMgdGhlIHNlZ21lbnRzIGNvbnRhaW5pbmcgdGhlIHBhdGggb2YgdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydCBsb29raW5nIGludG8gc2VnbWVudHMuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0RmlsZShGaWxlIHBhcmVudCwgU3RyaW5nW10gc2VnbWVudHMsIGludCBpbmRleCkKLSAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyByZWFjaGVkIHRoZSBlbmQgd2l0aCBubyBtYXRjaD8KLSAgICAgICAgaWYgKGluZGV4ID09IHNlZ21lbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRvTWF0Y2ggPSBzZWdtZW50c1tpbmRleF07Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IHBhcmVudC5saXN0RmlsZXMoKTsKLQotICAgICAgICAvLyB3ZSdyZSBhdCB0aGUgbGFzdCBzZWdtZW50cy4gd2UgbG9vayBmb3IgYSBtYXRjaGluZyA8ZmlsZT4uY2xhc3MKLSAgICAgICAgaWYgKGluZGV4ID09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgIHRvTWF0Y2ggPSB0b01hdGNoICsgIi5jbGFzcyI7IAotCi0gICAgICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzKHRvTWF0Y2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm8gbWF0Y2g/IGFib3J0LgotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaW5uZXJDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b01hdGNoLmVxdWFscyhmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaWxlKGZpbGUsIHNlZ21lbnRzLCBpbmRleCsxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCh0b01hdGNoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHNlZ21lbnRzW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gaW5kZXggKyAxIDsgaSA8IHNlZ21lbnRzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi5jbGFzcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzTmFtZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoaW5uZXJDbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvYWRzIGEgY2xhc3MgZnJvbSB0aGUgM3JkIHBhcnR5IGphciBwcmVzZW50IGluIHRoZSBwcm9qZWN0Ci0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBsb2FkQ2xhc3NGcm9tSmFyKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtSmFyQ2xhc3NMb2FkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBPUyBwYXRoIHRvIGFsbCB0aGUgZXh0ZXJuYWwgamFycwotICAgICAgICAgICAgVVJMW10gamFycyA9IGdldEV4dGVybmFsSmFycygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtSmFyQ2xhc3NMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoamFycywgdGhpcyAvKiBwYXJlbnQgKi8pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gYmVjYXVzZSBhIGNsYXNzIGxvYWRlciBhbHdheXMgbG9vayBpbiBpdHMgcGFyZW50IGxvYWRlciBmaXJzdCwgd2UgbmVlZCB0byBrbm93Ci0gICAgICAgICAgICAvLyB0aGF0IHdlIGFyZSBxdWVyeWluZyB0aGUgamFyIGNsYXNzbG9hZGVyLiBUaGlzIHdpbGwgbGV0IHVzIGtub3cgdG8gbm90IHF1ZXJ5Ci0gICAgICAgICAgICAvLyBpdCBhZ2FpbiBmb3IgY2xhc3NlcyB3ZSBkb24ndCBmaW5kLCBvciB0aGlzIHdvdWxkIGNyZWF0ZSBhbiBpbmZpbml0ZSBsb29wLgotICAgICAgICAgICAgbUluc2lkZUphckNsYXNzTG9hZGVyID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBtSmFyQ2xhc3NMb2FkZXIubG9hZENsYXNzKG5hbWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbUluc2lkZUphckNsYXNzTG9hZGVyID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBleHRlcm5hbCBqYXIgZmlsZXMgdXNlZCBieSB0aGUgcHJvamVjdC4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIE9TLXNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFVSTFtdIGdldEV4dGVybmFsSmFycygpIHsKLSAgICAgICAgLy8gZ2V0IGEgamF2YSBwcm9qZWN0IGZyb20gaXQKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKG1KYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotICAgICAgICBBcnJheUxpc3Q8VVJMPiBvc2xpYnJhcnlMaXN0ID0gbmV3IEFycmF5TGlzdDxVUkw+KCk7Ci0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aHMgPSBqYXZhUHJvamVjdC5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGlmIChjbGFzc3BhdGhzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGUgOiBjbGFzc3BhdGhzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGNsYXNzcGF0aCB2YXJpYWJsZSByZWZlcmVuY2UsIHdlIHJlc29sdmUgaXQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGUpOyAKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgSVBhdGgKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGUuZ2V0UGF0aCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCAuamFyCi0gICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ29uc3RhbnRzLkVYVF9KQVIuZXF1YWxzSWdub3JlQ2FzZShwYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbG9jYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHdzUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbGlicmFyeUxpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBqYXIgcGF0aCBkb2Vzbid0IG1hdGNoIGEgd29ya3NwYWNlIHJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgZ2V0IGFuIE9TU3RyaW5nIGFuZCBjaGVjayBpZiB0aGlzIGxpbmtzIHRvIGEgdmFsaWQgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3NGdWxsUGF0aCA9IHBhdGgudG9PU1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUob3NGdWxsUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbGlicmFyeUxpc3QuYWRkKGYudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvc2xpYnJhcnlMaXN0LnRvQXJyYXkobmV3IFVSTFtvc2xpYnJhcnlMaXN0LnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Qcm9qZWN0UmVzb3VyY2VJdGVtLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUHJvamVjdFJlc291cmNlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM4MmQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Qcm9qZWN0UmVzb3VyY2VJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFJlc291cmNlIEl0ZW0gY29taW5nIGZyb20gYW4gQW5kcm9pZCBQcm9qZWN0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdFJlc291cmNlSXRlbSBleHRlbmRzIFJlc291cmNlSXRlbSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDb21wYXJhdG9yPFJlc291cmNlRmlsZT4gc0NvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxSZXNvdXJjZUZpbGU+KCkgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUmVzb3VyY2VGaWxlIGZpbGUxLCBSZXNvdXJjZUZpbGUgZmlsZTIpIHsKLSAgICAgICAgICAgIC8vIGdldCBib3RoIEZvbGRlckNvbmZpZ3VyYXRpb24gYW5kIGNvbXBhcmUgdGhlbQotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBmYzEgPSBmaWxlMS5nZXRGb2xkZXIoKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGZjMiA9IGZpbGUyLmdldEZvbGRlcigpLmdldENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZjMS5jb21wYXJlVG8oZmMyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIGZpbGVzIGdlbmVyYXRpbmcgdGhpcyBSZXNvdXJjZUl0ZW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxSZXNvdXJjZUZpbGU+IG1GaWxlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VGaWxlPigpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZUl0ZW0uCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGFzIGl0IGFwcGVhcnMgaW4gdGhlIFhNTCBhbmQgUi5qYXZhIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0UmVzb3VyY2VJdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlc291cmNlIGl0ZW0gaXMgZWRpdGFibGUgZGlyZWN0bHkuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBjYXNlIGZvciByZXNvdXJjZXMgdGhhdCBkb24ndCBoYXZlIGFsdGVybmF0ZSB2ZXJzaW9ucywgb3IgcmVzb3VyY2VzCi0gICAgICogb2YgdHlwZSB7QGxpbmsgUmVzb3VyY2VUeXBlI0lEfSB0aGF0IGFyZW4ndCBkZWNsYXJlZCBpbmxpbmUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFZGl0YWJsZURpcmVjdGx5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IHZlcnNpb24gb2YgdGhpcyByZXNvdXJjZSBpdGVtLCBieSBhZGRpbmcgaXRzIHtAbGluayBSZXNvdXJjZUZpbGV9LgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkKFJlc291cmNlRmlsZSBmaWxlKSB7Ci0gICAgICAgIG1GaWxlcy5hZGQoZmlsZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBpdGVtIGJ5IGVtcHR5aW5nIGl0cyB2ZXJzaW9uIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1GaWxlcy5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3J0ZWQgbGlzdCBvZiB7QGxpbmsgUmVzb3VyY2VJdGVtfSBvYmplY3RzIGZvciB0aGlzIHJlc291cmNlIGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlRmlsZVtdIGdldFNvdXJjZUZpbGVBcnJheSgpIHsKLSAgICAgICAgQXJyYXlMaXN0PFJlc291cmNlRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VGaWxlPigpOwotICAgICAgICBsaXN0LmFkZEFsbChtRmlsZXMpOwotICAgICAgICAKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBzQ29tcGFyYXRvcik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBSZXNvdXJjZUZpbGVbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB7QGxpbmsgUmVzb3VyY2VJdGVtfSBvYmplY3RzIGZvciB0aGlzIHJlc291cmNlIGl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UmVzb3VyY2VGaWxlPiBnZXRTb3VyY2VGaWxlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobUZpbGVzKTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgUmVzb3VyY2VJdGVtIHJlY2VpdmVkIGFzIHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VXaXRoKFByb2plY3RSZXNvdXJjZUl0ZW0gaXRlbSkgewotICAgICAgICBtRmlsZXMuY2xlYXIoKTsKLSAgICAgICAgbUZpbGVzLmFkZEFsbChpdGVtLm1GaWxlcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Byb2plY3RSZXNvdXJjZXMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9Qcm9qZWN0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTI2MjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Byb2plY3RSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuSVJlc291cmNlUmVwb3NpdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5MYW5ndWFnZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlJlZ2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlJlc291cmNlUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlcy5JQWJzdHJhY3RGb2xkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JUmVzb3VyY2VWYWx1ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIudXRpbHMuUmVzb3VyY2VWYWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSByZXNvdXJjZXMgb2YgYSBwcm9qZWN0LiBUaGlzIGlzIGEgZmlsZSB2aWV3IG9mIHRoZSByZXNvdXJjZXMsIHdpdGggaGFuZGxpbmcKLSAqIGZvciB0aGUgYWx0ZXJuYXRlIHJlc291cmNlIHR5cGVzLiBGb3IgYSBjb21waWxlZCB2aWV3IHVzZSBDb21waWxlZFJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RSZXNvdXJjZXMgaW1wbGVtZW50cyBJUmVzb3VyY2VSZXBvc2l0b3J5IHsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UmVzb3VyY2VGb2xkZXJUeXBlLCBMaXN0PFJlc291cmNlRm9sZGVyPj4gbUZvbGRlck1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFJlc291cmNlRm9sZGVyVHlwZSwgTGlzdDxSZXNvdXJjZUZvbGRlcj4+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UmVzb3VyY2VUeXBlLCBMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+PiBtUmVzb3VyY2VNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UHJvamVjdFJlc291cmNlSXRlbT4+KCk7Ci0KLSAgICAvKiogTWFwIG9mIChuYW1lLCBpZCkgZm9yIHJlc291cmNlcyBvZiB0eXBlIHtAbGluayBSZXNvdXJjZVR5cGUjSUR9IGNvbWluZyBmcm9tIFIuamF2YSAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+IG1SZXNvdXJjZVZhbHVlTWFwOwotICAgIC8qKiBNYXAgb2YgKGlkLCBbbmFtZSwgcmVzVHlwZV0pIGZvciBhbGwgcmVzb3VyY2VzIGNvbWluZyBmcm9tIFIuamF2YSAqLwotICAgIHByaXZhdGUgTWFwPEludGVnZXIsIFN0cmluZ1tdPiBtUmVzSWRWYWx1ZVRvTmFtZU1hcDsKLSAgICAvKiogTWFwIG9mIChpbnRbXSwgbmFtZSkgZm9yIHN0eWxlYWJsZSByZXNvdXJjZXMgY29taW5nIGZyb20gUi5qYXZhICovCi0gICAgcHJpdmF0ZSBNYXA8SW50QXJyYXlXcmFwcGVyLCBTdHJpbmc+IG1TdHlsZWFibGVWYWx1ZVRvTmFtZU1hcDsKLQotICAgIC8qKiBDYWNoZWQgbGlzdCBvZiB7QGxpbmsgSWRSZXNvdXJjZUl0ZW19LiBUaGlzIGlzIG1peCBvZiBJZFJlc291cmNlSXRlbSBjcmVhdGVkIGJ5Ci0gICAgICoge0BsaW5rIE11bHRpUmVzb3VyY2VGaWxlfSBmb3IgaWRzIGNvbWluZyBmcm9tIFhNTCBmaWxlcyB1bmRlciByZXMvdmFsdWVzIGFuZAotICAgICAqIHtAbGluayBJZFJlc291cmNlSXRlbX0gY3JlYXRlZCBtYW51YWxseSwgZnJvbSB0aGUgbGlzdCBjb21pbmcgZnJvbSBSLmphdmEgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJZFJlc291cmNlSXRlbT4gbUlkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxJZFJlc291cmNlSXRlbT4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNGcmFtZXdvcmtSZXBvc2l0b3J5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbnRBcnJheVdyYXBwZXIgbVdyYXBwZXIgPSBuZXcgSW50QXJyYXlXcmFwcGVyKG51bGwpOwotCi0gICAgcHVibGljIFByb2plY3RSZXNvdXJjZXMoYm9vbGVhbiBpc0ZyYW1ld29ya1JlcG9zaXRvcnkpIHsKLSAgICAgICAgbUlzRnJhbWV3b3JrUmVwb3NpdG9yeSA9IGlzRnJhbWV3b3JrUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbVJlcG9zaXRvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtSXNGcmFtZXdvcmtSZXBvc2l0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBGb2xkZXIgQ29uZmlndXJhdGlvbiB0byB0aGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgcmVzb3VyY2UgdHlwZS4KLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uLgotICAgICAqIEBwYXJhbSBmb2xkZXIgVGhlIHdvcmtzcGFjZSBmb2xkZXIgb2JqZWN0LgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvdXJjZUZvbGRlcn0gb2JqZWN0IGFzc29jaWF0ZWQgdG8gdGhpcyBmb2xkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlc291cmNlRm9sZGVyIGFkZChSZXNvdXJjZUZvbGRlclR5cGUgdHlwZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgICAgICBJQWJzdHJhY3RGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgbGlzdCBmb3IgdGhlIHJlc291cmNlIHR5cGUKLSAgICAgICAgTGlzdDxSZXNvdXJjZUZvbGRlcj4gbGlzdCA9IG1Gb2xkZXJNYXAuZ2V0KHR5cGUpOwotCi0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlRm9sZGVyPigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZUZvbGRlciBjZiA9IG5ldyBSZXNvdXJjZUZvbGRlcih0eXBlLCBjb25maWcsIGZvbGRlciwgbUlzRnJhbWV3b3JrUmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjZik7Ci0KLSAgICAgICAgICAgIG1Gb2xkZXJNYXAucHV0KHR5cGUsIGxpc3QpOwotCi0gICAgICAgICAgICByZXR1cm4gY2Y7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29rIGZvciBhbiBhbHJlYWR5IGV4aXN0aW5nIGZvbGRlciBjb25maWd1cmF0aW9uLgotICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyIGNGb2xkZXIgOiBsaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY0ZvbGRlci5tQ29uZmlndXJhdGlvbi5lcXVhbHMoY29uZmlnKSkgewotICAgICAgICAgICAgICAgIC8vIGNvbmZpZyBhbHJlYWR5IGV4aXN0LiBOb3RoaW5nIHRvIGJlIGRvbmUgcmVhbGx5LCBiZXNpZGVzIG1ha2luZyBzdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhlIElGb2xkZXIgb2JqZWN0IGlzIHVwIHRvIGRhdGUuCi0gICAgICAgICAgICAgICAgY0ZvbGRlci5tRm9sZGVyID0gZm9sZGVyOwotICAgICAgICAgICAgICAgIHJldHVybiBjRm9sZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgYXJyaXZlIGhlcmUsIHRoaXMgbWVhbnMgd2UgZGlkbid0IGZpbmQgYSBtYXRjaGluZyBjb25maWd1cmF0aW9uLgotICAgICAgICAvLyBTbyB3ZSBhZGQgb25lLgotICAgICAgICBSZXNvdXJjZUZvbGRlciBjZiA9IG5ldyBSZXNvdXJjZUZvbGRlcih0eXBlLCBjb25maWcsIGZvbGRlciwgbUlzRnJhbWV3b3JrUmVwb3NpdG9yeSk7Ci0gICAgICAgIGxpc3QuYWRkKGNmKTsKLQotICAgICAgICByZXR1cm4gY2Y7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHtAbGluayBSZXNvdXJjZUZvbGRlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBYnN0cmFjdEZvbGRlcn0uCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGZvbGRlcgotICAgICAqIEBwYXJhbSBmb2xkZXIgdGhlIElGb2xkZXIgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZvbGRlcihSZXNvdXJjZUZvbGRlclR5cGUgdHlwZSwgSUZvbGRlciBmb2xkZXIpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZSB0eXBlLgotICAgICAgICBMaXN0PFJlc291cmNlRm9sZGVyPiBsaXN0ID0gbUZvbGRlck1hcC5nZXQodHlwZSk7Ci0KLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyIHJlc0ZvbGRlciA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNGb2xkZXIuZ2V0Rm9sZGVyKCkuZ2V0SUZvbGRlcigpLmVxdWFscyhmb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIHRoZSBtYXRjaGluZyBSZXNvdXJjZUZvbGRlci4gd2UgbmVlZCB0byByZW1vdmUgaXQuCi0gICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIG5vdyBuZWVkIHRvIGludmFsaWRhdGUgdGhpcyByZXNvdXJjZSB0eXBlLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWFzaWVzdCB3YXkgaXMgdG8gdG91Y2ggb25lIG9mIHRoZSBvdGhlciBmb2xkZXJzIG9mIHRoZSBzYW1lIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuZ2V0KDApLnRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBpcyBub3cgZW1wdHksIGFuZCB3ZSBoYXZlIGEgc2luZ2xlIFJlc291Y2VUeXBlIG91dCBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZUZvbGRlclR5cGUsIHRoZW4gd2UgYXJlIGRvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBpZiBhbm90aGVyIFJlc291cmNlRm9sZGVyVHlwZSBjYW4gZ2VuZXJhdGUgc2ltaWxhciBSZXNvdXJjZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhpcywgd2UgbmVlZCB0byB1cGRhdGUgdGhvc2UgUmVzb3VyY2VUeXBlcyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGluc3RhbmNlLCBpZiB0aGUgbGFzdCAiZHJhd2FibGUtKiIgZm9sZGVyIGlzIGRlbGV0ZWQsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIFJlc291cmNlSXRlbSBhc3NvY2lhdGVkIHdpdGggUmVzb3VyY2VUeXBlLkRSQVdBQkxFLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhvc2UgY2FuIGJlIGZvdW5kIGluIFJlc291cmNlRm9sZGVyVHlwZS5EUkFXQUJMRSBidXQgYWxzbyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb3VyY2VGb2xkZXJUeXBlLlZBTFVFUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGZpbmQgYSBzaW5nbGUgZm9sZGVyIHRvIHRvdWNoLCB0aGVuIGl0J3MgZmluZSwgYXMgdGhlIHRvcAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV2ZWwgaXRlbXMgKHRoZSBsaXN0IG9mIGdlbmVyYXRlZCByZXNvdXJjZSB0eXBlcykgaXMgbm90IGNhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZvciBub3cpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdHMgb2YgUmVzb3VyY2VUeXBlcyBnZW5lcmF0ZWQgYnkgdGhpcyBSZXNvdXJjZUZvbGRlclR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZVtdIHJlc1R5cGVzID0gRm9sZGVyVHlwZVJlbGF0aW9uc2hpcC5nZXRSZWxhdGVkUmVzb3VyY2VUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIG9mIHRob3NlLCBtYWtlIHN1cmUgdG8gZmluZCBvbmUgZm9sZGVyIHRvIHRvdWNoIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIFJlc291cmNlSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgaXMgcmVidWlsdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIHJlc1R5cGUgOiByZXNUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBmb2xkZXIgdGhhdCBjYW4gZ2VuZXJhdGUgdGhpcyB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlW10gZm9sZGVyVHlwZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkZXJUeXBlUmVsYXRpb25zaGlwLmdldFJlbGF0ZWRGb2xkZXJzKHJlc1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIHRvdWNoIG9uZSBmb2xkZXIgaW4gYW55IG9mIHRob3NlIChzaW5jZSBpdCdzIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRlciBwZXIgdHlwZSwgbm90IHBlciBmb2xkZXIgdHlwZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZUZvbGRlclR5cGUgZm9sZGVyVHlwZSA6IGZvbGRlclR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VGb2xkZXI+IHJlc0ZvbGRlcnMgPSBtRm9sZGVyTWFwLmdldChmb2xkZXJUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzRm9sZGVycyAhPSBudWxsICYmIHJlc0ZvbGRlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzRm9sZGVycy5nZXQoMCkudG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZSB1cGRhdGluZy90b3VjaGluZywgd2UgY2FuIHN0b3AKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgUmVzb3VyY2VGb2xkZXJ9IGZvciBhIHNwZWNpZmljIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9LgotICAgICAqIEBwYXJhbSB0eXBlIFRoZSB7QGxpbmsgUmVzb3VyY2VGb2xkZXJUeXBlfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJlc291cmNlRm9sZGVyPiBnZXRGb2xkZXJzKFJlc291cmNlRm9sZGVyVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBtRm9sZGVyTWFwLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5I2dldEF2YWlsYWJsZVJlc291cmNlVHlwZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVR5cGVbXSBnZXRBdmFpbGFibGVSZXNvdXJjZVR5cGVzKCkgewotICAgICAgICBBcnJheUxpc3Q8UmVzb3VyY2VUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVR5cGU+KCk7Ci0KLSAgICAgICAgLy8gRm9yIGVhY2gga2V5LCB3ZSBjaGVjayBpZiB0aGVyZSdzIGEgc2luZ2xlIFJlc291cmNlVHlwZSBtYXRjaC4KLSAgICAgICAgLy8gSWYgbm90LCB3ZSBsb29rIGZvciB0aGUgYWN0dWFsIGNvbnRlbnQgdG8gZ2l2ZSB1cyB0aGUgcmVzb3VyY2UgdHlwZS4KLQotICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyVHlwZSBmb2xkZXJUeXBlIDogbUZvbGRlck1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHR5cGVzW10gPSBGb2xkZXJUeXBlUmVsYXRpb25zaGlwLmdldFJlbGF0ZWRSZXNvdXJjZVR5cGVzKGZvbGRlclR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGFkZCBpdCB3ZSBjaGVjayBpZiBpdCdzIG5vdCBhbHJlYWR5IHByZXNlbnQsIHNpbmNlIGEgUmVzb3VyY2VUeXBlCi0gICAgICAgICAgICAgICAgLy8gY291bGQgYmUgY3JlYXRlZCBmcm9tIG11bHRpcGxlIGZvbGRlcnMsIGV2ZW4gZm9yIHRoZSBmb2xkZXJzIHRoYXQgb25seSBjcmVhdGUKLSAgICAgICAgICAgICAgICAvLyBvbmUgdHlwZSBvZiByZXNvdXJjZSAoZHJhd2FibGUgZm9yIGluc3RhbmNlLCBjYW4gYmUgY3JlYXRlZCBmcm9tIGRyYXdhYmxlLyBhbmQKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMvKQotICAgICAgICAgICAgICAgIGlmIChsaXN0LmluZGV4T2YodHlwZXNbMF0pID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHR5cGVzWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzbid0IGEgc2luZ2xlIHJlc291cmNlIHR5cGUgb3V0IG9mIHRoaXMgZm9sZGVyLCBzbyB3ZSBsb29rIGZvciBhbGwKLSAgICAgICAgICAgICAgICAvLyBjb250ZW50LgotICAgICAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VGb2xkZXI+IGZvbGRlcnMgPSBtRm9sZGVyTWFwLmdldChmb2xkZXJUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9sZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VGb2xkZXIgZm9sZGVyIDogZm9sZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxSZXNvdXJjZVR5cGU+IGZvbGRlckNvbnRlbnQgPSBmb2xkZXIuZ2V0UmVzb3VyY2VUeXBlcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGFkZCB0aGVtLCBidXQgb25seSBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZVR5cGUgZm9sZGVyUmVzVHlwZSA6IGZvbGRlckNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGZvbGRlclJlc1R5cGUpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZvbGRlclJlc1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIGNhc2UgUmVzb3VyY2VUeXBlLklEIGhhdmVuJ3QgYmVlbiBhZGRlZCB5ZXQgYmVjYXVzZSB0aGVyZSdzIG5vIGlkIGRlZmluZWQKLSAgICAgICAgLy8gaW4gWE1MLCB3ZSBjaGVjayBvbiB0aGUgbGlzdCBvZiBjb21waWxlZCBpZCByZXNvdXJjZXMuCi0gICAgICAgIGlmIChsaXN0LmluZGV4T2YoUmVzb3VyY2VUeXBlLklEKSA9PSAtMSAmJiBtUmVzb3VyY2VWYWx1ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXAgPSBtUmVzb3VyY2VWYWx1ZU1hcC5nZXQoUmVzb3VyY2VUeXBlLklELmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwgJiYgbWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChSZXNvdXJjZVR5cGUuSUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgbGlzdCBpcyBmdWxsIG9mIFJlc291cmNlVHlwZSBkZWZpbmVkIGluIHRoZSBmaWxlcy4KLSAgICAgICAgLy8gV2UgbmVlZCB0byBzb3J0IGl0LgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwotCi0gICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJlc291cmNlVHlwZVtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLklSZXNvdXJjZVJlcG9zaXRvcnkjZ2V0UmVzb3VyY2VzKGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlKQotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0UmVzb3VyY2VJdGVtW10gZ2V0UmVzb3VyY2VzKFJlc291cmNlVHlwZSB0eXBlKSB7Ci0gICAgICAgIGNoZWNrQW5kVXBkYXRlKHR5cGUpOwotCi0gICAgICAgIGlmICh0eXBlID09IFJlc291cmNlVHlwZS5JRCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtSWRSZXNvdXJjZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlkUmVzb3VyY2VMaXN0LnRvQXJyYXkobmV3IFByb2plY3RSZXNvdXJjZUl0ZW1bbUlkUmVzb3VyY2VMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm9qZWN0UmVzb3VyY2VJdGVtPiBpdGVtcyA9IG1SZXNvdXJjZU1hcC5nZXQodHlwZSk7Ci0KLSAgICAgICAgcmV0dXJuIGl0ZW1zLnRvQXJyYXkobmV3IFByb2plY3RSZXNvdXJjZUl0ZW1baXRlbXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5yZXNvdXJjZXMuSVJlc291cmNlUmVwb3NpdG9yeSNoYXNSZXNvdXJjZXMoY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLnJlc291cmNlcy5SZXNvdXJjZVR5cGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VzKFJlc291cmNlVHlwZSB0eXBlKSB7Ci0gICAgICAgIGNoZWNrQW5kVXBkYXRlKHR5cGUpOwotCi0gICAgICAgIGlmICh0eXBlID09IFJlc291cmNlVHlwZS5JRCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtSWRSZXNvdXJjZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlkUmVzb3VyY2VMaXN0LnNpemUoKSA+IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+IGl0ZW1zID0gbVJlc291cmNlTWFwLmdldCh0eXBlKTsKLSAgICAgICAgcmV0dXJuIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBSZXNvdXJjZUZvbGRlcn0gYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIElGb2xkZXJ9LgotICAgICAqIEBwYXJhbSBmb2xkZXIgVGhlIHtAbGluayBJRm9sZGVyfSBvYmplY3QuCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFJlc291cmNlRm9sZGVyfSBvciBudWxsIGlmIGl0IHdhcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlRm9sZGVyIGdldFJlc291cmNlRm9sZGVyKElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIGZvciAoTGlzdDxSZXNvdXJjZUZvbGRlcj4gbGlzdCA6IG1Gb2xkZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyIDogbGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNGb2xkZXIuZ2V0Rm9sZGVyKCkuZ2V0SUZvbGRlcigpLmVxdWFscyhmb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNGb2xkZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFJlc291cmNlRmlsZX0gbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUsIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9IGFuZAotICAgICAqIGNvbmZpZ3VyYXRpb24uCi0gICAgICogPHAvPlRoaXMgb25seSB3b3JrcyB3aXRoIGZpbGVzIGdlbmVyYXRpbmcgb25lIHJlc291cmNlIG5hbWVkIGFmdGVyIHRoZSBmaWxlIChmb3IgaW5zdGFuY2UsCi0gICAgICogbGF5b3V0cywgYml0bWFwIGJhc2VkIGRyYXdhYmxlLCB4bWwsIGFuaW1zKS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VGaWxlIGdldE1hdGNoaW5nRmlsZShTdHJpbmcgbmFtZSwgUmVzb3VyY2VGb2xkZXJUeXBlIHR5cGUsCi0gICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICAvLyBnZXQgdGhlIGZvbGRlcnMgZm9yIHRoZSBnaXZlbiB0eXBlCi0gICAgICAgIExpc3Q8UmVzb3VyY2VGb2xkZXI+IGZvbGRlcnMgPSBtRm9sZGVyTWFwLmdldCh0eXBlKTsKLQotICAgICAgICAvLyBsb29rIGZvciBmb2xkZXJzIGNvbnRhaW5pbmcgYSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICAgIEFycmF5TGlzdDxSZXNvdXJjZUZvbGRlcj4gbWF0Y2hpbmdGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUZvbGRlcj4oKTsKLQotICAgICAgICAvLyByZW1vdmUgdGhlIGZvbGRlcnMgdGhhdCBkbyBub3QgaGF2ZSBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlaXIgY29uZmlnCi0gICAgICAgIC8vIGlzIGluY29tcGF0aWJsZS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZm9sZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgZm9sZGVyID0gZm9sZGVycy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXIuaGFzRmlsZShuYW1lKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hpbmdGb2xkZXJzLmFkZChmb2xkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZnJvbSB0aG9zZSwgZ2V0IHRoZSBmb2xkZXIgd2l0aCBhIGNvbmZpZyBtYXRjaGluZyB0aGUgZ2l2ZW4gcmVmZXJlbmNlIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgIFJlc291cmNlIG1hdGNoID0gZmluZE1hdGNoaW5nQ29uZmlndXJlZFJlc291cmNlKG1hdGNoaW5nRm9sZGVycywgY29uZmlnKTsKLQotICAgICAgICAvLyBkbyB3ZSBoYXZlIGEgbWF0Y2hpbmcgZm9sZGVyPwotICAgICAgICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZXNvdXJjZUZvbGRlcikgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBSZXNvdXJjZUZpbGUgZnJvbSB0aGUgZmlsZW5hbWUKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlRm9sZGVyKW1hdGNoKS5nZXRGaWxlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2VzIHZhbHVlcyBtYXRjaGluZyBhIGdpdmVuIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlQ29uZmlnIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4+IGdldENvbmZpZ3VyZWRSZXNvdXJjZXMoCi0gICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIHJlZmVyZW5jZUNvbmZpZykgewotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gbWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PigpOwotCi0gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgSWQgc2luY2UgdGhlcmUncyBhIG1peCBvZiBjb21waWxlZCBpZCAoZGVjbGFyZWQgaW5saW5lKSBhbmQgaWQgZGVjbGFyZWQKLSAgICAgICAgLy8gaW4gdGhlIFhNTCBmaWxlcy4KLSAgICAgICAgaWYgKG1JZFJlc291cmNlTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4gaWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPigpOwotICAgICAgICAgICAgU3RyaW5nIGlkVHlwZSA9IFJlc291cmNlVHlwZS5JRC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmb3IgKElkUmVzb3VyY2VJdGVtIGlkIDogbUlkUmVzb3VyY2VMaXN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGNhY2hlIHRoZSBSZXNvdXJjZVZhbHVlIQotICAgICAgICAgICAgICAgIGlkTWFwLnB1dChpZC5nZXROYW1lKCksIG5ldyBSZXNvdXJjZVZhbHVlKGlkVHlwZSwgaWQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUlzRnJhbWV3b3JrUmVwb3NpdG9yeSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXAucHV0KFJlc291cmNlVHlwZS5JRC5nZXROYW1lKCksIGlkTWFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxSZXNvdXJjZVR5cGU+IGtleXMgPSBtUmVzb3VyY2VNYXAua2V5U2V0KCk7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgIC8vIHdlIGRvbid0IHByb2Nlc3MgSUQgcmVzb3VyY2VzIHNpbmNlIHdlIGFscmVhZHkgZGlkIGl0IGFib3ZlLgotICAgICAgICAgICAgaWYgKGtleSAhPSBSZXNvdXJjZVR5cGUuSUQpIHsKLSAgICAgICAgICAgICAgICBtYXAucHV0KGtleS5nZXROYW1lKCksIGdldENvbmZpZ3VyZWRSZXNvdXJjZShrZXksIHJlZmVyZW5jZUNvbmZpZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhbGwgdGhlIHJlc291cmNlcy4gRXNzZW50aWFsbHkgdGhpcyBmb3JjZXMgdG8gbG9hZCB0aGUgdmFsdWVzIGZyb20gdGhlCi0gICAgICoge0BsaW5rIFJlc291cmNlRmlsZX0gb2JqZWN0cyB0byBtYWtlIHN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSBhbmQgbG9hZGVkCi0gICAgICogaW4ge0BsaW5rICNtUmVzb3VyY2VNYXB9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWRBbGwoKSB7Ci0gICAgICAgIC8vIGdldHMgYWxsIHRoZSByZXNvdXJjZSB0eXBlcyBhdmFpbGFibGUuCi0gICAgICAgIFJlc291cmNlVHlwZVtdIHR5cGVzID0gZ2V0QXZhaWxhYmxlUmVzb3VyY2VUeXBlcygpOwotCi0gICAgICAgIC8vIGxvb3Agb24gdGhlbSBhbmQgbG9hZCB0aGVtCi0gICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIHR5cGU6IHR5cGVzKSB7Ci0gICAgICAgICAgICBjaGVja0FuZFVwZGF0ZSh0eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc29sdmVzIGEgY29tcGlsZWQgcmVzb3VyY2UgaWQgaW50byB0aGUgcmVzb3VyY2UgbmFtZSBhbmQgdHlwZQotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgMiBzdHJpbmdzIHsgbmFtZSwgdHlwZSB9IG9yIG51bGwgaWYgdGhlIGlkIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSByZXNvbHZlUmVzb3VyY2VWYWx1ZShpbnQgaWQpIHsKLSAgICAgICAgaWYgKG1SZXNJZFZhbHVlVG9OYW1lTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzSWRWYWx1ZVRvTmFtZU1hcC5nZXQoaWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgYSBjb21waWxlZCByZXNvdXJjZSBpZCBvZiB0eXBlIGludFtdIGludG8gdGhlIHJlc291cmNlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VWYWx1ZShpbnRbXSBpZCkgewotICAgICAgICBpZiAobVN0eWxlYWJsZVZhbHVlVG9OYW1lTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1XcmFwcGVyLnNldChpZCk7Ci0gICAgICAgICAgICByZXR1cm4gbVN0eWxlYWJsZVZhbHVlVG9OYW1lTWFwLmdldChtV3JhcHBlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlc291cmNlIGJ5IGl0cyB0eXBlIGFuZCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFJlc291cmNlVmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChtUmVzb3VyY2VWYWx1ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXAgPSBtUmVzb3VyY2VWYWx1ZU1hcC5nZXQodHlwZSk7Ci0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFwLmdldChuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvcnRlZCBsaXN0IG9mIGxhbmd1YWdlcyB1c2VkIGluIHRoZSByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIFNvcnRlZFNldDxTdHJpbmc+IGdldExhbmd1YWdlcygpIHsKLSAgICAgICAgU29ydGVkU2V0PFN0cmluZz4gc2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgIENvbGxlY3Rpb248TGlzdDxSZXNvdXJjZUZvbGRlcj4+IGZvbGRlckxpc3QgPSBtRm9sZGVyTWFwLnZhbHVlcygpOwotICAgICAgICBmb3IgKExpc3Q8UmVzb3VyY2VGb2xkZXI+IGZvbGRlclN1Ykxpc3QgOiBmb2xkZXJMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyIGZvbGRlciA6IGZvbGRlclN1Ykxpc3QpIHsKLSAgICAgICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IGZvbGRlci5nZXRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGFuZ3VhZ2VRdWFsaWZpZXIgbGFuZyA9IGNvbmZpZy5nZXRMYW5ndWFnZVF1YWxpZmllcigpOwotICAgICAgICAgICAgICAgIGlmIChsYW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChsYW5nLmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29ydGVkIGxpc3Qgb2YgcmVnaW9ucyB1c2VkIGluIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UuCi0gICAgICogQHBhcmFtIGN1cnJlbnRMYW5ndWFnZSB0aGUgY3VycmVudCBsYW5ndWFnZSB0aGUgcmVnaW9uIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoLgotICAgICAqLwotICAgIHB1YmxpYyBTb3J0ZWRTZXQ8U3RyaW5nPiBnZXRSZWdpb25zKFN0cmluZyBjdXJyZW50TGFuZ3VhZ2UpIHsKLSAgICAgICAgU29ydGVkU2V0PFN0cmluZz4gc2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgIENvbGxlY3Rpb248TGlzdDxSZXNvdXJjZUZvbGRlcj4+IGZvbGRlckxpc3QgPSBtRm9sZGVyTWFwLnZhbHVlcygpOwotICAgICAgICBmb3IgKExpc3Q8UmVzb3VyY2VGb2xkZXI+IGZvbGRlclN1Ykxpc3QgOiBmb2xkZXJMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyIGZvbGRlciA6IGZvbGRlclN1Ykxpc3QpIHsKLSAgICAgICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IGZvbGRlci5nZXRDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgTGFuZ3VhZ2VRdWFsaWZpZXIgbGFuZyA9IGNvbmZpZy5nZXRMYW5ndWFnZVF1YWxpZmllcigpOwotICAgICAgICAgICAgICAgIGlmIChsYW5nICE9IG51bGwgJiYgbGFuZy5nZXRTdHJpbmdWYWx1ZSgpLmVxdWFscyhjdXJyZW50TGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZ2lvblF1YWxpZmllciByZWdpb24gPSBjb25maWcuZ2V0UmVnaW9uUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWdpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChyZWdpb24uZ2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgb2YgKHJlc291cmNlIG5hbWUsIHJlc291cmNlIHZhbHVlKSBmb3IgdGhlIGdpdmVuIHtAbGluayBSZXNvdXJjZVR5cGV9LgotICAgICAqIDxwLz5UaGUgdmFsdWVzIHJldHVybmVkIGFyZSB0YWtlbiBmcm9tIHRoZSByZXNvdXJjZSBmaWxlcyBiZXN0IG1hdGNoaW5nIGEgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0uCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlcy4KLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlQ29uZmlnIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlc3QgbWF0Y2guCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUmVzb3VyY2VWYWx1ZT4gZ2V0Q29uZmlndXJlZFJlc291cmNlKFJlc291cmNlVHlwZSB0eXBlLAotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiByZWZlcmVuY2VDb25maWcpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZSBpdGVtIGZvciB0aGUgZ2l2ZW4gdHlwZQotICAgICAgICBMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+IGl0ZW1zID0gbVJlc291cmNlTWFwLmdldCh0eXBlKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIG1hcAotICAgICAgICBIYXNoTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+KCk7Ci0KLSAgICAgICAgZm9yIChQcm9qZWN0UmVzb3VyY2VJdGVtIGl0ZW0gOiBpdGVtcykgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBzb3VyY2UgZmlsZXMgZ2VuZXJhdGluZyB0aGlzIHJlc291cmNlCi0gICAgICAgICAgICBMaXN0PFJlc291cmNlRmlsZT4gbGlzdCA9IGl0ZW0uZ2V0U291cmNlRmlsZUxpc3QoKTsKLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIGJlc3QgbWF0Y2ggZm9yIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBSZXNvdXJjZSBtYXRjaCA9IGZpbmRNYXRjaGluZ0NvbmZpZ3VyZWRSZXNvdXJjZShsaXN0LCByZWZlcmVuY2VDb25maWcpOwotCi0gICAgICAgICAgICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZXNvdXJjZUZpbGUpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUZpbGUgbWF0Y2hSZXNGaWxlID0gKFJlc291cmNlRmlsZSltYXRjaDsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmFsdWUgb2YgdGhpcyBjb25maWd1cmVkIHJlc291cmNlLgotICAgICAgICAgICAgICAgIElSZXNvdXJjZVZhbHVlIHZhbHVlID0gbWF0Y2hSZXNGaWxlLmdldFZhbHVlKHR5cGUsIGl0ZW0uZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoaXRlbS5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJlc3QgbWF0Y2hpbmcge0BsaW5rIFJlc291cmNlfS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBsaXN0IG9mIHtAbGluayBSZXNvdXJjZX0gdG8gY2hvb3NlIGZyb20uCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZUNvbmZpZyB0aGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IHRvIG1hdGNoLgotICAgICAqIEBzZWUgaHR0cDovL2QuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9yZXNvdXJjZXMtaTE4bi5odG1sI2Jlc3QtbWF0Y2gKLSAgICAgKi8KLSAgICBwcml2YXRlIFJlc291cmNlIGZpbmRNYXRjaGluZ0NvbmZpZ3VyZWRSZXNvdXJjZShMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZT4gcmVzb3VyY2VzLAotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiByZWZlcmVuY2VDb25maWcpIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMTogZWxpbWluYXRlIHJlc291cmNlcyB0aGF0IGNvbnRyYWRpY3QgdGhlIHJlZmVyZW5jZSBjb25maWd1cmF0aW9uCi0gICAgICAgIC8vIDI6IHBpY2sgbmV4dCBxdWFsaWZpZXIgdHlwZQotICAgICAgICAvLyAzOiBjaGVjayBpZiBhbnkgcmVzb3VyY2VzIHVzZSB0aGlzIHF1YWxpZmllciwgaWYgbm8sIGJhY2sgdG8gMiwgZWxzZSBtb3ZlIG9uIHRvIDQuCi0gICAgICAgIC8vIDQ6IGVsaW1pbmF0ZSByZXNvdXJjZXMgdGhhdCBkb24ndCB1c2UgdGhpcyBxdWFsaWZpZXIuCi0gICAgICAgIC8vIDU6IGlmIG1vcmUgdGhhbiBvbmUgcmVzb3VyY2UgbGVmdCwgZ28gYmFjayB0byAyLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgcHJlY2VkZW5jZSBvZiB0aGUgcXVhbGlmaWVycyBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHRoZSBudW1iZXIgb2YgcXVhbGlmaWVycyB0aGF0Ci0gICAgICAgIC8vIGV4YWN0bHkgbWF0Y2ggdGhlIGRldmljZS4KLQotICAgICAgICAvLyAxOiBlbGltaW5hdGUgcmVzb3VyY2VzIHRoYXQgY29udHJhZGljdAotICAgICAgICBBcnJheUxpc3Q8UmVzb3VyY2U+IG1hdGNoaW5nUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZSByZXMgPSByZXNvdXJjZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAocmVzLmdldENvbmZpZ3VyYXRpb24oKS5pc01hdGNoRm9yKHJlZmVyZW5jZUNvbmZpZykpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5hZGQocmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIG1hdGNoLCBqdXN0IHRha2UgaXQKLSAgICAgICAgaWYgKG1hdGNoaW5nUmVzb3VyY2VzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdSZXNvdXJjZXMuZ2V0KDApOwotICAgICAgICB9IGVsc2UgaWYgKG1hdGNoaW5nUmVzb3VyY2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDIuIExvb3Agb24gdGhlIHF1YWxpZmllcnMsIGFuZCBlbGltaW5hdGUgbWF0Y2hlcwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBGb2xkZXJDb25maWd1cmF0aW9uLmdldFF1YWxpZmllckNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IHEgPSAwIDsgcSA8IGNvdW50IDsgcSsrKSB7Ci0gICAgICAgICAgICAvLyBsb29rIHRvIHNlZSBpZiBvbmUgcmVzb3VyY2UgaGFzIHRoaXMgcXVhbGlmaWVyLgotICAgICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSBhbHNvIHJlY29yZCB0aGUgYmVzdCBtYXRjaCB2YWx1ZSBmb3IgdGhlIHF1YWxpZmllciAoaWYgYXBwbGljYWJsZSkuCi0KLSAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2UgdmFsdWUsIHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2guCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBxdWFsaWZpZXIgY291bGQgYmUgbnVsbC4gSW4gd2hpY2ggY2FzZSBhbnkgcXVhbGlmaWVyIGZvdW5kIGluIHRoZQotICAgICAgICAgICAgLy8gcG9zc2libGUgbWF0Y2gsIHdpbGwgYWxsIGJlIGNvbnNpZGVyZWQgYmVzdCBtYXRjaC4KLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHJlZmVyZW5jZVF1YWxpZmllciA9IHJlZmVyZW5jZUNvbmZpZy5nZXRRdWFsaWZpZXIocSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIGJlc3RNYXRjaCA9IG51bGw7IC8vIHRoaXMgaXMgdG8gc3RvcmUgdGhlIGJlc3QgbWF0Y2guCi0gICAgICAgICAgICBmb3IgKFJlc291cmNlIHJlcyA6IG1hdGNoaW5nUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyID0gcmVzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRRdWFsaWZpZXIocSk7Ci0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZmxhZy4KLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyBjaGVjayBmb3IgYSBiZXN0IG1hdGNoLiBJZiB0aGUgcmVmZXJlbmNlIHF1YWxpZmllciBpcyBudWxsICwKLSAgICAgICAgICAgICAgICAgICAgLy8gYW55IHF1YWxpZmllciBpcyBhICJiZXN0IiBtYXRjaCAod2UgZG9uJ3QgbmVlZCB0byByZWNvcmQgYWxsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIC8vIEluc3RlYWQgdGhlIG5vbiBjb21wYXRpYmxlIG9uZXMgYXJlIHJlbW92ZWQgYmVsb3cpCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VRdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllci5pc0JldHRlck1hdGNoVGhhbihiZXN0TWF0Y2gsIHJlZmVyZW5jZVF1YWxpZmllcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSBxdWFsaWZpZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDQuIElmIGEgcmVzb3VyY2VzIGhhcyBhIHF1YWxpZmllciBhdCB0aGUgY3VycmVudCBpbmRleCwgcmVtb3ZlIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQKLSAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIG9uZSwgb3Igd2hvc2UgcXVhbGlmaWVyIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRoZSBiZXN0IG1hdGNoIGZvdW5kIGFib3ZlCi0gICAgICAgICAgICAvLyB1bmxlc3MgdGhlcmUncyBubyByZWZlcmVuY2UgcXVhbGlmaWVyLCBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIGFsbCBjb25zaWRlcmVkCi0gICAgICAgICAgICAvLyAiYmVzdCIgbWF0Y2guCi0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtYXRjaGluZ1Jlc291cmNlcy5zaXplKCk7ICkgewotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXMgPSBtYXRjaGluZ1Jlc291cmNlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllciA9IHJlcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UXVhbGlmaWVyKHEpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXNvdXJjZXMgaGFzIG5vIHF1YWxpZmllciBvZiB0aGlzIHR5cGU6IHJlamVjdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdSZXNvdXJjZXMucmVtb3ZlKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlUXVhbGlmaWVyICE9IG51bGwgJiYgYmVzdE1hdGNoICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXF1YWxzKHF1YWxpZmllcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSByZWZlcmVuY2UgcXVhbGlmaWVyIGFuZCB0aGVyZSBpcyBhIGJldHRlciBtYXRjaCBmb3IgaXQgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXNvdXJjZSwgc28gd2UgcmVqZWN0IGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdSZXNvdXJjZXMucmVtb3ZlKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHdlIGtlZXAgdGhpcyByZXNvdXJjZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIG1heSBoYXZlIHJ1biBvdXQgb2YgbWF0Y2hpbmcgcmVzb3VyY2VzIGJlZm9yZSBnb2luZwotICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggYWxsIHRoZSBxdWFsaWZpZXJzLgotICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1Jlc291cmNlcy5zaXplKCkgPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJlY2F1c2Ugd2UgYWNjZXB0IHJlc291cmNlcyB3aG9zZSBjb25maWd1cmF0aW9uIGhhdmUgcXVhbGlmaWVycyB3aGVyZSB0aGUgcmVmZXJlbmNlIAotICAgICAgICAvLyBjb25maWd1cmF0aW9uIGRvZXNuJ3QsIHdlIGNhbiBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gb25lIG1hdGNoLiBJbiB0aGlzIGNhc2UsIHdlIGp1c3QKLSAgICAgICAgLy8gdGFrZSB0aGUgZmlyc3Qgb25lLgotICAgICAgICBpZiAobWF0Y2hpbmdSZXNvdXJjZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXRjaGluZ1Jlc291cmNlcy5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBsaXN0IG9mIHtAbGluayBSZXNvdXJjZUl0ZW19cyBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgUmVzb3VyY2VUeXBlfSBuZWVkcwotICAgICAqIHRvIGJlIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIFJlc291cmNlIFR5cGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQW5kVXBkYXRlKFJlc291cmNlVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBmb2xkZXIgdGhhdCBjYW4gb3V0cHV0IHRoaXMgdHlwZQotICAgICAgICBSZXNvdXJjZUZvbGRlclR5cGVbXSBmb2xkZXJUeXBlcyA9IEZvbGRlclR5cGVSZWxhdGlvbnNoaXAuZ2V0UmVsYXRlZEZvbGRlcnModHlwZSk7Ci0KLSAgICAgICAgZm9yIChSZXNvdXJjZUZvbGRlclR5cGUgZm9sZGVyVHlwZSA6IGZvbGRlclR5cGVzKSB7Ci0gICAgICAgICAgICBMaXN0PFJlc291cmNlRm9sZGVyPiBmb2xkZXJzID0gbUZvbGRlck1hcC5nZXQoZm9sZGVyVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFJlc291cmNlRm9sZGVyIGZvbGRlciA6IGZvbGRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5pc1RvdWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBmb2xkZXIgaXMgdG91Y2hlZCB3ZSBuZWVkIHRvIHVwZGF0ZSBhbGwgdGhlIHR5cGVzIHRoYXQgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBnZW5lcmF0ZWQgZnJvbSBhIGZpbGUgaW4gdGhpcyBmb2xkZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSAndHlwZScgb2J2aW91c2x5LgotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlW10gcmVzVHlwZXMgPSBGb2xkZXJUeXBlUmVsYXRpb25zaGlwLmdldFJlbGF0ZWRSZXNvdXJjZVR5cGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIHJlc1R5cGUgOiByZXNUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShyZXNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGxpc3Qgb2Yge0BsaW5rIFJlc291cmNlSXRlbX0gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgUmVzb3VyY2VUeXBlfS4KLSAgICAgKiBUaGlzIHdpbGwgcmVzZXQgdGhlIHRvdWNoIHN0YXR1cyBvZiBhbGwgdGhlIGZvbGRlcnMgdGhhdCBjYW4gZ2VuZXJhdGUgdGhpcyByZXNvdXJjZSB0eXBlLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBSZXNvdXJjZSBUeXBlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoUmVzb3VyY2VUeXBlIHR5cGUpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjYWNoZSBsaXN0LCBhbmQgbGV0cyBtYWtlIGEgYmFja3VwCi0gICAgICAgIExpc3Q8UHJvamVjdFJlc291cmNlSXRlbT4gaXRlbXMgPSBtUmVzb3VyY2VNYXAuZ2V0KHR5cGUpOwotICAgICAgICBMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+IGJhY2t1cCA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdFJlc291cmNlSXRlbT4oKTsKLQotICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+KCk7Ci0gICAgICAgICAgICBtUmVzb3VyY2VNYXAucHV0KHR5cGUsIGl0ZW1zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGJhY2t1cCB0aGUgbGlzdAotICAgICAgICAgICAgYmFja3VwLmFkZEFsbChpdGVtcyk7Ci0KLSAgICAgICAgICAgIC8vIHdlIHJlc2V0IHRoZSBsaXN0IGl0c2VsZi4KLSAgICAgICAgICAgIGl0ZW1zLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZm9sZGVyIHRoYXQgY2FuIG91dHB1dCB0aGlzIHR5cGUKLSAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlW10gZm9sZGVyVHlwZXMgPSBGb2xkZXJUeXBlUmVsYXRpb25zaGlwLmdldFJlbGF0ZWRGb2xkZXJzKHR5cGUpOwotCi0gICAgICAgIGZvciAoUmVzb3VyY2VGb2xkZXJUeXBlIGZvbGRlclR5cGUgOiBmb2xkZXJUeXBlcykgewotICAgICAgICAgICAgTGlzdDxSZXNvdXJjZUZvbGRlcj4gZm9sZGVycyA9IG1Gb2xkZXJNYXAuZ2V0KGZvbGRlclR5cGUpOwotCi0gICAgICAgICAgICBpZiAoZm9sZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZUZvbGRlciBmb2xkZXIgOiBmb2xkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zLmFkZEFsbChmb2xkZXIuZ2V0UmVzb3VyY2VzKHR5cGUsIHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyLnJlc2V0VG91Y2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgaXRlbXMgY29udGFpbnMgdGhlIG5ldyBsaXN0LiBXZSAibWVyZ2UiIGl0IHdpdGggdGhlIGJhY2t1cCBsaXN0LgotICAgICAgICAvLyBCYXNpY2FsbHksIHdlIG5lZWQgdG8ga2VlcCB0aGUgb2xkIGluc3RhbmNlcyBvZiBSZXNvdXJjZUl0ZW0gKHdoZXJlIGFwcGxpY2FibGUpLAotICAgICAgICAvLyBidXQgcmVwbGFjZSB0aGVtIGJ5IHRoZSBjb250ZW50IG9mIHRoZSBuZXcgaXRlbXMuCi0gICAgICAgIC8vIFRoaXMgd2lsbCBsZXQgdGhlIHJlc291cmNlIGV4cGxvcmVyIGtlZXAgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSBub2RlcyB3aG9zZSBkYXRhCi0gICAgICAgIC8vIGlzIGEgUmVzb3VyY2VJdGVtIG9iamVjdC4KLSAgICAgICAgaWYgKGJhY2t1cC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBnb2luZyB0byBjaGFuZ2UgYXMgd2UncmUgb25seSByZXBsYWNpbmcgaW5zdGFuY2VzLgotICAgICAgICAgICAgaW50IGNvdW50ID0gaXRlbXMuc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDspIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlICJuZXciIGl0ZW0KLSAgICAgICAgICAgICAgICBQcm9qZWN0UmVzb3VyY2VJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIHNpbWlsYXIgaXRlbSBpbiB0aGUgb2xkIGxpc3QuCi0gICAgICAgICAgICAgICAgUHJvamVjdFJlc291cmNlSXRlbSBmb3VuZE9sZEl0ZW0gPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoUHJvamVjdFJlc291cmNlSXRlbSBvbGRJdGVtIDogYmFja3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbGRJdGVtLmdldE5hbWUoKS5lcXVhbHMoaXRlbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE9sZEl0ZW0gPSBvbGRJdGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm91bmRPbGRJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXJhc2UgdGhlIGRhdGEgb2YgdGhlIG9sZCBpdGVtIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgbmV3IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgZm91bmRPbGRJdGVtLnJlcGxhY2VXaXRoKGl0ZW0pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIGFuZCBuZXcgaXRlbSBmcm9tIHRoZWlyIHJlc3BlY3RpdmUgbGlzdHMKLSAgICAgICAgICAgICAgICAgICAgaXRlbXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICBiYWNrdXAucmVtb3ZlKGZvdW5kT2xkSXRlbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBvbGQgaXRlbSB0byB0aGUgbmV3IGxpc3QKLSAgICAgICAgICAgICAgICAgICAgaXRlbXMuYWRkKGZvdW5kT2xkSXRlbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5ldyBpdGVtLCB3ZSBza2lwIHRvIHRoZSBuZXh0IG9iamVjdAotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgUmVzb3VyY2VUeXBlLklELCB3ZSBjcmVhdGUgdGhlIGFjdHVhbCBsaXN0LCBmcm9tIHRoaXMgbGlzdCBhbmQKLSAgICAgICAgLy8gdGhlIGNvbXBpbGVkIHJlc291cmNlIGxpc3QuCi0gICAgICAgIGlmICh0eXBlID09IFJlc291cmNlVHlwZS5JRCkgewotICAgICAgICAgICAgbWVyZ2VJZFJlc291cmNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZWxzZSB0aGlzIGlzIHRoZSBsaXN0IHRoYXQgd2lsbCBhY3R1YWxseSBiZSBkaXNwbGF5ZWQsIHNvIHdlIHNvcnQgaXQuCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2tzIHVwIGFuIGV4aXN0aW5nIHtAbGluayBQcm9qZWN0UmVzb3VyY2VJdGVtfSBieSB7QGxpbmsgUmVzb3VyY2VUeXBlfSBhbmQgbmFtZS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgUmVzb3VyY2UgVHlwZS4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgUmVzb3VyY2UgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBleGlzdGluZyBSZXNvdXJjZUl0ZW0gb3IgbnVsbCBpZiBubyBtYXRjaCB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZUl0ZW0gZmluZFJlc291cmNlSXRlbShSZXNvdXJjZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTGlzdDxQcm9qZWN0UmVzb3VyY2VJdGVtPiBsaXN0ID0gbVJlc291cmNlTWFwLmdldCh0eXBlKTsKLQotICAgICAgICBmb3IgKFByb2plY3RSZXNvdXJjZUl0ZW0gaXRlbSA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgY29tcGlsZWQgcmVzb3VyY2UgaW5mb3JtYXRpb24uCi0gICAgICogQHBhcmFtIHJlc0lkVmFsdWVUb05hbWVNYXAgYSBtYXAgb2YgY29tcGlsZWQgcmVzb3VyY2UgaWQgdG8gcmVzb3VyY2UgbmFtZS4KLSAgICAgKiAgVGhlIG1hcCBpcyBhY3F1aXJlZCBieSB0aGUge0BsaW5rIFByb2plY3RSZXNvdXJjZXN9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gc3R5bGVhYmxlVmFsdWVNYXAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VWYWx1ZU1hcCBhIG1hcCBvZiAobmFtZSwgaWQpIGZvciByZXNvdXJjZXMgb2YgdHlwZSB7QGxpbmsgUmVzb3VyY2VUeXBlI0lEfS4KLSAgICAgKiBUaGUgbGlzdCBpcyBhY3F1aXJlZCBieSB0aGUge0BsaW5rIFByb2plY3RSZXNvdXJjZXN9IG9iamVjdC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENvbXBpbGVkUmVzb3VyY2VzKE1hcDxJbnRlZ2VyLCBTdHJpbmdbXT4gcmVzSWRWYWx1ZVRvTmFtZU1hcCwKLSAgICAgICAgICAgIE1hcDxJbnRBcnJheVdyYXBwZXIsIFN0cmluZz4gc3R5bGVhYmxlVmFsdWVNYXAsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gcmVzb3VyY2VWYWx1ZU1hcCkgewotICAgICAgICBtUmVzb3VyY2VWYWx1ZU1hcCA9IHJlc291cmNlVmFsdWVNYXA7Ci0gICAgICAgIG1SZXNJZFZhbHVlVG9OYW1lTWFwID0gcmVzSWRWYWx1ZVRvTmFtZU1hcDsKLSAgICAgICAgbVN0eWxlYWJsZVZhbHVlVG9OYW1lTWFwID0gc3R5bGVhYmxlVmFsdWVNYXA7Ci0gICAgICAgIG1lcmdlSWRSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZXMgdGhlIGxpc3Qgb2YgSUQgcmVzb3VyY2UgY29taW5nIGZyb20gUi5qYXZhIGFuZCB0aGUgbGlzdCBvZiBJRCByZXNvdXJjZXMKLSAgICAgKiBjb21pbmcgZnJvbSBYTUwgZGVjbGFyYXRpb24gaW50byB0aGUgY2FjaGVkIGxpc3Qge0BsaW5rICNtSWRSZXNvdXJjZUxpc3R9LgotICAgICAqLwotICAgIHZvaWQgbWVyZ2VJZFJlc291cmNlcygpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIElEcyBjb21pbmcgZnJvbSBYTUwgZGVjbGFyYXRpb24uIFRob3NlIGlkcyBhcmUgcHJlc2VudCBpbgotICAgICAgICAvLyBtQ29tcGlsZWRJZFJlc291cmNlcyBhbHJlYWR5LCBzbyB3ZSdsbCBuZWVkIHRvIHVzZSB0aG9zZSBpbnN0ZWFkIG9mIGNyZWF0aW5nCi0gICAgICAgIC8vIG5ldyBJZFJlc291cmNlSXRlbQotICAgICAgICBMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+IHhtbElkUmVzb3VyY2VzID0gbVJlc291cmNlTWFwLmdldChSZXNvdXJjZVR5cGUuSUQpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUlkUmVzb3VyY2VMaXN0KSB7Ci0gICAgICAgICAgICAvLyBjb3B5IHRoZSBjdXJyZW50bHkgY2FjaGVkIGl0ZW1zLgotICAgICAgICAgICAgQXJyYXlMaXN0PElkUmVzb3VyY2VJdGVtPiBvbGRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SWRSZXNvdXJjZUl0ZW0+KCk7Ci0gICAgICAgICAgICBvbGRJdGVtcy5hZGRBbGwobUlkUmVzb3VyY2VMaXN0KTsKLQotICAgICAgICAgICAgLy8gZW1wdHkgdGhlIGN1cnJlbnQgbGlzdAotICAgICAgICAgICAgbUlkUmVzb3VyY2VMaXN0LmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBjb21waWxlIGlkIHJlc291cmNlcy4KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGlkTWFwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtUmVzb3VyY2VWYWx1ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWRNYXAgPSBtUmVzb3VyY2VWYWx1ZU1hcC5nZXQoUmVzb3VyY2VUeXBlLklELmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpZE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbElkUmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChQcm9qZWN0UmVzb3VyY2VJdGVtIHJlc291cmNlSXRlbSA6IHhtbElkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgYWN0dWFsIGNsYXNzIGp1c3QgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUl0ZW0gaW5zdGFuY2VvZiBJZFJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JZFJlc291cmNlTGlzdC5hZGQoKElkUmVzb3VyY2VJdGVtKXJlc291cmNlSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGxvb3Agb24gdGhlIGZ1bGwgbGlzdCBvZiBpZCwgYW5kIGxvb2sgZm9yIGEgbWF0Y2ggaW4gdGhlIG9sZCBsaXN0LAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBsaXN0IGNvbWluZyBmcm9tIFhNTCAoaW4gY2FzZSBhIG5ldyBYTUwgaXRlbSB3YXMgY3JlYXRlZC4pCi0KLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpZFNldCA9IGlkTWFwLmtleVNldCgpOwotCi0gICAgICAgICAgICAgICAgaWRMb29wOiBmb3IgKFN0cmluZyBpZFJlc291cmNlIDogaWRTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgbG9vayBpbiB0aGUgWE1MIGxpc3QgaW4gY2FzZSBhbiBpZCB3ZW50IGZyb20gaW5saW5lIHRvIFhNTCBkZWNsYXJlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhtbElkUmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUHJvamVjdFJlc291cmNlSXRlbSByZXNvdXJjZUl0ZW0gOiB4bWxJZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUl0ZW0gaW5zdGFuY2VvZiBJZFJlc291cmNlSXRlbSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJdGVtLmdldE5hbWUoKS5lcXVhbHMoaWRSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlkUmVzb3VyY2VMaXN0LmFkZCgoSWRSZXNvdXJjZUl0ZW0pcmVzb3VyY2VJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgaWRMb29wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgaXQsIGxvb2sgaW4gdGhlIG9sZCBpdGVtcy4KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gb2xkSXRlbXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgSWRSZXNvdXJjZUl0ZW0gcmVzb3VyY2VJdGVtID0gb2xkSXRlbXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlSXRlbS5nZXROYW1lKCkuZXF1YWxzKGlkUmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkSXRlbXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JZFJlc291cmNlTGlzdC5hZGQocmVzb3VyY2VJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBpZExvb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IGZvdW5kIGl0LCBpdCBsb29rcyBsaWtlIGl0J3MgYSBuZXcgaWQgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZWQgaW5saW5lLgotICAgICAgICAgICAgICAgICAgICBtSWRSZXNvdXJjZUxpc3QuYWRkKG5ldyBJZFJlc291cmNlSXRlbShpZFJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNEZWNsYXJlZElubGluZSAqLykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHdlIHNvcnQgdGhlIGxpc3QKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobUlkUmVzb3VyY2VMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9SZXNvdXJjZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTAwNWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBmaWxlIHN5c3RlbSByZXNvdXJjZSBpdGVtcyAoRm9sZGVycywgRmlsZXMpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2UgewotICAgIHByaXZhdGUgYm9vbGVhbiBtVG91Y2hlZCA9IHRydWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGZvciB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgRm9sZGVyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIHdhcyBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRvdWNoKCkgewotICAgICAgIG1Ub3VjaGVkID0gdHJ1ZTsgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVG91Y2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3VjaGVkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCByZXNldFRvdWNoKCkgewotICAgICAgICBtVG91Y2hlZCA9IGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9SZXNvdXJjZUZpbGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9SZXNvdXJjZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmYjkzZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzLklBYnN0cmFjdEZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JUmVzb3VyY2VWYWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBSZXNvdXJjZSBmaWxlIChhIGZpbGUgdW5kZXIgJFByb2plY3QvcmVzLykKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRmlsZSBleHRlbmRzIFJlc291cmNlIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIElBYnN0cmFjdEZpbGUgbUZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUZvbGRlciBtRm9sZGVyOwotICAgIAotICAgIHByb3RlY3RlZCBSZXNvdXJjZUZpbGUoSUFic3RyYWN0RmlsZSBmaWxlLCBSZXNvdXJjZUZvbGRlciBmb2xkZXIpIHsKLSAgICAgICAgbUZpbGUgPSBmaWxlOwotICAgICAgICBtRm9sZGVyID0gZm9sZGVyOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2UjZ2V0Q29uZmlndXJhdGlvbigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZvbGRlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1Gb2xkZXIuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIFJlc291cmNlRmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSUFic3RyYWN0RmlsZSBnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gbUZpbGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBmb2xkZXIgYXMgYSB7QGxpbmsgUmVzb3VyY2VGb2xkZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUZvbGRlciBnZXRGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBtRm9sZGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGEgZnJhbWV3b3JrIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRnJhbWV3b3JrKCkgewotICAgICAgICByZXR1cm4gbUZvbGRlci5pc0ZyYW1ld29yaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yge0BsaW5rIFJlc291cmNlVHlwZX0gZ2VuZXJhdGVkIGJ5IHRoZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZVR5cGVbXSBnZXRSZXNvdXJjZVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgZ2VuZXJhdGVkIGEgcmVzb3VyY2Ugb2YgYSBzcGVjaWZpYyB0eXBlLgotICAgICAqIEBwYXJhbSB0eXBlIFRoZSB7QGxpbmsgUmVzb3VyY2VUeXBlfQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1Jlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2Yge0BsaW5rIFByb2plY3RSZXNvdXJjZUl0ZW19IG9mIGEgc3BlY2lmaWMgdHlwZSBnZW5lcmF0ZWQgYnkgdGhlIGZpbGUuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGNyZWF0ZSBkdXBsaWNhdGUuCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Yge0BsaW5rIFByb2plY3RSZXNvdXJjZUl0ZW19IHRvIHJldHVybi4KLSAgICAgKiBAcGFyYW0gcHJvamVjdFJlc291cmNlcyBUaGUgZ2xvYmFsIFByb2plY3QgUmVzb3VyY2Ugb2JqZWN0LCBhbGxvd2luZyB0aGUgaW1wbGVtZW50YXRpb24gdG8KLSAgICAgKiBxdWVyeSBmb3IgYWxyZWFkeSBleGlzdGluZyB7QGxpbmsgUHJvamVjdFJlc291cmNlSXRlbX0KLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIDxiPm5ldzwvYj4ge0BsaW5rIFByb2plY3RSZXNvdXJjZUl0ZW19Ci0gICAgICogQHNlZSBQcm9qZWN0UmVzb3VyY2VzI2ZpbmRSZXNvdXJjZUl0ZW0oUmVzb3VyY2VUeXBlLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248UHJvamVjdFJlc291cmNlSXRlbT4gZ2V0UmVzb3VyY2VzKFJlc291cmNlVHlwZSB0eXBlLAotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0UmVzb3VyY2VzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlc291cmNlIGdlbmVyYXRlZCBieSB0aGlzIGZpbGUgYnkge0BsaW5rIFJlc291cmNlVHlwZX0gYW5kIG5hbWUuCi0gICAgICogPHAvPklmIG5vIHJlc291cmNlIG1hdGNoLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4gCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVJlc291cmNlVmFsdWUgZ2V0VmFsdWUoUmVzb3VyY2VUeXBlIHR5cGUsIFN0cmluZyBuYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlRm9sZGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhMmQ5MC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuSUFic3RyYWN0RmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuSUFic3RyYWN0Rm9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogUmVzb3VyY2UgRm9sZGVyIGNsYXNzLiBDb250YWlucyBsaXN0IG9mIHtAbGluayBSZXNvdXJjZUZpbGV9cywKLSAqIHRoZSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0sIGFuZCBhIGxpbmsgdG8gdGhlIHdvcmtzcGFjZSB7QGxpbmsgSUZvbGRlcn0gb2JqZWN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VGb2xkZXIgZXh0ZW5kcyBSZXNvdXJjZSB7Ci0gICAgUmVzb3VyY2VGb2xkZXJUeXBlIG1UeXBlOwotICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb247Ci0gICAgSUFic3RyYWN0Rm9sZGVyIG1Gb2xkZXI7Ci0gICAgQXJyYXlMaXN0PFJlc291cmNlRmlsZT4gbUZpbGVzID0gbnVsbDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzRnJhbWV3b3JrOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFJlc291cmNlRm9sZGVyfQotICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZm9sZGVyIFRoZSBhc3NvY2lhdGVkIHtAbGluayBJQWJzdHJhY3RGb2xkZXJ9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gaXNGcmFtZXdvcmtSZXBvc2l0b3J5IAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUZvbGRlcihSZXNvdXJjZUZvbGRlclR5cGUgdHlwZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgICAgICBJQWJzdHJhY3RGb2xkZXIgZm9sZGVyLCBib29sZWFuIGlzRnJhbWV3b3JrUmVwb3NpdG9yeSkgewotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1Db25maWd1cmF0aW9uID0gY29uZmlnOwotICAgICAgICBtRm9sZGVyID0gZm9sZGVyOwotICAgICAgICBtSXNGcmFtZXdvcmsgPSBpc0ZyYW1ld29ya1JlcG9zaXRvcnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSB7QGxpbmsgUmVzb3VyY2VGaWxlfSB0byB0aGUgZm9sZGVyLgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKFJlc291cmNlRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChtRmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUZpbGVzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUZpbGU+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmlsZXMuYWRkKGZpbGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byByZW1vdmUgdGhlIHtAbGluayBSZXNvdXJjZUZpbGV9IGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmllZCB7QGxpbmsgSUZpbGV9LgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBJRmlsZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsZShJRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChtRmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VGaWxlIHJlc0ZpbGUgPSBtRmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgaUZpbGUgPSByZXNGaWxlLmdldEZpbGUoKS5nZXRJRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaUZpbGUgIT0gbnVsbCAmJiBpRmlsZS5lcXVhbHMoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3VjaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGb2xkZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFic3RyYWN0Rm9sZGVyIGdldEZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Gb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFJlc291cmNlRm9sZGVyVHlwZX0gb2YgdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlRm9sZGVyVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbVR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZm9sZGVyIGlzIGEgZnJhbWV3b3JrIHJlc291cmNlIGZvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYW1ld29yaygpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0ZyYW1ld29yazsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB7QGxpbmsgUmVzb3VyY2VUeXBlfXMgZ2VuZXJhdGVkIGJ5IHRoZSBmaWxlcyBpbnNpZGUgdGhpcyBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2VUeXBlPiBnZXRSZXNvdXJjZVR5cGVzKCkgewotICAgICAgICBBcnJheUxpc3Q8UmVzb3VyY2VUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVR5cGU+KCk7Ci0KLSAgICAgICAgaWYgKG1GaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlRmlsZSBmaWxlIDogbUZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlW10gdHlwZXMgPSBmaWxlLmdldFJlc291cmNlVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhvc2UgYW5kIGFkZCB0aGVtIHRvIHRoZSBtYWluIGxpc3QsCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudAotICAgICAgICAgICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VUeXBlIHJlc1R5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihyZXNUeXBlKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJlc1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2UjZ2V0Q29uZmlndXJhdGlvbigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZvbGRlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1Db25maWd1cmF0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZvbGRlciBjb250YWlucyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBtRm9sZGVyLmhhc0ZpbGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFJlc291cmNlRmlsZX0gbWF0Y2hpbmcgYSB7QGxpbmsgSUFic3RyYWN0RmlsZX0gb2JqZWN0LgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgSUZpbGV9IG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBvciBudWxsIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VGaWxlIGdldEZpbGUoSUFic3RyYWN0RmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChtRmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChSZXNvdXJjZUZpbGUgZiA6IG1GaWxlcykgewotICAgICAgICAgICAgICAgIGlmIChmLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBtYXRjaGluZyBhIHtAbGluayBJRmlsZX0gb2JqZWN0LgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgSUZpbGV9IG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBvciBudWxsIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VGaWxlIGdldEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAobUZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUmVzb3VyY2VGaWxlIGYgOiBtRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBJRmlsZSBpRmlsZSA9IGYuZ2V0RmlsZSgpLmdldElGaWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlGaWxlICE9IG51bGwgJiYgaUZpbGUuZXF1YWxzKGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBtYXRjaGluZyBhIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VGaWxlfSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBpZiAobUZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUmVzb3VyY2VGaWxlIGYgOiBtRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZi5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhmaWxlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhIGZpbGUgaW4gdGhlIGZvbGRlciBpcyBnZW5lcmF0aW5nIGEgcmVzb3VyY2Ugb2YgYSBzcGVjaWZpZWQgdHlwZS4KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUge0BsaW5rIFJlc291cmNlVHlwZX0gYmVpbmcgbG9va2VkIHVwLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSkgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZm9sZGVyIHR5cGUgaXMgYWJsZSB0byBnZW5lcmF0ZSByZXNvdXJjZSBvZiB0aGUgdHlwZSB0aGF0IHdhcyBhc2tlZC4KLSAgICAgICAgLy8gdGhpcyBpcyBhIGZpcnN0IGNoZWNrIHRvIGF2b2lkIGdvaW5nIHRocm91Z2ggdGhlIGZpbGVzLgotICAgICAgICBSZXNvdXJjZUZvbGRlclR5cGVbXSBmb2xkZXJUeXBlcyA9IEZvbGRlclR5cGVSZWxhdGlvbnNoaXAuZ2V0UmVsYXRlZEZvbGRlcnModHlwZSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VGb2xkZXJUeXBlIHJmdCA6IGZvbGRlclR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAocmZ0ID09IG1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgIGlmIChtRmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VGaWxlIGYgOiBtRmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGYuaGFzUmVzb3VyY2VzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIHtAbGluayBSZXNvdXJjZUl0ZW19IG9mIGEgc3BlY2lmaWMgdHlwZSBnZW5lcmF0ZWQgYnkgYWxsIHRoZSBmaWxlcwotICAgICAqIGluIHRoZSBmb2xkZXIuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGNyZWF0ZSBkdXBsaWNhdGVzLgotICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHtAbGluayBSZXNvdXJjZUl0ZW19IHRvIHJldHVybi4KLSAgICAgKiBAcGFyYW0gcHJvamVjdFJlc291cmNlcyBUaGUgZ2xvYmFsIFByb2plY3QgUmVzb3VyY2Ugb2JqZWN0LCBhbGxvd2luZyB0aGUgaW1wbGVtZW50YXRpb24gdG8KLSAgICAgKiBxdWVyeSBmb3IgYWxyZWFkeSBleGlzdGluZyB7QGxpbmsgUmVzb3VyY2VJdGVtfQotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgPGI+bmV3PC9iPiB7QGxpbmsgUmVzb3VyY2VJdGVtfQotICAgICAqIEBzZWUgUHJvamVjdFJlc291cmNlcyNmaW5kUmVzb3VyY2VJdGVtKFJlc291cmNlVHlwZSwgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFByb2plY3RSZXNvdXJjZUl0ZW0+IGdldFJlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSwKLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdFJlc291cmNlcykgewotICAgICAgICBDb2xsZWN0aW9uPFByb2plY3RSZXNvdXJjZUl0ZW0+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+KCk7Ci0gICAgICAgIGlmIChtRmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChSZXNvdXJjZUZpbGUgZiA6IG1GaWxlcykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKGYuZ2V0UmVzb3VyY2VzKHR5cGUsIHByb2plY3RSZXNvdXJjZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VGb2xkZXJUeXBlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VGb2xkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTZmZjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlRm9sZGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotLyoqCi0gKiBFbnVtIHJlcHJlc2VudGluZyBhIHR5cGUgb2YgcmVzb3VyY2UgZm9sZGVyLgotICovCi1wdWJsaWMgZW51bSBSZXNvdXJjZUZvbGRlclR5cGUgewotICAgIEFOSU0oU2RrQ29uc3RhbnRzLkZEX0FOSU0pLAotICAgIENPTE9SKFNka0NvbnN0YW50cy5GRF9DT0xPUiksCi0gICAgRFJBV0FCTEUoU2RrQ29uc3RhbnRzLkZEX0RSQVdBQkxFKSwKLSAgICBMQVlPVVQoU2RrQ29uc3RhbnRzLkZEX0xBWU9VVCksCi0gICAgTUVOVShTZGtDb25zdGFudHMuRkRfTUVOVSksCi0gICAgUkFXKFNka0NvbnN0YW50cy5GRF9SQVcpLAotICAgIFZBTFVFUyhTZGtDb25zdGFudHMuRkRfVkFMVUVTKSwKLSAgICBYTUwoU2RrQ29uc3RhbnRzLkZEX1hNTCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLQotICAgIFJlc291cmNlRm9sZGVyVHlwZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVudW0gYnkgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZW51bSBzdHJpbmcgdmFsdWUuCi0gICAgICogQHJldHVybiB0aGUgZW51bSBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlRm9sZGVyVHlwZSBnZXRUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VGb2xkZXJUeXBlIHJUeXBlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChyVHlwZS5tTmFtZS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gclR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBSZXNvdXJjZUZvbGRlclR5cGV9IGZyb20gdGhlIGZvbGRlciBuYW1lCi0gICAgICogQHBhcmFtIGZvbGRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZvbGRlci4gVGhpcyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyIG5hbWUgaW4gdGhlIGZvcm1hdAotICAgICAqIDxjb2RlPnJlc1R5cGVbLXJlc3F1YWxpZmllcnNbLXJlc3F1YWxpZmllcnNbLi4uXV08L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UmVzb3VyY2VGb2xkZXJUeXBlPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIGZvbGRlciwgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtYXRjaGluZyB0eXBlIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlRm9sZGVyVHlwZSBnZXRGb2xkZXJUeXBlKFN0cmluZyBmb2xkZXJOYW1lKSB7Ci0gICAgICAgIC8vIHNwbGl0IHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgaW4gc2VnbWVudHMuCi0gICAgICAgIFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzID0gZm9sZGVyTmFtZS5zcGxpdChGb2xkZXJDb25maWd1cmF0aW9uLlFVQUxJRklFUl9TRVApOwotCi0gICAgICAgIC8vIGdldCB0aGUgZW51bSBmb3IgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICAgIHJldHVybiBnZXRUeXBlQnlOYW1lKGZvbGRlclNlZ21lbnRzWzBdKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjkzYjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUmVzb3VyY2VRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JRmlsZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3IuSUZvbGRlckxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3IuSVByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuRmlsZVdyYXBwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzLkZvbGRlcldyYXBwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzLklBYnN0cmFjdEZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzLklBYnN0cmFjdEZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuSUZpbGVXcmFwcGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlcy5JRm9sZGVyV3JhcHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIGltcGxlbWVudHMgSVByb2plY3RMaXN0ZW5lciwgSUZvbGRlckxpc3RlbmVyLCBJRmlsZUxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJlc291cmNlTWFuYWdlciBzVGhpcyA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTsKLQotICAgIC8qKiBMaXN0IG9mIHRoZSBxdWFsaWZpZXIgb2JqZWN0IGhlbHBpbmcgZm9yIHRoZSBwYXJzaW5nIG9mIGZvbGRlciBuYW1lcyAqLwotICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VRdWFsaWZpZXJbXSBtUXVhbGlmaWVyczsKLQotICAgIC8qKgotICAgICAqIE1hcCBhc3NvY2lhdGluZyBwcm9qZWN0IHJlc291cmNlIHdpdGggcHJvamVjdCBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJUHJvamVjdCwgUHJvamVjdFJlc291cmNlcz4gbU1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPElQcm9qZWN0LCBQcm9qZWN0UmVzb3VyY2VzPigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgcmVzb3VyY2UgbWFuYWdlciB3aXRoIHRoZSBnbG9iYWwgcmVzb3VyY2UgbW9uaXRvci4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBUaGUgZ2xvYmFsIHJlc291cmNlIG1vbml0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoUmVzb3VyY2VNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgbW9uaXRvci5hZGRQcm9qZWN0TGlzdGVuZXIoc1RoaXMpOwotICAgICAgICBpbnQgbWFzayA9IElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0gICAgICAgIG1vbml0b3IuYWRkRm9sZGVyTGlzdGVuZXIoc1RoaXMsIG1hc2spOwotICAgICAgICBtb25pdG9yLmFkZEZpbGVMaXN0ZW5lcihzVGhpcywgbWFzayk7Ci0KLSAgICAgICAgQ29tcGlsZWRSZXNvdXJjZXNNb25pdG9yLnNldHVwTW9uaXRvcihtb25pdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgb2YgYSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0Ci0gICAgICogQHJldHVybiBhIFByb2plY3RSZXNvdXJjZXMgb2JqZWN0IG9yIG51bGwgaWYgbm9uZSB3YXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RSZXNvdXJjZXMgZ2V0UHJvamVjdFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBtTWFwLmdldChwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgZm9sZGVyIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZvbGRlckNoYW5nZWQoSUZvbGRlciBmb2xkZXIsIGludCBraW5kKSB7Ci0gICAgICAgIFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzOwotCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmb2xkZXIuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoQW5kcm9pZENvbnN0YW50cy5OQVRVUkUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNhbid0IGdldCB0aGUgcHJvamVjdCBuYXR1cmU/IHJldHVybiEKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLSAgICAgICAgICAgICAgICAvLyBjaGVja3MgaWYgdGhlIGZvbGRlciBpcyB1bmRlciByZXMuCi0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCi0gICAgICAgICAgICAgICAgLy8gdGhlIHBhdGggd2lsbCBiZSBwcm9qZWN0L3Jlcy88c29tZXRoaW5nPgotICAgICAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5SZXNGb2xkZXIocGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCBhbmQgaXRzIHJlc291cmNlIG9iamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG1NYXAuZ2V0KHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB3ZSBjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBuZXcgUHJvamVjdFJlc291cmNlcyhmYWxzZSAvKiBpc0ZyYW1ld29ya1JlcG9zaXRvcnkgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXAucHV0KHByb2plY3QsIHJlc291cmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGb2xkZXIobmV3IElGb2xkZXJXcmFwcGVyKGZvbGRlciksIHJlc291cmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbU1hcC5nZXQoZm9sZGVyLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyIHJlc0ZvbGRlciA9IHJlc291cmNlcy5nZXRSZXNvdXJjZUZvbGRlcihmb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc0ZvbGRlci50b3VjaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG1NYXAuZ2V0KGZvbGRlci5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIGdldCB0aGUgZm9sZGVyIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlIHR5cGUgPSBSZXNvdXJjZUZvbGRlclR5cGUuZ2V0Rm9sZGVyVHlwZShmb2xkZXIuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMucmVtb3ZlRm9sZGVyKHR5cGUsIGZvbGRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIFNlbnQgd2hlbiBhIGZpbGUgY2hhbmdlZC4gRGVwZW5kaW5nIG9uIHRoZSBmaWxlIGJlaW5nIGNoYW5nZWQsIGFuZCB0aGUgdHlwZSBvZiBjaGFuZ2UgKEFEREVELAotICAgICAqIFJFTU9WRUQsIENIQU5HRUQpLCB0aGUgZmlsZSBjaGFuZ2UgaXMgcHJvY2Vzc2VkIHRvIHVwZGF0ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBtYXJrZXJEZWx0YXMgVGhlIG1hcmtlciBkZWx0YXMgZm9yIHRoZSBmaWxlLgotICAgICAqIEBwYXJhbSBraW5kIFRoZSBjaGFuZ2Uga2luZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICAgICoge0BsaW5rIElSZXNvdXJjZURlbHRhI2FjY2VwdChJUmVzb3VyY2VEZWx0YVZpc2l0b3IpfQotICAgICAqCi0gICAgICogQHNlZSBJRmlsZUxpc3RlbmVyI2ZpbGVDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzLCBpbnQga2luZCkgewotICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHJlc291cmNlczsKLQotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY2FuJ3QgZ2V0IHRoZSBwcm9qZWN0IG5hdHVyZT8gcmV0dXJuIQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotICAgICAgICAgICAgICAgIC8vIGNoZWNrcyBpZiB0aGUgZmlsZSBpcyB1bmRlciByZXMvc29tZXRoaW5nLgotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0luUmVzRm9sZGVyKHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgYW5kIGl0cyByZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG1NYXAuZ2V0KHByb2plY3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlciAmJiByZXNvdXJjZXMgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgZm9sZGVyID0gcmVzb3VyY2VzLmdldFJlc291cmNlRm9sZGVyKChJRm9sZGVyKWNvbnRhaW5lcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUobmV3IElGaWxlV3JhcHBlcihmaWxlKSwgZm9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBSZXNvdXJjZUZpbGUKLSAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBtTWFwLmdldChwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gcmVzb3VyY2VzLmdldFJlc291cmNlRm9sZGVyKChJRm9sZGVyKWNvbnRhaW5lcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgZGVsZXRlIG9uIHRoZSBmb2xkZXIgYmVmb3JlIHRoZSBmaWxlLCBzbyBpdCBpcyBwb3NzaWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFzc29jaWF0ZWQgUmVzb3VyY2VGb2xkZXIgZG9lc24ndCBleGlzdCBhbnltb3JlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc0ZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZUZpbGUsIGFuZCB0b3VjaCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZpbGUgcmVzRmlsZSA9IHJlc0ZvbGRlci5nZXRGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzRmlsZS50b3VjaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIFJlc291cmNlRmlsZQotICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG1NYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlciByZXNGb2xkZXIgPSByZXNvdXJjZXMuZ2V0UmVzb3VyY2VGb2xkZXIoKElGb2xkZXIpY29udGFpbmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZ2V0IHRoZSBkZWxldGUgb24gdGhlIGZvbGRlciBiZWZvcmUgdGhlIGZpbGUsIHNvIGl0IGlzIHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXNzb2NpYXRlZCBSZXNvdXJjZUZvbGRlciBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNGb2xkZXIucmVtb3ZlRmlsZShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBtTWFwLnJlbW92ZShwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0RGVsZXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIG1NYXAucmVtb3ZlKHByb2plY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2plY3RPcGVuZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBjcmVhdGVQcm9qZWN0KHByb2plY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2plY3RPcGVuZWRXaXRoV29ya3NwYWNlKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgY3JlYXRlUHJvamVjdChwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVzb3VyY2VGb2xkZXJ9IGZvciB0aGUgZ2l2ZW4gZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VGb2xkZXIgZ2V0UmVzb3VyY2VGb2xkZXIoSUZpbGUgZmlsZSkgewotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChjb250YWluZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgIElGb2xkZXIgcGFyZW50ID0gKElGb2xkZXIpY29udGFpbmVyOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFByb2plY3RSZXNvdXJjZXMocHJvamVjdCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzLmdldFJlc291cmNlRm9sZGVyKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhbmQgcmV0dXJucyB0aGUgcmVzb3VyY2VzIGZvciBhIGdpdmVuIHtAbGluayBJQW5kcm9pZFRhcmdldH0KLSAgICAgKiBAcGFyYW0gYW5kcm9pZFRhcmdldCB0aGUgdGFyZ2V0IGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgZnJhbWV3b3JrIHJlc291cmNlcwotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0UmVzb3VyY2VzIGxvYWRGcmFtZXdvcmtSZXNvdXJjZXMoSUFuZHJvaWRUYXJnZXQgYW5kcm9pZFRhcmdldCkgewotICAgICAgICBTdHJpbmcgb3NSZXNvdXJjZXNQYXRoID0gYW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlJFU09VUkNFUyk7Ci0KLSAgICAgICAgRmlsZSBmcmFtZXdvcmtSZXMgPSBuZXcgRmlsZShvc1Jlc291cmNlc1BhdGgpOwotICAgICAgICBpZiAoZnJhbWV3b3JrUmVzLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IFByb2plY3RSZXNvdXJjZXModHJ1ZSAvKiBpc0ZyYW1ld29ya1JlcG9zaXRvcnkgKi8pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvYWRSZXNvdXJjZXMocmVzb3VyY2VzLCBmcmFtZXdvcmtSZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgdGVzdCB0aGF0IGZvbGRlcnMgYXJlIGZvbGRlcnMsIGFuZCBmaWxlcyBhcmUgZmlsZXMsIHRoaXMgc2hvdWxkbid0Ci0gICAgICAgICAgICAgICAgLy8gaGFwcGVuLiBXZSBjYW4gaWdub3JlIGl0LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHJlc291cmNlcyBmcm9tIGEgZm9sZGVyLCBhbmQgZmlsbHMgdGhlIGdpdmVuIHtAbGluayBQcm9qZWN0UmVzb3VyY2VzfS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBtb3N0bHkgYSB1dGlsaXR5IG1ldGhvZCB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCB0byBwcm9jZXNzIGFjdHVhbCBFY2xpcHNlIHByb2plY3RzCi0gICAgICogKFRob3NlIGFyZSBsb2FkZWQgd2l0aCB7QGxpbmsgI2NyZWF0ZVByb2plY3QoSVByb2plY3QpfSBmb3IgbmV3IHByb2plY3Qgb3IKLSAgICAgKiB7QGxpbmsgI3Byb2Nlc3NGb2xkZXIoSUFic3RyYWN0Rm9sZGVyLCBQcm9qZWN0UmVzb3VyY2VzKX0gYW5kCi0gICAgICoge0BsaW5rICNwcm9jZXNzRmlsZShJQWJzdHJhY3RGaWxlLCBSZXNvdXJjZUZvbGRlcil9IGZvciBmb2xkZXIvZmlsZSBtb2RpZmljYXRpb25zKTxicj4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHByb2Nlc3MgZmlsZXMvZm9sZGVycyB3aXRoIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgSUFic3RyYWN0RmlsZX0gYW5kCi0gICAgICoge0BsaW5rIElBYnN0cmFjdEZvbGRlcn0gYmFzZWQgb24ge0BsaW5rIEZpbGV9IGluc3RlYWQgb2Yge0BsaW5rIElGaWxlfSBhbmQge0BsaW5rIElGb2xkZXJ9Ci0gICAgICogcmVzcGVjdGl2ZWx5LiBUaGlzIGlzIG5vdCBwcm9wZXIgZm9yIGhhbmRsaW5nIHtAbGluayBJUHJvamVjdH1zLgotICAgICAqIDwvcD4KLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gbG9hZCB0aGUgZnJhbWV3b3JrIHJlc291cmNlcywgb3IgdG8gZG8gbG9hZCBwcm9qZWN0IHJlc291cmNlcyB3aGVuCi0gICAgICogc2V0dGluZyByZW5kZXJpbmcgdGVzdHMuCi0gICAgICoKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHtAbGluayBQcm9qZWN0UmVzb3VyY2VzfSBmaWxlcyB0byBsb2FkLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZQotICAgICAqIGZyYW1ld29yayBmbGFnIGhhcyBiZWVuIHByb3Blcmx5IHNldHVwLiBUaGlzIGlzIGZpbGxlZCB1cCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBmb2xkZXIuCi0gICAgICogQHBhcmFtIGZvbGRlciBUaGUgZm9sZGVyIHRvIHJlYWQgdGhlIHJlc291cmNlcyBmcm9tLiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcmVzb3VyY2UgZm9sZGVyCi0gICAgICogKHJlcy8pCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWRSZXNvdXJjZXMoUHJvamVjdFJlc291cmNlcyByZXNvdXJjZXMsIEZpbGUgZm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlciByZXNGb2xkZXIgPSBwcm9jZXNzRm9sZGVyKG5ldyBGb2xkZXJXcmFwcGVyKGZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXNGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgcHJvY2VzcyB0aGUgY29udGVudCBvZiB0aGUgZm9sZGVyCi0gICAgICAgICAgICAgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChGaWxlIGNoaWxkUmVzIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJlcy5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKG5ldyBGaWxlV3JhcHBlcihjaGlsZFJlcyksIHJlc0ZvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgbG9hZGVkIHRoZSBmaWxlcywgd2UgbmVlZCB0byBmb3JjZSBsb2FkIHRoZSByZXNvdXJjZXMgZnJvbSB0aGVtCi0gICAgICAgIHJlc291cmNlcy5sb2FkQWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbCBwcm9qZWN0IHBhcnNpbmcgdG8gZ2F0aGVyIHJlc291cmNlIGluZm8uCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIGlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBjYW4ndCBjaGVjayB0aGUgbmF0dXJlIG9mIHRoZSBwcm9qZWN0PyBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJRm9sZGVyIHJlc291cmNlRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUyk7Ci0KLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdFJlc291cmNlcyA9IG1NYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgaWYgKHByb2plY3RSZXNvdXJjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2plY3RSZXNvdXJjZXMgPSBuZXcgUHJvamVjdFJlc291cmNlcyhmYWxzZSAvKiBpc0ZyYW1ld29ya1JlcG9zaXRvcnkgKi8pOwotICAgICAgICAgICAgICAgIG1NYXAucHV0KHByb2plY3QsIHByb2plY3RSZXNvdXJjZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VGb2xkZXIgIT0gbnVsbCAmJiByZXNvdXJjZUZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJlc291cmNlRm9sZGVyLm1lbWJlcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXMgOiByZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlciByZXNGb2xkZXIgPSBwcm9jZXNzRm9sZGVyKG5ldyBJRm9sZGVyV3JhcHBlcihmb2xkZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlc291cmNlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIHByb2Nlc3MgdGhlIGNvbnRlbnQgb2YgdGhlIGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSBmaWxlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgZmlsZVJlcyA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKWZpbGVSZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShuZXcgSUZpbGVXcmFwcGVyKGZpbGUpLCByZXNGb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyBpZiB0aGUgcHJvamVjdCBpcyBjbG9zZWQgb3IgaWYgdGhlIGZvbGRlciBkb2Vzbid0IGV4aXN0LgotICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhbHJlYWR5IHRlc3QgZm9yIHRoYXQsIHdlIGNhbiBpZ25vcmUgdGhpcyBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufSBtYXRjaGluZyB0aGUgZm9sZGVyIHNlZ21lbnRzLgotICAgICAqIEBwYXJhbSBmb2xkZXJTZWdtZW50cyBUaGUgc2VnbWVudHMgb2YgdGhlIGZvbGRlciBuYW1lLiBUaGUgZmlyc3Qgc2VnbWVudHMgc2hvdWxkIGNvbnRhaW4KLSAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyCi0gICAgICogQHJldHVybiBhIEZvbGRlckNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBudWxsIGlmIHRoZSBmb2xkZXIgbmFtZSBpc24ndCB2YWxpZC4uCi0gICAgICovCi0gICAgcHVibGljIEZvbGRlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzKSB7Ci0gICAgICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gbG9vcCB0aHJvdWdoIHRoZSBzZWdtZW50cywgYW5kIG1hdGNoIHRoZW0gd2l0aCB0aGUgZmlyc3QKLSAgICAgICAgLy8gYXZhaWxhYmxlIHF1YWxpZmllci4gSWYgdGhlIHNlZ21lbnQgZG9lc24ndCBtYXRjaCB3ZSB0cnkgd2l0aCB0aGUgbmV4dCBxdWFsaWZpZXIuCi0gICAgICAgIC8vIEJlY2F1c2UgdGhlIG9yZGVyIG9mIHRoZSBxdWFsaWZpZXIgaXMgZml4ZWQsIHdlIGRvIG5vdCByZXNldCB0aGUgZmlyc3QgcXVhbGlmaWVyCi0gICAgICAgIC8vIGFmdGVyIGVhY2ggc3VjZXNzZnVsIHNlZ21lbnQuCi0gICAgICAgIC8vIElmIHdlIHJ1biBvdXQgb2YgcXVhbGlmaWVyIGJlZm9yZSBwcm9jZXNzaW5nIGFsbCB0aGUgc2VnbWVudHMsIHdlIGZhaWwuCi0KLSAgICAgICAgaW50IHF1YWxpZmllckluZGV4ID0gMDsKLSAgICAgICAgaW50IHF1YWxpZmllckNvdW50ID0gbVF1YWxpZmllcnMubGVuZ3RoOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxIDsgaSA8IGZvbGRlclNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VnID0gZm9sZGVyU2VnbWVudHNbaV07Ci0gICAgICAgICAgICBpZiAoc2VnLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChxdWFsaWZpZXJJbmRleCA8IHF1YWxpZmllckNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtUXVhbGlmaWVyc1txdWFsaWZpZXJJbmRleF0uY2hlY2tBbmRTZXQoc2VnLCBjb25maWcpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpZmllckluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBxdWFsaWZpZXIgd2UgZGlkbid0IGZpbmQgYSBtYXRjaGluZyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllckluZGV4ID09IHF1YWxpZmllckNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgZm9sZGVyIGFuZCBhZGRzIGl0IHRvIHRoZSBsaXN0IG9mIHRoZSBwcm9qZWN0IHJlc291cmNlcy4KLSAgICAgKiBAcGFyYW0gZm9sZGVyIHRoZSBmb2xkZXIgdG8gcHJvY2VzcwotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBmb2xkZXIncyBwcm9qZWN0LgotICAgICAqIEByZXR1cm4gdGhlIENvbmZpZ3VyZWRGb2xkZXIgY3JlYXRlZCBmcm9tIHRoaXMgZm9sZGVyLCBvciBudWxsIGlmIHRoZSBwcm9jZXNzIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFJlc291cmNlRm9sZGVyIHByb2Nlc3NGb2xkZXIoSUFic3RyYWN0Rm9sZGVyIGZvbGRlciwgUHJvamVjdFJlc291cmNlcyBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIHNwbGl0IHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgaW4gc2VnbWVudHMuCi0gICAgICAgIFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzID0gZm9sZGVyLmdldE5hbWUoKS5zcGxpdChGb2xkZXJDb25maWd1cmF0aW9uLlFVQUxJRklFUl9TRVApOwotCi0gICAgICAgIC8vIGdldCB0aGUgZW51bSBmb3IgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICAgIFJlc291cmNlRm9sZGVyVHlwZSB0eXBlID0gUmVzb3VyY2VGb2xkZXJUeXBlLmdldFR5cGVCeU5hbWUoZm9sZGVyU2VnbWVudHNbMF0pOwotCi0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgZm9sZGVyIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZyhmb2xkZXJTZWdtZW50cyk7Ci0KLSAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyIGNvbmZpZ3VyZWRGb2xkZXIgPSBwcm9qZWN0LmFkZCh0eXBlLCBjb25maWcsIGZvbGRlcik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJlZEZvbGRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIGZpbGUgYW5kIGFkZHMgaXQgdG8gaXRzIHBhcmVudCBmb2xkZXIgcmVzb3VyY2UuCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiBAcGFyYW0gZm9sZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWxlKElBYnN0cmFjdEZpbGUgZmlsZSwgUmVzb3VyY2VGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiB0aGUgZm9sZGVyCi0gICAgICAgIFJlc291cmNlRm9sZGVyVHlwZSB0eXBlID0gZm9sZGVyLmdldFR5cGUoKTsKLQotICAgICAgICAvLyBsb29rIGZvciB0aGlzIGZpbGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotICAgICAgICBSZXNvdXJjZUZpbGUgcmVzRmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGUpOwotCi0gICAgICAgIGlmIChyZXNGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWRhdGUgdGhlIGZpbGUKLSAgICAgICAgICAgIHJlc0ZpbGUudG91Y2goKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFJlc291cmNlRmlsZSBmb3IgaXQuCi0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoYXQncyBhIHNpbmdsZSBvciBtdWx0aSByZXNvdXJjZSB0eXBlIGZvbGRlci4gRm9yIG5vdyB3ZSBkZWZpbmUgdGhpcyBieQotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBwb3NzaWJsZSByZXNvdXJjZSB0eXBlIG91dHB1dCBieSBmaWxlcyBpbiB0aGUgZm9sZGVyLiBUaGlzIGRvZXMKLSAgICAgICAgICAgIC8vIG5vdCBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2V2ZXJhbCByZXNvdXJjZSB0eXBlcyBmcm9tIGEgc2luZ2xlIGZpbGUgb3IKLSAgICAgICAgICAgIC8vIHRoZSBhYmlsaXR5IHRvIGhhdmUgMiBmaWxlcyBpbiB0aGUgc2FtZSBmb2xkZXIgZ2VuZXJhdGluZyAyIGRpZmZlcmVudCB0eXBlcyBvZgotICAgICAgICAgICAgLy8gcmVzb3VyY2UuIFRoZSBmb3JtZXIgaXMgaGFuZGxlZCBieSBNdWx0aVJlc291cmNlRmlsZSBwcm9wZXJseSB3aGlsZSB3ZSBkb24ndAotICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBsYXR0ZXIuIElmIHdlIHdlcmUgdG8gYWRkIHRoaXMgYmVoYXZpb3Igd2UnZCBoYXZlIHRvIGNoYW5nZSB0aGlzIGNhbGwuCi0gICAgICAgICAgICBSZXNvdXJjZVR5cGVbXSB0eXBlcyA9IEZvbGRlclR5cGVSZWxhdGlvbnNoaXAuZ2V0UmVsYXRlZFJlc291cmNlVHlwZXModHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIHJlc0ZpbGUgPSBuZXcgU2luZ2xlUmVzb3VyY2VGaWxlKGZpbGUsIGZvbGRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc0ZpbGUgPSBuZXcgTXVsdGlSZXNvdXJjZUZpbGUoZmlsZSwgZm9sZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBmb2xkZXIKLSAgICAgICAgICAgIGZvbGRlci5hZGRGaWxlKHJlc0ZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIGlzIHVuZGVyIC9wcm9qZWN0L3Jlcy8KLSAgICAgKiBAcGFyYW0gcGF0aCBhIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXRoIGlzIHVuZGVyIC9wcm9qZWN0IHJlcy8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJblJlc0ZvbGRlcihJUGF0aCBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBTZGtDb25zdGFudHMuRkRfUkVTT1VSQ0VTLmVxdWFsc0lnbm9yZUNhc2UocGF0aC5zZWdtZW50KDEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIGRlc2lnbi4KLSAgICAgKi8KLSAgICBSZXNvdXJjZU1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXJzLgotICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICBkZWZhdWx0Q29uZmlnLmNyZWF0ZURlZmF1bHQoKTsKLSAgICAgICAgbVF1YWxpZmllcnMgPSBkZWZhdWx0Q29uZmlnLmdldFF1YWxpZmllcnMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VNb25pdG9yLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvUmVzb3VyY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YjIzZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1Jlc291cmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQmFzZVByb2plY3RIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlc291cmNlIE1vbml0b3IgZm9yIHRoZSB3aG9sZSBlZGl0b3IgcGx1Z2luLiBPdGhlciwgbW9yZSBzaW1wbGUsIGxpc3RlbmVycyBjYW4gcmVnaXN0ZXIgdG8KLSAqIHRoYXQgb25lLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNb25pdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VNb25pdG9yIHNUaGlzID0gbmV3IFJlc291cmNlTW9uaXRvcigpOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIG1ldGhvZCB0aGF0IGRlYWxzCi0gICAgICogd2l0aCBmaWxlIGNoYW5nZSBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJRmlsZUxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhIGZpbGUgY2hhbmdlZC4KLSAgICAgICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCBjaGFuZ2VkLgotICAgICAgICAgKiBAcGFyYW0gbWFya2VyRGVsdGFzIFRoZSBtYXJrZXIgZGVsdGFzIGZvciB0aGUgZmlsZS4KLSAgICAgICAgICogQHBhcmFtIGtpbmQgVGhlIGNoYW5nZSBraW5kLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICoge0BsaW5rIElSZXNvdXJjZURlbHRhI2FjY2VwdChJUmVzb3VyY2VEZWx0YVZpc2l0b3IpfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzLCBpbnQga2luZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgbWV0aG9kcyBkZWFsaW5nIHdpdGggcHJvamVjdCBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJUHJvamVjdExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgZm9yIGVhY2ggb3BlbmVkIGFuZHJvaWQgcHJvamVjdCBhdCB0aGUgdGltZSB0aGUgbGlzdGVuZXIgaXMgcHV0IGluIHBsYWNlLgotICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgb3BlbmVkIHByb2plY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwcm9qZWN0T3BlbmVkV2l0aFdvcmtzcGFjZShJUHJvamVjdCBwcm9qZWN0KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhIHByb2plY3QgaXMgb3BlbmVkLgotICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBiZWluZyBvcGVuZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwcm9qZWN0T3BlbmVkKElQcm9qZWN0IHByb2plY3QpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIGEgcHJvamVjdCBpcyBjbG9zZWQuCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGJlaW5nIGNsb3NlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoSVByb2plY3QgcHJvamVjdCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBwcm9qZWN0IGlzIGRlbGV0ZWQuCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGFib3V0IHRvIGJlIGRlbGV0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwcm9qZWN0RGVsZXRlZChJUHJvamVjdCBwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBwcm92aWRlIGEgbWV0aG9kIHRoYXQgZGVhbHMKLSAgICAgKiB3aXRoIGZvbGRlciBjaGFuZ2UgZXZlbnRzCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJRm9sZGVyTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogU2VudCB3aGVuIGEgZm9sZGVyIGNoYW5nZWQuCi0gICAgICAgICAqIEBwYXJhbSBmb2xkZXIgVGhlIGZpbGUgdGhhdCB3YXMgY2hhbmdlZAotICAgICAgICAgKiBAcGFyYW0ga2luZCBUaGUgY2hhbmdlIGtpbmQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB7QGxpbmsgSVJlc291cmNlRGVsdGEjZ2V0S2luZCgpfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZm9sZGVyQ2hhbmdlZChJRm9sZGVyIGZvbGRlciwgaW50IGtpbmQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIGEgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbiByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgc3RhcnRzIGFuZCBlbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlRXZlbnRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlRXZlbnRTdGFydCgpOwotICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZUV2ZW50RW5kKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEJhc2UgbGlzdGVuZXIgYnVuZGxlIHRvIGFzc29jaWF0ZSBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IG1hc2suCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdGVuZXJCdW5kbGUgewotICAgICAgICAvKiogTWFzayB2YWx1ZSB0byBhY2NlcHQgYWxsIGV2ZW50cyAqLwotICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNQVNLX05PTkUgPSAtMTsgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEV2ZW50IG1hc2suIFZhbHVlcyBhY2NlcHRlZCBhcmUgSVJlc291cmNlRGVsdGEuIyMjCi0gICAgICAgICAqIEBzZWUgSVJlc291cmNlRGVsdGEjQURERUQKLSAgICAgICAgICogQHNlZSBJUmVzb3VyY2VEZWx0YSNSRU1PVkVECi0gICAgICAgICAqIEBzZWUgSVJlc291cmNlRGVsdGEjQ0hBTkdFRAotICAgICAgICAgKiBAc2VlIElSZXNvdXJjZURlbHRhI0FEREVEX1BIQU5UT00KLSAgICAgICAgICogQHNlZSBJUmVzb3VyY2VEZWx0YSNSRU1PVkVEX1BIQU5UT00KLSAgICAgICAgICogKi8KLSAgICAgICAgaW50IGtpbmRNYXNrOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMaXN0ZW5lciBidW5kbGUgZm9yIGZpbGUgZXZlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUxpc3RlbmVyQnVuZGxlIGV4dGVuZHMgTGlzdGVuZXJCdW5kbGUgewotCi0gICAgICAgIC8qKiBUaGUgZmlsZSBsaXN0ZW5lciAqLwotICAgICAgICBJRmlsZUxpc3RlbmVyIGxpc3RlbmVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMaXN0ZW5lciBidW5kbGUgZm9yIGZvbGRlciBldmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGb2xkZXJMaXN0ZW5lckJ1bmRsZSBleHRlbmRzIExpc3RlbmVyQnVuZGxlIHsKLSAgICAgICAgLyoqIFRoZSBmaWxlIGxpc3RlbmVyICovCi0gICAgICAgIElGb2xkZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RmlsZUxpc3RlbmVyQnVuZGxlPiBtRmlsZUxpc3RlbmVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8RmlsZUxpc3RlbmVyQnVuZGxlPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Rm9sZGVyTGlzdGVuZXJCdW5kbGU+IG1Gb2xkZXJMaXN0ZW5lcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PEZvbGRlckxpc3RlbmVyQnVuZGxlPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SVByb2plY3RMaXN0ZW5lcj4gbVByb2plY3RMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0TGlzdGVuZXI+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SVJlc291cmNlRXZlbnRMaXN0ZW5lcj4gbUV2ZW50TGlzdGVuZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxJUmVzb3VyY2VFdmVudExpc3RlbmVyPigpOwotICAgIAotICAgIHByaXZhdGUgSVdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgLyoqCi0gICAgICogRGVsdGEgdmlzaXRvciBmb3IgcmVzb3VyY2UgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIGludCB0eXBlID0gci5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRklMRSkgewotICAgICAgICAgICAgICAgIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotICAgICAgICAgICAgICAgIGZvciAoRmlsZUxpc3RlbmVyQnVuZGxlIGJ1bmRsZSA6IG1GaWxlTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUua2luZE1hc2sgPT0gTGlzdGVuZXJCdW5kbGUuTUFTS19OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGJ1bmRsZS5raW5kTWFzayAmIGtpbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5saXN0ZW5lci5maWxlQ2hhbmdlZCgoSUZpbGUpciwgZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCksIGtpbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0gICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICAgICAgZm9yIChGb2xkZXJMaXN0ZW5lckJ1bmRsZSBidW5kbGUgOiBtRm9sZGVyTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUua2luZE1hc2sgPT0gTGlzdGVuZXJCdW5kbGUuTUFTS19OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGJ1bmRsZS5raW5kTWFzayAmIGtpbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5saXN0ZW5lci5mb2xkZXJDaGFuZ2VkKChJRm9sZGVyKXIsIGtpbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5PUEVOKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9qZWN0IGlzIG9wZW5pbmcgb3IgY2xvc2luZy4KLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClyOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUHJvamVjdExpc3RlbmVyIHBsIDogbVByb2plY3RMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbC5wcm9qZWN0T3BlbmVkKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElQcm9qZWN0TGlzdGVuZXIgcGwgOiBtUHJvamVjdExpc3RlbmVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLnByb2plY3RDbG9zZWQocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VNb25pdG9yIGdldE1vbml0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIHJlc291cmNlIG1vbml0b3JpbmcuCi0gICAgICogQHBhcmFtIHdzIFRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBtb25pdG9yIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlTW9uaXRvciBzdGFydE1vbml0b3JpbmcoSVdvcmtzcGFjZSB3cykgewotICAgICAgICBpZiAoc1RoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzVGhpcywKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKTsKLSAgICAgICAgICAgIHNUaGlzLm1Xb3Jrc3BhY2UgPSB3czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgdGhlIHJlc291cmNlIG1vbml0b3JpbmcuCi0gICAgICogQHBhcmFtIHdzIFRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RvcE1vbml0b3JpbmcoSVdvcmtzcGFjZSB3cykgewotICAgICAgICBpZiAoc1RoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgd3MucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzVGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNUaGlzLm1GaWxlTGlzdGVuZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICBzVGhpcy5tUHJvamVjdExpc3RlbmVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZpbGUgbGlzdGVuZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBldmVudHMuCi0gICAgICogQHBhcmFtIGtpbmRNYXNrIFRoZSBldmVudCBtYXNrIHRvIGZpbHRlciBvdXQgc3BlY2lmaWMgZXZlbnRzLgotICAgICAqIHtAbGluayBMaXN0ZW5lckJ1bmRsZSNNQVNLX05PTkV9IHdpbGwgZm9yd2FyZCBhbGwgZXZlbnRzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRmlsZUxpc3RlbmVyKElGaWxlTGlzdGVuZXIgbGlzdGVuZXIsIGludCBraW5kTWFzaykgewotICAgICAgICBGaWxlTGlzdGVuZXJCdW5kbGUgYnVuZGxlID0gbmV3IEZpbGVMaXN0ZW5lckJ1bmRsZSgpOwotICAgICAgICBidW5kbGUubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgYnVuZGxlLmtpbmRNYXNrID0ga2luZE1hc2s7Ci0gICAgICAgIAotICAgICAgICBtRmlsZUxpc3RlbmVycy5hZGQoYnVuZGxlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBmaWxlIGxpc3RlbmVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVGaWxlTGlzdGVuZXIoSUZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtRmlsZUxpc3RlbmVycy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGVMaXN0ZW5lckJ1bmRsZSBidW5kbGUgPSBtRmlsZUxpc3RlbmVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlLmxpc3RlbmVyID09IGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVMaXN0ZW5lcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBmb2xkZXIgbGlzdGVuZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBldmVudHMuCi0gICAgICogQHBhcmFtIGtpbmRNYXNrIFRoZSBldmVudCBtYXNrIHRvIGZpbHRlciBvdXQgc3BlY2lmaWMgZXZlbnRzLgotICAgICAqIHtAbGluayBMaXN0ZW5lckJ1bmRsZSNNQVNLX05PTkV9IHdpbGwgZm9yd2FyZCBhbGwgZXZlbnRzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRm9sZGVyTGlzdGVuZXIoSUZvbGRlckxpc3RlbmVyIGxpc3RlbmVyLCBpbnQga2luZE1hc2spIHsKLSAgICAgICAgRm9sZGVyTGlzdGVuZXJCdW5kbGUgYnVuZGxlID0gbmV3IEZvbGRlckxpc3RlbmVyQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBidW5kbGUua2luZE1hc2sgPSBraW5kTWFzazsKLSAgICAgICAgCi0gICAgICAgIG1Gb2xkZXJMaXN0ZW5lcnMuYWRkKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBmb2xkZXIgbGlzdGVuZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUZvbGRlckxpc3RlbmVyKElGb2xkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtRm9sZGVyTGlzdGVuZXJzLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgRm9sZGVyTGlzdGVuZXJCdW5kbGUgYnVuZGxlID0gbUZvbGRlckxpc3RlbmVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlLmxpc3RlbmVyID09IGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgbUZvbGRlckxpc3RlbmVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHByb2plY3QgbGlzdGVuZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb2plY3RMaXN0ZW5lcihJUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1Qcm9qZWN0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIG9wZW5lZCBwcm9qZWN0cyBhbmQgZ2l2ZSB0aGVtIHRvIHRoZSBsaXN0ZW5lci4KLQotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2Ygb3BlbmVkIGFuZHJvaWQgcHJvamVjdHMuCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBtV29ya3NwYWNlLmdldFJvb3QoKTsKLSAgICAgICAgSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlUm9vdCk7Ci0gICAgICAgIElKYXZhUHJvamVjdFtdIGFuZHJvaWRQcm9qZWN0cyA9IEJhc2VQcm9qZWN0SGVscGVyLmdldEFuZHJvaWRQcm9qZWN0cyhqYXZhTW9kZWwpOwotCi0gICAgICAgIGZvciAoSUphdmFQcm9qZWN0IGFuZHJvaWRQcm9qZWN0IDogYW5kcm9pZFByb2plY3RzKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5wcm9qZWN0T3BlbmVkV2l0aFdvcmtzcGFjZShhbmRyb2lkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gZXhpc3RpbmcgcHJvamVjdCBsaXN0ZW5lci4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvamVjdExpc3RlbmVyKElQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVByb2plY3RMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc291cmNlIGV2ZW50IGxpc3RlbmVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgZXZlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZXNvdXJjZUV2ZW50TGlzdGVuZXIoSVJlc291cmNlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtRXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGV4aXN0aW5nIFJlc291cmNlIEV2ZW50IGxpc3RlbmVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUV2ZW50TGlzdGVuZXIoSVJlc291cmNlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtRXZlbnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAvLyBub3RpZnkgdGhlIGV2ZW50IGxpc3RlbmVycyBvZiBhIHN0YXJ0LgotICAgICAgICBmb3IgKElSZXNvdXJjZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBtRXZlbnRMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLnJlc291cmNlQ2hhbmdlRXZlbnRTdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpIHsKLSAgICAgICAgICAgIC8vIGEgcHJvamVjdCBpcyBiZWluZyBkZWxldGVkLiBMZXRzIGdldCB0aGUgcHJvamVjdCBvYmplY3QgYW5kIHJlbW92ZQotICAgICAgICAgICAgLy8gaXRzIGNvbXBpbGVkIHJlc291cmNlIGxpc3QuCi0gICAgICAgICAgICBJUmVzb3VyY2UgciA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gci5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotICAgICAgICAgICAgZm9yIChJUHJvamVjdExpc3RlbmVyIHBsIDogbVByb2plY3RMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICBwbC5wcm9qZWN0RGVsZXRlZChwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgYSByZWd1bGFyIHJlc291cmNlIGNoYW5nZS4gV2UgZ2V0IHRoZSBkZWx0YSBhbmQgZ28gdGhyb3VnaCBpdCB3aXRoIGEgdmlzaXRvci4KLSAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRGVsdGFWaXNpdG9yKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UncmUgZG9uZSwgbm90aWZ5IHRoZSBldmVudCBsaXN0ZW5lcnMuCi0gICAgICAgIGZvciAoSVJlc291cmNlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IG1FdmVudExpc3RlbmVycykgewotICAgICAgICAgICAgbGlzdGVuZXIucmVzb3VyY2VDaGFuZ2VFdmVudEVuZCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1NpbmdsZVJlc291cmNlRmlsZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL1NpbmdsZVJlc291cmNlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTAwNTAwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9TaW5nbGVSZXNvdXJjZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlcy5JQWJzdHJhY3RGaWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVJlc291cmNlVmFsdWU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLnV0aWxzLkRlbnNpdHlCYXNlZFJlc291cmNlVmFsdWU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLnV0aWxzLlJlc291cmNlVmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcmVzb3VyY2UgZmlsZSBkZXNjcmliaW5nIGEgc2luZ2xlIHJlc291cmNlLgotICogPHAvPgotICogVGhpcyBpcyB0eXBpY2FsbHkgYW4gWE1MIGZpbGUgaW5zaWRlIHJlcy9hbmltLCByZXMvbGF5b3V0LCBvciByZXMvbWVudSBvciBhbiBpbWFnZSBmaWxlCi0gKiB1bmRlciByZXMvZHJhd2FibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVSZXNvdXJjZUZpbGUgZXh0ZW5kcyBSZXNvdXJjZUZpbGUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBzUGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBzdGF0aWMgewotICAgICAgICBzUGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIHNYbWxQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeKC4rKVxcLnhtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuW10gc0RyYXdhYmxlUGF0dGVybiA9IG5ldyBQYXR0ZXJuW10gewotICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIl4oLispXFwuOVxcLnBuZyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgUGF0dGVybi5jb21waWxlKCJeKC4rKVxcLnBuZyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgUGF0dGVybi5jb21waWxlKCJeKC4rKVxcLmpwZyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgUGF0dGVybi5jb21waWxlKCJeKC4rKVxcLmdpZiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksIC8vJE5PTi1OTFMtMSQKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlc291cmNlTmFtZTsKLSAgICBwcml2YXRlIFJlc291cmNlVHlwZSBtVHlwZTsKLSAgICBwcml2YXRlIElSZXNvdXJjZVZhbHVlIG1WYWx1ZTsKLQotICAgIHB1YmxpYyBTaW5nbGVSZXNvdXJjZUZpbGUoSUFic3RyYWN0RmlsZSBmaWxlLCBSZXNvdXJjZUZvbGRlciBmb2xkZXIpIHsKLSAgICAgICAgc3VwZXIoZmlsZSwgZm9sZGVyKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBmb2xkZXIgdHlwZS4KLSAgICAgICAgLy8gVGhpcyBpcyBlYXN5IHNpbmNlIHRoaXMgaXMgYSBzaW5nbGUgUmVzb3VyY2UgZmlsZS4KLSAgICAgICAgUmVzb3VyY2VUeXBlW10gdHlwZXMgPSBGb2xkZXJUeXBlUmVsYXRpb25zaGlwLmdldFJlbGF0ZWRSZXNvdXJjZVR5cGVzKGZvbGRlci5nZXRUeXBlKCkpOwotICAgICAgICBtVHlwZSA9IHR5cGVzWzBdOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgICAgbVJlc291cmNlTmFtZSA9IGdldFJlc291cmNlTmFtZShtVHlwZSk7Ci0KLSAgICAgICAgLy8gdGVzdCBpZiB0aGVyZSdzIGEgZGVuc2l0eSBxdWFsaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZQotICAgICAgICBQaXhlbERlbnNpdHlRdWFsaWZpZXIgcXVhbGlmaWVyID0gZm9sZGVyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIoKTsKLQotICAgICAgICBpZiAocXVhbGlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1WYWx1ZSA9IG5ldyBSZXNvdXJjZVZhbHVlKG1UeXBlLmdldE5hbWUoKSwgZ2V0UmVzb3VyY2VOYW1lKG1UeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRPc0xvY2F0aW9uKCksIGlzRnJhbWV3b3JrKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVZhbHVlID0gbmV3IERlbnNpdHlCYXNlZFJlc291cmNlVmFsdWUobVR5cGUuZ2V0TmFtZSgpLCBnZXRSZXNvdXJjZU5hbWUobVR5cGUpLAotICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE9zTG9jYXRpb24oKSwgcXVhbGlmaWVyLmdldFZhbHVlKCkuZ2V0RGVuc2l0eSgpLCBpc0ZyYW1ld29yaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZVR5cGVbXSBnZXRSZXNvdXJjZVR5cGVzKCkgewotICAgICAgICByZXR1cm4gRm9sZGVyVHlwZVJlbGF0aW9uc2hpcC5nZXRSZWxhdGVkUmVzb3VyY2VUeXBlcyhnZXRGb2xkZXIoKS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gRm9sZGVyVHlwZVJlbGF0aW9uc2hpcC5tYXRjaCh0eXBlLCBnZXRGb2xkZXIoKS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFByb2plY3RSZXNvdXJjZUl0ZW0+IGdldFJlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSwKLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdFJlc291cmNlcykgewotCi0gICAgICAgIC8vIGxvb2tpbmcgZm9yIGFuIGV4aXN0aW5nIFJlc291cmNlSXRlbSB3aXRoIHRoaXMgbmFtZSBhbmQgdHlwZQotICAgICAgICBQcm9qZWN0UmVzb3VyY2VJdGVtIGl0ZW0gPSBwcm9qZWN0UmVzb3VyY2VzLmZpbmRSZXNvdXJjZUl0ZW0odHlwZSwgbVJlc291cmNlTmFtZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFByb2plY3RSZXNvdXJjZUl0ZW0+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxQcm9qZWN0UmVzb3VyY2VJdGVtPigpOwotCi0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW0gPSBuZXcgQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtKG1SZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgaXRlbXMuYWRkKGl0ZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHRoaXMgUmVzb3VyY2VGaWxlIHRvIHRoZSBSZXNvdXJjZUl0ZW0KLSAgICAgICAgaXRlbS5hZGQodGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZUZpbGUjZ2V0VmFsdWUoY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLnJlc291cmNlcy5SZXNvdXJjZVR5cGUsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICoKLSAgICAgKiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgdHlwZSBvciBuYW1lIHNpbmNlIGEKLSAgICAgKiBTaW5nbGVSZXNvdXJjZUZpbGUgcmVwcmVzZW50cyBhIGZpbGUgZ2VuZXJhdGluZyBvbmx5IG9uZSByZXNvdXJjZS4KLSAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGZ1bGwgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBpbiBPUyBmb3JtLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUmVzb3VyY2VWYWx1ZSBnZXRWYWx1ZShSZXNvdXJjZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKFJlc291cmNlVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBmcm9tIHRoZSBmaWxlbmFtZS4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRGaWxlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICh0eXBlID09IFJlc291cmNlVHlwZS5BTklNIHx8IHR5cGUgPT0gUmVzb3VyY2VUeXBlLkxBWU9VVCB8fCB0eXBlID09IFJlc291cmNlVHlwZS5NRU5VIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBSZXNvdXJjZVR5cGUuQ09MT1IgfHwgdHlwZSA9PSBSZXNvdXJjZVR5cGUuWE1MKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG0gPSBzWG1sUGF0dGVybi5tYXRjaGVyKG5hbWUpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBSZXNvdXJjZVR5cGUuRFJBV0FCTEUpIHsKLSAgICAgICAgICAgIGZvciAoUGF0dGVybiBwIDogc0RyYXdhYmxlUGF0dGVybikgewotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhbHNvIHRyeSB0aGUgWG1sIHBhdHRlcm4gZm9yIHNlbGVjdG9yL3NoYXBlIGJhc2VkIGRyYXdhYmxlLgotICAgICAgICAgICAgTWF0Y2hlciBtID0gc1htbFBhdHRlcm4ubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtLmdyb3VwKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9GaWxlV3JhcHBlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0ZpbGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTUyOTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0ZpbGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFic3RyYWN0RmlsZX0gb24gdG9wIG9mIGEge0BsaW5rIEZpbGV9IG9iamVjdC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlV3JhcHBlciBpbXBsZW1lbnRzIElBYnN0cmFjdEZpbGUgewotICAgIAotICAgIHByaXZhdGUgRmlsZSBtRmlsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmlsZVdyYXBwZXJ9IG9iamVjdC4gSWYge0BsaW5rIEZpbGUjaXNGaWxlKCl9IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogdGhlbiBhbiB7QGxpbmsgSU9FeGNlcHRpb259IGlzIHRocm93bi4gCi0gICAgICovCi0gICAgcHVibGljIEZpbGVXcmFwcGVyKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmlsZVdyYXBwZXIgbXVzdCB3cmFwIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGV4aXN0aW5nIGZpbGUhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbUZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKG1GaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBudWxsIGJlbG93LgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZpbGUgZ2V0SUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3NMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZpbGVXcmFwcGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZpbGUuZXF1YWxzKCgoRmlsZVdyYXBwZXIpb2JqKS5tRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBGaWxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZpbGUuZXF1YWxzKG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtRmlsZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9Gb2xkZXJXcmFwcGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvRm9sZGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk2MTY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9Gb2xkZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFic3RyYWN0Rm9sZGVyfSBvbiB0b3Agb2YgYSB7QGxpbmsgRmlsZX0gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRm9sZGVyV3JhcHBlciBpbXBsZW1lbnRzIElBYnN0cmFjdEZvbGRlciB7Ci0KLSAgICBwcml2YXRlIEZpbGUgbUZvbGRlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmlsZVdyYXBwZXJ9IG9iamVjdC4gSWYge0BsaW5rIEZpbGUjaXNEaXJlY3RvcnkoKX0gcmV0dXJucwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGVuIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9sZGVyV3JhcHBlcihGaWxlIGZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZvbGRlci5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGVXcmFwcGVyIG11c3Qgd3JhcCBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBleGlzdGluZyBmb2xkZXIhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbUZvbGRlciA9IGZvbGRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmlsZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUZvbGRlci5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElGb2xkZXIgZ2V0SUZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbGRlcldyYXBwZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9sZGVyLmVxdWFscygoKEZvbGRlcldyYXBwZXIpb2JqKS5tRm9sZGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9sZGVyLmVxdWFscyhvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbUZvbGRlci5oYXNoQ29kZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0lBYnN0cmFjdEZpbGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9JQWJzdHJhY3RGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWRlNWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0lBYnN0cmFjdEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgZmlsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQWJzdHJhY3RGaWxlIGV4dGVuZHMgSUFic3RyYWN0UmVzb3VyY2UgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IG9iamVjdCBvbiB0aGUgZmlsZSBjb250ZW50LgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBPUyBwYXRoIG9mIHRoZSBmaWxlIGxvY2F0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBnZXRPc0xvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUZpbGV9IG9iamVjdCB0aGF0IHRoZSByZWNlaXZlciBjb3VsZCByZXByZXNlbnQuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIElGaWxlIGdldElGaWxlKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUFic3RyYWN0Rm9sZGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUFic3RyYWN0Rm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTdhZTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0lBYnN0cmFjdEZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotCi0vKioKLSAqICBBIGZvbGRlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQWJzdHJhY3RGb2xkZXIgZXh0ZW5kcyBJQWJzdHJhY3RSZXNvdXJjZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIGEgZmlsZSB3aXRoIGEgZ2l2ZW4gbmFtZSAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gVGhpcyBpcyB0aGUgbmFtZSB3aXRob3V0IHRoZSBwYXRoIGxlYWRpbmcgdG8gdGhlCi0gICAgICogcGFyZW50IGZvbGRlci4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0ZpbGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGb2xkZXJ9IG9iamVjdCB0aGF0IHRoZSByZWNlaXZlciBjb3VsZCByZXByZXNlbnQuCi0gICAgICogQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgSUZvbGRlciBnZXRJRm9sZGVyKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUFic3RyYWN0UmVzb3VyY2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9JQWJzdHJhY3RSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmYzMzhhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9yZXNvdXJjZXMvbWFuYWdlci9maWxlcy9JQWJzdHJhY3RSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBCYXNlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gcmVzb3VyY2UuPHAvPgotICogVGhpcyBzb21ld2hhdCBsaW1pdGVkIGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBsZXQgY2xhc3NlcyB1c2UgZmlsZS1zeXN0ZW0gcmVzb3VyY2VzLCB3aXRob3V0Ci0gKiBoYXZpbmcgdGhlIG1hbnVhbGx5IGhhbmRsZSAge0BsaW5rIElGaWxlfSBhbmQvb3Ige0BsaW5rIEZpbGV9IG1hbnVhbGx5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBYnN0cmFjdFJlc291cmNlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUZpbGVXcmFwcGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUZpbGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWQzNmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0lGaWxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBYnN0cmFjdEZpbGV9IG9uIHRvcCBvZiBhbiB7QGxpbmsgSUZpbGV9IG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIElGaWxlV3JhcHBlciBpbXBsZW1lbnRzIElBYnN0cmFjdEZpbGUgewotCi0gICAgcHJpdmF0ZSBJRmlsZSBtRmlsZTsKLQotICAgIHB1YmxpYyBJRmlsZVdyYXBwZXIoSUZpbGUgZmlsZSkgewotICAgICAgICBtRmlsZSA9IGZpbGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPc0xvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbUZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUZpbGUuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRJRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGVXcmFwcGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZpbGUuZXF1YWxzKCgoSUZpbGVXcmFwcGVyKW9iaikubUZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtRmlsZS5lcXVhbHMob2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9tYW5hZ2VyL2ZpbGVzL0lGb2xkZXJXcmFwcGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUZvbGRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyZmVjZC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL21hbmFnZXIvZmlsZXMvSUZvbGRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBYnN0cmFjdEZvbGRlcn0gb24gdG9wIG9mIGFuIHtAbGluayBJRm9sZGVyfSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBJRm9sZGVyV3JhcHBlciBpbXBsZW1lbnRzIElBYnN0cmFjdEZvbGRlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBJRm9sZGVyIG1Gb2xkZXI7Ci0KLSAgICBwdWJsaWMgSUZvbGRlcldyYXBwZXIoSUZvbGRlciBmb2xkZXIpIHsKLSAgICAgICAgbUZvbGRlciA9IGZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRm9sZGVyLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2VbXSBmaWxlcyA9IG1Gb2xkZXIubWVtYmVycygpOwotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd2UnbGwgcmV0dXJuIGZhbHNlIGJlbG93LgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZvbGRlciBnZXRJRm9sZGVyKCkgewotICAgICAgICByZXR1cm4gbUZvbGRlcjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGb2xkZXJXcmFwcGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvbGRlci5lcXVhbHMoKChJRm9sZGVyV3JhcHBlcilvYmopLm1Gb2xkZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgcmV0dXJuIG1Gb2xkZXIuZXF1YWxzKG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtRm9sZGVyLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9BbmRyb2lkSmFyTG9hZGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRKYXJMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3ZDE0YS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRKYXJMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBsb2FkZXIgYWJsZSB0byBsb2FkIGEgY2xhc3MgZnJvbSB0aGUgU0RLIGphciBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZEphckxvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIGltcGxlbWVudHMgSUFuZHJvaWRDbGFzc0xvYWRlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JhcHBlciBhcm91bmQgYSB7QGxpbmsgQ2xhc3N9IHRvIHByb3ZpZGUgdGhlIG1ldGhvZHMgb2YKLSAgICAgKiB7QGxpbmsgSUFuZHJvaWRDbGFzc0xvYWRlci5JQ2xhc3NEZXNjcmlwdG9yfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIENsYXNzV3JhcHBlciBpbXBsZW1lbnRzIElDbGFzc0Rlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIENsYXNzPD8+IG1DbGFzczsKLQotICAgICAgICBwdWJsaWMgQ2xhc3NXcmFwcGVyKENsYXNzPD8+IGNsYXp6KSB7Ci0gICAgICAgICAgICBtQ2xhc3MgPSBjbGF6ejsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElDbGFzc0Rlc2NyaXB0b3JbXSBnZXREZWNsYXJlZENsYXNzZXMoKSB7Ci0gICAgICAgICAgICBDbGFzczw/PltdIGNsYXNzZXMgPSBtQ2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCk7Ci0gICAgICAgICAgICBJQ2xhc3NEZXNjcmlwdG9yW10gaWNsYXNzZXMgPSBuZXcgSUNsYXNzRGVzY3JpcHRvcltjbGFzc2VzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjbGFzc2VzLmxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgICAgIGljbGFzc2VzW2ldID0gbmV3IENsYXNzV3JhcHBlcihjbGFzc2VzW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGljbGFzc2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElDbGFzc0Rlc2NyaXB0b3IgZ2V0RW5jbG9zaW5nQ2xhc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzV3JhcHBlcihtQ2xhc3MuZ2V0RW5jbG9zaW5nQ2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJQ2xhc3NEZXNjcmlwdG9yIGdldFN1cGVyY2xhc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzV3JhcHBlcihtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgY2xhenopIHsKLSAgICAgICAgICAgIGlmIChjbGF6eiBpbnN0YW5jZW9mIENsYXNzV3JhcHBlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ2xhc3MuZXF1YWxzKCgoQ2xhc3NXcmFwcGVyKWNsYXp6KS5tQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DbGFzcy5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luc3RhbnRpYWJsZSgpIHsKLSAgICAgICAgICAgIGludCBtb2RpZmllcnMgPSBtQ2xhc3MuZ2V0TW9kaWZpZXJzKCk7Ci0gICAgICAgICAgICByZXR1cm4gTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpID09IGZhbHNlICYmIE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykgPT0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbGFzczw/PiB3cmFwcGVkQ2xhc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsYXNzOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU9zRnJhbWV3b3JrTG9jYXRpb247Ci0gICAgCi0gICAgLyoqIEEgY2FjaGUgZm9yIGJpbmFyeSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSB6aXAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBieXRlW10+IG1FbnRyeUNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBieXRlW10+KCk7Ci0gICAgLyoqIEEgY2FjaGUgZm9yIGFscmVhZHkgZGVmaW5lZCBDbGFzc2VzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4gPiBtQ2xhc3NDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4gPigpOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNsYXNzIGxvYWRlciBieSBwcm92aWRpbmcgdGhlIG9zIHBhdGggdG8gdGhlIGZyYW1ld29yayBqYXIgYXJjaGl2ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBvc0ZyYW1ld29ya0xvY2F0aW9uIE9TIFBhdGggb2YgdGhlIGZyYW1ld29yayBKQVIgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkSmFyTG9hZGVyKFN0cmluZyBvc0ZyYW1ld29ya0xvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Pc0ZyYW1ld29ya0xvY2F0aW9uID0gb3NGcmFtZXdvcmtMb2NhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT3NGcmFtZXdvcmtMb2NhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJlLWxvYWRzIGFsbCBjbGFzcyBiaW5hcnkgZGF0YSB0aGF0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gcGFja2FnZSBieSByZWFkaW5nIHRoZSBhcmNoaXZlCi0gICAgICogb25jZSBhbmQgY2FjaGluZyB0aGVtIGludGVybmFsbHkuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgcHJlbG9hZCAiY2xhc3NlcyIsIGl0IGp1c3QgcmVhZHMgdGhlIHVuemlwcGVkIGJ5dGVzIGZvciBhIGdpdmVuCi0gICAgICogY2xhc3MuIFRvIG9idGFpbiBhIGNsYXNzLCBvbmUgbXVzdCBjYWxsIHtAbGluayAjZmluZENsYXNzKFN0cmluZyl9IGxhdGVyLgotICAgICAqIDxwLz4KLSAgICAgKiBBbGwgY2xhc3NlcyB3aGljaCBwYWNrYWdlIG5hbWUgc3RhcnRzIHdpdGggInBhY2thZ2VGaWx0ZXIiIHdpbGwgYmUgaW5jbHVkZWQgYW5kIGNhbiBiZQotICAgICAqIGZvdW5kIGxhdGVyLgotICAgICAqIDxwLz4KLSAgICAgKiBNYXkgdGhyb3cgc29tZSBleGNlcHRpb25zIGlmIHRoZSBmcmFtZXdvcmsgSkFSIGNhbm5vdCBiZSByZWFkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrYWdlRmlsdGVyIFRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBjbGFzcyBkYXRhIHRvIHByZWxvYWQsIHVzaW5nIGEgZnVsbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGJpbmFyeSBuYW1lICguZS5nICJjb20ubXkucGFja2FnZS4iKS4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobQotICAgICAqICAgICAgICAgICAgICAgICAgICBpcyBzaW1wbGUgInN0YXJ0c1dpdGgiLiBVc2UgYW4gZW1wdHkgc3RyaW5nIHRvIGluY2x1ZGUgZXZlcnl0aGluZy4KLSAgICAgKiBAcGFyYW0gdGFza0xhYmVsIEFuIG9wdGlvbmFsIHRhc2sgbmFtZSBmb3IgdGhlIHN1YiBtb25pdG9yLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IuIENhbiBiZSBudWxsLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZG9uZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVMb2FkQ2xhc3NlcyhTdHJpbmcgcGFja2FnZUZpbHRlciwgU3RyaW5nIHRhc2tMYWJlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiwgQ2xhc3NGb3JtYXRFcnJvciB7Ci0gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFja2FnZSBuYW1lIGludG8gYSB6aXAgZW50cnkgcGF0aAotICAgICAgICBTdHJpbmcgcGF0aEZpbHRlciA9IHBhY2thZ2VGaWx0ZXIucmVwbGFjZUFsbCgiXFwuIiwgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAotICAgICAgICBTdWJNb25pdG9yIHByb2dyZXNzID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHRhc2tMYWJlbCA9PSBudWxsID8gIiIgOiB0YXNrTGFiZWwsIDEwMCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgc3RyZWFtcyB0byByZWFkIHRoZSBpbnRlcm1lZGlhcnkgYXJjaGl2ZQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtT3NGcmFtZXdvcmtMb2NhdGlvbik7Ci0gICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaXMpOwotICAgICAgICBaaXBFbnRyeSBlbnRyeTsgICAgICAgCi0gICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgZW50cnkuCi0gICAgICAgICAgICBTdHJpbmcgZW50cnlQYXRoID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5lbmRzV2l0aChBbmRyb2lkQ29uc3RhbnRzLkRPVF9DTEFTUykpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFjY2VwdCBjbGFzcyBmaWxlcwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBwYWNrYWdlIHRvIHByZWxvYWQKLSAgICAgICAgICAgIGlmIChwYXRoRmlsdGVyLmxlbmd0aCgpID4gMCAmJiAhZW50cnlQYXRoLnN0YXJ0c1dpdGgocGF0aEZpbHRlcikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbnRyeVBhdGhUb0NsYXNzTmFtZShlbnRyeVBhdGgpOwotCi0gICAgICAgICAgICBpZiAoIW1FbnRyeUNhY2hlLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IGVudHJ5LmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnlTaXplID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IHJlYWRaaXBEYXRhKHppcywgKGludCllbnRyeVNpemUpOwotICAgICAgICAgICAgICAgIG1FbnRyeUNhY2hlLnB1dChjbGFzc05hbWUsIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZHZhbmNlIDUlIG9mIHdoYXRldmVyIGlzIGFsbG9jYXRlZCBvbiB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICBwcm9ncmVzcy5zZXRXb3JrUmVtYWluaW5nKDEwMCk7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoNSk7Ci0gICAgICAgICAgICBwcm9ncmVzcy5zdWJUYXNrKFN0cmluZy5mb3JtYXQoIlByZWxvYWQgJTEkcyIsIGNsYXNzTmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYW5kIGxvYWRzIGFsbCBjbGFzc2VzIHRoYXQgZGVyaXZlIGZyb20gYSBnaXZlbiBzZXQgb2Ygc3VwZXIgY2xhc3Nlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogQXMgYSBzaWRlLWVmZmVjdCB0aGlzIHdpbGwgbG9hZCBhbmQgY2FjaGUgbW9zdCwgaWYgbm90IGFsbCwgY2xhc3NlcyBpbiB0aGUgaW5wdXQgSkFSIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2thZ2VGaWx0ZXIgQmFzZSBuYW1lIG9mIHBhY2thZ2Ugb2YgY2xhc3NlcyB0byBmaW5kLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gZmluZCBldmVyeXRpbmcuCi0gICAgICogQHBhcmFtIHN1cGVyQ2xhc3NlcyBUaGUgc3VwZXIgY2xhc3NlcyBvZiBhbGwgdGhlIGNsYXNzZXMgdG8gZmluZC4gCi0gICAgICogQHJldHVybiBBbiBoYXNoIG1hcCB3aGljaCBrZXlzIGFyZSB0aGUgc3VwZXIgY2xhc3NlcyBsb29rZWQgZm9yIGFuZCB3aGljaCB2YWx1ZXMgYXJlCi0gICAgICogICAgICAgICBBcnJheUxpc3Qgb2YgdGhlIGNsYXNzZXMgZm91bmQuIFRoZSBhcnJheSBsaXN0cyBhcmUgYWx3YXlzIGNyZWF0ZWQgZm9yIGFsbCB0aGUKLSAgICAgKiAgICAgICAgIHZhbGlkIGtleXMsIHRoZXkgYXJlIHNpbXBseSBlbXB0eSBpZiBubyBkZXJpdmluZyBjbGFzcyBpcyBmb3VuZCBmb3IgYSBnaXZlbgotICAgICAqICAgICAgICAgc3VwZXIgY2xhc3MuIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+PiBmaW5kQ2xhc3Nlc0Rlcml2aW5nRnJvbSgKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlRmlsdGVyLAotICAgICAgICAgICAgU3RyaW5nW10gc3VwZXJDbGFzc2VzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24sIENsYXNzRm9ybWF0RXJyb3IgewotCi0gICAgICAgIHBhY2thZ2VGaWx0ZXIgPSBwYWNrYWdlRmlsdGVyLnJlcGxhY2VBbGwoIlxcLiIsICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+IG1DbGFzc2VzRm91bmQgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+PigpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN1cGVyQ2xhc3NlcykgewotICAgICAgICAgICAgbUNsYXNzZXNGb3VuZC5wdXQoY2xhc3NOYW1lLCBuZXcgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHN0cmVhbXMgdG8gcmVhZCB0aGUgaW50ZXJtZWRpYXJ5IGFyY2hpdmUKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obU9zRnJhbWV3b3JrTG9jYXRpb24pOwotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oZmlzKTsKLSAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgZW50cnkgYW5kIGNvbnZlcnQgdG8gYSBjbGFzcyBiaW5hcnkgbmFtZQotICAgICAgICAgICAgU3RyaW5nIGVudHJ5UGF0aCA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmICghZW50cnlQYXRoLmVuZHNXaXRoKEFuZHJvaWRDb25zdGFudHMuRE9UX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgYWNjZXB0IGNsYXNzIGZpbGVzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFja2FnZUZpbHRlci5sZW5ndGgoKSA+IDAgJiYgIWVudHJ5UGF0aC5zdGFydHNXaXRoKHBhY2thZ2VGaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhY2NlcHQgc3R1ZmYgZnJvbSB0aGUgcmVxdWVzdGVkIHJvb3QgcGFja2FnZS4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbnRyeVBhdGhUb0NsYXNzTmFtZShlbnRyeVBhdGgpOwotICAgICAgCi0gICAgICAgICAgICBDbGFzczw/PiBsb2FkZWRfY2xhc3MgPSBtQ2xhc3NDYWNoZS5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChsb2FkZWRfY2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbUVudHJ5Q2FjaGUuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeyAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjbGFzcyBhbmQgY2FjaGUgaXQKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBlbnRyeVNpemUgPSBlbnRyeS5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeVNpemUgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZWFkWmlwRGF0YSh6aXMsIChpbnQpZW50cnlTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9hZGVkX2NsYXNzID0gZGVmaW5lQW5kQ2FjaGVDbGFzcyhjbGFzc05hbWUsIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKENsYXNzPD8+IHN1cGVyQ2xhc3MgPSBsb2FkZWRfY2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlck5hbWUgPSBzdXBlckNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobUNsYXNzZXNGb3VuZC5jb250YWluc0tleShzdXBlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGFzc2VzRm91bmQuZ2V0KHN1cGVyTmFtZSkuYWRkKG5ldyBDbGFzc1dyYXBwZXIobG9hZGVkX2NsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtQ2xhc3Nlc0ZvdW5kOwotICAgIH0KLQotICAgIC8qKiBIZWxwZXIgbWV0aG9kIHRoYXQgY29udmVydHMgYSBaaXAgZW50cnkgcGF0aCBpbnRvIGEgY29ycmVzcG9uZGluZwotICAgICAqICBKYXZhIGZ1bGwgcXVhbGlmaWVkIGJpbmFyeSBjbGFzcyBuYW1lLgotICAgICAqICA8cC8+Ci0gICAgICogIEYuZXgsIHRoaXMgY29udmVydHMgImNvbS9teS9wYWNrYWdlL0Zvby5jbGFzcyIgaW50byAiY29tLm15LnBhY2thZ2UuRm9vIi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbnRyeVBhdGhUb0NsYXNzTmFtZShTdHJpbmcgZW50cnlQYXRoKSB7Ci0gICAgICAgIHJldHVybiBlbnRyeVBhdGgucmVwbGFjZUZpcnN0KCJcXC5jbGFzcyQiLCAiIikucmVwbGFjZUFsbCgiWy9cXFxcXSIsICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBiaW5hcnkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENsYXNzPD8+IGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGNsYXNzIGluIHRoZSBjYWNoZQotICAgICAgICAgICAgQ2xhc3M8Pz4gY2FjaGVkX2NsYXNzID0gbUNsYXNzQ2FjaGUuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKGNhY2hlZF9jbGFzcyA9PSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IHdlIGNhbid0IGZpbmQgdGhpcyBjbGFzcywgZG9uJ3QgdHJ5IGFnYWluCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZF9jbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZF9jbGFzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBsb29rIGl0IHVwIGFuZCBjYWNoZSBpdAotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBsb2FkQ2xhc3NEYXRhKG5hbWUpOwotICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVBbmRDYWNoZUNsYXNzKG5hbWUsIGRhdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2xhc3MgY2FuJ3QgYmUgZm91bmQsIHJlY29yZCBhIENORkUgY2xhc3MgaW4gdGhlIG1hcCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHJlbG9hZCBpdCBuZXh0IHRpbWUKLSAgICAgICAgICAgICAgICBtQ2xhc3NDYWNoZS5wdXQobmFtZSwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIGEgY2xhc3MgYmFzZWQgb24gaXRzIGJpbmFyeSBkYXRhIGFuZCBjYWNoZXMgdGhlIHJlc3VsdGluZyBjbGFzcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIGJpbmFyeSBuYW1lIG9mIHRoZSBjbGFzcyAoaS5lLiBwYWNrYWdlLmNsYXNzMSRjbGFzczIpCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIGJpbmFyeSBkYXRhIGZyb20gdGhlIGxvYWRlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBkZWZpbmVkCi0gICAgICogQHRocm93cyBDbGFzc0Zvcm1hdEVycm9yIGlmIGRlZmluZUNsYXNzIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzPD8+IGRlZmluZUFuZENhY2hlQ2xhc3MoU3RyaW5nIG5hbWUsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvciB7Ci0gICAgICAgIENsYXNzPD8+IGNhY2hlZF9jbGFzczsKLSAgICAgICAgY2FjaGVkX2NsYXNzID0gZGVmaW5lQ2xhc3MobnVsbCwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCi0gICAgICAgIGlmIChjYWNoZWRfY2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQWRkIG5ldyBjbGFzcyB0byB0aGUgY2FjaGUgY2xhc3MgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSB6aXAgZW50cnkgZGF0YSBjYWNoZQotICAgICAgICAgICAgbUNsYXNzQ2FjaGUucHV0KG5hbWUsIGNhY2hlZF9jbGFzcyk7Ci0gICAgICAgICAgICBtRW50cnlDYWNoZS5yZW1vdmUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZF9jbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBjbGFzcyBkYXRhIGZyb20gaXRzIGJpbmFyeSBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHVzZXMgdGhlIGNsYXNzIGJpbmFyeSBkYXRhIHRoYXQgaGFzIGJlZW4gcHJlbG9hZGVkIGVhcmxpZXIgYnkgdGhlIHByZUxvYWRDbGFzc2VzKCkKLSAgICAgKiBtZXRob2QgaWYgcG9zc2libGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgYmluYXJ5IG5hbWUKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgY2xhc3MgZGF0YSBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgICAqIEB0aHJvd3MgSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYnl0ZVtdIGxvYWRDbGFzc0RhdGEoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBieXRlW10gZGF0YSA9IG1FbnRyeUNhY2hlLmdldChjbGFzc05hbWUpOwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVGhlIG5hbWUgaXMgYSBiaW5hcnkgbmFtZS4gU29tZXRoaW5nIGxpa2UgImFuZHJvaWQuUiIsIG9yICJhbmRyb2lkLlIkaWQiLgotICAgICAgICAvLyBNYWtlIGEgcGF0aCBvdXQgb2YgaXQuCi0gICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiXFwuIiwgIi8iKSArIEFuZHJvaWRDb25zdGFudHMuRE9UX0NMQVNTOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgIC8vIGNyZWF0ZSBzdHJlYW1zIHRvIHJlYWQgdGhlIGludGVybWVkaWFyeSBhcmNoaXZlCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1Pc0ZyYW1ld29ya0xvY2F0aW9uKTsKLSAgICAgICAgWmlwSW5wdXRTdHJlYW0gemlzID0gbmV3IFppcElucHV0U3RyZWFtKGZpcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBsb29wIG9uIHRoZSBlbnRyaWVzIG9mIHRoZSBpbnRlcm1lZGlhcnkgcGFja2FnZSBhbmQgcHV0IHRoZW0gaW4gdGhlIGZpbmFsIHBhY2thZ2UuCi0gICAgICAgIFppcEVudHJ5IGVudHJ5OwotCi0gICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgZW50cnkuCi0gICAgICAgICAgICBTdHJpbmcgY3VyckVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGN1cnJFbnRyeU5hbWUuZXF1YWxzKGVudHJ5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IGVudHJ5LmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnlTaXplID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRhdGEgPSByZWFkWmlwRGF0YSh6aXMsIChpbnQpZW50cnlTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGRhdGEgZm9yIHRoZSA8ZW0+Y3VycmVudDwvZW0+IGVudHJ5IGZyb20gdGhlIHppcCBpbnB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHppcyBUaGUgWmlwIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBlbnRyeVNpemUgVGhlIGVudHJ5IHNpemUuIC0xIGlmIHVua25vd24uCi0gICAgICogQHJldHVybiBUaGUgbmV3IGRhdGEgZm9yIHRoZSA8ZW0+Y3VycmVudDwvZW0+IGVudHJ5LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgWmlwSW5wdXRTdHJlYW0ucmVhZCgpIGZhaWxzLgotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIHJlYWRaaXBEYXRhKFppcElucHV0U3RyZWFtIHppcywgaW50IGVudHJ5U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGJsb2NrX3NpemUgPSAxMDI0OwotICAgICAgICBpbnQgZGF0YV9zaXplID0gZW50cnlTaXplIDwgMSA/IGJsb2NrX3NpemUgOiBlbnRyeVNpemU7IAotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhX3NpemVdOwotICAgICAgICAKLSAgICAgICAgd2hpbGUoemlzLmF2YWlsYWJsZSgpICE9IDApIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHppcy5yZWFkKGRhdGEsIG9mZnNldCwgZGF0YV9zaXplIC0gb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsgIC8vIHJlYWQgZGF0YSBpcyBkb25lCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY291bnQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbnRyeVNpemUgPj0gMSAmJiBvZmZzZXQgPj0gZW50cnlTaXplKSB7ICAvLyB3ZSBrbm93IHRoZSBzaXplIGFuZCB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGtub3cgdGhlIGVudHJ5IHNpemUgYW5kIHdlJ3JlIG5vdCBkb25lIHJlYWRpbmcsCi0gICAgICAgICAgICAvLyBleHBhbmQgdGhlIGRhdGEgYnVmZmVyIHNvbWUgbW9yZS4KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtkYXRhX3NpemUgKyBibG9ja19zaXplXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHRlbXAsIDAsIGRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZGF0YV9zaXplICs9IGJsb2NrX3NpemU7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSAqPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAob2Zmc2V0IDwgZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAvLyBidWZmZXIgd2FzIGFsbG9jYXRlZCB0b28gbGFyZ2UsIHRyaW0gaXQKLSAgICAgICAgICAgIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbb2Zmc2V0XTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCB0ZW1wLCAwLCBvZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YSA9IHRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgSUFuZHJvaWRDbGFzc0xvYWRlci5JQ2xhc3NEZXNjcmlwdG9yfSBieSBpdHMgZnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJldHVybi4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNsYXNzRGVzY3JpcHRvciBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzV3JhcHBlcihsb2FkQ2xhc3MoY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsgIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRUYXJnZXREYXRhLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRUYXJnZXREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDdjZjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9BbmRyb2lkVGFyZ2V0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLklEZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubGF5b3V0LmRlc2NyaXB0b3JzLkxheW91dERlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0LmRlc2NyaXB0b3JzLkFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnUuZGVzY3JpcHRvcnMuTWVudURlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5kZXNjcmlwdG9ycy5SZXNvdXJjZXNEZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy54bWwuZGVzY3JpcHRvcnMuWG1sRGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5Qcm9qZWN0UmVzb3VyY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSUxheW91dEJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0LklPcHRpb25hbExpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBkYXRhIG9mIGFuIEFuZHJvaWQgVGFyZ2V0IGFzIGxvYWRlZCBmcm9tIHRoZSBTREsuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkVGFyZ2V0RGF0YSB7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERVNDUklQVE9SX01BTklGRVNUID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERVNDUklQVE9SX0xBWU9VVCA9IDI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRPUl9NRU5VID0gMzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERVNDUklQVE9SX1hNTCA9IDQ7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRPUl9SRVNPVVJDRVMgPSA1OwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFU0NSSVBUT1JfU0VBUkNIQUJMRSA9IDY7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRPUl9QUkVGRVJFTkNFUyA9IDc7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVTQ1JJUFRPUl9BUFBXSURHRVRfUFJPVklERVIgPSA4OwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBMYXlvdXRCcmlkZ2UgewotICAgICAgICAvKiogTGluayB0byB0aGUgbGF5b3V0IGJyaWRnZSAqLwotICAgICAgICBwdWJsaWMgSUxheW91dEJyaWRnZSBicmlkZ2U7Ci0KLSAgICAgICAgcHVibGljIExvYWRTdGF0dXMgc3RhdHVzID0gTG9hZFN0YXR1cy5MT0FESU5HOwotCi0gICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgICAgICBwdWJsaWMgaW50IGFwaUxldmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSUFuZHJvaWRUYXJnZXQgbVRhcmdldDsKLQotICAgIHByaXZhdGUgRGV4V3JhcHBlciBtRGV4V3JhcHBlcjsKLQotICAgIC8qKgotICAgICAqIG1BdHRyaWJ1dGVWYWx1ZXMgaXMgYSBtYXAgeyBrZXkgPT4gbGlzdCBbIHZhbHVlcyBdIH0uCi0gICAgICogVGhlIGtleSBmb3IgdGhlIG1hcCBpcyAiKGVsZW1lbnQteG1sLW5hbWUsYXR0cmlidXRlLW5hbWVzcGFjZTphdHRyaWJ1dGUteG1sLWxvY2FsLW5hbWUpIi4KLSAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWVzcGFjZSBwcmVmaXggbXVzdCBiZToKLSAgICAgKiAtICJhbmRyb2lkIiBmb3IgQW5kcm9pZENvbnN0YW50cy5OU19SRVNPVVJDRVMKLSAgICAgKiAtICJ4bWxucyIgZm9yIHRoZSBYTUxOUyBVUkkuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLCBidXQgc3RpbGwgbmVlZCB0byBiZSBwb3B1bGF0ZWQKLSAgICAgKiB3aXRoIHZhbHVlcyBpbiB0aGUgVUkuIFVuaXF1ZWx5IG5hbWVkIGF0dHJpYnV0ZXMgaGF2ZSB0aGVpciB2YWx1ZXMgaW4ge0BsaW5rICNtRW51bVZhbHVlTWFwfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZ1tdPiBtQXR0cmlidXRlVmFsdWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZ1tdPigpOwotCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXBvc2l0b3J5IG1TeXN0ZW1SZXNvdXJjZVJlcG9zaXRvcnk7Ci0KLSAgICBwcml2YXRlIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzIG1NYW5pZmVzdERlc2NyaXB0b3JzOwotICAgIHByaXZhdGUgTGF5b3V0RGVzY3JpcHRvcnMgbUxheW91dERlc2NyaXB0b3JzOwotICAgIHByaXZhdGUgTWVudURlc2NyaXB0b3JzIG1NZW51RGVzY3JpcHRvcnM7Ci0gICAgcHJpdmF0ZSBYbWxEZXNjcmlwdG9ycyBtWG1sRGVzY3JpcHRvcnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBtRW51bVZhbHVlTWFwOwotCi0gICAgcHJpdmF0ZSBQcm9qZWN0UmVzb3VyY2VzIG1GcmFtZXdvcmtSZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBMYXlvdXRCcmlkZ2UgbUxheW91dEJyaWRnZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtTGF5b3V0QnJpZGdlSW5pdCA9IGZhbHNlOwotCi0gICAgQW5kcm9pZFRhcmdldERhdGEoSUFuZHJvaWRUYXJnZXQgYW5kcm9pZFRhcmdldCkgewotICAgICAgICBtVGFyZ2V0ID0gYW5kcm9pZFRhcmdldDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERleFdyYXBwZXIoRGV4V3JhcHBlciB3cmFwcGVyKSB7Ci0gICAgICAgIG1EZXhXcmFwcGVyID0gd3JhcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEFuZHJvaWRUYXJnZXREYXRhIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gcGxhdGZvcm1MaWJyYXJpZXMKLSAgICAgKiBAcGFyYW0gb3B0aW9uYWxMaWJyYXJpZXMKLSAgICAgKi8KLSAgICB2b2lkIHNldEV4dHJhRGF0YShJUmVzb3VyY2VSZXBvc2l0b3J5IHN5c3RlbVJlc291cmNlUmVwb3NpdG9yeSwKLSAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzIG1hbmlmZXN0RGVzY3JpcHRvcnMsCi0gICAgICAgICAgICBMYXlvdXREZXNjcmlwdG9ycyBsYXlvdXREZXNjcmlwdG9ycywKLSAgICAgICAgICAgIE1lbnVEZXNjcmlwdG9ycyBtZW51RGVzY3JpcHRvcnMsCi0gICAgICAgICAgICBYbWxEZXNjcmlwdG9ycyB4bWxEZXNjcmlwdG9ycywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBlbnVtVmFsdWVNYXAsCi0gICAgICAgICAgICBTdHJpbmdbXSBwZXJtaXNzaW9uVmFsdWVzLAotICAgICAgICAgICAgU3RyaW5nW10gYWN0aXZpdHlJbnRlbnRBY3Rpb25WYWx1ZXMsCi0gICAgICAgICAgICBTdHJpbmdbXSBicm9hZGNhc3RJbnRlbnRBY3Rpb25WYWx1ZXMsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZXJ2aWNlSW50ZW50QWN0aW9uVmFsdWVzLAotICAgICAgICAgICAgU3RyaW5nW10gaW50ZW50Q2F0ZWdvcnlWYWx1ZXMsCi0gICAgICAgICAgICBTdHJpbmdbXSBwbGF0Zm9ybUxpYnJhcmllcywKLSAgICAgICAgICAgIElPcHRpb25hbExpYnJhcnlbXSBvcHRpb25hbExpYnJhcmllcywKLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzLAotICAgICAgICAgICAgTGF5b3V0QnJpZGdlIGxheW91dEJyaWRnZSkgewotCi0gICAgICAgIG1TeXN0ZW1SZXNvdXJjZVJlcG9zaXRvcnkgPSBzeXN0ZW1SZXNvdXJjZVJlcG9zaXRvcnk7Ci0gICAgICAgIG1NYW5pZmVzdERlc2NyaXB0b3JzID0gbWFuaWZlc3REZXNjcmlwdG9yczsKLSAgICAgICAgbUxheW91dERlc2NyaXB0b3JzID0gbGF5b3V0RGVzY3JpcHRvcnM7Ci0gICAgICAgIG1NZW51RGVzY3JpcHRvcnMgPSBtZW51RGVzY3JpcHRvcnM7Ci0gICAgICAgIG1YbWxEZXNjcmlwdG9ycyA9IHhtbERlc2NyaXB0b3JzOwotICAgICAgICBtRW51bVZhbHVlTWFwID0gZW51bVZhbHVlTWFwOwotICAgICAgICBtRnJhbWV3b3JrUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotICAgICAgICBtTGF5b3V0QnJpZGdlID0gbGF5b3V0QnJpZGdlOwotCi0gICAgICAgIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25WYWx1ZXMpOwotICAgICAgICBzZXRJbnRlbnRGaWx0ZXJBY3Rpb25zQW5kQ2F0ZWdvcmllcyhhY3Rpdml0eUludGVudEFjdGlvblZhbHVlcywgYnJvYWRjYXN0SW50ZW50QWN0aW9uVmFsdWVzLAotICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnRBY3Rpb25WYWx1ZXMsIGludGVudENhdGVnb3J5VmFsdWVzKTsKLSAgICAgICAgc2V0T3B0aW9uYWxMaWJyYXJpZXMocGxhdGZvcm1MaWJyYXJpZXMsIG9wdGlvbmFsTGlicmFyaWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGV4V3JhcHBlciBnZXREZXhXcmFwcGVyKCkgewotICAgICAgICByZXR1cm4gbURleFdyYXBwZXI7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVJlcG9zaXRvcnkgZ2V0U3lzdGVtUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gbVN5c3RlbVJlc291cmNlUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBJRGVzY3JpcHRvclByb3ZpZGVyfSBmcm9tIGEgZ2l2ZW4gSWQuCi0gICAgICogVGhlIElkIGNhbiBiZSBvbmUgb2Yge0BsaW5rICNERVNDUklQVE9SX01BTklGRVNUfSwge0BsaW5rICNERVNDUklQVE9SX0xBWU9VVH0sCi0gICAgICoge0BsaW5rICNERVNDUklQVE9SX01FTlV9LCBvciB7QGxpbmsgI0RFU0NSSVBUT1JfWE1MfS4KLSAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIHdpbGwgdGhyb3cgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIElEZXNjcmlwdG9yUHJvdmlkZXIgZ2V0RGVzY3JpcHRvclByb3ZpZGVyKGludCBkZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgc3dpdGNoIChkZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIGNhc2UgREVTQ1JJUFRPUl9NQU5JRkVTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1hbmlmZXN0RGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICBjYXNlIERFU0NSSVBUT1JfTEFZT1VUOgotICAgICAgICAgICAgICAgIHJldHVybiBtTGF5b3V0RGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICBjYXNlIERFU0NSSVBUT1JfTUVOVToKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lbnVEZXNjcmlwdG9yczsKLSAgICAgICAgICAgIGNhc2UgREVTQ1JJUFRPUl9YTUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1YbWxEZXNjcmlwdG9yczsKLSAgICAgICAgICAgIGNhc2UgREVTQ1JJUFRPUl9SRVNPVVJDRVM6Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHNpbmNlIGl0J3MgaGFyZC1jb2RlZCB0aGUgUmVzb3VyY2VzIERlc2NyaXB0b3JzIGFyZSBub3QgcGxhdGZvcm0gZGVwZW5kZW50LgotICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNEZXNjcmlwdG9ycy5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgY2FzZSBERVNDUklQVE9SX1BSRUZFUkVOQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBtWG1sRGVzY3JpcHRvcnMuZ2V0UHJlZmVyZW5jZXNQcm92aWRlcigpOwotICAgICAgICAgICAgY2FzZSBERVNDUklQVE9SX0FQUFdJREdFVF9QUk9WSURFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbVhtbERlc2NyaXB0b3JzLmdldEFwcFdpZGdldFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICBjYXNlIERFU0NSSVBUT1JfU0VBUkNIQUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbVhtbERlc2NyaXB0b3JzLmdldFNlYXJjaGFibGVQcm92aWRlcigpOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hbmlmZXN0IGRlc2NyaXB0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBnZXRNYW5pZmVzdERlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gbU1hbmlmZXN0RGVzY3JpcHRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGF5b3V0IERlc2NyaXB0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXREZXNjcmlwdG9ycyBnZXRMYXlvdXREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1MYXlvdXREZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW51IGRlc2NyaXB0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyBNZW51RGVzY3JpcHRvcnMgZ2V0TWVudURlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gbU1lbnVEZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYTUwgZGVzY3JpcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sRGVzY3JpcHRvcnMgZ2V0WG1sRGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBtWG1sRGVzY3JpcHRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGZvciBhbiBYTUwgYXR0cmlidXRlLgotICAgICAqIDxwLz5UaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgYXR0cmlidXRlcyBmb3Igd2hpY2ggcG9zc2libGUgdmFsdWVzIGRlcGVuZCBvbiB0aGUKLSAgICAgKiBwYXJlbnQgZWxlbWVudCBub2RlLgotICAgICAqIDxwLz5Gb3IgYXR0cmlidXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgdmFsdWVzIG5vIG1hdHRlciB0aGUgcGFyZW50IG5vZGUsIHVzZQotICAgICAqIHtAbGluayAjZ2V0RW51bVZhbHVlTWFwKCl9LgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5nIHdpdGggdGhlIHBvc3NpYmxlIHZhbHVlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsdWVzIHdlcmUKLSAgICAgKiBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlVmFsdWVzKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiglMSRzLCUyJHMpIiwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtQXR0cmlidXRlVmFsdWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgYW4gWE1MIGF0dHJpYnV0ZS4KLSAgICAgKiA8cC8+VGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGF0dHJpYnV0ZXMgZm9yIHdoaWNoIHBvc3NpYmxlIHZhbHVlcyBkZXBlbmQgb24gdGhlCi0gICAgICogcGFyZW50IGFuZCBncmVhdC1ncmFuZC1wYXJlbnQgZWxlbWVudCBub2RlLgotICAgICAqIDxwLz5UaGUgdHlwaWNhbCBleGFtcGxlIG9mIHRoaXMgaXMgZm9yIHRoZSAnbmFtZScgYXR0cmlidXRlIHVuZGVyCi0gICAgICogYWN0aXZpdHkvaW50ZW50LWZpbHRlci9hY3Rpb24KLSAgICAgKiA8cC8+Rm9yIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBubyBtYXR0ZXIgdGhlIHBhcmVudCBub2RlLCB1c2UKLSAgICAgKiB7QGxpbmsgI2dldEVudW1WYWx1ZU1hcCgpfS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gZ3JlYXRHcmFuZFBhcmVudEVsZW1lbnROYW1lIHRoZSBncmVhdC1ncmFuZC1wYXJlbnQgbm9kZS4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZyB3aXRoIHRoZSBwb3NzaWJsZSB2YWx1ZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZhbHVlcyB3ZXJlCi0gICAgICogZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIGdyZWF0R3JhbmRQYXJlbnRFbGVtZW50TmFtZSkgewotICAgICAgICBpZiAoZ3JlYXRHcmFuZFBhcmVudEVsZW1lbnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIoJTEkcywlMiRzLCUzJHMpIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBncmVhdEdyYW5kUGFyZW50RWxlbWVudE5hbWUsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG1BdHRyaWJ1dGVWYWx1ZXMuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW51bSB2YWx1ZXMgbWFwLgotICAgICAqIDxwLz5UaGUgbWFwIGRlZmluZXMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgWE1MIGF0dHJpYnV0ZXMuIFRoZSBrZXkgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogYW5kIHRoZSB2YWx1ZSBpcyBhIG1hcCBvZiAoc3RyaW5nLCBpbnRlZ2VyKSBpbiB3aGljaCB0aGUga2V5IChzdHJpbmcpIGlzIHRoZSBuYW1lIG9mCi0gICAgICogdGhlIHZhbHVlLCBhbmQgdGhlIEludGVnZXIgaXMgdGhlIG51bWVyaWNhbCB2YWx1ZSBpbiB0aGUgY29tcGlsZWQgYmluYXJ5IFhNTCBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+IGdldEVudW1WYWx1ZU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1FbnVtVmFsdWVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFByb2plY3RSZXNvdXJjZXN9IGNvbnRhaW5pbmcgdGhlIEZyYW1ld29yayBSZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIFByb2plY3RSZXNvdXJjZXMgZ2V0RnJhbWV3b3JrUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gbUZyYW1ld29ya1Jlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExheW91dEJyaWRnZX0gb2JqZWN0IHBvc3NpYmx5IGNvbnRhaW5pbmcgYSB7QGxpbmsgSUxheW91dEJyaWRnZX0gb2JqZWN0LgotICAgICAqIDxwLz5JZiB7QGxpbmsgTGF5b3V0QnJpZGdlI2JyaWRnZX0gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHtAbGluayBMYXlvdXRCcmlkZ2Ujc3RhdHVzfSB3aWxsCi0gICAgICogY29udGFpbiB0aGUgcmVhc29uIChlaXRoZXIge0BsaW5rIExvYWRTdGF0dXMjTE9BRElOR30gb3Ige0BsaW5rIExvYWRTdGF0dXMjRkFJTEVEfSkuCi0gICAgICogPHAvPlZhbGlkIHtAbGluayBJTGF5b3V0QnJpZGdlfSBvYmplY3RzIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGJlaW5nIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGF5b3V0QnJpZGdlIGdldExheW91dEJyaWRnZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXRCcmlkZ2VJbml0ID09IGZhbHNlICYmIG1MYXlvdXRCcmlkZ2UuYnJpZGdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MYXlvdXRCcmlkZ2UuYnJpZGdlLmluaXQobVRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkZPTlRTKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RW51bVZhbHVlTWFwKCkpOwotICAgICAgICAgICAgbUxheW91dEJyaWRnZUluaXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGF5b3V0QnJpZGdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBlcm1pc3Npb24gdmFsdWVzCi0gICAgICogQHBhcmFtIHBlcm1pc3Npb25WYWx1ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UGVybWlzc2lvbnMoU3RyaW5nW10gcGVybWlzc2lvblZhbHVlcykgewotICAgICAgICBzZXRWYWx1ZXMoIih1c2VzLXBlcm1pc3Npb24sYW5kcm9pZDpuYW1lKSIsIHBlcm1pc3Npb25WYWx1ZXMpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VmFsdWVzKCIoYXBwbGljYXRpb24sYW5kcm9pZDpwZXJtaXNzaW9uKSIsIHBlcm1pc3Npb25WYWx1ZXMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFZhbHVlcygiKGFjdGl2aXR5LGFuZHJvaWQ6cGVybWlzc2lvbikiLCBwZXJtaXNzaW9uVmFsdWVzKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRWYWx1ZXMoIihyZWNlaXZlcixhbmRyb2lkOnBlcm1pc3Npb24pIiwgcGVybWlzc2lvblZhbHVlcyk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VmFsdWVzKCIoc2VydmljZSxhbmRyb2lkOnBlcm1pc3Npb24pIiwgcGVybWlzc2lvblZhbHVlcyk7ICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFZhbHVlcygiKHByb3ZpZGVyLGFuZHJvaWQ6cGVybWlzc2lvbikiLCBwZXJtaXNzaW9uVmFsdWVzKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnRlbnRGaWx0ZXJBY3Rpb25zQW5kQ2F0ZWdvcmllcyhTdHJpbmdbXSBhY3Rpdml0eUludGVudEFjdGlvbnMsCi0gICAgICAgICAgICBTdHJpbmdbXSBicm9hZGNhc3RJbnRlbnRBY3Rpb25zLCBTdHJpbmdbXSBzZXJ2aWNlSW50ZW50QWN0aW9ucywKLSAgICAgICAgICAgIFN0cmluZ1tdIGludGVudENhdGVnb3J5VmFsdWVzKSB7Ci0gICAgICAgIHNldFZhbHVlcygiKGFjdGl2aXR5LGFjdGlvbixhbmRyb2lkOm5hbWUpIiwgYWN0aXZpdHlJbnRlbnRBY3Rpb25zKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VmFsdWVzKCIocmVjZWl2ZXIsYWN0aW9uLGFuZHJvaWQ6bmFtZSkiLCBicm9hZGNhc3RJbnRlbnRBY3Rpb25zKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRWYWx1ZXMoIihzZXJ2aWNlLGFjdGlvbixhbmRyb2lkOm5hbWUpIiwgc2VydmljZUludGVudEFjdGlvbnMpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFZhbHVlcygiKGNhdGVnb3J5LGFuZHJvaWQ6bmFtZSkiLCBpbnRlbnRDYXRlZ29yeVZhbHVlcyk7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxMaWJyYXJpZXMoU3RyaW5nW10gcGxhdGZvcm1MaWJyYXJpZXMsCi0gICAgICAgICAgICBJT3B0aW9uYWxMaWJyYXJ5W10gb3B0aW9uYWxMaWJyYXJpZXMpIHsKLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaWJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaWYgKHBsYXRmb3JtTGlicmFyaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwbGF0Zm9ybUxpYnJhcmllcykgewotICAgICAgICAgICAgICAgIGxpYnMuYWRkKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsTGlicmFyaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9uYWxMaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsaWJzLmFkZChvcHRpb25hbExpYnJhcmllc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldFZhbHVlcygiKHVzZXMtbGlicmFyeSxhbmRyb2lkOm5hbWUpIiwgIGxpYnMudG9BcnJheShuZXcgU3RyaW5nW2xpYnMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSAobmFtZSwgdmFsdWVzKSBwYWlyIGluIHRoZSBoYXNoIG1hcC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBtYXAsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZXMuCi0gICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVzKFN0cmluZyBuYW1lLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgbUF0dHJpYnV0ZVZhbHVlcy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIG1BdHRyaWJ1dGVWYWx1ZXMucHV0KG5hbWUsIHZhbHVlcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9BbmRyb2lkVGFyZ2V0UGFyc2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRUYXJnZXRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5OTEzNy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0FuZHJvaWRUYXJnZXRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5kZXNjcmlwdG9ycy5MYXlvdXREZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tYW5pZmVzdC5kZXNjcmlwdG9ycy5BbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tZW51LmRlc2NyaXB0b3JzLk1lbnVEZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy54bWwuZGVzY3JpcHRvcnMuWG1sRGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5BdHRyc1htbFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuSVJlc291cmNlUmVwb3NpdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlByb2plY3RSZXNvdXJjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhLkxheW91dEJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklMYXlvdXRCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247Ci0KLS8qKgotICogUGFyc2VyIGZvciB0aGUgcGxhdGZvcm0gZGF0YSBpbiBhbiBTREsuCi0gKiA8cC8+Ci0gKiBUaGlzIGdhdGhlciB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotICogPHVsPgotICogPGxpPlJlc291cmNlIElEIGZyb20gPGNvZGU+YW5kcm9pZC5SPC9jb2RlPjwvbGk+Ci0gKiA8bGk+VGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdmFsdWVzIGZyb20gPGNvZGU+YW5kcm9pZC5NYW5pZmVzdCRwZXJtaXNzaW9uPC9jb2RlPjwvbGk+Ci0gKiA8bGk+PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmRyb2lkVGFyZ2V0UGFyc2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRnJhbWV3b3JrIFJlc291cmNlIFBhcnNlciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQW5kcm9pZFRhcmdldCBtQW5kcm9pZFRhcmdldDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwbGF0Zm9ybSBkYXRhIHBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZFRhcmdldFBhcnNlcihJQW5kcm9pZFRhcmdldCBwbGF0Zm9ybVRhcmdldCkgewotICAgICAgICBtQW5kcm9pZFRhcmdldCA9IHBsYXRmb3JtVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZnJhbWV3b3JrLCBjb2xsZWN0cyBhbGwgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyB0aGVtIGluIHRoZQotICAgICAqIHtAbGluayBJQW5kcm9pZFRhcmdldH0gZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLiBDYW4gYmUgbnVsbC4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGRvbmUuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBTREsgcGF0aCB3YXMgdmFsaWQgYW5kIHBhcnNpbmcgaGFzIGJlZW4gYXR0ZW1wdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN1Yk1vbml0b3IgcHJvZ3Jlc3MgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiUGFyc2luZyBTREsgJTEkcyIsIG1BbmRyb2lkVGFyZ2V0LmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIDE0KTsKLQotICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgdGFyZ2V0RGF0YSA9IG5ldyBBbmRyb2lkVGFyZ2V0RGF0YShtQW5kcm9pZFRhcmdldCk7Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgRFguCi0gICAgICAgICAgICBEZXhXcmFwcGVyIGRleFdyYXBwZXIgPSBuZXcgRGV4V3JhcHBlcigpOwotICAgICAgICAgICAgSVN0YXR1cyByZXMgPSBkZXhXcmFwcGVyLmxvYWREZXgobUFuZHJvaWRUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5EWF9KQVIpKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gU3RhdHVzLk9LX1NUQVRVUykgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkeC5qYXIgbG9hZGluZyBmYWlsZWQgZm9yIHRhcmdldCAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5kcm9pZFRhcmdldC5nZXRGdWxsTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGhhdmUgbG9hZGVkIGR4LgotICAgICAgICAgICAgdGFyZ2V0RGF0YS5zZXREZXhXcmFwcGVyKGRleFdyYXBwZXIpOwotICAgICAgICAgICAgcHJvZ3Jlc3Mud29ya2VkKDEpOwotCi0gICAgICAgICAgICAvLyBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotICAgICAgICAgICAgQW5kcm9pZEphckxvYWRlciBjbGFzc0xvYWRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEFuZHJvaWRKYXJMb2FkZXIobUFuZHJvaWRUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5BTkRST0lEX0pBUikpOwotCi0gICAgICAgICAgICBwcmVsb2FkKGNsYXNzTG9hZGVyLCBwcm9ncmVzcy5uZXdDaGlsZCg0MCwgU3ViTW9uaXRvci5TVVBQUkVTU19OT05FKSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2UgSWRzLgotICAgICAgICAgICAgcHJvZ3Jlc3Muc3ViVGFzaygiUmVzb3VyY2UgSURzIik7Ci0gICAgICAgICAgICBJUmVzb3VyY2VSZXBvc2l0b3J5IGZyYW1ld29ya1JlcG9zaXRvcnkgPSBjb2xsZWN0UmVzb3VyY2VJZHMoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgcHJvZ3Jlc3Mud29ya2VkKDEpOwotCi0gICAgICAgICAgICBpZiAocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHBlcm1pc3Npb25zCi0gICAgICAgICAgICBwcm9ncmVzcy5zdWJUYXNrKCJQZXJtaXNzaW9ucyIpOwotICAgICAgICAgICAgU3RyaW5nW10gcGVybWlzc2lvblZhbHVlcyA9IGNvbGxlY3RQZXJtaXNzaW9ucyhjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgYWN0aW9uIGFuZCBjYXRlZ29yeSB2YWx1ZXMgZm9yIHRoZSBJbnRlbnRzLgotICAgICAgICAgICAgcHJvZ3Jlc3Muc3ViVGFzaygiSW50ZW50cyIpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZpdHlfYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYnJvYWRjYXN0X2FjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNlcnZpY2VfYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgY29sbGVjdEludGVudEZpbHRlckFjdGlvbnNBbmRDYXRlZ29yaWVzKGFjdGl2aXR5X2FjdGlvbnMsIGJyb2FkY2FzdF9hY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2FjdGlvbnMsIGNhdGVnb3JpZXMpOwotICAgICAgICAgICAgcHJvZ3Jlc3Mud29ya2VkKDEpOwotCi0gICAgICAgICAgICBpZiAocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnYXRoZXIgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCi0gICAgICAgICAgICBwcm9ncmVzcy5zdWJUYXNrKCJBdHRyaWJ1dGVzIGRlZmluaXRpb25zIik7Ci0gICAgICAgICAgICBBdHRyc1htbFBhcnNlciBhdHRyc1htbFBhcnNlciA9IG5ldyBBdHRyc1htbFBhcnNlcigKLSAgICAgICAgICAgICAgICAgICAgbUFuZHJvaWRUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5BVFRSSUJVVEVTKSk7Ci0gICAgICAgICAgICBhdHRyc1htbFBhcnNlci5wcmVsb2FkKCk7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIHByb2dyZXNzLnN1YlRhc2soIk1hbmlmZXN0IGRlZmluaXRpb25zIik7Ci0gICAgICAgICAgICBBdHRyc1htbFBhcnNlciBhdHRyc01hbmlmZXN0WG1sUGFyc2VyID0gbmV3IEF0dHJzWG1sUGFyc2VyKAotICAgICAgICAgICAgICAgICAgICBtQW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0Lk1BTklGRVNUX0FUVFJJQlVURVMpLAotICAgICAgICAgICAgICAgICAgICBhdHRyc1htbFBhcnNlcik7Ci0gICAgICAgICAgICBhdHRyc01hbmlmZXN0WG1sUGFyc2VyLnByZWxvYWQoKTsKLSAgICAgICAgICAgIHByb2dyZXNzLndvcmtlZCgxKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbjxWaWV3Q2xhc3NJbmZvPiBtYWluTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248Vmlld0NsYXNzSW5mbz4gZ3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxWaWV3Q2xhc3NJbmZvPigpOwotCi0gICAgICAgICAgICAvLyBjb2xsZWN0IHRoZSBsYXlvdXQvd2lkZ2V0cyBjbGFzc2VzCi0gICAgICAgICAgICBwcm9ncmVzcy5zdWJUYXNrKCJXaWRnZXRzIGFuZCBsYXlvdXRzIik7Ci0gICAgICAgICAgICBjb2xsZWN0TGF5b3V0Q2xhc3NlcyhjbGFzc0xvYWRlciwgYXR0cnNYbWxQYXJzZXIsIG1haW5MaXN0LCBncm91cExpc3QsCi0gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLm5ld0NoaWxkKDEpKTsKLQotICAgICAgICAgICAgaWYgKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVmlld0NsYXNzSW5mb1tdIGxheW91dFZpZXdzSW5mbyA9IG1haW5MaXN0LnRvQXJyYXkobmV3IFZpZXdDbGFzc0luZm9bbWFpbkxpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICBWaWV3Q2xhc3NJbmZvW10gbGF5b3V0R3JvdXBzSW5mbyA9IGdyb3VwTGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICBuZXcgVmlld0NsYXNzSW5mb1tncm91cExpc3Quc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHByZWZlcmVuY2VzIGNsYXNzZXMuCi0gICAgICAgICAgICBtYWluTGlzdC5jbGVhcigpOwotICAgICAgICAgICAgZ3JvdXBMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBjb2xsZWN0UHJlZmVyZW5jZUNsYXNzZXMoY2xhc3NMb2FkZXIsIGF0dHJzWG1sUGFyc2VyLCBtYWluTGlzdCwgZ3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5uZXdDaGlsZCgxKSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFZpZXdDbGFzc0luZm9bXSBwcmVmZXJlbmNlc0luZm8gPSBtYWluTGlzdC50b0FycmF5KG5ldyBWaWV3Q2xhc3NJbmZvW21haW5MaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgVmlld0NsYXNzSW5mb1tdIHByZWZlcmVuY2VHcm91cHNJbmZvID0gZ3JvdXBMaXN0LnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWaWV3Q2xhc3NJbmZvW2dyb3VwTGlzdC5zaXplKCldKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IHhtbE1lbnVNYXAgPSBjb2xsZWN0TWVudURlZmluaXRpb25zKGF0dHJzWG1sUGFyc2VyKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiB4bWxTZWFyY2hhYmxlTWFwID0gY29sbGVjdFNlYXJjaGFibGVEZWZpbml0aW9ucygKLSAgICAgICAgICAgICAgICAgICAgYXR0cnNYbWxQYXJzZXIpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IG1hbmlmZXN0TWFwID0gY29sbGVjdE1hbmlmZXN0RGVmaW5pdGlvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNNYW5pZmVzdFhtbFBhcnNlcik7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gZW51bVZhbHVlTWFwID0gYXR0cnNYbWxQYXJzZXIuZ2V0RW51bUZsYWdWYWx1ZXMoKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IHhtbEFwcFdpZGdldE1hcCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUFuZHJvaWRUYXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCkgPj0gMykgewotICAgICAgICAgICAgICAgIHhtbEFwcFdpZGdldE1hcCA9IGNvbGxlY3RBcHBXaWRnZXREZWZpbml0aW9ucyhhdHRyc1htbFBhcnNlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZyb20gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGNvbGxlY3RlZCwgY3JlYXRlIHRoZSBwaWVjZXMgdGhhdCB3aWxsIGJlIHB1dCBpbgotICAgICAgICAgICAgLy8gdGhlIFBsYXRmb3JtRGF0YSBvYmplY3QuCi0gICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3REZXNjcmlwdG9ycyBtYW5pZmVzdERlc2NyaXB0b3JzID0gbmV3IEFuZHJvaWRNYW5pZmVzdERlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBtYW5pZmVzdERlc2NyaXB0b3JzLnVwZGF0ZURlc2NyaXB0b3JzKG1hbmlmZXN0TWFwKTsKLSAgICAgICAgICAgIHByb2dyZXNzLndvcmtlZCgxKTsKLQotICAgICAgICAgICAgaWYgKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGF5b3V0RGVzY3JpcHRvcnMgbGF5b3V0RGVzY3JpcHRvcnMgPSBuZXcgTGF5b3V0RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIGxheW91dERlc2NyaXB0b3JzLnVwZGF0ZURlc2NyaXB0b3JzKGxheW91dFZpZXdzSW5mbywgbGF5b3V0R3JvdXBzSW5mbyk7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lbnVEZXNjcmlwdG9ycyBtZW51RGVzY3JpcHRvcnMgPSBuZXcgTWVudURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBtZW51RGVzY3JpcHRvcnMudXBkYXRlRGVzY3JpcHRvcnMoeG1sTWVudU1hcCk7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhtbERlc2NyaXB0b3JzIHhtbERlc2NyaXB0b3JzID0gbmV3IFhtbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICB4bWxEZXNjcmlwdG9ycy51cGRhdGVEZXNjcmlwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgeG1sU2VhcmNoYWJsZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgeG1sQXBwV2lkZ2V0TWFwLAotICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc0luZm8sCi0gICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VHcm91cHNJbmZvKTsKLSAgICAgICAgICAgIHByb2dyZXNzLndvcmtlZCgxKTsKLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgZnJhbWV3b3JrIHJlc291cmNlcy4KLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZEZyYW1ld29ya1Jlc291cmNlcygKLSAgICAgICAgICAgICAgICAgICAgbUFuZHJvaWRUYXJnZXQpOwotICAgICAgICAgICAgcHJvZ3Jlc3Mud29ya2VkKDEpOwotCi0gICAgICAgICAgICAvLyBub3cgbG9hZCB0aGUgbGF5b3V0IGxpYiBicmlkZ2UKLSAgICAgICAgICAgIExheW91dEJyaWRnZSBsYXlvdXRCcmlkZ2UgPSBsb2FkTGF5b3V0QnJpZGdlKCk7Ci0gICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0KLSAgICAgICAgICAgIC8vIGFuZCBmaW5hbGx5IGNyZWF0ZSB0aGUgUGxhdGZvcm1EYXRhIHdpdGggYWxsIHRoYXQgd2UgbG9hZGVkLgotICAgICAgICAgICAgdGFyZ2V0RGF0YS5zZXRFeHRyYURhdGEoZnJhbWV3b3JrUmVwb3NpdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3REZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0RGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgIG1lbnVEZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgeG1sRGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvblZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfYWN0aW9ucy50b0FycmF5KG5ldyBTdHJpbmdbYWN0aXZpdHlfYWN0aW9ucy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2FjdGlvbnMudG9BcnJheShuZXcgU3RyaW5nW2Jyb2FkY2FzdF9hY3Rpb25zLnNpemUoKV0pLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2FjdGlvbnMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZpY2VfYWN0aW9ucy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy50b0FycmF5KG5ldyBTdHJpbmdbY2F0ZWdvcmllcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgbUFuZHJvaWRUYXJnZXQuZ2V0UGxhdGZvcm1MaWJyYXJpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgbUFuZHJvaWRUYXJnZXQuZ2V0T3B0aW9uYWxMaWJyYXJpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCcmlkZ2UpOwotCi0gICAgICAgICAgICBTZGsuZ2V0Q3VycmVudCgpLnNldFRhcmdldERhdGEobUFuZHJvaWRUYXJnZXQsIHRhcmdldERhdGEpOwotCi0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIFRBRywgIlNESyBwYXJzZXIgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludFRvQ29uc29sZSgiU0RLIHBhcnNlciBmYWlsZWQiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELCAiU0RLIHBhcnNlciBmYWlsZWQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZWxvYWRzIGFsbCAiaW50ZXJlc3RpbmciIGNsYXNzZXMgZnJvbSB0aGUgZnJhbWV3b3JrIFNESyBqYXIuCi0gICAgICogPHAvPgotICAgICAqIEN1cnJlbnRseSB0aGlzIHByZWxvYWRzIGFsbCBjbGFzc2VzIGZyb20gdGhlIGZyYW1ld29yayBqYXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgZnJhbWV3b3JrIFNESyBqYXIgY2xhc3Nsb2FkZXIKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IuIENhbiBiZSBudWxsLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZG9uZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlbG9hZChBbmRyb2lkSmFyTG9hZGVyIGNsYXNzTG9hZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVyLnByZUxvYWRDbGFzc2VzKCIiIC8qIGFsbCBjbGFzc2VzICovLCAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBtQW5kcm9pZFRhcmdldC5nZXROYW1lKCksICAgICAgICAgICAgICAgICAgICAgICAvLyBtb25pdG9yIHRhc2sgbGFiZWwKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJQcm9ibGVtIHByZWxvYWRpbmcgY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlByb2JsZW0gcHJlbG9hZGluZyBjbGFzc2VzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gSVJlc291cmNlUmVwb3NpdG9yeSBmb3IgdGhlIGZyYW1ld29yayByZXNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGZyYW1ld29yayBTREsgamFyIGNsYXNzbG9hZGVyCi0gICAgICogQHJldHVybiBhIG1hcCBvZiB0aGUgcmVzb3VyY2VzLCBvciBudWxsIGlmIGl0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElSZXNvdXJjZVJlcG9zaXRvcnkgY29sbGVjdFJlc291cmNlSWRzKAotICAgICAgICAgICAgQW5kcm9pZEphckxvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3M8Pz4gciA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1IpOwotCi0gICAgICAgICAgICBpZiAociAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFJlc291cmNlVHlwZSwgTGlzdDxSZXNvdXJjZUl0ZW0+PiBtYXAgPSBwYXJzZVJDbGFzcyhyKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFtZXdvcmtSZXNvdXJjZVJlcG9zaXRvcnkobWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZ0FuZFByaW50RXJyb3IoZSwgVEFHLAotICAgICAgICAgICAgICAgICAgICAiQ29sbGVjdCByZXNvdXJjZSBJRHMgZmFpbGVkLCBjbGFzcyAlMSRzIG5vdCBmb3VuZCBpbiAlMiRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1IsCi0gICAgICAgICAgICAgICAgICAgIG1BbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQU5EUk9JRF9KQVIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBSIGNsYXNzIGFuZCBidWlsZCB0aGUgcmVzb3VyY2UgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIHJDbGFzcyB0aGUgQ2xhc3Mgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUmVzb3VyY2VzLgotICAgICAqIEByZXR1cm4gYSBtYXAgb2YgdGhlIHJlc291cmNlIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UmVzb3VyY2VJdGVtPj4gcGFyc2VSQ2xhc3MoQ2xhc3M8Pz4gckNsYXNzKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgc3ViIGNsYXNzZXMuCi0gICAgICAgIENsYXNzPD8+W10gY2xhc3NlcyA9IHJDbGFzcy5nZXRDbGFzc2VzKCk7Ci0KLSAgICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgSGFzaE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UmVzb3VyY2VJdGVtPj4gbWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UmVzb3VyY2VJdGVtPj4oKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaWVsZHMgb2YgZWFjaCBjbGFzcy4KLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwIDsgYyA8IGNsYXNzZXMubGVuZ3RoIDsgYysrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gc3ViQ2xhc3MgPSBjbGFzc2VzW2NdOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc3ViQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXRjaGluZyBSZXNvdXJjZVR5cGUKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IFJlc291cmNlVHlwZS5nZXRFbnVtKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvdXJjZUl0ZW0+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlSXRlbT4oKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCh0eXBlLCBsaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IHN1YkNsYXNzLmdldEZpZWxkcygpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGZpZWxkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IFJlc291cmNlSXRlbShmLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMsIGNvbGxlY3RzIGFuZCByZXR1cm5zIHRoZSBsaXN0IG9mIGRlZmF1bHQgcGVybWlzc2lvbnMgZnJvbSB0aGUgZnJhbWV3b3JrLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBmcmFtZXdvcmsgU0RLIGphciBjbGFzc2xvYWRlcgotICAgICAqIEByZXR1cm4gYSBub24gbnVsbCAoYnV0IHBvc3NpYmx5IGVtcHR5KSBhcnJheSBjb250YWluaW5nIHRoZSBwZXJtaXNzaW9uIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGNvbGxlY3RQZXJtaXNzaW9ucyhBbmRyb2lkSmFyTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBwZXJtaXNzaW9uQ2xhc3MgPQotICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX01BTklGRVNUX1BFUk1JU1NJT04pOwotCi0gICAgICAgICAgICBpZiAocGVybWlzc2lvbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IHBlcm1pc3Npb25DbGFzcy5nZXRGaWVsZHMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGZpZWxkcykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzID0gZi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykgJiYgTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBmLmdldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoKFN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBwcm92aWRlIG51bGwgdGhpcyBzaG91bGQgbm90IGhhcHBlbgotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGluYWNjZXNzaWJsZSB3ZSBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoaXMgaXMgbm90IGEgc3RhdGljIGZpZWxkLiB3ZSBjYW4gaWdub3JlLgotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yICBlaWllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBqdXN0IGlnbm9yZSB0aGUgZmllbGQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2dBbmRQcmludEVycm9yKGUsIFRBRywKLSAgICAgICAgICAgICAgICAgICAgIkNvbGxlY3QgcGVybWlzc2lvbnMgZmFpbGVkLCBjbGFzcyAlMSRzIG5vdCBmb3VuZCBpbiAlMiRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX01BTklGRVNUX1BFUk1JU1NJT04sCi0gICAgICAgICAgICAgICAgICAgIG1BbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQU5EUk9JRF9KQVIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGFuZCBjb2xsZWN0cyB0aGUgYWN0aW9uIGFuZCBjYXRlZ29yeSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBmcmFtZXdvcmsuCi0gICAgICogVGhlIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGFuZCA8Y29kZT5jYXRlZ29yaWVzPC9jb2RlPiBsaXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpdml0eUFjdGlvbnMgdGhlIGxpc3Qgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBhY3Rpdml0eSBhY3Rpb24gdmFsdWVzLgotICAgICAqIEBwYXJhbSBicm9hZGNhc3RBY3Rpb25zIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgYnJvYWRjYXN0IGFjdGlvbiB2YWx1ZXMuCi0gICAgICogQHBhcmFtIHNlcnZpY2VBY3Rpb25zIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgc2VydmljZSBhY3Rpb24gdmFsdWVzLgotICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgY2F0ZWdvcnkgdmFsdWVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0SW50ZW50RmlsdGVyQWN0aW9uc0FuZENhdGVnb3JpZXMoQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZpdHlBY3Rpb25zLAotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYnJvYWRjYXN0QWN0aW9ucywKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNlcnZpY2VBY3Rpb25zLCBBcnJheUxpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzKSAgewotICAgICAgICBjb2xsZWN0VmFsdWVzKG1BbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQUNUSU9OU19BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlBY3Rpb25zKTsKLSAgICAgICAgY29sbGVjdFZhbHVlcyhtQW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFDVElPTlNfQlJPQURDQVNUKSwKLSAgICAgICAgICAgICAgICBicm9hZGNhc3RBY3Rpb25zKTsKLSAgICAgICAgY29sbGVjdFZhbHVlcyhtQW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkFDVElPTlNfU0VSVklDRSksCi0gICAgICAgICAgICAgICAgc2VydmljZUFjdGlvbnMpOwotICAgICAgICBjb2xsZWN0VmFsdWVzKG1BbmRyb2lkVGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuQ0FURUdPUklFUyksCi0gICAgICAgICAgICAgICAgY2F0ZWdvcmllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgdmFsdWVzIGZyb20gYSB0ZXh0IGZpbGUgbG9jYXRlZCBpbiB0aGUgU0RLCi0gICAgICogQHBhcmFtIG9zRmlsZVBhdGggVGhlIHBhdGggdG8gdGhlIHRleHQgZmlsZS4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB7QGxpbmsgQXJyYXlMaXN0fSB0byBmaWxsIHdpdGggdGhlIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdFZhbHVlcyhTdHJpbmcgb3NGaWxlUGF0aCwgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIEZpbGVSZWFkZXIgZnIgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZnIgPSBuZXcgRmlsZVJlYWRlcihvc0ZpbGVQYXRoKTsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmIGxpbmUuc3RhcnRzV2l0aCgiIyIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byByZWFkIFNESyB2YWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byByZWFkIFNESyB2YWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChmciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byByZWFkIFNESyB2YWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgYWxsIGxheW91dCBjbGFzc2VzIGluZm9ybWF0aW9uIGZyb20gdGhlIGNsYXNzIGxvYWRlciBhbmQgdGhlCi0gICAgICogYXR0cnMueG1sIGFuZCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyZXMgaW4gdGhlIHJlc291cmNlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGZyYW1ld29yayBTREsgamFyIGNsYXNzbG9hZGVyIGluIGNhc2Ugd2UgY2Fubm90IGdldCB0aGUgd2lkZ2V0IGZyb20KLSAgICAgKiB0aGUgcGxhdGZvcm0gZGlyZWN0bHkKLSAgICAgKiBAcGFyYW0gYXR0cnNYbWxQYXJzZXIgVGhlIHBhcnNlciBvZiB0aGUgYXR0cnMueG1sIGZpbGUKLSAgICAgKiBAcGFyYW0gbWFpbkxpc3QgdGhlIENvbGxlY3Rpb24gdG8gcmVjZWl2ZSB0aGUgbWFpbiBsaXN0IG9mIHtAbGluayBWaWV3Q2xhc3NJbmZvfS4KLSAgICAgKiBAcGFyYW0gZ3JvdXBMaXN0IHRoZSBDb2xsZWN0aW9uIHRvIHJlY2VpdmUgdGhlIGdyb3VwIGxpc3Qgb2Yge0BsaW5rIFZpZXdDbGFzc0luZm99LgotICAgICAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvci4gQ2FuIGJlIG51bGwuIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBkb25lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0TGF5b3V0Q2xhc3NlcyhBbmRyb2lkSmFyTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgQXR0cnNYbWxQYXJzZXIgYXR0cnNYbWxQYXJzZXIsCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFZpZXdDbGFzc0luZm8+IG1haW5MaXN0LCBDb2xsZWN0aW9uPFZpZXdDbGFzc0luZm8+IGdyb3VwTGlzdCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBMYXlvdXRQYXJhbXNQYXJzZXIgbGRwID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdpZGdldENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBXaWRnZXRDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbUFuZHJvaWRUYXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5XSURHRVRTKSk7Ci0gICAgICAgICAgICBpZiAobG9hZGVyLnBhcnNlV2lkZ2V0TGlzdChtb25pdG9yKSkgewotICAgICAgICAgICAgICAgIGxkcCA9IG5ldyBMYXlvdXRQYXJhbXNQYXJzZXIobG9hZGVyLCBhdHRyc1htbFBhcnNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB0aGUgcGFyc2luZyBmYWlsZWQsIHdlJ2xsIHVzZSB0aGUgb2xkIGxvYWRlciBiZWxvdy4KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkFuZHJvaWQgRnJhbWV3b3JrIFBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgd2UnbGwgdXNlIHRoZSBvbGQgbG9hZGVyIGJlbG93LgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxkcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsZHAgPSBuZXcgTGF5b3V0UGFyYW1zUGFyc2VyKGNsYXNzTG9hZGVyLCBhdHRyc1htbFBhcnNlcik7Ci0gICAgICAgIH0KLSAgICAgICAgbGRwLnBhcnNlTGF5b3V0Q2xhc3Nlcyhtb25pdG9yKTsKLQotICAgICAgICBMaXN0PFZpZXdDbGFzc0luZm8+IHZpZXdzID0gbGRwLmdldFZpZXdzKCk7Ci0gICAgICAgIExpc3Q8Vmlld0NsYXNzSW5mbz4gZ3JvdXBzID0gbGRwLmdldEdyb3VwcygpOwotCi0gICAgICAgIGlmICh2aWV3cyAhPSBudWxsICYmIGdyb3VwcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYWluTGlzdC5hZGRBbGwodmlld3MpOwotICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZEFsbChncm91cHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgYWxsIHByZWZlcmVuY2VzIGRlZmluaXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgYXR0cnMueG1sIGFuZAotICAgICAqIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0dXJlcyBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgZnJhbWV3b3JrIFNESyBqYXIgY2xhc3Nsb2FkZXIKLSAgICAgKiBAcGFyYW0gYXR0cnNYbWxQYXJzZXIgVGhlIHBhcnNlciBvZiB0aGUgYXR0cnMueG1sIGZpbGUKLSAgICAgKiBAcGFyYW0gbWFpbkxpc3QgdGhlIENvbGxlY3Rpb24gdG8gcmVjZWl2ZSB0aGUgbWFpbiBsaXN0IG9mIHtAbGluayBWaWV3Q2xhc3NJbmZvfS4KLSAgICAgKiBAcGFyYW0gZ3JvdXBMaXN0IHRoZSBDb2xsZWN0aW9uIHRvIHJlY2VpdmUgdGhlIGdyb3VwIGxpc3Qgb2Yge0BsaW5rIFZpZXdDbGFzc0luZm99LgotICAgICAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvci4gQ2FuIGJlIG51bGwuIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBkb25lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0UHJlZmVyZW5jZUNsYXNzZXMoQW5kcm9pZEphckxvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgIEF0dHJzWG1sUGFyc2VyIGF0dHJzWG1sUGFyc2VyLCBDb2xsZWN0aW9uPFZpZXdDbGFzc0luZm8+IG1haW5MaXN0LAotICAgICAgICAgICAgQ29sbGVjdGlvbjxWaWV3Q2xhc3NJbmZvPiBncm91cExpc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBMYXlvdXRQYXJhbXNQYXJzZXIgbGRwID0gbmV3IExheW91dFBhcmFtc1BhcnNlcihjbGFzc0xvYWRlciwgYXR0cnNYbWxQYXJzZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsZHAucGFyc2VQcmVmZXJlbmNlc0NsYXNzZXMobW9uaXRvcik7Ci0KLSAgICAgICAgICAgIExpc3Q8Vmlld0NsYXNzSW5mbz4gcHJlZnMgPSBsZHAuZ2V0Vmlld3MoKTsKLSAgICAgICAgICAgIExpc3Q8Vmlld0NsYXNzSW5mbz4gZ3JvdXBzID0gbGRwLmdldEdyb3VwcygpOwotCi0gICAgICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCAmJiBncm91cHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1haW5MaXN0LmFkZEFsbChwcmVmcyk7Ci0gICAgICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZEFsbChncm91cHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nQW5kUHJpbnRFcnJvcihlLCBUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDb2xsZWN0IHByZWZlcmVuY2VzIGZhaWxlZCwgY2xhc3MgJTEkcyBub3QgZm91bmQgaW4gJTIkcyIsCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5nZXRTb3VyY2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJBbmRyb2lkIEZyYW1ld29yayBQYXJzZXI6IGZhaWxlZCB0byBjb2xsZWN0IHByZWZlcmVuY2UgY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRFcnJvclRvQ29uc29sZSgiQW5kcm9pZCBGcmFtZXdvcmsgUGFyc2VyIiwKLSAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb2xsZWN0IHByZWZlcmVuY2UgY2xhc3NlcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgYWxsIG1lbnUgZGVmaW5pdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhdHRycy54bWwgYW5kIHJldHVybnMgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cnNYbWxQYXJzZXIgVGhlIHBhcnNlciBvZiB0aGUgYXR0cnMueG1sIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBjb2xsZWN0TWVudURlZmluaXRpb25zKAotICAgICAgICAgICAgQXR0cnNYbWxQYXJzZXIgYXR0cnNYbWxQYXJzZXIpIHsKLSAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IG1hcCA9IGF0dHJzWG1sUGFyc2VyLmdldERlY2xhcmVTdHlsZWFibGVMaXN0KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBtYXAyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbmV3IFN0cmluZ1tdIHsgIk1lbnUiLCAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVudUl0ZW0iLCAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVudUdyb3VwIiB9KSB7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgbWFwMi5wdXQoa2V5LCBtYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBZHRQbHVnaW4ubG9nKElTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJNZW51IGRlY2xhcmUtc3R5bGVhYmxlICUxJHMgbm90IGZvdW5kIGluIGZpbGUgJTIkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgYXR0cnNYbWxQYXJzZXIuZ2V0T3NBdHRyc1htbFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoIkFuZHJvaWQgRnJhbWV3b3JrIFBhcnNlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJNZW51IGRlY2xhcmUtc3R5bGVhYmxlICUxJHMgbm90IGZvdW5kIGluIGZpbGUgJTIkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgYXR0cnNYbWxQYXJzZXIuZ2V0T3NBdHRyc1htbFBhdGgoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtYXAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0cyBhbGwgc2VhcmNoYWJsZSBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGF0dHJzLnhtbCBhbmQgcmV0dXJucyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyc1htbFBhcnNlciBUaGUgcGFyc2VyIG9mIHRoZSBhdHRycy54bWwgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IGNvbGxlY3RTZWFyY2hhYmxlRGVmaW5pdGlvbnMoCi0gICAgICAgICAgICBBdHRyc1htbFBhcnNlciBhdHRyc1htbFBhcnNlcikgewotICAgICAgICBNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gbWFwID0gYXR0cnNYbWxQYXJzZXIuZ2V0RGVjbGFyZVN0eWxlYWJsZUxpc3QoKTsKLSAgICAgICAgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IG1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPigpOwotICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBuZXcgU3RyaW5nW10geyAiU2VhcmNoYWJsZSIsICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWFyY2hhYmxlQWN0aW9uS2V5IiB9KSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIG1hcDIucHV0KGtleSwgbWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VhcmNoYWJsZSBkZWNsYXJlLXN0eWxlYWJsZSAlMSRzIG5vdCBmb3VuZCBpbiBmaWxlICUyJHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXksIGF0dHJzWG1sUGFyc2VyLmdldE9zQXR0cnNYbWxQYXRoKCkpOwotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5wcmludEVycm9yVG9Db25zb2xlKCJBbmRyb2lkIEZyYW1ld29yayBQYXJzZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiU2VhcmNoYWJsZSBkZWNsYXJlLXN0eWxlYWJsZSAlMSRzIG5vdCBmb3VuZCBpbiBmaWxlICUyJHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXksIGF0dHJzWG1sUGFyc2VyLmdldE9zQXR0cnNYbWxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgYWxsIGFwcFdpZGdldFByb3ZpZGVySW5mbyBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGF0dHJzLnhtbCBhbmQgcmV0dXJucyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyc1htbFBhcnNlciBUaGUgcGFyc2VyIG9mIHRoZSBhdHRycy54bWwgZmlsZQotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+IGNvbGxlY3RBcHBXaWRnZXREZWZpbml0aW9ucygKLSAgICAgICAgICAgIEF0dHJzWG1sUGFyc2VyIGF0dHJzWG1sUGFyc2VyKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBtYXAgPSBhdHRyc1htbFBhcnNlci5nZXREZWNsYXJlU3R5bGVhYmxlTGlzdCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBEZWNsYXJlU3R5bGVhYmxlSW5mbz4gbWFwMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGVjbGFyZVN0eWxlYWJsZUluZm8+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG5ldyBTdHJpbmdbXSB7ICJBcHBXaWRnZXRQcm92aWRlckluZm8iIH0pIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIG1hcDIucHV0KGtleSwgbWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwV2lkZ2V0IGRlY2xhcmUtc3R5bGVhYmxlICUxJHMgbm90IGZvdW5kIGluIGZpbGUgJTIkcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgYXR0cnNYbWxQYXJzZXIuZ2V0T3NBdHRyc1htbFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoIkFuZHJvaWQgRnJhbWV3b3JrIFBhcnNlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJBcHBXaWRnZXQgZGVjbGFyZS1zdHlsZWFibGUgJTEkcyBub3QgZm91bmQgaW4gZmlsZSAlMiRzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBhdHRyc1htbFBhcnNlci5nZXRPc0F0dHJzWG1sUGF0aCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1hcDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxlY3RzIGFsbCBtYW5pZmVzdCBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGF0dHJzX21hbmlmZXN0LnhtbCBhbmQgcmV0dXJucyBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERlY2xhcmVTdHlsZWFibGVJbmZvPiBjb2xsZWN0TWFuaWZlc3REZWZpbml0aW9ucygKLSAgICAgICAgICAgIEF0dHJzWG1sUGFyc2VyIGF0dHJzWG1sUGFyc2VyKSB7Ci0KLSAgICAgICAgcmV0dXJuIGF0dHJzWG1sUGFyc2VyLmdldERlY2xhcmVTdHlsZWFibGVMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGxheW91dCBicmlkZ2UgZnJvbSB0aGUgZHluYW1pY2FsbHkgbG9hZGVkIGxheW91dGxpYi5qYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIExheW91dEJyaWRnZSBsb2FkTGF5b3V0QnJpZGdlKCkgewotICAgICAgICBMYXlvdXRCcmlkZ2UgbGF5b3V0QnJpZGdlID0gbmV3IExheW91dEJyaWRnZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIFVSTCBmb3IgdGhlIGZpbGUuCi0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtQW5kcm9pZFRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LkxBWU9VVF9MSUIpKTsKLSAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAibGF5b3V0bGliLmphciBpcyBtaXNzaW5nISIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBmLnRvVVJMKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIuIEJlY2F1c2UgdGhpcyBqYXIgcmVmZXJlbmNlIGludGVyZmFjZXMKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBpbiB0aGUgZWRpdG9ycyBwbHVnaW4sIGl0J3MgaW1wb3J0YW50IHRvIHByb3ZpZGUKLSAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBjbGFzcyBsb2FkZXIuCi0gICAgICAgICAgICAgICAgbGF5b3V0QnJpZGdlLmNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHVybCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgY2xhc3MKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGxheW91dEJyaWRnZS5jbGFzc0xvYWRlci5sb2FkQ2xhc3MoQW5kcm9pZENvbnN0YW50cy5DTEFTU19CUklER0UpOwotICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIGFuIG9iamVjdCBvZiB0aGUgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yID0gY2xhenouZ2V0Q29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBicmlkZ2UgPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyaWRnZSBpbnN0YW5jZW9mIElMYXlvdXRCcmlkZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRCcmlkZ2UuYnJpZGdlID0gKElMYXlvdXRCcmlkZ2UpYnJpZGdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxheW91dEJyaWRnZS5icmlkZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCcmlkZ2Uuc3RhdHVzID0gTG9hZFN0YXR1cy5GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIkZhaWxlZCB0byBsb2FkICIgKyBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX0JSSURHRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFwaSBsZXZlbAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0QnJpZGdlLmFwaUxldmVsID0gbGF5b3V0QnJpZGdlLmJyaWRnZS5nZXRBcGlMZXZlbCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBYnN0cmFjdE1ldGhvZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBhcGkgZGlkIG5vdCBoYXZlIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRCcmlkZ2UuYXBpTGV2ZWwgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG1hcmsgdGhlIGxpYiBhcyBsb2FkZWQuCi0gICAgICAgICAgICAgICAgICAgIGxheW91dEJyaWRnZS5zdGF0dXMgPSBMb2FkU3RhdHVzLkxPQURFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsYXlvdXRCcmlkZ2Uuc3RhdHVzID0gTG9hZFN0YXR1cy5GQUlMRUQ7Ci0gICAgICAgICAgICAvLyBsb2cgdGhlIGVycm9yLgotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyh0LCAiRmFpbGVkIHRvIGxvYWQgdGhlIExheW91dExpYiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxheW91dEJyaWRnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0RleFdyYXBwZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvRGV4V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgxYjE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvRGV4V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmJ1aWxkLk1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci0KLS8qKgotICogV3JhcHBlciB0byBhY2Nlc3MgZGV4LmphciB0aHJvdWdoIHJlZmxlY3Rpb24uCi0gKiA8cC8+U2luY2UgdGhlcmUgaXMgbm8gcHJvcGVyIGFwaSB0byBjYWxsIHRoZSBtZXRob2QgaW4gdGhlIGRleCBsaWJyYXJ5LCB0aGlzIHdyYXBwZXIgaXMgZ29pbmcKLSAqIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHJlZmxlY3Rpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXhXcmFwcGVyIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVYX01BSU4gPSAiY29tLmFuZHJvaWQuZHguY29tbWFuZC5kZXhlci5NYWluIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERVhfQ09OU09MRSA9ICJjb20uYW5kcm9pZC5keC5jb21tYW5kLkR4Q29uc29sZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVYX0FSR1MgPSAiY29tLmFuZHJvaWQuZHguY29tbWFuZC5kZXhlci5NYWluJEFyZ3VtZW50cyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFJTl9SVU4gPSAicnVuIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgTWV0aG9kIG1SdW5NZXRob2Q7Ci0KLSAgICBwcml2YXRlIENvbnN0cnVjdG9yPD8+IG1BcmdDb25zdHJ1Y3RvcjsKLSAgICBwcml2YXRlIEZpZWxkIG1BcmdPdXROYW1lOwotICAgIHByaXZhdGUgRmllbGQgbUFyZ1ZlcmJvc2U7Ci0gICAgcHJpdmF0ZSBGaWVsZCBtQXJnSmFyT3V0cHV0OwotICAgIHByaXZhdGUgRmllbGQgbUFyZ0ZpbGVOYW1lczsKLQotICAgIHByaXZhdGUgRmllbGQgbUNvbnNvbGVPdXQ7Ci0gICAgcHJpdmF0ZSBGaWVsZCBtQ29uc29sZUVycjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZGV4IGxpYnJhcnkgZnJvbSBhIGZpbGUgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBUaGUgbG9hZGVkIGxpYnJhcnkgY2FuIGJlIHVzZWQgdmlhCi0gICAgICoge0BsaW5rIERleFdyYXBwZXIjcnVuKFN0cmluZywgU3RyaW5nW10sIGJvb2xlYW4sIFByaW50U3RyZWFtLCBQcmludFN0cmVhbSl9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvc0ZpbGVwYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGV4LmphciBmaWxlLgotICAgICAqIEByZXR1cm4gYW4gSVN0YXR1cyBpbmRpY2F0aW5nIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIGxvYWREZXgoU3RyaW5nIG9zRmlsZXBhdGgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKG9zRmlsZXBhdGgpOwotICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuRGV4V3JhcHBlcl9zX2RvZXNfbm90X2V4aXN0cywgb3NGaWxlcGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVVJMIHVybCA9IGYudG9VUkwoKTsKLSAgICAKLSAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyB1cmwgfSwKLSAgICAgICAgICAgICAgICAgICAgRGV4V3JhcHBlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjbGFzc2VzLgotICAgICAgICAgICAgQ2xhc3M8Pz4gbWFpbkNsYXNzID0gbG9hZGVyLmxvYWRDbGFzcyhERVhfTUFJTik7Ci0gICAgICAgICAgICBDbGFzczw/PiBjb25zb2xlQ2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKERFWF9DT05TT0xFKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGFyZ0NsYXNzID0gbG9hZGVyLmxvYWRDbGFzcyhERVhfQVJHUyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gbm93IGdldCB0aGUgZmllbGRzL21ldGhvZHMgd2UgbmVlZAotICAgICAgICAgICAgICAgIG1SdW5NZXRob2QgPSBtYWluQ2xhc3MuZ2V0TWV0aG9kKE1BSU5fUlVOLCBhcmdDbGFzcyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbUFyZ0NvbnN0cnVjdG9yID0gYXJnQ2xhc3MuZ2V0Q29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgICAgICBtQXJnT3V0TmFtZSA9IGFyZ0NsYXNzLmdldEZpZWxkKCJvdXROYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtQXJnSmFyT3V0cHV0ID0gYXJnQ2xhc3MuZ2V0RmllbGQoImphck91dHB1dCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbUFyZ0ZpbGVOYW1lcyA9IGFyZ0NsYXNzLmdldEZpZWxkKCJmaWxlTmFtZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1BcmdWZXJib3NlID0gYXJnQ2xhc3MuZ2V0RmllbGQoInZlcmJvc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG1Db25zb2xlT3V0ID0gY29uc29sZUNsYXNzLmdldEZpZWxkKCJvdXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1Db25zb2xlRXJyID0gY29uc29sZUNsYXNzLmdldEZpZWxkKCJlcnIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhNZXNzYWdlcy5EZXhXcmFwcGVyX1NlY3VyeUV4X1VuYWJsZV9Ub19GaW5kX0FQSSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhNZXNzYWdlcy5EZXhXcmFwcGVyX1NlY3VyeUV4X1VuYWJsZV9Ub19GaW5kX01ldGhvZCwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yU3RhdHVzKE1lc3NhZ2VzLkRleFdyYXBwZXJfU2VjdXJ5RXhfVW5hYmxlX1RvX0ZpbmRfRmllbGQsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJlYWxseSB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KE1lc3NhZ2VzLkRleFdyYXBwZXJfRmFpbGVkX3RvX2xvYWRfcywgb3NGaWxlcGF0aCksIGUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFcnJvclN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChNZXNzYWdlcy5EZXhXcmFwcGVyX0ZhaWxlZF90b19sb2FkX3MsIG9zRmlsZXBhdGgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSBkZXggY29tbWFuZC4KLSAgICAgKiBAcGFyYW0gb3NPdXRGaWxlUGF0aCB0aGUgT1MgcGF0aCB0byB0aGUgb3V0cHV0ZmlsZSAoY2xhc3Nlcy5kZXgKLSAgICAgKiBAcGFyYW0gb3NGaWxlbmFtZXMgbGlzdCBvZiBpbnB1dCBzb3VyY2UgZmlsZXMgKC5jbGFzcyBhbmQgLmphciBmaWxlcykKLSAgICAgKiBAcGFyYW0gdmVyYm9zZSB2ZXJib3NlIG1vZGUuCi0gICAgICogQHBhcmFtIG91dFN0cmVhbSB0aGUgc3Rkb3V0IGNvbnNvbGUKLSAgICAgKiBAcGFyYW0gZXJyU3RyZWFtIHRoZSBzdGRlcnIgY29uc29sZQotICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgcmV0dXJuIGNvZGUgb2YgY29tLmFuZHJvaWQuZHguY29tbWFuZC5kZXhlci5NYWluLnJ1bigpCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcnVuKFN0cmluZyBvc091dEZpbGVQYXRoLCBTdHJpbmdbXSBvc0ZpbGVuYW1lcywKLSAgICAgICAgICAgIGJvb2xlYW4gdmVyYm9zZSwgUHJpbnRTdHJlYW0gb3V0U3RyZWFtLCBQcmludFN0cmVhbSBlcnJTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIHN0cmVhbQotICAgICAgICAgICAgbUNvbnNvbGVFcnIuc2V0KG51bGwgLyogb2JqOiBzdGF0aWMgZmllbGQgKi8sIGVyclN0cmVhbSk7Ci0gICAgICAgICAgICBtQ29uc29sZU91dC5zZXQobnVsbCAvKiBvYmo6IHN0YXRpYyBmaWVsZCAqLywgb3V0U3RyZWFtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBBcmd1bWVudHMgb2JqZWN0LgotICAgICAgICAgICAgT2JqZWN0IGFyZ3MgPSBtQXJnQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG1BcmdPdXROYW1lLnNldChhcmdzLCBvc091dEZpbGVQYXRoKTsKLSAgICAgICAgICAgIG1BcmdGaWxlTmFtZXMuc2V0KGFyZ3MsIG9zRmlsZW5hbWVzKTsKLSAgICAgICAgICAgIG1BcmdKYXJPdXRwdXQuc2V0KGFyZ3MsIGZhbHNlKTsKLSAgICAgICAgICAgIG1BcmdWZXJib3NlLnNldChhcmdzLCB2ZXJib3NlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2FsbCB0aGUgcnVuIG1ldGhvZAotICAgICAgICAgICAgT2JqZWN0IHJlcyA9IG1SdW5NZXRob2QuaW52b2tlKG51bGwgLyogb2JqOiBzdGF0aWMgbWV0aG9kICovLCBhcmdzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKXJlcykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oY3JlYXRlRXJyb3JTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuRGV4V3JhcHBlcl9VbmFibGVfVG9fRXhlY3V0ZV9EZXhfcywgZS5nZXRNZXNzYWdlKCkpLCBlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oY3JlYXRlRXJyb3JTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuRGV4V3JhcHBlcl9VbmFibGVfVG9fRXhlY3V0ZV9EZXhfcywgZS5nZXRNZXNzYWdlKCkpLCBlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oY3JlYXRlRXJyb3JTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTWVzc2FnZXMuRGV4V3JhcHBlcl9VbmFibGVfVG9fRXhlY3V0ZV9EZXhfcywgZS5nZXRNZXNzYWdlKCkpLCBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCBtZXNzYWdlKTsKLSAgICAgICAgQWR0UGx1Z2luLnByaW50RXJyb3JUb0NvbnNvbGUoTWVzc2FnZXMuRGV4V3JhcHBlcl9EZXhfTG9hZGVyLCBtZXNzYWdlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFkdFBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UsIGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvRnJhbWV3b3JrUmVzb3VyY2VSZXBvc2l0b3J5LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0ZyYW1ld29ya1Jlc291cmNlUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWIwMDgyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvRnJhbWV3b3JrUmVzb3VyY2VSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLklSZXNvdXJjZVJlcG9zaXRvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUl0ZW07Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBJUmVzb3VyY2VSZXBvc2l0b3J5fSBpbnRlcmZhY2UgdG8gaG9sZCB0aGUgc3lzdGVtIHJlc291cmNlIElkcwotICogcGFyc2VkIGJ5IHtAbGluayBBbmRyb2lkVGFyZ2V0UGFyc2VyfS4gCi0gKi8KLWZpbmFsIGNsYXNzIEZyYW1ld29ya1Jlc291cmNlUmVwb3NpdG9yeSBpbXBsZW1lbnRzIElSZXNvdXJjZVJlcG9zaXRvcnkgewotICAgIAotICAgIHByaXZhdGUgTWFwPFJlc291cmNlVHlwZSwgTGlzdDxSZXNvdXJjZUl0ZW0+PiBtUmVzb3VyY2VzTWFwOyAKLSAgICAKLSAgICBwdWJsaWMgRnJhbWV3b3JrUmVzb3VyY2VSZXBvc2l0b3J5KE1hcDxSZXNvdXJjZVR5cGUsIExpc3Q8UmVzb3VyY2VJdGVtPj4gc3lzdGVtUmVzb3VyY2VzTWFwKSB7Ci0gICAgICAgIG1SZXNvdXJjZXNNYXAgPSBzeXN0ZW1SZXNvdXJjZXNNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlVHlwZVtdIGdldEF2YWlsYWJsZVJlc291cmNlVHlwZXMoKSB7Ci0gICAgICAgIGlmIChtUmVzb3VyY2VzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxSZXNvdXJjZVR5cGU+IHR5cGVzID0gbVJlc291cmNlc01hcC5rZXlTZXQoKTsKLQotICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXMudG9BcnJheShuZXcgUmVzb3VyY2VUeXBlW3R5cGVzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlSXRlbVtdIGdldFJlc291cmNlcyhSZXNvdXJjZVR5cGUgdHlwZSkgewotICAgICAgICBpZiAobVJlc291cmNlc01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFJlc291cmNlSXRlbT4gaXRlbXMgPSBtUmVzb3VyY2VzTWFwLmdldCh0eXBlKTsKLQotICAgICAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMudG9BcnJheShuZXcgUmVzb3VyY2VJdGVtW2l0ZW1zLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VzKFJlc291cmNlVHlwZSB0eXBlKSB7Ci0gICAgICAgIGlmIChtUmVzb3VyY2VzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VJdGVtPiBpdGVtcyA9IG1SZXNvdXJjZXNNYXAuZ2V0KHR5cGUpOwotCi0gICAgICAgICAgICByZXR1cm4gKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1SZXBvc2l0b3J5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0lBbmRyb2lkQ2xhc3NMb2FkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvSUFuZHJvaWRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNkM2EzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvSUFuZHJvaWRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHByb3ZpZGUgbWV0aG9kcyB0byBhY2Nlc3MgZnJhbWV3b3JrIHJlc291cmNlCi0gKiBkYXRhIGxvYWRlZCBmcm9tIHRoZSBTREsuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFuZHJvaWRDbGFzc0xvYWRlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBtZXRob2RzIHRvIGRlc2NyaWJlIGEgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJQ2xhc3NEZXNjcmlwdG9yIHsKLQotICAgICAgICBTdHJpbmcgZ2V0Q2Fub25pY2FsTmFtZSgpOwotCi0gICAgICAgIElDbGFzc0Rlc2NyaXB0b3IgZ2V0U3VwZXJjbGFzcygpOwotCi0gICAgICAgIFN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICAgICAgSUNsYXNzRGVzY3JpcHRvciBnZXRFbmNsb3NpbmdDbGFzcygpOwotCi0gICAgICAgIElDbGFzc0Rlc2NyaXB0b3JbXSBnZXREZWNsYXJlZENsYXNzZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNJbnN0YW50aWFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbmQgbG9hZHMgYWxsIGNsYXNzZXMgdGhhdCBkZXJpdmUgZnJvbSBhIGdpdmVuIHNldCBvZiBzdXBlciBjbGFzc2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByb290UGFja2FnZSBSb290IHBhY2thZ2Ugb2YgY2xhc3NlcyB0byBmaW5kLiBVc2UgYW4gZW1wdHkgc3RyaW5nIHRvIGZpbmQgZXZlcnl0aW5nLgotICAgICAqIEBwYXJhbSBzdXBlckNsYXNzZXMgVGhlIHN1cGVyIGNsYXNzZXMgb2YgYWxsIHRoZSBjbGFzc2VzIHRvIGZpbmQuIAotICAgICAqIEByZXR1cm4gQW4gaGFzaCBtYXAgd2hpY2gga2V5cyBhcmUgdGhlIHN1cGVyIGNsYXNzZXMgbG9va2VkIGZvciBhbmQgd2hpY2ggdmFsdWVzIGFyZQotICAgICAqICAgICAgICAgQXJyYXlMaXN0IG9mIHRoZSBjbGFzc2VzIGZvdW5kLiBUaGUgYXJyYXkgbGlzdHMgYXJlIGFsd2F5cyBjcmVhdGVkIGZvciBhbGwgdGhlCi0gICAgICogICAgICAgICB2YWxpZCBrZXlzLCB0aGV5IGFyZSBzaW1wbHkgZW1wdHkgaWYgbm8gZGVyaXZpbmcgY2xhc3MgaXMgZm91bmQgZm9yIGEgZ2l2ZW4KLSAgICAgKiAgICAgICAgIHN1cGVyIGNsYXNzLiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzRm9ybWF0RXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPj4gZmluZENsYXNzZXNEZXJpdmluZ0Zyb20oCi0gICAgICAgICAgICBTdHJpbmcgcm9vdFBhY2thZ2UsIFN0cmluZ1tdIHN1cGVyQ2xhc3NlcykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24sIENsYXNzRm9ybWF0RXJyb3I7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIElDbGFzc0Rlc2NyaXB0b3J9IGJ5IGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gcmV0dXJuLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJQ2xhc3NEZXNjcmlwdG9yIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBzb3VyY2Ugb2YgdGhlIGNsYXNzZXMsIHR5cGljYWxseSBmb3IgZGVidWdnaW5nCi0gICAgICogb3IgaW4gZXJyb3IgbWVzc2FnZXMuIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGEgSkFSIGZpbGUgbmFtZSBvciBzb21lIGtpbmQgb2YKLSAgICAgKiBpZGVudGlmaWVyIHRoYXQgd291bGQgbWVhbiBzb21ldGhpbmcgdG8gdGhlIHVzZXIgd2hlbiBsb29raW5nIGF0IGVycm9yIG1lc3NhZ2VzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQW4gaW5mb3JtYWwgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc291cmNlIG9mIHRoZSBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXREZXZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MDEwMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuQ291bnRyeUNvZGVRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLk5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5OZXR3b3JrQ29kZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlBpeGVsRGVuc2l0eVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbkRpbWVuc2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuUmF0aW9RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5TaXplUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVG91Y2hTY3JlZW5RdWFsaWZpZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBsYXlvdXQgZGV2aWNlLgotICoKLSAqIEEgTGF5b3V0IGRldmljZSBpcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIEFuZHJvaWQKLSAqIGxheW91dCBmaWxlcy4KLSAqCi0gKiBJdCBhbHNvIGNvbnRhaW5zIGEgc2luZ2xlIHhkcGkveWRwaSB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0uCi0gKgotICogSWYgdGhlIGRldmljZSBpcyBtZWFudCB0byByZXByZXNlbnQgYSB0cnVlIGRldmljZSwgdGhlbiBtb3N0IG9mIHRoZSBGb2xkZXJDb25maWd1cmF0aW9ucycgY29udGVudAotICogc2hvdWxkIGJlIGlkZW50aWNhbCwgd2l0aCBvbmx5IGEgZmV3IHF1YWxpZmllcnMgKG9yaWVudGF0aW9uLCBrZXlib2FyZCBzdGF0ZSkgdGhhdCB3b3VsZCBkaWZmZXIuCi0gKiBIb3dldmVyIGl0IGlzIHNpbXBsZXIgdG8gcmV1c2UgdGhlIEZvbGRlckNvbmZpZ3VyYXRpb24gY2xhc3MgKHdpdGggdGhlIG5vbiBjaGFuZ2luZyBxdWFsaWZpZXJzCi0gKiBkdXBsaWNhdGVkIGluIGVhY2ggY29uZmlndXJhdGlvbikgYXMgaXQncyB3aGF0J3MgYmVpbmcgdXNlZCBieSB0aGUgcmVuZGVyaW5nIGxpYnJhcnkuCi0gKgotICogVG8gY3JlYXRlLCBlZGl0IGFuZCBkZWxldGUgTGF5b3V0RGV2aWNlIG9iamVjdHMsIHNlZSB7QGxpbmsgTGF5b3V0RGV2aWNlTWFuYWdlcn0uCi0gKiBUaGUgY2xhc3MgaXMgbm90IHRlY2huaWNhbGx5IGltbXV0YWJsZSBidXQgYmVoYXZlcyBhcyBzdWNoIG91dHNpZGUgb2YgaXRzIHBhY2thZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXREZXZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7Ci0KLSAgICAvKiogZWRpdGFibGUgbWFwIG9mIHRoZSBjb25maWcgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZvbGRlckNvbmZpZ3VyYXRpb24+IG1FZGl0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGb2xkZXJDb25maWd1cmF0aW9uPigpOwotICAgIC8qKiB1bm1vZGlmaWFibGUgbWFwIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Q29uZmlncygpfS4gKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZvbGRlckNvbmZpZ3VyYXRpb24+IG1NYXA7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWERwaSA9IEZsb2F0Lk5hTjsKLSAgICBwcml2YXRlIGZsb2F0IG1ZRHBpID0gRmxvYXQuTmFOOwotCi0gICAgTGF5b3V0RGV2aWNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgTGF5b3V0IERldmljZSBpbnRvIGEgZG9jdW1lbnQgdW5kZXIgYSBnaXZlbiBub2RlCi0gICAgICogQHBhcmFtIGRvYyB0aGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHBhcmVudE5vZGUgdGhlIHBhcmVudCBub2RlLgotICAgICAqLwotICAgIHZvaWQgc2F2ZVRvKERvY3VtZW50IGRvYywgRWxlbWVudCBwYXJlbnROb2RlKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZGV2aWNlIG5vZGUKLSAgICAgICAgRWxlbWVudCBkZXZpY2VOb2RlID0gY3JlYXRlTm9kZShkb2MsIHBhcmVudE5vZGUsIExheW91dERldmljZXNYc2QuTk9ERV9ERVZJQ0UpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbmFtZSBhdHRyaWJ1dGUgKG5vIG5hbWVzcGFjZSBvbiB0aGlzIG9uZSkuCi0gICAgICAgIGRldmljZU5vZGUuc2V0QXR0cmlidXRlKExheW91dERldmljZXNYc2QuQVRUUl9OQU1FLCBtTmFtZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCB3aXRoIHRoZSB4L3kgZHBpCi0gICAgICAgIEVsZW1lbnQgZGVmYXVsdE5vZGUgPSBjcmVhdGVOb2RlKGRvYywgZGV2aWNlTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0RFRkFVTFQpOwotICAgICAgICBpZiAoRmxvYXQuaXNOYU4obVhEcGkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHhkcGlOb2RlID0gY3JlYXRlTm9kZShkb2MsIGRlZmF1bHROb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfWERQSSk7Ci0gICAgICAgICAgICB4ZHBpTm9kZS5zZXRUZXh0Q29udGVudChGbG9hdC50b1N0cmluZyhtWERwaSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGbG9hdC5pc05hTihtWURwaSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgeGRwaU5vZGUgPSBjcmVhdGVOb2RlKGRvYywgZGVmYXVsdE5vZGUsIExheW91dERldmljZXNYc2QuTk9ERV9ZRFBJKTsKLSAgICAgICAgICAgIHhkcGlOb2RlLnNldFRleHRDb250ZW50KEZsb2F0LnRvU3RyaW5nKG1ZRHBpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVuIHNhdmUgYWxsIHRoZSBjb25maWdzLgotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgRm9sZGVyQ29uZmlndXJhdGlvbj4gZW50cnkgOiBtRWRpdE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzYXZlQ29uZmlnVG8oZG9jLCBkZXZpY2VOb2RlLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IE5TLWVuYWJsZWQgbm9kZS4KLSAgICAgKiBAcGFyYW0gZG9jIHRoZSB7QGxpbmsgRG9jdW1lbnR9Ci0gICAgICogQHBhcmFtIHBhcmVudE5vZGUgdGhlIHBhcmVudCBub2RlLiBUaGUgbmV3IG5vZGUgaXMgYXBwZW5kZWQgdG8gdGhpcyBvbmUgYXMgYSBjaGlsZC4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZU5vZGUoRG9jdW1lbnQgZG9jLCBFbGVtZW50IHBhcmVudE5vZGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEVsZW1lbnQgbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICAgICAgTGF5b3V0RGV2aWNlc1hzZC5OU19MQVlPVVRfREVWSUNFX1hTRCwgbmFtZSk7Ci0gICAgICAgIG5ld05vZGUuc2V0UHJlZml4KGRvYy5sb29rdXBQcmVmaXgoTGF5b3V0RGV2aWNlc1hzZC5OU19MQVlPVVRfREVWSUNFX1hTRCkpOwotICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpOwotCi0gICAgICAgIHJldHVybiBuZXdOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIGEge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259IGluIGEge0BsaW5rIERvY3VtZW50fS4KLSAgICAgKiBAcGFyYW0gZG9jIHRoZSBEb2N1bWVudCBpbiB3aGljaCB0byBzYXZlCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG5vZGUKLSAgICAgKiBAcGFyYW0gY29uZmlnTmFtZSB0aGUgbmFtZSBvZiB0aGUgY29uZmlnCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlnIHRvIHNhdmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZUNvbmZpZ1RvKERvY3VtZW50IGRvYywgRWxlbWVudCBwYXJlbnQsIFN0cmluZyBjb25maWdOYW1lLAotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgRWxlbWVudCBjb25maWdOb2RlID0gY3JlYXRlTm9kZShkb2MsIHBhcmVudCwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0NPTkZJRyk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBuYW1lIGF0dHJpYnV0ZSAobm8gbmFtZXNwYWNlIG9uIHRoaXMgb25lKS4KLSAgICAgICAgY29uZmlnTm9kZS5zZXRBdHRyaWJ1dGUoTGF5b3V0RGV2aWNlc1hzZC5BVFRSX05BTUUsIGNvbmZpZ05hbWUpOwotCi0gICAgICAgIC8vIG5vdyBkbyB0aGUgcXVhbGlmaWVycwotICAgICAgICBDb3VudHJ5Q29kZVF1YWxpZmllciBjY3EgPSBjb25maWcuZ2V0Q291bnRyeUNvZGVRdWFsaWZpZXIoKTsKLSAgICAgICAgaWYgKGNjcSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IG5vZGUgPSBjcmVhdGVOb2RlKGRvYywgY29uZmlnTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0NPVU5UUllfQ09ERSk7Ci0gICAgICAgICAgICBub2RlLnNldFRleHRDb250ZW50KEludGVnZXIudG9TdHJpbmcoY2NxLmdldENvZGUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmV0d29ya0NvZGVRdWFsaWZpZXIgbmNxID0gY29uZmlnLmdldE5ldHdvcmtDb2RlUXVhbGlmaWVyKCk7Ci0gICAgICAgIGlmIChuY3EgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBub2RlID0gY3JlYXRlTm9kZShkb2MsIGNvbmZpZ05vZGUsIExheW91dERldmljZXNYc2QuTk9ERV9ORVRXT1JLX0NPREUpOwotICAgICAgICAgICAgbm9kZS5zZXRUZXh0Q29udGVudChJbnRlZ2VyLnRvU3RyaW5nKG5jcS5nZXRDb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjcmVlblNpemVRdWFsaWZpZXIgc3NxID0gY29uZmlnLmdldFNjcmVlblNpemVRdWFsaWZpZXIoKTsKLSAgICAgICAgaWYgKHNzcSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IG5vZGUgPSBjcmVhdGVOb2RlKGRvYywgY29uZmlnTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NDUkVFTl9TSVpFKTsKLSAgICAgICAgICAgIG5vZGUuc2V0VGV4dENvbnRlbnQoc3NxLmdldEZvbGRlclNlZ21lbnQobnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2NyZWVuUmF0aW9RdWFsaWZpZXIgc3JxID0gY29uZmlnLmdldFNjcmVlblJhdGlvUXVhbGlmaWVyKCk7Ci0gICAgICAgIGlmIChzcnEgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBub2RlID0gY3JlYXRlTm9kZShkb2MsIGNvbmZpZ05vZGUsIExheW91dERldmljZXNYc2QuTk9ERV9TQ1JFRU5fUkFUSU8pOwotICAgICAgICAgICAgbm9kZS5zZXRUZXh0Q29udGVudChzcnEuZ2V0Rm9sZGVyU2VnbWVudChudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllciBzb3EgPSBjb25maWcuZ2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKTsKLSAgICAgICAgaWYgKHNvcSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IG5vZGUgPSBjcmVhdGVOb2RlKGRvYywgY29uZmlnTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NDUkVFTl9PUklFTlRBVElPTik7Ci0gICAgICAgICAgICBub2RlLnNldFRleHRDb250ZW50KHNvcS5nZXRGb2xkZXJTZWdtZW50KG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBpeGVsRGVuc2l0eVF1YWxpZmllciBwZHEgPSBjb25maWcuZ2V0UGl4ZWxEZW5zaXR5UXVhbGlmaWVyKCk7Ci0gICAgICAgIGlmIChwZHEgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBub2RlID0gY3JlYXRlTm9kZShkb2MsIGNvbmZpZ05vZGUsIExheW91dERldmljZXNYc2QuTk9ERV9QSVhFTF9ERU5TSVRZKTsKLSAgICAgICAgICAgIG5vZGUuc2V0VGV4dENvbnRlbnQocGRxLmdldEZvbGRlclNlZ21lbnQobnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVG91Y2hTY3JlZW5RdWFsaWZpZXIgdHRxID0gY29uZmlnLmdldFRvdWNoVHlwZVF1YWxpZmllcigpOwotICAgICAgICBpZiAodHRxICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IGNyZWF0ZU5vZGUoZG9jLCBjb25maWdOb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfVE9VQ0hfVFlQRSk7Ci0gICAgICAgICAgICBub2RlLnNldFRleHRDb250ZW50KHR0cS5nZXRGb2xkZXJTZWdtZW50KG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIga3NxID0gY29uZmlnLmdldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoKTsKLSAgICAgICAgaWYgKGtzcSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IG5vZGUgPSBjcmVhdGVOb2RlKGRvYywgY29uZmlnTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0tFWUJPQVJEX1NUQVRFKTsKLSAgICAgICAgICAgIG5vZGUuc2V0VGV4dENvbnRlbnQoa3NxLmdldEZvbGRlclNlZ21lbnQobnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyIHRpbXEgPSBjb25maWcuZ2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCk7Ci0gICAgICAgIGlmICh0aW1xICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IGNyZWF0ZU5vZGUoZG9jLCBjb25maWdOb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfVEVYVF9JTlBVVF9NRVRIT0QpOwotICAgICAgICAgICAgbm9kZS5zZXRUZXh0Q29udGVudCh0aW1xLmdldEZvbGRlclNlZ21lbnQobnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllciBubXEgPSBjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpOwotICAgICAgICBpZiAobm1xICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IGNyZWF0ZU5vZGUoZG9jLCBjb25maWdOb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfTkFWX01FVEhPRCk7Ci0gICAgICAgICAgICBub2RlLnNldFRleHRDb250ZW50KG5tcS5nZXRGb2xkZXJTZWdtZW50KG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBzZHEgPSBjb25maWcuZ2V0U2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKCk7Ci0gICAgICAgIGlmIChzZHEgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBzaXplTm9kZSA9IGNyZWF0ZU5vZGUoZG9jLCBjb25maWdOb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfU0NSRUVOX0RJTUVOU0lPTik7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IGNyZWF0ZU5vZGUoZG9jLCBzaXplTm9kZSwgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NJWkUpOwotICAgICAgICAgICAgbm9kZS5zZXRUZXh0Q29udGVudChJbnRlZ2VyLnRvU3RyaW5nKHNkcS5nZXRWYWx1ZTEoKSkpOwotCi0gICAgICAgICAgICBub2RlID0gY3JlYXRlTm9kZShkb2MsIHNpemVOb2RlLCBMYXlvdXREZXZpY2VzWHNkLk5PREVfU0laRSk7Ci0gICAgICAgICAgICBub2RlLnNldFRleHRDb250ZW50KEludGVnZXIudG9TdHJpbmcoc2RxLmdldFZhbHVlMigpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZENvbmZpZyhTdHJpbmcgbmFtZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgbUVkaXRNYXAucHV0KG5hbWUsIGNvbmZpZyk7Ci0gICAgICAgIF9zZWFsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRDb25maWdzKE1hcDxTdHJpbmcsIEZvbGRlckNvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKLSAgICAgICAgbUVkaXRNYXAucHV0QWxsKGNvbmZpZ3MpOwotICAgICAgICBfc2VhbCgpOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlQ29uZmlnKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1FZGl0TWFwLnJlbW92ZShuYW1lKTsKLSAgICAgICAgX3NlYWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGNvbmZpZyB0byB0aGUgTGF5b3V0RGV2aWNlLiBUaGlzIGlzIHRvIGJlIHVzZWQgdG8gYWRkIHBsZW50eSBvZiBjb25maWd1cmF0aW9ucy4KLSAgICAgKiBJdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjX3NlYWwoKX0uCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZwotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZy4KLSAgICAgKi8KLSAgICB2b2lkIF9hZGRDb25maWcoU3RyaW5nIG5hbWUsIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIG1FZGl0TWFwLnB1dChuYW1lLCBjb25maWcpOwotICAgIH0KLQotICAgIHZvaWQgX3NlYWwoKSB7Ci0gICAgICAgIG1NYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobUVkaXRNYXApOwotICAgIH0KLQotICAgIHZvaWQgc2V0WERwaShmbG9hdCB4ZHBpKSB7Ci0gICAgICAgIG1YRHBpID0geGRwaTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFlEcGkoZmxvYXQgeWRwaSkgewotICAgICAgICBtWURwaSA9IHlkcGk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEZvbGRlckNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRwaSBvZiB0aGUgRGV2aWNlIHNjcmVlbiBpbiBYLgotICAgICAqIEByZXR1cm4gdGhlIGRwaSBvZiBzY3JlZW4gb3Ige0BsaW5rIEZsb2F0I05hTn0gaWYgaXQncyBub3Qgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRYRHBpKCkgewotICAgICAgICByZXR1cm4gbVhEcGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZHBpIG9mIHRoZSBEZXZpY2Ugc2NyZWVuIGluIFkuCi0gICAgICogQHJldHVybiB0aGUgZHBpIG9mIHNjcmVlbiBvciB7QGxpbmsgRmxvYXQjTmFOfSBpZiBpdCdzIG5vdCBzZXQuCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldFlEcGkoKSB7Ci0gICAgICAgIHJldHVybiBtWURwaTsKLSAgICB9Ci0gfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXREZXZpY2VIYW5kbGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNGU1ZC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkNvdW50cnlDb2RlUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLktleWJvYXJkU3RhdGVRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5OYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTmV0d29ya0NvZGVRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5QaXhlbERlbnNpdHlRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlblJhdGlvUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuU2l6ZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRleHRJbnB1dE1ldGhvZFF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuS2V5Ym9hcmRTdGF0ZVF1YWxpZmllci5LZXlib2FyZFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5OYXZpZ2F0aW9uTWV0aG9kOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLkRlbnNpdHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlblJhdGlvUXVhbGlmaWVyLlNjcmVlblJhdGlvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuU2l6ZVF1YWxpZmllci5TY3JlZW5TaXplOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLlRleHRJbnB1dE1ldGhvZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyLlRvdWNoU2NyZWVuVHlwZTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHtAbGluayBEZWZhdWx0SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gdG8gcGFyc2UgTGF5b3V0IERldmljZSBYTUwgZmlsZS4KLSAqIEBzZWUgTGF5b3V0RGV2aWNlc1hzZAotICogQHNlZSBMYXlvdXQtY29uZmlncy54c2QKLSAqLwotY2xhc3MgTGF5b3V0RGV2aWNlSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLSAgICAvKgotICAgICAqIFRoZSBoYW5kbGVyIGRvZXMgbW9zdCBvZiB0aGUgd29yayBpbiBzdGFydEVsZW1lbnQgYW5kIGVuZEVsZW1lbnQuCi0gICAgICogSW4gc3RhcnRFbGVtZW50LCBpdCdsbCBjcmVhdGUgRGV2aWNlQ29uZmlndXJhdGlvbiBvbiA8ZGV2aWNlPiwgYXMgd2VsbCBhcwotICAgICAqIEZvbGRlckNvbmZpZ3VyYXRpb24gaW5zdGFuY2VzIG9uIDxkZWZhdWx0PiBhbmQgPGNvbmZpZz4uCi0gICAgICogVGhvc2Ugb2JqZWN0cyBhcmUgdGhlbiBmaWxsZWQgYXMgbmV3IG5vZGVzIGFyZSBkaXNjb3ZlcmVkLgotICAgICAqCi0gICAgICogRm9yIHRoZSBxdWFsaWZpZXIgdmFsdWVzLCB0aGUgcXVhbGlmaWVyIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBjdXJyZW50IGNvbmZpZwotICAgICAqIG9uIHRoZSBlbmRFbGVtZW50LCBieSB1c2luZyB0aGUgY29udGVudCBmb3VuZCBpbiBjaGFyYWN0ZXJzKCkuCi0gICAgICovCi0KLSAgICBwcml2YXRlIExpc3Q8TGF5b3V0RGV2aWNlPiBtRGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8TGF5b3V0RGV2aWNlPigpOwotCi0gICAgcHJpdmF0ZSBMYXlvdXREZXZpY2UgbUN1cnJlbnREZXZpY2U7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIG1EZWZhdWx0Q29uZmlnOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBtQ3VycmVudENvbmZpZzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbVN0cmluZ0FjY3VtdWxhdG9yID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1TaXplMSwgbVNpemUyOwotCi0gICAgcHVibGljIExpc3Q8TGF5b3V0RGV2aWNlPiBnZXREZXZpY2VzKCkgewotICAgICAgICByZXR1cm4gbURldmljZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExheW91dERldmljZXNYc2QuTk9ERV9ERVZJQ0UuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgZGV2aWNlTmFtZSwgd2lsbCBub3QgYmUgbnVsbCBzaW5jZSB3ZSB2YWxpZGF0ZWQgdGhlIFhNTC4KLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgTGF5b3V0RGV2aWNlc1hzZC5BVFRSX05BTUUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBkZXZpY2UgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgbUN1cnJlbnREZXZpY2UgPSBuZXcgTGF5b3V0RGV2aWNlKGRldmljZU5hbWUpOwotICAgICAgICAgICAgbURldmljZXMuYWRkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfREVGQVVMVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGRlZmF1bHQgY29uZmlnCi0gICAgICAgICAgICBtRGVmYXVsdENvbmZpZyA9IG1DdXJyZW50Q29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfQ09ORklHLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29uZmlnCi0gICAgICAgICAgICBtQ3VycmVudENvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIGluaXQgd2l0aCBkZWZhdWx0IGNvbmZpZyBpZiBhcHBsaWNhYmxlCi0gICAgICAgICAgICBpZiAobURlZmF1bHRDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldChtRGVmYXVsdENvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgY29uZmlnCi0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIExheW91dERldmljZXNYc2QuQVRUUl9OQU1FKTsKLQotICAgICAgICAgICAgLy8gZ2l2ZSBpdCB0byB0aGUgY3VycmVudCBkZXZpY2UuCi0gICAgICAgICAgICBtQ3VycmVudERldmljZS5hZGRDb25maWcoZGV2aWNlTmFtZSwgbUN1cnJlbnRDb25maWcpOwotICAgICAgICB9IGVsc2UgaWYgKExheW91dERldmljZXNYc2QuTk9ERV9TQ1JFRU5fRElNRU5TSU9OLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBtU2l6ZTEgPSBtU2l6ZTIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0cmluZ0FjY3VtdWxhdG9yLnNldExlbmd0aCgwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgbVN0cmluZ0FjY3VtdWxhdG9yLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfREVWSUNFLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudERldmljZSA9IG51bGw7Ci0gICAgICAgICAgICBtRGVmYXVsdENvbmZpZyA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0NPTkZJRy5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgbUN1cnJlbnRDb25maWcgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKExheW91dERldmljZXNYc2QuTk9ERV9DT1VOVFJZX0NPREUuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIENvdW50cnlDb2RlUXVhbGlmaWVyIGNjcSA9IG5ldyBDb3VudHJ5Q29kZVF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgbUN1cnJlbnRDb25maWcuc2V0Q291bnRyeUNvZGVRdWFsaWZpZXIoY2NxKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfTkVUV09SS19DT0RFLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBOZXR3b3JrQ29kZVF1YWxpZmllciBuY3EgPSBuZXcgTmV0d29ya0NvZGVRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQobVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldE5ldHdvcmtDb2RlUXVhbGlmaWVyKG5jcSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NDUkVFTl9TSVpFLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBTY3JlZW5TaXplUXVhbGlmaWVyIHNzcSA9IG5ldyBTY3JlZW5TaXplUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICBTY3JlZW5TaXplLmdldEVudW0obVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldFNjcmVlblNpemVRdWFsaWZpZXIoc3NxKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfU0NSRUVOX1JBVElPLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBTY3JlZW5SYXRpb1F1YWxpZmllciBzcnEgPSBuZXcgU2NyZWVuUmF0aW9RdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgIFNjcmVlblJhdGlvLmdldEVudW0obVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldFNjcmVlblJhdGlvUXVhbGlmaWVyKHNycSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NDUkVFTl9PUklFTlRBVElPTi5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIgc29xID0gbmV3IFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICBTY3JlZW5PcmllbnRhdGlvbi5nZXRFbnVtKG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5zZXRTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcihzb3EpOwotICAgICAgICB9IGVsc2UgaWYgKExheW91dERldmljZXNYc2QuTk9ERV9QSVhFTF9ERU5TSVRZLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBQaXhlbERlbnNpdHlRdWFsaWZpZXIgcGRxID0gbmV3IFBpeGVsRGVuc2l0eVF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgRGVuc2l0eS5nZXRFbnVtKG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5zZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIocGRxKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfVE9VQ0hfVFlQRS5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgVG91Y2hTY3JlZW5RdWFsaWZpZXIgdHNxID0gbmV3IFRvdWNoU2NyZWVuUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICBUb3VjaFNjcmVlblR5cGUuZ2V0RW51bShtU3RyaW5nQWNjdW11bGF0b3IudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgbUN1cnJlbnRDb25maWcuc2V0VG91Y2hUeXBlUXVhbGlmaWVyKHRzcSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0tFWUJPQVJEX1NUQVRFLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBLZXlib2FyZFN0YXRlUXVhbGlmaWVyIGtzcSA9IG5ldyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICBLZXlib2FyZFN0YXRlLmdldEVudW0obVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoa3NxKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfVEVYVF9JTlBVVF9NRVRIT0QuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIFRleHRJbnB1dE1ldGhvZFF1YWxpZmllciB0aW1xID0gbmV3IFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgVGV4dElucHV0TWV0aG9kLmdldEVudW0obVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnLnNldFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcih0aW1xKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfTkFWX01FVEhPRC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllciBubXEgPSBuZXcgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGlvbk1ldGhvZC5nZXRFbnVtKG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBtQ3VycmVudENvbmZpZy5zZXROYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKG5tcSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NDUkVFTl9ESU1FTlNJT04uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBxdWFsID0gU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyLmdldFF1YWxpZmllcihtU2l6ZTEsIG1TaXplMik7Ci0gICAgICAgICAgICBpZiAocXVhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRDb25maWcuc2V0U2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKHF1YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKExheW91dERldmljZXNYc2QuTk9ERV9YRFBJLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudERldmljZS5zZXRYRHBpKEZsb2F0LnBhcnNlRmxvYXQobVN0cmluZ0FjY3VtdWxhdG9yLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChMYXlvdXREZXZpY2VzWHNkLk5PREVfWURQSS5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgbUN1cnJlbnREZXZpY2Uuc2V0WURwaShGbG9hdC5wYXJzZUZsb2F0KG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTGF5b3V0RGV2aWNlc1hzZC5OT0RFX1NJWkUuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZTEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TaXplMSA9IG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZTIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TaXplMiA9IG1TdHJpbmdBY2N1bXVsYXRvci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXREZXZpY2VNYW5hZ2VyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxOWYxNy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQucHJlZnMuQW5kcm9pZExvY2F0aW9uLkFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGxheW91dCBkZXZpY2VzLgotICogVGhleSBjYW4gY29tZSBmcm9tIDMgc291cmNlczogYnVpbHQtaW4sIGFkZC1vbnMsIHVzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXREZXZpY2VNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIEEgU0FYIGVycm9yIGhhbmRsZXIgdGhhdCBjYXB0dXJlcyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSAgICAgKiBUaGlzIGFsbG93cyB1cyB0byBjYXB0dXJlICphbGwqIGVycm9ycyBhbmQganVzdCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiBvbiB0aGUgZmlyc3Qgb25lLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhcHR1cmVFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3VyY2VMb2NhdGlvbjsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUZvdW5kRXJyb3IgPSBmYWxzZTsKLQotICAgICAgICBDYXB0dXJlRXJyb3JIYW5kbGVyKFN0cmluZyBzb3VyY2VMb2NhdGlvbikgewotICAgICAgICAgICAgbVNvdXJjZUxvY2F0aW9uID0gc291cmNlTG9jYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmb3VuZEVycm9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3VuZEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtRm91bmRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGV4LCAiRXJyb3IgdmFsaWRhdGluZyAlMSRzIiwgbVNvdXJjZUxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtRm91bmRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGV4LCAiRXJyb3IgdmFsaWRhdGluZyAlMSRzIiwgbVNvdXJjZUxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgdGhvc2UgZm9yIG5vdy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU0FYUGFyc2VyRmFjdG9yeSBtUGFyc2VyRmFjdG9yeTsKLQotICAgIHByaXZhdGUgTGlzdDxMYXlvdXREZXZpY2U+IG1EZWZhdWx0TGF5b3V0RGV2aWNlcyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8TGF5b3V0RGV2aWNlPigpOwotICAgIHByaXZhdGUgTGlzdDxMYXlvdXREZXZpY2U+IG1BZGRPbkxheW91dERldmljZXMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PExheW91dERldmljZT4oKTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8TGF5b3V0RGV2aWNlPiBtVXNlckxheW91dERldmljZXMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PExheW91dERldmljZT4oKTsKLSAgICBwcml2YXRlIExpc3Q8TGF5b3V0RGV2aWNlPiBtTGF5b3V0RGV2aWNlczsKLQotICAgIExheW91dERldmljZU1hbmFnZXIoKSB7Ci0gICAgICAgIG1QYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBtUGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxMYXlvdXREZXZpY2U+IGdldENvbWJpbmVkTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXlvdXREZXZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PExheW91dERldmljZT4gZ2V0RGVmYXVsdExheW91dERldmljZXMoKSB7Ci0gICAgICAgIHJldHVybiBtRGVmYXVsdExheW91dERldmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TGF5b3V0RGV2aWNlPiBnZXRBZGRPbkxheW91dERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BZGRPbkxheW91dERldmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TGF5b3V0RGV2aWNlPiBnZXRVc2VyTGF5b3V0RGV2aWNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Vc2VyTGF5b3V0RGV2aWNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGF5b3V0RGV2aWNlIGdldFVzZXJMYXlvdXREZXZpY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChMYXlvdXREZXZpY2UgZCA6IG1Vc2VyTGF5b3V0RGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExheW91dERldmljZSBhZGRVc2VyRGV2aWNlKFN0cmluZyBuYW1lLCBmbG9hdCB4ZHBpLCBmbG9hdCB5ZHBpKSB7Ci0gICAgICAgIExheW91dERldmljZSBkID0gbmV3IExheW91dERldmljZShuYW1lKTsKLSAgICAgICAgZC5zZXRYRHBpKHhkcGkpOwotICAgICAgICBkLnNldFlEcGkoeWRwaSk7Ci0gICAgICAgIG1Vc2VyTGF5b3V0RGV2aWNlcy5hZGQoZCk7Ci0gICAgICAgIGNvbWJpbmVMYXlvdXREZXZpY2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVXNlckRldmljZShMYXlvdXREZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChtVXNlckxheW91dERldmljZXMucmVtb3ZlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGNvbWJpbmVMYXlvdXREZXZpY2VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhIGRldmljZSB3aXRoIGEgbmV3IG9uZSB3aXRoIG5ldyBuYW1lIGFuZC9vciB4L3kgZHBpLCBhbmQgcmV0dXJuIHRoZSBuZXcgZGV2aWNlLgotICAgICAqIElmIHRoZSBuYW1lIGFuZCBkcGkgdmFsdWVzIGFyZSBpZGVudGljYWwgdGhlIGdpdmVuIGRldmljZSBpcyByZXR1cm5lZCBhbiBub3RoaW5nIGlzIGRvbmUKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSB7QGxpbmsgTGF5b3V0RGV2aWNlfSB0byByZXBsYWNlCi0gICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5ldyBuYW1lLgotICAgICAqIEBwYXJhbSBuZXdYRHBpIHRoZSBuZXcgWCBkcGkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbmV3WURwaSB0aGUgbmV3IFkgZHBpIHZhbHVlLgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBMYXlvdXREZXZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0RGV2aWNlIHJlcGxhY2VVc2VyRGV2aWNlKExheW91dERldmljZSBkZXZpY2UsIFN0cmluZyBuZXdOYW1lLAotICAgICAgICAgICAgZmxvYXQgbmV3WERwaSwgZmxvYXQgbmV3WURwaSkgewotICAgICAgICBpZiAoZGV2aWNlLmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkgJiYgZGV2aWNlLmdldFhEcGkoKSA9PSBuZXdYRHBpICYmCi0gICAgICAgICAgICAgICAgZGV2aWNlLmdldFlEcGkoKSA9PSBuZXdZRHBpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZWxzZSBjcmVhdGUgYSBuZXcgZGV2aWNlCi0gICAgICAgIExheW91dERldmljZSBuZXdEZXZpY2UgPSBuZXcgTGF5b3V0RGV2aWNlKG5ld05hbWUpOwotICAgICAgICBuZXdEZXZpY2Uuc2V0WERwaShuZXdYRHBpKTsKLSAgICAgICAgbmV3RGV2aWNlLnNldFlEcGkobmV3WURwaSk7Ci0KLSAgICAgICAgLy8gYW5kIGdldCB0aGUgRm9sZGVyY29uZmlndXJhdGlvbgotICAgICAgICBNYXA8U3RyaW5nLCBGb2xkZXJDb25maWd1cmF0aW9uPiBjb25maWdzID0gZGV2aWNlLmdldENvbmZpZ3MoKTsKLSAgICAgICAgbmV3RGV2aWNlLmFkZENvbmZpZ3MoY29uZmlncyk7Ci0KLSAgICAgICAgLy8gcmVwbGFjZSB0aGUgb2xkIGRldmljZSB3aXRoIHRoZSBuZXcKLSAgICAgICAgbVVzZXJMYXlvdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwotICAgICAgICBtVXNlckxheW91dERldmljZXMuYWRkKG5ld0RldmljZSk7Ci0gICAgICAgIGNvbWJpbmVMYXlvdXREZXZpY2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ld0RldmljZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEFkZHMgb3IgcmVwbGFjZXMgYSBjb25maWd1cmF0aW9uIGluIGEgZ2l2ZW4ge0BsaW5rIExheW91dERldmljZX0uCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRvIG1vZGlmeQotICAgICAqIEBwYXJhbSBjb25maWdOYW1lIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgdG8gYWRkIG9yIHJlcGxhY2UKLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFVzZXJDb25maWd1cmF0aW9uKExheW91dERldmljZSBkZXZpY2UsIFN0cmluZyBjb25maWdOYW1lLAotICAgICAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgZGV2aWNlIGRvZXMgYmVsb25nIHRvIHRoZSB1c2VyIGxpc3QuCi0gICAgICAgIC8vIHRoZSBtYWluIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQvYWRkb24gbGlzdC4KLSAgICAgICAgaWYgKG1Vc2VyTGF5b3V0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBkZXZpY2UuYWRkQ29uZmlnKGNvbmZpZ05hbWUsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhIGNvbmZpZ3VyYXRpb24gaW4gYSBnaXZlbiB7QGxpbmsgTGF5b3V0RGV2aWNlfS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2UgdG8gbW9kaWZ5Ci0gICAgICogQHBhcmFtIG9sZENvbmZpZ05hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZyB0byByZXBsYWNlLiBJZiBudWxsLCB0aGUgbmV3IGNvbmZpZyBpcyBzaW1wbHkKLSAgICAgKiBhZGRlZC4KLSAgICAgKiBAcGFyYW0gbmV3Q29uZmlnTmFtZSB0aGUgY29uZmlndXJhdGlvbiBuYW1lIHRvIGFkZCBvciByZXBsYWNlCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlVXNlckNvbmZpZ3VyYXRpb24oTGF5b3V0RGV2aWNlIGRldmljZSwgU3RyaW5nIG9sZENvbmZpZ05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbmV3Q29uZmlnTmFtZSwgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgZGV2aWNlIGRvZXMgYmVsb25nIHRvIHRoZSB1c2VyIGxpc3QuCi0gICAgICAgIC8vIHRoZSBtYWluIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQvYWRkb24gbGlzdC4KLSAgICAgICAgaWYgKG1Vc2VyTGF5b3V0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgb2xkIGFuZCBuZXcgY29uZmlnIG5hbWUgYXJlIGRpZmZlcmVudCwgcmVtb3ZlIHRoZSBvbGQgb25lCi0gICAgICAgICAgICBpZiAob2xkQ29uZmlnTmFtZSAhPSBudWxsICYmIG9sZENvbmZpZ05hbWUuZXF1YWxzKG5ld0NvbmZpZ05hbWUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLnJlbW92ZUNvbmZpZyhvbGRDb25maWdOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYW5kIHRoZW4gYWRkIHRoZSBuZXcgb25lCi0gICAgICAgICAgICBkZXZpY2UuYWRkQ29uZmlnKG5ld0NvbmZpZ05hbWUsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgY29uZmlndXJhdGlvbiBmcm9tIGEgZ2l2ZW4gdXNlciB7QGxpbmsgTGF5b3V0RGV2aWNlfQotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB0byBtb2RpZnkKLSAgICAgKiBAcGFyYW0gY29uZmlnTmFtZSB0aGUgbmFtZSBvZiB0aGUgY29uZmlnIHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVzZXJDb25maWd1cmF0aW9uKExheW91dERldmljZSBkZXZpY2UsIFN0cmluZyBjb25maWdOYW1lKSB7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGRldmljZSBkb2VzIGJlbG9uZyB0byB0aGUgdXNlciBsaXN0LgotICAgICAgICAvLyB0aGUgbWFpbiBnb2FsIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBkZWZhdWx0L2FkZG9uIGxpc3QuCi0gICAgICAgIGlmIChtVXNlckxheW91dERldmljZXMuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZGV2aWNlLnJlbW92ZUNvbmZpZyhjb25maWdOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSB1c2VyLW1hZGUge0BsaW5rIExheW91dERldmljZX1zIHRvIGRpc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB1c2VyRm9sZGVyID0gQW5kcm9pZExvY2F0aW9uLmdldEZvbGRlcigpOwotICAgICAgICAgICAgRmlsZSBkZXZpY2VYbWwgPSBuZXcgRmlsZSh1c2VyRm9sZGVyLCBTZGtDb25zdGFudHMuRk5fREVWSUNFU19YTUwpOwotICAgICAgICAgICAgaWYgKGRldmljZVhtbC5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGUoZGV2aWNlWG1sLCBtVXNlckxheW91dERldmljZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm8gdXNlciBmb2xkZXI/IHNpbXBseSBkb24ndCBzYXZlIHRoZSB1c2VyIGxheW91dCBkZXZpY2UuCi0gICAgICAgICAgICAvLyB3ZSBjb3VsZCBkaXNwbGF5IHRoZSBlcnJvciwgYnV0IGl0J3MgbGlrZWx5IHNvbWV0aGluZyBlbHNlIGRpZCBiZWZvcmUsIGFzCi0gICAgICAgICAgICAvLyBub3RoaW5nIHdpbGwgd29yayB3L28gaXQuCi0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJVbmFibGUgdG8gZmluZCB1c2VyIGRpcmVjdG9yeSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGRlZmF1bHQgYnVpbHQtaW4gYW5kIHVzZXIgY3JlYXRlZCBMYXlvdXQgRGV2aWNlcy4KLSAgICAgKiBAcGFyYW0gc2RrT3NMb2NhdGlvbiBsb2NhdGlvbiBvZiB0aGUgU0RLLgotICAgICAqLwotICAgIHZvaWQgbG9hZERlZmF1bHRBbmRVc2VyRGV2aWNlcyhTdHJpbmcgc2RrT3NMb2NhdGlvbikgewotICAgICAgICAvLyBsb2FkIHRoZSBkZWZhdWx0IGRldmljZXMKLSAgICAgICAgbG9hZERlZmF1bHRMYXlvdXREZXZpY2VzKHNka09zTG9jYXRpb24pOwotCi0gICAgICAgIC8vIGxvYWQgdGhlIHVzZXIgZGV2aWNlczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB1c2VyRm9sZGVyID0gQW5kcm9pZExvY2F0aW9uLmdldEZvbGRlcigpOwotICAgICAgICAgICAgRmlsZSBkZXZpY2VYbWwgPSBuZXcgRmlsZSh1c2VyRm9sZGVyLCBTZGtDb25zdGFudHMuRk5fREVWSUNFU19YTUwpOwotICAgICAgICAgICAgaWYgKGRldmljZVhtbC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIHBhcnNlTGF5b3V0RGV2aWNlcyhkZXZpY2VYbWwsIG1Vc2VyTGF5b3V0RGV2aWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBubyB1c2VyIGZvbGRlcj8gc2ltcGx5IGRvbid0IGxvYWQgdGhlIHVzZXIgbGF5b3V0IGRldmljZQotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiVW5hYmxlIHRvIGZpbmQgdXNlciBkaXJlY3RvcnkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcGFyc2VBZGRPbkxheW91dERldmljZShGaWxlIGRldmljZVhtbCkgewotICAgICAgICBwYXJzZUxheW91dERldmljZXMoZGV2aWNlWG1sLCBtQWRkT25MYXlvdXREZXZpY2VzKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlYWxBZGRvbkxheW91dERldmljZXMoKSB7Ci0gICAgICAgIG1BZGRPbkxheW91dERldmljZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1BZGRPbkxheW91dERldmljZXMpOwotCi0gICAgICAgIGNvbWJpbmVMYXlvdXREZXZpY2VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgYWN0dWFsIHBhcnNpbmcgb2YgYSBkZXZpY2VzLnhtbCBmaWxlLgotICAgICAqIEBwYXJhbSBkZXZpY2VYbWwgdGhlIHtAbGluayBGaWxlfSB0byBsb2FkL3BhcnNlLiBUaGlzIG11c3QgYmUgYW4gZXhpc3RpbmcgZmlsZS4KLSAgICAgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBpbiB3aGljaCB0byB3cml0ZSB0aGUgcGFyc2VkIHtAbGluayBMYXlvdXREZXZpY2V9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZUxheW91dERldmljZXMoRmlsZSBkZXZpY2VYbWwsIExpc3Q8TGF5b3V0RGV2aWNlPiBsaXN0KSB7Ci0gICAgICAgIC8vIGZpcnN0IHdlIHZhbGlkYXRlIHRoZSBYTUwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBGaWxlUmVhZGVyKGRldmljZVhtbCkpOwotCi0gICAgICAgICAgICBDYXB0dXJlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBDYXB0dXJlRXJyb3JIYW5kbGVyKGRldmljZVhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBMYXlvdXREZXZpY2VzWHNkLmdldFZhbGlkYXRvcihlcnJvckhhbmRsZXIpOwotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnJvckhhbmRsZXIuZm91bmRFcnJvcigpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gdGhlIGFjdHVhbCBwYXJzaW5nCi0gICAgICAgICAgICAgICAgTGF5b3V0RGV2aWNlSGFuZGxlciBoYW5kbGVyID0gbmV3IExheW91dERldmljZUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGV2aWNlWG1sKSksIGhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJzZWQgZGV2aWNlcwotICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKGhhbmRsZXIuZ2V0RGV2aWNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkVycm9yIHBhcnNpbmcgJTEkcyIsIGRldmljZVhtbC5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4gYXMgd2UgY2hlY2sgYWJvdmUuCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkVycm9yIHJlYWRpbmcgJTEkcyIsIGRldmljZVhtbC5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRXJyb3IgcGFyc2luZyAlMSRzIiwgZGV2aWNlWG1sLmdldEFic29sdXRlRmlsZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgc29tZSBidWlsdC1pdCBsYXlvdXQgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZERlZmF1bHRMYXlvdXREZXZpY2VzKFN0cmluZyBzZGtPc0xvY2F0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdDxMYXlvdXREZXZpY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExheW91dERldmljZT4oKTsKLSAgICAgICAgRmlsZSB0b29sc0ZvbGRlciA9IG5ldyBGaWxlKHNka09zTG9jYXRpb24sIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfTElCX0ZPTERFUik7Ci0gICAgICAgIGlmICh0b29sc0ZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlIGRldmljZVhtbCA9IG5ldyBGaWxlKHRvb2xzRm9sZGVyLCBTZGtDb25zdGFudHMuRk5fREVWSUNFU19YTUwpOwotICAgICAgICAgICAgaWYgKGRldmljZVhtbC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIHBhcnNlTGF5b3V0RGV2aWNlcyhkZXZpY2VYbWwsIGxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1EZWZhdWx0TGF5b3V0RGV2aWNlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbWJpbmVMYXlvdXREZXZpY2VzKCkgewotICAgICAgICBBcnJheUxpc3Q8TGF5b3V0RGV2aWNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMYXlvdXREZXZpY2U+KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKG1EZWZhdWx0TGF5b3V0RGV2aWNlcyk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKG1BZGRPbkxheW91dERldmljZXMpOwotICAgICAgICBsaXN0LmFkZEFsbChtVXNlckxheW91dERldmljZXMpOwotCi0gICAgICAgIG1MYXlvdXREZXZpY2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIHtAbGluayBMYXlvdXREZXZpY2V9cyBpbnRvIHRoZSBnaXZlbiBmaWxlLgotICAgICAqIEBwYXJhbSBkZXZpY2VYbWwgdGhlIGZpbGUgdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIGRldmljZUxpc3QgdGhlIExheW91dERldmljZSB0byB3cml0ZSBpbnRvIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZShGaWxlIGRldmljZVhtbCwgTGlzdDxMYXlvdXREZXZpY2U+IGRldmljZUxpc3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBkb2N1bWVudAotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgYmFzZSBub2RlCi0gICAgICAgICAgICBFbGVtZW50IGJhc2VOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUygKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0RGV2aWNlc1hzZC5OU19MQVlPVVRfREVWSUNFX1hTRCwKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0RGV2aWNlc1hzZC5OT0RFX0xBWU9VVF9ERVZJQ0VTKTsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJlZml4IGZvciB0aGUgbmFtZXNwYWNlCi0gICAgICAgICAgICBiYXNlTm9kZS5zZXRQcmVmaXgoImQiKTsKLSAgICAgICAgICAgIGRvYy5hcHBlbmRDaGlsZChiYXNlTm9kZSk7Ci0KLSAgICAgICAgICAgIC8vIGZpbGwgaXQgd2l0aCB0aGUgbGF5b3V0IGRldmljZXMuCi0gICAgICAgICAgICBmb3IgKExheW91dERldmljZSBkZXZpY2UgOiBkZXZpY2VMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLnNhdmVUbyhkb2MsIGJhc2VOb2RlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2F2ZSB0aGUgZG9jdW1lbnQgdG8gZGlzawotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgRE9NIGRvY3VtZW50IGZvciB3cml0aW5nCi0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotCi0gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGV2aWNlWG1sLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGZpbGUpOwotCi0gICAgICAgICAgICAvLyBXcml0ZSB0aGUgRE9NIGRvY3VtZW50IHRvIHRoZSBmaWxlCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB4Zm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgIHhmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byB3cml0ZSAlcyIsIGRldmljZVhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dERldmljZXNYc2QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvTGF5b3V0RGV2aWNlc1hzZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2U5NzE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvTGF5b3V0RGV2aWNlc1hzZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7DQotDQotDQotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIFB1YmxpYyBjb25zdGFudHMgZm9yIHRoZSBsYXlvdXQgZGV2aWNlIGRlc2NyaXB0aW9uIFhNTCBTY2hlbWEuDQotICovDQotcHVibGljIGNsYXNzIExheW91dERldmljZXNYc2Qgew0KLQ0KLSAgICAvKiogVGhlIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIGxheW91dC1jb25maWdzIFhNTC4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTEFZT1VUX0RFVklDRV9YU0QgPQ0KLSAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzEiOyAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSAibGF5b3V0LWRldmljZXMiIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHNjaGVtYS4NCi0gICAgICoNCi0gICAgICogSXQgbXVzdCBjb250YWluIG9uZSBvciBtb3JlICJkZXZpY2UiIGVsZW1lbnRzIHRoYXQgZWFjaCBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb25zDQotICAgICAqIGF2YWlsYWJsZSBmb3IgYSBnaXZlbiBkZXZpY2UuDQotICAgICAqDQotICAgICAqIFRoZXNlIGRlZmluaXRpb25zIGFyZSB1c2VkIGluIHRoZSBHcmFwaGljYWwgTGF5b3V0IEVkaXRvciBpbiB0aGUNCi0gICAgICogQW5kcm9pZCBEZXZlbG9wbWVudCBUb29scyAoQURUKSBwbHVnaW4gZm9yIEVjbGlwc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0xBWU9VVF9ERVZJQ0VTID0gImxheW91dC1kZXZpY2VzIjsgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIEEgZGV2aWNlIGVsZW1lbnQgbXVzdCBjb250YWluIGF0IG1vc3Qgb25lICJkZWZhdWx0IiBlbGVtZW50IGZvbGxvd2VkDQotICAgICAqIGJ5IG9uZSBvciBtb3JlICIiY29uZmlnIiBlbGVtZW50cy4NCi0gICAgICoNCi0gICAgICogVGhlICJkZWZhdWx0IiBlbGVtZW50IGRlZmluZXMgYWxsIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgaW5oZXJpdGVkDQotICAgICAqIGJ5IHRoZSBmb2xsb3dpbmcgImNvbmZpZyIgZWxlbWVudHMuIEVhY2ggImNvbmZpZyIgZWxlbWVudCBjYW4gb3ZlcnJpZGUNCi0gICAgICogdGhlIGRlZmF1bHQgdmFsdWVzLCBpZiBhbnkuDQotICAgICAqDQotICAgICAqIEEgImRldmljZSIgZWxlbWVudCBhbHNvIGhhcyBhIHJlcXVpcmVkICJuYW1lIiBhdHRyaWJ1dGUgdGhhdCByZXByZXNlbnRzDQotICAgICAqIHRoZSB1c2VyLWludGVyZmFjZSBuYW1lIG9mIHRoaXMgZGV2aWNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9ERVZJQ0UgPSAiZGV2aWNlIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgImRlZmF1bHQiIGVsZW1lbnQgY29udGFpbnMgemVybyBvciBtb3JlIG9mIGFsbCB0aGUgcGFyYW1ldGVyIGVsZW1lbnRzDQotICAgICAqIGxpc3RlZCBiZWxvdy4gSXQgZGVmaW5lcyBhbGwgdGhlIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbA0KLSAgICAgKiBkZWNsYXJlZCAiY29uZmlnIiBlbGVtZW50cy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfREVGQVVMVCA9ICJkZWZhdWx0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlICJjb25maWciIGVsZW1lbnQgY29udGFpbnMgemVybyBvciBtb3JlIG9mIGFsbCB0aGUgcGFyYW1ldGVyIGVsZW1lbnRzDQotICAgICAqIGxpc3RlZCBiZWxvdy4gVGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgImRlZmF1bHQiIGVsZW1lbnQgKGlmIHByZXNlbnQpIGFyZQ0KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBhbmQgY2FuIGJlIG92ZXJyaWRkZW4uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0NPTkZJRyA9ICJjb25maWciOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9DT1VOVFJZX0NPREUgPSAiY291bnRyeS1jb2RlIjsgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfTkVUV09SS19DT0RFID0gIm5ldHdvcmstY29kZSI7ICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1NDUkVFTl9TSVpFID0gInNjcmVlbi1zaXplIjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9TQ1JFRU5fUkFUSU8gPSAic2NyZWVuLXJhdGlvIjsgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfU0NSRUVOX09SSUVOVEFUSU9OID0gInNjcmVlbi1vcmllbnRhdGlvbiI7ICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BJWEVMX0RFTlNJVFkgPSAicGl4ZWwtZGVuc2l0eSI7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9UT1VDSF9UWVBFID0gInRvdWNoLXR5cGUiOyAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfS0VZQk9BUkRfU1RBVEUgPSAia2V5Ym9hcmQtc3RhdGUiOyAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1RFWFRfSU5QVVRfTUVUSE9EID0gInRleHQtaW5wdXQtbWV0aG9kIjsgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9OQVZfTUVUSE9EID0gIm5hdi1tZXRob2QiOyAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfU0NSRUVOX0RJTUVOU0lPTiA9ICJzY3JlZW4tZGltZW5zaW9uIjsgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogVGhlIHNjcmVlbi1kaW1lbnNpb24gZWxlbWVudCBoYXMgMiBzaXplIGVsZW1lbnQgY2hpbGRyZW4uICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfU0laRSA9ICJzaXplIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1hEUEkgPSAieGRwaSI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9ZRFBJID0gInlkcGkiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgIm5hbWUiIGF0dHJpYnV0ZSwgdXNlZCBieSBib3RoIHRoZSAiZGV2aWNlIiBhbmQgdGhlICJjb25maWciDQotICAgICAqIGVsZW1lbnRzLiBJdCByZXByZXNlbnRzIHRoZSB1c2VyLWludGVyZmFjZSBuYW1lIG9mIHRoZXNlIG9iamVjdHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIEhlbHBlciB0byBnZXQgYW4gaW5wdXQgc3RyZWFtIG9mIHRoZSBsYXlvdXQgY29uZmlnIFhNTCBzY2hlbWEuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldFhzZFN0cmVhbSgpIHsNCi0gICAgICAgIHJldHVybiBMYXlvdXREZXZpY2VzWHNkLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImxheW91dC1kZXZpY2VzLnhzZCIpOyAgICAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgLyoqIEhlbHBlciBtZXRob2QgdGhhdCByZXR1cm5zIGEge0BsaW5rIFZhbGlkYXRvcn0gZm9yIG91ciBYU0QgKi8NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKEVycm9ySGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0gICAgICAgIElucHV0U3RyZWFtIHhzZFN0cmVhbSA9IGdldFhzZFN0cmVhbSgpOw0KLSAgICAgICAgU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShYTUxDb25zdGFudHMuVzNDX1hNTF9TQ0hFTUFfTlNfVVJJKTsNCi0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5Lm5ld1NjaGVtYShuZXcgU3RyZWFtU291cmNlKHhzZFN0cmVhbSkpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNjaGVtYS5uZXdWYWxpZGF0b3IoKTsNCi0gICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dFBhcmFtc1BhcnNlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXRQYXJhbXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyNmFjYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL0xheW91dFBhcmFtc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BZHRQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5BdHRyc1htbFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5WaWV3Q2xhc3NJbmZvLkxheW91dFBhcmFtc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5JQW5kcm9pZENsYXNzTG9hZGVyLklDbGFzc0Rlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247Ci0KLS8qCi0gKiBUT0RPOiByZWZhY3RvciB0aGlzLiBDb3VsZCB1c2Ugc29tZSBjbGVhbnVwLgotICovCi0KLS8qKgotICogUGFyc2VyIGZvciB0aGUgZnJhbWV3b3JrIGxpYnJhcnkuCi0gKiA8cC8+Ci0gKiBUaGlzIGdhdGhlciB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotICogPHVsPgotICogPGxpPlJlc291cmNlIElEIGZyb20gPGNvZGU+YW5kcm9pZC5SPC9jb2RlPjwvbGk+Ci0gKiA8bGk+VGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdmFsdWVzIGZyb20gPGNvZGU+YW5kcm9pZC5NYW5pZmVzdCRwZXJtaXNzaW9uPC9jb2RlPjwvbGk+Ci0gKiA8bGk+PC9saT4KLSAqIDwvdWw+IAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0UGFyYW1zUGFyc2VyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGFzcyBleHRlbmRpbmcge0BsaW5rIFZpZXdDbGFzc0luZm99IGJ5IGFkZGluZyB0aGUgbm90aW9uIG9mIGluc3RhbnRpYWJpbGl0eS4KLSAgICAgKiB7QGxpbmsgTGF5b3V0UGFyYW1zUGFyc2VyI2dldFZpZXdzKCl9IGFuZCB7QGxpbmsgTGF5b3V0UGFyYW1zUGFyc2VyI2dldEdyb3VwcygpfSBzaG91bGQKLSAgICAgKiBvbmx5IHJldHVybiBjbGFzc2VzIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBmaW5hbCBzdGF0aWMgY2xhc3MgRXh0Vmlld0NsYXNzSW5mbyBleHRlbmRzIFZpZXdDbGFzc0luZm8gewotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNJbnN0YW50aWFibGU7Ci0KLSAgICAgICAgRXh0Vmlld0NsYXNzSW5mbyhib29sZWFuIGluc3RhbnRpYWJsZSwgYm9vbGVhbiBpc0xheW91dCwgU3RyaW5nIGNhbm9uaWNhbENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnRDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHN1cGVyKGlzTGF5b3V0LCBjYW5vbmljYWxDbGFzc05hbWUsIHNob3J0Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgIG1Jc0luc3RhbnRpYWJsZSA9IGluc3RhbnRpYWJsZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0luc3RhbnRpYWJsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNJbnN0YW50aWFibGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogTm90ZTogcHJvdGVjdGVkIG1lbWJlcnMvbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiBpbiB1bml0IHRlc3RzICovCi0gICAgCi0gICAgLyoqIFJlZmVyZW5jZSB0byBhbmRyb2lkLnZpZXcuVmlldyAqLwotICAgIHByb3RlY3RlZCBJQ2xhc3NEZXNjcmlwdG9yIG1Ub3BWaWV3Q2xhc3M7Ci0gICAgLyoqIFJlZmVyZW5jZSB0byBhbmRyb2lkLnZpZXcuVmlld0dyb3VwICovCi0gICAgcHJvdGVjdGVkIElDbGFzc0Rlc2NyaXB0b3IgbVRvcEdyb3VwQ2xhc3M7Ci0gICAgLyoqIFJlZmVyZW5jZSB0byBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyAqLwotICAgIHByb3RlY3RlZCBJQ2xhc3NEZXNjcmlwdG9yIG1Ub3BMYXlvdXRQYXJhbXNDbGFzczsKLSAgICAKLSAgICAvKiogSW5wdXQgbGlzdCBvZiBhbGwgY2xhc3NlcyBkZXJpdmluZyBmcm9tIGFuZHJvaWQudmlldy5WaWV3ICovCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPiBtVmlld0xpc3Q7Ci0gICAgLyoqIElucHV0IGxpc3Qgb2YgYWxsIGNsYXNzZXMgZGVyaXZpbmcgZnJvbSBhbmRyb2lkLnZpZXcuVmlld0dyb3VwICovCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPiBtR3JvdXBMaXN0OwotICAgIAotICAgIC8qKiBPdXRwdXQgbWFwIG9mIEZRQ04gPT4gaW5mbyBvbiBWaWV3IGNsYXNzZXMgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZU1hcDxTdHJpbmcsIEV4dFZpZXdDbGFzc0luZm8+IG1WaWV3TWFwOwotICAgIC8qKiBPdXRwdXQgbWFwIG9mIEZRQ04gPT4gaW5mbyBvbiBWaWV3R3JvdXAgY2xhc3NlcyAqLwotICAgIHByb3RlY3RlZCBUcmVlTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4gbUdyb3VwTWFwOwotICAgIC8qKiBPdXRwdXQgbWFwIG9mIEZRQ04gPT4gaW5mbyBvbiBMYXlvdXRQYXJhbXMgY2xhc3NlcyAqLwotICAgIHByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgTGF5b3V0UGFyYW1zSW5mbz4gbUxheW91dFBhcmFtc01hcDsKLSAgICAKLSAgICAvKiogVGhlIGF0dHJzLnhtbCBwYXJzZXIgKi8KLSAgICBwcm90ZWN0ZWQgQXR0cnNYbWxQYXJzZXIgbUF0dHJzWG1sUGFyc2VyOwotCi0gICAgLyoqIFRoZSBhbmRyb2lkLmphciBjbGFzcyBsb2FkZXIgKi8KLSAgICBwcm90ZWN0ZWQgSUFuZHJvaWRDbGFzc0xvYWRlciBtQ2xhc3NMb2FkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBMYXlvdXRQYXJhbXNQYXJzZXIuCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBhbmRyb2lkLmphciBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gYXR0cnNYbWxQYXJzZXIgVGhlIHBhcnNlciBvZiB0aGUgYXR0cnMueG1sIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zUGFyc2VyKElBbmRyb2lkQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICBBdHRyc1htbFBhcnNlciBhdHRyc1htbFBhcnNlcikgewotICAgICAgICBtQ2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICAgICAgbUF0dHJzWG1sUGFyc2VyID0gYXR0cnNYbWxQYXJzZXI7Ci0gICAgfQotICAgIAotICAgIC8qKiBSZXR1cm5zIHRoZSBtYXAgb2YgRlFDTiA9PiBpbmZvIG9uIFZpZXcgY2xhc3NlcyAqLwotICAgIHB1YmxpYyBMaXN0PFZpZXdDbGFzc0luZm8+IGdldFZpZXdzKCkgewotICAgICAgICByZXR1cm4gZ2V0SW5zdGFudGlhYmxlcyhtVmlld01hcCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIG1hcCBvZiBGUUNOID0+IGluZm8gb24gVmlld0dyb3VwIGNsYXNzZXMgKi8KLSAgICBwdWJsaWMgTGlzdDxWaWV3Q2xhc3NJbmZvPiBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbnN0YW50aWFibGVzKG1Hcm91cE1hcCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRPRE86IGRvYyBoZXJlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlOiBvbiBvdXRwdXQgd2Ugc2hvdWxkIGhhdmUgTk8gZGVwZW5kZW5jeSBvbiB7QGxpbmsgSUNsYXNzRGVzY3JpcHRvcn0sCi0gICAgICogb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gdW5sb2FkIHRoZSBjbGFzcyBsb2FkZXIgbGF0ZXIuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgb24gVm9jYWJ1bGFyeTogRlFDTj1GdWxseSBRdWFsaWZpZWQgQ2xhc3MgTmFtZSAoZS5nLiAibXkucGFja2FnZS5jbGFzcyRpbm5lckNsYXNzIikKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IuIENhbiBiZSBudWxsLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZG9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUxheW91dENsYXNzZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIHBhcnNlQ2xhc3Nlcyhtb25pdG9yLAotICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfVklFVywKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1ZJRVdHUk9VUCwKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1ZJRVdHUk9VUF9MQVlPVVRQQVJBTVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlUHJlZmVyZW5jZXNDbGFzc2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBwYXJzZUNsYXNzZXMobW9uaXRvciwKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1BSRUZFUkVOQ0UsCi0gICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5DTEFTU19QUkVGRVJFTkNFR1JPVVAsCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBwYXJhbXNDbGFzc05hbWUgKi8gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQ2xhc3NlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0gICAgICAgICAgICBTdHJpbmcgcm9vdENsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBncm91cENsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbXNDbGFzc05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN1Yk1vbml0b3IgcHJvZ3Jlc3MgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTAwKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gc3VwZXJDbGFzc2VzID0gbmV3IFN0cmluZ1syICsgKHBhcmFtc0NsYXNzTmFtZSA9PSBudWxsID8gMCA6IDEpXTsKLSAgICAgICAgICAgIHN1cGVyQ2xhc3Nlc1swXSA9IGdyb3VwQ2xhc3NOYW1lOwotICAgICAgICAgICAgc3VwZXJDbGFzc2VzWzFdID0gcm9vdENsYXNzTmFtZTsKLSAgICAgICAgICAgIGlmIChwYXJhbXNDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3Nlc1syXSA9IHBhcmFtc0NsYXNzTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+IGZvdW5kID0KLSAgICAgICAgICAgICAgICAgICAgbUNsYXNzTG9hZGVyLmZpbmRDbGFzc2VzRGVyaXZpbmdGcm9tKCJhbmRyb2lkLiIsIHN1cGVyQ2xhc3Nlcyk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtVG9wVmlld0NsYXNzID0gbUNsYXNzTG9hZGVyLmdldENsYXNzKHJvb3RDbGFzc05hbWUpOwotICAgICAgICAgICAgbVRvcEdyb3VwQ2xhc3MgPSBtQ2xhc3NMb2FkZXIuZ2V0Q2xhc3MoZ3JvdXBDbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKHBhcmFtc0NsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRvcExheW91dFBhcmFtc0NsYXNzID0gbUNsYXNzTG9hZGVyLmdldENsYXNzKHBhcmFtc0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WaWV3TGlzdCA9IGZvdW5kLmdldChyb290Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgIG1Hcm91cExpc3QgPSBmb3VuZC5nZXQoZ3JvdXBDbGFzc05hbWUpOwotCi0gICAgICAgICAgICBtVmlld01hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgICAgIG1Hcm91cE1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgICAgIGlmIChtVG9wTGF5b3V0UGFyYW1zQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MYXlvdXRQYXJhbXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExheW91dFBhcmFtc0luZm8+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFkZCB0b3AgY2xhc3NlcyB0byB0aGUgbWFwcyBzaW5jZSBieSBkZXNpZ24gdGhleSBhcmUgbm90IGxpc3RlZCBpbiBjbGFzc2VzIGRlcml2aW5nCi0gICAgICAgICAgICAvLyBmcm9tIHRoZW1zZWx2ZXMuCi0gICAgICAgICAgICBhZGRHcm91cChtVG9wR3JvdXBDbGFzcyk7Ci0gICAgICAgICAgICBhZGRWaWV3KG1Ub3BWaWV3Q2xhc3MpOwotCi0gICAgICAgICAgICAvLyBWaWV3R3JvdXAgZGVyaXZlcyBmcm9tIFZpZXcKLSAgICAgICAgICAgIG1Hcm91cE1hcC5nZXQoZ3JvdXBDbGFzc05hbWUpLnNldFN1cGVyQ2xhc3MobVZpZXdNYXAuZ2V0KHJvb3RDbGFzc05hbWUpKTsKLQotICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0V29ya1JlbWFpbmluZyhtR3JvdXBMaXN0LnNpemUoKSArIG1WaWV3TGlzdC5zaXplKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKElDbGFzc0Rlc2NyaXB0b3IgZ3JvdXBDaGlsZCA6IG1Hcm91cExpc3QpIHsKLSAgICAgICAgICAgICAgICBhZGRHcm91cChncm91cENoaWxkKTsKLSAgICAgICAgICAgICAgICBwcm9ncmVzcy53b3JrZWQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoSUNsYXNzRGVzY3JpcHRvciB2aWV3Q2hpbGQgOiBtVmlld0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodmlld0NoaWxkICE9IG1Ub3BHcm91cENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFZpZXcodmlld0NoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3Mud29ya2VkKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIlByb2JsZW0gbG9hZGluZyBjbGFzcyAlMSRzIG9yICUyJHMiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICByb290Q2xhc3NOYW1lLCBncm91cENsYXNzTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJQcm9ibGVtIGxvYWRpbmcgY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKENsYXNzRm9ybWF0RXJyb3IgZSkgewotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiUHJvYmxlbSBsb2FkaW5nIGNsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4ubG9nKGUsICJQcm9ibGVtIGxvYWRpbmcgY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBWaWV3IGNsYXNzIGFuZCBhZGRzIGEgRXh0Vmlld0NsYXNzSW5mbyBmb3IgaXQgaW4gbVZpZXdNYXAuCi0gICAgICogSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHRvIGhhbmRsZSBzdXBlciBjbGFzc2VzIHdoaWNoIGFyZSBhbHNvIFZpZXdzLgotICAgICAqLwotICAgIHByaXZhdGUgRXh0Vmlld0NsYXNzSW5mbyBhZGRWaWV3KElDbGFzc0Rlc2NyaXB0b3Igdmlld0NsYXNzKSB7Ci0gICAgICAgIFN0cmluZyBmcWNuID0gdmlld0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgaWYgKG1WaWV3TWFwLmNvbnRhaW5zS2V5KGZxY24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZpZXdNYXAuZ2V0KGZxY24pOwotICAgICAgICB9IGVsc2UgaWYgKG1Hcm91cE1hcC5jb250YWluc0tleShmcWNuKSkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cE1hcC5nZXQoZnFjbik7Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWaWV3Q2xhc3NJbmZvIGluZm8gPSBuZXcgRXh0Vmlld0NsYXNzSW5mbyh2aWV3Q2xhc3MuaXNJbnN0YW50aWFibGUoKSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBsYXlvdXQgKi8sIGZxY24sIHZpZXdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBtVmlld01hcC5wdXQoZnFjbiwgaW5mbyk7Ci0KLSAgICAgICAgLy8gQWxsIHZpZXcgY2xhc3NlcyBkZXJpdmUgZnJvbSBtVG9wVmlld0NsYXNzIGJ5IGRlc2lnbi4KLSAgICAgICAgLy8gRG8gbm90IGxvb2t1cCB0aGUgc3VwZXIgY2xhc3MgZm9yIG1Ub3BWaWV3Q2xhc3MgaXRzZWxmLgotICAgICAgICBpZiAodmlld0NsYXNzLmVxdWFscyhtVG9wVmlld0NsYXNzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgSUNsYXNzRGVzY3JpcHRvciBzdXBlckNsYXNzID0gdmlld0NsYXNzLmdldFN1cGVyY2xhc3MoKTsgCi0gICAgICAgICAgICBFeHRWaWV3Q2xhc3NJbmZvIHN1cGVyQ2xhc3NJbmZvID0gYWRkVmlldyhzdXBlckNsYXNzKTsKLSAgICAgICAgICAgIGluZm8uc2V0U3VwZXJDbGFzcyhzdXBlckNsYXNzSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQXR0cnNYbWxQYXJzZXIubG9hZFZpZXdBdHRyaWJ1dGVzKGluZm8pOwotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBWaWV3R3JvdXAgY2xhc3MgYW5kIGFkZHMgYSBFeHRWaWV3Q2xhc3NJbmZvIGZvciBpdCBpbiBtR3JvdXBNYXAuCi0gICAgICogSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHRvIGhhbmRsZSBzdXBlciBjbGFzc2VzIHdoaWNoIGFyZSBhbHNvIFZpZXdHcm91cHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFeHRWaWV3Q2xhc3NJbmZvIGFkZEdyb3VwKElDbGFzc0Rlc2NyaXB0b3IgZ3JvdXBDbGFzcykgewotICAgICAgICBTdHJpbmcgZnFjbiA9IGdyb3VwQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICBpZiAobUdyb3VwTWFwLmNvbnRhaW5zS2V5KGZxY24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3VwTWFwLmdldChmcWNuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZpZXdDbGFzc0luZm8gaW5mbyA9IG5ldyBFeHRWaWV3Q2xhc3NJbmZvKGdyb3VwQ2xhc3MuaXNJbnN0YW50aWFibGUoKSwKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGxheW91dCAqLywgZnFjbiwgZ3JvdXBDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBtR3JvdXBNYXAucHV0KGZxY24sIGluZm8pOwotCi0gICAgICAgIC8vIEFsbCBncm91cHMgZGVyaXZlIGZyb20gYW5kcm9pZC52aWV3LlZpZXdHcm91cCwgd2hpY2ggaW4gdHVybnMgZGVyaXZlcyBmcm9tCi0gICAgICAgIC8vIGFuZHJvaWQudmlldy5WaWV3IChpLmUuIG1Ub3BWaWV3Q2xhc3MgaGVyZSkuIFNvIHRoZSBvbmx5IGdyb3VwIHRoYXQgY2FuIGhhdmUgVmlldyBhcwotICAgICAgICAvLyBpdHMgc3VwZXIgY2xhc3MgaXMgdGhlIFZpZXdHcm91cCBiYXNlIGNsYXNzIGFuZCB3ZSBkb24ndCB0cnkgdG8gcmVzb2x2ZSBpdCBzaW5jZSBncm91cHMKLSAgICAgICAgLy8gYXJlIGxvYWRlZCBiZWZvcmUgdmlld3MuCi0gICAgICAgIElDbGFzc0Rlc2NyaXB0b3Igc3VwZXJDbGFzcyA9IGdyb3VwQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOyAKLSAgICAgICAgCi0gICAgICAgIC8vIEFzc2VydGlvbjogYXQgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGhhdmUKLSAgICAgICAgLy8gICBzdXBlckNsYXNzICE9IG1Ub3BWaWV3Q2xhc3MgfHwgZnFjbi5lcXVhbHMoQW5kcm9pZENvbnN0YW50cy5DTEFTU19WSUVXR1JPVVApOwotCi0gICAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwgJiYgc3VwZXJDbGFzcy5lcXVhbHMobVRvcFZpZXdDbGFzcykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEV4dFZpZXdDbGFzc0luZm8gc3VwZXJDbGFzc0luZm8gPSBhZGRHcm91cChzdXBlckNsYXNzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXNzZXJ0aW9uOiB3ZSBzaG91bGQgaGF2ZSBzdXBlckNsYXNzSW5mbyAhPSBudWxsICYmIHN1cGVyQ2xhc3NJbmZvICE9IGluZm87Ci0gICAgICAgICAgICBpZiAoc3VwZXJDbGFzc0luZm8gIT0gbnVsbCAmJiBzdXBlckNsYXNzSW5mbyAhPSBpbmZvKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRTdXBlckNsYXNzKHN1cGVyQ2xhc3NJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1BdHRyc1htbFBhcnNlci5sb2FkVmlld0F0dHJpYnV0ZXMoaW5mbyk7Ci0gICAgICAgIGlmIChtVG9wTGF5b3V0UGFyYW1zQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5mby5zZXRMYXlvdXRQYXJhbXMoYWRkTGF5b3V0UGFyYW1zKGdyb3VwQ2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgVmlld0dyb3VwIGNsYXNzIGFuZCByZXR1cm5zIGFuIGluZm8gb2JqZWN0IG9uIGl0cyBpbm5lciBMYXlvdXRQYXJhbXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIExheW91dFBhcmFtc0luZm99IGZvciB0aGUgVmlld0dyb3VwIGNsYXNzIG9yIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYXlvdXRQYXJhbXNJbmZvIGFkZExheW91dFBhcmFtcyhJQ2xhc3NEZXNjcmlwdG9yIGdyb3VwQ2xhc3MpIHsKLQotICAgICAgICAvLyBJcyB0aGVyZSBhIExheW91dFBhcmFtcyBpbiB0aGlzIGdyb3VwIGNsYXNzPwotICAgICAgICBJQ2xhc3NEZXNjcmlwdG9yIGxheW91dFBhcmFtc0NsYXNzID0gZmluZExheW91dFBhcmFtcyhncm91cENsYXNzKTsKLQotICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGxheW91dCBkYXRhIGluIHRoZSBncm91cCBjbGFzcywgbGluayB0byB0aGUgb25lIGZyb20gdGhlCi0gICAgICAgIC8vIHN1cGVyIGNsYXNzLgotICAgICAgICBpZiAobGF5b3V0UGFyYW1zQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJQ2xhc3NEZXNjcmlwdG9yIHN1cGVyQ2xhc3MgPSBncm91cENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0UGFyYW1zQ2xhc3MgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzLmVxdWFscyhtVG9wVmlld0NsYXNzKSA9PSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0UGFyYW1zQ2xhc3MgPSBmaW5kTGF5b3V0UGFyYW1zKHN1cGVyQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxheW91dFBhcmFtc0NsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXRQYXJhbXNJbmZvKGxheW91dFBhcmFtc0NsYXNzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgTGF5b3V0UGFyYW1zIGNsYXNzIGFuZCByZXR1cm5zIGEgTGF5b3V0UGFyYW1zSW5mbyBvYmplY3QgZm9yIGl0LgotICAgICAqIEl0IGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB0byBoYW5kbGUgdGhlIHN1cGVyIGNsYXNzIG9mIHRoZSBMYXlvdXRQYXJhbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYXlvdXRQYXJhbXNJbmZvIGdldExheW91dFBhcmFtc0luZm8oSUNsYXNzRGVzY3JpcHRvciBsYXlvdXRQYXJhbXNDbGFzcykgewotICAgICAgICBTdHJpbmcgZnFjbiA9IGxheW91dFBhcmFtc0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgTGF5b3V0UGFyYW1zSW5mbyBsYXlvdXRQYXJhbXNJbmZvID0gbUxheW91dFBhcmFtc01hcC5nZXQoZnFjbik7Ci0KLSAgICAgICAgaWYgKGxheW91dFBhcmFtc0luZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGxheW91dFBhcmFtc0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgdGhlIGxpbmsgb24gdGhlIExheW91dFBhcmFtcyBzdXBlciBjbGFzcyAKLSAgICAgICAgTGF5b3V0UGFyYW1zSW5mbyBzdXBlckNsYXNzSW5mbyA9IG51bGw7Ci0gICAgICAgIGlmIChsYXlvdXRQYXJhbXNDbGFzcy5lcXVhbHMobVRvcExheW91dFBhcmFtc0NsYXNzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgSUNsYXNzRGVzY3JpcHRvciBzdXBlckNsYXNzID0gbGF5b3V0UGFyYW1zQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOyAKLSAgICAgICAgICAgIHN1cGVyQ2xhc3NJbmZvID0gZ2V0TGF5b3V0UGFyYW1zSW5mbyhzdXBlckNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRmluZCB0aGUgbGluayBvbiB0aGUgZW5jbG9zaW5nIFZpZXdHcm91cAotICAgICAgICBFeHRWaWV3Q2xhc3NJbmZvIGVuY2xvc2luZ0dyb3VwSW5mbyA9IGFkZEdyb3VwKGxheW91dFBhcmFtc0NsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkpOwotCi0gICAgICAgIGxheW91dFBhcmFtc0luZm8gPSBuZXcgRXh0Vmlld0NsYXNzSW5mby5MYXlvdXRQYXJhbXNJbmZvKAotICAgICAgICAgICAgICAgIGVuY2xvc2luZ0dyb3VwSW5mbywgbGF5b3V0UGFyYW1zQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBzdXBlckNsYXNzSW5mbyk7Ci0gICAgICAgIG1MYXlvdXRQYXJhbXNNYXAucHV0KGZxY24sIGxheW91dFBhcmFtc0luZm8pOwotCi0gICAgICAgIG1BdHRyc1htbFBhcnNlci5sb2FkTGF5b3V0UGFyYW1zQXR0cmlidXRlcyhsYXlvdXRQYXJhbXNJbmZvKTsKLQotICAgICAgICByZXR1cm4gbGF5b3V0UGFyYW1zSW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIFZpZXdHcm91cC1kZXJpdmVkIGNsYXNzLCBsb29rcyBmb3IgYW4gaW5uZXIgY2xhc3MgbmFtZWQgTGF5b3V0UGFyYW1zCi0gICAgICogYW5kIGlmIGZvdW5kIHJldHVybnMgaXRzIGNsYXNzIGRlZmluaXRpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgdXNlcyB0aGUgYWN0dWFsIGRlZmluZWQgaW5uZXIgY2xhc3NlcyBhbmQgZG9lcyBub3QgbG9vayBhdCBpbmhlcml0ZWQgY2xhc3Nlcy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGdyb3VwQ2xhc3MgVGhlIFZpZXdHcm91cCBkZXJpdmVkIGNsYXNzCi0gICAgICogQHJldHVybiBUaGUgQ2xhc3Mgb2YgdGhlIGlubmVyIExheW91dFBhcmFtcyBvciBudWxsIGlmIG5vbmUgaXMgZGVjbGFyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJQ2xhc3NEZXNjcmlwdG9yIGZpbmRMYXlvdXRQYXJhbXMoSUNsYXNzRGVzY3JpcHRvciBncm91cENsYXNzKSB7Ci0gICAgICAgIElDbGFzc0Rlc2NyaXB0b3JbXSBpbm5lckNsYXNzZXMgPSBncm91cENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpOwotICAgICAgICBmb3IgKElDbGFzc0Rlc2NyaXB0b3IgaW5uZXJDbGFzcyA6IGlubmVyQ2xhc3NlcykgewotICAgICAgICAgICAgaWYgKGlubmVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX05BTUVfTEFZT1VUUEFSQU1TKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckNsYXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBWaWV3Q2xhc3NJbmZvIGZyb20gYSBtYXAgYnkgZmlsdGVyaW5nIG91dCB0aGUgY2xhc3MgdGhhdAotICAgICAqIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFZpZXdDbGFzc0luZm8+IGdldEluc3RhbnRpYWJsZXMoU29ydGVkTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4gbWFwKSB7Ci0gICAgICAgIENvbGxlY3Rpb248RXh0Vmlld0NsYXNzSW5mbz4gdmFsdWVzID0gbWFwLnZhbHVlcygpOwotICAgICAgICBBcnJheUxpc3Q8Vmlld0NsYXNzSW5mbz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoRXh0Vmlld0NsYXNzSW5mbyBpbmZvIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoaW5mby5pc0luc3RhbnRpYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvTG9hZFN0YXR1cy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9Mb2FkU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzRkOTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9Mb2FkU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLS8qKgotICogRW51bSBmb3IgbG9hZGluZyBzdGF0dXMgb2YgdmFyaW91cyBTREsgcGFydHMuCi0gKi8KLXB1YmxpYyBlbnVtIExvYWRTdGF0dXMgewotICAgIExPQURJTkcsIExPQURFRCwgRkFJTEVEOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9TZGsuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvU2RrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZmYzMWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9TZGsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGs7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1vbml0b3IuSVByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXREYXRhLkxheW91dEJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkF2ZE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuQXBrQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5BcGtTZXR0aW5nczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllcy5Qcm9wZXJ0eVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBDZW50cmFsIHBvaW50IHRvIGxvYWQsIG1hbmlwdWxhdGUgYW5kIGRlYWwgd2l0aCB0aGUgQW5kcm9pZCBTREsuIE9ubHkgb25lIFNESyBjYW4gYmUgdXNlZAotICogYXQgdGhlIHNhbWUgdGltZS4KLSAqCi0gKiBUbyBzdGFydCB1c2luZyBhbiBTREssIGNhbGwge0BsaW5rICNsb2FkU2RrKFN0cmluZyl9IHdoaWNoIHJldHVybnMgdGhlIGluc3RhbmNlIG9mCi0gKiB0aGUgU2RrIG9iamVjdC4KLSAqCi0gKiBUbyBnZXQgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zIG9yIGFkZC1vbnMgcHJlc2VudCBpbiB0aGUgU0RLLCBjYWxsIHtAbGluayAjZ2V0VGFyZ2V0cygpfS4KLSAqLwotcHVibGljIGNsYXNzIFNkayBpbXBsZW1lbnRzIElQcm9qZWN0TGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIFNkayBzQ3VycmVudFNkayA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNka01hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdmRNYW5hZ2VyIG1BdmRNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPElQcm9qZWN0LCBJQW5kcm9pZFRhcmdldD4gbVByb2plY3RUYXJnZXRNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8SVByb2plY3QsIElBbmRyb2lkVGFyZ2V0PigpOwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQW5kcm9pZFRhcmdldCwgQW5kcm9pZFRhcmdldERhdGE+IG1UYXJnZXREYXRhTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPElBbmRyb2lkVGFyZ2V0LCBBbmRyb2lkVGFyZ2V0RGF0YT4oKTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8SVByb2plY3QsIEFwa1NldHRpbmdzPiBtQXBrU2V0dGluZ3NNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8SVByb2plY3QsIEFwa1NldHRpbmdzPigpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Eb2NCYXNlVXJsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMYXlvdXREZXZpY2VNYW5hZ2VyIG1MYXlvdXREZXZpY2VNYW5hZ2VyID0gbmV3IExheW91dERldmljZU1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIENsYXNzZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIHdpbGwgcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0YXJnZXRzIGFyZSBjaGFuZ2VkLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRhcmdldENoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBwcm9qZWN0IGhhcyBpdHMgdGFyZ2V0IGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uUHJvamVjdFRhcmdldENoYW5nZShJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB0YXJnZXRzIGFyZSBsb2FkZWQgKGVpdGhlciB0aGUgU0RLIGZpbmlzaGVkIGxvYWRpbmcgd2hlbiBFY2xpcHNlIHN0YXJ0cywKLSAgICAgICAgICogb3IgdGhlIFNESyBpcyBjaGFuZ2VkKS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UYXJnZXRzTG9hZGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYW4gU0RLIGFuZCByZXR1cm5zIGFuIHtAbGluayBTZGt9IG9iamVjdCBpZiBzdWNjZXNzLgotICAgICAqIEBwYXJhbSBzZGtMb2NhdGlvbiB0aGUgT1MgcGF0aCB0byB0aGUgU0RLLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2RrIGxvYWRTZGsoU3RyaW5nIHNka0xvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChzQ3VycmVudFNkayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzQ3VycmVudFNkay5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBzQ3VycmVudFNkayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBsb2dNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBJU2RrTG9nIGxvZyA9IG5ldyBJU2RrTG9nKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSwgU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi4gYXJnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yRm9ybWF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZXMuYWRkKFN0cmluZy5mb3JtYXQoIkVycm9yOiAiICsgZXJyb3JGb3JtYXQsIGFyZykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlcy5hZGQodGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyB3YXJuaW5nRm9ybWF0LCBPYmplY3QuLi4gYXJnKSB7Ci0gICAgICAgICAgICAgICAgbG9nTWVzc2FnZXMuYWRkKFN0cmluZy5mb3JtYXQoIldhcm5pbmc6ICIgKyB3YXJuaW5nRm9ybWF0LCBhcmcpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRmKFN0cmluZyBtc2dGb3JtYXQsIE9iamVjdC4uLiBhcmcpIHsKLSAgICAgICAgICAgICAgICBsb2dNZXNzYWdlcy5hZGQoU3RyaW5nLmZvcm1hdChtc2dGb3JtYXQsIGFyZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIGdldCBhbiBTZGtNYW5hZ2VyIG9iamVjdCBmb3IgdGhlIGxvY2F0aW9uCi0gICAgICAgIFNka01hbmFnZXIgbWFuYWdlciA9IFNka01hbmFnZXIuY3JlYXRlTWFuYWdlcihzZGtMb2NhdGlvbiwgbG9nKTsKLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQXZkTWFuYWdlciBhdmRNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXZkTWFuYWdlciA9IG5ldyBBdmRNYW5hZ2VyKG1hbmFnZXIsIGxvZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCAiRXJyb3IgcGFyc2luZyB0aGUgQVZEcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc0N1cnJlbnRTZGsgPSBuZXcgU2RrKG1hbmFnZXIsIGF2ZE1hbmFnZXIpOwotICAgICAgICAgICAgcmV0dXJuIHNDdXJyZW50U2RrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJFcnJvciBMb2FkaW5nIHRoZSBTREs6XG4iKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IGxvZ01lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiQW5kcm9pZCBTREsiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBTZGt9IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNkayBnZXRDdXJyZW50KCkgewotICAgICAgICByZXR1cm4gc0N1cnJlbnRTZGs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gKE9TIHBhdGgpIG9mIHRoZSBjdXJyZW50IFNESy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNka0xvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgdG8gdGhlIGxvY2FsIGRvY3VtZW50YXRpb24uCi0gICAgICogQ2FuIHJldHVybiBudWxsIGlmIG5vIGRvY3VtZW50YXRpb24gaXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgU0RLLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGZpbGU6Ly8gVVJMIG9uIHRoZSBsb2NhbCBkb2N1bWVudGF0aW9uIGZvbGRlciBpZiBpdCBleGlzdHMgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50YXRpb25CYXNlVXJsKCkgewotICAgICAgICByZXR1cm4gbURvY0Jhc2VVcmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0YXJnZXRzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgU0RLLgotICAgICAqLwotICAgIHB1YmxpYyBJQW5kcm9pZFRhcmdldFtdIGdldFRhcmdldHMoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRUYXJnZXRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRhcmdldCBmcm9tIGEgaGFzaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkge0BsaW5rIElBbmRyb2lkVGFyZ2V0I2hhc2hTdHJpbmcoKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFzaCB0aGUge0BsaW5rIElBbmRyb2lkVGFyZ2V0fSBoYXNoIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIElBbmRyb2lkVGFyZ2V0IGdldFRhcmdldEZyb21IYXNoU3RyaW5nKFN0cmluZyBoYXNoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRUYXJnZXRGcm9tSGFzaFN0cmluZyhoYXNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IHRhcmdldCBhbmQgYSBuZXcgbGlzdCBvZiBBcGsgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcmVjZWl2ZSB0aGUgbmV3IGFwayBjb25maWd1cmF0aW9ucwotICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG5ldyB0YXJnZXQgdG8gc2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHRhcmdldC4KLSAgICAgKiBAcGFyYW0gYXBrQ29uZmlnTWFwIGEgbWFwIG9mIGFwayBjb25maWd1cmF0aW9ucy4gVGhlIG1hcCBjb250YWlucyAobmFtZSwgZmlsdGVyKSB3aGVyZSBuYW1lCi0gICAgICogaXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKGEtekEtWjAtOSBvbmx5KSwgYW5kIGZpbHRlciBpcyB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YKLSAgICAgKiByZXNvdXJjZSBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGFwayAoc2VlIGFhcHQgLWMpLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogYXBrIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBub3QgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgIEFwa1NldHRpbmdzIHNldHRpbmdzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZGtMb2NrT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzb2x2ZVByb2plY3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcGVydGllcyA9IFByb2plY3RQcm9wZXJ0aWVzLmxvYWQoCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIFByb3BlcnR5VHlwZS5ERUZBVUxUKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGV4aXN0IHlldD8gd2UgY3JlYXRlIGl0LgotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5ERUZBVUxUKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgcHJldmlvdXNUYXJnZXQgPSBtUHJvamVjdFRhcmdldE1hcC5nZXQocHJvamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IHByZXZpb3VzVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHRhcmdldCBoYXNoIHN0cmluZyBpbiB0aGUgcHJvamVjdCBwZXJzaXN0ZW50IHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QW5kcm9pZFRhcmdldCh0YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHB1dCBpdCBpbiBhIGxvY2FsIG1hcCBmb3IgZWFzeSBhY2Nlc3MuCi0gICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0VGFyZ2V0TWFwLnB1dChwcm9qZWN0LCB0YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9qZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gc2V0dGluZ3MsIGZvcmNlIGRlZmF1bHQgdmFsdWVzICh0byByZXNldCBwb3NzaWJseSBjaGFuZ2VkCi0gICAgICAgICAgICAvLyB2YWx1ZXMgaW4gYSBwcmV2aW91cyBjYWxsLgotICAgICAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBBcGtTZXR0aW5ncygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzYXZlIHRoZSBwcm9qZWN0IHNldHRpbmdzIGludG8gdGhlIHByb2plY3QgcGVyc2lzdGVudCBwcm9wZXJ0eQotICAgICAgICAgICAgQXBrQ29uZmlndXJhdGlvbkhlbHBlci5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHNldHRpbmdzKTsKLQotICAgICAgICAgICAgLy8gcHV0IGl0IGluIGEgbG9jYWwgbWFwIGZvciBlYXN5IGFjY2Vzcy4KLSAgICAgICAgICAgIG1BcGtTZXR0aW5nc01hcC5wdXQocHJvamVjdCwgc2V0dGluZ3MpOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBtb2RpZmljYXRpb24uIFNhdmUgdGhlIHByb3BlcnR5IGZpbGUuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2F2ZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byBzYXZlIGRlZmF1bHQucHJvcGVydGllcyBmb3IgcHJvamVjdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc29sdmVQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yY2UgYSByZXNvbHZlIG9mIHRoZSBwcm9qZWN0IGJ5IHVwZGF0aW5nIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBhbHNvIGZvcmNlIGEgcmVjb21waWxlLgotICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIudXBkYXRlUHJvamVjdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gYWx3YXlzIGRvIGEgZnVsbCBjbGVhbi9idWlsZC4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gYnVpbGQ/IGZvcmNlIHJlc29sdmUgaW5zdGVhZC4KLSAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIudXBkYXRlUHJvamVjdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElKYXZhUHJvamVjdFtdIHsgamF2YVByb2plY3QgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaW5hbGx5LCB1cGRhdGUgdGhlIG9wZW5lZCBlZGl0b3JzLgotICAgICAgICAgICAgaWYgKHJlc29sdmVQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVUYXJnZXRMaXN0ZW5lcihwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQW5kcm9pZFRhcmdldH0gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIElQcm9qZWN0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0VGFyZ2V0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNka0xvY2tPYmplY3QoKSkgewotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbVByb2plY3RUYXJnZXRNYXAuZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBwcm9qZWN0IHBlcnNpc3RlbnQgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEhhc2hTdHJpbmcgPSBsb2FkUHJvamVjdFByb3BlcnRpZXMocHJvamVjdCwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SGFzaFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG1NYW5hZ2VyLmdldFRhcmdldEZyb21IYXNoU3RyaW5nKHRhcmdldEhhc2hTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgYW5kIHJldHVybnMgdGhlIGhhc2ggc3RyaW5nIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZQotICAgICAqIHRhcmdldCBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2RzIHJlYWRzIHRoZSBjb250ZW50IG9mIHRoZSA8Y29kZT5kZWZhdWx0LnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgcHJlc2VudCBpbgotICAgICAqIHRoZSByb290IGZvbGRlciBvZiB0aGUgcHJvamVjdC4KLSAgICAgKiA8cC8+VGhlIHJldHVybmVkIHN0cmluZyBpcyBlcXVpdmFsZW50IHRvIHRoZSByZXR1cm4gb2Yge0BsaW5rIElBbmRyb2lkVGFyZ2V0I2hhc2hTdHJpbmcoKX0uCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgdGFyZ2V0IGhhc2ggc3RyaW5nLgotICAgICAqIEBwYXJhbSBzZGtTdG9yYWdlIFRoZSBzZGsgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIEFwayBDb25maWdzLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIHN0cmluZyBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYSB0YXJnZXQgc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBsb2FkUHJvamVjdFByb3BlcnRpZXMoSVByb2plY3QgcHJvamVjdCwgU2RrIHNka1N0b3JhZ2UpIHsKLSAgICAgICAgLy8gbG9hZCB0aGUgZGVmYXVsdC5wcm9wZXJ0aWVzIGZyb20gdGhlIHByb2plY3QgZm9sZGVyLgotICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsgIC8vIGNhbiByZXR1cm4gbnVsbCB3aGVuIHRoZSBwcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQuCi0gICAgICAgICAgICAvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFByb2plY3RQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBQcm9qZWN0UHJvcGVydGllcy5sb2FkKGxvY2F0aW9uLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuREVGQVVMVCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIkZhaWxlZCB0byBsb2FkIHByb3BlcnRpZXMgZmlsZSBmb3IgcHJvamVjdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2RrU3RvcmFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgQXBrU2V0dGluZ3Mgc2V0dGluZ3MgPSBBcGtDb25maWd1cmF0aW9uSGVscGVyLmdldFNldHRpbmdzKHByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2RrU3RvcmFnZS5tQXBrU2V0dGluZ3NNYXAucHV0KHByb2plY3QsIHNldHRpbmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQcm9qZWN0UHJvcGVydGllcy5QUk9QRVJUWV9UQVJHRVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhc2ggc3RyaW5nIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgb2YgYSBwcm9qZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG1ldGhvZHMgcmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIDxjb2RlPmRlZmF1bHQucHJvcGVydGllczwvY29kZT4gZmlsZSBwcmVzZW50IGluCi0gICAgICogdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSBwcm9qZWN0LgotICAgICAqIDxwLz5UaGUgc3RyaW5nIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJldHVybiBvZiB7QGxpbmsgSUFuZHJvaWRUYXJnZXQjaGFzaFN0cmluZygpfS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSB0YXJnZXQgaGFzaCBzdHJpbmcuCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBzdHJpbmcgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgdGFyZ2V0IHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0VGFyZ2V0SGFzaFN0cmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBsb2FkUHJvamVjdFByb3BlcnRpZXMocHJvamVjdCwgbnVsbCAvKnN0b3JlQ29uZmlncyovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgdGFyZ2V0IGhhc2ggc3RyaW5nIGluIGdpdmVuIHByb2plY3QncyA8Y29kZT5kZWZhdWx0LnByb3BlcnRpZXM8L2NvZGU+IGZpbGUuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgaGFzaCBzdHJpbmcuCi0gICAgICogQHBhcmFtIHRhcmdldEhhc2hTdHJpbmcgVGhlIHRhcmdldCBoYXNoIHN0cmluZyB0byBzYXZlLiBUaGlzIG11c3QgYmUgdGhlIHJlc3VsdCBmcm9tCi0gICAgICoge0BsaW5rIElBbmRyb2lkVGFyZ2V0I2hhc2hTdHJpbmcoKX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb2plY3RUYXJnZXRIYXNoU3RyaW5nKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0YXJnZXRIYXNoU3RyaW5nKSB7Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBlcmFzZSBvdGhlciBwcm9wZXJ0aWVzIGZyb20gZGVmYXVsdC5wcm9wZXJ0aWVzLCB3ZSBmaXJzdCBsb2FkCi0gICAgICAgIC8vIHRoZW0KLSAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcGVydGllcyA9IFByb2plY3RQcm9wZXJ0aWVzLmxvYWQocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuREVGQVVMVCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGRvZXNuJ3QgZXhpc3QgeWV0PyB3ZSBjcmVhdGUgaXQuCi0gICAgICAgICAgICBwcm9wZXJ0aWVzID0gUHJvamVjdFByb3BlcnRpZXMuY3JlYXRlKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZC9jaGFuZ2UgdGhlIHRhcmdldCBoYXNoIHN0cmluZy4KLSAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm9qZWN0UHJvcGVydGllcy5QUk9QRVJUWV9UQVJHRVQsIHRhcmdldEhhc2hTdHJpbmcpOwotCi0gICAgICAgIC8vIGFuZCByZXdyaXRlIHRoZSBmaWxlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvcGVydGllcy5zYXZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coZSwgIkZhaWxlZCB0byBzYXZlIGRlZmF1bHQucHJvcGVydGllcyBmb3IgcHJvamVjdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUge0BsaW5rIEFuZHJvaWRUYXJnZXREYXRhfSBmb3IgYSBnaXZlbiB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9LgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkVGFyZ2V0RGF0YSBnZXRUYXJnZXREYXRhKElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRhcmdldERhdGFNYXAuZ2V0KHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBBbmRyb2lkVGFyZ2V0RGF0YX0gZm9yIGEgZ2l2ZW4ge0BsaW5rIElQcm9qZWN0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZFRhcmdldERhdGEgZ2V0VGFyZ2V0RGF0YShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZGtMb2NrT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IGdldFRhcmdldChwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYXJnZXREYXRhKHRhcmdldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBUEsgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBrU2V0dGluZ3MgZ2V0QXBrU2V0dGluZ3MoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2RrTG9ja09iamVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwa1NldHRpbmdzTWFwLmdldChwcm9qZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBdmRNYW5hZ2VyfS4gSWYgdGhlIEF2ZE1hbmFnZXIgZmFpbGVkIHRvIHBhcnNlIHRoZSBBVkQgZm9sZGVyLCB0aGlzIGNvdWxkCi0gICAgICogYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIEF2ZE1hbmFnZXIgZ2V0QXZkTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BdmRNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQW5kcm9pZFZlcnNpb24gZ2V0RGV2aWNlVmVyc2lvbihJRGV2aWNlIGRldmljZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IGRldmljZS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYXBpTGV2ZWwgPSBwcm9wcy5nZXQoSURldmljZS5QUk9QX0JVSUxEX0FQSV9MRVZFTCk7Ci0gICAgICAgICAgICBpZiAoYXBpTGV2ZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRWZXJzaW9uKEludGVnZXIucGFyc2VJbnQoYXBpTGV2ZWwpLAotICAgICAgICAgICAgICAgICAgICBwcm9wcy5nZXQoKElEZXZpY2UuUFJPUF9CVUlMRF9DT0RFTkFNRSkpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExheW91dERldmljZU1hbmFnZXIgZ2V0TGF5b3V0RGV2aWNlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG1MYXlvdXREZXZpY2VNYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgU2RrKFNka01hbmFnZXIgbWFuYWdlciwgQXZkTWFuYWdlciBhdmRNYW5hZ2VyKSB7Ci0gICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgbUF2ZE1hbmFnZXIgPSBhdmRNYW5hZ2VyOwotCi0gICAgICAgIC8vIGxpc3RlbiB0byBwcm9qZWN0cyBjbG9zaW5nCi0gICAgICAgIFJlc291cmNlTW9uaXRvciBtb25pdG9yID0gUmVzb3VyY2VNb25pdG9yLmdldE1vbml0b3IoKTsKLSAgICAgICAgbW9uaXRvci5hZGRQcm9qZWN0TGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgLy8gcHJlLWNvbXB1dGUgc29tZSBwYXRocwotICAgICAgICBtRG9jQmFzZVVybCA9IGdldERvY3VtZW50YXRpb25CYXNlVXJsKG1NYW5hZ2VyLmdldExvY2F0aW9uKCkgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5PU19TREtfRE9DU19GT0xERVIpOwotCi0gICAgICAgIC8vIGxvYWQgdGhlIGJ1aWx0LWluIGFuZCB1c2VyIGxheW91dCBkZXZpY2VzCi0gICAgICAgIG1MYXlvdXREZXZpY2VNYW5hZ2VyLmxvYWREZWZhdWx0QW5kVXNlckRldmljZXMobU1hbmFnZXIuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIC8vIGFuZCB0aGUgb25lcyBmcm9tIHRoZSBhZGQtb24KLSAgICAgICAgbG9hZExheW91dERldmljZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2xlYW5zIGFuZCB1bmxvYWRzIHRoZSBTREsuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIFJlc291cmNlTW9uaXRvci5nZXRNb25pdG9yKCkucmVtb3ZlUHJvamVjdExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHZvaWQgc2V0VGFyZ2V0RGF0YShJQW5kcm9pZFRhcmdldCB0YXJnZXQsIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNka0xvY2tPYmplY3QoKSkgewotICAgICAgICAgICAgbVRhcmdldERhdGFNYXAucHV0KHRhcmdldCwgZGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgdG8gdGhlIGxvY2FsIGRvY3VtZW50YXRpb24uCi0gICAgICogQ2FuIHJldHVybiBudWxsIGlmIG5vIGRvY3VtZW50YXRpb24gaXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgU0RLLgotICAgICAqCi0gICAgICogQHBhcmFtIG9zRG9jc1BhdGggUGF0aCB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgU0RLLgotICAgICAqICBUaGUgZm9sZGVyIG1heSBub3QgYWN0dWFsbHkgZXhpc3QuCi0gICAgICogQHJldHVybiBBIGZpbGU6Ly8gVVJMIG9uIHRoZSBsb2NhbCBkb2N1bWVudGF0aW9uIGZvbGRlciBpZiBpdCBleGlzdHMgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXREb2N1bWVudGF0aW9uQmFzZVVybChTdHJpbmcgb3NEb2NzUGF0aCkgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShvc0RvY3NQYXRoKTsKLQotICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRvIGNyZWF0ZSBhIGZpbGU6Ly8gVVJMLCBvbmUgd291bGQgdHlwaWNhbGx5IHVzZSBzb21ldGhpbmcgbGlrZQotICAgICAgICAgICAgICAgIC8vIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkuIEhvd2V2ZXIgdGhpcyBnZW5lcmF0ZXMgYSBicm9rZW4gcGF0aCBvbgotICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MsIG5hbWVseSAiQzpcXGZvbyIgaXMgY29udmVydGVkIHRvICJmaWxlOi9DOi9mb28iIGluc3RlYWQgb2YKLSAgICAgICAgICAgICAgICAvLyAiZmlsZTovLy9DOi9mb28iIChpLmUuIHRoZXJlIHNob3VsZCBiZSAzIC8gYWZ0ZXIgImZpbGU6IikuIFNvIHdlJ2xsCi0gICAgICAgICAgICAgICAgLy8gZG8gdGhlIGNvcnJlY3QgdGhpbmcgbWFudWFsbHkuCi0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHRoZSBVUkwgY2xhc3MgZG9lc24ndCBhZGQgdGhlIG1hbmRhdG9yeSAiLy8iIGFmdGVyCi0gICAgICAgICAgICAgICAgLy8gdGhlICJmaWxlOiIgcHJvdG9jb2wgbmFtZSwgc28gaXQgaGFzIHRvIGJlIGhhY2tlZCBpbnRvIHRoZSBwYXRoLgotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgIi8vIiArIHBhdGgpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBtYWxmb3JtZWQgVVJMcwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBTREsgYWRkLW9ucyB0byBsb29rIGZvciBmaWxlcyBjYWxsZWQge0BsaW5rIFNka0NvbnN0YW50cyNGTl9ERVZJQ0VTX1hNTH0gdG8KLSAgICAgKiBsb2FkIHtAbGluayBMYXlvdXREZXZpY2V9IGZyb20gdGhlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZExheW91dERldmljZXMoKSB7Ci0gICAgICAgIElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cyA9IG1NYW5hZ2VyLmdldFRhcmdldHMoKTsKLSAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGxhdGZvcm0oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIEZpbGUgZGV2aWNlWG1sID0gbmV3IEZpbGUodGFyZ2V0LmdldExvY2F0aW9uKCksIFNka0NvbnN0YW50cy5GTl9ERVZJQ0VTX1hNTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZVhtbC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtTGF5b3V0RGV2aWNlTWFuYWdlci5wYXJzZUFkZE9uTGF5b3V0RGV2aWNlKGRldmljZVhtbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUxheW91dERldmljZU1hbmFnZXIuc2VhbEFkZG9uTGF5b3V0RGV2aWNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvLyBnZXQgdGhlIHRhcmdldCBwcm9qZWN0Ci0gICAgICAgIHN5bmNocm9uaXplZCAoQWR0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZGtMb2NrT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IG1Qcm9qZWN0VGFyZ2V0TWFwLmdldChwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYnJpZGdlIGZvciB0aGUgdGFyZ2V0LCBhbmQgY2xlYXIgdGhlIGNhY2hlIGZvciB0aGlzIHByb2plY3QuCi0gICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEgZGF0YSA9IG1UYXJnZXREYXRhTWFwLmdldCh0YXJnZXQpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0QnJpZGdlIGJyaWRnZSA9IGRhdGEuZ2V0TGF5b3V0QnJpZGdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChicmlkZ2UgIT0gbnVsbCAmJiBicmlkZ2Uuc3RhdHVzID09IExvYWRTdGF0dXMuTE9BREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2UuYnJpZGdlLmNsZWFyQ2FjaGVzKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgcmVtb3ZlIHRoZSBwcm9qZWN0IGZvciB0aGUgbWFwcy4KLSAgICAgICAgICAgIG1Qcm9qZWN0VGFyZ2V0TWFwLnJlbW92ZShwcm9qZWN0KTsKLSAgICAgICAgICAgIG1BcGtTZXR0aW5nc01hcC5yZW1vdmUocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0RGVsZXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHByb2plY3RDbG9zZWQocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvamVjdE9wZW5lZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIGlnbm9yZSB0aGlzLiBUaGUgcHJvamVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAgdGhlIGZpcnN0IHRpbWUgdGhlIHRhcmdldCBuZWVkcwotICAgICAgICAvLyB0byBiZSByZXNvbHZlZC4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9qZWN0T3BlbmVkV2l0aFdvcmtzcGFjZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIC8vIGlnbm9yZSB0aGlzLiBUaGUgcHJvamVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAgdGhlIGZpcnN0IHRpbWUgdGhlIHRhcmdldCBuZWVkcwotICAgICAgICAvLyB0byBiZSByZXNvbHZlZC4KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvV2lkZ2V0Q2xhc3NMb2FkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvV2lkZ2V0Q2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxYzIzNi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL1dpZGdldENsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247Ci0KLS8qKgotICogUGFyc2VyIGZvciB0aGUgdGV4dCBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2Ygd2lkZ2V0cywgbGF5b3V0cyBhbmQgbGF5b3V0IHBhcmFtcy4KLSAqIDxwLz4KLSAqIFRoZSBmaWxlIGlzIGEgc3RyYWlnaHQgdGV4dCBmaWxlIGNvbnRhaW5pbmcgb25lIGNsYXNzIHBlciBsaW5lLjxicj4KLSAqIEVhY2ggbGluZSBpcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDxicj4KLSAqIDxjb2RlPltjb2RlXVtjbGFzcyBuYW1lXSBbc3VwZXIgY2xhc3MgbmFtZV0gW3N1cGVyIGNsYXNzIG5hbWVdLi4uPC9jb2RlPgotICogd2hlcmUgY29kZSBpcyBhIHNpbmdsZSBsZXR0ZXIgKFcgZm9yIHdpZGdldCwgTCBmb3IgbGF5b3V0LCBQIGZvciBsYXlvdXQgcGFyYW1zKSwgYW5kIGNsYXNzIG5hbWVzCi0gKiBhcmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzc2VzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2lkZ2V0Q2xhc3NMb2FkZXIgaW1wbGVtZW50cyBJQW5kcm9pZENsYXNzTG9hZGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBCYXNpYyBjbGFzcyBjb250YWluaW5nIHRoZSBjbGFzcyBkZXNjcmlwdGlvbnMgZm91bmQgaW4gdGhlIHRleHQgZmlsZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQ2xhc3NEZXNjcmlwdG9yIGltcGxlbWVudHMgSUNsYXNzRGVzY3JpcHRvciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVNpbXBsZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgQ2xhc3NEZXNjcmlwdG9yIG1TdXBlckNsYXNzOwotICAgICAgICBwcml2YXRlIENsYXNzRGVzY3JpcHRvciBtRW5jbG9zaW5nQ2xhc3M7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+IG1EZWNsYXJlZENsYXNzZXMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luc3RhbnRpYWJsZSA9IGZhbHNlOwotCi0gICAgICAgIENsYXNzRGVzY3JpcHRvcihTdHJpbmcgZnFjbikgewotICAgICAgICAgICAgbU5hbWUgPSBmcWNuOwotICAgICAgICAgICAgbVNpbXBsZU5hbWUgPSBnZXRTaW1wbGVOYW1lKGZxY24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TaW1wbGVOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElDbGFzc0Rlc2NyaXB0b3JbXSBnZXREZWNsYXJlZENsYXNzZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURlY2xhcmVkQ2xhc3Nlcy50b0FycmF5KG5ldyBJQ2xhc3NEZXNjcmlwdG9yW21EZWNsYXJlZENsYXNzZXMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkRGVjbGFyZWRDbGFzcyhDbGFzc0Rlc2NyaXB0b3IgZGVjbGFyZWRDbGFzcykgewotICAgICAgICAgICAgbURlY2xhcmVkQ2xhc3Nlcy5hZGQoZGVjbGFyZWRDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSUNsYXNzRGVzY3JpcHRvciBnZXRFbmNsb3NpbmdDbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5jbG9zaW5nQ2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc2V0RW5jbG9zaW5nQ2xhc3MoQ2xhc3NEZXNjcmlwdG9yIGVuY2xvc2luZ0NsYXNzKSB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIGVuY2xvc2luZyBjbGFzcy4KLSAgICAgICAgICAgIG1FbmNsb3NpbmdDbGFzcyA9IGVuY2xvc2luZ0NsYXNzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBkZWNsYXJlZCBjbGFzcyBpbiB0aGUgZW5jbG9zaW5nIGNsYXNzLgotICAgICAgICAgICAgbUVuY2xvc2luZ0NsYXNzLmFkZERlY2xhcmVkQ2xhc3ModGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGZpbmFsbHkgY2hhbmdlIHRoZSBuYW1lIG9mIGRlY2xhcmVkIGNsYXNzIHRvIG1ha2Ugc3VyZSBpdCB1c2VzIHRoZQotICAgICAgICAgICAgLy8gY29udmVudGlvbjogcGFja2FnZS5lbmNsb3NpbmckZGVjbGFyZWQgaW5zdGVhZCBvZiBwYWNrYWdlLmVuY2xvc2luZy5kZWNsYXJlZAotICAgICAgICAgICAgbU5hbWUgPSBlbmNsb3NpbmdDbGFzcy5tTmFtZSArICIkIiArIG1OYW1lLnN1YnN0cmluZyhlbmNsb3NpbmdDbGFzcy5tTmFtZS5sZW5ndGgoKSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElDbGFzc0Rlc2NyaXB0b3IgZ2V0U3VwZXJjbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VwZXJDbGFzczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzZXRTdXBlckNsYXNzKENsYXNzRGVzY3JpcHRvciBzdXBlckNsYXNzKSB7Ci0gICAgICAgICAgICBtU3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGNsYXp6KSB7Ci0gICAgICAgICAgICBpZiAoY2xhenogaW5zdGFuY2VvZiBDbGFzc0Rlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU5hbWUuZXF1YWxzKCgoQ2xhc3NEZXNjcmlwdG9yKWNsYXp6KS5tTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKGNsYXp6KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbnN0YW50aWFibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlzSW5zdGFudGlhYmxlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNldEluc3RhbnRpYWJsZShib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgICAgICBtSXNJbnN0YW50aWFibGUgPSBzdGF0ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgZnFjbikgewotICAgICAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSBmcWNuLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIHJldHVybiBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGgtMV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIG1SZWFkZXI7Ci0KLSAgICAvKiogT3V0cHV0IG1hcCBvZiBGUUNOID0+IGRlc2NyaXB0b3Igb24gYWxsIGNsYXNzZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzRGVzY3JpcHRvcj4gbU1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgQ2xhc3NEZXNjcmlwdG9yPigpOwotICAgIC8qKiBPdXRwdXQgbWFwIG9mIEZRQ04gPT4gZGVzY3JpcHRvciBvbiBWaWV3IGNsYXNzZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzRGVzY3JpcHRvcj4gbVdpZGdldE1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgQ2xhc3NEZXNjcmlwdG9yPigpOwotICAgIC8qKiBPdXRwdXQgbWFwIG9mIEZRQ04gPT4gZGVzY3JpcHRvciBvbiBWaWV3R3JvdXAgY2xhc3NlcyAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3NEZXNjcmlwdG9yPiBtTGF5b3V0TWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBDbGFzc0Rlc2NyaXB0b3I+KCk7Ci0gICAgLyoqIE91dHB1dCBtYXAgb2YgRlFDTiA9PiBkZXNjcmlwdG9yIG9uIExheW91dFBhcmFtcyBjbGFzc2VzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzc0Rlc2NyaXB0b3I+IG1MYXlvdXRQYXJhbXNNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzRGVzY3JpcHRvcj4oKTsKLSAgICAvKiogRmlsZSBwYXRoIG9mIHRoZSBzb3VyY2UgdGV4dCBmaWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU9zRmlsZVBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9hZGVyIHdpdGggYSBnaXZlbiBmaWxlIHBhdGguCi0gICAgICogQHBhcmFtIG9zRmlsZVBhdGggdGhlIE9TIHBhdGggb2YgdGhlIGZpbGUgdG8gbG9hZC4KLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgV2lkZ2V0Q2xhc3NMb2FkZXIoU3RyaW5nIG9zRmlsZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBtT3NGaWxlUGF0aCA9IG9zRmlsZVBhdGg7Ci0gICAgICAgIG1SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIob3NGaWxlUGF0aCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotICAgICAgICByZXR1cm4gbU9zRmlsZVBhdGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgdGV4dCBmaWxlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4KLSAgICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICAqLwotICAgIGJvb2xlYW4gcGFyc2VXaWRnZXRMaXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBtUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBwcmVmaXggPSBsaW5lLmNoYXJBdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY2xhc3NlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzRGVzY3JpcHRvciBjbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlZml4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzID0gbGluZS5zdWJzdHJpbmcoMSkuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IHByb2Nlc3NDbGFzcyhjbGFzc2VzLCAwLCBudWxsIC8qIG1hcCAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenouc2V0SW5zdGFudGlhYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkZ2V0TWFwLnB1dChjbGFzc2VzWzBdLCBjbGF6eik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyA9IGxpbmUuc3Vic3RyaW5nKDEpLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenogPSBwcm9jZXNzQ2xhc3MoY2xhc3NlcywgMCwgbnVsbCAvKiBtYXAgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LnNldEluc3RhbnRpYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxheW91dE1hcC5wdXQoY2xhc3Nlc1swXSwgY2xhenopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMgPSBsaW5lLnN1YnN0cmluZygxKS5zcGxpdCgiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gcHJvY2Vzc0NsYXNzKGNsYXNzZXMsIDAsIG1MYXlvdXRQYXJhbXNNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LnNldEluc3RhbnRpYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50LCBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHJlY29uY2lsaWF0ZSB0aGUgbGF5b3V0IGFuZCB0aGVpciBsYXlvdXQgcGFyYW1zCi0gICAgICAgICAgICBwb3N0UHJvY2VzcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtUmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgVmlldyBjbGFzcyBhbmQgYWRkcyBhIFZpZXdDbGFzc0luZm8gZm9yIGl0IGluIG1XaWRnZXRNYXAuCi0gICAgICogSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHRvIGhhbmRsZSBzdXBlciBjbGFzc2VzIHdoaWNoIGFyZSBhbHNvIFZpZXdzLgotICAgICAqIEBwYXJhbSBjbGFzc2VzIHRoZSBpbmhlcml0YW5jZSBsaXN0IG9mIHRoZSBjbGFzcyB0byBwcm9jZXNzLgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGNsYXNzIHRvIHByb2Nlc3MgaW4gdGhlIDxjb2RlPmNsYXNzZXM8L2NvZGU+IGFycmF5LgotICAgICAqIEBwYXJhbSBtYXAgYW4gb3B0aW9uYWwgbWFwIGluIHdoaWNoIHRvIHB1dCBldmVyeSB7QGxpbmsgQ2xhc3NEZXNjcmlwdG9yfSBjcmVhdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3NEZXNjcmlwdG9yIHByb2Nlc3NDbGFzcyhTdHJpbmdbXSBjbGFzc2VzLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDbGFzc0Rlc2NyaXB0b3I+IG1hcCkgewotICAgICAgICBpZiAoaW5kZXggPj0gY2xhc3Nlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZnFjbiA9IGNsYXNzZXNbaW5kZXhdOwotICAgICAgICAKLSAgICAgICAgaWYgKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoZnFjbikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgVmlld0luZm9DbGFzcyBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICAgIGlmIChtTWFwLmNvbnRhaW5zS2V5KGZxY24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1hcC5nZXQoZnFjbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGN1c3RvbSBjbGFzcy4KLSAgICAgICAgQ2xhc3NEZXNjcmlwdG9yIGNsYXp6ID0gbmV3IENsYXNzRGVzY3JpcHRvcihmcWNuKTsKLSAgICAgICAgbU1hcC5wdXQoZnFjbiwgY2xhenopOwotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcC5wdXQoZnFjbiwgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIHN1cGVyIGNsYXNzCi0gICAgICAgIENsYXNzRGVzY3JpcHRvciBzdXBlckNsYXNzID0gcHJvY2Vzc0NsYXNzKGNsYXNzZXMsIGluZGV4KzEsIG1hcCk7Ci0gICAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXp6LnNldFN1cGVyQ2xhc3Moc3VwZXJDbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR29lcyB0aHJvdWdoIHRoZSBsYXlvdXQgcGFyYW1zIGFuZCBsb29rIGZvciB0aGUgZW5jbG9zZWQgY2xhc3MuIElmIHRoZSBsYXlvdXQgcGFyYW1zCi0gICAgICogaGFzIG5vIGtub3duIGVuY2xvc2VkIHR5cGUgaXQgaXMgZHJvcHBlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcG9zdFByb2Nlc3MoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248Q2xhc3NEZXNjcmlwdG9yPiBwYXJhbXMgPSBtTGF5b3V0UGFyYW1zTWFwLnZhbHVlcygpOwotCi0gICAgICAgIGZvciAoQ2xhc3NEZXNjcmlwdG9yIHBhcmFtIDogcGFyYW1zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZnFjbiA9IHBhcmFtLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbmNsb3NlZCBuYW1lLgotICAgICAgICAgICAgU3RyaW5nIGVuY2xvc2VkID0gZ2V0RW5jbG9zZWROYW1lKGZxY24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBsb29rIGZvciBhIG1hdGNoIGluIHRoZSBsYXlvdXRzLiBXZSBkb24ndCB1c2UgdGhlIGxheW91dCBtYXAgYXMgaXQgb25seSBjb250YWlucyB0aGUKLSAgICAgICAgICAgIC8vIGVuZCBjbGFzc2VzLCBidXQgaW4gdGhpcyBjYXNlIHdlIGFsc28gbmVlZCB0byBwcm9jZXNzIHRoZSBsYXlvdXQgcGFyYW1zIGZvciB0aGUgYmFzZQotICAgICAgICAgICAgLy8gbGF5b3V0IGNsYXNzZXMuCi0gICAgICAgICAgICBDbGFzc0Rlc2NyaXB0b3IgZW5jbG9zaW5nVHlwZSA9IG1NYXAuZ2V0KGVuY2xvc2VkKTsKLSAgICAgICAgICAgIGlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRFbmNsb3NpbmdDbGFzcyhlbmNsb3NpbmdUeXBlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsYXNzIGZyb20gdGhlIG1hcCwgYW5kIHB1dCBpdCBiYWNrIHdpdGggdGhlIGZpeGVkIG5hbWUKLSAgICAgICAgICAgICAgICBtTWFwLnJlbW92ZShmcWNuKTsKLSAgICAgICAgICAgICAgICBtTWFwLnB1dChwYXJhbS5nZXRDYW5vbmljYWxOYW1lKCksIHBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEVuY2xvc2VkTmFtZShTdHJpbmcgZnFjbikgewotICAgICAgICBpbnQgaW5kZXggPSBmcWNuLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIHJldHVybiBmcWNuLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYW5kIGxvYWRzIGFsbCBjbGFzc2VzIHRoYXQgZGVyaXZlIGZyb20gYSBnaXZlbiBzZXQgb2Ygc3VwZXIgY2xhc3Nlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdFBhY2thZ2UgUm9vdCBwYWNrYWdlIG9mIGNsYXNzZXMgdG8gZmluZC4gVXNlIGFuIGVtcHR5IHN0cmluZyB0byBmaW5kIGV2ZXJ5dGluZy4KLSAgICAgKiBAcGFyYW0gc3VwZXJDbGFzc2VzIFRoZSBzdXBlciBjbGFzc2VzIG9mIGFsbCB0aGUgY2xhc3NlcyB0byBmaW5kLiAKLSAgICAgKiBAcmV0dXJuIEFuIGhhc2ggbWFwIHdoaWNoIGtleXMgYXJlIHRoZSBzdXBlciBjbGFzc2VzIGxvb2tlZCBmb3IgYW5kIHdoaWNoIHZhbHVlcyBhcmUKLSAgICAgKiAgICAgICAgIEFycmF5TGlzdCBvZiB0aGUgY2xhc3NlcyBmb3VuZC4gVGhlIGFycmF5IGxpc3RzIGFyZSBhbHdheXMgY3JlYXRlZCBmb3IgYWxsIHRoZQotICAgICAqICAgICAgICAgdmFsaWQga2V5cywgdGhleSBhcmUgc2ltcGx5IGVtcHR5IGlmIG5vIGRlcml2aW5nIGNsYXNzIGlzIGZvdW5kIGZvciBhIGdpdmVuCi0gICAgICogICAgICAgICBzdXBlciBjbGFzcy4gCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc0Zvcm1hdEVycm9yCi0gICAgICovCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+IGZpbmRDbGFzc2VzRGVyaXZpbmdGcm9tKFN0cmluZyByb290UGFja2FnZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIHN1cGVyQ2xhc3NlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb24sCi0gICAgICAgICAgICBDbGFzc0Zvcm1hdEVycm9yIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPj4gbWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPj4oKTsKLSAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NEZXNjcmlwdG9yPigpOwotICAgICAgICBsaXN0LmFkZEFsbChtV2lkZ2V0TWFwLnZhbHVlcygpKTsKLSAgICAgICAgbWFwLnB1dChBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX1ZJRVcsIGxpc3QpOwotICAgICAgICAKLSAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgbGlzdC5hZGRBbGwobUxheW91dE1hcC52YWx1ZXMoKSk7Ci0gICAgICAgIG1hcC5wdXQoQW5kcm9pZENvbnN0YW50cy5DTEFTU19WSUVXR1JPVVAsIGxpc3QpOwotCi0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKG1MYXlvdXRQYXJhbXNNYXAudmFsdWVzKCkpOwotICAgICAgICBtYXAucHV0KEFuZHJvaWRDb25zdGFudHMuQ0xBU1NfVklFV0dST1VQX0xBWU9VVFBBUkFNUywgbGlzdCk7Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIElBbmRyb2lkQ2xhc3NMb2FkZXIuSUNsYXNzRGVzY3JpcHRvcn0gYnkgaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0byByZXR1cm4uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIElDbGFzc0Rlc2NyaXB0b3IgZ2V0Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbU1hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvbGF5b3V0LWRldmljZXMueHNkIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9sYXlvdXQtZGV2aWNlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNTg1NjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9sYXlvdXQtZGV2aWNlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2Q6c2NoZW1hCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9sYXlvdXQtZGV2aWNlcy8xIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6Yz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMSI+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF5b3V0LWRldmljZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgICAgICBUaGUgImxheW91dC1kZXZpY2VzIiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyBzY2hlbWEuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGNvbnRhaW4gb25lIG9yIG1vcmUgImRldmljZSIgZWxlbWVudHMgdGhhdCBlYWNoIGRlZmluZSB0aGUgY29uZmlndXJhdGlvbnMKLSAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIGEgZ2l2ZW4gZGV2aWNlLgotCi0gICAgICAgICAgICAgICAgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHVzZWQgaW4gdGhlIEdyYXBoaWNhbCBMYXlvdXQgRWRpdG9yIGluIHRoZQotICAgICAgICAgICAgICAgIEFuZHJvaWQgRGV2ZWxvcG1lbnQgVG9vbHMgKEFEVCkgcGx1Z2luIGZvciBFY2xpcHNlLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8IS0tIGxheW91dC1kZXZpY2VzIGRlZmluZXMgYSBzZXF1ZW5jZSBvZiAxLi5uIGRldmljZSBlbGVtZW50cy4gLS0+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRldmljZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBkZXZpY2UgZWxlbWVudCBtdXN0IGNvbnRhaW4gYXQgbW9zdCBvbmUgImRlZmF1bHQiIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSAiY29uZmlnIiBlbGVtZW50cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZGVmYXVsdCIgZWxlbWVudCBkZWZpbmVzIGFsbCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkIGJ5IHRoZSBmb2xsb3dpbmcgImNvbmZpZyIgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCAiY29uZmlnIiBlbGVtZW50IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXMsIGlmIGFueS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgImRldmljZSIgZWxlbWVudCBhbHNvIGhhcyBhIHJlcXVpcmVkICJuYW1lIiBhdHRyaWJ1dGUgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIHVzZXItaW50ZXJmYWNlIG5hbWUgb2YgdGhpcyBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRldmljZSBkZWZpbmVzIGEgY2hvaWNlIG9mIDAuLjEgZGVmYXVsdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmQgMS4ubiBjb25maWcgZWxlbWVudHMuIC0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0IiB0eXBlPSJjOnBhcmFtZXRlcnNUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZyIgIHR5cGU9ImM6Y29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOm5vcm1hbGl6ZWRTdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPCEtLSBUaGUgdHlwZSBvZiBhIGRldmljZT5kZWZhdWx0IGVsZW1lbnQuCi0gICAgICAgICBUaGlzIGlzIG92ZXJyaWRkZW4gYnkgY29uZmlnVHlwZSBiZWxvdyBmb3IgdGhlIGRldmljZT5jb25maWcgZWxlbWVudC4KLSAgICAtLT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlcnNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnNUeXBlIGRlZmluZSBhbGwgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gaGFwcGVuIGVpdGhlciBpbiBhCi0gICAgICAgICAgICAgICAgImRlZmF1bHQiIGVsZW1lbnQgb3IgaW4gYSBuYW1lZCAiY29uZmlnIiBlbGVtZW50LgotICAgICAgICAgICAgICAgIEVhY2ggcGFyYW1ldGVyIGVsZW1lbnQgY2FuIGFwcGVhciBvbmNlIGF0IG1vc3QuCi0KLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIHRob3NlIHVzZWQgdG8gc3BlY2lmeSBhbHRlcm5hdGUgQW5kcm9pZAotICAgICAgICAgICAgICAgIHJlc291cmNlcywgYXMgZG9jdW1lbnRlZCBieQotICAgICAgICAgICAgICAgIGh0dHA6Ly9kLmFuZHJvaWQuY29tL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcmVzb3VyY2VzLWkxOG4uaHRtbCNBbHRlcm5hdGVSZXNvdXJjZXMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDphbGw+Ci0gICAgICAgICAgICA8IS0tIHBhcmFtZXRlcnNUeXBlIHNheXMgdGhhdCAwLi4xIG9mIGVhY2ggb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBiZSBkZWNsYXJlZC4gLS0+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudHJ5LWNvZGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiBpcyBmb3IgYSBwYXJ0aWN1bGFyIE1vYmlsZSBDb3VudHJ5IENvZGUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmZsb2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIxMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heEluY2x1c2l2ZSB2YWx1ZT0iOTk5IiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5ldHdvcmstY29kZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIGlzIGZvciBhIHBhcnRpY3VsYXIgTW9iaWxlIE5ldHdvcmsgQ29kZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDptaW5FeGNsdXNpdmUgdmFsdWU9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JlZW4tc2l6ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZm9yIGEgcGFydGljdWxhciBjbGFzcyBvZiBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNtYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9ybWFsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGFyZ2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyZWVuLXJhdGlvIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBpcyBmb3IgYSB0YWxsZXIvd2lkZXIgdGhhbiB0cmFkaXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLiBUaGlzIGlzIGJhc2VkIHB1cmVseSBvbiB0aGUgYXNwZWN0IHJhdGlvbiBvZiB0aGUgc2NyZWVuOiBRVkdBLAotICAgICAgICAgICAgICAgICAgICAgICAgSFZHQSwgYW5kIFZHQSBhcmUgbm90bG9uZzsgV1FWR0EsIFdWR0EsIEZXVkdBIGFyZSBsb25nLiBOb3RlIHRoYXQgbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IG1lYW4gZWl0aGVyIHdpZGUgb3IgdGFsbCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb25nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm90bG9uZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JlZW4tb3JpZW50YXRpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIGZvciBhIHNjcmVlbiB0aGF0IGlzIHRhbGwgKHBvcnQpIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWRlIChsYW5kKS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icG9ydCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxhbmQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzcXVhcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGl4ZWwtZGVuc2l0eSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzY3JlZW4gZGVuc2l0eSB0aGUgY29uZmlndXJhdGlvbiBpcyBkZWZpbmVkIGZvci4gVGhlIG1lZGl1bQotICAgICAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSBvZiB0cmFkaXRpb25hbCBIVkdBIHNjcmVlbnMgKG1kcGkpIGlzIGRlZmluZWQgdG8gYmUgYXBwcm94aW1hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgMTYwZHBpOyBsb3cgZGVuc2l0eSAobGRwaSkgaXMgMTIwLCBhbmQgaGlnaCBkZW5zaXR5IChoZHBpKSBpcyAyNDAuIFRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyB0aHVzIGEgNDozIHNjYWxpbmcgZmFjdG9yIGJldHdlZW4gZWFjaCBkZW5zaXR5LCBzbyBhIDl4OSBiaXRtYXAgaW4gbGRwaQotICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgYmUgMTJ4MTIgaXMgbWRwaSBhbmQgMTZ4MTYgaW4gaGRwaS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsIG5vZHBpIGRlbnNpdHkgdGhhdCBjYW4gYmUgdXNlZCBpbiByZXNvdXJjZSBxdWFsaWZpZXJzIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgYSB2YWxpZCBrZXl3b3JkIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxkcGkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZHBpIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGRwaSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3VjaC10eXBlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRvdWNoIHR5cGUgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZGVmaW5lZCBmb3IuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vdG91Y2giIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHlsdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5nZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5Ym9hcmQtc3RhdGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdXIgY29uZmlndXJhdGlvbiB1c2VzIGEgc29mdCBrZXlib2FyZCwgdXNlIHRoZSBrZXlzc29mdCB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0IGRvZXNuJ3QgYW5kIGhhcyBhIHJlYWwga2V5Ym9hcmQsIHVzZSBrZXlzZXhwb3NlZCBvciBrZXlzaGlkZGVuLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZXlzZXhwb3NlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtleXNoaWRkZW4iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZXlzc29mdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXh0LWlucHV0LW1ldGhvZCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcmltYXJ5IHRleHQgaW5wdXQgbWV0aG9kIHRoZSBjb25maWd1cmF0aW9uIGlzIGRlc2lnbmVkIGZvci4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9rZXlzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icXdlcnR5IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTJrZXkiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF2LW1ldGhvZCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcmltYXJ5IG5vbi10b3VjaHNjcmVlbiBuYXZpZ2F0aW9uIG1ldGhvZCB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGVzaWduZWQgZm9yLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkcGFkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJhY2tiYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2hlZWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25hdiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JlZW4tZGltZW5zaW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRldmljZSBzY3JlZW4gcmVzb2x1dGlvbiwgaW4gcGl4ZWxzLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjIiIG1heE9jY3Vycz0iMiI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaXplIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4ZHBpIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGFjdHVhbCBkZW5zaXR5IGluIFggb2YgdGhlIGRldmljZSBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmZsb2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6bWluRXhjbHVzaXZlIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InlkcGkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYWN0dWFsIGRlbnNpdHkgaW4gWSBvZiB0aGUgZGV2aWNlIHNjcmVlbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDptaW5FeGNsdXNpdmUgdmFsdWU9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDwveHNkOmFsbD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gVGhlIHR5cGUgZGVmaW5pdGlvbiBvZiBhIGRldmljZT5jb25maWcgZWxlbWVudC4KLSAgICAgICAgIFRoaXMgdHlwZSBpcyBiYXNpY2FsbHkgYWxsIHRoZSBlbGVtZW50IGRlZmluZWQgYnkgcGFyYW1ldGVyc1R5cGUgYW5kIGFuIGV4dHJhCi0gICAgICAgICByZXF1aXJlZCAibmFtZSIgYXR0cmlidXRlIGZvciB0aGUgdXNlci1pbnRlcmZhY2UgY29uZmlndXJhdGlvbiBuYW1lLgotICAgIC0tPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBjb250ZW50IG9mIGEgImNvbmZpZyIgZWxlbWVudCBpbiBhICJkZXZpY2UiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBBICJjb25maWciIGVsZW1lbnQgY2FuIGhhdmUgYWxsIHRoZSBwYXJhbWV0ZXJzIGVsZW1lbnRzIGRlZmluZWQgYnkKLSAgICAgICAgICAgICAgICAicGFyYW1ldGVyVHlwZSIuIEl0IGFsc28gaGFzIGEgcmVxdWlyZWQgIm5hbWUiIGF0dHJpYnV0ZSB0aGF0IGluZGljYXRlcyB0aGUKLSAgICAgICAgICAgICAgICB1c2VyLWludGVyZmFjZSBuYW1lIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjOnBhcmFtZXRlcnNUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uU2VsZWN0b3IuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExZjRiOC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvQ29uZmlndXJhdGlvblNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Db3VudHJ5Q29kZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5LZXlib2FyZFN0YXRlUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTGFuZ3VhZ2VRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5OYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTmV0d29ya0NvZGVRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5QaXhlbERlbnNpdHlRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZWdpb25RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZXNvdXJjZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbkRpbWVuc2lvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuUmF0aW9RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5TaXplUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVG91Y2hTY3JlZW5RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5WZXJzaW9uUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuS2V5Ym9hcmRTdGF0ZVF1YWxpZmllci5LZXlib2FyZFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5OYXZpZ2F0aW9uTWV0aG9kOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLkRlbnNpdHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlblJhdGlvUXVhbGlmaWVyLlNjcmVlblJhdGlvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuU2l6ZVF1YWxpZmllci5TY3JlZW5TaXplOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLlRleHRJbnB1dE1ldGhvZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyLlRvdWNoU2NyZWVuVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQ3VzdG9tIFVJIHdpZGdldCB0byBsZXQgdXNlciBidWlsZCBhIEZvbGRlciBjb25maWd1cmF0aW9uLgotICogPHAvPgotICogVG8gdXNlIHRoaXMsIGluc3RhbnRpYXRlIHNvbWV3aGVyZSBpbiB0aGUgVUkgYW5kIHRoZW46Ci0gKiA8dWw+Ci0gKiA8bGk+VXNlIHtAbGluayAjc2V0Q29uZmlndXJhdGlvbihTdHJpbmcpfSBvciB7QGxpbmsgI3NldENvbmZpZ3VyYXRpb24oRm9sZGVyQ29uZmlndXJhdGlvbil9LgotICogPGxpPlJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIHVzaW5nIHtAbGluayAjZ2V0Q29uZmlndXJhdGlvbihGb2xkZXJDb25maWd1cmF0aW9uKX0uCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNlbGVjdG9yIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRFRIX0hJTlQgPSA2MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUX0hJTlQgPSAyNTA7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1PbkNoYW5nZUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBtRnVsbFRhYmxlVmlld2VyOwotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgbVNlbGVjdGlvblRhYmxlVmlld2VyOwotICAgIHByaXZhdGUgQnV0dG9uIG1BZGRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVJlbW92ZUJ1dHRvbjsKLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IG1TdGFja0xheW91dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtT25SZWZyZXNoID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZvbGRlckNvbmZpZ3VyYXRpb24gbUJhc2VDb25maWd1cmF0aW9uID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICBwcml2YXRlIGZpbmFsIEZvbGRlckNvbmZpZ3VyYXRpb24gbVNlbGVjdGVkQ29uZmlndXJhdGlvbiA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIFJlc291cmNlUXVhbGlmaWVyPiwgUXVhbGlmaWVyRWRpdEJhc2U+IG1VaU1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBSZXNvdXJjZVF1YWxpZmllcj4sIFF1YWxpZmllckVkaXRCYXNlPigpOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtRGV2aWNlTW9kZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtUXVhbGlmaWVyRWRpdFBhcmVudDsKLSAgICBwcml2YXRlIElRdWFsaWZpZXJGaWx0ZXIgbVF1YWxpZmllckZpbHRlcjsKLQotICAgIC8qKgotICAgICAqIEJhc2ljIG9mIHtAbGluayBWZXJpZnlMaXN0ZW5lcn0gdG8gb25seSBhY2NlcHQgZGlnaXRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2l0VmVyaWZpZXIgaW1wbGVtZW50cyBWZXJpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGRpZ2l0IG9ubHkuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBlLnRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgbGV0dGVyID0gZS50ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAobGV0dGVyIDwgJzAnIHx8IGxldHRlciA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBWZXJpZnlMaXN0ZW5lcn0gZm9yIENvdW50cnkgQ29kZSBxdWFsaWZpZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9iaWxlQ29kZVZlcmlmaWVyIGV4dGVuZHMgRGlnaXRWZXJpZmllciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgIHN1cGVyLnZlcmlmeVRleHQoZSk7Ci0KLSAgICAgICAgICAgIC8vIGJhc2ljIHRlc3RzIHBhc3NlZD8KLSAgICAgICAgICAgIGlmIChlLmRvaXQpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgbWF4IDMgZGlnaXRzLgotICAgICAgICAgICAgICAgIGlmIChlLnRleHQubGVuZ3RoKCkgLSBlLmVuZCArIGUuc3RhcnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgKChUZXh0KWUuZ2V0U291cmNlKCkpLmdldFRleHQoKS5sZW5ndGgoKSA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFZlcmlmeUxpc3RlbmVyfSBmb3IgdGhlIExhbmd1YWdlIGFuZCBSZWdpb24gcXVhbGlmaWVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExhbmd1YWdlUmVnaW9uVmVyaWZpZXIgaW1wbGVtZW50cyBWZXJpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGxlbmd0aAotICAgICAgICAgICAgaWYgKGUudGV4dC5sZW5ndGgoKSAtIGUuZW5kICsgZS5zdGFydCArICgoQ29tYm8pZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGxvd2VyIGNhc2Ugb25seS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGUudGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBsZXR0ZXIgPSBlLnRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgobGV0dGVyIDwgJ2EnIHx8IGxldHRlciA+ICd6JykgJiYgKGxldHRlciA8ICdBJyB8fCBsZXR0ZXIgPiAnWicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFZlcmlmeUxpc3RlbmVyfSBmb3IgdGhlIFBpeGVsIERlbnNpdHkgcXVhbGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVuc2l0eVZlcmlmaWVyIGV4dGVuZHMgRGlnaXRWZXJpZmllciB7IH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBWZXJpZnlMaXN0ZW5lcn0gZm9yIHRoZSBTY3JlZW4gRGltZW5zaW9uIHF1YWxpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpbWVuc2lvblZlcmlmaWVyIGV4dGVuZHMgRGlnaXRWZXJpZmllciB7IH0KLQotICAgIC8qKgotICAgICAqIEVudW0gZm9yIHRoZSBzdGF0ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBiZWluZyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBlbnVtIENvbmZpZ3VyYXRpb25TdGF0ZSB7Ci0gICAgICAgIE9LLCBJTlZBTElEX0NPTkZJRywgUkVHSU9OX1dJVEhPVVRfTEFOR1VBR0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBmaWx0ZXIgZm9yIHtAbGluayBSZXNvdXJjZVF1YWxpZmllcn0uCi0gICAgICogQHNlZSBDb25maWd1cmF0aW9uU2VsZWN0b3Ijc2V0UXVhbGlmaWVyRmlsdGVyKElRdWFsaWZpZXJGaWx0ZXIpCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJUXVhbGlmaWVyRmlsdGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgcXVhbGlmaWVyIGlzIGFjY2VwdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBhY2NlcHQoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIElmIHRoZSBkZXZpY2UgbW9kZSBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdG9yIG9ubHkKLSAgICAgKiBhbGxvd3MgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb24gdGhhdCBhcmUgdmFsaWQgb24gYSBkZXZpY2UgKGFzIG9wcG9zZWQgdG8gcmVzb3VyY2UKLSAgICAgKiBjb25maWd1cmF0aW9uKS4KLSAgICAgKiBGb3IgaW5zdGFuY2Uge0BsaW5rIERlbnNpdHkjTk9EUEl9IGlzIGEgdmFsaWQgcXVhbGlmaWVyIGZvciBhIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gYnV0Ci0gICAgICogdGhpcyBpcyBub3QgdmFsaWQgb24gYSBkZXZpY2UuCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHBhcmVudC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlTW9kZSB0aGUgZGV2aWNlIG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25TZWxlY3RvcihDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGRldmljZU1vZGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG1EZXZpY2VNb2RlICA9IGRldmljZU1vZGU7Ci0KLSAgICAgICAgbUJhc2VDb25maWd1cmF0aW9uLmNyZWF0ZURlZmF1bHQoKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotICAgICAgICBnbC5tYXJnaW5XaWR0aCA9IGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIHNldExheW91dChnbCk7Ci0KLSAgICAgICAgLy8gZmlyc3QgY29sdW1uIGlzIHRoZSBmaXJzdCB0YWJsZQotICAgICAgICBmaW5hbCBUYWJsZSBmdWxsVGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotICAgICAgICBmdWxsVGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGZ1bGxUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBmdWxsVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29sdW1uCi0gICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGZ1bGxUYWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmdWxsVGFibGUsIFNXVC5MRUZUKTsKLSAgICAgICAgLy8gc2V0IHRoZSBoZWFkZXIKLSAgICAgICAgZnVsbFRhYmxlQ29sdW1uLnNldFRleHQoIkF2YWlsYWJsZSBRdWFsaWZpZXJzIik7Ci0KLSAgICAgICAgZnVsbFRhYmxlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBmdWxsVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIGZ1bGxUYWJsZUNvbHVtbi5zZXRXaWR0aChyLndpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUZ1bGxUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihmdWxsVGFibGUpOwotICAgICAgICBtRnVsbFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUXVhbGlmaWVyQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBtRnVsbFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFF1YWxpZmllckxhYmVsUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogc2hvd1F1YWxpZmllclZhbHVlICovKSk7Ci0gICAgICAgIG1GdWxsVGFibGVWaWV3ZXIuc2V0SW5wdXQobUJhc2VDb25maWd1cmF0aW9uKTsKLSAgICAgICAgbUZ1bGxUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdCA9IHN0cnVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBSZXNvdXJjZVF1YWxpZmllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gMm5kIGNvbHVtbiBpcyB0aGUgbGVmdC9yaWdodCBhcnJvdyBidXR0b24KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotICAgICAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgZ2wubWFyZ2luV2lkdGggPSBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotICAgICAgICBuZXcgQ29tcG9zaXRlKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtQWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUFVTSCk7Ci0gICAgICAgIG1BZGRCdXR0b24uc2V0VGV4dCgiLT4iKTsKLSAgICAgICAgbUFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbUFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChJU3RydWN0dXJlZFNlbGVjdGlvbiltRnVsbFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIFJlc291cmNlUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllciA9IChSZXNvdXJjZVF1YWxpZmllcilmaXJzdDsKLQotICAgICAgICAgICAgICAgICAgICBtQmFzZUNvbmZpZ3VyYXRpb24ucmVtb3ZlUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uYWRkUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25UYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25UYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocXVhbGlmaWVyKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoZmFsc2UgLyoga2VlcFNlbGVjdGlvbiAqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtUmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUFVTSCk7Ci0gICAgICAgIG1SZW1vdmVCdXR0b24uc2V0VGV4dCgiPC0iKTsKLSAgICAgICAgbVJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChJU3RydWN0dXJlZFNlbGVjdGlvbiltU2VsZWN0aW9uVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgUmVzb3VyY2VRdWFsaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyID0gKFJlc291cmNlUXVhbGlmaWVyKWZpcnN0OwotCi0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24ucmVtb3ZlUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICAgICAgICAgIG1CYXNlQ29uZmlndXJhdGlvbi5hZGRRdWFsaWZpZXIocXVhbGlmaWVyKTsKLQotICAgICAgICAgICAgICAgICAgICBtRnVsbFRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvblRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShmYWxzZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIDNyZCBjb2x1bW4gaXMgdGhlIHNlbGVjdGVkIGNvbmZpZyB0YWJsZQotICAgICAgICBmaW5hbCBUYWJsZSBzZWxlY3Rpb25UYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlbGVjdGlvblRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBzZWxlY3Rpb25UYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBzZWxlY3Rpb25UYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBjb2x1bW4KLSAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gc2VsZWN0aW9uVGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oc2VsZWN0aW9uVGFibGUsIFNXVC5MRUZUKTsKLSAgICAgICAgLy8gc2V0IHRoZSBoZWFkZXIKLSAgICAgICAgc2VsZWN0aW9uVGFibGVDb2x1bW4uc2V0VGV4dCgiQ2hvc2VuIFF1YWxpZmllcnMiKTsKLQotICAgICAgICBzZWxlY3Rpb25UYWJsZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gc2VsZWN0aW9uVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIHNlbGVjdGlvblRhYmxlQ29sdW1uLnNldFdpZHRoKHIud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbVNlbGVjdGlvblRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHNlbGVjdGlvblRhYmxlKTsKLSAgICAgICAgbVNlbGVjdGlvblRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUXVhbGlmaWVyQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBtU2VsZWN0aW9uVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUXVhbGlmaWVyTGFiZWxQcm92aWRlcigKLSAgICAgICAgICAgICAgICB0cnVlIC8qIHNob3dRdWFsaWZpZXJWYWx1ZSAqLykpOwotICAgICAgICBtU2VsZWN0aW9uVGFibGVWaWV3ZXIuc2V0SW5wdXQobVNlbGVjdGVkQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIG1TZWxlY3Rpb25UYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBzZWxlY3Rpb24gY2hhbmdlcyBkdXJpbmcgcmVzZnJlc2hlcyBpbiBzb21lIGNhc2VzLgotICAgICAgICAgICAgICAgIGlmIChtT25SZWZyZXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3RTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3RTZWxlY3Rpb24uaXNFbXB0eSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3QgPSBzdHJ1Y3RTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIFJlc291cmNlUXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVyRWRpdEJhc2UgY29tcG9zaXRlID0gbVVpTWFwLmdldChmaXJzdC5nZXRDbGFzcygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0UXVhbGlmaWVyKChSZXNvdXJjZVF1YWxpZmllcilmaXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVF1YWxpZmllckVkaXRQYXJlbnQubGF5b3V0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUXVhbGlmaWVyRWRpdFBhcmVudC5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1SZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIDR0aCBjb2x1bW4gaXMgdGhlIGRldGFpbCBvZiB0aGUgc2VsZWN0ZWQgcXVhbGlmaWVyCi0gICAgICAgIG1RdWFsaWZpZXJFZGl0UGFyZW50ID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1RdWFsaWZpZXJFZGl0UGFyZW50LnNldExheW91dChtU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKSk7Ci0gICAgICAgIG1RdWFsaWZpZXJFZGl0UGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIFVJIGZvciBhbGwgdGhlIHF1YWxpZmllcnMsIGFuZCBhc3NvY2lhdGUgdGhlbSB0byB0aGUgUmVzb3VyY2VRdWFsaWZlciBjbGFzcy4KLSAgICAgICAgbVVpTWFwLnB1dChDb3VudHJ5Q29kZVF1YWxpZmllci5jbGFzcywgbmV3IE1DQ0VkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChOZXR3b3JrQ29kZVF1YWxpZmllci5jbGFzcywgbmV3IE1OQ0VkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChMYW5ndWFnZVF1YWxpZmllci5jbGFzcywgbmV3IExhbmd1YWdlRWRpdChtUXVhbGlmaWVyRWRpdFBhcmVudCkpOwotICAgICAgICBtVWlNYXAucHV0KFJlZ2lvblF1YWxpZmllci5jbGFzcywgbmV3IFJlZ2lvbkVkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChTY3JlZW5TaXplUXVhbGlmaWVyLmNsYXNzLCBuZXcgU2NyZWVuU2l6ZUVkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChTY3JlZW5SYXRpb1F1YWxpZmllci5jbGFzcywgbmV3IFNjcmVlblJhdGlvRWRpdChtUXVhbGlmaWVyRWRpdFBhcmVudCkpOwotICAgICAgICBtVWlNYXAucHV0KFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyLmNsYXNzLCBuZXcgT3JpZW50YXRpb25FZGl0KG1RdWFsaWZpZXJFZGl0UGFyZW50KSk7Ci0gICAgICAgIG1VaU1hcC5wdXQoUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLmNsYXNzLCBuZXcgUGl4ZWxEZW5zaXR5RWRpdChtUXVhbGlmaWVyRWRpdFBhcmVudCkpOwotICAgICAgICBtVWlNYXAucHV0KFRvdWNoU2NyZWVuUXVhbGlmaWVyLmNsYXNzLCBuZXcgVG91Y2hFZGl0KG1RdWFsaWZpZXJFZGl0UGFyZW50KSk7Ci0gICAgICAgIG1VaU1hcC5wdXQoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllci5jbGFzcywgbmV3IEtleWJvYXJkRWRpdChtUXVhbGlmaWVyRWRpdFBhcmVudCkpOwotICAgICAgICBtVWlNYXAucHV0KFRleHRJbnB1dE1ldGhvZFF1YWxpZmllci5jbGFzcywgbmV3IFRleHRJbnB1dEVkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyLmNsYXNzLCBuZXcgTmF2aWdhdGlvbkVkaXQobVF1YWxpZmllckVkaXRQYXJlbnQpKTsKLSAgICAgICAgbVVpTWFwLnB1dChTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIuY2xhc3MsIG5ldyBTY3JlZW5EaW1lbnNpb25FZGl0KG1RdWFsaWZpZXJFZGl0UGFyZW50KSk7Ci0gICAgICAgIG1VaU1hcC5wdXQoVmVyc2lvblF1YWxpZmllci5jbGFzcywgbmV3IFZlcnNpb25FZGl0KG1RdWFsaWZpZXJFZGl0UGFyZW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIHtAbGluayBJUXVhbGlmaWVyRmlsdGVyfS4gSWYgbm9uIG51bGwsIHRoaXMgd2lsbCByZXN0cmljdCB0aGUgcXVhbGlmaWVycyB0aGF0Ci0gICAgICogY2FuIGJlIGNob3Nlbi4KLSAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1YWxpZmllckZpbHRlcihJUXVhbGlmaWVyRmlsdGVyIGZpbHRlcikgewotICAgICAgICBtUXVhbGlmaWVyRmlsdGVyID0gZmlsdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIEEge0BsaW5rIFJ1bm5hYmxlfSB3aG9zZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlTGlzdGVuZXIoUnVubmFibGUgbGlzdGVuZXIpIHsKLSAgICAgICAgbU9uQ2hhbmdlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBVSSB3aXRoIGEgZ2l2ZW4ge0BsaW5rIEZvbGRlckNvbmZpZ3VyYXRpb259LiBUaGlzIG11c3QKLSAgICAgKiBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldChjb25maWcpOwotICAgICAgICBtU2VsZWN0aW9uVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgYmFzZSBjb25maWcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGNvbmZpZyBtaW51cyB0aGUgcXVhbGlmaWVycwotICAgICAgICAvLyBpbiBTZWxlY3RlZENvbmZpZ3VyYXRpb24KLSAgICAgICAgbUJhc2VDb25maWd1cmF0aW9uLnN1YnN0cmFjdChtU2VsZWN0ZWRDb25maWd1cmF0aW9uKTsKLSAgICAgICAgbUZ1bGxUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgVUkgd2l0aCB0aGUgY29uZmlndXJhdGlvbiByZXByZXNlbnRlZCBieSBhIHJlc291cmNlIGZvbGRlciBuYW1lLgotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvbGRlclNlZ21lbnRzIHRoZSBzZWdtZW50cyBvZiB0aGUgZm9sZGVyIG5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHNwbGl0IHVzaW5nIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9uI1FVQUxJRklFUl9TRVB9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzLCBvciBmYWxzZSBpZiB0aGUgZm9sZGVyIG5hbWUgaXMgbm90IGEgdmFsaWQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRDb25maWd1cmF0aW9uKFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzKSB7Ci0gICAgICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlnKGZvbGRlclNlZ21lbnRzKTsKLQotICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBVSSB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHJlcHJlc2VudGVkIGJ5IGEgcmVzb3VyY2UgZm9sZGVyIG5hbWUuCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGZvbGRlck5hbWUgdGhlIG5hbWUgb2YgdGhlIGZvbGRlci4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzcywgb3IgZmFsc2UgaWYgdGhlIGZvbGRlciBuYW1lIGlzIG5vdCBhIHZhbGlkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Q29uZmlndXJhdGlvbihTdHJpbmcgZm9sZGVyTmFtZSkgewotICAgICAgICAvLyBzcGxpdCB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIGluIHNlZ21lbnRzLgotICAgICAgICBTdHJpbmdbXSBmb2xkZXJTZWdtZW50cyA9IGZvbGRlck5hbWUuc3BsaXQoRm9sZGVyQ29uZmlndXJhdGlvbi5RVUFMSUZJRVJfU0VQKTsKLQotICAgICAgICByZXR1cm4gc2V0Q29uZmlndXJhdGlvbihmb2xkZXJTZWdtZW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBhcyBzZXR1cCBieSB0aGUgd2lkZ2V0LgotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufSBvYmplY3QgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGluZm9ybWF0aW9uCi0gICAgICogZnJvbSB0aGUgVUkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbihGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBjb25maWcuc2V0KG1TZWxlY3RlZENvbmZpZ3VyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBjb25maWd1cmF0aW9uIGJlaW5nIGVkaXRlZC9jcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRDb25maWd1cmF0aW9uLmdldEludmFsaWRRdWFsaWZpZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvblN0YXRlLklOVkFMSURfQ09ORklHOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uY2hlY2tSZWdpb24oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25TdGF0ZS5SRUdJT05fV0lUSE9VVF9MQU5HVUFHRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uU3RhdGUuT0s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgaW52YWxpZCBxdWFsaWZpZXIgb2YgdGhlIGNvbmZpZ3VyYXRpb24gYmVpbmcgZWRpdGVkL2NyZWF0ZWQsCi0gICAgICogb3IgPGNvZGU+bnVsbDxjb2RlPiBpZiB0aGV5IGFyZSBhbGwgdmFsaWQgKG9yIGlmIG5vbmUgZXhpc3RzKS4KLSAgICAgKiA8cC8+SWYge0BsaW5rICNnZXRTdGF0ZSgpfSByZXR1cm4ge0BsaW5rIENvbmZpZ3VyYXRpb25TdGF0ZSNJTlZBTElEX0NPTkZJR30gdGhlbiB0aGlzIHdpbGwKLSAgICAgKiBub3QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVF1YWxpZmllciBnZXRJbnZhbGlkUXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5nZXRJbnZhbGlkUXVhbGlmaWVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGNoYW5nZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHBhcmFtIGtlZXBTZWxlY3Rpb24gaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYXR0ZW1wcyB0byBhdm9pZCB0cmlnZ2VyaW5nIHNlbGVjdGlvbiBjaGFuZ2UgaW4KLSAgICAgKiB7QGxpbmsgI21TZWxlY3RlZENvbmZpZ3VyYXRpb259LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkNoYW5nZShib29sZWFuIGtlZXBTZWxlY3Rpb24pIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotICAgICAgICBpZiAoa2VlcFNlbGVjdGlvbikgewotICAgICAgICAgICAgbU9uUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgICAgICBzZWxlY3Rpb24gPSBtU2VsZWN0aW9uVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0aW9uVGFibGVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQotICAgICAgICBpZiAoa2VlcFNlbGVjdGlvbikgewotICAgICAgICAgICAgbVNlbGVjdGlvblRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgICAgICAgICAgbU9uUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1PbkNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PbkNoYW5nZUxpc3RlbmVyLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udGVudCBwcm92aWRlciBhcm91bmQgYSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBRdWFsaWZpZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIG1JbnB1dDsKLQotICAgICAgICBwdWJsaWMgUXVhbGlmaWVyQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IGVhc3kgY2FzZQotICAgICAgICAgICAgaWYgKG1RdWFsaWZpZXJGaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXQuZ2V0UXVhbGlmaWVycygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBsaXN0Ci0gICAgICAgICAgICBBcnJheUxpc3Q8UmVzb3VyY2VRdWFsaWZpZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlUXVhbGlmaWVyPigpOwotICAgICAgICAgICAgZm9yIChSZXNvdXJjZVF1YWxpZmllciBxdWFsIDogbUlucHV0LmdldFF1YWxpZmllcnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChtUXVhbGlmaWVyRmlsdGVyLmFjY2VwdChxdWFsKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChxdWFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgbUlucHV0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIEZvbGRlckNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtSW5wdXQgPSAoRm9sZGVyQ29uZmlndXJhdGlvbiluZXdJbnB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhYmVsIHByb3ZpZGVyIGZvciB7QGxpbmsgUmVzb3VyY2VRdWFsaWZpZXJ9IG9iamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVhbGlmaWVyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvd1F1YWxpZmllclZhbHVlOwotCi0gICAgICAgIHB1YmxpYyBRdWFsaWZpZXJMYWJlbFByb3ZpZGVyKGJvb2xlYW4gc2hvd1F1YWxpZmllclZhbHVlKSB7Ci0gICAgICAgICAgICBtU2hvd1F1YWxpZmllclZhbHVlID0gc2hvd1F1YWxpZmllclZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgb25lIGNvbHVtbiwgc28gd2UgY2FuIGlnbm9yZSBjb2x1bW5JbmRleAotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZVF1YWxpZmllcikgewotICAgICAgICAgICAgICAgIGlmIChtU2hvd1F1YWxpZmllclZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICgoUmVzb3VyY2VRdWFsaWZpZXIpZWxlbWVudCkuZ2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzICg/KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUmVzb3VyY2VRdWFsaWZpZXIpZWxlbWVudCkuZ2V0U2hvcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZVF1YWxpZmllcillbGVtZW50KS5nZXRTaG9ydE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgb25lIGNvbHVtbiwgc28gd2UgY2FuIGlnbm9yZSBjb2x1bW5JbmRleAotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZVF1YWxpZmllcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlUXVhbGlmaWVyKWVsZW1lbnQpLmdldEljb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2UgY2xhc3MgZm9yIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgUmVzb3VyY2VRdWFsaWZpZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFF1YWxpZmllckVkaXRCYXNlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgICAgICBwdWJsaWMgUXVhbGlmaWVyRWRpdEJhc2UoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0gICAgICAgICAgICBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpLnNldFRleHQodGl0bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdCB3aWRnZXQgZm9yIHtAbGluayBDb3VudHJ5Q29kZVF1YWxpZmllcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBNQ0NFZGl0IGV4dGVuZHMgUXVhbGlmaWVyRWRpdEJhc2UgewotCi0gICAgICAgIHByaXZhdGUgVGV4dCBtVGV4dDsKLQotICAgICAgICBwdWJsaWMgTUNDRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIENvdW50cnlDb2RlUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotICAgICAgICAgICAgbVRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IE1vYmlsZUNvZGVWZXJpZmllcigpKTsKLSAgICAgICAgICAgIG1UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25UZXh0Q2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1UZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uVGV4dENoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpLnNldFRleHQoIigzIGRpZ2l0IGNvZGUpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25UZXh0Q2hhbmdlKCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVRleHQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZywgbWVhbnMgYSBxdWFsaWZpZXIgd2l0aCBubyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgcXVhbGlmaWVyIGNsYXNzZXMgYXJlIGltbXV0YWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHF1YWxpZmllciBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCB3ZSBjcmVhdGUgYSBuZXcgZGVmYXVsdCBvbmUuCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRDb3VudHJ5Q29kZVF1YWxpZmllcihuZXcgQ291bnRyeUNvZGVRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENvdW50cnlDb2RlUXVhbGlmaWVyIHF1YWxpZmllciA9IENvdW50cnlDb2RlUXVhbGlmaWVyLmdldFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5Q29kZVF1YWxpZmllci5nZXRGb2xkZXJTZWdtZW50KEludGVnZXIucGFyc2VJbnQodmFsdWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRDb3VudHJ5Q29kZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZSEgTG9va3MgbGlrZSB0aGUgdmFsdWUgaXMgd3JvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3IgaW5zdGFuY2Ugbm90IGV4YWN0bHkgMyBkaWdpdHMpLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRDb3VudHJ5Q29kZVF1YWxpZmllcihuZXcgQ291bnRyeUNvZGVRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgdGhlIGNvZGUgaXMgbm90IGEgbnVtYmVyLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGhhcyBhIFZlcmlmeUxpc3RlbmVyIHRoYXQgcHJldmVudHMgaXQuCi0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0Q291bnRyeUNvZGVRdWFsaWZpZXIobmV3IENvdW50cnlDb2RlUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBDb3VudHJ5Q29kZVF1YWxpZmllciBxID0gKENvdW50cnlDb2RlUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgbVRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHEuZ2V0Q29kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0IHdpZGdldCBmb3Ige0BsaW5rIE5ldHdvcmtDb2RlUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIE1OQ0VkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0gICAgICAgIHByaXZhdGUgVGV4dCBtVGV4dDsKLQotICAgICAgICBwdWJsaWMgTU5DRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIE5ldHdvcmtDb2RlUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotICAgICAgICAgICAgbVRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IE1vYmlsZUNvZGVWZXJpZmllcigpKTsKLSAgICAgICAgICAgIG1UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25UZXh0Q2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvblRleHRDaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKS5zZXRUZXh0KCIoMS0zIGRpZ2l0IGNvZGUpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25UZXh0Q2hhbmdlKCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVRleHQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZywgbWVhbnMgYSBxdWFsaWZpZXIgd2l0aCBubyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgcXVhbGlmaWVyIGNsYXNzZXMgYXJlIGltbXV0YWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHF1YWxpZmllciBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCB3ZSBjcmVhdGUgYSBuZXcgZGVmYXVsdCBvbmUuCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXROZXR3b3JrQ29kZVF1YWxpZmllcihuZXcgTmV0d29ya0NvZGVRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE5ldHdvcmtDb2RlUXVhbGlmaWVyIHF1YWxpZmllciA9IE5ldHdvcmtDb2RlUXVhbGlmaWVyLmdldFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrQ29kZVF1YWxpZmllci5nZXRGb2xkZXJTZWdtZW50KEludGVnZXIucGFyc2VJbnQodmFsdWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXROZXR3b3JrQ29kZVF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZSEgTG9va3MgbGlrZSB0aGUgdmFsdWUgaXMgd3JvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3IgaW5zdGFuY2Ugbm90IGV4YWN0bHkgMyBkaWdpdHMpLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXROZXR3b3JrQ29kZVF1YWxpZmllcihuZXcgTmV0d29ya0NvZGVRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgdGhlIGNvZGUgaXMgbm90IGEgbnVtYmVyLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGhhcyBhIFZlcmlmeUxpc3RlbmVyIHRoYXQgcHJldmVudHMgaXQuCi0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0TmV0d29ya0NvZGVRdWFsaWZpZXIobmV3IE5ldHdvcmtDb2RlUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBOZXR3b3JrQ29kZVF1YWxpZmllciBxID0gKE5ldHdvcmtDb2RlUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgbVRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHEuZ2V0Q29kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0IHdpZGdldCBmb3Ige0BsaW5rIExhbmd1YWdlUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIExhbmd1YWdlRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtTGFuZ3VhZ2U7Ci0KLSAgICAgICAgcHVibGljIExhbmd1YWdlRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIExhbmd1YWdlUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtTGFuZ3VhZ2UgPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTik7Ci0gICAgICAgICAgICBtTGFuZ3VhZ2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBtTGFuZ3VhZ2UuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IExhbmd1YWdlUmVnaW9uVmVyaWZpZXIoKSk7Ci0gICAgICAgICAgICBtTGFuZ3VhZ2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uTGFuZ3VhZ2VDaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbkxhbmd1YWdlQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtTGFuZ3VhZ2UuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbkxhbmd1YWdlQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSkuc2V0VGV4dCgiKDIgbGV0dGVyIGNvZGUpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25MYW5ndWFnZUNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1MYW5ndWFnZS5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0TGFuZ3VhZ2VRdWFsaWZpZXIobmV3IExhbmd1YWdlUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMYW5ndWFnZVF1YWxpZmllciBxdWFsaWZpZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBzZWdtZW50ID0gTGFuZ3VhZ2VRdWFsaWZpZXIuZ2V0Rm9sZGVyU2VnbWVudCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZXIgPSBMYW5ndWFnZVF1YWxpZmllci5nZXRRdWFsaWZpZXIoc2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0TGFuZ3VhZ2VRdWFsaWZpZXIocXVhbGlmaWVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBGYWlsdXJlISBMb29rcyBsaWtlIHRoZSB2YWx1ZSBpcyB3cm9uZyAoZm9yIGluc3RhbmNlIGEgb25lIGxldHRlciBzdHJpbmcpLgotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldExhbmd1YWdlUXVhbGlmaWVyKG5ldyBMYW5ndWFnZVF1YWxpZmllcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSBvZiBjaGFuZ2UKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUgLyoga2VlcFNlbGVjdGlvbiAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICAgICAgTGFuZ3VhZ2VRdWFsaWZpZXIgcSA9IChMYW5ndWFnZVF1YWxpZmllcilxdWFsaWZpZXI7Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxhbmd1YWdlLnNldFRleHQodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdCB3aWRnZXQgZm9yIHtAbGluayBSZWdpb25RdWFsaWZpZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgUmVnaW9uRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtUmVnaW9uOwotCi0gICAgICAgIHB1YmxpYyBSZWdpb25FZGl0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgUmVnaW9uUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtUmVnaW9uID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04pOwotICAgICAgICAgICAgbVJlZ2lvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgICAgIG1SZWdpb24uYWRkVmVyaWZ5TGlzdGVuZXIobmV3IExhbmd1YWdlUmVnaW9uVmVyaWZpZXIoKSk7Ci0gICAgICAgICAgICBtUmVnaW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvblJlZ2lvbkNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUmVnaW9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtUmVnaW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25SZWdpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKS5zZXRUZXh0KCIoMiBsZXR0ZXIgY29kZSkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblJlZ2lvbkNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1SZWdpb24uZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZywgbWVhbnMgbm8gcXVhbGlmaWVyLgotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBxdWFsaWZpZXIgY2xhc3NlcyBhcmUgaW1tdXRhYmxlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcXVhbGlmaWVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFJlZ2lvblF1YWxpZmllcihuZXcgUmVnaW9uUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSZWdpb25RdWFsaWZpZXIgcXVhbGlmaWVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VnbWVudCA9IFJlZ2lvblF1YWxpZmllci5nZXRGb2xkZXJTZWdtZW50KHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpZmllciA9IFJlZ2lvblF1YWxpZmllci5nZXRRdWFsaWZpZXIoc2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0UmVnaW9uUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZSEgTG9va3MgbGlrZSB0aGUgdmFsdWUgaXMgd3JvbmcgKGZvciBpbnN0YW5jZSBhIG9uZSBsZXR0ZXIgc3RyaW5nKS4KLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRSZWdpb25RdWFsaWZpZXIobmV3IFJlZ2lvblF1YWxpZmllcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSBvZiBjaGFuZ2UKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUgLyoga2VlcFNlbGVjdGlvbiAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICAgICAgUmVnaW9uUXVhbGlmaWVyIHEgPSAoUmVnaW9uUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUmVnaW9uLnNldFRleHQocS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgU2NyZWVuU2l6ZVF1YWxpZmllcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTY3JlZW5TaXplRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLQotICAgICAgICBwcml2YXRlIENvbWJvIG1TaXplOwotCi0gICAgICAgIHB1YmxpYyBTY3JlZW5TaXplRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFNjcmVlblNpemVRdWFsaWZpZXIuTkFNRSk7Ci0KLSAgICAgICAgICAgIG1TaXplID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgICAgIFNjcmVlblNpemVbXSBzc1ZhbHVlcyA9IFNjcmVlblNpemUudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKFNjcmVlblNpemUgdmFsdWUgOiBzc1ZhbHVlcykgewotICAgICAgICAgICAgICAgIG1TaXplLmFkZCh2YWx1ZS5nZXREaXNwbGF5VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TaXplLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbVNpemUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2NyZWVuU2l6ZUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2NyZWVuU2l6ZUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25TY3JlZW5TaXplQ2hhbmdlKCkgewotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjdXJyZW50IGNvbmZpZwotICAgICAgICAgICAgaW50IGluZGV4ID0gbVNpemUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRTY3JlZW5TaXplUXVhbGlmaWVyKG5ldyBTY3JlZW5TaXplUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICBTY3JlZW5TaXplLmdldEJ5SW5kZXgoaW5kZXgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdGlvbiwgbWVhbnMgbm8gcXVhbGlmaWVyLgotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBxdWFsaWZpZXIgY2xhc3NlcyBhcmUgaW1tdXRhYmxlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcXVhbGlmaWVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFNjcmVlblNpemVRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2NyZWVuU2l6ZVF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBTY3JlZW5TaXplUXVhbGlmaWVyIHEgPSAoU2NyZWVuU2l6ZVF1YWxpZmllcilxdWFsaWZpZXI7Ci0KLSAgICAgICAgICAgIFNjcmVlblNpemUgdmFsdWUgPSBxLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TaXplLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TaXplLnNlbGVjdChTY3JlZW5TaXplLmdldEluZGV4KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0IHdpZGdldCBmb3Ige0BsaW5rIFNjcmVlblJhdGlvUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNjcmVlblJhdGlvRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLQotICAgICAgICBwcml2YXRlIENvbWJvIG1TaXplOwotCi0gICAgICAgIHB1YmxpYyBTY3JlZW5SYXRpb0VkaXQoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50LCBTY3JlZW5SYXRpb1F1YWxpZmllci5OQU1FKTsKLQotICAgICAgICAgICAgbVNpemUgPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICAgICAgU2NyZWVuUmF0aW9bXSBzclZhbHVlcyA9IFNjcmVlblJhdGlvLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChTY3JlZW5SYXRpbyB2YWx1ZSA6IHNyVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgbVNpemUuYWRkKHZhbHVlLmdldERpc3BsYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVNpemUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBtU2l6ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JlZW5SYXRpb0NoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2NyZWVuUmF0aW9DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uU2NyZWVuUmF0aW9DaGFuZ2UoKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgY29uZmlnCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBtU2l6ZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFNjcmVlblJhdGlvUXVhbGlmaWVyKG5ldyBTY3JlZW5SYXRpb1F1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjcmVlblJhdGlvLmdldEJ5SW5kZXgoaW5kZXgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdGlvbiwgbWVhbnMgbm8gcXVhbGlmaWVyLgotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBxdWFsaWZpZXIgY2xhc3NlcyBhcmUgaW1tdXRhYmxlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcXVhbGlmaWVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFNjcmVlblJhdGlvUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjcmVlblJhdGlvUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3RpZnkgb2YgY2hhbmdlCi0gICAgICAgICAgICBvbkNoYW5nZSh0cnVlIC8qIGtlZXBTZWxlY3Rpb24gKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihSZXNvdXJjZVF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIFNjcmVlblJhdGlvUXVhbGlmaWVyIHEgPSAoU2NyZWVuUmF0aW9RdWFsaWZpZXIpcXVhbGlmaWVyOwotCi0gICAgICAgICAgICBTY3JlZW5SYXRpbyB2YWx1ZSA9IHEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNpemUuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNpemUuc2VsZWN0KFNjcmVlblJhdGlvLmdldEluZGV4KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0IHdpZGdldCBmb3Ige0BsaW5rIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIE9yaWVudGF0aW9uRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLQotICAgICAgICBwcml2YXRlIENvbWJvIG1PcmllbnRhdGlvbjsKLQotICAgICAgICBwdWJsaWMgT3JpZW50YXRpb25FZGl0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIuTkFNRSk7Ci0KLSAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgICAgICBTY3JlZW5PcmllbnRhdGlvbltdIHNvVmFsdWVzID0gU2NyZWVuT3JpZW50YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKFNjcmVlbk9yaWVudGF0aW9uIHZhbHVlIDogc29WYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24uYWRkKHZhbHVlLmdldERpc3BsYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU9yaWVudGF0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbU9yaWVudGF0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbk9yaWVudGF0aW9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25PcmllbnRhdGlvbkNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIGludCBpbmRleCA9IG1PcmllbnRhdGlvbi5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKG5ldyBTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgU2NyZWVuT3JpZW50YXRpb24uZ2V0QnlJbmRleChpbmRleCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0aW9uLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSBvZiBjaGFuZ2UKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUgLyoga2VlcFNlbGVjdGlvbiAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICAgICAgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIgcSA9IChTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcilxdWFsaWZpZXI7Ci0KLSAgICAgICAgICAgIFNjcmVlbk9yaWVudGF0aW9uIHZhbHVlID0gcS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uLnNlbGVjdChTY3JlZW5PcmllbnRhdGlvbi5nZXRJbmRleCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdCB3aWRnZXQgZm9yIHtAbGluayBQaXhlbERlbnNpdHlRdWFsaWZpZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgUGl4ZWxEZW5zaXR5RWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtRGVuc2l0eTsKLQotICAgICAgICBwdWJsaWMgUGl4ZWxEZW5zaXR5RWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFBpeGVsRGVuc2l0eVF1YWxpZmllci5OQU1FKTsKLQotICAgICAgICAgICAgbURlbnNpdHkgPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICAgICAgRGVuc2l0eVtdIHNvVmFsdWVzID0gRGVuc2l0eS52YWx1ZXMoKTsKLSAgICAgICAgICAgIGZvciAoRGVuc2l0eSB2YWx1ZSA6IHNvVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VNb2RlID09IGZhbHNlIHx8IHZhbHVlICE9IERlbnNpdHkuTk9EUEkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbnNpdHkuYWRkKHZhbHVlLmdldERpc3BsYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EZW5zaXR5LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbURlbnNpdHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRGVuc2l0eUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRGVuc2l0eUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRGVuc2l0eUNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIGludCBpbmRleCA9IG1EZW5zaXR5LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0UGl4ZWxEZW5zaXR5UXVhbGlmaWVyKG5ldyBQaXhlbERlbnNpdHlRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgIERlbnNpdHkuZ2V0QnlJbmRleChpbmRleCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0aW9uLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0UGl4ZWxEZW5zaXR5UXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBpeGVsRGVuc2l0eVF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBQaXhlbERlbnNpdHlRdWFsaWZpZXIgcSA9IChQaXhlbERlbnNpdHlRdWFsaWZpZXIpcXVhbGlmaWVyOwotCi0gICAgICAgICAgICBEZW5zaXR5IHZhbHVlID0gcS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGVuc2l0eS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRGVuc2l0eS5zZWxlY3QoRGVuc2l0eS5nZXRJbmRleCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdCB3aWRnZXQgZm9yIHtAbGluayBUb3VjaFNjcmVlblF1YWxpZmllcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUb3VjaEVkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtVG91Y2hTY3JlZW47Ci0KLSAgICAgICAgcHVibGljIFRvdWNoRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFRvdWNoU2NyZWVuUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtVG91Y2hTY3JlZW4gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICAgICAgVG91Y2hTY3JlZW5UeXBlW10gdHN0VmFsdWVzID0gVG91Y2hTY3JlZW5UeXBlLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChUb3VjaFNjcmVlblR5cGUgdmFsdWUgOiB0c3RWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hTY3JlZW4uYWRkKHZhbHVlLmdldERpc3BsYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRvdWNoU2NyZWVuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbVRvdWNoU2NyZWVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvblRvdWNoQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25Ub3VjaENoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Ub3VjaENoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIGludCBpbmRleCA9IG1Ub3VjaFNjcmVlbi5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldFRvdWNoVHlwZVF1YWxpZmllcihuZXcgVG91Y2hTY3JlZW5RdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBUb3VjaFNjcmVlblR5cGUuZ2V0QnlJbmRleChpbmRleCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0aW9uLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0VG91Y2hUeXBlUXVhbGlmaWVyKG5ldyBUb3VjaFNjcmVlblF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBUb3VjaFNjcmVlblF1YWxpZmllciBxID0gKFRvdWNoU2NyZWVuUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgVG91Y2hTY3JlZW5UeXBlIHZhbHVlID0gcS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hTY3JlZW4uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoU2NyZWVuLnNlbGVjdChUb3VjaFNjcmVlblR5cGUuZ2V0SW5kZXgodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBLZXlib2FyZEVkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtS2V5Ym9hcmQ7Ci0KLSAgICAgICAgcHVibGljIEtleWJvYXJkRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIEtleWJvYXJkU3RhdGVRdWFsaWZpZXIuTkFNRSk7Ci0KLSAgICAgICAgICAgIG1LZXlib2FyZCA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgICAgICBLZXlib2FyZFN0YXRlW10ga3NWYWx1ZXMgPSBLZXlib2FyZFN0YXRlLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChLZXlib2FyZFN0YXRlIHZhbHVlIDoga3NWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBtS2V5Ym9hcmQuYWRkKHZhbHVlLmdldERpc3BsYXlWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUtleWJvYXJkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbUtleWJvYXJkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbktleWJvYXJkQ2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25LZXlib2FyZENoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25LZXlib2FyZENoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIGludCBpbmRleCA9IG1LZXlib2FyZC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIobmV3IEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlib2FyZFN0YXRlLmdldEJ5SW5kZXgoaW5kZXgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdGlvbiwgbWVhbnMgbm8gcXVhbGlmaWVyLgotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBxdWFsaWZpZXIgY2xhc3NlcyBhcmUgaW1tdXRhYmxlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcXVhbGlmaWVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRDb25maWd1cmF0aW9uLnNldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBLZXlib2FyZFN0YXRlUXVhbGlmaWVyIHEgPSAoS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcilxdWFsaWZpZXI7Ci0KLSAgICAgICAgICAgIEtleWJvYXJkU3RhdGUgdmFsdWUgPSBxLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1LZXlib2FyZC5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtS2V5Ym9hcmQuc2VsZWN0KEtleWJvYXJkU3RhdGUuZ2V0SW5kZXgodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRleHRJbnB1dEVkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtVGV4dElucHV0OwotCi0gICAgICAgIHB1YmxpYyBUZXh0SW5wdXRFZGl0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtVGV4dElucHV0ID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgICAgIFRleHRJbnB1dE1ldGhvZFtdIHRpbVZhbHVlcyA9IFRleHRJbnB1dE1ldGhvZC52YWx1ZXMoKTsKLSAgICAgICAgICAgIGZvciAoVGV4dElucHV0TWV0aG9kIHZhbHVlIDogdGltVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgbVRleHRJbnB1dC5hZGQodmFsdWUuZ2V0RGlzcGxheVZhbHVlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVGV4dElucHV0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbVRleHRJbnB1dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25UZXh0SW5wdXRDaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvblRleHRJbnB1dENoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25UZXh0SW5wdXRDaGFuZ2UoKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgY29uZmlnCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBtVGV4dElucHV0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKG5ldyBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0SW5wdXRNZXRob2QuZ2V0QnlJbmRleChpbmRleCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0aW9uLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIgcSA9IChUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIpcXVhbGlmaWVyOwotCi0gICAgICAgICAgICBUZXh0SW5wdXRNZXRob2QgdmFsdWUgPSBxLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1UZXh0SW5wdXQuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRleHRJbnB1dC5zZWxlY3QoVGV4dElucHV0TWV0aG9kLmdldEluZGV4KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0IHdpZGdldCBmb3Ige0BsaW5rIE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTmF2aWdhdGlvbkVkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21ibyBtTmF2aWdhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTmF2aWdhdGlvbkVkaXQoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50LCBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyLk5BTUUpOwotCi0gICAgICAgICAgICBtTmF2aWdhdGlvbiA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgICAgICBOYXZpZ2F0aW9uTWV0aG9kW10gbm1WYWx1ZXMgPSBOYXZpZ2F0aW9uTWV0aG9kLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChOYXZpZ2F0aW9uTWV0aG9kIHZhbHVlIDogbm1WYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBtTmF2aWdhdGlvbi5hZGQodmFsdWUuZ2V0RGlzcGxheVZhbHVlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTmF2aWdhdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgICAgIG1OYXZpZ2F0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbk5hdmlnYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbk5hdmlnYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTmF2aWdhdGlvbkNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIGludCBpbmRleCA9IG1OYXZpZ2F0aW9uLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcihuZXcgTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25NZXRob2QuZ2V0QnlJbmRleChpbmRleCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0aW9uLCBtZWFucyBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3RpZnkgb2YgY2hhbmdlCi0gICAgICAgICAgICBvbkNoYW5nZSh0cnVlIC8qIGtlZXBTZWxlY3Rpb24gKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihSZXNvdXJjZVF1YWxpZmllciBxdWFsaWZpZXIpIHsKLSAgICAgICAgICAgIE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIgcSA9IChOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgTmF2aWdhdGlvbk1ldGhvZCB2YWx1ZSA9IHEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU5hdmlnYXRpb24uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU5hdmlnYXRpb24uc2VsZWN0KE5hdmlnYXRpb25NZXRob2QuZ2V0SW5kZXgodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNjcmVlbkRpbWVuc2lvbkVkaXQgZXh0ZW5kcyBRdWFsaWZpZXJFZGl0QmFzZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBUZXh0IG1TaXplMTsKLSAgICAgICAgcHJpdmF0ZSBUZXh0IG1TaXplMjsKLQotICAgICAgICBwdWJsaWMgU2NyZWVuRGltZW5zaW9uRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllci5OQU1FKTsKLQotICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2l6ZUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIEZvY3VzQWRhcHRlciBmb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2l6ZUNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1TaXplMSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotICAgICAgICAgICAgbVNpemUxLmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBEaW1lbnNpb25WZXJpZmllcigpKTsKLSAgICAgICAgICAgIG1TaXplMS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtU2l6ZTEuYWRkRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLQotICAgICAgICAgICAgbVNpemUyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0gICAgICAgICAgICBtU2l6ZTIuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IERpbWVuc2lvblZlcmlmaWVyKCkpOwotICAgICAgICAgICAgbVNpemUyLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1TaXplMi5hZGRGb2N1c0xpc3RlbmVyKGZvY3VzTGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2l6ZUNoYW5nZSgpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCBjb25maWcKLSAgICAgICAgICAgIFN0cmluZyBzaXplMSA9IG1TaXplMS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2l6ZTIgPSBtU2l6ZTIuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc2l6ZTEubGVuZ3RoKCkgPT0gMCB8fCBzaXplMi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBzdHJpbmdzIGlzIGVtcHR5LCByZXNldCB0byBubyBxdWFsaWZpZXIuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2UgY3JlYXRlIGEgbmV3IGRlZmF1bHQgb25lLgotICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0U2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKG5ldyBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNjcmVlbkRpbWVuc2lvblF1YWxpZmllciBxdWFsaWZpZXIgPSBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIuZ2V0UXVhbGlmaWVyKHNpemUxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0U2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKHF1YWxpZmllcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZSEgTG9va3MgbGlrZSB0aGUgdmFsdWUgaXMgd3JvbmcsIHJlc2V0IHRoZSBxdWFsaWZpZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1YWxpZmllciBjbGFzc2VzIGFyZSBpbW11dGFibGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcXVhbGlmaWVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSBvZiBjaGFuZ2UKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUgLyoga2VlcFNlbGVjdGlvbiAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFJlc291cmNlUXVhbGlmaWVyIHF1YWxpZmllcikgewotICAgICAgICAgICAgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyIHEgPSAoU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKXF1YWxpZmllcjsKLQotICAgICAgICAgICAgbVNpemUxLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhxLmdldFZhbHVlMSgpKSk7Ci0gICAgICAgICAgICBtU2l6ZTIuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHEuZ2V0VmFsdWUyKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXQgd2lkZ2V0IGZvciB7QGxpbmsgVmVyc2lvblF1YWxpZmllcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBWZXJzaW9uRWRpdCBleHRlbmRzIFF1YWxpZmllckVkaXRCYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBUZXh0IG1UZXh0OwotCi0gICAgICAgIHB1YmxpYyBWZXJzaW9uRWRpdChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFZlcnNpb25RdWFsaWZpZXIuTkFNRSk7Ci0KLSAgICAgICAgICAgIG1UZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0gICAgICAgICAgICBtVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgTW9iaWxlQ29kZVZlcmlmaWVyKCkpOwotICAgICAgICAgICAgbVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvblZlcnNpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1UZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uVmVyc2lvbkNoYW5nZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpLnNldFRleHQoIihQbGF0Zm9ybSBBUEkgbGV2ZWwpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25WZXJzaW9uQ2hhbmdlKCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVRleHQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZywgbWVhbnMgYSBxdWFsaWZpZXIgd2l0aCBubyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgcXVhbGlmaWVyIGNsYXNzZXMgYXJlIGltbXV0YWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHF1YWxpZmllciBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCB3ZSBjcmVhdGUgYSBuZXcgZGVmYXVsdCBvbmUuCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRWZXJzaW9uUXVhbGlmaWVyKG5ldyBWZXJzaW9uUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uUXVhbGlmaWVyIHF1YWxpZmllciA9IFZlcnNpb25RdWFsaWZpZXIuZ2V0UXVhbGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25RdWFsaWZpZXIuZ2V0Rm9sZGVyU2VnbWVudChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0VmVyc2lvblF1YWxpZmllcihxdWFsaWZpZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZSEgTG9va3MgbGlrZSB0aGUgdmFsdWUgaXMgd3JvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZENvbmZpZ3VyYXRpb24uc2V0VmVyc2lvblF1YWxpZmllcihuZXcgVmVyc2lvblF1YWxpZmllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSB0aGUgY29kZSBpcyBub3QgYSBudW1iZXIuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc2luY2UgdGhlIHRleHQKLSAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgaGFzIGEgVmVyaWZ5TGlzdGVuZXIgdGhhdCBwcmV2ZW50cyBpdC4KLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQ29uZmlndXJhdGlvbi5zZXRWZXJzaW9uUXVhbGlmaWVyKG5ldyBWZXJzaW9uUXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGNoYW5nZQotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSAvKiBrZWVwU2VsZWN0aW9uICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoUmVzb3VyY2VRdWFsaWZpZXIgcXVhbGlmaWVyKSB7Ci0gICAgICAgICAgICBWZXJzaW9uUXVhbGlmaWVyIHEgPSAoVmVyc2lvblF1YWxpZmllcilxdWFsaWZpZXI7Ci0KLSAgICAgICAgICAgIG1UZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhxLmdldFZlcnNpb24oKSkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvRWNsaXBzZVVpSGVscGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvRWNsaXBzZVVpSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmQyMzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL0VjbGlwc2VVaUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEhlbHBlcnMgZm9yIEVjbGlwc2UgVUkgcmVsYXRlZCBzdHVmZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVjbGlwc2VVaUhlbHBlciB7Ci0KLSAgICAvKiogVmlldyBJZCBmb3IgdGhlIGRlZmF1bHQgRWNsaXBzZSBDb250ZW50IE91dGxpbmUgdmlldy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX09VVExJTkVfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSI7Ci0gICAgLyoqIFZpZXcgSWQgZm9yIHRoZSBkZWZhdWx0IEVjbGlwc2UgUHJvcGVydHkgU2hlZXQgdmlldy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TSEVFVF9WSUVXX0lEICA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IjsKLSAgICAKLSAgICAvKiogVGhpcyBjbGFzcyBuZXZlciBnZXRzIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIEVjbGlwc2VVaUhlbHBlcigpIHsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2hvd3MgdGhlIGNvcnJlc3BvbmRpbmcgdmlldy4KLSAgICAgKiA8cC8+Ci0gICAgICogU2lsZW50bHkgZmFpbHMgaW4gY2FzZSBvZiBlcnJvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmlld0lkIE9uZSBvZiB7QGxpbmsgI0NPTlRFTlRfT1VUTElORV9WSUVXX0lEfSwge0BsaW5rICNQUk9QRVJUWV9TSEVFVF9WSUVXX0lEfS4KLSAgICAgKiBAcGFyYW0gYWN0aXZhdGUgVHJ1ZSB0byBmb3JjZSBhY3RpdmF0ZSAoaS5lLiB0YWtlcyBmb2N1cyksIGZhbHNlIHRvIGp1c3QgbWFrZSB2aXNpYmxlIChpLmUuCi0gICAgICogICAgICAgICAgICAgICAgIGRvZXMgbm90IHN0ZWFsIGZvY3VzLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1ZpZXcoU3RyaW5nIHZpZXdJZCwgYm9vbGVhbiBhY3RpdmF0ZSkgewotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIGlmICh3aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbi5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLnNob3dWaWV3KHZpZXdJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNlY29uZGFyeUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlID8gSVdvcmtiZW5jaFBhZ2UuVklFV19BQ1RJVkFURSA6IElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL0lVcGRhdGVXaXphcmREaWFsb2cuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9JVXBkYXRlV2l6YXJkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhYThjMmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL0lVcGRhdGVXaXphcmREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7DQotDQotDQotLyoqDQotICogQW4gaW50ZXJmYWNlIHRoYXQgZW5hYmxlcyBhIGNsaWVudCB0byB1cGRhdGUge0BsaW5rIFdpemFyZERpYWxvZ30gYWZ0ZXIgaXRzIGNyZWF0aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVdpemFyZERpYWxvZyB7DQotICAgIC8qKg0KLSAgICAgKiBJbnZva2VkIGFmdGVyIHtAbGluayBXaXphcmREaWFsb2cjY3JlYXRlKCl9IHRvIGxldCB0aGUgY2FsbGVyIHVwZGF0ZSB0aGUgZGlhbG9nLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdXBkYXRlV2l6YXJkRGlhbG9nKFdpemFyZERpYWxvZ0V4IGRpYWxvZyk7DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZWZlcmVuY2VDaG9vc2VyRGlhbG9nLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvUmVmZXJlbmNlQ2hvb3NlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTRiZTZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZWZlcmVuY2VDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZWZhY3RvcmluZ3MuZXh0cmFjdHN0cmluZy5FeHRyYWN0U3RyaW5nUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nLkV4dHJhY3RTdHJpbmdXaXphcmQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlBhdHRlcm5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBBIGRpYWxvZyB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgcmVmZXJlbmNlIHRvIGEgcmVzb3VyY2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlQ2hvb3NlckRpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNSZXNvdXJjZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIkAoLiopLyguKykiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gc0lubGluZUlkUmVzb3VyY2VQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJAXFwraWQvKC4rKSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBJRGlhbG9nU2V0dGluZ3Mgc0RpYWxvZ1NldHRpbmdzID0gbmV3IERpYWxvZ1NldHRpbmdzKCIiKTsKLSAgICAKLSAgICBwcml2YXRlIElSZXNvdXJjZVJlcG9zaXRvcnkgbVJlc291cmNlczsKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFJlc291cmNlOwotICAgIHByaXZhdGUgRmlsdGVyZWRUcmVlIG1GaWx0ZXJlZFRyZWU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbU5ld1Jlc0J1dHRvbjsKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIHByaXZhdGUgVHJlZVZpZXdlciBtVHJlZVZpZXdlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlQ2hvb3NlckRpYWxvZyhJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VSZXBvc2l0b3J5IHJlc291cmNlcywgU2hlbGwgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgbVJlc291cmNlcyA9IHJlc291cmNlczsKLQotICAgICAgICBpbnQgc2hlbGxTdHlsZSA9IGdldFNoZWxsU3R5bGUoKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShzaGVsbFN0eWxlIHwgU1dULk1BWCB8IFNXVC5SRVNJWkUpOwotCi0gICAgICAgIHNldFRpdGxlKCJSZWZlcmVuY2UgQ2hvb3NlciIpOwotICAgICAgICBzZXRNZXNzYWdlKFN0cmluZy5mb3JtYXQoIkNob29zZSBhIHJlc291cmNlIikpOwotICAgICAgICAKLSAgICAgICAgc2V0RGlhbG9nQm91bmRzU2V0dGluZ3Moc0RpYWxvZ1NldHRpbmdzLCBnZXREaWFsb2dCb3VuZHNTdHJhdGVneSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgIG1DdXJyZW50UmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50UmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFJlc291cmNlOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2cjY29tcHV0ZVJlc3VsdCgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgVHJlZVBhdGggdHJlZVNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAodHJlZVNlbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodHJlZVNlbGVjdGlvbi5nZXRTZWdtZW50Q291bnQoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZSB0eXBlIGFuZCB0aGUgcmVzb3VyY2UgaXRlbQotICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoUmVzb3VyY2VUeXBlKXRyZWVTZWxlY3Rpb24uZ2V0Rmlyc3RTZWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VJdGVtIHJlc291cmNlSXRlbSA9IChSZXNvdXJjZUl0ZW0pdHJlZVNlbGVjdGlvbi5nZXRMYXN0U2VnbWVudCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzb3VyY2UgPSByZXNvdXJjZVR5cGUuZ2V0WG1sU3RyaW5nKHJlc291cmNlSXRlbSwgZmFsc2UgLyogc3lzdGVtICovKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSB0b3AgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHN0YW5kYXJkIG1lc3NhZ2UgYXJlYQotICAgICAgICBjcmVhdGVNZXNzYWdlQXJlYSh0b3ApOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyZWQgdHJlZQotICAgICAgICBjcmVhdGVGaWx0ZXJlZFRyZWUodG9wKTsKLQotICAgICAgICAvLyBzZXR1cCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgICAgc2V0dXBJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgdGhlICJOZXcgUmVzb3VyY2UiIGJ1dHRvbgotICAgICAgICBjcmVhdGVOZXdSZXNCdXR0b25zKHRvcCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdG9wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlICJOZXcgUmVzb3VyY2UiIGJ1dHRvbi4KLSAgICAgKiBAcGFyYW0gdG9wIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1Jlc0J1dHRvbnMoQ29tcG9zaXRlIHRvcCkgewotICAgICAgICBtTmV3UmVzQnV0dG9uID0gbmV3IEJ1dHRvbih0b3AsIFNXVC5OT05FKTsKLSAgICAgICAgbU5ld1Jlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgT25OZXdSZXNCdXR0b25TZWxlY3RlZCgpKTsKLSAgICAgICAgdXBkYXRlTmV3UmVzQnV0dG9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbHRlcmVkVHJlZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG1GaWx0ZXJlZFRyZWUgPSBuZXcgRmlsdGVyZWRUcmVlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04sCi0gICAgICAgICAgICAgICAgbmV3IFBhdHRlcm5GaWx0ZXIoKSk7Ci0gICAgICAgIAotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDYwKTsKLSAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxOCk7Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgbUZpbHRlcmVkVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtRmlsdGVyZWRUcmVlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIAotICAgICAgICBtVHJlZVZpZXdlciA9IG1GaWx0ZXJlZFRyZWUuZ2V0Vmlld2VyKCk7Ci0gICAgICAgIFRyZWUgdHJlZSA9IG1UcmVlVmlld2VyLmdldFRyZWUoKTsKLSAgICAgICAgCi0gICAgICAgIHRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVEb3VibGVDbGljaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUmVzb3VyY2VMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJlc291cmNlQ29udGVudFByb3ZpZGVyKGZhbHNlIC8qIGZ1bGxMZXZlbHMgKi8pKTsKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0SW5wdXQobVJlc291cmNlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKCkgewotICAgICAgICB2YWxpZGF0ZUN1cnJlbnRTZWxlY3Rpb24oKTsKLSAgICAgICAgdXBkYXRlTmV3UmVzQnV0dG9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soKSB7Ci0gICAgICAgIGlmICh2YWxpZGF0ZUN1cnJlbnRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgYnV0dG9uUHJlc3NlZChJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBpdGVtIGluIHRoZSB0cmVlIGFzIGEge0BsaW5rIFRyZWVQYXRofSBvYmplY3QuCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+VHJlZVBhdGg8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgVHJlZVBhdGggZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1GaWx0ZXJlZFRyZWUuZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgICAgICBUcmVlUGF0aFtdIHRyZWVQYXRocyA9IHRyZWVTZWxlY3Rpb24uZ2V0UGF0aHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiBtb2RlIGlzIFNXVC5TSU5HTEUsIHNvIHdlIGp1c3QgZ2V0IHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICBpZiAodHJlZVBhdGhzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJlZVBhdGhzWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ3VycmVudFNlbGVjdGlvbigpIHsKLSAgICAgICAgVHJlZVBhdGggdHJlZVNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgSVN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGlmICh0cmVlU2VsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0cmVlU2VsZWN0aW9uLmdldFNlZ21lbnRDb3VudCgpID09IDIpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEFkdFBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWR0UGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuRVJST1IsICJZb3UgbXVzdCBzZWxlY3QgYSBSZXNvdXJjZSBJdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBZHRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbmV3IHJlcyBidXR0b24gd2hlbiB0aGUgbGlzdCBzZWxlY3Rpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYnV0dG9uIGNoYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTmV3UmVzQnV0dG9uKCkgewotICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IGdldFNlbGVjdGVkUmVzb3VyY2VUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgYWRkaW5nIG5ldyBzdHJpbmdzIHJpZ2h0IG5vdwotICAgICAgICBtTmV3UmVzQnV0dG9uLnNldEVuYWJsZWQodHlwZSA9PSBSZXNvdXJjZVR5cGUuU1RSSU5HKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IFN0cmluZy5mb3JtYXQoIk5ldyAlMSRzLi4uIiwKLSAgICAgICAgICAgICAgICB0eXBlID09IG51bGwgPyAiUmVzb3VyY2UiIDogdHlwZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgbU5ld1Jlc0J1dHRvbi5zZXRUZXh0KHRpdGxlKTsKLSAgICAgICAgbU5ld1Jlc0J1dHRvbi5wYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBtTmV3UmVzQnV0dG9uIGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgT25OZXdSZXNCdXR0b25TZWxlY3RlZCBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IGdldFNlbGVjdGVkUmVzb3VyY2VUeXBlKCk7Ci0KLSAgICAgICAgICAgICAvLyBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHN0cmluZ3MKLSAgICAgICAgICAgICBpZiAodHlwZSA9PSBSZXNvdXJjZVR5cGUuU1RSSU5HKSB7Ci0KLSAgICAgICAgICAgICAgICAgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nIHJlZiA9IG5ldyBFeHRyYWN0U3RyaW5nUmVmYWN0b3JpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgbVByb2plY3QsIHRydWUgLyplbmZvcmNlTmV3Ki8pOwotICAgICAgICAgICAgICAgICBSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgRXh0cmFjdFN0cmluZ1dpemFyZChyZWYsIG1Qcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wID0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaCB3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChvcC5ydW4ody5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3QgaXQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cEluaXRpYWxTZWxlY3Rpb24odHlwZSwgcmVmLmdldFhtbFN0cmluZ0lkKCkpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJydXB0ZWQuIFBhc3MuCi0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9IAotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVzb3VyY2VUeXBlfSBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudCwgaWYgYW55LgotICAgICAqIFJldHVybnMgbnVsbCBpZiBub3RoaW5nIHN1aXRhYmxlIGlzIHNlbGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VUeXBlIGdldFNlbGVjdGVkUmVzb3VyY2VUeXBlKCkgewotICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IG51bGw7Ci0KLSAgICAgICAgVHJlZVBhdGggc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0U2VnbWVudENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgZmlyc3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RTZWdtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBSZXNvdXJjZVR5cGUpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKFJlc291cmNlVHlwZSkgZmlyc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHBhcnNlcyB7QGxpbmsgI21DdXJyZW50UmVzb3VyY2V9IHRvIGZpbmQgb3V0IHRoZSByZXNvdXJjZSB0eXBlIGFuZCB0aGUgcmVzb3VyY2UgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBJbml0aWFsU2VsZWN0aW9uKCkgewotICAgICAgICAvLyBjaGVja3MgdGhlIGlubGluZSBpZCBwYXR0ZXJuIGZpcnN0IGFzIGl0J3MgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSBvdGhlciBvbmUuCi0gICAgICAgIE1hdGNoZXIgbSA9IHNJbmxpbmVJZFJlc291cmNlUGF0dGVybi5tYXRjaGVyKG1DdXJyZW50UmVzb3VyY2UpOwotICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbWF0Y2hpbmcgbmFtZQotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IG0uZ3JvdXAoMSk7Ci0KLSAgICAgICAgICAgIC8vIHNldHVwIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICAgICAgICBzZXR1cEluaXRpYWxTZWxlY3Rpb24oUmVzb3VyY2VUeXBlLklELCByZXNvdXJjZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdGhlIGlubGluZSBpZCBwYXR0ZXJuCi0gICAgICAgICAgICBtID0gc1Jlc291cmNlUGF0dGVybi5tYXRjaGVyKG1DdXJyZW50UmVzb3VyY2UpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNvdXJjZSB0eXBlLgotICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGUuZ2V0RW51bShtLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXRjaGluZyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBtLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dXBJbml0aWFsU2VsZWN0aW9uKHJlc291cmNlVHlwZSwgcmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gYmFzZWQgb24gYSB7QGxpbmsgUmVzb3VyY2VUeXBlfSBhbmQgYSByZXNvdXJjZSBuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSB0aGUgcmVzb3VyY2UgbmFtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBJbml0aWFsU2VsZWN0aW9uKFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgLy8gZ2V0IGFsbCB0aGUgcmVzb3VyY2VzIG9mIHRoaXMgdHlwZQotICAgICAgICBSZXNvdXJjZUl0ZW1bXSByZXNvdXJjZUl0ZW1zID0gbVJlc291cmNlcy5nZXRSZXNvdXJjZXMocmVzb3VyY2VUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoUmVzb3VyY2VJdGVtIHJlc291cmNlSXRlbSA6IHJlc291cmNlSXRlbXMpIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWUuZXF1YWxzKHJlc291cmNlSXRlbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbmFtZSBvZiB0aGUgcmVzb3VyY2UgbWF0Y2gsIHdlIHNlbGVjdCBpdCwKLSAgICAgICAgICAgICAgICBUcmVlUGF0aCB0cmVlUGF0aCA9IG5ldyBUcmVlUGF0aChuZXcgT2JqZWN0W10geyByZXNvdXJjZVR5cGUsIHJlc291cmNlSXRlbSB9KTsKLSAgICAgICAgICAgICAgICBtRmlsdGVyZWRUcmVlLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlU2VsZWN0aW9uKHRyZWVQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypyZXZlYWwqLyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gYW5kIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgdGhlIHJlc291cmNlIHR5cGUgaXMgdmFsaWQsIGJ1dCB0aGUgcmVzb3VyY2UgaXMgbWlzc2luZy4KLSAgICAgICAgLy8gd2Ugc2VsZWN0IGFuZCBleHBhbmQgdGhlIHJlc291cmNlIHR5cGUgZWxlbWVudC4KLSAgICAgICAgVHJlZVBhdGggdHJlZVBhdGggPSBuZXcgVHJlZVBhdGgobmV3IE9iamVjdFtdIHsgcmVzb3VyY2VUeXBlIH0pOwotICAgICAgICBtRmlsdGVyZWRUcmVlLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgVHJlZVNlbGVjdGlvbih0cmVlUGF0aCksCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKnJldmVhbCovKTsKLSAgICAgICAgbUZpbHRlcmVkVHJlZS5nZXRWaWV3ZXIoKS5zZXRFeHBhbmRlZFN0YXRlKHJlc291cmNlVHlwZSwgdHJ1ZSAvKiBleHBhbmRlZCAqLyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL1Jlc291cmNlQ2hvb3Nlci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL1Jlc291cmNlQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmI5MTBjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZWZhY3RvcmluZ3MuZXh0cmFjdHN0cmluZy5FeHRyYWN0U3RyaW5nUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlZmFjdG9yaW5ncy5leHRyYWN0c3RyaW5nLkV4dHJhY3RTdHJpbmdXaXphcmQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkFic3RyYWN0RWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBBIGRpYWxvZyB0byBsZXQgdGhlIHVzZXIgc2VsZWN0IGEgcmVzb3VyY2UgYmFzZWQgb24gYSByZXNvdXJjZSB0eXBlLiAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQ2hvb3NlciBleHRlbmRzIEFic3RyYWN0RWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIG1Qcm9qZWN0UmVzb3VyY2VQYXR0ZXJuOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZVR5cGUgbVJlc291cmNlVHlwZTsKLQotICAgIHByaXZhdGUgSVJlc291cmNlUmVwb3NpdG9yeSBtUHJvamVjdFJlc291cmNlczsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gU0hPV19TWVNURU1fUkVTT1VSQ0UgPSBmYWxzZTsgIC8vIFRPRE8gcmUtZW5hYmxlIGF0IHNvbWUgcG9pbnQgCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIG1TeXN0ZW1SZXNvdXJjZVBhdHRlcm47Ci0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXBvc2l0b3J5IG1TeXN0ZW1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVByb2plY3RCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVN5c3RlbUJ1dHRvbjsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFJlc291cmNlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBtUHJvamVjdDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmVzb3VyY2UgQ2hvb3NlciBkaWFsb2cuCi0gICAgICogQHBhcmFtIHByb2plY3QgUHJvamVjdCBiZWluZyB3b3JrZWQgb24KLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UgdG8gY2hvb3NlCi0gICAgICogQHBhcmFtIHByb2plY3RSZXNvdXJjZXMgVGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIHN5c3RlbVJlc291cmNlcyBUaGUgU3lzdGVtIHJlc291cmNlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VDaG9vc2VyKElQcm9qZWN0IHByb2plY3QsIFJlc291cmNlVHlwZSB0eXBlLAotICAgICAgICAgICAgSVJlc291cmNlUmVwb3NpdG9yeSBwcm9qZWN0UmVzb3VyY2VzLAotICAgICAgICAgICAgSVJlc291cmNlUmVwb3NpdG9yeSBzeXN0ZW1SZXNvdXJjZXMsCi0gICAgICAgICAgICBTaGVsbCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBuZXcgUmVzb3VyY2VMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBtUHJvamVjdCA9IHByb2plY3Q7Ci0KLSAgICAgICAgbVJlc291cmNlVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1Qcm9qZWN0UmVzb3VyY2VzID0gcHJvamVjdFJlc291cmNlczsKLSAgICAgICAgCi0gICAgICAgIG1Qcm9qZWN0UmVzb3VyY2VQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgICAgICJAIiArIG1SZXNvdXJjZVR5cGUuZ2V0TmFtZSgpICsgIi8oLispIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIGlmIChTSE9XX1NZU1RFTV9SRVNPVVJDRSkgewotICAgICAgICAgICAgbVN5c3RlbVJlc291cmNlcyA9IHN5c3RlbVJlc291cmNlczsKLSAgICAgICAgICAgIG1TeXN0ZW1SZXNvdXJjZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAgICAgICAgICJAYW5kcm9pZDoiICsgbVJlc291cmNlVHlwZS5nZXROYW1lKCkgKyAiLyguKykiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLQotICAgICAgICBzZXRUaXRsZSgiUmVzb3VyY2UgQ2hvb3NlciIpOwotICAgICAgICBzZXRNZXNzYWdlKFN0cmluZy5mb3JtYXQoIkNob29zZSBhICUxJHMgcmVzb3VyY2UiLAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZVR5cGUuZ2V0RGlzcGxheU5hbWUoKS50b0xvd2VyQ2FzZSgpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgbUN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRSZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50UmVzb3VyY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT0gMSAmJiBlbGVtZW50c1swXSBpbnN0YW5jZW9mIFJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgUmVzb3VyY2VJdGVtIGl0ZW0gPSAoUmVzb3VyY2VJdGVtKWVsZW1lbnRzWzBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtQ3VycmVudFJlc291cmNlID0gbVJlc291cmNlVHlwZS5nZXRYbWxTdHJpbmcoaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgU0hPV19TWVNURU1fUkVTT1VSQ0UgJiYgbVN5c3RlbUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7IAotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSB0b3AgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICBjcmVhdGVNZXNzYWdlQXJlYSh0b3ApOwotCi0gICAgICAgIGNyZWF0ZUJ1dHRvbnModG9wKTsKLSAgICAgICAgY3JlYXRlRmlsdGVyVGV4dCh0b3ApOwotICAgICAgICBjcmVhdGVGaWx0ZXJlZExpc3QodG9wKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgIk5ldyBSZXNvdXJjZSIgYnV0dG9uCi0gICAgICAgIGNyZWF0ZU5ld1Jlc0J1dHRvbnModG9wKTsKLQotICAgICAgICBzZXR1cFJlc291cmNlTGlzdCgpOwotICAgICAgICBzZWxlY3RSZXNvdXJjZVN0cmluZyhtQ3VycmVudFJlc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcmFkaW8gYnV0dG9uIHRvIHN3aXRjaCBiZXR3ZWVuIHByb2plY3QgYW5kIHN5c3RlbSByZXNvdXJjZXMuCi0gICAgICogQHBhcmFtIHRvcCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSB0b3ApIHsKLSAgICAgICAgaWYgKCFTSE9XX1NZU1RFTV9SRVNPVVJDRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Qcm9qZWN0QnV0dG9uID0gbmV3IEJ1dHRvbih0b3AsIFNXVC5SQURJTyk7Ci0gICAgICAgIG1Qcm9qZWN0QnV0dG9uLnNldFRleHQoIlByb2plY3QgUmVzb3VyY2VzIik7Ci0gICAgICAgIG1Qcm9qZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm9qZWN0QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldExpc3RFbGVtZW50cyhtUHJvamVjdFJlc291cmNlcy5nZXRSZXNvdXJjZXMobVJlc291cmNlVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1TeXN0ZW1CdXR0b24gPSBuZXcgQnV0dG9uKHRvcCwgU1dULlJBRElPKTsKLSAgICAgICAgbVN5c3RlbUJ1dHRvbi5zZXRUZXh0KCJTeXN0ZW0gUmVzb3VyY2VzIik7Ci0gICAgICAgIG1TeXN0ZW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBpZiAobVByb2plY3RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0TGlzdEVsZW1lbnRzKG1TeXN0ZW1SZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKG1SZXNvdXJjZVR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlICJOZXcgUmVzb3VyY2UiIGJ1dHRvbi4KLSAgICAgKiBAcGFyYW0gdG9wIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1Jlc0J1dHRvbnMoQ29tcG9zaXRlIHRvcCkgewotICAgICAgICAKLSAgICAgICAgQnV0dG9uIG5ld1Jlc0J1dHRvbiA9IG5ldyBCdXR0b24odG9wLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gU3RyaW5nLmZvcm1hdCgiTmV3ICUxJHMuLi4iLCBtUmVzb3VyY2VUeXBlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICBuZXdSZXNCdXR0b24uc2V0VGV4dCh0aXRsZSk7Ci0KLSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IGFkZGluZyBuZXcgc3RyaW5ncyByaWdodCBub3cKLSAgICAgICAgbmV3UmVzQnV0dG9uLnNldEVuYWJsZWQobVJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGUuU1RSSU5HKTsKLQotICAgICAgICBuZXdSZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobVJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZU5ld1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdTdHJpbmcoKSB7Ci0gICAgICAgIEV4dHJhY3RTdHJpbmdSZWZhY3RvcmluZyByZWYgPSBuZXcgRXh0cmFjdFN0cmluZ1JlZmFjdG9yaW5nKAotICAgICAgICAgICAgICAgIG1Qcm9qZWN0LCB0cnVlIC8qZW5mb3JjZU5ldyovKTsKLSAgICAgICAgUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IEV4dHJhY3RTdHJpbmdXaXphcmQocmVmLCBtUHJvamVjdCk7Ci0gICAgICAgIFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElXb3JrYmVuY2ggdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBpZiAob3AucnVuKHcuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZC5nZXREZWZhdWx0UGFnZVRpdGxlKCkpID09Ci0gICAgICAgICAgICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQotICAgICAgICAgICAgICAgIC8vIFJlY29tcHV0ZSB0aGUgImN1cnJlbnQgcmVzb3VyY2UiIHRvIHNlbGVjdCB0aGUgbmV3IGlkCi0gICAgICAgICAgICAgICAgc2V0dXBSZXNvdXJjZUxpc3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3QgaXQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICBzZWxlY3RJdGVtTmFtZShyZWYuZ2V0WG1sU3RyaW5nSWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBJbnRlcnJ1cHRlZC4gUGFzcy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlcG9zaXRvcnkgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSVJlc291cmNlUmVwb3NpdG9yeSBnZXRDdXJyZW50UmVwb3NpdG9yeSgpIHsKLSAgICAgICAgSVJlc291cmNlUmVwb3NpdG9yeSByZXBvID0gbVByb2plY3RSZXNvdXJjZXM7Ci0gICAgICAgIAotICAgICAgICBpZiAoU0hPV19TWVNURU1fUkVTT1VSQ0UgJiYgbVN5c3RlbUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgcmVwbyA9IG1TeXN0ZW1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dXBzIHRoZSBjdXJyZW50IGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwUmVzb3VyY2VMaXN0KCkgewotICAgICAgICBJUmVzb3VyY2VSZXBvc2l0b3J5IHJlcG8gPSBnZXRDdXJyZW50UmVwb3NpdG9yeSgpOwotICAgICAgICBzZXRMaXN0RWxlbWVudHMocmVwby5nZXRSZXNvdXJjZXMobVJlc291cmNlVHlwZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZWxlY3QgYW4gaXRlbSBieSBpdHMgbmFtZSwgaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEl0ZW1OYW1lKFN0cmluZyBpdGVtTmFtZSkgewotICAgICAgICBpZiAoaXRlbU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlUmVwb3NpdG9yeSByZXBvID0gZ2V0Q3VycmVudFJlcG9zaXRvcnkoKTsKLQotICAgICAgICBSZXNvdXJjZUl0ZW1bXSBpdGVtcyA9IHJlcG8uZ2V0UmVzb3VyY2VzKG1SZXNvdXJjZVR5cGUpOyAKLSAgICAgICAgCi0gICAgICAgIGZvciAoUmVzb3VyY2VJdGVtIGl0ZW0gOiBpdGVtcykgewotICAgICAgICAgICAgaWYgKGl0ZW1OYW1lLmVxdWFscyhpdGVtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgaXRlbSB9KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdCBhbiBpdGVtIGJ5IGl0cyBmdWxsIHJlc291cmNlIHN0cmluZy4KLSAgICAgKiBUaGlzIGFsc28gc2VsZWN0cyBiZXR3ZWVuIHByb2plY3QgYW5kIHN5c3RlbSByZXBvc2l0b3J5IGJhc2VkIG9uIHRoZSByZXNvdXJjZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdFJlc291cmNlU3RyaW5nKFN0cmluZyByZXNvdXJjZVN0cmluZykgewotICAgICAgICBib29sZWFuIGlzU3lzdGVtID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBpdGVtTmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBJcyB0aGlzIGEgc3lzdGVtIHJlc291cmNlPwotICAgICAgICAvLyBJZiBub3QgYSBzeXN0ZW0gcmVzb3VyY2Ugb3IgaWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGEgcHJvamVjdCByZXMuCi0gICAgICAgIGlmIChTSE9XX1NZU1RFTV9SRVNPVVJDRSkgewotICAgICAgICAgICAgTWF0Y2hlciBtID0gbVN5c3RlbVJlc291cmNlUGF0dGVybi5tYXRjaGVyKHJlc291cmNlU3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBpc1N5c3RlbSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzU3lzdGVtICYmIGl0ZW1OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBwcm9qZWN0IHJlc291cmNlIG5hbWUKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IG1Qcm9qZWN0UmVzb3VyY2VQYXR0ZXJuLm1hdGNoZXIocmVzb3VyY2VTdHJpbmcpOwotICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbU5hbWUgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgdGhlIHJlcG9zaXRvcnkgc2VsZWN0aW9uCi0gICAgICAgIGlmIChTSE9XX1NZU1RFTV9SRVNPVVJDRSkgewotICAgICAgICAgICAgbVByb2plY3RCdXR0b24uc2V0U2VsZWN0aW9uKCFpc1N5c3RlbSk7Ci0gICAgICAgICAgICBtU3lzdGVtQnV0dG9uLnNldFNlbGVjdGlvbihpc1N5c3RlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3QKLSAgICAgICAgc2V0dXBSZXNvdXJjZUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGhhdmUgYSBzZWxlY3Rpb24gbmFtZSwgc2VsZWN0IGl0Ci0gICAgICAgIGlmIChpdGVtTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWxlY3RJdGVtTmFtZShpdGVtTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvUmVzb3VyY2VDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQyYjcxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5JUmVzb3VyY2VSZXBvc2l0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5Db25maWd1cmFibGVSZXNvdXJjZUl0ZW07Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIFJlc291cmNlIEV4cGxvcmVyIFRyZWVWaWV3LgotICogRWFjaCBsZXZlbCBvZiB0aGUgdHJlZSBpcyByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBjbGFzcy4KLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgUmVzb3VyY2VUeXBlfS4gVGhpcyByZXByZXNlbnRzIHRoZSBsaXN0IG9mIGV4aXN0aW5nIFJlc291cmNlIFR5cGUgcHJlc2VudAotICogaW4gdGhlIHJlc291cmNlcy4gVGhpcyBjYW4gYmUgbWF0Y2hlZCB0byB0aGUgc3ViY2xhc3NlcyBpbnNpZGUgdGhlIGNsYXNzIDxjb2RlPlI8L2NvZGU+Ci0gKiA8L2xpPgotICogPHVsPgotICogPGxpPntAbGluayBSZXNvdXJjZUl0ZW19LiBUaGlzIHJlcHJlc2VudHMgb25lIHJlc291cmNlICh3aGljaCBjYW4gZXhpc3RpbmcgaW4gdmFyaW91cyBhbHRlcm5hdGUKLSAqIHZlcnNpb25zKS4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSByZXNvdXJjZSBJZHMgZGVmaW5lZCBhcyA8Y29kZT5SLnNvbWV0eXBlLmlkPC9jb2RlPi4KLSAqIDwvbGk+Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIFJlc291cmNlRmlsZX0uIChvcHRpb25hbCkgVGhpcyByZXByZXNlbnRzIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZQotICoge0BsaW5rIFJlc291cmNlSXRlbX0uIEl0IGlzIGRpc3BsYXllZCBhcyBhIGxpc3Qgb2YgcmVzb3VyY2UgcXVhbGlmaWVyLgotICogPC9saT4KLSAqIDwvdWw+IAotICogPC91bD4gCi0gKiA8L3VsPiAKLSAqIAotICogQHNlZSBSZXNvdXJjZUxhYmVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgUHJvamVjdFJlc291cmNlcyBiZWluZyBkaXNwbGF5ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2VSZXBvc2l0b3J5IG1SZXNvdXJjZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1GdWxsTGV2ZWxzOwotICAgIAotICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBjb250ZW50IHByb3ZpZGVycyBmb3IgcmVzb3VyY2UgZGlzcGxheS4KLSAgICAgKiBAcGFyYW0gZnVsbExldmVscyBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIHN1cHBwb3J0IGFsbCAzIGxldmVscy4gSWYKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4sIG9ubHkgdHdvIGxldmVscyBhcmUgcHJvdmlkZWQuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlQ29udGVudFByb3ZpZGVyKGJvb2xlYW4gZnVsbExldmVscykgewotICAgICAgICBtRnVsbExldmVscyA9IGZ1bGxMZXZlbHM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKFJlc291cmNlVHlwZSlwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChtRnVsbExldmVscyAmJiBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDb25maWd1cmFibGVSZXNvdXJjZUl0ZW0pcGFyZW50RWxlbWVudCkuZ2V0U291cmNlRmlsZUFycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgLy8gcGFzcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXMuaGFzUmVzb3VyY2VzKChSZXNvdXJjZVR5cGUpZWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUZ1bGxMZXZlbHMgJiYgZWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgcmV0dXJuICgoQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtKWVsZW1lbnQpLmhhc0FsdGVybmF0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZVJlcG9zaXRvcnkpIHsKLSAgICAgICAgICAgIGlmICgoSVJlc291cmNlUmVwb3NpdG9yeSlpbnB1dEVsZW1lbnQgPT0gbVJlc291cmNlcykgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdG9wIGxldmVsIHJlc291cmNlcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlc291cmNlcy5nZXRBdmFpbGFibGVSZXNvdXJjZVR5cGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElSZXNvdXJjZVJlcG9zaXRvcnkpIHsKLSAgICAgICAgICAgICBtUmVzb3VyY2VzID0gKElSZXNvdXJjZVJlcG9zaXRvcnkpbmV3SW5wdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvUmVzb3VyY2VFeHBsb3JlclZpZXcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUV4cGxvcmVyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ViMWVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUV4cGxvcmVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUHJvamVjdFJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUHJvamVjdFJlc291cmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGaWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlTW9uaXRvci5JUmVzb3VyY2VFdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogUmVzb3VyY2UgRXhwbG9yZXIgVmlldy4KLSAqIDxwLz4KLSAqIFRoaXMgY29udGFpbnMgYSBiYXNpYyBUcmVlIHZpZXcsIGFuZCB1c2VzIGEgVHJlZVZpZXdlciB0byBoYW5kbGUgdGhlIGRhdGEuCi0gKiA8cC8+Ci0gKiBUaGUgdmlldyBsaXN0ZW5lciB0byBjaGFuZ2UgaW4gc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2gsIGFuZCB1cGRhdGUgdG8gc2hvdyB0aGUgcmVzb3VyY2UKLSAqIG9mIHRoZSBwcm9qZWN0IG9mIHRoZSBjdXJyZW50IHNlbGVjdGVkIGl0ZW0gKGVpdGhlciBpdGVtIGluIHRoZSBwYWNrYWdlIGV4cGxvcmVyLCBvciBvZiB0aGUKLSAqIGN1cnJlbnQgZWRpdG9yKS4KLSAqIAotICogQHNlZSBSZXNvdXJjZUNvbnRlbnRQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFeHBsb3JlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciwKLSAgICAgICAgSVJlc291cmNlRXZlbnRMaXN0ZW5lciB7Ci0gICAgCi0gICAgLy8gTm90ZToga2VlcCB1c2luZyB0aGUgb2Jzb2xldGUgQW5kcm9pZENvbnN0YW50cy5FRElUT1JTX05BTUVTUEFDRSAod2hpY2ggdXNlZAotICAgIC8vIHRvIGJlIHRoZSBFZGl0b3JzIFBsdWdpbiBJRCkgdG8ga2VlcCBleGlzdGluZyBwcmVmZXJlbmNlcyBmdW5jdGlvbmFsLgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGU19DT0xVTU5fUkVTID0KLSAgICAgICAgQW5kcm9pZENvbnN0YW50cy5FRElUT1JTX05BTUVTUEFDRSArICJSZXNvdXJjZUV4cGxvcmVyLkNvbDEiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZTX0NPTFVNTl8yID0KLSAgICAgICAgQW5kcm9pZENvbnN0YW50cy5FRElUT1JTX05BTUVTUEFDRSArICJSZXNvdXJjZUV4cGxvcmVyLkNvbDIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFRyZWUgbVRyZWU7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIG1UcmVlVmlld2VyOwotICAgIAotICAgIHByaXZhdGUgSVByb2plY3QgbUN1cnJlbnRQcm9qZWN0OwotCi0gICAgcHVibGljIFJlc291cmNlRXhwbG9yZXJWaWV3KCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVklSVFVBTCk7Ci0gICAgICAgIG1UcmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBtVHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIDIgY29sdW1ucy4gVGhlIG1haW4gb25lIHdpdGggdGhlIHJlc291cmNlcywgYW5kIGFuICJpbmZvIiBjb2x1bW4uCi0gICAgICAgIGNyZWF0ZVRyZWVDb2x1bW4obVRyZWUsICJSZXNvdXJjZXMiLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eiIsIC0xLCBQUkVGU19DT0xVTU5fUkVTLCBzdG9yZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3JlYXRlVHJlZUNvbHVtbihtVHJlZSwgIkluZm8iLCBTV1QuTEVGVCwKLSAgICAgICAgICAgICAgICAiMDEyMzQ1Njc4OSIsIC0xLCBQUkVGU19DT0xVTU5fMiwgc3RvcmUpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBqZmFjZSB3cmFwcGVyCi0gICAgICAgIG1UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIobVRyZWUpOwotICAgICAgICAKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZXNvdXJjZUNvbnRlbnRQcm92aWRlcih0cnVlIC8qIGZ1bGxMZXZlbHMgKi8pKTsKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUmVzb3VyY2VMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbGlzdGVuIHRvIHNlbGVjdGlvbiBjaGFuZ2UgaW4gdGhlIHdvcmtiZW5jaC4KLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0gICAgICAgIAotICAgICAgICBwYWdlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgLy8gaW5pdCB3aXRoIGN1cnJlbnQgc2VsZWN0aW9uCi0gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQoZ2V0U2l0ZSgpLmdldFBhcnQoKSwgcGFnZS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgZG91YmxlIGNsaWNrLgotICAgICAgICBtVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbCA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgcmVzb3VyY2VGaWxlLCB3ZSBkaXJlY3RseSBvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUmVzb3VyY2VGaWxlKWVsZW1lbnQpLmdldEZpbGUoKS5nZXRJRmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBSZXNvdXJjZUl0ZW0sIHdlIG9wZW4gdGhlIGZpcnN0IGZpbGUsIGJ1dCBvbmx5IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBubyBhbHRlcm5hdGUgZmlsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdFJlc291cmNlSXRlbSBpdGVtID0gKFByb2plY3RSZXNvdXJjZUl0ZW0pZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0VkaXRhYmxlRGlyZWN0bHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZpbGVbXSBmaWxlcyA9IGl0ZW0uZ2V0U291cmNlRmlsZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzWzBdLmdldEZpbGUoKS5nZXRJRmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgdXAgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gc2VuZCB1cyByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0gICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VNb25pdG9yKCkuYWRkUmVzb3VyY2VFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlTW9uaXRvcigpLnJlbW92ZVJlc291cmNlRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIG1UcmVlLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbmV3IHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIGZpcnN0IHdlIHRlc3QgaWYgdGhlIHBhcnQgaXMgYW4gZWRpdG9yLgotICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBpcywgd2UgY2hlY2sgaWYgaXQncyBhIGZpbGUgZWRpdG9yLgotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gKChJRWRpdG9yUGFydClwYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZmlsZSBlZGl0b3Igd2UgY2FuIGdldCB0aGUgSUZpbGUgb2JqZWN0LCBhbmQgZnJvbSBpdCwgdGhlIElQcm9qZWN0LgotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGZpbGUgcHJvamVjdAotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9qZWN0U2VsZWN0aW9uKHByb2plY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCBhbiBlZGl0b3IsIHdlIGxvb2sgZm9yIHN0cnVjdHVyZWQgc2VsZWN0aW9uLgotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBpbiB0aGUgbmF2aWdhdG9yIG9yIHBhY2thZ2UgZXhwbG9yZXIsIHRoZSBzZWxlY3Rpb24gY291bGQgY29udGFpbiBhCi0gICAgICAgICAgICAgICAgLy8gSVJlc291cmNlIG9iamVjdC4KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gKChJUmVzb3VyY2UpIGVsZW1lbnQpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGluIHRoZSBwYWNrYWdlIGV4cGxvcmVyIG9uIGEgamF2YSBlbGVtZW50LCB3ZSBoYW5kbGUgdGhhdCB0b28uCi0gICAgICAgICAgICAgICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gamF2YUVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgd2UgdHJ5IHRvIGdldCBhIHByb2plY3Qgb2JqZWN0IGZyb20gSUFkYXB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmb3VuZCBhIHByb2plY3QsIGhhbmRsZSBpdCwgYW5kIHJldHVybi4KLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVQcm9qZWN0U2VsZWN0aW9uKHByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgcHJvamVjdCBzZWxlY3Rpb24uCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIG5ldyBzZWxlY3RlZCBwcm9qZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGNvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUHJvamVjdFNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBpZiBpdCdzIGFuIGFuZHJvaWQgcHJvamVjdCwgdGhlbiB3ZSBnZXQgaXRzIHJlc291cmNlcywgYW5kIGZlZWQgdGhlbQotICAgICAgICAgICAgLy8gdG8gdGhlIHRyZWUgdmlld2VyLgotICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKEFuZHJvaWRDb25zdGFudHMuTkFUVVJFKSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFByb2plY3QgIT0gcHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0UmVzb3VyY2VzIHByb2pSZXMgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0UmVzb3VyY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvalJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJlZVZpZXdlci5zZXRJbnB1dChwcm9qUmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVHJlZUNvbHVtbiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gSWYgYQotICAgICAqIDxjb2RlPlByZWZlcmVuY2VTdG9yZTwvY29kZT4gb2JqZWN0IGFuZCBhIHByZWZlcmVuY2UgZW50cnkgbmFtZSBTdHJpbmcKLSAgICAgKiBvYmplY3QgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvbHVtbiB3aWxsIGxpc3RlbiB0byBjaGFuZ2UgaW4gaXRzIHdpZHRoCi0gICAgICogYW5kIHVwZGF0ZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhY2NvcmRpbmdseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFRhYmxlIHBhcmVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgc3RyaW5nCi0gICAgICogQHBhcmFtIHN0eWxlIFRoZSBjb2x1bW4gc3R5bGUKLSAgICAgKiBAcGFyYW0gc2FtcGxlX3RleHQgQSBzYW1wbGUgdGV4dCB0byBmaWd1cmUgb3V0IGNvbHVtbiB3aWR0aCBpZiBwcmVmZXJlbmNlCi0gICAgICogICAgICAgICAgICB2YWx1ZSBpcyBtaXNzaW5nCi0gICAgICogQHBhcmFtIGZpeGVkU2l6ZSBhIGZpeGVkIHNpemUuIElmICE9IC0xIHRoZSBjb2x1bW4gaXMgbm9uIHJlc2l6YWJsZQotICAgICAqIEBwYXJhbSBwcmVmX25hbWUgVGhlIHByZWZlcmVuY2UgZW50cnkgbmFtZSBmb3IgY29sdW1uIHdpZHRoCi0gICAgICogQHBhcmFtIHByZWZzIFRoZSBwcmVmZXJlbmNlIHN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVHJlZUNvbHVtbihUcmVlIHBhcmVudCwgU3RyaW5nIGhlYWRlciwgaW50IHN0eWxlLAotICAgICAgICAgICAgU3RyaW5nIHNhbXBsZV90ZXh0LCBpbnQgZml4ZWRTaXplLCBmaW5hbCBTdHJpbmcgcHJlZl9uYW1lLAotICAgICAgICAgICAgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmcykgewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29sdW1uCi0gICAgICAgIFRyZWVDb2x1bW4gY29sID0gbmV3IFRyZWVDb2x1bW4ocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZml4ZWRTaXplICE9IC0xKSB7Ci0gICAgICAgICAgICBjb2wuc2V0V2lkdGgoZml4ZWRTaXplKTsKLSAgICAgICAgICAgIGNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcHJlZiBzdG9yZSBvciB0aGUgZW50cnkgaXMgbWlzc2luZywgd2UgdXNlIHRoZSBzYW1wbGUKLSAgICAgICAgICAgIC8vIHRleHQgYW5kIHBhY2sgdGhlIGNvbHVtbi4KLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBqdXN0IHJlYWQgdGhlIHdpZHRoIGZyb20gdGhlIHByZWZzIGFuZCBhcHBseSBpdC4KLSAgICAgICAgICAgIGlmIChwcmVmcyA9PSBudWxsIHx8IHByZWZzLmNvbnRhaW5zKHByZWZfbmFtZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBjb2wuc2V0VGV4dChzYW1wbGVfdGV4dCk7Ci0gICAgICAgICAgICAgICAgY29sLnBhY2soKTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBpbml0IHRoZSBwcmVmcyBzdG9yZSB3aXRoIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICAgICAgICAgICAgaWYgKHByZWZzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUocHJlZl9uYW1lLCBjb2wuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2wuc2V0V2lkdGgocHJlZnMuZ2V0SW50KHByZWZfbmFtZSkpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBwcmVmIHN0b3JlIGFuZCBhIHByZWYgZW50cnkgbmFtZSwgdGhlbiB3ZSBzZXR1cCBhCi0gICAgICAgICAgICAvLyBsaXN0ZW5lciB0byBjYXRjaCBjb2x1bW4gcmVzaXplIHRvIHB1dCB0aGUgbmV3IHdpZHRoIHZhbHVlIGludG8gdGhlIHN0b3JlLgotICAgICAgICAgICAgaWYgKHByZWZzICE9IG51bGwgJiYgcHJlZl9uYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb2wuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5ldyB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcgPSAoKFRyZWVDb2x1bW4pZS53aWRnZXQpLmdldFdpZHRoKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBpbiBwcmVmIHN0b3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZShwcmVmX25hbWUsIHcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIGhlYWRlcgotICAgICAgICBjb2wuc2V0VGV4dChoZWFkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIHN0YXJ0IGluIGEgcmVzb3VyY2UgZXZlbnQgY2hhbmdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlRXZlbnRTdGFydCgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgZW5kIG9mIGEgcmVzb3VyY2UgY2hhbmdlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlRXZlbnRFbmQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVHJlZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVHJlZS5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZGlzcGxheSBpcyBkaXNwb3NlZC4gbm90aGluZyB0byBkby4KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUxhYmVsUHJvdmlkZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC91aS9SZXNvdXJjZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZmRhNC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvUmVzb3VyY2VMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLklJZFJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuQ29uZmlndXJhYmxlUmVzb3VyY2VJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5JZFJlc291cmNlSXRlbTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBSZXNvdXJjZSBFeHBsb3JlciBUcmVlVmlldy4KLSAqIEVhY2ggbGV2ZWwgb2YgdGhlIHRyZWUgaXMgcmVwcmVzZW50ZWQgYnkgYSBkaWZmZXJlbnQgY2xhc3MuCi0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIFJlc291cmNlVHlwZX0uIFRoaXMgcmVwcmVzZW50cyB0aGUgbGlzdCBvZiBleGlzdGluZyBSZXNvdXJjZSBUeXBlIHByZXNlbnQKLSAqIGluIHRoZSByZXNvdXJjZXMuIFRoaXMgY2FuIGJlIG1hdGNoZWQgdG8gdGhlIHN1YmNsYXNzZXMgaW5zaWRlIHRoZSBjbGFzcyA8Y29kZT5SPC9jb2RlPgotICogPC9saT4KLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgUmVzb3VyY2VJdGVtfS4gVGhpcyByZXByZXNlbnRzIG9uZSByZXNvdXJjZS4gVGhlIGFjdHVhbCB0eXBlIGNhbiBiZQotICoge0BsaW5rIENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbX0gKHdoaWNoIGNhbiBleGlzdCBpbiB2YXJpb3VzIGFsdGVybmF0ZSB2ZXJzaW9ucyksCi0gKiBvciB7QGxpbmsgSWRSZXNvdXJjZUl0ZW19LgotICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSByZXNvdXJjZSBJZHMgZGVmaW5lZCBhcyA8Y29kZT5SLnNvbWV0eXBlLmlkPC9jb2RlPi4KLSAqIDwvbGk+Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIFJlc291cmNlRmlsZX0uIFRoaXMgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUge0BsaW5rIFJlc291cmNlSXRlbX0uCi0gKiBJdCBpcyBkaXNwbGF5ZWQgYXMgYSBsaXN0IG9mIHJlc291cmNlIHF1YWxpZmllci4KLSAqIDwvbGk+Ci0gKiA8L3VsPiAKLSAqIDwvdWw+IAotICogPC91bD4gCi0gKiAKLSAqIEBzZWUgUmVzb3VyY2VDb250ZW50UHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIEltYWdlIG1XYXJuaW5nSW1hZ2U7Ci0gICAgCi0gICAgcHVibGljIFJlc291cmNlTGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgbVdhcm5pbmdJbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spLmNyZWF0ZUltYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSAjZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0LCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSAjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgbVdhcm5pbmdJbWFnZS5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbSBpdGVtID0gKENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbSllbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChpdGVtLmhhc0RlZmF1bHQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVdhcm5pbmdJbWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgc3dpdGNoIChjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlVHlwZSllbGVtZW50KS5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUl0ZW0pZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlRmlsZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUZpbGUpZWxlbWVudCkuZ2V0Rm9sZGVyKCkuZ2V0Q29uZmlndXJhdGlvbigpLnRvRGlzcGxheVN0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZVJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmFibGVSZXNvdXJjZUl0ZW0gaXRlbSA9IChDb25maWd1cmFibGVSZXNvdXJjZUl0ZW0pZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gaXRlbS5nZXRBbHRlcm5hdGVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5oYXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJGQgdmVyc2lvbihzKSIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElJZFJlc291cmNlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBJSWRSZXNvdXJjZUl0ZW0gaWRSZXNvdXJjZSA9IChJSWRSZXNvdXJjZUl0ZW0pZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkUmVzb3VyY2UuaXNEZWNsYXJlZElubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRlY2xhcmVkIGlubGluZSI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3VpL1dpemFyZERpYWxvZ0V4LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvV2l6YXJkRGlhbG9nRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjIxNDFhZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvdWkvV2l6YXJkRGlhbG9nRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotDQotLyoqDQotICogQSB7QGxpbmsgV2l6YXJkRGlhbG9nfSB0aGF0IGdpdmVzIGFjY2VzcyB0byBzb21lIGlubmVyIGNvbnRyb2xzLg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXaXphcmREaWFsb2dFeCBleHRlbmRzIFdpemFyZERpYWxvZyB7DQotDQotICAgIC8qKg0KLSAgICAgKiBAc2VlIFdpemFyZERpYWxvZyNXaXphcmREaWFsb2coU2hlbGwsIElXaXphcmQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgV2l6YXJkRGlhbG9nRXgoU2hlbGwgcGFyZW50U2hlbGwsIElXaXphcmQgbmV3V2l6YXJkKSB7DQotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgY2FuY2VsIGJ1dHRvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBOb3RlOiB0aGVyZSBpcyBhbHJlYWR5IGEgcHJvdGVjdGVkLCBkZXByZWNhdGVkIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHNhbWUgdGhpbmcuDQotICAgICAqIFRvIGF2b2lkIG92ZXJyaWRpbmcgYSBkZXByZWNhdGVkIG1ldGhvZCwgdGhlIG5hbWUgYXMgYmUgY2hhbmdlZCB0byAuLi5FeC4NCi0gICAgICovDQotICAgIHB1YmxpYyBCdXR0b24gZ2V0Q2FuY2VsQnV0dG9uRXgoKSB7DQotICAgICAgICByZXR1cm4gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL0F2ZE1hbmFnZXJBY3Rpb24uamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2FjdGlvbnMvQXZkTWFuYWdlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGM5N2ZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2FjdGlvbnMvQXZkTWFuYWdlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuYWN0aW9uczsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLnJlcG9zaXRvcnkuVXBkYXRlcldpbmRvdzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOw0KLQ0KLS8qKg0KLSAqIERlbGVnYXRlIGZvciB0aGUgdG9vbGJhci9tZW51IGFjdGlvbiAiQW5kcm9pZCBBVkQgTWFuYWdlciIuDQotICogSXQgZGlzcGxheXMgdGhlIEFuZHJvaWQgQVZEIE1hbmFnZXIuDQotICovDQotcHVibGljIGNsYXNzIEF2ZE1hbmFnZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUsIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7DQotDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICAvLyBub3RoaW5nIHRvIGRpc3Bvc2UuDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgew0KLSAgICAgICAgLy8gbm8gaW5pdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgew0KLSAgICAgICAgU2RrIHNkayA9IFNkay5nZXRDdXJyZW50KCk7DQotICAgICAgICBpZiAoc2RrICE9IG51bGwpIHsNCi0gICAgICAgICAgICBVcGRhdGVyV2luZG93IHdpbmRvdyA9IG5ldyBVcGRhdGVyV2luZG93KA0KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLA0KLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKnNkayBsb2cqLywNCi0gICAgICAgICAgICAgICAgICAgIHNkay5nZXRTZGtMb2NhdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyp1c2VyQ2FuQ2hhbmdlU2RrUm9vdCovKTsNCi0gICAgICAgICAgICB3aW5kb3cuYWRkTGlzdGVuZXJzKG5ldyBVcGRhdGVyV2luZG93LklTZGtMaXN0ZW5lcigpIHsNCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZGtDaGFuZ2UoKSB7DQotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlcGFyc2VTZGsoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHdpbmRvdy5vcGVuKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0gICAgICAgIC8vIG5vdGhpbmcgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgew0KLSAgICAgICAgLy8gbm90aGluZyB0byBkby4NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL0V4cG9ydEFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9FeHBvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5MzQ3MC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL0V4cG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuRXhwb3J0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0QWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBtU2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBJT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChJQWN0aW9uLCBJV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbiltU2VsZWN0aW9uOwotICAgICAgICAgICAgLy8gZ2V0IHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbS4KLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCBvYmplY3QgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFuZCBmaW5hbGx5IGRvIHRoZSBhY3Rpb24KLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEV4cG9ydEhlbHBlci5leHBvcnRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMubVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL0V4cG9ydFdpemFyZEFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9FeHBvcnRXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NWY5Ny4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL0V4cG9ydFdpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0LkV4cG9ydFdpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHBvcnRXaXphcmRBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIG1TZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIG1Xb3JrYmVuY2g7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICAgICAgbVdvcmtiZW5jaCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAobVNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pbVNlbGVjdGlvbjsKLQotICAgICAgICAgICAgLy8gY2FsbCB0aGUgZXhwb3J0IHdpemFyZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgICAgICAgICBFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEV4cG9ydFdpemFyZCgpOwotICAgICAgICAgICAgd2l6YXJkLmluaXQobVdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKG1Xb3JrYmVuY2guZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIHdpemFyZCk7Ci0gICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5tU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2FjdGlvbnMvTmV3UHJvamVjdEFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9OZXdQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2M0NzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9OZXdQcm9qZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5uZXdwcm9qZWN0Lk5ld1Byb2plY3RXaXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotCi0vKioKLSAqIERlbGVnYXRlIGZvciB0aGUgdG9vbGJhciBhY3Rpb24gIkFuZHJvaWQgUHJvamVjdCIuCi0gKiBJdCBkaXNwbGF5cyB0aGUgQW5kcm9pZCBOZXcgUHJvamVjdCB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEFuZHJvaWQgUHJvamVjdCAobm90IGEgdGVzdCBwcm9qZWN0KS4KLSAqCi0gKiBAc2VlIE5ld1Rlc3RQcm9qZWN0QWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQcm9qZWN0QWN0aW9uIGV4dGVuZHMgT3BlbldpemFyZEFjdGlvbiB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpemFyZCBpbnN0YW5jaWF0ZVdpemFyZChJQWN0aW9uIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IE5ld1Byb2plY3RXaXphcmQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL05ld1Rlc3RQcm9qZWN0QWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL05ld1Rlc3RQcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4ZTQ1ZWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9OZXdUZXN0UHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdUZXN0UHJvamVjdFdpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLS8qKgotICogRGVsZWdhdGUgZm9yIHRoZSB0b29sYmFyIGFjdGlvbiAiQW5kcm9pZCBUZXN0IFByb2plY3QiLgotICogSXQgZGlzcGxheXMgdGhlIEFuZHJvaWQgTmV3IFByb2plY3Qgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBUZXN0IFByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdUZXN0UHJvamVjdEFjdGlvbiBleHRlbmRzIE9wZW5XaXphcmRBY3Rpb24gewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaXphcmQgaW5zdGFuY2lhdGVXaXphcmQoSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOZXdUZXN0UHJvamVjdFdpemFyZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2FjdGlvbnMvTmV3WG1sRmlsZUFjdGlvbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9OZXdYbWxGaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzQ5YzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9OZXdYbWxGaWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3eG1sZmlsZS5OZXdYbWxGaWxlV2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiBEZWxlZ2F0ZSBmb3IgdGhlIHRvb2xiYXIgYWN0aW9uICJBbmRyb2lkIFByb2plY3QiIG9yIGZvciB0aGUKLSAqIHByb2plY3QgPiBBbmRyb2lkIFByb2plY3QgY29udGV4dCBtZW51LgotICogCi0gKiBJdCBkaXNwbGF5cyB0aGUgQW5kcm9pZCBOZXcgWE1MIGZpbGUgd2l6YXJkLgotICovCi1wdWJsaWMgY2xhc3MgTmV3WG1sRmlsZUFjdGlvbiBleHRlbmRzIE9wZW5XaXphcmRBY3Rpb24gewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hXaXphcmQgaW5zdGFuY2lhdGVXaXphcmQoSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOZXdYbWxGaWxlV2l6YXJkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvYWN0aW9ucy9PcGVuV2l6YXJkQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL09wZW5XaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyODBjYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9hY3Rpb25zL09wZW5XaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmFjdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuSVVwZGF0ZVdpemFyZERpYWxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwudWkuV2l6YXJkRGlhbG9nRXg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkxlZ2FjeVJlc291cmNlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld1dpemFyZFNob3J0Y3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBhY3Rpb24gdGhhdCBkaXNwbGF5cyBvbmUgb2Ygb3VyIHdpemFyZHMuCi0gKiBEZXJpdmVkIGNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZSBhY3R1YWwgd2l6YXJkIHRvIGRpc3BsYXkuCi0gKi8KLS8qcGFja2FnZSovIGFic3RyYWN0IGNsYXNzIE9wZW5XaXphcmRBY3Rpb24KLSAgICBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSwgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aXphcmQgZGlhbG9nIHdpZHRoLCBleHRyYWN0ZWQgZnJvbSB7QGxpbmsgTmV3V2l6YXJkU2hvcnRjdXRBY3Rpb259Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA1MDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd2l6YXJkIGRpYWxvZyBoZWlnaHQsIGV4dHJhY3RlZCBmcm9tIHtAbGluayBOZXdXaXphcmRTaG9ydGN1dEFjdGlvbn0KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9IRUlHSFQgPSA1MDA7Ci0KLSAgICAvKiogVGhlIHdpemFyZCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHtAbGluayAjcnVuKElBY3Rpb24pfS4gKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2hXaXphcmQgbVdpemFyZDsKLSAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBkaWFsb2cgKi8KLSAgICBwcml2YXRlIGludCBtRGlhbG9nUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIG1TZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIG1Xb3JrYmVuY2g7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgd2l6YXJkIHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNydW4oSUFjdGlvbil9LiAqLwotICAgIHB1YmxpYyBJV29ya2JlbmNoV2l6YXJkIGdldFdpemFyZCgpIHsKLSAgICAgICAgcmV0dXJuIG1XaXphcmQ7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHtAbGluayBEaWFsb2cjb3BlbigpfSwgYXZhaWxhYmxlIGFmdGVyCi0gICAgICogdGhlIGNvbXBsZXRpb24gb2Yge0BsaW5rICNydW4oSUFjdGlvbil9LiAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGlhbG9nUmVzdWx0KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ1Jlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAvLyBwYXNzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYW5kIGRpc3BsYXkgdGhlIEFuZHJvaWQgTmV3IFByb2plY3QgV2l6YXJkLgotICAgICAqIDxwLz4KLSAgICAgKiBNb3N0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgZXh0cmFjdGVkIGZyb20ge0BsaW5rIE5ld1dpemFyZFNob3J0Y3V0QWN0aW9uI3J1bigpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0aGF0IGdvdCB1cyBoZXJlLiBDYW4gYmUgbnVsbCB3aGVuIHVzZWQgaW50ZXJuYWxseS4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB3b3JrYmVuY2ggYW5kIHRoZSBjdXJyZW50IHdpbmRvdwotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IG1Xb3JrYmVuY2ggIT0gbnVsbCA/IG1Xb3JrYmVuY2ggOiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotICAgICAgICAvLyBUaGlzIGNvZGUgZnJvbSBOZXdXaXphcmRTaG9ydGN1dEFjdGlvbiNydW4oKSBnZXRzIHRoZSBjdXJyZW50IHdpbmRvdyBzZWxlY3Rpb24KLSAgICAgICAgLy8gYW5kIGNvbnZlcnRzIGl0IHRvIGEgd29ya2JlbmNoIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGZvciB0aGUgd2l6YXJkLCBpZiBwb3NzaWJsZS4KLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtU2VsZWN0aW9uOwotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIHNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBJRmlsZSBvZiB0aGUgZWRpdG9yCi0gICAgICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpIHBhcnQpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZmlsZUNsYXNzID0gTGVnYWN5UmVzb3VyY2VTdXBwb3J0LmdldEZpbGVDbGFzcygpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGZpbGVDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaWxlID0gVXRpbC5nZXRBZGFwdGVyKGlucHV0LCBmaWxlQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub1Bhc3MgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgd2l6YXJkIGFuZCBpbml0aWFsaXplIGl0IHdpdGggdGhlIHNlbGVjdGlvbgotICAgICAgICBtV2l6YXJkID0gaW5zdGFuY2lhdGVXaXphcmQoYWN0aW9uKTsKLSAgICAgICAgbVdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uVG9QYXNzKTsKLQotICAgICAgICAvLyBJdCdzIG5vdCB2aXNpYmxlIHlldCB1bnRpbCBhIGRpYWxvZyBpcyBjcmVhdGVkIGFuZCBvcGVuZWQKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gd2luZG93LmdldFNoZWxsKCk7Ci0gICAgICAgIFdpemFyZERpYWxvZ0V4IGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2dFeChwYXJlbnQsIG1XaXphcmQpOwotICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgaWYgKG1XaXphcmQgaW5zdGFuY2VvZiBJVXBkYXRlV2l6YXJkRGlhbG9nKSB7Ci0gICAgICAgICAgICAoKElVcGRhdGVXaXphcmREaWFsb2cpIG1XaXphcmQpLnVwZGF0ZVdpemFyZERpYWxvZyhkaWFsb2cpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVzIHN0cmFpZ2h0IGZyb20gTmV3V2l6YXJkU2hvcnRjdXRBY3Rpb24jcnVuKCkKLSAgICAgICAgUG9pbnQgZGVmYXVsdFNpemUgPSBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0gICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGVmYXVsdFNpemUueCksCi0gICAgICAgICAgICAgICAgTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9IRUlHSFQsIGRlZmF1bHRTaXplLnkpKTsKLSAgICAgICAgd2luZG93LmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hIZWxwQ29udGV4dElkcy5ORVdfV0laQVJEX1NIT1JUQ1VUKTsKLQotICAgICAgICBtRGlhbG9nUmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rICNydW4oSUFjdGlvbil9IHRvIGluc3RhbnRpYXRlIHRoZSBhY3R1YWwgd2l6YXJkLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIHBhcmFtZXRlciBmcm9tIHtAbGluayAjcnVuKElBY3Rpb24pfS4KLSAgICAgKiAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIG51bGwuCi0gICAgICogQHJldHVybiBBIG5ldyB3aXphcmQgaW5zdGFuY2UuIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IElXb3JrYmVuY2hXaXphcmQgaW5zdGFuY2lhdGVXaXphcmQoSUFjdGlvbiBhY3Rpb24pOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgICAgIG1Xb3JrYmVuY2ggPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvRXhwb3J0V2l6YXJkLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTk5MTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0V4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkJhc2VQcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuS2V5c3RvcmVIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuU2lnbmVkSmFyQnVpbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5EZWJ1Z0tleVByb3ZpZGVyLklLZXlHZW5PdXRwdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBhcGsgc2lnbmVkIHdpdGggYSByZWxlYXNlIGtleS9jZXJ0aWZpY2F0ZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9HT19MQVJHRSA9ICJpY29ucy9hbmRyb2lkX2xhcmdlLnBuZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST0pFQ1RfQ0hFQ0sgPSAiUGFnZV9Qcm9qZWN0Q2hlY2siOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfS0VZU1RPUkVfU0VMRUNUSU9OID0gIlBhZ2VfS2V5c3RvcmVTZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfS0VZX0NSRUFUSU9OID0gIlBhZ2VfS2V5Q3JlYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfS0VZX1NFTEVDVElPTiA9ICJQYWdlX0tleVNlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9LRVlfQ0hFQ0sgPSAiUGFnZV9LZXlDaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfS0VZU1RPUkUgPSAia2V5c3RvcmUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BTElBUyA9ICJhbGlhcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFU1RJTkFUSU9OID0gImRlc3RpbmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRklMRU5BTUUgPSAiYmFzZUZpbGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIGZpbmFsIGludCBBUEtfRklMRV9TT1VSQ0UgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBLX0ZJTEVfREVTVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBUEtfQ09VTlQgPSAyOwotCi0gICAgLyoqCi0gICAgICogQmFzZSBwYWdlIGNsYXNzIGZvciB0aGUgRXhwb3J0V2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgYWRkIHRoZSB7QGxpbmsgI29uU2hvdygpfSBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0gICAgICAgIC8qKiBiaXQgbWFzayBjb25zdGFudCBmb3IgcHJvamVjdCBkYXRhIGNoYW5nZSBldmVudCAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBEQVRBX1BST0pFQ1QgPSAweDAwMTsKLSAgICAgICAgLyoqIGJpdCBtYXNrIGNvbnN0YW50IGZvciBrZXlzdG9yZSBkYXRhIGNoYW5nZSBldmVudCAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBEQVRBX0tFWVNUT1JFID0gMHgwMDI7Ci0gICAgICAgIC8qKiBiaXQgbWFzayBjb25zdGFudCBmb3Iga2V5IGRhdGEgY2hhbmdlIGV2ZW50ICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERBVEFfS0VZID0gMHgwMDQ7Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWZXJpZnlMaXN0ZW5lciBzUGFzc3dvcmRWZXJpZmllciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgZm9yIHBhc3N3b3JkLgotICAgICAgICAgICAgICAgIGludCBsZW4gPSBlLnRleHQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBsaW1pdCB0byAxMjcgY2hhcmFjdGVycyBtYXgKLSAgICAgICAgICAgICAgICBpZiAobGVuICsgKChUZXh0KWUuZ2V0U291cmNlKCkpLmdldFRleHQoKS5sZW5ndGgoKSA+IDEyNykgewotICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyBvbmx5IHRha2Ugbm9uIGNvbnRyb2wgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZS50ZXh0LmNoYXJBdChpKSA8IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQml0IG1hc2sgaW5kaWNhdGluZyB3aGF0IGNoYW5nZWQgd2hpbGUgdGhlIHBhZ2Ugd2FzIGhpZGRlbi4KLSAgICAgICAgICogQHNlZSAjREFUQV9QUk9KRUNUCi0gICAgICAgICAqIEBzZWUgI0RBVEFfS0VZU1RPUkUKLSAgICAgICAgICogQHNlZSAjREFUQV9LRVkKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBpbnQgbVByb2plY3REYXRhQ2hhbmdlZCA9IDA7Ci0KLSAgICAgICAgRXhwb3J0V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhYnN0cmFjdCB2b2lkIG9uU2hvdygpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgb25TaG93KCk7Ci0gICAgICAgICAgICAgICAgbVByb2plY3REYXRhQ2hhbmdlZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCB2b2lkIHByb2plY3REYXRhQ2hhbmdlZChpbnQgY2hhbmdlTWFzaykgewotICAgICAgICAgICAgbVByb2plY3REYXRhQ2hhbmdlZCB8PSBjaGFuZ2VNYXNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxzIHtAbGluayAjc2V0RXJyb3JNZXNzYWdlKFN0cmluZyl9IGFuZCB7QGxpbmsgI3NldFBhZ2VDb21wbGV0ZShib29sZWFuKX0gYmFzZWQgb24gYQotICAgICAgICAgKiB7QGxpbmsgVGhyb3dhYmxlfSBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBnZXRFeGNlcHRpb25NZXNzYWdlKHQpOwotCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFeHBvcnRXaXphcmRQYWdlIG1QYWdlc1tdID0gbmV3IEV4cG9ydFdpemFyZFBhZ2VbNV07Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IG1Qcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUtleXN0b3JlOwotICAgIHByaXZhdGUgU3RyaW5nIG1LZXlzdG9yZVBhc3N3b3JkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtS2V5c3RvcmVDcmVhdGlvbk1vZGU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtS2V5QWxpYXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUtleVBhc3N3b3JkOwotICAgIHByaXZhdGUgaW50IG1WYWxpZGl0eTsKLSAgICBwcml2YXRlIFN0cmluZyBtRE5hbWU7Ci0KLSAgICBwcml2YXRlIFByaXZhdGVLZXkgbVByaXZhdGVLZXk7Ci0gICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgbUNlcnRpZmljYXRlOwotCi0gICAgcHJpdmF0ZSBGaWxlIG1EZXN0aW5hdGlvblBhcmVudEZvbGRlcjsKLQotICAgIHByaXZhdGUgRXhwb3J0V2l6YXJkUGFnZSBtS2V5c3RvcmVTZWxlY3Rpb25QYWdlOwotICAgIHByaXZhdGUgRXhwb3J0V2l6YXJkUGFnZSBtS2V5Q3JlYXRpb25QYWdlOwotICAgIHByaXZhdGUgRXhwb3J0V2l6YXJkUGFnZSBtS2V5U2VsZWN0aW9uUGFnZTsKLSAgICBwcml2YXRlIEV4cG9ydFdpemFyZFBhZ2UgbUtleUNoZWNrUGFnZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtS2V5Q3JlYXRpb25Nb2RlOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUV4aXN0aW5nQWxpYXNlczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nW10+IG1BcGtNYXA7Ci0KLSAgICBwdWJsaWMgRXhwb3J0V2l6YXJkKCkgewotICAgICAgICBzZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsgLy8gVE9ETyBoYXZlIGhlbHAKLSAgICAgICAgc2V0V2luZG93VGl0bGUoIkV4cG9ydCBBbmRyb2lkIEFwcGxpY2F0aW9uIik7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBhZGRQYWdlKG1QYWdlc1swXSA9IG5ldyBQcm9qZWN0Q2hlY2tQYWdlKHRoaXMsIFBBR0VfUFJPSkVDVF9DSEVDSykpOwotICAgICAgICBhZGRQYWdlKG1LZXlzdG9yZVNlbGVjdGlvblBhZ2UgPSBtUGFnZXNbMV0gPSBuZXcgS2V5c3RvcmVTZWxlY3Rpb25QYWdlKHRoaXMsCi0gICAgICAgICAgICAgICAgUEFHRV9LRVlTVE9SRV9TRUxFQ1RJT04pKTsKLSAgICAgICAgYWRkUGFnZShtS2V5Q3JlYXRpb25QYWdlID0gbVBhZ2VzWzJdID0gbmV3IEtleUNyZWF0aW9uUGFnZSh0aGlzLCBQQUdFX0tFWV9DUkVBVElPTikpOwotICAgICAgICBhZGRQYWdlKG1LZXlTZWxlY3Rpb25QYWdlID0gbVBhZ2VzWzNdID0gbmV3IEtleVNlbGVjdGlvblBhZ2UodGhpcywgUEFHRV9LRVlfU0VMRUNUSU9OKSk7Ci0gICAgICAgIGFkZFBhZ2UobUtleUNoZWNrUGFnZSA9IG1QYWdlc1s0XSA9IG5ldyBLZXlDaGVja1BhZ2UodGhpcywgUEFHRV9LRVlfQ0hFQ0spKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICAvLyBzYXZlIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIFByb2plY3RIZWxwZXIuc2F2ZVN0cmluZ1Byb3BlcnR5KG1Qcm9qZWN0LCBQUk9QRVJUWV9LRVlTVE9SRSwgbUtleXN0b3JlKTsKLSAgICAgICAgUHJvamVjdEhlbHBlci5zYXZlU3RyaW5nUHJvcGVydHkobVByb2plY3QsIFBST1BFUlRZX0FMSUFTLCBtS2V5QWxpYXMpOwotICAgICAgICBQcm9qZWN0SGVscGVyLnNhdmVTdHJpbmdQcm9wZXJ0eShtUHJvamVjdCwgUFJPUEVSVFlfREVTVElOQVRJT04sCi0gICAgICAgICAgICAgICAgbURlc3RpbmF0aW9uUGFyZW50Rm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgUHJvamVjdEhlbHBlci5zYXZlU3RyaW5nUHJvcGVydHkobVByb2plY3QsIFBST1BFUlRZX0ZJTEVOQU1FLAotICAgICAgICAgICAgICAgIG1BcGtNYXAuZ2V0KG51bGwpW0FQS19GSUxFX0RFU1RdKTsKLQotICAgICAgICAvLyBydW4gdGhlIGV4cG9ydCBpbiBhbiBVSSBydW5uYWJsZS4KLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3b3JrYmVuY2guZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogUnVuIHRoZSBleHBvcnQuCi0gICAgICAgICAgICAgICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdID0gZG9FeHBvcnQobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdFswXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9FeHBvcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB3ZSBtYWtlIHN1cmUgdGhlIHByb2plY3QgaXMgYnVpbHQKLSAgICAgICAgICAgIG1Qcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAvLyBpZiBuZWVkZWQsIGNyZWF0ZSB0aGUga2V5c3RvcmUgYW5kL29yIGtleS4KLSAgICAgICAgICAgIGlmIChtS2V5c3RvcmVDcmVhdGlvbk1vZGUgfHwgbUtleUNyZWF0aW9uTW9kZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG91dHB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlZFN0b3JlID0gS2V5c3RvcmVIZWxwZXIuY3JlYXRlTmV3U3RvcmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtS2V5c3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qc3RvcmVUeXBlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtS2V5c3RvcmVQYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlBbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlQYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ETmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WYWxpZGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJS2V5R2VuT3V0cHV0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvdXQoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZChtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkU3RvcmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ga2V5c3RvcmUgY3JlYXRpb24gZXJyb3IhCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcihvdXRwdXQudG9BcnJheShuZXcgU3RyaW5nW291dHB1dC5zaXplKCldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBrZXlzdG9yZSBpcyBjcmVhdGVkLCBub3cgbG9hZCB0aGUgcHJpdmF0ZSBrZXkgYW5kIGNlcnRpZmljYXRlLgotICAgICAgICAgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obUtleXN0b3JlKTsKLSAgICAgICAgICAgICAgICBrZXlTdG9yZS5sb2FkKGZpcywgbUtleXN0b3JlUGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgUHJpdmF0ZUtleUVudHJ5IGVudHJ5ID0gKEtleVN0b3JlLlByaXZhdGVLZXlFbnRyeSlrZXlTdG9yZS5nZXRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlBbGlhcywgbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbihtS2V5UGFzc3dvcmQudG9DaGFyQXJyYXkoKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVLZXkgPSBlbnRyeS5nZXRQcml2YXRlS2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DZXJ0aWZpY2F0ZSA9IChYNTA5Q2VydGlmaWNhdGUpZW50cnkuZ2V0Q2VydGlmaWNhdGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHdlIG5vdyBsZXQgdGhlIHVzZXIgY2hvb3NlIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhIGxpc3QgcmVhZCBmcm9tIHRoZSBzdG9yZS4KLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKCJDb3VsZCBub3QgZmluZCBrZXkiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHByaXZhdGUga2V5L2NlcnRpZmljYXRlIGFnYWluIHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gY3JlYXRlZCBqdXN0IGFib3ZlLgotICAgICAgICAgICAgaWYgKG1Qcml2YXRlS2V5ICE9IG51bGwgJiYgbUNlcnRpZmljYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG91dHB1dCBmb2xkZXIgb2YgdGhlIHByb2plY3QgdG8gZXhwb3J0LgotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnbGwgZmluZCB0aGUgYnVpbHQgYXBrcyB0byByZXNpZ24gYW5kIGV4cG9ydC4KLSAgICAgICAgICAgICAgICBJRm9sZGVyIG91dHB1dElGb2xkZXIgPSBCYXNlUHJvamVjdEhlbHBlci5nZXRPdXRwdXRGb2xkZXIobVByb2plY3QpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRJRm9sZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0T3NQYXRoID0gIG91dHB1dElGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgZ2VuZXJhdGUgdGhlIHBhY2thZ2VzLgotICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIFN0cmluZ1tdPj4gc2V0ID0gbUFwa01hcC5lbnRyeVNldCgpOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBydW5aaXBBbGlnbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gQWR0UGx1Z2luLmdldE9zQWJzb2x1dGVaaXBBbGlnbigpOwotICAgICAgICAgICAgICAgIEZpbGUgemlwYWxpZ24gPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgICAgICBydW5aaXBBbGlnbiA9IHppcGFsaWduLmlzRmlsZSgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBlbnRyeSA6IHNldCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkZWZhdWx0QXBrID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNyY0ZpbGVuYW1lID0gZGVmYXVsdEFwa1tBUEtfRklMRV9TT1VSQ0VdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzdEZpbGVuYW1lID0gZGVmYXVsdEFwa1tBUEtfRklMRV9ERVNUXTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blppcEFsaWduKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFuZHJvaWQiLCAiLmFwayIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZShtRGVzdGluYXRpb25QYXJlbnRGb2xkZXIsIGRlc3RGaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwotICAgICAgICAgICAgICAgICAgICBTaWduZWRKYXJCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2lnbmVkSmFyQnVpbGRlcihmb3MsIG1Qcml2YXRlS2V5LCBtQ2VydGlmaWNhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaW5wdXQgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUob3V0cHV0T3NQYXRoLCBzcmNGaWxlbmFtZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLCBhbmQgc2lnbiBpdCBhdAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSB0aW1lLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53cml0ZVppcChmaXMsIG51bGwgLyogZmlsdGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBidWlsZGVyOiB3cml0ZSB0aGUgZmluYWwgc2lnbmF0dXJlIGZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNsb3NlIHRoZSBhcmNoaXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgemlwYWxpZ24gdGhlIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blppcEFsaWduKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSByZWFsRGVzdEZpbGUgPSBuZXcgRmlsZShtRGVzdGluYXRpb25QYXJlbnRGb2xkZXIsIGRlc3RGaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB6aXBBbGlnbihwYXRoLCBkZXN0RmlsZSwgcmVhbERlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZXhwb3J0IHN1Y2Nlc3MuIEluIGNhc2Ugd2UgZGlkbid0IHJ1biBaaXBBbGlnbiB3ZSBkaXNwbGF5IGEgd2FybmluZwotICAgICAgICAgICAgICAgIGlmIChydW5aaXBBbGlnbiA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4uZGlzcGxheVdhcm5pbmcoIkV4cG9ydCBXaXphcmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgemlwYWxpZ24gdG9vbCB3YXMgbm90IGZvdW5kIGluIHRoZSBTREsuXG5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdXBkYXRlIHRvIHRoZSBsYXRlc3QgU0RLIGFuZCByZS1leHBvcnQgeW91ciBhcHBsaWNhdGlvblxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIHJ1biB6aXBhbGlnbiBtYW51YWxseS5cblxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsaWduaW5nIGFwcGxpY2F0aW9ucyBhbGxvd3MgQW5kcm9pZCB0byB1c2UgYXBwbGljYXRpb24gcmVzb3VyY2VzXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSBlZmZpY2llbnRseS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGRpc3BsYXlFcnJvcih0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdGhlIGFwayB0byByZXNpZ24sIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiwgYW5kIGVpdGhlcgotICAgICAgICAvLyBhIHByaXZhdGUga2V5L2NlcnRpZmljYXRlIG9yIHRoZSBjcmVhdGlvbiBtb2RlLiBJbiBjcmVhdGlvbiBtb2RlLCB1bmxlc3MKLSAgICAgICAgLy8gYWxsIHRoZSBrZXkva2V5c3RvcmUgaW5mbyBpcyB2YWxpZCwgdGhlIHVzZXIgY2Fubm90IHJlYWNoIHRoZSBsYXN0IHBhZ2UsIHNvIHRoZXJlJ3MKLSAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGVtIGFnYWluIGhlcmUuCi0gICAgICAgIHJldHVybiBtQXBrTWFwICE9IG51bGwgJiYgbUFwa01hcC5zaXplKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgKChtUHJpdmF0ZUtleSAhPSBudWxsICYmIG1DZXJ0aWZpY2F0ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUtleXN0b3JlQ3JlYXRpb25Nb2RlIHx8IG1LZXlDcmVhdGlvbk1vZGUpICYmCi0gICAgICAgICAgICAgICAgbURlc3RpbmF0aW9uUGFyZW50Rm9sZGVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBwcm9qZWN0IGZyb20gdGhlIHNlbGVjdGlvbgotICAgICAgICBPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLSAgICAgICAgICAgIG1Qcm9qZWN0ID0gKElQcm9qZWN0KXNlbGVjdGVkOwotICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgSVJlc291cmNlIHIgPSAoSVJlc291cmNlKSgoSUFkYXB0YWJsZSlzZWxlY3RlZCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Qcm9qZWN0ID0gci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFeHBvcnRXaXphcmRQYWdlIGdldEtleXN0b3JlU2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlzdG9yZVNlbGVjdGlvblBhZ2U7Ci0gICAgfQotCi0gICAgRXhwb3J0V2l6YXJkUGFnZSBnZXRLZXlDcmVhdGlvblBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtS2V5Q3JlYXRpb25QYWdlOwotICAgIH0KLQotICAgIEV4cG9ydFdpemFyZFBhZ2UgZ2V0S2V5U2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlTZWxlY3Rpb25QYWdlOwotICAgIH0KLQotICAgIEV4cG9ydFdpemFyZFBhZ2UgZ2V0S2V5Q2hlY2tQYWdlKCkgewotICAgICAgICByZXR1cm4gbUtleUNoZWNrUGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSB3aXphcmQgbG9nby4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFkdFBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoUFJPSkVDVF9MT0dPX0xBUkdFKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgfQotCi0gICAgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9qZWN0OwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLQotICAgICAgICB1cGRhdGVQYWdlT25DaGFuZ2UoRXhwb3J0V2l6YXJkUGFnZS5EQVRBX1BST0pFQ1QpOwotICAgIH0KLQotICAgIHZvaWQgc2V0S2V5c3RvcmUoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUtleXN0b3JlID0gcGF0aDsKLSAgICAgICAgbVByaXZhdGVLZXkgPSBudWxsOwotICAgICAgICBtQ2VydGlmaWNhdGUgPSBudWxsOwotCi0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZU1RPUkUpOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRLZXlzdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlzdG9yZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleXN0b3JlQ3JlYXRpb25Nb2RlKGJvb2xlYW4gY3JlYXRlU3RvcmUpIHsKLSAgICAgICAgbUtleXN0b3JlQ3JlYXRpb25Nb2RlID0gY3JlYXRlU3RvcmU7Ci0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZU1RPUkUpOwotICAgIH0KLQotICAgIGJvb2xlYW4gZ2V0S2V5c3RvcmVDcmVhdGlvbk1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtS2V5c3RvcmVDcmVhdGlvbk1vZGU7Ci0gICAgfQotCi0KLSAgICB2b2lkIHNldEtleXN0b3JlUGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgICAgIG1Qcml2YXRlS2V5ID0gbnVsbDsKLSAgICAgICAgbUNlcnRpZmljYXRlID0gbnVsbDsKLQotICAgICAgICB1cGRhdGVQYWdlT25DaGFuZ2UoRXhwb3J0V2l6YXJkUGFnZS5EQVRBX0tFWVNUT1JFKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0S2V5c3RvcmVQYXNzd29yZCgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlzdG9yZVBhc3N3b3JkOwotICAgIH0KLQotICAgIHZvaWQgc2V0S2V5Q3JlYXRpb25Nb2RlKGJvb2xlYW4gY3JlYXRlS2V5KSB7Ci0gICAgICAgIG1LZXlDcmVhdGlvbk1vZGUgPSBjcmVhdGVLZXk7Ci0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGdldEtleUNyZWF0aW9uTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlDcmVhdGlvbk1vZGU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRFeGlzdGluZ0FsaWFzZXMoTGlzdDxTdHJpbmc+IGFsaWFzZXMpIHsKLSAgICAgICAgbUV4aXN0aW5nQWxpYXNlcyA9IGFsaWFzZXM7Ci0gICAgfQotCi0gICAgTGlzdDxTdHJpbmc+IGdldEV4aXN0aW5nQWxpYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1FeGlzdGluZ0FsaWFzZXM7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRLZXlBbGlhcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBtS2V5QWxpYXMgPSBuYW1lOwotICAgICAgICBtUHJpdmF0ZUtleSA9IG51bGw7Ci0gICAgICAgIG1DZXJ0aWZpY2F0ZSA9IG51bGw7Ci0KLSAgICAgICAgdXBkYXRlUGFnZU9uQ2hhbmdlKEV4cG9ydFdpemFyZFBhZ2UuREFUQV9LRVkpOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRLZXlBbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlBbGlhczsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleVBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBtS2V5UGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICAgICAgbVByaXZhdGVLZXkgPSBudWxsOwotICAgICAgICBtQ2VydGlmaWNhdGUgPSBudWxsOwotCi0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0S2V5UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBtS2V5UGFzc3dvcmQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRWYWxpZGl0eShpbnQgdmFsaWRpdHkpIHsKLSAgICAgICAgbVZhbGlkaXR5ID0gdmFsaWRpdHk7Ci0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0VmFsaWRpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsaWRpdHk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRETmFtZShTdHJpbmcgZE5hbWUpIHsKLSAgICAgICAgbUROYW1lID0gZE5hbWU7Ci0gICAgICAgIHVwZGF0ZVBhZ2VPbkNoYW5nZShFeHBvcnRXaXphcmRQYWdlLkRBVEFfS0VZKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0RE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRE5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRTaWduaW5nSW5mbyhQcml2YXRlS2V5IHByaXZhdGVLZXksIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewotICAgICAgICBtUHJpdmF0ZUtleSA9IHByaXZhdGVLZXk7Ci0gICAgICAgIG1DZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOwotICAgIH0KLQotICAgIHZvaWQgc2V0RGVzdGluYXRpb24oRmlsZSBwYXJlbnRGb2xkZXIsIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBhcGtNYXApIHsKLSAgICAgICAgbURlc3RpbmF0aW9uUGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyOwotICAgICAgICBtQXBrTWFwID0gYXBrTWFwOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXREZXN0aW5hdGlvbigpIHsKLSAgICAgICAgbURlc3RpbmF0aW9uUGFyZW50Rm9sZGVyID0gbnVsbDsKLSAgICAgICAgbUFwa01hcCA9IG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVQYWdlT25DaGFuZ2UoaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgZm9yIChFeHBvcnRXaXphcmRQYWdlIHBhZ2UgOiBtUGFnZXMpIHsKLSAgICAgICAgICAgIHBhZ2UucHJvamVjdERhdGFDaGFuZ2VkKGNoYW5nZU1hc2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcuLi4gbWVzc2FnZXMpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1swXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXNzYWdlc1swXSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgIGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobWVzc2FnZXNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXNzYWdlID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFkdFBsdWdpbi5kaXNwbGF5RXJyb3IoIkV4cG9ydCBXaXphcmQiLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0RXhjZXB0aW9uTWVzc2FnZSh0KTsKLSAgICAgICAgZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCi0gICAgICAgIEFkdFBsdWdpbi5sb2codCwgIkV4cG9ydCBXaXphcmQgRXJyb3IiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB6aXBhbGlnbgotICAgICAqIEBwYXJhbSB6aXBBbGlnblBhdGggbG9jYXRpb24gb2YgdGhlIHppcGFsaWduIHRvbwotICAgICAqIEBwYXJhbSBzb3VyY2UgZmlsZSB0byB6aXBhbGlnbgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB3aGVyZSB0byB3cml0ZSB0aGUgcmVzdWx0aW5nIGZpbGUKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgc3VjY2VzcywgdGhlIGVycm9yIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB6aXBBbGlnbihTdHJpbmcgemlwQWxpZ25QYXRoLCBGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY29tbWFuZCBsaW5lOiB6aXBhbGluZyAtZiA0IHRtcCBkZXN0aW5hdGlvbgotICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1s1XTsKLSAgICAgICAgY29tbWFuZFswXSA9IHppcEFsaWduUGF0aDsKLSAgICAgICAgY29tbWFuZFsxXSA9ICItZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29tbWFuZFsyXSA9ICI0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21tYW5kWzNdID0gc291cmNlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBjb21tYW5kWzRdID0gZGVzdGluYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gb3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZ3JhYlByb2Nlc3NPdXRwdXQocHJvY2Vzcywgb3V0cHV0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzaW5nbGUgbWVzc2FnZSBmcm9tIHRoZSBhcnJheSBsaXN0Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJFcnJvciB3aGlsZSBydW5uaW5nIHppcGFsaWduOiIpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IG91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyA/Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGRlcnIgb3V0cHV0IG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4KLSAgICAgKiBAcGFyYW0gcHJvY2VzcyBUaGUgcHJvY2VzcyB0byBnZXQgdGhlIG91cHV0IGZyb20KLSAgICAgKiBAcGFyYW0gcmVzdWx0cyBUaGUgYXJyYXkgdG8gc3RvcmUgdGhlIHN0ZGVyciBvdXRwdXQKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIHJldHVybiBjb2RlLgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBncmFiUHJvY2Vzc091dHB1dChmaW5hbCBQcm9jZXNzIHByb2Nlc3MsCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHRzKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRHVlIHRvIHRoZSBsaW1pdGVkIGJ1ZmZlciBzaXplIG9uIHdpbmRvd3MgZm9yIHRoZSBzdGFuZGFyZCBpbyAoc3RkZXJyLCBzdGRvdXQpLCB3ZQotICAgICAgICAvLyAqbmVlZCogdG8gcmVhZCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIGFsbCB0aGUgdGltZS4gSWYgd2UgZG9uJ3QgYW5kIGEgcHJvY2VzcyBvdXRwdXQKLSAgICAgICAgLy8gYSBsYXJnZSBhbW91bnQsIHRoaXMgY291bGQgZGVhZGxvY2sgdGhlIHByb2Nlc3MuCi0KLSAgICAgICAgLy8gcmVhZCB0aGUgbGluZXMgYXMgdGhleSBjb21lLiBpZiBudWxsIGlzIHJldHVybmVkLCBpdCdzCi0gICAgICAgIC8vIGJlY2F1c2UgdGhlIHByb2Nlc3MgZmluaXNoZWQKLSAgICAgICAgbmV3IFRocmVhZCgiIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgdG8gcmVhZCB0aGUgc3RkZXJyIG91dHB1dAotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgZXJyUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGVyclJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLQotICAgICAgICBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgb3V0UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBvdXRSZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHRQbHVnaW4ucHJpbnRCdWlsZFRvQ29uc29sZShBZHRDb25zdGFudHMuQlVJTERfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJvY2VzcwotICAgICAgICByZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUaHJvd2FibGUjZ2V0TWVzc2FnZSgpfS4gSWYgdGhlIHtAbGluayBUaHJvd2FibGUjZ2V0TWVzc2FnZSgpfSByZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBtZXRob2QgaXMgY2FsbGVkIGFnYWluIG9uIHRoZSBjYXVzZSBvZiB0aGUgVGhyb3dhYmxlIG9iamVjdC4KLSAgICAgKiA8cC8+SWYgbm8gVGhyb3dhYmxlIGluIHRoZSBjaGFpbiBoYXMgYSB2YWxpZCBtZXNzYWdlLCB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGZpcnN0Ci0gICAgICogZXhjZXB0aW9uIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uTWVzc2FnZShUaHJvd2FibGUgdCkgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBubyBlcnJvciBpbmZvPyBnZXQgdGhlIHN0YWNrIGNhbGwgdG8gZGlzcGxheSBpdAotICAgICAgICAgICAgLy8gQXQgbGVhc3QgdGhhdCdsbCBnaXZlIHVzIGEgYmV0dGVyIGJ1ZyByZXBvcnQuCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFN0cmVhbShiYW9zKSk7Ci0gICAgICAgICAgICBtZXNzYWdlID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleUNoZWNrUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleUNoZWNrUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhhOGQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2V4cG9ydC9LZXlDaGVja1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmV4cG9ydDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0LkV4cG9ydFdpemFyZC5FeHBvcnRXaXphcmRQYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0LkFwa1NldHRpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZS5Qcml2YXRlS2V5RW50cnk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIEZpbmFsIHBhZ2Ugb2YgdGhlIHdpemFyZCB0aGF0IGNoZWNrcyB0aGUga2V5IGFuZCBhc2sgZm9yIHRoZSBvdXB1dCBsb2NhdGlvbi4KLSAqLwotZmluYWwgY2xhc3MgS2V5Q2hlY2tQYWdlIGV4dGVuZHMgRXhwb3J0V2l6YXJkUGFnZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEV4cG9ydFdpemFyZCBtV2l6YXJkOwotICAgIHByaXZhdGUgUHJpdmF0ZUtleSBtUHJpdmF0ZUtleTsKLSAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBtQ2VydGlmaWNhdGU7Ci0gICAgcHJpdmF0ZSBUZXh0IG1EZXN0aW5hdGlvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZhdGFsU2lnbmluZ0Vycm9yOwotICAgIHByaXZhdGUgRm9ybVRleHQgbURldGFpbFRleHQ7Ci0gICAgcHJpdmF0ZSBTY3JvbGxlZENvbXBvc2l0ZSBtU2Nyb2xsZWRDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIEFwa1NldHRpbmdzIG1BcGtTZXR0aW5nczsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1LZXlEZXRhaWxzOwotICAgIHByaXZhdGUgU3RyaW5nIG1EZXN0aW5hdGlvbkRldGFpbHM7Ci0KLSAgICBwcm90ZWN0ZWQgS2V5Q2hlY2tQYWdlKEV4cG9ydFdpemFyZCB3aXphcmQsIFN0cmluZyBwYWdlTmFtZSkgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIG1XaXphcmQgPSB3aXphcmQ7Ci0KLSAgICAgICAgc2V0VGl0bGUoIkRlc3RpbmF0aW9uIGFuZCBrZXkvY2VydGlmaWNhdGUgY2hlY2tzIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCIiKTsgLy8gVE9ETwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgdGhlIHVpLgotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBnbC52ZXJ0aWNhbFNwYWNpbmcgKj0gMzsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ2Q7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkRlc3RpbmF0aW9uIEFQSyBmaWxlOiIpOwotICAgICAgICBtRGVzdGluYXRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtRGVzdGluYXRpb24uc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbURlc3RpbmF0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG9uRGVzdGluYXRpb25DaGFuZ2UoZmFsc2UgLypmb3JjZURldGFpbFVwZGF0ZSovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VCdXR0b24uc2V0VGV4dCgiQnJvd3NlLi4uIik7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldFRleHQoIkRlc3RpbmF0aW9uIGZpbGUgbmFtZSIpOwotICAgICAgICAgICAgICAgIC8vIGdldCBhIGRlZmF1bHQgYXBrIG5hbWUgYmFzZWQgb24gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBQcm9qZWN0SGVscGVyLmdldEFwa0ZpbGVuYW1lKG1XaXphcmQuZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKmNvbmZpZyovKTsKLSAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKGZpbGVuYW1lKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzYXZlTG9jYXRpb24gPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoc2F2ZUxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc3RpbmF0aW9uLnNldFRleHQoc2F2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAgICAgICBtU2Nyb2xsZWRDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0KLSAgICAgICAgbURldGFpbFRleHQgPSBuZXcgRm9ybVRleHQobVNjcm9sbGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5zZXRDb250ZW50KG1EZXRhaWxUZXh0KTsKLQotICAgICAgICBtU2Nyb2xsZWRDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHZvaWQgb25TaG93KCkgewotICAgICAgICAvLyBmaWxsIHRoZSB0ZXh0cyB3aXRoIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBwcm9qZWN0LgotICAgICAgICBpZiAoKG1Qcm9qZWN0RGF0YUNoYW5nZWQgJiBEQVRBX1BST0pFQ1QpICE9IDApIHsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBkZXN0aW5hdGlvbiBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbVdpemFyZC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBtQXBrU2V0dGluZ3MgPSBTZGsuZ2V0Q3VycmVudCgpLmdldEFwa1NldHRpbmdzKHByb2plY3QpOwotCi0gICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24gPSBQcm9qZWN0SGVscGVyLmxvYWRTdHJpbmdQcm9wZXJ0eShwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBFeHBvcnRXaXphcmQuUFJPUEVSVFlfREVTVElOQVRJT04pOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gUHJvamVjdEhlbHBlci5sb2FkU3RyaW5nUHJvcGVydHkocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgRXhwb3J0V2l6YXJkLlBST1BFUlRZX0ZJTEVOQU1FKTsKLSAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbiAhPSBudWxsICYmIGZpbGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGVzdGluYXRpb24uc2V0VGV4dChkZXN0aW5hdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgYW55dGhpbmcgY2hhbmdlIHdlIGJhc2ljYWxseSByZWxvYWQgdGhlIGRhdGEuCi0gICAgICAgIGlmIChtUHJvamVjdERhdGFDaGFuZ2VkICE9IDApIHsKLSAgICAgICAgICAgIG1GYXRhbFNpZ25pbmdFcnJvciA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyByZXNldCB0aGUgd2l6YXJkIHdpdGggbm8ga2V5L2NlcnQgdG8gbWFrZSBpdCBub3QgZmluaXNoYWJsZSwgdW5sZXNzIGEgdmFsaWQKLSAgICAgICAgICAgIC8vIGtleS9jZXJ0IGlzIGZvdW5kLgotICAgICAgICAgICAgbVdpemFyZC5zZXRTaWduaW5nSW5mbyhudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1Qcml2YXRlS2V5ID0gbnVsbDsKLSAgICAgICAgICAgIG1DZXJ0aWZpY2F0ZSA9IG51bGw7Ci0gICAgICAgICAgICBtS2V5RGV0YWlscyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtV2l6YXJkLmdldEtleXN0b3JlQ3JlYXRpb25Nb2RlKCkgfHwgbVdpemFyZC5nZXRLZXlDcmVhdGlvbk1vZGUoKSkgewotICAgICAgICAgICAgICAgIGludCB2YWxpZGl0eSA9IG1XaXphcmQuZ2V0VmFsaWRpdHkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCI8cD5DZXJ0aWZpY2F0ZSBleHBpcmVzIGluICVkIHllYXJzLjwvcD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkpKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGl0eSA8IDI1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHA+TWFrZSBzdXJlIHRoZSBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmb3IgdGhlIHBsYW5uZWQgbGlmZXRpbWUgb2YgdGhlIHByb2R1Y3QuPC9wPiIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxwPklmIHRoZSBjZXJ0aWZpY2F0ZSBleHBpcmVzLCB5b3Ugd2lsbCBiZSBmb3JjZWQgdG8gc2lnbiB5b3VyIGFwcGxpY2F0aW9uIHdpdGggYSBkaWZmZXJlbnQgb25lLjwvcD4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD5BcHBsaWNhdGlvbnMgY2Fubm90IGJlIHVwZ3JhZGVkIGlmIHRoZWlyIGNlcnRpZmljYXRlIGNoYW5nZXMgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJmb3JjaW5nIGEgZnVsbCB1bmluc3RhbGwvaW5zdGFsbCwgd2hpY2ggd2lsbCBtYWtlIHRoZSB1c2VyIGxvc2UgaGlzL2hlciBkYXRhLjwvcD4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD5BbmRyb2lkIE1hcmtldCBjdXJyZW50bHkgcmVxdWlyZXMgY2VydGlmaWNhdGVzIHRvIGJlIHZhbGlkIHVudGlsIDIwMzMuPC9wPiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1LZXlEZXRhaWxzID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obVdpemFyZC5nZXRLZXlzdG9yZSgpKTsKLSAgICAgICAgICAgICAgICAgICAga2V5U3RvcmUubG9hZChmaXMsIG1XaXphcmQuZ2V0S2V5c3RvcmVQYXNzd29yZCgpLnRvQ2hhckFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUtleUVudHJ5IGVudHJ5ID0gKEtleVN0b3JlLlByaXZhdGVLZXlFbnRyeSlrZXlTdG9yZS5nZXRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2l6YXJkLmdldEtleUFsaWFzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaXphcmQuZ2V0S2V5UGFzc3dvcmQoKS50b0NoYXJBcnJheSgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlS2V5ID0gZW50cnkuZ2V0UHJpdmF0ZUtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNlcnRpZmljYXRlID0gKFg1MDlDZXJ0aWZpY2F0ZSllbnRyeS5nZXRDZXJ0aWZpY2F0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJVbmFibGUgdG8gZmluZCBrZXkuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdhcyBjaGVja2VkIGF0IHRoZSBmaXJzdCBwcmV2aW91cyBzdGVwIGFuZCB3aWxsIG5vdCBoYXBwZW4gaGVyZSwgdW5sZXNzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIHdhcyByZW1vdmVkIGR1cmluZyB0aGUgZXhwb3J0IHdpemFyZCBleGVjdXRpb24uCi0gICAgICAgICAgICAgICAgICAgIG9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtUHJpdmF0ZUtleSAhPSBudWxsICYmIG1DZXJ0aWZpY2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhbGVuZGFyIGV4cGlyYXRpb25DYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25DYWxlbmRhci5zZXRUaW1lKG1DZXJ0aWZpY2F0ZS5nZXROb3RBZnRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgdG9kYXkgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChleHBpcmF0aW9uQ2FsZW5kYXIuYmVmb3JlKHRvZGF5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUtleURldGFpbHMgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHA+Q2VydGlmaWNhdGUgZXhwaXJlZCBvbiAlczwvcD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2VydGlmaWNhdGUuZ2V0Tm90QWZ0ZXIoKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmF0YWwgZXJyb3IgPSBub3RoaW5nIGNhbiBtYWtlIHRoZSBwYWdlIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgbUZhdGFsU2lnbmluZ0Vycm9yID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJDZXJ0aWZpY2F0ZSBpcyBleHBpcmVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkLCBrZXkvY2VydDogcHV0IGl0IGluIHRoZSB3aXphcmQgc28gdGhhdCBpdCBjYW4gYmUgZmluaXNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XaXphcmQuc2V0U2lnbmluZ0luZm8obVByaXZhdGVLZXksIG1DZXJ0aWZpY2F0ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHA+Q2VydGlmaWNhdGUgZXhwaXJlcyBvbiAlcy48L3A+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNlcnRpZmljYXRlLmdldE5vdEFmdGVyKCkudG9TdHJpbmcoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwaXJhdGlvblllYXIgPSBleHBpcmF0aW9uQ2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaXNZZWFyID0gdG9kYXkuZ2V0KENhbGVuZGFyLllFQVIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1llYXIgKyAyNSA8IGV4cGlyYXRpb25ZZWFyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJhdGlvblllYXIgPT0gdGhpc1llYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD5UaGUgY2VydGlmaWNhdGUgZXhwaXJlcyB0aGlzIHllYXIuPC9wPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGV4cGlyYXRpb25ZZWFyLXRoaXNZZWFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHA+VGhlIENlcnRpZmljYXRlIGV4cGlyZXMgaW4gJTEkcyAlMiRzLjwvcD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb3VudCA9PSAxID8gInllYXIiIDogInllYXJzIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHA+TWFrZSBzdXJlIHRoZSBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmb3IgdGhlIHBsYW5uZWQgbGlmZXRpbWUgb2YgdGhlIHByb2R1Y3QuPC9wPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHA+SWYgdGhlIGNlcnRpZmljYXRlIGV4cGlyZXMsIHlvdSB3aWxsIGJlIGZvcmNlZCB0byBzaWduIHlvdXIgYXBwbGljYXRpb24gd2l0aCBhIGRpZmZlcmVudCBvbmUuPC9wPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHA+QXBwbGljYXRpb25zIGNhbm5vdCBiZSB1cGdyYWRlZCBpZiB0aGVpciBjZXJ0aWZpY2F0ZSBjaGFuZ2VzIGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlciwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJmb3JjaW5nIGEgZnVsbCB1bmluc3RhbGwvaW5zdGFsbCwgd2hpY2ggd2lsbCBtYWtlIHRoZSB1c2VyIGxvc2UgaGlzL2hlciBkYXRhLjwvcD4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxwPkFuZHJvaWQgTWFya2V0IGN1cnJlbnRseSByZXF1aXJlcyBjZXJ0aWZpY2F0ZXMgdG8gYmUgdmFsaWQgdW50aWwgMjAzMy48L3A+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlEZXRhaWxzID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhdGFsIGVycm9yID0gbm90aGluZyBjYW4gbWFrZSB0aGUgcGFnZSBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICAgICAgbUZhdGFsU2lnbmluZ0Vycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvbkRlc3RpbmF0aW9uQ2hhbmdlKHRydWUgLypmb3JjZURldGFpbFVwZGF0ZSovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgZGVzdGluYXRpb24gZmllbGQgZWRpdGlvbgotICAgICAqIEBwYXJhbSBmb3JjZURldGFpbFVwZGF0ZSBpZiB0cnVlLCB0aGUgZGV0YWlsIHtAbGluayBGb3JtVGV4dH0gaXMgdXBkYXRlZCBldmVuIGlmIGEgZmF0YWwKLSAgICAgKiBlcnJvciBoYXMgaGFwcGVuZWQgaW4gdGhlIHNpZ25pbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uRGVzdGluYXRpb25DaGFuZ2UoYm9vbGVhbiBmb3JjZURldGFpbFVwZGF0ZSkgewotICAgICAgICBpZiAobUZhdGFsU2lnbmluZ0Vycm9yID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyByZXNldCBtZXNzYWdlcyBmb3Igbm93LgotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtRGVzdGluYXRpb24uZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiRW50ZXIgZGVzdGluYXRpb24gZm9yIHRoZSBBUEsgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICAvLyByZXNldCBjYW5GaW5pc2ggaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgICBtV2l6YXJkLnJlc2V0RGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJEZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgICAgICAgICAvLyByZXNldCBjYW5GaW5pc2ggaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgICBtV2l6YXJkLnJlc2V0RGVzdGluYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBwYXJlbnRGb2xkZXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRGb2xkZXIgPT0gbnVsbCB8fCBwYXJlbnRGb2xkZXIuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiTm90IGEgdmFsaWQgZGlyZWN0b3J5LiIpOwotICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNhbkZpbmlzaCBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgIG1XaXphcmQucmVzZXREZXN0aW5hdGlvbigpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgd2lsbCBhY3R1YWxseSBiZSBjcmVhdGVkCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gYXBrRmlsZU1hcCA9IGdldEFwa0ZpbGVNYXAoZmlsZSk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlbQotICAgICAgICAgICAgYm9vbGVhbiBmaWxlRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIjxwPlRoaXMgd2lsbCBjcmVhdGUgdGhlIGZvbGxvd2luZyBmaWxlczo8L3A+IikpOwotCi0gICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBTdHJpbmdbXT4+IHNldCA9IGFwa0ZpbGVNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmdbXT4gZW50cnkgOiBzZXQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBhcGtBcnJheSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gYXBrQXJyYXlbRXhwb3J0V2l6YXJkLkFQS19GSUxFX0RFU1RdOwotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHBhcmVudEZvbGRlciwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPGxpPiUxJHMgKFdBUk5JTkc6IGFscmVhZHkgZXhpc3RzKTwvbGk+IiwgZmlsZW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiJTEkcyBpcyBhIGRpcmVjdG9yeS4iLCBmaWxlbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBjYW5GaW5pc2ggaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgICAgICAgbVdpemFyZC5yZXNldERlc3RpbmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPGxpPiUxJHM8L2xpPiIsIGZpbGVuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGVzdGluYXRpb25EZXRhaWxzID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gbm8gZXJyb3IsIHNldCB0aGUgZGVzdGluYXRpb24gaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgIG1XaXphcmQuc2V0RGVzdGluYXRpb24ocGFyZW50Rm9sZGVyLCBhcGtGaWxlTWFwKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQotICAgICAgICAgICAgLy8gSG93ZXZlciwgd2Ugc2hvdWxkIGFsc28gdGVzdCBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgICAgICAgIGlmIChmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVzc2FnZSgiQSBkZXN0aW5hdGlvbiBmaWxlIGFscmVhZHkgZXhpc3RzLiIsIFdBUk5JTkcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVEZXRhaWxUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9yY2VEZXRhaWxVcGRhdGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZURldGFpbFRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHNjcm9sbGJhciB0byBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUge0BsaW5rIEZvcm1UZXh0fSBvciB0aGUgbmV3IHNpemUKLSAgICAgKiBvZiB0aGUge0BsaW5rIFNjcm9sbGVkQ29tcG9zaXRlfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2Nyb2xsaW5nKCkgewotICAgICAgICBpZiAobURldGFpbFRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBtU2Nyb2xsZWRDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgbVNjcm9sbGVkQ29tcG9zaXRlLnNldE1pblNpemUobURldGFpbFRleHQuY29tcHV0ZVNpemUoci53aWR0aCwgU1dULkRFRkFVTFQpKTsKLSAgICAgICAgICAgIG1TY3JvbGxlZENvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZXRhaWxUZXh0KCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIjxmb3JtPiIpOwotICAgICAgICBpZiAobUtleURldGFpbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1LZXlEZXRhaWxzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGVzdGluYXRpb25EZXRhaWxzICE9IG51bGwgJiYgbUZhdGFsU2lnbmluZ0Vycm9yID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobURlc3RpbmF0aW9uRGV0YWlscyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoIjwvZm9ybT4iKTsKLQotICAgICAgICBtRGV0YWlsVGV4dC5zZXRUZXh0KHNiLnRvU3RyaW5nKCksIHRydWUgLyogcGFyc2VUYWdzICovLAotICAgICAgICAgICAgICAgIHRydWUgLyogZXhwYW5kVVJMcyAqLyk7Ci0KLSAgICAgICAgbURldGFpbFRleHQuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0KLSAgICAgICAgdXBkYXRlU2Nyb2xsaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbGlzdCBvZiBkZXN0aW5hdGlvbiBmaWxlbmFtZXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlIGRlc3RpbmF0aW9uIGZpZWxkCi0gICAgICogYW5kIHRoZSBsaXN0IG9mIEFQSyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIG5hbWUgZnJvbSB0aGUgZGVzdGluYXRpb24gZmllbGQKLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBkZXN0aW5hdGlvbiBmaWxlbmFtZXMgYmFzZWQgPGNvZGU+ZmlsZTwvY29kZT4gYW5kIHRoZSBsaXN0IG9mIEFQSwotICAgICAqICAgICAgICAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nW10+IGdldEFwa0ZpbGVNYXAoRmlsZSBmaWxlKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGRlZmF1bHQgQVBLIGZpbGVuYW1lCi0gICAgICAgIFN0cmluZ1tdIGFwa0FycmF5ID0gbmV3IFN0cmluZ1tFeHBvcnRXaXphcmQuQVBLX0NPVU5UXTsKLSAgICAgICAgYXBrQXJyYXlbRXhwb3J0V2l6YXJkLkFQS19GSUxFX1NPVVJDRV0gPSBQcm9qZWN0SGVscGVyLmdldEFwa0ZpbGVuYW1lKAotICAgICAgICAgICAgICAgIG1XaXphcmQuZ2V0UHJvamVjdCgpLCBudWxsIC8qY29uZmlnKi8pOwotICAgICAgICBhcGtBcnJheVtFeHBvcnRXaXphcmQuQVBLX0ZJTEVfREVTVF0gPSBmaWxlbmFtZTsKLSAgICAgICAgbWFwLnB1dChudWxsLCBhcGtBcnJheSk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBBUEtzIGZvciBlYWNoIEFQSyBjb25maWd1cmF0aW9uLgotICAgICAgICBpZiAobUFwa1NldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXBrRmlsdGVycyA9IG1BcGtTZXR0aW5ncy5nZXRSZXNvdXJjZUZpbHRlcnMoKTsKLSAgICAgICAgICAgIGlmIChhcGtGaWx0ZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSB1c2VyLWNob3NlbiBmaWxlbmFtZQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBhcGtGaWx0ZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBrQXJyYXkgPSBuZXcgU3RyaW5nW0V4cG9ydFdpemFyZC5BUEtfQ09VTlRdOwotICAgICAgICAgICAgICAgICAgICBhcGtBcnJheVtFeHBvcnRXaXphcmQuQVBLX0ZJTEVfU09VUkNFXSA9IFByb2plY3RIZWxwZXIuZ2V0QXBrRmlsZW5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpemFyZC5nZXRQcm9qZWN0KCksIGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXBrQXJyYXlbRXhwb3J0V2l6YXJkLkFQS19GSUxFX0RFU1RdID0gYmFzZSArICItIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKSArIGV4dGVuc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgYXBrQXJyYXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25FeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgc3VwZXIub25FeGNlcHRpb24odCk7Ci0KLSAgICAgICAgbUtleURldGFpbHMgPSBTdHJpbmcuZm9ybWF0KCJFUlJPUjogJTEkcyIsIEV4cG9ydFdpemFyZC5nZXRFeGNlcHRpb25NZXNzYWdlKHQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvS2V5Q3JlYXRpb25QYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvS2V5Q3JlYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzcyZGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleUNyZWF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5leHBvcnQuRXhwb3J0V2l6YXJkLkV4cG9ydFdpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogS2V5IGNyZWF0aW9uIHBhZ2UuIAotICovCi1maW5hbCBjbGFzcyBLZXlDcmVhdGlvblBhZ2UgZXh0ZW5kcyBFeHBvcnRXaXphcmRQYWdlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRXhwb3J0V2l6YXJkIG1XaXphcmQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1BbGlhczsKLSAgICBwcml2YXRlIFRleHQgbUtleVBhc3N3b3JkOwotICAgIHByaXZhdGUgVGV4dCBtS2V5UGFzc3dvcmQyOwotICAgIHByaXZhdGUgVGV4dCBtQ25GaWVsZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2FibGVPbkNoYW5nZSA9IGZhbHNlOwotICAgIHByaXZhdGUgVGV4dCBtT3VGaWVsZDsKLSAgICBwcml2YXRlIFRleHQgbU9GaWVsZDsKLSAgICBwcml2YXRlIFRleHQgbUxGaWVsZDsKLSAgICBwcml2YXRlIFRleHQgbVN0RmllbGQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1DRmllbGQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUROYW1lOwotICAgIHByaXZhdGUgaW50IG1WYWxpZGl0eSA9IDA7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUV4aXN0aW5nQWxpYXNlczsKLQotICAgIAotICAgIHByb3RlY3RlZCBLZXlDcmVhdGlvblBhZ2UoRXhwb3J0V2l6YXJkIHdpemFyZCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgICAgbVdpemFyZCA9IHdpemFyZDsKLQotICAgICAgICBzZXRUaXRsZSgiS2V5IENyZWF0aW9uIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCIiKTsgLy8gVE9ETz8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgICAgIAotICAgICAgICBHcmlkRGF0YSBnZDsKLQotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQWxpYXM6Iik7Ci0gICAgICAgIG1BbGlhcyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1BbGlhcy5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJQYXNzd29yZDoiKTsKLSAgICAgICAgbUtleVBhc3N3b3JkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLSAgICAgICAgbUtleVBhc3N3b3JkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1LZXlQYXNzd29yZC5hZGRWZXJpZnlMaXN0ZW5lcihzUGFzc3dvcmRWZXJpZmllcik7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkNvbmZpcm06Iik7Ci0gICAgICAgIG1LZXlQYXNzd29yZDIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUEFTU1dPUkQpOwotICAgICAgICBtS2V5UGFzc3dvcmQyLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1LZXlQYXNzd29yZDIuYWRkVmVyaWZ5TGlzdGVuZXIoc1Bhc3N3b3JkVmVyaWZpZXIpOwotCi0gICAgICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJWYWxpZGl0eSAoeWVhcnMpOiIpOwotICAgICAgICBmaW5hbCBUZXh0IHZhbGlkaXR5VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIHZhbGlkaXR5VGV4dC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB2YWxpZGl0eVRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGRpZ2l0IG9ubHkuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZS50ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBsZXR0ZXIgPSBlLnRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGV0dGVyIDwgJzAnIHx8IGxldHRlciA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCkuc2V0TGF5b3V0RGF0YSgKLSAgICAgICAgICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAKLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkZpcnN0IGFuZCBMYXN0IE5hbWU6Iik7Ci0gICAgICAgIG1DbkZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbUNuRmllbGQuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiT3JnYW5pemF0aW9uYWwgVW5pdDoiKTsKLSAgICAgICAgbU91RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtT3VGaWVsZC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJPcmdhbml6YXRpb246Iik7Ci0gICAgICAgIG1PRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtT0ZpZWxkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkNpdHkgb3IgTG9jYWxpdHk6Iik7Ci0gICAgICAgIG1MRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtTEZpZWxkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlN0YXRlIG9yIFByb3ZpbmNlOiIpOwotICAgICAgICBtU3RGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1TdEZpZWxkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIAotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQ291bnRyeSBDb2RlIChYWCk6Iik7Ci0gICAgICAgIG1DRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtQ0ZpZWxkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiB0aGUgZmlyc3QgdGltZQotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIG1BbGlhcy5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtV2l6YXJkLnNldEtleUFsaWFzKG1BbGlhcy5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICBvbkNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbUtleVBhc3N3b3JkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1XaXphcmQuc2V0S2V5UGFzc3dvcmQobUtleVBhc3N3b3JkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgb25DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1LZXlQYXNzd29yZDIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICB2YWxpZGl0eVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVZhbGlkaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWxpZGl0eVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRleHQgZmllbGQgaXMgZW1wdHkgZHVlIHRvIHRoZSB2ZXJpZnlMaXN0ZW5lci4KLSAgICAgICAgICAgICAgICAgICAgbVZhbGlkaXR5ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVdpemFyZC5zZXRWYWxpZGl0eShtVmFsaWRpdHkpOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1vZGlmeUxpc3RlbmVyIGROYW1lTGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvbkROYW1lQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBtQ25GaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihkTmFtZUxpc3RlbmVyKTsKLSAgICAgICAgbU91RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoZE5hbWVMaXN0ZW5lcik7Ci0gICAgICAgIG1PRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoZE5hbWVMaXN0ZW5lcik7Ci0gICAgICAgIG1MRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoZE5hbWVMaXN0ZW5lcik7Ci0gICAgICAgIG1TdEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGROYW1lTGlzdGVuZXIpOwotICAgICAgICBtQ0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGROYW1lTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIG9uU2hvdygpIHsKLSAgICAgICAgLy8gZmlsbCB0aGUgdGV4dHMgd2l0aCBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdC4KLSAgICAgICAgaWYgKChtUHJvamVjdERhdGFDaGFuZ2VkICYgKERBVEFfUFJPSkVDVCB8IERBVEFfS0VZU1RPUkUpKSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUga2V5c3RvcmUvYWxpYXMgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdAotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG1XaXphcmQuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBkaXNhYmxlIG9uQ2hhbmdlIGZvciBub3cuIHdlJ2xsIGNhbGwgaXQgb25jZSBhdCB0aGUgZW5kLgotICAgICAgICAgICAgbURpc2FibGVPbkNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBhbGlhcyA9IFByb2plY3RIZWxwZXIubG9hZFN0cmluZ1Byb3BlcnR5KHByb2plY3QsIEV4cG9ydFdpemFyZC5QUk9QRVJUWV9BTElBUyk7Ci0gICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BbGlhcy5zZXRUZXh0KGFsaWFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBleGlzdGluZyBsaXN0IG9mIGtleXMgaWYgYXBwbGljYWJsZQotICAgICAgICAgICAgaWYgKG1XaXphcmQuZ2V0S2V5Q3JlYXRpb25Nb2RlKCkpIHsKLSAgICAgICAgICAgICAgICBtRXhpc3RpbmdBbGlhc2VzID0gbVdpemFyZC5nZXRFeGlzdGluZ0FsaWFzZXMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUV4aXN0aW5nQWxpYXNlcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwYXNzd29yZHMKLSAgICAgICAgICAgIG1LZXlQYXNzd29yZC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbUtleVBhc3N3b3JkMi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBlbmFibGUgb25DaGFuZ2UsIGFuZCBjYWxsIGl0IHRvIGRpc3BsYXkgZXJyb3JzIGFuZCBlbmFibGUvZGlzYWJsZSBwYWdlQ29tcGxldGVkLgotICAgICAgICAgICAgbURpc2FibGVPbkNoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgb25DaGFuZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0gICAgICAgIGlmIChtV2l6YXJkLmdldEtleUNyZWF0aW9uTW9kZSgpKSB7IC8vIHRoaXMgbWVhbnMgd2UgY3JlYXRlIGEga2V5IGZyb20gYW4gZXhpc3Rpbmcgc3RvcmUKLSAgICAgICAgICAgIHJldHVybiBtV2l6YXJkLmdldEtleVNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1XaXphcmQuZ2V0S2V5c3RvcmVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICByZXR1cm4gbVdpemFyZC5nZXRLZXlDaGVja1BhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGNoYW5nZXMgYW5kIHVwZGF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgY2FsbHMge0BsaW5rICNzZXRQYWdlQ29tcGxldGUoYm9vbGVhbil9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkNoYW5nZSgpIHsKLSAgICAgICAgaWYgKG1EaXNhYmxlT25DaGFuZ2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLQotICAgICAgICBpZiAobUFsaWFzLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJFbnRlciBrZXkgYWxpYXMuIik7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKG1FeGlzdGluZ0FsaWFzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd2UgY2Fubm90IHVzZSBpbmRleE9mLCBiZWNhdXNlIHdlIG5lZWQgdG8gZG8gYSBjYXNlLWluc2Vuc2l0aXZlIGNoZWNrCi0gICAgICAgICAgICBTdHJpbmcga2V5QWxpYXMgPSBtQWxpYXMuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFsaWFzIDogbUV4aXN0aW5nQWxpYXNlcykgewotICAgICAgICAgICAgICAgIGlmIChhbGlhcy5lcXVhbHNJZ25vcmVDYXNlKGtleUFsaWFzKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIktleSBhbGlhcyBhbHJlYWR5IGV4aXN0cyBpbiBrZXlzdG9yZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG1LZXlQYXNzd29yZC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkVudGVyIGtleSBwYXNzd29yZC4iKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoKCkgPCA2KSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIktleSBwYXNzd29yZCBpcyB0b28gc2hvcnQgLSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycy4iKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUuZXF1YWxzKG1LZXlQYXNzd29yZDIuZ2V0VGV4dCgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJLZXkgcGFzc3dvcmRzIGRvbid0IG1hdGNoLiIpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmFsaWRpdHkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJLZXkgY2VydGlmaWNhdGUgdmFsaWRpdHkgaXMgcmVxdWlyZWQuIik7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKG1WYWxpZGl0eSA8IDI1KSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKCJBIDI1IHllYXIgY2VydGlmaWNhdGUgdmFsaWRpdHkgaXMgcmVjb21tZW5kZWQuIiwgV0FSTklORyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVZhbGlkaXR5ID4gMTAwMCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJLZXkgY2VydGlmaWNhdGUgdmFsaWRpdHkgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAgeWVhcnMuIik7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ETmFtZSA9PSBudWxsIHx8IG1ETmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkF0IGxlYXN0IG9uZSBDZXJ0aWZpY2F0ZSBpc3N1ZXIgZmllbGQgaXMgcmVxdWlyZWQgdG8gYmUgbm9uLWVtcHR5LiIpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBETmFtZSBmaWVsZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uRE5hbWVDaGFuZ2UoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgYnVpbGRETmFtZSgiQ04iLCBtQ25GaWVsZCwgc2IpOwotICAgICAgICBidWlsZEROYW1lKCJPVSIsIG1PdUZpZWxkLCBzYik7Ci0gICAgICAgIGJ1aWxkRE5hbWUoIk8iLCBtT0ZpZWxkLCBzYik7Ci0gICAgICAgIGJ1aWxkRE5hbWUoIkwiLCBtTEZpZWxkLCBzYik7Ci0gICAgICAgIGJ1aWxkRE5hbWUoIlNUIiwgbVN0RmllbGQsIHNiKTsKLSAgICAgICAgYnVpbGRETmFtZSgiQyIsIG1DRmllbGQsIHNiKTsKLSAgICAgICAgCi0gICAgICAgIG1ETmFtZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIG1XaXphcmQuc2V0RE5hbWUobUROYW1lKTsKLQotICAgICAgICBvbkNoYW5nZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBzdHJpbmcgd2l0aCB0aGUgcHJvdmlkZWQge0BsaW5rIFN0cmluZ0J1aWxkZXJ9LgotICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBvZiB0aGUgZW50cnkuCi0gICAgICogQHBhcmFtIHRleHRGaWVsZCBUaGUge0BsaW5rIFRleHR9IGZpZWxkIGNvbnRhaW5pbmcgdGhlIGVudHJ5IHZhbHVlLgotICAgICAqIEBwYXJhbSBzYiB0aGUgc3RyaW5nIGJ1aWxkZXIgY29udGFpbmluZyB0aGUgZG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRE5hbWUoU3RyaW5nIHByZWZpeCwgVGV4dCB0ZXh0RmllbGQsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgaWYgKHRleHRGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleVNlbGVjdGlvblBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2V4cG9ydC9LZXlTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWUwMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmV4cG9ydDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0LkV4cG9ydFdpemFyZC5FeHBvcnRXaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBLZXkgU2VsZWN0aW9uIFBhZ2UuIFRoaXMgaXMgdXNlZCB3aGVuIGFuIGV4aXN0aW5nIGtleXN0b3JlIGlzIHVzZWQuIAotICovCi1maW5hbCBjbGFzcyBLZXlTZWxlY3Rpb25QYWdlIGV4dGVuZHMgRXhwb3J0V2l6YXJkUGFnZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEV4cG9ydFdpemFyZCBtV2l6YXJkOwotICAgIHByaXZhdGUgTGFiZWwgbUtleUFsaWFzZXNMYWJlbDsKLSAgICBwcml2YXRlIENvbWJvIG1LZXlBbGlhc2VzOwotICAgIHByaXZhdGUgTGFiZWwgbUtleVBhc3N3b3JkTGFiZWw7Ci0gICAgcHJpdmF0ZSBUZXh0IG1LZXlQYXNzd29yZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2FibGVPbkNoYW5nZSA9IGZhbHNlOwotICAgIHByaXZhdGUgQnV0dG9uIG1Vc2VFeGlzdGluZ0tleTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ3JlYXRlS2V5OwotCi0gICAgcHJvdGVjdGVkIEtleVNlbGVjdGlvblBhZ2UoRXhwb3J0V2l6YXJkIHdpemFyZCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgICAgbVdpemFyZCA9IHdpemFyZDsKLQotICAgICAgICBzZXRUaXRsZSgiS2V5IGFsaWFzIHNlbGVjdGlvbiIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiIik7IC8vIFRPRE8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ2Q7Ci0KLSAgICAgICAgbVVzZUV4aXN0aW5nS2V5ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0gICAgICAgIG1Vc2VFeGlzdGluZ0tleS5zZXRUZXh0KCJVc2UgZXhpc3Rpbmcga2V5Iik7Ci0gICAgICAgIG1Vc2VFeGlzdGluZ0tleS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG1Vc2VFeGlzdGluZ0tleS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICAgICAgbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMDsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gNTA7Ci0gICAgICAgIG1LZXlBbGlhc2VzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1LZXlBbGlhc2VzTGFiZWwuc2V0VGV4dCgiQWxpYXM6Iik7Ci0gICAgICAgIG1LZXlBbGlhc2VzID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIG1LZXlBbGlhc2VzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAKLSAgICAgICAgbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMDsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gNTA7Ci0gICAgICAgIG1LZXlQYXNzd29yZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtS2V5UGFzc3dvcmRMYWJlbC5zZXRUZXh0KCJQYXNzd29yZDoiKTsKLSAgICAgICAgbUtleVBhc3N3b3JkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLSAgICAgICAgbUtleVBhc3N3b3JkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIG1DcmVhdGVLZXkgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgbUNyZWF0ZUtleS5zZXRUZXh0KCJDcmVhdGUgbmV3IGtleSIpOwotICAgICAgICBtQ3JlYXRlS2V5LnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLQotICAgICAgICAvLyBTaG93IGRlc2NyaXB0aW9uIHRoZSBmaXJzdCB0aW1lCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgbVVzZUV4aXN0aW5nS2V5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbVdpemFyZC5zZXRLZXlDcmVhdGlvbk1vZGUoIW1Vc2VFeGlzdGluZ0tleS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlV2lkZ2V0cygpOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbUtleUFsaWFzZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtV2l6YXJkLnNldEtleUFsaWFzKG1LZXlBbGlhc2VzLmdldEl0ZW0obUtleUFsaWFzZXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbUtleVBhc3N3b3JkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1XaXphcmQuc2V0S2V5UGFzc3dvcmQobUtleVBhc3N3b3JkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgb25DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHZvaWQgb25TaG93KCkgewotICAgICAgICAvLyBmaWxsIHRoZSB0ZXh0cyB3aXRoIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBwcm9qZWN0LgotICAgICAgICBpZiAoKG1Qcm9qZWN0RGF0YUNoYW5nZWQgJiAoREFUQV9QUk9KRUNUIHwgREFUQV9LRVlTVE9SRSkpICE9IDApIHsKLSAgICAgICAgICAgIC8vIGRpc2FibGUgb25DaGFuZ2UgZm9yIG5vdy4gd2UnbGwgY2FsbCBpdCBvbmNlIGF0IHRoZSBlbmQuCi0gICAgICAgICAgICBtRGlzYWJsZU9uQ2hhbmdlID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGFsaWFzIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdG8gdXNpbmcgYSBrZXkKLSAgICAgICAgICAgICAgICBtV2l6YXJkLnNldEtleUNyZWF0aW9uTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVVzZUV4aXN0aW5nS2V5LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICBtQ3JlYXRlS2V5LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlV2lkZ2V0cygpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb250ZW50IG9mIHRoZSBhbGlhcyBjb21ibyBhbHdheXMgYW5kIGZpcnN0LCBpbiBjYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIGtleXN0b3JlIHBhc3N3b3JkIGlzIHdyb25nCi0gICAgICAgICAgICAgICAgbUtleUFsaWFzZXMucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFsaWFzIGxpc3QgKGFsc28gdXNlZCBhcyBhIGtleXN0b3JlIHBhc3N3b3JkIHRlc3QpCi0gICAgICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtV2l6YXJkLmdldEtleXN0b3JlKCkpOwotICAgICAgICAgICAgICAgIGtleVN0b3JlLmxvYWQoZmlzLCBtV2l6YXJkLmdldEtleXN0b3JlUGFzc3dvcmQoKS50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGFsaWFzZXMgPSBrZXlTdG9yZS5hbGlhc2VzKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFsaWFzIGZyb20gdGhlIHByb2plY3QgcHJldmlvdXMgZXhwb3J0LCBhbmQgbG9vayBmb3IgYSBtYXRjaCBhcwotICAgICAgICAgICAgICAgIC8vIHdlIGFkZCB0aGUgYWxpYXNlcyB0byB0aGUgY29tYm8uCi0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG1XaXphcmQuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleUFsaWFzID0gUHJvamVjdEhlbHBlci5sb2FkU3RyaW5nUHJvcGVydHkocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydFdpemFyZC5QUk9QRVJUWV9BTElBUyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWxpYXNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0aW9uID0gLTE7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWxpYXNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBhbGlhc2VzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1LZXlBbGlhc2VzLmFkZChhbGlhcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFsaWFzTGlzdC5hZGQoYWxpYXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uID09IC0xICYmIGFsaWFzLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxpYXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtV2l6YXJkLnNldEV4aXN0aW5nQWxpYXNlcyhhbGlhc0xpc3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBtS2V5QWxpYXNlcy5zZWxlY3Qoc2VsZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBhIG1hdGNoIHdhcyBmb3VuZCBhbmQgaXMgc2VsZWN0ZWQsIHdlIG5lZWQgdG8gZ2l2ZSBpdCB0bwotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2l6YXJkIGFzIHdlbGwKLSAgICAgICAgICAgICAgICAgICAgbVdpemFyZC5zZXRLZXlBbGlhcyhrZXlBbGlhcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUtleUFsaWFzZXMuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcGFzc3dvcmQKLSAgICAgICAgICAgICAgICBtS2V5UGFzc3dvcmQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBvbkNoYW5nZSwgYW5kIGNhbGwgaXQgdG8gZGlzcGxheSBlcnJvcnMgYW5kIGVuYWJsZS9kaXNhYmxlIHBhZ2VDb21wbGV0ZWQuCi0gICAgICAgICAgICAgICAgbURpc2FibGVPbkNoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gaW4gY2FzZSB3ZSBleGl0IHdpdGggYW4gZXhjZXB0aW9uLCB3ZSBuZWVkIHRvIHJlc2V0IHRoaXMKLSAgICAgICAgICAgICAgICBtRGlzYWJsZU9uQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaXphcmQuZ2V0S2V5c3RvcmVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAobVdpemFyZC5nZXRLZXlDcmVhdGlvbk1vZGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1XaXphcmQuZ2V0S2V5Q3JlYXRpb25QYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtV2l6YXJkLmdldEtleUNoZWNrUGFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgY2hhbmdlcyBhbmQgdXBkYXRlIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBjYWxscyB7QGxpbmsgI3NldFBhZ2VDb21wbGV0ZShib29sZWFuKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ2hhbmdlKCkgewotICAgICAgICBpZiAobURpc2FibGVPbkNoYW5nZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotCi0gICAgICAgIGlmIChtV2l6YXJkLmdldEtleUNyZWF0aW9uTW9kZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAobUtleUFsaWFzZXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiU2VsZWN0IGEga2V5IGFsaWFzLiIpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKG1LZXlQYXNzd29yZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkVudGVyIGtleSBwYXNzd29yZC4iKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVdpZGdldHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gdXNlS2V5ID0gIW1XaXphcmQuZ2V0S2V5Q3JlYXRpb25Nb2RlKCk7Ci0gICAgICAgIG1LZXlBbGlhc2VzTGFiZWwuc2V0RW5hYmxlZCh1c2VLZXkpOwotICAgICAgICBtS2V5QWxpYXNlcy5zZXRFbmFibGVkKHVzZUtleSk7Ci0gICAgICAgIG1LZXlQYXNzd29yZC5zZXRFbmFibGVkKHVzZUtleSk7Ci0gICAgICAgIG1LZXlQYXNzd29yZExhYmVsLnNldEVuYWJsZWQodXNlS2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvS2V5c3RvcmVTZWxlY3Rpb25QYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvS2V5c3RvcmVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmI3YjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvZXhwb3J0L0tleXN0b3JlU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMuZXhwb3J0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5leHBvcnQuRXhwb3J0V2l6YXJkLkV4cG9ydFdpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogS2V5c3RvcmUgc2VsZWN0aW9uIHBhZ2UuIFRoaXMgcGFnZSBhbGxvd3MgdG8gY2hvb3NlIHRvIGNyZWF0ZSBhIG5ldyBrZXlzdG9yZSBvciB1c2UgYW4KLSAqIGV4aXN0aW5nIG9uZS4gCi0gKi8KLWZpbmFsIGNsYXNzIEtleXN0b3JlU2VsZWN0aW9uUGFnZSBleHRlbmRzIEV4cG9ydFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBFeHBvcnRXaXphcmQgbVdpemFyZDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtVXNlRXhpc3RpbmdLZXlzdG9yZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ3JlYXRlS2V5c3RvcmU7Ci0gICAgcHJpdmF0ZSBUZXh0IG1LZXlzdG9yZTsKLSAgICBwcml2YXRlIFRleHQgbUtleXN0b3JlUGFzc3dvcmQ7Ci0gICAgcHJpdmF0ZSBMYWJlbCBtQ29uZmlybUxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBtS2V5c3RvcmVQYXNzd29yZDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNhYmxlT25DaGFuZ2UgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBLZXlzdG9yZVNlbGVjdGlvblBhZ2UoRXhwb3J0V2l6YXJkIHdpemFyZCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgICAgbVdpemFyZCA9IHdpemFyZDsKLQotICAgICAgICBzZXRUaXRsZSgiS2V5c3RvcmUgc2VsZWN0aW9uIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCIiKTsgLy9UT0RPCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZ2Q7Ci0gICAgICAgIAotICAgICAgICBtVXNlRXhpc3RpbmdLZXlzdG9yZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOwotICAgICAgICBtVXNlRXhpc3RpbmdLZXlzdG9yZS5zZXRUZXh0KCJVc2UgZXhpc3Rpbmcga2V5c3RvcmUiKTsKLSAgICAgICAgbVVzZUV4aXN0aW5nS2V5c3RvcmUuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBtVXNlRXhpc3RpbmdLZXlzdG9yZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICAgICAgbUNyZWF0ZUtleXN0b3JlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0gICAgICAgIG1DcmVhdGVLZXlzdG9yZS5zZXRUZXh0KCJDcmVhdGUgbmV3IGtleXN0b3JlIik7Ci0gICAgICAgIG1DcmVhdGVLZXlzdG9yZS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkxvY2F0aW9uOiIpOwotICAgICAgICBtS2V5c3RvcmUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBtS2V5c3RvcmUuc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KCJCcm93c2UuLi4iKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotICAgICAgICAgICAgICAgaWYgKG1Vc2VFeGlzdGluZ0tleXN0b3JlLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpLFNXVC5PUEVOKTsKLSAgICAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldFRleHQoIkxvYWQgS2V5c3RvcmUiKTsKLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpLFNXVC5TQVZFKTsKLSAgICAgICAgICAgICAgICAgICBmaWxlRGlhbG9nLnNldFRleHQoIlNlbGVjdCBLZXlzdG9yZSBOYW1lIik7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICBtS2V5c3RvcmUuc2V0VGV4dChmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlBhc3N3b3JkOiIpOwotICAgICAgICBtS2V5c3RvcmVQYXNzd29yZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkLmFkZFZlcmlmeUxpc3RlbmVyKHNQYXNzd29yZFZlcmlmaWVyKTsKLSAgICAgICAgbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKCkpOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gZ2Qud2lkdGhIaW50ID0gMDsKLQotICAgICAgICBtQ29uZmlybUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtQ29uZmlybUxhYmVsLnNldFRleHQoIkNvbmZpcm06Iik7Ci0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkMiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkMi5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtS2V5c3RvcmVQYXNzd29yZDIuYWRkVmVyaWZ5TGlzdGVuZXIoc1Bhc3N3b3JkVmVyaWZpZXIpOwotICAgICAgICBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPSBnZC53aWR0aEhpbnQgPSAwOwotICAgICAgICBtS2V5c3RvcmVQYXNzd29yZDIuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiB0aGUgZmlyc3QgdGltZQotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIG1Vc2VFeGlzdGluZ0tleXN0b3JlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVTdG9yZSA9ICFtVXNlRXhpc3RpbmdLZXlzdG9yZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkMi5zZXRFbmFibGVkKGNyZWF0ZVN0b3JlKTsKLSAgICAgICAgICAgICAgIG1Db25maXJtTGFiZWwuc2V0RW5hYmxlZChjcmVhdGVTdG9yZSk7Ci0gICAgICAgICAgICAgICBtV2l6YXJkLnNldEtleXN0b3JlQ3JlYXRpb25Nb2RlKGNyZWF0ZVN0b3JlKTsKLSAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbUtleXN0b3JlLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1XaXphcmQuc2V0S2V5c3RvcmUobUtleXN0b3JlLmdldFRleHQoKS50cmltKCkpOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1XaXphcmQuc2V0S2V5c3RvcmVQYXNzd29yZChtS2V5c3RvcmVQYXNzd29yZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1LZXlzdG9yZVBhc3N3b3JkMi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvbkNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAobVVzZUV4aXN0aW5nS2V5c3RvcmUuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtV2l6YXJkLmdldEtleVNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1XaXphcmQuZ2V0S2V5Q3JlYXRpb25QYWdlKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHZvaWQgb25TaG93KCkgewotICAgICAgICAvLyBmaWxsIHRoZSB0ZXh0cyB3aXRoIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBwcm9qZWN0LgotICAgICAgICBpZiAoKG1Qcm9qZWN0RGF0YUNoYW5nZWQgJiBEQVRBX1BST0pFQ1QpICE9IDApIHsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBrZXlzdG9yZS9hbGlhcyBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbVdpemFyZC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGRpc2FibGUgb25DaGFuZ2UgZm9yIG5vdy4gd2UnbGwgY2FsbCBpdCBvbmNlIGF0IHRoZSBlbmQuCi0gICAgICAgICAgICBtRGlzYWJsZU9uQ2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGtleXN0b3JlID0gUHJvamVjdEhlbHBlci5sb2FkU3RyaW5nUHJvcGVydHkocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgRXhwb3J0V2l6YXJkLlBST1BFUlRZX0tFWVNUT1JFKTsKLSAgICAgICAgICAgIGlmIChrZXlzdG9yZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUtleXN0b3JlLnNldFRleHQoa2V5c3RvcmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyByZXNldCB0aGUgcGFzc3dvcmRzCi0gICAgICAgICAgICBtS2V5c3RvcmVQYXNzd29yZC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbUtleXN0b3JlUGFzc3dvcmQyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGVuYWJsZSBvbkNoYW5nZSwgYW5kIGNhbGwgaXQgdG8gZGlzcGxheSBlcnJvcnMgYW5kIGVuYWJsZS9kaXNhYmxlIHBhZ2VDb21wbGV0ZWQuCi0gICAgICAgICAgICBtRGlzYWJsZU9uQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICBvbkNoYW5nZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBjaGFuZ2VzIGFuZCB1cGRhdGUgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGNhbGxzIHtAbGluayAjc2V0UGFnZUNvbXBsZXRlKGJvb2xlYW4pfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25DaGFuZ2UoKSB7Ci0gICAgICAgIGlmIChtRGlzYWJsZU9uQ2hhbmdlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBjcmVhdGVTdG9yZSA9ICFtVXNlRXhpc3RpbmdLZXlzdG9yZS5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAvLyBjaGVja3MgdGhlIGtleXN0b3JlIHBhdGggaXMgbm9uIG51bGwuCi0gICAgICAgIFN0cmluZyBrZXlzdG9yZSA9IG1LZXlzdG9yZS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBpZiAoa2V5c3RvcmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJFbnRlciBwYXRoIHRvIGtleXN0b3JlLiIpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGtleXN0b3JlKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNyZWF0ZVN0b3JlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiS2V5c3RvcmUgZG9lcyBub3QgZXhpc3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiS2V5c3RvcmUgcGF0aCBpcyBhIGRpcmVjdG9yeS4iKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdG9yZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkZpbGUgYWxyZWFkeSBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG1LZXlzdG9yZVBhc3N3b3JkLmdldFRleHQoKTsKLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgiRW50ZXIga2V5c3RvcmUgcGFzc3dvcmQuIik7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGNyZWF0ZVN0b3JlICYmIHZhbHVlLmxlbmd0aCgpIDwgNikgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJLZXlzdG9yZSBwYXNzd29yZCBpcyB0b28gc2hvcnQgLSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycy4iKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3JlYXRlU3RvcmUpIHsKLSAgICAgICAgICAgIGlmIChtS2V5c3RvcmVQYXNzd29yZDIuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkNvbmZpcm0ga2V5c3RvcmUgcGFzc3dvcmQuIik7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtS2V5c3RvcmVQYXNzd29yZC5nZXRUZXh0KCkuZXF1YWxzKG1LZXlzdG9yZVBhc3N3b3JkMi5nZXRUZXh0KCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJLZXlzdG9yZSBwYXNzd29yZHMgZG8gbm90IG1hdGNoLiIpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2V4cG9ydC9Qcm9qZWN0Q2hlY2tQYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9leHBvcnQvUHJvamVjdENoZWNrUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhjYjY5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL2V4cG9ydC9Qcm9qZWN0Q2hlY2tQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5leHBvcnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5CYXNlUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0Q2hvb3NlckhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLmV4cG9ydC5FeHBvcnRXaXphcmQuRXhwb3J0V2l6YXJkUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBGaXJzdCBFeHBvcnQgV2l6YXJkIFBhZ2UuIERpc3BsYXkgd2FybmluZy9lcnJvcnMuIAotICovCi1maW5hbCBjbGFzcyBQcm9qZWN0Q2hlY2tQYWdlIGV4dGVuZHMgRXhwb3J0V2l6YXJkUGFnZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19FUlJPUiA9ICJlcnJvci5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElNR19XQVJOSU5HID0gIndhcm5pbmcucG5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBFeHBvcnRXaXphcmQgbVdpemFyZDsKLSAgICBwcml2YXRlIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtRXJyb3I7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtV2FybmluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc01lc3NhZ2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBtVG9wQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1FcnJvckNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIFRleHQgbVByb2plY3RUZXh0OwotICAgIHByaXZhdGUgUHJvamVjdENob29zZXJIZWxwZXIgbVByb2plY3RDaG9vc2VySGVscGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRmlyc3RPblNob3cgPSB0cnVlOwotCi0gICAgcHJvdGVjdGVkIFByb2plY3RDaGVja1BhZ2UoRXhwb3J0V2l6YXJkIHdpemFyZCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgICAgbVdpemFyZCA9IHdpemFyZDsKLQotICAgICAgICBzZXRUaXRsZSgiUHJvamVjdCBDaGVja3MiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIlBlcmZvcm1zIGEgc2V0IG9mIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIGNhbiBiZSBleHBvcnRlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVByb2plY3RDaG9vc2VySGVscGVyID0gbmV3IFByb2plY3RDaG9vc2VySGVscGVyKHBhcmVudC5nZXRTaGVsbCgpKTsKLSAgICAgICAgbURpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBudWxsOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG51bGw7Ci0KLSAgICAgICAgbVRvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Ub3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIG1Ub3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjb21wb3NpdGUgZm9yIHRoZSBwcm9qZWN0IHNlbGVjdGlvbi4KLSAgICAgICAgQ29tcG9zaXRlIHByb2plY3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1Ub3BDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJvamVjdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgcHJvamVjdENvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlNlbGVjdCB0aGUgcHJvamVjdCB0byBleHBvcnQ6Iik7Ci0KLSAgICAgICAgbmV3IExhYmVsKHByb2plY3RDb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJQcm9qZWN0OiIpOwotICAgICAgICBtUHJvamVjdFRleHQgPSBuZXcgVGV4dChwcm9qZWN0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVByb2plY3RUZXh0LnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1Qcm9qZWN0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVQcm9qZWN0TmFtZUNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0Q29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KCJCcm93c2UuLi4iKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbVByb2plY3RDaG9vc2VySGVscGVyLmNob29zZUphdmFQcm9qZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb2plY3RUZXh0LmdldFRleHQoKS50cmltKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyBuYW1lIGluIHRoZSB0ZXh0IGZpZWxkLiBUaGUgbW9kaWZ5IGxpc3RlbmVyIHdpbGwgdGFrZQotICAgICAgICAgICAgICAgICAgICAvLyBjYXJlIG9mIHVwZGF0aW5nIHRoZSBzdGF0dXMgYW5kIHRoZSBFeHBvcnRXaXphcmQgb2JqZWN0LgotICAgICAgICAgICAgICAgICAgICBtUHJvamVjdFRleHQuc2V0VGV4dChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZXRDb250cm9sKG1Ub3BDb21wb3NpdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHZvaWQgb25TaG93KCkgewotICAgICAgICBpZiAobUZpcnN0T25TaG93KSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgYW5kIGluaXQgdGhlIHVpCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbVdpemFyZC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByb2plY3RUZXh0LnNldFRleHQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBtRmlyc3RPblNob3cgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYnVpbGRFcnJvclVpKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiB0aGUgZmlyc3QgdGltZQotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgbUhhc01lc3NhZ2UgPSBmYWxzZTsKLQotICAgICAgICAvLyBjb21wb3NpdGUgcGFyZW50IGZvciB0aGUgd2FybmluZy9lcnJvcgotICAgICAgICBHcmlkTGF5b3V0IGdsID0gbnVsbDsKLSAgICAgICAgbUVycm9yQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtVG9wQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1FcnJvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZ2wudmVydGljYWxTcGFjaW5nICo9IDM7IC8vIG1vcmUgc3BhY2luZyB0aGFuIG5vcm1hbC4KLSAgICAgICAgbUVycm9yQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJTZWxlY3QgcHJvamVjdCB0byBleHBvcnQuIik7Ci0gICAgICAgICAgICBtSGFzTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3IobUVycm9yQ29tcG9zaXRlLCAiUHJvamVjdCBpcyBub3QgYW4gQW5kcm9pZCBwcm9qZWN0LiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKFByb2plY3RIZWxwZXIuaGFzRXJyb3IocHJvamVjdCwgdHJ1ZSkpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihtRXJyb3JDb21wb3NpdGUsICJQcm9qZWN0IGhhcyBjb21waWxhdGlvbiBlcnJvcihzKSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgcHJvamVjdCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBvdXRwdXRJRm9sZGVyID0gQmFzZVByb2plY3RIZWxwZXIuZ2V0T3V0cHV0Rm9sZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0SUZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0T3NQYXRoID0gIG91dHB1dElGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBrRmlsZVBhdGggPSAgb3V0cHV0T3NQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBwcm9qZWN0LmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRE9UX0FORFJPSURfUEFDS0FHRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYXBrRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihtRXJyb3JDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMSRzLyUyJHMvJTEkcyUzJHMgZG9lcyBub3QgZXhpc3RzISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRJRm9sZGVyLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENvbnN0YW50cy5ET1RfQU5EUk9JRF9QQUNLQUdFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihtRXJyb3JDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHRoZSBvdXRwdXQgZm9sZGVyIG9mIHRoZSBwcm9qZWN0ISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLyBwcm9qZWN0IGlzIGFuIGFuZHJvaWQgcHJvamVjdCwgd2UgY2hlY2sgdGhlIGRlYnVnZ2FibGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3RQYXJzZXIgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVByb2plY3RIZWxwZXIuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG51bGwgLyogZXJyb3JMaXN0ZW5lciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGdhdGhlckRhdGEgKi8sIGZhbHNlIC8qIG1hcmtFcnJvcnMgKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gZGVidWdnYWJsZSA9IG1hbmlmZXN0UGFyc2VyLmdldERlYnVnZ2FibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z2dhYmxlICE9IG51bGwgJiYgZGVidWdnYWJsZSA9PSBCb29sZWFuLlRSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdhcm5pbmcobUVycm9yQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG1hbmlmZXN0ICdkZWJ1Z2dhYmxlJyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUuXG5Zb3Ugc2hvdWxkIHNldCBpdCB0byBmYWxzZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgeW91IHJlbGVhc2UgdG8gdGhlIHB1YmxpYy4iKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBtYXB2aWV3IHN0dWZmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdW5hYmxlIHRvIGFjY2VzcyBuYXR1cmUKLSAgICAgICAgICAgICAgICBhZGRFcnJvcihtRXJyb3JDb21wb3NpdGUsICJVbmFibGUgdG8gZ2V0IHByb2plY3QgbmF0dXJlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtSGFzTWVzc2FnZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobUVycm9yQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCJObyBlcnJvcnMgZm91bmQuIENsaWNrIE5leHQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1Ub3BDb21wb3NpdGUubGF5b3V0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZXJyb3IgbGFiZWwgdG8gYSB7QGxpbmsgQ29tcG9zaXRlfSBvYmplY3QuCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgQ29tcG9zaXRlIHBhcmVudC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkRXJyb3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1FcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3IgPSBBZHRQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKS5sb2FkSW1hZ2UoSU1HX0VSUk9SLCBtRGlzcGxheSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKS5zZXRJbWFnZShtRXJyb3IpOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0gICAgICAgIAotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkFwcGxpY2F0aW9uIGNhbm5vdCBiZSBleHBvcnRlZCBkdWUgdG8gdGhlIGVycm9yKHMpIGJlbG93LiIpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBtSGFzTWVzc2FnZSA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSB3YXJuaW5nIGxhYmVsIHRvIGEge0BsaW5rIENvbXBvc2l0ZX0gb2JqZWN0LgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIENvbXBvc2l0ZSBwYXJlbnQuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkV2FybmluZyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAobVdhcm5pbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbVdhcm5pbmcgPSBBZHRQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKS5sb2FkSW1hZ2UoSU1HX1dBUk5JTkcsIG1EaXNwbGF5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldEltYWdlKG1XYXJuaW5nKTsKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICAKLSAgICAgICAgbUhhc01lc3NhZ2UgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHBhcmFtZXRlcnMgZm9yIGNvcnJlY3RuZXNzLCBhbmQgdXBkYXRlIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBidXR0b25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcm9qZWN0TmFtZUNoYW5nZSgpIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtRXJyb3JDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVycm9yQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1FcnJvckNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgd2l6YXJkIHdpdGggdGhlIG5ldyBwcm9qZWN0Ci0gICAgICAgIG1XaXphcmQuc2V0UHJvamVjdChudWxsKTsKLQotICAgICAgICAvL3Rlc3QgdGhlIHByb2plY3QgbmFtZSBmaXJzdCEKLSAgICAgICAgU3RyaW5nIHRleHQgPSBtUHJvamVjdFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJTZWxlY3QgcHJvamVjdCB0byBleHBvcnQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaGVzKCJbYS16QS1aMC05XyBcXC4tXSsiKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJQcm9qZWN0IG5hbWUgY29udGFpbnMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbVByb2plY3RDaG9vc2VySGVscGVyLmdldEFuZHJvaWRQcm9qZWN0cyhudWxsKTsKLSAgICAgICAgICAgIElQcm9qZWN0IGZvdW5kID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0IDogcHJvamVjdHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHModGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB3aXphcmQgd2l0aCB0aGUgbmV3IHByb2plY3QKLSAgICAgICAgICAgICAgICBtV2l6YXJkLnNldFByb2plY3QoZm91bmQpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IHJlYnVpbGQgdGhlIGVycm9yIHVpLgotICAgICAgICAgICAgICAgIGJ1aWxkRXJyb3JVaShmb3VuZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShTdHJpbmcuZm9ybWF0KCJUaGVyZSBpcyBubyBhbmRyb2lkIHByb2plY3QgbmFtZWQgJyUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3Byb2plY3QvTmV3UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdQcm9qZWN0Q3JlYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWNmMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdQcm9qZWN0Q3JlYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBSZWZlcmVuY2VzOgotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuSmF2YVByb2plY3RXaXphcmQKLSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLkphdmFQcm9qZWN0V2l6YXJkRmlyc3RQYWdlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5uZXdwcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQW5kcm9pZENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTWFuaWZlc3RQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuQW5kcm9pZE1hbmlmZXN0UGFyc2VyLkFjdGl2aXR5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrLklUYXJnZXRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5uZXdwcm9qZWN0Lk5ld1Rlc3RQcm9qZWN0Q3JlYXRpb25QYWdlLlRlc3RJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RQcm9wZXJ0aWVzLlByb3BlcnR5VHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzLlNka1RhcmdldFNlbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLlVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBOZXdBbmRyb2lkUHJvamVjdENyZWF0aW9uUGFnZSBpcyBhIHByb2plY3QgY3JlYXRpb24gcGFnZSB0aGF0IHByb3ZpZGVzIHRoZQotICogZm9sbG93aW5nIGZpZWxkczoKLSAqIDx1bD4KLSAqIDxsaT4gUHJvamVjdCBuYW1lCi0gKiA8bGk+IFNESyBUYXJnZXQKLSAqIDxsaT4gQXBwbGljYXRpb24gbmFtZQotICogPGxpPiBQYWNrYWdlIG5hbWUKLSAqIDxsaT4gQWN0aXZpdHkgbmFtZQotICogPC91bD4KLSAqIE5vdGU6IHRoaXMgY2xhc3MgaXMgcHVibGljIHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gdW5pdCB0ZXN0cy4KLSAqIEl0IGlzIGhvd2V2ZXIgYW4gaW50ZXJuYWwgY2xhc3MuIEl0cyBBUEkgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqIEl0IHNob3VsZCBzZW1hbnRpY2FsbHkgYmUgY29uc2lkZXJlZCBhcyBhIHByaXZhdGUgZmluYWwgY2xhc3MuCi0gKiBEbyBub3QgZGVyaXZlIGZyb20gdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX1BBR0VfTkFNRSA9ICJuZXdBbmRyb2lkUHJvamVjdFBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgYWxsIG5hbWUgZmllbGRzIChwcm9qZWN0LCBhY3Rpdml0eSwgYXBwbGljYXRpb24sIHBhY2thZ2UpLiBVc2VkCi0gICAgICogd2hlbmV2ZXIgYSB2YWx1ZSBpcyByZXF1ZXN0ZWQgYmVmb3JlIGNvbnRyb2xzIGFyZSBjcmVhdGVkLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX05BTUUgPSAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIENyZWF0ZSBOZXcgUHJvamVjdCByYWRpby4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxfQ1JFQVRFX05FV19QUk9KRUNUID0gdHJ1ZTsKLSAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIENyZWF0ZSBQcm9qZWN0IEZyb20gU2FtcGxlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVElBTF9DUkVBVEVfRlJPTV9TQU1QTEUgPSBmYWxzZTsKLSAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIENyZWF0ZSBQcm9qZWN0IEZyb20gRXhpc3RpbmcgU291cmNlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVElBTF9DUkVBVEVfRlJPTV9TT1VSQ0UgPSBmYWxzZTsKLSAgICAvKiogSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIFVzZSBEZWZhdWx0IExvY2F0aW9uIGNoZWNrIGJveC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxfVVNFX0RFRkFVTFRfTE9DQVRJT04gPSB0cnVlOwotICAgIC8qKiBJbml0aWFsIHZhbHVlIGZvciB0aGUgQ3JlYXRlIEFjdGl2aXR5IGNoZWNrIGJveC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxfQ1JFQVRFX0FDVElWSVRZID0gdHJ1ZTsKLQotCi0gICAgLyoqIFBhdHRlcm4gZm9yIGNoYXJhY3RlcnMgYWNjZXB0ZWQgaW4gYSBwcm9qZWN0IG5hbWUuIFNpbmNlIHRoaXMgd2lsbCBiZSB1c2VkIGFzIGEKLSAgICAgKiBkaXJlY3RvcnkgbmFtZSwgd2UncmUgYmVpbmcgYSBiaXQgY29uc2VydmF0aXZlIG9uIHB1cnBvc2UuIEl0IGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzUHJvamVjdE5hbWVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeW1xcd11bXFx3LiAtXSokIik7ICAvLyROT04tTkxTLTEkCi0gICAgLyoqIExhc3QgdXNlci1icm93c2VkIGxvY2F0aW9uLCBzdGF0aWMgc28gdGhhdCBpdCBiZSByZW1lbWJlcmVkIGZvciB0aGUgd2hvbGUgc2Vzc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzQ3VzdG9tTG9jYXRpb25Pc1BhdGggPSAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNBdXRvQ29tcHV0ZUN1c3RvbUxvY2F0aW9uID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IE1TR19OT05FID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBNU0dfV0FSTklORyA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgTVNHX0VSUk9SID0gMjsKLQotICAgIC8qKiBTdHJ1Y3R1cmUgd2l0aCB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIGluZm9ybWF0aW9uIGZyb20gdGhpcyBNYWluIFByb2plY3QgcGFnZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1haW5JbmZvIG1JbmZvID0gbmV3IE1haW5JbmZvKCk7Ci0gICAgLyoqIFN0cnVjdHVyZSB3aXRoIHRoZSBleHRlcm5hbGx5IHZpc2libGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgVGVzdCBQcm9qZWN0IHBhZ2UuCi0gICAgICogIFRoaXMgaXMgbnVsbCBpZiB0aGVyZSdzIG5vIHN1Y2ggcGFnZSwgbWVhbmluZyB0aGUgbWFpbiBwcm9qZWN0IHBhZ2UgaXMgc3RhbmRhbG9uZS4gKi8KLSAgICBwcml2YXRlIFRlc3RJbmZvIG1UZXN0SW5mbzsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1Vc2VyUGFja2FnZU5hbWUgPSAiIjsgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIG1Vc2VyQWN0aXZpdHlOYW1lID0gIiI7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlckNyZWF0ZUFjdGl2aXR5Q2hlY2sgPSBJTklUSUFMX0NSRUFURV9BQ1RJVklUWTsKLSAgICBwcml2YXRlIFN0cmluZyBtU291cmNlRm9sZGVyID0gIiI7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIFRleHQgbVByb2plY3ROYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1QYWNrYWdlTmFtZUZpZWxkOwotICAgIHByaXZhdGUgVGV4dCBtQWN0aXZpdHlOYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1BcHBsaWNhdGlvbk5hbWVGaWVsZDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ3JlYXRlTmV3UHJvamVjdFJhZGlvOwotICAgIHByaXZhdGUgQnV0dG9uIG1DcmVhdGVGcm9tU2FtcGxlUmFkaW87Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVVzZURlZmF1bHRMb2NhdGlvbjsKLSAgICBwcml2YXRlIExhYmVsIG1Mb2NhdGlvbkxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBtTG9jYXRpb25QYXRoRmllbGQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQ3JlYXRlQWN0aXZpdHlDaGVjazsKLSAgICBwcml2YXRlIFRleHQgbU1pblNka1ZlcnNpb25GaWVsZDsKLSAgICBwcml2YXRlIFNka1RhcmdldFNlbGVjdG9yIG1TZGtUYXJnZXRTZWxlY3RvcjsKLSAgICBwcml2YXRlIElUYXJnZXRDaGFuZ2VMaXN0ZW5lciBtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsTG9jYXRpb25QYXRoVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxQcm9qZWN0TmFtZVVwZGF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsQXBwbGljYXRpb25OYW1lVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxDcmVhdGVBY3Rpdml0eVVwZGF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFwcGxpY2F0aW9uTmFtZU1vZGlmaWVkQnlVc2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtU2FtcGxlc1BhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBDb21ibyBtU2FtcGxlc0NvbWJvOwotCi0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBjcmVhdGlvbiB3aXphcmQgcGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmV3UHJvamVjdENyZWF0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoTUFJTl9QQUdFX05BTUUpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRUaXRsZSgiTmV3IEFuZHJvaWQgUHJvamVjdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIG5ldyBBbmRyb2lkIFByb2plY3QgcmVzb3VyY2UuIik7Ci0gICAgfQotCi0gICAgLy8gLS0tIEdldHRlcnMgdXNlZCBieSBOZXdQcm9qZWN0V2l6YXJkIC0tLQotCi0KLSAgICAvKioKLSAgICAgKiBTdHJ1Y3R1cmUgdGhhdCBjb2xsZWN0cyBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGluZm9ybWF0aW9uIGZyb20gdGhpcyBwYWdlLgotICAgICAqIFRoaXMgaXMgdXNlZCBieSB0aGUgY2FsbGluZyB3aXphcmQgdG8gYWN0dWFsbHkgZG8gdGhlIHdvcmsgb3IgYnkgb3RoZXIgcGFnZXMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFkdC10ZXN0IGNvdW50ZXJwYXJ0IGNhbiBvdmVycmlkZSB0aGUgcmV0dXJuZWQKLSAgICAgKiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElNYWluSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvblBhdGgoKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvamVjdCBsb2NhdGlvbiBwYXRoIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIsIG9yIGl0cwotICAgICAgICAgKiBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLiBOb3RlIHRoYXQgaWYgdGhlIGRlZmF1bHQgaGFzIGJlZW4gcmV0dXJuZWQgdGhlCi0gICAgICAgICAqIHBhdGggaW4gYSBwcm9qZWN0IGRlc2NyaXB0aW9uIHVzZWQgdG8gY3JlYXRlIGEgcHJvamVjdCBzaG91bGQgbm90IGJlIHNldC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgcHJvamVjdCBsb2NhdGlvbiBwYXRoIG9yIGl0cyBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9qZWN0IG5hbWUgZmllbGQgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgcmVtb3ZlZC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHBhY2thZ2UgbmFtZSBmaWVsZCB3aXRoIHNwYWNlcyB0cmltbWVkLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZpdHkgbmFtZSBmaWVsZCB3aXRoIHNwYWNlcyB0cmltbWVkLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5TmFtZSgpOwotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG1pbiBzZGsgdmVyc2lvbiBmaWVsZCB3aXRoIHNwYWNlcyB0cmltbWVkLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1pblNka1ZlcnNpb24oKTsKLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGZpZWxkIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCk7Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgIkNyZWF0ZSBOZXcgUHJvamVjdCIgcmFkaW8uICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmV3UHJvamVjdCgpOwotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICJDcmVhdGUgQWN0aXZpdHkiIGNoZWNrYm94LiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZUFjdGl2aXR5KCk7Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgVXNlIERlZmF1bHQgTG9jYXRpb24gZmllbGQuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHVzZURlZmF1bHRMb2NhdGlvbigpOwotICAgICAgICAvKiogUmV0dXJucyB0aGUgaW50ZXJuYWwgc291cmNlIGZvbGRlciAoZm9yIHRoZSAiZXhpc3RpbmcgcHJvamVjdCIgbW9kZSkgb3IgdGhlIGRlZmF1bHQKLSAgICAgICAgICogInNyYyIgY29uc3RhbnQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCk7Ci0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNkayB0YXJnZXQgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNlbGVjdGVkIHlldC4gKi8KLSAgICAgICAgcHVibGljIElBbmRyb2lkVGFyZ2V0IGdldFNka1RhcmdldCgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RydWN0dXJlIHRoYXQgY29sbGVjdHMgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcGFnZS4KLSAgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIGNhbGxpbmcgd2l6YXJkIHRvIGFjdHVhbGx5IGRvIHRoZSB3b3JrIG9yIGJ5IG90aGVyIHBhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBNYWluSW5mbyBpbXBsZW1lbnRzIElNYWluSW5mbyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb2plY3QgbG9jYXRpb24gcGF0aCBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBpdHMKLSAgICAgICAgICogYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZS4gTm90ZSB0aGF0IGlmIHRoZSBkZWZhdWx0IGhhcyBiZWVuIHJldHVybmVkIHRoZQotICAgICAgICAgKiBwYXRoIGluIGEgcHJvamVjdCBkZXNjcmlwdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIHByb2plY3Qgc2hvdWxkIG5vdCBiZSBzZXQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgbG9jYXRpb24gcGF0aCBvciBpdHMgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvblBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhdGgoZ2V0UHJvamVjdExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9qZWN0IG5hbWUgZmllbGQgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgcmVtb3ZlZC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvamVjdE5hbWVGaWVsZCA9PSBudWxsID8gSU5JVElBTF9OQU1FIDogbVByb2plY3ROYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFja2FnZSBuYW1lIGZpZWxkIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lRmllbGQgPT0gbnVsbCA/IElOSVRJQUxfTkFNRSA6IG1QYWNrYWdlTmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2aXR5IG5hbWUgZmllbGQgd2l0aCBzcGFjZXMgdHJpbW1lZC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2aXR5TmFtZUZpZWxkID09IG51bGwgPyBJTklUSUFMX05BTUUgOiBtQWN0aXZpdHlOYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWluIHNkayB2ZXJzaW9uIGZpZWxkIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWluU2RrVmVyc2lvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWluU2RrVmVyc2lvbkZpZWxkID09IG51bGwgPyAiIiA6IG1NaW5TZGtWZXJzaW9uRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gbmFtZSBmaWVsZCB3aXRoIHNwYWNlcyB0cmltbWVkLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uTmFtZSgpIHsKLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWN0aXZpdHkgYXMgZGVmYXVsdCBhcHBsaWNhdGlvbiBuYW1lLgotICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbk5hbWVGaWVsZCA9PSBudWxsID8gZ2V0QWN0aXZpdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICJDcmVhdGUgTmV3IFByb2plY3QiIHJhZGlvLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05ld1Byb2plY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNyZWF0ZU5ld1Byb2plY3RSYWRpbyA9PSBudWxsID8gSU5JVElBTF9DUkVBVEVfTkVXX1BST0pFQ1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3JlYXRlTmV3UHJvamVjdFJhZGlvLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAiQ3JlYXRlIGZyb20gRXhpc3RpbmcgU2FtcGxlIiByYWRpby4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVGcm9tU2FtcGxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DcmVhdGVGcm9tU2FtcGxlUmFkaW8gPT0gbnVsbCA/IElOSVRJQUxfQ1JFQVRFX0ZST01fU0FNUExFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNyZWF0ZUZyb21TYW1wbGVSYWRpby5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgIkNyZWF0ZSBBY3Rpdml0eSIgY2hlY2tib3guICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlQWN0aXZpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNyZWF0ZUFjdGl2aXR5Q2hlY2sgPT0gbnVsbCA/IElOSVRJQUxfQ1JFQVRFX0FDVElWSVRZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNyZWF0ZUFjdGl2aXR5Q2hlY2suZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFVzZSBEZWZhdWx0IExvY2F0aW9uIGZpZWxkLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0TG9jYXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVzZURlZmF1bHRMb2NhdGlvbiA9PSBudWxsID8gSU5JVElBTF9VU0VfREVGQVVMVF9MT0NBVElPTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Vc2VEZWZhdWx0TG9jYXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgaW50ZXJuYWwgc291cmNlIGZvbGRlciAoZm9yIHRoZSAiZXhpc3RpbmcgcHJvamVjdCIgbW9kZSkgb3IgdGhlIGRlZmF1bHQKLSAgICAgICAgICogInNyYyIgY29uc3RhbnQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCkgewotICAgICAgICAgICAgaWYgKGlzTmV3UHJvamVjdCgpIHx8IG1Tb3VyY2VGb2xkZXIgPT0gbnVsbCB8fCBtU291cmNlRm9sZGVyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2RrQ29uc3RhbnRzLkZEX1NPVVJDRVM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBtU291cmNlRm9sZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgc2RrIHRhcmdldCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0LiAqLwotICAgICAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0U2RrVGFyZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1TZGtUYXJnZXRTZWxlY3RvciA9PSBudWxsID8gbnVsbCA6IG1TZGtUYXJnZXRTZWxlY3Rvci5nZXRTZWxlY3RlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBNYWluSW5mb30gc3RydWN0dXJlIHRoYXQgY29sbGVjdHMgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBpbmZvcm1hdGlvbgotICAgICAqIGZyb20gdGhpcyBwYWdlLCB0byBiZSB1c2VkIGJ5IHRoZSBjYWxsaW5nIHdpemFyZCBvciBieSBvdGhlciBwYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSU1haW5JbmZvIGdldE1haW5JbmZvKCkgewotICAgICAgICByZXR1cm4gbUluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JhYnMgdGhlIHtAbGluayBUZXN0SW5mb30gc3RydWN0dXJlIHRoYXQgY29sbGVjdHMgZXh0ZXJuYWxseSB2aXNpYmxlIGZpZWxkcyBmcm9tIHRoZQotICAgICAqIHRlc3QgcHJvamVjdCBwYWdlLiBUaGlzIG1heSBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RJbmZvKFRlc3RJbmZvIHRlc3RJbmZvKSB7Ci0gICAgICAgIG1UZXN0SW5mbyA9IHRlc3RJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBARGlhbG9nUGFnZS5zZXRWaXNpYmxlKGJvb2xlYW4pIHRvIHB1dCB0aGUgZm9jdXMgaW4gdGhlIHByb2plY3QgbmFtZSB3aGVuCi0gICAgICogdGhlIGRpYWxvZyBpcyBtYWRlIHZpc2libGUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIFVJIGNyZWF0aW9uIC0tLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudAotICAgICAqIGNvbXBvc2l0ZS4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZUxvY2F0aW9uR3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlVGFyZ2V0R3JvdXAoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlUHJvcGVydGllc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHRoZSBmaXJzdCB0aW1lCi0gICAgICAgIGVuYWJsZUxvY2F0aW9uV2lkZ2V0cygpOwotICAgICAgICBsb2FkU2FtcGxlc0ZvclRhcmdldChudWxsIC8qdGFyZ2V0Ki8pOwotCi0gICAgICAgIC8vIFNob3cgZGVzY3JpcHRpb24gdGhlIGZpcnN0IHRpbWUKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLy8gVmFsaWRhdGUuIFRoaXMgd2lsbCBjb21wbGFpbiBhYm91dCB0aGUgZmlyc3QgZW1wdHkgZmllbGQuCi0gICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotICAgICAgICBpZiAobVNka1RhcmdldENoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlVGFyZ2V0TGlzdGVuZXIobVNka1RhcmdldENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZ3JvdXAgZm9yIHRoZSBwcm9qZWN0IG5hbWU6Ci0gICAgICogW2xhYmVsOiAiUHJvamVjdCBOYW1lIl0gW3RleHQgZmllbGRdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIG5ldyBwcm9qZWN0IGxhYmVsCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlByb2plY3QgbmFtZToiKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIk5hbWUgb2YgdGhlIEVjbGlwc2UgcHJvamVjdCB0byBjcmVhdGUuIEl0IGNhbm5vdCBiZSBlbXB0eS4iKTsKLQotICAgICAgICAvLyBuZXcgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldFRvb2xUaXBUZXh0KCJOYW1lIG9mIHRoZSBFY2xpcHNlIHByb2plY3QgdG8gY3JlYXRlLiBJdCBjYW5ub3QgYmUgZW1wdHkuIik7Ci0gICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtSW50ZXJuYWxQcm9qZWN0TmFtZVVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGdyb3VwIGZvciB0aGUgUHJvamVjdCBvcHRpb25zOgotICAgICAqIFtyYWRpb10gQ3JlYXRlIG5ldyBwcm9qZWN0Ci0gICAgICogW3JhZGlvXSBDcmVhdGUgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZXMKLSAgICAgKiBbY2hlY2tdIFVzZSBkZWZhdWx0IGxvY2F0aW9uCi0gICAgICogTG9jYXRpb24gW3RleHQgZmllbGRdIFticm93c2UgYnV0dG9uXQotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgICAgIC8vIExheW91dCBoYXMgNCBjb2x1bW5zIG9mIG5vbi1lcXVhbCBzaXplCi0gICAgICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdyb3VwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIkNvbnRlbnRzIik7Ci0KLSAgICAgICAgbUNyZWF0ZU5ld1Byb2plY3RSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIG1DcmVhdGVOZXdQcm9qZWN0UmFkaW8uc2V0VGV4dCgiQ3JlYXRlIG5ldyBwcm9qZWN0IGluIHdvcmtzcGFjZSIpOwotICAgICAgICBtQ3JlYXRlTmV3UHJvamVjdFJhZGlvLnNldFNlbGVjdGlvbihJTklUSUFMX0NSRUFURV9ORVdfUFJPSkVDVCk7Ci0KLSAgICAgICAgQnV0dG9uIGV4aXN0aW5nX3Byb2plY3RfcmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBleGlzdGluZ19wcm9qZWN0X3JhZGlvLnNldFRleHQoIkNyZWF0ZSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc291cmNlIik7Ci0gICAgICAgIGV4aXN0aW5nX3Byb2plY3RfcmFkaW8uc2V0U2VsZWN0aW9uKElOSVRJQUxfQ1JFQVRFX0ZST01fU09VUkNFKTsKLQotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgbVVzZURlZmF1bHRMb2NhdGlvbi5zZXRUZXh0KCJVc2UgZGVmYXVsdCBsb2NhdGlvbiIpOwotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uLnNldFNlbGVjdGlvbihJTklUSUFMX1VTRV9ERUZBVUxUX0xPQ0FUSU9OKTsKLQotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBsb2NhdGlvbl9saXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTG9jYXRpb25XaWRnZXRzKCk7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdE5hbWVzRnJvbUFuZHJvaWRNYW5pZmVzdCgpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbUNyZWF0ZU5ld1Byb2plY3RSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsb2NhdGlvbl9saXN0ZW5lcik7Ci0gICAgICAgIGV4aXN0aW5nX3Byb2plY3RfcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobG9jYXRpb25fbGlzdGVuZXIpOwotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxvY2F0aW9uX2xpc3RlbmVyKTsKLQotICAgICAgICBDb21wb3NpdGUgbG9jYXRpb25fZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxvY2F0aW9uX2dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCAvKiBudW0gY29sdW1ucyAqLwotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbHVtbnMgb2Ygbm90IGVxdWFsIHNpemUgKi8pKTsKLSAgICAgICAgbG9jYXRpb25fZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGxvY2F0aW9uX2dyb3VwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgbUxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwobG9jYXRpb25fZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbUxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiTG9jYXRpb246Iik7Ci0KLSAgICAgICAgbUxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQobG9jYXRpb25fZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIC8qIGhvcml6b250YWwgYWxpZ25tZW50ICovCi0gICAgICAgICAgICAgICAgR3JpZERhdGEuQkVHSU5OSU5HLCAvKiB2ZXJ0aWNhbCBhbGlnbm1lbnQgKi8KLSAgICAgICAgICAgICAgICB0cnVlLCAgLyogZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSAqLwotICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBncmFiRXhjZXNzVmVydGljYWxTcGFjZSAqLwotICAgICAgICAgICAgICAgIDEsICAgICAvKiBob3Jpem9udGFsU3BhbiAqLwotICAgICAgICAgICAgICAgIDEpOyAgICAvKiB2ZXJ0aWNhbFNwYW4gKi8KLSAgICAgICAgbUxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBtTG9jYXRpb25QYXRoRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgb25Mb2NhdGlvblBhdGhGaWVsZE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1Ccm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGxvY2F0aW9uX2dyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIG1Ccm93c2VCdXR0b24uc2V0VGV4dCgiQnJvd3NlLi4uIik7Ci0gICAgICAgIHNldEJ1dHRvbkxheW91dERhdGEobUJyb3dzZUJ1dHRvbik7Ci0gICAgICAgIG1Ccm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvbk9wZW5EaXJlY3RvcnlCcm93c2VyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1DcmVhdGVGcm9tU2FtcGxlUmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtQ3JlYXRlRnJvbVNhbXBsZVJhZGlvLnNldFRleHQoIkNyZWF0ZSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc2FtcGxlIik7Ci0gICAgICAgIG1DcmVhdGVGcm9tU2FtcGxlUmFkaW8uc2V0U2VsZWN0aW9uKElOSVRJQUxfQ1JFQVRFX0ZST01fU0FNUExFKTsKLSAgICAgICAgbUNyZWF0ZUZyb21TYW1wbGVSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsb2NhdGlvbl9saXN0ZW5lcik7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHNhbXBsZXNfZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNhbXBsZXNfZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIC8qIG51bSBjb2x1bW5zICovCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogY29sdW1ucyBvZiBub3QgZXF1YWwgc2l6ZSAqLykpOwotICAgICAgICBzYW1wbGVzX2dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBzYW1wbGVzX2dyb3VwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgbmV3IExhYmVsKHNhbXBsZXNfZ3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJTYW1wbGVzOiIpOwotCi0gICAgICAgIG1TYW1wbGVzQ29tYm8gPSBuZXcgQ29tYm8oc2FtcGxlc19ncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtU2FtcGxlc0NvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtU2FtcGxlc0NvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgbVNhbXBsZXNDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVNhbXBsZXNDb21iby5zZXRUb29sVGlwVGV4dCgiU2VsZWN0IGEgc2FtcGxlIik7Ci0KLSAgICAgICAgbVNhbXBsZXNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG9uU2FtcGxlU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB0YXJnZXQgZ3JvdXAuCi0gICAgICogSXQgb25seSBjb250YWlucyBhbiBTZGtUYXJnZXRTZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgLy8gTGF5b3V0IGhhcyAxIGNvbHVtbgotICAgICAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBncm91cC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBncm91cC5zZXRUZXh0KCJCdWlsZCBUYXJnZXQiKTsKLQotICAgICAgICAvLyBUaGUgc2VsZWN0b3IgaXMgY3JlYXRlZCB3aXRob3V0IHRhcmdldHMuIFRoZXkgYXJlIGFkZGVkIGJlbG93IGluIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCi0gICAgICAgIG1TZGtUYXJnZXRTZWxlY3RvciA9IG5ldyBTZGtUYXJnZXRTZWxlY3Rvcihncm91cCwgbnVsbCk7Ci0KLSAgICAgICAgbVNka1RhcmdldENoYW5nZUxpc3RlbmVyID0gbmV3IElUYXJnZXRDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvamVjdFRhcmdldENoYW5nZShJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRhcmdldHNMb2FkZWQoKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZGsgdGFyZ2V0IHNlbGVjdG9yIHdpdGggdGhlIG5ldyB0YXJnZXRzCi0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgc2RrCi0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoU2RrLmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldHMgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNka1RhcmdldFNlbGVjdG9yLnNldFRhcmdldHModGFyZ2V0cyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRhcmdldCwgc2VsZWN0IGl0Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldHMgIT0gbnVsbCAmJiB0YXJnZXRzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtUYXJnZXRTZWxlY3Rvci5zZXRTZWxlY3Rpb24odGFyZ2V0c1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkuYWRkVGFyZ2V0TGlzdGVuZXIobVNka1RhcmdldENoYW5nZUxpc3RlbmVyKTsKLQotICAgICAgICAvLyBJbnZva2UgaXQgb25jZSB0byBpbml0aWFsaXplIHRoZSB0YXJnZXRzCi0gICAgICAgIG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lci5vblRhcmdldHNMb2FkZWQoKTsKLQotICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvblNka1RhcmdldE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTG9jYXRpb25QYXRoRmllbGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZ3JvdXAgZm9yIHRoZSBwcm9qZWN0IHByb3BlcnRpZXM6Ci0gICAgICogLSBQYWNrYWdlIG5hbWUgW3RleHQgZmllbGRdCi0gICAgICogLSBBY3Rpdml0eSBuYW1lIFt0ZXh0IGZpZWxkXQotICAgICAqIC0gQXBwbGljYXRpb24gbmFtZSBbdGV4dCBmaWVsZF0KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gcGFja2FnZSBzcGVjaWZpY2F0aW9uIGdyb3VwCi0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBncm91cC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBncm91cC5zZXRUZXh0KCJQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgLy8gbmV3IGFwcGxpY2F0aW9uIGxhYmVsCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkFwcGxpY2F0aW9uIG5hbWU6Iik7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGxhYmVsLnNldFRvb2xUaXBUZXh0KCJOYW1lIG9mIHRoZSBBcHBsaWNhdGlvbi4gVGhpcyBpcyBhIGZyZWUgc3RyaW5nLiBJdCBjYW4gYmUgZW1wdHkuIik7Ci0KLSAgICAgICAgLy8gbmV3IGFwcGxpY2F0aW9uIG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgbUFwcGxpY2F0aW9uTmFtZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5zZXRUb29sVGlwVGV4dCgiTmFtZSBvZiB0aGUgQXBwbGljYXRpb24uIFRoaXMgaXMgYSBmcmVlIHN0cmluZy4gSXQgY2FuIGJlIGVtcHR5LiIpOwotICAgICAgICBtQXBwbGljYXRpb25OYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbUFwcGxpY2F0aW9uTmFtZUZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICBpZiAoIW1JbnRlcm5hbEFwcGxpY2F0aW9uTmFtZVVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbk5hbWVNb2RpZmllZEJ5VXNlciA9IHRydWU7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gbmV3IHBhY2thZ2UgbGFiZWwKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiUGFja2FnZSBuYW1lOiIpOwotICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCgiTmFtZXNwYWNlIG9mIHRoZSBQYWNrYWdlIHRvIGNyZWF0ZS4gVGhpcyBtdXN0IGJlIGEgSmF2YSBuYW1lc3BhY2Ugd2l0aCBhdCBsZWFzdCB0d28gY29tcG9uZW50cy4iKTsKLQotICAgICAgICAvLyBuZXcgcGFja2FnZSBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkLnNldFRvb2xUaXBUZXh0KCJOYW1lc3BhY2Ugb2YgdGhlIFBhY2thZ2UgdG8gY3JlYXRlLiBUaGlzIG11c3QgYmUgYSBKYXZhIG5hbWVzcGFjZSB3aXRoIGF0IGxlYXN0IHR3byBjb21wb25lbnRzLiIpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9uUGFja2FnZU5hbWVGaWVsZE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIG5ldyBhY3Rpdml0eSBsYWJlbAotICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG1DcmVhdGVBY3Rpdml0eUNoZWNrLnNldFRleHQoIkNyZWF0ZSBBY3Rpdml0eToiKTsKLSAgICAgICAgbUNyZWF0ZUFjdGl2aXR5Q2hlY2suc2V0VG9vbFRpcFRleHQoIlNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBkZWZhdWx0IEFjdGl2aXR5LiIpOwotICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjay5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjay5zZXRTZWxlY3Rpb24oSU5JVElBTF9DUkVBVEVfQUNUSVZJVFkpOwotICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9uQ3JlYXRlQWN0aXZpdHlDaGVja01vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTG9jYXRpb25XaWRnZXRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIG5ldyBhY3Rpdml0eSBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1BY3Rpdml0eU5hbWVGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBtQWN0aXZpdHlOYW1lRmllbGQuc2V0VG9vbFRpcFRleHQoIk5hbWUgb2YgdGhlIEFjdGl2aXR5IGNsYXNzIHRvIGNyZWF0ZS4gTXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4iKTsKLSAgICAgICAgbUFjdGl2aXR5TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG1BY3Rpdml0eU5hbWVGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBtQWN0aXZpdHlOYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBvbkFjdGl2aXR5TmFtZUZpZWxkTW9kaWZpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gbWluIHNkayB2ZXJzaW9uIGxhYmVsCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIk1pbiBTREsgVmVyc2lvbjoiKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIlRoZSBtaW5pbXVtIFNESyB2ZXJzaW9uIG51bWJlciB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcy4gTXVzdCBiZSBhbiBpbnRlZ2VyID4gMC4gSXQgY2FuIGJlIGVtcHR5LiIpOwotCi0gICAgICAgIC8vIG1pbiBzZGsgdmVyc2lvbiBlbnRyeSBmaWVsZAotICAgICAgICBtTWluU2RrVmVyc2lvbkZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxhYmVsLnNldFRvb2xUaXBUZXh0KCJUaGUgbWluaW11bSBTREsgdmVyc2lvbiBudW1iZXIgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMuIE11c3QgYmUgYW4gaW50ZWdlciA+IDAuIEl0IGNhbiBiZSBlbXB0eS4iKTsKLSAgICAgICAgbU1pblNka1ZlcnNpb25GaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtTWluU2RrVmVyc2lvbkZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBvbk1pblNka1ZlcnNpb25GaWVsZE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICAvLy0tLSBJbnRlcm5hbCBnZXR0ZXJzICYgc2V0dGVycyAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBwYXRoIGZpZWxkIHZhbHVlIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25QYXRoRmllbGRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblBhdGhGaWVsZCA9PSBudWxsID8gIiIgOiBtTG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBzYW1wbGUgcGF0aCwKLSAgICAgKiBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUncyBubyB2YWxpZCBzZWxlY3Rpb24uICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VsZWN0ZWRTYW1wbGVQYXRoKCkgewotICAgICAgICBpbnQgc2VsSW5kZXggPSBtU2FtcGxlc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxJbmRleCA+PSAwICYmIHNlbEluZGV4IDwgbVNhbXBsZXNQYXRocy5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2FtcGxlc1BhdGhzLmdldChzZWxJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb2plY3QgbG9jYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgVXNlIERlZmF1bHQgTG9jYXRpb24gY2hlY2sgYm94Ci0gICAgICogb3IgdGhlIENyZWF0ZSBGcm9tIFNhbXBsZSBjaGVjayBib3guICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdExvY2F0aW9uKCkgewotICAgICAgICBpZiAobUluZm8uaXNDcmVhdGVGcm9tU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RlZFNhbXBsZVBhdGgoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSW5mby5pc05ld1Byb2plY3QoKSAmJiBtSW5mby51c2VEZWZhdWx0TG9jYXRpb24oKSkgewotICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMb2NhdGlvblBhdGhGaWVsZFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJvamVjdCByZXNvdXJjZSBoYW5kbGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QgbmFtZSBmaWVsZAotICAgICAqIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSB0aGUgcHJvamVjdCByZXNvdXJjZTsgdGhpcyBpcyB0aGUKLSAgICAgKiByZXNwb25zaWJpbGl0eSBvZiA8Y29kZT5JUHJvamVjdDo6Y3JlYXRlPC9jb2RlPiBpbnZva2VkIGJ5IHRoZSBuZXcKLSAgICAgKiBwcm9qZWN0IHJlc291cmNlIHdpemFyZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcHJvamVjdCByZXNvdXJjZSBoYW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RIYW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobUluZm8uZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gLS0tIFVJIENhbGxiYWNrcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGEgZGlyZWN0b3J5IGJyb3dzZXIgYW5kIHVwZGF0ZSB0aGUgbG9jYXRpb24gcGF0aCBmaWVsZCB3aXRoIHRoZSBzZWxlY3RlZCBwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uT3BlbkRpcmVjdG9yeUJyb3dzZXIoKSB7Ci0KLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nX2RpciA9IGdldExvY2F0aW9uUGF0aEZpZWxkVmFsdWUoKTsKLQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBwYXRoIGlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgaWYgKGV4aXN0aW5nX2Rpci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBleGlzdGluZ19kaXIgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZXhpc3RpbmdfZGlyKTsKLSAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGV4aXN0aW5nX2RpciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKG1Mb2NhdGlvblBhdGhGaWVsZC5nZXRTaGVsbCgpKTsKLSAgICAgICAgZGQuc2V0TWVzc2FnZSgiQnJvd3NlIGZvciBmb2xkZXIiKTsKLSAgICAgICAgZGQuc2V0RmlsdGVyUGF0aChleGlzdGluZ19kaXIpOwotICAgICAgICBTdHJpbmcgYWJzX2RpciA9IGRkLm9wZW4oKTsKLQotICAgICAgICBpZiAoYWJzX2RpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVMb2NhdGlvblBhdGhGaWVsZChhYnNfZGlyKTsKLSAgICAgICAgICAgIGV4dHJhY3ROYW1lc0Zyb21BbmRyb2lkTWFuaWZlc3QoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHNhbXBsZSB3YXMgc2VsZWN0ZWQuIFVwZGF0ZSB0aGUgbG9jYXRpb24gZmllbGQsIG1hbmlmZXN0IGFuZCB2YWxpZGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TYW1wbGVTZWxlY3RlZCgpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IGdldFByb2plY3RMb2NhdGlvbigpIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byB1c2UgdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCBzYW1wbGUuIFdlIGp1c3QgbmVlZCB0byByZWZyZXNoIHRoZSBtYW5pZmVzdCBkYXRhICYgdmFsaWRhdGUuCi0gICAgICAgIGV4dHJhY3ROYW1lc0Zyb21BbmRyb2lkTWFuaWZlc3QoKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGUgdGhlIGxvY2F0aW9uIHdpZGdldHMgZGVwZW5kaW5nIG9uIHRoZSB1c2VyIHNlbGVjdGlvbjoKLSAgICAgKiB0aGUgbG9jYXRpb24gcGF0aCBpcyBlbmFibGVkIHdoZW4gdXNpbmcgdGhlICJleGlzdGluZyBzb3VyY2UiIG1vZGUgKGkuZS4gbm90IG5ldyBwcm9qZWN0KQotICAgICAqIG9yIGluIG5ldyBwcm9qZWN0IG1vZGUgd2l0aCB0aGUgInVzZSBkZWZhdWx0IGxvY2F0aW9uIiB0dXJuZWQgb2ZmLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmFibGVMb2NhdGlvbldpZGdldHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNfbmV3X3Byb2plY3QgPSBtSW5mby5pc05ld1Byb2plY3QoKTsKLSAgICAgICAgYm9vbGVhbiBpc19jcmVhdGVfZnJvbV9zYW1wbGUgPSBtSW5mby5pc0NyZWF0ZUZyb21TYW1wbGUoKTsKLSAgICAgICAgYm9vbGVhbiB1c2VfZGVmYXVsdCA9IG1JbmZvLnVzZURlZmF1bHRMb2NhdGlvbigpICYmICFpc19jcmVhdGVfZnJvbV9zYW1wbGU7Ci0gICAgICAgIGJvb2xlYW4gbG9jYXRpb25fZW5hYmxlZCA9ICghaXNfbmV3X3Byb2plY3QgfHwgIXVzZV9kZWZhdWx0KSAmJiAhaXNfY3JlYXRlX2Zyb21fc2FtcGxlOwotICAgICAgICBib29sZWFuIGNyZWF0ZV9hY3Rpdml0eSA9IG1JbmZvLmlzQ3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uLnNldEVuYWJsZWQoaXNfbmV3X3Byb2plY3QpOwotCi0gICAgICAgIG1Mb2NhdGlvbkxhYmVsLnNldEVuYWJsZWQobG9jYXRpb25fZW5hYmxlZCk7Ci0gICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRFbmFibGVkKGxvY2F0aW9uX2VuYWJsZWQpOwotICAgICAgICBtQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25fZW5hYmxlZCk7Ci0KLSAgICAgICAgbVNhbXBsZXNDb21iby5zZXRFbmFibGVkKGlzX2NyZWF0ZV9mcm9tX3NhbXBsZSAmJiBtU2FtcGxlc1BhdGhzLnNpemUoKSA+IDApOwotCi0gICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkLnNldEVuYWJsZWQoaXNfbmV3X3Byb2plY3QpOwotICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjay5zZXRFbmFibGVkKGlzX25ld19wcm9qZWN0KTsKLSAgICAgICAgbUFjdGl2aXR5TmFtZUZpZWxkLnNldEVuYWJsZWQoaXNfbmV3X3Byb2plY3QgJiBjcmVhdGVfYWN0aXZpdHkpOwotCi0gICAgICAgIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkKG51bGwpOwotICAgICAgICB1cGRhdGVQYWNrYWdlQW5kQWN0aXZpdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBsb2NhdGlvbiBkaXJlY3RvcnkgcGF0aCBmaWVsZC4KLSAgICAgKiA8YnIvPgotICAgICAqIFdoZW4gY3VzdG9tIHVzZXIgc2VsZWN0aW9uIGlzIGVuYWJsZWQsIHVzZSB0aGUgYWJzX2RpciBhcmd1bWVudCBpZiBub3QgbnVsbCBhbmQgYWxzbwotICAgICAqIHNhdmUgaXQgaW50ZXJuYWxseS4gSWYgYWJzX2RpciBpcyBudWxsLCByZXN0b3JlIHRoZSBsYXN0IHNhdmVkIGFic19kaXIuIFRoaXMgYWxsb3dzIHRoZQotICAgICAqIHVzZXIgc2VsZWN0aW9uIHRvIGJlIHJlbWVtYmVyZWQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBmcm9tIGRlZmF1bHQgdG8gY3VzdG9tLgotICAgICAqIDxici8+Ci0gICAgICogV2hlbiBjdXN0b20gdXNlciBzZWxlY3Rpb24gaXMgZGlzYWJsZWQsIHVzZSB0aGUgd29ya3NwYWNlIGRlZmF1bHQgbG9jYXRpb24gd2l0aCB0aGUKLSAgICAgKiBjdXJyZW50IHByb2plY3QgbmFtZS4gVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGludGVybmFsbHkgY2FjaGVkIGFic19kaXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWJzX2RpciBBIG5ldyBhYnNvbHV0ZSBkaXJlY3RvcnkgcGF0aCBvciBudWxsIHRvIHVzZSB0aGUgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTG9jYXRpb25QYXRoRmllbGQoU3RyaW5nIGFic19kaXIpIHsKLQotICAgICAgICAvLyBXZSBkb24ndCB0b3VjaCB0aGUgbG9jYXRpb24gcGF0aCBpZiB1c2luZyB0aGUgIkNyZWF0ZSBGcm9tIFNhbXBsZSIgbW9kZQotICAgICAgICBpZiAobUluZm8uaXNDcmVhdGVGcm9tU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNfbmV3X3Byb2plY3QgPSBtSW5mby5pc05ld1Byb2plY3QoKTsKLSAgICAgICAgYm9vbGVhbiB1c2VfZGVmYXVsdCA9IG1JbmZvLnVzZURlZmF1bHRMb2NhdGlvbigpOwotICAgICAgICBib29sZWFuIGN1c3RvbV9sb2NhdGlvbiA9ICFpc19uZXdfcHJvamVjdCB8fCAhdXNlX2RlZmF1bHQ7Ci0KLSAgICAgICAgaWYgKCFtSW50ZXJuYWxMb2NhdGlvblBhdGhVcGRhdGUpIHsKLSAgICAgICAgICAgIG1JbnRlcm5hbExvY2F0aW9uUGF0aFVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tX2xvY2F0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFic19kaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpcmVjdG9yeSB3aXRoIHRoZSAiQnJvd3NlIiBidXR0b24uCi0gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXV0by1jb21wdXRlIG9mIHRoZSBjdXN0b20gbG9jYXRpb24gdW5sZXNzIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGFjdCBzYW1lIHBhdGguCi0gICAgICAgICAgICAgICAgICAgIHNBdXRvQ29tcHV0ZUN1c3RvbUxvY2F0aW9uID0gc0F1dG9Db21wdXRlQ3VzdG9tTG9jYXRpb24gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNfZGlyLmVxdWFscyhzQ3VzdG9tTG9jYXRpb25Pc1BhdGgpOwotICAgICAgICAgICAgICAgICAgICBzQ3VzdG9tTG9jYXRpb25Pc1BhdGggPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MoYWJzX2Rpcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlICBpZiAoc0F1dG9Db21wdXRlQ3VzdG9tTG9jYXRpb24gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWlzX25ld19wcm9qZWN0ICYmICFuZXcgRmlsZShzQ3VzdG9tTG9jYXRpb25Pc1BhdGgpLmlzRGlyZWN0b3J5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQgc2VsZWN0IHRoZSBzYW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB0YXJnZXQKLSAgICAgICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbUluZm8uZ2V0U2RrVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0N1c3RvbUxvY2F0aW9uT3NQYXRoID0gdGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuU0FNUExFUyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdGFyZ2V0LCBzZWxlY3QgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyAidW5pdmVyc2FsIHNkayIuIElmIHdlIGRvbid0IGV2ZW4gaGF2ZSB0aGF0LCB1c2UgYSByb290IGRyaXZlLgotICAgICAgICAgICAgICAgICAgICBpZiAoc0N1c3RvbUxvY2F0aW9uT3NQYXRoID09IG51bGwgfHwgc0N1c3RvbUxvY2F0aW9uT3NQYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZGsuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ3VzdG9tTG9jYXRpb25Pc1BhdGggPSBTZGsuZ2V0Q3VycmVudCgpLmdldFNka0xvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDdXN0b21Mb2NhdGlvbk9zUGF0aCA9IEZpbGUubGlzdFJvb3RzKClbMF0uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpLmVxdWFscyhzQ3VzdG9tTG9jYXRpb25Pc1BhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KHNDdXN0b21Mb2NhdGlvbk9zUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmFwcGVuZChtSW5mby5nZXRQcm9qZWN0TmFtZSgpKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1Mb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbExvY2F0aW9uUGF0aFVwZGF0ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIHBhdGggZmllbGQgaXMgZWl0aGVyIG1vZGlmaWVkIGludGVybmFsbHkgKGZyb20gdXBkYXRlTG9jYXRpb25QYXRoRmllbGQpCi0gICAgICogb3IgbWFudWFsbHkgYnkgdGhlIHVzZXIgd2hlbiB0aGUgY3VzdG9tX2xvY2F0aW9uIG1vZGUgaXMgbm90IHNldC4KLSAgICAgKgotICAgICAqIElnbm9yZSB0aGUgaW50ZXJuYWwgbW9kaWZpY2F0aW9uLiBXaGVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCBtZW1vcml6ZSB0aGUgY2hvaWNlIGFuZAotICAgICAqIHZhbGlkYXRlIHRoZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkxvY2F0aW9uUGF0aEZpZWxkTW9kaWZpZWQoKSB7Ci0gICAgICAgIGlmICghbUludGVybmFsTG9jYXRpb25QYXRoVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSB1cGRhdGVzIGRvZXNuJ3QgY29tZSBmcm9tIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkLCBpdCBtdXN0IGJlIHRoZSB1c2VyCi0gICAgICAgICAgICAvLyBlZGl0aW5nIHRoZSBmaWVsZCBtYW51YWxseSwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIHNhdmUgdGhlIHZhbHVlIGludGVybmFsbHkKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBkaXNhYmxlIGF1dG8tY29tcHV0ZSBvZiB0aGUgY3VzdG9tIGxvY2F0aW9uICh0byBhdm9pZCBvdmVycmlkaW5nIHRoZSB1c2VyCi0gICAgICAgICAgICAvLyB2YWx1ZSkKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gZ2V0TG9jYXRpb25QYXRoRmllbGRWYWx1ZSgpOwotICAgICAgICAgICAgc0F1dG9Db21wdXRlQ3VzdG9tTG9jYXRpb24gPSBzQXV0b0NvbXB1dGVDdXN0b21Mb2NhdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoLmVxdWFscyhzQ3VzdG9tTG9jYXRpb25Pc1BhdGgpOwotICAgICAgICAgICAgc0N1c3RvbUxvY2F0aW9uT3NQYXRoID0gbmV3UGF0aDsKLSAgICAgICAgICAgIGV4dHJhY3ROYW1lc0Zyb21BbmRyb2lkTWFuaWZlc3QoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lIGZpZWxkIGlzIGVpdGhlciBtb2RpZmllZCBpbnRlcm5hbGx5IChmcm9tIGV4dHJhY3ROYW1lc0Zyb21BbmRyb2lkTWFuaWZlc3QpCi0gICAgICogb3IgbWFudWFsbHkgYnkgdGhlIHVzZXIgd2hlbiB0aGUgY3VzdG9tX2xvY2F0aW9uIG1vZGUgaXMgbm90IHNldC4KLSAgICAgKgotICAgICAqIElnbm9yZSB0aGUgaW50ZXJuYWwgbW9kaWZpY2F0aW9uLiBXaGVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCBtZW1vcml6ZSB0aGUgY2hvaWNlIGFuZAotICAgICAqIHZhbGlkYXRlIHRoZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblBhY2thZ2VOYW1lRmllbGRNb2RpZmllZCgpIHsKLSAgICAgICAgaWYgKG1JbmZvLmlzTmV3UHJvamVjdCgpKSB7Ci0gICAgICAgICAgICBtVXNlclBhY2thZ2VOYW1lID0gbUluZm8uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3JlYXRlIGFjdGl2aXR5IGNoZWNrYm94IGlzIGVpdGhlciBtb2RpZmllZCBpbnRlcm5hbGx5IChmcm9tCi0gICAgICogZXh0cmFjdE5hbWVzRnJvbUFuZHJvaWRNYW5pZmVzdCkgIG9yIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAqCi0gICAgICogSWdub3JlIHRoZSBpbnRlcm5hbCBtb2RpZmljYXRpb24uIFdoZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXIsIG1lbW9yaXplIHRoZSBjaG9pY2UgYW5kCi0gICAgICogdmFsaWRhdGUgdGhlIHBhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ3JlYXRlQWN0aXZpdHlDaGVja01vZGlmaWVkKCkgewotICAgICAgICBpZiAobUluZm8uaXNOZXdQcm9qZWN0KCkgJiYgIW1JbnRlcm5hbENyZWF0ZUFjdGl2aXR5VXBkYXRlKSB7Ci0gICAgICAgICAgICBtVXNlckNyZWF0ZUFjdGl2aXR5Q2hlY2sgPSBtSW5mby5pc0NyZWF0ZUFjdGl2aXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWN0aXZpdHkgbmFtZSBmaWVsZCBpcyBlaXRoZXIgbW9kaWZpZWQgaW50ZXJuYWxseSAoZnJvbSBleHRyYWN0TmFtZXNGcm9tQW5kcm9pZE1hbmlmZXN0KQotICAgICAqIG9yIG1hbnVhbGx5IGJ5IHRoZSB1c2VyIHdoZW4gdGhlIGN1c3RvbV9sb2NhdGlvbiBtb2RlIGlzIG5vdCBzZXQuCi0gICAgICoKLSAgICAgKiBJZ25vcmUgdGhlIGludGVybmFsIG1vZGlmaWNhdGlvbi4gV2hlbiBtb2RpZmllZCBieSB0aGUgdXNlciwgbWVtb3JpemUgdGhlIGNob2ljZSBhbmQKLSAgICAgKiB2YWxpZGF0ZSB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25BY3Rpdml0eU5hbWVGaWVsZE1vZGlmaWVkKCkgewotICAgICAgICBpZiAobUluZm8uaXNOZXdQcm9qZWN0KCkgJiYgIW1JbnRlcm5hbEFjdGl2aXR5TmFtZVVwZGF0ZSkgewotICAgICAgICAgICAgbVVzZXJBY3Rpdml0eU5hbWUgPSBtSW5mby5nZXRBY3Rpdml0eU5hbWUoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbWluIHNkayB2ZXJzaW9uIGZpZWxkIGhhcyBiZWVuIG1vZGlmaWVkLgotICAgICAqCi0gICAgICogSWdub3JlIHRoZSBpbnRlcm5hbCBtb2RpZmljYXRpb25zLiBXaGVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCB0cnkgdG8gbWF0Y2gKLSAgICAgKiBhIHRhcmdldCB3aXRoIHRoZSBzYW1lIEFQSSBsZXZlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25NaW5TZGtWZXJzaW9uRmllbGRNb2RpZmllZCgpIHsKLSAgICAgICAgaWYgKG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtaW5TZGtWZXJzaW9uID0gbUluZm8uZ2V0TWluU2RrVmVyc2lvbigpOwotCi0gICAgICAgIC8vIEJlZm9yZSBjaGFuZ2luZywgY29tcGFyZSB3aXRoIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lLCBpZiBhbnkuCi0gICAgICAgIC8vIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSB0YXJnZXRzIHdpdGggdGhlIHNhbWUgc2RrIGFwaSB2ZXJzaW9uLCBzbyBkb24ndCBjaGFuZ2UKLSAgICAgICAgLy8gaXQgaWYgaXQncyBhbHJlYWR5IGF0IHRoZSByaWdodCB2ZXJzaW9uLgotICAgICAgICBJQW5kcm9pZFRhcmdldCBjdXJyX3RhcmdldCA9IG1JbmZvLmdldFNka1RhcmdldCgpOwotICAgICAgICBpZiAoY3Vycl90YXJnZXQgIT0gbnVsbCAmJiBjdXJyX3RhcmdldC5nZXRWZXJzaW9uKCkuZXF1YWxzKG1pblNka1ZlcnNpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IG1TZGtUYXJnZXRTZWxlY3Rvci5nZXRUYXJnZXRzKCkpIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXQuZ2V0VmVyc2lvbigpLmVxdWFscyhtaW5TZGtWZXJzaW9uKSkgewotICAgICAgICAgICAgICAgIG1TZGtUYXJnZXRTZWxlY3Rvci5zZXRTZWxlY3Rpb24odGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFuIFNESyB0YXJnZXQgaXMgbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBBbHNvIGNoYW5nZXMgdGhlIG1pblNka1ZlcnNpb24gZmllbGQgdG8gcmVmbGVjdCB0aGUgc2RrIGFwaSBsZXZlbCB0aGF0IGhhcwotICAgICAqIGp1c3QgYmVlbiBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TZGtUYXJnZXRNb2RpZmllZCgpIHsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbUluZm8uZ2V0U2RrVGFyZ2V0KCk7Ci0KLSAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQuc2V0VGV4dCh0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRTYW1wbGVzRm9yVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIGVuYWJsZUxvY2F0aW9uV2lkZ2V0cygpOwotICAgICAgICBvblNhbXBsZVNlbGVjdGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHJhZGlvIGJ1dHRvbnMgYXJlIGNoYW5nZWQgYmV0d2VlbiB0aGUgImNyZWF0ZSBuZXcgcHJvamVjdCIgYW5kIHRoZQotICAgICAqICJ1c2UgZXhpc3Rpbmcgc291cmNlIiBtb2RlLiBUaGlzIHJldmVydHMgdGhlIGZpZWxkcyB0byB3aGF0ZXZlciB0aGUgdXNlciBtYW51YWxseQotICAgICAqIGVudGVyZWQgYmVmb3JlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlQW5kQWN0aXZpdHlGaWVsZHMoKSB7Ci0gICAgICAgIGlmIChtSW5mby5pc05ld1Byb2plY3QoKSkgewotICAgICAgICAgICAgaWYgKG1Vc2VyUGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtUGFja2FnZU5hbWVGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKG1Vc2VyUGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lRmllbGQuc2V0VGV4dChtVXNlclBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Vc2VyQWN0aXZpdHlOYW1lLmxlbmd0aCgpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbUFjdGl2aXR5TmFtZUZpZWxkLmdldFRleHQoKS5lcXVhbHMobVVzZXJBY3Rpdml0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQWN0aXZpdHlOYW1lRmllbGQuc2V0VGV4dChtVXNlckFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXNlckNyZWF0ZUFjdGl2aXR5Q2hlY2sgIT0gbUNyZWF0ZUFjdGl2aXR5Q2hlY2suZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxDcmVhdGVBY3Rpdml0eVVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNyZWF0ZUFjdGl2aXR5Q2hlY2suc2V0U2VsZWN0aW9uKG1Vc2VyQ3JlYXRlQWN0aXZpdHlDaGVjayk7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsQ3JlYXRlQWN0aXZpdHlVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgbmFtZXMgZnJvbSBhbiBhbmRyb2lkIG1hbmlmZXN0LgotICAgICAqIFRoaXMgaXMgZG9uZSBvbmx5IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSAidXNlIGV4aXN0aW5nIHNvdXJjZSIgYW5kIGEgbWFuaWZlc3QgeG1sIGZpbGUKLSAgICAgKiBjYW4gYWN0dWFsbHkgYmUgZm91bmQgaW4gdGhlIGN1c3RvbSB1c2VyIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdE5hbWVzRnJvbUFuZHJvaWRNYW5pZmVzdCgpIHsKLSAgICAgICAgaWYgKG1JbmZvLmlzTmV3UHJvamVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcHJvamVjdExvY2F0aW9uID0gZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHByb2plY3RMb2NhdGlvbik7Ci0gICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChmLmdldFBhdGgoKSk7Ci0gICAgICAgIFN0cmluZyBvc1BhdGggPSBwYXRoLmFwcGVuZChBbmRyb2lkQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1QpLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3REYXRhID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLnBhcnNlRm9yRGF0YShvc1BhdGgpOwotICAgICAgICBpZiAobWFuaWZlc3REYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0gICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBtaW5TZGtWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbWFuaWZlc3REYXRhLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgIG1pblNka1ZlcnNpb24gPSBtYW5pZmVzdERhdGEuZ2V0QXBpTGV2ZWxSZXF1aXJlbWVudCgpOwotCi0gICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSBmaXJzdCBsYXVuY2hlciBhY3Rpdml0eS4gSWYgbm9uZSwganVzdCB0YWtlIHRoZSBmaXJzdCBhY3Rpdml0eS4KLSAgICAgICAgICAgIGFjdGl2aXR5ID0gbWFuaWZlc3REYXRhLmdldExhdW5jaGVyQWN0aXZpdHkoKTsKLSAgICAgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlbXSBhY3Rpdml0aWVzID0gbWFuaWZlc3REYXRhLmdldEFjdGl2aXRpZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdGllcyAhPSBudWxsICYmIGFjdGl2aXRpZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSA9IGFjdGl2aXRpZXNbMF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlIGV4Y2VwdGlvbnMKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbVBhY2thZ2VOYW1lRmllbGQuc2V0VGV4dChwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLmV4dHJhY3RBY3Rpdml0eU5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aXZpdHlOYW1lICE9IG51bGwgJiYgYWN0aXZpdHlOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1JbnRlcm5hbENyZWF0ZUFjdGl2aXR5VXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BY3Rpdml0eU5hbWVGaWVsZC5zZXRUZXh0KGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICBtQ3JlYXRlQWN0aXZpdHlDaGVjay5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxDcmVhdGVBY3Rpdml0eVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIElmIHByb2plY3QgbmFtZSBhbmQgYXBwbGljYXRpb24gbmFtZXMgYXJlIGVtcHR5LCB1c2UgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICAvLyBuYW1lIGFzIGEgZGVmYXVsdC4gSWYgdGhlIGFjdGl2aXR5IG5hbWUgaGFzIGRvdHMsIGl0J3MgYSBwYXJ0IG9mIGEKLSAgICAgICAgICAgIC8vIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbiBhbmQgb25seSB0aGUgbGFzdCBpZGVudGlmaWVyIG11c3QgYmUgdXNlZC4KLSAgICAgICAgICAgIGlmIChhY3Rpdml0eU5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gaWRzID0gYWN0aXZpdHlOYW1lLnNwbGl0KEFuZHJvaWRDb25zdGFudHMuUkVfRE9UKTsKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUgPSBpZHNbaWRzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Qcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwIHx8ICFtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgIG1JbnRlcm5hbFByb2plY3ROYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldFRleHQoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxQcm9qZWN0TmFtZVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCB8fCAhbUFwcGxpY2F0aW9uTmFtZU1vZGlmaWVkQnlVc2VyKSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsQXBwbGljYXRpb25OYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25OYW1lTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25OYW1lRmllbGQuc2V0VGV4dChhY3Rpdml0eU5hbWUpOwotICAgICAgICAgICAgICAgIG1JbnRlcm5hbEFwcGxpY2F0aW9uTmFtZVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1JbnRlcm5hbENyZWF0ZUFjdGl2aXR5VXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BY3Rpdml0eU5hbWVGaWVsZC5zZXRUZXh0KCIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1DcmVhdGVBY3Rpdml0eUNoZWNrLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxDcmVhdGVBY3Rpdml0eVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgbUludGVybmFsQWN0aXZpdHlOYW1lVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGFjdGl2aXR5IG5hbWUgdG8gdXNlIHRvIGZpbGwgaW4gdGhlIHByb2plY3QgYW5kIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAvLyBuYW1lLiBIb3dldmVyIGlmIHRoZXJlJ3MgYSBwYWNrYWdlIG5hbWUsIHdlIGNhbiB1c2UgdGhpcyBhcyBhIGJhc2UuCi0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQYWNrYWdlIG5hbWUgaXMgYSBqYXZhIGlkZW50aWZpZXIsIHNvIGl0J3MgbW9zdCBzdWl0YWJsZSBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBhcHBsaWNhdGlvbiBuYW1lLgotCi0gICAgICAgICAgICAgICAgaWYgKG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIW1BcHBsaWNhdGlvbk5hbWVNb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxBcHBsaWNhdGlvbk5hbWVVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25OYW1lRmllbGQuc2V0VGV4dChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbEFwcGxpY2F0aW9uTmFtZVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEZvciB0aGUgcHJvamVjdCBuYW1lLCByZW1vdmUgYW55IGRvdHMKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnXycpOwotICAgICAgICAgICAgICAgIGlmIChtUHJvamVjdE5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCB8fCAhbVByb2plY3ROYW1lTW9kaWZpZWRCeVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsUHJvamVjdE5hbWVVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtUHJvamVjdE5hbWVGaWVsZC5zZXRUZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsUHJvamVjdE5hbWVVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbGVjdCB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBtYW5pZmVzdCdzIHNkayBvciBidWlsZCBwcm9wZXJ0aWVzLCBpZiBhbnkKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgZm91bmRUYXJnZXQgPSBudWxsOwotICAgICAgICBJQW5kcm9pZFRhcmdldCBjdXJyZW50VGFyZ2V0ID0gbUluZm8uZ2V0U2RrVGFyZ2V0KCk7Ci0KLSAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcCA9IFByb2plY3RQcm9wZXJ0aWVzLmNyZWF0ZShwcm9qZWN0TG9jYXRpb24sIG51bGwpOwotICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayB0aGUge2J1aWxkfGRlZmF1bHR9LnByb3BlcnRpZXMgZmlsZXMgaWYgcHJlc2VudAotICAgICAgICAgICAgcC5tZXJnZShQcm9wZXJ0eVR5cGUuQlVJTEQpLm1lcmdlKFByb3BlcnR5VHlwZS5ERUZBVUxUKTsKLSAgICAgICAgICAgIFN0cmluZyB2ID0gcC5nZXRQcm9wZXJ0eShQcm9qZWN0UHJvcGVydGllcy5QUk9QRVJUWV9UQVJHRVQpOwotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXRGcm9tSGFzaFN0cmluZyh2KTsKLSAgICAgICAgICAgIC8vIFdlIGNhbiBjaGFuZ2UgdGhlIGN1cnJlbnQgdGFyZ2V0IGlmOgotICAgICAgICAgICAgLy8gLSB3ZSBmb3VuZCBhIG5ldyB0YXJnZXQKLSAgICAgICAgICAgIC8vIC0gdGhlcmUgaXMgbm8gY3VycmVudCB0YXJnZXQKLSAgICAgICAgICAgIC8vIC0gdGhlcmUgaXMgYSBjdXJyZW50IHRhcmdldCBidXQgdGhlIG5ldyB0YXJnZXQgaXMgbm90IDw9IHRvIHRoZSBjdXJyZW50IG9uZS4KLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAoY3VycmVudFRhcmdldCA9PSBudWxsIHx8ICF0YXJnZXQuaXNDb21wYXRpYmxlQmFzZUZvcihjdXJyZW50VGFyZ2V0KSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3VuZFRhcmdldCA9PSBudWxsICYmIG1pblNka1ZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyeSB0byBtYXRjaCB0aGUgcmVxdWVzdGVkIHNkayB2ZXJzaW9uCi0gICAgICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IG1TZGtUYXJnZXRTZWxlY3Rvci5nZXRUYXJnZXRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRWZXJzaW9uKCkuZXF1YWxzKG1pblNka1ZlcnNpb24pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFRhcmdldCA9PSBudWxsIHx8ICF0YXJnZXQuaXNDb21wYXRpYmxlQmFzZUZvcihjdXJyZW50VGFyZ2V0KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3VuZFRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPciBsYXN0IGF0dGVtcCwgdHJ5IHRvIG1hdGNoIGEgc2FtcGxlIHByb2plY3QgbG9jYXRpb24KLSAgICAgICAgICAgIGZvciAoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0IDogbVNka1RhcmdldFNlbGVjdG9yLmdldFRhcmdldHMoKSkgewotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdExvY2F0aW9uLnN0YXJ0c1dpdGgodGFyZ2V0LmdldExvY2F0aW9uKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFRhcmdldCA9PSBudWxsIHx8ICF0YXJnZXQuaXNDb21wYXRpYmxlQmFzZUZvcihjdXJyZW50VGFyZ2V0KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3VuZFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uKGZvdW5kVGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1pblNka1ZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQuc2V0VGV4dChtaW5TZGtWZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGxpc3Qgb2YgYWxsIHNhbXBsZXMgZm9yIHRoZSBnaXZlbiB0YXJnZXQgU0RLLgotICAgICAqIFRoZSBsaXN0IGlzIHN0b3JlZCBpbiBtU2FtcGxlc1BhdGhzIGFzIGFic29sdXRlIGRpcmVjdG9yeSBwYXRocy4KLSAgICAgKiBUaGUgY29tYm8gaXMgcmVjcmVhdGVkIHRvIG1hdGNoIHRoaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRTYW1wbGVzRm9yVGFyZ2V0KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotCi0gICAgICAgIC8vIEtlZXAgdGhlIG5hbWUgb2YgdGhlIG9sZCBzZWxlY3Rpb24gKGlmIHRoZXJlIHdlcmUgYW55IHNhbXBsZXMpCi0gICAgICAgIFN0cmluZyBvbGRDaG9pY2UgPSBudWxsOwotICAgICAgICBpZiAobVNhbXBsZXNQYXRocy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgc2VsSW5kZXggPSBtU2FtcGxlc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoc2VsSW5kZXggPiAtMSkgewotICAgICAgICAgICAgICAgIG9sZENob2ljZSA9IG1TYW1wbGVzQ29tYm8uZ2V0SXRlbShzZWxJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGVhciBhbGwgY3VycmVudCBjb250ZW50Ci0gICAgICAgIG1TYW1wbGVzQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1TYW1wbGVzUGF0aHMuY2xlYXIoKTsKLQotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgc2FtcGxlIHJvb3QgcGF0aCBhbmQgcmVjb21wdXRlIHRoZSBsaXN0IG9mIHNhbXBsZXMKLSAgICAgICAgICAgIFN0cmluZyBzYW1wbGVzUm9vdFBhdGggPSB0YXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5TQU1QTEVTKTsKLQotICAgICAgICAgICAgRmlsZSBzYW1wbGVzRGlyID0gbmV3IEZpbGUoc2FtcGxlc1Jvb3RQYXRoKTsKLSAgICAgICAgICAgIGZpbmRTYW1wbGVzTWFuaWZlc3RzKHNhbXBsZXNEaXIsIG1TYW1wbGVzUGF0aHMpOwotCi0gICAgICAgICAgICBpZiAobVNhbXBsZXNQYXRocy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIE9kZCwgdGhpcyB0YXJnZXQgaGFzIG5vIHNhbXBsZXMuIENvdWxkIGhhcHBlbiB3aXRoIGFuIGFkZG9uLgotICAgICAgICAgICAgICAgIG1TYW1wbGVzQ29tYm8uYWRkKCJUaGlzIHRhcmdldCBoYXMgbm8gc2FtcGxlcy4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIHRhcmdldC4iKTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlc0NvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlY29tcHV0ZSB0aGUgZGVzY3JpcHRpb24gb2YgZWFjaCBzYW1wbGUgKHRoZSByZWxhdGl2ZSBwYXRoCi0gICAgICAgICAgICAvLyB0byB0aGUgc2FtcGxlIHJvb3QpLiBBbHNvIHRyeSB0byBmaW5kIHRoZSBvbGQgc2VsZWN0aW9uLgotICAgICAgICAgICAgaW50IHNlbEluZGV4ID0gMDsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGludCBuID0gc2FtcGxlc1Jvb3RQYXRoLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IG1TYW1wbGVzUGF0aHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IG4pIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKG4pOwotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5jaGFyQXQoMCkgPT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoUGF0dGVybi5xdW90ZShGaWxlLnNlcGFyYXRvciksICIgPiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob2xkQ2hvaWNlICE9IG51bGwgJiYgb2xkQ2hvaWNlLmVxdWFscyhwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBzZWxJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNhbXBsZXNDb21iby5hZGQocGF0aCk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU2FtcGxlc0NvbWJvLnNlbGVjdChzZWxJbmRleCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TYW1wbGVzQ29tYm8uYWRkKCJQbGVhc2Ugc2VsZWN0IGEgdGFyZ2V0LiIpOwotICAgICAgICAgICAgbVNhbXBsZXNDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSBmaW5kIHBvdGVudGlhbCBzYW1wbGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIGdpdmVuIGRpcmVjdG9yeS4KLSAgICAgKiBBY3R1YWxseSBsaXN0cyBhbnkgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYW4gYW5kcm9pZCBtYW5pZmVzdC4KLSAgICAgKiBQYXRocyBmb3VuZCBhcmUgYWRkZWQgdGhlIHNhbXBsZXNQYXRocyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5kU2FtcGxlc01hbmlmZXN0cyhGaWxlIHNhbXBsZXNEaXIsIEFycmF5TGlzdDxTdHJpbmc+IHNhbXBsZXNQYXRocykgewotICAgICAgICBpZiAoIXNhbXBsZXNEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChGaWxlIGYgOiBzYW1wbGVzRGlyLmxpc3RGaWxlcygpKSB7Ci0gICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoaXMgaXMgYSBzYW1wbGUgaWYgaXQgY29udGFpbnMgYW4gYW5kcm9pZCBtYW5pZmVzdC4KLSAgICAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGYsIFNka0NvbnN0YW50cy5GTl9BTkRST0lEX01BTklGRVNUX1hNTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGF0aHMuYWRkKGYuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWN1cnNlIGluIHRoZSBwcm9qZWN0LCB0byBmaW5kIGVtYmVkZGVkIHRlc3RzIHN1Yi1wcm9qZWN0cwotICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBob3dldmVyIHNraXAgdGhpcyByZWN1cnNpb24gZm9yIGtub3duIGFuZHJvaWQgc3ViLWRpcnMgdGhhdAotICAgICAgICAgICAgICAgIC8vIGNhbid0IGhhdmUgcHJvamVjdHMsIG5hbWVseSBmb3Igc291cmNlcywgYXNzZXRzIGFuZCByZXNvdXJjZXMuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxlYWYgPSBmLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIVNka0NvbnN0YW50cy5GRF9TT1VSQ0VTLmVxdWFscyhsZWFmKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVNka0NvbnN0YW50cy5GRF9BU1NFVFMuZXF1YWxzKGxlYWYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhU2RrQ29uc3RhbnRzLkZEX1JFUy5lcXVhbHMobGVhZikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZFNhbXBsZXNNYW5pZmVzdHMoZiwgc2FtcGxlc1BhdGhzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWdlJ3MgY29udHJvbHMgY3VycmVudGx5IGFsbCBjb250YWluIHZhbGlkIHZhbHVlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIGNvbnRyb2xzIGFyZSB2YWxpZCwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotICAgICAgICBpbnQgc3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0RmllbGQod29ya3NwYWNlKTsKLSAgICAgICAgaWYgKChzdGF0dXMgJiBNU0dfRVJST1IpID09IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyB8PSB2YWxpZGF0ZVNka1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhdHVzICYgTVNHX0VSUk9SKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgfD0gdmFsaWRhdGVMb2NhdGlvblBhdGgod29ya3NwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXR1cyAmIE1TR19FUlJPUikgPT0gMCkgewotICAgICAgICAgICAgc3RhdHVzIHw9IHZhbGlkYXRlUGFja2FnZUZpZWxkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzdGF0dXMgJiBNU0dfRVJST1IpID09IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyB8PSB2YWxpZGF0ZUFjdGl2aXR5RmllbGQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXR1cyAmIE1TR19FUlJPUikgPT0gMCkgewotICAgICAgICAgICAgc3RhdHVzIHw9IHZhbGlkYXRlTWluU2RrVmVyc2lvbkZpZWxkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzdGF0dXMgJiBNU0dfRVJST1IpID09IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyB8PSB2YWxpZGF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTVNHX05PTkUpICB7Ci0gICAgICAgICAgICBzZXRTdGF0dXMobnVsbCwgTVNHX05PTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZXJlJ3MgYW4gZXJyb3Igc28gdGhhdCB0aGUgZmluaXNoIGJ1dHRvbiBiZSBkaXNhYmxlZC4KLSAgICAgICAgcmV0dXJuIChzdGF0dXMgJiBNU0dfRVJST1IpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBwYWdlIGFuZCB1cGRhdGVzIHRoZSBOZXh0L0ZpbmlzaCBidXR0b25zCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCkgewotICAgICAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgcHJvamVjdCBuYW1lIGZpZWxkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgd2l6YXJkIG1lc3NhZ2UgdHlwZSwgb25lIG9mIE1TR19FUlJPUiwgTVNHX1dBUk5JTkcgb3IgTVNHX05PTkUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGVQcm9qZWN0RmllbGQoSVdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLSAgICAgICAgLy8gVmFsaWRhdGUgcHJvamVjdCBmaWVsZAotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtSW5mby5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICBpZiAocHJvamVjdE5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiUHJvamVjdCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExpbWl0IHRoZSBwcm9qZWN0IG5hbWUgdG8gc2hlbGwtYWdub3N0aWMgY2hhcmFjdGVycyBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgdG8KLSAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGZpbmFsIHBhY2thZ2UKLSAgICAgICAgaWYgKCFzUHJvamVjdE5hbWVQYXR0ZXJuLm1hdGNoZXIocHJvamVjdE5hbWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiVGhlIHByb2plY3QgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGFscGhhbnVtZXJpY3MsIGRpZ2l0cywgZG90cywgZGFzaGVzLCB1bmRlcnNjb3JlcyBvciBzcGFjZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgbmFtZVN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocHJvamVjdE5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLSAgICAgICAgaWYgKCFuYW1lU3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cyhuYW1lU3RhdHVzLmdldE1lc3NhZ2UoKSwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRQcm9qZWN0SGFuZGxlKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIkEgcHJvamVjdCB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGVzdEluZm8gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIG1UZXN0SW5mby5nZXRDcmVhdGVUZXN0UHJvamVjdCgpICYmCi0gICAgICAgICAgICAgICAgcHJvamVjdE5hbWUuZXF1YWxzKG1UZXN0SW5mby5nZXRQcm9qZWN0TmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiVGhlIG1haW4gcHJvamVjdCBuYW1lIGFuZCB0aGUgdGVzdCBwcm9qZWN0IG5hbWUgbXVzdCBiZSBkaWZmZXJlbnQuIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX1dBUk5JTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE1TR19OT05FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgbG9jYXRpb24gcGF0aCBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlTG9jYXRpb25QYXRoKElXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7Ci0gICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3RMb2NhdGlvbigpKTsKLSAgICAgICAgaWYgKG1JbmZvLmlzTmV3UHJvamVjdCgpKSB7Ci0gICAgICAgICAgICBpZiAoIW1JbmZvLnVzZURlZmF1bHRMb2NhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgbm90IHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIHZhbGlkYXRlIHRoZSBsb2NhdGlvbi4KLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gVVJJVXRpbC50b1VSSShwYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgSVN0YXR1cyBsb2NhdGlvblN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZVByb2plY3RMb2NhdGlvblVSSShnZXRQcm9qZWN0SGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmkpOwotICAgICAgICAgICAgICAgIGlmICghbG9jYXRpb25TdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMobG9jYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpLCBNU0dfRVJST1IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhdGlvbiBpcyB2YWxpZCBhcyBmYXIgYXMgRWNsaXBzZSBpcyBjb25jZXJuZWQgKGkuZS4gbW9zdGx5IG5vdAotICAgICAgICAgICAgICAgICAgICAvLyBhbiBleGlzdGluZyB3b3Jrc3BhY2UgcHJvamVjdC4pIENoZWNrIGl0IGVpdGhlciBkb2Vzbid0IGV4aXN0IG9yIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIGEgZGlyZWN0b3J5IHRoYXQgaXMgZW1wdHkuCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpICYmICFmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIkEgZGlyZWN0b3J5IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMsIHdlIHNob3VsZCBwdXQgYSB3YXJuaW5nIGlmIGl0IGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkuIFdlIGRvbid0IHB1dCBhbiBlcnJvciAod2UnbGwgYXNrIHRoZSB1c2VyIGFnYWluIGZvciBjb25maXJtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB1c2luZyB0aGUgZGlyZWN0b3J5LikKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGwgPSBmLmxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiVGhlIHNlbGVjdGVkIG91dHB1dCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfV0FSTklORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB2YWxpZGF0ZSB0aGUgcGF0aCBzdHJpbmcgaXMgbm90IGVtcHR5Ci0gICAgICAgICAgICAgICAgaWYgKGdldFByb2plY3RMb2NhdGlvbigpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiQSBkaXJlY3RvcnkgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4iLCBNU0dfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IHBhdGguYXBwZW5kKG1JbmZvLmdldFByb2plY3ROYW1lKCkpLnRvRmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChkZXN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoU3RyaW5nLmZvcm1hdCgiVGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVkIFwiJTEkc1wiIGluIHRoZSBzZWxlY3RlZCBsb2NhdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbmZvLmdldFByb2plY3ROYW1lKCkpLCBNU0dfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5Ci0gICAgICAgICAgICBGaWxlIGYgPSBwYXRoLnRvRmlsZSgpOwotICAgICAgICAgICAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJBbiBleGlzdGluZyBkaXJlY3RvcnkgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4iLCBNU0dfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayB0aGVyZSdzIGFuIGFuZHJvaWQgbWFuaWZlc3QgaW4gdGhlIGRpcmVjdG9yeQotICAgICAgICAgICAgU3RyaW5nIG9zUGF0aCA9IHBhdGguYXBwZW5kKEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCkudG9PU1N0cmluZygpOwotICAgICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBuZXcgRmlsZShvc1BhdGgpOwotICAgICAgICAgICAgaWYgKCFtYW5pZmVzdEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmlsZSAlMSRzIG5vdCBmb3VuZCBpbiAlMiRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVCwgZi5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQYXJzZSBpdCBhbmQgY2hlY2sgdGhlIGltcG9ydGFudCBmaWVsZHMuCi0gICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbWFuaWZlc3REYXRhID0gQW5kcm9pZE1hbmlmZXN0UGFyc2VyLnBhcnNlRm9yRGF0YShvc1BhdGgpOwotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZpbGUgJTEkcyBjb3VsZCBub3QgYmUgcGFyc2VkLiIsIG9zUGF0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtYW5pZmVzdERhdGEuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJObyBwYWNrYWdlIG5hbWUgZGVmaW5lZCBpbiAlMSRzLiIsIG9zUGF0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBtYW5pZmVzdERhdGEuZ2V0QWN0aXZpdGllcygpOwotICAgICAgICAgICAgaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCB8fCBhY3Rpdml0aWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhY2NlcHRhYmxlIG5vdyBhcyBsb25nIGFzIG5vIGFjdGl2aXR5IG5lZWRzIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICBpZiAobUluZm8uaXNDcmVhdGVBY3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTm8gYWN0aXZpdHkgbmFtZSBkZWZpbmVkIGluICUxJHMuIiwgb3NQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgLnByb2plY3QsIHRlbGwgdGhlIHVzZXIgdG8gdXNlIGltcG9ydCBpbnN0ZWFkLgotICAgICAgICAgICAgaWYgKHBhdGguYXBwZW5kKCIucHJvamVjdCIpLnRvRmlsZSgpLmV4aXN0cygpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiQW4gRWNsaXBzZSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIGluIHRoaXMgZGlyZWN0b3J5LiBDb25zaWRlciB1c2luZyBGaWxlID4gSW1wb3J0ID4gRXhpc3RpbmcgUHJvamVjdCBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfV0FSTklORyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTVNHX05PTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBzZGsgdGFyZ2V0IGNob2ljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlU2RrVGFyZ2V0KCkgewotICAgICAgICBpZiAobUluZm8uZ2V0U2RrVGFyZ2V0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiQW4gU0RLIFRhcmdldCBtdXN0IGJlIHNwZWNpZmllZC4iLCBNU0dfRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHNkayB0YXJnZXQgY2hvaWNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgd2l6YXJkIG1lc3NhZ2UgdHlwZSwgb25lIG9mIE1TR19FUlJPUiwgTVNHX1dBUk5JTkcgb3IgTVNHX05PTkUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGVNaW5TZGtWZXJzaW9uRmllbGQoKSB7Ci0KLSAgICAgICAgLy8gSWYgdGhlIG1pbiBzZGsgdmVyc2lvbiBpcyBlbXB0eSwgaXQgaXMgYWx3YXlzIGFjY2VwdGVkLgotICAgICAgICBpZiAobUluZm8uZ2V0TWluU2RrVmVyc2lvbigpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5mby5nZXRTZGtUYXJnZXQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgbUluZm8uZ2V0U2RrVGFyZ2V0KCkuZ2V0VmVyc2lvbigpLmVxdWFscyhtSW5mby5nZXRNaW5TZGtWZXJzaW9uKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJUaGUgQVBJIGxldmVsIGZvciB0aGUgc2VsZWN0ZWQgU0RLIHRhcmdldCBkb2VzIG5vdCBtYXRjaCB0aGUgTWluIFNESyB2ZXJzaW9uLiIsCi0gICAgICAgICAgICAgICAgICAgIG1JbmZvLmdldFNka1RhcmdldCgpLmdldFZlcnNpb24oKS5pc1ByZXZpZXcoKSA/IE1TR19FUlJPUiA6IE1TR19XQVJOSU5HKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGFjdGl2aXR5IG5hbWUgZmllbGQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB3aXphcmQgbWVzc2FnZSB0eXBlLCBvbmUgb2YgTVNHX0VSUk9SLCBNU0dfV0FSTklORyBvciBNU0dfTk9ORS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZUFjdGl2aXR5RmllbGQoKSB7Ci0gICAgICAgIC8vIERpc3JlZ2FyZCBpZiBub3QgY3JlYXRpbmcgYW4gYWN0aXZpdHkKLSAgICAgICAgaWYgKCFtSW5mby5pc0NyZWF0ZUFjdGl2aXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFZhbGlkYXRlIGFjdGl2aXR5IGZpZWxkCi0gICAgICAgIFN0cmluZyBhY3Rpdml0eUZpZWxkQ29udGVudHMgPSBtSW5mby5nZXRBY3Rpdml0eU5hbWUoKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5RmllbGRDb250ZW50cy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJBY3Rpdml0eSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIsIE1TR19FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgYWN0aXZpdHkgZmllbGQgY2FuIGFjdHVhbGx5IGNvbnRhaW4gcGFydCBvZiBhIHN1Yi1wYWNrYWdlIG5hbWUKLSAgICAgICAgLy8gb3IgaXQgY2FuIHN0YXJ0IHdpdGggYSBkb3QgIi4iIHRvIGluZGljYXRlcyBpdCBjb21lcyBmcm9tIHRoZSBwYXJlbnQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHBvcyA9IGFjdGl2aXR5RmllbGRDb250ZW50cy5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gYWN0aXZpdHlGaWVsZENvbnRlbnRzLnN1YnN0cmluZygwLCBwb3MpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFjdGl2aXR5RmllbGRDb250ZW50cyA9IGFjdGl2aXR5RmllbGRDb250ZW50cy5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgYWN0aXZpdHkgZmllbGQgY2FuIGNvbnRhaW4gYSBzaW1wbGUgamF2YSBpZGVudGlmaWVyLCBvciBhCi0gICAgICAgIC8vIHBhY2thZ2UgbmFtZSBvciBvbmUgdGhhdCBzdGFydHMgd2l0aCBhIGRvdC4gU28gaWYgaXQgc3RhcnRzIHdpdGggYSBkb3QsCi0gICAgICAgIC8vIGlnbm9yZSB0aGlzIGRvdCAtLSB0aGUgcmVzdCBtdXN0IGxvb2sgbGlrZSBhIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgaWYgKGFjdGl2aXR5RmllbGRDb250ZW50cy5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0gICAgICAgICAgICBhY3Rpdml0eUZpZWxkQ29udGVudHMgPSBhY3Rpdml0eUZpZWxkQ29udGVudHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaXQncyBhIHZhbGlkIGFjdGl2aXR5IHN0cmluZwotICAgICAgICBpbnQgcmVzdWx0ID0gTVNHX05PTkU7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlVHlwZVZhcmlhYmxlTmFtZShhY3Rpdml0eUZpZWxkQ29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMS41IiwgIjEuNSIpOyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0gICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gc2V0U3RhdHVzKHN0YXR1cy5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SID8gTVNHX0VSUk9SIDogTVNHX1dBUk5JTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaXQncyBhIHZhbGlkIHBhY2thZ2Ugc3RyaW5nCi0gICAgICAgIGlmIChyZXN1bHQgIT0gTVNHX0VSUk9SICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMS41IiwgIjEuNSIpOyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0gICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXRTdGF0dXMoc3RhdHVzLmdldE1lc3NhZ2UoKSArICIgKGluIHRoZSBhY3Rpdml0eSBuYW1lKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiA/IE1TR19FUlJPUiA6IE1TR19XQVJOSU5HKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHBhY2thZ2UgbmFtZSBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlUGFja2FnZUZpZWxkKCkgewotICAgICAgICAvLyBWYWxpZGF0ZSBwYWNrYWdlIGZpZWxkCi0gICAgICAgIFN0cmluZyBwYWNrYWdlRmllbGRDb250ZW50cyA9IG1JbmZvLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIGlmIChwYWNrYWdlRmllbGRDb250ZW50cy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJQYWNrYWdlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGl0J3MgYSB2YWxpZCBwYWNrYWdlIHN0cmluZwotICAgICAgICBpbnQgcmVzdWx0ID0gTVNHX05PTkU7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGFja2FnZUZpZWxkQ29udGVudHMsICIxLjUiLCAiMS41Iik7IC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzZXRTdGF0dXMoc3RhdHVzLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgPyBNU0dfRVJST1IgOiBNU0dfV0FSTklORyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgQW5kcm9pZCBBY3Rpdml0eSBNYW5hZ2VyIGRvZXMgbm90IGFjY2VwdCBwYWNrYWdlcyBuYW1lcyB3aXRoIG9ubHkgb25lCi0gICAgICAgIC8vIGlkZW50aWZpZXIuIENoZWNrIHRoZSBwYWNrYWdlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBkb3QgaW4gdGhlbSAodGhlIHByZXZpb3VzIHJ1bGUKLSAgICAgICAgLy8gdmFsaWRhdGVkIHRoYXQgaWYgc3VjaCBhIGRvdCBleGlzdCwgaXQncyBub3QgdGhlIGZpcnN0IG5vciBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlCi0gICAgICAgIC8vIHN0cmluZy4pCi0gICAgICAgIGlmIChyZXN1bHQgIT0gTVNHX0VSUk9SICYmIHBhY2thZ2VGaWVsZENvbnRlbnRzLmluZGV4T2YoJy4nKSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiUGFja2FnZSBuYW1lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gaWRlbnRpZmllcnMuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoYXQgYW4gZXhpc3RpbmcgcHJvamVjdCBhY3R1YWxseSBoYXMgYSBzb3VyY2UgZm9sZGVyLgotICAgICAqCi0gICAgICogRm9yIHByb2plY3QgaW4gInVzZSBleGlzdGluZyBzb3VyY2UiIG1vZGUsIHRoaXMgdHJpZXMgdG8gZmluZCB0aGUgc291cmNlIGZvbGRlci4KLSAgICAgKiBBIHNvdXJjZSBmb2xkZXIgc2hvdWxkIGJlIGp1c3QgdW5kZXIgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCBpdCBzaG91bGQgaGF2ZSBhbGwKLSAgICAgKiB0aGUgZGlyZWN0b3JpZXMgY29tcG9zaW5nIHRoZSBwYWNrYWdlK2FjdGl2aXR5IG5hbWUuCi0gICAgICoKLSAgICAgKiBBcyBhIHNpZGUgZWZmZWN0LCBpdCBtZW1vcml6ZXMgdGhlIHNvdXJjZSBmb2xkZXIgaW4gbVNvdXJjZUZvbGRlci4KLSAgICAgKgotICAgICAqIFRPRE86IHN1cHBvcnQgbXVsdGlwbGUgc291cmNlIGZvbGRlcnMgZm9yIG11bHRpcGxlIGFjdGl2aXRpZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB3aXphcmQgbWVzc2FnZSB0eXBlLCBvbmUgb2YgTVNHX0VSUk9SLCBNU0dfV0FSTklORyBvciBNU0dfTk9ORS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZVNvdXJjZUZvbGRlcigpIHsKLSAgICAgICAgLy8gVGhpcyBjaGVjayBkb2VzIG5vdGhpbmcgd2hlbiBjcmVhdGluZyBhIG5ldyBwcm9qZWN0LgotICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIGFsc28gdXNlbGVzcyB3aGVuIG5vIGFjdGl2aXR5IGlzIHByZXNlbnQgb3IgY3JlYXRlZC4KLSAgICAgICAgaWYgKG1JbmZvLmlzTmV3UHJvamVjdCgpIHx8ICFtSW5mby5pc0NyZWF0ZUFjdGl2aXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBvc1RhcmdldCA9IG1JbmZvLmdldEFjdGl2aXR5TmFtZSgpOwotCi0gICAgICAgIGlmIChvc1RhcmdldC5pbmRleE9mKCcuJykgPT0gLTEpIHsKLSAgICAgICAgICAgIG9zVGFyZ2V0ID0gbUluZm8uZ2V0UGFja2FnZU5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgb3NUYXJnZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAob3NUYXJnZXQuaW5kZXhPZignLicpID09IDApIHsKLSAgICAgICAgICAgIG9zVGFyZ2V0ID0gbUluZm8uZ2V0UGFja2FnZU5hbWUoKSArIG9zVGFyZ2V0OwotICAgICAgICB9Ci0gICAgICAgIG9zVGFyZ2V0ID0gb3NUYXJnZXQucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyBBbmRyb2lkQ29uc3RhbnRzLkRPVF9KQVZBOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0UGF0aCA9IGdldFByb2plY3RMb2NhdGlvbigpOwotICAgICAgICBGaWxlIHByb2plY3REaXIgPSBuZXcgRmlsZShwcm9qZWN0UGF0aCk7Ci0gICAgICAgIEZpbGVbXSBhbGxfZGlycyA9IHByb2plY3REaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZvciAoRmlsZSBmIDogYWxsX2RpcnMpIHsKLSAgICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgRmlsZSBqYXZhX2FjdGl2aXR5ID0gcGF0aC5hcHBlbmQob3NUYXJnZXQpLnRvRmlsZSgpOwotICAgICAgICAgICAgaWYgKGphdmFfYWN0aXZpdHkuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlRm9sZGVyID0gZi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE1TR19OT05FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFsbF9kaXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiUxJHMgY2FuIG5vdCBiZSBmb3VuZCB1bmRlciAlMiRzLiIsIG9zVGFyZ2V0LCBwcm9qZWN0UGF0aCksCi0gICAgICAgICAgICAgICAgICAgIE1TR19FUlJPUik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJObyBzb3VyY2UgZm9sZGVycyBjYW4gYmUgZm91bmQgaW4gJTEkcy4iLCBwcm9qZWN0UGF0aCksCi0gICAgICAgICAgICAgICAgICAgIE1TR19FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgd2l6YXJkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgaWNvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB3aXphcmQgbWVzc2FnZSB0eXBlLCBvbmUgb2YgTVNHX0VSUk9SIG9yIE1TR19XQVJOSU5HLgotICAgICAqIEByZXR1cm4gQXMgYSBjb252ZW5pZW5jZSwgYWx3YXlzIHJldHVybnMgbWVzc2FnZVR5cGUgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiByZXR1cm4KLSAgICAgKiAgICAgICAgIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHNldFN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgaW50IG1lc3NhZ2VUeXBlKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1lc3NhZ2UuZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZVR5cGUgPT0gTVNHX1dBUk5JTkcgPyBXaXphcmRQYWdlLldBUk5JTkcgOiBXaXphcmRQYWdlLkVSUk9SKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZVR5cGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9uZXdwcm9qZWN0L05ld1Byb2plY3RXaXphcmQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3Byb2plY3QvTmV3UHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMzM2E1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3Byb2plY3QvTmV3UHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWROYXR1cmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3QuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlBpeGVsRGVuc2l0eVF1YWxpZmllci5EZW5zaXR5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3QuTmV3UHJvamVjdENyZWF0aW9uUGFnZS5JTWFpbkluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdUZXN0UHJvamVjdENyZWF0aW9uUGFnZS5UZXN0SW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLk9wZW5KYXZhUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogQSAiTmV3IEFuZHJvaWQgUHJvamVjdCIgV2l6YXJkLgotICogPHAvPgotICogTm90ZTogdGhpcyBjbGFzcyBpcyBwdWJsaWMgc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB1bml0IHRlc3RzLgotICogSXQgaXMgaG93ZXZlciBhbiBpbnRlcm5hbCBjbGFzcy4gSXRzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICogSXQgc2hvdWxkIHNlbWFudGljYWxseSBiZSBjb25zaWRlcmVkIGFzIGEgcHJpdmF0ZSBmaW5hbCBjbGFzcy4KLSAqIERvIG5vdCBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQcm9qZWN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggcGFnZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgTmV3IFByb2plY3QgV2l6YXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBlbnVtIEF2YWlsYWJsZVBhZ2VzIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJvdGggdGhlIHVzdWFsICJBbmRyb2lkIFByb2plY3QiIGFuZCB0aGUgIkFuZHJvaWQgVGVzdCBQcm9qZWN0IiBwYWdlcyB3aWxsCi0gICAgICAgICAqIGJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IHBhZ2UgZGlzcGxheWVkIHdpbGwgYmUgdGhlIGZvcm1lciBvbmUgYW5kIGl0IGNhbiBkZXBlbmQKLSAgICAgICAgICogb24gdGhlIHNvb24tdG8tYmUgY3JlYXRlZCBub3JtYWwgcHJvamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIEFORFJPSURfQU5EX1RFU1RfUFJPSkVDVCwKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9ubHkgdGhlICJBbmRyb2lkIFRlc3QgUHJvamVjdCIgcGFnZSB3aWxsIGJlIGF2YWlsYWJsZS4gVXNlciB3aWxsIGhhdmUgdG8KLSAgICAgICAgICogc2VsZWN0IGFuIGV4aXN0aW5nIEFuZHJvaWQgUHJvamVjdC4gSWYgdGhlIHNlbGVjdGlvbiBtYXRjaGVzIHN1Y2ggYSBwcm9qZWN0LAotICAgICAgICAgKiBpdCB3aWxsIGJlIHVzZWQgYXMgYSBkZWZhdWx0LgotICAgICAgICAgKi8KLSAgICAgICAgVEVTVF9QUk9KRUNUX09OTFkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0RLX1RPT0xTX0RJUiA9ICJBTkRST0lEX1NES19UT09MUyI7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNUSVZJVFkgPSAiQUNUSVZJVFlfTkFNRSI7ICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVBQTElDQVRJT04gPSAiQVBQTElDQVRJT05fTkFNRSI7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEFDS0FHRSA9ICJQQUNLQUdFIjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUFJPSkVDVCA9ICJQUk9KRUNUX05BTUUiOyAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1RSSU5HX05BTUUgPSAiU1RSSU5HX05BTUUiOyAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1RSSU5HX0NPTlRFTlQgPSAiU1RSSU5HX0NPTlRFTlQiOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fSVNfTkVXX1BST0pFQ1QgPSAiSVNfTkVXX1BST0pFQ1QiOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1JDX0ZPTERFUiA9ICJTUkNfRk9MREVSIjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0RLX1RBUkdFVCA9ICJTREtfVEFSR0VUIjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTUlOX1NES19WRVJTSU9OID0gIk1JTl9TREtfVkVSU0lPTiI7ICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAvLyBXYXJuaW5nOiBUaGUgZXhwYW5kZWQgc3RyaW5nIFBBUkFNX1RFU1RfVEFSR0VUX1BBQ0tBR0UgbXVzdCBub3QgY29udGFpbiB0aGUKLSAgICAvLyBzdHJpbmcgIlBBQ0tBR0UiIHNpbmNlIGl0IGNvbGxpZGVzIHdpdGggdGhlIHJlcGxhY2VtZW50IG9mIFBBUkFNX1BBQ0tBR0UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RFU1RfVEFSR0VUX1BBQ0tBR0UgPSAiVEVTVF9UQVJHRVRfUENLRyI7ICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RBUkdFVF9TRUxGID0gIlRBUkdFVF9TRUxGIjsgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RBUkdFVF9NQUlOID0gIlRBUkdFVF9NQUlOIjsgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RBUkdFVF9FWElTVElORyA9ICJUQVJHRVRfRVhJU1RJTkciOyAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JFRkVSRU5DRV9QUk9KRUNUID0gIlJFRkVSRU5DRV9QUk9KRUNUIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfQUNUSVZJVElFUyA9ICJBQ1RJVklUSUVTIjsgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfVVNFU19TREsgPSAiVVNFUy1TREsiOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfSU5URU5UX0ZJTFRFUlMgPSAiSU5URU5UX0ZJTFRFUlMiOyAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfU1RSSU5HUyA9ICJTVFJJTkdTIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfVEVTVF9VU0VTX0xJQlJBUlkgPSAiVEVTVC1VU0VTLUxJQlJBUlkiOyAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhfVEVTVF9JTlNUUlVNRU5UQVRJT04gPSAiVEVTVC1JTlNUUlVNRU5UQVRJT04iOyAgIC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5fRElSRUNUT1JZID0KLSAgICAgICAgU2RrQ29uc3RhbnRzLkZEX09VVFBVVCArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfRElSRUNUT1JZID0KLSAgICAgICAgU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUyArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFVFNfRElSRUNUT1JZID0KLSAgICAgICAgU2RrQ29uc3RhbnRzLkZEX0FTU0VUUyArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXQUJMRV9ESVJFQ1RPUlkgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfRFJBV0FCTEUgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV0FCTEVfSERQSV9ESVJFQ1RPUlkgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfRFJBV0FCTEUgKyAiLSIgKyBEZW5zaXR5LkhJR0guZ2V0VmFsdWUoKSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOyAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV0FCTEVfTURQSV9ESVJFQ1RPUlkgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfRFJBV0FCTEUgKyAiLSIgKyBEZW5zaXR5Lk1FRElVTS5nZXRWYWx1ZSgpICsgQW5kcm9pZENvbnN0YW50cy5XU19TRVA7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV0FCTEVfTERQSV9ESVJFQ1RPUlkgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfRFJBV0FCTEUgKyAiLSIgKyBEZW5zaXR5LkxPVy5nZXRWYWx1ZSgpICsgQW5kcm9pZENvbnN0YW50cy5XU19TRVA7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0RJUkVDVE9SWSA9Ci0gICAgICAgIFNka0NvbnN0YW50cy5GRF9MQVlPVVQgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVTX0RJUkVDVE9SWSA9Ci0gICAgICAgIFNka0NvbnN0YW50cy5GRF9WQUxVRVMgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOX1NSQ19ESVJFQ1RPUlkgPQotICAgICAgICBTZGtDb25zdGFudHMuRkRfR0VOX1NPVVJDRVMgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfRElSRUNUT1JZID0gInRlbXBsYXRlcy8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX01BTklGRVNUID0gVEVNUExBVEVTX0RJUkVDVE9SWQotICAgICAgICAgICAgKyAiQW5kcm9pZE1hbmlmZXN0LnRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9BQ1RJVklUSUVTID0gVEVNUExBVEVTX0RJUkVDVE9SWQotICAgICAgICAgICAgKyAiYWN0aXZpdHkudGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1VTRVNfU0RLID0gVEVNUExBVEVTX0RJUkVDVE9SWQotICAgICAgICAgICAgKyAidXNlcy1zZGsudGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0lOVEVOVF9MQVVOQ0hFUiA9IFRFTVBMQVRFU19ESVJFQ1RPUlkKLSAgICAgICAgICAgICsgImxhdW5jaGVyX2ludGVudF9maWx0ZXIudGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1RFU1RfVVNFU19MSUJSQVJZID0gVEVNUExBVEVTX0RJUkVDVE9SWQotICAgICAgICAgICAgKyAidGVzdF91c2VzLWxpYnJhcnkudGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1RFU1RfSU5TVFJVTUVOVEFUSU9OID0gVEVNUExBVEVTX0RJUkVDVE9SWQotICAgICAgICAgICAgKyAidGVzdF9pbnN0cnVtZW50YXRpb24udGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1NUUklOR1MgPSBURU1QTEFURVNfRElSRUNUT1JZCi0gICAgICAgICAgICArICJzdHJpbmdzLnRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9TVFJJTkcgPSBURU1QTEFURVNfRElSRUNUT1JZCi0gICAgICAgICAgICArICJzdHJpbmcudGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfSUNPTiA9ICJpY29uLnBuZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9IRFBJID0gImljb25faGRwaS5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTURQSSA9ICJpY29uX21kcGkucG5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0xEUEkgPSAiaWNvbl9sZHBpLnBuZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX0ZJTEUgPSAic3RyaW5ncy54bWwiOyAgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1JTUkNfUFJFRklYID0gIkBzdHJpbmcvIjsgICAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQVBQX05BTUUgPSAiYXBwX25hbWUiOyAgICAgICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19IRUxMT19XT1JMRCA9ICJoZWxsbyI7ICAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRElSRUNUT1JJRVMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQklOX0RJUkVDVE9SWSwgUkVTX0RJUkVDVE9SWSwgQVNTRVRTX0RJUkVDVE9SWSB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFU19ESVJFQ1RPUklFUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBEUkFXQUJMRV9ESVJFQ1RPUlksIExBWU9VVF9ESVJFQ1RPUlksIFZBTFVFU19ESVJFQ1RPUlkgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVNfREVOU0lUWV9FTkFCTEVEX0RJUkVDVE9SSUVTID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIERSQVdBQkxFX0hEUElfRElSRUNUT1JZLCBEUkFXQUJMRV9NRFBJX0RJUkVDVE9SWSwgRFJBV0FCTEVfTERQSV9ESVJFQ1RPUlksCi0gICAgICAgICAgICBMQVlPVVRfRElSRUNUT1JZLCBWQUxVRVNfRElSRUNUT1JZIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0dPX0xBUkdFID0gImljb25zL2FuZHJvaWRfbGFyZ2UucG5nIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0FDVElWSVRZX1RFTVBMQVRFID0gImphdmFfZmlsZS50ZW1wbGF0ZSI7ICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9URU1QTEFURSA9ICJsYXlvdXQudGVtcGxhdGUiOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9MQVlPVVRfWE1MID0gIm1haW4ueG1sIjsgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBOZXdQcm9qZWN0Q3JlYXRpb25QYWdlIG1NYWluUGFnZTsKLSAgICBwcml2YXRlIE5ld1Rlc3RQcm9qZWN0Q3JlYXRpb25QYWdlIG1UZXN0UGFnZTsKLSAgICAvKiogUGFja2FnZSBuYW1lIGF2YWlsYWJsZSB3aGVuIHRoZSB3aXphcmQgY29tcGxldGVzLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEF2YWlsYWJsZVBhZ2VzIG1BdmFpbGFibGVQYWdlczsKLQotICAgIHB1YmxpYyBOZXdQcm9qZWN0V2l6YXJkKCkgewotICAgICAgICB0aGlzKEF2YWlsYWJsZVBhZ2VzLkFORFJPSURfQU5EX1RFU1RfUFJPSkVDVCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5ld1Byb2plY3RXaXphcmQoQXZhaWxhYmxlUGFnZXMgYXZhaWxhYmxlUGFnZXMpIHsKLSAgICAgICAgbUF2YWlsYWJsZVBhZ2VzID0gYXZhaWxhYmxlUGFnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjcmVhdGlvbiB3aXphcmQgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2ggYW5kIG9iamVjdAotICAgICAqIHNlbGVjdGlvbi4gSW5oZXJpdGVkIGZyb20gb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsgLy8gVE9ETyBoYXZlIGhlbHAKLSAgICAgICAgc2V0V2luZG93VGl0bGUoIk5ldyBBbmRyb2lkIFByb2plY3QiKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgaWYgKG1BdmFpbGFibGVQYWdlcyA9PSBBdmFpbGFibGVQYWdlcy5BTkRST0lEX0FORF9URVNUX1BST0pFQ1QpIHsKLSAgICAgICAgICAgIG1NYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRlc3RQYWdlID0gY3JlYXRlVGVzdFBhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotICAgICAqIDxwLz4KLSAgICAgKiBQbGVhc2UgZG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHByb3RlY3RlZCBzbyB0aGF0IGl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVuaXQgdGVzdHMuCi0gICAgICogSG93ZXZlciB0aGUgY29udHJhY3Qgb2YgdGhpcyBjbGFzcyBpcyBwcml2YXRlIGFuZCBOTyBBVFRFTVBUIHdpbGwgYmUgbWFkZQotICAgICAqIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHBsdWdpbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTmV3UHJvamVjdENyZWF0aW9uUGFnZSBjcmVhdGVNYWluUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOZXdQcm9qZWN0Q3JlYXRpb25QYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdGVzdCB3aXphcmQgcGFnZS4KLSAgICAgKiA8cC8+Ci0gICAgICogUGxlYXNlIGRvIE5PVCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBwcm90ZWN0ZWQgc28gdGhhdCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1bml0IHRlc3RzLgotICAgICAqIEhvd2V2ZXIgdGhlIGNvbnRyYWN0IG9mIHRoaXMgY2xhc3MgaXMgcHJpdmF0ZSBhbmQgTk8gQVRURU1QVCB3aWxsIGJlIG1hZGUKLSAgICAgKiB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBwbHVnaW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5ld1Rlc3RQcm9qZWN0Q3JlYXRpb25QYWdlIGNyZWF0ZVRlc3RQYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IE5ld1Rlc3RQcm9qZWN0Q3JlYXRpb25QYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gLS0gTWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkIC0tCi0gICAgLy8gVGhlIFdpemFyZCBjbGFzcyBpbXBsZW1lbnRzIG1vc3QgZGVmYXVsdHMgYW5kIGJvaWxlcnBsYXRlIGNvZGUgbmVlZGVkIGJ5Ci0gICAgLy8gSVdpemFyZAotCi0gICAgLyoqCi0gICAgICogQWRkcyBwYWdlcyB0byB0aGlzIHdpemFyZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVQYWdlcyA9PSBBdmFpbGFibGVQYWdlcy5BTkRST0lEX0FORF9URVNUX1BST0pFQ1QpIHsKLSAgICAgICAgICAgIGFkZFBhZ2UobU1haW5QYWdlKTsKLSAgICAgICAgfQotICAgICAgICBhZGRQYWdlKG1UZXN0UGFnZSk7Ci0KLSAgICAgICAgaWYgKG1NYWluUGFnZSAhPSBudWxsICYmIG1UZXN0UGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdFBhZ2Uuc2V0TWFpbkluZm8obU1haW5QYWdlLmdldE1haW5JbmZvKCkpOwotICAgICAgICAgICAgbU1haW5QYWdlLnNldFRlc3RJbmZvKG1UZXN0UGFnZS5nZXRUZXN0SW5mbygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGFueSBhY3Rpb25zIGFwcHJvcHJpYXRlIGluIHJlc3BvbnNlIHRvIHRoZSB1c2VyIGhhdmluZyBwcmVzc2VkCi0gICAgICogdGhlIEZpbmlzaCBidXR0b24sIG9yIHJlZnVzZSBpZiBmaW5pc2hpbmcgbm93IGlzIG5vdCBwZXJtaXR0ZWQ6IGhlcmUsIGl0Ci0gICAgICogYWN0dWFsbHkgY3JlYXRlcyB0aGUgd29ya3NwYWNlIHByb2plY3QgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSBKYXZhCi0gICAgICogcGVyc3BlY3RpdmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBpZiAoIWNyZWF0ZUFuZHJvaWRQcm9qZWN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPcGVuIHRoZSBkZWZhdWx0IEphdmEgUGVyc3BlY3RpdmUKLSAgICAgICAgT3BlbkphdmFQZXJzcGVjdGl2ZUFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlbkphdmFQZXJzcGVjdGl2ZUFjdGlvbigpOwotICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIC0tIFB1YmxpYyBGaWVsZHMgLS0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBtYWluIHByb2plY3QgcGFja2FnZSBuYW1lLiBPbmx5IHZhbGlkIG9uY2UgdGhlIHdpemFyZCBmaW5pc2hlcy4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIC8vIC0tIEN1c3RvbSBNZXRob2RzIC0tCi0KLSAgICAvKioKLSAgICAgKiBCZWZvcmUgYWN0dWFsbHkgY3JlYXRpbmcgdGhlIHByb2plY3QgZm9yIGEgbmV3IHByb2plY3QgKGFzIG9wcG9zZWQgdG8gdXNpbmcgYW4KLSAgICAgKiBleGlzdGluZyBwcm9qZWN0KSwgd2UgY2hlY2sgaWYgdGhlIHRhcmdldCBsb2NhdGlvbiBpcyBhIGRpcmVjdG9yeSB0aGF0IGVpdGhlciBkb2VzCi0gICAgICogbm90IGV4aXN0IG9yIGlzIGVtcHR5LgotICAgICAqCi0gICAgICogSWYgaXQncyBub3QgZW1wdHksIGFzayB0aGUgdXNlciBmb3IgY29uZmlybWF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgd2hlcmUgdGhlIG5ldyBwcm9qZWN0IGlzIHRvIGJlIGNyZWF0ZWQuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkZXN0aW5hdGlvbiBkb2Vzbid0IGV4aXN0IHlldCBvciBpcyBhbiBlbXB0eSBkaXJlY3Rvcnkgb3IgaXMKLSAgICAgKiAgICAgICAgIGFjY2VwdGVkIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU5ld1Byb2plY3RMb2NhdGlvbklzRW1wdHkoSVBhdGggZGVzdGluYXRpb24pIHsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGVzdGluYXRpb24udG9PU1N0cmluZygpKTsKLSAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSAmJiBmLmxpc3QoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWR0UGx1Z2luLmRpc3BsYXlQcm9tcHQoIk5ldyBBbmRyb2lkIFByb2plY3QiLAotICAgICAgICAgICAgICAgICAgICAiWW91IGFyZSBnb2luZyB0byBjcmVhdGUgYSBuZXcgQW5kcm9pZCBQcm9qZWN0IGluIGFuIGV4aXN0aW5nLCBub24tZW1wdHksIGRpcmVjdG9yeS4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNyZWF0ZSBhIHByb2plY3QuCi0gICAgICogVGhpcyBpcyBjb2xsZWN0ZWQgZnJvbSB0aGUgcGFnZXMgYnkge0BsaW5rIE5ld1Byb2plY3RXaXphcmQjY3JlYXRlQW5kcm9pZFByb2plY3RzKCl9Ci0gICAgICogYW5kIHRoZW4gdXNlZCBieQotICAgICAqIHtAbGluayBOZXdQcm9qZWN0V2l6YXJkI2NyZWF0ZVByb2plY3RBc3luYyhJUHJvZ3Jlc3NNb25pdG9yLCBQcm9qZWN0SW5mbywgUHJvamVjdEluZm8pfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9qZWN0SW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSVByb2plY3QgbVByb2plY3Q7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtUGFyYW1ldGVyczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtRGljdGlvbmFyeTsKLQotICAgICAgICBwdWJsaWMgUHJvamVjdEluZm8oSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBkaWN0aW9uYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgICAgICAgICAgICAgbURpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb2plY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSVByb2plY3REZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldERpY3Rpb25hcnkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpY3Rpb25hcnk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBhbmRyb2lkIHByb2plY3QuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGNvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUFuZHJvaWRQcm9qZWN0cygpIHsKLQotICAgICAgICBmaW5hbCBQcm9qZWN0SW5mbyBtYWluRGF0YSA9IGNvbGxlY3RNYWluUGFnZUluZm8oKTsKLSAgICAgICAgaWYgKG1NYWluUGFnZSAhPSBudWxsICYmIG1haW5EYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFByb2plY3RJbmZvIHRlc3REYXRhID0gY29sbGVjdFRlc3RQYWdlSW5mbygpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG1vbml0b3JlZCBvcGVyYXRpb24gdG8gY3JlYXRlIHRoZSBhY3R1YWwgcHJvamVjdAotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGNyZWF0ZVByb2plY3RBc3luYyhtb25pdG9yLCBtYWluRGF0YSwgdGVzdERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIFJ1biB0aGUgb3BlcmF0aW9uIGluIGEgZGlmZmVyZW50IHRocmVhZAotICAgICAgICBydW5Bc3luY09wZXJhdGlvbihvcCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxlY3RzIGFsbCB0aGUgcGFyYW1ldGVycyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBtYWluIHByb2plY3QuCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgUHJvamVjdEluZm99IG9uIHN1Y2Nlc3MuIFJldHVybnMgbnVsbCBpZiB0aGUgcHJvamVjdCBjYW5ub3QgYmUKLSAgICAgKiAgICBjcmVhdGVkIGJlY2F1c2UgcGFyYW1ldGVycyBhcmUgaW5jb3JyZWN0IG9yIHNob3VsZCBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZXJlCi0gICAgICogICAgaXMgbm8gbWFpbiBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdEluZm8gY29sbGVjdE1haW5QYWdlSW5mbygpIHsKLSAgICAgICAgaWYgKG1NYWluUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIElNYWluSW5mbyBpbmZvID0gbU1haW5QYWdlLmdldE1haW5JbmZvKCk7Ci0KLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoaW5mby5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGtlZXAgc29tZSB2YXJpYWJsZXMgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSBvbmNlIHRoZSB3aXphcmQgY2xvc2VzCi0gICAgICAgIG1QYWNrYWdlTmFtZSA9IGluZm8uZ2V0UGFja2FnZU5hbWUoKTsKLQotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fUFJPSkVDVCwgaW5mby5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fUEFDS0FHRSwgbVBhY2thZ2VOYW1lKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fQVBQTElDQVRJT04sIFNUUklOR19SU1JDX1BSRUZJWCArIFNUUklOR19BUFBfTkFNRSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX1NES19UT09MU19ESVIsIEFkdFBsdWdpbi5nZXRPc1Nka1Rvb2xzRm9sZGVyKCkpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9JU19ORVdfUFJPSkVDVCwgaW5mby5pc05ld1Byb2plY3QoKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX1NSQ19GT0xERVIsIGluZm8uZ2V0U291cmNlRm9sZGVyKCkpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9TREtfVEFSR0VULCBpbmZvLmdldFNka1RhcmdldCgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fTUlOX1NES19WRVJTSU9OLCBpbmZvLmdldE1pblNka1ZlcnNpb24oKSk7Ci0KLSAgICAgICAgaWYgKGluZm8uaXNDcmVhdGVBY3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICAvLyBBbiBhY3Rpdml0eSBuYW1lIGNhbiBiZSBvZiB0aGUgZm9ybSAiLnBhY2thZ2UuQ2xhc3MiIG9yICIuQ2xhc3MiLgotICAgICAgICAgICAgLy8gVGhlIGluaXRpYWwgZG90IGlzIGlnbm9yZWQsIGFzIGl0IGlzIGFsd2F5cyBhZGRlZCBsYXRlciBpbiB0aGUgdGVtcGxhdGVzLgotICAgICAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9IGluZm8uZ2V0QWN0aXZpdHlOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lLnN0YXJ0c1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX0FDVElWSVRZLCBhY3Rpdml0eU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZGljdGlvbmFyeSBvZiBzdHJpbmcgdGhhdCB3aWxsIGNvbnRhaW4gbmFtZStjb250ZW50LgotICAgICAgICAvLyB3ZSdsbCBwdXQgYWxsIHRoZSBzdHJpbmdzIGludG8gdmFsdWVzL3N0cmluZ3MueG1sCi0gICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRpY3Rpb25hcnkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZGljdGlvbmFyeS5wdXQoU1RSSU5HX0FQUF9OQU1FLCBpbmZvLmdldEFwcGxpY2F0aW9uTmFtZSgpKTsKLQotICAgICAgICBJUGF0aCBwYXRoID0gaW5mby5nZXRMb2NhdGlvblBhdGgoKTsKLSAgICAgICAgSVBhdGggZGVmYXVsdExvY2F0aW9uID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKCFwYXRoLmVxdWFscyhkZWZhdWx0TG9jYXRpb24pKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLmlzTmV3UHJvamVjdCgpICYmICFpbmZvLnVzZURlZmF1bHRMb2NhdGlvbigpICYmCi0gICAgICAgICAgICAgICAgIXZhbGlkYXRlTmV3UHJvamVjdExvY2F0aW9uSXNFbXB0eShwYXRoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFByb2plY3RJbmZvKHByb2plY3QsIGRlc2NyaXB0aW9uLCBwYXJhbWV0ZXJzLCBkaWN0aW9uYXJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0cyBhbGwgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgdGVzdCBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgUHJvamVjdEluZm99IG9uIHN1Y2Nlc3MuIFJldHVybnMgbnVsbCBpZiB0aGUgcHJvamVjdCBjYW5ub3QgYmUKLSAgICAgKiAgICBjcmVhdGVkIGJlY2F1c2UgcGFyYW1ldGVycyBhcmUgaW5jb3JyZWN0IG9yIHNob3VsZCBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZXJlCi0gICAgICogICAgaXMgbm8gdGVzdCBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvamVjdEluZm8gY29sbGVjdFRlc3RQYWdlSW5mbygpIHsKLSAgICAgICAgaWYgKG1UZXN0UGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBUZXN0SW5mbyBpbmZvID0gbVRlc3RQYWdlLmdldFRlc3RJbmZvKCk7Ci0KLSAgICAgICAgaWYgKCFpbmZvLmdldENyZWF0ZVRlc3RQcm9qZWN0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoaW5mby5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9QUk9KRUNULCBpbmZvLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9QQUNLQUdFLCBpbmZvLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9BUFBMSUNBVElPTiwgU1RSSU5HX1JTUkNfUFJFRklYICsgU1RSSU5HX0FQUF9OQU1FKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fU0RLX1RPT0xTX0RJUiwgQWR0UGx1Z2luLmdldE9zU2RrVG9vbHNGb2xkZXIoKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX0lTX05FV19QUk9KRUNULCB0cnVlKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fU1JDX0ZPTERFUiwgaW5mby5nZXRTb3VyY2VGb2xkZXIoKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX1NES19UQVJHRVQsIGluZm8uZ2V0U2RrVGFyZ2V0KCkpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9NSU5fU0RLX1ZFUlNJT04sIGluZm8uZ2V0TWluU2RrVmVyc2lvbigpKTsKLQotICAgICAgICAvLyBUZXN0LXNwZWNpZmljIHBhcmFtZXRlcnMKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fVEVTVF9UQVJHRVRfUEFDS0FHRSwgaW5mby5nZXRUYXJnZXRQYWNrYWdlTmFtZSgpKTsKLQotICAgICAgICBpZiAoaW5mby5pc1Rlc3RpbmdTZWxmKCkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX1RBUkdFVF9TRUxGLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mby5pc1Rlc3RpbmdNYWluKCkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFBBUkFNX1RBUkdFVF9NQUlOLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mby5pc1Rlc3RpbmdFeGlzdGluZygpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9UQVJHRVRfRVhJU1RJTkcsIHRydWUpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoUEFSQU1fUkVGRVJFTkNFX1BST0pFQ1QsIGluZm8uZ2V0RXhpc3RpbmdUZXN0ZWRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZGljdGlvbmFyeSBvZiBzdHJpbmcgdGhhdCB3aWxsIGNvbnRhaW4gbmFtZStjb250ZW50LgotICAgICAgICAvLyB3ZSdsbCBwdXQgYWxsIHRoZSBzdHJpbmdzIGludG8gdmFsdWVzL3N0cmluZ3MueG1sCi0gICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRpY3Rpb25hcnkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZGljdGlvbmFyeS5wdXQoU1RSSU5HX0FQUF9OQU1FLCBpbmZvLmdldEFwcGxpY2F0aW9uTmFtZSgpKTsKLQotICAgICAgICBJUGF0aCBwYXRoID0gaW5mby5nZXRMb2NhdGlvblBhdGgoKTsKLSAgICAgICAgSVBhdGggZGVmYXVsdExvY2F0aW9uID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKCFwYXRoLmVxdWFscyhkZWZhdWx0TG9jYXRpb24pKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW5mby51c2VEZWZhdWx0TG9jYXRpb24oKSAmJiAhdmFsaWRhdGVOZXdQcm9qZWN0TG9jYXRpb25Jc0VtcHR5KHBhdGgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUHJvamVjdEluZm8ocHJvamVjdCwgZGVzY3JpcHRpb24sIHBhcmFtZXRlcnMsIGRpY3Rpb25hcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIG9wZXJhdGlvbiBpbiBhIGRpZmZlcmVudCB0aHJlYWQgYW5kIGRpc3BsYXkgZ2VuZXJhdGVkCi0gICAgICogZXhjZXB0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcCBUaGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byBydW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkFzeW5jT3BlcmF0aW9uKFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUgLyogZm9yayAqLywgdHJ1ZSAvKiBjYW5jZWxhYmxlICovLCBvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVGhlIHJ1bm5hYmxlIHRocmV3IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29yZUV4Y2VwdGlvbiBjb3JlID0gKENvcmVFeGNlcHRpb24pIHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcmUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5DQVNFX1ZBUklBTlRfRVhJU1RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlcnJvciBpbmRpY2F0ZXMgdGhlIGZpbGUgc3lzdGVtIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUncyBhIHJlc291cmNlIHdpdGggYSBzaW1pbGFyIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJFcnJvciIsICJFcnJvcjogQ2FzZSBWYXJpYW50IEV4aXN0cyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCBudWxsLCBjb3JlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgb3RoZXIga2luZCBvZiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0dWFsIHByb2plY3QocykuIFRoaXMgaXMgcnVuIGFzeW5jaHJvbm91c2x5IGluIGEgZGlmZmVyZW50IHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIG1vbml0b3IuCi0gICAgICogQHBhcmFtIG1haW5EYXRhIERhdGEgZm9yIG1haW4gcHJvamVjdC4gQ2FuIGJlIG51bGwuCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRvIHdyYXAgYW55IHVubWFuYWdlZCBleGNlcHRpb24gYW5kCi0gICAgICogICAgICAgICByZXR1cm4gaXQgdG8gdGhlIGNhbGxpbmcgdGhyZWFkLiBUaGUgbWV0aG9kIGNhbiBmYWlsIGlmIGl0IGZhaWxzCi0gICAgICogICAgICAgICB0byBjcmVhdGUgb3IgbW9kaWZ5IHRoZSBwcm9qZWN0IG9yIGlmIGl0IGlzIGNhbmNlbGVkIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0QXN5bmMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAgICAgICAgICAgUHJvamVjdEluZm8gbWFpbkRhdGEsCi0gICAgICAgICAgICBQcm9qZWN0SW5mbyB0ZXN0RGF0YSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJDcmVhdGUgQW5kcm9pZCBQcm9qZWN0IiwgMTAwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0IG1haW5Qcm9qZWN0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1haW5EYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYWluUHJvamVjdCA9IGNyZWF0ZUVjbGlwc2VQcm9qZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWluRGF0YS5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWluRGF0YS5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkRhdGEuZ2V0UGFyYW1ldGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkRhdGEuZ2V0RGljdGlvbmFyeSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRlc3REYXRhICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycyA9IHRlc3REYXRhLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5jb250YWluc0tleShQQVJBTV9UQVJHRVRfTUFJTikgJiYgbWFpblByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChQQVJBTV9SRUZFUkVOQ0VfUFJPSkVDVCwgbWFpblByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNyZWF0ZUVjbGlwc2VQcm9qZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RGF0YS5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RGF0YS5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3REYXRhLmdldERpY3Rpb25hcnkoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdHVhbCBwcm9qZWN0LCBzZXRzIGl0cyBuYXR1cmUgYW5kIGFkZHMgdGhlIHJlcXVpcmVkIGZvbGRlcnMKLSAgICAgKiBhbmQgZmlsZXMgdG8gaXQuIFRoaXMgaXMgcnVuIGFzeW5jaHJvbm91c2x5IGluIGEgZGlmZmVyZW50IHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIG1vbml0b3IuCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRlbXBsYXRlIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIGRpY3Rpb25hcnkgU3RyaW5nIGRlZmluaXRpb24uCi0gICAgICogQHJldHVybiBUaGUgcHJvamVjdCBuZXdseSBjcmVhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBjcmVhdGVFY2xpcHNlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZGljdGlvbmFyeSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGdldCB0aGUgcHJvamVjdCB0YXJnZXQKLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gKElBbmRyb2lkVGFyZ2V0KSBwYXJhbWV0ZXJzLmdldChQQVJBTV9TREtfVEFSR0VUKTsKLSAgICAgICAgYm9vbGVhbiBsZWdhY3kgPSB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCkgPCA0OwotCi0gICAgICAgIC8vIENyZWF0ZSBwcm9qZWN0IGFuZCBvcGVuIGl0Ci0gICAgICAgIHByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKSk7Ci0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLQotICAgICAgICAvLyBBZGQgdGhlIEphdmEgYW5kIGFuZHJvaWQgbmF0dXJlIHRvIHRoZSBwcm9qZWN0Ci0gICAgICAgIEFuZHJvaWROYXR1cmUuc2V0dXBQcm9qZWN0TmF0dXJlcyhwcm9qZWN0LCBtb25pdG9yKTsKLQotICAgICAgICAvLyBDcmVhdGUgZm9sZGVycyBpbiB0aGUgcHJvamVjdCBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QKLSAgICAgICAgYWRkRGVmYXVsdERpcmVjdG9yaWVzKHByb2plY3QsIEFuZHJvaWRDb25zdGFudHMuV1NfUk9PVCwgREVGQVVMVF9ESVJFQ1RPUklFUywgbW9uaXRvcik7Ci0gICAgICAgIFN0cmluZ1tdIHNvdXJjZUZvbGRlcnMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJBTV9TUkNfRk9MREVSKSwKLSAgICAgICAgICAgICAgICAgICAgR0VOX1NSQ19ESVJFQ1RPUlkKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICBhZGREZWZhdWx0RGlyZWN0b3JpZXMocHJvamVjdCwgQW5kcm9pZENvbnN0YW50cy5XU19ST09ULCBzb3VyY2VGb2xkZXJzLCBtb25pdG9yKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc291cmNlIGZvbGRlcnMgaW4gdGhlIHByb2plY3QgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LgotICAgICAgICBpZiAobGVnYWN5KSB7Ci0gICAgICAgICAgICBhZGREZWZhdWx0RGlyZWN0b3JpZXMocHJvamVjdCwgUkVTX0RJUkVDVE9SWSwgUkVTX0RJUkVDVE9SSUVTLCBtb25pdG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZERlZmF1bHREaXJlY3Rvcmllcyhwcm9qZWN0LCBSRVNfRElSRUNUT1JZLCBSRVNfREVOU0lUWV9FTkFCTEVEX0RJUkVDVE9SSUVTLCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldHVwIGNsYXNzIHBhdGg6IG1hcmsgZm9sZGVycyBhcyBzb3VyY2UgZm9sZGVycwotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNvdXJjZUZvbGRlciA6IHNvdXJjZUZvbGRlcnMpIHsKLSAgICAgICAgICAgIHNldHVwU291cmNlRm9sZGVyKGphdmFQcm9qZWN0LCBzb3VyY2VGb2xkZXIsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayB0aGUgZ2VuIHNvdXJjZSBmb2xkZXIgYXMgZGVyaXZlZAotICAgICAgICBJRm9sZGVyIGdlblNyY0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKEFuZHJvaWRDb25zdGFudHMuV1NfUk9PVCArIEdFTl9TUkNfRElSRUNUT1JZKTsKLSAgICAgICAgaWYgKGdlblNyY0ZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgZ2VuU3JjRm9sZGVyLnNldERlcml2ZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKChCb29sZWFuKSBwYXJhbWV0ZXJzLmdldChQQVJBTV9JU19ORVdfUFJPSkVDVCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgZmlsZXMgaW4gdGhlIHByb2plY3QgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0Ci0gICAgICAgICAgICBhZGRNYW5pZmVzdChwcm9qZWN0LCBwYXJhbWV0ZXJzLCBkaWN0aW9uYXJ5LCBtb25pdG9yKTsKLQotICAgICAgICAgICAgLy8gYWRkIHRoZSBkZWZhdWx0IGFwcCBpY29uCi0gICAgICAgICAgICBhZGRJY29uKHByb2plY3QsIGxlZ2FjeSwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGVmYXVsdCBwYWNrYWdlIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGFkZFNhbXBsZUNvZGUocHJvamVjdCwgc291cmNlRm9sZGVyc1swXSwgcGFyYW1ldGVycywgZGljdGlvbmFyeSwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgc3RyaW5nIGRlZmluaXRpb24gZmlsZSBpZiBuZWVkZWQKLSAgICAgICAgICAgIGlmIChkaWN0aW9uYXJ5LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhZGRTdHJpbmdEaWN0aW9uYXJ5RmlsZShwcm9qZWN0LCBkaWN0aW9uYXJ5LCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IG91dHB1dCBsb2NhdGlvbgotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24ocHJvamVjdC5nZXRGb2xkZXIoQklOX0RJUkVDVE9SWSkuZ2V0RnVsbFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHByb2plY3QKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMuY29udGFpbnNLZXkoUEFSQU1fUkVGRVJFTkNFX1BST0pFQ1QpKSB7Ci0gICAgICAgICAgICBJUHJvamVjdCByZWZQcm9qZWN0ID0gKElQcm9qZWN0KSBwYXJhbWV0ZXJzLmdldChQQVJBTV9SRUZFUkVOQ0VfUFJPSkVDVCk7Ci0gICAgICAgICAgICBpZiAocmVmUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIG91dCByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIHByb2plY3QgcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgY3JlYXRlZCBhIHByb2plY3Qgd2l0aCBubyByZWZlcmVuY2VzIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwYW5kCi0gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnRseS1lbXB0eSBjdXJyZW50IGxpc3QuCi0gICAgICAgICAgICAgICAgZGVzYy5zZXRSZWZlcmVuY2VkUHJvamVjdHMobmV3IElQcm9qZWN0W10geyByZWZQcm9qZWN0IH0pOwotCi0gICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotCi0gICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmUHJvamVjdC5nZXRGdWxsUGF0aCgpLCAvL3BhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJQWNjZXNzUnVsZVswXSwgLy9hY2Nlc3NSdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vY29tYmluZUFjY2Vzc1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVswXSwgLy9leHRyYUF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8vaXNFeHBvcnRlZAotCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmFkZEVudHJ5VG9DbGFzc3BhdGgoamF2YVByb2plY3QsIGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNkay5nZXRDdXJyZW50KCkuc2V0UHJvamVjdChwcm9qZWN0LCB0YXJnZXQsIG51bGwgLyogYXBrQ29uZmlnTWFwKi8pOwotCi0gICAgICAgIC8vIEZpeCB0aGUgcHJvamVjdCB0byBtYWtlIHN1cmUgYWxsIHByb3BlcnRpZXMgYXJlIGFzIGV4cGVjdGVkLgotICAgICAgICAvLyBOZWNlc3NhcnkgZm9yIGV4aXN0aW5nIHByb2plY3RzIGFuZCBnb29kIGZvciBuZXcgb25lcyB0by4KLSAgICAgICAgUHJvamVjdEhlbHBlci5maXhQcm9qZWN0KHByb2plY3QpOwotCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgZGVmYXVsdCBkaXJlY3RvcmllcyB0byB0aGUgcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBKYXZhIFByb2plY3QgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSBwYXJlbnRGb2xkZXIgVGhlIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIuIE11c3QgZW5kIHdpdGggYQotICAgICAqICAgICAgICBzZXBhcmF0b3IuCi0gICAgICogQHBhcmFtIGZvbGRlcnMgRm9sZGVycyB0byBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBbiBleGlzdGluZyBtb25pdG9yLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGZhaWxzIHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3JpZXMgaW4KLSAgICAgKiAgICAgICAgIHRoZSBwcm9qZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0RGlyZWN0b3JpZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhcmVudEZvbGRlciwKLSAgICAgICAgICAgIFN0cmluZ1tdIGZvbGRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogZm9sZGVycykgewotICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXJlbnRGb2xkZXIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUgLyogZm9yY2UgKi8sIHRydWUgLyogbG9jYWwgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG1hbmlmZXN0IHRvIHRoZSBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIEphdmEgUHJvamVjdCB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGVtcGxhdGUgUGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gZGljdGlvbmFyeSBTdHJpbmcgTGlzdCB0byBiZSBhZGRlZCB0byBhIHN0cmluZyBkZWZpbml0aW9uCi0gICAgICogICAgICAgIGZpbGUuIFRoaXMgbWFwIHdpbGwgYmUgZmlsbGVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIG1vbml0b3IuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZmFpbHMgdG8gdXBkYXRlIHRoZSBwcm9qZWN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBmYWlscyB0byBjcmVhdGUgdGhlIGZpbGVzIGluIHRoZQotICAgICAqICAgICAgICAgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFuaWZlc3QoSVByb2plY3QgcHJvamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBkaWN0aW9uYXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGdldCBJRmlsZSB0byB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCi0gICAgICAgIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoQW5kcm9pZENvbnN0YW50cy5GTl9BTkRST0lEX01BTklGRVNUKTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgbWFuaWZlc3QgdGVtcGxhdGUKLSAgICAgICAgICAgIFN0cmluZyBtYW5pZmVzdFRlbXBsYXRlID0gQWR0UGx1Z2luLnJlYWRFbWJlZGRlZFRleHRGaWxlKFRFTVBMQVRFX01BTklGRVNUKTsKLQotICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwga2V5d29yZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtYW5pZmVzdFRlbXBsYXRlID0gcmVwbGFjZVBhcmFtZXRlcnMobWFuaWZlc3RUZW1wbGF0ZSwgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KFBBUkFNX0FDVElWSVRZKSkgewotICAgICAgICAgICAgICAgIC8vIG5vdyBnZXQgdGhlIGFjdGl2aXR5IHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2aXR5VGVtcGxhdGUgPSBBZHRQbHVnaW4ucmVhZEVtYmVkZGVkVGV4dEZpbGUoVEVNUExBVEVfQUNUSVZJVElFUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBrZXl3b3JkIHBhcmFtZXRlcnMgdG8gbWFrZSBtYWluIGFjdGl2aXR5LgotICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpdml0aWVzID0gcmVwbGFjZVBhcmFtZXRlcnMoYWN0aXZpdHlUZW1wbGF0ZSwgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGludGVudC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZW50ID0gQWR0UGx1Z2luLnJlYWRFbWJlZGRlZFRleHRGaWxlKFRFTVBMQVRFX0lOVEVOVF9MQVVOQ0hFUik7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGludGVudCB0byB0aGUgbWFpbiBhY3Rpdml0eQotICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBhY3Rpdml0aWVzLnJlcGxhY2VBbGwoUEhfSU5URU5UX0ZJTFRFUlMsIGludGVudCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGFjdGl2aXR5KGllcykgaW4gdGhlIG1hbmlmZXN0Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9IG1hbmlmZXN0VGVtcGxhdGUucmVwbGFjZUFsbChQSF9BQ1RJVklUSUVTLCBhY3Rpdml0aWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhY3Rpdml0eShpZXMpIGZyb20gdGhlIG1hbmlmZXN0Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9IG1hbmlmZXN0VGVtcGxhdGUucmVwbGFjZUFsbChQSF9BQ1RJVklUSUVTLCAiIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSBvZiB0aGUgdGVzdCBwcm9qZWN0cwotICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuY29udGFpbnNLZXkoUEFSQU1fVEVTVF9UQVJHRVRfUEFDS0FHRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHVzZXMtbGlicmFyeSBuZWVkZWQgYnkgdGhlIHRlc3QgcHJvamVjdAotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VzTGlicmFyeSA9IEFkdFBsdWdpbi5yZWFkRW1iZWRkZWRUZXh0RmlsZShURU1QTEFURV9URVNUX1VTRVNfTElCUkFSWSk7Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9IG1hbmlmZXN0VGVtcGxhdGUucmVwbGFjZUFsbChQSF9URVNUX1VTRVNfTElCUkFSWSwgdXNlc0xpYnJhcnkpOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBpbnN0cnVtZW50YXRpb24gZWxlbWVudCBuZWVkZWQgYnkgdGhlIHRlc3QgcHJvamVjdAotICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0cnUgPSBBZHRQbHVnaW4ucmVhZEVtYmVkZGVkVGV4dEZpbGUoVEVNUExBVEVfVEVTVF9JTlNUUlVNRU5UQVRJT04pOwotICAgICAgICAgICAgICAgIG1hbmlmZXN0VGVtcGxhdGUgPSBtYW5pZmVzdFRlbXBsYXRlLnJlcGxhY2VBbGwoUEhfVEVTVF9JTlNUUlVNRU5UQVRJT04sIGluc3RydSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIFBBUkFNX1RFU1RfVEFSR0VUX1BBQ0tBR0UgaXRzZWxmIG5vdwotICAgICAgICAgICAgICAgIG1hbmlmZXN0VGVtcGxhdGUgPSByZXBsYWNlUGFyYW1ldGVycyhtYW5pZmVzdFRlbXBsYXRlLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHVudXNlZCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9IG1hbmlmZXN0VGVtcGxhdGUucmVwbGFjZUFsbChQSF9URVNUX1VTRVNfTElCUkFSWSwgIiIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1hbmlmZXN0VGVtcGxhdGUgPSBtYW5pZmVzdFRlbXBsYXRlLnJlcGxhY2VBbGwoUEhfVEVTVF9JTlNUUlVNRU5UQVRJT04sICIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG1pblNka1ZlcnNpb24gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJBTV9NSU5fU0RLX1ZFUlNJT04pOwotICAgICAgICAgICAgaWYgKG1pblNka1ZlcnNpb24gIT0gbnVsbCAmJiBtaW5TZGtWZXJzaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VzU2RrVGVtcGxhdGUgPSBBZHRQbHVnaW4ucmVhZEVtYmVkZGVkVGV4dEZpbGUoVEVNUExBVEVfVVNFU19TREspOwotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VzU2RrID0gcmVwbGFjZVBhcmFtZXRlcnModXNlc1Nka1RlbXBsYXRlLCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICBtYW5pZmVzdFRlbXBsYXRlID0gbWFuaWZlc3RUZW1wbGF0ZS5yZXBsYWNlQWxsKFBIX1VTRVNfU0RLLCB1c2VzU2RrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9IG1hbmlmZXN0VGVtcGxhdGUucmVwbGFjZUFsbChQSF9VU0VTX1NESywgIiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTYXZlIGluIHRoZSBwcm9qZWN0IGFzIFVURi04Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0VGVtcGxhdGUuZ2V0Qnl0ZXMoIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlLmNyZWF0ZShzdHJlYW0sIGZhbHNlIC8qIGZvcmNlICovLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBKYXZhIFByb2plY3QgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSBzdHJpbmdzIFRoZSBsaXN0IG9mIHN0cmluZ3MgdG8gYmUgYWRkZWQgdG8gdGhlIHN0cmluZyBmaWxlLgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIG1vbml0b3IuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZmFpbHMgdG8gdXBkYXRlIHRoZSBwcm9qZWN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBmYWlscyB0byBjcmVhdGUgdGhlIGZpbGVzIGluIHRoZQotICAgICAqICAgICAgICAgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU3RyaW5nRGljdGlvbmFyeUZpbGUoSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5ncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIElGaWxlIG9iamVjdCBhbmQgY2hlY2sgaWYgdGhlIGZpbGUgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotICAgICAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKFJFU19ESVJFQ1RPUlkgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVkFMVUVTX0RJUkVDVE9SWSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQICsgU1RSSU5HU19GSUxFKTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIFN0cmluZ3MueG1sIHRlbXBsYXRlCi0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nRGVmaW5pdGlvblRlbXBsYXRlID0gQWR0UGx1Z2luLnJlYWRFbWJlZGRlZFRleHRGaWxlKFRFTVBMQVRFX1NUUklOR1MpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHRlbXBsYXRlIGZvciBvbmUgc3RyaW5nCi0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nVGVtcGxhdGUgPSBBZHRQbHVnaW4ucmVhZEVtYmVkZGVkVGV4dEZpbGUoVEVNUExBVEVfU1RSSU5HKTsKLQotICAgICAgICAgICAgLy8gZ2V0IGFsbCB0aGUgc3RyaW5nIG5hbWVzCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdHJpbmdOYW1lcyA9IHN0cmluZ3Mua2V5U2V0KCk7Ci0KLSAgICAgICAgICAgIC8vIGxvb3Agb24gaXQgYW5kIGNyZWF0ZSB0aGUgc3RyaW5nIGRlZmluaXRpb25zCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ05vZGVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHN0cmluZ05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBrZXkKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzdHJpbmdzLmdldChrZXkpOwotCi0gICAgICAgICAgICAgICAgLy8gcGxhY2UgdGhlbSBpbiB0aGUgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nRGVmID0gc3RyaW5nVGVtcGxhdGUucmVwbGFjZShQQVJBTV9TVFJJTkdfTkFNRSwga2V5KTsKLSAgICAgICAgICAgICAgICBzdHJpbmdEZWYgPSBzdHJpbmdEZWYucmVwbGFjZShQQVJBTV9TVFJJTkdfQ09OVEVOVCwgdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBvdGhlciBzdHJpbmcKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nTm9kZXMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ05vZGVzLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyaW5nTm9kZXMuYXBwZW5kKHN0cmluZ0RlZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHB1dCB0aGUgc3RyaW5nIG5vZGVzIGluIHRoZSBTdHJpbmdzLnhtbCB0ZW1wbGF0ZQotICAgICAgICAgICAgc3RyaW5nRGVmaW5pdGlvblRlbXBsYXRlID0gc3RyaW5nRGVmaW5pdGlvblRlbXBsYXRlLnJlcGxhY2UoUEhfU1RSSU5HUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ05vZGVzLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgZmlsZSBhcyBVVEYtOAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBzdHJpbmdEZWZpbml0aW9uVGVtcGxhdGUuZ2V0Qnl0ZXMoIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBmaWxlLmNyZWF0ZShzdHJlYW0sIGZhbHNlIC8qIGZvcmNlICovLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEFkZHMgZGVmYXVsdCBhcHBsaWNhdGlvbiBpY29uIHRvIHRoZSBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIEphdmEgUHJvamVjdCB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIGxlZ2FjeSB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgaW4gbGVnYWN5IG1vZGUgKG5vIGRlbnNpdHkgc3VwcG9ydCkKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBbiBleGlzdGluZyBtb25pdG9yLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGZhaWxzIHRvIHVwZGF0ZSB0aGUgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSWNvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGxlZ2FjeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAobGVnYWN5KSB7IC8vIGRlbnNpdHkgc3VwcG9ydAotICAgICAgICAgICAgLy8gZG8gbWVkaXVtIGRlbnNpdHkgaWNvbiBvbmx5LCBpbiB0aGUgZGVmYXVsdCBkcmF3YWJsZSBmb2xkZXIuCi0gICAgICAgICAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKFJFU19ESVJFQ1RPUlkgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUAotICAgICAgICAgICAgICAgICAgICArIERSQVdBQkxFX0RJUkVDVE9SWSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQICsgUFJPSkVDVF9JQ09OKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGFkZEZpbGUoZmlsZSwgQWR0UGx1Z2luLnJlYWRFbWJlZGRlZEZpbGUoVEVNUExBVEVTX0RJUkVDVE9SWSArIElDT05fTURQSSksIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gYWxsIDMgaWNvbnMuCi0gICAgICAgICAgICBJRmlsZSBmaWxlOwotCi0gICAgICAgICAgICAvLyBoaWdoIGRlbnNpdHkKLSAgICAgICAgICAgIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoUkVTX0RJUkVDVE9SWSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQCi0gICAgICAgICAgICAgICAgICAgICsgRFJBV0FCTEVfSERQSV9ESVJFQ1RPUlkgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUCArIFBST0pFQ1RfSUNPTik7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRGaWxlKGZpbGUsIEFkdFBsdWdpbi5yZWFkRW1iZWRkZWRGaWxlKFRFTVBMQVRFU19ESVJFQ1RPUlkgKyBJQ09OX0hEUEkpLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbWVkaXVtIGRlbnNpdHkKLSAgICAgICAgICAgIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoUkVTX0RJUkVDVE9SWSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQCi0gICAgICAgICAgICAgICAgICAgICsgRFJBV0FCTEVfTURQSV9ESVJFQ1RPUlkgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUCArIFBST0pFQ1RfSUNPTik7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRGaWxlKGZpbGUsIEFkdFBsdWdpbi5yZWFkRW1iZWRkZWRGaWxlKFRFTVBMQVRFU19ESVJFQ1RPUlkgKyBJQ09OX01EUEkpLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG93IGRlbnNpdHkKLSAgICAgICAgICAgIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoUkVTX0RJUkVDVE9SWSArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQCi0gICAgICAgICAgICAgICAgICAgICsgRFJBV0FCTEVfTERQSV9ESVJFQ1RPUlkgKyBBbmRyb2lkQ29uc3RhbnRzLldTX1NFUCArIFBST0pFQ1RfSUNPTik7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRGaWxlKGZpbGUsIEFkdFBsdWdpbi5yZWFkRW1iZWRkZWRGaWxlKFRFTVBMQVRFU19ESVJFQ1RPUlkgKyBJQ09OX0xEUEkpLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmaWxlIGZyb20gYSBkYXRhIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gZGVzdCB0aGUgZmlsZSB0byB3cml0ZQotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkRmlsZShJRmlsZSBkZXN0LCBieXRlW10gc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBTYXZlIGluIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc291cmNlKTsKLSAgICAgICAgICAgIGRlc3QuY3JlYXRlKHN0cmVhbSwgZmFsc2UgLyogZm9yY2UgKi8sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHBhY2thZ2UgZm9sZGVyIGFuZCBjb3BpZXMgdGhlIHNhbXBsZSBjb2RlIGluIHRoZSBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3QgVGhlIEphdmEgUHJvamVjdCB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGVtcGxhdGUgUGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gZGljdGlvbmFyeSBTdHJpbmcgTGlzdCB0byBiZSBhZGRlZCB0byBhIHN0cmluZyBkZWZpbml0aW9uCi0gICAgICogICAgICAgIGZpbGUuIFRoaXMgbWFwIHdpbGwgYmUgZmlsbGVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBtb25pdG9yIEFuIGV4aXN0aW5nIG1vbml0b3IuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZmFpbHMgdG8gdXBkYXRlIHRoZSBwcm9qZWN0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBmYWlscyB0byBjcmVhdGUgdGhlIGZpbGVzIGluIHRoZQotICAgICAqICAgICAgICAgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU2FtcGxlQ29kZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc291cmNlRm9sZGVyLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGRpY3Rpb25hcnksCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgamF2YSBwYWNrYWdlIGRpcmVjdG9yaWVzLgotICAgICAgICBJRm9sZGVyIHBrZ0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHNvdXJjZUZvbGRlcik7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUkFNX1BBQ0tBR0UpOwotCi0gICAgICAgIC8vIFRoZSBQQVJBTV9BQ1RJVklUWSBrZXkgd2lsbCBiZSBhYnNlbnQgaWYgbm8gYWN0aXZpdHkgc2hvdWxkIGJlIGNyZWF0ZWQsCi0gICAgICAgIC8vIGluIHdoaWNoIGNhc2UgYWN0aXZpdHlOYW1lIHdpbGwgYmUgbnVsbC4KLSAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUkFNX0FDVElWSVRZKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhX2FjdGl2aXR5X3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICBpZiAoYWN0aXZpdHlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpdml0eU5hbWUuaW5kZXhPZignLicpID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgcGFja2FnZSBuYW1lcyBpbiB0aGUgYWN0aXZpdHkgbmFtZS4gVHJhbnNmb3JtIHBhY2thZ2VOYW1lIHRvIGFkZAotICAgICAgICAgICAgICAgIC8vIHRob3NlIHN1YiBwYWNrYWdlcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBhY3Rpdml0eU5hbWUuCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iICsgYWN0aXZpdHlOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IHBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIEpBVkFfRklMRV9URU1QTEFURSBiZWxvdwotICAgICAgICAgICAgICAgIC8vIChidXQgbm90IHRoZSBvbmVzIGZyb20gdGhlIG1hbmlmZXN0IHNvIGRvbid0IGNoYW5nZSB0aGUgY2FsbGVyJ3MgZGljdGlvbmFyeSkKLSAgICAgICAgICAgICAgICBqYXZhX2FjdGl2aXR5X3BhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4ocGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgamF2YV9hY3Rpdml0eV9wYXJhbWV0ZXJzLnB1dChQQVJBTV9QQUNLQUdFLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgamF2YV9hY3Rpdml0eV9wYXJhbWV0ZXJzLnB1dChQQVJBTV9BQ1RJVklUWSwgYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGNvbXBvbmVudHMgPSBwYWNrYWdlTmFtZS5zcGxpdChBbmRyb2lkQ29uc3RhbnRzLlJFX0RPVCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudCA6IGNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIHBrZ0ZvbGRlciA9IHBrZ0ZvbGRlci5nZXRGb2xkZXIoY29tcG9uZW50KTsKLSAgICAgICAgICAgIGlmICghcGtnRm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcGtnRm9sZGVyLmNyZWF0ZSh0cnVlIC8qIGZvcmNlICovLCB0cnVlIC8qIGxvY2FsICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGl2aXR5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIG1haW4gYWN0aXZpdHkgSmF2YSBmaWxlCi0gICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHlKYXZhID0gYWN0aXZpdHlOYW1lICsgQW5kcm9pZENvbnN0YW50cy5ET1RfSkFWQTsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSBwa2dGb2xkZXIuZ2V0RmlsZShhY3Rpdml0eUphdmEpOwotICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgY29weUZpbGUoSkFWQV9BQ1RJVklUWV9URU1QTEFURSwgZmlsZSwgamF2YV9hY3Rpdml0eV9wYXJhbWV0ZXJzLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKLSAgICAgICAgSUZvbGRlciBsYXlvdXRmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihSRVNfRElSRUNUT1JZKS5nZXRGb2xkZXIoTEFZT1VUX0RJUkVDVE9SWSk7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBsYXlvdXRmb2xkZXIuZ2V0RmlsZShNQUlOX0xBWU9VVF9YTUwpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGNvcHlGaWxlKExBWU9VVF9URU1QTEFURSwgZmlsZSwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0gICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LnB1dChTVFJJTkdfSEVMTE9fV09STEQsICJIZWxsbyBXb3JsZCwgIiArIGFjdGl2aXR5TmFtZSArICIhIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkucHV0KFNUUklOR19IRUxMT19XT1JMRCwgIkhlbGxvIFdvcmxkISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZm9sZGVyIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3MgcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgSmF2YSBQcm9qZWN0IHRvIHVwZGF0ZS4KLSAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVyIFRlbXBsYXRlIFBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIG1vbml0b3IgQW4gZXhpc3RpbmcgbW9uaXRvci4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU291cmNlRm9sZGVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHNvdXJjZUZvbGRlciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgLy8gQWRkICJzcmMiIHRvIGNsYXNzIHBhdGgKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihzb3VyY2VGb2xkZXIpOwotCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgZW50cmllcyA9IHJlbW92ZVNvdXJjZUNsYXNzcGF0aChlbnRyaWVzLCBzcmNGb2xkZXIpOwotICAgICAgICBlbnRyaWVzID0gcmVtb3ZlU291cmNlQ2xhc3NwYXRoKGVudHJpZXMsIHNyY0ZvbGRlci5nZXRQYXJlbnQoKSk7Ci0KLSAgICAgICAgZW50cmllcyA9IFByb2plY3RIZWxwZXIuYWRkRW50cnlUb0NsYXNzcGF0aChlbnRyaWVzLAotICAgICAgICAgICAgICAgIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0ZvbGRlci5nZXRGdWxsUGF0aCgpKSk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZvbGRlciBmcm9tIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMgaWYKLSAgICAgKiBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBjbGFzcyBwYXRoIGVudHJpZXMgdG8gcmVhZC4gQSBjb3B5IHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIGZvbGRlciBUaGUgcGFyZW50IHNvdXJjZSBmb2xkZXIgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gQSBuZXcgY2xhc3MgcGF0aCBlbnRyaWVzIGFycmF5LgotICAgICAqLwotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gcmVtb3ZlU291cmNlQ2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElDb250YWluZXIgZm9sZGVyKSB7Ci0gICAgICAgIGlmIChmb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgICAgIH0KLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5IHNvdXJjZSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGZvbGRlci5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgaW50IG4gPSBlbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0uZXF1YWxzKHNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtuIC0gMV07Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGkpOwotICAgICAgICAgICAgICAgIGlmIChpIDwgbiAtIDEpIFN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgaSArIDEsIG5ld0VudHJpZXMsIGksIG4gLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgbi0tOwotICAgICAgICAgICAgICAgIGVudHJpZXMgPSBuZXdFbnRyaWVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBnaXZlbiBmaWxlIGZyb20gb3VyIHJlc291cmNlIGZvbGRlciB0byB0aGUgbmV3IHByb2plY3QuCi0gICAgICogRXhwZWN0cyB0aGUgZmlsZSB0byB0aGUgVVMtQVNDSUkgb3IgVVRGLTggZW5jb2RlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBmcm9tIElGaWxlIGlmIGZhaWxpbmcgdG8gY3JlYXRlIHRoZSBuZXcgZmlsZS4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBmcm9tIFVSTCBpZiBmYWlsaW5nIHRvIGludGVycHJldCB0aGUgVVJMLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZyb20gUmFuZG9tQWNjZXNzRmlsZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGZyb20gUmFuZG9tQWNjZXNzRmlsZS5sZW5ndGgoKSBpZiBjYW4ndCBkZXRlcm1pbmUgdGhlCi0gICAgICogICAgICAgICBsZW5ndGguCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKFN0cmluZyByZXNvdXJjZUZpbGVuYW1lLCBJRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGUuCi0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IEFkdFBsdWdpbi5yZWFkRW1iZWRkZWRUZXh0RmlsZSgKLSAgICAgICAgICAgICAgICBURU1QTEFURVNfRElSRUNUT1JZICsgcmVzb3VyY2VGaWxlbmFtZSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBhbGwga2V5d29yZCBwYXJhbWV0ZXJzCi0gICAgICAgIHRlbXBsYXRlID0gcmVwbGFjZVBhcmFtZXRlcnModGVtcGxhdGUsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIC8vIFNhdmUgaW4gdGhlIHByb2plY3QgYXMgVVRGLTgKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRlbXBsYXRlLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXN0RmlsZS5jcmVhdGUoc3RyZWFtLCBmYWxzZSAvKiBmb3JjZSAqLywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHdpemFyZCBsb2dvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gQWR0UGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihQUk9KRUNUX0xPR09fTEFSR0UpOwotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgZm91bmQgaW4gYSBzdHJpbmcgd2l0aCB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciBwbGFjZWhvbGRlcnMuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgYSBtYXAgb2YgPHBsYWNlaG9sZGVyLCBWYWx1ZT4gdG8gc2VhcmNoIGZvciBpbiB0aGUgc3RyaW5nCi0gICAgICogQHJldHVybiBBIG5ldyBTdHJpbmcgb2JqZWN0IHdpdGggdGhlIHBsYWNlaG9sZGVyIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVBhcmFtZXRlcnMoU3RyaW5nIHN0ciwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcGFyYW1ldGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKGVudHJ5LmdldEtleSgpLCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdUZXN0UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdUZXN0UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGZkOTlkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3Byb2plY3QvTmV3VGVzdFByb2plY3RDcmVhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFJlZmVyZW5jZXM6Ci0gKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5KYXZhUHJvamVjdFdpemFyZAotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRGaXJzdFBhZ2UKLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0Q2hvb3NlckhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkazsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLlNkay5JVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdQcm9qZWN0Q3JlYXRpb25QYWdlLklNYWluSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5uZXdwcm9qZWN0Lk5ld1Byb2plY3RDcmVhdGlvblBhZ2UuTWFpbkluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0cy5TZGtUYXJnZXRTZWxlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5VUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIE5ld0FuZHJvaWRQcm9qZWN0Q3JlYXRpb25QYWdlIGlzIGEgcHJvamVjdCBjcmVhdGlvbiBwYWdlIHRoYXQgcHJvdmlkZXMgdGhlCi0gKiBmb2xsb3dpbmcgZmllbGRzOgotICogPHVsPgotICogPGxpPiBQcm9qZWN0IG5hbWUKLSAqIDxsaT4gU0RLIFRhcmdldAotICogPGxpPiBBcHBsaWNhdGlvbiBuYW1lCi0gKiA8bGk+IFBhY2thZ2UgbmFtZQotICogPGxpPiBBY3Rpdml0eSBuYW1lCi0gKiA8L3VsPgotICogTm90ZTogdGhpcyBjbGFzcyBpcyBwdWJsaWMgc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB1bml0IHRlc3RzLgotICogSXQgaXMgaG93ZXZlciBhbiBpbnRlcm5hbCBjbGFzcy4gSXRzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICogSXQgc2hvdWxkIHNlbWFudGljYWxseSBiZSBjb25zaWRlcmVkIGFzIGEgcHJpdmF0ZSBmaW5hbCBjbGFzcy4KLSAqIERvIG5vdCBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3VGVzdFByb2plY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUdFX05BTUUgPSAibmV3QW5kcm9pZFRlc3RQcm9qZWN0UGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBJbml0aWFsIHZhbHVlIGZvciBhbGwgbmFtZSBmaWVsZHMgKHByb2plY3QsIGFjdGl2aXR5LCBhcHBsaWNhdGlvbiwgcGFja2FnZSkuIFVzZWQKLSAgICAgKiB3aGVuZXZlciBhIHZhbHVlIGlzIHJlcXVlc3RlZCBiZWZvcmUgY29udHJvbHMgYXJlIGNyZWF0ZWQuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfTkFNRSA9ICIiOyAgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBJbml0aWFsIHZhbHVlIGZvciB0aGUgVXNlIERlZmF1bHQgTG9jYXRpb24gY2hlY2sgYm94LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVElBTF9VU0VfREVGQVVMVF9MT0NBVElPTiA9IHRydWU7Ci0gICAgLyoqIEluaXRpYWwgdmFsdWUgZm9yIHRoZSBDcmVhdGUgVGVzdCBQcm9qZWN0IGNoZWNrIGJveC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxfQ1JFQVRFX1RFU1RfUFJPSkVDVCA9IGZhbHNlOwotCi0KLSAgICAvKiogUGF0dGVybiBmb3IgY2hhcmFjdGVycyBhY2NlcHRlZCBpbiBhIHByb2plY3QgbmFtZS4gU2luY2UgdGhpcyB3aWxsIGJlIHVzZWQgYXMgYQotICAgICAqIGRpcmVjdG9yeSBuYW1lLCB3ZSdyZSBiZWluZyBhIGJpdCBjb25zZXJ2YXRpdmUgb24gcHVycG9zZS4gSXQgY2Fubm90IHN0YXJ0IHdpdGggYSBzcGFjZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNQcm9qZWN0TmFtZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5bXFx3XVtcXHcuIC1dKiQiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAvKiogTGFzdCB1c2VyLWJyb3dzZWQgbG9jYXRpb24sIHN0YXRpYyBzbyB0aGF0IGl0IGJlIHJlbWVtYmVyZWQgZm9yIHRoZSB3aG9sZSBzZXNzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNDdXN0b21Mb2NhdGlvbk9zUGF0aCA9ICIiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgTVNHX05PTkUgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IE1TR19XQVJOSU5HID0gMTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBNU0dfRVJST1IgPSAyOwotCi0gICAgLyoqIFN0cnVjdHVyZSB3aXRoIHRoZSBleHRlcm5hbGx5IHZpc2libGUgaW5mb3JtYXRpb24gZnJvbSB0aGlzIFRlc3QgUHJvamVjdCBwYWdlLiAqLwotICAgIHByaXZhdGUgZmluYWwgVGVzdEluZm8gbUluZm8gPSBuZXcgVGVzdEluZm8oKTsKLSAgICAvKiogU3RydWN0dXJlIHdpdGggdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNYWluIFByb2plY3QgcGFnZS4KLSAgICAgKiAgVGhpcyBpcyBudWxsIGlmIHRoZXJlJ3Mgbm8gc3VjaCBwYWdlLCBtZWFuaW5nIHRoZSB0ZXN0IHByb2plY3QgcGFnZSBpcyBzdGFuZGFsb25lLiAqLwotICAgIHByaXZhdGUgSU1haW5JbmZvIG1NYWluSW5mbzsKLQotICAgIC8vIHdpZGdldHMKLSAgICBwcml2YXRlIFRleHQgbVByb2plY3ROYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1QYWNrYWdlTmFtZUZpZWxkOwotICAgIHByaXZhdGUgVGV4dCBtQXBwbGljYXRpb25OYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVVzZURlZmF1bHRMb2NhdGlvbjsKLSAgICBwcml2YXRlIExhYmVsIG1Mb2NhdGlvbkxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBtTG9jYXRpb25QYXRoRmllbGQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgbU1pblNka1ZlcnNpb25GaWVsZDsKLSAgICBwcml2YXRlIFNka1RhcmdldFNlbGVjdG9yIG1TZGtUYXJnZXRTZWxlY3RvcjsKLSAgICBwcml2YXRlIElUYXJnZXRDaGFuZ2VMaXN0ZW5lciBtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUNyZWF0ZVRlc3RQcm9qZWN0RmllbGQ7Ci0gICAgcHJpdmF0ZSBUZXh0IG1UZXN0ZWRQcm9qZWN0TmFtZUZpZWxkOwotICAgIHByaXZhdGUgQnV0dG9uIG1Qcm9qZWN0QnJvd3NlQnV0dG9uOwotICAgIHByaXZhdGUgUHJvamVjdENob29zZXJIZWxwZXIgbVByb2plY3RDaG9vc2VySGVscGVyOwotICAgIHByaXZhdGUgQnV0dG9uIG1UZXN0U2VsZlByb2plY3RSYWRpbzsKLSAgICBwcml2YXRlIEJ1dHRvbiBtVGVzdEV4aXN0aW5nUHJvamVjdFJhZGlvOwotCi0gICAgLyoqIEEgbGlzdCBvZiBjb21wb3NpdGVzIHRoYXQgYXJlIGRpc2FibGVkIHdoZW4gdGhlICJDcmVhdGUgVGVzdCBQcm9qZWN0IiB0b2dnbGUgaXMgb2ZmLiAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PENvbXBvc2l0ZT4gbVRvZ2dsZUNvbXBvc2l0ZXMgPSBuZXcgQXJyYXlMaXN0PENvbXBvc2l0ZT4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxQcm9qZWN0TmFtZVVwZGF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsTG9jYXRpb25QYXRoVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxQYWNrYWdlTmFtZVVwZGF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsQXBwbGljYXRpb25OYW1lVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxTZGtUYXJnZXRVcGRhdGU7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBtRXhpc3RpbmdUZXN0ZWRQcm9qZWN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFwcGxpY2F0aW9uTmFtZU1vZGlmaWVkQnlVc2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFja2FnZU5hbWVNb2RpZmllZEJ5VXNlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU1pblNka1ZlcnNpb25Nb2RpZmllZEJ5VXNlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNka1RhcmdldE1vZGlmaWVkQnlVc2VyOwotCi0gICAgcHJpdmF0ZSBMYWJlbCBtVGVzdFRhcmdldFBhY2thZ2VMYWJlbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RXhpc3RpbmdQYWNrYWdlTmFtZTsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZCBwYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBOZXdUZXN0UHJvamVjdENyZWF0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoVEVTVF9QQUdFX05BTUUpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRUaXRsZSgiTmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgbmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0IHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIC8vIC0tLSBHZXR0ZXJzIHVzZWQgYnkgTmV3UHJvamVjdFdpemFyZCAtLS0KLQotICAgIC8qKgotICAgICAqIFN0cnVjdHVyZSB0aGF0IGNvbGxlY3RzIGFsbCBleHRlcm5hbGx5IHZpc2libGUgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHBhZ2UuCi0gICAgICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBjYWxsaW5nIHdpemFyZCB0byBhY3R1YWxseSBkbyB0aGUgd29yayBvciBieSBvdGhlciBwYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgVGVzdEluZm8gewotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgVGVzdCBQcm9qZWN0IHNob3VsZCBiZSBjcmVhdGVkLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVUZXN0UHJvamVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3JlYXRlVGVzdFByb2plY3RGaWVsZCA9PSBudWxsID8gdHJ1ZSA6IG1DcmVhdGVUZXN0UHJvamVjdEZpZWxkLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvamVjdCBsb2NhdGlvbiBwYXRoIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIsIG9yIGl0cwotICAgICAgICAgKiBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLiBOb3RlIHRoYXQgaWYgdGhlIGRlZmF1bHQgaGFzIGJlZW4gcmV0dXJuZWQgdGhlCi0gICAgICAgICAqIHBhdGggaW4gYSBwcm9qZWN0IGRlc2NyaXB0aW9uIHVzZWQgdG8gY3JlYXRlIGEgcHJvamVjdCBzaG91bGQgbm90IGJlIHNldC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgcHJvamVjdCBsb2NhdGlvbiBwYXRoIG9yIGl0cyBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIElQYXRoIGdldExvY2F0aW9uUGF0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aChnZXRQcm9qZWN0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb2plY3QgbmFtZSBmaWVsZCB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyByZW1vdmVkLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9qZWN0TmFtZUZpZWxkID09IG51bGwgPyBJTklUSUFMX05BTUUgOiBtUHJvamVjdE5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwYWNrYWdlIG5hbWUgZmllbGQgd2l0aCBzcGFjZXMgdHJpbW1lZC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWVGaWVsZCA9PSBudWxsID8gSU5JVElBTF9OQU1FIDogbVBhY2thZ2VOYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdGVzdCB0YXJnZXQgcGFja2FnZSBuYW1lIGZpZWxkIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRlc3RUYXJnZXRQYWNrYWdlTGFiZWwgPT0gbnVsbCA/IElOSVRJQUxfTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtVGVzdFRhcmdldFBhY2thZ2VMYWJlbC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtaW4gc2RrIHZlcnNpb24gZmllbGQgd2l0aCBzcGFjZXMgdHJpbW1lZC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNaW5TZGtWZXJzaW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW5TZGtWZXJzaW9uRmllbGQgPT0gbnVsbCA/ICIiIDogbU1pblNka1ZlcnNpb25GaWVsZC5nZXRUZXh0KCkudHJpbSgpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGZpZWxkIHdpdGggc3BhY2VzIHRyaW1tZWQuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCkgewotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhY3Rpdml0eSBhcyBkZWZhdWx0IGFwcGxpY2F0aW9uIG5hbWUuCi0gICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uTmFtZUZpZWxkID09IG51bGwgPyAiIiA6IG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBVc2UgRGVmYXVsdCBMb2NhdGlvbiBmaWVsZC4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlRGVmYXVsdExvY2F0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Vc2VEZWZhdWx0TG9jYXRpb24gPT0gbnVsbCA/IElOSVRJQUxfVVNFX0RFRkFVTFRfTE9DQVRJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtVXNlRGVmYXVsdExvY2F0aW9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHRoZSBkZWZhdWx0ICJzcmMiIGNvbnN0YW50LiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZvbGRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBTZGtDb25zdGFudHMuRkRfU09VUkNFUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNkayB0YXJnZXQgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNlbGVjdGVkIHlldC4gKi8KLSAgICAgICAgcHVibGljIElBbmRyb2lkVGFyZ2V0IGdldFNka1RhcmdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2RrVGFyZ2V0U2VsZWN0b3IgPT0gbnVsbCA/IG51bGwgOiBtU2RrVGFyZ2V0U2VsZWN0b3IuZ2V0U2VsZWN0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGVzdGluZ1NlbGYoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1haW5JbmZvID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAobVRlc3RTZWxmUHJvamVjdFJhZGlvID09IG51bGwgPyBmYWxzZSA6IG1UZXN0U2VsZlByb2plY3RSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3RpbmdNYWluKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NYWluSW5mbyAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUZXN0aW5nRXhpc3RpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1haW5JbmZvID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAobVRlc3RFeGlzdGluZ1Byb2plY3RSYWRpbyA9PSBudWxsID8gZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVRlc3RFeGlzdGluZ1Byb2plY3RSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSVByb2plY3QgZ2V0RXhpc3RpbmdUZXN0ZWRQcm9qZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeGlzdGluZ1Rlc3RlZFByb2plY3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFRlc3RJbmZvfSBzdHJ1Y3R1cmUgdGhhdCBjb2xsZWN0cyBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGluZm9ybWF0aW9uCi0gICAgICogZnJvbSB0aGlzIHBhZ2UuIFRoaXMgaXMgdXNlZCBieSB0aGUgY2FsbGluZyB3aXphcmQgdG8gYWN0dWFsbHkgZG8gdGhlIHdvcmsgb3IgYnkgb3RoZXIgcGFnZXMuCi0gICAgICovCi0gICAgcHVibGljIFRlc3RJbmZvIGdldFRlc3RJbmZvKCkgewotICAgICAgICByZXR1cm4gbUluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JhYnMgdGhlIHtAbGluayBNYWluSW5mb30gc3RydWN0dXJlIHdpdGggdmlzaWJsZSBwYXJhbWV0ZXJzIGZyb20gdGhlIG1haW4gcHJvamVjdCBwYWdlLgotICAgICAqIFRoaXMgbWF5IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFpbkluZm8oSU1haW5JbmZvIG1haW5JbmZvKSB7Ci0gICAgICAgIG1NYWluSW5mbyA9IG1haW5JbmZvOwotICAgIH0KLQotICAgIC8vIC0tLSBVSSBjcmVhdGlvbiAtLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIGRpYWxvZyBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQKLSAgICAgKiBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgY3JlYXRlVG9nZ2xlVGVzdFByb2plY3QoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlVGVzdFByb2plY3RHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVMb2NhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVRlc3RUYXJnZXRHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVUYXJnZXRHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVQcm9wZXJ0aWVzR3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUgdGhlIGZpcnN0IHRpbWUKLSAgICAgICAgZW5hYmxlTG9jYXRpb25XaWRnZXRzKCk7Ci0KLSAgICAgICAgLy8gU2hvdyBkZXNjcmlwdGlvbiB0aGUgZmlyc3QgdGltZQotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLQotICAgICAgICAvLyBWYWxpZGF0ZS4gVGhpcyB3aWxsIGNvbXBsYWluIGFib3V0IHRoZSBmaXJzdCBlbXB0eSBmaWVsZC4KLSAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgQERpYWxvZ1BhZ2Uuc2V0VmlzaWJsZShib29sZWFuKSB0byBwdXQgdGhlIGZvY3VzIGluIHRoZSBwcm9qZWN0IG5hbWUgd2hlbgotICAgICAqIHRoZSBkaWFsb2cgaXMgbWFkZSB2aXNpYmxlIGFuZCB0byBhbHNvIHVwZGF0ZSB0aGUgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZSBvZiBzb21lCi0gICAgICogY29udHJvbHMgKGRvaW5nIHNvIGluIGNyZWF0ZUNvbnRyb2wgZG9lc24ndCBhbHdheXMgY2hhbmdlIHRoZWlyIHN0YXRlIHNvbWVob3cuKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBtUHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotICAgICAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIG9uQ3JlYXRlVGVzdFByb2plY3RUb2dnbGUoKTsKLSAgICAgICAgICAgIG9uRXhpc3RpbmdQcm9qZWN0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotICAgICAgICBpZiAobVNka1RhcmdldENoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFkdFBsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlVGFyZ2V0TGlzdGVuZXIobVNka1RhcmdldENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgImNyZWF0ZSB0ZXN0IHByb2plY3QiIGNoZWNrYm94IGJ1dCBvbmx5IGlmIHRoZXJlJ3MgYSBtYWluIHBhZ2UgaW4gdGhlIHdpemFyZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlVG9nZ2xlVGVzdFByb2plY3QoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIGlmIChtTWFpbkluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgbUNyZWF0ZVRlc3RQcm9qZWN0RmllbGQgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgICAgIG1DcmVhdGVUZXN0UHJvamVjdEZpZWxkLnNldFRleHQoIkNyZWF0ZSBhIFRlc3QgUHJvamVjdCIpOwotICAgICAgICAgICAgbUNyZWF0ZVRlc3RQcm9qZWN0RmllbGQuc2V0VG9vbFRpcFRleHQoIlNlbGVjdCB0aGlzIGlmIHlvdSBhbHNvIHdhbnQgdG8gY3JlYXRlIGEgVGVzdCBQcm9qZWN0LiIpOwotICAgICAgICAgICAgbUNyZWF0ZVRlc3RQcm9qZWN0RmllbGQuc2V0U2VsZWN0aW9uKElOSVRJQUxfQ1JFQVRFX1RFU1RfUFJPSkVDVCk7Ci0gICAgICAgICAgICBtQ3JlYXRlVGVzdFByb2plY3RGaWVsZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uQ3JlYXRlVGVzdFByb2plY3RUb2dnbGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGdyb3VwIGZvciB0aGUgcHJvamVjdCBuYW1lOgotICAgICAqIFtsYWJlbDogIlByb2plY3QgTmFtZSJdIFt0ZXh0IGZpZWxkXQotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVUZXN0UHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBtVG9nZ2xlQ29tcG9zaXRlcy5hZGQoZ3JvdXApOwotCi0gICAgICAgIC8vIC0tLSB0ZXN0IHByb2plY3QgbmFtZSAtLS0KLQotICAgICAgICAvLyBuZXcgcHJvamVjdCBsYWJlbAotICAgICAgICBTdHJpbmcgdG9vbHRpcCA9ICJOYW1lIG9mIHRoZSBFY2xpcHNlIHRlc3QgcHJvamVjdCB0byBjcmVhdGUuIEl0IGNhbm5vdCBiZSBlbXB0eS4iOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJUZXN0IFByb2plY3QgTmFtZToiKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0KLSAgICAgICAgLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBtUHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBtUHJvamVjdE5hbWVGaWVsZC5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLSAgICAgICAgbVByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbVByb2plY3ROYW1lRmllbGQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbVByb2plY3ROYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1JbnRlcm5hbFByb2plY3ROYW1lVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0TmFtZU1vZGlmaWVkQnlVc2VyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlTG9jYXRpb25QYXRoRmllbGQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUxvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgIC8vIC0tLSBwcm9qZWN0IGxvY2F0aW9uIC0tLQotCi0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgLyogbnVtIGNvbHVtbnMgKi8KLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBjb2x1bW5zIG9mIG5vdCBlcXVhbCBzaXplICovKSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBncm91cC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBncm91cC5zZXRUZXh0KCJDb250ZW50Iik7Ci0KLSAgICAgICAgbVRvZ2dsZUNvbXBvc2l0ZXMuYWRkKGdyb3VwKTsKLQotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtVXNlRGVmYXVsdExvY2F0aW9uLnNldFRleHQoIlVzZSBkZWZhdWx0IGxvY2F0aW9uIik7Ci0gICAgICAgIG1Vc2VEZWZhdWx0TG9jYXRpb24uc2V0U2VsZWN0aW9uKElOSVRJQUxfVVNFX0RFRkFVTFRfTE9DQVRJT04pOwotCi0gICAgICAgIG1Vc2VEZWZhdWx0TG9jYXRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgICAgICBlbmFibGVMb2NhdGlvbldpZGdldHMoKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIG1Mb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1Mb2NhdGlvbkxhYmVsLnNldFRleHQoIkxvY2F0aW9uOiIpOwotCi0gICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCAvKiBob3Jpem9udGFsIGFsaWdubWVudCAqLwotICAgICAgICAgICAgICAgIEdyaWREYXRhLkJFR0lOTklORywgLyogdmVydGljYWwgYWxpZ25tZW50ICovCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgKi8KLSAgICAgICAgICAgICAgICBmYWxzZSwgLyogZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgKi8KLSAgICAgICAgICAgICAgICAxLCAgICAgLyogaG9yaXpvbnRhbFNwYW4gKi8KLSAgICAgICAgICAgICAgICAxKTsgICAgLyogdmVydGljYWxTcGFuICovCi0gICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtTG9jYXRpb25QYXRoRmllbGQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbUxvY2F0aW9uUGF0aEZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgIG9uTG9jYXRpb25QYXRoRmllbGRNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotICAgICAgICBtQnJvd3NlQnV0dG9uLnNldFRleHQoIkJyb3dzZS4uLiIpOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKG1Ccm93c2VCdXR0b24pOwotICAgICAgICBtQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25PcGVuRGlyZWN0b3J5QnJvd3NlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBncm91cCBmb3IgVGVzdCBUYXJnZXQgb3B0aW9ucy4KLSAgICAgKgotICAgICAqIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IG1vZGVzIGhlcmU6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5XaGVuIG1NYWluSW5mbyBleGlzdHMsIHRoaXMgaXMgcGFydCBvZiBhIG5ldyBBbmRyb2lkIFByb2plY3QuIEluIHdoaWNoIGNhc2UKLSAgICAgKiB0aGUgbmV3IHRlc3QgaXMgdGllZCB0byB0aGUgc29vbi10by1iZSBtYWluIHByb2plY3QgYW5kIHRoZXJlIGlzIGFjdHVhbGx5IG5vIGNob2ljZS4KLSAgICAgKiA8bGk+V2hlbiBtTWFpbkluZm8gZG9lcyBub3QgZXhpc3QsIHRoaXMgaXMgYSBzdGFuZGFsb25lIG5ldyB0ZXN0IHByb2plY3QuIEluIHRoaXMgY2FzZQotICAgICAqIHdlIG9mZmVyIDIgb3B0aW9ucyBmb3IgdGhlIHRlc3QgdGFyZ2V0OiBzZWxmIHRlc3Qgb3IgYWdhaW5zdCBhbiBleGlzdGluZyBBbmRyb2lkIHByb2plY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlVGVzdFRhcmdldEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dCgiVGVzdCBUYXJnZXQiKTsKLQotICAgICAgICBtVG9nZ2xlQ29tcG9zaXRlcy5hZGQoZ3JvdXApOwotCi0gICAgICAgIGlmIChtTWFpbkluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU3RhbmRhbG9uZSBtb2RlOiBjaG9vc2UgYmV0d2VlbiBzZWxmLXRlc3QgYW5kIGV4aXN0aW5nLXByb2plY3QgdGVzdAotCi0gICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCgiU2VsZWN0IHRoZSBwcm9qZWN0IHRvIHRlc3Q6Iik7Ci0gICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgICAgIG1UZXN0U2VsZlByb2plY3RSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgICAgICBtVGVzdFNlbGZQcm9qZWN0UmFkaW8uc2V0VGV4dCgiVGhpcyBwcm9qZWN0Iik7Ci0gICAgICAgICAgICBtVGVzdFNlbGZQcm9qZWN0UmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICBtVGVzdFNlbGZQcm9qZWN0UmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgICAgIG1UZXN0RXhpc3RpbmdQcm9qZWN0UmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgbVRlc3RFeGlzdGluZ1Byb2plY3RSYWRpby5zZXRUZXh0KCJBbiBleGlzdGluZyBBbmRyb2lkIHByb2plY3QiKTsKLSAgICAgICAgICAgIG1UZXN0RXhpc3RpbmdQcm9qZWN0UmFkaW8uc2V0U2VsZWN0aW9uKG1NYWluSW5mbyA9PSBudWxsKTsKLSAgICAgICAgICAgIG1UZXN0RXhpc3RpbmdQcm9qZWN0UmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBvbkV4aXN0aW5nUHJvamVjdENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgU3RyaW5nIHRvb2x0aXAgPSAiVGhlIGV4aXN0aW5nIEFuZHJvaWQgUHJvamVjdCB0aGF0IGlzIGJlaW5nIHRlc3RlZC4iOwotCi0gICAgICAgICAgICBtVGVzdGVkUHJvamVjdE5hbWVGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgICAgIG1UZXN0ZWRQcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbVRlc3RlZFByb2plY3ROYW1lRmllbGQuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0gICAgICAgICAgICBtVGVzdGVkUHJvamVjdE5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUHJvamVjdEZpZWxkVXBkYXRlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtUHJvamVjdEJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIG1Qcm9qZWN0QnJvd3NlQnV0dG9uLnNldFRleHQoIkJyb3dzZS4uLiIpOwotICAgICAgICAgICAgbVByb2plY3RCcm93c2VCdXR0b24uc2V0VG9vbFRpcFRleHQoIkFsbG93cyB5b3UgdG8gc2VsZWN0IHRoZSBBbmRyb2lkIHByb2plY3QgdG8gdGVzdC4iKTsKLSAgICAgICAgICAgIG1Qcm9qZWN0QnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgIG9uUHJvamVjdEJyb3dzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtUHJvamVjdENob29zZXJIZWxwZXIgPSBuZXcgUHJvamVjdENob29zZXJIZWxwZXIocGFyZW50LmdldFNoZWxsKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUGFydCBvZiBOUFcgbW9kZTogbm8gc2VsZWN0aW9uLgotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBwYWNrYWdlIGxhYmVsIGxpbmUKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJUZXN0IFRhcmdldCBQYWNrYWdlOiIpOwotICAgICAgICBtVGVzdFRhcmdldFBhY2thZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG1UZXN0VGFyZ2V0UGFja2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHRhcmdldCBncm91cC4KLSAgICAgKiBJdCBvbmx5IGNvbnRhaW5zIGFuIFNka1RhcmdldFNlbGVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUYXJnZXRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICAvLyBMYXlvdXQgaGFzIDEgY29sdW1uCi0gICAgICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGdyb3VwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIkJ1aWxkIFRhcmdldCIpOwotCi0gICAgICAgIG1Ub2dnbGVDb21wb3NpdGVzLmFkZChncm91cCk7Ci0KLSAgICAgICAgLy8gVGhlIHNlbGVjdG9yIGlzIGNyZWF0ZWQgd2l0aG91dCB0YXJnZXRzLiBUaGV5IGFyZSBhZGRlZCBiZWxvdyBpbiB0aGUgY2hhbmdlIGxpc3RlbmVyLgotICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3IgPSBuZXcgU2RrVGFyZ2V0U2VsZWN0b3IoZ3JvdXAsIG51bGwpOwotCi0gICAgICAgIG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2plY3RUYXJnZXRDaGFuZ2UoSVByb2plY3QgY2hhbmdlZFByb2plY3QpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25UYXJnZXRzTG9hZGVkKCkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2RrIHRhcmdldCBzZWxlY3RvciB3aXRoIHRoZSBuZXcgdGFyZ2V0cwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIHNkawotICAgICAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKFNkay5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRzID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TZGtUYXJnZXRTZWxlY3Rvci5zZXRUYXJnZXRzKHRhcmdldHMpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0YXJnZXQsIHNlbGVjdCBpdAotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uKHRhcmdldHNbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZFRhcmdldExpc3RlbmVyKG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgLy8gSW52b2tlIGl0IG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0cwotICAgICAgICBtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXIub25UYXJnZXRzTG9hZGVkKCk7Ci0KLSAgICAgICAgbVNka1RhcmdldFNlbGVjdG9yLnNldFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25TZGtUYXJnZXRNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkKG51bGwpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGdyb3VwIGZvciB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzOgotICAgICAqIC0gUGFja2FnZSBuYW1lIFt0ZXh0IGZpZWxkXQotICAgICAqIC0gQWN0aXZpdHkgbmFtZSBbdGV4dCBmaWVsZF0KLSAgICAgKiAtIEFwcGxpY2F0aW9uIG5hbWUgW3RleHQgZmllbGRdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbiBncm91cAotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dCgiUHJvcGVydGllcyIpOwotCi0gICAgICAgIG1Ub2dnbGVDb21wb3NpdGVzLmFkZChncm91cCk7Ci0KLSAgICAgICAgLy8gbmV3IGFwcGxpY2F0aW9uIGxhYmVsCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkFwcGxpY2F0aW9uIG5hbWU6Iik7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIGxhYmVsLnNldFRvb2xUaXBUZXh0KCJOYW1lIG9mIHRoZSBBcHBsaWNhdGlvbi4gVGhpcyBpcyBhIGZyZWUgc3RyaW5nLiBJdCBjYW4gYmUgZW1wdHkuIik7Ci0KLSAgICAgICAgLy8gbmV3IGFwcGxpY2F0aW9uIG5hbWUgZW50cnkgZmllbGQKLSAgICAgICAgbUFwcGxpY2F0aW9uTmFtZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5zZXRUb29sVGlwVGV4dCgiTmFtZSBvZiB0aGUgQXBwbGljYXRpb24uIFRoaXMgaXMgYSBmcmVlIHN0cmluZy4gSXQgY2FuIGJlIGVtcHR5LiIpOwotICAgICAgICBtQXBwbGljYXRpb25OYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbUFwcGxpY2F0aW9uTmFtZUZpZWxkLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIG1BcHBsaWNhdGlvbk5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICBpZiAoIW1JbnRlcm5hbEFwcGxpY2F0aW9uTmFtZVVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbk5hbWVNb2RpZmllZEJ5VXNlciA9IHRydWU7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gbmV3IHBhY2thZ2UgbGFiZWwKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiUGFja2FnZSBuYW1lOiIpOwotICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCgiTmFtZXNwYWNlIG9mIHRoZSBQYWNrYWdlIHRvIGNyZWF0ZS4gVGhpcyBtdXN0IGJlIGEgSmF2YSBuYW1lc3BhY2Ugd2l0aCBhdCBsZWFzdCB0d28gY29tcG9uZW50cy4iKTsKLQotICAgICAgICAvLyBuZXcgcGFja2FnZSBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkLnNldFRvb2xUaXBUZXh0KCJOYW1lc3BhY2Ugb2YgdGhlIFBhY2thZ2UgdG8gY3JlYXRlLiBUaGlzIG11c3QgYmUgYSBKYXZhIG5hbWVzcGFjZSB3aXRoIGF0IGxlYXN0IHR3byBjb21wb25lbnRzLiIpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmICghbUludGVybmFsUGFja2FnZU5hbWVVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lTW9kaWZpZWRCeVVzZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvblBhY2thZ2VOYW1lRmllbGRNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBtaW4gc2RrIHZlcnNpb24gbGFiZWwKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiTWluIFNESyBWZXJzaW9uOiIpOwotICAgICAgICBsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCgiVGhlIG1pbmltdW0gU0RLIHZlcnNpb24gbnVtYmVyIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzLiBNdXN0IGJlIGFuIGludGVnZXIgPiAwLiBJdCBjYW4gYmUgZW1wdHkuIik7Ci0KLSAgICAgICAgLy8gbWluIHNkayB2ZXJzaW9uIGVudHJ5IGZpZWxkCi0gICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIlRoZSBtaW5pbXVtIFNESyB2ZXJzaW9uIG51bWJlciB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcy4gTXVzdCBiZSBhbiBpbnRlZ2VyID4gMC4gSXQgY2FuIGJlIGVtcHR5LiIpOwotICAgICAgICBtTWluU2RrVmVyc2lvbkZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgbU1pblNka1ZlcnNpb25GaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9uTWluU2RrVmVyc2lvbkZpZWxkTW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIC8vLS0tIEludGVybmFsIGdldHRlcnMgJiBzZXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIFJldHVybnMgdGhlIGxvY2F0aW9uIHBhdGggZmllbGQgdmFsdWUgd2l0aCBzcGFjZXMgdHJpbW1lZC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvblBhdGhGaWVsZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbUxvY2F0aW9uUGF0aEZpZWxkID09IG51bGwgPyAiIiA6IG1Mb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCkudHJpbSgpOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb2plY3QgbG9jYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgVXNlIERlZmF1bHQgTG9jYXRpb24gY2hlY2sgYm94LiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3RMb2NhdGlvbigpIHsKLSAgICAgICAgaWYgKG1JbmZvLnVzZURlZmF1bHRMb2NhdGlvbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uUGF0aEZpZWxkVmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9qZWN0IHJlc291cmNlIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBuYW1lIGZpZWxkCi0gICAgICogdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIHRoZSBwcm9qZWN0IHJlc291cmNlOyB0aGlzIGlzIHRoZQotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIDxjb2RlPklQcm9qZWN0OjpjcmVhdGU8L2NvZGU+IGludm9rZWQgYnkgdGhlIG5ldwotICAgICAqIHByb2plY3QgcmVzb3VyY2Ugd2l6YXJkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBwcm9qZWN0IHJlc291cmNlIGhhbmRsZQotICAgICAqLwotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEhhbmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtSW5mby5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gVUkgQ2FsbGJhY2tzIC0tLS0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciB0b2dnbGVzIHRoZSAiVGVzdCB0YXJnZXQ6IEV4aXN0aW5nIEFuZHJvaWQgUHJvamVjdCIKLSAgICAgKiBjaGVja2JveC4gSXQgZW5hYmxlcyBvciBkaXNhYmxlIHRoZSBVSSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25FeGlzdGluZ1Byb2plY3RDaGFuZ2VkKCkgewotICAgICAgICBpZiAobUluZm8uaXNUZXN0aW5nRXhpc3RpbmcoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gbVRlc3RFeGlzdGluZ1Byb2plY3RSYWRpby5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIG1UZXN0ZWRQcm9qZWN0TmFtZUZpZWxkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICBtUHJvamVjdEJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgc2V0RXhpc3RpbmdQcm9qZWN0KG1JbmZvLmdldEV4aXN0aW5nVGVzdGVkUHJvamVjdCgpKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBsb2FkIHRoZSBkZWZhdWx0cyBmcm9tIHRoZSBtYWluIHBhZ2UgaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVzZU1haW5Qcm9qZWN0SW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIGlmIChtSW5mby5pc1Rlc3RpbmdNYWluKCkgJiYgbU1haW5JbmZvICE9IG51bGwpIHsKLQotICAgICAgICAgICAgU3RyaW5nIHByb2pOYW1lID0gU3RyaW5nLmZvcm1hdCgiJTEkc1Rlc3QiLCBtTWFpbkluZm8uZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXBwTmFtZSA9IFN0cmluZy5mb3JtYXQoIiUxJHNUZXN0IiwgbU1haW5JbmZvLmdldEFwcGxpY2F0aW9uTmFtZSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbU1haW5JbmZvLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZVRlc3RUYXJnZXRQYWNrYWdlRmllbGQocGFja2FnZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAoIW1Qcm9qZWN0TmFtZU1vZGlmaWVkQnlVc2VyKSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsUHJvamVjdE5hbWVVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldFRleHQocHJvak5hbWUpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1JbnRlcm5hbFByb2plY3ROYW1lVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbUFwcGxpY2F0aW9uTmFtZU1vZGlmaWVkQnlVc2VyKSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsQXBwbGljYXRpb25OYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25OYW1lRmllbGQuc2V0VGV4dChhcHBOYW1lKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxBcHBsaWNhdGlvbk5hbWVVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtUGFja2FnZU5hbWVNb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgIG1JbnRlcm5hbFBhY2thZ2VOYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLnRlc3QiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZUZpZWxkLnNldFRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIG1JbnRlcm5hbFBhY2thZ2VOYW1lVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVNka1RhcmdldE1vZGlmaWVkQnlVc2VyKSB7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsU2RrVGFyZ2V0VXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uKG1NYWluSW5mby5nZXRTZGtUYXJnZXQoKSk7Ci0gICAgICAgICAgICAgICAgbUludGVybmFsU2RrVGFyZ2V0VXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbU1pblNka1ZlcnNpb25Nb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgIG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1NaW5TZGtWZXJzaW9uRmllbGQuc2V0VGV4dChtTWFpbkluZm8uZ2V0TWluU2RrVmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlIHByb2plY3QgdGV4dCBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25Qcm9qZWN0RmllbGRVcGRhdGVkKCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdCA9IG1UZXN0ZWRQcm9qZWN0TmFtZUZpZWxkLmdldFRleHQoKTsKLQotICAgICAgICAvLyBJcyB0aGlzIGEgdmFsaWQgcHJvamVjdD8KLSAgICAgICAgSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtUHJvamVjdENob29zZXJIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3RzKG51bGwgLypqYXZhTW9kZWwqLyk7Ci0gICAgICAgIGZvciAoSUphdmFQcm9qZWN0IHAgOiBwcm9qZWN0cykgewotICAgICAgICAgICAgaWYgKHAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICBzZXRFeGlzdGluZ1Byb2plY3QocC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHVzZXMgdGhlICJCcm93c2UgUHJvamVjdHMiIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25Qcm9qZWN0QnJvd3NlKCkgewotICAgICAgICBJSmF2YVByb2plY3QgcCA9IG1Qcm9qZWN0Q2hvb3NlckhlbHBlci5jaG9vc2VKYXZhUHJvamVjdChtVGVzdGVkUHJvamVjdE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFeGlzdGluZ1Byb2plY3QocC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgbVRlc3RlZFByb2plY3ROYW1lRmllbGQuc2V0VGV4dChtRXhpc3RpbmdUZXN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RXhpc3RpbmdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgbUV4aXN0aW5nVGVzdGVkUHJvamVjdCA9IHByb2plY3Q7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIHVwZGF0ZSB0aGUgYXBwbGljYXRpb24sIHBhY2thZ2UsIHNkayB0YXJnZXQgYW5kIG1pblNka1ZlcnNpb24gYWNjb3JkaW5nbHkKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICghbUFwcGxpY2F0aW9uTmFtZU1vZGlmaWVkQnlVc2VyIHx8Ci0gICAgICAgICAgICAgICAgICFtUGFja2FnZU5hbWVNb2RpZmllZEJ5VXNlciAgICAgfHwKLSAgICAgICAgICAgICAgICAgIW1TZGtUYXJnZXRNb2RpZmllZEJ5VXNlciAgICAgICB8fAotICAgICAgICAgICAgICAgICAhbU1pblNka1ZlcnNpb25Nb2RpZmllZEJ5VXNlcikpIHsKLQotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5nZXRNYW5pZmVzdChwcm9qZWN0KTsKLSAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdFBhcnNlciBtYW5pZmVzdERhdGEgPSBudWxsOwotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0RGF0YSA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtYW5pZmVzdERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhcHBOYW1lID0gU3RyaW5nLmZvcm1hdCgiJTEkc1Rlc3QiLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbWFuaWZlc3REYXRhLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWluU2RrVmVyc2lvbiA9IG1hbmlmZXN0RGF0YS5nZXRBcGlMZXZlbFJlcXVpcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgc2RrVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoU2RrLmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNka1RhcmdldCA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KHByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RXhpc3RpbmdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtUHJvamVjdE5hbWVNb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxQcm9qZWN0TmFtZVVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0TmFtZUZpZWxkLnNldFRleHQoYXBwTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbFByb2plY3ROYW1lVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtQXBwbGljYXRpb25OYW1lTW9kaWZpZWRCeVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsQXBwbGljYXRpb25OYW1lVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uTmFtZUZpZWxkLnNldFRleHQoYXBwTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbEFwcGxpY2F0aW9uTmFtZVVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbVBhY2thZ2VOYW1lTW9kaWZpZWRCeVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsUGFja2FnZU5hbWVVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLnRlc3QiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWVGaWVsZC5zZXRUZXh0KHBhY2thZ2VOYW1lKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsUGFja2FnZU5hbWVVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1TZGtUYXJnZXRNb2RpZmllZEJ5VXNlciAmJiBzZGtUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxTZGtUYXJnZXRVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uKHNka1RhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbFNka1RhcmdldFVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbU1pblNka1ZlcnNpb25Nb2RpZmllZEJ5VXNlcikgewotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pblNka1ZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1pblNka1ZlcnNpb25GaWVsZC5zZXRUZXh0KG1pblNka1ZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZGtUYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2RrU2VsZWN0b3JUb01hdGNoTWluU2RrVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbE1pblNka1ZlcnNpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVUZXN0VGFyZ2V0UGFja2FnZUZpZWxkKG1MYXN0RXhpc3RpbmdQYWNrYWdlTmFtZSk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSBhIGRpcmVjdG9yeSBicm93c2VyIGFuZCB1cGRhdGUgdGhlIGxvY2F0aW9uIHBhdGggZmllbGQgd2l0aCB0aGUgc2VsZWN0ZWQgcGF0aAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbk9wZW5EaXJlY3RvcnlCcm93c2VyKCkgewotCi0gICAgICAgIFN0cmluZyBleGlzdGluZ19kaXIgPSBnZXRMb2NhdGlvblBhdGhGaWVsZFZhbHVlKCk7Ci0KLSAgICAgICAgLy8gRGlzYWJsZSB0aGUgcGF0aCBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICAgIGlmIChleGlzdGluZ19kaXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZXhpc3RpbmdfZGlyID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGV4aXN0aW5nX2Rpcik7Ci0gICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBleGlzdGluZ19kaXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhtTG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRkLnNldE1lc3NhZ2UoIkJyb3dzZSBmb3IgZm9sZGVyIik7Ci0gICAgICAgIGRkLnNldEZpbHRlclBhdGgoZXhpc3RpbmdfZGlyKTsKLSAgICAgICAgU3RyaW5nIGFic19kaXIgPSBkZC5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKGFic19kaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlTG9jYXRpb25QYXRoRmllbGQoYWJzX2Rpcik7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgImNyZWF0ZSB0ZXN0IHByb2plY3QiIGNoZWNrYm94IGlzIGNoYW5nZWQuCi0gICAgICogSXQgZW5hYmxlcyBvciBkaXNhYmxlcyBhbGwgVUkgZ3JvdXBzIGFjY29yZGluZ2x5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkNyZWF0ZVRlc3RQcm9qZWN0VG9nZ2xlKCkgewotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBtSW5mby5nZXRDcmVhdGVUZXN0UHJvamVjdCgpOwotICAgICAgICBmb3IgKENvbXBvc2l0ZSBjIDogbVRvZ2dsZUNvbXBvc2l0ZXMpIHsKLSAgICAgICAgICAgIGVuYWJsZUNvbnRyb2woYywgZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNka1RhcmdldFNlbGVjdG9yLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHVzZU1haW5Qcm9qZWN0SW5mb3JtYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOwotICAgIH0KLQotICAgIC8qKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbnRyb2xzOyByZWN1cnNpdmUgZm9yIGNvbXBvc2l0ZSBjb250cm9scy4gKi8KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbChDb250cm9sIGMsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBjLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIGlmIChjIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICBmb3IgKENvbnRyb2wgYzIgOiAoKENvbXBvc2l0ZSkgYykuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgZW5hYmxlQ29udHJvbChjMiwgZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGUgdGhlIGxvY2F0aW9uIHdpZGdldHMgZGVwZW5kaW5nIG9uIHRoZSB1c2VyIHNlbGVjdGlvbjoKLSAgICAgKiB0aGUgbG9jYXRpb24gcGF0aCBpcyBlbmFibGVkIHdoZW4gdXNpbmcgdGhlICJleGlzdGluZyBzb3VyY2UiIG1vZGUgKGkuZS4gbm90IG5ldyBwcm9qZWN0KQotICAgICAqIG9yIGluIG5ldyBwcm9qZWN0IG1vZGUgd2l0aCB0aGUgInVzZSBkZWZhdWx0IGxvY2F0aW9uIiB0dXJuZWQgb2ZmLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmFibGVMb2NhdGlvbldpZGdldHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gdXNlX2RlZmF1bHQgPSBtSW5mby51c2VEZWZhdWx0TG9jYXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiBsb2NhdGlvbl9lbmFibGVkID0gIXVzZV9kZWZhdWx0OwotCi0gICAgICAgIG1Mb2NhdGlvbkxhYmVsLnNldEVuYWJsZWQobG9jYXRpb25fZW5hYmxlZCk7Ci0gICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRFbmFibGVkKGxvY2F0aW9uX2VuYWJsZWQpOwotICAgICAgICBtQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25fZW5hYmxlZCk7Ci0KLSAgICAgICAgdXBkYXRlTG9jYXRpb25QYXRoRmllbGQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbG9jYXRpb24gZGlyZWN0b3J5IHBhdGggZmllbGQuCi0gICAgICogPGJyLz4KLSAgICAgKiBXaGVuIGN1c3RvbSB1c2VyIHNlbGVjdGlvbiBpcyBlbmFibGVkLCB1c2UgdGhlIGFic19kaXIgYXJndW1lbnQgaWYgbm90IG51bGwgYW5kIGFsc28KLSAgICAgKiBzYXZlIGl0IGludGVybmFsbHkuIElmIGFic19kaXIgaXMgbnVsbCwgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCBhYnNfZGlyLiBUaGlzIGFsbG93cyB0aGUKLSAgICAgKiB1c2VyIHNlbGVjdGlvbiB0byBiZSByZW1lbWJlcmVkIHdoZW4gdGhlIHVzZXIgc3dpdGNoZXMgZnJvbSBkZWZhdWx0IHRvIGN1c3RvbS4KLSAgICAgKiA8YnIvPgotICAgICAqIFdoZW4gY3VzdG9tIHVzZXIgc2VsZWN0aW9uIGlzIGRpc2FibGVkLCB1c2UgdGhlIHdvcmtzcGFjZSBkZWZhdWx0IGxvY2F0aW9uIHdpdGggdGhlCi0gICAgICogY3VycmVudCBwcm9qZWN0IG5hbWUuIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBpbnRlcm5hbGx5IGNhY2hlZCBhYnNfZGlyLgotICAgICAqCi0gICAgICogQHBhcmFtIGFic19kaXIgQSBuZXcgYWJzb2x1dGUgZGlyZWN0b3J5IHBhdGggb3IgbnVsbCB0byB1c2UgdGhlIGRlZmF1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkKFN0cmluZyBhYnNfZGlyKSB7Ci0gICAgICAgIGJvb2xlYW4gdXNlX2RlZmF1bHQgPSBtSW5mby51c2VEZWZhdWx0TG9jYXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiBjdXN0b21fbG9jYXRpb24gPSAhdXNlX2RlZmF1bHQ7Ci0KLSAgICAgICAgaWYgKCFtSW50ZXJuYWxMb2NhdGlvblBhdGhVcGRhdGUpIHsKLSAgICAgICAgICAgIG1JbnRlcm5hbExvY2F0aW9uUGF0aFVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tX2xvY2F0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFic19kaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpcmVjdG9yeSB3aXRoIHRoZSAiQnJvd3NlIiBidXR0b24uCi0gICAgICAgICAgICAgICAgICAgIHNDdXN0b21Mb2NhdGlvbk9zUGF0aCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhhYnNfZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpLmVxdWFscyhzQ3VzdG9tTG9jYXRpb25Pc1BhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KHNDdXN0b21Mb2NhdGlvbk9zUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmFwcGVuZChtSW5mby5nZXRQcm9qZWN0TmFtZSgpKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1Mb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbExvY2F0aW9uUGF0aFVwZGF0ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIHBhdGggZmllbGQgaXMgZWl0aGVyIG1vZGlmaWVkIGludGVybmFsbHkgKGZyb20gdXBkYXRlTG9jYXRpb25QYXRoRmllbGQpCi0gICAgICogb3IgbWFudWFsbHkgYnkgdGhlIHVzZXIgd2hlbiB0aGUgY3VzdG9tX2xvY2F0aW9uIG1vZGUgaXMgbm90IHNldC4KLSAgICAgKgotICAgICAqIElnbm9yZSB0aGUgaW50ZXJuYWwgbW9kaWZpY2F0aW9uLiBXaGVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCBtZW1vcml6ZSB0aGUgY2hvaWNlIGFuZAotICAgICAqIHZhbGlkYXRlIHRoZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbkxvY2F0aW9uUGF0aEZpZWxkTW9kaWZpZWQoKSB7Ci0gICAgICAgIGlmICghbUludGVybmFsTG9jYXRpb25QYXRoVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSB1cGRhdGVzIGRvZXNuJ3QgY29tZSBmcm9tIHVwZGF0ZUxvY2F0aW9uUGF0aEZpZWxkLCBpdCBtdXN0IGJlIHRoZSB1c2VyCi0gICAgICAgICAgICAvLyBlZGl0aW5nIHRoZSBmaWVsZCBtYW51YWxseSwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIHNhdmUgdGhlIHZhbHVlIGludGVybmFsbHkKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gZ2V0TG9jYXRpb25QYXRoRmllbGRWYWx1ZSgpOwotICAgICAgICAgICAgc0N1c3RvbUxvY2F0aW9uT3NQYXRoID0gbmV3UGF0aDsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lIGZpZWxkIGlzIGVpdGhlciBtb2RpZmllZCBpbnRlcm5hbGx5IChmcm9tIGV4dHJhY3ROYW1lc0Zyb21BbmRyb2lkTWFuaWZlc3QpCi0gICAgICogb3IgbWFudWFsbHkgYnkgdGhlIHVzZXIgd2hlbiB0aGUgY3VzdG9tX2xvY2F0aW9uIG1vZGUgaXMgbm90IHNldC4KLSAgICAgKgotICAgICAqIElnbm9yZSB0aGUgaW50ZXJuYWwgbW9kaWZpY2F0aW9uLiBXaGVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLCBtZW1vcml6ZSB0aGUgY2hvaWNlIGFuZAotICAgICAqIHZhbGlkYXRlIHRoZSBwYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblBhY2thZ2VOYW1lRmllbGRNb2RpZmllZCgpIHsKLSAgICAgICAgdXBkYXRlVGVzdFRhcmdldFBhY2thZ2VGaWVsZChudWxsKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSB7QGxpbmsgI21UZXN0VGFyZ2V0UGFja2FnZUxhYmVsfSBmaWVsZC4KLSAgICAgKgotICAgICAqIFdoZW4gdXNpbmcgdGhlICJzZWxmLXRlc3QiIG9wdGlvbiwgdGhlIHBhY2thZ2VOYW1lIGFyZ3VtZW50IGlzIGlnbm9yZWQgYW5kIHRoZQotICAgICAqIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgcHJvamVjdCBwYWNrYWdlIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBPdGhlcndpc2UgdGhlIHBhY2thZ2VOYW1lIGlzIHVzZWQgaWYgaXQgaXMgbm90IG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRlc3RUYXJnZXRQYWNrYWdlRmllbGQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIGlmIChtSW5mby5pc1Rlc3RpbmdTZWxmKCkpIHsKLSAgICAgICAgICAgIG1UZXN0VGFyZ2V0UGFja2FnZUxhYmVsLnNldFRleHQobUluZm8uZ2V0UGFja2FnZU5hbWUoKSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdFRhcmdldFBhY2thZ2VMYWJlbC5zZXRUZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBtaW4gc2RrIHZlcnNpb24gZmllbGQgaGFzIGJlZW4gbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBJZ25vcmUgdGhlIGludGVybmFsIG1vZGlmaWNhdGlvbnMuIFdoZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXIsIHRyeSB0byBtYXRjaAotICAgICAqIGEgdGFyZ2V0IHdpdGggdGhlIHNhbWUgQVBJIGxldmVsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbk1pblNka1ZlcnNpb25GaWVsZE1vZGlmaWVkKCkgewotICAgICAgICBpZiAobUludGVybmFsTWluU2RrVmVyc2lvblVwZGF0ZSB8fCBtSW50ZXJuYWxTZGtUYXJnZXRVcGRhdGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVNka1NlbGVjdG9yVG9NYXRjaE1pblNka1ZlcnNpb24oKTsKLQotICAgICAgICBtTWluU2RrVmVyc2lvbk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnkgdG8gZmluZCBhbiBTREsgVGFyZ2V0IHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBNaW5TZGtWZXJzaW9uLgotICAgICAqCi0gICAgICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIHRhcmdldHMgd2l0aCB0aGUgc2FtZSBzZGsgYXBpIHZlcnNpb24sIHNvIGRvbid0IGNoYW5nZQotICAgICAqIGl0IGlmIGl0J3MgYWxyZWFkeSBhdCB0aGUgcmlnaHQgdmVyc2lvbi4gT3RoZXJ3aXNlIHBpY2sgdGhlIGZpcnN0IHRhcmdldAotICAgICAqIHRoYXQgbWF0Y2hlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2RrU2VsZWN0b3JUb01hdGNoTWluU2RrVmVyc2lvbigpIHsKLSAgICAgICAgU3RyaW5nIG1pblNka1ZlcnNpb24gPSBtSW5mby5nZXRNaW5TZGtWZXJzaW9uKCk7Ci0KLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgY3Vycl90YXJnZXQgPSBtSW5mby5nZXRTZGtUYXJnZXQoKTsKLSAgICAgICAgaWYgKGN1cnJfdGFyZ2V0ICE9IG51bGwgJiYgY3Vycl90YXJnZXQuZ2V0VmVyc2lvbigpLmVxdWFscyhtaW5TZGtWZXJzaW9uKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBtU2RrVGFyZ2V0U2VsZWN0b3IuZ2V0VGFyZ2V0cygpKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0LmdldFZlcnNpb24oKS5lcXVhbHMobWluU2RrVmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICBtU2RrVGFyZ2V0U2VsZWN0b3Iuc2V0U2VsZWN0aW9uKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYW4gU0RLIHRhcmdldCBpcyBtb2RpZmllZC4KLSAgICAgKgotICAgICAqIEFsc28gY2hhbmdlcyB0aGUgbWluU2RrVmVyc2lvbiBmaWVsZCB0byByZWZsZWN0IHRoZSBzZGsgYXBpIGxldmVsIHRoYXQgaGFzCi0gICAgICoganVzdCBiZWVuIHNlbGVjdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNka1RhcmdldE1vZGlmaWVkKCkgewotICAgICAgICBpZiAobUludGVybmFsTWluU2RrVmVyc2lvblVwZGF0ZSB8fCBtSW50ZXJuYWxTZGtUYXJnZXRVcGRhdGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IG1JbmZvLmdldFNka1RhcmdldCgpOwotCi0gICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUludGVybmFsTWluU2RrVmVyc2lvblVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtTWluU2RrVmVyc2lvbkZpZWxkLnNldFRleHQodGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlTdHJpbmcoKSk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxNaW5TZGtWZXJzaW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2RrVGFyZ2V0TW9kaWZpZWRCeVVzZXIgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhZ2UncyBjb250cm9scyBjdXJyZW50bHkgYWxsIGNvbnRhaW4gdmFsaWQgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgY29udHJvbHMgYXJlIHZhbGlkLCBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0gICAgICAgIGludCBzdGF0dXMgPSBNU0dfTk9ORTsKLQotICAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIHZhbGlkYXRlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBjcmVhdGUgYSB0ZXN0IHByb2plY3QKLSAgICAgICAgaWYgKG1JbmZvLmdldENyZWF0ZVRlc3RQcm9qZWN0KCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdEZpZWxkKHdvcmtzcGFjZSk7Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyAmIE1TR19FUlJPUikgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyB8PSB2YWxpZGF0ZUxvY2F0aW9uUGF0aCh3b3Jrc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBNU0dfRVJST1IpID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgfD0gdmFsaWRhdGVUZXN0VGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyAmIE1TR19FUlJPUikgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyB8PSB2YWxpZGF0ZVNka1RhcmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBNU0dfRVJST1IpID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgfD0gdmFsaWRhdGVQYWNrYWdlRmllbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc3RhdHVzICYgTVNHX0VSUk9SKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzIHw9IHZhbGlkYXRlTWluU2RrVmVyc2lvbkZpZWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBNU0dfTk9ORSkgIHsKLSAgICAgICAgICAgIHNldFN0YXR1cyhudWxsLCBNU0dfTk9ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlcmUncyBhbiBlcnJvciBzbyB0aGF0IHRoZSBmaW5pc2ggYnV0dG9uIGJlIGRpc2FibGVkLgotICAgICAgICByZXR1cm4gKHN0YXR1cyAmIE1TR19FUlJPUikgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHBhZ2UgYW5kIHVwZGF0ZXMgdGhlIE5leHQvRmluaXNoIGJ1dHRvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQYWdlQ29tcGxldGUoKSB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IHRhcmdldCAoc2VsZiwgbWFpbiBwcm9qZWN0IG9yIGV4aXN0aW5nIHByb2plY3QpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB3aXphcmQgbWVzc2FnZSB0eXBlLCBvbmUgb2YgTVNHX0VSUk9SLCBNU0dfV0FSTklORyBvciBNU0dfTk9ORS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZVRlc3RUYXJnZXQoKSB7Ci0gICAgICAgIGlmIChtSW5mby5pc1Rlc3RpbmdFeGlzdGluZygpICYmIG1JbmZvLmdldEV4aXN0aW5nVGVzdGVkUHJvamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlBsZWFzZSBzZWxlY3QgYW4gZXhpc3RpbmcgQW5kcm9pZCBwcm9qZWN0IGFzIGEgdGVzdCB0YXJnZXQuIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHByb2plY3QgbmFtZSBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlUHJvamVjdEZpZWxkKElXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7Ci0gICAgICAgIC8vIFZhbGlkYXRlIHByb2plY3QgZmllbGQKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbUluZm8uZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlByb2plY3QgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCIsIE1TR19FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaW1pdCB0aGUgcHJvamVjdCBuYW1lIHRvIHNoZWxsLWFnbm9zdGljIGNoYXJhY3RlcnMgc2luY2UgaXQgd2lsbCBiZSB1c2VkIHRvCi0gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBmaW5hbCBwYWNrYWdlCi0gICAgICAgIGlmICghc1Byb2plY3ROYW1lUGF0dGVybi5tYXRjaGVyKHByb2plY3ROYW1lKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlRoZSBwcm9qZWN0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBhbHBoYW51bWVyaWNzLCBkaWdpdHMsIGRvdHMsIGRhc2hlcywgdW5kZXJzY29yZXMgb3Igc3BhY2VzLiIsCi0gICAgICAgICAgICAgICAgICAgIE1TR19FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIG5hbWVTdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHByb2plY3ROYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0gICAgICAgIGlmICghbmFtZVN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMobmFtZVN0YXR1cy5nZXRNZXNzYWdlKCksIE1TR19FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1haW5JbmZvICE9IG51bGwgJiYgcHJvamVjdE5hbWUuZXF1YWxzKG1NYWluSW5mby5nZXRQcm9qZWN0TmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiVGhlIG1haW4gcHJvamVjdCBuYW1lIGFuZCB0aGUgdGVzdCBwcm9qZWN0IG5hbWUgbXVzdCBiZSBkaWZmZXJlbnQuIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRQcm9qZWN0SGFuZGxlKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIkEgcHJvamVjdCB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGxvY2F0aW9uIHBhdGggZmllbGQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB3aXphcmQgbWVzc2FnZSB0eXBlLCBvbmUgb2YgTVNHX0VSUk9SLCBNU0dfV0FSTklORyBvciBNU0dfTk9ORS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB2YWxpZGF0ZUxvY2F0aW9uUGF0aChJV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0TG9jYXRpb24oKSk7Ci0gICAgICAgIGlmICghbUluZm8udXNlRGVmYXVsdExvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIC8vIElmIG5vdCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSB2YWxpZGF0ZSB0aGUgbG9jYXRpb24uCi0gICAgICAgICAgICBVUkkgdXJpID0gVVJJVXRpbC50b1VSSShwYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICBJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uVVJJKGdldFByb2plY3RIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgdXJpKTsKLSAgICAgICAgICAgIGlmICghbG9jYXRpb25TdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cyhsb2NhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCksIE1TR19FUlJPUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhdGlvbiBpcyB2YWxpZCBhcyBmYXIgYXMgRWNsaXBzZSBpcyBjb25jZXJuZWQgKGkuZS4gbW9zdGx5IG5vdAotICAgICAgICAgICAgICAgIC8vIGFuIGV4aXN0aW5nIHdvcmtzcGFjZSBwcm9qZWN0LikgQ2hlY2sgaXQgZWl0aGVyIGRvZXNuJ3QgZXhpc3Qgb3IgaXMKLSAgICAgICAgICAgICAgICAvLyBhIGRpcmVjdG9yeSB0aGF0IGlzIGVtcHR5LgotICAgICAgICAgICAgICAgIEZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgIWYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJBIGRpcmVjdG9yeSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIsIE1TR19FUlJPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgd2Ugc2hvdWxkIHB1dCBhIHdhcm5pbmcgaWYgaXQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5LiBXZSBkb24ndCBwdXQgYW4gZXJyb3IgKHdlJ2xsIGFzayB0aGUgdXNlciBhZ2FpbiBmb3IgY29uZmlybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB1c2luZyB0aGUgZGlyZWN0b3J5LikKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbCA9IGYubGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobC5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiVGhlIHNlbGVjdGVkIG91dHB1dCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19XQVJOSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSB2YWxpZGF0ZSB0aGUgcGF0aCBzdHJpbmcgaXMgbm90IGVtcHR5Ci0gICAgICAgICAgICBpZiAoZ2V0UHJvamVjdExvY2F0aW9uKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIkEgZGlyZWN0b3J5IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBkZXN0ID0gcGF0aC5hcHBlbmQobUluZm8uZ2V0UHJvamVjdE5hbWUoKSkudG9GaWxlKCk7Ci0gICAgICAgICAgICBpZiAoZGVzdC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoU3RyaW5nLmZvcm1hdCgiVGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVkIFwiJTEkc1wiIGluIHRoZSBzZWxlY3RlZCBsb2NhdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbUluZm8uZ2V0UHJvamVjdE5hbWUoKSksIE1TR19FUlJPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTVNHX05PTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBzZGsgdGFyZ2V0IGNob2ljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlU2RrVGFyZ2V0KCkgewotICAgICAgICBpZiAobUluZm8uZ2V0U2RrVGFyZ2V0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNldFN0YXR1cygiQW4gU0RLIFRhcmdldCBtdXN0IGJlIHNwZWNpZmllZC4iLCBNU0dfRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHNkayB0YXJnZXQgY2hvaWNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgd2l6YXJkIG1lc3NhZ2UgdHlwZSwgb25lIG9mIE1TR19FUlJPUiwgTVNHX1dBUk5JTkcgb3IgTVNHX05PTkUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgdmFsaWRhdGVNaW5TZGtWZXJzaW9uRmllbGQoKSB7Ci0KLSAgICAgICAgLy8gSWYgdGhlIG1pbiBzZGsgdmVyc2lvbiBpcyBlbXB0eSwgaXQgaXMgYWx3YXlzIGFjY2VwdGVkLgotICAgICAgICBpZiAobUluZm8uZ2V0TWluU2RrVmVyc2lvbigpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5mby5nZXRTZGtUYXJnZXQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgbUluZm8uZ2V0U2RrVGFyZ2V0KCkuZ2V0VmVyc2lvbigpLmVxdWFscyhtSW5mby5nZXRNaW5TZGtWZXJzaW9uKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJUaGUgQVBJIGxldmVsIGZvciB0aGUgc2VsZWN0ZWQgU0RLIHRhcmdldCBkb2VzIG5vdCBtYXRjaCB0aGUgTWluIFNESyB2ZXJzaW9uLiIsCi0gICAgICAgICAgICAgICAgICAgIG1JbmZvLmdldFNka1RhcmdldCgpLmdldFZlcnNpb24oKS5pc1ByZXZpZXcoKSA/IE1TR19FUlJPUiA6IE1TR19XQVJOSU5HKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNU0dfTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHBhY2thZ2UgbmFtZSBmaWVsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHdpemFyZCBtZXNzYWdlIHR5cGUsIG9uZSBvZiBNU0dfRVJST1IsIE1TR19XQVJOSU5HIG9yIE1TR19OT05FLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbGlkYXRlUGFja2FnZUZpZWxkKCkgewotICAgICAgICAvLyBWYWxpZGF0ZSBwYWNrYWdlIGZpZWxkCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1JbmZvLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0U3RhdHVzKCJQcm9qZWN0IHBhY2thZ2UgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4iLCBNU0dfRVJST1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaXQncyBhIHZhbGlkIHBhY2thZ2Ugc3RyaW5nCi0gICAgICAgIGludCByZXN1bHQgPSBNU0dfTk9ORTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgIjEuNSIsICIxLjUiKTsgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNldFN0YXR1cyhTdHJpbmcuZm9ybWF0KCJQcm9qZWN0IHBhY2thZ2U6ICVzIiwgc3RhdHVzLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SID8gTVNHX0VSUk9SIDogTVNHX1dBUk5JTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIEFuZHJvaWQgQWN0aXZpdHkgTWFuYWdlciBkb2VzIG5vdCBhY2NlcHQgcGFja2FnZXMgbmFtZXMgd2l0aCBvbmx5IG9uZQotICAgICAgICAvLyBpZGVudGlmaWVyLiBDaGVjayB0aGUgcGFja2FnZSBuYW1lIGhhcyBhdCBsZWFzdCBvbmUgZG90IGluIHRoZW0gKHRoZSBwcmV2aW91cyBydWxlCi0gICAgICAgIC8vIHZhbGlkYXRlZCB0aGF0IGlmIHN1Y2ggYSBkb3QgZXhpc3QsIGl0J3Mgbm90IHRoZSBmaXJzdCBub3IgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZQotICAgICAgICAvLyBzdHJpbmcuKQotICAgICAgICBpZiAocmVzdWx0ICE9IE1TR19FUlJPUiAmJiBwYWNrYWdlTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlByb2plY3QgcGFja2FnZSBuYW1lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gaWRlbnRpZmllcnMuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHRhcmdldCBwYWNrYWdlIG5hbWUgaXMgdmFsaWQgdG9vCi0gICAgICAgIHBhY2thZ2VOYW1lID0gbUluZm8uZ2V0VGFyZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlRhcmdldCBwYWNrYWdlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGl0J3MgYSB2YWxpZCBwYWNrYWdlIHN0cmluZwotICAgICAgICBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgIjEuNSIsICIxLjUiKTsgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNldFN0YXR1cyhTdHJpbmcuZm9ybWF0KCJUYXJnZXQgcGFja2FnZTogJXMiLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgPyBNU0dfRVJST1IgOiBNU0dfV0FSTklORyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ICE9IE1TR19FUlJPUiAmJiBwYWNrYWdlTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRTdGF0dXMoIlRhcmdldCBuYW1lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gaWRlbnRpZmllcnMuIiwgTVNHX0VSUk9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIHdpemFyZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGljb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2l6YXJkIG1lc3NhZ2UgdHlwZSwgb25lIG9mIE1TR19FUlJPUiBvciBNU0dfV0FSTklORy4KLSAgICAgKiBAcmV0dXJuIEFzIGEgY29udmVuaWVuY2UsIGFsd2F5cyByZXR1cm5zIG1lc3NhZ2VUeXBlIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gcmV0dXJuCi0gICAgICogICAgICAgICBpbW1lZGlhdGVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBzZXRTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIGludCBtZXNzYWdlVHlwZSkgewotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKCFtZXNzYWdlLmVxdWFscyhnZXRNZXNzYWdlKCkpKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKG1lc3NhZ2UsIG1lc3NhZ2VUeXBlID09IE1TR19XQVJOSU5HID8gV2l6YXJkUGFnZS5XQVJOSU5HIDogV2l6YXJkUGFnZS5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VUeXBlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdUZXN0UHJvamVjdFdpemFyZC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3cHJvamVjdC9OZXdUZXN0UHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmJmOWMxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3Byb2plY3QvTmV3VGVzdFByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdDsKLQotCi0vKioKLSAqIEEgIk5ldyBUZXN0IEFuZHJvaWQgUHJvamVjdCIgV2l6YXJkLgotICogPHAvPgotICogVGhpcyBpcyByZWFsbHkgdGhlIHtAbGluayBOZXdQcm9qZWN0V2l6YXJkfSB0aGF0IG9ubHkgZGlzcGxheXMgdGhlICJ0ZXN0IHByb2plY3QiIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdUZXN0UHJvamVjdFdpemFyZCBleHRlbmRzIE5ld1Byb2plY3RXaXphcmQgewotCi0gICAgcHVibGljIE5ld1Rlc3RQcm9qZWN0V2l6YXJkKCkgewotICAgICAgICBzdXBlcihBdmFpbGFibGVQYWdlcy5URVNUX1BST0pFQ1RfT05MWSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3dpemFyZHMvbmV3eG1sZmlsZS9OZXdYbWxGaWxlQ3JlYXRpb25QYWdlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9uZXd4bWxmaWxlL05ld1htbEZpbGVDcmVhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYzBkZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9uZXd4bWxmaWxlL05ld1htbEZpbGVDcmVhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3htbGZpbGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRvY3VtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5JRGVzY3JpcHRvclByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1lbnUuZGVzY3JpcHRvcnMuTWVudURlc2NyaXB0b3JzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5kZXNjcmlwdG9ycy5SZXNvdXJjZXNEZXNjcmlwdG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0Q2hvb3NlckhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZXNvdXJjZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXJUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGs7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5TZGsuSVRhcmdldENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnVpLkNvbmZpZ3VyYXRpb25TZWxlY3Rvci5Db25maWd1cmF0aW9uU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc2luZ2xlIHBhZ2Ugb2YgdGhlIHtAbGluayBOZXdYbWxGaWxlV2l6YXJkfSB3aGljaCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUKLSAqIHNrZWxldG9uIFhNTCByZXNvdXJjZXMgZmlsZXMgZm9yIEFuZHJvaWQgcHJvamVjdHMuCi0gKiA8cC8+Ci0gKiBUaGlzIHBhZ2UgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHByb2plY3QsIHRoZSByZXNvdXJjZSBmb2xkZXIsIHJlc291cmNlIHR5cGUgYW5kIGZpbGUgbmFtZS4KLSAqLwotY2xhc3MgTmV3WG1sRmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gb24gb25lIHR5cGUgb2YgcmVzb3VyY2UgdGhhdCBjYW4gYmUgY3JlYXRlZCAoZS5nLiBtZW51LCBwcmVmLCBsYXlvdXQsIGV0Yy4pCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFR5cGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVpTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUZvbGRlclR5cGUgbVJlc0ZvbGRlclR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Ub29sdGlwOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUm9vdFNlZWQ7Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIG1XaWRnZXQ7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVJvb3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1YbWxuczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlZmF1bHRBdHRyczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlZmF1bHRSb290OwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVGFyZ2V0QXBpTGV2ZWw7Ci0KLSAgICAgICAgcHVibGljIFR5cGVJbmZvKFN0cmluZyB1aU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9vbHRpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZSByZXNGb2xkZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJvb3RTZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRSb290LAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhtbG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRBdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRBcGlMZXZlbCkgewotICAgICAgICAgICAgbVVpTmFtZSA9IHVpTmFtZTsKLSAgICAgICAgICAgIG1SZXNGb2xkZXJUeXBlID0gcmVzRm9sZGVyVHlwZTsKLSAgICAgICAgICAgIG1Ub29sdGlwID0gdG9vbHRpcDsKLSAgICAgICAgICAgIG1Sb290U2VlZCA9IHJvb3RTZWVkOwotICAgICAgICAgICAgbURlZmF1bHRSb290ID0gZGVmYXVsdFJvb3Q7Ci0gICAgICAgICAgICBtWG1sbnMgPSB4bWxuczsKLSAgICAgICAgICAgIG1EZWZhdWx0QXR0cnMgPSBkZWZhdWx0QXR0cnM7Ci0gICAgICAgICAgICBtVGFyZ2V0QXBpTGV2ZWwgPSB0YXJnZXRBcGlMZXZlbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBVSSBuYW1lIGZvciB0aGUgcmVzb3VyY2UgdHlwZS4gVW5pcXVlLiBOZXZlciBudWxsLiAqLwotICAgICAgICBTdHJpbmcgZ2V0VWlOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VaU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgdG9vbHRpcCBmb3IgdGhlIHJlc291cmNlIHR5cGUuIENhbiBiZSBudWxsLiAqLwotICAgICAgICBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVG9vbHRpcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgUmVzb3VyY2VGb2xkZXJUeXBlfS4KLSAgICAgICAgICogTmV2ZXIgbnVsbCBidXQgbm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSwKLSAgICAgICAgICogZS5nLiB0d28gdHlwZXMgdXNlICB7QGxpbmsgUmVzb3VyY2VGb2xkZXJUeXBlI1hNTH0uCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZ2V0UmVzRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzRm9sZGVyVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbWF0Y2hpbmcge0BsaW5rIFJlc291cmNlRm9sZGVyVHlwZX0uCi0gICAgICAgICAqIE5ldmVyIG51bGwgYnV0IG5vdCBuZWNlc3NhcmlseSB1bmlxdWUsCi0gICAgICAgICAqIGUuZy4gdHdvIHR5cGVzIHVzZSAge0BsaW5rIFJlc291cmNlRm9sZGVyVHlwZSNYTUx9LgotICAgICAgICAgKi8KLSAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlIGdldFJlc0ZvbGRlclR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc0ZvbGRlclR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogU2V0cyB0aGUgcmFkaW8gYnV0dG9uIGFzc29jaWF0ZSB3aXRoIHRoZSByZXNvdXJjZSB0eXBlLiBDYW4gYmUgbnVsbC4gKi8KLSAgICAgICAgdm9pZCBzZXRXaWRnZXQoQnV0dG9uIHdpZGdldCkgewotICAgICAgICAgICAgbVdpZGdldCA9IHdpZGdldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSByYWRpbyBidXR0b24gYXNzb2NpYXRlIHdpdGggdGhlIHJlc291cmNlIHR5cGUuIENhbiBiZSBudWxsLiAqLwotICAgICAgICBCdXR0b24gZ2V0V2lkZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1XaWRnZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc2VlZCB1c2VkIHRvIGZpbGwgdGhlIHJvb3QgZWxlbWVudCB2YWx1ZXMuCi0gICAgICAgICAqIFRoZSBzZWVkIG1pZ2h0IGJlIGVpdGhlciBhIFN0cmluZywgYSBTdHJpbmcgYXJyYXksIGFuIHtAbGluayBFbGVtZW50RGVzY3JpcHRvcn0sCi0gICAgICAgICAqIGEge0BsaW5rIERvY3VtZW50RGVzY3JpcHRvcn0gb3IgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIE9iamVjdCBnZXRSb290U2VlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm9vdFNlZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgZGVmYXVsdCByb290IGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gQ2FuIGJlIG51bGwuICovCi0gICAgICAgIFN0cmluZyBnZXREZWZhdWx0Um9vdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcG9zc2libGUgcm9vdCBlbGVtZW50cyBmb3IgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIGFuIGVtcHR5IEFycmF5TGlzdCBidXQgbm90IG51bGwuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogVE9ETzogdGhlIHJvb3QgbGlzdCBTSE9VTEQgZGVwZW5kIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvamVjdCwgdG8gaW5jbHVkZQotICAgICAgICAgKiBjdXN0b20gY2xhc3Nlcy4KLSAgICAgICAgICovCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGdldFJvb3RzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290czsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB0aGUgZ2VuZXJhdGVkIHJlc291cmNlIFhNTCBmaWxlIHJlcXVpcmVzIGFuICJhbmRyb2lkIiBYTUxOUywgdGhpcyBzaG91bGQgYmUgc2V0Ci0gICAgICAgICAqIHRvIHtAbGluayBTZGtDb25zdGFudHMjTlNfUkVTT1VSQ0VTfS4gV2hlbiBpdCBpcyBudWxsLCBubyBYTUxOUyBpcyBnZW5lcmF0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZ2V0WG1sbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVhtbG5zOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZW4gbm90IG51bGwsIHRoaXMgcmVwcmVzZW50IGV4dHJhIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgICAgICogcm9vdCBlbGVtZW50IG9mIHRoZSBnZW5lcmF0ZWQgWE1MIGZpbGUuIFdoZW4gbnVsbCwgbm8gZXh0cmEgYXR0cmlidXRlcyBhcmUgaW5zZXJ0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0QXR0cnM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1pbmltdW0gQVBJIGxldmVsIHJlcXVpcmVkIGJ5IHRoZSBjdXJyZW50IFNESyB0YXJnZXQgdG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFRhcmdldEFwaUxldmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRBcGlMZXZlbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR5cGVJbmZvLCBpbmZvcm1hdGlvbiBmb3IgZWFjaCAidHlwZSIgb2YgZmlsZSB0aGF0IGNhbiBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVJbmZvW10gc1R5cGVzID0gewotICAgICAgICBuZXcgVHlwZUluZm8oCi0gICAgICAgICAgICAgICAgIkxheW91dCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVJIG5hbWUKLSAgICAgICAgICAgICAgICAiQW4gWE1MIGZpbGUgdGhhdCBkZXNjcmliZXMgYSBzY3JlZW4gbGF5b3V0LiIsICAgICAgLy8gdG9vbHRpcAotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkZXIgdHlwZQotICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhLkRFU0NSSVBUT1JfTEFZT1VULCAgICAgICAgICAgICAgICAvLyByb290IHNlZWQKLSAgICAgICAgICAgICAgICAiTGluZWFyTGF5b3V0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCByb290Ci0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbG5zCi0gICAgICAgICAgICAgICAgImFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwid3JhcF9jb250ZW50XCJcbiIgKyAgICAgICAgIC8vIGRlZmF1bHQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICJhbmRyb2lkOmxheW91dF9oZWlnaHQ9XCJ3cmFwX2NvbnRlbnRcIiIsCi0gICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBBUEkgbGV2ZWwKLSAgICAgICAgICAgICAgICApLAotICAgICAgICBuZXcgVHlwZUluZm8oIlZhbHVlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSBuYW1lCi0gICAgICAgICAgICAgICAgIkFuIFhNTCBmaWxlIHdpdGggc2ltcGxlIHZhbHVlczogY29sb3JzLCBzdHJpbmdzLCBkaW1lbnNpb25zLCBldGMuIiwgLy8gdG9vbHRpcAotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZS5WQUxVRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkZXIgdHlwZQotICAgICAgICAgICAgICAgIFJlc291cmNlc0Rlc2NyaXB0b3JzLlJPT1RfRUxFTUVOVCwgICAgICAgICAgICAgICAgICAvLyByb290IHNlZWQKLSAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCByb290Ci0gICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbG5zCi0gICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgQVBJIGxldmVsCi0gICAgICAgICAgICAgICAgKSwKLSAgICAgICAgbmV3IFR5cGVJbmZvKCJNZW51IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgbmFtZQotICAgICAgICAgICAgICAgICJBbiBYTUwgZmlsZSB0aGF0IGRlc2NyaWJlcyBhbiBtZW51LiIsICAgICAgICAgICAgICAvLyB0b29sdGlwCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlLk1FTlUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRlciB0eXBlCi0gICAgICAgICAgICAgICAgTWVudURlc2NyaXB0b3JzLk1FTlVfUk9PVF9FTEVNRU5ULCAgICAgICAgICAgICAgICAgIC8vIHJvb3Qgc2VlZAotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHJvb3QKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1sbnMKLSAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBBUEkgbGV2ZWwKLSAgICAgICAgICAgICAgICApLAotICAgICAgICBuZXcgVHlwZUluZm8oIkFwcFdpZGdldCBQcm92aWRlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSBuYW1lCi0gICAgICAgICAgICAgICAgIkFuIFhNTCBmaWxlIHRoYXQgZGVzY3JpYmVzIGEgd2lkZ2V0IHByb3ZpZGVyLiIsICAgIC8vIHRvb2x0aXAKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlclR5cGUuWE1MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGVyIHR5cGUKLSAgICAgICAgICAgICAgICBBbmRyb2lkVGFyZ2V0RGF0YS5ERVNDUklQVE9SX0FQUFdJREdFVF9QUk9WSURFUiwgICAgLy8gcm9vdCBzZWVkCi0gICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcm9vdAotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4bWxucwotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IEFQSSBsZXZlbAotICAgICAgICAgICAgICAgICksCi0gICAgICAgIG5ldyBUeXBlSW5mbygiUHJlZmVyZW5jZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVJIG5hbWUKLSAgICAgICAgICAgICAgICAiQW4gWE1MIGZpbGUgdGhhdCBkZXNjcmliZXMgcHJlZmVyZW5jZXMuIiwgICAgICAgICAgLy8gdG9vbHRpcAotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZS5YTUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkZXIgdHlwZQotICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhLkRFU0NSSVBUT1JfUFJFRkVSRU5DRVMsICAgICAgICAgICAvLyByb290IHNlZWQKLSAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkNMQVNTX05BTUVfUFJFRkVSRU5DRV9TQ1JFRU4sICAgICAgLy8gZGVmYXVsdCByb290Ci0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbG5zCi0gICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgQVBJIGxldmVsCi0gICAgICAgICAgICAgICAgKSwKLSAgICAgICAgbmV3IFR5cGVJbmZvKCJTZWFyY2hhYmxlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgbmFtZQotICAgICAgICAgICAgICAgICJBbiBYTUwgZmlsZSB0aGF0IGRlc2NyaWJlcyBhIHNlYXJjaGFibGUuIiwgICAgICAgICAvLyB0b29sdGlwCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlLlhNTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRlciB0eXBlCi0gICAgICAgICAgICAgICAgQW5kcm9pZFRhcmdldERhdGEuREVTQ1JJUFRPUl9TRUFSQ0hBQkxFLCAgICAgICAgICAgIC8vIHJvb3Qgc2VlZAotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHJvb3QKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1sbnMKLSAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBBUEkgbGV2ZWwKLSAgICAgICAgICAgICAgICApLAotICAgICAgICBuZXcgVHlwZUluZm8oIkFuaW1hdGlvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSBuYW1lCi0gICAgICAgICAgICAgICAgIkFuIFhNTCBmaWxlIHRoYXQgZGVzY3JpYmVzIGFuIGFuaW1hdGlvbi4iLCAgICAgICAgIC8vIHRvb2x0aXAKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUZvbGRlclR5cGUuQU5JTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGVyIHR5cGUKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHJldXNlIGNvbnN0YW50cyBpZiB3ZSBldmVyIG1ha2UgYW4gZWRpdG9yIHdpdGggZGVzY3JpcHRvcnMgZm9yIGFuaW1hdGlvbnMKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBzZWVkCi0gICAgICAgICAgICAgICAgICAgICJzZXQiLCAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICJhbHBoYSIsICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICJzY2FsZSIsICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICJ0cmFuc2xhdGUiLCAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICJyb3RhdGUiICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgInNldCIsICAgICAgICAgICAgICAvLyROT04tTkxTLTEkICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcm9vdAotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4bWxucwotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IEFQSSBsZXZlbAotICAgICAgICAgICAgICAgICksCi0gICAgfTsKLQotICAgIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZCBsYXlvdXQgKi8KLSAgICBmaW5hbCBzdGF0aWMgaW50IE5VTV9DT0wgPSA0OwotCi0gICAgLyoqIEFic29sdXRlIGRlc3RpbmF0aW9uIGZvbGRlciByb290LCBlLmcuICIvcmVzLyIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0ZPTERFUl9BQlMgPSBBbmRyb2lkQ29uc3RhbnRzLldTX1JFU09VUkNFUyArIEFuZHJvaWRDb25zdGFudHMuV1NfU0VQOwotICAgIC8qKiBSZWxhdGl2ZSBkZXN0aW5hdGlvbiBmb2xkZXIgcm9vdCwgZS5nLiAicmVzLyIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0ZPTERFUl9SRUwgPSBTZGtDb25zdGFudHMuRkRfUkVTT1VSQ0VTICsgQW5kcm9pZENvbnN0YW50cy5XU19TRVA7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IG1Qcm9qZWN0OwotICAgIHByaXZhdGUgVGV4dCBtUHJvamVjdFRleHRGaWVsZDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtUHJvamVjdEJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgbUZpbGVOYW1lVGV4dEZpZWxkOwotICAgIHByaXZhdGUgVGV4dCBtV3NGb2xkZXJQYXRoVGV4dEZpZWxkOwotICAgIHByaXZhdGUgQ29tYm8gbVJvb3RFbGVtZW50Q29tYm87Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBtSW5pdGlhbFNlbGVjdGlvbjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25TZWxlY3RvciBtQ29uZmlnU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIG1UZW1wQ29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsV3NGb2xkZXJQYXRoVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxUeXBlVXBkYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxDb25maWdTZWxlY3RvclVwZGF0ZTsKLSAgICBwcml2YXRlIFByb2plY3RDaG9vc2VySGVscGVyIG1Qcm9qZWN0Q2hvb3NlckhlbHBlcjsKLSAgICBwcml2YXRlIElUYXJnZXRDaGFuZ2VMaXN0ZW5lciBtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFR5cGVJbmZvIG1DdXJyZW50VHlwZUluZm87Ci0KLSAgICAvLyAtLS0gVUkgY3JlYXRpb24gLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBOZXdYbWxGaWxlQ3JlYXRpb25QYWdlfS4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FsbGVkIGJ5IHtAbGluayBOZXdYbWxGaWxlV2l6YXJkI2NyZWF0ZU1haW5QYWdlKCl9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBOZXdYbWxGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotICAgICAgICBzdXBlcihwYWdlTmFtZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0gICAgICAgIG1Jbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHBhcmVudCBXaXphcmQgdG8gY3JlYXRlIHRoZSBVSSBmb3IgdGhpcyBXaXphcmQgUGFnZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoTlVNX0NPTCwgZmFsc2UgLyptYWtlQ29sdW1uc0VxdWFsV2lkdGgqLykpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgY3JlYXRlUHJvamVjdEdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZVR5cGVHcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVSb290R3JvdXAoY29tcG9zaXRlKTsKLQotICAgICAgICAvLyBTaG93IGRlc2NyaXB0aW9uIHRoZSBmaXJzdCB0aW1lCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0TWVzc2FnZShudWxsKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB0aGUgZmlyc3QgdGltZQotICAgICAgICBpbml0aWFsaXplRnJvbVNlbGVjdGlvbihtSW5pdGlhbFNlbGVjdGlvbik7Ci0gICAgICAgIGluaXRpYWxpemVSb290VmFsdWVzKCk7Ci0gICAgICAgIGVuYWJsZVR5cGVzQmFzZWRPbkFwaSgpOwotICAgICAgICBpZiAobUN1cnJlbnRUeXBlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVSb290Q29tYm8obUN1cnJlbnRUeXBlSW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFsbFRhcmdldENoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsVGFyZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJVGFyZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2plY3RUYXJnZXRDaGFuZ2UoSVByb2plY3QgY2hhbmdlZFByb2plY3QpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBjdXJyZW50IHByb2plY3QsIGZvcmNlIGl0IHRvIHJlbG9hZCBpdHMgZGF0YQotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkUHJvamVjdCAhPSBudWxsICYmIGNoYW5nZWRQcm9qZWN0ID09IG1Qcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZVByb2plY3QobVByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25UYXJnZXRzTG9hZGVkKCkgewotICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY3VycmVudCBwcm9qZWN0LCBpZiBhbnksIGluIGNhc2UgaXRzIHRhcmdldCBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAobVByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQcm9qZWN0KG1Qcm9qZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgQWR0UGx1Z2luLmdldERlZmF1bHQoKS5hZGRUYXJnZXRMaXN0ZW5lcihtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLSAgICAgICAgaWYgKG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZVRhcmdldExpc3RlbmVyKG1TZGtUYXJnZXRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtU2RrVGFyZ2V0Q2hhbmdlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBwcm9qZWN0IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBmaWxlbmFtZSBvciBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlTmFtZVRleHRGaWVsZCA9PSBudWxsID8gIiIgOiBtRmlsZU5hbWVUZXh0RmllbGQuZ2V0VGV4dCgpOyAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBvciBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc0ZvbGRlclBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBtV3NGb2xkZXJQYXRoVGV4dEZpZWxkID09IG51bGwgPyAiIiA6IG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuZ2V0VGV4dCgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBJRmlsZX0gb24gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0gICAgICogPHAvPgotICAgICAqIFVzZXMge0BsaW5rICNnZXRQcm9qZWN0KCl9LCB7QGxpbmsgI2dldFdzRm9sZGVyUGF0aCgpfSBhbmQge0BsaW5rICNnZXRGaWxlTmFtZSgpfS4KLSAgICAgKiA8cC8+Ci0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBwcm9qZWN0LCBmaWxlbmFtZSBvciBmb2xkZXIgYXJlIGludmFsaWQgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlCi0gICAgICogY2Fubm90IGJlIGRldGVybWluZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSB7QGxpbmsgSUZpbGV9IGlzIGEgcmVzb3VyY2UuIFRoZXJlIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhbiBhY3R1YWwgcmVhbCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBJRmlsZSBnZXREZXN0aW5hdGlvbkZpbGUoKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIFN0cmluZyB3c0ZvbGRlclBhdGggPSBnZXRXc0ZvbGRlclBhdGgoKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiB3c0ZvbGRlclBhdGgubGVuZ3RoKCkgPiAwICYmIGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgSVBhdGggZGVzdCA9IG5ldyBQYXRoKHdzRm9sZGVyUGF0aCkuYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoZGVzdCk7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHlwZUluZm99IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHR5cGUgcmFkaW8gYnV0dG9uLgotICAgICAqIFJldHVybnMgbnVsbCBpZiBubyByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIFR5cGVJbmZvfSBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlSW5mbyBnZXRTZWxlY3RlZFR5cGUoKSB7Ci0gICAgICAgIFR5cGVJbmZvIHR5cGUgPSBudWxsOwotICAgICAgICBmb3IgKFR5cGVJbmZvIHRpIDogc1R5cGVzKSB7Ci0gICAgICAgICAgICBpZiAodGkuZ2V0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gdGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IHN0cmluZywgaWYgYW55LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IHN0cmluZyBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdEVsZW1lbnQoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IG1Sb290RWxlbWVudENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvb3RFbGVtZW50Q29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gLS0tIFVJIGNyZWF0aW9uIC0tLQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgR3JpZERhdGEgd2l0aCBhbiBob3Jpem9udGFsIHNwYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9yaXpTcGFuIFRoZSBudW1iZXIgb2YgY2VsbHMgZm9yIHRoZSBob3Jpem9udGFsIHNwYW4uCi0gICAgICogQHJldHVybiBBIG5ldyBHcmlkRGF0YSB3aXRoIHRoZSBob3Jpem9udGFsIHNwYW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBHcmlkRGF0YSBuZXdHcmlkRGF0YShpbnQgaG9yaXpTcGFuKSB7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gaG9yaXpTcGFuOwotICAgICAgICByZXR1cm4gZ2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgR3JpZERhdGEgd2l0aCBhbiBob3Jpem9udGFsIHNwYW4gYW5kIGEgc3R5bGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9yaXpTcGFuIFRoZSBudW1iZXIgb2YgY2VsbHMgZm9yIHRoZSBob3Jpem9udGFsIHNwYW4uCi0gICAgICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSwgZS5nLiB7QGxpbmsgR3JpZERhdGEjRklMTF9IT1JJWk9OVEFMfQotICAgICAqIEByZXR1cm4gQSBuZXcgR3JpZERhdGEgd2l0aCB0aGUgaG9yaXpvbnRhbCBzcGFuIGFuZCB0aGUgc3R5bGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHcmlkRGF0YSBuZXdHcmlkRGF0YShpbnQgaG9yaXpTcGFuLCBpbnQgc3R5bGUpIHsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoc3R5bGUpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IGhvcml6U3BhbjsKLSAgICAgICAgcmV0dXJuIGdkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIGVtcHR5IGNlbGwgaW4gdGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbXB0eUNlbGwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFkcyB0aGUgcGFyZW50IHdpdGggZW1wdHkgY2VsbHMgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBwYXJlbnQgZ3JpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgQSBncmlkIGxheW91dCB3aXRoIE5VTV9DT0wgY29sdW1ucwotICAgICAqIEBwYXJhbSBjb2wgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNvbHVtbnMgdXNlZC4KLSAgICAgKiBAcmV0dXJuIDAsIHRoZSBuZXcgbnVtYmVyIG9mIGNvbHVtbnMgdXNlZCwgZm9yIGNvbnZlbmllbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBhZFdpdGhFbXB0eUNlbGxzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2wpIHsKLSAgICAgICAgZm9yICg7IGNvbCA8IE5VTV9DT0w7ICsrY29sKSB7Ci0gICAgICAgICAgICBlbXB0eUNlbGwocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBjb2wgPSAwOwotICAgICAgICByZXR1cm4gY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHByb2plY3QgJiBmaWxlbmFtZSBmaWVsZHMuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBwYXJlbnQgbXVzdCBiZSBhIEdyaWRMYXlvdXQgd2l0aCBOVU1fQ09MIGNvbHVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW50IGNvbCA9IDA7Ci0KLSAgICAgICAgLy8gcHJvamVjdCBuYW1lCi0gICAgICAgIFN0cmluZyB0b29sdGlwID0gIlRoZSBBbmRyb2lkIFByb2plY3Qgd2hlcmUgdGhlIG5ldyByZXNvdXJjZSBmaWxlIHdpbGwgYmUgY3JlYXRlZC4iOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiUHJvamVjdCIpOwotICAgICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLSAgICAgICAgKytjb2w7Ci0KLSAgICAgICAgbVByb2plY3RUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBtUHJvamVjdFRleHRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVByb2plY3RUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0gICAgICAgIG1Qcm9qZWN0VGV4dEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG9uUHJvamVjdEZpZWxkVXBkYXRlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgKytjb2w7Ci0KLSAgICAgICAgbVByb2plY3RCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtUHJvamVjdEJyb3dzZUJ1dHRvbi5zZXRUZXh0KCJCcm93c2UuLi4iKTsKLSAgICAgICAgbVByb2plY3RCcm93c2VCdXR0b24uc2V0VG9vbFRpcFRleHQoIkFsbG93cyB5b3UgdG8gc2VsZWN0IHRoZSBBbmRyb2lkIHByb2plY3QgdG8gbW9kaWZ5LiIpOwotICAgICAgICBtUHJvamVjdEJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICBvblByb2plY3RCcm93c2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1Qcm9qZWN0Q2hvb3NlckhlbHBlciA9IG5ldyBQcm9qZWN0Q2hvb3NlckhlbHBlcihwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICsrY29sOwotCi0gICAgICAgIGNvbCA9IHBhZFdpdGhFbXB0eUNlbGxzKHBhcmVudCwgY29sKTsKLQotICAgICAgICAvLyBmaWxlIG5hbWUKLSAgICAgICAgdG9vbHRpcCA9ICJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmlsZSB0byBjcmVhdGUuIjsKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIkZpbGUiKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0gICAgICAgICsrY29sOwotCi0gICAgICAgIG1GaWxlTmFtZVRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1GaWxlTmFtZVRleHRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbUZpbGVOYW1lVGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KHRvb2x0aXApOwotICAgICAgICBtRmlsZU5hbWVUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICArK2NvbDsKLQotICAgICAgICBwYWRXaXRoRW1wdHlDZWxscyhwYXJlbnQsIGNvbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdHlwZSBmaWVsZCwge0BsaW5rIENvbmZpZ3VyYXRpb25TZWxlY3Rvcn0gYW5kIHRoZSBmb2xkZXIgZmllbGQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBwYXJlbnQgbXVzdCBiZSBhIEdyaWRMYXlvdXQgd2l0aCBOVU1fQ09MIGNvbHVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVHlwZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gc2VwYXJhdG9yCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXdHcmlkRGF0YShOVU1fQ09MLCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQotICAgICAgICAvLyBsYWJlbCBiZWZvcmUgdHlwZSByYWRpb3MKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIldoYXQgdHlwZSBvZiByZXNvdXJjZSB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/Iik7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3R3JpZERhdGEoTlVNX0NPTCkpOwotCi0gICAgICAgIC8vIGRpc3BsYXkgdGhlIHR5cGVzIG9uIHRocmVlIGNvbHVtbnMgb2YgcmFkaW8gYnV0dG9ucy4KLSAgICAgICAgZW1wdHlDZWxsKHBhcmVudCk7Ci0gICAgICAgIENvbXBvc2l0ZSBncmlkID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgcGFkV2l0aEVtcHR5Q2VsbHMocGFyZW50LCAyKTsKLQotICAgICAgICBncmlkLnNldExheW91dChuZXcgR3JpZExheW91dChOVU1fQ09MLCB0cnVlIC8qbWFrZUNvbHVtbnNFcXVhbFdpZHRoKi8pKTsKLQotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciByYWRpb0xpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5nbGUtY2xpY2suIE9ubHkgZG8gc29tZXRoaW5nIGlmIGFjdGl2YXRlZC4KLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEJ1dHRvbikgewotICAgICAgICAgICAgICAgICAgICBvblJhZGlvVHlwZVVwZGF0ZWQoKEJ1dHRvbikgZS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGludCBuID0gc1R5cGVzLmxlbmd0aDsKLSAgICAgICAgaW50IG51bV9saW5lcyA9IChuICsgTlVNX0NPTC8yKSAvIE5VTV9DT0w7Ci0gICAgICAgIGZvciAoaW50IGxpbmUgPSAwLCBrID0gMDsgbGluZSA8IG51bV9saW5lczsgbGluZSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DT0w7IGkrKywgaysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGsgPCBuKSB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGVJbmZvIHR5cGUgPSBzVHlwZXNba107Ci0gICAgICAgICAgICAgICAgICAgIEJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24oZ3JpZCwgU1dULlJBRElPKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRXaWRnZXQocmFkaW8pOwotICAgICAgICAgICAgICAgICAgICByYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICByYWRpby5zZXRUZXh0KHR5cGUuZ2V0VWlOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByYWRpby5zZXRUb29sVGlwVGV4dCh0eXBlLmdldFRvb2x0aXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtcHR5Q2VsbChncmlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsYWJlbCBiZWZvcmUgY29uZmlndXJhdGlvbiBzZWxlY3RvcgotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiV2hhdCB0eXBlIG9mIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gd291bGQgeW91IGxpa2U/Iik7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3R3JpZERhdGEoTlVNX0NPTCkpOwotCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gc2VsZWN0b3IKLSAgICAgICAgZW1wdHlDZWxsKHBhcmVudCk7Ci0gICAgICAgIG1Db25maWdTZWxlY3RvciA9IG5ldyBDb25maWd1cmF0aW9uU2VsZWN0b3IocGFyZW50LCBmYWxzZSAvKiBkZXZpY2VNb2RlKi8pOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ld0dyaWREYXRhKDIsIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSBDb25maWd1cmF0aW9uU2VsZWN0b3IuV0lEVEhfSElOVDsKLSAgICAgICAgZ2QuaGVpZ2h0SGludCA9IENvbmZpZ3VyYXRpb25TZWxlY3Rvci5IRUlHSFRfSElOVDsKLSAgICAgICAgbUNvbmZpZ1NlbGVjdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtQ29uZmlnU2VsZWN0b3Iuc2V0T25DaGFuZ2VMaXN0ZW5lcihuZXcgb25Db25maWdTZWxlY3RvclVwZGF0ZWQoKSk7Ci0gICAgICAgIGVtcHR5Q2VsbChwYXJlbnQpOwotCi0gICAgICAgIC8vIGZvbGRlciBuYW1lCi0gICAgICAgIFN0cmluZyB0b29sdGlwID0gIlRoZSBmb2xkZXIgd2hlcmUgdGhlIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0LiI7Ci0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJGb2xkZXIiKTsKLSAgICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0KLSAgICAgICAgbVdzRm9sZGVyUGF0aFRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0gICAgICAgIG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb25Xc0ZvbGRlclBhdGhVcGRhdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHJvb3QgZWxlbWVudCBjb21iby4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHBhcmVudCBtdXN0IGJlIGEgR3JpZExheW91dCB3aXRoIE5VTV9DT0wgY29sdW1zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSb290R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBzZXBhcmF0b3IKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ld0dyaWREYXRhKE5VTV9DT0wsIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIGxhYmVsIGJlZm9yZSB0aGUgcm9vdCBjb21ibwotICAgICAgICBTdHJpbmcgdG9vbHRpcCA9ICJUaGUgcm9vdCBlbGVtZW50IHRvIGNyZWF0ZSBpbiB0aGUgWE1MIGZpbGUuIjsKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlNlbGVjdCB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgWE1MIGZpbGU6Iik7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3R3JpZERhdGEoTlVNX0NPTCkpOwotICAgICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLQotICAgICAgICAvLyByb290IGNvbWJvCi0gICAgICAgIGVtcHR5Q2VsbChwYXJlbnQpOwotCi0gICAgICAgIG1Sb290RWxlbWVudENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtUm9vdEVsZW1lbnRDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbVJvb3RFbGVtZW50Q29tYm8uc2VsZWN0KDApOwotICAgICAgICBtUm9vdEVsZW1lbnRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVJvb3RFbGVtZW50Q29tYm8uc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0KLSAgICAgICAgcGFkV2l0aEVtcHR5Q2VsbHMocGFyZW50LCAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE5ld1htbEZpbGVXaXphcmR9IHRvIGluaXRpYWxpemUgdGhlIHBhZ2Ugd2l0aCB0aGUgc2VsZWN0aW9uCi0gICAgICogcmVjZWl2ZWQgYnkgdGhlIHdpemFyZCAtLSB0eXBpY2FsbHkgdGhlIGN1cnJlbnQgdXNlciB3b3JrYmVuY2ggc2VsZWN0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGluZ3Mgd2UgZXhwZWN0IHRvIGZpbmQgb3V0IGZyb20gdGhlIHNlbGVjdGlvbjoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBwcm9qZWN0IG5hbWUsIHZhbGlkIGlmIGl0J3MgYW4gYW5kcm9pZCBuYXR1cmUuPC9saT4KLSAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZm9sZGVyLCB2YWxpZCBpZiBpdCdzIGEgZm9sZGVyIHVuZGVyIC9yZXM8L2xpPgotICAgICAqIDxsaT5BbiBleGlzdGluZyBmaWxlbmFtZSwgaW4gd2hpY2ggY2FzZSB0aGUgdXNlciB3aWxsIGJlIGFza2VkIHdoZXRoZXIgdG8gb3ZlcnJpZGUgaXQuPC9saT4KLSAgICAgKiA8dWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgd2l6YXJkIHdhcyBpbml0aWF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmQgdGhlIGJlc3QgbWF0Y2ggaW4gdGhlIGVsZW1lbnQgbGlzdC4gSW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgc2VsZWN0ZWQgZWxlbWVudHMKLSAgICAgICAgLy8gc2VsZWN0IHRoZSBvbmUgdGhhdCBwcm92aWRlcyB0aGUgbW9zdCBpbmZvcm1hdGlvbiBhbmQgYXNzaWduIHRoZW0gYSBzY29yZSwKLSAgICAgICAgLy8gZS5nLiBwcm9qZWN0PTEgKyBmb2xkZXI9MiArIGZpbGU9NC4KLSAgICAgICAgSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRXc0ZvbGRlclBhdGggPSBudWxsOwotICAgICAgICBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBudWxsOwotICAgICAgICBpbnQgdGFyZ2V0U2NvcmUgPSAwOwotICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0aW9uLnRvTGlzdCgpKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlcyAhPSBudWxsID8gcmVzLmdldFByb2plY3QoKSA6IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIEFuZHJvaWQgcHJvamVjdD8KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0Lmhhc05hdHVyZShBbmRyb2lkQ29uc3RhbnRzLk5BVFVSRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNraW5nIHRoZSBuYXR1cmUgZmFpbGVkLCBpZ25vcmUgdGhpcyByZXNvdXJjZQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAxOyAvLyB3ZSBoYXZlIGEgdmFsaWQgcHJvamVjdCBhdCBsZWFzdAotCi0gICAgICAgICAgICAgICAgSVBhdGggd3NGb2xkZXJQYXRoID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gcmVzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSByZXMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB3c0ZvbGRlclBhdGggPSByZXMuZ2V0UGFyZW50KCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3JlZ2FyZCB0aGlzIGZvbGRlciBzZWxlY3Rpb24gaWYgaXQgZG9lc24ndCBwb2ludCB0byAvcmVzL3NvbWV0aGluZwotICAgICAgICAgICAgICAgIGlmICh3c0ZvbGRlclBhdGggIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgd3NGb2xkZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUy5lcXVhbHMod3NGb2xkZXJQYXRoLnNlZ21lbnQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3NGb2xkZXJQYXRoID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNjb3JlICs9IGZpbGVOYW1lICE9IG51bGwgPyA0IDogMDsKLQotICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IHRhcmdldFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICAgICAgICAgICAgICB0YXJnZXRXc0ZvbGRlclBhdGggPSB3c0ZvbGRlclBhdGggIT0gbnVsbCA/IHdzRm9sZGVyUGF0aC50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgc2V0IHRoZSBVSSBhY2NvcmRpbmdseQotICAgICAgICBpZiAodGFyZ2V0U2NvcmUgPiAwKSB7Ci0gICAgICAgICAgICBtUHJvamVjdCA9IHRhcmdldFByb2plY3Q7Ci0gICAgICAgICAgICBtUHJvamVjdFRleHRGaWVsZC5zZXRUZXh0KHRhcmdldFByb2plY3QgIT0gbnVsbCA/IHRhcmdldFByb2plY3QuZ2V0TmFtZSgpIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBtRmlsZU5hbWVUZXh0RmllbGQuc2V0VGV4dCh0YXJnZXRGaWxlTmFtZSAhPSBudWxsID8gdGFyZ2V0RmlsZU5hbWUgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuc2V0VGV4dCh0YXJnZXRXc0ZvbGRlclBhdGggIT0gbnVsbCA/IHRhcmdldFdzRm9sZGVyUGF0aCA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgcm9vdCB2YWx1ZXMgb2YgdGhlIHR5cGUgaW5mb3MgYmFzZWQgb24gdGhlIGN1cnJlbnQgZnJhbWV3b3JrIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJvb3RWYWx1ZXMoKSB7Ci0gICAgICAgIGZvciAoVHlwZUluZm8gdHlwZSA6IHNUeXBlcykgewotICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIHRoZSByb290cyBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByb290cyA9IHR5cGUuZ2V0Um9vdHMoKTsKLSAgICAgICAgICAgIGlmIChyb290cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcm9vdHMuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9mIHRoZSB0eXBlIG9mIHRoZSBzZWVkLCBpbml0aWFsaXplIHRoZSByb290IGluIGRpZmZlcmVudCB3YXlzCi0gICAgICAgICAgICBPYmplY3Qgcm9vdFNlZWQgPSB0eXBlLmdldFJvb3RTZWVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChyb290U2VlZCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzZWVkIGlzIGEgc2luZ2xlIHN0cmluZywgQWRkIGl0IGFzLWlzLgotICAgICAgICAgICAgICAgIHJvb3RzLmFkZCgoU3RyaW5nKSByb290U2VlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RTZWVkIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgc2VlZCBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLiBBZGQgdGhlbSBhcy1pcy4KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IChTdHJpbmdbXSkgcm9vdFNlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcm9vdHMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RTZWVkIGluc3RhbmNlb2YgSW50ZWdlciAmJiBtUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlZWQgaXMgYSBkZXNjcmlwdG9yIHJlZmVyZW5jZSBkZWZpbmVkIGluIEFuZHJvaWRUYXJnZXREYXRhLkRFU0NSSVBUT1JfKgotICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBhZGQgYWxsIHRoZSBjaGlsZHJlbiBlbGVtZW50IGRlc2NyaXB0b3JzIGRlZmluZWQsIHJlY3Vyc2l2ZWx5LAotICAgICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gYnkga2VlcGluZyB0cmFjayBvZiB3aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQuCi0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBpZiBwcm9qZWN0IGlzIG51bGwsIHRoZSByb290IGxpc3Qgd2lsbCBiZSBlbXB0eSBzaW5jZSBpdCBoYXMgYmVlbgotICAgICAgICAgICAgICAgIC8vIGNsZWFyZWQgYWJvdmUuCi0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEFuZHJvaWRUYXJnZXREYXRhIGZyb20gdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIEFuZHJvaWRUYXJnZXREYXRhIGRhdGEgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQobVByb2plY3QpOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBBIHByb2plY3Qgc2hvdWxkIGhhdmUgYSB0YXJnZXQuIFRoZSB0YXJnZXQgY2FuIGJlIG1pc3NpbmcgaWYgdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaXMgYW4gb2xkIHByb2plY3QgZm9yIHdoaWNoIGEgdGFyZ2V0IGhhc24ndCBiZWVuIGFmZmVjdGVkIG9yIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGlzIFNESy4gU2ltcGx5IGxvZyB0aGUgZXJyb3IgYW5kIGRpc21pc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLklORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ld1htbEZpbGUgd2l6YXJkOiBubyBwbGF0Zm9ybSB0YXJnZXQgZm9yIHByb2plY3QgJXMiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBTZGsuZ2V0Q3VycmVudCgpLmdldFRhcmdldERhdGEodGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBib3RoIGEgdGFyZ2V0IGFuZCBpdHMgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgaWYgdGhlIHdpemFyZCBpcyBpbnZva2VkIHdoaWxzdCB0aGUgcGxhdGZvcm0gaXMgc3RpbGwgYmVpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCB3ZSBjYW4gZW5kIHVwIGluIGEgd2VpcmQgY2FzZSB3aGVyZSB3ZSBoYXZlIGEgdGFyZ2V0IGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBoYXZlIGFueSBkYXRhIHlldC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldHMgbG9nIGEgd2FybmluZyBhbmQgc2lsZW50bHkgaWdub3JlIHRoaXMgcm9vdC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLklORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV3WG1sRmlsZSB3aXphcmQ6IG5vIGRhdGEgZm9yIHRhcmdldCAlcywgcHJvamVjdCAlcyIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0TmFtZSgpLCBtUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJRGVzY3JpcHRvclByb3ZpZGVyIHByb3ZpZGVyID0gZGF0YS5nZXREZXNjcmlwdG9yUHJvdmlkZXIoKEludGVnZXIpcm9vdFNlZWQpOwotICAgICAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBIYXNoU2V0PEVsZW1lbnREZXNjcmlwdG9yPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8RWxlbWVudERlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRSb290RWxlbWVudERlc2NyaXB0b3Iocm9vdHMsIGRlc2NyaXB0b3IsIHZpc2l0ZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyb290cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJlY3Vyc2l2ZWx5IGluc2VydCBhbGwgWE1MIG5hbWVzIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIEVsZW1lbnREZXNjcmlwdG9yfQotICAgICAqIGludG8gdGhlIHJvb3RzIGFycmF5IGxpc3QuIEtlZXBzIHRyYWNrIG9mIHZpc2l0ZWQgbm9kZXMgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLgotICAgICAqIEFsc28gYXZvaWRzIGluc2VydGluZyB0aGUgdG9wIHtAbGluayBEb2N1bWVudERlc2NyaXB0b3J9IHdoaWNoIGlzIGdlbmVyYWxseSBzeW50aGV0aWMKLSAgICAgKiBhbmQgbm90IGEgdmFsaWQgcm9vdCBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0Um9vdEVsZW1lbnREZXNjcmlwdG9yKEFycmF5TGlzdDxTdHJpbmc+IHJvb3RzLAotICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYywgSGFzaFNldDxFbGVtZW50RGVzY3JpcHRvcj4gdmlzaXRlZCkgewotICAgICAgICBpZiAoIShkZXNjIGluc3RhbmNlb2YgRG9jdW1lbnREZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBkZXNjLmdldFhtbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICh4bWxOYW1lICE9IG51bGwgJiYgeG1sTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByb290cy5hZGQoeG1sTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aXNpdGVkLmFkZChkZXNjKTsKLQotICAgICAgICBmb3IgKEVsZW1lbnREZXNjcmlwdG9yIGNoaWxkIDogZGVzYy5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAoIXZpc2l0ZWQuY29udGFpbnMoY2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgaW5pdFJvb3RFbGVtZW50RGVzY3JpcHRvcihyb290cywgY2hpbGQsIHZpc2l0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlIHByb2plY3QgdGV4dCBmaWVsZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25Qcm9qZWN0RmllbGRVcGRhdGVkKCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdCA9IG1Qcm9qZWN0VGV4dEZpZWxkLmdldFRleHQoKTsKLQotICAgICAgICAvLyBJcyB0aGlzIGEgdmFsaWQgcHJvamVjdD8KLSAgICAgICAgSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtUHJvamVjdENob29zZXJIZWxwZXIuZ2V0QW5kcm9pZFByb2plY3RzKG51bGwgLypqYXZhTW9kZWwqLyk7Ci0gICAgICAgIElQcm9qZWN0IGZvdW5kID0gbnVsbDsKLSAgICAgICAgZm9yIChJSmF2YVByb2plY3QgcCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAocC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gcC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm91bmQgIT0gbVByb2plY3QpIHsKLSAgICAgICAgICAgIGNoYW5nZVByb2plY3QoZm91bmQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHVzZXIgdXNlcyB0aGUgIkJyb3dzZSBQcm9qZWN0cyIgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblByb2plY3RCcm93c2UoKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBwID0gbVByb2plY3RDaG9vc2VySGVscGVyLmNob29zZUphdmFQcm9qZWN0KG1Qcm9qZWN0VGV4dEZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgIGlmIChwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoYW5nZVByb2plY3QocC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgbVByb2plY3RUZXh0RmllbGQuc2V0VGV4dChtUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyBtUHJvamVjdCB0byB0aGUgZ2l2ZW4gbmV3IHByb2plY3QgYW5kIHVwZGF0ZSB0aGUgVUkgYWNjb3JkaW5nbHkuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBuZXcgcHJvamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmUKLSAgICAgKiBvbiBwdXJwb3NlLCB3aGljaCBhbGxvd3MgYSBwcm9qZWN0IHRvIGJlIHVwZGF0ZWQgd2hlbiBpdHMgdGFyZ2V0IGhhcyBjaGFuZ2VkIG9yCi0gICAgICogd2hlbiB0YXJnZXRzIGFyZSBsb2FkZWQgaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotICAgICAgICBtUHJvamVjdCA9IG5ld1Byb2plY3Q7Ci0KLSAgICAgICAgLy8gZW5hYmxlIHR5cGVzIGJhc2VkIG9uIG5ldyBBUEkgbGV2ZWwKLSAgICAgICAgZW5hYmxlVHlwZXNCYXNlZE9uQXBpKCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBmb2xkZXIgbmFtZSBiYXNlZCBvbiBBUEkgbGV2ZWwKLSAgICAgICAgcmVzZXRGb2xkZXJQYXRoKGZhbHNlIC8qdmFsaWRhdGUqLyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBUeXBlIHdpdGggdGhlIG5ldyBkZXNjcmlwdG9ycy4KLSAgICAgICAgaW5pdGlhbGl6ZVJvb3RWYWx1ZXMoKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbWJvCi0gICAgICAgIHVwZGF0ZVJvb3RDb21ibyhnZXRTZWxlY3RlZFR5cGUoKSk7Ci0KLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIEZvbGRlciB0ZXh0IGZpZWxkIGlzIGNoYW5nZWQsIGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICogb3IgYnkgdGhlIHVzZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uV3NGb2xkZXJQYXRoVXBkYXRlZCgpIHsKLSAgICAgICAgaWYgKG1JbnRlcm5hbFdzRm9sZGVyUGF0aFVwZGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHdzRm9sZGVyUGF0aCA9IG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuZ2V0VGV4dCgpOwotCi0gICAgICAgIC8vIFRoaXMgaXMgYSBjdXN0b20gcGF0aCwgd2UgbmVlZCB0byBzYW5pdGl6ZSBpdC4KLSAgICAgICAgLy8gRmlyc3QgaXQgc2hvdWxkIHN0YXJ0IHdpdGggIi9yZXMvIi4gVGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8KLSAgICAgICAgLy8gcmVsYXRpdmUgcGF0aHMsIHRoaW5ncyBsaWtlICIuLi8iIG9yICIuLyIgb3IgZXZlbiAiLy8iLgotICAgICAgICB3c0ZvbGRlclBhdGggPSB3c0ZvbGRlclBhdGgucmVwbGFjZUFsbCgiLytcXC5cXC4vK3wvK1xcLi8rfC8vK3xcXFxcK3xeLysiLCAiLyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHdzRm9sZGVyUGF0aCA9IHdzRm9sZGVyUGF0aC5yZXBsYWNlQWxsKCJeXFwuXFwuLyt8XlxcLi8rIiwgIiIpOyAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgd3NGb2xkZXJQYXRoID0gd3NGb2xkZXJQYXRoLnJlcGxhY2VBbGwoIi8rXFwuXFwuJHwvK1xcLiR8LyskIiwgIiIpOyAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEFycmF5TGlzdDxUeXBlSW5mbz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZUluZm8+KCk7Ci0KLSAgICAgICAgLy8gV2UgZ2V0ICJyZXMvZm9vIiBmcm9tIHNlbGVjdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgd2hlbiB3ZSB3YW50IGEgIi9yZXMvZm9vIiBwYXRoLgotICAgICAgICBpZiAod3NGb2xkZXJQYXRoLnN0YXJ0c1dpdGgoUkVTX0ZPTERFUl9SRUwpKSB7Ci0gICAgICAgICAgICB3c0ZvbGRlclBhdGggPSBSRVNfRk9MREVSX0FCUyArIHdzRm9sZGVyUGF0aC5zdWJzdHJpbmcoUkVTX0ZPTERFUl9SRUwubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBtSW50ZXJuYWxXc0ZvbGRlclBhdGhVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVdzRm9sZGVyUGF0aFRleHRGaWVsZC5zZXRUZXh0KHdzRm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxXc0ZvbGRlclBhdGhVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3c0ZvbGRlclBhdGguc3RhcnRzV2l0aChSRVNfRk9MREVSX0FCUykpIHsKLSAgICAgICAgICAgIHdzRm9sZGVyUGF0aCA9IHdzRm9sZGVyUGF0aC5zdWJzdHJpbmcoUkVTX0ZPTERFUl9BQlMubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBpbnQgcG9zID0gd3NGb2xkZXJQYXRoLmluZGV4T2YoQW5kcm9pZENvbnN0YW50cy5XU19TRVBfQ0hBUik7Ci0gICAgICAgICAgICBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgICAgICB3c0ZvbGRlclBhdGggPSB3c0ZvbGRlclBhdGguc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGZvbGRlclNlZ21lbnRzID0gd3NGb2xkZXJQYXRoLnNwbGl0KEZvbGRlckNvbmZpZ3VyYXRpb24uUVVBTElGSUVSX1NFUCk7Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXJTZWdtZW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlck5hbWUgPSBmb2xkZXJTZWdtZW50c1swXTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25maWcgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxDb25maWdTZWxlY3RvclVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbmZpZ1NlbGVjdG9yLnNldENvbmZpZ3VyYXRpb24oZm9sZGVyU2VnbWVudHMpOwotICAgICAgICAgICAgICAgIG1JbnRlcm5hbENvbmZpZ1NlbGVjdG9yVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChUeXBlSW5mbyB0eXBlIDogc1R5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFJlc0ZvbGRlck5hbWUoKS5lcXVhbHMoZm9sZGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgfD0gdHlwZS5nZXRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgbWF0Y2gsIHNlbGVjdCBpdCBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFR5cGUobWF0Y2hlcy5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHR5cGUgY2FuZGlkYXRlcyBmb3IgdGhpcyBmb2xkZXIuIFRoaXMgY2FuIGhhcHBlbgotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgL3Jlcy94bWwgZm9yIGV4YW1wbGUuIENoZWNrIHRvIHNlZSBpZiBvbmUgb2YgdGhlbSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQuIElmIHllcywgbGVhdmUgdGhlIHNlbGVjdGlvbiB1bmNoYW5nZWQuIElmIG5vdCwgZGVzZWxlY3QgYWxsIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFR5cGUobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHZhbGlkIHdhcyBzZWxlY3RlZC4KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0VHlwZShudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIHR5cGUgcmFkaW8gYnV0dG9uIGlzIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZVdpZGdldCBUaGUgdHlwZSByYWRpbyBidXR0b24gdGhhdCBjaGFuZ2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblJhZGlvVHlwZVVwZGF0ZWQoQnV0dG9uIHR5cGVXaWRnZXQpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGlzIGlzIGFuIGludGVybmFsIG1vZGlmaWNhdGlvbiBvciBpZiB0aGUgd2lkZ2V0IGhhcyBiZWVuCi0gICAgICAgIC8vIGRlLXNlbGVjdGVkLgotICAgICAgICBpZiAobUludGVybmFsVHlwZVVwZGF0ZSB8fCAhdHlwZVdpZGdldC5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluZCB0eXBlIGluZm8gdGhhdCBoYXMganVzdCBiZWVuIGVuYWJsZWQuCi0gICAgICAgIFR5cGVJbmZvIHR5cGUgPSBudWxsOwotICAgICAgICBmb3IgKFR5cGVJbmZvIHRpIDogc1R5cGVzKSB7Ci0gICAgICAgICAgICBpZiAodGkuZ2V0V2lkZ2V0KCkgPT0gdHlwZVdpZGdldCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSB0aTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgY29tYm8KLQotICAgICAgICB1cGRhdGVSb290Q29tYm8odHlwZSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBmb2xkZXIgcGF0aAotCi0gICAgICAgIFN0cmluZyB3c0ZvbGRlclBhdGggPSBtV3NGb2xkZXJQYXRoVGV4dEZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIG5ld1BhdGggPSBudWxsOwotCi0gICAgICAgIG1Db25maWdTZWxlY3Rvci5nZXRDb25maWd1cmF0aW9uKG1UZW1wQ29uZmlnKTsKLSAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgcXVhbCA9IG1UZW1wQ29uZmlnLmdldEludmFsaWRRdWFsaWZpZXIoKTsKLSAgICAgICAgaWYgKHF1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQuIFJlZm9ybWF0IHRoZSBmb2xkZXIgcGF0aCB1c2luZyB0aGUgY2Fub25pY2FsCi0gICAgICAgICAgICAvLyB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgotCi0gICAgICAgICAgICBuZXdQYXRoID0gUkVTX0ZPTERFUl9BQlMgKyBtVGVtcENvbmZpZy5nZXRGb2xkZXJOYW1lKHR5cGUuZ2V0UmVzRm9sZGVyVHlwZSgpLCBtUHJvamVjdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLiBXZSBzdGlsbCB1cGRhdGUgdGhlIHBhdGggYnV0IHRoaXMgdGltZQotICAgICAgICAgICAgLy8gZG8gaXQgbWFudWFsbHkgb24gdGhlIHN0cmluZy4KLSAgICAgICAgICAgIGlmICh3c0ZvbGRlclBhdGguc3RhcnRzV2l0aChSRVNfRk9MREVSX0FCUykpIHsKLSAgICAgICAgICAgICAgICB3c0ZvbGRlclBhdGgucmVwbGFjZUZpcnN0KAotICAgICAgICAgICAgICAgICAgICAgICAgIl4oIiArIFJFU19GT0xERVJfQUJTICsiKVteLV0qKC4qKSIsICAgICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAiXFwxIiArIHR5cGUuZ2V0UmVzRm9sZGVyTmFtZSgpICsgIlxcMiIpOyAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXdQYXRoID0gUkVTX0ZPTERFUl9BQlMgKyBtVGVtcENvbmZpZy5nZXRGb2xkZXJOYW1lKHR5cGUuZ2V0UmVzRm9sZGVyVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb2plY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5ld1BhdGggIT0gbnVsbCAmJiAhbmV3UGF0aC5lcXVhbHMod3NGb2xkZXJQYXRoKSkgewotICAgICAgICAgICAgbUludGVybmFsV3NGb2xkZXJQYXRoVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Xc0ZvbGRlclBhdGhUZXh0RmllbGQuc2V0VGV4dChuZXdQYXRoKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbFdzRm9sZGVyUGF0aFVwZGF0ZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0aGF0IGZpbGxzIHRoZSB2YWx1ZXMgb2YgdGhlICJyb290IGVsZW1lbnQiIGNvbWJvIGJveCBiYXNlZAotICAgICAqIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdHlwZSByYWRpbyBidXR0b24uIEFsc28gZGlzYWJsZXMgdGhlIGNvbWJvIGlzIHRoZXJlJ3MKLSAgICAgKiBvbmx5IG9uZSBjaG9pY2UuIEFsd2F5cyBzZWxlY3QgdGhlIGZpcnN0IHJvb3QgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHtAbGluayBUeXBlSW5mb30uIENhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSb290Q29tYm8oVHlwZUluZm8gdHlwZSkgewotICAgICAgICAvLyByZXNldCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgY29tYm8KLSAgICAgICAgbVJvb3RFbGVtZW50Q29tYm8ucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIHJvb3RzLiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcm9vdHMgPSB0eXBlLmdldFJvb3RzKCk7Ci0KLSAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY29tYm8gaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGNob2ljZQotICAgICAgICAgICAgbVJvb3RFbGVtZW50Q29tYm8uc2V0RW5hYmxlZChyb290cyAhPSBudWxsICYmIHJvb3RzLnNpemUoKSA+IDEpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyByb290IDogcm9vdHMpIHsKLSAgICAgICAgICAgICAgICBtUm9vdEVsZW1lbnRDb21iby5hZGQocm9vdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7IC8vIGRlZmF1bHQgaXMgdG8gc2VsZWN0IHRoZSBmaXJzdCBvbmUKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Um9vdCA9IHR5cGUuZ2V0RGVmYXVsdFJvb3QoKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSByb290cy5pbmRleE9mKGRlZmF1bHRSb290KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb290RWxlbWVudENvbWJvLnNlbGVjdChpbmRleCA8IDAgPyAwIDogaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHtAbGluayBDb25maWd1cmF0aW9uU2VsZWN0b3J9LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3Mgb25Db25maWdTZWxlY3RvclVwZGF0ZWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtSW50ZXJuYWxDb25maWdTZWxlY3RvclVwZGF0ZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzZXRGb2xkZXJQYXRoKHRydWUgLyp2YWxpZGF0ZSovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gc2VsZWN0IG9uIG9mIHRoZSB0eXBlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgVHlwZUluZm8gbWF0Y2hpbmcgdGhlIHJhZGlvIGJ1dHRvbiB0byBzZWxlY3RlZCBvciBudWxsIHRvIGRlc2VsZWN0IHRoZW0gYWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RUeXBlKFR5cGVJbmZvIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5nZXRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgbUludGVybmFsVHlwZVVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGVJbmZvID0gdHlwZTsKLSAgICAgICAgICAgIGZvciAoVHlwZUluZm8gdHlwZTIgOiBzVHlwZXMpIHsKLSAgICAgICAgICAgICAgICB0eXBlMi5nZXRXaWRnZXQoKS5zZXRTZWxlY3Rpb24odHlwZTIgPT0gdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVSb290Q29tYm8odHlwZSk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxUeXBlVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGVuYWJsZSB0aGUgdHlwZSByYWRpbyBidXR0b25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBBUEkgbGV2ZWwuCi0gICAgICogPHAvPgotICAgICAqIEEgdHlwZSByYWRpbyBidXR0b24gaXMgZW5hYmxlZCBlaXRoZXIgaWY6Ci0gICAgICogLSBpZiBtUHJvamVjdCBpcyBudWxsLCBBUEkgbGV2ZWwgMSBpcyBjb25zaWRlcmVkIHZhbGlkCi0gICAgICogLSBpZiBtUHJvamVjdCBpcyAhbnVsbCwgdGhlIHByb2plY3QtPnRhcmdldC0+QVBJIG11c3QgYmUgPj0gdG8gdGhlIHR5cGUncyBBUEkgbGV2ZWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVR5cGVzQmFzZWRPbkFwaSgpIHsKLQotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBtUHJvamVjdCAhPSBudWxsID8gU2RrLmdldEN1cnJlbnQoKS5nZXRUYXJnZXQobVByb2plY3QpIDogbnVsbDsKLSAgICAgICAgaW50IGN1cnJlbnRBcGlMZXZlbCA9IDE7Ci0gICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudEFwaUxldmVsID0gdGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlMZXZlbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChUeXBlSW5mbyB0eXBlIDogc1R5cGVzKSB7Ci0gICAgICAgICAgICB0eXBlLmdldFdpZGdldCgpLnNldEVuYWJsZWQodHlwZS5nZXRUYXJnZXRBcGlMZXZlbCgpIDw9IGN1cnJlbnRBcGlMZXZlbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgY3VycmVudCBGb2xkZXIgcGF0aCBiYXNlZCBvbiB0aGUgVUkgc2VsZWN0aW9uCi0gICAgICogQHBhcmFtIHZhbGlkYXRlIGlmIHRydWUsIGZvcmNlIGEgY2FsbCB0byB7QGxpbmsgI3ZhbGlkYXRlUGFnZSgpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRGb2xkZXJQYXRoKGJvb2xlYW4gdmFsaWRhdGUpIHsKLSAgICAgICAgVHlwZUluZm8gdHlwZSA9IGdldFNlbGVjdGVkVHlwZSgpOwotCi0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db25maWdTZWxlY3Rvci5nZXRDb25maWd1cmF0aW9uKG1UZW1wQ29uZmlnKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoUkVTX0ZPTERFUl9BQlMpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG1UZW1wQ29uZmlnLmdldEZvbGRlck5hbWUodHlwZS5nZXRSZXNGb2xkZXJUeXBlKCksIG1Qcm9qZWN0KSk7Ci0KLSAgICAgICAgICAgIG1JbnRlcm5hbFdzRm9sZGVyUGF0aFVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtV3NGb2xkZXJQYXRoVGV4dEZpZWxkLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBtSW50ZXJuYWxXc0ZvbGRlclBhdGhVcGRhdGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGZpZWxkcywgZGlzcGxheXMgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSAgICAgKiBFbmFibGVzIHRoZSBmaW5pc2ggYnV0dG9uIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAgICAgU3RyaW5nIGVycm9yID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHdhcm5pbmcgPSBudWxsOwotCi0gICAgICAgIC8vIC0tIHZhbGlkYXRlIHByb2plY3QKLSAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvciA9ICJQbGVhc2Ugc2VsZWN0IGFuIEFuZHJvaWQgcHJvamVjdC4iOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLS0gdmFsaWRhdGUgZmlsZW5hbWUKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSAiQSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgaXMgcmVxdWlyZWQuIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKEFuZHJvaWRDb25zdGFudHMuRE9UX1hNTCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoIlRoZSBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoICUxJHMuIiwgQW5kcm9pZENvbnN0YW50cy5ET1RfWE1MKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tIHZhbGlkYXRlIHR5cGUKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIFR5cGVJbmZvIHR5cGUgPSBnZXRTZWxlY3RlZFR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9yID0gIk9uZSBvZiB0aGUgdHlwZXMgbXVzdCBiZSBzZWxlY3RlZCAoZS5nLiBsYXlvdXQsIHZhbHVlcywgZXRjLikiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLS0gdmFsaWRhdGUgdHlwZSBBUEkgbGV2ZWwKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IFNkay5nZXRDdXJyZW50KCkuZ2V0VGFyZ2V0KG1Qcm9qZWN0KTsKLSAgICAgICAgICAgIGludCBjdXJyZW50QXBpTGV2ZWwgPSAxOwotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEFwaUxldmVsID0gdGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlMZXZlbCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlSW5mbyB0eXBlID0gZ2V0U2VsZWN0ZWRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlLmdldFRhcmdldEFwaUxldmVsKCkgPiBjdXJyZW50QXBpTGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9ICJUaGUgQVBJIGxldmVsIG9mIHRoZSBzZWxlY3RlZCB0eXBlIChlLmcuIEFwcFdpZGdldCwgZXRjLikgaXMgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhdGlibGUgd2l0aCB0aGUgQVBJIGxldmVsIG9mIHRoZSBwcm9qZWN0LiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLSB2YWxpZGF0ZSBmb2xkZXIgY29uZmlndXJhdGlvbgotICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvblN0YXRlIHN0YXRlID0gbUNvbmZpZ1NlbGVjdG9yLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ29uZmlndXJhdGlvblN0YXRlLklOVkFMSURfQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VRdWFsaWZpZXIgcXVhbCA9IG1Db25maWdTZWxlY3Rvci5nZXRJbnZhbGlkUXVhbGlmaWVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHF1YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoIlRoZSBxdWFsaWZpZXIgJyUxJHMnIGlzIGludmFsaWQgaW4gdGhlIGZvbGRlciBjb25maWd1cmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ29uZmlndXJhdGlvblN0YXRlLlJFR0lPTl9XSVRIT1VUX0xBTkdVQUdFKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSAiVGhlIFJlZ2lvbiBxdWFsaWZpZXIgcmVxdWlyZXMgdGhlIExhbmd1YWdlIHF1YWxpZmllci4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLS0gdmFsaWRhdGUgZ2VuZXJhdGVkIHBhdGgKLSAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB3c0ZvbGRlclBhdGggPSBnZXRXc0ZvbGRlclBhdGgoKTsKLSAgICAgICAgICAgIGlmICghd3NGb2xkZXJQYXRoLnN0YXJ0c1dpdGgoUkVTX0ZPTERFUl9BQlMpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBTdHJpbmcuZm9ybWF0KCJUYXJnZXQgZm9sZGVyIG11c3Qgc3RhcnQgd2l0aCAlMSRzLiIsIFJFU19GT0xERVJfQUJTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tIHZhbGlkYXRlIGRlc3RpbmF0aW9uIGZpbGUgZG9lc24ndCBleGlzdAotICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGdldERlc3RpbmF0aW9uRmlsZSgpOwotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgd2FybmluZyA9ICJUaGUgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0cyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLSB1cGRhdGUgVUkgJiBlbmFibGUgZmluaXNoIGlmIHRoZXJlJ3Mgbm8gZXJyb3IKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGVycm9yID09IG51bGwpOwotICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0TWVzc2FnZShlcnJvciwgV2l6YXJkUGFnZS5FUlJPUik7Ci0gICAgICAgIH0gZWxzZSBpZiAod2FybmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKHdhcm5pbmcsIFdpemFyZFBhZ2UuV0FSTklORyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvd2l6YXJkcy9uZXd4bWxmaWxlL05ld1htbEZpbGVXaXphcmQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3htbGZpbGUvTmV3WG1sRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRhNTE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC93aXphcmRzL25ld3htbGZpbGUvTmV3WG1sRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3htbGZpbGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuQWR0UGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLkljb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3htbGZpbGUuTmV3WG1sRmlsZUNyZWF0aW9uUGFnZS5UeXBlSW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogVGhlICJOZXcgQW5kcm9pZCBYTUwgRmlsZSBXaXphcmQiIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBza2VsZXRvbiBYTUwKLSAqIHJlc291cmNlcyBmaWxlcyBmb3IgQW5kcm9pZCBwcm9qZWN0cy4KLSAqIDxwLz4KLSAqIFRoZSB3aXphcmQgaGFzIG9uZSBwYWdlLCB7QGxpbmsgTmV3WG1sRmlsZUNyZWF0aW9uUGFnZX0sIHVzZWQgdG8gc2VsZWN0IHRoZSBwcm9qZWN0LAotICogdGhlIHJlc291cmNlIGZvbGRlciwgcmVzb3VyY2UgdHlwZSBhbmQgZmlsZSBuYW1lLiBJdCB0aGVuIGNyZWF0ZXMgdGhlIFhNTCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgTmV3WG1sRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9HT19MQVJHRSA9ICJhbmRyb2lkX2xhcmdlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fUEFHRV9OQU1FID0gIm5ld0FuZHJvaWRYbWxGaWxlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgTmV3WG1sRmlsZUNyZWF0aW9uUGFnZSBtTWFpblBhZ2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7IC8vIFRPRE8gaGF2ZSBoZWxwCi0gICAgICAgIHNldFdpbmRvd1RpdGxlKCJOZXcgQW5kcm9pZCBYTUwgRmlsZSIpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoKTsKLQotICAgICAgICBtTWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotICAgICAgICBtTWFpblBhZ2Uuc2V0VGl0bGUoIk5ldyBBbmRyb2lkIFhNTCBGaWxlIik7Ci0gICAgICAgIG1NYWluUGFnZS5zZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIG5ldyBBbmRyb2lkIFhNTCBmaWxlLiIpOwotICAgICAgICBtTWFpblBhZ2Uuc2V0SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB3aXphcmQgcGFnZS4KLSAgICAgKiA8cC8+Ci0gICAgICogUGxlYXNlIGRvIE5PVCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBwcm90ZWN0ZWQgc28gdGhhdCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1bml0IHRlc3RzLgotICAgICAqIEhvd2V2ZXIgdGhlIGNvbnRyYWN0IG9mIHRoaXMgY2xhc3MgaXMgcHJpdmF0ZSBhbmQgTk8gQVRURU1QVCB3aWxsIGJlIG1hZGUKLSAgICAgKiB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBwbHVnaW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5ld1htbEZpbGVDcmVhdGlvblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmV3WG1sRmlsZUNyZWF0aW9uUGFnZShNQUlOX1BBR0VfTkFNRSk7Ci0gICAgfQotCi0gICAgLy8gLS0gTWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkIC0tCi0gICAgLy8KLSAgICAvLyBUaGUgV2l6YXJkIGNsYXNzIGltcGxlbWVudHMgbW9zdCBkZWZhdWx0cyBhbmQgYm9pbGVycGxhdGUgY29kZSBuZWVkZWQgYnkKLSAgICAvLyBJV2l6YXJkCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIHBhZ2VzIHRvIHRoaXMgd2l6YXJkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBhZGRQYWdlKG1NYWluUGFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYW55IGFjdGlvbnMgYXBwcm9wcmlhdGUgaW4gcmVzcG9uc2UgdG8gdGhlIHVzZXIgaGF2aW5nIHByZXNzZWQKLSAgICAgKiB0aGUgRmluaXNoIGJ1dHRvbiwgb3IgcmVmdXNlIGlmIGZpbmlzaGluZyBub3cgaXMgbm90IHBlcm1pdHRlZDogaGVyZSwgaXQKLSAgICAgKiBhY3R1YWxseSBjcmVhdGVzIHRoZSB3b3Jrc3BhY2UgcHJvamVjdCBhbmQgdGhlbiBzd2l0Y2ggdG8gdGhlIEphdmEKLSAgICAgKiBwZXJzcGVjdGl2ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBjcmVhdGVYbWxGaWxlKCk7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE9wZW4gdGhlIGZpbGUgaW4gYW4gZWRpdG9yCi0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBpZiAod2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhlLCAiRmFpbGVkIHRvIGNyZWF0ZSAlMSRzOiBtaXNzaW5nIHR5cGUiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tIEN1c3RvbSBNZXRob2RzIC0tCi0gICAgCi0gICAgcHJpdmF0ZSBJRmlsZSBjcmVhdGVYbWxGaWxlKCkgewotICAgICAgICBJRmlsZSBmaWxlID0gbU1haW5QYWdlLmdldERlc3RpbmF0aW9uRmlsZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICBib29sZWFuIG5lZWRfZGVsZXRlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICghQWR0UGx1Z2luLmRpc3BsYXlQcm9tcHQoIk5ldyBBbmRyb2lkIFhNTCBGaWxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGZpbGUgJTEkcyA/IiwgbmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWJvcnQgaWYgdXNlciBzZWxlY3RzIGNhbmNlbC4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5lZWRfZGVsZXRlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNyZWF0ZVdzUGFyZW50RGlyZWN0b3J5KGZpbGUuZ2V0UGFyZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUeXBlSW5mbyB0eXBlID0gbU1haW5QYWdlLmdldFNlbGVjdGVkVHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBleHBlY3RlZCB0byBoYXBwZW4KLSAgICAgICAgICAgIEFkdFBsdWdpbi5sb2coSVN0YXR1cy5FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgJTEkczogbWlzc2luZyB0eXBlIiwgbmFtZSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgeG1sbnMgPSB0eXBlLmdldFhtbG5zKCk7Ci0gICAgICAgIFN0cmluZyByb290ID0gbU1haW5QYWdlLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIGhhcHBlbgotICAgICAgICAgICAgQWR0UGx1Z2luLmxvZyhJU3RhdHVzLkVSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSAlMSRzOiBtaXNzaW5nIHJvb3QgZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7ICAgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNiLmFwcGVuZCgnPCcpLmFwcGVuZChyb290KTsKLSAgICAgICAgaWYgKHhtbG5zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKS5hcHBlbmQoIiAgeG1sbnM6YW5kcm9pZD1cIiIpLmFwcGVuZCh4bWxucykuYXBwZW5kKCJcIiIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBhdHRycyA9IHR5cGUuZ2V0RGVmYXVsdEF0dHJzKCk7Ci0gICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuICAiKTsgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNiLmFwcGVuZChhdHRycy5yZXBsYWNlKCJcbiIsICJcbiAgIikpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNiLmFwcGVuZCgiPlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2IuYXBwZW5kKCI8LyIpLmFwcGVuZChyb290KS5hcHBlbmQoIj5cbiIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gcmVzdWx0LmdldEJ5dGVzKCJVVEY4Iik7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmKTsKLSAgICAgICAgICAgIGlmIChuZWVkX2RlbGV0ZSkgewotICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKElGaWxlLktFRVBfSElTVE9SWSB8IElGaWxlLkZPUkNFLCBudWxsIC8qbW9uaXRvciovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGUuY3JlYXRlKHN0cmVhbSwgdHJ1ZSAvKmZvcmNlKi8sIG51bGwgLypwcm9ncmVzKi8pOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXJyb3IgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvciA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyb3IgPSBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gZ2VuZXJhdGUgJTEkczogJTIkcyIsIG5hbWUsIGVycm9yKTsKLSAgICAgICAgQWR0UGx1Z2luLmRpc3BsYXlFcnJvcigiTmV3IEFuZHJvaWQgWE1MIEZpbGUiLCBlcnJvcik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVXc1BhcmVudERpcmVjdG9yeShJQ29udGFpbmVyIHdzUGF0aCkgewotICAgICAgICBpZiAod3NQYXRoLmdldFR5cGUoKSA9PSBJQ29udGFpbmVyLkZPTERFUikgewotICAgICAgICAgICAgaWYgKHdzUGF0aCA9PSBudWxsIHx8IHdzUGF0aC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSB3c1BhdGg7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjcmVhdGVXc1BhcmVudERpcmVjdG9yeSh3c1BhdGguZ2V0UGFyZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSAvKiBmb3JjZSAqLywgdHJ1ZSAvKiBsb2NhbCAqLywgbnVsbCAvKiBtb25pdG9yICovKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHdpemFyZCBsb2dvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gSWNvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoUFJPSkVDVF9MT0dPX0xBUkdFKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvbWVzc2FnZXMucHJvcGVydGllcyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJiZDg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotRGlhbG9nX1RpdGxlX1NES19Mb2NhdGlvbj1BbmRyb2lkIFNESyBMb2NhdGlvbgotU0RLX05vdF9TZXR1cD1UaGUgbG9jYXRpb24gb2YgdGhlIEFuZHJvaWQgU0RLIGhhcyBub3QgYmVlbiBzZXR1cC4gUGxlYXNlIGdvIHRvIFByZWZlcmVuY2VzID4gQW5kcm9pZCBhbmQgc2V0IGl0IHVwCi1FcnJvcl9DaGVja19QcmVmcz0lMSRzXG5QbGVhc2UgY2hlY2sgdGhlIEFuZHJvaWQgcGx1Z2luJ3MgcHJlZmVyZW5jZXMuCi1Db3VsZF9Ob3RfRmluZF9Gb2xkZXI9Q291bGQgbm90IGZpbmQgU0RLIGZvbGRlciAnJTEkcycuCi1Db3VsZF9Ob3RfRmluZF9Gb2xkZXJfSW5fU0RLPUNvdWxkIG5vdCBmaW5kIGZvbGRlciAnJTEkcycgaW5zaWRlIFNESyAnJTIkcycuCi1Db3VsZF9Ob3RfRmluZD1Db3VsZCBub3QgZmluZCAlMSRzXCEKLVZlcnNpb25DaGVja19TREtfTWlsZXN0b25lX1Rvb19Mb3c9VGhpcyB2ZXJzaW9uIG9mIEFEVCByZXF1aXJlcyBhIFNESyBpbiB2ZXJzaW9uIE0lMSRkIG9yIGFib3ZlLlxuXG5DdXJyZW50IHZlcnNpb24gaXMgJTIkcy5cblxuUGxlYXNlIHVwZGF0ZSB5b3VyIFNESyB0byB0aGUgbGF0ZXN0IHZlcnNpb24uCi1WZXJzaW9uQ2hlY2tfU0RLX0J1aWxkX1Rvb19Mb3c9VGhpcyB2ZXJzaW9uIG9mIEFEVCByZXF1aXJlcyBhIFNESyBpbiB2ZXJzaW9uICUxJGQgKE0lMiRkKSBvciBhYm92ZS5cblxuQ3VycmVudCB2ZXJzaW9uIGlzICUzJHMuXG5cblBsZWFzZSB1cGRhdGUgeW91ciBTREsgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLgotVmVyc2lvbkNoZWNrX1BsdWdpbl9WZXJzaW9uX0ZhaWxlZD1GYWlsZWQgdG8gZ2V0IHRoZSByZXF1aXJlZCBBRFQgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgU0RLLlxuXG5UaGUgQW5kcm9pZCBEZXZlbG9wZXIgVG9vbGtpdCBtYXkgbm90IHdvcmsgcHJvcGVybHkuCi1WZXJzaW9uQ2hlY2tfVW5hYmxlX1RvX1BhcnNlX1ZlcnNpb25fcz1VbmFibGUgdG8gcGFyc2Ugc2RrIGJ1aWxkIHZlcnNpb246ICUxJHMKLVZlcnNpb25DaGVja19QbHVnaW5fVG9vX09sZD1UaGlzIEFuZHJvaWQgU0RLIHJlcXVpcmVzIEFuZHJvaWQgRGV2ZWxvcGVyIFRvb2xraXQgdmVyc2lvbiAlMSRkLiUyJGQuJTMkZCBvciBhYm92ZS5cblxuQ3VycmVudCB2ZXJzaW9uIGlzICU0JHMuXG5cblBsZWFzZSB1cGRhdGUgQURUIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4KLUFkdFBsdWdpbl9GYWlsZWRfVG9fU3RhcnRfcz1GYWlsZWQgdG8gc3RhcnQgJTEkcwotQWR0UGx1Z2luX0FuZHJvaWRfU0RLX0NvbnRlbnRfTG9hZGVyPUFuZHJvaWQgU0RLIENvbnRlbnQgTG9hZGVyCi1BZHRQbHVnaW5fUGFyc2luZ19SZXNvdXJjZXM9UGFyc2luZyBSZXNvdXJjZXMKLUFkdFBsdWdpbl9BbmRyb2lkX1NES19SZXNvdXJjZV9QYXJzZXI9QW5kcm9pZCBTREsgUmVzb3VyY2UgUGFyc2VyCi1BZHRQbHVnaW5fRmFpbGVkX1RvX1BhcnNlX3M9RmFpbGVkIHRvIHBhcnNlOgotQ29uc29sZV9EYXRlX1RhZz1bJTEkdEYgJTEkdFRdCi1Db25zb2xlX0RhdGFfUHJvamVjdF9UYWc9WyUxJHRGICUxJHRUIC0gJTIkc10KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1NzQxMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgIHBhY2thZ2U9IlBBQ0tBR0UiCi0gICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNvbiIgYW5kcm9pZDpsYWJlbD0iQVBQTElDQVRJT05fTkFNRSI+Ci1BQ1RJVklUSUVTCi1URVNULVVTRVMtTElCUkFSWQotICAgIDwvYXBwbGljYXRpb24+Ci1VU0VTLVNESwotVEVTVC1JTlNUUlVNRU5UQVRJT04KLTwvbWFuaWZlc3Q+IApkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvYWN0aXZpdHkudGVtcGxhdGUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9hY3Rpdml0eS50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxZDYwMi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9hY3Rpdml0eS50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQUNUSVZJVFlfTkFNRSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFQUExJQ0FUSU9OX05BTUUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotSU5URU5UX0ZJTFRFUlMKLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9pY29uX2hkcGkucG5nIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvaWNvbl9oZHBpLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3NGM0Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9pY29uX2hkcGkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvaWNvbl9sZHBpLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2ljb25fbGRwaS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTU1ODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvaWNvbl9sZHBpLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2ljb25fbWRwaS5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9pY29uX21kcGkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDdjNjlmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2ljb25fbWRwaS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9qYXZhX2ZpbGUudGVtcGxhdGUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9qYXZhX2ZpbGUudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2ZmOTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvamF2YV9maWxlLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBQQUNLQUdFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBQ1RJVklUWV9OQU1FIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2xhdW5jaGVyX2ludGVudF9maWx0ZXIudGVtcGxhdGUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9sYXVuY2hlcl9pbnRlbnRfZmlsdGVyLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTY4MWJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2xhdW5jaGVyX2ludGVudF9maWx0ZXIudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvbGF5b3V0LnRlbXBsYXRlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvbGF5b3V0LnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRjMzgzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL2xheW91dC50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKLSAgICA+Ci08VGV4dFZpZXcgIAotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAotICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWxsbyIKLSAgICAvPgotPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3ByZWZlcmVuY2VfaW50ZW50X2ZpbHRlci50ZW1wbGF0ZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3ByZWZlcmVuY2VfaW50ZW50X2ZpbHRlci50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5YmIyYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9wcmVmZXJlbmNlX2ludGVudF9maWx0ZXIudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuUFJFRkVSRU5DRSIgLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9zdHJpbmcudGVtcGxhdGUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy9zdHJpbmcudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmU0YjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvc3RyaW5nLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotICAgIDxzdHJpbmcgbmFtZT0iU1RSSU5HX05BTUUiPlNUUklOR19DT05URU5UPC9zdHJpbmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvc3RyaW5ncy50ZW1wbGF0ZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3N0cmluZ3MudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODBhY2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvc3RyaW5ncy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyZXNvdXJjZXM+Ci1TVFJJTkdTCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvdGVzdF9pbnN0cnVtZW50YXRpb24udGVtcGxhdGUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy90ZXN0X2luc3RydW1lbnRhdGlvbi50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI4MmZiYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy90ZXN0X2luc3RydW1lbnRhdGlvbi50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iVEVTVF9UQVJHRVRfUENLRyIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3Rlc3RfdXNlcy1saWJyYXJ5LnRlbXBsYXRlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvdGVzdF91c2VzLWxpYnJhcnkudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4YWU3YTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC90ZW1wbGF0ZXMvdGVzdF91c2VzLWxpYnJhcnkudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0L3RlbXBsYXRlcy91c2VzLXNkay50ZW1wbGF0ZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3VzZXMtc2RrLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWRhZTcxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvdGVtcGxhdGVzL3VzZXMtc2RrLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249Ik1JTl9TREtfVkVSU0lPTiIgLz4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLy5jbGFzc3BhdGggYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODA2MjFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWJzL2pmcmVlY2hhcnQtMS4wLjkuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGlicy9qY29tbW9uLTEuMC4xMi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWJzL2pmcmVlY2hhcnQtMS4wLjktc3d0LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy8ucHJvamVjdCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTlmOTk2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+ZGRtcy1wbHVnaW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5Mzk4MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IERhbHZpayBEZWJ1ZyBNb25pdG9yIFNlcnZpY2UKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC45LjUucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLkRkbXNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogY29tLmFuZHJvaWQuZGRtbGliLAotIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2csCi0gY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIsCi0gY29tLmFuZHJvaWQuZGRtdWlsaWIsCi0gY29tLmFuZHJvaWQuZGRtdWlsaWIuY29uc29sZSwKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLAotIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYnMvamNvbW1vbi0xLjAuMTIuamFyLAotIGxpYnMvamZyZWVjaGFydC0xLjAuOS5qYXIsCi0gbGlicy9qZnJlZWNoYXJ0LTEuMC45LXN3dC5qYXIsCi0gLgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9idWlsZC5wcm9wZXJ0aWVzIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0Yzg5Ni4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLCBcCi0gICAgICAgICAgICAgICBsaWJzL2pjb21tb24tMS4wLjEyLmphcixcCi0gICAgICAgICAgICAgICBsaWJzL2pmcmVlY2hhcnQtMS4wLjktc3d0LmphcixcCi0gICAgICAgICAgICAgICBsaWJzL2pmcmVlY2hhcnQtMS4wLjkuamFyCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDMyZTg4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1hZGQucG5nCi1iYWNrd2FyZC5wbmcKLWNsZWFyLnBuZwotZC5wbmcKLWRlYnVnLWF0dGFjaC5wbmcKLWRlYnVnLWVycm9yLnBuZwotZGVidWctd2FpdC5wbmcKLWRlbGV0ZS5wbmcKLWRldmljZS5wbmcKLWRvd24ucG5nCi1lLnBuZwotZWRpdC5wbmcKLWVtcHR5LnBuZwotZW11bGF0b3IucG5nCi1mb3J3YXJkLnBuZwotZ2MucG5nCi1oYWx0LnBuZwotaGVhcC5wbmcKLWkucG5nCi1pbXBvcnRCdWcucG5nCi1sb2FkLnBuZwotcGF1c2UucG5nCi1wbGF5LnBuZwotcHVsbC5wbmcKLXB1c2gucG5nCi1zYXZlLnBuZwotdGhyZWFkLnBuZwotdXAucG5nCi12LnBuZwotdy5wbmcKLXdhcm5pbmcucG5nCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9hbmRyb2lkLnBuZyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2FuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzc5ZDRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zL2FuZHJvaWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvY2FwdHVyZS5wbmcgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9jYXB0dXJlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1ZTdhOS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy9jYXB0dXJlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmYwZS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvcGx1Z2luLnhtbCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmFkZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IkFuZHJvaWQiCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5jYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5EZXZpY2VWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZGV2aWNlLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkRldmljZVZpZXciCi0gICAgICAgICAgICBuYW1lPSJEZXZpY2VzIj4KLSAgICAgIDwvdmlldz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuTG9nQ2F0VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2FuZHJvaWQucG5nIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuTG9nQ2F0VmlldyIKLSAgICAgICAgICAgIG5hbWU9IkxvZ0NhdCIvPgotICAgICAgPCEtLSBEaXNhYmxlZCBmb3Igbm93IGR1ZSB0byBBV1QvU1dUIGJyaWRnZSBpc3N1ZSBvbiBMZW9wYXJkLgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5FdmVudExvZ1ZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkV2ZW50TG9nVmlldyIKLSAgICAgICAgICAgIG5hbWU9IkV2ZW50IExvZyIvPiAtLT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuVGhyZWFkVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3RocmVhZC5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5UaHJlYWRWaWV3IgotICAgICAgICAgICAgbmFtZT0iVGhyZWFkcyIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5IZWFwVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2hlYXAucG5nIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuSGVhcFZpZXciCi0gICAgICAgICAgICBuYW1lPSJIZWFwIi8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0iZmFsc2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkZpbGVFeHBsb3JlclZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkZpbGVFeHBsb3JlclZpZXciCi0gICAgICAgICAgICBuYW1lPSJGaWxlIEV4cGxvcmVyIi8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0iZmFsc2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkVtdWxhdG9yQ29udHJvbFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9lbXVsYXRvci5wbmciCi0gICAgICAgICAgICBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5FbXVsYXRvckNvbnRyb2xWaWV3IgotICAgICAgICAgICAgbmFtZT0iRW11bGF0b3IgQ29udHJvbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9hbmRyb2lkLnBuZyIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLlBlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iRERNUyIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuUGVyc3BlY3RpdmUiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuUGVyc3BlY3RpdmUiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuUGVyc3BlY3RpdmUiLz4KLSAgICAgICAgIDx2aWV3IGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkxvZ0NhdFZpZXciCi0JICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IgotCSAgICAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siIC8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UucHJlZmVyZW5jZXMubWFpbiIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnByZWZlcmVuY2VzLlByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJERE1TIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnByZWZlcmVuY2VzLm1haW4iCi0gICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5wcmVmZXJlbmNlcy5Mb2dDYXRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnByZWZlcmVuY2VzLkxvZ0NhdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iTG9nQ2F0Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkOTk4MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZGRtbGliCi1kZG11aWxpYgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvQ29tbW9uQWN0aW9uLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9Db21tb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjYTRjYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9Db21tb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuYWN0aW9ucy5JQ29tbW9uQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQmFzaWMgYWN0aW9uIGV4dGVuZGluZyB0aGUgakZhY2UgQWN0aW9uIGNsYXNzIGluIG9yZGVyIHRvIGltcGxlbWVudAotICogSUNvbW1vbkFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElDb21tb25BY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgUnVubmFibGUgbVJ1bm5hYmxlOwotCi0gICAgcHVibGljIENvbW1vbkFjdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICogQHBhcmFtIGltYWdlCi0gICAgICovCi0gICAgcHVibGljIENvbW1vbkFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKHRleHQsIGltYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGV4dAotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqLwotICAgIHB1YmxpYyBDb21tb25BY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcih0ZXh0LCBzdHlsZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUnVubmFibGUucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIFJ1bm5hYmxlfS4KLSAgICAgKiBAc2VlIElDb21tb25BY3Rpb24jc2V0UnVubmFibGUoUnVubmFibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UnVubmFibGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgbVJ1bm5hYmxlID0gcnVubmFibGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvRGRtc1BsdWdpbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvRGRtc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkxODJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL0RkbXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5EZG1Db25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkRkbVByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JRGV2aWNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5JTG9nT3V0cHV0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRGRtVWlQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5EZXZpY2VQYW5lbC5JVWlTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkRldmljZVZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuTWVzc2FnZUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZVN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERkbXNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSURldmljZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICBJVWlTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMiOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9MT0NBVElPTiA9IFBMVUdJTl9JRCArICIuYWRiIjsgLy8gJE5PTi1OTFMtMSQKLQotICAgIC8qKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGRtc1BsdWdpbiBzUGx1Z2luOwotCi0gICAgLyoqIExvY2F0aW9uIG9mIHRoZSBhZGIgY29tbWFuZCBsaW5lIGV4ZWN1dGFibGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0FkYkxvY2F0aW9uOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzVG9vbHNGb2xkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNIcHJvZkNvbnZlcnRlcjsKLQotICAgIC8qKgotICAgICAqIERlYnVnIExhdW5jaGVyIGZvciBhbHJlYWR5IHJ1bm5pbmcgYXBwcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElEZWJ1Z0xhdW5jaGVyIHNSdW5uaW5nQXBwRGVidWdMYXVuY2hlcjsKLQotCi0gICAgLyoqIENvbnNvbGUgZm9yIERETVMgbG9nIG1lc3NhZ2UgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2VDb25zb2xlIG1EZG1zQ29uc29sZTsKLQotICAgIC8qKiBJbWFnZSBsb2FkZXIgb2JqZWN0ICovCi0gICAgcHJpdmF0ZSBJbWFnZUxvYWRlciBtTG9hZGVyOwotCi0gICAgcHJpdmF0ZSBJRGV2aWNlIG1DdXJyZW50RGV2aWNlOwotICAgIHByaXZhdGUgQ2xpZW50IG1DdXJyZW50Q2xpZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdGVuaW5nVG9VaVNlbGVjdGlvbiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SVNlbGVjdGlvbkxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uTGlzdGVuZXI+KCk7Ci0KLSAgICBwcml2YXRlIENvbG9yIG1SZWQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbURkbWxpYkluaXRpYWxpemVkOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgZGVidWdnZXIgbGF1bmNoZXIgZm9yIHJ1bm5pbmcgYXBwcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z0xhdW5jaGVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGVidWcoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcG9ydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBtZXRob2RzIHRoYXQgZGVhbHMKLSAgICAgKiB3aXRoIHtAbGluayBJRGV2aWNlfSBhbmQge0BsaW5rIENsaWVudH0gc2VsZWN0aW9uY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbnQgd2hlbiBhIG5ldyB7QGxpbmsgQ2xpZW50fSBpcyBzZWxlY3RlZC4KLSAgICAgICAgICogQHBhcmFtIHNlbGVjdGVkQ2xpZW50IFRoZSBzZWxlY3RlZCBjbGllbnQuIElmIG51bGwsIG5vIGNsaWVudHMgYXJlIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChDbGllbnQgc2VsZWN0ZWRDbGllbnQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIElEZXZpY2V9IGlzIHNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0ZWREZXZpY2UgdGhlIHNlbGVjdGVkIGRldmljZS4gSWYgbnVsbCwgbm8gZGV2aWNlcyBhcmUgc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElEZXZpY2Ugc2VsZWN0ZWREZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBEZG1zUGx1Z2luKCkgewotICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZWNsaXBzZSBzdG9yZQotICAgICAgICBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIGVjbGlwc2VTdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGREZXZpY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBEZG1VaVByZWZlcmVuY2VzLnNldFN0b3JlKGVjbGlwc2VTdG9yZSk7Ci0KLSAgICAgICAgLy9EZG1VaVByZWZlcmVuY2VzLmRpc3BsYXlDaGFydHMoKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGNvbnNvbGVzLgotICAgICAgICBtRGRtc0NvbnNvbGUgPSBuZXcgTWVzc2FnZUNvbnNvbGUoIkRETVMiLCBudWxsKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKS5hZGRDb25zb2xlcygKLSAgICAgICAgICAgICAgICBuZXcgSUNvbnNvbGVbXSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZG1zQ29uc29sZQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIE1lc3NhZ2VDb25zb2xlU3RyZWFtIGNvbnNvbGVTdHJlYW0gPSBtRGRtc0NvbnNvbGUubmV3TWVzc2FnZVN0cmVhbSgpOwotICAgICAgICBmaW5hbCBNZXNzYWdlQ29uc29sZVN0cmVhbSBlcnJvckNvbnNvbGVTdHJlYW0gPSBtRGRtc0NvbnNvbGUubmV3TWVzc2FnZVN0cmVhbSgpOwotICAgICAgICBtUmVkID0gbmV3IENvbG9yKGRpc3BsYXksIDB4RkYsIDB4MDAsIDB4MDApOwotCi0gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBjYW4gYmUgcnVuLCBpbiBzb21lIGNhc2VzLCBieSBhIG5vbiBVSSB0aHJlYWQsIGFuZCBiZWNhdXNlCi0gICAgICAgIC8vIGNoYW5naW5nIHRoZSBjb25zb2xlIHByb3BlcnRpZXMgdXBkYXRlIHRoZSBVSSwgd2UgbmVlZCB0byBtYWtlIHRoaXMgY2hhbmdlCi0gICAgICAgIC8vIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBlcnJvckNvbnNvbGVTdHJlYW0uc2V0Q29sb3IobVJlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNldCB1cCB0aGUgZGRtcyBsb2cgdG8gdXNlIHRoZSBkZG1zIGNvbnNvbGUuCi0gICAgICAgIExvZy5zZXRMb2dPdXRwdXQobmV3IElMb2dPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludExvZyhMb2dMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHRhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nTGV2ZWwuZ2V0UHJpb3JpdHkoKSA+PSBMb2dMZXZlbC5FUlJPUi5nZXRQcmlvcml0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VG9TdHJlYW0oZXJyb3JDb25zb2xlU3RyZWFtLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlTWFuYWdlcigpLnNob3dDb25zb2xlVmlldyhtRGRtc0NvbnNvbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VG9TdHJlYW0oY29uc29sZVN0cmVhbSwgdGFnLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50QW5kUHJvbXB0TG9nKGZpbmFsIExvZ0xldmVsIGxvZ0xldmVsLCBmaW5hbCBTdHJpbmcgdGFnLAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIHByaW50TG9nKGxvZ0xldmVsLCB0YWcsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIC8vIGRpYWxvZyBib3ggb25seSBydW4gaW4gVUkgdGhyZWFkLi4KLSAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ0xldmVsID09IExvZ0xldmVsLkVSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHRhZywgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGxvYWRlciB0aGF0J3MgYWJsZSB0byBsb2FkIHRoZSBpbWFnZXMKLSAgICAgICAgbUxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcih0aGlzKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGxpc3RlbmVyIGZvciB0aGUgcHJlZmVyZW5jZSBjaGFuZ2UKLSAgICAgICAgUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgICBwcmVmcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX0RFQlVHX1BPUlRfQkFTRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERkbVByZWZlcmVuY2VzLnNldERlYnVnUG9ydEJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNsaXBzZVN0b3JlLmdldEludChQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9ERUJVR19QT1JUX0JBU0UpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX1NFTEVDVEVEX0RFQlVHX1BPUlQuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRTZWxlY3RlZERlYnVnUG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2xpcHNlU3RvcmUuZ2V0SW50KFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX1NFTEVDVEVEX0RFQlVHX1BPUlQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX1RIUkVBRF9JTlRFUlZBTC5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERkbVVpUHJlZmVyZW5jZXMuc2V0VGhyZWFkUmVmcmVzaEludGVydmFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjbGlwc2VTdG9yZS5nZXRJbnQoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfVEhSRUFEX0lOVEVSVkFMKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9MT0dfTEVWRUwuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRMb2dMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2xpcHNlU3RvcmUuZ2V0U3RyaW5nKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX0xPR19MRVZFTCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfVElNRV9PVVQuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRUaW1lT3V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjbGlwc2VTdG9yZS5nZXRJbnQoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfVElNRV9PVVQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHJlYWQgdGhlIGFkYiBsb2NhdGlvbiBmcm9tIHRoZSBwcmVmcyB0byBhdHRlbXB0IHRvIHN0YXJ0IGl0IHByb3Blcmx5IHdpdGhvdXQKLSAgICAgICAgLy8gaGF2aW5nIHRvIHdhaXQgZm9yIEFEVCB0byBzdGFydAotICAgICAgICBmaW5hbCBib29sZWFuIGFkYlZhbGlkID0gc2V0QWRiTG9jYXRpb24oZWNsaXBzZVN0b3JlLmdldFN0cmluZyhBREJfTE9DQVRJT04pKTsKLQotICAgICAgICAvLyBzdGFydCBpdCBpbiBhIHRocmVhZCB0byByZXR1cm4gZnJvbSBzdGFydCgpIGFzYXAuCi0gICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBpbml0IGRkbWxpYiBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0KCkuaW5pdERkbWxpYigpOwotCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCBzdGFydCB0aGUgZmlyc3QgYnJpZGdlCi0gICAgICAgICAgICAgICAgaWYgKGFkYlZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5jcmVhdGVCcmlkZ2Uoc0FkYkxvY2F0aW9uLCB0cnVlIC8qIGZvcmNlTmV3QnJpZGdlICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaCBiZW5jaCA9IHNQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIGlmIChiZW5jaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmVuY2guZ2V0RGlzcGxheSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS50ZXJtaW5hdGUoKTsKLQotICAgICAgICBtUmVkLmRpc3Bvc2UoKTsKLQotICAgICAgICBzUGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGRtc1BsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJuIHRoZSBpbWFnZSBsb2FkZXIgZm9yIHRoZSBwbHVnaW4gKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlTG9hZGVyIGdldEltYWdlTG9hZGVyKCkgewotICAgICAgICBpZiAoc1BsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1BsdWdpbi5tTG9hZGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkYigpIHsKLSAgICAgICAgcmV0dXJuIHNBZGJMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUb29sc0ZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNUb29sc0ZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIcHJvZkNvbnZlcnRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNIcHJvZkNvbnZlcnRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIGFkYiBsb2NhdGlvbi4gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGxvY2F0aW9uIGlzIGFuIGV4aXN0aW5nIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXRBZGJMb2NhdGlvbihTdHJpbmcgYWRiTG9jYXRpb24pIHsKLSAgICAgICAgRmlsZSBhZGIgPSBuZXcgRmlsZShhZGJMb2NhdGlvbik7Ci0gICAgICAgIGlmIChhZGIuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHNBZGJMb2NhdGlvbiA9IGFkYkxvY2F0aW9uOwotCi0gICAgICAgICAgICBGaWxlIHRvb2xzRm9sZGVyID0gYWRiLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgIHNUb29sc0ZvbGRlciA9IHRvb2xzRm9sZGVyLmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgICAgICAgICBGaWxlIGhwcm9mQ29udmVydGVyID0gbmV3IEZpbGUodG9vbHNGb2xkZXIsIERkbUNvbnN0YW50cy5GTl9IUFJPRl9DT05WRVJURVIpOwotICAgICAgICAgICAgc0hwcm9mQ29udmVydGVyID0gaHByb2ZDb252ZXJ0ZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIEZpbGUgdHJhY2V2aWV3ID0gbmV3IEZpbGUodG9vbHNGb2xkZXIsIERkbUNvbnN0YW50cy5GTl9UUkFDRVZJRVcpOwotICAgICAgICAgICAgRGRtVWlQcmVmZXJlbmNlcy5zZXRUcmFjZXZpZXdMb2NhdGlvbih0cmFjZXZpZXcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBhZGIgZXhlY3V0YWJsZSBhbmQgb3B0aW9uYWxseSBzdGFydHMgYWRiCi0gICAgICogQHBhcmFtIGFkYiBsb2NhdGlvbiBvZiBhZGIKLSAgICAgKiBAcGFyYW0gc3RhcnRBZGIgZmxhZyB0byBzdGFydCBhZGIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWRiKFN0cmluZyBhZGIsIGJvb2xlYW4gc3RhcnRBZGIpIHsKLSAgICAgICAgaWYgKGFkYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2V0QWRiTG9jYXRpb24oYWRiKSkgewotICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBsb2NhdGlvbiBmb3IgZnV0dXJlIGRkbXMgb25seSBzdGFydC4KLSAgICAgICAgICAgICAgICBzUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEFEQl9MT0NBVElPTiwgc0FkYkxvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyB0aGUgc2VydmVyIGluIGEgdGhyZWFkIGluIGNhc2UgdGhpcyBpcyBibG9ja2luZy4KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRBZGIpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXQgZGRtbGliIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHQoKS5pbml0RGRtbGliKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW5kIHN0YXJ0IHRoZSBicmlkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuY3JlYXRlQnJpZGdlKHNBZGJMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZvcmNlTmV3QnJpZGdlICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdERkbWxpYigpIHsKLSAgICAgICAgaWYgKG1EZG1saWJJbml0aWFsaXplZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gc2V0IHRoZSBwcmVmZXJlbmNlcy4KLSAgICAgICAgICAgIFByZWZlcmVuY2VJbml0aWFsaXplci5zZXR1cFByZWZlcmVuY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIGluaXQgdGhlIGxpYgotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLmluaXQodHJ1ZSAvKiBkZWJ1Z2dlciBzdXBwb3J0ICovKTsKLQotICAgICAgICAgICAgbURkbWxpYkluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhdW5jaGVyIHJlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIHRoZSBkZWJ1Z2dlciB0byBydW5uaW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgKiBAcGFyYW0gbGF1bmNoZXIgVGhlIGxhdW5jaGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSdW5uaW5nQXBwRGVidWdMYXVuY2hlcihJRGVidWdMYXVuY2hlciBsYXVuY2hlcikgewotICAgICAgICBzUnVubmluZ0FwcERlYnVnTGF1bmNoZXIgPSBsYXVuY2hlcjsKLQotICAgICAgICAvLyBpZiB0aGUgcHJvY2VzcyB2aWV3IGlzIGFscmVhZHkgcnVubmluZywgZ2l2ZSBpdCB0aGUgbGF1bmNoZXIuCi0gICAgICAgIC8vIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGNhbGxlZCBmcm9tIGEgbm9uIHVpIHRocmVhZCwgc28gd2UgbWFrZSBzdXJlIHRvIGRvIHRoYXQKLSAgICAgICAgLy8gaW4gdGhlIHVpIHRocmVhZC4KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICBpZiAoZGlzcGxheSAhPSBudWxsICYmIGRpc3BsYXkuaXNEaXNwb3NlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBEZXZpY2VWaWV3IGR2ID0gRGV2aWNlVmlldy5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZHYuc2V0RGVidWdMYXVuY2hlcihzUnVubmluZ0FwcERlYnVnTGF1bmNoZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElEZWJ1Z0xhdW5jaGVyIGdldFJ1bm5pbmdBcHBEZWJ1Z0xhdW5jaGVyKCkgewotICAgICAgICByZXR1cm4gc1J1bm5pbmdBcHBEZWJ1Z0xhdW5jaGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCi0gICAgICAgIC8vIG5vdGlmeSB0aGUgbmV3IGxpc3RlbmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobUN1cnJlbnREZXZpY2UpOwotICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobUN1cnJlbnRDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMaXN0ZW5pbmdTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgIG1MaXN0ZW5pbmdUb1VpU2VsZWN0aW9uID0gc3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIHRoZSBhIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgbmV3IGRldmljZS4KLSAgICAgKgotICAgICAqIEBzZWUgSURldmljZUNoYW5nZUxpc3RlbmVyI2RldmljZUNvbm5lY3RlZChJRGV2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldmljZUNvbm5lY3RlZChJRGV2aWNlIGRldmljZSkgewotICAgICAgICAvLyBpZiB3ZSBhcmUgbGlzdGVuaW5nIHRvIHNlbGVjdGlvbiBjb21pbmcgZnJvbSB0aGUgdWksIHRoZW4gd2UgZG8gbm90aGluZywgYXMKLSAgICAgICAgLy8gYW55IGNoYW5nZSBpbiB0aGUgZGV2aWNlcy9jbGllbnRzLCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIFVJLCBhbmQgd2UnbGwgcmVjZWl2ZQotICAgICAgICAvLyBzZWxlY3Rpb24gbm90aWZpY2F0aW9uIHRocm91Z2ggb3VyIGltcGxlbWVudGF0aW9uIG9mIElVaVNlbGVjdGlvbkxpc3RlbmVyLgotICAgICAgICBpZiAobUxpc3RlbmluZ1RvVWlTZWxlY3Rpb24gPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbihkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIHRoZSBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgdG8gdGhlIHtAbGluayBBbmRyb2lkRGVidWdCcmlkZ2V9LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgbmV3IGRldmljZS4KLSAgICAgKgotICAgICAqIEBzZWUgSURldmljZUNoYW5nZUxpc3RlbmVyI2RldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldmljZURpc2Nvbm5lY3RlZChJRGV2aWNlIGRldmljZSkgewotICAgICAgICAvLyBpZiB3ZSBhcmUgbGlzdGVuaW5nIHRvIHNlbGVjdGlvbiBjb21pbmcgZnJvbSB0aGUgdWksIHRoZW4gd2UgZG8gbm90aGluZywgYXMKLSAgICAgICAgLy8gYW55IGNoYW5nZSBpbiB0aGUgZGV2aWNlcy9jbGllbnRzLCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIFVJLCBhbmQgd2UnbGwgcmVjZWl2ZQotICAgICAgICAvLyBzZWxlY3Rpb24gbm90aWZpY2F0aW9uIHRocm91Z2ggb3VyIGltcGxlbWVudGF0aW9uIG9mIElVaVNlbGVjdGlvbkxpc3RlbmVyLgotICAgICAgICBpZiAobUxpc3RlbmluZ1RvVWlTZWxlY3Rpb24gPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2Ugd2FzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudERldmljZSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBhIG5ldyBkZXZpY2UKLSAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UgYnJpZGdlID0gQW5kcm9pZERlYnVnQnJpZGdlLmdldEJyaWRnZSgpOwotICAgICAgICAgICAgICAgIGlmIChicmlkZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRldmljZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIElEZXZpY2VbXSBkZXZpY2VzID0gYnJpZGdlLmdldERldmljZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBzdGlsbCBoYXZlIGRldmljZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24oKElEZXZpY2UpbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWZhdWx0U2VsZWN0aW9uKGRldmljZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbigoSURldmljZSludWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBkZXZpY2UgZGF0YSBjaGFuZ2VkLCBvciB3aGVuIGNsaWVudHMgYXJlIHN0YXJ0ZWQvdGVybWluYXRlZCBvbiB0aGUgZGV2aWNlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIHNlbnQgZnJvbSBhIG5vbiBVSSB0aHJlYWQuCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHRoYXQgd2FzIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIGNoYW5nZU1hc2sgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIElEZXZpY2VDaGFuZ2VMaXN0ZW5lciNkZXZpY2VDaGFuZ2VkKElEZXZpY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV2aWNlQ2hhbmdlZChJRGV2aWNlIGRldmljZSwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgLy8gaWYgd2UgYXJlIGxpc3RlbmluZyB0byBzZWxlY3Rpb24gY29taW5nIGZyb20gdGhlIHVpLCB0aGVuIHdlIGRvIG5vdGhpbmcsIGFzCi0gICAgICAgIC8vIGFueSBjaGFuZ2UgaW4gdGhlIGRldmljZXMvY2xpZW50cywgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBVSSwgYW5kIHdlJ2xsIHJlY2VpdmUKLSAgICAgICAgLy8gc2VsZWN0aW9uIG5vdGlmaWNhdGlvbiB0aHJvdWdoIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBJVWlTZWxlY3Rpb25MaXN0ZW5lci4KLSAgICAgICAgaWYgKG1MaXN0ZW5pbmdUb1VpU2VsZWN0aW9uID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgb3VyIGRldmljZQotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBtQ3VycmVudERldmljZSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24oZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNsaWVudHMgYW5kIG1ha2Ugc3VyZSBvdXJzIGlzIHN0aWxsIGluIHRoZXJlLgotICAgICAgICAgICAgICAgICAgICBDbGllbnRbXSBjbGllbnRzID0gZGV2aWNlLmdldENsaWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZENsaWVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENsaWVudCBjbGllbnQgOiBjbGllbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ID09IG1DdXJyZW50Q2xpZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBvdXIgY2xpZW50LCBsZXRzIGxvb2sgZm9yIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRDbGllbnQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHRTZWxlY3Rpb24oZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyB7QGxpbmsgSURldmljZX0gYW5kIHtAbGluayBDbGllbnR9IGFyZSBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWREZXZpY2UgdGhlIHNlbGVjdGVkIGRldmljZS4gSWYgbnVsbCwgbm8gZGV2aWNlcyBhcmUgc2VsZWN0ZWQuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkQ2xpZW50IFRoZSBzZWxlY3RlZCBjbGllbnQuIElmIG51bGwsIG5vIGNsaWVudHMgYXJlIHNlbGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElEZXZpY2Ugc2VsZWN0ZWREZXZpY2UsIENsaWVudCBzZWxlY3RlZENsaWVudCkgewotICAgICAgICBpZiAobUN1cnJlbnREZXZpY2UgIT0gc2VsZWN0ZWREZXZpY2UpIHsKLSAgICAgICAgICAgIG1DdXJyZW50RGV2aWNlID0gc2VsZWN0ZWREZXZpY2U7Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aGUgbmV3IGRlZmF1bHQgZGV2aWNlCi0gICAgICAgICAgICBmb3IgKElTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudENsaWVudCAhPSBzZWxlY3RlZENsaWVudCkgewotICAgICAgICAgICAgbUN1cnJlbnRDbGllbnQgPSBzZWxlY3RlZENsaWVudDsKLQotICAgICAgICAgICAgLy8gbm90aWZ5IG9mIHRoZSBuZXcgZGVmYXVsdCBjbGllbnQKLSAgICAgICAgICAgIGZvciAoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobUN1cnJlbnRDbGllbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGRlZmF1bHQgc2VsZWN0aW9uIG9mIGEge0BsaW5rIElEZXZpY2V9IGFuZCB7QGxpbmsgQ2xpZW50fS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBzZWxlY3RlZCBkZXZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbihmaW5hbCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICAvLyBiZWNhdXNlIHRoZSBsaXN0ZW5lciBleHBlY3QgdG8gcmVjZWl2ZSB0aGlzIGZyb20gdGhlIFVJIHRocmVhZCwgYW5kIHRoaXMgaXMgY2FsbGVkCi0gICAgICAgIC8vIGZyb20gdGhlIEFuZHJvaWREZWJ1Z0JyaWRnZSBub3RpZmljYXRpb25zLCB3ZSBuZWVkIHRvIHJ1biB0aGlzIGluIHRoZSBVSSB0aHJlYWQuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IGRldmljZSBpZiBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3RGV2aWNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudERldmljZSAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9mIHRoZSBuZXcgZGVmYXVsdCBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZGV2aWNlIHN3aXRjaCBvciB0aGUgc2FtZSBkZXZpY2UgYnV0IHdlIGRpZG4ndCBmaW5kIGEgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCB0aGUgbGFzdCB0aW1lLCB3ZSBnbyBsb29rIGZvciBhIGNsaWVudCB0byB1c2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGV2aWNlIHx8IG1DdXJyZW50Q2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgZ2V0IHRoZSBuZXcgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50W10gY2xpZW50cyA9ICBkZXZpY2UuZ2V0Q2xpZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbihjbGllbnRzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWZhdWx0U2VsZWN0aW9uKChDbGllbnQpbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVmYXVsdFNlbGVjdGlvbigoQ2xpZW50KW51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkaXNwbGF5IGlzIGRpc3Bvc2VkLiBEbyBub3RoaW5nIHNpbmNlIHdlJ3JlIHF1aXR0aW5nIGFueXdheS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEZWZhdWx0U2VsZWN0aW9uKENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgbUN1cnJlbnRDbGllbnQgPSBjbGllbnQ7Ci0KLSAgICAgICAgLy8gbm90aWZ5IG9mIHRoZSBuZXcgZGVmYXVsdCBjbGllbnQKLSAgICAgICAgZm9yIChJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG1DdXJyZW50Q2xpZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIG1lc3NhZ2UsIGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8KLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB0byB0aGUgbWVzc2FnZS4gQ2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBwcmludC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludFRvU3RyZWFtKE1lc3NhZ2VDb25zb2xlU3RyZWFtIHN0cmVhbSwgU3RyaW5nIHRhZywKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIFN0cmluZyBkYXRlVGFnID0gZ2V0TWVzc2FnZVRhZyh0YWcpOwotCi0gICAgICAgIHN0cmVhbS5wcmludChkYXRlVGFnKTsKLSAgICAgICAgc3RyZWFtLnByaW50bG4obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGRhdGUvdGltZSwgYW5kIHRoZSB0YWcKLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgYXNzb2NpYXRlZCB0byB0aGUgbWVzc2FnZS4gQ2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIFRoZSBkYXRlVGFnCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VUYWcoU3RyaW5nIHRhZykgewotICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICBpZiAodGFnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJTEkdEYgJTEkdFRdIiwgYyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyUxJHRGICUxJHRUIC0gJTIkc10iLCBjLCB0YWcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL0ltYWdlTG9hZGVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9JbWFnZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA0MDVkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL0ltYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklJbWFnZUxvYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUltYWdlTG9hZGVyIGludGVyZmFjZSBmb3IgdGhlIGVjbGlwc2UgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VMb2FkZXIgaW1wbGVtZW50cyBJSW1hZ2VMb2FkZXIgIHsKLQotICAgIHByaXZhdGUgVVJMIG1CYXNlVXJsOwotCi0gICAgcHVibGljIEltYWdlTG9hZGVyKFBsdWdpbiBwbHVnaW4pIHsKLSAgICAgICAgbUJhc2VVcmwgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8gJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IG1ldGhvZC4gb25seSBuZWVkIGEgZmlsZW5hbWUuIHRoZSAyIGludGVyZmFjZSBtZXRob2RzIGNhbGwgdGhpcyBvbmUuCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSBvZiB0aGUgaW1hZ2UgdG8gbG9hZC4gVGhlIGZpbGVuYW1lIGlzIHNlYXJjaGVkIGZvciB1bmRlciAvaWNvbnMuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgbG9hZERlc2NyaXB0b3IoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgbmV3VXJsID0gbmV3IFVSTChtQmFzZVVybCwgIi9pY29ucy8iICsgZmlsZW5hbWUpOyAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VybCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3ZSdsbCBqdXN0IHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgbG9hZERlc2NyaXB0b3IoU3RyaW5nIGZpbGVuYW1lLCBEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgcmV0dXJuIGxvYWREZXNjcmlwdG9yKGZpbGVuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBJbWFnZSBsb2FkSW1hZ2UoU3RyaW5nIGZpbGVuYW1lLCBEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBsb2FkRGVzY3JpcHRvcihmaWxlbmFtZSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9bnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL1BlcnNwZWN0aXZlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9QZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAxZTliLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuRGV2aWNlVmlldzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkVtdWxhdG9yQ29udHJvbFZpZXc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5GaWxlRXhwbG9yZXJWaWV3OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuSGVhcFZpZXc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5Mb2dDYXRWaWV3OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuVGhyZWFkVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IGxheW91dCB0aGF0IGxvb2tzIGxpa2UgdGhlIHN0YW5kIGFsb25lIERETVMuCi0KLSAgICAgICAgLy8gbm8gZWRpdG9yIHdpbmRvdwotICAgICAgICBsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotCi0gICAgICAgIFN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLSAgICAgICAgSUZvbGRlckxheW91dCBmb2xkZXI7Ci0KLSAgICAgICAgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigibG9nY2F0IiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjhmLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZWRpdG9yQXJlYSk7Ci0gICAgICAgIGZvbGRlci5hZGRQbGFjZWhvbGRlcihMb2dDYXRWaWV3LklEICsgIjoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9sZGVyLmFkZFZpZXcoTG9nQ2F0Vmlldy5JRCk7Ci0KLSAgICAgICAgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiZGV2aWNlcyIsIElQYWdlTGF5b3V0LkxFRlQsIDAuM2YsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBlZGl0b3JBcmVhKTsKLSAgICAgICAgZm9sZGVyLmFkZFBsYWNlaG9sZGVyKERldmljZVZpZXcuSUQgKyAiOioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb2xkZXIuYWRkVmlldyhEZXZpY2VWaWV3LklEKTsKLQotICAgICAgICBmb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJlbXVsYXRvciIsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC41ZiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJkZXZpY2VzIik7Ci0gICAgICAgIGZvbGRlci5hZGRQbGFjZWhvbGRlcihFbXVsYXRvckNvbnRyb2xWaWV3LklEICsgIjoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9sZGVyLmFkZFZpZXcoRW11bGF0b3JDb250cm9sVmlldy5JRCk7Ci0KLSAgICAgICAgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiZGRtcy1kZXRhaWwiLCBJUGFnZUxheW91dC5SSUdIVCwgMC41ZiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGVkaXRvckFyZWEpOwotICAgICAgICBmb2xkZXIuYWRkUGxhY2Vob2xkZXIoVGhyZWFkVmlldy5JRCArICI6KiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvbGRlci5hZGRWaWV3KFRocmVhZFZpZXcuSUQpOwotICAgICAgICBmb2xkZXIuYWRkVmlldyhIZWFwVmlldy5JRCk7Ci0gICAgICAgIGZvbGRlci5hZGRWaWV3KEZpbGVFeHBsb3JlclZpZXcuSUQpOwotCi0gICAgICAgIGxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoRGV2aWNlVmlldy5JRCk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEZpbGVFeHBsb3JlclZpZXcuSUQpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChIZWFwVmlldy5JRCk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KExvZ0NhdFZpZXcuSUQpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChUaHJlYWRWaWV3LklEKTsKLQotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9QUk9HUkVTU19WSUVXKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9wcmVmZXJlbmNlcy9Mb2dDYXRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvcHJlZmVyZW5jZXMvTG9nQ2F0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5MjA3ZC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9wcmVmZXJlbmNlcy9Mb2dDYXRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkxvZ0NhdFZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZvbnRGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgUGFuZSBmb3IgTG9nQ2F0LgotICovCi1wdWJsaWMgY2xhc3MgTG9nQ2F0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLSAgICAgICAgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotICAgIHB1YmxpYyBMb2dDYXRQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoR1JJRCk7Ci0gICAgICAgIHNldFByZWZlcmVuY2VTdG9yZShEZG1zUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotICAgICAgICBGb250RmllbGRFZGl0b3IgZmZlID0gbmV3IEZvbnRGaWVsZEVkaXRvcihQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9MT0dDQVRfRk9OVCwKLSAgICAgICAgICAgICAgICAiRGlzcGxheSBGb250OiIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICBhZGRGaWVsZChmZmUpOwotCi0gICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gRGRtc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgcHJlZnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotICAgICAgICAgICAgICAgIGlmIChQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9MT0dDQVRfRk9OVC5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGb250RGF0YSBmZGF0ID0gbmV3IEZvbnREYXRhKChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dDYXRWaWV3LnNldEZvbnQobmV3IEZvbnQoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKS5nZXREaXNwbGF5KCksIGZkYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgdGhlIGRhdGEgZnJvbSB0aGUgc3RvcmUgaXMgbm90IHZhbGlkLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90aGluZyAoZGVmYXVsdCBmb250IHdpbGwgYmUgdXNlZCkuCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEVycm9yIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIHRoZSBGb250KCkgY29uc3RydWN0b3IgZmFpbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90aGluZyBpbiB0aGlzIGNhc2UsIHRoZSBsb2djYXQgdmlldyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmb250LgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYmM0Zi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuRGV2aWNlVmlldy5IUHJvZkhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkRkbVByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLkRkbVVpUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9MT0dfTEVWRUwgPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIubG9nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0RFQlVHX1BPUlRfQkFTRSA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5hZGJEZWJ1Z0Jhc2VQb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9TRUxFQ1RFRF9ERUJVR19QT1JUID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmRlYnVnU2VsZWN0ZWRQb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9ERUZBVUxUX1RIUkVBRF9VUERBVEUgPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIuZGVmYXVsdFRocmVhZFVwZGF0ZUVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0RFRkFVTFRfSEVBUF9VUERBVEUgPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIuZGVmYXVsdEhlYXBVcGRhdGVFbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9USFJFQURfSU5URVJWQUwgPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIudGhyZWFkU3RhdHVzSW50ZXJ2YWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0lNQUdFX1NBVkVfRElSID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmltYWdlU2F2ZURpciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTEFTVF9JTUFHRV9TQVZFX0RJUiA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sYXN0SW1hZ2VTYXZlRGlyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9MT0dDQVRfRk9OVCA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sb2djYXRGb250IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9IUFJPRl9BQ1RJT04gPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIuaHByb2ZBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1RJTUVfT1VUID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLnRpbWVPdXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyCi0gICAgICogI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBEZG1zUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEFUVFJfREVCVUdfUE9SVF9CQVNFLCBEZG1QcmVmZXJlbmNlcy5ERUZBVUxUX0RFQlVHX1BPUlRfQkFTRSk7Ci0KLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChBVFRSX1NFTEVDVEVEX0RFQlVHX1BPUlQsIERkbVByZWZlcmVuY2VzLkRFRkFVTFRfU0VMRUNURURfREVCVUdfUE9SVCk7Ci0KLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChBVFRSX0RFRkFVTFRfVEhSRUFEX1VQREFURSwgRGRtUHJlZmVyZW5jZXMuREVGQVVMVF9JTklUSUFMX1RIUkVBRF9VUERBVEUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEFUVFJfREVGQVVMVF9IRUFQX1VQREFURSwKLSAgICAgICAgICAgICAgICBEZG1QcmVmZXJlbmNlcy5ERUZBVUxUX0lOSVRJQUxfSEVBUF9VUERBVEUpOwotCi0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoQVRUUl9USFJFQURfSU5URVJWQUwsIERkbVVpUHJlZmVyZW5jZXMuREVGQVVMVF9USFJFQURfUkVGUkVTSF9JTlRFUlZBTCk7Ci0KLSAgICAgICAgU3RyaW5nIGhvbWVEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoQVRUUl9JTUFHRV9TQVZFX0RJUiwgaG9tZURpcik7Ci0KLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChBVFRSX0xPR19MRVZFTCwgRGRtUHJlZmVyZW5jZXMuREVGQVVMVF9MT0dfTEVWRUwuZ2V0U3RyaW5nVmFsdWUoKSk7Ci0KLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChBVFRSX0xPR0NBVF9GT05ULAotICAgICAgICAgICAgICAgIG5ldyBGb250RGF0YSgiQ291cmllciIsIDEwLCBTV1QuTk9STUFMKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoQVRUUl9IUFJPRl9BQ1RJT04sIEhQcm9mSGFuZGxlci5BQ1RJT05fT1BFTik7Ci0KLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChBVFRSX1RJTUVfT1VULCBEZG1QcmVmZXJlbmNlcy5ERUZBVUxUX1RJTUVPVVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBwcmVmZXJlbmNlcyBvZiBkZG1saWIgYW5kIGRkbXVpbGliIHdpdGggdmFsdWVzIGZyb20gdGhlIGVjbGlwc2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzZXR1cFByZWZlcmVuY2VzKCkgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0RGVidWdQb3J0QmFzZShzdG9yZS5nZXRJbnQoQVRUUl9ERUJVR19QT1JUX0JBU0UpKTsKLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0U2VsZWN0ZWREZWJ1Z1BvcnQoc3RvcmUuZ2V0SW50KEFUVFJfU0VMRUNURURfREVCVUdfUE9SVCkpOwotICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRMb2dMZXZlbChzdG9yZS5nZXRTdHJpbmcoQVRUUl9MT0dfTEVWRUwpKTsKLSAgICAgICAgRGRtUHJlZmVyZW5jZXMuc2V0SW5pdGlhbFRocmVhZFVwZGF0ZShzdG9yZS5nZXRCb29sZWFuKEFUVFJfREVGQVVMVF9USFJFQURfVVBEQVRFKSk7Ci0gICAgICAgIERkbVByZWZlcmVuY2VzLnNldEluaXRpYWxIZWFwVXBkYXRlKHN0b3JlLmdldEJvb2xlYW4oQVRUUl9ERUZBVUxUX0hFQVBfVVBEQVRFKSk7Ci0gICAgICAgIERkbVVpUHJlZmVyZW5jZXMuc2V0VGhyZWFkUmVmcmVzaEludGVydmFsKHN0b3JlLmdldEludChBVFRSX1RIUkVBRF9JTlRFUlZBTCkpOwotICAgICAgICBEZG1QcmVmZXJlbmNlcy5zZXRUaW1lT3V0KHN0b3JlLmdldEludChBVFRSX1RJTUVfT1VUKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODUyZjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLkRkbXNQbHVnaW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5EZXZpY2VWaWV3LkhQcm9mSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLlBvcnRGaWVsZEVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQm9vbGVhbkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29tYm9GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgICAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gICAgcHVibGljIFByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBzdXBlcihHUklEKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKERkbXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YgdGhlIGNvbW1vbgotICAgICAqIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcyBvZiBwcmVmZXJlbmNlcy4gRWFjaCBmaWVsZAotICAgICAqIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpdHNlbGYuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotICAgICAgICBJbnRlZ2VyRmllbGRFZGl0b3IgaWZlOwotCi0gICAgICAgIGlmZSA9IG5ldyBQb3J0RmllbGRFZGl0b3IoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfREVCVUdfUE9SVF9CQVNFLAotICAgICAgICAgICAgIkJhc2UgbG9jYWwgZGVidWdnZXIgcG9ydDoiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgYWRkRmllbGQoaWZlKTsKLQotICAgICAgICBCb29sZWFuRmllbGRFZGl0b3IgYmZlOwotCi0gICAgICAgIGJmZSA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfREVGQVVMVF9USFJFQURfVVBEQVRFLAotICAgICAgICAgICAgIlRocmVhZCB1cGRhdGVzIGVuYWJsZWQgYnkgZGVmYXVsdCIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotICAgICAgICBhZGRGaWVsZChiZmUpOwotCi0gICAgICAgIGJmZSA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfREVGQVVMVF9IRUFQX1VQREFURSwKLSAgICAgICAgICAgICJIZWFwIHVwZGF0ZXMgZW5hYmxlZCBieSBkZWZhdWx0IiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKGJmZSk7Ci0KLSAgICAgICAgaWZlID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9USFJFQURfSU5URVJWQUwsCi0gICAgICAgICAgICAiVGhyZWFkIHN0YXR1cyByZWZyZXNoIGludGVydmFsIChzZWNvbmRzKToiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgaWZlLnNldFZhbGlkUmFuZ2UoMSwgNjApOwotICAgICAgICBhZGRGaWVsZChpZmUpOwotCi0gICAgICAgIENvbWJvRmllbGRFZGl0b3IgY2ZlID0gbmV3IENvbWJvRmllbGRFZGl0b3IoUHJlZmVyZW5jZUluaXRpYWxpemVyLkFUVFJfSFBST0ZfQUNUSU9OLAotICAgICAgICAgICAgICAgICJIUFJPRiBBY3Rpb246IiwgbmV3IFN0cmluZ1tdW10gewotICAgICAgICAgICAgICAgICAgICB7ICJTYXZlIHRvIGRpc2siLCBIUHJvZkhhbmRsZXIuQUNUSU9OX1NBVkUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiT3BlbiBpbiBFY2xpcHNlIiwgSFByb2ZIYW5kbGVyLkFDVElPTl9PUEVOIH0sCi0gICAgICAgICAgICAgICAgfSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKGNmZSk7Ci0KLSAgICAgICAgaWZlID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9USU1FX09VVCwKLSAgICAgICAgICAgICAgICAiQURCIGNvbm5lY3Rpb24gdGltZSBvdXQgKG1zKToiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGlmZSk7Ci0KLSAgICAgICAgUmFkaW9Hcm91cEZpZWxkRWRpdG9yIHJnZmUgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX0xPR19MRVZFTCwKLSAgICAgICAgICAgICAgICAiTG9nZ2luZyBMZXZlbCIsIDEsIG5ldyBTdHJpbmdbXVtdIHsKLSAgICAgICAgICAgICAgICAgICAgeyAiVmVyYm9zZSIsIExvZ0xldmVsLlZFUkJPU0UuZ2V0U3RyaW5nVmFsdWUoKSB9LAotICAgICAgICAgICAgICAgICAgICB7ICJEZWJ1ZyIsIExvZ0xldmVsLkRFQlVHLmdldFN0cmluZ1ZhbHVlKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiSW5mbyIsIExvZ0xldmVsLklORk8uZ2V0U3RyaW5nVmFsdWUoKSB9LAotICAgICAgICAgICAgICAgICAgICB7ICJXYXJuaW5nIiwgTG9nTGV2ZWwuV0FSTi5nZXRTdHJpbmdWYWx1ZSgpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIkVycm9yIiwgTG9nTGV2ZWwuRVJST1IuZ2V0U3RyaW5nVmFsdWUoKSB9LAotICAgICAgICAgICAgICAgICAgICB7ICJBc3NlcnQiLCBMb2dMZXZlbC5BU1NFUlQuZ2V0U3RyaW5nVmFsdWUoKSB9Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSk7Ci0gICAgICAgIGFkZEZpZWxkKHJnZmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9EZXZpY2VWaWV3LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9EZXZpY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZWZiNTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvRGV2aWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuQ2xpZW50RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU3luY1NlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZS5JQ2xpZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuSUhwcm9mRHVtcEhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNsaWVudERhdGEuTWV0aG9kUHJvZmlsaW5nU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5TeW5jU2VydmljZS5TeW5jUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmhhbmRsZXIuQmFzZUZpbGVIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmhhbmRsZXIuTWV0aG9kUHJvZmlsaW5nSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5EZXZpY2VQYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5TY3JlZW5TaG90RGlhbG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLkRldmljZVBhbmVsLklVaVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLkRkbXNQbHVnaW4uSURlYnVnTGF1bmNoZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGV2aWNlVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVVpU2VsZWN0aW9uTGlzdGVuZXIsIElDbGllbnRDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIFVTRV9TRUxFQ1RFRF9ERUJVR19QT1JUID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0KLSAgICAgICAgImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuRGV2aWNlVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIERldmljZVZpZXcgc1RoaXM7Ci0KLSAgICBwcml2YXRlIFNoZWxsIG1QYXJlbnRTaGVsbDsKLSAgICBwcml2YXRlIERldmljZVBhbmVsIG1EZXZpY2VMaXN0OwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gbVJlc2V0QWRiQWN0aW9uOwotICAgIHByaXZhdGUgQWN0aW9uIG1DYXB0dXJlQWN0aW9uOwotICAgIHByaXZhdGUgQWN0aW9uIG1VcGRhdGVUaHJlYWRBY3Rpb247Ci0gICAgcHJpdmF0ZSBBY3Rpb24gbVVwZGF0ZUhlYXBBY3Rpb247Ci0gICAgcHJpdmF0ZSBBY3Rpb24gbUdjQWN0aW9uOwotICAgIHByaXZhdGUgQWN0aW9uIG1LaWxsQXBwQWN0aW9uOwotICAgIHByaXZhdGUgQWN0aW9uIG1EZWJ1Z0FjdGlvbjsKLSAgICBwcml2YXRlIEFjdGlvbiBtSHByb2ZBY3Rpb247Ci0gICAgcHJpdmF0ZSBBY3Rpb24gbVRyYWNpbmdBY3Rpb247Ci0gICAgcHJpdmF0ZSBJRGVidWdMYXVuY2hlciBtRGVidWdMYXVuY2hlcjsKLQotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIG1UcmFjaW5nU3RhcnRJbWFnZTsKLSAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBtVHJhY2luZ1N0b3BJbWFnZTsKLQotICAgIHB1YmxpYyBjbGFzcyBIUHJvZkhhbmRsZXIgZXh0ZW5kcyBCYXNlRmlsZUhhbmRsZXIgaW1wbGVtZW50cyBJSHByb2ZEdW1wSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9TQVZFID0iaHByb2Yuc2F2ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX09QRU4gPSAiaHByb2Yub3BlbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfSFBST0YgPSAiLmhwcm9mIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEhQcm9mSGFuZGxlcihTaGVsbCBwYXJlbnRTaGVsbCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgICAgIG1QYXJlbnRTaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgSFBST0YgZmlsZSBmb3IgYXBwbGljYXRpb24gJyUxJHMnLlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVjayBsb2djYXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldENsaWVudERhdGEoKS5nZXRDbGllbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGR1bXAgaHByb2YgYnV0dG9uIGlzIHJlLWVuYWJsZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzZWxlY3Rpb24uIGFzIHRoZSBjbGllbnQgaXMgZmluaXNoZWQgZHVtcGluZyBhbiBocHJvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBkb1NlbGVjdGlvbkNoYW5nZWQobURldmljZUxpc3QuZ2V0U2VsZWN0ZWRDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZVBhdGgsIGZpbmFsIENsaWVudCBjbGllbnQpIHsKLSAgICAgICAgICAgIG1QYXJlbnRTaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElEZXZpY2UgZGV2aWNlID0gY2xpZW50LmdldERldmljZSgpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzeW5jIHNlcnZpY2UgdG8gcHVsbCB0aGUgSFBST0YgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3luY1NlcnZpY2Ugc3luYyA9IGNsaWVudC5nZXREZXZpY2UoKS5nZXRTeW5jU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBmcm9tIHRoZSBwcmVmZXJlbmNlIHdoYXQgYWN0aW9uIHRvIHRha2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRGRtc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc3RvcmUuZ2V0U3RyaW5nKFByZWZlcmVuY2VJbml0aWFsaXplci5BVFRSX0hQUk9GX0FDVElPTik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFDVElPTl9PUEVOLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB0ZW1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYW5kcm9pZCIsIERPVF9IUFJPRik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBQYXRoID0gdGVtcC5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHVsbChzeW5jLCB0ZW1wUGF0aCwgcmVtb3RlRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmdldENvZGUoKSA9PSBTeW5jU2VydmljZS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4odGVtcFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBhY3Rpb24gaXMgQUNUSU9OX1NBVkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJvbXB0QW5kUHVsbChzeW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRDbGllbnREYXRhKCkuZ2V0Q2xpZW50RGVzY3JpcHRpb24oKSArIERPVF9IUFJPRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlUGF0aCwgIlNhdmUgSFBST0YgZmlsZSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5nZXRDb2RlKCkgIT0gU3luY1NlcnZpY2UuUkVTVUxUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRvd25sb2FkIEhQUk9GIGZpbGUgZnJvbSBkZXZpY2UgJyUxJHMnLlxuXG4lMiRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCksIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVycm9yKCJVbmFibGUgdG8gZG93bmxvYWQgSFBST0YgZmlsZSBmcm9tIGRldmljZSAnJTEkcycuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXJyb3IoIlVuYWJsZSB0byBkb3dubG9hZCBIUFJPRiBmaWxlIGZyb20gZGV2aWNlICclMSRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoZSBkdW1wIGhwcm9mIGJ1dHRvbiBpcyByZS1lbmFibGVkIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgc2VsZWN0aW9uLiBhcyB0aGUgY2xpZW50IGlzIGZpbmlzaGVkIGR1bXBpbmcgYW4gaHByb2YgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgZG9TZWxlY3Rpb25DaGFuZ2VkKG1EZXZpY2VMaXN0LmdldFNlbGVjdGVkQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gbWFrZSBhIHRlbXAgZmlsZSB0byBjb252ZXJ0IHRoZSBocHJvZiBpbnRvIHNvbWV0aGluZwotICAgICAgICAgICAgLy8gcmVhZGFibGUgYnkgbm9ybWFsIHRvb2xzCi0gICAgICAgICAgICBGaWxlIHRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJhbmRyb2lkIiwgRE9UX0hQUk9GKTsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wUGF0aCA9IHRlbXAuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nWzNdOwotICAgICAgICAgICAgY29tbWFuZFswXSA9IERkbXNQbHVnaW4uZ2V0SHByb2ZDb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgIGNvbW1hbmRbMV0gPSBwYXRoOwotICAgICAgICAgICAgY29tbWFuZFsyXSA9IHRlbXBQYXRoOwotCi0gICAgICAgICAgICBQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwotICAgICAgICAgICAgcC53YWl0Rm9yKCk7Ci0KLSAgICAgICAgICAgIElGaWxlU3RvcmUgZmlsZVN0b3JlID0gIEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShuZXcgUGF0aCh0ZW1wUGF0aCkpOwotICAgICAgICAgICAgaWYgKCFmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSAmJiBmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvck9uRmlsZVN0b3JlKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTdG9yZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihtUGFyZW50U2hlbGwsICJIUFJPRiBFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoZm9ybWF0LCBhcmdzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBEZXZpY2VWaWV3KCkgewotICAgICAgICAvLyB0aGUgdmlldyBpcyBkZWNsYXJlZCB3aXRoIGFsbG93TXVsdGlwbGU9ImZhbHNlIiBzbyB3ZQotICAgICAgICAvLyBjYW4gc2FmZWx5IGRvIHRoaXMuCi0gICAgICAgIHNUaGlzID0gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERldmljZVZpZXcgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBzVGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgSURlYnVnTGF1bmNoZXJ9LgotICAgICAqIEBwYXJhbSBkZWJ1Z0xhdW5jaGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVidWdMYXVuY2hlcihEZG1zUGx1Z2luLklEZWJ1Z0xhdW5jaGVyIGRlYnVnTGF1bmNoZXIpIHsKLSAgICAgICAgbURlYnVnTGF1bmNoZXIgPSBkZWJ1Z0xhdW5jaGVyOwotICAgICAgICBpZiAobURlYnVnQWN0aW9uICE9IG51bGwgJiYgbURldmljZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xpZW50IGN1cnJlbnRDbGllbnQgPSBtRGV2aWNlTGlzdC5nZXRTZWxlY3RlZENsaWVudCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EZWJ1Z0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtUGFyZW50U2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgQ2xpZW50RGF0YS5zZXRIcHJvZkR1bXBIYW5kbGVyKG5ldyBIUHJvZkhhbmRsZXIobVBhcmVudFNoZWxsKSk7Ci0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGRDbGllbnRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgQ2xpZW50RGF0YS5zZXRNZXRob2RQcm9maWxpbmdIYW5kbGVyKG5ldyBNZXRob2RQcm9maWxpbmdIYW5kbGVyKG1QYXJlbnRTaGVsbCkpOwotCi0gICAgICAgIG1EZXZpY2VMaXN0ID0gbmV3IERldmljZVBhbmVsKERkbXNQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKSwgVVNFX1NFTEVDVEVEX0RFQlVHX1BPUlQpOwotICAgICAgICBtRGV2aWNlTGlzdC5jcmVhdGVQYW5lbChwYXJlbnQpOwotICAgICAgICBtRGV2aWNlTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBEZG1zUGx1Z2luIHBsdWdpbiA9IERkbXNQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBtRGV2aWNlTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihwbHVnaW4pOwotICAgICAgICBwbHVnaW4uc2V0TGlzdGVuaW5nU3RhdGUodHJ1ZSk7Ci0KLSAgICAgICAgbUNhcHR1cmVBY3Rpb24gPSBuZXcgQWN0aW9uKCJTY3JlZW4gQ2FwdHVyZSIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFNjcmVlblNob3REaWFsb2cgZGxnID0gbmV3IFNjcmVlblNob3REaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBEZG1zUGx1Z2luLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBkbGcub3BlbihtRGV2aWNlTGlzdC5nZXRTZWxlY3RlZERldmljZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbUNhcHR1cmVBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlNjcmVlbiBDYXB0dXJlIik7Ci0gICAgICAgIG1DYXB0dXJlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBEZG1zUGx1Z2luLmdldEltYWdlTG9hZGVyKCkubG9hZERlc2NyaXB0b3IoImNhcHR1cmUucG5nIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgbVJlc2V0QWRiQWN0aW9uID0gbmV3IEFjdGlvbigiUmVzZXQgYWRiIikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSA9IEFuZHJvaWREZWJ1Z0JyaWRnZS5nZXRCcmlkZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnJpZGdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyaWRnZS5yZXN0YXJ0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBEaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEZG1zUGx1Z2luLmdldERpc3BsYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlhbG9nIGJveCBvbmx5IHJ1biBpbiB1aSB0aHJlYWQuLgotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiQWRiIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRiIGZhaWxlZCB0byByZXN0YXJ0IVxuXG5NYWtlIHN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBjb25maWd1cmVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtUmVzZXRBZGJBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlc2V0IHRoZSBhZGIgaG9zdCBkYWVtb24iKTsKLSAgICAgICAgbVJlc2V0QWRiQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0gICAgICAgICAgICAgICAgLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spKTsKLQotICAgICAgICBtS2lsbEFwcEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5raWxsU2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBtS2lsbEFwcEFjdGlvbi5zZXRUZXh0KCJTdG9wIFByb2Nlc3MiKTsKLSAgICAgICAgbUtpbGxBcHBBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlN0b3AgUHJvY2VzcyIpOwotICAgICAgICBtS2lsbEFwcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKERldmljZVBhbmVsLklDT05fSEFMVCkpOwotCi0gICAgICAgIG1HY0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5mb3JjZUdjT25TZWxlY3RlZENsaWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIG1HY0FjdGlvbi5zZXRUZXh0KCJDYXVzZSBHQyIpOwotICAgICAgICBtR2NBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNhdXNlIEdDIik7Ci0gICAgICAgIG1HY0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKERldmljZVBhbmVsLklDT05fR0MpKTsKLQotICAgICAgICBtSHByb2ZBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbURldmljZUxpc3QuZHVtcEhwcm9mKCk7Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3Rpb25DaGFuZ2VkKG1EZXZpY2VMaXN0LmdldFNlbGVjdGVkQ2xpZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtSHByb2ZBY3Rpb24uc2V0VGV4dCgiRHVtcCBIUFJPRiBmaWxlIik7Ci0gICAgICAgIG1IcHJvZkFjdGlvbi5zZXRUb29sVGlwVGV4dCgiRHVtcCBIUFJPRiBmaWxlIik7Ci0gICAgICAgIG1IcHJvZkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKERldmljZVBhbmVsLklDT05fSFBST0YpKTsKLQotICAgICAgICBtVXBkYXRlSGVhcEFjdGlvbiA9IG5ldyBBY3Rpb24oIlVwZGF0ZSBIZWFwIiwgSUFjdGlvbi5BU19DSEVDS19CT1gpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlID0gbVVwZGF0ZUhlYXBBY3Rpb24uaXNDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgbURldmljZUxpc3Quc2V0RW5hYmxlZEhlYXBPblNlbGVjdGVkQ2xpZW50KGVuYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1VcGRhdGVIZWFwQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJVcGRhdGUgSGVhcCIpOwotICAgICAgICBtVXBkYXRlSGVhcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKERldmljZVBhbmVsLklDT05fSEVBUCkpOwotCi0gICAgICAgIG1VcGRhdGVUaHJlYWRBY3Rpb24gPSBuZXcgQWN0aW9uKCJVcGRhdGUgVGhyZWFkcyIsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGVuYWJsZSA9IG1VcGRhdGVUaHJlYWRBY3Rpb24uaXNDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgbURldmljZUxpc3Quc2V0RW5hYmxlZFRocmVhZE9uU2VsZWN0ZWRDbGllbnQoZW5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbVVwZGF0ZVRocmVhZEFjdGlvbi5zZXRUb29sVGlwVGV4dCgiVXBkYXRlIFRocmVhZHMiKTsKLSAgICAgICAgbVVwZGF0ZVRocmVhZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKERldmljZVBhbmVsLklDT05fVEhSRUFEKSk7Ci0KLSAgICAgICAgbVRyYWNpbmdBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbURldmljZUxpc3QudG9nZ2xlTWV0aG9kUHJvZmlsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldFRleHQoIlN0YXJ0IE1ldGhvZCBQcm9maWxpbmciKTsKLSAgICAgICAgbVRyYWNpbmdBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlN0YXJ0IE1ldGhvZCBQcm9maWxpbmciKTsKLSAgICAgICAgbVRyYWNpbmdTdGFydEltYWdlID0gRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpLmxvYWREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fVFJBQ0lOR19TVEFSVCk7Ci0gICAgICAgIG1UcmFjaW5nU3RvcEltYWdlID0gRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpLmxvYWREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIERldmljZVBhbmVsLklDT05fVFJBQ0lOR19TVE9QKTsKLSAgICAgICAgbVRyYWNpbmdBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKG1UcmFjaW5nU3RhcnRJbWFnZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUncyBhbHJlYWR5IGEgZGVidWcgbGF1bmNoZXIgc2V0IHVwIGluIHRoZSBwbHVnaW4gY2xhc3MKLSAgICAgICAgbURlYnVnTGF1bmNoZXIgPSBEZG1zUGx1Z2luLmdldFJ1bm5pbmdBcHBEZWJ1Z0xhdW5jaGVyKCk7Ci0KLSAgICAgICAgbURlYnVnQWN0aW9uID0gbmV3IEFjdGlvbigiRGVidWcgUHJvY2VzcyIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmIChtRGVidWdMYXVuY2hlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsaWVudCBjdXJyZW50Q2xpZW50ID0gbURldmljZUxpc3QuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RGF0YSBjbGllbnREYXRhID0gY3VycmVudENsaWVudC5nZXRDbGllbnREYXRhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY2xpZW50IGNhbiBiZSBkZWJ1Z2dlZAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjbGllbnREYXRhLmdldERlYnVnZ2VyQ29ubmVjdGlvblN0YXR1cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEZG1zUGx1Z2luLmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiUHJvY2VzcyBEZWJ1ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBwcm9jZXNzIGRlYnVnIHBvcnQgaXMgYWxyZWFkeSBpbiB1c2UhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFRBQ0hFRDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEZG1zUGx1Z2luLmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiUHJvY2VzcyBEZWJ1ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBwcm9jZXNzIGlzIGFscmVhZHkgYmVpbmcgZGVidWdnZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjbGllbnREYXRhLmdldENsaWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVidWdMYXVuY2hlci5kZWJ1ZyhwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGllbnQuZ2V0RGVidWdnZXJMaXN0ZW5Qb3J0KCkpID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHRoZW4gd2UgZmFpbGVkIHRvIGZpbmQgYSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlZCB0aGUgYXBwbGljYXRpb24gdG8gZGVidWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGRtc1BsdWdpbi5nZXREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlByb2Nlc3MgRGVidWciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gb3BlbmVkIHByb2plY3QgZm91bmQgZm9yICUxJHMuIERlYnVnIHNlc3Npb24gZmFpbGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbURlYnVnQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJEZWJ1ZyB0aGUgc2VsZWN0ZWQgcHJvY2VzcywgcHJvdmlkZWQgaXRzIHNvdXJjZSBwcm9qZWN0IGlzIHByZXNlbnQgYW5kIG9wZW5lZCBpbiB0aGUgd29ya3NwYWNlLiIpOwotICAgICAgICBtRGVidWdBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERkbXNQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKQotICAgICAgICAgICAgICAgIC5sb2FkRGVzY3JpcHRvcigiZGVidWctYXR0YWNoLnBuZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobURlYnVnTGF1bmNoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbURlYnVnQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGxhY2VBY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIG1EZXZpY2VMaXN0LnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGEgbmV3IHtAbGluayBJRGV2aWNlfSBhbmQge0BsaW5rIENsaWVudH0gYXJlIHNlbGVjdGVkLgotICAgICAqIEBwYXJhbSBzZWxlY3RlZERldmljZSB0aGUgc2VsZWN0ZWQgZGV2aWNlLiBJZiBudWxsLCBubyBkZXZpY2VzIGFyZSBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDbGllbnQgVGhlIHNlbGVjdGVkIGNsaWVudC4gSWYgbnVsbCwgbm8gY2xpZW50cyBhcmUgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJRGV2aWNlIHNlbGVjdGVkRGV2aWNlLCBDbGllbnQgc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBidXR0b25zCi0gICAgICAgIGRvU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3RlZENsaWVudCk7Ci0gICAgICAgIGRvU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3RlZERldmljZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0aW9uQ2hhbmdlZChDbGllbnQgc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBidXR0b25zCi0gICAgICAgIGlmIChzZWxlY3RlZENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoVVNFX1NFTEVDVEVEX0RFQlVHX1BPUlQpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGNsaWVudCBhcyB0aGUgZGVidWcgY2xpZW50Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRDbGllbnQuc2V0QXNTZWxlY3RlZENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGVidWdBY3Rpb24uc2V0RW5hYmxlZChtRGVidWdMYXVuY2hlciAhPSBudWxsKTsKLSAgICAgICAgICAgIG1LaWxsQXBwQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtR2NBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgbVVwZGF0ZUhlYXBBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1VcGRhdGVIZWFwQWN0aW9uLnNldENoZWNrZWQoc2VsZWN0ZWRDbGllbnQuaXNIZWFwVXBkYXRlRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgbVVwZGF0ZVRocmVhZEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbVVwZGF0ZVRocmVhZEFjdGlvbi5zZXRDaGVja2VkKHNlbGVjdGVkQ2xpZW50LmlzVGhyZWFkVXBkYXRlRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgQ2xpZW50RGF0YSBkYXRhID0gc2VsZWN0ZWRDbGllbnQuZ2V0Q2xpZW50RGF0YSgpOwotCi0gICAgICAgICAgICBpZiAoZGF0YS5oYXNGZWF0dXJlKENsaWVudERhdGEuRkVBVFVSRV9IUFJPRikpIHsKLSAgICAgICAgICAgICAgICBtSHByb2ZBY3Rpb24uc2V0RW5hYmxlZChkYXRhLmhhc1BlbmRpbmdIcHJvZkR1bXAoKSA9PSBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUhwcm9mQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJEdW1wIEhQUk9GIGZpbGUiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUhwcm9mQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1IcHJvZkFjdGlvbi5zZXRUb29sVGlwVGV4dCgiRHVtcCBIUFJPRiBmaWxlIChub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVk0pIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkYXRhLmhhc0ZlYXR1cmUoQ2xpZW50RGF0YS5GRUFUVVJFX1BST0ZJTElORykpIHsKLSAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhLmdldE1ldGhvZFByb2ZpbGluZ1N0YXR1cygpID09IE1ldGhvZFByb2ZpbGluZ1N0YXR1cy5PTikgewotICAgICAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiU3RvcCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldFRleHQoIlN0b3AgTWV0aG9kIFByb2ZpbGluZyIpOwotICAgICAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobVRyYWNpbmdTdG9wSW1hZ2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihtVHJhY2luZ1N0YXJ0SW1hZ2UpOwotICAgICAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobVRyYWNpbmdTdGFydEltYWdlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiU3RhcnQgTWV0aG9kIFByb2ZpbGluZyAobm90IHN1cHBvcnRlZCBieSB0aGlzIFZNKSIpOwotICAgICAgICAgICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldFRleHQoIlN0YXJ0IE1ldGhvZCBQcm9maWxpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChVU0VfU0VMRUNURURfREVCVUdfUE9SVCkgewotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgY2xpZW50IGFzIHRoZSBkZWJ1ZyBjbGllbnQKLSAgICAgICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UgYnJpZGdlID0gQW5kcm9pZERlYnVnQnJpZGdlLmdldEJyaWRnZSgpOwotICAgICAgICAgICAgICAgIGlmIChicmlkZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmlkZ2Uuc2V0U2VsZWN0ZWRDbGllbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGVidWdBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtS2lsbEFwcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1HY0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1VcGRhdGVIZWFwQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgbVVwZGF0ZUhlYXBBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVXBkYXRlVGhyZWFkQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbVVwZGF0ZVRocmVhZEFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgIG1IcHJvZkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgbUhwcm9mQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbUhwcm9mQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJEdW1wIEhQUk9GIGZpbGUiKTsKLQotICAgICAgICAgICAgbVRyYWNpbmdBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobVRyYWNpbmdTdGFydEltYWdlKTsKLSAgICAgICAgICAgIG1UcmFjaW5nQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgICAgICBtVHJhY2luZ0FjdGlvbi5zZXRUZXh0KCJTdGFydCBNZXRob2QgUHJvZmlsaW5nIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3Rpb25DaGFuZ2VkKElEZXZpY2Ugc2VsZWN0ZWREZXZpY2UpIHsKLSAgICAgICAgbUNhcHR1cmVBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3RlZERldmljZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQbGFjZSB0aGUgYWN0aW9ucyBpbiB0aGUgdWkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBsYWNlQWN0aW9ucygpIHsKLSAgICAgICAgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCi0gICAgICAgIC8vIGZpcnN0IGluIHRoZSBtZW51Ci0gICAgICAgIElNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKLSAgICAgICAgbWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtRGVidWdBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1VcGRhdGVIZWFwQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1IcHJvZkFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtR2NBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1VcGRhdGVUaHJlYWRBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobVRyYWNpbmdBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1LaWxsQXBwQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtQ2FwdHVyZUFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobVJlc2V0QWRiQWN0aW9uKTsKLQotICAgICAgICAvLyBhbmQgdGhlbiBpbiB0aGUgdG9vbGJhcgotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLnJlbW92ZUFsbCgpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobURlYnVnQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtVXBkYXRlSGVhcEFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtSHByb2ZBY3Rpb24pOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobUdjQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtVXBkYXRlVGhyZWFkQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG1UcmFjaW5nQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtS2lsbEFwcEFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobUNhcHR1cmVBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsaWVudENoYW5nZWQoZmluYWwgQ2xpZW50IGNsaWVudCwgaW50IGNoYW5nZU1hc2spIHsKLSAgICAgICAgaWYgKChjaGFuZ2VNYXNrICYgQ2xpZW50LkNIQU5HRV9NRVRIT0RfUFJPRklMSU5HX1NUQVRVUykgPT0KLSAgICAgICAgICAgICAgICBDbGllbnQuQ0hBTkdFX01FVEhPRF9QUk9GSUxJTkdfU1RBVFVTKSB7Ci0gICAgICAgICAgICBpZiAobURldmljZUxpc3QuZ2V0U2VsZWN0ZWRDbGllbnQoKSA9PSBjbGllbnQpIHsKLSAgICAgICAgICAgICAgICBtUGFyZW50U2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgdGhlIGJ1dHRvbiBlbmFibGVkIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgZG9TZWxlY3Rpb25DaGFuZ2VkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0VtdWxhdG9yQ29udHJvbFZpZXcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0VtdWxhdG9yQ29udHJvbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5YTY5MS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9FbXVsYXRvckNvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuRW11bGF0b3JDb250cm9sUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRW11bGF0b3JDb250cm9sVmlldyBleHRlbmRzIFNlbGVjdGlvbkRlcGVuZGVudFZpZXdQYXJ0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0KLSAgICAgICAgImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3MuRW11bGF0b3JDb250cm9sVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgRW11bGF0b3JDb250cm9sUGFuZWwgbVBhbmVsOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtUGFuZWwgPSBuZXcgRW11bGF0b3JDb250cm9sUGFuZWwoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpKTsKLSAgICAgICAgbVBhbmVsLmNyZWF0ZVBhbmVsKHBhcmVudCk7Ci0gICAgICAgIHNldFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsKG1QYW5lbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIG1QYW5lbC5zZXRGb2N1cygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvRXZlbnRMb2dWaWV3LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9FdmVudExvZ1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3NGU0Mi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9FdmVudExvZ1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nLmV2ZW50LkV2ZW50TG9nUGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5Db21tb25BY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuSW1hZ2VMb2FkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci0KLXB1YmxpYyBjbGFzcyBFdmVudExvZ1ZpZXcgZXh0ZW5kcyBTZWxlY3Rpb25EZXBlbmRlbnRWaWV3UGFydCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBFdmVudExvZ1BhbmVsIG1Mb2dQYW5lbDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgSW1hZ2VMb2FkZXIgbG9hZGVyID0gRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZXh0ZXJuYWwgYWN0aW9ucwotICAgICAgICBDb21tb25BY3Rpb24gb3B0aW9uc0FjdGlvbiA9IG5ldyBDb21tb25BY3Rpb24oIk9wdGlvbnMuLi4iKTsKLSAgICAgICAgb3B0aW9uc0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiT3BlbnMgdGhlIG9wdGlvbnMgcGFuZWwiKTsKLSAgICAgICAgb3B0aW9uc0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobG9hZGVyCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKCJlZGl0LnBuZyIpKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICBDb21tb25BY3Rpb24gY2xlYXJMb2dBY3Rpb24gPSBuZXcgQ29tbW9uQWN0aW9uKCJDbGVhciBMb2ciKTsKLSAgICAgICAgY2xlYXJMb2dBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNsZWFycyB0aGUgZXZlbnQgbG9nIik7Ci0gICAgICAgIGNsZWFyTG9nQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihsb2FkZXIKLSAgICAgICAgICAgICAgICAubG9hZERlc2NyaXB0b3IoImNsZWFyLnBuZyIpKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICBDb21tb25BY3Rpb24gc2F2ZUFjdGlvbiA9IG5ldyBDb21tb25BY3Rpb24oIlNhdmUgTG9nIik7Ci0gICAgICAgIHNhdmVBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlNhdmVzIHRoZSBldmVudCBsb2ciKTsKLSAgICAgICAgc2F2ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobG9hZGVyCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKCJzYXZlLnBuZyIpKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICBDb21tb25BY3Rpb24gbG9hZEFjdGlvbiA9IG5ldyBDb21tb25BY3Rpb24oIkxvYWQgTG9nIik7Ci0gICAgICAgIGxvYWRBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkxvYWRzIGFuIGV2ZW50IGxvZyIpOwotICAgICAgICBsb2FkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihsb2FkZXIKLSAgICAgICAgICAgICAgICAubG9hZERlc2NyaXB0b3IoImxvYWQucG5nIikpOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgIENvbW1vbkFjdGlvbiBpbXBvcnRCdWdBY3Rpb24gPSBuZXcgQ29tbW9uQWN0aW9uKCJJbXBvcnQgQnVnIFJlcG9ydCBMb2ciKTsKLSAgICAgICAgaW1wb3J0QnVnQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJJbXBvcnRzIGEgYnVnIHJlcG9ydC4iKTsKLSAgICAgICAgaW1wb3J0QnVnQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihsb2FkZXIKLSAgICAgICAgICAgICAgICAubG9hZERlc2NyaXB0b3IoImltcG9ydEJ1Zy5wbmciKSk7IC8vICROT04tTkxTLTEkCi0KLSAgICAgICAgcGxhY2VBY3Rpb25zKG9wdGlvbnNBY3Rpb24sIGNsZWFyTG9nQWN0aW9uLCBzYXZlQWN0aW9uLCBsb2FkQWN0aW9uLCBpbXBvcnRCdWdBY3Rpb24pOwotCi0gICAgICAgIG1Mb2dQYW5lbCA9IG5ldyBFdmVudExvZ1BhbmVsKERkbXNQbHVnaW4uZ2V0SW1hZ2VMb2FkZXIoKSk7Ci0gICAgICAgIG1Mb2dQYW5lbC5zZXRBY3Rpb25zKG9wdGlvbnNBY3Rpb24sIGNsZWFyTG9nQWN0aW9uLCBzYXZlQWN0aW9uLCBsb2FkQWN0aW9uLCBpbXBvcnRCdWdBY3Rpb24pOwotICAgICAgICBtTG9nUGFuZWwuY3JlYXRlUGFuZWwocGFyZW50KTsKLSAgICAgICAgc2V0U2VsZWN0aW9uRGVwZW5kZW50UGFuZWwobUxvZ1BhbmVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgbUxvZ1BhbmVsLnNldEZvY3VzKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChtTG9nUGFuZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxvZ1BhbmVsLnN0b3BFdmVudExvZyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQbGFjZXMgdGhlIGFjdGlvbnMgaW4gdGhlIHRvb2xiYXIgYW5kIGluIHRoZSBtZW51LgotICAgICAqIEBwYXJhbSBpbXBvcnRCdWdBY3Rpb24gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBsYWNlQWN0aW9ucyhJQWN0aW9uIG9wdGlvbkFjdGlvbiwgSUFjdGlvbiBjbGVhckFjdGlvbiwgSUFjdGlvbiBzYXZlQWN0aW9uLAotICAgICAgICAgICAgSUFjdGlvbiBsb2FkQWN0aW9uLCBDb21tb25BY3Rpb24gaW1wb3J0QnVnQWN0aW9uKSB7Ci0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQotICAgICAgICAvLyBmaXJzdCBpbiB0aGUgbWVudQotICAgICAgICBJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChjbGVhckFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51TWFuYWdlci5hZGQoc2F2ZUFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChsb2FkQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKGltcG9ydEJ1Z0FjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51TWFuYWdlci5hZGQob3B0aW9uQWN0aW9uKTsKLQotICAgICAgICAvLyBhbmQgdGhlbiBpbiB0aGUgdG9vbGJhcgotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChjbGVhckFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQoc2F2ZUFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChsb2FkQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKGltcG9ydEJ1Z0FjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQob3B0aW9uQWN0aW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0ZpbGVFeHBsb3JlclZpZXcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0ZpbGVFeHBsb3JlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5MDEwYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9GaWxlRXhwbG9yZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuZXhwbG9yZXIuRGV2aWNlRXhwbG9yZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5Db21tb25BY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbi5JU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotcHVibGljIGNsYXNzIEZpbGVFeHBsb3JlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9Ci0gICAgICAgICJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzLkZpbGVFeHBsb3JlclZpZXciOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX05BTUUgPQotICAgICAgICBEZG1zUGx1Z2luLlBMVUdJTl9JRCArICIuZXhwbG9yZXIubmFtZSI7IC8vJE5PTi1OTFMtMVMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyAgU3RyaW5nIENPTFVNTl9TSVpFID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmV4cGxvcmVyLnNpemUiOyAvLyROT04tTkxTLTFTCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9EQVRFID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmV4cGxvcmVyLmRhdGEiOyAvLyROT04tTkxTLTFTCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9USU1FID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmV4cGxvcmVyLnRpbWUiOyAvLyROT04tTkxTLTFTCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9QRVJNSVNTSU9OUyA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsiLmV4cGxvcmVyLnBlcm1pc3Npb25zIjsgLy8kTk9OLU5MUy0xUwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fSU5GTyA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5leHBsb3Jlci5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBEZXZpY2VFeHBsb3JlciBtRXhwbG9yZXI7Ci0KLSAgICBwdWJsaWMgRmlsZUV4cGxvcmVyVmlldygpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIERldmljZUV4cGxvcmVyLkNPTFVNTl9OQU1FID0gQ09MVU1OX05BTUU7Ci0gICAgICAgIERldmljZUV4cGxvcmVyLkNPTFVNTl9TSVpFID0gQ09MVU1OX1NJWkU7Ci0gICAgICAgIERldmljZUV4cGxvcmVyLkNPTFVNTl9EQVRFID0gQ09MVU1OX0RBVEU7Ci0gICAgICAgIERldmljZUV4cGxvcmVyLkNPTFVNTl9USU1FID0gQ09MVU1OX1RJTUU7Ci0gICAgICAgIERldmljZUV4cGxvcmVyLkNPTFVNTl9QRVJNSVNTSU9OUyA9IENPTFVNTl9QRVJNSVNTSU9OUzsKLSAgICAgICAgRGV2aWNlRXhwbG9yZXIuQ09MVU1OX0lORk8gPSBDT0xVTU5fSU5GTzsKLQotICAgICAgICAvLyBkZXZpY2UgZXhwbG9yZXIKLSAgICAgICAgbUV4cGxvcmVyID0gbmV3IERldmljZUV4cGxvcmVyKCk7Ci0KLQotICAgICAgICBtRXhwbG9yZXIuc2V0SW1hZ2VzKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgICAgICAuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpLAotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkgLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUiksCi0gICAgICAgICAgICAgICAgRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpLmxvYWREZXNjcmlwdG9yKCJhbmRyb2lkLnBuZyIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVJbWFnZSgpLAotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkgLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKX0VMRU1FTlQpKTsKLQotICAgICAgICAvLyBjcmVhdGVzIHRoZSBhY3Rpb25zCi0gICAgICAgIENvbW1vbkFjdGlvbiBwdXNoQWN0aW9uID0gbmV3IENvbW1vbkFjdGlvbigiUHVzaCBGaWxlLi4uIikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGxvcmVyLnB1c2hJbnRvU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHB1c2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlB1c2ggYSBmaWxlIG9udG8gdGhlIGRldmljZSIpOwotICAgICAgICBwdXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEZG1zUGx1Z2luLmdldEltYWdlTG9hZGVyKCkKLSAgICAgICAgICAgICAgICAubG9hZERlc2NyaXB0b3IoInB1c2gucG5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHB1c2hBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgQ29tbW9uQWN0aW9uIHB1bGxBY3Rpb24gPSBuZXcgQ29tbW9uQWN0aW9uKCJQdWxsIEZpbGUuLi4iKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtRXhwbG9yZXIucHVsbFNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBwdWxsQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJQdWxsIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UiKTsKLSAgICAgICAgcHVsbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKCJwdWxsLnBuZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwdWxsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIENvbW1vbkFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgQ29tbW9uQWN0aW9uKCJEZWxldGUiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtRXhwbG9yZXIuZGVsZXRlU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRlbGV0ZUFjdGlvbi5zZXRUb29sVGlwVGV4dCgiRGVsZXRlIHRoZSBzZWxlY3Rpb24iKTsKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEZG1zUGx1Z2luLmdldEltYWdlTG9hZGVyKCkKLSAgICAgICAgICAgICAgICAubG9hZERlc2NyaXB0b3IoImRlbGV0ZS5wbmciKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIHNldCB1cCB0aGUgYWN0aW9ucyBpbiB0aGUgZXhwbG9yZXIKLSAgICAgICAgbUV4cGxvcmVyLnNldEFjdGlvbnMocHVzaEFjdGlvbiwgcHVsbEFjdGlvbiwgZGVsZXRlQWN0aW9uKTsKLQotICAgICAgICAvLyBhbmQgaW4gdGhlIHVpCi0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpOwotICAgICAgICBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0KLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKHB1bGxBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQocHVzaEFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51TWFuYWdlci5hZGQoZGVsZXRlQWN0aW9uKTsKLQotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQocHVsbEFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChwdXNoQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChkZWxldGVBY3Rpb24pOwotCi0gICAgICAgIG1FeHBsb3Jlci5jcmVhdGVQYW5lbChwYXJlbnQpOwotCi0gICAgICAgIERkbXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtRXhwbG9yZXIuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIENsaWVudH0gaXMgc2VsZWN0ZWQuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkQ2xpZW50IFRoZSBzZWxlY3RlZCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChDbGllbnQgc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyB7QGxpbmsgRGV2aWNlfSBpcyBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWREZXZpY2UgdGhlIHNlbGVjdGVkIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElEZXZpY2Ugc2VsZWN0ZWREZXZpY2UpIHsKLSAgICAgICAgbUV4cGxvcmVyLnN3aXRjaERldmljZShzZWxlY3RlZERldmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvblJlbW92ZWQoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0hlYXBWaWV3LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9IZWFwVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQ1ZThlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0hlYXBWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSGVhcFBhbmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSGVhcFZpZXcgZXh0ZW5kcyBUYWJsZVZpZXcgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5IZWFwVmlldyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIEhlYXBQYW5lbCBtUGFuZWw7Ci0KLSAgICBwdWJsaWMgSGVhcFZpZXcoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBtUGFuZWwgPSBuZXcgSGVhcFBhbmVsKCk7Ci0gICAgICAgIG1QYW5lbC5jcmVhdGVQYW5lbChwYXJlbnQpOwotCi0gICAgICAgIHNldFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsKG1QYW5lbCk7Ci0KLSAgICAgICAgLy8gbGlzdGVuIHRvIGZvY3VzIGNoYW5nZXMgZm9yIHRhYmxlKHMpIG9mIHRoZSBwYW5lbC4KLSAgICAgICAgc2V0dXBUYWJsZUZvY3VzTGlzdGVuZXIobVBhbmVsLCBwYXJlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtUGFuZWwuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0xvZ0NhdFZpZXcuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL0xvZ0NhdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwNTNmMS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9Mb2dDYXRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuQ29tbW9uQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLkltYWdlTG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIubG9nY2F0LkxvZ0NvbG9yczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQuTG9nRmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLmxvZ2NhdC5Mb2dQYW5lbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5sb2djYXQuTG9nUGFuZWwuSUxvZ0ZpbHRlclN0b3JhZ2VNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGhlIGxvZyBjYXQgdmlldyBkaXNwbGF5cyBsb2cgb3V0cHV0IGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2dDYXRWaWV3IGV4dGVuZHMgU2VsZWN0aW9uRGVwZW5kZW50Vmlld1BhcnQgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5Mb2dDYXRWaWV3IjsgLy8gJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfVElNRSA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sb2djYXQudGltZSI7IC8vICROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0NPTF9MRVZFTCA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sb2djYXQubGV2ZWwiOyAvLyAkTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfUElEID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmxvZ2NhdC5waWQiOyAvLyAkTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfVEFHID0KLSAgICAgICAgRGRtc1BsdWdpbi5QTFVHSU5fSUQgKyAiLmxvZ2NhdC50YWciOyAvLyAkTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19DT0xfTUVTU0FHRSA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sb2djYXQubWVzc2FnZSI7IC8vICROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfRklMVEVSUyA9Ci0gICAgICAgIERkbXNQbHVnaW4uUExVR0lOX0lEICsgIi5sb2djYXQuZmlsdGVycyI7IC8vICROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dDYXRWaWV3IHNUaGlzOwotICAgIHByaXZhdGUgTG9nUGFuZWwgbUxvZ1BhbmVsOwotCi0gICAgcHJpdmF0ZSBDb21tb25BY3Rpb24gbUNyZWF0ZUZpbHRlckFjdGlvbjsKLSAgICBwcml2YXRlIENvbW1vbkFjdGlvbiBtRGVsZXRlRmlsdGVyQWN0aW9uOwotICAgIHByaXZhdGUgQ29tbW9uQWN0aW9uIG1FZGl0RmlsdGVyQWN0aW9uOwotICAgIHByaXZhdGUgQ29tbW9uQWN0aW9uIG1FeHBvcnRBY3Rpb247Ci0KLSAgICBwcml2YXRlIENvbW1vbkFjdGlvbltdIG1Mb2dMZXZlbEFjdGlvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtTG9nTGV2ZWxJY29ucyA9IHsKLSAgICAgICAgICAgICJ2LnBuZyIsIC8vJE5PTi1OTFMtMVMKLSAgICAgICAgICAgICJkLnBuZyIsIC8vJE5PTi1OTFMtMVMKLSAgICAgICAgICAgICJpLnBuZyIsIC8vJE5PTi1OTFMtMVMKLSAgICAgICAgICAgICJ3LnBuZyIsIC8vJE5PTi1OTFMtMVMKLSAgICAgICAgICAgICJlLnBuZyIsIC8vJE5PTi1OTFMtMVMKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBBY3Rpb24gbUNsZWFyQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBDbGlwYm9hcmQgbUNsaXBib2FyZDsKLQotICAgIC8qKgotICAgICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTG9nRmlsdGVyU3RvcmFnZU1hbmFnZXJ9IHRvIGJyaWRnZSB0byB0aGUgZWNsaXBzZSBwcmVmZXJlbmNlCi0gICAgICogc3RvcmUsIGFuZCBzYXZlcyB0aGUgbG9nIGZpbHRlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGaWx0ZXJTdG9yYWdlIGltcGxlbWVudHMgSUxvZ0ZpbHRlclN0b3JhZ2VNYW5hZ2VyIHsKLQotICAgICAgICBwdWJsaWMgTG9nRmlsdGVyW10gZ2V0RmlsdGVyRnJvbVN0b3JlKCkgewotICAgICAgICAgICAgU3RyaW5nIGZpbHRlclByZWZzID0gRGRtc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBQUkVGU19GSUxURVJTKTsKLQotICAgICAgICAgICAgLy8gc3BsaXQgaW4gYSBzdHJpbmcgcGVyIGZpbHRlcgotICAgICAgICAgICAgU3RyaW5nW10gZmlsdGVycyA9IGZpbHRlclByZWZzLnNwbGl0KCJcXHwiKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgQXJyYXlMaXN0PExvZ0ZpbHRlcj4gbGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxMb2dGaWx0ZXI+KGZpbHRlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgZiA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nRmlsdGVyIGxvZ0ZpbHRlciA9IG5ldyBMb2dGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ0ZpbHRlci5sb2FkRnJvbVN0cmluZyhmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobG9nRmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgTG9nRmlsdGVyW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzYXZlRmlsdGVycyhMb2dGaWx0ZXJbXSBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoTG9nRmlsdGVyIGYgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbHRlclN0cmluZyA9IGYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmlsdGVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ3wnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGRtc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUFJFRlNfRklMVEVSUywgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0RlZmF1bHRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMb2dDYXRWaWV3KCkgewotICAgICAgICBzVGhpcyA9IHRoaXM7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1RJTUUgPSBQUkVGU19DT0xfVElNRTsKLSAgICAgICAgTG9nUGFuZWwuUFJFRlNfTEVWRUwgPSBQUkVGU19DT0xfTEVWRUw7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1BJRCA9IFBSRUZTX0NPTF9QSUQ7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX1RBRyA9IFBSRUZTX0NPTF9UQUc7Ci0gICAgICAgIExvZ1BhbmVsLlBSRUZTX01FU1NBR0UgPSBQUkVGU19DT0xfTUVTU0FHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2dDYXRWaWV3IGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGlzcGxheSBmb250LgotICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICBpZiAoc1RoaXMgIT0gbnVsbCAmJiBzVGhpcy5tTG9nUGFuZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgc1RoaXMubUxvZ1BhbmVsLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIERpc3BsYXkgZCA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIExvZ0NvbG9ycyBjb2xvcnMgPSBuZXcgTG9nQ29sb3JzKCk7Ci0KLSAgICAgICAgSW1hZ2VMb2FkZXIgbG9hZGVyID0gRGRtc1BsdWdpbi5nZXRJbWFnZUxvYWRlcigpOwotCi0gICAgICAgIGNvbG9ycy5pbmZvQ29sb3IgPSBuZXcgQ29sb3IoZCwgMCwgMTI3LCAwKTsKLSAgICAgICAgY29sb3JzLmRlYnVnQ29sb3IgPSBuZXcgQ29sb3IoZCwgMCwgMCwgMTI3KTsKLSAgICAgICAgY29sb3JzLmVycm9yQ29sb3IgPSBuZXcgQ29sb3IoZCwgMjU1LCAwLCAwKTsKLSAgICAgICAgY29sb3JzLndhcm5pbmdDb2xvciA9IG5ldyBDb2xvcihkLCAyNTUsIDEyNywgMCk7Ci0gICAgICAgIGNvbG9ycy52ZXJib3NlQ29sb3IgPSBuZXcgQ29sb3IoZCwgMCwgMCwgMCk7Ci0KLSAgICAgICAgbUNyZWF0ZUZpbHRlckFjdGlvbiA9IG5ldyBDb21tb25BY3Rpb24oIkNyZWF0ZSBGaWx0ZXIiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuYWRkRmlsdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1DcmVhdGVGaWx0ZXJBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNyZWF0ZSBGaWx0ZXIiKTsKLSAgICAgICAgbUNyZWF0ZUZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobG9hZGVyCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKCJhZGQucG5nIikpOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgIG1FZGl0RmlsdGVyQWN0aW9uID0gbmV3IENvbW1vbkFjdGlvbigiRWRpdCBGaWx0ZXIiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuZWRpdEZpbHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtRWRpdEZpbHRlckFjdGlvbi5zZXRUb29sVGlwVGV4dCgiRWRpdCBGaWx0ZXIiKTsKLSAgICAgICAgbUVkaXRGaWx0ZXJBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGxvYWRlcgotICAgICAgICAgICAgICAgIC5sb2FkRGVzY3JpcHRvcigiZWRpdC5wbmciKSk7IC8vICROT04tTkxTLTEkCi0KLSAgICAgICAgbURlbGV0ZUZpbHRlckFjdGlvbiA9IG5ldyBDb21tb25BY3Rpb24oIkRlbGV0ZSBGaWx0ZXIiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuZGVsZXRlRmlsdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1EZWxldGVGaWx0ZXJBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkRlbGV0ZSBGaWx0ZXIiKTsKLSAgICAgICAgbURlbGV0ZUZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobG9hZGVyCi0gICAgICAgICAgICAgICAgLmxvYWREZXNjcmlwdG9yKCJkZWxldGUucG5nIikpOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgIG1FeHBvcnRBY3Rpb24gPSBuZXcgQ29tbW9uQWN0aW9uKCJFeHBvcnQgU2VsZWN0aW9uIEFzIFRleHQuLi4iKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuc2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtRXhwb3J0QWN0aW9uLnNldFRvb2xUaXBUZXh0KCJFeHBvcnQgU2VsZWN0aW9uIEFzIFRleHQuLi4iKTsKLSAgICAgICAgbUV4cG9ydEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IobG9hZGVyLmxvYWREZXNjcmlwdG9yKCJzYXZlLnBuZyIpKTsgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICBMb2dMZXZlbFtdIGxldmVscyA9IExvZ0xldmVsLnZhbHVlcygpOwotICAgICAgICBtTG9nTGV2ZWxBY3Rpb25zID0gbmV3IENvbW1vbkFjdGlvblttTG9nTGV2ZWxJY29ucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtTG9nTGV2ZWxBY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGxldmVsc1tpXS5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgbUxvZ0xldmVsQWN0aW9uc1tpXSA9IG5ldyBDb21tb25BY3Rpb24obmFtZSwgSUFjdGlvbi5BU19DSEVDS19CT1gpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIG90aGVyIGFjdGlvbnMgYW5kIHJlY29yZCBjdXJyZW50IGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1Mb2dMZXZlbEFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiBhID0gbUxvZ0xldmVsQWN0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldENoZWNrZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGxvZyBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dQYW5lbC5zZXRDdXJyZW50RmlsdGVyTG9nTGV2ZWwoaSsyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zZXRDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Mb2dMZXZlbEFjdGlvbnNbaV0uc2V0VG9vbFRpcFRleHQobmFtZSk7Ci0gICAgICAgICAgICBtTG9nTGV2ZWxBY3Rpb25zW2ldLnNldEltYWdlRGVzY3JpcHRvcihsb2FkZXIubG9hZERlc2NyaXB0b3IobUxvZ0xldmVsSWNvbnNbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DbGVhckFjdGlvbiA9IG5ldyBBY3Rpb24oIkNsZWFyIExvZyIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1Mb2dQYW5lbC5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQ2xlYXJBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGxvYWRlcgotICAgICAgICAgICAgICAgIC5sb2FkRGVzY3JpcHRvcigiY2xlYXIucG5nIikpOyAvLyAkTk9OLU5MUy0xJAotCi0KLSAgICAgICAgLy8gbm93IGNyZWF0ZSB0aGUgbG9nIHZpZXcKLSAgICAgICAgbUxvZ1BhbmVsID0gbmV3IExvZ1BhbmVsKGxvYWRlciwgY29sb3JzLCBuZXcgRmlsdGVyU3RvcmFnZSgpLCBMb2dQYW5lbC5GSUxURVJfTUFOVUFMKTsKLSAgICAgICAgbUxvZ1BhbmVsLnNldEFjdGlvbnMobURlbGV0ZUZpbHRlckFjdGlvbiwgbUVkaXRGaWx0ZXJBY3Rpb24sIG1Mb2dMZXZlbEFjdGlvbnMpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZm9udAotICAgICAgICBTdHJpbmcgZm9udFN0ciA9IERkbXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuQVRUUl9MT0dDQVRfRk9OVCk7Ci0gICAgICAgIGlmIChmb250U3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZvbnREYXRhIGRhdGEgPSBuZXcgRm9udERhdGEoZm9udFN0cik7Ci0KLSAgICAgICAgICAgIGlmIChmb250U3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuc2V0Rm9udChuZXcgRm9udChwYXJlbnQuZ2V0RGlzcGxheSgpLCBkYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtTG9nUGFuZWwuY3JlYXRlUGFuZWwocGFyZW50KTsKLSAgICAgICAgc2V0U2VsZWN0aW9uRGVwZW5kZW50UGFuZWwobUxvZ1BhbmVsKTsKLQotICAgICAgICAvLyBwbGFjZSB0aGUgYWN0aW9ucy4KLSAgICAgICAgcGxhY2VBY3Rpb25zKCk7Ci0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGNvcHkgYWN0aW9uCi0gICAgICAgIG1DbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGQpOwotICAgICAgICBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgbmV3IEFjdGlvbigiQ29weSIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1Mb2dQYW5lbC5jb3B5KG1DbGlwYm9hcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBzZXR1cCB0aGUgc2VsZWN0IGFsbCBhY3Rpb24KLSAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIG5ldyBBY3Rpb24oIlNlbGVjdCBBbGwiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtTG9nUGFuZWwuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIG1Mb2dQYW5lbC5zdG9wTG9nQ2F0KHRydWUpOwotICAgICAgICBtQ2xpcGJvYXJkLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgbUxvZ1BhbmVsLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGxhY2UgdGhlIGFjdGlvbnMgaW4gdGhlIHVpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwbGFjZUFjdGlvbnMoKSB7Ci0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQotICAgICAgICAvLyBmaXJzdCBpbiB0aGUgbWVudQotICAgICAgICBJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChtQ3JlYXRlRmlsdGVyQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1FZGl0RmlsdGVyQWN0aW9uKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1EZWxldGVGaWx0ZXJBY3Rpb24pOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuYWRkKG1DbGVhckFjdGlvbik7Ci0gICAgICAgIG1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51TWFuYWdlci5hZGQobUV4cG9ydEFjdGlvbik7Ci0KLSAgICAgICAgLy8gYW5kIHRoZW4gaW4gdGhlIHRvb2xiYXIKLSAgICAgICAgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotICAgICAgICBmb3IgKENvbW1vbkFjdGlvbiBhIDogbUxvZ0xldmVsQWN0aW9ucykgewotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKGEpOwotICAgICAgICB9Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobUNyZWF0ZUZpbHRlckFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtRWRpdEZpbHRlckFjdGlvbik7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtRGVsZXRlRmlsdGVyQWN0aW9uKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChtQ2xlYXJBY3Rpb24pOwotICAgIH0KLSB9Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL05hdGl2ZUhlYXBWaWV3LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9OYXRpdmVIZWFwVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVhYWNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL05hdGl2ZUhlYXBWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuTmF0aXZlSGVhcFBhbmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTmF0aXZlSGVhcFZpZXcgZXh0ZW5kcyBUYWJsZVZpZXcgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5OYXRpdmVIZWFwVmlldyI7IC8vICROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBOYXRpdmVIZWFwUGFuZWwgbVBhbmVsOwotCi0gICAgcHVibGljIE5hdGl2ZUhlYXBWaWV3KCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVBhbmVsID0gbmV3IE5hdGl2ZUhlYXBQYW5lbCgpOwotICAgICAgICBtUGFuZWwuY3JlYXRlUGFuZWwocGFyZW50KTsKLSAgICAgICAgCi0gICAgICAgIHNldFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsKG1QYW5lbCk7Ci0KLSAgICAgICAgLy8gbGlzdGVuIHRvIGZvY3VzIGNoYW5nZXMgZm9yIHRhYmxlKHMpIG9mIHRoZSBwYW5lbC4KLSAgICAgICAgc2V0dXBUYWJsZUZvY3VzTGlzdGVuZXIobVBhbmVsLCBwYXJlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtUGFuZWwuc2V0Rm9jdXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9TZWxlY3Rpb25EZXBlbmRlbnRWaWV3UGFydC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvU2VsZWN0aW9uRGVwZW5kZW50Vmlld1BhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkYWU0My4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvZGRtcy92aWV3cy9TZWxlY3Rpb25EZXBlbmRlbnRWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5DbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuU2VsZWN0aW9uRGVwZW5kZW50UGFuZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy5EZG1zUGx1Z2luOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMuRGRtc1BsdWdpbi5JU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogQSBXb3JrYmVuY2gge0BsaW5rIFZpZXdQYXJ0fSB0aGF0IHJlcXVpcmVzIHtAbGluayBEZXZpY2V9L3tAbGluayBDbGllbnR9IHNlbGVjdGlvbiBub3RpZmljYXRpb25zCi0gKiBmcm9tIHtAbGluayBEZG1zUGx1Z2lufSB0aHJvdWdoIHRoZSB7QGxpbmsgSVNlbGVjdGlvbkxpc3RlbmVyfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25EZXBlbmRlbnRWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgU2VsZWN0aW9uRGVwZW5kZW50UGFuZWwgbVBhbmVsOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VsZWN0aW9uRGVwZW5kZW50UGFuZWwoU2VsZWN0aW9uRGVwZW5kZW50UGFuZWwgcGFuZWwpIHsKLSAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHBhbmVsCi0gICAgICAgIG1QYW5lbCA9IHBhbmVsOwotCi0gICAgICAgIC8vIGFuZCBhZGQgb3Vyc2VsZiBhcyBsaXN0ZW5lciBvZiBzZWxlY3Rpb24gZXZlbnRzLgotICAgICAgICBEZG1zUGx1Z2luLmdldERlZmF1bHQoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBEZG1zUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhIG5ldyB7QGxpbmsgQ2xpZW50fSBpcyBzZWxlY3RlZC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDbGllbnQgVGhlIHNlbGVjdGVkIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgSVNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChDbGllbnQgc2VsZWN0ZWRDbGllbnQpIHsKLSAgICAgICAgbVBhbmVsLmNsaWVudFNlbGVjdGVkKHNlbGVjdGVkQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYSBuZXcge0BsaW5rIERldmljZX0gaXMgc2VsZWN0ZWQuCi0gICAgICogQHBhcmFtIHNlbGVjdGVkRGV2aWNlIHRoZSBzZWxlY3RlZCBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAc2VlIElTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSURldmljZSBzZWxlY3RlZERldmljZSkgewotICAgICAgICBtUGFuZWwuZGV2aWNlU2VsZWN0ZWQoc2VsZWN0ZWREZXZpY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL1RhYmxlVmlldy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvVGFibGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZGEzNWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zLnZpZXdzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtdWlsaWIuSVRhYmxlRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5UYWJsZVBhbmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbXVpbGliLklUYWJsZUZvY3VzTGlzdGVuZXIuSUZvY3VzZWRUYWJsZUFjdGl2YXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB2aWV3IGNvbnRhaW5pbmcgVGFibGUgdGhhdCBuZWVkcyB0byBzdXBwb3J0IGNvcHksIGFuZCBzZWxlY3QgYWxsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFibGVWaWV3IGV4dGVuZHMgU2VsZWN0aW9uRGVwZW5kZW50Vmlld1BhcnQgewotCi0gICAgLyoqIEFjdGl2YXRvciBmb3IgdGhlIGN1cnJlbnQgVGFibGUgdGhhdCBoYXMgdGhlIGZvY3VzICovCi0gICAgSUZvY3VzZWRUYWJsZUFjdGl2YXRvciBtQWN0aXZhdG9yID0gbnVsbDsKLQotICAgIHByaXZhdGUgQ2xpcGJvYXJkIG1DbGlwYm9hcmQ7Ci0KLSAgICBwcml2YXRlIEFjdGlvbiBtQ29weUFjdGlvbjsKLSAgICBwcml2YXRlIEFjdGlvbiBtU2VsZWN0QWxsQWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0dXAgdGhlIGxpc3RlbmVyIGZvciB0aGUgVGFibGUgb2JqZWN0cyBvZiA8Y29kZT5QYW5lbDwvY29kZT4sIGFuZCBzZXR1cAotICAgICAqIHRoZSBjb3B5IGFuZCBzZWxlY3QgYWxsIGFjdGlvbnMuCi0gICAgICogQHBhcmFtIHBhbmVsIFRoZSBwYW5lbCB0byBzZXR1cAotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIFBhbmVsJ3MgY29udGVudC4KLSAgICAgKi8KLSAgICB2b2lkIHNldHVwVGFibGVGb2N1c0xpc3RlbmVyKFRhYmxlUGFuZWwgcGFuZWwsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcGFuZWwuc2V0VGFibGVGb2N1c0xpc3RlbmVyKG5ldyBJVGFibGVGb2N1c0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoSUZvY3VzZWRUYWJsZUFjdGl2YXRvciBhY3RpdmF0b3IpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZhdG9yID0gYWN0aXZhdG9yOwotICAgICAgICAgICAgICAgIG1Db3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdEFsbEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoSUZvY3VzZWRUYWJsZUFjdGl2YXRvciBhY3RpdmF0b3IpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdG9yID09IG1BY3RpdmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2YXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1Db3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0QWxsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGNvcHkgYWN0aW9uCi0gICAgICAgIG1DbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHBhcmVudC5nZXREaXNwbGF5KCkpOwotICAgICAgICBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICBtQ29weUFjdGlvbiA9IG5ldyBBY3Rpb24oIkNvcHkiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2YXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmF0b3IuY29weShtQ2xpcGJvYXJkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHNldHVwIHRoZSBzZWxlY3QgYWxsIGFjdGlvbgotICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCksCi0gICAgICAgICAgICAgICAgbVNlbGVjdEFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oIlNlbGVjdCBBbGwiKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2YXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmF0b3Iuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgbUNsaXBib2FyZC5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvVGhyZWFkVmlldy5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2RkbXMvdmlld3MvVGhyZWFkVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI0NDU4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9kZG1zL3ZpZXdzL1RocmVhZFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMudmlld3M7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG11aWxpYi5UaHJlYWRQYW5lbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFRocmVhZFZpZXcgZXh0ZW5kcyBUYWJsZVZpZXcgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy52aWV3cy5UaHJlYWRWaWV3IjsgLy8gJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIFRocmVhZFBhbmVsIG1QYW5lbDsKLQotICAgIHB1YmxpYyBUaHJlYWRWaWV3KCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbVBhbmVsID0gbmV3IFRocmVhZFBhbmVsKCk7Ci0gICAgICAgIG1QYW5lbC5jcmVhdGVQYW5lbChwYXJlbnQpOwotCi0gICAgICAgIHNldFNlbGVjdGlvbkRlcGVuZGVudFBhbmVsKG1QYW5lbCk7Ci0KLSAgICAgICAgLy8gbGlzdGVuIHRvIGZvY3VzIGNoYW5nZXMgZm9yIHRhYmxlKHMpIG9mIHRoZSBwYW5lbC4KLSAgICAgICAgc2V0dXBUYWJsZUZvY3VzTGlzdGVuZXIobVBhbmVsLCBwYXJlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBtUGFuZWwuc2V0Rm9jdXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmNsYXNzcGF0aCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA5MTkxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idW5pdHRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL2FkdC9zZGtsaWIuamFyIiBzb3VyY2VwYXRoPSIvU2RrTGliIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL2FkdC9zZGt1aWxpYi5qYXIiIHNvdXJjZXBhdGg9Ii9TZGtVaUxpYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9hZHQvbGF5b3V0bGliX2FwaS5qYXIiIHNvdXJjZXBhdGg9Ii9sYXlvdXRsaWJfYXBpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL2FkdC9uaW5lcGF0Y2guamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGF5b3V0bGliLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Imt4bWwyLTIuMy4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkyZjBlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8ucHJvamVjdCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllNDk2NC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5hZHQtdGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+U2RrTGliPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzNlOTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5kcm9pZCBQbHVnaW4gVGVzdHMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMC45LjUucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5BbmRyb2lkVGVzdFBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcwotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1WZW5kb3I6IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUJ1bmRsZS1DbGFzc1BhdGg6IGt4bWwyLTIuMy4wLmphciwKLSAuLAotIGxheW91dGxpYl9hcGkuamFyLAotIHNka2xpYi5qYXIsCi0gbGF5b3V0bGliLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL01PRFVMRV9MSUNFTlNFX0VQTCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9NT0RVTEVfTElDRU5TRV9FUEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL01PRFVMRV9MSUNFTlNFX0VQTAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvTk9USUNFIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljMTAxZC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLSpFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAqCi0KLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgotCi0qMS4gREVGSU5JVElPTlMqCi0KLSJDb250cmlidXRpb24iIG1lYW5zOgotCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQKLWRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgotCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKLQotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKLQotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kCi1hcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgotJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAotQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KLUNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlCi1zZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0KLXVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mCi10aGUgUHJvZ3JhbS4KLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKLWFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKLW9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KLQotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCi1BZ3JlZW1lbnQuCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCi1pbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KLQotKjIuIEdSQU5UIE9GIFJJR0hUUyoKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5Ci1ncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0Ci1saWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAotcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZAotb2JqZWN0IGNvZGUgZm9ybS4KLQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5Ci1ncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UKLXVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKLWNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUKLUNvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlCi1Db250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQKLVBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucwotd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgotCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKLWxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCi1wcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKLWNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0Ci1saWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KLQotKjMuIFJFUVVJUkVNRU5UUyoKLQotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybQotdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKLQotYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcwotYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLW9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YKLW1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvcgotZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kCi1jb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZQotb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoCi1Db250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlCi1tYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLSo0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTioKLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKLXdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcwotbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCi1Db250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcKLXNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKLW90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluCi1hIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMKLXNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IKLWFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4KLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCi1Db250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotKjUuIE5PIFdBUlJBTlRZKgotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQKLU9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAotRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMKLU9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbQotYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtCi1lcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCi1wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KLQotKjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZKgotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SCi1BTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotKjcuIEdFTkVSQUwqCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcKLWEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbQotaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKLWhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncwotcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscwotdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50Ci1hbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyCi1iZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIKLXRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncwotb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudAotcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKLWJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQotb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCi10aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMKLUFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUKLWluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlCi1lbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcKLXZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMKLXJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzCi1wdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLWl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluCi1TZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzCi10byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwKLXdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluCi10aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZQotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8KLXRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuCi1vbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzCi10byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgotCi0gCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9SRUFETUUudHh0IGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjk5NTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotVGhpcyBwcm9qZWN0IGNvbnRhaW5zIHRoZSB0ZXN0cyBmb3IgdGhlIEFuZHJvaWQgRWNsaXBzZSBQbHVnaW5zLgotCi1Zb3UgY2FuIGRvIHRocmVlIHRoaW5nczoKLTEtIFJ1biB0aGUgdW5pdCB0ZXN0cyBhcyBhIGZ1bGwgImVjbGlwc2UgcGx1Z2luIiBzdWl0ZQotMi0gUnVuIHRoZSB1bml0IHRlc3RzIGFzIGluZGVwZW5kZW50IEpVbml0IHRlc3RzIChub3QgYXMgcGx1Z2luKQotMy4gUnVuIHRoZSBmdW5jdGlvbmFsIHRlc3RzIGFzIGEgZnVsbCAiZWNsaXBzZSBwbHVnaW4iIHN1aXRlIChyZXF1aXJlIGEgcmVhbCBTREspCi0KLVRoZSB1bml0IHRlc3RzIGFyZSBpc29sYXRlZCB0ZXN0cyB0aGF0IGRvIG5vdCByZXF1aXJlIGV4dGVybmFsIGRlcGVuZGVuY2llcyBzdWNoIGFzIGFuIFNESy4gCi1UaGUgZnVuY3Rpb25hbCB0ZXN0cyBhcmUgaGlnaGVyIGxldmVsIHRlc3RzIHRoYXQgbWF5IHJlcXVpcmUgYSByZWFsIFNESy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xLSBSdW5uaW5nIHRoZSB1bml0IHRlc3RzIGFzIGEgZnVsbCAiZWNsaXBzZSBwbHVnaW4iIHN1aXRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3RlcHMgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlOgotCi1BLSBJbiBFY2xpcHNlLCBpbXBvcnQgZm9sbG93aW5nIHByb2plY3RzIGZyb20gZGV2ZWxvcG1lbnQvdG9vbHMvZWNsaXBzZS9wbHVnaW5zOgotCS0gYWR0LXRlc3RzCi0JLSBhZHQKLQktIGRkbXMKLQotQi0gQ3JlYXRlIGEgbmV3ICJKVW5pdCBQbHVnLWluIFRlc3QiIHJ1biBjb25maWd1cmF0aW9uIHZpYSB0aGUgIlJ1biA+IE9wZW4gUnVuIERpYWxvZy4uLiIgbWVudQotU2V0IHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbidzIGRhdGEgYXMgZm9sbG93czoKLWkuICJUZXN0IiB0YWI6IAotICBTZWxlY3QgIlJ1biBhIHNpbmdsZSB0ZXN0IgotICBQcm9qZWN0OiBhZHQtdGVzdHMgCi0gIFRlc3QgY2xhc3M6IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLlVuaXRUZXN0cwotICBUZXN0IHJ1bm5lcjogSlVuaXQgMwotaWkuICJBcmd1bWVudHMiIHRhYjoKLSBTZXQgIlZNIEFyZ3VtZW50cyIgdG8gCi0iLUR0ZXN0X2RhdGE9PGFkdD4vcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvZGF0YS8iCi1yZXBsYWNpbmcgIjxhZHQ+IiB3aXRoIGFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgYW5kcm9pZCBwbHVnaW4gc291cmNlIGxvY2F0aW9uCi0KLUFsbCBvdGhlciBmaWVsZHMgY2FuIGJlIGxlZnQgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotCi1DLiBSdW4gdGhlIG5ld2x5IGNyZWF0ZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQotUnVubmluZyB0aGUgdGVzdHMgd2lsbCBydW4gYSBzZWNvbmRhcnkgaW5zdGFuY2Ugb2YgRWNsaXBzZS4gCi0KLVBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgdG8gYmUgYXdhcmUgb2Ygd2hlbiB3cml0aW5nIHRlc3RzIHRvIHJ1biB3aXRoaW4gYSBwbHVnaW4gZW52aXJvbm1lbnQ6Ci0KLWEuIEFjY2VzcyByZXN0cmljdGlvbnM6IGNhbm5vdCBhY2Nlc3MgcGFja2FnZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBpbiBhIGRpZmZlcmVudAotcGx1Z2luLCBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGRlY2xhcmVkIHBhY2thZ2UgCi1iLiBVc2luZyBjbGFzc2xvYWRlci5nZXRSZXNvdXJjZSBvciBnZXRSZXNvdXJjZUFzU3RyZWFtIHRvIGFjY2VzcyB0ZXN0IGRhdGEgd2lsbCAKLWxpa2VseSBmYWlsIGluIHRoZSBwbHVnaW4gZW52aXJvbm1lbnQuIEluc3RlYWQsIHVzZSBBZHRUZXN0RGF0YSB0byBhY2Nlc3MgdGVzdCBmaWxlcwotaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgInRlc3RfZGF0YSIgZW52aXJvbm1lbnQgdmFyaWFibGUgbWVudGlvbmVkIGFib3ZlCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotMi0gUnVuIHRoZSB1bml0IHRlc3RzIGFzIGluZGVwZW5kZW50IEpVbml0IHRlc3RzIChub3QgcGx1Z2luKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BLSBJbiBFY2xpcHNlLCBpbXBvcnQgZm9sbG93aW5nIHByb2plY3RzIGZyb20gZGV2ZWxvcG1lbnQvdG9vbHMvZWNsaXBzZS9wbHVnaW5zOgotCS0gYWR0LXRlc3RzCi0JLSBhZHQKLQktIGRkbXMKLQotQi0gU2VsZWN0IHRoZSAidW5pdHRlc3RzIiBzb3VyY2UgZm9sZGVyLCByaWdodC1jbGljayBhbmQgc2VsZWN0Ci0JIlJ1biBBcyA+IEpVbml0IFRlc3QiIChpLmUuIG5vdCB0aGUgcGx1Z2luIHRlc3RzKQotCi1UaGlzIGNyZWF0ZXMgYSBkZWJ1ZyBjb25maWd1cmF0aW9uIG9mIHR5cGUgIkpVbml0IFRlc3QiIHJ1bm5pbmcgYWxsIHRlc3RzCi1pbiB0aGUgc291cmNlIGZvbGRlciAidW5pdHRlc3RzIi4gVGhlIHJ1bnRpbWUgbXVzdCBiZSBKVW5pdCAzLgotCi1Ob3RlOiB0aGlzIG1ldGhvZCBydW5zIHRoZSB0ZXN0cyB3aXRoaW4gYSByZWd1bGFyIEpWTSBlbnZpcm9ubWVudCAoaWUgbm90IHdpdGhpbgotYW4gRWNsaXBzZSBpbnN0YW5jZSkuIFRoaXMgbWV0aG9kIGhhcyB0aGUgYWR2YW50YWdlIG9mIGJlaW5nIHF1aWNrZXIgdGhhbiBydW5uaW5nCi1hcyBhIEpVbml0IHBsdWdpbiB0ZXN0LCBhbmQgcmVxdWlyZXMgbGVzcyBwb3RlbnRpYWwgc2V0LXVwLCBidXQgaGFzIHRoZSAKLWRpc2FkdmFudGFnZSBvZiBub3QgcHJvcGVybHkgcmVwbGljYXRpbmcgaG93IHRoZSB0ZXN0cyB3aWxsIGJlIHJ1biBpbiB0aGUgCi1jb250aW51b3VzIHRlc3QgZW52aXJvbm1lbnQuIFRlc3RzIHRoYXQgcGFzcyB3aGVuIHJ1biBhcyAiSlVuaXQgVGVzdHMiIGNhbgotZmFpbCB3aGVuIHJ1biBhcyAiSlVuaXQgUGx1Z2luIFRlc3RzIiwgZHVlIHRvIHRoZSBleHRyYSBjb25zdHJhaW50cyBpbXBvc2VkIGJ5Ci1ydW5uaW5nIHdpdGhpbiBhbiBFY2xpcHNlIHBsdWctaW4gbm90ZWQgaW4gc2VjdGlvbiAxLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTMtIFJ1bm5pbmcgdGhlIGZ1bmN0aW9uYWwgdGVzdHMgYXMgYSBmdWxsICJlY2xpcHNlIHBsdWdpbiIgc3VpdGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdGVwcyB0byBydW4gdGhlIHRlc3Qgc3VpdGU6Ci0KLUEtIEluIEVjbGlwc2UsIGltcG9ydCBmb2xsb3dpbmcgcHJvamVjdHMgZnJvbSBkZXZlbG9wbWVudC90b29scy9lY2xpcHNlL3BsdWdpbnM6Ci0JLSBhZHQtdGVzdHMKLQktIGFkdAotCS0gZGRtcwotCi1CIC0gU2V0dXAgYW4gU0RLIG9uIGhvc3QgbWFjaGluZSwgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEVjbGlwc2UgQURUIHBsdWdpbnMgdW5kZXIgdGVzdAotCi1DLSBDcmVhdGUgYSBuZXcgIkpVbml0IFBsdWctaW4gVGVzdCIgcnVuIGNvbmZpZ3VyYXRpb24gdmlhIHRoZSAiUnVuID4gT3BlbiBSdW4gRGlhbG9nLi4uIiBtZW51Ci1TZXQgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uJ3MgZGF0YSBhcyBmb2xsb3dzOgotaS4gIlRlc3QiIHRhYjogCi0gIFNlbGVjdCAiUnVuIGEgc2luZ2xlIHRlc3QiCi0gIFByb2plY3Q6IGFkdC10ZXN0cyAKLSAgVGVzdCBjbGFzczogY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMuRnVuY1Rlc3RzCi0gIFRlc3QgcnVubmVyOiBKVW5pdCAzCi1paS4gIkVudmlyb25tZW50IiB0YWI6Ci0gQWRkIGEgInNka19ob21lIiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgc2V0dGluZyBpdHMgcGF0aCB0byB0aGUgU0RLIGZyb20gc3RlcCBCCi0KLUFsbCBvdGhlciBmaWVsZHMgY2FuIGJlIGxlZnQgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotCi1ELiBSdW4gdGhlIG5ld2x5IGNyZWF0ZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQotUnVubmluZyB0aGUgdGVzdHMgd2lsbCBydW4gYSBzZWNvbmRhcnkgaW5zdGFuY2Ugb2YgRWNsaXBzZS4gCi0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3ZTE0Ny4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHVuaXR0ZXN0cy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcHJlZnMudGVtcGxhdGUsXAotICAgICAgICAgICAgICAgdW5pdHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGt4bWwyLTIuMy4wLmphcixcCi0gICAgICAgICAgICAgICBzZGtsaWIuamFyLFwKLSAgICAgICAgICAgICAgIGxheW91dGxpYl9hcGkuamFyLFwKLSAgICAgICAgICAgICAgIGxheW91dGxpYi5qYXIsXAotICAgICAgICAgICAgICAgdW5pdHRlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi90ZXN0ZGF0YS8sXAotICAgICAgICAgICAgICAgdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2xheW91dGxpYi90ZXN0ZGF0YS8sXAotICAgICAgICAgICAgICAgdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhLwotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvbm90X3NvdXJjZV9mb2xkZXIvamFyL2V4YW1wbGUvQ2xhc3MxLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvbm90X3NvdXJjZV9mb2xkZXIvamFyL2V4YW1wbGUvQ2xhc3MxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjEwMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL25vdF9zb3VyY2VfZm9sZGVyL2phci9leGFtcGxlL0NsYXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXIuZXhhbXBsZTsKLQotcHVibGljIGNsYXNzIENsYXNzMSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzU3RhdGljRmllbGQgPSAxOwotICAgIAotICAgIC8qKiBjb25zdHJ1Y3RvciAqLwotICAgIHB1YmxpYyBDbGFzczEoKSB7Ci0gICAgICAgIGludCBhID0gMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lclN0YXRpY0NsYXNzMSB7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBJbm5lckNsYXNzMiB7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9ub3Rfc291cmNlX2ZvbGRlci9qYXIvZXhhbXBsZS9DbGFzczIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9ub3Rfc291cmNlX2ZvbGRlci9qYXIvZXhhbXBsZS9DbGFzczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxNWM0Ny4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvbm90X3NvdXJjZV9mb2xkZXIvamFyL2V4YW1wbGUvQ2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphci5leGFtcGxlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3MyIGV4dGVuZHMgQ2xhc3MxIHsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3ByZWZzLnRlbXBsYXRlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3ByZWZzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzN2RlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9wcmVmcy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBGZWIgMjAgMTY6NTY6NDAgUFNUIDIwMDgKLWNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5zZGs9c2RrX2hvbWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9sYXVuY2gvSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZVRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9KVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkzZWJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2xhdW5jaC9KVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmxhdW5jaDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5sYXVuY2guSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBYmxlVG9GZXRjaEp1bml0SmFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLmdldEp1bml0SmFyTG9jYXRpb24oKS5lbmRzV2l0aCgianVuaXQuamFyIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4Qm9vdHBhdGhFeHRXaXRoQW5kcm9pZEphcigpIHsKLSAgICAgICAgU3RyaW5nW11bXSB0ZXN0QXJyYXkgPSB7Ci0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICB7ICJhbmRyb2lkLmphciJ9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgeyAic29tZV9vdGhlcl9qYXIuamFyIiB9LAotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW11bXSBleHBlY3RlZEFycmF5ID0gewotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIHsgInNvbWVfb3RoZXJfamFyLmphciIgfSwKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgYXNzZXJ0RXF1YWxzQXJyYXlzKGV4cGVjdGVkQXJyYXksIEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuZml4Qm9vdHBhdGhFeHQodGVzdEFycmF5KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpeEJvb3RwYXRoRXh0V2l0aE5vQW5kcm9pZEphcigpIHsKLSAgICAgICAgU3RyaW5nW11bXSB0ZXN0QXJyYXkgPSB7Ci0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICB7ICJzb21lamFyLmphciJ9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXVtdIGV4cGVjdGVkQXJyYXkgPSB7Ci0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICB7ICJzb21lamFyLmphciJ9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHNBcnJheXMoZXhwZWN0ZWRBcnJheSwgSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZS5maXhCb290cGF0aEV4dCh0ZXN0QXJyYXkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4Q2xhc3NwYXRoV2l0aEp1bml0SmFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gdGVzdEFycmF5ID0gewotICAgICAgICAgICAgICAgIEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuZ2V0SnVuaXRKYXJMb2NhdGlvbigpLAotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWRBcnJheSA9IHsKLSAgICAgICAgICAgICAgICBKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLmdldEp1bml0SmFyTG9jYXRpb24oKSwKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFsc0FycmF5cyhleHBlY3RlZEFycmF5LCAKLSAgICAgICAgICAgICAgICBKVW5pdExhdW5jaENvbmZpZ0RlbGVnYXRlLmZpeENsYXNzcGF0aCh0ZXN0QXJyYXksICJ0ZXN0IikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4Q2xhc3NwYXRoV2l0aG91dEp1bml0SmFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gdGVzdEFycmF5ID0gewotICAgICAgICAgICAgICAgICJyYW5kb20uamFyIiwKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkQXJyYXkgPSB7Ci0gICAgICAgICAgICAgICAgInJhbmRvbS5qYXIiLAotICAgICAgICAgICAgICAgIEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuZ2V0SnVuaXRKYXJMb2NhdGlvbigpLAotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzQXJyYXlzKGV4cGVjdGVkQXJyYXksIAotICAgICAgICAgICAgICAgIEpVbml0TGF1bmNoQ29uZmlnRGVsZWdhdGUuZml4Q2xhc3NwYXRoKHRlc3RBcnJheSwgInRlc3QiKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4Q2xhc3NwYXRoV2l0aE5vSmFycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHRlc3RBcnJheSA9IHsKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkQXJyYXkgPSB7Ci0gICAgICAgICAgICAgICAgSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZS5nZXRKdW5pdEphckxvY2F0aW9uKCksCi0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHNBcnJheXMoZXhwZWN0ZWRBcnJheSwgCi0gICAgICAgICAgICAgICAgSlVuaXRMYXVuY2hDb25maWdEZWxlZ2F0ZS5maXhDbGFzc3BhdGgodGVzdEFycmF5LCAidGVzdCIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQXJyYXlzKFN0cmluZ1tdW10gYTEsIFN0cmluZ1tdW10gYTIpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZGVlcEVxdWFscyhhMSwgYTIpKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQXJyYXlzKFN0cmluZ1tdIGExLCBTdHJpbmdbXSBhMikgewotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5kZWVwRXF1YWxzKGExLCBhMikpOyAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvc2RrL1Rlc3RMYXlvdXREZXZpY2VzWHNkLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvVGVzdExheW91dERldmljZXNYc2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFhOGVlMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvVGVzdExheW91dERldmljZXNYc2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrOw0KLQ0KLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0cyBsb2NhbCB2YWxpZGF0aW9uIG9mIGEgTGF5b3V0LURldmljZXMgc2FtcGxlIFhNTHMgdXNpbmcgYW4gWE1MIFNjaGVtYSB2YWxpZGF0b3IuDQotICovDQotcHVibGljIGNsYXNzIFRlc3RMYXlvdXREZXZpY2VzWHNkIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBIFNBWCBlcnJvciBoYW5kbGVyIHRoYXQgY2FwdHVyZXMgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MuDQotICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIGNhcHR1cmUgKmFsbCogZXJyb3JzIGFuZCBqdXN0IG5vdCBnZXQgYW4gZXhjZXB0aW9uIG9uIHRoZSBmaXJzdCBvbmUuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYXB0dXJlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsNCi0NCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1XYXJuaW5ncyA9ICIiOw0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUVycm9ycyA9ICIiOw0KLQ0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9ycygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbUVycm9yczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRXYXJuaW5ncygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVdhcm5pbmdzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBWZXJpZmllcyBpZiB0aGUgaGFuZGxlciBjYXB0dXJlcyBzb21lIGVycm9ycyBvciB3YXJuaW5ncy4NCi0gICAgICAgICAqIFByaW50cyB0aGVtIG9uIHN0ZGVyci4NCi0gICAgICAgICAqIEFsc28gZmFpbHMgdGhlIHVuaXQgdGVzdCBpZiBhbnkgZXJyb3Igd2FzIGdlbmVyYXRlZC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgew0KLSAgICAgICAgICAgIGlmIChtV2FybmluZ3MubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtV2FybmluZ3MpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobUVycm9ycy5sZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1FcnJvcnMpOw0KLSAgICAgICAgICAgICAgICBmYWlsKG1FcnJvcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLSAgICAgICAgICAgIG1FcnJvcnMgKz0gIkVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpICsgIlxuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgbUVycm9ycyArPSAiRmF0YWwgRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXG4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBtV2FybmluZ3MgKz0gIldhcm5pbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXG4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIC8vIC0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKiogQW4gaGVscGVyIHRoYXQgdmFsaWRhdGVzIGEgc3RyaW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgcmVnZXhwLiAqLw0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVnZXgoU3RyaW5nIGV4cGVjdGVkUmVnZXhwLCBTdHJpbmcgYWN0dWFsU3RyaW5nKSB7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGFjdHVhbFN0cmluZyk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJSZWdleHAgQXNzZXJ0aW9uIEZhaWxlZDpcbkV4cGVjdGVkOiAlc1xuQWN0dWFsOiAlc1xuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFJlZ2V4cCwgYWN0dWFsU3RyaW5nKSwNCi0gICAgICAgICAgICAgICAgYWN0dWFsU3RyaW5nLm1hdGNoZXMoZXhwZWN0ZWRSZWdleHApKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0ZhaWx1cmUoU3RyaW5nIGRvY3VtZW50LCBTdHJpbmcgcmVnZXhwKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpKTsNCi0NCi0gICAgICAgIC8vIGRvbid0IGNhcHR1cmUgdGhlIHZhbGlkYXRvciBlcnJvcnMsIHdlIHdhbnQgaXQgdG8gZmFpbCBhbmQgY2F0Y2ggdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IExheW91dERldmljZXNYc2QuZ2V0VmFsaWRhdG9yKG51bGwpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoc291cmNlKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBXZSBleHBlY3QgYSBwYXJzZSBleHByZXNzaW9uIHJlZmVycmluZyB0byB0aGlzIGdyYW1tYXIgcnVsZQ0KLSAgICAgICAgICAgIGFzc2VydFJlZ2V4KHJlZ2V4cCwgZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGUgdmFsaWRhdG9yIGhhcyBub3QgZmFpbGVkIGFzIHdlIGV4cGVjdGVkIGl0IHRvLg0KLSAgICAgICAgZmFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNoZWNrU3VjY2VzcyhTdHJpbmcgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpOw0KLQ0KLSAgICAgICAgQ2FwdHVyZUVycm9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhcHR1cmVFcnJvckhhbmRsZXIoKTsNCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBMYXlvdXREZXZpY2VzWHNkLmdldFZhbGlkYXRvcihudWxsKTsNCi0gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgaGFuZGxlci52ZXJpZnkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0gVGVzdHMgLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKiBWYWxpZGF0ZSBhIHZhbGlkIHNhbXBsZSB1c2luZyBhbiBJbnB1dFN0cmVhbSAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVMb2NhbFJlcG9zaXRvcnlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBJbnB1dFN0cmVhbSB4bWxTdHJlYW0gPQ0KLSAgICAgICAgICAgIFRlc3RMYXlvdXREZXZpY2VzWHNkLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImNvbmZpZ19zYW1wbGUueG1sIik7DQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxTdHJlYW0pOw0KLQ0KLSAgICAgICAgQ2FwdHVyZUVycm9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhcHR1cmVFcnJvckhhbmRsZXIoKTsNCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBMYXlvdXREZXZpY2VzWHNkLmdldFZhbGlkYXRvcihoYW5kbGVyKTsNCi0gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgaGFuZGxlci52ZXJpZnkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQSBkb2N1bWVudCBzaG91bGQgYXQgbGVhc3QgaGF2ZSBhIHJvb3QgdG8gYmUgdmFsaWQgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5WG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja0ZhaWx1cmUoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIsDQotDQotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGZhaWx1cmUNCi0gICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQgb2YgZmlsZS4qIik7DQotICAgIH0NCi0NCi0gICAgLyoqIEEgZG9jdW1lbnQgd2l0aCBhbiB1bmtub3duIGVsZW1lbnQuICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duQ29udGVudFhtbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgY2hlY2tGYWlsdXJlKA0KLSAgICAgICAgICAgICAgICAvLyBkb2N1bWVudA0KLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsNCi0gICAgICAgICAgICAgICAgIjxkOmxheW91dC1kZXZpY2VzIHhtbG5zOmQ9XCJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9sYXlvdXQtZGV2aWNlcy8xXCIgPiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6dW5rbm93biAvPiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmxheW91dC1kZXZpY2VzPiIsDQotDQotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGZhaWx1cmUNCi0gICAgICAgICAgICAgICAgImN2Yy1jb21wbGV4LXR5cGUuMi40LmE6IEludmFsaWQgY29udGVudCB3YXMgZm91bmQuKiIpOw0KLSAgICB9DQotDQotICAgIC8qKiBBIGRvY3VtZW50IHdpdGggYW4gbWlzc2luZyBhdHRyaWJ1dGUgaW4gYSBkZXZpY2UgZWxlbWVudC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEluY29tcGxldGVDb250ZW50WG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja0ZhaWx1cmUoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6bGF5b3V0LWRldmljZXMgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzFcIiA+IiArDQotICAgICAgICAgICAgICAgICI8ZDpkZXZpY2UgLz4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpsYXlvdXQtZGV2aWNlcz4iLA0KLQ0KLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBmYWlsdXJlDQotICAgICAgICAgICAgICAgICJjdmMtY29tcGxleC10eXBlLjQ6IEF0dHJpYnV0ZSAnbmFtZScgbXVzdCBhcHBlYXIgb24gZWxlbWVudCAnZDpkZXZpY2UnLiIpOw0KLSAgICB9DQotDQotICAgIC8qKiBBIGRvY3VtZW50IHdpdGggYSByb290IGVsZW1lbnQgY29udGFpbmluZyBubyBkZXZpY2UgZWxlbWVudCBpcyBub3QgdmFsaWQuICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJvb3RYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoZWNrRmFpbHVyZSgNCi0gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQNCi0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgICAgICI8ZDpsYXlvdXQtZGV2aWNlcyB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMVwiIC8+IiwNCi0NCi0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZmFpbHVyZQ0KLSAgICAgICAgICAgICAgICAiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYjogVGhlIGNvbnRlbnQgb2YgZWxlbWVudCAnZDpsYXlvdXQtZGV2aWNlcycgaXMgbm90IGNvbXBsZXRlLioiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQSBkb2N1bWVudCB3aXRoIGFuIGVtcHR5IGRldmljZSBlbGVtZW50IGlzIG5vdCB2YWxpZC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RGV2aWNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja0ZhaWx1cmUoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6bGF5b3V0LWRldmljZXMgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzFcIiA+IiArDQotICAgICAgICAgICAgICAgICI8ZDpkZXZpY2UgbmFtZT1cImZvb1wiLz4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpsYXlvdXQtZGV2aWNlcz4iLA0KLQ0KLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBmYWlsdXJlDQotICAgICAgICAgICAgICAgICJjdmMtY29tcGxleC10eXBlLjIuNC5iOiBUaGUgY29udGVudCBvZiBlbGVtZW50ICdkOmRldmljZScgaXMgbm90IGNvbXBsZXRlLioiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQSBkb2N1bWVudCB3aXRoIHR3byBkZWZhdWx0IGVsZW1lbnRzIGluIGEgZGV2aWNlIGVsZW1lbnQgaXMgbm90IHZhbGlkLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRGVmYXVsdHNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoZWNrRmFpbHVyZSgNCi0gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQNCi0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgICAgICI8ZDpsYXlvdXQtZGV2aWNlcyB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMVwiID4iICsNCi0gICAgICAgICAgICAgICAgIjxkOmRldmljZSBuYW1lPVwiZm9vXCI+IiArDQotICAgICAgICAgICAgICAgICIgIDxkOmRlZmF1bHQgLz4iICsNCi0gICAgICAgICAgICAgICAgIiAgPGQ6ZGVmYXVsdCAvPiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmRldmljZT4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpsYXlvdXQtZGV2aWNlcz4iLA0KLQ0KLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBmYWlsdXJlDQotICAgICAgICAgICAgICAgICJjdmMtY29tcGxleC10eXBlLjIuNC5hOiBJbnZhbGlkIGNvbnRlbnQgd2FzIGZvdW5kIHN0YXJ0aW5nIHdpdGggZWxlbWVudCAnZDpkZWZhdWx0Jy4qIik7DQotICAgIH0NCi0NCi0gICAgLyoqIFRoZSBkZWZhdWx0IGVsZW1lbnRzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbmZpZyBvbmUuIEl0J3MgaW52YWxpZCBpZiBhZnRlci4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb25maWdPcmRlclhtbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgY2hlY2tGYWlsdXJlKA0KLSAgICAgICAgICAgICAgICAvLyBkb2N1bWVudA0KLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsNCi0gICAgICAgICAgICAgICAgIjxkOmxheW91dC1kZXZpY2VzIHhtbG5zOmQ9XCJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9sYXlvdXQtZGV2aWNlcy8xXCIgPiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6ZGV2aWNlIG5hbWU9XCJmb29cIj4iICsNCi0gICAgICAgICAgICAgICAgIiAgPGQ6Y29uZmlnIG5hbWU9XCJtdXN0LWJlLWFmdGVyLWRlZmF1bHRcIiAvPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8ZDpkZWZhdWx0IC8+IiArDQotICAgICAgICAgICAgICAgICI8L2Q6ZGV2aWNlPiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmxheW91dC1kZXZpY2VzPiIsDQotDQotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGZhaWx1cmUNCi0gICAgICAgICAgICAgICAgImN2Yy1jb21wbGV4LXR5cGUuMi40LmE6IEludmFsaWQgY29udGVudCB3YXMgZm91bmQgc3RhcnRpbmcgd2l0aCBlbGVtZW50ICdkOmRlZmF1bHQnLioiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogU2NyZWVuIGRpbWVuc2lvbiBjYW5ub3QgYmUgMC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbkRpbVplcm9YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoZWNrRmFpbHVyZSgNCi0gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQNCi0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgICAgICI8ZDpsYXlvdXQtZGV2aWNlcyB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMVwiID4iICsNCi0gICAgICAgICAgICAgICAgIjxkOmRldmljZSBuYW1lPVwiZm9vXCI+IiArDQotICAgICAgICAgICAgICAgICIgIDxkOmRlZmF1bHQ+IiArDQotICAgICAgICAgICAgICAgICIgICAgPGQ6c2NyZWVuLWRpbWVuc2lvbj4gPGQ6c2l6ZT4wPC9kOnNpemU+IDxkOnNpemU+MTwvZDpzaXplPiA8L2Q6c2NyZWVuLWRpbWVuc2lvbj4iICsNCi0gICAgICAgICAgICAgICAgIiAgPC9kOmRlZmF1bHQ+IiArDQotICAgICAgICAgICAgICAgICI8L2Q6ZGV2aWNlPiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmxheW91dC1kZXZpY2VzPiIsDQotDQotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGZhaWx1cmUNCi0gICAgICAgICAgICAgICAgImN2Yy1taW5JbmNsdXNpdmUtdmFsaWQ6IFZhbHVlICcwJyBpcyBub3QgZmFjZXQtdmFsaWQgd2l0aCByZXNwZWN0IHRvIG1pbkluY2x1c2l2ZSAnMScuKiIpOw0KLSAgICB9DQotDQotICAgIC8qKiBTY3JlZW4gZGltZW5zaW9uIGNhbm5vdCBiZSBuZWdhdGl2ZS4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbkRpbU5lZ2F0aXZlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja0ZhaWx1cmUoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6bGF5b3V0LWRldmljZXMgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzFcIiA+IiArDQotICAgICAgICAgICAgICAgICI8ZDpkZXZpY2UgbmFtZT1cImZvb1wiPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8ZDpkZWZhdWx0PiIgKw0KLSAgICAgICAgICAgICAgICAiICAgIDxkOnNjcmVlbi1kaW1lbnNpb24+IDxkOnNpemU+LTU8L2Q6c2l6ZT4gPGQ6c2l6ZT4xPC9kOnNpemU+IDwvZDpzY3JlZW4tZGltZW5zaW9uPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8L2Q6ZGVmYXVsdD4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpkZXZpY2U+IiArDQotICAgICAgICAgICAgICAgICI8L2Q6bGF5b3V0LWRldmljZXM+IiwNCi0NCi0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZmFpbHVyZQ0KLSAgICAgICAgICAgICAgICAiY3ZjLW1pbkluY2x1c2l2ZS12YWxpZDogVmFsdWUgJy01JyBpcyBub3QgZmFjZXQtdmFsaWQgd2l0aCByZXNwZWN0IHRvIG1pbkluY2x1c2l2ZSAnMScuKiIpOw0KLSAgICB9DQotDQotICAgIC8qKiBYL1kgZHBpIGNhbm5vdCBiZSAwLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WERwaVplcm9YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoZWNrRmFpbHVyZSgNCi0gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQNCi0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgICAgICI8ZDpsYXlvdXQtZGV2aWNlcyB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMVwiID4iICsNCi0gICAgICAgICAgICAgICAgIjxkOmRldmljZSBuYW1lPVwiZm9vXCI+IiArDQotICAgICAgICAgICAgICAgICIgIDxkOmRlZmF1bHQ+IiArDQotICAgICAgICAgICAgICAgICIgICAgPGQ6eGRwaT4wPC9kOnhkcGk+IiArDQotICAgICAgICAgICAgICAgICIgIDwvZDpkZWZhdWx0PiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmRldmljZT4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpsYXlvdXQtZGV2aWNlcz4iLA0KLQ0KLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBmYWlsdXJlDQotICAgICAgICAgICAgICAgICJjdmMtbWluRXhjbHVzaXZlLXZhbGlkOiBWYWx1ZSAnMCcgaXMgbm90IGZhY2V0LXZhbGlkIHdpdGggcmVzcGVjdCB0byBtaW5FeGNsdXNpdmUgJzAuMEUxJy4qIik7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqIFgvWSBkcGkgY2Fubm90IGJlIG5lZ2F0aXZlLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WERwaU5lZ2F0aXZlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja0ZhaWx1cmUoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6bGF5b3V0LWRldmljZXMgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzFcIiA+IiArDQotICAgICAgICAgICAgICAgICI8ZDpkZXZpY2UgbmFtZT1cImZvb1wiPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8ZDpkZWZhdWx0PiIgKw0KLSAgICAgICAgICAgICAgICAiICAgIDxkOnhkcGk+LTMuMTQxNTkyNjUzODwvZDp4ZHBpPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8L2Q6ZGVmYXVsdD4iICsNCi0gICAgICAgICAgICAgICAgIjwvZDpkZXZpY2U+IiArDQotICAgICAgICAgICAgICAgICI8L2Q6bGF5b3V0LWRldmljZXM+IiwNCi0NCi0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZmFpbHVyZQ0KLSAgICAgICAgICAgICAgICAiY3ZjLW1pbkV4Y2x1c2l2ZS12YWxpZDogVmFsdWUgJy0zLjE0MTU5MjY1MzgnIGlzIG5vdCBmYWNldC12YWxpZCB3aXRoIHJlc3BlY3QgdG8gbWluRXhjbHVzaXZlICcwLjBFMScuKiIpOw0KLSAgICB9DQotDQotICAgIC8qKiBXSGl0ZXNwYWNlIGFyb3VuZCB0b2tlbiBpcyBhY2NlcHRlZCBieSB0aGUgc2NoZW1hLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5XaGl0ZXNwYWNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBjaGVja1N1Y2Nlc3MoDQotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50DQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICAgICAiPGQ6bGF5b3V0LWRldmljZXMgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzFcIiA+IiArDQotICAgICAgICAgICAgICAgICI8ZDpkZXZpY2UgbmFtZT1cImZvb1wiPiIgKw0KLSAgICAgICAgICAgICAgICAiICA8ZDpjb25maWcgbmFtZT0nZm9vJz4iICsNCi0gICAgICAgICAgICAgICAgIiAgICA8ZDpzY3JlZW4tcmF0aW8+ICBcbiBsb25nIFxyIDwvZDpzY3JlZW4tcmF0aW8+IiArDQotICAgICAgICAgICAgICAgICIgIDwvZDpjb25maWc+IiArDQotICAgICAgICAgICAgICAgICI8L2Q6ZGV2aWNlPiIgKw0KLSAgICAgICAgICAgICAgICAiPC9kOmxheW91dC1kZXZpY2VzPiIpOw0KLSAgICB9DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9jb25maWdfc2FtcGxlLnhtbCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9jb25maWdfc2FtcGxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZhNzUzZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvY29uZmlnX3NhbXBsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGQ6bGF5b3V0LWRldmljZXMNCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeG1sbnM6ZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvbGF5b3V0LWRldmljZXMvMSI+DQotDQotICAgIDxkOmRldmljZSBuYW1lPSJNeURldmljZSI+ICAgICAgICA8IS0tIDEuLm4gLS0+DQotICAgICAgICA8ZDpkZWZhdWx0PiAgICAgICAgICAgICAgICAgICA8IS0tIDAuLjEgLS0+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLXNpemU+c21hbGw8L2Q6c2NyZWVuLXNpemU+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLXJhdGlvPmxvbmc8L2Q6c2NyZWVuLXJhdGlvPg0KLSAgICAgICAgICAgIDxkOnNjcmVlbi1vcmllbnRhdGlvbj5wb3J0PC9kOnNjcmVlbi1vcmllbnRhdGlvbj4NCi0gICAgICAgICAgICA8ZDpwaXhlbC1kZW5zaXR5PmxkcGk8L2Q6cGl4ZWwtZGVuc2l0eT4NCi0gICAgICAgICAgICA8ZDp0b3VjaC10eXBlPm5vdG91Y2g8L2Q6dG91Y2gtdHlwZT4NCi0gICAgICAgICAgICA8ZDprZXlib2FyZC1zdGF0ZT5rZXlzZXhwb3NlZDwvZDprZXlib2FyZC1zdGF0ZT4NCi0gICAgICAgICAgICA8ZDp0ZXh0LWlucHV0LW1ldGhvZD5ub2tleXM8L2Q6dGV4dC1pbnB1dC1tZXRob2Q+DQotICAgICAgICAgICAgPGQ6bmF2LW1ldGhvZD5kcGFkPC9kOm5hdi1tZXRob2Q+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLWRpbWVuc2lvbj4NCi0gICAgICAgICAgICAgICAgPGQ6c2l6ZT4yNDA8L2Q6c2l6ZT4gICAgPCEtLSAyICogaW50PjAgLS0+DQotICAgICAgICAgICAgICAgIDxkOnNpemU+NDgwPC9kOnNpemU+DQotICAgICAgICAgICAgPC9kOnNjcmVlbi1kaW1lbnNpb24+DQotICAgICAgICAgICAgPGQ6eGRwaT4xODAuODEyMzQ8L2Q6eGRwaT4NCi0gICAgICAgICAgICA8ZDp5ZHBpPjE4MC44MTIzNDwvZDp5ZHBpPg0KLSAgICAgICAgPC9kOmRlZmF1bHQ+DQotDQotICAgICAgICA8ZDpjb25maWcgbmFtZT0iUG9ydHJhaXQiPg0KLSAgICAgICAgICAgIDxkOmtleWJvYXJkLXN0YXRlPmtleXNoaWRkZW48L2Q6a2V5Ym9hcmQtc3RhdGU+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLW9yaWVudGF0aW9uPnBvcnQ8L2Q6c2NyZWVuLW9yaWVudGF0aW9uPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJMYW5kc2NhcGUsIGNsb3NlZCI+DQotICAgICAgICAgICAgPGQ6a2V5Ym9hcmQtc3RhdGU+a2V5c2hpZGRlbjwvZDprZXlib2FyZC1zdGF0ZT4NCi0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+bGFuZDwvZDpzY3JlZW4tb3JpZW50YXRpb24+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9IkxhbmRzY2FwZSwgb3BlbiI+DQotICAgICAgICAgICAgPGQ6a2V5Ym9hcmQtc3RhdGU+a2V5c2V4cG9zZWQ8L2Q6a2V5Ym9hcmQtc3RhdGU+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLW9yaWVudGF0aW9uPmxhbmQ8L2Q6c2NyZWVuLW9yaWVudGF0aW9uPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJzY3JlZW4tc2l6ZS1zbWFsbCI+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLXNpemU+c21hbGw8L2Q6c2NyZWVuLXNpemU+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1zaXplLW5vcm1hbCI+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLXNpemU+bm9ybWFsPC9kOnNjcmVlbi1zaXplPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJzY3JlZW4tc2l6ZS1sYXJnZSI+DQotICAgICAgICAgICAgPGQ6c2NyZWVuLXNpemU+bGFyZ2U8L2Q6c2NyZWVuLXNpemU+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLQ0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1yYXRpby1sb25nIj4NCi0gICAgICAgICAgICA8ZDpzY3JlZW4tcmF0aW8+bG9uZzwvZDpzY3JlZW4tcmF0aW8+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1yYXRpby1ub3Rsb25nIj4NCi0gICAgICAgICAgICA8ZDpzY3JlZW4tcmF0aW8+bm90bG9uZzwvZDpzY3JlZW4tcmF0aW8+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLQ0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1vcmllbnRhdGlvbi1wb3J0Ij4NCi0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+cG9ydDwvZDpzY3JlZW4tb3JpZW50YXRpb24+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1vcmllbnRhdGlvbi1sYW5kIj4NCi0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+bGFuZDwvZDpzY3JlZW4tb3JpZW50YXRpb24+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InNjcmVlbi1vcmllbnRhdGlvbi1zcXVhcmUiPg0KLSAgICAgICAgICAgIDxkOnNjcmVlbi1vcmllbnRhdGlvbj5zcXVhcmU8L2Q6c2NyZWVuLW9yaWVudGF0aW9uPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJwaXhlbC1kZW5zaXR5LWxkcGkiPg0KLSAgICAgICAgICAgIDxkOnBpeGVsLWRlbnNpdHk+bGRwaTwvZDpwaXhlbC1kZW5zaXR5Pg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJwaXhlbC1kZW5zaXR5LW1kcGkiPg0KLSAgICAgICAgICAgIDxkOnBpeGVsLWRlbnNpdHk+bWRwaTwvZDpwaXhlbC1kZW5zaXR5Pg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJwaXhlbC1kZW5zaXR5LWhkcGkiPg0KLSAgICAgICAgICAgIDxkOnBpeGVsLWRlbnNpdHk+aGRwaTwvZDpwaXhlbC1kZW5zaXR5Pg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJ0b3VjaC10eXBlLW5vdG91Y2giPg0KLSAgICAgICAgICAgIDxkOnRvdWNoLXR5cGU+bm90b3VjaDwvZDp0b3VjaC10eXBlPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJ0b3VjaC10eXBlLXN0eWx1cyI+DQotICAgICAgICAgICAgPGQ6dG91Y2gtdHlwZT5zdHlsdXM8L2Q6dG91Y2gtdHlwZT4NCi0gICAgICAgIDwvZDpjb25maWc+DQotICAgICAgICA8ZDpjb25maWcgbmFtZT0idG91Y2gtdHlwZS1maW5nZXIiPg0KLSAgICAgICAgICAgIDxkOnRvdWNoLXR5cGU+ZmluZ2VyPC9kOnRvdWNoLXR5cGU+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLQ0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InRleHQtaW5wdXQtbWV0aG9kLW5va2V5cyI+DQotICAgICAgICAgICAgPGQ6dGV4dC1pbnB1dC1tZXRob2Q+bm9rZXlzPC9kOnRleHQtaW5wdXQtbWV0aG9kPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJ0ZXh0LWlucHV0LW1ldGhvZC1xd2VydHkiPg0KLSAgICAgICAgICAgIDxkOnRleHQtaW5wdXQtbWV0aG9kPnF3ZXJ0eTwvZDp0ZXh0LWlucHV0LW1ldGhvZD4NCi0gICAgICAgIDwvZDpjb25maWc+DQotICAgICAgICA8ZDpjb25maWcgbmFtZT0idGV4dC1pbnB1dC1tZXRob2QtMTJrZXkiPg0KLSAgICAgICAgICAgIDxkOnRleHQtaW5wdXQtbWV0aG9kPjEya2V5PC9kOnRleHQtaW5wdXQtbWV0aG9kPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJuYXYtbWV0aG9kLWRwYWQiPg0KLSAgICAgICAgICAgIDxkOm5hdi1tZXRob2Q+ZHBhZDwvZDpuYXYtbWV0aG9kPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJuYXYtbWV0aG9kLXRyYWNrYmFsbCI+DQotICAgICAgICAgICAgPGQ6bmF2LW1ldGhvZD50cmFja2JhbGw8L2Q6bmF2LW1ldGhvZD4NCi0gICAgICAgIDwvZDpjb25maWc+DQotICAgICAgICA8ZDpjb25maWcgbmFtZT0ibmF2LW1ldGhvZC13aGVlbCI+DQotICAgICAgICAgICAgPGQ6bmF2LW1ldGhvZD53aGVlbDwvZDpuYXYtbWV0aG9kPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJuYXYtbWV0aG9kLW5vbmF2Ij4NCi0gICAgICAgICAgICA8ZDpuYXYtbWV0aG9kPm5vbmF2PC9kOm5hdi1tZXRob2Q+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLQ0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InhkcGkiPg0KLSAgICAgICAgICAgIDxkOnhkcGk+MjQwPC9kOnhkcGk+DQotICAgICAgICA8L2Q6Y29uZmlnPg0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9InlkcGkiPg0KLSAgICAgICAgICAgIDxkOnlkcGk+MjgwMDwvZDp5ZHBpPg0KLSAgICAgICAgPC9kOmNvbmZpZz4NCi0NCi0gICAgPC9kOmRldmljZT4NCi0NCi0gICAgPGQ6ZGV2aWNlIG5hbWU9IlNvbWVQaG9uZSI+ICAgICAgIDwhLS0gMS4ubiAtLT4NCi0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJzY3JlZW4tc2l6ZS1ub3JtYWwiPg0KLSAgICAgICAgICAgIDxkOnNjcmVlbi1zaXplPm5vcm1hbDwvZDpzY3JlZW4tc2l6ZT4NCi0gICAgICAgIDwvZDpjb25maWc+DQotICAgIDwvZDpkZXZpY2U+DQotDQotPC9kOmxheW91dC1kZXZpY2VzPg0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L3dpemFyZHMvbmV3cHJvamVjdC9TdHViUHJvamVjdENyZWF0aW9uUGFnZS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvd2l6YXJkcy9uZXdwcm9qZWN0L1N0dWJQcm9qZWN0Q3JlYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDllZDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvd2l6YXJkcy9uZXdwcm9qZWN0L1N0dWJQcm9qZWN0Q3JlYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQud2l6YXJkcy5uZXdwcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdQcm9qZWN0Q3JlYXRpb25QYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBTdHViIGNsYXNzIGZvciBwcm9qZWN0IGNyZWF0aW9uIHBhZ2UuCi0gKiA8cC8+Ci0gKiBSZXR1cm5zIGNhbm5lZCByZXNwb25zZXMgZm9yIGNyZWF0aW5nIGEgc2FtcGxlIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHViUHJvamVjdENyZWF0aW9uUGFnZSBleHRlbmRzIE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb2plY3ROYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Mb2NhdGlvbjsKLSAgICBwcml2YXRlIGZpbmFsIElBbmRyb2lkVGFyZ2V0IG1UYXJnZXQ7Ci0KLSAgICBwdWJsaWMgU3R1YlByb2plY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcHJvamVjdExvY2F0aW9uLCBJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgdGhpcy5tTG9jYXRpb24gPSBwcm9qZWN0TG9jYXRpb247Ci0gICAgICAgIHRoaXMubVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgLy8gZG9uJ3Qgc2V0IHRlc3QgcHJvamVjdCBpbmZvCi0gICAgICAgIHNldFRlc3RJbmZvKG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWFpbkluZm8gZ2V0TWFpbkluZm8oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSU1haW5JbmZvKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb2plY3ROYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiY29tLmFuZHJvaWQuc2FtcGxlcyI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlOYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUHJvamVjdE5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUHJvamVjdE5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmV3UHJvamVjdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAic3JjIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIElQYXRoIGdldExvY2F0aW9uUGF0aCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGgobUxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNaW5TZGtWZXJzaW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0U2RrVGFyZ2V0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZUFjdGl2aXR5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlRGVmYXVsdExvY2F0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC93aXphcmRzL25ld3Byb2plY3QvU3R1YlByb2plY3RXaXphcmQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L3dpemFyZHMvbmV3cHJvamVjdC9TdHViUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGEyOWNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L3dpemFyZHMvbmV3cHJvamVjdC9TdHViUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdQotICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEKLSAqIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC53aXphcmRzLm5ld3Byb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwud2l6YXJkcy5uZXdwcm9qZWN0Lk5ld1Byb2plY3RDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLndpemFyZHMubmV3cHJvamVjdC5OZXdQcm9qZWN0V2l6YXJkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC53aXphcmRzLm5ld3Byb2plY3QuTmV3VGVzdFByb2plY3RDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIFN0dWIgY2xhc3MgZm9yIHByb2plY3QgY3JlYXRpb24gd2l6YXJkLgotICogPHAvPgotICogQ3JlYXRlZCBzbyBwcm9qZWN0IGNyZWF0aW9uIGxvZ2ljIGNhbiBiZSBydW4gd2l0aG91dCBVSSBjcmVhdGlvbi9tYW5pcHVsYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHViUHJvamVjdFdpemFyZCBleHRlbmRzIE5ld1Byb2plY3RXaXphcmQgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb2plY3ROYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm9qZWN0TG9jYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQW5kcm9pZFRhcmdldCBtVGFyZ2V0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZQotICAgICAqIEBwYXJhbSBwcm9qZWN0TG9jYXRpb24KLSAgICAgKiBAcGFyYW1hIHRhcmdldAotICAgICAqLwotICAgIHB1YmxpYyBTdHViUHJvamVjdFdpemFyZChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwcm9qZWN0TG9jYXRpb24sIElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICB0aGlzLm1Qcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLm1Qcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0TG9jYXRpb247Ci0gICAgICAgIHRoaXMubVRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSBwYXJlbnQgdG8gcmV0dXJuIHN0dWIgcGFnZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBOZXdQcm9qZWN0Q3JlYXRpb25QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0dWJQcm9qZWN0Q3JlYXRpb25QYWdlKG1Qcm9qZWN0TmFtZSwgbVByb2plY3RMb2NhdGlvbiwgbVRhcmdldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgcGFyZW50IHRvIHJldHVybiBudWxsIHBhZ2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTmV3VGVzdFByb2plY3RDcmVhdGlvblBhZ2UgY3JlYXRlVGVzdFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlcyBwYXJlbnQgdG8gcmV0dXJuIGR1bW15IHdpemFyZCBjb250YWluZXIKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdpemFyZENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVdpemFyZENvbnRhaW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNob3dQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVNZXNzYWdlKCkgewotICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVGl0bGVCYXIoKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3dUaXRsZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRXhlY3V0ZXMgcnVubmFibGUgb24gY3VycmVudCB0aHJlYWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9BZHRUZXN0RGF0YS5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9BZHRUZXN0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODExNzBlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvQWR0VGVzdERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdQotICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEKLSAqIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5BbmRyb2lkQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciByZXRyaWV2aW5nIHRlc3QgZGF0YQotICogPHAvPgotICogQWxsIHRlc3RzIHdoaWNoIG5lZWQgdG8gcmV0cmlldmUgcGF0aHMgdG8gdGVzdCBkYXRhIGZpbGVzIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZHRUZXN0RGF0YSB7Ci0KLSAgICAvKiogc2luZ2xldG9uIGluc3RhbmNlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWR0VGVzdERhdGEgc0luc3RhbmNlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgc0xvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQWR0VGVzdERhdGEuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8qKiBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb250ZW50cy4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtT3NSb290RGF0YVBhdGg7Ci0KLSAgICBwcml2YXRlIEFkdFRlc3REYXRhKCkgewotICAgICAgICAvLyBjYW4gc2V0IHRlc3RfZGF0YSBlbnYgdmFyaWFibGUgdG8gb3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvciBvZgotICAgICAgICAvLyBmaW5kaW5nIGRhdGEgdXNpbmcgY2xhc3MgbG9hZGVyCi0gICAgICAgIC8vIHVzZWZ1bCB3aGVuIHJ1bm5pbmcgaW4gcGx1Z2luIGVudmlyb25tZW50LCB3aGVyZSB0ZXN0IGRhdGEgaXMgaW5zaWRlCi0gICAgICAgIC8vIGJ1bmRsZWQgamFyLCBhbmQgbXVzdCBiZSBleHRyYWN0ZWQgdG8gdGVtcCBmaWxlc3lzdGVtIGxvY2F0aW9uIHRvIGJlCi0gICAgICAgIC8vIGFjY2Vzc2VkIG5vcm1hbGx5Ci0gICAgICAgIG1Pc1Jvb3REYXRhUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdF9kYXRhIik7Ci0gICAgICAgIGlmIChtT3NSb290RGF0YVBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgc0xvZ2dlci5pbmZvKCJDYW5ub3QgZmluZCB0ZXN0X2RhdGEgZW52aXJvbm1lbnQgdmFyaWFibGUsIGluaXQgdG8gY2xhc3MgbG9hZGVyIik7Ci0gICAgICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIi4iKTsgIC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgaWYgKFBsYXRmb3JtLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgc0xvZ2dlci5pbmZvKCJSdW5uaW5nIGFzIGFuIEVjbGlwc2UgUGx1Zy1pbiBKVW5pdCB0ZXN0LCB1c2luZyBGaWxlTG9jYXRvciIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pc1Jvb3REYXRhUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBzTG9nZ2VyLndhcm5pbmcoIklPRXhjZXB0aW9uIHdoaWxlIHVzaW5nIEZpbGVMb2NhdG9yLCByZXZlcnRpbmcgdG8gdXJsIik7Ci0gICAgICAgICAgICAgICAgICAgIG1Pc1Jvb3REYXRhUGF0aCA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzTG9nZ2VyLmluZm8oIlJ1bm5pbmcgYXMgYW4gcGxhaW4gSlVuaXQgdGVzdCwgdXNpbmcgdXJsIGFzLWlzIik7Ci0gICAgICAgICAgICAgICAgbU9zUm9vdERhdGFQYXRoID0gdXJsLmdldEZpbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3NSb290RGF0YVBhdGguZXF1YWxzKEFuZHJvaWRDb25zdGFudHMuV1NfU0VQKSkgewotICAgICAgICAgICAgc0xvZ2dlci53YXJuaW5nKCJSZXNvdXJjZSBkYXRhIG5vdCBmb3VuZCB1c2luZyBjbGFzcyBsb2FkZXIhLCBEZWZhdWx0aW5nIHRvIG5vIHBhdGgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbU9zUm9vdERhdGFQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotICAgICAgICAgICAgc0xvZ2dlci5pbmZvKCJGaXhpbmcgdGVzdF9kYXRhIGVudiB2YXJpYWJsZSAoZG9lcyBub3QgZW5kIHdpdGggcGF0aCBzZXBhcmF0b3IpIik7Ci0gICAgICAgICAgICBtT3NSb290RGF0YVBhdGggPSBtT3NSb290RGF0YVBhdGguY29uY2F0KEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBBZHRUZXN0RGF0YSAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWR0VGVzdERhdGEgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFkdFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhpcyBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3NSZWxhdGl2ZVBhdGgge0BsaW5rIFN0cmluZ30gcGF0aCB0byBmaWxlIGNvbnRhaW5lZCBpbiBwbHVnaW4uIE11c3QKLSAgICAgKiB1c2UgcGF0aCBzZXBhcmF0b3JzIGFwcHJvcHJpYXRlIHRvIGhvc3QgT1MKLSAgICAgKgotICAgICAqIEByZXR1cm4gYWJzb2x1dGUgT1MgcGF0aCB0byB0ZXN0IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RGaWxlUGF0aChTdHJpbmcgb3NSZWxhdGl2ZVBhdGgpIHsKLSAgICAgICAgcmV0dXJuIG1Pc1Jvb3REYXRhUGF0aCArIG9zUmVsYXRpdmVQYXRoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvQWxsVGVzdHMuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1NTA0Yy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogQ29udGFpbmVyIFRlc3RTdWl0ZSBmb3IgYWxsIGVjbGlwc2UgdGVzdHMsIGJvdGggZnVuY3Rpb25hbCBhbmQgdW5pdAotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIEFsbFRlc3RzKCkgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN1aXRlIG9mIHRlc3QgY2FzZXMgdG8gYmUgcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoRnVuY1Rlc3RzLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KFVuaXRUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9BbmRyb2lkVGVzdFBsdWdpbi5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9BbmRyb2lkVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE2ZmJjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvQW5kcm9pZFRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLSAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhCi0gKiBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZFRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC50ZXN0cyI7Ci0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5kcm9pZFRlc3RQbHVnaW4gc1BsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBBbmRyb2lkVGVzdFBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzUGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFuZHJvaWRUZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9FY2xpcHNlVGVzdENvbGxlY3Rvci5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9FY2xpcHNlVGVzdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQxM2ZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvRWNsaXBzZVRlc3RDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIENsYXNzIGZvciBjb2xsZWN0aW5nIGFsbCB0ZXN0IGNhc2VzIGluIGFuIGVjbGlwc2UgcGx1Z2luCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VUZXN0Q29sbGVjdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEVjbGlwc2VUZXN0Q29sbGVjdG9yKCkgewotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aHJvdWdoIGdpdmVuIHBsdWdpbiwgYWRkaW5nIGFsbCBUZXN0Q2FzZSBjbGFzc2VzIHRvIGdpdmVuIHN1aXRlCi0gICAgICogQHBhcmFtIHN1aXRlIC0gVGVzdFN1aXRlIHRvIGFkZCB0bwotICAgICAqIEBwYXJhbSBwbHVnaW4gLSBQbHVnaW4gdG8gc2VhcmNoIGZvciB0ZXN0cwotICAgICAqIEBwYXJhbSBleHBlY3RlZFBhY2thZ2UgLSBleHBlY3RlZCBwYWNrYWdlIGZvciB0ZXN0cy4gT25seSB0ZXN0IGNsYXNzZXMgCi0gICAgICogIHRoYXQgc3RhcnQgd2l0aCB0aGlzIHBhY2thZ2UgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIHN1aXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdENhc2VzKFRlc3RTdWl0ZSBzdWl0ZSwgUGx1Z2luIHBsdWdpbiwgU3RyaW5nIGV4cGVjdGVkUGFja2FnZSkgewotICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uPD8+IGVudHJpZXMgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZmluZEVudHJpZXMoIi8iLCAiKi5jbGFzcyIsIHRydWUpOwotICAgIAotICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBVUkwgZW50cnkgPSAoVVJMKWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBlbnRyeS5nZXRQYXRoKCkucmVwbGFjZSgiLmNsYXNzIiwgIiIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICBDbGFzczw/PiB0ZXN0Q2xhc3MgPSBnZXRDbGFzcyhmaWxlUGF0aCwgZXhwZWN0ZWRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpc1Rlc3RDbGFzcyh0ZXN0Q2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIHRoaXMgaXMgbm90IHRoZSBjbGFzcyB3ZSdyZSBsb29raW5nIGZvcgotICAgICAgICAgICAgICAgICAgLy9zTG9nZ2VyLmxvZyhMZXZlbC5JTkZPLCAiQ291bGQgbm90IGxvYWQgY2xhc3MgIiArIGZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBnaXZlbiBjbGFzcyBzaG91bGQgYmUgYWRkZWQgdG8gc3VpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Rlc3RDbGFzcyhDbGFzczw/PiB0ZXN0Q2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIFRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdENsYXNzKSAmJgotICAgICAgICAgIE1vZGlmaWVyLmlzUHVibGljKHRlc3RDbGFzcy5nZXRNb2RpZmllcnMoKSkgJiYKLSAgICAgICAgICBoYXNQdWJsaWNDb25zdHJ1Y3Rvcih0ZXN0Q2xhc3MpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgZ2l2ZW4gY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzUHVibGljQ29uc3RydWN0b3IoQ2xhc3M8Pz4gdGVzdENsYXNzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUZXN0U3VpdGUuZ2V0VGVzdENvbnN0cnVjdG9yKHRlc3RDbGFzcyk7Ci0gICAgICAgIH0gY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY2xhc3MgZ2l2ZW4gYnkgdGhlIHBsdWdpbiBha2EgYnVuZGxlIGZpbGUgcGF0aAotICAgICAqIEBwYXJhbSBmaWxlUGF0aCAtIHBhdGggb2YgY2xhc3MgaW4gYnVuZGxlCi0gICAgICogQHBhcmFtIGV4cGVjdGVkUGFja2FnZSAtIGV4cGVjdGVkIHBhY2thZ2Ugb2YgY2xhc3MKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0Q2xhc3MoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgZXhwZWN0ZWRQYWNrYWdlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBkb3RQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnLycsICcuJyk7Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgb3V0cHV0IGZvbGRlcnMsIGJ5IGZpbmRpbmcgd2hlcmUgcGFja2FnZSBuYW1lIHN0YXJ0cwotICAgICAgICBpbnQgaW5kZXggPSBkb3RQYXRoLmluZGV4T2YoZXhwZWN0ZWRQYWNrYWdlKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlUGF0aCA9IGRvdFBhdGguc3Vic3RyaW5nKGluZGV4KTsKLSAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUocGFja2FnZVBhdGgpOyAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvRnVuY1Rlc3RzLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL0Z1bmNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE4ODAxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvRnVuY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLSAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhCi0gKiBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5mdW5jdGVzdHMubGF5b3V0UmVuZGVyaW5nLkFwaURlbW9zUmVuZGVyaW5nVGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQ29udGFpbmVyIFRlc3RTdWl0ZSBmb3IgYWxsIGVjbGlwc2UgdGVzdHMgdG8gYmUgcnVuCi0gKi8KLQotcHVibGljIGNsYXNzIEZ1bmNUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNfVEVTVF9QQUNLQUdFID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLmZ1bmN0ZXN0cyI7Ci0KLSAgICBwdWJsaWMgRnVuY1Rlc3RzKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN1aXRlIG9mIHRlc3QgY2FzZXMgdG8gYmUgcnVuLgotICAgICAqIE5lZWRlZCBmb3IgSlVuaXQzIGNvbXBsaWFudCBjb21tYW5kIGxpbmUgdGVzdCBydW5uZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0gICAgICAgIC8vIFRPRE86IHVuY29tbWVudCB0aGlzIHdoZW4gJ2dlbicgZm9sZGVyIGVycm9yIG9uIGNyZWF0ZSBpcyBmaXhlZAotICAgICAgICAvLyBzdWl0ZS5hZGRUZXN0U3VpdGUoU2FtcGxlUHJvamVjdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXBpRGVtb3NSZW5kZXJpbmdUZXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL1Nka1Rlc3RDYXNlLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL1Nka1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmVlZjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3NyYy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0cy9TZGtUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFkdFBsdWdpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLkFuZHJvaWRUYXJnZXRQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5Mb2FkU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuU2RrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEEgdGVzdCBjYXNlIHdoaWNoIHVzZXMgdGhlIFNESyBsb2FkZWQgYnkgdGhlIEFEVCBwbHVnaW4uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZGtUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU2RrIG1TZGs7Ci0KLSAgICBwcm90ZWN0ZWQgU2RrVGVzdENhc2UoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHtAbGluayBTZGt9IHVuZGVyIHRlc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNkayBnZXRTZGsoKSB7Ci0gICAgICAgIGlmIChtU2RrID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TZGsgPSBsb2FkU2RrKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1TZGspOwotICAgICAgICAgICAgdmFsaWRhdGVTZGsobVNkayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TZGs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBTREsgZnJvbSBBRFQsIHdhaXRpbmcgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHByaXZhdGUgU2RrIGxvYWRTZGsoKSB7Ci0gICAgICAgIEFkdFBsdWdpbiBhZHQgPSBBZHRQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBPYmplY3Qgc2RrTG9jayA9IGFkdC5nZXRTZGtMb2NrT2JqZWN0KCk7Ci0gICAgICAgIExvYWRTdGF0dXMgbG9hZFN0YXR1cyA9IExvYWRTdGF0dXMuTE9BRElORzsKLSAgICAgICAgLy8gd2FpdCBmb3IgQURUIHRvIGxvYWQgdGhlIFNESyBvbiBhIHNlcGFyYXRlIHRocmVhZAotICAgICAgICAvLyBsb29wIG1heCBvZiA2MDAgdGltZXMgKiAyMDAgbXMgPSAgMiBtaW51dGVzCi0gICAgICAgIGZpbmFsIGludCBtYXhXYWl0ID0gNjAwOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBtYXhXYWl0ICYmIGxvYWRTdGF0dXMgPT0gTG9hZFN0YXR1cy5MT0FESU5HOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkKHNka0xvY2spIHsKLSAgICAgICAgICAgICAgICBsb2FkU3RhdHVzID0gYWR0LmdldFNka0xvYWRTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTZGsgc2RrID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkKHNka0xvY2spIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhMb2FkU3RhdHVzLkxPQURFRCwgbG9hZFN0YXR1cyk7Ci0gICAgICAgICAgICBzZGsgPSBTZGsuZ2V0Q3VycmVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2RrKTsKLSAgICAgICAgcmV0dXJuIHNkazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCB0aGUgcHJvdmlkZWQgc2RrIGNvbnRhaW5zIG9uZSBvciBtb3JlIHZhbGlkIHRhcmdldHMuCi0gICAgICogQHBhcmFtIHNkayB0aGUge0BsaW5rIFNka30gdG8gdmFsaWRhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2RrKFNkayBzZGspIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2RrIGhhcyBubyB0YXJnZXRzIiwgc2RrLmdldFRhcmdldHMoKS5sZW5ndGggPiAwKTsKLSAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBzZGsuZ2V0VGFyZ2V0cygpKSB7Ci0gICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBBbmRyb2lkVGFyZ2V0UGFyc2VyKHRhcmdldCkucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRDb2RlKCkgIT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBwYXJzZSB0YXJnZXRzIGRhdGEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvVW5pdFRlc3RzLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL1VuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzE1MTBjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHM7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQ29udGFpbmVyIFRlc3RTdWl0ZSBmb3IgYWxsIGVjbGlwc2UgdW5pdCB0ZXN0cyB0byBiZSBydW4KLSAqIAotICogVXNlcyBFY2xpcHNlIE9TR0kgdG8gZmluZCBhbmQgdGhlbiBydW4gYWxsIGp1bml0Lmp1bml0LmZyYW1ld29yay5UZXN0cyBpbiAKLSAqIHRoaXMgcGx1Z2luLCBleGNsdWRpbmcgdGVzdHMgaW4gdGhlIEZ1bmNUZXN0cy5GVU5DX1RFU1RfUEFDS0FHRSBwYWNrYWdlCi0gKiAKLSAqIFNpbmNlIGl0IHVzZXMgRWNsaXBzZSBPU0dJLCBpdCBtdXN0IGJlIHJ1biBpbiBhIEVjbGlwc2UgcGx1Z2luIGVudmlyb25tZW50Ci0gKiBpLmUuIGZyb20gRWNsaXBzZSB3b3JrYmVuY2gsIHRoaXMgc3VpdGUgbXVzdCBiZSBydW4gdXNpbmcgdGhlIAotICogIkpVbml0IFBsdWctaW4gVGVzdCIgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYXMgb3Bwb3NlZCB0byBhcyBhICJKVW5pdCBUZXN0IiAgCi0gKiAKLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFVuaXRUZXN0cyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFDS0FHRSA9ICJjb20uYW5kcm9pZCI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLSAgICAgICAgVW5pdFRlc3RDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFVuaXRUZXN0Q29sbGVjdG9yKCk7Ci0gICAgICAgIGNvbGxlY3Rvci5hZGRUZXN0Q2FzZXMoc3VpdGUsIEFuZHJvaWRUZXN0UGx1Z2luLmdldERlZmF1bHQoKSwgVEVTVF9QQUNLQUdFKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbGl6ZWQgdGVzdCBjb2xsZWN0b3Igd2hpY2ggd2lsbCBza2lwIGFkZGluZyBmdW5jdGlvbmFsIHRlc3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5pdFRlc3RDb2xsZWN0b3IgZXh0ZW5kcyBFY2xpcHNlVGVzdENvbGxlY3RvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBPdmVycmlkZSBwYXJlbnQgY2xhc3MgdG8gZXhjbHVkZSBmdW5jdGlvbmFsIHRlc3RzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXN0Q2xhc3MoQ2xhc3M8Pz4gdGVzdENsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNUZXN0Q2xhc3ModGVzdENsYXNzKSAmJgotICAgICAgICAgICAgIXRlc3RDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRnVuY1Rlc3RzLkZVTkNfVEVTVF9QQUNLQUdFKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL2xheW91dFJlbmRlcmluZy9BcGlEZW1vc1JlbmRlcmluZ1Rlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL2xheW91dFJlbmRlcmluZy9BcGlEZW1vc1JlbmRlcmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiY2U4Ny4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL2Z1bmN0ZXN0cy9sYXlvdXRSZW5kZXJpbmcvQXBpRGVtb3NSZW5kZXJpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5mdW5jdGVzdHMubGF5b3V0UmVuZGVyaW5nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuS2V5Ym9hcmRTdGF0ZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLk5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5QaXhlbERlbnNpdHlRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlblJhdGlvUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuU2l6ZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRleHRJbnB1dE1ldGhvZFF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuS2V5Ym9hcmRTdGF0ZVF1YWxpZmllci5LZXlib2FyZFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5OYXZpZ2F0aW9uTWV0aG9kOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLkRlbnNpdHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlNjcmVlblJhdGlvUXVhbGlmaWVyLlNjcmVlblJhdGlvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuU2NyZWVuU2l6ZVF1YWxpZmllci5TY3JlZW5TaXplOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLlRleHRJbnB1dE1ldGhvZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyLlRvdWNoU2NyZWVuVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUHJvamVjdFJlc291cmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5Mb2FkU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZFRhcmdldERhdGEuTGF5b3V0QnJpZGdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLlNka1Rlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSUxheW91dFJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklQcm9qZWN0Q2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JUmVzb3VyY2VWYWx1ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYXBpLklYbWxQdWxsUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmt4bWwyLmlvLktYbWxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci0KLXB1YmxpYyBjbGFzcyBBcGlEZW1vc1JlbmRlcmluZ1Rlc3QgZXh0ZW5kcyBTZGtUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gcGFyc2VyIHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgSVhtbFB1bGxQYXJzZXJ9ICh3aGljaCBpdHNlbGYgZXh0ZW5kcwotICAgICAqIHtAbGluayBYbWxQdWxsUGFyc2VyfSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgVGVzdFBhcnNlciBleHRlbmRzIEtYbWxQYXJzZXIgaW1wbGVtZW50cyBJWG1sUHVsbFBhcnNlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcvbGF5b3V0LCB3ZSBjYW4gcmV0dXJuCi0gICAgICAgICAqIG51bGwgZm9yIHRoZSBWaWV3IEtleS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Vmlld0tleSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgUHJvamVjdENhbGxCYWNrIGltcGxlbWVudHMgSVByb2plY3RDYWxsYmFjayB7Ci0gICAgICAgIC8vIHJlc291cmNlIGlkIGNvdW50ZXIuCi0gICAgICAgIC8vIFdlIHN0YXJ0IGF0IDB4N2YwMDAwMDAgdG8gYXZvaWQgY29sbGlkaW5nIHdpdGggdGhlIGZyYW1ld29yayBpZAotICAgICAgICAvLyBzaW5jZSB3ZSBoYXZlIG5vIGFjY2VzcyB0byB0aGUgcHJvamVjdCBSLmphdmEgYW5kIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBhdXRvbWF0aWNhbGx5LgotICAgICAgICBwcml2YXRlIGludCBtSWRDb3VudGVyID0gMHg3ZjAwMDAwMDsKLQotICAgICAgICAvLyBpbiBzb21lIGNhc2VzLCB0aGUgaWQgdGhhdCBnZXRSZXNvdXJjZVZhbHVlKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgcmV0dXJucwotICAgICAgICAvLyB3aWxsIGJlIHNlbnQgYmFjayB0byBnZXQgdGhlIHR5cGUvbmFtZS4gVGhpcyBtYXAgc3RvcmVzIHRoZSBpZC90eXBlL25hbWUgd2UgZ2VuZXJhdGUKLSAgICAgICAgLy8gdG8gYmUgYWJsZSB0byBkbyB0aGUgcmV2ZXJzZSByZXNvbHV0aW9uLgotICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBTdHJpbmdbXT4gbVJlc291cmNlTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nW10+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DdXN0b21WaWV3QXR0ZW1wdCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBmcm9tIHRoZSBBcGlEZW1vcyBtYW5pZmVzdC4KLSAgICAgICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldFJlc291cmNlVmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9ICsrbUlkQ291bnRlcjsKLSAgICAgICAgICAgIG1SZXNvdXJjZU1hcC5wdXQocmVzdWx0LCBuZXcgU3RyaW5nW10geyBuYW1lLCB0eXBlIH0pOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBwdWJsaWMgT2JqZWN0IGxvYWRWaWV3KFN0cmluZyBuYW1lLCBDbGFzc1tdIGNvbnN0cnVjdG9yU2lnbmF0dXJlLCBPYmplY3RbXSBjb25zdHJ1Y3RvckFyZ3MpCi0gICAgICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtQ3VzdG9tVmlld0F0dGVtcHQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gcmVzb2x2ZVJlc291cmNlVmFsdWUoaW50IGlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc291cmNlTWFwLmdldChpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVSZXNvdXJjZVZhbHVlKGludFtdIGlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwaURlbW9zKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKLSAgICAgICAgZmluZEFwaURlbW9zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRBcGlEZW1vcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cyA9IGdldFNkaygpLmdldFRhcmdldHMoKTsKLQotICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IHRhcmdldHMpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuU0FNUExFUyk7Ci0gICAgICAgICAgICBGaWxlIHNhbXBsZXMgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgIGlmIChzYW1wbGVzLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBzYW1wbGVzLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJhcGlkZW1vcyIuZXF1YWxzSWdub3JlQ2FzZShmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTYW1wbGUodGFyZ2V0LCBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZhaWwoIkZhaWxlZCB0byBmaW5kIEFwaURlbW9zISIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U2FtcGxlKElBbmRyb2lkVGFyZ2V0IHRhcmdldCwgRmlsZSBzYW1wbGVQcm9qZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICBBbmRyb2lkVGFyZ2V0RGF0YSBkYXRhID0gZ2V0U2RrKCkuZ2V0VGFyZ2V0RGF0YSh0YXJnZXQpOwotICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJObyBBbmRyb2lkRGF0YSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIExheW91dEJyaWRnZSBicmlkZ2UgPSBkYXRhLmdldExheW91dEJyaWRnZSgpOwotICAgICAgICBpZiAoYnJpZGdlLnN0YXR1cyAhPSBMb2FkU3RhdHVzLkxPQURFRCB8fCBicmlkZ2UuYnJpZGdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkZhaWwgdG8gbG9hZCB0aGUgYnJpZGdlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHJlc0ZvbGRlciA9IG5ldyBGaWxlKHNhbXBsZVByb2plY3QsIFNka0NvbnN0YW50cy5GRF9SRVMpOwotICAgICAgICBpZiAocmVzRm9sZGVyLmlzRGlyZWN0b3J5KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGZhaWwoIlNhbXBsZSBwcm9qZWN0IGhhcyBubyByZXMgZm9sZGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9vayBmb3IgdGhlIGxheW91dCBmb2xkZXIKLSAgICAgICAgRmlsZSBsYXlvdXRGb2xkZXIgPSBuZXcgRmlsZShyZXNGb2xkZXIsIFNka0NvbnN0YW50cy5GRF9MQVlPVVQpOwotICAgICAgICBpZiAobGF5b3V0Rm9sZGVyLmlzRGlyZWN0b3J5KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGZhaWwoIlNhbXBsZSBwcm9qZWN0IGhhcyBubyBsYXlvdXQgZm9sZGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlyc3QgbG9hZCB0aGUgcHJvamVjdCdzIHRhcmdldCBmcmFtZXdvcmsgcmVzb3VyY2UKLSAgICAgICAgUHJvamVjdFJlc291cmNlcyBmcmFtZXdvcmsgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkRnJhbWV3b3JrUmVzb3VyY2VzKHRhcmdldCk7Ci0KLSAgICAgICAgLy8gbm93IGxvYWQgdGhlIHByb2plY3QgcmVzb3VyY2VzCi0gICAgICAgIFByb2plY3RSZXNvdXJjZXMgcHJvamVjdCA9IG5ldyBQcm9qZWN0UmVzb3VyY2VzKGZhbHNlIC8qIGlzRnJhbWV3b3JrUmVwb3NpdG9yeSAqLyk7Ci0gICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXNvdXJjZXMocHJvamVjdCwgcmVzRm9sZGVyKTsKLQotCi0gICAgICAgIC8vIENyZWF0ZSBhIGZvbGRlciBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgcmVuZGVyaW5nOgotICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGNvbmZpZ3VyZWQgcmVzb3VyY2VzCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPj4gY29uZmlndXJlZEZyYW1ld29yayA9Ci0gICAgICAgICAgICAgICAgZnJhbWV3b3JrLmdldENvbmZpZ3VyZWRSZXNvdXJjZXMoY29uZmlnKTsKLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgSVJlc291cmNlVmFsdWU+PiBjb25maWd1cmVkUHJvamVjdCA9Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5nZXRDb25maWd1cmVkUmVzb3VyY2VzKGNvbmZpZyk7Ci0KLSAgICAgICAgYm9vbGVhbiBzYXZlRmlsZXMgPSBTeXN0ZW0uZ2V0ZW52KCJzYXZlX2ZpbGUiKSAhPSBudWxsOwotCi0gICAgICAgIC8vIGxvb3Agb24gdGhlIGxheW91dHMgYW5kIHJlbmRlciB0aGVtCi0gICAgICAgIEZpbGVbXSBsYXlvdXRzID0gbGF5b3V0Rm9sZGVyLmxpc3RGaWxlcygpOwotICAgICAgICBmb3IgKEZpbGUgbGF5b3V0IDogbGF5b3V0cykgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgcGFyc2VyIGZvciB0aGUgbGF5b3V0IGZpbGUKLSAgICAgICAgICAgIFRlc3RQYXJzZXIgcGFyc2VyID0gbmV3IFRlc3RQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBGaWxlUmVhZGVyKGxheW91dCkpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbmRlcmluZyAiICsgbGF5b3V0LmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIFByb2plY3RDYWxsQmFjayBwcm9qZWN0Q2FsbEJhY2sgPSBuZXcgUHJvamVjdENhbGxCYWNrKCk7Ci0KLSAgICAgICAgICAgIElMYXlvdXRSZXN1bHQgcmVzdWx0ID0gYnJpZGdlLmJyaWRnZS5jb21wdXRlTGF5b3V0KAotICAgICAgICAgICAgICAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLypwcm9qZWN0S2V5Ki8sCi0gICAgICAgICAgICAgICAgICAgIDMyMCwKLSAgICAgICAgICAgICAgICAgICAgNDgwLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy9yZW5kZXJGdWxsU2l6ZQotICAgICAgICAgICAgICAgICAgICAxNjAsIC8vZGVuc2l0eQotICAgICAgICAgICAgICAgICAgICAxNjAsIC8veGRwaQotICAgICAgICAgICAgICAgICAgICAxNjAsIC8vIHlkcGkKLSAgICAgICAgICAgICAgICAgICAgIlRoZW1lIiwgLy90aGVtZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vaXNQcm9qZWN0VGhlbWUKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZFByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWRGcmFtZXdvcmssCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RDYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvL2xvZ2dlcgotICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmdldFN1Y2Nlc3MoKSAhPSBJTGF5b3V0UmVzdWx0LlNVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdENhbGxCYWNrLm1DdXN0b21WaWV3QXR0ZW1wdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxFRCIpOwotICAgICAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIlJlbmRlcmluZyAlMSRzOiAlMiRzIiwgbGF5b3V0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0RXJyb3JNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklnbm9yZSBjdXN0b20gdmlld3MgZm9yIG5vdyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhdmVGaWxlcykgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHRtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUobGF5b3V0LmdldE5hbWUoKSwgIi5wbmciKTsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VJTy53cml0ZShyZXN1bHQuZ2V0SW1hZ2UoKSwgInBuZyIsIHRtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2VzcyEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb25maWcuIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNvbmZpZyBsaWtlIGEgZGV2aWNlIHdvdWxkIHJldHVybi4gVGhpcyBpcyB0bwotICAgICAqIHByZXZlbnQgaXNzdWVzIHdoZXJlIHNvbWUgcmVzb3VyY2VzIGRvbid0IGV4aXN0IGluIGFsbCBjYXNlcyBhbmQgbm90IGluIHRoZSBkZWZhdWx0Ci0gICAgICogKGZvciBpbnN0YW5jZSBvbmx5IGF2YWlsYWJsZSBpbiBoZHBpIGFuZCBtZHBpIGJ1dCBub3QgaW4gZGVmYXVsdCkuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gdGhpcyBtYXRjaGVzIGFuIEFEUDEuCi0gICAgICAgIGNvbmZpZy5hZGRRdWFsaWZpZXIobmV3IFNjcmVlblNpemVRdWFsaWZpZXIoU2NyZWVuU2l6ZS5OT1JNQUwpKTsKLSAgICAgICAgY29uZmlnLmFkZFF1YWxpZmllcihuZXcgU2NyZWVuUmF0aW9RdWFsaWZpZXIoU2NyZWVuUmF0aW8uTk9UTE9ORykpOwotICAgICAgICBjb25maWcuYWRkUXVhbGlmaWVyKG5ldyBTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcihTY3JlZW5PcmllbnRhdGlvbi5QT1JUUkFJVCkpOwotICAgICAgICBjb25maWcuYWRkUXVhbGlmaWVyKG5ldyBQaXhlbERlbnNpdHlRdWFsaWZpZXIoRGVuc2l0eS5NRURJVU0pKTsKLSAgICAgICAgY29uZmlnLmFkZFF1YWxpZmllcihuZXcgVG91Y2hTY3JlZW5RdWFsaWZpZXIoVG91Y2hTY3JlZW5UeXBlLkZJTkdFUikpOwotICAgICAgICBjb25maWcuYWRkUXVhbGlmaWVyKG5ldyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyKEtleWJvYXJkU3RhdGUuSElEREVOKSk7Ci0gICAgICAgIGNvbmZpZy5hZGRRdWFsaWZpZXIobmV3IFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcihUZXh0SW5wdXRNZXRob2QuUVdFUlRZKSk7Ci0gICAgICAgIGNvbmZpZy5hZGRRdWFsaWZpZXIobmV3IE5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXIoTmF2aWdhdGlvbk1ldGhvZC5UUkFDS0JBTEwpKTsKLSAgICAgICAgY29uZmlnLmFkZFF1YWxpZmllcihuZXcgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKDQ4MCwgMzIwKSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL2Z1bmN0ZXN0cy9zYW1wbGVQcm9qZWN0cy9BbmRyb2lkTWFuaWZlc3RXcml0ZXIuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL3NhbXBsZVByb2plY3RzL0FuZHJvaWRNYW5pZmVzdFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTVjM2JlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL3NhbXBsZVByb2plY3RzL0FuZHJvaWRNYW5pZmVzdFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdQotICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEKLSAqIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLmZ1bmN0ZXN0cy5zYW1wbGVQcm9qZWN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi54bWwuQW5kcm9pZE1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtb2RpZnlpbmcgYW4gQW5kcm9pZE1hbmlmZXN0LgotICogPHAvPgotICogVE9ETzogY29uc2lkZXIgbWVyZ2luZyB0aGlzIHdpdGggQW5kcm9pZE1hbmlmZXN0UGFyc2VyLgotICovCi1jbGFzcyBBbmRyb2lkTWFuaWZlc3RXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIHNMb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFuZHJvaWRNYW5pZmVzdFdyaXRlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEb2N1bWVudCBtRG9jOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Pc01hbmlmZXN0RmlsZVBhdGg7Ci0KLSAgICBwcml2YXRlIEFuZHJvaWRNYW5pZmVzdFdyaXRlcihEb2N1bWVudCBkb2MsIFN0cmluZyBvc01hbmlmZXN0RmlsZVBhdGgpIHsKLSAgICAgICAgbURvYyA9IGRvYzsKLSAgICAgICAgbU9zTWFuaWZlc3RGaWxlUGF0aCA9IG9zTWFuaWZlc3RGaWxlUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIFNESyB2ZXJzaW9uIGZvciB0aGlzIG1hbmlmZXN0Ci0gICAgICogQHBhcmFtIG1pblNka1ZlcnNpb24gLSB0aGUgbWluaW1pbSBzZGsgdmVyc2lvbiB0byB1c2UKLSAgICAgKiBAcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRNaW5TZGtWZXJzaW9uKFN0cmluZyBtaW5TZGtWZXJzaW9uKSB7Ci0gICAgICAgIEVsZW1lbnQgdXNlc1Nka0VsZW1lbnQgPSBudWxsOwotICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IG1Eb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQW5kcm9pZE1hbmlmZXN0Lk5PREVfVVNFU19TREspOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB1c2VzU2RrRWxlbWVudCA9IChFbGVtZW50KSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlc1Nka0VsZW1lbnQgPSBtRG9jLmNyZWF0ZUVsZW1lbnQoQW5kcm9pZE1hbmlmZXN0Lk5PREVfVVNFU19TREspOwotICAgICAgICAgICAgbURvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh1c2VzU2RrRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXR0ciBtaW5TZGtBdHRyID0gbURvYy5jcmVhdGVBdHRyaWJ1dGVOUyhTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC5BVFRSSUJVVEVfTUlOX1NES19WRVJTSU9OKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG1Eb2MubG9va3VwUHJlZml4KFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMpOwotICAgICAgICBtaW5TZGtBdHRyLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBtaW5TZGtBdHRyLnNldFZhbHVlKG1pblNka1ZlcnNpb24pOwotICAgICAgICB1c2VzU2RrRWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlTlMobWluU2RrQXR0cik7Ci0gICAgICAgIHJldHVybiBzYXZlWG1sVG9GaWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVYbWxUb0ZpbGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBET00gZG9jdW1lbnQgZm9yIHdyaXRpbmcKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKG1Eb2MpOwotCi0gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUobU9zTWFuaWZlc3RGaWxlUGF0aCk7Ci0gICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlKTsKLQotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIERPTSBkb2N1bWVudCB0byB0aGUgZmlsZQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgeGZvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzTG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gd3JpdGUgeG1sIGZpbGUiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc0xvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIHdyaXRlIHhtbCBmaWxlIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBtYW5pZmVzdCBmaWxlLCBhbmQgY29sbGVjdHMgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvc01hbmlmZXN0RmlsZVBhdGggVGhlIE9TIHBhdGggb2YgdGhlIG1hbmlmZXN0IGZpbGUgdG8gcGFyc2UuCi0gICAgICogQHJldHVybiBhbiB7QGxpbmsgQW5kcm9pZE1hbmlmZXN0UGFyc2VyfSBvciBudWxsIGlmIHBhcnNpbmcgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbmRyb2lkTWFuaWZlc3RXcml0ZXIgcGFyc2UoU3RyaW5nIG9zTWFuaWZlc3RGaWxlUGF0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2Uob3NNYW5pZmVzdEZpbGVQYXRoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZE1hbmlmZXN0V3JpdGVyKGRvYywgb3NNYW5pZmVzdEZpbGVQYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzTG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciBwYXJzaW5nIGZpbGUiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc0xvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3IgcGFyc2luZyBmaWxlIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc0xvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3IgcGFyc2luZyBmaWxlIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL3NhbXBsZVByb2plY3RzL1NhbXBsZVByb2plY3RUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RzL2Z1bmN0ZXN0cy9zYW1wbGVQcm9qZWN0cy9TYW1wbGVQcm9qZWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNiOTM5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy9zcmMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdHMvZnVuY3Rlc3RzL3NhbXBsZVByb2plY3RzL1NhbXBsZVByb2plY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYQotICogY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMuZnVuY3Rlc3RzLnNhbXBsZVByb2plY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFuZHJvaWRDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LndpemFyZHMubmV3cHJvamVjdC5TdHViUHJvamVjdFdpemFyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5TZGtUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIFRlc3QgY2FzZSB0aGF0IHZlcmlmaWVzIGFsbCBTREsgc2FtcGxlIHByb2plY3RzIGNhbiBiZSBpbXBvcnRlZCwgYW5kIGJ1aWx0IGluCi0gKiBFY2xpcHNlLgotICogPHAvPgotICogVE9ETzogYWRkIHN1cHBvcnQgZm9yIGRlcGxveWluZyBhcHBzIG9udG8gZW11bGF0b3IgYW5kIHZlcmlmeWluZyBzdWNjZXNzZnVsCi0gKiBleGVjdXRpb24gdGhlcmUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVQcm9qZWN0VGVzdCBleHRlbmRzIFNka1Rlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBzTG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTYW1wbGVQcm9qZWN0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLyoqCi0gICAgICogRmluZHMgYWxsIHNhbXBsZXMgcHJvamVjdHMgaW4gc2V0IFNESyBhbmQgdmVyaWZ5IHRoZXkgY2FuIGJlIGJ1aWx0IGluIEVjbGlwc2UuCi0gICAgICogPHAvPgotICAgICAqIFRPRE86IGFkZCBpbnN0YWxsIGFuZCBydW4gb24gZW11bGF0b3IgdGVzdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1wbGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBGb3IgcmVwb3J0aW5nIHB1cnBvc2VzLCBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgYSBzZXBhcmF0ZSB0ZXN0IHN1Y2Nlc3Mgb3IgZmFpbHVyZQotICAgICAgICAvLyBjb3VsZCBiZSByZXBvcnRlZCBmb3IgZWFjaCBzYW1wbGUKLSAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gZ2V0U2RrKCkuZ2V0VGFyZ2V0cygpOwotICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IHRhcmdldHMpIHsKLSAgICAgICAgICAgIGRvVGVzdFNhbXBsZXNGb3JUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RTYW1wbGVzRm9yVGFyZ2V0KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aCA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlNBTVBMRVMpOwotICAgICAgICBGaWxlIHNhbXBsZXMgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgaWYgKHNhbXBsZXMuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gc2FtcGxlcy5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvVGVzdFNhbXBsZVByb2plY3QoZmlsZS5nZXROYW1lKCksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHNhbXBsZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgLSBTREsgdGFyZ2V0IG9mIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbmFtZSAtIG5hbWUgb2Ygc2FtcGxlIHByb2plY3QgdG8gdGVzdAotICAgICAqIEBwYXJhbSBwYXRoIC0gYWJzb2x1dGUgZmlsZSBzeXN0ZW0gcGF0aAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RTYW1wbGVQcm9qZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KQotICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVByb2plY3QgaXByb2plY3QgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc0xvZ2dlci5sb2coTGV2ZWwuSU5GTywgU3RyaW5nLmZvcm1hdCgiVGVzdGluZyBzYW1wbGUgJXMgZm9yIHRhcmdldCAlcyIsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXROYW1lKCkpKTsKLQotICAgICAgICAgICAgcHJlcGFyZVByb2plY3QocGF0aCwgdGFyZ2V0KTsKLQotICAgICAgICAgICAgZmluYWwgU3R1YlByb2plY3RXaXphcmQgbmV3UHJvakNyZWF0b3IgPSBuZXcgU3R1YlByb2plY3RXaXphcmQoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsIHBhdGgsIHRhcmdldCk7Ci0gICAgICAgICAgICBuZXdQcm9qQ3JlYXRvci5pbml0KG51bGwsIG51bGwpOwotICAgICAgICAgICAgLy8gbmVlZCB0byBydW4gZmluaXNoIG9uIHVpIHRocmVhZCBzaW5jZSBpdCBpbnZva2VzIGEgcGVyc3BlY3RpdmUgc3dpdGNoCi0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qQ3JlYXRvci5wZXJmb3JtRmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGlwcm9qZWN0ID0gdmFsaWRhdGVQcm9qZWN0RXhpc3RzKG5hbWUpOwotICAgICAgICAgICAgdmFsaWRhdGVOb1Byb2JsZW1zKGlwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzTG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgc2FtcGxlIHByb2plY3QgJXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0YXJnZXQgJXMiLCBuYW1lLCB0YXJnZXQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpcHJvamVjdC5kZWxldGUoZmFsc2UsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVQcm9qZWN0KFN0cmluZyBwYXRoLCBJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldC5nZXRWZXJzaW9uKCkuaXNQcmV2aWV3KCkpIHsKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgcHJldmlldydzIHZlcnNpb24gaW4gbWFuaWZlc3QgZm9yIHByb2plY3QgdG8gY29tcGlsZQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hbmlmZXN0UGF0aCA9IHBhdGggKyBGaWxlLnNlcGFyYXRvckNoYXIgKwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1Q7Ci0gICAgICAgICAgICBBbmRyb2lkTWFuaWZlc3RXcml0ZXIgbWFuaWZlc3RXcml0ZXIgPQotICAgICAgICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdFdyaXRlci5wYXJzZShtYW5pZmVzdFBhdGgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChTdHJpbmcuZm9ybWF0KCJjb3VsZCBub3QgcmVhZCBtYW5pZmVzdCAlcyIsIG1hbmlmZXN0UGF0aCksCi0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0V3JpdGVyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFuaWZlc3RXcml0ZXIuc2V0TWluU2RrVmVyc2lvbih0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHZhbGlkYXRlUHJvamVjdEV4aXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBJUHJvamVjdCBpcHJvamVjdCA9IGdldElQcm9qZWN0KG5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIiVzIHByb2plY3Qgbm90IGNyZWF0ZWQiLCBuYW1lKSwgaXByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIiVzIHByb2plY3Qgbm90IG9wZW5lZCIsIG5hbWUpLCBpcHJvamVjdC5pc09wZW4oKSk7Ci0gICAgICAgIHJldHVybiBpcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldElQcm9qZWN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIElQcm9qZWN0IGlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0KG5hbWUpOwotICAgICAgICByZXR1cm4gaXByb2plY3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTm9Qcm9ibGVtcyhJUHJvamVjdCBpcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yQnVpbGQoaXByb2plY3QpOwotCi0gICAgICAgIGJvb2xlYW4gaGFzRXJyb3JzID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgZmFpbHVyZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KCIlcyBwcm9qZWN0IGhhcyBlcnJvcnM6IiwKLSAgICAgICAgICAgICAgICBpcHJvamVjdC5nZXROYW1lKCkpKTsKLSAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBpcHJvamVjdC5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgIGlmIChtYXJrZXJzICE9IG51bGwgJiYgbWFya2Vycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAvLyB0aGUgcHJvamVjdCBoYXMgbWFya2VyKHMpLiBldmVuIHRob3VnaCB0aGV5IGFyZSAicHJvYmxlbSIgd2UKLSAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhlaXIgc2V2ZXJpdHkuIHNvIHdlIGxvb3Agb24gdGhlbSBhbmQgZmlndXJlIGlmIHRoZXkKLSAgICAgICAgICAgIC8vIGFyZSB3YXJuaW5ncyBvciBlcnJvcnMKLSAgICAgICAgICAgIGZvciAoSU1hcmtlciBtIDogbWFya2VycykgewotICAgICAgICAgICAgICAgIGludCBzID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotICAgICAgICAgICAgICAgIGlmIChzID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZUJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlQnVpbGRlci5hcHBlbmQobS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRGYWxzZShmYWlsdXJlQnVpbGRlci50b1N0cmluZygpLCBoYXNFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXRzIGZvciBidWlsZCB0byBjb21wbGV0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcHJvamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQnVpbGQoZmluYWwgSVByb2plY3QgaXByb2plY3QpIHsKLQotICAgICAgICBmaW5hbCBCdWlsdFByb2plY3REZWx0YVZpc2l0b3IgZGVsdGFWaXNpdG9yID0gbmV3IEJ1aWx0UHJvamVjdERlbHRhVmlzaXRvcihpcHJvamVjdCk7Ci0gICAgICAgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIG5ld0J1aWxkTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldERlbHRhKCkuYWNjZXB0KGRlbHRhVmlzaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgICAgICBpcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKG5ld0J1aWxkTGlzdGVuZXIsCi0gICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCk7Ci0KLSAgICAgICAgLy8gcG9sbCBidWlsZCBsaXN0ZW5lciB0byBkZXRlcm1pbmUgd2hlbiBidWlsZCBpcyBkb25lCi0gICAgICAgIC8vIGxvb3AgbWF4IG9mIDEyMDAgdGltZXMgKiA1MCBtcyA9IDYwIHNlY29uZHMKLSAgICAgICAgZmluYWwgaW50IG1heFdhaXQgPSAxMjAwOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBtYXhXYWl0OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChkZWx0YVZpc2l0b3IuaXNQcm9qZWN0QnVpbHQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5yZWFkQW5kRGlzcGF0Y2goKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc0xvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiZXhwZWN0ZWQgYnVpbGQgZXZlbnQgbmV2ZXIgaGFwcGVuZWQ/Iik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgYnVpbGQgZXZlbnQgbmV2ZXIgaGFwcGVuZWQgZm9yICVzIiwgaXByb2plY3QuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgYSBnaXZlbiBJUmVzb3VyY2VEZWx0YSBsb29raW5nIGZvciBhICJidWlsZCBldmVudCIgY2hhbmdlIGZvciBnaXZlbiBJUHJvamVjdAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBCdWlsdFByb2plY3REZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0gICAgICAgIHByaXZhdGUgSVByb2plY3QgbUlQcm9qZWN0OwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gIG1Jc0J1aWx0OwotCi0gICAgICAgIHB1YmxpYyBCdWlsdFByb2plY3REZWx0YVZpc2l0b3IoSVByb2plY3QgaXByb2plY3QpIHsKLSAgICAgICAgICAgIG1JUHJvamVjdCA9IGlwcm9qZWN0OwotICAgICAgICAgICAgbUlzQnVpbHQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAobUlQcm9qZWN0LmVxdWFscyhkZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotICAgICAgICAgICAgICAgIHNldEJ1aWx0KHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCdWlsdChib29sZWFuIGIpIHsKLSAgICAgICAgICAgIG1Jc0J1aWx0ID0gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1Byb2plY3RCdWlsdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNCdWlsdDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy90ZXN0LnhtbCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MTliMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIHRlc3QgbGF1bmNoZXIgZmlsZSBmb3IgQW5kcm9pZCBFY2xpcHNlIHRlc3RzIC0tPgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiAKLSAgICA8IS0tVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCwgc2V0IHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSBmb3Igbm93IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLmhvbWUiIHZhbHVlPSIvb3B0L2VjbGlwc2UiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNka19ob21lIiB2YWx1ZT0iL3RtcC9zZGsiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VfdGVzdCIgdmFsdWU9IiR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4yLjAiIC8+Ci0JCi0gICAgPCEtLSBlY2xpcHNlIHNjcmlwdHMgdXNlIGFuIGFubm95aW5nIG1peHR1cmUgb2YgZWNsaXBzZS1ob21lIGFuZCBlY2xpcHNlLmhvbWUgLS0+Ci0gICAgPCEtLSBsZXRzIGRlZmluZSBib3RoLi4uLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7ZWNsaXBzZS5ob21lfSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGVzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UuaG9tZX0vdGVzdF9mb2xkZXIiIC8+Ci0gICAgICAgIAotICAgIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLmhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZV90ZXN0fS9saWJyYXJ5LnhtbCIgLz4KLQotICAgIDwhLS0gbG9jYXRpb24gb2YgYWR0IHByZWZlcmVuY2UgZmlsZSAod2l0aGluIHdvcmtzcGFjZSkgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InByZWZzX3BhdGgiIHZhbHVlPSIke3Rlc3QtZm9sZGVyfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLy5zZXR0aW5ncy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQucHJlZnMiIC8+Ci0gICAgPCEtLSBsb2NhdGlvbiBvZiBwcmVmIHRlbXBsYXRlIGZpbGUgcmVsYXRpdmUgdG8gdGhpcyBmaWxlIC0tPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InByZWZzX3RlbXBsYXRlIiB2YWx1ZT0icHJlZnMudGVtcGxhdGUiIC8+Ci0KLSAgICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gICAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiAgICAgICAgIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx0c3RhbXAgLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iZWNsaXBzZS5ob21lOiAgJHtlY2xpcHNlLmhvbWV9IiAvPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJsaWJmaWxlOiAgJHtsaWJyYXJ5LWZpbGV9IiAvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBkZWxldGUgdGVzdCBlY2xpcHNlIHdvcmtzcGFjZSAtLT4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIgLz4KLSAgICAJCi0gICAgCTwhLS0gZGVsZXRlIHRlc3QgcmVzdWx0cyBkaXIgLS0+Ci0gICAgCTxkZWxldGUgZGlyPSIke2VjbGlwc2UuaG9tZX0vcmVzdWx0cyIgcXVpZXQ9InRydWUiIC8+Ci0KLSAgICAgICAgPCEtLSBDb3B5IGEgcHJlZmVyZW5jZSBmaWxlIGludG8gdGhlIHRlc3Qgd29ya3NwYWNlLiAtLT4KLSAgICAgICAgPCEtLSBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIEFuZHJvaWQgU0RLIHByZWZlcmVuY2UgaXMgc2V0IG9uIHN0YXJ0dXAgLS0+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cHJlZnNfdGVtcGxhdGV9IiB0b2ZpbGU9IiR7cHJlZnNfcGF0aH0iIC8+Ci0gICAgICAgIDwhLS0gcmVwbGFjZSBzZGsgcGF0aCBwbGFjZWhvbGRlciB0b2tlbiB3aXRoIGFjdHVhbCBzZGsgcGF0aCAtLT4KLSAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtwcmVmc19wYXRofSIgdG9rZW49InNka19ob21lIiB2YWx1ZT0iJHtzZGtfaG9tZX0iIC8+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gaWYgdGhpcyBpcyBvbiB3aW5kb3dzLCBlc2NhcGUgdGhlIGRyaXZlIGFuZCBmaWxlIHNlcGFyYXRvcnMgLS0+DQotICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3ByZWZzX3BhdGh9IiB0b2tlbj0iXCIgdmFsdWU9IlxcIiAvPg0KLSAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtwcmVmc19wYXRofSIgdG9rZW49IjoiIHZhbHVlPSJcOiIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDwhLS0gbGF1bmNoIGFzIHVpLXRlc3QgaWUgYXMgYSB0ZXN0IHdoaWNoIG5lZWRzIEVjbGlwc2Ugd29ya2JlbmNoIC0tPgotICAgICAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS5ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3Rlc3QtZm9sZGVyfSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLkFsbFRlc3RzIiAvPgotICAgICAgICAgICAgPCEtLSBwYXNzIGV4dHJhIHZtIGFyZyB0byBzZXQgc2RrX2hvbWUgZW52IGFuZCB0ZXN0X2RhdGEgZW52IHZhcmlhYmxlIC0tPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLUR0ZXN0X2RhdGE9JHt0ZXN0X2RhdGF9IiAvPgotICAgICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICAgIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLmhvbWV9L3Jlc3VsdHMiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0iY29tKi54bWwiIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3QueG1sIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDBlYy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSB0ZXN0IGxhdW5jaGVyIGZpbGUgZm9yIEFuZHJvaWQgRWNsaXBzZSB1bml0IHRlc3RzIC0tPgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiAKLSAgICA8IS0tVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCwgc2V0IHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSBmb3Igbm93IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLmhvbWUiIHZhbHVlPSIvb3B0L2VjbGlwc2UiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VfdGVzdCIgdmFsdWU9IiR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4yLjAiIC8+Ci0KLSAgICA8IS0tIGVjbGlwc2Ugc2NyaXB0cyB1c2UgYW4gYW5ub3lpbmcgbWl4dHVyZSBvZiBlY2xpcHNlLWhvbWUgYW5kIGVjbGlwc2UuaG9tZSAtLT4KLSAgICA8IS0tIGxldHMgZGVmaW5lIGJvdGguLi4tLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtlY2xpcHNlLmhvbWV9IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS5ob21lfS91bml0dGVzdF93cyIgLz4KLSAgICAgICAgCi0gICAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UuaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlX3Rlc3R9L2xpYnJhcnkueG1sIiAvPgotCQotICAgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uICAgICAgICAgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAJPGFudCBhbnRmaWxlPSJ0ZXN0LnhtbCIgdGFyZ2V0PSJpbml0Ij4KLSAgICAJCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LWZvbGRlciIgdmFsdWU9IiR7dGVzdC1mb2xkZXJ9IiAvPgotICAgICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDwhLS0gbmVlZCB0byBsYXVuY2ggYXMgdWktdGVzdCBzaW5jZSBhbGwgQURUIHBsdWdpbnMgZGVwZW5kIG9uIHVpLS0+Ci0gICAgCTwhLS0gb3RoZXJ3aXNlIG90aGVyIHBsdWdpbnMgd2lsbCBub3QgbG9hZCAtLT4KLSAgICAgICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UuaG9tZX0iPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt0ZXN0LWZvbGRlcn0iIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5Vbml0VGVzdHMiIC8+Ci0gICAgICAgICAgICA8IS0tIHBhc3MgZXh0cmEgdm0gYXJnIHRvIHNldCB0ZXN0X2RhdGEgZW52IHZhcmlhYmxlIC0tPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLUR0ZXN0X2RhdGE9JHt0ZXN0X2RhdGF9IiAvPgotICAgICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICAgIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLmhvbWV9L3Jlc3VsdHMiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0iY29tKi54bWwiIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9idWlsZC9CYXNlQnVpbGRlclRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Jhc2VCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ2NThiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2J1aWxkL0Jhc2VCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYnVpbGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEJhc2VCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFhcHRPdXRwdXQoKSB7Ci0gICAgICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZSggIl4oLispOihcXGQrKTpcXHMoLispJCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzID0gIkM6XFxqYXZhXFx3b3Jrc3BhY2UtYW5kcm9pZFxcQW5kcm9pZEFwcFxccmVzXFx2YWx1ZXNcXHN0cmluZ3MueG1sOjExOiBXQVJOSU5HOiBlbXB0eSAnc29tZSB3YXJuaW5nIHRleHQiOwotCi0gICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG0ubWF0Y2hlcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDOlxcamF2YVxcd29ya3NwYWNlLWFuZHJvaWRcXEFuZHJvaWRBcHBcXHJlc1xcdmFsdWVzXFxzdHJpbmdzLnhtbCIsIG0uZ3JvdXAoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjExIiwgbS5ncm91cCgyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV0FSTklORzogZW1wdHkgJ3NvbWUgd2FybmluZyB0ZXh0IiwgbS5ncm91cCgzKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0Rlc2NyaXB0b3JzVXRpbHNUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2Rlc2NyaXB0b3JzL0Rlc2NyaXB0b3JzVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmY3YWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9kZXNjcmlwdG9ycy9EZXNjcmlwdG9yc1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9yczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkRlc2NyaXB0b3JzVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3IgRGVzY3JpcHRvcnNVdGlscyBpbiB0aGUgZWRpdG9ycyBwbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JzVXRpbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlBdHRyaWJ1dGVVaU5hbWUoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIk1heCB3aWR0aCBmb3IgdmlldyIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoIm1heFdpZHRoRm9yVmlldyIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkxheW91dCB3aWR0aCIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoImxheW91dF93aWR0aCIpKTsKLQotICAgICAgICAvLyBYIFkgYW5kIFogYXJlIGNhcGl0YWxpemVkIHdoZW4gdXNlZCBhcyBzaW5nbGUgd29yZHMgKHNvICJUIiBiZWNvbWVzICJ0IikKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBeGlzIFgiLCBEZXNjcmlwdG9yc1V0aWxzLnByZXR0eUF0dHJpYnV0ZVVpTmFtZSgiYXhpc1giKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQXhpcyBZIiwgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoImF4aXNZIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkF4aXMgWiIsIERlc2NyaXB0b3JzVXRpbHMucHJldHR5QXR0cmlidXRlVWlOYW1lKCJheGlzWiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBeGlzIHQiLCBEZXNjcmlwdG9yc1V0aWxzLnByZXR0eUF0dHJpYnV0ZVVpTmFtZSgiYXhpc1QiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgWCBheGlzIiwgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoInRoZVhBeGlzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBZIGF4aXMiLCBEZXNjcmlwdG9yc1V0aWxzLnByZXR0eUF0dHJpYnV0ZVVpTmFtZSgidGhlWUF4aXMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVGhlIFogYXhpcyIsIERlc2NyaXB0b3JzVXRpbHMucHJldHR5QXR0cmlidXRlVWlOYW1lKCJ0aGVaQXhpcyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdCBheGlzIiwgRGVzY3JpcHRvcnNVdGlscy5wcmV0dHlBdHRyaWJ1dGVVaU5hbWUoInRoZVRBeGlzIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIlVQUEVSIiwgRGVzY3JpcHRvcnNVdGlscy5jYXBpdGFsaXplKCJVUFBFUiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMb3dlciIsIERlc2NyaXB0b3JzVXRpbHMuY2FwaXRhbGl6ZSgibG93ZXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2FwaXRhbCIsIERlc2NyaXB0b3JzVXRpbHMuY2FwaXRhbGl6ZSgiQ2FwaXRhbCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW1lbENhc2UiLCBEZXNjcmlwdG9yc1V0aWxzLmNhcGl0YWxpemUoImNhbWVsQ2FzZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBEZXNjcmlwdG9yc1V0aWxzLmNhcGl0YWxpemUoIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0VG9vbHRpcCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiYXBwbGljYXRpb25cIiIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKAotICAgICAgICAgICAgICAgICAgICAgICAgIjxjb2RlPmFwcGxpY2F0aW9uPC9jb2RlPiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuY29udGVudC5JbnRlbnQiLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzVXRpbHMuZm9ybWF0VG9vbHRpcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0iKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKAotICAgICAgICAgICAgICAgICAgICAgICAgIntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUH0iKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoImFjdGl2aXR5LWFsaWFzIiwKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAie0BsaW5rIFx0ICAjQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhcyAgXHRhY3Rpdml0eS1hbGlhcyB9IikpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcInBlcm1pc3Npb25cIiIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKAotICAgICAgICAgICAgICAgICAgICAgICAgIntAbGluayAjQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbiAmbHQ7cGVybWlzc2lvbiZndDt9IikpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmQgZXRjLiIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRUb29sdGlwKAotICAgICAgICAgICAgICAgICAgICAgICAgIntAbGluayAjSW50ZW50Q2F0ZWdvcnkgPGNhdGVnb3J5PiBhbmQgZXRjLiB9IikpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eS5vbk5ld0ludGVudCgpIiwKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdFRvb2x0aXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAie0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IEFjdGl2aXR5Lm9uTmV3SW50ZW50KCl9IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXRGb3JtVGV4dCgpIHsKLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZGVzYyA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigiYXBwbGljYXRpb24iKTsKLSAgICAgICAgZGVzYy5zZXRTZGtVcmwoRGVzY3JpcHRvcnNVdGlscy5NQU5JRkVTVF9TREtfVVJMICsgIlRhZ0FwcGxpY2F0aW9uIik7Ci0gICAgICAgIFN0cmluZyBkb2NCYXNlVXJsID0gImh0dHA6Ly9iYXNlIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8Zm9ybT48bGkgc3R5bGU9XCJpbWFnZVwiIHZhbHVlPVwiaW1hZ2VcIj48L2xpPjwvZm9ybT4iLCBEZXNjcmlwdG9yc1V0aWxzLmZvcm1hdEZvcm1UZXh0KCIiLCBkZXNjLCBkb2NCYXNlVXJsKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8Zm9ybT48bGkgc3R5bGU9XCJpbWFnZVwiIHZhbHVlPVwiaW1hZ2VcIj48YSBocmVmPVwiaHR0cDovL2Jhc2UvcmVmZXJlbmNlL2FuZHJvaWQvUi5zdHlsZWFibGUuaHRtbCNUYWdBcHBsaWNhdGlvblwiPmFwcGxpY2F0aW9uPC9hPjwvbGk+PC9mb3JtPiIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRGb3JtVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZT5hcHBsaWNhdGlvbjwvY29kZT4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywgZG9jQmFzZVVybCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiPGZvcm0+PGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImltYWdlXCI+PGI+YW5kcm9pZC5jb250ZW50LkludGVudDwvYj48L2xpPjwvZm9ybT4iLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzVXRpbHMuZm9ybWF0Rm9ybVRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAie0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsIGRvY0Jhc2VVcmwpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjxmb3JtPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJpbWFnZVwiPjxhIGhyZWY9XCJodHRwOi8vYmFzZS9yZWZlcmVuY2UvYW5kcm9pZC9SLnN0eWxlYWJsZS5odG1sI0FuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25cIj5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uPC9hPjwvbGk+PC9mb3JtPiIsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnNVdGlscy5mb3JtYXRGb3JtVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ7QGxpbmsgI0FuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb259IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsIGRvY0Jhc2VVcmwpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjxmb3JtPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJpbWFnZVwiPjxhIGhyZWY9XCJodHRwOi8vYmFzZS9yZWZlcmVuY2UvYW5kcm9pZC9SLnN0eWxlYWJsZS5odG1sI0FuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25cIj5cInBlcm1pc3Npb25cIjwvYT48L2xpPjwvZm9ybT4iLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzVXRpbHMuZm9ybWF0Rm9ybVRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAie0BsaW5rICNBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uICZsdDtwZXJtaXNzaW9uJmd0O30iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywgZG9jQmFzZVVybCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpRWxlbWVudFB1bGxQYXJzZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL2xheW91dC9VaUVsZW1lbnRQdWxsUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjM0ZDZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbGF5b3V0L1VpRWxlbWVudFB1bGxQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5sYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5kZXNjcmlwdG9ycy5BdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmRlc2NyaXB0b3JzLlRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLmxheW91dC5VaUVsZW1lbnRQdWxsUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1vY2suTW9ja1htbE5vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMudWltb2RlbC5VaUVsZW1lbnROb2RlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVWlFbGVtZW50UHVsbFBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFVpRWxlbWVudE5vZGUgdWk7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBidXR0b24xTWFwOwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYnV0dG9uMk1hcDsKLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHRleHRNYXA7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBzZXQgdXAgc29tZSBiYXNpYyBkZXNjcmlwdG9ycy4KLSAgICAgICAgLy8gV2UgaGF2ZSBidXR0b24sIHRleHR2aWV3LCBsaW5lYXIgbGF5b3V0LCByZWxhdGl2ZSBsYXlvdXQuCi0gICAgICAgIC8vIG9ubHkgdGhlIGxheW91dHMgaGF2ZSBjaGlsZHJlbiAoYWxsIDQgZGVzY3JpcHRvcnMgcG9zc2libGUpCi0gICAgICAgIC8vIEFsc28gYWRkIHNvbWUgZHVtbXkgYXR0cmlidXRlcy4KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgYnV0dG9uRGVzY3JpcHRvciA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigiQnV0dG9uIiwgIkJ1dHRvbiIsICIiLCAiIiwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKCJuYW1lIiwgIm5hbWUiLCBTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAiIiksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcigidGV4dCIsICJ0ZXh0IiwgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIiIpLAotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHt9LCBmYWxzZSk7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgdGV4dERlc2NyaXB0b3IgPSBuZXcgRWxlbWVudERlc2NyaXB0b3IoIlRleHRWaWV3IiwgIlRleHRWaWV3IiwgIiIsICIiLAotICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVEZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcigibmFtZSIsICJuYW1lIiwgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIiIpLAotICAgICAgICAgICAgICAgIG5ldyBUZXh0QXR0cmlidXRlRGVzY3JpcHRvcigidGV4dCIsICJ0ZXh0IiwgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIiIpLCB9LAotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHt9LCBmYWxzZSk7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgbGluZWFyRGVzY3JpcHRvciA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigiTGluZWFyTGF5b3V0IiwgIkxpbmVhciBMYXlvdXQiLAotICAgICAgICAgICAgICAgICIiLCAiIiwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKCJvcmllbnRhdGlvbiIsICJvcmllbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIiIpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10geyB9LCBmYWxzZSk7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgcmVsYXRpdmVEZXNjcmlwdG9yID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJSZWxhdGl2ZUxheW91dCIsCi0gICAgICAgICAgICAgICAgIlJlbGF0aXZlIExheW91dCIsICIiLCAiIiwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRBdHRyaWJ1dGVEZXNjcmlwdG9yKCJvcmllbnRhdGlvbiIsICJvcmllbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIiIpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yW10geyB9LCBmYWxzZSk7Ci0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3JbXSBhID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yW10gewotICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3IsIHRleHREZXNjcmlwdG9yLCBsaW5lYXJEZXNjcmlwdG9yLCByZWxhdGl2ZURlc2NyaXB0b3IKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGxpbmVhckRlc2NyaXB0b3Iuc2V0Q2hpbGRyZW4oYSk7Ci0gICAgICAgIHJlbGF0aXZlRGVzY3JpcHRvci5zZXRDaGlsZHJlbihhKTsKLQotICAgICAgICAvLyBkb2N1bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIHJvb3REZXNjcmlwdG9yID0gbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJyb290IiwgIiIsICIiLCAiIiwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlRGVzY3JpcHRvcltdIHsgfSwgYSwgZmFsc2UpOwotCi0gICAgICAgIAotICAgICAgICB1aSA9IG5ldyBVaUVsZW1lbnROb2RlKHJvb3REZXNjcmlwdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8qIGNyZWF0ZSBhIGR1bW15IFhNTCBmaWxlLgotICAgICAgICAgKiA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICAgICAgICogICAgICA8QnV0dG9uIGFuZHJvaWQ6bmFtZT0iYnV0dG9uMSIgYW5kcm9pZDp0ZXh0PSJidXR0b24xdGV4dCIvPgotICAgICAgICAgKiAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ0b3RvIj4KLSAgICAgICAgICogICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOm5hbWU9ImJ1dHRvbjIiIGFuZHJvaWQ6dGV4dD0iYnV0dG9uMnRleHQiLz4KLSAgICAgICAgICogICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bmFtZT0idGV4dDEiIGFuZHJvaWQ6dGV4dD0idGV4dDF0ZXh0Ii8+Ci0gICAgICAgICAqICAgICAgPC9SZWxhdGl2ZUxheW91dD4KLSAgICAgICAgICogPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAqLwotICAgICAgICBNb2NrWG1sTm9kZSBidXR0b24xID0gbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAiQnV0dG9uIiwgTm9kZS5FTEVNRU5UX05PREUsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGJ1dHRvbjEuYWRkQXR0cmlidXRlcyhTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAibmFtZSIsICJidXR0b24xIik7Ci0gICAgICAgIGJ1dHRvbjEuYWRkQXR0cmlidXRlcyhTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAidGV4dCIsICJidXR0b24xdGV4dCIpOwotICAgICAgICAKLSAgICAgICAgLy8gY3JlYXRlIGEgbWFwIG9mIHRoZSBhdHRyaWJ1dGVzIHdlIGFkZCB0byB0aGUgbXVsdGktYXR0cmlidXRlIG5vZGVzIHNvIHRoYXQKLSAgICAgICAgLy8gd2UgY2FuIG1vcmUgZWFzaWx5IHRlc3QgdGhlIHZhbHVlcyB3aGVuIHdlIHBhcnNlIHRoZSBYTUwuCi0gICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHNvbWUgYXR0cmlidXRlcyBzaG93aW5nIGluIGEgY2VydGFpbiBvcmRlciBmb3IgYSBub2RlIGFuZCBpbiBhIGRpZmZlcmVudAotICAgICAgICAvLyBvcmRlciBpbiBhbm90aGVyIG5vZGUuIFNpbmNlIHRoZSBvcmRlciBkb2Vzbid0IG1hdHRlciwgd2UganVzdCBzaW1wbGlmeSB0aGUgdGVzdC4KLSAgICAgICAgYnV0dG9uMU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBidXR0b24xTWFwLnB1dCgibmFtZSIsICJidXR0b24xIik7Ci0gICAgICAgIGJ1dHRvbjFNYXAucHV0KCJ0ZXh0IiwgImJ1dHRvbjF0ZXh0Iik7Ci0KLSAgICAgICAgTW9ja1htbE5vZGUgYnV0dG9uMiA9IG5ldyBNb2NrWG1sTm9kZShudWxsIC8qIG5hbWVzcGFjZSAqLywgIkJ1dHRvbiIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBidXR0b24yLmFkZEF0dHJpYnV0ZXMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIm5hbWUiLCAiYnV0dG9uMiIpOwotICAgICAgICBidXR0b24yLmFkZEF0dHJpYnV0ZXMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgInRleHQiLCAiYnV0dG9uMnRleHQiKTsKLQotICAgICAgICBidXR0b24yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGJ1dHRvbjJNYXAucHV0KCJuYW1lIiwgImJ1dHRvbjIiKTsKLSAgICAgICAgYnV0dG9uMk1hcC5wdXQoInRleHQiLCAiYnV0dG9uMnRleHQiKTsKLSAgICAgICAgCi0gICAgICAgIE1vY2tYbWxOb2RlIHRleHQgPSBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJUZXh0VmlldyIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICB0ZXh0LmFkZEF0dHJpYnV0ZXMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIm5hbWUiLCAidGV4dDEiKTsKLSAgICAgICAgdGV4dC5hZGRBdHRyaWJ1dGVzKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsICJ0ZXh0IiwgInRleHQxdGV4dCIpOwotCi0gICAgICAgIHRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdGV4dE1hcC5wdXQoIm5hbWUiLCAidGV4dDEiKTsKLSAgICAgICAgdGV4dE1hcC5wdXQoInRleHQiLCAidGV4dDF0ZXh0Iik7Ci0KLSAgICAgICAgTW9ja1htbE5vZGUgcmVsYXRpdmUgPSBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJSZWxhdGl2ZUxheW91dCIsCi0gICAgICAgICAgICAgICAgTm9kZS5FTEVNRU5UX05PREUsIG5ldyBNb2NrWG1sTm9kZVtdIHsgYnV0dG9uMiwgdGV4dCB9KTsKLSAgICAgICAgcmVsYXRpdmUuYWRkQXR0cmlidXRlcyhTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLCAib3JpZW50YXRpb24iLCAidG90byIpOwotICAgICAgICAKLSAgICAgICAgTW9ja1htbE5vZGUgbGluZWFyID0gbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAiTGluZWFyTGF5b3V0IiwKLSAgICAgICAgICAgICAgICBOb2RlLkVMRU1FTlRfTk9ERSwgbmV3IE1vY2tYbWxOb2RlW10geyBidXR0b24xLCByZWxhdGl2ZSB9KTsKLSAgICAgICAgbGluZWFyLmFkZEF0dHJpYnV0ZXMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgIm9yaWVudGF0aW9uIiwgInZlcnRpY2FsIik7Ci0gICAgICAgIAotICAgICAgICBNb2NrWG1sTm9kZSByb290ID0gbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAicm9vdCIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZVtdIHsgbGluZWFyIH0pOwotICAgICAgICAKLSAgICAgICAgLy8gcHV0IHRoZSBuYW1lc3BhY2UvcHJlZml4IGluIHBsYWNlCi0gICAgICAgIHJvb3Quc2V0UHJlZml4KFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsICJhbmRyb2lkIik7Ci0KLSAgICAgICAgLy8gbG9hZCB0aGUgeG1sIGludG8gdGhlIFVpRWxlbWVudE5vZGUKLSAgICAgICAgdWkubG9hZEZyb21YbWxOb2RlKHJvb3QpOwotCi0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHdyYXAgdGhlIHBhcnNlciBhcm91bmQgdGhlIHVpIGVsZW1lbnQgbm9kZSwgYW5kIHN0YXJ0IHBhcnNpbmcKLSAgICAgICAgICAgIFVpRWxlbWVudFB1bGxQYXJzZXIgcGFyc2VyID0gbmV3IFVpRWxlbWVudFB1bGxQYXJzZXIodWkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sUHVsbFBhcnNlci5TVEFSVF9ET0NVTUVOVCwgcGFyc2VyLmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdG9wIGxldmVsIExpbmVhciBsYXlvdXQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRywgcGFyc2VyLm5leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmVhckxheW91dCIsIHBhcnNlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygib3JpZW50YXRpb24iLCBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZSgwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgcGFyc2VyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZSgwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQiLCBwYXJzZXIuZ2V0QXR0cmlidXRlUHJlZml4KDApKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmVydGljYWwiLCBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoMCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBCdXR0b24KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRywgcGFyc2VyLm5leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkJ1dHRvbiIsIHBhcnNlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpKTsKLSAgICAgICAgICAgIGNoZWNrKHBhcnNlciwgMCwgYnV0dG9uMU1hcCk7Ci0gICAgICAgICAgICBjaGVjayhwYXJzZXIsIDEsIGJ1dHRvbjFNYXApOwotICAgICAgICAgICAgLy8gZW5kIG9mIGJ1dHRvbgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgcGFyc2VyLm5leHQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbGF0aXZlIExheW91dAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBwYXJzZXIubmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVsYXRpdmVMYXlvdXQiLCBwYXJzZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWVudGF0aW9uIiwgcGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoMCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMsIHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoMCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkIiwgcGFyc2VyLmdldEF0dHJpYnV0ZVByZWZpeCgwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRvdG8iLCBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoMCkpOwotCi0gICAgICAgICAgICAvLyBCdXR0b24KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRywgcGFyc2VyLm5leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkJ1dHRvbiIsIHBhcnNlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpKTsKLSAgICAgICAgICAgIGNoZWNrKHBhcnNlciwgMCwgYnV0dG9uMk1hcCk7Ci0gICAgICAgICAgICBjaGVjayhwYXJzZXIsIDEsIGJ1dHRvbjJNYXApOwotICAgICAgICAgICAgLy8gZW5kIG9mIGJ1dHRvbgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgcGFyc2VyLm5leHQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRleHRWaWV3Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIHBhcnNlci5uZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXh0VmlldyIsIHBhcnNlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpKTsKLSAgICAgICAgICAgIGNoZWNrKHBhcnNlciwgMCwgdGV4dE1hcCk7Ci0gICAgICAgICAgICBjaGVjayhwYXJzZXIsIDEsIHRleHRNYXApOwotICAgICAgICAgICAgLy8gZW5kIG9mIFRleHRWaWV3Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBwYXJzZXIubmV4dCgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZW5kIG9mIFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBwYXJzZXIubmV4dCgpKTsKLQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBlbmQgb2YgdG9wIGxldmVsIGxpbmVhciBsYXlvdXQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxQdWxsUGFyc2VyLkVORF9UQUcsIHBhcnNlci5uZXh0KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQsIHBhcnNlci5uZXh0KCkpOwotICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmVzIGEge0BsaW5rIFhtbFB1bGxQYXJzZXJ9IGF0IHRoZSBTVEFSVF9UQUcgbGV2ZWwsIGFuZCBjaGVja3MgdGhlIGktdGggYXR0cmlidXRlCi0gICAgICogdG8gYmUgcHJlc2VudCBpbiB0aGUge0BsaW5rIEhhc2hNYXB9IHdpdGggdGhlIHByb3BlciAobmFtZSwgdmFsdWUpCi0gICAgICogQHBhcmFtIHBhcnNlcgotICAgICAqIEBwYXJhbSBpCi0gICAgICogQHBhcmFtIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVjayhVaUVsZW1lbnRQdWxsUGFyc2VyIHBhcnNlciwgaW50IGksIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcmVmZXJlbmNlVmFsdWUgPSBtYXAuZ2V0KG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlZmVyZW5jZVZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZmVyZW5jZVZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoU2RrQ29uc3RhbnRzLk5TX1JFU09VUkNFUywgcGFyc2VyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZCIsIHBhcnNlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaUVsZW1lbnROb2RlVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tYW5pZmVzdC9tb2RlbC9VaUVsZW1lbnROb2RlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNkOGQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbWFuaWZlc3QvbW9kZWwvVWlFbGVtZW50Tm9kZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLm1hbmlmZXN0Lm1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMuZGVzY3JpcHRvcnMuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubW9jay5Nb2NrWG1sTm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy51aW1vZGVsLlVpRWxlbWVudE5vZGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVWlFbGVtZW50Tm9kZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIEVsZW1lbnREZXNjcmlwdG9yIGU7Ci0gICAgcHJpdmF0ZSBVaUVsZW1lbnROb2RlIHVpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZSA9IG5ldyBFbGVtZW50RGVzY3JpcHRvcigibWFuaWZlc3QiLCBuZXcgRWxlbWVudERlc2NyaXB0b3JbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJhcHBsaWNhdGlvbiIsIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJwcm92aWRlciIpLCAKLSAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJhY3Rpdml0eSIsIG5ldyBFbGVtZW50RGVzY3JpcHRvcltdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50RGVzY3JpcHRvcigiaW50ZW50LWZpbHRlciIpCi0gICAgICAgICAgICAgICAgICAgIH0pLCAKLSAgICAgICAgICAgICAgICB9KSwgCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnREZXNjcmlwdG9yKCJwZXJtaXNzaW9uIikKLSAgICAgICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgdWkgPSBuZXcgVWlFbGVtZW50Tm9kZShlKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGluaXRpYWxpemF0aW9uIHZhbHVlcyBmb3IgdWkgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgewotICAgICAgICBhc3NlcnRTYW1lKGUsIHVpLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodWkuZ2V0VWlQYXJlbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1aS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVpLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGxvYWRGcm9tKCkgZG9lcyBub3RoaW5nIGlmIHRoZSByb290IG5vZGUgZG9lc24ndCBtYXRjaCB3aGF0J3MgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEZyb21fSW52YWxpZFJvb3QoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1aS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgTW9ja1htbE5vZGUgcm9vdCA9IG5ldyBNb2NrWG1sTm9kZShudWxsIC8qIG5hbWVzcGFjZSAqLywgImJsYWgiLCBOb2RlLkVMRU1FTlRfTk9ERSwgbnVsbCk7Ci0gICAgICAgIHVpLmxvYWRGcm9tWG1sTm9kZShyb290KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVpLmdldFVpQ2hpbGRyZW4oKS5zaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVpRWxlbWVudE5vZGUubG9hZEZyb20gc2hvdWxkIGJlIHVzZWQgdG8gcG9wdWxhdGUgYW4gZW1wdHkgdWkgbm9kZSBmcm9tIGFuCi0gICAgICogZXhpc3RpbmcgWE1MIG5vZGUgdHJlZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEZyb21fTmV3VHJlZV8xX05vZGUoKSB7Ci0gICAgICAgIE1vY2tYbWxOb2RlIHJvb3QgPSBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJtYW5pZmVzdCIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlW10gewotICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZShudWxsIC8qIG5hbWVzcGFjZSAqLywgImFwcGxpY2F0aW9uIiwgTm9kZS5FTEVNRU5UX05PREUsIG51bGwpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QKLSAgICAgICAgdWkubG9hZEZyb21YbWxOb2RlKHJvb3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbmlmZXN0IiwgdWkuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB1aS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVpLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IC9tYW5pZmVzdC9hcHBsaWNhdGlvbgotICAgICAgICBJdGVyYXRvcjxVaUVsZW1lbnROb2RlPiB1aV9jaGlsZF9pdCA9IHVpLmdldFVpQ2hpbGRyZW4oKS5pdGVyYXRvcigpOwotICAgICAgICBVaUVsZW1lbnROb2RlIGFwcGxpY2F0aW9uID0gdWlfY2hpbGRfaXQubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgYXBwbGljYXRpb24uZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBhcHBsaWNhdGlvbi5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFwcGxpY2F0aW9uLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEZyb21fTmV3VHJlZV8yX05vZGVzKCkgewotICAgICAgICBNb2NrWG1sTm9kZSByb290ID0gbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAibWFuaWZlc3QiLCBOb2RlLkVMRU1FTlRfTk9ERSwKLSAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZVtdIHsKLSAgICAgICAgICAgICAgICBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJhcHBsaWNhdGlvbiIsIE5vZGUuRUxFTUVOVF9OT0RFLCBudWxsKSwKLSAgICAgICAgICAgICAgICBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJwZXJtaXNzaW9uIiwgTm9kZS5FTEVNRU5UX05PREUsIG51bGwpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgL21hbmlmZXN0Ci0gICAgICAgIHVpLmxvYWRGcm9tWG1sTm9kZShyb290KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYW5pZmVzdCIsIHVpLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdWkuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1aS5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCkpOwotCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QvYXBwbGljYXRpb24KLSAgICAgICAgSXRlcmF0b3I8VWlFbGVtZW50Tm9kZT4gdWlfY2hpbGRfaXQgPSB1aS5nZXRVaUNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBhcHBsaWNhdGlvbiA9IHVpX2NoaWxkX2l0Lm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIGFwcGxpY2F0aW9uLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXBwbGljYXRpb24uZ2V0VWlDaGlsZHJlbigpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBhcHBsaWNhdGlvbi5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCkpOwotCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QvcGVybWlzc2lvbgotICAgICAgICBVaUVsZW1lbnROb2RlIGZpcnN0X3Blcm1pc3Npb24gPSB1aV9jaGlsZF9pdC5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGVybWlzc2lvbiIsIGZpcnN0X3Blcm1pc3Npb24uZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBmaXJzdF9wZXJtaXNzaW9uLmdldFVpQ2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmlyc3RfcGVybWlzc2lvbi5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkRnJvbV9OZXdUcmVlX05fTm9kZXMoKSB7Ci0gICAgICAgIE1vY2tYbWxOb2RlIHJvb3QgPSBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJtYW5pZmVzdCIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlW10gewotICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZShudWxsIC8qIG5hbWVzcGFjZSAqLywgImFwcGxpY2F0aW9uIiwgTm9kZS5FTEVNRU5UX05PREUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZShudWxsIC8qIG5hbWVzcGFjZSAqLywgImFjdGl2aXR5IiwgTm9kZS5FTEVNRU5UX05PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJhY3Rpdml0eSIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrWG1sTm9kZVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAiaW50ZW50LWZpbHRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5FTEVNRU5UX05PREUsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAicHJvdmlkZXIiLCBOb2RlLkVMRU1FTlRfTk9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja1htbE5vZGUobnVsbCAvKiBuYW1lc3BhY2UgKi8sICJwcm92aWRlciIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSwKLSAgICAgICAgICAgICAgICAgICAgfSksCi0gICAgICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAicGVybWlzc2lvbiIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCi0gICAgICAgICAgICAgICAgbmV3IE1vY2tYbWxOb2RlKG51bGwgLyogbmFtZXNwYWNlICovLCAicGVybWlzc2lvbiIsIE5vZGUuRUxFTUVOVF9OT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QKLSAgICAgICAgdWkubG9hZEZyb21YbWxOb2RlKHJvb3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbmlmZXN0IiwgdWkuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCB1aS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVpLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IC9tYW5pZmVzdC9hcHBsaWNhdGlvbgotICAgICAgICBJdGVyYXRvcjxVaUVsZW1lbnROb2RlPiB1aV9jaGlsZF9pdCA9IHVpLmdldFVpQ2hpbGRyZW4oKS5pdGVyYXRvcigpOwotICAgICAgICBVaUVsZW1lbnROb2RlIGFwcGxpY2F0aW9uID0gdWlfY2hpbGRfaXQubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgYXBwbGljYXRpb24uZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBhcHBsaWNhdGlvbi5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFwcGxpY2F0aW9uLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IC9tYW5pZmVzdC9hcHBsaWNhdGlvbi9hY3Rpdml0eSAjMQotICAgICAgICBJdGVyYXRvcjxVaUVsZW1lbnROb2RlPiBhcHBfY2hpbGRfaXQgPSBhcHBsaWNhdGlvbi5nZXRVaUNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBmaXJzdF9hY3Rpdml0eSA9IGFwcF9jaGlsZF9pdC5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWN0aXZpdHkiLCBmaXJzdF9hY3Rpdml0eS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZpcnN0X2FjdGl2aXR5LmdldFVpQ2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmlyc3RfYWN0aXZpdHkuZ2V0VWlBdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICAvLyBnZXQgL21hbmlmZXN0L2FwcGxpY2F0aW9uL2FjdGl2aXR5ICMyCi0gICAgICAgIFVpRWxlbWVudE5vZGUgc2Vjb25kX2FjdGl2aXR5ID0gYXBwX2NoaWxkX2l0Lm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhY3Rpdml0eSIsIHNlY29uZF9hY3Rpdml0eS5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlY29uZF9hY3Rpdml0eS5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlY29uZF9hY3Rpdml0eS5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCkpOwotCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QvYXBwbGljYXRpb24vYWN0aXZpdHkgIzIvaW50ZW50LWZpbHRlciAjMQotICAgICAgICBJdGVyYXRvcjxVaUVsZW1lbnROb2RlPiBhY3Rpdml0eV9jaGlsZF9pdCA9IHNlY29uZF9hY3Rpdml0eS5nZXRVaUNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVWlFbGVtZW50Tm9kZSBpbnRlbnRfZmlsdGVyID0gYWN0aXZpdHlfY2hpbGRfaXQubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludGVudC1maWx0ZXIiLCBpbnRlbnRfZmlsdGVyLmdldERlc2NyaXB0b3IoKS5nZXRYbWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW50ZW50X2ZpbHRlci5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGludGVudF9maWx0ZXIuZ2V0VWlBdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICAvLyBnZXQgL21hbmlmZXN0L2FwcGxpY2F0aW9uL3Byb3ZpZGVyICMxCi0gICAgICAgIFVpRWxlbWVudE5vZGUgZmlyc3RfcHJvdmlkZXIgPSBhcHBfY2hpbGRfaXQubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInByb3ZpZGVyIiwgZmlyc3RfcHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBmaXJzdF9wcm92aWRlci5nZXRVaUNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZpcnN0X3Byb3ZpZGVyLmdldFVpQXR0cmlidXRlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IC9tYW5pZmVzdC9hcHBsaWNhdGlvbi9wcm92aWRlciAjMgotICAgICAgICBVaUVsZW1lbnROb2RlIHNlY29uZF9wcm92aWRlciA9IGFwcF9jaGlsZF9pdC5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvdmlkZXIiLCBzZWNvbmRfcHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzZWNvbmRfcHJvdmlkZXIuZ2V0VWlDaGlsZHJlbigpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzZWNvbmRfcHJvdmlkZXIuZ2V0VWlBdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QvcGVybWlzc2lvbiAjMQotICAgICAgICBVaUVsZW1lbnROb2RlIGZpcnN0X3Blcm1pc3Npb24gPSB1aV9jaGlsZF9pdC5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGVybWlzc2lvbiIsIGZpcnN0X3Blcm1pc3Npb24uZ2V0RGVzY3JpcHRvcigpLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBmaXJzdF9wZXJtaXNzaW9uLmdldFVpQ2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmlyc3RfcGVybWlzc2lvbi5nZXRVaUF0dHJpYnV0ZXMoKS5zaXplKCkpOwotCi0gICAgICAgIC8vIGdldCAvbWFuaWZlc3QvcGVybWlzc2lvbiAjMQotICAgICAgICBVaUVsZW1lbnROb2RlIHNlY29uZF9wZXJtaXNzaW9uID0gdWlfY2hpbGRfaXQubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBlcm1pc3Npb24iLCBzZWNvbmRfcGVybWlzc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlY29uZF9wZXJtaXNzaW9uLmdldFVpQ2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2Vjb25kX3Blcm1pc3Npb24uZ2V0VWlBdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21vY2svTW9ja05hbWVkTm9kZU1hcC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tb2NrL01vY2tOYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNWIyYS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21vY2svTW9ja05hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubW9jazsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IHN1bi5yZWZsZWN0LmdlbmVyaWNzLnJlZmxlY3RpdmVPYmplY3RzLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotY2xhc3MgTW9ja05hbWVkTm9kZU1hcCBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0gICAgCi0gICAgLyoqIG1hcCBmb3IgYWNjZXNzIGJ5IG5hbWVzcGFjZS9uYW1lICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSGFzaE1hcDxTdHJpbmcsIE5vZGU+PiBtTm9kZU1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgSGFzaE1hcDxTdHJpbmcsIE5vZGU+PigpOwotICAgIAotICAgIC8qKiBsaXN0IGZvciBhY2Nlc3MgYnkgaW5kZXggKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxOb2RlPiBtTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0gICAgIAotICAgIHB1YmxpYyBNb2NrWG1sTm9kZSBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE1vY2tYbWxOb2RlIG5vZGUgPSBuZXcgTW9ja1htbE5vZGUobmFtZXNwYWNlLCBsb2NhbE5hbWUsIHZhbHVlKTsKLQotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOyAvLyBubyBuYW1lc3BhY2UKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBtYXAgZm9yIHRoZSBuYW1lc3BhY2UKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE5vZGU+IG1hcCA9IG1Ob2RlTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTm9kZT4oKTsKLSAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChuYW1lc3BhY2UsIG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBtYXAucHV0KGxvY2FsTmFtZSwgbm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdC5hZGQobm9kZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tIE5hbWVkTm9kZU1hcCAtLS0tLS0tCi0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ob2RlTGlzdC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBOb2RlPiBtYXAgPSBtTm9kZU1hcC5nZXQoIiIpOyAvLyBubyBuYW1lc3BhY2UKLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmdldChuYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gIiI7IC8vbm8gbmFtZXNwYWNlCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBOb2RlPiBtYXAgPSBtTm9kZU1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmdldChsb2NhbE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gbU5vZGVMaXN0LmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbU5TKE5vZGUgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21vY2svTW9ja05vZGVMaXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21vY2svTW9ja05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjE5OTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9tb2NrL01vY2tOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5tb2NrOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotLyoqCi0gKiBBIHF1aWNrIG1vY2sgaW1wbGVtZW50YXRpb24gb2YgTm9kZUxpc3Qgb24gdG9wIG9mIEFycmF5TGlzdC4KLSAqLwotcHVibGljIGNsYXNzIE1vY2tOb2RlTGlzdCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotICAgIEFycmF5TGlzdDxNb2NrWG1sTm9kZT4gbUNoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGEgbm9kZSBsaXN0IGZyb20gYSBnaXZlbiBjaGlsZHJlbiBsaXN0LgotICAgICogCi0gICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIGxpc3QuIENhbiBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNb2NrTm9kZUxpc3QoTW9ja1htbE5vZGVbXSBjaGlsZHJlbikgewotICAgICAgICBtQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE1vY2tYbWxOb2RlPigpOwotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNb2NrWG1sTm9kZSBuIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRyZW4uYWRkKG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBtQ2hpbGRyZW4uc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbUNoaWxkcmVuLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1DaGlsZHJlbi5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8TW9ja1htbE5vZGU+IGdldEFycmF5TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1DaGlsZHJlbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL21vY2svTW9ja1htbE5vZGUuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbW9jay9Nb2NrWG1sTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ3NTQzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvbW9jay9Nb2NrWG1sTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMubW9jazsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IHN1bi5yZWZsZWN0LmdlbmVyaWNzLnJlZmxlY3RpdmVPYmplY3RzLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBtb2NrIFhNTCBub2RlIHdpdGggb25seSBhIG1pbmltYWwgc2V0IG9mIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTW9ja1htbE5vZGUgaW1wbGVtZW50cyBOb2RlIHsKLSAgIAotICAgIE1vY2tOb2RlTGlzdCBtTm9kZUxpc3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxvY2FsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZXNwYWNlOwotICAgIHByaXZhdGUgc2hvcnQgbU5vZGVUeXBlOwotICAgIHByaXZhdGUgTW9ja1htbE5vZGUgbVBhcmVudDsKLSAgICBwcml2YXRlIE1vY2tYbWxOb2RlIG1QcmV2aW91c1NpYmxpbmc7Ci0gICAgcHJpdmF0ZSBNb2NrWG1sTm9kZSBtTmV4dFNpYmxpbmc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUF0dHJWYWx1ZTsKLSAgICBwcml2YXRlIE1vY2tOYW1lZE5vZGVNYXAgbUF0dHJpYnV0ZXM7Ci0gICAgCi0gICAgLy8gbmFtZXNwYWNlIHN0dWZmIG9ubHkgc2V0IGluIHRoZSByb290IG5vZGUKLSAgICAvKiogbWFwIGZyb20gbmFtZXNwYWNlIHRvIHByZWZpeC4gKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1Oc01hcCA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5vZGUgZnJvbSBhIGdpdmVuIGNoaWxkcmVuIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBub2RlIG9yIG51bGwgaWYgbm9uZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIFhNTCBsb2NhbCBub2RlIG5hbWUuCi0gICAgICogQHBhcmFtIG5vZGVfdHlwZSBPbmUgb2YgTm9kZS54eHhfTk9ERSBjb25zdGFudHMsIGUuZy4gTm9kZS5FTEVNRU5UX05PREUKLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIGxpc3QuIENhbiBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNb2NrWG1sTm9kZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lLCBzaG9ydCBub2RlX3R5cGUsCi0gICAgICAgICAgICBNb2NrWG1sTm9kZVtdIGNoaWxkcmVuKSB7Ci0gICAgICAgIG1Mb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgICAgIG1OYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIG1Ob2RlVHlwZSA9IG5vZGVfdHlwZTsKLSAgICAgICAgbU5vZGVMaXN0ID0gbmV3IE1vY2tOb2RlTGlzdChjaGlsZHJlbik7Ci0gICAgICAgIGZpeE5hdmlnYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGF0dHJpYnV0ZSBub2RlCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBub2RlIG9yIG51bGwgaWYgbm9uZQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIFhNTCBsb2NhbCBub2RlIG5hbWUuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIE1vY2tYbWxOb2RlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtTG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICBtTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICBtQXR0clZhbHVlID0gdmFsdWU7Ci0gICAgICAgIG1Ob2RlVHlwZSA9IE5vZGUuQVRUUklCVVRFX05PREU7Ci0gICAgICAgIG1Ob2RlTGlzdCA9IG5ldyBNb2NrTm9kZUxpc3QobmV3IE1vY2tYbWxOb2RlWzBdKTsKLSAgICAgICAgZml4TmF2aWdhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXhOYXZpZ2F0aW9uKCkgewotICAgICAgICBNb2NrWG1sTm9kZSBwcmV2ID0gbnVsbDsKLSAgICAgICAgZm9yIChNb2NrWG1sTm9kZSBuIDogbU5vZGVMaXN0LmdldEFycmF5TGlzdCgpKSB7Ci0gICAgICAgICAgICBuLm1QYXJlbnQgPSB0aGlzOwotICAgICAgICAgICAgbi5tUHJldmlvdXNTaWJsaW5nID0gcHJldjsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmV2Lm1OZXh0U2libGluZyA9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuLmZpeE5hdmlnYXRpb24oKTsKLSAgICAgICAgICAgIHByZXYgPSBuOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBNb2NrTmFtZWROb2RlTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1vY2tYbWxOb2RlIG5vZGUgPSBtQXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHZhbHVlKTsKLSAgICAgICAgbm9kZS5tUGFyZW50ID0gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgaWYgKG1Oc01hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Oc01hcC5wdXQobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIGlmIChtTnNNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1Oc01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1QYXJlbnQuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0gTm9kZSBtZXRob2RzCi0KLSAgICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgbU5vZGVMaXN0LmdldEFycmF5TGlzdCgpLmFkZCgoTW9ja1htbE5vZGUpIG5ld0NoaWxkKTsKLSAgICAgICAgcmV0dXJuIG5ld0NoaWxkOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1BdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotICAgICAgICByZXR1cm4gbU5vZGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIGlmIChtTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICBpZiAobU5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob2RlTGlzdC5pdGVtKG1Ob2RlTGlzdC5nZXRMZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gbU5leHRTaWJsaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTG9jYWxOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbU5vZGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1QcmV2aW91c1NpYmxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Ob2RlTGlzdC5nZXRMZW5ndGgoKSA+IDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgLy9yZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbUF0dHJWYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcmVmaXgoZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gbU5hbWVzcGFjZTsKLSAgICB9Ci0KLQotICAgIC8vIC0tLSBtZXRob2RzIG5vdCBpbXBsZW1lbnRlZCAtLS0KLSAgICAKLSAgICBwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkKLSAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKQotICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLAotICAgICAgICAgICAgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvQ291bnRyeUNvZGVRdWFsaWZpZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Db3VudHJ5Q29kZVF1YWxpZmllclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmZTAxMy4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9Db3VudHJ5Q29kZVF1YWxpZmllclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Db3VudHJ5Q29kZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb3VudHJ5Q29kZVF1YWxpZmllclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIENvdW50cnlDb2RlUXVhbGlmaWVyIG1jY3E7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1jY3EgPSBuZXcgQ291bnRyeUNvZGVRdWFsaWZpZXIoKTsKLSAgICAgICAgY29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBtY2NxID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRTZXQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBtY2NxLmNoZWNrQW5kU2V0KCJtY2MxMjMiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvdW50cnlDb2RlUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMjMsIGNvbmZpZy5nZXRDb3VudHJ5Q29kZVF1YWxpZmllcigpLmdldENvZGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWNjMTIzIiwgY29uZmlnLmdldENvdW50cnlDb2RlUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbWNjcS5jaGVja0FuZFNldCgiIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1jY3EuY2hlY2tBbmRTZXQoIm1jYyIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtY2NxLmNoZWNrQW5kU2V0KCJNQ0MxMjMiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbWNjcS5jaGVja0FuZFNldCgiMTIzIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1jY3EuY2hlY2tBbmRTZXQoIm1jY3NkZiIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL0tleWJvYXJkU3RhdGVRdWFsaWZpZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9LZXlib2FyZFN0YXRlUXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTUzNzQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL0tleWJvYXJkU3RhdGVRdWFsaWZpZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLktleWJvYXJkU3RhdGVRdWFsaWZpZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgS2V5Ym9hcmRTdGF0ZVF1YWxpZmllciBrc3E7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGtzcSA9IG5ldyBLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAga3NxID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb3NlZCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGtzcS5jaGVja0FuZFNldCgia2V5c2V4cG9zZWQiLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhLZXlib2FyZFN0YXRlUXVhbGlmaWVyLktleWJvYXJkU3RhdGUuRVhQT1NFRCwKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0S2V5Ym9hcmRTdGF0ZVF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImtleXNleHBvc2VkIiwgY29uZmlnLmdldEtleWJvYXJkU3RhdGVRdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWRkZW4oKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBrc3EuY2hlY2tBbmRTZXQoImtleXNoaWRkZW4iLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhLZXlib2FyZFN0YXRlUXVhbGlmaWVyLktleWJvYXJkU3RhdGUuSElEREVOLAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygia2V5c2hpZGRlbiIsIGNvbmZpZy5nZXRLZXlib2FyZFN0YXRlUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwga3NxLmNoZWNrQW5kU2V0KCIiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwga3NxLmNoZWNrQW5kU2V0KCJLRVlTRVhQT1NFRCIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBrc3EuY2hlY2tBbmRTZXQoIm90aGVyIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL0xhbmd1YWdlUXVhbGlmaWVyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTGFuZ3VhZ2VRdWFsaWZpZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTkzMTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvTGFuZ3VhZ2VRdWFsaWZpZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkxhbmd1YWdlUXVhbGlmaWVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTGFuZ3VhZ2VRdWFsaWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0gICAgcHJpdmF0ZSBMYW5ndWFnZVF1YWxpZmllciBscTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBjb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICBscSA9IG5ldyBMYW5ndWFnZVF1YWxpZmllcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGxxID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kU2V0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbHEuY2hlY2tBbmRTZXQoImVuIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0TGFuZ3VhZ2VRdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIGNvbmZpZy5nZXRMYW5ndWFnZVF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbHEuY2hlY2tBbmRTZXQoIiIsIGNvbmZpZykpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbHEuY2hlY2tBbmRTZXQoIkVOIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBscS5jaGVja0FuZFNldCgiYWJjIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05hdmlnYXRpb25NZXRob2RRdWFsaWZpZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9OYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTVkOWVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05hdmlnYXRpb25NZXRob2RRdWFsaWZpZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLk5hdmlnYXRpb25NZXRob2RRdWFsaWZpZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0gICAgcHJpdmF0ZSBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyIG5tcTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIG5tcSA9IG5ldyBOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgbm1xID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERQYWQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBubXEuY2hlY2tBbmRTZXQoImRwYWQiLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXROYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhOYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyLk5hdmlnYXRpb25NZXRob2QuRFBBRCwKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRwYWQiLCBjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYWNrYmFsbCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG5tcS5jaGVja0FuZFNldCgidHJhY2tiYWxsIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5OYXZpZ2F0aW9uTWV0aG9kLlRSQUNLQkFMTCwKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRyYWNrYmFsbCIsIGNvbmZpZy5nZXROYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2hlZWwoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBubXEuY2hlY2tBbmRTZXQoIndoZWVsIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllci5OYXZpZ2F0aW9uTWV0aG9kLldIRUVMLAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXROYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyKCkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygid2hlZWwiLCBjb25maWcuZ2V0TmF2aWdhdGlvbk1ldGhvZFF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG5tcS5jaGVja0FuZFNldCgiIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG5tcS5jaGVja0FuZFNldCgiV0hFRUwiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbm1xLmNoZWNrQW5kU2V0KCJvdGhlciIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9OZXR3b3JrQ29kZVF1YWxpZmllclRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05ldHdvcmtDb2RlUXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTEyMzA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL05ldHdvcmtDb2RlUXVhbGlmaWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5OZXR3b3JrQ29kZVF1YWxpZmllcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE5ldHdvcmtDb2RlUXVhbGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgTmV0d29ya0NvZGVRdWFsaWZpZXIgbW5jcTsKLSAgICBwcml2YXRlIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbW5jcSA9IG5ldyBOZXR3b3JrQ29kZVF1YWxpZmllcigpOwotICAgICAgICBjb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1uY3EgPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFNldCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1uY3EuY2hlY2tBbmRTZXQoIm1uYzEyMyIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0TmV0d29ya0NvZGVRdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgY29uZmlnLmdldE5ldHdvcmtDb2RlUXVhbGlmaWVyKCkuZ2V0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtbmMxMjMiLCBjb25maWcuZ2V0TmV0d29ya0NvZGVRdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtbmNxLmNoZWNrQW5kU2V0KCIiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW5jcS5jaGVja0FuZFNldCgibW5jIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1uY3EuY2hlY2tBbmRTZXQoIk1OQzEyMyIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtbmNxLmNoZWNrQW5kU2V0KCIxMjMiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW5jcS5jaGVja0FuZFNldCgibW5jc2RmIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUGl4ZWxEZW5zaXR5UXVhbGlmaWVyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUGl4ZWxEZW5zaXR5UXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThkNGQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1BpeGVsRGVuc2l0eVF1YWxpZmllclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUGl4ZWxEZW5zaXR5UXVhbGlmaWVyLkRlbnNpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQaXhlbERlbnNpdHlRdWFsaWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBQaXhlbERlbnNpdHlRdWFsaWZpZXIgcGRxOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBwZHEgPSBuZXcgUGl4ZWxEZW5zaXR5UXVhbGlmaWVyKCk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgcGRxID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRTZXQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBwZHEuY2hlY2tBbmRTZXQoImxkcGkiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldFBpeGVsRGVuc2l0eVF1YWxpZmllcigpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRGVuc2l0eS5MT1csIGNvbmZpZy5nZXRQaXhlbERlbnNpdHlRdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZHBpIiwgY29uZmlnLmdldFBpeGVsRGVuc2l0eVF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHBkcS5jaGVja0FuZFNldCgiIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHBkcS5jaGVja0FuZFNldCgiZHBpIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHBkcS5jaGVja0FuZFNldCgiMTIzZHBpIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHBkcS5jaGVja0FuZFNldCgiMTIzIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHBkcS5jaGVja0FuZFNldCgic2RmZHBpIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUmVnaW9uUXVhbGlmaWVyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvUmVnaW9uUXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBhMDRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1JlZ2lvblF1YWxpZmllclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUmVnaW9uUXVhbGlmaWVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmVnaW9uUXVhbGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgUmVnaW9uUXVhbGlmaWVyIHJxOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIHJxID0gbmV3IFJlZ2lvblF1YWxpZmllcigpOwotICAgICAgICBjb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHJxID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRTZXQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBycS5jaGVja0FuZFNldCgiclVTIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRSZWdpb25RdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVUyIsIGNvbmZpZy5nZXRSZWdpb25RdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoInJVUyIsIGNvbmZpZy5nZXRSZWdpb25RdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBycS5jaGVja0FuZFNldCgiIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJxLmNoZWNrQW5kU2V0KCJydXMiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcnEuY2hlY2tBbmRTZXQoInJVU0EiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcnEuY2hlY2tBbmRTZXQoImFiYyIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWZiNzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5EaW1lbnNpb25RdWFsaWZpZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIgc2RxOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBzZHEgPSBuZXcgU2NyZWVuRGltZW5zaW9uUXVhbGlmaWVyKCk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgc2RxID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kU2V0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc2RxLmNoZWNrQW5kU2V0KCI0MDB4MjAwIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRTY3JlZW5EaW1lbnNpb25RdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY29uZmlnLmdldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpLmdldFZhbHVlMSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY29uZmlnLmdldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpLmdldFZhbHVlMigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0MDB4MjAwIiwgY29uZmlnLmdldFNjcmVlbkRpbWVuc2lvblF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzZHEuY2hlY2tBbmRTZXQoIiIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzZHEuY2hlY2tBbmRTZXQoIjQwMFgyMDAiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc2RxLmNoZWNrQW5kU2V0KCJ4MjAwIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHNkcS5jaGVja0FuZFNldCgiYXgyMDAiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc2RxLmNoZWNrQW5kU2V0KCI0MDB4IiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHNkcS5jaGVja0FuZFNldCgiNDAweGEiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc2RxLmNoZWNrQW5kU2V0KCJvdGhlciIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllclRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ5Njg2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1NjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIgc29xOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBzb3EgPSBuZXcgU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKTsKLSAgICAgICAgY29uZmlnID0gbmV3IEZvbGRlckNvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBzb3EgPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3J0cmFpdCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHNvcS5jaGVja0FuZFNldCgicG9ydCIsIGNvbmZpZykpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbi5QT1JUUkFJVCwKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3J0IiwgY29uZmlnLmdldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFuc2NhcGUoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzb3EuY2hlY2tBbmRTZXQoImxhbmQiLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcigpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIuU2NyZWVuT3JpZW50YXRpb24uTEFORFNDQVBFLAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhbmQiLCBjb25maWcuZ2V0U2NyZWVuT3JpZW50YXRpb25RdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTcXVhcmUoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzb3EuY2hlY2tBbmRTZXQoInNxdWFyZSIsIGNvbmZpZykpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbi5TUVVBUkUsCi0gICAgICAgICAgICAgICAgY29uZmlnLmdldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3F1YXJlIiwgY29uZmlnLmdldFNjcmVlbk9yaWVudGF0aW9uUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc29xLmNoZWNrQW5kU2V0KCIiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc29xLmNoZWNrQW5kU2V0KCJQT1JUIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHNvcS5jaGVja0FuZFNldCgibGFuZHNjYXBlIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHNvcS5jaGVja0FuZFNldCgicG9ydHJhaXQiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc29xLmNoZWNrQW5kU2V0KCJvdGhlciIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9UZXh0SW5wdXRNZXRob2RRdWFsaWZpZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9lZGl0b3JzL3Jlc291cmNlcy9jb25maWd1cmF0aW9ucy9UZXh0SW5wdXRNZXRob2RRdWFsaWZpZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzkyOTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuZWRpdG9ycy5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5UZXh0SW5wdXRNZXRob2RRdWFsaWZpZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyIHRpbXE7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRpbXEgPSBuZXcgVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBGb2xkZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgdGltcSA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ0eSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHRpbXEuY2hlY2tBbmRTZXQoInF3ZXJ0eSIsIGNvbmZpZykpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dElucHV0TWV0aG9kUXVhbGlmaWVyLlRleHRJbnB1dE1ldGhvZC5RV0VSVFksCi0gICAgICAgICAgICAgICAgY29uZmlnLmdldFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInF3ZXJ0eSIsIGNvbmZpZy5nZXRUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxMktleSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHRpbXEuY2hlY2tBbmRTZXQoIjEya2V5IiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIuVGV4dElucHV0TWV0aG9kLlRXRUxWRUtFWVMsCi0gICAgICAgICAgICAgICAgY29uZmlnLmdldFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEya2V5IiwgY29uZmlnLmdldFRleHRJbnB1dE1ldGhvZFF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vS2V5KCkgewotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdGltcS5jaGVja0FuZFNldCgibm9rZXlzIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIuVGV4dElucHV0TWV0aG9kLk5PS0VZLAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRUZXh0SW5wdXRNZXRob2RRdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJub2tleXMiLCBjb25maWcuZ2V0VGV4dElucHV0TWV0aG9kUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdGltcS5jaGVja0FuZFNldCgiIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHRpbXEuY2hlY2tBbmRTZXQoIlFXRVJUWSIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aW1xLmNoZWNrQW5kU2V0KCIxMmtleXMiLCBjb25maWcpKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdGltcS5jaGVja0FuZFNldCgiKjEya2V5IiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHRpbXEuY2hlY2tBbmRTZXQoIm90aGVyIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb25zL1RvdWNoU2NyZWVuUXVhbGlmaWVyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVG91Y2hTY3JlZW5RdWFsaWZpZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDc5MzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbnMvVG91Y2hTY3JlZW5RdWFsaWZpZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5jb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuRm9sZGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRvdWNoU2NyZWVuUXVhbGlmaWVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVG91Y2hTY3JlZW5RdWFsaWZpZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBUb3VjaFNjcmVlblF1YWxpZmllciB0c3E7Ci0gICAgcHJpdmF0ZSBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRzcSA9IG5ldyBUb3VjaFNjcmVlblF1YWxpZmllcigpOwotICAgICAgICBjb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHRzcSA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vVG91Y2goKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0c3EuY2hlY2tBbmRTZXQoIm5vdG91Y2giLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRUb3VjaFR5cGVRdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRvdWNoU2NyZWVuUXVhbGlmaWVyLlRvdWNoU2NyZWVuVHlwZS5OT1RPVUNILAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRUb3VjaFR5cGVRdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJub3RvdWNoIiwgY29uZmlnLmdldFRvdWNoVHlwZVF1YWxpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmdlcigpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHRzcS5jaGVja0FuZFNldCgiZmluZ2VyIiwgY29uZmlnKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0VG91Y2hUeXBlUXVhbGlmaWVyKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUb3VjaFNjcmVlblF1YWxpZmllci5Ub3VjaFNjcmVlblR5cGUuRklOR0VSLAotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRUb3VjaFR5cGVRdWFsaWZpZXIoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaW5nZXIiLCBjb25maWcuZ2V0VG91Y2hUeXBlUXVhbGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3R5bHVzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHNxLmNoZWNrQW5kU2V0KCJzdHlsdXMiLCBjb25maWcpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRUb3VjaFR5cGVRdWFsaWZpZXIoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRvdWNoU2NyZWVuUXVhbGlmaWVyLlRvdWNoU2NyZWVuVHlwZS5TVFlMVVMsCi0gICAgICAgICAgICAgICAgY29uZmlnLmdldFRvdWNoVHlwZVF1YWxpZmllcigpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN0eWx1cyIsIGNvbmZpZy5nZXRUb3VjaFR5cGVRdWFsaWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0c3EuY2hlY2tBbmRTZXQoIiIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0c3EuY2hlY2tBbmRTZXQoIlNUWUxVUyIsIGNvbmZpZykpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0c3EuY2hlY2tBbmRTZXQoIm90aGVyIiwgY29uZmlnKSk7Ly8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvbWFuYWdlci9Db25maWdNYXRjaFRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL21hbmFnZXIvQ29uZmlnTWF0Y2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNTMzZWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvbWFuYWdlci9Db25maWdNYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5lZGl0b3JzLnJlc291cmNlcy5tYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Gb2xkZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuY29uZmlndXJhdGlvbnMuUmVzb3VyY2VRdWFsaWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5LZXlib2FyZFN0YXRlUXVhbGlmaWVyLktleWJvYXJkU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5OYXZpZ2F0aW9uTWV0aG9kUXVhbGlmaWVyLk5hdmlnYXRpb25NZXRob2Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5TY3JlZW5PcmllbnRhdGlvblF1YWxpZmllci5TY3JlZW5PcmllbnRhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLlRleHRJbnB1dE1ldGhvZFF1YWxpZmllci5UZXh0SW5wdXRNZXRob2Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5Ub3VjaFNjcmVlblF1YWxpZmllci5Ub3VjaFNjcmVlblR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlByb2plY3RSZXNvdXJjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VGb2xkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLlJlc291cmNlRm9sZGVyVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5TaW5nbGVSZXNvdXJjZUZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5tYW5hZ2VyLmZpbGVzLklBYnN0cmFjdEZvbGRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuZmlsZXMuSUZpbGVXcmFwcGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMubWFuYWdlci5maWxlcy5JRm9sZGVyV3JhcHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5tb2NrLkZpbGVNb2NrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLm1vY2suRm9sZGVyTW9jazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdNYXRjaFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSEVEX0ZJTEVOQU1FID0gIm1haW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNDMV9GSUxFTkFNRSA9ICJmb28ueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNDMl9GSUxFTkFNRSA9ICJiYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBQcm9qZWN0UmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZVF1YWxpZmllcltdIG1RdWFsaWZpZXJMaXN0OwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWc0OwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWczOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcyOwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcxOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBSZXNvdXJjZSBNYW5hZ2VyIHRvIGdldCBhIGxpc3Qgb2YgcXVhbGlmaWVyIGFzIGluc3RhbnRpYXRlZCBieSB0aGUgcmVhbCBjb2RlLgotICAgICAgICAvLyBUaGFua3MgZm9yIFF1YWxpZmllckxpc3RUZXN0IHdlIGtub3cgdGhpcyBjb250YWlucyBhbGwgdGhlIHF1YWxpZmllcnMuCi0gICAgICAgIFJlc291cmNlTWFuYWdlciBtYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpZWxkIHF1YWxpZmllckxpc3RGaWVsZCA9IFJlc291cmNlTWFuYWdlci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJtUXVhbGlmaWVycyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1YWxpZmllckxpc3RGaWVsZCk7Ci0gICAgICAgIHF1YWxpZmllckxpc3RGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCi0gICAgICAgIC8vIGdldCB0aGUgYWN0dWFsIGxpc3QuCi0gICAgICAgIG1RdWFsaWZpZXJMaXN0ID0gKFJlc291cmNlUXVhbGlmaWVyW10pcXVhbGlmaWVyTGlzdEZpZWxkLmdldChtYW5hZ2VyKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHByb2plY3QgcmVzb3VyY2VzLgotICAgICAgICBtUmVzb3VyY2VzID0gbmV3IFByb2plY3RSZXNvdXJjZXMoZmFsc2UgLyogaXNGcmFtZXdvcmtSZXBvc2l0b3J5ICovKTsKLQotICAgICAgICAvLyBjcmVhdGUgMiBhcnJheXMgb2YgSVJlc291cmNlLiBvbmUgd2l0aCB0aGUgZmlsZW5hbWUgYmVpbmcgbG9va2VkIHVwLCBhbmQgb25lIHdpdGhvdXQuCi0gICAgICAgIC8vIFNpbmNlIHRoZSByZXF1aXJlZCBBUEkgdXNlcyBJUmVzb3VyY2UsIHdlIGNhbiB1c2UgTW9ja0ZvbGRlciBmb3IgdGhlbS4KLSAgICAgICAgRmlsZU1vY2tbXSB2YWxpZE1lbWJlckxpc3QgPSBuZXcgRmlsZU1vY2tbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGVNb2NrKE1JU0MxX0ZJTEVOQU1FKSwKLSAgICAgICAgICAgICAgICBuZXcgRmlsZU1vY2soU0VBUkNIRURfRklMRU5BTUUpLAotICAgICAgICAgICAgICAgIG5ldyBGaWxlTW9jayhNSVNDMl9GSUxFTkFNRSksCi0gICAgICAgIH07Ci0gICAgICAgIEZpbGVNb2NrW10gaW52YWxpZE1lbWJlckxpc3QgPSBuZXcgRmlsZU1vY2tbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGVNb2NrKE1JU0MxX0ZJTEVOQU1FKSwKLSAgICAgICAgICAgICAgICBuZXcgRmlsZU1vY2soTUlTQzJfRklMRU5BTUUpLAotICAgICAgICB9OwotCi0gICAgICAgIC8vIGFkZCBtdWx0aXBsZSBSZXNvdXJjZUZvbGRlciB0byB0aGUgcHJvamVjdCByZXNvdXJjZS4KLSAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBjb3VudHJ5IGNvZGUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBuZXR3b3JrIGNvZGUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBsYW5ndWFnZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIHJlZ2lvbgotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNjcmVlbiBzaXplCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gc2NyZWVuIHJhdGlvCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gZHBpCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gdG91Y2ggbW9kZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIGtleWJvYXJkIHN0YXRlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gdGV4dCBpbnB1dAotICAgICAgICAgICAgICAgIG51bGwsIC8vIG5hdmlnYXRpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gZGltZW5zaW9uCi0gICAgICAgICAgICAgICAgbnVsbCk7Ly8gdmVyc2lvbgotCi0gICAgICAgIGFkZEZvbGRlcihtUmVzb3VyY2VzLCBkZWZhdWx0Q29uZmlnLCB2YWxpZE1lbWJlckxpc3QpOwotCi0gICAgICAgIGNvbmZpZzEgPSBnZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGNvdW50cnkgY29kZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIG5ldHdvcmsgY29kZQotICAgICAgICAgICAgICAgICJlbiIsIC8vIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gcmVnaW9uCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gc2NyZWVuIHNpemUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gcmF0aW8KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gb3JpZW50YXRpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBkcGkKLSAgICAgICAgICAgICAgICBudWxsLCAvLyB0b3VjaCBtb2RlCi0gICAgICAgICAgICAgICAgS2V5Ym9hcmRTdGF0ZS5FWFBPU0VELmdldFZhbHVlKCksIC8vIGtleWJvYXJkIHN0YXRlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gdGV4dCBpbnB1dAotICAgICAgICAgICAgICAgIG51bGwsIC8vIG5hdmlnYXRpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gZGltZW5zaW9uCi0gICAgICAgICAgICAgICAgbnVsbCk7Ly8gdmVyc2lvbgotCi0gICAgICAgIGFkZEZvbGRlcihtUmVzb3VyY2VzLCBjb25maWcxLCB2YWxpZE1lbWJlckxpc3QpOwotCi0gICAgICAgIGNvbmZpZzIgPSBnZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIG51bGwsIC8vIGNvdW50cnkgY29kZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIG5ldHdvcmsgY29kZQotICAgICAgICAgICAgICAgICJlbiIsIC8vIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gcmVnaW9uCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gc2NyZWVuIHNpemUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gcmF0aW8KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gb3JpZW50YXRpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBkcGkKLSAgICAgICAgICAgICAgICBudWxsLCAvLyB0b3VjaCBtb2RlCi0gICAgICAgICAgICAgICAgS2V5Ym9hcmRTdGF0ZS5ISURERU4uZ2V0VmFsdWUoKSwgLy8ga2V5Ym9hcmQgc3RhdGUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyB0ZXh0IGlucHV0Ci0gICAgICAgICAgICAgICAgbnVsbCwgLy8gbmF2aWdhdGlvbgotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNjcmVlbiBkaW1lbnNpb24KLSAgICAgICAgICAgICAgICBudWxsKTsvLyB2ZXJzaW9uCi0KLSAgICAgICAgYWRkRm9sZGVyKG1SZXNvdXJjZXMsIGNvbmZpZzIsIHZhbGlkTWVtYmVyTGlzdCk7Ci0KLSAgICAgICAgY29uZmlnMyA9IGdldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gY291bnRyeSBjb2RlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8gbmV0d29yayBjb2RlCi0gICAgICAgICAgICAgICAgImVuIiwgLy8gbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBudWxsLCAvLyByZWdpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBzY3JlZW4gc2l6ZQotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNjcmVlbiByYXRpbwotICAgICAgICAgICAgICAgIFNjcmVlbk9yaWVudGF0aW9uLkxBTkRTQ0FQRS5nZXRWYWx1ZSgpLCAvLyBzY3JlZW4gb3JpZW50YXRpb24KLSAgICAgICAgICAgICAgICBudWxsLCAvLyBkcGkKLSAgICAgICAgICAgICAgICBudWxsLCAvLyB0b3VjaCBtb2RlCi0gICAgICAgICAgICAgICAgbnVsbCwgLy8ga2V5Ym9hcmQgc3RhdGUKLSAgICAgICAgICAgICAgICBudWxsLCAvLyB0ZXh0IGlucHV0Ci0gICAgICAgICAgICAgICAgbnVsbCwgLy8gbmF2aWdhdGlvbgotICAgICAgICAgICAgICAgIG51bGwsIC8vIHNjcmVlbiBkaW1lbnNpb24KLSAgICAgICAgICAgICAgICBudWxsKTsvLyB2ZXJzaW9uCi0KLSAgICAgICAgYWRkRm9sZGVyKG1SZXNvdXJjZXMsIGNvbmZpZzMsIHZhbGlkTWVtYmVyTGlzdCk7Ci0KLSAgICAgICAgY29uZmlnNCA9IGdldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgIm1jYzMxMCIsIC8vIGNvdW50cnkgY29kZQotICAgICAgICAgICAgICAgICJtbmM0MzUiLCAvLyBuZXR3b3JrIGNvZGUKLSAgICAgICAgICAgICAgICAiZW4iLCAvLyBsYW5ndWFnZQotICAgICAgICAgICAgICAgICJyVVMiLCAvLyByZWdpb24KLSAgICAgICAgICAgICAgICAibm9ybWFsIiwgLy8gc2NyZWVuIHNpemUKLSAgICAgICAgICAgICAgICAibm90bG9uZyIsIC8vIHNjcmVlbiByYXRpbwotICAgICAgICAgICAgICAgIFNjcmVlbk9yaWVudGF0aW9uLkxBTkRTQ0FQRS5nZXRWYWx1ZSgpLCAvLyBzY3JlZW4gb3JpZW50YXRpb24KLSAgICAgICAgICAgICAgICAibWRwaSIsIC8vIGRwaQotICAgICAgICAgICAgICAgIFRvdWNoU2NyZWVuVHlwZS5GSU5HRVIuZ2V0VmFsdWUoKSwgLy8gdG91Y2ggbW9kZQotICAgICAgICAgICAgICAgIEtleWJvYXJkU3RhdGUuRVhQT1NFRC5nZXRWYWx1ZSgpLCAvLyBrZXlib2FyZCBzdGF0ZQotICAgICAgICAgICAgICAgIFRleHRJbnB1dE1ldGhvZC5RV0VSVFkuZ2V0VmFsdWUoKSwgLy8gdGV4dCBpbnB1dAotICAgICAgICAgICAgICAgIE5hdmlnYXRpb25NZXRob2QuRFBBRC5nZXRWYWx1ZSgpLCAvLyBuYXZpZ2F0aW9uCi0gICAgICAgICAgICAgICAgIjQ4MHgzMjAiLCAvLyBzY3JlZW4gZGltZW5zaW9uCi0gICAgICAgICAgICAgICAgInYzIik7IC8vIHZlcnNpb24KLQotICAgICAgICBhZGRGb2xkZXIobVJlc291cmNlcywgY29uZmlnNCwgaW52YWxpZE1lbWJlckxpc3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICBGb2xkZXJDb25maWd1cmF0aW9uIHRlc3RDb25maWcgPSBnZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICJtY2MzMTAiLCAvLyBjb3VudHJ5IGNvZGUKLSAgICAgICAgICAgICAgICAibW5jNDM1IiwgLy8gbmV0d29yayBjb2RlCi0gICAgICAgICAgICAgICAgImVuIiwgLy8gbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAiclVTIiwgLy8gcmVnaW9uCi0gICAgICAgICAgICAgICAgIm5vcm1hbCIsIC8vIHNjcmVlbiBzaXplCi0gICAgICAgICAgICAgICAgIm5vdGxvbmciLCAvLyBzY3JlZW4gcmF0aW8KLSAgICAgICAgICAgICAgICBTY3JlZW5PcmllbnRhdGlvbi5MQU5EU0NBUEUuZ2V0VmFsdWUoKSwgLy8gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICAgICAgICAgICAgIm1kcGkiLCAvLyBkcGkKLSAgICAgICAgICAgICAgICBUb3VjaFNjcmVlblR5cGUuRklOR0VSLmdldFZhbHVlKCksIC8vIHRvdWNoIG1vZGUKLSAgICAgICAgICAgICAgICBLZXlib2FyZFN0YXRlLkVYUE9TRUQuZ2V0VmFsdWUoKSwgLy8ga2V5Ym9hcmQgc3RhdGUKLSAgICAgICAgICAgICAgICBUZXh0SW5wdXRNZXRob2QuUVdFUlRZLmdldFZhbHVlKCksIC8vIHRleHQgaW5wdXQKLSAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uTWV0aG9kLkRQQUQuZ2V0VmFsdWUoKSwgLy8gbmF2aWdhdGlvbgotICAgICAgICAgICAgICAgICI0ODB4MzIwIiwgLy8gc2NyZWVuIGRpbWVuc2lvbgotICAgICAgICAgICAgICAgICJ2MyIpOyAvLyB2ZXJzaW9uCi0KLSAgICAgICAgUmVzb3VyY2VGaWxlIHJlc3VsdCA9IG1SZXNvdXJjZXMuZ2V0TWF0Y2hpbmdGaWxlKFNFQVJDSEVEX0ZJTEVOQU1FLAotICAgICAgICAgICAgICAgIFJlc291cmNlRm9sZGVyVHlwZS5MQVlPVVQsIHRlc3RDb25maWcpOwotCi0gICAgICAgIGJvb2xlYW4gYnJlc3VsdCA9IHJlc3VsdC5nZXRGb2xkZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZXF1YWxzKGNvbmZpZzMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYnJlc3VsdCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVyVmFsdWVzIFRoZSBsaXN0IG9mIHF1YWxpZmllciB2YWx1ZXMuIFRoZSBsZW5ndGggbXVzdCBlcXVhbHMgdGhlIHRvdGFsIG51bWJlcgotICAgICAqIG9mIFF1YWxpZmllcnMuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBlcm1pdHRlZCBhbmQgd2lsbCBtYWtlIHRoZSBGb2xkZXJDb25maWd1cmF0aW9uIG5vdCB1c2UKLSAgICAgKiB0aGlzIHBhcnRpY3VsYXIgcXVhbGlmaWVyLgotICAgICAqLwotICAgIHByaXZhdGUgRm9sZGVyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKFN0cmluZy4uLiBxdWFsaWZpZXJWYWx1ZXMpIHsKLSAgICAgICAgRm9sZGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRm9sZGVyQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIHRob3NlIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoCi0gICAgICAgIGFzc2VydEVxdWFscyhxdWFsaWZpZXJWYWx1ZXMubGVuZ3RoLCBtUXVhbGlmaWVyTGlzdC5sZW5ndGgpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgZm9yIChSZXNvdXJjZVF1YWxpZmllciBxdWFsaWZpZXIgOiBtUXVhbGlmaWVyTGlzdCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVhbGlmaWVyVmFsdWVzW2luZGV4KytdOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHF1YWxpZmllci5jaGVja0FuZFNldCh2YWx1ZSwgY29uZmlnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBmb2xkZXIgdG8gdGhlIGdpdmVuIHtAbGluayBQcm9qZWN0UmVzb3VyY2VzfSB3aXRoIHRoZSBnaXZlbgotICAgICAqIHtAbGluayBGb2xkZXJDb25maWd1cmF0aW9ufS4gVGhlIGZvbGRlciBpcyBmaWxsZWQgd2l0aCBmaWxlcyBmcm9tIHRoZSBwcm92aWRlZCBsaXN0LgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHtAbGluayBQcm9qZWN0UmVzb3VyY2VzfSBpbiB3aGljaCB0byBhZGQgdGhlIGZvbGRlci4KLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSB7QGxpbmsgRm9sZGVyQ29uZmlndXJhdGlvbn0gZm9yIHRoZSBjcmVhdGVkIGZvbGRlci4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTGlzdCB0aGUgbGlzdCBvZiBmaWxlcyBmb3IgdGhlIGZvbGRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkRm9sZGVyKFByb2plY3RSZXNvdXJjZXMgcmVzb3VyY2VzLCBGb2xkZXJDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgICAgIEZpbGVNb2NrW10gbWVtYmVyTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgZm9sZGVyIG5hbWUgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgU3RyaW5nIGZvbGRlck5hbWUgPSBjb25maWcuZ2V0Rm9sZGVyTmFtZShSZXNvdXJjZUZvbGRlclR5cGUuTEFZT1VULCAoSUFuZHJvaWRUYXJnZXQpbnVsbCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBmb2xkZXIgbW9jawotICAgICAgICBGb2xkZXJNb2NrIGZvbGRlciA9IG5ldyBGb2xkZXJNb2NrKGZvbGRlck5hbWUsIG1lbWJlckxpc3QpOwotCi0gICAgICAgIC8vIGFkZCBpdCB0byB0aGUgcmVzb3VyY2UsIGFuZCBnZXQgYmFjayBhIFJlc291cmNlRm9sZGVyIG9iamVjdC4KLSAgICAgICAgUmVzb3VyY2VGb2xkZXIgcmVzRm9sZGVyID0gX2FkZFByb2plY3RSZXNvdXJjZUZvbGRlcihyZXNvdXJjZXMsIGNvbmZpZywgZm9sZGVyKTsKLQotICAgICAgICAvLyBhbmQgZmlsbCBpdCB3aXRoIGZpbGVzIGZyb20gdGhlIGxpc3QuCi0gICAgICAgIGZvciAoRmlsZU1vY2sgZmlsZSA6IG1lbWJlckxpc3QpIHsKLSAgICAgICAgICAgIHJlc0ZvbGRlci5hZGRGaWxlKG5ldyBTaW5nbGVSZXNvdXJjZUZpbGUobmV3IElGaWxlV3JhcHBlcihmaWxlKSwgcmVzRm9sZGVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2FsbHMgUHJvamVjdFJlc291cmNlLmFkZCBtZXRob2QgdmlhIHJlZmxlY3Rpb24gdG8gY2lyY3VtdmVudCBhY2Nlc3MKLSAgICAgKiByZXN0cmljdGlvbnMgdGhhdCBhcmUgZW5mb3JjZWQgd2hlbiBydW5uaW5nIGluIHRoZSBwbHVnLWluIGVudmlyb25tZW50Ci0gICAgICogaWUgY2Fubm90IGFjY2VzcyBwYWNrYWdlIG9yIHByb3RlY3RlZCBtZW1iZXJzIGluIGEgZGlmZmVyZW50IHBsdWctaW4sIGV2ZW4KLSAgICAgKiBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBkZWNsYXJlZCBwYWNrYWdlIGFzIHRoZSBhY2Nlc3NvcgotICAgICAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VGb2xkZXIgX2FkZFByb2plY3RSZXNvdXJjZUZvbGRlcihQcm9qZWN0UmVzb3VyY2VzIHJlc291cmNlcywKLSAgICAgICAgICAgIEZvbGRlckNvbmZpZ3VyYXRpb24gY29uZmlnLCBGb2xkZXJNb2NrIGZvbGRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWV0aG9kIGFkZE1ldGhvZCA9IFByb2plY3RSZXNvdXJjZXMuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImFkZCIsCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlLmNsYXNzLCBGb2xkZXJDb25maWd1cmF0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgIElBYnN0cmFjdEZvbGRlci5jbGFzcyk7Ci0gICAgICAgIGFkZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBSZXNvdXJjZUZvbGRlciByZXNGb2xkZXIgPSAoUmVzb3VyY2VGb2xkZXIpYWRkTWV0aG9kLmludm9rZShyZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VGb2xkZXJUeXBlLkxBWU9VVCwgY29uZmlnLCBuZXcgSUZvbGRlcldyYXBwZXIoZm9sZGVyKSk7Ci0gICAgICAgIHJldHVybiByZXNGb2xkZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvbWFuYWdlci9RdWFsaWZpZXJMaXN0VGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvZWRpdG9ycy9yZXNvdXJjZXMvbWFuYWdlci9RdWFsaWZpZXJMaXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTMyYTAwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL2VkaXRvcnMvcmVzb3VyY2VzL21hbmFnZXIvUXVhbGlmaWVyTGlzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLmVkaXRvcnMucmVzb3VyY2VzLm1hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25zLkZvbGRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5jb25maWd1cmF0aW9ucy5SZXNvdXJjZVF1YWxpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLm1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZXJMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIFJlc291cmNlTWFuYWdlciBtTWFuYWdlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbU1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBtTWFuYWdlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZXJMaXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIHF1YWxpZmllciBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlcgotICAgICAgICAgICAgRmllbGQgcXVhbGlmaWVyTGlzdEZpZWxkID0gUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1RdWFsaWZpZXJzIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHF1YWxpZmllckxpc3RGaWVsZCk7Ci0gICAgICAgICAgICBxdWFsaWZpZXJMaXN0RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBhY3R1YWwgbGlzdC4KLSAgICAgICAgICAgIFJlc291cmNlUXVhbGlmaWVyW10gcXVhbGlmaWVyTGlzdCA9Ci0gICAgICAgICAgICAgICAgKFJlc291cmNlUXVhbGlmaWVyW10pcXVhbGlmaWVyTGlzdEZpZWxkLmdldChtTWFuYWdlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vdyBnZXQgdGhlIG51bWJlciBvZiBxdWFsaWZpZXIgaW4gdGhlIEZvbGRlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIEZpZWxkIHF1YWxDb3VudEZpZWxkID0gRm9sZGVyQ29uZmlndXJhdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJJTkRFWF9DT1VOVCIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWFsQ291bnRGaWVsZCk7Ci0gICAgICAgICAgICBxdWFsQ291bnRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGNvbnN0YW50IHZhbHVlCi0gICAgICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpcXVhbENvdW50RmllbGQuZ2V0KG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBub3cgY29tcGFyZQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LmludFZhbHVlKCksIHF1YWxpZmllckxpc3QubGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvQW5kcm9pZE1hbmlmZXN0UGFyc2VyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTWFuaWZlc3RQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTM5MWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9BbmRyb2lkTWFuaWZlc3RQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5wcm9qZWN0LkFuZHJvaWRNYW5pZmVzdFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5BbmRyb2lkTWFuaWZlc3RQYXJzZXIuQWN0aXZpdHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMuQWR0VGVzdERhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBBbmRyb2lkTWFuaWZlc3RQYXJzZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkTWFuaWZlc3RQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgQW5kcm9pZE1hbmlmZXN0UGFyc2VyIG1NYW5pZmVzdFRlc3RBcHA7Ci0gICAgcHJpdmF0ZSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIgbU1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1REQVRBX1BBVEggPQotICAgICAgICAiY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVFJVTUVOVEFUSU9OX1hNTCA9IFRFU1REQVRBX1BBVEggKwotICAgICAgICAiQW5kcm9pZE1hbmlmZXN0LWluc3RydW1lbnRhdGlvbi54bWwiOyAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUQVBQX1hNTCA9IFRFU1REQVRBX1BBVEggKwotICAgICAgICAiQW5kcm9pZE1hbmlmZXN0LXRlc3RhcHAueG1sIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gICJjb20uYW5kcm9pZC50ZXN0YXBwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9OQU1FID0gImNvbS5hbmRyb2lkLnRlc3RhcHAuTWFpbkFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX05BTUUgPSAiYW5kcm9pZC50ZXN0LnJ1bm5lciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVFJVTUVOVEFUSU9OX05BTUUgPSAiYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSAiY29tLmFuZHJvaWQuQW5kcm9pZFByb2plY3QiOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0RmlsZVBhdGggPSBBZHRUZXN0RGF0YS5nZXRJbnN0YW5jZSgpLmdldFRlc3RGaWxlUGF0aChURVNUQVBQX1hNTCk7Ci0gICAgICAgIG1NYW5pZmVzdFRlc3RBcHAgPSBBbmRyb2lkTWFuaWZlc3RQYXJzZXIucGFyc2VGb3JEYXRhKHRlc3RGaWxlUGF0aCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobU1hbmlmZXN0VGVzdEFwcCk7Ci0KLSAgICAgICAgdGVzdEZpbGVQYXRoID0gQWR0VGVzdERhdGEuZ2V0SW5zdGFuY2UoKS5nZXRUZXN0RmlsZVBhdGgoSU5TVFJVTUVOVEFUSU9OX1hNTCk7Ci0gICAgICAgIG1NYW5pZmVzdEluc3RydW1lbnRhdGlvbiA9IEFuZHJvaWRNYW5pZmVzdFBhcnNlci5wYXJzZUZvckRhdGEodGVzdEZpbGVQYXRoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtTWFuaWZlc3RJbnN0cnVtZW50YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0cnVtZW50YXRpb25JbmZvcm1hdGlvbigpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1NYW5pZmVzdEluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb25zKCkubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElOU1RSVU1FTlRBVElPTl9OQU1FLAotICAgICAgICAgICAgICAgIG1NYW5pZmVzdEluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb25zKClbMF0uZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElOU1RSVU1FTlRBVElPTl9UQVJHRVQsCi0gICAgICAgICAgICAgICAgbU1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbnMoKVswXS5nZXRUYXJnZXRQYWNrYWdlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FLCBtTWFuaWZlc3RUZXN0QXBwLmdldFBhY2thZ2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2aXRpZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTWFuaWZlc3RUZXN0QXBwLmdldEFjdGl2aXRpZXMoKS5sZW5ndGgpOwotICAgICAgICBBbmRyb2lkTWFuaWZlc3RQYXJzZXIuQWN0aXZpdHkgYWN0aXZpdHkgPSBtTWFuaWZlc3RUZXN0QXBwLmdldEFjdGl2aXRpZXMoKVswXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFDVElWSVRZX05BTUUsIGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHkuaGFzQWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5LmlzSG9tZUFjdGl2aXR5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5Lmhhc0FjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGl2aXR5LCBtTWFuaWZlc3RUZXN0QXBwLmdldEFjdGl2aXRpZXMoKVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldExhdW5jaGVyQWN0aXZpdHkoKSB7Ci0gICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU1hbmlmZXN0VGVzdEFwcC5nZXRMYXVuY2hlckFjdGl2aXR5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBQ1RJVklUWV9OQU1FLCBhY3Rpdml0eS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5Lmhhc0FjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eS5pc0hvbWVBY3Rpdml0eSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5IGxocywgQWN0aXZpdHkgcmhzKSB7Ci0gICAgICAgIGFzc2VydFRydWUobGhzID09IHJocyB8fCAobGhzICE9IG51bGwgJiYgcmhzICE9IG51bGwpKTsKLSAgICAgICAgaWYgKGxocyAhPSBudWxsICYmIHJocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobGhzLmdldE5hbWUoKSwgICAgICAgIHJocy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxocy5pc0V4cG9ydGVkKCksICAgICByaHMuaXNFeHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaHMuaGFzQWN0aW9uKCksICAgICAgcmhzLmhhc0FjdGlvbigpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaHMuaXNIb21lQWN0aXZpdHkoKSwgcmhzLmlzSG9tZUFjdGl2aXR5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFVzZXNMaWJyYXJpZXMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTWFuaWZlc3RUZXN0QXBwLmdldFVzZXNMaWJyYXJpZXMoKS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTElCUkFSWV9OQU1FLCBtTWFuaWZlc3RUZXN0QXBwLmdldFVzZXNMaWJyYXJpZXMoKVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FLCBtTWFuaWZlc3RUZXN0QXBwLmdldFBhY2thZ2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0SGVscGVyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0SGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDgwMTAyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Byb2plY3QvUHJvamVjdEhlbHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLm1vY2suQ2xhc3NwYXRoRW50cnlNb2NrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLm1vY2suSmF2YVByb2plY3RNb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRoZSBvbGQgY29udGFpbmVyIGlkICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9MRF9DT05UQUlORVJfSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LnByb2plY3QuQW5kcm9pZENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIFRoZSBjb250YWluZXIgaWQgZm9yIHRoZSBhbmRyb2lkIGZyYW1ld29yayBqYXIgZmlsZSAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LkFORFJPSURfRlJBTUVXT1JLIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBhc3MgZm9yIG5vdwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBhc3MgZm9yIG5vdwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Rml4UHJvamVjdENsYXNzcGF0aEVudHJpZXNGcm9tT2xkQ29udGFpbmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIHByb2plY3Qgd2l0aCBhIHBhdGggdG8gYW4gYW5kcm9pZCAuemlwCi0gICAgICAgIEphdmFQcm9qZWN0TW9jayBqYXZhUHJvamVjdCA9IG5ldyBKYXZhUHJvamVjdE1vY2soCi0gICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc3BhdGhFbnRyeU1vY2sobmV3IFBhdGgoIlByb2plY3Qvc3JjIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzcGF0aEVudHJ5TW9jayhuZXcgUGF0aChPTERfQ09OVEFJTkVSX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IFBhdGgoIlByb2plY3QvYmluIikpOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEhlbHBlci5maXhQcm9qZWN0Q2xhc3NwYXRoRW50cmllcyhqYXZhUHJvamVjdCk7Ci0gICAgICAgIAotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBmaXhlZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGZpeGVkRW50cmllcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb2plY3Qvc3JjIiwgZml4ZWRFbnRyaWVzWzBdLmdldFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE9MRF9DT05UQUlORVJfSUQsIGZpeGVkRW50cmllc1sxXS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfSUQsIGZpeGVkRW50cmllc1syXS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0F0dHJzWG1sUGFyc2VyVGVzdC5qYXZhIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9hZHQvaW50ZXJuYWwvcmVzb3VyY2VzL0F0dHJzWG1sUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWMxNmU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Jlc291cmNlcy9BdHRyc1htbFBhcnNlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5yZXNvdXJjZXMuRGVjbGFyZVN0eWxlYWJsZUluZm8uQXR0cmlidXRlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLkRlY2xhcmVTdHlsZWFibGVJbmZvLkF0dHJpYnV0ZUluZm8uRm9ybWF0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLkFkdFRlc3REYXRhOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEF0dHJzWG1sUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgQXR0cnNYbWxQYXJzZXIgbVBhcnNlcjsKLSAgICBwcml2YXRlIFN0cmluZyBtRmlsZVBhdGg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9DS19EQVRBX1BBVEggPQotICAgICAgICAiY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvbW9ja19hdHRycy54bWwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRmlsZVBhdGggPSBBZHRUZXN0RGF0YS5nZXRJbnN0YW5jZSgpLmdldFRlc3RGaWxlUGF0aChNT0NLX0RBVEFfUEFUSCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbVBhcnNlciA9IG5ldyBBdHRyc1htbFBhcnNlcihtRmlsZVBhdGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldERvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoX2dldERvY3VtZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPc0F0dHJzWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMobUZpbGVQYXRoLCBtUGFyc2VyLmdldE9zQXR0cnNYbWxQYXRoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcmVsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNhbWUobVBhcnNlciwgbVBhcnNlci5wcmVsb2FkKCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdExvYWRWaWV3QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUGFyc2VyLnByZWxvYWQoKTsKLSAgICAgICAgVmlld0NsYXNzSW5mbyBpbmZvID0gbmV3IFZpZXdDbGFzc0luZm8oCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogaXNMYXlvdXQgKi8sCi0gICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5zb21ldGhpbmcuVGhlbWUiLCAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiVGhlbWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtUGFyc2VyLmxvYWRWaWV3QXR0cmlidXRlcyhpbmZvKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgYXR0cmlidXRlcyB0aGF0IG1ha2UgdXAgYSBjb21wbGV0ZSB0aGVtZS4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaW5mby5nZXRKYXZhRG9jKCkpOwotICAgICAgICBBdHRyaWJ1dGVJbmZvW10gYXR0cnMgPSBpbmZvLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF0dHJzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2Nyb2xsYmFyU2l6ZSIsIGluZm8uZ2V0QXR0cmlidXRlcygpWzBdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmZvLmdldEF0dHJpYnV0ZXMoKVswXS5nZXRGb3JtYXRzKCkubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZvcm1hdC5ESU1FTlNJT04sIGluZm8uZ2V0QXR0cmlidXRlcygpWzBdLmdldEZvcm1hdHMoKVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVudW1GbGFnVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qIFRoZSBYTUwgYmVpbmcgcmVhZCBjb250YWluczoKLSAgICAgICAgICAgIDwhLS0gU3RhbmRhcmQgb3JpZW50YXRpb24gY29uc3RhbnQuIC0tPgotICAgICAgICAgICAgPGF0dHIgbmFtZT0ib3JpZW50YXRpb24iPgotICAgICAgICAgICAgICAgIDwhLS0gRGVmaW5lcyBhbiBob3Jpem9udGFsIHdpZGdldC4gLS0+Ci0gICAgICAgICAgICAgICAgPGVudW0gbmFtZT0iaG9yaXpvbnRhbCIgdmFsdWU9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPCEtLSBEZWZpbmVzIGEgdmVydGljYWwgd2lkZ2V0LiAtLT4KLSAgICAgICAgICAgICAgICA8ZW51bSBuYW1lPSJ2ZXJ0aWNhbCIgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICA8L2F0dHI+Ci0gICAgICAgICAqLwotCi0gICAgICAgIG1QYXJzZXIucHJlbG9hZCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gYXR0ck1hcCA9IG1QYXJzZXIuZ2V0RW51bUZsYWdWYWx1ZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhdHRyTWFwLmNvbnRhaW5zS2V5KCJvcmllbnRhdGlvbiIpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiB2YWx1ZU1hcCA9IGF0dHJNYXAuZ2V0KCJvcmllbnRhdGlvbiIpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlTWFwLmNvbnRhaW5zS2V5KCJob3Jpem9udGFsIikpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlTWFwLmNvbnRhaW5zS2V5KCJ2ZXJ0aWNhbCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgdmFsdWVNYXAuZ2V0KCJob3Jpem9udGFsIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCB2YWx1ZU1hcC5nZXQoInZlcnRpY2FsIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3REZXByZWNhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1QYXJzZXIucHJlbG9hZCgpOwotCi0gICAgICAgIERlY2xhcmVTdHlsZWFibGVJbmZvIGRlcCA9IG1QYXJzZXIuZ2V0RGVjbGFyZVN0eWxlYWJsZUxpc3QoKS5nZXQoIkRlcHJlY2F0ZWRUZXN0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVwKTsKLQotICAgICAgICBBdHRyaWJ1dGVJbmZvW10gYXR0cnMgPSBkZXAuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYXR0cnMubGVuZ3RoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImRlcHJlY2F0ZWQtaW5saW5lIiwgYXR0cnNbMF0uZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbi1saW5lIGRlcHJlY2F0ZWQuIiwgYXR0cnNbMF0uZ2V0RGVwcmVjYXRlZERvYygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXByZWNhdGVkIGNvbW1lbnRzIHVzaW5nIGRlbGltaXRlcnMuIiwgYXR0cnNbMF0uZ2V0SmF2YURvYygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImRlcHJlY2F0ZWQtbXVsdGlsaW5lIiwgYXR0cnNbMV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdWx0aS1saW5lIHZlcnNpb24gb2YgZGVwcmVjYXRlZCB0aGF0IHdvcmtzIHRpbGwgdGhlIG5leHQgdGFnLiIsCi0gICAgICAgICAgICAgICAgYXR0cnNbMV0uZ2V0RGVwcmVjYXRlZERvYygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXByZWNhdGVkIGNvbW1lbnRzIG9uIHRoZWlyIG93biBsaW5lLiIsIGF0dHJzWzFdLmdldEphdmFEb2MoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZXByZWNhdGVkLW5vdCIsIGF0dHJzWzJdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhdHRyc1syXS5nZXREZXByZWNhdGVkRG9jKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZXByZWNhdGVkLiIsIGF0dHJzWzJdLmdldEphdmFEb2MoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZXByZWNhdGVkLW5vLWphdmFkb2MiLCBhdHRyc1szXS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZXJlIGlzIG5vIG90aGVyIGphdmFkb2MgaGVyZS4iLCBhdHRyc1szXS5nZXREZXByZWNhdGVkRG9jKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGF0dHJzWzNdLmdldEphdmFEb2MoKSk7Ci0gICAgfQotCi0gICAgLy8tLS0tIGFjY2VzcyB0byBwcml2YXRlIG1ldGhvZHMKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgX2dldERvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBBdHRyc1htbFBhcnNlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIChEb2N1bWVudCkgbWV0aG9kLmludm9rZShtUGFyc2VyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvQW5kcm9pZEphckxvYWRlclRlc3QuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9BbmRyb2lkSmFyTG9hZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTE3OGYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9BbmRyb2lkSmFyTG9hZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC5pbnRlcm5hbC5zZGsuQW5kcm9pZEphckxvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLklBbmRyb2lkQ2xhc3NMb2FkZXIuSUNsYXNzRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5BZHRUZXN0RGF0YTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCBUZXN0IGZvciB7QGxpbmsgQW5kcm9pZEphckxvYWRlcn0uCi0gKiAKLSAqIFVzZXMgdGhlIGNsYXNzZXMgamFyLmV4YW1wbGUuQ2xhc3MxL0NsYXNzMiBzdG9yZWQgaW4gdGVzdHMvZGF0YS9qYXJfZXhhbXBsZS5qYXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkSmFyTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgQW5kcm9pZEphckxvYWRlciBtRnJhbWV3b3JrQ2xhc3NMb2FkZXI7Ci0KLSAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQW5kcm9pZEphckxvYWRlcn0gb24gb3VyIHRlc3QgZGF0YSBKQVIgKi8gCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGphcmZpbGVQYXRoID0gQWR0VGVzdERhdGEuZ2V0SW5zdGFuY2UoKS5nZXRUZXN0RmlsZVBhdGgoCi0gICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL2phcl9leGFtcGxlLmphciIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtRnJhbWV3b3JrQ2xhc3NMb2FkZXIgPSBuZXcgQW5kcm9pZEphckxvYWRlcihqYXJmaWxlUGF0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUZyYW1ld29ya0NsYXNzTG9hZGVyID0gbnVsbDsKLSAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgfQotCi0gICAgLyoqIFByZWxvYWRzIGNsYXNzZXMuIFRoZXkgc2hvdWxkIGxvYWQganVzdCBmaW5lLiAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcmVMb2FkQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRnJhbWV3b3JrQ2xhc3NMb2FkZXIucHJlTG9hZENsYXNzZXMoImphci5leGFtcGxlLiIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4gbWFwID0gZ2V0UHJpdmF0ZUNsYXNzQ2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxieXRlW10+IGRhdGEgPSBnZXRQcml2YXRlRW50cnlDYWNoZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGRhdGEuY29udGFpbnNLZXkoImphci5leGFtcGxlLkNsYXNzMSIpKTsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zS2V5KCJqYXIuZXhhbXBsZS5DbGFzczIiKSk7ICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUoZGF0YS5jb250YWluc0tleSgiamFyLmV4YW1wbGUuQ2xhc3MxJElubmVyU3RhdGljQ2xhc3MxIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGRhdGEuY29udGFpbnNLZXkoImphci5leGFtcGxlLkNsYXNzMSRJbm5lckNsYXNzMiIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGRhdGEuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvKiogUHJlbG9hZHMgYSBjbGFzcyBub3QgaW4gdGhlIEpBUi4gUHJlbG9hZGluZyBkb2VzIG5vdGhpbmcgaW4gdGhpcyBjYXNlLiAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RQcmVMb2FkQ2xhc3Nlc19jbGFzc05vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1GcmFtZXdvcmtDbGFzc0xvYWRlci5wcmVMb2FkQ2xhc3Nlcygibm90LmEucGFja2FnZS4iLCBudWxsLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtYXAgPSBnZXRQcml2YXRlQ2xhc3NDYWNoZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLnNpemUoKSk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLGJ5dGVbXT4gZGF0YSA9IGdldFByaXZhdGVFbnRyeUNhY2hlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBkYXRhLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqIEZpbmRzIGEgY2xhc3Mgd2UganVzdCBwcmVsb2FkZWQuIEl0IHNob3VsZCB3b3JrLiAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RGaW5kQ2xhc3NfY2xhc3NGb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzczw/PiBjID0gX2ZpbmRDbGFzcyhtRnJhbWV3b3JrQ2xhc3NMb2FkZXIsICJqYXIuZXhhbXBsZS5DbGFzczIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXIuZXhhbXBsZS5DbGFzczIiLCBjLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4gbWFwID0gZ2V0UHJpdmF0ZUNsYXNzQ2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImphci5leGFtcGxlLkNsYXNzMSIpKTsgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJqYXIuZXhhbXBsZS5DbGFzczIiKSk7ICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKiBjYWxsIHRoZSBwcm90ZWN0ZWQgbWV0aG9kIGZpbmRDbGFzcyAqLwotICAgIHByaXZhdGUgQ2xhc3M8Pz4gX2ZpbmRDbGFzcyhBbmRyb2lkSmFyTG9hZGVyIGphckxvYWRlciwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgZmluZENsYXNzTWV0aG9kID0gQW5kcm9pZEphckxvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAiZmluZENsYXNzIiwgU3RyaW5nLmNsYXNzKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluZENsYXNzTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzPD8+KWZpbmRDbGFzc01ldGhvZC5pbnZva2UoamFyTG9hZGVyLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIHRocm93IChFeGNlcHRpb24pZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFRyeWluZyB0byBmaW5kIGEgY2xhc3MgdGhhdCB3ZSBmYWlsIHRvIHByZWxvYWQgc2hvdWxkIHRocm93IGEgQ05GRS4gKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RmluZENsYXNzX2NsYXNzTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdpbGwgdGhyb3cgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAgICAgICAgX2ZpbmRDbGFzcyhtRnJhbWV3b3JrQ2xhc3NMb2FkZXIsICJub3QuYS52YWxpZC5DbGFzc05hbWUiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbWVzc2FnZSBpbiB0aGUgQ05GRQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub3QuYS52YWxpZC5DbGFzc05hbWUiLCBlLmdldE1lc3NhZ2UoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRXhjZXB0aW9uIG5vdCB0aHJvd24gLSB0aGlzIGlzIGEgZmFpbHVyZQotICAgICAgICBmYWlsKCJFeHBlY3RlZCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZpbmRDbGFzc2VzRGVyaXZpbmdGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+IGZvdW5kID0KLSAgICAgICAgICAgIG1GcmFtZXdvcmtDbGFzc0xvYWRlci5maW5kQ2xhc3Nlc0Rlcml2aW5nRnJvbSgiamFyLmV4YW1wbGUuIiwgbmV3IFN0cmluZ1tdIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiamFyLmV4YW1wbGUuQ2xhc3MxIiwgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJqYXIuZXhhbXBsZS5DbGFzczIiIH0pOyAgICAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZC5jb250YWluc0tleSgiamFyLmV4YW1wbGUuQ2xhc3MxIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kLmNvbnRhaW5zS2V5KCJqYXIuZXhhbXBsZS5DbGFzczIiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBmb3VuZC5zaXplKCkpOyAgCi0gICAgICAgIC8vIE9ubHkgQ2xhc3MyIGRlcml2ZXMgZnJvbSBDbGFzczEuLgotICAgICAgICAvLyBDbGFzczEgYW5kIENsYXNzMSRJbm5lclN0YXRpY0NsYXNzMSBkZXJpdmUgZnJvbSBPYmplY3QgYW5kIGFyZSB0aHVzIGlnbm9yZWQuCi0gICAgICAgIC8vIENsYXNzMSRJbm5lckNsYXNzMiBzaG91bGQgbmV2ZXIgYmUgc2VlbiBlaXRoZXIuCi0gICAgICAgIGFzc2VydEVxdWFscygiamFyLmV4YW1wbGUuQ2xhc3MyIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmb3VuZC5nZXQoImphci5leGFtcGxlLkNsYXNzMSIpLmdldCgwKS5nZXRDYW5vbmljYWxOYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZm91bmQuZ2V0KCJqYXIuZXhhbXBsZS5DbGFzczEiKS5zaXplKCkpOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZvdW5kLmdldCgiamFyLmV4YW1wbGUuQ2xhc3MyIikuc2l6ZSgpKTsgICAgICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLy8gLS0tIFV0aWxpdGllcyAtLS0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHByaXZhdGUgbUZyYW1ld29ya0NsYXNzTG9hZGVyLm1DbGFzc0NhY2hlIGZpZWxkIHVzaW5nIHJlZmxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiAKLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/PiA+IGdldFByaXZhdGVDbGFzc0NhY2hlKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgRmllbGQgZmllbGQgPSBBbmRyb2lkSmFyTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1DbGFzc0NhY2hlIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiAoSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PikgZmllbGQuZ2V0KG1GcmFtZXdvcmtDbGFzc0xvYWRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBwcml2YXRlIG1GcmFtZXdvcmtDbGFzc0xvYWRlci5tRW50cnlDYWNoZSBmaWVsZCB1c2luZyByZWZsZWN0aW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZyxieXRlW10+IGdldFByaXZhdGVFbnRyeUNhY2hlKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgRmllbGQgZmllbGQgPSBBbmRyb2lkSmFyTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1FbnRyeUNhY2hlIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiAoSGFzaE1hcDxTdHJpbmcsIGJ5dGVbXT4pIGZpZWxkLmdldChtRnJhbWV3b3JrQ2xhc3NMb2FkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXRQYXJhbXNQYXJzZXJUZXN0LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL2FkdC9pbnRlcm5hbC9zZGsvTGF5b3V0UGFyYW1zUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjZiNjNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvYWR0L2ludGVybmFsL3Nkay9MYXlvdXRQYXJhbXNQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5BdHRyc1htbFBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwucmVzb3VyY2VzLlZpZXdDbGFzc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnJlc291cmNlcy5WaWV3Q2xhc3NJbmZvLkxheW91dFBhcmFtc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0LmludGVybmFsLnNkay5BbmRyb2lkSmFyTG9hZGVyLkNsYXNzV3JhcHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuc2RrLklBbmRyb2lkQ2xhc3NMb2FkZXIuSUNsYXNzRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy5BZHRUZXN0RGF0YTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIGlubmVyIHByaXZhdGUgbWV0aG9kcyBvZiBQbGF0Zm9ybURhdGFQYXJzZXIuCi0gKgotICogQ29udmVudGlvbjogbWV0aG9kIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlIGFyZSBhY3R1YWxseSBsb2NhbCB3cmFwcGVycwotICogdGhhdCBjYWxsIHByaXZhdGUgbWV0aG9kcyBmcm9tIHtAbGluayBBbmRyb2lkVGFyZ2V0UGFyc2VyfSB1c2luZyByZWZsZWN0aW9uLgotICogVGhpcyBpcyBpbnNwaXJlZCBieSB0aGUgUHl0aG9uIGNvZGluZyBydWxlIHdoaWNoIG1hbmRhdGVzIHVuZGVyc2NvcmVzIHByZWZpeGVzIGZvcgotICogInByaXZhdGUiIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRQYXJhbXNQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PQ0tfREFUQV9QQVRIID0KLSAgICAgICAgImNvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL21vY2tfYXR0cnMueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0ZyYW1ld29ya0NsYXNzTG9hZGVyIGV4dGVuZHMgQW5kcm9pZEphckxvYWRlciB7Ci0gICAgICAgIE1vY2tGcmFtZXdvcmtDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKG51bGwgLyogb3NGcmFtZXdvcmtMb2NhdGlvbiAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+IGZpbmRDbGFzc2VzRGVyaXZpbmdGcm9tKAotICAgICAgICAgICAgICAgIFN0cmluZyByb290UGFja2FnZSwgU3RyaW5nW10gc3VwZXJDbGFzc2VzKSB0aHJvd3MgQ2xhc3NGb3JtYXRFcnJvciB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrTGF5b3V0UGFyYW1zUGFyc2VyIGV4dGVuZHMgTGF5b3V0UGFyYW1zUGFyc2VyIHsKLSAgICAgICAgcHVibGljIE1vY2tMYXlvdXRQYXJhbXNQYXJzZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgTW9ja0ZyYW1ld29ya0NsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICBuZXcgQXR0cnNYbWxQYXJzZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkdFRlc3REYXRhLmdldEluc3RhbmNlKCkuZ2V0VGVzdEZpbGVQYXRoKE1PQ0tfREFUQV9QQVRIKSkucHJlbG9hZCgpKTsKLQotICAgICAgICAgICAgbVRvcFZpZXdDbGFzcyA9IG5ldyBDbGFzc1dyYXBwZXIobW9ja19hbmRyb2lkLnZpZXcuVmlldy5jbGFzcyk7Ci0gICAgICAgICAgICBtVG9wR3JvdXBDbGFzcyA9IG5ldyBDbGFzc1dyYXBwZXIobW9ja19hbmRyb2lkLnZpZXcuVmlld0dyb3VwLmNsYXNzKTsKLSAgICAgICAgICAgIG1Ub3BMYXlvdXRQYXJhbXNDbGFzcyA9IG5ldyBDbGFzc1dyYXBwZXIobW9ja19hbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcy5jbGFzcyk7Ci0KLSAgICAgICAgICAgIG1WaWV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIG1Hcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PElDbGFzc0Rlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICBtVmlld01hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgICAgIG1Hcm91cE1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgRXh0Vmlld0NsYXNzSW5mbz4oKTsKLSAgICAgICAgICAgIG1MYXlvdXRQYXJhbXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExheW91dFBhcmFtc0luZm8+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vY2tMYXlvdXRQYXJhbXNQYXJzZXIgbVBhcnNlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1QYXJzZXIgPSBuZXcgTW9ja0xheW91dFBhcmFtc1BhcnNlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZpbmRMYXlvdXRQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tfYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuY2xhc3MsCi0gICAgICAgICAgICAoKENsYXNzV3JhcHBlcilfZmluZExheW91dFBhcmFtcyhtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAuY2xhc3MpKS53cmFwcGVkQ2xhc3MoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tfYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5jbGFzcywKLSAgICAgICAgICAgICgoQ2xhc3NXcmFwcGVyKV9maW5kTGF5b3V0UGFyYW1zKG1vY2tfYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LmNsYXNzKSkud3JhcHBlZENsYXNzKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhtb2NrX2FuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0LkxheW91dFBhcmFtcy5jbGFzcywKLSAgICAgICAgICAgICgoQ2xhc3NXcmFwcGVyKV9maW5kTGF5b3V0UGFyYW1zKG1vY2tfYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQuY2xhc3MpKS53cmFwcGVkQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldExheW91dFBhcmFtc0luZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGF5b3V0UGFyYW1zSW5mbyBpbmZvMSA9IF9nZXRMYXlvdXRQYXJhbXNJbmZvKAotICAgICAgICAgICAgICAgIG1vY2tfYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGluZm8xKTsKLSAgICAgICAgLy8gVmlld0dyb3VwLkxheW91dERhdGEgaGFzIE9iamVjdCBmb3Igc3VwZXJDbGFzcywgd2hpY2ggd2UgZG9uJ3QgbWFwCi0gICAgICAgIGFzc2VydE51bGwoaW5mbzEuZ2V0U3VwZXJDbGFzcygpKTsKLQotICAgICAgICBMYXlvdXRQYXJhbXNJbmZvIGluZm8yID0gX2dldExheW91dFBhcmFtc0luZm8oCi0gICAgICAgICAgICAgICAgbW9ja19hbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmZvMik7Ci0gICAgICAgIC8vIExpbmVhckxheW91dC5MYXlvdXREYXRhIGxpbmtzIHRvIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMKLSAgICAgICAgYXNzZXJ0U2FtZShpbmZvMSwgaW5mbzIuZ2V0U3VwZXJDbGFzcygpKTsKLQotICAgICAgICBMYXlvdXRQYXJhbXNJbmZvIGluZm8zID0gX2dldExheW91dFBhcmFtc0luZm8oCi0gICAgICAgICAgICAgICAgbW9ja19hbmRyb2lkLndpZGdldC5UYWJsZUxheW91dC5MYXlvdXRQYXJhbXMuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGluZm8zKTsKLSAgICAgICAgLy8gVGFibGVMYXlvdXQuTGF5b3V0RGF0YSBkb2VzIG5vdCBsaW5rIHRvIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbm9yCi0gICAgICAgIC8vIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShpbmZvMSwgaW5mbzMuZ2V0U3VwZXJDbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShpbmZvMiwgaW5mbzMuZ2V0U3VwZXJDbGFzcygpKTsKLSAgICAgICAgLy8gVGFibGVMYXlvdXQuTGF5b3V0UGFyYW1zID0+IFZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXMgPT4gVmlld0dyb3VwLkxheW91dFBhcmFtcwotICAgICAgICBhc3NlcnRTYW1lKGluZm8xLCBpbmZvMy5nZXRTdXBlckNsYXNzKCkuZ2V0U3VwZXJDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2V0TGF5b3V0Q2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBfZ2V0TGF5b3V0Q2xhc3NlcygpOwotICAgIH0KLQotICAgIC8vLS0tLSBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzCi0KLSAgICAvKiogQ2FsbHMgdGhlIHByaXZhdGUgY29uc3RydWN0b3Igb2YgdGhlIHBhcnNlciAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgQW5kcm9pZFRhcmdldFBhcnNlciBfQ29uc3RydWN0b3IoU3RyaW5nIG9zSmFyUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnN0cnVjdG9yPEFuZHJvaWRUYXJnZXRQYXJzZXI+IGNvbnN0cnVjdG9yID0KLSAgICAgICAgICAgIEFuZHJvaWRUYXJnZXRQYXJzZXIuY2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpOwotICAgICAgICBjb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2Uob3NKYXJQYXRoKTsKLSAgICB9Ci0KLSAgICAvKiogY2FsbHMgdGhlIHByaXZhdGUgZ2V0TGF5b3V0Q2xhc3NlcygpIG9mIHRoZSBwYXJzZXIgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIHZvaWQgX2dldExheW91dENsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IEFuZHJvaWRUYXJnZXRQYXJzZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldExheW91dENsYXNzZXMiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIG1ldGhvZC5pbnZva2UobVBhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqIGNhbGxzIHRoZSBwcml2YXRlIGFkZEdyb3VwKCkgb2YgdGhlIHBhcnNlciAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgVmlld0NsYXNzSW5mbyBfYWRkR3JvdXAoQ2xhc3M8Pz4gZ3JvdXBDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBMYXlvdXRQYXJhbXNQYXJzZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImFkZEdyb3VwIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJQ2xhc3NEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiAoVmlld0NsYXNzSW5mbykgbWV0aG9kLmludm9rZShtUGFyc2VyLCBuZXcgQ2xhc3NXcmFwcGVyKGdyb3VwQ2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKiogY2FsbHMgdGhlIHByaXZhdGUgYWRkTGF5b3V0UGFyYW1zKCkgb2YgdGhlIHBhcnNlciAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgTGF5b3V0UGFyYW1zSW5mbyBfYWRkTGF5b3V0UGFyYW1zKENsYXNzPD8+IGdyb3VwQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbWV0aG9kID0gTGF5b3V0UGFyYW1zUGFyc2VyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJhZGRMYXlvdXRQYXJhbXMiLCAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJQ2xhc3NEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiAoTGF5b3V0UGFyYW1zSW5mbykgbWV0aG9kLmludm9rZShtUGFyc2VyLCBuZXcgQ2xhc3NXcmFwcGVyKGdyb3VwQ2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKiogY2FsbHMgdGhlIHByaXZhdGUgZ2V0TGF5b3V0UGFyYW1zSW5mbygpIG9mIHRoZSBwYXJzZXIgKi8KLSAgICBwcml2YXRlIExheW91dFBhcmFtc0luZm8gX2dldExheW91dFBhcmFtc0luZm8oQ2xhc3M8Pz4gbGF5b3V0UGFyYW1zQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbWV0aG9kID0gTGF5b3V0UGFyYW1zUGFyc2VyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRMYXlvdXRQYXJhbXNJbmZvIiwgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgSUNsYXNzRGVzY3JpcHRvci5jbGFzcyk7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gKExheW91dFBhcmFtc0luZm8pIG1ldGhvZC5pbnZva2UobVBhcnNlciwgbmV3IENsYXNzV3JhcHBlcihsYXlvdXRQYXJhbXNDbGFzcykpOwotICAgIH0KLQotICAgIC8qKiBjYWxscyB0aGUgcHJpdmF0ZSBmaW5kTGF5b3V0UGFyYW1zKCkgb2YgdGhlIHBhcnNlciAqLwotICAgIHByaXZhdGUgSUNsYXNzRGVzY3JpcHRvciBfZmluZExheW91dFBhcmFtcyhDbGFzczw/PiBncm91cENsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IExheW91dFBhcmFtc1BhcnNlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZmluZExheW91dFBhcmFtcyIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgSUNsYXNzRGVzY3JpcHRvci5jbGFzcyk7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gKElDbGFzc0Rlc2NyaXB0b3IpIG1ldGhvZC5pbnZva2UobVBhcnNlciwgbmV3IENsYXNzV3JhcHBlcihncm91cENsYXNzKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svQ2xhc3NwYXRoRW50cnlNb2NrLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svQ2xhc3NwYXRoRW50cnlNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGFhZGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9tb2NrL0NsYXNzcGF0aEVudHJ5TW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotCi1pbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhFbnRyeU1vY2sgaW1wbGVtZW50cyBJQ2xhc3NwYXRoRW50cnkgewotCi0gICAgcHJpdmF0ZSBpbnQgbUtpbmQ7Ci0gICAgcHJpdmF0ZSBJUGF0aCBtUGF0aDsKLQotICAgIHB1YmxpYyBDbGFzc3BhdGhFbnRyeU1vY2soSVBhdGggcGF0aCwgaW50IGtpbmQpIHsKLSAgICAgICAgbVBhdGggPSBwYXRoOwotICAgICAgICBtS2luZCA9IGtpbmQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0RW50cnlLaW5kKCkgewotICAgICAgICByZXR1cm4gbUtpbmQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gbVBhdGg7Ci0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0tIFVOSU1QTEVNRU5URUQgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21iaW5lQWNjZXNzUnVsZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQWNjZXNzUnVsZVtdIGdldEFjY2Vzc1J1bGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRLaW5kKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGhbXSBnZXRFeGNsdXNpb25QYXR0ZXJucygpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBnZXRFeHRyYUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aFtdIGdldEluY2x1c2lvblBhdHRlcm5zKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0T3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRFbnRyeSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svRmlsZU1vY2suamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvbW9jay9GaWxlTW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM5MTUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvbW9jay9GaWxlTW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UubW9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1pbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUZpbGV9LgotICogCi0gKiBPcHRpb25hbGx5IGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYnl0ZSBhcnJheQotICogCi0gKiA8cC8+U3VwcG9ydGVkIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiAgICAgPGxpPmdldE5hbWUoKTwvbGk+Ci0gKiAgICAgPGxpPmdldENvbnRlbnRzKCk8L2xpPgotICogICAgIDxsaT5nZXRDb250ZW50cyhib29sZWFuIGZvcmNlKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1vY2sgaW1wbGVtZW50cyBJRmlsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICBwcml2YXRlIGJ5dGVbXSBtQ29udGVudERhdGE7IAotCi0gICAgcHVibGljIEZpbGVNb2NrKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMobmFtZSwgbmV3IGJ5dGVbMF0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRmlsZU1vY2soU3RyaW5nIG5hbWUsIGJ5dGVbXSBmaWxlRGF0YSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1Db250ZW50RGF0YSA9IGZpbGVEYXRhOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tIE1PQ0tFRCBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obUNvbnRlbnREYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoYm9vbGVhbiBmb3JjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBpZ25vcmUgZm9yY2UKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0gICAgfQotICAgIAotICAgIC8vIC0tLS0tLS0tIFVOSU1QTEVNRU5URUQgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50cyhJbnB1dFN0cmVhbSBzb3VyY2UsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50cyhJbnB1dFN0cmVhbSBzb3VyY2UsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4ga2VlcEhpc3RvcnksCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlKElucHV0U3RyZWFtIHNvdXJjZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGUoSW5wdXRTdHJlYW0gc291cmNlLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTGluayhJUGF0aCBsb2NhbExvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTGluayhVUkkgbG9jYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldChib29sZWFuIGNoZWNrSW1wbGljaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0Rm9yKFJlYWRlciByZWFkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVuY29kaW5nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZVN0YXRlW10gZ2V0SGlzdG9yeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwgCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIG5ld0NoYXJzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgbmV3Q2hhcnNldCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElucHV0U3RyZWFtIHNvdXJjZSwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElGaWxlU3RhdGUgc291cmNlLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudHMoSW5wdXRTdHJlYW0gc291cmNlLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGtlZXBIaXN0b3J5LAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElGaWxlU3RhdGUgc291cmNlLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGtlZXBIaXN0b3J5LAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjY2VwdChJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yLCBpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciwgaW50IGRlcHRoLCBib29sZWFuIGluY2x1ZGVQaGFudG9tcykKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciwgaW50IGRlcHRoLCBpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJIaXN0b3J5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5KElQYXRoIGRlc3RpbmF0aW9uLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHkoSVBhdGggZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5KElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weShJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrZXIgY3JlYXRlTWFya2VyKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VQcm94eSBjcmVhdGVQcm94eSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlTWFya2VycyhTdHJpbmcgdHlwZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTWFya2VyIGZpbmRNYXJrZXIobG9uZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlcltdIGZpbmRNYXJrZXJzKFN0cmluZyB0eXBlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGZpbmRNYXhQcm9ibGVtU2V2ZXJpdHkoU3RyaW5nIHR5cGUsIGJvb2xlYW4gaW5jbHVkZVN1YnR5cGVzLCBpbnQgZGVwdGgpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TG9jYWxUaW1lU3RhbXAoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKG1OYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uVVJJKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlciBnZXRNYXJrZXIobG9uZyBpZCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRQcm9wZXJ0eShRdWFsaWZpZWROYW1lIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRSYXdMb2NhdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRSYXdMb2NhdGlvblVSSSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlQXR0cmlidXRlcyBnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2Vzc2lvblByb3BlcnR5KFF1YWxpZmllZE5hbWUga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rZWQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlua2VkKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWwoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGhhbnRvbSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGVNZW1iZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVBhdGggZGVzdGluYXRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoTG9jYWwoaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2ZXJ0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gaXNEZXJpdmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKGJvb2xlYW4gZmxhZywgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgc2V0TG9jYWxUaW1lU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50UHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uUHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFtUHJpdmF0ZU1lbWJlcihib29sZWFuIGlzVGVhbVByaXZhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdG91Y2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE1hcCBnZXRQZXJzaXN0ZW50UHJvcGVydGllcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE1hcCBnZXRTZXNzaW9uUHJvcGVydGllcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbiBpc0hpZGRlbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbihpbnQgb3B0aW9ucykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYW1Qcml2YXRlTWVtYmVyKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9tb2NrL0ZvbGRlck1vY2suamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvbW9jay9Gb2xkZXJNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY1M2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9tb2NrL0ZvbGRlck1vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLm1vY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1pbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRm9sZGVyfS4KLSAqIDxwLz5TdXBwb3J0ZWQgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2dldE5hbWUoKX08L2xpPgotICogPGxpPntAbGluayAjbWVtYmVycygpfTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRm9sZGVyTW9jayBpbXBsZW1lbnRzIElGb2xkZXIgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgSVJlc291cmNlW10gbU1lbWJlcnM7Ci0gICAgCi0gICAgcHVibGljIEZvbGRlck1vY2soU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICBtTWVtYmVycyA9IG5ldyBJUmVzb3VyY2VbMF07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBGb2xkZXJNb2NrKFN0cmluZyBuYW1lLCBJUmVzb3VyY2VbXSBtZW1iZXJzKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbU1lbWJlcnMgPSBtZW1iZXJzOwotICAgIH0KLSAgICAKLSAgICAvLyAtLS0tLS0tLSBNT0NLRUQgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbU1lbWJlcnM7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0gVU5JTVBMRU1FTlRFRCBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZShib29sZWFuIGZvcmNlLCBib29sZWFuIGxvY2FsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIGJvb2xlYW4gbG9jYWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTGluayhJUGF0aCBsb2NhbExvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTGluayhVUkkgbG9jYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggcGF0aCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZpbGVbXSBmaW5kRGVsZXRlZE1lbWJlcnNXaXRoSGlzdG9yeShpbnQgZGVwdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBwYXRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbmNsdWRlUGhhbnRvbXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIHBhdGgsIGJvb2xlYW4gaW5jbHVkZVBoYW50b21zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENoYXJzZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENoYXJzZXQoYm9vbGVhbiBjaGVja0ltcGxpY2l0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKElQYXRoIHBhdGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElGb2xkZXIgZ2V0Rm9sZGVyKElQYXRoIHBhdGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVtdIG1lbWJlcnMoYm9vbGVhbiBpbmNsdWRlUGhhbnRvbXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVtdIG1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDaGFyc2V0KFN0cmluZyBjaGFyc2V0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IsIGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoSVJlc291cmNlVmlzaXRvciB2aXNpdG9yLCBpbnQgZGVwdGgsIGJvb2xlYW4gaW5jbHVkZVBoYW50b21zKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoSVJlc291cmNlVmlzaXRvciB2aXNpdG9yLCBpbnQgZGVwdGgsIGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckhpc3RvcnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHkoSVBhdGggZGVzdGluYXRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weShJUGF0aCBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHkoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5KElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlciBjcmVhdGVNYXJrZXIoU3RyaW5nIHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVByb3h5IGNyZWF0ZVByb3h5KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKFN0cmluZyB0eXBlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTWFya2VyIGZpbmRNYXJrZXIobG9uZyBpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlcltdIGZpbmRNYXJrZXJzKFN0cmluZyB0eXBlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGZpbmRNYXhQcm9ibGVtU2V2ZXJpdHkoU3RyaW5nIHR5cGUsIGJvb2xlYW4gaW5jbHVkZVN1YnR5cGVzLCBpbnQgZGVwdGgpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMb2NhbFRpbWVTdGFtcCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uVVJJKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlciBnZXRNYXJrZXIobG9uZyBpZCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRQcm9wZXJ0eShRdWFsaWZpZWROYW1lIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRSYXdMb2NhdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRSYXdMb2NhdGlvblVSSSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlQXR0cmlidXRlcyBnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2Vzc2lvblByb3BlcnR5KFF1YWxpZmllZE5hbWUga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rZWQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlua2VkKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWwoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGhhbnRvbSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGVNZW1iZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVBhdGggZGVzdGluYXRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoTG9jYWwoaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2ZXJ0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gaXNEZXJpdmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKGJvb2xlYW4gZmxhZywgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgc2V0TG9jYWxUaW1lU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50UHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uUHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFtUHJpdmF0ZU1lbWJlcihib29sZWFuIGlzVGVhbVByaXZhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdG91Y2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDw/LD8+IGdldFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPD8sPz4gZ2V0U2Vzc2lvblByb3BlcnRpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVyaXZlZChpbnQgb3B0aW9ucykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZGVuKGJvb2xlYW4gaXNIaWRkZW4pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oaW50IG9wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZWFtUHJpdmF0ZU1lbWJlcihpbnQgb3B0aW9ucykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svSmF2YVByb2plY3RNb2NrLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svSmF2YVByb2plY3RNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2QyYzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9tb2NrL0phdmFQcm9qZWN0TW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UubW9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUV2YWx1YXRpb25Db250ZXh0OwotCi1pbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RNb2NrIGltcGxlbWVudHMgSUphdmFQcm9qZWN0IHsKLSAgICAKLSAgICBwcml2YXRlIElQcm9qZWN0IG1Qcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBtRW50cmllczsKLSAgICBwcml2YXRlIElQYXRoIG1PdXRwdXRMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBtQ29tcGlsZXJDb21wbGlhbmNlID0gIjEuNCI7IC8vJE5PTi1OTFMtMQotICAgIHByaXZhdGUgU3RyaW5nIG1Db21waWxlclNvdXJjZSA9ICIxLjQiOyAvLyROT04tTkxTLTEKLSAgICBwcml2YXRlIFN0cmluZyBtQ29tcGlsZXJUYXJnZXQgPSAiMS40IjsgLy8kTk9OLU5MUy0xCi0KLSAgICBwdWJsaWMgSmF2YVByb2plY3RNb2NrKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElQYXRoIG91dHB1dExvY2F0aW9uKSB7Ci0gICAgICAgIG1FbnRyaWVzID0gZW50cmllczsKLSAgICAgICAgbU91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICBpZiAobVByb2plY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVByb2plY3QgPSBuZXcgUHJvamVjdE1vY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtUHJvamVjdDsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1FbnRyaWVzID0gZW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywgSVBhdGggb3V0cHV0TG9jYXRpb24sCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7Ci0gICAgICAgIG1PdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmF3Q2xhc3NwYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtRW50cmllczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQYXRoIGdldE91dHB1dExvY2F0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0TG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uKFN0cmluZyBvcHRpb25OYW1lLCBib29sZWFuIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMpIHsKLSAgICAgICAgaWYgKG9wdGlvbk5hbWUuZXF1YWxzKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVyQ29tcGxpYW5jZTsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVyU291cmNlOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbk5hbWUuZXF1YWxzKEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNKSkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlclRhcmdldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb24oU3RyaW5nIG9wdGlvbk5hbWUsIFN0cmluZyBvcHRpb25WYWx1ZSkgewotICAgICAgICBpZiAob3B0aW9uTmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpIHsKLSAgICAgICAgICAgIG1Db21waWxlckNvbXBsaWFuY2UgPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZXJTb3VyY2UgPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb25OYW1lLmVxdWFscyhKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSkpIHsKLSAgICAgICAgICAgIG1Db21waWxlclRhcmdldCA9IG9wdGlvblZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tIFVOSU1QTEVNRU5URUQgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeSBkZWNvZGVDbGFzc3BhdGhFbnRyeShTdHJpbmcgZW5jb2RlZEVudHJ5KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoSVBhdGggcGF0aCwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdChJUGF0aCBwYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290W10gZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSwgV29ya2luZ0NvcHlPd25lciBvd25lcikKLSAgICAgICAgICAgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSwgV29ya2luZ0NvcHlPd25lciBvd25lciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLCBXb3JraW5nQ29weU93bmVyIG93bmVyLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTWFwIGdldE9wdGlvbnMoYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJQYXRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYWNrYWdlRnJhZ21lbnRbXSBnZXRQYWNrYWdlRnJhZ21lbnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZFByb2plY3ROYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoYm9vbGVhbiBpZ25vcmVVbnJlc29sdmVkRW50cnkpCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQnVpbGRTdGF0ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoQ3ljbGUoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT25DbGFzc3BhdGgoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRXZhbHVhdGlvbkNvbnRleHQgbmV3RXZhbHVhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElSZWdpb24gcmVnaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSVJlZ2lvbiByZWdpb24sIFdvcmtpbmdDb3B5T3duZXIgb3duZXIsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJVHlwZSB0eXBlLCBJUmVnaW9uIHJlZ2lvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElUeXBlIHR5cGUsIElSZWdpb24gcmVnaW9uLCBXb3JraW5nQ29weU93bmVyIG93bmVyLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIHJlYWRPdXRwdXRMb2NhdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlYWRSYXdDbGFzc3BhdGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbnMoTWFwIG5ld09wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIGJvb2xlYW4gY2FuTW9kaWZ5UmVzb3VyY2VzLAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElQYXRoIG91dHB1dExvY2F0aW9uLAotICAgICAgICAgICAgYm9vbGVhbiBjYW5Nb2RpZnlSZXNvdXJjZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlIGdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZUlkZW50aWZpZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YU1vZGVsIGdldEphdmFNb2RlbCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUphdmFFbGVtZW50IGdldFByaW1hcnlFbGVtZW50KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cnVjdHVyZUtub3duKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZmluZFJlY29tbWVuZGVkTGluZVNlcGFyYXRvcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVW5zYXZlZENoYW5nZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFrZUNvbnNpc3RlbnQoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIGJpbmRpbmdLZXksIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS9tb2NrL1Byb2plY3RNb2NrLmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svUHJvamVjdE1vY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzMmQwZi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL21vY2svUHJvamVjdE1vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLm1vY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1pbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUHJvamVjdH0uCi0gKiA8cC8+U3VwcG9ydGVkIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKX08L2xpPgotICogPGxpPntAbGluayAjbWVtYmVycyhpbnQga2luZCwgU3RyaW5nIGJ1aWxkZXJOYW1lLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKX08L2xpPgotICogPC91bD4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLXB1YmxpYyBjbGFzcyBQcm9qZWN0TW9jayBpbXBsZW1lbnRzIElQcm9qZWN0IHsKLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcGFzcwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkKGludCBraW5kLCBTdHJpbmcgYnVpbGRlck5hbWUsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHBhc3MKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0gVU5JTVBMRU1FTlRFRCBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGJvb2xlYW4gZGVsZXRlQ29udGVudCwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbnRlbnRUeXBlTWF0Y2hlciBnZXRDb250ZW50VHlwZU1hdGNoZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUHJvamVjdERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9qZWN0TmF0dXJlIGdldE5hdHVyZShTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFBsdWdpbldvcmtpbmdMb2NhdGlvbihJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW4pIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9qZWN0W10gZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ1Byb2plY3RzKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0V29ya2luZ0xvY2F0aW9uKFN0cmluZyBpZCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYXR1cmUoU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmF0dXJlRW5hYmxlZChTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbihpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGludCB1cGRhdGVGbGFncywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggcGF0aCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZpbGVbXSBmaW5kRGVsZXRlZE1lbWJlcnNXaXRoSGlzdG9yeShpbnQgZGVwdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBwYXRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbmNsdWRlUGhhbnRvbXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIHBhdGgsIGJvb2xlYW4gaW5jbHVkZVBoYW50b21zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENoYXJzZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENoYXJzZXQoYm9vbGVhbiBjaGVja0ltcGxpY2l0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKElQYXRoIHBhdGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElGb2xkZXIgZ2V0Rm9sZGVyKElQYXRoIHBhdGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VbXSBtZW1iZXJzKGJvb2xlYW4gaW5jbHVkZVBoYW50b21zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VbXSBtZW1iZXJzKGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q2hhcnNldChTdHJpbmcgY2hhcnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q2hhcnNldChTdHJpbmcgY2hhcnNldCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjY2VwdChJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yLCBpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciwgaW50IGRlcHRoLCBib29sZWFuIGluY2x1ZGVQaGFudG9tcykKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KElSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciwgaW50IGRlcHRoLCBpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJIaXN0b3J5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5KElQYXRoIGRlc3RpbmF0aW9uLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHkoSVBhdGggZGVzdGluYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5KElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weShJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrZXIgY3JlYXRlTWFya2VyKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUmVzb3VyY2VQcm94eSBjcmVhdGVQcm94eSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlTWFya2VycyhTdHJpbmcgdHlwZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU1hcmtlciBmaW5kTWFya2VyKGxvbmcgaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrZXJbXSBmaW5kTWFya2VycyhTdHJpbmcgdHlwZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBmaW5kTWF4UHJvYmxlbVNldmVyaXR5KFN0cmluZyB0eXBlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TG9jYWxUaW1lU3RhbXAoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRMb2NhdGlvblVSSSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElNYXJrZXIgZ2V0TWFya2VyKGxvbmcgaWQpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDb250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRQcm9wZXJ0eShRdWFsaWZpZWROYW1lIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRSYXdMb2NhdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRSYXdMb2NhdGlvblVSSSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlQXR0cmlidXRlcyBnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2Vzc2lvblByb3BlcnR5KFF1YWxpZmllZE5hbWUga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rZWQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlua2VkKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWwoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGhhbnRvbSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IGRlcHRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGVNZW1iZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVBhdGggZGVzdGluYXRpb24sIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmUoSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoTG9jYWwoaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2ZXJ0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gaXNEZXJpdmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKGJvb2xlYW4gZmxhZywgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgc2V0TG9jYWxUaW1lU3RhbXAobG9uZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50UHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQXR0cmlidXRlcyhSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uUHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFtUHJpdmF0ZU1lbWJlcihib29sZWFuIGlzVGVhbVByaXZhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdG91Y2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGludCB1cGRhdGVGbGFncywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPD8sPz4gZ2V0UGVyc2lzdGVudFByb3BlcnRpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8Pyw/PiBnZXRTZXNzaW9uUHJvcGVydGllcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbiBpc0hpZGRlbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbihpbnQgb3B0aW9ucykgewotICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYW1Qcml2YXRlTWVtYmVyKGludCBvcHRpb25zKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvQW5kcm9pZE1hbmlmZXN0LWluc3RydW1lbnRhdGlvbi54bWwgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL0FuZHJvaWRNYW5pZmVzdC1pbnN0cnVtZW50YXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzgwZjk2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvQW5kcm9pZE1hbmlmZXN0LWluc3RydW1lbnRhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5BbmRyb2lkUHJvamVjdC50ZXN0cyI+Ci0KLSAgICA8IS0tCi0gICAgVGhpcyBkZWNsYXJlcyB0aGF0IHRoaXMgYXBwIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiB0ZXN0IHJ1bm5lciB0YXJnZXRpbmcKLSAgICB0aGUgcGFja2FnZSBvZiBjb20uYW5kcm9pZC5zYW1wbGVzLiAgVG8gcnVuIHRoZSB0ZXN0cyB1c2UgdGhlIGNvbW1hbmQ6Ci0gICAgImFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLnNhbXBsZXMudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5BbmRyb2lkUHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNhbXBsZSB0ZXN0IGZvciBkZXBsb3ltZW50LiIvPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9BbmRyb2lkTWFuaWZlc3QtdGVzdGFwcC54bWwgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL0FuZHJvaWRNYW5pZmVzdC10ZXN0YXBwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlNzAxMi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL0FuZHJvaWRNYW5pZmVzdC10ZXN0YXBwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0YXBwIj4KLSAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iPgotICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnRlc3RhcHAuTWFpbkFjdGl2aXR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KLSAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+IgotICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+Ci0gICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgPC9hY3Rpdml0eT4KLSAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgotICA8L2FwcGxpY2F0aW9uPiIKLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzIgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciBBcGkgRGVtb3MuIi8+Ci08L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvamFyX2V4YW1wbGUuamFyIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9qYXJfZXhhbXBsZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWI1OTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9qYXJfZXhhbXBsZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL2phcl9leGFtcGxlLmphcmRlc2MgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL2NvbS9hbmRyb2lkL2lkZS9lY2xpcHNlL3Rlc3RkYXRhL2phcl9leGFtcGxlLmphcmRlc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2Q0NGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9qYXJfZXhhbXBsZS5qYXJkZXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgc3RhbmRhbG9uZT0ibm8iPz4KLTxqYXJkZXNjPgotICAgIDxqYXIgcGF0aD0iamFyX2V4YW1wbGUuamFyIi8+Ci0gICAgPG9wdGlvbnMgYnVpbGRJZk5lZWRlZD0idHJ1ZSIgY29tcHJlc3M9InRydWUiIGRlc2NyaXB0aW9uTG9jYXRpb249Ii9jb21tb24vdGVzdHMvZGF0YS9qYXJfZXhhbXBsZS5qYXJkZXNjIiBleHBvcnRFcnJvcnM9ImZhbHNlIiBleHBvcnRXYXJuaW5ncz0idHJ1ZSIgaW5jbHVkZURpcmVjdG9yeUVudHJpZXM9ImZhbHNlIiBvdmVyd3JpdGU9ImZhbHNlIiBzYXZlRGVzY3JpcHRpb249InRydWUiIHN0b3JlUmVmYWN0b3JpbmdzPSJmYWxzZSIgdXNlU291cmNlRm9sZGVycz0iZmFsc2UiLz4KLSAgICA8c3RvcmVkUmVmYWN0b3JpbmdzIGRlcHJlY2F0aW9uSW5mbz0idHJ1ZSIgc3RydWN0dXJhbE9ubHk9ImZhbHNlIi8+Ci0gICAgPHNlbGVjdGVkUHJvamVjdHMvPgotICAgIDxtYW5pZmVzdCBnZW5lcmF0ZU1hbmlmZXN0PSJ0cnVlIiBtYW5pZmVzdExvY2F0aW9uPSIiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIiByZXVzZU1hbmlmZXN0PSJmYWxzZSIgc2F2ZU1hbmlmZXN0PSJmYWxzZSIgdXNlc01hbmlmZXN0PSJ0cnVlIj4KLSAgICAgICAgPHNlYWxpbmcgc2VhbEphcj0iZmFsc2UiPgotICAgICAgICAgICAgPHBhY2thZ2VzVG9TZWFsLz4KLSAgICAgICAgICAgIDxwYWNrYWdlc1RvVW5TZWFsLz4KLSAgICAgICAgPC9zZWFsaW5nPgotICAgIDwvbWFuaWZlc3Q+Ci0gICAgPHNlbGVjdGVkRWxlbWVudHMgZXhwb3J0Q2xhc3NGaWxlcz0idHJ1ZSIgZXhwb3J0SmF2YUZpbGVzPSJmYWxzZSIgZXhwb3J0T3V0cHV0Rm9sZGVyPSJmYWxzZSI+Ci0gICAgICAgIDxqYXZhRWxlbWVudCBoYW5kbGVJZGVudGlmaWVyPSI9Y29tbW9uL3Rlc3RzJmx0O2phci5leGFtcGxlIi8+Ci0gICAgPC9zZWxlY3RlZEVsZW1lbnRzPgotPC9qYXJkZXNjPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9tb2NrX2F0dHJzLnhtbCBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvY29tL2FuZHJvaWQvaWRlL2VjbGlwc2UvdGVzdGRhdGEvbW9ja19hdHRycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOWExZjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9pZGUvZWNsaXBzZS90ZXN0ZGF0YS9tb2NrX2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBXQVJOSU5HICEhISBUSElTIElTIEEgTU9DSyBGSUxFLiBETyBOT1QgVVNFIEZPUiBET0NVTUVOVEFUSU9OIFBVUlBPU0VTLgotICAgICAgICAgVGhpcyBmaWxlIGhhcyBiZWVuIHRyaW1tZWQgZG93biB0byBvbmx5IGV4dHJhY3QgYSBudW1iZXIgb2YgaW50ZXJlc3RpbmcgY2FzZXMgCi0gICAgICAgICBmb3IgdW5pdCB0ZXN0cy4KLSAgICAgICAgIAotICAgICAgICAgV2hhdCB0aGlzIGNvbnRhaW5zOgotICAgICAgICAgLSBWaWV3Ci0gICAgICAgICAtIFZpZXdHcm91cAotICAgICAgICAgLSBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggZm9ybWF0IGFyZSBkZWZpbmVkIGluIFRoZW1lCi0gICAgICAgICAtIG9yaWVudGF0aW9uLCBncmF2aXR5IGFuZCBsYXlvdXRfZ3Jhdml0eSBkZWZpbmVkIGJlZm9yZSB0aGV5IGFyZSB1c2VkCi0gICAgICAgICAtIFZpZXdHcm91cF9MYXlvdXQKLSAgICAgICAgIC0gVmlld0dyb3VwX01hcmdpbkxheW91dAotICAgICAgICAgLSBMaW5lYXJMYXlvdXQKLSAgICAgICAgIC0gTGluZWFyTGF5b3V0X0xheW91dAotICAgICAgICAgLSBUYWJsZUxheW91dAotICAgICAgICAgCi0gICAgICAgICBOb3RlIHRoYXQgVGFibGVMYXlvdXQgZG9lcyBub3QgaGF2ZSBhIFRhYmxlTGF5b3V0X0xheW91dCBkZWZpbml0aW9uIGhlcmUKLSAgICAgICAgIHdoZXJlIHRoZXNlIGlzIGEgY2xhc3MgVGFibGVMYXlvdXQuTGF5b3V0RGF0YS4KLSAgICAtLT4KLQotICAgIDwhLS0gVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBhdHRyaWJ1dGVzIHRoYXQgbWFrZSB1cCBhIGNvbXBsZXRlIHRoZW1lLiAtLT4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVGhlbWUiPgotCi0gICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgc2Nyb2xsYmFycyBzaXplLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ic2Nyb2xsYmFyU2l6ZSIgZm9ybWF0PSJkaW1lbnNpb24iIC8+Ci0KLSAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgotCi0gICAgICAgIAotICAgIDwhLS0gU3RhbmRhcmQgb3JpZW50YXRpb24gY29uc3RhbnQuIC0tPgotICAgIDxhdHRyIG5hbWU9Im9yaWVudGF0aW9uIj4KLSAgICAgICAgPCEtLSBEZWZpbmVzIGFuIGhvcml6b250YWwgd2lkZ2V0LiAtLT4KLSAgICAgICAgPGVudW0gbmFtZT0iaG9yaXpvbnRhbCIgdmFsdWU9IjAiIC8+Ci0gICAgICAgIDwhLS0gRGVmaW5lcyBhIHZlcnRpY2FsIHdpZGdldC4gLS0+Ci0gICAgICAgIDxlbnVtIG5hbWU9InZlcnRpY2FsIiB2YWx1ZT0iMSIgLz4KLSAgICA8L2F0dHI+Ci0KLSAgICA8IS0tIFNwZWNpZmllcyBob3cgdG8gcGxhY2UgYW4gb2JqZWN0LCBib3RoCi0gICAgICAgICBpdHMgeCBhbmQgeSBheGlzLCB3aXRoaW4gYSBsYXJnZXIgY29udGFpbmluZyBvYmplY3QuIC0tPgotICAgIDxhdHRyIG5hbWU9ImdyYXZpdHkiPgotICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSB0b3Agb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0idG9wIiB2YWx1ZT0iMHgzMCIgLz4KLSAgICAgICAgPCEtLSBQdXNoIG9iamVjdCB0byB0aGUgYm90dG9tIG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImJvdHRvbSIgdmFsdWU9IjB4NTAiIC8+Ci0gICAgICAgIDwhLS0gUHVzaCBvYmplY3QgdG8gdGhlIGxlZnQgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0ibGVmdCIgdmFsdWU9IjB4MDMiIC8+Ci0gICAgICAgIDwhLS0gUHVzaCBvYmplY3QgdG8gdGhlIHJpZ2h0IG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9InJpZ2h0IiB2YWx1ZT0iMHgwNSIgLz4KLSAgICAgICAgPCEtLSBQbGFjZSBvYmplY3QgaW4gdGhlIHZlcnRpY2FsIGNlbnRlciBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJjZW50ZXJfdmVydGljYWwiIHZhbHVlPSIweDEwIiAvPgotICAgICAgICA8IS0tIEdyb3cgdGhlIHZlcnRpY2FsIHNpemUgb2YgdGhlIG9iamVjdCBpZiBuZWVkZWQgc28gaXQgY29tcGxldGVseSBmaWxscyBpdHMgY29udGFpbmVyLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iZmlsbF92ZXJ0aWNhbCIgdmFsdWU9IjB4NzAiIC8+Ci0gICAgICAgIDwhLS0gUGxhY2Ugb2JqZWN0IGluIHRoZSBob3Jpem9udGFsIGNlbnRlciBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJjZW50ZXJfaG9yaXpvbnRhbCIgdmFsdWU9IjB4MDEiIC8+Ci0gICAgICAgIDwhLS0gR3JvdyB0aGUgaG9yaXpvbnRhbCBzaXplIG9mIHRoZSBvYmplY3QgaWYgbmVlZGVkIHNvIGl0IGNvbXBsZXRlbHkgZmlsbHMgaXRzIGNvbnRhaW5lci4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImZpbGxfaG9yaXpvbnRhbCIgdmFsdWU9IjB4MDciIC8+Ci0gICAgICAgIDwhLS0gUGxhY2UgdGhlIG9iamVjdCBpbiB0aGUgY2VudGVyIG9mIGl0cyBjb250YWluZXIgaW4gYm90aCB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgYXhpcywgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iY2VudGVyIiB2YWx1ZT0iMHgxMSIgLz4KLSAgICAgICAgPCEtLSBHcm93IHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzaXplIG9mIHRoZSBvYmplY3QgaWYgbmVlZGVkIHNvIGl0IGNvbXBsZXRlbHkgZmlsbHMgaXRzIGNvbnRhaW5lci4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImZpbGwiIHZhbHVlPSIweDc3IiAvPgotICAgIDwvYXR0cj4KLQotICAgIDwhLS0gU3RhbmRhcmQgZ3Jhdml0eSBjb25zdGFudCB0aGF0IGEgY2hpbGQgY2FuIHN1cHBseSB0byBpdHMgcGFyZW50LgotICAgICAgICAgRGVmaW5lcyBob3cgdG8gcGxhY2UgYW4gb2JqZWN0LCBib3RoCi0gICAgICAgICBpdHMgeCBhbmQgeSBheGlzLCB3aXRoaW4gYSBsYXJnZXIgY29udGFpbmluZyBvYmplY3QuIC0tPgotICAgIDxhdHRyIG5hbWU9ImxheW91dF9ncmF2aXR5Ij4KLSAgICAgICAgPCEtLSBQdXNoIG9iamVjdCB0byB0aGUgdG9wIG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9InRvcCIgdmFsdWU9IjB4MzAiIC8+Ci0gICAgICAgIDwhLS0gUHVzaCBvYmplY3QgdG8gdGhlIGJvdHRvbSBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJib3R0b20iIHZhbHVlPSIweDUwIiAvPgotICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSBsZWZ0IG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImxlZnQiIHZhbHVlPSIweDAzIiAvPgotICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSByaWdodCBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJyaWdodCIgdmFsdWU9IjB4MDUiIC8+Ci0gICAgICAgIDwhLS0gUGxhY2Ugb2JqZWN0IGluIHRoZSB2ZXJ0aWNhbCBjZW50ZXIgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iY2VudGVyX3ZlcnRpY2FsIiB2YWx1ZT0iMHgxMCIgLz4KLSAgICAgICAgPCEtLSBHcm93IHRoZSB2ZXJ0aWNhbCBzaXplIG9mIHRoZSBvYmplY3QgaWYgbmVlZGVkIHNvIGl0IGNvbXBsZXRlbHkgZmlsbHMgaXRzIGNvbnRhaW5lci4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImZpbGxfdmVydGljYWwiIHZhbHVlPSIweDcwIiAvPgotICAgICAgICA8IS0tIFBsYWNlIG9iamVjdCBpbiB0aGUgaG9yaXpvbnRhbCBjZW50ZXIgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iY2VudGVyX2hvcml6b250YWwiIHZhbHVlPSIweDAxIiAvPgotICAgICAgICA8IS0tIEdyb3cgdGhlIGhvcml6b250YWwgc2l6ZSBvZiB0aGUgb2JqZWN0IGlmIG5lZWRlZCBzbyBpdCBjb21wbGV0ZWx5IGZpbGxzIGl0cyBjb250YWluZXIuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJmaWxsX2hvcml6b250YWwiIHZhbHVlPSIweDA3IiAvPgotICAgICAgICA8IS0tIFBsYWNlIHRoZSBvYmplY3QgaW4gdGhlIGNlbnRlciBvZiBpdHMgY29udGFpbmVyIGluIGJvdGggdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGF4aXMsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImNlbnRlciIgdmFsdWU9IjB4MTEiIC8+Ci0gICAgICAgIDwhLS0gR3JvdyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2l6ZSBvZiB0aGUgb2JqZWN0IGlmIG5lZWRlZCBzbyBpdCBjb21wbGV0ZWx5IGZpbGxzIGl0cyBjb250YWluZXIuIC0tPgotICAgICAgICA8ZmxhZyBuYW1lPSJmaWxsIiB2YWx1ZT0iMHg3NyIgLz4KLSAgICA8L2F0dHI+Ci0KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlldyI+Ci0gICAgPCEtLSBOT1RFOiBWaWV3IGRvZXMgbm90IGhhdmUgYSBqYXZhZG9jLiBEbyBub3QgcGxhY2UgYSBjb21tZW50IEJFRk9SRSBWaWV3IHRvIG1ha2Ugc3VyZSBpdAotICAgICAgICAgaXMgTk9UIGludGVycHJldGVkIGFzIEphdmFkb2MgLS0+Ci0gICAgCi0gICAgICAgIDwhLS0gU3VwcGx5IGFuIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhpcyB2aWV3LCB0byBsYXRlciByZXRyaWV2ZSBpdAotICAgICAgICAgICAgIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZCBWaWV3LmZpbmRWaWV3QnlJZCgpfSBvcgotICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5kVmlld0J5SWQgQWN0aXZpdHkuZmluZFZpZXdCeUlkKCl9LgotICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhCi0gICAgICAgICAgICAgcmVzb3VyY2UgcmVmZXJlbmNlOyB0eXBpY2FsbHkgeW91IHNldCB0aGlzIHVzaW5nIHRoZQotICAgICAgICAgICAgIDxjb2RlPkArPC9jb2RlPiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IElEIHJlc291cmNlcy4KLSAgICAgICAgICAgICBGb3IgZXhhbXBsZTogPGNvZGU+YW5kcm9pZDppZD0iQCtpZC9teV9pZCI8L2NvZGU+IHdoaWNoCi0gICAgICAgICAgICAgYWxsb3dzIHlvdSB0byBsYXRlciByZXRyaWV2ZSB0aGUgdmlldwotICAgICAgICAgICAgIHdpdGggPGNvZGU+ZmluZFZpZXdCeUlkKFIuaWQubXlfaWQpPC9jb2RlPi4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImlkIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gU3VwcGx5IGEgdGFnIGZvciB0aGlzIHZpZXcgY29udGFpbmluZyBhIFN0cmluZywgdG8gYmUgcmV0cmlldmVkCi0gICAgICAgICAgICAgbGF0ZXIgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VGFnIFZpZXcuZ2V0VGFnKCl9IG9yCi0gICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3V2l0aFRhZwotICAgICAgICAgICAgIFZpZXcuZmluZFZpZXdXaXRoVGFnKCl9LiAgSXQgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlCi0gICAgICAgICAgICAgSURzICh0aHJvdWdoIHRoZSBhbmRyb2lkOmlkIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZiB0YWdzIGJlY2F1c2UKLSAgICAgICAgICAgICB0aGV5IGFyZSBmYXN0ZXIgYW5kIGFsbG93IGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZy4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InRhZyIgZm9ybWF0PSJzdHJpbmciIC8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRoZSBpbml0aWFsIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCwgaW4gcGl4ZWxzLi0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzY3JvbGxYIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KLQotICAgICAgICA8IS0tIFRoZSBpbml0aWFsIHZlcnRpY2FsIHNjcm9sbCBvZmZzZXQsIGluIHBpeGVscy4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InNjcm9sbFkiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotCi0gICAgICAgIDwhLS0gQSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIGJhY2tncm91bmQuICBUaGlzIGNhbiBiZSBlaXRoZXIgYSByZWZlcmVuY2UKLSAgICAgICAgICAgICB0byBhIGZ1bGwgZHJhd2FibGUgcmVzb3VyY2UgKHN1Y2ggYXMgYSBQTkcgaW1hZ2UsIDktcGF0Y2gsCi0gICAgICAgICAgICAgWE1MIHN0YXRlIGxpc3QgZGVzY3JpcHRpb24sIGV0YyksIG9yIGEgc29saWQgY29sb3Igc3VjaCBhcyAiI2ZmMDAwMDAwIgotICAgICAgICAgICAgKGJsYWNrKS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgotCi0gICAgICAgIDwhLS0gQm9vbGVhbiB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYSB2aWV3IGNhbiB0YWtlIGZvY3VzLiAgQnkgZGVmYXVsdCB0aGUgdXNlciBjYW4gbm90Ci0gICAgICAgICAgICAgbW92ZSBmb2N1cyB0byBhIHZpZXc7IGJ5IHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gdHJ1ZSB0aGUgdmlldyBpcwotICAgICAgICAgICAgIGFsbG93ZWQgdG8gdGFrZSBmb2N1cy4gIFRoaXMgdmFsdWUgZG9lcyBub3QgaW1wYWN0IHRoZSBiZWhhdmlvciBvZgotICAgICAgICAgICAgIGRpcmVjdGx5IGNhbGxpbmcge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I3JlcXVlc3RGb2N1c30sIHdoaWNoIHdpbGwKLSAgICAgICAgICAgICBhbHdheXMgcmVxdWVzdCBmb2N1cyByZWdhcmRsZXNzIG9mIHRoaXMgdmlldy4gIEl0IG9ubHkgaW1wYWN0cyB3aGVyZQotICAgICAgICAgICAgIGZvY3VzIG5hdmlnYXRpb24gd2lsbCB0cnkgdG8gbW92ZSBmb2N1cy4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImZvY3VzYWJsZSIgZm9ybWF0PSJib29sZWFuIiAvPgotCi0gICAgICAgIDwhLS0gU2V0cyB0aGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB0aGlzIHZpZXcgd2lsbCB0YWtlIGZvY3VzLiBUaGVyZSBhcmUKLSAgICAgICAgICAgICB0d28gY2hvaWNlczogIndlYWsiIG9yICJub3JtYWwiLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAibm9ybWFsIiBmb3IKLSAgICAgICAgICAgICBhbnkgZm9jdXNhYmxlIHZpZXdzLiBUaGUgZm9jdXMgdHlwZSBvbmx5IGFwcGxpZXMgaWYgdGhlIHZpZXcKLSAgICAgICAgICAgICBoYXMgYmVlbiBzZXQgdG8gYmUgZm9jdXNhYmxlLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0iZm9jdXNUeXBlIj4KLSAgICAgICAgICAgIDwhLS0gVGhpcyB2aWV3IGlzIGZvY3VzYWJsZSwgYnV0IG9ubHkgaWYgbm9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYXJlIGFscmVhZHkgZm9jdXNlZC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJub3JtYWwiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBUaGlzIHZpZXcgd2lsbCBhbHdheXMgY2xhaW0gdG8gYmUgZm9jdXNhYmxlLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9IndlYWsiIHZhbHVlPSIxIiAvPgotICAgICAgICA8L2F0dHI+Ci0gICAgICAgIAotICAgICAgICA8IS0tIENvbnRyb2xzIHRoZSBpbml0aWFsIHZpc2liaWxpdHkgb2YgdGhlIHZpZXcuICAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0idmlzaWJpbGl0eSI+Ci0gICAgICAgICAgICA8IS0tIFZpc2libGUgb24gc2NyZWVuOyB0aGUgZGVmYXVsdCB2YWx1ZS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJ2aXNpYmxlIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gTm90IGRpc3BsYXllZCwgYnV0IHRha2VuIGludG8gYWNjb3VudCBkdXJpbmcgbGF5b3V0IChzcGFjZSBpcyBsZWZ0IGZvciBpdCkuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iaW52aXNpYmxlIiB2YWx1ZT0iMSIgLz4KLSAgICAgICAgICAgIDwhLS0gQ29tcGxldGVseSBoaWRkZW4sIGFzIGlmIHRoZSB2aWV3IGhhZCBub3QgYmVlbiBhZGRlZC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJnb25lIiB2YWx1ZT0iMiIgLz4KLSAgICAgICAgPC9hdHRyPgotCi0gICAgICAgIDwhLS0gRGVmaW5lcyB3aGljaCBzY3JvbGxiYXJzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gc2Nyb2xsaW5nIG9yIG5vdC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InNjcm9sbGJhcnMiPgotICAgICAgICAgICAgPCEtLSBObyBzY3JvbGxiYXIgaXMgZGlzcGxheWVkLiAtLT4KLSAgICAgICAgICAgIDxmbGFnIG5hbWU9Im5vbmUiIHZhbHVlPSIweDAwMDAwMDAwIiAvPgotICAgICAgICAgICAgPCEtLSBEaXNwbGF5cyBob3Jpem9udGFsIHNjcm9sbGJhciBvbmx5LiAtLT4KLSAgICAgICAgICAgIDxmbGFnIG5hbWU9Imhvcml6b250YWwiIHZhbHVlPSIweDAwMDAwMTAwIiAvPgotICAgICAgICAgICAgPCEtLSBEaXNwbGF5cyB2ZXJ0aWNhbCBzY3JvbGxiYXIgb25seS4gLS0+Ci0gICAgICAgICAgICA8ZmxhZyBuYW1lPSJ2ZXJ0aWNhbCIgdmFsdWU9IjB4MDAwMDAyMDAiIC8+Ci0gICAgICAgIDwvYXR0cj4KLQotICAgICAgICA8IS0tIFNldHMgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHNjcm9sbGJhcnMgYW5kIGhlaWdodCBvZiBob3Jpem9udGFsIHNjcm9sbGJhcnMuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzY3JvbGxiYXJTaXplIiAvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkuIChjb3BpZWQgZnJvbSBUZXh0VmlldyBmb3IgdGhlIGV4dHJhIGxvY2FsaXphdGlvbikgLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InRleHQiIGZvcm1hdD0ic3RyaW5nIiBsb2NhbGl6YXRpb249InN1Z2dlc3RlZCIgLz4KLSAgICAgICAgCi0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0gb3IgYW55Ci0gICAgICAgICBvZiBpdHMgc3ViY2xhc3Nlcy4gIEFsc28gc2VlIHtAbGluayAjVmlld0dyb3VwX0xheW91dH0gZm9yCi0gICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBjbGFzcyBwcm9jZXNzZXMgaW4gaXRzIGNoaWxkcmVuLiAtLT4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0dyb3VwIj4KLSAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgYSBjaGlsZCBpcyBsaW1pdGVkIHRvIGRyYXcgaW5zaWRlIG9mIGl0cyBib3VuZHMgb3Igbm90LgotICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdpdGggYW5pbWF0aW9ucyB0aGF0IHNjYWxlIHRoZSBzaXplIG9mIHRoZSBjaGlsZHJlbiB0byBtb3JlCi0gICAgICAgICAgICAgdGhhbiAxMDAlIGZvciBpbnN0YW5jZS4gSW4gc3VjaCBhIGNhc2UsIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byBmYWxzZQotICAgICAgICAgICAgIHRvIGFsbG93IHRoZSBjaGlsZHJlbiB0byBkcmF3IG91dHNpZGUgb2YgdGhlaXIgYm91bmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZgotICAgICAgICAgICAgIHRoaXMgcHJvcGVydHkgaXMgdHJ1ZS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImNsaXBDaGlsZHJlbiIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tIERlZmluZXMgdGhlIGxheW91dCBhbmltYXRpb24gdG8gdXNlIHRoZSBmaXJzdCB0aW1lIHRoZSBWaWV3R3JvdXAgaXMgbGFpZCBvdXQuCi0gICAgICAgICAgICAgTGF5b3V0IGFuaW1hdGlvbnMgY2FuIGFsc28gYmUgc3RhcnRlZCBtYW51YWxseSBhZnRlciB0aGUgZmlyc3QgbGF5b3V0LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgYSBjaGlsZCdzIGFuaW1hdGlvbiBzaG91bGQgYmUga2VwdCB3aGVuIGl0IGlzIG92ZXIuIEtlZXBpbmcKLSAgICAgICAgICAgICB0aGUgYW5pbWF0aW9ucyBpcyB1c2VmdWwgd2l0aCBhbmltYXRpb24gd2hvc2UgZmluYWwgc3RhdGUgaXMgZGlmZmVyZW50IGZyb20KLSAgICAgICAgICAgICB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgVmlldy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggYW5pbWF0aW9uCi0gICAgICAgICAgICAgd2hvc2UgZmlsbEFmdGVyIHByb3BlcnR5IGlzIGVuYWJsZWQuIFRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlIGJ5IGRlZmF1bHQuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJwZXJzaXN0ZW50RHJhd2luZ0NhY2hlIj4KLSAgICAgICAgICAgIDwhLS0gVGhlIGRyYXdpbmcgY2FjaGUgaXMgbm90IHBlcnNpc3RlZCBhZnRlciB1c2UuIC0tPgotICAgICAgICAgICAgPGZsYWcgbmFtZT0ibm9uZSIgdmFsdWU9IjB4MCIgLz4KLSAgICAgICAgICAgIDwhLS0gVGhlIGRyYXdpbmcgY2FjaGUgaXMgcGVyc2lzdGVkIGFmdGVyIGEgbGF5b3V0IGFuaW1hdGlvbi4gLS0+Ci0gICAgICAgICAgICA8ZmxhZyBuYW1lPSJhbmltYXRpb24iIHZhbHVlPSIweDEiIC8+Ci0gICAgICAgICAgICA8IS0tIFRoZSBkcmF3aW5nIGNhY2hlIGlzIHBlcnNpc3RlZCBhZnRlciBhIHNjcm9sbC4gLS0+Ci0gICAgICAgICAgICA8ZmxhZyBuYW1lPSJzY3JvbGxpbmciIHZhbHVlPSIweDIiIC8+Ci0gICAgICAgICAgICA8IS0tIFRoZSBkcmF3aW5nIGNhY2hlIGlzIGFsd2F5cyBwZXJzaXN0ZWQuIC0tPiAgICAgICAgICAgIAotICAgICAgICAgICAgPGZsYWcgbmFtZT0iYWxsIiB2YWx1ZT0iMHgzIiAvPgotICAgICAgICA8L2F0dHI+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDwhLS0gVGhpcyBpcyB0aGUgYmFzaWMgc2V0IG9mIGxheW91dCBhdHRyaWJ1dGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwKLSAgICAgICAgIGxheW91dCBtYW5hZ2Vycy4gIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSByZXN0IG9mCi0gICAgICAgICBhIHZpZXcncyBub3JtYWwgYXR0cmlidXRlcyAoc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5SLmF0dHIjYmFja2dyb3VuZH0sCi0gICAgICAgICBidXQgd2lsbCBiZSBwYXJzZWQgYnkgdGhlIHZpZXcncyBwYXJlbnQgYW5kIGlnbm9yZWQgYnkgdGhlIGNoaWxkLgotICAgICAgICA8cD5UaGUgdmFsdWVzIGRlZmluZWQgaGVyZSBjb3JyZXNwb25kIHRvIHRoZSBiYXNlIGxheW91dCBhdHRyaWJ1dGUKLSAgICAgICAgY2xhc3Mge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zfS4gLS0+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdHcm91cF9MYXlvdXQiPgotICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgYmFzaWMgd2lkdGggb2YgdGhlIHZpZXcuICBUaGlzIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgZm9yIGFueSB2aWV3IGluc2lkZSBvZiBhIGNvbnRhaW5pbmcgbGF5b3V0IG1hbmFnZXIuICBJdHMgdmFsdWUgbWF5Ci0gICAgICAgICAgICAgYmUgYSBkaW1lbnNpb24gKHN1Y2ggYXMgIjEyZGlwIikgZm9yIGEgY29uc3RhbnQgd2lkdGggb3Igb25lIG9mCi0gICAgICAgICAgICAgdGhlIHNwZWNpYWwgY29uc3RhbnRzLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X3dpZHRoIiBmb3JtYXQ9ImRpbWVuc2lvbiI+Ci0gICAgICAgICAgICA8IS0tIFRoZSB2aWV3IHNob3VsZCBiZSBhcyBiaWcgYXMgaXRzIHBhcmVudCAobWludXMgcGFkZGluZykuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iZmlsbF9wYXJlbnQiIHZhbHVlPSItMSIgLz4KLSAgICAgICAgICAgIDwhLS0gVGhlIHZpZXcgc2hvdWxkIGJlIG9ubHkgYmlnIGVub3VnaCB0byBlbmNsb3NlIGl0cyBjb250ZW50IChwbHVzIHBhZGRpbmcpLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9IndyYXBfY29udGVudCIgdmFsdWU9Ii0yIiAvPgotICAgICAgICA8L2F0dHI+Ci0KLSAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGJhc2ljIGhlaWdodCBvZiB0aGUgdmlldy4gIFRoaXMgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICBmb3IgYW55IHZpZXcgaW5zaWRlIG9mIGEgY29udGFpbmluZyBsYXlvdXQgbWFuYWdlci4gIEl0cyB2YWx1ZSBtYXkKLSAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCBoZWlnaHQgb3Igb25lIG9mCi0gICAgICAgICAgICAgdGhlIHNwZWNpYWwgY29uc3RhbnRzLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X2hlaWdodCIgZm9ybWF0PSJkaW1lbnNpb24iPgotICAgICAgICAgICAgPCEtLSBUaGUgdmlldyBzaG91bGQgYmUgYXMgYmlnIGFzIGl0cyBwYXJlbnQgKG1pbnVzIHBhZGRpbmcpLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9ImZpbGxfcGFyZW50IiB2YWx1ZT0iLTEiIC8+Ci0gICAgICAgICAgICA8IS0tIFRoZSB2aWV3IHNob3VsZCBiZSBvbmx5IGJpZyBlbm91Z2ggdG8gZW5jbG9zZSBpdHMgY29udGVudCAocGx1cyBwYWRkaW5nKS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJ3cmFwX2NvbnRlbnQiIHZhbHVlPSItMiIgLz4KLSAgICAgICAgPC9hdHRyPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8IS0tIFRoaXMgaXMgdGhlIGJhc2ljIHNldCBvZiBsYXlvdXQgYXR0cmlidXRlcyBmb3IgbGF5b3V0IG1hbmFnZXJzIHRoYXQKLSAgICAgICAgIHdpc2ggdG8gcGxhY2UgbWFyZ2lucyBhcm91bmQgdGhlaXIgY2hpbGQgdmlld3MuCi0gICAgICAgICBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgcmVzdCBvZgotICAgICAgICAgYSB2aWV3J3Mgbm9ybWFsIGF0dHJpYnV0ZXMgKHN1Y2ggYXMge0BsaW5rIGFuZHJvaWQuUi5hdHRyI2JhY2tncm91bmR9LAotICAgICAgICAgYnV0IHdpbGwgYmUgcGFyc2VkIGJ5IHRoZSB2aWV3J3MgcGFyZW50IGFuZCBpZ25vcmVkIGJ5IHRoZSBjaGlsZC4KLSAgICAgICAgPHA+VGhlIHZhbHVlcyBkZWZpbmVkIGhlcmUgY29ycmVzcG9uZCB0byB0aGUgYmFzZSBsYXlvdXQgYXR0cmlidXRlCi0gICAgICAgIGNsYXNzIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtc30uIC0tPgotICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3R3JvdXBfTWFyZ2luTGF5b3V0Ij4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X3dpZHRoIiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXRfaGVpZ2h0IiAvPgotICAgICAgICA8IS0tICBTcGVjaWZpZXMgZXh0cmEgc3BhY2Ugb24gdGhlIGxlZnQgc2lkZSBvZiB0aGlzIHZpZXcuCi0gICAgICAgICAgICBUaGlzIHNwYWNlIGlzIG91dHNpZGUgdGhpcyB2aWV3J3MgYm91bmRzLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X21hcmdpbkxlZnQiIGZvcm1hdD0iZGltZW5zaW9uIiAgLz4KLSAgICAgICAgPCEtLSAgU3BlY2lmaWVzIGV4dHJhIHNwYWNlIG9uIHRoZSB0b3Agc2lkZSBvZiB0aGlzIHZpZXcuCi0gICAgICAgICAgICBUaGlzIHNwYWNlIGlzIG91dHNpZGUgdGhpcyB2aWV3J3MgYm91bmRzLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X21hcmdpblRvcCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+Ci0gICAgICAgIDwhLS0gIFNwZWNpZmllcyBleHRyYSBzcGFjZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGlzIHZpZXcuCi0gICAgICAgICAgICBUaGlzIHNwYWNlIGlzIG91dHNpZGUgdGhpcyB2aWV3J3MgYm91bmRzLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X21hcmdpblJpZ2h0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgIC8+Ci0gICAgICAgIDwhLS0gIFNwZWNpZmllcyBleHRyYSBzcGFjZSBvbiB0aGUgYm90dG9tIHNpZGUgb2YgdGhpcyB2aWV3LgotICAgICAgICAgICAgVGhpcyBzcGFjZSBpcyBvdXRzaWRlIHRoaXMgdmlldydzIGJvdW5kcy4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImxheW91dF9tYXJnaW5Cb3R0b20iIGZvcm1hdD0iZGltZW5zaW9uIiAgLz4KLSAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgotCi0gICAgPCEtLSBUaGlzIGlzIGEgbGluZWFyIGxheW91dC4gLS0+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkxpbmVhckxheW91dCI+Ci0gICAgICAgIDwhLS0gU2hvdWxkIHRoZSBsYXlvdXQgYmUgYSBjb2x1bW4gb3IgYSByb3c/ICBVc2UgImhvcml6b250YWwiCi0gICAgICAgICAgICAgZm9yIGEgcm93LCAidmVydGljYWwiIGZvciBhIGNvbHVtbi4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgaG9yaXpvbnRhbC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im9yaWVudGF0aW9uIiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJiYXNlbGluZUFsaWduZWQiIGZvcm1hdD0iYm9vbGVhbnxyZWZlcmVuY2UiIC8+Ci0gICAgICAgIDwhLS0gV2hlbiBhIGxpbmVhciBsYXlvdXQgaXMgcGFydCBvZiBhbm90aGVyIGxheW91dCB0aGF0IGlzIGJhc2VsaW5lCi0gICAgICAgICAgYWxpZ25lZCwgaXQgY2FuIHNwZWNpZnkgd2hpY2ggb2YgaXRzIGNoaWxkcmVuIHRvIGJhc2VsaW5lIGFsaWduIHRvCi0gICAgICAgICAgKGkuZSB3aGljaCBjaGlsZCBUZXh0VmlldykuLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgiIGZvcm1hdD0iaW50ZWdlcnxjb2xvciIgbWluPSIwIi8+Ci0gICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgbWF4aW11bSB3ZWlnaHQgc3VtLiBJZiB1bnNwZWNpZmllZCwgdGhlIHN1bSBpcyBjb21wdXRlZAotICAgICAgICAgICAgIGJ5IGFkZGluZyB0aGUgbGF5b3V0X3dlaWdodCBvZiBhbGwgb2YgdGhlIGNoaWxkcmVuLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgIHVzZWQgZm9yIGluc3RhbmNlIHRvIGdpdmUgYSBzaW5nbGUgY2hpbGQgNTAlIG9mIHRoZSB0b3RhbCBhdmFpbGFibGUKLSAgICAgICAgICAgICBzcGFjZSBieSBnaXZpbmcgaXQgYSBsYXlvdXRfd2VpZ2h0IG9mIDAuNSBhbmQgc2V0dGluZyB0aGUgd2VpZ2h0U3VtCi0gICAgICAgICAgICAgdG8gMS4wLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0id2VpZ2h0U3VtIiBmb3JtYXQ9ImZsb2F0IiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTGluZWFyTGF5b3V0X0xheW91dCI+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImxheW91dF93aWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X2hlaWdodCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X3dlaWdodCIgZm9ybWF0PSJmbG9hdCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X2dyYXZpdHkiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJUYWJsZUxheW91dCI+Ci0gICAgICAgIDwhLS0gVGhlIDAgYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbnMgdG8gc3RyZXRjaC4gVGhlIGNvbHVtbiBpbmRpY2VzCi0gICAgICAgICAgICAgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYTogMSwgMiwgNS4gSWxsZWdhbCBhbmQgZHVwbGljYXRlCi0gICAgICAgICAgICAgaW5kaWNlcyBhcmUgaWdub3JlZC4gWW91IGNhbiBzdHJldGNoIGFsbCBjb2x1bW5zIGJ5IHVzaW5nIHRoZQotICAgICAgICAgICAgIHZhbHVlICIqIiBpbnN0ZWFkLiBOb3RlIHRoYXQgYSBjb2x1bW4gY2FuIGJlIG1hcmtlZCBzdHJldGNoYWJsZQotICAgICAgICAgICAgIGFuZCBzaHJpbmthYmxlIGF0IHRoZSBzYW1lIHRpbWUuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzdHJldGNoQ29sdW1ucyIgZm9ybWF0PSJzdHJpbmciIC8+Ci0gICAgICAgPCEtLSBUaGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgY29sdW1ucyB0byBzaHJpbmsuIFRoZSBjb2x1bW4gaW5kaWNlcwotICAgICAgICAgICAgIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWE6IDEsIDIsIDUuIElsbGVnYWwgYW5kIGR1cGxpY2F0ZQotICAgICAgICAgICAgIGluZGljZXMgYXJlIGlnbm9yZWQuIFlvdSBjYW4gc2hyaW5rIGFsbCBjb2x1bW5zIGJ5IHVzaW5nIHRoZQotICAgICAgICAgICAgIHZhbHVlICIqIiBpbnN0ZWFkLiBOb3RlIHRoYXQgYSBjb2x1bW4gY2FuIGJlIG1hcmtlZCBzdHJldGNoYWJsZQotICAgICAgICAgICAgIGFuZCBzaHJpbmthYmxlIGF0IHRoZSBzYW1lIHRpbWUuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzaHJpbmtDb2x1bW5zIiBmb3JtYXQ9InN0cmluZyIgLz4gCi0gICAgICAgIDwhLS0gVGhlIDAgYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbnMgdG8gY29sbGFwc2UuIFRoZSBjb2x1bW4gaW5kaWNlcwotICAgICAgICAgICAgIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWE6IDEsIDIsIDUuIElsbGVnYWwgYW5kIGR1cGxpY2F0ZQotICAgICAgICAgICAgIGluZGljZXMgYXJlIGlnbm9yZWQuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJjb2xsYXBzZUNvbHVtbnMiIGZvcm1hdD0ic3RyaW5nIiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLQk8IS0tIFRlc3QgZm9yIGRlcHJlY2F0ZWQgYXR0cmlidXRlcy4gLS0+Ci0JPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRlcHJlY2F0ZWRUZXN0Ij4KLQkJPCEtLSBEZXByZWNhdGVkIGNvbW1lbnRzIHVzaW5nIGRlbGltaXRlcnMuCi0JCQkgSWdub3JlZC4ge0BkZXByZWNhdGVkIEluLWxpbmUgZGVwcmVjYXRlZC59IHtAaWdub3JlIElnbm9yZWR9LgotCQkgLS0+Ci0JCTxhdHRyIG5hbWU9ImRlcHJlY2F0ZWQtaW5saW5lIiAvPiAKLQotCQk8IS0tIERlcHJlY2F0ZWQgY29tbWVudHMgb24gdGhlaXIgb3duIGxpbmUuCi0JCQkgQGRlcHJlY2F0ZWQgTXVsdGktbGluZSB2ZXJzaW9uIG9mIGRlcHJlY2F0ZWQKLQkJCSAgICB0aGF0IHdvcmtzIHRpbGwgdGhlIG5leHQgdGFnLgotCQkJIEBpZ25vcmUgVGhpcyB0YWcgbXVzdCBiZSBpZ25vcmVkCi0JCSAtLT4KLQkJPGF0dHIgbmFtZT0iZGVwcmVjYXRlZC1tdWx0aWxpbmUiIC8+Ci0JCQotCQk8IS0tIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZXByZWNhdGVkLiAtLT4KLQkJPGF0dHIgbmFtZT0iZGVwcmVjYXRlZC1ub3QiIC8+Ci0JCQotICAgICAgICA8IS0tIHtAZGVwcmVjYXRlZCBUaGVyZSBpcyBubyBvdGhlciBqYXZhZG9jIGhlcmUuIH0gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImRlcHJlY2F0ZWQtbm8tamF2YWRvYyIgZm9ybWF0PSJib29sZWFuIiAvPgotCQkKLQk8L2RlY2xhcmUtc3R5bGVhYmxlPgotCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9tb2NrX2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL21vY2tfYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYTk4ZC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL21vY2tfYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgbW9ja19hbmRyb2lkLnZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3IHsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9tb2NrX2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvbW9ja19hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjQ3MGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzL3VuaXR0ZXN0cy9tb2NrX2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgbW9ja19hbmRyb2lkLnZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3R3JvdXAgZXh0ZW5kcyBWaWV3IHsKLQotICAgIHB1YmxpYyBjbGFzcyBNYXJnaW5MYXlvdXRQYXJhbXMgZXh0ZW5kcyBMYXlvdXRQYXJhbXMgewotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIExheW91dFBhcmFtcyB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvbW9ja19hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvbW9ja19hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MGE2My4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL21vY2tfYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG1vY2tfYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lYXJMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgewotCi0gICAgcHVibGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIG1vY2tfYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvdW5pdHRlc3RzL21vY2tfYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQuamF2YSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvbW9ja19hbmRyb2lkL3dpZGdldC9UYWJsZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU1ZTdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy91bml0dGVzdHMvbW9ja19hbmRyb2lkL3dpZGdldC9UYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBtb2NrX2FuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgbW9ja19hbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgY2xhc3MgVGFibGVMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgewotCi0gICAgcHVibGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIE1hcmdpbkxheW91dFBhcmFtcyB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9fbWtfaWNvbnMuc2ggYi90b29scy9lY2xpcHNlL3NjcmlwdHMvX21rX2ljb25zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2VhMzViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9fbWtfaWNvbnMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi1mdW5jdGlvbiBpY29uKCkgewotICAjICQxPWxldHRlciwgJDI9bGV0dGVyJ3MgY29sb3IgKGUuZy4gQSByZWQpLCAkMz1maWxlbmFtZQotICAuL2dlbl9pY29uLnB5ICR7M30ucG5nIDE2IHdoaXRlIGJsYWNrICQyICQxCi19Ci0KLWljb24gTSBncmVlbiAgbWFuaWZlc3QKLSAgaWNvbiBTIGJsdWUgICBzaGFyZWRVc2VySWQKLSAgaWNvbiBTIHJlZCAgICBzaWduYXR1cmUKLSAgaWNvbiBQIGdyZWVuICBwYWNrYWdlCi0KLWljb24gSSBncmVlbiAgaW5zdHJ1bWVudGF0aW9uCi0gIGljb24gRiBncmVlbiAgZnVuY3Rpb25hbFRlc3QKLSAgaWNvbiBIIGdyZWVuICBoYW5kbGVQcm9maWxpbmcKLSAgaWNvbiBJIGdyZWVuICBpY29uCi0gIGljb24gVCBncmVlbiAgdGFyZ2V0UGFja2FnZQotCi1pY29uIFUgYmx1ZSAgIHVzZXMtcGVybWlzc2lvbgotaWNvbiBQIHJlZCAgICBwZXJtaXNzaW9uCi0gIGljb24gTiBncmVlbiAgbmFtZQotICBpY29uIEwgYmx1ZSAgIGxhYmVsCi0KLWljb24gQSBibHVlICAgICBhcHBsaWNhdGlvbgotICAgIGljb24gUCByZWQgICAgcGVybWlzc2lvbgotICAgIGljb24gUCBibHVlICAgcGVyc2lzdGVudAotICAgIGljb24gUCBncmVlbiAgcHJvY2VzcwotICAgIGljb24gVCBncmVlbiAgdGFza0FmZmluaXR5Ci0gICAgaWNvbiBUIGJsdWUgICB0aGVtZQotICBpY29uIFAgcmVkICAgIHByb3ZpZGVyCi0gICAgaWNvbiBBIGdyZWVuICBhdXRob3JpdGllcwotICAgIGljb24gSSBncmVlbiAgaW5pdE9yZGVyCi0gICAgaWNvbiBNIGdyZWVuICBtdWx0aXByb2Nlc3MKLSAgICBpY29uIFIgZ3JlZW4gIHJlYWRQZXJtaXNzaW9uCi0gICAgaWNvbiBXIGdyZWVuICB3cml0ZVBlcm1pc3Npb24KLSAgICBpY29uIFMgZ3JlZW4gIHN5bmNhYmxlCi0gIGljb24gUiBncmVlbiAgcmVjZWl2ZXIKLSAgaWNvbiBTIGJsdWUgICBzZXJ2aWNlCi0gIGljb24gQSBncmVlbiAgYWN0aXZpdHkKLSAgICAgIGljb24gQyBibHVlICAgY2xlYXJPbkJhY2tncm91bmQKLSAgICAgIGljb24gQyBncmVlbiAgY29uZmlnQ2hhbmdlcwotICAgICAgaWNvbiBFIGdyZWVuICBleGNsdWRlRnJvbVJlY2VudHMKLSAgICAgIGljb24gTCBncmVlbiAgbGF1bmNoTW9kZQotICAgICAgaWNvbiBTIGdyZWVuICBzdGF0ZU5vdE5lZWRlZAotICAgIGljb24gRiBibHVlICBpbnRlbnQtZmlsdGVyCi0gICAgICAgIGljb24gUCBncmVlbiAgcHJpb3JpdHkKLSAgICAgIGljb24gQSByZWQgICAgYWN0aW9uCi0gICAgICBpY29uIEMgZ3JlZW4gIGNhdGVnb3J5Ci0gICAgICBpY29uIEQgZ3JlZW4gIGRhdGEKLSAgICAgICAgaWNvbiBNIGdyZWVuICAgIG1pbWVUeXBlCi0gICAgICAgIGljb24gUyBncmVlbiAgICBzY2hlbWUKLSAgICAgICAgaWNvbiBIIGdyZWVuICAgIGhvc3QKLSAgICAgICAgaWNvbiBQIGdyZWVuICAgIHBvcnQKLSAgICAgICAgaWNvbiBQIGJsdWUgICAgIHBhdGgKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2J1aWxkX3BsdWdpbnMuc2ggYi90b29scy9lY2xpcHNlL3NjcmlwdHMvYnVpbGRfcGx1Z2lucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY5NGNhMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NjcmlwdHMvYnVpbGRfcGx1Z2lucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIGJ1aWxkIHNjcmlwdCBmb3IgZWNsaXBzZSBhZHQgYnVpbGQgb24gbGludXggcGxhdGZvcm0KLSMKLSMgVXNhZ2U6IGRldmVsb3BtZW50L3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9idWlsZF9wbHVnaW5zIDxidWlsZF92ZXJzaW9uPiAKLSMKLSMgSXQgZXhwZWN0cyBlbnZpcm9ubWVudCB2YXJpYWJsZSBFQ0xJUFNFX0hPTUUgdG8gYmUgZGVmaW5lZCB0byBwb2ludCB0byBfeW91cl8KLSMgdmVyc2lvbiBvZiBFY2xpcHNlIFJDUCAobXVzdCBoYXZlIHRoZSBXVFAgJiBHRUYgcGx1Z2lucyBhdmFpbGFibGUgdG9vLikKLSMKLSMgSWYgRUNMSVBTRV9IT01FIGlzIG5vdCBwcm92aWRlZCwgdGhpcyBzY3JpcHQgd2lsbCBfZG93bmxvYWRfIGEgcmVmZXJlbmNlIHZlcnNpb24KLSMgb2YgRWNsaXBzZSBSQ1AgYW5kIGluc3RhbGwgaXQgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbi4KLSMgCi0jIE90aGVyIHByb3BlcnRpZXMsIGFudCBzY3JpcHRzIHRoYXQgZHJpdmUgdGhlIGJ1aWxkIGFyZSBkZWZpbmVkIGluIC4vYnVpbGRDb25maWcKLSMgQ3VycmVudGx5LCB0aGlzIHNjcmlwdCB3aWxsIGNyZWF0ZSBhbiB1cGRhdGUgc2l0ZSBhdCAke3VzZXIuaG9tZX0vd3d3L25vX2NyYXdsL2FuZHJvaWQtYnVpbGQKLSMgb3IgYXQgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgdXNpbmcgIi1kIgotCi0jIEtub3duIElzc3VlczoKLSMgLSBCdWlsZCBkb2VzIG5vdCBwcm9wZXJseSBjbGVhbiB1cCBhZnRlciBpdHNlbGYgKGJ1aWxkIHNlcnZlciBhbHdheXMgZXhlY3V0ZXMgZnJvbQotIyAgIGEgY2xlYW4gc3RhdGUuKQotIyAtIFNjcmlwdCB3aWxsIGZhaWwgaWYgY3VycmVudCBhYnNvbHV0ZSBwYXRoIGhhcyBzcGFjZXMgaW4gaXQuCi0jIC0gT25seSBsaW51eCBpcyBzdXBwb3J0ZWQgZm9yIG5vdwotCi0KLXNldCAtZSAjIGFib3J0IHRoaXMgc2NyaXB0IGVhcmx5IGlmIGFueSBjb21tYW5kIGZhaWxzCi0KLSMKLSMgLS0gVXRpbGl0eSBtZXRob2RzIC0tCi0jIAotCi1mdW5jdGlvbiBwcmludFVzYWdlKCkgewotICBlY2hvICJVc2FnZTogJDAgPGJ1aWxkX3F1YWxpZmllcj4gWy1pXSBbLWQgPGRlc3RpbmF0aW9uLWRpcmVjdG9yeT5dIFstYSA8YXJjaGl2ZVByZWZpeD5dICIKLSAgZWNobyAiPGJ1aWxkX3F1YWxpZmllcj46IGJ1aWxkIHF1YWxpZmllciBzdHJpbmciCi0gIGVjaG8gIi1pID0gYnVpbGQgaW50ZXJuYWwgc2l0ZS4gT3RoZXJ3aXNlLCBleHRlcm5hbCBzaXRlIHdpbGwgYmUgYnVpbHQiCi0gIGVjaG8gIi1kID0gZGVzdGluYXRpb24gZGlyZWN0b3J5LiBEZWZhdWx0IGlzICRVU0VSL3d3dy9ub19jcmF3bC8uIENhbm5vdCBjb250YWluIHNwYWNlcy4iCi0gIGVjaG8gIi1hID0gYXJjaGl2ZSBwcmVmaXguIENhbm5vdCBjb250YWluIHNwYWNlcy4iCi19Ci0KLWZ1bmN0aW9uIGRpZSgpIHsKLSAgZWNobyAkQAotICBleGl0IDEKLX0KLQotZnVuY3Rpb24gZGllV2l0aFVzYWdlKCkgewotICBlY2hvICRACi0gIGVjaG8KLSAgcHJpbnRVc2FnZQotICBleGl0IDEKLX0KLQotCi0jCi0jIC0tIFNldHVwIG91ciBjdXN0b20gdmVyc2lvbiBvZiBFY2xpcHNlIC0tCi0jCi0KLSMgVGhlIGRlcGVuZGVuY3kgb24gdGhlIGxpbnV4IHBsYXRmb3JtIGNvbWVzIGZyb20gYSBzZXJpZXMgb2YgZW52aXJvbm1lbnQKLSMgdmFyaWFibGVzIHRoYXQgdGhlIGVjbGlwc2UgYW50IHJ1bm5lciBleHBlY3RzLiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUKLSMgYnVpbGQucHJvcGVydGllcyBmaWxlLiBXZSBjYW4gZWFzaWx5IHN1cHBvcnQgb3RoZXIgcGxhdGZvcm1zIGJ1dCB3b3VsZCBuZWVkCi0jIHRvIG92ZXJyaWRlIHRob3NlIHZhbHVlcyBpbiB0aGlzIHNjcmlwdC4KLUhPU1Q9YHVuYW1lYAotWyAiJEhPU1QiID09ICJMaW51eCIgXSB8fCBkaWUgIkVSUk9SOiBUaGlzIHNjcmlwdCBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gTGludXggcGxhdGZvcm0iCi0KLSMgTWFrZSBzdXJlIHRoaXMgcnVucyBmcm9tIHRoZSB0b29scy9lY2xpcHNlIHBsdWdpbi4KLUQ9YGRpcm5hbWUgIiQwImAKLWNkICIkRC8uLiIKLVsgYGJhc2VuYW1lICIkUFdEImAgPT0gImVjbGlwc2UiIF0gfHwgZGllV2l0aFVzYWdlICJQbGVhc2UgcnVuIHRoaXMgc2NyaXB0IGZyb20gdGhlIGRldmljZS90b29scy9lY2xpcHNlIGRpcmVjdG9yeSIKLQotIyBjaGVjayBmb3IgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLVsgJCMgLWx0IDEgXSAmJiBkaWVXaXRoVXNhZ2UgIkVSUk9SOiBOb3QgZW5vdWdoIHBhcmFtZXRlcnMiCi0KLSMgY2hlY2sgaWYgRUNMSVBTRV9IT01FIHNldCAoRUNMSVBTRV9IT01FIGlzIHdlcmUgdGhlICJlY2xpcHNlIiBiaW5hcnkgYW5kIHRoZQotIyAicGx1Z2lucyIgc3ViLWRpcmVjdG9yeSBhcmUgbG9jYXRlZCkKLWlmIFsgLXogIiRFQ0xJUFNFX0hPTUUiIF07IHRoZW4KLSAgQkFTRV9ESVI9L2J1aWxkYm90L2VjbGlwc2UtYW5kcm9pZAotCi0gIGVjaG8gIkVDTElQU0VfSE9NRSBub3Qgc2V0LCB1c2luZyAkQkFTRV9ESVIgYXMgZGVmYXVsdCIKLQotICBpZiBbICEgLWQgIiRCQVNFX0RJUiIgXTsgdGhlbgotICAgIG1rZGlyIC1wICIkQkFTRV9ESVIiIHx8IGRpZSAiUGxlYXNlIGNyZWF0ZSBhIGRpcmVjdG9yeSAkQkFTRV9ESVIgd2hlcmUgRWNsaXBzZSB3aWxsIGJlIGluc3RhbGxlZCwgaS5lLiBleGVjdXRlICdta2RpciAtcCAkQkFTRV9ESVIgJiYgY2hvd24gJFVTRVIgJEJBU0VfRElSJy4iCi0gIGZpCi0KLSAgIyBkb3dubG9hZCB0aGUgdmVyc2lvbiBpZiBub3QgYXZhaWxhYmxlCi0gIFZFUlNJT049IjMuNC4wIgotICBCQVNFX0RJUj0iJEJBU0VfRElSLyRWRVJTSU9OIgotICBzY3JpcHRzL3NldHVwX2VjbGlwc2Uuc2ggLXAgIiRCQVNFX0RJUiIKLQotICBFQ0xJUFNFX0hPTUU9IiRCQVNFX0RJUi9lY2xpcHNlIiAgICAgICMgcGF0aCB0byBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0gIFBJRF9GSUxFPSIkQkFTRV9ESVIvZWNsaXBzZS5waWQiCi0gIFsgLWYgIiRQSURfRklMRSIgXSAmJiBFQ0xJUFNFX1BJRD1gY2F0ICIkUElEX0ZJTEUiYAotZmkKLQotZWNobyAiUFdEPWBwd2RgIgotZWNobyAiRUNMSVBTRV9IT01FPSRFQ0xJUFNFX0hPTUUiCi0KLSMKLSMgLS0gU2l0ZSBwYXJhbWV0ZXJzIGFuZCBCdWlsZCB2ZXJzaW9uIC0tCi0jCi0KLUJVSUxEX1ZFUlNJT049IiQxIiA7IHNoaWZ0Ci0KLSMgcGFyc2UgZm9yIGJ1aWxkIGludGVybmFsIHNpdGUgZmxhZy4gSWYgc2V0LCBwYXNzIGluIGludGVybmFsU2l0ZSBwcm9wZXJ0eSB0byBhbnQgc2NyaXB0cwotaWYgWyAiLWkiID09ICIkMSIgXTsgdGhlbgotICBzaGlmdAotICBlY2hvICJTZXR0aW5nIGZvciBpbnRlcm5hbCBzaXRlIGJ1aWxkIgotICBTSVRFX1BBUkFNPSItRGludGVybmFsU2l0ZT0xIC1EdXBkYXRlU2l0ZVNvdXJjZT0kUFdEL3NpdGVzL2ludGVybmFsIgotZWxzZQotICBTSVRFX1BBUkFNPSItRHVwZGF0ZVNpdGVTb3VyY2U9JFBXRC9zaXRlcy9leHRlcm5hbCIKLWZpCi0KLWlmIFsgIi1kIiA9PSAkMSBdOyB0aGVuCi0gIHNoaWZ0Ci0gIGVjaG8gIlNldHRpbmcgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvICQxIgotICBTSVRFX1BBUkFNPSIkU0lURV9QQVJBTSAtRHVwZGF0ZVNpdGVSb290PSQxIgotICBzaGlmdAotZmkKLQotaWYgWyAiLWEiID09ICIkMSIgXTsgdGhlbgotICBzaGlmdAotICBlY2hvICJTZXR0aW5nIGFyY2hpdmVQcmVmaXggdG8gJDEiCi0gIFNJVEVfUEFSQU09IiRTSVRFX1BBUkFNIC1EYXJjaGl2ZVByZWZpeD0kMSIKLSAgc2hpZnQKLWZpCi0KLQotIwotIyAtLSBDb25maWd1cmF0aW9uIGRpcmVjdG9yeSAtLQotIwotCi0jIFRoZSAiY29uZmlndXJhdGlvbiBkaXJlY3RvcnkiIHdpbGwgaG9sZCB0aGUgd29ya3NwYWNlIGZvciB0aGlzIGJ1aWxkLgotIyBJZiBpdCBjb250YWlucyBvbGQgZGF0YSB0aGUgYnVpbGQgbWF5IGZhaWwgc28gd2UgbmVlZCB0byBjbGVhbiBpdCBmaXJzdAotIyBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi1DT05GSUdfRElSPSIuLi8uLi8uLi9vdXQvZWNsaXBzZS1jb25maWd1cmF0aW9uLSRCVUlMRF9WRVJTSU9OIgotWyAtZCAiJENPTkZJR19ESVIiIF0gJiYgcm0gLXJmdiAiJENPTkZJR19ESVIiCi1ta2RpciAtcCAiJENPTkZJR19ESVIiCi0KLSMgVGhlICJidWlsZENvbmZpZyIgZGlyZWN0b3J5IGNvbnRhaW5zIG91ciBjdXN0b21pemVkIGFudCBydWxlcwotQlVJTERDT05GSUc9IiRQV0QvYnVpbGRDb25maWciCi0KLQotIwotIyAtLSBGaW5kIEVjbGlwc2UgTGF1bmNoZXIgLS0KLSMKLQotIyBHZXQgdGhlIEVjbGlwc2UgbGF1bmNoZXIgYW5kIGJ1aWxkIHNjcmlwdCB0byB1c2UKLWZ1bmN0aW9uIGZpbmRGaXJzdCgpIHsKLSAgZm9yIGkgaW4gIiRAIjsgZG8KLSAgICBpZiBbIC1mICIkaSIgXTsgdGhlbgotICAgICAgZWNobyAiJGkiCi0gICAgICByZXR1cm4KLSAgICBmaQotICBkb25lCi19Ci0KLUxBVU5DSEVSPWBmaW5kRmlyc3QgIiRFQ0xJUFNFX0hPTUUiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcl8qLmphcmAKLUJVSUxERklMRT1gZmluZEZpcnN0ICIkRUNMSVBTRV9IT01FIi9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5idWlsZF8qL3NjcmlwdHMvYnVpbGQueG1sYAotCi0jIG1ha2Ugc3VyZSB3ZSBmb3VuZCB2YWxpZCBmaWxlcwotaWYgWyAhIC1mICIkTEFVTkNIRVIiIF07IHRoZW4KLSAgZWNobyAiSW5zdGFsbGF0aW9uIEVycm9yOiBFY2xpcHNlIHBsdWdpbiBvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLi4uamFyIG5vdCBkZXRlY3RlZC4gIiBcCi0gICAgICAgIkZvdW5kICckTEFVTkNIRVInLiBBYm9ydGluZy4iCi0gIGV4aXQgMQotZmkKLWlmIFsgISAtZiAiJEJVSUxERklMRSIgXTsgdGhlbgotICBlY2hvICJJbnN0YWxsYXRpb24gRXJyb3I6IEVjbGlwc2UgYnVpbGQgZmlsZSBvcmcuZWNsaXBzZS5wZGUuYnVpbGRfLi4uL3NjcmlwdHMvYnVpbGQueG1sICIgXAotICAgICAgICJub3QgZGV0ZWN0ZWQuIEZvdW5kICckQlVJTERGSUxFJy4gQWJvcnRpbmcuIgotICBleGl0IDEKLWZpCi0KLQotIwotIyAtLSBQcmludCBjb25maWd1cmF0aW9uIHVzZWQgYW5kIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIGJ1aWxkIC0tCi0jCi0KLWVjaG8gIkVjbGlwc2UgY29uZmlndXJhdGlvbiBmb3VuZDoiCi1lY2hvICIgIEVjbGlwc2UgSG9tZTogJEVDTElQU0VfSE9NRSIKLWVjaG8gIiAgTGF1bmNoZXI6ICAgICAkTEFVTkNIRVIiCi1lY2hvICIgIEJ1aWxkIEZpbGU6ICAgJEJVSUxERklMRSIKLWVjaG8gIiAgQnVpbGQgQ29uZmlnOiAkQlVJTERDT05GSUciCi1lY2hvICIgIENvbmZpZyBEaXI6ICAgJENPTkZJR19ESVIiCi0KLSMgY2xlYW4gaW5wdXQgZGlyZWN0b3JpZXMgdG8gbWFrZSBzdXJlIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGZyb20gcHJldmlvdXMgcnVuCi0KLXJtIC1mdiAqLnByb3BlcnRpZXMgKi54bWwKLWZpbmQgLiAtbmFtZSAiQCoiIHwgeGFyZ3Mgcm0gLXJmdgotCi0jIE5vdyBleGVjdXRlIHRoZSBhbnQgcnVubmVyCi0KLXNldCArZSAgIyBkb24ndCBzdG9wIG9uIGVycm9ycyBhbnltb3JlLCB3ZSB3YW50IHRvIGNhdGNoIHRoZXJlIGhlcmUKLQotamF2YSBcCi0gIC1qYXIgJExBVU5DSEVSIFwKLSAgLWRhdGEgIiRDT05GSUdfRElSIiBcCi0gIC1jb25maWd1cmF0aW9uICIkQ09ORklHX0RJUiIgXAotICAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIFwKLSAgLWJ1aWxkZmlsZSAkQlVJTERGSUxFIFwKLSAgLURidWlsZGVyPSRCVUlMRENPTkZJRyBcCi0gIC1EYnVpbGREaXJlY3Rvcnk9JFBXRCBcCi0gIC1EZm9yY2VDb250ZXh0UXVhbGlmaWVyPSRCVUlMRF9WRVJTSU9OIFwKLSAgLURFQ0xJUFNFX0hPTUU9JEVDTElQU0VfSE9NRSBcCi0gICRTSVRFX1BBUkFNCi1SRVNVTFQ9JD8KLQotaWYgWyAiMCIgIT0gIiRSRVNVTFQiIF07IHRoZW4KLSAgICBlY2hvICJKQVZBIGRpZWQgd2l0aCBlcnJvciBjb2RlICRSRVNVTFQiCi0gICAgZWNobyAiRHVtcCBvZiBidWlsZCBjb25maWcgbG9nczoiCi0gICAgZm9yIGkgaW4gIiRDT05GSUdfRElSIi8qLmxvZzsgZG8KLSAgICAgICAgaWYgWyAtZiAiJGkiIF07IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgICAgICAgICBlY2hvICItLS0gJGkiCi0gICAgICAgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgY2F0ICIkaSIKLSAgICAgICAgICAgIGVjaG8KLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi0jCi0jIC0tIENsZWFudXAKLSMKLQotaWYgWyAtbiAiJEVDTElQU0VfUElEIiBdICYmIFsgLWYgIiRQSURfRklMRSIgXTsgdGhlbgotICBybSAtZnYgIiRQSURfRklMRSIKLSAga2lsbCAtOSAiJEVDTElQU0VfUElEIgotZmkKLQotIyB3ZSdyZSBkb25lIQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2J1aWxkX3NlcnZlci5zaCBiL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9idWlsZF9zZXJ2ZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5YzhkY2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2J1aWxkX3NlcnZlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBFbnRyeSBwb2ludCB0byBidWlsZCB0aGUgRWNsaXBzZSBwbHVnaW5zIGZvciB0aGUgYnVpbGQgc2VydmVyLgotIwotIyBJbnB1dCBwYXJhbWV0ZXJzOgotIyAkMTogKk1hbmRhdG9yeSogZGVzdGluYXRpb24gZGlyZWN0b3J5LiBNdXN0IGFscmVhZHkgZXhpc3QuIENhbm5vdCBjb250YWluIHNwYWNlcy4KLSMgJDI6IE9wdGlvbmFsIGJ1aWxkIG51bWJlci4gSWYgcHJlc2VudCwgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZGF0ZSBxdWFsaWZpZXIuCi0jICAgICBUaGUgYnVpbGQgbnVtYmVyIGNhbm5vdCBjb250YWluIHNwYWNlcyAqbm9yKiBwZXJpb2RzIChkYXNoZXMgYXJlIG9rLikKLSMgLXo6IE9wdGlvbmFsLCBwcmV2ZW50cyB0aGUgZmluYWwgemlwIGFuZCBsZWF2ZXMgdGhlIHVkYXRlLXNpdGUgZGlyZWN0b3J5IGludGFjdC4KLSMgLWk6IE9wdGlvbmFsLCBpZiBwcmVzZW50LCB0aGUgR29vZ2xlIGludGVybmFsIHVwZGF0ZSBzaXRlIHdpbGwgYmUgYnVpbHQuIE90aGVyd2lzZSwgCi0jICAgICB0aGUgZXh0ZXJuYWwgc2l0ZSB3aWxsIGJlIGJ1aWx0Ci0jIFdvcmtmbG93OgotIyAtIG1ha2UgZHgsIGRkbXMsIHBpbmcKLSMgLSBjcmVhdGUgc3ltbGlua3MgKGZvciBlY2xpcHNlIGNvZGUgcmVvcmcsIGZvciBkZG1zLCBwaW5nKQotIyAtIGNhbGwgdGhlIGFjdHVhbCBidWlsZGVyIHNjcmlwdCBmcm9tIEJyZXR0Ci0jIC0gemlwIHJlc3VsdGluZyBzdHVmZiBhbmQgbW92ZSB0byAkREVTVAotIyBOb3RlOiBjdXJyZW50bHkgd3JhcCBhcm91bmQgZXhpc3Rpbmcgc2hlbGwgc2NyaXB0LCByZXVzZSBtb3N0IG9mIGl0LAotIyBldmVudHVhbGx5IGJvdGggbWlnaHQgbWVyZ2UgYXMgbmVlZGVkLgotCi1zZXQgLWUgICMgRmFpbCB0aGlzIHNjcmlwdCBhcyBzb29uIGFzIGEgY29tbWFuZCBmYWlscyAtLSBmYWlsIGVhcmx5LCBmYWlsIGZhc3QKLQotREVTVF9ESVI9IiIKLUJVSUxEX05VTUJFUj0iIgotQ1JFQVRFX1pJUD0iMSIKLUlOVEVSTkFMX0JVSUxEPSIiCi0KLWZ1bmN0aW9uIGdldF9wYXJhbXMoKSB7Ci0gICMgcGFyc2UgaW5wdXQgcGFyYW1ldGVycwotICB3aGlsZSBbICQjIC1ndCAwIF07IGRvCi0gICAgaWYgWyAiJDEiID09ICIteiIgXTsgdGhlbgotICAgICAgQ1JFQVRFX1pJUD0iIgotICAgIGVsaWYgWyAiJDEiID09ICItaSIgXTsgdGhlbgotICAgICAgSU5URVJOQUxfQlVJTEQ9Ii1pIgotICAgIGVsaWYgWyAiJDEiICE9ICIiIF0gJiYgWyAteiAiJERFU1RfRElSIiBdOyB0aGVuCi0gICAgICBERVNUX0RJUj0iJDEiCi0gICAgZWxpZiBbICIkMSIgIT0gIiIgXSAmJiBbIC16ICIkQlVJTERfTlVNQkVSIiBdOyB0aGVuCi0gICAgICBCVUlMRF9OVU1CRVI9IiQxIgotICAgIGZpCi0gICAgc2hpZnQKLSAgZG9uZQotfQotCi1mdW5jdGlvbiBkaWUoKSB7Ci0gIGVjaG8gIkVycm9yOiIgJCoKLSAgZWNobyAiQWJvcnRpbmciCi0gIGV4aXQgMQotfQotCi1mdW5jdGlvbiBjaGVja19wYXJhbXMoKSB7Ci0gICMgVGhpcyBuZWVkcyB0byBydW4gZnJvbSB0aGUgdG9wIGFuZHJvaWQgZGlyZWN0b3J5Ci0gICMgQXV0b21hdGljYWxseSBDRCB0byB0aGUgdG9wIGFuZHJvaWQgZGlyZWN0b3J5LCB3aGF0ZXZlciBpdHMgbmFtZQotICBEPWBkaXJuYW1lICIkMCJgCi0gIGNkICIkRC8uLi8uLi8uLi8uLi8iICYmIGVjaG8gIlN3aXRjaGVkIHRvIGRpcmVjdG9yeSAkUFdEIgotCi0gICMgVGhlIGN1cnJlbnQgRWNsaXBzZSBidWlsZCBoYXMgc29tZSBMaW51eCBkZXBlbmRlbmN5IGluIGl0cyBjb25maWcgZmlsZXMKLSAgWyBgdW5hbWVgID09ICJMaW51eCIgXSB8fCBkaWUgIlRoaXMgbXVzdCBydW4gZnJvbSBhIExpbnV4IGJveC4iCi0KLSAgIyBDaGVjayBkZXN0IGRpciBleGlzdHMKLSAgWyAtbiAiJERFU1RfRElSIiBdIHx8IGRpZSAiVXNhZ2U6ICQwIDxkZXN0aW5hdGlvbi1kaXJlY3Rvcnk+IFtidWlsZC1udW1iZXJdIgotICBbIC1kICIkREVTVF9ESVIiIF0gfHwgZGllICJEZXN0aW5hdGlvbiBkaXJlY3RvcnkgJERFU1RfRElSIG11c3QgZXhpc3QuIgotfQotCi1mdW5jdGlvbiBidWlsZF9saWJzKCkgewotICBNQUtFX09QVD0iLWo4IgotICBlY2hvICIqKiogQnVpbGRpbmc6IG1ha2UgJE1BS0VfT1BUIGR4IHBpbmcgZGRtcyBqYXJ1dGlscyBhbmRyb2lkcHJlZnMgbGF5b3V0bGliX2FwaSBuaW5lcGF0Y2ggc2RrbGliIHNka3VpbGliIgotICBtYWtlICRNQUtFX09QVCBkeCBwaW5nIGRkbXMgamFydXRpbHMgYW5kcm9pZHByZWZzIGxheW91dGxpYl9hcGkgbGF5b3V0bGliX3V0aWxzIG5pbmVwYXRjaCBzZGtsaWIgc2RrdWlsaWIKLX0KLQotZnVuY3Rpb24gYnVpbGRfcGx1Z2luIHsKLSAgZGV2ZWxvcG1lbnQvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2NyZWF0ZV9hbGxfc3ltbGlua3Muc2gKLQotICAjIFF1YWxpZmllciBpcyAidiIgZm9sbG93ZWQgYnkgZGF0ZS90aW1lIGluIFlZWVlNTURESEhTUyBmb3JtYXQgYW5kIHRoZSBvcHRpb25hbAotICAjIGJ1aWxkIG51bWJlci4KLSAgREFURT1gZGF0ZSArdiVZJW0lZCVIJU1gCi0gIFFVQUxJRklFUj0iJERBVEUiCi0gIFsgLW4gIiRCVUlMRF9OVU1CRVIiIF0gJiYgUVVBTElGSUVSPSIke1FVQUxJRklFUn0tJHtCVUlMRF9OVU1CRVJ9IgotCi0gICMgQ29tcHV0ZSB0aGUgZmluYWwgZGlyZWN0b3J5IG5hbWUgYW5kIHJlbW92ZSBhbnkgbGVmdG92ZXJzIGZyb20gcHJldmlvdXMKLSAgIyBydW5zIGlmIGFueS4KLSAgQlVJTERfUFJFRklYPSJhbmRyb2lkLWVjbGlwc2UiICAKLSAgaWYgWyAiJElOVEVSTkFMX0JVSUxEIiBdOyB0aGVuCi0gICAgIyBhcHBlbmQgJ2VuZycgc2lnbmlmaWVyIHRvIGVuZCBvZiBhcmNoaXZlIG5hbWUgdG8gZGVub3RlIGludGVybmFsIGJ1aWxkCi0gICAgQlVJTERfUFJFRklYPSIke0JVSUxEX1BSRUZJWH0tZW5nIgotICBmaSAgCi0KLSAgIyBleGNsdWRlIGRhdGUgZnJvbSBidWlsZC16aXAgbmFtZSBzbyBpdCBjYW4gYmUgYXV0by1jYWxjdWxhdGVkIGJ5IGNvbnRpbnVvdXMKLSAgIyB0ZXN0IHByb2Nlc3MgdW5sZXNzIHRoZXJlJ3Mgbm8gYnVpbGQgbnVtYmVyLCBpbiB3aGljaCBjYXNlIHRoZSBkYXRlIGlzCi0gICMgc3RpbGwgdXNlZCAodXNlZnVsIGZvciB0ZXN0aW5nKQotICBaSVBfTkFNRT0iJHtCVUlMRF9QUkVGSVh9LSR7QlVJTERfTlVNQkVSOi0kREFURX0uemlwIgotICBbIC1kICIkREVTVF9ESVIvJEJVSUxEX1BSRUZJWCIgXSB8fCBybSAtcmZ2ICIkREVTVF9ESVIvJEJVSUxEX1BSRUZJWCIKLQotICAjIFBlcmZvcm0gdGhlIEVjbGlwc2UgYnVpbGQgYW5kIG1vdmUgdGhlIHJlc3VsdCBpbiAkREVTVF9ESVIvYW5kcm9pZC1idWlsZAotICBkZXZlbG9wbWVudC90b29scy9lY2xpcHNlL3NjcmlwdHMvYnVpbGRfcGx1Z2lucy5zaCAkUVVBTElGSUVSICRJTlRFUk5BTF9CVUlMRCAtZCAiJERFU1RfRElSIiAtYSAiJEJVSUxEX1BSRUZJWCIKLQotICAjIENsZWFudXAKLSAgWyAtZCAiJFFVQUxJRklFUiIgXSAmJiBybSAtcmZ2ICIkUVVBTElGSUVSIgotCi0gIGlmIFsgIiRDUkVBVEVfWklQIiBdOyB0aGVuCi0gICAgIyBUaGUgcmVzdWx0IGlzIGEgZnVsbCB1cGRhdGUtc2l0ZSB1bmRlciAkREVTVF9ESVIvQlVJTERfUFJFRklYCi0gICAgIyBaaXAgaXQgYW5kIHJlbW92ZSB0aGUgZGlyZWN0b3J5LgotICAgIGVjaG8gIioqKiogUGFja2FnZSBpbiAkREVTVF9ESVIiCi0gICAgWyAtZCAiJERFU1RfRElSLyRCVUlMRF9QUkVGSVgiIF0gfHwgXAotICAgICAgZGllICJCdWlsZCBmYWlsZWQgdG8gcHJvZHVjZSAkREVTVF9ESVIvJEJVSUxEX1BSRUZJWCIKLSAgICBjZCAiJERFU1RfRElSIgotICAgIFsgLWYgIiRaSVBfTkFNRSIgXSAmJiBybSAtcmZ2ICIkWklQX05BTUUiCi0gICAgY2QgIiRCVUlMRF9QUkVGSVgiCi0gICAgemlwIC05ciAiLi4vJFpJUF9OQU1FIiAqCi0gICAgY2QgLi4gIyBiYWNrIHRvICRERVNUX0RJUgotICAgIHJtIC1yZnYgIiRCVUlMRF9QUkVGSVgiICAjIHJlbW92ZXMgdGhlIGRpcmVjdG9yeSwgbm90IHRoZSB6aXAKLSAgICBlY2hvICJaSVAgb2YgVXBkYXRlIHNpdGUgYXZhaWxhYmxlIGF0ICRERVNUX0RJUi8ke1pJUF9OQU1FfSIKLSAgZWxzZQotICAgIGVjaG8gIlVwZGF0ZSBzaXRlIGF2YWlsYWJsZSBpbiAkREVTVF9ESVIvJEJVSUxEX1BSRUZJWCIKLSAgZmkKLX0KLQotZ2V0X3BhcmFtcyAiJEAiCi1jaGVja19wYXJhbXMKLWJ1aWxkX2xpYnMKLWJ1aWxkX3BsdWdpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2J1aWxkX3VwZGF0ZV9zaXRlLnNoIGIvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2J1aWxkX3VwZGF0ZV9zaXRlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTk4NzU2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9idWlsZF91cGRhdGVfc2l0ZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIEVudHJ5IHBvaW50IHRvIGJ1aWxkIHRoZSBFY2xpcHNlIHBsdWdpbnMgZm9yIGxvY2FsIGRlcGxveW1lbnQuCi0jCi0jIElucHV0IHBhcmFtZXRlcnM6Ci0jICQxOiBPcHRpb25hbCBidWlsZCBudW1iZXIuIElmIHByZXNlbnQsIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGRhdGUgcXVhbGlmaWVyLgotIyAgICAgVGhlIGJ1aWxkIG51bWJlciBjYW5ub3QgY29udGFpbiBzcGFjZXMgKm5vciogcGVyaW9kcyAoZGFzaGVzIGFyZSBvay4pCi0jIC1pOiBPcHRpb25hbCwgaWYgcHJlc2VudCwgdGhlIEdvb2dsZSBpbnRlcm5hbCB1cGRhdGUgc2l0ZSB3aWxsIGJlIGJ1aWx0LiBPdGhlcndpc2UsIAotIyAgICAgdGhlIGV4dGVybmFsIHNpdGUgd2lsbCBiZSBidWlsdAotIwotIyBXb3JrZmxvdzoKLSMgLSBjYWxscyBidWlsZHNlcnZlciB3aXRoIC9ob21lLyRVU0VSL3d3dy9ub19jcmF3bCBhbmQgLXoKLSMgICB0byBidWlsZCBhbmQgY3JlYXRlIHRoZSB1cGRhdGUgc2l6ZSBidXQgZG8gbm90IHppcCBpdCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCi1zZXQgLWUgICMgRmFpbCB0aGlzIHNjcmlwdCBhcyBzb29uIGFzIGEgY29tbWFuZCBmYWlscyAtLSBmYWlsIGVhcmx5LCBmYWlsIGZhc3QKLQotRD1gZGlybmFtZSAkMGAKLUJVSUxEX05VTUJFUj0iIgotSU5URVJOQUxfQlVJTEQ9IiIKLSMgcGFyc2UgaW5wdXQgcGFyYW1ldGVycwotd2hpbGUgWyAkIyAtZ3QgMCBdOyBkbwotICBpZiBbICIkMSIgPT0gIi1pIiBdOyB0aGVuCi0gICAgSU5URVJOQUxfQlVJTEQ9Ii1pIgotICBlbGlmIFsgIiQxIiAhPSAiIiBdOyB0aGVuCi0gICAgQlVJTERfTlVNQkVSPSIkMSIKLSAgZmkKLSAgc2hpZnQKLWRvbmUKLQotREVTVF9ESVI9IiRIT01FIgotWyAteiAiJERFU1RfRElSIiBdICYmIFsgLW4gIiRVU0VSIiBdICYmIERFU1RfRElSPSIvaG9tZS8kVVNFUiIKLVsgLXogIiRERVNUX0RJUiIgXSAmJiBERVNUX0RJUj0ifiIKLURFU1RfRElSPSIkREVTVF9ESVIvd3d3L25vX2NyYXdsIgotCi0iJEQvYnVpbGRfc2VydmVyLnNoIiAiJERFU1RfRElSIiAiJEJVSUxEX05VTUJFUiIgLXogIiRJTlRFUk5BTF9CVUlMRCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jb2xsZWN0X3NvdXJjZXNfZm9yX3Nkay5weSBiL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jb2xsZWN0X3NvdXJjZXNfZm9yX3Nkay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzczMDcwYi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NjcmlwdHMvY29sbGVjdF9zb3VyY2VzX2Zvcl9zZGsucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24KLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0iIiIKLURlc2NyaXB0aW9uOgotICAgVGhpcyBzY3JpcHQgY29sbGVjdHMgYWxsIGZyYW1ld29yayBKYXZhIHNvdXJjZXMgZnJvbSB0aGUgY3VycmVudCBhbmRyb2lkCi0gICBzb3VyY2UgY29kZSBhbmQgcGxhY2VzIHRoZW0gaW4gYSBzb3VyY2UgZm9sZGVyIHN1aXRhYmxlIGZvciB0aGUgZWNsaXBzZSBBRFQKLSAgIHBsdWdpbi4KLQotU2VlIHVzYWdlKCkgYmVsb3cuCi0KLUNvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKS4KLSIiIgotCi1pbXBvcnQgcmUKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IGdldG9wdAotaW1wb3J0IHNodXRpbAotCi1fUkVfUEtHID0gcmUuY29tcGlsZSgiXlxzKnBhY2thZ2VccysoW15ccztdKylccyo7LioiKQotCi0jIEhvbGRzIGNtZC1saW5lIGFyZ3VtZW50cwotY2xhc3MgUGFyYW1zKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLkRSWSA9IEZhbHNlCi0gICAgICAgIHNlbGYuRElSID0gImZyYW1ld29ya3MiCi0gICAgICAgIHNlbGYuU1JDID0gTm9uZQotICAgICAgICBzZWxmLkRTVCA9IE5vbmUKLSAgICAgICAgc2VsZi5DTlRfVVNFRCA9IDAKLSAgICAgICAgc2VsZi5DTlRfTk9QS0cgPSAwCi0KLQotIyBQcmludHMgYSB1c2FnZSBzdW1tYXJ5Ci1kZWYgdXNhZ2UoZXJyb3I9Tm9uZSk6Ci0gICAgcHJpbnQgIiIiCi0gRGVzY3JpcHRpb246Ci0gICBUaGlzIHNjcmlwdCBjb2xsZWN0cyBhbGwgZnJhbWV3b3JrIEphdmEgc291cmNlcyBmcm9tIHRoZSBjdXJyZW50IGFuZHJvaWQKLSAgIHNvdXJjZSBjb2RlIGFuZCBwbGFjZXMgdGhlbSBpbiBhIHNvdXJjZSBmb2xkZXIgc3VpdGFibGUgZm9yIHRoZSBlY2xpcHNlIEFEVAotICAgcGx1Z2luLgotCi0gVXNhZ2U6Ci0gICAlcyBbLW5dIDxhbmRyb2lkLWdpdC1yZXBvIHJvb3Q+IDxzZGsvcGxhdGZvcm1zL3h5ei9zb3VyY2VzPgotIAotIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzIG11c3QgYWxyZWFkeSBleGlzdC4KLSBVc2UgLW4gZm9yIGEgZHJ5LXJ1bi4KLQotIiIiICUgc3lzLmFyZ3ZbMF0KLQotICAgIGlmIGVycm9yOgotICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJFcnJvcjoiLCBlcnJvcgotCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3MsIHJldHVybnMgYSBQYXJhbXMgaW5zdGFuY2Ugb3Igc3lzLmV4aXQoMikgb24gZXJyb3IKLSMgYWZ0ZXIgcHJpbnRpbmcgdGhlIGVycm9yIGFuZCB0aGUgdXNhZ2UuCi1kZWYgcGFyc2VBcmdzKGFyZ3YpOgotICAgIHAgPSBQYXJhbXMoKQotICAgIGVycm9yID0gTm9uZQotICAgIAotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndlsxOl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICItLWRyeSIsICItLXNvdXJjZWRpcj0iIF0pCi0gICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciwgZToKLSAgICAgICAgZXJyb3IgPSBzdHIoZSkKLQotICAgIGlmIGVycm9yIGlzIE5vbmU6Ci0gICAgICAgIGZvciBvLCBhIGluIG9wdHM6Ci0gICAgICAgICAgICBpZiBvIGluIFsgIi1uIiwgIi0tZHJ5IiBdOgotICAgICAgICAgICAgICAgIHAuRFJZID0gVHJ1ZQotICAgICAgICAgICAgZWxpZiBvIGluIFsgIi1zIiwgIi0tc291cmNlZGlyIiBdOgotICAgICAgICAgICAgICAgIHAuRElSID0gYQotCi0gICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgotICAgICAgICAgICAgZXJyb3IgPSAiTWlzc2luZyBhcmd1bWVudHM6IDxzb3VyY2U+IDxkZXN0PiIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHAuU1JDID0gYXJnc1swXQotICAgICAgICAgICAgcC5EU1QgPSBhcmdzWzFdCi0KLSAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHAuU1JDKToKLSAgICAgICAgICAgICAgICBlcnJvciA9ICIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgcC5TUkMKLSAgICAgICAgICAgIGVsaWYgbm90IG9zLnBhdGguaXNkaXIocC5EU1QpOgotICAgICAgICAgICAgICAgIGVycm9yID0gIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBwLkRTVAotCi0gICAgaWYgZXJyb3I6Ci0gICAgICAgIHVzYWdlKGVycm9yKQotICAgICAgICBzeXMuZXhpdCgyKQotCi0gICAgcmV0dXJuIHAKLQotCi0jIFJlY3Vyc2l2ZWx5IHBhcnNlcyB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFuZCBwcm9jZXNzIGphdmEgZmlsZXMgZm91bmQKLWRlZiBwYXJzZVNyY0RpcihwLCBzcmNkaXIpOgotICAgIGZvciBmIGluIG9zLmxpc3RkaXIoc3JjZGlyKToKLSAgICAgICAgZnAgPSBvcy5wYXRoLmpvaW4oc3JjZGlyLCBmKQotICAgICAgICBpZiBmLmVuZHN3aXRoKCIuamF2YSIpIGFuZCBvcy5wYXRoLmlzZmlsZShmcCk6Ci0gICAgICAgICAgICBwa2cgPSBjaGVja0phdmFGaWxlKGZwKQotICAgICAgICAgICAgaWYgcGtnOgotICAgICAgICAgICAgICAgIHBrZyA9IHBrZy5yZXBsYWNlKCIuIiwgb3MucGF0aC5zZXApICAjIGUuZy4gYW5kcm9pZC52aWV3ID0+IGFuZHJvaWQvdmlldwotICAgICAgICAgICAgICAgIGNvcHkocCwgZnAsIGYsIHBrZykKLSAgICAgICAgICAgICAgICBwLkNOVF9VU0VEICs9IDEgICAjIG9uZSBtb3JlIGNvcGllZAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwLkNOVF9OT1BLRyArPSAxICAjIHRoaXMgamF2YSBmaWxlIGxhY2tlZCBhIHBhY2thZ2UgZGVjbGFyYXRpb24KLSAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZwKToKLSAgICAgICAgICAgIHBhcnNlU3JjRGlyKHAsIGZwKQotCi0KLSMgQ2hlY2sgYSBqYXZhIGZpbGUgdG8gZmluZCBpdHMgcGFja2FnZSBkZWNsYXJhdGlvbiwgaWYgYW55Ci1kZWYgY2hlY2tKYXZhRmlsZShwYXRoKToKLSAgICBwcmludCAiUHJvY2VzcyIsIHBhdGgKLQotICAgIHRyeToKLSAgICAgICAgZiA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IGZpbGUocGF0aCkKLSAgICAgICAgICAgIGZvciBsIGluIGYucmVhZGxpbmVzKCk6Ci0gICAgICAgICAgICAgICAgbSA9IF9SRV9QS0cubWF0Y2gobCkKLSAgICAgICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5ncm91cCgxKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgcGFzcwotCi0gICAgcmV0dXJuIE5vbmUKLQotIyBDcmVhdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGJhc2VkIG9uIHBhY2thZ2UgbmFtZSB0aGVuIGNvcHkgdGhlCi0jIHNvdXJjZSBmaWxlIGluIHRoZXJlCi1kZWYgY29weShwLCBmcCwgZiwgcGtnKToKLSAgICBkc3RkaXIgPSBvcy5wYXRoLmpvaW4ocC5EU1QsIHBrZykKLSAgICBfbWtkaXIocCwgZHN0ZGlyKQotICAgIF9jcChwLCBmcCwgb3MucGF0aC5qb2luKGRzdGRpciwgZikpCi0KLWRlZiBfbWtkaXIocCwgZGlyKToKLSAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXIpOgotICAgICAgICBpZiBwLkRSWToKLSAgICAgICAgICAgIHByaW50ICJta2RpciIsIGRpcgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlyKQotCi1kZWYgX2NwKHAsIHNyYywgZHN0KToKLSAgICBpZiBwLkRSWToKLSAgICAgICAgcHJpbnQgImNwIiwgc3JjLCBkc3QKLSAgICBlbHNlOgotICAgICAgICBzaHV0aWwuY29weWZpbGUoc3JjLCBkc3QpCi0KLQotZGVmIG1haW4oKToKLSAgICBwID0gcGFyc2VBcmdzKHN5cy5hcmd2KQotICAgIHBhcnNlU3JjRGlyKHAsIG9zLnBhdGguam9pbihwLlNSQywgcC5ESVIpKQotICAgIHByaW50ICIlZCBqYXZhIGZpbGVzIGNvcGllZCIgJSBwLkNOVF9VU0VECi0gICAgaWYgcC5DTlRfTk9QS0c6IHByaW50ICIlZCBqYXZhIGZpbGVzIGlnbm9yZWQgKG5vIHBhY2thZ2UpIiAlIHAuQ05UX05PUEtHCi0gICAgaWYgcC5EUlk6IHByaW50ICJUaGlzIHdhcyBpbiAqRFJZKiBtb2RlLiBObyBjb3BpZXMgZG9uZS4iCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX2FkdF9zeW1saW5rcy5zaCBiL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jcmVhdGVfYWR0X3N5bWxpbmtzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2ViMTkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jcmVhdGVfYWR0X3N5bWxpbmtzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyEvYmluL2Jhc2gKLWZ1bmN0aW9uIGRpZSgpIHsKLSAgICBlY2hvICJFcnJvcjogJCoiCi0gICAgZXhpdCAxCi19Ci0KLXNldCAtZSAjIGZhaWwgZWFybHkKLQotIyBDRCB0byB0aGUgdG9wIGFuZHJvaWQgZGlyZWN0b3J5Ci1EPWBkaXJuYW1lICIkMCJgCi1jZCAiJEQvLi4vLi4vLi4vLi4vIgotCi1ERVNUPSJkZXZlbG9wbWVudC90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0IgotIyBjb21wdXRlcyAiLi4vLi4iIGZyb20gREVTVCB0byBoZXJlIChpbiAvYW5kcm9pZCkKLUJBQ0s9YGVjaG8gJERFU1QgfCBzZWQgJ3NAW14vXSpALi5AZydgCi0KLUxJQlM9InNka3N0YXRzIGphcnV0aWxzIGFuZHJvaWRwcmVmcyBsYXlvdXRsaWJfYXBpIGxheW91dGxpYl91dGlscyBuaW5lcGF0Y2ggc2RrbGliIHNka3VpbGliIgotCi1lY2hvICJtYWtlIGphdmEgbGlicyAuLi4iCi1tYWtlIC1qMyBzaG93Y29tbWFuZHMgJExJQlMgfHwgZGllICJBRFQ6IEZhaWwgdG8gYnVpbGQgb25lIG9mICRMSUJTLiIKLQotZWNobyAiQ29weWluZyBqYXZhIGxpYnMgdG8gJERFU1QiCi0KLUhPU1Q9YHVuYW1lYAotaWYgWyAiJEhPU1QiID09ICJMaW51eCIgXTsgdGhlbgotICAgIGZvciBMSUIgaW4gJExJQlM7IGRvCi0gICAgICAgIGxuIC1zdmYgJEJBQ0svb3V0L2hvc3QvbGludXgteDg2L2ZyYW1ld29yay8kTElCLmphciAiJERFU1QvIgotICAgIGRvbmUKLSAgICBsbiAtc3ZmICRCQUNLL291dC9ob3N0L2xpbnV4LXg4Ni9mcmFtZXdvcmsva3htbDItMi4zLjAuamFyICIkREVTVC8iCi0gICAgbG4gLXN2ZiAkQkFDSy9vdXQvaG9zdC9saW51eC14ODYvZnJhbWV3b3JrL2NvbW1vbnMtY29tcHJlc3MtMS4wLmphciAiJERFU1QvIgotICAKLWVsaWYgWyAiJEhPU1QiID09ICJEYXJ3aW4iIF07IHRoZW4KLSAgICBmb3IgTElCIGluICRMSUJTOyBkbwotICAgICAgICBsbiAtc3ZmICRCQUNLL291dC9ob3N0L2Rhcndpbi14ODYvZnJhbWV3b3JrLyRMSUIuamFyICIkREVTVC8iCi0gICAgZG9uZQotICAgIGxuIC1zdmYgJEJBQ0svb3V0L2hvc3QvZGFyd2luLXg4Ni9mcmFtZXdvcmsva3htbDItMi4zLjAuamFyICIkREVTVC8iCi0gICAgbG4gLXN2ZiAkQkFDSy9vdXQvaG9zdC9kYXJ3aW4teDg2L2ZyYW1ld29yay9jb21tb25zLWNvbXByZXNzLTEuMC5qYXIgIiRERVNULyIKLQotZWxpZiBbICIke0hPU1Q6MDo2fSIgPT0gIkNZR1dJTiIgXTsgdGhlbgotICAgIGZvciBMSUIgaW4gJExJQlM7IGRvCi0gICAgICAgIGNwIC12ZiAgb3V0L2hvc3Qvd2luZG93cy14ODYvZnJhbWV3b3JrLyRMSUIuamFyICIkREVTVC8iCi0gICAgZG9uZQotCi0gICAgaWYgWyAhIC1mICIkREVTVC9reG1sMi0yLjMuMC5qYXIiIF07IHRoZW4KLSAgICAgICAgY3AgLXYgInByZWJ1aWx0L2NvbW1vbi9reG1sMi9reG1sMi0yLjMuMC5qYXIiICIkREVTVC8iCi0gICAgZmkKLQotICAgIGlmIFsgISAtZiAiJERFU1QvY29tbW9ucy1jb21wcmVzcy0xLjAuamFyIiBdOyB0aGVuCi0gICAgICAgIGNwIC12ICJwcmVidWlsdC9jb21tb24vY29tbW9ucy1jb21wcmVzcy9jb21tb25zLWNvbXByZXNzLTEuMC5qYXIiICIkREVTVC8iCi0gICAgZmkKLQotICAgIGNobW9kIC12IGErcnggIiRERVNUIi8qLmphcgotZWxzZQotICAgIGVjaG8gIlVuc3VwcG9ydGVkIHBsYXRmb3JtICgkSE9TVCkuIE5vdGhpbmcgZG9uZS4iCi1maQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX2FsbF9zeW1saW5rcy5zaCBiL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jcmVhdGVfYWxsX3N5bWxpbmtzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkY2JjNWIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jcmVhdGVfYWxsX3N5bWxpbmtzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotSE9TVD1gdW5hbWVgCi1pZiBbICIke0hPU1Q6MDo2fSIgPT0gIkNZR1dJTiIgXTsgdGhlbgotICAgIGlmIFsgIngkMSIgPT0gIngiIF0gfHwgWyBgYmFzZW5hbWUgIiQxImAgIT0gImxheW91dGxpYi5qYXIiIF07IHRoZW4KLSAgICAgICAgZWNobyAiVXNhZ2U6ICQwIHNkay9wbGF0Zm9ybXMveHh4L2RhdGEvbGF5b3V0bGliLmphciIKLSAgICAgICAgZWNobyAiQXJndW1lbnQgMSBzaG91bGQgYmUgdGhlIHBhdGggdG8gdGhlIGxheW91dGxpYi5qYXIgdGhhdCBzaG91bGQgYmUgdXBkYXRlZCBieSBjcmVhdGVfYnJpZGdlX3N5bWxpbmtzLnNoLiIKLSAgICAgICAgZXhpdCAxCi0gICAgZmkKLWZpCi0KLWVjaG8gIiMjIyAkMCBleGVjdXRpbmciCi0KLWZ1bmN0aW9uIGRpZSgpIHsKLSAgICBlY2hvICJFcnJvcjogJCoiCi0gICAgZXhpdCAxCi19Ci0KLSMgQ0QgdG8gdGhlIHRvcCBhbmRyb2lkIGRpcmVjdG9yeQotRD1gZGlybmFtZSAiJDAiYAotY2QgIiRELy4uLy4uLy4uLy4uLyIKLQotREVTVD0iZGV2ZWxvcG1lbnQvdG9vbHMvZWNsaXBzZS9zY3JpcHRzIgotCi1zZXQgLWUgIyBmYWlsIGVhcmx5Ci0KLWVjaG8gOyBlY2hvICIjIyMgQURUICMjIyIgOyBlY2hvCi0kREVTVC9jcmVhdGVfYWR0X3N5bWxpbmtzLnNoICIkKiIKLWVjaG8gOyBlY2hvICIjIyMgRERNUyAjIyMiIDsgZWNobwotJERFU1QvY3JlYXRlX2RkbXNfc3ltbGlua3Muc2ggIiQqIgotZWNobyA7IGVjaG8gIiMjIyBURVNUICMjIyIgOyBlY2hvCi0kREVTVC9jcmVhdGVfdGVzdF9zeW1saW5rcy5zaCAiJCoiCi1lY2hvIDsgZWNobyAiIyMjIEJSSURHRSAjIyMiIDsgZWNobwotJERFU1QvY3JlYXRlX2JyaWRnZV9zeW1saW5rcy5zaCAiJCoiCi0KLWVjaG8gIiMjIyAkMCBkb25lIgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2NyZWF0ZV9icmlkZ2Vfc3ltbGlua3Muc2ggYi90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX2JyaWRnZV9zeW1saW5rcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA1ZWY2My4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX2JyaWRnZV9zeW1saW5rcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi1mdW5jdGlvbiBkaWUoKSB7Ci0gICAgZWNobyAiRXJyb3I6ICQqIgotICAgIGV4aXQgMQotfQotCi1zZXQgLWUgIyBmYWlsIGVhcmx5Ci0KLSMgQ0QgdG8gdGhlIHRvcCBhbmRyb2lkIGRpcmVjdG9yeQotRD1gZGlybmFtZSAiJDAiYAotY2QgIiRELy4uLy4uLy4uLy4uLyIKLQotSE9TVD1gdW5hbWVgCi1pZiBbICIkSE9TVCIgPT0gIkxpbnV4IiBdOyB0aGVuCi0gICAgZWNobyAjIG5vdGhpbmcgdG8gZG8KLQotZWxpZiBbICIkSE9TVCIgPT0gIkRhcndpbiIgXTsgdGhlbgotICAgIGVjaG8gIyBub3RoaW5nIHRvIGRvCi0KLWVsaWYgWyAiJHtIT1NUOjA6Nn0iID09ICJDWUdXSU4iIF07IHRoZW4KLSAgICBpZiBbICJ4JDEiID09ICJ4IiBdIHx8IFsgYGJhc2VuYW1lICIkMSJgICE9ICJsYXlvdXRsaWIuamFyIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIlVzYWdlOiAkMCBzZGsvcGxhdGZvcm1zL3h4eC9kYXRhL2xheW91dGxpYi5qYXIiCi0gICAgICAgIGVjaG8gIkFyZ3VtZW50IDEgc2hvdWxkIGJlIHRoZSBwYXRoIHRvIHRoZSBsYXlvdXRsaWIuamFyIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuIgotICAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgTElCUz0ibGF5b3V0bGliIG5pbmVwYXRjaCIKLSAgICBlY2hvICJNYWtlIGphdmEgbGliczogJExJQlMiCi0gICAgbWFrZSAtajMgc2hvd2NvbW1hbmRzICRMSUJTIHx8IGRpZSAiQnJpZGdlOiBGYWlsZWQgdG8gYnVpbGQgb25lIG9mICRMSUJTLiIKLQotICAgIGVjaG8gIlVwZGF0aW5nIHlvdXIgU0RLIGluICQxIgotICAgIGNwIC12ZiAgIm91dC9ob3N0L3dpbmRvd3MteDg2L2ZyYW1ld29yay9sYXlvdXRsaWIuamFyIiAiJDEiCi0gICAgY2htb2QgLXYgYStyeCAiJDEiCi0KLWVsc2UKLSAgICBlY2hvICJVbnN1cHBvcnRlZCBwbGF0Zm9ybSAoJEhPU1QpLiBOb3RoaW5nIGRvbmUuIgotZmkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2NyZWF0ZV9kZG1zX3N5bWxpbmtzLnNoIGIvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2NyZWF0ZV9kZG1zX3N5bWxpbmtzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2NkZjY4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9jcmVhdGVfZGRtc19zeW1saW5rcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSMgQ3JlYXRlcyB0aGUgbGlua3MgdG8gdXNlIGRkbXt1aX1saWIgaW4gdGhlIGVjbGlwc2UtaWRlIHBsdWdpbi4KLSMgUnVuIHRoaXMgZnJvbSBkZXZpY2UvdG9vbHMvZWNsaXBzZS9zY3JpcHRzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLQotc2V0IC1lCi0KLUhPU1Q9YHVuYW1lYAotaWYgWyAiJHtIT1NUOjA6Nn0iID09ICJDWUdXSU4iIF07IHRoZW4KLSAgICAjIFdlIGNhbid0IHVzZSBzeW1saW5rcyB1bmRlciBDeWd3aW4KLQotICAgIGZ1bmN0aW9uIGNwZmlsZSB7ICMgJDE9ZGVzdCAkMj1zb3VyY2UKLSAgICAgICAgY3AgLWZ2ICQyICQxLwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGNwZGlyKCkgeyAjICQxPWRlc3QgJDI9c291cmNlCi0gICAgICAgIHJzeW5jIC1hdlcgLS1kZWxldGUtYWZ0ZXIgJDIgJDEKLSAgICB9Ci0KLWVsc2UKLSAgICAjIEZvciBhbGwgb3RoZXIgc3lzdGVtcyB3aGljaCBzdXBwb3J0IHN5bWxpbmtzCi0KLSAgICAjIGNvbXB1dGVzIHRoZSAicmV2ZXJzZSIgcGF0aCwgZS5nLiAiYS9iL2MiID0+ICIuLi8uLi8uLiIKLSAgICBmdW5jdGlvbiBiYWNrKCkgewotICAgICAgICBlY2hvICQxIHwgc2VkICdzQFteL10qQC4uQGcnCi0gICAgfQotCi0gICAgZnVuY3Rpb24gY3BmaWxlIHsgIyAkMT1kZXN0ICQyPXNvdXJjZQotICAgICAgICBsbiAtc3ZmIGBiYWNrICQxYC8kMiAkMS8KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBjcGRpcigpIHsgIyAkMT1kZXN0ICQyPXNvdXJjZQotICAgICAgICBsbiAtc3ZmIGBiYWNrICQxYC8kMiAkMQotICAgIH0KLWZpCi0KLSMgQ0QgdG8gdGhlIHRvcCBhbmRyb2lkIGRpcmVjdG9yeQotRD1gZGlybmFtZSAiJDAiYAotY2QgIiRELy4uLy4uLy4uLy4uLyIKLQotCi1CQVNFPSJkZXZlbG9wbWVudC90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcyIKLQotREVTVD0kQkFTRS9saWJzCi1ta2RpciAtcCAkREVTVAotZm9yIGkgaW4gcHJlYnVpbHQvY29tbW9uL2pmcmVlY2hhcnQvKi5qYXI7IGRvCi0gIGNwZmlsZSAkREVTVCAkaQotZG9uZQotCi1ERVNUPSRCQVNFL3NyYy9jb20vYW5kcm9pZAotbWtkaXIgLXAgJERFU1QKLWZvciBpIGluIGRldmVsb3BtZW50L3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYiBcCi0gICAgICAgICBkZXZlbG9wbWVudC90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIvc3JjL2NvbS9hbmRyb2lkL2RkbXVpbGliIDsgZG8KLSAgY3BkaXIgJERFU1QgJGkKLWRvbmUKLQotREVTVD0kQkFTRS9pY29ucwotbWtkaXIgLXAgJERFU1QKLWZvciBpIGluIFwKLSAgICBhZGQucG5nIFwKLSAgICBiYWNrd2FyZC5wbmcgXAotICAgIGNsZWFyLnBuZyBcCi0gICAgZC5wbmcgZGVidWctYXR0YWNoLnBuZyBkZWJ1Zy1lcnJvci5wbmcgZGVidWctd2FpdC5wbmcgZGVsZXRlLnBuZyBkZXZpY2UucG5nIGRvd24ucG5nIFwKLSAgICBlLnBuZyBlZGl0LnBuZyBlbXB0eS5wbmcgZW11bGF0b3IucG5nIFwKLSAgICBmb3J3YXJkLnBuZyBcCi0gICAgZ2MucG5nIFwKLSAgICBoZWFwLnBuZyBoYWx0LnBuZyBocHJvZi5wbmcgXAotICAgIGkucG5nIGltcG9ydEJ1Zy5wbmcgXAotICAgIGxvYWQucG5nIFwKLSAgICBwYXVzZS5wbmcgcGxheS5wbmcgcHVsbC5wbmcgcHVzaC5wbmcgXAotICAgIHNhdmUucG5nIFwKLSAgICB0aHJlYWQucG5nIHRyYWNpbmdfc3RhcnQucG5nIHRyYWNpbmdfc3RvcC5wbmcgXAotICAgIHVwLnBuZyBcCi0gICAgdi5wbmcgXAotICAgIHcucG5nIHdhcm5pbmcucG5nIDsgZG8KLSAgY3BmaWxlICRERVNUIGRldmVsb3BtZW50L3Rvb2xzL2RkbXMvbGlicy9kZG11aWxpYi9zcmMvcmVzb3VyY2VzL2ltYWdlcy8kaQotZG9uZQotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX3Rlc3Rfc3ltbGlua3Muc2ggYi90b29scy9lY2xpcHNlL3NjcmlwdHMvY3JlYXRlX3Rlc3Rfc3ltbGlua3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MmUzYWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL2NyZWF0ZV90ZXN0X3N5bWxpbmtzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotc2V0IC1lCi0KLSMgQ0QgdG8gdGhlIHRvcCBhbmRyb2lkIGRpcmVjdG9yeQotRD1gZGlybmFtZSAiJDAiYAotY2QgIiRELy4uLy4uLy4uLy4uLyIKLQotIyBjb21wdXRlcyByZWxhdGl2ZSAiLi4iIHBhdGhzIGZyb20gJDEgdG8gaGVyZSAoaW4gL2FuZHJvaWQpCi1mdW5jdGlvbiBiYWNrKCkgewotICBlY2hvICQxIHwgc2VkICdzQFteL10qQC4uQGcnCi19Ci0KLUhPU1Q9YHVuYW1lYAotaWYgWyAiJHtIT1NUOjA6Nn0iID09ICJDWUdXSU4iIF07IHRoZW4KLSAgICAjIFdlIGNhbid0IHVzZSBzeW1saW5rcyB1bmRlciBDeWd3aW4KLSAgICBmdW5jdGlvbiBjcGRpcigpIHsgIyAkMT1kZXN0ICQyPXNvdXJjZQotICAgICAgICBlY2hvICJyc3luYyAkMiA9PiAkMSIKLSAgICAgICAgcnN5bmMgLWF2VyAtLWRlbGV0ZS1hZnRlciAkMiAkMQotICAgIH0KLQotZWxzZQotICAgICMgRm9yIGFsbCBvdGhlciBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgc3ltbGlua3MKLSAgICBmdW5jdGlvbiBjcGRpcigpIHsgIyAkMT1kZXN0ICQyPXNvdXJjZQotICAgICAgICBsbiAtc3ZmIGBiYWNrICQxYC8kMiAkMQotICAgIH0KLWZpCi0KLUJBU0U9ImRldmVsb3BtZW50L3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cyIKLURFU1Q9JEJBU0UKLUJBQ0s9YGJhY2sgJERFU1RgCi0KLUhPU1Q9YHVuYW1lYAotaWYgWyAiJEhPU1QiID09ICJMaW51eCIgXTsgdGhlbgotICAgIGxuIC1zdmYgJEJBQ0svb3V0L2hvc3QvbGludXgteDg2L2ZyYW1ld29yay9reG1sMi0yLjMuMC5qYXIgIiRERVNULyIKLSAgICBsbiAtc3ZmICRCQUNLL291dC9ob3N0L2xpbnV4LXg4Ni9mcmFtZXdvcmsvbGF5b3V0bGliLmphciAgICIkREVTVC8iCi0KLWVsaWYgWyAiJEhPU1QiID09ICJEYXJ3aW4iIF07IHRoZW4KLSAgICBsbiAtc3ZmICRCQUNLL291dC9ob3N0L2Rhcndpbi14ODYvZnJhbWV3b3JrL2t4bWwyLTIuMy4wLmphciAiJERFU1QvIgotICAgIGxuIC1zdmYgJEJBQ0svb3V0L2hvc3QvZGFyd2luLXg4Ni9mcmFtZXdvcmsvbGF5b3V0bGliLmphciAgICIkREVTVC8iCi0KLWVsaWYgWyAiJHtIT1NUOjA6Nn0iID09ICJDWUdXSU4iIF07IHRoZW4KLSAgICBpZiBbICEgLWYgIiRERVNUL2t4bWwyLTIuMy4wLmphciIgXTsgdGhlbgotICAgICAgICBjcCAtdiAicHJlYnVpbHQvY29tbW9uL2t4bWwyL2t4bWwyLTIuMy4wLmphciIgIiRERVNULyIKLSAgICBmaQotCi0gICAgTElCUz0ibGF5b3V0bGliLmphciIKLSAgICBORUVEX01BS0U9InllcyIKLSAgICBmb3IgTElCIGluICRMSUJTIDsgZG8KLSAgICAgICAgU1JDSkFSPSJvdXQvaG9zdC93aW5kb3dzLXg4Ni9mcmFtZXdvcmsvJExJQiIKLSAgICAgICAgRFNUSkFSPSIkREVTVC8kTElCIgotICAgICAgICBpZiBbWyAkTkVFRF9NQUtFIF1dICYmICEgZGlmZiAtcSAiJFNSQ0pBUiIgIiREU1RKQVIiID4vZGV2L251bGwgOyB0aGVuCi0gICAgICAgICAgICBNQUtFX0xJQlM9IiR7TElCUy8vLmphci99IgotICAgICAgICAgICAgZWNobyAiTWFrZSBqYXZhIGxpYnM6ICRNQUtFX0xJQlMiCi0gICAgICAgICAgICBtYWtlIC1qMyBzaG93Y29tbWFuZHMgJE1BS0VfTElCUyB8fCBkaWUgImFkdC10ZXN0czogRmFpbGVkIHRvIGJ1aWxkIG9uZSBvZiAkTElCUy4iCi0gICAgICAgICAgICBORUVEX01BS0U9IiIKLSAgICAgICAgZmkKLSAgICAgICAgCi0gICAgICAgIGNwIC12ICIkU1JDSkFSIiAiJERTVEpBUiIKLSAgICBkb25lCi0KLSAgICBjaG1vZCAtdiBhK3J4ICIkREVTVCIvKi5qYXIKLWVsc2UKLSAgICBlY2hvICJVbnN1cHBvcnRlZCBwbGF0Zm9ybSAoJEhPU1QpLiBOb3RoaW5nIGRvbmUuIgotZmkKLQotIyBjcmVhdGUgbGluayB0byBkZG1saWIgdGVzdHMKLURFU1Q9JEJBU0UvdW5pdHRlc3RzL2NvbS9hbmRyb2lkCi1jcGRpciAkREVTVCBkZXZlbG9wbWVudC90b29scy9kZG1zL2xpYnMvZGRtbGliL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9kZG1saWIKLWNwZGlyICRERVNUIGRldmVsb3BtZW50L3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrbGliCi0KLSMgQ2xlYW51cCBvbGQgb2Jzb2xldGUgc3ltbGluawotW1sgLWUgJERFU1Qvc2RrdWlsaWIgfHwgLUwgJERFU1Qvc2RrdWlsaWIgXV0gJiYgcm0gLXJmdiAkREVTVC9zZGt1aWxpYgotCi1ERVNUPSRCQVNFL3VuaXR0ZXN0cy9jb20vYW5kcm9pZC9sYXlvdXRsaWIKLW1rZGlyIC1wICRERVNUCi1jcGRpciAkREVTVCBmcmFtZXdvcmtzL2Jhc2UvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS90ZXN0cy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlCi1jcGRpciAkREVTVCBmcmFtZXdvcmtzL2Jhc2UvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS90ZXN0cy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdGVzdGRhdGEKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9nZW5faWNvbi5weSBiL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9nZW5faWNvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjYyNzRlMS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NjcmlwdHMvZ2VuX2ljb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbgotCi1pbXBvcnQgc3lzCi1pbXBvcnQgU3RyaW5nSU8KLXRyeToKLSAgICBpbXBvcnQgSW1hZ2UsIEltYWdlRHJhdywgSW1hZ2VGb250Ci1leGNlcHQgSW1wb3J0RXJyb3IsIGU6Ci0gICAgcHJpbnQgc3RyKGUpCi0gICAgcHJpbnQgIkFyZSB5b3UgbWlzc2luZyB0aGUgUHl0aG9uIEltYWdpbmcgTGlicmFyeT8gKGFwdC1nZXQgaW5zdGFsbCBweXRob24taW1hZ2luZykiCi0gICAgc3lzLmV4aXQoMSkKLQotRk9OVF9QQVRIID0gIi91c3Ivc2hhcmUvZm9udHMvdHJ1ZXR5cGUvbXN0dGNvcmVmb250cy9hcmlhbC50dGYiCi0KLWNsYXNzIEFyZ3Mob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzdF9uYW1lLCBzaXplLCBjaXJjbGVfY29sb3IsIGJvcmRlcl9jb2xvciwKLSAgICAgICAgICAgICAgICAgbGV0dGVyX2NvbG9yLCBsZXR0ZXIpOgotICAgICAgICBzZWxmLmRlc3RfbmFtZSA9IGRlc3RfbmFtZQotICAgICAgICBzZWxmLnNpemUgPSBzaXplCi0gICAgICAgIHNlbGYuY2lyY2xlX2NvbG9yID0gY2lyY2xlX2NvbG9yCi0gICAgICAgIHNlbGYuYm9yZGVyX2NvbG9yID0gYm9yZGVyX2NvbG9yCi0gICAgICAgIHNlbGYubGV0dGVyX2NvbG9yID0gbGV0dGVyX2NvbG9yCi0gICAgICAgIHNlbGYubGV0dGVyID0gbGV0dGVyCi0KLWRlZiBtYWluKGFyZ3MpOgotICAgIGRhdGEgPSBwcm9jZXNzX2FyZ3MoYXJncykKLSAgICBpZiBkYXRhOgotICAgICAgICBjcmVhdGVJbWFnZShkYXRhKQotCi1kZWYgcHJvY2Vzc19hcmdzKGFyZ3MpOgotICAgIGlmIG5vdCBhcmdzIG9yIGxlbihhcmdzKSAhPSA2OgotICAgICAgICB1c2FnZSgpCi0gICAgcmV0dXJuIEFyZ3MoKmFyZ3MpCi0gICAgCi1kZWYgdXNhZ2UoKToKLSAgICBwcmludCAiIiJVc2FnZTogJXMgPGZpbGVfbmFtZT4gPHNpemU+IDxjaXJjbGUtY29sb3I+IDxib3JkZXItY29sb3I+IDxsZXR0ZXItY29sb3I+IDxsZXR0ZXI+IiIiICUgc3lzLmFyZ3ZbMF0KLSAgICBzeXMuZXhpdCgxKQotCi1kZWYgY3JlYXRlSW1hZ2UoZGF0YSk6Ci0gICAgem9vbSA9IDQKLSAgICBybWluID0gLXpvb20vMgotICAgIHJtYXggPSB6b29tLzIKLSAgICBpZiB6b29tID4gMToKLSAgICAgICAgciA9IHJhbmdlKC16b29tLzIsIHpvb20vMisxKQotICAgIGVsc2U6Ci0gICAgICAgIHIgPSBbIDAgXQotICAgIHN6ID0gaW50KGRhdGEuc2l6ZSkKLSAgICBzejQgPSBzeiAqIHpvb20KLSAgICAKLSAgICBpbWcgPSBJbWFnZS5uZXcoIlJHQkEiLCAoc3o0LCBzejQpLCAoMjU1LDI1NSwyNTUsMCkpCi0gICAgZHJhdyA9IEltYWdlRHJhdy5EcmF3KGltZykKLQotICAgIGRyYXcuZWxsaXBzZSgoMCwgMCwgc3o0LXpvb20sIHN6NC16b29tKSwKLSAgICAgICAgICAgICAgICAgICAgIGZpbGw9ZGF0YS5jaXJjbGVfY29sb3IsIG91dGxpbmU9Tm9uZSkKLSAgICBmb3IgaSBpbiByOgotICAgICAgICBkcmF3LmVsbGlwc2UoKGksIGksIHN6NC1pLXpvb20sIHN6NC1pLXpvb20pLAotICAgICAgICAgICAgICAgICAgICAgZmlsbD1Ob25lLCBvdXRsaW5lPWRhdGEuYm9yZGVyX2NvbG9yKQotCi0gICAgZm9udCA9IEltYWdlRm9udC50cnVldHlwZShGT05UX1BBVEgsIGludChzejQgKiAuNzUpKQotICAgIHRzeCwgdHN5ID0gZHJhdy50ZXh0c2l6ZShkYXRhLmxldHRlciwgZm9udD1mb250KQotCi0gICAgcHR4ID0gKHN6NCAtIHRzeCkgLyAyCi0gICAgcHR5ID0gKHN6NCAtIHRzeSkgLyAyCi0gICAgZm9yIGkgaW4gcjoKLSAgICAgICAgZHJhdy50ZXh0KChwdHggKyBpLCBwdHkpLCBkYXRhLmxldHRlciwgZm9udD1mb250LCBmaWxsPWRhdGEubGV0dGVyX2NvbG9yKQotCi0gICAgaW1nID0gaW1nLnJlc2l6ZSgoc3osIHN6KSwgSW1hZ2UuQklDVUJJQykKLSAgICBpbWcuc2F2ZShkYXRhLmRlc3RfbmFtZSwgIlBORyIpCi0gICAgcHJpbnQgIlNhdmVkIiwgZGF0YS5kZXN0X25hbWUKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy9zZXR1cF9lY2xpcHNlLnNoIGIvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL3NldHVwX2VjbGlwc2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxNDNlMjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL3NldHVwX2VjbGlwc2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIFF1aWNrIHNjcmlwdCB1c2VkIHRvIHNldHVwIEVjbGlwc2UgZm9yIHRoZSBBRFQgcGx1Z2luIGJ1aWxkLgotIwotIyB1c2FnZToKLSMgICBzZXR1cF9lY2xpcHNlLnNoIDxkZXN0X2Rpcj4KLSMKLSMgV29ya2Zsb3c6Ci0jIC0gZG93bmxvYWRzICYgdW5wYWNrIEVjbGlwc2UgaWYgbmVjZXNzYXJ5Ci0jIC0gKnJ1bnMqIGl0IG9uY2UKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0KLSMKLSMgTm90ZTogcmlnaHQgbm93IHRoaXMgaXMgaW52b2tlZCBieSAvL2RldmljZS90b29scy9lY2xpcHNlL2RvQnVpbGQuc2gKLSMgYW5kIGl0ICpNVVNUKiBiZSBpbnZva2VkIHdpdGggdGhlIGZvbGxvd2luZyBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6Ci0jCi0jICQgc2V0dXBfZWNsaXBzZS5zaCAvYnVpbGRib3QvZWNsaXBzZS1hbmRyb2lkLzMuNC4wLwotIwotIy0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc2V0IC1lICMgYWJvcnQgdGhpcyBzY3JpcHQgZWFybHkgaWYgYW55IGNvbW1hbmQgZmFpbHMKLQotZnVuY3Rpb24gZGllKCkgewotICBlY2hvICRACi0gIGV4aXQgMQotfQotCi1pZiBbICItcCIgPT0gIiQxIiBdOyB0aGVuCi0gIEdFVF9QSUQ9Ii1wIgotICBzaGlmdAotZmkKLQotQkFTRV9ESVI9IiQxIgotCi1bIC1uICIkMSIgXSB8fCBkaWUgIlVzYWdlOiAkMCA8ZGVzdC1kaXI+IgotCi0jIFVSTCBmb3IgMy40LjAgUkNQIExpbnV4IDMyIEJpdHMuIEluY2x1ZGVzIEdFRiwgV1RQIGFzIG5lZWRlZC4KLURPV05MT0FEX1VSTD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3RlY2hub2xvZ3kvZXBwL2Rvd25sb2Fkcy9yZWxlYXNlL2dhbnltZWRlL1IvZWNsaXBzZS1yY3AtZ2FueW1lZGUtbGludXgtZ3RrLnRhci5neiZ1cmw9aHR0cDovL2VjbGlwc2UudW5peGhlYWRzLm9yZy90ZWNobm9sb2d5L2VwcC9kb3dubG9hZHMvcmVsZWFzZS9nYW55bWVkZS9SL2VjbGlwc2UtcmNwLWdhbnltZWRlLWxpbnV4LWd0ay50YXIuZ3ombWlycm9yX2lkPTQ4MCIKLQotQklOPSIkQkFTRV9ESVIvZWNsaXBzZS9lY2xpcHNlIiAgICAgICAgICAgIyBwYXRoIHRvIGluc3RhbGxlZCBiaW5hcnkKLVRBUkdaPSIkQkFTRV9ESVIvZWNsaXBzZS1yY3AtZ2FueW1lZGUtbGludXgtZ3RrLnRhci5neiIKLQotaWYgWyAhIC1mICIkQklOIiBdOyB0aGVuICAgCi0gIGVjaG8gIkRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIEVjbGlwc2UgaW4gJEJBU0VfRElSLiIKLSAgbWtkaXIgLXAgIiRCQVNFX0RJUiIKLSAgd2dldCAtLWNvbnRpbnVlIC0tbm8tdmVyYm9zZSAtLW91dHB1dC1kb2N1bWVudD0iJFRBUkdaIiAiJERPV05MT0FEX1VSTCIKLSAgZWNobyAiVW5wYWNraW5nICRUQVJHWiIKLSAgKGNkICIkQkFTRV9ESVIiICYmIHRhciB4emYgIiRUQVJHWiIpCi0gICAgCi0gIGVjaG8KLSAgZWNobyAiKioqIFdBUk5JTkc6IFRvIHNldHVwIEVjbGlwc2UgY29ycmVjdGx5LCBpdCBtdXN0IGJlIHJhbiBhdCBsZWFzdCBvbmNlIG1hbnVhbGx5IgotICBlY2hvICIqKiogICAgICAgICAgRWNsaXBzZSB3aWxsIG5vdyBzdGFydC4iCi0gIGVjaG8KLSAgaWYgWyAtbiAiJEdFVF9QSUQiIF07IHRoZW4KLSAgICAjIGlmIHN0YXJ0ZWQgZnJvbSB0aGUgYXV0b21hdGljIGVjbGlwc2UgYnVpbGQsIHJ1biBFY2xpcHNlIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgIiRCSU4iICYKLSAgICBFQ0xJUFNFX1BJRD0kIQotICAgIGVjaG8gIioqKiBFY2xpcHNlIHN0YXJ0ZWQgaW4gYmFja2dyb3VuZCB3aXRoIFBJRCAkRUNMSVBTRV9QSUQiCi0gICAgZWNobyAiJEVDTElQU0VfUElEIiA+ICIkQkFTRV9ESVIiL2VjbGlwc2UucGlkCi0gICAgc2xlZXAgNSAgIyBnaXZlIHNvbWUgdGltZSBmb3IgRWNsaXBzZSB0byBzdGFydCBhbmQgc2V0dXAgaXRzIGVudmlyb25tZW50Ci0gIGVsc2UKLSAgICAjIGlmIHN0YXJ0ZWQgbWFudWFsbHksIHJ1biBFY2xpcHNlIGluIHRoZSBmb3JlZ3JvdW5kCi0gICAgIiRCSU4iCi0gIGZpCi1maQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL3VwZGF0ZV92ZXJzaW9uLnNoIGIvdG9vbHMvZWNsaXBzZS9zY3JpcHRzL3VwZGF0ZV92ZXJzaW9uLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg4OTY1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2NyaXB0cy91cGRhdGVfdmVyc2lvbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLU9MRD0iJDEiCi1ORVc9IiQyIgotCi0jIHNhbml0eSBjaGVjayBpbiBpbnB1dCBhcmdzCi1pZiBbIC16ICIkT0xEIiBdIHx8IFsgLXogIiRORVciIF07IHRoZW4KLSAgICBjYXQgPDxFT0YKLVVzYWdlOiAkMCA8b2xkPiA8bmV3PgotQ2hhbmdlcyB0aGUgQURUIHBsdWdpbiByZXZpc2lvbiBudW1iZXIuCi1FeGFtcGxlOgotICBjZCB0b29scy9lY2xpcHNlCi0gIHNjcmlwdHMvdXBkYXRlX3ZlcnNpb24uc2ggMC4xLjIgMC4yLjMKLUVPRgotICAgIGV4aXQgMQotZmkKLQotIyBzYW5pdHkgY2hlY2sgb24gY3VycmVudCBkaXIKLWlmIFsgYGJhc2VuYW1lICIkUFdEImAgIT0gImVjbGlwc2UiIF07IHRoZW4KLSAgICBlY2hvICJQbGVhc2UgcnVuIHRoaXMgZnJvbSB0b29scy9lY2xpcHNlLiIKLSAgICBleGl0IDEKLWZpCi0KLSMgcXVvdGUgZG90cyBmb3IgcmVnZXhwcwotT0xEPSIke09MRC8vLi9cLn0iCi1ORVc9IiR7TkVXLy8uL1wufSIKLQotIyBGaW5kIGFsbCB0aGUgZmlsZXMgd2l0aCB0aGUgb2xkIHBhdHRlcm4sIGV4Y2VwdCBjaGFuZ2VzLnR4dCBhbmQKLSMgcDQgZWRpdCB0aGVtLiBTa2lwIHRoYXQgaWYgdGhlcmUncyBubyBwNCBpbiBwYXRoLgotaWYgd2hpY2ggZzQgMT4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgZ3JlcCAtcmwgIiRPTEQiICogfCBncmVwIC1FICJcLnhtbCR8XC5NRiQiIHwgeGFyZ3MgLW4gNSBnNCBlZGl0Ci1maQotCi0jIE5vdyBmaW5kIHRoZSBzYW1lIGZpbGVzIGJ1dCB0aGlzIHRpbWUgdXNlIHNlZCB0byByZXBsYWNlIGluLXBsYWNlIHdpdGgKLSMgdGhlIG5ldyBwYXR0ZXJuLiBPbGQgZmlsZXMgZ2V0IGJhY2t1cGVkIHdpdGggdGhlIC5vbGQgZXh0ZW5zaW9uLgotZ3JlcCAtcmwgIiRPTEQiICogfCBncmVwIC1FICJcLnhtbCR8XC5NRiQiIHwgeGFyZ3MgLW4gMSBzZWQgLWkub2xkICJzLyRPTEQvJE5FVy9nIgotCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NpdGVzL2V4dGVybmFsLy5wcm9qZWN0IGIvdG9vbHMvZWNsaXBzZS9zaXRlcy9leHRlcm5hbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNjI2OS4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NpdGVzL2V4dGVybmFsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+ZXh0ZXJuYWwtc2l0ZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvaW5kZXguaHRtbCBiL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0YmU0Yi4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NpdGVzL2V4dGVybmFsL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFuZHJvaWQgRGV2ZWxvcG1lbnQgVG9vbGtpdCB1cGRhdGUgc2l0ZS48L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHN0eWxlPkBpbXBvcnQgdXJsKCJ3ZWIvc2l0ZS5jc3MiKTs8L3N0eWxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCXZhciByZXR1cm52YWwgPSAwOwotCXZhciBzdHlsZXNoZWV0LCB4bWxGaWxlLCBjYWNoZSwgZG9jOwotCWZ1bmN0aW9uIGluaXQoKXsKLQkJLy8gTlNDUCA3LjErIC8gTW96aWxsYSAxLjQuMSsgLyBTYWZhcmkKLQkJLy8gVXNlIHRoZSBzdGFuZGFyZCBET00gTGV2ZWwgMiB0ZWNobmlxdWUsIGlmIGl0IGlzIHN1cHBvcnRlZAotCQlpZiAoZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gJiYgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpIHsKLQkJCXhtbEZpbGUgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgIiIsIG51bGwpOwotCQkJc3R5bGVzaGVldCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCAiIiwgbnVsbCk7Ci0JCQlpZiAoeG1sRmlsZS5sb2FkKXsKLQkJCQl4bWxGaWxlLmxvYWQoInNpdGUueG1sIik7Ci0JCQkJc3R5bGVzaGVldC5sb2FkKCJ3ZWIvc2l0ZS54c2wiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWxlcnQoIkRvY3VtZW50IGNvdWxkIG5vdCBiZSBsb2FkZWQgYnkgYnJvd3Nlci4iKTsKLQkJCX0KLQkJCXhtbEZpbGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHRyYW5zZm9ybSwgZmFsc2UpOwotCQkJc3R5bGVzaGVldC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgdHJhbnNmb3JtLCBmYWxzZSk7Ci0JCX0KLQkJLy9JRSA2LjArIHNvbHV0aW9uCi0JCWVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7Ci0JCQl4bWxGaWxlID0gbmV3IEFjdGl2ZVhPYmplY3QoIm1zeG1sMi5ET01Eb2N1bWVudC4zLjAiKTsKLQkJCXhtbEZpbGUuYXN5bmMgPSBmYWxzZTsKLQkJCXhtbEZpbGUubG9hZCgic2l0ZS54bWwiKTsKLQkJCXN0eWxlc2hlZXQgPSBuZXcgQWN0aXZlWE9iamVjdCgibXN4bWwyLkZyZWVUaHJlYWRlZERPTURvY3VtZW50LjMuMCIpOwotCQkJc3R5bGVzaGVldC5hc3luYyA9IGZhbHNlOwotCQkJc3R5bGVzaGVldC5sb2FkKCJ3ZWIvc2l0ZS54c2wiKTsKLQkJCWNhY2hlID0gbmV3IEFjdGl2ZVhPYmplY3QoIm1zeG1sMi5YU0xUZW1wbGF0ZS4zLjAiKTsKLQkJCWNhY2hlLnN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0OwotCQkJdHJhbnNmb3JtRGF0YSgpOwotCQl9Ci0JfQotCS8vIHNlcGFyYXRlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGZvciBJRSA2LjArCi0JZnVuY3Rpb24gdHJhbnNmb3JtRGF0YSgpewotCQl2YXIgcHJvY2Vzc29yID0gY2FjaGUuY3JlYXRlUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5pbnB1dCA9IHhtbEZpbGU7Ci0JCXByb2Nlc3Nvci50cmFuc2Zvcm0oKTsKLQkJZGF0YS5pbm5lckhUTUwgPSBwcm9jZXNzb3Iub3V0cHV0OwotCX0KLQkvLyBzZXBhcmF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBmb3IgTlNDUCA3LjErIGFuZCBNb3ppbGxhIDEuNC4xKwotCWZ1bmN0aW9uIHRyYW5zZm9ybSgpewotCQlyZXR1cm52YWwrPTE7Ci0JCWlmIChyZXR1cm52YWw9PTIpewotCQkJdmFyIHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7Ci0JCQlwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldChzdHlsZXNoZWV0KTsKLQkJCWRvYyA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0RvY3VtZW50KHhtbEZpbGUpOwotCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGEiKS5pbm5lckhUTUwgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTDsKLQkJfQotCX0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgb25sb2FkPSJpbml0KCk7Ij4KLTwhLS1baW5zZXJ0IHN0YXRpYyBIVE1MIGhlcmVdLS0+Ci08ZGl2IGlkPSJkYXRhIj48IS0tIHRoaXMgaXMgd2hlcmUgdGhlIHRyYW5zZm9ybWVkIGRhdGEgZ29lcyAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvc2l0ZS54bWwgYi90b29scy9lY2xpcHNlL3NpdGVzL2V4dGVybmFsL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU2YzNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZWNsaXBzZS8iPgotICAgICAgVXBkYXRlIFNpdGUgZm9yIEFuZHJvaWQgRGV2ZWxvcG1lbnQgVG9vbGtpdAotICAgPC9kZXNjcmlwdGlvbj4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0XzAuOS41LnF1YWxpZmllci5qYXIiIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQiIHZlcnNpb249IjAuOS41LnF1YWxpZmllciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iZGV2ZWxvcGVyIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXNfMC45LjUucXVhbGlmaWVyLmphciIgaWQ9ImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMiIHZlcnNpb249IjAuOS41LnF1YWxpZmllciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iZGV2ZWxvcGVyIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImRldmVsb3BlciIgbGFiZWw9IkRldmVsb3BlciBUb29scyI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBGZWF0dXJlcyB0aGF0IGFkZCBBbmRyb2lkIHN1cHBvcnQgdG8gRWNsaXBzZSBmb3IgYXBwbGljYXRpb24gZGV2ZWxvcGVycy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvd2ViL3NpdGUuY3NzIGIvdG9vbHMvZWNsaXBzZS9zaXRlcy9leHRlcm5hbC93ZWIvc2l0ZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzZmOWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zaXRlcy9leHRlcm5hbC93ZWIvc2l0ZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08U1RZTEUgdHlwZT0idGV4dC9jc3MiPgotdGQuc3BhY2VyIHtwYWRkaW5nLWJvdHRvbTogMTBweDsgcGFkZGluZy10b3A6IDEwcHg7fQotLnRpdGxlIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGNvbG9yOiAjOTlBQUNDO30KLS5ib2R5VGV4dCB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6IzAwMDAwMDsgIH0KLS5zdWItaGVhZGVyIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogd2hpdGU7fQotLmxvZy10ZXh0IHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogbGlnaHRlcjsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOmJsYWNrO30KLS5iaWctaGVhZGVyIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogd2hpdGU7IGJvcmRlci10b3A6MTBweCBzb2xpZCB3aGl0ZTt9Ci0ubGlnaHQtcm93IHtiYWNrZ3JvdW5kOiNGRkZGRkZ9Ci0uZGFyay1yb3cge2JhY2tncm91bmQ6I0VFRUVGRn0KLS5oZWFkZXIge2JhY2tncm91bmQ6Izk5QUFERH0KLSNpbmRlbnQge3dvcmQtd3JhcCA6IGJyZWFrLXdvcmQ7d2lkdGggOjMwMHB4O3RleHQtaW5kZW50OjEwcHg7fQotPC9TVFlMRT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvZXh0ZXJuYWwvd2ViL3NpdGUueHNsIGIvdG9vbHMvZWNsaXBzZS9zaXRlcy9leHRlcm5hbC93ZWIvc2l0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDE1N2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zaXRlcy9leHRlcm5hbC93ZWIvc2l0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb24gPSAnMS4wJyB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgeG1sbnM6bXN4c2w9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eHNsdCI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGVuY29kaW5nPSJVVEYtOCIvPgotPHhzbDprZXkgbmFtZT0iY2F0IiBtYXRjaD0iY2F0ZWdvcnkiIHVzZT0iQG5hbWUiLz4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InNpdGUiPgotCTxodG1sPgotCTxoZWFkPgotCTx0aXRsZT51cGRhdGUtc2l0ZTwvdGl0bGU+Ci0JPHN0eWxlPkBpbXBvcnQgdXJsKCJ3ZWIvc2l0ZS5jc3MiKTs8L3N0eWxlPgotCTwvaGVhZD4KLQk8Ym9keT4KLQk8aDEgY2xhc3M9InRpdGxlIj51cGRhdGUtc2l0ZTwvaDE+Ci0JPHAgY2xhc3M9ImJvZHlUZXh0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGVzY3JpcHRpb24iLz48L3A+Ci0JPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMiI+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNhdGVnb3J5LWRlZiI+Ci0JCTx4c2w6c29ydCBzZWxlY3Q9IkBsYWJlbCIgb3JkZXI9ImFzY2VuZGluZyIgY2FzZS1vcmRlcj0idXBwZXItZmlyc3QiLz4KLQkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+Ci0JPHhzbDppZiB0ZXN0PSJjb3VudChrZXkoJ2NhdCcsQG5hbWUpKSAhPSAwIj4KLQkJCTx0ciBjbGFzcz0iaGVhZGVyIj4KLQkJCQk8dGQgY2xhc3M9InN1Yi1oZWFkZXIiIHdpZHRoPSIzMCUiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0ic3ViLWhlYWRlciIgd2lkdGg9IjcwJSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ2NhdCcsQG5hbWUpIj4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIgb3JkZXI9ImFzY2VuZGluZyIvPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BpZCIgb3JkZXI9ImFzY2VuZGluZyIgY2FzZS1vcmRlcj0idXBwZXItZmlyc3QiLz4KLQkJCTx0cj4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iKHBvc2l0aW9uKCkgbW9kIDIgPSAxKSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kYXJrLXJvdzwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+bGlnaHQtcm93PC94c2w6YXR0cmlidXRlPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+Ci0JCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGxhYmVsIj4KLQkJCQkJCQk8YSBocmVmPSJ7YW5jZXN0b3I6OmZlYXR1cmUvL0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BsYWJlbCIvPjwvYT4KLQkJCQkJCQk8YnIvPgotCQkJCQkJCTxkaXYgaWQ9ImluZGVudCI+Ci0JCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIvPikKLQkJCQkJCQk8L2Rpdj4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxhIGhyZWY9InthbmNlc3Rvcjo6ZmVhdHVyZS8vQHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIvPjwvYT4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCTxiciAvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkPgotCQkJCQk8dGFibGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9Ab3MiPgotCQkJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5PcGVyYXRpbmcgU3lzdGVtczo8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG9zIi8+PC90ZD4KLQkJCQkJCQk8L3RyPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9Ad3MiPgotCQkJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5XaW5kb3dzIFN5c3RlbXM6PC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0B3cyIvPjwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG5sIj4KLQkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+TGFuZ3VhZ2VzOjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AbmwiLz48L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BhcmNoIj4KLQkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+QXJjaGl0ZWN0dXJlOjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AYXJjaCIvPjwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RhYmxlPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQk8dHI+PHRkIGNsYXNzPSJzcGFjZXIiPjxici8+PC90ZD48dGQgY2xhc3M9InNwYWNlciI+PGJyLz48L3RkPjwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOmZvci1lYWNoPgotCTx4c2w6aWYgdGVzdD0iY291bnQoZmVhdHVyZSkgICZndDsgY291bnQoZmVhdHVyZS9jYXRlZ29yeSkiPgotCTx0ciBjbGFzcz0iaGVhZGVyIj4KLQkJPHRkIGNsYXNzPSJzdWItaGVhZGVyIiBjb2xzcGFuPSIyIj4KLQkJVW5jYXRlZ29yaXplZAotCQk8L3RkPgotCTwvdHI+Ci0JPC94c2w6aWY+Ci0JPHhzbDpjaG9vc2U+Ci0JPHhzbDp3aGVuIHRlc3Q9ImZ1bmN0aW9uLWF2YWlsYWJsZSgnbXN4c2w6bm9kZS1zZXQnKSI+Ci0JICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJydGYtbm9kZXMiPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSI+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJAaWQiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJAdmVyc2lvbiIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci0JCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIiAvPgotCQk8L3hzbDpmb3ItZWFjaD4KLQkgICA8L3hzbDp2YXJpYWJsZT4KLQkgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im15Tm9kZVNldCIgc2VsZWN0PSJtc3hzbDpub2RlLXNldCgkcnRmLW5vZGVzKS8qIi8+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRteU5vZGVTZXQiPgotCTx0cj4KLQkJPHhzbDpjaG9vc2U+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kYXJrLXJvdzwveHNsOmF0dHJpYnV0ZT4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5saWdodC1yb3c8L3hzbDphdHRyaWJ1dGU+Ci0JCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IkBsYWJlbCI+Ci0JCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+PC9hPgotCQkJCTxiciAvPgotCQkJCTxkaXYgaWQ9ImluZGVudCI+Ci0JCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZlcnNpb24iLz4pCi0JCQkJPC9kaXY+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2ZXJzaW9uIi8+PC9hPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQkJPGJyIC8+PGJyIC8+Ci0JCTwvdGQ+Ci0JCTx0ZD4KLQkJCTx0YWJsZT4KLQkJCQk8eHNsOmlmIHRlc3Q9IkBvcyI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5PcGVyYXRpbmcgU3lzdGVtczo8L3RkPgotCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9zIi8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9IkB3cyI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5XaW5kb3dzIFN5c3RlbXM6PC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3cyIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJAbmwiPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+TGFuZ3VhZ2VzOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmwiLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iQGFyY2giPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+QXJjaGl0ZWN0dXJlOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJjaCIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L3RkPgotCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6d2hlbj4KLQk8eHNsOm90aGVyd2lzZT4KLQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSI+Ci0JPHhzbDpzb3J0IHNlbGVjdD0iQGlkIiBvcmRlcj0iYXNjZW5kaW5nIiBjYXNlLW9yZGVyPSJ1cHBlci1maXJzdCIvPgotCTx4c2w6c29ydCBzZWxlY3Q9IkB2ZXJzaW9uIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCTx0cj4KLQkJPHhzbDpjaG9vc2U+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJjb3VudChwcmVjZWRpbmctc2libGluZzo6ZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSkgbW9kIDIgPSAxIj4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmRhcmstcm93PC94c2w6YXR0cmlidXRlPgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOm90aGVyd2lzZT4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmxpZ2h0LXJvdzwveHNsOmF0dHJpYnV0ZT4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iQGxhYmVsIj4KLQkJCQk8YSBocmVmPSJ7QHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz48L2E+Ci0JCQkJPGJyIC8+Ci0JCQkJPGRpdiBpZD0iaW5kZW50Ij4KLQkJCQkoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmVyc2lvbiIvPikKLQkJCQk8L2Rpdj4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8YSBocmVmPSJ7QHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZlcnNpb24iLz48L2E+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCQk8YnIgLz48YnIgLz4KLQkJPC90ZD4KLQkJPHRkPgotCQkJPHRhYmxlPgotCQkJCTx4c2w6aWYgdGVzdD0iQG9zIj4KLQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPk9wZXJhdGluZyBTeXN0ZW1zOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3MiLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iQHdzIj4KLQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPldpbmRvd3MgU3lzdGVtczo8L3RkPgotCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHdzIi8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9IkBubCI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5MYW5ndWFnZXM6PC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBubCIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJAYXJjaCI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5BcmNoaXRlY3R1cmU6PC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcmNoIi8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvdGQ+Ci0JPC90cj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotCTwvdGFibGU+Ci0JPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOmZvci1lYWNoPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9zaXRlcy9pbnRlcm5hbC8ucHJvamVjdCBiL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvaW50ZXJuYWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDY1OGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zaXRlcy9pbnRlcm5hbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmludGVybmFsLXNpdGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL2luZGV4Lmh0bWwgYi90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NGJlNGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZWNsaXBzZS9zaXRlcy9pbnRlcm5hbC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BbmRyb2lkIERldmVsb3BtZW50IFRvb2xraXQgdXBkYXRlIHNpdGUuPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzdHlsZT5AaW1wb3J0IHVybCgid2ViL3NpdGUuY3NzIik7PC9zdHlsZT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQl2YXIgcmV0dXJudmFsID0gMDsKLQl2YXIgc3R5bGVzaGVldCwgeG1sRmlsZSwgY2FjaGUsIGRvYzsKLQlmdW5jdGlvbiBpbml0KCl7Ci0JCS8vIE5TQ1AgNy4xKyAvIE1vemlsbGEgMS40LjErIC8gU2FmYXJpCi0JCS8vIFVzZSB0aGUgc3RhbmRhcmQgRE9NIExldmVsIDIgdGVjaG5pcXVlLCBpZiBpdCBpcyBzdXBwb3J0ZWQKLQkJaWYgKGRvY3VtZW50LmltcGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KSB7Ci0JCQl4bWxGaWxlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsKLQkJCXN0eWxlc2hlZXQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgIiIsIG51bGwpOwotCQkJaWYgKHhtbEZpbGUubG9hZCl7Ci0JCQkJeG1sRmlsZS5sb2FkKCJzaXRlLnhtbCIpOwotCQkJCXN0eWxlc2hlZXQubG9hZCgid2ViL3NpdGUueHNsIik7Ci0JCQl9IGVsc2UgewotCQkJCWFsZXJ0KCJEb2N1bWVudCBjb3VsZCBub3QgYmUgbG9hZGVkIGJ5IGJyb3dzZXIuIik7Ci0JCQl9Ci0JCQl4bWxGaWxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCB0cmFuc2Zvcm0sIGZhbHNlKTsKLQkJCXN0eWxlc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHRyYW5zZm9ybSwgZmFsc2UpOwotCQl9Ci0JCS8vSUUgNi4wKyBzb2x1dGlvbgotCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgewotCQkJeG1sRmlsZSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJtc3htbDIuRE9NRG9jdW1lbnQuMy4wIik7Ci0JCQl4bWxGaWxlLmFzeW5jID0gZmFsc2U7Ci0JCQl4bWxGaWxlLmxvYWQoInNpdGUueG1sIik7Ci0JCQlzdHlsZXNoZWV0ID0gbmV3IEFjdGl2ZVhPYmplY3QoIm1zeG1sMi5GcmVlVGhyZWFkZWRET01Eb2N1bWVudC4zLjAiKTsKLQkJCXN0eWxlc2hlZXQuYXN5bmMgPSBmYWxzZTsKLQkJCXN0eWxlc2hlZXQubG9hZCgid2ViL3NpdGUueHNsIik7Ci0JCQljYWNoZSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJtc3htbDIuWFNMVGVtcGxhdGUuMy4wIik7Ci0JCQljYWNoZS5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKLQkJCXRyYW5zZm9ybURhdGEoKTsKLQkJfQotCX0KLQkvLyBzZXBhcmF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBmb3IgSUUgNi4wKwotCWZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoKXsKLQkJdmFyIHByb2Nlc3NvciA9IGNhY2hlLmNyZWF0ZVByb2Nlc3NvcigpOwotCQlwcm9jZXNzb3IuaW5wdXQgPSB4bWxGaWxlOwotCQlwcm9jZXNzb3IudHJhbnNmb3JtKCk7Ci0JCWRhdGEuaW5uZXJIVE1MID0gcHJvY2Vzc29yLm91dHB1dDsKLQl9Ci0JLy8gc2VwYXJhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gZm9yIE5TQ1AgNy4xKyBhbmQgTW96aWxsYSAxLjQuMSsKLQlmdW5jdGlvbiB0cmFuc2Zvcm0oKXsKLQkJcmV0dXJudmFsKz0xOwotCQlpZiAocmV0dXJudmFsPT0yKXsKLQkJCXZhciBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpOwotCQkJcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoc3R5bGVzaGVldCk7Ci0JCQlkb2MgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWxGaWxlKTsKLQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkYXRhIikuaW5uZXJIVE1MID0gZG9jLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUw7Ci0JCX0KLQl9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IG9ubG9hZD0iaW5pdCgpOyI+Ci08IS0tW2luc2VydCBzdGF0aWMgSFRNTCBoZXJlXS0tPgotPGRpdiBpZD0iZGF0YSI+PCEtLSB0aGlzIGlzIHdoZXJlIHRoZSB0cmFuc2Zvcm1lZCBkYXRhIGdvZXMgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL3NpdGUueG1sIGIvdG9vbHMvZWNsaXBzZS9zaXRlcy9pbnRlcm5hbC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MWMxMC4uMDAwMDAwMAotLS0gYS90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cHM6Ly9hbmRyb2lkLmNvcnAuZ29vZ2xlLmNvbS9hZHQvIj4KLSAgICAgIFVwZGF0ZSBTaXRlIGZvciBBbmRyb2lkIERldmVsb3BtZW50IFRvb2xraXQKLSAgIDwvZGVzY3JpcHRpb24+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdF8wLjkuNS5xdWFsaWZpZXIuamFyIiBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0IiB2ZXJzaW9uPSIwLjkuNS5xdWFsaWZpZXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9ImRldmVsb3BlciIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zXzAuOS41LnF1YWxpZmllci5qYXIiIGlkPSJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zIiB2ZXJzaW9uPSIwLjkuNS5xdWFsaWZpZXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9ImRldmVsb3BlciIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0c18wLjkuNS5xdWFsaWZpZXIuamFyIiBpZD0iY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMiIHZlcnNpb249IjAuOS41LnF1YWxpZmllciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idGVzdCIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJkZXZlbG9wZXIiIGxhYmVsPSJBcHBsaWNhdGlvbiBEZXZlbG9wZXIgVG9vbHMiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgRmVhdHVyZXMgdGhhdCBhZGQgQW5kcm9pZCBzdXBwb3J0IHRvIEVjbGlwc2UgZm9yIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRlc3QiIGxhYmVsPSJQbHVnaW4gRGV2ZWxvcGVyIFRlc3RzIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRlc3RzIGZvciB0aGUgb3RoZXIgQW5kcm9pZCBwbHVnaW5zCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL3dlYi9zaXRlLmNzcyBiL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvaW50ZXJuYWwvd2ViL3NpdGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmM2ZjlmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvaW50ZXJuYWwvd2ViL3NpdGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPFNUWUxFIHR5cGU9InRleHQvY3NzIj4KLXRkLnNwYWNlciB7cGFkZGluZy1ib3R0b206IDEwcHg7IHBhZGRpbmctdG9wOiAxMHB4O30KLS50aXRsZSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBjb2xvcjogIzk5QUFDQzt9Ci0uYm9keVRleHQgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiMwMDAwMDA7ICB9Ci0uc3ViLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlO30KLS5sb2ctdGV4dCB7Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGxpZ2h0ZXI7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjpibGFjazt9Ci0uYmlnLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlOyBib3JkZXItdG9wOjEwcHggc29saWQgd2hpdGU7fQotLmxpZ2h0LXJvdyB7YmFja2dyb3VuZDojRkZGRkZGfQotLmRhcmstcm93IHtiYWNrZ3JvdW5kOiNFRUVFRkZ9Ci0uaGVhZGVyIHtiYWNrZ3JvdW5kOiM5OUFBRER9Ci0jaW5kZW50IHt3b3JkLXdyYXAgOiBicmVhay13b3JkO3dpZHRoIDozMDBweDt0ZXh0LWluZGVudDoxMHB4O30KLTwvU1RZTEU+CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3NpdGVzL2ludGVybmFsL3dlYi9zaXRlLnhzbCBiL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvaW50ZXJuYWwvd2ViL3NpdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQxNTdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2VjbGlwc2Uvc2l0ZXMvaW50ZXJuYWwvd2ViL3NpdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uID0gJzEuMCcgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nIHhtbG5zOm1zeHNsPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhzbHQiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBlbmNvZGluZz0iVVRGLTgiLz4KLTx4c2w6a2V5IG5hbWU9ImNhdCIgbWF0Y2g9ImNhdGVnb3J5IiB1c2U9IkBuYW1lIi8+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJzaXRlIj4KLQk8aHRtbD4KLQk8aGVhZD4KLQk8dGl0bGU+dXBkYXRlLXNpdGU8L3RpdGxlPgotCTxzdHlsZT5AaW1wb3J0IHVybCgid2ViL3NpdGUuY3NzIik7PC9zdHlsZT4KLQk8L2hlYWQ+Ci0JPGJvZHk+Ci0JPGgxIGNsYXNzPSJ0aXRsZSI+dXBkYXRlLXNpdGU8L2gxPgotCTxwIGNsYXNzPSJib2R5VGV4dCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRlc2NyaXB0aW9uIi8+PC9wPgotCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjIiPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjYXRlZ29yeS1kZWYiPgotCQk8eHNsOnNvcnQgc2VsZWN0PSJAbGFiZWwiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+Ci0JCTx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiBjYXNlLW9yZGVyPSJ1cHBlci1maXJzdCIvPgotCTx4c2w6aWYgdGVzdD0iY291bnQoa2V5KCdjYXQnLEBuYW1lKSkgIT0gMCI+Ci0JCQk8dHIgY2xhc3M9ImhlYWRlciI+Ci0JCQkJPHRkIGNsYXNzPSJzdWItaGVhZGVyIiB3aWR0aD0iMzAlIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9InN1Yi1oZWFkZXIiIHdpZHRoPSI3MCUiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0ia2V5KCdjYXQnLEBuYW1lKSI+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQHZlcnNpb24iIG9yZGVyPSJhc2NlbmRpbmciLz4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AaWQiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+Ci0JCQk8dHI+Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9Iihwb3NpdGlvbigpIG1vZCAyID0gMSkiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+ZGFyay1yb3c8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmxpZ2h0LXJvdzwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPgotCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BsYWJlbCI+Ci0JCQkJCQkJPGEgaHJlZj0ie2FuY2VzdG9yOjpmZWF0dXJlLy9AdXJsfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AbGFiZWwiLz48L2E+Ci0JCQkJCQkJPGJyLz4KLQkJCQkJCQk8ZGl2IGlkPSJpbmRlbnQiPgotCQkJCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BpZCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQHZlcnNpb24iLz4pCi0JCQkJCQkJPC9kaXY+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8YSBocmVmPSJ7YW5jZXN0b3I6OmZlYXR1cmUvL0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BpZCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQHZlcnNpb24iLz48L2E+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQk8YnIgLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPHRhYmxlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG9zIj4KLQkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+T3BlcmF0aW5nIFN5c3RlbXM6PC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BvcyIvPjwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQHdzIj4KLQkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+V2luZG93cyBTeXN0ZW1zOjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9Ad3MiLz48L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BubCI+Ci0JCQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPkxhbmd1YWdlczo8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG5sIi8+PC90ZD4KLQkJCQkJCQk8L3RyPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AYXJjaCI+Ci0JCQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPkFyY2hpdGVjdHVyZTo8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGFyY2giLz48L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90YWJsZT4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTwveHNsOmZvci1lYWNoPgotCQkJPHRyPjx0ZCBjbGFzcz0ic3BhY2VyIj48YnIvPjwvdGQ+PHRkIGNsYXNzPSJzcGFjZXIiPjxici8+PC90ZD48L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8eHNsOmlmIHRlc3Q9ImNvdW50KGZlYXR1cmUpICAmZ3Q7IGNvdW50KGZlYXR1cmUvY2F0ZWdvcnkpIj4KLQk8dHIgY2xhc3M9ImhlYWRlciI+Ci0JCTx0ZCBjbGFzcz0ic3ViLWhlYWRlciIgY29sc3Bhbj0iMiI+Ci0JCVVuY2F0ZWdvcml6ZWQKLQkJPC90ZD4KLQk8L3RyPgotCTwveHNsOmlmPgotCTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJmdW5jdGlvbi1hdmFpbGFibGUoJ21zeHNsOm5vZGUtc2V0JykiPgotCSAgIDx4c2w6dmFyaWFibGUgbmFtZT0icnRmLW5vZGVzIj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZlYXR1cmVbbm90KGNhdGVnb3J5KV0iPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQGlkIiBvcmRlcj0iYXNjZW5kaW5nIiBjYXNlLW9yZGVyPSJ1cHBlci1maXJzdCIvPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHZlcnNpb24iIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iLiIgLz4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JICAgPC94c2w6dmFyaWFibGU+Ci0JICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJteU5vZGVTZXQiIHNlbGVjdD0ibXN4c2w6bm9kZS1zZXQoJHJ0Zi1ub2RlcykvKiIvPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbXlOb2RlU2V0Ij4KLQk8dHI+Ci0JCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+ZGFyay1yb3c8L3hzbDphdHRyaWJ1dGU+Ci0JCTwveHNsOndoZW4+Ci0JCTx4c2w6b3RoZXJ3aXNlPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+bGlnaHQtcm93PC94c2w6YXR0cmlidXRlPgotCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJAbGFiZWwiPgotCQkJCTxhIGhyZWY9IntAdXJsfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPjwvYT4KLQkJCQk8YnIgLz4KLQkJCQk8ZGl2IGlkPSJpbmRlbnQiPgotCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2ZXJzaW9uIi8+KQotCQkJCTwvZGl2PgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTxhIGhyZWY9IntAdXJsfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmVyc2lvbiIvPjwvYT4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJCTxiciAvPjxiciAvPgotCQk8L3RkPgotCQk8dGQ+Ci0JCQk8dGFibGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJAb3MiPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+T3BlcmF0aW5nIFN5c3RlbXM6PC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcyIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJAd3MiPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+V2luZG93cyBTeXN0ZW1zOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAd3MiLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iQG5sIj4KLQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPkxhbmd1YWdlczo8L3RkPgotCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5sIi8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9IkBhcmNoIj4KLQkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPkFyY2hpdGVjdHVyZTo8L3RkPgotCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFyY2giLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC90ZD4KLQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwveHNsOndoZW4+Ci0JPHhzbDpvdGhlcndpc2U+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZlYXR1cmVbbm90KGNhdGVnb3J5KV0iPgotCTx4c2w6c29ydCBzZWxlY3Q9IkBpZCIgb3JkZXI9ImFzY2VuZGluZyIgY2FzZS1vcmRlcj0idXBwZXItZmlyc3QiLz4KLQk8eHNsOnNvcnQgc2VsZWN0PSJAdmVyc2lvbiIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQk8dHI+Ci0JCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0iY291bnQocHJlY2VkaW5nLXNpYmxpbmc6OmZlYXR1cmVbbm90KGNhdGVnb3J5KV0pIG1vZCAyID0gMSI+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kYXJrLXJvdzwveHNsOmF0dHJpYnV0ZT4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5saWdodC1yb3c8L3hzbDphdHRyaWJ1dGU+Ci0JCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IkBsYWJlbCI+Ci0JCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+PC9hPgotCQkJCTxiciAvPgotCQkJCTxkaXYgaWQ9ImluZGVudCI+Ci0JCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZlcnNpb24iLz4pCi0JCQkJPC9kaXY+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2ZXJzaW9uIi8+PC9hPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQkJPGJyIC8+PGJyIC8+Ci0JCTwvdGQ+Ci0JCTx0ZD4KLQkJCTx0YWJsZT4KLQkJCQk8eHNsOmlmIHRlc3Q9IkBvcyI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5PcGVyYXRpbmcgU3lzdGVtczo8L3RkPgotCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9zIi8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9IkB3cyI+Ci0JCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5XaW5kb3dzIFN5c3RlbXM6PC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3cyIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJAbmwiPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+TGFuZ3VhZ2VzOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmwiLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iQGFyY2giPgotCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+QXJjaGl0ZWN0dXJlOjwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJjaCIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L3RkPgotCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLQk8L3RhYmxlPgotCTwvYm9keT4KLQk8L2h0bWw+Ci08L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvLmNsYXNzcGF0aCBiL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzMjZjOC4uMDAwMDAwMAotLS0gYS90b29scy9ldmVudGFuYWx5emVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9kZG1saWIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZXZlbnRhbmFseXplci8ucHJvamVjdCBiL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjI5NzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZXZlbnRhbmFseXplci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmV2ZW50YW5hbHl6ZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZXZlbnRhbmFseXplci9BbmRyb2lkLm1rIGIvdG9vbHMvZXZlbnRhbmFseXplci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU3MzBlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1FVkVOVEFOQUxVWkVSX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKEVWRU5UQU5BTFVaRVJfTE9DQUxfRElSKS9ldGMvQW5kcm9pZC5tawotaW5jbHVkZSAkKEVWRU5UQU5BTFVaRVJfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvZXZlbnRhbmFseXplci9ldGMvQW5kcm9pZC5tayBiL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvZXRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzAzYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZXZlbnRhbmFseXplci9ldGMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gZXZlbnRhbmFseXplcgotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvZXRjL2V2ZW50YW5hbHl6ZXIgYi90b29scy9ldmVudGFuYWx5emVyL2V0Yy9ldmVudGFuYWx5emVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNmM3ODk1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvZXRjL2V2ZW50YW5hbHl6ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDUtMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAotIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgotcHJvZz0iJDAiCi13aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwotICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKLSAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKLSAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKLSAgICBlbHNlCi0gICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCi0gICAgZmkKLWRvbmUKLW9sZHdkPWBwd2RgCi1wcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLWNkICIke3Byb2dkaXJ9IgotcHJvZ2Rpcj1gcHdkYAotcHJvZz0iJHtwcm9nZGlyfSIvYGJhc2VuYW1lICIke3Byb2d9ImAKLWNkICIke29sZHdkfSIKLQotamFyZmlsZT1ldmVudGFuYWx5emVyLmphcgotZnJhbWV3b3JrZGlyPSIkcHJvZ2RpciIKLWxpYmRpcj0iJHByb2dkaXIiCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICRqYXJmaWxlIgotICAgIGV4aXQgMQotZmkKLQotCi0jIENoZWNrIGFyZ3MuCi0jIE1hYyBPUyBYIG5lZWRzIGFuIGFkZGl0aW9uYWwgYXJnLCBvciB5b3UgZ2V0IGFuICJpbGxlZ2FsIHRocmVhZCIgY29tcGxhaW50LgotaWYgWyBgdW5hbWVgID0gIkRhcndpbiIgXTsgdGhlbgotICAgIG9zX29wdHM9Ii1Yc3RhcnRPbkZpcnN0VGhyZWFkIgotZWxzZQotICAgIG9zX29wdHM9Ci1maQotCi1pZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF0gOyB0aGVuCi0gICAgamFycGF0aD1gY3lncGF0aCAtdyAgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiYAotICAgIHByb2dkaXI9YGN5Z3BhdGggLXcgICIkcHJvZ2RpciJgCi1lbHNlCi0gICAgamFycGF0aD0iJGZyYW1ld29ya2Rpci8kamFyZmlsZSIKLWZpCi0KLSMgbmVlZCB0byB1c2UgImphdmEuZXh0LmRpcnMiIGJlY2F1c2UgIi1qYXIiIGNhdXNlcyBjbGFzc3BhdGggdG8gYmUgaWdub3JlZAotIyBtaWdodCBuZWVkIG1vcmUgbWVtb3J5LCBlLmcuIC1YbXgxMjhNCi1leGVjIGphdmEgLVhteDEyOE0gJG9zX29wdHMgLURqYXZhLmV4dC5kaXJzPSIkZnJhbWV3b3JrZGlyIiAtRGphdmEubGlicmFyeS5wYXRoPSIkbGliZGlyIiAtamFyICIkamFycGF0aCIgIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvZXZlbnRhbmFseXplci9ldGMvbWFuaWZlc3QudHh0IGIvdG9vbHMvZXZlbnRhbmFseXplci9ldGMvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk5ZWExLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmV2ZW50YW5hbHl6ZXIuRXZlbnRBbmFseXplcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZXZlbnRhbmFseXplci9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NWM2MWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZXZlbnRhbmFseXplci9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0JZGRtbGliCi1MT0NBTF9NT0RVTEUgOj0gZXZlbnRhbmFseXplcgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2V2ZW50YW5hbHl6ZXIvc3JjL2NvbS9hbmRyb2lkL2V2ZW50YW5hbHl6ZXIvRXZlbnRBbmFseXplci5qYXZhIGIvdG9vbHMvZXZlbnRhbmFseXplci9zcmMvY29tL2FuZHJvaWQvZXZlbnRhbmFseXplci9FdmVudEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDQ0ZWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZXZlbnRhbmFseXplci9zcmMvY29tL2FuZHJvaWQvZXZlbnRhbmFseXplci9FdmVudEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZXZlbnRhbmFseXplcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLklMb2dPdXRwdXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkV2ZW50Q29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuRXZlbnRMb2dQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5JbnZhbGlkVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIubG9nLkxvZ1JlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuSUxvZ0xpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuTG9nRW50cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIENvbm5lY3RzIHRvIGEgZGV2aWNlIHVzaW5nIGRkbWxpYiBhbmQgYW5hbHl6ZSBpdHMgZXZlbnQgbG9nLgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRBbmFseXplciBpbXBsZW1lbnRzIElMb2dMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVEFHX0FDVElWSVRZX0xBVU5DSF9USU1FID0gMzAwMDk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhciBEQVRBX1NFUEFSQVRPUiA9ICcsJzsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDVlNfRVhUID0gIi5jc3YiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfRklMRV9FWFQgPSAiLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgRXZlbnRMb2dQYXJzZXIgbVBhcnNlcjsKLSAgICBwcml2YXRlIFRyZWVNYXA8U3RyaW5nLCBBcnJheUxpc3Q8TG9uZz4+IG1MYXVuY2hNYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEFycmF5TGlzdDxMb25nPj4oKTsKLQotICAgIFN0cmluZyBtSW5wdXRUZXh0RmlsZSA9IG51bGw7Ci0gICAgU3RyaW5nIG1JbnB1dEJpbmFyeUZpbGUgPSBudWxsOwotICAgIFN0cmluZyBtSW5wdXREZXZpY2UgPSBudWxsOwotICAgIFN0cmluZyBtSW5wdXRGb2xkZXIgPSBudWxsOwotICAgIFN0cmluZyBtQWx0ZXJuYXRlVGFnRmlsZSA9IG51bGw7Ci0gICAgU3RyaW5nIG1PdXRwdXRGaWxlID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IEV2ZW50QW5hbHl6ZXIoKS5ydW4oYXJncyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlQW5kUXVpdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgU3RyaW5nIGFyZ3VtZW50ID0gYXJnc1tpbmRleCsrXTsKLQotICAgICAgICAgICAgaWYgKCItcyIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIGNoZWNrSW5wdXRWYWxpZGl0eSgiLXMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlQW5kUXVpdCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1JbnB1dERldmljZSA9IGFyZ3NbaW5kZXgrK107Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItZmIiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0lucHV0VmFsaWRpdHkoIi1mYiIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2VBbmRRdWl0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUlucHV0QmluYXJ5RmlsZSA9IGFyZ3NbaW5kZXgrK107Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItZnQiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0lucHV0VmFsaWRpdHkoIi1mdCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2VBbmRRdWl0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUlucHV0VGV4dEZpbGUgPSBhcmdzW2luZGV4KytdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiLUYiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0lucHV0VmFsaWRpdHkoIi1GIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZUFuZFF1aXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtSW5wdXRGb2xkZXIgPSBhcmdzW2luZGV4KytdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiLXQiLmVxdWFscyhhcmd1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZUFuZFF1aXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtQWx0ZXJuYXRlVGFnRmlsZSA9IGFyZ3NbaW5kZXgrK107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZmlsZXBhdGggYW5kIGJyZWFrLgotICAgICAgICAgICAgICAgIG1PdXRwdXRGaWxlID0gYXJndW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIGFueSBvdGhlciBkZXZpY2UuCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRBbmRFeGl0KCJUb28gbWFueSBhcmd1bWVudHMhIiwgZmFsc2UgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGluZGV4IDwgYXJncy5sZW5ndGgpOwotCi0gICAgICAgIGlmICgobUlucHV0VGV4dEZpbGUgPT0gbnVsbCAmJiBtSW5wdXRCaW5hcnlGaWxlID09IG51bGwgJiYgbUlucHV0Rm9sZGVyID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2UgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2VBbmRRdWl0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIG91dHB1dFBhcmVudCA9IG5ldyBGaWxlKG1PdXRwdXRGaWxlKS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIGlmIChvdXRwdXRQYXJlbnQgPT0gbnVsbCB8fCBvdXRwdXRQYXJlbnQuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcHJpbnRBbmRFeGl0KFN0cmluZy5mb3JtYXQoIiUxJHMgaXMgbm90IGEgdmFsaWQgb3VwdXQgZmlsZSIsIG1PdXRwdXRGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlZGlyZWN0IHRoZSBsb2cgb3V0cHV0IHRvIC9kZXYvbnVsbAotICAgICAgICBMb2cuc2V0TG9nT3V0cHV0KG5ldyBJTG9nT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRBbmRQcm9tcHRMb2coTG9nTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFzcwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludExvZyhMb2dMZXZlbCBsb2dMZXZlbCwgU3RyaW5nIHRhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlucHV0QmluYXJ5RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VCaW5hcnlMb2dGaWxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dFRleHRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJzZVRleHRMb2dGaWxlKG1JbnB1dFRleHRGaWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUlucHV0Rm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJzZUZvbGRlcihtSW5wdXRGb2xkZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5wdXREZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnNlTG9nRnJvbURldmljZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhbmFseXplIHRoZSBkYXRhIGdhdGhlcmVkIGJ5IHRoZSBwYXJzZXIgbWV0aG9kcwotICAgICAgICAgICAgYW5hbHl6ZURhdGEoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIGJpbmFyeSBldmVudCBsb2cgZmlsZSBsb2NhdGVkIGF0IHtAbGluayAjbUlucHV0QmluYXJ5RmlsZX0uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZUJpbmFyeUxvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtUGFyc2VyID0gbmV3IEV2ZW50TG9nUGFyc2VyKCk7Ci0KLSAgICAgICAgU3RyaW5nIHRhZ0ZpbGUgPSBtSW5wdXRCaW5hcnlGaWxlICsgVEFHX0ZJTEVfRVhUOwotICAgICAgICBpZiAobVBhcnNlci5pbml0KHRhZ0ZpbGUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSBsb2NhdGlvbgotICAgICAgICAgICAgaWYgKG1BbHRlcm5hdGVUYWdGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVBhcnNlci5pbml0KG1BbHRlcm5hdGVUYWdGaWxlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIkZhaWxlZCB0byBnZXQgZXZlbnQgdGFncyBmcm9tICIgKyBtQWx0ZXJuYXRlVGFnRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiB0ZXJtaW5hdGUqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIkZhaWxlZCB0byBnZXQgZXZlbnQgdGFncyBmcm9tICIgKyB0YWdGaWxlLCBmYWxzZSAvKiB0ZXJtaW5hdGUqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMb2dSZWNlaXZlciByZWNlaXZlciA9IG5ldyBMb2dSZWNlaXZlcih0aGlzKTsKLQotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjU2XTsKLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtSW5wdXRCaW5hcnlGaWxlKTsKLQotICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgIHdoaWxlICgoY291bnQgPSBmaXMucmVhZChidWZmZXIpKSAhPSAtMSkgewotICAgICAgICAgICAgcmVjZWl2ZXIucGFyc2VOZXdEYXRhKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSB0ZXh0IExvZyBmaWxlLgotICAgICAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZVRleHRMb2dGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbVBhcnNlciA9IG5ldyBFdmVudExvZ1BhcnNlcigpOwotCi0gICAgICAgIFN0cmluZyB0YWdGaWxlID0gZmlsZVBhdGggKyBUQUdfRklMRV9FWFQ7Ci0gICAgICAgIGlmIChtUGFyc2VyLmluaXQodGFnRmlsZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uCi0gICAgICAgICAgICBpZiAobUFsdGVybmF0ZVRhZ0ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtUGFyc2VyLmluaXQobUFsdGVybmF0ZVRhZ0ZpbGUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50QW5kRXhpdCgiRmFpbGVkIHRvIGdldCBldmVudCB0YWdzIGZyb20gIiArIG1BbHRlcm5hdGVUYWdGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHRlcm1pbmF0ZSovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50QW5kRXhpdCgiRmFpbGVkIHRvIGdldCBldmVudCB0YWdzIGZyb20gIiArIHRhZ0ZpbGUsIGZhbHNlIC8qIHRlcm1pbmF0ZSovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgdGhlIGxpbmVzIGZyb20gdGhlIGZpbGUgYW5kIHByb2Nlc3MgdGhlbS4KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSkpOwotCi0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc0V2ZW50KG1QYXJzZXIucGFyc2UobGluZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlTG9nRnJvbURldmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGluaXQgdGhlIGxpYgotICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuaW5pdChmYWxzZSAvKiBkZWJ1Z2dlciBzdXBwb3J0ICovKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZSA9IEFuZHJvaWREZWJ1Z0JyaWRnZS5jcmVhdGVCcmlkZ2UoKTsKLQotICAgICAgICAgICAgLy8gd2UgY2FuJ3QganVzdCBhc2sgZm9yIHRoZSBkZXZpY2UgbGlzdCByaWdodCBhd2F5LCBhcyB0aGUgaW50ZXJuYWwgdGhyZWFkIGdldHRpbmcKLSAgICAgICAgICAgIC8vIHRoZW0gZnJvbSBBREIgbWF5IG5vdCBiZSBkb25lIGdldHRpbmcgdGhlIGZpcnN0IGxpc3QuCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBkb24ndCByZWFsbHkgd2FudCBnZXREZXZpY2VzKCkgdG8gYmUgYmxvY2tpbmcsIHdlIHdhaXQgaGVyZSBtYW51YWxseS4KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoYnJpZGdlLmhhc0luaXRpYWxEZXZpY2VMaXN0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBsZXQncyBub3Qgd2FpdCA+IDEwIHNlYy4KLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAxMDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRBbmRFeGl0KCJUaW1lb3V0IGdldHRpbmcgZGV2aWNlIGxpc3QhIiwgdHJ1ZSAvKiB0ZXJtaW5hdGUqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ2V0IHRoZSBkZXZpY2VzCi0gICAgICAgICAgICBJRGV2aWNlW10gZGV2aWNlcyA9IGJyaWRnZS5nZXREZXZpY2VzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSURldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKS5lcXVhbHMobUlucHV0RGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBncmFiTG9nRnJvbShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kICIgKyBtSW5wdXREZXZpY2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBsb2cgZmlsZXMgbG9jYXRlZCBpbiB0aGUgZm9sZGVyLCBhbmQgaXRzIHN1Yi1mb2xkZXJzLgotICAgICAqIEBwYXJhbSBmb2xkZXJQYXRoIHRoZSBwYXRoIHRvIHRoZSBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlRm9sZGVyKFN0cmluZyBmb2xkZXJQYXRoKSB7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZvbGRlclBhdGgpOwotICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBwcmludEFuZEV4aXQoU3RyaW5nLmZvcm1hdCgiJTEkcyBpcyBub3QgYSB2YWxpZCBmb2xkZXIiLCBmb2xkZXJQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZi5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIudGFnIikgPT0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmID0gbmV3IEZpbGUoZm9sZGVyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUZvbGRlcihmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJzZVRleHRMb2dGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBmaWxlLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdyYWJMb2dGcm9tKElEZXZpY2UgZGV2aWNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtUGFyc2VyID0gbmV3IEV2ZW50TG9nUGFyc2VyKCk7Ci0gICAgICAgIGlmIChtUGFyc2VyLmluaXQoZGV2aWNlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcHJpbnRBbmRFeGl0KCJGYWlsZWQgdG8gZ2V0IGV2ZW50LWxvZy10YWdzIGZyb20gIiArIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB0ZXJtaW5hdGUqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2dSZWNlaXZlciByZWNlaXZlciA9IG5ldyBMb2dSZWNlaXZlcih0aGlzKTsKLQotICAgICAgICBkZXZpY2UucnVuRXZlbnRMb2dTZXJ2aWNlKHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbmFseXplIHRoZSBkYXRhIGFuZCB3cml0ZXMgaXQgdG8ge0BsaW5rICNtT3V0cHV0RmlsZX0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFuYWx5emVEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBuYW1lIGhhcyB0aGUgcHJvcGVyIGV4dGVuc2lvbi4KLSAgICAgICAgICAgIGlmIChtT3V0cHV0RmlsZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKENWU19FWFQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dEZpbGUgPSBtT3V0cHV0RmlsZSArIENWU19FWFQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihtT3V0cHV0RmlsZSkpOwotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGxpc3Qgb2YgbGF1bmNoIHN0YXJ0LiBPbmUgY29sdW1uIHBlciBhY3Rpdml0eS4KLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGFjdGl2aXRpZXMgPSBtTGF1bmNoTWFwLmtleVNldCgpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgY29sdW1uIGhlYWRlcnMuCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBhY3Rpdml0eSA6IGFjdGl2aXRpZXMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhY3Rpdml0eSkuYXBwZW5kKERBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZShidWlsZGVyLmFwcGVuZCgnXG4nKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gbG9vcCBvbiB0aGUgYWN0aXZpdGllcyBhbmQgd3JpdGUgdGhlaXIgdmFsdWVzLgotICAgICAgICAgICAgYm9vbGVhbiBtb3JlVmFsdWVzID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAobW9yZVZhbHVlcykgewotICAgICAgICAgICAgICAgIG1vcmVWYWx1ZXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldExlbmd0aCgwKTsKLQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFjdGl2aXR5IDogYWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFjdGl2aXR5IGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxMb25nPiBsaXN0ID0gbUxhdW5jaE1hcC5nZXQoYWN0aXZpdHkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBsaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9yZVZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaXN0LmdldChpbmRleCkubG9uZ1ZhbHVlKCkpLmFwcGVuZChEQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChEQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICBpZiAobW9yZVZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVpbGRlci5hcHBlbmQoJ1xuJykudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgcGVyLWFjdGl2aXR5IHN0YXRzLgotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWN0aXZpdHkgOiBhY3Rpdml0aWVzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWN0aXZpdHkpLmFwcGVuZChEQVRBX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFjdGl2aXR5IGxpc3QuCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PExvbmc+IGxpc3QgPSBtTGF1bmNoTWFwLmdldChhY3Rpdml0eSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKLQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIG1pbi9tYXgKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaXN0LmdldCgwKS5sb25nVmFsdWUoKSkuYXBwZW5kKERBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaXN0LmdldChsaXN0LnNpemUoKS0xKS5sb25nVmFsdWUoKSkuYXBwZW5kKERBVEFfU0VQQVJBVE9SKTsKLQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIG1lZGlhbiB2YWx1ZQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpc3QuZ2V0KGxpc3Quc2l6ZSgpLzIpLmxvbmdWYWx1ZSgpKS5hcHBlbmQoREFUQV9TRVBBUkFUT1IpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhbmQgd3JpdGUgYXZlcmFnZQotICAgICAgICAgICAgICAgIGxvbmcgdG90YWwgPSAwOyAvLyBkZXNwaXRlIGJlaW5nIGVuY29kZWQgb24gYSBsb25nLCB0aGUgdmFsdWVzIGFyZSBsb3cgZW5vdWdoIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBMb25nIHNob3VsZCBiZSBlbm91Z2ggdG8gY29tcHV0ZSB0aGUgdG90YWwKLSAgICAgICAgICAgICAgICBmb3IgKExvbmcgdmFsdWUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHZhbHVlLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0b3RhbCAvIGxpc3Quc2l6ZSgpKS5hcHBlbmQoREFUQV9TRVBBUkFUT1IpOwotCi0gICAgICAgICAgICAgICAgLy8gZmluYWxseSB3cml0ZSB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVpbGRlci5hcHBlbmQoJ1xuJykudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuZGRtbGliLmxvZy5Mb2dSZWNlaXZlci5JTG9nTGlzdGVuZXIjbmV3RGF0YShieXRlW10sIGludCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5ld0RhdGEoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgLy8gd2UgaWdub3JlIHJhdyBkYXRhLiBOZXcgZW50cmllcyBhcmUgcHJvY2Vzc2VkIGluICNuZXdFbnRyeShMb2dFbnRyeSkKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuSUxvZ0xpc3RlbmVyI25ld0VudHJ5KGNvbS5hbmRyb2lkLmRkbWxpYi5sb2cuTG9nUmVjZWl2ZXIuTG9nRW50cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbmV3RW50cnkoTG9nRW50cnkgZW50cnkpIHsKLSAgICAgICAgLy8gcGFyc2UgYW5kIHByb2Nlc3MgdGhlIGVudHJ5IGRhdGEuCi0gICAgICAgIHByb2Nlc3NFdmVudChtUGFyc2VyLnBhcnNlKGVudHJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFdmVudChFdmVudENvbnRhaW5lciBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5tVGFnID09IFRBR19BQ1RJVklUWV9MQVVOQ0hfVElNRSkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBhY3Rpdml0eSBuYW1lCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VmFsdWVBc1N0cmluZygwKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGF1bmNoIHRpbWUKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBldmVudC5nZXRWYWx1ZSgxKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZExhdW5jaFRpbWUobmFtZSwgKExvbmcpdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFR5cGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGdldCB0aGUgbmFtZSBhcyBhIHN0cmluZy4uLgotICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIGV2ZW50LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExhdW5jaFRpbWUoU3RyaW5nIG5hbWUsIExvbmcgdmFsdWUpIHsKLSAgICAgICAgQXJyYXlMaXN0PExvbmc+IGxpc3QgPSBtTGF1bmNoTWFwLmdldChuYW1lKTsKLQotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOwotICAgICAgICAgICAgbUxhdW5jaE1hcC5wdXQobmFtZSwgbGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW5wdXRWYWxpZGl0eShTdHJpbmcgb3B0aW9uKSB7Ci0gICAgICAgIGlmIChtSW5wdXRUZXh0RmlsZSAhPSBudWxsIHx8IG1JbnB1dEJpbmFyeUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJpbnRBbmRFeGl0KFN0cmluZy5mb3JtYXQoIkVSUk9SOiAlMSRzIGNhbm5vdCBiZSB1c2VkIHdpdGggYW4gaW5wdXQgZmlsZS4iLCBvcHRpb24pLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiB0ZXJtaW5hdGUgKi8pOwotICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dEZvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEFuZEV4aXQoU3RyaW5nLmZvcm1hdCgiRVJST1I6ICUxJHMgY2Fubm90IGJlIHVzZWQgd2l0aCBhbiBpbnB1dCBmaWxlLiIsIG9wdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByaW50QW5kRXhpdChTdHJpbmcuZm9ybWF0KCJFUlJPUjogJTEkcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIGlucHV0IGRldmljZSBzZXJpYWwgbnVtYmVyLiIsCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiksIGZhbHNlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2VBbmRRdWl0KCkgewotICAgICAgICAvLyA4MCBjb2xzIG1hcmtlcjogIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgZXZlbnRhbmFseXplciBbLXQgPFRBR19GSUxFPl0gPFNPVVJDRT4gPE9VVFBVVD4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQb3NzaWJsZSBzb3VyY2VzOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1mYiA8ZmlsZT4gICAgVGhlIHBhdGggdG8gYSBiaW5hcnkgZXZlbnQgbG9nLCBnYXRoZXJlZCBieSBkdW1wZXZlbnRsb2ciKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAtZnQgPGZpbGU+ICAgIFRoZSBwYXRoIHRvIGEgdGV4dCBldmVudCBsb2csIGdhdGhlcmVkIGJ5IGFkYiBsb2djYXQgLWIgZXZlbnRzIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgLUYgPGZvbGRlcj4gICBUaGUgcGF0aCB0byBhIGZvbGRlciBjb250YWluaW5nIG11bHRpcGxlIHRleHQgbG9nIGZpbGVzLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1zIDxzZXJpYWw+ICAgVGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIERldmljZSB0byBncmFiIHRoZSBldmVudCBsb2cgZnJvbS4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcHRpb25zOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC10IDxmaWxlPiAgICAgVGhlIHBhdGggdG8gdGFnIGZpbGUgdG8gdXNlIGluIGNhc2UgdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGgiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UgaXMgbWlzc2luZyIpOwotCi0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEFuZEV4aXQoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdGVybWluYXRlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgaWYgKHRlcm1pbmF0ZSkgewotICAgICAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9BbmRyb2lkLm1rIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGUyZWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ISUVSQVJDSFlWSUVXRVJfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoSElFUkFSQ0hZVklFV0VSX0xPQ0FMX0RJUikvZXRjL0FuZHJvaWQubWsKLWluY2x1ZGUgJChISUVSQVJDSFlWSUVXRVJfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvZXRjL0FuZHJvaWQubWsgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvZXRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTRhN2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1BSRUJVSUxUX0VYRUNVVEFCTEVTIDo9IGhpZXJhcmNoeXZpZXdlcgotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9ldGMvaGllcmFyY2h5dmlld2VyIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9oaWVyYXJjaHl2aWV3ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNDQ0MzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9oaWVyYXJjaHl2aWV3ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLSMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXByb2c9IiQwIgotd2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KLSAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCi0gICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCi0gICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCi0gICAgZWxzZQotICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLSAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgotICAgIGZpCi1kb25lCi1vbGR3ZD1gcHdkYAotcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtvbGR3ZH0iCi0KLWphcmZpbGU9aGllcmFyY2h5dmlld2VyLmphcgotZnJhbWV3b3JrZGlyPSIkcHJvZ2RpciIKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2ZyYW1ld29yawotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBlY2hvIGBiYXNlbmFtZSAiJHByb2ciYCI6IGNhbid0IGZpbmQgJGphcmZpbGUiCi0gICAgZXhpdCAxCi1maQotCi1pZiBbICIkT1NUWVBFIiA9ICJjeWd3aW4iIF0gOyB0aGVuCi0gICAgamFycGF0aD1gY3lncGF0aCAtdyAgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiYAotICAgIHByb2dkaXI9YGN5Z3BhdGggLXcgICIkcHJvZ2RpciJgCi1lbHNlCi0gICAgamFycGF0aD0iJGZyYW1ld29ya2Rpci8kamFyZmlsZSIKLWZpCi0KLSMgbmVlZCB0byB1c2UgImphdmEuZXh0LmRpcnMiIGJlY2F1c2UgIi1qYXIiIGNhdXNlcyBjbGFzc3BhdGggdG8gYmUgaWdub3JlZAotIyBtaWdodCBuZWVkIG1vcmUgbWVtb3J5LCBlLmcuIC1YbXgxMjhNCi1leGVjIGphdmEgLVhteDUxMk0gLURqYXZhLmV4dC5kaXJzPSIkZnJhbWV3b3JrZGlyIiAtRGhpZXJhcmNoeXZpZXdlci5hZGI9IiRwcm9nZGlyIiAtamFyICIkamFycGF0aCIgIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9oaWVyYXJjaHl2aWV3ZXIuYmF0IGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9oaWVyYXJjaHl2aWV3ZXIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDI0YTc5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9ldGMvaGllcmFyY2h5dmlld2VyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1yZW0KLXJlbSBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXJlbSB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1yZW0gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1yZW0KLXJlbSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotcmVtCi1yZW0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotcmVtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1yZW0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1yZW0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotcmVtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1yZW0gZG9uJ3QgbW9kaWZ5IHRoZSBjYWxsZXIncyBlbnZpcm9ubWVudAotc2V0bG9jYWwKLQotcmVtIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAotcmVtIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCi1zZXQgcHJvZz0lfmYwCi0KLXJlbSBDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgYW5kIGRyaXZlIHRvIHdoZXJlIHRoZSBzY3JpcHQgaXMsIHRvIGF2b2lkCi1yZW0gaXNzdWVzIHdpdGggZGlyZWN0b3JpZXMgY29udGFpbmluZyB3aGl0ZXNwYWNlcy4KLWNkIC9kICV+ZHAwCi0KLXNldCBqYXJmaWxlPWhpZXJhcmNoeXZpZXdlci5qYXIKLXNldCBmcmFtZXdvcmtkaXI9Ci1zZXQgbGliZGlyPQotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9bGliXAotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9Li5cZnJhbWV3b3JrXAotCi06SmFyRmlsZU9rCi0KLXNldCBqYXJwYXRoPSVmcmFtZXdvcmtkaXIlJWphcmZpbGUlCi0KLWNhbGwgamF2YSAtWG14NTEybSAtRGphdmEuZXh0LmRpcnM9JWZyYW1ld29ya2RpciUgLURoaWVyYXJjaHl2aWV3ZXIuYWRiPSAtamFyICVqYXJwYXRoJSAlKgpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkZGZhOS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLkhpZXJhcmNoeVZpZXdlcgotQ2xhc3MtUGF0aDogZGRtbGliLmphciBzd2luZy13b3JrZXItMS4xLmphciBvcmctb3BlbmlkZS11dGlsLmphciBvcmctbmV0YmVhbnMtYXBpLXZpc3VhbC5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMWYxZS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmVzb3VyY2VzCi0KLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0JZGRtbGliIFwKLQlzd2luZy13b3JrZXItMS4xIFwKLQlvcmctb3BlbmlkZS11dGlsIFwKLQlvcmctbmV0YmVhbnMtYXBpLXZpc3VhbAotTE9DQUxfTU9EVUxFIDo9IGhpZXJhcmNoeXZpZXdlcgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL0hpZXJhcmNoeVZpZXdlci5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvSGllcmFyY2h5Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Y2U2N2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvSGllcmFyY2h5Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuV29ya3NwYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5kZXZpY2UuRGV2aWNlQnJpZGdlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVuc3VwcG9ydGVkTG9va0FuZEZlZWxFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBIaWVyYXJjaHlWaWV3ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZSBPU19XSU5ET1dTID0gIldpbmRvd3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZSBPU19NQUNPU1ggPSAiTWFjIE9TIFgiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0VXNlckludGVyZmFjZSgpIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJhcHBsZS5sYWYudXNlU2NyZWVuTWVudUJhciIsICJ0cnVlIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiYXBwbGUuYXd0LmJydXNoTWV0YWxMb29rIiwgInRydWUiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjb20uYXBwbGUubXJqLmFwcGxpY2F0aW9uLmFwcGxlLm1lbnUuYWJvdXQubmFtZSIsICJIaWVyYXJjaHlWaWV3ZXIiKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG9zLmNvbnRhaW5zKE9TX1dJTkRPV1MpIHx8IG9zLmNvbnRhaW5zKE9TX01BQ09TWCkpIHsKLSAgICAgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldENyb3NzUGxhdGZvcm1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkTG9va0FuZEZlZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaW5pdFVzZXJJbnRlcmZhY2UoKTsKLSAgICAgICAgRGV2aWNlQnJpZGdlLmluaXREZWJ1Z0JyaWRnZSgpOwotCi0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBXb3Jrc3BhY2Ugd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV29ya3NwYWNlLkVYSVRfT05fQ0xPU0UpOwotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5zZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7Ci0gICAgICAgICAgICAgICAgd29ya3NwYWNlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL2RldmljZS9Db25maWd1cmF0aW9uLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9kZXZpY2UvQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA3MzBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL2RldmljZS9Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TRVJWRVJfUE9SVCA9IDQ5Mzk7Ci0KLSAgICAvLyBUaGVzZSBjb2RlcyBtdXN0IG1hdGNoIHRoZSBhdXRvLWdlbmVyYXRlZCBjb2RlcyBpbiBJV2luZG93TWFuYWdlci5qYXZhCi0gICAgLy8gU2VlIElXaW5kb3dNYW5hZ2VyLmFpZGwgYXMgd2VsbAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ09ERV9TVEFSVF9TRVJWRVIgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ09ERV9TVE9QX1NFUlZFUiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DT0RFX0lTX1NFUlZFUl9SVU5OSU5HID0gMzsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL2RldmljZS9EZXZpY2VCcmlkZ2UuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL2RldmljZS9EZXZpY2VCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2MGJlNi4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9kZXZpY2UvRGV2aWNlQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTXVsdGlMaW5lUmVjZWl2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGNsYXNzIERldmljZUJyaWRnZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQW5kcm9pZERlYnVnQnJpZGdlIGJyaWRnZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8SURldmljZSwgSW50ZWdlcj4gZGV2aWNlUG9ydE1hcCA9IG5ldyBIYXNoTWFwPElEZXZpY2UsIEludGVnZXI+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRMb2NhbFBvcnQgPSBDb25maWd1cmF0aW9uLkRFRkFVTFRfU0VSVkVSX1BPUlQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdERlYnVnQnJpZGdlKCkgewotICAgICAgICBpZiAoYnJpZGdlID09IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5pbml0KGZhbHNlIC8qIGRlYnVnZ2VyIHN1cHBvcnQgKi8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicmlkZ2UgPT0gbnVsbCB8fCAhYnJpZGdlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBhZGJMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaGllcmFyY2h5dmlld2VyLmFkYiIpOwotICAgICAgICAgICAgaWYgKGFkYkxvY2F0aW9uICE9IG51bGwgJiYgYWRiTG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGFkYkxvY2F0aW9uICs9IEZpbGUuc2VwYXJhdG9yICsgImFkYiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkYkxvY2F0aW9uID0gImFkYiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyaWRnZSA9IEFuZHJvaWREZWJ1Z0JyaWRnZS5jcmVhdGVCcmlkZ2UoYWRiTG9jYXRpb24sIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TGlzdGVuRm9yRGV2aWNlcyhBbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS5hZGREZXZpY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3BMaXN0ZW5Gb3JEZXZpY2VzKEFuZHJvaWREZWJ1Z0JyaWRnZS5JRGV2aWNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnJlbW92ZURldmljZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElEZXZpY2VbXSBnZXREZXZpY2VzKCkgewotICAgICAgICByZXR1cm4gYnJpZGdlLmdldERldmljZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWV3U2VydmVyUnVubmluZyhJRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbml0RGVidWdCcmlkZ2UoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRldmljZS5pc09ubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoYnVpbGRJc1NlcnZlclJ1bm5pbmdTaGVsbENvbW1hbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuUmVzdWx0UmVhZGVyKHJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0Vmlld1NlcnZlcihJRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gc3RhcnRWaWV3U2VydmVyKGRldmljZSwgQ29uZmlndXJhdGlvbi5ERUZBVUxUX1NFUlZFUl9QT1JUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnRWaWV3U2VydmVyKElEZXZpY2UgZGV2aWNlLCBpbnQgcG9ydCkgewotICAgICAgICBpbml0RGVidWdCcmlkZ2UoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRldmljZS5pc09ubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoYnVpbGRTdGFydFNlcnZlclNoZWxsQ29tbWFuZChwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuUmVzdWx0UmVhZGVyKHJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0b3BWaWV3U2VydmVyKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGluaXREZWJ1Z0JyaWRnZSgpOwotICAgICAgICBmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmlzT25saW5lKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChidWlsZFN0b3BTZXJ2ZXJTaGVsbENvbW1hbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuUmVzdWx0UmVhZGVyKHJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgYSBqdXN0LWNvbm5lY3RlZCBkZXZpY2UgdG8gd29yayB3aXRoIHRoZSB2aWV3IHNlcnZlci4KLSAgICAgKiA8cC8+VGhpcyBzdGFydHMgYSBwb3J0IGZvcndhcmRpbmcgYmV0d2VlbiBhIGxvY2FsIHBvcnQgYW5kIGEgcG9ydCBvbiB0aGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBkZXZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEZXZpY2VGb3J3YXJkKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZGV2aWNlUG9ydE1hcCkgewotICAgICAgICAgICAgaWYgKGRldmljZS5nZXRTdGF0ZSgpID09IElEZXZpY2UuRGV2aWNlU3RhdGUuT05MSU5FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxvY2FsUG9ydCA9IG5leHRMb2NhbFBvcnQrKzsKLSAgICAgICAgICAgICAgICBkZXZpY2UuY3JlYXRlRm9yd2FyZChsb2NhbFBvcnQsIENvbmZpZ3VyYXRpb24uREVGQVVMVF9TRVJWRVJfUE9SVCk7Ci0gICAgICAgICAgICAgICAgZGV2aWNlUG9ydE1hcC5wdXQoZGV2aWNlLCBsb2NhbFBvcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURldmljZUZvcndhcmQoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChkZXZpY2VQb3J0TWFwKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGxvY2FsUG9ydCA9IGRldmljZVBvcnRNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAobG9jYWxQb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UucmVtb3ZlRm9yd2FyZChsb2NhbFBvcnQsIENvbmZpZ3VyYXRpb24uREVGQVVMVF9TRVJWRVJfUE9SVCk7Ci0gICAgICAgICAgICAgICAgZGV2aWNlUG9ydE1hcC5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZUxvY2FsUG9ydChJRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRldmljZVBvcnRNYXApIHsKLSAgICAgICAgICAgIEludGVnZXIgcG9ydCA9IGRldmljZVBvcnRNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExvZy5lKCJoaWVyYXJjaHkiLCAiTWlzc2luZyBmb3J3YXJkZWQgcG9ydCBmb3IgIiArIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZFN0YXJ0U2VydmVyU2hlbGxDb21tYW5kKGludCBwb3J0KSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJzZXJ2aWNlIGNhbGwgd2luZG93ICVkIGkzMiAlZCIsCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TRVJWSUNFX0NPREVfU1RBUlRfU0VSVkVSLCBwb3J0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRTdG9wU2VydmVyU2hlbGxDb21tYW5kKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgic2VydmljZSBjYWxsIHdpbmRvdyAlZCIsIENvbmZpZ3VyYXRpb24uU0VSVklDRV9DT0RFX1NUT1BfU0VSVkVSKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRJc1NlcnZlclJ1bm5pbmdTaGVsbENvbW1hbmQoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJzZXJ2aWNlIGNhbGwgd2luZG93ICVkIiwKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNFUlZJQ0VfQ09ERV9JU19TRVJWRVJfUlVOTklORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQm9vbGVhblJlc3VsdFJlYWRlciBleHRlbmRzIE11bHRpTGluZVJlY2VpdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gbVJlc3VsdDsKLQotICAgICAgICBwdWJsaWMgQm9vbGVhblJlc3VsdFJlYWRlcihib29sZWFuW10gcmVzdWx0KSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0gICAgICAgICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIuKj9cXChbMC05XXs4fSAoWzAtOV17OH0pLioiKTsKLSAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoc3RyaW5nc1swXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9kZXZpY2UvV2luZG93LmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9kZXZpY2UvV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTdkZjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvZGV2aWNlL1dpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZTsKLQotcHVibGljIGNsYXNzIFdpbmRvdyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBXaW5kb3cgRk9DVVNFRF9XSU5ET1cgPSBuZXcgV2luZG93KCI8Rm9jdXNlZCBXaW5kb3c+IiwgLTEpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0gICAgcHJpdmF0ZSBpbnQgaGFzaENvZGU7Ci0KLSAgICBwdWJsaWMgV2luZG93KFN0cmluZyB0aXRsZSwgaW50IGhhc2hDb2RlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICAgICAgdGhpcy5oYXNoQ29kZSA9IGhhc2hDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBlbmNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvbGFmL1VuaWZpZWRDb250ZW50Qm9yZGVyLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9sYWYvVW5pZmllZENvbnRlbnRCb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxZmIzZS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9sYWYvVW5pZmllZENvbnRlbnRCb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5sYWY7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQWJzdHJhY3RCb3JkZXI7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLQotcHVibGljIGNsYXNzIFVuaWZpZWRDb250ZW50Qm9yZGVyIGV4dGVuZHMgQWJzdHJhY3RCb3JkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJPUkRFUl9UT1BfQ09MT1IxID0gbmV3IENvbG9yKDB4NTc1NzU3KTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCT1JERVJfQk9UVE9NX0NPTE9SMSA9IG5ldyBDb2xvcigweDQwNDA0MCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQk9SREVSX0JPVFRPTV9DT0xPUjIgPSBuZXcgQ29sb3IoMHhkOGQ4ZDgpOwotCi0gICAgcHVibGljIHZvaWQgcGFpbnRCb3JkZXIoQ29tcG9uZW50IGMsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGcuc2V0Q29sb3IoQk9SREVSX1RPUF9DT0xPUjEpOwotICAgICAgICBnLmRyYXdMaW5lKHgsIHksIHggKyB3aWR0aCwgeSk7Ci0gICAgICAgIGcuc2V0Q29sb3IoQk9SREVSX0JPVFRPTV9DT0xPUjEpOwotICAgICAgICBnLmRyYXdMaW5lKHgsIHkgKyBoZWlnaHQgLSAyLCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSAyKTsKLSAgICAgICAgZy5zZXRDb2xvcihCT1JERVJfQk9UVE9NX0NPTE9SMik7Ci0gICAgICAgIGcuZHJhd0xpbmUoeCwgeSArIGhlaWdodCAtIDEsIHggKyB3aWR0aCwgeSArIGhlaWdodCAtIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnNldHMgZ2V0Qm9yZGVySW5zZXRzKENvbXBvbmVudCBjb21wb25lbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnNldHMoMSwgMCwgMiwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCb3JkZXJPcGFxdWUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL0NhcHR1cmVMb2FkZXIuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL0NhcHR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMmFjMi4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9DYXB0dXJlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZS5XaW5kb3c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZS5EZXZpY2VCcmlkZ2U7Ci0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci0KLXB1YmxpYyBjbGFzcyBDYXB0dXJlTG9hZGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGxvYWRDYXB0dXJlKElEZXZpY2UgZGV2aWNlLCBXaW5kb3cgd2luZG93LCBTdHJpbmcgcGFyYW1zKSB7Ci0gICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOwotICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldCgpOwotICAgICAgICAgICAgc29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLAotICAgICAgICAgICAgICAgICAgICBEZXZpY2VCcmlkZ2UuZ2V0RGV2aWNlTG9jYWxQb3J0KGRldmljZSkpKTsKLQotICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlKCJDQVBUVVJFICIgKyB3aW5kb3cuZW5jb2RlKCkgKyAiICIgKyBwYXJhbXMpOwotICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICAgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKGluKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRW1wdHkKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1Byb2ZpbGVzTG9hZGVyLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9Qcm9maWxlc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFkYjc5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1Byb2ZpbGVzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLldpbmRvdzsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLkRldmljZUJyaWRnZTsKLQotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgUHJvZmlsZXNMb2FkZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlW10gbG9hZFByb2ZpbGVzKElEZXZpY2UgZGV2aWNlLCBXaW5kb3cgd2luZG93LCBTdHJpbmcgcGFyYW1zKSB7Ci0gICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLSAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlQnJpZGdlLmdldERldmljZUxvY2FsUG9ydChkZXZpY2UpKSk7Ci0KLSAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZSgiUFJPRklMRSAiICsgd2luZG93LmVuY29kZSgpICsgIiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRhdGEgPSByZXNwb25zZS5zcGxpdCgiICIpOwotCi0gICAgICAgICAgICBkb3VibGVbXSBwcm9maWxlcyA9IG5ldyBkb3VibGVbZGF0YS5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZXNbaV0gPSAoTG9uZy5wYXJzZUxvbmcoZGF0YVtpXSkgLyAxMDAwLjApIC8gMTAwMC4wOyAvLyBjb252ZXJ0IHRvIG1zCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvZmlsZXM7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEVtcHR5Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3SGllcmFyY2h5TG9hZGVyLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3SGllcmFyY2h5TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTQyNjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvc2NlbmUvVmlld0hpZXJhcmNoeUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5kZXZpY2UuRGV2aWNlQnJpZGdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5kZXZpY2UuV2luZG93OwotCi1pbXBvcnQgb3JnLm9wZW5pZGUudXRpbC5FeGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFZpZXdIaWVyYXJjaHlMb2FkZXIgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJlbXB0eS1zdGF0ZW1lbnQiKQotICAgIHB1YmxpYyBzdGF0aWMgVmlld0hpZXJhcmNoeVNjZW5lIGxvYWRTY2VuZShJRGV2aWNlIGRldmljZSwgV2luZG93IHdpbmRvdykgewotICAgICAgICBWaWV3SGllcmFyY2h5U2NlbmUgc2NlbmUgPSBuZXcgVmlld0hpZXJhcmNoeVNjZW5lKCk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgdmlld3MgdHJlZQotICAgICAgICBTb2NrZXQgc29ja2V0ID0gbnVsbDsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBsaW5lOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PiBTdGFydGluZyBjbGllbnQiKTsKLQotICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldCgpOwotICAgICAgICAgICAgc29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLAotICAgICAgICAgICAgICAgICAgICBEZXZpY2VCcmlkZ2UuZ2V0RGV2aWNlTG9jYWxQb3J0KGRldmljZSkpKTsKLQotICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc29ja2V0LmdldElucHV0U3RyZWFtKCkpKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT4gRFVNUCIpOwotCi0gICAgICAgICAgICBvdXQud3JpdGUoIkRVTVAgIiArIHdpbmRvdy5lbmNvZGUoKSk7Ci0gICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIFN0YWNrPFZpZXdOb2RlPiBzdGFjayA9IG5ldyBTdGFjazxWaWV3Tm9kZT4oKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzZXRSb290ID0gdHJ1ZTsKLSAgICAgICAgICAgIFZpZXdOb2RlIGxhc3ROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGludCBsYXN0V2hpdGVzcGFjZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIkRPTkUuIi5lcXVhbHNJZ25vcmVDYXNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCB3aGl0ZXNwYWNlQ291bnQgPSBjb3VudEZyb250V2hpdGVzcGFjZShsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFdoaXRlc3BhY2VDb3VudCA8IHdoaXRlc3BhY2VDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGxhc3ROb2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbGFzdFdoaXRlc3BhY2VDb3VudCAtIHdoaXRlc3BhY2VDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RXaGl0ZXNwYWNlQ291bnQgPSB3aGl0ZXNwYWNlQ291bnQ7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZignICcpOwotCi0gICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBuZXcgVmlld05vZGUoKTsKLSAgICAgICAgICAgICAgICBsYXN0Tm9kZS5uYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgbG9hZFByb3BlcnRpZXMobGFzdE5vZGUsIGxpbmUpOwotCi0gICAgICAgICAgICAgICAgc2NlbmUuYWRkTm9kZShsYXN0Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2V0Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBzY2VuZS5zZXRSb290KGxhc3ROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Um9vdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhcmVudCA9IHN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVkZ2UgPSBwYXJlbnQubmFtZSArIGxhc3ROb2RlLm5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIHNjZW5lLmFkZEVkZ2UoZWRnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNjZW5lLnNldEVkZ2VTb3VyY2UoZWRnZSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgc2NlbmUuc2V0RWRnZVRhcmdldChlZGdlLCBsYXN0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLmFkZChsYXN0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVJbmRpY2VzKHNjZW5lLmdldFJvb3QoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEV4Y2VwdGlvbnMucHJpbnRTdGFja1RyYWNlKGV4KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9ucy5wcmludFN0YWNrVHJhY2UoZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT4gRE9ORSIpOwotCi0gICAgICAgIHJldHVybiBzY2VuZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUluZGljZXMoVmlld05vZGUgcm9vdCkgewotICAgICAgICBpZiAocm9vdCA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgcm9vdC5jb21wdXRlSW5kZXgoKTsKLQotICAgICAgICBmb3IgKFZpZXdOb2RlIG5vZGUgOiByb290LmNoaWxkcmVuKSB7Ci0gICAgICAgICAgICB1cGRhdGVJbmRpY2VzKG5vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50RnJvbnRXaGl0ZXNwYWNlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdChjb3VudCkgPT0gJyAnKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRQcm9wZXJ0aWVzKFZpZXdOb2RlIG5vZGUsIFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGJvb2xlYW4gc3RvcDsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCk7Ci0gICAgICAgICAgICBWaWV3Tm9kZS5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBWaWV3Tm9kZS5Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgcHJvcGVydHkubmFtZSA9IGRhdGEuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGludCBpbmRleDIgPSBkYXRhLmluZGV4T2YoJywnLCBpbmRleCArIDEpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoZGF0YS5zdWJzdHJpbmcoaW5kZXggKyAxLCBpbmRleDIpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXgyICsgMSArIGxlbmd0aDsKLSAgICAgICAgICAgIHByb3BlcnR5LnZhbHVlID0gZGF0YS5zdWJzdHJpbmcoaW5kZXgyICsgMSwgaW5kZXgyICsgMSArIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIG5vZGUucHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICAgICAgICAgICAgbm9kZS5uYW1lZFByb3BlcnRpZXMucHV0KHByb3BlcnR5Lm5hbWUsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgc3RvcCA9IHN0YXJ0ID49IGRhdGEubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoIXN0b3ApIHsKLSAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghc3RvcCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub2RlLnByb3BlcnRpZXMsIG5ldyBDb21wYXJhdG9yPFZpZXdOb2RlLlByb3BlcnR5PigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3Tm9kZS5Qcm9wZXJ0eSBzb3VyY2UsIFZpZXdOb2RlLlByb3BlcnR5IGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5uYW1lLmNvbXBhcmVUbyhkZXN0aW5hdGlvbi5uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbm9kZS5kZWNvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3SGllcmFyY2h5U2NlbmUuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1ZpZXdIaWVyYXJjaHlTY2VuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRjMzk1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1ZpZXdIaWVyYXJjaHlTY2VuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZTsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhZGllbnRQYWludDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLlBvaW50MkQ7Ci0KLWltcG9ydCBvcmcubmV0YmVhbnMuYXBpLnZpc3VhbC5hY3Rpb24uQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcubmV0YmVhbnMuYXBpLnZpc3VhbC5hY3Rpb24uV2lkZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLmFuY2hvci5BbmNob3JGYWN0b3J5OwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLmJvcmRlci5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLmdyYXBoLkdyYXBoU2NlbmU7Ci1pbXBvcnQgb3JnLm5ldGJlYW5zLmFwaS52aXN1YWwubGF5b3V0LkxheW91dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm5ldGJlYW5zLmFwaS52aXN1YWwubW9kZWwuT2JqZWN0U3RhdGU7Ci1pbXBvcnQgb3JnLm5ldGJlYW5zLmFwaS52aXN1YWwud2lkZ2V0LkNvbm5lY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLm5ldGJlYW5zLmFwaS52aXN1YWwud2lkZ2V0LkxhYmVsV2lkZ2V0OwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLndpZGdldC5MYXllcldpZGdldDsKLWltcG9ydCBvcmcubmV0YmVhbnMuYXBpLnZpc3VhbC53aWRnZXQuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgVmlld0hpZXJhcmNoeVNjZW5lIGV4dGVuZHMgR3JhcGhTY2VuZTxWaWV3Tm9kZSwgU3RyaW5nPiB7Ci0gICAgcHJpdmF0ZSBWaWV3Tm9kZSByb290OwotICAgIHByaXZhdGUgTGF5ZXJXaWRnZXQgd2lkZ2V0TGF5ZXI7Ci0gICAgcHJpdmF0ZSBMYXllcldpZGdldCBjb25uZWN0aW9uTGF5ZXI7Ci0KLSAgICBwcml2YXRlIFdpZGdldEFjdGlvbiBtb3ZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5jcmVhdGVNb3ZlQWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVmlld0hpZXJhcmNoeVNjZW5lKCkgewotICAgICAgICB3aWRnZXRMYXllciA9IG5ldyBMYXllcldpZGdldCh0aGlzKTsKLSAgICAgICAgY29ubmVjdGlvbkxheWVyID0gbmV3IExheWVyV2lkZ2V0KHRoaXMpOwotCi0gICAgICAgIGFkZENoaWxkKHdpZGdldExheWVyKTsKLSAgICAgICAgYWRkQ2hpbGQoY29ubmVjdGlvbkxheWVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFZpZXdOb2RlIGdldFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFJvb3QoVmlld05vZGUgcm9vdCkgewotICAgICAgICB0aGlzLnJvb3QgPSByb290OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBXaWRnZXQgYXR0YWNoTm9kZVdpZGdldChWaWV3Tm9kZSBub2RlKSB7Ci0gICAgICAgIFdpZGdldCB3aWRnZXQgPSBjcmVhdGVCb3gobm9kZSwgbm9kZS5uYW1lLCBub2RlLmlkKTsKLSAgICAgICAgd2lkZ2V0LmdldEFjdGlvbnMoKS5hZGRBY3Rpb24oY3JlYXRlU2VsZWN0QWN0aW9uKCkpOwotICAgICAgICB3aWRnZXQuZ2V0QWN0aW9ucygpLmFkZEFjdGlvbihtb3ZlQWN0aW9uKTsKLSAgICAgICAgd2lkZ2V0TGF5ZXIuYWRkQ2hpbGQod2lkZ2V0KTsKLSAgICAgICAgcmV0dXJuIHdpZGdldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdpZGdldCBjcmVhdGVCb3goVmlld05vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNob3J0TmFtZSA9IGdldFNob3J0TmFtZShub2RlTmFtZSk7Ci0gICAgICAgIG5vZGUuc2V0U2hvcnROYW1lKHNob3J0TmFtZSk7Ci0KLSAgICAgICAgR3JhZGllbnRXaWRnZXQgYm94ID0gbmV3IEdyYWRpZW50V2lkZ2V0KHRoaXMsIG5vZGUpOwotICAgICAgICBib3guc2V0TGF5b3V0KExheW91dEZhY3RvcnkuY3JlYXRlVmVydGljYWxGbG93TGF5b3V0KCkpOwotICAgICAgICBib3guc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcigyLCBDb2xvci5CTEFDSykpOwotICAgICAgICBib3guc2V0T3BhcXVlKHRydWUpOwotCi0gICAgICAgIExhYmVsV2lkZ2V0IGxhYmVsID0gbmV3IExhYmVsV2lkZ2V0KHRoaXMpOwotICAgICAgICBsYWJlbC5zZXRGb250KGdldERlZmF1bHRGb250KCkuZGVyaXZlRm9udChGb250LlBMQUlOLCAxMi4wZikpOwotICAgICAgICBsYWJlbC5zZXRMYWJlbChzaG9ydE5hbWUpOwotICAgICAgICBsYWJlbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig2LCA2LCAwLCA2KSk7Ci0gICAgICAgIGxhYmVsLnNldEFsaWdubWVudChMYWJlbFdpZGdldC5BbGlnbm1lbnQuQ0VOVEVSKTsKLQotICAgICAgICBib3guYWRkQ2hpbGQobGFiZWwpOwotICAgICAgICAKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxXaWRnZXQodGhpcyk7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoZ2V0RGVmYXVsdEZvbnQoKS5kZXJpdmVGb250KEZvbnQuUExBSU4sIDEwLjBmKSk7Ci0gICAgICAgIGxhYmVsLnNldExhYmVsKGdldEFkZHJlc3Mobm9kZU5hbWUpKTsKLSAgICAgICAgbGFiZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMywgNiwgMCwgNikpOwotICAgICAgICBsYWJlbC5zZXRBbGlnbm1lbnQoTGFiZWxXaWRnZXQuQWxpZ25tZW50LkNFTlRFUik7Ci0KLSAgICAgICAgYm94LmFkZHJlc3NXaWRnZXQgPSBsYWJlbDsKLSAgICAgICAgCi0gICAgICAgIGJveC5hZGRDaGlsZChsYWJlbCk7Ci0gICAgICAgIAotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFdpZGdldCh0aGlzKTsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChnZXREZWZhdWx0Rm9udCgpLmRlcml2ZUZvbnQoRm9udC5QTEFJTiwgMTAuMGYpKTsKLSAgICAgICAgbGFiZWwuc2V0TGFiZWwoaWQpOwotICAgICAgICBsYWJlbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigzLCA2LCA2LCA2KSk7Ci0gICAgICAgIGxhYmVsLnNldEFsaWdubWVudChMYWJlbFdpZGdldC5BbGlnbm1lbnQuQ0VOVEVSKTsKLSAgICAgICAgCi0gICAgICAgIGJveC5hZGRDaGlsZChsYWJlbCk7Ci0KLSAgICAgICAgcmV0dXJuIGJveDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFkZHJlc3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gbmFtZUFuZEhhc2hjb2RlID0gbmFtZS5zcGxpdCgiQCIpOwotICAgICAgICByZXR1cm4gIkAiICsgbmFtZUFuZEhhc2hjb2RlWzFdOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVBbmRIYXNoY29kZSA9IG5hbWUuc3BsaXQoIkAiKTsKLSAgICAgICAgU3RyaW5nW10gcGFja2FnZXMgPSBuYW1lQW5kSGFzaGNvZGVbMF0uc3BsaXQoIlxcLiIpOwotICAgICAgICByZXR1cm4gcGFja2FnZXNbcGFja2FnZXMubGVuZ3RoIC0gMV07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFdpZGdldCBhdHRhY2hFZGdlV2lkZ2V0KFN0cmluZyBlZGdlKSB7Ci0gICAgICAgIENvbm5lY3Rpb25XaWRnZXQgY29ubmVjdGlvbldpZGdldCA9IG5ldyBDb25uZWN0aW9uV2lkZ2V0KHRoaXMpOwotICAgICAgICBjb25uZWN0aW9uTGF5ZXIuYWRkQ2hpbGQoY29ubmVjdGlvbldpZGdldCk7Ci0gICAgICAgIHJldHVybiBjb25uZWN0aW9uV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaEVkZ2VTb3VyY2VBbmNob3IoU3RyaW5nIGVkZ2UsIFZpZXdOb2RlIG9sZFNvdXJjZU5vZGUsIFZpZXdOb2RlIHNvdXJjZU5vZGUpIHsKLSAgICAgICAgZmluYWwgQ29ubmVjdGlvbldpZGdldCBjb25uZWN0aW9uID0gKENvbm5lY3Rpb25XaWRnZXQpIGZpbmRXaWRnZXQoZWRnZSk7Ci0gICAgICAgIGZpbmFsIFdpZGdldCBzb3VyY2UgPSBmaW5kV2lkZ2V0KHNvdXJjZU5vZGUpOwotICAgICAgICBjb25uZWN0aW9uLmJyaW5nVG9CYWNrKCk7Ci0gICAgICAgIHNvdXJjZS5icmluZ1RvRnJvbnQoKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRTb3VyY2VBbmNob3IoQW5jaG9yRmFjdG9yeS5jcmVhdGVSZWN0YW5ndWxhckFuY2hvcihzb3VyY2UpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hFZGdlVGFyZ2V0QW5jaG9yKFN0cmluZyBlZGdlLCBWaWV3Tm9kZSBvbGRUYXJnZXROb2RlLCBWaWV3Tm9kZSB0YXJnZXROb2RlKSB7Ci0gICAgICAgIGZpbmFsIENvbm5lY3Rpb25XaWRnZXQgY29ubmVjdGlvbiA9IChDb25uZWN0aW9uV2lkZ2V0KSBmaW5kV2lkZ2V0KGVkZ2UpOwotICAgICAgICBmaW5hbCBXaWRnZXQgdGFyZ2V0ID0gZmluZFdpZGdldCh0YXJnZXROb2RlKTsKLSAgICAgICAgY29ubmVjdGlvbi5icmluZ1RvQmFjaygpOwotICAgICAgICB0YXJnZXQuYnJpbmdUb0Zyb250KCk7Ci0gICAgICAgIGNvbm5lY3Rpb24uc2V0VGFyZ2V0QW5jaG9yKEFuY2hvckZhY3RvcnkuY3JlYXRlUmVjdGFuZ3VsYXJBbmNob3IodGFyZ2V0KSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyYWRpZW50V2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IGltcGxlbWVudHMgVmlld05vZGUuU3RhdGVMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JhZGllbnRQYWludCBCTFVFX0VYUEVSSUVOQ0UgPSBuZXcgR3JhZGllbnRQYWludCgKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDE2OCwgMjA0LCAyNDEpLAotICAgICAgICAgICAgICAgIG5ldyBQb2ludDJELkRvdWJsZSgwLCAxKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29sb3IoNDQsIDYxLCAxNDYpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmFkaWVudFBhaW50IE1BQ19PU1hfU0VMRUNURUQgPSBuZXcgR3JhZGllbnRQYWludCgKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDgxLCAxNDEsIDIzNiksCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDEpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcigzNiwgOTYsIDE5MikpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyYWRpZW50UGFpbnQgTUFDX09TWCA9IG5ldyBHcmFkaWVudFBhaW50KAotICAgICAgICAgICAgICAgIG5ldyBQb2ludDJELkRvdWJsZSgwLCAwKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29sb3IoMTY3LCAyMTAsIDI1MCksCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDEpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcig5OSwgMTQ3LCAyMDYpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmFkaWVudFBhaW50IEFFUklUSCA9IG5ldyBHcmFkaWVudFBhaW50KAotICAgICAgICAgICAgICAgIG5ldyBQb2ludDJELkRvdWJsZSgwLCAwKSwKLSAgICAgICAgICAgICAgICBDb2xvci5XSElURSwKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDY0LCAxMTAsIDE2MSkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyYWRpZW50UGFpbnQgR1JBWSA9IG5ldyBHcmFkaWVudFBhaW50KAotICAgICAgICAgICAgICAgIG5ldyBQb2ludDJELkRvdWJsZSgwLCAwKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29sb3IoMjI2LCAyMjYsIDIyNiksCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDEpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcigyNTAsIDI0OCwgMjQ4KSk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JhZGllbnRQYWludCBSRURfWFAgPSBuZXcgR3JhZGllbnRQYWludCgKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDIzNiwgODEsIDgxKSwKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDE5MiwgMzYsIDM2KSk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JhZGllbnRQYWludCBOSUdIVF9HUkFZID0gbmV3IEdyYWRpZW50UGFpbnQoCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDApLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcigxMDIsIDExMSwgMTI3KSwKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMSksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDM4LCA0NSwgNjEpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmFkaWVudFBhaW50IE5JR0hUX0dSQVlfTElHSFQgPSBuZXcgR3JhZGllbnRQYWludCgKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCksCi0gICAgICAgICAgICAgICAgbmV3IENvbG9yKDEyOSwgMTM4LCAxNTUpLAotICAgICAgICAgICAgICAgIG5ldyBQb2ludDJELkRvdWJsZSgwLCAxKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29sb3IoNTgsIDY2LCA4MikpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyYWRpZW50UGFpbnQgTklHSFRfR1JBWV9WRVJZX0xJR0hUID0gbmV3IEdyYWRpZW50UGFpbnQoCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDApLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcigxMjksIDEzOCwgMTU1LCA2MCksCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50MkQuRG91YmxlKDAsIDEpLAotICAgICAgICAgICAgICAgIG5ldyBDb2xvcig1OCwgNjYsIDgyLCA2MCkpOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIENvbG9yIFVOU0VMRUNURUQgPSBDb2xvci5CTEFDSzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3IgU0VMRUNURUQgPSBDb2xvci5XSElURTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFZpZXdOb2RlIG5vZGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBMYWJlbFdpZGdldCBhZGRyZXNzV2lkZ2V0OwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgR3JhZGllbnRQYWludCBzZWxlY3RlZEdyYWRpZW50ID0gTUFDX09TWF9TRUxFQ1RFRDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBHcmFkaWVudFBhaW50IGZpbHRlcmVkR3JhZGllbnQgPSBSRURfWFA7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgR3JhZGllbnRQYWludCBmb2N1c0dyYWRpZW50ID0gTklHSFRfR1JBWV9WRVJZX0xJR0hUOwotCi0gICAgICAgIHB1YmxpYyBHcmFkaWVudFdpZGdldChWaWV3SGllcmFyY2h5U2NlbmUgc2NlbmUsIFZpZXdOb2RlIG5vZGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHNjZW5lKTsKLSAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICBub2RlLnNldFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKE9iamVjdFN0YXRlIHByZXZpb3VzLCBPYmplY3RTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgc3VwZXIubm90aWZ5U3RhdGVDaGFuZ2VkKHByZXZpb3VzLCBzdGF0ZSk7Ci0gICAgICAgICAgICBpc1NlbGVjdGVkID0gc3RhdGUuaXNTZWxlY3RlZCgpIHx8IHN0YXRlLmlzRm9jdXNlZCgpIHx8IHN0YXRlLmlzV2lkZ2V0Rm9jdXNlZCgpOwotCi0gICAgICAgICAgICBwaWNrQ2hpbGRyZW5Db2xvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBpY2tDaGlsZHJlbkNvbG9yKCkgewotICAgICAgICAgICAgZm9yIChXaWRnZXQgY2hpbGQgOiBnZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0Rm9yZWdyb3VuZChpc1NlbGVjdGVkIHx8IG5vZGUuZmlsdGVyZWQgPyBTRUxFQ1RFRCA6IFVOU0VMRUNURUQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRCYWNrZ3JvdW5kKCkgewotICAgICAgICAgICAgc3VwZXIucGFpbnRCYWNrZ3JvdW5kKCk7Ci0KLSAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSBnZXRHcmFwaGljcygpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCi0gICAgICAgICAgICBpZiAoIWlzU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZmlsdGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmhhc0ZvY3VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnMi5zZXRQYWludChuZXcgR3JhZGllbnRQYWludChib3VuZHMueCwgYm91bmRzLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzR3JhZGllbnQuZ2V0Q29sb3IxKCksIGJvdW5kcy54LCBib3VuZHMueCArIGJvdW5kcy5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzR3JhZGllbnQuZ2V0Q29sb3IyKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGcyLnNldFBhaW50KG5ldyBHcmFkaWVudFBhaW50KGJvdW5kcy54LCBib3VuZHMueSwgZmlsdGVyZWRHcmFkaWVudC5nZXRDb2xvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy54LCBib3VuZHMueCArIGJvdW5kcy5oZWlnaHQsIGZpbHRlcmVkR3JhZGllbnQuZ2V0Q29sb3IyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGcyLnNldFBhaW50KG5ldyBHcmFkaWVudFBhaW50KGJvdW5kcy54LCBib3VuZHMueSwgc2VsZWN0ZWRHcmFkaWVudC5nZXRDb2xvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy54LCBib3VuZHMueCArIGJvdW5kcy5oZWlnaHQsIHNlbGVjdGVkR3JhZGllbnQuZ2V0Q29sb3IyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGcyLmZpbGxSZWN0KGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vZGVTdGF0ZUNoYW5nZWQoVmlld05vZGUgbm9kZSkgewotICAgICAgICAgICAgcGlja0NoaWxkcmVuQ29sb3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vZGVJbmRleENoYW5nZWQoVmlld05vZGUgbm9kZSkgewotICAgICAgICAgICAgaWYgKGFkZHJlc3NXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZHJlc3NXaWRnZXQuc2V0TGFiZWwoIiMiICsgbm9kZS5pbmRleCArIGFkZHJlc3NXaWRnZXQuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3TWFuYWdlci5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvc2NlbmUvVmlld01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYTYzZS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnNjZW5lOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZS5XaW5kb3c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLmRldmljZS5EZXZpY2VCcmlkZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1wdWJsaWMgY2xhc3MgVmlld01hbmFnZXIgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlKElEZXZpY2UgZGV2aWNlLCBXaW5kb3cgd2luZG93LCBTdHJpbmcgcGFyYW1zKSB7Ci0gICAgICAgIHNlbmRDb21tYW5kKCJJTlZBTElEQVRFIiwgZGV2aWNlLCB3aW5kb3csIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RMYXlvdXQoSURldmljZSBkZXZpY2UsIFdpbmRvdyB3aW5kb3csIFN0cmluZyBwYXJhbXMpIHsKLSAgICAgICAgc2VuZENvbW1hbmQoIlJFUVVFU1RfTEFZT1VUIiwgZGV2aWNlLCB3aW5kb3csIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgSURldmljZSBkZXZpY2UsIFdpbmRvdyB3aW5kb3csIFN0cmluZyBwYXJhbXMpIHsKLSAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKLSAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlQnJpZGdlLmdldERldmljZUxvY2FsUG9ydChkZXZpY2UpKSk7Ci0KLSAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSkpOwotCi0gICAgICAgICAgICBvdXQud3JpdGUoY29tbWFuZCArICIgIiArIHdpbmRvdy5lbmNvZGUoKSArICIgIiArIHBhcmFtcyk7Ci0gICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEVtcHR5Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3Tm9kZS5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvc2NlbmUvVmlld05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjMDcwMy4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9WaWV3Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZTsKLQotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFZpZXdOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIGlkOwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eT4oKTsKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHk+IG5hbWVkUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHk+KCk7Ci0KLSAgICBwdWJsaWMgVmlld05vZGUgcGFyZW50OwotICAgIHB1YmxpYyBMaXN0PFZpZXdOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Vmlld05vZGU+KCk7Ci0KLSAgICBwdWJsaWMgSW1hZ2UgaW1hZ2U7Ci0gICAgCi0gICAgcHVibGljIGludCBsZWZ0OwotICAgIHB1YmxpYyBpbnQgdG9wOwotICAgIHB1YmxpYyBpbnQgd2lkdGg7Ci0gICAgcHVibGljIGludCBoZWlnaHQ7Ci0gICAgcHVibGljIGludCBzY3JvbGxYOwotICAgIHB1YmxpYyBpbnQgc2Nyb2xsWTsKLSAgICBwdWJsaWMgaW50IHBhZGRpbmdMZWZ0OwotICAgIHB1YmxpYyBpbnQgcGFkZGluZ1JpZ2h0OwotICAgIHB1YmxpYyBpbnQgcGFkZGluZ1RvcDsKLSAgICBwdWJsaWMgaW50IHBhZGRpbmdCb3R0b207Ci0gICAgcHVibGljIGludCBtYXJnaW5MZWZ0OwotICAgIHB1YmxpYyBpbnQgbWFyZ2luUmlnaHQ7Ci0gICAgcHVibGljIGludCBtYXJnaW5Ub3A7Ci0gICAgcHVibGljIGludCBtYXJnaW5Cb3R0b207Ci0gICAgcHVibGljIGludCBiYXNlbGluZTsKLSAgICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90RHJhdzsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXJnaW5zOwotICAgIAotICAgIGJvb2xlYW4gaGFzRm9jdXM7Ci0gICAgaW50IGluZGV4OwotCi0gICAgcHVibGljIGJvb2xlYW4gZGVjb2RlZDsKLSAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJlZDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNob3J0TmFtZTsKLSAgICBwcml2YXRlIFN0YXRlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgICB2b2lkIGRlY29kZSgpIHsKLSAgICAgICAgaWQgPSBuYW1lZFByb3BlcnRpZXMuZ2V0KCJtSUQiKS52YWx1ZTsKLQotICAgICAgICBsZWZ0ID0gZ2V0SW50KCJtTGVmdCIsIDApOwotICAgICAgICB0b3AgPSBnZXRJbnQoIm1Ub3AiLCAwKTsKLSAgICAgICAgd2lkdGggPSBnZXRJbnQoImdldFdpZHRoKCkiLCAwKTsKLSAgICAgICAgaGVpZ2h0ID0gZ2V0SW50KCJnZXRIZWlnaHQoKSIsIDApOwotICAgICAgICBzY3JvbGxYID0gZ2V0SW50KCJtU2Nyb2xsWCIsIDApOwotICAgICAgICBzY3JvbGxZID0gZ2V0SW50KCJtU2Nyb2xsWSIsIDApOwotICAgICAgICBwYWRkaW5nTGVmdCA9IGdldEludCgibVBhZGRpbmdMZWZ0IiwgMCk7Ci0gICAgICAgIHBhZGRpbmdSaWdodCA9IGdldEludCgibVBhZGRpbmdSaWdodCIsIDApOwotICAgICAgICBwYWRkaW5nVG9wID0gZ2V0SW50KCJtUGFkZGluZ1RvcCIsIDApOwotICAgICAgICBwYWRkaW5nQm90dG9tID0gZ2V0SW50KCJtUGFkZGluZ0JvdHRvbSIsIDApOwotICAgICAgICBtYXJnaW5MZWZ0ID0gZ2V0SW50KCJsYXlvdXRfbGVmdE1hcmdpbiIsIEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgbWFyZ2luUmlnaHQgPSBnZXRJbnQoImxheW91dF9yaWdodE1hcmdpbiIsIEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgbWFyZ2luVG9wID0gZ2V0SW50KCJsYXlvdXRfdG9wTWFyZ2luIiwgSW50ZWdlci5NSU5fVkFMVUUpOwotICAgICAgICBtYXJnaW5Cb3R0b20gPSBnZXRJbnQoImxheW91dF9ib3R0b21NYXJnaW4iLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIGJhc2VsaW5lID0gZ2V0SW50KCJnZXRCYXNlbGluZSgpIiwgMCk7Ci0gICAgICAgIHdpbGxOb3REcmF3ID0gZ2V0Qm9vbGVhbigid2lsbE5vdERyYXcoKSIsIGZhbHNlKTsKLSAgICAgICAgaGFzRm9jdXMgPSBnZXRCb29sZWFuKCJoYXNGb2N1cygpIiwgZmFsc2UpOwotCi0gICAgICAgIGhhc01hcmdpbnMgPSBtYXJnaW5MZWZ0ICE9IEludGVnZXIuTUlOX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgIT0gSW50ZWdlci5NSU5fVkFMVUUgJiYKLSAgICAgICAgICAgICAgICBtYXJnaW5Ub3AgIT0gSW50ZWdlci5NSU5fVkFMVUUgJiYKLSAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b20gIT0gSW50ZWdlci5NSU5fVkFMVUU7Ci0KLSAgICAgICAgZGVjb2RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIFByb3BlcnR5IHAgPSBuYW1lZFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihwLnZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEludChTdHJpbmcgbmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBQcm9wZXJ0eSBwID0gbmFtZWRQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHAgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwLnZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQYXR0ZXJuIHBhdHRlcm4pIHsKLSAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLnBhdHRlcm4oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmaWx0ZXJlZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsdGVyZWQgPSBwYXR0ZXJuLm1hdGNoZXIoc2hvcnROYW1lKS5maW5kKCkgfHwgcGF0dGVybi5tYXRjaGVyKGlkKS5maW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIubm9kZVN0YXRlQ2hhbmdlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbXB1dGVJbmRleCgpIHsKLSAgICAgICAgaW5kZXggPSBwYXJlbnQgPT0gbnVsbCA/IDAgOiBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTsKLSAgICAgICAgbGlzdGVuZXIubm9kZUluZGV4Q2hhbmdlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFNob3J0TmFtZShTdHJpbmcgc2hvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMuc2hvcnROYW1lID0gc2hvcnROYW1lOwotICAgIH0KLQotICAgIHZvaWQgc2V0U3RhdGVMaXN0ZW5lcihTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5In0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBWaWV3Tm9kZSBvdGhlciA9IChWaWV3Tm9kZSkgb2JqOwotICAgICAgICByZXR1cm4gISh0aGlzLm5hbWUgIT0gb3RoZXIubmFtZSAmJiAodGhpcy5uYW1lID09IG51bGwgfHwgIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDU7Ci0gICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOwotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSJ9KQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUHJvcGVydHkgb3RoZXIgPSAoUHJvcGVydHkpIG9iajsKLSAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gb3RoZXIubmFtZSAmJiAodGhpcy5uYW1lID09IG51bGwgfHwgIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICEodGhpcy52YWx1ZSAhPSBvdGhlci52YWx1ZSAmJiAodGhpcy52YWx1ZSA9PSBudWxsIHx8ICF0aGlzLnZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgaW50IGhhc2ggPSA1OwotICAgICAgICAgICAgaGFzaCA9IDYxICogaGFzaCArICh0aGlzLm5hbWUgIT0gbnVsbCA/IHRoaXMubmFtZS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICBoYXNoID0gNjEgKiBoYXNoICsgKHRoaXMudmFsdWUgIT0gbnVsbCA/IHRoaXMudmFsdWUuaGFzaENvZGUoKSA6IDApOwotICAgICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgU3RhdGVMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgbm9kZVN0YXRlQ2hhbmdlZChWaWV3Tm9kZSBub2RlKTsKLSAgICAgICAgdm9pZCBub2RlSW5kZXhDaGFuZ2VkKFZpZXdOb2RlIG5vZGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1dpbmRvd3NMb2FkZXIuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3NjZW5lL1dpbmRvd3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MzcwNy4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci9zY2VuZS9XaW5kb3dzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLkRldmljZUJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLldpbmRvdzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXaW5kb3dzTG9hZGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIFdpbmRvd1tdIGxvYWRXaW5kb3dzKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxXaW5kb3c+IHdpbmRvd3MgPSBuZXcgQXJyYXlMaXN0PFdpbmRvdz4oKTsKLQotICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldCgpOwotICAgICAgICAgICAgc29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLAotICAgICAgICAgICAgICAgICAgICBEZXZpY2VCcmlkZ2UuZ2V0RGV2aWNlTG9jYWxQb3J0KGRldmljZSkpKTsKLQotICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc29ja2V0LmdldElucHV0U3RyZWFtKCkpKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlKCJMSVNUIik7Ci0gICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICgiRE9ORS4iLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKCcgJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3ID0gbmV3IFdpbmRvdyhsaW5lLnN1YnN0cmluZyhpbmRleCArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpLCAxNikpOwotICAgICAgICAgICAgICAgICAgICB3aW5kb3dzLmFkZCh3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB3aW5kb3dzLnRvQXJyYXkobmV3IFdpbmRvd1t3aW5kb3dzLnNpemUoKV0pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFbXB0eQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dbMF07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvQ2FwdHVyZVJlbmRlcmVyLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9DYXB0dXJlUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYzgxOC4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9DYXB0dXJlUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5WaWV3Tm9kZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLQotY2xhc3MgQ2FwdHVyZVJlbmRlcmVyIGV4dGVuZHMgSkxhYmVsIHsKLSAgICBwcml2YXRlIFZpZXdOb2RlIG5vZGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNob3dFeHRyYXM7Ci0KLSAgICBDYXB0dXJlUmVuZGVyZXIoSW1hZ2VJY29uIGljb24sIFZpZXdOb2RlIG5vZGUpIHsKLSAgICAgICAgc3VwZXIoaWNvbik7Ci0gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICAgIHNldEJhY2tncm91bmQoQ29sb3IuQkxBQ0spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZSgpIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgICAgaWYgKG5vZGUuaGFzTWFyZ2lucykgewotICAgICAgICAgICAgZC53aWR0aCArPSBub2RlLm1hcmdpbkxlZnQgKyBub2RlLm1hcmdpblJpZ2h0OwotICAgICAgICAgICAgZC5oZWlnaHQgKz0gbm9kZS5tYXJnaW5Ub3AgKyBub2RlLm1hcmdpbkJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNob3dFeHRyYXMoYm9vbGVhbiBzaG93RXh0cmFzKSB7Ci0gICAgICAgIHRoaXMuc2hvd0V4dHJhcyA9IHNob3dFeHRyYXM7Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBnKSB7Ci0gICAgICAgIEljb24gaWNvbiA9IGdldEljb24oKTsKLSAgICAgICAgaW50IHdpZHRoID0gaWNvbi5nZXRJY29uV2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGljb24uZ2V0SWNvbkhlaWdodCgpOwotCi0gICAgICAgIGludCB4ID0gKGdldFdpZHRoKCkgLSB3aWR0aCkgLyAyOwotICAgICAgICBpbnQgeSA9IChnZXRIZWlnaHQoKSAtIGhlaWdodCkgLyAyOwotCi0gICAgICAgIGljb24ucGFpbnRJY29uKHRoaXMsIGcsIHgsIHkpOwotCi0gICAgICAgIGlmIChzaG93RXh0cmFzKSB7Ci0gICAgICAgICAgICBnLnRyYW5zbGF0ZSh4LCB5KTsKLSAgICAgICAgICAgIGcuc2V0WE9STW9kZShDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBpZiAoKG5vZGUucGFkZGluZ0JvdHRvbSB8IG5vZGUucGFkZGluZ0xlZnQgfAotICAgICAgICAgICAgICAgICAgICBub2RlLnBhZGRpbmdUb3AgfCBub2RlLnBhZGRpbmdSaWdodCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IuUkVEKTsKLSAgICAgICAgICAgICAgICBnLmRyYXdSZWN0KG5vZGUucGFkZGluZ0xlZnQsIG5vZGUucGFkZGluZ1RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gbm9kZS5wYWRkaW5nUmlnaHQgLSBub2RlLnBhZGRpbmdMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0gbm9kZS5wYWRkaW5nQm90dG9tIC0gbm9kZS5wYWRkaW5nVG9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChub2RlLmJhc2VsaW5lICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5CTFVFKTsKLSAgICAgICAgICAgICAgICBnLmRyYXdMaW5lKDAsIG5vZGUuYmFzZWxpbmUsIHdpZHRoLCBub2RlLmJhc2VsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChub2RlLmhhc01hcmdpbnMgJiYgKG5vZGUubWFyZ2luTGVmdCB8IG5vZGUubWFyZ2luQm90dG9tIHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXJnaW5SaWdodCB8IG5vZGUubWFyZ2luUmlnaHQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBnLnNldENvbG9yKENvbG9yLkJMQUNLKTsKLSAgICAgICAgICAgICAgICBnLmRyYXdSZWN0KC1ub2RlLm1hcmdpbkxlZnQsIC1ub2RlLm1hcmdpblRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWFyZ2luTGVmdCArIHdpZHRoICsgbm9kZS5tYXJnaW5SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWFyZ2luVG9wICsgaGVpZ2h0ICsgbm9kZS5tYXJnaW5Cb3R0b20pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZy50cmFuc2xhdGUoLXgsIC15KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL0xheW91dFJlbmRlcmVyLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9MYXlvdXRSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTQzODM0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL0xheW91dFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnNjZW5lLlZpZXdIaWVyYXJjaHlTY2VuZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmUuVmlld05vZGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1jbGFzcyBMYXlvdXRSZW5kZXJlciBleHRlbmRzIEpDb21wb25lbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTVVMQVRFRF9TQ1JFRU5fV0lEVEggPSAzMjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVNVUxBVEVEX1NDUkVFTl9IRUlHSFQgPSA0ODA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9NQVJHSU4gPSAyNDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93RXh0cmFzOwotICAgIHByaXZhdGUgVmlld0hpZXJhcmNoeVNjZW5lIHNjZW5lOwotICAgIHByaXZhdGUgSkNvbXBvbmVudCBzY2VuZVZpZXc7Ci0KLSAgICBMYXlvdXRSZW5kZXJlcihWaWV3SGllcmFyY2h5U2NlbmUgc2NlbmUsIEpDb21wb25lbnQgc2NlbmVWaWV3KSB7Ci0gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTsKLSAgICAgICAgdGhpcy5zY2VuZVZpZXcgPSBzY2VuZVZpZXc7Ci0KLSAgICAgICAgc2V0T3BhcXVlKHRydWUpOwotICAgICAgICBzZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCAxMiwgMCkpOwotICAgICAgICBzZXRCYWNrZ3JvdW5kKENvbG9yLkJMQUNLKTsKLSAgICAgICAgc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlbGVjdENoaWxkKGV2ZW50LmdldFgoKSwgZXZlbnQuZ2V0WSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKCkgewotICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihFTVVMQVRFRF9TQ1JFRU5fV0lEVEggKyBTQ1JFRU5fTUFSR0lOLAotICAgICAgICAgICAgICAgIEVNVUxBVEVEX1NDUkVFTl9IRUlHSFQgKyBTQ1JFRU5fTUFSR0lOKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBnKSB7Ci0gICAgICAgIGcuc2V0Q29sb3IoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZy5maWxsUmVjdCgwLCAwLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0KLSAgICAgICAgSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotICAgICAgICBnLmNsaXBSZWN0KGluc2V0cy5sZWZ0LCBpbnNldHMudG9wLAotICAgICAgICAgICAgICAgIGdldFdpZHRoKCkgLSBpbnNldHMubGVmdCAtIGluc2V0cy5yaWdodCwKLSAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSAtIGluc2V0cy50b3AgLSBpbnNldHMuYm90dG9tKTsKLQotICAgICAgICBpZiAoc2NlbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlld05vZGUgcm9vdCA9IHNjZW5lLmdldFJvb3QoKTsKLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHggPSAoZ2V0V2lkdGgoKSAtIGluc2V0cy5sZWZ0IC0gaW5zZXRzLnJpZ2h0IC0gcm9vdC53aWR0aCkgLyAyOwotICAgICAgICBpbnQgeSA9IChnZXRIZWlnaHQoKSAtIGluc2V0cy50b3AgLSBpbnNldHMuYm90dG9tIC0gcm9vdC5oZWlnaHQpIC8gMjsKLSAgICAgICAgZy50cmFuc2xhdGUoaW5zZXRzLmxlZnQgKyB4LCBpbnNldHMudG9wICsgeSk7Ci0KLSAgICAgICAgZy5zZXRDb2xvcihnZXRGb3JlZ3JvdW5kKCkpOwotICAgICAgICBnLmRyYXdSZWN0KHJvb3QubGVmdCwgcm9vdC50b3AsIHJvb3Qud2lkdGggLSAxLCByb290LmhlaWdodCAtIDEpOwotICAgICAgICBnLmNsaXBSZWN0KHJvb3QubGVmdCAtIDEsIHJvb3QudG9wIC0gMSwgcm9vdC53aWR0aCArIDEsIHJvb3QuaGVpZ2h0ICsgMSk7Ci0gICAgICAgIGRyYXdDaGlsZHJlbihnLCByb290LCAtcm9vdC5zY3JvbGxYLCAtcm9vdC5zY3JvbGxZKTsKLQotICAgICAgICBTZXQ8Pz4gc2VsZWN0aW9uID0gc2NlbmUuZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgVmlld05vZGUgbm9kZSA9IChWaWV3Tm9kZSkgc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5SRUQpOwotICAgICAgICAgICAgR3JhcGhpY3MgcyA9IGcuY3JlYXRlKCk7Ci0gICAgICAgICAgICBWaWV3Tm9kZSBwID0gbm9kZS5wYXJlbnQ7Ci0gICAgICAgICAgICB3aGlsZSAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy50cmFuc2xhdGUocC5sZWZ0IC0gcC5zY3JvbGxYLCBwLnRvcCAtIHAuc2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgcCA9IHAucGFyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNob3dFeHRyYXMgJiYgbm9kZS5pbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcy5kcmF3SW1hZ2Uobm9kZS5pbWFnZSwgbm9kZS5sZWZ0LCBub2RlLnRvcCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLmRyYXdSZWN0KG5vZGUubGVmdCwgbm9kZS50b3AsIG5vZGUud2lkdGggLSAxLCBub2RlLmhlaWdodCAtIDEpOwotICAgICAgICAgICAgcy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBnLnRyYW5zbGF0ZSgtaW5zZXRzLmxlZnQgLSB4LCAtaW5zZXRzLnRvcCAtIHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkcmF3Q2hpbGRyZW4oR3JhcGhpY3MgZywgVmlld05vZGUgcm9vdCwgaW50IHgsIGludCB5KSB7Ci0gICAgICAgIGcudHJhbnNsYXRlKHgsIHkpOwotICAgICAgICBmb3IgKFZpZXdOb2RlIG5vZGUgOiByb290LmNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBpZiAoIW5vZGUud2lsbE5vdERyYXcpIHsKLSAgICAgICAgICAgICAgICBnLmRyYXdSZWN0KG5vZGUubGVmdCwgbm9kZS50b3AsIG5vZGUud2lkdGggLSAxLCBub2RlLmhlaWdodCAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0NoaWxkcmVuKGcsIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnQgLSBub2RlLnBhcmVudC5zY3JvbGxYLAotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3AgLSBub2RlLnBhcmVudC5zY3JvbGxZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnLnRyYW5zbGF0ZSgteCwgLXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNob3dFeHRyYXMoYm9vbGVhbiBzaG93RXh0cmFzKSB7Ci0gICAgICAgIHRoaXMuc2hvd0V4dHJhcyA9IHNob3dFeHRyYXM7Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q2hpbGQoaW50IHgsIGludCB5KSB7Ci0KLSAgICAgICAgaWYgKHNjZW5lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZXdOb2RlIHJvb3QgPSBzY2VuZS5nZXRSb290KCk7Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQotICAgICAgICBpbnQgeG9mZnNldCA9IChnZXRXaWR0aCgpIC0gaW5zZXRzLmxlZnQgLSBpbnNldHMucmlnaHQgLSByb290LndpZHRoKSAvIDIgKyBpbnNldHMubGVmdCArIDE7Ci0gICAgICAgIGludCB5b2Zmc2V0ID0gKGdldEhlaWdodCgpIC0gaW5zZXRzLnRvcCAtIGluc2V0cy5ib3R0b20gLSByb290LmhlaWdodCkgLyAyICsgaW5zZXRzLnRvcCArIDE7Ci0KLSAgICAgICAgeCAtPSB4b2Zmc2V0OwotICAgICAgICB5IC09IHlvZmZzZXQ7Ci0gICAgICAgIGlmICh4ID49IDAgJiYgeCA8IEVNVUxBVEVEX1NDUkVFTl9XSURUSCAmJiB5ID49IDAgJiYgeSA8IEVNVUxBVEVEX1NDUkVFTl9IRUlHSFQpIHsKLSAgICAgICAgICAgIFZpZXdOb2RlIGhpdCA9IGZpbmRDaGlsZChyb290LCByb290LCB4LCB5KTsKLSAgICAgICAgICAgIHNjZW5lLnNldEZvY3VzZWRPYmplY3QoaGl0KTsKLSAgICAgICAgICAgIHNjZW5lVmlldy5yZXBhaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXdOb2RlIGZpbmRDaGlsZChWaWV3Tm9kZSByb290LCBWaWV3Tm9kZSBiZXN0aGl0LCBpbnQgeCwgaW50IHkpIHsKLSAgICAgICAgVmlld05vZGUgaGl0ID0gYmVzdGhpdDsKLSAgICAgICAgZm9yIChWaWV3Tm9kZSBub2RlIDogcm9vdC5jaGlsZHJlbikgewotCi0gICAgICAgICAgICBpZiAobm9kZS5sZWZ0IDw9IHggJiYgeCA8IG5vZGUubGVmdCArIG5vZGUud2lkdGggJiYKLSAgICAgICAgICAgICAgICBub2RlLnRvcCA8PSB5ICYmIHkgPCBub2RlLnRvcCArIG5vZGUuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUud2lkdGggPD0gaGl0LndpZHRoICYmIG5vZGUuaGVpZ2h0IDw9IGhpdC5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGl0ID0gbm9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBoaXQgPSBmaW5kQ2hpbGQobm9kZSwgaGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgeCAtIChub2RlLmxlZnQgLSBub2RlLnBhcmVudC5zY3JvbGxYKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHkgLSAobm9kZS50b3AgLSBub2RlLnBhcmVudC5zY3JvbGxZKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhpdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9TY3JlZW5WaWV3ZXIuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL1NjcmVlblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE3YzkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL1NjcmVlblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ5ICswLDAgQEAKLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLlJhd0ltYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51dGlsLldvcmtlclRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmUuVmlld05vZGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLnV0aWwuUG5nRmlsZUZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkudXRpbC5JY29uTG9hZGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5UaW1lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNsaWRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLQotaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3dvcmtlci5Td2luZ1dvcmtlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50czsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5BbHBoYUNvbXBvc2l0ZTsKLWltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZU1vdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VXaGVlbEV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlV2hlZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWNsYXNzIFNjcmVlblZpZXdlciBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFdvcmtzcGFjZSB3b3Jrc3BhY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRGV2aWNlIGRldmljZTsKLQotICAgIHByaXZhdGUgR2V0U2NyZWVuc2hvdFRhc2sgdGFzazsKLSAgICBwcml2YXRlIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2U7Ci0gICAgcHJpdmF0ZSBpbnRbXSBzY2FubGluZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNMb2FkaW5nOwotCi0gICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIG92ZXJsYXk7Ci0gICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZSBvdmVybGF5QWxwaGEgPSBBbHBoYUNvbXBvc2l0ZS5nZXRJbnN0YW5jZShBbHBoYUNvbXBvc2l0ZS5TUkNfT1ZFUiwgMC4zZik7Ci0KLSAgICBwcml2YXRlIFNjcmVlblZpZXdlci5Mb3VwZVN0YXR1cyBzdGF0dXM7Ci0gICAgcHJpdmF0ZSBTY3JlZW5WaWV3ZXIuTG91cGVWaWV3ZXIgbG91cGU7Ci0gICAgcHJpdmF0ZSBTY3JlZW5WaWV3ZXIuQ3Jvc3NoYWlyIGNyb3NzaGFpcjsKLQotICAgIHByaXZhdGUgaW50IHpvb20gPSA4OwotICAgIHByaXZhdGUgaW50IHkgPSAwOwotCi0gICAgcHJpdmF0ZSBUaW1lciB0aW1lcjsKLSAgICBwcml2YXRlIFZpZXdOb2RlIG5vZGU7Ci0KLSAgICBwcml2YXRlIEpTbGlkZXIgem9vbVNsaWRlcjsKLQotICAgIFNjcmVlblZpZXdlcihXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJRGV2aWNlIGRldmljZSwgaW50IHNwYWNpbmcpIHsKLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgIHNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy53b3Jrc3BhY2UgPSB3b3Jrc3BhY2U7Ci0gICAgICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlOwotCi0gICAgICAgIHRpbWVyID0gbmV3IFRpbWVyKDUwMDAsIHRoaXMpOwotICAgICAgICB0aW1lci5zZXRJbml0aWFsRGVsYXkoMCk7Ci0gICAgICAgIHRpbWVyLnNldFJlcGVhdHModHJ1ZSk7Ci0KLSAgICAgICAgSlBhbmVsIHBhbmVsID0gYnVpbGRWaWV3ZXJBbmRDb250cm9scygpOwotICAgICAgICBhZGQocGFuZWwsIEJvcmRlckxheW91dC5XRVNUKTsKLQotICAgICAgICBKUGFuZWwgbG91cGVQYW5lbCA9IGJ1aWxkTG91cGVQYW5lbChzcGFjaW5nKTsKLSAgICAgICAgYWRkKGxvdXBlUGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpQYW5lbCBidWlsZExvdXBlUGFuZWwoaW50IHNwYWNpbmcpIHsKLSAgICAgICAgbG91cGUgPSBuZXcgTG91cGVWaWV3ZXIoKTsKLSAgICAgICAgbG91cGUuYWRkTW91c2VXaGVlbExpc3RlbmVyKG5ldyBXaGVlbFpvb21MaXN0ZW5lcigpKTsKLSAgICAgICAgQ3Jvc3NoYWlyUGFuZWwgY3Jvc3NoYWlyUGFuZWwgPSBuZXcgQ3Jvc3NoYWlyUGFuZWwobG91cGUpOwotCi0gICAgICAgIEpQYW5lbCBsb3VwZVBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBsb3VwZVBhbmVsLmFkZChjcm9zc2hhaXJQYW5lbCk7Ci0gICAgICAgIHN0YXR1cyA9IG5ldyBMb3VwZVN0YXR1cygpOwotICAgICAgICBsb3VwZVBhbmVsLmFkZChzdGF0dXMsIEJvcmRlckxheW91dC5TT1VUSCk7Ci0KLSAgICAgICAgbG91cGVQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCBzcGFjaW5nLCAwLCAwKSk7Ci0gICAgICAgIHJldHVybiBsb3VwZVBhbmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgV2hlZWxab29tTGlzdGVuZXIgaW1wbGVtZW50cyBNb3VzZVdoZWVsTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVdoZWVsTW92ZWQoTW91c2VXaGVlbEV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmICh6b29tU2xpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgdmFsID0gem9vbVNsaWRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHZhbCAtPSBlLmdldFdoZWVsUm90YXRpb24oKSAqIDI7Ci0gICAgICAgICAgICAgICAgem9vbVNsaWRlci5zZXRWYWx1ZSh2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKUGFuZWwgYnVpbGRWaWV3ZXJBbmRDb250cm9scygpIHsKLSAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgY3Jvc3NoYWlyID0gbmV3IENyb3NzaGFpcihuZXcgU2NyZWVuc2hvdFZpZXdlcigpKTsKLSAgICAgICAgY3Jvc3NoYWlyLmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihuZXcgV2hlZWxab29tTGlzdGVuZXIoKSk7Ci0gICAgICAgIHBhbmVsLmFkZChjcm9zc2hhaXIsCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCB5KyssIDIsIDEsIDEuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5GSVJTVF9MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBidWlsZFNsaWRlcihwYW5lbCwgIk92ZXJsYXk6IiwgIjAlIiwgIjEwMCUiLCAwLCAxMDAsIDMwLCAxKS5hZGRDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3BhY2l0eSA9ICgoSlNsaWRlcikgZXZlbnQuZ2V0U291cmNlKCkpLmdldFZhbHVlKCkgLyAxMDAuMGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5QWxwaGEgPSBBbHBoYUNvbXBvc2l0ZS5nZXRJbnN0YW5jZShBbHBoYUNvbXBvc2l0ZS5TUkNfT1ZFUiwgb3BhY2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGJ1aWxkT3ZlcmxheUV4dHJhQ29udHJvbHMocGFuZWwpOwotICAgICAgICBidWlsZFNsaWRlcihwYW5lbCwgIlJlZnJlc2ggUmF0ZToiLCAiMXMiLCAiNDBzIiwgMSwgNDAsIDUsIDEpLmFkZENoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF0ZSA9ICgoSlNsaWRlcikgZXZlbnQuZ2V0U291cmNlKCkpLmdldFZhbHVlKCkgKiAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIuc2V0RGVsYXkocmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lci5zZXRJbml0aWFsRGVsYXkoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lci5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHpvb21TbGlkZXIgPSBidWlsZFNsaWRlcihwYW5lbCwgIlpvb206IiwgIjJ4IiwgIjI0eCIsIDIsIDI0LCA4LCAyKTsKLSAgICAgICAgem9vbVNsaWRlci5hZGRDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9ICgoSlNsaWRlcikgZXZlbnQuZ2V0U291cmNlKCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3VwZS5jbGVhckdyaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbG91cGUubW92ZVRvUG9pbnQoY3Jvc3NoYWlyLmNyb3NzaGFpci54LCBjcm9zc2hhaXIuY3Jvc3NoYWlyLnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBwYW5lbC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsR2x1ZSgpLAotICAgICAgICAgICAgICAgIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgeSsrLCAyLCAxLCAxLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuRklSU1RfTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLSAgICAgICAgcmV0dXJuIHBhbmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZE92ZXJsYXlFeHRyYUNvbnRyb2xzKEpQYW5lbCBwYW5lbCkgewotICAgICAgICBKUGFuZWwgZXh0cmFzID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQsIDAsIDApKTsKLQotICAgICAgICBKQnV0dG9uIGxvYWRPdmVybGF5ID0gbmV3IEpCdXR0b24oIkxvYWQuLi4iKTsKLSAgICAgICAgbG9hZE92ZXJsYXkuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3dpbmdXb3JrZXI8PywgPz4gd29ya2VyID0gb3Blbk92ZXJsYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAod29ya2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd29ya2VyLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBleHRyYXMuYWRkKGxvYWRPdmVybGF5KTsKLQotICAgICAgICBKQ2hlY2tCb3ggc2hvd0luTG91cGUgPSBuZXcgSkNoZWNrQm94KCJTaG93IGluIExvdXBlIik7Ci0gICAgICAgIHNob3dJbkxvdXBlLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgc2hvd0luTG91cGUuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgbG91cGUuc2hvd092ZXJsYXkgPSAoKEpDaGVja0JveCkgZXZlbnQuZ2V0U291cmNlKCkpLmlzU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICBsb3VwZS5yZXBhaW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBleHRyYXMuYWRkKHNob3dJbkxvdXBlKTsKLQotICAgICAgICBwYW5lbC5hZGQoZXh0cmFzLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIHkrKywgMSwgMSwgMS4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTd2luZ1dvcmtlcjw/LCA/PiBvcGVuT3ZlcmxheSgpIHsKLSAgICAgICAgSkZpbGVDaG9vc2VyIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgUG5nRmlsZUZpbHRlcigpKTsKLSAgICAgICAgaW50IGNob2ljZSA9IGNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcyk7Ci0gICAgICAgIGlmIChjaG9pY2UgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5PdmVybGF5VGFzayhjaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKU2xpZGVyIGJ1aWxkU2xpZGVyKEpQYW5lbCBwYW5lbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWluTmFtZSwgU3RyaW5nIG1heE5hbWUsCi0gICAgICAgICAgICBpbnQgbWluLCBpbnQgbWF4LCBpbnQgdmFsdWUsIGludCB0aWNrKSB7Ci0gICAgICAgIHBhbmVsLmFkZChuZXcgSkxhYmVsKHRpdGxlKSwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCB5LCAxLCAxLCAxLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9FTkQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDYpLCAwLCAwKSk7Ci0gICAgICAgIEpQYW5lbCBzbGlkZXJQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZULCAwLCAwKSk7Ci0gICAgICAgIHNsaWRlclBhbmVsLmFkZChuZXcgSkxhYmVsKG1pbk5hbWUpKTsKLSAgICAgICAgSlNsaWRlciBzbGlkZXIgPSBuZXcgSlNsaWRlcihtaW4sIG1heCwgdmFsdWUpOwotICAgICAgICBzbGlkZXIuc2V0TWlub3JUaWNrU3BhY2luZyh0aWNrKTsKLSAgICAgICAgc2xpZGVyLnNldE1ham9yVGlja1NwYWNpbmcodGljayk7Ci0gICAgICAgIHNsaWRlci5zZXRTbmFwVG9UaWNrcyh0cnVlKTsKLSAgICAgICAgc2xpZGVyUGFuZWwuYWRkKHNsaWRlcik7Ci0gICAgICAgIHNsaWRlclBhbmVsLmFkZChuZXcgSkxhYmVsKG1heE5hbWUpKTsKLSAgICAgICAgcGFuZWwuYWRkKHNsaWRlclBhbmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIHkrKywgMSwgMSwgMS4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkZJUlNUX0xJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICByZXR1cm4gc2xpZGVyOwotICAgIH0KLQotICAgIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgdGltZXIuc3RvcCgpOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZWxlY3QoVmlld05vZGUgbm9kZSkgewotICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgICAgICByZXBhaW50KCk7Ci0gICAgfQotCi0gICAgY2xhc3MgTG91cGVWaWV3ZXIgZXh0ZW5kcyBKQ29tcG9uZW50IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBsaW5lQ29sb3IgPSBuZXcgQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMC4zZik7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgd2lkdGg7Ci0gICAgICAgIHByaXZhdGUgaW50IGhlaWdodDsKLSAgICAgICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIGdyaWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGxlZnQ7Ci0gICAgICAgIHByaXZhdGUgaW50IHRvcDsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2xlYXJHcmlkOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlIGNsaXAgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG93T3ZlcmxheSA9IGZhbHNlOwotCi0gICAgICAgIExvdXBlVmlld2VyKCkgewotICAgICAgICAgICAgYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVUb1BvaW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGFkZE1vdXNlTW90aW9uTGlzdGVuZXIobmV3IE1vdXNlTW90aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURyYWdnZWQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb2ludChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgaWYgKGlzTG9hZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZy50cmFuc2xhdGUoLWxlZnQsIC10b3ApOwotCi0gICAgICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSAoR3JhcGhpY3MyRCkgZy5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBnMi5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9JTlRFUlBPTEFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SKTsKLSAgICAgICAgICAgICAgICBnMi5zY2FsZSh6b29tLCB6b29tKTsKLSAgICAgICAgICAgICAgICBnMi5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChvdmVybGF5ICE9IG51bGwgJiYgc2hvd092ZXJsYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgZzIuc2V0Q29tcG9zaXRlKG92ZXJsYXlBbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGcyLmRyYXdJbWFnZShvdmVybGF5LCAwLCBpbWFnZS5nZXRIZWlnaHQoKSAtIG92ZXJsYXkuZ2V0SGVpZ2h0KCksIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSBudWxsOwotICAgICAgICAgICAgaWYgKHdpZHRoICE9IHRoaXMud2lkdGggfHwgaGVpZ2h0ICE9IHRoaXMuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgZ3JpZCA9IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoICsgem9vbSArIDEsIGhlaWdodCArIHpvb20gKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKLSAgICAgICAgICAgICAgICBjbGVhckdyaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGcyID0gZ3JpZC5jcmVhdGVHcmFwaGljcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhckdyaWQpIHsKLSAgICAgICAgICAgICAgICBnMiA9IGdyaWQuY3JlYXRlR3JhcGhpY3MoKTsKLSAgICAgICAgICAgICAgICBnMi5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwotICAgICAgICAgICAgICAgIGcyLmZpbGxSZWN0KDAsIDAsIGdyaWQuZ2V0V2lkdGgoKSwgZ3JpZC5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgZzIuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyY092ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2xlYXJHcmlkKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJHcmlkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihsaW5lQ29sb3IpOwotICAgICAgICAgICAgICAgIHdpZHRoICs9IHpvb207Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IHpvb207Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gem9vbTsgeCA8PSB3aWR0aDsgeCArPSB6b29tKSB7Ci0gICAgICAgICAgICAgICAgICAgIGcyLmRyYXdMaW5lKHgsIDAsIHgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPD0gaGVpZ2h0OyB5ICs9IHpvb20pIHsKLSAgICAgICAgICAgICAgICAgICAgZzIuZHJhd0xpbmUoMCwgeSwgd2lkdGgsIHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGcyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnLmdldENsaXBCb3VuZHMoY2xpcCk7Ci0gICAgICAgICAgICAgICAgZy5jbGlwUmVjdCgwLCAwLCBpbWFnZS5nZXRXaWR0aCgpICogem9vbSArIDEsIGltYWdlLmdldEhlaWdodCgpICogem9vbSArIDEpOwotICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGdyaWQsIGNsaXAueCAtIGNsaXAueCAlIHpvb20sIGNsaXAueSAtIGNsaXAueSAlIHpvb20sIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBnLnRyYW5zbGF0ZShsZWZ0LCB0b3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBtb3ZlVG9Qb2ludChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpbnQgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKChldmVudC5nZXRYKCkgKyBsZWZ0KSAvIHpvb20sIGltYWdlLmdldFdpZHRoKCkgLSAxKSk7Ci0gICAgICAgICAgICBpbnQgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKChldmVudC5nZXRZKCkgKyB0b3ApIC8gem9vbSwgaW1hZ2UuZ2V0SGVpZ2h0KCkgLSAxKSk7Ci0gICAgICAgICAgICBtb3ZlVG9Qb2ludCh4LCB5KTsKLSAgICAgICAgICAgIGNyb3NzaGFpci5tb3ZlVG9Qb2ludCh4LCB5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbW92ZVRvUG9pbnQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgICAgICBsZWZ0ID0geCAqIHpvb20gLSB3aWR0aCAvIDIgKyB6b29tIC8gMjsKLSAgICAgICAgICAgIHRvcCA9IHkgKiB6b29tIC0gaGVpZ2h0IC8gMiArIHpvb20gLyAyOwotICAgICAgICAgICAgcmVwYWludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTG91cGVTdGF0dXMgZXh0ZW5kcyBKUGFuZWwgewotICAgICAgICBwcml2YXRlIEpMYWJlbCB4TGFiZWw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsIHlMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgckxhYmVsOwotICAgICAgICBwcml2YXRlIEpMYWJlbCBnTGFiZWw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsIGJMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgaExhYmVsOwotICAgICAgICBwcml2YXRlIFNjcmVlblZpZXdlci5Mb3VwZVN0YXR1cy5Db2xvcmVkU3F1YXJlIHNxdWFyZTsKLSAgICAgICAgcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotICAgICAgICBMb3VwZVN0YXR1cygpIHsKLSAgICAgICAgICAgIHNldE9wYXF1ZSh0cnVlKTsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgICAgIHNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDQsIDQsIDQsIDQpKTsKLQotICAgICAgICAgICAgc3F1YXJlID0gbmV3IENvbG9yZWRTcXVhcmUoKTsKLSAgICAgICAgICAgIGFkZChzcXVhcmUsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMiwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDEyKSwgMCwgMCApKTsKLQotICAgICAgICAgICAgSkxhYmVsIGxhYmVsOwotCi0gICAgICAgICAgICBhZGQobGFiZWwgPSBuZXcgSkxhYmVsKCIjZmZmZmZmIiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDEyKSwgMCwgMCApKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgaExhYmVsID0gbGFiZWw7Ci0KLSAgICAgICAgICAgIGFkZChsYWJlbCA9IG5ldyBKTGFiZWwoIlI6IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDYsIDAsIDYpLCAwLCAwICkpOwotICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBhZGQobGFiZWwgPSBuZXcgSkxhYmVsKCIyNTUiKSwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAwLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMTIpLCAwLCAwICkpOwotICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICByTGFiZWwgPSBsYWJlbDsKLQotICAgICAgICAgICAgYWRkKGxhYmVsID0gbmV3IEpMYWJlbCgiRzoiKSwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAxLCAxLCAxLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgNiwgMCwgNiksIDAsIDAgKSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIGFkZChsYWJlbCA9IG5ldyBKTGFiZWwoIjI1NSIpLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDEsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAxMiksIDAsIDAgKSk7Ci0gICAgICAgICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIGdMYWJlbCA9IGxhYmVsOwotCi0gICAgICAgICAgICBhZGQobGFiZWwgPSBuZXcgSkxhYmVsKCJCOiIpLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCA2LCAwLCA2KSwgMCwgMCApKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgYWRkKGxhYmVsID0gbmV3IEpMYWJlbCgiMjU1IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMiwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDEyKSwgMCwgMCApKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgYkxhYmVsID0gbGFiZWw7Ci0KLSAgICAgICAgICAgIGFkZChsYWJlbCA9IG5ldyBKTGFiZWwoIlg6IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMywgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDYsIDAsIDYpLCAwLCAwICkpOwotICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBhZGQobGFiZWwgPSBuZXcgSkxhYmVsKCIwIHB4IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoNCwgMCwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDEyKSwgMCwgMCApKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgeExhYmVsID0gbGFiZWw7Ci0KLSAgICAgICAgICAgIGFkZChsYWJlbCA9IG5ldyBKTGFiZWwoIlk6IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMywgMSwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDYsIDAsIDYpLCAwLCAwICkpOwotICAgICAgICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBhZGQobGFiZWwgPSBuZXcgSkxhYmVsKCIwIHB4IiksIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoNCwgMSwgMSwgMSwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDEyKSwgMCwgMCApKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgeUxhYmVsID0gbGFiZWw7Ci0KLSAgICAgICAgICAgIGFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSwgbmV3IEdyaWRCYWdDb25zdHJhaW50cyg1LCAwLCAxLCAxLCAxLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDAgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5CTEFDSyk7Ci0gICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2hvd1BpeGVsKGludCB4LCBpbnQgeSkgewotICAgICAgICAgICAgeExhYmVsLnNldFRleHQoeCArICIgcHgiKTsKLSAgICAgICAgICAgIHlMYWJlbC5zZXRUZXh0KHkgKyAiIHB4Iik7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbCA9IGltYWdlLmdldFJHQih4LCB5KTsKLSAgICAgICAgICAgIGNvbG9yID0gbmV3IENvbG9yKHBpeGVsKTsKLSAgICAgICAgICAgIGhMYWJlbC5zZXRUZXh0KCIjIiArIEludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpKTsKLSAgICAgICAgICAgIHJMYWJlbC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKChwaXhlbCA+PiAxNikgJiAweGZmKSk7Ci0gICAgICAgICAgICBnTGFiZWwuc2V0VGV4dChTdHJpbmcudmFsdWVPZigocGl4ZWwgPj4gIDgpICYgMHhmZikpOwotICAgICAgICAgICAgYkxhYmVsLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoKHBpeGVsICAgICAgKSAmIDB4ZmYpKTsKLQotICAgICAgICAgICAgc3F1YXJlLnJlcGFpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQ29sb3JlZFNxdWFyZSBleHRlbmRzIEpDb21wb25lbnQgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoKSB7Ci0gICAgICAgICAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgZC53aWR0aCA9IDYwOwotICAgICAgICAgICAgICAgIGQuaGVpZ2h0ID0gMzA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwotCi0gICAgICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICAgICAgZy5kcmF3UmVjdCgwLCAwLCBnZXRXaWR0aCgpIC0gMSwgZ2V0SGVpZ2h0KCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIENyb3NzaGFpciBleHRlbmRzIEpQYW5lbCB7Ci0gICAgICAgIC8vIG1hZ2VudGEgPSAweGZmNWVmZQotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIGNyb3NzaGFpckNvbG9yID0gbmV3IENvbG9yKDB4MDBmZmZmKTsKLSAgICAgICAgUG9pbnQgY3Jvc3NoYWlyID0gbmV3IFBvaW50KCk7Ci0gICAgICAgIHByaXZhdGUgaW50IHdpZHRoOwotICAgICAgICBwcml2YXRlIGludCBoZWlnaHQ7Ci0KLSAgICAgICAgQ3Jvc3NoYWlyKFNjcmVlbnNob3RWaWV3ZXIgc2NyZWVuc2hvdFZpZXdlcikgewotICAgICAgICAgICAgc2V0T3BhcXVlKHRydWUpOwotICAgICAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgICAgICBhZGQoc2NyZWVuc2hvdFZpZXdlcik7Ci0gICAgICAgICAgICBhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVRvUG9pbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihuZXcgTW91c2VNb3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRHJhZ2dlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVUb1BvaW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbW92ZVRvUG9pbnQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgICAgICBjcm9zc2hhaXIueCA9IHg7Ci0gICAgICAgICAgICBjcm9zc2hhaXIueSA9IHk7Ci0gICAgICAgICAgICBzdGF0dXMuc2hvd1BpeGVsKGNyb3NzaGFpci54LCBjcm9zc2hhaXIueSk7Ci0gICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZVRvUG9pbnQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgY3Jvc3NoYWlyLnggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpbWFnZS5nZXRXaWR0aCgpIC0gMSwgZXZlbnQuZ2V0WCgpKSk7Ci0gICAgICAgICAgICBjcm9zc2hhaXIueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGltYWdlLmdldEhlaWdodCgpIC0gMSwgZXZlbnQuZ2V0WSgpKSk7Ci0gICAgICAgICAgICBsb3VwZS5tb3ZlVG9Qb2ludChjcm9zc2hhaXIueCwgY3Jvc3NoYWlyLnkpOwotICAgICAgICAgICAgc3RhdHVzLnNob3dQaXhlbChjcm9zc2hhaXIueCwgY3Jvc3NoYWlyLnkpOwotCi0gICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgc3VwZXIucGFpbnQoZyk7Ci0KLSAgICAgICAgICAgIGlmIChjcm9zc2hhaXIgPT0gbnVsbCB8fCB3aWR0aCAhPSBnZXRXaWR0aCgpIHx8IGhlaWdodCAhPSBnZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBjcm9zc2hhaXIgPSBuZXcgUG9pbnQod2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZy5zZXRDb2xvcihjcm9zc2hhaXJDb2xvcik7Ci0KLSAgICAgICAgICAgIGcuZHJhd0xpbmUoY3Jvc3NoYWlyLngsIDAsIGNyb3NzaGFpci54LCBoZWlnaHQpOwotICAgICAgICAgICAgZy5kcmF3TGluZSgwLCBjcm9zc2hhaXIueSwgd2lkdGgsIGNyb3NzaGFpci55KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBnKSB7Ci0gICAgICAgICAgICBzdXBlci5wYWludENvbXBvbmVudChnKTsKLSAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotICAgICAgICAgICAgZy5maWxsUmVjdCgwLCAwLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBTY3JlZW5zaG90Vmlld2VyIGV4dGVuZHMgSkNvbXBvbmVudCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgYm91bmRzQ29sb3IgPSBuZXcgQ29sb3IoMHhmZjVlZmUpOwotCi0gICAgICAgIFNjcmVlbnNob3RWaWV3ZXIoKSB7Ci0gICAgICAgICAgICBzZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5CTEFDSyk7Ci0gICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKLQotICAgICAgICAgICAgaWYgKGlzTG9hZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBHcmFwaGljczJEIGcyID0gKEdyYXBoaWNzMkQpIGcuY3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGcyLnNldENvbXBvc2l0ZShvdmVybGF5QWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBnMi5kcmF3SW1hZ2Uob3ZlcmxheSwgMCwgaW1hZ2UuZ2V0SGVpZ2h0KCkgLSBvdmVybGF5LmdldEhlaWdodCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBHcmFwaGljcyBzID0gZy5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBzLnNldENvbG9yKGJvdW5kc0NvbG9yKTsKLSAgICAgICAgICAgICAgICBWaWV3Tm9kZSBwID0gbm9kZS5wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzLnRyYW5zbGF0ZShwLmxlZnQgLSBwLnNjcm9sbFgsIHAudG9wIC0gcC5zY3JvbGxZKTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IHAucGFyZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzLmRyYXdSZWN0KG5vZGUubGVmdCwgbm9kZS50b3AsIG5vZGUud2lkdGggLSAxLCBub2RlLmhlaWdodCAtIDEpOwotICAgICAgICAgICAgICAgIHMudHJhbnNsYXRlKG5vZGUubGVmdCwgbm9kZS50b3ApOwotCi0gICAgICAgICAgICAgICAgcy5zZXRYT1JNb2RlKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5vZGUucGFkZGluZ0JvdHRvbSB8IG5vZGUucGFkZGluZ0xlZnQgfAotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYWRkaW5nVG9wIHwgbm9kZS5wYWRkaW5nUmlnaHQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcy5zZXRDb2xvcihDb2xvci5CTEFDSyk7Ci0gICAgICAgICAgICAgICAgICAgIHMuZHJhd1JlY3Qobm9kZS5wYWRkaW5nTGVmdCwgbm9kZS5wYWRkaW5nVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUud2lkdGggLSBub2RlLnBhZGRpbmdSaWdodCAtIG5vZGUucGFkZGluZ0xlZnQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaGVpZ2h0IC0gbm9kZS5wYWRkaW5nQm90dG9tIC0gbm9kZS5wYWRkaW5nVG9wIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChub2RlLmhhc01hcmdpbnMgJiYgKG5vZGUubWFyZ2luTGVmdCB8IG5vZGUubWFyZ2luQm90dG9tIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWFyZ2luUmlnaHQgfCBub2RlLm1hcmdpblJpZ2h0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotICAgICAgICAgICAgICAgICAgICBzLmRyYXdSZWN0KC1ub2RlLm1hcmdpbkxlZnQsIC1ub2RlLm1hcmdpblRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1hcmdpbkxlZnQgKyBub2RlLndpZHRoICsgbm9kZS5tYXJnaW5SaWdodCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXJnaW5Ub3AgKyBub2RlLmhlaWdodCArIG5vZGUubWFyZ2luQm90dG9tIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKCkgewotICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbigzMjAsIDQ4MCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihpbWFnZS5nZXRXaWR0aCgpLCBpbWFnZS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENyb3NzaGFpclBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBjcm9zc2hhaXJDb2xvciA9IG5ldyBDb2xvcigweGZmNWVmZSk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW5zZXRzIGluc2V0cyA9IG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7Ci0KLSAgICAgICAgQ3Jvc3NoYWlyUGFuZWwoTG91cGVWaWV3ZXIgbG91cGUpIHsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgYWRkKGxvdXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0gICAgICAgICAgICBzdXBlci5wYWludChnKTsKLQotICAgICAgICAgICAgZy5zZXRDb2xvcihjcm9zc2hhaXJDb2xvcik7Ci0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIGdldEluc2V0cyhpbnNldHMpOwotCi0gICAgICAgICAgICBpbnQgeCA9ICh3aWR0aCAtIGluc2V0cy5sZWZ0IC0gaW5zZXRzLnJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICBpbnQgeSA9IChoZWlnaHQgLSBpbnNldHMudG9wIC0gaW5zZXRzLmJvdHRvbSkgLyAyOwotCi0gICAgICAgICAgICBnLmRyYXdMaW5lKGluc2V0cy5sZWZ0ICsgeCwgaW5zZXRzLnRvcCwgaW5zZXRzLmxlZnQgKyB4LCBoZWlnaHQgLSBpbnNldHMuYm90dG9tKTsKLSAgICAgICAgICAgIGcuZHJhd0xpbmUoaW5zZXRzLmxlZnQsIGluc2V0cy50b3AgKyB5LCB3aWR0aCAtIGluc2V0cy5yaWdodCwgaW5zZXRzLnRvcCArIHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotICAgICAgICAgICAgSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotICAgICAgICAgICAgZy5maWxsUmVjdChpbnNldHMubGVmdCwgaW5zZXRzLnRvcCwgZ2V0V2lkdGgoKSAtIGluc2V0cy5sZWZ0IC0gaW5zZXRzLnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSAtIGluc2V0cy50b3AgLSBpbnNldHMuYm90dG9tKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAodGFzayAhPSBudWxsICYmICF0YXNrLmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGFzayA9IG5ldyBHZXRTY3JlZW5zaG90VGFzaygpOwotICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEdldFNjcmVlbnNob3RUYXNrIGV4dGVuZHMgU3dpbmdXb3JrZXI8Qm9vbGVhbiwgVm9pZD4gewotICAgICAgICBwcml2YXRlIEdldFNjcmVlbnNob3RUYXNrKCkgewotICAgICAgICAgICAgd29ya3NwYWNlLmJlZ2luVGFzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIEBXb3JrZXJUaHJlYWQKLSAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gZG9JbkJhY2tncm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFJhd0ltYWdlIHJhd0ltYWdlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByYXdJbWFnZSA9IGRldmljZS5nZXRTY3JlZW5zaG90KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzaXplID0gZmFsc2U7Ci0gICAgICAgICAgICBpc0xvYWRpbmcgPSB0cnVlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAocmF3SW1hZ2UgIT0gbnVsbCAmJiByYXdJbWFnZS5icHAgPT0gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwgfHwgcmF3SW1hZ2Uud2lkdGggIT0gaW1hZ2UuZ2V0V2lkdGgoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0ltYWdlLmhlaWdodCAhPSBpbWFnZS5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShyYXdJbWFnZS53aWR0aCwgcmF3SW1hZ2UuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmUgPSBuZXcgaW50W3Jhd0ltYWdlLndpZHRoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gcmF3SW1hZ2UuZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDAgOyB5IDwgcmF3SW1hZ2UuaGVpZ2h0IDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMCA7IHggPCByYXdJbWFnZS53aWR0aCA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGJ1ZmZlcltpbmRleCsrXSAmIDB4MDBGRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoYnVmZmVyW2luZGV4KytdIDw8IDgpICYgMHgwRkYwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gKCh2YWx1ZSA+PiAxMSkgJiAweDAxRikgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyA9ICgodmFsdWUgPj4gNSkgJiAweDAzRikgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9ICgodmFsdWUgICAgICkgJiAweDAxRikgPDwgMzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lW3hdID0gMHhGRiA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0UkdCKDAsIHksIHJhd0ltYWdlLndpZHRoLCAxLCBzY2FubGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmF3SW1hZ2Uud2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewotICAgICAgICAgICAgd29ya3NwYWNlLmVuZFRhc2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNyb3NzaGFpci5jcm9zc2hhaXIgPSBuZXcgUG9pbnQoaW1hZ2UuZ2V0V2lkdGgoKSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZ2V0SGVpZ2h0KCkgLyAyKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNob3dQaXhlbChpbWFnZS5nZXRXaWR0aCgpIC8gMiwgaW1hZ2UuZ2V0SGVpZ2h0KCkgLyAyKTsKLSAgICAgICAgICAgICAgICAgICAgbG91cGUubW92ZVRvUG9pbnQoaW1hZ2UuZ2V0V2lkdGgoKSAvIDIsIGltYWdlLmdldEhlaWdodCgpIC8gMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE9wZW5PdmVybGF5VGFzayBleHRlbmRzIFN3aW5nV29ya2VyPEJ1ZmZlcmVkSW1hZ2UsIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGZpbGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBPcGVuT3ZlcmxheVRhc2soRmlsZSBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgd29ya3NwYWNlLmJlZ2luVGFzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIEBXb3JrZXJUaHJlYWQKLSAgICAgICAgcHJvdGVjdGVkIEJ1ZmZlcmVkSW1hZ2UgZG9JbkJhY2tncm91bmQoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBJY29uTG9hZGVyLnRvQ29tcGF0aWJsZUltYWdlKEltYWdlSU8ucmVhZChmaWxlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3ZlcmxheSA9IGdldCgpOwotICAgICAgICAgICAgICAgIHJlcGFpbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB3b3Jrc3BhY2UuZW5kVGFzaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvV29ya3NwYWNlLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9Xb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MTI0My4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9Xb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkFuZHJvaWREZWJ1Z0JyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLkRldmljZUJyaWRnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLldpbmRvdzsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIubGFmLlVuaWZpZWRDb250ZW50Qm9yZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5DYXB0dXJlTG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5WaWV3SGllcmFyY2h5TG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5WaWV3SGllcmFyY2h5U2NlbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnNjZW5lLlZpZXdNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5WaWV3Tm9kZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmUuV2luZG93c0xvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuc2NlbmUuUHJvZmlsZXNMb2FkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnV0aWwuT1M7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnV0aWwuV29ya2VyVGhyZWFkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uU2hvd0RldmljZXNBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbi5SZXF1ZXN0TGF5b3V0QWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uSW52YWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuYWN0aW9uLkNhcHR1cmVOb2RlQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uUmVmcmVzaFdpbmRvd3NBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbi5TdG9wU2VydmVyQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uU3RhcnRTZXJ2ZXJBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbi5FeGl0QWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uTG9hZEdyYXBoQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb24uU2F2ZVNjZW5lQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS51dGlsLlBuZ0ZpbGVGaWx0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLnV0aWwuSWNvbkxvYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkubW9kZWwuUHJvcGVydGllc1RhYmxlTW9kZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLm1vZGVsLlZpZXdzVHJlZU1vZGVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5tb2RlbC5Qcm9maWxlc1RhYmxlTW9kZWw7Ci1pbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5nd29ya2VyLlN3aW5nV29ya2VyOwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLmdyYXBoLmxheW91dC5UcmVlR3JhcGhMYXlvdXQ7Ci1pbXBvcnQgb3JnLm5ldGJlYW5zLmFwaS52aXN1YWwubW9kZWwuT2JqZWN0U2NlbmVFdmVudDsKLWltcG9ydCBvcmcubmV0YmVhbnMuYXBpLnZpc3VhbC5tb2RlbC5PYmplY3RTY2VuZUV2ZW50VHlwZTsKLWltcG9ydCBvcmcubmV0YmVhbnMuYXBpLnZpc3VhbC5tb2RlbC5PYmplY3RTY2VuZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5uZXRiZWFucy5hcGkudmlzdWFsLm1vZGVsLk9iamVjdFN0YXRlOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbk1hcDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwOwotaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGaWxlQ2hvb3NlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51OwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51QmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlByb2dyZXNzQmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxCYXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNsaWRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUb29sQmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlQWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlV2hlZWxFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZVdoZWVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFdvcmtzcGFjZSBleHRlbmRzIEpGcmFtZSB7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgdmlld0NvdW50TGFiZWw7Ci0gICAgcHJpdmF0ZSBKU2xpZGVyIHpvb21TbGlkZXI7Ci0gICAgcHJpdmF0ZSBKU3BsaXRQYW5lIHNpZGVTcGxpdHRlcjsKLSAgICBwcml2YXRlIEpTcGxpdFBhbmUgbWFpblNwbGl0dGVyOwotICAgIHByaXZhdGUgSlRhYmxlIHByb3BlcnRpZXNUYWJsZTsKLSAgICBwcml2YXRlIEpUYWJsZSBwcm9maWxpbmdUYWJsZTsKLSAgICBwcml2YXRlIEpDb21wb25lbnQgcGl4ZWxQZXJmZWN0UGFuZWw7Ci0gICAgcHJpdmF0ZSBKVHJlZSBwaXhlbFBlcmZlY3RUcmVlOwotICAgIHByaXZhdGUgU2NyZWVuVmlld2VyIHNjcmVlblZpZXdlcjsKLQotICAgIHByaXZhdGUgSlBhbmVsIGV4dHJhc1BhbmVsOwotICAgIHByaXZhdGUgTGF5b3V0UmVuZGVyZXIgbGF5b3V0VmlldzsKLQotICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgc2NlbmVTY3JvbGxlcjsKLSAgICBwcml2YXRlIEpDb21wb25lbnQgc2NlbmVWaWV3OwotCi0gICAgcHJpdmF0ZSBWaWV3SGllcmFyY2h5U2NlbmUgc2NlbmU7Ci0KLSAgICBwcml2YXRlIEFjdGlvbk1hcCBhY3Rpb25zTWFwOwotICAgIHByaXZhdGUgSlBhbmVsIG1haW5QYW5lbDsKLSAgICBwcml2YXRlIEpQcm9ncmVzc0JhciBwcm9ncmVzczsKLSAgICBwcml2YXRlIEpUb29sQmFyIGJ1dHRvbnNQYW5lbDsKLQotICAgIHByaXZhdGUgSkNvbXBvbmVudCBkZXZpY2VTZWxlY3RvcjsKLSAgICBwcml2YXRlIERldmljZXNUYWJsZU1vZGVsIGRldmljZXNUYWJsZU1vZGVsOwotICAgIHByaXZhdGUgV2luZG93c1RhYmxlTW9kZWwgd2luZG93c1RhYmxlTW9kZWw7Ci0KLSAgICBwcml2YXRlIElEZXZpY2UgY3VycmVudERldmljZTsKLSAgICBwcml2YXRlIFdpbmRvdyBjdXJyZW50V2luZG93ID0gV2luZG93LkZPQ1VTRURfV0lORE9XOwotCi0gICAgcHJpdmF0ZSBKQnV0dG9uIGRpc3BsYXlOb2RlQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBpbnZhbGlkYXRlQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiByZXF1ZXN0TGF5b3V0QnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBsb2FkQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBzdGFydEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gc3RvcEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gc2hvd0RldmljZXNCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIHJlZnJlc2hCdXR0b247Ci0gICAgcHJpdmF0ZSBKVG9nZ2xlQnV0dG9uIGdyYXBoVmlld0J1dHRvbjsKLSAgICBwcml2YXRlIEpUb2dnbGVCdXR0b24gcGl4ZWxQZXJmZWN0Vmlld0J1dHRvbjsKLSAgICBwcml2YXRlIEpNZW51SXRlbSBzYXZlTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBKTWVudUl0ZW0gc2hvd0RldmljZXNNZW51SXRlbTsKLSAgICBwcml2YXRlIEpNZW51SXRlbSBsb2FkTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBKTWVudUl0ZW0gc3RhcnRNZW51SXRlbTsKLSAgICBwcml2YXRlIEpNZW51SXRlbSBzdG9wTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBKVGFibGUgZGV2aWNlczsKLSAgICBwcml2YXRlIEpUYWJsZSB3aW5kb3dzOwotICAgIHByaXZhdGUgSkxhYmVsIG1pblpvb21MYWJlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBtYXhab29tTGFiZWw7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZpbHRlclRleHQ7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgZmlsdGVyTGFiZWw7Ci0KLSAgICBwdWJsaWMgV29ya3NwYWNlKCkgewotICAgICAgICBzdXBlcigiSGllcmFyY2h5IFZpZXdlciIpOwotCi0gICAgICAgIGJ1aWxkQWN0aW9ucygpOwotICAgICAgICBhZGQoYnVpbGRNYWluUGFuZWwoKSk7Ci0gICAgICAgIHNldEpNZW51QmFyKGJ1aWxkTWVudUJhcigpKTsKLQotICAgICAgICBkZXZpY2VzLmNoYW5nZVNlbGVjdGlvbigwLCAwLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBjdXJyZW50RGV2aWNlQ2hhbmdlZCgpOwotCi0gICAgICAgIHBhY2soKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRBY3Rpb25zKCkgewotICAgICAgICBhY3Rpb25zTWFwID0gbmV3IEFjdGlvbk1hcCgpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChFeGl0QWN0aW9uLkFDVElPTl9OQU1FLCBuZXcgRXhpdEFjdGlvbih0aGlzKSk7Ci0gICAgICAgIGFjdGlvbnNNYXAucHV0KFNob3dEZXZpY2VzQWN0aW9uLkFDVElPTl9OQU1FLCBuZXcgU2hvd0RldmljZXNBY3Rpb24odGhpcykpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChMb2FkR3JhcGhBY3Rpb24uQUNUSU9OX05BTUUsIG5ldyBMb2FkR3JhcGhBY3Rpb24odGhpcykpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChTYXZlU2NlbmVBY3Rpb24uQUNUSU9OX05BTUUsIG5ldyBTYXZlU2NlbmVBY3Rpb24odGhpcykpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChTdGFydFNlcnZlckFjdGlvbi5BQ1RJT05fTkFNRSwgbmV3IFN0YXJ0U2VydmVyQWN0aW9uKHRoaXMpKTsKLSAgICAgICAgYWN0aW9uc01hcC5wdXQoU3RvcFNlcnZlckFjdGlvbi5BQ1RJT05fTkFNRSwgbmV3IFN0b3BTZXJ2ZXJBY3Rpb24odGhpcykpOwotICAgICAgICBhY3Rpb25zTWFwLnB1dChJbnZhbGlkYXRlQWN0aW9uLkFDVElPTl9OQU1FLCBuZXcgSW52YWxpZGF0ZUFjdGlvbih0aGlzKSk7Ci0gICAgICAgIGFjdGlvbnNNYXAucHV0KFJlcXVlc3RMYXlvdXRBY3Rpb24uQUNUSU9OX05BTUUsIG5ldyBSZXF1ZXN0TGF5b3V0QWN0aW9uKHRoaXMpKTsKLSAgICAgICAgYWN0aW9uc01hcC5wdXQoQ2FwdHVyZU5vZGVBY3Rpb24uQUNUSU9OX05BTUUsIG5ldyBDYXB0dXJlTm9kZUFjdGlvbih0aGlzKSk7Ci0gICAgICAgIGFjdGlvbnNNYXAucHV0KFJlZnJlc2hXaW5kb3dzQWN0aW9uLkFDVElPTl9OQU1FLCBuZXcgUmVmcmVzaFdpbmRvd3NBY3Rpb24odGhpcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgSkNvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLSAgICAgICAgbWFpblBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBtYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgIG1haW5QYW5lbC5hZGQoYnVpbGRUb29sQmFyKCksIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLSAgICAgICAgbWFpblBhbmVsLmFkZChkZXZpY2VTZWxlY3RvciA9IGJ1aWxkRGV2aWNlU2VsZWN0b3IoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgIG1haW5QYW5lbC5hZGQoYnVpbGRTdGF0dXNQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCi0gICAgICAgIG1haW5QYW5lbC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oOTUwLCA4MDApKTsKLQotICAgICAgICByZXR1cm4gbWFpblBhbmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgSkNvbXBvbmVudCBidWlsZEdyYXBoUGFuZWwoKSB7Ci0gICAgICAgIHNjZW5lU2Nyb2xsZXIgPSBuZXcgSlNjcm9sbFBhbmUoKTsKLSAgICAgICAgc2NlbmVTY3JvbGxlci5zZXRCb3JkZXIobnVsbCk7Ci0KLSAgICAgICAgbWFpblNwbGl0dGVyID0gbmV3IEpTcGxpdFBhbmUoKTsKLSAgICAgICAgbWFpblNwbGl0dGVyLnNldFJlc2l6ZVdlaWdodCgxLjApOwotICAgICAgICBtYWluU3BsaXR0ZXIuc2V0Q29udGludW91c0xheW91dCh0cnVlKTsKLSAgICAgICAgaWYgKE9TLmlzTWFjT3NYKCkgJiYgT1MuaXNMZW9wYXJkT3JMYXRlcigpKSB7Ci0gICAgICAgICAgICBtYWluU3BsaXR0ZXIuc2V0Qm9yZGVyKG5ldyBVbmlmaWVkQ29udGVudEJvcmRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1haW5TcGxpdHRlci5zZXRMZWZ0Q29tcG9uZW50KHNjZW5lU2Nyb2xsZXIpOwotICAgICAgICBtYWluU3BsaXR0ZXIuc2V0UmlnaHRDb21wb25lbnQoYnVpbGRTaWRlU3BsaXR0ZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG1haW5TcGxpdHRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpDb21wb25lbnQgYnVpbGREZXZpY2VTZWxlY3RvcigpIHsKLSAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgaWYgKE9TLmlzTWFjT3NYKCkgJiYgT1MuaXNMZW9wYXJkT3JMYXRlcigpKSB7Ci0gICAgICAgICAgICBwYW5lbC5zZXRCb3JkZXIobmV3IFVuaWZpZWRDb250ZW50Qm9yZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGV2aWNlc1RhYmxlTW9kZWwgPSBuZXcgRGV2aWNlc1RhYmxlTW9kZWwoKTsKLSAgICAgICAgZm9yIChJRGV2aWNlIGRldmljZSA6IERldmljZUJyaWRnZS5nZXREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgIERldmljZUJyaWRnZS5zZXR1cERldmljZUZvcndhcmQoZGV2aWNlKTsKLSAgICAgICAgICAgIGRldmljZXNUYWJsZU1vZGVsLmFkZERldmljZShkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIERldmljZUJyaWRnZS5zdGFydExpc3RlbkZvckRldmljZXMoZGV2aWNlc1RhYmxlTW9kZWwpOwotCi0gICAgICAgIGRldmljZXMgPSBuZXcgSlRhYmxlKGRldmljZXNUYWJsZU1vZGVsKTsKLSAgICAgICAgZGV2aWNlcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRGV2aWNlU2VsZWN0ZWRMaXN0ZW5lcigpKTsKLSAgICAgICAgZGV2aWNlcy5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLSAgICAgICAgZGV2aWNlcy5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIGRldmljZXNTY3JvbGxlciA9IG5ldyBKU2Nyb2xsUGFuZShkZXZpY2VzKTsKLSAgICAgICAgZGV2aWNlc1Njcm9sbGVyLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgcGFuZWwuYWRkKGRldmljZXNTY3JvbGxlciwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjUsIDEuMCwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgMCwgMCkpOwotCi0gICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsID0gbmV3IFdpbmRvd3NUYWJsZU1vZGVsKCk7Ci0gICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgICAgIHdpbmRvd3MgPSBuZXcgSlRhYmxlKHdpbmRvd3NUYWJsZU1vZGVsKTsKLSAgICAgICAgd2luZG93cy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihuZXcgV2luZG93U2VsZWN0ZWRMaXN0ZW5lcigpKTsKLSAgICAgICAgd2luZG93cy5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLSAgICAgICAgd2luZG93cy5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIHdpbmRvd3NTY3JvbGxlciA9IG5ldyBKU2Nyb2xsUGFuZSh3aW5kb3dzKTsKLSAgICAgICAgd2luZG93c1Njcm9sbGVyLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgcGFuZWwuYWRkKHdpbmRvd3NTY3JvbGxlciwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAwLCAxLCAxLCAwLjUsIDEuMCwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgMCwgMCkpOwotCi0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpDb21wb25lbnQgYnVpbGRTaWRlU3BsaXR0ZXIoKSB7Ci0gICAgICAgIHByb3BlcnRpZXNUYWJsZSA9IG5ldyBKVGFibGUoKTsKLSAgICAgICAgcHJvcGVydGllc1RhYmxlLnNldE1vZGVsKG5ldyBEZWZhdWx0VGFibGVNb2RlbChuZXcgT2JqZWN0W11bXSB7IH0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIlByb3BlcnR5IiwgIlZhbHVlIiB9KSk7Ci0gICAgICAgIHByb3BlcnRpZXNUYWJsZS5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHByb3BlcnRpZXNUYWJsZS5nZXRUYWJsZUhlYWRlcigpLnNldEJvcmRlcihudWxsKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSB0YWJsZVNjcm9sbGVyID0gbmV3IEpTY3JvbGxQYW5lKHByb3BlcnRpZXNUYWJsZSk7Ci0gICAgICAgIHRhYmxlU2Nyb2xsZXIuc2V0Qm9yZGVyKG51bGwpOwotCi0gICAgICAgIHByb2ZpbGluZ1RhYmxlID0gbmV3IEpUYWJsZSgpOwotICAgICAgICBwcm9maWxpbmdUYWJsZS5zZXRNb2RlbChuZXcgRGVmYXVsdFRhYmxlTW9kZWwobmV3IE9iamVjdFtdW10gewotICAgICAgICAgICAgICAgIHsgIiAiICwgIiAiIH0sIHsgIiAiICwgIiAiIH0sIHsgIiAiICwgIiAiIH0gfSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiT3BlcmF0aW9uIiwgIkR1cmF0aW9uIChtcykiIH0pKTsKLSAgICAgICAgcHJvZmlsaW5nVGFibGUuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICBwcm9maWxpbmdUYWJsZS5nZXRUYWJsZUhlYWRlcigpLnNldEJvcmRlcihudWxsKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBmaXJzdFRhYmxlU2Nyb2xsZXIgPSBuZXcgSlNjcm9sbFBhbmUocHJvZmlsaW5nVGFibGUpOwotICAgICAgICBmaXJzdFRhYmxlU2Nyb2xsZXIuc2V0Qm9yZGVyKG51bGwpOwotCi0gICAgICAgIHNldFZpc2libGVSb3dDb3VudChwcm9maWxpbmdUYWJsZSwgNSk7Ci0gICAgICAgIGZpcnN0VGFibGVTY3JvbGxlci5zZXRNaW5pbXVtU2l6ZShwcm9maWxpbmdUYWJsZS5nZXRQcmVmZXJyZWRTY3JvbGxhYmxlVmlld3BvcnRTaXplKCkpOwotCi0gICAgICAgIEpTcGxpdFBhbmUgdGFibGVzU3BsaXR0ZXIgPSBuZXcgSlNwbGl0UGFuZSgpOwotICAgICAgICB0YWJsZXNTcGxpdHRlci5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHRhYmxlc1NwbGl0dGVyLnNldE9yaWVudGF0aW9uKEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQpOwotICAgICAgICB0YWJsZXNTcGxpdHRlci5zZXRSZXNpemVXZWlnaHQoMCk7Ci0gICAgICAgIHRhYmxlc1NwbGl0dGVyLnNldExlZnRDb21wb25lbnQoZmlyc3RUYWJsZVNjcm9sbGVyKTsKLSAgICAgICAgdGFibGVzU3BsaXR0ZXIuc2V0Qm90dG9tQ29tcG9uZW50KHRhYmxlU2Nyb2xsZXIpOwotICAgICAgICB0YWJsZXNTcGxpdHRlci5zZXRDb250aW51b3VzTGF5b3V0KHRydWUpOwotCi0gICAgICAgIHNpZGVTcGxpdHRlciA9IG5ldyBKU3BsaXRQYW5lKCk7Ci0gICAgICAgIHNpZGVTcGxpdHRlci5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHNpZGVTcGxpdHRlci5zZXRPcmllbnRhdGlvbihKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUKTsKLSAgICAgICAgc2lkZVNwbGl0dGVyLnNldFJlc2l6ZVdlaWdodCgwLjUpOwotICAgICAgICBzaWRlU3BsaXR0ZXIuc2V0TGVmdENvbXBvbmVudCh0YWJsZXNTcGxpdHRlcik7Ci0gICAgICAgIHNpZGVTcGxpdHRlci5zZXRCb3R0b21Db21wb25lbnQobnVsbCk7Ci0gICAgICAgIHNpZGVTcGxpdHRlci5zZXRDb250aW51b3VzTGF5b3V0KHRydWUpOwotCi0gICAgICAgIHJldHVybiBzaWRlU3BsaXR0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKUGFuZWwgYnVpbGRTdGF0dXNQYW5lbCgpIHsKLSAgICAgICAgSlBhbmVsIHN0YXR1c1BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBzdGF0dXNQYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBKUGFuZWwgbGVmdFNpZGUgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGxlZnRTaWRlLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGxlZnRTaWRlLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQsIDAsIDUpKTsKLSAgICAgICAgbGVmdFNpZGUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNikpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgZ3JhcGhWaWV3QnV0dG9uID0gbmV3IEpUb2dnbGVCdXR0b24oSWNvbkxvYWRlci5sb2FkKGdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgIi9pbWFnZXMvaWNvbi1ncmFwaC12aWV3LnBuZyIpKTsKLSAgICAgICAgZ3JhcGhWaWV3QnV0dG9uLnNldFNlbGVjdGVkSWNvbihJY29uTG9hZGVyLmxvYWQoZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAiL2ltYWdlcy9pY29uLWdyYXBoLXZpZXctc2VsZWN0ZWQucG5nIikpOwotICAgICAgICBncmFwaFZpZXdCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uYnV0dG9uVHlwZSIsICJzZWdtZW50ZWRUZXh0dXJlZCIpOwotICAgICAgICBncmFwaFZpZXdCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uc2VnbWVudFBvc2l0aW9uIiwgImZpcnN0Iik7Ci0gICAgICAgIGdyYXBoVmlld0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZUdyYXBoVmlldygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JvdXAuYWRkKGdyYXBoVmlld0J1dHRvbik7Ci0gICAgICAgIGxlZnRTaWRlLmFkZChncmFwaFZpZXdCdXR0b24pOwotCi0gICAgICAgIHBpeGVsUGVyZmVjdFZpZXdCdXR0b24gPSBuZXcgSlRvZ2dsZUJ1dHRvbihJY29uTG9hZGVyLmxvYWQoZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAiL2ltYWdlcy9pY29uLXBpeGVsLXBlcmZlY3Qtdmlldy5wbmciKSk7Ci0gICAgICAgIHBpeGVsUGVyZmVjdFZpZXdCdXR0b24uc2V0U2VsZWN0ZWRJY29uKEljb25Mb2FkZXIubG9hZChnZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICIvaW1hZ2VzL2ljb24tcGl4ZWwtcGVyZmVjdC12aWV3LXNlbGVjdGVkLnBuZyIpKTsKLSAgICAgICAgcGl4ZWxQZXJmZWN0Vmlld0J1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5idXR0b25UeXBlIiwgInNlZ21lbnRlZFRleHR1cmVkIik7Ci0gICAgICAgIHBpeGVsUGVyZmVjdFZpZXdCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uc2VnbWVudFBvc2l0aW9uIiwgImxhc3QiKTsKLSAgICAgICAgcGl4ZWxQZXJmZWN0Vmlld0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZVBpeGVsUGVyZmVjdFZpZXcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyb3VwLmFkZChwaXhlbFBlcmZlY3RWaWV3QnV0dG9uKTsKLSAgICAgICAgbGVmdFNpZGUuYWRkKHBpeGVsUGVyZmVjdFZpZXdCdXR0b24pOwotCi0gICAgICAgIGdyYXBoVmlld0J1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgICAgICBmaWx0ZXJUZXh0ID0gbmV3IEpUZXh0RmllbGQoMjApOwotICAgICAgICBmaWx0ZXJUZXh0LnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIGZpbHRlclRleHQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKG5ldyBEb2N1bWVudExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXIoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbHRlckxhYmVsID0gbmV3IEpMYWJlbCgiRmlsdGVyIGJ5IGNsYXNzIG9yIGlkOiIpOwotICAgICAgICBmaWx0ZXJMYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCA2LCAwLCA2KSk7Ci0KLSAgICAgICAgbGVmdFNpZGUuYWRkKGZpbHRlckxhYmVsKTsKLSAgICAgICAgbGVmdFNpZGUuYWRkKGZpbHRlclRleHQpOwotCi0gICAgICAgIG1pblpvb21MYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbWluWm9vbUxhYmVsLnNldFRleHQoIjIwJSIpOwotICAgICAgICBtaW5ab29tTGFiZWwucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLCAic21hbGwiKTsKLSAgICAgICAgbWluWm9vbUxhYmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDEyLCAwLCAwKSk7Ci0gICAgICAgIGxlZnRTaWRlLmFkZChtaW5ab29tTGFiZWwpOwotCi0gICAgICAgIHpvb21TbGlkZXIgPSBuZXcgSlNsaWRlcigpOwotICAgICAgICB6b29tU2xpZGVyLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgInNtYWxsIik7Ci0gICAgICAgIHpvb21TbGlkZXIuc2V0TWF4aW11bSgyMDApOwotICAgICAgICB6b29tU2xpZGVyLnNldE1pbmltdW0oMjApOwotICAgICAgICB6b29tU2xpZGVyLnNldFZhbHVlKDEwMCk7Ci0gICAgICAgIHpvb21TbGlkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IENoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHpvb21TbGlkZXJTdGF0ZUNoYW5nZWQoZXZ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGxlZnRTaWRlLmFkZCh6b29tU2xpZGVyKTsKLQotICAgICAgICBtYXhab29tTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0gICAgICAgIG1heFpvb21MYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBtYXhab29tTGFiZWwuc2V0VGV4dCgiMjAwJSIpOwotICAgICAgICBsZWZ0U2lkZS5hZGQobWF4Wm9vbUxhYmVsKTsKLQotICAgICAgICB2aWV3Q291bnRMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgdmlld0NvdW50TGFiZWwuc2V0VGV4dCgiMCB2aWV3cyIpOwotICAgICAgICB2aWV3Q291bnRMYWJlbC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICB2aWV3Q291bnRMYWJlbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAxMiwgMCwgMCkpOwotICAgICAgICBsZWZ0U2lkZS5hZGQodmlld0NvdW50TGFiZWwpOwotCi0gICAgICAgIHN0YXR1c1BhbmVsLmFkZChsZWZ0U2lkZSwgQm9yZGVyTGF5b3V0LkxJTkVfU1RBUlQpOwotCi0gICAgICAgIEpQYW5lbCByaWdodFNpZGUgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIHJpZ2h0U2lkZS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCAwLCAxMikpOwotICAgICAgICByaWdodFNpZGUuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKLQotICAgICAgICBwcm9ncmVzcyA9IG5ldyBKUHJvZ3Jlc3NCYXIoKTsKLSAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHByb2dyZXNzLnNldEluZGV0ZXJtaW5hdGUodHJ1ZSk7Ci0gICAgICAgIHByb2dyZXNzLnB1dENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiwgIm1pbmkiKTsKLSAgICAgICAgcHJvZ3Jlc3MucHV0Q2xpZW50UHJvcGVydHkoIkpQcm9ncmVzc0Jhci5zdHlsZSIsICJjaXJjdWxhciIpOwotICAgICAgICByaWdodFNpZGUuYWRkKHByb2dyZXNzKTsKLQotICAgICAgICBzdGF0dXNQYW5lbC5hZGQocmlnaHRTaWRlLCBCb3JkZXJMYXlvdXQuTElORV9FTkQpOwotCi0gICAgICAgIGhpZGVTdGF0dXNCYXJDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1c1BhbmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoaWRlU3RhdHVzQmFyQ29tcG9uZW50cygpIHsKLSAgICAgICAgdmlld0NvdW50TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHpvb21TbGlkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIG1pblpvb21MYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbWF4Wm9vbUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgZmlsdGVyVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpUb29sQmFyIGJ1aWxkVG9vbEJhcigpIHsKLSAgICAgICAgSlRvb2xCYXIgdG9vbEJhciA9IG5ldyBKVG9vbEJhcigpOwotICAgICAgICB0b29sQmFyLnNldEZsb2F0YWJsZShmYWxzZSk7Ci0gICAgICAgIHRvb2xCYXIuc2V0Um9sbG92ZXIodHJ1ZSk7Ci0KLSAgICAgICAgc3RhcnRCdXR0b24gPSBuZXcgSkJ1dHRvbigpOwotICAgICAgICBzdGFydEJ1dHRvbi5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoU3RhcnRTZXJ2ZXJBY3Rpb24uQUNUSU9OX05BTUUpKTsKLSAgICAgICAgc3RhcnRCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uYnV0dG9uVHlwZSIsICJzZWdtZW50ZWRUZXh0dXJlZCIpOwotICAgICAgICBzdGFydEJ1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5zZWdtZW50UG9zaXRpb24iLCAiZmlyc3QiKTsKLSAgICAgICAgdG9vbEJhci5hZGQoc3RhcnRCdXR0b24pOwotCi0gICAgICAgIHN0b3BCdXR0b24gPSBuZXcgSkJ1dHRvbigpOwotICAgICAgICBzdG9wQnV0dG9uLnNldEFjdGlvbihhY3Rpb25zTWFwLmdldChTdG9wU2VydmVyQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIHN0b3BCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uYnV0dG9uVHlwZSIsICJzZWdtZW50ZWRUZXh0dXJlZCIpOwotICAgICAgICBzdG9wQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLnNlZ21lbnRQb3NpdGlvbiIsICJtaWRkbGUiKTsKLSAgICAgICAgdG9vbEJhci5hZGQoc3RvcEJ1dHRvbik7Ci0KLSAgICAgICAgcmVmcmVzaEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KFJlZnJlc2hXaW5kb3dzQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uYnV0dG9uVHlwZSIsICJzZWdtZW50ZWRUZXh0dXJlZCIpOwotICAgICAgICByZWZyZXNoQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLnNlZ21lbnRQb3NpdGlvbiIsICJsYXN0Iik7Ci0gICAgICAgIHRvb2xCYXIuYWRkKHJlZnJlc2hCdXR0b24pOwotCi0gICAgICAgIHNob3dEZXZpY2VzQnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgc2hvd0RldmljZXNCdXR0b24uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KFNob3dEZXZpY2VzQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIHNob3dEZXZpY2VzQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgc2hvd0RldmljZXNCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uc2VnbWVudFBvc2l0aW9uIiwgImZpcnN0Iik7Ci0gICAgICAgIHRvb2xCYXIuYWRkKHNob3dEZXZpY2VzQnV0dG9uKTsKLSAgICAgICAgc2hvd0RldmljZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgbG9hZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KExvYWRHcmFwaEFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBsb2FkQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5zZWdtZW50UG9zaXRpb24iLCAibGFzdCIpOwotICAgICAgICB0b29sQmFyLmFkZChsb2FkQnV0dG9uKTsKLQotICAgICAgICBkaXNwbGF5Tm9kZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGRpc3BsYXlOb2RlQnV0dG9uLnNldEFjdGlvbihhY3Rpb25zTWFwLmdldChDYXB0dXJlTm9kZUFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBkaXNwbGF5Tm9kZUJ1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5idXR0b25UeXBlIiwgInNlZ21lbnRlZFRleHR1cmVkIik7Ci0gICAgICAgIGRpc3BsYXlOb2RlQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLnNlZ21lbnRQb3NpdGlvbiIsICJmaXJzdCIpOwotICAgICAgICB0b29sQmFyLmFkZChkaXNwbGF5Tm9kZUJ1dHRvbik7Ci0KLSAgICAgICAgaW52YWxpZGF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGludmFsaWRhdGVCdXR0b24uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KEludmFsaWRhdGVBY3Rpb24uQUNUSU9OX05BTUUpKTsKLSAgICAgICAgaW52YWxpZGF0ZUJ1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5idXR0b25UeXBlIiwgInNlZ21lbnRlZFRleHR1cmVkIik7Ci0gICAgICAgIGludmFsaWRhdGVCdXR0b24ucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uc2VnbWVudFBvc2l0aW9uIiwgIm1pZGRsZSIpOwotICAgICAgICB0b29sQmFyLmFkZChpbnZhbGlkYXRlQnV0dG9uKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0QnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgcmVxdWVzdExheW91dEJ1dHRvbi5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoUmVxdWVzdExheW91dEFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICByZXF1ZXN0TGF5b3V0QnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgcmVxdWVzdExheW91dEJ1dHRvbi5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5zZWdtZW50UG9zaXRpb24iLCAibGFzdCIpOwotICAgICAgICB0b29sQmFyLmFkZChyZXF1ZXN0TGF5b3V0QnV0dG9uKTsKLQotICAgICAgICByZXR1cm4gdG9vbEJhcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpNZW51QmFyIGJ1aWxkTWVudUJhcigpIHsKLSAgICAgICAgSk1lbnVCYXIgbWVudUJhciA9IG5ldyBKTWVudUJhcigpOwotCi0gICAgICAgIEpNZW51IGZpbGVNZW51ID0gbmV3IEpNZW51KCk7Ci0gICAgICAgIEpNZW51IHZpZXdNZW51ID0gbmV3IEpNZW51KCk7Ci0gICAgICAgIEpNZW51IHZpZXdIaWVyYXJjaHlNZW51ID0gbmV3IEpNZW51KCk7Ci0gICAgICAgIEpNZW51IHNlcnZlck1lbnUgPSBuZXcgSk1lbnUoKTsKLQotICAgICAgICBzYXZlTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIEpNZW51SXRlbSBleGl0TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0KLSAgICAgICAgc2hvd0RldmljZXNNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLQotICAgICAgICBsb2FkTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0KLSAgICAgICAgc3RhcnRNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLSAgICAgICAgc3RvcE1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgpOwotCi0gICAgICAgIGZpbGVNZW51LnNldFRleHQoIkZpbGUiKTsKLQotICAgICAgICBzYXZlTWVudUl0ZW0uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KFNhdmVTY2VuZUFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBmaWxlTWVudS5hZGQoc2F2ZU1lbnVJdGVtKTsKLQotICAgICAgICBleGl0TWVudUl0ZW0uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KEV4aXRBY3Rpb24uQUNUSU9OX05BTUUpKTsKLSAgICAgICAgZmlsZU1lbnUuYWRkKGV4aXRNZW51SXRlbSk7Ci0KLSAgICAgICAgbWVudUJhci5hZGQoZmlsZU1lbnUpOwotCi0gICAgICAgIHZpZXdNZW51LnNldFRleHQoIlZpZXciKTsKLQotICAgICAgICBzaG93RGV2aWNlc01lbnVJdGVtLnNldEFjdGlvbihhY3Rpb25zTWFwLmdldChTaG93RGV2aWNlc0FjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBzaG93RGV2aWNlc01lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB2aWV3TWVudS5hZGQoc2hvd0RldmljZXNNZW51SXRlbSk7Ci0KLSAgICAgICAgbWVudUJhci5hZGQodmlld01lbnUpOwotCi0gICAgICAgIHZpZXdIaWVyYXJjaHlNZW51LnNldFRleHQoIkhpZXJhcmNoeSIpOwotCi0gICAgICAgIGxvYWRNZW51SXRlbS5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoTG9hZEdyYXBoQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIHZpZXdIaWVyYXJjaHlNZW51LmFkZChsb2FkTWVudUl0ZW0pOwotCi0gICAgICAgIG1lbnVCYXIuYWRkKHZpZXdIaWVyYXJjaHlNZW51KTsKLQotICAgICAgICBzZXJ2ZXJNZW51LnNldFRleHQoIlNlcnZlciIpOwotCi0gICAgICAgIHN0YXJ0TWVudUl0ZW0uc2V0QWN0aW9uKGFjdGlvbnNNYXAuZ2V0KFN0YXJ0U2VydmVyQWN0aW9uLkFDVElPTl9OQU1FKSk7Ci0gICAgICAgIHNlcnZlck1lbnUuYWRkKHN0YXJ0TWVudUl0ZW0pOwotCi0gICAgICAgIHN0b3BNZW51SXRlbS5zZXRBY3Rpb24oYWN0aW9uc01hcC5nZXQoU3RvcFNlcnZlckFjdGlvbi5BQ1RJT05fTkFNRSkpOwotICAgICAgICBzZXJ2ZXJNZW51LmFkZChzdG9wTWVudUl0ZW0pOwotCi0gICAgICAgIG1lbnVCYXIuYWRkKHNlcnZlck1lbnUpOwotCi0gICAgICAgIHJldHVybiBtZW51QmFyOwotICAgIH0KLQotICAgIHByaXZhdGUgSkNvbXBvbmVudCBidWlsZFBpeGVsUGVyZmVjdFBhbmVsKCkgewotICAgICAgICBKU3BsaXRQYW5lIHNwbGl0dGVyID0gbmV3IEpTcGxpdFBhbmUoSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKTsKLQotICAgICAgICBwaXhlbFBlcmZlY3RUcmVlID0gbmV3IEpUcmVlKG5ldyBPYmplY3RbMF0pOwotICAgICAgICBwaXhlbFBlcmZlY3RUcmVlLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgcGl4ZWxQZXJmZWN0VHJlZS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig2LCA2LCA2LCA2KSk7Ci0gICAgICAgIHBpeGVsUGVyZmVjdFRyZWUuYWRkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKG5ldyBUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVHJlZVNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgVmlld05vZGUgbm9kZSA9IChWaWV3Tm9kZSkgZXZlbnQuZ2V0UGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgICAgc2NyZWVuVmlld2VyLnNlbGVjdChub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgSlNjcm9sbFBhbmUgc2Nyb2xsZXIgPSBuZXcgSlNjcm9sbFBhbmUocGl4ZWxQZXJmZWN0VHJlZSk7Ci0gICAgICAgIHNjcm9sbGVyLnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgc2Nyb2xsZXIuZ2V0Vmlld3BvcnQoKS5zZXRCb3JkZXIobnVsbCk7Ci0KLSAgICAgICAgc3BsaXR0ZXIuc2V0Q29udGludW91c0xheW91dCh0cnVlKTsKLSAgICAgICAgc3BsaXR0ZXIuc2V0TGVmdENvbXBvbmVudChzY3JvbGxlcik7Ci0gICAgICAgIHNwbGl0dGVyLnNldFJpZ2h0Q29tcG9uZW50KGJ1aWxkUGl4ZWxQZXJmZWN0Vmlld2VyKHNwbGl0dGVyKSk7Ci0gICAgICAgIHNwbGl0dGVyLnNldEJvcmRlcihudWxsKTsKLQotICAgICAgICBpZiAoT1MuaXNNYWNPc1goKSAmJiBPUy5pc0xlb3BhcmRPckxhdGVyKCkpIHsKLSAgICAgICAgICAgIHNwbGl0dGVyLnNldEJvcmRlcihuZXcgVW5pZmllZENvbnRlbnRCb3JkZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3BsaXR0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKQ29tcG9uZW50IGJ1aWxkUGl4ZWxQZXJmZWN0Vmlld2VyKEpTcGxpdFBhbmUgc3BsaXR0ZXIpIHsKLSAgICAgICAgc2NyZWVuVmlld2VyID0gbmV3IFNjcmVlblZpZXdlcih0aGlzLCBjdXJyZW50RGV2aWNlLCBzcGxpdHRlci5nZXREaXZpZGVyU2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIHNjcmVlblZpZXdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlR3JhcGhWaWV3KCkgewotICAgICAgICBzaG93U3RhdHVzQmFyQ29tcG9uZW50cygpOwotCi0gICAgICAgIHNjcmVlblZpZXdlci5zdG9wKCk7Ci0gICAgICAgIG1haW5QYW5lbC5yZW1vdmUocGl4ZWxQZXJmZWN0UGFuZWwpOwotICAgICAgICBtYWluUGFuZWwuYWRkKG1haW5TcGxpdHRlciwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgcmVwYWludCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93U3RhdHVzQmFyQ29tcG9uZW50cygpIHsKLSAgICAgICAgdmlld0NvdW50TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgem9vbVNsaWRlci5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBtaW5ab29tTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbWF4Wm9vbUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGZpbHRlckxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGZpbHRlclRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlUGl4ZWxQZXJmZWN0VmlldygpIHsKLSAgICAgICAgaWYgKHBpeGVsUGVyZmVjdFBhbmVsID09IG51bGwpIHsKLSAgICAgICAgICAgIHBpeGVsUGVyZmVjdFBhbmVsID0gYnVpbGRQaXhlbFBlcmZlY3RQYW5lbCgpOwotICAgICAgICAgICAgc2hvd1BpeGVsUGVyZmVjdFRyZWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNjcmVlblZpZXdlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGlkZVN0YXR1c0JhckNvbXBvbmVudHMoKTsKLQotICAgICAgICBtYWluUGFuZWwucmVtb3ZlKG1haW5TcGxpdHRlcik7Ci0gICAgICAgIG1haW5QYW5lbC5hZGQocGl4ZWxQZXJmZWN0UGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgem9vbVNsaWRlclN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldnQpIHsKLSAgICAgICAgSlNsaWRlciBzbGlkZXIgPSAoSlNsaWRlcikgZXZ0LmdldFNvdXJjZSgpOwotICAgICAgICBpZiAoc2NlbmVWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjZW5lLnNldFpvb21GYWN0b3Ioc2xpZGVyLmdldFZhbHVlKCkgLyAxMDAuMGQpOwotICAgICAgICAgICAgc2NlbmVWaWV3LnJlcGFpbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93UHJvcGVydGllcyhWaWV3Tm9kZSBub2RlKSB7Ci0gICAgICAgIHByb3BlcnRpZXNUYWJsZS5zZXRNb2RlbChuZXcgUHJvcGVydGllc1RhYmxlTW9kZWwobm9kZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9maWxlcyhkb3VibGVbXSBwcm9maWxlcykgewotICAgICAgICBwcm9maWxpbmdUYWJsZS5zZXRNb2RlbChuZXcgUHJvZmlsZXNUYWJsZU1vZGVsKHByb2ZpbGVzKSk7Ci0gICAgICAgIHNldFZpc2libGVSb3dDb3VudChwcm9maWxpbmdUYWJsZSwgcHJvZmlsZXMubGVuZ3RoICsgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZpc2libGVSb3dDb3VudChKVGFibGUgdGFibGUsIGludCByb3dzKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykgewotICAgICAgICAgICAgaGVpZ2h0ICs9IHRhYmxlLmdldFJvd0hlaWdodChyb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHRhYmxlLmdldFByZWZlcnJlZFNjcm9sbGFibGVWaWV3cG9ydFNpemUoKS53aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgdGFibGUuc2V0UHJlZmVycmVkU2Nyb2xsYWJsZVZpZXdwb3J0U2l6ZShzaXplKTsKLSAgICAgICAgdGFibGUucmV2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93UGl4ZWxQZXJmZWN0VHJlZSgpIHsKLSAgICAgICAgaWYgKHBpeGVsUGVyZmVjdFRyZWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBpeGVsUGVyZmVjdFRyZWUuc2V0TW9kZWwobmV3IFZpZXdzVHJlZU1vZGVsKHNjZW5lLmdldFJvb3QoKSkpOwotICAgICAgICBwaXhlbFBlcmZlY3RUcmVlLnNldENlbGxSZW5kZXJlcihuZXcgVmlld3NUcmVlQ2VsbFJlbmRlcmVyKCkpOwotICAgICAgICBleHBhbmRBbGwocGl4ZWxQZXJmZWN0VHJlZSwgdHJ1ZSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4cGFuZEFsbChKVHJlZSB0cmVlLCBib29sZWFuIGV4cGFuZCkgewotICAgICAgICBWaWV3Tm9kZSByb290ID0gKFZpZXdOb2RlKSB0cmVlLmdldE1vZGVsKCkuZ2V0Um9vdCgpOwotICAgICAgICBleHBhbmRBbGwodHJlZSwgbmV3IFRyZWVQYXRoKHJvb3QpLCBleHBhbmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXhwYW5kQWxsKEpUcmVlIHRyZWUsIFRyZWVQYXRoIHBhcmVudCwgYm9vbGVhbiBleHBhbmQpIHsKLSAgICAgICAgLy8gVHJhdmVyc2UgY2hpbGRyZW4KLSAgICAgICAgVmlld05vZGUgbm9kZSA9IChWaWV3Tm9kZSlwYXJlbnQuZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKLSAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChWaWV3Tm9kZSBuIDogbm9kZS5jaGlsZHJlbikgewotICAgICAgICAgICAgICAgIFRyZWVQYXRoIHBhdGggPSBwYXJlbnQucGF0aEJ5QWRkaW5nQ2hpbGQobik7Ci0gICAgICAgICAgICAgICAgZXhwYW5kQWxsKHRyZWUsIHBhdGgsIGV4cGFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwYW5kKSB7Ci0gICAgICAgICAgICB0cmVlLmV4cGFuZFBhdGgocGFyZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyZWUuY29sbGFwc2VQYXRoKHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGgoVmlld0hpZXJhcmNoeVNjZW5lIHNjZW5lKSB7Ci0gICAgICAgIHNjZW5lLmFkZE9iamVjdFNjZW5lTGlzdGVuZXIobmV3IFNjZW5lRm9jdXNMaXN0ZW5lcigpLAotICAgICAgICAgICAgICAgIE9iamVjdFNjZW5lRXZlbnRUeXBlLk9CSkVDVF9GT0NVU19DSEFOR0VEKTsKLQotICAgICAgICBpZiAobWFpblNwbGl0dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1haW5QYW5lbC5yZW1vdmUoZGV2aWNlU2VsZWN0b3IpOwotICAgICAgICAgICAgbWFpblBhbmVsLmFkZChidWlsZEdyYXBoUGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgICAgICBzaG93RGV2aWNlc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2hvd0RldmljZXNNZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgZ3JhcGhWaWV3QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBwaXhlbFBlcmZlY3RWaWV3QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNob3dTdGF0dXNCYXJDb21wb25lbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzY2VuZVZpZXcgPSBzY2VuZS5jcmVhdGVWaWV3KCk7Ci0gICAgICAgIHNjZW5lVmlldy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBOb2RlQ2xpY2tMaXN0ZW5lcigpKTsKLSAgICAgICAgc2NlbmVWaWV3LmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihuZXcgV2hlZWxab29tTGlzdGVuZXIoKSk7Ci0gICAgICAgIHNjZW5lU2Nyb2xsZXIuc2V0Vmlld3BvcnRWaWV3KHNjZW5lVmlldyk7Ci0KLSAgICAgICAgaWYgKGV4dHJhc1BhbmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNpZGVTcGxpdHRlci5yZW1vdmUoZXh0cmFzUGFuZWwpOwotICAgICAgICB9Ci0gICAgICAgIHNpZGVTcGxpdHRlci5zZXRCb3R0b21Db21wb25lbnQoYnVpbGRFeHRyYXNQYW5lbCgpKTsKLQotICAgICAgICBtYWluU3BsaXR0ZXIuc2V0RGl2aWRlckxvY2F0aW9uKGdldFdpZHRoKCkgLSBtYWluU3BsaXR0ZXIuZ2V0RGl2aWRlclNpemUoKSAtCi0gICAgICAgICAgICAgICAgYnV0dG9uc1BhbmVsLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCk7Ci0KLSAgICAgICAgc2F2ZU1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNob3dQaXhlbFBlcmZlY3RUcmVlKCk7Ci0KLSAgICAgICAgdXBkYXRlU3RhdHVzKCk7Ci0gICAgICAgIGxheW91dFNjZW5lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxheW91dFNjZW5lKCkgewotICAgICAgICBUcmVlR3JhcGhMYXlvdXQ8Vmlld05vZGUsIFN0cmluZz4gbGF5b3V0ID0KLSAgICAgICAgICAgICAgICBuZXcgVHJlZUdyYXBoTGF5b3V0PFZpZXdOb2RlLCBTdHJpbmc+KHNjZW5lLCA1MCwgNTAsIDcwLCAzMCwgdHJ1ZSk7Ci0gICAgICAgIGxheW91dC5sYXlvdXQoc2NlbmUuZ2V0Um9vdCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotICAgICAgICB2aWV3Q291bnRMYWJlbC5zZXRUZXh0KCIiICsgc2NlbmUuZ2V0Tm9kZXMoKS5zaXplKCkgKyAiIHZpZXdzIik7Ci0gICAgICAgIHpvb21TbGlkZXIuc2V0RW5hYmxlZChzY2VuZS5nZXROb2RlcygpLnNpemUoKSA+IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgSlBhbmVsIGJ1aWxkRXh0cmFzUGFuZWwoKSB7Ci0gICAgICAgIGV4dHJhc1BhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBKU2Nyb2xsUGFuZSBwID0gbmV3IEpTY3JvbGxQYW5lKGxheW91dFZpZXcgPSBuZXcgTGF5b3V0UmVuZGVyZXIoc2NlbmUsIHNjZW5lVmlldykpOwotICAgICAgICBKU2Nyb2xsQmFyIGIgPSBwLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCk7Ci0gICAgICAgIGIuc2V0VW5pdEluY3JlbWVudCgxMCk7Ci0gICAgICAgIGV4dHJhc1BhbmVsLmFkZChwKTsKLSAgICAgICAgZXh0cmFzUGFuZWwuYWRkKHNjZW5lLmNyZWF0ZVNhdGVsbGl0ZVZpZXcoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICAgICAgZXh0cmFzUGFuZWwuYWRkKGJ1aWxkTGF5b3V0Vmlld0NvbnRyb2xCdXR0b25zKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0gICAgICAgIHJldHVybiBleHRyYXNQYW5lbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpDb21wb25lbnQgYnVpbGRMYXlvdXRWaWV3Q29udHJvbEJ1dHRvbnMoKSB7Ci0gICAgICAgIGJ1dHRvbnNQYW5lbCA9IG5ldyBKVG9vbEJhcigpOwotICAgICAgICBidXR0b25zUGFuZWwuc2V0RmxvYXRhYmxlKGZhbHNlKTsKLQotICAgICAgICBCdXR0b25Hcm91cCBncm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0gICAgICAgIEpUb2dnbGVCdXR0b24gd2hpdGUgPSBuZXcgSlRvZ2dsZUJ1dHRvbigiT24gV2hpdGUiKTsKLSAgICAgICAgdG9nZ2xlQ29sb3JPblNlbGVjdCh3aGl0ZSk7Ci0gICAgICAgIHdoaXRlLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgd2hpdGUucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uc2VnbWVudFBvc2l0aW9uIiwgImZpcnN0Iik7Ci0gICAgICAgIHdoaXRlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0Vmlldy5zZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgICAgICBsYXlvdXRWaWV3LnNldEZvcmVncm91bmQoQ29sb3IuQkxBQ0spOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JvdXAuYWRkKHdoaXRlKTsKLSAgICAgICAgYnV0dG9uc1BhbmVsLmFkZCh3aGl0ZSk7Ci0KLSAgICAgICAgSlRvZ2dsZUJ1dHRvbiBibGFjayA9IG5ldyBKVG9nZ2xlQnV0dG9uKCJPbiBCbGFjayIpOwotICAgICAgICB0b2dnbGVDb2xvck9uU2VsZWN0KGJsYWNrKTsKLSAgICAgICAgYmxhY2sucHV0Q2xpZW50UHJvcGVydHkoIkpCdXR0b24uYnV0dG9uVHlwZSIsICJzZWdtZW50ZWRUZXh0dXJlZCIpOwotICAgICAgICBibGFjay5wdXRDbGllbnRQcm9wZXJ0eSgiSkJ1dHRvbi5zZWdtZW50UG9zaXRpb24iLCAibGFzdCIpOwotICAgICAgICBibGFjay5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGxheW91dFZpZXcuc2V0QmFja2dyb3VuZChDb2xvci5CTEFDSyk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0Vmlldy5zZXRGb3JlZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyb3VwLmFkZChibGFjayk7Ci0gICAgICAgIGJ1dHRvbnNQYW5lbC5hZGQoYmxhY2spOwotCi0gICAgICAgIGJsYWNrLnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgICAgIEpDaGVja0JveCBzaG93RXh0cmFzID0gbmV3IEpDaGVja0JveCgiU2hvdyBFeHRyYXMiKTsKLSAgICAgICAgc2hvd0V4dHJhcy5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbXBvbmVudC5zaXplVmFyaWFudCIsICJzbWFsbCIpOwotICAgICAgICBzaG93RXh0cmFzLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0Vmlldy5zZXRTaG93RXh0cmFzKCgoSkNoZWNrQm94KSBlLmdldFNvdXJjZSgpKS5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYnV0dG9uc1BhbmVsLmFkZChzaG93RXh0cmFzKTsKLQotICAgICAgICByZXR1cm4gYnV0dG9uc1BhbmVsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q2FwdHVyZVdpbmRvdyhWaWV3Tm9kZSBub2RlLCBTdHJpbmcgY2FwdHVyZVBhcmFtcywgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxheW91dFZpZXcucmVwYWludCgpOwotCi0gICAgICAgICAgICBKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKGNhcHR1cmVQYXJhbXMpOwotICAgICAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCi0gICAgICAgICAgICBmaW5hbCBDYXB0dXJlUmVuZGVyZXIgbGFiZWwgPSBuZXcgQ2FwdHVyZVJlbmRlcmVyKG5ldyBJbWFnZUljb24oaW1hZ2UpLCBub2RlKTsKLSAgICAgICAgICAgIGxhYmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDI0LCAyNCwgMjQsIDI0KSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpQYW5lbCBzb2xpZENvbG9yID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgc29saWRDb2xvci5zZXRCYWNrZ3JvdW5kKENvbG9yLkJMQUNLKTsKLSAgICAgICAgICAgIHNvbGlkQ29sb3IuYWRkKGxhYmVsKTsKLQotICAgICAgICAgICAgSlRvb2xCYXIgdG9vbEJhciA9IG5ldyBKVG9vbEJhcigpOwotICAgICAgICAgICAgdG9vbEJhci5zZXRGbG9hdGFibGUoZmFsc2UpOwotCi0gICAgICAgICAgICBCdXR0b25Hcm91cCBncm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0gICAgICAgICAgICBKVG9nZ2xlQnV0dG9uIHdoaXRlID0gbmV3IEpUb2dnbGVCdXR0b24oIk9uIFdoaXRlIik7Ci0gICAgICAgICAgICB0b2dnbGVDb2xvck9uU2VsZWN0KHdoaXRlKTsKLSAgICAgICAgICAgIHdoaXRlLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgICAgIHdoaXRlLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLnNlZ21lbnRQb3NpdGlvbiIsICJmaXJzdCIpOwotICAgICAgICAgICAgd2hpdGUuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvbGlkQ29sb3Iuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncm91cC5hZGQod2hpdGUpOwotICAgICAgICAgICAgdG9vbEJhci5hZGQod2hpdGUpOwotCi0gICAgICAgICAgICBKVG9nZ2xlQnV0dG9uIGJsYWNrID0gbmV3IEpUb2dnbGVCdXR0b24oIk9uIEJsYWNrIik7Ci0gICAgICAgICAgICB0b2dnbGVDb2xvck9uU2VsZWN0KGJsYWNrKTsKLSAgICAgICAgICAgIGJsYWNrLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLmJ1dHRvblR5cGUiLCAic2VnbWVudGVkVGV4dHVyZWQiKTsKLSAgICAgICAgICAgIGJsYWNrLnB1dENsaWVudFByb3BlcnR5KCJKQnV0dG9uLnNlZ21lbnRQb3NpdGlvbiIsICJsYXN0Iik7Ci0gICAgICAgICAgICBibGFjay5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc29saWRDb2xvci5zZXRCYWNrZ3JvdW5kKENvbG9yLkJMQUNLKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGdyb3VwLmFkZChibGFjayk7Ci0gICAgICAgICAgICB0b29sQmFyLmFkZChibGFjayk7Ci0KLSAgICAgICAgICAgIGJsYWNrLnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgICAgICAgICBKQ2hlY2tCb3ggc2hvd0V4dHJhcyA9IG5ldyBKQ2hlY2tCb3goIlNob3cgRXh0cmFzIik7Ci0gICAgICAgICAgICBzaG93RXh0cmFzLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBsYWJlbC5zZXRTaG93RXh0cmFzKCgoSkNoZWNrQm94KSBlLmdldFNvdXJjZSgpKS5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdG9vbEJhci5hZGQoc2hvd0V4dHJhcyk7Ci0KLSAgICAgICAgICAgIHBhbmVsLmFkZCh0b29sQmFyLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotICAgICAgICAgICAgcGFuZWwuYWRkKHNvbGlkQ29sb3IpOwotICAgICAgICAgICAgZnJhbWUuYWRkKHBhbmVsKTsKLQotICAgICAgICAgICAgZnJhbWUucGFjaygpOwotICAgICAgICAgICAgZnJhbWUuc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIGZyYW1lLnNldExvY2F0aW9uUmVsYXRpdmVUbyhXb3Jrc3BhY2UudGhpcyk7Ci0gICAgICAgICAgICBmcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotICAgICAgICBjdXJyZW50RGV2aWNlID0gbnVsbDsKLSAgICAgICAgY3VycmVudFdpbmRvdyA9IG51bGw7Ci0gICAgICAgIGN1cnJlbnREZXZpY2VDaGFuZ2VkKCk7Ci0gICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5jbGVhcigpOwotCi0gICAgICAgIHNob3dEZXZpY2VzU2VsZWN0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93RGV2aWNlc1NlbGVjdG9yKCkgewotICAgICAgICBpZiAobWFpblNwbGl0dGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwaXhlbFBlcmZlY3RQYW5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2NyZWVuVmlld2VyLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWluUGFuZWwucmVtb3ZlKGdyYXBoVmlld0J1dHRvbi5pc1NlbGVjdGVkKCkgPyBtYWluU3BsaXR0ZXIgOiBwaXhlbFBlcmZlY3RQYW5lbCk7Ci0gICAgICAgICAgICBtYWluUGFuZWwuYWRkKGRldmljZVNlbGVjdG9yLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIHBpeGVsUGVyZmVjdFBhbmVsID0gbWFpblNwbGl0dGVyID0gbnVsbDsKLSAgICAgICAgICAgIGdyYXBoVmlld0J1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgICAgICAgICAgaGlkZVN0YXR1c0JhckNvbXBvbmVudHMoKTsKLQotICAgICAgICAgICAgc2F2ZU1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2hvd0RldmljZXNNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNob3dEZXZpY2VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZGlzcGxheU5vZGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGdyYXBoVmlld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHBpeGVsUGVyZmVjdFZpZXdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIURldmljZUJyaWRnZS5pc1ZpZXdTZXJ2ZXJSdW5uaW5nKGN1cnJlbnREZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERldmljZUJyaWRnZS5zdGFydFZpZXdTZXJ2ZXIoY3VycmVudERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRXaW5kb3dzKCkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXBhaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3VycmVudERldmljZUNoYW5nZWQoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50RGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc3RhcnRNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHN0b3BCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdG9wTWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2F2ZU1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGRpc3BsYXlOb2RlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGdyYXBoVmlld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHBpeGVsUGVyZmVjdFZpZXdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbG9hZE1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9hZE1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjaGVja0ZvclNlcnZlck9uQ3VycmVudERldmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU2VydmVyT25DdXJyZW50RGV2aWNlKCkgewotICAgICAgICBpZiAoRGV2aWNlQnJpZGdlLmlzVmlld1NlcnZlclJ1bm5pbmcoY3VycmVudERldmljZSkpIHsKLSAgICAgICAgICAgIHN0YXJ0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc3RhcnRNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHN0b3BCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0b3BNZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0YXJ0TWVudUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0b3BCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdG9wTWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBsb2FkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXBEZXZpY2VzKCkgewotICAgICAgICBmb3IgKElEZXZpY2UgZGV2aWNlIDogZGV2aWNlc1RhYmxlTW9kZWwuZ2V0RGV2aWNlcygpKSB7Ci0gICAgICAgICAgICBEZXZpY2VCcmlkZ2UucmVtb3ZlRGV2aWNlRm9yd2FyZChkZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b2dnbGVDb2xvck9uU2VsZWN0KEpUb2dnbGVCdXR0b24gYnV0dG9uKSB7Ci0gICAgICAgIGlmICghT1MuaXNNYWNPc1goKSB8fCAhT1MuaXNMZW9wYXJkT3JMYXRlcigpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBidXR0b24uYWRkQ2hhbmdlTGlzdGVuZXIobmV3IENoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSlRvZ2dsZUJ1dHRvbiBidXR0b24gPSAoSlRvZ2dsZUJ1dHRvbikgZXZlbnQuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1dHRvbi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEZvcmVncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRGb3JlZ3JvdW5kKENvbG9yLkJMQUNLKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGaWx0ZXIoRG9jdW1lbnRFdmVudCBlKSB7Ci0gICAgICAgIGZpbmFsIERvY3VtZW50IGRvY3VtZW50ID0gZS5nZXREb2N1bWVudCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXBkYXRlRmlsdGVyZWROb2Rlcyhkb2N1bWVudC5nZXRUZXh0KDAsIGRvY3VtZW50LmdldExlbmd0aCgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGaWx0ZXJlZE5vZGVzKFN0cmluZyBmaWx0ZXJUZXh0KSB7Ci0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHJvb3QgPSBzY2VuZS5nZXRSb290KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoZmlsdGVyVGV4dCwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLSAgICAgICAgICAgIGZpbHRlck5vZGVzKHBhdHRlcm4sIHJvb3QpOwotICAgICAgICB9IGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZpbHRlck5vZGVzKG51bGwsIHJvb3QpOwotICAgICAgICB9Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsdGVyTm9kZXMoUGF0dGVybiBwYXR0ZXJuLCBWaWV3Tm9kZSByb290KSB7Ci0gICAgICAgIHJvb3QuZmlsdGVyKHBhdHRlcm4pOwotCi0gICAgICAgIGZvciAoVmlld05vZGUgbm9kZSA6IHJvb3QuY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGZpbHRlck5vZGVzKHBhdHRlcm4sIG5vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW5UYXNrKCkgewotICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFRhc2soKSB7Ci0gICAgICAgIHByb2dyZXNzLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTd2luZ1dvcmtlcjw/LCA/PiBzaG93Tm9kZUNhcHR1cmUoKSB7Ci0gICAgICAgIGlmIChzY2VuZS5nZXRGb2N1c2VkT2JqZWN0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBDYXB0dXJlTm9kZVRhc2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpbmdXb3JrZXI8PywgPz4gc3RhcnRTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhcnRTZXJ2ZXJUYXNrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN3aW5nV29ya2VyPD8sID8+IHN0b3BTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RvcFNlcnZlclRhc2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpbmdXb3JrZXI8PywgPz4gbG9hZFdpbmRvd3MoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9hZFdpbmRvd3NUYXNrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN3aW5nV29ya2VyPD8sID8+IGxvYWRHcmFwaCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2FkR3JhcGhUYXNrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN3aW5nV29ya2VyPD8sID8+IGludmFsaWRhdGVWaWV3KCkgewotICAgICAgICBpZiAoc2NlbmUuZ2V0Rm9jdXNlZE9iamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW52YWxpZGF0ZVRhc2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpbmdXb3JrZXI8PywgPz4gcmVxdWVzdExheW91dCgpIHsKLSAgICAgICAgaWYgKHNjZW5lLmdldEZvY3VzZWRPYmplY3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RMYXlvdXRUYXNrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN3aW5nV29ya2VyPD8sID8+IHNhdmVTY2VuZUFzSW1hZ2UoKSB7Ci0gICAgICAgIEpGaWxlQ2hvb3NlciBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOwotICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IFBuZ0ZpbGVGaWx0ZXIoKSk7Ci0gICAgICAgIGludCBjaG9pY2UgPSBjaG9vc2VyLnNob3dTYXZlRGlhbG9nKHNjZW5lVmlldyk7Ci0gICAgICAgIGlmIChjaG9pY2UgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVTY2VuZVRhc2soY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgSW52YWxpZGF0ZVRhc2sgZXh0ZW5kcyBTd2luZ1dvcmtlcjxPYmplY3QsIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2FwdHVyZVBhcmFtczsKLQotICAgICAgICBwcml2YXRlIEludmFsaWRhdGVUYXNrKCkgewotICAgICAgICAgICAgY2FwdHVyZVBhcmFtcyA9IHNjZW5lLmdldEZvY3VzZWRPYmplY3QoKS50b1N0cmluZygpOwotICAgICAgICAgICAgYmVnaW5UYXNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQFdvcmtlclRocmVhZAotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBWaWV3TWFuYWdlci5pbnZhbGlkYXRlKGN1cnJlbnREZXZpY2UsIGN1cnJlbnRXaW5kb3csIGNhcHR1cmVQYXJhbXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgIGVuZFRhc2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVxdWVzdExheW91dFRhc2sgZXh0ZW5kcyBTd2luZ1dvcmtlcjxPYmplY3QsIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2FwdHVyZVBhcmFtczsKLQotICAgICAgICBwcml2YXRlIFJlcXVlc3RMYXlvdXRUYXNrKCkgewotICAgICAgICAgICAgY2FwdHVyZVBhcmFtcyA9IHNjZW5lLmdldEZvY3VzZWRPYmplY3QoKS50b1N0cmluZygpOwotICAgICAgICAgICAgYmVnaW5UYXNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQFdvcmtlclRocmVhZAotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBWaWV3TWFuYWdlci5yZXF1ZXN0TGF5b3V0KGN1cnJlbnREZXZpY2UsIGN1cnJlbnRXaW5kb3csIGNhcHR1cmVQYXJhbXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgIGVuZFRhc2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ2FwdHVyZU5vZGVUYXNrIGV4dGVuZHMgU3dpbmdXb3JrZXI8SW1hZ2UsIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2FwdHVyZVBhcmFtczsKLSAgICAgICAgcHJpdmF0ZSBWaWV3Tm9kZSBub2RlOwotCi0gICAgICAgIHByaXZhdGUgQ2FwdHVyZU5vZGVUYXNrKCkgewotICAgICAgICAgICAgbm9kZSA9IChWaWV3Tm9kZSkgc2NlbmUuZ2V0Rm9jdXNlZE9iamVjdCgpOwotICAgICAgICAgICAgY2FwdHVyZVBhcmFtcyA9IG5vZGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGJlZ2luVGFzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIEBXb3JrZXJUaHJlYWQKLSAgICAgICAgcHJvdGVjdGVkIEltYWdlIGRvSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBub2RlLmltYWdlID0gQ2FwdHVyZUxvYWRlci5sb2FkQ2FwdHVyZShjdXJyZW50RGV2aWNlLCBjdXJyZW50V2luZG93LCBjYXB0dXJlUGFyYW1zKTsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmltYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEltYWdlIGltYWdlID0gZ2V0KCk7Ci0gICAgICAgICAgICAgICAgc2hvd0NhcHR1cmVXaW5kb3cobm9kZSwgY2FwdHVyZVBhcmFtcywgaW1hZ2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGVuZFRhc2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTG9hZFdpbmRvd3NUYXNrIGV4dGVuZHMgU3dpbmdXb3JrZXI8V2luZG93W10sIFZvaWQ+IHsKLSAgICAgICAgcHJpdmF0ZSBMb2FkV2luZG93c1Rhc2soKSB7Ci0gICAgICAgICAgICBiZWdpblRhc2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBAV29ya2VyVGhyZWFkCi0gICAgICAgIHByb3RlY3RlZCBXaW5kb3dbXSBkb0luQmFja2dyb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIFdpbmRvd3NMb2FkZXIubG9hZFdpbmRvd3MoY3VycmVudERldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2luZG93c1RhYmxlTW9kZWwuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5hZGRXaW5kb3dzKGdldCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBlbmRUYXNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0YXJ0U2VydmVyVGFzayBleHRlbmRzIFN3aW5nV29ya2VyPE9iamVjdCwgVm9pZD4gewotICAgICAgICBwdWJsaWMgU3RhcnRTZXJ2ZXJUYXNrKCkgewotICAgICAgICAgICAgYmVnaW5UYXNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQFdvcmtlclRocmVhZAotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKCkgewotICAgICAgICAgICAgRGV2aWNlQnJpZGdlLnN0YXJ0Vmlld1NlcnZlcihjdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICBuZXcgTG9hZFdpbmRvd3NUYXNrKCkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgd2luZG93c1RhYmxlTW9kZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNoZWNrRm9yU2VydmVyT25DdXJyZW50RGV2aWNlKCk7Ci0gICAgICAgICAgICBlbmRUYXNrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0b3BTZXJ2ZXJUYXNrIGV4dGVuZHMgU3dpbmdXb3JrZXI8T2JqZWN0LCBWb2lkPiB7Ci0gICAgICAgIHB1YmxpYyBTdG9wU2VydmVyVGFzaygpIHsKLSAgICAgICAgICAgIGJlZ2luVGFzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIEBXb3JrZXJUaHJlYWQKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBkb0luQmFja2dyb3VuZCgpIHsKLSAgICAgICAgICAgIERldmljZUJyaWRnZS5zdG9wVmlld1NlcnZlcihjdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsLmNsZWFyKCk7Ci0gICAgICAgICAgICBjaGVja0ZvclNlcnZlck9uQ3VycmVudERldmljZSgpOwotICAgICAgICAgICAgZW5kVGFzaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2FkR3JhcGhUYXNrIGV4dGVuZHMgU3dpbmdXb3JrZXI8ZG91YmxlW10sIFZvaWQ+IHsKLSAgICAgICAgcHVibGljIExvYWRHcmFwaFRhc2soKSB7Ci0gICAgICAgICAgICBiZWdpblRhc2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBAV29ya2VyVGhyZWFkCi0gICAgICAgIHByb3RlY3RlZCBkb3VibGVbXSBkb0luQmFja2dyb3VuZCgpIHsKLSAgICAgICAgICAgIHNjZW5lID0gVmlld0hpZXJhcmNoeUxvYWRlci5sb2FkU2NlbmUoY3VycmVudERldmljZSwgY3VycmVudFdpbmRvdyk7Ci0gICAgICAgICAgICByZXR1cm4gUHJvZmlsZXNMb2FkZXIubG9hZFByb2ZpbGVzKGN1cnJlbnREZXZpY2UsIGN1cnJlbnRXaW5kb3csCi0gICAgICAgICAgICAgICAgICAgIHNjZW5lLmdldFJvb3QoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjcmVhdGVHcmFwaChzY2VuZSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvZmlsZXMoZ2V0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGVuZFRhc2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2F2ZVNjZW5lVGFzayBleHRlbmRzIFN3aW5nV29ya2VyPE9iamVjdCwgVm9pZD4gewotICAgICAgICBwcml2YXRlIEZpbGUgZmlsZTsKLQotICAgICAgICBwcml2YXRlIFNhdmVTY2VuZVRhc2soRmlsZSBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgYmVnaW5UYXNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQFdvcmtlclRocmVhZAotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKCkgewotICAgICAgICAgICAgaWYgKHNjZW5lVmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKHNjZW5lVmlldy5nZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmVWaWV3LmdldEhlaWdodCgpLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7Ci0gICAgICAgICAgICAgICAgR3JhcGhpY3MyRCBnMiA9IGltYWdlLmNyZWF0ZUdyYXBoaWNzKCk7Ci0gICAgICAgICAgICAgICAgc2NlbmVWaWV3LnBhaW50KGcyKTsKLSAgICAgICAgICAgICAgICBnMi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VJTy53cml0ZShpbWFnZSwgIlBORyIsIGZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7Ci0gICAgICAgICAgICBlbmRUYXNrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNjZW5lRm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIE9iamVjdFNjZW5lTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdEFkZGVkKE9iamVjdFNjZW5lRXZlbnQgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdFJlbW92ZWQoT2JqZWN0U2NlbmVFdmVudCBhcmcwLCBPYmplY3QgYXJnMSkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb2JqZWN0U3RhdGVDaGFuZ2VkKE9iamVjdFNjZW5lRXZlbnQgYXJnMCwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgT2JqZWN0U3RhdGUgYXJnMiwgT2JqZWN0U3RhdGUgYXJnMykgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChPYmplY3RTY2VuZUV2ZW50IGUsIFNldDxPYmplY3Q+IHByZXZpb3VzU2VsZWN0aW9uLAotICAgICAgICAgICAgICAgIFNldDxPYmplY3Q+IG5ld1NlbGVjdGlvbikgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGlnaGxpZ2h0aW5nQ2hhbmdlZChPYmplY3RTY2VuZUV2ZW50IGFyZzAsIFNldDxPYmplY3Q+IGFyZzEsIFNldDxPYmplY3Q+IGFyZzIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhvdmVyQ2hhbmdlZChPYmplY3RTY2VuZUV2ZW50IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZm9jdXNDaGFuZ2VkKE9iamVjdFNjZW5lRXZlbnQgZSwgT2JqZWN0IG9sZEZvY3VzLCBPYmplY3QgbmV3Rm9jdXMpIHsKLSAgICAgICAgICAgIGRpc3BsYXlOb2RlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIFNldDxPYmplY3Q+IHNlbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbi5hZGQobmV3Rm9jdXMpOwotICAgICAgICAgICAgc2NlbmUuc2V0U2VsZWN0ZWRPYmplY3RzKHNlbGVjdGlvbik7Ci0KLSAgICAgICAgICAgIHNob3dQcm9wZXJ0aWVzKChWaWV3Tm9kZSkgbmV3Rm9jdXMpOwotICAgICAgICAgICAgbGF5b3V0Vmlldy5yZXBhaW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE5vZGVDbGlja0xpc3RlbmVyIGV4dGVuZHMgTW91c2VBZGFwdGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldENsaWNrQ291bnQoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgc2hvd05vZGVDYXB0dXJlKCkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBXaGVlbFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlV2hlZWxMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlV2hlZWxNb3ZlZChNb3VzZVdoZWVsRXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKHpvb21TbGlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCB2YWwgPSB6b29tU2xpZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdmFsIC09IGUuZ2V0V2hlZWxSb3RhdGlvbigpICogMTA7Ci0gICAgICAgICAgICAgICAgem9vbVNsaWRlci5zZXRWYWx1ZSh2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlc1RhYmxlTW9kZWwgZXh0ZW5kcyBEZWZhdWx0VGFibGVNb2RlbCBpbXBsZW1lbnRzCi0gICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UuSURldmljZUNoYW5nZUxpc3RlbmVyIHsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJRGV2aWNlPiBkZXZpY2VzOwotCi0gICAgICAgIHByaXZhdGUgRGV2aWNlc1RhYmxlTW9kZWwoKSB7Ci0gICAgICAgICAgICBkZXZpY2VzID0gbmV3IEFycmF5TGlzdDxJRGV2aWNlPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2x1bW4pIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzLmdldChyb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkRldmljZXMiOwotICAgICAgICB9Ci0KLSAgICAgICAgQFdvcmtlclRocmVhZAotICAgICAgICBwdWJsaWMgdm9pZCBkZXZpY2VDb25uZWN0ZWQoZmluYWwgSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIERldmljZUJyaWRnZS5zZXR1cERldmljZUZvcndhcmQoZGV2aWNlKTsKLQotICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAV29ya2VyVGhyZWFkCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldmljZURpc2Nvbm5lY3RlZChmaW5hbCBJRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgRGV2aWNlQnJpZGdlLnJlbW92ZURldmljZUZvcndhcmQoZGV2aWNlKTsKLQotICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZXZpY2UoSURldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIGlmICghZGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlRGV2aWNlKElEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmVxdWFscyhjdXJyZW50RGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLnJlbW92ZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIGZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAV29ya2VyVGhyZWFkCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldmljZUNoYW5nZWQoSURldmljZSBkZXZpY2UsIGludCBjaGFuZ2VNYXNrKSB7Ci0gICAgICAgICAgICBpZiAoKGNoYW5nZU1hc2sgJiBJRGV2aWNlLkNIQU5HRV9TVEFURSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBkZXZpY2UuaXNPbmxpbmUoKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBkZXZpY2Ugc3RhdGUgY2hhbmdlZCBhbmQgaXQncyBub3cgb25saW5lLCB3ZSBzZXQgdXAgaXRzIHBvcnQgZm9yd2FyZGluZy4KLSAgICAgICAgICAgICAgICBEZXZpY2VCcmlkZ2Uuc2V0dXBEZXZpY2VGb3J3YXJkKGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBjdXJyZW50RGV2aWNlICYmIChjaGFuZ2VNYXNrICYgSURldmljZS5DSEFOR0VfQ0xJRU5UX0xJU1QpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2hhbmdlZCBkZXZpY2UgaXMgdGhlIGN1cnJlbnQgb25lIGFuZCB0aGUgY2xpZW50IGxpc3QgY2hhbmdlZCwgd2UgdXBkYXRlCi0gICAgICAgICAgICAgICAgLy8gdGhlIFVJLgotICAgICAgICAgICAgICAgIGxvYWRXaW5kb3dzKCkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgIHdpbmRvd3NUYWJsZU1vZGVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzID09IG51bGwgPyAwIDogZGV2aWNlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSURldmljZSBnZXREZXZpY2UoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXggPCBkZXZpY2VzLnNpemUoKSA/IGRldmljZXMuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSURldmljZVtdIGdldERldmljZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBJRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXaW5kb3dzVGFibGVNb2RlbCBleHRlbmRzIERlZmF1bHRUYWJsZU1vZGVsIHsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8V2luZG93PiB3aW5kb3dzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmlzaWJsZTsKLQotICAgICAgICBwcml2YXRlIFdpbmRvd3NUYWJsZU1vZGVsKCkgewotICAgICAgICAgICAgd2luZG93cyA9IG5ldyBBcnJheUxpc3Q8V2luZG93PigpOwotICAgICAgICAgICAgd2luZG93cy5hZGQoV2luZG93LkZPQ1VTRURfV0lORE9XKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvdywgaW50IGNvbHVtbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7Ci0gICAgICAgICAgICByZXR1cm4gIldpbmRvd3MiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0gICAgICAgICAgICByZXR1cm4gd2luZG93cy5nZXQocm93KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuICF2aXNpYmxlIHx8IHdpbmRvd3MgPT0gbnVsbCA/IDAgOiB3aW5kb3dzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotICAgICAgICAgICAgZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFdpbmRvdyhXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICB3aW5kb3dzLmFkZCh3aW5kb3cpOwotICAgICAgICAgICAgZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFdpbmRvd3MoV2luZG93W10gd2luZG93c0xpc3QpIHsKLSAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIE1hbnVhbEFycmF5VG9Db2xsZWN0aW9uQ29weQotICAgICAgICAgICAgZm9yIChXaW5kb3cgd2luZG93IDogd2luZG93c0xpc3QpIHsKLSAgICAgICAgICAgICAgICB3aW5kb3dzLmFkZCh3aW5kb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgd2luZG93cy5jbGVhcigpOwotICAgICAgICAgICAgd2luZG93cy5hZGQoV2luZG93LkZPQ1VTRURfV0lORE9XKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXaW5kb3cgZ2V0V2luZG93KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHdpbmRvd3MuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlU2VsZWN0ZWRMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RTZWxlY3Rpb25MaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZUlzQWRqdXN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCByb3cgPSBkZXZpY2VzLmdldFNlbGVjdGVkUm93KCk7Ci0gICAgICAgICAgICBpZiAocm93ID49IDApIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RGV2aWNlID0gZGV2aWNlc1RhYmxlTW9kZWwuZ2V0RGV2aWNlKHJvdyk7Ci0gICAgICAgICAgICAgICAgY3VycmVudERldmljZUNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudERldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRGV2aWNlQnJpZGdlLmlzVmlld1NlcnZlclJ1bm5pbmcoY3VycmVudERldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUJyaWRnZS5zdGFydFZpZXdTZXJ2ZXIoY3VycmVudERldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ZvclNlcnZlck9uQ3VycmVudERldmljZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRXaW5kb3dzKCkuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudERldmljZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY3VycmVudERldmljZUNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB3aW5kb3dzVGFibGVNb2RlbC5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBXaW5kb3dTZWxlY3RlZExpc3RlbmVyIGltcGxlbWVudHMgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFZhbHVlSXNBZGp1c3RpbmcoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHJvdyA9IHdpbmRvd3MuZ2V0U2VsZWN0ZWRSb3coKTsKLSAgICAgICAgICAgIGlmIChyb3cgPj0gMCkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5kb3cgPSB3aW5kb3dzVGFibGVNb2RlbC5nZXRXaW5kb3cocm93KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFdpbmRvdyA9IFdpbmRvdy5GT0NVU0VEX1dJTkRPVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdzVHJlZUNlbGxSZW5kZXJlciBleHRlbmRzIERlZmF1bHRUcmVlQ2VsbFJlbmRlcmVyIHsKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUcmVlIHRyZWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAoKFZpZXdOb2RlKSB2YWx1ZSkubmFtZTsKLSAgICAgICAgICAgIHZhbHVlID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSwgbmFtZS5sYXN0SW5kZXhPZignQCcpKTsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRyZWUsIHZhbHVlLCBzZWxlY3RlZCwgZXhwYW5kZWQsCi0gICAgICAgICAgICAgICAgICAgIGxlYWYsIHJvdywgaGFzRm9jdXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL0JhY2tncm91bmRBY3Rpb24uamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9CYWNrZ3JvdW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWUzZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL0JhY2tncm91bmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd3b3JrZXIuU3dpbmdXb3JrZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhY2tncm91bmRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUJhY2tncm91bmRUYXNrKFN3aW5nV29ya2VyPD8sID8+IHdvcmtlcikgewotICAgICAgICBpZiAod29ya2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdvcmtlci5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vQ2FwdHVyZU5vZGVBY3Rpb24uamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9DYXB0dXJlTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFlZTNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9DYXB0dXJlTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLQotcHVibGljIGNsYXNzIENhcHR1cmVOb2RlQWN0aW9uIGV4dGVuZHMgQmFja2dyb3VuZEFjdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05BTUUgPSAiY2FwdHVyZU5vZGUiOwotICAgIHByaXZhdGUgV29ya3NwYWNlIG1Xb3Jrc3BhY2U7Ci0KLSAgICBwdWJsaWMgQ2FwdHVyZU5vZGVBY3Rpb24oV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBwdXRWYWx1ZShOQU1FLCAiRGlzcGxheSBWaWV3Iik7Ci0gICAgICAgIHB1dFZhbHVlKFNIT1JUX0RFU0NSSVBUSU9OLCAiRGlzcGxheSBWaWV3Iik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJEaXNwbGF5IFZpZXciKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0QsCi0gICAgICAgICAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldE1lbnVTaG9ydGN1dEtleU1hc2soKSkpOwotICAgICAgICB0aGlzLm1Xb3Jrc3BhY2UgPSB3b3Jrc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgZXhlY3V0ZUJhY2tncm91bmRUYXNrKG1Xb3Jrc3BhY2Uuc2hvd05vZGVDYXB0dXJlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9FeGl0QWN0aW9uLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vRXhpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWFhZWQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9FeGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuYWN0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLldvcmtzcGFjZTsKLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIuZGV2aWNlLkRldmljZUJyaWRnZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotCi1wdWJsaWMgY2xhc3MgRXhpdEFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkFNRSA9ICJleGl0IjsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgcHVibGljIEV4aXRBY3Rpb24oV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBwdXRWYWx1ZShOQU1FLCAiUXVpdCIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlF1aXQiKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIlF1aXQiKTsKLSAgICAgICAgcHV0VmFsdWUoTU5FTU9OSUNfS0VZLCBLZXlFdmVudC5WS19RKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX1EsCi0gICAgICAgICAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldE1lbnVTaG9ydGN1dEtleU1hc2soKSkpOwotICAgICAgICB0aGlzLm1Xb3Jrc3BhY2UgPSB3b3Jrc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgbVdvcmtzcGFjZS5jbGVhbnVwRGV2aWNlcygpOwotICAgICAgICBtV29ya3NwYWNlLmRpc3Bvc2UoKTsKLSAgICAgICAgRGV2aWNlQnJpZGdlLnRlcm1pbmF0ZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vSW52YWxpZGF0ZUFjdGlvbi5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL0ludmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2N2NkYS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vSW52YWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLQotcHVibGljIGNsYXNzIEludmFsaWRhdGVBY3Rpb24gZXh0ZW5kcyBCYWNrZ3JvdW5kQWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkFNRSA9ICJpbnZhbGlkYXRlIjsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgcHVibGljIEludmFsaWRhdGVBY3Rpb24oV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBwdXRWYWx1ZShOQU1FLCAiSW52YWxpZGF0ZSIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIkludmFsaWRhdGUiKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIkludmFsaWRhdGUiKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0ksCi0gICAgICAgICAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldE1lbnVTaG9ydGN1dEtleU1hc2soKSkpOwotICAgICAgICB0aGlzLm1Xb3Jrc3BhY2UgPSB3b3Jrc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgZXhlY3V0ZUJhY2tncm91bmRUYXNrKG1Xb3Jrc3BhY2UuaW52YWxpZGF0ZVZpZXcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL0xvYWRHcmFwaEFjdGlvbi5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL0xvYWRHcmFwaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM4YjhlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9Mb2FkR3JhcGhBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5hY3Rpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuV29ya3NwYWNlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuS2V5U3Ryb2tlOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci0KLXB1YmxpYyBjbGFzcyBMb2FkR3JhcGhBY3Rpb24gZXh0ZW5kcyBCYWNrZ3JvdW5kQWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkFNRSA9ICJsb2FkR3JhcGgiOwotICAgIHByaXZhdGUgV29ya3NwYWNlIG1Xb3Jrc3BhY2U7Ci0KLSAgICBwdWJsaWMgTG9hZEdyYXBoQWN0aW9uKFdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIkxvYWQgVmlldyBIaWVyYXJjaHkiKTsKLSAgICAgICAgcHV0VmFsdWUoU0hPUlRfREVTQ1JJUFRJT04sICJMb2FkIik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJMb2FkIFZpZXcgSGllcmFyY2h5Iik7Ci0gICAgICAgIHB1dFZhbHVlKE1ORU1PTklDX0tFWSwgS2V5RXZlbnQuVktfTCk7Ci0gICAgICAgIHB1dFZhbHVlKEFDQ0VMRVJBVE9SX0tFWSwgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19MLAotICAgICAgICAgICAgICAgIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRNZW51U2hvcnRjdXRLZXlNYXNrKCkpKTsKLSAgICAgICAgdGhpcy5tV29ya3NwYWNlID0gd29ya3NwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kVGFzayhtV29ya3NwYWNlLmxvYWRHcmFwaCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vUmVmcmVzaFdpbmRvd3NBY3Rpb24uamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9SZWZyZXNoV2luZG93c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2I3ZWE3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9SZWZyZXNoV2luZG93c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoV2luZG93c0FjdGlvbiBleHRlbmRzIEJhY2tncm91bmRBY3Rpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9OQU1FID0gInJlZnJlc2hXaW5kb3dzIjsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgcHVibGljIFJlZnJlc2hXaW5kb3dzQWN0aW9uKFdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIlJlZnJlc2ggV2luZG93cyIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlJlZnJlc2giKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIlJlZnJlc2ggV2luZG93cyIpOwotICAgICAgICBwdXRWYWx1ZShBQ0NFTEVSQVRPUl9LRVksIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfRjcsIDApKTsKLSAgICAgICAgdGhpcy5tV29ya3NwYWNlID0gd29ya3NwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kVGFzayhtV29ya3NwYWNlLmxvYWRXaW5kb3dzKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9SZXF1ZXN0TGF5b3V0QWN0aW9uLmphdmEgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vUmVxdWVzdExheW91dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMyODMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9SZXF1ZXN0TGF5b3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuYWN0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLldvcmtzcGFjZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdExheW91dEFjdGlvbiBleHRlbmRzIEJhY2tncm91bmRBY3Rpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9OQU1FID0gInJlcXVlc3RMYXlvdXQiOwotICAgIHByaXZhdGUgV29ya3NwYWNlIG1Xb3Jrc3BhY2U7Ci0KLSAgICBwdWJsaWMgUmVxdWVzdExheW91dEFjdGlvbihXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7Ci0gICAgICAgIHB1dFZhbHVlKE5BTUUsICJSZXF1ZXN0IExheW91dCIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlJlcXVlc3QgTGF5b3V0Iik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJSZXF1ZXN0IExheW91dCIpOwotICAgICAgICBwdXRWYWx1ZShBQ0NFTEVSQVRPUl9LRVksIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfUiwKLSAgICAgICAgICAgICAgICBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpKSk7Ci0gICAgICAgIHRoaXMubVdvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBleGVjdXRlQmFja2dyb3VuZFRhc2sobVdvcmtzcGFjZS5yZXF1ZXN0TGF5b3V0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9TYXZlU2NlbmVBY3Rpb24uamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9TYXZlU2NlbmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3YThhOS4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vU2F2ZVNjZW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuYWN0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLldvcmtzcGFjZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotCi1wdWJsaWMgY2xhc3MgU2F2ZVNjZW5lQWN0aW9uIGV4dGVuZHMgQmFja2dyb3VuZEFjdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05BTUUgPSAic2F2ZVNjZW5lIjsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgcHVibGljIFNhdmVTY2VuZUFjdGlvbihXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7Ci0gICAgICAgIG1Xb3Jrc3BhY2UgPSB3b3Jrc3BhY2U7Ci0gICAgICAgIHB1dFZhbHVlKE5BTUUsICJTYXZlIGFzIFBORy4uLiIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlNhdmUiKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIlNhdmUgYXMgUE5HLi4uIik7Ci0gICAgICAgIHB1dFZhbHVlKE1ORU1PTklDX0tFWSwgS2V5RXZlbnQuVktfUyk7Ci0gICAgICAgIHB1dFZhbHVlKEFDQ0VMRVJBVE9SX0tFWSwgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19TLAotICAgICAgICAgICAgICAgIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRNZW51U2hvcnRjdXRLZXlNYXNrKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBleGVjdXRlQmFja2dyb3VuZFRhc2sobVdvcmtzcGFjZS5zYXZlU2NlbmVBc0ltYWdlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9TaG93RGV2aWNlc0FjdGlvbi5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL1Nob3dEZXZpY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWFiN2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL1Nob3dEZXZpY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkuYWN0aW9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLldvcmtzcGFjZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotCi1wdWJsaWMgY2xhc3MgU2hvd0RldmljZXNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05BTUUgPSAic2hvd0RldmljZXMiOwotICAgIHByaXZhdGUgV29ya3NwYWNlIG1Xb3Jrc3BhY2U7Ci0KLSAgICBwdWJsaWMgU2hvd0RldmljZXNBY3Rpb24oV29ya3NwYWNlIHdvcmtzcGFjZSkgewotICAgICAgICBwdXRWYWx1ZShOQU1FLCAiRGV2aWNlcyIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIkRldmljZXMiKTsKLSAgICAgICAgcHV0VmFsdWUoTE9OR19ERVNDUklQVElPTiwgIlNob3cgRGV2aWNlcyIpOwotICAgICAgICBwdXRWYWx1ZShNTkVNT05JQ19LRVksIEtleUV2ZW50LlZLX0QpOwotICAgICAgICBwdXRWYWx1ZShBQ0NFTEVSQVRPUl9LRVksIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfRCwKLSAgICAgICAgICAgICAgICBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpKSk7Ci0gICAgICAgIHRoaXMubVdvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBtV29ya3NwYWNlLnNob3dEZXZpY2VzU2VsZWN0b3IoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vU3RhcnRTZXJ2ZXJBY3Rpb24uamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9TdGFydFNlcnZlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I2YWUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL2FjdGlvbi9TdGFydFNlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFNlcnZlckFjdGlvbiBleHRlbmRzIEJhY2tncm91bmRBY3Rpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9OQU1FID0gInN0YXJ0U2VydmVyIjsKLSAgICBwcml2YXRlIFdvcmtzcGFjZSBtV29ya3NwYWNlOwotCi0gICAgcHVibGljIFN0YXJ0U2VydmVyQWN0aW9uKFdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIlN0YXJ0IFNlcnZlciIpOwotICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIlN0YXJ0Iik7Ci0gICAgICAgIHB1dFZhbHVlKExPTkdfREVTQ1JJUFRJT04sICJTdGFydCBTZXJ2ZXIiKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0Y1LCAwKSk7Ci0gICAgICAgIHRoaXMubVdvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBleGVjdXRlQmFja2dyb3VuZFRhc2sobVdvcmtzcGFjZS5zdGFydFNlcnZlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vU3RvcFNlcnZlckFjdGlvbi5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvYWN0aW9uL1N0b3BTZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3NmUxNC4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9hY3Rpb24vU3RvcFNlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLmFjdGlvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTdG9wU2VydmVyQWN0aW9uIGV4dGVuZHMgQmFja2dyb3VuZEFjdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05BTUUgPSAic3RvcFNlcnZlciI7Ci0gICAgcHJpdmF0ZSBXb3Jrc3BhY2UgbVdvcmtzcGFjZTsKLQotICAgIHB1YmxpYyBTdG9wU2VydmVyQWN0aW9uKFdvcmtzcGFjZSB3b3Jrc3BhY2UpIHsKLSAgICAgICAgcHV0VmFsdWUoTkFNRSwgIlN0b3AgU2VydmVyIik7Ci0gICAgICAgIHB1dFZhbHVlKFNIT1JUX0RFU0NSSVBUSU9OLCAiU3RvcCIpOwotICAgICAgICBwdXRWYWx1ZShMT05HX0RFU0NSSVBUSU9OLCAiU3RvcCBTZXJ2ZXIiKTsKLSAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0Y2LCAwKSk7Ci0gICAgICAgIHRoaXMubVdvcmtzcGFjZSA9IHdvcmtzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBleGVjdXRlQmFja2dyb3VuZFRhc2sobVdvcmtzcGFjZS5zdG9wU2VydmVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL21vZGVsL1Byb2ZpbGVzVGFibGVNb2RlbC5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvbW9kZWwvUHJvZmlsZXNUYWJsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmU2YjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvbW9kZWwvUHJvZmlsZXNUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVNb2RlbDsKLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgUHJvZmlsZXNUYWJsZU1vZGVsIGV4dGVuZHMgRGVmYXVsdFRhYmxlTW9kZWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5BTUVTID0geyAibWVhc3VyZSIsICJsYXlvdXQiLCAiZHJhdyIgfTsKLQotICAgIHByaXZhdGUgZmluYWwgZG91YmxlW10gcHJvZmlsZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOdW1iZXJGb3JtYXQgZm9ybWF0dGVyOwotCi0gICAgcHVibGljIFByb2ZpbGVzVGFibGVNb2RlbChkb3VibGVbXSBwcm9maWxlcykgewotICAgICAgICB0aGlzLnByb2ZpbGVzID0gcHJvZmlsZXM7Ci0gICAgICAgIGZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBwcm9maWxlcyA9PSBudWxsID8gMCA6IHByb2ZpbGVzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbHVtbikgewotICAgICAgICBpZiAocHJvZmlsZXMgPT0gbnVsbCkgcmV0dXJuICIiOwotCi0gICAgICAgIGlmIChjb2x1bW4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5BTUVTW3Jvd107Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHByb2ZpbGVzW3Jvd10pICsgIiI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbiA9PSAwID8gIk9wZXJhdGlvbiIgOiAiRHVyYXRpb24gKG1zKSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IGFyZzAsIGludCBhcmcxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9tb2RlbC9Qcm9wZXJ0aWVzVGFibGVNb2RlbC5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvbW9kZWwvUHJvcGVydGllc1RhYmxlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0ZjdlMy4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS9tb2RlbC9Qcm9wZXJ0aWVzVGFibGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLm1vZGVsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnNjZW5lLlZpZXdOb2RlOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFByb3BlcnRpZXNUYWJsZU1vZGVsIGV4dGVuZHMgRGVmYXVsdFRhYmxlTW9kZWwgewotICAgIHByaXZhdGUgTGlzdDxWaWV3Tm9kZS5Qcm9wZXJ0eT4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIExpc3Q8Vmlld05vZGUuUHJvcGVydHk+IHByaXZhdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxWaWV3Tm9kZS5Qcm9wZXJ0eT4oKTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzVGFibGVNb2RlbChWaWV3Tm9kZSBub2RlKSB7Ci0gICAgICAgIHByb3BlcnRpZXMgPSBub2RlLnByb3BlcnRpZXM7Ci0gICAgICAgIGxvYWRQcml2YXRlUHJvcGVydGllcyhub2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFByaXZhdGVQcm9wZXJ0aWVzKFZpZXdOb2RlIG5vZGUpIHsKLSAgICAgICAgaW50IHggPSBub2RlLmxlZnQ7Ci0gICAgICAgIGludCB5ID0gbm9kZS50b3A7Ci0gICAgICAgIFZpZXdOb2RlIHAgPSBub2RlLnBhcmVudDsKLSAgICAgICAgd2hpbGUgKHAgIT0gbnVsbCkgewotICAgICAgICAgICAgeCArPSBwLmxlZnQgLSBwLnNjcm9sbFg7Ci0gICAgICAgICAgICB5ICs9IHAudG9wIC0gcC5zY3JvbGxZOwotICAgICAgICAgICAgcCA9IHAucGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgVmlld05vZGUuUHJvcGVydHkgcHJvcGVydHkgPSBuZXcgVmlld05vZGUuUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkubmFtZSA9ICJhYnNvbHV0ZV94IjsKLSAgICAgICAgcHJvcGVydHkudmFsdWUgPSBTdHJpbmcudmFsdWVPZih4KTsKLSAgICAgICAgcHJpdmF0ZVByb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKLQotICAgICAgICBwcm9wZXJ0eSA9IG5ldyBWaWV3Tm9kZS5Qcm9wZXJ0eSgpOwotICAgICAgICBwcm9wZXJ0eS5uYW1lID0gImFic29sdXRlX3kiOwotICAgICAgICBwcm9wZXJ0eS52YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHkpOwotICAgICAgICBwcml2YXRlUHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiAocHJpdmF0ZVByb3BlcnRpZXMgPT0gbnVsbCA/IDAgOiBwcml2YXRlUHJvcGVydGllcy5zaXplKCkpICsKLSAgICAgICAgICAgICAgICAocHJvcGVydGllcyA9PSBudWxsID8gMCA6IHByb3BlcnRpZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbHVtbikgewotICAgICAgICBWaWV3Tm9kZS5Qcm9wZXJ0eSBwcm9wZXJ0eTsKLQotICAgICAgICBpZiAocm93IDwgcHJpdmF0ZVByb3BlcnRpZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IHByaXZhdGVQcm9wZXJ0aWVzLmdldChyb3cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldChyb3cgLSBwcml2YXRlUHJvcGVydGllcy5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbHVtbiA9PSAwID8gcHJvcGVydHkubmFtZSA6IHByb3BlcnR5LnZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW4gPT0gMCA/ICJQcm9wZXJ0eSIgOiAiVmFsdWUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCBhcmcwLCBpbnQgYXJnMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvbW9kZWwvVmlld3NUcmVlTW9kZWwuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL21vZGVsL1ZpZXdzVHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTA3ZjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvbW9kZWwvVmlld3NUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS5tb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci5zY2VuZS5WaWV3Tm9kZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVBhdGg7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBWaWV3c1RyZWVNb2RlbCBpbXBsZW1lbnRzIFRyZWVNb2RlbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Tm9kZSByb290OwotCi0gICAgcHVibGljIFZpZXdzVHJlZU1vZGVsKFZpZXdOb2RlIHJvb3QpIHsKLSAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IG8sIGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoKFZpZXdOb2RlKSBvKS5jaGlsZHJlbi5nZXQoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiAoKFZpZXdOb2RlKSBvKS5jaGlsZHJlbi5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKE9iamVjdCBjaGlsZCkgewotICAgICAgICBWaWV3Tm9kZSBub2RlID0gKFZpZXdOb2RlKSBjaGlsZDsKLSAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4gPT0gbnVsbCB8fCBub2RlLmNoaWxkcmVuLnNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggdHJlZVBhdGgsIE9iamVjdCBjaGlsZCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhPZkNoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotICAgICAgICAvL25vaW5zcGVjdGlvbiBTdXNwaWNpb3VzTWV0aG9kQ2FsbHMKLSAgICAgICAgcmV0dXJuICgoVmlld05vZGUpIHBhcmVudCkuY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgdHJlZU1vZGVsTGlzdGVuZXIpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciB0cmVlTW9kZWxMaXN0ZW5lcikgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL3V0aWwvSWNvbkxvYWRlci5qYXZhIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvdXRpbC9JY29uTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzM5NTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdWkvdXRpbC9JY29uTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51aS51dGlsOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEljb25Mb2FkZXIgewotICAgIHB1YmxpYyBzdGF0aWMgSWNvbiBsb2FkKENsYXNzPD8+IGtsYXNzLCBTdHJpbmcgcGF0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUljb24oSW1hZ2VJTy5yZWFkKGtsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkgewotICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50IGVudmlyb25tZW50ID0gR3JhcGhpY3NFbnZpcm9ubWVudC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGVudmlyb25tZW50LmdldERlZmF1bHRTY3JlZW5EZXZpY2UoKS5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIZWFkbGVzcygpIHsKLSAgICAgICAgcmV0dXJuIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSB0b0NvbXBhdGlibGVJbWFnZShCdWZmZXJlZEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbWFnZS5nZXRDb2xvck1vZGVsKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldENvbG9yTW9kZWwoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgY29tcGF0aWJsZUltYWdlID0gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKAotICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRXaWR0aCgpLCBpbWFnZS5nZXRIZWlnaHQoKSwgaW1hZ2UuZ2V0VHJhbnNwYXJlbmN5KCkpOwotICAgICAgICBHcmFwaGljcyBnID0gY29tcGF0aWJsZUltYWdlLmdldEdyYXBoaWNzKCk7Ci0gICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBudWxsKTsKLSAgICAgICAgZy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhdGlibGVJbWFnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91aS91dGlsL1BuZ0ZpbGVGaWx0ZXIuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL3V0aWwvUG5nRmlsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDY0NzJkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3VpL3V0aWwvUG5nRmlsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaGllcmFyY2h5dmlld2VyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFBuZ0ZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0gICAgICAgIHJldHVybiBmLmlzRGlyZWN0b3J5KCkgfHwgZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnBuZyIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiUE5HIEltYWdlICgqLnBuZykiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3V0aWwvT1MuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3V0aWwvT1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MTlkNi4uMDAwMDAwMAotLS0gYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL2NvbS9hbmRyb2lkL2hpZXJhcmNoeXZpZXdlci91dGlsL09TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5oaWVyYXJjaHl2aWV3ZXIudXRpbDsKLQotcHVibGljIGNsYXNzIE9TIHsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hY09zOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbGVvcGFyZDsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGxpbnV4OwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2luZG93czsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLSAgICAgICAgbWFjT3MgPSAiTWFjIE9TIFgiLnN0YXJ0c1dpdGgob3NOYW1lKTsKLSAgICAgICAgbGludXggPSAiTGludXgiLnN0YXJ0c1dpdGgob3NOYW1lKTsKLSAgICAgICAgd2luZG93cyA9ICJXaW5kb3dzIi5zdGFydHNXaXRoKG9zTmFtZSk7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcGFydHMgPSB2ZXJzaW9uLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgbGVvcGFyZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pID49IDEwICYmIEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pID49IDU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFjT3NYKCkgewotICAgICAgICByZXR1cm4gbWFjT3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVvcGFyZE9yTGF0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBsZW9wYXJkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpbnV4KCkgewotICAgICAgICByZXR1cm4gbGludXg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cygpIHsKLSAgICAgICAgcmV0dXJuIHdpbmRvd3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdXRpbC9Xb3JrZXJUaHJlYWQuamF2YSBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvY29tL2FuZHJvaWQvaGllcmFyY2h5dmlld2VyL3V0aWwvV29ya2VyVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTRjMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9jb20vYW5kcm9pZC9oaWVyYXJjaHl2aWV3ZXIvdXRpbC9Xb3JrZXJUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmhpZXJhcmNoeXZpZXdlci51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLS8qKgotICogU2ltcGxlIHV0aWxpdHkgY2xhc3MgdXNlZCBvbmx5IHRvIG1hcmsgbWV0aG9kcyB0aGF0IGFyZSBub3QgZXhlY3V0ZWQgb24gdGhlIFVJIHRocmVhZAotICogKG9yIEV2ZW50IERpc3BhdGNoIFRocmVhZCBpbiBTd2luZy9BV1QuKSBUaGlzIGFubm90YXRpb24ncyBzb2xlIHB1cnBvc2UgaXMgdG8gaGVscAotICogcmVhZGluZyB0aGUgc291cmNlIGNvZGUuIEl0IGhhcyBubyBhZGRpdGlvbmFsIGVmZmVjdC4KLSAqLwotQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCB9KQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgV29ya2VyVGhyZWFkIHsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWdyYXBoLXZpZXctc2VsZWN0ZWQucG5nIGIvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tZ3JhcGgtdmlldy1zZWxlY3RlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjcxMTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tZ3JhcGgtdmlldy1zZWxlY3RlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1ncmFwaC12aWV3LnBuZyBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWdyYXBoLXZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdmNjhiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWdyYXBoLXZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tcGl4ZWwtcGVyZmVjdC12aWV3LXNlbGVjdGVkLnBuZyBiL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLXBpeGVsLXBlcmZlY3Qtdmlldy1zZWxlY3RlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDQwMDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGllcmFyY2h5dmlld2VyL3NyYy9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tcGl4ZWwtcGVyZmVjdC12aWV3LXNlbGVjdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLXBpeGVsLXBlcmZlY3Qtdmlldy5wbmcgYi90b29scy9oaWVyYXJjaHl2aWV3ZXIvc3JjL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1waXhlbC1wZXJmZWN0LXZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUxY2VjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hpZXJhcmNoeXZpZXdlci9zcmMvcmVzb3VyY2VzL2ltYWdlcy9pY29uLXBpeGVsLXBlcmZlY3Qtdmlldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9qYXJ1dGlscy8uY2xhc3NwYXRoIGIvdG9vbHMvamFydXRpbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxN2E0My4uMDAwMDAwMAotLS0gYS90b29scy9qYXJ1dGlscy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvQW5kcm9pZFByZWZzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2phcnV0aWxzLy5naXRpZ25vcmUgYi90b29scy9qYXJ1dGlscy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk5NTA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2phcnV0aWxzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotCmRpZmYgLS1naXQgYS90b29scy9qYXJ1dGlscy8ucHJvamVjdCBiL3Rvb2xzL2phcnV0aWxzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ5ZTQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2phcnV0aWxzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+SmFyVXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvamFydXRpbHMvQW5kcm9pZC5tayBiL3Rvb2xzL2phcnV0aWxzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzYxNGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvamFydXRpbHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1KQVJVVElMU19MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChKQVJVVElMU19MT0NBTF9ESVIpL3NyYy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9qYXJ1dGlscy9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL2phcnV0aWxzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ4YjdmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2phcnV0aWxzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlhbmRyb2lkcHJlZnMKLQotTE9DQUxfTU9EVUxFIDo9IGphcnV0aWxzCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvamFydXRpbHMvc3JjL2NvbS9hbmRyb2lkL2phcnV0aWxzL0RlYnVnS2V5UHJvdmlkZXIuamF2YSBiL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9EZWJ1Z0tleVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzMyYmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvamFydXRpbHMvc3JjL2NvbS9hbmRyb2lkL2phcnV0aWxzL0RlYnVnS2V5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5qYXJ1dGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgcHJvdmlkZXIgb2YgYSBkdW1teSBrZXkgdG8gc2lnbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAqIDxwLz5UaGlzIHByb3ZpZGVyIHVzZXMgYSBjdXN0b20ga2V5c3RvcmUgdG8gY3JlYXRlIGFuZCBzdG9yZSBhIGtleSB3aXRoIGEga25vd24gcGFzc3dvcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z0tleVByb3ZpZGVyIHsKLSAgICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElLZXlHZW5PdXRwdXQgewotICAgICAgICBwdWJsaWMgdm9pZCBvdXQoU3RyaW5nIG1lc3NhZ2UpOwotICAgICAgICBwdWJsaWMgdm9pZCBlcnIoU3RyaW5nIG1lc3NhZ2UpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfU1RSSU5HID0gImFuZHJvaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBQQVNTV09SRF9DSEFSID0gUEFTU1dPUkRfU1RSSU5HLnRvQ2hhckFycmF5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0FMSUFTID0gIkFuZHJvaWREZWJ1Z0tleSI7Ci0gICAgCi0gICAgLy8gQ2VydGlmaWNhdGUgQ04gdmFsdWUuIFRoaXMgaXMgYSBoYXJkLWNvZGVkIHZhbHVlIGZvciB0aGUgZGVidWcga2V5LgotICAgIC8vIEFuZHJvaWQgTWFya2V0IGNoZWNrcyBhZ2FpbnN0IHRoaXMgdmFsdWUgaW4gb3JkZXIgdG8gcmVmdXNlIGFwcGxpY2F0aW9ucyBzaWduZWQgd2l0aAotICAgIC8vIGRlYnVnIGtleXMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRJRklDQVRFX0RFU0MgPSAiQ049QW5kcm9pZCBEZWJ1ZyxPPUFuZHJvaWQsQz1VUyI7Ci0gICAgCi0gICAgcHJpdmF0ZSBLZXlTdG9yZS5Qcml2YXRlS2V5RW50cnkgbUVudHJ5OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5dG9vbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qKiBkZWZhdWx0IHNlcmlhbCB1aWQgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1KYXZhSG9tZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Db21tYW5kTGluZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBLZXl0b29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleXRvb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBqYXZhSG9tZSwgU3RyaW5nIGNvbW1hbmRMaW5lKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbUphdmFIb21lID0gamF2YUhvbWU7Ci0gICAgICAgICAgICBtQ29tbWFuZExpbmUgPSBjb21tYW5kTGluZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXZhSG9tZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSmF2YUhvbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZExpbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRMaW5lOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm92aWRlciB1c2luZyBhIGtleXN0b3JlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICAgKiA8cC8+VGhlIGtleXN0b3JlLCBhbmQgYSBuZXcgcmFuZG9tIGFuZHJvaWQgZGVidWcga2V5IGFyZSBjcmVhdGVkIGlmIHRoZXkgZG8gbm90IHlldCBleGlzdC4KLSAgICAgKiA8cC8+UGFzc3dvcmQgZm9yIHRoZSBzdG9yZS9rZXkgaXMgPGNvZGU+YW5kcm9pZDwvY29kZT4sIGFuZCB0aGUga2V5IGFsaWFzIGlzCi0gICAgICogPGNvZGU+QW5kcm9pZERlYnVnS2V5PC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gb3NLZXlTdG9yZVBhdGggdGhlIE9TIHBhdGggdG8gdGhlIGtleXN0b3JlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCBvbmUKLSAgICAgKiBpcyB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBzdG9yZVR5cGUgYW4gb3B0aW9uYWwga2V5c3RvcmUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRlZmF1bHQgaXMgdG8KLSAgICAgKiBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBvdXRwdXQgYW4gb3B0aW9uYWwge0BsaW5rIElLZXlHZW5PdXRwdXR9IG9iamVjdCB0byBnZXQgdGhlIHN0ZG91dCBhbmQgc3RkZXJyCi0gICAgICogb2YgdGhlIGtleXRvb2wgcHJvY2VzcyBjYWxsLgotICAgICAqIEB0aHJvd3MgS2V5dG9vbEV4Y2VwdGlvbiBJZiB0aGUgY3JlYXRpb24gb2YgdGhlIGRlYnVnIGtleSBmYWlsZWQuCi0gICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gCi0gICAgICovCi0gICAgcHVibGljIERlYnVnS2V5UHJvdmlkZXIoU3RyaW5nIG9zS2V5U3RvcmVQYXRoLCBTdHJpbmcgc3RvcmVUeXBlLCBJS2V5R2VuT3V0cHV0IG91dHB1dCkKLSAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEtleXRvb2xFeGNlcHRpb24sIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBpZiAob3NLZXlTdG9yZVBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgb3NLZXlTdG9yZVBhdGggPSBnZXREZWZhdWx0S2V5U3RvcmVPc1BhdGgoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvYWRLZXlFbnRyeShvc0tleVN0b3JlUGF0aCwgc3RvcmVUeXBlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzdG9yZSB3aXRoIHRoZSBrZXkKLSAgICAgICAgICAgIGNyZWF0ZU5ld1N0b3JlKG9zS2V5U3RvcmVQYXRoLCBzdG9yZVR5cGUsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBPUyBwYXRoIHRvIHRoZSBkZWZhdWx0IGRlYnVnIGtleXN0b3JlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIE9TIHBhdGggdG8gdGhlIGRlZmF1bHQgZGVidWcga2V5c3RvcmUuCi0gICAgICogQHRocm93cyBLZXl0b29sRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0S2V5U3RvcmVPc1BhdGgoKQotICAgICAgICAgICAgdGhyb3dzIEtleXRvb2xFeGNlcHRpb24sIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmb2xkZXIgPSBBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCk7Ci0gICAgICAgIGlmIChmb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEtleXRvb2xFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgSE9NRSBkaXJlY3RvcnkhXG4iKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3NLZXlTdG9yZVBhdGggPSBmb2xkZXIgKyAiZGVidWcua2V5c3RvcmUiOwotCi0gICAgICAgIHJldHVybiBvc0tleVN0b3JlUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWJ1ZyB7QGxpbmsgUHJpdmF0ZUtleX0gdG8gdXNlIHRvIHNpZ24gYXBwbGljYXRpb25zIGZvciBkZWJ1ZyBwdXJwb3NlLgotICAgICAqIEByZXR1cm4gdGhlIHByaXZhdGUga2V5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0cyBjcmVhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIFByaXZhdGVLZXkgZ2V0RGVidWdLZXkoKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24sIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtRW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbnRyeS5nZXRQcml2YXRlS2V5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlYnVnIHtAbGluayBDZXJ0aWZpY2F0ZX0gdG8gdXNlIHRvIHNpZ24gYXBwbGljYXRpb25zIGZvciBkZWJ1ZyBwdXJwb3NlLgotICAgICAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0cyBjcmVhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKCkgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCi0gICAgICAgICAgICBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uLCBVbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24gewotICAgICAgICBpZiAobUVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW50cnkuZ2V0Q2VydGlmaWNhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZGVidWcga2V5IGZyb20gdGhlIGtleXN0b3JlLgotICAgICAqIEBwYXJhbSBvc0tleVN0b3JlUGF0aCB0aGUgT1MgcGF0aCB0byB0aGUga2V5c3RvcmUuCi0gICAgICogQHBhcmFtIHN0b3JlVHlwZSBhbiBvcHRpb25hbCBrZXlzdG9yZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCBpcyB0bwotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGtleXN0b3JlIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2FkS2V5RW50cnkoU3RyaW5nIG9zS2V5U3RvcmVQYXRoLCBTdHJpbmcgc3RvcmVUeXBlKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sCi0gICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICBzdG9yZVR5cGUgIT0gbnVsbCA/IHN0b3JlVHlwZSA6IEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob3NLZXlTdG9yZVBhdGgpOwotICAgICAgICAgICAga2V5U3RvcmUubG9hZChmaXMsIFBBU1NXT1JEX0NIQVIpOwotICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICBtRW50cnkgPSAoS2V5U3RvcmUuUHJpdmF0ZUtleUVudHJ5KWtleVN0b3JlLmdldEVudHJ5KAotICAgICAgICAgICAgICAgICAgICBERUJVR19BTElBUywgbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbihQQVNTV09SRF9DSEFSKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc3RvcmUKLSAgICAgKiBAcGFyYW0gb3NLZXlTdG9yZVBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBzdG9yZQotICAgICAqIEBwYXJhbSBzdG9yZVR5cGUgYW4gb3B0aW9uYWwga2V5c3RvcmUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRlZmF1bHQgaXMgdG8KLSAgICAgKiBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBvdXRwdXQgYW4gb3B0aW9uYWwge0BsaW5rIElLZXlHZW5PdXRwdXR9IG9iamVjdCB0byBnZXQgdGhlIHN0ZG91dCBhbmQgc3RkZXJyCi0gICAgICogb2YgdGhlIGtleXRvb2wgcHJvY2VzcyBjYWxsLgotICAgICAqIEB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEtleXRvb2xFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTmV3U3RvcmUoU3RyaW5nIG9zS2V5U3RvcmVQYXRoLCBTdHJpbmcgc3RvcmVUeXBlLCBJS2V5R2VuT3V0cHV0IG91dHB1dCkKLSAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEtleXRvb2xFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKEtleXN0b3JlSGVscGVyLmNyZWF0ZU5ld1N0b3JlKG9zS2V5U3RvcmVQYXRoLCBzdG9yZVR5cGUsIFBBU1NXT1JEX1NUUklORywgREVCVUdfQUxJQVMsCi0gICAgICAgICAgICAgICAgUEFTU1dPUkRfU1RSSU5HLCBDRVJUSUZJQ0FURV9ERVNDLCAxIC8qIHZhbGlkaXR5Ki8sIG91dHB1dCkpIHsKLSAgICAgICAgICAgIGxvYWRLZXlFbnRyeShvc0tleVN0b3JlUGF0aCwgc3RvcmVUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YSBiL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ODUxMC4uMDAwMDAwMAotLS0gYS90b29scy9qYXJ1dGlscy9zcmMvY29tL2FuZHJvaWQvamFydXRpbHMvSmF2YVJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuamFydXRpbHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5TaWduZWRKYXJCdWlsZGVyLklaaXBFbnRyeUZpbHRlcjsKLQotLyoqCi0gKiBBIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJWmlwRW50cnlGaWx0ZXJ9IHRvIGZpbHRlciBvdXQgYW55dGhpbmcgdGhhdCBpcyBub3QgYQotICogamF2YSByZXNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZUZpbHRlciBpbXBsZW1lbnRzIElaaXBFbnRyeUZpbHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0VudHJ5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIHNwbGl0IHRoZSBwYXRoIGludG8gc2VnbWVudHMuCi0gICAgICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gbmFtZS5zcGxpdCgiLyIpOwotCi0gICAgICAgIC8vIGVtcHR5IHBhdGg/IHNraXAgdG8gbmV4dCBlbnRyeS4KLSAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBlYWNoIGZvbGRlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc2hvdWxkIGJlIGluY2x1ZGVkLgotICAgICAgICAvLyBGb2xkZXJzIGxpa2UgQ1ZTLCAuc3ZuLCBldGMuLiBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gZXhjbHVkZWQgZnJvbSB0aGUKLSAgICAgICAgLy8gamFyIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgc29tZSBvdGhlciBmb2xkZXIgKGxpa2UgL01FVEEtSU5GKSBzbwotICAgICAgICAvLyB3ZSBjaGVjayBhbnl3YXkuCi0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKHNlZ21lbnRzW2ldKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgZmlsZSBuYW1lIGZyb20gdGhlIHBhdGgKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdOwotCi0gICAgICAgIHJldHVybiBjaGVja0ZpbGVGb3JQYWNrYWdpbmcoZmlsZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZm9sZGVyIGFuZCBpdHMgY29udGVudCBpcyB2YWxpZCBmb3IgcGFja2FnaW5nIGludG8gdGhlIC5hcGsgYXMKLSAgICAgKiBzdGFuZGFyZCBKYXZhIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBmb2xkZXJOYW1lIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRm9sZGVyRm9yUGFja2FnaW5nKFN0cmluZyBmb2xkZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBmb2xkZXJOYW1lLmVxdWFscygiQ1ZTIikgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgIGZvbGRlck5hbWUuZXF1YWxzKCIuc3ZuIikgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgIGZvbGRlck5hbWUuZXF1YWxzKCJTQ0NTIikgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgIGZvbGRlck5hbWUuZXF1YWxzKCJNRVRBLUlORiIpID09IGZhbHNlICYmCi0gICAgICAgICAgICBmb2xkZXJOYW1lLnN0YXJ0c1dpdGgoIl8iKSA9PSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgYSBmaWxlIHRvIG1ha2Ugc3VyZSBpdCBzaG91bGQgYmUgcGFja2FnZWQgYXMgc3RhbmRhcmQgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoaW5jbHVkaW5nIGV4dGVuc2lvbikKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHBhY2thZ2VkIGFzIHN0YW5kYXJkIGphdmEgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpbGVGb3JQYWNrYWdpbmcoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVTZWdtZW50cyA9IGZpbGVOYW1lLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgU3RyaW5nIGZpbGVFeHQgPSAiIjsKLSAgICAgICAgaWYgKGZpbGVTZWdtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBmaWxlRXh0ID0gZmlsZVNlZ21lbnRzW2ZpbGVTZWdtZW50cy5sZW5ndGgtMV07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hlY2tGaWxlRm9yUGFja2FnaW5nKGZpbGVOYW1lLCBmaWxlRXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgYSBmaWxlIHRvIG1ha2Ugc3VyZSBpdCBzaG91bGQgYmUgcGFja2FnZWQgYXMgc3RhbmRhcmQgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoaW5jbHVkaW5nIGV4dGVuc2lvbikKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGUgKGV4Y2x1ZGluZyAnLicpCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHNob3VsZCBiZSBwYWNrYWdlZCBhcyBzdGFuZGFyZCBqYXZhIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgIHN0YXRpYyBib29sZWFuIGNoZWNrRmlsZUZvclBhY2thZ2luZyhTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gTm90ZTogdGhpcyBtZXRob2QgaXMgdXNlZCBieSBjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQuaW50ZXJuYWwuYnVpbGQuQXBrQnVpbGRlcgotICAgICAgICBpZiAoZmlsZU5hbWUuY2hhckF0KDApID09ICcuJykgeyAvLyBpZ25vcmUgaGlkZGVuIGZpbGVzLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJhaWRsIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgPT0gZmFsc2UgJiYgICAgICAgLy8gQWlkbCBmaWxlcwotICAgICAgICAgICAgImphdmEiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSA9PSBmYWxzZSAmJiAgICAgICAgICAvLyBKYXZhIGZpbGVzCi0gICAgICAgICAgICAiY2xhc3MiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSA9PSBmYWxzZSAmJiAgICAgICAgIC8vIEphdmEgY2xhc3MgZmlsZXMKLSAgICAgICAgICAgICJzY2MiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSA9PSBmYWxzZSAmJiAgICAgICAgICAgLy8gVmlzdWFsU291cmNlU2FmZQotICAgICAgICAgICAgInN3cCIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pID09IGZhbHNlICYmICAgICAgICAgICAvLyB2aSBzd2FwIGZpbGUKLSAgICAgICAgICAgICJwYWNrYWdlLmh0bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZU5hbWUpID09IGZhbHNlICYmICAgLy8gSmF2YWRvYwotICAgICAgICAgICAgIm92ZXJ2aWV3Lmh0bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZU5hbWUpID09IGZhbHNlICYmICAvLyBKYXZhZG9jCi0gICAgICAgICAgICAiLmN2c2lnbm9yZSIuZXF1YWxzSWdub3JlQ2FzZShmaWxlTmFtZSkgPT0gZmFsc2UgJiYgICAgIC8vIENWUwotICAgICAgICAgICAgIi5EU19TdG9yZSIuZXF1YWxzKGZpbGVOYW1lKSA9PSBmYWxzZSAmJiAgICAgICAgICAgICAgICAvLyBNYWMgcmVzb3VyY2VzCi0gICAgICAgICAgICBmaWxlTmFtZS5jaGFyQXQoZmlsZU5hbWUubGVuZ3RoKCktMSkgIT0gJ34nOyAgICAgICAgICAgIC8vIEJhY2t1cCBmaWxlcwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9LZXlzdG9yZUhlbHBlci5qYXZhIGIvdG9vbHMvamFydXRpbHMvc3JjL2NvbS9hbmRyb2lkL2phcnV0aWxzL0tleXN0b3JlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTQ2ODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvamFydXRpbHMvc3JjL2NvbS9hbmRyb2lkL2phcnV0aWxzL0tleXN0b3JlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuamFydXRpbHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5qYXJ1dGlscy5EZWJ1Z0tleVByb3ZpZGVyLklLZXlHZW5PdXRwdXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuamFydXRpbHMuRGVidWdLZXlQcm92aWRlci5LZXl0b29sRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQSBIZWxwZXIgdG8gY3JlYXRlIG5ldyBrZXlzdG9yZS9rZXkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBLZXlzdG9yZUhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHN0b3JlCi0gICAgICogQHBhcmFtIG9zS2V5U3RvcmVQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RvcmUKLSAgICAgKiBAcGFyYW0gc3RvcmVUeXBlIGFuIG9wdGlvbmFsIGtleXN0b3JlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkZWZhdWx0IGlzIHRvCi0gICAgICogYmUgdXNlZC4KLSAgICAgKiBAcGFyYW0gb3V0cHV0IGFuIG9wdGlvbmFsIHtAbGluayBJS2V5R2VuT3V0cHV0fSBvYmplY3QgdG8gZ2V0IHRoZSBzdGRvdXQgYW5kIHN0ZGVycgotICAgICAqIG9mIHRoZSBrZXl0b29sIHByb2Nlc3MgY2FsbC4KLSAgICAgKiBAdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBVbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBLZXl0b29sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZU5ld1N0b3JlKAotICAgICAgICAgICAgU3RyaW5nIG9zS2V5U3RvcmVQYXRoLAotICAgICAgICAgICAgU3RyaW5nIHN0b3JlVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBzdG9yZVBhc3N3b3JkLAotICAgICAgICAgICAgU3RyaW5nIGFsaWFzLAotICAgICAgICAgICAgU3RyaW5nIGtleVBhc3N3b3JkLAotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgaW50IHZhbGlkaXR5WWVhcnMsCi0gICAgICAgICAgICBJS2V5R2VuT3V0cHV0IG91dHB1dCkKLSAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEtleXRvb2xFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBleGVjdXRhYmxlIG5hbWUgb2Yga2V5dG9vbCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgotICAgICAgICBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQotICAgICAgICBTdHJpbmcga2V5dG9vbENvbW1hbmQ7Ci0gICAgICAgIGlmIChvcy5zdGFydHNXaXRoKCJXaW5kb3dzIikpIHsKLSAgICAgICAgICAgIGtleXRvb2xDb21tYW5kID0gImtleXRvb2wuZXhlIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGtleXRvb2xDb21tYW5kID0gImtleXRvb2wiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLQotICAgICAgICBpZiAoamF2YUhvbWUgIT0gbnVsbCAmJiBqYXZhSG9tZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGtleXRvb2xDb21tYW5kID0gamF2YUhvbWUgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iICsgRmlsZS5zZXBhcmF0b3IgKyBrZXl0b29sQ29tbWFuZDsgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgY29tbWFuZCBsaW5lIHRvIGNhbGwga2V5IHRvb2wgdG8gYnVpbGQgdGhlIGtleSB3aXRoIG5vIHVzZXIgaW5wdXQuCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNvbW1hbmRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZChrZXl0b29sQ29tbWFuZCk7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZCgiLWdlbmtleSIpOwotICAgICAgICBjb21tYW5kTGlzdC5hZGQoIi1hbGlhcyIpOwotICAgICAgICBjb21tYW5kTGlzdC5hZGQoYWxpYXMpOwotICAgICAgICBjb21tYW5kTGlzdC5hZGQoIi1rZXlhbGciKTsKLSAgICAgICAgY29tbWFuZExpc3QuYWRkKCJSU0EiKTsKLSAgICAgICAgY29tbWFuZExpc3QuYWRkKCItZG5hbWUiKTsKLSAgICAgICAgY29tbWFuZExpc3QuYWRkKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgY29tbWFuZExpc3QuYWRkKCItdmFsaWRpdHkiKTsKLSAgICAgICAgY29tbWFuZExpc3QuYWRkKEludGVnZXIudG9TdHJpbmcodmFsaWRpdHlZZWFycyAqIDM2NSkpOwotICAgICAgICBjb21tYW5kTGlzdC5hZGQoIi1rZXlwYXNzIik7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZChrZXlQYXNzd29yZCk7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZCgiLWtleXN0b3JlIik7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZChvc0tleVN0b3JlUGF0aCk7Ci0gICAgICAgIGNvbW1hbmRMaXN0LmFkZCgiLXN0b3JlcGFzcyIpOwotICAgICAgICBjb21tYW5kTGlzdC5hZGQoc3RvcmVQYXNzd29yZCk7Ci0gICAgICAgIGlmIChzdG9yZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tbWFuZExpc3QuYWRkKCItc3RvcmV0eXBlIik7Ci0gICAgICAgICAgICBjb21tYW5kTGlzdC5hZGQoc3RvcmVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGNvbW1hbmRBcnJheSA9IGNvbW1hbmRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tjb21tYW5kTGlzdC5zaXplKCldKTsKLQotICAgICAgICAvLyBsYXVuY2ggdGhlIGNvbW1hbmQgbGluZSBwcm9jZXNzCi0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gZ3JhYlByb2Nlc3NPdXRwdXQoUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kQXJyYXkpLCBvdXRwdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb21tYW5kIGxpbmUgYXMgb25lIHN0cmluZwotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RBcmcgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogY29tbWFuZEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTcGFjZSA9IGFyZy5pbmRleE9mKCcgJykgIT0gLTE7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGZpcnN0QXJnID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RBcmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaGFzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYXJnKTsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IEtleXRvb2xFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUga2V5OiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIGphdmFIb21lLCBidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RkZXJyL3N0ZG91dCBvdXRwdXRzIG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4KLSAgICAgKiBCb3RoIDxiPm11c3Q8L2I+IGJlIHJlYWQgb3IgdGhlIHByb2Nlc3Mgd2lsbCBibG9jayBvbiB3aW5kb3dzLgotICAgICAqIEBwYXJhbSBwcm9jZXNzIFRoZSBwcm9jZXNzIHRvIGdldCB0aGUgb3VwdXQgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgcmV0dXJuIGNvZGUuCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBncmFiUHJvY2Vzc091dHB1dChmaW5hbCBQcm9jZXNzIHByb2Nlc3MsIGZpbmFsIElLZXlHZW5PdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIC8vIHJlYWQgdGhlIGxpbmVzIGFzIHRoZXkgY29tZS4gaWYgbnVsbCBpcyByZXR1cm5lZCwgaXQncwotICAgICAgICAvLyBiZWNhdXNlIHRoZSBwcm9jZXNzIGZpbmlzaGVkCi0gICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoIiIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB0byByZWFkIHRoZSBzdGRlcnIgb3V0cHV0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZXJyUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5lcnIobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoIiIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgb3V0UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG91dFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQub3V0KGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICB0Mi5zdGFydCgpOwotCi0gICAgICAgIC8vIGl0IGxvb2tzIGxpa2Ugb24gd2luZG93cyBwcm9jZXNzI3dhaXRGb3IoKSBjYW4gcmV0dXJuCi0gICAgICAgIC8vIGJlZm9yZSB0aGUgdGhyZWFkIGhhdmUgZmlsbGVkIHRoZSBhcnJheXMsIHNvIHdlIHdhaXQgZm9yIGJvdGggdGhyZWFkcyBhbmQgdGhlCi0gICAgICAgIC8vIHByb2Nlc3MgaXRzZWxmLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgdDEuam9pbigpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHQyLmpvaW4oKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBvdXRwdXQgdGhyZWFkIGFib3ZlLCB3ZSBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgd2FpdAotICAgICAgICAgICAgLy8gb24gdGhlIHByb2Nlc3MgdG8gZW5kLCBzaW5jZSBpdCdsbCBiZSBkb25lIGJ5IHRoZSB0aW1lIHdlIGNhbGwgd2FpdEZvcigpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9TaWduZWRKYXJCdWlsZGVyLmphdmEgYi90b29scy9qYXJ1dGlscy9zcmMvY29tL2FuZHJvaWQvamFydXRpbHMvU2lnbmVkSmFyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzVhYjdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2phcnV0aWxzL3NyYy9jb20vYW5kcm9pZC9qYXJ1dGlscy9TaWduZWRKYXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuamFydXRpbHM7Ci0KLWltcG9ydCBzdW4ubWlzYy5CQVNFNjRFbmNvZGVyOwotaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLkNvbnRlbnRJbmZvOwotaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLlBLQ1M3OwotaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLlNpZ25lckluZm87Ci1pbXBvcnQgc3VuLnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWQ7Ci1pbXBvcnQgc3VuLnNlY3VyaXR5Lng1MDkuWDUwME5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgSmFyIGZpbGUgYnVpbGRlciB3aXRoIHNpZ25hdHVyZSBzdXBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgU2lnbmVkSmFyQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9BTEdPUklUSE0gPSAiU0hBMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9BVFRSID0gIlNIQTEtRGlnZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX01BTklGRVNUX0FUVFIgPSAiU0hBMS1EaWdlc3QtTWFuaWZlc3QiOwotCi0gICAgLyoqIFdyaXRlIHRvIGFub3RoZXIgc3RyZWFtIGFuZCBhbHNvIGZlZWQgaXQgdG8gdGhlIFNpZ25hdHVyZSBvYmplY3QuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2lnbmF0dXJlT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBTaWduYXR1cmUgbVNpZ25hdHVyZTsKLQotICAgICAgICBwdWJsaWMgU2lnbmF0dXJlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIFNpZ25hdHVyZSBzaWcpIHsKLSAgICAgICAgICAgIHN1cGVyKG91dCk7Ci0gICAgICAgICAgICBtU2lnbmF0dXJlID0gc2lnOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2lnbmF0dXJlLnVwZGF0ZSgoYnl0ZSkgYik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaWduYXR1cmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU2lnbmF0dXJlRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci53cml0ZShiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNpZ25hdHVyZS51cGRhdGUoYiwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgfSBjYXRjaCAoU2lnbmF0dXJlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNpZ25hdHVyZUV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIud3JpdGUoYiwgb2ZmLCBsZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKYXJPdXRwdXRTdHJlYW0gbU91dHB1dEphcjsKLSAgICBwcml2YXRlIFByaXZhdGVLZXkgbUtleTsKLSAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBtQ2VydGlmaWNhdGU7Ci0gICAgcHJpdmF0ZSBNYW5pZmVzdCBtTWFuaWZlc3Q7Ci0gICAgcHJpdmF0ZSBCQVNFNjRFbmNvZGVyIG1CYXNlNjRFbmNvZGVyOwotICAgIHByaXZhdGUgTWVzc2FnZURpZ2VzdCBtTWVzc2FnZURpZ2VzdDsKLQotICAgIHByaXZhdGUgYnl0ZVtdIG1CdWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLQotICAgIC8qKgotICAgICAqIENsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBmaWxlIHNob3VsZAotICAgICAqIGJlIGFkZGVkIHRvIGEgSmFyIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBJWmlwRW50cnlGaWx0ZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIGEgZmlsZSBmb3IgaW5jbHVzaW9uIGluIGEgSmFyIGFyY2hpdmUuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhcmNoaXZlIGZpbGUgcGF0aCBvZiB0aGUgZW50cnkKLSAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0VudHJ5KFN0cmluZyBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBTaWduZWRKYXJCdWlsZGVyfSB3aXRoIGEgZ2l2ZW4gb3V0cHV0IHN0cmVhbSwgYW5kIHNpZ25pbmcgaW5mb3JtYXRpb24uCi0gICAgICogPHAvPklmIGVpdGhlciA8Y29kZT5rZXk8L2NvZGU+IG9yIDxjb2RlPmNlcnRpZmljYXRlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuCi0gICAgICogdGhlIGFyY2hpdmUgd2lsbCBub3QgYmUgc2lnbmVkLgotICAgICAqIEBwYXJhbSBvdXQgdGhlIHtAbGluayBPdXRwdXRTdHJlYW19IHdoZXJlIHRvIHdyaXRlIHRoZSBKYXIgYXJjaGl2ZS4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSB7QGxpbmsgUHJpdmF0ZUtleX0gdXNlZCB0byBzaWduIHRoZSBhcmNoaXZlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGUgdGhlIHtAbGluayBYNTA5Q2VydGlmaWNhdGV9IHVzZWQgdG8gc2lnbiB0aGUgYXJjaGl2ZSwgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU2lnbmVkSmFyQnVpbGRlcihPdXRwdXRTdHJlYW0gb3V0LCBQcml2YXRlS2V5IGtleSwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewotICAgICAgICBtT3V0cHV0SmFyID0gbmV3IEphck91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICBtT3V0cHV0SmFyLnNldExldmVsKDkpOwotICAgICAgICBtS2V5ID0ga2V5OwotICAgICAgICBtQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtS2V5ICE9IG51bGwgJiYgbUNlcnRpZmljYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NYW5pZmVzdCA9IG5ldyBNYW5pZmVzdCgpOwotICAgICAgICAgICAgQXR0cmlidXRlcyBtYWluID0gbU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBtYWluLnB1dFZhbHVlKCJNYW5pZmVzdC1WZXJzaW9uIiwgIjEuMCIpOwotICAgICAgICAgICAgbWFpbi5wdXRWYWx1ZSgiQ3JlYXRlZC1CeSIsICIxLjAgKEFuZHJvaWQpIik7Ci0gICAgCi0gICAgICAgICAgICBtQmFzZTY0RW5jb2RlciA9IG5ldyBCQVNFNjRFbmNvZGVyKCk7Ci0gICAgICAgICAgICBtTWVzc2FnZURpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoRElHRVNUX0FMR09SSVRITSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgbmV3IHtAbGluayBGaWxlfSBpbnRvIHRoZSBhcmNoaXZlLgotICAgICAqIEBwYXJhbSBpbnB1dEZpbGUgdGhlIHtAbGluayBGaWxlfSB0byB3cml0ZS4KLSAgICAgKiBAcGFyYW0gamFyUGF0aCB0aGUgZmlsZXBhdGggaW5zaWRlIHRoZSBhcmNoaXZlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpbGUoRmlsZSBpbnB1dEZpbGUsIFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBmaWxlLgotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHppcCBlbnRyeQotICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBuZXcgSmFyRW50cnkoamFyUGF0aCk7Ci0gICAgICAgICAgICBlbnRyeS5zZXRUaW1lKGlucHV0RmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlRW50cnkoZmlzLCBlbnRyeSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBjbG9zZSB0aGUgZmlsZSBzdHJlYW0gdXNlZCB0byByZWFkIHRoZSBmaWxlCi0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29udGVudCBvZiBhIEphci9aaXAgYXJjaGl2ZSBpbnRvIHRoZSByZWNlaXZlciBhcmNoaXZlLgotICAgICAqIDxwLz5BbiBvcHRpb25hbCB7QGxpbmsgSVppcEVudHJ5RmlsdGVyfSBhbGxvd3MgdG8gc2VsZWN0aXZlbHkgY2hvb3NlIHdoaWNoIGZpbGVzCi0gICAgICogdG8gY29weSBvdmVyLgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgdGhlIEphci9aaXAgdG8gY29weS4KLSAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVaaXAoSW5wdXRTdHJlYW0gaW5wdXQsIElaaXBFbnRyeUZpbHRlciBmaWx0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbnB1dCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGxvb3Agb24gdGhlIGVudHJpZXMgb2YgdGhlIGludGVybWVkaWFyeSBwYWNrYWdlIGFuZCBwdXQgdGhlbSBpbiB0aGUgZmluYWwgcGFja2FnZS4KLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCB0YWtlIGRpcmVjdG9yaWVzIG9yIGFueXRoaW5nIGluc2lkZSBhIHBvdGVudGlhbCBNRVRBLUlORiBmb2xkZXIuCi0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGZpbHRlciwgd2UgY2hlY2sgdGhlIGVudHJ5IGFnYWluc3QgaXQKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmNoZWNrRW50cnkobmFtZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIEphckVudHJ5IG5ld0VudHJ5OwotICAgIAotICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBTVE9SRUQgbWV0aG9kIG9mIHRoZSBpbnB1dCBlbnRyeS4KLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TWV0aG9kKCkgPT0gSmFyRW50cnkuU1RPUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5ID0gbmV3IEphckVudHJ5KGVudHJ5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZW50cnkgc28gdGhhdCB0aGUgY29tcHJlc3NlZCBsZW4gaXMgcmVjb21wdXRlZC4KLSAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkgPSBuZXcgSmFyRW50cnkobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdyaXRlRW50cnkoemlzLCBuZXdFbnRyeSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgemlzLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHppcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBKYXIgYXJjaGl2ZSBieSBjcmVhdGluZyB0aGUgbWFuaWZlc3QsIGFuZCBzaWduaW5nIHRoZSBhcmNoaXZlLiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1NYW5pZmVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgbWFuaWZlc3QgdG8gdGhlIGphciBmaWxlCi0gICAgICAgICAgICBtT3V0cHV0SmFyLnB1dE5leHRFbnRyeShuZXcgSmFyRW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKSk7Ci0gICAgICAgICAgICBtTWFuaWZlc3Qud3JpdGUobU91dHB1dEphcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENFUlQuU0YKLSAgICAgICAgICAgIFNpZ25hdHVyZSBzaWduYXR1cmUgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoIlNIQTF3aXRoIiArIG1LZXkuZ2V0QWxnb3JpdGhtKCkpOwotICAgICAgICAgICAgc2lnbmF0dXJlLmluaXRTaWduKG1LZXkpOwotICAgICAgICAgICAgbU91dHB1dEphci5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KCJNRVRBLUlORi9DRVJULlNGIikpOwotICAgICAgICAgICAgd3JpdGVTaWduYXR1cmVGaWxlKG5ldyBTaWduYXR1cmVPdXRwdXRTdHJlYW0obU91dHB1dEphciwgc2lnbmF0dXJlKSk7Ci0gICAgCi0gICAgICAgICAgICAvLyBDRVJULioKLSAgICAgICAgICAgIG1PdXRwdXRKYXIucHV0TmV4dEVudHJ5KG5ldyBKYXJFbnRyeSgiTUVUQS1JTkYvQ0VSVC4iICsgbUtleS5nZXRBbGdvcml0aG0oKSkpOwotICAgICAgICAgICAgd3JpdGVTaWduYXR1cmVCbG9jayhzaWduYXR1cmUsIG1DZXJ0aWZpY2F0ZSwgbUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1PdXRwdXRKYXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbnRyeSB0byB0aGUgb3V0cHV0IGphciwgYW5kIHdyaXRlIGl0cyBjb250ZW50IGZyb20gdGhlIHtAbGluayBJbnB1dFN0cmVhbX0KLSAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHN0cmVhbSBmcm9tIHdoZXJlIHRvIHdyaXRlIHRoZSBlbnRyeSBjb250ZW50LgotICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgdG8gd3JpdGUgaW4gdGhlIGphci4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRW50cnkoSW5wdXRTdHJlYW0gaW5wdXQsIEphckVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBhZGQgdGhlIGVudHJ5IHRvIHRoZSBqYXIgYXJjaGl2ZQotICAgICAgICBtT3V0cHV0SmFyLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0KLSAgICAgICAgLy8gcmVhZCB0aGUgY29udGVudCBvZiB0aGUgZW50cnkgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbmQgd3JpdGUgaXQgaW50byB0aGUgYXJjaGl2ZS4KLSAgICAgICAgaW50IGNvdW50OyAKLSAgICAgICAgd2hpbGUgKChjb3VudCA9IGlucHV0LnJlYWQobUJ1ZmZlcikpICE9IC0xKSB7Ci0gICAgICAgICAgICBtT3V0cHV0SmFyLndyaXRlKG1CdWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkaWdlc3QKLSAgICAgICAgICAgIGlmIChtTWVzc2FnZURpZ2VzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lc3NhZ2VEaWdlc3QudXBkYXRlKG1CdWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNsb3NlIHRoZSBlbnRyeSBmb3IgdGhpcyBmaWxlCi0gICAgICAgIG1PdXRwdXRKYXIuY2xvc2VFbnRyeSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1NYW5pZmVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1hbmlmZXN0IGZvciB0aGlzIGVudHJ5LgotICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyID0gbU1hbmlmZXN0LmdldEF0dHJpYnV0ZXMoZW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyID0gbmV3IEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBtTWFuaWZlc3QuZ2V0RW50cmllcygpLnB1dChlbnRyeS5nZXROYW1lKCksIGF0dHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ci5wdXRWYWx1ZShESUdFU1RfQVRUUiwgbUJhc2U2NEVuY29kZXIuZW5jb2RlKG1NZXNzYWdlRGlnZXN0LmRpZ2VzdCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIFdyaXRlcyBhIC5TRiBmaWxlIHdpdGggYSBkaWdlc3QgdG8gdGhlIG1hbmlmZXN0LiAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVNpZ25hdHVyZUZpbGUoT3V0cHV0U3RyZWFtIG91dCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgTWFuaWZlc3Qgc2YgPSBuZXcgTWFuaWZlc3QoKTsKLSAgICAgICAgQXR0cmlidXRlcyBtYWluID0gc2YuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgbWFpbi5wdXRWYWx1ZSgiU2lnbmF0dXJlLVZlcnNpb24iLCAiMS4wIik7Ci0gICAgICAgIG1haW4ucHV0VmFsdWUoIkNyZWF0ZWQtQnkiLCAiMS4wIChBbmRyb2lkKSIpOwotCi0gICAgICAgIEJBU0U2NEVuY29kZXIgYmFzZTY0ID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgICAgTWVzc2FnZURpZ2VzdCBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoRElHRVNUX0FMR09SSVRITSk7Ci0gICAgICAgIFByaW50U3RyZWFtIHByaW50ID0gbmV3IFByaW50U3RyZWFtKAotICAgICAgICAgICAgICAgIG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0obmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLCBtZCksCi0gICAgICAgICAgICAgICAgdHJ1ZSwgIlVURi04Iik7Ci0KLSAgICAgICAgLy8gRGlnZXN0IG9mIHRoZSBlbnRpcmUgbWFuaWZlc3QKLSAgICAgICAgbU1hbmlmZXN0LndyaXRlKHByaW50KTsKLSAgICAgICAgcHJpbnQuZmx1c2goKTsKLSAgICAgICAgbWFpbi5wdXRWYWx1ZShESUdFU1RfTUFOSUZFU1RfQVRUUiwgYmFzZTY0LmVuY29kZShtZC5kaWdlc3QoKSkpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZXM+IGVudHJpZXMgPSBtTWFuaWZlc3QuZ2V0RW50cmllcygpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEF0dHJpYnV0ZXM+IGVudHJ5IDogZW50cmllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAvLyBEaWdlc3Qgb2YgdGhlIG1hbmlmZXN0IHN0YW56YSBmb3IgdGhpcyBlbnRyeS4KLSAgICAgICAgICAgIHByaW50LnByaW50KCJOYW1lOiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiXHJcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGF0dCA6IGVudHJ5LmdldFZhbHVlKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIHByaW50LnByaW50KGF0dC5nZXRLZXkoKSArICI6ICIgKyBhdHQuZ2V0VmFsdWUoKSArICJcclxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludC5wcmludCgiXHJcbiIpOwotICAgICAgICAgICAgcHJpbnQuZmx1c2goKTsKLQotICAgICAgICAgICAgQXR0cmlidXRlcyBzZkF0dHIgPSBuZXcgQXR0cmlidXRlcygpOwotICAgICAgICAgICAgc2ZBdHRyLnB1dFZhbHVlKERJR0VTVF9BVFRSLCBiYXNlNjQuZW5jb2RlKG1kLmRpZ2VzdCgpKSk7Ci0gICAgICAgICAgICBzZi5nZXRFbnRyaWVzKCkucHV0KGVudHJ5LmdldEtleSgpLCBzZkF0dHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2Yud3JpdGUob3V0KTsKLSAgICB9Ci0KLSAgICAvKiogV3JpdGUgdGhlIGNlcnRpZmljYXRlIGZpbGUgd2l0aCBhIGRpZ2l0YWwgc2lnbmF0dXJlLiAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVNpZ25hdHVyZUJsb2NrKFNpZ25hdHVyZSBzaWduYXR1cmUsIFg1MDlDZXJ0aWZpY2F0ZSBwdWJsaWNLZXksCi0gICAgICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpZ25lckluZm8gc2lnbmVySW5mbyA9IG5ldyBTaWduZXJJbmZvKAotICAgICAgICAgICAgICAgIG5ldyBYNTAwTmFtZShwdWJsaWNLZXkuZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgcHVibGljS2V5LmdldFNlcmlhbE51bWJlcigpLAotICAgICAgICAgICAgICAgIEFsZ29yaXRobUlkLmdldChESUdFU1RfQUxHT1JJVEhNKSwKLSAgICAgICAgICAgICAgICBBbGdvcml0aG1JZC5nZXQocHJpdmF0ZUtleS5nZXRBbGdvcml0aG0oKSksCi0gICAgICAgICAgICAgICAgc2lnbmF0dXJlLnNpZ24oKSk7Ci0KLSAgICAgICAgUEtDUzcgcGtjczcgPSBuZXcgUEtDUzcoCi0gICAgICAgICAgICAgICAgbmV3IEFsZ29yaXRobUlkW10geyBBbGdvcml0aG1JZC5nZXQoRElHRVNUX0FMR09SSVRITSkgfSwKLSAgICAgICAgICAgICAgICBuZXcgQ29udGVudEluZm8oQ29udGVudEluZm8uREFUQV9PSUQsIG51bGwpLAotICAgICAgICAgICAgICAgIG5ldyBYNTA5Q2VydGlmaWNhdGVbXSB7IHB1YmxpY0tleSB9LAotICAgICAgICAgICAgICAgIG5ldyBTaWduZXJJbmZvW10geyBzaWduZXJJbmZvIH0pOwotCi0gICAgICAgIHBrY3M3LmVuY29kZVNpZ25lZERhdGEobU91dHB1dEphcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzLy5jbGFzc3BhdGggYi90b29scy9sYXlvdXRsaWJfdXRpbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyMWM0My4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRsaWJfdXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2xheW91dGxpYl9hcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzLy5naXRpZ25vcmUgYi90b29scy9sYXlvdXRsaWJfdXRpbHMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5OTUwNS4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRsaWJfdXRpbHMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYl91dGlscy8ucHJvamVjdCBiL3Rvb2xzL2xheW91dGxpYl91dGlscy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyNzgwOS4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRsaWJfdXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5sYXlvdXRsaWJfdXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzL0FuZHJvaWQubWsgYi90b29scy9sYXlvdXRsaWJfdXRpbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlYjBmZi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRsaWJfdXRpbHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlcixzcmMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlsYXlvdXRsaWJfYXBpCi0KLUxPQ0FMX01PRFVMRSA6PSBsYXlvdXRsaWJfdXRpbHMKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvRGVuc2l0eUJhc2VkUmVzb3VyY2VWYWx1ZS5qYXZhIGIvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvRGVuc2l0eUJhc2VkUmVzb3VyY2VWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRlNDYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dGxpYl91dGlscy9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL3V0aWxzL0RlbnNpdHlCYXNlZFJlc291cmNlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSURlbnNpdHlCYXNlZFJlc291cmNlVmFsdWU7Ci0KLXB1YmxpYyBjbGFzcyBEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlIGV4dGVuZHMgUmVzb3VyY2VWYWx1ZSBpbXBsZW1lbnRzIElEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlIHsKLQotICAgIHByaXZhdGUgRGVuc2l0eSBtRGVuc2l0eTsKLQotICAgIHB1YmxpYyBEZW5zaXR5QmFzZWRSZXNvdXJjZVZhbHVlKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBEZW5zaXR5IGRlbnNpdHksCi0gICAgICAgICAgICBib29sZWFuIGlzRnJhbWV3b3JrKSB7Ci0gICAgICAgIHN1cGVyKHR5cGUsIG5hbWUsIHZhbHVlLCBpc0ZyYW1ld29yayk7Ci0gICAgICAgIG1EZW5zaXR5ID0gZGVuc2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVuc2l0eSBnZXREZW5zaXR5KCkgewotICAgICAgICByZXR1cm4gbURlbnNpdHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvUmVzb3VyY2VWYWx1ZS5qYXZhIGIvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvUmVzb3VyY2VWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI0ZGU2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dGxpYl91dGlscy9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL3V0aWxzL1Jlc291cmNlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVJlc291cmNlVmFsdWU7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVZhbHVlIGltcGxlbWVudHMgSVJlc291cmNlVmFsdWUgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UeXBlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0ZyYW13b3JrOwotICAgIAotICAgIHB1YmxpYyBSZXNvdXJjZVZhbHVlKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0ZyYW13b3JrKSB7Ci0gICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICBtSXNGcmFtd29yayA9IGlzRnJhbXdvcms7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlVmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaXNGcmFtZXdvcmspIHsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgICAgICBtSXNGcmFtd29yayA9IGlzRnJhbWV3b3JrOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbVZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VXaXRoKFJlc291cmNlVmFsdWUgdmFsdWUpIHsKLSAgICAgICAgbVZhbHVlID0gdmFsdWUubVZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrKCkgewotICAgICAgICByZXR1cm4gbUlzRnJhbXdvcms7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvU3R5bGVSZXNvdXJjZVZhbHVlLmphdmEgYi90b29scy9sYXlvdXRsaWJfdXRpbHMvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi91dGlscy9TdHlsZVJlc291cmNlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYWMxYi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRsaWJfdXRpbHMvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi91dGlscy9TdHlsZVJlc291cmNlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi51dGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5hcGkuSVJlc291cmNlVmFsdWU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmFwaS5JU3R5bGVSZXNvdXJjZVZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHlsZVJlc291cmNlVmFsdWUgZXh0ZW5kcyBSZXNvdXJjZVZhbHVlIGltcGxlbWVudHMgSVN0eWxlUmVzb3VyY2VWYWx1ZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGFyZW50U3R5bGUgPSBudWxsOwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPiBtSXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElSZXNvdXJjZVZhbHVlPigpOwotCi0gICAgcHVibGljIFN0eWxlUmVzb3VyY2VWYWx1ZShTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNGcmFtZXdvcmspIHsKLSAgICAgICAgc3VwZXIodHlwZSwgbmFtZSwgaXNGcmFtZXdvcmspOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHlsZVJlc291cmNlVmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50U3R5bGUsIGJvb2xlYW4gaXNGcmFtZXdvcmspIHsKLSAgICAgICAgc3VwZXIodHlwZSwgbmFtZSwgaXNGcmFtZXdvcmspOwotICAgICAgICBtUGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudFN0eWxlKCkgewotICAgICAgICByZXR1cm4gbVBhcmVudFN0eWxlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVJlc291cmNlVmFsdWUgZmluZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW0oSVJlc291cmNlVmFsdWUgdmFsdWUpIHsKLSAgICAgICAgbUl0ZW1zLnB1dCh2YWx1ZS5nZXROYW1lKCksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVdpdGgoUmVzb3VyY2VWYWx1ZSB2YWx1ZSkgewotICAgICAgICBzdXBlci5yZXBsYWNlV2l0aCh2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHlsZVJlc291cmNlVmFsdWUpIHsKLSAgICAgICAgICAgIG1JdGVtcy5jbGVhcigpOwotICAgICAgICAgICAgbUl0ZW1zLnB1dEFsbCgoKFN0eWxlUmVzb3VyY2VWYWx1ZSl2YWx1ZSkubUl0ZW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvVmFsdWVSZXNvdXJjZVBhcnNlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliX3V0aWxzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvdXRpbHMvVmFsdWVSZXNvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgyZDkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dGxpYl91dGlscy9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL3V0aWxzL1ZhbHVlUmVzb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5sYXlvdXRsaWIudXRpbHM7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFNBWCBoYW5kbGVyIHRvIHBhcnNlciB2YWx1ZSByZXNvdXJjZSBmaWxlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbHVlUmVzb3VyY2VQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLSAgICAvLyBUT0RPOiByZXVzZSBkZWZpbml0aW9ucyBmcm9tIHNvbWV3aGVyZSBlbHNlLgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX1JFU09VUkNFUyA9ICJyZXNvdXJjZXMiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0lURU0gPSAiaXRlbSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1BBUkVOVCA9ICJwYXJlbnQiOwotICAgIAotICAgIC8vIFJlc291cmNlIHR5cGUgZGVmaW5pdGlvbgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRVNfU1RZTEUgPSAic3R5bGUiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRVNfQVRUUiA9ICJhdHRyIjsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OU19QUkVGSVggPSAiYW5kcm9pZDoiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX05TX1BSRUZJWF9MRU4gPSBERUZBVUxUX05TX1BSRUZJWC5sZW5ndGgoKTsKLSAgICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElWYWx1ZVJlc291cmNlUmVwb3NpdG9yeSB7Ci0gICAgICAgIHZvaWQgYWRkUmVzb3VyY2VWYWx1ZShTdHJpbmcgcmVzVHlwZSwgUmVzb3VyY2VWYWx1ZSB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpblJlc291cmNlcyA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IG1EZXB0aCA9IDA7Ci0gICAgcHJpdmF0ZSBTdHlsZVJlc291cmNlVmFsdWUgbUN1cnJlbnRTdHlsZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZVZhbHVlIG1DdXJyZW50VmFsdWUgPSBudWxsOwotICAgIHByaXZhdGUgSVZhbHVlUmVzb3VyY2VSZXBvc2l0b3J5IG1SZXBvc2l0b3J5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNGcmFtZXdvcms7Ci0gICAgCi0gICAgcHVibGljIFZhbHVlUmVzb3VyY2VQYXJzZXIoSVZhbHVlUmVzb3VyY2VSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGJvb2xlYW4gaXNGcmFtZXdvcmspIHsKLSAgICAgICAgbVJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotICAgICAgICBtSXNGcmFtZXdvcmsgPSBpc0ZyYW1ld29yazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtQ3VycmVudFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VmFsdWUuc2V0VmFsdWUodHJpbVhtbFdoaXRlc3BhY2VzKG1DdXJyZW50VmFsdWUuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5SZXNvdXJjZXMgJiYgcU5hbWUuZXF1YWxzKE5PREVfUkVTT1VSQ0VTKSkgewotICAgICAgICAgICAgaW5SZXNvdXJjZXMgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtRGVwdGggPT0gMikgewotICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBtQ3VycmVudFN0eWxlID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChtRGVwdGggPT0gMykgewotICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1EZXB0aC0tOwotICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtRGVwdGgrKzsKLSAgICAgICAgICAgIGlmIChpblJlc291cmNlcyA9PSBmYWxzZSAmJiBtRGVwdGggPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMoTk9ERV9SRVNPVVJDRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluUmVzb3VyY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1EZXB0aCA9PSAyICYmIGluUmVzb3VyY2VzID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbm9kZSBpcyA8aXRlbT4sIHdlIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBhdHRyaWJ1dGUgInR5cGUiCi0gICAgICAgICAgICAgICAgaWYgKE5PREVfSVRFTS5lcXVhbHMocU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBxTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSRVNfQVRUUi5lcXVhbHModHlwZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFU19TVFlMRS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9QQVJFTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0eWxlID0gbmV3IFN0eWxlUmVzb3VyY2VWYWx1ZSh0eXBlLCBuYW1lLCBwYXJlbnQsIG1Jc0ZyYW1ld29yayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXBvc2l0b3J5LmFkZFJlc291cmNlVmFsdWUodHlwZSwgbUN1cnJlbnRTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IG5ldyBSZXNvdXJjZVZhbHVlKHR5cGUsIG5hbWUsIG1Jc0ZyYW1ld29yayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXBvc2l0b3J5LmFkZFJlc291cmNlVmFsdWUodHlwZSwgbUN1cnJlbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRGVwdGggPT0gMyAmJiBtQ3VycmVudFN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lIGNhbiwgaW4gc29tZSBjYXNlcywgY29udGFpbiBhIHByZWZpeCEgd2UgcmVtb3ZlIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKERFRkFVTFRfTlNfUFJFRklYKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKERFRkFVTFRfTlNfUFJFRklYX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZSA9IG5ldyBSZXNvdXJjZVZhbHVlKG51bGwsIG5hbWUsIG1Jc0ZyYW1ld29yayk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3R5bGUuYWRkSXRlbShtQ3VycmVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbUN1cnJlbnRWYWx1ZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlLnNldFZhbHVlKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZS5zZXRWYWx1ZSh2YWx1ZSArIG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltWG1sV2hpdGVzcGFjZXMoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb2sgZm9yIGNhcnJpYWdlIHJldHVybiBhbmQgcmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBhcm91bmQgaXQgYnkganVzdCAxIHNwYWNlLgotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoKGluZGV4ID0gdmFsdWUuaW5kZXhPZignXG4nKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHdoaXRlc3BhY2Ugb24gZWFjaCBzaWRlCi0gICAgICAgICAgICBpbnQgbGVmdCA9IGluZGV4IC0gMTsKLSAgICAgICAgICAgIHdoaWxlIChsZWZ0ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh2YWx1ZS5jaGFyQXQobGVmdCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQtLTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByaWdodCA9IGluZGV4ICsgMTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgd2hpbGUgKHJpZ2h0IDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh2YWx1ZS5jaGFyQXQocmlnaHQpKSkgewotICAgICAgICAgICAgICAgICAgICByaWdodCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IChub24gaW5jbHVzaXZlKSBhbmQgcmVwbGFjZSBieSBhIHNpbmdsZSBzcGFjZS4KLSAgICAgICAgICAgIFN0cmluZyBsZWZ0U3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChsZWZ0ID49IDApIHsKLSAgICAgICAgICAgICAgICBsZWZ0U3RyaW5nID0gdmFsdWUuc3Vic3RyaW5nKDAsIGxlZnQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyByaWdodFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocmlnaHQgPCBjb3VudCkgewotICAgICAgICAgICAgICAgIHJpZ2h0U3RyaW5nID0gdmFsdWUuc3Vic3RyaW5nKHJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxlZnRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gbGVmdFN0cmluZzsKLSAgICAgICAgICAgICAgICBpZiAocmlnaHRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAiICIgKyByaWdodFN0cmluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gcmlnaHRTdHJpbmcgIT0gbnVsbCA/IHJpZ2h0U3RyaW5nIDogIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyB3ZSB1bi1lc2NhcGUgdGhlIHN0cmluZwotICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWZmZXIgPSB2YWx1ZS50b0NoYXJBcnJheSgpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICdcXCcgJiYgaSArIDEgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW2krMV0gPT0gJ3UnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgNSA8IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB1bmljb2RlIGNoYXIgXHUxMjM0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5pY29kZUNoYXIgPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcoYnVmZmVyLCBpKzIsIDQpLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgdW5pY29kZSBjaGFyIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKGNoYXIpdW5pY29kZUNoYXI7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciBzaW5jZSB3ZSBnbyBmcm9tIDYgdG8gMSBjaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDYgPCBidWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGkrNiwgYnVmZmVyLCBpKzEsIGxlbmd0aCAtIGkgLSA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSA1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpKzFdID09ICduJykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgJ24nIGNoYXIgd2l0aCBcbgotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2krMV0gPSAnXG4nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdGhlIGJ1ZmZlciB0byBlcmFzZSB0aGUgXAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgaSsxLCBidWZmZXIsIGksIGxlbmd0aCAtIGkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L0FuZHJvaWQubWsgYi90b29scy9sYXlvdXRvcHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiMmRjZi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MQVlPVVRPUFRfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoTEFZT1VUT1BUX0xPQ0FMX0RJUikvbGlicy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoTEFZT1VUT1BUX0xPQ0FMX0RJUikvYXBwL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvdG9vbHMvbGF5b3V0b3B0L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2FwcC9BbmRyb2lkLm1rIGIvdG9vbHMvbGF5b3V0b3B0L2FwcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFlMzQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9hcHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MQVlPVVRPUFRfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoTEFZT1VUT1BUX0xPQ0FMX0RJUikvZXRjL0FuZHJvaWQubWsKLWluY2x1ZGUgJChMQVlPVVRPUFRfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2FwcC9SRUFETUUgYi90b29scy9sYXlvdXRvcHQvYXBwL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExODAyMi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvYXBwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTGF5b3V0IG9wdGltaXplci4KLQotU2ltcGxlIGNvbW1hbmQgbGluZSBmcm9udCBlbmQgZm9yIHRoZSB1aXggbGlicmFyeS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9BbmRyb2lkLm1rIGIvdG9vbHMvbGF5b3V0b3B0L2FwcC9ldGMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwOGY5ZC4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9QUkVCVUlMVF9FWEVDVVRBQkxFUyA6PSBsYXlvdXRvcHQKLWluY2x1ZGUgJChCVUlMRF9IT1NUX1BSRUJVSUxUKQotCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9sYXlvdXRvcHQgYi90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9sYXlvdXRvcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZWJiNjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2FwcC9ldGMvbGF5b3V0b3B0CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyEvYmluL3NoCi0jIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCi0jIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCi1wcm9nPSIkMCIKLXdoaWxlIFsgLWggIiR7cHJvZ30iIF07IGRvCi0gICAgbmV3UHJvZz1gL2Jpbi9scyAtbGQgIiR7cHJvZ30iYAotICAgIG5ld1Byb2c9YGV4cHIgIiR7bmV3UHJvZ30iIDogIi4qIC0+IFwoLipcKSQiYAotICAgIGlmIGV4cHIgIngke25ld1Byb2d9IiA6ICd4LycgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICBwcm9nPSIke25ld1Byb2d9IgotICAgIGVsc2UKLSAgICAgICAgcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi0gICAgICAgIHByb2c9IiR7cHJvZ2Rpcn0vJHtuZXdQcm9nfSIKLSAgICBmaQotZG9uZQotb2xkd2Q9YHB3ZGAKLXByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotY2QgIiR7cHJvZ2Rpcn0iCi1wcm9nZGlyPWBwd2RgCi1wcm9nPSIke3Byb2dkaXJ9Ii9gYmFzZW5hbWUgIiR7cHJvZ30iYAotY2QgIiR7b2xkd2R9IgotCi1qYXJmaWxlPWxheW91dG9wdC5qYXIKLWZyYW1ld29ya2Rpcj0iJHByb2dkaXIiCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICRqYXJmaWxlIgotICAgIGV4aXQgMQotZmkKLQotaWYgWyAiJE9TVFlQRSIgPSAiY3lnd2luIiBdIDsgdGhlbgotICAgIGphcnBhdGg9YGN5Z3BhdGggLXcgICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlImAKLSAgICBwcm9nZGlyPWBjeWdwYXRoIC13ICAiJHByb2dkaXIiYAotZWxzZQotICAgIGphcnBhdGg9IiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiCi1maQotCi0jIG5lZWQgdG8gdXNlICJqYXZhLmV4dC5kaXJzIiBiZWNhdXNlICItamFyIiBjYXVzZXMgY2xhc3NwYXRoIHRvIGJlIGlnbm9yZWQKLSMgbWlnaHQgbmVlZCBtb3JlIG1lbW9yeSwgZS5nLiAtWG14MTI4TQotZXhlYyBqYXZhIC1EamF2YS5leHQuZGlycz0iJGZyYW1ld29ya2RpciIgLWphciAiJGphcnBhdGgiICIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9hcHAvZXRjL2xheW91dG9wdC5iYXQgYi90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9sYXlvdXRvcHQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWViN2IzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9hcHAvZXRjL2xheW91dG9wdC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotcmVtCi1yZW0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1yZW0geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotcmVtIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotcmVtCi1yZW0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIGRvbid0IG1vZGlmeSB0aGUgY2FsbGVyJ3MgZW52aXJvbm1lbnQKLXNldGxvY2FsCi0KLXJlbSBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLXJlbSBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5Lgotc2V0IHByb2c9JX5mMAotCi1yZW0gQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBkcml2ZSB0byB3aGVyZSB0aGUgc2NyaXB0IGlzLCB0byBhdm9pZAotcmVtIGlzc3VlcyB3aXRoIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgd2hpdGVzcGFjZXMuCi1jZCAvZCAlfmRwMAotCi1zZXQgamFyZmlsZT1sYXlvdXRvcHQuamFyCi1zZXQgZnJhbWV3b3JrZGlyPQotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9bGliXAotCi1pZiBleGlzdCAlZnJhbWV3b3JrZGlyJSVqYXJmaWxlJSBnb3RvIEphckZpbGVPawotICAgIHNldCBmcmFtZXdvcmtkaXI9Li5cZnJhbWV3b3JrXAotCi06SmFyRmlsZU9rCi0KLWlmIGRlYnVnIE5FUSAiJTEiIGdvdG8gTm9EZWJ1ZwotICAgIHNldCBqYXZhX2RlYnVnPS1hZ2VudGxpYjpqZHdwPXRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksYWRkcmVzcz04MDUwLHN1c3BlbmQ9eQotICAgIHNoaWZ0IDEKLTpOb0RlYnVnCi0KLXNldCBqYXJwYXRoPSVmcmFtZXdvcmtkaXIlJWphcmZpbGUlCi0KLXNldCBqYXZhZXh0ZGlycz0lc3d0X3BhdGglOyVmcmFtZXdvcmtkaXIlCi0KLWNhbGwgamF2YSAlamF2YV9kZWJ1ZyUgLURqYXZhLmV4dC5kaXJzPSVqYXZhZXh0ZGlycyUgJWphcnBhdGglICUqCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9hcHAvZXRjL21hbmlmZXN0LnR4dCBiL3Rvb2xzL2xheW91dG9wdC9hcHAvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwYWZkZi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvYXBwL2V0Yy9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmxheW91dG9wdC5jbGkuTWFpbgotQ2xhc3MtUGF0aDogZ3Jvb3Z5LWFsbC0xLjYuNS5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9hcHAvc3JjL0FuZHJvaWQubWsgYi90b29scy9sYXlvdXRvcHQvYXBwL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFhZGRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9hcHAvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSByZXNvdXJjZXMKLQotTE9DQUxfSkFSX01BTklGRVNUIDo9IC4uL2V0Yy9tYW5pZmVzdC50eHQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQl1aXgKLUxPQ0FMX01PRFVMRSA6PSBsYXlvdXRvcHQKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvYXBwL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvY2xpL01haW4uamF2YSBiL3Rvb2xzL2xheW91dG9wdC9hcHAvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC9jbGkvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc1YWEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9hcHAvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC9jbGkvTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dG9wdC5jbGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4LkxheW91dEFuYWx5emVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBDb21tYW5kIGxpbmUgdXRpbGl0eSBmb3IgdGhlIHVpeCBsaWJyYXJ5LgotICoKLSAqIFRoaXMgaXMgYSBzaW1wbGUgQ0xJIGZyb250LWVuZCBmb3IgdGhlIHVpeCBsaWJyYXJ5LCB1c2VkIHRvCi0gKiBhbmFseXplIGFuZCBvcHRpbWl6ZSBBbmRyb2lkIGxheW91dCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotICAgIC8qKgotICAgICAqIE1haW4gZW50cnkgcG9pbnQgb2YgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MgT25lIG1hbmRhdG9yeSBwYXJhbWV0ZXIsIGEgcGF0aCAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpCi0gICAgICogICAgICAgICAgICAgdG8gYW4gQW5kcm9pZCBYTUwgbGF5b3V0IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFBhcmFtZXRlcnMgcCA9IGNoZWNrUGFyYW1ldGVycyhhcmdzKTsKLSAgICAgICAgaWYgKCFwLnZhbGlkKSB7Ci0gICAgICAgICAgICBkaXNwbGF5SGVscE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGV4aXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFuYWx5emVGaWxlcyhwLmZpbGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFuYWx5emVGaWxlcyhGaWxlW10gZmlsZXMpIHsKLSAgICAgICAgTGF5b3V0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgTGF5b3V0QW5hbHl6ZXIoKTsKLSAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkgewotICAgICAgICAgICAgICAgIGFuYWx5emUoYW5hbHl6ZXIsIGZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBhbmFseXplRmlsZXMoZmlsZS5saXN0RmlsZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFuYWx5emUoTGF5b3V0QW5hbHl6ZXIgYW5hbHl6ZXIsIEZpbGUgZmlsZSkgewotICAgICAgICBMYXlvdXRBbmFseXNpcyBhbmFseXNpcyA9IGFuYWx5emVyLmFuYWx5emUoZmlsZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbmFseXNpcy5nZXROYW1lKCkpOwotICAgICAgICBmb3IgKExheW91dEFuYWx5c2lzLklzc3VlIGlzc3VlIDogYW5hbHlzaXMuZ2V0SXNzdWVzKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoU3RyaW5nLmZvcm1hdCgiXHQlZDolZCAiLCBpc3N1ZS5nZXRTdGFydExpbmUoKSwgaXNzdWUuZ2V0RW5kTGluZSgpKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXNzdWUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGl0cyB0aGUgdG9vbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXlzIHRoaXMgdG9vbCdzIGhlbHAgbWVzc2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGlzcGxheUhlbHBNZXNzYWdlKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBsYXlvdXRvcHQgPGRpcmVjdG9yaWVzL2ZpbGVzIHRvIGFuYWx5emU+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgdmFsaWQgUGFyYW1ldGVycyBvYmplY3QuIFBhcnNlcyB0aGUgcGFyYW10ZXJzIGlmIG5lY2Vzc2FyeQotICAgICAqIGFuZCBjaGVja3MgZm9yIGVycm9ycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIFRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBDTEkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGFyYW1ldGVycyBjaGVja1BhcmFtZXRlcnMoU3RyaW5nW10gYXJncykgewotICAgICAgICBQYXJhbWV0ZXJzIHAgPSBuZXcgUGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLSAgICAgICAgICAgIHAudmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogYXJncykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIChmaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAuZmlsZXMgPSBmaWxlcy50b0FycmF5KG5ldyBGaWxlW2ZpbGVzLnNpemUoKV0pOwotICAgICAgICAgICAgcC52YWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJhbWV0ZXJzIHBhcnNlZCBmcm9tIHRoZSBDTEkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyYW1ldGVycyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUcnVlIGlmIHRoaXMgbGlzdCBvZiBwYXJhbWV0ZXJzIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIHZhbGlkOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXRocyAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpIHRvIHRoZSBmaWxlcyB0byBiZSBhbmFseXplZC4KLSAgICAgICAgICovCi0gICAgICAgIEZpbGVbXSBmaWxlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy9BbmRyb2lkLm1rIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4Mjk5YS4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLVVJWF9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChVSVhfTE9DQUxfRElSKS91aXgvQW5kcm9pZC5tawotCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvQW5kcm9pZC5tayBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0ZTU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLVVJWF9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChVSVhfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9BbmRyb2lkLm1rIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFiY2JjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlc291cmNlcwotCi1MT0NBTF9NT0RVTEUgOj0gdWl4Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0JZ3Jvb3Z5LWFsbC0xLjYuNQotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvTGF5b3V0QW5hbHlzaXMuamF2YSBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC9MYXlvdXRBbmFseXNpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZmMGI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC9MYXlvdXRBbmFseXNpcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguZ3Jvb3Z5LkxheW91dEFuYWx5c2lzQ2F0ZWdvcnk7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHJlc3VsdHMgb2YgYSBsYXlvdXQgYW5hbHlzaXMuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZQotICogZ2VuZXJhdGVkIGJ5IHtAbGluayBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4LkxheW91dEFuYWx5emVyfS4KLSAqCi0gKiBAc2VlIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHl6ZXIKLSAqLwotcHVibGljIGNsYXNzIExheW91dEFuYWx5c2lzIHsKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGxheW91dCBhbmFseXNpcyB1c2VkIHRvIGRlc2NyaWJlIGEgcHJvYmxlbSB3aXRoIHRoZQotICAgICAqIGFuYWx5c2lzIHByb2Nlc3MuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIExheW91dEFuYWx5c2lzIEVSUk9SID0gbmV3IExheW91dEFuYWx5c2lzKCIiKTsKLSAgICBzdGF0aWMgewotICAgICAgICBFUlJPUi5tQW5hbHl6ZWQgPSBmYWxzZTsKLSAgICAgICAgRVJST1IuYWRkSXNzdWUoIlRoZSBsYXlvdXQgY291bGQgbm90IGJlIGFuYWx5emVkLiBDaGVjayBpZiB5b3Ugc3BlY2lmaWVkIGEgdmFsaWQgIgotICAgICAgICAgICAgICAgICsgIlhNTCBsYXlvdXQsIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBleGlzdHMsIGV0Yy4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SXNzdWU+IG1Jc3N1ZXMgPSBuZXcgQXJyYXlMaXN0PElzc3VlPigpOwotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQW5hbHl6ZWQ7Ci0gICAgcHJpdmF0ZSBOb2RlIG1Ob2RlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhbmFseXNpcy4gQW4gYW5hbHlzaXMgaXMgYWx3YXlzIGNvbnNpZGVyZWQgaW52YWxpZCBieSBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHNlZSAjdmFsaWRhdGUoKQotICAgICAqIEBzZWUgI2lzVmFsaWQoKSAKLSAgICAgKi8KLSAgICBMYXlvdXRBbmFseXNpcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGFuYWx5c2lzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaXNzdWUgdG8gdGhlIGxheW91dCBhbmFseXNpcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpc3N1ZSBUaGUgaXNzdWUgdG8gYWRkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZElzc3VlKElzc3VlIGlzc3VlKSB7Ci0gICAgICAgIG1Jc3N1ZXMuYWRkKGlzc3VlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGlzc3VlIHRvIHRoZSBsYXlvdXQgYW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGlzc3VlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZElzc3VlKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtSXNzdWVzLmFkZChuZXcgSXNzdWUobU5vZGUsIGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBpc3N1ZSB0byB0aGUgbGF5b3V0IGFuYWx5c2lzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgY29udGFpbmluZyB0aGUgaXNzdWUuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBpc3N1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJc3N1ZShOb2RlIG5vZGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtSXNzdWVzLmFkZChuZXcgSXNzdWUobm9kZSwgZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGlzc3VlcyBmb3VuZCBkdXJpbmcgdGhlIGFuYWx5c2lzLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG5vbi1udWxsIGFycmF5IG9mIHtAbGluayBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4LkxheW91dEFuYWx5c2lzLklzc3VlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXNzdWVbXSBnZXRJc3N1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtSXNzdWVzLnRvQXJyYXkobmV3IElzc3VlW21Jc3N1ZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxheW91dCB3YXMgYW5hbHl6ZWQuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsCi0gICAgICogYSBwcm9ibGVtZSBvY2N1cmVkIGR1cmluZyB0aGUgYW5hbHlzaXMgKG1pc3NpbmcgZmlsZSwgaW52YWxpZCBkb2N1bWVudCwgZXRjLikKLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5b3V0IHdhcyBhbmFseXplZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtQW5hbHl6ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBhbmFseXNpcy4gVGhpcyBtdXN0IGJlIGNhbGwgYmVmb3JlIHRoaXMgYW5hbHlzaXMgY2FuCi0gICAgICogYmUgY29uc2lkZXJlZCB2YWxpZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCByZXNldHMgdGhlIGN1cnJlbnQgbm9kZSB0byBudWxsLgotICAgICAqIAotICAgICAqIEBzZWUgI3NldEN1cnJlbnROb2RlKG9yZy53M2MuZG9tLk5vZGUpIAotICAgICAqLwotICAgIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgIG1BbmFseXplZCA9IHRydWU7Ci0gICAgICAgIG1Ob2RlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IG5vZGUgdG8gYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBjcmVhdGVkIGlzc3Vlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZSBBbiBYTUwgbm9kZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldEN1cnJlbnROb2RlKE5vZGUgbm9kZSkgewotICAgICAgICBtTm9kZSA9IG5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhbiBpc3N1ZSBkaXNjb3ZlcmVkIGR1cmluZyB0aGUgYW5hbHlzaXMgcHJvY2Vzcy4KLSAgICAgKiBBbiBpc3N1ZSBwcm92aWRlcyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGFzIHdlbGwgYXMgb3B0aW9uYWwgc29sdXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSXNzdWUgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTm9kZSBtTm9kZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpc3N1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpc3N1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJc3N1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1Ob2RlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRlc2NyaXB0aW9uIG11c3QgYmUgbm9uLW51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaXNzdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGRlc2NyaXB0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgaW4gd2hpY2ggdGhlIGlzc3VlIHdhcyBmb3VuZC4KLSAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaXNzdWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSXNzdWUoTm9kZSBub2RlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1Ob2RlID0gbm9kZTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRlc2NyaXB0aW9uIG11c3QgYmUgbm9uLW51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlc2NyaWJlcyB0aGlzIGlzc3VlIHRvIHRoZSB1c2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIGlzc3VlLCBhbHdheXMgbm9uLW51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IGxpbmUgb2YgdGhpcyBub2RlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBsaW5lIG9yIC0xIGlmIHRoZSBsaW5lIGlzIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBMYXlvdXRBbmFseXNpc0NhdGVnb3J5LmdldFN0YXJ0TGluZShtTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgZW5kIGxpbmUgb2YgdGhpcyBub2RlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBlbmQgbGluZSBvciAtMSBpZiB0aGUgbGluZSBpcyB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotICAgICAgICAgICAgcmV0dXJuIExheW91dEFuYWx5c2lzQ2F0ZWdvcnkuZ2V0RW5kTGluZShtTm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvTGF5b3V0QW5hbHl6ZXIuamF2YSBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC9MYXlvdXRBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3NDE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC9MYXlvdXRBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXg7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC54bWwuWG1sRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXgucnVsZXMuUnVsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4LnJ1bGVzLkdyb292eVJ1bGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC51dGlsLklPVXRpbGl0aWVzOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOwotaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKLQotLyoqCi0gKiBBbmFseXNpcyBlbmdpbmUgdXNlZCB0byBkaXNjb3ZlciBpbmVmZmljaWVuY2llcyBpbiBBbmRyb2lkIFhNTAotICogbGF5b3V0IGRvY3VtZW50cy4KLSAqCi0gKiBBbmF5bGl6aW5nIGFuIEFuZHJvaWQgWE1MIGxheW91dCBwcm9kdWNlcyBhIGxpc3Qgb2YgZXhwbGljaXQgbWVzc2FnZXMKLSAqIGFzIHdlbGwgYXMgcG9zc2libGUgc29sdXRpb25zLiAKLSAqLwotcHVibGljIGNsYXNzIExheW91dEFuYWx5emVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVMRVNfUFJFRklYID0gInJ1bGVzLyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFhtbERvY3VtZW50QnVpbGRlciBtQnVpbGRlciA9IG5ldyBYbWxEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVsZT4gbVJ1bGVzID0gbmV3IEFycmF5TGlzdDxSdWxlPigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBsYXlvdXQgYW5hbHl6ZXIuIFRoaXMgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnQKLSAgICAgKiBhbmQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0QW5hbHl6ZXIoKSB7Ci0gICAgICAgIGxvYWRSdWxlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkUnVsZXMoKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudCk7Ci0gICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGxvYWRlcik7Ci0KLSAgICAgICAgVVJMIGphciA9IGdldENsYXNzKCkuZ2V0UHJvdGVjdGlvbkRvbWFpbigpLmdldENvZGVTb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICBaaXBGaWxlIHppcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6aXAgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShqYXIudG9VUkkoKSkpOwotICAgICAgICAgICAgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlbnRyaWVzID0gemlwLmVudHJpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5LmdldE5hbWUoKS5zdGFydHNXaXRoKFJVTEVTX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZFJ1bGUoc2hlbGwsIGVudHJ5LmdldE5hbWUoKSwgemlwLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHppcCAhPSBudWxsKSB6aXAuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkUnVsZShHcm9vdnlTaGVsbCBzaGVsbCwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2NyaXB0IHNjcmlwdCA9IHNoZWxsLnBhcnNlKHN0cmVhbSk7Ci0gICAgICAgICAgICBtUnVsZXMuYWRkKG5ldyBHcm9vdnlSdWxlKG5hbWUsIHNjcmlwdCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgbG9hZCBydWxlICIgKyBuYW1lICsgIjoiKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxpdGllcy5jbG9zZShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUnVsZShSdWxlIHJ1bGUpIHsKLSAgICAgICAgaWYgKHJ1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBydWxlIG11c3QgYmUgbm9uLW51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtUnVsZXMuYWRkKHJ1bGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuYWx5emVzIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGFuYWx5emUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXN9IHdoaWNoCi0gICAgICogICAgICAgICBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0QW5hbHlzaXMgYW5hbHl6ZShGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5hbHl6ZShmaWxlLmdldFBhdGgoKSwgaW4pOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgSU9VdGlsaXRpZXMuY2xvc2UoaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIExheW91dEFuYWx5c2lzLkVSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuYWx5emVzIHRoZSBzcGVjaWZpZWQgWE1MIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIHN0cmVhbSB0byBhbmFseXplLgotICAgICAqIEByZXR1cm4gQSB7QGxpbmsgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC5MYXlvdXRBbmFseXNpc30gd2hpY2gKLSAgICAgKiAgICAgICAgIGNhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRBbmFseXNpcyBhbmFseXplKElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICByZXR1cm4gYW5hbHl6ZSgiPHVua25vd24+Iiwgc3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExheW91dEFuYWx5c2lzIGFuYWx5emUoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG1CdWlsZGVyLnBhcnNlKHN0cmVhbSk7Ci0gICAgICAgICAgICAgcmV0dXJuIGFuYWx5emUobmFtZSwgZG9jdW1lbnQpOwotICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBMYXlvdXRBbmFseXNpcy5FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbmFseXplcyB0aGUgc3BlY2lmaWVkIFhNTCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBYTUwgZG9jdW1lbnQgdG8gYW5hbHl6ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSB7QGxpbmsgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC5MYXlvdXRBbmFseXNpc30gd2hpY2gKLSAgICAgKiAgICAgICAgIGNhbm5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXRBbmFseXNpcyBhbmFseXplKFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICByZXR1cm4gYW5hbHl6ZSgiPHVua25vd24+IiwgY29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5hbHl6ZXMgdGhlIHNwZWNpZmllZCBYTUwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIFhNTCBkb2N1bWVudCB0byBhbmFseXplLgotICAgICAqCi0gICAgICogQHJldHVybiBBIHtAbGluayBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4LkxheW91dEFuYWx5c2lzfSB3aGljaAotICAgICAqICAgICAgICAgY2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIExheW91dEFuYWx5c2lzIGFuYWx5emUoU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbUJ1aWxkZXIucGFyc2UoY29udGVudCk7Ci0gICAgICAgICAgICAgcmV0dXJuIGFuYWx5emUobmFtZSwgZG9jdW1lbnQpOwotICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBMYXlvdXRBbmFseXNpcy5FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbmFseXplcyB0aGUgc3BlY2lmaWVkIFhNTCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgWE1MIGRvY3VtZW50IHRvIGFuYWx5emUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXN9IHdoaWNoCi0gICAgICogICAgICAgICBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0QW5hbHlzaXMgYW5hbHl6ZShEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gYW5hbHl6ZSgiPHVua25vd24+IiwgZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuYWx5emVzIHRoZSBzcGVjaWZpZWQgWE1MIGRvY3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgWE1MIGRvY3VtZW50IHRvIGFuYWx5emUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXN9IHdoaWNoCi0gICAgICogICAgICAgICBjYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0QW5hbHlzaXMgYW5hbHl6ZShTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgTGF5b3V0QW5hbHlzaXMgYW5hbHlzaXMgPSBuZXcgTGF5b3V0QW5hbHlzaXMobmFtZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgYW5hbHl6ZShhbmFseXNpcywgcm9vdCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhbmFseXNpcy52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFuYWx5c2lzOyAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuYWx5emUoTGF5b3V0QW5hbHlzaXMgYW5hbHlzaXMsIE5vZGUgbm9kZSkgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0KLSAgICAgICAgYXBwbHlSdWxlcyhhbmFseXNpcywgbm9kZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICBhbmFseXplKGFuYWx5c2lzLCBjaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlSdWxlcyhMYXlvdXRBbmFseXNpcyBhbmFseXNpcywgTm9kZSBub2RlKSB7Ci0gICAgICAgIGFuYWx5c2lzLnNldEN1cnJlbnROb2RlKG5vZGUpOwotICAgICAgICBmb3IgKFJ1bGUgcnVsZSA6IG1SdWxlcykgewotICAgICAgICAgICAgcnVsZS5ydW4oYW5hbHlzaXMsIG5vZGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvdWl4L2dyb292eS9MYXlvdXRBbmFseXNpc0NhdGVnb3J5LmphdmEgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvZ3Jvb3Z5L0xheW91dEFuYWx5c2lzQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDg2ZC4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvZ3Jvb3Z5L0xheW91dEFuYWx5c2lzQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5sYXlvdXRvcHQudWl4Lmdyb292eTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC54bWwuWG1sRG9jdW1lbnRCdWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5HU3RyaW5nOwotaW1wb3J0IGdyb292eS54bWwuZG9tLkRPTUNhdGVnb3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTdXBwb3J0IGNsYXNzIGZvciBHcm9vdnkgcnVsZXMuIFRoaXMgY2xhc3MgYWRkcyBuZXcgR3Jvb3Z5IGNhcGFiaWxpdGllcwotICogdG8ge0BsaW5rIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXN9IGFuZCB7QGxpbmsgb3JnLnczYy5kb20uTm9kZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRBbmFseXNpc0NhdGVnb3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9QQURESU5HID0gImFuZHJvaWQ6cGFkZGluZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfUEFERElOR19MRUZUID0gImFuZHJvaWQ6cGFkZGluZ0xlZnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX1BBRERJTkdfVE9QID0gImFuZHJvaWQ6cGFkZGluZ1RvcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfUEFERElOR19SSUdIVCA9ICJhbmRyb2lkOnBhZGRpbmdSaWdodCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfUEFERElOR19CT1RUT00gPSAiYW5kcm9pZDpwYWRkaW5nQm90dG9tIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5EUk9JRF9MQVlPVVRfV0lEVEggPSAiYW5kcm9pZDpsYXlvdXRfd2lkdGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX0xBWU9VVF9IRUlHSFQgPSAiYW5kcm9pZDpsYXlvdXRfaGVpZ2h0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRklMTF9QQVJFTlQgPSAiZmlsbF9wYXJlbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9XUkFQX0NPTlRFTlQgPSAid3JhcF9jb250ZW50IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ29udGFpbmVycyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiRnJhbWVMYXlvdXQiLCAiTGluZWFyTGF5b3V0IiwgIlJlbGF0aXZlTGF5b3V0IiwgIlNsaWRpbmdEcmF3ZXIiLAotICAgICAgICAgICAgIkFic29sdXRlTGF5b3V0IiwgIlRhYmxlTGF5b3V0IiwgIkdhbGxlcnkiLCAiR3JpZFZpZXciLCAiTGlzdFZpZXciLAotICAgICAgICAgICAgIlJhZGlvR3JvdXAiLCAiU2Nyb2xsVmlldyIsICJIb3Jpem9udGFsU2Nyb2xsVmlldyIsICJTcGlubmVyIiwKLSAgICAgICAgICAgICJWaWV3U3dpdGNoZXIiLCAiVmlld0ZsaXBwZXIiLCAiVmlld0FuaW1hdG9yIiwgIkltYWdlU3dpdGNoZXIiLAotICAgICAgICAgICAgIlRleHRTd2l0Y2hlciIsICJhbmRyb2lkLmdlc3R1cmUuR2VzdHVyZU92ZXJsYXlWaWV3IiwgIlRhYkhvc3QiCi0gICAgfTsKLSAgICBzdGF0aWMgewotICAgICAgICBBcnJheXMuc29ydChzQ29udGFpbmVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogeG1sTm9kZS5pc0NvbnRhaW5lcigpCi0gICAgICogCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBjb3JyZXNwb25kcyB0byBhIGNvbnRhaW5lciB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVyKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmJpbmFyeVNlYXJjaChzQ29udGFpbmVycywgZWxlbWVudC5nZXROb2RlTmFtZSgpKSA+PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHhtbE5vZGUuYWxsKCkKLSAgICAgKiAKLSAgICAgKiBTYW1lIGFzIHhtbE5vZGUuJyoqJyBidXQgZXhjbHVkZXMgeG1sTm9kZSBmcm9tIHRoZSByZXN1bHRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQWxsIGRlc2NlbmRhbnRzLCB0aGlzIG5vZGUgZXhjbHVkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE5vZGU+IGFsbChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgTm9kZUxpc3QgbGlzdCA9IERPTUNhdGVnb3J5LmRlcHRoRmlyc3QoZWxlbWVudCk7Ci0gICAgICAgIGludCBjb3VudCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIExpc3Q8Tm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KGNvdW50IC0gMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbm9kZXMuYWRkKGxpc3QuaXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IGxpbmUgb2YgdGhpcyBub2RlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc3RhcnQgbGluZSBvciAtMSBpZiB0aGUgbGluZSBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YXJ0TGluZShOb2RlIG5vZGUpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IGRhdGEgPSBub2RlID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICBub2RlLmdldFVzZXJEYXRhKFhtbERvY3VtZW50QnVpbGRlci5OT0RFX1NUQVJUX0xJTkUpOwotICAgICAgICByZXR1cm4gZGF0YSA9PSBudWxsID8gLTEgOiAoSW50ZWdlcikgZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbmQgbGluZSBvZiB0aGlzIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBlbmQgbGluZSBvciAtMSBpZiB0aGUgbGluZSBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEVuZExpbmUoTm9kZSBub2RlKSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBkYXRhID0gbm9kZSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgbm9kZS5nZXRVc2VyRGF0YShYbWxEb2N1bWVudEJ1aWxkZXIuTk9ERV9FTkRfTElORSk7Ci0gICAgICAgIHJldHVybiBkYXRhID09IG51bGwgPyAtMSA6IChJbnRlZ2VyKSBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHhtbE5vZGUuaGFzUGFkZGluZygpCi0gICAgICogCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGhhcyBvbmUgb3JlIG1vcmUgcGFkZGluZyBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQYWRkaW5nKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQU5EUk9JRF9QQURESU5HKS5sZW5ndGgoKSA+IDAgfHwKLSAgICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZShBTkRST0lEX1BBRERJTkdfTEVGVCkubGVuZ3RoKCkgPiAwIHx8Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQU5EUk9JRF9QQURESU5HX1RPUCkubGVuZ3RoKCkgPiAwIHx8Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQU5EUk9JRF9QQURESU5HX0JPVFRPTSkubGVuZ3RoKCkgPiAwIHx8Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQU5EUk9JRF9QQURESU5HX1JJR0hUKS5sZW5ndGgoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSdzIHdpZHRoIGlzIGZpbGxfcGFyZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpZHRoRmlsbFBhcmVudChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFORFJPSURfTEFZT1VUX1dJRFRIKS5lcXVhbHMoVkFMVUVfRklMTF9QQVJFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUncyB3aWR0aCBpcyB3cmFwX2NvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lkdGhXcmFwQ29udGVudChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFORFJPSURfTEFZT1VUX1dJRFRIKS5lcXVhbHMoVkFMVUVfV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBub2RlJ3MgaGVpZ2h0IGlzIGZpbGxfcGFyZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hlaWdodEZpbGxQYXJlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBTkRST0lEX0xBWU9VVF9IRUlHSFQpLmVxdWFscyhWQUxVRV9GSUxMX1BBUkVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSdzIGhlaWdodCBpcyB3cmFwX2NvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGVpZ2h0V3JhcENvbnRlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBTkRST0lEX0xBWU9VVF9IRUlHSFQpLmVxdWFscyhWQUxVRV9XUkFQX0NPTlRFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHhtbE5vZGUuaXNSb290KCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgeG1sTm9kZSBpcyB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3QoTm9kZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSA9PSBub2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHhtbE5vZGUuaXMoInRhZ05hbWUiKQotICAgICAqIAotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB4bWxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5hbWUpLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogeG1sTm9kZS5kZXB0aCgpCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBkZXB0aChOb2RlIG5vZGUpIHsKLSAgICAgICAgaW50IG1heERlcHRoID0gMDsKLSAgICAgICAgTm9kZUxpc3QgbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpbnQgY291bnQgPSBsaXN0LmdldExlbmd0aCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgZGVwdGgobGlzdC5pdGVtKGkpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF4RGVwdGggKyAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFuYWx5c2lzIDw8ICJUaGUgaXNzdWUiCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYW5hbHlzaXMgaXRzZWxmIHRvIGNoYWluIGNhbGxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0QW5hbHlzaXMgbGVmdFNoaWZ0KExheW91dEFuYWx5c2lzIGFuYWx5c2lzLCBHU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGFuYWx5c2lzLmFkZElzc3VlKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYW5hbHlzaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYW5hbHlzaXMgPDwgIlRoZSBpc3N1ZSIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBhbmFseXNpcyBpdHNlbGYgdG8gY2hhaW4gY2FsbHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRBbmFseXNpcyBsZWZ0U2hpZnQoTGF5b3V0QW5hbHlzaXMgYW5hbHlzaXMsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBhbmFseXNpcy5hZGRJc3N1ZShkZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybiBhbmFseXNpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhbmFseXNpcyA8PCBbbm9kZTogbm9kZSwgZGVzY3JpcHRpb246ICJUaGUgaXNzdWUiXQotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGFuYWx5c2lzIGl0c2VsZiB0byBjaGFpbiBjYWxscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEFuYWx5c2lzIGxlZnRTaGlmdChMYXlvdXRBbmFseXNpcyBhbmFseXNpcywgTWFwIGlzc3VlKSB7Ci0gICAgICAgIGFuYWx5c2lzLmFkZElzc3VlKChOb2RlKSBpc3N1ZS5nZXQoIm5vZGUiKSwgaXNzdWUuZ2V0KCJkZXNjcmlwdGlvbiIpLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYW5hbHlzaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvdWl4L3J1bGVzL0dyb292eVJ1bGUuamF2YSBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC9ydWxlcy9Hcm9vdnlSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NWI4ZjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvdWl4L3J1bGVzL0dyb292eVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXgucnVsZXM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS54bWwuZG9tLkRPTUNhdGVnb3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC5ncm9vdnkuTGF5b3V0QW5hbHlzaXNDYXRlZ29yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5Hcm9vdnlDYXRlZ29yeVN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHJ1bGUgdXNpbmcgYSBHcm9vdnkgc2NyaXB0LgotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5UnVsZSBpbXBsZW1lbnRzIFJ1bGUgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgU2NyaXB0IG1TY3JpcHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nIG1CaW5kaW5nOwotICAgIHByaXZhdGUgZmluYWwgQ2xvc3VyZSBtQ2xvc3VyZTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M+IG1DYXRlZ29yaWVzOwotCi0gICAgcHVibGljIEdyb292eVJ1bGUoU3RyaW5nIG5hbWUsIFNjcmlwdCBzY3JpcHQpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICBtU2NyaXB0ID0gc2NyaXB0OwotICAgICAgICBtQmluZGluZyA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgIG1TY3JpcHQuc2V0QmluZGluZyhtQmluZGluZyk7Ci0gICAgICAgIG1DbG9zdXJlID0gbmV3IENsb3N1cmUodGhpcykgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TY3JpcHQucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1DYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKG1DYXRlZ29yaWVzLCBET01DYXRlZ29yeS5jbGFzcywgTGF5b3V0QW5hbHlzaXNDYXRlZ29yeS5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKExheW91dEFuYWx5c2lzIGFuYWx5c2lzLCBOb2RlIG5vZGUpIHsKLSAgICAgICAgbUJpbmRpbmcuc2V0VmFyaWFibGUoImFuYWx5c2lzIiwgYW5hbHlzaXMpOwotICAgICAgICBtQmluZGluZy5zZXRWYXJpYWJsZSgibm9kZSIsIG5vZGUpOwotCi0gICAgICAgIEdyb292eUNhdGVnb3J5U3VwcG9ydC51c2UobUNhdGVnb3JpZXMsIG1DbG9zdXJlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvcnVsZXMvUnVsZS5qYXZhIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvdWl4L3J1bGVzL1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2ODk5Mi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvcnVsZXMvUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC5ydWxlczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dG9wdC51aXguTGF5b3V0QW5hbHlzaXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBkZWZpbmUgYW4gYW5hbHlzaXMgcnVsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBSdWxlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBydWxlLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG5vbi1udWxsIFN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgcnVsZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLiBUaGUgcnVsZSBtdXN0IGFkZCBhbnkgZGV0ZWN0ZWQKLSAgICAgKiBpc3N1ZSB0byB0aGUgYW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYW5hbHlzaXMgVGhlIHJlc3VsdGluZyBhbmFseXNpcy4KLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgb3JpZ2luYWwgWE1MIG5vZGUuCi0gICAgICovCi0gICAgdm9pZCBydW4oTGF5b3V0QW5hbHlzaXMgYW5hbHlzaXMsIE5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvdXRpbC9JT1V0aWxpdGllcy5qYXZhIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9jb20vYW5kcm9pZC9sYXlvdXRvcHQvdWl4L3V0aWwvSU9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhYzMwZi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgvdXRpbC9JT1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBWYXJpb3VzIHV0aWxpdGllcyByZWxhdGVkIHRvIEkvTyBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSU9VdGlsaXRpZXMgewotICAgIHByaXZhdGUgSU9VdGlsaXRpZXMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FmZWx5IGNsb3NlIGEgQ2xvc2VhYmxlIG9iamVjdCwgbGlrZSBhbiBJbnB1dFN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCB0byBjbG9zZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG51bGwgb3Igd2FzIGNsb3NlZCBwcm9wZXJseSwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xvc2UoQ2xvc2VhYmxlIHN0cmVhbSkgewotICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC94bWwvWG1sRG9jdW1lbnRCdWlsZGVyLmphdmEgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL2NvbS9hbmRyb2lkL2xheW91dG9wdC91aXgveG1sL1htbERvY3VtZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTc3OWZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvY29tL2FuZHJvaWQvbGF5b3V0b3B0L3VpeC94bWwvWG1sRG9jdW1lbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubGF5b3V0b3B0LnVpeC54bWw7Ci0KLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnhuaS5BdWdtZW50YXRpb25zOwotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnhuaS5RTmFtZTsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnhuaS5YTUxBdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotLyoqCi0gKiBQYXJzZXMgWE1MIGRvY3VtZW50cy4gVGhpcyBjbGFzcyB0cmllcyB0byBhZGQgbWV0YS1kYXRhIGluIHRoZSByZXN1bHRpbmcgRE9NCi0gKiB0cmVlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCBsaW5lIG51bWJlcnMgb2YgZWFjaCBub2RlLgotICovCi1wdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRCdWlsZGVyIHsKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBub2RlIHVzZXIgZGF0YSBjb250YWluaW5nIHRoZSBzdGFydCBsaW5lIG51bWJlciBvZiB0aGUgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIE5vZGUjZ2V0VXNlckRhdGEoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfU1RBUlRfTElORSA9ICJzdGFydExpbmUiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgbm9kZSB1c2VyIGRhdGEgY29udGFpbmluZyB0aGUgZW5kIGxpbmUgbnVtYmVyIG9mIHRoZSBub2RlLgotICAgICAqCi0gICAgICogQHNlZSBOb2RlI2dldFVzZXJEYXRhKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0VORF9MSU5FID0gImVuZExpbmUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXNMaW5lTnVtYmVyc1N1cHBvcnQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFhNTCBkb2N1bWVudCBidWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxEb2N1bWVudEJ1aWxkZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnBhcnNlcnMuRE9NUGFyc2VyIik7Ci0gICAgICAgICAgICBtSGFzTGluZU51bWJlcnNTdXBwb3J0ID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUhhc0xpbmVOdW1iZXJzU3VwcG9ydCkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0aGUgWE1MIHBhcnNlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1aWxkZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFhNTCBkb2N1bWVudHMgY3JlYXRlZCBieSB0aGlzIGNsYXNzIGFyZSBhbm5vdGF0ZWQKLSAgICAgKiB3aXRoIGxpbmUgbnVtYmVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGFyc2VkIGRvY3VtZW50cyBjb250YWluIGxpbmUgbnVtYmVycyBtZXRhLWRhdGEsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAc2VlICNOT0RFX1NUQVJUX0xJTkUKLSAgICAgKiBAc2VlICNOT0RFX0VORF9MSU5FCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNIYXNMaW5lTnVtYmVyc1N1cHBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBtSGFzTGluZU51bWJlcnNTdXBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNMaW5lTnVtYmVyc1N1cHBvcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBET01QYXJzZXIgcGFyc2VyID0gbmV3IExpbmVOdW1iZXJET01QYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShTdHJpbmcgY29udGVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNMaW5lTnVtYmVyc1N1cHBvcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVpbGRlci5wYXJzZShjb250ZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERPTVBhcnNlciBwYXJzZXIgPSBuZXcgTGluZU51bWJlckRPTVBhcnNlcigpOwotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGNvbnRlbnQpOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGluZU51bWJlckRPTVBhcnNlciBleHRlbmRzIERPTVBhcnNlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05PREVfRVhQQU5TSU9OID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2RvbS9kZWZlci1ub2RlLWV4cGFuc2lvbiI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX05PREUgPQotICAgICAgICAgICAgICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9kb20vY3VycmVudC1lbGVtZW50LW5vZGUiOwotCi0gICAgICAgIHByaXZhdGUgWE1MTG9jYXRvciBtTG9jYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PE5vZGU+IG1TdGFjayA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBMaW5lTnVtYmVyRE9NUGFyc2VyKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXRGZWF0dXJlKEZFQVRVUkVfTk9ERV9FWFBBTlNJT04sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChYTUxMb2NhdG9yIHhtbExvY2F0b3IsIFN0cmluZyBzLAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCwgQXVnbWVudGF0aW9ucyBhdWdtZW50YXRpb25zKQotICAgICAgICAgICAgICAgIHRocm93cyBYTklFeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCh4bWxMb2NhdG9yLCBzLCBuYW1lc3BhY2VDb250ZXh0LCBhdWdtZW50YXRpb25zKTsKLQotICAgICAgICAgICAgbUxvY2F0b3IgPSB4bWxMb2NhdG9yOwotICAgICAgICAgICAgbVN0YWNrLmFkZChzZXROb2RlTGluZU51bWJlcihOT0RFX1NUQVJUX0xJTkUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTm9kZSBzZXROb2RlTGluZU51bWJlcihTdHJpbmcgdGFnKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub2RlID0gKE5vZGUpIGdldFByb3BlcnR5KENVUlJFTlRfTk9ERSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS5zZXRVc2VyRGF0YSh0YWcsIG1Mb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChRTmFtZSBxTmFtZSwgWE1MQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIEF1Z21lbnRhdGlvbnMgYXVnbWVudGF0aW9ucykgdGhyb3dzIFhOSUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQocU5hbWUsIHhtbEF0dHJpYnV0ZXMsIGF1Z21lbnRhdGlvbnMpOwotICAgICAgICAgICAgbVN0YWNrLmFkZChzZXROb2RlTGluZU51bWJlcihOT0RFX1NUQVJUX0xJTkUpKTsgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFFOYW1lIHFOYW1lLCBBdWdtZW50YXRpb25zIGF1Z21lbnRhdGlvbnMpIHRocm93cyBYTklFeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIuZW5kRWxlbWVudChxTmFtZSwgYXVnbWVudGF0aW9ucyk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBtU3RhY2sucmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGUuc2V0VXNlckRhdGEoTk9ERV9FTkRfTElORSwgbUxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL0luY29ycmVjdEhlaWdodEluU2Nyb2xsVmlldy5ydWxlIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvSW5jb3JyZWN0SGVpZ2h0SW5TY3JvbGxWaWV3LnJ1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOWViZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvSW5jb3JyZWN0SGVpZ2h0SW5TY3JvbGxWaWV3LnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vLyBSdWxlOiBJbmNvcnJlY3RIZWlnaHRJblNjcm9sbFZpZXcKLS8vCi0vLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHdoZXRoZXIgYSBzY3JvbGx2aWV3J3MgY2hpbGQgaGFzIHRoZSB3cm9uZyBkaW1lbnNpb24uCi0vLwotLy8gQ29uZGl0aW9uczoKLS8vIC0gVGhlIG5vZGUgaGFzIGEgU2Nyb2xsVmlldyBwYXJlbnQKLS8vIC0gVGhlIG5vZGUgaGFzIGEgaGVpZ2h0IHNldCB0byBmaWxsX3BhcmVudAotCi1pZiAobm9kZS4nLi4nLmlzKCJTY3JvbGxWaWV3IikgJiYgbm9kZS5pc0hlaWdodEZpbGxQYXJlbnQoKSkgewotICAgIGFuYWx5c2lzIDw8ICJUaGlzICR7bm9kZS5uYW1lKCl9IHRhZyBzaG91bGQgdXNlIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIgotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvSW5jb3JyZWN0V2lkdGhJbkhvcml6b250YWxTY3JvbGxWaWV3LnJ1bGUgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9JbmNvcnJlY3RXaWR0aEluSG9yaXpvbnRhbFNjcm9sbFZpZXcucnVsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkYTg0My4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9JbmNvcnJlY3RXaWR0aEluSG9yaXpvbnRhbFNjcm9sbFZpZXcucnVsZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8vIFJ1bGU6IEluY29ycmVjdFdpZHRoSW5TY3JvbGxWaWV3Ci0vLwotLy8gRGVzY3JpcHRpb246IENoZWNrcyB3aGV0aGVyIGEgc2Nyb2xsdmlldydzIGNoaWxkIGhhcyB0aGUgd3JvbmcgZGltZW5zaW9uLgotLy8KLS8vIENvbmRpdGlvbnM6Ci0vLyAtIFRoZSBub2RlIGhhcyBhIEhvcml6b250YWxTY3JvbGxWaWV3IHBhcmVudAotLy8gLSBUaGUgbm9kZSBoYXMgYSB3aWR0aCBzZXQgdG8gZmlsbF9wYXJlbnQKLQotaWYgKG5vZGUuJy4uJy5pcygiSG9yaXpvbnRhbFNjcm9sbFZpZXciKSAmJiBub2RlLmlzV2lkdGhGaWxsUGFyZW50KCkpIHsKLSAgICBhbmFseXNpcyA8PCAiVGhpcyAke25vZGUubmFtZSgpfSB0YWcgc2hvdWxkIHVzZSBhbmRyb2lkOmxheW91dF93aWR0aD1cIndyYXBfY29udGVudFwiIgotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvSW5lZmZpY2llbnRXZWlnaHQucnVsZSBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL0luZWZmaWNpZW50V2VpZ2h0LnJ1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGQ3YTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvSW5lZmZpY2llbnRXZWlnaHQucnVsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIFJ1bGU6IEluZWZmaWNpZW50V2VpZ2h0Ci0vLwotLy8gRGVzY3JpcHRpb246IENoZWNrcyB3aGV0aGVyIGEgbGF5b3V0X3dlaWdodCBpcyBkZWNsYXJlZCBpbmVmZmljaWVudGx5LgotLy8KLS8vIENvbmRpdGlvbnM6Ci0vLyAtIFRoZSBub2RlIGhhcyBhIExpbmVhckxheW91dCBwYXJlbnQKLS8vIC0gVGhlIG5vZGUgaXMgdGhlIG9ubHkgc2libGluZyB3aXRoIGEgd2VpZ2h0Ci0vLyAtIFRoZSBub2RlIGhhcyBhIGhlaWdodC93aWR0aCAhPSAwCi0KLWRlZiBwYXJlbnQgPSBub2RlLicuLicKLWlmIChwYXJlbnQuaXMoIkxpbmVhckxheW91dCIpICYmIG5vZGUuJ0BhbmRyb2lkOmxheW91dF93ZWlnaHQnICYmCi0gICAgICAgIHBhcmVudC4nKicuZmluZEFsbHsgaXQuJ0BhbmRyb2lkOmxheW91dF93ZWlnaHQnIH0uc2l6ZSgpID09IDEpIHsKLSAgICBkZWYgZGltZW5zaW9uID0gcGFyZW50LidAYW5kcm9pZDpvcmllbnRhdGlvbicgPT0gInZlcnRpY2FsIiA/Ci0gICAgICAgICJhbmRyb2lkOmxheW91dF9oZWlnaHQiIDogImFuZHJvaWQ6bGF5b3V0X3dpZHRoIgotICAgIGlmIChub2RlLiJAJHtkaW1lbnNpb259IlswXSAhPSAnMCcpIHsKLSAgICAgICAgYW5hbHlzaXMgPDwgIlVzZSBhbiAke2RpbWVuc2lvbn0gb2YgMGRpcCBpbnN0ZWFkIG9mICR7bm9kZS4iQCR7ZGltZW5zaW9ufSJ9ICIgKwotICAgICAgICAgICAgICAgICJmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL01lcmdlUm9vdEZyYW1lTGF5b3V0LnJ1bGUgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9NZXJnZVJvb3RGcmFtZUxheW91dC5ydWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZjM2Q5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL01lcmdlUm9vdEZyYW1lTGF5b3V0LnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBSdWxlOiBNZXJnZVJvb3RGcmFtZUxheW91dAotLy8KLS8vIERlc2NyaXB0aW9uOiBDaGVja3Mgd2hldGhlciB0aGUgcm9vdCBub2RlIG9mIHRoZSBYTUwgZG9jdW1lbnQgY2FuIGJlCi0vLyAgICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIDxtZXJnZSAvPiB0YWcuCi0vLwotLy8gQ29uZGl0aW9uczoKLS8vIC0gVGhlIG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50Ci0vLyAtIFRoZSBub2RlIGlzIGEgRnJhbWVMYXlvdXQKLS8vIC0gVGhlIG5vZGUgaXMgZmlsbF9wYXJlbnQgaW4gYm90aCBvcmllbnRhdGlvbiAqb3IqIGl0IGhhcyBubyBsYXlvdXRfZ3Jhdml0eQotLy8gLSBUaGUgbm9kZSBkb2VzIG5vdCBoYXZlIGEgYmFja2dyb3VuZCBub3IgYSBmb3JlZ3JvdW5kCi0vLyAtIFRoZSBub2RlIGRvZXMgbm90IGhhdmUgcGFkZGluZwotCi1pZiAobm9kZS5pc1Jvb3QoKSAmJiBub2RlLmlzKCJGcmFtZUxheW91dCIpICYmICFub2RlLidAYW5kcm9pZDpiYWNrZ3JvdW5kJyAmJgotICAgICAgICAhbm9kZS4nQGFuZHJvaWQ6Zm9yZWdyb3VuZCcgJiYgKChub2RlLmlzV2lkdGhGaWxsUGFyZW50KCkgJiYKLSAgICAgICAgICAgICAgICBub2RlLmlzSGVpZ2h0RmlsbFBhcmVudCgpKSB8fCAhbm9kZS4nQGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHknKSAmJgotICAgICAgICAhbm9kZS5oYXNQYWRkaW5nKCkpIHsKLSAgICBhbmFseXNpcyA8PCAiVGhlIHJvb3QtbGV2ZWwgPEZyYW1lTGF5b3V0Lz4gY2FuIGJlIHJlcGxhY2VkIHdpdGggPG1lcmdlLz4iCi19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9OZXN0ZWRTY3JvbGxpbmdXaWRnZXRzLnJ1bGUgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9OZXN0ZWRTY3JvbGxpbmdXaWRnZXRzLnJ1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGMyNGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvTmVzdGVkU2Nyb2xsaW5nV2lkZ2V0cy5ydWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gUnVsZTogTmVzdGVkU2Nyb2xsaW5nV2lkZ2V0cwotLy8KLS8vIERlc2NyaXB0aW9uOiBDaGVja3Mgd2hldGhlciBhIHNjcm9sbGluZyB3aWRnZXQgaGFzIG5lc3RlZCBzY3JvbGxpbmcgd2lkZ2V0cy4KLS8vCi0vLyBDb25kaXRpb25zOgotLy8gLSBUaGUgbm9kZSBpcyBhIHNjcm9sbGluZyB3aWRnZXQKLS8vIC0gVGhlIG5vZGUgaGFzIGEgZGVzY2VuZGFudCB3aG8gaXMgYWxzbyBhIHNjcm9sbGluZyB3aWRnZXQKLQotZGVmIHdpZGdldHMgPSBbIlNjcm9sbFZpZXciLCAiTGlzdFZpZXciLCAiR3JpZFZpZXciXQotaWYgKG5vZGUubmFtZSgpIGluIHdpZGdldHMgJiYgbm9kZS5hbGwoKS5hbnl7IGl0Lm5hbWUoKSBpbiB3aWRnZXRzIH0pIHsKLSAgICBhbmFseXNpcyA8PCAiVGhlIHZlcnRpY2FsbHkgc2Nyb2xsaW5nICR7bm9kZS5uYW1lKCl9IHNob3VsZCBub3QgY29udGFpbiBhbm90aGVyICIgKwotICAgICAgICAgICAgInZlcnRpY2FsbHkgc2Nyb2xsaW5nIHdpZGdldCIKLX0KLQotd2lkZ2V0cyA9IFsiSG9yaXpvbnRhbFNjcm9sbFZpZXciLCAiR2FsbGVyeSJdCi1pZiAobm9kZS5uYW1lKCkgaW4gd2lkZ2V0cyAmJiBub2RlLmFsbCgpLmFueXsgaXQubmFtZSgpIGluIHdpZGdldHMgfSkgewotICAgIGFuYWx5c2lzIDw8ICJUaGUgaG9yaXpvbnRhbGx5IHNjcm9sbGluZyAke25vZGUubmFtZSgpfSBzaG91bGQgbm90IGNvbnRhaW4gYW5vdGhlciAiICsKLSAgICAgICAgICAgICJob3Jpem9udGFsbHkgc2Nyb2xsaW5nIHdpZGdldCIKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1Rvb01hbnlDaGlsZHJlbi5ydWxlIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVG9vTWFueUNoaWxkcmVuLnJ1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmQ5MWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVG9vTWFueUNoaWxkcmVuLnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBSdWxlOiBUb29NYW55Q2hpbGRyZW4KLS8vCi0vLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHdoZXRoZXIgdGhlIGxheW91dCBoYXMgdG9vIG1hbnkgY2hpbGRyZW4uCi0vLwotLy8gQ29uZGl0aW9uczoKLS8vIC0gVGhlIGxheW91dCBpcyBhIFNjcm9sbFZpZXcgYW5kIGhhcyBtb3JlIHRoYW4gMSBjaGlsZAotLy8gLSBUaGUgbGF5b3V0IGlzIGEgbGlzdCBvciBncmlkIGFucyBoYXMgYXQgbGVhc3QgMSBjaGlsZAotCi1pZiAobm9kZS5uYW1lKCkgaW4gWyJTY3JvbGxWaWV3IiwgIkhvcml6b250YWxTY3JvbGxWaWV3Il0gJiYgbm9kZS4nKicuc2l6ZSgpID4gMSkgewotICAgIGFuYWx5c2lzIDw8ICJBIHNjcm9sbCB2aWV3IGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkIgotfQotCi1pZiAobm9kZS5uYW1lKCkgaW4gWyJMaXN0VmlldyIsICJHcmlkVmlldyJdICYmIG5vZGUuJyonLnNpemUoKSA+IDApIHsKLSAgICBhbmFseXNpcyA8PCAiQSBsaXN0L2dyaWQgc2hvdWxkIGhhdmUgbm8gY2hpbGRyZW4gZGVjbGFyZWQgaW4gbm9kZSIKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1Rvb01hbnlMZXZlbHMucnVsZSBiL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1Rvb01hbnlMZXZlbHMucnVsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ZTA4Mi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9Ub29NYW55TGV2ZWxzLnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vLyBSdWxlOiBUb29NYW55TGV2ZWxzCi0vLwotLy8gRGVzY3JpcHRpb246IENoZWNrcyB3aGV0aGVyIHRoZSBsYXlvdXQgaGFzIHRvbyBtYW55IG5lc3RlZCBncm91cHMuCi0vLwotLy8gQ29uZGl0aW9uczoKLS8vIC0gVGhlIGRlcHRoIG9mIHRoZSBsYXlvdXQgaXMgPiAxMAotCi1pZiAobm9kZS5pc1Jvb3QoKSAmJiAoZGVwdGggPSBub2RlLmRlcHRoKCkpID4gMTApIHsKLSAgICBhbmFseXNpcyA8PCBbbm9kZTogbnVsbCwgZGVzY3JpcHRpb246ICJUaGlzIGxheW91dCBoYXMgdG9vIG1hbnkgbmVzdGVkIGxheW91dHM6ICIgKwotICAgICAgICAgICAgIiR7ZGVwdGh9IGxldmVscywgaXQgc2hvdWxkIGhhdmUgPD0gMTAhIl0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1Rvb01hbnlWaWV3cy5ydWxlIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVG9vTWFueVZpZXdzLnJ1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NGE4ODguLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVG9vTWFueVZpZXdzLnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vLyBSdWxlOiBUb29NYW55Vmlld3MKLS8vCi0vLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHdoZXRoZXIgdGhlIGxheW91dCBoYXMgdG9vIG1hbnkgdmlld3MuCi0vLwotLy8gQ29uZGl0aW9uczoKLS8vIC0gVGhlIGRvY3VtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiA4MCB2aWV3cwotCi1pZiAobm9kZS5pc1Jvb3QgJiYgKHNpemUgPSBub2RlLicqKicuc2l6ZSgpKSA+IDgwKSB7Ci0gICAgYW5hbHlzaXMgPDwgW25vZGU6IG51bGwsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgbGF5b3V0IGhhcyB0b28gbWFueSB2aWV3czogJHtzaXplfSB2aWV3cywgaXQgc2hvdWxkIGhhdmUgPD0gODAhIl0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1VzZUNvbXBvdW5kRHJhd2FibGVzLnJ1bGUgYi90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9Vc2VDb21wb3VuZERyYXdhYmxlcy5ydWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRhNmJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1VzZUNvbXBvdW5kRHJhd2FibGVzLnJ1bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBSdWxlOiBVc2VDb21wb3VuZERyYXdhYmxlcwotLy8KLS8vIERlc2NyaXB0aW9uOiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBub2RlIGNhbiBiZSByZXBsYWNlZCBieSBhIFRleHRWaWV3Ci0vLyAgICAgICAgICAgICAgdXNpbmcgY29tcG91bmQgZHJhd2FibGVzLgotLy8KLS8vIENvbmRpdGlvbnM6Ci0vLyAtIFRoZSBub2RlIGlzIGEgTGluZWFyTGF5b3V0Ci0vLyAtIFRoZSBub2RlIGhhcyB0d28gY2hpbGRyZW4sIEltYWdlVmlldyBhbmQgVGV4dFZpZXcKLS8vIC0gVGhlIEltYWdlVmlldyBkb2VzIG5vdCBoYXZlIGEgd2VpZ2h0Ci0KLWlmIChub2RlLmlzKCJMaW5lYXJMYXlvdXQiKSAmJiBub2RlLicqJy5zaXplKCkgPT0gMiAmJiBub2RlLidUZXh0Vmlldycuc2l6ZSgpID09IDEgJiYKLSAgICAgICAgbm9kZS4nSW1hZ2VWaWV3Jy5zaXplKCkgPT0gMSAmJiAhbm9kZS4nSW1hZ2VWaWV3J1swXS4nQGFuZHJvaWQ6bGF5b3V0X3dlaWdodCcpIHsKLSAgICBhbmFseXNpcyA8PCAiVGhpcyB0YWcgYW5kIGl0cyBjaGlsZHJlbiBjYW4gYmUgcmVwbGFjZWQgYnkgb25lIDxUZXh0Vmlldy8+IGFuZCAiICsKLSAgICAgICAgICAgICJhIGNvbXBvdW5kIGRyYXdhYmxlIgotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVXNlbGVzc0xheW91dC5ydWxlIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVXNlbGVzc0xheW91dC5ydWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzI2MzMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9saWJzL3VpeC9zcmMvcmVzb3VyY2VzL3J1bGVzL1VzZWxlc3NMYXlvdXQucnVsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIFJ1bGU6IFVzZWxlc3NMYXlvdXQKLS8vCi0vLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHdoZXRoZXIgY3VycmVudCBub2RlIGNhbiBiZSByZW1vdmVkLgotLy8KLS8vIENvbmRpdGlvbnM6Ci0vLyAtIFRoZSBub2RlIGhhcyBjaGlsZHJlbgotLy8gLSBUaGUgbm9kZSBkb2VzIG5vdCBoYXZlIHNpYmxpbmdzCi0vLyAtIFRoZSBub2RlJ3MgcGFyZW50IGlzIG5vdCBhIHNjcm9sbCB2aWV3IChob3Jpem9udGFsIG9yIHZlcnRpY2FsKQotLy8gLSBUaGUgbm9kZSBkb2VzIG5vdCBoYXZlIGEgYmFja2dyb3VuZCBvciBpdHMgcGFyZW50IGRvZXMgbm90IGhhdmUgYQotLy8gICBiYWNrZ3JvdW5kIG9yIG5laXRoZXIgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgaGF2ZSBhIGJhY2tncm91bmQKLS8vIC0gVGhlIHBhcmVudCBpcyBub3QgYSA8bWVyZ2UvPgotCi1pZiAoIW5vZGUuaXNSb290KCkgJiYgIShub2RlWycuLiddLm5hbWUoKSBpbiBbIlNjcm9sbFZpZXciLCAiSG9yaXpvbnRhbFNjcm9sbFZpZXciXSkgJiYKLSAgICAgICAgbm9kZVsnLi4nXVsnKiddLnNpemUoKSA9PSAxICYmIG5vZGVbJyonXS5zaXplKCkgPiAwICYmICgobm9kZS4nQGFuZHJvaWQ6YmFja2dyb3VuZCcgfHwKLSAgICAgICAgbm9kZVsnLi4nXS4nQGFuZHJvaWQ6YmFja2dyb3VuZCcpIHx8ICghbm9kZS4nQGFuZHJvaWQ6YmFja2dyb3VuZCcgJiYKLSAgICAgICAgIW5vZGVbJy4uJ10uJ0BhbmRyb2lkOmJhY2tncm91bmQnKSkpIHsKLSAgICBhbmFseXNpcyA8PCAiVGhpcyAke25vZGUubmFtZSgpfSBsYXlvdXQgb3IgaXRzICR7bm9kZVsnLi4nXS5uYW1lKCl9IHBhcmVudCBpcyAiICsKLSAgICAgICAgICAgICIke25vZGVbJy4uJ10uJ0BhbmRyb2lkOmlkJyA/ICJwb3NzaWJseSB1c2VsZXNzIiA6ICJ1c2VsZXNzIn0iCi19CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9Vc2VsZXNzVmlldy5ydWxlIGIvdG9vbHMvbGF5b3V0b3B0L2xpYnMvdWl4L3NyYy9yZXNvdXJjZXMvcnVsZXMvVXNlbGVzc1ZpZXcucnVsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhNzdlNS4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvbGlicy91aXgvc3JjL3Jlc291cmNlcy9ydWxlcy9Vc2VsZXNzVmlldy5ydWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLy8gUnVsZTogVXNlbGVzc1ZpZXcKLS8vCi0vLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHdoZXRoZXIgYSBjb250YWluZXIgdmlldyBjYW4gYmUgcmVtb3ZlZC4KLS8vCi0vLyBDb25kaXRpb25zOgotLy8gLSBUaGUgbm9kZSBpcyBhIGNvbnRhaW5lciB2aWV3IChMaW5lYXJMYXlvdXQsIGV0Yy4pCi0vLyAtIFRoZSBub2RlIGhhcyBubyBpZAotLy8gLSBUaGUgbm9kZSBoYXMgbm8gYmFja2dyb3VuZAotLy8gLSBUaGUgbm9kZSBoYXMgbm8gY2hpbGRyZW4KLQotaWYgKG5vZGUuaXNDb250YWluZXIoKSAmJiBub2RlLicqJy5zaXplKCkgPT0gMCAmJiAhbm9kZS4nQGFuZHJvaWQ6aWQnICYmCi0gICAgICAgICFub2RlLidAYW5kcm9pZDpiYWNrZ3JvdW5kJykgewotICAgIGFuYWx5c2lzIDw8ICJUaGlzICR7bm9kZS5uYW1lKCl9IHZpZXcgaXMgdXNlbGVzcyAobm8gY2hpbGRyZW4sIG5vIGJhY2tncm91bmQsIG5vIGlkKSIKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL2NvbXBvdW5kLnhtbCBiL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL2NvbXBvdW5kLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2MDg5Yi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvc2FtcGxlcy9jb21wb3VuZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08TGluZWFyTGF5b3V0Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotICAgIDxUZXh0VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvc2FtcGxlcy9oYXNfY2hpbGRyZW4ueG1sIGIvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvaGFzX2NoaWxkcmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNmRiNS4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvc2FtcGxlcy9oYXNfY2hpbGRyZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPExpc3RWaWV3Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0JPExpc3RWaWV3IAotCSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0JICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiIC8+Ci0JCi08L0xpc3RWaWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL2luZWZmaWNpZW50X3dlaWdodC54bWwgYi90b29scy9sYXlvdXRvcHQvc2FtcGxlcy9pbmVmZmljaWVudF93ZWlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzNTBhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL2luZWZmaWNpZW50X3dlaWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08TGluZWFyTGF5b3V0Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0JPEJ1dHRvbiAKLQkgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotCSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLQkgCWFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIiAvPgotCQotCTxMaW5lYXJMYXlvdXQKLQkgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0JICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLQkgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKLQkKLQkJYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0JCTxCdXR0b24gCi0JCSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0JCSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLQkJIAlhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIgLz4KLQotCTwvTGluZWFyTGF5b3V0PgotCQotCTxMaW5lYXJMYXlvdXQKLQkgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0JICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLQkgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKLQkKLQkJYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0JCTxCdXR0b24gCi0JCSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0JCSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0JCSAJYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiIC8+Ci0KLQk8L0xpbmVhckxheW91dD4KLQotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvc2Nyb2xsaW5nLnhtbCBiL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3Njcm9sbGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDI4OWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvc2Nyb2xsaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTxTY3JvbGxWaWV3Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0JPExpbmVhckxheW91dAotCSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0JICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0JCTxMaXN0VmlldyAKLQkJICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLQkJICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiIC8+Ci0KLQk8L0xpbmVhckxheW91dD4KLQotPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvc2ltcGxlLnhtbCBiL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3NpbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDM2ZTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvc2ltcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPEZyYW1lTGF5b3V0Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiIC8+CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRvcHQvc2FtcGxlcy90b29fZGVlcC54bWwgYi90b29scy9sYXlvdXRvcHQvc2FtcGxlcy90b29fZGVlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTczNjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvdG9vX2RlZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPExpbmVhckxheW91dAotICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLQotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0gICAgICAgIAotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3Rvb19tYW55LnhtbCBiL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3Rvb19tYW55LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjMThmZi4uMDAwMDAwMAotLS0gYS90b29scy9sYXlvdXRvcHQvc2FtcGxlcy90b29fbWFueS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPEZyYW1lTGF5b3V0Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIAotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgPEJ1dHRvbgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgPEJ1dHRvbgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgPEJ1dHRvbgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgPEJ1dHRvbgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT2siIC8+Ci0KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9rIiAvPgotCi0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPayIgLz4KLQotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3VzZWxlc3MueG1sIGIvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvdXNlbGVzcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmQ1ZDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvdXNlbGVzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08RnJhbWVMYXlvdXQKLSAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0KLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+Ci0KLQk8TGluZWFyTGF5b3V0Ci0JCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLQkgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+Ci0JCi0JCTxUZXh0VmlldwotCQkJYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLQkJICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCQotCTwvTGluZWFyTGF5b3V0PgotCi08L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvd3JvbmdfZGltZW5zaW9uLnhtbCBiL3Rvb2xzL2xheW91dG9wdC9zYW1wbGVzL3dyb25nX2RpbWVuc2lvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYjI5MmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGF5b3V0b3B0L3NhbXBsZXMvd3JvbmdfZGltZW5zaW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTxIb3Jpem9udGFsU2Nyb2xsVmlldwotICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLQotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLQotCTxMaW5lYXJMYXlvdXQKLQkgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotCSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IiAvPgotCi08L0hvcml6b250YWxTY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvdG9vbHMvbmluZXBhdGNoLy5jbGFzc3BhdGggYi90b29scy9uaW5lcGF0Y2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1MDExNi4uMDAwMDAwMAotLS0gYS90b29scy9uaW5lcGF0Y2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL25pbmVwYXRjaC8uZ2l0aWdub3JlIGIvdG9vbHMvbmluZXBhdGNoLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbmluZXBhdGNoLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rvb2xzL25pbmVwYXRjaC8ucHJvamVjdCBiL3Rvb2xzL25pbmVwYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyZjAwMC4uMDAwMDAwMAotLS0gYS90b29scy9uaW5lcGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5uaW5lcGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvbmluZXBhdGNoL0FuZHJvaWQubWsgYi90b29scy9uaW5lcGF0Y2gvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlMDIwNS4uMDAwMDAwMAotLS0gYS90b29scy9uaW5lcGF0Y2gvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlcixzcmMpCi0KLUxPQ0FMX01PRFVMRSA6PSBuaW5lcGF0Y2gKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbmluZXBhdGNoL3NyYy9jb20vYW5kcm9pZC9uaW5lcGF0Y2gvR3JhcGhpY3NVdGlsaXRpZXMuamF2YSBiL3Rvb2xzL25pbmVwYXRjaC9zcmMvY29tL2FuZHJvaWQvbmluZXBhdGNoL0dyYXBoaWNzVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDcxZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbmluZXBhdGNoL3NyYy9jb20vYW5kcm9pZC9uaW5lcGF0Y2gvR3JhcGhpY3NVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5uaW5lcGF0Y2g7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NDb25maWd1cmF0aW9uOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuVHJhbnNwYXJlbmN5OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBHcmFwaGljc1V0aWxpdGllcyB7Ci0gICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGxvYWRDb21wYXRpYmxlSW1hZ2UoVVJMIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKHJlc291cmNlKTsKLSAgICAgICAgcmV0dXJuIHRvQ29tcGF0aWJsZUltYWdlKGltYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgbG9hZENvbXBhdGlibGVJbWFnZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIHRvQ29tcGF0aWJsZUltYWdlKGltYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSB0b0NvbXBhdGlibGVJbWFnZShCdWZmZXJlZEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbWFnZS5nZXRDb2xvck1vZGVsKCkuZXF1YWxzKGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldENvbG9yTW9kZWwoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgY29tcGF0aWJsZUltYWdlID0gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKAotICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRXaWR0aCgpLCBpbWFnZS5nZXRIZWlnaHQoKSwgaW1hZ2UuZ2V0VHJhbnNwYXJlbmN5KCkpOwotICAgICAgICBHcmFwaGljcyBnID0gY29tcGF0aWJsZUltYWdlLmdldEdyYXBoaWNzKCk7Ci0gICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBudWxsKTsKLSAgICAgICAgZy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhdGlibGVJbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZUltYWdlKEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRUcmFuc3BhcmVuY3koKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0TG9jYWxHcmFwaGljc0Vudmlyb25tZW50KCk7Ci0gICAgICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGVhZGxlc3MoKSB7Ci0gICAgICAgIHJldHVybiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlVHJhbnNsdWNlbnRDb21wYXRpYmxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5jcmVhdGVDb21wYXRpYmxlSW1hZ2Uod2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2V0UGl4ZWxzKEJ1ZmZlcmVkSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50W10gcGl4ZWxzKSB7Ci0gICAgICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGludFswXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwaXhlbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGl4ZWxzID0gbmV3IGludFt3ICogaF07Ci0gICAgICAgIH0gZWxzZSBpZiAocGl4ZWxzLmxlbmd0aCA8IHcgKiBoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQaXhlbHMgYXJyYXkgbXVzdCBoYXZlIGEgbGVuZ3RoID49IHcgKiBoIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW1hZ2VUeXBlID0gaW1nLmdldFR5cGUoKTsKLSAgICAgICAgaWYgKGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgfHwgaW1hZ2VUeXBlID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCKSB7Ci0gICAgICAgICAgICBSYXN0ZXIgcmFzdGVyID0gaW1nLmdldFJhc3RlcigpOwotICAgICAgICAgICAgcmV0dXJuIChpbnRbXSkgcmFzdGVyLmdldERhdGFFbGVtZW50cyh4LCB5LCB3LCBoLCBwaXhlbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVW5tYW5hZ2VzIHRoZSBpbWFnZQotICAgICAgICByZXR1cm4gaW1nLmdldFJHQih4LCB5LCB3LCBoLCBwaXhlbHMsIDAsIHcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL25pbmVwYXRjaC9zcmMvY29tL2FuZHJvaWQvbmluZXBhdGNoL05pbmVQYXRjaC5qYXZhIGIvdG9vbHMvbmluZXBhdGNoL3NyYy9jb20vYW5kcm9pZC9uaW5lcGF0Y2gvTmluZVBhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODRmZDguLjAwMDAwMDAKLS0tIGEvdG9vbHMvbmluZXBhdGNoL3NyYy9jb20vYW5kcm9pZC9uaW5lcGF0Y2gvTmluZVBhdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubmluZXBhdGNoOwotCi1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSA5LVBhdGNoIGJpdG1hcC4KLSAqLwotcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OXzlQQVRDSCA9ICIuOS5wbmciOwotCi0gICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIG1JbWFnZTsKLQotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBpbnRbXSByb3c7Ci0gICAgcHJpdmF0ZSBpbnRbXSBjb2x1bW47Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcnRpY2FsU3RhcnRXaXRoUGF0Y2g7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ib3Jpem9udGFsU3RhcnRXaXRoUGF0Y2g7Ci0KLSAgICBwcml2YXRlIExpc3Q8UmVjdGFuZ2xlPiBtRml4ZWQ7Ci0gICAgcHJpdmF0ZSBMaXN0PFJlY3RhbmdsZT4gbVBhdGNoZXM7Ci0gICAgcHJpdmF0ZSBMaXN0PFJlY3RhbmdsZT4gbUhvcml6b250YWxQYXRjaGVzOwotICAgIHByaXZhdGUgTGlzdDxSZWN0YW5nbGU+IG1WZXJ0aWNhbFBhdGNoZXM7Ci0KLSAgICBwcml2YXRlIFBhaXI8SW50ZWdlcj4gbUhvcml6b250YWxQYWRkaW5nOwotICAgIHByaXZhdGUgUGFpcjxJbnRlZ2VyPiBtVmVydGljYWxQYWRkaW5nOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtSG9yaXpvbnRhbFBhdGNoZXNTdW07Ci0gICAgcHJpdmF0ZSBmbG9hdCBtVmVydGljYWxQYXRjaGVzU3VtOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlbWFpbmRlckhvcml6b250YWw7Ci0KLSAgICBwcml2YXRlIGludCBtUmVtYWluZGVyVmVydGljYWw7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhIDkgcGF0Y2ggb3IgcmVndWxhciBiaXRtYXAuCi0gICAgICogQHBhcmFtIGZpbGVVcmwgdGhlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkLgotICAgICAqIEBwYXJhbSBjb252ZXJ0IGlmIDxjb2RlPnRydWU8L2NvZGU+LCBub24gOS1wYXRjaCBiaXRtYXAgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIDkgcGF0Y2guCi0gICAgICogSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCB0aGUgYml0bWFwIGlzIG5vdCBhIDkgcGF0Y2gsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIE5pbmVQYXRjaH0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmluZVBhdGNoIGxvYWQoVVJMIGZpbGVVcmwsIGJvb2xlYW4gY29udmVydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbWFnZSAgPSBHcmFwaGljc1V0aWxpdGllcy5sb2FkQ29tcGF0aWJsZUltYWdlKGZpbGVVcmwpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVhbGx5IHRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbmluZyBzaW5jZSB3ZSdyZSBub3QgY3JlYXRpbmcgdGhlIFVSTCBtYW51YWxseS4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpczlQYXRjaCA9IGZpbGVVcmwuZ2V0UGF0aCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OXzlQQVRDSCk7Ci0KLSAgICAgICAgcmV0dXJuIGxvYWQoaW1hZ2UsIGlzOVBhdGNoLCBjb252ZXJ0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhIDkgcGF0Y2ggb3IgcmVndWxhciBiaXRtYXAuCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBvZiB0aGUgZmlsZSB0byBsb2FkLgotICAgICAqIEBwYXJhbSBpczlQYXRjaCB3aGV0aGVyIHRoZSBmaWxlIHJlcHJlc2VudHMgYSA5LXBhdGNoCi0gICAgICogQHBhcmFtIGNvbnZlcnQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG5vbiA5LXBhdGNoIGJpdG1hcCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgOSBwYXRjaC4KLSAgICAgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBiaXRtYXAgaXMgbm90IGEgOSBwYXRjaCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTmluZVBhdGNofSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOaW5lUGF0Y2ggbG9hZChJbnB1dFN0cmVhbSBzdHJlYW0sIGJvb2xlYW4gaXM5UGF0Y2gsIGJvb2xlYW4gY29udmVydCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW1hZ2UgID0gR3JhcGhpY3NVdGlsaXRpZXMubG9hZENvbXBhdGlibGVJbWFnZShzdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVhbGx5IHRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbmluZyBzaW5jZSB3ZSdyZSBub3QgY3JlYXRpbmcgdGhlIFVSTCBtYW51YWxseS4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvYWQoaW1hZ2UsIGlzOVBhdGNoLCBjb252ZXJ0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhIDkgcGF0Y2ggb3IgcmVndWxhciBiaXRtYXAuCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBzb3VyY2Uge0BsaW5rIEJ1ZmZlcmVkSW1hZ2V9LgotICAgICAqIEBwYXJhbSBpczlQYXRjaCB3aGV0aGVyIHRoZSBmaWxlIHJlcHJlc2VudHMgYSA5LXBhdGNoCi0gICAgICogQHBhcmFtIGNvbnZlcnQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG5vbiA5LXBhdGNoIGJpdG1hcCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgOSBwYXRjaC4KLSAgICAgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBiaXRtYXAgaXMgbm90IGEgOSBwYXRjaCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTmluZVBhdGNofSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOaW5lUGF0Y2ggbG9hZChCdWZmZXJlZEltYWdlIGltYWdlLCBib29sZWFuIGlzOVBhdGNoLCBib29sZWFuIGNvbnZlcnQpIHsKLSAgICAgICAgaWYgKGlzOVBhdGNoID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAoY29udmVydCkgewotICAgICAgICAgICAgICAgIGltYWdlID0gY29udmVydFRvOVBhdGNoKGltYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbnN1cmU5UGF0Y2goaW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBOaW5lUGF0Y2goaW1hZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtSW1hZ2UuZ2V0V2lkdGgoKSAtIDI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBtSW1hZ2UuZ2V0SGVpZ2h0KCkgLSAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZGRpbmcgYXJyYXkgb2YgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tIHBhZGRpbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UGFkZGluZyhpbnRbXSBwYWRkaW5nKSB7Ci0gICAgICAgIHBhZGRpbmdbMF0gPSBtSG9yaXpvbnRhbFBhZGRpbmcubUZpcnN0OyAvLyBsZWZ0Ci0gICAgICAgIHBhZGRpbmdbMl0gPSBtSG9yaXpvbnRhbFBhZGRpbmcubVNlY29uZDsgLy8gcmlnaHQKLSAgICAgICAgcGFkZGluZ1sxXSA9IG1WZXJ0aWNhbFBhZGRpbmcubUZpcnN0OyAvLyB0b3AKLSAgICAgICAgcGFkZGluZ1szXSA9IG1WZXJ0aWNhbFBhZGRpbmcubVNlY29uZDsgLy8gYm90dG9tCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGdyYXBoaWNzMkQsIGludCB4LCBpbnQgeSwgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChzY2FsZWRXaWR0aCA8PSAxIHx8IHNjYWxlZEhlaWdodCA8PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBHcmFwaGljczJEIGcgPSAoR3JhcGhpY3MyRClncmFwaGljczJELmNyZWF0ZSgpOwotICAgICAgICBnLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0lOVEVSUE9MQVRJT04sCi0gICAgICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuVkFMVUVfSU5URVJQT0xBVElPTl9CSUxJTkVBUik7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1QYXRjaGVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UobUltYWdlLCB4LCB5LCBzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0LCBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGcudHJhbnNsYXRlKHgsIHkpOwotICAgICAgICAgICAgeCA9IHkgPSAwOwotCi0gICAgICAgICAgICBjb21wdXRlUGF0Y2hlcyhzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0KTsKLQotICAgICAgICAgICAgaW50IGZpeGVkSW5kZXggPSAwOwotICAgICAgICAgICAgaW50IGhvcml6b250YWxJbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgdmVydGljYWxJbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgcGF0Y2hJbmRleCA9IDA7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaFN0cmV0Y2g7Ci0gICAgICAgICAgICBib29sZWFuIHZTdHJldGNoOwotCi0gICAgICAgICAgICBmbG9hdCB2V2VpZ2h0U3VtID0gMS4wZjsKLSAgICAgICAgICAgIGZsb2F0IHZSZW1haW5kZXIgPSBtUmVtYWluZGVyVmVydGljYWw7Ci0KLSAgICAgICAgICAgIHZTdHJldGNoID0gbVZlcnRpY2FsU3RhcnRXaXRoUGF0Y2g7Ci0gICAgICAgICAgICB3aGlsZSAoeSA8IHNjYWxlZEhlaWdodCAtIDEpIHsKLSAgICAgICAgICAgICAgICBoU3RyZXRjaCA9IG1Ib3Jpem9udGFsU3RhcnRXaXRoUGF0Y2g7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICBmbG9hdCB2RXh0cmEgPSAwLjBmOwotCi0gICAgICAgICAgICAgICAgZmxvYXQgaFdlaWdodFN1bSA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZmxvYXQgaFJlbWFpbmRlciA9IG1SZW1haW5kZXJIb3Jpem9udGFsOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKHggPCBzY2FsZWRXaWR0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdlN0cmV0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoU3RyZXRjaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBtSG9yaXpvbnRhbFBhdGNoZXMuZ2V0KGhvcml6b250YWxJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBleHRyYSA9IHIud2lkdGggLyBtSG9yaXpvbnRhbFBhdGNoZXNTdW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGV4dHJhICogaFJlbWFpbmRlciAvIGhXZWlnaHRTdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXZWlnaHRTdW0gLT0gZXh0cmE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJlbWFpbmRlciAtPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShtSW1hZ2UsIHgsIHksIHggKyB3aWR0aCwgeSArIHIuaGVpZ2h0LCByLngsIHIueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueCArIHIud2lkdGgsIHIueSArIHIuaGVpZ2h0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbUZpeGVkLmdldChmaXhlZEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKG1JbWFnZSwgeCwgeSwgeCArIHIud2lkdGgsIHkgKyByLmhlaWdodCwgci54LCByLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnggKyByLndpZHRoLCByLnkgKyByLmhlaWdodCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSByLndpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gci5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFN0cmV0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbVBhdGNoZXMuZ2V0KHBhdGNoSW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdkV4dHJhID0gci5oZWlnaHQgLyBtVmVydGljYWxQYXRjaGVzU3VtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IChpbnQpICh2RXh0cmEgKiB2UmVtYWluZGVyIC8gdldlaWdodFN1bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZXh0cmEgPSByLndpZHRoIC8gbUhvcml6b250YWxQYXRjaGVzU3VtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChleHRyYSAqIGhSZW1haW5kZXIgLyBoV2VpZ2h0U3VtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV2VpZ2h0U3VtIC09IGV4dHJhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSZW1haW5kZXIgLT0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UobUltYWdlLCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHIueCwgci55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci54ICsgci53aWR0aCwgci55ICsgci5oZWlnaHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBtVmVydGljYWxQYXRjaGVzLmdldCh2ZXJ0aWNhbEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFeHRyYSA9IHIuaGVpZ2h0IC8gbVZlcnRpY2FsUGF0Y2hlc1N1bTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAoaW50KSAodkV4dHJhICogdlJlbWFpbmRlciAvIHZXZWlnaHRTdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKG1JbWFnZSwgeCwgeSwgeCArIHIud2lkdGgsIHkgKyBoZWlnaHQsIHIueCwgci55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci54ICsgci53aWR0aCwgci55ICsgci5oZWlnaHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gci53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhTdHJldGNoID0gIWhTdHJldGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgICAgICB5ICs9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAodlN0cmV0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgdldlaWdodFN1bSAtPSB2RXh0cmE7Ci0gICAgICAgICAgICAgICAgICAgIHZSZW1haW5kZXIgLT0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2U3RyZXRjaCA9ICF2U3RyZXRjaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNvbXB1dGVQYXRjaGVzKGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCkgewotICAgICAgICBib29sZWFuIG1lYXN1cmVkV2lkdGggPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBlbmRSb3cgPSB0cnVlOwotCi0gICAgICAgIGludCByZW1haW5kZXJIb3Jpem9udGFsID0gMDsKLSAgICAgICAgaW50IHJlbWFpbmRlclZlcnRpY2FsID0gMDsKLQotICAgICAgICBpZiAobUZpeGVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IG1GaXhlZC5nZXQoMCkueTsKLSAgICAgICAgICAgIGZvciAoUmVjdGFuZ2xlIHJlY3QgOiBtRml4ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjdC55ID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kUm93ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbWVhc3VyZWRXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICByZW1haW5kZXJIb3Jpem9udGFsICs9IHJlY3Qud2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbmRSb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyVmVydGljYWwgKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGVuZFJvdyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlY3QueTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVtYWluZGVySG9yaXpvbnRhbCA9IHNjYWxlZFdpZHRoIC0gcmVtYWluZGVySG9yaXpvbnRhbDsKLQotICAgICAgICBtUmVtYWluZGVyVmVydGljYWwgPSBzY2FsZWRIZWlnaHQgLSByZW1haW5kZXJWZXJ0aWNhbDsKLQotICAgICAgICBtSG9yaXpvbnRhbFBhdGNoZXNTdW0gPSAwOwotICAgICAgICBpZiAobUhvcml6b250YWxQYXRjaGVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IC0xOwotICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcmVjdCA6IG1Ib3Jpem9udGFsUGF0Y2hlcykgewotICAgICAgICAgICAgICAgIGlmIChyZWN0LnggPiBzdGFydCkgewotICAgICAgICAgICAgICAgICAgICBtSG9yaXpvbnRhbFBhdGNoZXNTdW0gKz0gcmVjdC53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByZWN0Lng7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSByZWN0IDogbVBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjdC54ID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhvcml6b250YWxQYXRjaGVzU3VtICs9IHJlY3Qud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVjdC54OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1WZXJ0aWNhbFBhdGNoZXNTdW0gPSAwOwotICAgICAgICBpZiAobVZlcnRpY2FsUGF0Y2hlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgIGZvciAoUmVjdGFuZ2xlIHJlY3QgOiBtVmVydGljYWxQYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QueSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZXJ0aWNhbFBhdGNoZXNTdW0gKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVjdC55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IC0xOwotICAgICAgICAgICAgZm9yIChSZWN0YW5nbGUgcmVjdCA6IG1QYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QueSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZXJ0aWNhbFBhdGNoZXNTdW0gKz0gcmVjdC5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVjdC55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBOaW5lUGF0Y2goQnVmZmVyZWRJbWFnZSBpbWFnZSkgewotICAgICAgICBtSW1hZ2UgPSBpbWFnZTsKLQotICAgICAgICBmaW5kUGF0Y2hlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5kUGF0Y2hlcygpIHsKLSAgICAgICAgaW50IHdpZHRoID0gbUltYWdlLmdldFdpZHRoKCk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBtSW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgcm93ID0gR3JhcGhpY3NVdGlsaXRpZXMuZ2V0UGl4ZWxzKG1JbWFnZSwgMCwgMCwgd2lkdGgsIDEsIHJvdyk7Ci0gICAgICAgIGNvbHVtbiA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhtSW1hZ2UsIDAsIDAsIDEsIGhlaWdodCwgY29sdW1uKTsKLQotICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bMV07Ci0gICAgICAgIFBhaXI8TGlzdDxQYWlyPEludGVnZXI+Pj4gbGVmdCA9IGdldFBhdGNoZXMoY29sdW1uLCByZXN1bHQpOwotICAgICAgICBtVmVydGljYWxTdGFydFdpdGhQYXRjaCA9IHJlc3VsdFswXTsKLQotICAgICAgICByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLSAgICAgICAgUGFpcjxMaXN0PFBhaXI8SW50ZWdlcj4+PiB0b3AgPSBnZXRQYXRjaGVzKHJvdywgcmVzdWx0KTsKLSAgICAgICAgbUhvcml6b250YWxTdGFydFdpdGhQYXRjaCA9IHJlc3VsdFswXTsKLQotICAgICAgICBtRml4ZWQgPSBnZXRSZWN0YW5nbGVzKGxlZnQubUZpcnN0LCB0b3AubUZpcnN0KTsKLSAgICAgICAgbVBhdGNoZXMgPSBnZXRSZWN0YW5nbGVzKGxlZnQubVNlY29uZCwgdG9wLm1TZWNvbmQpOwotCi0gICAgICAgIGlmIChtRml4ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUhvcml6b250YWxQYXRjaGVzID0gZ2V0UmVjdGFuZ2xlcyhsZWZ0Lm1GaXJzdCwgdG9wLm1TZWNvbmQpOwotICAgICAgICAgICAgbVZlcnRpY2FsUGF0Y2hlcyA9IGdldFJlY3RhbmdsZXMobGVmdC5tU2Vjb25kLCB0b3AubUZpcnN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0b3AubUZpcnN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtSG9yaXpvbnRhbFBhdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFJlY3RhbmdsZT4oMCk7Ci0gICAgICAgICAgICAgICAgbVZlcnRpY2FsUGF0Y2hlcyA9IGdldFZlcnRpY2FsUmVjdGFuZ2xlcyh0b3AubUZpcnN0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdC5tRmlyc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG1Ib3Jpem9udGFsUGF0Y2hlcyA9IGdldEhvcml6b250YWxSZWN0YW5nbGVzKGxlZnQubUZpcnN0KTsKLSAgICAgICAgICAgICAgICBtVmVydGljYWxQYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSG9yaXpvbnRhbFBhdGNoZXMgPSBtVmVydGljYWxQYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcm93ID0gR3JhcGhpY3NVdGlsaXRpZXMuZ2V0UGl4ZWxzKG1JbWFnZSwgMCwgaGVpZ2h0IC0gMSwgd2lkdGgsIDEsIHJvdyk7Ci0gICAgICAgIGNvbHVtbiA9IEdyYXBoaWNzVXRpbGl0aWVzLmdldFBpeGVscyhtSW1hZ2UsIHdpZHRoIC0gMSwgMCwgMSwgaGVpZ2h0LCBjb2x1bW4pOwotCi0gICAgICAgIHRvcCA9IGdldFBhdGNoZXMocm93LCByZXN1bHQpOwotICAgICAgICBtSG9yaXpvbnRhbFBhZGRpbmcgPSBnZXRQYWRkaW5nKHRvcC5tRmlyc3QpOwotCi0gICAgICAgIGxlZnQgPSBnZXRQYXRjaGVzKGNvbHVtbiwgcmVzdWx0KTsKLSAgICAgICAgbVZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmcobGVmdC5tRmlyc3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxSZWN0YW5nbGU+IGdldFZlcnRpY2FsUmVjdGFuZ2xlcyhMaXN0PFBhaXI8SW50ZWdlcj4+IHRvcFBhaXJzKSB7Ci0gICAgICAgIExpc3Q8UmVjdGFuZ2xlPiByZWN0YW5nbGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KCk7Ci0gICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyPiB0b3AgOiB0b3BQYWlycykgewotICAgICAgICAgICAgaW50IHggPSB0b3AubUZpcnN0OwotICAgICAgICAgICAgaW50IHdpZHRoID0gdG9wLm1TZWNvbmQgLSB0b3AubUZpcnN0OwotCi0gICAgICAgICAgICByZWN0YW5nbGVzLmFkZChuZXcgUmVjdGFuZ2xlKHgsIDEsIHdpZHRoLCBtSW1hZ2UuZ2V0SGVpZ2h0KCkgLSAyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlY3RhbmdsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFJlY3RhbmdsZT4gZ2V0SG9yaXpvbnRhbFJlY3RhbmdsZXMoTGlzdDxQYWlyPEludGVnZXI+PiBsZWZ0UGFpcnMpIHsKLSAgICAgICAgTGlzdDxSZWN0YW5nbGU+IHJlY3RhbmdsZXMgPSBuZXcgQXJyYXlMaXN0PFJlY3RhbmdsZT4oKTsKLSAgICAgICAgZm9yIChQYWlyPEludGVnZXI+IGxlZnQgOiBsZWZ0UGFpcnMpIHsKLSAgICAgICAgICAgIGludCB5ID0gbGVmdC5tRmlyc3Q7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbGVmdC5tU2Vjb25kIC0gbGVmdC5tRmlyc3Q7Ci0KLSAgICAgICAgICAgIHJlY3RhbmdsZXMuYWRkKG5ldyBSZWN0YW5nbGUoMSwgeSwgbUltYWdlLmdldFdpZHRoKCkgLSAyLCBoZWlnaHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVjdGFuZ2xlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhaXI8SW50ZWdlcj4gZ2V0UGFkZGluZyhMaXN0PFBhaXI8SW50ZWdlcj4+IHBhaXJzKSB7Ci0gICAgICAgIGlmIChwYWlycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWlyPEludGVnZXI+KDAsIDApOwotICAgICAgICB9IGVsc2UgaWYgKHBhaXJzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAocGFpcnMuZ2V0KDApLm1GaXJzdCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWlyPEludGVnZXI+KHBhaXJzLmdldCgwKS5tU2Vjb25kIC0gcGFpcnMuZ2V0KDApLm1GaXJzdCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxJbnRlZ2VyPigwLCBwYWlycy5nZXQoMCkubVNlY29uZCAtIHBhaXJzLmdldCgwKS5tRmlyc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGluZGV4ID0gcGFpcnMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxJbnRlZ2VyPihwYWlycy5nZXQoMCkubVNlY29uZCAtIHBhaXJzLmdldCgwKS5tRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIHBhaXJzLmdldChpbmRleCkubVNlY29uZCAtIHBhaXJzLmdldChpbmRleCkubUZpcnN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxSZWN0YW5nbGU+IGdldFJlY3RhbmdsZXMoTGlzdDxQYWlyPEludGVnZXI+PiBsZWZ0UGFpcnMsCi0gICAgICAgICAgICBMaXN0PFBhaXI8SW50ZWdlcj4+IHRvcFBhaXJzKSB7Ci0gICAgICAgIExpc3Q8UmVjdGFuZ2xlPiByZWN0YW5nbGVzID0gbmV3IEFycmF5TGlzdDxSZWN0YW5nbGU+KCk7Ci0gICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyPiBsZWZ0IDogbGVmdFBhaXJzKSB7Ci0gICAgICAgICAgICBpbnQgeSA9IGxlZnQubUZpcnN0OwotICAgICAgICAgICAgaW50IGhlaWdodCA9IGxlZnQubVNlY29uZCAtIGxlZnQubUZpcnN0OwotICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXI+IHRvcCA6IHRvcFBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgaW50IHggPSB0b3AubUZpcnN0OwotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHRvcC5tU2Vjb25kIC0gdG9wLm1GaXJzdDsKLQotICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMuYWRkKG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWN0YW5nbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFpcjxMaXN0PFBhaXI8SW50ZWdlcj4+PiBnZXRQYXRjaGVzKGludFtdIHBpeGVscywgYm9vbGVhbltdIHN0YXJ0V2l0aFBhdGNoKSB7Ci0gICAgICAgIGludCBsYXN0SW5kZXggPSAxOwotICAgICAgICBpbnQgbGFzdFBpeGVsID0gcGl4ZWxzWzFdOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQotICAgICAgICBMaXN0PFBhaXI8SW50ZWdlcj4+IGZpeGVkID0gbmV3IEFycmF5TGlzdDxQYWlyPEludGVnZXI+PigpOwotICAgICAgICBMaXN0PFBhaXI8SW50ZWdlcj4+IHBhdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8SW50ZWdlcj4+KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwaXhlbHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGl4ZWwgPSBwaXhlbHNbaV07Ci0gICAgICAgICAgICBpZiAocGl4ZWwgIT0gbGFzdFBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RQaXhlbCA9PSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgc3RhcnRXaXRoUGF0Y2hbMF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLmFkZChuZXcgUGFpcjxJbnRlZ2VyPihsYXN0SW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaXhlZC5hZGQobmV3IFBhaXI8SW50ZWdlcj4obGFzdEluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBpOwotICAgICAgICAgICAgICAgIGxhc3RQaXhlbCA9IHBpeGVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0UGl4ZWwgPT0gMHhGRjAwMDAwMCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSBzdGFydFdpdGhQYXRjaFswXSA9IHRydWU7Ci0gICAgICAgICAgICBwYXRjaGVzLmFkZChuZXcgUGFpcjxJbnRlZ2VyPihsYXN0SW5kZXgsIHBpeGVscy5sZW5ndGggLSAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaXhlZC5hZGQobmV3IFBhaXI8SW50ZWdlcj4obGFzdEluZGV4LCBwaXhlbHMubGVuZ3RoIC0gMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdGNoZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHBhdGNoZXMuYWRkKG5ldyBQYWlyPEludGVnZXI+KDEsIHBpeGVscy5sZW5ndGggLSAxKSk7Ci0gICAgICAgICAgICBzdGFydFdpdGhQYXRjaFswXSA9IHRydWU7Ci0gICAgICAgICAgICBmaXhlZC5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYWlyPExpc3Q8UGFpcjxJbnRlZ2VyPj4+KGZpeGVkLCBwYXRjaGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZTlQYXRjaChCdWZmZXJlZEltYWdlIGltYWdlKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IGltYWdlLmdldFdpZHRoKCk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBpbWFnZS5nZXRIZWlnaHQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGl4ZWwgPSBpbWFnZS5nZXRSR0IoaSwgMCk7Ci0gICAgICAgICAgICBpZiAocGl4ZWwgIT0gMCAmJiBwaXhlbCAhPSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2Uuc2V0UkdCKGksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWwgPSBpbWFnZS5nZXRSR0IoaSwgaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICBpZiAocGl4ZWwgIT0gMCAmJiBwaXhlbCAhPSAweEZGMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2Uuc2V0UkdCKGksIGhlaWdodCAtIDEsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgIGludCBwaXhlbCA9IGltYWdlLmdldFJHQigwLCBpKTsKLSAgICAgICAgICAgIGlmIChwaXhlbCAhPSAwICYmIHBpeGVsICE9IDB4RkYwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBpbWFnZS5zZXRSR0IoMCwgaSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbCA9IGltYWdlLmdldFJHQih3aWR0aCAtIDEsIGkpOwotICAgICAgICAgICAgaWYgKHBpeGVsICE9IDAgJiYgcGl4ZWwgIT0gMHhGRjAwMDAwMCkgewotICAgICAgICAgICAgICAgIGltYWdlLnNldFJHQih3aWR0aCAtIDEsIGksIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG85UGF0Y2goQnVmZmVyZWRJbWFnZSBpbWFnZSkgewotICAgICAgICBCdWZmZXJlZEltYWdlIGJ1ZmZlciA9IEdyYXBoaWNzVXRpbGl0aWVzLmNyZWF0ZVRyYW5zbHVjZW50Q29tcGF0aWJsZUltYWdlKAotICAgICAgICAgICAgICAgIGltYWdlLmdldFdpZHRoKCkgKyAyLCBpbWFnZS5nZXRIZWlnaHQoKSArIDIpOwotCi0gICAgICAgIEdyYXBoaWNzMkQgZzIgPSBidWZmZXIuY3JlYXRlR3JhcGhpY3MoKTsKLSAgICAgICAgZzIuZHJhd0ltYWdlKGltYWdlLCAxLCAxLCBudWxsKTsKLSAgICAgICAgZzIuZGlzcG9zZSgpOwotCi0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBhaXI8RT4gewotICAgICAgICBFIG1GaXJzdDsKLSAgICAgICAgRSBtU2Vjb25kOwotCi0gICAgICAgIFBhaXIoRSBmaXJzdCwgRSBzZWNvbmQpIHsKLSAgICAgICAgICAgIG1GaXJzdCA9IGZpcnN0OwotICAgICAgICAgICAgbVNlY29uZCA9IHNlY29uZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQYWlyWyIgKyBtRmlyc3QgKyAiLCAiICsgbVNlY29uZCArICJdIjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmVlbnNob3QvLmNsYXNzcGF0aCBiL3Rvb2xzL3NjcmVlbnNob3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzMjZjOC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JlZW5zaG90Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9kZG1saWIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyZWVuc2hvdC8uZ2l0aWdub3JlIGIvdG9vbHMvc2NyZWVuc2hvdC8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmVlbnNob3QvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyZWVuc2hvdC8ucHJvamVjdCBiL3Rvb2xzL3NjcmVlbnNob3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDNmNTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyZWVuc2hvdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnNjcmVlbnNob3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rIGIvdG9vbHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y5MDkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmVlbnNob3QvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1TQ1JFRU5TSE9UMl9MT0NBTF9ESVIgOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChTQ1JFRU5TSE9UMl9MT0NBTF9ESVIpL2V0Yy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoU0NSRUVOU0hPVDJfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyZWVuc2hvdC9ldGMvQW5kcm9pZC5tayBiL3Rvb2xzL3NjcmVlbnNob3QvZXRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDc1MzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyZWVuc2hvdC9ldGMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gc2NyZWVuc2hvdDIKLWluY2x1ZGUgJChCVUlMRF9IT1NUX1BSRUJVSUxUKQotCmRpZmYgLS1naXQgYS90b29scy9zY3JlZW5zaG90L2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy9zY3JlZW5zaG90L2V0Yy9tYW5pZmVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Mjg3NGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyZWVuc2hvdC9ldGMvbWFuaWZlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQuc2NyZWVuc2hvdC5TY3JlZW5zaG90CmRpZmYgLS1naXQgYS90b29scy9zY3JlZW5zaG90L2V0Yy9zY3JlZW5zaG90MiBiL3Rvb2xzL3NjcmVlbnNob3QvZXRjL3NjcmVlbnNob3QyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMGI5MjFhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmVlbnNob3QvZXRjL3NjcmVlbnNob3QyCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyEvYmluL3NoCi0jIENvcHlyaWdodCAyMDA1LTIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLSMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXByb2c9IiQwIgotd2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KLSAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCi0gICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCi0gICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCi0gICAgZWxzZQotICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLSAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgotICAgIGZpCi1kb25lCi1vbGR3ZD1gcHdkYAotcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtvbGR3ZH0iCi0KLWphcmZpbGU9c2NyZWVuc2hvdDIuamFyCi1mcmFtZXdvcmtkaXI9IiRwcm9nZGlyIgotbGliZGlyPSIkcHJvZ2RpciIKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2ZyYW1ld29yawotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBlY2hvIGBiYXNlbmFtZSAiJHByb2ciYCI6IGNhbid0IGZpbmQgJGphcmZpbGUiCi0gICAgZXhpdCAxCi1maQotCi0KLSMgQ2hlY2sgYXJncy4KLWlmIFsgZGVidWcgPSAiJDEiIF07IHRoZW4KLSAgICAjIGFkZCB0aGlzIGluIGZvciBkZWJ1Z2dpbmcKLSAgICBqYXZhX2RlYnVnPS1hZ2VudGxpYjpqZHdwPXRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksYWRkcmVzcz04MDUwLHN1c3BlbmQ9eQotICAgIHNoaWZ0IDEKLWVsc2UKLSAgICBqYXZhX2RlYnVnPQotZmkKLQotaWYgWyAiJE9TVFlQRSIgPSAiY3lnd2luIiBdIDsgdGhlbgotICAgIGphcnBhdGg9YGN5Z3BhdGggLXcgICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlImAKLSAgICBwcm9nZGlyPWBjeWdwYXRoIC13ICAiJHByb2dkaXIiYAotZWxzZQotICAgIGphcnBhdGg9IiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiCi1maQotCi0jIG5lZWQgdG8gdXNlICJqYXZhLmV4dC5kaXJzIiBiZWNhdXNlICItamFyIiBjYXVzZXMgY2xhc3NwYXRoIHRvIGJlIGlnbm9yZWQKLSMgbWlnaHQgbmVlZCBtb3JlIG1lbW9yeSwgZS5nLiAtWG14MTI4TQotZXhlYyBqYXZhIC1YbXgxMjhNICRvc19vcHRzICRqYXZhX2RlYnVnIC1EamF2YS5leHQuZGlycz0iJGZyYW1ld29ya2RpciIgLURqYXZhLmxpYnJhcnkucGF0aD0iJGxpYmRpciIgLURjb20uYW5kcm9pZC5zY3JlZW5zaG90LmJpbmRpcj0iJHByb2dkaXIiIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9zY3JlZW5zaG90L3NyYy9BbmRyb2lkLm1rIGIvdG9vbHMvc2NyZWVuc2hvdC9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1ZWEzYS4uMDAwMDAwMAotLS0gYS90b29scy9zY3JlZW5zaG90L3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfSkFSX01BTklGRVNUIDo9IC4uL2V0Yy9tYW5pZmVzdC50eHQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlkZG1saWIKLUxPQ0FMX01PRFVMRSA6PSBzY3JlZW5zaG90MgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmVlbnNob3Qvc3JjL2NvbS9hbmRyb2lkL3NjcmVlbnNob3QvU2NyZWVuc2hvdC5qYXZhIGIvdG9vbHMvc2NyZWVuc2hvdC9zcmMvY29tL2FuZHJvaWQvc2NyZWVuc2hvdC9TY3JlZW5zaG90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZmU1MjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyZWVuc2hvdC9zcmMvY29tL2FuZHJvaWQvc2NyZWVuc2hvdC9TY3JlZW5zaG90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2NyZWVuc2hvdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BbmRyb2lkRGVidWdCcmlkZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuUmF3SW1hZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5JTG9nT3V0cHV0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotCi0vKioKLSAqIENvbm5lY3RzIHRvIGEgZGV2aWNlIHVzaW5nIGRkbWxpYiBhbmQgZHVtcHMgaXRzIGV2ZW50IGxvZyBhcyBsb25nIGFzIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU2NyZWVuc2hvdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGJvb2xlYW4gZGV2aWNlID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW11bGF0b3IgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNlcmlhbCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmaWxlcGF0aCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gbGFuZHNjYXBlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2VBbmRRdWl0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgU3RyaW5nIGFyZ3VtZW50ID0gYXJnc1tpbmRleCsrXTsKLQotICAgICAgICAgICAgaWYgKCItZCIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIGlmIChlbXVsYXRvciB8fCBzZXJpYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIi1kIGNvbmZsaWN0cyB3aXRoIC1lIGFuZCAtcyIsIGZhbHNlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRldmljZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItZSIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgfHwgc2VyaWFsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRBbmRFeGl0KCItZSBjb25mbGljdHMgd2l0aCAtZCBhbmQgLXMiLCBmYWxzZSAvKiB0ZXJtaW5hdGUgKi8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbXVsYXRvciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCItcyIuZXF1YWxzKGFyZ3VtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIG9uIHRoZSBuZXh0IGFyZ3VtZW50LgotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIk1pc3Npbmcgc2VyaWFsIG51bWJlciBhZnRlciAtcyIsIGZhbHNlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZSB8fCBlbXVsYXRvcikgewotICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIi1zIGNvbmZsaWN0cyB3aXRoIC1kIGFuZCAtZSIsIGZhbHNlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2VyaWFsID0gYXJnc1tpbmRleCsrXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1sIi5lcXVhbHMoYXJndW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgbGFuZHNjYXBlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaWxlcGF0aCBhbmQgYnJlYWsuCi0gICAgICAgICAgICAgICAgZmlsZXBhdGggPSBhcmd1bWVudDsKLQotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgYW55IG90aGVyIGRldmljZS4KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIlRvbyBtYW55IGFyZ3VtZW50cyEiLCBmYWxzZSAvKiB0ZXJtaW5hdGUgKi8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoaW5kZXggPCBhcmdzLmxlbmd0aCk7Ci0KLSAgICAgICAgaWYgKGZpbGVwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2VBbmRRdWl0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuc2V0TG9nT3V0cHV0KG5ldyBJTG9nT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRBbmRQcm9tcHRMb2coTG9nTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGxvZ0xldmVsLmdldFN0cmluZ1ZhbHVlKCkgKyAiOiIgKyB0YWcgKyAiOiIgKyBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRMb2coTG9nTGV2ZWwgbG9nTGV2ZWwsIFN0cmluZyB0YWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGxvZ0xldmVsLmdldFN0cmluZ1ZhbHVlKCkgKyAiOiIgKyB0YWcgKyAiOiIgKyBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gaW5pdCB0aGUgbGliCi0gICAgICAgIC8vIFt0cnkgdG9dIGVuc3VyZSBBREIgaXMgcnVubmluZwotICAgICAgICBTdHJpbmcgYWRiTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbS5hbmRyb2lkLnNjcmVlbnNob3QuYmluZGlyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGFkYkxvY2F0aW9uICE9IG51bGwgJiYgYWRiTG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgYWRiTG9jYXRpb24gKz0gRmlsZS5zZXBhcmF0b3IgKyAiYWRiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRiTG9jYXRpb24gPSAiYWRiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgQW5kcm9pZERlYnVnQnJpZGdlLmluaXQoZmFsc2UgLyogZGVidWdnZXIgc3VwcG9ydCAqLyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZSBicmlkZ2UgPSBBbmRyb2lkRGVidWdCcmlkZ2UuY3JlYXRlQnJpZGdlKAotICAgICAgICAgICAgICAgICAgICBhZGJMb2NhdGlvbiwgdHJ1ZSAvKiBmb3JjZU5ld0JyaWRnZSAqLyk7Ci0KLSAgICAgICAgICAgIC8vIHdlIGNhbid0IGp1c3QgYXNrIGZvciB0aGUgZGV2aWNlIGxpc3QgcmlnaHQgYXdheSwgYXMgdGhlIGludGVybmFsIHRocmVhZCBnZXR0aW5nCi0gICAgICAgICAgICAvLyB0aGVtIGZyb20gQURCIG1heSBub3QgYmUgZG9uZSBnZXR0aW5nIHRoZSBmaXJzdCBsaXN0LgotICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgcmVhbGx5IHdhbnQgZ2V0RGV2aWNlcygpIHRvIGJlIGJsb2NraW5nLCB3ZSB3YWl0IGhlcmUgbWFudWFsbHkuCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGJyaWRnZS5oYXNJbml0aWFsRGV2aWNlTGlzdCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbGV0J3Mgbm90IHdhaXQgPiAxMCBzZWMuCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGltZW91dCBnZXR0aW5nIGRldmljZSBsaXN0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgZ2V0IHRoZSBkZXZpY2VzCi0gICAgICAgICAgICBJRGV2aWNlW10gZGV2aWNlcyA9IGJyaWRnZS5nZXREZXZpY2VzKCk7Ci0KLSAgICAgICAgICAgIGlmIChkZXZpY2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRBbmRFeGl0KCJObyBkZXZpY2VzIGZvdW5kISIsIHRydWUgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSURldmljZSB0YXJnZXQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoZW11bGF0b3IgfHwgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJRGV2aWNlIGQgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVzdCB3b3JrcyBiZWNhdXNlIGVtdWxhdG9yIGFuZCBkZXZpY2UgY2FuJ3QgYm90aCBiZSB0cnVlIGF0IHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIHRpbWUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChkLmlzRW11bGF0b3IoKSA9PSBlbXVsYXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBmb3VuZCBhIHZhbGlkIHRhcmdldCwgd2UgcHJpbnQgYW4gZXJyb3IgYW5kIHJldHVybi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXVsYXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEFuZEV4aXQoIkVycm9yOiBtb3JlIHRoYW4gb25lIGVtdWxhdG9yIGxhdW5jaGVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB0ZXJtaW5hdGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50QW5kRXhpdCgiRXJyb3I6IG1vcmUgdGhhbiBvbmUgZGV2aWNlIGNvbm5lY3RlZCEiLHRydWUgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJpYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoSURldmljZSBkIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsLmVxdWFscyhkLmdldFNlcmlhbE51bWJlcigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50QW5kRXhpdCgiRXJyb3I6IG1vcmUgdGhhbiBvbmUgZW11bGF0b3Igb3IgZGV2aWNlIGF2YWlsYWJsZSEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGV2aWNlc1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUYWtpbmcgc2NyZWVuc2hvdCBmcm9tOiAiICsgdGFyZ2V0LmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlSW1hZ2UodGFyZ2V0LCBmaWxlcGF0aCwgbGFuZHNjYXBlKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZXNzLiIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50QW5kRXhpdCgiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgZGV2aWNlL2VtdWxhdG9yLiIsIHRydWUgLyogdGVybWluYXRlICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEFuZHJvaWREZWJ1Z0JyaWRnZS50ZXJtaW5hdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogR3JhYiBhbiBpbWFnZSBmcm9tIGFuIEFEQi1jb25uZWN0ZWQgZGV2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RGV2aWNlSW1hZ2UoSURldmljZSBkZXZpY2UsIFN0cmluZyBmaWxlcGF0aCwgYm9vbGVhbiBsYW5kc2NhcGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBSYXdJbWFnZSByYXdJbWFnZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmF3SW1hZ2UgPSBkZXZpY2UuZ2V0U2NyZWVuc2hvdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHByaW50QW5kRXhpdCgiVW5hYmxlIHRvIGdldCBmcmFtZSBidWZmZXI6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpLCB0cnVlIC8qIHRlcm1pbmF0ZSAqLyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZXZpY2UvYWRiIG5vdCBhdmFpbGFibGU/Ci0gICAgICAgIGlmIChyYXdJbWFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChsYW5kc2NhcGUpIHsKLSAgICAgICAgICAgIHJhd0ltYWdlID0gcmF3SW1hZ2UuZ2V0Um90YXRlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29udmVydCByYXcgZGF0YSB0byBhbiBJbWFnZQotICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UocmF3SW1hZ2Uud2lkdGgsIHJhd0ltYWdlLmhlaWdodCwKLSAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBJbmRleEluYyA9IHJhd0ltYWdlLmJwcCA+PiAzOwotICAgICAgICBmb3IgKGludCB5ID0gMCA7IHkgPCByYXdJbWFnZS5oZWlnaHQgOyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwIDsgeCA8IHJhd0ltYWdlLndpZHRoIDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gcmF3SW1hZ2UuZ2V0QVJHQihpbmRleCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggKz0gSW5kZXhJbmM7Ci0gICAgICAgICAgICAgICAgaW1hZ2Uuc2V0UkdCKHgsIHksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghSW1hZ2VJTy53cml0ZShpbWFnZSwgInBuZyIsIG5ldyBGaWxlKGZpbGVwYXRoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgcG5nIHdyaXRlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlQW5kUXVpdCgpIHsKLSAgICAgICAgLy8gODAgY29scyBtYXJrZXI6ICAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBzY3JlZW5zaG90MiBbLWQgfCAtZSB8IC1zIFNFUklBTF0gWy1sXSBPVVRfRklMRSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZCAgICAgIFVzZXMgdGhlIGZpcnN0IGRldmljZSBmb3VuZC4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWUgICAgICBVc2VzIHRoZSBmaXJzdCBlbXVsYXRvciBmb3VuZC4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXMgICAgICBUYXJnZXRzIHRoZSBkZXZpY2UgYnkgc2VyaWFsIG51bWJlci4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWwgICAgICBSb3RhdGUgaW1hZ2VzIGZvciBsYW5kc2NhcGUgbW9kZS4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50QW5kRXhpdChTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiB0ZXJtaW5hdGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICBpZiAodGVybWluYXRlKSB7Ci0gICAgICAgICAgICBBbmRyb2lkRGVidWdCcmlkZ2UudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QuYWxpYXMudGVtcGxhdGUgYi90b29scy9zY3JpcHRzL0FuZHJvaWRNYW5pZmVzdC5hbGlhcy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNmQzZC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL0FuZHJvaWRNYW5pZmVzdC5hbGlhcy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi1BTElBUyBQUk9KRUNUUyBBUkUgQ1VSUkVOVCBOT1QgU1VQUE9SVEVELgotVEhJUyBGSUxFIElTIENVUlJFTlRMWSBCUk9LRU4gQU5EIFNIT1VMRCBOT1QgQkUgVVNFRC4KLS0tPgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgIHBhY2thZ2U9IlBBQ0tBR0UiCi0gICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLkFsaWFzQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFsaWFzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2FsaWFzIiAvPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvQW5kcm9pZE1hbmlmZXN0LnRlbXBsYXRlIGIvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGYxNDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgIHBhY2thZ2U9IlBBQ0tBR0UiCi0gICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgSUNPTj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iQUNUSVZJVFlfRU5UUllfTkFNRSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvQW5kcm9pZE1hbmlmZXN0LnRlc3RzLnRlbXBsYXRlIGIvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVzdHMudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGZmNmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9BbmRyb2lkTWFuaWZlc3QudGVzdHMudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBwYWNrYWdlIG5hbWUgbXVzdCBiZSB1bmlxdWUgc28gc3VmZml4IHdpdGggInRlc3RzIiBzbyBwYWNrYWdlIGxvYWRlciBkb2Vzbid0IGlnbm9yZSB1cyAtLT4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iUEFDS0FHRS50ZXN0cyIKLSAgICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgICAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+Ci0gICAgPCEtLSBXZSBhZGQgYW4gYXBwbGljYXRpb24gdGFnIGhlcmUganVzdCBzbyB0aGF0IHdlIGNhbiBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICB0aGlzIHBhY2thZ2UgbmVlZHMgdG8gbGluayBhZ2FpbnN0IHRoZSBhbmRyb2lkLnRlc3QgbGlicmFyeSwKLSAgICAgICAgIHdoaWNoIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIHRlc3QgY2FzZXMuIC0tPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLSAgICA8IS0tCi0gICAgVGhpcyBkZWNsYXJlcyB0aGF0IHRoaXMgYXBwbGljYXRpb24gdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVubmVyIHRhcmdldGluZwotICAgIHRoZSBwYWNrYWdlIG9mIFBBQ0tBR0UuICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKLSAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgUEFDS0FHRS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9IlBBQ0tBR0UiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cyBmb3IgUEFDS0FHRSIvPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvUkVBRE1FX2FkZC1vbnMudHh0IGIvdG9vbHMvc2NyaXB0cy9SRUFETUVfYWRkLW9ucy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWIxZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9SRUFETUVfYWRkLW9ucy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUFkZC1vbiBmb2xkZXIuCi1Ecm9wIHZlbmRvciBzdXBwbGllZCBTREsgYWRkLW9uIGluIHRoaXMgZm9sZGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYWRkLWFjY291bnRzIGIvdG9vbHMvc2NyaXB0cy9hZGQtYWNjb3VudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyY2RkYzAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hZGQtYWNjb3VudHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0iIiIKLUEgZmF1eCBTZXR1cCBXaXphcmQuICBTdHVmZnMgb25lIG9yIHR3byB1c2VybmFtZXMgKyBwYXNzd29yZHMgaW50byB0aGUKLWRhdGFiYXNlIG9uIHRoZSBkZXZpY2UuCi0iIiIKLQotaW1wb3J0IHN5cwotaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDQwMDAwOgotICBwcmludCAiVGhpcyBzY3JpcHQgcmVxdWlyZXMgcHl0aG9uIDIuNCBvciBoaWdoZXIuIgotICBzeXMuZXhpdCgxKQotCi1pbXBvcnQgZ2V0cGFzcwotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCB0aW1lCi1pbXBvcnQgc2hhCi0KLURCID0gIi9kYXRhL2RhdGEvY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMvZGF0YWJhc2VzL2FjY291bnRzLmRiIgotCi1kZWYgUnVuQ21kKGFyZ3MpOgotICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICBvdXQgPSBwcm9jLnN0ZG91dC5yZWFkKCkKLSAgaWYgcHJvYy53YWl0KCk6Ci0gICAgcHJpbnQKLSAgICBwcmludCAiZmFpbGVkOiAlcyIgJSAiICIuam9pbihhcmdzKQotICAgIHJldHVybiBOb25lCi0gIHJldHVybiBvdXQKLQotZGVmIEdldFByb3AoYWRiX2ZsYWdzLCBuYW1lKToKLSAgYXJncyA9ICgiYWRiIiwpICsgYWRiX2ZsYWdzICsgKCJzaGVsbCIsICJzdSIsICJyb290IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc3lzdGVtL2Jpbi9nZXRwcm9wIiwgbmFtZSkKLSAgcmV0dXJuIFJ1bkNtZChhcmdzKQotCi1kZWYgU2V0UHJvcChhZGJfZmxhZ3MsIG5hbWUsIHZhbHVlKToKLSAgYXJncyA9ICgiYWRiIiwpICsgYWRiX2ZsYWdzICsgKCJzaGVsbCIsICJzdSIsICJyb290IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc3lzdGVtL2Jpbi9zZXRwcm9wIiwgbmFtZSwgdmFsdWUpCi0gIHJldHVybiBSdW5DbWQoYXJncykKLQotZGVmIERiRXhpc3RzKGFkYl9mbGFncyk6Ci0gIGFyZ3MgPSAoImFkYiIsKSArIGFkYl9mbGFncyArICgic2hlbGwiLCAic3UiLCAicm9vdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3N5c3RlbS9iaW4vbHMiLCBEQikKLSAgcmVzdWx0ID0gUnVuQ21kKGFyZ3MpCi0gIGlmIHJlc3VsdCBpcyBOb25lOiByZXR1cm4gTm9uZQotICByZXR1cm4gIk5vIHN1Y2ggZmlsZSIgbm90IGluIHJlc3VsdAotCi1kZWYgbWFpbihhcmd2KToKLSAgaWYgbGVuKGFyZ3YpID09IDE6Ci0gICAgcHJpbnQgKCJ1c2FnZTogJXMgW2FkYiBmbGFnc10gIgotICAgICAgICAgICAiWzxkYXNoZXIgYWRkcmVzc1s6cGFzc3dvcmRdPl0gIgotICAgICAgICAgICAiWzxnbWFpbCBhZGRyZXNzWzpwYXNzd29yZF0+XSIpICUgKGFyZ3ZbMF0sKQotICAgIHN5cy5leGl0KDIpCi0KLSAgYXJndiA9IGFyZ3ZbMTpdCi0KLSAgZ21haWwgPSBOb25lCi0gIGRhc2hlciA9IE5vbmUKLSAgd2hpbGUgYXJndiBhbmQgIkAiIGluIGFyZ3ZbLTFdOgotICAgIGFkZHIgPSBhcmd2LnBvcCgpCi0gICAgaWYgIkBnbWFpbC5jb20iIGluIGFkZHIgb3IgIkBnb29nbGVtYWlsLmNvbSIgaW4gYWRkcjoKLSAgICAgIGdtYWlsID0gYWRkcgotICAgIGVsc2U6Ci0gICAgICBkYXNoZXIgPSBhZGRyCi0KLSAgYWRiX2ZsYWdzID0gdHVwbGUoYXJndikKLQotICB3aGlsZSBUcnVlOgotICAgIGRiID0gRGJFeGlzdHMoYWRiX2ZsYWdzKQotICAgIGlmIGRiIGlzIE5vbmU6Ci0gICAgICBwcmludCAiZmFpbGVkIHRvIGNvbnRhY3QgZGV2aWNlOyB3aWxsIHJldHJ5IGluIDMgc2Vjb25kcyIKLSAgICAgIHRpbWUuc2xlZXAoMykKLSAgICAgIGNvbnRpbnVlCi0KLSAgICBpZiBkYjoKLSAgICAgIHByaW50Ci0gICAgICBwcmludCAiR29vZ2xlTG9naW5TZXJ2aWNlIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgb24gdGhpcyBkZXZpY2U7IgotICAgICAgcHJpbnQgIml0J3MgdG9vIGxhdGUgdG8gdXNlIHRoaXMgc2NyaXB0IHRvIGFkZCBhY2NvdW50cy4iCi0gICAgICBwcmludAotICAgICAgcHJpbnQgIlRoaXMgc2NyaXB0IG9ubHkgd29ya3Mgb24gYSBmcmVzaGx5LXdpcGVkIGRldmljZSAob3IgIgotICAgICAgcHJpbnQgImVtdWxhdG9yKSB3aGlsZSBib290aW5nIGZvciB0aGUgZmlyc3QgdGltZS4iCi0gICAgICBwcmludAotICAgICAgYnJlYWsKLQotICAgIGhvc3RlZF9hY2NvdW50ID0gR2V0UHJvcChhZGJfZmxhZ3MsICJyby5jb25maWcuaG9zdGVkX2FjY291bnQiKS5zdHJpcCgpCi0gICAgZ29vZ2xlX2FjY291bnQgPSBHZXRQcm9wKGFkYl9mbGFncywgInJvLmNvbmZpZy5nb29nbGVfYWNjb3VudCIpLnN0cmlwKCkKLQotICAgIGlmIGRhc2hlciBhbmQgaG9zdGVkX2FjY291bnQ6Ci0gICAgICBwcmludAotICAgICAgcHJpbnQgIkEgZGFzaGVyIGFjY291bnQgaXMgYWxyZWFkeSBjb25maWd1cmVkIG9uIHRoaXMgZGV2aWNlOyIKLSAgICAgIHByaW50ICJjYW4ndCBhZGQiLCBob3N0ZWRfYWNjb3VudAotICAgICAgcHJpbnQKLSAgICAgIGRhc2hlciA9IE5vbmUKLQotICAgIGlmIGdtYWlsIGFuZCBnb29nbGVfYWNjb3VudDoKLSAgICAgIHByaW50Ci0gICAgICBwcmludCAiQSBnb29nbGUgYWNjb3VudCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgb24gdGhpcyBkZXZpY2U7IgotICAgICAgcHJpbnQgImNhbid0IGFkZCIsIGdvb2dsZV9hY2NvdW50Ci0gICAgICBwcmludAotICAgICAgZ21haWwgPSBOb25lCi0KLSAgICBpZiBub3QgZ21haWwgYW5kIG5vdCBkYXNoZXI6IGJyZWFrCi0KLSAgICBpZiBkYXNoZXI6Ci0gICAgICBTZXRQcm9wKGFkYl9mbGFncywgInJvLmNvbmZpZy5ob3N0ZWRfYWNjb3VudCIsIGRhc2hlcikKLSAgICAgIHByaW50ICJzZXQgaG9zdGVkX2FjY291bnQgdG8iLCBkYXNoZXIKLSAgICBpZiBnbWFpbDoKLSAgICAgIFNldFByb3AoYWRiX2ZsYWdzLCAicm8uY29uZmlnLmdvb2dsZV9hY2NvdW50IiwgZ21haWwpCi0gICAgICBwcmludCAic2V0IGdvb2dsZV9hY2NvdW50IHRvIiwgZ21haWwKLQotICAgIGJyZWFrCi0KLQotCi0KLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9hZGQtYWNjb3VudHMtc2RrIGIvdG9vbHMvc2NyaXB0cy9hZGQtYWNjb3VudHMtc2RrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjM0NDdmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYWRkLWFjY291bnRzLXNkaworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSIiIgotQSBmYXV4IFNldHVwIFdpemFyZC4gIFN0dWZmcyBvbmUgb3IgdHdvIHVzZXJuYW1lcyArIHBhc3N3b3JkcyBpbnRvIHRoZQotZGF0YWJhc2Ugb24gdGhlIGRldmljZS4KLSIiIgotCi1pbXBvcnQgc3lzCi1pZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDIwNDAwMDA6Ci0gIHByaW50ICJUaGlzIHNjcmlwdCByZXF1aXJlcyBweXRob24gMi40IG9yIGhpZ2hlci4iCi0gIHN5cy5leGl0KDEpCi0KLWltcG9ydCBnZXRwYXNzCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHRpbWUKLWltcG9ydCBzaGEKLQotREIgPSAiL2RhdGEvZGF0YS9jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy9kYXRhYmFzZXMvYWNjb3VudHMuZGIiCi0KLWRlZiBSdW5DbWQoYXJncyk6Ci0gIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gIG91dCA9IHByb2Muc3Rkb3V0LnJlYWQoKQotICBpZiBwcm9jLndhaXQoKToKLSAgICBwcmludAotICAgIHByaW50ICJmYWlsZWQ6ICVzIiAlICIgIi5qb2luKGFyZ3MpCi0gICAgcmV0dXJuIE5vbmUKLSAgcmV0dXJuIG91dAotCi1kZWYgR2V0UHJvcChhZGJfZmxhZ3MsIG5hbWUpOgotICBhcmdzID0gKCJhZGIiLCkgKyBhZGJfZmxhZ3MgKyAoInNoZWxsIiwgIi9zeXN0ZW0vYmluL2dldHByb3AiLCBuYW1lKQotICByZXR1cm4gUnVuQ21kKGFyZ3MpCi0KLWRlZiBTZXRQcm9wKGFkYl9mbGFncywgbmFtZSwgdmFsdWUpOgotICBhcmdzID0gKCJhZGIiLCkgKyBhZGJfZmxhZ3MgKyAoInNoZWxsIiwgIi9zeXN0ZW0vYmluL3NldHByb3AiLCBuYW1lLCB2YWx1ZSkKLSAgcmV0dXJuIFJ1bkNtZChhcmdzKQotCi1kZWYgRGJFeGlzdHMoYWRiX2ZsYWdzKToKLSAgYXJncyA9ICgiYWRiIiwpICsgYWRiX2ZsYWdzICsgKCJzaGVsbCIsICIvc3lzdGVtL2Jpbi9scyIsIERCKQotICByZXN1bHQgPSBSdW5DbWQoYXJncykKLSAgaWYgcmVzdWx0IGlzIE5vbmU6IHJldHVybiBOb25lCi0gIHJldHVybiAiTm8gc3VjaCBmaWxlIiBub3QgaW4gcmVzdWx0Ci0KLWRlZiBtYWluKGFyZ3YpOgotICBpZiBsZW4oYXJndikgPT0gMToKLSAgICBwcmludCAoInVzYWdlOiAlcyBbYWRiIGZsYWdzXSAiCi0gICAgICAgICAgICJbPGhvc3RlZCBhZGRyZXNzWzpwYXNzd29yZF0+XSAiCi0gICAgICAgICAgICJbPGdtYWlsIGFkZHJlc3NbOnBhc3N3b3JkXT5dIikgJSAoYXJndlswXSwpCi0gICAgc3lzLmV4aXQoMikKLQotICBhcmd2ID0gYXJndlsxOl0KLQotICBnbWFpbCA9IE5vbmUKLSAgaG9zdGVkID0gTm9uZQotICB3aGlsZSBhcmd2IGFuZCAiQCIgaW4gYXJndlstMV06Ci0gICAgYWRkciA9IGFyZ3YucG9wKCkKLSAgICBpZiAiQGdtYWlsLmNvbSIgaW4gYWRkciBvciAiQGdvb2dsZW1haWwuY29tIiBpbiBhZGRyOgotICAgICAgZ21haWwgPSBhZGRyCi0gICAgZWxzZToKLSAgICAgIGhvc3RlZCA9IGFkZHIKLQotICBhZGJfZmxhZ3MgPSB0dXBsZShhcmd2KQotCi0gIHdoaWxlIFRydWU6Ci0gICAgZGIgPSBEYkV4aXN0cyhhZGJfZmxhZ3MpCi0gICAgaWYgZGIgaXMgTm9uZToKLSAgICAgIHByaW50ICJmYWlsZWQgdG8gY29udGFjdCBkZXZpY2U7IHdpbGwgcmV0cnkgaW4gMyBzZWNvbmRzIgotICAgICAgdGltZS5zbGVlcCgzKQotICAgICAgY29udGludWUKLQotICAgIGlmIGRiOgotICAgICAgcHJpbnQKLSAgICAgIHByaW50ICJHb29nbGVMb2dpblNlcnZpY2UgaGFzIGFscmVhZHkgc3RhcnRlZCBvbiB0aGlzIGRldmljZTsiCi0gICAgICBwcmludCAiaXQncyB0b28gbGF0ZSB0byB1c2UgdGhpcyBzY3JpcHQgdG8gYWRkIGFjY291bnRzLiIKLSAgICAgIHByaW50Ci0gICAgICBwcmludCAiVGhpcyBzY3JpcHQgb25seSB3b3JrcyBvbiBhIGZyZXNobHktd2lwZWQgZGV2aWNlIChvciAiCi0gICAgICBwcmludCAiZW11bGF0b3IpIHdoaWxlIGJvb3RpbmcgZm9yIHRoZSBmaXJzdCB0aW1lLiIKLSAgICAgIHByaW50Ci0gICAgICBicmVhawotCi0gICAgaG9zdGVkX2FjY291bnQgPSBHZXRQcm9wKGFkYl9mbGFncywgInJvLmNvbmZpZy5ob3N0ZWRfYWNjb3VudCIpLnN0cmlwKCkKLSAgICBnb29nbGVfYWNjb3VudCA9IEdldFByb3AoYWRiX2ZsYWdzLCAicm8uY29uZmlnLmdvb2dsZV9hY2NvdW50Iikuc3RyaXAoKQotCi0gICAgaWYgaG9zdGVkIGFuZCBob3N0ZWRfYWNjb3VudDoKLSAgICAgIHByaW50Ci0gICAgICBwcmludCAiQSBob3N0ZWQgYWNjb3VudCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgb24gdGhpcyBkZXZpY2U7IgotICAgICAgcHJpbnQgImNhbid0IGFkZCIsIGhvc3RlZF9hY2NvdW50Ci0gICAgICBwcmludAotICAgICAgaG9zdGVkID0gTm9uZQotCi0gICAgaWYgZ21haWwgYW5kIGdvb2dsZV9hY2NvdW50OgotICAgICAgcHJpbnQKLSAgICAgIHByaW50ICJBIGdvb2dsZSBhY2NvdW50IGlzIGFscmVhZHkgY29uZmlndXJlZCBvbiB0aGlzIGRldmljZTsiCi0gICAgICBwcmludCAiY2FuJ3QgYWRkIiwgZ29vZ2xlX2FjY291bnQKLSAgICAgIHByaW50Ci0gICAgICBnbWFpbCA9IE5vbmUKLQotICAgIGlmIG5vdCBnbWFpbCBhbmQgbm90IGhvc3RlZDogYnJlYWsKLQotICAgIGlmIGhvc3RlZDoKLSAgICAgIFNldFByb3AoYWRiX2ZsYWdzLCAicm8uY29uZmlnLmhvc3RlZF9hY2NvdW50IiwgaG9zdGVkKQotICAgICAgcHJpbnQgInNldCBob3N0ZWRfYWNjb3VudCB0byIsIGhvc3RlZAotICAgIGlmIGdtYWlsOgotICAgICAgU2V0UHJvcChhZGJfZmxhZ3MsICJyby5jb25maWcuZ29vZ2xlX2FjY291bnQiLCBnbWFpbCkKLSAgICAgIHByaW50ICJzZXQgZ29vZ2xlX2FjY291bnQgdG8iLCBnbWFpbAotCi0gICAgYnJlYWsKLQotCi0KLQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FsaWFzLnRlbXBsYXRlIGIvdG9vbHMvc2NyaXB0cy9hbGlhcy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4OTljZS4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2FsaWFzLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotQUxJQVMgUFJPSkVDVFMgQVJFIENVUlJFTlQgTk9UIFNVUFBPUlRFRC4KLVRISVMgRklMRSBJUyBDVVJSRU5UTFkgQlJPS0VOIEFORCBTSE9VTEQgTk9UIEJFIFVTRUQuCi0tLT4KLTxhbGlhcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpbnRlbnQgYW5kcm9pZDphY3Rpb249ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXIgotICAgICAgICBhbmRyb2lkOmRhdGE9IkFMSUFTREFUQSIvPgotPC9hbGlhcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FsaWFzX3J1bGVzLnhtbCBiL3Rvb2xzL3NjcmlwdHMvYWxpYXNfcnVsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNkYTQ1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYWxpYXNfcnVsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUFMSUFTIFBST0pFQ1RTIEFSRSBDVVJSRU5UIE5PVCBTVVBQT1JURUQuCi1USElTIEZJTEUgSVMgQ1VSUkVOVExZIEJST0tFTiBBTkQgU0hPVUxEIE5PVCBCRSBVU0VELgotLS0+Ci08cHJvamVjdCBuYW1lPSJhbGlhc19ydWxlcyIgZGVmYXVsdD0icGFja2FnZSI+Ci0KLSAgICA8IS0tIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgYmVsb3cuIC0tPgotCi0gICAgPCEtLSBJbnB1dCBkaXJlY3RvcmllcyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2UuZGlyIiB2YWx1ZT0icmVzIiAvPgotCi0gICAgPCEtLSBUaGUgZmluYWwgcGFja2FnZSBmaWxlIHRvIGdlbmVyYXRlIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQucGFja2FnZSIgdmFsdWU9IiR7YW50LnByb2plY3QubmFtZX0uYXBrIiAvPgotCi0gICAgPCEtLSBUb29scyAtLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhYXB0IiB2YWx1ZT0iJHthbmRyb2lkLnRvb2xzLmRpcn0vYWFwdC5leGUiIGVsc2U9IiR7YW5kcm9pZC50b29scy5kaXJ9L2FhcHQiPgotICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImFkYiIgdmFsdWU9IiR7YW5kcm9pZC50b29scy5kaXJ9L2FkYi5leGUiIGVsc2U9IiR7YW5kcm9pZC50b29scy5kaXJ9L2FkYiI+Ci0gICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiIC8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFuZHJvaWQuamFyIiB2YWx1ZT0iJHtzZGsuZGlyfS9hbmRyb2lkLmphciIgLz4KLQotICAgIDwhLS0gUnVsZXMgLS0+Ci0KLSAgICA8IS0tIFBhY2thZ2VzIHRoZSBtYW5pZmVzdCBhbmQgdGhlIHJlc291cmNlIGZpbGVzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnZS1yZXMiPgotICAgICAgICA8ZWNobz5QYWNrYWdpbmcgcmVzb3VyY2VzLi4uPC9lY2hvPgotICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke2FhcHR9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJwYWNrYWdlIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLWYiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItTSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IkFuZHJvaWRNYW5pZmVzdC54bWwiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItUyIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7cmVzb3VyY2UuZGlyfSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1JIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbmRyb2lkLmphcn0iIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItRiIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7b3V0LnBhY2thZ2V9IiAvPgotICAgICAgICA8L2V4ZWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIENyZWF0ZSB0aGUgcGFja2FnZSBmaWxlIGZvciB0aGlzIHByb2plY3QgZnJvbSB0aGUgc291cmNlcy4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdlIiBkZXBlbmRzPSJwYWNrYWdlLXJlcyIgLz4KLQotICAgIDwhLS0gQ3JlYXRlIHRoZSBwYWNrYWdlIGFuZCBpbnN0YWxsIHBhY2thZ2Ugb24gdGhlIGRlZmF1bHQgZW11bGF0b3IgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJwYWNrYWdlIj4KLSAgICAgICAgPGVjaG8+U2VuZGluZyBwYWNrYWdlIHRvIGRlZmF1bHQgZW11bGF0b3IuLi48L2VjaG8+Ci0gICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7YWRifSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iaW5zdGFsbCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7b3V0LnBhY2thZ2V9IiAvPgotICAgICAgICA8L2V4ZWM+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYW5kcm9pZC5lbCBiL3Rvb2xzL3NjcmlwdHMvYW5kcm9pZC5lbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmMmYxZS4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2FuZHJvaWQuZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotOzs7OyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLTs7OyBTZXQgdXAgR1VEK0pEQiB0byBhdHRhY2ggdG8gYSBKYXZhIHByb2Nlc3MgcnVubmluZyBvbiB0aGUgcGhvbmUgb3IKLTs7OyB1bmRlciB0aGUgZW11bGF0b3IuCi0KLShkZWZ2YXIgYW5kcm9pZC1qZGItcG9ydC1oaXN0b3J5ICcoIjg3MDAiKQotICJoaXN0b3J5IG9mIHBvcnRzIHN1cHBsaWVkIHRvIGBhbmRyb2lkLWpkYiciKQotCi0oZGVmdmFyIGFuZHJvaWQtamRiLXByb2plY3Qtcm9vdC1oaXN0b3J5ICcoKQotICJoaXN0b3J5IG9mIHByb2plY3Qgcm9vdHMgc3VwcGxpZWQgdG8gYGFuZHJvaWQtamRiJyIpCi0oZGVmdmFyIGFuZHJvaWQtamRiLWhpc3RvcnkgbmlsCi0gImhpc3Rvcnkgb2YgY29tbWFuZHMgc3VwcGxpZWQgdG8gYGFuZHJvaWQtamRiJyIpCi0KLShkZWZ2YXIgYW5kcm9pZC1qZGItYWN0aXZpdHktY2xhc3MtaGlzdG9yeSAoKQotICJoaXN0b3J5IG9mIGFjdGl2aXR5IGNsYXNzZXMgc3VwcGxpZWQgdG8gYHN0YXJ0LWFuZHJvaWQtYWN0aXZpdHknIikKLQotKGRlZmN1c3RvbSAgYW5kcm9pZC1qZGItY29tbWFuZC1uYW1lICJqZGIiCi0gICJOYW1lIG9mIEphdmEgZGVidWdnZXIuIgotICA6dHlwZSAnc3RyaW5nCi0gIDpncm91cCAnYW5kcm9pZCkKLQotKGRlZmdyb3VwIGFuZHJvaWQgbmlsCi0gICJBbmRyb2lkIEFwcGxpY2F0aW9ucy4iCi0gIDpncm91cCAnYXBwbGljYXRpb25zKQotCi0oZGVmY3VzdG9tIGFuZHJvaWQtcHJvamVjdC1yb290IG5pbAotICJUaGlzIGlzIHdoZXJlIHlvdXIgQW5kcm9pZCBwcm9qZWN0IHJvb3QgaXMgc3RvcmVkLiIKLSAgOnR5cGUgJ2RpcmVjdG9yeQotIDpncm91cCAnYW5kcm9pZCApCi0KLShkZWZjdXN0b20gYW5kcm9pZC1hcGsgbmlsCi0gIlRoaXMgaXMgd2hlcmUgeW91ciBBbmRyb2lkIEFwcGxpY2F0aW9uIFBhY2thZ2UgaXMgc3RvcmVkLiIKLSA6dHlwZSAnc3RyaW5nCi0gOmdyb3VwICdhbmRyb2lkKQotCi0oZGVmY3VzdG9tIGFuZHJvaWQtYWN0aXZpdHktY2xhc3MgbmlsCi0gIlRoaXMgaXMgd2hlcmUgeW91ciBBbmRyb2lkIEFjdGl2aXR5IGNsYXNzIGlzIHN0b3JlZC4iCi0gOnR5cGUgJ3N0cmluZwotIDpncm91cCAnYW5kcm9pZCkKLQotKGRlZnVuIGFuZHJvaWQtcmVhZC1wcm9qZWN0LXJvb3QgKCkKLSAoaWYgKG9yIChzdHJpbmctbWF0Y2ggIlhFbWFjcyIgZW1hY3MtdmVyc2lvbikKLSAgICAgICAgICg+PSBlbWFjcy1tYWpvci12ZXJzaW9uIDIyKSkKLSAgICAgKHJlYWQtZmlsZS1uYW1lICJBbmRyb2lkIHByb2plY3Qgcm9vdDogIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC1wcm9qZWN0LXJvb3QKLSAgICAgICAgICAgICAgICAgICAgIG5pbAotICAgICAgICAgICAgICAgICAgICAgdAotICAgICAgICAgICAgICAgICAgICAgbmlsCi0gICAgICAgICAgICAgICAgICAgICAnZmlsZS1kaXJlY3RvcnktcCkKLSAgIChsYWJlbHMgKChyZWFkLWRpcmVjdG9yeSAoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkLWZpbGUtbmFtZSAiQW5kcm9pZCBwcm9qZWN0IHJvb3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC1wcm9qZWN0LXJvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsKSkpCi0gICAgIChkbyAoKGVudGVyZWQtcm9vdCAocmVhZC1kaXJlY3RvcnkpIChyZWFkLWRpcmVjdG9yeSkpKQotICAgICAgICAgKChhbmQgZW50ZXJlZC1yb290Ci0gICAgICAgICAgICAgICAoZmlsZS1kaXJlY3RvcnktcCBlbnRlcmVkLXJvb3QpKQotICAgICAgICAgIChleHBhbmQtZmlsZS1uYW1lIGVudGVyZWQtcm9vdCkpKSkpKQotCi0oZGVmdW4gYW5kcm9pZC1qZGIgKHBvcnQgcm9vdCkKLSAiU2V0IEdVRCtKREIgdXAgdG8gcnVuIGFnYWluc3QgQW5kcm9pZCBvbiBQT1JUIGluIGRpcmVjdG9yeSBST09ULiIKLSAoaW50ZXJhY3RpdmUKLSAgKGxpc3QKLSAgIChyZWFkLWZyb20tbWluaWJ1ZmZlciAiQWN0aXZpdHkncyBKRFdQIERETVMgcG9ydDogIgotICAgICAgICAgICAgICAgICAgICAgKGNhciBhbmRyb2lkLWpkYi1wb3J0LWhpc3RvcnkpCi0gICAgICAgICAgICAgICAgICAgICBuaWwKLSAgICAgICAgICAgICAgICAgICAgIHQKLSAgICAgICAgICAgICAgICAgICAgICdhbmRyb2lkLWpkYi1wb3J0LWhpc3RvcnkpCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLXJlYWQtcHJvamVjdC1yb290KSkpCi0gKHNldHEgYW5kcm9pZC1wcm9qZWN0LXJvb3Qgcm9vdCkKLSAobGV0ICgoamRiLWNvbW1hbmQKLSAgICAgICAgKGZvcm1hdCAiJXMgLWF0dGFjaCBsb2NhbGhvc3Q6JXMgLXNvdXJjZXBhdGglcyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkLWpkYi1jb21tYW5kLW5hbWUKLSAgICAgICAgICAgICAgICBwb3J0Ci0gICAgICAgICAgICAgICAgKGZvcm1hdCAiJXMvc3JjIiByb290KSkpKQotICAgKGlmIChub3QgKHN0cmluZz0gamRiLWNvbW1hbmQgKGNhciBhbmRyb2lkLWpkYi1oaXN0b3J5KSkpCi0gICAgICAgKHB1c2ggamRiLWNvbW1hbmQgYW5kcm9pZC1qZGItaGlzdG9yeSkpCi0gICAoamRiIGpkYi1jb21tYW5kKSkpCi0KLShkZWZ1biBhbmRyb2lkLWVtdWxhdGUgKCkKLSAiUnVuIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBUaGlzIGV4cGVjdHMgdGhlIFNESyB0b29scyBkaXJlY3RvcnkgdG8gYmUgaW4gdGhlIGN1cnJlbnQgcGF0aC4iCi0gKGludGVyYWN0aXZlKQotIChjb21waWxlICJlbXVsYXRvciIpKQotCi0oZGVmdW4gYW5kcm9pZC1pbnN0YWxsLWFwcCAoYXBrKQotICAiSW5zdGFsbCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIHBhY2thZ2UgQVBLIGluIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBUaGlzIGV4cGVjdHMgdGhlIFNESyB0b29scyBkaXJlY3RvcnkgdG8gYmUgaW4gdGhlIGN1cnJlbnQgcGF0aC4iCi0gIChpbnRlcmFjdGl2ZSAobGlzdCAoZXhwYW5kLWZpbGUtbmFtZQotICAgICAgICAgICAgICAgICAgICAgIChyZWFkLWZpbGUtbmFtZSAiQW5kcm9pZCBBcHBsaWNhdGlvbiBQYWNrYWdlICguYXBrKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC1hcGsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsKSkpKQotICAoc2V0cSBhbmRyb2lkLWFwayBhcGspCi0gIChjb21waWxlIChmb3JtYXQgImFkYiBpbnN0YWxsIC1yICVzIiBhcGspKSkKLQotKGRlZnVuIGFuZHJvaWQtdW5pbnN0YWxsLWFwcCAocGFja2FnZS1uYW1lKQotICAiVW5pbnN0YWxsIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gcGFja2FnZSBBUEsgaW4gdGhlIEFuZHJvaWQgZW11bGF0b3IuIFRoaXMgZXhwZWN0cyB0aGUgU0RLIHRvb2xzIGRpcmVjdG9yeSB0byBiZSBpbiB0aGUgY3VycmVudCBwYXRoLgotU3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIC0tLSBhbmQgbm90IHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlLmcuLCBjb20uYW5kcm9pZC5mb28uIgotICAoaW50ZXJhY3RpdmUKLSAgIChsaXN0Ci0gICAgKHJlYWQtZnJvbS1taW5pYnVmZmVyICJQYWNrYWdlOiAiKSkpCi0gIChjb21waWxlIChmb3JtYXQgImFkYiBpbnN0YWxsIC1yICVzIiBwYWNrYWdlKSkpCi0KLShkZWZ1biBhbmRyb2lkLXN0YXJ0LWFjdGl2aXR5IChwYWNrYWdlIGNsYXNzKQotICJTdGFydCB0aGUgYWN0aXZpdHkgUEFDS0FHRS9DTEFTUyBpbiB0aGUgQW5kcm9pZCBlbXVsYXRvci4gVGhpcyBleHBlY3RzIHRoZSBTREsgdG9vbHMgZGlyZWN0b3J5IHRvIGJlIGluIHRoZSBjdXJyZW50IHBhdGguIgotIChpbnRlcmFjdGl2ZQotICAobGlzdAotICAgKHJlYWQtZnJvbS1taW5pYnVmZmVyICJQYWNrYWdlOiAiKQotICAgKHJlYWQtZnJvbS1taW5pYnVmZmVyICJBY3Rpdml0eSBKYXZhIGNsYXNzOiAiCi0gICAgICAgICAoY2FyIGFuZHJvaWQtamRiLWFjdGl2aXR5LWNsYXNzLWhpc3RvcnkpCi0gICAgICAgICBuaWwKLSAgICAgICAgIHQKLSAgICAgICAgICdhbmRyb2lkLWpkYi1hY3Rpdml0eS1jbGFzcy1oaXN0b3J5KSkpCi0gKGNvbXBpbGUgKGZvcm1hdCAiYWRiIHNoZWxsIGFtIHN0YXJ0IC1uICVzLyVzIiBwYWNrYWdlIGNsYXNzKSkpCi0KLShkZWZ1biBhbmRyb2lkLWRlYnVnLWFjdGl2aXR5IChwYWNrYWdlIGNsYXNzKQotICJTdGFydCB0aGUgYWN0aXZpdHkgUEFDS0FHRS9DTEFTUyB3aXRoaW4gdGhlIGRlYnVnZ2VyIGluIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBUaGlzIGV4cGVjdHMgdGhlIFNESyB0b29scyBkaXJlY3RvcnkgdG8gYmUgaW4gdGhlIGN1cnJlbnQgcGF0aC4iCi0gKGludGVyYWN0aXZlCi0gIChsaXN0Ci0gICAocmVhZC1mcm9tLW1pbmlidWZmZXIgIlBhY2thZ2U6ICIpCi0gICAocmVhZC1mcm9tLW1pbmlidWZmZXIgIkFjdGl2aXR5IEphdmEgY2xhc3M6ICIKLSAgICAgICAgIChjYXIgYW5kcm9pZC1qZGItYWN0aXZpdHktY2xhc3MtaGlzdG9yeSkKLSAgICAgICAgIG5pbAotICAgICAgICAgdAotICAgICAgICAgJ2FuZHJvaWQtamRiLWFjdGl2aXR5LWNsYXNzLWhpc3RvcnkpKSkKLSAoY29tcGlsZSAoZm9ybWF0ICJhZGIgc2hlbGwgYW0gc3RhcnQgLUQgLW4gJXMvJXMiIHBhY2thZ2UgY2xhc3MpKSkKLQotKHByb3ZpZGUgJ2FuZHJvaWQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYW5kcm9pZF9ydWxlcy54bWwgYi90b29scy9zY3JpcHRzL2FuZHJvaWRfcnVsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzUwMTdjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYW5kcm9pZF9ydWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9ImFuZHJvaWRfcnVsZXMiIGRlZmF1bHQ9ImRlYnVnIj4KLQotICAgIDwhLS0KLSAgICAgICAgVGhpcyBydWxlcyBmaWxlIGlzIG1lYW50IHRvIGJlIGltcG9ydGVkIGJ5IHRoZSBjdXN0b20gQW50IHRhc2s6Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5hbnQuQW5kcm9pZEluaXRUYXNrCi0KLSAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBwdXQgaW4gcGxhY2UgYnkgdGhlIGltcG9ydGluZyB0YXNrOgotICAgICAgICAgICAgYW5kcm9pZC5qYXIsIGFuZHJvaWQuYWlkbCwgYWFwdCwgYWlkbCwgYW5kIGR4Ci0KLSAgICAgICAgQWRkaXRpb25uYWx5LCB0aGUgdGFzayBzZXRzIHVwIHRoZSBmb2xsb3dpbmcgY2xhc3NwYXRoIHJlZmVyZW5jZToKLSAgICAgICAgICAgIGFuZHJvaWQudGFyZ2V0LmNsYXNzcGF0aAotICAgICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHRhc2sgYXMgdGhlIGJvb3QgY2xhc3NwYXRoLgotICAgIC0tPgotCi0gICAgPCEtLSBDdXN0b20gdGFza3MgLS0+Ci0gICAgPHRhc2tkZWYgbmFtZT0iYWFwdGV4ZWMiCi0gICAgICAgIGNsYXNzbmFtZT0iY29tLmFuZHJvaWQuYW50LkFhcHRFeGVjTG9vcFRhc2siCi0gICAgICAgIGNsYXNzcGF0aHJlZj0iYW5kcm9pZC5hbnRsaWJzIiAvPgotCi0gICAgPHRhc2tkZWYgbmFtZT0iYXBrYnVpbGRlciIKLSAgICAgICAgY2xhc3NuYW1lPSJjb20uYW5kcm9pZC5hbnQuQXBrQnVpbGRlclRhc2siCi0gICAgICAgIGNsYXNzcGF0aHJlZj0iYW5kcm9pZC5hbnRsaWJzIiAvPgotCi0gICAgPHRhc2tkZWYgbmFtZT0ieHBhdGgiCi0gICAgICAgIGNsYXNzbmFtZT0iY29tLmFuZHJvaWQuYW50LlhQYXRoVGFzayIKLSAgICAgICAgY2xhc3NwYXRocmVmPSJhbmRyb2lkLmFudGxpYnMiIC8+Ci0KLSAgICA8IS0tIFByb3BlcnRpZXMgLS0+Ci0KLSAgICA8IS0tIFRlbGxzIGFkYiB3aGljaCBkZXZpY2UgdG8gdGFyZ2V0LiBZb3UgY2FuIGNoYW5nZSB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICAgYnkgaW52b2tpbmcgImFudCAtRGFkYi5kZXZpY2UuYXJnPS1kIiBmb3IgZGV2aWNlICJhbnQgLURhZGIuZGV2aWNlLmFyZz0tZSIgZm9yCi0gICAgICAgICB0aGUgZW11bGF0b3IuIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhZGIuZGV2aWNlLmFyZyIgdmFsdWU9IiIgLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJhbmRyb2lkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7c2RrLmRpcn0vdG9vbHMiIC8+Ci0gICAgPCEtLSBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIGV4dHJhY3RlZCBmcm9tIG1hbmlmZXN0IGZpbGUgLS0+Ci0gICAgPHhwYXRoIGlucHV0PSJBbmRyb2lkTWFuaWZlc3QueG1sIiBleHByZXNzaW9uPSIvbWFuaWZlc3QvQHBhY2thZ2UiCi0gICAgICAgICAgICAgICAgb3V0cHV0PSJtYW5pZmVzdC5wYWNrYWdlIiAvPgotCi0gICAgPCEtLSBJbnB1dCBkaXJlY3RvcmllcyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlLmRpciIgdmFsdWU9InNyYyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlLmFic29sdXRlLmRpciIgbG9jYXRpb249IiR7c291cmNlLmRpcn0iIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imdlbi5kaXIiIHZhbHVlPSJnZW4iIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imdlbi5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke2dlbi5kaXJ9IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZS5kaXIiIHZhbHVlPSJyZXMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlLmFic29sdXRlLmRpciIgbG9jYXRpb249IiR7cmVzb3VyY2UuZGlyfSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYXNzZXQuZGlyIiB2YWx1ZT0iYXNzZXRzIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhc3NldC5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke2Fzc2V0LmRpcn0iIC8+Ci0KLSAgICA8IS0tIERpcmVjdG9yeSBmb3IgdGhlIHRoaXJkIHBhcnR5IGphdmEgbGlicmFyaWVzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRlcm5hbC5saWJzLmRpciIgdmFsdWU9ImxpYnMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImV4dGVybmFsLmxpYnMuYWJzb2x1dGUuZGlyIiBsb2NhdGlvbj0iJHtleHRlcm5hbC5saWJzLmRpcn0iIC8+Ci0KLSAgICA8IS0tIERpcmVjdG9yeSBmb3IgdGhlIG5hdGl2ZSBsaWJyYXJpZXMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im5hdGl2ZS5saWJzLmRpciIgdmFsdWU9ImxpYnMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im5hdGl2ZS5saWJzLmFic29sdXRlLmRpciIgbG9jYXRpb249IiR7bmF0aXZlLmxpYnMuZGlyfSIgLz4KLQotICAgIDwhLS0gT3V0cHV0IGRpcmVjdG9yaWVzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuZGlyIiB2YWx1ZT0iYmluIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuYWJzb2x1dGUuZGlyIiBsb2NhdGlvbj0iJHtvdXQuZGlyfSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3V0LmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtvdXQuYWJzb2x1dGUuZGlyfS9jbGFzc2VzIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuY2xhc3Nlcy5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke291dC5jbGFzc2VzLmRpcn0iIC8+Ci0KLSAgICA8IS0tIEludGVybWVkaWF0ZSBmaWxlcyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iZGV4LmZpbGUubmFtZSIgdmFsdWU9ImNsYXNzZXMuZGV4IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcm1lZGlhdGUuZGV4LmZpbGUiIGxvY2F0aW9uPSIke291dC5hYnNvbHV0ZS5kaXJ9LyR7ZGV4LmZpbGUubmFtZX0iIC8+Ci0KLSAgICA8IS0tIFRoZSBmaW5hbCBwYWNrYWdlIGZpbGUgdG8gZ2VuZXJhdGUgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im91dC5kZWJ1Zy51bmFsaWduZWQucGFja2FnZSIKLSAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke291dC5hYnNvbHV0ZS5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0tZGVidWctdW5hbGlnbmVkLmFwayIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3V0LmRlYnVnLnBhY2thZ2UiCi0gICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtvdXQuYWJzb2x1dGUuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LWRlYnVnLmFwayIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3V0LnVuc2lnbmVkLnBhY2thZ2UiCi0gICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtvdXQuYWJzb2x1dGUuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LXVuc2lnbmVkLmFwayIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3V0LnVuYWxpZ25lZC5wYWNrYWdlIgotICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7b3V0LmFic29sdXRlLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS11bmFsaWduZWQuYXBrIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQucmVsZWFzZS5wYWNrYWdlIgotICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7b3V0LmFic29sdXRlLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS1yZWxlYXNlLmFwayIgLz4KLQotICAgIDwhLS0gVmVyYm9zaXR5IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJib3NlIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPCEtLSBUaGlzIGlzIG5lZWRlZCBieSBlbW1hIGFzIGl0IHVzZXMgbXVsdGlsZXZlbCB2ZXJib3NpdHkgaW5zdGVhZCBvZiBzaW1wbGUgJ3RydWUnIG9yICdmYWxzZScKLSAgICAgICAgIFRoZSBwcm9wZXJ0eSAndmVyYm9zaXR5JyBpcyBub3QgdXNlciBjb25maWd1cmFibGUgYW5kIGRlcGVuZHMgZXhjbHVzaXZlbHkgb24gJ3ZlcmJvc2UnCi0gICAgICAgICB2YWx1ZS4tLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJib3NpdHkiIHZhbHVlPSJ2ZXJib3NlIiBlbHNlPSJxdWlldCI+Ci0gICAgICAgIDxpc3RydWUgdmFsdWU9IiR7dmVyYm9zZX0iIC8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPCEtLSBUaGlzIGlzIG5lZWRlZCB0byBzd2l0Y2ggdmVyYm9zaXR5IG9mIHppcGFsaWduIGFuZCBhYXB0LiBEZXBlbmRzIGV4Y2x1c2l2ZWx5IG9uICd2ZXJib3NlJwotICAgICAgICAgLS0+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idi5vcHRpb24iIHZhbHVlPSItdiIgZWxzZT0iIj4KLSAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHt2ZXJib3NlfSIgLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8IS0tIFRoaXMgaXMgbmVlZGVkIHRvIHN3aXRjaCB2ZXJib3NpdHkgb2YgZHguIERlcGVuZHMgZXhjbHVzaXZlbHkgb24gJ3ZlcmJvc2UnIC0tPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9InZlcmJvc2Uub3B0aW9uIiB2YWx1ZT0iLS12ZXJib3NlIiBlbHNlPSIiPgotICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3ZlcmJvc2V9IiAvPgotICAgIDwvY29uZGl0aW9uPgotCi0gICAgPCEtLSBUb29scyAtLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJleGUiIHZhbHVlPSIuZXhlIiBlbHNlPSIiPjxvcyBmYW1pbHk9IndpbmRvd3MiIC8+PC9jb25kaXRpb24+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFkYiIgbG9jYXRpb249IiR7YW5kcm9pZC50b29scy5kaXJ9L2FkYiR7ZXhlfSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iemlwYWxpZ24iIGxvY2F0aW9uPSIke2FuZHJvaWQudG9vbHMuZGlyfS96aXBhbGlnbiR7ZXhlfSIgLz4KLQotICAgIDwhLS0gRW1tYSBjb25maWd1cmF0aW9uIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbW1hLmRpciIgdmFsdWU9IiR7c2RrLmRpcn0vdG9vbHMvbGliIiAvPgotICAgICAgICA8cGF0aCBpZD0iZW1tYS5saWIiPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2VtbWEuZGlyfS9lbW1hLmphciIgLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtlbW1hLmRpcn0vZW1tYV9hbnQuamFyIiAvPgotICAgICAgICA8L3BhdGg+Ci0gICAgPHRhc2tkZWYgcmVzb3VyY2U9ImVtbWFfYW50LnByb3BlcnRpZXMiIGNsYXNzcGF0aHJlZj0iZW1tYS5saWIiIC8+Ci0gICAgPCEtLSBFbmQgb2YgZW1tYSBjb25maWd1cmF0aW9uIC0tPgotCi0gICAgPCEtLSBNYWNyb3MgLS0+Ci0KLSAgICA8IS0tIENvbmZpZ3VyYWJsZSBtYWNybywgd2hpY2ggYWxsb3dzIHRvIHBhc3MgYXMgcGFyYW1ldGVycyBvdXRwdXQgZGlyZWN0b3J5LAotICAgICAgICAgb3V0cHV0IGRleCBmaWxlbmFtZSBhbmQgZXh0ZXJuYWwgbGlicmFyaWVzIHRvIGRleCAob3B0aW9uYWwpIC0tPgotICAgIDxtYWNyb2RlZiBuYW1lPSJkZXgtaGVscGVyIj4KLSAgICAgICA8ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1saWJzIiBvcHRpb25hbD0ieWVzIiAvPgotICAgICAgIDxlbGVtZW50IG5hbWU9ImV4dHJhLXBhcmFtZXRlcnMiIG9wdGlvbmFsPSJ5ZXMiIC8+Ci0gICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICA8ZWNobz5Db252ZXJ0aW5nIGNvbXBpbGVkIGZpbGVzIGFuZCBleHRlcm5hbCBsaWJyYXJpZXMgaW50byAke2ludGVybWVkaWF0ZS5kZXguZmlsZX0uLi4KLSAgICAgICAgIDwvZWNobz4KLSAgICAgICAgIDxhcHBseSBleGVjdXRhYmxlPSIke2R4fSIgZmFpbG9uZXJyb3I9InRydWUiIHBhcmFsbGVsPSJ0cnVlIj4KLSAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWRleCIgLz4KLSAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLW91dHB1dD0ke2ludGVybWVkaWF0ZS5kZXguZmlsZX0iIC8+Ci0gICAgICAgICAgICAgPGV4dHJhLXBhcmFtZXRlcnMgLz4KLSAgICAgICAgICAgICA8YXJnIGxpbmU9IiR7dmVyYm9zZS5vcHRpb259IiAvPgotICAgICAgICAgICAgIDxhcmcgcGF0aD0iJHtvdXQuY2xhc3Nlcy5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtleHRlcm5hbC5saWJzLmFic29sdXRlLmRpcn0iIGluY2x1ZGVzPSIqLmphciIgLz4KLSAgICAgICAgICAgICA8ZXh0ZXJuYWwtbGlicyAvPgotICAgICAgICAgPC9hcHBseT4KLSAgICAgICA8L3NlcXVlbnRpYWw+Ci0gICAgPC9tYWNyb2RlZj4KLQotICAgIDwhLS0gVGhpcyBpcyBtYWNybyB0aGF0IGVuYWJsZSBwYXNzaW5nIHZhcmlhYmxlIGxpc3Qgb2YgZXh0ZXJuYWwgamFyIGZpbGVzIHRvIEFwa0J1aWxkZXIKLSAgICAgICAgIEV4YW1wbGUgb2YgdXNlOgotICAgICAgICAgPHBhY2thZ2UtaGVscGVyPgotICAgICAgICAgICAgIDxleHRyYS1qYXJzPgotICAgICAgICAgICAgICAgIDxqYXJmb2xkZXIgcGF0aD0ibXlfamFycyIgLz4KLSAgICAgICAgICAgICAgICA8amFyZmlsZSBwYXRoPSJmb28vYmFyLmphciIgLz4KLSAgICAgICAgICAgICAgICA8amFyZm9sZGVyIHBhdGg9InlvdXJfamFycyIgLz4KLSAgICAgICAgICAgICA8L2V4dHJhLWphcnM+Ci0gICAgICAgICA8L3BhY2thZ2UtaGVscGVyPiAtLT4KLSAgICA8bWFjcm9kZWYgbmFtZT0icGFja2FnZS1oZWxwZXIiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNpZ24ucGFja2FnZSIgLz4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0cmEtamFycyIgb3B0aW9uYWw9InllcyIgLz4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8YXBrYnVpbGRlcgotICAgICAgICAgICAgICAgICAgICBvdXRmb2xkZXI9IiR7b3V0LmFic29sdXRlLmRpcn0iCi0gICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSIke2FudC5wcm9qZWN0Lm5hbWV9IgotICAgICAgICAgICAgICAgICAgICBzaWduZWQ9IkB7c2lnbi5wYWNrYWdlfSIKLSAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT0iJHt2ZXJib3NlfSI+Ci0gICAgICAgICAgICAgICAgPGZpbGUgcGF0aD0iJHtpbnRlcm1lZGlhdGUuZGV4LmZpbGV9IiAvPgotICAgICAgICAgICAgICAgIDxzb3VyY2Vmb2xkZXIgcGF0aD0iJHtzb3VyY2UuYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICA8bmF0aXZlZm9sZGVyIHBhdGg9IiR7bmF0aXZlLmxpYnMuYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICA8amFyZm9sZGVyIHBhdGg9IiR7ZXh0ZXJuYWwubGlicy5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICAgICAgICAgIDxleHRyYS1qYXJzLz4KLSAgICAgICAgICAgIDwvYXBrYnVpbGRlcj4KLSAgICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci0KLSAgICA8IS0tIFRoaXMgaXMgbWFjcm8gd2hpY2ggemlwYWxpZ25zIGluLnBhY2thZ2UgYW5kIG91dHB1dHMgaXQgdG8gb3V0LnBhY2thZ2UuIFVzZWQgYnkgdGFyZ2V0cwotICAgICAgICAgZGVidWcsIC1kZWJ1Zy13aXRoLWVtbWEgYW5kIHJlbGVhc2UuLS0+Ci0gICAgPG1hY3JvZGVmIG5hbWU9InppcGFsaWduLWhlbHBlciI+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW4ucGFja2FnZSIgLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXQucGFja2FnZSIgLz4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8ZWNobz5SdW5uaW5nIHppcCBhbGlnbiBvbiBmaW5hbCBhcGsuLi48L2VjaG8+Ci0gICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3ppcGFsaWdufSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iJHt2Lm9wdGlvbn0iIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLWYiIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iNCIgLz4KLSAgICAgICAgICAgICAgICA8YXJnIHBhdGg9IkB7aW4ucGFja2FnZX0iIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyBwYXRoPSJAe291dC5wYWNrYWdlfSIgLz4KLSAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci0KLSAgICA8IS0tIFRoaXMgaXMgbWFjcm8gdXNlZCBvbmx5IGZvciBzaGFyaW5nIGNvZGUgYW1vbmcgdHdvIHRhcmdldHMsIC1pbnN0YWxsIGFuZAotICAgICAgICAgLWluc3RhbGwtd2l0aC1lbW1hIHdoaWNoIGRvIGV4YWN0bHkgdGhlIHNhbWUgYnV0IGRpZmZlciBpbiBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPG1hY3JvZGVmIG5hbWU9Imluc3RhbGwtaGVscGVyIj4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8ZWNobz5JbnN0YWxsaW5nICR7b3V0LmRlYnVnLnBhY2thZ2V9IG9udG8gZGVmYXVsdCBlbXVsYXRvciBvciBkZXZpY2UuLi48L2VjaG8+Ci0gICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke2FkYn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8YXJnIGxpbmU9IiR7YWRiLmRldmljZS5hcmd9IiAvPgotICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Imluc3RhbGwiIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLXIiIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyBwYXRoPSIke291dC5kZWJ1Zy5wYWNrYWdlfSIgLz4KLSAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci0KLSAgICA8IS0tIFJ1bGVzIC0tPgotCi0gICAgPCEtLSBDcmVhdGVzIHRoZSBvdXRwdXQgZGlyZWN0b3JpZXMgaWYgdGhleSBkb24ndCBleGlzdCB5ZXQuIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLWRpcnMiPgotICAgICAgICA8ZWNobz5DcmVhdGluZyBvdXRwdXQgZGlyZWN0b3JpZXMgaWYgbmVlZGVkLi4uPC9lY2hvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3Jlc291cmNlLmFic29sdXRlLmRpcn0iIC8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZXh0ZXJuYWwubGlicy5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2dlbi5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICA8bWtkaXIgZGlyPSIke291dC5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICA8bWtkaXIgZGlyPSIke291dC5jbGFzc2VzLmFic29sdXRlLmRpcn0iIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIEdlbmVyYXRlcyB0aGUgUi5qYXZhIGZpbGUgZm9yIHRoaXMgcHJvamVjdCdzIHJlc291cmNlcy4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSItcmVzb3VyY2Utc3JjIiBkZXBlbmRzPSItZGlycyI+Ci0gICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgUi5qYXZhIC8gTWFuaWZlc3QuamF2YSBmcm9tIHRoZSByZXNvdXJjZXMuLi48L2VjaG8+Ci0gICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7YWFwdH0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhY2thZ2UiIC8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7di5vcHRpb259IiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLW0iIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItSiIgLz4KLSAgICAgICAgICAgIDxhcmcgcGF0aD0iJHtnZW4uYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1NIiAvPgotICAgICAgICAgICAgPGFyZyBwYXRoPSJBbmRyb2lkTWFuaWZlc3QueG1sIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLVMiIC8+Ci0gICAgICAgICAgICA8YXJnIHBhdGg9IiR7cmVzb3VyY2UuYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1JIiAvPgotICAgICAgICAgICAgPGFyZyBwYXRoPSIke2FuZHJvaWQuamFyfSIgLz4KLSAgICAgICAgPC9leGVjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBHZW5lcmF0ZXMgamF2YSBjbGFzc2VzIGZyb20gLmFpZGwgZmlsZXMuIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLWFpZGwiIGRlcGVuZHM9Ii1kaXJzIj4KLSAgICAgICAgPGVjaG8+Q29tcGlsaW5nIGFpZGwgZmlsZXMgaW50byBKYXZhIGNsYXNzZXMuLi48L2VjaG8+Ci0gICAgICAgIDxhcHBseSBleGVjdXRhYmxlPSIke2FpZGx9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItcCR7YW5kcm9pZC5haWRsfSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzb3VyY2UuYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1vJHtnZW4uYWJzb2x1dGUuZGlyfSIgLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzb3VyY2UuYWJzb2x1dGUuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5haWRsIiAvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2FwcGx5PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBDb21waWxlcyB0aGlzIHByb2plY3QncyAuamF2YSBmaWxlcyBpbnRvIC5jbGFzcyBmaWxlcy4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSItcmVzb3VyY2Utc3JjLCAtYWlkbCIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgcHJvamVjdCdzIC5qYXZhIGZpbGVzIGludG8gLmNsYXNzIGZpbGVzIj4KLSAgICAgICAgPCEtLSBJZiBhbmRyb2lkIHJ1bGVzIGFyZSB1c2VkIGZvciBhIHRlc3QgcHJvamVjdCwgaXRzIGNsYXNzcGF0aCBzaG91bGQgaW5jbHVkZQotICAgICAgICAgICAgIHRlc3RlZCBwcm9qZWN0J3MgbG9jYXRpb24gLS0+Ci0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImV4dGVuc2libGUuY2xhc3NwYXRoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7dGVzdGVkLnByb2plY3QuYWJzb2x1dGUuZGlyfS9iaW4vY2xhc3NlcyIgZWxzZT0iLiI+Ci0gICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InRlc3RlZC5wcm9qZWN0LmFic29sdXRlLmRpciIgLz4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgIDxqYXZhYyBlbmNvZGluZz0iYXNjaWkiIHRhcmdldD0iMS41IiBkZWJ1Zz0idHJ1ZSIgZXh0ZGlycz0iIgotICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7b3V0LmNsYXNzZXMuYWJzb2x1dGUuZGlyfSIKLSAgICAgICAgICAgICAgICBib290Y2xhc3NwYXRocmVmPSJhbmRyb2lkLnRhcmdldC5jbGFzc3BhdGgiCi0gICAgICAgICAgICAgICAgdmVyYm9zZT0iJHt2ZXJib3NlfSIgY2xhc3NwYXRoPSIke2V4dGVuc2libGUuY2xhc3NwYXRofSI+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c291cmNlLmFic29sdXRlLmRpcn0iIC8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7Z2VuLmFic29sdXRlLmRpcn0iIC8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtleHRlcm5hbC5saWJzLmFic29sdXRlLmRpcn0iIGluY2x1ZGVzPSIqLmphciIgLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBDb252ZXJ0cyB0aGlzIHByb2plY3QncyAuY2xhc3MgZmlsZXMgaW50byAuZGV4IGZpbGVzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLWRleCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxkZXgtaGVscGVyIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFB1dHMgdGhlIHByb2plY3QncyByZXNvdXJjZXMgaW50byB0aGUgb3V0cHV0IHBhY2thZ2UgZmlsZQotICAgICAgICAgVGhpcyBhY3R1YWxseSBjYW4gY3JlYXRlIG11bHRpcGxlIHJlc291cmNlIHBhY2thZ2UgaW4gY2FzZQotICAgICAgICAgU29tZSBjdXN0b20gYXBrIHdpdGggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBoYXZlIGJlZW4KLSAgICAgICAgIGRlY2xhcmVkIGluIGRlZmF1bHQucHJvcGVydGllcy4KLSAgICAgICAgIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLXBhY2thZ2UtcmVzb3VyY2VzIj4KLSAgICAgICAgPGVjaG8+UGFja2FnaW5nIHJlc291cmNlczwvZWNobz4KLSAgICAgICAgPGFhcHRleGVjIGV4ZWN1dGFibGU9IiR7YWFwdH0iCi0gICAgICAgICAgICAgICAgY29tbWFuZD0icGFja2FnZSIKLSAgICAgICAgICAgICAgICBtYW5pZmVzdD0iQW5kcm9pZE1hbmlmZXN0LnhtbCIKLSAgICAgICAgICAgICAgICByZXNvdXJjZXM9IiR7cmVzb3VyY2UuYWJzb2x1dGUuZGlyfSIKLSAgICAgICAgICAgICAgICBhc3NldHM9IiR7YXNzZXQuYWJzb2x1dGUuZGlyfSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkamFyPSIke2FuZHJvaWQuamFyfSIKLSAgICAgICAgICAgICAgICBvdXRmb2xkZXI9IiR7b3V0LmFic29sdXRlLmRpcn0iCi0gICAgICAgICAgICAgICAgYmFzZW5hbWU9IiR7YW50LnByb2plY3QubmFtZX0iIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFBhY2thZ2VzIHRoZSBhcHBsaWNhdGlvbiBhbmQgc2lnbiBpdCB3aXRoIGEgZGVidWcga2V5LiAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Ii1wYWNrYWdlLWRlYnVnLXNpZ24iIGRlcGVuZHM9Ii1kZXgsIC1wYWNrYWdlLXJlc291cmNlcyI+Ci0gICAgICAgIDxwYWNrYWdlLWhlbHBlciBzaWduLnBhY2thZ2U9InRydWUiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFBhY2thZ2VzIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IHNpZ25pbmcgaXQuIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLXBhY2thZ2Utbm8tc2lnbiIgZGVwZW5kcz0iLWRleCwgLXBhY2thZ2UtcmVzb3VyY2VzIj4KLSAgICAgICAgPHBhY2thZ2UtaGVscGVyIHNpZ24ucGFja2FnZT0iZmFsc2UiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Ii1jb21waWxlLXRlc3RlZC1pZi10ZXN0IiBpZj0idGVzdGVkLnByb2plY3QuZGlyIiB1bmxlc3M9ImRvLm5vdC5jb21waWxlLmFnYWluIj4KLSAgICAgICA8c3ViYW50IHRhcmdldD0iY29tcGlsZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVkLnByb2plY3QuYWJzb2x1dGUuZGlyfSIgaW5jbHVkZXM9ImJ1aWxkLnhtbCIgLz4KLSAgICAgICA8L3N1YmFudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gQnVpbGRzIGRlYnVnIG91dHB1dCBwYWNrYWdlLCBwcm92aWRlZCBhbGwgdGhlIG5lY2Vzc2FyeSBmaWxlcyBhcmUgYWxyZWFkeSBkZXhlZCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImRlYnVnIiBkZXBlbmRzPSItY29tcGlsZS10ZXN0ZWQtaWYtdGVzdCwgLXBhY2thZ2UtZGVidWctc2lnbiIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQnVpbGRzIHRoZSBhcHBsaWNhdGlvbiBhbmQgc2lnbnMgaXQgd2l0aCBhIGRlYnVnIGtleS4iPgotICAgICAgICA8emlwYWxpZ24taGVscGVyIGluLnBhY2thZ2U9IiR7b3V0LmRlYnVnLnVuYWxpZ25lZC5wYWNrYWdlfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnBhY2thZ2U9IiR7b3V0LmRlYnVnLnBhY2thZ2V9IiAvPgotICAgICAgICA8ZWNobz5EZWJ1ZyBQYWNrYWdlOiAke291dC5kZWJ1Zy5wYWNrYWdlfTwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iLXJlbGVhc2UtY2hlY2siPgotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyZWxlYXNlLnNpZ24iPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImtleS5zdG9yZSIgLz4KLSAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImtleS5hbGlhcyIgLz4KLSAgICAgICAgICAgIDwvYW5kPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iLXJlbGVhc2Utbm9zaWduIiBkZXBlbmRzPSItcmVsZWFzZS1jaGVjayIgdW5sZXNzPSJyZWxlYXNlLnNpZ24iPgotICAgICAgICA8ZWNobz5ObyBrZXkuc3RvcmUgYW5kIGtleS5hbGlhcyBwcm9wZXJ0aWVzIGZvdW5kIGluIGJ1aWxkLnByb3BlcnRpZXMuPC9lY2hvPgotICAgICAgICA8ZWNobz5QbGVhc2Ugc2lnbiAke291dC51bnNpZ25lZC5wYWNrYWdlfSBtYW51YWxseTwvZWNobz4KLSAgICAgICAgPGVjaG8+YW5kIHJ1biB6aXBhbGlnbiBmcm9tIHRoZSBBbmRyb2lkIFNESyB0b29scy48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9Ii1wYWNrYWdlLW5vLXNpZ24sIC1yZWxlYXNlLW5vc2lnbiIgaWY9InJlbGVhc2Uuc2lnbiIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQnVpbGRzIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGdlbmVyYXRlZCBhcGsgZmlsZSBtdXN0IGJlIHNpZ25lZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBwdWJsaXNoZWQuIj4KLSAgICAgICAgPCEtLSBHZXRzIHBhc3N3b3JkcyAtLT4KLSAgICAgICAgPGlucHV0Ci0gICAgICAgICAgICAgICAgbWVzc2FnZT0iUGxlYXNlIGVudGVyIGtleXN0b3JlIHBhc3N3b3JkIChzdG9yZToke2tleS5zdG9yZX0pOiIKLSAgICAgICAgICAgICAgICBhZGRwcm9wZXJ0eT0ia2V5LnN0b3JlLnBhc3N3b3JkIiAvPgotICAgICAgICA8aW5wdXQKLSAgICAgICAgICAgICAgICBtZXNzYWdlPSJQbGVhc2UgZW50ZXIgcGFzc3dvcmQgZm9yIGFsaWFzICcke2tleS5hbGlhc30nOiIKLSAgICAgICAgICAgICAgICBhZGRwcm9wZXJ0eT0ia2V5LmFsaWFzLnBhc3N3b3JkIiAvPgotCi0gICAgICAgIDwhLS0gU2lnbnMgdGhlIEFQSyAtLT4KLSAgICAgICAgPGVjaG8+U2lnbmluZyBmaW5hbCBhcGsuLi48L2VjaG8+Ci0gICAgICAgIDxzaWduamFyCi0gICAgICAgICAgICAgICAgamFyPSIke291dC51bnNpZ25lZC5wYWNrYWdlfSIKLSAgICAgICAgICAgICAgICBzaWduZWRqYXI9IiR7b3V0LnVuYWxpZ25lZC5wYWNrYWdlfSIKLSAgICAgICAgICAgICAgICBrZXlzdG9yZT0iJHtrZXkuc3RvcmV9IgotICAgICAgICAgICAgICAgIHN0b3JlcGFzcz0iJHtrZXkuc3RvcmUucGFzc3dvcmR9IgotICAgICAgICAgICAgICAgIGFsaWFzPSIke2tleS5hbGlhc30iCi0gICAgICAgICAgICAgICAga2V5cGFzcz0iJHtrZXkuYWxpYXMucGFzc3dvcmR9IgotICAgICAgICAgICAgICAgIHZlcmJvc2U9IiR7dmVyYm9zZX0iIC8+Ci0KLSAgICAgICAgPCEtLSBaaXAgYWxpZ25zIHRoZSBBUEsgLS0+Ci0gICAgICAgIDx6aXBhbGlnbi1oZWxwZXIgaW4ucGFja2FnZT0iJHtvdXQudW5hbGlnbmVkLnBhY2thZ2V9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucGFja2FnZT0iJHtvdXQucmVsZWFzZS5wYWNrYWdlfSIgLz4KLSAgICAgICAgPGVjaG8+UmVsZWFzZSBQYWNrYWdlOiAke291dC5yZWxlYXNlLnBhY2thZ2V9PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJkZWJ1ZyIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5zdGFsbHMvcmVpbnN0YWxscyB0aGUgZGVidWcgcGFja2FnZSBvbnRvIGEgcnVubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yIG9yIGRldmljZS4gSWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBwcmV2aW91c2x5IGluc3RhbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2lnbmF0dXJlcyBtdXN0IG1hdGNoLiIgPgotICAgICAgICA8aW5zdGFsbC1oZWxwZXIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iLXVuaW5zdGFsbC1jaGVjayI+Ci0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InVuaW5zdGFsbC5ydW4iPgotICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9Im1hbmlmZXN0LnBhY2thZ2UiIC8+Ci0gICAgICAgIDwvY29uZGl0aW9uPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSItdW5pbnN0YWxsLWVycm9yIiBkZXBlbmRzPSItdW5pbnN0YWxsLWNoZWNrIiB1bmxlc3M9InVuaW5zdGFsbC5ydW4iPgotICAgICAgICA8ZWNobz5VbmFibGUgdG8gcnVuICdhbnQgdW5pbnN0YWxsJywgbWFuaWZlc3QucGFja2FnZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZC4KLSAgICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBVbmluc3RhbGxzIHRoZSBwYWNrYWdlIGZyb20gdGhlIGRlZmF1bHQgZW11bGF0b3IvZGV2aWNlIC0tPgotICAgIDx0YXJnZXQgbmFtZT0idW5pbnN0YWxsIiBkZXBlbmRzPSItdW5pbnN0YWxsLWVycm9yIiBpZj0idW5pbnN0YWxsLnJ1biIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pbnN0YWxscyB0aGUgYXBwbGljYXRpb24gZnJvbSBhIHJ1bm5pbmcgZW11bGF0b3Igb3IgZGV2aWNlLiI+Ci0gICAgICAgIDxlY2hvPlVuaW5zdGFsbGluZyAke21hbmlmZXN0LnBhY2thZ2V9IGZyb20gdGhlIGRlZmF1bHQgZW11bGF0b3Igb3IgZGV2aWNlLi4uPC9lY2hvPgotICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke2FkYn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iJHthZGIuZGV2aWNlLmFyZ30iIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJ1bmluc3RhbGwiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke21hbmlmZXN0LnBhY2thZ2V9IiAvPgotICAgICAgICA8L2V4ZWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iUmVtb3ZlcyBvdXRwdXQgZmlsZXMgY3JlYXRlZCBieSBvdGhlciB0YXJnZXRzLiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke291dC5hYnNvbHV0ZS5kaXJ9IiB2ZXJib3NlPSIke3ZlcmJvc2V9IiAvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtnZW4uYWJzb2x1dGUuZGlyfSIgdmVyYm9zZT0iJHt2ZXJib3NlfSIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGFyZ2V0cyBmb3IgY29kZS1jb3ZlcmFnZSBtZWFzdXJlbWVudCBwdXJwb3NlcywgaW52b2tlZCBmcm9tIGV4dGVybmFsIGZpbGUgLS0+Ci0KLSAgICA8IS0tIEVtbWEtaW5zdHJ1bWVudHMgdGVzdGVkIHByb2plY3QgY2xhc3NlcyAoY29tcGlsZXMgdGhlIHRlc3RlZCBwcm9qZWN0IGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICBhbmQgd3JpdGVzIGluc3RydW1lbnRlZCBjbGFzc2VzIHRvICR7aW5zdHJ1bWVudGF0aW9uLmFic29sdXRlLmRpcn0vY2xhc3NlcyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Ii1lbW1hLWluc3RydW1lbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8ZWNobz5JbnN0cnVtZW50aW5nIGNsYXNzZXMgZnJvbSAke291dC5hYnNvbHV0ZS5kaXJ9L2NsYXNzZXMuLi48L2VjaG8+Ci0gICAgICAgIDwhLS0gSXQgb25seSBpbnN0cnVtZW50cyBjbGFzcyBmaWxlcywgbm90IGFueSBleHRlcm5hbCBsaWJzIC0tPgotICAgICAgICA8ZW1tYSBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpbnN0ciB2ZXJib3NpdHk9IiR7dmVyYm9zaXR5fSIKLSAgICAgICAgICAgICAgICAgICBtb2RlPSJvdmVyd3JpdGUiCi0gICAgICAgICAgICAgICAgICAgaW5zdHJwYXRoPSIke291dC5hYnNvbHV0ZS5kaXJ9L2NsYXNzZXMiCi0gICAgICAgICAgICAgICAgICAgb3V0ZGlyPSIke291dC5hYnNvbHV0ZS5kaXJ9L2NsYXNzZXMiPgotICAgICAgICAgICAgPC9pbnN0cj4KLSAgICAgICAgICAgIDwhLS0gVE9ETzogZXhjbHVzaW9uIGZpbHRlcnMgb24gUiouY2xhc3MgYW5kIGFsbG93aW5nIGN1c3RvbSBleGNsdXNpb24gZnJvbQotICAgICAgICAgICAgICAgICB1c2VyIGRlZmluZWQgZmlsZSAtLT4KLSAgICAgICAgPC9lbW1hPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSItZGV4LWluc3RydW1lbnRlZCIgZGVwZW5kcz0iLWVtbWEtaW5zdHJ1bWVudCI+Ci0gICAgICAgPGRleC1oZWxwZXI+Ci0gICAgICAgICAgPGV4dHJhLXBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLW5vLWxvY2FscyIgLz4KLSAgICAgICAgICA8L2V4dHJhLXBhcmFtZXRlcnM+Ci0gICAgICAgICAgPGV4dGVybmFsLWxpYnM+Ci0gICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2VtbWEuZGlyfS9lbW1hX2RldmljZS5qYXIiIC8+Ci0gICAgICAgICAgPC9leHRlcm5hbC1saWJzPgotICAgICAgIDwvZGV4LWhlbHBlcj4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gSW52b2tlZCBmcm9tIGV4dGVybmFsIGZpbGVzIGZvciBjb2RlIGNvdmVyYWdlIHB1cnBvc2VzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLXBhY2thZ2Utd2l0aC1lbW1hIiBkZXBlbmRzPSItZGV4LWluc3RydW1lbnRlZCwgLXBhY2thZ2UtcmVzb3VyY2VzIj4KLSAgICAgICAgPHBhY2thZ2UtaGVscGVyIHNpZ24ucGFja2FnZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZXh0cmEtamFycz4KLSAgICAgICAgICAgICAgICA8IS0tIEluamVjdGVkIGZyb20gZXh0ZXJuYWwgZmlsZSAtLT4KLSAgICAgICAgICAgICAgICA8amFyZmlsZSBwYXRoPSIke2VtbWEuZGlyfS9lbW1hX2RldmljZS5qYXIiIC8+Ci0gICAgICAgICAgICA8L2V4dHJhLWphcnM+Ci0gICAgICAgIDwvcGFja2FnZS1oZWxwZXI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Ii1kZWJ1Zy13aXRoLWVtbWEiIGRlcGVuZHM9Ii1wYWNrYWdlLXdpdGgtZW1tYSI+Ci0gICAgICAgIDx6aXBhbGlnbi1oZWxwZXIgaW4ucGFja2FnZT0iJHtvdXQuZGVidWcudW5hbGlnbmVkLnBhY2thZ2V9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucGFja2FnZT0iJHtvdXQuZGVidWcucGFja2FnZX0iIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Ii1pbnN0YWxsLXdpdGgtZW1tYSIgZGVwZW5kcz0iLWRlYnVnLXdpdGgtZW1tYSI+Ci0gICAgICAgIDxpbnN0YWxsLWhlbHBlciAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBFbmQgb2YgdGFyZ2V0cyBmb3IgY29kZS1jb3ZlcmFnZSBtZWFzdXJlbWVudCBwdXJwb3NlcyAtLT4KLQotICAgIDx0YXJnZXQgbmFtZT0iaGVscCI+Ci0gICAgICAgIDwhLS0gZGlzcGxheXMgc3RhcnRzIGF0IGNvbCAxMwotICAgICAgICAgICAgICB8MTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwfCAtLT4KLSAgICAgICAgPGVjaG8+QW5kcm9pZCBBbnQgQnVpbGQuIEF2YWlsYWJsZSB0YXJnZXRzOjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgaGVscDogICAgICBEaXNwbGF5cyB0aGlzIGhlbHAuPC9lY2hvPgotICAgICAgICA8ZWNobz4gICBjbGVhbjogICAgIFJlbW92ZXMgb3V0cHV0IGZpbGVzIGNyZWF0ZWQgYnkgb3RoZXIgdGFyZ2V0cy48L2VjaG8+Ci0gICAgICAgIDxlY2hvPiAgIGNvbXBpbGU6ICAgQ29tcGlsZXMgcHJvamVjdCdzIC5qYXZhIGZpbGVzIGludG8gLmNsYXNzIGZpbGVzLjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgZGVidWc6ICAgICBCdWlsZHMgdGhlIGFwcGxpY2F0aW9uIGFuZCBzaWducyBpdCB3aXRoIGEgZGVidWcga2V5LjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgcmVsZWFzZTogICBCdWlsZHMgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZ2VuZXJhdGVkIGFwayBmaWxlIG11c3QgYmU8L2VjaG8+Ci0gICAgICAgIDxlY2hvPiAgICAgICAgICAgICAgc2lnbmVkIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQuPC9lY2hvPgotICAgICAgICA8ZWNobz4gICBpbnN0YWxsOiAgIEluc3RhbGxzL3JlaW5zdGFsbHMgdGhlIGRlYnVnIHBhY2thZ2Ugb250byBhIHJ1bm5pbmc8L2VjaG8+Ci0gICAgICAgIDxlY2hvPiAgICAgICAgICAgICAgZW11bGF0b3Igb3IgZGV2aWNlLjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgICAgICAgICAgICBJZiB0aGUgYXBwbGljYXRpb24gd2FzIHByZXZpb3VzbHkgaW5zdGFsbGVkLCB0aGU8L2VjaG8+Ci0gICAgICAgIDxlY2hvPiAgICAgICAgICAgICAgc2lnbmF0dXJlcyBtdXN0IG1hdGNoLjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgdW5pbnN0YWxsOiBVbmluc3RhbGxzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGEgcnVubmluZyBlbXVsYXRvciBvcjwvZWNobz4KLSAgICAgICAgPGVjaG8+ICAgICAgICAgICAgICBkZXZpY2UuPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9hbmRyb2lkX3Rlc3RfcnVsZXMueG1sIGIvdG9vbHMvc2NyaXB0cy9hbmRyb2lkX3Rlc3RfcnVsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUwM2FlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYW5kcm9pZF90ZXN0X3J1bGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYW5kcm9pZF90ZXN0X3J1bGVzIiBkZWZhdWx0PSJydW4tdGVzdHMiPgotCi0gICAgPGltcG9ydCBmaWxlPSJhbmRyb2lkX3J1bGVzLnhtbCIgLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0ZWQucHJvamVjdC5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke3Rlc3RlZC5wcm9qZWN0LmRpcn0iIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imluc3RydW1lbnRhdGlvbi5kaXIiIHZhbHVlPSJpbnN0cnVtZW50ZWQiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imluc3RydW1lbnRhdGlvbi5hYnNvbHV0ZS5kaXIiIGxvY2F0aW9uPSIke2luc3RydW1lbnRhdGlvbi5kaXJ9IiAvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QucnVubmVyIiB2YWx1ZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+Ci0gICAgPCEtLSBBcHBsaWNhdGlvbiBwYWNrYWdlIG9mIHRoZSB0ZXN0ZWQgcHJvamVjdCBleHRyYWN0ZWQgZnJvbSBpdHMgbWFuaWZlc3QgZmlsZSAtLT4KLSAgICA8eHBhdGggaW5wdXQ9IiR7dGVzdGVkLnByb2plY3QuYWJzb2x1dGUuZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sIgotICAgICAgICAgICAgICAgIGV4cHJlc3Npb249Ii9tYW5pZmVzdC9AcGFja2FnZSIgb3V0cHV0PSJ0ZXN0ZWQubWFuaWZlc3QucGFja2FnZSIgLz4KLQotICAgIDwhLS0gVE9ETzogbWFrZSBpdCBtb3JlIGNvbmZpZ3VyYWJsZSBpbiB0aGUgbmV4dCBDTCdzIC0gbm93IGl0IGlzIGRlZmF1bHQgZm9yIGF1dG8tZ2VuZXJhdGVkCi0gICAgICAgICBwcm9qZWN0IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbW1hLmR1bXAuZmlsZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9kYXRhLyR7dGVzdGVkLm1hbmlmZXN0LnBhY2thZ2V9L2ZpbGVzL2NvdmVyYWdlLmVjIiAvPgotCi0gICAgPG1hY3JvZGVmIG5hbWU9InJ1bi10ZXN0cy1oZWxwZXIiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVtbWEuZW5hYmxlZCIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImV4dHJhLWluc3RydW1lbnQtYXJncyIgb3B0aW9uYWw9InllcyIgLz4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8ZWNobz5SdW5uaW5nIHRlc3RzIC4uLjwvZWNobz4KLSAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7YWRifSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNoZWxsIiAvPgotICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9ImFtIiAvPgotICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Imluc3RydW1lbnQiIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLXciIC8+Ci0gICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLWUiIC8+Ci0gICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iY292ZXJhZ2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iQHtlbW1hLmVuYWJsZWR9IiAvPgotICAgICAgICAgICAgICAgIDxleHRyYS1pbnN0cnVtZW50LWFyZ3MgLz4KLSAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIke21hbmlmZXN0LnBhY2thZ2V9LyR7dGVzdC5ydW5uZXJ9IiAvPgotICAgICAgICAgICAgPC9leGVjPgotICAgICAgICA8L3NlcXVlbnRpYWw+Ci0gICAgPC9tYWNyb2RlZj4KLQotICAgIDwhLS0gSW52b2tpbmcgdGhpcyB0YXJnZXQgc2V0cyB0aGUgdmFsdWUgb2YgZXh0ZW5zaWJsZS5jbGFzc3BhdGgsIHdoaWNoIGlzIGJlaW5nIGFkZGVkIHRvIGphdmFjCi0gICAgICAgICBjbGFzc3BhdGggaW4gdGFyZ2V0ICdjb21waWxlJyAoYW5kcm9pZF9ydWxlcy54bWwpIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iLXNldC1jb3ZlcmFnZS1jbGFzc3BhdGgiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXh0ZW5zaWJsZS5jbGFzc3BhdGgiCi0gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7aW5zdHJ1bWVudGF0aW9uLmFic29sdXRlLmRpcn0vY2xhc3NlcyIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gRW5zdXJlcyB0aGF0IHRlc3RlZCBwcm9qZWN0IGlzIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlIGJlZm9yZSB3ZSBydW4gdGhlIHRlc3RzLgotICAgICAgICAgVXNlZCBmb3Igb3JkaW5hcnkgdGVzdHMsIHdpdGhvdXQgY292ZXJhZ2UgbWVhc3VyZW1lbnQgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSItaW5zdGFsbC10ZXN0ZWQtcHJvamVjdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkby5ub3QuY29tcGlsZS5hZ2FpbiIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxzdWJhbnQgdGFyZ2V0PSJpbnN0YWxsIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0ZWQucHJvamVjdC5hYnNvbHV0ZS5kaXJ9IiBpbmNsdWRlcz0iYnVpbGQueG1sIiAvPgotICAgICAgICA8L3N1YmFudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzIiBkZXBlbmRzPSItaW5zdGFsbC10ZXN0ZWQtcHJvamVjdCwgaW5zdGFsbCIKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB0ZXN0cyBmcm9tIHRoZSBwYWNrYWdlIGRlZmluZWQgaW4gdGVzdC5wYWNrYWdlIHByb3BlcnR5Ij4KLSAgICAgICAgPHJ1bi10ZXN0cy1oZWxwZXIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iLWluc3RhbGwtaW5zdHJ1bWVudGVkIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRvLm5vdC5jb21waWxlLmFnYWluIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPHN1YmFudCB0YXJnZXQ9Ii1pbnN0YWxsLXdpdGgtZW1tYSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0LmFic29sdXRlLmRpciIgdmFsdWU9IiR7aW5zdHJ1bWVudGF0aW9uLmFic29sdXRlLmRpcn0iIC8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVkLnByb2plY3QuYWJzb2x1dGUuZGlyfSIgaW5jbHVkZXM9ImJ1aWxkLnhtbCIgLz4KLSAgICAgICAgPC9zdWJhbnQ+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvdmVyYWdlIiBkZXBlbmRzPSItc2V0LWNvdmVyYWdlLWNsYXNzcGF0aCwgLWluc3RhbGwtaW5zdHJ1bWVudGVkLCBpbnN0YWxsIgotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSB0ZXN0cyBhZ2FpbnN0IHRoZSBpbnN0cnVtZW50ZWQgY29kZSBhbmQgZ2VuZXJhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSBjb3ZlcmFnZSByZXBvcnQiPgotICAgICAgICA8cnVuLXRlc3RzLWhlbHBlciBlbW1hLmVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPGV4dHJhLWluc3RydW1lbnQtYXJncz4KLSAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItZSIgLz4KLSAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJjb3ZlcmFnZUZpbGUiIC8+Ci0gICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtlbW1hLmR1bXAuZmlsZX0iIC8+Ci0gICAgICAgICAgICA8L2V4dHJhLWluc3RydW1lbnQtYXJncz4KLSAgICAgICAgPC9ydW4tdGVzdHMtaGVscGVyPgotICAgICAgICA8ZWNobz5Eb3dubG9hZGluZyBjb3ZlcmFnZSBmaWxlIGludG8gcHJvamVjdCBkaXJlY3RvcnkuLi48L2VjaG8+Ci0gICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7YWRifSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0icHVsbCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7ZW1tYS5kdW1wLmZpbGV9IiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iY292ZXJhZ2UuZWMiIC8+Ci0gICAgICAgIDwvZXhlYz4KLSAgICAgICAgPGVjaG8+RXh0cmFjdGluZyBjb3ZlcmFnZSByZXBvcnQuLi48L2VjaG8+Ci0gICAgICAgIDxlbW1hPgotICAgICAgICAgICAgPHJlcG9ydCBzb3VyY2VwYXRoPSIke3Rlc3RlZC5wcm9qZWN0LmFic29sdXRlLmRpcn0vJHtzb3VyY2UuZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0iJHt2ZXJib3NpdHl9Ij4KLSAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlcG9ydC5kaXIgb3Igc29tZXRoaW5nIGxpa2Ugc2hvdWxkIGJlIGludHJvZHVjZWQgaWYgbmVjZXNzYXJ5IC0tPgotICAgICAgICAgICAgICAgIDxpbmZpbGVzZXQgZGlyPSIuIj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY292ZXJhZ2UuZWMiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvdmVyYWdlLmVtIiAvPgotICAgICAgICAgICAgICAgIDwvaW5maWxlc2V0PgotICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogcmVwb3J0cyBpbiBvdGhlciwgaW5kaWNhdGVkIGJ5IHVzZXIgZm9ybWF0cyAtLT4KLSAgICAgICAgICAgICAgICA8aHRtbCBvdXRmaWxlPSJjb3ZlcmFnZS5odG1sIiAvPgotICAgICAgICAgICA8L3JlcG9ydD4KLSAgICAgICAgPC9lbW1hPgotICAgICAgICA8ZWNobz5DbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMuLi48L2VjaG8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2luc3RydW1lbnRhdGlvbi5hYnNvbHV0ZS5kaXJ9IiAvPgotICAgICAgICA8ZGVsZXRlIGZpbGU9ImNvdmVyYWdlLmVjIiAvPgotICAgICAgICA8ZGVsZXRlIGZpbGU9ImNvdmVyYWdlLmVtIiAvPgotICAgICAgICA8ZWNobz5TYXZpbmcgdGhlIHJlcG9ydCBmaWxlIGluICR7YmFzZWRpcn0vY292ZXJhZ2UvY292ZXJhZ2UuaHRtbDwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9MSUNFTlNFIGIvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9hcHAueWFtbCBiL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvYXBwLnlhbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmYjUwYzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9hcHAueWFtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWFwcGxpY2F0aW9uOiBhbmRyb2lkYXBwZG9jcy1zdGFnaW5nCi12ZXJzaW9uOiAxCi1ydW50aW1lOiBweXRob24KLWFwaV92ZXJzaW9uOiAxCi0KLWhhbmRsZXJzOgotLSB1cmw6IC9nYWVfc2hlbGwvc3RhdGljCi0gIHN0YXRpY19kaXI6IGdhZV9zaGVsbC9zdGF0aWMKLSAgZXhwaXJhdGlvbjogMWQKLQotLSB1cmw6IC9nYWVfc2hlbGwvLioKLSAgc2NyaXB0OiAvZ2FlX3NoZWxsL3NoZWxsLnB5Ci0gIGxvZ2luOiBhZG1pbgotCi0tIHVybDogLioKLSAgc2NyaXB0OiBtYWluLnB5CmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9SRUFETUUgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDA4OWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9nYWVfc2hlbGwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQW4gaW50ZXJhY3RpdmUsIHN0YXRlZnVsIEFKQVggc2hlbGwgdGhhdCBydW5zIFB5dGhvbiBjb2RlIG9uIHRoZSBzZXJ2ZXIuCi0KLVBhcnQgb2YgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1hcHAtZW5naW5lLXNhbXBsZXMvLgotCi1NYXkgYmUgcnVuIGFzIGEgc3RhbmRhbG9uZSBhcHAgb3IgaW4gYW4gZXhpc3RpbmcgYXBwIGFzIGFuIGFkbWluLW9ubHkgaGFuZGxlci4KLUNhbiBiZSB1c2VkIGZvciBzeXN0ZW0gYWRtaW5pc3RyYXRpb24gdGFza3MsIGFzIGFuIGludGVyYWN0aXZlIHdheSB0byB0cnkgb3V0Ci1BUElzLCBvciBhcyBhIGRlYnVnZ2luZyBhaWQgZHVyaW5nIGRldmVsb3BtZW50LgotCi1UaGUgbG9nZ2luZywgb3MsIHN5cywgZGIsIGFuZCB1c2VycyBtb2R1bGVzIGFyZSBpbXBvcnRlZCBhdXRvbWF0aWNhbGx5LgotCi1JbnRlcnByZXRlciBzdGF0ZSBpcyBzdG9yZWQgaW4gdGhlIGRhdGFzdG9yZSBzbyB0aGF0IHZhcmlhYmxlcywgZnVuY3Rpb24KLWRlZmluaXRpb25zLCBhbmQgb3RoZXIgdmFsdWVzIGluIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZXMgY2FuIGJlIHVzZWQKLWFjcm9zcyBjb21tYW5kcy4KLQotVG8gdXNlIHRoZSBzaGVsbCBpbiB5b3VyIGFwcCwgY29weSBzaGVsbC5weSwgc3RhdGljLyosIGFuZCB0ZW1wbGF0ZXMvKiBpbnRvCi15b3VyIGFwcCdzIHNvdXJjZSBkaXJlY3RvcnkuIFRoZW4sIGNvcHkgdGhlIFVSTCBoYW5kbGVycyBmcm9tIGFwcC55YW1sIGludG8KLXlvdXIgYXBwLnlhbWwuCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9fX2luaXRfXy5weSBiL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL19faW5pdF9fLnB5YyBiL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL19faW5pdF9fLnB5YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NTFlOS4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9fX2luaXRfXy5weWMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9zaGVsbC5weSBiL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL3NoZWxsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjJmYjE3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvZ2FlX3NoZWxsL3NoZWxsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0iIiIKLUFuIGludGVyYWN0aXZlLCBzdGF0ZWZ1bCBBSkFYIHNoZWxsIHRoYXQgcnVucyBQeXRob24gY29kZSBvbiB0aGUgc2VydmVyLgotCi1QYXJ0IG9mIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtYXBwLWVuZ2luZS1zYW1wbGVzLy4KLQotTWF5IGJlIHJ1biBhcyBhIHN0YW5kYWxvbmUgYXBwIG9yIGluIGFuIGV4aXN0aW5nIGFwcCBhcyBhbiBhZG1pbi1vbmx5IGhhbmRsZXIuCi1DYW4gYmUgdXNlZCBmb3Igc3lzdGVtIGFkbWluaXN0cmF0aW9uIHRhc2tzLCBhcyBhbiBpbnRlcmFjdGl2ZSB3YXkgdG8gdHJ5IG91dAotQVBJcywgb3IgYXMgYSBkZWJ1Z2dpbmcgYWlkIGR1cmluZyBkZXZlbG9wbWVudC4KLQotVGhlIGxvZ2dpbmcsIG9zLCBzeXMsIGRiLCBhbmQgdXNlcnMgbW9kdWxlcyBhcmUgaW1wb3J0ZWQgYXV0b21hdGljYWxseS4KLQotSW50ZXJwcmV0ZXIgc3RhdGUgaXMgc3RvcmVkIGluIHRoZSBkYXRhc3RvcmUgc28gdGhhdCB2YXJpYWJsZXMsIGZ1bmN0aW9uCi1kZWZpbml0aW9ucywgYW5kIG90aGVyIHZhbHVlcyBpbiB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2VzIGNhbiBiZSB1c2VkCi1hY3Jvc3MgY29tbWFuZHMuCi0KLVRvIHVzZSB0aGUgc2hlbGwgaW4geW91ciBhcHAsIGNvcHkgc2hlbGwucHksIHN0YXRpYy8qLCBhbmQgdGVtcGxhdGVzLyogaW50bwoteW91ciBhcHAncyBzb3VyY2UgZGlyZWN0b3J5LiBUaGVuLCBjb3B5IHRoZSBVUkwgaGFuZGxlcnMgZnJvbSBhcHAueWFtbCBpbnRvCi15b3VyIGFwcC55YW1sLgotCi1UT0RPOiB1bml0IHRlc3RzIQotIiIiCi0KLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgbmV3Ci1pbXBvcnQgb3MKLWltcG9ydCBwaWNrbGUKLWltcG9ydCBzeXMKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB0eXBlcwotaW1wb3J0IHdzZ2lyZWYuaGFuZGxlcnMKLQotZnJvbSBnb29nbGUuYXBwZW5naW5lLmFwaSBpbXBvcnQgdXNlcnMKLWZyb20gZ29vZ2xlLmFwcGVuZ2luZS5leHQgaW1wb3J0IGRiCi1mcm9tIGdvb2dsZS5hcHBlbmdpbmUuZXh0IGltcG9ydCB3ZWJhcHAKLWZyb20gZ29vZ2xlLmFwcGVuZ2luZS5leHQud2ViYXBwIGltcG9ydCB0ZW1wbGF0ZQotCi0KLSMgU2V0IHRvIFRydWUgaWYgc3RhY2sgdHJhY2VzIHNob3VsZCBiZSBzaG93biBpbiB0aGUgYnJvd3NlciwgZXRjLgotX0RFQlVHID0gVHJ1ZQotCi0jIFRoZSBlbnRpdHkga2luZCBmb3Igc2hlbGwgc2Vzc2lvbnMuIEZlZWwgZnJlZSB0byByZW5hbWUgdG8gc3VpdCB5b3VyIGFwcC4KLV9TRVNTSU9OX0tJTkQgPSAnX1NoZWxsX1Nlc3Npb24nCi0KLSMgVHlwZXMgdGhhdCBjYW4ndCBiZSBwaWNrbGVkLgotVU5QSUNLTEFCTEVfVFlQRVMgPSAoCi0gIHR5cGVzLk1vZHVsZVR5cGUsCi0gIHR5cGVzLlR5cGVUeXBlLAotICB0eXBlcy5DbGFzc1R5cGUsCi0gIHR5cGVzLkZ1bmN0aW9uVHlwZSwKLSAgKQotCi0jIFVucGlja2xhYmxlIHN0YXRlbWVudHMgdG8gc2VlZCBuZXcgc2Vzc2lvbnMgd2l0aC4KLUlOSVRJQUxfVU5QSUNLTEFCTEVTID0gWwotICAnaW1wb3J0IGxvZ2dpbmcnLAotICAnaW1wb3J0IG9zJywKLSAgJ2ltcG9ydCBzeXMnLAotICAnZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGInLAotICAnZnJvbSBnb29nbGUuYXBwZW5naW5lLmFwaSBpbXBvcnQgdXNlcnMnLAotICBdCi0KLQotY2xhc3MgU2Vzc2lvbihkYi5Nb2RlbCk6Ci0gICIiIkEgc2hlbGwgc2Vzc2lvbi4gU3RvcmVzIHRoZSBzZXNzaW9uJ3MgZ2xvYmFscy4KLQotICBFYWNoIHNlc3Npb24gZ2xvYmFscyBpcyBzdG9yZWQgaW4gb25lIG9mIHR3byBwbGFjZXM6Ci0KLSAgSWYgdGhlIGdsb2JhbCBpcyBwaWNrbGFibGUsIGl0J3Mgc3RvcmVkIGluIHRoZSBwYXJhbGxlbCBnbG9iYWxzIGFuZAotICBnbG9iYWxfbmFtZXMgbGlzdCBwcm9wZXJ0aWVzLiAoVGhleSdyZSBwYXJhbGxlbCBsaXN0cyB0byB3b3JrIGFyb3VuZCB0aGUKLSAgdW5mb3J0dW5hdGUgZmFjdCB0aGF0IHRoZSBkYXRhc3RvcmUgY2FuJ3Qgc3RvcmUgZGljdGlvbmFyaWVzIG5hdGl2ZWx5LikKLQotICBJZiB0aGUgZ2xvYmFsIGlzIG5vdCBwaWNrbGFibGUgKGUuZy4gbW9kdWxlcywgY2xhc3NlcywgYW5kIGZ1bmN0aW9ucyksIG9yIGlmCi0gIGl0IHdhcyBjcmVhdGVkIGJ5IHRoZSBzYW1lIHN0YXRlbWVudCB0aGF0IGNyZWF0ZWQgYW4gdW5waWNrbGFibGUgZ2xvYmFsLAotICBpdCdzIG5vdCBzdG9yZWQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZSBzdGF0ZW1lbnQgaXMgc3RvcmVkIGluIHRoZQotICB1bnBpY2tsYWJsZXMgbGlzdCBwcm9wZXJ0eS4gT24gZWFjaCByZXF1ZXN0LCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBjdXJyZW50Ci0gIHN0YXRlbWVudCwgdGhlIHVucGlja2xhYmxlIHN0YXRlbWVudHMgYXJlIGV2YWx1YXRlZCB0byByZWNyZWF0ZSB0aGUKLSAgdW5waWNrbGFibGUgZ2xvYmFscy4KLQotICBUaGUgdW5waWNrbGFibGVfbmFtZXMgcHJvcGVydHkgc3RvcmVzIGFsbCBvZiB0aGUgbmFtZXMgb2YgZ2xvYmFscyB0aGF0IHdlcmUKLSAgYWRkZWQgYnkgdW5waWNrbGFibGUgc3RhdGVtZW50cy4gV2hlbiB3ZSBwaWNrbGUgYW5kIHN0b3JlIHRoZSBnbG9iYWxzIGFmdGVyCi0gIGV4ZWN1dGluZyBhIHN0YXRlbWVudCwgd2Ugc2tpcCB0aGUgb25lcyBpbiB1bnBpY2tsYWJsZV9uYW1lcy4KLQotICBVc2luZyBUZXh0IGluc3RlYWQgb2Ygc3RyaW5nIGlzIGFuIG9wdGltaXphdGlvbi4gV2UgZG9uJ3QgcXVlcnkgb24gYW55IG9mCi0gIHRoZXNlIHByb3BlcnRpZXMsIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBpbmRleGVkLgotICAiIiIKLSAgZ2xvYmFsX25hbWVzID0gZGIuTGlzdFByb3BlcnR5KGRiLlRleHQpCi0gIGdsb2JhbHMgPSBkYi5MaXN0UHJvcGVydHkoZGIuQmxvYikKLSAgdW5waWNrbGFibGVfbmFtZXMgPSBkYi5MaXN0UHJvcGVydHkoZGIuVGV4dCkKLSAgdW5waWNrbGFibGVzID0gZGIuTGlzdFByb3BlcnR5KGRiLlRleHQpCi0KLSAgZGVmIHNldF9nbG9iYWwoc2VsZiwgbmFtZSwgdmFsdWUpOgotICAgICIiIkFkZHMgYSBnbG9iYWwsIG9yIHVwZGF0ZXMgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0KLSAgICBBbHNvIHJlbW92ZXMgdGhlIGdsb2JhbCBmcm9tIHRoZSBsaXN0IG9mIHVucGlja2xhYmxlIG5hbWVzLgotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgdG8gcmVtb3ZlCi0gICAgICB2YWx1ZTogYW55IHBpY2tsYWJsZSB2YWx1ZQotICAgICIiIgotICAgIGJsb2IgPSBkYi5CbG9iKHBpY2tsZS5kdW1wcyh2YWx1ZSkpCi0KLSAgICBpZiBuYW1lIGluIHNlbGYuZ2xvYmFsX25hbWVzOgotICAgICAgaW5kZXggPSBzZWxmLmdsb2JhbF9uYW1lcy5pbmRleChuYW1lKQotICAgICAgc2VsZi5nbG9iYWxzW2luZGV4XSA9IGJsb2IKLSAgICBlbHNlOgotICAgICAgc2VsZi5nbG9iYWxfbmFtZXMuYXBwZW5kKGRiLlRleHQobmFtZSkpCi0gICAgICBzZWxmLmdsb2JhbHMuYXBwZW5kKGJsb2IpCi0KLSAgICBzZWxmLnJlbW92ZV91bnBpY2tsYWJsZV9uYW1lKG5hbWUpCi0KLSAgZGVmIHJlbW92ZV9nbG9iYWwoc2VsZiwgbmFtZSk6Ci0gICAgIiIiUmVtb3ZlcyBhIGdsb2JhbCwgaWYgaXQgZXhpc3RzLgotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIGdsb2JhbCB0byByZW1vdmUKLSAgICAiIiIKLSAgICBpZiBuYW1lIGluIHNlbGYuZ2xvYmFsX25hbWVzOgotICAgICAgaW5kZXggPSBzZWxmLmdsb2JhbF9uYW1lcy5pbmRleChuYW1lKQotICAgICAgZGVsIHNlbGYuZ2xvYmFsX25hbWVzW2luZGV4XQotICAgICAgZGVsIHNlbGYuZ2xvYmFsc1tpbmRleF0KLQotICBkZWYgZ2xvYmFsc19kaWN0KHNlbGYpOgotICAgICIiIlJldHVybnMgYSBkaWN0aW9uYXJ5IHZpZXcgb2YgdGhlIGdsb2JhbHMuCi0gICAgIiIiCi0gICAgcmV0dXJuIGRpY3QoKG5hbWUsIHBpY2tsZS5sb2Fkcyh2YWwpKQotICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWwgaW4gemlwKHNlbGYuZ2xvYmFsX25hbWVzLCBzZWxmLmdsb2JhbHMpKQotCi0gIGRlZiBhZGRfdW5waWNrbGFibGUoc2VsZiwgc3RhdGVtZW50LCBuYW1lcyk6Ci0gICAgIiIiQWRkcyBhIHN0YXRlbWVudCBhbmQgbGlzdCBvZiBuYW1lcyB0byB0aGUgdW5waWNrbGFibGVzLgotCi0gICAgQWxzbyByZW1vdmVzIHRoZSBuYW1lcyBmcm9tIHRoZSBnbG9iYWxzLgotCi0gICAgQXJnczoKLSAgICAgIHN0YXRlbWVudDogc3RyaW5nLCB0aGUgc3RhdGVtZW50IHRoYXQgY3JlYXRlZCBuZXcgdW5waWNrbGFibGUgZ2xvYmFsKHMpLgotICAgICAgbmFtZXM6IGxpc3Qgb2Ygc3RyaW5nczsgdGhlIG5hbWVzIG9mIHRoZSBnbG9iYWxzIGNyZWF0ZWQgYnkgdGhlIHN0YXRlbWVudC4KLSAgICAiIiIKLSAgICBzZWxmLnVucGlja2xhYmxlcy5hcHBlbmQoZGIuVGV4dChzdGF0ZW1lbnQpKQotCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICBzZWxmLnJlbW92ZV9nbG9iYWwobmFtZSkKLSAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYudW5waWNrbGFibGVfbmFtZXM6Ci0gICAgICAgIHNlbGYudW5waWNrbGFibGVfbmFtZXMuYXBwZW5kKGRiLlRleHQobmFtZSkpCi0KLSAgZGVmIHJlbW92ZV91bnBpY2tsYWJsZV9uYW1lKHNlbGYsIG5hbWUpOgotICAgICIiIlJlbW92ZXMgYSBuYW1lIGZyb20gdGhlIGxpc3Qgb2YgdW5waWNrbGFibGUgbmFtZXMsIGlmIGl0IGV4aXN0cy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBzdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSB1bnBpY2tsYWJsZSBnbG9iYWwgdG8gcmVtb3ZlCi0gICAgIiIiCi0gICAgaWYgbmFtZSBpbiBzZWxmLnVucGlja2xhYmxlX25hbWVzOgotICAgICAgc2VsZi51bnBpY2tsYWJsZV9uYW1lcy5yZW1vdmUobmFtZSkKLQotCi1jbGFzcyBGcm9udFBhZ2VIYW5kbGVyKHdlYmFwcC5SZXF1ZXN0SGFuZGxlcik6Ci0gICIiIkNyZWF0ZXMgYSBuZXcgc2Vzc2lvbiBhbmQgcmVuZGVycyB0aGUgc2hlbGwuaHRtbCB0ZW1wbGF0ZS4KLSAgIiIiCi0KLSAgZGVmIGdldChzZWxmKToKLSAgICAjIHNldCB1cCB0aGUgc2Vzc2lvbi4gVE9ETzogZ2FyYmFnZSBjb2xsZWN0IG9sZCBzaGVsbCBzZXNzaW9ucwotICAgIHNlc3Npb25fa2V5ID0gc2VsZi5yZXF1ZXN0LmdldCgnc2Vzc2lvbicpCi0gICAgaWYgc2Vzc2lvbl9rZXk6Ci0gICAgICBzZXNzaW9uID0gU2Vzc2lvbi5nZXQoc2Vzc2lvbl9rZXkpCi0gICAgZWxzZToKLSAgICAgICMgY3JlYXRlIGEgbmV3IHNlc3Npb24KLSAgICAgIHNlc3Npb24gPSBTZXNzaW9uKCkKLSAgICAgIHNlc3Npb24udW5waWNrbGFibGVzID0gW2RiLlRleHQobGluZSkgZm9yIGxpbmUgaW4gSU5JVElBTF9VTlBJQ0tMQUJMRVNdCi0gICAgICBzZXNzaW9uX2tleSA9IHNlc3Npb24ucHV0KCkKLQotICAgIHRlbXBsYXRlX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3RlbXBsYXRlcycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGwuaHRtbCcpCi0gICAgc2Vzc2lvbl91cmwgPSAnLz9zZXNzaW9uPSVzJyAlIHNlc3Npb25fa2V5Ci0gICAgdmFycyA9IHsgJ3NlcnZlcl9zb2Z0d2FyZSc6IG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddLAotICAgICAgICAgICAgICdweXRob25fdmVyc2lvbic6IHN5cy52ZXJzaW9uLAotICAgICAgICAgICAgICdzZXNzaW9uJzogc3RyKHNlc3Npb25fa2V5KSwKLSAgICAgICAgICAgICAndXNlcic6IHVzZXJzLmdldF9jdXJyZW50X3VzZXIoKSwKLSAgICAgICAgICAgICAnbG9naW5fdXJsJzogdXNlcnMuY3JlYXRlX2xvZ2luX3VybChzZXNzaW9uX3VybCksCi0gICAgICAgICAgICAgJ2xvZ291dF91cmwnOiB1c2Vycy5jcmVhdGVfbG9nb3V0X3VybChzZXNzaW9uX3VybCksCi0gICAgICAgICAgICAgfQotICAgIHJlbmRlcmVkID0gd2ViYXBwLnRlbXBsYXRlLnJlbmRlcih0ZW1wbGF0ZV9maWxlLCB2YXJzLCBkZWJ1Zz1fREVCVUcpCi0gICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUocmVuZGVyZWQpCi0KLQotY2xhc3MgU3RhdGVtZW50SGFuZGxlcih3ZWJhcHAuUmVxdWVzdEhhbmRsZXIpOgotICAiIiJFdmFsdWF0ZXMgYSBweXRob24gc3RhdGVtZW50IGluIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgotICAiIiIKLQotICBkZWYgZ2V0KHNlbGYpOgotICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbicKLQotICAgICMgZXh0cmFjdCB0aGUgc3RhdGVtZW50IHRvIGJlIHJ1bgotICAgIHN0YXRlbWVudCA9IHNlbGYucmVxdWVzdC5nZXQoJ3N0YXRlbWVudCcpCi0gICAgaWYgbm90IHN0YXRlbWVudDoKLSAgICAgIHJldHVybgotCi0gICAgIyB0aGUgcHl0aG9uIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBuZXR3b3JrIGxpbmUgZW5kaW5ncwotICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKCdcclxuJywgJ1xuJykKLQotICAgICMgYWRkIGEgY291cGxlIG5ld2xpbmVzIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudC4gdGhpcyBtYWtlcwotICAgICMgc2luZ2xlLWxpbmUgZXhwcmVzc2lvbnMgc3VjaCBhcyAnY2xhc3MgRm9vOiBwYXNzJyBldmFsdWF0ZSBoYXBwaWx5LgotICAgIHN0YXRlbWVudCArPSAnXG5cbicKLQotICAgICMgbG9nIGFuZCBjb21waWxlIHRoZSBzdGF0ZW1lbnQgdXAgZnJvbnQKLSAgICB0cnk6Ci0gICAgICBsb2dnaW5nLmluZm8oJ0NvbXBpbGluZyBhbmQgZXZhbHVhdGluZzpcbiVzJyAlIHN0YXRlbWVudCkKLSAgICAgIGNvbXBpbGVkID0gY29tcGlsZShzdGF0ZW1lbnQsICc8c3RyaW5nPicsICdzaW5nbGUnKQotICAgIGV4Y2VwdDoKLSAgICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCi0gICAgICByZXR1cm4KLQotICAgICMgY3JlYXRlIGEgZGVkaWNhdGVkIG1vZHVsZSB0byBiZSB1c2VkIGFzIHRoaXMgc3RhdGVtZW50J3MgX19tYWluX18KLSAgICBzdGF0ZW1lbnRfbW9kdWxlID0gbmV3Lm1vZHVsZSgnX19tYWluX18nKQotCi0gICAgIyB1c2UgdGhpcyByZXF1ZXN0J3MgX19idWlsdGluX18sIHNpbmNlIGl0IGNoYW5nZXMgb24gZWFjaCByZXF1ZXN0LgotICAgICMgdGhpcyBpcyBuZWVkZWQgZm9yIGltcG9ydCBzdGF0ZW1lbnRzLCBhbW9uZyBvdGhlciB0aGluZ3MuCi0gICAgaW1wb3J0IF9fYnVpbHRpbl9fCi0gICAgc3RhdGVtZW50X21vZHVsZS5fX2J1aWx0aW5zX18gPSBfX2J1aWx0aW5fXwotCi0gICAgIyBsb2FkIHRoZSBzZXNzaW9uIGZyb20gdGhlIGRhdGFzdG9yZQotICAgIHNlc3Npb24gPSBTZXNzaW9uLmdldChzZWxmLnJlcXVlc3QuZ2V0KCdzZXNzaW9uJykpCi0KLSAgICAjIHN3YXAgaW4gb3VyIGN1c3RvbSBtb2R1bGUgZm9yIF9fbWFpbl9fLiB0aGVuIHVucGlja2xlIHRoZSBzZXNzaW9uCi0gICAgIyBnbG9iYWxzLCBydW4gdGhlIHN0YXRlbWVudCwgYW5kIHJlLXBpY2tsZSB0aGUgc2Vzc2lvbiBnbG9iYWxzLCBhbGwKLSAgICAjIGluc2lkZSBpdC4KLSAgICBvbGRfbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQotICAgIHRyeToKLSAgICAgIHN5cy5tb2R1bGVzWydfX21haW5fXyddID0gc3RhdGVtZW50X21vZHVsZQotICAgICAgc3RhdGVtZW50X21vZHVsZS5fX25hbWVfXyA9ICdfX21haW5fXycKLQotICAgICAgIyByZS1ldmFsdWF0ZSB0aGUgdW5waWNrbGFibGVzCi0gICAgICBmb3IgY29kZSBpbiBzZXNzaW9uLnVucGlja2xhYmxlczoKLSAgICAgICAgZXhlYyBjb2RlIGluIHN0YXRlbWVudF9tb2R1bGUuX19kaWN0X18KLQotICAgICAgIyByZS1pbml0aWFsaXplIHRoZSBnbG9iYWxzCi0gICAgICBmb3IgbmFtZSwgdmFsIGluIHNlc3Npb24uZ2xvYmFsc19kaWN0KCkuaXRlbXMoKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgIHN0YXRlbWVudF9tb2R1bGUuX19kaWN0X19bbmFtZV0gPSB2YWwKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgIG1zZyA9ICdEcm9wcGluZyAlcyBzaW5jZSBpdCBjb3VsZCBub3QgYmUgdW5waWNrbGVkLlxuJyAlIG5hbWUKLSAgICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShtc2cpCi0gICAgICAgICAgbG9nZ2luZy53YXJuaW5nKG1zZyArIHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCi0gICAgICAgICAgc2Vzc2lvbi5yZW1vdmVfZ2xvYmFsKG5hbWUpCi0KLSAgICAgICMgcnVuIQotICAgICAgb2xkX2dsb2JhbHMgPSBkaWN0KHN0YXRlbWVudF9tb2R1bGUuX19kaWN0X18pCi0gICAgICB0cnk6Ci0gICAgICAgIG9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0Ci0gICAgICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCi0gICAgICAgIHRyeToKLSAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5yZXNwb25zZS5vdXQKLSAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5yZXNwb25zZS5vdXQKLSAgICAgICAgICBleGVjIGNvbXBpbGVkIGluIHN0YXRlbWVudF9tb2R1bGUuX19kaWN0X18KLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkX3N0ZG91dAotICAgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRfc3RkZXJyCi0gICAgICBleGNlcHQ6Ci0gICAgICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCi0gICAgICAgIHJldHVybgotCi0gICAgICAjIGV4dHJhY3QgdGhlIG5ldyBnbG9iYWxzIHRoYXQgdGhpcyBzdGF0ZW1lbnQgYWRkZWQKLSAgICAgIG5ld19nbG9iYWxzID0ge30KLSAgICAgIGZvciBuYW1lLCB2YWwgaW4gc3RhdGVtZW50X21vZHVsZS5fX2RpY3RfXy5pdGVtcygpOgotICAgICAgICBpZiBuYW1lIG5vdCBpbiBvbGRfZ2xvYmFscyBvciB2YWwgIT0gb2xkX2dsb2JhbHNbbmFtZV06Ci0gICAgICAgICAgbmV3X2dsb2JhbHNbbmFtZV0gPSB2YWwKLQotICAgICAgaWYgVHJ1ZSBpbiBbaXNpbnN0YW5jZSh2YWwsIFVOUElDS0xBQkxFX1RZUEVTKQotICAgICAgICAgICAgICAgICAgZm9yIHZhbCBpbiBuZXdfZ2xvYmFscy52YWx1ZXMoKV06Ci0gICAgICAgICMgdGhpcyBzdGF0ZW1lbnQgYWRkZWQgYW4gdW5waWNrbGFibGUgZ2xvYmFsLiBzdG9yZSB0aGUgc3RhdGVtZW50IGFuZAotICAgICAgICAjIHRoZSBuYW1lcyBvZiBhbGwgb2YgdGhlIGdsb2JhbHMgaXQgYWRkZWQgaW4gdGhlIHVucGlja2xhYmxlcy4KLSAgICAgICAgc2Vzc2lvbi5hZGRfdW5waWNrbGFibGUoc3RhdGVtZW50LCBuZXdfZ2xvYmFscy5rZXlzKCkpCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoJ1N0b3JpbmcgdGhpcyBzdGF0ZW1lbnQgYXMgYW4gdW5waWNrbGFibGUuJykKLQotICAgICAgZWxzZToKLSAgICAgICAgIyB0aGlzIHN0YXRlbWVudCBkaWRuJ3QgYWRkIGFueSB1bnBpY2tsYWJsZXMuIHBpY2tsZSBhbmQgc3RvcmUgdGhlCi0gICAgICAgICMgbmV3IGdsb2JhbHMgYmFjayBpbnRvIHRoZSBkYXRhc3RvcmUuCi0gICAgICAgIGZvciBuYW1lLCB2YWwgaW4gbmV3X2dsb2JhbHMuaXRlbXMoKToKLSAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfXycpOgotICAgICAgICAgICAgc2Vzc2lvbi5zZXRfZ2xvYmFsKG5hbWUsIHZhbCkKLQotICAgIGZpbmFsbHk6Ci0gICAgICBzeXMubW9kdWxlc1snX19tYWluX18nXSA9IG9sZF9tYWluCi0KLSAgICBzZXNzaW9uLnB1dCgpCi0KLQotZGVmIG1haW4oKToKLSAgYXBwbGljYXRpb24gPSB3ZWJhcHAuV1NHSUFwcGxpY2F0aW9uKAotICAgIFsoJy9nYWVfc2hlbGwvJywgRnJvbnRQYWdlSGFuZGxlciksCi0gICAgICgnL2dhZV9zaGVsbC9zaGVsbC5kbycsIFN0YXRlbWVudEhhbmRsZXIpXSwgZGVidWc9X0RFQlVHKQotICB3c2dpcmVmLmhhbmRsZXJzLkNHSUhhbmRsZXIoKS5ydW4oYXBwbGljYXRpb24pCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9zdGF0aWMvc2hlbGwuanMgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9zdGF0aWMvc2hlbGwuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTE1ODMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9nYWVfc2hlbGwvc3RhdGljL3NoZWxsLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIEphdmFzY3JpcHQgY29kZSBmb3IgdGhlIGludGVyYWN0aXZlIEFKQVggc2hlbGwuCi0gKgotICogUGFydCBvZiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWFwcC1lbmdpbmUtc2FtcGxlcy8uCi0gKgotICogSW5jbHVkZXMgYSBmdW5jdGlvbiAoc2hlbGwucnVuU3RhdGVtZW50KSB0aGF0IHNlbmRzIHRoZSBjdXJyZW50IHB5dGhvbgotICogc3RhdGVtZW50IGluIHRoZSBzaGVsbCBwcm9tcHQgdGV4dCBib3ggdG8gdGhlIHNlcnZlciwgYW5kIGEgY2FsbGJhY2sKLSAqIChzaGVsbC5kb25lKSB0aGF0IGRpc3BsYXlzIHRoZSByZXN1bHRzIHdoZW4gdGhlIFhtbEh0dHBSZXF1ZXN0IHJldHVybnMuCi0gKgotICogQWxzbyBpbmNsdWRlcyBjcm9zcy1icm93c2VyIGNvZGUgKHNoZWxsLmdldFhtbEh0dHBSZXF1ZXN0KSB0byBnZXQgYW4KLSAqIFhtbEh0dHBSZXF1ZXN0LgotICovCi0KLS8qKgotICogU2hlbGwgbmFtZXNwYWNlLgotICogQHR5cGUge09iamVjdH0KLSAqLwotdmFyIHNoZWxsID0ge30KLQotLyoqCi0gKiBUaGUgc2hlbGwgaGlzdG9yeS4gaGlzdG9yeSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCBvcmRlcmVkIG9sZGVzdCB0bwotICogbmV3ZXN0LiBoaXN0b3J5Q3Vyc29yIGlzIHRoZSBjdXJyZW50IGhpc3RvcnkgZWxlbWVudCB0aGF0IHRoZSB1c2VyIGlzIG9uLgotICoKLSAqIFRoZSBsYXN0IGhpc3RvcnkgZWxlbWVudCBpcyB0aGUgc3RhdGVtZW50IHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5Ci0gKiB0eXBpbmcuIFdoZW4gYSBzdGF0ZW1lbnQgaXMgcnVuLCBpdCdzIGZyb3plbiBpbiB0aGUgaGlzdG9yeSwgYSBuZXcgaGlzdG9yeQotICogZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBmb3IgdGhlIG5ldyBzdGF0ZW1lbnQsIGFuZAotICogaGlzdG9yeUN1cnNvciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcgZWxlbWVudC4KLSAqCi0gKiBAdHlwZSB7QXJyYXl9Ci0gKi8KLXNoZWxsLmhpc3RvcnkgPSBbJyddOwotCi0vKioKLSAqIFNlZSB7c2hlbGwuaGlzdG9yeX0KLSAqIEB0eXBlIHtudW1iZXJ9Ci0gKi8KLXNoZWxsLmhpc3RvcnlDdXJzb3IgPSAwOwotCi0vKioKLSAqIEEgY29uc3RhbnQgZm9yIHRoZSBYbWxIdHRwUmVxdWVzdCAnZG9uZScgc3RhdGUuCi0gKiBAdHlwZSBOdW1iZXIKLSAqLwotc2hlbGwuRE9ORV9TVEFURSA9IDQ7Ci0KLS8qKgotICogQSBjcm9zcy1icm93c2VyIGZ1bmN0aW9uIHRvIGdldCBhbiBYbWxIdHRwUmVxdWVzdCBvYmplY3QuCi0gKgotICogQHJldHVybiB7WG1sSHR0cFJlcXVlc3Q/fSBhIG5ldyBYbWxIdHRwUmVxdWVzdAotICovCi1zaGVsbC5nZXRYbWxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkgewotICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7Ci0gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOwotICB9IGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsKLSAgICB9IGNhdGNoKGUpIHsKLSAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbnVsbDsKLX07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgcHJvbXB0IHRleHRhcmVhJ3Mgb25rZXlwcmVzcyBoYW5kbGVyLiBEZXBlbmRpbmcgb24gdGhlIGtleSB0aGF0Ci0gKiB3YXMgcHJlc3NlZCwgaXQgd2lsbCBydW4gdGhlIHN0YXRlbWVudCwgbmF2aWdhdGUgdGhlIGhpc3RvcnksIG9yIHVwZGF0ZSB0aGUKLSAqIGN1cnJlbnQgc3RhdGVtZW50IGluIHRoZSBoaXN0b3J5LgotICoKLSAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IHRoZSBrZXlwcmVzcyBldmVudAotICogQHJldHVybiB7Qm9vbGVhbn0gZmFsc2UgdG8gdGVsbCB0aGUgYnJvd3NlciBub3QgdG8gc3VibWl0IHRoZSBmb3JtLgotICovCi1zaGVsbC5vblByb21wdEtleVByZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgdmFyIHN0YXRlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZW1lbnQnKTsKLQotICBpZiAodGhpcy5oaXN0b3J5Q3Vyc29yID09IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxKSB7Ci0gICAgLy8gd2UncmUgb24gdGhlIGN1cnJlbnQgc3RhdGVtZW50LiB1cGRhdGUgaXQgaW4gdGhlIGhpc3RvcnkgYmVmb3JlIGRvaW5nCi0gICAgLy8gYW55dGhpbmcuCi0gICAgdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeUN1cnNvcl0gPSBzdGF0ZW1lbnQudmFsdWU7Ci0gIH0KLQotICAvLyBzaG91bGQgd2UgcHVsbCBzb21ldGhpbmcgZnJvbSB0aGUgaGlzdG9yeT8KLSAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5Q29kZSA9PSAzOCAvKiB1cCBhcnJvdyAqLykgewotICAgIGlmICh0aGlzLmhpc3RvcnlDdXJzb3IgPiAwKSB7Ci0gICAgICBzdGF0ZW1lbnQudmFsdWUgPSB0aGlzLmhpc3RvcnlbLS10aGlzLmhpc3RvcnlDdXJzb3JdOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXlDb2RlID09IDQwIC8qIGRvd24gYXJyb3cgKi8pIHsKLSAgICBpZiAodGhpcy5oaXN0b3J5Q3Vyc29yIDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEpIHsKLSAgICAgIHN0YXRlbWVudC52YWx1ZSA9IHRoaXMuaGlzdG9yeVsrK3RoaXMuaGlzdG9yeUN1cnNvcl07Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICghZXZlbnQuYWx0S2V5KSB7Ci0gICAgLy8gcHJvYmFibHkgY2hhbmdpbmcgdGhlIHN0YXRlbWVudC4gdXBkYXRlIGl0IGluIHRoZSBoaXN0b3J5LgotICAgIHRoaXMuaGlzdG9yeUN1cnNvciA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxOwotICAgIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlDdXJzb3JdID0gc3RhdGVtZW50LnZhbHVlOwotICB9Ci0KLSAgLy8gc2hvdWxkIHdlIHN1Ym1pdD8KLSAgdmFyIGN0cmxFbnRlciA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VibWl0X2tleScpLnZhbHVlID09ICdjdHJsLWVudGVyJyk7Ci0gIGlmIChldmVudC5rZXlDb2RlID09IDEzIC8qIGVudGVyICovICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmCi0gICAgICBldmVudC5jdHJsS2V5ID09IGN0cmxFbnRlcikgewotICAgIHJldHVybiB0aGlzLnJ1blN0YXRlbWVudCgpOwotICB9Ci19OwotCi0vKioKLSAqIFRoZSBYbWxIdHRwUmVxdWVzdCBjYWxsYmFjay4gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIGl0IGFkZHMgdGhlIGNvbW1hbmQKLSAqIGFuZCBpdHMgcmVzdWx0aW5nIG91dHB1dCB0byB0aGUgc2hlbGwgaGlzdG9yeSBkaXYuCi0gKgotICogQHBhcmFtIHtYbWxIdHRwUmVxdWVzdH0gcmVxIHRoZSBYbWxIdHRwUmVxdWVzdCB3ZSB1c2VkIHRvIHNlbmQgdGhlIGN1cnJlbnQKLSAqICAgICBzdGF0ZW1lbnQgdG8gdGhlIHNlcnZlcgotICovCi1zaGVsbC5kb25lID0gZnVuY3Rpb24ocmVxKSB7Ci0gIGlmIChyZXEucmVhZHlTdGF0ZSA9PSB0aGlzLkRPTkVfU1RBVEUpIHsKLSAgICB2YXIgc3RhdGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlbWVudCcpCi0gICAgc3RhdGVtZW50LmNsYXNzTmFtZSA9ICdwcm9tcHQnOwotCi0gICAgLy8gYWRkIHRoZSBjb21tYW5kIHRvIHRoZSBzaGVsbCBvdXRwdXQKLSAgICB2YXIgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dHB1dCcpOwotCi0gICAgb3V0cHV0LnZhbHVlICs9ICdcbj4+PiAnICsgc3RhdGVtZW50LnZhbHVlOwotICAgIHN0YXRlbWVudC52YWx1ZSA9ICcnOwotCi0gICAgLy8gYWRkIGEgbmV3IGhpc3RvcnkgZWxlbWVudAotICAgIHRoaXMuaGlzdG9yeS5wdXNoKCcnKTsKLSAgICB0aGlzLmhpc3RvcnlDdXJzb3IgPSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMTsKLQotICAgIC8vIGFkZCB0aGUgY29tbWFuZCdzIHJlc3VsdAotICAgIHZhciByZXN1bHQgPSByZXEucmVzcG9uc2VUZXh0LnJlcGxhY2UoL15ccyp8XHMqJC9nLCAnJyk7ICAvLyB0cmltIHdoaXRlc3BhY2UKLSAgICBpZiAocmVzdWx0ICE9ICcnKQotICAgICAgb3V0cHV0LnZhbHVlICs9ICdcbicgKyByZXN1bHQ7Ci0KLSAgICAvLyBzY3JvbGwgdG8gdGhlIGJvdHRvbQotICAgIG91dHB1dC5zY3JvbGxUb3AgPSBvdXRwdXQuc2Nyb2xsSGVpZ2h0OwotICAgIGlmIChvdXRwdXQuY3JlYXRlVGV4dFJhbmdlKSB7Ci0gICAgICB2YXIgcmFuZ2UgPSBvdXRwdXQuY3JlYXRlVGV4dFJhbmdlKCk7Ci0gICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7Ci0gICAgICByYW5nZS5zZWxlY3QoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZm9ybSdzIG9uc3VibWl0IGhhbmRsZXIuIEl0IHNlbmRzIHRoZSBweXRob24gc3RhdGVtZW50IHRvIHRoZQotICogc2VydmVyLCBhbmQgcmVnaXN0ZXJzIHNoZWxsLmRvbmUoKSBhcyB0aGUgY2FsbGJhY2sgdG8gcnVuIHdoZW4gaXQgcmV0dXJucy4KLSAqCi0gKiBAcmV0dXJuIHtCb29sZWFufSBmYWxzZSB0byB0ZWxsIHRoZSBicm93c2VyIG5vdCB0byBzdWJtaXQgdGhlIGZvcm0uCi0gKi8KLXNoZWxsLnJ1blN0YXRlbWVudCA9IGZ1bmN0aW9uKCkgewotICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtJyk7Ci0KLSAgLy8gYnVpbGQgYSBYbWxIdHRwUmVxdWVzdAotICB2YXIgcmVxID0gdGhpcy5nZXRYbWxIdHRwUmVxdWVzdCgpOwotICBpZiAoIXJlcSkgewotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhamF4LXN0YXR1cycpLmlubmVySFRNTCA9Ci0gICAgICAgICI8c3BhbiBjbGFzcz0nZXJyb3InPllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgQUpBWC4gOig8L3NwYW4+IjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7IHNoZWxsLmRvbmUocmVxKTsgfTsKLQotICAvLyBidWlsZCB0aGUgcXVlcnkgcGFyYW1ldGVyIHN0cmluZwotICB2YXIgcGFyYW1zID0gJyc7Ci0gIGZvciAoaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgdmFyIGVsZW0gPSBmb3JtLmVsZW1lbnRzW2ldOwotICAgIGlmIChlbGVtLnR5cGUgIT0gJ3N1Ym1pdCcgJiYgZWxlbS50eXBlICE9ICdidXR0b24nICYmIGVsZW0uaWQgIT0gJ2NhcmV0JykgewotICAgICAgdmFyIHZhbHVlID0gZXNjYXBlKGVsZW0udmFsdWUpLnJlcGxhY2UoL1wrL2csICclMkInKTsgLy8gZXNjYXBlIGlnbm9yZXMgKwotICAgICAgcGFyYW1zICs9ICcmJyArIGVsZW0ubmFtZSArICc9JyArIHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8vIHNlbmQgdGhlIHJlcXVlc3QgYW5kIHRlbGwgdGhlIHVzZXIuCi0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZW1lbnQnKS5jbGFzc05hbWUgPSAncHJvbXB0IHByb2Nlc3NpbmcnOwotICByZXEub3Blbihmb3JtLm1ldGhvZCwgZm9ybS5hY3Rpb24gKyAnPycgKyBwYXJhbXMsIHRydWUpOwotICByZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywKLSAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7Ci0gIHJlcS5zZW5kKG51bGwpOwotCi0gIHJldHVybiBmYWxzZTsKLX07CmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9zdGF0aWMvc3Bpbm5lci5naWYgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC9zdGF0aWMvc3Bpbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNThkNmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9nYWVfc2hlbGwvc3RhdGljL3NwaW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9nYWVfc2hlbGwvdGVtcGxhdGVzL3NoZWxsLmh0bWwgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC90ZW1wbGF0ZXMvc2hlbGwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYjIwMC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2dhZV9zaGVsbC90ZW1wbGF0ZXMvc2hlbGwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTx0aXRsZT4gSW50ZXJhY3RpdmUgU2hlbGwgPC90aXRsZT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9nYWVfc2hlbGwvc3RhdGljL3NoZWxsLmpzIj48L3NjcmlwdD4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci1ib2R5IHsKLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLSAgZm9udC1zaXplOiAxMHB0OwotfQotCi1wIHsKLSAgbWFyZ2luOiAwLjVlbTsKLX0KLQotLnByb21wdCwgI291dHB1dCB7Ci0gIHdpZHRoOiA0NWVtOwotICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7Ci0gIGZvbnQtc2l6ZTogMTBwdDsKLSAgbWFyZ2luOiAwLjVlbTsKLSAgcGFkZGluZzogMC41ZW07Ci0gIHBhZGRpbmctcmlnaHQ6IDBlbTsKLSAgb3ZlcmZsb3cteDogaGlkZGVuOwotfQotCi0jdG9vbGJhciB7Ci0gIG1hcmdpbi1sZWZ0OiAwLjVlbTsKLSAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKLX0KLQotI2NhcmV0IHsKLSAgd2lkdGg6IDIuNWVtOwotICBtYXJnaW4tcmlnaHQ6IDBweDsKLSAgcGFkZGluZy1yaWdodDogMHB4OwotICBib3JkZXItcmlnaHQ6IDBweDsKLX0KLQotI3N0YXRlbWVudCB7Ci0gIHdpZHRoOiA0M2VtOwotICBtYXJnaW4tbGVmdDogLTFlbTsKLSAgcGFkZGluZy1sZWZ0OiAwcHg7Ci0gIGJvcmRlci1sZWZ0OiAwcHg7Ci0gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDsKLSAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLX0KLQotLnByb2Nlc3NpbmcgewotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9nYWVfc2hlbGwvc3RhdGljL3NwaW5uZXIuZ2lmIik7Ci19Ci0KLSNhamF4LXN0YXR1cyB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ubWVzc2FnZSB7Ci0gIGNvbG9yOiAjOEFEOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uZXJyb3IgewotICBjb2xvcjogI0Y0NDsKLX0KLQotLnVzZXJuYW1lIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08cD4gSW50ZXJhY3RpdmUgc2VydmVyLXNpZGUgUHl0aG9uIHNoZWxsIGZvcgotPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvIj5Hb29nbGUgQXBwIEVuZ2luZTwvYT4uCi0oPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1hcHAtZW5naW5lLXNhbXBsZXMvIj5zb3VyY2U8L2E+KQotPC9wPgotCi08dGV4dGFyZWEgaWQ9Im91dHB1dCIgcm93cz0iMjIiIHJlYWRvbmx5PSJyZWFkb25seSI+Ci17eyBzZXJ2ZXJfc29mdHdhcmUgfX0KLVB5dGhvbiB7eyBweXRob25fdmVyc2lvbiB9fQotPC90ZXh0YXJlYT4KLQotPGZvcm0gaWQ9ImZvcm0iIGFjdGlvbj0ic2hlbGwuZG8iIG1ldGhvZD0iZ2V0Ij4KLSAgPG5vYnI+Ci0gIDx0ZXh0YXJlYSBjbGFzcz0icHJvbXB0IiBpZD0iY2FyZXQiIHJlYWRvbmx5PSJyZWFkb25seSIgcm93cz0iNCIKLSAgICAgICAgICAgIG9uZm9jdXM9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZW1lbnQnKS5mb2N1cygpIgotICAgICAgICAgICAgPiZndDsmZ3Q7Jmd0OzwvdGV4dGFyZWE+Ci0gIDx0ZXh0YXJlYSBjbGFzcz0icHJvbXB0IiBuYW1lPSJzdGF0ZW1lbnQiIGlkPSJzdGF0ZW1lbnQiIHJvd3M9IjQiCi0gICAgICAgICAgICBvbmtleXByZXNzPSJyZXR1cm4gc2hlbGwub25Qcm9tcHRLZXlQcmVzcyhldmVudCk7Ij48L3RleHRhcmVhPgotICA8L25vYnI+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNlc3Npb24iIHZhbHVlPSJ7eyBzZXNzaW9uIH19IiAvPgotICA8aW5wdXQgdHlwZT0ic3VibWl0IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgLz4KLTwvZm9ybT4KLQotPHAgaWQ9ImFqYXgtc3RhdHVzIj48L3A+Ci0KLTxwIGlkPSJ0b29sYmFyIj4KLXslIGlmIHVzZXIgJX0KLSAgPHNwYW4gY2xhc3M9InVzZXJuYW1lIj57eyB1c2VyLm5pY2tuYW1lIH19PC9zcGFuPgotICAoPGEgaHJlZj0ie3sgbG9nb3V0X3VybCB9fSI+bG9nIG91dDwvYT4pCi17JSBlbHNlICV9Ci0gIDxhIGhyZWY9Int7IGxvZ2luX3VybCB9fSI+bG9nIGluPC9hPgoteyUgZW5kaWYgJX0KLSB8IEN0cmwtVXAvRG93biBmb3IgaGlzdG9yeSB8Ci08c2VsZWN0IGlkPSJzdWJtaXRfa2V5Ij4KLSAgPG9wdGlvbiB2YWx1ZT0iZW50ZXIiPkVudGVyPC9vcHRpb24+Ci0gIDxvcHRpb24gdmFsdWU9ImN0cmwtZW50ZXIiIHNlbGVjdGVkPSJzZWxlY3RlZCI+Q3RybC1FbnRlcjwvb3B0aW9uPgotPC9zZWxlY3Q+Ci08bGFiZWwgZm9yPSJzdWJtaXRfa2V5Ij5zdWJtaXRzPC9sYWJlbD4KLTwvcD4KLQotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlbWVudCcpLmZvY3VzKCk7Ci08L3NjcmlwdD4KLQotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2luZGV4LnlhbWwgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL2luZGV4LnlhbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjA0NmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9hcHBfZW5naW5lX3NlcnZlci9pbmRleC55YW1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotaW5kZXhlczoKLQotIyBBVVRPR0VORVJBVEVECi0KLSMgVGhpcyBpbmRleC55YW1sIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuZXZlciB0aGUgZGV2X2FwcHNlcnZlcgotIyBkZXRlY3RzIHRoYXQgYSBuZXcgdHlwZSBvZiBxdWVyeSBpcyBydW4uICBJZiB5b3Ugd2FudCB0byBtYW5hZ2UgdGhlCi0jIGluZGV4LnlhbWwgZmlsZSBtYW51YWxseSwgcmVtb3ZlIHRoZSBhYm92ZSBtYXJrZXIgbGluZSAodGhlIGxpbmUKLSMgc2F5aW5nICIjIEFVVE9HRU5FUkFURUQiKS4gIElmIHlvdSB3YW50IHRvIG1hbmFnZSBzb21lIGluZGV4ZXMKLSMgbWFudWFsbHksIG1vdmUgdGhlbSBhYm92ZSB0aGUgbWFya2VyIGxpbmUuICBUaGUgaW5kZXgueWFtbCBmaWxlIGlzCi0jIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQgdG8gdGhlIGFkbWluIGNvbnNvbGUgd2hlbiB5b3UgbmV4dCBkZXBsb3kKLSMgeW91ciBhcHBsaWNhdGlvbiB1c2luZyBhcHBjZmcucHkuCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvbWVtY2FjaGVfemlwc2VydmUucHkgYi90b29scy9zY3JpcHRzL2FwcF9lbmdpbmVfc2VydmVyL21lbWNhY2hlX3ppcHNlcnZlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzgyNmIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYXBwX2VuZ2luZV9zZXJ2ZXIvbWVtY2FjaGVfemlwc2VydmUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0iIiJBIGNsYXNzIHRvIHNlcnZlIHBhZ2VzIGZyb20gemlwIGZpbGVzIGFuZCB1c2UgbWVtY2FjaGUgZm9yIHBlcmZvcm1hbmNlLgotCi1UaGlzIGNvbnRhaW5zIGEgY2xhc3MgYW5kIGEgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIGFub255bW91cyBpbnN0YW5jZSBvZiB0aGUKLWNsYXNzIHRvIHNlcnZlIEhUVFAgR0VUIHJlcXVlc3RzLiBNZW1jYWNoZSBpcyB1c2VkIHRvIGluY3JlYXNlIHJlc3BvbnNlIHNwZWVkCi1hbmQgbG93ZXIgcHJvY2Vzc2luZyBjeWNsZXMgdXNlZCBpbiBzZXJ2aW5nLiBDcmVkaXQgdG8gR3VpZG8gdmFuIFJvc3N1bSBhbmQKLWhpcyBpbXBsZW1lbnRhdGlvbiBvZiB6aXBzZXJ2ZSB3aGljaCBzZXJ2ZWQgYXMgYSByZWZlcmVuY2UgYXMgSSB3cm90ZSB0aGlzLgotCi0gIE1lbWNhY2hlZFppcEhhbmRsZXI6IENsYXNzIHRoYXQgc2VydmVzIHJlcXVlc3QKLSAgY3JlYXRlX2hhbmRsZXI6IG1ldGhvZCB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgTWVtY2FjaGVkWmlwSGFuZGxlcgotIiIiCi0KLV9fYXV0aG9yX18gPSAnam1hdHRAZ29vZ2xlLmNvbSAoSnVzdGluIE1hdHRzb24pJwotCi1pbXBvcnQgZW1haWwuVXRpbHMKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgbWltZXR5cGVzCi1pbXBvcnQgdGltZQotaW1wb3J0IHppcGZpbGUKLQotZnJvbSBnb29nbGUuYXBwZW5naW5lLmFwaSBpbXBvcnQgbWVtY2FjaGUKLWZyb20gZ29vZ2xlLmFwcGVuZ2luZS5leHQgaW1wb3J0IHdlYmFwcAotZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dC53ZWJhcHAgaW1wb3J0IHV0aWwKLWZyb20gdGltZSBpbXBvcnQgbG9jYWx0aW1lLCBzdHJmdGltZQotCi1kZWYgY3JlYXRlX2hhbmRsZXIoemlwX2ZpbGVzLCBtYXhfYWdlPU5vbmUsIHB1YmxpYz1Ob25lKToKLSAgIiIiRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgTWVtY2FjaGVkWmlwSGFuZGxlciBpbnN0YW5jZS4KLQotICBBcmdzOgotICAgIHppcF9maWxlczogQSBsaXN0IG9mIGZpbGUgbmFtZXMsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBmaWxlIG5hbWUsIGZpcnN0Ci0gICAgICAgIG1lbWJlciBvZiBmaWxlIG1hcHBpbmdzLiBTZWUgTWVtY2FjaGVkWmlwSGFuZGxlciBkb2N1bWVudGF0aW9uIGZvcgotICAgICAgICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoZSBsaXN0IG9mIGxpc3RzIGZvcm1hdAotICAgIG1heF9hZ2U6IFRoZSBtYXhpbXVtIGNsaWVudC1zaWRlIGNhY2hlIGxpZmV0aW1lCi0gICAgcHVibGljOiBXaGV0aGVyIHRoaXMgc2hvdWxkIGJlIGRlY2xhcmVkIHB1YmxpYyBpbiB0aGUgY2xpZW50LXNpZGUgY2FjaGUKLSAgUmV0dXJuczoKLSAgICBBIE1lbWNhY2hlZFppcEhhbmRsZXIgd3JhcHBlZCBpbiBhIHByZXR0eSwgYW5vbnltb3VzIGJvdyBmb3IgdXNlIHdpdGggQXBwCi0gICAgRW5naW5lCi0KLSAgUmFpc2VzOgotICAgIFZhbHVlRXJyb3I6IGlmIHRoZSB6aXBfZmlsZXMgYXJndW1lbnQgaXMgbm90IGEgbGlzdAotICAiIiIKLSAgIyB2ZXJpZnkgYXJndW1lbnQgaW50ZWdyaXR5LiBJZiB0aGUgYXJndW1lbnQgaXMgcGFzc2VkIGluIGxpc3QgZm9ybWF0LAotICAjIGNvbnZlcnQgaXQgdG8gbGlzdCBvZiBsaXN0cyBmb3JtYXQKLSAgaWYgemlwX2ZpbGVzIGFuZCB0eXBlKHppcF9maWxlcykuX19uYW1lX18gPT0gJ2xpc3QnOgotICAgIG51bV9pdGVtcyA9IGxlbih6aXBfZmlsZXMpCi0gICAgd2hpbGUgbnVtX2l0ZW1zID4gMDoKLSAgICAgIGlmIHR5cGUoemlwX2ZpbGVzW251bV9pdGVtcyAtIDFdKS5fX25hbWVfXyAhPSAnbGlzdCc6Ci0gICAgICAgIHppcF9maWxlc1tudW1faXRlbXMgLSAxXSA9IFt6aXBfZmlsZXNbbnVtX2l0ZW1zLTFdXQotICAgICAgbnVtX2l0ZW1zIC09IDEKLSAgZWxzZToKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdGaWxlIG5hbWUgYXJndW1lbnRzIG11c3QgYmUgYSBsaXN0JykKLQotICBjbGFzcyBIYW5kbGVyV3JhcHBlcihNZW1jYWNoZWRaaXBIYW5kbGVyKToKLSAgICAiIiJTaW1wbGUgd3JhcHBlciBmb3IgYW4gaW5zdGFuY2Ugb2YgTWVtY2FjaGVkWmlwSGFuZGxlci4KLQotICAgIEknbSBzdGlsbCBub3Qgc3VyZSB3aHkgdGhpcyBpcyBuZWVkZWQKLSAgICAiIiIKLSAgICBkZWYgZ2V0KHNlbGYsIG5hbWUpOgotICAgICAgc2VsZi56aXBmaWxlbmFtZXMgPSB6aXBfZmlsZXMKLSAgICAgIHNlbGYuVHJ1ZUdldChuYW1lKQotICAgICAgaWYgbWF4X2FnZSBpcyBub3QgTm9uZToKLSAgICAgICAgTUFYX0FHRSA9IG1heF9hZ2UKLSAgICAgIGlmIHB1YmxpYyBpcyBub3QgTm9uZToKLSAgICAgICAgUFVCTElDID0gcHVibGljCi0KLSAgcmV0dXJuIEhhbmRsZXJXcmFwcGVyCi0KLQotY2xhc3MgTWVtY2FjaGVkWmlwSGFuZGxlcih3ZWJhcHAuUmVxdWVzdEhhbmRsZXIpOgotICAiIiJIYW5kbGVzIGdldCByZXF1ZXN0cyBmb3IgYSBnaXZlbiBVUkwuCi0KLSAgU2VydmVzIGEgR0VUIHJlcXVlc3QgZnJvbSBhIHNlcmllcyBvZiB6aXAgZmlsZXMuIEFzIGZpbGVzIGFyZSBzZXJ2ZWQgdGhleSBhcmUKLSAgcHV0IGludG8gbWVtY2FjaGUsIHdoaWNoIGlzIG11Y2ggZmFzdGVyIHRoYW4gcmV0cmVpdmluZyB0aGVtIGZyb20gdGhlIHppcAotICBzb3VyY2UgZmlsZSBhZ2Fpbi4gSXQgYWxzbyB1c2VzIGNvbnNpZGVyYWJseSBmZXdlciBDUFUgY3ljbGVzLgotICAiIiIKLSAgemlwZmlsZV9jYWNoZSA9IHt9ICAgICAgICAgICAgICAgICMgY2xhc3MgY2FjaGUgb2Ygc291cmNlIHppcCBmaWxlcwotICBNQVhfQUdFID0gNjAwICAgICAgICAgICAgICAgICAgICAgIyBtYXggY2xpZW50LXNpZGUgY2FjaGUgbGlmZXRpbWUKLSAgUFVCTElDID0gVHJ1ZSAgICAgICAgICAgICAgICAgICAgICMgcHVibGljIGNhY2hlIHNldHRpbmcKLSAgQ0FDSEVfUFJFRklYID0gJ2NhY2hlOi8vJyAgICAgICAgICMgbWVtY2FjaGUga2V5IHByZWZpeCBmb3IgYWN0dWFsIFVSTHMKLSAgTkVHX0NBQ0hFX1BSRUZJWCA9ICdub25jYWNoZTovLycgICMgbWVtY2FjaGUga2V5IHByZWZpeCBmb3Igbm9uLWV4aXN0YW50IFVSTAotICBpbnRsU3RyaW5nID0gJ2ludGwvJwotICB2YWxpZExhbmdzID0gWydlbicsICdkZScsICdlcycsICdmcicsJ2l0JywnamEnLCd6aC1DTicsJ3poLVRXJ10KLSAgCi0gIGRlZiBUcnVlR2V0KHNlbGYsIHJlcVVyaSk6Ci0gICAgIiIiVGhlIHRvcC1sZXZlbCBlbnRyeSBwb2ludCB0byBzZXJ2aW5nIHJlcXVlc3RzLgotCi0gICAgQ2FsbGVkICdUcnVlJyBnZXQgYmVjYXVzZSBpdCBkb2VzIHRoZSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyYXBwZXIKLSAgICBjbGFzcycgZ2V0IG1ldGhvZC4gU29tZSBsb2dpYyBpcyBhcHBsaWVkIHRvIHRoZSByZXF1ZXN0IHRvIHNlcnZlIGZpbGVzCi0gICAgZnJvbSBhbiBpbnRsLzxsYW5nPi8uLi4gZGlyZWN0b3J5IG9yIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBsYW5ndWFnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBVUkwgcmVxdWVzdGVkCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgIGxhbmdOYW1lID0gJ2VuJwotICAgIHJlc2V0TGFuZ0Nvb2tpZSA9IEZhbHNlCi0gICAgdXJsTGFuZ05hbWUgPSBOb25lCi0gICAgcmV0cnkgPSBGYWxzZQotICAgIGlzVmFsaWRJbnRsID0gRmFsc2UKLQotICAgICMgVHJ5IHRvIHJldHJpZXZlIHRoZSB1c2VyJ3MgbGFuZyBwcmVmIGZyb20gdGhlIGNvb2tpZS4gSWYgdGhlcmUgaXMgbm8KLSAgICAjIGxhbmcgcHJlZiBjb29raWUgaW4gdGhlIHJlcXVlc3QsIGFkZCBzZXQtY29va2llIHRvIHRoZSByZXNwb25zZSB3aXRoIHRoZSAKLSAgICAjIGRlZmF1bHQgdmFsdWUgb2YgJ2VuJy4KLSAgICB0cnk6Ci0gICAgICBsYW5nTmFtZSA9IHNlbGYucmVxdWVzdC5jb29raWVzWydhbmRyb2lkX2RldmVsb3Blcl9wcmVmX2xhbmcnXQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgIHJlc2V0TGFuZ0Nvb2tpZSA9IFRydWUKLSAgICAgICNsb2dnaW5nLmluZm8oJz09PT09PT09PT09PT09PT09PT09PT09PT09RVhDRVBUSU9OOiBOTyBMQU5HIENPT0tJRSBGT1VORCwgVVNJTkcgWyVzXScsIGxhbmdOYW1lKQotICAgIGxvZ2dpbmcuaW5mbygnPT09PT09PT09PT09PT09PT09PT09PT09PT1SRVEgSU5JVCBuYW1lIFslc10gbGFuZ05hbWUgWyVzXScsIHJlcVVyaSwgbGFuZ05hbWUpCi0KLSAgICAjIFByZXByb2Nlc3MgdGhlIHJlcSB1cmwuIElmIGl0IHJlZmVyZW5jZXMgYSBkaXJlY3Rvcnkgb3IgdGhlIGRvbWFpbiBpdHNlbGYsCi0gICAgIyBhcHBlbmQgJy9pbmRleC5odG1sJyB0byB0aGUgdXJsIGFuZCAzMDIgcmVkaXJlY3QuIE90aGVyd2lzZSwgY29udGludWUKLSAgICAjIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgYmVsb3cuCi0gICAgbmFtZSA9IHNlbGYuUHJlcHJvY2Vzc1VybChyZXFVcmksIGxhbmdOYW1lKQotICAgIGlmIG5hbWU6Ci0gICAgICAjIERvIHNvbWUgcHJlcCBmb3IgaGFuZGxpbmcgaW50bCByZXF1ZXN0cy4gUGFyc2UgdGhlIHVybCBhbmQgdmFsaWRhdGUKLSAgICAgICMgdGhlIGludGwvbGFuZyBzdWJzdHJpbmcsIGV4dHJhY3QgdGhlIHVybCBsYW5nIGNvZGUgKHVybExhbmdOYW1lKSBhbmQgdGhlCi0gICAgICAjIHRoZSB1cmkgdGhhdCBmb2xsb3dzIHRoZSBpbnRsL2xhbmcgc3Vic3RyaW5nKGNvbnRlbnRVcmkpCi0gICAgICBzZWN0aW9ucyA9IG5hbWUuc3BsaXQoIi8iLCAyKQotICAgICAgY29udGVudFVyaSA9IDAKLSAgICAgIGlzSW50bCA9IGxlbihzZWN0aW9ucykgPiAxIGFuZCAoc2VjdGlvbnNbMF0gPT0gImludGwiKQotICAgICAgaWYgaXNJbnRsOgotICAgICAgICBpc1ZhbGlkSW50bCA9IHNlY3Rpb25zWzFdIGluIHNlbGYudmFsaWRMYW5ncwotICAgICAgICBpZiBpc1ZhbGlkSW50bDoKLSAgICAgICAgICB1cmxMYW5nTmFtZSA9IHNlY3Rpb25zWzFdCi0gICAgICAgICAgY29udGVudFVyaSA9IHNlY3Rpb25zWzJdCi0gICAgICAgICAgaWYgKGxhbmdOYW1lICE9IHVybExhbmdOYW1lKToKLSAgICAgICAgICAgICMgaWYgdGhlIGxhbmcgY29kZSBpbiB0aGUgcmVxdWVzdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGluIAotICAgICAgICAgICAgIyB0aGUgY29va2llLCByZXNldCB0aGUgY29va2llIHRvIHRoZSB1cmwgbGFuZyB2YWx1ZS4KLSAgICAgICAgICAgIGxhbmdOYW1lID0gdXJsTGFuZ05hbWUKLSAgICAgICAgICAgIHJlc2V0TGFuZ0Nvb2tpZSA9IFRydWUKLSAgICAgICAgICAgICNsb2dnaW5nLmluZm8oJ0lOVEwgUFJFUCByZXNldHRpbmcgbGFuZ05hbWUgdG8gdXJsTGFuZ05hbWUgWyVzXScsIGxhbmdOYW1lKQotICAgICAgICAgICNlbHNlOiAKLSAgICAgICAgICAjICBsb2dnaW5nLmluZm8oJ0lOVEwgUFJFUCBubyBuZWVkIHRvIHJlc2V0IGxhbmdOYW1lJykKLQotICAgICAgIyBTZW5kIGZvciBwcm9jZXNzaW5nCi0gICAgICBpZiBzZWxmLmlzQ2xlYW5VcmwobmFtZSwgbGFuZ05hbWUsIGlzVmFsaWRJbnRsKToKLSAgICAgICAgIyBoYW5kbGUgYSAnY2xlYW4nIHJlcXVlc3QuCi0gICAgICAgICMgVHJ5IHRvIGZvcm0gYSByZXNwb25zZSB1c2luZyB0aGUgYWN0dWFsIHJlcXVlc3QgdXJsLgotICAgICAgICBpZiBub3Qgc2VsZi5DcmVhdGVSZXNwb25zZShuYW1lLCBsYW5nTmFtZSwgaXNWYWxpZEludGwsIHJlc2V0TGFuZ0Nvb2tpZSk6Ci0gICAgICAgICAgIyBJZiBDcmVhdGVSZXNwb25zZSByZXR1cm5zIEZhbHNlLCB0aGVyZSB3YXMgbm8gc3VjaCBkb2N1bWVudAotICAgICAgICAgICMgaW4gdGhlIGludGwvbGFuZyB0cmVlLiBCZWZvcmUgZ29pbmcgdG8gNDA0LCBzZWUgaWYgdGhlcmUgaXMgYW4KLSAgICAgICAgICAjIEVuZ2xpc2gtbGFuZ3VhZ2UgdmVyc2lvbiBvZiB0aGUgZG9jIGluIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgIyBkZWZhdWx0IHRyZWUgYW5kIHJldHVybiBpdCwgZWxzZSBnbyB0byA0MDQuCi0gICAgICAgICAgc2VsZi5DcmVhdGVSZXNwb25zZShjb250ZW50VXJpLCBsYW5nTmFtZSwgRmFsc2UsIHJlc2V0TGFuZ0Nvb2tpZSkKLQotICAgICAgZWxpZiBpc0ludGw6Ci0gICAgICAgICMgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gcGFzcyB0aHJvdWdoIGFuIGludmFsaWQgaW50bCByZXEgCi0gICAgICAgICMgZm9yIHByb2Nlc3NpbmcgKHNvIGFzIHRvIGdldCA0MDQgYXMgYXBwcm9wcmlhdGUpLiBUaGlzIGlzIG5lZWRlZAotICAgICAgICAjIGJlY2F1c2UgaW50bCB1cmxzIGFyZSBwYXNzZWQgdGhyb3VnaCBjbGVhbiBhbmQgcmV0cmllZCBpbiBFbmdsaXNoLAotICAgICAgICAjIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgbG9nZ2luZy5pbmZvKCcgIEhhbmRsaW5nIGFuIGludmFsaWQgaW50bCByZXF1ZXN0Li4uJykKLSAgICAgICAgc2VsZi5DcmVhdGVSZXNwb25zZShuYW1lLCBsYW5nTmFtZSwgaXNWYWxpZEludGwsIHJlc2V0TGFuZ0Nvb2tpZSkKLQotICAgICAgZWxzZToKLSAgICAgICAgIyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIG5vbi1jbGVhbiB1cmwgKHVzdWFsbHkgYSBub24taW50bAotICAgICAgICAjIHVybCkgdGhhdCB3ZSBuZWVkIHRvIGludGVycHJldCBpbiB0aGUgY29udGV4dCBvZiBhbnkgbGFuZyBwcmVmCi0gICAgICAgICMgdGhhdCBpcyBzZXQuIFByZXBlbmQgYW4gaW50bC9sYW5nIHN0cmluZyB0byB0aGUgcmVxdWVzdCB1cmwgYW5kCi0gICAgICAgICMgc2VuZCBpdCBhcyBhIDMwMiByZWRpcmVjdC4gQWZ0ZXIgdGhlIHJlZGlyZWN0LCB0aGUgc3Vic2VxdWVudAotICAgICAgICAjIHJlcXVlc3Qgd2lsbCBiZSBoYW5kbGVkIGFzIGEgY2xlYW4gdXJsLgotICAgICAgICBzZWxmLlJlZGlyVG9JbnRsKG5hbWUsIHNlbGYuaW50bFN0cmluZywgbGFuZ05hbWUpCi0KLSAgZGVmIGlzQ2xlYW5Vcmwoc2VsZiwgbmFtZSwgbGFuZ05hbWUsIGlzVmFsaWRJbnRsKToKLSAgICAiIiJEZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIGFuIGluY29taW5nIHVybCBzdHJhaWdodCB0byBwcm9jZXNzaW5nLiAKLQotICAgICAgIEFyZ3M6Ci0gICAgICAgICBuYW1lOiBUaGUgaW5jb21pbmcgVVJMCi0KLSAgICAgICBSZXR1cm5zOgotICAgICAgICAgYm9vbGVhbjogV2hldGhlciB0aGUgVVJMIHNob3VsZCBiZSBzZW50IHN0cmFpZ2h0IHRvIHByb2Nlc3NpbmcKLSAgICAiIiIKLSAgICBpZiAobGFuZ05hbWUgPT0gJ2VuJykgb3IgaXNWYWxpZEludGwgb3Igbm90ICgnLmh0bWwnIGluIG5hbWUpIG9yIChub3QgaXNWYWxpZEludGwgYW5kIG5vdCBsYW5nTmFtZSk6Ci0gICAgICByZXR1cm4gVHJ1ZQotCi0gIGRlZiBQcmVwcm9jZXNzVXJsKHNlbGYsIG5hbWUsIGxhbmdOYW1lKToKLSAgICAiIiJBbnkgcHJlcHJvY2Vzc2luZyB3b3JrIG9uIHRoZSBVUkwgd2hlbiBpdCBjb21lcyBpbi4KLQotICAgIFB1dCBhbnkgd29yayByZWxhdGVkIHRvIGludGVycHJldHRpbmcgdGhlIGluY29taW5nIFVSTCBoZXJlLiBGb3IgZXhhbXBsZSwKLSAgICB0aGlzIGlzIHVzZWQgdG8gcmVkaXJlY3QgcmVxdWVzdHMgZm9yIGEgZGlyZWN0b3J5IHRvIHRoZSBpbmRleC5odG1sIGZpbGUKLSAgICBpbiB0aGF0IGRpcmVjdG9yeS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZG8gZGlmZmVyZW50Ci0gICAgcHJlcHJvY2Vzc2luZy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBUaGUgaW5jb21pbmcgVVJMCi0KLSAgICBSZXR1cm5zOgotICAgICAgRmFsc2UgaWYgdGhlIHJlcXVlc3Qgd2FzIHJlZGlyZWN0ZWQgdG8gJy9pbmRleC5odG1sJywgb3IKLSAgICAgIFRoZSBwcm9jZXNzZWQgVVJMLCBvdGhlcndpc2UKLSAgICAiIiIKLSAgICAjIGRldGVybWluZSBpZiB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYSBkaXJlY3RvcnkKLSAgICBmaW5hbF9wYXRoX3NlZ21lbnQgPSBuYW1lCi0gICAgZmluYWxfc2xhc2hfb2Zmc2V0ID0gbmFtZS5yZmluZCgnLycpCi0gICAgaWYgZmluYWxfc2xhc2hfb2Zmc2V0ICE9IGxlbihuYW1lKSAtIDE6Ci0gICAgICBmaW5hbF9wYXRoX3NlZ21lbnQgPSBuYW1lW2ZpbmFsX3NsYXNoX29mZnNldCArIDE6XQotICAgICAgaWYgZmluYWxfcGF0aF9zZWdtZW50LmZpbmQoJy4nKSA9PSAtMToKLSAgICAgICAgbmFtZSA9ICcnLmpvaW4oW25hbWUsICcvJ10pCi0KLSAgICAjIGlmIHRoaXMgaXMgYSBkaXJlY3Rvcnkgb3IgdGhlIGRvbWFpbiBpdHNlbGYsIHJlZGlyZWN0IHRvIC9pbmRleC5odG1sCi0gICAgaWYgbm90IG5hbWUgb3IgKG5hbWVbbGVuKG5hbWUpIC0gMTpdID09ICcvJyk6Ci0gICAgICB1cmkgPSAnJy5qb2luKFsnLycsIG5hbWUsICdpbmRleC5odG1sJ10pCi0gICAgICBsb2dnaW5nLmluZm8oJy0tLT5QUkVQUk9DRVNTSU5HIFJFRElSRUNUIFslc10gdG8gWyVzXSB3aXRoIGxhbmdOYW1lIFslc10nLCBuYW1lLCB1cmksIGxhbmdOYW1lKQotICAgICAgc2VsZi5yZWRpcmVjdCh1cmksIEZhbHNlKQotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBuYW1lCi0KLSAgZGVmIFJlZGlyVG9JbnRsKHNlbGYsIG5hbWUsIGludGxTdHJpbmcsIGxhbmdOYW1lKToKLSAgICAiIiJSZWRpcmVjdCBhbiBpbmNvbWluZyByZXF1ZXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBpbnRsIHVyaS4KLQotICAgICAgIEJ1aWxkcyB0aGUgaW50bC9sYW5nIHN0cmluZyBmcm9tIGEgYmFzZSAoZW4pIHN0cmluZwotICAgICAgIGFuZCByZWRpcmVjdHMgKDMwMikgdGhlIHJlcXVlc3QgdG8gbG9vayBmb3IgYSB2ZXJzaW9uIAotICAgICAgIG9mIHRoZSBmaWxlIGluIHRoZSBsYW5ndWFnZSB0aGF0IG1hdGNoZXMgdGhlIGNsaWVudC0KLSAgICAgICBzdXBwbGllZCBjb29raWUgdmFsdWUuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogVGhlIGluY29taW5nLCBwcmVwcm9jZXNzZWQgVVJMCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGxhbmctc3BlY2lmaWMgVVJMCi0gICAgIiIiCi0gICAgYnVpbHRJbnRsTGFuZ1VyaSA9ICcnLmpvaW4oW2ludGxTdHJpbmcsIGxhbmdOYW1lLCAnLycsIG5hbWUsICc/Jywgc2VsZi5yZXF1ZXN0LnF1ZXJ5X3N0cmluZ10pCi0gICAgdXJpID0gJycuam9pbihbJy8nLCBidWlsdEludGxMYW5nVXJpXSkKLSAgICBsb2dnaW5nLmluZm8oJy0tPj5SRURJUkVDVElORyAlcyB0byAgJXMnLCBuYW1lLCB1cmkpCi0gICAgc2VsZi5yZWRpcmVjdCh1cmksIEZhbHNlKQotICAgIHJldHVybiB1cmkKLQotICBkZWYgQ3JlYXRlUmVzcG9uc2Uoc2VsZiwgbmFtZSwgbGFuZ05hbWUsIGlzVmFsaWRJbnRsLCByZXNldExhbmdDb29raWUpOgotICAgICIiIlByb2Nlc3MgdGhlIHVybCBhbmQgZm9ybSBhIHJlc3BvbnNlLCBpZiBhcHByb3ByaWF0ZS4KLQotICAgICAgIEF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgZmlsZSAobmFtZSkgZnJvbSBjYWNoZSwgCi0gICAgICAgbmVnYXRpdmUgY2FjaGUsIG9yIHN0b3JlICh6aXApIGFuZCBmb3JtIHRoZSByZXNwb25zZS4gCi0gICAgICAgRm9yIGludGwgcmVxdWVzdHMgdGhhdCBhcmUgbm90IGZvdW5kIChpbiB0aGUgbG9jYWxpemVkIHRyZWUpLCAKLSAgICAgICByZXR1cm5zIEZhbHNlIHJhdGhlciB0aGFuIGZvcm1pbmcgYSByZXNwb25zZSwgc28gdGhhdAotICAgICAgIHRoZSByZXF1ZXN0IGNhbiBiZSByZXRyaWVkIHdpdGggdGhlIGJhc2UgdXJsICh0aGlzIGlzIHRoZSAKLSAgICAgICBmYWxsdGhyb3VnaCB0byBkZWZhdWx0IGxhbmd1YWdlKS4gCi0KLSAgICAgICBGb3IgcmVxdWVzdHMgdGhhdCBhcmUgZm91bmQsIGZvcm1zIHRoZSBoZWFkZXJzIGFuZAotICAgICAgIGFkZHMgdGhlIGNvbnRlbnQgdG8gdGhlIHJlc3BvbnNlIGVudGl0eS4gSWYgdGhlIHJlcXVlc3Qgd2FzCi0gICAgICAgZm9yIGFuIGludGwgKGxvY2FsaXplZCkgdXJsLCBhbHNvIHJlc2V0cyB0aGUgbGFuZ3VhZ2UgY29va2llIAotICAgICAgIHRvIHRoZSBsYW5ndWFnZSBzcGVjaWZpZWQgaW4gdGhlIHVybCBpZiBuZWVkZWQsIHRvIGVuc3VyZSB0aGF0IAotICAgICAgIHRoZSBjbGllbnQgbGFuZ3VhZ2UgYW5kIHJlc3BvbnNlIGRhdGEgcmVtYWluIGhhcm1vbmlvdXMuIAotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IFRoZSBpbmNvbWluZywgcHJlcHJvY2Vzc2VkIFVSTAotICAgICAgbGFuZ05hbWU6IFRoZSBsYW5ndWFnZSBpZC4gVXNlZCBhcyBuZWNlc3NhcnkgdG8gcmVzZXQgdGhlCi0gICAgICAgICAgICAgICAgbGFuZ3VhZ2UgY29va2llIGluIHRoZSByZXNwb25zZS4KLSAgICAgIGlzVmFsaWRJbnRsOiBJZiBwcmVzZW50LCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdCBpcwotICAgICAgICAgICAgICAgICAgIGZvciBhIGxhbmd1YWdlLXNwZWNpZmljIHVybAotICAgICAgcmVzZXRMYW5nQ29va2llOiBXaGV0aGVyIHRoZSByZXNwb25zZSBzaG91bGQgcmVzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIGNvb2tpZSB0byAnbGFuZ05hbWUnCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZTogQSByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgZm9yIHRoZSByZXF1ZXN0Ci0gICAgICBGYWxzZTogTm8gcmVzcG9uc2Ugd2FzIGNyZWF0ZWQuCi0gICAgIiIiCi0gICAgIyBzZWUgaWYgd2UgaGF2ZSB0aGUgcGFnZSBpbiB0aGUgbWVtY2FjaGUKLSAgICBsb2dnaW5nLmluZm8oJ1BST0NFU1NJTkcgJXMgbGFuZ05hbWUgWyVzXSBpc1ZhbGlkSW50bCBbJXNdIHJlc2V0TGFuZyBbJXNdJywgCi0gICAgICBuYW1lLCBsYW5nTmFtZSwgaXNWYWxpZEludGwsIHJlc2V0TGFuZ0Nvb2tpZSkKLSAgICByZXNwX2RhdGEgPSBzZWxmLkdldEZyb21DYWNoZShuYW1lKQotICAgIGlmIHJlc3BfZGF0YSBpcyBOb25lOgotICAgICAgbG9nZ2luZy5pbmZvKCcgIENhY2hlIG1pc3MgZm9yICVzJywgbmFtZSkKLSAgICAgIHJlc3BfZGF0YSA9IHNlbGYuR2V0RnJvbU5lZ2F0aXZlQ2FjaGUobmFtZSkKLSAgICAgIGlmIHJlc3BfZGF0YSBpcyBOb25lOgotICAgICAgICByZXNwX2RhdGEgPSBzZWxmLkdldEZyb21TdG9yZShuYW1lKQotCi0gICAgICAgICMgSUYgd2UgaGF2ZSB0aGUgZmlsZSwgcHV0IGl0IGluIHRoZSBtZW1jYWNoZQotICAgICAgICAjIEVMU0UgcHV0IGl0IGluIHRoZSBuZWdhdGl2ZSBjYWNoZQotICAgICAgICBpZiByZXNwX2RhdGEgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgc2VsZi5TdG9yZU9yVXBkYXRlSW5DYWNoZShuYW1lLCByZXNwX2RhdGEpCi0gICAgICAgIGVsaWYgaXNWYWxpZEludGw6Ci0gICAgICAgICAgIyBjb3VsZG4ndCBmaW5kIHRoZSBpbnRsIGRvYy4gVHJ5IHRvIGZhbGwgdGhyb3VnaCB0byBFbmdsaXNoLgotICAgICAgICAgICNsb2dnaW5nLmluZm8oJyAgUmV0cnlpbmcgd2l0aCBiYXNlIHVyaS4uLicpCi0gICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgbG9nZ2luZy5pbmZvKCcgIEFkZGluZyAlcyB0byBuZWdhdGl2ZSBjYWNoZSwgc2VydmluZyA0MDQnLCBuYW1lKQotICAgICAgICAgIHNlbGYuU3RvcmVJbk5lZ2F0aXZlQ2FjaGUobmFtZSkKLSAgICAgICAgICBzZWxmLldyaXRlNDA0RXJyb3IoKQotICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICBlbHNlOgotICAgICAgICAjIGZvdW5kIGl0IGluIG5lZ2F0aXZlIGNhY2hlCi0gICAgICAgIHNlbGYuV3JpdGU0MDRFcnJvcigpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICAjIGZvdW5kIGNvbnRlbnQgZnJvbSBjYWNoZSBvciBzdG9yZQotICAgIGxvZ2dpbmcuaW5mbygnRk9VTkQgQ0xFQU4nKQotICAgIGlmIHJlc2V0TGFuZ0Nvb2tpZToKLSAgICAgIGxvZ2dpbmcuaW5mbygnICBSZXNldHRpbmcgYW5kcm9pZF9kZXZlbG9wZXJfcHJlZl9sYW5nIGNvb2tpZSB0byBbJXNdJywKLSAgICAgIGxhbmdOYW1lKQotICAgICAgZXhwaXJlRGF0ZSA9IHRpbWUubWt0aW1lKGxvY2FsdGltZSgpKSArIDYwICogNjAgKiAyNCAqIDM2NSAqIDEwCi0gICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnMuYWRkX2hlYWRlcignU2V0LUNvb2tpZScsIAotICAgICAgJ2FuZHJvaWRfZGV2ZWxvcGVyX3ByZWZfbGFuZz0lczsgcGF0aD0vOyBleHBpcmVzPSVzJyAlIAotICAgICAgKGxhbmdOYW1lLCBzdHJmdGltZSgiJWEsICVkICViICVZICVIOiVNOiVTIiwgbG9jYWx0aW1lKGV4cGlyZURhdGUpKSkpCi0gICAgbXVzdFJldmFsaWRhdGUgPSBGYWxzZQotICAgIGlmICgnLmh0bWwnIGluIG5hbWUpOgotICAgICAgIyByZXZhbGlkYXRlIGh0bWwgZmlsZXMgLS0gd29ya2Fyb3VuZCBmb3IgY2FjaGUgaW5jb25zaXN0ZW5jaWVzIGZvciAKLSAgICAgICMgbmVnb3RpYXRlZCByZXNwb25zZXMKLSAgICAgIG11c3RSZXZhbGlkYXRlID0gVHJ1ZQotICAgICAgbG9nZ2luZy5pbmZvKCcgIEFkZGluZyBbVmFyeTogQ29va2llXSB0byByZXNwb25zZS4uLicpCi0gICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnMuYWRkX2hlYWRlcignVmFyeScsICdDb29raWUnKQotICAgIGNvbnRlbnRfdHlwZSwgZW5jb2RpbmcgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShuYW1lKQotICAgIGlmIGNvbnRlbnRfdHlwZToKLSAgICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50X3R5cGUKLSAgICAgIHNlbGYuU2V0Q2FjaGluZ0hlYWRlcnMobXVzdFJldmFsaWRhdGUpCi0gICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShyZXNwX2RhdGEpCi0gICAgZWxpZiAobmFtZSA9PSAnZmF2aWNvbi5pY28nKToKLSAgICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnaW1hZ2UveC1pY29uJwotICAgICAgc2VsZi5TZXRDYWNoaW5nSGVhZGVycyhtdXN0UmV2YWxpZGF0ZSkKLSAgICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKHJlc3BfZGF0YSkKLSAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5wc2QnKToKLSAgICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJwotICAgICAgc2VsZi5TZXRDYWNoaW5nSGVhZGVycyhtdXN0UmV2YWxpZGF0ZSkKLSAgICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKHJlc3BfZGF0YSkKLSAgICByZXR1cm4gVHJ1ZQotCi0gIGRlZiBHZXRGcm9tU3RvcmUoc2VsZiwgZmlsZV9wYXRoKToKLSAgICAiIiJSZXRyaWV2ZSBmaWxlIGZyb20gemlwIGZpbGVzLgotCi0gICAgR2V0IHRoZSBmaWxlIGZyb20gdGhlIHNvdXJjZSwgaXQgbXVzdCBub3QgaGF2ZSBiZWVuIGluIHRoZSBtZW1jYWNoZS4gSWYKLSAgICBwb3NzaWJsZSwgd2UnbGwgdXNlIHRoZSB6aXAgZmlsZSBpbmRleCB0byBxdWlja2x5IGxvY2F0ZSB3aGVyZSB0aGUgZmlsZQotICAgIHNob3VsZCBiZSBmb3VuZC4gKFNlZSBNYXBUb0ZpbGVBcmNoaXZlIGRvY3VtZW50YXRpb24gZm9yIGFzc3VtcHRpb25zIGFib3V0Ci0gICAgZmlsZSBvcmRlcmluZy4pIElmIHdlIGRvbid0IGhhdmUgYW4gaW5kZXggb3IgZG9uJ3QgZmluZCB0aGUgZmlsZSB3aGVyZSB0aGUKLSAgICBpbmRleCBzYXlzIHdlIHNob3VsZCwgbG9vayB0aHJvdWdoIGFsbCB0aGUgemlwIGZpbGVzIHRvIGZpbmQgaXQuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZV9wYXRoOiB0aGUgZmlsZSB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoZSByZXF1ZXN0ZWQgZmlsZQotICAgICIiIgotICAgIHJlc3BfZGF0YSA9IE5vbmUKLSAgICBmaWxlX2l0ciA9IGl0ZXIoc2VsZi56aXBmaWxlbmFtZXMpCi0KLSAgICAjIGNoZWNrIHRoZSBpbmRleCwgaWYgd2UgaGF2ZSBvbmUsIHRvIHNlZSB3aGF0IGFyY2hpdmUgdGhlIGZpbGUgaXMgaW4KLSAgICBhcmNoaXZlX25hbWUgPSBzZWxmLk1hcEZpbGVUb0FyY2hpdmUoZmlsZV9wYXRoKQotICAgIGlmIG5vdCBhcmNoaXZlX25hbWU6Ci0gICAgICBhcmNoaXZlX25hbWUgPSBmaWxlX2l0ci5uZXh0KClbMF0KLQotICAgIHdoaWxlIHJlc3BfZGF0YSBpcyBOb25lIGFuZCBhcmNoaXZlX25hbWU6Ci0gICAgICB6aXBfYXJjaGl2ZSA9IHNlbGYuTG9hZFppcEZpbGUoYXJjaGl2ZV9uYW1lKQotICAgICAgaWYgemlwX2FyY2hpdmU6Ci0KLSAgICAgICAgIyB3ZSBleHBlY3Qgc29tZSBsb29rdXBzIHdpbGwgZmFpbCwgYW5kIHRoYXQncyBva2F5LCA0MDRzIHdpbGwgZGVhbAotICAgICAgICAjIHdpdGggdGhhdAotICAgICAgICB0cnk6Ci0gICAgICAgICAgcmVzcF9kYXRhID0gemlwX2FyY2hpdmUucmVhZChmaWxlX3BhdGgpCi0gICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIFJ1bnRpbWVFcnJvciksIGVycjoKLSAgICAgICAgICAjIG5vIG9wCi0gICAgICAgICAgeCA9IEZhbHNlCi0gICAgICAgIGlmIHJlc3BfZGF0YSBpcyBub3QgTm9uZToKLSAgICAgICAgICBsb2dnaW5nLmluZm8oJyVzIHJlYWQgZnJvbSAlcycsIGZpbGVfcGF0aCwgYXJjaGl2ZV9uYW1lKQotICAgICAgICAgIAotICAgICAgdHJ5OgotICAgICAgICBhcmNoaXZlX25hbWUgPSBmaWxlX2l0ci5uZXh0KClbMF0KLSAgICAgIGV4Y2VwdCAoU3RvcEl0ZXJhdGlvbiksIGVycjoKLSAgICAgICAgYXJjaGl2ZV9uYW1lID0gRmFsc2UKLQotICAgIHJldHVybiByZXNwX2RhdGEKLQotICBkZWYgTG9hZFppcEZpbGUoc2VsZiwgemlwZmlsZW5hbWUpOgotICAgICIiIkNvbnZlbmllbmNlIG1ldGhvZCB0byBsb2FkIHppcCBmaWxlLgotCi0gICAgSnVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBsb2FkIHRoZSB6aXAgZmlsZSBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGlzCi0gICAgdXNlZnVsIGlmIHdlIGV2ZXIgd2FudCB0byBjaGFuZ2UgZGF0YSBzdG9yZXMgYW5kIGFsc28gYXMgYSBtZWFucyBvZgotICAgIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciB0ZXN0aW5nLiBUaGlzIG1ldGhvZCB3aWxsIGxvb2sgYXQgb3VyIGZpbGUgY2FjaGUKLSAgICBmaXJzdCwgYW5kIHRoZW4gbG9hZCBhbmQgY2FjaGUgdGhlIGZpbGUgaWYgdGhlcmUncyBhIGNhY2hlIG1pc3MKLQotICAgIEFyZ3M6Ci0gICAgICB6aXBmaWxlbmFtZTogdGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRvIGxvYWQKLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgemlwIGZpbGUgcmVxdWVzdGVkLCBvciBOb25lIGlmIHRoZXJlIGlzIGFuIEkvTyBlcnJvcgotICAgICIiIgotICAgIHppcF9hcmNoaXZlID0gTm9uZQotICAgIHppcF9hcmNoaXZlID0gc2VsZi56aXBmaWxlX2NhY2hlLmdldCh6aXBmaWxlbmFtZSkKLSAgICBpZiB6aXBfYXJjaGl2ZSBpcyBOb25lOgotICAgICAgdHJ5OgotICAgICAgICB6aXBfYXJjaGl2ZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBmaWxlbmFtZSkKLSAgICAgICAgc2VsZi56aXBmaWxlX2NhY2hlW3ppcGZpbGVuYW1lXSA9IHppcF9hcmNoaXZlCi0gICAgICBleGNlcHQgKElPRXJyb3IsIFJ1bnRpbWVFcnJvciksIGVycjoKLSAgICAgICAgbG9nZ2luZy5lcnJvcignQ2FuXCd0IG9wZW4gemlwZmlsZSAlcywgY2F1c2U6ICVzJyAlICh6aXBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpKQotICAgIHJldHVybiB6aXBfYXJjaGl2ZQotCi0gIGRlZiBNYXBGaWxlVG9BcmNoaXZlKHNlbGYsIGZpbGVfcGF0aCk6Ci0gICAgIiIiR2l2ZW4gYSBmaWxlIG5hbWUsIGRldGVybWluZSB3aGF0IGFyY2hpdmUgaXQgc2hvdWxkIGJlIGluLgotCi0gICAgVGhpcyBtZXRob2QgbWFrZXMgdHdvIGNyaXRpY2FsIGFzc3VtcHRpb25zLgotICAgICgxKSBUaGUgemlwIGZpbGVzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgaGFuZGxlciwgaWYgY29uY2F0ZW5hdGVkCi0gICAgICAgIGluIHRoYXQgc2FtZSBvcmRlciwgd291bGQgcmVzdWx0IGluIGEgdG90YWwgb3JkZXJpbmcKLSAgICAgICAgb2YgYWxsIHRoZSBmaWxlcy4gU2VlICgyKSBmb3Igb3JkZXJpbmcgdHlwZS4KLSAgICAoMikgVXBwZXIgY2FzZSBsZXR0ZXJzIGJlZm9yZSBsb3dlciBjYXNlIGxldHRlcnMuIFRoZSB0cmF2ZXJzYWwgb2YgYQotICAgICAgICBkaXJlY3RvcnkgdHJlZSBpcyBkZXB0aCBmaXJzdC4gQSBwYXJlbnQgZGlyZWN0b3J5J3MgZmlsZXMgYXJlIGFkZGVkCi0gICAgICAgIGJlZm9yZSB0aGUgZmlsZXMgb2YgYW55IGNoaWxkIGRpcmVjdG9yaWVzCi0KLSAgICBBcmdzOgotICAgICAgZmlsZV9wYXRoOiB0aGUgZmlsZSB0byBiZSBtYXBwZWQgdG8gYW4gYXJjaGl2ZQotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHdoZXJlIHdlIGV4cGVjdCB0aGUgZmlsZSB0byBiZQotICAgICIiIgotICAgIG51bV9hcmNoaXZlcyA9IGxlbihzZWxmLnppcGZpbGVuYW1lcykKLSAgICB3aGlsZSBudW1fYXJjaGl2ZXMgPiAwOgotICAgICAgdGFyZ2V0ID0gc2VsZi56aXBmaWxlbmFtZXNbbnVtX2FyY2hpdmVzIC0gMV0KLSAgICAgIGlmIGxlbih0YXJnZXQpID4gMToKLSAgICAgICAgaWYgc2VsZi5Db21wYXJlRmlsZW5hbWVzKHRhcmdldFsxXSwgZmlsZV9wYXRoKSA+PSAwOgotICAgICAgICAgIHJldHVybiB0YXJnZXRbMF0KLSAgICAgIG51bV9hcmNoaXZlcyAtPSAxCi0KLSAgICByZXR1cm4gTm9uZQotCi0gIGRlZiBDb21wYXJlRmlsZW5hbWVzKHNlbGYsIGZpbGUxLCBmaWxlMik6Ci0gICAgIiIiRGV0ZXJtaW5lcyB3aGV0aGVyIGZpbGUxIGlzIGxleGlncmFwaGljYWxseSAnYmVmb3JlJyBmaWxlMi4KLQotICAgIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBwYXRocyBhcmUgb3V0cHV0IGluIGEgZGVwdGgtZmlyc3QsCi0gICAgd2l0aCBwYXJlbnQgZGlyZWN0b3JpZXMnIGZpbGVzIHN0b3JlZCBiZWZvcmUgY2hpbGRzJwotCi0gICAgV2Ugc2F5IHRoYXQgZmlsZTEgaXMgbGV4aWdyYXBoaWNhbGx5IGJlZm9yZSBmaWxlMiBpZiB0aGUgbGFzdCBub24tbWF0Y2hpbmcKLSAgICBwYXRoIHNlZ21lbnQgb2YgZmlsZTEgaXMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIGZpbGUyLgotICAgIAotICAgIEFyZ3M6Ci0gICAgICBmaWxlMTogdGhlIGZpcnN0IGZpbGUgcGF0aAotICAgICAgZmlsZTI6IHRoZSBzZWNvbmQgZmlsZSBwYXRoCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBwb3NpdGl2ZSBudW1iZXIgaWYgZmlsZTEgaXMgYmVmb3JlIGZpbGUyCi0gICAgICBBIG5lZ2F0aXZlIG51bWJlciBpZiBmaWxlMiBpcyBiZWZvcmUgZmlsZTEKLSAgICAgIDAgaWYgZmlsZW5hbWVzIGFyZSB0aGUgc2FtZQotICAgICIiIgotICAgIGYxX3NlZ21lbnRzID0gZmlsZTEuc3BsaXQoJy8nKQotICAgIGYyX3NlZ21lbnRzID0gZmlsZTIuc3BsaXQoJy8nKQotCi0gICAgc2VnbWVudF9wdHIgPSAwCi0gICAgd2hpbGUgKHNlZ21lbnRfcHRyIDwgbGVuKGYxX3NlZ21lbnRzKSBhbmQKLSAgICAgICAgICAgc2VnbWVudF9wdHIgPCBsZW4oZjJfc2VnbWVudHMpIGFuZAotICAgICAgICAgICBmMV9zZWdtZW50c1tzZWdtZW50X3B0cl0gPT0gZjJfc2VnbWVudHNbc2VnbWVudF9wdHJdKToKLSAgICAgIHNlZ21lbnRfcHRyICs9IDEKLQotICAgIGlmIGxlbihmMV9zZWdtZW50cykgPT0gbGVuKGYyX3NlZ21lbnRzKToKLQotICAgICAgIyB3ZSBmZWxsIG9mZiB0aGUgZW5kLCB0aGUgcGF0aHMgbXVjaCBiZSB0aGUgc2FtZQotICAgICAgaWYgc2VnbWVudF9wdHIgPT0gbGVuKGYxX3NlZ21lbnRzKToKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICAgIyB3ZSBkaWRuJ3QgZmFsbCBvZiB0aGUgZW5kLCBjb21wYXJlIHRoZSBzZWdtZW50cyB3aGVyZSB0aGV5IGRpZmZlcgotICAgICAgaWYgZjFfc2VnbWVudHNbc2VnbWVudF9wdHJdIDwgZjJfc2VnbWVudHNbc2VnbWVudF9wdHJdOgotICAgICAgICByZXR1cm4gMQotICAgICAgZWxpZiBmMV9zZWdtZW50c1tzZWdtZW50X3B0cl0gPiBmMl9zZWdtZW50c1tzZWdtZW50X3B0cl06Ci0gICAgICAgIHJldHVybiAtMQotICAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICAgIyB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGRpZmZlcnMsIHdlIGVpdGhlciBtaXNtYXRjaGVkIGNvbXBhcmluZwotICAgICAgIyBkaXJlY3Rvcmllcywgb3IgY29tcGFyaW5nIGEgZmlsZSB0byBhIGRpcmVjdG9yeQotICAgIGVsc2U6Ci0KLSAgICAgICMgSUYgd2Ugd2VyZSBsb29raW5nIGF0IHRoZSBsYXN0IHNlZ21lbnQgb2Ygb25lIG9mIHRoZSBwYXRocywKLSAgICAgICMgdGhlIG9uZSB3aXRoIGZld2VyIHNlZ21lbnRzIGlzIGZpcnN0IGJlY2F1c2UgZmlsZXMgY29tZSBiZWZvcmUKLSAgICAgICMgZGlyZWN0b3JpZXMKLSAgICAgICMgRUxTRSB3ZSBqdXN0IG5lZWQgdG8gY29tcGFyZSBkaXJlY3RvcnkgbmFtZXMKLSAgICAgIGlmIChzZWdtZW50X3B0ciArIDEgPT0gbGVuKGYxX3NlZ21lbnRzKSBvcgotICAgICAgICAgIHNlZ21lbnRfcHRyICsgMSA9PSBsZW4oZjJfc2VnbWVudHMpKToKLSAgICAgICAgcmV0dXJuIGxlbihmMl9zZWdtZW50cykgLSBsZW4oZjFfc2VnbWVudHMpCi0gICAgICBlbHNlOgotICAgICAgICBpZiBmMV9zZWdtZW50c1tzZWdtZW50X3B0cl0gPCBmMl9zZWdtZW50c1tzZWdtZW50X3B0cl06Ci0gICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgZWxpZiBmMV9zZWdtZW50c1tzZWdtZW50X3B0cl0gPiBmMl9zZWdtZW50c1tzZWdtZW50X3B0cl06Ci0gICAgICAgICAgcmV0dXJuIC0xCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgcmV0dXJuIDAKLQotICBkZWYgU2V0Q2FjaGluZ0hlYWRlcnMoc2VsZiwgcmV2YWxpZGF0ZSk6Ci0gICAgIiIiU2V0IGNhY2hpbmcgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuIiIiCi0gICAgbWF4X2FnZSA9IHNlbGYuTUFYX0FHRQotICAgICNzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0V4cGlyZXMnXSA9IGVtYWlsLlV0aWxzLmZvcm1hdGRhdGUoCi0gICAgIyAgICB0aW1lLnRpbWUoKSArIG1heF9hZ2UsIHVzZWdtdD1UcnVlKQotCWNhY2hlX2NvbnRyb2wgPSBbXQotICAgIGlmIHNlbGYuUFVCTElDOgotICAgICAgY2FjaGVfY29udHJvbC5hcHBlbmQoJ3B1YmxpYycpCi0gICAgY2FjaGVfY29udHJvbC5hcHBlbmQoJ21heC1hZ2U9JWQnICUgbWF4X2FnZSkKLSAgICBpZiByZXZhbGlkYXRlOgotICAgICAgY2FjaGVfY29udHJvbC5hcHBlbmQoJ211c3QtcmV2YWxpZGF0ZScpCi0gICAgc2VsZi5yZXNwb25zZS5oZWFkZXJzWydDYWNoZS1Db250cm9sJ10gPSAnLCAnLmpvaW4oY2FjaGVfY29udHJvbCkKLQotICBkZWYgR2V0RnJvbUNhY2hlKHNlbGYsIGZpbGVuYW1lKToKLSAgICAiIiJHZXQgZmlsZSBmcm9tIG1lbWNhY2hlLCBpZiBhdmFpbGFibGUuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZW5hbWU6IFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gcmV0dXJuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKLSAgICAiIiIKLSAgICByZXR1cm4gbWVtY2FjaGUuZ2V0KCclcyVzJyAlIChzZWxmLkNBQ0hFX1BSRUZJWCwgZmlsZW5hbWUpKQotCi0gIGRlZiBTdG9yZU9yVXBkYXRlSW5DYWNoZShzZWxmLCBmaWxlbmFtZSwgZGF0YSk6Ci0gICAgIiIiU3RvcmUgZGF0YSBpbiB0aGUgY2FjaGUuCi0KLSAgICBTdG9yZSBhIHBpZWNlIG9mIGRhdGEgaW4gdGhlIG1lbWNhY2hlLiBNZW1jYWNoZSBoYXMgYSBtYXhpbXVtIGl0ZW0gc2l6ZSBvZgotICAgIDEqMTBeNiBieXRlcy4gSWYgdGhlIGRhdGEgaXMgdG9vIGxhcmdlLCBmYWlsLCBidXQgbG9nIHRoZSBmYWlsdXJlLiBGdXR1cmUKLSAgICB3b3JrIHdpbGwgY29uc2lkZXIgY29tcHJlc3NpbmcgdGhlIGRhdGEgYmVmb3JlIHN0b3Jpbmcgb3IgY2h1bmtpbmcgaXQKLQotICAgIEFyZ3M6Ci0gICAgICBmaWxlbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc3RvcmUKLSAgICAgIGRhdGE6IHRoZSBkYXRhIG9mIHRoZSBmaWxlCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgIHRyeToKLSAgICAgIGlmIG5vdCBtZW1jYWNoZS5hZGQoJyVzJXMnICUgKHNlbGYuQ0FDSEVfUFJFRklYLCBmaWxlbmFtZSksIGRhdGEpOgotICAgICAgICBtZW1jYWNoZS5yZXBsYWNlKCclcyVzJyAlIChzZWxmLkNBQ0hFX1BSRUZJWCwgZmlsZW5hbWUpLCBkYXRhKQotICAgIGV4Y2VwdCAoVmFsdWVFcnJvciksIGVycjoKLSAgICAgIGxvZ2dpbmcud2FybmluZygnRGF0YSBzaXplIHRvbyBsYXJnZSB0byBjYWNoZVxuJXMnICUgZXJyKQotCi0gIGRlZiBXcml0ZTQwNEVycm9yKHNlbGYpOgotICAgICIiIk91cHR1dCBhIHNpbXBsZSA0MDQgcmVzcG9uc2UuIiIiCi0gICAgc2VsZi5lcnJvcig0MDQpCi0gICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUoCi0gICAgICAgICcnLmpvaW4oWyc8aHRtbD48aGVhZD48dGl0bGU+NDA0OiBOb3QgRm91bmQ8L3RpdGxlPjwvaGVhZD4nLAotICAgICAgICAgICAgICAgICAnPGJvZHk+PGI+PGgyPkVycm9yIDQwNDwvaDI+PGJyLz4nLAotICAgICAgICAgICAgICAgICAnRmlsZSBub3QgZm91bmQ8L2I+PC9ib2R5PjwvaHRtbD4nXSkpCi0KLSAgZGVmIFN0b3JlSW5OZWdhdGl2ZUNhY2hlKHNlbGYsIGZpbGVuYW1lKToKLSAgICAiIiJJZiBhIG5vbi1leGlzdGFudCBVUkwgaXMgYWNjZXNzZWQsIGNhY2hlIHRoaXMgcmVzdWx0IGFzIHdlbGwuCi0KLSAgICBGdXR1cmUgd29yayBzaG91bGQgY29uc2lkZXIgc2V0dGluZyBhIG1heGltdW0gbmVnYXRpdmUgY2FjaGUgc2l6ZSB0bwotICAgIHByZXZlbnQgaXQgZnJvbSBmcm9tIG5lZ2F0aXZlbHkgaW1wYWN0aW5nIHRoZSByZWFsIGNhY2hlLgotCi0gICAgQXJnczoKLSAgICAgIGZpbGVuYW1lOiBVUkwgdG8gYWRkIG90IG5lZ2F0aXZlIGNhY2hlCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgIG1lbWNhY2hlLmFkZCgnJXMlcycgJSAoc2VsZi5ORUdfQ0FDSEVfUFJFRklYLCBmaWxlbmFtZSksIC0xKQotCi0gIGRlZiBHZXRGcm9tTmVnYXRpdmVDYWNoZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAgIiIiUmV0cmlldmUgZnJvbSBuZWdhdGl2ZSBjYWNoZS4KLQotICAgIEFyZ3M6Ci0gICAgICBmaWxlbmFtZTogVVJMIHRvIHJldHJlaXZlCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGZpbGUgY29udGVudHMgaWYgcHJlc2VudCBpbiB0aGUgbmVnYXRpdmUgY2FjaGUuCi0gICAgIiIiCi0gICAgcmV0dXJuIG1lbWNhY2hlLmdldCgnJXMlcycgJSAoc2VsZi5ORUdfQ0FDSEVfUFJFRklYLCBmaWxlbmFtZSkpCi0KLWRlZiBtYWluKCk6Ci0gIGFwcGxpY2F0aW9uID0gd2ViYXBwLldTR0lBcHBsaWNhdGlvbihbKCcvKFteL10rKS8oLiopJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtY2FjaGVkWmlwSGFuZGxlcildKQotICB1dGlsLnJ1bl93c2dpX2FwcChhcHBsaWNhdGlvbikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYnVpbGQuYWxpYXMudGVtcGxhdGUgYi90b29scy9zY3JpcHRzL2J1aWxkLmFsaWFzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDUxNDA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYnVpbGQuYWxpYXMudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotQUxJQVMgUFJPSkVDVFMgQVJFIENVUlJFTlQgTk9UIFNVUFBPUlRFRC4KLVRISVMgRklMRSBJUyBDVVJSRU5UTFkgQlJPS0VOIEFORCBTSE9VTEQgTk9UIEJFIFVTRUQuCi0tLT4KLTxwcm9qZWN0IG5hbWU9IlBST0pFQ1RfTkFNRSIgZGVmYXVsdD0icGFja2FnZSI+Ci0KLSAgICA8IS0tIFRoZSBidWlsZC5wcm9wZXJ0aWVzIGZpbGUgY2FuIGJlIGNyZWF0ZWQgYnkgeW91IGFuZCBpcyBuZXZlciB0b3VjaGVkCi0gICAgICAgICBieSBhY3Rpdml0eWNyZWF0b3IuIElmIHlvdSB3YW50IHRvIG1hbnVhbGx5IHNldCBwcm9wZXJ0aWVzLCB0aGlzIGlzCi0gICAgICAgICB0aGUgYmVzdCBwbGFjZSB0byBzZXQgdGhlbS4gLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8IS0tIFRoZSBkZWZhdWx0LnByb3BlcnRpZXMgZmlsZSBpcyBjcmVhdGVkIGFuZCB1cGRhdGVkIGJ5IGFjdGl2aXR5Y3JlYXRvci4KLSAgICAgICAgIEl0IHdpbGwgc2V0IGFueSBwcm9wZXJ0aWVzIG5vdCBhbHJlYWR5IGRlZmluZWQgYnkgYnVpbGQucHJvcGVydGllcy4gLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9ImRlZmF1bHQucHJvcGVydGllcyIgLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICA8IS0tIEltcG9ydCB0aGUgZGVmYXVsdCBBbmRyb2lkIGJ1aWxkIHJ1bGVzLgotICAgICAgICAgVGhpcyByZXF1aXJlcyBhbnQgMS42LjAgb3IgYWJvdmUuIC0tPgotCi0gICAgPGltcG9ydCBmaWxlPSIke3Nkay5kaXJ9L3Rvb2xzL2xpYi9hbGlhc19ydWxlcy54bWwiIC8+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvYnVpbGQudGVtcGxhdGUgYi90b29scy9zY3JpcHRzL2J1aWxkLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU5YzU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYnVpbGQudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iUFJPSkVDVF9OQU1FIiBkZWZhdWx0PSJoZWxwIj4KLQotICAgIDwhLS0gVGhlIGxvY2FsLnByb3BlcnRpZXMgZmlsZSBpcyBjcmVhdGVkIGFuZCB1cGRhdGVkIGJ5IHRoZSAnYW5kcm9pZCcgdG9vbC4KLSAgICAgICAgIEl0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSBTREsuIEl0IHNob3VsZCAqTk9UKiBiZSBjaGVja2VkIGluIGluIFZlcnNpb24KLSAgICAgICAgIENvbnRyb2wgU3lzdGVtcy4gLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9ImxvY2FsLnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8IS0tIFRoZSBidWlsZC5wcm9wZXJ0aWVzIGZpbGUgY2FuIGJlIGNyZWF0ZWQgYnkgeW91IGFuZCBpcyBuZXZlciB0b3VjaGVkCi0gICAgICAgICBieSB0aGUgJ2FuZHJvaWQnIHRvb2wuIFRoaXMgaXMgdGhlIHBsYWNlIHRvIGNoYW5nZSBzb21lIG9mIHRoZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcwotICAgICAgICAgdXNlZCBieSB0aGUgQW50IHJ1bGVzLgotICAgICAgICAgSGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UvdXBkYXRlOgotCi0gICAgICAgICBhcHBsaWNhdGlvbi5wYWNrYWdlCi0gICAgICAgICAgICAgdGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiBwYWNrYWdlIGFzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LiBVc2VkIGJ5IHRoZQotICAgICAgICAgICAgICd1bmluc3RhbGwnIHJ1bGUuCi0gICAgICAgICBzb3VyY2UuZGlyCi0gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkuIERlZmF1bHQgaXMgJ3NyYycuCi0gICAgICAgICBvdXQuZGlyCi0gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBkaXJlY3RvcnkuIERlZmF1bHQgaXMgJ2JpbicuCi0KLSAgICAgICAgIFByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgU0RLIGxvY2F0aW9uIG9yIHRoZSBwcm9qZWN0IHRhcmdldCBzaG91bGQgYmUgdXBkYXRlZAotICAgICAgICAgIHVzaW5nIHRoZSAnYW5kcm9pZCcgdG9vbCB3aXRoIHRoZSAndXBkYXRlJyBhY3Rpb24uCi0KLSAgICAgICAgIFRoaXMgZmlsZSBpcyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBidWlsZCBzeXN0ZW0gZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kCi0gICAgICAgICBzaG91bGQgYmUgY2hlY2tlZCBpbiBpbiBWZXJzaW9uIENvbnRyb2wgU3lzdGVtcy4KLQotICAgICAgICAgLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8IS0tIFRoZSBkZWZhdWx0LnByb3BlcnRpZXMgZmlsZSBpcyBjcmVhdGVkIGFuZCB1cGRhdGVkIGJ5IHRoZSAnYW5kcm9pZCcgdG9vbCwgYXMgd2VsbAotICAgICAgICAgYXMgQURULgotICAgICAgICAgVGhpcyBmaWxlIGlzIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGJ1aWxkIHN5c3RlbSBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQKLSAgICAgICAgIHNob3VsZCBiZSBjaGVja2VkIGluIGluIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zLiAtLT4KLSAgICA8cHJvcGVydHkgZmlsZT0iZGVmYXVsdC5wcm9wZXJ0aWVzIiAvPgotCi0gICAgPCEtLSBDdXN0b20gQW5kcm9pZCB0YXNrIHRvIGRlYWwgd2l0aCB0aGUgcHJvamVjdCB0YXJnZXQsIGFuZCBpbXBvcnQgdGhlIHByb3BlciBydWxlcy4KLSAgICAgICAgIFRoaXMgcmVxdWlyZXMgYW50IDEuNi4wIG9yIGFib3ZlLiAtLT4KLSAgICA8cGF0aCBpZD0iYW5kcm9pZC5hbnRsaWJzIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7c2RrLmRpcn0vdG9vbHMvbGliL2FudHRhc2tzLmphciIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7c2RrLmRpcn0vdG9vbHMvbGliL3Nka2xpYi5qYXIiIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Nkay5kaXJ9L3Rvb2xzL2xpYi9hbmRyb2lkcHJlZnMuamFyIiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtzZGsuZGlyfS90b29scy9saWIvYXBrYnVpbGRlci5qYXIiIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Nkay5kaXJ9L3Rvb2xzL2xpYi9qYXJ1dGlscy5qYXIiIC8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhc2tkZWYgbmFtZT0ic2V0dXAiCi0gICAgICAgIGNsYXNzbmFtZT0iY29tLmFuZHJvaWQuYW50LlNldHVwVGFzayIKLSAgICAgICAgY2xhc3NwYXRocmVmPSJhbmRyb2lkLmFudGxpYnMiIC8+Ci0KLSAgICA8IS0tIEV4ZWN1dGUgdGhlIEFuZHJvaWQgU2V0dXAgdGFzayB0aGF0IHdpbGwgc2V0dXAgc29tZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSB0YXJnZXQsCi0gICAgICAgICBhbmQgaW1wb3J0IHRoZSBidWlsZCBydWxlcyBmaWxlcy4KLQotICAgICAgICAgVGhlIHJ1bGVzIGZpbGUgaXMgaW1wb3J0ZWQgZnJvbQotICAgICAgICAgICAgPFNESz4vcGxhdGZvcm1zLzx0YXJnZXRfcGxhdGZvcm0+L3RlbXBsYXRlcy9hbmRyb2lkX3J1bGVzLnhtbAotCi0gICAgICAgICBUbyBjdXN0b21pemUgc29tZSBidWlsZCBzdGVwcyBmb3IgeW91ciBwcm9qZWN0OgotICAgICAgICAgLSBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBtYWluIG5vZGUgPHByb2plY3Q+IGZyb20gYW5kcm9pZF9ydWxlcy54bWwKLSAgICAgICAgIC0gcGFzdGUgaXQgaW4gdGhpcyBidWlsZC54bWwgYmVsb3cgdGhlIDxzZXR1cCAvPiB0YXNrLgotICAgICAgICAgLSBkaXNhYmxlIHRoZSBpbXBvcnQgYnkgY2hhbmdpbmcgdGhlIHNldHVwIHRhc2sgYmVsb3cgdG8gPHNldHVwIGltcG9ydD0iZmFsc2UiIC8+Ci0KLSAgICAgICAgIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcHJvcGVydGllcyBhcmUgc2V0dXAgY29ycmVjdGx5IGJ1dCB0aGF0IHlvdXIgY3VzdG9taXplZAotICAgICAgICAgYnVpbGQgc3RlcHMgYXJlIHVzZWQuCi0gICAgLS0+Ci0gICAgPHNldHVwIC8+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvY29tYmluZV9zZGtzLnNoIGIvdG9vbHMvc2NyaXB0cy9jb21iaW5lX3Nka3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViYWExYzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9jb21iaW5lX3Nka3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZnVuY3Rpb24gcmVwbGFjZSgpCi17Ci0gICAgICAgIGVjaG8gcmVwbGFjaW5nICQxCi0gICAgICAgIHJtICRWIC1yZiAiJFVOWklQUEVEX0JBU0VfRElSIi8kMQotICAgICAgICBjcCAkViAtcmYgIiRVTlpJUFBFRF9JTUFHRV9ESVIiLyQxICIkVU5aSVBQRURfQkFTRV9ESVIiLyQxCi19Ci0KLVY9IiIKLVE9Ii1xIgotaWYgWyAiJDEiID09ICItdiIgXTsgdGhlbgotICAgIFY9Ii12IgotICAgIFE9IiIKLSAgICBzaGlmdAotZmkKLQotTk9aSVA9IiIKLWlmIFsgIiQxIiA9PSAiLW5vemlwIiBdOyB0aGVuCi0gICAgTk9aSVA9IjEiCi0gICAgc2hpZnQKLWZpCi0KLUJBU0U9IiQxIgotSU1BR0VTPSIkMiIKLU9VVFBVVD0iJDMiCi0KLWlmIFtbIC16ICIkQkFTRSIgfHwgLXogIiRJTUFHRVMiIHx8IC16ICIkT1VUUFVUIiBdXSA7IHRoZW4KLSAgICBlY2hvICJ1c2FnZTogY29tYmluZV9zZGtzLnNoIFstdl0gWy1ub3ppcF0gQkFTRSBJTUFHRVMgT1VUUFVUIgotICAgIGVjaG8KLSAgICBlY2hvICIgIEJBU0UgYW5kIElNQUdFUyBzaG91bGQgYmUgc2RrIHppcCBmaWxlcy4gIFRoZSBzeXN0ZW0gaW1hZ2UgZmlsZXMsIgotICAgIGVjaG8gIiAgZW11bGF0b3IgYW5kIG90aGVyIHJ1bnRpbWUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgZnJvbSBJTUFHRVMgYW5kIgotICAgIGVjaG8gIiAgZXZlcnl0aGluZyBlbHNlIHdpbGwgYmUgY29waWVkIGZyb20gQkFTRS4gIEFsbCBvZiB0aGlzIHdpbGwgYmUiCi0gICAgZWNobyAiICBidW5kbGVkIGludG8gT1VUUFVUIGFuZCB6aXBwZWQgdXAgYWdhaW4gKHVubGVzcyAtbm96aXAgaXMgc3BlY2lmaWVkKS4iCi0gICAgZWNobwotICAgIGV4aXQgMQotZmkKLQotVE1QPSQobWt0ZW1wIC1kKQotCi1UTVBfWklQPXRtcC56aXAKLQotIyBkZXRlcm1pbmUgZXhlY3V0YWJsZSBleHRlbnNpb24KLWNhc2UgYHVuYW1lIC1zYCBpbgotICAgICpfTlQtKikgICMgZm9yIFdpbmRvd3MKLSAgICAgICAgRVhFPS5leGUKLSAgICAgICAgOzsKLSAgICAqKQotICAgICAgICBFWEU9Ci0gICAgICAgIDs7Ci1lc2FjCi0KLUJBU0VfRElSPSIkVE1QIi9iYXNlCi1JTUFHRVNfRElSPSIkVE1QIi9pbWFnZXMKLU9VVFBVVF9UTVBfWklQPSIkQkFTRV9ESVIvJFRNUF9aSVAiCi0KLXVuemlwICRRICIkQkFTRSIgICAtZCAiJEJBU0VfRElSIgotdW56aXAgJFEgIiRJTUFHRVMiIC1kICIkSU1BR0VTX0RJUiIKLQotVU5aSVBQRURfQkFTRV9ESVI9JChlY2hvICIkQkFTRV9ESVIiLyopCi1VTlpJUFBFRF9JTUFHRV9ESVI9JChlY2hvICIkSU1BR0VTX0RJUiIvKikKLQotIwotIyBUaGUgY29tbWFuZHMgdG8gY29weSBvdmVyIHRoZSBmaWxlcyB0aGF0IHdlIHdhbnQKLSMKLQotIyByZXBsYWNlIHRvb2xzL2VtdWxhdG9yICMgYXQgdGhpcyB0aW1lIHdlIGRvIG5vdCB3YW50IHRoZSBleGUgZnJvbSBTREsxLngKLXJlcGxhY2UgdG9vbHMvbGliL2ltYWdlcwotcmVwbGFjZSB0b29scy9saWIvcmVzCi1yZXBsYWNlIHRvb2xzL2xpYi9mb250cwotcmVwbGFjZSB0b29scy9saWIvbGF5b3V0bGliLmphcgotcmVwbGFjZSBkb2NzCi1yZXBsYWNlIGFuZHJvaWQuamFyCi0KLWZvciBpIGluIHdpZGdldHMgY2F0ZWdvcmllcyBicm9hZGNhc3RfYWN0aW9ucyBzZXJ2aWNlX2FjdGlvbnM7IGRvCi0gICAgcmVwbGFjZSB0b29scy9saWIvJGkudHh0Ci1kb25lCi0KLWlmIFsgLWQgIiRVTlpJUFBFRF9CQVNFX0RJUiIvdXNiX2RyaXZlciBdOyB0aGVuCi0gICAgcmVwbGFjZSB1c2JfZHJpdmVyCi1maQotCi0jCi0jIGVuZAotIwotCi1pZiBbIC16ICIkTk9aSVAiIF07IHRoZW4KLSAgICBwdXNoZCAiJEJBU0VfRElSIiAmPiAvZGV2L251bGwKLSAgICAgICAgIyByZW5hbWUgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGVhZiBtaW51cyB0aGUgLnppcCBvZiBPVVRQVVQKLSAgICAgICAgTEVBRj0kKGVjaG8gIiRPVVRQVVQiIHwgc2VkIC1lICJzOi4qXC56aXAvOjoiIHwgc2VkIC1lICJzOi56aXAkOjoiKQotICAgICAgICBtdiAqICIkTEVBRiIKLSAgICAgICAgIyB6aXAgaXQKLSAgICAgICAgemlwICRWIC1xciAiJFRNUF9aSVAiICIkTEVBRiIKLSAgICBwb3BkICY+IC9kZXYvbnVsbAotCi0gICAgY3AgJFYgIiRPVVRQVVRfVE1QX1pJUCIgIiRPVVRQVVQiCi0gICAgZWNobyAiQ29tYmluZWQgU0RLIGF2YWlsYWJsZSBhdCAkT1VUUFVUIgotZWxzZQotICAgIE9VVF9ESVI9IiR7T1VUUFVULy8uemlwL30iCi0gICAgbXYgJFYgIiRCQVNFX0RJUiIvKiAiJE9VVF9ESVIiCi0gICAgZWNobyAiVW56aXBwZWQgY29tYmluZWQgU0RLIGF2YWlsYWJsZSBhdCAkT1VUX0RJUiIKLWZpCi0KLXJtICRWIC1yZiAiJFRNUCIKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9kZXZpY2VzLnhtbCBiL3Rvb2xzL3NjcmlwdHMvZGV2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTBiODkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9kZXZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGQ6bGF5b3V0LWRldmljZXMKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL2xheW91dC1kZXZpY2VzLzEiPgotCi0gICAgPGQ6ZGV2aWNlIG5hbWU9IkFEUDEiPgotICAgICAgICA8ZDpkZWZhdWx0PgotICAgICAgICAgICAgPGQ6c2NyZWVuLXNpemU+bm9ybWFsPC9kOnNjcmVlbi1zaXplPgotICAgICAgICAgICAgPGQ6c2NyZWVuLXJhdGlvPm5vdGxvbmc8L2Q6c2NyZWVuLXJhdGlvPgotICAgICAgICAgICAgPGQ6c2NyZWVuLW9yaWVudGF0aW9uPnBvcnQ8L2Q6c2NyZWVuLW9yaWVudGF0aW9uPgotICAgICAgICAgICAgPGQ6cGl4ZWwtZGVuc2l0eT5tZHBpPC9kOnBpeGVsLWRlbnNpdHk+Ci0gICAgICAgICAgICA8ZDp0b3VjaC10eXBlPmZpbmdlcjwvZDp0b3VjaC10eXBlPgotICAgICAgICAgICAgPGQ6dGV4dC1pbnB1dC1tZXRob2Q+cXdlcnR5PC9kOnRleHQtaW5wdXQtbWV0aG9kPgotICAgICAgICAgICAgPGQ6bmF2LW1ldGhvZD50cmFja2JhbGw8L2Q6bmF2LW1ldGhvZD4KLSAgICAgICAgICAgIDxkOnNjcmVlbi1kaW1lbnNpb24+Ci0gICAgICAgICAgICAgICAgPGQ6c2l6ZT4zMjA8L2Q6c2l6ZT4KLSAgICAgICAgICAgICAgICA8ZDpzaXplPjQ4MDwvZDpzaXplPgotICAgICAgICAgICAgPC9kOnNjcmVlbi1kaW1lbnNpb24+Ci0gICAgICAgICAgICA8ZDp4ZHBpPjE4MC42PC9kOnhkcGk+Ci0gICAgICAgICAgICA8ZDp5ZHBpPjE4MjwvZDp5ZHBpPgotICAgICAgICA8L2Q6ZGVmYXVsdD4KLQotICAgICAgICA8ZDpjb25maWcgbmFtZT0iUG9ydHJhaXQiPgotICAgICAgICAgICAgPGQ6a2V5Ym9hcmQtc3RhdGU+a2V5c3NvZnQ8L2Q6a2V5Ym9hcmQtc3RhdGU+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+cG9ydDwvZDpzY3JlZW4tb3JpZW50YXRpb24+Ci0gICAgICAgIDwvZDpjb25maWc+Ci0gICAgICAgIDxkOmNvbmZpZyBuYW1lPSJMYW5kc2NhcGUsIGNsb3NlZCI+Ci0gICAgICAgICAgICA8ZDprZXlib2FyZC1zdGF0ZT5rZXlzc29mdDwvZDprZXlib2FyZC1zdGF0ZT4KLSAgICAgICAgICAgIDxkOnNjcmVlbi1vcmllbnRhdGlvbj5sYW5kPC9kOnNjcmVlbi1vcmllbnRhdGlvbj4KLSAgICAgICAgPC9kOmNvbmZpZz4KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9IkxhbmRzY2FwZSwgb3BlbiI+Ci0gICAgICAgICAgICA8ZDprZXlib2FyZC1zdGF0ZT5rZXlzZXhwb3NlZDwvZDprZXlib2FyZC1zdGF0ZT4KLSAgICAgICAgICAgIDxkOnNjcmVlbi1vcmllbnRhdGlvbj5sYW5kPC9kOnNjcmVlbi1vcmllbnRhdGlvbj4KLSAgICAgICAgPC9kOmNvbmZpZz4KLSAgICA8L2Q6ZGV2aWNlPgotCi0gICAgPGQ6ZGV2aWNlIG5hbWU9IklvbiI+Ci0gICAgICAgIDxkOmRlZmF1bHQ+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tc2l6ZT5ub3JtYWw8L2Q6c2NyZWVuLXNpemU+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tcmF0aW8+bm90bG9uZzwvZDpzY3JlZW4tcmF0aW8+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+cG9ydDwvZDpzY3JlZW4tb3JpZW50YXRpb24+Ci0gICAgICAgICAgICA8ZDpwaXhlbC1kZW5zaXR5Pm1kcGk8L2Q6cGl4ZWwtZGVuc2l0eT4KLSAgICAgICAgICAgIDxkOnRvdWNoLXR5cGU+ZmluZ2VyPC9kOnRvdWNoLXR5cGU+Ci0gICAgICAgICAgICA8ZDprZXlib2FyZC1zdGF0ZT5rZXlzc29mdDwvZDprZXlib2FyZC1zdGF0ZT4KLSAgICAgICAgICAgIDxkOnRleHQtaW5wdXQtbWV0aG9kPm5va2V5czwvZDp0ZXh0LWlucHV0LW1ldGhvZD4KLSAgICAgICAgICAgIDxkOm5hdi1tZXRob2Q+dHJhY2tiYWxsPC9kOm5hdi1tZXRob2Q+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tZGltZW5zaW9uPgotICAgICAgICAgICAgICAgIDxkOnNpemU+MzIwPC9kOnNpemU+Ci0gICAgICAgICAgICAgICAgPGQ6c2l6ZT40ODA8L2Q6c2l6ZT4KLSAgICAgICAgICAgIDwvZDpzY3JlZW4tZGltZW5zaW9uPgotICAgICAgICAgICAgPGQ6eGRwaT4xODAuNjwvZDp4ZHBpPgotICAgICAgICAgICAgPGQ6eWRwaT4xODI8L2Q6eWRwaT4KLSAgICAgICAgPC9kOmRlZmF1bHQ+Ci0KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9IlBvcnRyYWl0Ij4KLSAgICAgICAgICAgIDxkOnNjcmVlbi1vcmllbnRhdGlvbj5wb3J0PC9kOnNjcmVlbi1vcmllbnRhdGlvbj4KLSAgICAgICAgPC9kOmNvbmZpZz4KLSAgICAgICAgPGQ6Y29uZmlnIG5hbWU9IkxhbmRzY2FwZSI+Ci0gICAgICAgICAgICA8ZDpzY3JlZW4tb3JpZW50YXRpb24+bGFuZDwvZDpzY3JlZW4tb3JpZW50YXRpb24+Ci0gICAgICAgIDwvZDpjb25maWc+Ci0gICAgPC9kOmRldmljZT4KLTwvZDpsYXlvdXQtZGV2aWNlcz4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvZGl2aWRlX2FuZF9jb21wcmVzcy5weSBiL3Rvb2xzL3NjcmlwdHMvZGl2aWRlX2FuZF9jb21wcmVzcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmJjYjBhYi4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2RpdmlkZV9hbmRfY29tcHJlc3MucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24yLjQKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0iIiJNb2R1bGUgdG8gY29tcHJlc3MgZGlyZWN0b3JpZXMgaW4gdG8gc2VyaWVzIG9mIHppcCBmaWxlcy4KLQotVGhpcyBtb2R1bGUgd2lsbCB0YWtlIGEgZGlyZWN0b3J5IGFuZCBjb21wcmVzcyBhbGwgaXRzIGNvbnRlbnRzLCBpbmNsdWRpbmcKLWNoaWxkIGRpcmVjdG9yaWVzIGludG8gYSBzZXJpZXMgb2YgemlwIGZpbGVzIG5hbWVkIE4uemlwIHdoZXJlICdOJyByYW5nZXMgZnJvbQotMCB0byBpbmZpbml0eS4gVGhlIHppcCBmaWxlcyB3aWxsIGFsbCBiZSBiZWxvdyBhIGNlcnRhaW4gc3BlY2lmaWVkIG1heGltdW0KLXRocmVzaG9sZC4KLQotVGhlIGRpcmVjdG9yeSBpcyBjb21wcmVzc2VkIHdpdGggYSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGVhY2ggZGlyZWN0b3J5J3MKLWZpbGUgY29udGVudHMgYmVpbmcgY29tcHJlc3NlZCBhcyBpdCBpcyB2aXNpc3RlZCwgYmVmb3JlIHRoZSBjb21wcmVzc2lvbiBvZiBhbnkKLWNoaWxkIGRpcmVjdG9yeSdzIGNvbnRlbnRzLiBJbiB0aGlzIHdheSB0aGUgZmlsZXMgd2l0aGluIGFuIGFyY2hpdmUgYXJlIG9yZGVyZWQKLWFuZCB0aGUgYXJjaGl2ZXMgdGhlbXNlbHZlcyBhcmUgb3JkZXJlZC4KLQotVGhlIGNsYXNzIGFsc28gY29uc3RydWN0cyBhICdtYWluLnB5JyBmaWxlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBHb29nbGUgQXBwCi1FbmdpbmUgd2l0aCBhIGN1c3RvbSBBcHAgRW5naW5lIHByb2dyYW0gbm90IGN1cnJlbnRseSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLWNvZGUgYmFzZS4gVGhlIGN1c3RvbSBBcHAgRW5naW5lIHJ1bnRpbWUgY2FuIGxldmVyYWdlIHRoZSBpbmRleCBmaWxlcyB3cml0dGVuCi1vdXQgYnkgdGhpcyBjbGFzcyB0byBtb3JlIHF1aWNrbHkgbG9jYXRlIHdoaWNoIHppcCBmaWxlIHRvIHNlcnZlIGEgZ2l2ZW4gVVJMCi1mcm9tLgotIiIiCi0KLV9fYXV0aG9yX18gPSAnam1hdHRAZ29vZ2xlLmNvbSAoSnVzdGluIE1hdHRzb24pJwotCi1pbXBvcnQgb3B0cGFyc2UKLWltcG9ydCBvcwotaW1wb3J0IHN0YXQKLWltcG9ydCBzeXMKLWltcG9ydCB6aXBmaWxlCi1pbXBvcnQgZGl2aWRlX2FuZF9jb21wcmVzc19jb25zdGFudHMKLQotCi1kZWYgQ3JlYXRlT3B0aW9uc1BhcnNlcigpOgotICAiIiJDcmVhdGVzIHRoZSBwYXJzZXIgZm9yIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0KLSAgUmV0dXJuczoKLSAgICBBIGNvbmZpZ3VyZWQgb3B0cGFyc2UuT3B0aW9uUGFyc2VyIG9iamVjdC4KLSAgIiIiCi0gIHJ0biA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCi0gIHJ0bi5hZGRfb3B0aW9uKCctcycsICctLXNvdXJjZWZpbGVzJywgZGVzdD0nc291cmNlZmlsZXMnLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29tcHJlc3MnKQotICBydG4uYWRkX29wdGlvbignLWQnLCAnLS1kZXN0aW5hdGlvbicsIGRlc3Q9J2Rlc3RpbmF0aW9uJywgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgICBoZWxwPSgnV2hlcmUgdG8gcHV0IHRoZSBhcmNoaXZlIGZpbGVzLCB0aGlzIHNob3VsZCBub3QgYmUnCi0gICAgICAgICAgICAgICAgICAgICAgICcgYSBjaGlsZCBvZiB3aGVyZSB0aGUgc291cmNlIGZpbGVzIGV4aXN0LicpKQotICBydG4uYWRkX29wdGlvbignLWYnLCAnLS1maWxlc2l6ZScsIGRlc3Q9J2ZpbGVzaXplJywgZGVmYXVsdD0nMU0nLAotICAgICAgICAgICAgICAgICBoZWxwPSgnTWF4aW11bSBzaXplIG9mIGFyY2hpdmUgZmlsZXMuIEEgbnVtYmVyIGZvbGxvd2VkIGJ5ICcKLSAgICAgICAgICAgICAgICAgICAgICAgJ2EgbWFnbml0dWRlIGluZGljYXRvciBlaXRoZXIgIkIiLCAiSyIsICJNIiwgb3IgIkciLiAnCi0gICAgICAgICAgICAgICAgICAgICAgICdFeGFtcGxlczpcbiAgMTAwMDAwMEIgPT0gb25lIG1pbGxpb24gQllURVNcbicKLSAgICAgICAgICAgICAgICAgICAgICAgJyAgMS4yTSA9PSBvbmUgcG9pbnQgdHdvIE1FR0FCWVRFU1xuJwotICAgICAgICAgICAgICAgICAgICAgICAnICAxTSA9PSAxMDQ4NTc2IEJZVEVTJykpCi0gIHJ0bi5hZGRfb3B0aW9uKCctbicsICctLW5vY29tcHJlc3MnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVzdD0nY29tcHJlc3MnLAotICAgICAgICAgICAgICAgICBkZWZhdWx0PVRydWUsCi0gICAgICAgICAgICAgICAgIGhlbHA9KCdXaGV0aGVyIHRoZSBhcmNoaXZlIGZpbGVzIHNob3VsZCBiZSBjb21wcmVzc2VkLCBvciAnCi0gICAgICAgICAgICAgICAgICAgICAgICdqdXN0IGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc291cmNlIGZpbGVzJykpCi0gIHJldHVybiBydG4KLQotCi1kZWYgVmVyaWZ5QXJndW1lbnRzKG9wdGlvbnMsIHBhcnNlcik6Ci0gICIiIlJ1bnMgc2ltcGxlIGNoZWNrcyBvbiBjb3JyZWN0bmVzcyBvZiBjb21tYW5kbGluZSBhcmd1bWVudHMuCi0KLSAgQXJnczoKLSAgICBvcHRpb25zOiBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgcGFzc2VkLgotICAgIHBhcnNlcjogVGhlIHBhcnNlciBvYmplY3QgdXNlZCB0byBwYXJzZSB0aGUgY29tbWFuZCBzdHJpbmcuCi0gICIiIgotICB0cnk6Ci0gICAgaWYgb3B0aW9ucy5zb3VyY2VmaWxlcyBpcyBOb25lIG9yIG9wdGlvbnMuZGVzdGluYXRpb24gaXMgTm9uZToKLSAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKLSAgICAgIHN5cy5leGl0KC0xKQotICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgcGFyc2VyLnByaW50X2hlbHAoKQotICAgIHN5cy5leGl0KC0xKQotCi0KLWRlZiBQYXJzZVNpemUoc2l6ZV9zdHIpOgotICAiIiJQYXJzZSB0aGUgZmlsZSBzaXplIGFyZ3VtZW50IGZyb20gYSBzdHJpbmcgdG8gYSBudW1iZXIgb2YgYnl0ZXMuCi0KLSAgQXJnczoKLSAgICBzaXplX3N0cjogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlsZSBzaXplLgotCi0gIFJldHVybnM6Ci0gICAgVGhlIGZpbGUgc2l6ZSBpbiBieXRlcy4KLQotICBSYWlzZXM6Ci0gICAgVmFsdWVFcnJvcjogUmFpc2VzIGFuIGVycm9yIGlmIHRoZSBudW1lcmljIG9yIHF1YWxpZmllciBwb3J0aW9ucyBvZiB0aGUKLSAgICAgIGZpbGUgc2l6ZSBhcmd1bWVudCBpcyBpbnZhbGlkLgotICAiIiIKLSAgaWYgbGVuKHNpemVfc3RyKSA8IDI6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcigoJ2ZpbGVzaXplIGFyZ3VtZW50IG5vdCB1bmRlcnN0b29kLCBwbGVhc2UgaW5jbHVkZScKLSAgICAgICAgICAgICAgICAgICAgICAnIGEgbnVtZXJpYyB2YWx1ZSBhbmQgbWFnbml0dWRlIGluZGljYXRvcicpKQotICBtYWduaXR1ZGUgPSBzaXplX3N0clstMV0KLSAgaWYgbm90IG1hZ25pdHVkZSBpbiAoJ0InLCAnSycsICdNJywgJ0cnKToKLSAgICByYWlzZSBWYWx1ZUVycm9yKCgnZmlsZXNpemUgbWFnbml0dWRlIGluZGljYXRvciBub3QgdmFsaWQsIG11c3QgYmUgIkIiLCcKLSAgICAgICAgICAgICAgICAgICAgICAnIksiLCJNIiwgb3IgIkciJykpCi0gIG51bWVyYWwgPSBmbG9hdChzaXplX3N0cls6LTFdKQotICBpZiBtYWduaXR1ZGUgPT0gJ0snOgotICAgIG51bWVyYWwgKj0gMTAyNAotICBlbGlmIG1hZ25pdHVkZSA9PSAnTSc6Ci0gICAgbnVtZXJhbCAqPSAxMDQ4NTc2Ci0gIGVsaWYgbWFnbml0dWRlID09ICdHJzoKLSAgICBudW1lcmFsICo9IDEwNzM3NDE4MjQKLSAgcmV0dXJuIGludChudW1lcmFsKQotCi0KLWNsYXNzIERpcmVjdG9yeVppcHBlcihvYmplY3QpOgotICAiIiJDbGFzcyB0byBjb21wcmVzcyBhIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBzdWItZGlyZWN0b3JpZXMuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG91dHB1dF9wYXRoLCBiYXNlX2RpciwgYXJjaGl2ZV9zaXplLCBlbmFibGVfY29tcHJlc3Npb24pOgotICAgICIiIkRpcmVjdG9yeVppcHBlciBjb25zdHJ1Y3Rvci4KLQotICAgIEFyZ3M6Ci0gICAgICBvdXRwdXRfcGF0aDogQSBzdHJpbmcsIHRoZSBwYXRoIHRvIHdyaXRlIHRoZSBhcmNoaXZlcyBhbmQgaW5kZXggZmlsZSB0by4KLSAgICAgIGJhc2VfZGlyOiBBIHN0cmluZywgdGhlIGRpcmVjdG9yeSB0byBjb21wcmVzcy4KLSAgICAgIGFyY2hpdmVfc2l6ZTogQW4gbnVtYmVyLCB0aGUgbWF4aW11bSBzaXplLCBpbiBieXRlcywgb2YgYSBzaW5nbGUKLSAgICAgICAgYXJjaGl2ZSBmaWxlLgotICAgICAgZW5hYmxlX2NvbXByZXNzaW9uOiBBIGJvb2xlYW4sIHdoZXRoZXIgb3Igbm90IGNvbXByZXNzaW9uIHNob3VsZCBiZQotICAgICAgICBlbmFibGVkLCBpZiBkaXNhYmxlZCwgdGhlIGZpbGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvIGFuIHVuY29tcHJlc2VkCi0gICAgICAgIHppcC4KLSAgICAiIiIKLSAgICBzZWxmLm91dHB1dF9kaXIgPSBvdXRwdXRfcGF0aAotICAgIHNlbGYuY3VycmVudF9hcmNoaXZlID0gJzAuemlwJwotICAgIHNlbGYuYmFzZV9wYXRoID0gYmFzZV9kaXIKLSAgICBzZWxmLm1heF9zaXplID0gYXJjaGl2ZV9zaXplCi0gICAgc2VsZi5jb21wcmVzcyA9IGVuYWJsZV9jb21wcmVzc2lvbgotCi0gICAgIyBTZXQgaW5kZXhfZnAgdG8gTm9uZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgaXQgd2lsbCBiZSB5ZXQuCi0gICAgc2VsZi5pbmRleF9mcCA9IE5vbmUKLQotICBkZWYgU3RhcnRDb21wcmVzcyhzZWxmKToKLSAgICAiIiJTdGFydCBjb21wcmVzcyBvZiB0aGUgZGlyZWN0b3J5LgotCi0gICAgVGhpcyB3aWxsIHN0YXJ0IHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzIGFuZCB3cml0ZSB0aGUgYXJjaGl2ZXMgdG8gdGhlCi0gICAgc3BlY2lmaWVkIG91dHB1dCBkaXJlY3RvcnkuIEl0IHdpbGwgYWxzbyBwcm9kdWNlIGFuICdpbmRleC50eHQnIGZpbGUgaW4gdGhlCi0gICAgb3V0cHV0IGRpcmVjdG9yeSB0aGF0IG1hcHMgZnJvbSBmaWxlIHRvIGFyY2hpdmUuCi0gICAgIiIiCi0gICAgc2VsZi5pbmRleF9mcCA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ21haW4ucHknKSwgJ3cnKQotICAgIHNlbGYuaW5kZXhfZnAud3JpdGUoZGl2aWRlX2FuZF9jb21wcmVzc19jb25zdGFudHMuZmlsZV9wcmVhbWJsZSkKLSAgICBvcy5wYXRoLndhbGsoc2VsZi5iYXNlX3BhdGgsIHNlbGYuQ29tcHJlc3NEaXJlY3RvcnksIDEpCi0gICAgc2VsZi5pbmRleF9mcC53cml0ZShkaXZpZGVfYW5kX2NvbXByZXNzX2NvbnN0YW50cy5maWxlX2VuZHBpZWNlKQotICAgIHNlbGYuaW5kZXhfZnAuY2xvc2UoKQotCi0gIGRlZiBSZW1vdmVMYXN0RmlsZShzZWxmLCBhcmNoaXZlX3BhdGg9Tm9uZSk6Ci0gICAgIiIiUmVtb3ZlcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcmNoaXZlLgotCi0gICAgVGhpcyByZW1vdmVzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFyY2hpdmUgYnkgcmVhZGluZyB0aGUgaXRlbXMgb3V0IG9mIHRoZQotICAgIGFyY2hpdmUsIGFkZGluZyB0aGVtIHRvIGEgbmV3IGFyY2hpdmUsIGRlbGV0aW5nIHRoZSBvbGQgYXJjaGl2ZSwgYW5kCi0gICAgbW92aW5nIHRoZSBuZXcgYXJjaGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIG9sZCBhcmNoaXZlLgotCi0gICAgQXJnczoKLSAgICAgIGFyY2hpdmVfcGF0aDogUGF0aCB0byB0aGUgYXJjaGl2ZSB0byBtb2RpZnkuIFRoaXMgYXJjaGl2ZSBzaG91bGQgbm90IGJlCi0gICAgICAgIG9wZW4gZWxzZXdoZXJlLCBzaW5jZSBpdCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIG5ldyBaaXBGaWxlIG9iamVjdCB0aGF0IHBvaW50cyB0byB0aGUgbW9kaWZpZWQgYXJjaGl2ZSBmaWxlLgotICAgICIiIgotICAgIGlmIGFyY2hpdmVfcGF0aCBpcyBOb25lOgotICAgICAgYXJjaGl2ZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpciwgc2VsZi5jdXJyZW50X2FyY2hpdmUpCi0KLSAgICAjIE1vdmUgdGhlIG9sZCBmaWxlIGFuZCBjcmVhdGUgYSBuZXcgb25lIGF0IGl0cyBvbGQgbG9jYXRpb24uCi0gICAgcm9vdCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChhcmNoaXZlX3BhdGgpCi0gICAgb2xkX2FyY2hpdmUgPSAnJy5qb2luKFtyb290LCAnLW9sZCcsIGV4dF0pCi0gICAgb3MucmVuYW1lKGFyY2hpdmVfcGF0aCwgb2xkX2FyY2hpdmUpCi0gICAgb2xkX2ZwID0gc2VsZi5PcGVuWmlwRmlsZUF0UGF0aChvbGRfYXJjaGl2ZSwgbW9kZT0ncicpCi0KLSAgICAjIEJ5IGRlZmF1bHQsIHN0b3JlIHVuY29tcHJlc3NlZC4KLSAgICBjb21wcmVzc19iaXQgPSB6aXBmaWxlLlpJUF9TVE9SRUQKLSAgICBpZiBzZWxmLmNvbXByZXNzOgotICAgICAgY29tcHJlc3NfYml0ID0gemlwZmlsZS5aSVBfREVGTEFURUQKLSAgICBuZXdfZnAgPSBzZWxmLk9wZW5aaXBGaWxlQXRQYXRoKGFyY2hpdmVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9J3cnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3M9Y29tcHJlc3NfYml0KQotCi0gICAgIyBSZWFkIHRoZSBvbGQgYXJjaGl2ZSBpbiBhIG5ldyBhcmNoaXZlLCBleGNlcHQgdGhlIGxhc3Qgb25lLgotICAgIGZvciB6aXBfbWVtYmVyIGluIG9sZF9mcC5pbmZvbGlzdCgpWzotMV06Ci0gICAgICBuZXdfZnAud3JpdGVzdHIoemlwX21lbWJlciwgb2xkX2ZwLnJlYWQoemlwX21lbWJlci5maWxlbmFtZSkpCi0KLSAgICAjIENsb3NlIGZpbGVzIGFuZCBkZWxldGUgdGhlIG9sZCBvbmUuCi0gICAgb2xkX2ZwLmNsb3NlKCkKLSAgICBuZXdfZnAuY2xvc2UoKQotICAgIG9zLnVubGluayhvbGRfYXJjaGl2ZSkKLQotICBkZWYgT3BlblppcEZpbGVBdFBhdGgoc2VsZiwgcGF0aCwgbW9kZT1Ob25lLCBjb21wcmVzcz16aXBmaWxlLlpJUF9ERUZMQVRFRCk6Ci0gICAgIiIiVGhpcyBtZXRob2QgaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBlZyBkZXBlbmRlbmN5IGluamVjdGlvbi4iIiIKLSAgICBpZiBtb2RlIGlzIE5vbmU6Ci0gICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgbW9kZSA9ICdhJwotICAgICAgZWxzZToKLSAgICAgICAgbW9kZSA9ICd3JwotCi0gICAgaWYgbW9kZSA9PSAncic6Ci0gICAgICByZXR1cm4gemlwZmlsZS5aaXBGaWxlKHBhdGgsIG1vZGUpCi0gICAgZWxzZToKLSAgICAgIHJldHVybiB6aXBmaWxlLlppcEZpbGUocGF0aCwgbW9kZSwgY29tcHJlc3MpCi0KLSAgZGVmIENvbXByZXNzRGlyZWN0b3J5KHNlbGYsIHVudXNlZF9pZCwgZGlyX3BhdGgsIGRpcl9jb250ZW50cyk6Ci0gICAgIiIiTWV0aG9kIHRvIGNvbXByZXNzIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0KLSAgICBUaGlzIG1ldGhvZCBjb21wcmVzc2VzIHRoZSBkaXJlY3RvcnkgJ2Rpcl9wYXRoJy4gSXQgd2lsbCBhZGQgdG8gYW4gZXhpc3RpbmcKLSAgICB6aXAgZmlsZSB0aGF0IHN0aWxsIGhhcyBzcGFjZSBhbmQgY3JlYXRlIG5ldyBvbmVzIGFzIG5lY2Vzc2FyeSB0byBrZWVwIHppcAotICAgIGZpbGUgc2l6ZXMgdW5kZXIgdGhlIG1heGltdW0gc3BlY2lmaWVkIHNpemUuIFRoaXMgYWxzbyB3cml0ZXMgb3V0IHRoZQotICAgIG1hcHBpbmcgb2YgZmlsZXMgdG8gYXJjaGl2ZXMgdG8gdGhlIHNlbGYuaW5kZXhfZnAgZmlsZSBkZXNjcmlwdG9yCi0KLSAgICBBcmdzOgotICAgICAgdW51c2VkX2lkOiBBIG51bWVyaWMgaWRlbnRpZmllciBwYXNzZWQgYnkgdGhlIG9zLnBhdGgud2FsayBtZXRob2QsIHRoaXMKLSAgICAgICAgaXMgbm90IHVzZWQgYnkgdGhpcyBtZXRob2QuCi0gICAgICBkaXJfcGF0aDogQSBzdHJpbmcsIHRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gY29tcHJlc3MuCi0gICAgICBkaXJfY29udGVudHM6IEEgbGlzdCBvZiBkaXJlY3RvcnkgY29udGVudHMgdG8gYmUgY29tcHJlc3NlZC4KLSAgICAiIiIKLSAgICAjIENvbnN0cnVjdCB0aGUgcXVldWUgb2YgZmlsZXMgdG8gYmUgYWRkZWQgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIHVzZQotICAgICMgaXQgc2VlbXMgdGhhdCBkaXJfY29udGVudHMgaXMgZ2l2ZW4gaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIsCi0gICAgIyBzbyBwdXQgdGhlbSBpbiBhbHBoYWJldGljYWwgb3JkZXIgYnkgaW5zZXJ0aW5nIHRvIGZyb250IG9mIHRoZSBsaXN0LgotICAgIGRpcl9jb250ZW50cy5zb3J0KCkKLSAgICB6aXBfcXVldWUgPSBbXQotICAgIGZvciBmaWxlbmFtZSBpbiBkaXJfY29udGVudHM6Ci0gICAgICB6aXBfcXVldWUuYXBwZW5kKG9zLnBhdGguam9pbihkaXJfcGF0aCwgZmlsZW5hbWUpKQotICAgIGNvbXByZXNzX2JpdCA9IHppcGZpbGUuWklQX0RFRkxBVEVECi0gICAgaWYgbm90IHNlbGYuY29tcHJlc3M6Ci0gICAgICBjb21wcmVzc19iaXQgPSB6aXBmaWxlLlpJUF9TVE9SRUQKLQotICAgICMgWmlwIGFsbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSwgYWRkaW5nIHRvIGV4aXN0aW5nIGFyY2hpdmVzIGFuZCBjcmVhdGluZwotICAgICMgYXMgbmVjZXNzYXJ5LgotICAgIHdoaWxlIHppcF9xdWV1ZToKLSAgICAgIHRhcmdldF9maWxlID0gemlwX3F1ZXVlWzBdCi0gICAgICBpZiBvcy5wYXRoLmlzZmlsZSh0YXJnZXRfZmlsZSk6Ci0gICAgICAgIHNlbGYuQWRkRmlsZVRvQXJjaGl2ZSh0YXJnZXRfZmlsZSwgY29tcHJlc3NfYml0KQotCi0gICAgICAgICMgU2VlIGlmIGFkZGluZyB0aGUgbmV3IGZpbGUgbWFkZSBvdXIgYXJjaGl2ZSB0b28gbGFyZ2UuCi0gICAgICAgIGlmIG5vdCBzZWxmLkFyY2hpdmVJc1ZhbGlkKCk6Ci0KLSAgICAgICAgICAjIElGIGZpeGluZyBmYWlscywgdGhlIGxhc3QgYWRkZWQgZmlsZSB3YXMgdG8gbGFyZ2UsIHNraXAgaXQKLSAgICAgICAgICAjIEVMU0UgdGhlIGN1cnJlbnQgYXJjaGl2ZSBmaWxsZWQgbm9ybWFsbHksIG1ha2UgYSBuZXcgb25lIGFuZCB0cnkKLSAgICAgICAgICAjICBhZGRpbmcgdGhlIGZpbGUgYWdhaW4uCi0gICAgICAgICAgaWYgbm90IHNlbGYuRml4QXJjaGl2ZSgnU0laRScpOgotICAgICAgICAgICAgemlwX3F1ZXVlLnBvcCgwKQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmN1cnJlbnRfYXJjaGl2ZSA9ICclaS56aXAnICUgKAotICAgICAgICAgICAgICAgIGludChzZWxmLmN1cnJlbnRfYXJjaGl2ZVsKLSAgICAgICAgICAgICAgICAgICAgMDpzZWxmLmN1cnJlbnRfYXJjaGl2ZS5yZmluZCgnLnppcCcpXSkgKyAxKQotICAgICAgICBlbHNlOgotCi0gICAgICAgICAgIyBXcml0ZSBhbiBpbmRleCByZWNvcmQgaWYgbmVjZXNzYXJ5LgotICAgICAgICAgIHNlbGYuV3JpdGVJbmRleFJlY29yZCgpCi0gICAgICAgICAgemlwX3F1ZXVlLnBvcCgwKQotICAgICAgZWxzZToKLSAgICAgICAgemlwX3F1ZXVlLnBvcCgwKQotCi0gIGRlZiBXcml0ZUluZGV4UmVjb3JkKHNlbGYpOgotICAgICIiIldyaXRlIGFuIGluZGV4IHJlY29yZCB0byB0aGUgaW5kZXggZmlsZS4KLQotICAgIE9ubHkgd3JpdGUgYW4gaW5kZXggcmVjb3JkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGZpbGUgdG8gZ28gaW50byBhcmNoaXZlCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiBhbiBhcmNoaXZlIHJlY29yZCBpcyB3cml0dGVuLCBGYWxzZSBpZiBpdCBpc24ndC4KLSAgICAiIiIKLSAgICBhcmNoaXZlID0gc2VsZi5PcGVuWmlwRmlsZUF0UGF0aCgKLSAgICAgICAgb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpciwgc2VsZi5jdXJyZW50X2FyY2hpdmUpLCAncicpCi0gICAgYXJjaGl2ZV9pbmRleCA9IGFyY2hpdmUuaW5mb2xpc3QoKQotICAgIGlmIGxlbihhcmNoaXZlX2luZGV4KSA9PSAxOgotICAgICAgc2VsZi5pbmRleF9mcC53cml0ZSgKLSAgICAgICAgICAnW1wnJXNcJywgXCclc1wnXSxcbicgJSAoc2VsZi5jdXJyZW50X2FyY2hpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfaW5kZXhbMF0uZmlsZW5hbWUpKQotICAgICAgYXJjaGl2ZS5jbG9zZSgpCi0gICAgICByZXR1cm4gVHJ1ZQotICAgIGVsc2U6Ci0gICAgICBhcmNoaXZlLmNsb3NlKCkKLSAgICAgIHJldHVybiBGYWxzZQotCi0gIGRlZiBGaXhBcmNoaXZlKHNlbGYsIHByb2JsZW0pOgotICAgICIiIk1ha2UgdGhlIGFyY2hpdmUgY29tcGxpYW50LgotCi0gICAgQXJnczoKLSAgICAgIHByb2JsZW06IEFuIGVudW0sIHRoZSByZWFzb24gdGhlIGFyY2hpdmUgaXMgaW52YWxpZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBXaGV0aGVyIHRoZSBmaWxlKHMpIHJlbW92ZWQgdG8gZml4IHRoZSBhcmNoaXZlIGNvdWxkIGNvbmNlaXZhYmx5IGJlCi0gICAgICBpbiBhbiBhcmNoaXZlLCBidXQgZm9yIHNvbWUgcmVhc29uIGNhbid0IGJlIGFkZGVkIHRvIHRoaXMgb25lLgotICAgICIiIgotICAgIGFyY2hpdmVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsIHNlbGYuY3VycmVudF9hcmNoaXZlKQotICAgIHJldHVybl92YWx1ZSA9IE5vbmUKLQotICAgIGlmIHByb2JsZW0gPT0gJ1NJWkUnOgotICAgICAgYXJjaGl2ZV9vYmogPSBzZWxmLk9wZW5aaXBGaWxlQXRQYXRoKGFyY2hpdmVfcGF0aCwgbW9kZT0ncicpCi0gICAgICBudW1fYXJjaGl2ZV9maWxlcyA9IGxlbihhcmNoaXZlX29iai5pbmZvbGlzdCgpKQotCi0gICAgICAjIElGIHRoZXJlIGlzIGEgc2luZ2xlIGZpbGUsIHRoYXQgbWVhbnMgaXRzIHRvbyBsYXJnZSB0byBjb21wcmVzcywKLSAgICAgICMgZGVsZXRlIHRoZSBjcmVhdGVkIGFyY2hpdmUKLSAgICAgICMgRUxTRSBkbyBub3JtYWwgZmluYWxpemF0aW9uLgotICAgICAgaWYgbnVtX2FyY2hpdmVfZmlsZXMgPT0gMToKLSAgICAgICAgcHJpbnQgKCdXQVJOSU5HOiAlcyVzIGlzIHRvbyBsYXJnZSB0byBzdG9yZS4nICUgKAotICAgICAgICAgICAgc2VsZi5iYXNlX3BhdGgsIGFyY2hpdmVfb2JqLmluZm9saXN0KClbMF0uZmlsZW5hbWUpKQotICAgICAgICBhcmNoaXZlX29iai5jbG9zZSgpCi0gICAgICAgIG9zLnVubGluayhhcmNoaXZlX3BhdGgpCi0gICAgICAgIHJldHVybl92YWx1ZSA9IEZhbHNlCi0gICAgICBlbHNlOgotICAgICAgICBhcmNoaXZlX29iai5jbG9zZSgpCi0gICAgICAgIHNlbGYuUmVtb3ZlTGFzdEZpbGUoCi0gICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpciwgc2VsZi5jdXJyZW50X2FyY2hpdmUpKQotICAgICAgICBwcmludCAnRmluYWwgYXJjaGl2ZSBzaXplIGZvciAlcyBpcyAlaScgJSAoCi0gICAgICAgICAgICBzZWxmLmN1cnJlbnRfYXJjaGl2ZSwgb3MucGF0aC5nZXRzaXplKGFyY2hpdmVfcGF0aCkpCi0gICAgICAgIHJldHVybl92YWx1ZSA9IFRydWUKLSAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCi0KLSAgZGVmIEFkZEZpbGVUb0FyY2hpdmUoc2VsZiwgZmlsZXBhdGgsIGNvbXByZXNzX2JpdCk6Ci0gICAgIiIiQWRkIHRoZSBmaWxlIGF0IGZpbGVwYXRoIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZXBhdGg6IEEgc3RyaW5nLCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byBhZGQuCi0gICAgICBjb21wcmVzc19iaXQ6IEEgYm9vbGVhbiwgd2hldGhlciBvciBub3QgdGhpcyBmaWxlIHNob3VsZCBiZSBjb21wcmVzc2VkCi0gICAgICAgIHdoZW4gYWRkZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiB0aGUgZmlsZSBjb3VsZCBiZSBhZGRlZCAodHlwaWNhbGx5IGJlY2F1c2UgdGhpcyBpcyBhIGZpbGUpIG9yCi0gICAgICBGYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBhZGRlZCAodHlwaWNhbGx5IGJlY2F1c2UgaXRzIGEgZGlyZWN0b3J5KS4KLSAgICAiIiIKLSAgICBjdXJyX2FyY2hpdmVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsIHNlbGYuY3VycmVudF9hcmNoaXZlKQotICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGZpbGVwYXRoKToKLSAgICAgIGlmIG9zLnBhdGguZ2V0c2l6ZShmaWxlcGF0aCkgPiAxMDQ4NTc2OgotICAgICAgICBwcmludCAnV2FybmluZzogJXMgaXMgcG90ZW50aWFsbHkgdG9vIGxhcmdlIHRvIHNlcnZlIG9uIEdBRScgJSBmaWxlcGF0aAotICAgICAgYXJjaGl2ZSA9IHNlbGYuT3BlblppcEZpbGVBdFBhdGgoY3Vycl9hcmNoaXZlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzcz1jb21wcmVzc19iaXQpCi0gICAgICAjIEFkZCB0aGUgZmlsZSB0byB0aGUgYXJjaGl2ZS4KLSAgICAgIGFyY2hpdmUud3JpdGUoZmlsZXBhdGgsIGZpbGVwYXRoW2xlbihzZWxmLmJhc2VfcGF0aCk6XSkKLSAgICAgIGFyY2hpdmUuY2xvc2UoKQotICAgICAgcmV0dXJuIFRydWUKLSAgICBlbHNlOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIEFyY2hpdmVJc1ZhbGlkKHNlbGYpOgotICAgICIiIkNoZWNrIHdoZXRoZXIgdGhlIGFyY2hpdmUgaXMgdmFsaWQuCi0KLSAgICBDdXJyZW50bHkgdGhpcyBvbmx5IGNoZWNrcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVuZGVyIHRoZSByZXF1aXJlZCBzaXplLgotICAgIFRoZSB0aG91Z2h0IGlzIHRoYXQgZXZlbnR1YWxseSB0aGlzIHdpbGwgZG8gYWRkaXRpb25hbCB2YWxpZGF0aW9uCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiB0aGUgYXJjaGl2ZSBpcyB2YWxpZCwgRmFsc2UgaWYgaXRzIG5vdC4KLSAgICAiIiIKLSAgICBhcmNoaXZlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCBzZWxmLmN1cnJlbnRfYXJjaGl2ZSkKLSAgICByZXR1cm4gb3MucGF0aC5nZXRzaXplKGFyY2hpdmVfcGF0aCkgPD0gc2VsZi5tYXhfc2l6ZQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICBwYXJzZXIgPSBDcmVhdGVPcHRpb25zUGFyc2VyKCkKLSAgKG9wdGlvbnMsIHVudXNlZF9hcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJndlsxOl0pCi0gIFZlcmlmeUFyZ3VtZW50cyhvcHRpb25zLCBwYXJzZXIpCi0gIHppcHBlciA9IERpcmVjdG9yeVppcHBlcihvcHRpb25zLmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2VmaWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlU2l6ZShvcHRpb25zLmZpbGVzaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29tcHJlc3MpCi0gIHppcHBlci5TdGFydENvbXByZXNzKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9kaXZpZGVfYW5kX2NvbXByZXNzX2NvbnN0YW50cy5weSBiL3Rvb2xzL3NjcmlwdHMvZGl2aWRlX2FuZF9jb21wcmVzc19jb25zdGFudHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTYyYjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9kaXZpZGVfYW5kX2NvbXByZXNzX2NvbnN0YW50cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uMi40Ci0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIiIiQ29uc3RhbnRzIGZvciB0aGUgZGl2aWRlX2FuZF9jb21wcmVzcyBzY3JpcHQgYW5kIERpcmVjdG9yeVppcHBlciBjbGFzcy4iIiIKLQotX19hdXRob3JfXyA9ICdqbWF0dEBnb29nbGUuY29tIChKdXN0aW4gTWF0dHNvbiknCi0KLWZpbGVfcHJlYW1ibGUgPSAiIiIjIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pbXBvcnQgd3NnaXJlZi5oYW5kbGVyc1xuJwotZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgemlwc2VydmVcbicKLWZyb20gZ29vZ2xlLmFwcGVuZ2luZS5leHQgaW1wb3J0IHdlYmFwcFxuJwotaW1wb3J0IG1lbWNhY2hlX3ppcHNlcnZlXG5cblxuJwotY2xhc3MgTWFpbkhhbmRsZXIod2ViYXBwLlJlcXVlc3RIYW5kbGVyKToKLQotICBkZWYgZ2V0KHNlbGYpOgotICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKCdIZWxsbyB3b3JsZCEnKQotCi1kZWYgbWFpbigpOgotICBhcHBsaWNhdGlvbiA9IHdlYmFwcC5XU0dJQXBwbGljYXRpb24oWycvKC4qKScsCi0gICAgbWVtY2FjaGVfemlwc2VydmUuY3JlYXRlX2hhbmRsZXIoWyIiIgotCi1maWxlX2VuZHBpZWNlID0gIiIiXSkpLAotXSwKLWRlYnVnPUZhbHNlKQotICB3c2dpcmVmLmhhbmRsZXJzLkNHSUhhbmRsZXIoKS5ydW4oYXBwbGljYXRpb24pCi0KLWlmIF9fbmFtZV9fID09IF9fbWFpbl9fOgotICBtYWluKCkiIiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvZGl2aWRlX2FuZF9jb21wcmVzc190ZXN0LnB5IGIvdG9vbHMvc2NyaXB0cy9kaXZpZGVfYW5kX2NvbXByZXNzX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNjQ0OWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9kaXZpZGVfYW5kX2NvbXByZXNzX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24yLjQKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0iIiJUZXN0cyBmb3IgZGl2aWRlX2FuZF9jb21wcmVzcy5weS4KLQotVE9ETyhqbWF0dCk6IEFkZCB0ZXN0cyBmb3IgbW9kdWxlIG1ldGhvZHMuCi0iIiIKLQotX19hdXRob3JfXyA9ICdqbWF0dEBnb29nbGUuY29tIChKdXN0aW4gTWF0dHNvbiknCi0KLWltcG9ydCBvcwotaW1wb3J0IHN0YXQKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHppcGZpbGUKLQotaW1wb3J0IGRpdmlkZV9hbmRfY29tcHJlc3MKLWltcG9ydCBtb3gKLQotCi1jbGFzcyBCYWdPZlBhcnRzKG9iamVjdCk6Ci0gICIiIkp1c3QgYSBnZW5lcmljIGNsYXNzIHRoYXQgSSBjYW4gdXNlIHRvIGFzc2lnbiByYW5kb20gYXR0cmlidXRlcyB0by4iIiIKLQotICBkZWYgTm9PcChzZWxmKToKLSAgICB4ID0gMQotCi0gICAgCi1jbGFzcyBWYWxpZEFuZFJlbW92ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiVGVzdCB0aGUgQXJjaGl2ZUlzVmFsaWQgYW5kIFJlbW92ZUxhc3RGaWxlIG1ldGhvZHMuIiIiCi0gIAotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgIiIiUHJlcGFyZSB0aGUgdGVzdC4KLQotICAgIENvbnN0cnVjdCBzb21lIG1vY2sgb2JqZWN0cyBmb3IgdXNlIHdpdGggdGhlIHRlc3RzLgotICAgICIiIgotICAgIHNlbGYubXlfbW94ID0gbW94Lk1veCgpCi0gICAgZmlsZTEgPSBCYWdPZlBhcnRzKCkKLSAgICBmaWxlMS5maWxlbmFtZSA9ICdmaWxlMS50eHQnCi0gICAgZmlsZTEuY29udGVudHMgPSAnVGhpcyBpcyBhIHRlc3QgZmlsZScKLSAgICBmaWxlMiA9IEJhZ09mUGFydHMoKQotICAgIGZpbGUyLmZpbGVuYW1lID0gJ2ZpbGUyLnR4dCcKLSAgICBmaWxlMi5jb250ZW50cyA9ICgnYWtkamZrO2Rqc2Y7a2xqZHNsa2Zqc2xrZGZqbHNmamtkdm47a247MjM4OXJ0dTRpJwotICAgICAgICAgICAgICAgICAgICAgICd0bjtnaGY4Ojg5SCpocDc0OEZKdzgwZnU5V0pGcHdmMzlwdWplbnM7Zmloa2hqZmsnCi0gICAgICAgICAgICAgICAgICAgICAgJ3NkamZsamtnc2Mgbjtpc2VsZicpCi0gICAgc2VsZi5maWxlcyA9IHsnZmlsZTEnOiBmaWxlMSwgJ2ZpbGUyJzogZmlsZTJ9Ci0KLSAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICIiIlJlbW92ZSBhbnkgc3R1YnMgd2UndmUgY3JlYXRlZC4iIiIKLSAgICBzZWxmLm15X21veC5VbnNldFN0dWJzKCkKLQotICBkZWYgdGVzdEFyY2hpdmVJc1ZhbGlkKHNlbGYpOgotICAgICIiIlRlc3QgdGhlIERpcmVjdG9yeVppcHBlci5BcmNoaXZlSXNWYWxpZCBtZXRob2QuCi0KLSAgICBSdW4gdHdvIHRlc3RzLCBvbmUgdGhhdCB3ZSBleHBlY3QgdG8gcGFzcyBhbmQgb25lIHRoYXQgd2UgZXhwZWN0IHRvIGZhaWwKLSAgICAiIiIKLSAgICB0ZXN0X2ZpbGVfc2l6ZSA9IDEwNTY3MzAKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sob3MsICdzdGF0JykKLSAgICBvcy5zdGF0KCcvZm9vLzAuemlwJykuQW5kUmV0dXJuKFt0ZXN0X2ZpbGVfc2l6ZV0pCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHN0YXQsICdTVF9TSVpFJykKLSAgICBzdGF0LlNUX1NJWkUgPSAwCi0gICAgb3Muc3RhdCgnL2Jhei8wLnppcCcpLkFuZFJldHVybihbdGVzdF9maWxlX3NpemVdKQotICAgIG1veC5SZXBsYXkob3Muc3RhdCkKLSAgICB0ZXN0X3RhcmdldCA9IGRpdmlkZV9hbmRfY29tcHJlc3MuRGlyZWN0b3J5WmlwcGVyKCcvZm9vLycsICdiYXInLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZmlsZV9zaXplIC0gMSwgVHJ1ZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgICAgICBtc2c9KCdFUlJPUjogVGVzdCBmYWlsZWQsIEFyY2hpdmVJc1ZhbGlkIHNob3VsZCBoYXZlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybmVkIGZhbHNlLCBidXQgcmV0dXJuZWQgdHJ1ZScpKQotCi0gICAgdGVzdF90YXJnZXQgPSBkaXZpZGVfYW5kX2NvbXByZXNzLkRpcmVjdG9yeVppcHBlcignL2Jhei8nLCAnYmFyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZmlsZV9zaXplICsgMSwgVHJ1ZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgICAgICBtc2c9KCdFUlJPUjogVGVzdCBmYWlsZWQsIEFyY2hpdmVJc1ZhbGlkIHNob3VsZCBoYXZlJwotICAgICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmVkIHRydWUsIGJ1dCByZXR1cm5lZCBmYWxzZScpKQotCi0gIGRlZiB0ZXN0UmVtb3ZlTGFzdEZpbGUoc2VsZik6Ci0gICAgIiIiVGVzdCBEaXJlY3RvcnlaaXBwZXIuUmVtb3ZlTGFzdEZpbGUgbWV0aG9kLgotCi0gICAgQ29uc3RydWN0IGEgWmlwSW5mbyBtb2NrIG9iamVjdCB3aXRoIHR3byByZWNvcmRzLCB2ZXJpZnkgdGhhdCB3cml0ZSBpcwotICAgIG9ubHkgY2FsbGVkIG9uY2Ugb24gdGhlIG5ldyBaaXBGaWxlIG9iamVjdC4KLSAgICAiIiIKLSAgICBzb3VyY2UgPSBzZWxmLkNyZWF0ZVppcFNvdXJjZSgpCi0gICAgZGVzdCA9IHNlbGYuQ3JlYXRlWmlwRGVzdGluYXRpb24oKQotICAgIHNvdXJjZV9wYXRoID0gJycuam9pbihbb3MuZ2V0Y3dkKCksICcvMC1vbGQuemlwJ10pCi0gICAgZGVzdF9wYXRoID0gJycuam9pbihbb3MuZ2V0Y3dkKCksICcvMC56aXAnXSkKLSAgICB0ZXN0X3RhcmdldCA9IGRpdmlkZV9hbmRfY29tcHJlc3MuRGlyZWN0b3J5WmlwcGVyKAotICAgICAgICAnJy5qb2luKFtvcy5nZXRjd2QoKSwgJy8nXSksICdkdW1teScsIDEwMjQqMTAyNCwgVHJ1ZSkKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sodGVzdF90YXJnZXQsICdPcGVuWmlwRmlsZUF0UGF0aCcpCi0gICAgdGVzdF90YXJnZXQuT3BlblppcEZpbGVBdFBhdGgoc291cmNlX3BhdGgsIG1vZGU9J3InKS5BbmRSZXR1cm4oc291cmNlKQotICAgIHRlc3RfdGFyZ2V0Lk9wZW5aaXBGaWxlQXRQYXRoKGRlc3RfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzcz16aXBmaWxlLlpJUF9ERUZMQVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPSd3JykuQW5kUmV0dXJuKGRlc3QpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKG9zLCAncmVuYW1lJykKLSAgICBvcy5yZW5hbWUoZGVzdF9wYXRoLCBzb3VyY2VfcGF0aCkKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sob3MsICd1bmxpbmsnKQotICAgIG9zLnVubGluayhzb3VyY2VfcGF0aCkKLSAgICAKLSAgICBzZWxmLm15X21veC5SZXBsYXlBbGwoKQotICAgIHRlc3RfdGFyZ2V0LlJlbW92ZUxhc3RGaWxlKCkKLSAgICBzZWxmLm15X21veC5WZXJpZnlBbGwoKSAgICAKLQotICBkZWYgQ3JlYXRlWmlwU291cmNlKHNlbGYpOgotICAgICIiIkNyZWF0ZSBhIG1vY2sgemlwIHNvdXJlYyBvYmplY3QuCi0KLSAgICBSZWFkIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLCBiZWNhdXNlIHRoZSBzZWNvbmQgZmlsZSBpcyB0aGUgb25lCi0gICAgYmVpbmcgcmVtb3ZlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGNvbmZpZ3VyZWQgbW9ja2VkCi0gICAgIiIiCi0gICAgCi0gICAgc291cmNlX3ppcCA9IHNlbGYubXlfbW94LkNyZWF0ZU1vY2soemlwZmlsZS5aaXBGaWxlKQotICAgIHNvdXJjZV96aXAuaW5mb2xpc3QoKS5BbmRSZXR1cm4oW3NlbGYuZmlsZXNbJ2ZpbGUxJ10sIHNlbGYuZmlsZXNbJ2ZpbGUxJ11dKQotICAgIHNvdXJjZV96aXAuaW5mb2xpc3QoKS5BbmRSZXR1cm4oW3NlbGYuZmlsZXNbJ2ZpbGUxJ10sIHNlbGYuZmlsZXNbJ2ZpbGUxJ11dKQotICAgIHNvdXJjZV96aXAucmVhZChzZWxmLmZpbGVzWydmaWxlMSddLmZpbGVuYW1lKS5BbmRSZXR1cm4oCi0gICAgICAgIHNlbGYuZmlsZXNbJ2ZpbGUxJ10uY29udGVudHMpCi0gICAgc291cmNlX3ppcC5jbG9zZSgpCi0gICAgcmV0dXJuIHNvdXJjZV96aXAKLQotICBkZWYgQ3JlYXRlWmlwRGVzdGluYXRpb24oc2VsZik6Ci0gICAgIiIiQ3JlYXRlIG1vY2sgZGVzdGluYXRpb24gemlwLgotCi0gICAgV3JpdGUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UsIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBmaWxlcyBpbiB0aGUKLSAgICBzb3VyY2UgemlwIGFuZCB3ZSBleHBlY3QgdGhlIHNlY29uZCB0byBiZSByZW1vdmVkLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgY29uZmlndXJlZCBtb2NrZWQKLSAgICAiIiIKLSAgICAKLSAgICBkZXN0X3ppcCA9IG1veC5Nb2NrT2JqZWN0KHppcGZpbGUuWmlwRmlsZSkKLSAgICBkZXN0X3ppcC53cml0ZXN0cihzZWxmLmZpbGVzWydmaWxlMSddLmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZXNbJ2ZpbGUxJ10uY29udGVudHMpCi0gICAgZGVzdF96aXAuY2xvc2UoKQotICAgIHJldHVybiBkZXN0X3ppcAotCi0KLWNsYXNzIEZpeEFyY2hpdmVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICIiIlRlc3RzIGZvciB0aGUgRGlyZWN0b3J5WmlwcGVyLkZpeEFyY2hpdmUgbWV0aG9kLiIiIgotICAKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICIiIkNyZWF0ZSBhIG1vY2sgZmlsZSBvYmplY3QuIiIiCi0gICAgc2VsZi5teV9tb3ggPSBtb3guTW94KCkKLSAgICBzZWxmLmZpbGUxID0gQmFnT2ZQYXJ0cygpCi0gICAgc2VsZi5maWxlMS5maWxlbmFtZSA9ICdmaWxlMS50eHQnCi0gICAgc2VsZi5maWxlMS5jb250ZW50cyA9ICdUaGlzIGlzIGEgdGVzdCBmaWxlJwotCi0gIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAiIiJVbnNldCBhbnkgbW9ja3MgdGhhdCB3ZSd2ZSBjcmVhdGVkLiIiIgotICAgIHNlbGYubXlfbW94LlVuc2V0U3R1YnMoKQotCi0gIGRlZiBfSW5pdE11bHRpRmlsZURhdGEoc2VsZik6Ci0gICAgIiIiQ3JlYXRlIGFuIGFycmF5IG9mIG1vY2sgZmlsZSBvYmplY3RzLgotCi0gICAgQ3JlYXRlIHRocmVlIG1vY2sgZmlsZSBvYmplY3RzIHRoYXQgd2UgY2FuIHVzZSBmb3IgdGVzdGluZy4KLSAgICAiIiIKLSAgICBzZWxmLm11bHRpX2ZpbGVfZGlyID0gW10KLSAgICAKLSAgICBmaWxlMSA9IEJhZ09mUGFydHMoKQotICAgIGZpbGUxLmZpbGVuYW1lID0gJ2ZpbGUxLnR4dCcKLSAgICBmaWxlMS5jb250ZW50cyA9ICdramFza2w7amtkamZramE7a2pzbmJ2am52bmJ1ZXdrbHJpdWphbHZqc2QnCi0gICAgc2VsZi5tdWx0aV9maWxlX2Rpci5hcHBlbmQoZmlsZTEpCi0KLSAgICBmaWxlMiA9IEJhZ09mUGFydHMoKQotICAgIGZpbGUyLmZpbGVuYW1lID0gJ2ZpbGUyLnR4dCcKLSAgICBmaWxlMi5jb250ZW50cyA9ICgnSGUgZW50ZXJlZCB0aGUgcm9vbSBhbmQgdGhlcmUgaW4gdGhlIGNlbnRlciwgaXQgd2FzLicKLSAgICAgICAgICAgICAgICAgICAgICAnIExvb2tpbmcgdXBvbiB0aGUgdGhpbmcsIHN1ZGRlbmx5IGhlIGNvdWxkIG5vdCByZW1lbWJlcicKLSAgICAgICAgICAgICAgICAgICAgICAnIHdoZXRoZXIgaGUgaGFkIGFjdHVhbGx5IHNlZW4gaXQgYmVmb3JlIG9yIHdoZXRoZXInCi0gICAgICAgICAgICAgICAgICAgICAgJyBoaXMgbWVtb3J5IG9mIGl0IHdhcyBtZXJlbHkgdGhlIGVmZmVjdCBvZiBzb21ldGhpbmcnCi0gICAgICAgICAgICAgICAgICAgICAgJyBzbyBvZnRlbiBiZWluZyBpbWFnaW5lZCB0aGF0IGl0IGhhZCBsb25nIHNpbmNlIGJlY29tZSAnCi0gICAgICAgICAgICAgICAgICAgICAgJyBtYW5pZmVzdCBpbiBoaXMgbWluZC4nKQotICAgIHNlbGYubXVsdGlfZmlsZV9kaXIuYXBwZW5kKGZpbGUyKQotCi0gICAgZmlsZTMgPSBCYWdPZlBhcnRzKCkKLSAgICBmaWxlMy5maWxlbmFtZSA9ICdmaWxlMy50eHQnCi0gICAgZmlsZTMuY29udGVudHMgPSAnV2hvYSwgd2hhdCBpcyBcJ2ZpbGUyLnR4dFwnIGFsbCBhYm91dD8nCi0gICAgc2VsZi5tdWx0aV9maWxlX2Rpci5hcHBlbmQoZmlsZTMpCi0gICAgCi0gIGRlZiB0ZXN0U2luZ2xlRmlsZUFyY2hpdmUoc2VsZik6Ci0gICAgIiIiVGVzdCBiZWhhdmlvciBvZiBGaXhBcmNoaXZlIHdoZW4gdGhlIGFyY2hpdmUgaGFzIGEgc2luZ2xlIG1lbWJlci4KLQotICAgIFdlIGV4cGVjdCB0aGF0IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggYW4gYXJjaGl2ZSB0aGF0IGhhcyBhCi0gICAgc2luZ2xlIG1lbWJlciB0aGF0IGl0IHdpbGwgcmV0dXJuIEZhbHNlIGFuZCB1bmxpbmsgdGhlIGFyY2hpdmUuCi0gICAgIiIiCi0gICAgdGVzdF90YXJnZXQgPSBkaXZpZGVfYW5kX2NvbXByZXNzLkRpcmVjdG9yeVppcHBlcigKLSAgICAgICAgJycuam9pbihbb3MuZ2V0Y3dkKCksICcvJ10pLCAnZHVtbXknLCAxMDI0KjEwMjQsIFRydWUpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHRlc3RfdGFyZ2V0LCAnT3BlblppcEZpbGVBdFBhdGgnKQotICAgIHRlc3RfdGFyZ2V0Lk9wZW5aaXBGaWxlQXRQYXRoKAotICAgICAgICAnJy5qb2luKFtvcy5nZXRjd2QoKSwgJy8wLnppcCddKSwgbW9kZT0ncicpLkFuZFJldHVybigKLSAgICAgICAgICAgIHNlbGYuQ3JlYXRlU2luZ2xlRmlsZU1vY2soKSkKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sob3MsICd1bmxpbmsnKQotICAgIG9zLnVubGluaygnJy5qb2luKFtvcy5nZXRjd2QoKSwgJy8wLnppcCddKSkKLSAgICBzZWxmLm15X21veC5SZXBsYXlBbGwoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHRlc3RfdGFyZ2V0LkZpeEFyY2hpdmUoJ1NJWkUnKSkKLSAgICBzZWxmLm15X21veC5WZXJpZnlBbGwoKQotCi0gIGRlZiBDcmVhdGVTaW5nbGVGaWxlTW9jayhzZWxmKToKLSAgICAiIiJDcmVhdGUgYSBtb2NrIFppcEZpbGUgb2JqZWN0IGZvciB0ZXN0U2luZ2xlRmlsZUFyY2hpdmUuCi0KLSAgICBXZSBqdXN0IG5lZWQgaXQgdG8gcmV0dXJuIGEgc2luZ2xlIG1lbWJlciBpbmZvbGlzdCB0d2ljZQotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgY29uZmlndXJlZCBtb2NrIG9iamVjdAotICAgICIiIgotICAgIG1vY2tfemlwID0gc2VsZi5teV9tb3guQ3JlYXRlTW9jayh6aXBmaWxlLlppcEZpbGUpCi0gICAgbW9ja196aXAuaW5mb2xpc3QoKS5BbmRSZXR1cm4oW3NlbGYuZmlsZTFdKQotICAgIG1vY2tfemlwLmluZm9saXN0KCkuQW5kUmV0dXJuKFtzZWxmLmZpbGUxXSkKLSAgICBtb2NrX3ppcC5jbG9zZSgpCi0gICAgcmV0dXJuIG1vY2tfemlwCi0KLSAgZGVmIHRlc3RNdWx0aUZpbGVBcmNoaXZlKHNlbGYpOgotICAgICIiIlRlc3QgYmVoYXZpb3Igb2YgRGlyZWN0b3J5WmlwcGVyLkZpeEFyY2hpdmUgd2l0aCBhIG11bHRpLWZpbGUgYXJjaGl2ZS4KLQotICAgIFdlIGV4cGVjdCB0aGF0IEZpeEFyY2hpdmUgd2lsbCByZW5hbWUgdGhlIG9sZCBhcmNoaXZlLCBhZGRpbmcgJy1vbGQnIGJlZm9yZQotICAgICcuemlwJywgcmVhZCBhbGwgdGhlIG1lbWJlcnMgZXhjZXB0IHRoZSBsYXN0IG9uZSBvZiAnLW9sZCcgaW50byBhIG5ldwotICAgIGFyY2hpdmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbCwgYW5kIHRoZW4gdW5saW5rIHRoZSAnLW9sZCcgY29weQotICAgICIiIgotICAgIHRlc3RfdGFyZ2V0ID0gZGl2aWRlX2FuZF9jb21wcmVzcy5EaXJlY3RvcnlaaXBwZXIoCi0gICAgICAgICcnLmpvaW4oW29zLmdldGN3ZCgpLCAnLyddKSwgJ2R1bW15JywgMTAyNCoxMDI0LCBUcnVlKQotICAgIHNlbGYubXlfbW94LlN0dWJPdXRXaXRoTW9jayh0ZXN0X3RhcmdldCwgJ09wZW5aaXBGaWxlQXRQYXRoJykKLSAgICB0ZXN0X3RhcmdldC5PcGVuWmlwRmlsZUF0UGF0aCgKLSAgICAgICAgJycuam9pbihbb3MuZ2V0Y3dkKCksICcvMC56aXAnXSksIG1vZGU9J3InKS5BbmRSZXR1cm4oCi0gICAgICAgICAgICBzZWxmLkNyZWF0ZU11bHRpRmlsZU1vY2soKSkKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sodGVzdF90YXJnZXQsICdSZW1vdmVMYXN0RmlsZScpCi0gICAgdGVzdF90YXJnZXQuUmVtb3ZlTGFzdEZpbGUoJycuam9pbihbb3MuZ2V0Y3dkKCksICcvMC56aXAnXSkpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKG9zLCAnc3RhdCcpCi0gICAgb3Muc3RhdCgnJy5qb2luKFtvcy5nZXRjd2QoKSwgJy8wLnppcCddKSkuQW5kUmV0dXJuKFs0OTMwMl0pCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHN0YXQsICdTVF9TSVpFJykKLSAgICBzdGF0LlNUX1NJWkUgPSAwCi0gICAgc2VsZi5teV9tb3guUmVwbGF5QWxsKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHRlc3RfdGFyZ2V0LkZpeEFyY2hpdmUoJ1NJWkUnKSkKLSAgICBzZWxmLm15X21veC5WZXJpZnlBbGwoKQotCi0gIGRlZiBDcmVhdGVNdWx0aUZpbGVNb2NrKHNlbGYpOgotICAgICIiIkNyZWF0ZSBtb2NrIFppcEZpbGUgb2JqZWN0IGZvciB1c2Ugd2l0aCB0ZXN0TXVsdGlGaWxlQXJjaGl2ZS4KLQotICAgIFRoZSBtb2NrIGp1c3QgbmVlZHMgdG8gcmV0dXJuIHRoZSBpbmZvbGlzdCBtb2NrIHRoYXQgaXMgcHJlcGFyZWQgaW4KLSAgICBJbml0TXVsdGlGaWxlRGF0YSgpCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBjb25maWd1cmVkIG1vY2sgb2JqZWN0Ci0gICAgIiIiCi0gICAgc2VsZi5fSW5pdE11bHRpRmlsZURhdGEoKQotICAgIG1vY2tfemlwID0gc2VsZi5teV9tb3guQ3JlYXRlTW9jayh6aXBmaWxlLlppcEZpbGUpCi0gICAgbW9ja196aXAuaW5mb2xpc3QoKS5BbmRSZXR1cm4oc2VsZi5tdWx0aV9maWxlX2RpcikKLSAgICBtb2NrX3ppcC5jbG9zZSgpCi0gICAgcmV0dXJuIG1vY2tfemlwCi0KLQotY2xhc3MgQWRkRmlsZVRvQXJjaGl2ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAiIiJUZXN0IGJlaGF2aW9yIG9mIG1ldGhvZCB0byBhZGQgYSBmaWxlIHRvIGFuIGFyY2hpdmUuIiIiCi0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICIiIlNldHVwIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBEaXJlY3RvcnlaaXBwZXIgb2JqZWN0LiIiIgotICAgIHNlbGYubXlfbW94ID0gbW94Lk1veCgpCi0gICAgc2VsZi5vdXRwdXRfZGlyID0gJyVzLycgJSBvcy5nZXRjd2QoKQotICAgIHNlbGYuZmlsZV90b19hZGQgPSAnZmlsZS50eHQnCi0gICAgc2VsZi5pbnB1dF9kaXIgPSAnL2Zvby9iYXIvYmF6LycKLQotICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgc2VsZi5teV9tb3guVW5zZXRTdHVicygpCi0KLSAgZGVmIHRlc3RBZGRGaWxlVG9BcmNoaXZlKHNlbGYpOgotICAgICIiIlRlc3QgdGhlIERpcmVjdG9yeVppcHBlci5BZGRGaWxlVG9BcmNoaXZlIG1ldGhvZC4KLQotICAgIFdlIGFyZSB0ZXN0aW5nIGEgcHJldHR5IHRyaXZpYWwgbWV0aG9kLCB3ZSBqdXN0IGV4cGVjdCBpdCB0byBsb29rIGF0IHRoZQotICAgIGZpbGUgaXRzIGFkZGluZywgc28gdGhhdCBpdCBwb3NzaWJsZSBjYW4gdGhyb3VnaCBvdXQgYSB3YXJuaW5nLgotICAgICIiIgotICAgIHRlc3RfdGFyZ2V0ID0gZGl2aWRlX2FuZF9jb21wcmVzcy5EaXJlY3RvcnlaaXBwZXIoc2VsZi5vdXRwdXRfZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnB1dF9kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0KjEwMjQsIFRydWUpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHRlc3RfdGFyZ2V0LCAnT3BlblppcEZpbGVBdFBhdGgnKQotICAgIGFyY2hpdmVfbW9jayA9IHNlbGYuQ3JlYXRlQXJjaGl2ZU1vY2soKQotICAgIHRlc3RfdGFyZ2V0Lk9wZW5aaXBGaWxlQXRQYXRoKAotICAgICAgICAnJy5qb2luKFtzZWxmLm91dHB1dF9kaXIsICcwLnppcCddKSwKLSAgICAgICAgY29tcHJlc3M9emlwZmlsZS5aSVBfREVGTEFURUQpLkFuZFJldHVybihhcmNoaXZlX21vY2spCi0gICAgc2VsZi5TdHViT3V0T3NNb2R1bGUoKQotICAgIHNlbGYubXlfbW94LlJlcGxheUFsbCgpCi0gICAgdGVzdF90YXJnZXQuQWRkRmlsZVRvQXJjaGl2ZSgnJy5qb2luKFtzZWxmLmlucHV0X2Rpciwgc2VsZi5maWxlX3RvX2FkZF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfREVGTEFURUQpCi0gICAgc2VsZi5teV9tb3guVmVyaWZ5QWxsKCkKLQotICBkZWYgU3R1Yk91dE9zTW9kdWxlKHNlbGYpOgotICAgICIiIkNyZWF0ZSBhIG1vY2sgZm9yIHRoZSBvcy5wYXRoIGFuZCBvcy5zdGF0IG9iamVjdHMuCi0KLSAgICBDcmVhdGUgYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHR5cGUgKGZpbGUgb3IgZGlyZWN0b3J5KSBhbmQgc2l6ZSBvZiB0aGUKLSAgICBvYmplY3QgdGhhdCBpcyB0byBiZSBhZGRlZC4KLSAgICAiIiIKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sob3MucGF0aCwgJ2lzZmlsZScpCi0gICAgb3MucGF0aC5pc2ZpbGUoJycuam9pbihbc2VsZi5pbnB1dF9kaXIsIHNlbGYuZmlsZV90b19hZGRdKSkuQW5kUmV0dXJuKFRydWUpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKG9zLCAnc3RhdCcpCi0gICAgb3Muc3RhdCgnJy5qb2luKFtzZWxmLmlucHV0X2Rpciwgc2VsZi5maWxlX3RvX2FkZF0pKS5BbmRSZXR1cm4oWzM5NDgwXSkKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2soc3RhdCwgJ1NUX1NJWkUnKQotICAgIHN0YXQuU1RfU0laRSA9IDAKLSAgICAKLSAgZGVmIENyZWF0ZUFyY2hpdmVNb2NrKHNlbGYpOgotICAgICIiIkNyZWF0ZSBhIG1vY2sgWmlwRmlsZSBmb3IgdXNlIHdpdGggdGVzdEFkZEZpbGVUb0FyY2hpdmUuCi0KLSAgICBKdXN0IHZlcmlmeSB0aGF0IHdyaXRlIGlzIGNhbGxlZCB3aXRoIHRoZSBmaWxlIHdlIGV4cGVjdCBhbmQgdGhhdCB0aGUKLSAgICBhcmNoaXZlIGlzIGNsb3NlZCBhZnRlciB0aGUgZmlsZSBhZGRpdGlvbgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgY29uZmlndXJlZCBtb2NrIG9iamVjdAotICAgICIiIgotICAgIGFyY2hpdmVfbW9jayA9IHNlbGYubXlfbW94LkNyZWF0ZU1vY2soemlwZmlsZS5aaXBGaWxlKQotICAgIGFyY2hpdmVfbW9jay53cml0ZSgnJy5qb2luKFtzZWxmLmlucHV0X2Rpciwgc2VsZi5maWxlX3RvX2FkZF0pLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfdG9fYWRkKQotICAgIGFyY2hpdmVfbW9jay5jbG9zZSgpCi0gICAgcmV0dXJuIGFyY2hpdmVfbW9jawotCi0KLWNsYXNzIENvbXByZXNzRGlyZWN0b3J5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICIiIlRlc3QgdGhlIG1hc3RlciBtZXRob2Qgb2YgdGhlIGNsYXNzLgotCi0gIFRlc3Rpbmcgd2l0aCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0gIC9kaXIxLwotICAvZGlyMS9maWxlMS50eHQKLSAgL2RpcjEvZmlsZTIudHh0Ci0gIC9kaXIxL2RpcjIvCi0gIC9kaXIxL2RpcjIvZGlyMy8KLSAgL2RpcjEvZGlyMi9kaXI0LwotICAvZGlyMS9kaXIyL2RpcjQvZmlsZTMudHh0Ci0gIC9kaXIxL2RpcjUvCi0gIC9kaXIxL2RpcjUvZmlsZTQudHh0Ci0gIC9kaXIxL2RpcjUvZmlsZTUudHh0Ci0gIC9kaXIxL2RpcjUvZmlsZTYudHh0Ci0gIC9kaXIxL2RpcjUvZmlsZTcudHh0Ci0gIC9kaXIxL2RpcjYvCi0gIC9kaXIxL2RpcjYvZmlsZTgudHh0Ci0KLSAgZmlsZTEudHh0LiwgZmlsZTIudHh0LCBmaWxlMy50eHQgc2hvdWxkIGJlIGluIDAuemlwCi0gIGZpbGU0LnR4dCBzaG91bGQgYmUgaW4gMS56aXAKLSAgZmlsZTUudHh0LCBmaWxlNi50eHQgc2hvdWxkIGJlIGluIDIuemlwCi0gIGZpbGU3LnR4dCB3aWxsIG5vdCBiZSBzdG9yZWQgc2luY2UgaXQgd2lsbCBiZSB0b28gbGFyZ2UgY29tcHJlc3NlZAotICBmaWxlOC50eHQgc2hvdWxkIGIgaW4gMy56aXAKLSAgIiIiCi0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICIiIlNldHVwIGFsbCB0aGUgbW9ja3MgZm9yIHRoaXMgdGVzdC4iIiIKLSAgICBzZWxmLm15X21veCA9IG1veC5Nb3goKQotCi0gICAgc2VsZi5iYXNlX2RpciA9ICcvZGlyMScKLSAgICBzZWxmLm91dHB1dF9wYXRoID0gJy9vdXRfZGlyLycKLSAgICBzZWxmLnRlc3RfdGFyZ2V0ID0gZGl2aWRlX2FuZF9jb21wcmVzcy5EaXJlY3RvcnlaaXBwZXIoCi0gICAgICAgIHNlbGYub3V0cHV0X3BhdGgsIHNlbGYuYmFzZV9kaXIsIDEwMjQqMTAyNCwgVHJ1ZSkKLSAgICAKLSAgICBzZWxmLkluaXRBcmdMaXN0cygpCi0gICAgc2VsZi5Jbml0T3NEb3RQYXRoKCkKLSAgICBzZWxmLkluaXRBcmNoaXZlSXNWYWxpZCgpCi0gICAgc2VsZi5Jbml0V3JpdGVJbmRleFJlY29yZCgpCi0gICAgc2VsZi5Jbml0QWRkRmlsZVRvQXJjaGl2ZSgpCi0KLSAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgIHNlbGYubXlfbW94LlVuc2V0U3R1YnMoKQotCi0gIGRlZiB0ZXN0Q29tcHJlc3NEaXJlY3Rvcnkoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGUgRGlyZWN0b3J5WmlwcGVyLkNvbXByZXNzRGlyZWN0b3J5IG1ldGhvZC4iIiIKLSAgICBzZWxmLm15X21veC5SZXBsYXlBbGwoKQotICAgIGZvciBhcmd1bWVudHMgaW4gc2VsZi5hcmd1bWVudF9saXN0czoKLSAgICAgIHNlbGYudGVzdF90YXJnZXQuQ29tcHJlc3NEaXJlY3RvcnkoTm9uZSwgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pCi0gICAgc2VsZi5teV9tb3guVmVyaWZ5QWxsKCkKLQotICBkZWYgSW5pdEFkZEZpbGVUb0FyY2hpdmUoc2VsZik6Ci0gICAgIiIiU2V0dXAgbW9jayBmb3IgRGlyZWN0b3J5WmlwcGVyLkFkZEZpbGVUb0FyY2hpdmUuCi0KLSAgICBNYWtlIHN1cmUgdGhhdCB0aGUgZmlsZXMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB3ZSBleHBlY3QuCi0gICAgIiIiCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHNlbGYudGVzdF90YXJnZXQsICdBZGRGaWxlVG9BcmNoaXZlJykKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFkZEZpbGVUb0FyY2hpdmUoJy9kaXIxL2ZpbGUxLnR4dCcsIHppcGZpbGUuWklQX0RFRkxBVEVEKQotICAgIHNlbGYudGVzdF90YXJnZXQuQWRkRmlsZVRvQXJjaGl2ZSgnL2RpcjEvZmlsZTIudHh0JywgemlwZmlsZS5aSVBfREVGTEFURUQpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BZGRGaWxlVG9BcmNoaXZlKCcvZGlyMS9kaXIyL2RpcjQvZmlsZTMudHh0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfREVGTEFURUQpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BZGRGaWxlVG9BcmNoaXZlKCcvZGlyMS9kaXI1L2ZpbGU0LnR4dCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuWklQX0RFRkxBVEVEKQotICAgIHNlbGYudGVzdF90YXJnZXQuQWRkRmlsZVRvQXJjaGl2ZSgnL2RpcjEvZGlyNS9maWxlNC50eHQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFkZEZpbGVUb0FyY2hpdmUoJy9kaXIxL2RpcjUvZmlsZTUudHh0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfREVGTEFURUQpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BZGRGaWxlVG9BcmNoaXZlKCcvZGlyMS9kaXI1L2ZpbGU1LnR4dCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuWklQX0RFRkxBVEVEKQotICAgIHNlbGYudGVzdF90YXJnZXQuQWRkRmlsZVRvQXJjaGl2ZSgnL2RpcjEvZGlyNS9maWxlNi50eHQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFkZEZpbGVUb0FyY2hpdmUoJy9kaXIxL2RpcjUvZmlsZTcudHh0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfREVGTEFURUQpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BZGRGaWxlVG9BcmNoaXZlKCcvZGlyMS9kaXI1L2ZpbGU3LnR4dCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuWklQX0RFRkxBVEVEKQotICAgIHNlbGYudGVzdF90YXJnZXQuQWRkRmlsZVRvQXJjaGl2ZSgnL2RpcjEvZGlyNi9maWxlOC50eHQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKLSAgCi0gIGRlZiBJbml0V3JpdGVJbmRleFJlY29yZChzZWxmKToKLSAgICAiIiJTZXR1cCBtb2NrIGZvciBEaXJlY3RvcnlaaXBwZXIuV3JpdGVJbmRleFJlY29yZC4iIiIKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2soc2VsZi50ZXN0X3RhcmdldCwgJ1dyaXRlSW5kZXhSZWNvcmQnKQotCi0gICAgIyB3ZSBhcmUgdHJ5aW5nIHRvIGNvbXByZXNzIDggZmlsZXMsIGJ1dCB3ZSBzaG91bGQgb25seSBhdHRlbXB0IHRvCi0gICAgIyB3cml0ZSBhbiBpbmRleCByZWNvcmQgNyB0aW1lcywgYmVjYXVzZSBvbmUgZmlsZSBpcyB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkCi0gICAgc2VsZi50ZXN0X3RhcmdldC5Xcml0ZUluZGV4UmVjb3JkKCkuQW5kUmV0dXJuKFRydWUpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5Xcml0ZUluZGV4UmVjb3JkKCkuQW5kUmV0dXJuKEZhbHNlKQotICAgIHNlbGYudGVzdF90YXJnZXQuV3JpdGVJbmRleFJlY29yZCgpLkFuZFJldHVybihGYWxzZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LldyaXRlSW5kZXhSZWNvcmQoKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LldyaXRlSW5kZXhSZWNvcmQoKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LldyaXRlSW5kZXhSZWNvcmQoKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5Xcml0ZUluZGV4UmVjb3JkKCkuQW5kUmV0dXJuKFRydWUpCi0KLSAgZGVmIEluaXRBcmNoaXZlSXNWYWxpZChzZWxmKToKLSAgICAiIiJNb2NrIG91dCBEaXJlY3RvcnlaaXBwZXIuQXJjaGl2ZUlzVmFsaWQgYW5kIERpcmVjdG9yeVppcHBlci5GaXhBcmNoaXZlLgotCi0gICAgTW9jayB0aGVzZSBtZXRob2RzIG91dCBzdWNoIHRoYXQgZmlsZTEsIGZpbGUyLCBhbmQgZmlsZTMgZ28gaW50byBvbmUKLSAgICBhcmNoaXZlLiBmaWxlNCB0aGVuIGdvZXMgaW50byB0aGUgbmV4dCBhcmNoaXZlLCBmaWxlNSBhbmQgZmlsZTYgaW4gdGhlCi0gICAgbmV4dCwgZmlsZSA3IHNob3VsZCBhcHBlYXIgdG9vIGxhcmdlIHRvIGNvbXByZXNzIGludG8gYW4gYXJjaGl2ZSwgYW5kCi0gICAgZmlsZTggZ29lcyBpbnRvIHRoZSBmaW5hbCBhcmNoaXZlCi0gICAgIiIiCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHNlbGYudGVzdF90YXJnZXQsICdBcmNoaXZlSXNWYWxpZCcpCi0gICAgc2VsZi5teV9tb3guU3R1Yk91dFdpdGhNb2NrKHNlbGYudGVzdF90YXJnZXQsICdGaXhBcmNoaXZlJykKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCkuQW5kUmV0dXJuKFRydWUpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BcmNoaXZlSXNWYWxpZCgpLkFuZFJldHVybihUcnVlKQotICAgIHNlbGYudGVzdF90YXJnZXQuQXJjaGl2ZUlzVmFsaWQoKS5BbmRSZXR1cm4oVHJ1ZSkKLQotICAgICMgc2hvdWxkIGJlIGZpbGU0LnR4dAotICAgIHNlbGYudGVzdF90YXJnZXQuQXJjaGl2ZUlzVmFsaWQoKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5GaXhBcmNoaXZlKCdTSVpFJykuQW5kUmV0dXJuKFRydWUpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BcmNoaXZlSXNWYWxpZCgpLkFuZFJldHVybihUcnVlKQotCi0gICAgIyBzaG91bGQgYmUgZmlsZTUudHh0Ci0gICAgc2VsZi50ZXN0X3RhcmdldC5BcmNoaXZlSXNWYWxpZCgpLkFuZFJldHVybihGYWxzZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkZpeEFyY2hpdmUoJ1NJWkUnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCkuQW5kUmV0dXJuKFRydWUpCi0gICAgc2VsZi50ZXN0X3RhcmdldC5BcmNoaXZlSXNWYWxpZCgpLkFuZFJldHVybihUcnVlKQotCi0gICAgIyBzaG91bGQgYmUgZmlsZTcudHh0Ci0gICAgc2VsZi50ZXN0X3RhcmdldC5BcmNoaXZlSXNWYWxpZCgpLkFuZFJldHVybihGYWxzZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkZpeEFyY2hpdmUoJ1NJWkUnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCkuQW5kUmV0dXJuKEZhbHNlKQotICAgIHNlbGYudGVzdF90YXJnZXQuRml4QXJjaGl2ZSgnU0laRScpLkFuZFJldHVybihGYWxzZSkKLSAgICBzZWxmLnRlc3RfdGFyZ2V0LkFyY2hpdmVJc1ZhbGlkKCkuQW5kUmV0dXJuKFRydWUpCi0gICAgCi0gIGRlZiBJbml0T3NEb3RQYXRoKHNlbGYpOgotICAgICIiIk1vY2sgb3V0IG9zLnBhdGguaXNmaWxlLgotCi0gICAgTW9jayB0aGlzIG91dCBzbyB0aGUgdGhpbmdzIHdlIHdhbnQgdG8gYXBwZWFyIGFzIGZpbGVzIGFwcGVhciBhcyBmaWxlcyBhbmQKLSAgICB0aGUgdGhpbmdzIHdlIHdhbnQgdG8gYXBwZWFyIGFzIGRpcmVjdG9yaWVzIGFwcGVhciBhcyBkaXJlY3Rvcmllcy4gQWxzbwotICAgIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcmRlciBvZiBmaWxlIHZpc2l0cyBpcyBhcyB3ZSBleHBlY3QgKHdoaWNoIGlzIHdoeQotICAgIEluQW55T3JkZXIgaXNuJ3QgdXNlZCBoZXJlKS4KLSAgICAiIiIKLSAgICBzZWxmLm15X21veC5TdHViT3V0V2l0aE1vY2sob3MucGF0aCwgJ2lzZmlsZScpCi0gICAgb3MucGF0aC5pc2ZpbGUoJy9kaXIxL2RpcjInKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgb3MucGF0aC5pc2ZpbGUoJy9kaXIxL2RpcjUnKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgb3MucGF0aC5pc2ZpbGUoJy9kaXIxL2RpcjYnKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgb3MucGF0aC5pc2ZpbGUoJy9kaXIxL2ZpbGUxLnR4dCcpLkFuZFJldHVybihUcnVlKQotICAgIG9zLnBhdGguaXNmaWxlKCcvZGlyMS9maWxlMi50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyMi9kaXIzJykuQW5kUmV0dXJuKEZhbHNlKQotICAgIG9zLnBhdGguaXNmaWxlKCcvZGlyMS9kaXIyL2RpcjQnKS5BbmRSZXR1cm4oRmFsc2UpCi0gICAgb3MucGF0aC5pc2ZpbGUoJy9kaXIxL2RpcjIvZGlyNC9maWxlMy50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNC50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNC50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNS50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNS50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNi50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNy50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNS9maWxlNy50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLSAgICBvcy5wYXRoLmlzZmlsZSgnL2RpcjEvZGlyNi9maWxlOC50eHQnKS5BbmRSZXR1cm4oVHJ1ZSkKLQotICBkZWYgSW5pdEFyZ0xpc3RzKHNlbGYpOgotICAgICIiIkNyZWF0ZSB0aGUgZGlyZWN0b3J5IHBhdGggPT4gZGlyZWN0b3J5IGNvbnRlbnRzIG1hcHBpbmdzLiIiIgotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMgPSBbXQotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMuYXBwZW5kKFsnL2RpcjEnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2ZpbGUxLnR4dCcsICdmaWxlMi50eHQnLCAnZGlyMicsICdkaXI1JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXI2J11dKQotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMuYXBwZW5kKFsnL2RpcjEvZGlyMicsIFsnZGlyMycsICdkaXI0J11dKQotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMuYXBwZW5kKFsnL2RpcjEvZGlyMi9kaXIzJywgW11dKQotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMuYXBwZW5kKFsnL2RpcjEvZGlyMi9kaXI0JywgWydmaWxlMy50eHQnXV0pCi0gICAgc2VsZi5hcmd1bWVudF9saXN0cy5hcHBlbmQoWycvZGlyMS9kaXI1JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydmaWxlNC50eHQnLCAnZmlsZTUudHh0JywgJ2ZpbGU2LnR4dCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTcudHh0J11dKQotICAgIHNlbGYuYXJndW1lbnRfbGlzdHMuYXBwZW5kKFsnL2RpcjEvZGlyNicsIFsnZmlsZTgudHh0J11dKQotICAgICAgCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvZG9jX3NvdXJjZS5wcm9wZXJ0aWVzIGIvdG9vbHMvc2NyaXB0cy9kb2Nfc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzZmYmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9kb2Nfc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVBrZy5Vc2VyU3JjPWZhbHNlCi1QbGF0Zm9ybS5WZXJzaW9uPTIuMC4xCi1Qa2cuUmV2aXNpb249MQotQW5kcm9pZFZlcnNpb24uQXBpTGV2ZWw9NgotCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2ljb25faGRwaS5wbmcgYi90b29scy9zY3JpcHRzL2ljb25faGRwaS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzRjNGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9pY29uX2hkcGkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9pY29uX2xkcGkucG5nIGIvdG9vbHMvc2NyaXB0cy9pY29uX2xkcGkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk1NTg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvaWNvbl9sZHBpLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvaWNvbl9tZHBpLnBuZyBiL3Rvb2xzL3NjcmlwdHMvaWNvbl9tZHBpLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3YzY5Zi4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2ljb25fbWRwaS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2phdmFfZmlsZS50ZW1wbGF0ZSBiL3Rvb2xzL3NjcmlwdHMvamF2YV9maWxlLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTcxNGE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvamF2YV9maWxlLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBQQUNLQUdFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBQ1RJVklUWV9DTEFTU19OQU1FIGV4dGVuZHMgQWN0aXZpdHkKLXsKLSAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvamF2YV90ZXN0c19maWxlLnRlbXBsYXRlIGIvdG9vbHMvc2NyaXB0cy9qYXZhX3Rlc3RzX2ZpbGUudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDZmOWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9qYXZhX3Rlc3RzX2ZpbGUudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIFBBQ0tBR0U7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsZSBmcmFtZXdvcmsgZm9yIGEgdGVzdCBvZiBhbiBBcHBsaWNhdGlvbi4gIFNlZQotICoge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlIEFwcGxpY2F0aW9uVGVzdENhc2V9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCi0gKiBob3cgdG8gd3JpdGUgYW5kIGV4dGVuZCBBcHBsaWNhdGlvbiB0ZXN0cy4KLSAqIDxwLz4KLSAqIFRvIHJ1biB0aGlzIHRlc3QsIHlvdSBjYW4gdHlwZToKLSAqIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IFwKLSAqIC1lIGNsYXNzIEFDVElWSVRZX0ZRX05BTUUgXAotICogUEFDS0FHRS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgotICovCi1wdWJsaWMgY2xhc3MgQUNUSVZJVFlfQ0xBU1NfTkFNRSBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEFDVElWSVRZX1RFU1RFRF9DTEFTU19OQU1FPiB7Ci0KLSAgICBwdWJsaWMgQUNUSVZJVFlfQ0xBU1NfTkFNRSgpIHsKLSAgICAgICAgc3VwZXIoIlBBQ0tBR0UiLCBBQ1RJVklUWV9URVNURURfQ0xBU1NfTkFNRS5jbGFzcyk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9sYXlvdXQudGVtcGxhdGUgYi90b29scy9zY3JpcHRzL2xheW91dC50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMzY3Yy4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2xheW91dC50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKLSAgICA+Ci08VGV4dFZpZXcgIAotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAotICAgIGFuZHJvaWQ6dGV4dD0iSGVsbG8gV29ybGQsIEFDVElWSVRZX0VOVFJZX05BTUUiCi0gICAgLz4KLTwvTGluZWFyTGF5b3V0PgotCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzIGIvdG9vbHMvc2NyaXB0cy9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiNmZlYy4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1Qa2cuRGVzYz1BbmRyb2lkIFNESyBQbGF0Zm9ybSAyLjAuMV9yMQotUGtnLlVzZXJTcmM9ZmFsc2UKLVBsYXRmb3JtLlZlcnNpb249Mi4wLjEKLVBrZy5SZXZpc2lvbj0xCi1BbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD02CmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL3BsdWdpbi5wcm9wIGIvdG9vbHMvc2NyaXB0cy9wbHVnaW4ucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhOGM0Mi4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL3BsdWdpbi5wcm9wCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIGJlZ2luIHBsdWdpbi5wcm9wCi1wbHVnaW4udmVyc2lvbj0wLjkuNAotIyBlbmQgcGx1Z2luLnByb3AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0IGIvdG9vbHMvc2NyaXB0cy9zZGtfZmlsZXNfTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkYjMxZC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL3Nka19maWxlc19OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLU5vdGljZSBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGlzIGZvbGRlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMvc3RyaW5ncy50ZW1wbGF0ZSBiL3Rvb2xzL3NjcmlwdHMvc3RyaW5ncy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1YWY0MC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL3N0cmluZ3MudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPkFDVElWSVRZX0VOVFJZX05BTUU8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy90b29sc19zb3VyY2UucHJvcGVydGllcyBiL3Rvb2xzL3NjcmlwdHMvdG9vbHNfc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGU3Y2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy90b29sc19zb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotUGtnLlVzZXJTcmM9ZmFsc2UKLVBrZy5SZXZpc2lvbj01CmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL3VzYmRyaXZlcl9zb3VyY2UucHJvcGVydGllcyBiL3Rvb2xzL3NjcmlwdHMvdXNiZHJpdmVyX3NvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTg0ZGNhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvdXNiZHJpdmVyX3NvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1Qa2cuUmV2aXNpb249Mg0KLUFyY2hpdmUuT3M9V0lORE9XUw0KLUFyY2hpdmUuQXJjaD1BTlkNCi1FeHRyYS5QYXRoPXVzYl9kcml2ZXINCmRpZmYgLS1naXQgYS90b29scy9zZGtsYXVuY2hlci8uZ2l0aWdub3JlIGIvdG9vbHMvc2RrbGF1bmNoZXIvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNWIyYS4uMDAwMDAwMAotLS0gYS90b29scy9zZGtsYXVuY2hlci8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW1hZ2VzL2FuZHJvaWRfaWNvbi5vCmRpZmYgLS1naXQgYS90b29scy9zZGtsYXVuY2hlci9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbGF1bmNoZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5MmVhOC4uMDAwMDAwMAotLS0gYS90b29scy9zZGtsYXVuY2hlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIEFuZHJvaWQubWsgZm9yIHNka2xhdW5jaGVyCi0jCi0jIFRoZSAiU0RLIExhdW5jaGVyIiBpcyBmb3IgV2luZG93cyBvbmx5LgotIyBUaGlzIHNpbXBsZSAuZXhlIHdpbGwgc2l0IGF0IHRoZSByb290IG9mIHRoZSBXaW5kb3dzIFNESwotIyBhbmQgY3VycmVudGx5IHNpbXBseSBleGVjdXRlcyB0b29sc1xhbmRyb2lkLmJhdC4KLSMgRXZlbnR1YWxseSBpdCBzaG91bGQgc2ltcGx5IHJlcGxhY2UgdGhlIGJhdGNoIGZpbGUuCi0KLWlmZXEgKCQoSE9TVF9PUyksd2luZG93cykKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCXNka2xhdW5jaGVyLmMKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotTE9DQUxfQ0ZMQUdTICs9IC1EX1hPUEVOX1NPVVJDRSAtRF9HTlVfU09VUkNFIC1EU0hfSElTVE9SWQotTE9DQUxfTU9EVUxFIDo9IHNka2xhdW5jaGVyCi0KLSMgTGluayB0aGUgV2luZG93cyBpY29uIGZpbGUgYXMgd2VsbCBpbnRvIHRoZSBleGVjdXRhYmxlLCBiYXNlZCBvbiB0aGUgdGVjaG5pcXVlCi0jIHVzZWQgaW4gZXh0ZXJuYWwvcWVtdS9NYWtlZmlsZS5hbmRyb2lkLgotIwotSU5URVJNRURJQVRFICAgICA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVYRUNVVEFCTEVTLCQoTE9DQUxfTU9EVUxFKSx0cnVlKQotQU5EUk9JRF9JQ09OX09CSiA6PSBhbmRyb2lkX2ljb24ubwotQU5EUk9JRF9JQ09OX1BBVEggOj0gJChMT0NBTF9QQVRIKS9pbWFnZXMKLSQoQU5EUk9JRF9JQ09OX1BBVEgpLyQoQU5EUk9JRF9JQ09OX09CSik6ICQoQU5EUk9JRF9JQ09OX1BBVEgpL2FuZHJvaWRfaWNvbi5yYwotCXdpbmRyZXMgJDwgLUkgJChBTkRST0lEX0lDT05fUEFUSCkgLW8gJEAKLQotIyBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gYWRkIGFuIG9iamVjdCBmaWxlIHRoYXQgd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbQotIyBhIEMvQysrL0phdmEgc291cmNlIGZpbGUgdG8gb3VyIGJ1aWxkIHN5c3RlbS4gYW5kIHZlcnkgdW5mb3J0dW5hdGVseSwKLSMgJChUT1BESVIpLyQoTE9DQUxQQVRIKSB3aWxsIGFsd2F5cyBiZSBwcmVwZW5kZWQgdG8gdGhpcyB2YWx1ZSwgd2hpY2ggZm9yY2VzCi0jIHVzIHRvIHB1dCB0aGUgb2JqZWN0IGZpbGUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuLi4KLSMKLUxPQ0FMX1BSRUJVSUxUX09CSl9GSUxFUyArPSBpbWFnZXMvJChBTkRST0lEX0lDT05fT0JKKQotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWQsJChMT0NBTF9CVUlMVF9NT0RVTEUpKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbGF1bmNoZXIvaW1hZ2VzL2FuZHJvaWRfaWNvbi5pY28gYi90b29scy9zZGtsYXVuY2hlci9pbWFnZXMvYW5kcm9pZF9pY29uLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyNTE3OS4uMDAwMDAwMAotLS0gYS90b29scy9zZGtsYXVuY2hlci9pbWFnZXMvYW5kcm9pZF9pY29uLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka2xhdW5jaGVyL2ltYWdlcy9hbmRyb2lkX2ljb24ucmMgYi90b29scy9zZGtsYXVuY2hlci9pbWFnZXMvYW5kcm9pZF9pY29uLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ2OGFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka2xhdW5jaGVyL2ltYWdlcy9hbmRyb2lkX2ljb24ucmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTEgSUNPTiAiLi4vaW1hZ2VzL2FuZHJvaWRfaWNvbi5pY28iDQotDQotDQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbGF1bmNoZXIvc2RrbGF1bmNoZXIuYyBiL3Rvb2xzL3Nka2xhdW5jaGVyL3Nka2xhdW5jaGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTIyODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbGF1bmNoZXIvc2RrbGF1bmNoZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhlICJTREsgTGF1bmNoZXIiIGlzIGZvciBXaW5kb3dzIG9ubHkuCi0gKiBUaGlzIHNpbXBsZSAuZXhlIHdpbGwgc2l0IGF0IHRoZSByb290IG9mIHRoZSBXaW5kb3dzIFNESwotICogYW5kIGN1cnJlbnRseSBzaW1wbHkgZXhlY3V0ZXMgdG9vbHNcYW5kcm9pZC5iYXQuCi0gKiBFdmVudHVhbGx5IGl0IHNob3VsZCBzaW1wbHkgcmVwbGFjZSB0aGUgYmF0Y2ggZmlsZS4KLSAqCi0gKiBUT0RPOgotICogLSBkZXRlY3QgdGhhdCBqYXZhIGlzIGluc3RhbGxlZDsgZXJyb3IgZGlhbG9nIGlmIG5vdCwgZXhwbGFuaW5nIHdoZXJlIHRvIGdldCBpdC4KLSAqIC0gY3JlYXRlIHRlbXAgZGlyLCBhbHdheXMgY29weSAqLmphciB0aGVyZSwgZXhlYyBhbmRyb2lkLmphcgotICogLSBnZXQgamFycyB0byBjb3B5IGZyb20gc29tZSBmaWxlCi0gKiAtIHVzZSBhIHZlcnNpb24gbnVtYmVyIHRvIGNvcHkgamFycyBvbmx5IGlmIG5lZWRlZCAodG9vbHMucmV2aXNpb24/KQotICovCi0KLSNpZmRlZiBfV0lOMzIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1pbnQgc2RrX2xhdW5jaGVyKCkgewotICAgIFNUQVJUVVBJTkZPICAgICAgICAgICBzdGFydHVwOwotICAgIFBST0NFU1NfSU5GT1JNQVRJT04gICBwaW5mbzsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9wYXRoW01BWF9QQVRIXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgcmV0OwotCi0gICAgWmVyb01lbW9yeSgmc3RhcnR1cCwgc2l6ZW9mKHN0YXJ0dXApKTsKLSAgICBzdGFydHVwLmNiID0gc2l6ZW9mKHN0YXJ0dXApOwotCi0gICAgWmVyb01lbW9yeSgmcGluZm8sIHNpemVvZihwaW5mbykpOwotCi0gICAgLyogZ2V0IHBhdGggb2YgY3VycmVudCBwcm9ncmFtICovCi0gICAgR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3JhbV9wYXRoLCBzaXplb2YocHJvZ3JhbV9wYXRoKSk7Ci0KLSAgICByZXQgPSBDcmVhdGVQcm9jZXNzKAotICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3JhbSBwYXRoICovCi0gICAgICAgICAgICAidG9vbHNcXGFuZHJvaWQuYmF0IHVwZGF0ZSBzZGsiLCAgICAgICAgIC8qIGNvbW1hbmQtbGluZSAqLwotICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUgKi8KLSAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlICovCi0gICAgICAgICAgICBUUlVFLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeWVzLCBpbmhlcml0IHNvbWUgaGFuZGxlcyAqLwotICAgICAgICAgICAgQ1JFQVRFX05PX1dJTkRPVywgICAgICAgICAgICAgICAgLyogd2UgZG9uJ3Qgd2FudCBhIGNvbnNvbGUgKi8KLSAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHBhcmVudCdzIGVudmlyb25tZW50IGJsb2NrICovCi0gICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogdXNlIHBhcmVudCdzIHN0YXJ0aW5nIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgJnN0YXJ0dXAsICAgICAgICAgICAgICAgICAvKiBzdGFydHVwIGluZm8sIGkuZS4gc3RkIGhhbmRsZXMgKi8KLSAgICAgICAgICAgICZwaW5mbyk7Ci0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVQcm9jZXNzIGZhaWx1cmUsIGVycm9yICVsZFxuIiwgZXJyKTsKLQotICAgICAgICBMUFNUUiBzOwotICAgICAgICBpZiAoRm9ybWF0TWVzc2FnZUEoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgLyogZHdGbGFncyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxwU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkd01lc3NhZ2VJZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHdMYW5ndWFnZUlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUikmcywgICAgICAgICAgICAgICAgICAgICAgICAvKiBscEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogblNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIHZhX2xpc3QgYXJncyAqLwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHMpOwotICAgICAgICAgICAgTG9jYWxGcmVlKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICByZXR1cm4gc2RrX2xhdW5jaGVyKCk7Ci19Ci0KLSNlbmRpZiAvKiBfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvLmdpdGlnbm9yZSBiL3Rvb2xzL3Nka21hbmFnZXIvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmMjA2YS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWFwcC9iaW4KLWxpYnMvc2RrbGliL2JpbgotbGlicy9zZGt1aWxpYi9iaW4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbWFuYWdlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRmN2YxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1TREtNQU5BR0VSX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKFNES01BTkFHRVJfTE9DQUxfRElSKS9hcHAvQW5kcm9pZC5tawotaW5jbHVkZSAkKFNES01BTkFHRVJfTE9DQUxfRElSKS9saWJzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3Rvb2xzL3Nka21hbmFnZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvLmNsYXNzcGF0aCBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzODBiYTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3RzIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvU2RrTGliIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9BbmRyb2lkUHJlZnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL1Nka1VpTGliIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5KVU5JVF9DT05UQUlORVIvMyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuVVNFUl9MSUJSQVJZL0FORFJPSURfU1dUIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwLy5wcm9qZWN0IGIvdG9vbHMvc2RrbWFuYWdlci9hcHAvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODJkYjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPlNka01hbmFnZXI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+U2RrTGliPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+U2RrVWlMaWI8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2FwcC9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbWFuYWdlci9hcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiYTYxZi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2FwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLVNES01BTkFHRVJBUFBfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoU0RLTUFOQUdFUkFQUF9MT0NBTF9ESVIpL2V0Yy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoU0RLTUFOQUdFUkFQUF9MT0NBTF9ESVIpL3NyYy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2FwcC9ldGMvQW5kcm9pZC5tayBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzIzY2Q4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9QUkVCVUlMVF9FWEVDVVRBQkxFUyA6PSBhbmRyb2lkCi1pbmNsdWRlICQoQlVJTERfSE9TVF9QUkVCVUlMVCkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvZXRjL2FuZHJvaWQgYi90b29scy9zZGttYW5hZ2VyL2FwcC9ldGMvYW5kcm9pZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZlYjVmMi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2FwcC9ldGMvYW5kcm9pZAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDUtMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAotIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgotcHJvZz0iJDAiCi13aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwotICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKLSAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKLSAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKLSAgICBlbHNlCi0gICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCi0gICAgZmkKLWRvbmUKLW9sZHdkPWBwd2RgCi1wcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLWNkICIke3Byb2dkaXJ9IgotcHJvZ2Rpcj1gcHdkYAotcHJvZz0iJHtwcm9nZGlyfSIvYGJhc2VuYW1lICIke3Byb2d9ImAKLWNkICIke29sZHdkfSIKLQotamFyZmlsZT1zZGttYW5hZ2VyLmphcgotZnJhbWV3b3JrZGlyPSIkcHJvZ2RpciIKLWxpYmRpcj0iJHByb2dkaXIiCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9mcmFtZXdvcmsKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZWNobyBgYmFzZW5hbWUgIiRwcm9nImAiOiBjYW4ndCBmaW5kICRqYXJmaWxlIgotICAgIGV4aXQgMQotZmkKLQotCi0jIENoZWNrIGFyZ3MuCi1pZiBbIGRlYnVnID0gIiQxIiBdOyB0aGVuCi0gICAgIyBhZGQgdGhpcyBpbiBmb3IgZGVidWdnaW5nCi0gICAgamF2YV9kZWJ1Zz0tYWdlbnRsaWI6amR3cD10cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LGFkZHJlc3M9ODA1MCxzdXNwZW5kPXkKLSAgICBzaGlmdCAxCi1lbHNlCi0gICAgamF2YV9kZWJ1Zz0KLWZpCi0KLWphdmFfY21kPSJqYXZhIgotCi0jIE1hYyBPUyBYIG5lZWRzIGFuIGFkZGl0aW9uYWwgYXJnLCBvciB5b3UgZ2V0IGFuICJpbGxlZ2FsIHRocmVhZCIgY29tcGxhaW50LgotaWYgWyBgdW5hbWVgID0gIkRhcndpbiIgXTsgdGhlbgotICAgIG9zX29wdHM9Ii1Yc3RhcnRPbkZpcnN0VGhyZWFkIgotZWxzZQotICAgIG9zX29wdHM9Ci1maQotCi1pZiBbIGB1bmFtZWAgPSAiTGludXgiIF07IHRoZW4KLSAgICBleHBvcnQgR0RLX05BVElWRV9XSU5ET1dTPXRydWUKLWZpCi0KLWlmIFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXSA7IHRoZW4KLSAgICBqYXJwYXRoPWBjeWdwYXRoIC13ICAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSJgCi0gICAgcHJvZ2Rpcj1gY3lncGF0aCAtdyAgIiRwcm9nZGlyImAKLWVsc2UKLSAgICBqYXJwYXRoPSIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIgotZmkKLQotIyBGaWd1cmUgb3V0IHRoZSBwYXRoIHRvIHRoZSBzd3QuamFyIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCi0jIGlmIEFORFJPSURfU1dUIGlzIGRlZmluZWQsIHRoZW4ganVzdCB1c2UgdGhpcy4KLSMgZWxzZSwgaWYgcnVubmluZyBpbiB0aGUgQW5kcm9pZCBzb3VyY2UgdHJlZSwgdGhlbiBsb29rIGZvciB0aGUgY29ycmVjdCBzd3QgZm9sZGVyIGluIHByZWJ1aWx0Ci0jIGVsc2UsIGxvb2sgZm9yIHRoZSBjb3JyZWN0IHN3dCBmb2xkZXIgaW4gdGhlIFNESyB1bmRlciB0b29scy9saWIvCi1zd3RwYXRoPSIiCi1pZiBbIC1uICIkQU5EUk9JRF9TV1QiIF07IHRoZW4KLSAgICBzd3RwYXRoPSIkQU5EUk9JRF9TV1QiCi1lbHNlCi0gICAgdm1hcmNoPWAke2phdmFfY21kfSAtamFyICIke2ZyYW1ld29ya2Rpcn0iL2FyY2hxdWVyeS5qYXJgCi0gICAgaWYgWyAtbiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCi0gICAgICAgIG9zbmFtZT1gdW5hbWUgLXMgfCB0ciBBLVogYS16YAotICAgICAgICBzd3RwYXRoPSIke0FORFJPSURfQlVJTERfVE9QfS9wcmVidWlsdC8ke29zbmFtZX0tJHt2bWFyY2h9L3N3dCIKLSAgICBlbHNlCi0gICAgICAgIHN3dHBhdGg9IiR7ZnJhbWV3b3JrZGlyfS8ke3ZtYXJjaH0iCi0gICAgZmkKLWZpCi0KLSMgQ29tYmluZSB0aGUgc3d0cGF0aCBhbmQgdGhlIGZyYW1ld29yayBkaXIgcGF0aC4KLWlmIFsgLWQgIiRzd3RwYXRoIiBdOyB0aGVuCi0gICAgZnJhbWV3b3JrZGlyPSIke3N3dHBhdGh9OiR7ZnJhbWV3b3JrZGlyfSIKLWVsc2UKLSAgICBlY2hvICJTV1QgZm9sZGVyICcke3N3dHBhdGh9JyBkb2VzIG5vdCBleGlzdC4iCi0gICAgZWNobyAiUGxlYXNlIGV4cG9ydCBBTkRST0lEX1NXVCB0byBwb2ludCB0byB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgc3d0LmphciBmb3IgeW91ciBwbGF0Zm9ybS4iCi0gICAgZXhpdCAxCi1maQotCi1pZiBbIC16ICIkMSIgXTsgdGhlbgotICAgIGVjaG8gIlN0YXJ0aW5nIEFuZHJvaWQgU0RLIGFuZCBBVkQgTWFuYWdlciIKLWZpCi0KLSMgbmVlZCB0byB1c2UgImphdmEuZXh0LmRpcnMiIGJlY2F1c2UgIi1qYXIiIGNhdXNlcyBjbGFzc3BhdGggdG8gYmUgaWdub3JlZAotIyBtaWdodCBuZWVkIG1vcmUgbWVtb3J5LCBlLmcuIC1YbXgxMjhNCi1leGVjICIkamF2YV9jbWQiIC1YbXgyNTZNICRvc19vcHRzICRqYXZhX2RlYnVnIC1EamF2YS5leHQuZGlycz0iJGZyYW1ld29ya2RpciIgLURjb20uYW5kcm9pZC5zZGttYW5hZ2VyLnRvb2xzZGlyPSIkcHJvZ2RpciIgLWphciAiJGphcnBhdGgiICIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9hbmRyb2lkLmJhdCBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9hbmRyb2lkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTg3OTBjZS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2FwcC9ldGMvYW5kcm9pZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotcmVtCi1yZW0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1yZW0geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotcmVtIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotcmVtCi1yZW0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIGRvbid0IG1vZGlmeSB0aGUgY2FsbGVyJ3MgZW52aXJvbm1lbnQKLXNldGxvY2FsCi0KLXJlbSBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLXJlbSBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5Lgotc2V0IHByb2c9JX5mMAotCi1yZW0gR3JhYiBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgd2UgY2hhbmdlIGl0Ci1zZXQgd29ya2Rpcj0lY2QlCi0KLXJlbSBDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgYW5kIGRyaXZlIHRvIHdoZXJlIHRoZSBzY3JpcHQgaXMsIHRvIGF2b2lkCi1yZW0gaXNzdWVzIHdpdGggZGlyZWN0b3JpZXMgY29udGFpbmluZyB3aGl0ZXNwYWNlcy4KLWNkIC9kICV+ZHAwCi0KLXNldCBqYXJwYXRoPWxpYlxzZGttYW5hZ2VyLmphcgotCi1yZW0gU2V0IFNXVC5KYXIgcGF0aCBiYXNlZCBvbiBjdXJyZW50IGFyY2hpdGVjdHVyZSAoeDg2IG9yIHg4Nl82NCkKLWZvciAvZiAlJWEgaW4gKCdqYXZhIC1qYXIgbGliXGFyY2hxdWVyeS5qYXInKSBkbyBzZXQgc3d0X3BhdGg9bGliXCUlYQotCi1pZiAiJTEgJTIiPT0idXBkYXRlIHNkayIgZ290byBTdGFydFVpCi1pZiBub3QgIiUxIj09IiIgZ290byBFbmRUZW1wQ29weQotOlN0YXJ0VWkKLSAgICBlY2hvIFN0YXJ0aW5nIEFuZHJvaWQgU0RLIGFuZCBBVkQgTWFuYWdlcgotCi0gICAgcmVtIFdlJ3JlIG5vdyBnb2luZyB0byBjcmVhdGUgYSB0ZW1wIGRpciB0byBob2xkIGFsbCB0aGUgSmFyIGZpbGVzIG5lZWRlZAotICAgIHJlbSB0byBydW4gdGhlIGFuZHJvaWQgdG9vbCwgY29weSB0aGVtIGluIHRoZSB0ZW1wIGRpciBhbmQgZmluYWxseSBleGVjdXRlCi0gICAgcmVtIGZyb20gdGhhdCBwYXRoLiBXZSBkbyB0aGlzIG9ubHkgd2hlbiB0aGUgbGF1bmNoZXIgaXMgcnVuIHdpdGhvdXQKLSAgICByZW0gYXJndW1lbnRzLCB0byBkaXNwbGF5IHRoZSBTREsgVXBkYXRlciBVSS4gVGhpcyBhbGxvd3MgdGhlIHVwZGF0ZXIgdG8KLSAgICByZW0gdXBkYXRlIHRoZSB0b29scyBkaXJlY3Rvcnkgd2hlcmUgdGhlIHVwZGF0ZXIgaXRzZWxmIGlzIGxvY2F0ZWQuCi0KLSAgICBzZXQgdG1wZGlyPSVURU1QJVx0ZW1wLWFuZHJvaWQtdG9vbAotICAgIHhjb3B5IGxpYlx4ODYgJXRtcGRpciVcbGliXHg4NiAvSSAvRSAvQyAvRyAvUiAvWSAvUSA+IG51bAotICAgIGNvcHkgL0IgL0QgL1kgbGliXGFuZHJvaWRwcmVmcy5qYXIgICAldG1wZGlyJVxsaWJcICAgICAgID4gbnVsCi0gICAgY29weSAvQiAvRCAvWSBsaWJcb3JnLmVjbGlwc2UuKiAgICAgICV0bXBkaXIlXGxpYlwgICAgICAgPiBudWwKLSAgICBjb3B5IC9CIC9EIC9ZIGxpYlxzZGsqICAgICAgICAgICAgICAgJXRtcGRpciVcbGliXCAgICAgICA+IG51bAotICAgIGNvcHkgL0IgL0QgL1kgbGliXGNvbW1vbnMtY29tcHJlc3MqICAldG1wZGlyJVxsaWJcICAgICAgID4gbnVsCi0KLSAgICByZW0gamFycGF0aCBhbmQgc3d0X3BhdGggYXJlIHJlbGF0aXZlIHRvIFBXRCBzbyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGVtLCBqdXN0IGNoYW5nZSBkaXJzLgotICAgIHNldCB0b29sc2Rpcj0lY2QlCi0gICAgY2QgJXRtcGRpciUKLQotOkVuZFRlbXBDb3B5Ci0gICAgCi1yZW0gVGhlIGdsb2JhbCBBTkRST0lEX1NXVCBhbHdheXMgb3ZlcnJpZGUgdGhlIFNXVC5KYXIgcGF0aAotaWYgZGVmaW5lZCBBTkRST0lEX1NXVCBzZXQgc3d0X3BhdGg9JUFORFJPSURfU1dUJQotCi1pZiBleGlzdCAlc3d0X3BhdGglIGdvdG8gU2V0UGF0aAotICAgIGVjaG8gU1dUIGZvbGRlciAnJXN3dF9wYXRoJScgZG9lcyBub3QgZXhpc3QuCi0gICAgZWNobyBQbGVhc2Ugc2V0IEFORFJPSURfU1dUIHRvIHBvaW50IHRvIHRoZSBmb2xkZXIgY29udGFpbmluZyBzd3QuamFyIGZvciB5b3VyIHBsYXRmb3JtLgotICAgIGV4aXQgL0IKLQotOlNldFBhdGgKLXNldCBqYXZhZXh0ZGlycz0lc3d0X3BhdGglO2xpYlwKLQotY2FsbCBqYXZhIC1EamF2YS5leHQuZGlycz0lamF2YWV4dGRpcnMlIC1EY29tLmFuZHJvaWQuc2RrbWFuYWdlci50b29sc2Rpcj0iJXRvb2xzZGlyJSIgLURjb20uYW5kcm9pZC5zZGttYW5hZ2VyLndvcmtkaXI9IiV3b3JrZGlyJSIgLWphciAlamFycGF0aCUgJSoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy9zZGttYW5hZ2VyL2FwcC9ldGMvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc2NjM0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL2V0Yy9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWluLUNsYXNzOiBjb20uYW5kcm9pZC5zZGttYW5hZ2VyLk1haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWExMTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAuCi0KLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSAuLi9ldGMvbWFuaWZlc3QudHh0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0JYW5kcm9pZHByZWZzIFwKLQlzZGtsaWIgXAotCXNka3VpbGliIFwKLQlzd3QgXAotCW9yZy5lY2xpcHNlLmpmYWNlXzMuNC4yLk0yMDA5MDEwNy0wODAwIFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbl8zLjQuMC52MjAwODA0MjEtMjAwNiBcCi0Jb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kc18zLjQuMC5JMjAwODA1MDktMjAwMAotCi1MT0NBTF9NT0RVTEUgOj0gc2RrbWFuYWdlcgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL0NvbW1hbmRMaW5lUHJvY2Vzc29yLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2FwcC9zcmMvY29tL2FuZHJvaWQvc2RrbWFuYWdlci9Db21tYW5kTGluZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjEwNWVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL0NvbW1hbmRMaW5lUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhbmQgc3RvcmVzIGZsYWdzIG5lZWRlZCBvciByZXF1ZXN0ZWQuCi0gKiA8cC8+Ci0gKiBUaGlzIGlzIGEgYmFzZSBjbGFzcy4gVG8gYmUgdXNlZnVsIHlvdSB3YW50IHRvOgotICogPHVsPgotICogPGxpPm92ZXJyaWRlIGl0LgotICogPGxpPnBhc3MgYW4gYWN0aW9uIGFycmF5IHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqIDxsaT5kZWZpbmUgZmxhZ3MgZm9yIHlvdXIgYWN0aW9ucy4KLSAqIDwvdWw+Ci0gKiA8cC8+Ci0gKiBUbyB1c2UsIGNhbGwge0BsaW5rICNwYXJzZUFyZ3MoU3RyaW5nW10pfSBhbmQgdGhlbgotICogY2FsbCB7QGxpbmsgI2dldFZhbHVlKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfS4KLSAqLwotY2xhc3MgQ29tbWFuZExpbmVQcm9jZXNzb3IgewotCi0gICAgLyoKLSAgICAgKiBTdGVwcyBuZWVkZWQgdG8gYWRkIGEgbmV3IGFjdGlvbjoKLSAgICAgKiAtIEVhY2ggYWN0aW9uIGlzIGRlZmluZWQgYXMgYSAidmVyYiBvYmplY3QiIGZvbGxvd2VkIGJ5IHBhcmFtZXRlcnMuCi0gICAgICogLSBFaXRoZXIgcmV1c2UgYSBWRVJCXyBjb25zdGFudCBvciBkZWZpbmUgYSBuZXcgb25lLgotICAgICAqIC0gRWl0aGVyIHJldXNlIGFuIE9CSkVDVF8gY29uc3RhbnQgb3IgZGVmaW5lIGEgbmV3IG9uZS4KLSAgICAgKiAtIEFkZCBhIG5ldyBlbnRyeSB0byBtQWN0aW9uIHdpdGggYSBvbmUtbGluZSBoZWxwIHN1bW1hcnkuCi0gICAgICogLSBJbiB0aGUgY29uc3RydWN0b3IsIGFkZCBhIGRlZmluZSgpIGNhbGwgZm9yIGVhY2ggcGFyYW1ldGVyIChlaXRoZXIgbWFuZGF0b3J5Ci0gICAgICogICBvciBvcHRpb25hbCkgZm9yIHRoZSBnaXZlbiBhY3Rpb24uCi0gICAgICovCi0KLSAgICAvKiogSW50ZXJuYWwgdmVyYiBuYW1lIGZvciBpbnRlcm5hbGx5IGhpZGRlbiBmbGFncy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHTE9CQUxfRkxBR19WRVJCID0gIkBAaW50ZXJuYWxAQCI7Ci0KLSAgICAvKiogU3RyaW5nIHRvIHVzZSB3aGVuIHRoZSB2ZXJiIGRvZXNuJ3QgbmVlZCBhbnkgb2JqZWN0LiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PX1ZFUkJfT0JKRUNUID0gIiI7Ci0KLSAgICAvKiogVGhlIGdsb2JhbCBoZWxwIGZsYWcuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hFTFAgPSAiaGVscCI7Ci0gICAgLyoqIFRoZSBnbG9iYWwgdmVyYm9zZSBmbGFnLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJCT1NFID0gInZlcmJvc2UiOwotICAgIC8qKiBUaGUgZ2xvYmFsIHNpbGVudCBmbGFnLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSUxFTlQgPSAic2lsZW50IjsKLQotICAgIC8qKiBWZXJiIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gTnVsbCBpZiBub25lIHNwZWNpZmllZCwgd2hpY2ggd2lsbCBiZSBhbiBlcnJvci4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVmVyYlJlcXVlc3RlZDsKLSAgICAvKiogRGlyZWN0IG9iamVjdCByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuIENhbiBiZSBudWxsLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1EaXJlY3RPYmplY3RSZXF1ZXN0ZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBY3Rpb24gZGVmaW5pdGlvbnMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbGlzdCBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBmaXJzdCBpdCBpcyB1c2VkIHRvIGtub3cgd2hpY2ggdmVyYi9vYmplY3QKLSAgICAgKiBhY3Rpb25zIGFyZSBhY2NlcHRhYmxlIG9uIHRoZSBjb21tYW5kLWxpbmU7IHNlY29uZCBpdCBwcm92aWRlcyBhIHN1bW1hcnkKLSAgICAgKiBmb3IgZWFjaCBhY3Rpb24gdGhhdCBpcyBwcmludGVkIGluIHRoZSBoZWxwLgotICAgICAqIDxwLz4KLSAgICAgKiBFYWNoIGVudHJ5IGlzIGEgc3RyaW5nIGFycmF5IHdpdGg6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4gdGhlIHZlcmIuCi0gICAgICogPGxpPiBhIGRpcmVjdCBvYmplY3QgKHVzZSB7QGxpbmsgI05PX1ZFUkJfT0JKRUNUfSBpZiB0aGVyZSdzIG5vIG9iamVjdCkuCi0gICAgICogPGxpPiBhIGRlc2NyaXB0aW9uLgotICAgICAqIDxsaT4gYW4gYWx0ZXJuYXRlIGZvcm0gZm9yIHRoZSBvYmplY3QgKGUuZy4gcGx1cmFsKS4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW11bXSBtQWN0aW9uczsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVkVSQl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9PQkpFQ1RfSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fREVTQ19JTkRFWCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9BTFRfT0JKRUNUX0lOREVYID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXAgb2YgYWxsIGRlZmluZWQgYXJndW1lbnRzLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUga2V5IGlzIGEgc3RyaW5nICJ2ZXJiL2RpcmVjdE9iamVjdC9sb25nTmFtZSIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQXJnPiBtQXJndW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcmc+KCk7Ci0gICAgLyoqIExvZ2dlciAqLwotICAgIHByaXZhdGUgZmluYWwgSVNka0xvZyBtTG9nOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBjb21tYW5kLWxpbmUgcHJvY2Vzc29yLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvZ2dlciBBbiBTREsgbG9nZ2VyIG9iamVjdC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgbGlzdCBvZiBhY3Rpb25zIHJlY29nbml6ZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KLSAgICAgKiAgICAgICAgICAgICAgICBTZWUgdGhlIGphdmFkb2Mgb2Yge0BsaW5rICNtQWN0aW9uc30gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKgotICAgICAqIEBzZWUgI21BY3Rpb25zCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRMaW5lUHJvY2Vzc29yKElTZGtMb2cgbG9nZ2VyLCBTdHJpbmdbXVtdIGFjdGlvbnMpIHsKLSAgICAgICAgbUxvZyA9IGxvZ2dlcjsKLSAgICAgICAgbUFjdGlvbnMgPSBhY3Rpb25zOwotCi0gICAgICAgIGRlZmluZShNb2RlLkJPT0xFQU4sIGZhbHNlLCBHTE9CQUxfRkxBR19WRVJCLCBOT19WRVJCX09CSkVDVCwgInYiLCBLRVlfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiVmVyYm9zZSBtb2RlOiBlcnJvcnMsIHdhcm5pbmdzIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFyZSBwcmludGVkLiIsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBkZWZpbmUoTW9kZS5CT09MRUFOLCBmYWxzZSwgR0xPQkFMX0ZMQUdfVkVSQiwgTk9fVkVSQl9PQkpFQ1QsICJzIiwgS0VZX1NJTEVOVCwKLSAgICAgICAgICAgICAgICAiU2lsZW50IG1vZGU6IG9ubHkgZXJyb3JzIGFyZSBwcmludGVkIG91dC4iLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuQk9PTEVBTiwgZmFsc2UsIEdMT0JBTF9GTEFHX1ZFUkIsIE5PX1ZFUkJfT0JKRUNULCAiaCIsIEtFWV9IRUxQLAotICAgICAgICAgICAgICAgICJUaGlzIGhlbHAuIiwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29tbWFuZC1saW5lIGNhbiB3b3JrIHdoZW4gbm8gdmVyYiBpcyBzcGVjaWZpZWQuCi0gICAgICogVGhlIGRlZmF1bHQgaXMgZmFsc2UsIHdoaWNoIGdlbmVyYXRlcyBhbiBlcnJvciB3aGVuIG5vIHZlcmIvb2JqZWN0IGlzIHNwZWNpZmllZC4KLSAgICAgKiBEZXJpdmVkIGltcGxlbWVudGF0aW9ucyBjYW4gc2V0IHRoaXMgdG8gdHJ1ZSBpZiB0aGV5IGNhbiBkZWFsIHdpdGggYSBsYWNrCi0gICAgICogb2YgdmVyYi9hY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0TGFja09mVmVyYigpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBIZWxwZXJzIHRvIGdldCBmbGFncyB2YWx1ZXMKLQotICAgIC8qKiBIZWxwZXIgdGhhdCByZXR1cm5zIHRydWUgaWYgLS12ZXJib3NlIHdhcyByZXF1ZXN0ZWQuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotICAgICAgICByZXR1cm4gKChCb29sZWFuKSBnZXRWYWx1ZShHTE9CQUxfRkxBR19WRVJCLCBOT19WRVJCX09CSkVDVCwgS0VZX1ZFUkJPU0UpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiogSGVscGVyIHRoYXQgcmV0dXJucyB0cnVlIGlmIC0tc2lsZW50IHdhcyByZXF1ZXN0ZWQuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaWxlbnQoKSB7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGdldFZhbHVlKEdMT0JBTF9GTEFHX1ZFUkIsIE5PX1ZFUkJfT0JKRUNULCBLRVlfU0lMRU5UKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqIEhlbHBlciB0aGF0IHJldHVybnMgdHJ1ZSBpZiAtLWhlbHAgd2FzIHJlcXVlc3RlZC4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlbHBSZXF1ZXN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGdldFZhbHVlKEdMT0JBTF9GTEFHX1ZFUkIsIE5PX1ZFUkJfT0JKRUNULCBLRVlfSEVMUCkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJiIG5hbWUgZnJvbSB0aGUgY29tbWFuZC1saW5lLiBDYW4gYmUgbnVsbC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcmIoKSB7Ci0gICAgICAgIHJldHVybiBtVmVyYlJlcXVlc3RlZDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZGlyZWN0IG9iamVjdCBuYW1lIGZyb20gdGhlIGNvbW1hbmQtbGluZS4gQ2FuIGJlIG51bGwuICovCi0gICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlyZWN0T2JqZWN0UmVxdWVzdGVkOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSYXcgYWNjZXNzIHRvIHBhcnNlZCBwYXJhbWV0ZXIgdmFsdWVzLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyB0byBzY2FuIGFsbCBwYXJhbWV0ZXJzLiBQYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc2V0IG9uIHRoZQotICAgICAqIGNvbW1hbmQgbGluZSBhcmUgcmV0dXJuZWQgZmlyc3QuIE90aGVyd2lzZSBvbmUgd2l0aCBhIG5vbi1udWxsIHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBCb3RoIGEgdmVyYiBhbmQgYSBkaXJlY3Qgb2JqZWN0IGZpbHRlciBjYW4gYmUgc3BlY2lmaWVkLiBXaGVuIHRoZXkgYXJlIG5vbi1udWxsIHRoZXkgbGltaXQKLSAgICAgKiB0aGUgc2NvcGUgb2YgdGhlIHNlYXJjaC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgbm90aGluZyBoYXMgYmVlbiBmb3VuZCwgcmV0dXJuIHRoZSBsYXN0IGRlZmF1bHQgdmFsdWUgc2VlbiBtYXRjaGluZyB0aGUgZmlsdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHZlcmIgVGhlIHZlcmIgbmFtZSwgaW5jbHVkaW5nIHtAbGluayAjR0xPQkFMX0ZMQUdfVkVSQn0uIElmIG51bGwsIGFsbCBwb3NzaWJsZQotICAgICAqICAgICAgICAgICAgIHZlcmJzIHRoYXQgbWF0Y2ggdGhlIGRpcmVjdCBvYmplY3QgY29uZGl0aW9uIHdpbGwgYmUgZXhhbWluZWQgYW5kIHRoZSBmaXJzdAotICAgICAqICAgICAgICAgICAgIHZhbHVlIHNldCB3aWxsIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGRpcmVjdE9iamVjdCBUaGUgZGlyZWN0IG9iamVjdCBuYW1lLCBpbmNsdWRpbmcge0BsaW5rICNOT19WRVJCX09CSkVDVH0uIElmIG51bGwsCi0gICAgICogICAgICAgICAgICAgYWxsIHBvc3NpYmxlIGRpcmVjdCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHZlcmIgY29uZGl0aW9uIHdpbGwgYmUgZXhhbWluZWQgYW5kCi0gICAgICogICAgICAgICAgICAgdGhlIGZpcnN0IHZhbHVlIHNldCB3aWxsIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGxvbmdGbGFnTmFtZSBUaGUgbG9uZyBmbGFnIG5hbWUgZm9yIHRoZSBnaXZlbiBhY3Rpb24uIE1hbmRhdG9yeS4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBwYXJhbWV0ZXIsIHdoaWNoIGRlcGVuZHMgb24gdGhlIGFyZ3VtZW50IG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgdmVyYiwgU3RyaW5nIGRpcmVjdE9iamVjdCwgU3RyaW5nIGxvbmdGbGFnTmFtZSkgewotCi0gICAgICAgIGlmICh2ZXJiICE9IG51bGwgJiYgZGlyZWN0T2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSB2ZXJiICsgIi8iICsgZGlyZWN0T2JqZWN0ICsgIi8iICsgbG9uZ0ZsYWdOYW1lOwotICAgICAgICAgICAgQXJnIGFyZyA9IG1Bcmd1bWVudHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gYXJnLmdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGxhc3REZWZhdWx0ID0gbnVsbDsKLSAgICAgICAgZm9yIChBcmcgYXJnIDogbUFyZ3VtZW50cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGFyZy5nZXRMb25nQXJnKCkuZXF1YWxzKGxvbmdGbGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmVyYiA9PSBudWxsIHx8IGFyZy5nZXRWZXJiKCkuZXF1YWxzKHZlcmIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RPYmplY3QgPT0gbnVsbCB8fCBhcmcuZ2V0RGlyZWN0T2JqZWN0KCkuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuaXNJbkNvbW1hbmRMaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLmdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDdXJyZW50VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHQgPSBhcmcuZ2V0Q3VycmVudFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGFzdERlZmF1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgc2V0dGVyIGZvciByYXcgcGFyYW1ldGVyIHZhbHVlLgotICAgICAqIEBwYXJhbSB2ZXJiIFRoZSB2ZXJiIG5hbWUsIGluY2x1ZGluZyB7QGxpbmsgI0dMT0JBTF9GTEFHX1ZFUkJ9LgotICAgICAqIEBwYXJhbSBkaXJlY3RPYmplY3QgVGhlIGRpcmVjdCBvYmplY3QgbmFtZSwgaW5jbHVkaW5nIHtAbGluayAjTk9fVkVSQl9PQkpFQ1R9LgotICAgICAqIEBwYXJhbSBsb25nRmxhZ05hbWUgVGhlIGxvbmcgZmxhZyBuYW1lIGZvciB0aGUgZ2l2ZW4gYWN0aW9uLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGN1cnJlbnQgdmFsdWUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgcGFyYW1ldGVyLCB3aGljaCBkZXBlbmRzIG9uIHRoZQotICAgICAqICAgICAgICAgICAgICBhcmd1bWVudCBtb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2ZXJiLCBTdHJpbmcgZGlyZWN0T2JqZWN0LCBTdHJpbmcgbG9uZ0ZsYWdOYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHZlcmIgKyAiLyIgKyBkaXJlY3RPYmplY3QgKyAiLyIgKyBsb25nRmxhZ05hbWU7Ci0gICAgICAgIEFyZyBhcmcgPSBtQXJndW1lbnRzLmdldChrZXkpOwotICAgICAgICBhcmcuc2V0Q3VycmVudFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZXhpdCBhbmQgbm90IHJldHVybiBpZiBhIHBhcnNpbmcgZXJyb3IgYXJpc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHR5cGljYWxseSByZWNlaXZlZCBieSBhIG1haW4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZyBuZWVkc0hlbHAgPSBudWxsOwotICAgICAgICBTdHJpbmcgdmVyYiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBkaXJlY3RPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgbiA9IGFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBcmcgYXJnID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYSA9IGFyZ3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGEuc3RhcnRzV2l0aCgiLS0iKSkgewotICAgICAgICAgICAgICAgICAgICBhcmcgPSBmaW5kTG9uZ0FyZyh2ZXJiLCBkaXJlY3RPYmplY3QsIGEuc3Vic3RyaW5nKDIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZyA9IGZpbmRTaG9ydEFyZyh2ZXJiLCBkaXJlY3RPYmplY3QsIGEuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBObyBtYXRjaGluZyBhcmd1bWVudCBuYW1lIGZvdW5kCi0gICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvZXMgaXQgbG9va3MgbGlrZSBhIGRhc2hlZCBwYXJhbWV0ZXI/Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmIgPT0gbnVsbCB8fCBkaXJlY3RPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgYSBkYXNoZWQgcGFyYW1ldGVyIGFuZCB3ZSBkb24ndCBoYXZlIGEgYSB2ZXJiL29iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB5ZXQsIHRoZSBwYXJhbWV0ZXIgd2FzIGp1c3QgZ2l2ZW4gdG9vIGVhcmx5LgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNIZWxwID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWcgJyUxJHMnIGlzIG5vdCBhIHZhbGlkIGdsb2JhbCBmbGFnLiBEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSBpdCBhZnRlciB0aGUgdmVyYi9vYmplY3QgbmFtZT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgYSBkYXNoZWQgcGFyYW1ldGVyIGFuZCBidXQgaXQgaXMgdW5rbm93biBieSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyYi1vYmplY3QgY29tYmluYXRpb24KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxhZyAnJTEkcycgaXMgbm90IHZhbGlkIGZvciAnJTIkcyAlMyRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgdmVyYiwgZGlyZWN0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmVyYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIHZlcmIgZmlyc3QuIEZpbmQgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZ1tdIGFjdGlvbkRlc2MgOiBtQWN0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25EZXNjW0FDVElPTl9WRVJCX0lOREVYXS5lcXVhbHMoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYiA9IGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgaWYgaXQgd2FzIG5vdCBhIHZhbGlkIHZlcmIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc0hlbHAgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgdmVyYiBhZnRlciBnbG9iYWwgcGFyYW1ldGVycyBidXQgZm91bmQgJyUxJHMnIGluc3RlYWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZW4gZmlsbCB0aGUgZGlyZWN0IG9iamVjdC4gRmluZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nW10gYWN0aW9uRGVzYyA6IG1BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRlc2NbQUNUSU9OX1ZFUkJfSU5ERVhdLmVxdWFscyh2ZXJiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uRGVzY1tBQ1RJT05fT0JKRUNUX0lOREVYXS5lcXVhbHMoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdE9iamVjdCA9IGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25EZXNjLmxlbmd0aCA+IEFDVElPTl9BTFRfT0JKRUNUX0lOREVYICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1tBQ1RJT05fQUxUX09CSkVDVF9JTkRFWF0uZXF1YWxzKGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYWx0ZXJuYXRlIGZvcm0gZXhpc3QgYW5kIGlzIHVzZWQsIHdlIGludGVybmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbWVtb3JpemUgdGhlIGRlZmF1bHQgZGlyZWN0IG9iamVjdCBmb3JtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0T2JqZWN0ID0gYWN0aW9uRGVzY1tBQ1RJT05fT0JKRUNUX0lOREVYXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBpZiBpdCB3YXMgbm90IGEgdmFsaWQgb2JqZWN0IGZvciB0aGF0IHZlcmIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB2ZXJiIGFmdGVyIGdsb2JhbCBwYXJhbWV0ZXJzIGJ1dCBmb3VuZCAnJTEkcycgaW5zdGVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhcmd1bWVudCB3YXMgcHJlc2VudCBvbiB0aGUgY29tbWFuZCBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGFyZy5zZXRJbkNvbW1hbmRMaW5lKHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3Mga2V5d29yZAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmdldE1vZGUoKS5uZWVkc0V4dHJhKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCA9IFN0cmluZy5mb3JtYXQoIk1pc3NpbmcgYXJndW1lbnQgZm9yIGZsYWcgJTEkcy4iLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gYXJnLmdldE1vZGUoKS5wcm9jZXNzKGFyZywgYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGFyZy5nZXRNb2RlKCkucHJvY2VzcyhhcmcsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBqdXN0IHRvZ2dsZWQgaGVscCwgd2Ugd2FudCB0byBleGl0IG5vdyB3aXRob3V0IHByaW50aW5nIGFueSBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgdGVzdCBoZXJlIG9ubHkgd2hlbiBhIEJvb2xlYW4gZmxhZyBpcyB0b2dnbGVkIHNpbmNlIGJvb2xlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdGhlIG9ubHkgZmxhZ3MgdGhhdCBkb24ndCB0YWtlIHBhcmFtZXRlcnMgYW5kIGhlbHAgaXMgYSBib29sZWFuLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGVscFJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWxwQW5kRXhpdChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCBhYm92ZSBzaG91bGQgdGVybWluYXRlIGhvd2V2ZXIgaW4gdW5pdCB0ZXN0cyB3ZSBvdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHNvIHdlIHN0aWxsIG5lZWQgdG8gcmV0dXJuIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCA9IFN0cmluZy5mb3JtYXQoIkludmFsaWQgdXNhZ2UgZm9yIGZsYWcgJTEkczogJTIkcy4iLCBhLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkc0hlbHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJiID09IG51bGwgJiYgIWFjY2VwdExhY2tPZlZlcmIoKSkgewotICAgICAgICAgICAgICAgICAgICBuZWVkc0hlbHAgPSAiTWlzc2luZyB2ZXJiIG5hbWUuIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcmIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHZlcmIgaGFzIGFuIG9wdGlvbmFsIGRpcmVjdCBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nW10gYWN0aW9uRGVzYyA6IG1BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRlc2NbQUNUSU9OX1ZFUkJfSU5ERVhdLmVxdWFscyh2ZXJiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1tBQ1RJT05fT0JKRUNUX0lOREVYXS5lcXVhbHMoTk9fVkVSQl9PQkpFQ1QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdE9iamVjdCA9IE5PX1ZFUkJfT0JKRUNUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCA9IFN0cmluZy5mb3JtYXQoIk1pc3Npbmcgb2JqZWN0IG5hbWUgZm9yIHZlcmIgJyUxJHMnLiIsIHZlcmIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYWxsIG1hbmRhdG9yeSBhcmd1bWVudHMgYXJlIG5vbi1udWxsIGZvciB0aGlzIGFjdGlvbgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWlzc2luZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGx1cmFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBBcmc+IGVudHJ5IDogbUFyZ3VtZW50cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcmcgYXJnID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuZ2V0VmVyYigpLmVxdWFscyh2ZXJiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuZ2V0RGlyZWN0T2JqZWN0KCkuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlzTWFuZGF0b3J5KCkgJiYgYXJnLmdldEN1cnJlbnRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyA9ICItLSIgKyBhcmcuZ2V0TG9uZ0FyZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyArPSAiLCAtLSIgKyBhcmcuZ2V0TG9uZ0FyZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1cmFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzSGVscCAgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICUxJHMgJTIkcyBtdXN0IGJlIGRlZmluZWQgZm9yIGFjdGlvbiAnJTMkcyAlNCRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXJhbCA/ICJwYXJhbWV0ZXJzIiA6ICJwYXJhbWV0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVZlcmJSZXF1ZXN0ZWQgPSB2ZXJiOwotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T2JqZWN0UmVxdWVzdGVkID0gZGlyZWN0T2JqZWN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChuZWVkc0hlbHAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50SGVscEFuZEV4aXRGb3JBY3Rpb24odmVyYiwgZGlyZWN0T2JqZWN0LCBuZWVkc0hlbHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYW4ge0BsaW5rIEFyZ30gZ2l2ZW4gYW4gYWN0aW9uIG5hbWUgYW5kIGEgbG9uZyBmbGFnIG5hbWUuCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIEFyZ30gZm91bmQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJnIGZpbmRMb25nQXJnKFN0cmluZyB2ZXJiLCBTdHJpbmcgZGlyZWN0T2JqZWN0LCBTdHJpbmcgbG9uZ05hbWUpIHsKLSAgICAgICAgaWYgKHZlcmIgPT0gbnVsbCkgewotICAgICAgICAgICAgdmVyYiA9IEdMT0JBTF9GTEFHX1ZFUkI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpcmVjdE9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXJlY3RPYmplY3QgPSBOT19WRVJCX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcga2V5ID0gdmVyYiArICIvIiArIGRpcmVjdE9iamVjdCArICIvIiArIGxvbmdOYW1lOwotICAgICAgICByZXR1cm4gbUFyZ3VtZW50cy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbiB7QGxpbmsgQXJnfSBnaXZlbiBhbiBhY3Rpb24gbmFtZSBhbmQgYSBzaG9ydCBmbGFnIG5hbWUuCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIEFyZ30gZm91bmQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJnIGZpbmRTaG9ydEFyZyhTdHJpbmcgdmVyYiwgU3RyaW5nIGRpcmVjdE9iamVjdCwgU3RyaW5nIHNob3J0TmFtZSkgewotICAgICAgICBpZiAodmVyYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2ZXJiID0gR0xPQkFMX0ZMQUdfVkVSQjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlyZWN0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpcmVjdE9iamVjdCA9IE5PX1ZFUkJfT0JKRUNUOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIEFyZz4gZW50cnkgOiBtQXJndW1lbnRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEFyZyBhcmcgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGFyZy5nZXRWZXJiKCkuZXF1YWxzKHZlcmIpICYmIGFyZy5nZXREaXJlY3RPYmplY3QoKS5lcXVhbHMoZGlyZWN0T2JqZWN0KSkgewotICAgICAgICAgICAgICAgIGlmIChzaG9ydE5hbWUuZXF1YWxzKGFyZy5nZXRTaG9ydEFyZygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgaGVscC91c2FnZSBhbmQgZXhpdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JGb3JtYXQgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZSB0byBwcmludCBwcmlvciB0byB1c2FnZSB1c2luZyBTdHJpbmcuZm9ybWF0Ci0gICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIGZvciBTdHJpbmcuZm9ybWF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIZWxwQW5kRXhpdChTdHJpbmcgZXJyb3JGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIHByaW50SGVscEFuZEV4aXRGb3JBY3Rpb24obnVsbCAvKnZlcmIqLywgbnVsbCAvKmRpcmVjdE9iamVjdCovLCBlcnJvckZvcm1hdCwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBoZWxwL3VzYWdlIGFuZCBleGl0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2ZXJiIElmIG51bGwsIGRpc3BsYXlzIGhlbHAgZm9yIGFsbCB2ZXJicy4gSWYgbm90IG51bGwsIGRpc3BsYXkgaGVscCBvbmx5Ci0gICAgICogICAgICAgICAgZm9yIHRoYXQgc3BlY2lmaWMgdmVyYi4gSW4gYWxsIGNhc2VzIGFsc28gZGlzcGxheXMgZ2VuZXJhbCB1c2FnZSBhbmQgYWN0aW9uIGxpc3QuCi0gICAgICogQHBhcmFtIGRpcmVjdE9iamVjdCBJZiBudWxsLCBkaXNwbGF5cyBoZWxwIGZvciBhbGwgdmVyYiBvYmplY3RzLgotICAgICAqICAgICAgICAgIElmIG5vdCBudWxsLCBkaXNwbGF5cyBoZWxwIG9ubHkgZm9yIHRoYXQgc3BlY2lmaWMgYWN0aW9uCi0gICAgICogICAgICAgICAgSW4gYWxsIGNhc2VzIGFsc28gZGlzcGxheSBnZW5lcmFsIHVzYWdlIGFuZCBhY3Rpb24gbGlzdC4KLSAgICAgKiBAcGFyYW0gZXJyb3JGb3JtYXQgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZSB0byBwcmludCBwcmlvciB0byB1c2FnZSB1c2luZyBTdHJpbmcuZm9ybWF0Ci0gICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIGZvciBTdHJpbmcuZm9ybWF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIZWxwQW5kRXhpdEZvckFjdGlvbihTdHJpbmcgdmVyYiwgU3RyaW5nIGRpcmVjdE9iamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlcnJvckZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgaWYgKGVycm9yRm9ybWF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0ZGVycihlcnJvckZvcm1hdCwgYXJncyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiB1c2FnZSBzaG91bGQgZml0IGluIDgwIGNvbHVtbnMKLSAgICAgICAgICogICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MAotICAgICAgICAgKi8KLSAgICAgICAgc3Rkb3V0KCJcbiIgKwotICAgICAgICAgICAgIlVzYWdlOlxuIiArCi0gICAgICAgICAgICAiICBhbmRyb2lkIFtnbG9iYWwgb3B0aW9uc10gYWN0aW9uIFthY3Rpb24gb3B0aW9uc11cbiIgKwotICAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICAiR2xvYmFsIG9wdGlvbnM6Iik7Ci0gICAgICAgIGxpc3RPcHRpb25zKEdMT0JBTF9GTEFHX1ZFUkIsIE5PX1ZFUkJfT0JKRUNUKTsKLQotICAgICAgICBpZiAodmVyYiA9PSBudWxsIHx8IGRpcmVjdE9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGRvdXQoIlxuVmFsaWQgYWN0aW9ucyBhcmUgY29tcG9zZWQgb2YgYSB2ZXJiIGFuZCBhbiBvcHRpb25hbCBkaXJlY3Qgb2JqZWN0OiIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmdbXSBhY3Rpb24gOiBtQWN0aW9ucykgewotCi0gICAgICAgICAgICAgICAgc3Rkb3V0KCItICUxJDZzICUyJC0xMnM6ICUzJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uW0FDVElPTl9WRVJCX0lOREVYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbltBQ1RJT05fT0JKRUNUX0lOREVYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbltBQ1RJT05fREVTQ19JTkRFWF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmdbXSBhY3Rpb24gOiBtQWN0aW9ucykgewotICAgICAgICAgICAgaWYgKHZlcmIgPT0gbnVsbCB8fCB2ZXJiLmVxdWFscyhhY3Rpb25bQUNUSU9OX1ZFUkJfSU5ERVhdKSkgewotICAgICAgICAgICAgICAgIGlmIChkaXJlY3RPYmplY3QgPT0gbnVsbCB8fCBkaXJlY3RPYmplY3QuZXF1YWxzKGFjdGlvbltBQ1RJT05fT0JKRUNUX0lOREVYXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3Rkb3V0KCJcbkFjdGlvbiBcIiUxJHMgJTIkc1wiOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uW0FDVElPTl9WRVJCX0lOREVYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25bQUNUSU9OX09CSkVDVF9JTkRFWF0pOwotICAgICAgICAgICAgICAgICAgICBzdGRvdXQoIiAgJTEkcyIsIGFjdGlvbltBQ1RJT05fREVTQ19JTkRFWF0pOwotICAgICAgICAgICAgICAgICAgICBzdGRvdXQoIk9wdGlvbnM6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RPcHRpb25zKGFjdGlvbltBQ1RJT05fVkVSQl9JTkRFWF0sIGFjdGlvbltBQ1RJT05fT0JKRUNUX0lOREVYXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXhpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGhlbHBlciB0byBwcmludCBhbGwgdGhlIG9wdGlvbiBmbGFncyBmb3IgYSBnaXZlbiBhY3Rpb24gbmFtZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0T3B0aW9ucyhTdHJpbmcgdmVyYiwgU3RyaW5nIGRpcmVjdE9iamVjdCkgewotICAgICAgICBpbnQgbnVtT3B0aW9ucyA9IDA7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBBcmc+IGVudHJ5IDogbUFyZ3VtZW50cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBBcmcgYXJnID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChhcmcuZ2V0VmVyYigpLmVxdWFscyh2ZXJiKSAmJiBhcmcuZ2V0RGlyZWN0T2JqZWN0KCkuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1aXJlZCA9ICIiOwotICAgICAgICAgICAgICAgIGlmIChhcmcuaXNNYW5kYXRvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9ICIgW3JlcXVpcmVkXSI7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmdldERlZmF1bHRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHYgOiAoU3RyaW5nW10pIGFyZy5nZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gIiwgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHYgPSBhcmcuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmdldE1vZGUoKSAhPSBNb2RlLkJPT0xFQU4gfHwgdi5lcXVhbHMoQm9vbGVhbi5UUlVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiBbRGVmYXVsdDogIiArIHZhbHVlICsgIl0iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3Rkb3V0KCIgIC0lMSRzICUyJC0xMHMgJTMkcyU0JHMlNSRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5nZXRTaG9ydEFyZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tIiArIGFyZy5nZXRMb25nQXJnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmcuZ2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQpOwotICAgICAgICAgICAgICAgIG51bU9wdGlvbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1PcHRpb25zID09IDApIHsKLSAgICAgICAgICAgIHN0ZG91dCgiICBObyBvcHRpb25zIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0KLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlIG9mIGFuIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB2YXJpYWJsZSBpdCByZXByZXNlbnRzLAotICAgICAqIHdoZXRoZXIgYW4gZXh0cmEgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBmbGFnIGFuZCBob3cgdG8gcGFyc2UgaXQuCi0gICAgICovCi0gICAgc3RhdGljIGVudW0gTW9kZSB7Ci0gICAgICAgIC8qKiBBcmd1bWVudCB2YWx1ZSBpcyBhIEJvb2xlYW4uIERlZmF1bHQgdmFsdWUgaXMgYSBCb29sZWFuLiAqLwotICAgICAgICBCT09MRUFOIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRyYSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvY2VzcyhBcmcgYXJnLCBTdHJpbmcgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAvLyBUb2dnbGUgdGhlIGN1cnJlbnQgdmFsdWUKLSAgICAgICAgICAgICAgICBhcmcuc2V0Q3VycmVudFZhbHVlKCEgKChCb29sZWFuKSBhcmcuZ2V0Q3VycmVudFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQotICAgICAgICAvKiogQXJndW1lbnQgdmFsdWUgaXMgYW4gSW50ZWdlci4gRGVmYXVsdCB2YWx1ZSBpcyBhbiBJbnRlZ2VyLiAqLwotICAgICAgICBJTlRFR0VSIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRyYSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBwcm9jZXNzKEFyZyBhcmcsIFN0cmluZyBleHRyYSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZy5zZXRDdXJyZW50VmFsdWUoSW50ZWdlci5wYXJzZUludChleHRyYSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHBhcnNlICclMSRzJyBhcyBhbiBpbnRlZ2VyOiAlMiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQotICAgICAgICAvKiogQXJndW1lbnQgdmFsdWUgaXMgYSBTdHJpbmcuIERlZmF1bHQgdmFsdWUgaXMgYSBTdHJpbmdbXS4gKi8KLSAgICAgICAgRU5VTSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG5lZWRzRXh0cmEoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvY2VzcyhBcmcgYXJnLCBTdHJpbmcgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGRlc2MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IChTdHJpbmdbXSkgYXJnLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoZXh0cmEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmcuc2V0Q3VycmVudFZhbHVlKGV4dHJhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzYy5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCInJTEkcycgaXMgbm90IG9uZSBvZiAlMiRzIiwgZXh0cmEsIGRlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLyoqIEFyZ3VtZW50IHZhbHVlIGlzIGEgU3RyaW5nLiBEZWZhdWx0IHZhbHVlIGlzIGEgbnVsbC4gKi8KLSAgICAgICAgU1RSSU5HIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRyYSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBwcm9jZXNzKEFyZyBhcmcsIFN0cmluZyBleHRyYSkgewotICAgICAgICAgICAgICAgIGFyZy5zZXRDdXJyZW50VmFsdWUoZXh0cmEpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtb2RlIHJlcXVpcmVzIGFuIGV4dHJhIHBhcmFtZXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG5lZWRzRXh0cmEoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBmbGFnIGZvciB0aGlzIGFyZ3VtZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gYXJnIFRoZSBhcmd1bWVudCBiZWluZyBwcm9jZXNzZWQuCi0gICAgICAgICAqIEBwYXJhbSBleHRyYSBUaGUgZXh0cmEgcGFyYW1ldGVyLiBOdWxsIGlmIHtAbGluayAjbmVlZHNFeHRyYSgpfSByZXR1cm5lZCBmYWxzZS4KLSAgICAgICAgICogQHJldHVybiBBbiBlcnJvciBzdHJpbmcgb3IgbnVsbCBpZiB0aGVyZSdzIG5vIGVycm9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBwcm9jZXNzKEFyZyBhcmcsIFN0cmluZyBleHRyYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIGNvbW1hbmQtbGluZSwgYWxzbyBjYWxsZWQgImEgZmxhZyIuCi0gICAgICogQXJndW1lbnRzIG11c3QgaGF2ZSBhIHNob3J0IHZlcnNpb24gKG9uZSBsZXR0ZXIpLCBhIGxvbmcgdmVyc2lvbiBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICAgICAqIFRoZXkgY2FuIGhhdmUgYSBkZWZhdWx0IHZhbHVlLCBvciBpdCBjYW4gYmUgbnVsbC4KLSAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHtAbGluayBNb2RlfSwgdGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGEgQm9vbGVhbiwgYW4gSW50ZWdlciwgYSBTdHJpbmcKLSAgICAgKiBvciBhIFN0cmluZyBhcnJheSAoaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgY3VycmVudCBieSBkZWZhdWx0LikKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQXJnIHsKLSAgICAgICAgLyoqIFZlcmIgZm9yIHRoYXQgYXJndW1lbnQuIE5ldmVyIG51bGwuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJiOwotICAgICAgICAvKiogRGlyZWN0IE9iamVjdCBmb3IgdGhhdCBhcmd1bWVudC4gTmV2ZXIgbnVsbCwgYnV0IGNhbiBiZSBlbXB0eSBzdHJpbmcuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EaXJlY3RPYmplY3Q7Ci0gICAgICAgIC8qKiBUaGUgMS1sZXR0ZXIgc2hvcnQgbmFtZSBvZiB0aGUgYXJndW1lbnQsIGUuZy4gLXYuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TaG9ydE5hbWU7Ci0gICAgICAgIC8qKiBUaGUgbG9uZyBuYW1lIG9mIHRoZSBhcmd1bWVudCwgZS5nLiAtLXZlcmJvc2UuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Mb25nTmFtZTsKLSAgICAgICAgLyoqIEEgZGVzY3JpcHRpb24uIE5ldmVyIG51bGwuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgLyoqIEEgZGVmYXVsdCB2YWx1ZS4gQ2FuIGJlIG51bGwuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1EZWZhdWx0VmFsdWU7Ci0gICAgICAgIC8qKiBUaGUgYXJndW1lbnQgbW9kZSAodHlwZSArIHByb2Nlc3MgbWV0aG9kKS4gTmV2ZXIgbnVsbC4gKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNb2RlIG1Nb2RlOwotICAgICAgICAvKiogVHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGlzIG1hbmRhdG9yeSBmb3IgdGhpcyB2ZXJiL2RpcmVjdG9iamVjdC4gKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1NYW5kYXRvcnk7Ci0gICAgICAgIC8qKiBDdXJyZW50IHZhbHVlLiBJbml0aWFsbHkgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlLiAqLwotICAgICAgICBwcml2YXRlIE9iamVjdCBtQ3VycmVudFZhbHVlOwotICAgICAgICAvKiogVHJ1ZSBpZiB0aGUgYXJndW1lbnQgaGFzIGJlZW4gdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUluQ29tbWFuZExpbmU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYXJndW1lbnQgZmxhZyBkZXNjcmlwdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIHtAbGluayBNb2RlfSBmb3IgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiBAcGFyYW0gbWFuZGF0b3J5IFRydWUgaWYgdGhpcyBhcmd1bWVudCBpcyBtYW5kYXRvcnkgZm9yIHRoaXMgYWN0aW9uLgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0T2JqZWN0IFRoZSBhY3Rpb24gbmFtZS4gQ2FuIGJlICNOT19WRVJCX09CSkVDVCBvciAjSU5URVJOQUxfRkxBRy4KLSAgICAgICAgICogQHBhcmFtIHNob3J0TmFtZSBUaGUgb25lLWxldHRlciBzaG9ydCBhcmd1bWVudCBuYW1lLiBDYW5ub3QgYmUgZW1wdHkgbm9yIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBsb25nTmFtZSBUaGUgbG9uZyBhcmd1bWVudCBuYW1lLiBDYW5ub3QgYmUgZW1wdHkgbm9yIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24uIENhbm5vdCBiZSBudWxsLgotICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIChvciB2YWx1ZXMpLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCB7QGxpbmsgTW9kZX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQXJnKE1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hbmRhdG9yeSwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyYiwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0T2JqZWN0LAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvbmdOYW1lLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICBtTWFuZGF0b3J5ID0gbWFuZGF0b3J5OwotICAgICAgICAgICAgbVZlcmIgPSB2ZXJiOwotICAgICAgICAgICAgbURpcmVjdE9iamVjdCA9IGRpcmVjdE9iamVjdDsKLSAgICAgICAgICAgIG1TaG9ydE5hbWUgPSBzaG9ydE5hbWU7Ci0gICAgICAgICAgICBtTG9uZ05hbWUgPSBsb25nTmFtZTsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgbURlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIG1JbkNvbW1hbmRMaW5lID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlID0gKChTdHJpbmdbXSlkZWZhdWx0VmFsdWUpWzBdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlID0gbURlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGlzIG1hbmRhdG9yeSBmb3IgdGhpcyB2ZXJiL2RpcmVjdG9iamVjdC4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYW5kYXRvcnkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1hbmRhdG9yeTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSAxLWxldHRlciBzaG9ydCBuYW1lIG9mIHRoZSBhcmd1bWVudCwgZS5nLiAtdi4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEFyZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2hvcnROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGxvbmcgbmFtZSBvZiB0aGUgYXJndW1lbnQsIGUuZy4gLS12ZXJib3NlLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdBcmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxvbmdOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLiBOZXZlciBudWxsLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJiIGZvciB0aGF0IGFyZ3VtZW50LiBOZXZlciBudWxsLiAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlcmIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZlcmI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgZGlyZWN0IE9iamVjdCBmb3IgdGhhdCBhcmd1bWVudC4gTmV2ZXIgbnVsbCwgYnV0IGNhbiBiZSBlbXB0eSBzdHJpbmcuICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0T2JqZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXJlY3RPYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZS4gQ2FuIGJlIG51bGwuICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS4gSW5pdGlhbGx5IHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZS4gQ2FuIGJlIG51bGwuICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q3VycmVudFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogU2V0cyB0aGUgY3VycmVudCB2YWx1ZS4gQ2FuIGJlIG51bGwuICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRWYWx1ZShPYmplY3QgY3VycmVudFZhbHVlKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIGFyZ3VtZW50IG1vZGUgKHR5cGUgKyBwcm9jZXNzIG1ldGhvZCkuIE5ldmVyIG51bGwuICovCi0gICAgICAgIHB1YmxpYyBNb2RlIGdldE1vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBoYXMgYmVlbiB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db21tYW5kTGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5Db21tYW5kTGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBTZXRzIGlmIHRoZSBhcmd1bWVudCBoYXMgYmVlbiB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluQ29tbWFuZExpbmUoYm9vbGVhbiBpbkNvbW1hbmRMaW5lKSB7Ci0gICAgICAgICAgICBtSW5Db21tYW5kTGluZSA9IGluQ29tbWFuZExpbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gZGVmaW5lIGEgbmV3IGFyZ3VtZW50IGZvciBhIGdpdmUgYWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGUgVGhlIHtAbGluayBNb2RlfSBmb3IgdGhlIGFyZ3VtZW50LgotICAgICAqIEBwYXJhbSB2ZXJiIFRoZSB2ZXJiIG5hbWUuIENhbiBiZSAjSU5URVJOQUxfVkVSQi4KLSAgICAgKiBAcGFyYW0gZGlyZWN0T2JqZWN0IFRoZSBhY3Rpb24gbmFtZS4gQ2FuIGJlICNOT19WRVJCX09CSkVDVCBvciAjSU5URVJOQUxfRkxBRy4KLSAgICAgKiBAcGFyYW0gc2hvcnROYW1lIFRoZSBvbmUtbGV0dGVyIHNob3J0IGFyZ3VtZW50IG5hbWUuIENhbm5vdCBiZSBlbXB0eSBub3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gbG9uZ05hbWUgVGhlIGxvbmcgYXJndW1lbnQgbmFtZS4gQ2Fubm90IGJlIGVtcHR5IG5vciBudWxsLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24uIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgKG9yIHZhbHVlcyksIHdoaWNoIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIHtAbGluayBNb2RlfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWZpbmUoTW9kZSBtb2RlLAotICAgICAgICAgICAgYm9vbGVhbiBtYW5kYXRvcnksCi0gICAgICAgICAgICBTdHJpbmcgdmVyYiwKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3RPYmplY3QsCi0gICAgICAgICAgICBTdHJpbmcgc2hvcnROYW1lLCBTdHJpbmcgbG9uZ05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgYXNzZXJ0KCEobWFuZGF0b3J5ICYmIG1vZGUgPT0gTW9kZS5CT09MRUFOKSk7IC8vIGEgYm9vbGVhbiBtb2RlIGNhbm5vdCBiZSBtYW5kYXRvcnkKLQotICAgICAgICBpZiAoZGlyZWN0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpcmVjdE9iamVjdCA9IE5PX1ZFUkJfT0JKRUNUOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHZlcmIgKyAiLyIgKyBkaXJlY3RPYmplY3QgKyAiLyIgKyBsb25nTmFtZTsKLSAgICAgICAgbUFyZ3VtZW50cy5wdXQoa2V5LCBuZXcgQXJnKG1vZGUsIG1hbmRhdG9yeSwKLSAgICAgICAgICAgICAgICB2ZXJiLCBkaXJlY3RPYmplY3QsIHNob3J0TmFtZSwgbG9uZ05hbWUsIGRlc2NyaXB0aW9uLCBkZWZhdWx0VmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGl0cyBpbiBjYXNlIG9mIGVycm9yLgotICAgICAqIFRoaXMgaXMgcHJvdGVjdGVkIHNvIHRoYXQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdW5pdCB0ZXN0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGl0KCkgewotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSBsaW5lIHRvIHN0ZG91dC4KLSAgICAgKiBUaGlzIGlzIHByb3RlY3RlZCBzbyB0aGF0IGl0IGNhbiBiZSBvdmVycmlkZGVuIGluIHVuaXQgdGVzdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBzdHJpbmcgdG8gYmUgZm9ybWF0dGVkLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gYXJncyBGb3JtYXQgYXJndW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0ZG91dChTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi5hcmdzKSB7Ci0gICAgICAgIG1Mb2cucHJpbnRmKGZvcm1hdCArICJcbiIsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIGxpbmUgdG8gc3RkZXJyLgotICAgICAqIFRoaXMgaXMgcHJvdGVjdGVkIHNvIHRoYXQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdW5pdCB0ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb3JtYXQgVGhlIHN0cmluZyB0byBiZSBmb3JtYXR0ZWQuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBhcmdzIEZvcm1hdCBhcmd1bWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RkZXJyKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLmFyZ3MpIHsKLSAgICAgICAgbUxvZy5lcnJvcihudWxsLCBmb3JtYXQsIGFyZ3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL01haW4uamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNDM1Ny4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2FwcC9zcmMvY29tL2FuZHJvaWQvc2RrbWFuYWdlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka21hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQucHJlZnMuQW5kcm9pZExvY2F0aW9uLkFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQuSU9wdGlvbmFsTGlicmFyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkF2ZE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5IYXJkd2FyZVByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyLkF2ZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5IYXJkd2FyZVByb3BlcnRpZXMuSGFyZHdhcmVQcm9wZXJ0eTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0Q3JlYXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0Q3JlYXRvci5PdXRwdXRMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0UHJvcGVydGllcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnhtbC5BbmRyb2lkWFBhdGhGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka21hbmFnZXIuaW50ZXJuYWwucmVwb3NpdG9yeS5BYm91dFBhZ2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbWFuYWdlci5pbnRlcm5hbC5yZXBvc2l0b3J5LlNldHRpbmdzUGFnZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkxvY2FsUGFja2FnZXNQYWdlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLnJlcG9zaXRvcnkuVXBkYXRlcldpbmRvdzsKLQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIE1haW4gY2xhc3MgZm9yIHRoZSAnYW5kcm9pZCcgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluIHsKLQotICAgIC8qKiBKYXZhIHByb3BlcnR5IHRoYXQgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIHNkay90b29scyBkaXJlY3RvcnkuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9PTFNESVIgPSAiY29tLmFuZHJvaWQuc2RrbWFuYWdlci50b29sc2RpciI7Ci0gICAgLyoqIEphdmEgcHJvcGVydHkgdGhhdCBkZWZpbmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gT24gV2luZG93cyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotICAgICAqICBpcyBhY3R1YWxseSB0aGUgdG9vbHMgZGlyLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIG9yaWdpbmFsIENXRC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV09SS0RJUiA9ICJjb20uYW5kcm9pZC5zZGttYW5hZ2VyLndvcmtkaXIiOwotCi0gICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjcmVzb2x2ZVRhcmdldE5hbWUoU3RyaW5nKX0gd2hlbiB0aGUgdGFyZ2V0IGlkIGRvZXMgbm90IG1hdGNoLiAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTlZBTElEX1RBUkdFVF9JRCA9IDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBCT09MRUFOX1lFU19SRVBMSUVTID0gbmV3IFN0cmluZ1tdIHsgInllcyIsICJ5IiB9OwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEJPT0xFQU5fTk9fUkVQTElFUyA9IG5ldyBTdHJpbmdbXSB7ICJubyIsICJuIiB9OwotCi0gICAgLyoqIFBhdGggdG8gdGhlIFNESyBmb2xkZXIuIFRoaXMgaXMgdGhlIHBhcmVudCBvZiB7QGxpbmsgI1RPT0xTRElSfS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtT3NTZGtGb2xkZXI7Ci0gICAgLyoqIExvZ2dlciBvYmplY3QuIFVzZSB0aGlzIHRvIHByaW50IG5vcm1hbCBvdXRwdXQsIHdhcm5pbmdzIG9yIGVycm9ycy4gKi8KLSAgICBwcml2YXRlIElTZGtMb2cgbVNka0xvZzsKLSAgICAvKiogVGhlIFNESyBtYW5hZ2VyIHBhcnNlcyB0aGUgU0RLIGZvbGRlciBhbmQgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBjb250ZW50LiAqLwotICAgIHByaXZhdGUgU2RrTWFuYWdlciBtU2RrTWFuYWdlcjsKLSAgICAvKiogQ29tbWFuZC1saW5lIHByb2Nlc3NvciB3aXRoIG9wdGlvbnMgc3BlY2lmaWMgdG8gU2RrTWFuYWdlci4gKi8KLSAgICBwcml2YXRlIFNka0NvbW1hbmRMaW5lIG1TZGtDb21tYW5kTGluZTsKLSAgICAvKiogVGhlIHdvcmtpbmcgZGlyZWN0b3J5LCBlaXRoZXIgbnVsbCBvciBzZXQgdG8gYW4gZXhpc3RpbmcgYWJzb2x1dGUgY2Fub25pY2FsIGRpcmVjdG9yeS4gKi8KLSAgICBwcml2YXRlIEZpbGUgbVdvcmtEaXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIG5ldyBNYWluKCkucnVuKGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHNkayBtYW5hZ2VyIGFwcAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBydW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBjcmVhdGVMb2dnZXIoKTsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBtU2RrQ29tbWFuZExpbmUucGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICBwYXJzZVNkaygpOwotICAgICAgICBkb0FjdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayAjbVNka0xvZ30gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUge0BsaW5rICNpbml0KCl9IGFzIGl0IHdpbGwgYmUgdXNlZCB0byByZXBvcnQgZXJyb3JzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVMb2dnZXIoKSB7Ci0gICAgICAgIG1TZGtMb2cgPSBuZXcgSVNka0xvZygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSB0LCBTdHJpbmcgZXJyb3JGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yRm9ybWF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yOiAiICsgZXJyb3JGb3JtYXQsIGFyZ3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yRm9ybWF0LmVuZHNXaXRoKCJcbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJFcnJvcjogJXNcbiIsIHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIHdhcm5pbmdGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TZGtDb21tYW5kTGluZS5pc1ZlcmJvc2UoKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiV2FybmluZzogIiArIHdhcm5pbmdGb3JtYXQsIGFyZ3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXdhcm5pbmdGb3JtYXQuZW5kc1dpdGgoIlxuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludGYoU3RyaW5nIG1zZ0Zvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihtc2dGb3JtYXQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXQgdGhlIGFwcGxpY2F0aW9uIGJ5IG1ha2luZyBzdXJlIHRoZSBTREsgcGF0aCBpcyBhdmFpbGFibGUgYW5kCi0gICAgICogZG9pbmcgYmFzaWMgcGFyc2luZyBvZiB0aGUgU0RLLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBtU2RrQ29tbWFuZExpbmUgPSBuZXcgU2RrQ29tbWFuZExpbmUobVNka0xvZyk7Ci0KLSAgICAgICAgLy8gV2UgZ2V0IHBhc3NlZCBhIHByb3BlcnR5IGZvciB0aGUgdG9vbHMgZGlyCi0gICAgICAgIFN0cmluZyB0b29sc0RpclByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoVE9PTFNESVIpOwotICAgICAgICBpZiAodG9vbHNEaXJQcm9wID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcsIGl0J3MgZWFzaWVyIHRvIG92ZXJyaWRlIHVzaW5nIHRoZSBwcm9jZXNzIGVudmlyb25tZW50Ci0gICAgICAgICAgICB0b29sc0RpclByb3AgPSBTeXN0ZW0uZ2V0ZW52KFRPT0xTRElSKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0b29sc0RpclByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ290IGJhY2sgYSBsZXZlbCBmb3IgdGhlIFNESyBmb2xkZXIKLSAgICAgICAgICAgIEZpbGUgdG9vbHM7Ci0gICAgICAgICAgICBpZiAodG9vbHNEaXJQcm9wLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRvb2xzID0gbmV3IEZpbGUodG9vbHNEaXJQcm9wKTsKLSAgICAgICAgICAgICAgICBtT3NTZGtGb2xkZXIgPSB0b29scy5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdG9vbHMgPSBuZXcgRmlsZSgiLiIpLmdldENhbm9uaWNhbEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbU9zU2RrRm9sZGVyID0gdG9vbHMuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXaWxsIHByaW50IGFuIGVycm9yIGJlbG93IHNpbmNlIG1TZGtGb2xkZXIgaXMgbm90IGRlZmluZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU9zU2RrRm9sZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgiVGhlIHRvb2xzIGRpcmVjdG9yeSBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBwbGVhc2UgbWFrZSBzdXJlIHlvdSBhcmUgZXhlY3V0aW5nICUxJHMiLAotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5hbmRyb2lkQ21kTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG1pZ2h0IGdldCBwYXNzZWQgYSBwcm9wZXJ0eSBmb3IgdGhlIHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAgICAgIC8vIEVpdGhlciBpdCBpcyBhIHZhbGlkIGRpcmVjdG9yeSBhbmQgbVdvcmtEaXIgaXMgc2V0IHRvIGl0J3MgYWJzb2x1dGUgY2Fub25pY2FsIHZhbHVlCi0gICAgICAgIC8vIG9yIG1Xb3JrRGlyIHJlbWFpbnMgbnVsbC4KLSAgICAgICAgU3RyaW5nIHdvcmtEaXJQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KFdPUktESVIpOwotICAgICAgICBpZiAod29ya0RpclByb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgd29ya0RpclByb3AgPSBTeXN0ZW0uZ2V0ZW52KFdPUktESVIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JrRGlyUHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBhIHZhbGlkIGRpcmVjdG9yeQotICAgICAgICAgICAgbVdvcmtEaXIgPSBuZXcgRmlsZSh3b3JrRGlyUHJvcCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xb3JrRGlyID0gbVdvcmtEaXIuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldEFic29sdXRlRmlsZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG1Xb3JrRGlyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtV29ya0RpciA9PSBudWxsIHx8ICFtV29ya0Rpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJUaGUgd29ya2luZyBkaXJlY3RvcnkgZG9lcyBub3Qgc2VlbSB0byBiZSB2YWxpZDogJyUxJHMiLCB3b3JrRGlyUHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBiYXNpYyBTREsgcGFyc2luZyByZXF1aXJlZCBmb3IgYWxsIGFjdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VTZGsoKSB7Ci0gICAgICAgIG1TZGtNYW5hZ2VyID0gU2RrTWFuYWdlci5jcmVhdGVNYW5hZ2VyKG1Pc1Nka0ZvbGRlciwgbVNka0xvZyk7Ci0KLSAgICAgICAgaWYgKG1TZGtNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgiVW5hYmxlIHRvIHBhcnNlIFNESyBjb250ZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0dWFsbHkgZG8gYW4gYWN0aW9uLi4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvQWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgdmVyYiA9IG1TZGtDb21tYW5kTGluZS5nZXRWZXJiKCk7Ci0gICAgICAgIFN0cmluZyBkaXJlY3RPYmplY3QgPSBtU2RrQ29tbWFuZExpbmUuZ2V0RGlyZWN0T2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKFNka0NvbW1hbmRMaW5lLlZFUkJfTElTVC5lcXVhbHModmVyYikpIHsKLSAgICAgICAgICAgIC8vIGxpc3QgYWN0aW9uLgotICAgICAgICAgICAgaWYgKFNka0NvbW1hbmRMaW5lLk9CSkVDVF9UQVJHRVQuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5VGFyZ2V0TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChTZGtDb21tYW5kTGluZS5PQkpFQ1RfQVZELmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheUF2ZExpc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheVRhcmdldExpc3QoKTsKLSAgICAgICAgICAgICAgICBkaXNwbGF5QXZkTGlzdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoU2RrQ29tbWFuZExpbmUuVkVSQl9DUkVBVEUuZXF1YWxzKHZlcmIpICYmCi0gICAgICAgICAgICAgICAgU2RrQ29tbWFuZExpbmUuT0JKRUNUX0FWRC5lcXVhbHMoZGlyZWN0T2JqZWN0KSkgewotICAgICAgICAgICAgY3JlYXRlQXZkKCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChTZGtDb21tYW5kTGluZS5WRVJCX0RFTEVURS5lcXVhbHModmVyYikgJiYKLSAgICAgICAgICAgICAgICBTZGtDb21tYW5kTGluZS5PQkpFQ1RfQVZELmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICBkZWxldGVBdmQoKTsKLQotICAgICAgICB9IGVsc2UgaWYgKFNka0NvbW1hbmRMaW5lLlZFUkJfTU9WRS5lcXVhbHModmVyYikgJiYKLSAgICAgICAgICAgICAgICBTZGtDb21tYW5kTGluZS5PQkpFQ1RfQVZELmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICBtb3ZlQXZkKCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChTZGtDb21tYW5kTGluZS5WRVJCX1VQREFURS5lcXVhbHModmVyYikgJiYKLSAgICAgICAgICAgICAgICBTZGtDb21tYW5kTGluZS5PQkpFQ1RfQVZELmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICB1cGRhdGVBdmQoKTsKLQotICAgICAgICB9IGVsc2UgaWYgKFNka0NvbW1hbmRMaW5lLlZFUkJfQ1JFQVRFLmVxdWFscyh2ZXJiKSAmJgotICAgICAgICAgICAgICAgIFNka0NvbW1hbmRMaW5lLk9CSkVDVF9QUk9KRUNULmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICBjcmVhdGVQcm9qZWN0KCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChTZGtDb21tYW5kTGluZS5WRVJCX0NSRUFURS5lcXVhbHModmVyYikgJiYKLSAgICAgICAgICAgICAgICBTZGtDb21tYW5kTGluZS5PQkpFQ1RfVEVTVF9QUk9KRUNULmVxdWFscyhkaXJlY3RPYmplY3QpKSB7Ci0gICAgICAgICAgICBjcmVhdGVUZXN0UHJvamVjdCgpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoU2RrQ29tbWFuZExpbmUuVkVSQl9VUERBVEUuZXF1YWxzKHZlcmIpICYmCi0gICAgICAgICAgICAgICAgU2RrQ29tbWFuZExpbmUuT0JKRUNUX1BST0pFQ1QuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVByb2plY3QoKTsKLQotICAgICAgICB9IGVsc2UgaWYgKFNka0NvbW1hbmRMaW5lLlZFUkJfVVBEQVRFLmVxdWFscyh2ZXJiKSAmJgotICAgICAgICAgICAgICAgIFNka0NvbW1hbmRMaW5lLk9CSkVDVF9URVNUX1BST0pFQ1QuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVRlc3RQcm9qZWN0KCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmICh2ZXJiID09IG51bGwgJiYgZGlyZWN0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNob3dNYWluV2luZG93KGZhbHNlIC8qYXV0b1VwZGF0ZSovKTsKLQotICAgICAgICB9IGVsc2UgaWYgKFNka0NvbW1hbmRMaW5lLlZFUkJfVVBEQVRFLmVxdWFscyh2ZXJiKSAmJgotICAgICAgICAgICAgICAgIFNka0NvbW1hbmRMaW5lLk9CSkVDVF9TREsuZXF1YWxzKGRpcmVjdE9iamVjdCkpIHsKLSAgICAgICAgICAgIHNob3dNYWluV2luZG93KHRydWUgLyphdXRvVXBkYXRlKi8pOwotCi0gICAgICAgIH0gZWxzZSBpZiAoU2RrQ29tbWFuZExpbmUuVkVSQl9VUERBVEUuZXF1YWxzKHZlcmIpICYmCi0gICAgICAgICAgICAgICAgU2RrQ29tbWFuZExpbmUuT0JKRUNUX0FEQi5lcXVhbHMoZGlyZWN0T2JqZWN0KSkgewotICAgICAgICAgICAgdXBkYXRlQWRiKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZGtDb21tYW5kTGluZS5wcmludEhlbHBBbmRFeGl0KG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSB0aGUgbWFpbiBTZGtNYW5hZ2VyIGFwcCB3aW5kb3cKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd01haW5XaW5kb3coYm9vbGVhbiBhdXRvVXBkYXRlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBkaXNwbGF5IGEgbWVzc2FnZSB0YWxraW5nIGFib3V0IHRoZSBjb21tYW5kIGxpbmUgdmVyc2lvbgotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIk5vIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHByb3ZpZGVkLCBsYXVuY2hpbmcgVUkuXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIlNlZSAnYW5kcm9pZCAtLWhlbHAnIGZvciBvcGVyYXRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZS5cbiIpOwotICAgICAgICAgICAgVXBkYXRlcldpbmRvdyB3aW5kb3cgPSBuZXcgVXBkYXRlcldpbmRvdygKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBwYXJlbnRTaGVsbCAqLywKLSAgICAgICAgICAgICAgICAgICAgbVNka0xvZywKLSAgICAgICAgICAgICAgICAgICAgbU9zU2RrRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnVzZXJDYW5DaGFuZ2VTZGtSb290Ki8pOwotICAgICAgICAgICAgd2luZG93LnJlZ2lzdGVyUGFnZSgiU2V0dGluZ3MiLCBTZXR0aW5nc1BhZ2UuY2xhc3MpOwotICAgICAgICAgICAgd2luZG93LnJlZ2lzdGVyUGFnZSgiQWJvdXQiLCBBYm91dFBhZ2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGF1dG9VcGRhdGUpIHsKLSAgICAgICAgICAgICAgICB3aW5kb3cuc2V0SW5pdGlhbFBhZ2UoTG9jYWxQYWNrYWdlc1BhZ2UuY2xhc3MpOwotICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRSZXF1ZXN0QXV0b1VwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdpbmRvdy5vcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBbmRyb2lkIHByb2plY3QgYmFzZWQgb24gY29tbWFuZC1saW5lIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdCgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSB0YXJnZXQgYW5kIHRyeSB0byByZXNvbHZlIGl0LgotICAgICAgICBpbnQgdGFyZ2V0SWQgPSByZXNvbHZlVGFyZ2V0TmFtZShtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1UYXJnZXRJZCgpKTsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gbVNka01hbmFnZXIuZ2V0VGFyZ2V0cygpOwotICAgICAgICBpZiAodGFyZ2V0SWQgPT0gSU5WQUxJRF9UQVJHRVRfSUQgfHwgdGFyZ2V0SWQgPiB0YXJnZXRzLmxlbmd0aCkgewotICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJUYXJnZXQgaWQgaXMgbm90IHZhbGlkLiBVc2UgJyVzIGxpc3QgdGFyZ2V0cycgdG8gZ2V0IHRoZSB0YXJnZXQgaWRzLiIsCi0gICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5hbmRyb2lkQ21kTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSB0YXJnZXRzW3RhcmdldElkIC0gMV07ICAvLyB0YXJnZXQgaWQgaXMgMS1iYXNlZAotCi0gICAgICAgIFByb2plY3RDcmVhdG9yIGNyZWF0b3IgPSBuZXcgUHJvamVjdENyZWF0b3IobU9zU2RrRm9sZGVyLAotICAgICAgICAgICAgICAgIG1TZGtDb21tYW5kTGluZS5pc1ZlcmJvc2UoKSA/IE91dHB1dExldmVsLlZFUkJPU0UgOgotICAgICAgICAgICAgICAgICAgICBtU2RrQ29tbWFuZExpbmUuaXNTaWxlbnQoKSA/IE91dHB1dExldmVsLlNJTEVOVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRMZXZlbC5OT1JNQUwsCi0gICAgICAgICAgICAgICAgbVNka0xvZyk7Ci0KLSAgICAgICAgU3RyaW5nIHByb2plY3REaXIgPSBnZXRQcm9qZWN0TG9jYXRpb24obVNka0NvbW1hbmRMaW5lLmdldFBhcmFtTG9jYXRpb25QYXRoKCkpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbVNka0NvbW1hbmRMaW5lLmdldFBhcmFtUHJvamVjdFBhY2thZ2UoKTsKLSAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbVByb2plY3RBY3Rpdml0eSgpOwotCi0gICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgIVByb2plY3RDcmVhdG9yLlJFX1BST0pFQ1RfTkFNRS5tYXRjaGVyKHByb2plY3ROYW1lKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgKLSAgICAgICAgICAgICAgICAiUHJvamVjdCBuYW1lICclMSRzJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuXG5BbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiAlMiRzIiwKLSAgICAgICAgICAgICAgICBwcm9qZWN0TmFtZSwgUHJvamVjdENyZWF0b3IuQ0hBUlNfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3Rpdml0eU5hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICFQcm9qZWN0Q3JlYXRvci5SRV9BQ1RJVklUWV9OQU1FLm1hdGNoZXIoYWN0aXZpdHlOYW1lKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbmFtZSAnJTEkcycgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLlxuQWxsb3dlZCBjaGFyYWN0ZXJzIGFyZTogJTIkcyIsCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lLCBQcm9qZWN0Q3JlYXRvci5DSEFSU19BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgIVByb2plY3RDcmVhdG9yLlJFX1BBQ0tBR0VfTkFNRS5tYXRjaGVyKHBhY2thZ2VOYW1lKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgKLSAgICAgICAgICAgICAgICAiUGFja2FnZSBuYW1lICclMSRzJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuXG4iICsKLSAgICAgICAgICAgICAgICAiQSBwYWNrYWdlIG5hbWUgbXVzdCBiZSBjb25zdGl0dWVkIG9mIHR3byBKYXZhIGlkZW50aWZpZXJzLlxuIiArCi0gICAgICAgICAgICAgICAgIkVhY2ggaWRlbnRpZmllciBhbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiAlMiRzIiwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgUHJvamVjdENyZWF0b3IuQ0hBUlNfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0b3IuY3JlYXRlUHJvamVjdChwcm9qZWN0RGlyLAotICAgICAgICAgICAgICAgIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgICAgICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgbnVsbCAvKnBhdGhUb01haW4qLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBbmRyb2lkIHRlc3QgcHJvamVjdCBiYXNlZCBvbiBjb21tYW5kLWxpbmUgcGFyYW1ldGVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXN0UHJvamVjdCgpIHsKLQotICAgICAgICBTdHJpbmcgcHJvamVjdERpciA9IGdldFByb2plY3RMb2NhdGlvbihtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1Mb2NhdGlvblBhdGgoKSk7Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhlIHBhdGggb2YgdGhlIHBhcmVudCBwcm9qZWN0LCBhbmQgbWFrZSBzdXJlIGl0J3MgdmFsaWQuCi0gICAgICAgIFN0cmluZyBwYXRoVG9NYWluUHJvamVjdCA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbVRlc3RQcm9qZWN0TWFpbigpOwotCi0gICAgICAgIEZpbGUgcGFyZW50UHJvamVjdCA9IG5ldyBGaWxlKHBhdGhUb01haW5Qcm9qZWN0KTsKLSAgICAgICAgaWYgKHBhcmVudFByb2plY3QuaXNBYnNvbHV0ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUsIHdlIG5lZWQgdG8gcmVzb2x2ZSBpdCBiYXNlZCBvbiB0aGUKLSAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHBhdGggb2YgdGhlIHByb2plY3QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50UHJvamVjdCA9IG5ldyBGaWxlKHByb2plY3REaXIsIHBhdGhUb01haW5Qcm9qZWN0KS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJVbmFibGUgdG8gcmVzb2x2ZSBNYWluIHByb2plY3QncyBkaXJlY3Rvcnk6ICUxJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFRvTWFpblByb2plY3QpOwotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaGVscCBFY2xpcHNlIHN0YXRpYyBhbmFseXplciB1bmRlcnN0YW5kIHdlJ2xsIG5ldmVyIGV4ZWN1dGUgdGhlIHJlc3QuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50UHJvamVjdC5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoIk1haW4gcHJvamVjdCdzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIHBhdGhUb01haW5Qcm9qZWN0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBsb29rIGZvciBhIG1hbmlmZXN0IGluIHRoZXJlCi0gICAgICAgIEZpbGUgbWFuaWZlc3QgPSBuZXcgRmlsZShwYXJlbnRQcm9qZWN0LCBTZGtDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVF9YTUwpOwotICAgICAgICBpZiAobWFuaWZlc3QuaXNGaWxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgiTm8gQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlIGZvdW5kIGluIHRoZSBtYWluIHByb2plY3QgZGlyZWN0b3J5OiAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50UHJvamVjdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgcXVlcnkgdGhlIG1hbmlmZXN0IGZvciB0aGUgcGFja2FnZSBmaWxlLgotICAgICAgICBYUGF0aCB4cGF0aCA9IEFuZHJvaWRYUGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBhY3Rpdml0eU5hbWU7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0geHBhdGguZXZhbHVhdGUoIi9tYW5pZmVzdC9AcGFja2FnZSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0KSkpOwotCi0gICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiRm91bmQgbWFpbiBwcm9qZWN0IHBhY2thZ2U6ICUxJHNcbiIsIHBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgLy8gbm93IGdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgYWN0aXZpdHkgd2UgZmluZAotICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0geHBhdGguZXZhbHVhdGUoIi9tYW5pZmVzdC9hcHBsaWNhdGlvbi9hY3Rpdml0eVsxXS9AYW5kcm9pZDpuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3QpKSk7Ci0gICAgICAgICAgICAvLyB4cGF0aCB3aWxsIHJldHVybiBlbXB0eSBzdHJpbmcgd2hlbiB0aGVyZSdzIG5vIG1hdGNoCi0gICAgICAgICAgICBpZiAoYWN0aXZpdHlOYW1lID09IG51bGwgfHwgYWN0aXZpdHlOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiRm91bmQgbWFpbiBwcm9qZWN0IGFjdGl2aXR5OiAlMSRzXG4iLCBhY3Rpdml0eU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIHdlIHRlc3QgaXQgYWJvdmUuCi0gICAgICAgICAgICBlcnJvckFuZEV4aXQoIk5vIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZSBmb3VuZCBpbiBtYWluIHByb2plY3QuIik7Ci0gICAgICAgICAgICByZXR1cm47IC8vIHRoaXMgaXMgbm90IHN0cmljdGx5IG5lZWRlZCBiZWNhdXNlIGVycm9yQW5kRXhpdCB3aWxsIHN0b3AgdGhlIGV4ZWN1dGlvbiwKLSAgICAgICAgICAgIC8vIGJ1dCB0aGlzIG1ha2VzIHRoZSBqYXZhIGNvbXBpbGVyIGhhcHB5LCB3cnQgdG8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCi0gICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb29rcyBsaWtlIHRoZSBtYWluIG1hbmlmZXN0IGlzIG5vdCB2YWxpZC4KLSAgICAgICAgICAgIGVycm9yQW5kRXhpdCgiVW5hYmxlIHRvIHBhcnNlIG1haW4gcHJvamVjdCBtYW5pZmVzdCB0byBnZXQgaW5mb3JtYXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm47IC8vIHRoaXMgaXMgbm90IHN0cmljdGx5IG5lZWRlZCBiZWNhdXNlIGVycm9yQW5kRXhpdCB3aWxsIHN0b3AgdGhlIGV4ZWN1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoaXMgbWFrZXMgdGhlIGphdmEgY29tcGlsZXIgaGFwcHksIHdydCB0byB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIHRhcmdldCBoYXNoCi0gICAgICAgIFByb2plY3RQcm9wZXJ0aWVzIHAgPSBQcm9qZWN0UHJvcGVydGllcy5sb2FkKHBhcmVudFByb2plY3QuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkRFRkFVTFQpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0SGFzaCA9IHAuZ2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfVEFSR0VUKTsKLSAgICAgICAgaWYgKHRhcmdldEhhc2ggPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJDb3VsZG4ndCBmaW5kIHRoZSBtYWluIHByb2plY3QgdGFyZ2V0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhbmQgcmVzb2x2ZSBpdC4KLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbVNka01hbmFnZXIuZ2V0VGFyZ2V0RnJvbUhhc2hTdHJpbmcodGFyZ2V0SGFzaCk7Ci0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JBbmRFeGl0KAotICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgbWFpbiBwcm9qZWN0IHRhcmdldCAnJTEkcycuIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIHRoZSBwbGF0Zm9ybSBpbiB5b3VyIFNESy4iLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXRIYXNoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZGtMb2cucHJpbnRmKCJGb3VuZCBtYWluIHByb2plY3QgdGFyZ2V0OiAlMSRzXG4iLCB0YXJnZXQuZ2V0RnVsbE5hbWUoKSk7Ci0KLSAgICAgICAgUHJvamVjdENyZWF0b3IgY3JlYXRvciA9IG5ldyBQcm9qZWN0Q3JlYXRvcihtT3NTZGtGb2xkZXIsCi0gICAgICAgICAgICAgICAgbVNka0NvbW1hbmRMaW5lLmlzVmVyYm9zZSgpID8gT3V0cHV0TGV2ZWwuVkVSQk9TRSA6Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtDb21tYW5kTGluZS5pc1NpbGVudCgpID8gT3V0cHV0TGV2ZWwuU0lMRU5UIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dExldmVsLk5PUk1BTCwKLSAgICAgICAgICAgICAgICBtU2RrTG9nKTsKLQotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1OYW1lKCk7Ci0KLSAgICAgICAgaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAhUHJvamVjdENyZWF0b3IuUkVfUFJPSkVDVF9OQU1FLm1hdGNoZXIocHJvamVjdE5hbWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgZXJyb3JBbmRFeGl0KAotICAgICAgICAgICAgICAgICJQcm9qZWN0IG5hbWUgJyUxJHMnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy5cbkFsbG93ZWQgY2hhcmFjdGVycyBhcmU6ICUyJHMiLAotICAgICAgICAgICAgICAgIHByb2plY3ROYW1lLCBQcm9qZWN0Q3JlYXRvci5DSEFSU19QUk9KRUNUX05BTUUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRvci5jcmVhdGVQcm9qZWN0KHByb2plY3REaXIsCi0gICAgICAgICAgICAgICAgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIHRhcmdldCwKLSAgICAgICAgICAgICAgICBwYXRoVG9NYWluUHJvamVjdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIEFuZHJvaWQgcHJvamVjdCBiYXNlZCBvbiBjb21tYW5kLWxpbmUgcGFyYW1ldGVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9qZWN0KCkgewotICAgICAgICAvLyBnZXQgdGhlIHRhcmdldCBhbmQgdHJ5IHRvIHJlc29sdmUgaXQuCi0gICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRTdHIgPSBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1UYXJnZXRJZCgpOwotICAgICAgICAvLyBGb3IgInVwZGF0ZSBwcm9qZWN0IiB0aGUgdGFyZ2V0IHBhcmFtZXRlciBpcyBvcHRpb25hbCBzbyBoYXZpbmcgbnVsbCBpcyBhY2NlcHRhYmxlLgotICAgICAgICAvLyBIb3dldmVyIGlmIHRoZXJlJ3MgYSB2YWx1ZSwgaXQgbXVzdCBiZSB2YWxpZC4KLSAgICAgICAgaWYgKHRhcmdldFN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldFtdIHRhcmdldHMgPSBtU2RrTWFuYWdlci5nZXRUYXJnZXRzKCk7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0SWQgPSByZXNvbHZlVGFyZ2V0TmFtZSh0YXJnZXRTdHIpOwotICAgICAgICAgICAgaWYgKHRhcmdldElkID09IElOVkFMSURfVEFSR0VUX0lEIHx8IHRhcmdldElkID4gdGFyZ2V0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoIlRhcmdldCBpZCAnJTEkcycgaXMgbm90IHZhbGlkLiBVc2UgJyUyJHMgbGlzdCB0YXJnZXRzJyB0byBnZXQgdGhlIHRhcmdldCBpZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5hbmRyb2lkQ21kTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldHNbdGFyZ2V0SWQgLSAxXTsgIC8vIHRhcmdldCBpZCBpcyAxLWJhc2VkCi0gICAgICAgIH0KLQotICAgICAgICBQcm9qZWN0Q3JlYXRvciBjcmVhdG9yID0gbmV3IFByb2plY3RDcmVhdG9yKG1Pc1Nka0ZvbGRlciwKLSAgICAgICAgICAgICAgICBtU2RrQ29tbWFuZExpbmUuaXNWZXJib3NlKCkgPyBPdXRwdXRMZXZlbC5WRVJCT1NFIDoKLSAgICAgICAgICAgICAgICAgICAgbVNka0NvbW1hbmRMaW5lLmlzU2lsZW50KCkgPyBPdXRwdXRMZXZlbC5TSUxFTlQgOgotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0TGV2ZWwuTk9STUFMLAotICAgICAgICAgICAgICAgIG1TZGtMb2cpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0RGlyID0gZ2V0UHJvamVjdExvY2F0aW9uKG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbUxvY2F0aW9uUGF0aCgpKTsKLQotICAgICAgICBjcmVhdG9yLnVwZGF0ZVByb2plY3QocHJvamVjdERpciwKLSAgICAgICAgICAgICAgICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgbVNka0NvbW1hbmRMaW5lLmdldFBhcmFtTmFtZSgpKTsKLQotICAgICAgICBib29sZWFuIGRvU3ViUHJvamVjdHMgPSBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1TdWJQcm9qZWN0KCk7Ci0gICAgICAgIGJvb2xlYW4gY291bGRIYXZlRG9uZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgc3ViLWZvbGRlcnMgd2l0aCBhIG1hbmlmZXN0LCB0cnkgdG8gdXBkYXRlIHRoZW0gYXMgcHJvamVjdHMKLSAgICAgICAgLy8gdG9vLiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0aW5nIGFueSB1bmRlcmx5aW5nIHRlc3QgcHJvamVjdCBldmVuIGlmIHRoZQotICAgICAgICAvLyB1c2VyIGNoYW5nZWQgdGhlIGZvbGRlciBuYW1lLgotICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShwcm9qZWN0RGlyKS5saXN0RmlsZXMoKTsKLSAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRmlsZSBkaXIgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGlyLCBTZGtDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVF9YTUwpLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb1N1YlByb2plY3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLnVwZGF0ZVByb2plY3QoZGlyLmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1OYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bGRIYXZlRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY291bGRIYXZlRG9uZSkgewotICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIkl0IHNlZW1zIHRoYXQgdGhlcmUgYXJlIHN1Yi1wcm9qZWN0cy4gSWYgeW91IHdhbnQgdG8gdXBkYXRlIHRoZW1cbnBsZWFzZSB1c2UgdGhlIC0tJTEkcyBwYXJhbWV0ZXIuIiwKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29tbWFuZExpbmUuS0VZX1NVQlBST0pFQ1RTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgdGVzdCBwcm9qZWN0IHdpdGggYSBuZXcgcGF0aCB0byB0aGUgbWFpbiBwcm9qZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUZXN0UHJvamVjdCgpIHsKLSAgICAgICAgUHJvamVjdENyZWF0b3IgY3JlYXRvciA9IG5ldyBQcm9qZWN0Q3JlYXRvcihtT3NTZGtGb2xkZXIsCi0gICAgICAgICAgICAgICAgbVNka0NvbW1hbmRMaW5lLmlzVmVyYm9zZSgpID8gT3V0cHV0TGV2ZWwuVkVSQk9TRSA6Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtDb21tYW5kTGluZS5pc1NpbGVudCgpID8gT3V0cHV0TGV2ZWwuU0lMRU5UIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dExldmVsLk5PUk1BTCwKLSAgICAgICAgICAgICAgICBtU2RrTG9nKTsKLQotICAgICAgICBTdHJpbmcgcHJvamVjdERpciA9IGdldFByb2plY3RMb2NhdGlvbihtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1Mb2NhdGlvblBhdGgoKSk7Ci0KLSAgICAgICAgY3JlYXRvci51cGRhdGVUZXN0UHJvamVjdChwcm9qZWN0RGlyLCBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1UZXN0UHJvamVjdE1haW4oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRqdXN0cyB0aGUgcHJvamVjdCBsb2NhdGlvbiB0byBtYWtlIGl0IGFic29sdXRlICYgY2Fub25pY2FsIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9qZWN0IGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8ge0BsaW5rICNtV29ya0Rpcn0gb3IgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgICBuZXdQcm9qZWN0TG9jYXRpb24gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3RMb2NhdGlvbihTdHJpbmcgbmV3UHJvamVjdExvY2F0aW9uKSB7Ci0KLSAgICAgICAgLy8gSWYgdGhlIG5ldyBwcm9qZWN0IGxvY2F0aW9uIGlzIGFic29sdXRlLCB1c2UgaXQgYXMtaXMKLSAgICAgICAgRmlsZSBwcm9qZWN0RGlyID0gbmV3IEZpbGUobmV3UHJvamVjdExvY2F0aW9uKTsKLSAgICAgICAgaWYgKHByb2plY3REaXIuaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UHJvamVjdExvY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUncyBubyB3b3JraW5nIGRpcmVjdG9yeSwganVzdCB1c2UgdGhlIHByb2plY3QgbG9jYXRpb24gYXMtaXMuCi0gICAgICAgIGlmIChtV29ya0RpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UHJvamVjdExvY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tYmluZSB0aGVuIGFuZCBnZXQgYW4gYWJzb2x1dGUgY2Fub25pY2FsIGRpcmVjdG9yeQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdERpciA9IG5ldyBGaWxlKG1Xb3JrRGlyLCBuZXdQcm9qZWN0TG9jYXRpb24pLmdldENhbm9uaWNhbEZpbGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHByb2plY3REaXIuZ2V0UGF0aCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoIkZhaWxlZCB0byBjb21iaW5lIHdvcmtpbmcgZGlyZWN0b3J5ICclMSRzJyB3aXRoIHByb2plY3QgbG9jYXRpb24gJyUyJHMnOiAlMyRzIiwKLSAgICAgICAgICAgICAgICAgICAgbVdvcmtEaXIuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0TG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheXMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIFRhcmdldHMgKFBsYXRmb3JtcyBhbmQgQWRkLW9ucykKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheVRhcmdldExpc3QoKSB7Ci0gICAgICAgIG1TZGtMb2cucHJpbnRmKCJBdmFpbGFibGUgQW5kcm9pZCB0YXJnZXRzOlxuIik7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBtU2RrTWFuYWdlci5nZXRUYXJnZXRzKCkpIHsKLSAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCJpZDogJTEkZCBvciBcIiUyJHNcIlxuIiwgaW5kZXgsIHRhcmdldC5oYXNoU3RyaW5nKCkpOwotICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgTmFtZTogJXNcbiIsIHRhcmdldC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKHRhcmdldC5pc1BsYXRmb3JtKCkpIHsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgICBUeXBlOiBQbGF0Zm9ybVxuIik7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgQVBJIGxldmVsOiAlc1xuIiwgdGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgUmV2aXNpb246ICVkXG4iLCB0YXJnZXQuZ2V0UmV2aXNpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCIgICAgIFR5cGU6IEFkZC1PblxuIik7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgVmVuZG9yOiAlc1xuIiwgdGFyZ2V0LmdldFZlbmRvcigpKTsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgICBSZXZpc2lvbjogJWRcbiIsIHRhcmdldC5nZXRSZXZpc2lvbigpKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgICBEZXNjcmlwdGlvbjogJXNcbiIsIHRhcmdldC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgQmFzZWQgb24gQW5kcm9pZCAlcyAoQVBJIGxldmVsICVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRWZXJzaW9uTmFtZSgpLCB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIG9wdGlvbmFsIGxpYnJhcmllcy4KLSAgICAgICAgICAgICAgICBJT3B0aW9uYWxMaWJyYXJ5W10gbGlicmFyaWVzID0gdGFyZ2V0LmdldE9wdGlvbmFsTGlicmFyaWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCIgICAgIExpYnJhcmllczpcbiIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKElPcHRpb25hbExpYnJhcnkgbGlicmFyeSA6IGxpYnJhcmllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgICogJTEkcyAoJTIkcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuZ2V0TmFtZSgpLCBsaWJyYXJ5LmdldEphck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICUxJHNcbiIsIGxpYnJhcnkuZ2V0RGVzY3JpcHRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHRhcmdldCBza2lucwotICAgICAgICAgICAgZGlzcGxheVNraW5MaXN0KHRhcmdldCwgIiAgICAgU2tpbnM6ICIpOwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0LmdldFVzYlZlbmRvcklkKCkgIT0gSUFuZHJvaWRUYXJnZXQuTk9fVVNCX0lEKSB7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICAgQWRkcyBVU0Igc3VwcG9ydCBmb3IgZGV2aWNlcyAoVmVuZG9yOiAweCUwNFgpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFVzYlZlbmRvcklkKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheXMgdGhlIHNraW5zIHZhbGlkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2tpbkxpc3QoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBTdHJpbmdbXSBza2lucyA9IHRhcmdldC5nZXRTa2lucygpOwotICAgICAgICBTdHJpbmcgZGVmYXVsdFNraW4gPSB0YXJnZXQuZ2V0RGVmYXVsdFNraW4oKTsKLSAgICAgICAgbVNka0xvZy5wcmludGYobWVzc2FnZSk7Ci0gICAgICAgIGlmIChza2lucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHNraW4gOiBza2lucykgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiLCAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50Zihza2luKTsKLQotICAgICAgICAgICAgICAgIGlmIChza2luLmVxdWFscyhkZWZhdWx0U2tpbikpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAoZGVmYXVsdCkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCJubyBza2lucy5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheXMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIEFWRHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlBdmRMaXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXZkTWFuYWdlciBhdmRNYW5hZ2VyID0gbmV3IEF2ZE1hbmFnZXIobVNka01hbmFnZXIsIG1TZGtMb2cpOwotCi0gICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiQXZhaWxhYmxlIEFuZHJvaWQgVmlydHVhbCBEZXZpY2VzOlxuIik7Ci0KLSAgICAgICAgICAgIEF2ZEluZm9bXSBhdmRzID0gYXZkTWFuYWdlci5nZXRWYWxpZEF2ZHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMCA7IGluZGV4IDwgYXZkcy5sZW5ndGggOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgQXZkSW5mbyBpbmZvID0gYXZkc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgICBOYW1lOiAlc1xuIiwgaW5mby5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCIgICAgUGF0aDogJXNcbiIsIGluZm8uZ2V0UGF0aCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0IG9mIHRoZSBBVkQKLSAgICAgICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBpbmZvLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNQbGF0Zm9ybSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCIgIFRhcmdldDogJXMgKEFQSSBsZXZlbCAlcylcbiIsIHRhcmdldC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgVGFyZ2V0OiAlcyAoJXMpXG4iLCB0YXJnZXQuZ2V0TmFtZSgpLCB0YXJnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmVuZG9yKCkpOwotICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgICAgICAgIEJhc2VkIG9uIEFuZHJvaWQgJXMgKEFQSSBsZXZlbCAlcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFZlcnNpb25OYW1lKCksIHRhcmdldC5nZXRWZXJzaW9uKCkuZ2V0QXBpU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgc29tZSBleHRyYSB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gaW5mby5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2tpbiA9IHByb3BlcnRpZXMuZ2V0KEF2ZE1hbmFnZXIuQVZEX0lOSV9TS0lOX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgIFNraW46ICVzXG4iLCBza2luKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2RjYXJkID0gcHJvcGVydGllcy5nZXQoQXZkTWFuYWdlci5BVkRfSU5JX1NEQ0FSRF9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNkY2FyZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZGNhcmQgPSBwcm9wZXJ0aWVzLmdldChBdmRNYW5hZ2VyLkFWRF9JTklfU0RDQVJEX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZGNhcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgU2RjYXJkOiAlc1xuIiwgc2RjYXJkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXJlIHRoZXJlIHNvbWUgdW51c2VkIEFWRHM/Ci0gICAgICAgICAgICBBdmRJbmZvW10gYmFkQXZkcyA9IGF2ZE1hbmFnZXIuZ2V0QnJva2VuQXZkcygpOwotCi0gICAgICAgICAgICBpZiAoYmFkQXZkcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIlxuVGhlIGZvbGxvd2luZyBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlcyBjb3VsZCBub3QgYmUgbG9hZGVkOlxuIik7Ci0gICAgICAgICAgICBib29sZWFuIG5lZWRTZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoQXZkSW5mbyBpbmZvIDogYmFkQXZkcykgewotICAgICAgICAgICAgICAgIGlmIChuZWVkU2VwYXJhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCItLS0tLS0tLS1cbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgIE5hbWU6ICVzXG4iLCBpbmZvLmdldE5hbWUoKSA9PSBudWxsID8gIi0tIiA6IGluZm8uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiICAgIFBhdGg6ICVzXG4iLCBpbmZvLmdldFBhdGgoKSA9PSBudWxsID8gIi0tIiA6IGluZm8uZ2V0UGF0aCgpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IGluZm8uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiAgIEVycm9yOiAlc1xuIiwgZXJyb3IgPT0gbnVsbCA/ICJVa25vd24gZXJyb3IiIDogZXJyb3IpOwotICAgICAgICAgICAgICAgIG5lZWRTZXBhcmF0b3IgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXJyb3JBbmRFeGl0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQVZELiBUaGlzIGlzIGEgdGV4dCBiYXNlZCBjcmVhdGlvbiB3aXRoIGNvbW1hbmQgbGluZSBwcm9tcHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUF2ZCgpIHsKLSAgICAgICAgLy8gZmluZCBhIG1hdGNoaW5nIHRhcmdldAotICAgICAgICBpbnQgdGFyZ2V0SWQgPSByZXNvbHZlVGFyZ2V0TmFtZShtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1UYXJnZXRJZCgpKTsKLSAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gbVNka01hbmFnZXIuZ2V0VGFyZ2V0cygpOwotCi0gICAgICAgIGlmICh0YXJnZXRJZCA9PSBJTlZBTElEX1RBUkdFVF9JRCB8fCB0YXJnZXRJZCA+IHRhcmdldHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoIlRhcmdldCBpZCBpcyBub3QgdmFsaWQuIFVzZSAnJXMgbGlzdCB0YXJnZXRzJyB0byBnZXQgdGhlIHRhcmdldCBpZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLmFuZHJvaWRDbWROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0c1t0YXJnZXRJZC0xXTsgLy8gdGFyZ2V0IGlkIGlzIDEtYmFzZWQKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVQcmV2aW91cyA9IG1TZGtDb21tYW5kTGluZS5nZXRGbGFnRm9yY2UoKTsKLSAgICAgICAgICAgIEF2ZE1hbmFnZXIgYXZkTWFuYWdlciA9IG5ldyBBdmRNYW5hZ2VyKG1TZGtNYW5hZ2VyLCBtU2RrTG9nKTsKLQotICAgICAgICAgICAgU3RyaW5nIGF2ZE5hbWUgPSBtU2RrQ29tbWFuZExpbmUuZ2V0UGFyYW1OYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmICghQXZkTWFuYWdlci5SRV9BVkRfTkFNRS5tYXRjaGVyKGF2ZE5hbWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdCgKLSAgICAgICAgICAgICAgICAgICAgIkFWRCBuYW1lICclMSRzJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuXG5BbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiAlMiRzIiwKLSAgICAgICAgICAgICAgICAgICAgYXZkTmFtZSwgQXZkTWFuYWdlci5DSEFSU19BVkRfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBdmRJbmZvIGluZm8gPSBhdmRNYW5hZ2VyLmdldEF2ZChhdmROYW1lLCBmYWxzZSAvKnZhbGlkQXZkT25seSovKTsKLSAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVtb3ZlUHJldmlvdXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNka0xvZy53YXJuaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbmRyb2lkIFZpcnR1YWwgRGV2aWNlICclcycgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgcmVwbGFjZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmROYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoIkFuZHJvaWQgVmlydHVhbCBEZXZpY2UgJyVzJyBhbHJlYWR5IGV4aXN0cy5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSAtLWZvcmNlIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgaXQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcGFyYW1Gb2xkZXJQYXRoID0gbVNka0NvbW1hbmRMaW5lLmdldFBhcmFtTG9jYXRpb25QYXRoKCk7Ci0gICAgICAgICAgICBGaWxlIGF2ZEZvbGRlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocGFyYW1Gb2xkZXJQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdmRGb2xkZXIgPSBuZXcgRmlsZShwYXJhbUZvbGRlclBhdGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdmRGb2xkZXIgPSBuZXcgRmlsZShBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCkgKyBBbmRyb2lkTG9jYXRpb24uRk9MREVSX0FWRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZE5hbWUgKyBBdmRNYW5hZ2VyLkFWRF9GT0xERVJfRVhURU5TSU9OKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVmFsaWRhdGUgc2tpbiBpcyBlaXRoZXIgZGVmYXVsdCAoZW1wdHkpIG9yIE5OTnhNTU0gb3IgYSB2YWxpZCBza2luIG5hbWUuCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNraW5IYXJkd2FyZUNvbmZpZyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc2tpbiA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbVNraW4oKTsKLSAgICAgICAgICAgIGlmIChza2luICE9IG51bGwgJiYgc2tpbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc2tpbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChza2luICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gSXMgaXQgYSBrbm93IHNraW4gbmFtZSBmb3IgdGhpcyB0YXJnZXQ/Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHRhcmdldC5nZXRTa2lucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChza2luLmVxdWFsc0lnbm9yZUNhc2UocykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraW4gPSBzOyAgLy8gTWFrZSBza2luIG5hbWVzIGNhc2UtaW5zZW5zaXRpdmUuCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaGFyZHdhcmUgcHJvcGVydGllcyBmb3IgdGhpcyBza2luCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHNraW5Gb2xkZXIgPSBhdmRNYW5hZ2VyLmdldFNraW5QYXRoKHNraW4sIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHNraW5IYXJkd2FyZUZpbGUgPSBuZXcgRmlsZShza2luRm9sZGVyLCBBdmRNYW5hZ2VyLkhBUkRXQVJFX0lOSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbkhhcmR3YXJlRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW5IYXJkd2FyZUNvbmZpZyA9IFNka01hbmFnZXIucGFyc2VQcm9wZXJ0eUZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luSGFyZHdhcmVGaWxlLCBtU2RrTG9nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSXMgaXQgTk5OeE1NTT8KLSAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gQXZkTWFuYWdlci5OVU1FUklDX1NLSU5fU0laRS5tYXRjaGVyKHNraW4pLm1hdGNoZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTa2luTGlzdCh0YXJnZXQsICJWYWxpZCBza2luczogIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdCgiJyVzJyBpcyBub3QgYSB2YWxpZCBza2luIG5hbWUgb3Igc2l6ZSAoTk5OeE1NTSkiLCBza2luKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoYXJkd2FyZUNvbmZpZyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmlzUGxhdGZvcm0oKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQ29uZmlnID0gcHJvbXB0Rm9ySGFyZHdhcmUodGFyZ2V0LCBza2luSGFyZHdhcmVDb25maWcpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyBvbGRBdmRJbmZvIGlzIG5ldmVyIHJlYWQsIHlldCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAgICAgICAgICAgQXZkSW5mbyBvbGRBdmRJbmZvID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZW1vdmVQcmV2aW91cykgewotICAgICAgICAgICAgICAgIG9sZEF2ZEluZm8gPSBhdmRNYW5hZ2VyLmdldEF2ZChhdmROYW1lLCBmYWxzZSAvKnZhbGlkQXZkT25seSovKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vIG5ld0F2ZEluZm8gaXMgbmV2ZXIgcmVhZCwgeWV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gICAgICAgICAgICBBdmRJbmZvIG5ld0F2ZEluZm8gPSBhdmRNYW5hZ2VyLmNyZWF0ZUF2ZChhdmRGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgIGF2ZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgc2tpbiwKLSAgICAgICAgICAgICAgICAgICAgbVNka0NvbW1hbmRMaW5lLmdldFBhcmFtU2RDYXJkKCksCi0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICByZW1vdmVQcmV2aW91cywKLSAgICAgICAgICAgICAgICAgICAgbVNka0xvZyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYW4gQVZELiBJZiB0aGUgQVZEIG5hbWUgaXMgbm90IHBhcnQgb2YgdGhlIGF2YWlsYWJsZSBvbmVzIGxvb2sgZm9yIGFuCi0gICAgICogaW52YWxpZCBBVkQgKG9uZSBub3QgbG9hZGVkIGR1ZSB0byBzb21lIGVycm9yKSB0byByZW1vdmUgaXQgdG9vLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZWxldGVBdmQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXZkTmFtZSA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbU5hbWUoKTsKLSAgICAgICAgICAgIEF2ZE1hbmFnZXIgYXZkTWFuYWdlciA9IG5ldyBBdmRNYW5hZ2VyKG1TZGtNYW5hZ2VyLCBtU2RrTG9nKTsKLSAgICAgICAgICAgIEF2ZEluZm8gaW5mbyA9IGF2ZE1hbmFnZXIuZ2V0QXZkKGF2ZE5hbWUsIGZhbHNlIC8qdmFsaWRBdmRPbmx5Ki8pOwotCi0gICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJUaGVyZSBpcyBubyBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWVkICclcycuIiwgYXZkTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdmRNYW5hZ2VyLmRlbGV0ZUF2ZChpbmZvLCBtU2RrTG9nKTsKLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGVycm9yQW5kRXhpdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBhbiBBVkQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVBdmQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXZkTmFtZSA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbU5hbWUoKTsKLSAgICAgICAgICAgIEF2ZE1hbmFnZXIgYXZkTWFuYWdlciA9IG5ldyBBdmRNYW5hZ2VyKG1TZGtNYW5hZ2VyLCBtU2RrTG9nKTsKLSAgICAgICAgICAgIEF2ZEluZm8gaW5mbyA9IGF2ZE1hbmFnZXIuZ2V0QXZkKGF2ZE5hbWUsIHRydWUgLyp2YWxpZEF2ZE9ubHkqLyk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoIlRoZXJlIGlzIG5vIHZhbGlkIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgbmFtZWQgJyVzJy4iLCBhdmROYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZW5hbWUgaWYgdGhlcmUncyBhIG5ldyBuYW1lIGZvciB0aGUgQVZECi0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbU1vdmVOZXdOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmV3TmFtZSAhPSBudWxsICYmIG5ld05hbWUuZXF1YWxzKGluZm8uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIC8vIHNhbWUgbmFtZSwgbm90IGFjdHVhbGx5IGEgcmVuYW1lIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgIG5ld05hbWUgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZSAob2YgdGhlIGRhdGEgZmlsZXMpIGlmIHRoZXJlJ3MgYSBuZXcgbG9jYXRpb24gcGF0aAotICAgICAgICAgICAgU3RyaW5nIHBhcmFtRm9sZGVyUGF0aCA9IG1TZGtDb21tYW5kTGluZS5nZXRQYXJhbUxvY2F0aW9uUGF0aCgpOwotICAgICAgICAgICAgaWYgKHBhcmFtRm9sZGVyUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcGF0aHMgYXJlIHRoZSBzYW1lLiBVc2UgRmlsZSBtZXRob2RzIHRvIGFjY291bnQgZm9yIE9TIGlkaW9zeW5jcmFzaWVzLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShwYXJhbUZvbGRlclBhdGgpLmdldENhbm9uaWNhbEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKGluZm8uZ2V0UGF0aCgpKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmMS5lcXVhbHMoZjIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGNhbm9uaWNhbCBwYXRoLCBzbyBub3QgYWN0dWFsbHkgYSBtb3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUZvbGRlclBhdGggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRvIHJlc29sdmUgY2Fub25pY2FsIHBhdGguIEZhaWwgbm93IHNpbmNlIGEgbW92ZSBvcGVyYXRpb24gbWlnaHQgZmFpbAotICAgICAgICAgICAgICAgICAgICAvLyBsYXRlciBhbmQgYmUgaGFyZGVyIHRvIHJlY292ZXIgZnJvbS4KLSAgICAgICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5ld05hbWUgPT0gbnVsbCAmJiBwYXJhbUZvbGRlclBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZGtMb2cud2FybmluZygiTW92ZSBvcGVyYXRpb24gYWJvcnRlZDogc2FtZSBBVkQgbmFtZSwgc2FtZSBjYW5vbmljYWwgZGF0YSBwYXRoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBhIHJlbmFtZSB3YXMgcmVxdWVzdGVkIGFuZCBubyBkYXRhIG1vdmUgd2FzIHJlcXVlc3RlZCwgY2hlY2sgaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAvLyBkYXRhIHBhdGggaXMgb3VyIGRlZmF1bHQgY29uc3RydWN0ZWQgZnJvbSB0aGUgQVZEIG5hbWUuIEluIHRoaXMgY2FzZSB3ZSBzdGlsbCB3YW50Ci0gICAgICAgICAgICAvLyB0byByZW5hbWUgdGhhdCBmb2xkZXIgdG9vLgotICAgICAgICAgICAgaWYgKG5ld05hbWUgIT0gbnVsbCAmJiBwYXJhbUZvbGRlclBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIG9yaWdpbmFsIGRhdGEgcGF0aAotICAgICAgICAgICAgICAgIEZpbGUgb3JpZ2luYWxGb2xkZXIgPSBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRMb2NhdGlvbi5nZXRGb2xkZXIoKSArIEFuZHJvaWRMb2NhdGlvbi5GT0xERVJfQVZELAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXROYW1lKCkgKyBBdmRNYW5hZ2VyLkFWRF9GT0xERVJfRVhURU5TSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxGb2xkZXIuZXF1YWxzKGluZm8uZ2V0UGF0aCgpKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEFWRCBpcyB1c2luZyB0aGUgZGVmYXVsdCBkYXRhIGZvbGRlciBwYXRoIGJhc2VkIG9uIHRoZSBBVkQgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgZm9sZGVyIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCkgKyBBbmRyb2lkTG9jYXRpb24uRk9MREVSX0FWRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lICsgQXZkTWFuYWdlci5BVkRfRk9MREVSX0VYVEVOU0lPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUZvbGRlclBhdGggPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0byByZXNvbHZlIGNhbm9uaWNhbCBwYXRoLiBGYWlsIG5vdyByYXRoZXIgdGhhbiBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBjb25mbGljdHMKLSAgICAgICAgICAgIGlmIChuZXdOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZkTWFuYWdlci5nZXRBdmQobmV3TmFtZSwgZmFsc2UgLyp2YWxpZEF2ZE9ubHkqLykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoIlRoZXJlIGlzIGFscmVhZHkgYW4gQVZEIG5hbWVkICclcycuIiwgbmV3TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBGaWxlIGluaSA9IGluZm8uZ2V0SW5pRmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChpbmkuZXF1YWxzKEF2ZEluZm8uZ2V0SW5pRmlsZShuZXdOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JBbmRFeGl0KCJUaGUgQVZEIGZpbGUgJyVzJyBpcyBpbiB0aGUgd2F5LiIsIGluaS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW1Gb2xkZXJQYXRoICE9IG51bGwgJiYgbmV3IEZpbGUocGFyYW1Gb2xkZXJQYXRoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBpcyBhbHJlYWR5IGEgZmlsZSBvciBkaXJlY3RvcnkgYXQgJyVzJy5cblVzZSAtLXBhdGggdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBkYXRhIGZvbGRlci4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Gb2xkZXJQYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZkTWFuYWdlci5tb3ZlQXZkKGluZm8sIG5ld05hbWUsIHBhcmFtRm9sZGVyUGF0aCwgbVNka0xvZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhIGJyb2tlbiBBVkQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF2ZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBhdmROYW1lID0gbVNka0NvbW1hbmRMaW5lLmdldFBhcmFtTmFtZSgpOwotICAgICAgICAgICAgQXZkTWFuYWdlciBhdmRNYW5hZ2VyID0gbmV3IEF2ZE1hbmFnZXIobVNka01hbmFnZXIsIG1TZGtMb2cpOwotICAgICAgICAgICAgYXZkTWFuYWdlci51cGRhdGVBdmQoYXZkTmFtZSwgbVNka0xvZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhZGIgd2l0aCB0aGUgVVNCIGRldmljZXMgZGVjbGFyZWQgaW4gdGhlIFNESyBhZGQtb25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBZGIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2RrTWFuYWdlci51cGRhdGVBZGIoKTsKLQotICAgICAgICAgICAgbVNka0xvZy5wcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJhZGIgaGFzIGJlZW4gdXBkYXRlZC4gWW91IG11c3QgcmVzdGFydCBhZGIgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIlx0YWRiIGtpbGwtc2VydmVyXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIlx0YWRiIHN0YXJ0LXNlcnZlclxuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvckFuZEV4aXQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvbXB0cyB0aGUgdXNlciB0byBzZXR1cCBhIGhhcmR3YXJlIGNvbmZpZyBmb3IgYSBQbGF0Zm9ybS1iYXNlZCBBVkQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9tcHRGb3JIYXJkd2FyZShJQW5kcm9pZFRhcmdldCBjcmVhdGVUYXJnZXQsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNraW5IYXJkd2FyZUNvbmZpZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIHJlYWRMaW5lQnVmZmVyID0gbmV3IGJ5dGVbMjU2XTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRBbnN3ZXIgPSAibm8iOwotCi0gICAgICAgIG1TZGtMb2cucHJpbnRmKCIlcyBpcyBhIGJhc2ljIEFuZHJvaWQgcGxhdGZvcm0uXG4iLCBjcmVhdGVUYXJnZXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgbVNka0xvZy5wcmludGYoIkRvIHlvdSB3aXNoIHRvIGNyZWF0ZSBhIGN1c3RvbSBoYXJkd2FyZSBwcm9maWxlIFslc10iLAotICAgICAgICAgICAgICAgIGRlZmF1bHRBbnN3ZXIpOwotCi0gICAgICAgIHJlc3VsdCA9IHJlYWRMaW5lKHJlYWRMaW5lQnVmZmVyKS50cmltKCk7Ci0gICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0OgotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRBbnN3ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Qm9vbGVhblJlcGx5KHJlc3VsdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIG5vIGN1c3RvbSBjb25maWcsIHJldHVybiB0aGUgc2tpbiBoYXJkd2FyZSBjb25maWcgaW4gY2FzZSB0aGVyZSBpcyBvbmUuCi0gICAgICAgICAgICByZXR1cm4gc2tpbkhhcmR3YXJlQ29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNka0xvZy5wcmludGYoIlxuIik7IC8vIGVtcHR5IGxpbmUKLQotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgcG9zc2libGUgaGFyZHdhcmUgcHJvcGVydGllcwotICAgICAgICBGaWxlIGhhcmR3YXJlRGVmcyA9IG5ldyBGaWxlIChtT3NTZGtGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19MSUJfRk9MREVSLCBTZGtDb25zdGFudHMuRk5fSEFSRFdBUkVfSU5JKTsKLSAgICAgICAgTWFwPFN0cmluZywgSGFyZHdhcmVQcm9wZXJ0eT4gaHdNYXAgPSBIYXJkd2FyZVByb3BlcnRpZXMucGFyc2VIYXJkd2FyZURlZmluaXRpb25zKAotICAgICAgICAgICAgICAgIGhhcmR3YXJlRGVmcywgbnVsbCAvKnNka0xvZyovKTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAvLyB3ZSBqdXN0IHdhbnQgdG8gbG9vcCBvbiB0aGUgSGFyZHdhcmVQcm9wZXJ0aWVzCi0gICAgICAgIEhhcmR3YXJlUHJvcGVydHlbXSBod1Byb3BlcnRpZXMgPSBod01hcC52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBIYXJkd2FyZVByb3BlcnR5W2h3TWFwLnNpemUoKV0pOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBod1Byb3BlcnRpZXMubGVuZ3RoIDspIHsKLSAgICAgICAgICAgIEhhcmR3YXJlUHJvcGVydHkgcHJvcGVydHkgPSBod1Byb3BlcnRpZXNbaV07Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCIlczogJXNcbiIsIHByb3BlcnR5LmdldEFic3RyYWN0KCksIGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiVzXG4iLCBwcm9wZXJ0eS5nZXRBYnN0cmFjdCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5LmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0RnJvbVNraW4gPSBza2luSGFyZHdhcmVDb25maWcgIT0gbnVsbCA/IHNraW5IYXJkd2FyZUNvbmZpZy5nZXQoCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldE5hbWUoKSkgOiBudWxsOwotCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEZyb21Ta2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiJXMgWyVzIChmcm9tIHNraW4pXToiLCBwcm9wZXJ0eS5nZXROYW1lKCksIGRlZmF1bHRGcm9tU2tpbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIiVzIFslc106IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiJXMgKCVzKToiLCBwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRMaW5lKHJlYWRMaW5lQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0RnJvbVNraW4gIT0gbnVsbCB8fCBkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZyb21Ta2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gd3JpdGUgdGhpcyBvbmUgaW4gdGhlIEFWRCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHByb3BlcnR5LmdldE5hbWUoKSwgZGVmYXVsdEZyb21Ta2luKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCJcbiIpOyAvLyBlbXB0eSBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGkrKzsgLy8gZ28gdG8gdGhlIG5leHQgcHJvcGVydHkgaWYgd2UgaGF2ZSBhIHZhbGlkIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBubyBkZWZhdWx0LCB3ZSdsbCByZWRvIHRoaXMgcHJvcGVydHkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJvb2xlYW5SZXBseShyZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChwcm9wZXJ0eS5nZXROYW1lKCksICJ5ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7IC8vIHZhbGlkIHJlcGx5LCBtb3ZlIHRvIG5leHQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChwcm9wZXJ0eS5nZXROYW1lKCksICJubyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsgLy8gdmFsaWQgcmVwbHksIG1vdmUgdG8gbmV4dCBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGVycm9yLCBhbmQgZG8gbm90IGluY3JlbWVudCBpIHRvIHJlZG8gdGhpcyBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5wcmludGYoIlxuJXNcbiIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHByb3BlcnR5LmdldE5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsgLy8gdmFsaWQgcmVwbHksIG1vdmUgdG8gbmV4dCBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBlcnJvciwgYW5kIGRvIG5vdCBpbmNyZW1lbnQgaSB0byByZWRvIHRoaXMgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZGtMb2cucHJpbnRmKCJcbiVzXG4iLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNLU0laRToKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayB2YWxpZGl0eQotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHByb3BlcnR5LmdldE5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaSsrOyAvLyB2YWxpZCByZXBseSwgbW92ZSB0byBuZXh0IHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU2RrTG9nLnByaW50ZigiXG4iKTsgLy8gZW1wdHkgbGluZQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZWFkTGluZShieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgY291bnQgPSBTeXN0ZW0uaW4ucmVhZChidWZmZXIpOwotCi0gICAgICAgIC8vIGlzIHRoZSBpbnB1dCBsb25nZXIgdGhhbiB0aGUgYnVmZmVyPwotICAgICAgICBpZiAoY291bnQgPT0gYnVmZmVyLmxlbmd0aCAmJiBidWZmZXJbY291bnQtMV0gIT0gMTApIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0ZW1wIGJ1ZmZlcgotICAgICAgICAgICAgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVsyNTZdOwotCi0gICAgICAgICAgICAvLyBhbmQgcmVhZCB0aGUgcmVzdAotICAgICAgICAgICAgU3RyaW5nIHNlY29uZEhhbGYgPSByZWFkTGluZSh0ZW1wQnVmZmVyKTsKLQotICAgICAgICAgICAgLy8gcmV0dXJuIGEgY29uY2F0IG9mIGJvdGgKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgY291bnQpICsgc2Vjb25kSGFsZjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlnbm9yZSBlbmQgd2hpdGVzcGFjZQotICAgICAgICB3aGlsZSAoY291bnQgPiAwICYmIChidWZmZXJbY291bnQtMV0gPT0gJ1xyJyB8fCBidWZmZXJbY291bnQtMV0gPT0gJ1xuJykpIHsKLSAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIDAsIGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGEgYm9vbGVhbiBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5SZXBseShTdHJpbmcgcmVwbHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWQgOiBCT09MRUFOX1lFU19SRVBMSUVTKSB7Ci0gICAgICAgICAgICBpZiAodmFsaWQuZXF1YWxzSWdub3JlQ2FzZShyZXBseSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkIDogQk9PTEVBTl9OT19SRVBMSUVTKSB7Ci0gICAgICAgICAgICBpZiAodmFsaWQuZXF1YWxzSWdub3JlQ2FzZShyZXBseSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgdmFsaWQgcmVwbHkiLCByZXBseSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlcnJvckFuZEV4aXQoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uYXJncykgewotICAgICAgICBtU2RrTG9nLmVycm9yKG51bGwsIGZvcm1hdCwgYXJncyk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgc3ltYm9saWMgdGFyZ2V0IG5hbWUgKHN1Y2ggYXMgdGhvc2UgYWNjZXB0ZWQgYnkgLS10YXJnZXQgb24gdGhlIGNvbW1hbmQtbGluZSkKLSAgICAgKiB0byBhbiBpbnRlcm5hbCB0YXJnZXQgaW5kZXggaWQuIEEgdmFsaWQgdGFyZ2V0IG5hbWUgaXMgZWl0aGVyIGEgbnVtZXJpYyB0YXJnZXQgaWQgKD4gMCkKLSAgICAgKiBvciBhIHRhcmdldCBoYXNoIHN0cmluZy4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIGdpdmVuIHRhcmdldCBjYW4ndCBiZSBtYXBwZWQsIHtAbGluayAjSU5WQUxJRF9UQVJHRVRfSUR9ICgwKSBpcyByZXR1cm5lZC4KLSAgICAgKiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gb3V0cHV0IGFuIGVycm9yLgotICAgICAqIDxwLz4KLSAgICAgKiBPbiBzdWNjZXNzLCByZXR1cm5zIGEgdmFsdWUgPiAwLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJlc29sdmVUYXJnZXROYW1lKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0KLSAgICAgICAgaWYgKHRhcmdldE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfVEFSR0VUX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFyZ2V0TmFtZSA9IHRhcmdldE5hbWUudHJpbSgpOwotCi0gICAgICAgIC8vIENhc2Ugb2YgYW4gaW50ZWdlciBudW1iZXIKLSAgICAgICAgaWYgKHRhcmdldE5hbWUubWF0Y2hlcygiWzAtOV0qIikpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSBJbnRlZ2VyLnBhcnNlSW50KHRhcmdldE5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBuIDwgMSA/IElOVkFMSURfVEFSR0VUX0lEIDogbjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlLiBTaG91bGQgbm90IGhhcHBlbi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIExldCdzIHRyeSB0byBmaW5kIGEgcGxhdGZvcm0gb3IgYWRkb24gbmFtZS4KLSAgICAgICAgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzID0gbVNka01hbmFnZXIuZ2V0VGFyZ2V0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmVxdWFscyh0YXJnZXRzW2ldLmhhc2hTdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSU5WQUxJRF9UQVJHRVRfSUQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvU2RrQ29tbWFuZExpbmUuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL1Nka0NvbW1hbmRMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWU1ZGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvU2RrQ29tbWFuZExpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGttYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7Ci0KLQotLyoqCi0gKiBTcGVjaWZpYyBjb21tYW5kLWxpbmUgZmxhZ3MgZm9yIHRoZSB7QGxpbmsgU2RrTWFuYWdlcn0uCi0gKi8KLWNsYXNzIFNka0NvbW1hbmRMaW5lIGV4dGVuZHMgQ29tbWFuZExpbmVQcm9jZXNzb3IgewotCi0gICAgLyoKLSAgICAgKiBTdGVwcyBuZWVkZWQgdG8gYWRkIGEgbmV3IGFjdGlvbjoKLSAgICAgKiAtIEVhY2ggYWN0aW9uIGlzIGRlZmluZWQgYXMgYSAidmVyYiBvYmplY3QiIGZvbGxvd2VkIGJ5IHBhcmFtZXRlcnMuCi0gICAgICogLSBFaXRoZXIgcmV1c2UgYSBWRVJCXyBjb25zdGFudCBvciBkZWZpbmUgYSBuZXcgb25lLgotICAgICAqIC0gRWl0aGVyIHJldXNlIGFuIE9CSkVDVF8gY29uc3RhbnQgb3IgZGVmaW5lIGEgbmV3IG9uZS4KLSAgICAgKiAtIEFkZCBhIG5ldyBlbnRyeSB0byBtQWN0aW9uIHdpdGggYSBvbmUtbGluZSBoZWxwIHN1bW1hcnkuCi0gICAgICogLSBJbiB0aGUgY29uc3RydWN0b3IsIGFkZCBhIGRlZmluZSgpIGNhbGwgZm9yIGVhY2ggcGFyYW1ldGVyIChlaXRoZXIgbWFuZGF0b3J5Ci0gICAgICogICBvciBvcHRpb25hbCkgZm9yIHRoZSBnaXZlbiBhY3Rpb24uCi0gICAgICovCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRVJCX0xJU1QgICA9ICJsaXN0IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRVJCX0NSRUFURSA9ICJjcmVhdGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUkJfTU9WRSAgID0gIm1vdmUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUkJfREVMRVRFID0gImRlbGV0ZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkVSQl9VUERBVEUgPSAidXBkYXRlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9TREsgICAgICAgICAgPSAic2RrIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQVZEICAgICAgICAgID0gImF2ZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0FWRFMgICAgICAgICA9ICJhdmRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVEFSR0VUICAgICAgID0gInRhcmdldCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RBUkdFVFMgICAgICA9ICJ0YXJnZXRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfUFJPSkVDVCAgICAgID0gInByb2plY3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9URVNUX1BST0pFQ1QgPSAidGVzdC1wcm9qZWN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQURCICAgICAgICAgID0gImFkYiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfQUxJQVMgICAgICAgID0gImFsaWFzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfQUNUSVZJVFkgICAgID0gImFjdGl2aXR5IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ1RJVklUWSAgICAgPSBBUkdfQUNUSVZJVFk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BBQ0tBR0UgICAgICA9ICJwYWNrYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTU9ERSAgICAgICAgID0gIm1vZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UQVJHRVRfSUQgICAgPSBPQkpFQ1RfVEFSR0VUOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FICAgICAgICAgPSAibmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BBVEggICAgICAgICA9ICJwYXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMVEVSICAgICAgID0gImZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NLSU4gICAgICAgICA9ICJza2luIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0RDQVJEICAgICAgID0gInNkY2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZPUkNFICAgICAgICA9ICJmb3JjZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFTkFNRSAgICAgICA9ICJyZW5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJQUk9KRUNUUyAgPSAic3VicHJvamVjdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQUlOX1BST0pFQ1QgPSAibWFpbiI7Ci0KLSAgICAvKioKLSAgICAgKiBBY3Rpb24gZGVmaW5pdGlvbnMgZm9yIFNka01hbmFnZXIgY29tbWFuZCBsaW5lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGxpc3Qgc2VydmVzIHR3byBwdXJwb3NlczogZmlyc3QgaXQgaXMgdXNlZCB0byBrbm93IHdoaWNoIHZlcmIvb2JqZWN0Ci0gICAgICogYWN0aW9ucyBhcmUgYWNjZXB0YWJsZSBvbiB0aGUgY29tbWFuZC1saW5lOyBzZWNvbmQgaXQgcHJvdmlkZXMgYSBzdW1tYXJ5Ci0gICAgICogZm9yIGVhY2ggYWN0aW9uIHRoYXQgaXMgcHJpbnRlZCBpbiB0aGUgaGVscC4KLSAgICAgKiA8cC8+Ci0gICAgICogRWFjaCBlbnRyeSBpcyBhIHN0cmluZyBhcnJheSB3aXRoOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IHRoZSB2ZXJiLgotICAgICAqIDxsaT4gYW4gb2JqZWN0ICh1c2UgI05PX1ZFUkJfT0JKRUNUIGlmIHRoZXJlJ3Mgbm8gb2JqZWN0KS4KLSAgICAgKiA8bGk+IGEgZGVzY3JpcHRpb24uCi0gICAgICogPGxpPiBhbiBhbHRlcm5hdGUgZm9ybSBmb3IgdGhlIG9iamVjdCAoZS5nLiBwbHVyYWwpLgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW11bXSBBQ1RJT05TID0gewotICAgICAgICAgICAgeyBWRVJCX0xJU1QsIE5PX1ZFUkJfT0JKRUNULAotICAgICAgICAgICAgICAgICJMaXN0cyBleGlzdGluZyB0YXJnZXRzIG9yIHZpcnR1YWwgZGV2aWNlcy4iIH0sCi0gICAgICAgICAgICB7IFZFUkJfTElTVCwgT0JKRUNUX0FWRCwKLSAgICAgICAgICAgICAgICAiTGlzdHMgZXhpc3RpbmcgQW5kcm9pZCBWaXJ0dWFsIERldmljZXMuIiwKLSAgICAgICAgICAgICAgICBPQkpFQ1RfQVZEUyB9LAotICAgICAgICAgICAgeyBWRVJCX0xJU1QsIE9CSkVDVF9UQVJHRVQsCi0gICAgICAgICAgICAgICAgIkxpc3RzIGV4aXN0aW5nIHRhcmdldHMuIiwKLSAgICAgICAgICAgICAgICBPQkpFQ1RfVEFSR0VUUyB9LAotCi0gICAgICAgICAgICB7IFZFUkJfQ1JFQVRFLCBPQkpFQ1RfQVZELAotICAgICAgICAgICAgICAgICJDcmVhdGVzIGEgbmV3IEFuZHJvaWQgVmlydHVhbCBEZXZpY2UuIiB9LAotICAgICAgICAgICAgeyBWRVJCX01PVkUsIE9CSkVDVF9BVkQsCi0gICAgICAgICAgICAgICAgIk1vdmVzIG9yIHJlbmFtZXMgYW4gQW5kcm9pZCBWaXJ0dWFsIERldmljZS4iIH0sCi0gICAgICAgICAgICB7IFZFUkJfREVMRVRFLCBPQkpFQ1RfQVZELAotICAgICAgICAgICAgICAgICJEZWxldGVzIGFuIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UuIiB9LAotICAgICAgICAgICAgeyBWRVJCX1VQREFURSwgT0JKRUNUX0FWRCwKLSAgICAgICAgICAgICAgICAiVXBkYXRlcyBhbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIHRvIG1hdGNoIHRoZSBmb2xkZXJzIG9mIGEgbmV3IFNESy4iIH0sCi0KLSAgICAgICAgICAgIHsgVkVSQl9DUkVBVEUsIE9CSkVDVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJDcmVhdGVzIGEgbmV3IEFuZHJvaWQgUHJvamVjdC4iIH0sCi0gICAgICAgICAgICB7IFZFUkJfVVBEQVRFLCBPQkpFQ1RfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAiVXBkYXRlcyBhbiBBbmRyb2lkIFByb2plY3QgKG11c3QgaGF2ZSBhbiBBbmRyb2lkTWFuaWZlc3QueG1sKS4iIH0sCi0KLSAgICAgICAgICAgIHsgVkVSQl9DUkVBVEUsIE9CSkVDVF9URVNUX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgIkNyZWF0ZXMgYSBuZXcgQW5kcm9pZCBUZXN0IFByb2plY3QuIiB9LAotICAgICAgICAgICAgeyBWRVJCX1VQREFURSwgT0JKRUNUX1RFU1RfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAiVXBkYXRlcyBhbiBBbmRyb2lkIFRlc3QgUHJvamVjdCAobXVzdCBoYXZlIGFuIEFuZHJvaWRNYW5pZmVzdC54bWwpLiIgfSwKLQotICAgICAgICAgICAgeyBWRVJCX1VQREFURSwgT0JKRUNUX0FEQiwKLSAgICAgICAgICAgICAgICAiVXBkYXRlcyBhZGIgdG8gc3VwcG9ydCB0aGUgVVNCIGRldmljZXMgZGVjbGFyZWQgaW4gdGhlIFNESyBhZGQtb25zLiIgfSwKLQotICAgICAgICAgICAgeyBWRVJCX1VQREFURSwgT0JKRUNUX1NESywKLSAgICAgICAgICAgICAgICAiVXBkYXRlcyB0aGUgU0RLIGJ5IHN1Z2dlc3RpbmcgbmV3IHBsYXRmb3JtcyB0byBpbnN0YWxsIGlmIGF2YWlsYWJsZS4iIH0KLSAgICAgICAgfTsKLQotICAgIHB1YmxpYyBTZGtDb21tYW5kTGluZShJU2RrTG9nIGxvZ2dlcikgewotICAgICAgICBzdXBlcihsb2dnZXIsIEFDVElPTlMpOwotCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgYWN0aW9ucyBkZWZpbmVkIGluIG1BY3Rpb24uCi0KLSAgICAgICAgLy8gLS0tIGNyZWF0ZSBhdmQgLS0tCi0KLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBWRVJCX0NSRUFURSwgT0JKRUNUX0FWRCwgInAiLCBLRVlfUEFUSCwKLSAgICAgICAgICAgICAgICAiTG9jYXRpb24gcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgQVZEIHdpbGwgYmUgY3JlYXRlZCIsIG51bGwpOwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUsCi0gICAgICAgICAgICAgICAgVkVSQl9DUkVBVEUsIE9CSkVDVF9BVkQsICJuIiwgS0VZX05BTUUsCi0gICAgICAgICAgICAgICAgIk5hbWUgb2YgdGhlIG5ldyBBVkQiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfQ1JFQVRFLCBPQkpFQ1RfQVZELCAidCIsIEtFWV9UQVJHRVRfSUQsCi0gICAgICAgICAgICAgICAgIlRhcmdldCBpZCBvZiB0aGUgbmV3IEFWRCIsIG51bGwpOwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIGZhbHNlLAotICAgICAgICAgICAgICAgIFZFUkJfQ1JFQVRFLCBPQkpFQ1RfQVZELCAicyIsIEtFWV9TS0lOLAotICAgICAgICAgICAgICAgICJTa2luIG9mIHRoZSBuZXcgQVZEIiwgbnVsbCk7Ci0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgZmFsc2UsCi0gICAgICAgICAgICAgICAgVkVSQl9DUkVBVEUsIE9CSkVDVF9BVkQsICJjIiwgS0VZX1NEQ0FSRCwKLSAgICAgICAgICAgICAgICAiUGF0aCB0byBhIHNoYXJlZCBTRCBjYXJkIGltYWdlLCBvciBzaXplIG9mIGEgbmV3IHNkY2FyZCBmb3IgdGhlIG5ldyBBVkQiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuQk9PTEVBTiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgVkVSQl9DUkVBVEUsIE9CSkVDVF9BVkQsICJmIiwgS0VZX0ZPUkNFLAotICAgICAgICAgICAgICAgICJGb3JjZSBjcmVhdGlvbiAob3ZlcnJpZGUgYW4gZXhpc3RpbmcgQVZEKSIsIGZhbHNlKTsKLQotICAgICAgICAvLyAtLS0gZGVsZXRlIGF2ZCAtLS0KLQotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUsCi0gICAgICAgICAgICAgICAgVkVSQl9ERUxFVEUsIE9CSkVDVF9BVkQsICJuIiwgS0VZX05BTUUsCi0gICAgICAgICAgICAgICAgIk5hbWUgb2YgdGhlIEFWRCB0byBkZWxldGUiLCBudWxsKTsKLQotICAgICAgICAvLyAtLS0gbW92ZSBhdmQgLS0tCi0KLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfTU9WRSwgT0JKRUNUX0FWRCwgIm4iLCBLRVlfTkFNRSwKLSAgICAgICAgICAgICAgICAiTmFtZSBvZiB0aGUgQVZEIHRvIG1vdmUgb3IgcmVuYW1lIiwgbnVsbCk7Ci0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgZmFsc2UsCi0gICAgICAgICAgICAgICAgVkVSQl9NT1ZFLCBPQkpFQ1RfQVZELCAiciIsIEtFWV9SRU5BTUUsCi0gICAgICAgICAgICAgICAgIk5ldyBuYW1lIG9mIHRoZSBBVkQgdG8gcmVuYW1lIiwgbnVsbCk7Ci0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgZmFsc2UsCi0gICAgICAgICAgICAgICAgVkVSQl9NT1ZFLCBPQkpFQ1RfQVZELCAicCIsIEtFWV9QQVRILAotICAgICAgICAgICAgICAgICJOZXcgbG9jYXRpb24gcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIG1vdmUgdGhlIEFWRCIsIG51bGwpOwotCi0gICAgICAgIC8vIC0tLSB1cGRhdGUgYXZkIC0tLQotCi0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBWRVJCX1VQREFURSwgT0JKRUNUX0FWRCwgIm4iLCBLRVlfTkFNRSwKLSAgICAgICAgICAgICAgICAiTmFtZSBvZiB0aGUgQVZEIHRvIHVwZGF0ZSIsIG51bGwpOwotCi0gICAgICAgIC8vIC0tLSBjcmVhdGUgcHJvamVjdCAtLS0KLQotICAgICAgICAvKiBEaXNhYmxlZCBmb3IgQURUIDAuOSAvIEN1cGNha2UgU0RLIDEuNV9yMSByZWxlYXNlLiBbYnVnICMxNzk1NzE4XS4KLSAgICAgICAgICAgVGhpcyBjdXJyZW50bHkgZG9lcyBub3Qgd29yaywgdGhlIGFsaWFzIGJ1aWxkIHJ1bGVzIG5lZWQgdG8gYmUgZml4ZWQuCi0KLSAgICAgICAgZGVmaW5lKE1vZGUuRU5VTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBWRVJCX0NSRUFURSwgT0JKRUNUX1BST0pFQ1QsICJtIiwgS0VZX01PREUsCi0gICAgICAgICAgICAgICAgIlByb2plY3QgbW9kZSIsIG5ldyBTdHJpbmdbXSB7IEFSR19BQ1RJVklUWSwgQVJHX0FMSUFTIH0pOwotICAgICAgICAqLwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUsCi0gICAgICAgICAgICAgICAgVkVSQl9DUkVBVEUsIE9CSkVDVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJwIiwgS0VZX1BBVEgsCi0gICAgICAgICAgICAgICAgIkxvY2F0aW9uIHBhdGggb2YgbmV3IHByb2plY3QiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfQ1JFQVRFLCBPQkpFQ1RfUFJPSkVDVCwgInQiLCBLRVlfVEFSR0VUX0lELAotICAgICAgICAgICAgICAgICJUYXJnZXQgaWQgb2YgdGhlIG5ldyBwcm9qZWN0IiwgbnVsbCk7Ci0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBWRVJCX0NSRUFURSwgT0JKRUNUX1BST0pFQ1QsICJrIiwgS0VZX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgIlBhY2thZ2UgbmFtZSIsIG51bGwpOwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUsCi0gICAgICAgICAgICAgICAgVkVSQl9DUkVBVEUsIE9CSkVDVF9QUk9KRUNULCAiYSIsIEtFWV9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbmFtZSIsIG51bGwpOwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIGZhbHNlLAotICAgICAgICAgICAgICAgIFZFUkJfQ1JFQVRFLCBPQkpFQ1RfUFJPSkVDVCwgIm4iLCBLRVlfTkFNRSwKLSAgICAgICAgICAgICAgICAiUHJvamVjdCBuYW1lIiwgbnVsbCk7Ci0KLSAgICAgICAgLy8gLS0tIGNyZWF0ZSB0ZXN0LXByb2plY3QgLS0tCi0KLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfQ1JFQVRFLCBPQkpFQ1RfVEVTVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJwIiwgS0VZX1BBVEgsCi0gICAgICAgICAgICAgICAgIkxvY2F0aW9uIHBhdGggb2YgbmV3IHByb2plY3QiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBWRVJCX0NSRUFURSwgT0JKRUNUX1RFU1RfUFJPSkVDVCwgIm4iLCBLRVlfTkFNRSwKLSAgICAgICAgICAgICAgICAiUHJvamVjdCBuYW1lIiwgbnVsbCk7Ci0gICAgICAgIGRlZmluZShNb2RlLlNUUklORywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBWRVJCX0NSRUFURSwgT0JKRUNUX1RFU1RfUFJPSkVDVCwgIm0iLCBLRVlfTUFJTl9QUk9KRUNULAotICAgICAgICAgICAgICAgICJMb2NhdGlvbiBwYXRoIG9mIHRoZSBwcm9qZWN0IHRvIHRlc3QsIHJlbGF0aXZlIHRvIHRoZSBuZXcgcHJvamVjdCIsIG51bGwpOwotCi0gICAgICAgIC8vIC0tLSB1cGRhdGUgcHJvamVjdCAtLS0KLQotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUsCi0gICAgICAgICAgICAgICAgVkVSQl9VUERBVEUsIE9CSkVDVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJwIiwgS0VZX1BBVEgsCi0gICAgICAgICAgICAgICAgIkxvY2F0aW9uIHBhdGggb2YgdGhlIHByb2plY3QiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBWRVJCX1VQREFURSwgT0JKRUNUX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgInQiLCBLRVlfVEFSR0VUX0lELAotICAgICAgICAgICAgICAgICJUYXJnZXQgaWQgdG8gc2V0IGZvciB0aGUgcHJvamVjdCIsIG51bGwpOwotICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIGZhbHNlLAotICAgICAgICAgICAgICAgIFZFUkJfVVBEQVRFLCBPQkpFQ1RfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAibiIsIEtFWV9OQU1FLAotICAgICAgICAgICAgICAgICJQcm9qZWN0IG5hbWUiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuQk9PTEVBTiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgVkVSQl9VUERBVEUsIE9CSkVDVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJzIiwgS0VZX1NVQlBST0pFQ1RTLAotICAgICAgICAgICAgICAgICJBbHNvIHVwZGF0ZSBhbnkgcHJvamVjdHMgaW4gc3ViLWZvbGRlcnMsIHN1Y2ggYXMgdGVzdCBwcm9qZWN0cy4iLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gLS0tIHVwZGF0ZSB0ZXN0IHByb2plY3QgLS0tCi0KLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfVVBEQVRFLCBPQkpFQ1RfVEVTVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJwIiwgS0VZX1BBVEgsCi0gICAgICAgICAgICAgICAgIkxvY2F0aW9uIHBhdGggb2YgdGhlIHByb2plY3QiLCBudWxsKTsKLSAgICAgICAgZGVmaW5lKE1vZGUuU1RSSU5HLCB0cnVlLAotICAgICAgICAgICAgICAgIFZFUkJfVVBEQVRFLCBPQkpFQ1RfVEVTVF9QUk9KRUNULAotICAgICAgICAgICAgICAgICJtIiwgS0VZX01BSU5fUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAiTG9jYXRpb24gcGF0aCBvZiB0aGUgcHJvamVjdCB0byB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgbmV3IHByb2plY3QiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRMYWNrT2ZWZXJiKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyAtLSBzb21lIGhlbHBlcnMgZm9yIGdlbmVyaWMgYWN0aW9uIGZsYWdzCi0KLSAgICAvKiogSGVscGVyIHRvIHJldHJpZXZlIHRoZSAtLXBhdGggdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbUxvY2F0aW9uUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKG51bGwsIG51bGwsIEtFWV9QQVRIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgdG8gcmV0cmlldmUgdGhlIC0tdGFyZ2V0IGlkIHZhbHVlLgotICAgICAqIFRoZSBpZCBpcyBhIHN0cmluZy4gSXQgY2FuIGJlIG9uZSBvZjoKLSAgICAgKiAtIGFuIGludGVnZXIsIGluIHdoaWNoIGNhc2UgaXQncyB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCAoY2YgImFuZHJvaWQgbGlzdCB0YXJnZXRzIikKLSAgICAgKiAtIGEgc3ltYm9saWMgbmFtZSBzdWNoIGFzIGFuZHJvaWQtTiBmb3IgcGxhdGZvcm4gQVBJIE4KLSAgICAgKiAtIGEgc3ltYm9saWMgYWRkLW9uIG5hbWUgc3VjaCBhcyB3cml0dGVuIGluIHRoZSBhdmQvKi5pbmkgZmlsZXMsCi0gICAgICogICBlLmcuICJHb29nbGUgSW5jLjpHb29nbGUgQVBJczozIgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1UYXJnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKG51bGwsIG51bGwsIEtFWV9UQVJHRVRfSUQpOwotICAgIH0KLQotICAgIC8qKiBIZWxwZXIgdG8gcmV0cmlldmUgdGhlIC0tbmFtZSB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKG51bGwsIG51bGwsIEtFWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKiogSGVscGVyIHRvIHJldHJpZXZlIHRoZSAtLXNraW4gdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbVNraW4oKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXRWYWx1ZShudWxsLCBudWxsLCBLRVlfU0tJTik7Ci0gICAgfQotCi0gICAgLyoqIEhlbHBlciB0byByZXRyaWV2ZSB0aGUgLS1zZGNhcmQgdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbVNkQ2FyZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKG51bGwsIG51bGwsIEtFWV9TRENBUkQpOwotICAgIH0KLQotICAgIC8qKiBIZWxwZXIgdG8gcmV0cmlldmUgdGhlIC0tZm9yY2UgZmxhZy4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGbGFnRm9yY2UoKSB7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGdldFZhbHVlKG51bGwsIG51bGwsIEtFWV9GT1JDRSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8vIC0tIHNvbWUgaGVscGVycyBmb3IgYXZkIGFjdGlvbiBmbGFncwotCi0gICAgLyoqIEhlbHBlciB0byByZXRyaWV2ZSB0aGUgLS1yZW5hbWUgdmFsdWUgZm9yIGEgbW92ZSB2ZXJiLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1Nb3ZlTmV3TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKFZFUkJfTU9WRSwgbnVsbCwgS0VZX1JFTkFNRSk7Ci0gICAgfQotCi0KLSAgICAvLyAtLSBzb21lIGhlbHBlcnMgZm9yIHByb2plY3QgYWN0aW9uIGZsYWdzCi0KLSAgICAvKiogSGVscGVyIHRvIHJldHJpZXZlIHRoZSAtLXBhY2thZ2UgdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbVByb2plY3RQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gKChTdHJpbmcpIGdldFZhbHVlKG51bGwsIE9CSkVDVF9QUk9KRUNULCBLRVlfUEFDS0FHRSkpOwotICAgIH0KLQotICAgIC8qKiBIZWxwZXIgdG8gcmV0cmlldmUgdGhlIC0tYWN0aXZpdHkgZm9yIGFueSBwcm9qZWN0IGFjdGlvbi4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtUHJvamVjdEFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gKChTdHJpbmcpIGdldFZhbHVlKG51bGwsIE9CSkVDVF9QUk9KRUNULCBLRVlfQUNUSVZJVFkpKTsKLSAgICB9Ci0KLSAgICAvKiogSGVscGVyIHRvIHJldHJpZXZlIHRoZSAtLXN1YnByb2plY3RzIGZvciBhbnkgcHJvamVjdCBhY3Rpb24uICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UGFyYW1TdWJQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKChCb29sZWFuKSBnZXRWYWx1ZShudWxsLCBPQkpFQ1RfUFJPSkVDVCwgS0VZX1NVQlBST0pFQ1RTKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLy8gLS0gc29tZSBoZWxwZXJzIGZvciB0ZXN0LXByb2plY3QgYWN0aW9uIGZsYWdzCi0KLSAgICAvKiogSGVscGVyIHRvIHJldHJpZXZlIHRoZSAtLW1haW4gdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbVRlc3RQcm9qZWN0TWFpbigpIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBnZXRWYWx1ZShudWxsLCBudWxsLCBLRVlfTUFJTl9QUk9KRUNUKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BYm91dFBhZ2UuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL2ludGVybmFsL3JlcG9zaXRvcnkvQWJvdXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MmEwNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BYm91dFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbWFuYWdlci5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGttYW5hZ2VyLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotcHVibGljIGNsYXNzIEFib3V0UGFnZSBleHRlbmRzIENvbXBvc2l0ZSB7DQotDQotICAgIHByaXZhdGUgTGFiZWwgbUxhYmVsOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIHRoZSBjb21wb3NpdGUuDQotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGUgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFib3V0UGFnZShDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5CT1JERVIpOw0KLQ0KLSAgICAgICAgY3JlYXRlQ29udGVudHModGhpcyk7DQotDQotICAgICAgICBwb3N0Q3JlYXRlKCk7ICAvLyRoaWRlJA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7DQotDQotICAgICAgICBMYWJlbCBsb2dvID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOw0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW1hZ2VTdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibG9nby5wbmciKTsNCi0NCi0gICAgICAgIGlmIChpbWFnZVN0cmVhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgSW1hZ2UgaW1nID0gbmV3IEltYWdlKHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgaW1hZ2VTdHJlYW0pOw0KLSAgICAgICAgICAgIGxvZ28uc2V0SW1hZ2UoaW1nKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsNCi0gICAgICAgIG1MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsNCi0gICAgICAgIG1MYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoDQotICAgICAgICAgICAgICAgICJBbmRyb2lkIFNESyBVcGRhdGVyLlxuUmV2aXNpb24gJTEkc1xuQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuIiwNCi0gICAgICAgICAgICAgICAgZ2V0UmV2aXNpb24oKSkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1YmNsYXNzKCkgew0KLSAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWJjbGFzc2luZyBvZiBTV1QgY29tcG9uZW50cw0KLSAgICB9DQotDQotICAgIC8vIC0tIFN0YXJ0IG9mIGludGVybmFsIHBhcnQgLS0tLS0tLS0tLQ0KLSAgICAvLyBIaWRlIGV2ZXJ5dGhpbmcgZG93bi1iZWxvdyBmcm9tIFNXVCBkZXNpZ25lcg0KLSAgICAvLyRoaWRlPj4kDQotDQotICAgIC8qKg0KLSAgICAgKiBDYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yIHJpZ2h0IGFmdGVyIHtAbGluayAjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKX0uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcG9zdENyZWF0ZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICAvLyBFbmQgb2YgaGlkaW5nIGZyb20gU1dUIERlc2lnbmVyDQotICAgIC8vJGhpZGU8PCQNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmV2aXNpb24oKSB7DQotICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFN0cmluZyB0b29sc2RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNYWluLlRPT0xTRElSKTsNCi0gICAgICAgICAgICBGaWxlIHNvdXJjZVByb3A7DQotICAgICAgICAgICAgaWYgKHRvb2xzZGlyID09IG51bGwgfHwgdG9vbHNkaXIubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBzb3VyY2VQcm9wID0gbmV3IEZpbGUoInNvdXJjZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBzb3VyY2VQcm9wID0gbmV3IEZpbGUodG9vbHNkaXIsICJzb3VyY2UucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZVByb3ApKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmV2aXNpb24gPSBwLmdldFByb3BlcnR5KCJQa2cuUmV2aXNpb24iKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIGlmIChyZXZpc2lvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXZpc2lvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGZpbGU/IGRvbid0IHBpbmcuDQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gY291bGRuJ3QgZmluZCB0aGUgZmlsZT8gZG9uJ3QgcGluZy4NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiPyI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9TZXR0aW5nc1BhZ2UuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL2ludGVybmFsL3JlcG9zaXRvcnkvU2V0dGluZ3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4MDAwNTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9TZXR0aW5nc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbWFuYWdlci5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklTZXR0aW5nc1BhZ2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgU2V0dGluZ3NQYWdlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSVNldHRpbmdzUGFnZSB7DQotDQotICAgIC8vIGRhdGEgbWVtYmVycw0KLSAgICBwcml2YXRlIFNldHRpbmdzQ2hhbmdlZENhbGxiYWNrIG1TZXR0aW5nc0NoYW5nZWRDYWxsYmFjazsNCi0NCi0gICAgLy8gVUkgd2lkZ2V0cw0KLSAgICBwcml2YXRlIEdyb3VwIG1Qcm94eVNldHRpbmdzR3JvdXA7DQotICAgIHByaXZhdGUgR3JvdXAgbU1pc2NHcm91cDsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbUFwcGx5QnV0dG9uOw0KLSAgICBwcml2YXRlIExhYmVsIG1Qcm94eVNlcnZlckxhYmVsOw0KLSAgICBwcml2YXRlIExhYmVsIG1Qcm94eVBvcnRMYWJlbDsNCi0gICAgcHJpdmF0ZSBUZXh0IG1Qcm94eVNlcnZlclRleHQ7DQotICAgIHByaXZhdGUgVGV4dCBtUHJveHlQb3J0VGV4dDsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbUZvcmNlSHR0cENoZWNrOw0KLSAgICBwcml2YXRlIEJ1dHRvbiBtQXNrQWRiUmVzdGFydENoZWNrOw0KLQ0KLSAgICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1TZXRBcHBseURpcnR5ID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgew0KLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQotICAgICAgICAgICAgbUFwcGx5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZS4NCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSBjb21wb3NpdGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2V0dGluZ3NQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULkJPUkRFUik7DQotDQotICAgICAgICBjcmVhdGVDb250ZW50cyh0aGlzKTsNCi0NCi0gICAgICAgIG1Qcm94eVNldHRpbmdzR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOw0KLSAgICAgICAgbVByb3h5U2V0dGluZ3NHcm91cC5zZXRUZXh0KCJQcm94eSBTZXR0aW5ncyIpOw0KLSAgICAgICAgbVByb3h5U2V0dGluZ3NHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsNCi0gICAgICAgIG1Qcm94eVNldHRpbmdzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7DQotDQotICAgICAgICBtUHJveHlTZXJ2ZXJMYWJlbCA9IG5ldyBMYWJlbChtUHJveHlTZXR0aW5nc0dyb3VwLCBTV1QuTk9ORSk7DQotICAgICAgICBtUHJveHlTZXJ2ZXJMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOw0KLSAgICAgICAgbVByb3h5U2VydmVyTGFiZWwuc2V0VGV4dCgiSFRUUCBQcm94eSBTZXJ2ZXIiKTsNCi0gICAgICAgIFN0cmluZyB0b29sdGlwID0gIlRoZSBETlMgbmFtZSBvciBJUCBvZiB0aGUgSFRUUCBwcm94eSBzZXJ2ZXIgdG8gdXNlLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gZW1wdHksIG5vIEhUVFAgcHJveHkgaXMgdXNlZC4iOw0KLSAgICAgICAgbVByb3h5U2VydmVyTGFiZWwuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7DQotDQotICAgICAgICBtUHJveHlTZXJ2ZXJUZXh0ID0gbmV3IFRleHQobVByb3h5U2V0dGluZ3NHcm91cCwgU1dULkJPUkRFUik7DQotICAgICAgICBtUHJveHlTZXJ2ZXJUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOw0KLSAgICAgICAgbVByb3h5U2VydmVyVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtU2V0QXBwbHlEaXJ0eSk7DQotICAgICAgICBtUHJveHlTZXJ2ZXJUZXh0LnNldFRvb2xUaXBUZXh0KHRvb2x0aXApOw0KLQ0KLSAgICAgICAgbVByb3h5UG9ydExhYmVsID0gbmV3IExhYmVsKG1Qcm94eVNldHRpbmdzR3JvdXAsIFNXVC5OT05FKTsNCi0gICAgICAgIG1Qcm94eVBvcnRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOw0KLSAgICAgICAgbVByb3h5UG9ydExhYmVsLnNldFRleHQoIkhUVFAgUHJveHkgUG9ydCIpOw0KLSAgICAgICAgdG9vbHRpcCA9ICJUaGUgcG9ydCBvZiB0aGUgSFRUUCBwcm94eSBzZXJ2ZXIgdG8gdXNlLiAiICsNCi0gICAgICAgICAgICAgICAgICAiV2hlbiBlbXB0eSwgdGhlIGRlZmF1bHQgZm9yIEhUVFAgb3IgSFRUUFMgaXMgdXNlZC4iOw0KLSAgICAgICAgbVByb3h5UG9ydExhYmVsLnNldFRvb2xUaXBUZXh0KHRvb2x0aXApOw0KLQ0KLSAgICAgICAgbVByb3h5UG9ydFRleHQgPSBuZXcgVGV4dChtUHJveHlTZXR0aW5nc0dyb3VwLCBTV1QuQk9SREVSKTsNCi0gICAgICAgIG1Qcm94eVBvcnRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOw0KLSAgICAgICAgbVByb3h5UG9ydFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobVNldEFwcGx5RGlydHkpOw0KLSAgICAgICAgbVByb3h5UG9ydFRleHQuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7DQotDQotICAgICAgICBtTWlzY0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsNCi0gICAgICAgIG1NaXNjR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7DQotICAgICAgICBtTWlzY0dyb3VwLnNldFRleHQoIk1pc2MiKTsNCi0gICAgICAgIG1NaXNjR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7DQotDQotICAgICAgICBtRm9yY2VIdHRwQ2hlY2sgPSBuZXcgQnV0dG9uKG1NaXNjR3JvdXAsIFNXVC5DSEVDSyk7DQotICAgICAgICBtRm9yY2VIdHRwQ2hlY2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7DQotICAgICAgICBtRm9yY2VIdHRwQ2hlY2suc2V0VGV4dCgiRm9yY2UgaHR0cHM6Ly8uLi4gc291cmNlcyB0byBiZSBmZXRjaGVkIHVzaW5nIGh0dHA6Ly8uLi4iKTsNCi0gICAgICAgIG1Gb3JjZUh0dHBDaGVjay5zZXRUb29sVGlwVGV4dCgiSWYgeW91IGFyZSBub3QgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBvZmZpY2lhbCBBbmRyb2lkIHJlcG9zaXRvcnkgIiArDQotICAgICAgICAgICAgICAgICJ1c2luZyBIVFRQUywgZW5hYmxlIHRoaXMgc2V0dGluZyB0byBmb3JjZSBhY2Nlc3NpbmcgaXQgdmlhIEhUVFAuIik7DQotICAgICAgICBtRm9yY2VIdHRwQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBvbkZvcmNlSHR0cFNlbGVjdGVkKCk7ICAvLyRoaWRlJA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgbUFza0FkYlJlc3RhcnRDaGVjayA9IG5ldyBCdXR0b24obU1pc2NHcm91cCwgU1dULkNIRUNLKTsNCi0gICAgICAgIG1Bc2tBZGJSZXN0YXJ0Q2hlY2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7DQotICAgICAgICBtQXNrQWRiUmVzdGFydENoZWNrLnNldFRleHQoIkFzayBiZWZvcmUgcmVzdGFydGluZyBBREIiKTsNCi0gICAgICAgIG1Bc2tBZGJSZXN0YXJ0Q2hlY2suc2V0VG9vbFRpcFRleHQoIldoZW4gY2hlY2tlZCwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCBmb3IgcGVybWlzc2lvbiAiICsNCi0gICAgICAgICAgICAgICAgInRvIHJlc3RhcnQgQURCIGFmdGVyIHVwZGF0aW5nIGFuIGFkZG9uLW9uIHBhY2thZ2Ugb3IgYSB0b29sIHBhY2thZ2UuIik7DQotICAgICAgICBtQXNrQWRiUmVzdGFydENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25Gb3JjZUh0dHBTZWxlY3RlZCgpOyAgLy8kaGlkZSQNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIG1BcHBseUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOw0KLSAgICAgICAgbUFwcGx5QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7DQotICAgICAgICBtQXBwbHlCdXR0b24uc2V0VGV4dCgiU2F2ZSAmJiBBcHBseSIpOw0KLSAgICAgICAgbUFwcGx5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25BcHBseVNlbGVjdGVkKCk7IC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBwb3N0Q3JlYXRlKCk7ICAvLyRoaWRlJA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7DQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1YmNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzDQotICAgIH0NCi0NCi0NCi0NCi0gICAgLy8gLS0gU3RhcnQgb2YgaW50ZXJuYWwgcGFydCAtLS0tLS0tLS0tDQotICAgIC8vIEhpZGUgZXZlcnl0aGluZyBkb3duLWJlbG93IGZyb20gU1dUIGRlc2lnbmVyDQotICAgIC8vJGhpZGU+PiQNCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgcmlnaHQgYWZ0ZXIge0BsaW5rICNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpfS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3N0Q3JlYXRlKCkgew0KLSAgICB9DQotDQotICAgIC8qKiBMb2FkcyBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgUHJvcGVydGllc30gY29udGFpbmVyIGFuZCB1cGRhdGUgdGhlIHBhZ2UgVUkuICovDQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXR0aW5ncyhQcm9wZXJ0aWVzIGluX3NldHRpbmdzKSB7DQotICAgICAgICBtUHJveHlTZXJ2ZXJUZXh0LnNldFRleHQoaW5fc2V0dGluZ3MuZ2V0UHJvcGVydHkoS0VZX0hUVFBfUFJPWFlfSE9TVCwgIiIpKTsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIG1Qcm94eVBvcnRUZXh0LnNldFRleHQoICBpbl9zZXR0aW5ncy5nZXRQcm9wZXJ0eShLRVlfSFRUUF9QUk9YWV9QT1JULCAiIikpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgbUZvcmNlSHR0cENoZWNrLnNldFNlbGVjdGlvbihCb29sZWFuLnBhcnNlQm9vbGVhbihpbl9zZXR0aW5ncy5nZXRQcm9wZXJ0eShLRVlfRk9SQ0VfSFRUUCkpKTsNCi0gICAgICAgIG1Bc2tBZGJSZXN0YXJ0Q2hlY2suc2V0U2VsZWN0aW9uKEJvb2xlYW4ucGFyc2VCb29sZWFuKGluX3NldHRpbmdzLmdldFByb3BlcnR5KEtFWV9BU0tfQURCX1JFU1RBUlQpKSk7DQotDQotICAgICAgICAvLyBXZSBsb2FkZWQgZnJlc2ggc2V0dGluZ3Mgc28gdGhlcmUncyBub3RoaW5nIGRpcnR5IHRvIGFwcGx5DQotICAgICAgICBtQXBwbHlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgLyoqIENhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgc2V0dGluZ3MgZnJvbSB0aGUgVUkgYW5kIHN0b3JlIHRoZW0gaW4NCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBQcm9wZXJ0aWVzfSBjb250YWluZXIuICovDQotICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlU2V0dGluZ3MoUHJvcGVydGllcyBvdXRfc2V0dGluZ3MpIHsNCi0gICAgICAgIG91dF9zZXR0aW5ncy5zZXRQcm9wZXJ0eShLRVlfSFRUUF9QUk9YWV9IT1NULCBtUHJveHlTZXJ2ZXJUZXh0LmdldFRleHQoKSk7DQotICAgICAgICBvdXRfc2V0dGluZ3Muc2V0UHJvcGVydHkoS0VZX0hUVFBfUFJPWFlfUE9SVCwgbVByb3h5UG9ydFRleHQuZ2V0VGV4dCgpKTsNCi0gICAgICAgIG91dF9zZXR0aW5ncy5zZXRQcm9wZXJ0eShLRVlfRk9SQ0VfSFRUUCwNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhtRm9yY2VIdHRwQ2hlY2suZ2V0U2VsZWN0aW9uKCkpKTsNCi0gICAgICAgIG91dF9zZXR0aW5ncy5zZXRQcm9wZXJ0eShLRVlfQVNLX0FEQl9SRVNUQVJULA0KLSAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKG1Bc2tBZGJSZXN0YXJ0Q2hlY2suZ2V0U2VsZWN0aW9uKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBnaXZlIGEgY2FsbGJhY2sgdGhhdCB0aGUgcGFnZSBzaG91bGQgaW52b2tlIHdoZW4NCi0gICAgICogc2V0dGluZ3MgbXVzdCBiZSBhcHBsaWVkLiBUaGUgcGFnZSBkb2VzIG5vdCBhcHBseSB0aGUgc2V0dGluZ3MgaXRzZWxmLCBpbnN0ZWFkDQotICAgICAqIGl0IG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE9uU2V0dGluZ3NDaGFuZ2VkKFNldHRpbmdzQ2hhbmdlZENhbGxiYWNrIHNldHRpbmdzQ2hhbmdlZENhbGxiYWNrKSB7DQotICAgICAgICBtU2V0dGluZ3NDaGFuZ2VkQ2FsbGJhY2sgPSBzZXR0aW5nc0NoYW5nZWRDYWxsYmFjazsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHVzZXIgcHJlc3NlcyB0aGUgIlNhdmUgYW5kIEFwcGx5IiBidXR0b24uDQotICAgICAqIE5vdGlmeSB0aGUgYXBwbGljYXRpb24gdGhhdCBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25BcHBseVNlbGVjdGVkKCkgew0KLSAgICAgICAgaWYgKG1TZXR0aW5nc0NoYW5nZWRDYWxsYmFjayAhPSBudWxsKSB7DQotICAgICAgICAgICAgbVNldHRpbmdzQ2hhbmdlZENhbGxiYWNrLm9uU2V0dGluZ3NDaGFuZ2VkKHRoaXMpOw0KLSAgICAgICAgICAgIG1BcHBseUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSB1c2VycyBwcmVzc2VzIHRoZSBGb3JjZSBIVFRQUyBjaGVja2JveC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBvbkZvcmNlSHR0cFNlbGVjdGVkKCkgew0KLSAgICAgICAgbVNldEFwcGx5RGlydHkubW9kaWZ5VGV4dChudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBFbmQgb2YgaGlkaW5nIGZyb20gU1dUIERlc2lnbmVyDQotICAgIC8vJGhpZGU8PCQNCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9sb2dvLnBuZyBiL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3NyYy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL2ludGVybmFsL3JlcG9zaXRvcnkvbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTY3MGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvc3JjL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvaW50ZXJuYWwvcmVwb3NpdG9yeS9sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvQ29tbWFuZExpbmVQcm9jZXNzb3JUZXN0LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2FwcC90ZXN0cy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL0NvbW1hbmRMaW5lUHJvY2Vzc29yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjEzNjUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvQ29tbWFuZExpbmVQcm9jZXNzb3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZVByb2Nlc3NvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIE1vY2tTdGRMb2dnZXIgbUxvZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIG1vY2sgdmVyc2lvbiBvZiB0aGUge0BsaW5rIENvbW1hbmRMaW5lUHJvY2Vzc29yfSBjbGFzcyB0aGF0IGRvZXMgbm90Ci0gICAgICogZXhpdHMgYW5kIGNhcHR1cmVzIGl0cyBzdGRvdXQvc3RkZXJyIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tDb21tYW5kTGluZVByb2Nlc3NvciBleHRlbmRzIENvbW1hbmRMaW5lUHJvY2Vzc29yIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FeGl0Q2FsbGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhlbHBDYWxsZWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1TdGRPdXQgPSAiIjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVN0ZEVyciA9ICIiOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE1vY2tDb21tYW5kTGluZVByb2Nlc3NvcihJU2RrTG9nIGxvZ2dlcikgewotICAgICAgICAgICAgc3VwZXIobG9nZ2VyLAotICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdW10gewotICAgICAgICAgICAgICAgICAgICB7ICJ2ZXJiMSIsICJhY3Rpb24xIiwgIlNvbWUgYWN0aW9uIiB9LAotICAgICAgICAgICAgICAgICAgICB7ICJ2ZXJiMSIsICJhY3Rpb24yIiwgIkFub3RoZXIgYWN0aW9uIiB9LAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIGZhbHNlIC8qbWFuZGF0b3J5Ki8sCi0gICAgICAgICAgICAgICAgICAgICJ2ZXJiMSIsICJhY3Rpb24xIiwgIjEiLCAiZmlyc3QiLCAibm9uLW1hbmRhdG9yeSBmbGFnIiwgbnVsbCk7Ci0gICAgICAgICAgICBkZWZpbmUoTW9kZS5TVFJJTkcsIHRydWUgLyptYW5kYXRvcnkqLywKLSAgICAgICAgICAgICAgICAgICAgInZlcmIxIiwgImFjdGlvbjEiLCAiMiIsICJzZWNvbmQiLCAibWFuZGF0b3J5IGZsYWciLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50SGVscEFuZEV4aXRGb3JBY3Rpb24oU3RyaW5nIHZlcmIsIFN0cmluZyBkaXJlY3RPYmplY3QsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgbUhlbHBDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgc3VwZXIucHJpbnRIZWxwQW5kRXhpdEZvckFjdGlvbih2ZXJiLCBkaXJlY3RPYmplY3QsIGVycm9yRm9ybWF0LCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBtRXhpdENhbGxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzdGRvdXQoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpOwotICAgICAgICAgICAgbVN0ZE91dCArPSBzICsgIlxuIjsKLSAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgc3VwZXIgdG8gYXZvaWQgcHJpbnRpbmcgc3R1ZmYKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHN0ZGVycihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0gICAgICAgICAgICBtU3RkRXJyICs9IHMgKyAiXG4iOwotICAgICAgICAgICAgLy8gZG9uJ3QgY2FsbCBzdXBlciB0byBhdm9pZCBwcmludGluZyBzdHVmZgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNIZWxwQ2FsbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1IZWxwQ2FsbGVkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNFeGl0Q2FsbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeGl0Q2FsbGVkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0ZE91dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RkT3V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0ZEVycigpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RkRXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUxvZyA9IG5ldyBNb2NrU3RkTG9nZ2VyKCk7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UHJpbnRIZWxwQW5kRXhpdCgpIHsKLSAgICAgICAgTW9ja0NvbW1hbmRMaW5lUHJvY2Vzc29yIGMgPSBuZXcgTW9ja0NvbW1hbmRMaW5lUHJvY2Vzc29yKG1Mb2cpOyAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKGMud2FzRXhpdENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0U3RkT3V0KCkuZXF1YWxzKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5lcXVhbHMoIiIpKTsKLSAgICAgICAgYy5wcmludEhlbHBBbmRFeGl0KG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0U3RkT3V0KCkuaW5kZXhPZigiLXYiKSAhPSAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRPdXQoKS5pbmRleE9mKCItLXZlcmJvc2UiKSAhPSAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5lcXVhbHMoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0KLSAgICAgICAgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0U3RkT3V0KCkuZXF1YWxzKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5pbmRleE9mKCJNaXNzaW5nIHBhcmFtZXRlciIpID09IC0xKTsKLQotICAgICAgICBjLnByaW50SGVscEFuZEV4aXQoIk1pc3NpbmcgJXMiLCAicGFyYW1ldGVyIik7Ci0gICAgICAgIGFzc2VydFRydWUoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLmdldFN0ZE91dCgpLmVxdWFscygiIikpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0U3RkRXJyKCkuaW5kZXhPZigiTWlzc2luZyBwYXJhbWV0ZXIiKSAhPSAtMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RWZXJib3NlKCkgewotICAgICAgICBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLQotICAgICAgICBhc3NlcnRGYWxzZShjLmlzVmVyYm9zZSgpKTsKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgIi12IiB9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmlzVmVyYm9zZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0U3RkRXJyKCkuaW5kZXhPZigiTWlzc2luZyB2ZXJiIG5hbWUuIikgIT0gLTEpOwotCi0gICAgICAgIGMgPSBuZXcgTW9ja0NvbW1hbmRMaW5lUHJvY2Vzc29yKG1Mb2cpOyAgICAgICAgCi0gICAgICAgIGMucGFyc2VBcmdzKG5ldyBTdHJpbmdbXSB7ICItLXZlcmJvc2UiIH0pOwotICAgICAgICBhc3NlcnRUcnVlKGMuaXNWZXJib3NlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMud2FzRXhpdENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLndhc0hlbHBDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5pbmRleE9mKCJNaXNzaW5nIHZlcmIgbmFtZS4iKSAhPSAtMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RIZWxwKCkgewotICAgICAgICBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLQotICAgICAgICBjLnBhcnNlQXJncyhuZXcgU3RyaW5nW10geyAiLWgiIH0pOwotICAgICAgICBhc3NlcnRUcnVlKGMud2FzRXhpdENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLndhc0hlbHBDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5pbmRleE9mKCJNaXNzaW5nIHZlcmIgbmFtZS4iKSA9PSAtMSk7Ci0KLSAgICAgICAgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgIi0taGVscCIgfSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMud2FzSGVscENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmdldFN0ZEVycigpLmluZGV4T2YoIk1pc3NpbmcgdmVyYiBuYW1lLiIpID09IC0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TWFuZGF0b3J5KCkgewotICAgICAgICBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLQotICAgICAgICBjLnBhcnNlQXJncyhuZXcgU3RyaW5nW10geyAidmVyYjEiLCAiYWN0aW9uMSIsICItMSIsICJ2YWx1ZTEiLCAiLTIiLCAidmFsdWUyIiB9KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLndhc0hlbHBDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgYy5nZXRTdGRFcnIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgYy5nZXRWYWx1ZSgidmVyYjEiLCAiYWN0aW9uMSIsICJmaXJzdCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBjLmdldFZhbHVlKCJ2ZXJiMSIsICJhY3Rpb24xIiwgInNlY29uZCIpKTsKLQotICAgICAgICBjID0gbmV3IE1vY2tDb21tYW5kTGluZVByb2Nlc3NvcihtTG9nKTsgICAgICAgIAotICAgICAgICBjLnBhcnNlQXJncyhuZXcgU3RyaW5nW10geyAidmVyYjEiLCAiYWN0aW9uMSIsICItMiIsICJ2YWx1ZTIiIH0pOwotICAgICAgICBhc3NlcnRGYWxzZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGMud2FzSGVscENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjLmdldFN0ZEVycigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGMuZ2V0VmFsdWUoInZlcmIxIiwgImFjdGlvbjEiLCAiZmlyc3QiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgYy5nZXRWYWx1ZSgidmVyYjEiLCAiYWN0aW9uMSIsICJzZWNvbmQiKSk7Ci0KLSAgICAgICAgYyA9IG5ldyBNb2NrQ29tbWFuZExpbmVQcm9jZXNzb3IobUxvZyk7ICAgICAgICAKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgInZlcmIxIiwgImFjdGlvbjEiIH0pOwotICAgICAgICBhc3NlcnRUcnVlKGMud2FzRXhpdENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLndhc0hlbHBDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5nZXRTdGRFcnIoKS5pbmRleE9mKCJtdXN0IGJlIGRlZmluZWQiKSAhPSAtMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjLmdldFZhbHVlKCJ2ZXJiMSIsICJhY3Rpb24xIiwgImZpcnN0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYy5nZXRWYWx1ZSgidmVyYjEiLCAiYWN0aW9uMSIsICJzZWNvbmQiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9hcHAvdGVzdHMvY29tL2FuZHJvaWQvc2RrbWFuYWdlci9Nb2NrU3RkTG9nZ2VyLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2FwcC90ZXN0cy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL01vY2tTdGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxZTg4ZC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2FwcC90ZXN0cy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL01vY2tTdGRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka21hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vY2tTdGRMb2dnZXIgaW1wbGVtZW50cyBJU2RrTG9nIHsKLQotICAgIHB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSB0LCBTdHJpbmcgZXJyb3JGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIGlmIChlcnJvckZvcm1hdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiRXJyb3I6ICIgKyBlcnJvckZvcm1hdCwgYXJncyk7Ci0gICAgICAgICAgICBpZiAoIWVycm9yRm9ybWF0LmVuZHNXaXRoKCJcbiIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yOiAlc1xuIiwgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgd2FybmluZ0Zvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIldhcm5pbmc6ICIgKyB3YXJuaW5nRm9ybWF0LCBhcmdzKTsKLSAgICAgICAgaWYgKCF3YXJuaW5nRm9ybWF0LmVuZHNXaXRoKCJcbiIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50ZihTdHJpbmcgbXNnRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihtc2dGb3JtYXQsIGFyZ3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvU2RrQ29tbWFuZExpbmVUZXN0LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2FwcC90ZXN0cy9jb20vYW5kcm9pZC9zZGttYW5hZ2VyL1Nka0NvbW1hbmRMaW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2EzMmUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvYXBwL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka21hbmFnZXIvU2RrQ29tbWFuZExpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2RrQ29tbWFuZExpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBNb2NrU3RkTG9nZ2VyIG1Mb2c7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBtb2NrIHZlcnNpb24gb2YgdGhlIHtAbGluayBTZGtDb21tYW5kTGluZX0gY2xhc3MgdGhhdCBkb2VzIG5vdAotICAgICAqIGV4aXRzIGFuZCBkaXNjYXJkcyBpdHMgc3Rkb3V0L3N0ZGVyciBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrU2RrQ29tbWFuZExpbmUgZXh0ZW5kcyBTZGtDb21tYW5kTGluZSB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRXhpdENhbGxlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IZWxwQ2FsbGVkOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE1vY2tTZGtDb21tYW5kTGluZShJU2RrTG9nIGxvZ2dlcikgewotICAgICAgICAgICAgc3VwZXIobG9nZ2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmludEhlbHBBbmRFeGl0Rm9yQWN0aW9uKFN0cmluZyB2ZXJiLCBTdHJpbmcgZGlyZWN0T2JqZWN0LAotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvckZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgICAgIG1IZWxwQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHN1cGVyLnByaW50SGVscEFuZEV4aXRGb3JBY3Rpb24odmVyYiwgZGlyZWN0T2JqZWN0LCBlcnJvckZvcm1hdCwgYXJncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIG1FeGl0Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHN0ZG91dChTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgLy8gZGlzY2FyZAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3RkZXJyKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAvLyBkaXNjYXJkCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNFeGl0Q2FsbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeGl0Q2FsbGVkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNIZWxwQ2FsbGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1IZWxwQ2FsbGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUxvZyA9IG5ldyBNb2NrU3RkTG9nZ2VyKCk7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvKiogVGVzdCBsaXN0ICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdExpc3RfQXZkX1ZlcmJvc2UoKSB7Ci0gICAgICAgIE1vY2tTZGtDb21tYW5kTGluZSBjID0gbmV3IE1vY2tTZGtDb21tYW5kTGluZShtTG9nKTsKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgIi12IiwgImxpc3QiLCAiYXZkIiB9KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGlzdCIsIGMuZ2V0VmVyYigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdmQiLCBjLmdldERpcmVjdE9iamVjdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmlzVmVyYm9zZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TGlzdF9UYXJnZXQoKSB7Ci0gICAgICAgIE1vY2tTZGtDb21tYW5kTGluZSBjID0gbmV3IE1vY2tTZGtDb21tYW5kTGluZShtTG9nKTsKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgImxpc3QiLCAidGFyZ2V0IiB9KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGlzdCIsIGMuZ2V0VmVyYigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YXJnZXQiLCBjLmdldERpcmVjdE9iamVjdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy5pc1ZlcmJvc2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdExpc3RfTm9uZSgpIHsKLSAgICAgICAgTW9ja1Nka0NvbW1hbmRMaW5lIGMgPSBuZXcgTW9ja1Nka0NvbW1hbmRMaW5lKG1Mb2cpOwotICAgICAgICBjLnBhcnNlQXJncyhuZXcgU3RyaW5nW10geyAibGlzdCIgfSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGMud2FzSGVscENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxpc3QiLCBjLmdldFZlcmIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgYy5nZXREaXJlY3RPYmplY3QoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGMuaXNWZXJib3NlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RMaXN0X0ludmFsaWQoKSB7Ci0gICAgICAgIE1vY2tTZGtDb21tYW5kTGluZSBjID0gbmV3IE1vY2tTZGtDb21tYW5kTGluZShtTG9nKTsKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgImxpc3QiLCAidW5rbm93biIgfSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMud2FzRXhpdENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGMuZ2V0VmVyYigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGMuZ2V0RGlyZWN0T2JqZWN0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLmlzVmVyYm9zZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0TGlzdF9QbHVyYWwoKSB7Ci0gICAgICAgIE1vY2tTZGtDb21tYW5kTGluZSBjID0gbmV3IE1vY2tTZGtDb21tYW5kTGluZShtTG9nKTsKLSAgICAgICAgYy5wYXJzZUFyZ3MobmV3IFN0cmluZ1tdIHsgImxpc3QiLCAiYXZkcyIgfSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGMud2FzSGVscENhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNFeGl0Q2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxpc3QiLCBjLmdldFZlcmIoKSk7Ci0gICAgICAgIC8vIHdlIGdldCB0aGUgbm9uLXBsdXJhbCBmb3JtCi0gICAgICAgIGFzc2VydEVxdWFscygiYXZkIiwgYy5nZXREaXJlY3RPYmplY3QoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGMuaXNWZXJib3NlKCkpOwotCi0gICAgICAgIGMgPSBuZXcgTW9ja1Nka0NvbW1hbmRMaW5lKG1Mb2cpOwotICAgICAgICBjLnBhcnNlQXJncyhuZXcgU3RyaW5nW10geyAibGlzdCIsICJ0YXJnZXRzIiB9KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy53YXNIZWxwQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjLndhc0V4aXRDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGlzdCIsIGMuZ2V0VmVyYigpKTsKLSAgICAgICAgLy8gd2UgZ2V0IHRoZSBub24tcGx1cmFsIGZvcm0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YXJnZXQiLCBjLmdldERpcmVjdE9iamVjdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy5pc1ZlcmJvc2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL0FuZHJvaWQubWsgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzNGFhNy4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1TREtMSUJTX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKFNES0xJQlNfTE9DQUxfRElSKS9zZGtsaWIvQW5kcm9pZC5tawotaW5jbHVkZSAkKFNES0xJQlNfTE9DQUxfRElSKS9zZGt1aWxpYi9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliLy5jbGFzc3BhdGggYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2NlZWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvQW5kcm9pZFByZWZzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi8zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQU5EUk9JRF9TUkMvcHJlYnVpbHQvY29tbW9uL2NvbW1vbnMtY29tcHJlc3MvY29tbW9ucy1jb21wcmVzcy0xLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvLnByb2plY3QgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E4NTc4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5TZGtMaWI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDljNTczLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1TREtMSUJfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoU0RLTElCX0xPQ0FMX0RJUikvc3JjL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL0FuZHJvaWQubWsgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ2ZjcxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IC4KLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgICAgICBhbmRyb2lkcHJlZnMgXAotICAgICAgICBjb21tb25zLWNvbXByZXNzLTEuMAotCi1MT0NBTF9NT0RVTEUgOj0gc2RrbGliCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL0FkZE9uVGFyZ2V0LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvQWRkT25UYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyY2Q5NC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvQWRkT25UYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYWRkLW9uIHRhcmdldCBpbiB0aGUgU0RLLgotICogQW4gYWRkLW9uIGV4dGVuZHMgYSBzdGFuZGFyZCB7QGxpbmsgUGxhdGZvcm1UYXJnZXR9LgotICovCi1maW5hbCBjbGFzcyBBZGRPblRhcmdldCBpbXBsZW1lbnRzIElBbmRyb2lkVGFyZ2V0IHsKLSAgICAvKioKLSAgICAgKiBTdHJpbmcgdG8gY29tcHV0ZSBoYXNoIGZvciBhZGQtb24gdGFyZ2V0cy4KLSAgICAgKiBGb3JtYXQgaXMgdmVuZG9yOm5hbWU6YXBpVmVyc2lvbgotICAgICAqICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9PTl9GT1JNQVQgPSAiJXM6JXM6JXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBPcHRpb25hbExpYnJhcnkgaW1wbGVtZW50cyBJT3B0aW9uYWxMaWJyYXJ5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUphck5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1KYXJQYXRoOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0aW9uOwotCi0gICAgICAgIE9wdGlvbmFsTGlicmFyeShTdHJpbmcgamFyTmFtZSwgU3RyaW5nIGphclBhdGgsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1KYXJOYW1lID0gamFyTmFtZTsKLSAgICAgICAgICAgIG1KYXJQYXRoID0gamFyUGF0aDsKLSAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXJOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1KYXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXJQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1KYXJQYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybVRhcmdldCBtQmFzZVBsYXRmb3JtOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZW5kb3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJldmlzaW9uOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Ta2luczsKLSAgICBwcml2YXRlIFN0cmluZyBtRGVmYXVsdFNraW47Ci0gICAgcHJpdmF0ZSBJT3B0aW9uYWxMaWJyYXJ5W10gbUxpYnJhcmllczsKLSAgICBwcml2YXRlIGludCBtVmVuZG9ySWQgPSBOT19VU0JfSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkZC1vbgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgT1MgcGF0aCBsb2NhdGlvbiBvZiB0aGUgYWRkLW9uCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFkZC1vbgotICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciBuYW1lIG9mIHRoZSBhZGQtb24KLSAgICAgKiBAcGFyYW0gcmV2aXNpb24gdGhlIHJldmlzaW9uIG9mIHRoZSBhZGQtb24KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGFkZC1vbiBkZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBsaWJNYXAgQSBtYXAgY29udGFpbmluZyB0aGUgb3B0aW9uYWwgbGlicmFyaWVzLiBUaGUgbWFwIGtleSBpcyB0aGUgZnVsbHktcXVhbGlmaWVkCi0gICAgICogbGlicmFyeSBuYW1lLiBUaGUgdmFsdWUgaXMgYSAyIHN0cmluZyBhcnJheSB3aXRoIHRoZSAuamFyIGZpbGVuYW1lLCBhbmQgdGhlIGRlc2NyaXB0aW9uLgotICAgICAqIEBwYXJhbSBiYXNlUGxhdGZvcm0gdGhlIHBsYXRmb3JtIHRoZSBhZGQtb24gaXMgZXh0ZW5kaW5nLgotICAgICAqLwotICAgIEFkZE9uVGFyZ2V0KFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2ZW5kb3IsIGludCByZXZpc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGxpYk1hcCwgUGxhdGZvcm1UYXJnZXQgYmFzZVBsYXRmb3JtKSB7Ci0gICAgICAgIGlmIChsb2NhdGlvbi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIG1Mb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1WZW5kb3IgPSB2ZW5kb3I7Ci0gICAgICAgIG1SZXZpc2lvbiA9IHJldmlzaW9uOwotICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgbUJhc2VQbGF0Zm9ybSA9IGJhc2VQbGF0Zm9ybTsKLQotICAgICAgICAvLyBoYW5kbGUgdGhlIG9wdGlvbmFsIGxpYnJhcmllcy4KLSAgICAgICAgaWYgKGxpYk1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlicmFyaWVzID0gbmV3IElPcHRpb25hbExpYnJhcnlbbGliTWFwLnNpemUoKV07Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBlbnRyeSA6IGxpYk1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphckZpbGUgPSBlbnRyeS5nZXRWYWx1ZSgpWzBdOwotICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjID0gZW50cnkuZ2V0VmFsdWUoKVsxXTsKLSAgICAgICAgICAgICAgICBtTGlicmFyaWVzW2luZGV4KytdID0gbmV3IE9wdGlvbmFsTGlicmFyeShqYXJGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLk9TX0FERE9OX0xJQlNfRk9MREVSICsgamFyRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpLCBkZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKSB7Ci0gICAgICAgIHJldHVybiBtVmVuZG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzICglMiRzKSIsIG1OYW1lLCBtVmVuZG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzIFslMiRzXSIsIG1OYW1lLCBtQmFzZVBsYXRmb3JtLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5kcm9pZFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhbHdheXMgZGVmaW5lZCBieSB0aGUgYmFzZSBwbGF0Zm9ybQotICAgICAgICByZXR1cm4gbUJhc2VQbGF0Zm9ybS5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CYXNlUGxhdGZvcm0uZ2V0VmVyc2lvbk5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJldmlzaW9uKCkgewotICAgICAgICByZXR1cm4gbVJldmlzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxhdGZvcm0oKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gbUJhc2VQbGF0Zm9ybTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoaW50IHBhdGhJZCkgewotICAgICAgICBzd2l0Y2ggKHBhdGhJZCkgewotICAgICAgICAgICAgY2FzZSBJTUFHRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19JTUFHRVNfRk9MREVSOwotICAgICAgICAgICAgY2FzZSBTS0lOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLk9TX1NLSU5TX0ZPTERFUjsKLSAgICAgICAgICAgIGNhc2UgRE9DUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLkZEX0RPQ1MgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgKyBTZGtDb25zdGFudHMuRkRfRE9DU19SRUZFUkVOQ0U7Ci0gICAgICAgICAgICBjYXNlIFNBTVBMRVM6Ci0gICAgICAgICAgICAgICAgLy8gb25seSByZXR1cm4gdGhlIGFkZC1vbiBzYW1wbGVzIGZvbGRlciBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHNhbXBsZSAob3IgbW9yZSkKLSAgICAgICAgICAgICAgICBGaWxlIHNhbXBsZUxvYyA9IG5ldyBGaWxlKG1Mb2NhdGlvbiwgU2RrQ29uc3RhbnRzLkZEX1NBTVBMRVMpOwotICAgICAgICAgICAgICAgIGlmIChzYW1wbGVMb2MuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBzYW1wbGVMb2MubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhbXBsZUxvYy5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJTlRFTkRFRCBGQUxMLVRIUk9VR0gKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHJldHVybiBtQmFzZVBsYXRmb3JtLmdldFBhdGgocGF0aElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTa2lucygpIHsKLSAgICAgICAgcmV0dXJuIG1Ta2luczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTa2luKCkgewotICAgICAgICByZXR1cm4gbURlZmF1bHRTa2luOwotICAgIH0KLQotICAgIHB1YmxpYyBJT3B0aW9uYWxMaWJyYXJ5W10gZ2V0T3B0aW9uYWxMaWJyYXJpZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGlicmFyaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIG9mIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQbGF0Zm9ybUxpYnJhcmllcygpIHsKLSAgICAgICAgcmV0dXJuIG1CYXNlUGxhdGZvcm0uZ2V0UGxhdGZvcm1MaWJyYXJpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFVzYlZlbmRvcklkKCkgewotICAgICAgICByZXR1cm4gbVZlbmRvcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZUJhc2VGb3IoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIC8vIGJhc2ljIHRlc3QKLSAgICAgICAgaWYgKHRhcmdldCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBtZXRob2QgamF2YWRvYyBpbmRpY2F0ZXM6Ci0gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdGFyZ2V0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVjZWl2ZXIuCi0gICAgICAgICAqIDxwLz5BIHRhcmdldCBpcyBjb25zaWRlcmVkIGNvbXBhdGlibGUgaWYgYXBwbGljYXRpb25zIGRldmVsb3BlZCBmb3IgdGhlIHJlY2VpdmVyIGNhbgotICAgICAgICAgKiBydW4gb24gdGhlIGdpdmVuIHRhcmdldC4KLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gVGhlIHJlY2VpdmVyIGlzIGFuIGFkZC1vbi4gVGhlcmUgYXJlIDIgYmlnIHVzZSBjYXNlczogVGhlIGFkZC1vbiBoYXMgbGlicmFyaWVzCi0gICAgICAgIC8vIG9yIHRoZSBhZGQtb24gZG9lc24ndCAoaW4gd2hpY2ggY2FzZSB3ZSBjb25zaWRlciBpdCBhIHBsYXRmb3JtKS4KLSAgICAgICAgaWYgKG1MaWJyYXJpZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtQmFzZVBsYXRmb3JtLmlzQ29tcGF0aWJsZUJhc2VGb3IodGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IHRhcmdldHMgdGhhdCBjYW4gcnVuIHRoZSByZWNlaXZlciBhcmUgdGhlIHNhbWUgYWRkLW9uIGluIHRoZSBzYW1lIG9yIGxhdGVyCi0gICAgICAgICAgICAvLyB2ZXJzaW9ucy4KLSAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrOiB2ZW5kb3IvbmFtZQotICAgICAgICAgICAgaWYgKG1WZW5kb3IuZXF1YWxzKHRhcmdldC5nZXRWZW5kb3IoKSkgPT0gZmFsc2UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZS5lcXVhbHModGFyZ2V0LmdldE5hbWUoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdyBjaGVjayB0aGUgdmVyc2lvbi4gQXQgdGhpcyBwb2ludCBzaW5jZSB3ZSBjaGVja2VkIHRoZSBhZGQtb24gcGFydCwKLSAgICAgICAgICAgIC8vIHdlIGNhbiByZXZlcnQgdG8gdGhlIGJhc2ljIGNoZWNrIG9uIHZlcnNpb24vY29kZW5hbWUgd2hpY2ggYXJlIGRvbmUgYnkgdGhlCi0gICAgICAgICAgICAvLyBiYXNlIHBsYXRmb3JtIGFscmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gbUJhc2VQbGF0Zm9ybS5pc0NvbXBhdGlibGVCYXNlRm9yKHRhcmdldCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaGFzaFN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoQUREX09OX0ZPUk1BVCwgbVZlbmRvciwgbU5hbWUsCi0gICAgICAgICAgICAgICAgbUJhc2VQbGF0Zm9ybS5nZXRWZXJzaW9uKCkuZ2V0QXBpU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNoU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQWRkT25UYXJnZXQpIHsKLSAgICAgICAgICAgIEFkZE9uVGFyZ2V0IGFkZG9uID0gKEFkZE9uVGFyZ2V0KW9iajsKLQotICAgICAgICAgICAgcmV0dXJuIG1WZW5kb3IuZXF1YWxzKGFkZG9uLm1WZW5kb3IpICYmIG1OYW1lLmVxdWFscyhhZGRvbi5tTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBtQmFzZVBsYXRmb3JtLmdldFZlcnNpb24oKS5lcXVhbHMoYWRkb24ubUJhc2VQbGF0Zm9ybS5nZXRWZXJzaW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWx3YXlzIHJldHVybiArMSBpZiB0aGUgb2JqZWN0IHdlIGNvbXBhcmUgdG8gaXMgYSBwbGF0Zm9ybS4KLSAgICAgKiBPdGhlcndpc2UsIGRvIHZlbmRvciB0aGVuIG5hbWUgdGhlbiBhcGkgdmVyc2lvbiBjb21wYXJpc29uLgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0LmlzUGxhdGZvcm0oKSkgewotICAgICAgICAgICAgcmV0dXJuICsxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGFyZSB2ZW5kb3IKLSAgICAgICAgaW50IHZhbHVlID0gbVZlbmRvci5jb21wYXJlVG8odGFyZ2V0LmdldFZlbmRvcigpKTsKLQotICAgICAgICAvLyBpZiBzYW1lIHZlbmRvciwgY29tcGFyZSBuYW1lCi0gICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1OYW1lLmNvbXBhcmVUbyh0YXJnZXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHNhbWUgdmVuZG9yL25hbWUsIGNvbXBhcmUgdmVyc2lvbgotICAgICAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgICAgICAgaWYgKGdldFZlcnNpb24oKS5pc1ByZXZpZXcoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXQuZ2V0VmVyc2lvbigpLmlzUHJldmlldygpID09IHRydWUgPwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpLmNvbXBhcmVUbyh0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICArMTsgLy8gcHV0IHRoZSBwcmV2aWV3IGF0IHRoZSBlbmQuCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdGFyZ2V0LmdldFZlcnNpb24oKS5pc1ByZXZpZXcoKSA9PSB0cnVlID8KLSAgICAgICAgICAgICAgICAgICAgICAgIC0xIDogLy8gcHV0IHRoZSBwcmV2aWV3IGF0IHRoZSBlbmQgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCkgLSB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBsb2NhbCBtZXRob2RzLgotCi0gICAgdm9pZCBzZXRTa2lucyhTdHJpbmdbXSBza2lucywgU3RyaW5nIGRlZmF1bHRTa2luKSB7Ci0gICAgICAgIG1EZWZhdWx0U2tpbiA9IGRlZmF1bHRTa2luOwotCi0gICAgICAgIC8vIHdlIG1peCB0aGUgYWRkLW9uIGFuZCBiYXNlIHBsYXRmb3JtIHNraW5zCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBza2luU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBza2luU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KHNraW5zKSk7Ci0gICAgICAgIHNraW5TZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QobUJhc2VQbGF0Zm9ybS5nZXRTa2lucygpKSk7Ci0KLSAgICAgICAgbVNraW5zID0gc2tpblNldC50b0FycmF5KG5ldyBTdHJpbmdbc2tpblNldC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVU0IgdmVuZG9yIGlkIGluIHRoZSBhZGQtb24uCi0gICAgICovCi0gICAgdm9pZCBzZXRVc2JWZW5kb3JJZChpbnQgdmVuZG9ySWQpIHsKLSAgICAgICAgaWYgKHZlbmRvcklkID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJWZW5kb3JJZCBtdXN0IGJlID4gMCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZlbmRvcklkID0gdmVuZG9ySWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL0FuZHJvaWRWZXJzaW9uLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvQW5kcm9pZFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjM2VhMS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvQW5kcm9pZFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG9mIGEgdGFyZ2V0IG9yIGRldmljZS4KLSAqIDxwLz4KLSAqIEEgdmVyc2lvbiBpcyBkZWZpbmVkIGJ5IGFuIEFQSSBsZXZlbCBhbmQgYW4gb3B0aW9uYWwgY29kZSBuYW1lLgotICogPHVsPjxsaT5SZWxlYXNlIHZlcnNpb25zIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIEFQSSBsZXZlbCAoaW50ZWdlciksCi0gKiAodGVjaG5pY2FsbHkgdGhlIGNvZGUgbmFtZSBmb3IgcmVsZWFzZSB2ZXJzaW9uIGlzICJSRUwiIGJ1dCB0aGlzIGNsYXNzIHdpbGwgcmV0dXJuCi0gKiA8Y29kZT5udWxsPGNvZGU+IGluc3RlYWQuKTwvbGk+Ci0gKiA8bGk+UHJldmlldyB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0gYXJlIGlkZW50aWZpZWQgYnkgYSBjb2RlIG5hbWUuIFRoZWlyIEFQSSBsZXZlbAotICogaXMgdXN1YWxseSBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBwbGF0Zm9ybS48L2xpPjwvdWw+Ci0gKiA8cC8+Ci0gKiBXaGlsZSB0aGlzIGNsYXNzIGNvbnRhaW5zIGJvdGggdmFsdWVzLCBpdHMgZ29hbCBpcyB0byBhYnN0cmFjdCB0aGVtLCBzbyB0aGF0IGNvZGUgY29tcGFyaW5nIDIrCi0gKiB2ZXJzaW9ucyBkb2Vzbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBsb2dpYyBvZiBoYW5kbGUgYm90aCB2YWx1ZXMuCi0gKiA8cC8+Ci0gKiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBvbmVzIG1heSB3YW50IHRvIGFjY2VzcyB0aGUgdmFsdWVzIGRpcmVjdGx5LiBUaGlzIGNhbiBiZSBkb25lCi0gKiB3aXRoIHtAbGluayAjZ2V0QXBpTGV2ZWwoKX0gYW5kIHtAbGluayAjZ2V0Q29kZW5hbWUoKX0uCi0gKiA8cC8+Ci0gKiBGb3IgZ2VuZXJpYyBVSSBkaXNwbGF5IG9mIHRoZSBBUEkgdmVyc2lvbiwge0BsaW5rICNnZXRBcGlTdHJpbmcoKX0gaXMgdG8gYmUgdXNlZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkVmVyc2lvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BUElfTEVWRUwgPSAiQW5kcm9pZFZlcnNpb24uQXBpTGV2ZWwiOyAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPREVOQU1FID0gIkFuZHJvaWRWZXJzaW9uLkNvZGVOYW1lIjsgICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtQXBpTGV2ZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvZGVuYW1lOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQW5kcm9pZFZlcnNpb259IHdpdGggdGhlIGdpdmVuIGFwaSBsZXZlbCBhbmQgY29kZW5hbWUuCi0gICAgICogQ29kZW5hbWUgc2hvdWxkIGJlIG51bGwgZm9yIGEgcmVsZWFzZSB2ZXJzaW9uLCBvdGhlcndpc2UgaXQncyBhIHByZXZpZXcgY29kZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIEFuZHJvaWRWZXJzaW9uKGludCBhcGlMZXZlbCwgU3RyaW5nIGNvZGVuYW1lKSB7Ci0gICAgICAgIG1BcGlMZXZlbCA9IGFwaUxldmVsOwotICAgICAgICBtQ29kZW5hbWUgPSBjb2RlbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBbmRyb2lkVmVyc2lvbn0gZnJvbSB7QGxpbmsgUHJvcGVydGllc30sIHdpdGggZGVmYXVsdCB2YWx1ZXMgaWYgdGhlCi0gICAgICoge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIHZhbHVlcy4KLSAgICAgKiA8cC8+VGhlIHtAbGluayBQcm9wZXJ0aWVzfSBpcyBleHBlY3RlZCB0byBoYXZlIGJlZW4gZmlsbGVkIHdpdGgKLSAgICAgKiB7QGxpbmsgI3NhdmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kcm9pZFZlcnNpb24oUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBpbnQgZGVmYXVsdEFwaUxldmVsLCBTdHJpbmcgZGVmYXVsdENvZGVOYW1lKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1BcGlMZXZlbCA9IGRlZmF1bHRBcGlMZXZlbDsKLSAgICAgICAgICAgIG1Db2RlbmFtZSA9IGRlZmF1bHRDb2RlTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BcGlMZXZlbCA9IEludGVnZXIucGFyc2VJbnQocHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX0FQSV9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhkZWZhdWx0QXBpTGV2ZWwpKSk7Ci0gICAgICAgICAgICBtQ29kZW5hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfQ09ERU5BTUUsIGRlZmF1bHRDb2RlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfQVBJX0xFVkVMLCBJbnRlZ2VyLnRvU3RyaW5nKG1BcGlMZXZlbCkpOwotICAgICAgICBpZiAobUNvZGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfQ09ERU5BTUUsIG1Db2RlbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcGkgbGV2ZWwgYXMgYW4gaW50ZWdlci4KLSAgICAgKiA8cC8+Rm9yIHRhcmdldCB0aGF0IGFyZSBpbiBwcmV2aWV3IG1vZGUsIHRoaXMgY2FuIGJlIHN1cGVyc2VkZWQgYnkKLSAgICAgKiB7QGxpbmsgI2dldENvZGVuYW1lKCl9LgotICAgICAqIDxwLz5UbyBkaXNwbGF5IHRoZSBBUEkgbGV2ZWwgaW4gdGhlIFVJLCB1c2Uge0BsaW5rICNnZXRBcGlTdHJpbmcoKX0sIHdoaWNoIHdpbGwgdXNlIHRoZQotICAgICAqIGNvZGVuYW1lIGlmIGFwcGxpY2FibGUuCi0gICAgICogQHNlZSAjZ2V0Q29kZW5hbWUoKQotICAgICAqIEBzZWUgI2dldEFwaVN0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRBcGlMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1BcGlMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIGNvZGUgbmFtZSBpZiBhcHBsaWNhYmxlLCBudWxsIG90aGVyd2lzZS4KLSAgICAgKiA8cC8+SWYgdGhlIGNvZGVuYW1lIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBBUEkgbGV2ZWwgc2hvdWxkIGJlIGlnbm9yZWQsIGFuZCB0aGlzIHNob3VsZCBiZQotICAgICAqIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2RlbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Db2RlbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgQVBJIGxldmVsIGFuZC9vciB0aGUgY29kZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBpU3RyaW5nKCkgewotICAgICAgICBpZiAobUNvZGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29kZW5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhtQXBpTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlcnNpb24gaXMgYSBwcmV2aWV3IHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmV2aWV3KCkgewotICAgICAgICByZXR1cm4gbUNvZGVuYW1lICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBkZXZpY2UgcnVubmluZyBhIHZlcnNpb24gc2ltaWxhciB0byB0aGUgcmVjZWl2ZXIgY2FuIHJ1biBhIHByb2plY3QgY29tcGlsZWQKLSAgICAgKiBmb3IgdGhlIGdpdmVuIDx2YXI+dmVyc2lvbjwvdmFyPi4KLSAgICAgKiA8cC8+Ci0gICAgICogQmUgYXdhcmUgdGhhdCB0aGlzIGlzIG5vdCBhIHBlcmZlY3QgdGVzdCwgYXMgb3RoZXIgcHJvcGVydGllcyBjb3VsZCBicmVhayBjb21wYXRpYmlsaXR5Ci0gICAgICogZGVzcGl0ZSB0aGlzIG1ldGhvZCByZXR1cm5pbmcgdHJ1ZS4gRm9yIGEgbW9yZSBjb21wcmVoZW5zaXZlIHRlc3QsIHNlZQotICAgICAqIHtAbGluayBJQW5kcm9pZFRhcmdldCNpc0NvbXBhdGlibGVCYXNlRm9yKElBbmRyb2lkVGFyZ2V0KX0uCi0gICAgICogPHAvPgotICAgICAqIE5ldmVydGhlbGVzcywgd2hlbiB0ZXN0aW5nIGlmIGFuIGFwcGxpY2F0aW9uIGNhbiBydW4gb24gYSBkZXZpY2UgKHdoZXJlIHRoZXJlIGlzIG5vCi0gICAgICogYWNjZXNzIHRvIHRoZSBsaXN0IG9mIG9wdGlvbmFsIGxpYnJhcmllcyksIHRoaXMgbWV0aG9kIGNhbiBnaXZlIGEgZ29vZCBpbmRpY2F0aW9uIG9mIHdoZXRoZXIKLSAgICAgKiB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgYXBwbGljYXRpb24gY291bGQgcnVuLCBvciBpZiB0aGVyZSdzIGEgZGlyZWN0IGluY29tcGF0aWJpbGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5SdW4oQW5kcm9pZFZlcnNpb24gYXBwVmVyc2lvbikgewotICAgICAgICAvLyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY29tcGlsZWQgZm9yIGEgcHJldmlldyB2ZXJzaW9uLCB0aGUgZGV2aWNlIG11c3QgYmUgcnVubmluZyBleGFjdGx5Ci0gICAgICAgIC8vIHRoZSBzYW1lLgotICAgICAgICBpZiAoYXBwVmVyc2lvbi5tQ29kZW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFwcFZlcnNpb24ubUNvZGVuYW1lLmVxdWFscyhtQ29kZW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3RoZXJ3aXNlLCB3ZSBjaGVjayB0aGUgYXBpIGxldmVsIChub3RlIHRoYXQgYSBkZXZpY2UgcnVubmluZyBhIHByZXZpZXcgdmVyc2lvbgotICAgICAgICAvLyB3aWxsIGhhdmUgdGhlIGFwaSBsZXZlbCBvZiB0aGUgcHJldmlvdXMgcGxhdGZvcm0pLgotICAgICAgICByZXR1cm4gbUFwaUxldmVsID49IGFwcFZlcnNpb24ubUFwaUxldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEFuZHJvaWRWZXJzaW9uIGlzIGFuIEFQSSBsZXZlbCBlcXVhbHMgdG8KLSAgICAgKiA8dmFyPmFwaUxldmVsPC92YXI+LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgYXBpTGV2ZWwpIHsKLSAgICAgICAgcmV0dXJuIG1Db2RlbmFtZSA9PSBudWxsICYmIGFwaUxldmVsID09IG1BcGlMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgcmVjZWl2ZXIgd2l0aCBlaXRoZXIgYW4ge0BsaW5rIEFuZHJvaWRWZXJzaW9ufSBvYmplY3Qgb3IgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqIG9iamVjdC4KLSAgICAgKiA8cC8+SWYgPHZhcj5vYmo8L3Zhcj4gaXMgYSB7QGxpbmsgU3RyaW5nfSwgdGhlbiB0aGUgbWV0aG9kIHdpbGwgZmlyc3QgY2hlY2sgaWYgaXQncyBhIHN0cmluZwotICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIGEgbnVtYmVyLCBpbiB3aGljaCBjYXNlIGl0J2xsIGNvbXBhcmUgaXQgdG8gdGhlIGFwaSBsZXZlbC4gT3RoZXJ3aXNlLCBpdCdsbAotICAgICAqIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUgY29kZSBuYW1lLgotICAgICAqIDxwLz5Gb3IgYWxsIG90aGVyIHR5cGUgb2Ygb2JqZWN0IGdpdmUgYXMgcGFyYW1ldGVyLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQW5kcm9pZFZlcnNpb24pIHsKLSAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIHZlcnNpb24gPSAoQW5kcm9pZFZlcnNpb24pb2JqOwotCi0gICAgICAgICAgICBpZiAobUNvZGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5tQ29kZW5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbUFwaUxldmVsID09IHZlcnNpb24ubUFwaUxldmVsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvZGVuYW1lLmVxdWFscyh2ZXJzaW9uLm1Db2RlbmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BcGlMZXZlbCA9PSB2ZXJzaW9uLm1BcGlMZXZlbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGNvZGUgbmFtZSwgdGhpcyBtdXN0IG1hdGNoLgotICAgICAgICAgICAgaWYgKG1Db2RlbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db2RlbmFtZS5lcXVhbHMob2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZWxzZSB3ZSB0cnkgdG8gY29udmVydCB0byBhIGludCBhbmQgY29tcGFyZSB0byB0aGUgYXBpIGxldmVsCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylvYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBtQXBpTGV2ZWw7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vdCBhIG51bWJlcj8gd2UnbGwgcmV0dXJuIGZhbHNlIGJlbG93LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChtQ29kZW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2RlbmFtZS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlcmUgbWF5IGJlIHNvbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHRoZSBoYXNoY29kZSBvZiB0aGUgY29kZW5hbWUgYW5kIHRoZSBhcGkgbGV2ZWwKLSAgICAgICAgLy8gYnV0IGl0J3MgYWNjZXB0YWJsZS4KLSAgICAgICAgcmV0dXJuIG1BcGlMZXZlbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvSUFuZHJvaWRUYXJnZXQuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9JQW5kcm9pZFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTVhNTkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9JQW5kcm9pZFRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYjsKLQotCi0KLS8qKgotICogQSB2ZXJzaW9uIG9mIEFuZHJvaWQgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHRhcmdldCB3aGVuIGJ1aWxkaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbmRyb2lkVGFyZ2V0IGV4dGVuZHMgQ29tcGFyYWJsZTxJQW5kcm9pZFRhcmdldD4gewotCi0gICAgLyoqIE9TIFBhdGggdG8gdGhlICJhbmRyb2lkLmphciIgZmlsZS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBTkRST0lEX0pBUiAgICAgICAgID0gMTsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgImZyYW1ld29yay5haWRsIiBmaWxlLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFORFJPSURfQUlETCAgICAgICAgPSAyOwotICAgIC8qKiBPUyBQYXRoIHRvICJpbWFnZXMiIGZvbGRlciB3aGljaCBjb250YWlucyB0aGUgZW11bGF0b3Igc3lzdGVtIGltYWdlcy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTUFHRVMgICAgICAgICAgICAgID0gMzsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgInNhbXBsZXMiIGZvbGRlciB3aGljaCBjb250YWlucyBzYW1wbGUgcHJvamVjdHMuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0FNUExFUyAgICAgICAgICAgICA9IDQ7Ci0gICAgLyoqIE9TIFBhdGggdG8gdGhlICJza2lucyIgZm9sZGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBlbXVsYXRvciBza2lucy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTS0lOUyAgICAgICAgICAgICAgID0gNTsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgInRlbXBsYXRlcyIgZm9sZGVyIHdoaWNoIGNvbnRhaW5zIHRoZSB0ZW1wbGF0ZXMgZm9yIG5ldyBwcm9qZWN0cy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBURU1QTEFURVMgICAgICAgICAgID0gNjsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgImRhdGEiIGZvbGRlciB3aGljaCBjb250YWlucyBkYXRhICYgbGlicmFyaWVzIGZvciB0aGUgU0RLIHRvb2xzLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERBVEEgICAgICAgICAgICAgICAgPSA3OwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiYXR0cnMueG1sIiBmaWxlLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVMgICAgICAgICAgPSA4OwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiYXR0cnNfbWFuaWZlc3QueG1sIiBmaWxlLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BTklGRVNUX0FUVFJJQlVURVMgPSA5OwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiZGF0YS9sYXlvdXRsaWIuamFyIiBsaWJyYXJ5LiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExBWU9VVF9MSUIgICAgICAgICAgPSAxMDsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgImRhdGEvcmVzIiBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVTT1VSQ0VTICAgICAgICAgICA9IDExOwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiZGF0YS9mb250cyIgZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZPTlRTICAgICAgICAgICAgICAgPSAxMjsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgImRhdGEvd2lkZ2V0cy50eHQiIGZpbGUuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0lER0VUUyAgICAgICAgICAgICA9IDEzOwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiZGF0YS9hY3Rpdml0eV9hY3Rpb25zLnR4dCIgZmlsZS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBQ1RJT05TX0FDVElWSVRZICAgID0gMTQ7Ci0gICAgLyoqIE9TIFBhdGggdG8gdGhlICJkYXRhL2Jyb2FkY2FzdF9hY3Rpb25zLnR4dCIgZmlsZS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBQ1RJT05TX0JST0FEQ0FTVCAgID0gMTU7Ci0gICAgLyoqIE9TIFBhdGggdG8gdGhlICJkYXRhL3NlcnZpY2VfYWN0aW9ucy50eHQiIGZpbGUuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUNUSU9OU19TRVJWSUNFICAgICA9IDE2OwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSAiZGF0YS9jYXRlZ29yaWVzLnR4dCIgZmlsZS4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDQVRFR09SSUVTICAgICAgICAgID0gMTc7Ci0gICAgLyoqIE9TIFBhdGggdG8gdGhlICJzb3VyY2VzIiBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09VUkNFUyAgICAgICAgICAgICA9IDE4OwotICAgIC8qKiBPUyBQYXRoIHRvIHRoZSB0YXJnZXQgc3BlY2lmaWMgZG9jcyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPQ1MgICAgICAgICAgICAgICAgPSAxOTsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgdGFyZ2V0J3MgdmVyc2lvbiBvZiB0aGUgYWFwdCB0b29sLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFBUFQgICAgICAgICAgICAgICAgPSAyMDsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgdGFyZ2V0J3MgdmVyc2lvbiBvZiB0aGUgYWlkbCB0b29sLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFJREwgICAgICAgICAgICAgICAgPSAyMTsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgdGFyZ2V0J3MgdmVyc2lvbiBvZiB0aGUgZHggdG9vLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERYICAgICAgICAgICAgICAgICAgPSAyMjsKLSAgICAvKiogT1MgUGF0aCB0byB0aGUgdGFyZ2V0J3MgdmVyc2lvbiBvZiB0aGUgZHguamFyIGZpbGUuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRFhfSkFSICAgICAgICAgICAgICA9IDIzOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHZhbHVlIGZvciB7QGxpbmsgI2dldFVzYlZlbmRvcklkKCl9IG1lYW5pbmcgbm8gVVNCIHZlbmRvciBJRHMgYXJlIGRlZmluZWQgYnkgdGhlCi0gICAgICogQW5kcm9pZCB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fVVNCX0lEID0gMDsKLQotICAgIC8qKiBBbiBvcHRpb25hbCBsaWJyYXJ5IHByb3ZpZGVkIGJ5IGFuIEFuZHJvaWQgVGFyZ2V0ICovCi0gICAgcHVibGljIGludGVyZmFjZSBJT3B0aW9uYWxMaWJyYXJ5IHsKLSAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBhcyB1c2VkIGluIHRoZSBtYW5pZmVzdCAoJmx0O3VzZXMtbGlicmFyeSZndDspLiAqLwotICAgICAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgICAgICAvKiogVGhlIGZpbGUgbmFtZSBvZiB0aGUgamFyIGZpbGUuICovCi0gICAgICAgIFN0cmluZyBnZXRKYXJOYW1lKCk7Ci0gICAgICAgIC8qKiBBYnNvbHV0ZSBPUyBwYXRoIHRvIHRoZSBqYXIgZmlsZS4gKi8KLSAgICAgICAgU3RyaW5nIGdldEphclBhdGgoKTsKLSAgICAgICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSBsaWJyYXJ5LiAqLwotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgbG9jYXRpb24uCi0gICAgICovCi0gICAgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB2ZW5kb3Igb2YgdGhlIHRhcmdldC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VmVuZG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGFyZ2V0LCBwb3NzaWJseSBpbmNsdWRpbmcgdmVuZG9yIG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZ1bGxOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIHRvIGJlIGRpc3BsYXllZCB3aGVuIHJlcHJlc2VudGluZyBhbGwgdGhlIGxpYnJhcmllcyB0aGlzIHRhcmdldCBjb250YWlucy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2xhc3NwYXRoTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhcmdldC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHRhcmdldC4gVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi1udWxsLgotICAgICAqLwotICAgIEFuZHJvaWRWZXJzaW9uIGdldFZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBsYXRmb3JtIHZlcnNpb24gYXMgYSByZWFkYWJsZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZSgpOwotCi0gICAgLyoqIFJldHVybnMgdGhlIHJldmlzaW9uIG51bWJlciBmb3IgdGhlIHRhcmdldC4gKi8KLSAgICBpbnQgZ2V0UmV2aXNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIGEgc3RhbmRhcmQgQW5kcm9pZCBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUGxhdGZvcm0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCB0YXJnZXQuIFRoaXMgaXMgbGlrZWx5IHRvIG9ubHkgYmUgbm9uIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICoge0BsaW5rICNpc1BsYXRmb3JtKCl9IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgSUFuZHJvaWRUYXJnZXQgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIGEgcGxhdGZvcm0gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBwYXRoSWQgdGhlIGlkIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byByZXR1cm4uIEFueSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlCi0gICAgICoge0BsaW5rIElBbmRyb2lkVGFyZ2V0fSBpbnRlcmZhY2UgY2FuIGJlIHVzZWQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBhdGgoaW50IHBhdGhJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdmFpbGFibGUgc2tpbnMgZm9yIHRoaXMgdGFyZ2V0LgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFNraW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNraW4gZm9yIHRoaXMgdGFyZ2V0LgotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0U2tpbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIG9wdGlvbmFsIGxpYnJhcmllcyBmb3IgdGhpcyB0YXJnZXQuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBvcHRpb25hbCBsaWJyYXJpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLSAgICAgKi8KLSAgICBJT3B0aW9uYWxMaWJyYXJ5W10gZ2V0T3B0aW9uYWxMaWJyYXJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGF2YWlsYWJsZSBmb3IgYSBnaXZlbiBwbGF0Zm9ybS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFBsYXRmb3JtTGlicmFyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVU0IgVmVuZG9yIElEIGZvciB0aGUgdmVuZG9yIG9mIHRoaXMgdGFyZ2V0LgotICAgICAqIDxwLz5JZiB0aGUgdGFyZ2V0IGRlZmluZXMgbm8gVVNCIFZlbmRvciBJRCwgdGhlbiB0aGUgbWV0aG9kIHJldHVybiAwLgotICAgICAqLwotICAgIGludCBnZXRVc2JWZW5kb3JJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0YXJnZXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZWNlaXZlci4KLSAgICAgKiA8cC8+QSB0YXJnZXQgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlIGlmIGFwcGxpY2F0aW9ucyBkZXZlbG9wZWQgZm9yIHRoZSByZWNlaXZlciBjYW4gcnVuIG9uCi0gICAgICogdGhlIGdpdmVuIHRhcmdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIElBbmRyb2lkVGFyZ2V0IHRvIHRlc3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NvbXBhdGlibGVCYXNlRm9yKElBbmRyb2lkVGFyZ2V0IHRhcmdldCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSB0YXJnZXQuCi0gICAgICogVHlwaWNhbGx5IHRoZSB0YXJnZXQgd2lsbCBlbmNvZGUgaW5mb3JtYXRpb24gc3VjaCBhcyBhcGkgbGV2ZWwsIHdoZXRoZXIgaXQncyBhIHBsYXRmb3JtCi0gICAgICogb3IgYWRkLW9uLCBhbmQgaWYgaXQncyBhbiBhZGQtb24gdmVuZG9yIGFuZCBhZGQtb24gbmFtZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgaGFzaFN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL0lTZGtMb2cuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9JU2RrTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2Y3YTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL0lTZGtMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYjsKLQotaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gZGlzcGxheSB3YXJuaW5ncy9lcnJvcnMgd2hpbGUgcGFyc2luZyB0aGUgU0RLIGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNka0xvZyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIG9uIHN0ZG91dC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSB0YWdnZWQgd2l0aCAiV2FybmluZyIgb24gdGhlIG91dHB1dCBzbyB0aGUgY2FsbGVyIGRvZXMgbm90Ci0gICAgICogbmVlZCB0byBwdXQgc3VjaCBhIHByZWZpeCBpbiB0aGUgZm9ybWF0IHN0cmluZy4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBvbmx5IGRpc3BsYXkgd2FybmluZ3MgaW4gdmVyYm9zZSBtb2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3YXJuaW5nRm9ybWF0IGlzIGFuIG9wdGlvbmFsIGVycm9yIGZvcm1hdC4gSWYgbm9uLW51bGwsIGl0IHdpbGwgYmUgcHJpbnRlZAotICAgICAqICAgICAgICAgIHVzaW5nIGEge0BsaW5rIEZvcm1hdHRlcn0gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLgotICAgICAqIEBwYXJhbSBhcmdzIHByb3ZpZGVzIHRoZSBhcmd1bWVudHMgZm9yIHdhcm5pbmdGb3JtYXQuCi0gICAgICovCi0gICAgdm9pZCB3YXJuaW5nKFN0cmluZyB3YXJuaW5nRm9ybWF0LCBPYmplY3QuLi4gYXJncyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHRhZ2dlZCB3aXRoICJFcnJvciIgb24gdGhlIG91dHB1dCBzbyB0aGUgY2FsbGVyIGRvZXMgbm90Ci0gICAgICogbmVlZCB0byBwdXQgc3VjaCBhIHByZWZpeCBpbiB0aGUgZm9ybWF0IHN0cmluZy4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBkaXNwbGF5IGVycm9ycywgaW5kZXBlbmRlbnQgb2YgdmVyYm9zZSBtb2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0IGlzIGFuIG9wdGlvbmFsIHtAbGluayBUaHJvd2FibGV9IG9yIHtAbGluayBFeGNlcHRpb259LiBJZiBub24tbnVsbCwgaXQncwotICAgICAqICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIG91dC4KLSAgICAgKiBAcGFyYW0gZXJyb3JGb3JtYXQgaXMgYW4gb3B0aW9uYWwgZXJyb3IgZm9ybWF0LiBJZiBub24tbnVsbCwgaXQgd2lsbCBiZSBwcmludGVkCi0gICAgICogICAgICAgICAgdXNpbmcgYSB7QGxpbmsgRm9ybWF0dGVyfSB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIGFyZ3MgcHJvdmlkZXMgdGhlIGFyZ3VtZW50cyBmb3IgZXJyb3JGb3JtYXQuCi0gICAgICovCi0gICAgdm9pZCBlcnJvcihUaHJvd2FibGUgdCwgU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi4gYXJncyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbWVzc2FnZSBhcy1pcyBvbiBzdGRvdXQuCi0gICAgICogPHAvPgotICAgICAqIEltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgZGlzcGxheSBlcnJvcnMsIGluZGVwZW5kZW50IG9mIHZlcmJvc2UgbW9kZS4KLSAgICAgKiBObyBwcmVmaXggaXMgdXNlZCwgdGhlIG1lc3NhZ2UgaXMgcHJpbnRlZCBhcy1pcyBhZnRlciBmb3JtYXR0aW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dGb3JtYXQgaXMgYW4gb3B0aW9uYWwgZXJyb3IgZm9ybWF0LiBJZiBub24tbnVsbCwgaXQgd2lsbCBiZSBwcmludGVkCi0gICAgICogICAgICAgICAgdXNpbmcgYSB7QGxpbmsgRm9ybWF0dGVyfSB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIGFyZ3MgcHJvdmlkZXMgdGhlIGFyZ3VtZW50cyBmb3IgbXNnRm9ybWF0LgotICAgICAqLwotICAgIHZvaWQgcHJpbnRmKFN0cmluZyBtc2dGb3JtYXQsIE9iamVjdC4uLiBhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9OdWxsU2RrTG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvTnVsbFNka0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYwZjViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9OdWxsU2RrTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWI7Ci0KLS8qKgotICogRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgYW4ge0BsaW5rIElTZGtMb2d9LgotICogPHAvPgotICogVXNlIHtAbGluayAjZ2V0TG9nZ2VyKCl9IHRvIGdldCBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyB7QGxpbmsgTnVsbFNka0xvZ30uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNka0xvZyBpbXBsZW1lbnRzIElTZGtMb2cgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVNka0xvZyBzVGhpcyA9IG5ldyBOdWxsU2RrTG9nKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTZGtMb2cgZ2V0TG9nZ2VyKCkgewotICAgICAgICByZXR1cm4gc1RoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHQsIFN0cmluZyBlcnJvckZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgLy8gaWdub3JlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRmKFN0cmluZyBtc2dGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIC8vIGlnbm9yZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIHdhcm5pbmdGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIC8vIGlnbm9yZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9QbGF0Zm9ybVRhcmdldC5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL1BsYXRmb3JtVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjAwOWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL1BsYXRmb3JtVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBwbGF0Zm9ybSB0YXJnZXQgaW4gdGhlIFNESy4KLSAqLwotZmluYWwgY2xhc3MgUGxhdGZvcm1UYXJnZXQgaW1wbGVtZW50cyBJQW5kcm9pZFRhcmdldCB7Ci0gICAgLyoqIFN0cmluZyB1c2VkIHRvIGdldCBhIGhhc2ggdG8gdGhlIHBsYXRmb3JtIHRhcmdldCAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQTEFURk9STV9IQVNIID0gImFuZHJvaWQtJXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX1ZFTkRPUiA9ICJBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX05BTUUgPSAiQW5kcm9pZCAlcyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX05BTUVfUFJFVklFVyA9ICJBbmRyb2lkICVzIChQcmV2aWV3KSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVmVyc2lvbiBtVmVyc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVyc2lvbk5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJldmlzaW9uOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IG1QYXRocyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Ta2luczsKLQotCi0gICAgUGxhdGZvcm1UYXJnZXQoU3RyaW5nIGxvY2F0aW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMsCi0gICAgICAgICAgICBpbnQgYXBpTGV2ZWwsIFN0cmluZyBjb2RlTmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lLCBpbnQgcmV2aXNpb24pIHsKLSAgICAgICAgaWYgKGxvY2F0aW9uLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICB9Ci0gICAgICAgIG1Mb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBtUHJvcGVydGllcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcm9wZXJ0aWVzKTsKLSAgICAgICAgbVZlcnNpb24gPSBuZXcgQW5kcm9pZFZlcnNpb24oYXBpTGV2ZWwsIGNvZGVOYW1lKTsKLSAgICAgICAgbVZlcnNpb25OYW1lID0gdmVyc2lvbk5hbWU7Ci0gICAgICAgIG1SZXZpc2lvbiA9IHJldmlzaW9uOwotCi0gICAgICAgIGlmIChtVmVyc2lvbi5pc1ByZXZpZXcoKSkgewotICAgICAgICAgICAgbU5hbWUgPSAgU3RyaW5nLmZvcm1hdChQTEFURk9STV9OQU1FX1BSRVZJRVcsIG1WZXJzaW9uTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTmFtZSA9IFN0cmluZy5mb3JtYXQoUExBVEZPUk1fTkFNRSwgbVZlcnNpb25OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZS1idWlsZCB0aGUgcGF0aCB0byB0aGUgcGxhdGZvcm0gY29tcG9uZW50cwotICAgICAgICBtUGF0aHMucHV0KEFORFJPSURfSkFSLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuRk5fRlJBTUVXT1JLX0xJQlJBUlkpOwotICAgICAgICBtUGF0aHMucHV0KFNPVVJDRVMsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5GRF9BTkRST0lEX1NPVVJDRVMpOwotICAgICAgICBtUGF0aHMucHV0KEFORFJPSURfQUlETCwgbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLkZOX0ZSQU1FV09SS19BSURMKTsKLSAgICAgICAgbVBhdGhzLnB1dChJTUFHRVMsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19JTUFHRVNfRk9MREVSKTsKLSAgICAgICAgbVBhdGhzLnB1dChTQU1QTEVTLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fU0FNUExFU19GT0xERVIpOwotICAgICAgICBtUGF0aHMucHV0KFNLSU5TLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfU0tJTlNfRk9MREVSKTsKLSAgICAgICAgbVBhdGhzLnB1dChURU1QTEFURVMsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19QTEFURk9STV9URU1QTEFURVNfRk9MREVSKTsKLSAgICAgICAgbVBhdGhzLnB1dChEQVRBLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIpOwotICAgICAgICBtUGF0aHMucHV0KEFUVFJJQlVURVMsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19QTEFURk9STV9BVFRSU19YTUwpOwotICAgICAgICBtUGF0aHMucHV0KE1BTklGRVNUX0FUVFJJQlVURVMsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19QTEFURk9STV9BVFRSU19NQU5JRkVTVF9YTUwpOwotICAgICAgICBtUGF0aHMucHV0KFJFU09VUkNFUywgbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLk9TX1BMQVRGT1JNX1JFU09VUkNFU19GT0xERVIpOwotICAgICAgICBtUGF0aHMucHV0KEZPTlRTLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fRk9OVFNfRk9MREVSKTsKLSAgICAgICAgbVBhdGhzLnB1dChMQVlPVVRfTElCLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9MQVlPVVRMSUJfSkFSKTsKLSAgICAgICAgbVBhdGhzLnB1dChXSURHRVRTLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9XSURHRVRTKTsKLSAgICAgICAgbVBhdGhzLnB1dChBQ1RJT05TX0FDVElWSVRZLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9JTlRFTlRfQUNUSU9OU19BQ1RJVklUWSk7Ci0gICAgICAgIG1QYXRocy5wdXQoQUNUSU9OU19CUk9BRENBU1QsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19QTEFURk9STV9EQVRBX0ZPTERFUiArCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZOX0lOVEVOVF9BQ1RJT05TX0JST0FEQ0FTVCk7Ci0gICAgICAgIG1QYXRocy5wdXQoQUNUSU9OU19TRVJWSUNFLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9JTlRFTlRfQUNUSU9OU19TRVJWSUNFKTsKLSAgICAgICAgbVBhdGhzLnB1dChDQVRFR09SSUVTLCBtTG9jYXRpb24gKyBTZGtDb25zdGFudHMuT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9JTlRFTlRfQ0FURUdPUklFUyk7Ci0gICAgICAgIG1QYXRocy5wdXQoQUFQVCwgbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQUFQVCk7Ci0gICAgICAgIG1QYXRocy5wdXQoQUlETCwgbUxvY2F0aW9uICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQUlETCk7Ci0gICAgICAgIG1QYXRocy5wdXQoRFgsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfRk9MREVSICsgU2RrQ29uc3RhbnRzLkZOX0RYKTsKLSAgICAgICAgbVBhdGhzLnB1dChEWF9KQVIsIG1Mb2NhdGlvbiArIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfTElCX0ZPTERFUiArCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZOX0RYX0pBUik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEZvciBQbGF0Zm9ybSwgdGhlIHZlbmRvciBuYW1lIGlzIGFsd2F5cyAiQW5kcm9pZCIuCi0gICAgICoKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldCNnZXRWZW5kb3IoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotICAgICAgICByZXR1cm4gUExBVEZPUk1fVkVORE9SOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIERlc2NyaXB0aW9uIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpcyBkeW5hbWljYWxseSBnZW5lcmF0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldCNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlN0YW5kYXJkIEFuZHJvaWQgcGxhdGZvcm0gJXMiLCBtVmVyc2lvbk5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbmRyb2lkVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbVZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1WZXJzaW9uTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJldmlzaW9uKCkgewotICAgICAgICByZXR1cm4gbVJldmlzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxhdGZvcm0oKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBJQW5kcm9pZFRhcmdldCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aChpbnQgcGF0aElkKSB7Ci0gICAgICAgIHJldHVybiBtUGF0aHMuZ2V0KHBhdGhJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFNraW5zKCkgewotICAgICAgICByZXR1cm4gbVNraW5zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNraW4oKSB7Ci0gICAgICAgIC8vIGF0IHRoaXMgdGltZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBza2luIGZvciBhbGwgdGhlIHBsYXRmb3JtLgotICAgICAgICByZXR1cm4gIkhWR0EiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsd2F5cyByZXR1cm5zIG51bGwsIGFzIGEgc3RhbmRhcmQgcGxhdGZvcm0gaGEgbm8gb3B0aW9uYWwgbGlicmFyaWVzLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIEBzZWUgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0I2dldE9wdGlvbmFsTGlicmFyaWVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSU9wdGlvbmFsTGlicmFyeVtdIGdldE9wdGlvbmFsTGlicmFyaWVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdXJyZW50bHkgYWx3YXlzIHJldHVybiBhIGZpeGVkIGxpc3Qgd2l0aCAiYW5kcm9pZC50ZXN0LnJ1bm5lciIgaW4gaXQuCi0gICAgICogPHAvPgotICAgICAqIFRPRE8gY2hhbmdlIHRoZSBmaXhlZCBsaWJyYXJ5IGxpc3QgdG8gYmUgYnVpbGQtZGVwZW5kZW50IGxhdGVyLgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGxhdGZvcm1MaWJyYXJpZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBTZGtDb25zdGFudHMuQU5EUk9JRF9URVNUX1JVTk5FUl9MSUIgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGxhdGZvcm0gaGFzIG5vIFVTQiBWZW5kb3IgSWQ6IGFsd2F5cyByZXR1cm4ge0BsaW5rIElBbmRyb2lkVGFyZ2V0I05PX1VTQl9JRH0uCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VXNiVmVuZG9ySWQoKSB7Ci0gICAgICAgIHJldHVybiBOT19VU0JfSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlQmFzZUZvcihJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgLy8gYmFzaWMgdGVzdAotICAgICAgICBpZiAodGFyZ2V0ID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIHBsYXRmb3JtIGhhcyBhIGNvZGVuYW1lIChpZSBpdCdzIGEgcHJldmlldyBvZiBhbiB1cGNvbWluZyBwbGF0Zm9ybSksIHRoZW4KLSAgICAgICAgLy8gYm90aCBwbGF0Zm9ybXMgbXVzdCBiZSBleGFjdGx5IGlkZW50aWNhbC4KLSAgICAgICAgaWYgKG1WZXJzaW9uLmdldENvZGVuYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uLmVxdWFscyh0YXJnZXQuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRhcmdldCBpcyBjb21wYXRpYmxlIHdpdCB0aGUgcmVjZWl2ZXIgYXMgbG9uZyBhcyBpdHMgYXBpIHZlcnNpb24gbnVtYmVyIGlzIGdyZWF0ZXIgb3IKLSAgICAgICAgLy8gZXF1YWwuCi0gICAgICAgIHJldHVybiB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCkgPj0gbVZlcnNpb24uZ2V0QXBpTGV2ZWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGhhc2hTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KFBMQVRGT1JNX0hBU0gsIG1WZXJzaW9uLmdldEFwaVN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaGFzaFN0cmluZygpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFBsYXRmb3JtVGFyZ2V0KSB7Ci0gICAgICAgICAgICBQbGF0Zm9ybVRhcmdldCBwbGF0Zm9ybSA9IChQbGF0Zm9ybVRhcmdldClvYmo7Ci0KLSAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbi5lcXVhbHMocGxhdGZvcm0uZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFsd2F5cyByZXR1cm4gLTEgaWYgdGhlIG9iamVjdCB3ZSBjb21wYXJlIHRvIGlzIGFuIGFkZG9uLgotICAgICAqIE90aGVyd2lzZSwgY29tcGFyZSBhcGkgbGV2ZWwuCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQuaXNQbGF0Zm9ybSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYXBpRGlmZiA9IG1WZXJzaW9uLmdldEFwaUxldmVsKCkgLSB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCk7Ci0KLSAgICAgICAgaWYgKG1WZXJzaW9uLmdldENvZGVuYW1lKCkgIT0gbnVsbCAmJiBhcGlEaWZmID09IDApIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXQuZ2V0VmVyc2lvbigpLmdldENvZGVuYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiArMTsgLy8gcHJldmlldyBzaG93ZWQgbGFzdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uLmdldENvZGVuYW1lKCkuY29tcGFyZVRvKHRhcmdldC5nZXRWZXJzaW9uKCkuZ2V0Q29kZW5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXBpRGlmZjsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIHBsYXRmb3JtIG9ubHkgbWV0aG9kcy4KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gbVByb3BlcnRpZXM7IC8vIG1Qcm9wZXJ0aWVzIGlzIHVubW9kaWZpYWJsZS4KLSAgICB9Ci0KLSAgICB2b2lkIHNldFNraW5zKFN0cmluZ1tdIHNraW5zKSB7Ci0gICAgICAgIG1Ta2lucyA9IHNraW5zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9TZGtDb25zdGFudHMuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9TZGtDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3NmFlMy4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvU2RrQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb24gY2xhc3MuPGJyPgotICogPGJyPgotICogTW9zdCBjb25zdGFudHMgaGF2ZSBhIHByZWZpeCBkZWZpbmluZyB0aGUgY29udGVudC4KLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5PU188L2NvZGU+IE9TIHBhdGggY29uc3RhbnQuIFRoZXNlIHBhdGhzIGFyZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS48L2xpPgotICogPGxpPjxjb2RlPkZOXzwvY29kZT4gRmlsZSBuYW1lIGNvbnN0YW50LjwvbGk+Ci0gKiA8bGk+PGNvZGU+RkRfPC9jb2RlPiBGb2xkZXIgbmFtZSBjb25zdGFudC48L2xpPgotICogPC91bD4KLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZGtDb25zdGFudHMgewotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBMQVRGT1JNX1VOS05PV04gPSAwOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBMQVRGT1JNX0xJTlVYID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBQTEFURk9STV9XSU5ET1dTID0gMjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBQTEFURk9STV9EQVJXSU4gPSAzOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjdXJyZW50IHBsYXRmb3JtLCBvbmUgb2Yge0BsaW5rICNQTEFURk9STV9XSU5ET1dTfSwge0BsaW5rICNQTEFURk9STV9EQVJXSU59LAotICAgICAqIHtAbGluayAjUExBVEZPUk1fTElOVVh9IG9yIHtAbGluayAjUExBVEZPUk1fVU5LTk9XTn0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ1VSUkVOVF9QTEFURk9STSA9IGN1cnJlbnRQbGF0Zm9ybSgpOwotCi0gICAgLyoqCi0gICAgICogQ2hhcnNldCBmb3IgdGhlIGluaSBmaWxlIGhhbmRsZWQgYnkgdGhlIFNESy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTklfQ0hBUlNFVCA9ICJVVEYtOCI7Ci0KLSAgICAvKiogQW4gU0RLIFByb2plY3QncyBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9BTkRST0lEX01BTklGRVNUX1hNTD0gIkFuZHJvaWRNYW5pZmVzdC54bWwiOwotICAgIC8qKiBBbiBTREsgUHJvamVjdCdzIGJ1aWxkLnhtbCBmaWxlICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fQlVJTERfWE1MID0gImJ1aWxkLnhtbCI7Ci0KLSAgICAvKiogTmFtZSBvZiB0aGUgZnJhbWV3b3JrIGxpYnJhcnksIGkuZS4gImFuZHJvaWQuamFyIiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX0ZSQU1FV09SS19MSUJSQVJZID0gImFuZHJvaWQuamFyIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgbGF5b3V0IGF0dHJpYnV0ZXMsIGkuZS4gImF0dHJzLnhtbCIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9BVFRSU19YTUwgPSAiYXR0cnMueG1sIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgbGF5b3V0IGF0dHJpYnV0ZXMsIGkuZS4gImF0dHJzX21hbmlmZXN0LnhtbCIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9BVFRSU19NQU5JRkVTVF9YTUwgPSAiYXR0cnNfbWFuaWZlc3QueG1sIjsKLSAgICAvKiogZnJhbWV3b3JrIGFpZGwgaW1wb3J0IGZpbGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9GUkFNRVdPUktfQUlETCA9ICJmcmFtZXdvcmsuYWlkbCI7Ci0gICAgLyoqIGxheW91dGxpYi5qYXIgZmlsZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX0xBWU9VVExJQl9KQVIgPSAibGF5b3V0bGliLmphciI7Ci0gICAgLyoqIHdpZGdldCBsaXN0IGZpbGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9XSURHRVRTID0gIndpZGdldHMudHh0IjsKLSAgICAvKiogSW50ZW50IGFjdGl2aXR5IGFjdGlvbnMgbGlzdCBmaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5fSU5URU5UX0FDVElPTlNfQUNUSVZJVFkgPSAiYWN0aXZpdHlfYWN0aW9ucy50eHQiOwotICAgIC8qKiBJbnRlbnQgYnJvYWRjYXN0IGFjdGlvbnMgbGlzdCBmaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5fSU5URU5UX0FDVElPTlNfQlJPQURDQVNUID0gImJyb2FkY2FzdF9hY3Rpb25zLnR4dCI7Ci0gICAgLyoqIEludGVudCBzZXJ2aWNlIGFjdGlvbnMgbGlzdCBmaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5fSU5URU5UX0FDVElPTlNfU0VSVklDRSA9ICJzZXJ2aWNlX2FjdGlvbnMudHh0IjsKLSAgICAvKiogSW50ZW50IGNhdGVnb3J5IGxpc3QgZmlsZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX0lOVEVOVF9DQVRFR09SSUVTID0gImNhdGVnb3JpZXMudHh0IjsKLQotICAgIC8qKiBwbGF0Zm9ybSBidWlsZCBwcm9wZXJ0eSBmaWxlICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fQlVJTERfUFJPUCA9ICJidWlsZC5wcm9wIjsKLSAgICAvKiogcGx1Z2luIHByb3BlcnRpZXMgZmlsZSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX1BMVUdJTl9QUk9QID0gInBsdWdpbi5wcm9wIjsKLSAgICAvKiogYWRkLW9uIG1hbmlmZXN0IGZpbGUgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGTl9NQU5JRkVTVF9JTkkgPSAibWFuaWZlc3QuaW5pIjsKLSAgICAvKiogYWRkLW9uIGxheW91dCBkZXZpY2UgWE1MIGZpbGUuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fREVWSUNFU19YTUwgPSAiZGV2aWNlcy54bWwiOwotICAgIC8qKiBoYXJkd2FyZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZmlsZSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0hBUkRXQVJFX0lOSSA9ICJoYXJkd2FyZS1wcm9wZXJ0aWVzLmluaSI7Ci0KLSAgICAvKiogU2tpbiBsYXlvdXQgZmlsZSAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX1NLSU5fTEFZT1VUID0gImxheW91dCI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqIGRleC5qYXIgZmlsZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX0RYX0pBUiA9ICJkeC5qYXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogZHggZXhlY3V0YWJsZSAod2l0aCBleHRlbnNpb24gZm9yIHRoZSBjdXJyZW50IE9TKSAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGTl9EWCA9IChDVVJSRU5UX1BMQVRGT1JNID09IFBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJkeC5iYXQiIDogImR4IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAvKiogYWFwdCBleGVjdXRhYmxlICh3aXRoIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnJlbnQgT1MpICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0FBUFQgPSAoQ1VSUkVOVF9QTEFURk9STSA9PSBQTEFURk9STV9XSU5ET1dTKSA/Ci0gICAgICAgICAgICAiYWFwdC5leGUiIDogImFhcHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8qKiBhaWRsIGV4ZWN1dGFibGUgKHdpdGggZXh0ZW5zaW9uIGZvciB0aGUgY3VycmVudCBPUykgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fQUlETCA9IChDVVJSRU5UX1BMQVRGT1JNID09IFBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJhaWRsLmV4ZSIgOiAiYWlkbCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLyoqIGFkYiBleGVjdXRhYmxlICh3aXRoIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnJlbnQgT1MpICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZOX0FEQiA9IChDVVJSRU5UX1BMQVRGT1JNID09IFBMQVRGT1JNX1dJTkRPV1MpID8KLSAgICAgICAgICAgICJhZGIuZXhlIiA6ICJhZGIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8qKiBlbXVsYXRvciBleGVjdXRhYmxlICh3aXRoIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnJlbnQgT1MpICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fRU1VTEFUT1IgPSAoQ1VSUkVOVF9QTEFURk9STSA9PSBQTEFURk9STV9XSU5ET1dTKSA/Ci0gICAgICAgICAgICAiZW11bGF0b3IuZXhlIiA6ICJlbXVsYXRvciI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLyoqIHppcGFsaWduIGV4ZWN1dGFibGUgKHdpdGggZXh0ZW5zaW9uIGZvciB0aGUgY3VycmVudCBPUykgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk5fWklQQUxJR04gPSAoQ1VSUkVOVF9QTEFURk9STSA9PSBQTEFURk9STV9XSU5ET1dTKSA/Ci0gICAgICAgICAgICAiemlwYWxpZ24uZXhlIiA6ICJ6aXBhbGlnbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLyogRm9sZGVyIE5hbWVzIGZvciBBbmRyb2lkIFByb2plY3RzIC4gKi8KLQotICAgIC8qKiBSZXNvdXJjZXMgZm9sZGVyIG5hbWUsIGkuZS4gInJlcyIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfUkVTT1VSQ0VTID0gInJlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogQXNzZXRzIGZvbGRlciBuYW1lLCBpLmUuICJhc3NldHMiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfQVNTRVRTID0gImFzc2V0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGVmYXVsdCBzb3VyY2UgZm9sZGVyIG5hbWUsIGkuZS4gInNyYyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9TT1VSQ0VTID0gInNyYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGVmYXVsdCBnZW5lcmF0ZWQgc291cmNlIGZvbGRlciBuYW1lLCBpLmUuICJnZW4iICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfR0VOX1NPVVJDRVMgPSAiZ2VuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBEZWZhdWx0IG5hdGl2ZSBsaWJyYXJ5IGZvbGRlciBuYW1lIGluc2lkZSB0aGUgcHJvamVjdCwgaS5lLiAibGlicyIKLSAgICAgKiBXaGlsZSB0aGUgZm9sZGVyIGluc2lkZSB0aGUgLmFwayBpcyAibGliIiwgd2UgY2FsbCB0aGF0IG9uZSBsaWJzIGJlY2F1c2UKLSAgICAgKiB0aGF0J3Mgd2hhdCB3ZSB1c2UgaW4gYW50IGZvciBib3RoIC5qYXIgYW5kIC5zbyBhbmQgd2UgbmVlZCB0byBtYWtlIHRoZSAyIGRldmVsb3BtZW50IHdheXMKLSAgICAgKiBjb21wYXRpYmxlLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX05BVElWRV9MSUJTID0gImxpYnMiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIE5hdGl2ZSBsaWIgZm9sZGVyIGluc2lkZSB0aGUgQVBLOiAibGliIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0FQS19OQVRJVkVfTElCUyA9ICJsaWIiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERlZmF1bHQgb3V0cHV0IGZvbGRlciBuYW1lLCBpLmUuICJiaW4iICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfT1VUUFVUID0gImJpbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGVmYXVsdCBhbmltIHJlc291cmNlIGZvbGRlciBuYW1lLCBpLmUuICJhbmltIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0FOSU0gPSAiYW5pbSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGVmYXVsdCBjb2xvciByZXNvdXJjZSBmb2xkZXIgbmFtZSwgaS5lLiAiY29sb3IiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERlZmF1bHQgZHJhd2FibGUgcmVzb3VyY2UgZm9sZGVyIG5hbWUsIGkuZS4gImRyYXdhYmxlIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0RSQVdBQkxFID0gImRyYXdhYmxlIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBEZWZhdWx0IGxheW91dCByZXNvdXJjZSBmb2xkZXIgbmFtZSwgaS5lLiAibGF5b3V0IiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0xBWU9VVCA9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERlZmF1bHQgbWVudSByZXNvdXJjZSBmb2xkZXIgbmFtZSwgaS5lLiAibWVudSIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9NRU5VID0gIm1lbnUiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERlZmF1bHQgdmFsdWVzIHJlc291cmNlIGZvbGRlciBuYW1lLCBpLmUuICJ2YWx1ZXMiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfVkFMVUVTID0gInZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRGVmYXVsdCB4bWwgcmVzb3VyY2UgZm9sZGVyIG5hbWUsIGkuZS4gInhtbCIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9YTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBEZWZhdWx0IHJhdyByZXNvdXJjZSBmb2xkZXIgbmFtZSwgaS5lLiAicmF3IiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX1JBVyA9ICJyYXciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiBGb2xkZXIgTmFtZXMgZm9yIHRoZSBBbmRyb2lkIFNESyAqLwotCi0gICAgLyoqIE5hbWUgb2YgdGhlIFNESyBwbGF0Zm9ybXMgZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX1BMQVRGT1JNUyA9ICJwbGF0Zm9ybXMiOwotICAgIC8qKiBOYW1lIG9mIHRoZSBTREsgYWRkb25zIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9BRERPTlMgPSAiYWRkLW9ucyI7Ci0gICAgLyoqIE5hbWUgb2YgdGhlIFNESyB0b29scyBmb2xkZXIuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfVE9PTFMgPSAidG9vbHMiOwotICAgIC8qKiBOYW1lIG9mIHRoZSBTREsgdG9vbHMvbGliIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9MSUIgPSAibGliIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgU0RLIGRvY3MgZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0RPQ1MgPSAiZG9jcyI7Ci0gICAgLyoqIE5hbWUgb2YgdGhlIGRvYyBmb2xkZXIgY29udGFpbmluZyBBUEkgcmVmZXJlbmNlIGRvYyAoamF2YWRvYykgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRF9ET0NTX1JFRkVSRU5DRSA9ICJyZWZlcmVuY2UiOwotICAgIC8qKiBOYW1lIG9mIHRoZSBTREsgaW1hZ2VzIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9JTUFHRVMgPSAiaW1hZ2VzIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgU0RLIHNraW5zIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9TS0lOUyA9ICJza2lucyI7Ci0gICAgLyoqIE5hbWUgb2YgdGhlIFNESyBzYW1wbGVzIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9TQU1QTEVTID0gInNhbXBsZXMiOwotICAgIC8qKiBOYW1lIG9mIHRoZSBTREsgdGVtcGxhdGVzIGZvbGRlciwgaS5lLiAidGVtcGxhdGVzIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX1RFTVBMQVRFUyA9ICJ0ZW1wbGF0ZXMiOwotICAgIC8qKiBOYW1lIG9mIHRoZSBTREsgZGF0YSBmb2xkZXIsIGkuZS4gImRhdGEiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkRfREFUQSA9ICJkYXRhIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgU0RLIHJlc291cmNlcyBmb2xkZXIsIGkuZS4gInJlcyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9SRVMgPSAicmVzIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgU0RLIGZvbnQgZm9sZGVyLCBpLmUuICJmb250cyIgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGRF9GT05UUyA9ICJmb250cyI7Ci0gICAgLyoqIE5hbWUgb2YgdGhlIGFuZHJvaWQgc291cmNlcyBkaXJlY3RvcnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRF9BTkRST0lEX1NPVVJDRVMgPSAic291cmNlcyI7Ci0gICAgLyoqIE5hbWUgb2YgdGhlIGFkZG9uIGxpYnMgZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZEX0FERE9OX0xJQlMgPSAibGlicyI7Ci0KLSAgICAvKiogTmFtZXNwYWNlIGZvciB0aGUgcmVzb3VyY2UgWE1MLCBpLmUuICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfUkVTT1VSQ0VTID0gImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI7Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHVzZXMtbGlicmFyeSB0aGF0IHByb3ZpZGVzICJhbmRyb2lkLnRlc3QucnVubmVyIiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFORFJPSURfVEVTVF9SVU5ORVJfTElCID0gImFuZHJvaWQudGVzdC5ydW5uZXIiOwotCi0gICAgLyogRm9sZGVyIHBhdGggcmVsYXRpdmUgdG8gdGhlIFNESyByb290ICovCi0gICAgLyoqIFBhdGggb2YgdGhlIGRvY3VtZW50YXRpb24gZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBzZGsgZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1NES19ET0NTX0ZPTERFUiA9IEZEX0RPQ1MgKyBGaWxlLnNlcGFyYXRvcjsKLQotICAgIC8qKiBQYXRoIG9mIHRoZSB0b29scyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHNkayBmb2xkZXIsIG9yIHRvIGEgcGxhdGZvcm0gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1NES19UT09MU19GT0xERVIgPSBGRF9UT09MUyArIEZpbGUuc2VwYXJhdG9yOwotCi0gICAgLyoqIFBhdGggb2YgdGhlIGxpYiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHNkayBmb2xkZXIsIG9yIHRvIGEgcGxhdGZvcm0gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1NES19UT09MU19MSUJfRk9MREVSID0KLSAgICAgICAgICAgIE9TX1NES19UT09MU19GT0xERVIgKyBGRF9MSUIgKyBGaWxlLnNlcGFyYXRvcjsKLQotICAgIC8qIEZvbGRlciBwYXRocyByZWxhdGl2ZSB0byBhIHBsYXRmb3JtIG9yIGFkZC1vbiBmb2xkZXIgKi8KLQotICAgIC8qKiBQYXRoIG9mIHRoZSBpbWFnZXMgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gb3IgYWRkb24gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX0lNQUdFU19GT0xERVIgPSBGRF9JTUFHRVMgKyBGaWxlLnNlcGFyYXRvcjsKLQotICAgIC8qKiBQYXRoIG9mIHRoZSBza2luIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBhIHBsYXRmb3JtIG9yIGFkZG9uIGZvbGRlci4KLSAgICAgKiAgVGhpcyBpcyBhbiBPUyBwYXRoLCBlbmRpbmcgd2l0aCBhIHNlcGFyYXRvci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPU19TS0lOU19GT0xERVIgPSBGRF9TS0lOUyArIEZpbGUuc2VwYXJhdG9yOwotCi0gICAgLyogRm9sZGVyIHBhdGhzIHJlbGF0aXZlIHRvIGEgUGxhdGZvcm0gZm9sZGVyICovCi0KLSAgICAvKiogUGF0aCBvZiB0aGUgZGF0YSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gYSBwbGF0Zm9ybSBmb2xkZXIuCi0gICAgICogIFRoaXMgaXMgYW4gT1MgcGF0aCwgZW5kaW5nIHdpdGggYSBzZXBhcmF0b3IuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1NfUExBVEZPUk1fREFUQV9GT0xERVIgPSBGRF9EQVRBICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgc2FtcGxlcyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gYSBwbGF0Zm9ybSBmb2xkZXIuCi0gICAgICogIFRoaXMgaXMgYW4gT1MgcGF0aCwgZW5kaW5nIHdpdGggYSBzZXBhcmF0b3IuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1NfUExBVEZPUk1fU0FNUExFU19GT0xERVIgPSBGRF9TQU1QTEVTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgcmVzb3VyY2VzIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBhIHBsYXRmb3JtIGZvbGRlci4KLSAgICAgKiAgVGhpcyBpcyBhbiBPUyBwYXRoLCBlbmRpbmcgd2l0aCBhIHNlcGFyYXRvci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPU19QTEFURk9STV9SRVNPVVJDRVNfRk9MREVSID0KLSAgICAgICAgICAgIE9TX1BMQVRGT1JNX0RBVEFfRk9MREVSICsgRkRfUkVTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgZm9udHMgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1BMQVRGT1JNX0ZPTlRTX0ZPTERFUiA9Ci0gICAgICAgICAgICBPU19QTEFURk9STV9EQVRBX0ZPTERFUiArIEZEX0ZPTlRTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgYW5kcm9pZCBzb3VyY2UgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1BMQVRGT1JNX1NPVVJDRVNfRk9MREVSID0gRkRfQU5EUk9JRF9TT1VSQ0VTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgYW5kcm9pZCB0ZW1wbGF0ZXMgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gZm9sZGVyLgotICAgICAqICBUaGlzIGlzIGFuIE9TIHBhdGgsIGVuZGluZyB3aXRoIGEgc2VwYXJhdG9yLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1BMQVRGT1JNX1RFTVBMQVRFU19GT0xERVIgPSBGRF9URU1QTEFURVMgKyBGaWxlLnNlcGFyYXRvcjsKLQotICAgIC8qKiBQYXRoIG9mIHRoZSBhdHRycy54bWwgZmlsZSByZWxhdGl2ZSB0byBhIHBsYXRmb3JtIGZvbGRlci4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPU19QTEFURk9STV9BVFRSU19YTUwgPQotICAgICAgICAgICAgT1NfUExBVEZPUk1fUkVTT1VSQ0VTX0ZPTERFUiArIEZEX1ZBTFVFUyArIEZpbGUuc2VwYXJhdG9yICsgRk5fQVRUUlNfWE1MOwotCi0gICAgLyoqIFBhdGggb2YgdGhlIGF0dHJzX21hbmlmZXN0LnhtbCBmaWxlIHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1BMQVRGT1JNX0FUVFJTX01BTklGRVNUX1hNTCA9Ci0gICAgICAgICAgICBPU19QTEFURk9STV9SRVNPVVJDRVNfRk9MREVSICsgRkRfVkFMVUVTICsgRmlsZS5zZXBhcmF0b3IgKyBGTl9BVFRSU19NQU5JRkVTVF9YTUw7Ci0KLSAgICAvKiogUGF0aCBvZiB0aGUgbGF5b3V0bGliLmphciBmaWxlIHJlbGF0aXZlIHRvIGEgcGxhdGZvcm0gZm9sZGVyLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TX1BMQVRGT1JNX0xBWU9VVExJQl9KQVIgPQotICAgICAgICAgICAgT1NfUExBVEZPUk1fREFUQV9GT0xERVIgKyBGTl9MQVlPVVRMSUJfSkFSOwotCi0gICAgLyogRm9sZGVyIHBhdGhzIHJlbGF0aXZlIHRvIGEgYWRkb24gZm9sZGVyICovCi0KLSAgICAvKiogUGF0aCBvZiB0aGUgaW1hZ2VzIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBhIGZvbGRlciBmb2xkZXIuCi0gICAgICogIFRoaXMgaXMgYW4gT1MgcGF0aCwgZW5kaW5nIHdpdGggYSBzZXBhcmF0b3IuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1NfQURET05fTElCU19GT0xERVIgPSBGRF9BRERPTl9MSUJTICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQotICAgIC8qKiBTa2luIGRlZmF1bHQgKiovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0tJTl9ERUZBVUxUID0gImRlZmF1bHQiOwotCi0gICAgLyoqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm9yIHRoZSAnYW5kcm9pZCcgY29tbWFuZCwgd2hpY2ggaXMgJ2FuZHJvaWQuYmF0JyBmb3IKLSAgICAgKiBXaW5kb3dzIGFuZCAnYW5kcm9pZCcgZm9yIGFsbCBvdGhlciBwbGF0Zm9ybXMuICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYW5kcm9pZENtZE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotICAgICAgICBTdHJpbmcgY21kID0gImFuZHJvaWQiOwotICAgICAgICBpZiAob3Muc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7Ci0gICAgICAgICAgICBjbWQgKz0gIi5iYXQiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm9yIHRoZSAnbWtzZGNhcmQnIGNvbW1hbmQsIHdoaWNoIGlzICdta3NkY2FyZC5leGUnIGZvcgotICAgICAqIFdpbmRvd3MgYW5kICdta2RzZGNhcmQnIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1rU2RDYXJkQ21kTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7Ci0gICAgICAgIFN0cmluZyBjbWQgPSAibWtzZGNhcmQiOwotICAgICAgICBpZiAob3Muc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7Ci0gICAgICAgICAgICBjbWQgKz0gIi5leGUiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjdXJyZW50IHBsYXRmb3JtCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9uZSBvZiB7QGxpbmsgI1BMQVRGT1JNX1dJTkRPV1N9LCB7QGxpbmsgI1BMQVRGT1JNX0RBUldJTn0sCi0gICAgICoge0BsaW5rICNQTEFURk9STV9MSU5VWH0gb3Ige0BsaW5rICNQTEFURk9STV9VTktOT1dOfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjdXJyZW50UGxhdGZvcm0oKSB7Ci0gICAgICAgIFN0cmluZyBvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChvcy5zdGFydHNXaXRoKCJNYWMgT1MiKSkgeyAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gUExBVEZPUk1fREFSV0lOOwotICAgICAgICB9IGVsc2UgaWYgKG9zLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgeyAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIFBMQVRGT1JNX1dJTkRPV1M7Ci0gICAgICAgIH0gZWxzZSBpZiAob3Muc3RhcnRzV2l0aCgiTGludXgiKSkgeyAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gUExBVEZPUk1fTElOVVg7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gUExBVEZPUk1fVU5LTk9XTjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvU2RrTWFuYWdlci5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL1Nka01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwOTI3NC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvU2RrTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFRoZSBTREsgbWFuYWdlciBwYXJzZXMgdGhlIFNESyBmb2xkZXIgYW5kIGdpdmVzIGFjY2VzcyB0byB0aGUgY29udGVudC4KLSAqIEBzZWUgUGxhdGZvcm1UYXJnZXQKLSAqIEBzZWUgQWRkT25UYXJnZXQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNka01hbmFnZXIgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9WRVJTSU9OX1NESyA9ICJyby5idWlsZC52ZXJzaW9uLnNkayI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9WRVJTSU9OX0NPREVOQU1FID0gInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVkVSU0lPTl9SRUxFQVNFID0gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURET05fTkFNRSA9ICJuYW1lIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURET05fVkVORE9SID0gInZlbmRvciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERE9OX0FQSSA9ICJhcGkiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBRERPTl9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERE9OX0xJQlJBUklFUyA9ICJsaWJyYXJpZXMiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBRERPTl9ERUZBVUxUX1NLSU4gPSAic2tpbiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERE9OX1VTQl9WRU5ET1IgPSAidXNiLXZlbmRvciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERE9OX1JFVklTSU9OID0gInJldmlzaW9uIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURET05fUkVWSVNJT05fT0xEID0gInZlcnNpb24iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUGF0dGVybiBQQVRURVJOX1BST1AgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXihbYS16QS1aMC05Ll8tXSspXFxzKj1cXHMqKC4qKVxccyokIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFBBVFRFUk5fTElCX0RBVEEgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXihbYS16QS1aMC05Ll8tXStcXC5qYXIpOyguKikkIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQotICAgICAvLyB1c2IgaWRzIGFyZSAxNi1iaXQgaGV4YWRlY2ltYWwgdmFsdWVzLgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gUEFUVEVSTl9VU0JfSURTID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIl4weFthLWYwLTldezR9JCIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0KLSAgICAvKiogTGlzdCBvZiBpdGVtcyBpbiB0aGUgcGxhdGZvcm0gdG8gY2hlY2sgd2hlbiBwYXJzaW5nIGl0LiBUaGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICogcGxhdGZvcm0gcm9vdCBmb2xkZXIuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gc1BsYXRmb3JtQ29udGVudExpc3QgPSBuZXcgU3RyaW5nW10gewotICAgICAgICBTZGtDb25zdGFudHMuRk5fRlJBTUVXT1JLX0xJQlJBUlksCi0gICAgICAgIFNka0NvbnN0YW50cy5GTl9GUkFNRVdPUktfQUlETCwKLSAgICAgICAgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQUFQVCwKLSAgICAgICAgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQUlETCwKLSAgICAgICAgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fRFgsCi0gICAgICAgIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfTElCX0ZPTERFUiArIFNka0NvbnN0YW50cy5GTl9EWF9KQVIsCi0gICAgfTsKLQotICAgIC8qKiBQcmVmZXJlbmNlIGZpbGUgY29udGFpbmluZyB0aGUgdXNiIGlkcyBmb3IgYWRiICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQl9JTklfRklMRSA9ICJhZGJfdXNiLmluaSI7Ci0gICAgICAgLy8wLS0tLS0tLS05MC0tLS0tLS0tOTAtLS0tLS0tLTkwLS0tLS0tLS05MC0tLS0tLS0tOTAtLS0tLS0tLTkwLS0tLS0tLS05MC0tLS0tLS0tOQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBREJfSU5JX0hFQURFUiA9Ci0gICAgICAgICIjIEFORFJPSUQgM1JEIFBBUlRZIFVTQiBWRU5ET1IgSUQgTElTVCAtLSBETyBOT1QgRURJVC5cbiIgKwotICAgICAgICAiIyBVU0UgJ2FuZHJvaWQgdXBkYXRlIGFkYicgVE8gR0VORVJBVEUuXG4iICsKLSAgICAgICAgIiMgMSBVU0IgVkVORE9SIElEIFBFUiBMSU5FLlxuIjsKLQotICAgIC8qKiB0aGUgbG9jYXRpb24gb2YgdGhlIFNESyAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZGtMb2NhdGlvbjsKLSAgICBwcml2YXRlIElBbmRyb2lkVGFyZ2V0W10gbVRhcmdldHM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIFNka01hbmFnZXJ9IGluc3RhbmNlLgotICAgICAqIEV4dGVybmFsIHVzZXJzIHNob3VsZCB1c2Uge0BsaW5rICNjcmVhdGVNYW5hZ2VyKFN0cmluZywgSVNka0xvZyl9LgotICAgICAqCi0gICAgICogQHBhcmFtIHNka0xvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgU0RLLgotICAgICAqLwotICAgIHByaXZhdGUgU2RrTWFuYWdlcihTdHJpbmcgc2RrTG9jYXRpb24pIHsKLSAgICAgICAgbVNka0xvY2F0aW9uID0gc2RrTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgU2RrTWFuYWdlcn0gZm9yIGEgZ2l2ZW4gc2RrIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSBzZGtMb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIFNESy4KLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBJU2RrTG9nIG9iamVjdCByZWNlaXZpbmcgd2FybmluZy9lcnJvciBmcm9tIHRoZSBwYXJzaW5nLgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIFNka01hbmFnZXJ9IG9yIG51bGwgaWYgdGhlIGxvY2F0aW9uIGlzIG5vdCB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNka01hbmFnZXIgY3JlYXRlTWFuYWdlcihTdHJpbmcgc2RrTG9jYXRpb24sIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZGtNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU2RrTWFuYWdlcihzZGtMb2NhdGlvbik7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8SUFuZHJvaWRUYXJnZXQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElBbmRyb2lkVGFyZ2V0PigpOwotICAgICAgICAgICAgbG9hZFBsYXRmb3JtcyhzZGtMb2NhdGlvbiwgbGlzdCwgbG9nKTsKLSAgICAgICAgICAgIGxvYWRBZGRPbnMoc2RrTG9jYXRpb24sIGxpc3QsIGxvZyk7Ci0KLSAgICAgICAgICAgIC8vIHNvcnQgdGhlIHRhcmdldHMvYWRkLW9ucwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKLQotICAgICAgICAgICAgbWFuYWdlci5zZXRUYXJnZXRzKGxpc3QudG9BcnJheShuZXcgSUFuZHJvaWRUYXJnZXRbbGlzdC5zaXplKCldKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUsICJFcnJvciBwYXJzaW5nIHRoZSBzZGsuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgU0RLLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2RrTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIFNESy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGFycmF5IGNhbiBiZSBlbXB0eSBidXQgbm90IG51bGwuCi0gICAgICovCi0gICAgcHVibGljIElBbmRyb2lkVGFyZ2V0W10gZ2V0VGFyZ2V0cygpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRhcmdldHMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTREsuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBhcnJheSBjYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUYXJnZXRzKElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cykgewotICAgICAgICBhc3NlcnQgdGFyZ2V0cyAhPSBudWxsOwotICAgICAgICBtVGFyZ2V0cyA9IHRhcmdldHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRhcmdldCBmcm9tIGEgaGFzaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkge0BsaW5rIElBbmRyb2lkVGFyZ2V0I2hhc2hTdHJpbmcoKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFzaCB0aGUge0BsaW5rIElBbmRyb2lkVGFyZ2V0fSBoYXNoIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIElBbmRyb2lkVGFyZ2V0IGdldFRhcmdldEZyb21IYXNoU3RyaW5nKFN0cmluZyBoYXNoKSB7Ci0gICAgICAgIGlmIChoYXNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0IDogbVRhcmdldHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzaC5lcXVhbHModGFyZ2V0Lmhhc2hTdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFkYiB3aXRoIHRoZSBVU0IgZGV2aWNlcyBkZWNsYXJlZCBpbiB0aGUgU0RLIGFkZC1vbnMuCi0gICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQWRiKCkgdGhyb3dzIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGFuZHJvaWQgcHJlZnMgbG9jYXRpb24gdG8ga25vdyB3aGVyZSB0byB3cml0ZSB0aGUgZmlsZS4KLSAgICAgICAgICAgIEZpbGUgYWRiSW5pID0gbmV3IEZpbGUoQW5kcm9pZExvY2F0aW9uLmdldEZvbGRlcigpLCBBREJfSU5JX0ZJTEUpOwotICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoYWRiSW5pKTsKLQotICAgICAgICAgICAgLy8gZmlyc3QsIHB1dCBhbGwgdGhlIHZlbmRvciBpZCBpbiBhbiBIYXNoU2V0IHRvIHJlbW92ZSBkdXBsaWNhdGUuCi0gICAgICAgICAgICBIYXNoU2V0PEludGVnZXI+IHNldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldFtdIHRhcmdldHMgPSBnZXRUYXJnZXRzKCk7Ci0gICAgICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IHRhcmdldHMpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmdldFVzYlZlbmRvcklkKCkgIT0gSUFuZHJvaWRUYXJnZXQuTk9fVVNCX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQodGFyZ2V0LmdldFVzYlZlbmRvcklkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZmlsZSBoZWFkZXIuCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoQURCX0lOSV9IRUFERVIpOwotCi0gICAgICAgICAgICAvLyBub3cgd3JpdGUgdGhlIElkIGluIGEgdGV4dCBmaWxlLCBvbmUgcGVyIGxpbmUuCi0gICAgICAgICAgICBmb3IgKEludGVnZXIgaSA6IHNldCkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcuZm9ybWF0KCIweCUwNHhcbiIsIGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkcyB0aGUgY29udGVudCBvZiB0aGUgU0RLLgotICAgICAqIEBwYXJhbSBsb2cgdGhlIElTZGtMb2cgb2JqZWN0IHJlY2VpdmluZyB3YXJuaW5nL2Vycm9yIGZyb20gdGhlIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsb2FkU2RrKElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgY3VycmVudCB0YXJnZXQgbGlzdC4KLSAgICAgICAgQXJyYXlMaXN0PElBbmRyb2lkVGFyZ2V0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQW5kcm9pZFRhcmdldD4oKTsKLSAgICAgICAgbG9hZFBsYXRmb3JtcyhtU2RrTG9jYXRpb24sIGxpc3QsIGxvZyk7Ci0gICAgICAgIGxvYWRBZGRPbnMobVNka0xvY2F0aW9uLCBsaXN0LCBsb2cpOwotCi0gICAgICAgIC8vIEZvciBub3cgcmVwbGFjZSB0aGUgb2xkIGxpc3Qgd2l0aCB0aGUgbmV3IG9uZS4KLSAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgd2FudCB0byBrZWVwIHRoZSBjdXJyZW50IG9iamVjdHMsIHNvIHRoYXQgQURUIGRvZXNuJ3QgaGF2ZSB0byBkZWFsCi0gICAgICAgIC8vIHdpdGggbmV3IElBbmRyb2lkVGFyZ2V0IG9iamVjdHMgd2hlbiBhIHRhcmdldCBkaWRuJ3QgYWN0dWFsbHkgY2hhbmdlLgotCi0gICAgICAgIC8vIHNvcnQgdGhlIHRhcmdldHMvYWRkLW9ucwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwotICAgICAgICBzZXRUYXJnZXRzKGxpc3QudG9BcnJheShuZXcgSUFuZHJvaWRUYXJnZXRbbGlzdC5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIFBsYXRmb3JtcyBmcm9tIHRoZSBTREsuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIG9mIHRoZSBTREsKLSAgICAgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBmaWxsIHdpdGggdGhlIHBsYXRmb3Jtcy4KLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBJU2RrTG9nIG9iamVjdCByZWNlaXZpbmcgd2FybmluZy9lcnJvciBmcm9tIHRoZSBwYXJzaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFBsYXRmb3JtcyhTdHJpbmcgbG9jYXRpb24sIEFycmF5TGlzdDxJQW5kcm9pZFRhcmdldD4gbGlzdCwKLSAgICAgICAgICAgIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIEZpbGUgcGxhdGZvcm1Gb2xkZXIgPSBuZXcgRmlsZShsb2NhdGlvbiwgU2RrQ29uc3RhbnRzLkZEX1BMQVRGT1JNUyk7Ci0gICAgICAgIGlmIChwbGF0Zm9ybUZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlW10gcGxhdGZvcm1zICA9IHBsYXRmb3JtRm9sZGVyLmxpc3RGaWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKEZpbGUgcGxhdGZvcm0gOiBwbGF0Zm9ybXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGxhdGZvcm0uaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRhcmdldCB0YXJnZXQgPSBsb2FkUGxhdGZvcm0ocGxhdGZvcm0sIGxvZyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoIklnbm9yaW5nIHBsYXRmb3JtICclMSRzJywgbm90IGEgZm9sZGVyLiIsIHBsYXRmb3JtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmIChwbGF0Zm9ybUZvbGRlci5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbWVzc2FnZSA9ICIlcyBpcyBtaXNzaW5nLiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gIiVzIGlzIG5vdCBhIGZvbGRlci4iOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgcGxhdGZvcm1Gb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhIHNwZWNpZmljIFBsYXRmb3JtIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHBsYXRmb3JtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICogQHBhcmFtIGxvZyB0aGUgSVNka0xvZyBvYmplY3QgcmVjZWl2aW5nIHdhcm5pbmcvZXJyb3IgZnJvbSB0aGUgcGFyc2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQbGF0Zm9ybVRhcmdldCBsb2FkUGxhdGZvcm0oRmlsZSBwbGF0Zm9ybSwgSVNka0xvZyBsb2cpIHsKLSAgICAgICAgRmlsZSBidWlsZFByb3AgPSBuZXcgRmlsZShwbGF0Zm9ybSwgU2RrQ29uc3RhbnRzLkZOX0JVSUxEX1BST1ApOwotCi0gICAgICAgIGlmIChidWlsZFByb3AuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gcGFyc2VQcm9wZXJ0eUZpbGUoYnVpbGRQcm9wLCBsb2cpOwotCi0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBzb21lIHNwZWNpZmljIHZhbHVlcyBpbiB0aGUgbWFwLgotCi0gICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBzdHJpbmcKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXBpTmFtZSA9IG1hcC5nZXQoUFJPUF9WRVJTSU9OX1JFTEVBU0UpOwotICAgICAgICAgICAgICAgIGlmIChhcGlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIHBsYXRmb3JtICclMSRzJzogJTIkcyBpcyBtaXNzaW5nIGZyb20gJyUzJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0uZ2V0TmFtZSgpLCBQUk9QX1ZFUlNJT05fUkVMRUFTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZOX0JVSUxEX1BST1ApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFwaSBsZXZlbAotICAgICAgICAgICAgICAgIGludCBhcGlOdW1iZXI7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gbWFwLmdldChQUk9QX1ZFUlNJT05fU0RLKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgcGxhdGZvcm0gJyUxJHMnOiAlMiRzIGlzIG1pc3NpbmcgZnJvbSAnJTMkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybS5nZXROYW1lKCksIFBST1BfVkVSU0lPTl9TREssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9CVUlMRF9QUk9QKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGFwaU51bWJlciA9IEludGVnZXIucGFyc2VJbnQoc3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBhcGlOdW1iZXIgZG9lcyBub3QgcGFyc2UgdG8gYSBudW1iZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcyBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIHBsYXRmb3JtICclMSRzJzogJTIkcyBpcyBub3QgYSB2YWxpZCBudW1iZXIgaW4gJTMkcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0uZ2V0TmFtZSgpLCBQUk9QX1ZFUlNJT05fU0RLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZOX0JVSUxEX1BST1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb2RlbmFtZSAob3B0aW9uYWwpCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFwaUNvZGVuYW1lID0gbWFwLmdldChQUk9QX1ZFUlNJT05fQ09ERU5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChhcGlDb2RlbmFtZSAhPSBudWxsICYmIGFwaUNvZGVuYW1lLmVxdWFscygiUkVMIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBpQ29kZW5hbWUgPSBudWxsOyAvLyBSRUwgbWVhbnMgaXQncyBhIHJlbGVhc2UgdmVyc2lvbiBhbmQgdGhlcmVmb3JlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVuYW1lIGlzIGlycmVsZXZhbnQgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmV2aXNpb24gPSAxOwotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBwcm9wZXJseSBwYXJzZSB0aGUgcGxhdGZvcm0gcmV2aXNpb24uCi0KLSAgICAgICAgICAgICAgICAvLyBhcGkgbnVtYmVyIGFuZCBuYW1lIGxvb2sgdmFsaWQsIHBlcmZvcm0gYSBmZXcgbW9yZSBjaGVja3MKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tQbGF0Zm9ybUNvbnRlbnQocGxhdGZvcm0sIGxvZykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdGFyZ2V0LgotICAgICAgICAgICAgICAgIFBsYXRmb3JtVGFyZ2V0IHRhcmdldCA9IG5ldyBQbGF0Zm9ybVRhcmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBpTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBpQ29kZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcGlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24pOwotCi0gICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwYXJzZSB0aGUgc2tpbnMuCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2tpbnMgPSBwYXJzZVNraW5Gb2xkZXIodGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuU0tJTlMpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0U2tpbnMoc2tpbnMpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsICJJZ25vcmluZyBwbGF0Zm9ybSAnJTEkcyc6ICUyJHMgaXMgbWlzc2luZy4iLCBwbGF0Zm9ybS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9CVUlMRF9QUk9QKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBBZGQtb24gZnJvbSB0aGUgU0RLLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiBvZiB0aGUgU0RLCi0gICAgICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gZmlsbCB3aXRoIHRoZSBhZGQtb25zLgotICAgICAqIEBwYXJhbSBsb2cgdGhlIElTZGtMb2cgb2JqZWN0IHJlY2VpdmluZyB3YXJuaW5nL2Vycm9yIGZyb20gdGhlIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQWRkT25zKFN0cmluZyBsb2NhdGlvbiwgQXJyYXlMaXN0PElBbmRyb2lkVGFyZ2V0PiBsaXN0LCBJU2RrTG9nIGxvZykgewotICAgICAgICBGaWxlIGFkZG9uRm9sZGVyID0gbmV3IEZpbGUobG9jYXRpb24sIFNka0NvbnN0YW50cy5GRF9BRERPTlMpOwotICAgICAgICBpZiAoYWRkb25Gb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIGFkZG9ucyAgPSBhZGRvbkZvbGRlci5saXN0RmlsZXMoKTsKLQotICAgICAgICAgICAgZm9yIChGaWxlIGFkZG9uIDogYWRkb25zKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkLW9ucyBoYXZlIHRvIGJlIGZvbGRlcnMuIElnbm9yZSBmaWxlcyBhbmQgbm8gbmVlZCB0byB3YXJuIGFib3V0IHRoZW0uCi0gICAgICAgICAgICAgICAgaWYgKGFkZG9uLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkT25UYXJnZXQgdGFyZ2V0ID0gbG9hZEFkZG9uKGFkZG9uLCBsaXN0LCBsb2cpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKGFkZG9uRm9sZGVyLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gIiVzIGlzIG1pc3NpbmcuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAiJXMgaXMgbm90IGEgZm9sZGVyLiI7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQobWVzc2FnZSwKLSAgICAgICAgICAgICAgICBhZGRvbkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgc3BlY2lmaWMgQWRkLW9uIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCi0gICAgICogQHBhcmFtIGFkZG9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgYWRkb24uCi0gICAgICogQHBhcmFtIHRhcmdldExpc3QgVGhlIGxpc3Qgb2YgQW5kcm9pZCB0YXJnZXQgdGhhdCB3ZXJlIGFscmVhZHkgbG9hZGVkIGZyb20gdGhlIFNESy4KLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBJU2RrTG9nIG9iamVjdCByZWNlaXZpbmcgd2FybmluZy9lcnJvciBmcm9tIHRoZSBwYXJzaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFkZE9uVGFyZ2V0IGxvYWRBZGRvbihGaWxlIGFkZG9uLCBBcnJheUxpc3Q8SUFuZHJvaWRUYXJnZXQ+IHRhcmdldExpc3QsCi0gICAgICAgICAgICBJU2RrTG9nIGxvZykgewotICAgICAgICBGaWxlIGFkZE9uTWFuaWZlc3QgPSBuZXcgRmlsZShhZGRvbiwgU2RrQ29uc3RhbnRzLkZOX01BTklGRVNUX0lOSSk7Ci0KLSAgICAgICAgaWYgKGFkZE9uTWFuaWZlc3QuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXAgPSBwYXJzZVByb3BlcnR5RmlsZShhZGRPbk1hbmlmZXN0LCBsb2cpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHNvbWUgc3BlY2lmaWMgdmFsdWVzIGluIHRoZSBtYXAuCi0gICAgICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSBuYW1lLCB2ZW5kb3IsIGFuZCBhcGkKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHByb3BlcnR5TWFwLmdldChBRERPTl9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBZGRvbk1hbmlmZXN0RXJyb3IobG9nLCBhZGRvbi5nZXROYW1lKCksIEFERE9OX05BTUUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVuZG9yID0gcHJvcGVydHlNYXAuZ2V0KEFERE9OX1ZFTkRPUik7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbmRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBZGRvbk1hbmlmZXN0RXJyb3IobG9nLCBhZGRvbi5nZXROYW1lKCksIEFERE9OX1ZFTkRPUik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBhcGkgPSBwcm9wZXJ0eU1hcC5nZXQoQURET05fQVBJKTsKLSAgICAgICAgICAgICAgICBQbGF0Zm9ybVRhcmdldCBiYXNlVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoYXBpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheUFkZG9uTWFuaWZlc3RFcnJvcihsb2csIGFkZG9uLmdldE5hbWUoKSwgQURET05fQVBJKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwbGF0Zm9ybSB0aGF0IGhhcyBhIG1hdGNoaW5nIGFwaSBsZXZlbCBvciBjb2RlbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiB0YXJnZXRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGxhdGZvcm0oKSAmJiB0YXJnZXQuZ2V0VmVyc2lvbigpLmVxdWFscyhhcGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVRhcmdldCA9IChQbGF0Zm9ybVRhcmdldCl0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcyBhZGQtb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBhZGQtb24gJyUxJHMnOiBVbmFibGUgdG8gZmluZCBiYXNlIHBsYXRmb3JtIHdpdGggQVBJIGxldmVsICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRvbi5nZXROYW1lKCksIGFwaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eU1hcC5nZXQoQURET05fREVTQ1JJUFRJT04pOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhZGQtb24gcmV2aXNpb24KLSAgICAgICAgICAgICAgICBpbnQgcmV2aXNpb25WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJldmlzaW9uID0gcHJvcGVydHlNYXAuZ2V0KEFERE9OX1JFVklTSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAocmV2aXNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9IHByb3BlcnR5TWFwLmdldChBRERPTl9SRVZJU0lPTl9PTEQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmV2aXNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25WYWx1ZSA9IEludGVnZXIucGFyc2VJbnQocmV2aXNpb24pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBhcGlOdW1iZXIgZG9lcyBub3QgcGFyc2UgdG8gYSBudW1iZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcyBhZGQtb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBhZGQtb24gJyUxJHMnOiAlMiRzIGlzIG5vdCBhIHZhbGlkIG51bWJlciBpbiAlMyRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRvbi5nZXROYW1lKCksIEFERE9OX1JFVklTSU9OLCBTZGtDb25zdGFudHMuRk5fQlVJTERfUFJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb3B0aW9uYWwgbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxpYnJhcmllc1ZhbHVlID0gcHJvcGVydHlNYXAuZ2V0KEFERE9OX0xJQlJBUklFUyk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGxpYk1hcCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGlicmFyaWVzVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXNWYWx1ZSA9IGxpYnJhcmllc1ZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpYnJhcmllc1ZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW4gdGhlIHN0cmluZyBpbnRvIHRoZSBsaWJyYXJpZXMgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbGlicmFyaWVzID0gbGlicmFyaWVzVmFsdWUuc3BsaXQoIjsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaWJyYXJpZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGliTmFtZSA6IGxpYnJhcmllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJOYW1lID0gbGliTmFtZS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaWJyYXJ5IGRhdGEgZnJvbSB0aGUgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGliRGF0YSA9IHByb3BlcnR5TWFwLmdldChsaWJOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGliRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgamFyIGZpbGUgZnJvbSB0aGUgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBBVFRFUk5fTElCX0RBVEEubWF0Y2hlcihsaWJEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYk1hcC5wdXQobGliTmFtZSwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgbGlicmFyeSAnJTEkcycsIHByb3BlcnR5IHZhbHVlIGhhcyB3cm9uZyBmb3JtYXRcblx0JTIkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJOYW1lLCBsaWJEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBsaWJyYXJ5ICclMSRzJywgbWlzc2luZyBwcm9wZXJ0eSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYk5hbWUsIGxpYkRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQWRkT25UYXJnZXQgdGFyZ2V0ID0gbmV3IEFkZE9uVGFyZ2V0KGFkZG9uLmdldEFic29sdXRlUGF0aCgpLCBuYW1lLCB2ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvblZhbHVlLCBkZXNjcmlwdGlvbiwgbGliTWFwLCBiYXNlVGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcGFyc2UgdGhlIHNraW5zLgotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNraW5zID0gcGFyc2VTa2luRm9sZGVyKHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlNLSU5TKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRlZmF1bHQgc2tpbiwgb3IgdGFrZSBpdCBmcm9tIHRoZSBiYXNlIHBsYXRmb3JtIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFNraW4gPSBwcm9wZXJ0eU1hcC5nZXQoQURET05fREVGQVVMVF9TS0lOKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNraW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbnMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTa2luID0gc2tpbnNbMF07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2tpbiA9IGJhc2VUYXJnZXQuZ2V0RGVmYXVsdFNraW4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgVVNCIElEIChpZiBhdmFpbGFibGUpCi0gICAgICAgICAgICAgICAgaW50IHVzYlZlbmRvcklkID0gY29udmVydElkKHByb3BlcnR5TWFwLmdldChBRERPTl9VU0JfVkVORE9SKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzYlZlbmRvcklkICE9IElBbmRyb2lkVGFyZ2V0Lk5PX1VTQl9JRCkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VXNiVmVuZG9ySWQodXNiVmVuZG9ySWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTa2lucyhza2lucywgZGVmYXVsdFNraW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsICJJZ25vcmluZyBhZGQtb24gJyUxJHMnOiAlMiRzIGlzIG1pc3NpbmcuIiwgYWRkb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRk5fTUFOSUZFU1RfSU5JKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGhleGFkZWNpbWFsIElEIGludG8gYW4gaW50LgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHRvIGNvbnZlcnQuCi0gICAgICogQHJldHVybiB0aGUgaW50IHZhbHVlLCBvciB7QGxpbmsgSUFuZHJvaWRUYXJnZXQjTk9fVVNCX0lEfSBpZiB0aGUgY29udmVydGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbnZlcnRJZChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoUEFUVEVSTl9VU0JfSURTLm1hdGNoZXIodmFsdWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHYsIDE2KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2UgY2hlY2sgdGhlIHBhdHRlcm4gYWJvdmUsIGJ1dCB0aGlzIGlzIHNhZmVyLgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIDAgYmVsb3cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElBbmRyb2lkVGFyZ2V0Lk5PX1VTQl9JRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc3BsYXlBZGRvbk1hbmlmZXN0RXJyb3IoSVNka0xvZyBsb2csIFN0cmluZyBhZGRvbk5hbWUsIFN0cmluZyB2YWx1ZU5hbWUpIHsKLSAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwgIklnbm9yaW5nIGFkZC1vbiAnJTEkcyc6ICclMiRzJyBpcyBtaXNzaW5nIGZyb20gJTMkcy4iLAotICAgICAgICAgICAgICAgICAgICBhZGRvbk5hbWUsIHZhbHVlTmFtZSwgU2RrQ29uc3RhbnRzLkZOX01BTklGRVNUX0lOSSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIGdpdmVuIHBsYXRmb3JtIGhhcyBhbGwgdGhlIHJlcXVpcmVkIGZpbGVzLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgYXJlIGFsbAotICAgICAqIHByZXNlbnQuCi0gICAgICogPHAvPlRoaXMgY2hlY2tzIHRoZSBwcmVzZW5jZSBvZiB0aGUgZm9sbG93aW5nIGZpbGVzOiBhbmRyb2lkLmphciwgZnJhbWV3b3JrLmFpZGwsIGFhcHQoLmV4ZSksCi0gICAgICogYWlkbCguZXhlKSwgZHgoLmJhdCksIGFuZCBkeC5qYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUGxhdGZvcm1Db250ZW50KEZpbGUgcGxhdGZvcm0sIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHJlbGF0aXZlUGF0aCA6IHNQbGF0Zm9ybUNvbnRlbnRMaXN0KSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwbGF0Zm9ybSwgcmVsYXRpdmVQYXRoKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgcGxhdGZvcm0gJyUxJHMnOiAlMiRzIGlzIG1pc3NpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLmdldE5hbWUoKSwgcmVsYXRpdmVQYXRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBwcm9wZXJ0eSBmaWxlICh1c2luZyBVVEYtOCBlbmNvZGluZykgYW5kIHJldHVybnMKLSAgICAgKiBAcGFyYW0gYnVpbGRQcm9wIHRoZSBwcm9wZXJ0eSBmaWxlIHRvIHBhcnNlCi0gICAgICogQHBhcmFtIGxvZyB0aGUgSVNka0xvZyBvYmplY3QgcmVjZWl2aW5nIHdhcm5pbmcvZXJyb3IgZnJvbSB0aGUgcGFyc2luZy4KLSAgICAgKiBAcmV0dXJuIHRoZSBtYXAgb2YgKGtleSx2YWx1ZSkgcGFpcnMsIG9yIG51bGwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJzZVByb3BlcnR5RmlsZShGaWxlIGJ1aWxkUHJvcCwgSVNka0xvZyBsb2cpIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJ1aWxkUHJvcCk7Ci0gICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgU2RrQ29uc3RhbnRzLklOSV9DSEFSU0VUKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCAmJiBsaW5lLmNoYXJBdCgwKSAhPSAnIycpIHsKLQotICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBQQVRURVJOX1BST1AubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoIkVycm9yIHBhcnNpbmcgJyUxJHMnOiBcIiUyJHNcIiBpcyBub3QgYSB2YWxpZCBzeW50YXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRQcm9wLmdldEFic29sdXRlUGF0aCgpLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSB1c3VhbGx5IHRlc3QgdGhlIGZpbGUgZXhpc3RlbmNlIGJlZm9yZQotICAgICAgICAgICAgLy8gY2FsbGluZyB0aGUgbWV0aG9kLgotICAgICAgICAgICAgLy8gUmV0dXJuIG51bGwgYmVsb3cuCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCJFcnJvciBwYXJzaW5nICclMSRzJzogJTIkcy4iLCBidWlsZFByb3AuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHNraW4gZm9sZGVyIGFuZCBidWlsZHMgdGhlIHNraW4gbGlzdC4KLSAgICAgKiBAcGFyYW0gb3NQYXRoIFRoZSBwYXRoIG9mIHRoZSBza2luIHJvb3QgZm9sZGVyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHBhcnNlU2tpbkZvbGRlcihTdHJpbmcgb3NQYXRoKSB7Ci0gICAgICAgIEZpbGUgc2tpblJvb3RGb2xkZXIgPSBuZXcgRmlsZShvc1BhdGgpOwotCi0gICAgICAgIGlmIChza2luUm9vdEZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBza2luTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBza2luUm9vdEZvbGRlci5saXN0RmlsZXMoKTsKLQotICAgICAgICAgICAgZm9yIChGaWxlIHNraW5Gb2xkZXIgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIGlmIChza2luRm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGxheW91dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgbGF5b3V0ID0gbmV3IEZpbGUoc2tpbkZvbGRlciwgU2RrQ29uc3RhbnRzLkZOX1NLSU5fTEFZT1VUKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0LmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IHdlIGRvbid0IHBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBsYXlvdXQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbHkgYWRkIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICBza2luTGlzdC5hZGQoc2tpbkZvbGRlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2tpbkxpc3QudG9BcnJheShuZXcgU3RyaW5nW3NraW5MaXN0LnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL2F2ZC9BdmRNYW5hZ2VyLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvYXZkL0F2ZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiM2I3Zi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvYXZkL0F2ZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvLkF2ZFN0YXR1czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgTWFuYWdlciB0byBtYW5hZ2UgQVZEcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEF2ZE1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogRXhjZXB0aW9uIHRocm93biB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGEgdGFyZ2V0IHBhdGguCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgSW52YWxpZFRhcmdldFBhdGhFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBJbnZhbGlkVGFyZ2V0UGF0aEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVkRfRk9MREVSX0VYVEVOU0lPTiA9ICIuYXZkIjsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFWRF9JTkZPX1BBVEggPSAicGF0aCI7ICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFWRF9JTkZPX1RBUkdFVCA9ICJ0YXJnZXQiOyAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogQVZEL2NvbmZpZy5pbmkga2V5IG5hbWUgcmVwcmVzZW50aW5nIHRoZSBTREstcmVsYXRpdmUgcGF0aCBvZiB0aGUgc2tpbiBmb2xkZXIsIGlmIGFueSwKLSAgICAgKiBvciBhIDMyMHg0ODAgbGlrZSBjb25zdGFudCBmb3IgYSBudW1lcmljIHNraW4gc2l6ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI05VTUVSSUNfU0tJTl9TSVpFCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVZEX0lOSV9TS0lOX1BBVEggPSAic2tpbi5wYXRoIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIEFWRC9jb25maWcuaW5pIGtleSBuYW1lIHJlcHJlc2VudGluZyBhbiBVSSBuYW1lIGZvciB0aGUgc2tpbi4KLSAgICAgKiBUaGlzIGNvbmZpZyBrZXkgaXMgaWdub3JlZCBieSB0aGUgZW11bGF0b3IuIEl0IGlzIG9ubHkgdXNlZCBieSB0aGUgU0RLIG1hbmFnZXIgb3IKLSAgICAgKiB0b29scyB0byBnaXZlIGEgZnJpZW5kbGllciBuYW1lIHRvIHRoZSBza2luLgotICAgICAqIElmIG1pc3NpbmcsIHVzZSB0aGUge0BsaW5rICNBVkRfSU5JX1NLSU5fUEFUSH0ga2V5IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVZEX0lOSV9TS0lOX05BTUUgPSAic2tpbi5uYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIEFWRC9jb25maWcuaW5pIGtleSBuYW1lIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgc2RjYXJkIGZpbGUuCi0gICAgICogSWYgbWlzc2luZywgdGhlIGRlZmF1bHQgbmFtZSAic2RjYXJkLmltZyIgd2lsbCBiZSB1c2VkIGZvciB0aGUgc2RjYXJkLCBpZiB0aGVyZSdzIHN1Y2gKLSAgICAgKiBhIGZpbGUuCi0gICAgICoKLSAgICAgKiBAc2VlICNTRENBUkRfSU1HCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVZEX0lOSV9TRENBUkRfUEFUSCA9ICJzZGNhcmQucGF0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBBVkQvY29uZmlnLmluaSBrZXkgbmFtZSByZXByZXNlbnRpbmcgdGhlIHNpemUgb2YgdGhlIFNEIGNhcmQuCi0gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBmb3IgVUkgcHVycG9zZXMgb25seS4gSXQgaXMgbm90IHVzZWQgYnkgdGhlIGVtdWxhdG9yLgotICAgICAqCi0gICAgICogQHNlZSAjU0RDQVJEX1NJWkVfUEFUVEVSTgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFWRF9JTklfU0RDQVJEX1NJWkUgPSAic2RjYXJkLnNpemUiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogQVZEL2NvbmZpZy5pbmkga2V5IG5hbWUgcmVwcmVzZW50aW5nIHRoZSBmaXJzdCBwYXRoIHdoZXJlIHRoZSBlbXVsYXRvciBsb29rcwotICAgICAqIGZvciBzeXN0ZW0gaW1hZ2VzLiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgYWRkLW9uIHN5c3RlbSBpbWFnZSBvcgotICAgICAqIHRoZSBwYXRoIHRvIHRoZSBwbGF0Zm9ybSBzeXN0ZW0gaW1hZ2UgaWYgdGhlcmUncyBubyBhZGQtb24uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBlbXVsYXRvciBsb29rcyBhdCB7QGxpbmsgI0FWRF9JTklfSU1BR0VTXzF9IGJlZm9yZSB7QGxpbmsgI0FWRF9JTklfSU1BR0VTXzJ9LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFWRF9JTklfSU1BR0VTXzEgPSAiaW1hZ2Uuc3lzZGlyLjEiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogQVZEL2NvbmZpZy5pbmkga2V5IG5hbWUgcmVwcmVzZW50aW5nIHRoZSBzZWNvbmQgcGF0aCB3aGVyZSB0aGUgZW11bGF0b3IgbG9va3MKLSAgICAgKiBmb3Igc3lzdGVtIGltYWdlcy4gVHlwaWNhbGx5IHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIHBsYXRmb3JtIHN5c3RlbSBpbWFnZS4KLSAgICAgKgotICAgICAqIEBzZWUgI0FWRF9JTklfSU1BR0VTXzEKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVkRfSU5JX0lNQUdFU18yID0gImltYWdlLnN5c2Rpci4yIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUGF0dGVybiB0byBtYXRjaCBwaXhlbC1zaXplZCBza2luICJuYW1lcyIsIGUuZy4gIjMyMHg0ODAiLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBOVU1FUklDX1NLSU5fU0laRSA9IFBhdHRlcm4uY29tcGlsZSgiKFswLTldezIsfSl4KFswLTldezIsfSkiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRVJEQVRBX0lNRyA9ICJ1c2VyZGF0YS5pbWciOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkZJR19JTkkgPSAiY29uZmlnLmluaSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0RDQVJEX0lNRyA9ICJzZGNhcmQuaW1nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElOSV9FWFRFTlNJT04gPSAiLmluaSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIElOSV9OQU1FX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKylcXCIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJTklfRVhURU5TSU9OICsgIiQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFBhdHRlcm4gSU1BR0VfTkFNRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoLispXFwuaW1nJCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXR0ZXJuIGZvciBtYXRjaGluZyBTRCBDYXJkIHNpemVzLCBlLmcuICI0SyIgb3IgIjE2TSIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFNEQ0FSRF9TSVpFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcZCtbTUtdIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBSZWdleCB1c2VkIHRvIHZhbGlkYXRlIGNoYXJhY3RlcnMgdGhhdCBjb21wb3NlIGFuIEFWRCBuYW1lLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBSRV9BVkRfTkFNRSA9IFBhdHRlcm4uY29tcGlsZSgiW2EtekEtWjAtOS5fLV0rIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBMaXN0IG9mIHZhbGlkIGNoYXJhY3RlcnMgZm9yIGFuIEFWRCBuYW1lLiBVc2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLiAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIQVJTX0FWRF9OQU1FID0gImEteiBBLVogMC05IC4gXyAtIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEFSRFdBUkVfSU5JID0gImhhcmR3YXJlLmluaSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiBBbiBpbW11dGFibGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gQW5kcm9pZCBWaXJ0dWFsIERldmljZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEF2ZEluZm8gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGF0dXMgZm9yIGFuIHtAbGluayBBdmRJbmZvfS4gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgQVZEIGlzIHZhbGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBlbnVtIEF2ZFN0YXR1cyB7Ci0gICAgICAgICAgICAvKiogTm8gZXJyb3IgKi8KLSAgICAgICAgICAgIE9LLAotICAgICAgICAgICAgLyoqIE1pc3NpbmcgJ3BhdGgnIHByb3BlcnR5IGluIHRoZSBpbmkgZmlsZSAqLwotICAgICAgICAgICAgRVJST1JfUEFUSCwKLSAgICAgICAgICAgIC8qKiBNaXNzaW5nIGNvbmZpZy5pbmkgZmlsZSBpbiB0aGUgQVZEIGRhdGEgZm9sZGVyICovCi0gICAgICAgICAgICBFUlJPUl9DT05GSUcsCi0gICAgICAgICAgICAvKiogTWlzc2luZyAndGFyZ2V0JyBwcm9wZXJ0eSBpbiB0aGUgaW5pIGZpbGUgKi8KLSAgICAgICAgICAgIEVSUk9SX1RBUkdFVF9IQVNILAotICAgICAgICAgICAgLyoqIFRhcmdldCB3YXMgbm90IHJlc29sdmVkIGZyb20gaXRzIGhhc2ggKi8KLSAgICAgICAgICAgIEVSUk9SX1RBUkdFVCwKLSAgICAgICAgICAgIC8qKiBVbmFibGUgdG8gcGFyc2UgY29uZmlnLmluaSAqLwotICAgICAgICAgICAgRVJST1JfUFJPUEVSVElFUywKLSAgICAgICAgICAgIC8qKiBTeXN0ZW0gSW1hZ2UgZm9sZGVyIGluIGNvbmZpZy5pbmkgZG9lc24ndCBleGlzdCAqLwotICAgICAgICAgICAgRVJST1JfSU1BR0VfRElSOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVGFyZ2V0SGFzaDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQW5kcm9pZFRhcmdldCBtVGFyZ2V0OwotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVByb3BlcnRpZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXZkU3RhdHVzIG1TdGF0dXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgdmFsaWQgQVZEIGluZm8uIFZhbHVlcyBhcmUgaW1tdXRhYmxlLgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFN1Y2ggYW4gQVZEIGlzIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHVzZWQuCi0gICAgICAgICAqIFRoZSBlcnJvciBzdHJpbmcgaXMgc2V0IHRvIG51bGwuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBBVkQgKGZvciBkaXNwbGF5IG9yIHJlZmVyZW5jZSkKLSAgICAgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGNvbmZpZy5pbmkgZmlsZQotICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0SGFzaCB0aGUgdGFyZ2V0IGhhc2gKLSAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0LiBDYW4gYmUgbnVsbCwgaWYgdGhlIHRhcmdldCB3YXMgbm90IHJlc29sdmVkLgotICAgICAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydHkgbWFwLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBdmRJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHRhcmdldEhhc2gsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIHRoaXMobmFtZSwgcGF0aCwgdGFyZ2V0SGFzaCwgdGFyZ2V0LCBwcm9wZXJ0aWVzLCBBdmRTdGF0dXMuT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgPGVtPmludmFsaWQ8L2VtPiBBVkQgaW5mby4gVmFsdWVzIGFyZSBpbW11dGFibGUuCi0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogU3VjaCBhbiBBVkQgaXMgbm90IGNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgdXNlZC4KLSAgICAgICAgICogVGhlIGVycm9yIHN0cmluZyBtdXN0IGJlIG5vbi1udWxsLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgQVZEIChmb3IgZGlzcGxheSBvciByZWZlcmVuY2UpCi0gICAgICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBjb25maWcuaW5pIGZpbGUKLSAgICAgICAgICogQHBhcmFtIHRhcmdldEhhc2ggdGhlIHRhcmdldCBoYXNoCi0gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldC4gQ2FuIGJlIG51bGwsIGlmIHRoZSB0YXJnZXQgd2FzIG5vdCByZXNvbHZlZC4KLSAgICAgICAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnR5IG1hcC4gQ2FuIGJlIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIHtAbGluayBBdmRTdGF0dXN9IG9mIHRoaXMgQVZELiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBdmRJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHRhcmdldEhhc2gsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMsIEF2ZFN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIG1QYXRoID0gcGF0aDsKLSAgICAgICAgICAgIG1UYXJnZXRIYXNoID0gdGFyZ2V0SGFzaDsKLSAgICAgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICBtUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPT0gbnVsbCA/IG51bGwgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIEFWRC4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIEFWRCBkYXRhIGRpcmVjdG9yeS4gKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXRoOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBoYXNoIHN0cmluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0SGFzaCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0SGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSB0YXJnZXQgb2YgdGhlIEFWRCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdCBiZWVuIHJlc29sdmVkLiAqLwotICAgICAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0VGFyZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJucyB0aGUge0BsaW5rIEF2ZFN0YXR1c30gb2YgdGhlIHJlY2VpdmVyLiAqLwotICAgICAgICBwdWJsaWMgQXZkU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhlbHBlciBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSAuaW5pIHtAbGluayBGaWxlfSBmb3IgYSBnaXZlbiBBVkQgbmFtZS4KLSAgICAgICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlcmUncyBhIHByb2JsZW0gZ2V0dGluZyBhbmRyb2lkIHJvb3QgZGlyZWN0b3J5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldEluaUZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIGF2ZFJvb3Q7Ci0gICAgICAgICAgICBhdmRSb290ID0gQW5kcm9pZExvY2F0aW9uLmdldEZvbGRlcigpICsgQW5kcm9pZExvY2F0aW9uLkZPTERFUl9BVkQ7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoYXZkUm9vdCwgbmFtZSArIElOSV9FWFRFTlNJT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIC5pbmkge0BsaW5rIEZpbGV9IGZvciB0aGlzIEFWRC4KLSAgICAgICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlcmUncyBhIHByb2JsZW0gZ2V0dGluZyBhbmRyb2lkIHJvb3QgZGlyZWN0b3J5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0SW5pRmlsZSgpIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGdldEluaUZpbGUobU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhlbHBlciBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBDb25maWcge0BsaW5rIEZpbGV9IGZvciBhIGdpdmVuIEFWRCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENvbmZpZ0ZpbGUoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoLCBDT05GSUdfSU5JKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBDb25maWcge0BsaW5rIEZpbGV9IGZvciB0aGlzIEFWRC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ0ZpbGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnRmlsZShtUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIHByb3BlcnRpZXMgZm9yIHRoZSBBVkQuIFRoaXMgY2FuIGJlIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0aWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBBVkQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYge0BsaW5rICNnZXRTdGF0dXMoKX0KLSAgICAgICAgICogcmV0dXJucyB7QGxpbmsgQXZkU3RhdHVzI09LfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX1BBVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiTWlzc2luZyBBVkQgJ3BhdGgnIHByb3BlcnR5IGluICUxJHMiLCBnZXRJbmlGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX0NPTkZJRzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJNaXNzaW5nIGNvbmZpZy5pbmkgZmlsZSBpbiAlMSRzIiwgbVBhdGgpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX1RBUkdFVF9IQVNIOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIk1pc3NpbmcgJ3RhcmdldCcgcHJvcGVydHkgaW4gJTEkcyIsIGdldEluaUZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVJST1JfVEFSR0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlVua25vd24gdGFyZ2V0ICclMSRzJyBpbiAlMiRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldEhhc2gsIGdldEluaUZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVJST1JfUFJPUEVSVElFUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcGFyc2UgcHJvcGVydGllcyBmcm9tICUxJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWdGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUk9SX0lNQUdFX0RJUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBpbiBpbWFnZS5zeXNkaXIuIFJ1biAnYW5kcm9pZCB1cGRhdGUgYXZkIC1uICUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9LOgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVuYWJsZSB0byBnZXQgSE9NRSBmb2xkZXIuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxBdmRJbmZvPiBtQWxsQXZkTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXZkSW5mbz4oKTsKLSAgICBwcml2YXRlIEF2ZEluZm9bXSBtVmFsaWRBdmRMaXN0OwotICAgIHByaXZhdGUgQXZkSW5mb1tdIG1Ccm9rZW5BdmRMaXN0OwotICAgIHByaXZhdGUgZmluYWwgU2RrTWFuYWdlciBtU2RrTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gQVZEIE1hbmFnZXIgZm9yIGEgZ2l2ZW4gU0RLIHJlcHJlc2VudGVkIGJ5IGEge0BsaW5rIFNka01hbmFnZXJ9LgotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIFRoZSBTREsuCi0gICAgICogQHBhcmFtIGxvZyBUaGUgbG9nIG9iamVjdCB0byByZWNlaXZlIHRoZSBsb2cgb2YgdGhlIGluaXRpYWwgbG9hZGluZyBvZiB0aGUgQVZEcy4KLSAgICAgKiAgICAgICAgICAgIFRoaXMgbG9nIG9iamVjdCBpcyBub3Qga2VwdCBieSB0aGlzIGluc3RhbmNlIG9mIEF2ZE1hbmFnZXIgYW5kIGVhY2gKLSAgICAgKiAgICAgICAgICAgIG1ldGhvZCB0YWtlcyBpdHMgb3duIGxvZ2dlci4gVGhlIHJhdGlvbmFsZSBpcyB0aGF0IHRoZSBBdmRNYW5hZ2VyCi0gICAgICogICAgICAgICAgICBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIHZhcmlldHkgb2YgY29udGV4dCwgZWFjaCB3aXRoIGRpZmZlcmVudAotICAgICAqICAgICAgICAgICAgbG9nZ2luZyBuZWVkcy4KLSAgICAgKiBAdGhyb3dzIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBdmRNYW5hZ2VyKFNka01hbmFnZXIgc2RrTWFuYWdlciwgSVNka0xvZyBsb2cpIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICBtU2RrTWFuYWdlciA9IHNka01hbmFnZXI7Ci0gICAgICAgIGJ1aWxkQXZkTGlzdChtQWxsQXZkTGlzdCwgbG9nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2RrTWFuYWdlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQXZkTWFuYWdlcn0uCi0gICAgICovCi0gICAgcHVibGljIFNka01hbmFnZXIgZ2V0U2RrTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZGtNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBleGlzdGluZyBBVkRzLgotICAgICAqIEByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIEFWRHMuCi0gICAgICovCi0gICAgcHVibGljIEF2ZEluZm9bXSBnZXRBbGxBdmRzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFsbEF2ZExpc3QudG9BcnJheShuZXcgQXZkSW5mb1ttQWxsQXZkTGlzdC5zaXplKCldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSB2YWxpZCBBVkRzLgotICAgICAqIEByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgY29udGFpbmluZyBhbGwgdmFsaWQgdGhlIEFWRHMuCi0gICAgICovCi0gICAgcHVibGljIEF2ZEluZm9bXSBnZXRWYWxpZEF2ZHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUFsbEF2ZExpc3QpIHsKLSAgICAgICAgICAgIGlmIChtVmFsaWRBdmRMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QXZkSW5mbz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QXZkSW5mbz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEF2ZEluZm8gYXZkIDogbUFsbEF2ZExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2ZC5nZXRTdGF0dXMoKSA9PSBBdmRTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGF2ZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVmFsaWRBdmRMaXN0ID0gbGlzdC50b0FycmF5KG5ldyBBdmRJbmZvW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVZhbGlkQXZkTGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBicm9rZW4gQVZEcy4KLSAgICAgKiBAcmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBicm9rZW4gQVZEcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXZkSW5mb1tdIGdldEJyb2tlbkF2ZHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUFsbEF2ZExpc3QpIHsKLSAgICAgICAgICAgIGlmIChtQnJva2VuQXZkTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEF2ZEluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEF2ZEluZm8+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBdmRJbmZvIGF2ZCA6IG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdmQuZ2V0U3RhdHVzKCkgIT0gQXZkU3RhdHVzLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChhdmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Ccm9rZW5BdmRMaXN0ID0gbGlzdC50b0FycmF5KG5ldyBBdmRJbmZvW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUJyb2tlbkF2ZExpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQXZkSW5mb30gbWF0Y2hpbmcgdGhlIGdpdmVuIDx2YXI+bmFtZTwvdmFyPi4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgQVZEIHRvIHJldHVybgotICAgICAqIEBwYXJhbSB2YWxpZEF2ZE9ubHkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG9ubHkgbG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHZhbGlkIEFWRHMuCi0gICAgICogQHJldHVybiB0aGUgbWF0Y2hpbmcgQXZkSW5mbyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdlcmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEF2ZEluZm8gZ2V0QXZkKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbGlkQXZkT25seSkgewotICAgICAgICBpZiAodmFsaWRBdmRPbmx5KSB7Ci0gICAgICAgICAgICBmb3IgKEF2ZEluZm8gaW5mbyA6IGdldFZhbGlkQXZkcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChBdmRJbmZvIGluZm8gOiBtQWxsQXZkTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbG9hZHMgdGhlIEFWRCBsaXN0LgotICAgICAqIEBwYXJhbSBsb2cgdGhlIGxvZyBvYmplY3QgdG8gcmVjZWl2ZSBhY3Rpb24gbG9ncy4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGZpbmRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAqIEFWRCBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsb2FkQXZkcyhJU2RrTG9nIGxvZykgdGhyb3dzIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IGluIGEgdGVtcCBsaXN0IGZpcnN0LCBpbiBjYXNlIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgLy8gSXQncyBiZXR0ZXIgdGhhbiBkZWxldGluZyB0aGUgd2hvbGUgbGlzdCBiZWZvcmUgcmVhZGluZyB0aGUgbmV3IG9uZS4KLSAgICAgICAgQXJyYXlMaXN0PEF2ZEluZm8+IGFsbExpc3QgPSBuZXcgQXJyYXlMaXN0PEF2ZEluZm8+KCk7Ci0gICAgICAgIGJ1aWxkQXZkTGlzdChhbGxMaXN0LCBsb2cpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUFsbEF2ZExpc3QpIHsKLSAgICAgICAgICAgIG1BbGxBdmRMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtQWxsQXZkTGlzdC5hZGRBbGwoYWxsTGlzdCk7Ci0gICAgICAgICAgICBtVmFsaWRBdmRMaXN0ID0gbUJyb2tlbkF2ZExpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBVkQuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgQVZEIHdpdGggdGhpcyBuYW1lIGFscmVhZHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXZkRm9sZGVyIHRoZSBkYXRhIGZvbGRlciBmb3IgdGhlIEFWRC4gSXQgd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgQVZECi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IG9mIHRoZSBBVkQKLSAgICAgKiBAcGFyYW0gc2tpbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHNraW4uIENhbiBiZSBudWxsLiBNdXN0IGhhdmUgYmVlbiB2ZXJpZmllZCBieSBjYWxsZXIuCi0gICAgICogQHBhcmFtIHNkY2FyZCB0aGUgcGFyYW1ldGVyIHZhbHVlIGZvciB0aGUgc2RDYXJkLiBDYW4gYmUgbnVsbC4gVGhpcyBpcyBlaXRoZXIgYSBwYXRoIHRvCi0gICAgICogICAgICAgIGFuIGV4aXN0aW5nIHNkY2FyZCBpbWFnZSBvciBhIHNkY2FyZCBzaXplIChcZCssIFxkK0ssIFxkTSkuCi0gICAgICogQHBhcmFtIGhhcmR3YXJlQ29uZmlnIHRoZSBoYXJkd2FyZSBzZXR1cCBmb3IgdGhlIEFWRC4gQ2FuIGJlIG51bGwgdG8gdXNlIGRlZmF1bHRzLgotICAgICAqIEBwYXJhbSByZW1vdmVQcmV2aW91cyBJZiB0cnVlIHJlbW92ZSBhbnkgcHJldmlvdXMgZmlsZXMuCi0gICAgICogQHBhcmFtIGxvZyB0aGUgbG9nIG9iamVjdCB0byByZWNlaXZlIGFjdGlvbiBsb2dzLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcge0BsaW5rIEF2ZEluZm99IGluIGNhc2Ugb2Ygc3VjY2VzcyAod2hpY2ggaGFzIGp1c3QgYmVlbiBhZGRlZCB0byB0aGUKLSAgICAgKiAgICAgICAgIGludGVybmFsIGxpc3QpIG9yIG51bGwgaW4gY2FzZSBvZiBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyBBdmRJbmZvIGNyZWF0ZUF2ZChGaWxlIGF2ZEZvbGRlciwgU3RyaW5nIG5hbWUsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgIFN0cmluZyBza2luTmFtZSwgU3RyaW5nIHNkY2FyZCwgTWFwPFN0cmluZyxTdHJpbmc+IGhhcmR3YXJlQ29uZmlnLAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVQcmV2aW91cywgSVNka0xvZyBsb2cpIHsKLSAgICAgICAgaWYgKGxvZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsb2cgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgaW5pRmlsZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gbmVlZENsZWFudXAgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhdmRGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVtb3ZlUHJldmlvdXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQVZEIGFscmVhZHkgZXhpc3RzIGFuZCByZW1vdmVQcmV2aW91cyBpcyBzZXQsIHRyeSB0byByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yeSdzIGNvbnRlbnQgZmlyc3QgKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoYXZkRm9sZGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBVkQgc2hvdWxkbid0IGFscmVhZHkgZXhpc3QgaWYgcmVtb3ZlUHJldmlvdXMgaXMgZmFsc2UuCi0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb2xkZXIgJTEkcyBpcyBpbiB0aGUgd2F5LiBVc2UgLS1mb3JjZSBpZiB5b3Ugd2FudCB0byBvdmVyd3JpdGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgQVZEIGZvbGRlci4KLSAgICAgICAgICAgICAgICBhdmRGb2xkZXIubWtkaXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWN0dWFsbHkgd3JpdGUgdGhlIGluaSBmaWxlCi0gICAgICAgICAgICBpbmlGaWxlID0gY3JlYXRlQXZkSW5pRmlsZShuYW1lLCBhdmRGb2xkZXIsIHRhcmdldCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlcyB0aGUgdXNlcmRhdGEuaW1nIGluIGl0LgotICAgICAgICAgICAgU3RyaW5nIGltYWdlUGF0aCA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LklNQUdFUyk7Ci0gICAgICAgICAgICBGaWxlIHVzZXJkYXRhU3JjID0gbmV3IEZpbGUoaW1hZ2VQYXRoLCBVU0VSREFUQV9JTUcpOwotCi0gICAgICAgICAgICBpZiAodXNlcmRhdGFTcmMuZXhpc3RzKCkgPT0gZmFsc2UgJiYgdGFyZ2V0LmlzUGxhdGZvcm0oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGltYWdlUGF0aCA9IHRhcmdldC5nZXRQYXJlbnQoKS5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LklNQUdFUyk7Ci0gICAgICAgICAgICAgICAgdXNlcmRhdGFTcmMgPSBuZXcgRmlsZShpbWFnZVBhdGgsIFVTRVJEQVRBX0lNRyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1c2VyZGF0YVNyYy5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLCAiVW5hYmxlIHRvIGZpbmQgYSAnJTEkcycgZmlsZSB0byBjb3B5IGludG8gdGhlIEFWRCBmb2xkZXIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJEQVRBX0lNRyk7Ci0gICAgICAgICAgICAgICAgbmVlZENsZWFudXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh1c2VyZGF0YVNyYyk7Ci0KLSAgICAgICAgICAgIEZpbGUgdXNlcmRhdGFEZXN0ID0gbmV3IEZpbGUoYXZkRm9sZGVyLCBVU0VSREFUQV9JTUcpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh1c2VyZGF0YURlc3QpOwotCi0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gZmlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBmb3Mud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIC8vIENvbmZpZyBmaWxlLgotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXRJbWFnZVBhdGhQcm9wZXJ0aWVzKHRhcmdldCwgdmFsdWVzLCBsb2cpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbmVlZENsZWFudXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3cgdGhlIHNraW4uCi0gICAgICAgICAgICBpZiAoc2tpbk5hbWUgPT0gbnVsbCB8fCBza2luTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc2tpbk5hbWUgPSB0YXJnZXQuZ2V0RGVmYXVsdFNraW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE5VTUVSSUNfU0tJTl9TSVpFLm1hdGNoZXIoc2tpbk5hbWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIC8vIFNraW4gbmFtZSBpcyBhbiBhY3R1YWwgc2NyZWVuIHJlc29sdXRpb24uCi0gICAgICAgICAgICAgICAgLy8gU2V0IHNraW4ubmFtZSBmb3IgZGlzcGxheSBwdXJwb3NlcyBpbiB0aGUgQVZEIG1hbmFnZXIgYW5kCi0gICAgICAgICAgICAgICAgLy8gc2V0IHNraW4ucGF0aCBmb3IgdXNlIGJ5IHRoZSBlbXVsYXRvci4KLSAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEFWRF9JTklfU0tJTl9OQU1FLCBza2luTmFtZSk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChBVkRfSU5JX1NLSU5fUEFUSCwgc2tpbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBhdGggb2YgdGhlIHNraW4gKHJlbGF0aXZlIHRvIHRoZSBTREspCi0gICAgICAgICAgICAgICAgLy8gYXNzdW1lIHNraW4gbmFtZSBpcyB2YWxpZAotICAgICAgICAgICAgICAgIFN0cmluZyBza2luUGF0aCA9IGdldFNraW5SZWxhdGl2ZVBhdGgoc2tpbk5hbWUsIHRhcmdldCwgbG9nKTsKLSAgICAgICAgICAgICAgICBpZiAoc2tpblBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuZWVkQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQVZEX0lOSV9TS0lOX1BBVEgsIHNraW5QYXRoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEFWRF9JTklfU0tJTl9OQU1FLCBza2luTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZGNhcmQgIT0gbnVsbCAmJiBzZGNhcmQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzZGNhcmRGaWxlID0gbmV3IEZpbGUoc2RjYXJkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2RjYXJkRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBzZGNhcmQgdmFsdWUgaXMgYW4gZXh0ZXJuYWwgc2RjYXJkLCBzbyB3ZSBwdXQgaXRzIHBhdGggaW50byB0aGUgY29uZmlnLmluaQotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEFWRF9JTklfU0RDQVJEX1BBVEgsIHNkY2FyZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2RjYXJkIGlzIHBvc3NpYmx5IGEgc2l6ZS4gSW4gdGhhdCBjYXNlIHdlIGNyZWF0ZSBhIGZpbGUgY2FsbGVkICdzZGNhcmQuaW1nJwotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgQVZEIGZvbGRlciwgYW5kIGRvIG5vdCBwdXQgYW55IHZhbHVlIGluIGNvbmZpZy5pbmkuCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHRoYXQgaXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBmb3Igc2RjYXJkIHNpemUKLSAgICAgICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gU0RDQVJEX1NJWkVfUEFUVEVSTi5tYXRjaGVyKHNkY2FyZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzZGNhcmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZGNhcmRGaWxlID0gbmV3IEZpbGUoYXZkRm9sZGVyLCBTRENBUkRfSU1HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc2RjYXJkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBta3NkY2FyZCB3aXRoIHRoZSBwcm9wZXIgcGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdG9vbHNGb2xkZXIgPSBuZXcgRmlsZShtU2RrTWFuYWdlci5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRkRfVE9PTFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBta1NkQ2FyZCA9IG5ldyBGaWxlKHRvb2xzRm9sZGVyLCBTZGtDb25zdGFudHMubWtTZENhcmRDbWROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWtTZENhcmQuaXNGaWxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwgIiclMSRzJyBpcyBtaXNzaW5nIGZyb20gdGhlIFNESyB0b29scyBmb2xkZXIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rU2RDYXJkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZENsZWFudXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlU2RDYXJkKG1rU2RDYXJkLmdldEFic29sdXRlUGF0aCgpLCBzZGNhcmQsIHBhdGgsIGxvZykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIG1rc2RjYXJkIG91dHB1dCBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCwgbm8gbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYW55dGhpbmcgZWxzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGEgcHJvcGVydHkgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgc2RjYXJkIGZvciBkaXNwbGF5IHB1cnBvc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgZGV2IGRvZXMgJ2FuZHJvaWQgbGlzdCBhdmQnCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEFWRF9JTklfU0RDQVJEX1NJWkUsIHNkY2FyZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclMSRzJyBpcyBub3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHNkY2FyZCB2YWx1ZS5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgc2hvdWxkIGJlOlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxLiBwYXRoIHRvIGFuIHNkY2FyZC5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMi4gc2l6ZSBvZiB0aGUgc2RjYXJkIHRvIGNyZWF0ZTogPHNpemU+W0t8TV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGNhcmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZENsZWFudXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgaGFyZHdhcmUgY29uZmlnIHRvIHRoZSBjb25maWcgZmlsZS4KLSAgICAgICAgICAgIC8vIHByaW9yaXR5IG9yZGVyIGlzOgotICAgICAgICAgICAgLy8gLSB2YWx1ZXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgICAgICAgICAgIC8vIC0gdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBza2luCi0gICAgICAgICAgICAvLyAtIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgdGFyZ2V0IChhZGQtb24gb25seSkuCi0gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBmb2xsb3cgdGhpcyBwcmlvcml0eSwgd2UnbGwgYWRkIHRoZSBsb3dlc3QgcHJpb3JpdHkgdmFsdWVzIGZpcnN0IGFuZCB0aGVuCi0gICAgICAgICAgICAvLyBvdmVycmlkZSBieSBoaWdoZXIgcHJpb3JpdHkgdmFsdWVzLgotICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBwbGF0Zm9ybSB3aXRoIG92ZXJyaWRlIHZhbHVlcyBmcm9tIHRoZSB1c2VyLCB0aGUgc2tpbiB2YWx1ZSBtaWdodAotICAgICAgICAgICAgLy8gYWxyZWFkeSBiZSB0aGVyZSwgYnV0IGl0J3Mgb2suCi0KLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbmFsSGFyZHdhcmVWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgRmlsZSB0YXJnZXRIYXJkd2FyZUZpbGUgPSBuZXcgRmlsZSh0YXJnZXQuZ2V0TG9jYXRpb24oKSwgQXZkTWFuYWdlci5IQVJEV0FSRV9JTkkpOwotICAgICAgICAgICAgaWYgKHRhcmdldEhhcmR3YXJlRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdGFyZ2V0SGFyZHdhcmVDb25maWcgPSBTZGtNYW5hZ2VyLnBhcnNlUHJvcGVydHlGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SGFyZHdhcmVGaWxlLCBsb2cpOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRIYXJkd2FyZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsSGFyZHdhcmVWYWx1ZXMucHV0QWxsKHRhcmdldEhhcmR3YXJlQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dEFsbCh0YXJnZXRIYXJkd2FyZUNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGhhcmR3YXJlIHByb3BlcnRpZXMgZm9yIHRoaXMgc2tpbgotICAgICAgICAgICAgRmlsZSBza2luRm9sZGVyID0gZ2V0U2tpblBhdGgoc2tpbk5hbWUsIHRhcmdldCk7Ci0gICAgICAgICAgICBGaWxlIHNraW5IYXJkd2FyZUZpbGUgPSBuZXcgRmlsZShza2luRm9sZGVyLCBBdmRNYW5hZ2VyLkhBUkRXQVJFX0lOSSk7Ci0gICAgICAgICAgICBpZiAoc2tpbkhhcmR3YXJlRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc2tpbkhhcmR3YXJlQ29uZmlnID0gU2RrTWFuYWdlci5wYXJzZVByb3BlcnR5RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraW5IYXJkd2FyZUZpbGUsIGxvZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNraW5IYXJkd2FyZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsSGFyZHdhcmVWYWx1ZXMucHV0QWxsKHNraW5IYXJkd2FyZUNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXRBbGwoc2tpbkhhcmR3YXJlQ29uZmlnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZpbmFsbHkgcHV0IHRoZSBoYXJkd2FyZSBwcm92aWRlZCBieSB0aGUgdXNlci4KLSAgICAgICAgICAgIGlmIChoYXJkd2FyZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWxIYXJkd2FyZVZhbHVlcy5wdXRBbGwoaGFyZHdhcmVDb25maWcpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXRBbGwoaGFyZHdhcmVDb25maWcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIGNvbmZpZ0luaUZpbGUgPSBuZXcgRmlsZShhdmRGb2xkZXIsIENPTkZJR19JTkkpOwotICAgICAgICAgICAgd3JpdGVJbmlGaWxlKGNvbmZpZ0luaUZpbGUsIHZhbHVlcyk7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXQuaXNQbGF0Zm9ybSgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnByaW50ZigiQ3JlYXRlZCBBVkQgJyUxJHMnIGJhc2VkIG9uICUyJHMiLCBuYW1lLCB0YXJnZXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLnByaW50ZigiQ3JlYXRlZCBBVkQgJyUxJHMnIGJhc2VkIG9uICUyJHMgKCUzJHMpIiwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXROYW1lKCksIHRhcmdldC5nZXRWZW5kb3IoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIGNob3NlbiBoYXJkd2FyZSBjb25maWcKLSAgICAgICAgICAgIGlmIChmaW5hbEhhcmR3YXJlVmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBsb2cucHJpbnRmKCIsIHdpdGggdGhlIGZvbGxvd2luZyBoYXJkd2FyZSBjb25maWc6XG4iKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGZpbmFsSGFyZHdhcmVWYWx1ZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnRmKCIlcz0lc1xuIixlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cucHJpbnRmKCJcbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIEF2ZEluZm8gb2JqZWN0LCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICBBdmRJbmZvIG5ld0F2ZEluZm8gPSBuZXcgQXZkSW5mbyhuYW1lLAotICAgICAgICAgICAgICAgICAgICBhdmRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5oYXNoU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCwgdmFsdWVzKTsKLQotICAgICAgICAgICAgQXZkSW5mbyBvbGRBdmRJbmZvID0gZ2V0QXZkKG5hbWUsIGZhbHNlIC8qdmFsaWRBdmRPbmx5Ki8pOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZEF2ZEluZm8gIT0gbnVsbCAmJiByZW1vdmVQcmV2aW91cykgewotICAgICAgICAgICAgICAgICAgICBtQWxsQXZkTGlzdC5yZW1vdmUob2xkQXZkSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxBdmRMaXN0LmFkZChuZXdBdmRJbmZvKTsKLSAgICAgICAgICAgICAgICBtVmFsaWRBdmRMaXN0ID0gbUJyb2tlbkF2ZExpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVtb3ZlUHJldmlvdXMgJiYKLSAgICAgICAgICAgICAgICAgICAgbmV3QXZkSW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG9sZEF2ZEluZm8gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhb2xkQXZkSW5mby5nZXRQYXRoKCkuZXF1YWxzKG5ld0F2ZEluZm8uZ2V0UGF0aCgpKSkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCJSZW1vdmluZyBwcmV2aW91cyBBVkQgZGlyZWN0b3J5IGF0ICVzIiwgb2xkQXZkSW5mby5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIGRhdGEgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShvbGRBdmRJbmZvLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGRpcik7Ci0gICAgICAgICAgICAgICAgZGlyLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3QXZkSW5mbzsKLSAgICAgICAgfSBjYXRjaCAoQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG5lZWRDbGVhbnVwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluaUZpbGUgIT0gbnVsbCAmJiBpbmlGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluaUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGF2ZEZvbGRlcik7Ci0gICAgICAgICAgICAgICAgYXZkRm9sZGVyLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGltYWdlcyBmb2xkZXIgYXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBTREssIGlmIHRoZSBmb2xkZXIKLSAgICAgKiBpcyBub3QgZW1wdHkuIElmIHRoZSBpbWFnZSBmb2xkZXIgaXMgZW1wdHkgb3IgZG9lcyBub3QgZXhpc3QsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgSW52YWxpZFRhcmdldFBhdGhFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpbWFnZSBmb2xkZXIgaXMgbm90IGluIHRoZSBjdXJyZW50IFNESy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbWFnZVJlbGF0aXZlUGF0aChJQW5kcm9pZFRhcmdldCB0YXJnZXQpCi0gICAgICAgICAgICB0aHJvd3MgSW52YWxpZFRhcmdldFBhdGhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW1hZ2VGdWxsUGF0aCA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LklNQUdFUyk7Ci0KLSAgICAgICAgLy8gbWFrZSB0aGlzIHBhdGggcmVsYXRpdmUgdG8gdGhlIFNESyBsb2NhdGlvbgotICAgICAgICBTdHJpbmcgc2RrTG9jYXRpb24gPSBtU2RrTWFuYWdlci5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoaW1hZ2VGdWxsUGF0aC5zdGFydHNXaXRoKHNka0xvY2F0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gdGhpcyByZWFsbHkgcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuLgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUYXJnZXRQYXRoRXhjZXB0aW9uKCJUYXJnZXQgbG9jYXRpb24gaXMgbm90IGluc2lkZSB0aGUgU0RLLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShpbWFnZUZ1bGxQYXRoKTsKLSAgICAgICAgaWYgKGZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsaXN0ID0gZm9sZGVyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElNQUdFX05BTUVfUEFUVEVSTi5tYXRjaGVyKG5hbWUpLm1hdGNoZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGltYWdlRnVsbFBhdGggPSBpbWFnZUZ1bGxQYXRoLnN1YnN0cmluZyhzZGtMb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlRnVsbFBhdGguY2hhckF0KDApID09IEZpbGUuc2VwYXJhdG9yQ2hhcikgewotICAgICAgICAgICAgICAgICAgICBpbWFnZUZ1bGxQYXRoID0gaW1hZ2VGdWxsUGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlRnVsbFBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBza2luLCBhcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIFNESy4KLSAgICAgKiBAcGFyYW0gc2tpbk5hbWUgVGhlIG5hbWUgb2YgdGhlIHNraW4gdG8gZmluZC4gQ2FzZS1zZW5zaXRpdmUuCi0gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHdoZXJlIHRvIGZpbmQgdGhlIHNraW4uCi0gICAgICogQHBhcmFtIGxvZyB0aGUgbG9nIG9iamVjdCB0byByZWNlaXZlIGFjdGlvbiBsb2dzLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNraW5SZWxhdGl2ZVBhdGgoU3RyaW5nIHNraW5OYW1lLCBJQW5kcm9pZFRhcmdldCB0YXJnZXQsIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIGlmIChsb2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibG9nIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJzdCBsb29rIHRvIHNlZSBpZiB0aGUgc2tpbiBpcyBpbiB0aGUgdGFyZ2V0Ci0gICAgICAgIEZpbGUgc2tpbiA9IGdldFNraW5QYXRoKHNraW5OYW1lLCB0YXJnZXQpOwotCi0gICAgICAgIC8vIHNraW4gcmVhbGx5IGRvZXMgbm90IGV4aXN0IQotICAgICAgICBpZiAoc2tpbi5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsICJTa2luICclMSRzJyBkb2VzIG5vdCBleGlzdC4iLCBza2luTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgc2tpbiBwYXRoCi0gICAgICAgIFN0cmluZyBwYXRoID0gc2tpbi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgICAgICAvLyBtYWtlIHRoaXMgcGF0aCByZWxhdGl2ZSB0byB0aGUgU0RLIGxvY2F0aW9uCi0gICAgICAgIFN0cmluZyBzZGtMb2NhdGlvbiA9IG1TZGtNYW5hZ2VyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoc2RrTG9jYXRpb24pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHJlYWxseSByZWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwgIlRhcmdldCBsb2NhdGlvbiBpcyBub3QgaW5zaWRlIHRoZSBTREsuIik7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhzZGtMb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgIGlmIChwYXRoLmNoYXJBdCgwKSA9PSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIGFic29sdXRlIE9TIHBhdGggdG8gYSBza2luIHNwZWNpZmllZCBieSBuYW1lIGZvciBhIGdpdmVuIHRhcmdldC4KLSAgICAgKiBAcGFyYW0gc2tpbk5hbWUgVGhlIG5hbWUgb2YgdGhlIHNraW4gdG8gZmluZC4gQ2FzZS1zZW5zaXRpdmUuCi0gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHdoZXJlIHRvIGZpbmQgdGhlIHNraW4uCi0gICAgICogQHJldHVybiBhIHtAbGluayBGaWxlfSB0aGF0IG1heSBvciBtYXkgbm90IGFjdHVhbGx5IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFNraW5QYXRoKFN0cmluZyBza2luTmFtZSwgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gdGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuU0tJTlMpOwotICAgICAgICBGaWxlIHNraW4gPSBuZXcgRmlsZShwYXRoLCBza2luTmFtZSk7Ci0KLSAgICAgICAgaWYgKHNraW4uZXhpc3RzKCkgPT0gZmFsc2UgJiYgdGFyZ2V0LmlzUGxhdGZvcm0oKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICBwYXRoID0gdGFyZ2V0LmdldFBhdGgoSUFuZHJvaWRUYXJnZXQuU0tJTlMpOwotICAgICAgICAgICAgc2tpbiA9IG5ldyBGaWxlKHBhdGgsIHNraW5OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBza2luOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGluaSBmaWxlIGZvciBhbiBBVkQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgQVZELgotICAgICAqIEBwYXJhbSBhdmRGb2xkZXIgcGF0aCBmb3IgdGhlIGRhdGEgZm9sZGVyIG9mIHRoZSBBVkQuCi0gICAgICogQHBhcmFtIHRhcmdldCBvZiB0aGUgQVZELgotICAgICAqIEB0aHJvd3MgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGdldHRpbmcgYW5kcm9pZCByb290IGRpcmVjdG9yeS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHtAbGluayBGaWxlI2dldEFic29sdXRlUGF0aCgpfSBmYWlscy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlQXZkSW5pRmlsZShTdHJpbmcgbmFtZSwgRmlsZSBhdmRGb2xkZXIsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCkKLSAgICAgICAgICAgIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIEZpbGUgaW5pRmlsZSA9IEF2ZEluZm8uZ2V0SW5pRmlsZShuYW1lKTsKLSAgICAgICAgdmFsdWVzLnB1dChBVkRfSU5GT19QQVRILCBhdmRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB2YWx1ZXMucHV0KEFWRF9JTkZPX1RBUkdFVCwgdGFyZ2V0Lmhhc2hTdHJpbmcoKSk7Ci0gICAgICAgIHdyaXRlSW5pRmlsZShpbmlGaWxlLCB2YWx1ZXMpOwotCi0gICAgICAgIHJldHVybiBpbmlGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGluaSBmaWxlIGZvciBhbiBBVkQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5mbyBvZiB0aGUgQVZELgotICAgICAqIEB0aHJvd3MgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGdldHRpbmcgYW5kcm9pZCByb290IGRpcmVjdG9yeS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHtAbGluayBGaWxlI2dldEFic29sdXRlUGF0aCgpfSBmYWlscy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlQXZkSW5pRmlsZShBdmRJbmZvIGluZm8pIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUF2ZEluaUZpbGUoaW5mby5nZXROYW1lKCksIG5ldyBGaWxlKGluZm8uZ2V0UGF0aCgpKSwgaW5mby5nZXRUYXJnZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0dWFsbHkgZGVsZXRlcyB0aGUgZmlsZXMgb2YgYW4gZXhpc3RpbmcgQVZELgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFsc28gcmVtb3ZlIGl0IGZyb20gdGhlIG1hbmFnZXIncyBsaXN0LCBUaGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8KLSAgICAgKiBjYWxsIHtAbGluayAjcmVtb3ZlQXZkKEF2ZEluZm8pfSBhZnRlcndhcmRzLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBzb21laG93IHdvcmsgd2l0aCBhbiB1bmF2YWlsYWJsZSBBVkQsIHRoYXQgaXMgYW4gQVZEIHRoYXQKLSAgICAgKiBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBzb21lIGVycm9yLiBUaGF0IG1lYW5zIHRoaXMgbWV0aG9kIHN0aWxsIHRyaWVzIHRvIHJlbW92ZQotICAgICAqIHRoZSBBVkQgaW5pIGZpbGUgb3IgaXRzIGZvbGRlciBpZiBpdCBjYW4gYmUgZm91bmQuIEFuIGVycm9yIHdpbGwgYmUgb3V0cHV0IGlmIGFueSBvZgotICAgICAqIHRoZXNlIG9wZXJhdGlvbnMgZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdmRJbmZvIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgQVZEIHRvIGRlbGV0ZQotICAgICAqIEBwYXJhbSBsb2cgdGhlIGxvZyBvYmplY3QgdG8gcmVjZWl2ZSBhY3Rpb24gbG9ncy4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBBVkQgd2FzIGRlbGV0ZWQgd2l0aCBubyBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVBdmQoQXZkSW5mbyBhdmRJbmZvLCBJU2RrTG9nIGxvZykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCi0gICAgICAgICAgICBGaWxlIGYgPSBhdmRJbmZvLmdldEluaUZpbGUoKTsKLSAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGxvZy5wcmludGYoIkRlbGV0aW5nIGZpbGUgJTEkc1xuIiwgZi5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobnVsbCwgIkZhaWxlZCB0byBkZWxldGUgJTEkc1xuIiwgZi5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGF2ZEluZm8uZ2V0UGF0aCgpOwotICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnRmKCJEZWxldGluZyBmb2xkZXIgJTEkc1xuIiwgZi5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoZik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsICJGYWlsZWQgdG8gZGVsZXRlICUxJHNcbiIsIGYuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVtb3ZlQXZkKGF2ZEluZm8pOwotCi0gICAgICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBsb2cucHJpbnRmKCJcbkFWRCAnJTEkcycgZGVsZXRlZCB3aXRoIGVycm9ycy4gU2VlIGVycm9ycyBhYm92ZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5wcmludGYoIlxuQVZEICclMSRzJyBkZWxldGVkLlxuIiwgYXZkSW5mby5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgYW5kL29yIHJlbmFtZSBhbiBleGlzdGluZyBBVkQgYW5kIGl0cyBmaWxlcy4KLSAgICAgKiBUaGlzIGFsc28gY2hhbmdlIGl0IGluIHRoZSBtYW5hZ2VyJ3MgbGlzdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBzaG91bGQgbWFrZSBzdXJlIHRoZSBuYW1lIG9yIHBhdGggZ2l2ZW4gYXJlIHZhbGlkLCBkbyBub3QgZXhpc3QgYW5kIGFyZQotICAgICAqIGFjdHVhbGx5IGRpZmZlcmVudCB0aGFuIGN1cnJlbnQgdmFsdWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGF2ZEluZm8gdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBBVkQgdG8gbW92ZS4KLSAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhlIEFWRCBpZiBub24gbnVsbC4KLSAgICAgKiBAcGFyYW0gcGFyYW1Gb2xkZXJQYXRoIHRoZSBuZXcgZGF0YSBmb2xkZXIgaWYgbm9uIG51bGwuCi0gICAgICogQHBhcmFtIGxvZyB0aGUgbG9nIG9iamVjdCB0byByZWNlaXZlIGFjdGlvbiBsb2dzLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1vdmUgc3VjY2VlZGVkIG9yIHRoZXJlIHdhcyBub3RoaW5nIHRvIGRvLgotICAgICAqICAgICAgICAgSWYgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBoYWQgYWxyZWFkeSBvdXRwdXQgZXJyb3IgaW4gdGhlIGxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlQXZkKEF2ZEluZm8gYXZkSW5mbywgU3RyaW5nIG5ld05hbWUsIFN0cmluZyBwYXJhbUZvbGRlclBhdGgsIElTZGtMb2cgbG9nKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwYXJhbUZvbGRlclBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGF2ZEluZm8uZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybmluZygiTW92aW5nICclMSRzJyB0byAnJTIkcycuIiwgYXZkSW5mby5nZXRQYXRoKCksIHBhcmFtRm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmLnJlbmFtZVRvKG5ldyBGaWxlKHBhcmFtRm9sZGVyUGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLCAiRmFpbGVkIHRvIG1vdmUgJyUxJHMnIHRvICclMiRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZEluZm8uZ2V0UGF0aCgpLCBwYXJhbUZvbGRlclBhdGgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIEFWRCBpbmZvCi0gICAgICAgICAgICAgICAgQXZkSW5mbyBpbmZvID0gbmV3IEF2ZEluZm8oYXZkSW5mby5nZXROYW1lKCksIHBhcmFtRm9sZGVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZEluZm8uZ2V0VGFyZ2V0SGFzaCgpLCBhdmRJbmZvLmdldFRhcmdldCgpLCBhdmRJbmZvLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICAgICAgcmVwbGFjZUF2ZChhdmRJbmZvLCBpbmZvKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5pIGZpbGUKLSAgICAgICAgICAgICAgICBjcmVhdGVBdmRJbmlGaWxlKGluZm8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBvbGRJbmlGaWxlID0gYXZkSW5mby5nZXRJbmlGaWxlKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBuZXdJbmlGaWxlID0gQXZkSW5mby5nZXRJbmlGaWxlKG5ld05hbWUpOwotCi0gICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoIk1vdmluZyAnJTEkcycgdG8gJyUyJHMnLiIsIG9sZEluaUZpbGUuZ2V0UGF0aCgpLCBuZXdJbmlGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbGRJbmlGaWxlLnJlbmFtZVRvKG5ld0luaUZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLCAiRmFpbGVkIHRvIG1vdmUgJyUxJHMnIHRvICclMiRzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEluaUZpbGUuZ2V0UGF0aCgpLCBuZXdJbmlGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgQVZEIGluZm8KLSAgICAgICAgICAgICAgICBBdmRJbmZvIGluZm8gPSBuZXcgQXZkSW5mbyhuZXdOYW1lLCBhdmRJbmZvLmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZEluZm8uZ2V0VGFyZ2V0SGFzaCgpLCBhdmRJbmZvLmdldFRhcmdldCgpLCBhdmRJbmZvLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICAgICAgcmVwbGFjZUF2ZChhdmRJbmZvLCBpbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nLnByaW50ZigiQVZEICclMSRzJyBtb3ZlZC5cbiIsIGF2ZEluZm8uZ2V0TmFtZSgpKTsKLQotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3RoaW5nIHRvIGRvIG9yIHN1Y2NlZWRlZAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGZvbGRlcidzIGNvbnRlbnQgKGJ1dCBub3QgdGhlIGZvbGRlciBpdHNlbGYpLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBsaWtlIHtAbGluayBGaWxlI2RlbGV0ZSgpfSBkb2VzIGlmIGZpbGUvZm9sZGVyIGlzIG5vdCB3cml0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSBmb2xkZXIpIHsKLSAgICAgICAgZm9yIChGaWxlIGYgOiBmb2xkZXIubGlzdEZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoZm9sZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGYuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSBwb3RlbnRpYWwgQVZEIGluaSBmaWxlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBsaXN0cyB0aGUgJEhPTUUvLmFuZHJvaWQvYXZkLzxuYW1lPi5pbmkgZmlsZXMuCi0gICAgICogU3VjaCBmaWxlcyBhcmUgcHJvcGVydGllcyBmaWxlIHRoYW4gdGhlbiBpbmRpY2F0ZSB3aGVyZSB0aGUgQVZEIGZvbGRlciBpcyBsb2NhdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgRmlsZX0gYXJyYXkgb3IgbnVsbC4gVGhlIGFycmF5IG1pZ2h0IGJlIGVtcHR5LgotICAgICAqIEB0aHJvd3MgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGdldHRpbmcgYW5kcm9pZCByb290IGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVbXSBidWlsZEF2ZEZpbGVzTGlzdCgpIHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBnZXQgdGhlIEFuZHJvaWQgcHJlZnMgbG9jYXRpb24uCi0gICAgICAgIFN0cmluZyBhdmRSb290ID0gQW5kcm9pZExvY2F0aW9uLmdldEZvbGRlcigpICsgQW5kcm9pZExvY2F0aW9uLkZPTERFUl9BVkQ7Ci0KLSAgICAgICAgLy8gZW5zdXJlIGZvbGRlciB2YWxpZGl0eS4KLSAgICAgICAgRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShhdmRSb290KTsKLSAgICAgICAgaWYgKGZvbGRlci5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJTEkcyBpcyBub3QgYSB2YWxpZCBmb2xkZXIuIiwgYXZkUm9vdCkpOwotICAgICAgICB9IGVsc2UgaWYgKGZvbGRlci5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy8gZm9sZGVyIGlzIG5vdCB0aGVyZSwgd2UgY3JlYXRlIGl0IGFuZCByZXR1cm4KLSAgICAgICAgICAgIGZvbGRlci5ta2RpcnMoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZVtdIGF2ZHMgPSBmb2xkZXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoSU5JX05BTUVfUEFUVEVSTi5tYXRjaGVyKG5hbWUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpdCdzIGEgZmlsZSBhbmQgbm90IGEgZm9sZGVyCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaWxlID0gbmV3IEZpbGUocGFyZW50LCBuYW1lKS5pc0ZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmlsZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBhdmRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGF2YWlsYWJsZSBBVkRzCi0gICAgICogQHBhcmFtIGFsbExpc3QgdGhlIGxpc3QgdG8gY29udGFpbiBhbGwgdGhlIEFWRHMKLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBsb2cgb2JqZWN0IHRvIHJlY2VpdmUgYWN0aW9uIGxvZ3MuIENhbm5vdCBiZSBudWxsLgotICAgICAqCi0gICAgICogQHRocm93cyBBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gaWYgdGhlcmUncyBhIHByb2JsZW0gZ2V0dGluZyBhbmRyb2lkIHJvb3QgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBidWlsZEF2ZExpc3QoQXJyYXlMaXN0PEF2ZEluZm8+IGFsbExpc3QsIElTZGtMb2cgbG9nKQotICAgICAgICAgICAgdGhyb3dzIEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVbXSBhdmRzID0gYnVpbGRBdmRGaWxlc0xpc3QoKTsKLSAgICAgICAgaWYgKGF2ZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChGaWxlIGF2ZCA6IGF2ZHMpIHsKLSAgICAgICAgICAgICAgICBBdmRJbmZvIGluZm8gPSBwYXJzZUF2ZEluZm8oYXZkLCBsb2cpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsTGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIEFWRCAuaW5pIGZpbGUgdG8gY3JlYXRlIGFuIHtAbGluayBBdmRJbmZvfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBBVkQgLmluaSBmaWxlCi0gICAgICogQHBhcmFtIGxvZyB0aGUgbG9nIG9iamVjdCB0byByZWNlaXZlIGFjdGlvbiBsb2dzLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBBdmRJbmZvfSB3aXRoIGFuIHtAbGluayBBdmRTdGF0dXN9IGluZGljYXRpbmcgd2hldGhlciB0aGlzIEFWRCBpcwotICAgICAqICAgICAgICAgdmFsaWQgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgQXZkSW5mbyBwYXJzZUF2ZEluZm8oRmlsZSBwYXRoLCBJU2RrTG9nIGxvZykgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IFNka01hbmFnZXIucGFyc2VQcm9wZXJ0eUZpbGUocGF0aCwgbG9nKTsKLQotICAgICAgICBTdHJpbmcgYXZkUGF0aCA9IG1hcC5nZXQoQVZEX0lORk9fUEFUSCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRIYXNoID0gbWFwLmdldChBVkRfSU5GT19UQVJHRVQpOwotCi0gICAgICAgIElBbmRyb2lkVGFyZ2V0IHRhcmdldCA9IG51bGw7Ci0gICAgICAgIEZpbGUgY29uZmlnSW5pRmlsZSA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHRhcmdldEhhc2ggIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0ID0gbVNka01hbmFnZXIuZ2V0VGFyZ2V0RnJvbUhhc2hTdHJpbmcodGFyZ2V0SGFzaCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb2FkIHRoZSBBVkQgcHJvcGVydGllcy4KLSAgICAgICAgaWYgKGF2ZFBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnSW5pRmlsZSA9IG5ldyBGaWxlKGF2ZFBhdGgsIENPTkZJR19JTkkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ0luaUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFjb25maWdJbmlGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCJNaXNzaW5nIGZpbGUgJyUxJHMnLiIsICBjb25maWdJbmlGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gU2RrTWFuYWdlci5wYXJzZVByb3BlcnR5RmlsZShjb25maWdJbmlGaWxlLCBsb2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IG5hbWUKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoLmdldE5hbWUoKTsKLSAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gSU5JX05BTUVfUEFUVEVSTi5tYXRjaGVyKHBhdGguZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBuYW1lID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBpbWFnZS5zeXNkaXIgYXJlIHZhbGlkCi0gICAgICAgIGJvb2xlYW4gdmFsaWRJbWFnZVN5c2RpciA9IHRydWU7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBpbWFnZVN5c0RpciA9IHByb3BlcnRpZXMuZ2V0KEFWRF9JTklfSU1BR0VTXzEpOwotICAgICAgICAgICAgaWYgKGltYWdlU3lzRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtU2RrTWFuYWdlci5nZXRMb2NhdGlvbigpICsgRmlsZS5zZXBhcmF0b3IgKyBpbWFnZVN5c0Rpcik7Ci0gICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICB2YWxpZEltYWdlU3lzZGlyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VTeXNEaXIgPSBwcm9wZXJ0aWVzLmdldChBVkRfSU5JX0lNQUdFU18yKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlU3lzRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShtU2RrTWFuYWdlci5nZXRMb2NhdGlvbigpICsgRmlsZS5zZXBhcmF0b3IgKyBpbWFnZVN5c0Rpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRJbWFnZVN5c2RpciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXZkU3RhdHVzIHN0YXR1czsKLQotICAgICAgICBpZiAoYXZkUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdmRTdGF0dXMuRVJST1JfUEFUSDsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWdJbmlGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF2ZFN0YXR1cy5FUlJPUl9DT05GSUc7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0SGFzaCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdmRTdGF0dXMuRVJST1JfVEFSR0VUX0hBU0g7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF2ZFN0YXR1cy5FUlJPUl9UQVJHRVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdmRTdGF0dXMuRVJST1JfUFJPUEVSVElFUzsKLSAgICAgICAgfSBlbHNlIGlmICh2YWxpZEltYWdlU3lzZGlyID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdmRTdGF0dXMuRVJST1JfSU1BR0VfRElSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gQXZkU3RhdHVzLk9LOwotICAgICAgICB9Ci0KLSAgICAgICAgQXZkSW5mbyBpbmZvID0gbmV3IEF2ZEluZm8oCi0gICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICBhdmRQYXRoLAotICAgICAgICAgICAgICAgIHRhcmdldEhhc2gsCi0gICAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgc3RhdHVzKTsKLQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSAuaW5pIGZpbGUgZnJvbSBhIHNldCBvZiBwcm9wZXJ0aWVzLCB1c2luZyBVVEYtOCBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmlGaWxlIFRoZSBmaWxlIHRvIGdlbmVyYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZXMgVEhlIHByb3BlcnRpZXMgdG8gcGxhY2UgaW4gdGhlIGluaSBmaWxlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYge0BsaW5rIEZpbGVXcml0ZXJ9IGZhaWxzIHRvIG9wZW4sIHdyaXRlIG9yIGNsb3NlIHRoZSBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVJbmlGaWxlKEZpbGUgaW5pRmlsZSwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShpbmlGaWxlKSwKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuSU5JX0NIQVJTRVQpOwotCi0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdmFsdWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcuZm9ybWF0KCIlMSRzPSUyJHNcbiIsIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdG9vbCB0byBjcmVhdGUgYSBuZXcgU0QgY2FyZCBpbWFnZSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRvb2xMb2NhdGlvbiBUaGUgcGF0aCB0byB0aGUgbWtzZGNhcmQgdG9vbC4KLSAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgbmV3IFNEIENhcmQsIGNvbXBhdGlibGUgd2l0aCB7QGxpbmsgI1NEQ0FSRF9TSVpFX1BBVFRFUk59LgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgcGF0aCBvZiB0aGUgbmV3IHNkY2FyZCBpbWFnZSBmaWxlIHRvIGdlbmVyYXRlLgotICAgICAqIEBwYXJhbSBsb2cgdGhlIGxvZyBvYmplY3QgdG8gcmVjZWl2ZSBhY3Rpb24gbG9ncy4gQ2Fubm90IGJlIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzZGNhcmQgY291bGQgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlU2RDYXJkKFN0cmluZyB0b29sTG9jYXRpb24sIFN0cmluZyBzaXplLCBTdHJpbmcgbG9jYXRpb24sIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgICAgIGNvbW1hbmRbMF0gPSB0b29sTG9jYXRpb247Ci0gICAgICAgICAgICBjb21tYW5kWzFdID0gc2l6ZTsKLSAgICAgICAgICAgIGNvbW1hbmRbMl0gPSBsb2NhdGlvbjsKLSAgICAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGVycm9yT3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdGRPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGludCBzdGF0dXMgPSBncmFiUHJvY2Vzc091dHB1dChwcm9jZXNzLCBlcnJvck91dHB1dCwgc3RkT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHdhaXRGb3JSZWFkZXJzICovKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGVycm9yIDogZXJyb3JPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsIGVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcGFzcywgcHJpbnQgZXJyb3IgYmVsb3cKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcGFzcywgcHJpbnQgZXJyb3IgYmVsb3cKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5lcnJvcihudWxsLCAiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgU0QgY2FyZC4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHN0ZGVyci9zdGRvdXQgb3V0cHV0cyBvZiBhIHByb2Nlc3MgYW5kIHJldHVybnMgd2hlbiB0aGUgcHJvY2VzcyBpcyBkb25lLgotICAgICAqIEJvdGggPGI+bXVzdDwvYj4gYmUgcmVhZCBvciB0aGUgcHJvY2VzcyB3aWxsIGJsb2NrIG9uIHdpbmRvd3MuCi0gICAgICogQHBhcmFtIHByb2Nlc3MgVGhlIHByb2Nlc3MgdG8gZ2V0IHRoZSBvdXB1dCBmcm9tCi0gICAgICogQHBhcmFtIGVycm9yT3V0cHV0IFRoZSBhcnJheSB0byBzdG9yZSB0aGUgc3RkZXJyIG91dHB1dC4gY2Fubm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIHN0ZE91dHB1dCBUaGUgYXJyYXkgdG8gc3RvcmUgdGhlIHN0ZG91dCBvdXRwdXQuIGNhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSB3YWl0Zm9yUmVhZGVycyBpZiB0cnVlLCB0aGlzIHdpbGwgd2FpdCBmb3IgdGhlIHJlYWRlciB0aHJlYWRzLgotICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgcmV0dXJuIGNvZGUuCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdyYWJQcm9jZXNzT3V0cHV0KGZpbmFsIFByb2Nlc3MgcHJvY2VzcywgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gZXJyb3JPdXRwdXQsCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBzdGRPdXRwdXQsIGJvb2xlYW4gd2FpdGZvclJlYWRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgZXJyb3JPdXRwdXQgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHN0ZE91dHB1dCAhPSBudWxsOwotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCIiKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB0byByZWFkIHRoZSBzdGRlcnIgb3V0cHV0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZXJyUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JPdXRwdXQuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgiIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpcyA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIG91dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpcyk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBvdXRSZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRPdXRwdXQuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLQotICAgICAgICAvLyBpdCBsb29rcyBsaWtlIG9uIHdpbmRvd3MgcHJvY2VzcyN3YWl0Rm9yKCkgY2FuIHJldHVybgotICAgICAgICAvLyBiZWZvcmUgdGhlIHRocmVhZCBoYXZlIGZpbGxlZCB0aGUgYXJyYXlzLCBzbyB3ZSB3YWl0IGZvciBib3RoIHRocmVhZHMgYW5kIHRoZQotICAgICAgICAvLyBwcm9jZXNzIGl0c2VsZi4KLSAgICAgICAgaWYgKHdhaXRmb3JSZWFkZXJzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHQxLmpvaW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdDIuam9pbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcm9jZXNzCi0gICAgICAgIHJldHVybiBwcm9jZXNzLndhaXRGb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIHtAbGluayBBdmRJbmZvfSBmcm9tIHRoZSBpbnRlcm5hbCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF2ZEluZm8gVGhlIHtAbGluayBBdmRJbmZvfSB0byByZW1vdmUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMge0BsaW5rIEF2ZEluZm99IHdhcyBwcmVzZW50IGFuZCBoYXMgYmVlbiByZW1vdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF2ZChBdmRJbmZvIGF2ZEluZm8pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQWxsQXZkTGlzdCkgewotICAgICAgICAgICAgaWYgKG1BbGxBdmRMaXN0LnJlbW92ZShhdmRJbmZvKSkgewotICAgICAgICAgICAgICAgIG1WYWxpZEF2ZExpc3QgPSBtQnJva2VuQXZkTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhbiBBVkQgd2l0aCBuZXcgcGF0aCB0byB0aGUgc3lzdGVtIGltYWdlIGZvbGRlcnMuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIEFWRCB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIGxvZyB0aGUgbG9nIG9iamVjdCB0byByZWNlaXZlIGFjdGlvbiBsb2dzLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQXZkKFN0cmluZyBuYW1lLCBJU2RrTG9nIGxvZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmluZCB0aGUgQVZEIHRvIHVwZGF0ZS4gSXQgc2hvdWxkIGJlIGJlIGluIHRoZSBicm9rZW4gbGlzdC4KLSAgICAgICAgQXZkSW5mbyBhdmQgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKEF2ZEluZm8gaW5mbyA6IG1BbGxBdmRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBhdmQgPSBpbmZvOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXZkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgYnJva2VuIGxpc3QsIGp1c3QgcmV0dXJuLgotICAgICAgICAgICAgbG9nLmVycm9yKG51bGwsICJUaGVyZSBpcyBubyBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWVkICclcycuIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVBdmQoYXZkLCBsb2cpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhbiBBVkQgd2l0aCBuZXcgcGF0aCB0byB0aGUgc3lzdGVtIGltYWdlIGZvbGRlcnMuCi0gICAgICogQHBhcmFtIGF2ZCB0aGUgQVZEIHRvIHVwZGF0ZS4KLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBsb2cgb2JqZWN0IHRvIHJlY2VpdmUgYWN0aW9uIGxvZ3MuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVBdmQoQXZkSW5mbyBhdmQsIElTZGtMb2cgbG9nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMuIFRoaXMgaXMgYSB1bm1vZGlmaWFibGUgTWFwLgotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZFByb3BlcnRpZXMgPSBhdmQuZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBtYXAKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChvbGRQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKG9sZFByb3BlcnRpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXZkU3RhdHVzIHN0YXR1czsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHBhdGggdG8gdGhlIG5ldyBzeXN0ZW0gaW1hZ2VzLgotICAgICAgICBpZiAoc2V0SW1hZ2VQYXRoUHJvcGVydGllcyhhdmQuZ2V0VGFyZ2V0KCksIHByb3BlcnRpZXMsIGxvZykpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEFWRF9JTklfSU1BR0VTXzEpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnByaW50ZigiVXBkYXRlZCAnJTEkcycgd2l0aCB2YWx1ZSAnJTIkcydcbiIsIEFWRF9JTklfSU1BR0VTXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChBVkRfSU5JX0lNQUdFU18xKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEFWRF9JTklfSU1BR0VTXzIpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnByaW50ZigiVXBkYXRlZCAnJTEkcycgd2l0aCB2YWx1ZSAnJTIkcydcbiIsIEFWRF9JTklfSU1BR0VTXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChBVkRfSU5JX0lNQUdFU18yKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IEF2ZFN0YXR1cy5PSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihudWxsLCAiVW5hYmxlIHRvIGZpbmQgbm9uIGVtcHR5IHN5c3RlbSBpbWFnZXMgZm9sZGVycyBmb3IgJTEkcyIsCi0gICAgICAgICAgICAgICAgICAgIGF2ZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgLy9GSVhNRTogZGlzcGxheSBwYXRocyB0byBlbXB0eSBpbWFnZSBmb2xkZXJzPwotICAgICAgICAgICAgc3RhdHVzID0gQXZkU3RhdHVzLkVSUk9SX0lNQUdFX0RJUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyB3cml0ZSB0aGUgY29uZmlnIGZpbGUKLSAgICAgICAgRmlsZSBjb25maWdJbmlGaWxlID0gbmV3IEZpbGUoYXZkLmdldFBhdGgoKSwgQ09ORklHX0lOSSk7Ci0gICAgICAgIHdyaXRlSW5pRmlsZShjb25maWdJbmlGaWxlLCBwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyBmaW5hbGx5IGNyZWF0ZSBhIG5ldyBBdmRJbmZvIGZvciB0aGlzIHVuYnJva2VuIGF2ZCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIHRoZSBBdmRJbmZvIG9iamVjdCBkaXJlY3RseSB3ZSByZXBhcnNlIGl0LCB0byBkZXRlY3Qgb3RoZXIgcG9zc2libGUKLSAgICAgICAgLy8gZXJyb3JzCi0gICAgICAgIC8vIEZJWE1FOiBXZSBtYXkgd2FudCB0byBjcmVhdGUgdGhpcyBBdmRJbmZvIGJ5IHJlcGFyc2luZyB0aGUgQVZEIGluc3RlYWQuIFRoaXMgY291bGQgZGV0ZWN0IG90aGVyIGVycm9ycy4KLSAgICAgICAgQXZkSW5mbyBuZXdBdmQgPSBuZXcgQXZkSW5mbygKLSAgICAgICAgICAgICAgICBhdmQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIGF2ZC5nZXRQYXRoKCksCi0gICAgICAgICAgICAgICAgYXZkLmdldFRhcmdldEhhc2goKSwKLSAgICAgICAgICAgICAgICBhdmQuZ2V0VGFyZ2V0KCksCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBzdGF0dXMpOwotCi0gICAgICAgIHJlcGxhY2VBdmQoYXZkLCBuZXdBdmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhdGhzIHRvIHRoZSBzeXN0ZW0gaW1hZ2VzIGluIGEgcHJvcGVydGllcyBtYXAuCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGluIHdoaWNoIHRvIGZpbmQgdGhlIHN5c3RlbSBpbWFnZXMuCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHByb3BlcnRpZXMgaW4gd2hpY2ggdG8gc2V0IHRoZSBwYXRocy4KLSAgICAgKiBAcGFyYW0gbG9nIHRoZSBsb2cgb2JqZWN0IHRvIHJlY2VpdmUgYWN0aW9uIGxvZ3MuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzLCBmYWxzZSBpZiBzb21lIHBhdGggYXJlIG1pc3NpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldEltYWdlUGF0aFByb3BlcnRpZXMoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0LAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgSVNka0xvZyBsb2cpIHsKLSAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoQVZEX0lOSV9JTUFHRVNfMSk7Ci0gICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKEFWRF9JTklfSU1BR0VTXzIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBBVkRfSU5JX0lNQUdFU18xOwotCi0gICAgICAgICAgICAvLyBGaXJzdCB0aGUgaW1hZ2UgZm9sZGVycyBvZiB0aGUgdGFyZ2V0IGl0c2VsZgotICAgICAgICAgICAgU3RyaW5nIGltYWdlUGF0aCA9IGdldEltYWdlUmVsYXRpdmVQYXRoKHRhcmdldCk7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgaW1hZ2VQYXRoKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IEFWRF9JTklfSU1BR0VTXzI7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBpcyBhbiBhZGQtb24gd2UgbmVlZCB0byBhZGQgdGhlIFBsYXRmb3JtIGltYWdlIGFzIGEgYmFja3VwLgotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VQYXRoID0gZ2V0SW1hZ2VSZWxhdGl2ZVBhdGgocGFyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcGVydHksIGltYWdlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBuZWVkIGF0IGxlYXN0IG9uZSBwYXRoIQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuY29udGFpbnNLZXkoQVZEX0lOSV9JTUFHRVNfMSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRQYXRoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgYW4gb2xkIHtAbGluayBBdmRJbmZvfSB3aXRoIGEgbmV3IG9uZSBpbiB0aGUgbGlzdHMgc3RvcmluZyB0aGVtLgotICAgICAqIEBwYXJhbSBvbGRBdmQgdGhlIHtAbGluayBBdmRJbmZvfSB0byByZW1vdmUuCi0gICAgICogQHBhcmFtIG5ld0F2ZCB0aGUge0BsaW5rIEF2ZEluZm99IHRvIGFkZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZUF2ZChBdmRJbmZvIG9sZEF2ZCwgQXZkSW5mbyBuZXdBdmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQWxsQXZkTGlzdCkgewotICAgICAgICAgICAgbUFsbEF2ZExpc3QucmVtb3ZlKG9sZEF2ZCk7Ci0gICAgICAgICAgICBtQWxsQXZkTGlzdC5hZGQobmV3QXZkKTsKLSAgICAgICAgICAgIG1WYWxpZEF2ZExpc3QgPSBtQnJva2VuQXZkTGlzdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvYXZkL0hhcmR3YXJlUHJvcGVydGllcy5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL2F2ZC9IYXJkd2FyZVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxNDJiMS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvYXZkL0hhcmR3YXJlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgSGFyZHdhcmVQcm9wZXJ0aWVzIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFBBVFRFUk5fUFJPUCA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAiXihbYS16QS1aMC05Ll8tXSspXFxzKj1cXHMqKC4qKVxccyokIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFdfUFJPUF9OQU1FID0gIm5hbWUiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBIV19QUk9QX1RZUEUgPSAidHlwZSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEhXX1BST1BfREVGQVVMVCA9ICJkZWZhdWx0IjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFdfUFJPUF9BQlNUUkFDVCA9ICJhYnN0cmFjdCI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEhXX1BST1BfREVTQyA9ICJkZXNjcmlwdGlvbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9PTEVBTl9ZRVMgPSAieWVzIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9PTEVBTl9OTyA9ICJubyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBCT09MRUFOX1ZBTFVFUyA9IG5ldyBTdHJpbmdbXSB7IEJPT0xFQU5fWUVTLCBCT09MRUFOX05PIH07Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIERJU0tTSVpFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcZCtbTUtdQiIpOwotCi0gICAgcHVibGljIGVudW0gVmFsdWVUeXBlIHsKLSAgICAgICAgSU5URUdFUigiaW50ZWdlciIpLAotICAgICAgICBCT09MRUFOKCJib29sZWFuIiksCi0gICAgICAgIERJU0tTSVpFKCJkaXNrU2l6ZSIpOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1WYWx1ZTsKLQotICAgICAgICBWYWx1ZVR5cGUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZVR5cGUgZ2V0RW51bShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGZvciAoVmFsdWVUeXBlIHR5cGUgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLm1WYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEhhcmR3YXJlUHJvcGVydHkgewotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBWYWx1ZVR5cGUgbVR5cGU7Ci0gICAgICAgIC8qKiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiBjYW4gYmUgbnVsbC4gKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlZmF1bHQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1BYnN0cmFjdDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWYWx1ZVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJzdHJhY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFic3RyYWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGhhcmR3YXJlIGRlZmluaXRpb24gZmlsZS4KLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgcHJvcGVydHkgZmlsZSB0byBwYXJzZQotICAgICAqIEBwYXJhbSBsb2cgdGhlIElTZGtMb2cgb2JqZWN0IHJlY2VpdmluZyB3YXJuaW5nL2Vycm9yIGZyb20gdGhlIHBhcnNpbmcuCi0gICAgICogQHJldHVybiB0aGUgbWFwIG9mIChrZXksdmFsdWUpIHBhaXJzLCBvciBudWxsIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEhhcmR3YXJlUHJvcGVydHk+IHBhcnNlSGFyZHdhcmVEZWZpbml0aW9ucyhGaWxlIGZpbGUsIElTZGtMb2cgbG9nKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzKSk7Ci0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEhhcmR3YXJlUHJvcGVydHk+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSGFyZHdhcmVQcm9wZXJ0eT4oKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgSGFyZHdhcmVQcm9wZXJ0eSBwcm9wID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmIGxpbmUuY2hhckF0KDApICE9ICcjJykgewotICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBQQVRURVJOX1BST1AubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVOYW1lID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG0uZ3JvdXAoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIV19QUk9QX05BTUUuZXF1YWxzKHZhbHVlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wID0gbmV3IEhhcmR3YXJlUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLm1OYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChwcm9wLm1OYW1lLCBwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCJFcnJvciBwYXJzaW5nICclMSRzJzogbWlzc2luZyAnJTIkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgSFdfUFJPUF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEhXX1BST1BfVFlQRS5lcXVhbHModmFsdWVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AubVR5cGUgPSBWYWx1ZVR5cGUuZ2V0RW51bSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhXX1BST1BfREVGQVVMVC5lcXVhbHModmFsdWVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AubURlZmF1bHQgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSFdfUFJPUF9BQlNUUkFDVC5lcXVhbHModmFsdWVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AubUFic3RyYWN0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhXX1BST1BfREVTQy5lcXVhbHModmFsdWVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AubURlc2NyaXB0aW9uID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybmluZygiRXJyb3IgcGFyc2luZyAnJTEkcyc6IFwiJTIkc1wiIGlzIG5vdCBhIHZhbGlkIHN5bnRheCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIHdlIHVzdWFsbHkgdGVzdCB0aGUgZmlsZSBleGlzdGVuY2UgYmVmb3JlCi0gICAgICAgICAgICAvLyBjYWxsaW5nIHRoZSBtZXRob2QuCi0gICAgICAgICAgICAvLyBSZXR1cm4gbnVsbCBiZWxvdy4KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoIkVycm9yIHBhcnNpbmcgJyUxJHMnOiAlMiRzLiIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiA8dmFyPnZhbHVlPC92YXI+IGluIHtAbGluayAjQk9PTEVBTl9WQUxVRVN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEJvb2xlYW5WYWx1ZUluZGV4KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoQk9PTEVBTl9ZRVMuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQk9PTEVBTl9OTy5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcHJvamVjdC9BcGtDb25maWd1cmF0aW9uSGVscGVyLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcHJvamVjdC9BcGtDb25maWd1cmF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTZmYTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3Byb2plY3QvQXBrQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3Q7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcmVhZCBhbmQgd3JpdGUgQXBrIENvbmZpZ3VyYXRpb24gaW50byBhIHtAbGluayBQcm9qZWN0UHJvcGVydGllc30gZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEFwa0NvbmZpZ3VyYXRpb25IZWxwZXIgewotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBwcm9qZWN0IHNldHRpbmdzIGZyb20gYSB7QGxpbmsgUHJvamVjdFByb3BlcnRpZXN9IGZpbGUgYW5kIHJldHVybnMgdGhlbSBhcyBhCi0gICAgICoge0BsaW5rIEFwa1NldHRpbmdzfSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBcGtTZXR0aW5ncyBnZXRTZXR0aW5ncyhQcm9qZWN0UHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIEFwa1NldHRpbmdzIGFwa1NldHRpbmdzID0gbmV3IEFwa1NldHRpbmdzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzcGxpdEJ5RGVuc2l0eSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfU1BMSVRfQllfREVOU0lUWSkpOwotICAgICAgICBhcGtTZXR0aW5ncy5zZXRTcGxpdEJ5RGVuc2l0eShzcGxpdEJ5RGVuc2l0eSk7Ci0KLQotICAgICAgICByZXR1cm4gYXBrU2V0dGluZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBvZiBhIHtAbGluayBBcGtTZXR0aW5nc30gaW50byBhIHtAbGluayBQcm9qZWN0UHJvcGVydGllc30uCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHtAbGluayBQcm9qZWN0UHJvcGVydGllc30gaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHNldHRpbmdzLgotICAgICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgcHJvamVjdCBzZXR0aW5ncyB0byBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9qZWN0UHJvcGVydGllcyBwcm9wZXJ0aWVzLCBBcGtTZXR0aW5ncyBzZXR0aW5ncykgewotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX1NQTElUX0JZX0RFTlNJVFksCi0gICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhzZXR0aW5ncy5pc1NwbGl0QnlEcGkoKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9wcm9qZWN0L0Fwa1NldHRpbmdzLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcHJvamVjdC9BcGtTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZlMjIzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9wcm9qZWN0L0Fwa1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogU2V0dGluZ3MgZm9yIG11bHRpcGxlIEFQSyBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQXBrU2V0dGluZ3MgewotICAgIHByaXZhdGUgYm9vbGVhbiBtU3BsaXRCeURwaSA9IGZhbHNlOwotCi0gICAgcHVibGljIEFwa1NldHRpbmdzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgb2YgY29uZmlndXJhdGlvbiBmaWx0ZXJzIHRvIGJlIHVzZWQgYnkgdGhlIC1jIG9wdGlvbiBvZiBhYXB0LgotICAgICAqIDxwLz5UaGUgbWFwIHN0b3JlcyAoa2V5LCB2YWx1ZSkgcGFpcnMgd2hlcmUgdGhlIGtleXMgaXMgYSBmaWxlbmFtZSBtb2RpZmllciBhbmQgdGhlIHZhbHVlCi0gICAgICogaXMgdGhlIHBhcmFtZXRlciB0byBwYXNzIHRvIGFhcHQgdGhyb3VnaCB0aGUgLWMgb3B0aW9uLgotICAgICAqIEByZXR1cm4gYSBtYXAsIGFsd2F5cy4gSXQgY2FuIGhvd2V2ZXIgYmUgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVzb3VyY2VGaWx0ZXJzKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBpZiAobVNwbGl0QnlEcGkpIHsKLSAgICAgICAgICAgIG1hcC5wdXQoImhkcGkiLCAiaGRwaSxub2RwaSIpOwotICAgICAgICAgICAgbWFwLnB1dCgibWRwaSIsICJtZHBpLG5vZHBpIik7Ci0gICAgICAgICAgICBtYXAucHV0KCJsZHBpIiwgImxkcGksbm9kcGkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgQVBLcyBzaG91bGQgYmUgZ2VuZXJhdGUgZm9yIGVhY2ggZHBpIGxldmVsLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3BsaXRCeURwaSgpIHsKLSAgICAgICAgcmV0dXJuIG1TcGxpdEJ5RHBpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNwbGl0QnlEZW5zaXR5KGJvb2xlYW4gc3BsaXQpIHsKLSAgICAgICAgbVNwbGl0QnlEcGkgPSBzcGxpdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0Q3JlYXRvci5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3Byb2plY3QvUHJvamVjdENyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllNTk5OS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0Q3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuUHJvamVjdFByb3BlcnRpZXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi54bWwuQW5kcm9pZE1hbmlmZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi54bWwuQW5kcm9pZFhQYXRoRmFjdG9yeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgYmFzaWMgZmlsZXMgbmVlZGVkIHRvIGdldCBhbiBBbmRyb2lkIHByb2plY3QgdXAgYW5kIHJ1bm5pbmcuCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDcmVhdG9yIHsKLQotICAgIC8qKiBQYWNrYWdlIHBhdGggc3Vic3RpdHV0aW9uIHN0cmluZyB1c2VkIGluIHRlbXBsYXRlIGZpbGVzLCBpLmUuICJQQUNLQUdFX1BBVEgiICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0pBVkFfRk9MREVSID0gIlBBQ0tBR0VfUEFUSCI7Ci0gICAgLyoqIFBhY2thZ2UgbmFtZSBzdWJzdGl0dXRpb24gc3RyaW5nIHVzZWQgaW4gdGVtcGxhdGUgZmlsZXMsIGkuZS4gIlBBQ0tBR0UiICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX1BBQ0tBR0UgPSAiUEFDS0FHRSI7Ci0gICAgLyoqIEFjdGl2aXR5IG5hbWUgc3Vic3RpdHV0aW9uIHN0cmluZyB1c2VkIGluIHRlbXBsYXRlIGZpbGVzLCBpLmUuICJBQ1RJVklUWV9OQU1FIi4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igb2xkZXIgdGVtcGxhdGVzLiBGb3IgbmV3IG9uZXMgc2VlCi0gICAgICoge0BsaW5rICNQSF9BQ1RJVklUWV9FTlRSWV9OQU1FfSwgYW5kIHtAbGluayAjUEhfQUNUSVZJVFlfQ0xBU1NfTkFNRX0uICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0FDVElWSVRZX05BTUUgPSAiQUNUSVZJVFlfTkFNRSI7Ci0gICAgLyoqIEFjdGl2aXR5IG5hbWUgc3Vic3RpdHV0aW9uIHN0cmluZyB1c2VkIGluIG1hbmlmZXN0IHRlbXBsYXRlcywgaS5lLiAiQUNUSVZJVFlfRU5UUllfTkFNRSIuKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfQUNUSVZJVFlfRU5UUllfTkFNRSA9ICJBQ1RJVklUWV9FTlRSWV9OQU1FIjsKLSAgICAvKiogQWN0aXZpdHkgbmFtZSBzdWJzdGl0dXRpb24gc3RyaW5nIHVzZWQgaW4gY2xhc3MgdGVtcGxhdGVzLCBpLmUuICJBQ1RJVklUWV9DTEFTU19OQU1FIi4qLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQSF9BQ1RJVklUWV9DTEFTU19OQU1FID0gIkFDVElWSVRZX0NMQVNTX05BTUUiOwotICAgIC8qKiBBY3Rpdml0eSBGUS1uYW1lIHN1YnN0aXR1dGlvbiBzdHJpbmcgdXNlZCBpbiBjbGFzcyB0ZW1wbGF0ZXMsIGkuZS4gIkFDVElWSVRZX0ZRX05BTUUiLiovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0FDVElWSVRZX0ZRX05BTUUgPSAiQUNUSVZJVFlfRlFfTkFNRSI7Ci0gICAgLyoqIE9yaWdpbmFsIEFjdGl2aXR5IGNsYXNzIG5hbWUgc3Vic3RpdHV0aW9uIHN0cmluZyB1c2VkIGluIGNsYXNzIHRlbXBsYXRlcywgaS5lLgotICAgICAqICJBQ1RJVklUWV9URVNURURfQ0xBU1NfTkFNRSIuKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfQUNUSVZJVFlfVEVTVEVEX0NMQVNTX05BTUUgPSAiQUNUSVZJVFlfVEVTVEVEX0NMQVNTX05BTUUiOwotICAgIC8qKiBQcm9qZWN0IG5hbWUgc3Vic3RpdHV0aW9uIHN0cmluZyB1c2VkIGluIHRlbXBsYXRlIGZpbGVzLCBpLmUuICJQUk9KRUNUX05BTUUiLiAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQSF9QUk9KRUNUX05BTUUgPSAiUFJPSkVDVF9OQU1FIjsKLSAgICAvKiogQXBwbGljYXRpb24gaWNvbiBzdWJzdGl0dXRpb24gc3RyaW5nIHVzZWQgaW4gdGhlIG1hbmlmZXN0IHRlbXBsYXRlICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0lDT04gPSAiSUNPTiI7Ci0KLSAgICAvKiogUGF0dGVybiBmb3IgY2hhcmFjdGVycyBhY2NlcHRlZCBpbiBhIHByb2plY3QgbmFtZS4gU2luY2UgdGhpcyB3aWxsIGJlIHVzZWQgYXMgYQotICAgICAqIGRpcmVjdG9yeSBuYW1lLCB3ZSdyZSBiZWluZyBhIGJpdCBjb25zZXJ2YXRpdmUgb24gcHVycG9zZTogZG90IGFuZCBzcGFjZSBjYW5ub3QgYmUgdXNlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVfUFJPSkVDVF9OQU1FID0gUGF0dGVybi5jb21waWxlKCJbYS16QS1aMC05X10rIik7Ci0gICAgLyoqIExpc3Qgb2YgdmFsaWQgY2hhcmFjdGVycyBmb3IgYSBwcm9qZWN0IG5hbWUuIFVzZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNfUFJPSkVDVF9OQU1FID0gImEteiBBLVogMC05IF8iOwotCi0gICAgLyoqIFBhdHRlcm4gZm9yIGNoYXJhY3RlcnMgYWNjZXB0ZWQgaW4gYSBwYWNrYWdlIG5hbWUuIEEgcGFja2FnZSBpcyBsaXN0IG9mIEphdmEgaWRlbnRpZmllcgotICAgICAqIHNlcGFyYXRlZCBieSBhIGRvdC4gV2UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBkb3QgKGUuZy4gYSB0d28tbGV2ZWwgcGFja2FnZSBuYW1lKS4KLSAgICAgKiBBIEphdmEgaWRlbnRpZmllciBjYW5ub3Qgc3RhcnQgYnkgYSBkaWdpdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVfUEFDS0FHRV9OQU1FID0KLSAgICAgICAgUGF0dGVybi5jb21waWxlKCJbYS16QS1aX11bYS16QS1aMC05X10qKD86XFwuW2EtekEtWl9dW2EtekEtWjAtOV9dKikrIik7Ci0gICAgLyoqIExpc3Qgb2YgdmFsaWQgY2hhcmFjdGVycyBmb3IgYSBwcm9qZWN0IG5hbWUuIFVzZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMuICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNfUEFDS0FHRV9OQU1FID0gImEteiBBLVogMC05IF8iOwotCi0gICAgLyoqIFBhdHRlcm4gZm9yIGNoYXJhY3RlcnMgYWNjZXB0ZWQgaW4gYW4gYWN0aXZpdHkgbmFtZSwgd2hpY2ggaXMgYSBKYXZhIGlkZW50aWZpZXIuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFX0FDVElWSVRZX05BTUUgPQotICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlthLXpBLVpfXVthLXpBLVowLTlfXSoiKTsKLSAgICAvKiogTGlzdCBvZiB2YWxpZCBjaGFyYWN0ZXJzIGZvciBhIHByb2plY3QgbmFtZS4gVXNlZCBmb3IgZGlzcGxheSBwdXJwb3Nlcy4gKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU19BQ1RJVklUWV9OQU1FID0gImEteiBBLVogMC05IF8iOwotCi0KLSAgICBwdWJsaWMgZW51bSBPdXRwdXRMZXZlbCB7Ci0gICAgICAgIC8qKiBTaWxlbnQgbW9kZS4gUHJvamVjdCBjcmVhdGlvbiB3aWxsIG9ubHkgZGlzcGxheSBlcnJvcnMuICovCi0gICAgICAgIFNJTEVOVCwKLSAgICAgICAgLyoqIE5vcm1hbCBtb2RlLiBQcm9qZWN0IGNyZWF0aW9uIHdpbGwgZGlzcGxheSB3aGF0J3MgYmVpbmcgZG9uZSwgZGlzcGxheQotICAgICAgICAgKiBlcnJvciBidXQgbm90IHdhcm5pbmdzLiAqLwotICAgICAgICBOT1JNQUwsCi0gICAgICAgIC8qKiBWZXJib3NlIG1vZGUuIFByb2plY3QgY3JlYXRpb24gd2lsbCBkaXNwbGF5IHdoYXQncyBiZWluZyBkb25lLCBlcnJvcnMgYW5kIHdhcm5pbmdzLiAqLwotICAgICAgICBWRVJCT1NFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIHByb2plY3QgY3JlYXRpb24gZmFpbHMsIHR5cGljYWxseSBiZWNhdXNlIGEgdGVtcGxhdGUKLSAgICAgKiBmaWxlIGNhbm5vdCBiZSB3cml0dGVuLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RDcmVhdGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgICAgICAvKiogZGVmYXVsdCBVSUQuIFRoaXMgd2lsbCBub3QgYmUgc2VyaWFsaXplZCBhbnl3YXkuICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb2plY3RDcmVhdGVFeGNlcHRpb24oVGhyb3dhYmxlIHQsIFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICBzdXBlcihmb3JtYXQgIT0gbnVsbCA/IFN0cmluZy5mb3JtYXQoZm9ybWF0LCBhcmdzKSA6IGZvcm1hdCwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgICAgICBzdXBlcihTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRMZXZlbCBtTGV2ZWw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElTZGtMb2cgbUxvZzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU2RrRm9sZGVyOwotCi0gICAgcHVibGljIFByb2plY3RDcmVhdG9yKFN0cmluZyBzZGtGb2xkZXIsIE91dHB1dExldmVsIGxldmVsLCBJU2RrTG9nIGxvZykgewotICAgICAgICBtU2RrRm9sZGVyID0gc2RrRm9sZGVyOwotICAgICAgICBtTGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgbUxvZyA9IGxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGFuZCBzYW5pdGl6ZWQgdGhlIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9sZGVyUGF0aCB0aGUgZm9sZGVyIG9mIHRoZSBwcm9qZWN0IHRvIGNyZWF0ZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIFRoZSBuYW1lIG11c3QgbWF0Y2ggdGhlCi0gICAgICogICAgICAgICAge0BsaW5rICNSRV9QUk9KRUNUX05BTUV9IHJlZ2V4LgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgcGFja2FnZSBvZiB0aGUgcHJvamVjdC4gVGhlIG5hbWUgbXVzdCBtYXRjaCB0aGUKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI1JFX1BBQ0tBR0VfTkFNRX0gcmVnZXguCi0gICAgICogQHBhcmFtIGFjdGl2aXR5RW50cnkgdGhlIGFjdGl2aXR5IG9mIHRoZSBwcm9qZWN0IGFzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSBtYW5pZmVzdC4gQ2FuIGJlCi0gICAgICogICAgICAgICAgbnVsbCBpZiBubyBhY3Rpdml0eSBzaG91bGQgYmUgY3JlYXRlZC4gVGhlIG5hbWUgbXVzdCBtYXRjaCB0aGUKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI1JFX0FDVElWSVRZX05BTUV9IHJlZ2V4LgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHByb2plY3QgdGFyZ2V0LgotICAgICAqIEBwYXJhbSBwYXRoVG9NYWluUHJvamVjdCBpZiBub24tbnVsbCB0aGUgcHJvamVjdCB3aWxsIGJlIHNldHVwIHRvIHRlc3QgYSBtYWluIHByb2plY3QKLSAgICAgKiBsb2NhdGVkIGF0IHRoZSBnaXZlbiBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVByb2plY3QoU3RyaW5nIGZvbGRlclBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5RW50cnksIElBbmRyb2lkVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgICAgIFN0cmluZyBwYXRoVG9NYWluUHJvamVjdCkgewotCi0gICAgICAgIC8vIGNyZWF0ZSBwcm9qZWN0IGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdAotICAgICAgICBGaWxlIHByb2plY3RGb2xkZXIgPSBuZXcgRmlsZShmb2xkZXJQYXRoKTsKLSAgICAgICAgaWYgKCFwcm9qZWN0Rm9sZGVyLmV4aXN0cygpKSB7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjcmVhdGVkID0gcHJvamVjdEZvbGRlci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdCA9IGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjcmVhdGVkKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbigiQ3JlYXRlZCBwcm9qZWN0IGRpcmVjdG9yeTogJTEkcyIsIHByb2plY3RGb2xkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTG9nLmVycm9yKHQsICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeTogJTEkcyIsIHByb2plY3RGb2xkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbnRlbnQgPSBwcm9qZWN0Rm9sZGVyLmxpc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gIlByb2plY3QgZm9sZGVyICclMSRzJyBpcyBub3QgYSBkaXJlY3RvcnkuIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiUHJvamVjdCBmb2xkZXIgJyUxJHMnIGlzIG5vdCBlbXB0eS4gUGxlYXNlIGNvbnNpZGVyIHVzaW5nICclMiRzIHVwZGF0ZScgaW5zdGVhZC4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCB8fCBlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxvZy5lcnJvcihlLCBlcnJvciwgcHJvamVjdEZvbGRlciwgU2RrQ29uc3RhbnRzLmFuZHJvaWRDbWROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNUZXN0UHJvamVjdCA9IHBhdGhUb01haW5Qcm9qZWN0ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLgotCi0gICAgICAgICAgICAvLyBsb2NhdGlvbiBvZiB0aGUgU0RLIGdvZXMgaW4gbG9jYWxQcm9wZXJ0eQotICAgICAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgbG9jYWxQcm9wZXJ0aWVzID0gUHJvamVjdFByb3BlcnRpZXMuY3JlYXRlKGZvbGRlclBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5MT0NBTCk7Ci0gICAgICAgICAgICBsb2NhbFByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfU0RLLCBtU2RrRm9sZGVyKTsKLSAgICAgICAgICAgIGxvY2FsUHJvcGVydGllcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIC8vIHRhcmdldCBnb2VzIGluIGRlZmF1bHQgcHJvcGVydGllcwotICAgICAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgZGVmYXVsdFByb3BlcnRpZXMgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUoZm9sZGVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkRFRkFVTFQpOwotICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMuc2V0QW5kcm9pZFRhcmdldCh0YXJnZXQpOwotICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMuc2F2ZSgpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBidWlsZC5wcm9wZXJ0aWVzIGZpbGUgd2l0aCBqdXN0IHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlCi0gICAgICAgICAgICBQcm9qZWN0UHJvcGVydGllcyBidWlsZFByb3BlcnRpZXMgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUoZm9sZGVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkJVSUxEKTsKLQotICAgICAgICAgICAgLy8gb25seSBwdXQgYXBwbGljYXRpb24ucGFja2FnZSBmb3Igb2xkZXIgdGFyZ2V0IHdoZXJlIHRoZSBydWxlcyBmaWxlIGRpZG4ndC4KLSAgICAgICAgICAgIC8vIGdyYWIgaXQgdGhyb3VnaCB4cGF0aAotICAgICAgICAgICAgaWYgKHRhcmdldC5nZXRWZXJzaW9uKCkuZ2V0QXBpTGV2ZWwoKSA8IDQpIHsKLSAgICAgICAgICAgICAgICBidWlsZFByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfQVBQX1BBQ0tBR0UsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzVGVzdFByb2plY3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZFByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfVEVTVEVEX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoVG9NYWluUHJvamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkUHJvcGVydGllcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWFwIGZvciBwbGFjZS1ob2xkZXJzIG9mIHZhbHVlcyB0byByZXBsYWNlIGluIHRoZSB0ZW1wbGF0ZXMKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGtleXdvcmRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcmVxdWlyZWQgZm9sZGVycy4KLSAgICAgICAgICAgIC8vIGNvbXB1dGUgc3JjIGZvbGRlciBwYXRoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZVBhdGggPQotICAgICAgICAgICAgICAgIHN0cmlwU3RyaW5nKHBhY2thZ2VOYW1lLnJlcGxhY2UoIi4iLCBGaWxlLnNlcGFyYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gICAgICAgICAgICAvLyBwdXQgdGhpcyBwYXRoIGluIHRoZSBwbGFjZS1ob2xkZXIgbWFwIGZvciBwcm9qZWN0IGZpbGVzIHRoYXQgbmVlZHMgdG8gbGlzdAotICAgICAgICAgICAgLy8gZmlsZXMgbWFudWFsbHkuCi0gICAgICAgICAgICBrZXl3b3Jkcy5wdXQoUEhfSkFWQV9GT0xERVIsIHBhY2thZ2VQYXRoKTsKLSAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9QQUNLQUdFLCBwYWNrYWdlTmFtZSk7Ci0KLQotICAgICAgICAgICAgLy8gY29tcHV0ZSBzb21lIGFjdGl2aXR5IHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFN0cmluZyBmcUFjdGl2aXR5TmFtZSA9IG51bGwsIGFjdGl2aXR5UGF0aCA9IG51bGwsIGFjdGl2aXR5Q2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbEFjdGl2aXR5RW50cnkgPSBhY3Rpdml0eUVudHJ5OwotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQWN0aXZpdHlDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGFjdGl2aXR5RW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpc1Rlc3RQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBUZXN0IHNvIHRoYXQgaXQgZG9lc24ndCBjb2xsaWRlIHdpdGggdGhlIG1haW4gcHJvamVjdCBhY3Rpdml0eS4KLSAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlFbnRyeSArPSAiVGVzdCI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjbGFzc25hbWUgZnJvbSB0aGUgb3JpZ2luYWwgYWN0aXZpdHkgZW50cnkuCi0gICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBvcmlnaW5hbEFjdGl2aXR5RW50cnkubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBY3Rpdml0eUNsYXNzTmFtZSA9IG9yaWdpbmFsQWN0aXZpdHlFbnRyeS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFjdGl2aXR5Q2xhc3NOYW1lID0gb3JpZ2luYWxBY3Rpdml0eUVudHJ5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgICAgICBmcUFjdGl2aXR5TmFtZSA9IEFuZHJvaWRNYW5pZmVzdC5jb21iaW5lUGFja2FnZUFuZENsYXNzTmFtZShwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5RW50cnkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhY3Rpdml0eSBwYXRoIChyZXBsYWNlIHRoZSAuIHRvIC8pCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlQYXRoID0gc3RyaXBTdHJpbmcoZnFBY3Rpdml0eU5hbWUucmVwbGFjZSgiLiIsIEZpbGUuc2VwYXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3Qgc2VnbWVudCwgc28gdGhhdCB3ZSBvbmx5IGhhdmUgdGhlIHBhdGggdG8gdGhlIGFjdGl2aXR5LCBidXQKLSAgICAgICAgICAgICAgICAvLyBub3QgdGhlIGFjdGl2aXR5IGZpbGVuYW1lIGl0c2VsZi4KLSAgICAgICAgICAgICAgICBhY3Rpdml0eVBhdGggPSBhY3Rpdml0eVBhdGguc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eVBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaW5hbGx5LCBnZXQgdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICAgICAgICAgIGFjdGl2aXR5Q2xhc3NOYW1lID0gZnFBY3Rpdml0eU5hbWUuc3Vic3RyaW5nKGZxQWN0aXZpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgZm9yIHRoZSBhY3Rpdml0eToKLSAgICAgICAgICAgIC8vIGFjdGl2aXR5RW50cnk6IHRoaXMgaXMgdGhlIG1hbmlmZXN0IGVudHJ5LiBGb3IgaW5zdGFuY2UgLk15QWN0aXZpdHkKLSAgICAgICAgICAgIC8vIGZxQWN0aXZpdHlOYW1lOiBmdWxsLXF1YWxpZmllZCBjbGFzcyBuYW1lOiBjb20uZm9vLk15QWN0aXZpdHkKLSAgICAgICAgICAgIC8vIGFjdGl2aXR5Q2xhc3NOYW1lOiBvbmx5IHRoZSBjbGFzc25hbWU6IE15QWN0aXZpdHkKLSAgICAgICAgICAgIC8vIG9yaWdpbmFsQWN0aXZpdHlDbGFzc05hbWU6IHRoZSBjbGFzc25hbWUgb2YgdGhlIGFjdGl2aXR5IGJlaW5nIHRlc3RlZCAoaWYgYXBwbGljYWJsZSkKLQotICAgICAgICAgICAgLy8gQWRkIHdoYXRldmVyIGFjdGl2aXR5IGluZm8gaXMgbmVlZGVkIGluIHRoZSBwbGFjZS1ob2xkZXIgbWFwLgotICAgICAgICAgICAgLy8gT2xkZXIgdGVtcGxhdGVzIG9ubHkgZXhwZWN0IEFDVElWSVRZX05BTUUgdG8gYmUgdGhlIHNhbWUgKGFuZCB1bm1vZGlmaWVkIGZvciB0ZXN0cykuCi0gICAgICAgICAgICBpZiAodGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlMZXZlbCgpIDwgNCkgeyAvLyBsZWdhY3kKLSAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxBY3Rpdml0eUVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5d29yZHMucHV0KFBIX0FDVElWSVRZX05BTUUsIG9yaWdpbmFsQWN0aXZpdHlFbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBuZXdlciB0ZW1wbGF0ZXMgbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWFuaWZlc3QgZW50cmllcywgY2xhc3NuYW1lcywKLSAgICAgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIHRoZSBtYWluIGFuZCB0ZXN0IGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5RW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZXl3b3Jkcy5wdXQoUEhfQUNUSVZJVFlfRU5UUllfTkFNRSwgYWN0aXZpdHlFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9BQ1RJVklUWV9DTEFTU19OQU1FLCBhY3Rpdml0eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9BQ1RJVklUWV9GUV9OQU1FLCBmcUFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEFjdGl2aXR5Q2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9BQ1RJVklUWV9URVNURURfQ0xBU1NfTkFNRSwgb3JpZ2luYWxBY3Rpdml0eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRha2UgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaWYgdGhlcmUncyBvbmUKLSAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAga2V5d29yZHMucHV0KFBIX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFjdGl2aXR5IGNsYXNzIG5hbWUgYXMgcHJvamVjdCBuYW1lCi0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9QUk9KRUNUX05BTUUsIGFjdGl2aXR5Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGEgcHJvamVjdCBuYW1lLiBKdXN0IHBpY2sgdXAgdGhlIGJhc2VuYW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0Rm9sZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAga2V5d29yZHMucHV0KFBIX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgIGlmIChhY3Rpdml0eUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNyY0FjdGl2aXR5Rm9sZGVyUGF0aCA9IFNka0NvbnN0YW50cy5GRF9TT1VSQ0VTICsgRmlsZS5zZXBhcmF0b3IgKyBhY3Rpdml0eVBhdGg7Ci0gICAgICAgICAgICAgICAgRmlsZSBzb3VyY2VGb2xkZXIgPSBjcmVhdGVEaXJzKHByb2plY3RGb2xkZXIsIHNyY0FjdGl2aXR5Rm9sZGVyUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVRlbXBsYXRlID0gaXNUZXN0UHJvamVjdCA/ICJqYXZhX3Rlc3RzX2ZpbGUudGVtcGxhdGUiCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICJqYXZhX2ZpbGUudGVtcGxhdGUiOwotICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpdml0eUZpbGVOYW1lID0gYWN0aXZpdHlDbGFzc05hbWUgKyAiLmphdmEiOwotCi0gICAgICAgICAgICAgICAgaW5zdGFsbFRlbXBsYXRlKGphdmFUZW1wbGF0ZSwgbmV3IEZpbGUoc291cmNlRm9sZGVyLCBhY3Rpdml0eUZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCB0YXJnZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYXQgbGVhc3QgY3JlYXRlICdzcmMnCi0gICAgICAgICAgICAgICAgY3JlYXRlRGlycyhwcm9qZWN0Rm9sZGVyLCBTZGtDb25zdGFudHMuRkRfU09VUkNFUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBvdGhlciB1c2VmdWwgZm9sZGVycwotICAgICAgICAgICAgRmlsZSByZXNvdXJjZUZvbGRlciA9IGNyZWF0ZURpcnMocHJvamVjdEZvbGRlciwgU2RrQ29uc3RhbnRzLkZEX1JFU09VUkNFUyk7Ci0gICAgICAgICAgICBjcmVhdGVEaXJzKHByb2plY3RGb2xkZXIsIFNka0NvbnN0YW50cy5GRF9PVVRQVVQpOwotICAgICAgICAgICAgY3JlYXRlRGlycyhwcm9qZWN0Rm9sZGVyLCBTZGtDb25zdGFudHMuRkRfTkFUSVZFX0xJQlMpOwotCi0gICAgICAgICAgICBpZiAoaXNUZXN0UHJvamVjdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8qIE1ha2UgcmVzIGZpbGVzIG9ubHkgZm9yIG5vbiB0ZXN0IHByb2plY3RzICovCi0gICAgICAgICAgICAgICAgRmlsZSB2YWx1ZUZvbGRlciA9IGNyZWF0ZURpcnMocmVzb3VyY2VGb2xkZXIsIFNka0NvbnN0YW50cy5GRF9WQUxVRVMpOwotICAgICAgICAgICAgICAgIGluc3RhbGxUZW1wbGF0ZSgic3RyaW5ncy50ZW1wbGF0ZSIsIG5ldyBGaWxlKHZhbHVlRm9sZGVyLCAic3RyaW5ncy54bWwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCB0YXJnZXQpOwotCi0gICAgICAgICAgICAgICAgRmlsZSBsYXlvdXRGb2xkZXIgPSBjcmVhdGVEaXJzKHJlc291cmNlRm9sZGVyLCBTZGtDb25zdGFudHMuRkRfTEFZT1VUKTsKLSAgICAgICAgICAgICAgICBpbnN0YWxsVGVtcGxhdGUoImxheW91dC50ZW1wbGF0ZSIsIG5ldyBGaWxlKGxheW91dEZvbGRlciwgIm1haW4ueG1sIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcywgdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgaWNvbnMKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbEljb25zKHJlc291cmNlRm9sZGVyLCB0YXJnZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9JQ09OLCAiYW5kcm9pZDppY29uPVwiQGRyYXdhYmxlL2ljb25cIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9JQ09OLCAiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBNYWtlIEFuZHJvaWRNYW5pZmVzdC54bWwgYW5kIGJ1aWxkLnhtbCBmaWxlcyAqLwotICAgICAgICAgICAgU3RyaW5nIG1hbmlmZXN0VGVtcGxhdGUgPSAiQW5kcm9pZE1hbmlmZXN0LnRlbXBsYXRlIjsKLSAgICAgICAgICAgIGlmIChpc1Rlc3RQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgbWFuaWZlc3RUZW1wbGF0ZSA9ICJBbmRyb2lkTWFuaWZlc3QudGVzdHMudGVtcGxhdGUiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnN0YWxsVGVtcGxhdGUobWFuaWZlc3RUZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocHJvamVjdEZvbGRlciwgU2RrQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1RfWE1MKSwKLSAgICAgICAgICAgICAgICAgICAga2V5d29yZHMsIHRhcmdldCk7Ci0KLSAgICAgICAgICAgIGluc3RhbGxUZW1wbGF0ZSgiYnVpbGQudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShwcm9qZWN0Rm9sZGVyLCBTZGtDb25zdGFudHMuRk5fQlVJTERfWE1MKSwKLSAgICAgICAgICAgICAgICAgICAga2V5d29yZHMpOwotICAgICAgICB9IGNhdGNoIChQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1Mb2cuZXJyb3IoZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1Mb2cuZXJyb3IoZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIHByb2plY3QuCi0gICAgICogPHAvPgotICAgICAqIFdvcmtmbG93OgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IENoZWNrIEFuZHJvaWRNYW5pZmVzdC54bWwgaXMgcHJlc2VudCAocmVxdWlyZWQpCi0gICAgICogPGxpPiBDaGVjayB0aGVyZSdzIGEgZGVmYXVsdC5wcm9wZXJ0aWVzIHdpdGggYSB0YXJnZXQgKm9yKiAtLXRhcmdldCB3YXMgc3BlY2lmaWVkCi0gICAgICogPGxpPiBVcGRhdGUgZGVmYXVsdC5wcm9wIGlmIC0tdGFyZ2V0IHdhcyBzcGVjaWZpZWQKLSAgICAgKiA8bGk+IFJlZnJlc2gvY3JlYXRlICJzZGsiIGluIGxvY2FsLnByb3BlcnRpZXMKLSAgICAgKiA8bGk+IEJ1aWxkLnhtbDogY3JlYXRlIGlmIG5vdCBwcmVzZW50IG9yIG5vIDxhbmRyb2lkaW5pdChcd3wvPikgaW4gaXQKLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIGZvbGRlclBhdGggdGhlIGZvbGRlciBvZiB0aGUgcHJvamVjdCB0byB1cGRhdGUuIFRoaXMgZm9sZGVyIG11c3QgZXhpc3QuCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgcHJvamVjdCB0YXJnZXQuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBUaGUgcHJvamVjdCBuYW1lIGZyb20gLS1uYW1lLiBDYW4gYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9qZWN0KFN0cmluZyBmb2xkZXJQYXRoLCBJQW5kcm9pZFRhcmdldCB0YXJnZXQsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIHVwZGF0ZSwgY2hlY2sgdGhlIGZvbGRlciBkb2VzIHBvaW50IHRvIGEgcHJvamVjdAotICAgICAgICBGaWxlIGFuZHJvaWRNYW5pZmVzdCA9IGNoZWNrUHJvamVjdEZvbGRlcihmb2xkZXJQYXRoKTsKLSAgICAgICAgaWYgKGFuZHJvaWRNYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHBhcmVudCBGaWxlLgotICAgICAgICBGaWxlIHByb2plY3RGb2xkZXIgPSBhbmRyb2lkTWFuaWZlc3QuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZXJlJ3MgYSBkZWZhdWx0LnByb3BlcnRpZXMgd2l0aCBhIHRhcmdldCAqb3IqIC0tdGFyZ2V0IHdhcyBzcGVjaWZpZWQKLSAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcHMgPSBQcm9qZWN0UHJvcGVydGllcy5sb2FkKGZvbGRlclBhdGgsIFByb3BlcnR5VHlwZS5ERUZBVUxUKTsKLSAgICAgICAgaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuZ2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfVEFSR0VUKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTG9nLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICJUaGVyZSBpcyBubyAlMSRzIGZpbGUgaW4gJyUyJHMnLiBQbGVhc2UgcHJvdmlkZSBhIC0tdGFyZ2V0IHRvIHRoZSAnJTMkcyB1cGRhdGUnIGNvbW1hbmQuIiwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkRFRkFVTFQuZ2V0RmlsZW5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLmFuZHJvaWRDbWROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0LnByb3AgaWYgLS10YXJnZXQgd2FzIHNwZWNpZmllZAotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGxvYWQgdGhlIGZpbGUgZWFybGllciwgaWYgdGhhdCBmYWlsZWQsIGNyZWF0ZSBpdC4KLSAgICAgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUoZm9sZGVyUGF0aCwgUHJvcGVydHlUeXBlLkRFRkFVTFQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgb3IgcmVwbGFjZSB0aGUgdGFyZ2V0Ci0gICAgICAgICAgICBwcm9wcy5zZXRBbmRyb2lkVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb3BzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBwcmludGxuKCJVcGRhdGVkICUxJHMiLCBQcm9wZXJ0eVR5cGUuREVGQVVMVC5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtTG9nLmVycm9yKGUsICJGYWlsZWQgdG8gd3JpdGUgJTEkcyBmaWxlIGluICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuREVGQVVMVC5nZXRGaWxlbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVmcmVzaC9jcmVhdGUgInNkayIgaW4gbG9jYWwucHJvcGVydGllcwotICAgICAgICAvLyBiZWNhdXNlIHRoZSBmaWxlIG1heSBhbHJlYWR5IGV4aXN0cyBhbmQgY29udGFpbiBvdGhlciB2YWx1ZXMgKGxpa2UgYXBrIGNvbmZpZyksCi0gICAgICAgIC8vIHdlIGZpcnN0IHRyeSB0byBsb2FkIGl0LgotICAgICAgICBwcm9wcyA9IFByb2plY3RQcm9wZXJ0aWVzLmxvYWQoZm9sZGVyUGF0aCwgUHJvcGVydHlUeXBlLkxPQ0FMKTsKLSAgICAgICAgaWYgKHByb3BzID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BzID0gUHJvamVjdFByb3BlcnRpZXMuY3JlYXRlKGZvbGRlclBhdGgsIFByb3BlcnR5VHlwZS5MT0NBTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgb3IgcmVwbGFjZSB0aGUgc2RrIGxvY2F0aW9uLgotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQcm9qZWN0UHJvcGVydGllcy5QUk9QRVJUWV9TREssIG1TZGtGb2xkZXIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvcHMuc2F2ZSgpOwotICAgICAgICAgICAgcHJpbnRsbigiVXBkYXRlZCAlMSRzIiwgUHJvcGVydHlUeXBlLkxPQ0FMLmdldEZpbGVuYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtTG9nLmVycm9yKGUsICJGYWlsZWQgdG8gd3JpdGUgJTEkcyBmaWxlIGluICclMiRzJyIsCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5MT0NBTC5nZXRGaWxlbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBmb2xkZXJQYXRoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJ1aWxkLnhtbDogY3JlYXRlIGlmIG5vdCBwcmVzZW50IG9yIG5vIDxhbmRyb2lkaW5pdC8+IGluIGl0Ci0gICAgICAgIEZpbGUgYnVpbGRYbWwgPSBuZXcgRmlsZShwcm9qZWN0Rm9sZGVyLCBTZGtDb25zdGFudHMuRk5fQlVJTERfWE1MKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc0J1aWxkWG1sID0gcHJvamVjdE5hbWUgIT0gbnVsbCB8fCAhYnVpbGRYbWwuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghbmVlZHNCdWlsZFhtbCkgewotICAgICAgICAgICAgLy8gTG9vayBmb3IgZm9yIGEgY2xhc3NuYW1lPSJjb20uYW5kcm9pZC5hbnQuU2V0dXBUYXNrIiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5lZWRzQnVpbGRYbWwgPSAhY2hlY2tGaWxlQ29udGFpbnNSZWdleHAoYnVpbGRYbWwsCi0gICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWU9XCJjb20uYW5kcm9pZC5hbnQuU2V0dXBUYXNrXCIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAoIW5lZWRzQnVpbGRYbWwpIHsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAiPHNldHVwIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhIHdoaXRlc3BhY2UsIGEgIi8iIChmb3IgdGhlCi0gICAgICAgICAgICAvLyBYTUwgLz4gY2xvc2luZyB0YWcpIG9yIGFuIGVuZC1vZi1saW5lLiBUaGlzIHdheSB3ZSBrbm93IHRoZSBYTUwgdGFnIGlzIHJlYWxseSB0aGlzCi0gICAgICAgICAgICAvLyBvbmUgYW5kIGxhdGVyIHdlIHdpbGwgYmUgYWJsZSB0byB1c2UgYW4gImFuZHJvaWRpbml0MiIgdGFnIG9yIHN1Y2ggYXMgbmVjZXNzYXJ5LgotICAgICAgICAgICAgbmVlZHNCdWlsZFhtbCA9ICFjaGVja0ZpbGVDb250YWluc1JlZ2V4cChidWlsZFhtbCwgIjxzZXR1cCg/Olxcc3wvfCQpIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRzQnVpbGRYbWwpIHsKLSAgICAgICAgICAgIHByaW50bG4oIkZpbGUgJTEkcyBpcyB0b28gb2xkIGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLiIsIFNka0NvbnN0YW50cy5GTl9CVUlMRF9YTUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzQnVpbGRYbWwpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWFwIGZvciBwbGFjZS1ob2xkZXJzIG9mIHZhbHVlcyB0byByZXBsYWNlIGluIHRoZSB0ZW1wbGF0ZXMKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGtleXdvcmRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIC8vIFRha2UgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaWYgdGhlcmUncyBvbmUKLSAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAga2V5d29yZHMucHV0KFBIX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBleHRyYWN0UGFja2FnZUZyb21NYW5pZmVzdChhbmRyb2lkTWFuaWZlc3QsIGtleXdvcmRzKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuY29udGFpbnNLZXkoUEhfQUNUSVZJVFlfRU5UUllfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2aXR5ID0ga2V5d29yZHMuZ2V0KFBIX0FDVElWSVRZX0VOVFJZX05BTUUpOwotICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIG9ubHkgdGhlIGxhc3Qgc2VnbWVudCBpZiBhcHBsaWNhYmxlCi0gICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBhY3Rpdml0eS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9zICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSA9IGFjdGl2aXR5LnN1YnN0cmluZyhwb3MgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYWN0aXZpdHkgYXMgcHJvamVjdCBuYW1lCi0gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnB1dChQSF9QUk9KRUNUX05BTUUsIGFjdGl2aXR5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGEgcHJvamVjdCBuYW1lLiBKdXN0IHBpY2sgdXAgdGhlIGJhc2VuYW1lIG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0Rm9sZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAga2V5d29yZHMucHV0KFBIX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1MZXZlbCA9PSBPdXRwdXRMZXZlbC5WRVJCT1NFKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbigiUmVnZW5lcmF0aW5nICUxJHMgd2l0aCBwcm9qZWN0IG5hbWUgJTIkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRk5fQlVJTERfWE1MLAotICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMuZ2V0KFBIX1BST0pFQ1RfTkFNRSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluc3RhbGxUZW1wbGF0ZSgiYnVpbGQudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocHJvamVjdEZvbGRlciwgU2RrQ29uc3RhbnRzLkZOX0JVSUxEX1hNTCksCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3Jkcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtTG9nLmVycm9yKGUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhIHRlc3QgcHJvamVjdCB3aXRoIGEgbmV3IHBhdGggdG8gdGhlIG1haW4gKHRlc3RlZCkgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gZm9sZGVyUGF0aCB0aGUgcGF0aCBvZiB0aGUgdGVzdCBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwYXRoVG9NYWluUHJvamVjdCB0aGUgcGF0aCB0byB0aGUgbWFpbiBwcm9qZWN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRlc3RQcm9qZWN0KGZpbmFsIFN0cmluZyBmb2xkZXJQYXRoLCBmaW5hbCBTdHJpbmcgcGF0aFRvTWFpblByb2plY3QpIHsKLSAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiB1cGRhdGUsIGNoZWNrIHRoZSBmb2xkZXIgZG9lcyBwb2ludCB0byBhIHByb2plY3QKLSAgICAgICAgaWYgKGNoZWNrUHJvamVjdEZvbGRlcihmb2xkZXJQYXRoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGUgcGF0aCB0byB0aGUgbWFpbiBwcm9qZWN0IGlzIHZhbGlkLgotICAgICAgICBGaWxlIG1haW5Qcm9qZWN0ID0gbmV3IEZpbGUocGF0aFRvTWFpblByb2plY3QpOwotICAgICAgICBTdHJpbmcgcmVzb2x2ZWRQYXRoOwotICAgICAgICBpZiAobWFpblByb2plY3QuaXNBYnNvbHV0ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtYWluUHJvamVjdCA9IG5ldyBGaWxlKGZvbGRlclBhdGgsIHBhdGhUb01haW5Qcm9qZWN0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gbWFpblByb2plY3QuZ2V0Q2Fub25pY2FsUGF0aCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG1Mb2cuZXJyb3IoZSwgIlVuYWJsZSB0byByZXNvbHZlIHBhdGggdG8gbWFpbiBwcm9qZWN0OiAlMSRzIiwgcGF0aFRvTWFpblByb2plY3QpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IG1haW5Qcm9qZWN0LmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRsbigiUmVzb2x2ZWQgbG9jYXRpb24gb2YgbWFpbiBwcm9qZWN0IHRvOiAlMSRzIiwgcmVzb2x2ZWRQYXRoKTsKLQotICAgICAgICAvLyBjaGVjayB0aGUgbWFpbiBwcm9qZWN0IGV4aXN0cwotICAgICAgICBpZiAoY2hlY2tQcm9qZWN0Rm9sZGVyKHJlc29sdmVkUGF0aCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvamVjdFByb3BlcnRpZXMgcHJvcHMgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUoZm9sZGVyUGF0aCwgUHJvcGVydHlUeXBlLkJVSUxEKTsKLQotICAgICAgICAvLyBzZXQgb3IgcmVwbGFjZSB0aGUgcGF0aCB0byB0aGUgbWFpbiBwcm9qZWN0Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX1RFU1RFRF9QUk9KRUNULCBwYXRoVG9NYWluUHJvamVjdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9wcy5zYXZlKCk7Ci0gICAgICAgICAgICBwcmludGxuKCJVcGRhdGVkICUxJHMiLCBQcm9wZXJ0eVR5cGUuQlVJTEQuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1Mb2cuZXJyb3IoZSwgIkZhaWxlZCB0byB3cml0ZSAlMSRzIGZpbGUgaW4gJyUyJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkJVSUxELmdldEZpbGVuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlclBhdGgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmUgPHZhcj5mb2xkZXJQYXRoPC92YXI+IGlzIGEgdmFsaWQgcHJvamVjdCBmb2xkZXIsIGFuZCByZXR1cm5zCi0gICAgICogYSB7QGxpbmsgRmlsZX0gdG8gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZS4KLSAgICAgKiA8cC8+VGhpcyBjaGVja3MgdGhhdCB0aGUgZm9sZGVyIGV4aXN0cyBhbmQgY29udGFpbnMgYW4gQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlIGluIGl0LgotICAgICAqIDxwLz5BbnkgZXJyb3IgYXJlIG91dHB1dCB1c2luZyB7QGxpbmsgI21Mb2d9LgotICAgICAqIEBwYXJhbSBmb2xkZXJQYXRoIHRoZSBmb2xkZXIgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHRvIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUsIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjaGVja1Byb2plY3RGb2xkZXIoU3RyaW5nIGZvbGRlclBhdGgpIHsKLSAgICAgICAgLy8gcHJvamVjdCBmb2xkZXIgbXVzdCBleGlzdCBhbmQgYmUgYSBkaXJlY3RvcnksIHNpbmNlIHRoaXMgaXMgYW4gdXBkYXRlCi0gICAgICAgIEZpbGUgcHJvamVjdEZvbGRlciA9IG5ldyBGaWxlKGZvbGRlclBhdGgpOwotICAgICAgICBpZiAoIXByb2plY3RGb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgbUxvZy5lcnJvcihudWxsLCAiUHJvamVjdCBmb2xkZXIgJyUxJHMnIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeSwgdGhpcyBpcyBub3QgYW4gQW5kcm9pZCBwcm9qZWN0IHlvdSBjYW4gdXBkYXRlLiIsCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3RGb2xkZXIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBBbmRyb2lkTWFuaWZlc3QueG1sIGlzIHByZXNlbnQKLSAgICAgICAgRmlsZSBhbmRyb2lkTWFuaWZlc3QgPSBuZXcgRmlsZShwcm9qZWN0Rm9sZGVyLCBTZGtDb25zdGFudHMuRk5fQU5EUk9JRF9NQU5JRkVTVF9YTUwpOwotICAgICAgICBpZiAoIWFuZHJvaWRNYW5pZmVzdC5pc0ZpbGUoKSkgewotICAgICAgICAgICAgbUxvZy5lcnJvcihudWxsLAotICAgICAgICAgICAgICAgICAgICAiJTEkcyBub3QgZm91bmQgaW4gJyUyJHMnLCB0aGlzIGlzIG5vdCBhbiBBbmRyb2lkIHByb2plY3QgeW91IGNhbiB1cGRhdGUuIiwKLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZOX0FORFJPSURfTUFOSUZFU1RfWE1MLAotICAgICAgICAgICAgICAgICAgICBmb2xkZXJQYXRoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWRNYW5pZmVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUgY29udGFpbnMgdGhlIHJlcXVlc3RlZCByZWdleHAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNvbnRhaW5zUmVnZXhwKEZpbGUgZmlsZSwgU3RyaW5nIHJlZ2V4cCkgewotICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXhwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0KLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocC5tYXRjaGVyKGxpbmUpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhICJmdWxsIiBwYWNrYWdlICYgYWN0aXZpdHkgbmFtZSBmcm9tIGFuIEFuZHJvaWRNYW5pZmVzdC54bWwuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBrZXl3b3JkcyBkaWN0aW9uYXJ5IGlzIGFsd2F5cyBmaWxlZCB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRoZSBrZXkge0BsaW5rICNQSF9QQUNLQUdFfS4KLSAgICAgKiBJZiBhbiBhY3Rpdml0eSBuYW1lIGNhbiBiZSBmb3VuZCwgaXQgaXMgZmlsZWQgdW5kZXIgdGhlIGtleSB7QGxpbmsgI1BIX0FDVElWSVRZX0VOVFJZX05BTUV9LgotICAgICAqIFdoZW4gbm8gYWN0aXZpdHkgaXMgZm91bmQsIHRoaXMga2V5IGlzIG5vdCBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hbmlmZXN0RmlsZSBUaGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlCi0gICAgICogQHBhcmFtIG91dEtleXdvcmRzICBQbGFjZSB3aGVyZSB0byBwdXQgdGhlIG91dCBwYXJhbWV0ZXJzOiBwYWNrYWdlIGFuZCBhY3Rpdml0eSBuYW1lcy4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBhY2thZ2UvYWN0aXZpdHkgd2FzIHBhcnNlZCBhbmQgdXBkYXRlZCBpbiB0aGUga2V5d29yZCBkaWN0aW9uYXJ5LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBleHRyYWN0UGFja2FnZUZyb21NYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3V0S2V5d29yZHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhQYXRoIHhwYXRoID0gQW5kcm9pZFhQYXRoRmFjdG9yeS5uZXdYUGF0aCgpOwotCi0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIobWFuaWZlc3RGaWxlKSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB4cGF0aC5ldmFsdWF0ZSgiL21hbmlmZXN0L0BwYWNrYWdlIiwgc291cmNlKTsKLQotICAgICAgICAgICAgc291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG1hbmlmZXN0RmlsZSkpOwotCi0gICAgICAgICAgICAvLyBTZWxlY3QgdGhlICJhbmRyb2lkOm5hbWUiIGF0dHJpYnV0ZSBvZiBhbGwgPGFjdGl2aXR5PiBub2RlcyBidXQgb25seSBpZiB0aGV5Ci0gICAgICAgICAgICAvLyBjb250YWluIGEgc3ViLW5vZGUgPGludGVudC1maWx0ZXI+PGFjdGlvbj4gd2l0aCBhbiAiYW5kcm9pZDpuYW1lIiBhdHRyaWJ1dGUgd2hpY2gKLSAgICAgICAgICAgIC8vIGlzICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicgYW5kIGFuIDxpbnRlbnQtZmlsdGVyPjxjYXRlZ29yeT4gd2l0aCBhbgotICAgICAgICAgICAgLy8gImFuZHJvaWQ6bmFtZSIgYXR0cmlidXRlIHdoaWNoIGlzICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicKLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gU3RyaW5nLmZvcm1hdCgiL21hbmlmZXN0L2FwcGxpY2F0aW9uL2FjdGl2aXR5IiArCi0gICAgICAgICAgICAgICAgICAgICJbaW50ZW50LWZpbHRlci9hY3Rpb24vQCUxJHM6bmFtZT0nYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgImludGVudC1maWx0ZXIvY2F0ZWdvcnkvQCUxJHM6bmFtZT0nYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInXSIgKwotICAgICAgICAgICAgICAgICAgICAiL0AlMSRzOm5hbWUiLCBBbmRyb2lkWFBhdGhGYWN0b3J5LkRFRkFVTFRfTlNfUFJFRklYKTsKLQotICAgICAgICAgICAgTm9kZUxpc3QgYWN0aXZpdHlOYW1lcyA9IChOb2RlTGlzdCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgc291cmNlLAotICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnN0YW50cy5OT0RFU0VUKTsKLQotICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGJvdGggWFBhdGggZXhwcmVzc2lvbnMgd2VyZSB2YWxpZCBzbyB3ZSdyZSBtb3N0IGxpa2VseSBkZWFsaW5nCi0gICAgICAgICAgICAvLyB3aXRoIGFuIGFjdHVhbCBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuIFRoZSBub2RlcyBtYXkgbm90IGhhdmUgdGhlIHJlcXVlc3RlZAotICAgICAgICAgICAgLy8gYXR0cmlidXRlcyB0aG91Z2gsIGlmIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIHdhcm4uCi0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtTG9nLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyA8bWFuaWZlc3QgcGFja2FnZT1cIi4uLlwiPiBpbiAnJTEkcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGFjdGl2aXR5IHRoYXQgbWF0Y2hlZCBlYXJsaWVyLiBJZiB0aGVyZSBpcyBubyBhY3Rpdml0eSwKLSAgICAgICAgICAgIC8vIGFjdGl2aXR5TmFtZSBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGUgZ2VuZXJhdGVkICJjb21iaW5lZCIgbmFtZQotICAgICAgICAgICAgLy8gd2lsbCBiZSBpbiB0aGUgZm9ybSAicGFja2FnZS4iICh3aXRoIGEgZG90IGF0IHRoZSBlbmQpLgotICAgICAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKGFjdGl2aXR5TmFtZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lcy5pdGVtKDApLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxldmVsID09IE91dHB1dExldmVsLlZFUkJPU0UgJiYgYWN0aXZpdHlOYW1lcy5nZXRMZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBwcmludGxuKCJXQVJOSU5HOiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2aXR5IGRlZmluZWQgaW4gJyUxJHMnLlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiT25seSB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgdXNlZC4gSWYgdGhpcyBpcyBub3QgYXBwcm9wcmlhdGUsIHlvdSBuZWVkXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0byBzcGVjaWZ5IG9uZSBvZiB0aGVzZSB2YWx1ZXMgbWFudWFsbHkgaW5zdGVhZDoiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2aXR5TmFtZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGFjdGl2aXR5TmFtZXMuaXRlbShpKS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNvbWJpbmVQYWNrYWdlQWN0aXZpdHlOYW1lcyhwYWNrYWdlTmFtZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4oIi0gJTEkcyIsIG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFjdGl2aXR5TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUxvZy53YXJuaW5nKCJNaXNzaW5nIDxhY3Rpdml0eSAlMSRzOm5hbWU9XCIuLi5cIj4gaW4gJyUyJHMnLlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm8gYWN0aXZpdHkgd2lsbCBiZSBnZW5lcmF0ZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRYUGF0aEZhY3RvcnkuREVGQVVMVF9OU19QUkVGSVgsIG1hbmlmZXN0RmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRLZXl3b3Jkcy5wdXQoUEhfQUNUSVZJVFlfRU5UUllfTkFNRSwgYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0S2V5d29yZHMucHV0KFBIX1BBQ0tBR0UsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1Mb2cuZXJyb3IoZSwgIkZhaWxlZCB0byByZWFkICUxJHMiLCBtYW5pZmVzdEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgbUxvZy5lcnJvcih0ID09IG51bGwgPyBlIDogdCwKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSAlMSRzIiwKLSAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tYmluZVBhY2thZ2VBY3Rpdml0eU5hbWVzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICAvLyBBY3Rpdml0eSBOYW1lIGNhbiBoYXZlIDMgZm9ybXM6Ci0gICAgICAgIC8vIC0gIi5OYW1lIiBtZWFucyB0aGlzIGlzIGEgY2xhc3MgbmFtZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lLgotICAgICAgICAvLyAgICBUaGUgZnVsbCBGUUNOIGlzIHRodXMgcGFja2FnZU5hbWUgKyAiLk5hbWUiCi0gICAgICAgIC8vIC0gIk5hbWUiIGlzIGFuIG9sZGVyIHZhcmlhbnQgb2YgdGhlIGZvcm1lci4gRnVsbCBGUUNOIGlzIHBhY2thZ2VOYW1lICsgIi4iICsgIk5hbWUiCi0gICAgICAgIC8vIC0gImNvbS5ibGFoLk5hbWUiIGlzIGEgZnVsbCBGUUNOLiBJZ25vcmUgcGFja2FnZU5hbWUgYW5kIHVzZSBhY3Rpdml0eU5hbWUgYXMtaXMuCi0gICAgICAgIC8vICAgVG8gYmUgdmFsaWQsIHRoZSBwYWNrYWdlIG5hbWUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdHdvIGNvbXBvbmVudHMuIFRoaXMgaXMgY2hlY2tlZAotICAgICAgICAvLyAgIGxhdGVyIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIGJ1aWxkLnhtbCBmaWxlLCBzbyB3ZSBqdXN0IG5lZWQgdG8gZGV0ZWN0IHRoZXJlJ3MKLSAgICAgICAgLy8gICBhIGRvdCBidXQgbm90IGF0IHBvcz09MC4KLQotICAgICAgICBpbnQgcG9zID0gYWN0aXZpdHlOYW1lLmluZGV4T2YoJy4nKTsKLSAgICAgICAgaWYgKHBvcyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyBhY3Rpdml0eU5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5TmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIGFjdGl2aXR5TmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIGEgbmV3IGZpbGUgdGhhdCBpcyBiYXNlZCBvbiBhIHRlbXBsYXRlIGZpbGUgcHJvdmlkZWQgYnkgYSBnaXZlbiB0YXJnZXQuCi0gICAgICogRWFjaCBtYXRjaCBvZiBlYWNoIGtleSBmcm9tIHRoZSBwbGFjZS1ob2xkZXIgbWFwIGluIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzCi0gICAgICogY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgY3JlYXRlZCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRlbXBsYXRlTmFtZSB0aGUgbmFtZSBvZiB0byB0aGUgdGVtcGxhdGUgZmlsZQotICAgICAqIEBwYXJhbSBkZXN0RmlsZSB0aGUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gcGxhY2Vob2xkZXJNYXAgYSBtYXAgb2YgKHBsYWNlLWhvbGRlciwgdmFsdWUpIHRvIGNyZWF0ZSB0aGUgZmlsZSBmcm9tIHRoZSB0ZW1wbGF0ZS4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBUYXJnZXQgb2YgdGhlIHByb2plY3QgdGhhdCB3aWxsIGJlIHByb3ZpZGluZyB0aGUgdGVtcGxhdGUuCi0gICAgICogQHRocm93cyBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lLCBGaWxlIGRlc3RGaWxlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwbGFjZWhvbGRlck1hcCwgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KQotICAgICAgICAgICAgdGhyb3dzIFByb2plY3RDcmVhdGVFeGNlcHRpb24gewotICAgICAgICAvLyBxdWVyeSB0aGUgdGFyZ2V0IGZvciBpdHMgdGVtcGxhdGUgZGlyZWN0b3J5Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZUZvbGRlciA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlRFTVBMQVRFUyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoID0gdGVtcGxhdGVGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIHRlbXBsYXRlTmFtZTsKLQotICAgICAgICBpbnN0YWxsRnVsbFBhdGhUZW1wbGF0ZShzb3VyY2VQYXRoLCBkZXN0RmlsZSwgcGxhY2Vob2xkZXJNYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIGEgbmV3IGZpbGUgdGhhdCBpcyBiYXNlZCBvbiBhIHRlbXBsYXRlIGZpbGUgcHJvdmlkZWQgYnkgdGhlIHRvb2xzIGZvbGRlci4KLSAgICAgKiBFYWNoIG1hdGNoIG9mIGVhY2gga2V5IGZyb20gdGhlIHBsYWNlLWhvbGRlciBtYXAgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMKLSAgICAgKiBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBjcmVhdGVkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVtcGxhdGVOYW1lIHRoZSBuYW1lIG9mIHRvIHRoZSB0ZW1wbGF0ZSBmaWxlCi0gICAgICogQHBhcmFtIGRlc3RGaWxlIHRoZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdAotICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlck1hcCBhIG1hcCBvZiAocGxhY2UtaG9sZGVyLCB2YWx1ZSkgdG8gY3JlYXRlIHRoZSBmaWxlIGZyb20gdGhlIHRlbXBsYXRlLgotICAgICAqIEB0aHJvd3MgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSwgRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGxhY2Vob2xkZXJNYXApCi0gICAgICAgICAgICB0aHJvd3MgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHF1ZXJ5IHRoZSB0YXJnZXQgZm9yIGl0cyB0ZW1wbGF0ZSBkaXJlY3RvcnkKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlRm9sZGVyID0gbVNka0ZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19MSUJfRk9MREVSOwotICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlUGF0aCA9IHRlbXBsYXRlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyB0ZW1wbGF0ZU5hbWU7Ci0KLSAgICAgICAgaW5zdGFsbEZ1bGxQYXRoVGVtcGxhdGUoc291cmNlUGF0aCwgZGVzdEZpbGUsIHBsYWNlaG9sZGVyTWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YWxscyBhIG5ldyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gYSB0ZW1wbGF0ZS4KLSAgICAgKiBFYWNoIG1hdGNoIG9mIGVhY2gga2V5IGZyb20gdGhlIHBsYWNlLWhvbGRlciBtYXAgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMKLSAgICAgKiBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBjcmVhdGVkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlUGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2UgdGVtcGxhdGUgZmlsZQotICAgICAqIEBwYXJhbSBkZXN0RmlsZSB0aGUgZGVzdGluYXRpb24gZmlsZQotICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlck1hcCBhIG1hcCBvZiAocGxhY2UtaG9sZGVyLCB2YWx1ZSkgdG8gY3JlYXRlIHRoZSBmaWxlIGZyb20gdGhlIHRlbXBsYXRlLgotICAgICAqIEB0aHJvd3MgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsRnVsbFBhdGhUZW1wbGF0ZShTdHJpbmcgc291cmNlUGF0aCwgRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGxhY2Vob2xkZXJNYXApIHRocm93cyBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIGV4aXN0ZWQgPSBkZXN0RmlsZS5leGlzdHMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGRlc3RGaWxlKSk7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzb3VyY2VQYXRoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLQotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHBsYWNlaG9sZGVyTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGtleSwgcGxhY2Vob2xkZXJNYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGxpbmUpOwotICAgICAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uKGUsICJDb3VsZCBub3QgYWNjZXNzICUxJHM6ICUyJHMiLAotICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRsbigiJTEkcyBmaWxlICUyJHMiLAotICAgICAgICAgICAgICAgIGV4aXN0ZWQgPyAiVXBkYXRlZCIgOiAiQWRkZWQiLAotICAgICAgICAgICAgICAgIGRlc3RGaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YWxscyB0aGUgcHJvamVjdCBpY29ucy4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VGb2xkZXIgdGhlIHJlc291cmNlIGZvbGRlcgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBvZiB0aGUgcHJvamVjdC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IGljb24gd2FzIGluc3RhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5zdGFsbEljb25zKEZpbGUgcmVzb3VyY2VGb2xkZXIsIElBbmRyb2lkVGFyZ2V0IHRhcmdldCkKLSAgICAgICAgICAgIHRocm93cyBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcXVlcnkgdGhlIHRhcmdldCBmb3IgaXRzIHRlbXBsYXRlIGRpcmVjdG9yeQotICAgICAgICBTdHJpbmcgdGVtcGxhdGVGb2xkZXIgPSB0YXJnZXQuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5URU1QTEFURVMpOwotCi0gICAgICAgIGJvb2xlYW4gaW5zdGFsbGVkSWNvbiA9IGZhbHNlOwotCi0gICAgICAgIGluc3RhbGxlZEljb24gfD0gaW5zdGFsbEljb24odGVtcGxhdGVGb2xkZXIsICJpY29uX2hkcGkucG5nIiwgcmVzb3VyY2VGb2xkZXIsICJkcmF3YWJsZS1oZHBpIik7Ci0gICAgICAgIGluc3RhbGxlZEljb24gfD0gaW5zdGFsbEljb24odGVtcGxhdGVGb2xkZXIsICJpY29uX21kcGkucG5nIiwgcmVzb3VyY2VGb2xkZXIsICJkcmF3YWJsZS1tZHBpIik7Ci0gICAgICAgIGluc3RhbGxlZEljb24gfD0gaW5zdGFsbEljb24odGVtcGxhdGVGb2xkZXIsICJpY29uX2xkcGkucG5nIiwgcmVzb3VyY2VGb2xkZXIsICJkcmF3YWJsZS1sZHBpIik7Ci0KLSAgICAgICAgcmV0dXJuIGluc3RhbGxlZEljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdGFsbHMgYW4gSWNvbiBpbiB0aGUgcHJvamVjdC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGljb24gd2FzIGluc3RhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5zdGFsbEljb24oU3RyaW5nIHRlbXBsYXRlRm9sZGVyLCBTdHJpbmcgaWNvbk5hbWUsIEZpbGUgcmVzb3VyY2VGb2xkZXIsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIFByb2plY3RDcmVhdGVFeGNlcHRpb24gewotICAgICAgICBGaWxlIGljb24gPSBuZXcgRmlsZSh0ZW1wbGF0ZUZvbGRlciwgaWNvbk5hbWUpOwotICAgICAgICBpZiAoaWNvbi5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZSBkcmF3YWJsZSA9IGNyZWF0ZURpcnMocmVzb3VyY2VGb2xkZXIsIGZvbGRlck5hbWUpOwotICAgICAgICAgICAgaW5zdGFsbEJpbmFyeUZpbGUoaWNvbiwgbmV3IEZpbGUoZHJhd2FibGUsICJpY29uLnBuZyIpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbGxzIGEgYmluYXJ5IGZpbGUKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgZmlsZSB0byBjb3B5Ci0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHRvIHdyaXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxCaW5hcnlGaWxlKEZpbGUgc291cmNlLCBGaWxlIGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pOwotCi0gICAgICAgICAgICBpbnQgcmVhZDsKLSAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2UgY2hlY2sgYmVmb3JlLgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBuZXcgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbihlLCAiRmFpbGVkIHRvIHJlYWQgYmluYXJ5IGZpbGU6ICUxJHMiLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSBtZXNzYWdlIHVubGVzcyBzaWxlbmNlIGlzIGVuYWJsZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHtAbGluayBJU2RrTG9nI3ByaW50ZihTdHJpbmcsIE9iamVjdC4uLil9IGZyb20KLSAgICAgKiB7QGxpbmsgI21Mb2d9IGFmdGVyIHRlc3RpbmcgaWYgb3VwdXQgbGV2ZWwgaXMge0BsaW5rIE91dHB1dExldmVsI1ZFUkJPU0V9LgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCBGb3JtYXQgZm9yIFN0cmluZy5mb3JtYXQKLSAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgZm9yIFN0cmluZy5mb3JtYXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRsbihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBpZiAobUxldmVsICE9IE91dHB1dExldmVsLlNJTEVOVCkgewotICAgICAgICAgICAgaWYgKCFmb3JtYXQuZW5kc1dpdGgoIlxuIikpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0gIlxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Mb2cucHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlciwgYWxvbmcgd2l0aCBhbnkgcGFyZW50IGZvbGRlcnMgdGhhdCBkbyBub3QgZXhpc3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGZvbGRlcgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlLgotICAgICAqIEB0aHJvd3MgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjcmVhdGVEaXJzKEZpbGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIFByb2plY3RDcmVhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBGaWxlIG5ld0ZvbGRlciA9IG5ldyBGaWxlKHBhcmVudCwgbmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZXhpc3RlZEJlZm9yZSA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCFuZXdGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICghbmV3Rm9sZGVyLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAlMSRzIiwgbmV3Rm9sZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4aXN0ZWRCZWZvcmUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdGb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgaWYgKCFuZXdGb2xkZXIuY2FuV3JpdGUoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRlRXhjZXB0aW9uKCJQYXRoIGlzIG5vdCB3cml0YWJsZTogJTEkcyIsIG5ld0ZvbGRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbigiUGF0aCBpcyBub3QgYSBkaXJlY3Rvcnk6ICUxJHMiLCBuZXdGb2xkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFleGlzdGVkQmVmb3JlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByaW50bG4oIkNyZWF0ZWQgZGlyZWN0b3J5ICUxJHMiLCBuZXdGb2xkZXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNhbm9uaWNhbCBwYXRoIG9mIGNyZWF0ZWQgZGlyZWN0b3J5IiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3Rm9sZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmlwcyB0aGUgc3RyaW5nIG9mIGJlZ2lubmluZyBhbmQgdHJhaWxpbmcgY2hhcmFjdGVycyAobXVsdGlwbGUKLSAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgc3RyaXBwZWQsIGV4YW1wbGUgc3RyaXBTdHJpbmcoIi4udGVzdC4uLiIsICcuJykKLSAgICAgKiByZXN1bHRzIGluICJ0ZXN0IjsKLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gc3RyaXAKLSAgICAgKiBAcGFyYW0gc3RyaXAgdGhlIGNoYXJhY3RlciB0byBzdHJpcCBmcm9tIGJlZ2lubmluZyBhbmQgZW5kCi0gICAgICogQHJldHVybiB0aGUgc3RyaXBwZWQgc3RyaW5nIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgZXZlcnl0aGluZyBpcyBzdHJpcHBlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaXBTdHJpbmcoU3RyaW5nIHMsIGNoYXIgc3RyaXApIHsKLSAgICAgICAgZmluYWwgaW50IHNMZW4gPSBzLmxlbmd0aCgpOwotICAgICAgICBpbnQgbmV3U3RhcnQgPSAwLCBuZXdFbmQgPSBzTGVuIC0gMTsKLQotICAgICAgICB3aGlsZSAobmV3U3RhcnQgPCBzTGVuICYmIHMuY2hhckF0KG5ld1N0YXJ0KSA9PSBzdHJpcCkgewotICAgICAgICAgIG5ld1N0YXJ0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG5ld0VuZCA+PSAwICYmIHMuY2hhckF0KG5ld0VuZCkgPT0gc3RyaXApIHsKLSAgICAgICAgICBuZXdFbmQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIG5ld0VuZCBjb250YWlucyBhIGNoYXIgd2Ugd2FudCwgYW5kIHN1YnN0cmluZyB0YWtlcyBlbmQgYXMgYmVpbmcKLSAgICAgICAgICogZXhjbHVzaXZlCi0gICAgICAgICAqLwotICAgICAgICBuZXdFbmQrKzsKLQotICAgICAgICBpZiAobmV3U3RhcnQgPj0gc0xlbiB8fCBuZXdFbmQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcobmV3U3RhcnQsIG5ld0VuZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3Byb2plY3QvUHJvamVjdFByb3BlcnRpZXMuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjllNWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3Byb2plY3QvUHJvamVjdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBDbGFzcyB0byBsb2FkIGFuZCBzYXZlIHByb2plY3QgcHJvcGVydGllcyBmb3IgYm90aCBBRFQgYW5kIEFudC1iYXNlZCBidWlsZC4KLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0UHJvcGVydGllcyB7Ci0gICAgLyoqIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgcHJvamVjdCB0YXJnZXQgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9UQVJHRVQgPSAidGFyZ2V0IjsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX1NESyA9ICJzZGsuZGlyIjsKLSAgICAvLyBMRUdBQ1kgLSBjb21wYXRpYmlsaXR5IHdpdGggMS42IGFuZCBiZWZvcmUKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9TREtfTEVHQUNZID0gInNkay1sb2NhdGlvbiI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9BUFBfUEFDS0FHRSA9ICJhcHBsaWNhdGlvbi5wYWNrYWdlIjsKLSAgICAvLyBMRUdBQ1kgLSBjb21wYXRpYmlsaXR5IHdpdGggMS42IGFuZCBiZWZvcmUKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9BUFBfUEFDS0FHRV9MRUdBQ1kgPSAiYXBwbGljYXRpb24tcGFja2FnZSI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9TUExJVF9CWV9ERU5TSVRZID0gInNwbGl0LmRlbnNpdHkiOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfVEVTVEVEX1BST0pFQ1QgPSAidGVzdGVkLnByb2plY3QuZGlyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBQcm9wZXJ0eVR5cGUgewotICAgICAgICBCVUlMRCgiYnVpbGQucHJvcGVydGllcyIsIEJVSUxEX0hFQURFUiksCi0gICAgICAgIERFRkFVTFQoImRlZmF1bHQucHJvcGVydGllcyIsIERFRkFVTFRfSEVBREVSKSwKLSAgICAgICAgTE9DQUwoImxvY2FsLnByb3BlcnRpZXMiLCBMT0NBTF9IRUFERVIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GaWxlbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUhlYWRlcjsKLQotICAgICAgICBQcm9wZXJ0eVR5cGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgaGVhZGVyKSB7Ci0gICAgICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICAgICAgICAgIG1IZWFkZXIgPSBoZWFkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1GaWxlbmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0NBTF9IRUFERVIgPQotLy8gICAgICAgICAgIDEtLS0tLS0tMTAtLS0tLS0tLTIwLS0tLS0tLS0zMC0tLS0tLS0tNDAtLS0tLS0tLTUwLS0tLS0tLS02MC0tLS0tLS0tNzAtLS0tLS0tLTgwCi0gICAgICAgICAgICAiIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgQW5kcm9pZCBUb29scy5cbiIgKwotICAgICAgICAgICAgIiMgRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUgLS0gWU9VUiBDSEFOR0VTIFdJTEwgQkUgRVJBU0VEIVxuIiArCi0gICAgICAgICAgICAiIyBcbiIgKwotICAgICAgICAgICAgIiMgVGhpcyBmaWxlIG11c3QgKk5PVCogYmUgY2hlY2tlZCBpbiBWZXJzaW9uIENvbnRyb2wgU3lzdGVtcyxcbiIgKwotICAgICAgICAgICAgIiMgYXMgaXQgY29udGFpbnMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8geW91ciBsb2NhbCBjb25maWd1cmF0aW9uLlxuIiArCi0gICAgICAgICAgICAiXG4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSEVBREVSID0KLS8vICAgICAgICAgIDEtLS0tLS0tMTAtLS0tLS0tLTIwLS0tLS0tLS0zMC0tLS0tLS0tNDAtLS0tLS0tLTUwLS0tLS0tLS02MC0tLS0tLS0tNzAtLS0tLS0tLTgwCi0gICAgICAgICAgICIjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBBbmRyb2lkIFRvb2xzLlxuIiArCi0gICAgICAgICAgICIjIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIFlPVVIgQ0hBTkdFUyBXSUxMIEJFIEVSQVNFRCFcbiIgKwotICAgICAgICAgICAiIyBcbiIgKwotICAgICAgICAgICAiIyBUaGlzIGZpbGUgbXVzdCBiZSBjaGVja2VkIGluIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zLlxuIiArCi0gICAgICAgICAgICIjIFxuIiArCi0gICAgICAgICAgICIjIFRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIEFudCBidWlsZCBzeXN0ZW0gdXNlLFxuIiArCi0gICAgICAgICAgICIjIFwiYnVpbGQucHJvcGVydGllc1wiLCBhbmQgb3ZlcnJpZGUgdmFsdWVzIHRvIGFkYXB0IHRoZSBzY3JpcHQgdG8geW91clxuIiArCi0gICAgICAgICAgICIjIHByb2plY3Qgc3RydWN0dXJlLlxuIiArCi0gICAgICAgICAgICJcbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVJTERfSEVBREVSID0KLS8vICAgICAgICAgIDEtLS0tLS0tMTAtLS0tLS0tLTIwLS0tLS0tLS0zMC0tLS0tLS0tNDAtLS0tLS0tLTUwLS0tLS0tLS02MC0tLS0tLS0tNzAtLS0tLS0tLTgwCi0gICAgICAgICAgICIjIFRoaXMgZmlsZSBpcyB1c2VkIHRvIG92ZXJyaWRlIGRlZmF1bHQgdmFsdWVzIHVzZWQgYnkgdGhlIEFudCBidWlsZCBzeXN0ZW0uXG4iICsKLSAgICAgICAgICAgIiMgXG4iICsKLSAgICAgICAgICAgIiMgVGhpcyBmaWxlIG11c3QgYmUgY2hlY2tlZCBpbiBWZXJzaW9uIENvbnRyb2wgU3lzdGVtcywgYXMgaXQgaXNcbiIgKwotICAgICAgICAgICAiIyBpbnRlZ3JhbCB0byB0aGUgYnVpbGQgc3lzdGVtIG9mIHlvdXIgcHJvamVjdC5cbiIgKwotICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgIiMgVGhpcyBmaWxlIGlzIG9ubHkgdXNlZCBieSB0aGUgQW50IHNjcmlwdC5cbiIgKwotICAgICAgICAgICAiXG4iICsKLSAgICAgICAgICAgIiMgWW91IGNhbiB1c2UgdGhpcyB0byBvdmVycmlkZSBkZWZhdWx0IHZhbHVlcyBzdWNoIGFzXG4iICsKLSAgICAgICAgICAgIiMgICdzb3VyY2UuZGlyJyBmb3IgdGhlIGxvY2F0aW9uIG9mIHlvdXIgamF2YSBzb3VyY2UgZm9sZGVyIGFuZFxuIiArCi0gICAgICAgICAgICIjICAnb3V0LmRpcicgZm9yIHRoZSBsb2NhdGlvbiBvZiB5b3VyIG91dHB1dCBmb2xkZXIuXG4iICsKLSAgICAgICAgICAgIlxuIiArCi0gICAgICAgICAgICIjIFlvdSBjYW4gYWxzbyB1c2UgaXQgZGVmaW5lIGhvdyB0aGUgcmVsZWFzZSBidWlsZHMgYXJlIHNpZ25lZCBieSBkZWNsYXJpbmdcbiIgKwotICAgICAgICAgICAiIyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4iICsKLSAgICAgICAgICAgIiMgICdrZXkuc3RvcmUnIGZvciB0aGUgbG9jYXRpb24gb2YgeW91ciBrZXlzdG9yZSBhbmRcbiIgKwotICAgICAgICAgICAiIyAgJ2tleS5hbGlhcycgZm9yIHRoZSBuYW1lIG9mIHRoZSBrZXkgdG8gdXNlLlxuIiArCi0gICAgICAgICAgICIjIFRoZSBwYXNzd29yZCB3aWxsIGJlIGFza2VkIGR1cmluZyB0aGUgYnVpbGQgd2hlbiB5b3UgdXNlIHRoZSAncmVsZWFzZScgdGFyZ2V0LlxuIiArCi0gICAgICAgICAgICJcbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IENPTU1FTlRfTUFQID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLS8vICAgICAgICAgICAgICAgMS0tLS0tLS0xMC0tLS0tLS0tMjAtLS0tLS0tLTMwLS0tLS0tLS00MC0tLS0tLS0tNTAtLS0tLS0tLTYwLS0tLS0tLS03MC0tLS0tLS0tODAKLSAgICAgICAgQ09NTUVOVF9NQVAucHV0KFBST1BFUlRZX1RBUkdFVCwKLSAgICAgICAgICAgICAgICAiIyBQcm9qZWN0IHRhcmdldC5cbiIpOwotICAgICAgICBDT01NRU5UX01BUC5wdXQoUFJPUEVSVFlfU1BMSVRfQllfREVOU0lUWSwKLSAgICAgICAgICAgICAgICAiIyBJbmRpY2F0ZXMgd2hldGhlciBhbiBhcGsgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBkZW5zaXR5LlxuIik7Ci0gICAgICAgIENPTU1FTlRfTUFQLnB1dChQUk9QRVJUWV9TREssCi0gICAgICAgICAgICAgICAgIiMgbG9jYXRpb24gb2YgdGhlIFNESy4gVGhpcyBpcyBvbmx5IHVzZWQgYnkgQW50XG4iICsKLSAgICAgICAgICAgICAgICAiIyBGb3IgY3VzdG9taXphdGlvbiB3aGVuIHVzaW5nIGEgVmVyc2lvbiBDb250cm9sIFN5c3RlbSwgcGxlYXNlIHJlYWQgdGhlXG4iICsKLSAgICAgICAgICAgICAgICAiIyBoZWFkZXIgbm90ZS5cbiIpOwotICAgICAgICBDT01NRU5UX01BUC5wdXQoUFJPUEVSVFlfQVBQX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgIiMgVGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiBwYWNrYWdlIGFzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LlxuIiArCi0gICAgICAgICAgICAgICAgIiMgVXNlZCBieSB0aGUgJ3VuaW5zdGFsbCcgcnVsZS5cbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm9qZWN0Rm9sZGVyT3NQYXRoOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIFByb3BlcnR5VHlwZSBtVHlwZTsKLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgcHJvamVjdCBwcm9wZXJ0aWVzIGZpbGUgYW5kIHJldHVybiBhIHtAbGluayBQcm9qZWN0UHJvcGVydGllc30gb2JqZWN0Ci0gICAgICogY29udGFpbmluZyB0aGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3RGb2xkZXJPc1BhdGggdGhlIHByb2plY3QgZm9sZGVyLgotICAgICAqIEBwYXJhbSB0eXBlIE9uZSB0aGUgcG9zc2libGUge0BsaW5rIFByb3BlcnR5VHlwZX1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFByb3BlcnRpZXMgbG9hZChTdHJpbmcgcHJvamVjdEZvbGRlck9zUGF0aCwgUHJvcGVydHlUeXBlIHR5cGUpIHsKLSAgICAgICAgRmlsZSBwcm9qZWN0Rm9sZGVyID0gbmV3IEZpbGUocHJvamVjdEZvbGRlck9zUGF0aCk7Ci0gICAgICAgIGlmIChwcm9qZWN0Rm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGUgZGVmYXVsdEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0Rm9sZGVyLCB0eXBlLm1GaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IFNka01hbmFnZXIucGFyc2VQcm9wZXJ0eUZpbGUoZGVmYXVsdEZpbGUsIG51bGwgLyogbG9nICovKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0Rm9sZGVyT3NQYXRoLCBtYXAsIHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZXMgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBpbnRvIHRoZSBjdXJyZW50IHByb3BlcnRpZXMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZW11bGF0ZXMgdGhlIEFudCBiZWhhdmlvcjogZXhpc3RpbmcgcHJvcGVydGllcyBhcmUgPGVtPm5vdDwvZW0+IG92ZXJyaWRlbi4KLSAgICAgKiBPbmx5IG5ldyB1bmRlZmluZWQgcHJvcGVydGllcyBiZWNvbWUgZGVmaW5lZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVHlwaWNhbCB1c2FnZToKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkNyZWF0ZSBhIFByb2plY3RQcm9wZXJ0aWVzIHdpdGgge0BsaW5rIFByb3BlcnR5VHlwZSNCVUlMRH0KLSAgICAgKiA8bGk+TWVyZ2UgaW4gdmFsdWVzIHVzaW5nIHtAbGluayBQcm9wZXJ0eVR5cGUjREVGQVVMVH0KLSAgICAgKiA8bGk+VGhlIHJlc3VsdCBpcyB0aGF0IHRoaXMgY29udGFpbnMgYWxsIHRoZSBwcm9wZXJ0aWVzIGZyb20gZGVmYXVsdCBwbHVzIHRob3NlCi0gICAgICogICAgIG92ZXJyaWRkZW4gYnkgdGhlIGJ1aWxkLnByb3BlcnRpZXMgZmlsZS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgT25lIHRoZSBwb3NzaWJsZSB7QGxpbmsgUHJvcGVydHlUeXBlfXMuCi0gICAgICogQHJldHVybiB0aGlzIG9iamVjdCwgZm9yIGNoYWluaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9qZWN0UHJvcGVydGllcyBtZXJnZShQcm9wZXJ0eVR5cGUgdHlwZSkgewotICAgICAgICBGaWxlIHByb2plY3RGb2xkZXIgPSBuZXcgRmlsZShtUHJvamVjdEZvbGRlck9zUGF0aCk7Ci0gICAgICAgIGlmIChwcm9qZWN0Rm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGUgZGVmYXVsdEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0Rm9sZGVyLCB0eXBlLm1GaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IFNka01hbmFnZXIucGFyc2VQcm9wZXJ0eUZpbGUoZGVmYXVsdEZpbGUsIG51bGwgLyogbG9nICovKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUHJvcGVydGllcy5jb250YWluc0tleShrZXkpICYmIHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IHByb3BlcnRpZXMgb2JqZWN0LCB3aXRoIG5vIHByb3BlcnRpZXMuCi0gICAgICogPHAvPlRoZSBmaWxlIGlzIG5vdCBjcmVhdGVkIHVudGlsIHtAbGluayAjc2F2ZSgpfSBpcyBjYWxsZWQuCi0gICAgICogQHBhcmFtIHByb2plY3RGb2xkZXJPc1BhdGggdGhlIHByb2plY3QgZm9sZGVyLgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UHJvcGVydGllcyBjcmVhdGUoU3RyaW5nIHByb2plY3RGb2xkZXJPc1BhdGgsIFByb3BlcnR5VHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhbmQgcmV0dXJuIGEgUHJvamVjdFByb3BlcnRpZXMgd2l0aCBhbiBlbXB0eSBtYXAuCi0gICAgICAgIHJldHVybiBuZXcgUHJvamVjdFByb3BlcnRpZXMocHJvamVjdEZvbGRlck9zUGF0aCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCksIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBuZXcgcHJvcGVydGllcy4gSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIGl0IGlzIHJlcGxhY2VkLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Qcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFyZ2V0IHByb3BlcnR5IHRvIHRoZSBnaXZlbiB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBBbmRyb2lkIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmRyb2lkVGFyZ2V0KElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBhc3NlcnQgbVR5cGUgPT0gUHJvcGVydHlUeXBlLkRFRkFVTFQ7Ci0gICAgICAgIG1Qcm9wZXJ0aWVzLnB1dChQUk9QRVJUWV9UQVJHRVQsIHRhcmdldC5oYXNoU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbVByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwcm9wZXJ0eSBhbmQgcmV0dXJucyBpdHMgcHJldmlvdXMgdmFsdWUgKG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IGRpZCBub3QgZXhpc3QpLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZW1vdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbVByb3BlcnRpZXMucmVtb3ZlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBwcm9wZXJ0eSBmaWxlLCB1c2luZyBVVEYtOCBlbmNvZGluZy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdG9TYXZlID0gbmV3IEZpbGUobVByb2plY3RGb2xkZXJPc1BhdGgsIG1UeXBlLm1GaWxlbmFtZSk7Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odG9TYXZlKSwKLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuSU5JX0NIQVJTRVQpOwotCi0gICAgICAgIC8vIHdyaXRlIHRoZSBoZWFkZXIKLSAgICAgICAgd3JpdGVyLndyaXRlKG1UeXBlLm1IZWFkZXIpOwotCi0gICAgICAgIC8vIHdyaXRlIHRoZSBwcm9wZXJ0aWVzLgotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1Qcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9NQVAuZ2V0KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29tbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLmZvcm1hdCgiJXM9JXNcbiIsIGVudHJ5LmdldEtleSgpLCB2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2xvc2UgdGhlIGZpbGUgdG8gZmx1c2gKLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8cC8+Ci0gICAgICogVXNlIHtAbGluayAjbG9hZChTdHJpbmcsIFByb3BlcnR5VHlwZSl9IG9yIHtAbGluayAjY3JlYXRlKFN0cmluZywgUHJvcGVydHlUeXBlKX0KLSAgICAgKiB0byBpbnN0YW50aWF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3RQcm9wZXJ0aWVzKFN0cmluZyBwcm9qZWN0Rm9sZGVyT3NQYXRoLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCwKLSAgICAgICAgICAgIFByb3BlcnR5VHlwZSB0eXBlKSB7Ci0gICAgICAgIG1Qcm9qZWN0Rm9sZGVyT3NQYXRoID0gcHJvamVjdEZvbGRlck9zUGF0aDsKLSAgICAgICAgbVByb3BlcnRpZXMgPSBtYXA7Ci0gICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BZGRvblBhY2thZ2UuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0FkZG9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMWNkZjFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0FkZG9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLkFuZHJvaWRWZXJzaW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQuSU9wdGlvbmFsTGlicmFyeTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5BcmNoOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BcmNoaXZlLk9zOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIucmVwb3NpdG9yeS5TZGtSZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudHMgYW4gYWRkLW9uIFhNTCBub2RlIGluIGFuIFNESyByZXBvc2l0b3J5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBZGRvblBhY2thZ2UgZXh0ZW5kcyBQYWNrYWdlIGltcGxlbWVudHMgSVBhY2thZ2VWZXJzaW9uIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTkFNRSAgICAgID0gIkFkZG9uLk5hbWUiOyAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVkVORE9SICAgID0gIkFkZG9uLlZlbmRvciI7ICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZlbmRvcjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7DQotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFZlcnNpb24gbVZlcnNpb247DQotDQotICAgIC8qKiBBbiBhZGQtb24gbGlicmFyeS4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaWIgew0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7DQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRpb247DQotDQotICAgICAgICBwdWJsaWMgTGliKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsNCi0gICAgICAgICAgICBtTmFtZSA9IG5hbWU7DQotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgZmluYWwgTGliW10gbUxpYnM7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkZC1vbiBwYWNrYWdlIGZyb20gdGhlIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBYTUwgbm9kZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHBhY2thZ2UgY2Fubm90IGJlIGNyZWF0ZWQuDQotICAgICAqLw0KLSAgICBBZGRvblBhY2thZ2UoUmVwb1NvdXJjZSBzb3VyY2UsIE5vZGUgcGFja2FnZU5vZGUsIE1hcDxTdHJpbmcsU3RyaW5nPiBsaWNlbnNlcykgew0KLSAgICAgICAgc3VwZXIoc291cmNlLCBwYWNrYWdlTm9kZSwgbGljZW5zZXMpOw0KLSAgICAgICAgbVZlbmRvciAgID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfVkVORE9SKTsNCi0gICAgICAgIG1OYW1lICAgICA9IFhtbFBhcnNlclV0aWxzLmdldFhtbFN0cmluZyhwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX05BTUUpOw0KLSAgICAgICAgaW50IGFwaUxldmVsID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sSW50ICAgKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfQVBJX0xFVkVMLCAwKTsNCi0gICAgICAgIFN0cmluZyBjb2RlTmFtZSA9IFhtbFBhcnNlclV0aWxzLmdldFhtbFN0cmluZyhwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX0NPREVOQU1FKTsNCi0gICAgICAgIGlmIChjb2RlTmFtZS5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgY29kZU5hbWUgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbVZlcnNpb24gPSBuZXcgQW5kcm9pZFZlcnNpb24oYXBpTGV2ZWwsIGNvZGVOYW1lKTsNCi0NCi0gICAgICAgIG1MaWJzID0gcGFyc2VMaWJzKFhtbFBhcnNlclV0aWxzLmdldEZpcnN0Q2hpbGQocGFja2FnZU5vZGUsIFNka1JlcG9zaXRvcnkuTk9ERV9MSUJTKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgcGxhdGZvcm0gcGFja2FnZSBiYXNlZCBvbiBhbiBhY3R1YWwge0BsaW5rIElBbmRyb2lkVGFyZ2V0fSAod2hpY2gNCi0gICAgICoge0BsaW5rIElBbmRyb2lkVGFyZ2V0I2lzUGxhdGZvcm0oKX0gZmFsc2UpIGZyb20gdGhlIHtAbGluayBTZGtNYW5hZ2VyfS4NCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGxpc3QgbG9jYWwgU0RLIGZvbGRlcnMgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBvbmUgYXJjaGl2ZSB3aGljaA0KLSAgICAgKiBVUkwgaXMgdGhlIGFjdHVhbCB0YXJnZXQgbG9jYXRpb24uDQotICAgICAqIDxwLz4NCi0gICAgICogQnkgZGVzaWduLCB0aGlzIGNyZWF0ZXMgYSBwYWNrYWdlIHdpdGggb25lIGFuZCBvbmx5IG9uZSBhcmNoaXZlLg0KLSAgICAgKi8NCi0gICAgQWRkb25QYWNrYWdlKElBbmRyb2lkVGFyZ2V0IHRhcmdldCwgUHJvcGVydGllcyBwcm9wcykgew0KLSAgICAgICAgc3VwZXIoICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9zb3VyY2UNCi0gICAgICAgICAgICAgICAgcHJvcHMsICAgICAgICAgICAgICAgICAgICAgIC8vcHJvcGVydGllcw0KLSAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0UmV2aXNpb24oKSwgICAgICAgLy9yZXZpc2lvbg0KLSAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9saWNlbnNlDQotICAgICAgICAgICAgICAgIHRhcmdldC5nZXREZXNjcmlwdGlvbigpLCAgICAvL2Rlc2NyaXB0aW9uDQotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL2Rlc2NVcmwNCi0gICAgICAgICAgICAgICAgT3MuZ2V0Q3VycmVudE9zKCksICAgICAgICAgIC8vYXJjaGl2ZU9zDQotICAgICAgICAgICAgICAgIEFyY2guZ2V0Q3VycmVudEFyY2goKSwgICAgICAvL2FyY2hpdmVBcmNoDQotICAgICAgICAgICAgICAgIHRhcmdldC5nZXRMb2NhdGlvbigpICAgICAgICAvL2FyY2hpdmVPc1BhdGgNCi0gICAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgIG1WZXJzaW9uID0gdGFyZ2V0LmdldFZlcnNpb24oKTsNCi0gICAgICAgIG1OYW1lICAgICA9IHRhcmdldC5nZXROYW1lKCk7DQotICAgICAgICBtVmVuZG9yICAgPSB0YXJnZXQuZ2V0VmVuZG9yKCk7DQotDQotICAgICAgICBJT3B0aW9uYWxMaWJyYXJ5W10gb3B0TGlicyA9IHRhcmdldC5nZXRPcHRpb25hbExpYnJhcmllcygpOw0KLSAgICAgICAgaWYgKG9wdExpYnMgPT0gbnVsbCB8fCBvcHRMaWJzLmxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgbUxpYnMgPSBuZXcgTGliWzBdOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtTGlicyA9IG5ldyBMaWJbb3B0TGlicy5sZW5ndGhdOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0TGlicy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBtTGlic1tpXSA9IG5ldyBMaWIob3B0TGlic1tpXS5nZXROYW1lKCksIG9wdExpYnNbaV0uZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHBhY2thZ2VzIGluIHRoZSBnaXZlbiB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0Lg0KLSAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgbGF0ZXIgYmUgZ2l2ZW4gdG8gYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICB2b2lkIHNhdmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsNCi0gICAgICAgIHN1cGVyLnNhdmVQcm9wZXJ0aWVzKHByb3BzKTsNCi0NCi0gICAgICAgIG1WZXJzaW9uLnNhdmVQcm9wZXJ0aWVzKHByb3BzKTsNCi0gICAgICAgIGlmIChtTmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9OQU1FLCBtTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobVZlbmRvciAhPSBudWxsKSB7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9WRU5ET1IsIG1WZW5kb3IpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgYSA8bGlicz4gZWxlbWVudC4NCi0gICAgICovDQotICAgIHByaXZhdGUgTGliW10gcGFyc2VMaWJzKE5vZGUgbGlic05vZGUpIHsNCi0gICAgICAgIEFycmF5TGlzdDxMaWI+IGxpYnMgPSBuZXcgQXJyYXlMaXN0PExpYj4oKTsNCi0NCi0gICAgICAgIGlmIChsaWJzTm9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yKE5vZGUgY2hpbGQgPSBsaWJzTm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7DQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgew0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNka1JlcG9zaXRvcnkuTlNfU0RLX1JFUE9TSVRPUlkuZXF1YWxzKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNka1JlcG9zaXRvcnkuTk9ERV9MSUIuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbGlicy5hZGQocGFyc2VMaWIoY2hpbGQpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBsaWJzLnRvQXJyYXkobmV3IExpYltsaWJzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgYSA8bGliPiBlbGVtZW50IGZyb20gYSA8bGlicz4gY29udGFpbmVyLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBMaWIgcGFyc2VMaWIoTm9kZSBsaWJOb2RlKSB7DQotICAgICAgICByZXR1cm4gbmV3IExpYihYbWxQYXJzZXJVdGlscy5nZXRYbWxTdHJpbmcobGliTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX05BTUUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKGxpYk5vZGUsIFNka1JlcG9zaXRvcnkuTk9ERV9ERVNDUklQVElPTikpOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIHRoZSB2ZW5kb3IsIGEgc3RyaW5nLCBmb3IgYWRkLW9uIHBhY2thZ2VzLiAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpIHsNCi0gICAgICAgIHJldHVybiBtVmVuZG9yOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIHRoZSBuYW1lLCBhIHN0cmluZywgZm9yIGFkZC1vbiBwYWNrYWdlcyBvciBmb3IgbGlicmFyaWVzLiAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbU5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqIFJldHVybnMgdGhlIHZlcnNpb24sIGZvciBwbGF0Zm9ybSwgYWRkLW9uIGFuZCBkb2MgcGFja2FnZXMuICovDQotICAgIHB1YmxpYyBBbmRyb2lkVmVyc2lvbiBnZXRWZXJzaW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG1WZXJzaW9uOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIHRoZSBsaWJzIGRlZmluZWQgaW4gdGhpcyBhZGQtb24uIENhbiBiZSBhbiBlbXB0eSBhcnJheSBidXQgbm90IG51bGwuICovDQotICAgIHB1YmxpYyBMaWJbXSBnZXRMaWJzKCkgew0KLSAgICAgICAgcmV0dXJuIG1MaWJzOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gZm9yIGFuIHtAbGluayBJRGVzY3JpcHRpb259LiAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJHMgYnkgJTIkcywgQW5kcm9pZCBBUEkgJTMkcywgcmV2aXNpb24gJTQkcyIsDQotICAgICAgICAgICAgICAgIGdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgZ2V0VmVuZG9yKCksDQotICAgICAgICAgICAgICAgIG1WZXJzaW9uLmdldEFwaVN0cmluZygpLA0KLSAgICAgICAgICAgICAgICBnZXRSZXZpc2lvbigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGxvbmcgZGVzY3JpcHRpb24gZm9yIGFuIHtAbGluayBJRGVzY3JpcHRpb259Lg0KLSAgICAgKg0KLSAgICAgKiBUaGUgbG9uZyBkZXNjcmlwdGlvbiBpcyB3aGF0ZXZlciB0aGUgWE1MIGNvbnRhaW5zIGZvciB0aGUgJmx0O2Rlc2NyaXB0aW9uJmd0OyBmaWVsZCwNCi0gICAgICogb3IgdGhlIHNob3J0IGRlc2NyaXB0aW9uIGlmIHRoZSBmb3JtZXIgaXMgZW1wdHkuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICBTdHJpbmcgcyA9IGdldERlc2NyaXB0aW9uKCk7DQotICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHMgPSBnZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocy5pbmRleE9mKCJyZXZpc2lvbiIpID09IC0xKSB7DQotICAgICAgICAgICAgcyArPSBTdHJpbmcuZm9ybWF0KCJcblJldmlzaW9uICUxJGQiLCBnZXRSZXZpc2lvbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHMgKz0gU3RyaW5nLmZvcm1hdCgiXG5SZXF1aXJlcyBTREsgUGxhdGZvcm0gQW5kcm9pZCBBUEkgJTEkcyIsDQotICAgICAgICAgICAgICAgIG1WZXJzaW9uLmdldEFwaVN0cmluZygpKTsNCi0gICAgICAgIHJldHVybiBzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wdXRlcyBhIHBvdGVudGlhbCBpbnN0YWxsYXRpb24gZm9sZGVyIGlmIGFuIGFyY2hpdmUgb2YgdGhpcyBwYWNrYWdlIHdlcmUNCi0gICAgICogdG8gYmUgaW5zdGFsbGVkIHJpZ2h0IGF3YXkgaW4gdGhlIGdpdmVuIFNESyByb290Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIEFuIGFkZC1vbiBwYWNrYWdlIGlzIHR5cGljYWxseSBpbnN0YWxsZWQgaW4gU0RLL2FkZC1vbnMvImFkZG9uLW5hbWUiLSJhcGktbGV2ZWwiLg0KLSAgICAgKiBUaGUgbmFtZSBuZWVkcyB0byBiZSBzYW5pdGl6ZWQgdG8gYmUgYWNjZXB0YWJsZSBhcyBhIGRpcmVjdG9yeSBuYW1lLg0KLSAgICAgKiBIb3dldmVyIGlmIHdlIGNhbiBmaW5kIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1bmRlciBTREsvYWRkLW9ucyB0aGF0IGFscmVhZHkNCi0gICAgICogaGFzIHRoaXMgYWRkLW9ucyBpbnN0YWxsZWQsIHdlJ2xsIHVzZSB0aGF0IG9uZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9zU2RrUm9vdCBUaGUgT1MgcGF0aCBvZiB0aGUgU0RLIHJvb3QgZm9sZGVyLg0KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGVkRGlyIEEgc3VnZ2VzdGlvbiBmb3IgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgbmFtZSwgYmFzZWQgb24gdGhlIHJvb3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgICBmb2xkZXIgdXNlZCBpbiB0aGUgemlwIGFyY2hpdmUuDQotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIEFuIGV4aXN0aW5nIFNESyBtYW5hZ2VyIHRvIGxpc3QgY3VycmVudCBwbGF0Zm9ybXMgYW5kIGFkZG9ucy4NCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgRmlsZX0gY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0b3J5IHRvIHVzZSB0byBpbnN0YWxsIHRoaXMgcGFja2FnZS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmlsZSBnZXRJbnN0YWxsRm9sZGVyKFN0cmluZyBvc1Nka1Jvb3QsIFN0cmluZyBzdWdnZXN0ZWREaXIsIFNka01hbmFnZXIgc2RrTWFuYWdlcikgew0KLSAgICAgICAgRmlsZSBhZGRvbnMgPSBuZXcgRmlsZShvc1Nka1Jvb3QsIFNka0NvbnN0YW50cy5GRF9BRERPTlMpOw0KLQ0KLSAgICAgICAgLy8gRmlyc3QgZmluZCBpZiB0aGlzIGFkZC1vbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4gSWYgc28sIHJldXNlIHRoZSBzYW1lIGRpcmVjdG9yeS4NCi0gICAgICAgIGZvciAoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0IDogc2RrTWFuYWdlci5nZXRUYXJnZXRzKCkpIHsNCi0gICAgICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXRmb3JtKCkgJiYNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRWZXJzaW9uKCkuZXF1YWxzKG1WZXJzaW9uKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFZlbmRvcigpLmVxdWFscyhnZXRWZW5kb3IoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRhcmdldC5nZXRMb2NhdGlvbigpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBPdGhlcndpc2UsIHNlZSBhYm91dCByZXVzaW5nIHRoZSBzdWdnZXN0ZWREaXIuIEl0IG11c3Qgbm90IGJlIGFscmVhZHkgdXNlZCBvcg0KLSAgICAgICAgLy8gYWRkIHNvbWUgaW5kZXggdG8gaXQsIG9yIHdlIHRyeSB0byBtYWtlIHVwIG9uZS4NCi0gICAgICAgIFN0cmluZyBuYW1lID0gc3VnZ2VzdGVkRGlyOw0KLQ0KLSAgICAgICAgaWYgKHN1Z2dlc3RlZERpciA9PSBudWxsIHx8IHN1Z2dlc3RlZERpci5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgbmFtZSA9IFN0cmluZy5mb3JtYXQoImFkZG9uLSVzLSVzLSVzIiwgZ2V0TmFtZSgpLCBnZXRWZW5kb3IoKSwgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICAgICAgbVZlcnNpb24uZ2V0QXBpU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQotICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiW15hLXowLTlfLV0rIiwgIl8iKTsgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfKyIsICJfIik7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lMiA9IGkgPT0gMCA/IG5hbWUgOiBTdHJpbmcuZm9ybWF0KCIlcy0lZCIsIG5hbWUsIGkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShhZGRvbnMsIG5hbWUyKTsNCi0gICAgICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm9sZGVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFdlIHNob3VsZG4ndCByZWFsbHkgZ2V0IGhlcmUuIEkgbWVhbiwgc2VyaW91c2x5LCB3ZSB0cmllZCBoYXJkIGVub3VnaC4NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzYW1lSXRlbUFzKFBhY2thZ2UgcGtnKSB7DQotICAgICAgICBpZiAocGtnIGluc3RhbmNlb2YgQWRkb25QYWNrYWdlKSB7DQotICAgICAgICAgICAgQWRkb25QYWNrYWdlIG5ld1BrZyA9IChBZGRvblBhY2thZ2UpcGtnOw0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZXkgYXJlIHRoZSBzYW1lIGFkZC1vbi4NCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhuZXdQa2cuZ2V0TmFtZSgpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmVuZG9yKCkuZXF1YWxzKG5ld1BrZy5nZXRWZW5kb3IoKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKS5lcXVhbHMobmV3UGtnLmdldFZlcnNpb24oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvQXJjaGl2ZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDA2NjhjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0FyY2hpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrTWFuYWdlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmFyY2hpdmVycy56aXAuWmlwQXJjaGl2ZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuYXJjaGl2ZXJzLnppcC5aaXBGaWxlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotDQotLyoqDQotICogQSB7QGxpbmsgQXJjaGl2ZX0gaXMgdGhlIGJhc2UgY2xhc3MgZm9yICJzb21ldGhpbmciIHRoYXQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQ0KLSAqIHRoZSBTREsgcmVwb3NpdG9yeSAtLSBzdWJjbGFzc2VzIGluY2x1ZGUge0BsaW5rIFBsYXRmb3JtUGFja2FnZX0sIHtAbGluayBBZGRvblBhY2thZ2V9LA0KLSAqIHtAbGluayBEb2NQYWNrYWdlfSBhbmQge0BsaW5rIFRvb2xQYWNrYWdlfS4NCi0gKiA8cC8+DQotICogQSBwYWNrYWdlIGhhcyBzb21lIGF0dHJpYnV0ZXMgKHJldmlzaW9uLCBkZXNjcmlwdGlvbikgYW5kIGEgbGlzdCBvZiBhcmNoaXZlcw0KLSAqIHdoaWNoIHJlcHJlc2VudCB0aGUgZG93bmxvYWRhYmxlIGJpdHMuDQotICogPHAvPg0KLSAqIFBhY2thZ2VzIGFyZSBjb250YWluZWQgaW4gb2ZmZXJlZCBieSBhIHtAbGluayBSZXBvU291cmNlfSAoYSBkb3dubG9hZCBzaXRlKS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZSBpbXBsZW1lbnRzIElEZXNjcmlwdGlvbiB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9NT05JVE9SX0lOQyA9IDEwMDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfT1MgICA9ICJBcmNoaXZlLk9zIjsgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BUkNIID0gIkFyY2hpdmUuQXJjaCI7ICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKiBUaGUgY2hlY2tzdW0gdHlwZS4gKi8NCi0gICAgcHVibGljIGVudW0gQ2hlY2tzdW1UeXBlIHsNCi0gICAgICAgIC8qKiBBIFNIQTEgY2hlY2tzdW0sIHJlcHJlc2VudGVkIGFzIGEgNDAtaGV4IHN0cmluZy4gKi8NCi0gICAgICAgIFNIQTEoIlNIQS0xIik7ICAvLyROT04tTkxTLTEkDQotDQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWxnb3JpdGhtTmFtZTsNCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQ29uc3RydWN0cyBhIHtAbGluayBDaGVja3N1bVR5cGV9IHdpdGggdGhlIGFsZ29yaWd0aCBuYW1lDQotICAgICAgICAgKiBzdWl0YWJsZSBmb3Ige0BsaW5rIE1lc3NhZ2VEaWdlc3QjZ2V0SW5zdGFuY2UoU3RyaW5nKX0uDQotICAgICAgICAgKiA8cC8+DQotICAgICAgICAgKiBUaGVzZSBuYW1lcyBhcmUgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGF0DQotICAgICAgICAgKiBodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS9TdGFuZGFyZE5hbWVzLmh0bWwjTWVzc2FnZURpZ2VzdA0KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIENoZWNrc3VtVHlwZShTdHJpbmcgYWxnb3JpdGhtTmFtZSkgew0KLSAgICAgICAgICAgIG1BbGdvcml0aG1OYW1lID0gYWxnb3JpdGhtTmFtZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyBhIG5ldyB7QGxpbmsgTWVzc2FnZURpZ2VzdH0gaW5zdGFuY2UgZm9yIHRoaXMgY2hlY2tzdW0gdHlwZS4NCi0gICAgICAgICAqIEB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlmIHRoaXMgYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBNZXNzYWdlRGlnZXN0IGdldE1lc3NhZ2VEaWdlc3QoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShtQWxnb3JpdGhtTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqIFRoZSBPUyB0aGF0IHRoaXMgYXJjaGl2ZSBjYW4gYmUgZG93bmxvYWRlZCBvbi4gKi8NCi0gICAgcHVibGljIGVudW0gT3Mgew0KLSAgICAgICAgQU5ZKCJBbnkiKSwNCi0gICAgICAgIExJTlVYKCJMaW51eCIpLA0KLSAgICAgICAgTUFDT1NYKCJNYWNPUyBYIiksDQotICAgICAgICBXSU5ET1dTKCJXaW5kb3dzIik7DQotDQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVWlOYW1lOw0KLQ0KLSAgICAgICAgcHJpdmF0ZSBPcyhTdHJpbmcgdWlOYW1lKSB7DQotICAgICAgICAgICAgbVVpTmFtZSA9IHVpTmFtZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBVSSBuYW1lIG9mIHRoZSBPUy4gKi8NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VWlOYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBtVWlOYW1lOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIGFzIG9uZSBvZiB0aGUge0BsaW5rIE9zfSBlbnVtIHZhbHVlcyBvciBudWxsLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgc3RhdGljIE9zIGdldEN1cnJlbnRPcygpIHsNCi0gICAgICAgICAgICBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIGlmIChvcy5zdGFydHNXaXRoKCJNYWMiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIHJldHVybiBPcy5NQUNPU1g7DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChvcy5zdGFydHNXaXRoKCJXaW5kb3dzIikpIHsgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9zLldJTkRPV1M7DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChvcy5zdGFydHNXaXRoKCJMaW51eCIpKSB7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9zLkxJTlVYOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiogVGhlIEFyY2hpdGVjdHVyZSB0aGF0IHRoaXMgYXJjaGl2ZSBjYW4gYmUgZG93bmxvYWRlZCBvbi4gKi8NCi0gICAgcHVibGljIGVudW0gQXJjaCB7DQotICAgICAgICBBTlkoIkFueSIpLA0KLSAgICAgICAgUFBDKCJQb3dlclBDIiksDQotICAgICAgICBYODYoIng4NiIpLA0KLSAgICAgICAgWDg2XzY0KCJ4ODZfNjQiKTsNCi0NCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VaU5hbWU7DQotDQotICAgICAgICBwcml2YXRlIEFyY2goU3RyaW5nIHVpTmFtZSkgew0KLSAgICAgICAgICAgIG1VaU5hbWUgPSB1aU5hbWU7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiogUmV0dXJucyB0aGUgVUkgbmFtZSBvZiB0aGUgYXJjaGl0ZWN0dXJlLiAqLw0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRVaU5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1VaU5hbWU7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGFzIG9uZSBvZiB0aGUge0BsaW5rIEFyY2h9IGVudW0gdmFsdWVzIG9yIG51bGwuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQXJjaCBnZXRDdXJyZW50QXJjaCgpIHsNCi0gICAgICAgICAgICAvLyBWYWx1ZXMgbGlzdGVkIGZyb20gaHR0cDovL2xvcGljYS5zb3VyY2Vmb3JnZS5uZXQvb3MuaHRtbA0KLSAgICAgICAgICAgIFN0cmluZyBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIik7DQotDQotICAgICAgICAgICAgaWYgKGFyY2guZXF1YWxzSWdub3JlQ2FzZSgieDg2XzY0IikgfHwgYXJjaC5lcXVhbHNJZ25vcmVDYXNlKCJhbWQ2NCIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBBcmNoLlg4Nl82NDsNCi0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyY2guZXF1YWxzSWdub3JlQ2FzZSgieDg2IikNCi0gICAgICAgICAgICAgICAgICAgIHx8IGFyY2guZXF1YWxzSWdub3JlQ2FzZSgiaTM4NiIpDQotICAgICAgICAgICAgICAgICAgICB8fCBhcmNoLmVxdWFsc0lnbm9yZUNhc2UoImk2ODYiKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gQXJjaC5YODY7DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmNoLmVxdWFsc0lnbm9yZUNhc2UoInBwYyIpIHx8IGFyY2guZXF1YWxzSWdub3JlQ2FzZSgiUG93ZXJQQyIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBBcmNoLlBQQzsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBPcyAgICAgbU9zOw0KLSAgICBwcml2YXRlIGZpbmFsIEFyY2ggICBtQXJjaDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVybDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nICAgbVNpemU7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGVja3N1bTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBDaGVja3N1bVR5cGUgbUNoZWNrc3VtVHlwZSA9IENoZWNrc3VtVHlwZS5TSEExOw0KLSAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2UgbVBhY2thZ2U7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Mb2NhbE9zUGF0aDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0xvY2FsOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIG5ldyByZW1vdGUgYXJjaGl2ZS4NCi0gICAgICovDQotICAgIEFyY2hpdmUoUGFja2FnZSBwa2csIE9zIG9zLCBBcmNoIGFyY2gsIFN0cmluZyB1cmwsIGxvbmcgc2l6ZSwgU3RyaW5nIGNoZWNrc3VtKSB7DQotICAgICAgICBtUGFja2FnZSA9IHBrZzsNCi0gICAgICAgIG1PcyA9IG9zOw0KLSAgICAgICAgbUFyY2ggPSBhcmNoOw0KLSAgICAgICAgbVVybCA9IHVybDsNCi0gICAgICAgIG1Mb2NhbE9zUGF0aCA9IG51bGw7DQotICAgICAgICBtU2l6ZSA9IHNpemU7DQotICAgICAgICBtQ2hlY2tzdW0gPSBjaGVja3N1bTsNCi0gICAgICAgIG1Jc0xvY2FsID0gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYWwgYXJjaGl2ZS4NCi0gICAgICogVXNlcyB0aGUgcHJvcGVydGllcyBmcm9tIHByb3BzIGZpcnN0LCBpZiBwb3NzaWJsZS4gUHJvcHMgY2FuIGJlIG51bGwuDQotICAgICAqLw0KLSAgICBBcmNoaXZlKFBhY2thZ2UgcGtnLCBQcm9wZXJ0aWVzIHByb3BzLCBPcyBvcywgQXJjaCBhcmNoLCBTdHJpbmcgbG9jYWxPc1BhdGgpIHsNCi0gICAgICAgIG1QYWNrYWdlID0gcGtnOw0KLQ0KLSAgICAgICAgbU9zICAgPSBwcm9wcyA9PSBudWxsID8gb3MgICA6IE9zLnZhbHVlT2YoICBwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX09TLCAgIG9zLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIG1BcmNoID0gcHJvcHMgPT0gbnVsbCA/IGFyY2ggOiBBcmNoLnZhbHVlT2YocHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9BUkNILCBhcmNoLnRvU3RyaW5nKCkpKTsNCi0NCi0gICAgICAgIG1VcmwgPSBudWxsOw0KLSAgICAgICAgbUxvY2FsT3NQYXRoID0gbG9jYWxPc1BhdGg7DQotICAgICAgICBtU2l6ZSA9IDA7DQotICAgICAgICBtQ2hlY2tzdW0gPSAiIjsNCi0gICAgICAgIG1Jc0xvY2FsID0gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBhcmNoaXZlIGluIHRoZSBnaXZlIHtAbGluayBQcm9wZXJ0aWVzfSBvYmplY3QuDQotICAgICAqIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBsYXRlciBiZSBnaXZlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICovDQotICAgIHZvaWQgc2F2ZVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcykgew0KLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9PUywgICBtT3MudG9TdHJpbmcoKSk7DQotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0FSQ0gsIG1BcmNoLnRvU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGxvY2FsbHkgaW5zdGFsbGVkIGFyY2hpdmUuDQotICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhpcyBpcyBhIHJlbW90ZSBhcmNoaXZlIHRoYXQgbmVlZHMgdG8gYmUgZG93bmxvYWRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7DQotICAgICAgICByZXR1cm4gbUlzTG9jYWw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2UgdGhhdCBjcmVhdGVkIGFuZCBvd25zIHRoaXMgYXJjaGl2ZS4NCi0gICAgICogSXQgc2hvdWxkIGdlbmVyYWxseSBub3QgYmUgbnVsbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKSB7DQotICAgICAgICByZXR1cm4gbVBhY2thZ2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGFyY2hpdmUgc2l6ZSwgYW4gaW50ID4gMC4NCi0gICAgICogU2l6ZSB3aWxsIGJlIDAgaWYgdGhpcyBhIGxvY2FsIGluc3RhbGxlZCBmb2xkZXIgb2YgdW5rbm93biBzaXplLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsNCi0gICAgICAgIHJldHVybiBtU2l6ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgU0hBMSBhcmNoaXZlIGNoZWNrc3VtLCBhcyBhIDQwLWNoYXIgaGV4Lg0KLSAgICAgKiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsIGZvciBsb2NhbCBpbnN0YWxsZWQgZm9sZGVycy4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tzdW0oKSB7DQotICAgICAgICByZXR1cm4gbUNoZWNrc3VtOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja3N1bSB0eXBlLCBhbHdheXMge0BsaW5rIENoZWNrc3VtVHlwZSNTSEExfSByaWdodCBub3cuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2hlY2tzdW1UeXBlIGdldENoZWNrc3VtVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBtQ2hlY2tzdW1UeXBlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBkb3dubG9hZCBhcmNoaXZlIFVSTCwgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHhtbC4NCi0gICAgICogQWx3YXlzIHJldHVybiBudWxsIGZvciBhIGxvY2FsIGluc3RhbGxlZCBmb2xkZXIuDQotICAgICAqIEBzZWUgI2dldExvY2FsT3NQYXRoKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgew0KLSAgICAgICAgcmV0dXJuIG1Vcmw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGxvY2FsIE9TIGZvbGRlciB3aGVyZSBhIGxvY2FsIGFyY2hpdmUgaXMgaW5zdGFsbGVkLg0KLSAgICAgKiBBbHdheXMgcmV0dXJuIG51bGwgZm9yIHJlbW90ZSBhcmNoaXZlcy4NCi0gICAgICogQHNlZSAjZ2V0VXJsKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxPc1BhdGgoKSB7DQotICAgICAgICByZXR1cm4gbUxvY2FsT3NQYXRoOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBhcmNoaXZlIHtAbGluayBPc30gZW51bS4NCi0gICAgICogQ2FuIGJlIG51bGwgZm9yIGEgbG9jYWwgaW5zdGFsbGVkIGZvbGRlciBvbiBhbiB1bmtub3duIE9TLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9zIGdldE9zKCkgew0KLSAgICAgICAgcmV0dXJuIG1PczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgYXJjaGl2ZSB7QGxpbmsgQXJjaH0gZW51bS4NCi0gICAgICogQ2FuIGJlIG51bGwgZm9yIGEgbG9jYWwgaW5zdGFsbGVkIGZvbGRlciBvbiBhbiB1bmtub3duIGFyY2hpdGVjdHVyZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBBcmNoIGdldEFyY2goKSB7DQotICAgICAgICByZXR1cm4gbUFyY2g7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIGFyY2hpdmUgb2YgdGhlIE9TL0FyY2ggc3VwcG9ydGVkIGJ5IHRoaXMgYXJjaGl2ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3NEZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIFN0cmluZyBvczsNCi0gICAgICAgIGlmIChtT3MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIG9zID0gInVua25vd24gT1MiOw0KLSAgICAgICAgfSBlbHNlIGlmIChtT3MgPT0gT3MuQU5ZKSB7DQotICAgICAgICAgICAgb3MgPSAiYW55IE9TIjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgb3MgPSBtT3MuZ2V0VWlOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgYXJjaCA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICBpZiAobUFyY2ggIT0gbnVsbCAmJiBtQXJjaCAhPSBBcmNoLkFOWSkgew0KLSAgICAgICAgICAgIGFyY2ggPSBtQXJjaC5nZXRVaU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMSRzJTIkcyUzJHMiLA0KLSAgICAgICAgICAgICAgICBvcywNCi0gICAgICAgICAgICAgICAgYXJjaC5sZW5ndGgoKSA+IDAgPyAiICIgOiAiIiwgICAgICAgICAgIC8vJE5PTi1OTFMtMiQNCi0gICAgICAgICAgICAgICAgYXJjaCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciB0aGlzIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKSB7DQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQXJjaGl2ZSBmb3IgJTEkcyIsIGdldE9zRGVzY3JpcHRpb24oKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBhIGxvbmdlciBkZXNjcmlwdGlvbiBmb3IgdGhpcyBhcmNoaXZlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkc1xuU2l6ZTogJTIkZCBNaUJcblNIQTE6ICUzJHMiLA0KLSAgICAgICAgICAgICAgICBnZXRTaG9ydERlc2NyaXB0aW9uKCksDQotICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZ2V0U2l6ZSgpIC8gKDEwMjQqMTAyNCkpLA0KLSAgICAgICAgICAgICAgICBnZXRDaGVja3N1bSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYXJjaGl2ZSBjYW4gYmUgaW5zdGFsbGVkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlKCkgew0KLSAgICAgICAgLy8gQ2hlY2sgT1MNCi0gICAgICAgIE9zIG9zID0gZ2V0T3MoKTsNCi0NCi0gICAgICAgIGlmIChvcyAhPSBPcy5BTlkpIHsNCi0gICAgICAgICAgICBPcyBvczIgPSBPcy5nZXRDdXJyZW50T3MoKTsNCi0gICAgICAgICAgICBpZiAob3MyICE9IG9zKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBDaGVjayBBcmNoDQotICAgICAgICBBcmNoIGFyY2ggPSBnZXRBcmNoKCk7DQotDQotICAgICAgICBpZiAoYXJjaCAhPSBBcmNoLkFOWSkgew0KLSAgICAgICAgICAgIEFyY2ggYXJjaDIgPSBBcmNoLmdldEN1cnJlbnRBcmNoKCk7DQotICAgICAgICAgICAgaWYgKGFyY2gyICE9IGFyY2gpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWxldGUgdGhlIGFyY2hpdmUgZm9sZGVyIGlmIHRoaXMgaXMgYSBsb2NhbCBhcmNoaXZlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZGVsZXRlTG9jYWwoKSB7DQotICAgICAgICBpZiAoaXNMb2NhbCgpKSB7DQotICAgICAgICAgICAgZGVsZXRlRmlsZU9yRm9sZGVyKG5ldyBGaWxlKGdldExvY2FsT3NQYXRoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5zdGFsbCB0aGlzIHtAbGluayBBcmNoaXZlfXMuDQotICAgICAqIFRoZSBhcmNoaXZlIHdpbGwgYmUgc2tpcHBlZCBpZiBpdCBpcyBpbmNvbXBhdGlibGUuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYXJjaGl2ZSB3YXMgaW5zdGFsbGVkLCBmYWxzZSBvdGhlcndpc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnN0YWxsKFN0cmluZyBvc1Nka1Jvb3QsDQotICAgICAgICAgICAgYm9vbGVhbiBmb3JjZUh0dHAsDQotICAgICAgICAgICAgU2RrTWFuYWdlciBzZGtNYW5hZ2VyLA0KLSAgICAgICAgICAgIElUYXNrTW9uaXRvciBtb25pdG9yKSB7DQotDQotICAgICAgICBQYWNrYWdlIHBrZyA9IGdldFBhcmVudFBhY2thZ2UoKTsNCi0NCi0gICAgICAgIEZpbGUgYXJjaGl2ZUZpbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwa2cuZ2V0U2hvcnREZXNjcmlwdGlvbigpOw0KLQ0KLSAgICAgICAgaWYgKHBrZyBpbnN0YW5jZW9mIEV4dHJhUGFja2FnZSAmJiAhKChFeHRyYVBhY2thZ2UpIHBrZykuaXNQYXRoVmFsaWQoKSkgew0KLSAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJTa2lwcGluZyAlMSRzOiAlMiRzIGlzIG5vdCBhIHZhbGlkIGluc3RhbGwgcGF0aC4iLA0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICgoRXh0cmFQYWNrYWdlKSBwa2cpLmdldFBhdGgoKSk7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGlzTG9jYWwoKSkgew0KLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4NCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiU2tpcHBpbmcgYWxyZWFkeSBpbnN0YWxsZWQgYXJjaGl2ZTogJTEkcyBmb3IgJTIkcyIsDQotICAgICAgICAgICAgICAgICAgICBuYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0T3NEZXNjcmlwdGlvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIWlzQ29tcGF0aWJsZSgpKSB7DQotICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIlNraXBwaW5nIGluY29tcGF0aWJsZSBhcmNoaXZlOiAlMSRzIGZvciAlMiRzIiwNCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsDQotICAgICAgICAgICAgICAgICAgICBnZXRPc0Rlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFyY2hpdmVGaWxlID0gZG93bmxvYWRGaWxlKG9zU2RrUm9vdCwgbW9uaXRvciwgZm9yY2VIdHRwKTsNCi0gICAgICAgIGlmIChhcmNoaXZlRmlsZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKHVuYXJjaGl2ZShvc1Nka1Jvb3QsIGFyY2hpdmVGaWxlLCBzZGtNYW5hZ2VyLCBtb25pdG9yKSkgew0KLSAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiSW5zdGFsbGVkICUxJHMiLCBuYW1lKTsNCi0gICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wIGFyY2hpdmUgaWYgaXQgZXhpc3RzLCBvbmx5IG9uIHN1Y2Nlc3MNCi0gICAgICAgICAgICAgICAgZGVsZXRlRmlsZU9yRm9sZGVyKGFyY2hpdmVGaWxlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEb3dubG9hZHMgYW4gYXJjaGl2ZSBhbmQgcmV0dXJucyB0aGUgdGVtcCBmaWxlIHdpdGggaXQuDQotICAgICAqIENhbGxlciBpcyByZXNwb25zaWJsZSB3aXRoIGRlbGV0aW5nIHRoZSB0ZW1wIGZpbGUgd2hlbiBkb25lLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIGRvd25sb2FkRmlsZShTdHJpbmcgb3NTZGtSb290LCBJVGFza01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBmb3JjZUh0dHApIHsNCi0NCi0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFyZW50UGFja2FnZSgpLmdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIFN0cmluZyBkZXNjID0gU3RyaW5nLmZvcm1hdCgiRG93bmxvYWRpbmcgJTEkcyIsIG5hbWUpOw0KLSAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbihkZXNjKTsNCi0gICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KGRlc2MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBnZXRVcmwoKTsNCi0gICAgICAgIGlmICghbGluay5zdGFydHNXaXRoKCJodHRwOi8vIikgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgJiYgIWxpbmsuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgJiYgIWxpbmsuc3RhcnRzV2l0aCgiZnRwOi8vIikpIHsgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAvLyBNYWtlIHRoZSBVUkwgYWJzb2x1dGUgYnkgcHJlcGVuZGluZyB0aGUgc291cmNlDQotICAgICAgICAgICAgUGFja2FnZSBwa2cgPSBnZXRQYXJlbnRQYWNrYWdlKCk7DQotICAgICAgICAgICAgUmVwb1NvdXJjZSBzcmMgPSBwa2cuZ2V0UGFyZW50U291cmNlKCk7DQotICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJJbnRlcm5hbCBlcnJvcjogbm8gc291cmNlIGZvciBhcmNoaXZlICUxJHMiLCBuYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIHRha2UgdGhlIFVSTCB0byB0aGUgcmVwb3NpdG9yeS54bWwgYW5kIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQNCi0gICAgICAgICAgICAvLyB0byBnZXQgdGhlIGJhc2UNCi0gICAgICAgICAgICBTdHJpbmcgcmVwb1htbCA9IHNyYy5nZXRVcmwoKTsNCi0gICAgICAgICAgICBpbnQgcG9zID0gcmVwb1htbC5sYXN0SW5kZXhPZignLycpOw0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlID0gcmVwb1htbC5zdWJzdHJpbmcoMCwgcG9zICsgMSk7DQotDQotICAgICAgICAgICAgbGluayA9IGJhc2UgKyBsaW5rOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZvcmNlSHR0cCkgew0KLSAgICAgICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2VBbGwoImh0dHBzOi8vIiwgImh0dHA6Ly8iKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBiYXNlbmFtZSBvZiB0aGUgZmlsZSB3ZSdyZSBkb3dubG9hZGluZywgaS5lLiB0aGUgbGFzdCBjb21wb25lbnQNCi0gICAgICAgIC8vIG9mIHRoZSBVUkwNCi0gICAgICAgIGludCBwb3MgPSBsaW5rLmxhc3RJbmRleE9mKCcvJyk7DQotICAgICAgICBTdHJpbmcgYmFzZSA9IGxpbmsuc3Vic3RyaW5nKHBvcyArIDEpOw0KLQ0KLSAgICAgICAgLy8gUmF0aGVyIHRoYW4gY3JlYXRlIGEgcmVhbCB0ZW1wIGZpbGUgaW4gdGhlIHN5c3RlbSwgd2Ugc2ltcGx5IHVzZSBvdXINCi0gICAgICAgIC8vIHRlbXAgZm9sZGVyIChpbiB0aGUgU0RLIGJhc2UgZm9sZGVyKSBhbmQgdXNlIHRoZSBhcmNoaXZlIG5hbWUgZm9yIHRoZQ0KLSAgICAgICAgLy8gZG93bmxvYWQuIFRoaXMgYWxsb3dzIHVzIHRvIHJldXNlIG9yIGNvbnRpbnVlIGRvd25sb2Fkcy4NCi0NCi0gICAgICAgIEZpbGUgdG1wRm9sZGVyID0gZ2V0VGVtcEZvbGRlcihvc1Nka1Jvb3QpOw0KLSAgICAgICAgaWYgKCF0bXBGb2xkZXIuaXNEaXJlY3RvcnkoKSkgew0KLSAgICAgICAgICAgIGlmICh0bXBGb2xkZXIuaXNGaWxlKCkpIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlRmlsZU9yRm9sZGVyKHRtcEZvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghdG1wRm9sZGVyLm1rZGlycygpKSB7DQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlMSRzIiwgdG1wRm9sZGVyLmdldFBhdGgoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZpbGUgdG1wRmlsZSA9IG5ldyBGaWxlKHRtcEZvbGRlciwgYmFzZSk7DQotDQotICAgICAgICAvLyBpZiB0aGUgZmlsZSBleGlzdHMsIGNoZWNrIGlmIGl0cyBjaGVja3N1bSAmIHNpemUuIFVzZSBpdCBpZiBjb21wbGV0ZQ0KLSAgICAgICAgaWYgKHRtcEZpbGUuZXhpc3RzKCkpIHsNCi0gICAgICAgICAgICBpZiAodG1wRmlsZS5sZW5ndGgoKSA9PSBnZXRTaXplKCkgJiYNCi0gICAgICAgICAgICAgICAgICAgIGZpbGVDaGVja3N1bSh0bXBGaWxlLCBtb25pdG9yKS5lcXVhbHNJZ25vcmVDYXNlKGdldENoZWNrc3VtKCkpKSB7DQotICAgICAgICAgICAgICAgIC8vIEZpbGUgaXMgZ29vZCwgbGV0J3MgdXNlIGl0Lg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdG1wRmlsZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gRXhpc3RpbmcgZmlsZSBpcyBlaXRoZXIgb2YgZGlmZmVyZW50IHNpemUgb3IgY29udGVudC4NCi0gICAgICAgICAgICAvLyBUT0RPOiBjb250aW51ZSBkb3dubG9hZCB3aGVuIHdlIHN1cHBvcnQgY29udGludWUgbW9kZS4NCi0gICAgICAgICAgICAvLyBSaWdodCBub3csIGxldCdzIHNpbXBseSByZW1vdmUgdGhlIGZpbGUgYW5kIHN0YXJ0IG92ZXIuDQotICAgICAgICAgICAgZGVsZXRlRmlsZU9yRm9sZGVyKHRtcEZpbGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZldGNoVXJsKHRtcEZpbGUsIGxpbmssIGRlc2MsIG1vbml0b3IpKSB7DQotICAgICAgICAgICAgLy8gRmV0Y2hpbmcgd2FzIHN1Y2Nlc3NmdWwsIGxldCdzIHVzZSB0aGlzIGZpbGUuDQotICAgICAgICAgICAgcmV0dXJuIHRtcEZpbGU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcCBmaWxlIGlmIHdlIGFib3J0ZWQgdGhlIGRvd25sb2FkDQotICAgICAgICAgICAgLy8gVE9ETzogZGlzYWJsZSB0aGlzIHdoZW4gd2Ugd2FudCB0byBzdXBwb3J0IHBhcnRpYWwgZG93bmxvYWRzIQ0KLSAgICAgICAgICAgIGRlbGV0ZUZpbGVPckZvbGRlcih0bXBGaWxlKTsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29tcHV0ZXMgdGhlIFNIQS0xIGNoZWNrc3VtIG9mIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBmaWxlLg0KLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBlcnJvciAocmF0aGVyIHRoYW4gbnVsbCkuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlQ2hlY2tzdW0oRmlsZSB0bXBGaWxlLCBJVGFza01vbml0b3IgbW9uaXRvcikgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7DQotDQotICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3RlciA9IGdldENoZWNrc3VtVHlwZSgpLmdldE1lc3NhZ2VEaWdlc3QoKTsNCi0NCi0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNjU1MzZdOw0KLSAgICAgICAgICAgIGludCBuOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlICgobiA9IGlzLnJlYWQoYnVmKSkgPj0gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnVwZGF0ZShidWYsIDAsIG4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBnZXREaWdlc3RDaGVja3N1bShkaWdlc3Rlcik7DQotDQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRoZSBGTkYgbWVzc2FnZSBpcyBqdXN0IHRoZSBVUkwuIE1ha2UgaXQgYSBiaXQgbW9yZSB1c2VmdWwuDQotICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkZpbGUgbm90IGZvdW5kOiAlMSRzIiwgZS5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdChlLmdldE1lc3NhZ2UoKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIFNIQS0xIGZyb20gYSB7QGxpbmsgTWVzc2FnZURpZ2VzdH0gYXMgYW4gaGV4IHN0cmluZw0KLSAgICAgKiB0aGF0IGNhbiBiZSBjb21wYXJlZCB3aXRoIHtAbGluayAjZ2V0Q2hlY2tzdW0oKX0uDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREaWdlc3RDaGVja3N1bShNZXNzYWdlRGlnZXN0IGRpZ2VzdGVyKSB7DQotICAgICAgICBpbnQgbjsNCi0gICAgICAgIC8vIENyZWF0ZSBhbiBoZXggc3RyaW5nIGZyb20gdGhlIGRpZ2VzdA0KLSAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IGRpZ2VzdGVyLmRpZ2VzdCgpOw0KLSAgICAgICAgbiA9IGRpZ2VzdC5sZW5ndGg7DQotICAgICAgICBTdHJpbmcgaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIGNoYXJbXSBoZXhEaWdlc3QgPSBuZXcgY2hhcltuICogMl07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KLSAgICAgICAgICAgIGludCBiID0gZGlnZXN0W2ldICYgMHgwRkY7DQotICAgICAgICAgICAgaGV4RGlnZXN0W2kqMiArIDBdID0gaGV4LmNoYXJBdChiID4+PiA0KTsNCi0gICAgICAgICAgICBoZXhEaWdlc3RbaSoyICsgMV0gPSBoZXguY2hhckF0KGIgJiAweDBmKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGhleERpZ2VzdCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFjdHVhbGx5IHBlcmZvcm1zIHRoZSBkb3dubG9hZC4NCi0gICAgICogQWxzbyBjb21wdXRlcyB0aGUgU0hBMSBvZiB0aGUgZmlsZSBvbiB0aGUgZmx5Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIFN1Y2Nlc3MgaXMgZGVmaW5lZCBhcyBkb3dubG9hZGluZyBhcyBtYW55IGJ5dGVzIGFzIHdhcyBleHBlY3RlZCBhbmQgaGF2aW5nIHRoZSBzYW1lDQotICAgICAqIFNIQTEgYXMgZXhwZWN0ZWQuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIG9yIGZhbHNlIGlmIGFueSBvZiB0aG9zZSBjaGVja3MgZmFpbC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBtb25pdG9yIGJ5IHtAbGluayAjTlVNX01PTklUT1JfSU5DfS4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBmZXRjaFVybChGaWxlIHRtcEZpbGUsDQotICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZywNCi0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sDQotICAgICAgICAgICAgSVRhc2tNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgIFVSTCB1cmw7DQotDQotICAgICAgICBkZXNjcmlwdGlvbiArPSAiICglMSRkJSUsICUyJC4wZiBLaUIvcywgJTMkZCAlNCRzIGxlZnQpIjsNCi0NCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOw0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7DQotICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOw0KLSAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSk7DQotDQotICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3RlciA9IGdldENoZWNrc3VtVHlwZSgpLmdldE1lc3NhZ2VEaWdlc3QoKTsNCi0NCi0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNjU1MzZdOw0KLSAgICAgICAgICAgIGludCBuOw0KLQ0KLSAgICAgICAgICAgIGxvbmcgdG90YWwgPSAwOw0KLSAgICAgICAgICAgIGxvbmcgc2l6ZSA9IGdldFNpemUoKTsNCi0gICAgICAgICAgICBsb25nIGluYyA9IHNpemUgLyBOVU1fTU9OSVRPUl9JTkM7DQotICAgICAgICAgICAgbG9uZyBuZXh0X2luYyA9IGluYzsNCi0NCi0gICAgICAgICAgICBsb25nIHN0YXJ0TXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0gICAgICAgICAgICBsb25nIG5leHRNcyA9IHN0YXJ0TXMgKyAyMDAwOyAgLy8gc3RhcnQgdXBkYXRlIGFmdGVyIDIgc2Vjb25kcw0KLQ0KLSAgICAgICAgICAgIHdoaWxlICgobiA9IGlzLnJlYWQoYnVmKSkgPj0gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbik7DQotICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci51cGRhdGUoYnVmLCAwLCBuKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBsb25nIHRpbWVNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLSAgICAgICAgICAgICAgICB0b3RhbCArPSBuOw0KLSAgICAgICAgICAgICAgICBpZiAodG90YWwgPj0gbmV4dF9pbmMpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vbml0b3IuaW5jUHJvZ3Jlc3MoMSk7DQotICAgICAgICAgICAgICAgICAgICBuZXh0X2luYyArPSBpbmM7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA+IG5leHRNcykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9uZyBkZWx0YSA9IHRpbWVNcyAtIHN0YXJ0TXM7DQotICAgICAgICAgICAgICAgICAgICBpZiAodG90YWwgPiAwICYmIGRlbHRhID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnQgbGVmdCB0byBkb3dubG9hZA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJjZW50ID0gKGludCkgKDEwMCAqIHRvdGFsIC8gc2l6ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlZWQgaW4gS2lCL3MNCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IChmbG9hdCl0b3RhbCAvIChmbG9hdClkZWx0YSAqICgxMDAwLmYgLyAxMDI0LmYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgbGVmdCB0byBkb3dubG9hZCB0aGUgcmVzdCBhdCB0aGUgY3VycmVudCBLaUIvcyByYXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVMZWZ0ID0gKHNwZWVkID4gMWUtMykgPw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChzaXplIC0gdG90YWwpIC8gMTAyNC4wZikgLyBzcGVlZCkgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGltZVVuaXQgPSAic2Vjb25kcyI7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVMZWZ0ID4gMTIwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVbml0ID0gIm1pbnV0ZXMiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTGVmdCAvPSA2MDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgcGVyY2VudCwgc3BlZWQsIHRpbWVMZWZ0LCB0aW1lVW5pdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBuZXh0TXMgPSB0aW1lTXMgKyAxMDAwOyAgLy8gdXBkYXRlIGV2ZXJ5IHNlY29uZA0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsUmVxdWVzdGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJEb3dubG9hZCBhYm9ydGVkIGJ5IHVzZXIgYXQgJTEkZCBieXRlcy4iLCB0b3RhbCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHRvdGFsICE9IHNpemUpIHsNCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkRvd25sb2FkIGZpbmlzaGVkIHdpdGggd3Jvbmcgc2l6ZS4gRXhwZWN0ZWQgJTEkZCBieXRlcywgZ290ICUyJGQgYnl0ZXMuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB0b3RhbCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGhleCBzdHJpbmcgZnJvbSB0aGUgZGlnZXN0DQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbCAgID0gZ2V0RGlnZXN0Q2hlY2tzdW0oZGlnZXN0ZXIpOw0KLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGdldENoZWNrc3VtKCk7DQotICAgICAgICAgICAgaWYgKCFhY3R1YWwuZXF1YWxzSWdub3JlQ2FzZShleHBlY3RlZCkpIHsNCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkRvd25sb2FkIGZpbmlzaGVkIHdpdGggd3JvbmcgY2hlY2tzdW0uIEV4cGVjdGVkICUxJHMsIGdvdCAlMiRzLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotDQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRoZSBGTkYgbWVzc2FnZSBpcyBqdXN0IHRoZSBVUkwuIE1ha2UgaXQgYSBiaXQgbW9yZSB1c2VmdWwuDQotICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkZpbGUgbm90IGZvdW5kOiAlMSRzIiwgZS5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdChlLmdldE1lc3NhZ2UoKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5zdGFsbCB0aGUgZ2l2ZW4gYXJjaGl2ZSBpbiB0aGUgZ2l2ZW4gZm9sZGVyLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVuYXJjaGl2ZShTdHJpbmcgb3NTZGtSb290LA0KLSAgICAgICAgICAgIEZpbGUgYXJjaGl2ZUZpbGUsDQotICAgICAgICAgICAgU2RrTWFuYWdlciBzZGtNYW5hZ2VyLA0KLSAgICAgICAgICAgIElUYXNrTW9uaXRvciBtb25pdG9yKSB7DQotICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IGdldFBhcmVudFBhY2thZ2UoKS5nZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotICAgICAgICBTdHJpbmcgcGtnRGVzYyA9IFN0cmluZy5mb3JtYXQoIkluc3RhbGxpbmcgJTEkcyIsIHBrZ05hbWUpOw0KLSAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbihwa2dEZXNjKTsNCi0gICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KHBrZ0Rlc2MpOw0KLQ0KLSAgICAgICAgLy8gV2UgYWx3YXlzIHVuemlwIGluIGEgdGVtcCBmb2xkZXIgd2hpY2ggbmFtZSBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIHR5cGUNCi0gICAgICAgIC8vIChlLmcuIGFkZG9uLCB0b29scywgZXRjLikgYW5kIHRoZW4gbW92ZSB0aGUgZm9sZGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuDQotICAgICAgICAvLyBJZiB0aGUgZGVzdGluYXRpb24gZm9sZGVyIGV4aXN0cywgaXQgd2lsbCBiZSByZW5hbWVkIGFuZCBkZWxldGVkIGF0IHRoZSB2ZXJ5DQotICAgICAgICAvLyBlbmQgaWYgZXZlcnl0aGluZyBzdWNjZWVkZWQuDQotDQotICAgICAgICBTdHJpbmcgcGtnS2luZCA9IGdldFBhcmVudFBhY2thZ2UoKS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsNCi0NCi0gICAgICAgIEZpbGUgZGVzdEZvbGRlciA9IG51bGw7DQotICAgICAgICBGaWxlIHVuemlwRGVzdEZvbGRlciA9IG51bGw7DQotICAgICAgICBGaWxlIHJlbmFtZWREZXN0Rm9sZGVyID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gRmluZCBhIG5ldyB0ZW1wIGZvbGRlciB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0DQotICAgICAgICAgICAgdW56aXBEZXN0Rm9sZGVyID0gY3JlYXRlVGVtcEZvbGRlcihvc1Nka1Jvb3QsIHBrZ0tpbmQsICJuZXciKTsgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgICAgICBpZiAodW56aXBEZXN0Rm9sZGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IHNlcmlvdXNseSBoYXBwZW4uDQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gZmluZCBhIHRlbXAgZGlyZWN0b3J5IGluICUxJHMuIiwgb3NTZGtSb290KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoIXVuemlwRGVzdEZvbGRlci5ta2RpcnMoKSkgew0KLSAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJTEkcyIsIHVuemlwRGVzdEZvbGRlci5nZXRQYXRoKCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFN0cmluZ1tdIHppcFJvb3RGb2xkZXIgPSBuZXcgU3RyaW5nW10geyBudWxsIH07DQotICAgICAgICAgICAgaWYgKCF1bnppcEZvbGRlcihhcmNoaXZlRmlsZSwgZ2V0U2l6ZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdW56aXBEZXN0Rm9sZGVyLCBwa2dEZXNjLA0KLSAgICAgICAgICAgICAgICAgICAgemlwUm9vdEZvbGRlciwgbW9uaXRvcikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoIWdlbmVyYXRlU291cmNlUHJvcGVydGllcyh1bnppcERlc3RGb2xkZXIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gQ29tcHV0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkNCi0gICAgICAgICAgICBkZXN0Rm9sZGVyID0gZ2V0UGFyZW50UGFja2FnZSgpLmdldEluc3RhbGxGb2xkZXIoDQotICAgICAgICAgICAgICAgICAgICBvc1Nka1Jvb3QsIHppcFJvb3RGb2xkZXJbMF0sIHNka01hbmFnZXIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChkZXN0Rm9sZGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IHNlcmlvdXNseSBoYXBwZW4uDQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gY29tcHV0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciAlMSRzLiIsIHBrZ05hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFN3YXAgdGhlIG9sZCBmb2xkZXIgYnkgdGhlIG5ldyBvbmUuDQotICAgICAgICAgICAgLy8gV2UgaGF2ZSAyICJmb2xkZXIgcmVuYW1lIiAoYWthIG1vdmVzKSB0byBkby4NCi0gICAgICAgICAgICAvLyBUaGV5IG11c3QgYm90aCBzdWNjZWVkIGluIHRoZSByaWdodCBvcmRlci4NCi0gICAgICAgICAgICBib29sZWFuIG1vdmUxZG9uZSA9IGZhbHNlOw0KLSAgICAgICAgICAgIGJvb2xlYW4gbW92ZTJkb25lID0gZmFsc2U7DQotICAgICAgICAgICAgd2hpbGUgKCFtb3ZlMWRvbmUgfHwgIW1vdmUyZG9uZSkgew0KLSAgICAgICAgICAgICAgICBGaWxlIHJlbmFtZUZhaWxlZEZvckRpciA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgIC8vIENhc2Ugd2hlcmUgdGhlIGRlc3QgZGlyIGFscmVhZHkgZXhpc3RzDQotICAgICAgICAgICAgICAgIGlmICghbW92ZTFkb25lKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdEZvbGRlci5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRlbXAvb2xkIGRpcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVkRGVzdEZvbGRlciA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZWREZXN0Rm9sZGVyID0gY3JlYXRlVGVtcEZvbGRlcihvc1Nka1Jvb3QsIHBrZ0tpbmQsICJvbGQiKTsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmFtZWREZXN0Rm9sZGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IHNlcmlvdXNseSBoYXBwZW4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gZmluZCBhIHRlbXAgZGlyZWN0b3J5IGluICUxJHMuIiwgb3NTZGtSb290KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gbW92ZSB0aGUgY3VycmVudCBkZXN0IGRpciB0byB0aGUgdGVtcC9vbGQgb25lDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0Rm9sZGVyLnJlbmFtZVRvKHJlbmFtZWREZXN0Rm9sZGVyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiRmFpbGVkIHRvIHJlbmFtZSBkaXJlY3RvcnkgJTEkcyB0byAlMiRzLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZvbGRlci5nZXRQYXRoKCksIHJlbmFtZWREZXN0Rm9sZGVyLmdldFBhdGgoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZUZhaWxlZEZvckRpciA9IGRlc3RGb2xkZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgbW92ZTFkb25lID0gKHJlbmFtZUZhaWxlZEZvckRpciA9PSBudWxsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBDYXNlIHdoZXJlIHRoZXJlJ3Mgbm8gZGVzdCBkaXIgb3Igd2Ugc3VjY2Vzc2Z1bGx5IG1vdmVkIGl0IHRvIHRlbXAvb2xkDQotICAgICAgICAgICAgICAgIC8vIFdlIG5vdCB0cnkgdG8gbW92ZSB0aGUgdGVtcC91bnppcCB0byB0aGUgZGVzdCBkaXINCi0gICAgICAgICAgICAgICAgaWYgKG1vdmUxZG9uZSAmJiAhbW92ZTJkb25lKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lRmFpbGVkRm9yRGlyID09IG51bGwgJiYgIXVuemlwRGVzdEZvbGRlci5yZW5hbWVUbyhkZXN0Rm9sZGVyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gcmVuYW1lIGRpcmVjdG9yeSAlMSRzIHRvICUyJHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56aXBEZXN0Rm9sZGVyLmdldFBhdGgoKSwgZGVzdEZvbGRlci5nZXRQYXRoKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZUZhaWxlZEZvckRpciA9IHVuemlwRGVzdEZvbGRlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIG1vdmUyZG9uZSA9IChyZW5hbWVGYWlsZWRGb3JEaXIgPT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKHJlbmFtZUZhaWxlZEZvckRpciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX1dJTkRPV1MpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPSBXYXJuaW5nICEgPS1cbiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZm9sZGVyIGZhaWxlZCB0byBiZSByZW5hbWVkIG9yIG1vdmVkLiBPbiBXaW5kb3dzIHRoaXMgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwaWNhbGx5IG1lYW5zIHRoYXQgYSBwcm9ncmFtIGlzIHVzaW5nIHRoYXQgZm9sZGVyIChmb3IgZXhhbXBsZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaW5kb3dzIEV4cGxvcmVyIG9yIHlvdXIgYW50aS12aXJ1cyBzb2Z0d2FyZS4pXG4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgbW9tZW50YXJpbHkgZGVhY3RpdmF0ZSB5b3VyIGFudGktdmlydXMgc29mdHdhcmUuXG4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgYWxzbyBjbG9zZSBhbnkgcnVubmluZyBwcm9ncmFtcyB0aGF0IG1heSBiZSBhY2Nlc3NpbmcgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGRpcmVjdG9yeSAnJTEkcycuXG4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHJlYWR5LCBwcmVzcyBZRVMgdG8gdHJ5IGFnYWluLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVGYWlsZWRGb3JEaXIuZ2V0UGF0aCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5kaXNwbGF5UHJvbXB0KCJTREsgTWFuYWdlcjogZmFpbGVkIHRvIGluc3RhbGwiLCBtc2cpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AsIHRyeWluZyB0byByZW5hbWUgdGhlIHRlbXAgZGlyIGludG8gdGhlIGRlc3RpbmF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdW56aXBEZXN0Rm9sZGVyID0gbnVsbDsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgLy8gQ2xlYW51cCBpZiB0aGUgdW56aXAgZm9sZGVyIGlzIHN0aWxsIHNldC4NCi0gICAgICAgICAgICBkZWxldGVGaWxlT3JGb2xkZXIocmVuYW1lZERlc3RGb2xkZXIpOw0KLSAgICAgICAgICAgIGRlbGV0ZUZpbGVPckZvbGRlcih1bnppcERlc3RGb2xkZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVbnppcHMgYSB6aXAgZmlsZSBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuDQotICAgICAqDQotICAgICAqIFRoZSBhcmNoaXZlIGZpbGUgTVVTVCBoYXZlIGEgdW5pcXVlICJyb290IiBmb2xkZXIuIFRoaXMgcm9vdCBmb2xkZXIgaXMgc2tpcHBlZCB3aGVuDQotICAgICAqIHVuYXJjaGl2aW5nLiBIb3dldmVyIHdlIHJldHVybiB0aGF0IHJvb3QgZm9sZGVyIG5hbWUgdG8gdGhlIGNhbGxlciwgYXMgaXQgY2FuIGJlIHVzZWQNCi0gICAgICogYXMgYSB0ZW1wbGF0ZSB0byBrbm93IHdoYXQgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHVzZSBpbiB0aGUgQWRkLW9uIGNhc2UuDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVuemlwRm9sZGVyKEZpbGUgYXJjaGl2ZUZpbGUsDQotICAgICAgICAgICAgbG9uZyBjb21wcmVzc2VkU2l6ZSwNCi0gICAgICAgICAgICBGaWxlIHVuemlwRGVzdEZvbGRlciwNCi0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sDQotICAgICAgICAgICAgU3RyaW5nW10gb3V0WmlwUm9vdEZvbGRlciwNCi0gICAgICAgICAgICBJVGFza01vbml0b3IgbW9uaXRvcikgew0KLQ0KLSAgICAgICAgZGVzY3JpcHRpb24gKz0gIiAoJTEkZCUlKSI7DQotDQotICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB6aXBGaWxlID0gbmV3IFppcEZpbGUoYXJjaGl2ZUZpbGUpOw0KLQ0KLSAgICAgICAgICAgIC8vIGZpZ3VyZSBpZiB3ZSdsbCBuZWVkIHRvIHNldCB0aGUgdW5peCBwZXJtaXNzaW9uDQotICAgICAgICAgICAgYm9vbGVhbiB1c2luZ1VuaXhQZXJtID0gU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX0RBUldJTiB8fA0KLSAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX0xJTlVYOw0KLQ0KLSAgICAgICAgICAgIC8vIFRvIGFkdmFuY2UgdGhlIHBlcmNlbnQgYW5kIHRoZSBwcm9ncmVzcyBiYXIsIHdlIGRvbid0IGtub3cgdGhlIG51bWJlciBvZg0KLSAgICAgICAgICAgIC8vIGl0ZW1zIGxlZnQgdG8gdW56aXAuIEhvd2V2ZXIgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBhbmQgdGhlIHNpemUgb2YNCi0gICAgICAgICAgICAvLyBlYWNoIHVuY29tcHJlc3NlZCBpdGVtLiBUaGUgemlwIGZpbGUgZm9ybWF0IG92ZXJoZWFkIGlzIG5lZ2xpZ2libGUgc28gdGhhdCdzDQotICAgICAgICAgICAgLy8gYSBnb29kIGFwcHJveGltYXRpb24uDQotICAgICAgICAgICAgbG9uZyBpbmNTdGVwID0gY29tcHJlc3NlZFNpemUgLyBOVU1fTU9OSVRPUl9JTkM7DQotICAgICAgICAgICAgbG9uZyBpbmNUb3RhbCA9IDA7DQotICAgICAgICAgICAgbG9uZyBpbmNDdXJyID0gMDsNCi0gICAgICAgICAgICBpbnQgbGFzdFBlcmNlbnQgPSAwOw0KLQ0KLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs2NTUzNl07DQotDQotICAgICAgICAgICAgRW51bWVyYXRpb248WmlwQXJjaGl2ZUVudHJ5PiBlbnRyaWVzID0gemlwRmlsZS5nZXRFbnRyaWVzKCk7DQotICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0gICAgICAgICAgICAgICAgWmlwQXJjaGl2ZUVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gWmlwRmlsZSBlbnRyaWVzIHNob3VsZCBoYXZlIGZvcndhcmQgc2xhc2hlcywgYnV0IG5vdCBhbGwgWmlwDQotICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgZXhwZWN0ZWQgdG8gZG8gdGhhdC4NCi0gICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXFwnLCAnLycpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBaaXAgZW50cmllcyBhcmUgYWx3YXlzIHBhY2thZ2VzIGluIGEgdG9wLWxldmVsIGRpcmVjdG9yeQ0KLSAgICAgICAgICAgICAgICAvLyAoZS5nLiBkb2NzL2luZGV4Lmh0bWwpLiBIb3dldmVyIHdlIHdhbnQgdG8gdXNlIG91ciB0b3AtbGV2ZWwNCi0gICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5IHNvIHdlIGRyb3AgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGggbmFtZS4NCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IG5hbWUuaW5kZXhPZignLycpOw0KLSAgICAgICAgICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPT0gbmFtZS5sZW5ndGgoKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dFppcFJvb3RGb2xkZXJbMF0gPT0gbnVsbCAmJiBwb3MgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0WmlwUm9vdEZvbGRlclswXSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHVuemlwRGVzdEZvbGRlciwgbmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIvIikpIHsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuIFRoaXMgYWxsb3dzIHVzIHRvIGNyZWF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgZGlyZWN0b3JpZXMuDQotICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc3RGaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWRlc3RGaWxlLm1rZGlycygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkZhaWxlZCB0byBjcmVhdGUgdGVtcCBkaXJlY3RvcnkgJTEkcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZS5nZXRQYXRoKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuaW5kZXhPZignLycpICE9IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaXQncyBhIGZpbGUgaW4gYSBzdWItZGlyZWN0b3J5Lg0KLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBiZWVuIGNyZWF0ZWQuDQotICAgICAgICAgICAgICAgICAgICBGaWxlIHBhcmVudERpciA9IGRlc3RGaWxlLmdldFBhcmVudEZpbGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50RGlyLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudERpci5ta2RpcnMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGRpcmVjdG9yeSAlMSRzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXIuZ2V0UGF0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7DQotICAgICAgICAgICAgICAgICAgICBpbnQgbjsNCi0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudHJ5Q29udGVudCA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuID0gZW50cnlDb250ZW50LnJlYWQoYnVmKSkgIT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gaWYgbmVlZGVkIHNldCB0aGUgcGVybWlzc2lvbnMuDQotICAgICAgICAgICAgICAgIGlmICh1c2luZ1VuaXhQZXJtICYmIGRlc3RGaWxlLmlzRmlsZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1vZGUgYW5kIHRlc3QgaWYgaXQgY29udGFpbnMgdGhlIGV4ZWN1dGFibGUgYml0DQotICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGVudHJ5LmdldFVuaXhNb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGUgJiAwMTExKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXhlY3V0YWJsZVBlcm1pc3Npb24oZGVzdEZpbGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBwcm9ncmVzcyBiYXIgdG8gbWF0Y2guIFdlIHVwZGF0ZSBvbmx5IGJldHdlZW4gZmlsZXMuDQotICAgICAgICAgICAgICAgIGZvcihpbmNUb3RhbCArPSBlbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOyBpbmNDdXJyIDwgaW5jVG90YWw7IGluY0N1cnIgKz0gaW5jU3RlcCkgew0KLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5pbmNQcm9ncmVzcygxKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpbnQgcGVyY2VudCA9IChpbnQpICgxMDAgKiBpbmNUb3RhbCAvIGNvbXByZXNzZWRTaXplKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBlcmNlbnQgIT0gbGFzdFBlcmNlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIHBlcmNlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFBlcmNlbnQgPSBwZXJjZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsUmVxdWVzdGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiVW56aXAgZmFpbGVkOiAlMSRzIiwgZS5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBpZiAoemlwRmlsZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICB6aXBGaWxlLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHRlbXAgZm9sZGVyIGluIHRoZSBmb3JtIG9mIG9zQmFzZVBhdGgvdGVtcC9wcmVmaXguc3VmZml4Tk5OLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhdG9taWMgc28gdGhlcmUncyBubyBndWFyYW50ZWUgdGhlIGZvbGRlciBjYW4ndCBnZXQNCi0gICAgICogY3JlYXRlZCBpbiBiZXR3ZWVuLiBUaGlzIGlzIGhvd2V2ZXIgdW5saWtlbHkgYW5kIHRoZSBjYWxsZXIgY2FuIGFzc3VtZSB0aGUNCi0gICAgICogcmV0dXJuZWQgZm9sZGVyIGRvZXMgbm90IGV4aXN0IHlldC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gc3VjaCBmb2xkZXIgY2FuIGJlIGZvdW5kIChlLmcuIGlmIGFsbCBjYW5kaWRhdGVzIGV4aXN0LA0KLSAgICAgKiB3aGljaCBpcyByYXRoZXIgdW5saWtlbHkpIG9yIGlmIHRoZSBiYXNlIHRlbXAgZm9sZGVyIGNhbm5vdCBiZSBjcmVhdGVkLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBGb2xkZXIoU3RyaW5nIG9zQmFzZVBhdGgsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpIHsNCi0gICAgICAgIEZpbGUgYmFzZVRlbXBGb2xkZXIgPSBnZXRUZW1wRm9sZGVyKG9zQmFzZVBhdGgpOw0KLQ0KLSAgICAgICAgaWYgKCFiYXNlVGVtcEZvbGRlci5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgaWYgKGJhc2VUZW1wRm9sZGVyLmlzRmlsZSgpKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGVPckZvbGRlcihiYXNlVGVtcEZvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYmFzZVRlbXBGb2xkZXIubWtkaXJzKCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDA7IGkrKykgew0KLSAgICAgICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoYmFzZVRlbXBGb2xkZXIsDQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMSRzLiUyJHMlMyQwMmQiLCBwcmVmaXgsIHN1ZmZpeCwgaSkpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIGlmICghZm9sZGVyLmV4aXN0cygpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb2xkZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHRlbXAgZm9sZGVyIHVzZWQgYnkgdGhlIFNESyBNYW5hZ2VyLg0KLSAgICAgKiBUaGlzIGZvbGRlciBpcyBhbHdheXMgYXQgb3NCYXNlUGF0aC90ZW1wLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIGdldFRlbXBGb2xkZXIoU3RyaW5nIG9zQmFzZVBhdGgpIHsNCi0gICAgICAgIEZpbGUgYmFzZVRlbXBGb2xkZXIgPSBuZXcgRmlsZShvc0Jhc2VQYXRoLCAidGVtcCIpOyAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIGJhc2VUZW1wRm9sZGVyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWxldGVzIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4NCi0gICAgICogRGlyZWN0b3JpZXMgYXJlIGRlbGV0ZWQgcmVjdXJzaXZlbHkuDQotICAgICAqIFRoZSBhcmd1bWVudCBjYW4gYmUgbnVsbC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlT3JGb2xkZXIoRmlsZSBmaWxlT3JGb2xkZXIpIHsNCi0gICAgICAgIGlmIChmaWxlT3JGb2xkZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChmaWxlT3JGb2xkZXIuaXNEaXJlY3RvcnkoKSkgew0KLSAgICAgICAgICAgICAgICAvLyBNdXN0IGRlbGV0ZSBjb250ZW50IHJlY3Vyc2l2ZWx5IGZpcnN0DQotICAgICAgICAgICAgICAgIGZvciAoRmlsZSBpdGVtIDogZmlsZU9yRm9sZGVyLmxpc3RGaWxlcygpKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlT3JGb2xkZXIoaXRlbSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFmaWxlT3JGb2xkZXIuZGVsZXRlKCkpIHsNCi0gICAgICAgICAgICAgICAgZmlsZU9yRm9sZGVyLmRlbGV0ZU9uRXhpdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgc291cmNlLnByb3BlcnRpZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlciB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3MNCi0gICAgICogcmVsZXZhbnQgdG8gdGhpcyBhcmNoaXZlLCB0aGlzIHBhY2thZ2UgYW5kIHRoZSBzb3VyY2Ugc28gdGhhdCB3ZSBjYW4gcmVsb2FkIHRoZW0NCi0gICAgICogbG9jYWxseSBsYXRlci4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNvdXJjZVByb3BlcnRpZXMoRmlsZSB1bnppcERlc3RGb2xkZXIpIHsNCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOw0KLQ0KLSAgICAgICAgc2F2ZVByb3BlcnRpZXMocHJvcHMpOw0KLSAgICAgICAgbVBhY2thZ2Uuc2F2ZVByb3BlcnRpZXMocHJvcHMpOw0KLQ0KLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh1bnppcERlc3RGb2xkZXIsIExvY2FsU2RrUGFyc2VyLlNPVVJDRV9QUk9QRVJUSUVTKTsNCi0NCi0gICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsNCi0NCi0gICAgICAgICAgICBwcm9wcy5zdG9yZSggZm9zLCAiIyMgQW5kcm9pZCBUb29sOiBTb3VyY2Ugb2YgdGhpcyBhcmNoaXZlLiIpOyAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZXhlY3V0YWJsZSBVbml4IHBlcm1pc3Npb24gKDA3NzcpIG9uIGEgZmlsZSBvciBmb2xkZXIuDQotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHNldCBwZXJtaXNzaW9ucyBvbi4NCi0gICAgICogQHBhcmFtIHVuaXhNb2RlIHRoZSBwZXJtaXNzaW9ucyBhcyByZWNlaXZlZCBmcm9tIHtAbGluayBaaXBBcmNoaXZlRW50cnkjZ2V0VW5peE1vZGUoKX0uDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRhYmxlUGVybWlzc2lvbihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7DQotICAgICAgICAgICAiY2htb2QiLCAiNzc3IiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvRG9jUGFja2FnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvRG9jUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGM0Mjc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0RvY1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuQXJjaDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5PczsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnJlcG9zaXRvcnkuU2RrUmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIGEgZG9jIFhNTCBub2RlIGluIGFuIFNESyByZXBvc2l0b3J5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb2NQYWNrYWdlIGV4dGVuZHMgUGFja2FnZSBpbXBsZW1lbnRzIElQYWNrYWdlVmVyc2lvbiB7DQotDQotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFZlcnNpb24gbVZlcnNpb247DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvYyBwYWNrYWdlIGZyb20gdGhlIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBYTUwgbm9kZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHBhY2thZ2UgY2Fubm90IGJlIGNyZWF0ZWQuDQotICAgICAqLw0KLSAgICBEb2NQYWNrYWdlKFJlcG9Tb3VyY2Ugc291cmNlLCBOb2RlIHBhY2thZ2VOb2RlLCBNYXA8U3RyaW5nLFN0cmluZz4gbGljZW5zZXMpIHsNCi0gICAgICAgIHN1cGVyKHNvdXJjZSwgcGFja2FnZU5vZGUsIGxpY2Vuc2VzKTsNCi0NCi0gICAgICAgIGludCBhcGlMZXZlbCA9IFhtbFBhcnNlclV0aWxzLmdldFhtbEludCAgIChwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX0FQSV9MRVZFTCwgMCk7DQotICAgICAgICBTdHJpbmcgY29kZU5hbWUgPSBYbWxQYXJzZXJVdGlscy5nZXRYbWxTdHJpbmcocGFja2FnZU5vZGUsIFNka1JlcG9zaXRvcnkuTk9ERV9DT0RFTkFNRSk7DQotICAgICAgICBpZiAoY29kZU5hbWUubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIGNvZGVOYW1lID0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1WZXJzaW9uID0gbmV3IEFuZHJvaWRWZXJzaW9uKGFwaUxldmVsLCBjb2RlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1hbnVhbGx5IGNyZWF0ZSBhIG5ldyBwYWNrYWdlIHdpdGggb25lIGFyY2hpdmUgYW5kIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLg0KLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGZyb20gbG9jYWwgZGlyZWN0b3JpZXMgaW4gd2hpY2ggY2FzZSB0aGVyZSBtdXN0IGJlDQotICAgICAqIG9uZSBhcmNoaXZlIHdoaWNoIFVSTCBpcyB0aGUgYWN0dWFsIHRhcmdldCBsb2NhdGlvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgY3JlYXRlcyBhIHBhY2thZ2Ugd2l0aCBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBEb2NQYWNrYWdlKFJlcG9Tb3VyY2Ugc291cmNlLA0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMsDQotICAgICAgICAgICAgaW50IGFwaUxldmVsLA0KLSAgICAgICAgICAgIFN0cmluZyBjb2RlbmFtZSwNCi0gICAgICAgICAgICBpbnQgcmV2aXNpb24sDQotICAgICAgICAgICAgU3RyaW5nIGxpY2Vuc2UsDQotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjVXJsLA0KLSAgICAgICAgICAgIE9zIGFyY2hpdmVPcywNCi0gICAgICAgICAgICBBcmNoIGFyY2hpdmVBcmNoLA0KLSAgICAgICAgICAgIFN0cmluZyBhcmNoaXZlT3NQYXRoKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsDQotICAgICAgICAgICAgICAgIHByb3BzLA0KLSAgICAgICAgICAgICAgICByZXZpc2lvbiwNCi0gICAgICAgICAgICAgICAgbGljZW5zZSwNCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sDQotICAgICAgICAgICAgICAgIGRlc2NVcmwsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVPcywNCi0gICAgICAgICAgICAgICAgYXJjaGl2ZUFyY2gsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVPc1BhdGgpOw0KLSAgICAgICAgbVZlcnNpb24gPSBuZXcgQW5kcm9pZFZlcnNpb24ocHJvcHMsIGFwaUxldmVsLCBjb2RlbmFtZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcGFja2FnZXMgaW4gdGhlIGdpdmVuIHtAbGluayBQcm9wZXJ0aWVzfSBvYmplY3QuDQotICAgICAqIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBsYXRlciBiZSBnaXZlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICB2b2lkIHNhdmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsNCi0gICAgICAgIHN1cGVyLnNhdmVQcm9wZXJ0aWVzKHByb3BzKTsNCi0NCi0gICAgICAgIG1WZXJzaW9uLnNhdmVQcm9wZXJ0aWVzKHByb3BzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogUmV0dXJucyB0aGUgdmVyc2lvbiwgZm9yIHBsYXRmb3JtLCBhZGQtb24gYW5kIGRvYyBwYWNrYWdlcy4NCi0gICAgICogIENhbiBiZSAwIGlmIHRoaXMgaXMgYSBsb2NhbCBwYWNrYWdlIG9mIHVua25vd24gYXBpLWxldmVsLiAqLw0KLSAgICBwdWJsaWMgQW5kcm9pZFZlcnNpb24gZ2V0VmVyc2lvbigpIHsNCi0gICAgICAgIHJldHVybiBtVmVyc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICAvKiogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciBhbiB7QGxpbmsgSURlc2NyaXB0aW9ufS4gKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIGlmIChtVmVyc2lvbi5pc1ByZXZpZXcoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJEb2N1bWVudGF0aW9uIGZvciBBbmRyb2lkICclMSRzJyBQcmV2aWV3IFNESywgcmV2aXNpb24gJTIkcyIsDQotICAgICAgICAgICAgICAgICAgICBtVmVyc2lvbi5nZXRDb2RlbmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0UmV2aXNpb24oKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJEb2N1bWVudGF0aW9uIGZvciBBbmRyb2lkIFNESywgQVBJICUxJGQsIHJldmlzaW9uICUyJHMiLA0KLSAgICAgICAgICAgICAgICAgICAgbVZlcnNpb24uZ2V0QXBpTGV2ZWwoKSwNCi0gICAgICAgICAgICAgICAgICAgIGdldFJldmlzaW9uKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgbG9uZyBkZXNjcmlwdGlvbiBmb3IgYW4ge0BsaW5rIElEZXNjcmlwdGlvbn0uDQotICAgICAqDQotICAgICAqIFRoZSBsb25nIGRlc2NyaXB0aW9uIGlzIHdoYXRldmVyIHRoZSBYTUwgY29udGFpbnMgZm9yIHRoZSAmbHQ7ZGVzY3JpcHRpb24mZ3Q7IGZpZWxkLA0KLSAgICAgKiBvciB0aGUgc2hvcnQgZGVzY3JpcHRpb24gaWYgdGhlIGZvcm1lciBpcyBlbXB0eS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIFN0cmluZyBzID0gZ2V0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgcyA9IGdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzLmluZGV4T2YoInJldmlzaW9uIikgPT0gLTEpIHsNCi0gICAgICAgICAgICBzICs9IFN0cmluZy5mb3JtYXQoIlxuUmV2aXNpb24gJTEkZCIsIGdldFJldmlzaW9uKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbXB1dGVzIGEgcG90ZW50aWFsIGluc3RhbGxhdGlvbiBmb2xkZXIgaWYgYW4gYXJjaGl2ZSBvZiB0aGlzIHBhY2thZ2Ugd2VyZQ0KLSAgICAgKiB0byBiZSBpbnN0YWxsZWQgcmlnaHQgYXdheSBpbiB0aGUgZ2l2ZW4gU0RLIHJvb3QuDQotICAgICAqIDxwLz4NCi0gICAgICogQSAiZG9jIiBwYWNrYWdlIHNob3VsZCBhbHdheXMgYmUgbG9jYXRlZCBpbiBTREsvZG9jcy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9zU2RrUm9vdCBUaGUgT1MgcGF0aCBvZiB0aGUgU0RLIHJvb3QgZm9sZGVyLg0KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGVkRGlyIEEgc3VnZ2VzdGlvbiBmb3IgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgbmFtZSwgYmFzZWQgb24gdGhlIHJvb3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgICBmb2xkZXIgdXNlZCBpbiB0aGUgemlwIGFyY2hpdmUuDQotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIEFuIGV4aXN0aW5nIFNESyBtYW5hZ2VyIHRvIGxpc3QgY3VycmVudCBwbGF0Zm9ybXMgYW5kIGFkZG9ucy4NCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgRmlsZX0gY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0b3J5IHRvIHVzZSB0byBpbnN0YWxsIHRoaXMgcGFja2FnZS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmlsZSBnZXRJbnN0YWxsRm9sZGVyKFN0cmluZyBvc1Nka1Jvb3QsIFN0cmluZyBzdWdnZXN0ZWREaXIsIFNka01hbmFnZXIgc2RrTWFuYWdlcikgew0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG9zU2RrUm9vdCwgU2RrQ29uc3RhbnRzLkZEX0RPQ1MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzYW1lSXRlbUFzKFBhY2thZ2UgcGtnKSB7DQotICAgICAgICAvLyBvbmx5IG9uZSBkb2MgcGFja2FnZSBzbyBhbnkgZG9jIHBhY2thZ2UgaXMgdGhlIHNhbWUgaXRlbS4NCi0gICAgICAgIHJldHVybiBwa2cgaW5zdGFuY2VvZiBEb2NQYWNrYWdlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqDQotICAgICAqIFRoZSBjb21wYXJpc29uIGJldHdlZW4gZG9jIHBhY2thZ2VzIGlzIGEgYml0IG1vcmUgY29tcGxleCBzbyB3ZSBvdmVycmlkZSB0aGUgZGVmYXVsdA0KLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBEb2NzIGFyZSB1cGdyYWRlIGlmIHRoZXkgaGF2ZSBhIGhpZ2hlciBhcGksIG9yIGEgc2ltaWxhciBhcGkgYnV0IGEgaGlnaGVyIHJldmlzaW9uLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFdoYXQgbWFrZXMgdGhpcyBtb3JlIGNvbXBsZXggaXMgaGFuZGxpbmcgY29kZW5hbWUuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFVwZGF0ZUluZm8gY2FuQmVVcGRhdGVkQnkoUGFja2FnZSByZXBsYWNlbWVudFBhY2thZ2UpIHsNCi0gICAgICAgIGlmIChyZXBsYWNlbWVudFBhY2thZ2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBVcGRhdGVJbmZvLklOQ09NUEFUSUJMRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGNoZWNrIHRoZXkgYXJlIHRoZSBzYW1lIGl0ZW0uDQotICAgICAgICBpZiAoc2FtZUl0ZW1BcyhyZXBsYWNlbWVudFBhY2thZ2UpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZUluZm8uSU5DT01QQVRJQkxFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRG9jUGFja2FnZSByZXBsYWNlbWVudERvYyA9IChEb2NQYWNrYWdlKXJlcGxhY2VtZW50UGFja2FnZTsNCi0NCi0gICAgICAgIEFuZHJvaWRWZXJzaW9uIHJlcGxhY2VtZW50VmVyc2lvbiA9IHJlcGxhY2VtZW50RG9jLmdldFZlcnNpb24oKTsNCi0NCi0gICAgICAgIC8vIHRoZSBuZXcgZG9jIGlzIGFuIHVwZGF0ZSBpZiB0aGUgYXBpIGxldmVsIGlzIGhpZ2hlciAobm8gbWF0dGVyIHRoZSBjb2RlbmFtZSBvbiBlaXRoZXIpDQotICAgICAgICBpZiAocmVwbGFjZW1lbnRWZXJzaW9uLmdldEFwaUxldmVsKCkgPiBtVmVyc2lvbi5nZXRBcGlMZXZlbCgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZUluZm8uVVBEQVRFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhleSdyZSB0aGUgc2FtZSBleGFjdCAoYXBpIGFuZCBjb2RlbmFtZSkNCi0gICAgICAgIGlmIChyZXBsYWNlbWVudFZlcnNpb24uZXF1YWxzKG1WZXJzaW9uKSkgew0KLSAgICAgICAgICAgIC8vIGV4YWN0IHNhbWUgdmVyc2lvbiwgc28gY2hlY2sgdGhlIHJldmlzaW9uIGxldmVsDQotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50UGFja2FnZS5nZXRSZXZpc2lvbigpID4gdGhpcy5nZXRSZXZpc2lvbigpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBVcGRhdGVJbmZvLlVQREFURTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIG5vdCB0aGUgc2FtZSB2ZXJzaW9uPyB3ZSBjaGVjayBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgYXBpIGxldmVsIGFuZCB0aGUgbmV3IG9uZQ0KLSAgICAgICAgICAgIC8vIGlzIGEgcHJldmlldywgaW4gd2hpY2ggY2FzZSBpdCdzIGFsc28gYW4gdXBkYXRlIChzaW5jZSBwcmV2aWV3IGhhdmUgdGhlIGFwaSBsZXZlbA0KLSAgICAgICAgICAgIC8vIG9mIHRoZSBfcHJldmlvdXNfIHZlcnNpb24uKQ0KLSAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudFZlcnNpb24uZ2V0QXBpTGV2ZWwoKSA9PSBtVmVyc2lvbi5nZXRBcGlMZXZlbCgpICYmDQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudFZlcnNpb24uaXNQcmV2aWV3KCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZUluZm8uVVBEQVRFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIG5vdCBhbiB1cGdyYWRlIGJ1dCBub3QgaW5jb21wYXRpYmxlIGVpdGhlci4NCi0gICAgICAgIHJldHVybiBVcGRhdGVJbmZvLk5PVF9VUERBVEU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvRXh0cmFQYWNrYWdlLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9FeHRyYVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YzZDBlNy4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9FeHRyYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BcmNoaXZlLkFyY2g7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuT3M7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5LlNka1JlcG9zaXRvcnk7DQotDQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotLyoqDQotICogUmVwcmVzZW50cyBhIGV4dHJhIFhNTCBub2RlIGluIGFuIFNESyByZXBvc2l0b3J5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRyYVBhY2thZ2UgZXh0ZW5kcyBNaW5Ub29sc1BhY2thZ2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QQVRIICAgICAgICAgID0gIkV4dHJhLlBhdGgiOyAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBpbnN0YWxsIGZvbGRlciBuYW1lLiBJdCBtdXN0IGJlIGEgc2luZ2xlLXNlZ21lbnQgcGF0aC4NCi0gICAgICogVGhlIHBhdGhzICJhZGQtb25zIiwgInBsYXRmb3JtcyIsICJ0b29scyIgYW5kICJkb2NzIiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLg0KLSAgICAgKiBUaGlzIGxpbWl0YXRpb24gY2Fubm90IGJlIHdyaXR0ZW4gaW4gdGhlIFhNTCBTY2hlbWEgYW5kIG11c3QgYmUgZW5mb3JjZWQgaGVyZSBieSB1c2luZw0KLSAgICAgKiB0aGUgbWV0aG9kIHtAbGluayAjaXNQYXRoVmFsaWQoKX0gKmJlZm9yZSogaW5zdGFsbGluZyB0aGUgcGFja2FnZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0b29sIHBhY2thZ2UgZnJvbSB0aGUgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIFhNTCBub2RlLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFja2FnZSBjYW5ub3QgYmUgY3JlYXRlZC4NCi0gICAgICovDQotICAgIEV4dHJhUGFja2FnZShSZXBvU291cmNlIHNvdXJjZSwgTm9kZSBwYWNrYWdlTm9kZSwgTWFwPFN0cmluZyxTdHJpbmc+IGxpY2Vuc2VzKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsIHBhY2thZ2VOb2RlLCBsaWNlbnNlcyk7DQotDQotICAgICAgICBtUGF0aCA9IFhtbFBhcnNlclV0aWxzLmdldFhtbFN0cmluZyhwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX1BBVEgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNYW51YWxseSBjcmVhdGUgYSBuZXcgcGFja2FnZSB3aXRoIG9uZSBhcmNoaXZlIGFuZCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBvciBwcm9wZXJ0aWVzLg0KLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGZyb20gbG9jYWwgZGlyZWN0b3JpZXMgaW4gd2hpY2ggY2FzZSB0aGVyZSBtdXN0IGJlDQotICAgICAqIG9uZSBhcmNoaXZlIHdoaWNoIFVSTCBpcyB0aGUgYWN0dWFsIHRhcmdldCBsb2NhdGlvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgY3JlYXRlcyBhIHBhY2thZ2Ugd2l0aCBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBFeHRyYVBhY2thZ2UoUmVwb1NvdXJjZSBzb3VyY2UsDQotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcywNCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCwNCi0gICAgICAgICAgICBpbnQgcmV2aXNpb24sDQotICAgICAgICAgICAgU3RyaW5nIGxpY2Vuc2UsDQotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjVXJsLA0KLSAgICAgICAgICAgIE9zIGFyY2hpdmVPcywNCi0gICAgICAgICAgICBBcmNoIGFyY2hpdmVBcmNoLA0KLSAgICAgICAgICAgIFN0cmluZyBhcmNoaXZlT3NQYXRoKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsDQotICAgICAgICAgICAgICAgIHByb3BzLA0KLSAgICAgICAgICAgICAgICByZXZpc2lvbiwNCi0gICAgICAgICAgICAgICAgbGljZW5zZSwNCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sDQotICAgICAgICAgICAgICAgIGRlc2NVcmwsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVPcywNCi0gICAgICAgICAgICAgICAgYXJjaGl2ZUFyY2gsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVPc1BhdGgpOw0KLQ0KLSAgICAgICAgLy8gVGhlIHBhdGggYXJndW1lbnQgY29tZXMgYmVmb3JlIHdoYXRldmVyIGNvdWxkIGJlIGluIHRoZSBwcm9wZXJ0aWVzDQotICAgICAgICBtUGF0aCA9IHBhdGggIT0gbnVsbCA/IHBhdGggOiBnZXRQcm9wZXJ0eShwcm9wcywgUFJPUF9QQVRILCBwYXRoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwYWNrYWdlcyBpbiB0aGUgZ2l2ZW4ge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICogVGhlc2UgcHJvcGVydGllcyB3aWxsIGxhdGVyIGJlIGdpdmUgdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0Lg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHZvaWQgc2F2ZVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcykgew0KLSAgICAgICAgc3VwZXIuc2F2ZVByb3BlcnRpZXMocHJvcHMpOw0KLQ0KLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9QQVRILCBtUGF0aCk7DQotDQotICAgICAgICBpZiAoZ2V0TWluVG9vbHNSZXZpc2lvbigpICE9IE1JTl9UT09MU19SRVZfTk9UX1NQRUNJRklFRCkgew0KLSAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfTUlOX1RPT0xTX1JFViwgSW50ZWdlci50b1N0cmluZyhnZXRNaW5Ub29sc1JldmlzaW9uKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU3RhdGljIGhlbHBlciB0byBjaGVjayBpZiBhIGdpdmVuIHBhdGggaXMgYWNjZXB0YWJsZSBmb3IgYW4gImV4dHJhIiBwYWNrYWdlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXRoVmFsaWQoKSB7DQotICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLkZEX0FERE9OUy5lcXVhbHMobVBhdGgpIHx8DQotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GRF9QTEFURk9STVMuZXF1YWxzKG1QYXRoKSB8fA0KLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRkRfVE9PTFMuZXF1YWxzKG1QYXRoKSB8fA0KLSAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRkRfRE9DUy5lcXVhbHMobVBhdGgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1QYXRoICE9IG51bGwgJiYgbVBhdGguaW5kZXhPZignLycpID09IC0xICYmIG1QYXRoLmluZGV4T2YoJ1xcJykgPT0gLTE7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBpbnN0YWxsIGZvbGRlciBuYW1lLiBJdCBtdXN0IGJlIGEgc2luZ2xlLXNlZ21lbnQgcGF0aC4NCi0gICAgICogVGhlIHBhdGhzICJhZGQtb25zIiwgInBsYXRmb3JtcyIsICJ0b29scyIgYW5kICJkb2NzIiBhcmUgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLg0KLSAgICAgKiBUaGlzIGxpbWl0YXRpb24gY2Fubm90IGJlIHdyaXR0ZW4gaW4gdGhlIFhNTCBTY2hlbWEgYW5kIG11c3QgYmUgZW5mb3JjZWQgaGVyZSBieSB1c2luZw0KLSAgICAgKiB0aGUgbWV0aG9kIHtAbGluayAjaXNQYXRoVmFsaWQoKX0gKmJlZm9yZSogaW5zdGFsbGluZyB0aGUgcGFja2FnZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsNCi0gICAgICAgIHJldHVybiBtUGF0aDsNCi0gICAgfQ0KLQ0KLSAgICAvKiogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciBhbiB7QGxpbmsgSURlc2NyaXB0aW9ufS4gKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGF0aCgpOw0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIFVuaWZvcm1pemUgYWxsIHNwYWNlcyBpbiB0aGUgbmFtZSBhbmQgdXBwZXIgY2FzZSB3b3Jkcy4NCi0NCi0gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJbIF9cdFxmLV0rIiwgIiAiKTsgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLSAgICAgICAgICAgIC8vIExvb2sgYXQgYWxsIGxvd2VyIGNhc2UgY2hhcmFjdGVycyBpbiByYW5nZSBbMS4ubi0xXSBhbmQgcmVwbGFjZSB0aGVtIGJ5IGFuIHVwcGVyDQotICAgICAgICAgICAgLy8gY2FzZSBpZiB0aGV5IGFyZSBwcmVjZWRlZCBieSBhIHNwYWNlLiBBbHNvIHVwcGVyIGNhc2VzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlDQotICAgICAgICAgICAgLy8gc3RyaW5nLg0KLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5hbWUudG9DaGFyQXJyYXkoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBuID0gY2hhcnMubGVuZ3RoIC0gMSwgaSA9IDA7IGkgPCBuOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaGFyc1tpXSkgJiYgKGkgPT0gMCB8fCBjaGFyc1tpIC0gMV0gPT0gJyAnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2hhcnNbaV0pOw0KLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsNCi0gICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBTdHJpbmcoY2hhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gU3RyaW5nLmZvcm1hdCgiJTEkcyBwYWNrYWdlLCByZXZpc2lvbiAlMiRkIiwNCi0gICAgICAgICAgICAgICAgbmFtZSwNCi0gICAgICAgICAgICAgICAgZ2V0UmV2aXNpb24oKSk7DQotDQotICAgICAgICByZXR1cm4gczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGxvbmcgZGVzY3JpcHRpb24gZm9yIGFuIHtAbGluayBJRGVzY3JpcHRpb259Lg0KLSAgICAgKg0KLSAgICAgKiBUaGUgbG9uZyBkZXNjcmlwdGlvbiBpcyB3aGF0ZXZlciB0aGUgWE1MIGNvbnRhaW5zIGZvciB0aGUgJmx0O2Rlc2NyaXB0aW9uJmd0OyBmaWVsZCwNCi0gICAgICogb3IgdGhlIHNob3J0IGRlc2NyaXB0aW9uIGlmIHRoZSBmb3JtZXIgaXMgZW1wdHkuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICBTdHJpbmcgcyA9IGdldERlc2NyaXB0aW9uKCk7DQotICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHMgPSBTdHJpbmcuZm9ybWF0KCJFeHRyYSAlMSRzIHBhY2thZ2UiLCBnZXRQYXRoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHMuaW5kZXhPZigicmV2aXNpb24iKSA9PSAtMSkgew0KLSAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZvcm1hdCgiXG5SZXZpc2lvbiAlMSRkIiwgZ2V0UmV2aXNpb24oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0TWluVG9vbHNSZXZpc2lvbigpICE9IE1JTl9UT09MU19SRVZfTk9UX1NQRUNJRklFRCkgew0KLSAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZvcm1hdCgiXG5SZXF1aXJlcyB0b29scyByZXZpc2lvbiAlMSRkIiwgZ2V0TWluVG9vbHNSZXZpc2lvbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wdXRlcyBhIHBvdGVudGlhbCBpbnN0YWxsYXRpb24gZm9sZGVyIGlmIGFuIGFyY2hpdmUgb2YgdGhpcyBwYWNrYWdlIHdlcmUNCi0gICAgICogdG8gYmUgaW5zdGFsbGVkIHJpZ2h0IGF3YXkgaW4gdGhlIGdpdmVuIFNESyByb290Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIEEgInRvb2wiIHBhY2thZ2Ugc2hvdWxkIGFsd2F5cyBiZSBsb2NhdGVkIGluIFNESy90b29scy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9zU2RrUm9vdCBUaGUgT1MgcGF0aCBvZiB0aGUgU0RLIHJvb3QgZm9sZGVyLg0KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGVkRGlyIEEgc3VnZ2VzdGlvbiBmb3IgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgbmFtZSwgYmFzZWQgb24gdGhlIHJvb3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgICBmb2xkZXIgdXNlZCBpbiB0aGUgemlwIGFyY2hpdmUuDQotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIEFuIGV4aXN0aW5nIFNESyBtYW5hZ2VyIHRvIGxpc3QgY3VycmVudCBwbGF0Zm9ybXMgYW5kIGFkZG9ucy4NCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgRmlsZX0gY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0b3J5IHRvIHVzZSB0byBpbnN0YWxsIHRoaXMgcGFja2FnZS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmlsZSBnZXRJbnN0YWxsRm9sZGVyKFN0cmluZyBvc1Nka1Jvb3QsIFN0cmluZyBzdWdnZXN0ZWREaXIsIFNka01hbmFnZXIgc2RrTWFuYWdlcikgew0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG9zU2RrUm9vdCwgZ2V0UGF0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gc2FtZUl0ZW1BcyhQYWNrYWdlIHBrZykgew0KLSAgICAgICAgLy8gRXh0cmEgcGFja2FnZXMgYXJlIHNpbWlsYXIgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHBhdGguDQotICAgICAgICByZXR1cm4gcGtnIGluc3RhbmNlb2YgRXh0cmFQYWNrYWdlICYmICgoRXh0cmFQYWNrYWdlKXBrZykubVBhdGguZXF1YWxzKG1QYXRoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JRGVzY3JpcHRpb24uamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YWY5MmUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgZWxlbWVudHMgdGhhdCBjYW4gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZW1zZWx2ZXMuDQotICovDQotcHVibGljIGludGVyZmFjZSBJRGVzY3JpcHRpb24gew0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBDYW5ub3QgYmUgbnVsbC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBBIGRlc2NyaXB0aW9uIGlzIGEgbXVsdGktbGluZSBvZiB0ZXh0LCB0eXBpY2FsbHkgbXVjaCBtb3JlDQotICAgICAqIGVsYWJvcmF0ZSB0aGFuIHdoYXQge0BsaW5rICN0b1N0cmluZygpfSB3b3VsZCBwcm92aWRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIGVsZW1lbnQuIENhbm5vdCBiZSBudWxsLg0KLSAgICAgKiA8cC8+DQotICAgICAqIEEgZGVzY3JpcHRpb24gaXMgYSBtdWx0aS1saW5lIG9mIHRleHQsIHR5cGljYWxseSBtdWNoIG1vcmUNCi0gICAgICogZWxhYm9yYXRlIHRoYW4gd2hhdCB7QGxpbmsgI3RvU3RyaW5nKCl9IHdvdWxkIHByb3ZpZGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JUGFja2FnZVZlcnNpb24uamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lQYWNrYWdlVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmQ3YjVkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lQYWNrYWdlVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgYW4ge0BsaW5rIEFuZHJvaWRWZXJzaW9ufS4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlVmVyc2lvbiB7DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uLCBmb3IgcGxhdGZvcm0sIGFkZC1vbiBhbmQgZG9jIHBhY2thZ2VzLg0KLSAgICAgKiBDYW4gYmUgMCBpZiB0aGlzIGlzIGEgbG9jYWwgcGFja2FnZSBvZiB1bmtub3duIGFwaS1sZXZlbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBBbmRyb2lkVmVyc2lvbiBnZXRWZXJzaW9uKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lUYXNrLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTc4NDYwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotDQotLyoqDQotICogQSB0YXNrIHRoYXQgZXhlY3V0ZXMgYW5kIGNhbiB1cGRhdGUgYSBtb25pdG9yIHRvIGRpc3BsYXkgaXRzIHN0YXR1cy4NCi0gKiBUaGUgdGFzayB3aWxsIGdlbmVyYWxseSBiZSBydW4gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuDQotICovDQotcHVibGljIGludGVyZmFjZSBJVGFzayB7DQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bihJVGFza01vbml0b3IgbW9uaXRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lUYXNrRmFjdG9yeS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvSVRhc2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0MDgyNWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvSVRhc2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotLyoqDQotICogQSBmYWN0b3J5IHRoYXQgY2FuIHN0YXJ0IGFuZCBydW4gbmV3IHtAbGluayBJVGFza31zLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhc2tGYWN0b3J5IHsNCi0NCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoU3RyaW5nIHRpdGxlLCBJVGFzayB0YXNrKTsNCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvSVRhc2tNb25pdG9yLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JVGFza01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA4ZTI3Yy4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JVGFza01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi0NCi0vKioNCi0gKiBBIG1vbml0b3IgaW50ZXJmYWNlIGZvciBhIHtAbGluayBJVGFza30uDQotICogPHAvPg0KLSAqIERlcGVuZGluZyBvbiB0aGUgdGFzayBmYWN0b3J5IHRoYXQgY3JlYXRlZCB0aGUgdGFzaywgdGhlcmUgbWlnaHQgbm90IGJlIGFueSBVSQ0KLSAqIG9yIGl0IG1pZ2h0IG5vdCBpbXBsZW1lbnQgYWxsIHRoZSBtZXRob2RzLCBpbiB3aGljaCBjYXNlIGNhbGxpbmcgdGhlbSB3b3VsZCBiZQ0KLSAqIGEgbm8tb3AgYnV0IGlzIGd1YXJhbnRlZWQgbm90IHRvIGNyYXNoLg0KLSAqIDxwLz4NCi0gKiBJZiB0aGUgdGFzayBydW5zIGluIGEgbm9uLVVJIHdvcmtlciB0aHJlYWQsIHRoZSB0YXNrIGZhY3RvcnkgaW1wbGVtZW50YXRpb24NCi0gKiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgdXBkYXRlIHRoZSBVSSBpbiB0aGUgY29ycmVjdCB0aHJlYWQuIFRoZSB0YXNrIGl0c2VsZg0KLSAqIG11c3Qgbm90IGhhdmUgdG8gZGVhbCB3aXRoIGl0Lg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhc2tNb25pdG9yIHsNCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBjdXJyZW50IHRhc2sgZGlhbG9nLg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbkZvcm1hdCwgT2JqZWN0Li4uYXJncyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSByZXN1bHQgdGV4dCBpbiB0aGUgY3VycmVudCB0YXNrIGRpYWxvZy4NCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoU3RyaW5nIHJlc3VsdEZvcm1hdCwgT2JqZWN0Li4uYXJncyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBtYXggdmFsdWUgb2YgdGhlIHByb2dyZXNzIGJhci4NCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQuDQotICAgICAqDQotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgaW52b2tlZCBvbmNlIGJlZm9yZSB1c2luZyB7QGxpbmsgI2luY1Byb2dyZXNzKGludCl9IG9yDQotICAgICAqIHtAbGluayAjZ2V0UHJvZ3Jlc3MoKX0gb3Ige0BsaW5rICNjcmVhdGVTdWJNb25pdG9yKGludCl9LiBDYWxsZXJzIGFyZQ0KLSAgICAgKiBkaXNjb3VyYWdlZCBmcm9tIHVzaW5nIG1vcmUgdGhhbiBvbmNlIC0tIGltcGxlbWVudGF0aW9ucyBjYW4gZWl0aGVyIGRpc2NhcmQNCi0gICAgICogdGhlIG5leHQgY2FsbHMgb3IgYmVoYXZlIGluY29oZXJlbnRseS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzTWF4KGludCBtYXgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogSW5jcmVtZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICoNCi0gICAgICogQ2FsbGVycyBNVVNUIHVzZSBzZXRQcm9ncmVzc01heCBiZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBpbmNQcm9ncmVzcyhpbnQgZGVsdGEpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLA0KLSAgICAgKiBiZXR3ZWVuIDAgYW5kIHVwIHRvIHtAbGluayAjc2V0UHJvZ3Jlc3NNYXgoaW50KX0gLSAxLg0KLSAgICAgKg0KLSAgICAgKiBDYWxsZXJzIE1VU1QgdXNlIHNldFByb2dyZXNzTWF4IGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uDQotICAgICAqIEl0IGlzIHVwIHRvIHRoZSB0YXNrIHRocmVhZCB0byBwb29sIHRoaXMgYW5kIGV4aXQgYXMgc29vbg0KLSAgICAgKiBhcyBwb3NzaWJsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgc3ViLW1vbml0b3IgdGhhdCB3aWxsIHVzZSB1cCB0byB0aWNrQ291bnQgb24gdGhlIHByb2dyZXNzIGJhci4NCi0gICAgICogdGlja0NvdW50IG11c3QgYmUgMSBvciBtb3JlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIElUYXNrTW9uaXRvciBjcmVhdGVTdWJNb25pdG9yKGludCB0aWNrQ291bnQpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGlzcGxheSBhIHllcy9ubyBxdWVzdGlvbiBkaWFsb2cgYm94Lg0KLSAgICAgKg0KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgTVVTVCBhbGxvdyB0aGlzIHRvIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQsIGUuZy4gYnkNCi0gICAgICogbWFraW5nIHN1cmUgdGhlIGRpYWxvZyBpcyBvcGVuZWQgc3luY2hyb25vdXNseSBpbiB0aGUgdWkgdGhyZWFkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYm94DQotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBZRVMgd2FzIGNsaWNrZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwbGF5UHJvbXB0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Mb2NhbFNka1BhcnNlci5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTG9jYWxTZGtQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjNlYzg5Mi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Mb2NhbFNka1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0Ow0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuQXJjaDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5PczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIFNjYW5zIGEgbG9jYWwgU0RLIHRvIGZpbmQgd2hpY2ggcGFja2FnZXMgYXJlIGN1cnJlbnRseSBpbnN0YWxsZWQuDQotICovDQotcHVibGljIGNsYXNzIExvY2FsU2RrUGFyc2VyIHsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfUFJPUEVSVElFUyA9ICJzb3VyY2UucHJvcGVydGllcyI7ICAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgUGFja2FnZVtdIG1QYWNrYWdlczsNCi0NCi0gICAgcHVibGljIExvY2FsU2RrUGFyc2VyKCkgew0KLSAgICAgICAgLy8gcGFzcw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlcyBmb3VuZCBieSB0aGUgbGFzdCBjYWxsIHRvDQotICAgICAqIHtAbGluayAjcGFyc2VTZGsoU3RyaW5nLCBTZGtNYW5hZ2VyLCBJU2RrTG9nKX0uDQotICAgICAqIDxwLz4NCi0gICAgICogVGhpcyByZXR1cm5zIGluaXRpYWxseSByZXR1cm5zIG51bGwuDQotICAgICAqIE9uY2UgdGhlIHBhcnNlU2RrKCkgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCwgdGhpcyByZXR1cm5zIGEgcG9zc2libHkgZW1wdHkgYnV0IG5vbi1udWxsIGFycmF5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFBhY2thZ2VbXSBnZXRQYWNrYWdlcygpIHsNCi0gICAgICAgIHJldHVybiBtUGFja2FnZXM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENsZWFyIHRoZSBpbnRlcm5hbCBwYWNrYWdlcyBsaXN0LiBBZnRlciB0aGlzIGNhbGwsIHtAbGluayAjZ2V0UGFja2FnZXMoKX0gd2lsbCByZXR1cm4NCi0gICAgICogbnVsbCB0aWxsIHtAbGluayAjcGFyc2VTZGsoU3RyaW5nLCBTZGtNYW5hZ2VyLCBJU2RrTG9nKX0gaXMgY2FsbGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY2xlYXJQYWNrYWdlcygpIHsNCi0gICAgICAgIG1QYWNrYWdlcyA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNjYW4gdGhlIGdpdmUgU0RLIHRvIGZpbmQgYWxsIHRoZSBwYWNrYWdlcyBhbHJlYWR5IGluc3RhbGxlZCBhdCB0aGlzIGxvY2F0aW9uLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFN0b3JlIHRoZSBwYWNrYWdlcyBpbnRlcm5hbGx5LiBZb3UgY2FuIHVzZSB7QGxpbmsgI2dldFBhY2thZ2VzKCl9IHRvIHJldHJpZXZlIHRoZW0NCi0gICAgICogYXQgYW55IHRpbWUgbGF0ZXIuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBvc1Nka1Jvb3QgVGhlIHBhdGggdG8gdGhlIFNESyBmb2xkZXIuDQotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIEFuIGV4aXN0aW5nIFNESyBtYW5hZ2VyIHRvIGxpc3QgY3VycmVudCBwbGF0Zm9ybXMgYW5kIGFkZG9ucy4NCi0gICAgICogQHBhcmFtIGxvZyBBbiBTREsgbG9nZ2VyIG9iamVjdC4NCi0gICAgICogQHJldHVybiBUaGUgcGFja2FnZXMgZm91bmQuIENhbiBiZSByZXRyaWV2ZWQgbGF0ZXIgdXNpbmcge0BsaW5rICNnZXRQYWNrYWdlcygpfS4NCi0gICAgICovDQotICAgIHB1YmxpYyBQYWNrYWdlW10gcGFyc2VTZGsoU3RyaW5nIG9zU2RrUm9vdCwgU2RrTWFuYWdlciBzZGtNYW5hZ2VyLCBJU2RrTG9nIGxvZykgew0KLSAgICAgICAgQXJyYXlMaXN0PFBhY2thZ2U+IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxQYWNrYWdlPigpOw0KLSAgICAgICAgSGFzaFNldDxGaWxlPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8RmlsZT4oKTsNCi0NCi0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUob3NTZGtSb290LCBTZGtDb25zdGFudHMuRkRfRE9DUyk7DQotICAgICAgICBQYWNrYWdlIHBrZyA9IHNjYW5Eb2MoZGlyLCBsb2cpOw0KLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgcGFja2FnZXMuYWRkKHBrZyk7DQotICAgICAgICAgICAgdmlzaXRlZC5hZGQoZGlyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRpciA9IG5ldyBGaWxlKG9zU2RrUm9vdCwgU2RrQ29uc3RhbnRzLkZEX1RPT0xTKTsNCi0gICAgICAgIHBrZyA9IHNjYW5Ub29scyhkaXIsIGxvZyk7DQotICAgICAgICBpZiAocGtnICE9IG51bGwpIHsNCi0gICAgICAgICAgICBwYWNrYWdlcy5hZGQocGtnKTsNCi0gICAgICAgICAgICB2aXNpdGVkLmFkZChkaXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZm9yIHBsYXRmb3JtcyBhbmQgYWRkLW9ucywgcmVseSBvbiB0aGUgU2RrTWFuYWdlciBwYXJzZXINCi0gICAgICAgIGZvcihJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBzZGtNYW5hZ2VyLmdldFRhcmdldHMoKSkgew0KLQ0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBwYXJzZVByb3BlcnRpZXMobmV3IEZpbGUodGFyZ2V0LmdldExvY2F0aW9uKCksIFNPVVJDRV9QUk9QRVJUSUVTKSk7DQotDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc1BsYXRmb3JtKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBrZyA9IG5ldyBQbGF0Zm9ybVBhY2thZ2UodGFyZ2V0LCBwcm9wcyk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwa2cgPSBuZXcgQWRkb25QYWNrYWdlKHRhcmdldCwgcHJvcHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocGtnICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcGFja2FnZXMuYWRkKHBrZyk7DQotICAgICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5ldyBGaWxlKHRhcmdldC5nZXRMb2NhdGlvbigpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2NhbkV4dHJhKG9zU2RrUm9vdCwgdmlzaXRlZCwgcGFja2FnZXMsIGxvZyk7DQotDQotICAgICAgICBtUGFja2FnZXMgPSBwYWNrYWdlcy50b0FycmF5KG5ldyBQYWNrYWdlW3BhY2thZ2VzLnNpemUoKV0pOw0KLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCBhbnkgb3RoZXIgZGlyZWN0b3J5IHdoYXQgd2UgaGF2ZW4ndCBzdWNjZXNzZnVsbHkgdmlzaXRlZCBhbmQNCi0gICAgICogYXNzdW1lIHRoZXkgY29udGFpbiBleHRyYSBwYWNrYWdlcy4NCi0gICAgICogQHBhcmFtIGxvZw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNjYW5FeHRyYShTdHJpbmcgb3NTZGtSb290LA0KLSAgICAgICAgICAgIEhhc2hTZXQ8RmlsZT4gdmlzaXRlZCwNCi0gICAgICAgICAgICBBcnJheUxpc3Q8UGFja2FnZT4gcGFja2FnZXMsDQotICAgICAgICAgICAgSVNka0xvZyBsb2cpIHsNCi0gICAgICAgIEZpbGUgcm9vdCA9IG5ldyBGaWxlKG9zU2RrUm9vdCk7DQotICAgICAgICBmb3IgKEZpbGUgZGlyIDogcm9vdC5saXN0RmlsZXMoKSkgew0KLSAgICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSAmJiAhdmlzaXRlZC5jb250YWlucyhkaXIpKSB7DQotDQotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBwYXJzZVByb3BlcnRpZXMobmV3IEZpbGUoZGlyLCBTT1VSQ0VfUFJPUEVSVElFUykpOw0KLSAgICAgICAgICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVBhY2thZ2UgcGtnID0gbmV3IEV4dHJhUGFja2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL3NvdXJjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMsICAgICAgICAgICAgICAgICAgICAgIC8vcHJvcGVydGllcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLmdldE5hbWUoKSwgICAgICAgICAgICAgIC8vcGF0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV2aXNpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL2xpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb29scyIsICAgICAgICAgICAgICAgICAgICAvL2Rlc2NyaXB0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9kZXNjVXJsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcy5nZXRDdXJyZW50T3MoKSwgICAgICAgICAgLy9hcmNoaXZlT3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyY2guZ2V0Q3VycmVudEFyY2goKSwgICAgICAvL2FyY2hpdmVBcmNoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIuZ2V0UGF0aCgpICAgICAgICAgICAgICAgLy9hcmNoaXZlT3NQYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgYWNjZXB0IHRoaXMgYXMgYW4gZXh0cmEgcGFja2FnZSBpZiBpdCBoYXMgYSB2YWxpZCBsb2NhbCBwYXRoLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa2cuaXNQYXRoVmFsaWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5hZGQocGtnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVHJ5IHRvIGZpbmQgYSB0b29scyBwYWNrYWdlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4NCi0gICAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC4NCi0gICAgICovDQotICAgIHByaXZhdGUgUGFja2FnZSBzY2FuVG9vbHMoRmlsZSB0b29sRm9sZGVyLCBJU2RrTG9nIGxvZykgew0KLSAgICAgICAgLy8gQ2FuIHdlIGZpbmQgc29tZSBwcm9wZXJ0aWVzPw0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHBhcnNlUHJvcGVydGllcyhuZXcgRmlsZSh0b29sRm9sZGVyLCBTT1VSQ0VfUFJPUEVSVElFUykpOw0KLQ0KLSAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIGNoZWNrIHRoYXQgYWxsIHRvb2xzIGFyZSBwcmVzZW50LiBBdCB0aGUgdmVyeSBsZWFzdA0KLSAgICAgICAgLy8gd2Ugc2hvdWxkIGV4cGVjdCB0byBmaW5kIGFkYiwgYW5kcm9pZCBhbmQgYW4gZW11bGF0b3IgYWRhcHRlZCB0byB0aGUgY3VycmVudCBPUy4NCi0gICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAgZm9yIChGaWxlIGZpbGUgOiB0b29sRm9sZGVyLmxpc3RGaWxlcygpKSB7DQotICAgICAgICAgICAgbmFtZXMuYWRkKGZpbGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghbmFtZXMuY29udGFpbnMoU2RrQ29uc3RhbnRzLkZOX0FEQikgfHwNCi0gICAgICAgICAgICAgICAgIW5hbWVzLmNvbnRhaW5zKFNka0NvbnN0YW50cy5hbmRyb2lkQ21kTmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgICAhbmFtZXMuY29udGFpbnMoU2RrQ29uc3RhbnRzLkZOX0VNVUxBVE9SKSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGFyZSBwYWNrYWdlLiB1c2UgdGhlIHByb3BlcnRpZXMgaWYgd2UgZm91bmQgYW55Lg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUb29sUGFja2FnZSBwa2cgPSBuZXcgVG9vbFBhY2thZ2UoDQotICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9zb3VyY2UNCi0gICAgICAgICAgICAgICAgICAgIHByb3BzLCAgICAgICAgICAgICAgICAgICAgICAvL3Byb3BlcnRpZXMNCi0gICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldmlzaW9uDQotICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9saWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAiVG9vbHMiLCAgICAgICAgICAgICAgICAgICAgLy9kZXNjcmlwdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vZGVzY1VybA0KLSAgICAgICAgICAgICAgICAgICAgT3MuZ2V0Q3VycmVudE9zKCksICAgICAgICAgIC8vYXJjaGl2ZU9zDQotICAgICAgICAgICAgICAgICAgICBBcmNoLmdldEN1cnJlbnRBcmNoKCksICAgICAgLy9hcmNoaXZlQXJjaA0KLSAgICAgICAgICAgICAgICAgICAgdG9vbEZvbGRlci5nZXRQYXRoKCkgICAgICAgIC8vYXJjaGl2ZU9zUGF0aA0KLSAgICAgICAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcGtnOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZSwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVHJ5IHRvIGZpbmQgYSBkb2NzIHBhY2thZ2UgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLg0KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBQYWNrYWdlIHNjYW5Eb2MoRmlsZSBkb2NGb2xkZXIsIElTZGtMb2cgbG9nKSB7DQotICAgICAgICAvLyBDYW4gd2UgZmluZCBzb21lIHByb3BlcnRpZXM/DQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gcGFyc2VQcm9wZXJ0aWVzKG5ldyBGaWxlKGRvY0ZvbGRlciwgU09VUkNFX1BST1BFUlRJRVMpKTsNCi0NCi0gICAgICAgIC8vIFRvIHN0YXJ0IHdpdGgsIGEgZG9jIGZvbGRlciBzaG91bGQgaGF2ZSBhbiAiaW5kZXguaHRtbCIgdG8gYmUgYWNjZXB0YWJsZS4NCi0gICAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNoZWNrIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlLg0KLSAgICAgICAgaWYgKG5ldyBGaWxlKGRvY0ZvbGRlciwgImluZGV4Lmh0bWwiKS5pc0ZpbGUoKSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIERvY1BhY2thZ2UgcGtnID0gbmV3IERvY1BhY2thZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vc291cmNlDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMsICAgICAgICAgICAgICAgICAgICAgIC8vcHJvcGVydGllcw0KLSAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FwaUxldmVsDQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vY29kZW5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXZpc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL2xpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9kZXNjcmlwdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL2Rlc2NVcmwNCi0gICAgICAgICAgICAgICAgICAgICAgICBPcy5nZXRDdXJyZW50T3MoKSwgICAgICAgICAgLy9hcmNoaXZlT3MNCi0gICAgICAgICAgICAgICAgICAgICAgICBBcmNoLmdldEN1cnJlbnRBcmNoKCksICAgICAgLy9hcmNoaXZlQXJjaA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY0ZvbGRlci5nZXRQYXRoKCkgICAgICAgICAvL2FyY2hpdmVPc1BhdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICApOw0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGtnOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIHRoZSBnaXZlbiBmaWxlIGFzIHByb3BlcnRpZXMgZmlsZSBpZiBpdCBleGlzdHMuDQotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgbm8gcHJvcGVydGllcy4NCi0gICAgICovDQotICAgIHByaXZhdGUgUHJvcGVydGllcyBwYXJzZVByb3BlcnRpZXMoRmlsZSBwcm9wc0ZpbGUpIHsNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAocHJvcHNGaWxlLmV4aXN0cygpKSB7DQotICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcHNGaWxlKTsNCi0NCi0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoZmlzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gVG8gYmUgdmFsaWQsIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHByb3BlcnR5IGluIGl0Lg0KLSAgICAgICAgICAgICAgICBpZiAocHJvcHMuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L01pblRvb2xzUGFja2FnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTWluVG9vbHNQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1ODkyZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTWluVG9vbHNQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuQXJjaDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5PczsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnJlcG9zaXRvcnkuU2RrUmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotLyoqDQotICogUmVwcmVzZW50cyBhbiBYTUwgbm9kZSBpbiBhbiBTREsgcmVwb3NpdG9yeSB0aGF0IGhhcyBhIG1pbi10b29scy1yZXYgcmVxdWlyZW1lbnQuDQotICogVGhpcyBpcyBlaXRoZXIgYSB7QGxpbmsgUGxhdGZvcm1QYWNrYWdlfSBvciBhbiB7QGxpbmsgRXh0cmFQYWNrYWdlfS4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWluVG9vbHNQYWNrYWdlIGV4dGVuZHMgUGFja2FnZSB7DQotDQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUlOX1RPT0xTX1JFViA9ICJQbGF0Zm9ybS5NaW5Ub29sc1JldiI7ICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbWluaW1hbCByZXZpc2lvbiBvZiB0aGUgdG9vbHMgcGFja2FnZSByZXF1aXJlZCBieSB0aGlzIGV4dHJhIHBhY2thZ2UsIGlmID4gMCwNCi0gICAgICogb3Ige0BsaW5rICNNSU5fVE9PTFNfUkVWX05PVF9TUEVDSUZJRUR9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcmVxdWlyZW1lbnQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtTWluVG9vbHNSZXZpc2lvbjsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSB2YWx1ZSBvZiB7QGxpbmsgI21NaW5Ub29sc1JldmlzaW9ufSB3aGVuIHRoZSB7QGxpbmsgU2RrUmVwb3NpdG9yeSNOT0RFX01JTl9UT09MU19SRVZ9DQotICAgICAqIHdhcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBYTUwgc291cmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1RPT0xTX1JFVl9OT1RfU1BFQ0lGSUVEID0gMDsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgcGFja2FnZSBmcm9tIHRoZSBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gWE1MIG5vZGUuDQotICAgICAqIDxwLz4NCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSBjcmVhdGVkLg0KLSAgICAgKi8NCi0gICAgTWluVG9vbHNQYWNrYWdlKFJlcG9Tb3VyY2Ugc291cmNlLCBOb2RlIHBhY2thZ2VOb2RlLCBNYXA8U3RyaW5nLFN0cmluZz4gbGljZW5zZXMpIHsNCi0gICAgICAgIHN1cGVyKHNvdXJjZSwgcGFja2FnZU5vZGUsIGxpY2Vuc2VzKTsNCi0NCi0gICAgICAgIG1NaW5Ub29sc1JldmlzaW9uID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sSW50KHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfTUlOX1RPT0xTX1JFViwNCi0gICAgICAgICAgICAgICAgTUlOX1RPT0xTX1JFVl9OT1RfU1BFQ0lGSUVEKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWFudWFsbHkgY3JlYXRlIGEgbmV3IHBhY2thZ2Ugd2l0aCBvbmUgYXJjaGl2ZSBhbmQgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuDQotICAgICAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgcGFja2FnZXMgZnJvbSBsb2NhbCBkaXJlY3RvcmllcyBpbiB3aGljaCBjYXNlIHRoZXJlIG11c3QgYmUNCi0gICAgICogb25lIGFyY2hpdmUgd2hpY2ggVVJMIGlzIHRoZSBhY3R1YWwgdGFyZ2V0IGxvY2F0aW9uLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFByb3BlcnRpZXMgZnJvbSBwcm9wcyBhcmUgdXNlZCBmaXJzdCB3aGVuIHBvc3NpYmxlLCBlLmcuIGlmIHByb3BzIGlzIG5vbiBudWxsLg0KLSAgICAgKiA8cC8+DQotICAgICAqIEJ5IGRlc2lnbiwgdGhpcyBjcmVhdGVzIGEgcGFja2FnZSB3aXRoIG9uZSBhbmQgb25seSBvbmUgYXJjaGl2ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBNaW5Ub29sc1BhY2thZ2UoDQotICAgICAgICAgICAgUmVwb1NvdXJjZSBzb3VyY2UsDQotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcywNCi0gICAgICAgICAgICBpbnQgcmV2aXNpb24sDQotICAgICAgICAgICAgU3RyaW5nIGxpY2Vuc2UsDQotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjVXJsLA0KLSAgICAgICAgICAgIE9zIGFyY2hpdmVPcywNCi0gICAgICAgICAgICBBcmNoIGFyY2hpdmVBcmNoLA0KLSAgICAgICAgICAgIFN0cmluZyBhcmNoaXZlT3NQYXRoKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsIHByb3BzLCByZXZpc2lvbiwgbGljZW5zZSwgZGVzY3JpcHRpb24sIGRlc2NVcmwsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVPcywgYXJjaGl2ZUFyY2gsIGFyY2hpdmVPc1BhdGgpOw0KLQ0KLSAgICAgICAgbU1pblRvb2xzUmV2aXNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5KHByb3BzLCBQUk9QX01JTl9UT09MU19SRVYsDQotICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoTUlOX1RPT0xTX1JFVl9OT1RfU1BFQ0lGSUVEKSkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbWluaW1hbCByZXZpc2lvbiBvZiB0aGUgdG9vbHMgcGFja2FnZSByZXF1aXJlZCBieSB0aGlzIGV4dHJhIHBhY2thZ2UsIGlmID4gMCwNCi0gICAgICogb3Ige0BsaW5rICNNSU5fVE9PTFNfUkVWX05PVF9TUEVDSUZJRUR9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcmVxdWlyZW1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldE1pblRvb2xzUmV2aXNpb24oKSB7DQotICAgICAgICByZXR1cm4gbU1pblRvb2xzUmV2aXNpb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUGFja2FnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTdiYjE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BcmNoaXZlLkFyY2g7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuT3M7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5LlNka1JlcG9zaXRvcnk7DQotDQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotLyoqDQotICogQSB7QGxpbmsgUGFja2FnZX0gaXMgdGhlIGJhc2UgY2xhc3MgZm9yICJzb21ldGhpbmciIHRoYXQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQ0KLSAqIHRoZSBTREsgcmVwb3NpdG9yeSAtLSBzdWJjbGFzc2VzIGluY2x1ZGUge0BsaW5rIFBsYXRmb3JtUGFja2FnZX0sIHtAbGluayBBZGRvblBhY2thZ2V9LA0KLSAqIHtAbGluayBEb2NQYWNrYWdlfSBhbmQge0BsaW5rIFRvb2xQYWNrYWdlfS4NCi0gKiA8cC8+DQotICogQSBwYWNrYWdlIGhhcyBzb21lIGF0dHJpYnV0ZXMgKHJldmlzaW9uLCBkZXNjcmlwdGlvbikgYW5kIGEgbGlzdCBvZiBhcmNoaXZlcw0KLSAqIHdoaWNoIHJlcHJlc2VudCB0aGUgZG93bmxvYWRhYmxlIGJpdHMuDQotICogPHAvPg0KLSAqIFBhY2thZ2VzIGFyZSBjb250YWluZWQgYnkgYSB7QGxpbmsgUmVwb1NvdXJjZX0gKGEgZG93bmxvYWQgc2l0ZSkuDQotICogPHAvPg0KLSAqIERlcml2ZWQgY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUge0BsaW5rIElEZXNjcmlwdGlvbn0gbWV0aG9kcy4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZSBpbXBsZW1lbnRzIElEZXNjcmlwdGlvbiB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFVklTSU9OICAgICA9ICJQa2cuUmV2aXNpb24iOyAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MSUNFTlNFICAgICAgPSAiUGtnLkxpY2Vuc2UiOyAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfREVTQyAgICAgICAgID0gIlBrZy5EZXNjIjsgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RFU0NfVVJMICAgICA9ICJQa2cuRGVzY1VybCI7ICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9SRUxFQVNFX05PVEUgPSAiUGtnLlJlbE5vdGUiOyAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUkVMRUFTRV9VUkwgID0gIlBrZy5SZWxOb3RlVXJsIjsgICAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NPVVJDRV9VUkwgICA9ICJQa2cuU291cmNlVXJsIjsgICAgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VU0VSX1NPVVJDRSAgPSAiUGtnLlVzZXJTcmMiOyAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJldmlzaW9uOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTGljZW5zZTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0aW9uOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY1VybDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJlbGVhc2VOb3RlOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUmVsZWFzZVVybDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBBcmNoaXZlW10gbUFyY2hpdmVzOw0KLSAgICBwcml2YXRlIGZpbmFsIFJlcG9Tb3VyY2UgbVNvdXJjZTsNCi0NCi0gICAgLyoqDQotICAgICAqIEVudW0gZm9yIHRoZSByZXN1bHQgb2Yge0BsaW5rIFBhY2thZ2UjY2FuQmVVcGRhdGVkQnkoUGFja2FnZSl9LiBUaGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4NCi0gICAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgcGFja2FnZSB0aGF0IGlzIHRvdGFsbHkgaW5jb21wYXRpYmxlLCBhbmQgb25lIHRoYXQgaXMgdGhlIHNhbWUgaXRlbQ0KLSAgICAgKiBidXQganVzdCBub3QgYW4gdXBkYXRlLg0KLSAgICAgKiBAc2VlICNjYW5CZVVwZGF0ZWRCeShQYWNrYWdlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIFVwZGF0ZUluZm8gew0KLSAgICAgICAgLyoqIE1lYW5zIHRoYXQgdGhlIDIgcGFja2FnZXMgYXJlIG5vdCB0aGUgc2FtZSB0aGluZyAqLw0KLSAgICAgICAgSU5DT01QQVRJQkxFLA0KLSAgICAgICAgLyoqIE1lYW5zIHRoYXQgdGhlIDIgcGFja2FnZXMgYXJlIHRoZSBzYW1lIHRoaW5nIGJ1dCBvbmUgZG9lcyBub3QgdXBncmFkZSB0aGUgb3RoZXIgKi8NCi0gICAgICAgIE5PVF9VUERBVEUsDQotICAgICAgICAvKiogTWVhbnMgdGhhdCB0aGUgMiBwYWNrYWdlcyBhcmUgdGhlIHNhbWUgdGhpbmcsIGFuZCBvbmUgaXMgdGhlIHVwZ3JhZGUgb2YgdGhlIG90aGVyICovDQotICAgICAgICBVUERBVEU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgcGFja2FnZSBmcm9tIHRoZSBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gWE1MIG5vZGUuDQotICAgICAqIDxwLz4NCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSBjcmVhdGVkLg0KLSAgICAgKi8NCi0gICAgUGFja2FnZShSZXBvU291cmNlIHNvdXJjZSwgTm9kZSBwYWNrYWdlTm9kZSwgTWFwPFN0cmluZyxTdHJpbmc+IGxpY2Vuc2VzKSB7DQotICAgICAgICBtU291cmNlID0gc291cmNlOw0KLSAgICAgICAgbVJldmlzaW9uICAgID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sSW50ICAgKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfUkVWSVNJT04sIDApOw0KLSAgICAgICAgbURlc2NyaXB0aW9uID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfREVTQ1JJUFRJT04pOw0KLSAgICAgICAgbURlc2NVcmwgICAgID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfREVTQ19VUkwpOw0KLSAgICAgICAgbVJlbGVhc2VOb3RlID0gWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKHBhY2thZ2VOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfUkVMRUFTRV9OT1RFKTsNCi0gICAgICAgIG1SZWxlYXNlVXJsICA9IFhtbFBhcnNlclV0aWxzLmdldFhtbFN0cmluZyhwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX1JFTEVBU0VfVVJMKTsNCi0NCi0gICAgICAgIG1MaWNlbnNlICA9IHBhcnNlTGljZW5zZShwYWNrYWdlTm9kZSwgbGljZW5zZXMpOw0KLSAgICAgICAgbUFyY2hpdmVzID0gcGFyc2VBcmNoaXZlcyhYbWxQYXJzZXJVdGlscy5nZXRGaXJzdENoaWxkKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX0FSQ0hJVkVTKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1hbnVhbGx5IGNyZWF0ZSBhIG5ldyBwYWNrYWdlIHdpdGggb25lIGFyY2hpdmUgYW5kIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLg0KLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGZyb20gbG9jYWwgZGlyZWN0b3JpZXMgaW4gd2hpY2ggY2FzZSB0aGVyZSBtdXN0IGJlDQotICAgICAqIG9uZSBhcmNoaXZlIHdoaWNoIFVSTCBpcyB0aGUgYWN0dWFsIHRhcmdldCBsb2NhdGlvbi4NCi0gICAgICogPHAvPg0KLSAgICAgKiBQcm9wZXJ0aWVzIGZyb20gcHJvcHMgYXJlIHVzZWQgZmlyc3Qgd2hlbiBwb3NzaWJsZSwgZS5nLiBpZiBwcm9wcyBpcyBub24gbnVsbC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgY3JlYXRlcyBhIHBhY2thZ2Ugd2l0aCBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUGFja2FnZSgNCi0gICAgICAgICAgICBSZXBvU291cmNlIHNvdXJjZSwNCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzLA0KLSAgICAgICAgICAgIGludCByZXZpc2lvbiwNCi0gICAgICAgICAgICBTdHJpbmcgbGljZW5zZSwNCi0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sDQotICAgICAgICAgICAgU3RyaW5nIGRlc2NVcmwsDQotICAgICAgICAgICAgT3MgYXJjaGl2ZU9zLA0KLSAgICAgICAgICAgIEFyY2ggYXJjaGl2ZUFyY2gsDQotICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVPc1BhdGgpIHsNCi0NCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7DQotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkZXNjVXJsID09IG51bGwpIHsNCi0gICAgICAgICAgICBkZXNjVXJsID0gIiI7DQotICAgICAgICB9DQotDQotICAgICAgICBtUmV2aXNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5KHByb3BzLCBQUk9QX1JFVklTSU9OLCBJbnRlZ2VyLnRvU3RyaW5nKHJldmlzaW9uKSkpOw0KLSAgICAgICAgbUxpY2Vuc2UgICAgID0gZ2V0UHJvcGVydHkocHJvcHMsIFBST1BfTElDRU5TRSwgICAgICBsaWNlbnNlKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbiA9IGdldFByb3BlcnR5KHByb3BzLCBQUk9QX0RFU0MsICAgICAgICAgZGVzY3JpcHRpb24pOw0KLSAgICAgICAgbURlc2NVcmwgICAgID0gZ2V0UHJvcGVydHkocHJvcHMsIFBST1BfREVTQ19VUkwsICAgICBkZXNjVXJsKTsNCi0gICAgICAgIG1SZWxlYXNlTm90ZSA9IGdldFByb3BlcnR5KHByb3BzLCBQUk9QX1JFTEVBU0VfTk9URSwgIiIpOw0KLSAgICAgICAgbVJlbGVhc2VVcmwgID0gZ2V0UHJvcGVydHkocHJvcHMsIFBST1BfUkVMRUFTRV9VUkwsICAiIik7DQotDQotICAgICAgICAvLyBJZiBzb3VyY2UgaXMgbnVsbCBhbmQgd2UgY2FuIGZpbmQgYSBzb3VyY2UgVVJMIGluIHRoZSBwcm9wZXJ0aWVzLCBnZW5lcmF0ZQ0KLSAgICAgICAgLy8gYSBkdW1teSBzb3VyY2UganVzdCB0byBzdG9yZSB0aGUgVVJMLiBUaGlzIGFsbG93cyB1cyB0byBlYXNpbHkgcmVtZW1iZXIgd2hlcmUNCi0gICAgICAgIC8vIGEgcGFja2FnZSBjb21lcyBmcm9tLg0KLSAgICAgICAgU3RyaW5nIHNyY1VybCA9IGdldFByb3BlcnR5KHByb3BzLCBQUk9QX1NPVVJDRV9VUkwsIG51bGwpOw0KLSAgICAgICAgaWYgKHByb3BzICE9IG51bGwgJiYgc291cmNlID09IG51bGwgJiYgc3JjVXJsICE9IG51bGwpIHsNCi0gICAgICAgICAgICBib29sZWFuIGlzVXNlciA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3BzLmdldFByb3BlcnR5KFBST1BfVVNFUl9TT1VSQ0UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBSZXBvU291cmNlKHNyY1VybCwgaXNVc2VyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7DQotDQotICAgICAgICBtQXJjaGl2ZXMgPSBuZXcgQXJjaGl2ZVsxXTsNCi0gICAgICAgIG1BcmNoaXZlc1swXSA9IG5ldyBBcmNoaXZlKHRoaXMsDQotICAgICAgICAgICAgICAgIHByb3BzLA0KLSAgICAgICAgICAgICAgICBhcmNoaXZlT3MsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVBcmNoLA0KLSAgICAgICAgICAgICAgICBhcmNoaXZlT3NQYXRoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIGEgcHJvcGVydHkgZnJvbSBhIHtAbGluayBQcm9wZXJ0aWVzfSBvYmplY3QuDQotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgcHJvcHMgaXMgbnVsbCBvciBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZyBwcm9wS2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7DQotICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkocHJvcEtleSwgZGVmYXVsdFZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwYWNrYWdlcyBpbiB0aGUgZ2l2ZW4ge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICogVGhlc2UgcHJvcGVydGllcyB3aWxsIGxhdGVyIGJlIGdpdmUgdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSB7QGxpbmsgUHJvcGVydGllc30gb2JqZWN0Lg0KLSAgICAgKi8NCi0gICAgdm9pZCBzYXZlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7DQotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX1JFVklTSU9OLCBJbnRlZ2VyLnRvU3RyaW5nKG1SZXZpc2lvbikpOw0KLSAgICAgICAgaWYgKG1MaWNlbnNlICE9IG51bGwgJiYgbUxpY2Vuc2UubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9MSUNFTlNFLCBtTGljZW5zZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobURlc2NyaXB0aW9uICE9IG51bGwgJiYgbURlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfREVTQywgbURlc2NyaXB0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtRGVzY1VybCAhPSBudWxsICYmIG1EZXNjVXJsLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfREVTQ19VUkwsIG1EZXNjVXJsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtUmVsZWFzZU5vdGUgIT0gbnVsbCAmJiBtUmVsZWFzZU5vdGUubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9SRUxFQVNFX05PVEUsIG1SZWxlYXNlTm90ZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobVJlbGVhc2VVcmwgIT0gbnVsbCAmJiBtUmVsZWFzZVVybC5sZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX1JFTEVBU0VfVVJMLCBtUmVsZWFzZVVybCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9TT1VSQ0VfVVJMLCAgbVNvdXJjZS5nZXRVcmwoKSk7DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUFJPUF9VU0VSX1NPVVJDRSwgQm9vbGVhbi50b1N0cmluZyhtU291cmNlLmlzVXNlclNvdXJjZSgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyB0aGUgdXNlcy1saWNlbmNlIG5vZGUgb2YgdGhpcyBwYWNrYWdlLCBpZiBhbnksIGFuZCByZXR1cm5zIHRoZSBsaWNlbnNlDQotICAgICAqIGRlZmluaXRpb24gaWYgdGhlcmUncyBvbmUuIFJldHVybnMgbnVsbCBpZiB0aGVyZSdzIG5vIHVzZXMtbGljZW5zZSBlbGVtZW50IG9yIG5vDQotICAgICAqIGxpY2Vuc2Ugb2YgdGhpcyBuYW1lIGRlZmluZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJzZUxpY2Vuc2UoTm9kZSBwYWNrYWdlTm9kZSwgTWFwPFN0cmluZywgU3RyaW5nPiBsaWNlbnNlcykgew0KLSAgICAgICAgTm9kZSB1c2VzTGljZW5zZSA9IFhtbFBhcnNlclV0aWxzLmdldEZpcnN0Q2hpbGQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX1VTRVNfTElDRU5TRSk7DQotICAgICAgICBpZiAodXNlc0xpY2Vuc2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIE5vZGUgcmVmID0gdXNlc0xpY2Vuc2UuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShTZGtSZXBvc2l0b3J5LkFUVFJfUkVGKTsNCi0gICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxpY2Vuc2VSZWYgPSByZWYuZ2V0Tm9kZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBsaWNlbnNlcy5nZXQobGljZW5zZVJlZik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhbiBYTUwgbm9kZSB0byBwcm9jZXNzIHRoZSA8YXJjaGl2ZXM+IGVsZW1lbnQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFyY2hpdmVbXSBwYXJzZUFyY2hpdmVzKE5vZGUgYXJjaGl2ZXNOb2RlKSB7DQotICAgICAgICBBcnJheUxpc3Q8QXJjaGl2ZT4gYXJjaGl2ZXMgPSBuZXcgQXJyYXlMaXN0PEFyY2hpdmU+KCk7DQotDQotICAgICAgICBpZiAoYXJjaGl2ZXNOb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IoTm9kZSBjaGlsZCA9IGFyY2hpdmVzTm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7DQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgew0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNka1JlcG9zaXRvcnkuTlNfU0RLX1JFUE9TSVRPUlkuZXF1YWxzKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNka1JlcG9zaXRvcnkuTk9ERV9BUkNISVZFLmVxdWFscyhjaGlsZC5nZXRMb2NhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVzLmFkZChwYXJzZUFyY2hpdmUoY2hpbGQpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhcmNoaXZlcy50b0FycmF5KG5ldyBBcmNoaXZlW2FyY2hpdmVzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgb25lIDxhcmNoaXZlPiBlbGVtZW50IGZyb20gYW4gPGFyY2hpdmVzPiBjb250YWluZXIuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFyY2hpdmUgcGFyc2VBcmNoaXZlKE5vZGUgYXJjaGl2ZU5vZGUpIHsNCi0gICAgICAgIEFyY2hpdmUgYSA9IG5ldyBBcmNoaXZlKA0KLSAgICAgICAgICAgICAgICAgICAgdGhpcywNCi0gICAgICAgICAgICAgICAgICAgIChPcykgICBYbWxQYXJzZXJVdGlscy5nZXRFbnVtQXR0cmlidXRlKGFyY2hpdmVOb2RlLCBTZGtSZXBvc2l0b3J5LkFUVFJfT1MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9zLnZhbHVlcygpLCBudWxsKSwNCi0gICAgICAgICAgICAgICAgICAgIChBcmNoKSBYbWxQYXJzZXJVdGlscy5nZXRFbnVtQXR0cmlidXRlKGFyY2hpdmVOb2RlLCBTZGtSZXBvc2l0b3J5LkFUVFJfQVJDSCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJjaC52YWx1ZXMoKSwgQXJjaC5BTlkpLA0KLSAgICAgICAgICAgICAgICAgICAgWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKGFyY2hpdmVOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfVVJMKSwNCi0gICAgICAgICAgICAgICAgICAgIFhtbFBhcnNlclV0aWxzLmdldFhtbExvbmcgIChhcmNoaXZlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX1NJWkUsIDApLA0KLSAgICAgICAgICAgICAgICAgICAgWG1sUGFyc2VyVXRpbHMuZ2V0WG1sU3RyaW5nKGFyY2hpdmVOb2RlLCBTZGtSZXBvc2l0b3J5Lk5PREVfQ0hFQ0tTVU0pDQotICAgICAgICAgICAgICAgICk7DQotDQotICAgICAgICByZXR1cm4gYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgc291cmNlIHRoYXQgY3JlYXRlZCAoYW5kIG93bnMpIHRoaXMgcGFja2FnZS4gQ2FuIGJlIG51bGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVwb1NvdXJjZSBnZXRQYXJlbnRTb3VyY2UoKSB7DQotICAgICAgICByZXR1cm4gbVNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGZvciBhbGwgcGFja2FnZXMgKHBsYXRmb3JtLCBhZGQtb24sIHRvb2wsIGRvYykuDQotICAgICAqIENhbiBiZSAwIGlmIHRoaXMgaXMgYSBsb2NhbCBwYWNrYWdlIG9mIHVua25vd24gcmV2aXNpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldFJldmlzaW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG1SZXZpc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIGFsbCBwYWNrYWdlcyAocGxhdGZvcm0sIGFkZC1vbiwgdG9vbCwgZG9jKSBvcg0KLSAgICAgKiBmb3IgYSBsaWIuIEl0IGlzIG51bGwgaWYgdGhlIGVsZW1lbnQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBpbiB0aGUgcmVwb3NpdG9yeSBYTUwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoKSB7DQotICAgICAgICByZXR1cm4gbUxpY2Vuc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciBhbGwgcGFja2FnZXMgKHBsYXRmb3JtLCBhZGQtb24sIHRvb2wsIGRvYykgb3INCi0gICAgICogZm9yIGEgbGliLiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIFVSTCBmb3IgYWxsIHBhY2thZ2VzIChwbGF0Zm9ybSwgYWRkLW9uLCB0b29sLCBkb2MpLg0KLSAgICAgKiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjVXJsKCkgew0KLSAgICAgICAgcmV0dXJuIG1EZXNjVXJsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCByZWxlYXNlIG5vdGUgZm9yIGFsbCBwYWNrYWdlcyAocGxhdGZvcm0sIGFkZC1vbiwgdG9vbCwgZG9jKSBvcg0KLSAgICAgKiBmb3IgYSBsaWIuIENhbiBiZSBlbXB0eSBidXQgbm90IG51bGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGVhc2VOb3RlKCkgew0KLSAgICAgICAgcmV0dXJuIG1SZWxlYXNlTm90ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIFVSTCBmb3IgYWxsIHBhY2thZ2VzIChwbGF0Zm9ybSwgYWRkLW9uLCB0b29sLCBkb2MpLg0KLSAgICAgKiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWxlYXNlTm90ZVVybCgpIHsNCi0gICAgICAgIHJldHVybiBtUmVsZWFzZVVybDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgYXJjaGl2ZXMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UuDQotICAgICAqIENhbiBiZSBhbiBlbXB0eSBhcnJheSBidXQgbm90IG51bGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJjaGl2ZVtdIGdldEFyY2hpdmVzKCkgew0KLSAgICAgICAgcmV0dXJuIG1BcmNoaXZlczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB7QGxpbmsgUGFja2FnZX0gaGFzIGF0IGxlYXN0IG9uZSB7QGxpbmsgQXJjaGl2ZX0gY29tcGF0aWJsZSB3aXRoDQotICAgICAqIHRoZSBob3N0IHBsYXRmb3JtLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcGF0aWJsZUFyY2hpdmUoKSB7DQotICAgICAgICBmb3IgKEFyY2hpdmUgYXJjaGl2ZSA6IG1BcmNoaXZlcykgew0KLSAgICAgICAgICAgIGlmIChhcmNoaXZlLmlzQ29tcGF0aWJsZSgpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciBhbiB7QGxpbmsgSURlc2NyaXB0aW9ufS4NCi0gICAgICogQ2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGxvbmcgZGVzY3JpcHRpb24gZm9yIGFuIHtAbGluayBJRGVzY3JpcHRpb259Lg0KLSAgICAgKiBDYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCi0NCi0gICAgICAgIFN0cmluZyBzID0gZ2V0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGlmIChzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBzYi5hcHBlbmQocyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCJcbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlJldmlzaW9uICUxJGQiLCBnZXRSZXZpc2lvbigpKSk7DQotDQotICAgICAgICBzID0gZ2V0RGVzY1VybCgpOw0KLSAgICAgICAgaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcblxuTW9yZSBpbmZvcm1hdGlvbiBhdCAlMSRzIiwgcykpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcyA9IGdldFJlbGVhc2VOb3RlKCk7DQotICAgICAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCJcblxuUmVsZWFzZSBub3RlOlxuIikuYXBwZW5kKHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcyA9IGdldFJlbGVhc2VOb3RlVXJsKCk7DQotICAgICAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCJcblJlbGVhc2Ugbm90ZSBVUkw6ICIpLmFwcGVuZChzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wdXRlcyBhIHBvdGVudGlhbCBpbnN0YWxsYXRpb24gZm9sZGVyIGlmIGFuIGFyY2hpdmUgb2YgdGhpcyBwYWNrYWdlIHdlcmUNCi0gICAgICogdG8gYmUgaW5zdGFsbGVkIHJpZ2h0IGF3YXkgaW4gdGhlIGdpdmVuIFNESyByb290Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIFNvbWUgdHlwZXMgb2YgcGFja2FnZXMgaW5zdGFsbCBpbiBhIGZpeCBsb2NhdGlvbiwgZm9yIGV4YW1wbGUgZG9jcyBhbmQgdG9vbHMuDQotICAgICAqIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgZm9sZGVyIG1heSBhbHJlYWR5IGV4aXN0IHdpdGggYSBkaWZmZXJlbnQgYXJjaGl2ZSBpbnN0YWxsZWQNCi0gICAgICogYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24uDQotICAgICAqIEZvciBvdGhlciBwYWNrYWdlcyB0eXBlcywgc3VjaCBhcyBhZGQtb24gb3IgcGxhdGZvcm0sIHRoZSBmb2xkZXIgbmFtZSBpcyBvbmx5IHBhcnRpYWxseQ0KLSAgICAgKiByZWxldmFudCB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgYW5kIHRodXMgYSByZWFsIGNoZWNrIHdpbGwgYmUgZG9uZSB0byBwcm92aWRlIGFuDQotICAgICAqIGV4aXN0aW5nIG9yIG5ldyBmb2xkZXIgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIFNESy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9zU2RrUm9vdCBUaGUgT1MgcGF0aCBvZiB0aGUgU0RLIHJvb3QgZm9sZGVyLg0KLSAgICAgKiBAcGFyYW0gc3VnZ2VzdGVkRGlyIEEgc3VnZ2VzdGlvbiBmb3IgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgbmFtZSwgYmFzZWQgb24gdGhlIHJvb3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgICBmb2xkZXIgdXNlZCBpbiB0aGUgemlwIGFyY2hpdmUuDQotICAgICAqIEBwYXJhbSBzZGtNYW5hZ2VyIEFuIGV4aXN0aW5nIFNESyBtYW5hZ2VyIHRvIGxpc3QgY3VycmVudCBwbGF0Zm9ybXMgYW5kIGFkZG9ucy4NCi0gICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgRmlsZX0gY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0b3J5IHRvIHVzZSB0byBpbnN0YWxsIHRoaXMgcGFja2FnZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBGaWxlIGdldEluc3RhbGxGb2xkZXIoDQotICAgICAgICAgICAgU3RyaW5nIG9zU2RrUm9vdCwgU3RyaW5nIHN1Z2dlc3RlZERpciwgU2RrTWFuYWdlciBzZGtNYW5hZ2VyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZSBwYWNrYWdlIHJlcHJlc2VudHMgdGhlIHNhbWUgaXRlbSBhcyB0aGUgY3VycmVudCBwYWNrYWdlLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFR3byBwYWNrYWdlcyBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBpZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB0aGluZywgZXhjZXB0IGZvciB0aGUNCi0gICAgICogcmV2aXNpb24gbnVtYmVyLg0KLSAgICAgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIHRvIGNvbXBhcmUNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzYW1lSXRlbUFzKFBhY2thZ2UgcGtnKTsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbXB1dGVzIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgaXMgYSBzdWl0YWJsZSB1cGRhdGUgZm9yIHRoZSBjdXJyZW50IHBhY2thZ2UuDQotICAgICAqIDxwLz4NCi0gICAgICogQW4gdXBkYXRlIGlzIGp1c3QgdGhhdDogYSBuZXcgcGFja2FnZSB0aGF0IHN1cGVyc2VkZXMgdGhlIGN1cnJlbnQgb25lLiBJZiB0aGUgbmV3DQotICAgICAqIHBhY2thZ2UgZG9lcyBub3QgcmVwcmVzZW50IHRoZSBzYW1lIGl0ZW0gb3IgaWYgaXQgaGFzIHRoZSBzYW1lIG9yIGxvd2VyIHJldmlzaW9uIGFzIHRoZQ0KLSAgICAgKiBjdXJyZW50IG9uZSwgaXQncyBub3QgYW4gdXBkYXRlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnRQYWNrYWdlIFRoZSBwb3RlbnRpYWwgcmVwbGFjZW1lbnQgcGFja2FnZS4NCi0gICAgICogQHJldHVybiBPbmUgb2YgdGhlIHtAbGluayBVcGRhdGVJbmZvfSB2YWx1ZXMuDQotICAgICAqDQotICAgICAqIEBzZWUgI3NhbWVJdGVtQXMoUGFja2FnZSkNCi0gICAgICovDQotICAgIHB1YmxpYyBVcGRhdGVJbmZvIGNhbkJlVXBkYXRlZEJ5KFBhY2thZ2UgcmVwbGFjZW1lbnRQYWNrYWdlKSB7DQotICAgICAgICBpZiAocmVwbGFjZW1lbnRQYWNrYWdlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gVXBkYXRlSW5mby5JTkNPTVBBVElCTEU7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBjaGVjayB0aGV5IGFyZSB0aGUgc2FtZSBpdGVtLg0KLSAgICAgICAgaWYgKHNhbWVJdGVtQXMocmVwbGFjZW1lbnRQYWNrYWdlKSA9PSBmYWxzZSkgew0KLSAgICAgICAgICAgIHJldHVybiBVcGRhdGVJbmZvLklOQ09NUEFUSUJMRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGNoZWNrIHJldmlzaW9uIG51bWJlcg0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50UGFja2FnZS5nZXRSZXZpc2lvbigpID4gdGhpcy5nZXRSZXZpc2lvbigpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZUluZm8uVVBEQVRFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gbm90IGFuIHVwZ3JhZGUgYnV0IG5vdCBpbmNvbXBhdGlibGUgZWl0aGVyLg0KLSAgICAgICAgcmV0dXJuIFVwZGF0ZUluZm8uTk9UX1VQREFURTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9QbGF0Zm9ybVBhY2thZ2UuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1BsYXRmb3JtUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGQ3OWEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1BsYXRmb3JtUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLkFuZHJvaWRWZXJzaW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BcmNoaXZlLkFyY2g7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuT3M7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5LlNka1JlcG9zaXRvcnk7DQotDQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotLyoqDQotICogUmVwcmVzZW50cyBhIHBsYXRmb3JtIFhNTCBub2RlIGluIGFuIFNESyByZXBvc2l0b3J5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVBhY2thZ2UgZXh0ZW5kcyBNaW5Ub29sc1BhY2thZ2UgaW1wbGVtZW50cyBJUGFja2FnZVZlcnNpb24gew0KLQ0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZFUlNJT04gICAgICAgPSAiUGxhdGZvcm0uVmVyc2lvbiI7ICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogVGhlIHBhY2thZ2UgdmVyc2lvbiwgZm9yIHBsYXRmb3JtLCBhZGQtb24gYW5kIGRvYyBwYWNrYWdlcy4gKi8NCi0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVmVyc2lvbiBtVmVyc2lvbjsNCi0NCi0gICAgLyoqIFRoZSB2ZXJzaW9uLCBhIHN0cmluZywgZm9yIHBsYXRmb3JtIHBhY2thZ2VzLiAqLw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVyc2lvbk5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IHBsYXRmb3JtIHBhY2thZ2UgZnJvbSB0aGUgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIFhNTCBub2RlLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFja2FnZSBjYW5ub3QgYmUgY3JlYXRlZC4NCi0gICAgICovDQotICAgIFBsYXRmb3JtUGFja2FnZShSZXBvU291cmNlIHNvdXJjZSwgTm9kZSBwYWNrYWdlTm9kZSwgTWFwPFN0cmluZyxTdHJpbmc+IGxpY2Vuc2VzKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsIHBhY2thZ2VOb2RlLCBsaWNlbnNlcyk7DQotDQotICAgICAgICBtVmVyc2lvbk5hbWUgPSBYbWxQYXJzZXJVdGlscy5nZXRYbWxTdHJpbmcocGFja2FnZU5vZGUsIFNka1JlcG9zaXRvcnkuTk9ERV9WRVJTSU9OKTsNCi0gICAgICAgIGludCBhcGlMZXZlbCA9IFhtbFBhcnNlclV0aWxzLmdldFhtbEludCAgIChwYWNrYWdlTm9kZSwgU2RrUmVwb3NpdG9yeS5OT0RFX0FQSV9MRVZFTCwgMCk7DQotICAgICAgICBTdHJpbmcgY29kZU5hbWUgPSBYbWxQYXJzZXJVdGlscy5nZXRYbWxTdHJpbmcocGFja2FnZU5vZGUsIFNka1JlcG9zaXRvcnkuTk9ERV9DT0RFTkFNRSk7DQotICAgICAgICBpZiAoY29kZU5hbWUubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIGNvZGVOYW1lID0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1WZXJzaW9uID0gbmV3IEFuZHJvaWRWZXJzaW9uKGFwaUxldmVsLCBjb2RlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgcGxhdGZvcm0gcGFja2FnZSBiYXNlZCBvbiBhbiBhY3R1YWwge0BsaW5rIElBbmRyb2lkVGFyZ2V0fSAod2hpY2gNCi0gICAgICogbXVzdCBoYXZlIHtAbGluayBJQW5kcm9pZFRhcmdldCNpc1BsYXRmb3JtKCl9IHRydWUpIGZyb20gdGhlIHtAbGluayBTZGtNYW5hZ2VyfS4NCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGxpc3QgbG9jYWwgU0RLIGZvbGRlcnMgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBvbmUgYXJjaGl2ZSB3aGljaA0KLSAgICAgKiBVUkwgaXMgdGhlIGFjdHVhbCB0YXJnZXQgbG9jYXRpb24uDQotICAgICAqIDxwLz4NCi0gICAgICogQnkgZGVzaWduLCB0aGlzIGNyZWF0ZXMgYSBwYWNrYWdlIHdpdGggb25lIGFuZCBvbmx5IG9uZSBhcmNoaXZlLg0KLSAgICAgKi8NCi0gICAgUGxhdGZvcm1QYWNrYWdlKElBbmRyb2lkVGFyZ2V0IHRhcmdldCwgUHJvcGVydGllcyBwcm9wcykgew0KLSAgICAgICAgc3VwZXIoICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9zb3VyY2UNCi0gICAgICAgICAgICAgICAgcHJvcHMsICAgICAgICAgICAgICAgICAgICAgIC8vcHJvcGVydGllcw0KLSAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0UmV2aXNpb24oKSwgICAgICAgLy9yZXZpc2lvbg0KLSAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy9saWNlbnNlDQotICAgICAgICAgICAgICAgIHRhcmdldC5nZXREZXNjcmlwdGlvbigpLCAgICAvL2Rlc2NyaXB0aW9uDQotICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvL2Rlc2NVcmwNCi0gICAgICAgICAgICAgICAgT3MuZ2V0Q3VycmVudE9zKCksICAgICAgICAgIC8vYXJjaGl2ZU9zDQotICAgICAgICAgICAgICAgIEFyY2guZ2V0Q3VycmVudEFyY2goKSwgICAgICAvL2FyY2hpdmVBcmNoDQotICAgICAgICAgICAgICAgIHRhcmdldC5nZXRMb2NhdGlvbigpICAgICAgICAvL2FyY2hpdmVPc1BhdGgNCi0gICAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgIG1WZXJzaW9uID0gdGFyZ2V0LmdldFZlcnNpb24oKTsNCi0gICAgICAgIG1WZXJzaW9uTmFtZSAgPSB0YXJnZXQuZ2V0VmVyc2lvbk5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwYWNrYWdlcyBpbiB0aGUgZ2l2ZW4ge0BsaW5rIFByb3BlcnRpZXN9IG9iamVjdC4NCi0gICAgICogVGhlc2UgcHJvcGVydGllcyB3aWxsIGxhdGVyIGJlIGdpdmVuIHRvIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHtAbGluayBQcm9wZXJ0aWVzfSBvYmplY3QuDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgdm9pZCBzYXZlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7DQotICAgICAgICBzdXBlci5zYXZlUHJvcGVydGllcyhwcm9wcyk7DQotDQotICAgICAgICBtVmVyc2lvbi5zYXZlUHJvcGVydGllcyhwcm9wcyk7DQotDQotICAgICAgICBpZiAobVZlcnNpb25OYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX1ZFUlNJT04sIG1WZXJzaW9uTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0TWluVG9vbHNSZXZpc2lvbigpICE9IE1JTl9UT09MU19SRVZfTk9UX1NQRUNJRklFRCkgew0KLSAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfTUlOX1RPT0xTX1JFViwgSW50ZWdlci50b1N0cmluZyhnZXRNaW5Ub29sc1JldmlzaW9uKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiogUmV0dXJucyB0aGUgdmVyc2lvbiwgYSBzdHJpbmcsIGZvciBwbGF0Zm9ybSBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBtVmVyc2lvbk5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqIFJldHVybnMgdGhlIHBhY2thZ2UgdmVyc2lvbiwgZm9yIHBsYXRmb3JtLCBhZGQtb24gYW5kIGRvYyBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIEFuZHJvaWRWZXJzaW9uIGdldFZlcnNpb24oKSB7DQotICAgICAgICByZXR1cm4gbVZlcnNpb247DQotICAgIH0NCi0NCi0gICAgLyoqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBmb3IgYW4ge0BsaW5rIElEZXNjcmlwdGlvbn0uICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKSB7DQotICAgICAgICBTdHJpbmcgczsNCi0NCi0gICAgICAgIGlmIChtVmVyc2lvbi5pc1ByZXZpZXcoKSkgew0KLSAgICAgICAgICAgIHMgPSBTdHJpbmcuZm9ybWF0KCJTREsgUGxhdGZvcm0gQW5kcm9pZCAlMSRzIFByZXZpZXcsIHJldmlzaW9uICUyJHMiLA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbk5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgIGdldFJldmlzaW9uKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzID0gU3RyaW5nLmZvcm1hdCgiU0RLIFBsYXRmb3JtIEFuZHJvaWQgJTEkcywgQVBJICUyJGQsIHJldmlzaW9uICUzJHMiLA0KLSAgICAgICAgICAgICAgICBnZXRWZXJzaW9uTmFtZSgpLA0KLSAgICAgICAgICAgICAgICBtVmVyc2lvbi5nZXRBcGlMZXZlbCgpLA0KLSAgICAgICAgICAgICAgICBnZXRSZXZpc2lvbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgbG9uZyBkZXNjcmlwdGlvbiBmb3IgYW4ge0BsaW5rIElEZXNjcmlwdGlvbn0uDQotICAgICAqDQotICAgICAqIFRoZSBsb25nIGRlc2NyaXB0aW9uIGlzIHdoYXRldmVyIHRoZSBYTUwgY29udGFpbnMgZm9yIHRoZSAmbHQ7ZGVzY3JpcHRpb24mZ3Q7IGZpZWxkLA0KLSAgICAgKiBvciB0aGUgc2hvcnQgZGVzY3JpcHRpb24gaWYgdGhlIGZvcm1lciBpcyBlbXB0eS4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIFN0cmluZyBzID0gZ2V0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgcyA9IGdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzLmluZGV4T2YoInJldmlzaW9uIikgPT0gLTEpIHsNCi0gICAgICAgICAgICBzICs9IFN0cmluZy5mb3JtYXQoIlxuUmV2aXNpb24gJTEkZCIsIGdldFJldmlzaW9uKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbXB1dGVzIGEgcG90ZW50aWFsIGluc3RhbGxhdGlvbiBmb2xkZXIgaWYgYW4gYXJjaGl2ZSBvZiB0aGlzIHBhY2thZ2Ugd2VyZQ0KLSAgICAgKiB0byBiZSBpbnN0YWxsZWQgcmlnaHQgYXdheSBpbiB0aGUgZ2l2ZW4gU0RLIHJvb3QuDQotICAgICAqIDxwLz4NCi0gICAgICogQSBwbGF0Zm9ybSBwYWNrYWdlIGlzIHR5cGljYWxseSBpbnN0YWxsZWQgaW4gU0RLL3BsYXRmb3Jtcy9hbmRyb2lkLSJ2ZXJzaW9uIi4NCi0gICAgICogSG93ZXZlciBpZiB3ZSBjYW4gZmluZCBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdW5kZXIgU0RLL3BsYXRmb3JtIHRoYXQgYWxyZWFkeQ0KLSAgICAgKiBoYXMgdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uIGluc3RhbGxlZCwgd2UnbGwgdXNlIHRoYXQgb25lLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gb3NTZGtSb290IFRoZSBPUyBwYXRoIG9mIHRoZSBTREsgcm9vdCBmb2xkZXIuDQotICAgICAqIEBwYXJhbSBzdWdnZXN0ZWREaXIgQSBzdWdnZXN0aW9uIGZvciB0aGUgaW5zdGFsbGF0aW9uIGZvbGRlciBuYW1lLCBiYXNlZCBvbiB0aGUgcm9vdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZvbGRlciB1c2VkIGluIHRoZSB6aXAgYXJjaGl2ZS4NCi0gICAgICogQHBhcmFtIHNka01hbmFnZXIgQW4gZXhpc3RpbmcgU0RLIG1hbmFnZXIgdG8gbGlzdCBjdXJyZW50IHBsYXRmb3JtcyBhbmQgYWRkb25zLg0KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBGaWxlfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaXJlY3RvcnkgdG8gdXNlIHRvIGluc3RhbGwgdGhpcyBwYWNrYWdlLg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGaWxlIGdldEluc3RhbGxGb2xkZXIoU3RyaW5nIG9zU2RrUm9vdCwgU3RyaW5nIHN1Z2dlc3RlZERpciwgU2RrTWFuYWdlciBzZGtNYW5hZ2VyKSB7DQotDQotICAgICAgICAvLyBGaXJzdCBmaW5kIGlmIHRoaXMgcGxhdGZvcm0gaXMgYWxyZWFkeSBpbnN0YWxsZWQuIElmIHNvLCByZXVzZSB0aGUgc2FtZSBkaXJlY3RvcnkuDQotICAgICAgICBmb3IgKElBbmRyb2lkVGFyZ2V0IHRhcmdldCA6IHNka01hbmFnZXIuZ2V0VGFyZ2V0cygpKSB7DQotICAgICAgICAgICAgaWYgKHRhcmdldC5pc1BsYXRmb3JtKCkgJiYNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRWZXJzaW9uKCkuZXF1YWxzKG1WZXJzaW9uKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFZlcnNpb25OYW1lKCkuZXF1YWxzKGdldFZlcnNpb25OYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSh0YXJnZXQuZ2V0TG9jYXRpb24oKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmlsZSBwbGF0Zm9ybXMgPSBuZXcgRmlsZShvc1Nka1Jvb3QsIFNka0NvbnN0YW50cy5GRF9QTEFURk9STVMpOw0KLSAgICAgICAgRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShwbGF0Zm9ybXMsIFN0cmluZy5mb3JtYXQoImFuZHJvaWQtJXMiLCBnZXRWZXJzaW9uTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIHJldHVybiBmb2xkZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHNhbWVJdGVtQXMoUGFja2FnZSBwa2cpIHsNCi0gICAgICAgIGlmIChwa2cgaW5zdGFuY2VvZiBQbGF0Zm9ybVBhY2thZ2UpIHsNCi0gICAgICAgICAgICBQbGF0Zm9ybVBhY2thZ2UgbmV3UGtnID0gKFBsYXRmb3JtUGFja2FnZSlwa2c7DQotDQotICAgICAgICAgICAgLy8gY2hlY2sgdGhleSBhcmUgdGhlIHNhbWUgcGxhdGZvcm0uDQotICAgICAgICAgICAgcmV0dXJuIG5ld1BrZy5nZXRWZXJzaW9uKCkuZXF1YWxzKHRoaXMuZ2V0VmVyc2lvbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9SZXBvU291cmNlLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9SZXBvU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MzQ1NGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUmVwb1NvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLnJlcG9zaXRvcnkuU2RrUmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotDQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEtleUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIEFuIHNkay1yZXBvc2l0b3J5IHNvdXJjZSwgaS5lLiBhIGRvd25sb2FkIHNpdGUuDQotICogSXQgbWF5IGJlIGEgZnVsbCByZXBvc2l0b3J5IG9yIGFuIGFkZC1vbiBvbmx5IHJlcG9zaXRvcnkuDQotICogQSByZXBvc2l0b3J5IGRlc2NyaWJlcyBvbmUgb3Ige0BsaW5rIFBhY2thZ2V9cyBhdmFpbGFibGUgZm9yIGRvd25sb2FkLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXBvU291cmNlIGltcGxlbWVudHMgSURlc2NyaXB0aW9uIHsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VyU291cmNlOw0KLQ0KLSAgICBwcml2YXRlIFBhY2thZ2VbXSBtUGFja2FnZXM7DQotICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjcmlwdGlvbjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZldGNoRXJyb3I7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvdXJjZSBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnkgVVJMLg0KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBzb3VyY2UgVVJMLiBDYW5ub3QgYmUgbnVsbC4gSWYgdGhlIFVSTCBlbmRzIHdpdGggYSAvLCB0aGUgZGVmYXVsdA0KLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkueG1sIGZpbGVuYW1lIHdpbGwgYmUgYXBwZW5kZWQgYXV0b21hdGljYWxseS4NCi0gICAgICogQHBhcmFtIHVzZXJTb3VyY2UgVHJ1ZSBpZiB0aGlzIGEgdXNlciBzb3VyY2UgKGFkZC1vbnMgJiBwYWNrYWdlcyBvbmx5LikNCi0gICAgICovDQotICAgIHB1YmxpYyBSZXBvU291cmNlKFN0cmluZyB1cmwsIGJvb2xlYW4gdXNlclNvdXJjZSkgew0KLQ0KLSAgICAgICAgLy8gaWYgdGhlIFVSTCBlbmRzIHdpdGggYSAvLCBpdCBtdXN0IGJlICJkaXJlY3RvcnkiIHJlc291cmNlLA0KLSAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgZGVmYXVsdCBmaWxlIHRoYXQgd2lsbA0KLSAgICAgICAgLy8gbG9va2VkIGZvci4gVGhpcyB3YXkgaXQgd2lsbCBiZSBvYnZpb3VzIHRvIHRoZSB1c2VyIHdoaWNoDQotICAgICAgICAvLyByZXNvdXJjZSB3ZSBhcmUgYWN0dWFsbHkgdHJ5aW5nIHRvIGZldGNoLg0KLSAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgiLyIpKSB7ICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgdXJsICs9IFNka1JlcG9zaXRvcnkuVVJMX0RFRkFVTFRfWE1MX0ZJTEU7DQotICAgICAgICB9DQotDQotICAgICAgICBtVXJsID0gdXJsOw0KLSAgICAgICAgbVVzZXJTb3VyY2UgPSB1c2VyU291cmNlOw0KLSAgICAgICAgc2V0RGVmYXVsdERlc2NyaXB0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFR3byByZXBvIHNvdXJjZSBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHVzZXJTb3VyY2UgZmxhZyBhbmQgdGhlIHNhbWUgVVJMLg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVwb1NvdXJjZSkgew0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2UgcnMgPSAoUmVwb1NvdXJjZSkgb2JqOw0KLSAgICAgICAgICAgIHJldHVybiAgcnMuaXNVc2VyU291cmNlKCkgPT0gdGhpcy5pc1VzZXJTb3VyY2UoKSAmJiBycy5nZXRVcmwoKS5lcXVhbHModGhpcy5nZXRVcmwoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQotICAgICAgICByZXR1cm4gbVVybC5oYXNoQ29kZSgpIF4gQm9vbGVhbi52YWx1ZU9mKG1Vc2VyU291cmNlKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHVzZXIgc291cmNlLiBXZSBvbmx5IGxvYWQgYWRkb24gYW5kIGV4dHJhIHBhY2thZ2VzDQotICAgICAqIGZyb20gYSB1c2VyIHNvdXJjZSBhbmQgaWdub3JlIHRoZSByZXN0LiAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJTb3VyY2UoKSB7DQotICAgICAgICByZXR1cm4gbVVzZXJTb3VyY2U7DQotICAgIH0NCi0NCi0gICAgLyoqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgcmVwb3NpdG9yeS54bWwgZmlsZSBmb3IgdGhpcyBzb3VyY2UuICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgew0KLSAgICAgICAgcmV0dXJuIG1Vcmw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yga25vd24gcGFja2FnZXMgZm91bmQgYnkgdGhlIGxhc3QgY2FsbCB0byBsb2FkKCkuDQotICAgICAqIFRoaXMgaXMgbnVsbCB3aGVuIHRoZSBzb3VyY2UgaGFzbid0IGJlZW4gbG9hZGVkIHlldC4NCi0gICAgICovDQotICAgIHB1YmxpYyBQYWNrYWdlW10gZ2V0UGFja2FnZXMoKSB7DQotICAgICAgICByZXR1cm4gbVBhY2thZ2VzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDbGVhciB0aGUgaW50ZXJuYWwgcGFja2FnZXMgbGlzdC4gQWZ0ZXIgdGhpcyBjYWxsLCB7QGxpbmsgI2dldFBhY2thZ2VzKCl9IHdpbGwgcmV0dXJuDQotICAgICAqIG51bGwgdGlsbCBsb2FkKCkgaXMgY2FsbGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY2xlYXJQYWNrYWdlcygpIHsNCi0gICAgICAgIG1QYWNrYWdlcyA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG1Vcmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uID09IG51bGwgPyAiIiA6IG1EZXNjcmlwdGlvbjsgIC8vJE5PTi1OTFMtMSQNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgbGFzdCBmZXRjaCBlcnJvciBkZXNjcmlwdGlvbi4NCi0gICAgICogSWYgdGhlcmUgd2FzIG5vIGVycm9yLCByZXR1cm5zIG51bGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZldGNoRXJyb3IoKSB7DQotICAgICAgICByZXR1cm4gbUZldGNoRXJyb3I7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIHRvIGZldGNoIHRoZSByZXBvc2l0b3J5IGluZGV4IGZvciB0aGUgZ2l2ZW4gVVJMLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbG9hZChJVGFza01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBmb3JjZUh0dHApIHsNCi0NCi0gICAgICAgIG1vbml0b3Iuc2V0UHJvZ3Jlc3NNYXgoNCk7DQotDQotICAgICAgICBzZXREZWZhdWx0RGVzY3JpcHRpb24oKTsNCi0NCi0gICAgICAgIFN0cmluZyB1cmwgPSBtVXJsOw0KLSAgICAgICAgaWYgKGZvcmNlSHR0cCkgew0KLSAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlQWxsKCJodHRwczovLyIsICJodHRwOi8vIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1vbml0b3Iuc2V0RGVzY3JpcHRpb24oIkZldGNoaW5nICUxJHMiLCB1cmwpOw0KLSAgICAgICAgbW9uaXRvci5pbmNQcm9ncmVzcygxKTsNCi0NCi0gICAgICAgIG1GZXRjaEVycm9yID0gbnVsbDsNCi0gICAgICAgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbiA9IG5ldyBFeGNlcHRpb25bXSB7IG51bGwgfTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHhtbCA9IGZldGNoVXJsKHVybCwgZXhjZXB0aW9uKTsNCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGVkID0gZmFsc2U7DQotICAgICAgICBpZiAoeG1sICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtb25pdG9yLnNldERlc2NyaXB0aW9uKCJWYWxpZGF0ZSBYTUwiKTsNCi0gICAgICAgICAgICB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVhtbCh4bWwsIHVybCwgbW9uaXRvcik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJZiB3ZSBmYWlsZWQgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZSBVUkwgZG9lc24ndCBleHBsaWNpdGx5IGVuZCB3aXRoDQotICAgICAgICAvLyBvdXIgZmlsZW5hbWUsIG1ha2UgYW5vdGhlciB0ZW50YXRpdmUgYWZ0ZXIgY2hhbmdpbmcgdGhlIFVSTC4NCi0gICAgICAgIGlmICghdmFsaWRhdGVkICYmICF1cmwuZW5kc1dpdGgoU2RrUmVwb3NpdG9yeS5VUkxfREVGQVVMVF9YTUxfRklMRSkpIHsNCi0gICAgICAgICAgICBpZiAoIXVybC5lbmRzV2l0aCgiLyIpKSB7ICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgdXJsICs9ICIvIjsgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdXJsICs9IFNka1JlcG9zaXRvcnkuVVJMX0RFRkFVTFRfWE1MX0ZJTEU7DQotDQotICAgICAgICAgICAgeG1sID0gZmV0Y2hVcmwodXJsLCBleGNlcHRpb24pOw0KLSAgICAgICAgICAgIGlmICh4bWwgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVhtbCh4bWwsIHVybCwgbW9uaXRvcik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZWQpIHsNCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlY29uZCB0ZW50YXRpdmUgc3VjY2VlZGVkLCBpbmRpY2F0ZSBpdCBpbiB0aGUgY29uc29sZQ0KLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBVUkwgdGhhdCB3b3JrZWQuDQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJSZXBvc2l0b3J5IGZvdW5kIGF0ICUxJHMiLCB1cmwpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBtb2RpZmllZCBVUkwNCi0gICAgICAgICAgICAgICAgbVVybCA9IHVybDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJZiBhbnkgZXhjZXB0aW9uIHdhcyBoYW5kbGVkIGR1cmluZyB0aGUgVVJMIGZldGNoLCBkaXNwbGF5IGl0IG5vdy4NCi0gICAgICAgIGlmIChleGNlcHRpb25bMF0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1GZXRjaEVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBVUkwiOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBudWxsOw0KLSAgICAgICAgICAgIGlmIChleGNlcHRpb25bMF0gaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgLy8gRk5GIGhhcyBubyB1c2VmdWwgZ2V0TWVzc2FnZSwgc28gd2UgbmVlZCB0byBzcGVjaWFsIGhhbmRsZSBpdC4NCi0gICAgICAgICAgICAgICAgcmVhc29uID0gIkZpbGUgbm90IGZvdW5kIjsNCi0gICAgICAgICAgICAgICAgbUZldGNoRXJyb3IgKz0gIjogIiArIHJlYXNvbjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvblswXSBpbnN0YW5jZW9mIFNTTEtleUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAvLyBUaGF0J3MgYSBjb21tb24gZXJyb3IgYW5kIHdlIGhhdmUgYSBwcmVmIGZvciBpdC4NCi0gICAgICAgICAgICAgICAgcmVhc29uID0gIkhUVFBTIFNTTCBlcnJvci4gWW91IG1pZ2h0IHdhbnQgdG8gZm9yY2UgZG93bmxvYWQgdGhyb3VnaCBIVFRQIGluIHRoZSBzZXR0aW5ncy4iOw0KLSAgICAgICAgICAgICAgICBtRmV0Y2hFcnJvciArPSAiOiBIVFRQUyBTU0wgZXJyb3IiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uWzBdLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGV4Y2VwdGlvblswXS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGF0J3Mgd3JvbmcuIExldCdzIGdpdmUgdGhlIGV4Y2VwdGlvbiBjbGFzcyBhdCBsZWFzdC4NCi0gICAgICAgICAgICAgICAgcmVhc29uID0gU3RyaW5nLmZvcm1hdCgiVW5rbm93biAoJTEkcykiLCBleGNlcHRpb25bMF0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiRmFpbGVkIHRvIGZldGNoIFVSTCAlMSRzLCByZWFzb246ICUyJHMiLCB1cmwsIHJlYXNvbik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTdG9wIGhlcmUgaWYgd2UgZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBYTUwuIFdlIGRvbid0IHdhbnQgdG8gbG9hZCBpdC4NCi0gICAgICAgIGlmICghdmFsaWRhdGVkKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbW9uaXRvci5pbmNQcm9ncmVzcygxKTsNCi0NCi0gICAgICAgIGlmICh4bWwgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1vbml0b3Iuc2V0RGVzY3JpcHRpb24oIlBhcnNlIFhNTCIpOw0KLSAgICAgICAgICAgIG1vbml0b3IuaW5jUHJvZ3Jlc3MoMSk7DQotICAgICAgICAgICAgcGFyc2VQYWNrYWdlcyh4bWwsIG1vbml0b3IpOw0KLSAgICAgICAgICAgIGlmIChtUGFja2FnZXMgPT0gbnVsbCB8fCBtUGFja2FnZXMubGVuZ3RoID09IDApIHsNCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uICs9ICJcbk5vIHBhY2thZ2VzIGZvdW5kLiI7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUGFja2FnZXMubGVuZ3RoID09IDEpIHsNCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uICs9ICJcbk9uZSBwYWNrYWdlIGZvdW5kLiI7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uICs9IFN0cmluZy5mb3JtYXQoIlxuJTEkZCBwYWNrYWdlcyBmb3VuZC4iLCBtUGFja2FnZXMubGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBkb25lDQotICAgICAgICBtb25pdG9yLmluY1Byb2dyZXNzKDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0RGVzY3JpcHRpb24oKSB7DQotICAgICAgICBpZiAobVVzZXJTb3VyY2UpIHsNCi0gICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBTdHJpbmcuZm9ybWF0KCJBZGQtb24gU291cmNlOiAlMSRzIiwgbVVybCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IFN0cmluZy5mb3JtYXQoIlNESyBTb3VyY2U6ICUxJHMiLCBtVXJsKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmV0Y2hlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy4NCi0gICAgICogUmV0dXJucyBudWxsIGlmIGFueXRoaW5nIHdyb25nIGhhcHBlbnMgYW5kIHdyaXRlIGVycm9ycyB0byB0aGUgbW9uaXRvci4NCi0gICAgICoNCi0gICAgICogUmVmZXJlbmNlczoNCi0gICAgICogSmF2YSBVUkwgQ29ubmVjdGlvbjogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL25ldHdvcmtpbmcvdXJscy9yZWFkaW5nV3JpdGluZy5odG1sDQotICAgICAqIEphdmEgVVJMIFJlYWRlcjogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL25ldHdvcmtpbmcvdXJscy9yZWFkaW5nVVJMLmh0bWwNCi0gICAgICogSmF2YSBzZXQgUHJveHk6IGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9uZXR3b3JraW5nL3VybHMvX3NldFByb3h5Lmh0bWwNCi0gICAgICovDQotICAgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZmV0Y2hVcmwoU3RyaW5nIHVybFN0cmluZywgRXhjZXB0aW9uW10gb3V0RXhjZXB0aW9uKSB7DQotICAgICAgICBVUkwgdXJsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7DQotDQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmMgPSA2NTUzNjsNCi0gICAgICAgICAgICBpbnQgY3VyciA9IDA7DQotICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2luY107DQotDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpbnQgbjsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKChuID0gaXMucmVhZChyZXN1bHQsIGN1cnIsIHJlc3VsdC5sZW5ndGggLSBjdXJyKSkgIT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1cnIgKz0gbjsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09IHJlc3VsdC5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdGVtcCA9IG5ldyBieXRlW2N1cnIgKyBpbmNdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCB0ZW1wLCAwLCBjdXJyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0ZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0LCAwLCBjdXJyKTsNCi0NCi0gICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgb3V0RXhjZXB0aW9uWzBdID0gZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZXMgdGhpcyBYTUwgYWdhaW5zdCB0aGUgU0RLIFJlcG9zaXRvcnkgc2NoZW1hLg0KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFhNTCB3YXMgY29ycmVjdGx5IHZhbGlkYXRlZC4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVhtbChCeXRlQXJyYXlJbnB1dFN0cmVhbSB4bWwsIFN0cmluZyB1cmwsIElUYXNrTW9uaXRvciBtb25pdG9yKSB7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoDQotICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAlMSRzLlxuTm8gc3VpdGFibGUgWE1MIFNjaGVtYSBWYWxpZGF0b3IgY291bGQgYmUgZm91bmQgaW4geW91ciBKYXZhIGVudmlyb25tZW50LiBQbGVhc2UgY29uc2lkZXIgdXBkYXRpbmcgeW91ciB2ZXJzaW9uIG9mIEphdmEuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmwpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHhtbC5yZXNldCgpOw0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgU3RyZWFtU291cmNlKHhtbCkpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgcyA9IGUuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcyA9IGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJYTUwgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgJTEkcy5cbkVycm9yOiAlMiRzIiwNCi0gICAgICAgICAgICAgICAgICAgIHVybCwNCi0gICAgICAgICAgICAgICAgICAgIHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHZhbGlkYXRvciBmb3Igb3VyIFhTRA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICBJbnB1dFN0cmVhbSB4c2RTdHJlYW0gPSBTZGtSZXBvc2l0b3J5LmdldFhzZFN0cmVhbSgpOw0KLSAgICAgICAgU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShYTUxDb25zdGFudHMuVzNDX1hNTF9TQ0hFTUFfTlNfVVJJKTsNCi0NCi0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFRoaXMgbWF5IHRocm93IGEgU0FYIEV4Y2VwdGlvbiBpZiB0aGUgc2NoZW1hIGl0c2VsZiBpcyBub3QgYSB2YWxpZCBYU0QNCi0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5Lm5ld1NjaGVtYShuZXcgU3RyZWFtU291cmNlKHhzZFN0cmVhbSkpOw0KLQ0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNjaGVtYSA9PSBudWxsID8gbnVsbCA6IHNjaGVtYS5uZXdWYWxpZGF0b3IoKTsNCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3I7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlIGFsbCBwYWNrYWdlcyBkZWZpbmVkIGluIHRoZSBTREsgUmVwb3NpdG9yeSBYTUwgYW5kIGNyZWF0ZXMNCi0gICAgICogYSBuZXcgbVBhY2thZ2VzIGFycmF5IHdpdGggdGhlbS4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZVBhY2thZ2VzKEJ5dGVBcnJheUlucHV0U3RyZWFtIHhtbCwgSVRhc2tNb25pdG9yIG1vbml0b3IpIHsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoeG1sKTsNCi0NCi0gICAgICAgICAgICBOb2RlIHJvb3QgPSBnZXRGaXJzdENoaWxkKGRvYywgU2RrUmVwb3NpdG9yeS5OT0RFX1NES19SRVBPU0lUT1JZKTsNCi0gICAgICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7DQotDQotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxQYWNrYWdlPiBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gUGFyc2UgbGljZW5zZSBkZWZpbml0aW9ucw0KLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBsaWNlbnNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSByb290LmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgICAgICBjaGlsZCAhPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrUmVwb3NpdG9yeS5OU19TREtfUkVQT1NJVE9SWS5lcXVhbHMoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhTZGtSZXBvc2l0b3J5Lk5PREVfTElDRU5TRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGlkID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShTZGtSZXBvc2l0b3J5LkFUVFJfSUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VzLnB1dChpZC5nZXROb2RlVmFsdWUoKSwgY2hpbGQuZ2V0VGV4dENvbnRlbnQoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIFBhcnNlIHBhY2thZ2VzDQotICAgICAgICAgICAgICAgIGZvciAoTm9kZSBjaGlsZCA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGtSZXBvc2l0b3J5Lk5TX1NES19SRVBPU0lUT1JZLmVxdWFscyhjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcCA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxvYWQgYWRkb24gYW5kIGV4dHJhIHBhY2thZ2VzIGZyb20gYWxsIHNvdXJjZXMsIGVpdGhlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBvciB1c2VyIHNvdXJjZXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZGtSZXBvc2l0b3J5Lk5PREVfQUREX09OLmVxdWFscyhuYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG5ldyBBZGRvblBhY2thZ2UodGhpcywgY2hpbGQsIGxpY2Vuc2VzKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTZGtSZXBvc2l0b3J5Lk5PREVfRVhUUkEuZXF1YWxzKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gbmV3IEV4dHJhUGFja2FnZSh0aGlzLCBjaGlsZCwgbGljZW5zZXMpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtVXNlclNvdXJjZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBsb2FkIHBsYXRmb3JtLCBkb2MgYW5kIHRvb2wgcGFja2FnZXMgZnJvbSBpbnRlcm5hbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlcywgbmV2ZXIgZnJvbSB1c2VyIHNvdXJjZXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2RrUmVwb3NpdG9yeS5OT0RFX1BMQVRGT1JNLmVxdWFscyhuYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgUGxhdGZvcm1QYWNrYWdlKHRoaXMsIGNoaWxkLCBsaWNlbnNlcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNka1JlcG9zaXRvcnkuTk9ERV9ET0MuZXF1YWxzKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG5ldyBEb2NQYWNrYWdlKHRoaXMsIGNoaWxkLCBsaWNlbnNlcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNka1JlcG9zaXRvcnkuTk9ERV9UT09MLmVxdWFscyhuYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgVG9vbFBhY2thZ2UodGhpcywgY2hpbGQsIGxpY2Vuc2VzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5hZGQocCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnNldERlc2NyaXB0aW9uKCJGb3VuZCAlMSRzIiwgcC5nZXRTaG9ydERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgcGFja2FnZXMNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbVBhY2thZ2VzID0gcGFja2FnZXMudG9BcnJheShuZXcgUGFja2FnZVtwYWNrYWdlcy5zaXplKCldKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkZhaWxlZCB0byBjcmVhdGUgWE1MIGRvY3VtZW50IGJ1aWxkZXIiKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIkZhaWxlZCB0byBwYXJzZSBYTUwgZG9jdW1lbnQiKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiRmFpbGVkIHRvIHJlYWQgWE1MIGRvY3VtZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gWE1MIGxvY2FsIG5hbWUuDQotICAgICAqIElmIHhtbExvY2FsTmFtZSBpcyBudWxsLCByZXR1cm5zIHRoZSB2ZXJ5IGZpcnN0IGNoaWxkIGVsZW1lbnQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIE5vZGUgZ2V0Rmlyc3RDaGlsZChOb2RlIG5vZGUsIFN0cmluZyB4bWxMb2NhbE5hbWUpIHsNCi0NCi0gICAgICAgIGZvcihOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgew0KLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmDQotICAgICAgICAgICAgICAgICAgICBTZGtSZXBvc2l0b3J5Lk5TX1NES19SRVBPU0lUT1JZLmVxdWFscyhjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHhtbExvY2FsTmFtZSA9PSBudWxsIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyh4bWxMb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGFrZXMgYW4gWE1MIGRvY3VtZW50IGFzIGEgc3RyaW5nIGFzIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIERPTSBmb3IgaXQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KEJ5dGVBcnJheUlucHV0U3RyZWFtIHhtbCkNCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBmYWN0b3J5LnNldElnbm9yaW5nQ29tbWVudHModHJ1ZSk7DQotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLQ0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOw0KLSAgICAgICAgeG1sLnJlc2V0KCk7DQotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh4bWwpKTsNCi0NCi0gICAgICAgIHJldHVybiBkb2M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUmVwb1NvdXJjZXMuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1JlcG9Tb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwNDUyYjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUmVwb1NvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQucHJlZnMuQW5kcm9pZExvY2F0aW9uLkFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi0NCi0vKioNCi0gKiBBIGxpc3Qgb2Ygc2RrLXJlcG9zaXRvcnkgc291cmNlcy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVwb1NvdXJjZXMgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPVU5UID0gImNvdW50IjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TUkMgPSAic3JjIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19GSUxFTkFNRSA9ICJyZXBvc2l0b3JpZXMuY2ZnIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxSZXBvU291cmNlPiBtU291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVwb1NvdXJjZT4oKTsNCi0NCi0gICAgcHVibGljIFJlcG9Tb3VyY2VzKCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgbmV3IHNvdXJjZSB0byB0aGUgU291cmNlcyBsaXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkKFJlcG9Tb3VyY2Ugc291cmNlKSB7DQotICAgICAgICBtU291cmNlcy5hZGQoc291cmNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVtb3ZlcyBhIHNvdXJjZSBmcm9tIHRoZSBTb3VyY2VzIGxpc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoUmVwb1NvdXJjZSBzb3VyY2UpIHsNCi0gICAgICAgIG1Tb3VyY2VzLnJlbW92ZShzb3VyY2UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2VzIGxpc3QgYXJyYXkuIFRoaXMgaXMgbmV2ZXIgbnVsbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZXBvU291cmNlW10gZ2V0U291cmNlcygpIHsNCi0gICAgICAgIHJldHVybiBtU291cmNlcy50b0FycmF5KG5ldyBSZXBvU291cmNlW21Tb3VyY2VzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2FkcyBhbGwgdXNlciBzb3VyY2VzLiBUaGlzIDxlbT5yZXBsYWNlczwvZW0+IGFsbCBleGlzdGluZyB1c2VyIHNvdXJjZXMNCi0gICAgICogYnkgdGhlIG9uZXMgZnJvbSB0aGUgcHJvcGVydHkgZmlsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGxvYWRVc2VyU291cmNlcyhJU2RrTG9nIGxvZykgew0KLQ0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBleGlzdGluZyB1c2VyIHNvdXJjZXMNCi0gICAgICAgIGZvciAoSXRlcmF0b3I8UmVwb1NvdXJjZT4gaXQgPSBtU291cmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgew0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2UgcyA9IGl0Lm5leHQoKTsNCi0gICAgICAgICAgICBpZiAocy5pc1VzZXJTb3VyY2UoKSkgew0KLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBMb2FkIG5ldyB1c2VyIHNvdXJjZXMgZnJvbSBwcm9wZXJ0eSBmaWxlDQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIGZvbGRlciA9IEFuZHJvaWRMb2NhdGlvbi5nZXRGb2xkZXIoKTsNCi0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmb2xkZXIsIFNSQ19GSUxFTkFNRSk7DQotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsNCi0gICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsNCi0NCi0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoZmlzKTsNCi0NCi0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gSW50ZWdlci5wYXJzZUludChwcm9wcy5nZXRQcm9wZXJ0eShLRVlfQ09VTlQsICIwIikpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBwcm9wcy5nZXRQcm9wZXJ0eShTdHJpbmcuZm9ybWF0KCIlcyUwMmQiLCBLRVlfU1JDLCBpKSk7ICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBSZXBvU291cmNlIHMgPSBuZXcgUmVwb1NvdXJjZSh1cmwsIHRydWUgLyp1c2VyU291cmNlKi8pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzU291cmNlKHMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VzLmFkZChzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUsIG51bGwpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhbHJlYWR5IGEgc2ltaWxhciBzb3VyY2UgaW4gdGhlIHNvdXJjZXMgbGlzdC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGUgc2VhcmNoIGlzIE8oTiksIHdoaWNoIHNob3VsZCBiZSBhY2NlcHRhYmxlIG9uIHRoZSBleHBlY3RlZGx5IHNtYWxsIHNvdXJjZSBsaXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaGFzU291cmNlKFJlcG9Tb3VyY2Ugc291cmNlKSB7DQotICAgICAgICBmb3IgKFJlcG9Tb3VyY2UgcyA6IG1Tb3VyY2VzKSB7DQotICAgICAgICAgICAgaWYgKHMuZXF1YWxzKHNvdXJjZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTYXZlcyBhbGwgdGhlIHVzZXIgc291cmNlcy4NCi0gICAgICogQHBhcmFtIGxvZw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2F2ZVVzZXJTb3VyY2VzKElTZGtMb2cgbG9nKSB7DQotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXIgPSBBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCk7DQotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZm9sZGVyLCBTUkNfRklMRU5BTUUpOw0KLQ0KLSAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOw0KLQ0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOw0KLQ0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICAgICAgZm9yIChSZXBvU291cmNlIHMgOiBtU291cmNlcykgew0KLSAgICAgICAgICAgICAgICBpZiAocy5pc1VzZXJTb3VyY2UoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KFN0cmluZy5mb3JtYXQoIiVzJTAyZCIsIEtFWV9TUkMsIGNvdW50KSwgcy5nZXRVcmwoKSk7ICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoS0VZX0NPVU5ULCBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KSk7DQotDQotICAgICAgICAgICAgcHJvcHMuc3RvcmUoIGZvcywgIiMjIFVzZXIgU291cmNlcyBmb3IgQW5kcm9pZCB0b29sIik7ICAvLyROT04tTkxTLTEkDQotDQotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZSwgbnVsbCk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Ub29sUGFja2FnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvVG9vbFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY3MGY5MS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Ub29sUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuQXJjaDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5PczsNCi0NCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIGEgdG9vbCBYTUwgbm9kZSBpbiBhbiBTREsgcmVwb3NpdG9yeS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgVG9vbFBhY2thZ2UgZXh0ZW5kcyBQYWNrYWdlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgdG9vbCBwYWNrYWdlIGZyb20gdGhlIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBYTUwgbm9kZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHBhY2thZ2UgY2Fubm90IGJlIGNyZWF0ZWQuDQotICAgICAqLw0KLSAgICBUb29sUGFja2FnZShSZXBvU291cmNlIHNvdXJjZSwgTm9kZSBwYWNrYWdlTm9kZSwgTWFwPFN0cmluZyxTdHJpbmc+IGxpY2Vuc2VzKSB7DQotICAgICAgICBzdXBlcihzb3VyY2UsIHBhY2thZ2VOb2RlLCBsaWNlbnNlcyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1hbnVhbGx5IGNyZWF0ZSBhIG5ldyBwYWNrYWdlIHdpdGggb25lIGFyY2hpdmUgYW5kIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIG9yIHByb3BlcnRpZXMuDQotICAgICAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgcGFja2FnZXMgZnJvbSBsb2NhbCBkaXJlY3RvcmllcyBpbiB3aGljaCBjYXNlIHRoZXJlIG11c3QgYmUNCi0gICAgICogb25lIGFyY2hpdmUgd2hpY2ggVVJMIGlzIHRoZSBhY3R1YWwgdGFyZ2V0IGxvY2F0aW9uLg0KLSAgICAgKiA8cC8+DQotICAgICAqIEJ5IGRlc2lnbiwgdGhpcyBjcmVhdGVzIGEgcGFja2FnZSB3aXRoIG9uZSBhbmQgb25seSBvbmUgYXJjaGl2ZS4NCi0gICAgICovDQotICAgIFRvb2xQYWNrYWdlKA0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2Ugc291cmNlLA0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMsDQotICAgICAgICAgICAgaW50IHJldmlzaW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBsaWNlbnNlLA0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwNCi0gICAgICAgICAgICBTdHJpbmcgZGVzY1VybCwNCi0gICAgICAgICAgICBPcyBhcmNoaXZlT3MsDQotICAgICAgICAgICAgQXJjaCBhcmNoaXZlQXJjaCwNCi0gICAgICAgICAgICBTdHJpbmcgYXJjaGl2ZU9zUGF0aCkgew0KLSAgICAgICAgc3VwZXIoc291cmNlLA0KLSAgICAgICAgICAgICAgICBwcm9wcywNCi0gICAgICAgICAgICAgICAgcmV2aXNpb24sDQotICAgICAgICAgICAgICAgIGxpY2Vuc2UsDQotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLA0KLSAgICAgICAgICAgICAgICBkZXNjVXJsLA0KLSAgICAgICAgICAgICAgICBhcmNoaXZlT3MsDQotICAgICAgICAgICAgICAgIGFyY2hpdmVBcmNoLA0KLSAgICAgICAgICAgICAgICBhcmNoaXZlT3NQYXRoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIGZvciBhbiB7QGxpbmsgSURlc2NyaXB0aW9ufS4gKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJBbmRyb2lkIFNESyBUb29scywgcmV2aXNpb24gJTEkZCIsIGdldFJldmlzaW9uKCkpOw0KLSAgICB9DQotDQotICAgIC8qKiBSZXR1cm5zIGEgbG9uZyBkZXNjcmlwdGlvbiBmb3IgYW4ge0BsaW5rIElEZXNjcmlwdGlvbn0uICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpIHsNCi0gICAgICAgIFN0cmluZyBzID0gZ2V0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgcyA9IGdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzLmluZGV4T2YoInJldmlzaW9uIikgPT0gLTEpIHsNCi0gICAgICAgICAgICBzICs9IFN0cmluZy5mb3JtYXQoIlxuUmV2aXNpb24gJTEkZCIsIGdldFJldmlzaW9uKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbXB1dGVzIGEgcG90ZW50aWFsIGluc3RhbGxhdGlvbiBmb2xkZXIgaWYgYW4gYXJjaGl2ZSBvZiB0aGlzIHBhY2thZ2Ugd2VyZQ0KLSAgICAgKiB0byBiZSBpbnN0YWxsZWQgcmlnaHQgYXdheSBpbiB0aGUgZ2l2ZW4gU0RLIHJvb3QuDQotICAgICAqIDxwLz4NCi0gICAgICogQSAidG9vbCIgcGFja2FnZSBzaG91bGQgYWx3YXlzIGJlIGxvY2F0ZWQgaW4gU0RLL3Rvb2xzLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gb3NTZGtSb290IFRoZSBPUyBwYXRoIG9mIHRoZSBTREsgcm9vdCBmb2xkZXIuDQotICAgICAqIEBwYXJhbSBzdWdnZXN0ZWREaXIgQSBzdWdnZXN0aW9uIGZvciB0aGUgaW5zdGFsbGF0aW9uIGZvbGRlciBuYW1lLCBiYXNlZCBvbiB0aGUgcm9vdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZvbGRlciB1c2VkIGluIHRoZSB6aXAgYXJjaGl2ZS4NCi0gICAgICogQHBhcmFtIHNka01hbmFnZXIgQW4gZXhpc3RpbmcgU0RLIG1hbmFnZXIgdG8gbGlzdCBjdXJyZW50IHBsYXRmb3JtcyBhbmQgYWRkb25zLg0KLSAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBGaWxlfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaXJlY3RvcnkgdG8gdXNlIHRvIGluc3RhbGwgdGhpcyBwYWNrYWdlLg0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGaWxlIGdldEluc3RhbGxGb2xkZXIoU3RyaW5nIG9zU2RrUm9vdCwgU3RyaW5nIHN1Z2dlc3RlZERpciwgU2RrTWFuYWdlciBzZGtNYW5hZ2VyKSB7DQotICAgICAgICByZXR1cm4gbmV3IEZpbGUob3NTZGtSb290LCBTZGtDb25zdGFudHMuRkRfVE9PTFMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzYW1lSXRlbUFzKFBhY2thZ2UgcGtnKSB7DQotICAgICAgICAvLyBvbmx5IG9uZSB0b29sIHBhY2thZ2Ugc28gYW55IHRvb2wgcGFja2FnZSBpcyB0aGUgc2FtZSBpdGVtLg0KLSAgICAgICAgcmV0dXJuIHBrZyBpbnN0YW5jZW9mIFRvb2xQYWNrYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1htbFBhcnNlclV0aWxzLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9YbWxQYXJzZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YThiYzdkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1htbFBhcnNlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIucmVwb3NpdG9yeS5TZGtSZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLQ0KLS8qKg0KLSAqIE1pc2MgdXRpbGl0aWVzIHRvIGhlbHAgZXh0cmFjdGluZyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBvdXQgb2YgYW4gWE1MIGRvY3VtZW50Lg0KLSAqLw0KLWNsYXNzIFhtbFBhcnNlclV0aWxzIHsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gWE1MIGxvY2FsIG5hbWUuDQotICAgICAqIElmIHhtbExvY2FsTmFtZSBpcyBudWxsLCByZXR1cm5zIHRoZSB2ZXJ5IGZpcnN0IGNoaWxkIGVsZW1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIE5vZGUgZ2V0Rmlyc3RDaGlsZChOb2RlIG5vZGUsIFN0cmluZyB4bWxMb2NhbE5hbWUpIHsNCi0NCi0gICAgICAgIGZvcihOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgew0KLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmDQotICAgICAgICAgICAgICAgICAgICBTZGtSZXBvc2l0b3J5Lk5TX1NES19SRVBPU0lUT1JZLmVxdWFscyhjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHhtbExvY2FsTmFtZSA9PSBudWxsIHx8IHhtbExvY2FsTmFtZS5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGF0IFhNTCBlbGVtZW50IGFzIGEgc3RyaW5nLg0KLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYbWxTdHJpbmcoTm9kZSBub2RlLCBTdHJpbmcgeG1sTG9jYWxOYW1lKSB7DQotICAgICAgICBOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZChub2RlLCB4bWxMb2NhbE5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNoaWxkID09IG51bGwgPyAiIiA6IGNoaWxkLmdldFRleHRDb250ZW50KCk7ICAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhhdCBYTUwgZWxlbWVudCBhcyBhbiBpbnRlZ2VyLg0KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgbWlzc2luZyBvciBpcyBub3QgYW4gaW50ZWdlci4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFhtbEludChOb2RlIG5vZGUsIFN0cmluZyB4bWxMb2NhbE5hbWUsIGludCBkZWZhdWx0VmFsdWUpIHsNCi0gICAgICAgIFN0cmluZyBzID0gZ2V0WG1sU3RyaW5nKG5vZGUsIHhtbExvY2FsTmFtZSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHMpOw0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoYXQgWE1MIGVsZW1lbnQgYXMgYSBsb25nLg0KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgbWlzc2luZyBvciBpcyBub3QgYW4gaW50ZWdlci4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRYbWxMb25nKE5vZGUgbm9kZSwgU3RyaW5nIHhtbExvY2FsTmFtZSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsNCi0gICAgICAgIFN0cmluZyBzID0gZ2V0WG1sU3RyaW5nKG5vZGUsIHhtbExvY2FsTmFtZSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyhzKTsNCi0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0cmlldmUgYW4gYXR0cmlidXRlIHdoaWNoIHZhbHVlIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBnaXZlbiBlbnVtcyB1c2luZyBhDQotICAgICAqIGNhc2UtaW5zZW5zaXRpdmUgbmFtZSBtYXRjaC4NCi0gICAgICoNCi0gICAgICogUmV0dXJucyBkZWZhdWx0VmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdCBvciBpdHMgdmFsdWUgZG9lcyBub3QgbWF0Y2gNCi0gICAgICogdGhlIGdpdmVuIGVudW0gdmFsdWVzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RW51bUF0dHJpYnV0ZSgNCi0gICAgICAgICAgICBOb2RlIGFyY2hpdmVOb2RlLA0KLSAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSwNCi0gICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMsDQotICAgICAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgew0KLQ0KLSAgICAgICAgTm9kZSBhdHRyID0gYXJjaGl2ZU5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7DQotICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIGZvdW5kID0gYXR0ci5nZXROb2RlVmFsdWUoKTsNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgew0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGZvdW5kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9TZGtSZXBvc2l0b3J5LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9TZGtSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZjg3ZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL3JlcG9zaXRvcnkvU2RrUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5Ow0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIFB1YmxpYyBjb25zdGFudHMgZm9yIHRoZSBzZGstcmVwb3NpdG9yeSBYTUwgU2NoZW1hLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZGtSZXBvc2l0b3J5IHsNCi0NCi0gICAgLyoqIFRoZSBVUkwgb2YgdGhlIG9mZmljaWFsIEdvb2dsZSBzZGstcmVwb3NpdG9yeSBzaXRlLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfR09PR0xFX1NES19SRVBPX1NJVEUgPQ0KLSAgICAgICAgImh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5LyI7ICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfREVGQVVMVF9YTUxfRklMRSA9ICJyZXBvc2l0b3J5LnhtbCI7ICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogVGhlIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIHNkay1yZXBvc2l0b3J5IFhNTC4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfU0RLX1JFUE9TSVRPUlkgPQ0KLSAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG9zaXRvcnkvMSI7ICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogVGhlIHJvb3Qgc2RrLXJlcG9zaXRvcnkgZWxlbWVudCAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1NES19SRVBPU0lUT1JZID0gInNkay1yZXBvc2l0b3J5IjsgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogQSBwbGF0Zm9ybSBwYWNrYWdlLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BMQVRGT1JNID0gInBsYXRmb3JtIjsgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogQW4gYWRkLW9uIHBhY2thZ2UuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQUREX09OICAgPSAiYWRkLW9uIjsgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBIHRvb2wgcGFja2FnZS4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9UT09MICAgICA9ICJ0b29sIjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqIEEgZG9jIHBhY2thZ2UuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfRE9DICAgICAgPSAiZG9jIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBbiBleHRyYSBwYWNrYWdlLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0VYVFJBICAgID0gImV4dHJhIjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogVGhlIGxpY2Vuc2UgZGVmaW5pdGlvbi4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9MSUNFTlNFICAgICAgID0gImxpY2Vuc2UiOyAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqIFRoZSBvcHRpb25hbCB1c2VzLWxpY2Vuc2UgZm9yIGFsbCBwYWNrYWdlcyAocGxhdGZvcm0sIGFkZC1vbiwgdG9vbCwgZG9jKSBvciBmb3IgYSBsaWIuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfVVNFU19MSUNFTlNFICA9ICJ1c2VzLWxpY2Vuc2UiOyAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBUaGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGZvciBhbGwgcGFja2FnZXMgKHBsYXRmb3JtLCBhZGQtb24sIHRvb2wsIGRvYykuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUkVWSVNJT04gICAgICA9ICJyZXZpc2lvbiI7ICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIGFsbCBwYWNrYWdlcyAocGxhdGZvcm0sIGFkZC1vbiwgdG9vbCwgZG9jKSBvciBmb3IgYSBsaWIuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfREVTQ1JJUFRJT04gICA9ICJkZXNjcmlwdGlvbiI7ICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gVVJMIGZvciBhbGwgcGFja2FnZXMgKHBsYXRmb3JtLCBhZGQtb24sIHRvb2wsIGRvYykuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfREVTQ19VUkwgICAgICA9ICJkZXNjLXVybCI7ICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIGZvciBhbGwgcGFja2FnZXMgKHBsYXRmb3JtLCBhZGQtb24sIHRvb2wsIGRvYykuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUkVMRUFTRV9OT1RFICA9ICJyZWxlYXNlLW5vdGUiOyAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIFVSTCBmb3IgYWxsIHBhY2thZ2VzIChwbGF0Zm9ybSwgYWRkLW9uLCB0b29sLCBkb2MpLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1JFTEVBU0VfVVJMICAgPSAicmVsZWFzZS11cmwiOyAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogVGhlIG9wdGlvbmFsIG1pbmltYWwgdG9vbHMgcmV2aXNpb24gcmVxdWlyZWQgYnkgcGxhdGZvcm0gJiBleHRyYSBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9NSU5fVE9PTFNfUkVWID0gIm1pbi10b29scy1yZXYiOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqIFRoZSB2ZXJzaW9uLCBhIHN0cmluZywgZm9yIHBsYXRmb3JtIHBhY2thZ2VzLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1ZFUlNJT04gICA9ICJ2ZXJzaW9uIjsgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogVGhlIGFwaS1sZXZlbCwgYW4gaW50ID4gMCwgZm9yIHBsYXRmb3JtLCBhZGQtb24gYW5kIGRvYyBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9BUElfTEVWRUwgPSAiYXBpLWxldmVsIjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqIFRoZSBjb2RlbmFtZSwgYSBzdHJpbmcsIGZvciBwbGF0Zm9ybSBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9DT0RFTkFNRSA9ICJjb2RlbmFtZSI7ICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqIFRoZSB2ZW5kb3IsIGEgc3RyaW5nLCBmb3IgYWRkLW9uIHBhY2thZ2VzLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1ZFTkRPUiAgICA9ICJ2ZW5kb3IiOyAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogVGhlIG5hbWUsIGEgc3RyaW5nLCBmb3IgYWRkLW9uIHBhY2thZ2VzIG9yIGZvciBsaWJyYXJpZXMuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfTkFNRSAgICAgID0gIm5hbWUiOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKiBUaGUgbGlicyBjb250YWluZXIsIG9wdGlvbmFsIGZvciBhbiBhZGQtb24uICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfTElCUyAgICAgID0gImxpYnMiOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBIGxpYiBlbGVtZW50IGluIGEgbGlicyBjb250YWluZXIuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfTElCICAgICAgID0gImxpYiI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKiBUaGUgcGF0aCwgYSBzdHJpbmcsIGZvciBleHRyYSBwYWNrYWdlcy4gKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9QQVRIID0gInBhdGgiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqIFRoZSBhcmNoaXZlcyBjb250YWluZXIsIGZvciBhbGwgcGFja2FnZXMuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQVJDSElWRVMgPSAiYXJjaGl2ZXMiOyAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBbiBhcmNoaXZlIGVsZW1lbnQsIGZvciB0aGUgYXJjaGl2ZXMgY29udGFpbmVyLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0FSQ0hJVkUgID0gImFyY2hpdmUiOyAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogQW4gYXJjaGl2ZSBzaXplLCBhbiBpbnQgPiAwLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1NJWkUgICAgID0gInNpemUiOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogQSBzaGExIGFyY2hpdmUgY2hlY2tzdW0sIGFzIGEgNDAtY2hhciBoZXguICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ0hFQ0tTVU0gPSAiY2hlY2tzdW0iOyAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBIGRvd25sb2FkIGFyY2hpdmUgVVJMLCBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgeG1sLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1VSTCAgICAgID0gInVybCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogQW4gYXJjaGl2ZSBjaGVja3N1bSB0eXBlLCBtYW5kYXRvcnkuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBbiBhcmNoaXZlIE9TIGF0dHJpYnV0ZSwgbWFuZGF0b3J5LiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09TICAgPSAib3MiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKiogQW4gb3B0aW9uYWwgYXJjaGl2ZSBBcmNoaXRlY3R1cmUgYXR0cmlidXRlLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSQ0ggPSAiYXJjaCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAvKiogQSBsaWNlbnNlIGRlZmluaXRpb24gSUQuICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKiBBIGxpY2Vuc2UgcmVmZXJlbmNlLiAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFRiA9ICJyZWYiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldFhzZFN0cmVhbSgpIHsNCi0gICAgICAgIHJldHVybiBTZGtSZXBvc2l0b3J5LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInNkay1yZXBvc2l0b3J5LnhzZCIpOyAgIC8vJE5PTi1OTFMtMSQNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9zZGstcmVwb3NpdG9yeS54c2QgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9zZGstcmVwb3NpdG9yeS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwMGUzMzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL3JlcG9zaXRvcnkvc2RrLXJlcG9zaXRvcnkueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzZDpzY2hlbWEKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG9zaXRvcnkvMSIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwb3NpdG9yeS8xIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICB2ZXJzaW9uPSIxIj4KLQotICAgIDwhLS0gVGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGRvd25sb2FkYWJsZSBpdGVtcyBrbm93biBhcwotICAgICAgICAgInBhY2thZ2VzIi4gRWFjaCBwYWNrYWdlIGhhcyBhIHR5cGUgYW5kIHZhcmlvdXMgYXR0cmlidXRlcyBhbmQgY29udGFpbnMKLSAgICAgICAgIGEgbGlzdCBvZiBmaWxlICJhcmNoaXZlcyIgdGhhdCBjYW4gYmUgZG93bmxvYWRlZCBmb3Igc3BlY2lmaWMgT1Nlcy4KLQotICAgICAgICAgQW4gQW5kcm9pZCBTREsgcmVwb3NpdG9yeSBpcyBhIHdlYiBzaXRlIHRoYXQgY29udGFpbnMgYSAicmVwb3NpdG9yeS54bWwiCi0gICAgICAgICBmaWxlIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBYTUwgU2NoZW1hLgotICAgIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9InNkay1yZXBvc2l0b3J5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGNvbGxlY3Rpb25zIG9mIGRvd25sb2FkYWJsZSBwYWNrYWdlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0gICAgICAgICAgICAgICAgPCEtLSBUaGUgZGVmaW5pdGlvbiBvZiBhbiBTREsgcGxhdGZvcm0gcGFja2FnZS4gLS0+Ci0KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0iPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gU0RLIHBsYXRmb3JtIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIEFuZHJvaWQgcGxhdGZvcm0gdmVyc2lvbi4gSXQgaXMgc3RyaW5nIHN1Y2ggYXMgIjEuMCIuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiAgIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIEFuZHJvaWQgQVBJIExldmVsIGZvciB0aGUgcGxhdGZvcm0uIEFuIGludCA+IDAuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcGktbGV2ZWwiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGNvZGVuYW1lIGZvciB0aGlzIHBsYXRmb3JtLCBpZiBpdCdzIGEgcHJldmlldy4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvZGVuYW1lIiAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBpcyBnZW5lcmF0ZWQuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXZpc2lvbiIgICAgIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgbGljZW5zZSBvZiB0aGlzIHBhY2thZ2UuIElmIHByZXNlbnQsIHVzZXJzIHdpbGwgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWdyZWUgdG8gaXQgYmVmb3JlIGRvd25sb2FkaW5nLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1saWNlbnNlIiB0eXBlPSJzZGs6bGljZW5zZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIFVSTCBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2MtdXJsIiAgICAgdHlwZT0ieHNkOnRva2VuIiAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIGZvciB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLW5vdGUiIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIHJlbGVhc2Ugbm90ZSBVUkwgb2YgdGhpcyBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLXVybCIgIHR5cGU9InhzZDp0b2tlbiIgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQSBsaXN0IG9mIGZpbGUgYXJjaGl2ZXMgZm9yIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyY2hpdmVzIiAgICAgdHlwZT0ic2RrOmFyY2hpdmVzVHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBtaW5pbWFsIHJldmlzaW9uIG9mIHRvb2xzIHJlcXVpcmVkIGJ5IHRoaXMgcGFja2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBJZiBwcmVzZW50LCBtdXN0IGJlIGFuIGludCA+IDAuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tdG9vbHMtcmV2IiB0eXBlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLQotICAgICAgICAgICAgICAgIDwhLS0gVGhlIGRlZmluaXRpb24gb2YgYW4gU0RLIEFkZC1vbiBwYWNrYWdlLiAtLT4KLQotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGQtb24iPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gU0RLIGFkZC1vbiBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBhZGQtb24uIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiAgICAgIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHZlbmRvciBvZiB0aGUgYWRkLW9uLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yIiAgICB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBBbmRyb2lkIEFQSSBMZXZlbCBmb3IgdGhlIGFkZC1vbi4gQW4gaW50ID4gMC4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwaS1sZXZlbCIgdHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgY29kZW5hbWUgZm9yIHRoaXMgYWRkLW9uLCBpZiBpdCdzIGEgcHJldmlldy4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvZGVuYW1lIiAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBpcyBnZW5lcmF0ZWQuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXZpc2lvbiIgICAgIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgbGljZW5zZSBvZiB0aGlzIHBhY2thZ2UuIElmIHByZXNlbnQsIHVzZXJzIHdpbGwgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWdyZWUgdG8gaXQgYmVmb3JlIGRvd25sb2FkaW5nLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1saWNlbnNlIiB0eXBlPSJzZGs6bGljZW5zZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIFVSTCBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2MtdXJsIiAgICAgdHlwZT0ieHNkOnRva2VuIiAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIGZvciB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLW5vdGUiIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIHJlbGVhc2Ugbm90ZSBVUkwgb2YgdGhpcyBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLXVybCIgIHR5cGU9InhzZDp0b2tlbiIgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQSBsaXN0IG9mIGZpbGUgYXJjaGl2ZXMgZm9yIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyY2hpdmVzIiAgICAgdHlwZT0ic2RrOmFyY2hpdmVzVHlwZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQW4gYWRkLW9uIGNhbiBkZWNsYXJlIDAgb3IgbW9yZSBsaWJyYXJpZXMuIC0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpYnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGliIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIGFkZC1vbiBsaWJyYXJ5LiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0KLSAgICAgICAgICAgICAgICA8IS0tIFRoZSBkZWZpbml0aW9uIG9mIGFuIFNESyB0b29sIHBhY2thZ2UuIC0tPgotCi0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvb2wiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gU0RLIHRvb2wgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBpcyBnZW5lcmF0ZWQuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXZpc2lvbiIgICAgIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgbGljZW5zZSBvZiB0aGlzIHBhY2thZ2UuIElmIHByZXNlbnQsIHVzZXJzIHdpbGwgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWdyZWUgdG8gaXQgYmVmb3JlIGRvd25sb2FkaW5nLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1saWNlbnNlIiB0eXBlPSJzZGs6bGljZW5zZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIFVSTCBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2MtdXJsIiAgICAgdHlwZT0ieHNkOnRva2VuIiAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIGZvciB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLW5vdGUiIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIHJlbGVhc2Ugbm90ZSBVUkwgb2YgdGhpcyBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLXVybCIgIHR5cGU9InhzZDp0b2tlbiIgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQSBsaXN0IG9mIGZpbGUgYXJjaGl2ZXMgZm9yIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyY2hpdmVzIiAgICAgdHlwZT0ic2RrOmFyY2hpdmVzVHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotCi0gICAgICAgICAgICAgICAgPCEtLSBUaGUgZGVmaW5pdGlvbiBvZiBhbiBTREsgZG9jIHBhY2thZ2UuIC0tPgotCi0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRvYyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBTREsgZG9jIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIEFuZHJvaWQgQVBJIExldmVsIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gaW50ID4gMC4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwaS1sZXZlbCIgdHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgY29kZW5hbWUgZm9yIHRoaXMgZG9jLCBpZiBpdCdzIGEgcHJldmlldy4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvZGVuYW1lIiAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgcmV2aXNpb24sIGFuIGludCA+IDAsIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBpcyBnZW5lcmF0ZWQuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXZpc2lvbiIgICAgIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgbGljZW5zZSBvZiB0aGlzIHBhY2thZ2UuIElmIHByZXNlbnQsIHVzZXJzIHdpbGwgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWdyZWUgdG8gaXQgYmVmb3JlIGRvd25sb2FkaW5nLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1saWNlbnNlIiB0eXBlPSJzZGs6bGljZW5zZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIFVSTCBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2MtdXJsIiAgICAgdHlwZT0ieHNkOnRva2VuIiAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIGZvciB0aGlzIHBhY2thZ2UuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLW5vdGUiIHR5cGU9InhzZDpzdHJpbmciICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIHJlbGVhc2Ugbm90ZSBVUkwgb2YgdGhpcyBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxlYXNlLXVybCIgIHR5cGU9InhzZDp0b2tlbiIgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQSBsaXN0IG9mIGZpbGUgYXJjaGl2ZXMgZm9yIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyY2hpdmVzIiAgICAgdHlwZT0ic2RrOmFyY2hpdmVzVHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotCi0gICAgICAgICAgICAgICAgPCEtLSBUaGUgZGVmaW5pdGlvbiBvZiBhbiBTREsgZXh0cmEgcGFja2FnZS4gVGhpcyBraW5kIG9mIHBhY2thZ2UgaXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAiZnJlZSIgY29udGVudCBhbmQgc3BlY2lmaWVzIGluIHdoaWNoIGZpeGVkIHJvb3QgZGlyZWN0b3J5IGl0IG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZC4KLSAgICAgICAgICAgICAgICAtLT4KLQotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRyYSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBTREsgZXh0cmEgcGFja2FnZS4gVGhpcyBraW5kIG9mIHBhY2thZ2UgaXMgZm9yICJmcmVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgYW5kIHNwZWNpZmllcyBpbiB3aGljaCBmaXhlZCByb290IGRpcmVjdG9yeSBpdCBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwYXRocyAiYWRkLW9ucyIsICJwbGF0Zm9ybXMiLCAidG9vbHMiIGFuZCAiZG9jcyIgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIGluc3RhbGwgZm9sZGVyIG5hbWUuIEl0IG11c3QgYmUgYSBzaW5nbGUtc2VnbWVudCBwYXRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBhdGhzICJhZGQtb25zIiwgInBsYXRmb3JtcyIsICJ0b29scyIgYW5kICJkb2NzIiBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGF0aCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteL1xcXSsiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSByZXZpc2lvbiwgYW4gaW50ID4gMCwgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIGlzIGdlbmVyYXRlZC4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldmlzaW9uIiAgICAgdHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCBsaWNlbnNlIG9mIHRoaXMgcGFja2FnZS4gSWYgcHJlc2VudCwgdXNlcnMgd2lsbCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZ3JlZSB0byBpdCBiZWZvcmUgZG93bmxvYWRpbmcuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLWxpY2Vuc2UiIHR5cGU9InNkazpsaWNlbnNlVHlwZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiAgdHlwZT0ieHNkOnN0cmluZyIgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gVVJMIG9mIHRoaXMgcGFja2FnZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzYy11cmwiICAgICB0eXBlPSJ4c2Q6dG9rZW4iICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBvcHRpb25hbCByZWxlYXNlIG5vdGUgZm9yIHRoaXMgcGFja2FnZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGVhc2Utbm90ZSIgdHlwZT0ieHNkOnN0cmluZyIgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgb3B0aW9uYWwgcmVsZWFzZSBub3RlIFVSTCBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGVhc2UtdXJsIiAgdHlwZT0ieHNkOnRva2VuIiAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBIGxpc3Qgb2YgZmlsZSBhcmNoaXZlcyBmb3IgdGhpcyBwYWNrYWdlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJjaGl2ZXMiICAgICB0eXBlPSJzZGs6YXJjaGl2ZXNUeXBlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIG1pbmltYWwgcmV2aXNpb24gb2YgdG9vbHMgcmVxdWlyZWQgYnkgdGhpcyBwYWNrYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIElmIHByZXNlbnQsIG11c3QgYmUgYW4gaW50ID4gMC4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi10b29scy1yZXYiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotCi0KLSAgICAgICAgICAgICAgICA8IS0tIFRoZSBkZWZpbml0aW9uIG9mIGEgbGljZW5zZSB0byBiZSByZWZlcmVuY2VkIGJ5IHRoZSB1c2VzLWxpY2Vuc2UgZWxlbWVudC4gLS0+Ci0KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGljZW5zZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGxpY2Vuc2UgZGVmaW5pdGlvbi4gU3VjaCBhIGxpY2Vuc2UgbXVzdCBiZSB1c2VkIGxhdGVyIGFzIGEgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgYSB1c2VzLWxpY2Vuc2UgZWxlbWVudCBpbiBvbmUgb2YgdGhlIHBhY2thZ2UgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgICB0eXBlPSJ4c2Q6SUQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDp0b2tlbiIgZml4ZWQ9InRleHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotCi0gICAgPCEtLSBUeXBlIGRlc2NyaWJpbmcgdGhlIGxpY2Vuc2UgdXNlZCBieSBhIHBhY2thZ2UuCi0gICAgICAgICBUaGUgbGljZW5zZSBNVVNUIGJlIGRlZmluZWQgdXNpbmcgYSBsaWNlbnNlIG5vZGUgYW5kIHJlZmVyZW5jZWQKLSAgICAgICAgIHVzaW5nIHRoZSByZWYgYXR0cmlidXRlIG9mIHRoZSBsaWNlbnNlIGVsZW1lbnQgaW5zaWRlIGEgcGFja2FnZS4KLSAgICAgLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpY2Vuc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlc2NyaWJlcyB0aGUgbGljZW5zZSB1c2VkIGJ5IGEgcGFja2FnZS4gVGhlIGxpY2Vuc2UgTVVTVCBiZSBkZWZpbmVkCi0gICAgICAgICAgICAgICAgdXNpbmcgYSBsaWNlbnNlIG5vZGUgYW5kIHJlZmVyZW5jZWQgdXNpbmcgdGhlIHJlZiBhdHRyaWJ1dGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgbGljZW5zZSBlbGVtZW50IGluc2lkZSBhIHBhY2thZ2UuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzZDpJRFJFRiIgLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSBBIGNvbGxlY3Rpb24gb2YgZmlsZXMgdGhhdCBjYW4gYmUgZG93bmxvYWRlZCBmb3IgYSBnaXZlbiBhcmNoaXRlY3R1cmUuCi0gICAgICAgICBUaGUgPGFyY2hpdmVzPiBub2RlIGlzIG1hbmRhdG9yeSBpbiB0aGUgcmVwb3NpdG9yeSBlbGVtZW50cyBhbmQgdGhlCi0gICAgICAgICBjb2xsZWN0aW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgPGFyY2hpdmU+IGRlY2xhcmVkLgotICAgICAgICAgRWFjaCBhcmNoaXZlIGlzIGEgemlwIGZpbGUgdGhhdCB3aWxsIGJlIHVuemlwcGVkIGluIGEgbG9jYXRpb24gdGhhdCBkZXBlbmRzCi0gICAgICAgICBvbiBpdHMgcGFja2FnZSB0eXBlLgotICAgICAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJjaGl2ZXNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiBmaWxlcyB0aGF0IGNhbiBiZSBkb3dubG9hZGVkIGZvciBhIGdpdmVuIGFyY2hpdGVjdHVyZS4KLSAgICAgICAgICAgICAgICBUaGUgJmx0O2FyY2hpdmVzJmd0OyBub2RlIGlzIG1hbmRhdG9yeSBpbiB0aGUgcmVwb3NpdG9yeSBwYWNrYWdlcyBhbmQgdGhlCi0gICAgICAgICAgICAgICAgY29sbGVjdGlvbiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lICZsdDthcmNoaXZlJmd0OyBkZWNsYXJlZC4KLSAgICAgICAgICAgICAgICBFYWNoIGFyY2hpdmUgaXMgYSB6aXAgZmlsZSB0aGF0IHdpbGwgYmUgdW56aXBwZWQgaW4gYSBsb2NhdGlvbiB0aGF0IGRlcGVuZHMKLSAgICAgICAgICAgICAgICBvbiBpdHMgcGFja2FnZSB0eXBlLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDwhLS0gT25lIGFyY2hpdmUgZmlsZSAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcmNoaXZlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFByb3BlcnRpZXMgb2YgdGhlIGFyY2hpdmUgZmlsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhcmNoaXZlIHRvIGRvd25sb2FkLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaXplIiAgICAgdHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIGNoZWNrc3VtIG9mIHRoZSBhcmNoaXZlIGZpbGUuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoZWNrc3VtIiB0eXBlPSJzZGs6Y2hlY2tzdW1UeXBlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgVVJMIGlzIGFuIGFic29sdXRlIFVSTCBpZiBpdCBzdGFydHMgd2l0aCBodHRwOi8vLCBodHRwczovLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmdHA6Ly8uIE90aGVyd2lzZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoaXMgcmVwb3NpdG9yeS54bWwgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiAgICAgIHR5cGU9InhzZDp0b2tlbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YWxsPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGlkZW50aWZ5IHRoZSBPUyBhbmQgYXJjaGl0ZWN0dXJlIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbnkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxpbnV4IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYWNvc3giIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndpbmRvd3MiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyY2giIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW55IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcGMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ing4NiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieDg2XzY0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gVGhlIGRlZmluaXRpb24gb2YgYSBmaWxlIGNoZWNrc3VtIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNoYTFOdW1iZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBTSEExIGNoZWNrc3VtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihbMC05YS1mQS1GXSl7NDB9Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoZWNrc3VtVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGZpbGUgY2hlY2tzdW0sIGN1cnJlbnRseSBvbmx5IFNIQTEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2RrOnNoYTFOdW1iZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDp0b2tlbiIgZml4ZWQ9InNoYTEiIC8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL3htbC9BbmRyb2lkTWFuaWZlc3QuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka2xpYi94bWwvQW5kcm9pZE1hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmE4YmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL3htbC9BbmRyb2lkTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi54bWw7Ci0KLS8qKgotICogSGVscGVyIGFuZCBDb25zdGFudHMgZm9yIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5kcm9pZE1hbmlmZXN0IHsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfTUFOSUZFU1QgPSAibWFuaWZlc3QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9ERV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0FDVElWSVRZID0gImFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfU0VSVklDRSA9ICJzZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfUkVDRUlWRVIgPSAicmVjZWl2ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9ERV9QUk9WSURFUiA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0lOVEVOVCA9ICJpbnRlbnQtZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfQUNUSU9OID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT0RFX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfVVNFU19TREsgPSAidXNlcy1zZGsiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9ERV9JTlNUUlVNRU5UQVRJT04gPSAiaW5zdHJ1bWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfVVNFU19MSUJSQVJZID0gInVzZXMtbGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9QQUNLQUdFID0gInBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSSUJVVEVfUFJPQ0VTUyA9ICJwcm9jZXNzIjsgLy8kTk9OLU5MUy0kCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX0RFQlVHR0FCTEUgPSAiZGVidWdnYWJsZSI7IC8vJE5PTi1OTFMtJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9NSU5fU0RLX1ZFUlNJT04gPSAibWluU2RrVmVyc2lvbiI7IC8vJE5PTi1OTFMtJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9UQVJHRVRfUEFDS0FHRSA9ICJ0YXJnZXRQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9FWFBPUlRFRCA9ICJleHBvcnRlZCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgLyoqCi0gICAgICogQ29tYmluZXMgYSBqYXZhIHBhY2thZ2UsIHdpdGggYSBjbGFzcyB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdCB0byBtYWtlIGEgZnVsbHkgcXVhbGlmaWVkCi0gICAgICogY2xhc3MgbmFtZQotICAgICAqIEBwYXJhbSBqYXZhUGFja2FnZSB0aGUgamF2YSBwYWNrYWdlIGZyb20gdGhlIG1hbmlmZXN0LgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgZnJvbSB0aGUgbWFuaWZlc3QuCi0gICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluZVBhY2thZ2VBbmRDbGFzc05hbWUoU3RyaW5nIGphdmFQYWNrYWdlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGphdmFQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhUGFja2FnZSA9PSBudWxsIHx8IGphdmFQYWNrYWdlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgY2xhc3MgbmFtZSBjYW4gYmUgYSBzdWJwYWNrYWdlIChzdGFydHMgd2l0aCBhICcuJwotICAgICAgICAvLyBjaGFyKSwgYSBzaW1wbGUgY2xhc3MgbmFtZSAobm8gZG90KSwgb3IgYSBmdWxsIGphdmEgcGFja2FnZQotICAgICAgICBib29sZWFuIHN0YXJ0V2l0aERvdCA9IChjbGFzc05hbWUuY2hhckF0KDApID09ICcuJyk7Ci0gICAgICAgIGJvb2xlYW4gaGFzRG90ID0gKGNsYXNzTmFtZS5pbmRleE9mKCcuJykgIT0gLTEpOwotICAgICAgICBpZiAoc3RhcnRXaXRoRG90IHx8IGhhc0RvdCA9PSBmYWxzZSkgewotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIGlmIChzdGFydFdpdGhEb3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YVBhY2thZ2UgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhUGFja2FnZSArICcuJyArIGNsYXNzTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGp1c3QgYWRkIHRoZSBjbGFzcyBhcyBpdCBzaG91bGQgYmUgYSBmdWxseSBxdWFsaWZpZWQgamF2YSBuYW1lLgotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL3htbC9BbmRyb2lkWFBhdGhGYWN0b3J5LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIveG1sL0FuZHJvaWRYUGF0aEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxY2Q4MS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3NyYy9jb20vYW5kcm9pZC9zZGtsaWIveG1sL0FuZHJvaWRYUGF0aEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIueG1sOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7Ci0KLS8qKgotICogWFBhdGggZmFjdG9yeSB3aXRoIGF1dG9tYXRpYyBzdXBwb3J0IGZvciB0aGUgYW5kcm9pZCBuYW1lIHNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZFhQYXRoRmFjdG9yeSB7Ci0gICAgLyoqIERlZmF1bHQgcHJlZml4IGZvciBhbmRyb2lkIG5hbWUgc3BhY2U6ICdhbmRyb2lkJyAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTlNfUFJFRklYID0gImFuZHJvaWQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYUGF0aEZhY3Rvcnkgc0ZhY3RvcnkgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8qKiBOYW1lIHNwYWNlIGNvbnRleHQgZm9yIEFuZHJvaWQgcmVzb3VyY2UgWE1MIGZpbGVzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFuZHJvaWROYW1lc3BhY2VDb250ZXh0IGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEFuZHJvaWROYW1lc3BhY2VDb250ZXh0IHNUaGlzID0gbmV3IEFuZHJvaWROYW1lc3BhY2VDb250ZXh0KAotICAgICAgICAgICAgICAgIERFRkFVTFRfTlNfUFJFRklYKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQW5kcm9pZFByZWZpeDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUFuZHJvaWRQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAbGluayBBbmRyb2lkTmFtZXNwYWNlQ29udGV4dH0uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBBbmRyb2lkTmFtZXNwYWNlQ29udGV4dCBnZXREZWZhdWx0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNUaGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdCB0aGUgY29udGV4dCB3aXRoIHRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSBhbmRyb2lkIG5hbWVzcGFjZS4KLSAgICAgICAgICogQHBhcmFtIGFuZHJvaWRQcmVmaXggdGhlIFByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEFuZHJvaWROYW1lc3BhY2VDb250ZXh0KFN0cmluZyBhbmRyb2lkUHJlZml4KSB7Ci0gICAgICAgICAgICBtQW5kcm9pZFByZWZpeCA9IGFuZHJvaWRQcmVmaXg7Ci0gICAgICAgICAgICBtQW5kcm9pZFByZWZpeGVzLmFkZChtQW5kcm9pZFByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyhtQW5kcm9pZFByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gWE1MQ29uc3RhbnRzLk5VTExfTlNfVVJJOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICAgICAgaWYgKFNka0NvbnN0YW50cy5OU19SRVNPVVJDRVMuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFuZHJvaWRQcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yPD8+IGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIGlmIChTZGtDb25zdGFudHMuTlNfUkVTT1VSQ0VTLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BbmRyb2lkUHJlZml4ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFhQYXRoIG9iamVjdCwgc3BlY2lmeWluZyB3aGljaCBwcmVmaXggaW4gdGhlIHF1ZXJ5IGlzIHVzZWQgZm9yIHRoZQotICAgICAqIGFuZHJvaWQgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSBhbmRyb2lkUHJlZml4IFRoZSBuYW1lc3BhY2UgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggbmV3WFBhdGgoU3RyaW5nIGFuZHJvaWRQcmVmaXgpIHsKLSAgICAgICAgWFBhdGggeHBhdGggPSBzRmFjdG9yeS5uZXdYUGF0aCgpOwotICAgICAgICB4cGF0aC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBBbmRyb2lkTmFtZXNwYWNlQ29udGV4dChhbmRyb2lkUHJlZml4KSk7Ci0gICAgICAgIHJldHVybiB4cGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFhQYXRoIG9iamVjdCB1c2luZyB0aGUgZGVmYXVsdCBwcmVmaXggZm9yIHRoZSBhbmRyb2lkIG5hbWVzcGFjZS4KLSAgICAgKiBAc2VlICNERUZBVUxUX05TX1BSRUZJWAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggbmV3WFBhdGgoKSB7Ci0gICAgICAgIFhQYXRoIHhwYXRoID0gc0ZhY3RvcnkubmV3WFBhdGgoKTsKLSAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChBbmRyb2lkTmFtZXNwYWNlQ29udGV4dC5nZXREZWZhdWx0KCkpOwotICAgICAgICByZXR1cm4geHBhdGg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Nb2NrQWRkb25QYWNrYWdlLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L01vY2tBZGRvblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ0MTk5Zi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L01vY2tBZGRvblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEEgbW9jayB7QGxpbmsgQWRkb25QYWNrYWdlfSBmb3IgdGVzdGluZy4NCi0gKg0KLSAqIEJ5IGRlc2lnbiwgdGhpcyBwYWNrYWdlIGNvbnRhaW5zIG9uZSBhbmQgb25seSBvbmUgYXJjaGl2ZS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja0FkZG9uUGFja2FnZSBleHRlbmRzIEFkZG9uUGFja2FnZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1vY2tBZGRvblRhcmdldH0gd2l0aCB0aGUgcmVxdWVzdGVkIGJhc2UgcGxhdGZvcm0gYW5kIGFkZG9uIHJldmlzaW9uDQotICAgICAqIGFuZCB0aGVuIGEge0BsaW5rIE1vY2tBZGRvblBhY2thZ2V9IHdyYXBwaW5nIGl0Lg0KLSAgICAgKg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgcGFja2FnZSBjb250YWlucyBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgTW9ja0FkZG9uUGFja2FnZShNb2NrUGxhdGZvcm1QYWNrYWdlIGJhc2VQbGF0Zm9ybSwgaW50IHJldmlzaW9uKSB7DQotICAgICAgICBzdXBlcihuZXcgTW9ja0FkZG9uVGFyZ2V0KGJhc2VQbGF0Zm9ybS5nZXRUYXJnZXQoKSwgcmV2aXNpb24pLCBudWxsIC8qcHJvcHMqLyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEEgbW9jayBBZGRvblRhcmdldC4NCi0gICAgICogVGhpcyByZWltcGxlbWVudHMgdGhlIG1pbmltdW0gbmVlZGVkIGZyb20gdGhlIGludGVyZmFjZSBmb3Igb3VyIGxpbWl0ZWQgdGVzdGluZyBuZWVkcy4NCi0gICAgICovDQotICAgIHN0YXRpYyBjbGFzcyBNb2NrQWRkb25UYXJnZXQgaW1wbGVtZW50cyBJQW5kcm9pZFRhcmdldCB7DQotDQotICAgICAgICBwcml2YXRlIGZpbmFsIElBbmRyb2lkVGFyZ2V0IG1QYXJlbnRUYXJnZXQ7DQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUmV2aXNpb247DQotDQotICAgICAgICBwdWJsaWMgTW9ja0FkZG9uVGFyZ2V0KElBbmRyb2lkVGFyZ2V0IHBhcmVudFRhcmdldCwgaW50IHJldmlzaW9uKSB7DQotICAgICAgICAgICAgbVBhcmVudFRhcmdldCA9IHBhcmVudFRhcmdldDsNCi0gICAgICAgICAgICBtUmV2aXNpb24gPSByZXZpc2lvbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoTmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNraW4oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiAibW9jayBhZGRvbiB0YXJnZXQiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gIm1vY2sgYWRkb24gdGFyZ2V0IjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiAibW9jayBhZGRvbiB0YXJnZXQiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIElPcHRpb25hbExpYnJhcnlbXSBnZXRPcHRpb25hbExpYnJhcmllcygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBJQW5kcm9pZFRhcmdldCBnZXRQYXJlbnQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1QYXJlbnRUYXJnZXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoaW50IHBhdGhJZCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFBsYXRmb3JtTGlicmFyaWVzKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXRSZXZpc2lvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVJldmlzaW9uOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFNraW5zKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXRVc2JWZW5kb3JJZCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIEFuZHJvaWRWZXJzaW9uIGdldFZlcnNpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1QYXJlbnRUYXJnZXQuZ2V0VmVyc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgibW9jay1hZGRvbi0lMSRkIiwgZ2V0VmVyc2lvbigpLmdldEFwaUxldmVsKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBoYXNoU3RyaW5nKCkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRWZXJzaW9uTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgZmFsc2UgZm9yIGFuIGFkZG9uLiAqLw0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQbGF0Zm9ybSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVCYXNlRm9yKElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW1wbGVtZW50IHRoaXMgYXMgbmVlZGVkIGZvciB0ZXN0cyIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oSUFuZHJvaWRUYXJnZXQgbykgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW1wbGVtZW50IHRoaXMgYXMgbmVlZGVkIGZvciB0ZXN0cyIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTW9ja1BsYXRmb3JtUGFja2FnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Nb2NrUGxhdGZvcm1QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NDBiODIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Nb2NrUGxhdGZvcm1QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotLyoqDQotICogQSBtb2NrIHtAbGluayBQbGF0Zm9ybVBhY2thZ2V9IGZvciB0ZXN0aW5nLg0KLSAqDQotICogQnkgZGVzaWduLCB0aGlzIHBhY2thZ2UgY29udGFpbnMgb25lIGFuZCBvbmx5IG9uZSBhcmNoaXZlLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrUGxhdGZvcm1QYWNrYWdlIGV4dGVuZHMgUGxhdGZvcm1QYWNrYWdlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBJQW5kcm9pZFRhcmdldCBtVGFyZ2V0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBNb2NrUGxhdGZvcm1UYXJnZXR9IHdpdGggdGhlIHJlcXVlc3RlZCBBUEkgYW5kIHJldmlzaW9uDQotICAgICAqIGFuZCB0aGVuIGEge0BsaW5rIE1vY2tQbGF0Zm9ybVBhY2thZ2V9IHdyYXBwaW5nIGl0Lg0KLSAgICAgKg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgcGFja2FnZSBjb250YWlucyBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgTW9ja1BsYXRmb3JtUGFja2FnZShpbnQgYXBpTGV2ZWwsIGludCByZXZpc2lvbikgew0KLSAgICAgICAgdGhpcyhuZXcgTW9ja1BsYXRmb3JtVGFyZ2V0KGFwaUxldmVsLCByZXZpc2lvbiksIG51bGwgLypwcm9wcyovKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBNb2NrUGxhdGZvcm1UYXJnZXR9IHdpdGggdGhlIHJlcXVlc3RlZCBBUEkgYW5kIHJldmlzaW9uDQotICAgICAqIGFuZCB0aGVuIGEge0BsaW5rIE1vY2tQbGF0Zm9ybVBhY2thZ2V9IHdyYXBwaW5nIGl0Lg0KLSAgICAgKg0KLSAgICAgKiBBbHNvIHNldHMgdGhlIG1pbi10b29scy1yZXYgb2YgdGhlIHBsYXRmb3JtLg0KLSAgICAgKg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgcGFja2FnZSBjb250YWlucyBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgTW9ja1BsYXRmb3JtUGFja2FnZShpbnQgYXBpTGV2ZWwsIGludCByZXZpc2lvbiwgaW50IG1pbl90b29sc19yZXYpIHsNCi0gICAgICAgIHRoaXMobmV3IE1vY2tQbGF0Zm9ybVRhcmdldChhcGlMZXZlbCwgcmV2aXNpb24pLCBjcmVhdGVQcm9wcyhtaW5fdG9vbHNfcmV2KSk7DQotICAgIH0NCi0NCi0gICAgLyoqIEEgbGl0dGxlIHRyaWNrIHRvIGJlIGFibGUgdG8gY2FwdHVyZSB0aGUgdGFyZ2V0IG5ldyBhZnRlciBwYXNzaW5nIGl0IHRvIHRoZSBzdXBlci4gKi8NCi0gICAgcHJpdmF0ZSBNb2NrUGxhdGZvcm1QYWNrYWdlKElBbmRyb2lkVGFyZ2V0IHRhcmdldCwgUHJvcGVydGllcyBwcm9wcykgew0KLSAgICAgICAgc3VwZXIodGFyZ2V0LCBwcm9wcyk7DQotICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgY3JlYXRlUHJvcHMoaW50IG1pbl90b29sc19yZXYpIHsNCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOw0KLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoUGxhdGZvcm1QYWNrYWdlLlBST1BfTUlOX1RPT0xTX1JFViwgSW50ZWdlci50b1N0cmluZygobWluX3Rvb2xzX3JldikpKTsNCi0gICAgICAgIHJldHVybiBwcm9wczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0VGFyZ2V0KCkgew0KLSAgICAgICAgcmV0dXJuIG1UYXJnZXQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEEgbW9jayBQbGF0Zm9ybVRhcmdldC4NCi0gICAgICogVGhpcyByZWltcGxlbWVudHMgdGhlIG1pbmltdW0gbmVlZGVkIGZyb20gdGhlIGludGVyZmFjZSBmb3Igb3VyIGxpbWl0ZWQgdGVzdGluZyBuZWVkcy4NCi0gICAgICovDQotICAgIHN0YXRpYyBjbGFzcyBNb2NrUGxhdGZvcm1UYXJnZXQgaW1wbGVtZW50cyBJQW5kcm9pZFRhcmdldCB7DQotDQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQXBpTGV2ZWw7DQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUmV2aXNpb247DQotDQotICAgICAgICBwdWJsaWMgTW9ja1BsYXRmb3JtVGFyZ2V0KGludCBhcGlMZXZlbCwgaW50IHJldmlzaW9uKSB7DQotICAgICAgICAgICAgbUFwaUxldmVsID0gYXBpTGV2ZWw7DQotICAgICAgICAgICAgbVJldmlzaW9uID0gcmV2aXNpb247DQotDQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTa2luKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gIm1vY2sgcGxhdGZvcm0gdGFyZ2V0IjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuICJtb2NrIHBsYXRmb3JtIHRhcmdldCI7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gIm1vY2sgcGxhdGZvcm0gdGFyZ2V0IjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBJT3B0aW9uYWxMaWJyYXJ5W10gZ2V0T3B0aW9uYWxMaWJyYXJpZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0UGFyZW50KCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKGludCBwYXRoSWQpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQbGF0Zm9ybUxpYnJhcmllcygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UmV2aXNpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1SZXZpc2lvbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTa2lucygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VXNiVmVuZG9ySWQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBBbmRyb2lkVmVyc2lvbiBnZXRWZXJzaW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZFZlcnNpb24obUFwaUxldmVsLCBudWxsIC8qY29kZW5hbWUqLyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25OYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJhbmRyb2lkLSUxJGQiLCBtQXBpTGV2ZWwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBoYXNoU3RyaW5nKCkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRWZXJzaW9uTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgdHJ1ZSBmb3IgYSBwbGF0Zm9ybS4gKi8NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGxhdGZvcm0oKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVCYXNlRm9yKElBbmRyb2lkVGFyZ2V0IHRhcmdldCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW1wbGVtZW50IHRoaXMgYXMgbmVlZGVkIGZvciB0ZXN0cyIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oSUFuZHJvaWRUYXJnZXQgbykgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW1wbGVtZW50IHRoaXMgYXMgbmVlZGVkIGZvciB0ZXN0cyIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTW9ja1Rvb2xQYWNrYWdlLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L01vY2tUb29sUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWNlNjIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTW9ja1Rvb2xQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmUuQXJjaDsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZS5PczsNCi0NCi0vKioNCi0gKiBBIG1vY2sge0BsaW5rIFRvb2xQYWNrYWdlfSBmb3IgdGVzdGluZy4NCi0gKg0KLSAqIEJ5IGRlc2lnbiwgdGhpcyBwYWNrYWdlIGNvbnRhaW5zIG9uZSBhbmQgb25seSBvbmUgYXJjaGl2ZS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja1Rvb2xQYWNrYWdlIGV4dGVuZHMgVG9vbFBhY2thZ2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBNb2NrVG9vbFBhY2thZ2V9IHdpdGggdGhlIGdpdmVuIHJldmlzaW9uIGFuZCBoYXJkY29kZWQgZGVmYXVsdHMNCi0gICAgICogZm9yIGV2ZXJ5dGhpbmcgZWxzZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiBCeSBkZXNpZ24sIHRoaXMgY3JlYXRlcyBhIHBhY2thZ2Ugd2l0aCBvbmUgYW5kIG9ubHkgb25lIGFyY2hpdmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgTW9ja1Rvb2xQYWNrYWdlKGludCByZXZpc2lvbikgew0KLSAgICAgICAgc3VwZXIoDQotICAgICAgICAgICAgbnVsbCwgLy8gc291cmNlLA0KLSAgICAgICAgICAgIG51bGwsIC8vIHByb3BzLA0KLSAgICAgICAgICAgIHJldmlzaW9uLA0KLSAgICAgICAgICAgIG51bGwsIC8vIGxpY2Vuc2UsDQotICAgICAgICAgICAgImRlc2MiLCAvLyBkZXNjcmlwdGlvbiwNCi0gICAgICAgICAgICAidXJsIiwgLy8gZGVzY1VybCwNCi0gICAgICAgICAgICBPcy5nZXRDdXJyZW50T3MoKSwgLy8gYXJjaGl2ZU9zLA0KLSAgICAgICAgICAgIEFyY2guZ2V0Q3VycmVudEFyY2goKSwgLy8gYXJjaGl2ZUFyY2gsDQotICAgICAgICAgICAgImZvbyIgLy8gYXJjaGl2ZU9zUGF0aA0KLSAgICAgICAgICAgICk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9UZXN0U2RrUmVwb3NpdG9yeS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvcmVwb3NpdG9yeS9UZXN0U2RrUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTUwYjZlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGtsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrbGliL3JlcG9zaXRvcnkvVGVzdFNka1JlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGtsaWIucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hOw0KLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0cyBsb2NhbCB2YWxpZGF0aW9uIG9mIGFuIFNESyBSZXBvc2l0b3J5IHNhbXBsZSBYTUxzIHVzaW5nIGFuIFhNTCBTY2hlbWEgdmFsaWRhdG9yLg0KLSAqDQotICogUmVmZXJlbmNlczoNCi0gKiBodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MveG1sL2xpYnJhcnkveC1qYXZheG1sdmFsaWRhcGkuaHRtbA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0U2RrUmVwb3NpdG9yeSBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQSBTQVggZXJyb3IgaGFuZGxlciB0aGF0IGNhcHR1cmVzIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzLg0KLSAgICAgKiBUaGlzIGFsbG93cyB1cyB0byBjYXB0dXJlICphbGwqIGVycm9ycyBhbmQganVzdCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiBvbiB0aGUgZmlyc3Qgb25lLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FwdHVyZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7DQotDQotICAgICAgICBwcml2YXRlIFN0cmluZyBtV2FybmluZ3MgPSAiIjsNCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvcnMgPSAiIjsNCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JzKCkgew0KLSAgICAgICAgICAgIHJldHVybiBtRXJyb3JzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRXYXJuaW5ncygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVdhcm5pbmdzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBWZXJpZmllcyBpZiB0aGUgaGFuZGxlciBjYXB0dXJlcyBzb21lIGVycm9ycyBvciB3YXJuaW5ncy4NCi0gICAgICAgICAqIFByaW50cyB0aGVtIG9uIHN0ZGVyci4NCi0gICAgICAgICAqIEFsc28gZmFpbHMgdGhlIHVuaXQgdGVzdCBpZiBhbnkgZXJyb3Igd2FzIGdlbmVyYXRlZC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgew0KLSAgICAgICAgICAgIGlmIChtV2FybmluZ3MubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtV2FybmluZ3MpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobUVycm9ycy5sZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1FcnJvcnMpOw0KLSAgICAgICAgICAgICAgICBmYWlsKG1FcnJvcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLSAgICAgICAgICAgIG1FcnJvcnMgKz0gIkVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpICsgIlxuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgbUVycm9ycyArPSAiRmF0YWwgRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXG4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBtV2FybmluZ3MgKz0gIldhcm5pbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXG4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIC8vIC0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKiogSGVscGVyIG1ldGhvZCB0aGF0IHJldHVybnMgYSB2YWxpZGF0b3IgZm9yIG91ciBYU0QgKi8NCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKENhcHR1cmVFcnJvckhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICBJbnB1dFN0cmVhbSB4c2RTdHJlYW0gPSBTZGtSZXBvc2l0b3J5LmdldFhzZFN0cmVhbSgpOw0KLSAgICAgICAgU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShYTUxDb25zdGFudHMuVzNDX1hNTF9TQ0hFTUFfTlNfVVJJKTsNCi0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5Lm5ld1NjaGVtYShuZXcgU3RyZWFtU291cmNlKHhzZFN0cmVhbSkpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNjaGVtYS5uZXdWYWxpZGF0b3IoKTsNCi0gICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3Iuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICAvKiogVmFsaWRhdGUgYSB2YWxpZCBzYW1wbGUgdXNpbmcgYW4gSW5wdXRTdHJlYW0gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTG9jYWxSZXBvc2l0b3J5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgSW5wdXRTdHJlYW0geG1sU3RyZWFtID0NCi0gICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL3Nka2xpYi90ZXN0ZGF0YS9yZXBvc2l0b3J5X3NhbXBsZS54bWwiKTsNCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhtbFN0cmVhbSk7DQotDQotICAgICAgICBDYXB0dXJlRXJyb3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FwdHVyZUVycm9ySGFuZGxlcigpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihoYW5kbGVyKTsNCi0gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgaGFuZGxlci52ZXJpZnkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQW4gaGVscGVyIHRoYXQgdmFsaWRhdGVzIGEgc3RyaW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgcmVnZXhwLiAqLw0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVnZXgoU3RyaW5nIGV4cGVjdGVkUmVnZXhwLCBTdHJpbmcgYWN0dWFsU3RyaW5nKSB7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGFjdHVhbFN0cmluZyk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJSZWdleHAgQXNzZXJ0aW9uIEZhaWxlZDpcbkV4cGVjdGVkOiAlc1xuQWN0dWFsOiAlc1xuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFJlZ2V4cCwgYWN0dWFsU3RyaW5nKSwNCi0gICAgICAgICAgICAgICAgYWN0dWFsU3RyaW5nLm1hdGNoZXMoZXhwZWN0ZWRSZWdleHApKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0gVGVzdHMgLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKiBBIGRvY3VtZW50IHNob3VsZCBhdCBsZWFzdCBoYXZlIGEgcm9vdCB0byBiZSB2YWxpZCAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBkb2N1bWVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiI7DQotDQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7DQotDQotICAgICAgICBDYXB0dXJlRXJyb3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FwdHVyZUVycm9ySGFuZGxlcigpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihoYW5kbGVyKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7DQotICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHRvIGdldCB0aGlzIHNwZWNpZmljIGV4Y2VwdGlvbiBtZXNzYWdlDQotICAgICAgICAgICAgYXNzZXJ0UmVnZXgoIlByZW1hdHVyZSBlbmQgb2YgZmlsZS4qIiwgZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFdlIHNob3VsZG4ndCBnZXQgaGVyZQ0KLSAgICAgICAgaGFuZGxlci52ZXJpZnkoKTsNCi0gICAgICAgIGZhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQSBkb2N1bWVudCB3aXRoIGEgcm9vdCBlbGVtZW50IGNvbnRhaW5pbmcgbm8gcGxhdGZvcm0sIGFkZG9uLCBldGMuLCBpcyB2YWxpZC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Um9vdFhtbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIGRvY3VtZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgIjxyOnNkay1yZXBvc2l0b3J5IHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvc2l0b3J5LzFcIiAvPiI7DQotDQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7DQotDQotICAgICAgICBDYXB0dXJlRXJyb3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FwdHVyZUVycm9ySGFuZGxlcigpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihoYW5kbGVyKTsNCi0gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgaGFuZGxlci52ZXJpZnkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQSBkb2N1bWVudCB3aXRoIGFuIHVua25vd24gZWxlbWVudC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVua25vd25Db250ZW50WG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgZG9jdW1lbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsNCi0gICAgICAgICAgICAiPHI6c2RrLXJlcG9zaXRvcnkgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG9zaXRvcnkvMVwiID4iICsNCi0gICAgICAgICAgICAiPHI6dW5rbm93biAvPiIgKw0KLSAgICAgICAgICAgICI8L3I6c2RrLXJlcG9zaXRvcnk+IjsNCi0NCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpKTsNCi0NCi0gICAgICAgIC8vIGRvbid0IGNhcHR1cmUgdGhlIHZhbGlkYXRvciBlcnJvcnMsIHdlIHdhbnQgaXQgdG8gZmFpbCBhbmQgY2F0Y2ggdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihudWxsKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7DQotICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGEgcGFyc2UgZXhwcmVzc2lvbiByZWZlcnJpbmcgdG8gdGhpcyBncmFtbWFyIHJ1bGUNCi0gICAgICAgICAgICBhc3NlcnRSZWdleCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYTogSW52YWxpZCBjb250ZW50IHdhcyBmb3VuZC4qIiwgZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB0aGUgdmFsaWRhdG9yIGhhcyBub3QgZmFpbGVkIGFzIHdlIGV4cGVjdGVkIGl0IHRvLg0KLSAgICAgICAgZmFpbCgpOw0KLSAgICB9DQotDQotICAgIC8qKiBBIGRvY3VtZW50IHdpdGggYW4gaW5jb21wbGV0ZSBlbGVtZW50LiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZUNvbnRlbnRYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBkb2N1bWVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICI8cjpzZGstcmVwb3NpdG9yeSB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwb3NpdG9yeS8xXCIgPiIgKw0KLSAgICAgICAgICAgICI8cjpwbGF0Zm9ybT4gPHI6YXBpLWxldmVsPjE8L3I6YXBpLWxldmVsPiA8cjpsaWJzIC8+IDwvcjpwbGF0Zm9ybT4iICsNCi0gICAgICAgICAgICAiPC9yOnNkay1yZXBvc2l0b3J5PiI7DQotDQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7DQotDQotICAgICAgICAvLyBkb24ndCBjYXB0dXJlIHRoZSB2YWxpZGF0b3IgZXJyb3JzLCB3ZSB3YW50IGl0IHRvIGZhaWwgYW5kIGNhdGNoIHRoZSBleGNlcHRpb24NCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IobnVsbCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBhIHBhcnNlIGVycm9yIHJlZmVycmluZyB0byB0aGlzIGdyYW1tYXIgcnVsZQ0KLSAgICAgICAgICAgIGFzc2VydFJlZ2V4KCJjdmMtY29tcGxleC10eXBlLjIuNC5hOiBJbnZhbGlkIGNvbnRlbnQgd2FzIGZvdW5kLioiLCBlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSB2YWxpZGF0b3IgaGFzIG5vdCBmYWlsZWQgYXMgd2UgZXhwZWN0ZWQgaXQgdG8uDQotICAgICAgICBmYWlsKCk7DQotICAgIH0NCi0NCi0gICAgLyoqIEEgZG9jdW1lbnQgd2l0aCBhIHdyb25nIHR5cGUgZWxlbWVudC4gKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nVHlwZUNvbnRlbnRYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBkb2N1bWVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICI8cjpzZGstcmVwb3NpdG9yeSB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwb3NpdG9yeS8xXCIgPiIgKw0KLSAgICAgICAgICAgICI8cjpwbGF0Zm9ybT4gPHI6YXBpLWxldmVsPk5vdEFuSW50ZWdlcjwvcjphcGktbGV2ZWw+IDxyOmxpYnMgLz4gPC9yOnBsYXRmb3JtPiIgKw0KLSAgICAgICAgICAgICI8L3I6c2RrLXJlcG9zaXRvcnk+IjsNCi0NCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpKTsNCi0NCi0gICAgICAgIC8vIGRvbid0IGNhcHR1cmUgdGhlIHZhbGlkYXRvciBlcnJvcnMsIHdlIHdhbnQgaXQgdG8gZmFpbCBhbmQgY2F0Y2ggdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihudWxsKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7DQotICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGEgcGFyc2UgZXJyb3IgcmVmZXJyaW5nIHRvIHRoaXMgZ3JhbW1hciBydWxlDQotICAgICAgICAgICAgYXNzZXJ0UmVnZXgoImN2Yy1kYXRhdHlwZS12YWxpZC4xLjIuMTogJ05vdEFuSW50ZWdlcicgaXMgbm90IGEgdmFsaWQgdmFsdWUuKiIsDQotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSB2YWxpZGF0b3IgaGFzIG5vdCBmYWlsZWQgYXMgd2UgZXhwZWN0ZWQgaXQgdG8uDQotICAgICAgICBmYWlsKCk7DQotICAgIH0NCi0NCi0gICAgLyoqIEEgZG9jdW1lbnQgYW4gdW5rbm93biBsaWNlbnNlIGlkLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGljZW5zZUlkTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIHdlIGRlZmluZSBhIGxpY2Vuc2UgbmFtZWQgImxpYzEiIGFuZCB0aGVuIHJlZmVyZW5jZSAibGljMiIgaW5zdGVhZA0KLSAgICAgICAgU3RyaW5nIGRvY3VtZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArDQotICAgICAgICAgICAgIjxyOnNkay1yZXBvc2l0b3J5IHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvc2l0b3J5LzFcIiA+IiArDQotICAgICAgICAgICAgIjxyOmxpY2Vuc2UgaWQ9XCJsaWMxXCI+IHNvbWUgbGljZW5zZSA8L3I6bGljZW5zZT4gIiArDQotICAgICAgICAgICAgIjxyOnRvb2w+IDxyOnVzZXMtbGljZW5zZSByZWY9XCJsaWMyXCIgLz4gPHI6cmV2aXNpb24+MTwvcjpyZXZpc2lvbj4gIiArDQotICAgICAgICAgICAgIjxyOmFyY2hpdmVzPiA8cjphcmNoaXZlIG9zPVwiYW55XCI+IDxyOnNpemU+MTwvcjpzaXplPiA8cjpjaGVja3N1bT4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9yOmNoZWNrc3VtPiAiICsNCi0gICAgICAgICAgICAiPHI6dXJsPnVybDwvcjp1cmw+IDwvcjphcmNoaXZlPiA8L3I6YXJjaGl2ZXM+IDwvcjp0b29sPiIgKw0KLSAgICAgICAgICAgICI8L3I6c2RrLXJlcG9zaXRvcnk+IjsNCi0NCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpKTsNCi0NCi0gICAgICAgIC8vIGRvbid0IGNhcHR1cmUgdGhlIHZhbGlkYXRvciBlcnJvcnMsIHdlIHdhbnQgaXQgdG8gZmFpbCBhbmQgY2F0Y2ggdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihudWxsKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7DQotICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGEgcGFyc2UgZXJyb3IgcmVmZXJyaW5nIHRvIHRoaXMgZ3JhbW1hciBydWxlDQotICAgICAgICAgICAgYXNzZXJ0UmVnZXgoImN2Yy1pZC4xOiBUaGVyZSBpcyBubyBJRC9JRFJFRiBiaW5kaW5nIGZvciBJRFJFRiAnbGljMicuKiIsDQotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZSB2YWxpZGF0b3IgaGFzIG5vdCBmYWlsZWQgYXMgd2UgZXhwZWN0ZWQgaXQgdG8uDQotICAgICAgICBmYWlsKCk7DQotICAgIH0NCi0NCi0gICAgLyoqIEEgZG9jdW1lbnQgYSBzbGFzaCBpbiBhbiBleHRyYSBwYXRoLiAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFQYXRoV2l0aFNsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyB3ZSBkZWZpbmUgYSBsaWNlbnNlIG5hbWVkICJsaWMxIiBhbmQgdGhlbiByZWZlcmVuY2UgImxpYzIiIGluc3RlYWQNCi0gICAgICAgIFN0cmluZyBkb2N1bWVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKw0KLSAgICAgICAgICAgICI8cjpzZGstcmVwb3NpdG9yeSB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwb3NpdG9yeS8xXCIgPiIgKw0KLSAgICAgICAgICAgICI8cjpleHRyYT4gPHI6cmV2aXNpb24+MTwvcjpyZXZpc2lvbj4gPHI6cGF0aD5wYXRoL2Nhbm5vdFxcY29udGFpblxcc2VnbWVudHM8L3I6cGF0aD4gIiArDQotICAgICAgICAgICAgIjxyOmFyY2hpdmVzPiA8cjphcmNoaXZlIG9zPVwiYW55XCI+IDxyOnNpemU+MTwvcjpzaXplPiA8cjpjaGVja3N1bT4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9yOmNoZWNrc3VtPiAiICsNCi0gICAgICAgICAgICAiPHI6dXJsPnVybDwvcjp1cmw+IDwvcjphcmNoaXZlPiA8L3I6YXJjaGl2ZXM+IDwvcjpleHRyYT4iICsNCi0gICAgICAgICAgICAiPC9yOnNkay1yZXBvc2l0b3J5PiI7DQotDQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7DQotDQotICAgICAgICAvLyBkb24ndCBjYXB0dXJlIHRoZSB2YWxpZGF0b3IgZXJyb3JzLCB3ZSB3YW50IGl0IHRvIGZhaWwgYW5kIGNhdGNoIHRoZSBleGNlcHRpb24NCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IobnVsbCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOw0KLSAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBhIHBhcnNlIGVycm9yIHJlZmVycmluZyB0byB0aGlzIGdyYW1tYXIgcnVsZQ0KLSAgICAgICAgICAgIGFzc2VydFJlZ2V4KCJjdmMtcGF0dGVybi12YWxpZDogVmFsdWUgJ3BhdGgvY2Fubm90XFxcXGNvbnRhaW5cXFxcc2VnbWVudHMnIGlzIG5vdCBmYWNldC12YWxpZCB3aXRoIHJlc3BlY3QgdG8gcGF0dGVybi4qIiwNCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlIHZhbGlkYXRvciBoYXMgbm90IGZhaWxlZCBhcyB3ZSBleHBlY3RlZCBpdCB0by4NCi0gICAgICAgIGZhaWwoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi90ZXN0ZGF0YS9yZXBvc2l0b3J5X3NhbXBsZS54bWwgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka2xpYi90ZXN0ZGF0YS9yZXBvc2l0b3J5X3NhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MGUxOGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka2xpYi90ZXN0cy9jb20vYW5kcm9pZC9zZGtsaWIvdGVzdGRhdGEvcmVwb3NpdG9yeV9zYW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCB2ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08c2RrOnNkay1yZXBvc2l0b3J5DQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwb3NpdG9yeS8xIj4NCi0NCi0gICAgPCEtLSBEZWZpbmUgYSBjb3VwbGUgb2YgbGljZW5zZXMuIFRoZXNlIHdpbGwgYmUgcmVmZXJlbmNlZCBieSB1c2VzLWxpY2Vuc2UgbGF0ZXIuIC0tPg0KLQ0KLSAgICA8c2RrOmxpY2Vuc2UgdHlwZT0idGV4dCIgaWQ9ImxpY2Vuc2UxIj4NCi0gICAgICAgIFRoaXMgaXMgdGhlIGxpY2Vuc2UNCi0gICAgICAgIGZvciB0aGlzIHBsYXRmb3JtLg0KLSAgICA8L3NkazpsaWNlbnNlPg0KLQ0KLSAgICA8c2RrOmxpY2Vuc2UgaWQ9ImxpY2Vuc2UyIj4NCi0gICAgICAgIExpY2Vuc2VzIGFyZSBvbmx5IG9mIHR5cGUgJ3RleHQnIHJpZ2h0IG5vdywgc28gdGhpcyBpcyBpbXBsaWVkLg0KLSAgICA8L3NkazpsaWNlbnNlPg0KLQ0KLSAgICA8IS0tIElubmVyIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIHBsYXRmb3JtLCBhZGQtb24sIGRvYyBvciB0b29sLg0KLSAgICAgICAgIFRoZXJlIGNhbiBiZSAwIG9yIG1vcmUgb2YgZWFjaCwgaW4gYW55IG9yZGVyLiAtLT4NCi0NCi0gICAgPHNkazpwbGF0Zm9ybT4NCi0gICAgICAgIDxzZGs6dmVyc2lvbj4xLjA8L3Nkazp2ZXJzaW9uPg0KLSAgICAgICAgPHNkazphcGktbGV2ZWw+MTwvc2RrOmFwaS1sZXZlbD4NCi0gICAgICAgIDxzZGs6cmV2aXNpb24+Mzwvc2RrOnJldmlzaW9uPg0KLSAgICAgICAgPHNkazp1c2VzLWxpY2Vuc2UgcmVmPSJsaWNlbnNlMSIgLz4NCi0gICAgICAgIDxzZGs6ZGVzY3JpcHRpb24+U29tZSBvcHRpb25hbCBkZXNjcmlwdGlvbjwvc2RrOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgPHNkazpkZXNjLXVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL3BsYXRmb3JtMS5odG1sPC9zZGs6ZGVzYy11cmw+DQotICAgICAgICA8c2RrOnJlbGVhc2Utbm90ZT5UaGlzIGlzIGFuIG9wdGlvbmFsIHJlbGVhc2Ugbm90ZQ0KLSAgICAgICAgICAgIGZvciB0aGlzIHBhY2thZ2UuIEl0J3MgYSBmcmVlIG11bHRpLWxpbmUgdGV4dC4NCi0gICAgICAgIDwvc2RrOnJlbGVhc2Utbm90ZT4NCi0gICAgICAgIDxzZGs6cmVsZWFzZS11cmw+aHR0cDovL3NvbWUvdXJsL2Zvci90aGUvcmVsZWFzZS9ub3RlLmh0bWw8L3NkazpyZWxlYXNlLXVybD4NCi0gICAgICAgIDxzZGs6bWluLXRvb2xzLXJldj4yPC9zZGs6bWluLXRvb2xzLXJldj4NCi0gICAgICAgIDwhLS0gVGhlIGFyY2hpdmVzIG5vZGUgaXMgbWFuZGF0b3J5IGFuZCBpdCBjYW5ub3QgYmUgZW1wdHkuIC0tPg0KLSAgICAgICAgPHNkazphcmNoaXZlcz4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9ImFueSI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL2ZpbGVzL3BsYXQxLnppcDwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgPC9zZGs6YXJjaGl2ZXM+DQotICAgIDwvc2RrOnBsYXRmb3JtPg0KLQ0KLSAgICA8c2RrOmRvYz4NCi0gICAgICAgIDxzZGs6YXBpLWxldmVsPjE8L3NkazphcGktbGV2ZWw+DQotICAgICAgICA8c2RrOnJldmlzaW9uPjE8L3NkazpyZXZpc2lvbj4NCi0gICAgICAgIDwhLS0gdGhlIGxpY2Vuc2UgZWxlbWVudCBpcyBub3QgbWFuZGF0b3J5LiAtLT4NCi0gICAgICAgIDxzZGs6ZGVzY3JpcHRpb24+U29tZSBvcHRpb25hbCBkZXNjcmlwdGlvbjwvc2RrOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgPHNkazpkZXNjLXVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL2RvY3MuaHRtbDwvc2RrOmRlc2MtdXJsPg0KLSAgICAgICAgPHNkazphcmNoaXZlcz4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9ImFueSI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL2RvY3MvZG9jczEuemlwPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICA8L3NkazphcmNoaXZlcz4NCi0gICAgPC9zZGs6ZG9jPg0KLQ0KLSAgICA8c2RrOmFkZC1vbj4NCi0gICAgICAgIDxzZGs6bmFtZT5NeSBGaXJzdCBhZGQtb248L3NkazpuYW1lPg0KLSAgICAgICAgPHNkazphcGktbGV2ZWw+MTwvc2RrOmFwaS1sZXZlbD4NCi0gICAgICAgIDxzZGs6dmVuZG9yPkpvaG4gRG9lPC9zZGs6dmVuZG9yPg0KLSAgICAgICAgPHNkazpyZXZpc2lvbj4xPC9zZGs6cmV2aXNpb24+DQotICAgICAgICA8c2RrOnVzZXMtbGljZW5zZSByZWY9ImxpY2Vuc2UyIiAvPg0KLSAgICAgICAgPHNkazpkZXNjcmlwdGlvbj5Tb21lIG9wdGlvbmFsIGRlc2NyaXB0aW9uPC9zZGs6ZGVzY3JpcHRpb24+DQotICAgICAgICA8c2RrOmRlc2MtdXJsPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbXlmaXJzdGFkZG9uPC9zZGs6ZGVzYy11cmw+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0iYW55Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYWRkLW9ucy9maXJzdC56aXA8L3Nkazp1cmw+DQotICAgICAgICAgICAgPC9zZGs6YXJjaGl2ZT4NCi0gICAgICAgIDwvc2RrOmFyY2hpdmVzPg0KLSAgICAgICAgPCEtLSBUaGUgbGlicyBub2RlIGlzIG1hbmRhdG9yeSwgaG93ZXZlciBpdCBjYW4gYmUgZW1wdHkuIC0tPg0KLSAgICAgICAgPHNkazpsaWJzPg0KLSAgICAgICAgICAgIDxzZGs6bGliPg0KLSAgICAgICAgICAgICAgICA8c2RrOm5hbWU+YW5kcm9pZC5ibGFoLnNvbWVsaWI8L3NkazpuYW1lPg0KLSAgICAgICAgICAgICAgICA8c2RrOmRlc2NyaXB0aW9uPlRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBsaWJyYXJ5Ljwvc2RrOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIDwvc2RrOmxpYj4NCi0gICAgICAgICAgICA8c2RrOmxpYj4NCi0gICAgICAgICAgICAgICAgPCEtLSBzZGs6ZGVzY3JpcHRpb24gaXMgb3B0aW9uYWwsIG5hbWUgaXMgbm90IC0tPg0KLSAgICAgICAgICAgICAgICA8c2RrOm5hbWU+Y29tLmFuZHJvaWQubXltYXBzPC9zZGs6bmFtZT4NCi0gICAgICAgICAgICA8L3NkazpsaWI+DQotICAgICAgICA8L3NkazpsaWJzPg0KLSAgICA8L3NkazphZGQtb24+DQotDQotICAgIDxzZGs6cGxhdGZvcm0+DQotICAgICAgICA8c2RrOnZlcnNpb24+MS4xPC9zZGs6dmVyc2lvbj4NCi0gICAgICAgIDxzZGs6YXBpLWxldmVsPjI8L3NkazphcGktbGV2ZWw+DQotICAgICAgICA8c2RrOnJldmlzaW9uPjEyPC9zZGs6cmV2aXNpb24+DQotICAgICAgICA8c2RrOnVzZXMtbGljZW5zZSByZWY9ImxpY2Vuc2UxIiAvPg0KLSAgICAgICAgPCEtLSBzZGs6ZGVzY3JpcHRpb24gYW5kIHNkazpkZXNjLXVybCBhcmUgb3B0aW9uYWwgLS0+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0id2luZG93cyI+DQotICAgICAgICAgICAgICAgIDwhLS0gIGFyY2ggYXR0cmlidXRlIGlzIG9wdGlvbmFsIC0tPg0KLSAgICAgICAgICAgICAgICA8c2RrOnNpemU+NjU1MzY8L3NkazpzaXplPg0KLSAgICAgICAgICAgICAgICA8c2RrOmNoZWNrc3VtIHR5cGU9InNoYTEiPjI4MjJhZTM3MTE1ZWJmMTM0MTJiYmVmOTEzMzllZTBkOTQ1NDUyNWU8L3NkazpjaGVja3N1bT4NCi0gICAgICAgICAgICAgICAgPHNkazp1cmw+ZGlzdHJpYi9wbGF0Zm9ybS0yLTEyLXdpbi56aXA8L3Nkazp1cmw+DQotICAgICAgICAgICAgPC9zZGs6YXJjaGl2ZT4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9Im1hY29zeCIgYXJjaD0iYW55Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmRpc3RyaWIvcGxhdGZvcm0tMi0xMi1tYWMuemlwPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICAgICAgPHNkazphcmNoaXZlIG9zPSJtYWNvc3giIGFyY2g9InBwYyI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3BsYXRmb3JtLTItMTItbWFjLnppcDwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0ibGludXgiIGFyY2g9Ing4NiI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3BsYXRmb3JtLTItMTItbGludXgudGFyLmJ6Mjwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0ibGludXgiIGFyY2g9Ing4Nl82NCI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3BsYXRmb3JtLTItMTItbGludXgudGFyLmJ6Mjwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgPC9zZGs6YXJjaGl2ZXM+DQotICAgIDwvc2RrOnBsYXRmb3JtPg0KLQ0KLSAgICA8c2RrOmFkZC1vbj4NCi0gICAgICAgIDxzZGs6bmFtZT5NeSBTZWNvbmQgYWRkLW9uPC9zZGs6bmFtZT4NCi0gICAgICAgIDxzZGs6YXBpLWxldmVsPjI8L3NkazphcGktbGV2ZWw+DQotICAgICAgICA8c2RrOnZlbmRvcj5Kb2huIERlZXI8L3Nkazp2ZW5kb3I+DQotICAgICAgICA8c2RrOnJldmlzaW9uPjQyPC9zZGs6cmV2aXNpb24+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0id2luZG93cyI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3NlY29uZC00Mi13aW4uemlwPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICAgICAgPHNkazphcmNoaXZlIG9zPSJsaW51eCI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3NlY29uZC00Mi1saW51eC50YXIuYnoyPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICA8L3NkazphcmNoaXZlcz4NCi0gICAgICAgIDxzZGs6bGlicz4NCi0gICAgICAgICAgICA8c2RrOmxpYj4NCi0gICAgICAgICAgICAgICAgPHNkazpuYW1lPmFuZHJvaWQuYmxhaC5zb21lbGliPC9zZGs6bmFtZT4NCi0gICAgICAgICAgICAgICAgPHNkazpkZXNjcmlwdGlvbj5UaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbGlicmFyeS48L3NkazpkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICA8L3NkazpsaWI+DQotICAgICAgICAgICAgPHNkazpsaWI+DQotICAgICAgICAgICAgICAgIDxzZGs6bmFtZT5jb20uYW5kcm9pZC5teW1hcHM8L3NkazpuYW1lPg0KLSAgICAgICAgICAgIDwvc2RrOmxpYj4NCi0gICAgICAgIDwvc2RrOmxpYnM+DQotICAgICAgICA8c2RrOnVzZXMtbGljZW5zZSByZWY9ImxpY2Vuc2UyIiAvPg0KLSAgICA8L3NkazphZGQtb24+DQotCi0gICA8c2RrOnBsYXRmb3JtPgotICAgICAgICA8c2RrOnZlcnNpb24+UGFzdHJ5PC9zZGs6dmVyc2lvbj4KLSAgICAgICAgPHNkazphcGktbGV2ZWw+NTwvc2RrOmFwaS1sZXZlbD4KLSAgICAgICAgPHNkazpjb2RlbmFtZT5QYXN0cnk8L3Nkazpjb2RlbmFtZT4KLSAgICAgICAgPHNkazpyZXZpc2lvbj4zPC9zZGs6cmV2aXNpb24+Ci0gICAgICAgIDxzZGs6dXNlcy1saWNlbnNlIHJlZj0ibGljZW5zZTEiIC8+Ci0gICAgICAgIDxzZGs6ZGVzY3JpcHRpb24+UHJldmlldyB2ZXJzaW9uIGZvciBQYXN0cnk8L3NkazpkZXNjcmlwdGlvbj4KLSAgICAgICAgPHNkazpkZXNjLXVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL3BsYXRmb3JtMS5odG1sPC9zZGs6ZGVzYy11cmw+Ci0gICAgICAgIDwhLS0gVGhlIGFyY2hpdmVzIG5vZGUgaXMgbWFuZGF0b3J5IGFuZCBpdCBjYW5ub3QgYmUgZW1wdHkuIC0tPgotICAgICAgICA8c2RrOmFyY2hpdmVzPgotICAgICAgICAgICAgPHNkazphcmNoaXZlIG9zPSJhbnkiPgotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+Ci0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+Ci0gICAgICAgICAgICAgICAgPHNkazp1cmw+aHR0cDovL3d3dy5leGFtcGxlLmNvbS9maWxlcy9wbGF0MS56aXA8L3Nkazp1cmw+Ci0gICAgICAgICAgICA8L3NkazphcmNoaXZlPgotICAgICAgICA8L3NkazphcmNoaXZlcz4KLSAgICA8L3NkazpwbGF0Zm9ybT4KLQ0KLSAgICA8c2RrOnRvb2w+DQotICAgICAgICA8c2RrOnJldmlzaW9uPjE8L3NkazpyZXZpc2lvbj4NCi0gICAgICAgIDxzZGs6ZGVzY3JpcHRpb24+U29tZSBvcHRpb25hbCBkZXNjcmlwdGlvbjwvc2RrOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgPHNkazpkZXNjLXVybD5odHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rvb2xzLmh0bWw8L3NkazpkZXNjLXVybD4NCi0gICAgICAgIDxzZGs6dXNlcy1saWNlbnNlIHJlZj0ibGljZW5zZTEiIC8+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0iYW55Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZmlsZXMvdG9vbHMxLnppcDwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgPC9zZGs6YXJjaGl2ZXM+DQotICAgIDwvc2RrOnRvb2w+DQotDQotICAgIDxzZGs6ZG9jPg0KLSAgICAgICAgPHNkazphcGktbGV2ZWw+Mjwvc2RrOmFwaS1sZXZlbD4NCi0gICAgICAgIDxzZGs6cmV2aXNpb24+NDI8L3NkazpyZXZpc2lvbj4NCi0gICAgICAgIDxzZGs6dXNlcy1saWNlbnNlIHJlZj0ibGljZW5zZTIiIC8+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0id2luZG93cyI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL2RvY3MvMi56aXA8L3Nkazp1cmw+DQotICAgICAgICAgICAgPC9zZGs6YXJjaGl2ZT4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9ImxpbnV4Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmRpc3RyaWIvZG9jczItbGludXgudGFyLmJ6Mjwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0ibWFjb3N4Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmRpc3RyaWIvZG9jczItbWFjLnRhci5iejI8L3Nkazp1cmw+DQotICAgICAgICAgICAgPC9zZGs6YXJjaGl2ZT4NCi0gICAgICAgIDwvc2RrOmFyY2hpdmVzPg0KLSAgICA8L3Nkazpkb2M+DQotDQotICAgIDxzZGs6dG9vbD4NCi0gICAgICAgIDxzZGs6cmV2aXNpb24+NDI8L3NkazpyZXZpc2lvbj4NCi0gICAgICAgIDxzZGs6dXNlcy1saWNlbnNlIHJlZj0ibGljZW5zZTEiIC8+DQotICAgICAgICA8c2RrOmFyY2hpdmVzPg0KLSAgICAgICAgICAgIDxzZGs6YXJjaGl2ZSBvcz0id2luZG93cyI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3Rvb2xzLzIuemlwPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICAgICAgPHNkazphcmNoaXZlIG9zPSJsaW51eCI+DQotICAgICAgICAgICAgICAgIDxzZGs6c2l6ZT42NTUzNjwvc2RrOnNpemU+DQotICAgICAgICAgICAgICAgIDxzZGs6Y2hlY2tzdW0gdHlwZT0ic2hhMSI+MjgyMmFlMzcxMTVlYmYxMzQxMmJiZWY5MTMzOWVlMGQ5NDU0NTI1ZTwvc2RrOmNoZWNrc3VtPg0KLSAgICAgICAgICAgICAgICA8c2RrOnVybD5kaXN0cmliL3Rvb2xzMi1saW51eC50YXIuYnoyPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICAgICAgPHNkazphcmNoaXZlIG9zPSJtYWNvc3giPg0KLSAgICAgICAgICAgICAgICA8c2RrOnNpemU+NjU1MzY8L3NkazpzaXplPg0KLSAgICAgICAgICAgICAgICA8c2RrOmNoZWNrc3VtIHR5cGU9InNoYTEiPjI4MjJhZTM3MTE1ZWJmMTM0MTJiYmVmOTEzMzllZTBkOTQ1NDUyNWU8L3NkazpjaGVja3N1bT4NCi0gICAgICAgICAgICAgICAgPHNkazp1cmw+ZGlzdHJpYi90b29sczItbWFjLnRhci5iejI8L3Nkazp1cmw+DQotICAgICAgICAgICAgPC9zZGs6YXJjaGl2ZT4NCi0gICAgICAgIDwvc2RrOmFyY2hpdmVzPg0KLSAgICA8L3Nkazp0b29sPg0KLQ0KLSAgICA8c2RrOmFkZC1vbj4NCi0gICAgICAgIDxzZGs6dXNlcy1saWNlbnNlIHJlZj0ibGljZW5zZTIiIC8+DQotICAgICAgICA8c2RrOm5hbWU+VGhpcyBhZGQtb24gaGFzIG5vIGxpYnJhcmllczwvc2RrOm5hbWU+DQotICAgICAgICA8c2RrOmFwaS1sZXZlbD40PC9zZGs6YXBpLWxldmVsPg0KLSAgICAgICAgPHNkazp2ZW5kb3I+Sm9lIEJhcjwvc2RrOnZlbmRvcj4NCi0gICAgICAgIDxzZGs6cmV2aXNpb24+Mzwvc2RrOnJldmlzaW9uPg0KLSAgICAgICAgPHNkazphcmNoaXZlcz4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9ImFueSIgYXJjaD0iYW55Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmRpc3RyaWIvaW1ub3RhbmFyY2hpdmVpbWFkb2N0b3JqaW0uemlwPC9zZGs6dXJsPg0KLSAgICAgICAgICAgIDwvc2RrOmFyY2hpdmU+DQotICAgICAgICA8L3NkazphcmNoaXZlcz4NCi0gICAgICAgIDwhLS0gVGhlIGxpYnMgbm9kZSBpcyBtYW5kYXRvcnksIGhvd2V2ZXIgaXQgY2FuIGJlIGVtcHR5LiAtLT4NCi0gICAgICAgIDxzZGs6bGlicyAvPg0KLSAgICA8L3NkazphZGQtb24+DQotDQotICAgIDxzZGs6ZXh0cmE+DQotICAgICAgICA8c2RrOnBhdGg+dXNiX2RyaXZlcjwvc2RrOnBhdGg+DQotICAgICAgICA8c2RrOnVzZXMtbGljZW5zZSByZWY9ImxpY2Vuc2UyIiAvPg0KLSAgICAgICAgPHNkazpyZXZpc2lvbj40Mzwvc2RrOnJldmlzaW9uPg0KLSAgICAgICAgPHNkazphcmNoaXZlcz4NCi0gICAgICAgICAgICA8c2RrOmFyY2hpdmUgb3M9ImFueSIgYXJjaD0iYW55Ij4NCi0gICAgICAgICAgICAgICAgPHNkazpzaXplPjY1NTM2PC9zZGs6c2l6ZT4NCi0gICAgICAgICAgICAgICAgPHNkazpjaGVja3N1bSB0eXBlPSJzaGExIj4yODIyYWUzNzExNWViZjEzNDEyYmJlZjkxMzM5ZWUwZDk0NTQ1MjVlPC9zZGs6Y2hlY2tzdW0+DQotICAgICAgICAgICAgICAgIDxzZGs6dXJsPmRpc3RyaWIvZXh0cmFkdWZmLnppcDwvc2RrOnVybD4NCi0gICAgICAgICAgICA8L3NkazphcmNoaXZlPg0KLSAgICAgICAgPC9zZGs6YXJjaGl2ZXM+DQotICAgICAgICA8c2RrOmRlc2NyaXB0aW9uPkFuIEV4dHJhIHBhY2thZ2UgZm9yIHRoZSBVU0IgZHJpdmVyLCBpdCB3aWxsIGluc3RhbGwgaW4gJFNESy91c2JfZHJpdmVyPC9zZGs6ZGVzY3JpcHRpb24+DQotICAgICAgICA8c2RrOmRlc2MtdXJsPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZXh0cmEuaHRtbDwvc2RrOmRlc2MtdXJsPg0KLSAgICAgICAgPHNkazptaW4tdG9vbHMtcmV2PjM8L3NkazptaW4tdG9vbHMtcmV2Pg0KLSAgICA8L3NkazpleHRyYT4NCi0NCi08L3NkazpzZGstcmVwb3NpdG9yeT4NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvLmNsYXNzcGF0aCBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzU5MmM0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuVVNFUl9MSUJSQVJZL0FORFJPSURfU1dUIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9TZGtMaWIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL0FuZHJvaWRQcmVmcyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliLy5wcm9qZWN0IGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQzMGM4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPlNka1VpTGliPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9BbmRyb2lkLm1rIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMGJjMjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotU0RLVUlMSUJfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoU0RLVUlMSUJfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL1JFQURNRSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmI4NGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVVzaW5nIHRoZSBFY2xpcHNlIHByb2plY3RzIGZvciBkZG11aWxpYi4KLQotZGRtdWlsaWIgcmVxdWlyZXMgU1dUIHRvIGNvbXBpbGUuCi0KLVNXVCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlcG90IHVuZGVyIHByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0Ci0KLUJlY2F1c2UgdGhlIGJ1aWxkIHBhdGggY2Fubm90IGNvbnRhaW4gcmVsYXRpdmUgcGF0aCB0aGF0IGFyZSBub3QgaW5zaWRlIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKLXRoZSAuY2xhc3NwYXRoIGZpbGUgcmVmZXJlbmNlcyBhIHVzZXIgbGlicmFyeSBjYWxsZWQgQU5EUk9JRF9TV1QuCi0KLUluIG9yZGVyIHRvIGNvbXBpbGUgdGhlIHByb2plY3QsIG1ha2UgYSB1c2VyIGxpYnJhcnkgY2FsbGVkIEFORFJPSURfU1dUIGNvbnRhaW5pbmcgdGhlIGphcgotYXZhaWxhYmxlIGF0IHByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwYzEyMi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAuCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKLQlzZGtsaWIgXAotCWFuZHJvaWRwcmVmcyBcCi0Jc3d0IFwKLQlvcmcuZWNsaXBzZS5qZmFjZV8zLjQuMi5NMjAwOTAxMDctMDgwMCBcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25fMy40LjAudjIwMDgwNDIxLTIwMDYgXAotCW9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHNfMy40LjAuSTIwMDgwNTA5LTIwMDAKLQkKLUxPQ0FMX01PRFVMRSA6PSBzZGt1aWxpYgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BZGJXcmFwcGVyLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvQWRiV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjU1M2QxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BZGJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklUYXNrTW9uaXRvcjsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEEgbGlnaHR3ZWlnaHQgd3JhcHBlciB0byBzdGFydCAmIHN0b3AgQURCLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBZGJXcmFwcGVyIHsNCi0NCi0gICAgLyoNCi0gICAgICogTm90ZTogd2UgY291bGQgYnJpbmcgZGRtbGliIGluIFNka01hbmFnZXIgZm9yIHRoYXQgcHVycG9zZSwgaG93ZXZlciB0aGlzIGFsbG93cyB1cyB0bw0KLSAgICAgKiBzcGVjaWFsaXplIHRoZSBzdGFydC9zdG9wIG1ldGhvZHMgdG8gb3VyIG5lZWRzIChlLmcuIGEgdGFzayBtb25pdG9yLCBldGMuKQ0KLSAgICAgKi8NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFkYk9zTG9jYXRpb247DQotICAgIHByaXZhdGUgZmluYWwgSVRhc2tNb25pdG9yIG1Nb25pdG9yOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIG5ldyBsaWdodHdlaWdodCBBREIgd3JhcHBlci4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9zU2RrUGF0aCBUaGUgcm9vdCBPUyBwYXRoIG9mIHRoZSBTREsuIENhbm5vdCBiZSBudWxsLg0KLSAgICAgKiBAcGFyYW0gbW9uaXRvciBBIGxvZ2dlciBvYmplY3QuIENhbm5vdCBiZSBudWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkYldyYXBwZXIoU3RyaW5nIG9zU2RrUGF0aCwgSVRhc2tNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgIG1Nb25pdG9yID0gbW9uaXRvcjsNCi0NCi0gICAgICAgIGlmICghb3NTZGtQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgew0KLSAgICAgICAgICAgIG9zU2RrUGF0aCArPSBGaWxlLnNlcGFyYXRvcjsNCi0gICAgICAgIH0NCi0gICAgICAgIG1BZGJPc0xvY2F0aW9uID0gb3NTZGtQYXRoICsgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKyBTZGtDb25zdGFudHMuRk5fQURCOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5KFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLmFyZ3MpIHsNCi0gICAgICAgIG1Nb25pdG9yLnNldFJlc3VsdChmb3JtYXQsIGFyZ3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTdGFydHMgdGhlIGFkYiBob3N0IHNpZGUgc2VydmVyLg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0QWRiKCkgew0KLSAgICAgICAgaWYgKG1BZGJPc0xvY2F0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICBkaXNwbGF5KCJFcnJvcjogbWlzc2luZyBwYXRoIHRvIEFEQi4iKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb2Nlc3MgcHJvYzsNCi0gICAgICAgIGludCBzdGF0dXMgPSAtMTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbMl07DQotICAgICAgICAgICAgY29tbWFuZFswXSA9IG1BZGJPc0xvY2F0aW9uOw0KLSAgICAgICAgICAgIGNvbW1hbmRbMV0gPSAic3RhcnQtc2VydmVyIjsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOw0KLQ0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGVycm9yT3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3RkT3V0cHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgc3RhdHVzID0gZ3JhYlByb2Nlc3NPdXRwdXQocHJvYywgZXJyb3JPdXRwdXQsIHN0ZE91dHB1dCwNCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHdhaXRGb3JSZWFkZXJzICovKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLSAgICAgICAgICAgIGRpc3BsYXkoIlVuYWJsZSB0byBydW4gJ2FkYic6ICUxJHMuIiwgaW9lLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAvLyB3ZSdsbCByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KLSAgICAgICAgICAgIGRpc3BsYXkoIlVuYWJsZSB0byBydW4gJ2FkYic6ICUxJHMuIiwgaWUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIC8vIHdlJ2xsIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgew0KLSAgICAgICAgICAgIGRpc3BsYXkoIidhZGIgc3RhcnQtc2VydmVyJyBmYWlsZWQuIik7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBkaXNwbGF5KCInYWRiIHN0YXJ0LXNlcnZlcicgc3VjY2VlZGVkLiIpOyAvLyROT04tTkxTLTEkDQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU3RvcHMgdGhlIGFkYiBob3N0IHNpZGUgc2VydmVyLg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BBZGIoKSB7DQotICAgICAgICBpZiAobUFkYk9zTG9jYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGRpc3BsYXkoIkVycm9yOiBtaXNzaW5nIHBhdGggdG8gQURCLiIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvY2VzcyBwcm9jOw0KLSAgICAgICAgaW50IHN0YXR1cyA9IC0xOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1syXTsNCi0gICAgICAgICAgICBjb21tYW5kWzBdID0gbUFkYk9zTG9jYXRpb247DQotICAgICAgICAgICAgY29tbWFuZFsxXSA9ICJraWxsLXNlcnZlciI7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBwcm9jID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsNCi0gICAgICAgICAgICBzdGF0dXMgPSBwcm9jLndhaXRGb3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgICAgICAvLyB3ZSdsbCByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCi0gICAgICAgICAgICAvLyB3ZSdsbCByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsNCi0gICAgICAgICAgICBkaXNwbGF5KCInYWRiIGtpbGwtc2VydmVyJyBmYWlsZWQgLS0gcnVuIG1hbnVhbGx5IGlmIG5lY2Vzc2FyeS4iKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRpc3BsYXkoIidhZGIga2lsbC1zZXJ2ZXInIHN1Y2NlZWRlZC4iKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgc3RkZXJyL3N0ZG91dCBvdXRwdXRzIG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4NCi0gICAgICogQm90aCA8Yj5tdXN0PC9iPiBiZSByZWFkIG9yIHRoZSBwcm9jZXNzIHdpbGwgYmxvY2sgb24gd2luZG93cy4NCi0gICAgICogQHBhcmFtIHByb2Nlc3MgVGhlIHByb2Nlc3MgdG8gZ2V0IHRoZSBvdXB1dCBmcm9tDQotICAgICAqIEBwYXJhbSBlcnJvck91dHB1dCBUaGUgYXJyYXkgdG8gc3RvcmUgdGhlIHN0ZGVyciBvdXRwdXQuIGNhbm5vdCBiZSBudWxsLg0KLSAgICAgKiBAcGFyYW0gc3RkT3V0cHV0IFRoZSBhcnJheSB0byBzdG9yZSB0aGUgc3Rkb3V0IG91dHB1dC4gY2Fubm90IGJlIG51bGwuDQotICAgICAqIEBwYXJhbSB3YWl0Zm9yUmVhZGVycyBpZiB0cnVlLCB0aGlzIHdpbGwgd2FpdCBmb3IgdGhlIHJlYWRlciB0aHJlYWRzLg0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIHJldHVybiBjb2RlLg0KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBncmFiUHJvY2Vzc091dHB1dChmaW5hbCBQcm9jZXNzIHByb2Nlc3MsIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGVycm9yT3V0cHV0LA0KLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHN0ZE91dHB1dCwgYm9vbGVhbiB3YWl0Zm9yUmVhZGVycykNCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0IGVycm9yT3V0cHV0ICE9IG51bGw7DQotICAgICAgICBhc3NlcnQgc3RkT3V0cHV0ICE9IG51bGw7DQotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MNCi0gICAgICAgIC8vIGJlY2F1c2UgdGhlIHByb2Nlc3MgZmluaXNoZWQNCi0gICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoIiIpIHsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIHRvIHJlYWQgdGhlIHN0ZGVyciBvdXRwdXQNCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsNCi0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgZXJyUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsNCi0NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBlcnJSZWFkZXIucmVhZExpbmUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkoIkFEQiBFcnJvcjogJTEkcyIsIGxpbmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck91dHB1dC5hZGQobGluZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLg0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoIiIpIHsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsNCi0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgb3V0UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsNCi0NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBvdXRSZWFkZXIucmVhZExpbmUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkoIkFEQjogJTEkcyIsIGxpbmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRPdXRwdXQuYWRkKGxpbmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotDQotICAgICAgICB0MS5zdGFydCgpOw0KLSAgICAgICAgdDIuc3RhcnQoKTsNCi0NCi0gICAgICAgIC8vIGl0IGxvb2tzIGxpa2Ugb24gd2luZG93cyBwcm9jZXNzI3dhaXRGb3IoKSBjYW4gcmV0dXJuDQotICAgICAgICAvLyBiZWZvcmUgdGhlIHRocmVhZCBoYXZlIGZpbGxlZCB0aGUgYXJyYXlzLCBzbyB3ZSB3YWl0IGZvciBib3RoIHRocmVhZHMgYW5kIHRoZQ0KLSAgICAgICAgLy8gcHJvY2VzcyBpdHNlbGYuDQotICAgICAgICBpZiAod2FpdGZvclJlYWRlcnMpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICB0MS5qb2luKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICB0Mi5qb2luKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGdldCB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJvY2Vzcw0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3Mud2FpdEZvcigpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BcmNoaXZlSW5mby5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0FyY2hpdmVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzZGM4Y2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0FyY2hpdmVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudHMgYW4gYXJjaGl2ZSB0aGF0IHdlIHdhbnQgdG8gaW5zdGFsbC4NCi0gKiBOb3RlIHRoYXQgdGhlIGluc3RhbGxlciBkZWFscyB3aXRoIGFyY2hpdmVzIHdoZXJlYXMgdGhlIHVzZXIgbW9zdGx5IHNlZXMgcGFja2FnZXMNCi0gKiBidXQgYXMgZmFyIGFzIHdlIGFyZSBjb25jZXJuZWQgZm9yIGluc3RhbGxhdGlvbiB0aGVyZSdzIGEgMS10by0xIG1hcHBpbmcuDQotICogPHAvPg0KLSAqIEEgbmV3IGFyY2hpdmUgaXMgYWx3YXlzIGEgcmVtb3RlIGFyY2hpdmUgdGhhdCBuZWVkcyB0byBiZSBkb3dubG9hZGVkIGFuZCB0aGVuDQotICogaW5zdGFsbGVkLiBJdCBjYW4gcmVwbGFjZSBhbiBleGlzdGluZyBsb2NhbCBvbmUuIEl0IGNhbiBhbHNvIGRlcGVuZHMgb24gYW5vdGhlcg0KLSAqIChuZXcgb3IgbG9jYWwpIGFyY2hpdmUsIHdoaWNoIG1lYW5zIHRoZSBkZXBlbmRlbnQgYXJjaGl2ZSBuZWVkcyB0byBiZSBzdWNjZXNzZnVsbHkNCi0gKiBpbnN0YWxsZWQgZmlyc3QuIEZpbmFsbHkgdGhpcyBhcmNoaXZlIGNhbiBhbHNvIGJlIGEgZGVwZW5kZW5jeSBmb3IgYW5vdGhlciBvbmUuDQotICoNCi0gKiBAc2VlIEFyY2hpdmVJbmZvI0FyY2hpdmVJbmZvKEFyY2hpdmUsIEFyY2hpdmUsIEFyY2hpdmVJbmZvKQ0KLSAqLw0KLWNsYXNzIEFyY2hpdmVJbmZvIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBBcmNoaXZlIG1OZXdBcmNoaXZlOw0KLSAgICBwcml2YXRlIGZpbmFsIEFyY2hpdmUgbVJlcGxhY2VkOw0KLSAgICBwcml2YXRlIGZpbmFsIEFyY2hpdmVJbmZvIG1EZXBlbmRzT247DQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFyY2hpdmVJbmZvPiBtRGVwZW5kZW5jeUZvciA9IG5ldyBBcnJheUxpc3Q8QXJjaGl2ZUluZm8+KCk7DQotICAgIHByaXZhdGUgYm9vbGVhbiBtQWNjZXB0ZWQ7DQotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVqZWN0ZWQ7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmV3QXJjaGl2ZSBBICJuZXcgYXJjaGl2ZSIgdG8gYmUgaW5zdGFsbGVkLiBUaGlzIGlzIGFsd2F5cyBhbiBhcmNoaXZlDQotICAgICAqICAgICAgICAgIHRoYXQgY29tZXMgZnJvbSBhIHJlbW90ZSBzaXRlLiBUaGlzIGNhbiBub3QgYmUgbnVsbC4NCi0gICAgICogQHBhcmFtIHJlcGxhY2VkIEFuIG9wdGlvbmFsIGxvY2FsIGFyY2hpdmUgdGhhdCB0aGUgbmV3IG9uZSB3aWxsIHJlcGxhY2UuDQotICAgICAqICAgICAgICAgIENhbiBiZSBudWxsIGlmIHRoaXMgYXJjaGl2ZSBkb2VzIG5vdCByZXBsYWNlIGFueXRoaW5nLg0KLSAgICAgKiBAcGFyYW0gZGVwZW5kc09uIEFuIG9wdGlvbmFsIG5ldyBvciBsb2NhbCBkZXBlbmRlbmN5LCB0aGF0IGlzIGFuIGFyY2hpdmUgdGhhdA0KLSAgICAgKiAgICAgICAgICA8ZW0+dGhpczwvZW0+IGFyY2hpdmUgZGVwZW5kcyB1cG9uLiBJbiBvdGhlciB3b3Jkcywgd2UgY2FuIG9ubHkgaW5zdGFsbA0KLSAgICAgKiAgICAgICAgICB0aGlzIGFyY2hpdmUgaWYgdGhlIGRlcGVuZGVuY3kgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4gSXQgYWxzbw0KLSAgICAgKiAgICAgICAgICBtZWFucyB3ZSBuZWVkIHRvIGluc3RhbGwgdGhlIGRlcGVuZGVuY3kgZmlyc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJjaGl2ZUluZm8oQXJjaGl2ZSBuZXdBcmNoaXZlLCBBcmNoaXZlIHJlcGxhY2VkLCBBcmNoaXZlSW5mbyBkZXBlbmRzT24pIHsNCi0gICAgICAgIG1OZXdBcmNoaXZlID0gbmV3QXJjaGl2ZTsNCi0gICAgICAgIG1SZXBsYWNlZCA9IHJlcGxhY2VkOw0KLSAgICAgICAgbURlcGVuZHNPbiA9IGRlcGVuZHNPbjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgIm5ldyBhcmNoaXZlIiB0byBiZSBpbnN0YWxsZWQuDQotICAgICAqIFRoaXMgaXMgYWx3YXlzIGFuIGFyY2hpdmUgdGhhdCBjb21lcyBmcm9tIGEgcmVtb3RlIHNpdGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJjaGl2ZSBnZXROZXdBcmNoaXZlKCkgew0KLSAgICAgICAgcmV0dXJuIG1OZXdBcmNoaXZlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGxvY2FsIGFyY2hpdmUgdGhhdCB0aGUgbmV3IG9uZSB3aWxsIHJlcGxhY2UuDQotICAgICAqIENhbiBiZSBudWxsIGlmIHRoaXMgYXJjaGl2ZSBkb2VzIG5vdCByZXBsYWNlIGFueXRoaW5nLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFyY2hpdmUgZ2V0UmVwbGFjZWQoKSB7DQotICAgICAgICByZXR1cm4gbVJlcGxhY2VkOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIG5ldyBvciBsb2NhbCBkZXBlbmRlbmN5LCB0aGF0IGlzIGFuIGFyY2hpdmUgdGhhdCA8ZW0+dGhpczwvZW0+DQotICAgICAqIGFyY2hpdmUgZGVwZW5kcyB1cG9uLiBJbiBvdGhlciB3b3Jkcywgd2UgY2FuIG9ubHkgaW5zdGFsbCB0aGlzIGFyY2hpdmUgaWYgdGhlDQotICAgICAqIGRlcGVuZGVuY3kgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4gSXQgYWxzbyBtZWFucyB3ZSBuZWVkIHRvIGluc3RhbGwgdGhlDQotICAgICAqIGRlcGVuZGVuY3kgZmlyc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJjaGl2ZUluZm8gZ2V0RGVwZW5kc09uKCkgew0KLSAgICAgICAgcmV0dXJuIG1EZXBlbmRzT247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG5ldyBhcmNoaXZlIGlzIGEgZGVwZW5kZW5jeSBmb3IgPGVtPmFub3RoZXI8L2VtPiBvbmUgdGhhdCB3ZQ0KLSAgICAgKiB3YW50IHRvIGluc3RhbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lGb3IoKSB7DQotICAgICAgICByZXR1cm4gbURlcGVuZGVuY3lGb3Iuc2l6ZSgpID4gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhbiB7QGxpbmsgQXJjaGl2ZUluZm99IGZvciB3aGljaCA8ZW0+dGhpczwvZW0+IHBhY2thZ2UgaXMgYSBkZXBlbmRlbmN5Lg0KLSAgICAgKiBUaGlzIG1lYW5zIHRoZSBwYWNrYWdlIGFkZGVkIGhlcmUgZGVwZW5kcyBvbiB0aGlzIHBhY2thZ2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbmN5Rm9yKEFyY2hpdmVJbmZvIGRlcGVuZGVuY3lGb3IpIHsNCi0gICAgICAgIGlmICghbURlcGVuZGVuY3lGb3IuY29udGFpbnMoZGVwZW5kZW5jeUZvcikpIHsNCi0gICAgICAgICAgICBtRGVwZW5kZW5jeUZvci5hZGQoZGVwZW5kZW5jeUZvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248QXJjaGl2ZUluZm8+IGdldERlcGVuZGVuY2llc0ZvcigpIHsNCi0gICAgICAgIHJldHVybiBtRGVwZW5kZW5jeUZvcjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgYXJjaGl2ZSB3YXMgYWNjZXB0ZWQgKGVpdGhlciBtYW51YWxseSBieSB0aGUgdXNlciBvcg0KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIGxpY2Vuc2UpIGZvciBpbnN0YWxsYXRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRlZChib29sZWFuIGFjY2VwdGVkKSB7DQotICAgICAgICBtQWNjZXB0ZWQgPSBhY2NlcHRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYXJjaGl2ZSB3YXMgYWNjZXB0ZWQgKGVpdGhlciBtYW51YWxseSBieSB0aGUgdXNlciBvcg0KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIGxpY2Vuc2UpIGZvciBpbnN0YWxsYXRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGVkKCkgew0KLSAgICAgICAgcmV0dXJuIG1BY2NlcHRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgYXJjaGl2ZSB3YXMgcmVqZWN0ZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIuDQotICAgICAqIEFuIGFyY2hpdmUgY2FuIG5laXRoZXIgYWNjZXB0ZWQgbm9yIHJlamVjdGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmVqZWN0ZWQoYm9vbGVhbiByZWplY3RlZCkgew0KLSAgICAgICAgbVJlamVjdGVkID0gcmVqZWN0ZWQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGFyY2hpdmUgd2FzIHJlamVjdGVkIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLg0KLSAgICAgKiBBbiBhcmNoaXZlIGNhbiBuZWl0aGVyIGFjY2VwdGVkIG5vciByZWplY3RlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVqZWN0ZWQoKSB7DQotICAgICAgICByZXR1cm4gbVJlamVjdGVkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9BdmRNYW5hZ2VyUGFnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0F2ZE1hbmFnZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZDA5OTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0F2ZE1hbmFnZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0cy5BdmRTZWxlY3RvcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0cy5BdmRTZWxlY3Rvci5EaXNwbGF5TW9kZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIucmVwb3NpdG9yeS5VcGRhdGVyV2luZG93LklTZGtMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBdmRNYW5hZ2VyUGFnZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIElTZGtMaXN0ZW5lciB7DQotDQotICAgIHByaXZhdGUgQXZkU2VsZWN0b3IgbUF2ZFNlbGVjdG9yOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFVwZGF0ZXJEYXRhIG1VcGRhdGVyRGF0YTsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSB0aGUgY29tcG9zaXRlLg0KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIGNvbXBvc2l0ZS4NCi0gICAgICogQHBhcmFtIHVwZGF0ZXJEYXRhIEFuIGluc3RhbmNlIG9mIHtAbGluayBVcGRhdGVyRGF0YX0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXZkTWFuYWdlclBhZ2UoQ29tcG9zaXRlIHBhcmVudCwgVXBkYXRlckRhdGEgdXBkYXRlckRhdGEpIHsNCi0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULkJPUkRFUik7DQotDQotICAgICAgICBtVXBkYXRlckRhdGEgPSB1cGRhdGVyRGF0YTsNCi0gICAgICAgIG1VcGRhdGVyRGF0YS5hZGRMaXN0ZW5lcnModGhpcyk7DQotDQotICAgICAgICBjcmVhdGVDb250ZW50cyh0aGlzKTsNCi0gICAgICAgIHBvc3RDcmVhdGUoKTsgIC8vJGhpZGUkDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsNCi0NCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOw0KLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiTGlzdCBvZiBleGlzdGluZyBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlczoiKTsNCi0NCi0gICAgICAgIG1BdmRTZWxlY3RvciA9IG5ldyBBdmRTZWxlY3RvcihwYXJlbnQsDQotICAgICAgICAgICAgICAgIG1VcGRhdGVyRGF0YS5nZXRPc1Nka1Jvb3QoKSwNCi0gICAgICAgICAgICAgICAgbVVwZGF0ZXJEYXRhLmdldEF2ZE1hbmFnZXIoKSwNCi0gICAgICAgICAgICAgICAgRGlzcGxheU1vZGUuTUFOQUdFUik7DQotICAgICAgICBtQXZkU2VsZWN0b3Iuc2V0U2V0dGluZ3NDb250cm9sbGVyKG1VcGRhdGVyRGF0YS5nZXRTZXR0aW5nc0NvbnRyb2xsZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICBtVXBkYXRlckRhdGEucmVtb3ZlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7DQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1YmNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzDQotICAgIH0NCi0NCi0gICAgLy8gLS0gU3RhcnQgb2YgaW50ZXJuYWwgcGFydCAtLS0tLS0tLS0tDQotICAgIC8vIEhpZGUgZXZlcnl0aGluZyBkb3duLWJlbG93IGZyb20gU1dUIGRlc2lnbmVyDQotICAgIC8vJGhpZGU+PiQNCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgcmlnaHQgYWZ0ZXIge0BsaW5rICNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpfS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3N0Q3JlYXRlKCkgew0KLSAgICAgICAgLy8gbm90aGluZyB0byBiZSBkb25lIGZvciBub3cuDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgb25TZGtDaGFuZ2UoKSB7DQotICAgICAgICBtQXZkU2VsZWN0b3IucmVmcmVzaChmYWxzZSAvKnJlbG9hZCovKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBFbmQgb2YgaGlkaW5nIGZyb20gU1dUIERlc2lnbmVyDQotICAgIC8vJGhpZGU8PCQNCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lTZXR0aW5nc1BhZ2UuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9JU2V0dGluZ3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOWM0NzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0lTZXR0aW5nc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IGEgc2V0dGluZ3MgcGFnZSBtdXN0IGltcGxlbWVudC4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElTZXR0aW5nc1BhZ2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSBzeXN0ZW0gc2V0dGluZyBwaWNrZWQgdXAgYnkge0BsaW5rIFVSTH0gZm9yIGh0dHAgcHJveHkgcG9ydC4NCi0gICAgICogVHlwZTogU3RyaW5nLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hUVFBfUFJPWFlfUE9SVCA9ICJodHRwLnByb3h5UG9ydCI7ICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHN5c3RlbSBzZXR0aW5nIHBpY2tlZCB1cCBieSB7QGxpbmsgVVJMfSBmb3IgaHR0cCBwcm94eSBob3N0Lg0KLSAgICAgKiBUeXBlOiBTdHJpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqDQotICAgICAqIFNldHRpbmcgdG8gZm9yY2UgdXNpbmcgaHR0cDovLyBpbnN0ZWFkIG9mIGh0dHBzOi8vIGNvbm5lY3Rpb25zLg0KLSAgICAgKiBUeXBlOiBCb29sZWFuLg0KLSAgICAgKiBEZWZhdWx0OiBGYWxzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GT1JDRV9IVFRQID0gInNka21hbi5mb3JjZS5odHRwIjsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKioNCi0gICAgICogU2V0dGluZyB0byBkaXNwbGF5IG9ubHkgcGFja2FnZXMgdGhhdCBhcmUgbmV3IG9yIHVwZGF0ZXMuDQotICAgICAqIFR5cGU6IEJvb2xlYW4uDQotICAgICAqIERlZmF1bHQ6IFRydWUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hPV19VUERBVEVfT05MWSA9ICJzZGttYW4uc2hvdy51cGRhdGUub25seSI7IC8vJE5PTi1OTFMtMSQNCi0gICAgLyoqDQotICAgICAqIFNldHRpbmcgdG8gYXNrIGZvciBwZXJtaXNzaW9uIGJlZm9yZSByZXN0YXJ0aW5nIEFEQi4NCi0gICAgICogVHlwZTogQm9vbGVhbi4NCi0gICAgICogRGVmYXVsdDogVHJ1ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BU0tfQURCX1JFU1RBUlQgPSAic2RrbWFuLmFzay5hZGIucmVzdGFydCI7ICAgLy8kTk9OLU5MUy0xJA0KLSAgICAvKioNCi0gICAgICogU2V0dGluZyB0byBzZXQgdGhlIGRlbnNpdHkgb2YgdGhlIG1vbml0b3IuDQotICAgICAqIFR5cGU6IEludGVnZXIuDQotICAgICAqIERlZmF1bHQ6IC0xDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTU9OSVRPUl9ERU5TSVRZID0gInNka21hbi5tb25pdG9yLmRlbnNpdHkiOyAvLyROT04tTkxTLTEkDQotDQotICAgIC8qKiBMb2FkcyBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgUHJvcGVydGllc30gY29udGFpbmVyIGFuZCB1cGRhdGUgdGhlIHBhZ2UgVUkuICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvYWRTZXR0aW5ncyhQcm9wZXJ0aWVzIGluX3NldHRpbmdzKTsNCi0NCi0gICAgLyoqIENhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgc2V0dGluZ3MgZnJvbSB0aGUgVUkgYW5kIHN0b3JlIHRoZW0gaW4NCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBQcm9wZXJ0aWVzfSBjb250YWluZXIuICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJldHJpZXZlU2V0dGluZ3MoUHJvcGVydGllcyBvdXRfc2V0dGluZ3MpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBnaXZlIGEgY2FsbGJhY2sgdGhhdCB0aGUgcGFnZSBzaG91bGQgaW52b2tlIHdoZW4NCi0gICAgICogc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TZXR0aW5nc0NoYW5nZWQoU2V0dGluZ3NDaGFuZ2VkQ2FsbGJhY2sgc2V0dGluZ3NDaGFuZ2VkQ2FsbGJhY2spOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGJhY2sgdXNlZCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGFuZCBuZWVkIHRvIGJlDQotICAgICAqIGFwcGxpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNldHRpbmdzQ2hhbmdlZENhbGxiYWNrIHsNCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogSW52b2tlZCBieSB0aGUgc2V0dGluZ3MgcGFnZSB3aGVuIHNldHRpbmdzIGhhdmUgY2hhbmdlZCBhbmQgbmVlZCB0byBiZQ0KLSAgICAgICAgICogYXBwbGllZC4gVGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCB7QGxpbmsgSVNldHRpbmdzUGFnZSNyZXRyaWV2ZVNldHRpbmdzKFByb3BlcnRpZXMpfQ0KLSAgICAgICAgICogYW5kIGFwcGx5IHRoZSBuZXcgc2V0dGluZ3MuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2V0dGluZ3NDaGFuZ2VkKElTZXR0aW5nc1BhZ2UgcGFnZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0xvY2FsUGFja2FnZXNQYWdlLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTG9jYWxQYWNrYWdlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMzYmFhYy4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvTG9jYWxQYWNrYWdlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSURlc2NyaXB0aW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5yZXBvc2l0b3J5LlVwZGF0ZXJXaW5kb3cuSVNka0xpc3RlbmVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0vKg0KLSAqIFRPRE8gbGlzdA0KLSAqIC0gc2VsZWN0ID0+IHVwZGF0ZSBkZXNjLCBlbmFibGUgdXBkYXRlICsgZGVsZXRlLCBlbmFibGUgaG9tZSBwYWdlIGlmIHVybA0KLSAqIC0gaG9tZSBwYWdlIGNhbGxiYWNrDQotICogLSB1cGRhdGUgY2FsbGJhY2sNCi0gKiAtIGRlbGV0ZSBjYWxsYmFjaw0KLSAqIC0gcmVmcmVzaCBjYWxsYmFjaw0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBMb2NhbFBhY2thZ2VzUGFnZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIElTZGtMaXN0ZW5lciB7DQotDQotICAgIHByaXZhdGUgZmluYWwgVXBkYXRlckRhdGEgbVVwZGF0ZXJEYXRhOw0KLQ0KLSAgICBwcml2YXRlIExhYmVsIG1TZGtMb2NMYWJlbDsNCi0gICAgcHJpdmF0ZSBUZXh0IG1TZGtMb2NUZXh0Ow0KLSAgICBwcml2YXRlIEJ1dHRvbiBtU2RrTG9jQnJvd3NlOw0KLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIG1UYWJsZVZpZXdlclBhY2thZ2VzOw0KLSAgICBwcml2YXRlIFRhYmxlIG1UYWJsZVBhY2thZ2VzOw0KLSAgICBwcml2YXRlIFRhYmxlQ29sdW1uIG1Db2x1bW5QYWNrYWdlczsNCi0gICAgcHJpdmF0ZSBHcm91cCBtRGVzY3JpcHRpb25Db250YWluZXI7DQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1Db250YWluZXJCdXR0b25zOw0KLSAgICBwcml2YXRlIEJ1dHRvbiBtVXBkYXRlQnV0dG9uOw0KLSAgICBwcml2YXRlIExhYmVsIG1QbGFjZWhvbGRlcjE7DQotICAgIHByaXZhdGUgQnV0dG9uIG1EZWxldGVCdXR0b247DQotICAgIHByaXZhdGUgTGFiZWwgbVBsYWNlaG9sZGVyMjsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbVJlZnJlc2hCdXR0b247DQotICAgIHByaXZhdGUgTGFiZWwgbURlc2NyaXB0aW9uTGFiZWw7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZS4NCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSBjb21wb3NpdGUuDQotICAgICAqIEBwYXJhbSB1cGRhdGVyRGF0YSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgVXBkYXRlckRhdGF9Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIExvY2FsUGFja2FnZXNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFVwZGF0ZXJEYXRhIHVwZGF0ZXJEYXRhKSB7DQotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5CT1JERVIpOw0KLQ0KLSAgICAgICAgbVVwZGF0ZXJEYXRhID0gdXBkYXRlckRhdGE7DQotDQotICAgICAgICBjcmVhdGVDb250ZW50cyh0aGlzKTsNCi0gICAgICAgIHBvc3RDcmVhdGUoKTsgIC8vJGhpZGUkDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVNka0xvY2F0aW9uKHBhcmVudCk7DQotDQotICAgICAgICBtVGFibGVWaWV3ZXJQYWNrYWdlcyA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOw0KLSAgICAgICAgbVRhYmxlUGFja2FnZXMgPSBtVGFibGVWaWV3ZXJQYWNrYWdlcy5nZXRUYWJsZSgpOw0KLSAgICAgICAgbVRhYmxlUGFja2FnZXMuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIG1UYWJsZVBhY2thZ2VzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMywgMSkpOw0KLSAgICAgICAgbVRhYmxlUGFja2FnZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBvblRyZWVTZWxlY3RlZCgpOyAvLyRoaWRlJA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgbUNvbHVtblBhY2thZ2VzID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVBhY2thZ2VzLCBTV1QuTk9ORSk7DQotICAgICAgICBtQ29sdW1uUGFja2FnZXMuc2V0V2lkdGgoMzc3KTsNCi0gICAgICAgIG1Db2x1bW5QYWNrYWdlcy5zZXRUZXh0KCJJbnN0YWxsZWQgUGFja2FnZXMiKTsNCi0NCi0gICAgICAgIG1EZXNjcmlwdGlvbkNvbnRhaW5lciA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbkNvbnRhaW5lci5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOw0KLSAgICAgICAgbURlc2NyaXB0aW9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDMsIDEpKTsNCi0NCi0gICAgICAgIG1EZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKG1EZXNjcmlwdGlvbkNvbnRhaW5lciwgU1dULk5PTkUpOw0KLSAgICAgICAgbURlc2NyaXB0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoIkxpbmUxXG5MaW5lMlxuTGluZTMiKTsNCi0NCi0gICAgICAgIG1Db250YWluZXJCdXR0b25zID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0gICAgICAgIG1Db250YWluZXJCdXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOw0KLSAgICAgICAgbUNvbnRhaW5lckJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAzLCAxKSk7DQotDQotICAgICAgICBtVXBkYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihtQ29udGFpbmVyQnV0dG9ucywgU1dULk5PTkUpOw0KLSAgICAgICAgbVVwZGF0ZUJ1dHRvbi5zZXRUZXh0KCJVcGRhdGUgQWxsLi4uIik7DQotICAgICAgICBtVXBkYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25VcGRhdGVTZWxlY3RlZCgpOyAgLy8kaGlkZSQgKGhpZGUgZnJvbSBTV1QgZGVzaWduZXIpDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBtUGxhY2Vob2xkZXIxID0gbmV3IExhYmVsKG1Db250YWluZXJCdXR0b25zLCBTV1QuTk9ORSk7DQotICAgICAgICBtUGxhY2Vob2xkZXIxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOw0KLQ0KLSAgICAgICAgbURlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24obUNvbnRhaW5lckJ1dHRvbnMsIFNXVC5OT05FKTsNCi0gICAgICAgIG1EZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7DQotICAgICAgICBtRGVsZXRlQnV0dG9uLnNldFRleHQoIkRlbGV0ZS4uLiIpOw0KLSAgICAgICAgbURlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uRGVsZXRlU2VsZWN0ZWQoKTsgIC8vJGhpZGUkIChoaWRlIGZyb20gU1dUIGRlc2lnbmVyKQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgbVBsYWNlaG9sZGVyMiA9IG5ldyBMYWJlbChtQ29udGFpbmVyQnV0dG9ucywgU1dULk5PTkUpOw0KLSAgICAgICAgbVBsYWNlaG9sZGVyMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsNCi0NCi0gICAgICAgIG1SZWZyZXNoQnV0dG9uID0gbmV3IEJ1dHRvbihtQ29udGFpbmVyQnV0dG9ucywgU1dULk5PTkUpOw0KLSAgICAgICAgbVJlZnJlc2hCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsNCi0gICAgICAgIG1SZWZyZXNoQnV0dG9uLnNldFRleHQoIlJlZnJlc2giKTsNCi0gICAgICAgIG1SZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25SZWZyZXNoU2VsZWN0ZWQoKTsgIC8vJGhpZGUkIChoaWRlIGZyb20gU1dUIGRlc2lnbmVyKQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTZGtMb2NhdGlvbihDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBtU2RrTG9jTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7DQotICAgICAgICBtU2RrTG9jTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsNCi0gICAgICAgIG1TZGtMb2NMYWJlbC5zZXRUZXh0KCJTREsgTG9jYXRpb246Iik7DQotDQotICAgICAgICAvLyBJZiB0aGUgc2RrIHBhdGggaXMgbm90IHVzZXItY3VzdG9taXphYmxlLCBkbyBub3QgY3JlYXRlDQotICAgICAgICAvLyB0aGUgYnJvd3NlIGJ1dHRvbiBhbmQgdXNlIGhvcml6U3Bhbj0yIG9uIHRoZSB0ZXh0IGZpZWxkLg0KLQ0KLSAgICAgICAgbVNka0xvY1RleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOw0KLSAgICAgICAgbVNka0xvY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7DQotDQotICAgICAgICBpZiAobVVwZGF0ZXJEYXRhLmNhblVzZXJDaGFuZ2VTZGtSb290KCkpIHsNCi0gICAgICAgICAgICBtU2RrTG9jQnJvd3NlID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsNCi0gICAgICAgICAgICBtU2RrTG9jQnJvd3NlLnNldFRleHQoIkJyb3dzZS4uLiIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtU2RrTG9jVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7DQotICAgICAgICAgICAgKChHcmlkRGF0YSltU2RrTG9jVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuKys7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobVVwZGF0ZXJEYXRhLmdldE9zU2RrUm9vdCgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtU2RrTG9jVGV4dC5zZXRUZXh0KG1VcGRhdGVyRGF0YS5nZXRPc1Nka1Jvb3QoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICBtVXBkYXRlckRhdGEucmVtb3ZlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7DQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1YmNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzDQotICAgIH0NCi0NCi0gICAgLy8gLS0gU3RhcnQgb2YgaW50ZXJuYWwgcGFydCAtLS0tLS0tLS0tDQotICAgIC8vIEhpZGUgZXZlcnl0aGluZyBkb3duLWJlbG93IGZyb20gU1dUIGRlc2lnbmVyDQotICAgIC8vJGhpZGU+PiQNCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgcmlnaHQgYWZ0ZXIge0BsaW5rICNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpfS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3N0Q3JlYXRlKCkgew0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLmFkZExpc3RlbmVycyh0aGlzKTsNCi0gICAgICAgIGFkanVzdENvbHVtbnNXaWR0aCgpOw0KLSAgICAgICAgdXBkYXRlQnV0dG9uc1N0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byBhZGp1c3QgdGhlIGNvbHVtbnMgd2lkdGggd2hlbiB0aGUgcGFyZW50IGlzIHJlc2l6ZWQuDQotICAgICAqIDxwLz4NCi0gICAgICogSWYgd2UgbmVlZCBzb21ldGhpbmcgbW9yZSBmYW5jeSwgd2UgbWlnaHQgd2FudCB0byB1c2UgdGhpczoNCi0gICAgICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YT92aWV3PWNvDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgYWRqdXN0Q29sdW1uc1dpZHRoKCkgew0KLSAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gcmVzaXplIHRoZSBjb2x1bW4gdG8gdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHRhYmxlDQotICAgICAgICBDb250cm9sQWRhcHRlciByZXNpemVyID0gbmV3IENvbnRyb2xBZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gbVRhYmxlUGFja2FnZXMuZ2V0Q2xpZW50QXJlYSgpOw0KLSAgICAgICAgICAgICAgICBtQ29sdW1uUGFja2FnZXMuc2V0V2lkdGgoci53aWR0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgICAgIG1UYWJsZVBhY2thZ2VzLmFkZENvbnRyb2xMaXN0ZW5lcihyZXNpemVyKTsNCi0gICAgICAgIHJlc2l6ZXIuY29udHJvbFJlc2l6ZWQobnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJ1dHRvbnMgZGVwZW5kaW5nIG9uIGxpc3QgY29udGVudCBhbmQgc2VsZWN0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9uc1N0YXRlKCkgew0KLSAgICAgICAgSVNlbGVjdGlvbiBzZWwgPSBtVGFibGVWaWV3ZXJQYWNrYWdlcy5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgIGJvb2xlYW4gaGFzU2VsZWN0aW9uID0gc2VsICE9IG51bGwgJiYgIXNlbC5pc0VtcHR5KCk7DQotDQotICAgICAgICBtVXBkYXRlQnV0dG9uLnNldEVuYWJsZWQobVRhYmxlUGFja2FnZXMuZ2V0SXRlbUNvdW50KCkgPiAwKTsNCi0gICAgICAgIG1EZWxldGVCdXR0b24uc2V0RW5hYmxlZChoYXNTZWxlY3Rpb24pOw0KLSAgICAgICAgbVJlZnJlc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIHdoZW4gYW4gaXRlbSBpbiB0aGUgcGFja2FnZSB0YWJsZSB2aWV3ZXIgaXMgc2VsZWN0ZWQuDQotICAgICAqIElmIHRoZSBpdGVtcyBpcyBhbiB7QGxpbmsgSURlc2NyaXB0aW9ufSAoYXMgaXQgc2hvdWxkKSwgdGhpcyB3aWxsIGRpc3BsYXkgaXRzIGxvbmcNCi0gICAgICogZGVzY3JpcHRpb24gaW4gdGhlIGRlc2NyaXB0aW9uIGFyZWEuIE90aGVyd2lzZSB3aGVuIHRoZSBpdGVtIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQNCi0gICAgICogdHlwZSBvciB0aGVyZSBpcyBubyBzZWxlY3Rpb24sIGl0IGVtcHRpZXMgdGhlIGRlc2NyaXB0aW9uIGFyZWEuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25UcmVlU2VsZWN0ZWQoKSB7DQotICAgICAgICB1cGRhdGVCdXR0b25zU3RhdGUoKTsNCi0NCi0gICAgICAgIElTZWxlY3Rpb24gc2VsID0gbVRhYmxlVmlld2VyUGFja2FnZXMuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCi0gICAgICAgICAgICBPYmplY3QgZWxlbSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBJRGVzY3JpcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dCgoKElEZXNjcmlwdGlvbikgZWxlbSkuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb25Db250YWluZXIubGF5b3V0KHRydWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbURlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dCgiIik7ICAvLyROT04tTkxTMS0kDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIG9uVXBkYXRlU2VsZWN0ZWQoKSB7DQotICAgICAgICBtVXBkYXRlckRhdGEudXBkYXRlT3JJbnN0YWxsQWxsKG51bGwgLypzZWxlY3RlZEFyY2hpdmVzKi8pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBvbkRlbGV0ZVNlbGVjdGVkKCkgew0KLSAgICAgICAgSVNlbGVjdGlvbiBzZWwgPSBtVGFibGVWaWV3ZXJQYWNrYWdlcy5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KLSAgICAgICAgICAgIE9iamVjdCBlbGVtID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIFBhY2thZ2UpIHsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIkRlbGV0ZSBTREsgUGFja2FnZSI7DQotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgIFBhY2thZ2UgcCA9IChQYWNrYWdlKSBlbGVtOw0KLSAgICAgICAgICAgICAgICBBcmNoaXZlW10gYXJjaGl2ZXMgPSBwLmdldEFyY2hpdmVzKCk7DQotICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlcy5sZW5ndGggPT0gMSAmJiBhcmNoaXZlc1swXSAhPSBudWxsICYmIGFyY2hpdmVzWzBdLmlzTG9jYWwoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQXJjaGl2ZSBhcmNoaXZlID0gYXJjaGl2ZXNbMF07DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3NQYXRoID0gYXJjaGl2ZS5nZXRMb2NhbE9zUGF0aCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShvc1BhdGgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyUxJHMnIGF0ICclMiRzJz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFNob3J0RGVzY3JpcHRpb24oKSwgb3NQYXRoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5kZWxldGVMb2NhbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIGxpc3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZWZyZXNoU2VsZWN0ZWQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkRpcmVjdG9yeSBub3QgZm91bmQgZm9yIHRoaXMgcGFja2FnZSI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJObyBsb2NhbCBhcmNoaXZlIGZvdW5kIGZvciB0aGlzIHBhY2thZ2UiOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgZXJyb3IpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIG9uUmVmcmVzaFNlbGVjdGVkKCkgew0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLnJlbG9hZFNkaygpOw0KLSAgICAgICAgdXBkYXRlQnV0dG9uc1N0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgb25TZGtDaGFuZ2UoKSB7DQotICAgICAgICBMb2NhbFNka0FkYXB0ZXIgbG9jYWxTZGtBZGFwdGVyID0gbVVwZGF0ZXJEYXRhLmdldExvY2FsU2RrQWRhcHRlcigpOw0KLSAgICAgICAgbVRhYmxlVmlld2VyUGFja2FnZXMuc2V0TGFiZWxQcm92aWRlciggIGxvY2FsU2RrQWRhcHRlci5nZXRMYWJlbFByb3ZpZGVyKCkpOw0KLSAgICAgICAgbVRhYmxlVmlld2VyUGFja2FnZXMuc2V0Q29udGVudFByb3ZpZGVyKGxvY2FsU2RrQWRhcHRlci5nZXRDb250ZW50UHJvdmlkZXIoKSk7DQotICAgICAgICBtVGFibGVWaWV3ZXJQYWNrYWdlcy5zZXRJbnB1dChsb2NhbFNka0FkYXB0ZXIpOw0KLSAgICAgICAgb25UcmVlU2VsZWN0ZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBFbmQgb2YgaGlkaW5nIGZyb20gU1dUIERlc2lnbmVyDQotICAgIC8vJGhpZGU8PCQNCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0xvY2FsU2RrQWRhcHRlci5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L0xvY2FsU2RrQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTI0YjQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9Mb2NhbFNka0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSURlc2NyaXB0aW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5SZXBvU291cmNlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Lmljb25zLkltYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotDQotLyoqDQotICogVGFibGUgYWRhcHRlcnMgdG8gdXNlIHRoZSBsb2NhbCBTREsgbGlzdC4NCi0gKi8NCi1jbGFzcyBMb2NhbFNka0FkYXB0ZXIgIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBVcGRhdGVyRGF0YSBtVXBkYXRlckRhdGE7DQotDQotICAgIHB1YmxpYyBMb2NhbFNka0FkYXB0ZXIoVXBkYXRlckRhdGEgdXBkYXRlckRhdGEpIHsNCi0gICAgICAgIG1VcGRhdGVyRGF0YSA9IHVwZGF0ZXJEYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJMYWJlbFByb3ZpZGVyKCk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUNvbnRlbnRQcm92aWRlcigpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgY2xhc3MgVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgew0KLSAgICAgICAgLyoqIFJldHVybnMgYW4gaW1hZ2UgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZWxlbWVudC4gKi8NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7DQotICAgICAgICAgICAgSW1hZ2VGYWN0b3J5IGltZ0ZhY3RvcnkgPSBtVXBkYXRlckRhdGEuZ2V0SW1hZ2VGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgaWYgKGltZ0ZhY3RvcnkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW1nRmFjdG9yeS5nZXRJbWFnZUZvck9iamVjdChlbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHRvU3RyaW5nIG9mIHRoZSBlbGVtZW50LiAqLw0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChJRGVzY3JpcHRpb24pIGVsZW1lbnQpLmdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgY2xhc3MgVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7DQotDQotICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdmlld2VyIGlzIGRpc3Bvc2VkDQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLSAgICAgICAgICAgIC8vIHBhc3MNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBpbnB1dCBpcyBzZXQgb3IgY2hhbmdlZCBvbiB0aGUgcHJvdmlkZXINCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgew0KLSAgICAgICAgICAgIGFzc2VydCBuZXdJbnB1dCA9PSBMb2NhbFNka0FkYXB0ZXIudGhpczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQ2FsbGVkIHRvIGNvbGxlY3QgdGhlIHJvb3QgZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBpbnB1dC4NCi0gICAgICAgICAqIFRoZSBpbnB1dCBoZXJlIGlzIGEge0BsaW5rIExvY2FsU2RrQWRhcHRlcn0gb2JqZWN0LCB0aGlzIHJldHVybnMgYW4gYXJyYXkNCi0gICAgICAgICAqIG9mIHtAbGluayBSZXBvU291cmNlfS4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsNCi0gICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50ID09IExvY2FsU2RrQWRhcHRlci50aGlzKSB7DQotICAgICAgICAgICAgICAgIFBhY2thZ2VbXSBwYWNrYWdlcyA9IG1VcGRhdGVyRGF0YS5nZXRJbnN0YWxsZWRQYWNrYWdlKCk7DQotDQotICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZXM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1JlbW90ZVBhY2thZ2VzUGFnZS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1JlbW90ZVBhY2thZ2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjEzODlmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9SZW1vdGVQYWNrYWdlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuQXJjaGl2ZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSURlc2NyaXB0aW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5SZXBvU291cmNlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5yZXBvc2l0b3J5LlVwZGF0ZXJXaW5kb3cuSVNka0xpc3RlbmVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBSZW1vdGVQYWNrYWdlc1BhZ2UgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBJU2RrTGlzdGVuZXIgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFVwZGF0ZXJEYXRhIG1VcGRhdGVyRGF0YTsNCi0NCi0gICAgcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgbVRyZWVWaWV3ZXJTb3VyY2VzOw0KLSAgICBwcml2YXRlIFRyZWUgbVRyZWVTb3VyY2VzOw0KLSAgICBwcml2YXRlIFRyZWVDb2x1bW4gbUNvbHVtblNvdXJjZTsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbVVwZGF0ZU9ubHlDaGVja0JveDsNCi0gICAgcHJpdmF0ZSBHcm91cCBtRGVzY3JpcHRpb25Db250YWluZXI7DQotICAgIHByaXZhdGUgQnV0dG9uIG1BZGRTaXRlQnV0dG9uOw0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGVsZXRlU2l0ZUJ1dHRvbjsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbVJlZnJlc2hCdXR0b247DQotICAgIHByaXZhdGUgQnV0dG9uIG1JbnN0YWxsU2VsZWN0ZWRCdXR0b247DQotICAgIHByaXZhdGUgTGFiZWwgbURlc2NyaXB0aW9uTGFiZWw7DQotDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZS4NCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSBjb21wb3NpdGUuDQotICAgICAqIEBwYXJhbSB1cGRhdGVyRGF0YSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgVXBkYXRlckRhdGF9Lg0KLSAgICAgKi8NCi0gICAgUmVtb3RlUGFja2FnZXNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFVwZGF0ZXJEYXRhIHVwZGF0ZXJEYXRhKSB7DQotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5CT1JERVIpOw0KLQ0KLSAgICAgICAgbVVwZGF0ZXJEYXRhID0gdXBkYXRlckRhdGE7DQotDQotICAgICAgICBjcmVhdGVDb250ZW50cyh0aGlzKTsNCi0gICAgICAgIHBvc3RDcmVhdGUoKTsgIC8vJGhpZGUkDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsNCi0NCi0gICAgICAgIG1UcmVlVmlld2VyU291cmNlcyA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSKTsNCi0gICAgICAgIG1UcmVlVmlld2VyU291cmNlcy5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICBvblRyZWVDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7IC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICBtVHJlZVNvdXJjZXMgPSBtVHJlZVZpZXdlclNvdXJjZXMuZ2V0VHJlZSgpOw0KLSAgICAgICAgbVRyZWVTb3VyY2VzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25UcmVlU2VsZWN0ZWQoKTsgLy8kaGlkZSQNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICAgIG1UcmVlU291cmNlcy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOw0KLSAgICAgICAgbVRyZWVTb3VyY2VzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgNSwgMSkpOw0KLQ0KLSAgICAgICAgbUNvbHVtblNvdXJjZSA9IG5ldyBUcmVlQ29sdW1uKG1UcmVlU291cmNlcywgU1dULk5PTkUpOw0KLSAgICAgICAgbUNvbHVtblNvdXJjZS5zZXRXaWR0aCgyODkpOw0KLSAgICAgICAgbUNvbHVtblNvdXJjZS5zZXRUZXh0KCJTaXRlcywgUGFja2FnZXMgYW5kIEFyY2hpdmVzIik7DQotDQotICAgICAgICBtRGVzY3JpcHRpb25Db250YWluZXIgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7DQotICAgICAgICBtRGVzY3JpcHRpb25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7DQotICAgICAgICBtRGVzY3JpcHRpb25Db250YWluZXIuc2V0VGV4dCgiRGVzY3JpcHRpb24iKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgNSwgMSkpOw0KLQ0KLSAgICAgICAgbURlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwobURlc2NyaXB0aW9uQ29udGFpbmVyLCBTV1QuTk9ORSk7DQotICAgICAgICBtRGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsNCi0gICAgICAgIG1EZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoIkxpbmUxXG5MaW5lMlxuTGluZTMiKTsNCi0NCi0gICAgICAgIG1BZGRTaXRlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsNCi0gICAgICAgIG1BZGRTaXRlQnV0dG9uLnNldFRleHQoIkFkZCBTaXRlLi4uIik7DQotICAgICAgICBtQWRkU2l0ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dCgiQWxsb3dzIHlvdSB0byBlbnRlciBhIG5ldyB1c2VyIGV4dGVybmFsIHNpdGUuICIgKw0KLSAgICAgICAgICAgICAgICAiU3VjaCBzaXRlIGNhbiBvbmx5IGNvbnRyaWJ1dGUgYWRkLW9ucyBhbmQgZXh0cmEgcGFja2FnZXMuIik7DQotICAgICAgICBtQWRkU2l0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uQWRkU2l0ZVNlbGVjdGVkKCk7IC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBtRGVsZXRlU2l0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7DQotICAgICAgICBtRGVsZXRlU2l0ZUJ1dHRvbi5zZXRUZXh0KCJEZWxldGUgU2l0ZS4uLiIpOw0KLSAgICAgICAgbURlbGV0ZVNpdGVCdXR0b24uc2V0VG9vbFRpcFRleHQoIkFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIGV4dGVybmFsIHNpdGUuICIgKw0KLSAgICAgICAgICAgICAgICAiQnVpbHQtaW4gc2l0ZXMgY2Fubm90IGJlIHJlbW92ZWQuIik7DQotICAgICAgICBtRGVsZXRlU2l0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uUmVtb3ZlU2l0ZVNlbGVjdGVkKCk7IC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBtVXBkYXRlT25seUNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7DQotICAgICAgICBtVXBkYXRlT25seUNoZWNrQm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7DQotICAgICAgICBtVXBkYXRlT25seUNoZWNrQm94LnNldFRleHQoIkRpc3BsYXkgdXBkYXRlcyBvbmx5Iik7DQotICAgICAgICBtVXBkYXRlT25seUNoZWNrQm94LnNldFRvb2xUaXBUZXh0KCJXaGVuIHNlbGVjdGVkLCBvbmx5IGNvbXBhdGlibGUgdXBkYXRlIHBhY2thZ2VzIGFyZSBzaG93biBpbiB0aGUgbGlzdCBhYm92ZS4iKTsNCi0gICAgICAgIG1VcGRhdGVPbmx5Q2hlY2tCb3guc2V0U2VsZWN0aW9uKG1VcGRhdGVyRGF0YS5nZXRTZXR0aW5nc0NvbnRyb2xsZXIoKS5nZXRTaG93VXBkYXRlT25seSgpKTsNCi0gICAgICAgIG1VcGRhdGVPbmx5Q2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgew0KLSAgICAgICAgICAgICAgICBvblNob3dVcGRhdGVPbmx5KCk7IC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBtUmVmcmVzaEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7DQotICAgICAgICBtUmVmcmVzaEJ1dHRvbi5zZXRUZXh0KCJSZWZyZXNoIik7DQotICAgICAgICBtUmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dCgiUmVmcmVzaGVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gb3BlbiBzaXRlcy4iKTsNCi0gICAgICAgIG1SZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25SZWZyZXNoU2VsZWN0ZWQoKTsgLy8kaGlkZSQNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIG1JbnN0YWxsU2VsZWN0ZWRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOw0KLSAgICAgICAgbUluc3RhbGxTZWxlY3RlZEJ1dHRvbi5zZXRUZXh0KCJJbnN0YWxsIFNlbGVjdGVkIik7DQotICAgICAgICBtSW5zdGFsbFNlbGVjdGVkQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJBbGxvd3MgeW91IHRvIHJldmlldyBhbGwgc2VsZWN0ZWQgcGFja2FnZXMgIiArDQotICAgICAgICAgICAgICAgICJhbmQgaW5zdGFsbCB0aGVtLiIpOw0KLSAgICAgICAgbUluc3RhbGxTZWxlY3RlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uSW5zdGFsbFNlbGVjdGVkQXJjaGl2ZXMoKTsgIC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICBtVXBkYXRlckRhdGEucmVtb3ZlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICBzdXBlci5kaXNwb3NlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7DQotICAgICAgICAvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1YmNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzDQotICAgIH0NCi0NCi0gICAgLy8gLS0gU3RhcnQgb2YgaW50ZXJuYWwgcGFydCAtLS0tLS0tLS0tDQotICAgIC8vIEhpZGUgZXZlcnl0aGluZyBkb3duLWJlbG93IGZyb20gU1dUIGRlc2lnbmVyDQotICAgIC8vJGhpZGU+PiQNCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgcmlnaHQgYWZ0ZXIge0BsaW5rICNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpfS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3N0Q3JlYXRlKCkgew0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLmFkZExpc3RlbmVycyh0aGlzKTsNCi0gICAgICAgIGFkanVzdENvbHVtbnNXaWR0aCgpOw0KLSAgICAgICAgdXBkYXRlQnV0dG9uc1N0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byBhZGp1c3QgdGhlIGNvbHVtbnMgd2lkdGggd2hlbiB0aGUgcGFyZW50IGlzIHJlc2l6ZWQuDQotICAgICAqIDxwLz4NCi0gICAgICogSWYgd2UgbmVlZCBzb21ldGhpbmcgbW9yZSBmYW5jeSwgd2UgbWlnaHQgd2FudCB0byB1c2UgdGhpczoNCi0gICAgICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YT92aWV3PWNvDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgYWRqdXN0Q29sdW1uc1dpZHRoKCkgew0KLSAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gcmVzaXplIHRoZSBjb2x1bW4gdG8gdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHRhYmxlDQotICAgICAgICBDb250cm9sQWRhcHRlciByZXNpemVyID0gbmV3IENvbnRyb2xBZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gbVRyZWVTb3VyY2VzLmdldENsaWVudEFyZWEoKTsNCi0gICAgICAgICAgICAgICAgbUNvbHVtblNvdXJjZS5zZXRXaWR0aChyLndpZHRoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgbVRyZWVTb3VyY2VzLmFkZENvbnRyb2xMaXN0ZW5lcihyZXNpemVyKTsNCi0gICAgICAgIHJlc2l6ZXIuY29udHJvbFJlc2l6ZWQobnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaW4gdGhlIHBhY2thZ2UgdGFibGUgdmlld2VyIGlzIHNlbGVjdGVkLg0KLSAgICAgKiBJZiB0aGUgaXRlbXMgaXMgYW4ge0BsaW5rIElEZXNjcmlwdGlvbn0gKGFzIGl0IHNob3VsZCksIHRoaXMgd2lsbCBkaXNwbGF5IGl0cyBsb25nDQotICAgICAqIGRlc2NyaXB0aW9uIGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLiBPdGhlcndpc2Ugd2hlbiB0aGUgaXRlbSBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkDQotICAgICAqIHR5cGUgb3IgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBpdCBlbXB0aWVzIHRoZSBkZXNjcmlwdGlvbiBhcmVhLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIG9uVHJlZVNlbGVjdGVkKCkgew0KLSAgICAgICAgdXBkYXRlQnV0dG9uc1N0YXRlKCk7DQotDQotICAgICAgICBJU2VsZWN0aW9uIHNlbCA9IG1UcmVlVmlld2VyU291cmNlcy5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikgew0KLSAgICAgICAgICAgIE9iamVjdCBlbGVtID0gKChJVHJlZVNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgew0KLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KCgoSURlc2NyaXB0aW9uKSBlbGVtKS5nZXRMb25nRGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbkNvbnRhaW5lci5sYXlvdXQodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtRGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KCIiKTsgIC8vJE5PTi1OTFMxLSQNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSGFuZGxlIGNoZWNraW5nIGFuZCB1bmNoZWNraW5nIG9mIHRoZSB0cmVlIGl0ZW1zLg0KLSAgICAgKg0KLSAgICAgKiBXaGVuIHVuY2hlY2tpbmcsIGFsbCBzdWItdHJlZSBpdGVtcyBjaGVja2JveGVzIGFyZSBjbGVhcmVkIHRvby4NCi0gICAgICogV2hlbiBjaGVja2luZyBhIHNvdXJjZSwgYWxsIG9mIGl0cyBwYWNrYWdlcyBhcmUgY2hlY2tlZCB0b28uDQotICAgICAqIFdoZW4gY2hlY2tpbmcgYSBwYWNrYWdlLCBvbmx5IGl0cyBjb21wYXRpYmxlIGFyY2hpdmVzIGFyZSBjaGVja2VkLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIG9uVHJlZUNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgIHVwZGF0ZUJ1dHRvbnNTdGF0ZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBiID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOw0KLSAgICAgICAgT2JqZWN0IGVsZW0gPSBldmVudC5nZXRFbGVtZW50KCk7IC8vIFdpbGwgYmUgQXJjaGl2ZSBvciBQYWNrYWdlIG9yIFJlcG9Tb3VyY2UNCi0NCi0gICAgICAgIGFzc2VydCBldmVudC5nZXRTb3VyY2UoKSA9PSBtVHJlZVZpZXdlclNvdXJjZXM7DQotDQotICAgICAgICAvLyB3aGVuIGRlc2VsZWN0aW5nLCB3ZSBqdXN0IGRlc2VsZWN0IGFsbCBjaGlsZHJlbiB0b28NCi0gICAgICAgIGlmIChiID09IGZhbHNlKSB7DQotICAgICAgICAgICAgbVRyZWVWaWV3ZXJTb3VyY2VzLnNldFN1YnRyZWVDaGVja2VkKGVsZW0sIGIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0NCi0gICAgICAgICAgICAoSVRyZWVDb250ZW50UHJvdmlkZXIpIG1UcmVlVmlld2VyU291cmNlcy5nZXRDb250ZW50UHJvdmlkZXIoKTsNCi0NCi0gICAgICAgIC8vIFdoZW4gc2VsZWN0aW5nLCB3ZSB3YW50IHRvIG9ubHkgc2VsZWN0IGNvbXBhdGlibGUgYXJjaGl2ZXMuDQotICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIFJlcG9Tb3VyY2UpIHsNCi0gICAgICAgICAgICBtVHJlZVZpZXdlclNvdXJjZXMuc2V0RXhwYW5kZWRTdGF0ZShlbGVtLCB0cnVlKTsNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBwa2cgOiBwcm92aWRlci5nZXRDaGlsZHJlbihlbGVtKSkgew0KLSAgICAgICAgICAgICAgICBtVHJlZVZpZXdlclNvdXJjZXMuc2V0Q2hlY2tlZChwa2csIHRydWUpOw0KLSAgICAgICAgICAgICAgICBzZWxlY3RDb21wYXRpYmxlQXJjaGl2ZXMocGtnLCBwcm92aWRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUGFja2FnZSkgew0KLSAgICAgICAgICAgIHNlbGVjdENvbXBhdGlibGVBcmNoaXZlcyhlbGVtLCBwcm92aWRlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdENvbXBhdGlibGVBcmNoaXZlcyhPYmplY3QgcGtnLCBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgew0KLSAgICAgICAgZm9yIChPYmplY3QgYXJjaGl2ZSA6IHByb3ZpZGVyLmdldENoaWxkcmVuKHBrZykpIHsNCi0gICAgICAgICAgICBpZiAoYXJjaGl2ZSBpbnN0YW5jZW9mIEFyY2hpdmUpIHsNCi0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXJTb3VyY2VzLnNldENoZWNrZWQoYXJjaGl2ZSwgKChBcmNoaXZlKSBhcmNoaXZlKS5pc0NvbXBhdGlibGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBvblNob3dVcGRhdGVPbmx5KCkgew0KLSAgICAgICAgU2V0dGluZ3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtVXBkYXRlckRhdGEuZ2V0U2V0dGluZ3NDb250cm9sbGVyKCk7DQotICAgICAgICBjb250cm9sbGVyLnNldFNob3dVcGRhdGVPbmx5KG1VcGRhdGVPbmx5Q2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOw0KLSAgICAgICAgY29udHJvbGxlci5zYXZlU2V0dGluZ3MoKTsNCi0NCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBzZWxlY3RlZCBhcmNoaXZlcw0KLSAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmU+IGFyY2hpdmVzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlPigpOw0KLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IG1UcmVlVmlld2VyU291cmNlcy5nZXRDaGVja2VkRWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJjaGl2ZSkgew0KLSAgICAgICAgICAgICAgICBhcmNoaXZlcy5hZGQoKEFyY2hpdmUpIGVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBEZXNlbGVjdCB0aGVtIGFsbA0KLSAgICAgICAgICAgIG1UcmVlVmlld2VyU291cmNlcy5zZXRDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1UcmVlVmlld2VyU291cmNlcy5yZWZyZXNoKCk7DQotDQotICAgICAgICAvLyBOb3cgcmVzZWxlY3QgdGhvc2UgdGhhdCBzdGlsbCBleGlzdCBpbiB0aGUgdHJlZSBidXQgb25seSBpZiB0aGV5DQotICAgICAgICAvLyBhcmUgY29tcGF0aWJsZSBhcmNoaXZlcw0KLSAgICAgICAgZm9yIChBcmNoaXZlIGEgOiBhcmNoaXZlcykgew0KLSAgICAgICAgICAgIGlmIChhLmlzQ29tcGF0aWJsZSgpICYmIG1UcmVlVmlld2VyU291cmNlcy5zZXRDaGVja2VkKGEsIHRydWUpKSB7DQotICAgICAgICAgICAgICAgIC8vIElmIHdlIG1hbmFnZWQgdG8gc2VsZWN0IHRoZSBhcmNoaXZlLCBhbHNvIHNlbGVjdCB0aGUgcGFyZW50IHBhY2thZ2UuDQotICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBvbmx5IHNlbGVjdCB0aGUgcGFyZW50IHBhY2thZ2UgaWYgKmFsbCogdGhlDQotICAgICAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgYXJjaGl2ZXMgY2hpbGRyZW4gYXJlIHNlbGVjdGVkLiBJbiBwcmFjdGljZSB3ZSdsbCByYXJlbHkNCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBtb3JlIHRoYW4gb25lIGNvbXBhdGlibGUgYXJjaGl2ZSBwZXIgcGFja2FnZS4NCi0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXJTb3VyY2VzLnNldENoZWNrZWQoYS5nZXRQYXJlbnRQYWNrYWdlKCksIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHVwZGF0ZUJ1dHRvbnNTdGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBvbkluc3RhbGxTZWxlY3RlZEFyY2hpdmVzKCkgew0KLSAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmU+IGFyY2hpdmVzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlPigpOw0KLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IG1UcmVlVmlld2VyU291cmNlcy5nZXRDaGVja2VkRWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJjaGl2ZSkgew0KLSAgICAgICAgICAgICAgICBhcmNoaXZlcy5hZGQoKEFyY2hpdmUpIGVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtVXBkYXRlckRhdGEgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1VcGRhdGVyRGF0YS51cGRhdGVPckluc3RhbGxBbGwoYXJjaGl2ZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBvbkFkZFNpdGVTZWxlY3RlZCgpIHsNCi0NCi0gICAgICAgIGZpbmFsIFJlcG9Tb3VyY2VbXSBrbm93U291cmNlcyA9IG1VcGRhdGVyRGF0YS5nZXRTb3VyY2VzKCkuZ2V0U291cmNlcygpOw0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIkFkZCBTaXRlIFVSTCI7DQotICAgICAgICBTdHJpbmcgbXNnID0gIlBsZWFzZSBlbnRlciB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5LnhtbCBmb3IgdGhlIG5ldyBzaXRlOiI7DQotDQotICAgICAgICBJbnB1dERpYWxvZyBkbGcgPSBuZXcgSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZywgbnVsbCwgbmV3IElJbnB1dFZhbGlkYXRvcigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG5ld1RleHQgPT0gbnVsbCB8fCBuZXdUZXh0Lmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGxlYXNlIGVudGVyIGFuIFVSTC4iOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIEEgVVJMIHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByZWZpeGVzDQotICAgICAgICAgICAgICAgIGlmICghbmV3VGV4dC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAhbmV3VGV4dC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICFuZXdUZXh0LnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICFuZXdUZXh0LnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiVGhlIFVSTCBtdXN0IHN0YXJ0IGJ5IG9uZSBvZiBmaWxlOi8vLCBmdHA6Ly8sIGh0dHA6Ly8gb3IgaHR0cHM6Ly8iOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIFJlamVjdCBVUkxzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHNvdXJjZSBsaXN0DQotICAgICAgICAgICAgICAgIGZvciAoUmVwb1NvdXJjZSBzIDoga25vd1NvdXJjZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdUZXh0LmVxdWFscyhzLmdldFVybCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVGhpcyBzaXRlIGlzIGFscmVhZHkgbGlzdGVkLiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsNCi0gICAgICAgICAgICBTdHJpbmcgdXJsID0gZGxnLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgbVVwZGF0ZXJEYXRhLmdldFNvdXJjZXMoKS5hZGQobmV3IFJlcG9Tb3VyY2UodXJsLCB0cnVlIC8qdXNlclNvdXJjZSovKSk7DQotICAgICAgICAgICAgb25SZWZyZXNoU2VsZWN0ZWQoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgb25SZW1vdmVTaXRlU2VsZWN0ZWQoKSB7DQotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsNCi0NCi0gICAgICAgIElTZWxlY3Rpb24gc2VsID0gbVRyZWVWaWV3ZXJTb3VyY2VzLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgaWYgKG1VcGRhdGVyRGF0YSAhPSBudWxsICYmIHNlbCBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7DQotICAgICAgICAgICAgZm9yIChPYmplY3QgYyA6ICgoSVRyZWVTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBSZXBvU291cmNlICYmICgoUmVwb1NvdXJjZSkgYykuaXNVc2VyU291cmNlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFJlcG9Tb3VyY2Ugc291cmNlID0gKFJlcG9Tb3VyY2UpIGM7DQotDQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiRGVsZXRlIFNpdGU/IjsNCi0NCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzaXRlICclMSRzJz8iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0VXJsKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksIHRpdGxlLCBtc2cpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZXJEYXRhLmdldFNvdXJjZXMoKS5yZW1vdmUoc291cmNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjaGFuZ2VkKSB7DQotICAgICAgICAgICAgb25SZWZyZXNoU2VsZWN0ZWQoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgb25SZWZyZXNoU2VsZWN0ZWQoKSB7DQotICAgICAgICBpZiAobVVwZGF0ZXJEYXRhICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtVXBkYXRlckRhdGEucmVmcmVzaFNvdXJjZXMoZmFsc2UgLypmb3JjZUZldGNoaW5nKi8pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbVRyZWVWaWV3ZXJTb3VyY2VzLnJlZnJlc2goKTsNCi0gICAgICAgIHVwZGF0ZUJ1dHRvbnNTdGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIG9uU2RrQ2hhbmdlKCkgew0KLSAgICAgICAgUmVwb1NvdXJjZXNBZGFwdGVyIHNvdXJjZXMgPSBtVXBkYXRlckRhdGEuZ2V0U291cmNlc0FkYXB0ZXIoKTsNCi0gICAgICAgIG1UcmVlVmlld2VyU291cmNlcy5zZXRDb250ZW50UHJvdmlkZXIoc291cmNlcy5nZXRDb250ZW50UHJvdmlkZXIoKSk7DQotICAgICAgICBtVHJlZVZpZXdlclNvdXJjZXMuc2V0TGFiZWxQcm92aWRlciggIHNvdXJjZXMuZ2V0TGFiZWxQcm92aWRlcigpKTsNCi0gICAgICAgIG1UcmVlVmlld2VyU291cmNlcy5zZXRJbnB1dChzb3VyY2VzKTsNCi0gICAgICAgIG9uVHJlZVNlbGVjdGVkKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnNTdGF0ZSgpIHsNCi0gICAgICAgIC8vIFdlIGluc3RhbGwgYXJjaGl2ZXMsIHNvIHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgY2hlY2tlZCBhcmNoaXZlLg0KLSAgICAgICAgLy8gSGF2aW5nIHNpdGVzIG9yIHBhY2thZ2VzIGNoZWNrZWQgZG9lcyBub3QgY291bnQuDQotICAgICAgICBib29sZWFuIGhhc0NoZWNrZWRBcmNoaXZlID0gZmFsc2U7DQotICAgICAgICBPYmplY3RbXSBjaGVja2VkID0gbVRyZWVWaWV3ZXJTb3VyY2VzLmdldENoZWNrZWRFbGVtZW50cygpOw0KLSAgICAgICAgaWYgKGNoZWNrZWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGMgOiBjaGVja2VkKSB7DQotICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgQXJjaGl2ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaGFzQ2hlY2tlZEFyY2hpdmUgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJcyB0aGVyZSBhIHNlbGVjdGVkIHNpdGUgU291cmNlPw0KLSAgICAgICAgYm9vbGVhbiBoYXNTZWxlY3RlZFVzZXJTb3VyY2UgPSBmYWxzZTsNCi0gICAgICAgIElTZWxlY3Rpb24gc2VsID0gbVRyZWVWaWV3ZXJTb3VyY2VzLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7DQotICAgICAgICAgICAgZm9yIChPYmplY3QgYyA6ICgoSVRyZWVTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBSZXBvU291cmNlICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKChSZXBvU291cmNlKSBjKS5pc1VzZXJTb3VyY2UoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRVc2VyU291cmNlID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbUFkZFNpdGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIG1EZWxldGVTaXRlQnV0dG9uLnNldEVuYWJsZWQoaGFzU2VsZWN0ZWRVc2VyU291cmNlKTsNCi0gICAgICAgIG1SZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7DQotICAgICAgICBtSW5zdGFsbFNlbGVjdGVkQnV0dG9uLnNldEVuYWJsZWQoaGFzQ2hlY2tlZEFyY2hpdmUpOw0KLQ0KLSAgICAgICAgLy8gc2V0IHZhbHVlIG9uIHRoZSBzaG93IG9ubHkgdXBkYXRlIGNoZWNrYm94DQotICAgICAgICBtVXBkYXRlT25seUNoZWNrQm94LnNldFNlbGVjdGlvbihtVXBkYXRlckRhdGEuZ2V0U2V0dGluZ3NDb250cm9sbGVyKCkuZ2V0U2hvd1VwZGF0ZU9ubHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy8gRW5kIG9mIGhpZGluZyBmcm9tIFNXVCBEZXNpZ25lcg0KLSAgICAvLyRoaWRlPDwkDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9SZXBvU291cmNlc0FkYXB0ZXIuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9SZXBvU291cmNlc0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFmYTljMS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvUmVwb1NvdXJjZXNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmU7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklEZXNjcmlwdGlvbjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2s7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklUYXNrTW9uaXRvcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUmVwb1NvdXJjZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUGFja2FnZS5VcGRhdGVJbmZvOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Lmljb25zLkltYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQSBsaXN0IG9mIHNkay1yZXBvc2l0b3J5IHNvdXJjZXMuDQotICoNCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIFVJIGRlcGVuZGVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVwb1NvdXJjZXNBZGFwdGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBVcGRhdGVyRGF0YSBtVXBkYXRlckRhdGE7DQotDQotICAgIC8qKg0KLSAgICAgKiBBIGR1bW15IFJlcG9Tb3VyY2UgZW50cnkgcmV0dXJuZWQgZm9yIHNvdXJjZXMgd2hpY2ggaGFkIGxvYWQgZXJyb3JzLg0KLSAgICAgKiBJdCBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIGVycm9yIGFzIGl0cyBzaG9ydCBkZXNjcmlwdGlvbiBvcg0KLSAgICAgKiBpdCBkaXNwbGF5cyB0aGUgc291cmNlJ3MgbG9uZyBkZXNjcmlwdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVwb1NvdXJjZUVycm9yIGltcGxlbWVudHMgSURlc2NyaXB0aW9uIHsNCi0NCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVwb1NvdXJjZSBtU291cmNlOw0KLQ0KLSAgICAgICAgcHVibGljIFJlcG9Tb3VyY2VFcnJvcihSZXBvU291cmNlIHNvdXJjZSkgew0KLSAgICAgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVNvdXJjZS5nZXRMb25nRGVzY3JpcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVNvdXJjZS5nZXRGZXRjaEVycm9yKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEEgZHVtbXkgUmVwb1NvdXJjZSBlbnRyeSByZXR1cm5lZCBmb3Igc291cmNlcyB3aXRoIG5vIHBhY2thZ2VzLg0KLSAgICAgKiBXZSBuZWVkIHRoYXQgdG8gZm9yY2UgdGhlIFNXVCB0cmVlIHRvIGRpc3BsYXkgYW4gb3Blbi9jbG9zZSB0cmlhbmdsZQ0KLSAgICAgKiBldmVuIGZvciBlbXB0eSBzb3VyY2VzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXBvU291cmNlRW1wdHkgaW1wbGVtZW50cyBJRGVzY3JpcHRpb24gew0KLQ0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXBvU291cmNlIG1Tb3VyY2U7DQotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUVtcHR5QmVjYXVzZU9mVXBkYXRlT25seTsNCi0NCi0gICAgICAgIHB1YmxpYyBSZXBvU291cmNlRW1wdHkoUmVwb1NvdXJjZSBzb3VyY2UsIGJvb2xlYW4gZW1wdHlCZWNhdXNlT2ZVcGRhdGVPbmx5KSB7DQotICAgICAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsNCi0gICAgICAgICAgICBtRW1wdHlCZWNhdXNlT2ZVcGRhdGVPbmx5ID0gZW1wdHlCZWNhdXNlT2ZVcGRhdGVPbmx5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1Tb3VyY2UuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKSB7DQotICAgICAgICAgICAgaWYgKG1FbXB0eUJlY2F1c2VPZlVwZGF0ZU9ubHkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJTb21lIHBhY2thZ2VzIHdlcmUgZm91bmQgYnV0IGFyZSBub3QgY29tcGF0aWJsZSB1cGRhdGVzLiI7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJObyBwYWNrYWdlcyBmb3VuZCI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXBvU291cmNlc0FkYXB0ZXIoVXBkYXRlckRhdGEgdXBkYXRlckRhdGEpIHsNCi0gICAgICAgIG1VcGRhdGVyRGF0YSA9IHVwZGF0ZXJEYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJMYWJlbFByb3ZpZGVyKCk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ29udGVudFByb3ZpZGVyKCk7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgY2xhc3MgVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgew0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgYW4gaW1hZ2UgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZWxlbWVudC4gKi8NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7DQotDQotICAgICAgICAgICAgSW1hZ2VGYWN0b3J5IGltZ0ZhY3RvcnkgPSBtVXBkYXRlckRhdGEuZ2V0SW1hZ2VGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgaWYgKGltZ0ZhY3RvcnkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW1nRmFjdG9yeS5nZXRJbWFnZUZvck9iamVjdChlbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIFJldHVybnMgdGhlIHRvU3RyaW5nIG9mIHRoZSBlbGVtZW50LiAqLw0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChJRGVzY3JpcHRpb24pIGVsZW1lbnQpLmdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0gICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSB2aWV3ZXIgaXMgZGlzcG9zZWQNCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICAgICAgLy8gcGFzcw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGlucHV0IGlzIHNldCBvciBjaGFuZ2VkIG9uIHRoZSBwcm92aWRlcg0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7DQotICAgICAgICAgICAgYXNzZXJ0IG5ld0lucHV0ID09IFJlcG9Tb3VyY2VzQWRhcHRlci50aGlzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBDYWxsZWQgdG8gY29sbGVjdCB0aGUgcm9vdCBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGlucHV0Lg0KLSAgICAgICAgICogVGhlIGlucHV0IGhlcmUgaXMgYSB7QGxpbmsgUmVwb1NvdXJjZXNBZGFwdGVyfSBvYmplY3QsIHRoaXMgcmV0dXJucyBhbiBhcnJheQ0KLSAgICAgICAgICogb2Yge0BsaW5rIFJlcG9Tb3VyY2V9Lg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBHZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBwYXJlbnQuIFRoaXMgaXMgcmVxdWVzdGVkIG9uLWRlbWFuZCBhcw0KLSAgICAgICAgICogbm9kZXMgYXJlIGV4cGFuZGVkLg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEZvciBhIHtAbGluayBSZXBvU291cmNlc0FkYXB0ZXJ9IG9iamVjdCwgcmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgUmVwb1NvdXJjZX1zLg0KLSAgICAgICAgICogRm9yIGEge0BsaW5rIFJlcG9Tb3VyY2V9LCByZXR1cm5zIGFuIGFycmF5IG9mIHtAbGluayBQYWNrYWdlfXMuDQotICAgICAgICAgKiBGb3IgYSB7QGxpbmsgUGFja2FnZX0sIHJldHVybnMgYW4gYXJyYXkgb2Yge0BsaW5rIEFyY2hpdmV9cy4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7DQotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gUmVwb1NvdXJjZXNBZGFwdGVyLnRoaXMpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1VcGRhdGVyRGF0YS5nZXRTb3VyY2VzKCkuZ2V0U291cmNlcygpOw0KLQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9Tb3VyY2UpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlcG9Tb3VyY2VDaGlsZHJlbigoUmVwb1NvdXJjZSkgcGFyZW50RWxlbWVudCk7DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUNoaWxkcmVuKChQYWNrYWdlKSBwYXJlbnRFbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZm9yIHRoaXMgcmVwbyBzb3VyY2UsIGV2ZW50dWFsbHkgZmlsdGVyZWQgdG8gZGlzcGxheQ0KLSAgICAgICAgICogb25seSB1cGRhdGUgcGFja2FnZXMuIElmIHRoZSBsaXN0IGlzIGVtcHR5LCByZXR1cm5zIGEgc3BlY2lmaWMgZW1wdHkgbm9kZS4gSWYgdGhlcmUncw0KLSAgICAgICAgICogYW4gZXJyb3IsIHJldHVybnMgYSBzcGVjaWZpYyBlcnJvciBub2RlLg0KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIE9iamVjdFtdIGdldFJlcG9Tb3VyY2VDaGlsZHJlbihmaW5hbCBSZXBvU291cmNlIHNvdXJjZSkgew0KLSAgICAgICAgICAgIFBhY2thZ2VbXSBwYWNrYWdlcyA9IHNvdXJjZS5nZXRQYWNrYWdlcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlcyA9PSBudWxsICYmIHNvdXJjZS5nZXRGZXRjaEVycm9yKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZvcmNlSHR0cCA9IG1VcGRhdGVyRGF0YS5nZXRTZXR0aW5nc0NvbnRyb2xsZXIoKS5nZXRGb3JjZUh0dHAoKTsNCi0NCi0gICAgICAgICAgICAgICAgbVVwZGF0ZXJEYXRhLmdldFRhc2tGYWN0b3J5KCkuc3RhcnQoIkxvYWRpbmcgU291cmNlIiwgbmV3IElUYXNrKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElUYXNrTW9uaXRvciBtb25pdG9yKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmxvYWQobW9uaXRvciwgZm9yY2VIdHRwKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgICAgIHBhY2thZ2VzID0gc291cmNlLmdldFBhY2thZ2VzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gd2FzRW1wdHlCZWZvcmVGaWx0ZXIgPSAocGFja2FnZXMgPT0gbnVsbCB8fCBwYWNrYWdlcy5sZW5ndGggPT0gMCk7DQotDQotICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBvbmx5IHRoZSBwYWNrYWdlcyB0aGF0IGFyZSBuZXcvdXBncmFkZS4NCi0gICAgICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCAmJiBtVXBkYXRlckRhdGEuZ2V0U2V0dGluZ3NDb250cm9sbGVyKCkuZ2V0U2hvd1VwZGF0ZU9ubHkoKSkgew0KLSAgICAgICAgICAgICAgICBwYWNrYWdlcyA9IGZpbHRlcmVkUGFja2FnZXMocGFja2FnZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCAmJiBwYWNrYWdlcy5sZW5ndGggPT0gMCkgew0KLSAgICAgICAgICAgICAgICBwYWNrYWdlcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlcyA9PSBudWxsICYmIHNvdXJjZS5nZXRGZXRjaEVycm9yKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBkdW1teSBlbnRyeSB0byBkaXNwbGF5IHRoZSBmZXRjaCBlcnJvcg0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IFJlcG9Tb3VyY2VFcnJvcihzb3VyY2UpIH07DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEVpdGhlciByZXR1cm4gYSBub24tbnVsbCBwYWNrYWdlIGxpc3Qgb3IgY3JlYXRlIGEgbmV3IGVtcHR5IG5vZGUNCi0gICAgICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZXM7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBSZXBvU291cmNlRW1wdHkoc291cmNlLCAhd2FzRW1wdHlCZWZvcmVGaWx0ZXIpIH0gOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhcmNoaXZlcyBmb3IgdGhlIGdpdmVuIHBhY2thZ2UsIGV2ZW50dWFsbHkgZmlsdGVyaW5nIGl0DQotICAgICAgICAgKiB0byBvbmx5IHNob3cgdGhlIGNvbXBhdGlibGUgYXJjaGl2ZXMuDQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgT2JqZWN0W10gZ2V0UGFja2FnZUNoaWxkcmVuKFBhY2thZ2UgcGtnKSB7DQotICAgICAgICAgICAgQXJjaGl2ZVtdIGFyY2hpdmVzID0gcGtnLmdldEFyY2hpdmVzKCk7DQotICAgICAgICAgICAgaWYgKG1VcGRhdGVyRGF0YS5nZXRTZXR0aW5nc0NvbnRyb2xsZXIoKS5nZXRTaG93VXBkYXRlT25seSgpKSB7DQotICAgICAgICAgICAgICAgIGZvciAoQXJjaGl2ZSBhcmNoaXZlIDogYXJjaGl2ZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG9ubHkgd2FudCB0aGUgY29tcGF0aWJsZSBhcmNoaXZlcywgdGhlbiB3ZSBqdXN0IHRha2UgdGhlIGZpcnN0DQotICAgICAgICAgICAgICAgICAgICAvLyBvbmUuIGl0J3MgdW5saWtlbHkgdGhlcmUgYXJlIDIgY29tcGF0aWJsZSBhcmNoaXZlcyBmb3IgdGhlIHNhbWUNCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhY2thZ2UNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlLmlzQ29tcGF0aWJsZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IGFyY2hpdmUgfTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gYXJjaGl2ZXM7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGVsZW1lbnQuDQotICAgICAgICAgKiBUaGUgaW5wdXQge0BsaW5rIFJlcG9Tb3VyY2VzQWRhcHRlcn0gaXMgdGhlIHBhcmVudCBvZiBhbGwge0BsaW5rIFJlcG9Tb3VyY2V9IGVsZW1lbnRzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgew0KLQ0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVwb1NvdXJjZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVwb1NvdXJjZXNBZGFwdGVyLnRoaXM7DQotDQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChQYWNrYWdlKSBlbGVtZW50KS5nZXRQYXJlbnRTb3VyY2UoKTsNCi0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcmNoaXZlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmUpIGVsZW1lbnQpLmdldFBhcmVudFBhY2thZ2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLCB3aGljaCBpcyB1c2VkIHRvIGRpc3BsYXkgYQ0KLSAgICAgICAgICogIisvZXhwYW5kIiBib3ggbmV4dCB0byB0aGUgdHJlZSBub2RlLg0KLSAgICAgICAgICogQWxsIHtAbGluayBSZXBvU291cmNlfSBhbmQge0BsaW5rIFBhY2thZ2V9IGFyZSBleHBhbmRhYmxlLCB3aGV0aGVyIHRoZXkgYWN0dWFsbHkNCi0gICAgICAgICAqIGhhdmUgYW55IGNoaWxkcmVuIG9yIG5vdC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIFJlcG9Tb3VyY2UgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFBhY2thZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZpbHRlcnMgb3V0IGEgbGlzdCBvZiByZW1vdGUgcGFja2FnZXMgdG8gb25seSBrZWVwIHRoZSBvbmVzIHRoYXQgYXJlIGVpdGhlciBuZXcgb3INCi0gICAgICogdXBkYXRlcyBvZiBleGlzdGluZyBwYWNrYWdlLg0KLSAgICAgKiBAcGFyYW0gcmVtb3RlUGFja2FnZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gZmlsdGVyLg0KLSAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgKGJ1dCBtYXliZSBlbXB0eSkgbGlzdCBvZiBuZXcgb3IgdXBkYXRlIHBhY2thZ2VzLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBQYWNrYWdlW10gZmlsdGVyZWRQYWNrYWdlcyhQYWNrYWdlW10gcmVtb3RlUGFja2FnZXMpIHsNCi0gICAgICAgIC8vIGdldCB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzDQotICAgICAgICBQYWNrYWdlW10gaW5zdGFsbGVkUGFja2FnZXMgPSBtVXBkYXRlckRhdGEuZ2V0SW5zdGFsbGVkUGFja2FnZSgpOw0KLQ0KLSAgICAgICAgQXJyYXlMaXN0PFBhY2thZ2U+IGZpbHRlcmVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZT4oKTsNCi0NCi0gICAgICAgIC8vIGZvciBlYWNoIHJlbW90ZSBwYWNrYWdlcywgd2UgbG9vayBmb3IgYW4gZXhpc3RpbmcgdmVyc2lvbi4NCi0gICAgICAgIC8vIElmIG5vIGV4aXN0aW5nIHZlcnNpb24gLT4gYWRkIHRvIHRoZSBsaXN0DQotICAgICAgICAvLyBpZiBleGlzdGluZyB2ZXJzaW9uIGJ1dCB3aXRoIG9sZGVyIHJldmlzaW9uIC0+IGFkZCBpdCB0byB0aGUgbGlzdA0KLSAgICAgICAgZm9yIChQYWNrYWdlIHJlbW90ZVBrZyA6IHJlbW90ZVBhY2thZ2VzKSB7DQotICAgICAgICAgICAgYm9vbGVhbiBuZXdQa2cgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgIC8vIEZvciBhbGwgcG90ZW50aWFsIHBhY2thZ2VzLCB3ZSBhbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgYW4gYXJjaGl2ZSBmb3IgdGhlIGN1cnJlbnQNCi0gICAgICAgICAgICAvLyBwbGF0Zm9ybSwgb3Igd2Ugc2ltcGx5IHNraXAgdGhlbS4NCi0gICAgICAgICAgICBpZiAocmVtb3RlUGtnLmhhc0NvbXBhdGlibGVBcmNoaXZlKCkpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChQYWNrYWdlIGluc3RhbGxlZFBrZyA6IGluc3RhbGxlZFBhY2thZ2VzKSB7DQotICAgICAgICAgICAgICAgICAgICBVcGRhdGVJbmZvIGluZm8gPSBpbnN0YWxsZWRQa2cuY2FuQmVVcGRhdGVkQnkocmVtb3RlUGtnKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvID09IFVwZGF0ZUluZm8uVVBEQVRFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRMaXN0LmFkZChyZW1vdGVQa2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BrZyA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB0aGVyZSBzaG91bGRuJ3QgYmUgMiByZXZpc2lvbnMgb2YgdGhlIHNhbWUgcGFja2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvICE9IFVwZGF0ZUluZm8uSU5DT01QQVRJQkxFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGtnID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHRoZXJlIHNob3VsZG4ndCBiZSAyIHJldmlzaW9ucyBvZiB0aGUgc2FtZSBwYWNrYWdlDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBub3QgZm91bmQgdGhlIHNhbWUgcGFja2FnZSwgdGhlbiB3ZSBhZGQgaXQgKGl0J3MgYSBuZXcgcGFja2FnZSkNCi0gICAgICAgICAgICAgICAgaWYgKG5ld1BrZykgew0KLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRMaXN0LmFkZChyZW1vdGVQa2cpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZpbHRlcmVkTGlzdC50b0FycmF5KG5ldyBQYWNrYWdlW2ZpbHRlcmVkTGlzdC5zaXplKCldKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvU2V0dGluZ3NDb250cm9sbGVyLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvU2V0dGluZ3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNzkzZTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1NldHRpbmdzQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb247DQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbi5BbmRyb2lkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLQ0KLS8qKg0KLSAqIENvbnRyb2xsZXIgY2xhc3MgdG8gZ2V0IHNldHRpbmdzIHZhbHVlcy4gU2V0dGluZ3MgYXJlIGtlcHQgaW4tbWVtb3J5Lg0KLSAqIFVzZXJzIG9mIHRoaXMgY2xhc3MgbXVzdCBmaXJzdCBsb2FkIHRoZSBzZXR0aW5ncyBiZWZvcmUgY2hhbmdpbmcgdGhlbSBhbmQgc2F2ZQ0KLSAqIHRoZW0gd2hlbiBtb2RpZmllZC4NCi0gKiA8cC8+DQotICogU2V0dGluZ3MgYXJlIGVudW1lcmF0ZWQgYnkgY29uc3RhbnRzIGluIHtAbGluayBJU2V0dGluZ3NQYWdlfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2V0dGluZ3NDb250cm9sbGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX0ZJTEVOQU1FID0gImFuZHJvaWR0b29sLmNmZyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIG1Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsNCi0NCi0gICAgcHJpdmF0ZSBJU2V0dGluZ3NQYWdlIG1TZXR0aW5nc1BhZ2U7DQotDQotICAgIHByaXZhdGUgZmluYWwgVXBkYXRlckRhdGEgbVVwZGF0ZXJEYXRhOw0KLQ0KLSAgICBwdWJsaWMgU2V0dGluZ3NDb250cm9sbGVyKFVwZGF0ZXJEYXRhIHVwZGF0ZXJEYXRhKSB7DQotICAgICAgICBtVXBkYXRlckRhdGEgPSB1cGRhdGVyRGF0YTsNCi0gICAgfQ0KLQ0KLSAgICAvLy0tLSBBY2Nlc3MgdG8gc2V0dGluZ3MgLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIElTZXR0aW5nc1BhZ2UjS0VZX0ZPUkNFX0hUVFB9IHNldHRpbmcuDQotICAgICAqIEBzZWUgSVNldHRpbmdzUGFnZSNLRVlfRk9SQ0VfSFRUUA0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VIdHRwKCkgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKG1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KElTZXR0aW5nc1BhZ2UuS0VZX0ZPUkNFX0hUVFApKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHtAbGluayBJU2V0dGluZ3NQYWdlI0tFWV9BU0tfQURCX1JFU1RBUlR9IHNldHRpbmcuDQotICAgICAqIEBzZWUgSVNldHRpbmdzUGFnZSNLRVlfQVNLX0FEQl9SRVNUQVJUDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBc2tCZWZvcmVBZGJSZXN0YXJ0KCkgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSVNldHRpbmdzUGFnZS5LRVlfQVNLX0FEQl9SRVNUQVJUKTsNCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIElTZXR0aW5nc1BhZ2UjS0VZX1NIT1dfVVBEQVRFX09OTFl9IHNldHRpbmcuDQotICAgICAqIEBzZWUgSVNldHRpbmdzUGFnZSNLRVlfU0hPV19VUERBVEVfT05MWQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1VwZGF0ZU9ubHkoKSB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShJU2V0dGluZ3NQYWdlLktFWV9TSE9XX1VQREFURV9PTkxZKTsNCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIElTZXR0aW5nc1BhZ2UjS0VZX1NIT1dfVVBEQVRFX09OTFl9IHNldHRpbmcuDQotICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgb25seSBjb21wYXRpYmxlIHVwZGF0ZSBpdGVtcyBzaG91bGQgYmUgc2hvd24uDQotICAgICAqIEBzZWUgSVNldHRpbmdzUGFnZSNLRVlfU0hPV19VUERBVEVfT05MWQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd1VwZGF0ZU9ubHkoYm9vbGVhbiBlbmFibGVkKSB7DQotICAgICAgICBzZXRTZXR0aW5nKElTZXR0aW5nc1BhZ2UuS0VZX1NIT1dfVVBEQVRFX09OTFksIGVuYWJsZWQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIElTZXR0aW5nc1BhZ2UjS0VZX01PTklUT1JfREVOU0lUWX0gc2V0dGluZw0KLSAgICAgKiBAc2VlIElTZXR0aW5nc1BhZ2UjS0VZX01PTklUT1JfREVOU0lUWQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGludCBnZXRNb25pdG9yRGVuc2l0eSgpIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KElTZXR0aW5nc1BhZ2UuS0VZX01PTklUT1JfREVOU0lUWSwgbnVsbCk7DQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOw0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgSVNldHRpbmdzUGFnZSNLRVlfTU9OSVRPUl9ERU5TSVRZfSBzZXR0aW5nLg0KLSAgICAgKiBAcGFyYW0gZGVuc2l0eSB0aGUgZGVuc2l0eSBvZiB0aGUgbW9uaXRvcg0KLSAgICAgKiBAc2VlIElTZXR0aW5nc1BhZ2UjS0VZX01PTklUT1JfREVOU0lUWQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TW9uaXRvckRlbnNpdHkoaW50IGRlbnNpdHkpIHsNCi0gICAgICAgIG1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KElTZXR0aW5nc1BhZ2UuS0VZX01PTklUT1JfREVOU0lUWSwgSW50ZWdlci50b1N0cmluZyhkZW5zaXR5KSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEludGVybmFsIGhlbHBlciB0byBzZXQgYSBib29sZWFuIHNldHRpbmcuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc2V0U2V0dGluZyhTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7DQotICAgICAgICBtUHJvcGVydGllcy5zZXRQcm9wZXJ0eShrZXksIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvLy0tLSBDb250cm9sbGVyIG1ldGhvZHMgLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXNzb2NpYXRlIHRoZSBnaXZlbiB7QGxpbmsgSVNldHRpbmdzUGFnZX0gd2l0aCB0aGlzIHtAbGluayBTZXR0aW5nc0NvbnRyb2xsZXJ9Lg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIGxvYWRzIHRoZSBjdXJyZW50IHByb3BlcnRpZXMgaW50byB0aGUgc2V0dGluZyBwYWdlIFVJLg0KLSAgICAgKiBJdCB0aGVuIGFzc29jaWF0ZXMgdGhlIFNldHRpbmdzQ2hhbmdlZCBjYWxsYmFjayB3aXRoIHRoaXMgY29udHJvbGxlci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFNldHRpbmdzUGFnZShJU2V0dGluZ3NQYWdlIHNldHRpbmdzUGFnZSkgew0KLQ0KLSAgICAgICAgbVNldHRpbmdzUGFnZSA9IHNldHRpbmdzUGFnZTsNCi0gICAgICAgIG1TZXR0aW5nc1BhZ2UubG9hZFNldHRpbmdzKG1Qcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIHNldHRpbmdzUGFnZS5zZXRPblNldHRpbmdzQ2hhbmdlZChuZXcgSVNldHRpbmdzUGFnZS5TZXR0aW5nc0NoYW5nZWRDYWxsYmFjaygpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldHRpbmdzQ2hhbmdlZChJU2V0dGluZ3NQYWdlIHBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgU2V0dGluZ3NDb250cm9sbGVyLnRoaXMub25TZXR0aW5nc0NoYW5nZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9hZCBzZXR0aW5ncyBmcm9tIHRoZSBzZXR0aW5ncyBmaWxlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbG9hZFNldHRpbmdzKCkgew0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7DQotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXIgPSBBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCk7DQotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZm9sZGVyLCBTRVRUSU5HU19GSUxFTkFNRSk7DQotICAgICAgICAgICAgcGF0aCA9IGYuZ2V0UGF0aCgpOw0KLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7DQotICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7DQotDQotICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLmxvYWQoZmlzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gUHJvcGVybHkgcmVmb3JtYXQgc29tZSBzZXR0aW5ncyB0byBlbmZvcmNlIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlbiBtaXNzaW5nLg0KLSAgICAgICAgICAgICAgICBzZXRTaG93VXBkYXRlT25seShnZXRTaG93VXBkYXRlT25seSgpKTsNCi0gICAgICAgICAgICAgICAgc2V0U2V0dGluZyhJU2V0dGluZ3NQYWdlLktFWV9BU0tfQURCX1JFU1RBUlQsIGdldEFza0JlZm9yZUFkYlJlc3RhcnQoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBJU2RrTG9nIGxvZyA9IG1VcGRhdGVyRGF0YS5nZXRTZGtMb2coKTsNCi0gICAgICAgICAgICBpZiAobG9nICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUsICJGYWlsZWQgdG8gbG9hZCBzZXR0aW5ncyBmcm9tICclMSRzJyIsIHBhdGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTYXZlcyBzZXR0aW5ncyB0byB0aGUgc2V0dGluZ3MgZmlsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNhdmVTZXR0aW5ncygpIHsNCi0NCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIGZvbGRlciA9IEFuZHJvaWRMb2NhdGlvbi5nZXRGb2xkZXIoKTsNCi0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmb2xkZXIsIFNFVFRJTkdTX0ZJTEVOQU1FKTsNCi0gICAgICAgICAgICBwYXRoID0gZi5nZXRQYXRoKCk7DQotDQotICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7DQotDQotICAgICAgICAgICAgbVByb3BlcnRpZXMuc3RvcmUoIGZvcywgIiMjIFNldHRpbmdzIGZvciBBbmRyb2lkIFRvb2wiKTsgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgSVNka0xvZyBsb2cgPSBtVXBkYXRlckRhdGEuZ2V0U2RrTG9nKCk7DQotDQotICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCAiRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3MgYXQgJyUxJHMnIiwgcGF0aCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGVub3VnaCB0aGF0IHdlIHdhbnQgdG8gcmVhbGx5IG5hZyB0aGUgdXNlciBhYm91dCBpdA0KLSAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgIHJlYXNvbiA9ICJGaWxlIG5vdCBmb3VuZCI7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgIHJlYXNvbiA9ICIuYW5kcm9pZCBmb2xkZXIgbm90IGZvdW5kLCBwbGVhc2UgZGVmaW5lIEFORFJPSURfU0RLX0hPTUUiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZWFzb24gPSBTdHJpbmcuZm9ybWF0KCIlMSRzOiAlMiRzIiwgZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG1VcGRhdGVyRGF0YS5nZXRXaW5kb3dTaGVsbCgpLA0KLSAgICAgICAgICAgICAgICAgICAgIlNESyBNYW5hZ2VyIFNldHRpbmdzIiwNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBBbmRyb2lkIFNESyBhbmQgQVZEIE1hbmFnZXIgZmFpbGVkIHRvIHNhdmUgaXRzIHNldHRpbmdzICglMSRzKSBhdCAlMiRzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sIHBhdGgpKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXaGVuIHNldHRpbmdzIGhhdmUgY2hhbmdlZDogcmV0cmlldmUgdGhlIG5ldyBzZXR0aW5ncywgYXBwbHkgdGhlbSBhbmQgc2F2ZSB0aGVtLg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIHVwZGF0ZXMgSmF2YSBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIEhUVFAgcHJveHkuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25TZXR0aW5nc0NoYW5nZWQoKSB7DQotICAgICAgICBpZiAobVNldHRpbmdzUGFnZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbVNldHRpbmdzUGFnZS5yZXRyaWV2ZVNldHRpbmdzKG1Qcm9wZXJ0aWVzKTsNCi0gICAgICAgIGFwcGx5U2V0dGluZ3MoKTsNCi0gICAgICAgIHNhdmVTZXR0aW5ncygpOw0KLQ0KLSAgICAgICAgLy8gSW4gY2FzZSB0aGUgSFRUUC9IVFRQUyBzZXR0aW5nIGNoYW5nZSwgZm9yY2Ugc291cmNlcyB0byBiZSByZWxvYWRlZA0KLSAgICAgICAgLy8gKHRoaXMgb25seSByZWZyZXNoZXMgc291cmNlcyB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHRyaWVkIHRvIG9wZW4uKQ0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLnJlZnJlc2hTb3VyY2VzKGZhbHNlIC8qZm9yY2VGZXRjaGluZyovKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXBwbGllcyB0aGUgY3VycmVudCBzZXR0aW5ncy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFwcGx5U2V0dGluZ3MoKSB7DQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsNCi0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KElTZXR0aW5nc1BhZ2UuS0VZX0hUVFBfUFJPWFlfSE9TVCwNCi0gICAgICAgICAgICAgICAgbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSVNldHRpbmdzUGFnZS5LRVlfSFRUUF9QUk9YWV9IT1NULCAiIikpOyAvLyROT04tTkxTLTEkDQotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShJU2V0dGluZ3NQYWdlLktFWV9IVFRQX1BST1hZX1BPUlQsDQotICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KElTZXR0aW5nc1BhZ2UuS0VZX0hUVFBfUFJPWFlfUE9SVCwgIiIpKTsgICAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZUNob29zZXJEaWFsb2cuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9VcGRhdGVDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMTM5ZGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZUNob29zZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9VcGRhdGVyRGF0YS5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkNmM2ZTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnk7DQotDQotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbi5BbmRyb2lkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JU2RrTG9nOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrTWFuYWdlcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BZGRvblBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmU7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklUYXNrOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5JVGFza0ZhY3Rvcnk7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklUYXNrTW9uaXRvcjsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuTG9jYWxTZGtQYXJzZXI7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlJlcG9Tb3VyY2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlJlcG9Tb3VyY2VzOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5Ub29sUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5pY29ucy5JbWFnZUZhY3Rvcnk7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLnJlcG9zaXRvcnkuVXBkYXRlcldpbmRvdy5JU2RrTGlzdGVuZXI7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotDQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotDQotLyoqDQotICogRGF0YSBzaGFyZWQgYmV0d2VlbiB7QGxpbmsgVXBkYXRlcldpbmRvd0ltcGx9IGFuZCBpdHMgcGFnZXMuDQotICovDQotY2xhc3MgVXBkYXRlckRhdGEgew0KLSAgICBwcml2YXRlIFN0cmluZyBtT3NTZGtSb290Ow0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIElTZGtMb2cgbVNka0xvZzsNCi0gICAgcHJpdmF0ZSBJVGFza0ZhY3RvcnkgbVRhc2tGYWN0b3J5Ow0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJDYW5DaGFuZ2VTZGtSb290Ow0KLQ0KLSAgICBwcml2YXRlIFNka01hbmFnZXIgbVNka01hbmFnZXI7DQotICAgIHByaXZhdGUgQXZkTWFuYWdlciBtQXZkTWFuYWdlcjsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NhbFNka1BhcnNlciBtTG9jYWxTZGtQYXJzZXIgPSBuZXcgTG9jYWxTZGtQYXJzZXIoKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXBvU291cmNlcyBtU291cmNlcyA9IG5ldyBSZXBvU291cmNlcygpOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIExvY2FsU2RrQWRhcHRlciBtTG9jYWxTZGtBZGFwdGVyID0gbmV3IExvY2FsU2RrQWRhcHRlcih0aGlzKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXBvU291cmNlc0FkYXB0ZXIgbVNvdXJjZXNBZGFwdGVyID0gbmV3IFJlcG9Tb3VyY2VzQWRhcHRlcih0aGlzKTsNCi0NCi0gICAgcHJpdmF0ZSBJbWFnZUZhY3RvcnkgbUltYWdlRmFjdG9yeTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXR0aW5nc0NvbnRyb2xsZXIgbVNldHRpbmdzQ29udHJvbGxlcjsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SVNka0xpc3RlbmVyPiBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2RrTGlzdGVuZXI+KCk7DQotDQotICAgIHByaXZhdGUgU2hlbGwgbVdpbmRvd1NoZWxsOw0KLQ0KLSAgICBwdWJsaWMgVXBkYXRlckRhdGEoU3RyaW5nIG9zU2RrUm9vdCwgSVNka0xvZyBzZGtMb2cpIHsNCi0gICAgICAgIG1Pc1Nka1Jvb3QgPSBvc1Nka1Jvb3Q7DQotICAgICAgICBtU2RrTG9nID0gc2RrTG9nOw0KLQ0KLSAgICAgICAgbVNldHRpbmdzQ29udHJvbGxlciA9IG5ldyBTZXR0aW5nc0NvbnRyb2xsZXIodGhpcyk7DQotDQotICAgICAgICBpbml0U2RrKCk7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0gZ2V0dGVycywgc2V0dGVycyAtLS0tDQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9zU2RrUm9vdChTdHJpbmcgb3NTZGtSb290KSB7DQotICAgICAgICBpZiAobU9zU2RrUm9vdCA9PSBudWxsIHx8IG1Pc1Nka1Jvb3QuZXF1YWxzKG9zU2RrUm9vdCkgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICBtT3NTZGtSb290ID0gb3NTZGtSb290Ow0KLSAgICAgICAgICAgIGluaXRTZGsoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9zU2RrUm9vdCgpIHsNCi0gICAgICAgIHJldHVybiBtT3NTZGtSb290Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tGYWN0b3J5KElUYXNrRmFjdG9yeSB0YXNrRmFjdG9yeSkgew0KLSAgICAgICAgbVRhc2tGYWN0b3J5ID0gdGFza0ZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElUYXNrRmFjdG9yeSBnZXRUYXNrRmFjdG9yeSgpIHsNCi0gICAgICAgIHJldHVybiBtVGFza0ZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VXNlckNhbkNoYW5nZVNka1Jvb3QoYm9vbGVhbiB1c2VyQ2FuQ2hhbmdlU2RrUm9vdCkgew0KLSAgICAgICAgbVVzZXJDYW5DaGFuZ2VTZGtSb290ID0gdXNlckNhbkNoYW5nZVNka1Jvb3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY2FuVXNlckNoYW5nZVNka1Jvb3QoKSB7DQotICAgICAgICByZXR1cm4gbVVzZXJDYW5DaGFuZ2VTZGtSb290Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXBvU291cmNlcyBnZXRTb3VyY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIG1Tb3VyY2VzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXBvU291cmNlc0FkYXB0ZXIgZ2V0U291cmNlc0FkYXB0ZXIoKSB7DQotICAgICAgICByZXR1cm4gbVNvdXJjZXNBZGFwdGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFNka1BhcnNlciBnZXRMb2NhbFNka1BhcnNlcigpIHsNCi0gICAgICAgIHJldHVybiBtTG9jYWxTZGtQYXJzZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsU2RrQWRhcHRlciBnZXRMb2NhbFNka0FkYXB0ZXIoKSB7DQotICAgICAgICByZXR1cm4gbUxvY2FsU2RrQWRhcHRlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSVNka0xvZyBnZXRTZGtMb2coKSB7DQotICAgICAgICByZXR1cm4gbVNka0xvZzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZUZhY3RvcnkoSW1hZ2VGYWN0b3J5IGltYWdlRmFjdG9yeSkgew0KLSAgICAgICAgbUltYWdlRmFjdG9yeSA9IGltYWdlRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VGYWN0b3J5IGdldEltYWdlRmFjdG9yeSgpIHsNCi0gICAgICAgIHJldHVybiBtSW1hZ2VGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZGtNYW5hZ2VyIGdldFNka01hbmFnZXIoKSB7DQotICAgICAgICByZXR1cm4gbVNka01hbmFnZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEF2ZE1hbmFnZXIgZ2V0QXZkTWFuYWdlcigpIHsNCi0gICAgICAgIHJldHVybiBtQXZkTWFuYWdlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0dGluZ3NDb250cm9sbGVyIGdldFNldHRpbmdzQ29udHJvbGxlcigpIHsNCi0gICAgICAgIHJldHVybiBtU2V0dGluZ3NDb250cm9sbGVyOw0KLSAgICB9DQotDQotICAgIC8qKiBBZGRzIGEgbGlzdGVuZXIgKHtAbGluayBJU2RrTGlzdGVuZXJ9KSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIFNESyBpcyByZWxvYWRlZC4gKi8NCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKElTZGtMaXN0ZW5lciBsaXN0ZW5lcikgew0KLSAgICAgICAgaWYgKG1MaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKiBSZW1vdmVzIGEgbGlzdGVuZXIgKHtAbGluayBJU2RrTGlzdGVuZXJ9KSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIFNESyBpcyByZWxvYWRlZC4gKi8NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVNka0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V2luZG93U2hlbGwoU2hlbGwgd2luZG93U2hlbGwpIHsNCi0gICAgICAgIG1XaW5kb3dTaGVsbCA9IHdpbmRvd1NoZWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTaGVsbCBnZXRXaW5kb3dTaGVsbCgpIHsNCi0gICAgICAgIHJldHVybiBtV2luZG93U2hlbGw7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0NCi0NCi0gICAgLyoqDQotICAgICAqIEluaXRpYWxpemVzIHRoZSB7QGxpbmsgU2RrTWFuYWdlcn0gYW5kIHRoZSB7QGxpbmsgQXZkTWFuYWdlcn0uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFNkaygpIHsNCi0gICAgICAgIG1TZGtNYW5hZ2VyID0gU2RrTWFuYWdlci5jcmVhdGVNYW5hZ2VyKG1Pc1Nka1Jvb3QsIG1TZGtMb2cpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBtQXZkTWFuYWdlciA9IG51bGw7IC8vIHJlbW92ZSB0aGUgb2xkIG9uZSBpZiBuZWVkZWQuDQotICAgICAgICAgICAgbUF2ZE1hbmFnZXIgPSBuZXcgQXZkTWFuYWdlcihtU2RrTWFuYWdlciwgbVNka0xvZyk7DQotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIG1TZGtMb2cuZXJyb3IoZSwgIlVuYWJsZSB0byByZWFkIEFWRHMiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIG5vdGlmeSBhZGFwdGVycy9wYXJzZXJzDQotICAgICAgICAvLyBUT0RPDQotDQotICAgICAgICAvLyBub3RpZnkgbGlzdGVuZXJzLg0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbG9hZHMgdGhlIFNESyBjb250ZW50ICh0YXJnZXRzKS4NCi0gICAgICogPHAvPiBUaGlzIGFsc28gcmVsb2FkcyB0aGUgQVZEcyBpbiBjYXNlIHRoZWlyIHN0YXR1cyBjaGFuZ2VkLg0KLSAgICAgKiA8cC8+VGhpcyBkb2VzIG5vdCBub3RpZnkgdGhlIGxpc3RlbmVycyAoe0BsaW5rIElTZGtMaXN0ZW5lcn0pLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVsb2FkU2RrKCkgew0KLSAgICAgICAgLy8gcmVsb2FkIFNESw0KLSAgICAgICAgbVNka01hbmFnZXIucmVsb2FkU2RrKG1TZGtMb2cpOw0KLQ0KLSAgICAgICAgLy8gcmVsb2FkIEFWRHMNCi0gICAgICAgIGlmIChtQXZkTWFuYWdlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgbUF2ZE1hbmFnZXIucmVsb2FkQXZkcyhtU2RrTG9nKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyBGSVhNRQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIG5vdGlmeSBhZGFwdGVycz8NCi0gICAgICAgIG1Mb2NhbFNka1BhcnNlci5jbGVhclBhY2thZ2VzKCk7DQotICAgICAgICAvLyBUT0RPDQotDQotICAgICAgICAvLyBub3RpZnkgbGlzdGVuZXJzDQotICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVsb2FkcyB0aGUgQVZEcy4NCi0gICAgICogPHAvPlRoaXMgZG9lcyBub3Qgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZWxvYWRBdmRzKCkgew0KLSAgICAgICAgLy8gcmVsb2FkIEFWRHMNCi0gICAgICAgIGlmIChtQXZkTWFuYWdlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgbUF2ZE1hbmFnZXIucmVsb2FkQXZkcyhtU2RrTG9nKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBtU2RrTG9nLmVycm9yKGUsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMsIHBhcnNpbmcgdGhlbSBpZiB0aGlzIGhhcyBub3QgeWV0IGJlZW4gZG9uZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBQYWNrYWdlW10gZ2V0SW5zdGFsbGVkUGFja2FnZSgpIHsNCi0gICAgICAgIExvY2FsU2RrUGFyc2VyIHBhcnNlciA9IGdldExvY2FsU2RrUGFyc2VyKCk7DQotDQotICAgICAgICBQYWNrYWdlW10gcGFja2FnZXMgPSBwYXJzZXIuZ2V0UGFja2FnZXMoKTsNCi0NCi0gICAgICAgIGlmIChwYWNrYWdlcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gbG9hZCBvbiBkZW1hbmQgdGhlIGZpcnN0IHRpbWUNCi0gICAgICAgICAgICBwYWNrYWdlcyA9IHBhcnNlci5wYXJzZVNkayhnZXRPc1Nka1Jvb3QoKSwgZ2V0U2RrTWFuYWdlcigpLCBnZXRTZGtMb2coKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcGFja2FnZXM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzICh7QGxpbmsgSVNka0xpc3RlbmVyfSkgdGhhdCB0aGUgU0RLIHdhcyByZWxvYWRlZC4NCi0gICAgICogPHAvPlRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7DQotICAgICAgICBpZiAobVdpbmRvd1NoZWxsICE9IG51bGwgJiYgbUxpc3RlbmVycy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgbVdpbmRvd1NoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSVNka0xpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU2RrQ2hhbmdlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNka0xvZy5lcnJvcih0LCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5zdGFsbCB0aGUgbGlzdCBvZiBnaXZlbiB7QGxpbmsgQXJjaGl2ZX1zLiBUaGlzIGlzIGludm9rZWQgYnkgdGhlIHVzZXIgc2VsZWN0aW5nIHNvbWUNCi0gICAgICogcGFja2FnZXMgaW4gdGhlIHJlbW90ZSBwYWdlIGFuZCB0aGVuIGNsaWNraW5nICJpbnN0YWxsIHNlbGVjdGVkIi4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHJlc3VsdCBUaGUgYXJjaGl2ZXMgdG8gaW5zdGFsbC4gSW5jb21wYXRpYmxlIG9uZXMgd2lsbCBiZSBza2lwcGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgaW5zdGFsbEFyY2hpdmVzKGZpbmFsIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gcmVzdWx0KSB7DQotICAgICAgICBpZiAobVRhc2tGYWN0b3J5ID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXNrIEZhY3RvcnkgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JjZUh0dHAgPSBnZXRTZXR0aW5nc0NvbnRyb2xsZXIoKS5nZXRGb3JjZUh0dHAoKTsNCi0NCi0gICAgICAgIG1UYXNrRmFjdG9yeS5zdGFydCgiSW5zdGFsbGluZyBBcmNoaXZlcyIsIG5ldyBJVGFzaygpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVRhc2tNb25pdG9yIG1vbml0b3IpIHsNCi0NCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHByb2dyZXNzUGVyQXJjaGl2ZSA9IDIgKiBBcmNoaXZlLk5VTV9NT05JVE9SX0lOQzsNCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXRQcm9ncmVzc01heChyZXN1bHQuc2l6ZSgpICogcHJvZ3Jlc3NQZXJBcmNoaXZlKTsNCi0gICAgICAgICAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbigiUHJlcGFyaW5nIHRvIGluc3RhbGwgYXJjaGl2ZXMiKTsNCi0NCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpbnN0YWxsZWRBZGRvbiA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICBib29sZWFuIGluc3RhbGxlZFRvb2xzID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIGN1cnJlbnQgbG9jYWwgYXJjaGl2ZXMgYXMgYWxyZWFkeSBpbnN0YWxsZWQuDQotICAgICAgICAgICAgICAgIEhhc2hTZXQ8QXJjaGl2ZT4gaW5zdGFsbGVkQXJjaGl2ZXMgPSBuZXcgSGFzaFNldDxBcmNoaXZlPigpOw0KLSAgICAgICAgICAgICAgICBmb3IgKFBhY2thZ2UgcCA6IGdldEluc3RhbGxlZFBhY2thZ2UoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChBcmNoaXZlIGEgOiBwLmdldEFyY2hpdmVzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRBcmNoaXZlcy5hZGQoYSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaW50IG51bUluc3RhbGxlZCA9IDA7DQotICAgICAgICAgICAgICAgIGZvciAoQXJjaGl2ZUluZm8gYWkgOiByZXN1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIEFyY2hpdmUgYXJjaGl2ZSA9IGFpLmdldE5ld0FyY2hpdmUoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGludCBuZXh0UHJvZ3Jlc3MgPSBtb25pdG9yLmdldFByb2dyZXNzKCkgKyBwcm9ncmVzc1BlckFyY2hpdmU7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsUmVxdWVzdGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFyY2hpdmVJbmZvIGFkZXAgPSBhaS5nZXREZXBlbmRzT24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRlcCAhPSBudWxsICYmICFpbnN0YWxsZWRBcmNoaXZlcy5jb250YWlucyhhZGVwLmdldE5ld0FyY2hpdmUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhcmNoaXZlIGRlcGVuZHMgb24gYW5vdGhlciBvbmUgdGhhdCB3YXMgbm90IGluc3RhbGxlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIlNraXBwaW5nICclMSRzJzsgaXQgZGVwZW5kcyBvbiAnJTIkcycgd2hpY2ggd2FzIG5vdCBpbnN0YWxsZWQuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmdldFBhcmVudFBhY2thZ2UoKS5nZXRTaG9ydERlc2NyaXB0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRlcC5nZXROZXdBcmNoaXZlKCkuZ2V0UGFyZW50UGFja2FnZSgpLmdldFNob3J0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlLmluc3RhbGwobU9zU2RrUm9vdCwgZm9yY2VIdHRwLCBtU2RrTWFuYWdlciwgbW9uaXRvcikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaW5zdGFsbGVkIHRoaXMgYXJjaGl2ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkQXJjaGl2ZXMuYWRkKGFyY2hpdmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JbnN0YWxsZWQrKzsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwYWNrYWdlIHdhcyByZXBsYWNpbmcgYW4gZXhpc3Rpbmcgb25lLCB0aGUgb2xkIG9uZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBsb25nZXIgaW5zdGFsbGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRBcmNoaXZlcy5yZW1vdmUoYWkuZ2V0UmVwbGFjZWQoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgYSB0b29sIG9yIGFkZC1vbiBwYWNrYWdlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJjaGl2ZS5nZXRQYXJlbnRQYWNrYWdlKCkgaW5zdGFuY2VvZiBBZGRvblBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZEFkZG9uID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmNoaXZlLmdldFBhcmVudFBhY2thZ2UoKSBpbnN0YW5jZW9mIFRvb2xQYWNrYWdlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRUb29scyA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgYW55dGhpbmcgdW5leHBlY3RlZCBpbiB0aGUgbW9uaXRvci4NCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gdC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJVbmV4cGVjdGVkIEVycm9yIGluc3RhbGxpbmcgJyUxJHMnOiAlMiRzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmdldFBhcmVudFBhY2thZ2UoKS5nZXRTaG9ydERlc2NyaXB0aW9uKCksIG1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZXJyb3IgaW5mbz8gZ2V0IHRoZSBzdGFjayBjYWxsIHRvIGRpc3BsYXkgaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgbGVhc3QgdGhhdCdsbCBnaXZlIHVzIGEgYmV0dGVyIGJ1ZyByZXBvcnQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRTdHJlYW0oYmFvcykpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZGlzcGxheSBpdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiVW5leHBlY3RlZCBFcnJvciBpbnN0YWxsaW5nICclMSRzJ1xuJTIkcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5nZXRQYXJlbnRQYWNrYWdlKCkuZ2V0U2hvcnREZXNjcmlwdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhb3MudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgbW92ZSB0aGUgcHJvZ3Jlc3MgYmFyIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGludGVybmFsIG1ldGhvZHMgdG8gbm90IGhhdmUgdG8gY2FyZSBpbiBjYXNlDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhYm9ydCBlYXJseQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuaW5jUHJvZ3Jlc3MobmV4dFByb2dyZXNzIC0gbW9uaXRvci5nZXRQcm9ncmVzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGVkQWRkb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgVVNCIHZlbmRvciBpZHMgZm9yIGFkYg0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2RrTWFuYWdlci51cGRhdGVBZGIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnNldFJlc3VsdCgiVXBkYXRlZCBBREIgdG8gc3VwcG9ydCB0aGUgVVNCIGRldmljZXMgZGVjbGFyZWQgaW4gdGhlIFNESyBhZGQtb25zLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2RrTG9nLmVycm9yKGUsICJVcGRhdGUgQURCIGZhaWxlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJmYWlsZWQgdG8gdXBkYXRlIGFkYiB0byBzdXBwb3J0IHRoZSBVU0IgZGV2aWNlcyBkZWNsYXJlZCBpbiB0aGUgU0RLIGFkZC1vbnMuIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlZEFkZG9uIHx8IGluc3RhbGxlZFRvb2xzKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc3RhcnQgQURCLiBBY3R1YWxseSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIGl0J3MgZXZlbg0KLSAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZywgbWF5YmUgd2Ugc2hvdWxkIGp1c3Qga2lsbCBpdCBhbmQgbm90IHN0YXJ0IGl0Lg0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogaXQgdHVybnMgb3V0IGV2ZW4gdW5kZXIgV2luZG93cyB3ZSBkb24ndCBuZWVkIHRvIGtpbGwgYWRiDQotICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdXBkYXRpbmcgdGhlIHRvb2xzIGZvbGRlciwgYXMgYWRiLmV4ZSBpcyAoc3VycHJpc2luZ2x5KSBub3QNCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvY2tlZC4NCi0NCi0gICAgICAgICAgICAgICAgICAgIGFza0ZvckFkYlJlc3RhcnQobW9uaXRvcik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlZFRvb2xzKSB7DQotICAgICAgICAgICAgICAgICAgICBub3RpZnlUb29sc05lZWRzVG9CZVJlc3RhcnRlZCgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChudW1JbnN0YWxsZWQgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbigiRG9uZS4gTm90aGluZyB3YXMgaW5zdGFsbGVkLiIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXREZXNjcmlwdGlvbigiRG9uZS4gJTEkZCAlMiRzIGluc3RhbGxlZC4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JbnN0YWxsZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUluc3RhbGxlZCA9PSAxID8gInBhY2thZ2UiIDogInBhY2thZ2VzIik7DQotDQotICAgICAgICAgICAgICAgICAgICAvL25vdGlmeSBsaXN0ZW5lcnMgc29tZXRoaW5nIHdhcyBpbnN0YWxsZWQsIHNvIHRoYXQgdGhleSBjYW4gcmVmcmVzaA0KLSAgICAgICAgICAgICAgICAgICAgcmVsb2FkU2RrKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXR0ZW1wcyB0byByZXN0YXJ0IEFEQi4NCi0gICAgICoNCi0gICAgICogSWYgdGhlICJhc2sgYmVmb3JlIHJlc3RhcnQiIHNldHRpbmcgaXMgc2V0ICh0aGUgZGVmYXVsdCksIHByb21wdCB0aGUgdXNlciB3aGV0aGVyDQotICAgICAqIG5vdyBpcyBhIGdvb2QgdGltZSB0byByZXN0YXJ0IEFEQi4NCi0gICAgICogQHBhcmFtIG1vbml0b3INCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBhc2tGb3JBZGJSZXN0YXJ0KElUYXNrTW9uaXRvciBtb25pdG9yKSB7DQotICAgICAgICBmaW5hbCBib29sZWFuW10gY2FuUmVzdGFydCA9IG5ldyBib29sZWFuW10geyB0cnVlIH07DQotDQotICAgICAgICBpZiAoZ2V0U2V0dGluZ3NDb250cm9sbGVyKCkuZ2V0QXNrQmVmb3JlQWRiUmVzdGFydCgpKSB7DQotICAgICAgICAgICAgLy8gbmVlZCB0byBhc2sgZm9yIHBlcm1pc3Npb24gZmlyc3QNCi0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBtV2luZG93U2hlbGwuZ2V0RGlzcGxheSgpOw0KLQ0KLSAgICAgICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICBjYW5SZXN0YXJ0WzBdID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24obVdpbmRvd1NoZWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQURCIFJlc3RhcnQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBBREIgaGFzIGJlZW4gdXBkYXRlZC4gSXQgaXMgcmVjb21tZW5kZWQgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZXN0YXJ0IEFEQi4gSXMgaXQgT0sgdG8gZG8gaXQgbm93PyBJZiBub3QsIHlvdSBjYW4gcmVzdGFydCBpdCAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbnVhbGx5IGxhdGVyLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY2FuUmVzdGFydFswXSkgew0KLSAgICAgICAgICAgIEFkYldyYXBwZXIgYWRiID0gbmV3IEFkYldyYXBwZXIoZ2V0T3NTZGtSb290KCksIG1vbml0b3IpOw0KLSAgICAgICAgICAgIGFkYi5zdG9wQWRiKCk7DQotICAgICAgICAgICAgYWRiLnN0YXJ0QWRiKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVRvb2xzTmVlZHNUb0JlUmVzdGFydGVkKCkgew0KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gbVdpbmRvd1NoZWxsLmdldERpc3BsYXkoKTsNCi0NCi0gICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obVdpbmRvd1NoZWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJBbmRyb2lkIFRvb2xzIFVwZGF0ZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgQW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyIHRoYXQgeW91IGFyZSBjdXJyZW50bHkgdXNpbmcgaGFzIGJlZW4gdXBkYXRlZC4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IG5vdyBjbG9zZSB0aGUgbWFuYWdlciB3aW5kb3cgYW5kIHJlLW9wZW4gaXQuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugc3RhcnRlZCB0aGlzIHdpbmRvdyBmcm9tIEVjbGlwc2UsIHBsZWFzZSBjaGVjayBpZiB0aGUgQW5kcm9pZCAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAicGx1Zy1pbiBuZWVkcyB0byBiZSB1cGRhdGVkLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUcmllcyB0byB1cGRhdGUgYWxsIHRoZSAqZXhpc3RpbmcqIGxvY2FsIHBhY2thZ2VzLg0KLSAgICAgKiA8cC8+DQotICAgICAqIFRoZXJlIGFyZSB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uOg0KLSAgICAgKiA8dWw+DQotICAgICAqIDxsaT5JZiBzZWxlY3RlZEFyY2hpdmVzIGlzIG51bGwsIHJlZnJlc2hlcyBhbGwgc291cmNlcywgY29tcGFyZXMgdGhlIGF2YWlsYWJsZSByZW1vdGUNCi0gICAgICogcGFja2FnZXMgd2l0aCB0aGUgY3VycmVudCBsb2NhbCBvbmVzIGFuZCBzdWdnZXN0IHVwZGF0ZXMgdG8gYmUgZG9uZSB0byB0aGUgdXNlciAoaW5jbHVkaW5nDQotICAgICAqIG5ldyBwbGF0Zm9ybXMgdGhhdCB0aGUgdXNlcnMgZG9lc24ndCBoYXZlIHlldCkuDQotICAgICAqIDxsaT5JZiBzZWxlY3RlZEFyY2hpdmVzIGlzIG5vdCBudWxsLCB0aGlzIHJlcHJlc2VudHMgYSBsaXN0IG9mIGFyY2hpdmVzL3BhY2thZ2VzIHRoYXQNCi0gICAgICogdGhlIHVzZXIgd2FudHMgdG8gaW5zdGFsbCBvciB1cGRhdGUsIHNvIGp1c3QgcHJvY2VzcyB0aGVzZS4NCi0gICAgICogPC91bD4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHNlbGVjdGVkQXJjaGl2ZXMgVGhlIGxpc3Qgb2YgcmVtb3RlIGFyY2hpdmUgdG8gY29uc2lkZXIgZm9yIHRoZSB1cGRhdGUuDQotICAgICAqICBUaGlzIGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGEgbGlzdCBvZiByZW1vdGUgYXJjaGl2ZSBpcyBmZXRjaGVkIGZyb20gYWxsDQotICAgICAqICBhdmFpbGFibGUgc291cmNlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU9ySW5zdGFsbEFsbChDb2xsZWN0aW9uPEFyY2hpdmU+IHNlbGVjdGVkQXJjaGl2ZXMpIHsNCi0gICAgICAgIGlmIChzZWxlY3RlZEFyY2hpdmVzID09IG51bGwpIHsNCi0gICAgICAgICAgICByZWZyZXNoU291cmNlcyh0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVwZGF0ZXJMb2dpYyB1bCA9IG5ldyBVcGRhdGVyTG9naWMoKTsNCi0gICAgICAgIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gYXJjaGl2ZXMgPSB1bC5jb21wdXRlVXBkYXRlcygNCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRBcmNoaXZlcywNCi0gICAgICAgICAgICAgICAgZ2V0U291cmNlcygpLA0KLSAgICAgICAgICAgICAgICBnZXRMb2NhbFNka1BhcnNlcigpLmdldFBhY2thZ2VzKCkpOw0KLQ0KLSAgICAgICAgaWYgKHNlbGVjdGVkQXJjaGl2ZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHVsLmFkZE5ld1BsYXRmb3JtcyhhcmNoaXZlcywgZ2V0U291cmNlcygpLCBnZXRMb2NhbFNka1BhcnNlcigpLmdldFBhY2thZ2VzKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gVE9ETyBpZiBzZWxlY3RlZEFyY2hpdmVzIGlzIG51bGwgYW5kIGFyY2hpdmVzLmxlbj09MCwgZmluZCBpZiB0aGVyZSdzDQotICAgICAgICAvLyBhbnkgbmV3IHBsYXRmb3JtIHdlIGNhbiBzdWdnZXN0IHRvIGluc3RhbGwgaW5zdGVhZC4NCi0NCi0gICAgICAgIFVwZGF0ZUNob29zZXJEaWFsb2cgZGlhbG9nID0gbmV3IFVwZGF0ZUNob29zZXJEaWFsb2coZ2V0V2luZG93U2hlbGwoKSwgdGhpcywgYXJjaGl2ZXMpOw0KLSAgICAgICAgZGlhbG9nLm9wZW4oKTsNCi0NCi0gICAgICAgIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOw0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgaW5zdGFsbEFyY2hpdmVzKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFJlZnJlc2ggYWxsIHNvdXJjZXMuIFRoaXMgaXMgaW52b2tlZCBlaXRoZXIgaW50ZXJuYWxseSAocmV1c2luZyBhbiBleGlzdGluZyBtb25pdG9yKQ0KLSAgICAgKiBvciBhcyBhIFVJIGNhbGxiYWNrIG9uIHRoZSByZW1vdGUgcGFnZSAiUmVmcmVzaCIgYnV0dG9uIChpbiB3aGljaCBjYXNlIHRoZSBtb25pdG9yIGlzDQotICAgICAqIG51bGwgYW5kIGEgbmV3IHRhc2sgc2hvdWxkIGJlIGNyZWF0ZWQuKQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZm9yY2VGZXRjaGluZyBXaGVuIHRydWUsIGxvYWQgc291cmNlcyB0aGF0IGhhdmVuJ3QgYmVlbiBsb2FkZWQgeWV0Lg0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBXaGVuIGZhbHNlLCBvbmx5IHJlZnJlc2ggc291cmNlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgeWV0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFNvdXJjZXMoZmluYWwgYm9vbGVhbiBmb3JjZUZldGNoaW5nKSB7DQotICAgICAgICBhc3NlcnQgbVRhc2tGYWN0b3J5ICE9IG51bGw7DQotDQotICAgICAgICBmaW5hbCBib29sZWFuIGZvcmNlSHR0cCA9IGdldFNldHRpbmdzQ29udHJvbGxlcigpLmdldEZvcmNlSHR0cCgpOw0KLQ0KLSAgICAgICAgbVRhc2tGYWN0b3J5LnN0YXJ0KCJSZWZyZXNoIFNvdXJjZXMiLG5ldyBJVGFzaygpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVRhc2tNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgICAgICAgICAgUmVwb1NvdXJjZVtdIHNvdXJjZXMgPSBtU291cmNlcy5nZXRTb3VyY2VzKCk7DQotICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UHJvZ3Jlc3NNYXgoc291cmNlcy5sZW5ndGgpOw0KLSAgICAgICAgICAgICAgICBmb3IgKFJlcG9Tb3VyY2Ugc291cmNlIDogc291cmNlcykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlRmV0Y2hpbmcgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFBhY2thZ2VzKCkgIT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0RmV0Y2hFcnJvcigpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubG9hZChtb25pdG9yLmNyZWF0ZVN1Yk1vbml0b3IoMSksIGZvcmNlSHR0cCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmluY1Byb2dyZXNzKDEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZXJMb2dpYy5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZXJMb2dpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDc4NDQ4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9VcGRhdGVyTG9naWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLkFuZHJvaWRWZXJzaW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BZGRvblBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmU7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkRvY1BhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkV4dHJhUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVBhY2thZ2VWZXJzaW9uOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5NaW5Ub29sc1BhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlBsYXRmb3JtUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUmVwb1NvdXJjZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUmVwb1NvdXJjZXM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlRvb2xQYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5QYWNrYWdlLlVwZGF0ZUluZm87DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBUaGUgbG9naWMgdG8gY29tcHV0ZSB3aGljaCBwYWNrYWdlcyB0byBpbnN0YWxsLCBiYXNlZCBvbiB0aGUgY2hvaWNlcw0KLSAqIG1hZGUgYnkgdGhlIHVzZXIuIFRoaXMgYWRkcyBkZXBlbmRlbnQgcGFja2FnZXMgYXMgbmVlZGVkLg0KLSAqIDxwLz4NCi0gKiBXaGVuIHRoZSB1c2VyIGRvZXNuJ3QgcHJvdmlkZSBhIHNlbGVjdGlvbiwgbG9va3MgYXQgbG9jYWwgcGFja2FnZSB0byBmaW5kDQotICogdGhvc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgY29tcHV0ZSBkZXBlbmRlbmNpZXMgdG9vLg0KLSAqLw0KLWNsYXNzIFVwZGF0ZXJMb2dpYyB7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wdXRlIHdoaWNoIHBhY2thZ2VzIHRvIGluc3RhbGwgYnkgdGFraW5nIHRoZSB1c2VyIHNlbGVjdGlvbg0KLSAgICAgKiBhbmQgYWRkaW5nIGRlcGVuZGVudCBwYWNrYWdlcyBhcyBuZWVkZWQuDQotICAgICAqDQotICAgICAqIFdoZW4gdGhlIHVzZXIgZG9lc24ndCBwcm92aWRlIGEgc2VsZWN0aW9uLCBsb29rcyBhdCBsb2NhbCBwYWNrYWdlIHRvIGZpbmQNCi0gICAgICogdGhvc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgY29tcHV0ZSBkZXBlbmRlbmNpZXMgdG9vLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gY29tcHV0ZVVwZGF0ZXMoDQotICAgICAgICAgICAgQ29sbGVjdGlvbjxBcmNoaXZlPiBzZWxlY3RlZEFyY2hpdmVzLA0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2VzIHNvdXJjZXMsDQotICAgICAgICAgICAgUGFja2FnZVtdIGxvY2FsUGtncykgew0KLQ0KLSAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmVJbmZvPiBhcmNoaXZlcyA9IG5ldyBBcnJheUxpc3Q8QXJjaGl2ZUluZm8+KCk7DQotICAgICAgICBBcnJheUxpc3Q8UGFja2FnZT4gcmVtb3RlUGtncyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZT4oKTsNCi0gICAgICAgIFJlcG9Tb3VyY2VbXSByZW1vdGVTb3VyY2VzID0gc291cmNlcy5nZXRTb3VyY2VzKCk7DQotDQotICAgICAgICBpZiAoc2VsZWN0ZWRBcmNoaXZlcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgc2VsZWN0ZWRBcmNoaXZlcyA9IGZpbmRVcGRhdGVzKGxvY2FsUGtncywgcmVtb3RlUGtncywgcmVtb3RlU291cmNlcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKEFyY2hpdmUgYSA6IHNlbGVjdGVkQXJjaGl2ZXMpIHsNCi0gICAgICAgICAgICBpbnNlcnRBcmNoaXZlKGEsDQotICAgICAgICAgICAgICAgICAgICBhcmNoaXZlcywNCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUGtncywNCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qYXV0b21hdGVkKi8pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGFyY2hpdmVzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBGaW5kcyBuZXcgcGxhdGZvcm1zIHRoYXQgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBpbiBoaXMvaGVyIGxvY2FsIFNESw0KLSAgICAgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSBsaXN0IG9mIGFyY2hpdmVzIHRvIGluc3RhbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGROZXdQbGF0Zm9ybXMoQXJyYXlMaXN0PEFyY2hpdmVJbmZvPiBhcmNoaXZlcywNCi0gICAgICAgICAgICBSZXBvU291cmNlcyBzb3VyY2VzLA0KLSAgICAgICAgICAgIFBhY2thZ2VbXSBsb2NhbFBrZ3MpIHsNCi0NCi0gICAgICAgIC8vIEZpbmQgdGhlIGhpZ2hlc3QgcGxhdGZvcm0gaW5zdGFsbGVkDQotICAgICAgICBmbG9hdCBjdXJyZW50UGxhdGZvcm1TY29yZSA9IDA7DQotICAgICAgICBmbG9hdCBjdXJyZW50QWRkb25TY29yZSA9IDA7DQotICAgICAgICBmbG9hdCBjdXJyZW50RG9jU2NvcmUgPSAwOw0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEZsb2F0PiBjdXJyZW50RXh0cmFTY29yZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmxvYXQ+KCk7DQotICAgICAgICBmb3IgKFBhY2thZ2UgcCA6IGxvY2FsUGtncykgew0KLSAgICAgICAgICAgIGludCByZXYgPSBwLmdldFJldmlzaW9uKCk7DQotICAgICAgICAgICAgaW50IGFwaSA9IDA7DQotICAgICAgICAgICAgYm9vbGVhbiBpc1ByZXZpZXcgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mICBJUGFja2FnZVZlcnNpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5kcm9pZFZlcnNpb24gdmVycyA9ICgoSVBhY2thZ2VWZXJzaW9uKSBwKS5nZXRWZXJzaW9uKCk7DQotICAgICAgICAgICAgICAgIGFwaSA9IHZlcnMuZ2V0QXBpTGV2ZWwoKTsNCi0gICAgICAgICAgICAgICAgaXNQcmV2aWV3ID0gdmVycy5pc1ByZXZpZXcoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gVGhlIHNjb3JlIGlzIDEwKmFwaSArICgxIGlmIHByZXZpZXcpICsgcmV2LzEwMA0KLSAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHByZXZpZXdzIHRvIHJhbmsgYWJvdmUgYSBub24tcHJldmlldyBhbmQNCi0gICAgICAgICAgICAvLyBhbGxvd3MgcmV2aXNpb25zIHRvIHJhbmsgYXBwcm9wcmlhdGVseS4NCi0gICAgICAgICAgICBmbG9hdCBzY29yZSA9IGFwaSAqIDEwICsgKGlzUHJldmlldyA/IDEgOiAwKSArIHJldi8xMDAuZjsNCi0NCi0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFBsYXRmb3JtUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50UGxhdGZvcm1TY29yZSA9IE1hdGgubWF4KGN1cnJlbnRQbGF0Zm9ybVNjb3JlLCBzY29yZSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChwIGluc3RhbmNlb2YgQWRkb25QYWNrYWdlKSB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRBZGRvblNjb3JlID0gTWF0aC5tYXgoY3VycmVudEFkZG9uU2NvcmUsIHNjb3JlKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBFeHRyYVBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEV4dHJhU2NvcmUucHV0KCgoRXh0cmFQYWNrYWdlKSBwKS5nZXRQYXRoKCksIHNjb3JlKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBEb2NQYWNrYWdlKSB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnREb2NTY29yZSA9IE1hdGgubWF4KGN1cnJlbnREb2NTY29yZSwgc2NvcmUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlcG9Tb3VyY2VbXSByZW1vdGVTb3VyY2VzID0gc291cmNlcy5nZXRTb3VyY2VzKCk7DQotICAgICAgICBBcnJheUxpc3Q8UGFja2FnZT4gcmVtb3RlUGtncyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZT4oKTsNCi0gICAgICAgIGZldGNoUmVtb3RlUGFja2FnZXMocmVtb3RlUGtncywgcmVtb3RlU291cmNlcyk7DQotDQotICAgICAgICBQYWNrYWdlIHN1Z2dlc3RlZERvYyA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFBhY2thZ2UgcCA6IHJlbW90ZVBrZ3MpIHsNCi0gICAgICAgICAgICBpbnQgcmV2ID0gcC5nZXRSZXZpc2lvbigpOw0KLSAgICAgICAgICAgIGludCBhcGkgPSAwOw0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmV2aWV3ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiAgSVBhY2thZ2VWZXJzaW9uKSB7DQotICAgICAgICAgICAgICAgIEFuZHJvaWRWZXJzaW9uIHZlcnMgPSAoKElQYWNrYWdlVmVyc2lvbikgcCkuZ2V0VmVyc2lvbigpOw0KLSAgICAgICAgICAgICAgICBhcGkgPSB2ZXJzLmdldEFwaUxldmVsKCk7DQotICAgICAgICAgICAgICAgIGlzUHJldmlldyA9IHZlcnMuaXNQcmV2aWV3KCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZsb2F0IHNjb3JlID0gYXBpICogMTAgKyAoaXNQcmV2aWV3ID8gMSA6IDApICsgcmV2LzEwMC5mOw0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQWRkID0gZmFsc2U7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQbGF0Zm9ybVBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gc2NvcmUgPiBjdXJyZW50UGxhdGZvcm1TY29yZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBBZGRvblBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gc2NvcmUgPiBjdXJyZW50QWRkb25TY29yZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBFeHRyYVBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoRXh0cmFQYWNrYWdlKSBwKS5nZXRQYXRoKCk7DQotICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9ICFjdXJyZW50RXh0cmFTY29yZS5jb250YWluc0tleShrZXkpIHx8DQotICAgICAgICAgICAgICAgICAgICBzY29yZSA+IGN1cnJlbnRFeHRyYVNjb3JlLmdldChrZXkpLmZsb2F0VmFsdWUoKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBEb2NQYWNrYWdlKSB7DQotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgYWxsIHRoZSBkb2MsIG9ubHkgdGhlIG1vc3QgcmVjZW50IG9uZQ0KLSAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBjdXJyZW50RG9jU2NvcmUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZERvYyA9IHA7DQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9jU2NvcmUgPSBzY29yZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7DQotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBzdWdnZXN0IHRoaXMgcGFja2FnZSBmb3IgaW5zdGFsbGF0aW9uLg0KLSAgICAgICAgICAgICAgICBmb3IgKEFyY2hpdmUgYSA6IHAuZ2V0QXJjaGl2ZXMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNDb21wYXRpYmxlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBcmNoaXZlKGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLypzZWxlY3RlZEFyY2hpdmVzKi8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUGtncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphdXRvbWF0ZWQqLyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3VnZ2VzdGVkRG9jICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBXZSBzaG91bGQgc3VnZ2VzdCB0aGlzIHBhY2thZ2UgZm9yIGluc3RhbGxhdGlvbi4NCi0gICAgICAgICAgICBmb3IgKEFyY2hpdmUgYSA6IHN1Z2dlc3RlZERvYy5nZXRBcmNoaXZlcygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChhLmlzQ29tcGF0aWJsZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnNlcnRBcmNoaXZlKGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qc2VsZWN0ZWRBcmNoaXZlcyovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVTb3VyY2VzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBrZ3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphdXRvbWF0ZWQqLyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZpbmQgc3VpdGFibGUgdXBkYXRlcyB0byBhbGwgY3VycmVudCBsb2NhbCBwYWNrYWdlcy4NCi0gICAgICovDQotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBcmNoaXZlPiBmaW5kVXBkYXRlcyhQYWNrYWdlW10gbG9jYWxQa2dzLA0KLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWNrYWdlPiByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2VbXSByZW1vdGVTb3VyY2VzKSB7DQotICAgICAgICBBcnJheUxpc3Q8QXJjaGl2ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8QXJjaGl2ZT4oKTsNCi0NCi0gICAgICAgIGZldGNoUmVtb3RlUGFja2FnZXMocmVtb3RlUGtncywgcmVtb3RlU291cmNlcyk7DQotDQotICAgICAgICBmb3IgKFBhY2thZ2UgbG9jYWxQa2cgOiBsb2NhbFBrZ3MpIHsNCi0gICAgICAgICAgICBmb3IgKFBhY2thZ2UgcmVtb3RlUGtnIDogcmVtb3RlUGtncykgew0KLSAgICAgICAgICAgICAgICBpZiAobG9jYWxQa2cuY2FuQmVVcGRhdGVkQnkocmVtb3RlUGtnKSA9PSBVcGRhdGVJbmZvLlVQREFURSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYSBzdWl0YWJsZSB1cGRhdGUuIE9ubHkgYWNjZXB0IHRoZSByZW1vdGUgcGFja2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgcHJvdmlkZXMgYXQgbGVhc3Qgb25lIGNvbXBhdGlibGUgYXJjaGl2ZS4NCi0NCi0gICAgICAgICAgICAgICAgICAgIGZvciAoQXJjaGl2ZSBhIDogcmVtb3RlUGtnLmdldEFyY2hpdmVzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc0NvbXBhdGlibGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmFkZChhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHVwZGF0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBcmNoaXZlSW5mbyBpbnNlcnRBcmNoaXZlKEFyY2hpdmUgYXJjaGl2ZSwNCi0gICAgICAgICAgICBBcnJheUxpc3Q8QXJjaGl2ZUluZm8+IG91dEFyY2hpdmVzLA0KLSAgICAgICAgICAgIENvbGxlY3Rpb248QXJjaGl2ZT4gc2VsZWN0ZWRBcmNoaXZlcywNCi0gICAgICAgICAgICBBcnJheUxpc3Q8UGFja2FnZT4gcmVtb3RlUGtncywNCi0gICAgICAgICAgICBSZXBvU291cmNlW10gcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICBQYWNrYWdlW10gbG9jYWxQa2dzLA0KLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGVkKSB7DQotICAgICAgICBQYWNrYWdlIHAgPSBhcmNoaXZlLmdldFBhcmVudFBhY2thZ2UoKTsNCi0NCi0gICAgICAgIC8vIElzIHRoaXMgYW4gdXBkYXRlPw0KLSAgICAgICAgQXJjaGl2ZSB1cGRhdGVkQXJjaGl2ZSA9IG51bGw7DQotICAgICAgICBmb3IgKFBhY2thZ2UgbHAgOiBsb2NhbFBrZ3MpIHsNCi0gICAgICAgICAgICBhc3NlcnQgbHAuZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPT0gMTsNCi0gICAgICAgICAgICBpZiAobHAuZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPiAwICYmIGxwLmNhbkJlVXBkYXRlZEJ5KHApID09IFVwZGF0ZUluZm8uVVBEQVRFKSB7DQotICAgICAgICAgICAgICAgIHVwZGF0ZWRBcmNoaXZlID0gbHAuZ2V0QXJjaGl2ZXMoKVswXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIGRlcGVuZGVuY2llcw0KLSAgICAgICAgQXJjaGl2ZUluZm8gZGVwID0gZmluZERlcGVuZGVuY3kocCwNCi0gICAgICAgICAgICAgICAgb3V0QXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgIHNlbGVjdGVkQXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgIHJlbW90ZVBrZ3MsDQotICAgICAgICAgICAgICAgIHJlbW90ZVNvdXJjZXMsDQotICAgICAgICAgICAgICAgIGxvY2FsUGtncyk7DQotDQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkdXANCi0gICAgICAgIEFyY2hpdmVJbmZvIGFpID0gbnVsbDsNCi0NCi0gICAgICAgIGZvciAoQXJjaGl2ZUluZm8gYWkyIDogb3V0QXJjaGl2ZXMpIHsNCi0gICAgICAgICAgICBpZiAoYWkyLmdldE5ld0FyY2hpdmUoKS5nZXRQYXJlbnRQYWNrYWdlKCkuc2FtZUl0ZW1BcyhhcmNoaXZlLmdldFBhcmVudFBhY2thZ2UoKSkpIHsNCi0gICAgICAgICAgICAgICAgYWkgPSBhaTI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChhaSA9PSBudWxsKSB7DQotICAgICAgICAgICAgYWkgPSBuZXcgQXJjaGl2ZUluZm8oDQotICAgICAgICAgICAgICAgIGFyY2hpdmUsIC8vbmV3QXJjaGl2ZQ0KLSAgICAgICAgICAgICAgICB1cGRhdGVkQXJjaGl2ZSwgLy9yZXBsYWNlZA0KLSAgICAgICAgICAgICAgICBkZXAgLy9kZXBlbmRzT24NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICBvdXRBcmNoaXZlcy5hZGQoYWkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRlcCAhPSBudWxsKSB7DQotICAgICAgICAgICAgZGVwLmFkZERlcGVuZGVuY3lGb3IoYWkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGFpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQXJjaGl2ZUluZm8gZmluZERlcGVuZGVuY3koUGFja2FnZSBwa2csDQotICAgICAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmVJbmZvPiBvdXRBcmNoaXZlcywNCi0gICAgICAgICAgICBDb2xsZWN0aW9uPEFyY2hpdmU+IHNlbGVjdGVkQXJjaGl2ZXMsDQotICAgICAgICAgICAgQXJyYXlMaXN0PFBhY2thZ2U+IHJlbW90ZVBrZ3MsDQotICAgICAgICAgICAgUmVwb1NvdXJjZVtdIHJlbW90ZVNvdXJjZXMsDQotICAgICAgICAgICAgUGFja2FnZVtdIGxvY2FsUGtncykgew0KLQ0KLSAgICAgICAgLy8gQ3VycmVudCBkZXBlbmRlbmNpZXMgY2FuIGJlOg0KLSAgICAgICAgLy8gLSBhZGRvbjogKmFsd2F5cyogZGVwZW5kcyBvbiBwbGF0Zm9ybSBvZiBzYW1lIEFQSSBsZXZlbA0KLSAgICAgICAgLy8gLSBwbGF0Zm9ybTogKm1pZ2h0KiBkZXBlbmRzIG9uIHRvb2xzIG9mIHJldiA+PSBtaW4tdG9vbHMtcmV2DQotDQotICAgICAgICBpZiAocGtnIGluc3RhbmNlb2YgQWRkb25QYWNrYWdlKSB7DQotICAgICAgICAgICAgQWRkb25QYWNrYWdlIGFkZG9uID0gKEFkZG9uUGFja2FnZSkgcGtnOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmaW5kUGxhdGZvcm1EZXBlbmRlbmN5KA0KLSAgICAgICAgICAgICAgICAgICAgYWRkb24sDQotICAgICAgICAgICAgICAgICAgICBvdXRBcmNoaXZlcywNCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUGtncyk7DQotDQotICAgICAgICB9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIE1pblRvb2xzUGFja2FnZSkgew0KLSAgICAgICAgICAgIE1pblRvb2xzUGFja2FnZSBwbGF0Zm9ybU9yRXh0cmEgPSAoTWluVG9vbHNQYWNrYWdlKSBwa2c7DQotDQotICAgICAgICAgICAgcmV0dXJuIGZpbmRUb29sc0RlcGVuZGVuY3koDQotICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybU9yRXh0cmEsDQotICAgICAgICAgICAgICAgICAgICBvdXRBcmNoaXZlcywNCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUGtncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzb2x2ZXMgZGVwZW5kZW5jaWVzIG9uIHRvb2xzLg0KLSAgICAgKg0KLSAgICAgKiBBIHBsYXRmb3JtIG9yIGFuIGV4dHJhIHBhY2thZ2UgY2FuIGJvdGggaGF2ZSBhIG1pbi10b29scy1yZXYsIGluIHdoaWNoIGNhc2UgaXQNCi0gICAgICogZGVwZW5kcyBvbiBoYXZpbmcgYSB0b29scyBwYWNrYWdlIG9mIHRoZSByZXF1ZXN0ZWQgcmV2aXNpb24uDQotICAgICAqIEZpbmRzIHRoZSB0b29scyBkZXBlbmRlbmN5LiBJZiBmb3VuZCwgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBpbnN0YWxsLg0KLSAgICAgKiBSZXR1cm5zIHRoZSBhcmNoaXZlIGluZm8gZGVwZW5kZW5jeSwgaWYgYW55Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEFyY2hpdmVJbmZvIGZpbmRUb29sc0RlcGVuZGVuY3koTWluVG9vbHNQYWNrYWdlIHBsYXRmb3JtT3JFeHRyYSwNCi0gICAgICAgICAgICBBcnJheUxpc3Q8QXJjaGl2ZUluZm8+IG91dEFyY2hpdmVzLA0KLSAgICAgICAgICAgIENvbGxlY3Rpb248QXJjaGl2ZT4gc2VsZWN0ZWRBcmNoaXZlcywNCi0gICAgICAgICAgICBBcnJheUxpc3Q8UGFja2FnZT4gcmVtb3RlUGtncywNCi0gICAgICAgICAgICBSZXBvU291cmNlW10gcmVtb3RlU291cmNlcywNCi0gICAgICAgICAgICBQYWNrYWdlW10gbG9jYWxQa2dzKSB7DQotICAgICAgICAvLyBUaGlzIGlzIHRoZSByZXF1aXJlbWVudCB0byBtYXRjaC4NCi0gICAgICAgIGludCByZXYgPSBwbGF0Zm9ybU9yRXh0cmEuZ2V0TWluVG9vbHNSZXZpc2lvbigpOw0KLQ0KLSAgICAgICAgaWYgKHJldiA9PSBNaW5Ub29sc1BhY2thZ2UuTUlOX1RPT0xTX1JFVl9OT1RfU1BFQ0lGSUVEKSB7DQotICAgICAgICAgICAgLy8gV2VsbCBhY3R1YWxseSB0aGVyZSdzIG5vIHJlcXVpcmVtZW50Lg0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gRmlyc3QgbG9vayBpbiBsb2NhbCBwYWNrYWdlcy4NCi0gICAgICAgIGZvciAoUGFja2FnZSBwIDogbG9jYWxQa2dzKSB7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBUb29sUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoKChUb29sUGFja2FnZSkgcCkuZ2V0UmV2aXNpb24oKSA+PSByZXYpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIG9uZSBhbHJlYWR5IGluc3RhbGxlZC4gV2UgZG9uJ3QgcmVwb3J0IHRoaXMgZGVwZW5kZW5jeQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIFVJIG9ubHkgY2FyZXMgYWJvdXQgcmVzb2x2aW5nICJuZXdseSBhZGRlZCBkZXBlbmRlbmNpZXMiLg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBMb29rIGluIGFyY2hpdmVzIGFscmVhZHkgc2NoZWR1bGVkIGZvciBpbnN0YWxsDQotICAgICAgICBmb3IgKEFyY2hpdmVJbmZvIGFpIDogb3V0QXJjaGl2ZXMpIHsNCi0gICAgICAgICAgICBQYWNrYWdlIHAgPSBhaS5nZXROZXdBcmNoaXZlKCkuZ2V0UGFyZW50UGFja2FnZSgpOw0KLSAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgVG9vbFBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCgoVG9vbFBhY2thZ2UpIHApLmdldFJldmlzaW9uKCkgPj0gcmV2KSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVwZW5kZW5jeSBpcyBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgaW5zdGFsbCwgbm90aGluZyBlbHNlIHRvIGRvLg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gT3RoZXJ3aXNlIGxvb2sgaW4gdGhlIHNlbGVjdGVkIGFyY2hpdmVzLg0KLSAgICAgICAgaWYgKHNlbGVjdGVkQXJjaGl2ZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoQXJjaGl2ZSBhIDogc2VsZWN0ZWRBcmNoaXZlcykgew0KLSAgICAgICAgICAgICAgICBQYWNrYWdlIHAgPSBhLmdldFBhcmVudFBhY2thZ2UoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBUb29sUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoVG9vbFBhY2thZ2UpIHApLmdldFJldmlzaW9uKCkgPj0gcmV2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiB0aGluZ3MgdG8gaW5zdGFsbCwgc28gYWRkIGl0IG5vdw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRBcmNoaXZlKGEsIG91dEFyY2hpdmVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBcmNoaXZlcywgcmVtb3RlUGtncywgcmVtb3RlU291cmNlcywgbG9jYWxQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmF1dG9tYXRlZCovKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIEZpbmFsbHkgbm90aGluZyBtYXRjaGVkLCBzbyBsZXQncyBsb29rIGF0IGFsbCBhdmFpbGFibGUgcmVtb3RlIHBhY2thZ2VzDQotICAgICAgICBmZXRjaFJlbW90ZVBhY2thZ2VzKHJlbW90ZVBrZ3MsIHJlbW90ZVNvdXJjZXMpOw0KLSAgICAgICAgZm9yIChQYWNrYWdlIHAgOiByZW1vdGVQa2dzKSB7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBUb29sUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoKChUb29sUGFja2FnZSkgcCkuZ2V0UmV2aXNpb24oKSA+PSByZXYpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3Qgb2YgdGhpbmdzIHRvIGluc3RhbGwsIHNvIGFkZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNvbXBhdGlibGUgYXJjaGl2ZSB3ZSBjYW4gZmluZC4NCi0gICAgICAgICAgICAgICAgICAgIGZvciAoQXJjaGl2ZSBhIDogcC5nZXRBcmNoaXZlcygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNDb21wYXRpYmxlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc2VydEFyY2hpdmUoYSwgb3V0QXJjaGl2ZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBcmNoaXZlcywgcmVtb3RlUGtncywgcmVtb3RlU291cmNlcywgbG9jYWxQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphdXRvbWF0ZWQqLyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gV2UgZW5kIHVwIGhlcmUgaWYgbm90aGluZyBtYXRjaGVzLiBXZSBkb24ndCBoYXZlIGEgZ29vZCB0b29scyB0byBtYXRjaC4NCi0gICAgICAgIC8vIFNlcmlvdXNseSwgdGhhdCBjYW4ndCBoYXBwZW5zIHVubGVzcyB3ZSB0b3RhbGx5IHNjcmV3ZWQgb3VyIHJlcG8gbWFuaWZlc3QuDQotICAgICAgICAvLyBXZSdsbCBsZXQgdGhpcyBvbmUgZ28gdGhyb3VnaCBhbnl3YXkuDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzb2x2ZXMgZGVwZW5kZW5jaWVzIG9uIHBsYXRmb3JtLg0KLSAgICAgKg0KLSAgICAgKiBBbiBhZGRvbiBkZXBlbmRzIG9uIGhhdmluZyBhIHBsYXRmb3JtIHdpdGggdGhlIHNhbWUgQVBJIHZlcnNpb24uDQotICAgICAqIEZpbmRzIHRoZSBwbGF0Zm9ybSBkZXBlbmRlbmN5LiBJZiBmb3VuZCwgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBpbnN0YWxsLg0KLSAgICAgKiBSZXR1cm5zIHRoZSBhcmNoaXZlIGluZm8gZGVwZW5kZW5jeSwgaWYgYW55Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEFyY2hpdmVJbmZvIGZpbmRQbGF0Zm9ybURlcGVuZGVuY3koQWRkb25QYWNrYWdlIGFkZG9uLA0KLSAgICAgICAgICAgIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gb3V0QXJjaGl2ZXMsDQotICAgICAgICAgICAgQ29sbGVjdGlvbjxBcmNoaXZlPiBzZWxlY3RlZEFyY2hpdmVzLA0KLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWNrYWdlPiByZW1vdGVQa2dzLA0KLSAgICAgICAgICAgIFJlcG9Tb3VyY2VbXSByZW1vdGVTb3VyY2VzLA0KLSAgICAgICAgICAgIFBhY2thZ2VbXSBsb2NhbFBrZ3MpIHsNCi0gICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlcXVpcmVtZW50IHRvIG1hdGNoLg0KLSAgICAgICAgQW5kcm9pZFZlcnNpb24gdiA9IGFkZG9uLmdldFZlcnNpb24oKTsNCi0NCi0gICAgICAgIC8vIEZpbmQgYSBwbGF0Zm9ybSB0aGF0IHdvdWxkIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50Lg0KLQ0KLSAgICAgICAgLy8gRmlyc3QgbG9vayBpbiBsb2NhbCBwYWNrYWdlcy4NCi0gICAgICAgIGZvciAoUGFja2FnZSBwIDogbG9jYWxQa2dzKSB7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQbGF0Zm9ybVBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCgoUGxhdGZvcm1QYWNrYWdlKSBwKS5nZXRWZXJzaW9uKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBvbmUgYWxyZWFkeSBpbnN0YWxsZWQuIFdlIGRvbid0IHJlcG9ydCB0aGlzIGRlcGVuZGVuY3kNCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBVSSBvbmx5IGNhcmVzIGFib3V0IHJlc29sdmluZyAibmV3bHkgYWRkZWQgZGVwZW5kZW5jaWVzIi4NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gTG9vayBpbiBhcmNoaXZlcyBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgaW5zdGFsbA0KLSAgICAgICAgZm9yIChBcmNoaXZlSW5mbyBhaSA6IG91dEFyY2hpdmVzKSB7DQotICAgICAgICAgICAgUGFja2FnZSBwID0gYWkuZ2V0TmV3QXJjaGl2ZSgpLmdldFBhcmVudFBhY2thZ2UoKTsNCi0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFBsYXRmb3JtUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoKChQbGF0Zm9ybVBhY2thZ2UpIHApLmdldFZlcnNpb24oKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZXBlbmRlbmN5IGlzIGFscmVhZHkgc2NoZWR1bGVkIGZvciBpbnN0YWxsLCBub3RoaW5nIGVsc2UgdG8gZG8uDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBPdGhlcndpc2UgbG9vayBpbiB0aGUgc2VsZWN0ZWQgYXJjaGl2ZXMuDQotICAgICAgICBpZiAoc2VsZWN0ZWRBcmNoaXZlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChBcmNoaXZlIGEgOiBzZWxlY3RlZEFyY2hpdmVzKSB7DQotICAgICAgICAgICAgICAgIFBhY2thZ2UgcCA9IGEuZ2V0UGFyZW50UGFja2FnZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFBsYXRmb3JtUGFja2FnZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCgoUGxhdGZvcm1QYWNrYWdlKSBwKS5nZXRWZXJzaW9uKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiB0aGluZ3MgdG8gaW5zdGFsbCwgc28gYWRkIGl0IG5vdw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRBcmNoaXZlKGEsIG91dEFyY2hpdmVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBcmNoaXZlcywgcmVtb3RlUGtncywgcmVtb3RlU291cmNlcywgbG9jYWxQa2dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmF1dG9tYXRlZCovKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIEZpbmFsbHkgbm90aGluZyBtYXRjaGVkLCBzbyBsZXQncyBsb29rIGF0IGFsbCBhdmFpbGFibGUgcmVtb3RlIHBhY2thZ2VzDQotICAgICAgICBmZXRjaFJlbW90ZVBhY2thZ2VzKHJlbW90ZVBrZ3MsIHJlbW90ZVNvdXJjZXMpOw0KLSAgICAgICAgZm9yIChQYWNrYWdlIHAgOiByZW1vdGVQa2dzKSB7DQotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQbGF0Zm9ybVBhY2thZ2UpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCgoUGxhdGZvcm1QYWNrYWdlKSBwKS5nZXRWZXJzaW9uKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBpbnN0YWxsLCBzbyBhZGQgdGhlDQotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjb21wYXRpYmxlIGFyY2hpdmUgd2UgY2FuIGZpbmQuDQotICAgICAgICAgICAgICAgICAgICBmb3IgKEFyY2hpdmUgYSA6IHAuZ2V0QXJjaGl2ZXMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmlzQ29tcGF0aWJsZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRBcmNoaXZlKGEsIG91dEFyY2hpdmVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXJjaGl2ZXMsIHJlbW90ZVBrZ3MsIHJlbW90ZVNvdXJjZXMsIGxvY2FsUGtncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXV0b21hdGVkKi8pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFdlIGVuZCB1cCBoZXJlIGlmIG5vdGhpbmcgbWF0Y2hlcy4gV2UgZG9uJ3QgaGF2ZSBhIGdvb2QgcGxhdGZvcm0gdG8gbWF0Y2guDQotICAgICAgICAvLyBTZXJpb3VzbHksIHRoYXQgY2FuJ3QgaGFwcGVucyB1bmxlc3MgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBib2d1cyBhZGRvbg0KLSAgICAgICAgLy8gZW50cnkgdGhhdCBkb2VzIG5vdCBtYXRjaCBhbnkgZXhpc3RpbmcgcGxhdGZvcm0gQVBJIGxldmVsLg0KLSAgICAgICAgLy8gSXQncyBjb25jZWl2YWJsZSB0aGF0IGEgM3JkIHBhcnQgYWRkb24gcmVwbyBtaWdodCBoYXZlIGVycm9yLCBpbiB3aGljaCBjYXNlDQotICAgICAgICAvLyB3ZSdsbCBsZXQgdGhpcyBvbmUgZ28gdGhyb3VnaCBhbnl3YXkuDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKiogRmV0Y2ggYWxsIHJlbW90ZSBwYWNrYWdlcyBvbmx5IGlmIHJlYWxseSBuZWVkZWQuICovDQotICAgIHByb3RlY3RlZCB2b2lkIGZldGNoUmVtb3RlUGFja2FnZXMoQXJyYXlMaXN0PFBhY2thZ2U+IHJlbW90ZVBrZ3MsIFJlcG9Tb3VyY2VbXSByZW1vdGVTb3VyY2VzKSB7DQotICAgICAgICBpZiAocmVtb3RlUGtncy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChSZXBvU291cmNlIHJlbW90ZVNyYyA6IHJlbW90ZVNvdXJjZXMpIHsNCi0gICAgICAgICAgICBQYWNrYWdlW10gcGtncyA9IHJlbW90ZVNyYy5nZXRQYWNrYWdlcygpOw0KLSAgICAgICAgICAgIGlmIChwa2dzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbmV4dFBhY2thZ2U6IGZvciAoUGFja2FnZSBwa2cgOiBwa2dzKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKEFyY2hpdmUgYSA6IHBrZy5nZXRBcmNoaXZlcygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBwYWNrYWdlIGlmIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21wYXRpYmxlIGFyY2hpdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc0NvbXBhdGlibGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVQa2dzLmFkZChwa2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBuZXh0UGFja2FnZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L1VwZGF0ZXJXaW5kb3dJbXBsLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvVXBkYXRlcldpbmRvd0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmUyNGFmNC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvVXBkYXRlcldpbmRvd0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeTsNCi0NCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklTZGtMb2c7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlJlcG9Tb3VyY2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlJlcG9Tb3VyY2VzOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIucmVwb3NpdG9yeS5TZGtSZXBvc2l0b3J5Ow0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Lmljb25zLkltYWdlRmFjdG9yeTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwudGFza3MuUHJvZ3Jlc3NUYXNrRmFjdG9yeTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIucmVwb3NpdG9yeS5VcGRhdGVyV2luZG93LklTZGtMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVcGRhdGVXaW5kb3cuDQotICovDQotcHVibGljIGNsYXNzIFVwZGF0ZXJXaW5kb3dJbXBsIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTaGVsbCBtUGFyZW50U2hlbGw7DQotICAgIC8qKiBJbnRlcm5hbCBkYXRhIHNoYXJlZCBiZXR3ZWVuIHRoZSB3aW5kb3cgYW5kIGl0cyBwYWdlcy4gKi8NCi0gICAgcHJpdmF0ZSBmaW5hbCBVcGRhdGVyRGF0YSBtVXBkYXRlckRhdGE7DQotICAgIC8qKiBUaGUgYXJyYXkgb2YgcGFnZXMgaW5zdGFuY2VzLiBPbmx5IG9uZSBpcyB2aXNpYmxlIGF0IGEgdGltZS4gKi8NCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8Q29tcG9zaXRlPiBtUGFnZXMgPSBuZXcgQXJyYXlMaXN0PENvbXBvc2l0ZT4oKTsNCi0gICAgLyoqIEluZGljYXRlcyBhIHBhZ2UgY2hhbmdlIGlzIGR1ZSB0byBhbiBpbnRlcm5hbCByZXF1ZXN0LiBQcmV2ZW50cyBjYWxsYmFja3MgZnJvbSBsb29waW5nLiAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybmFsUGFnZUNoYW5nZTsNCi0gICAgLyoqIEEgbGlzdCBvZiBleHRyYSBwYWdlcyB0byBpbnN0YW50aWF0ZS4gRWFjaCBlbnRyeSBpcyBhbiBvYmplY3QgYXJyYXkgd2l0aCAyIGVsZW1lbnRzOg0KLSAgICAgKiAgdGhlIHN0cmluZyB0aXRsZSBhbmQgdGhlIENvbXBvc2l0ZSBjbGFzcyB0byBpbnN0YW50aWF0ZSB0byBjcmVhdGUgdGhlIHBhZ2UuICovDQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9iamVjdFtdPiBtRXh0cmFQYWdlczsNCi0gICAgLyoqIEEgZmFjdG9yeSB0byBjcmVhdGUgcHJvZ3Jlc3MgdGFzayBkaWFsb2dzLiAqLw0KLSAgICBwcml2YXRlIFByb2dyZXNzVGFza0ZhY3RvcnkgbVRhc2tGYWN0b3J5Ow0KLSAgICAvKiogVGhlIGluaXRpYWwgcGFnZSB0byBkaXNwbGF5LiBJZiBudWxsIG9yIG5vdCBhIGtub3cgY2xhc3MsIHRoZSBmaXJzdCBwYWdlIHdpbGwgYmUgZGlzcGxheWVkLg0KLSAgICAgKiBNdXN0IGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rICNvcGVuKCl9LiAqLw0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBDb21wb3NpdGU+IG1Jbml0aWFsUGFnZTsNCi0gICAgLyoqIFNldHMgd2hldGhlciB0aGUgYXV0by11cGRhdGUgd2l6YXJkIHdpbGwgYmUgc2hvd24gd2hlbiBvcGVuaW5nIHRoZSB3aW5kb3cuICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdEF1dG9VcGRhdGU7DQotDQotICAgIC8vIC0tLSBVSSBtZW1iZXJzIC0tLQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU2hlbGwgbUFuZHJvaWRTZGtVcGRhdGVyOw0KLSAgICBwcml2YXRlIFNhc2hGb3JtIG1TYXNoRm9ybTsNCi0gICAgcHJpdmF0ZSBMaXN0IG1QYWdlTGlzdDsNCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVBhZ2VzUm9vdENvbXBvc2l0ZTsNCi0gICAgcHJpdmF0ZSBMb2NhbFBhY2thZ2VzUGFnZSBtTG9jYWxQYWNrYWdlUGFnZTsNCi0gICAgcHJpdmF0ZSBSZW1vdGVQYWNrYWdlc1BhZ2UgbVJlbW90ZVBhY2thZ2VzUGFnZTsNCi0gICAgcHJpdmF0ZSBBdmRNYW5hZ2VyUGFnZSBtQXZkTWFuYWdlclBhZ2U7DQotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgbVN0YWNrTGF5b3V0Ow0KLQ0KLSAgICBwdWJsaWMgVXBkYXRlcldpbmRvd0ltcGwoU2hlbGwgcGFyZW50U2hlbGwsIElTZGtMb2cgc2RrTG9nLCBTdHJpbmcgb3NTZGtSb290LA0KLSAgICAgICAgICAgIGJvb2xlYW4gdXNlckNhbkNoYW5nZVNka1Jvb3QpIHsNCi0gICAgICAgIG1QYXJlbnRTaGVsbCA9IHBhcmVudFNoZWxsOw0KLSAgICAgICAgbVVwZGF0ZXJEYXRhID0gbmV3IFVwZGF0ZXJEYXRhKG9zU2RrUm9vdCwgc2RrTG9nKTsNCi0gICAgICAgIG1VcGRhdGVyRGF0YS5zZXRVc2VyQ2FuQ2hhbmdlU2RrUm9vdCh1c2VyQ2FuQ2hhbmdlU2RrUm9vdCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE9wZW4gdGhlIHdpbmRvdy4NCi0gICAgICogQHdicC5wYXJzZXIuZW50cnlQb2ludA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgb3BlbigpIHsNCi0gICAgICAgIGlmIChtUGFyZW50U2hlbGwgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIERpc3BsYXkuc2V0QXBwTmFtZSgiQW5kcm9pZCIpOyAvLyRoaWRlJCAoaGlkZSBmcm9tIFNXVCBkZXNpZ25lcikNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNyZWF0ZUNvbnRlbnRzKCk7DQotICAgICAgICBtQW5kcm9pZFNka1VwZGF0ZXIub3BlbigpOw0KLSAgICAgICAgbUFuZHJvaWRTZGtVcGRhdGVyLmxheW91dCgpOw0KLQ0KLSAgICAgICAgcG9zdENyZWF0ZSgpOyAgICAvLyRoaWRlJCAoaGlkZSBmcm9tIFNXVCBkZXNpZ25lcikNCi0NCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOw0KLSAgICAgICAgd2hpbGUgKCFtQW5kcm9pZFNka1VwZGF0ZXIuaXNEaXNwb3NlZCgpKSB7DQotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7DQotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBkaXNwb3NlKCk7ICAvLyRoaWRlJA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIHdpbmRvdy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KLSAgICAgICAgbUFuZHJvaWRTZGtVcGRhdGVyID0gbmV3IFNoZWxsKG1QYXJlbnRTaGVsbCwgU1dULlNIRUxMX1RSSU0pOw0KLSAgICAgICAgbUFuZHJvaWRTZGtVcGRhdGVyLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uQW5kcm9pZFNka1VwZGF0ZXJEaXNwb3NlKCk7ICAgIC8vJGhpZGUkIChoaWRlIGZyb20gU1dUIGRlc2lnbmVyKQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgRmlsbExheW91dCBmbDsNCi0gICAgICAgIG1BbmRyb2lkU2RrVXBkYXRlci5zZXRMYXlvdXQoZmwgPSBuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCkpOw0KLSAgICAgICAgZmwubWFyZ2luSGVpZ2h0ID0gZmwubWFyZ2luV2lkdGggPSA1Ow0KLSAgICAgICAgbUFuZHJvaWRTZGtVcGRhdGVyLnNldE1pbmltdW1TaXplKG5ldyBQb2ludCgyMDAsIDUwKSk7DQotICAgICAgICBtQW5kcm9pZFNka1VwZGF0ZXIuc2V0U2l6ZSg3NDUsIDQzMyk7DQotICAgICAgICBtQW5kcm9pZFNka1VwZGF0ZXIuc2V0VGV4dCgiQW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyIik7DQotDQotICAgICAgICBtU2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0obUFuZHJvaWRTZGtVcGRhdGVyLCBTV1QuTk9ORSk7DQotDQotICAgICAgICBtUGFnZUxpc3QgPSBuZXcgTGlzdChtU2FzaEZvcm0sIFNXVC5CT1JERVIpOw0KLSAgICAgICAgbVBhZ2VMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgb25QYWdlTGlzdFNlbGVjdGVkKCk7ICAgIC8vJGhpZGUkIChoaWRlIGZyb20gU1dUIGRlc2lnbmVyKQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgbVBhZ2VzUm9vdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobVNhc2hGb3JtLCBTV1QuTk9ORSk7DQotICAgICAgICBtU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsNCi0gICAgICAgIG1QYWdlc1Jvb3RDb21wb3NpdGUuc2V0TGF5b3V0KG1TdGFja0xheW91dCk7DQotDQotICAgICAgICBtQXZkTWFuYWdlclBhZ2UgPSBuZXcgQXZkTWFuYWdlclBhZ2UobVBhZ2VzUm9vdENvbXBvc2l0ZSwgbVVwZGF0ZXJEYXRhKTsNCi0gICAgICAgIG1Mb2NhbFBhY2thZ2VQYWdlID0gbmV3IExvY2FsUGFja2FnZXNQYWdlKG1QYWdlc1Jvb3RDb21wb3NpdGUsIG1VcGRhdGVyRGF0YSk7DQotICAgICAgICBtUmVtb3RlUGFja2FnZXNQYWdlID0gbmV3IFJlbW90ZVBhY2thZ2VzUGFnZShtUGFnZXNSb290Q29tcG9zaXRlLCBtVXBkYXRlckRhdGEpOw0KLQ0KLSAgICAgICAgbVNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsxNTAsIDU3Nn0pOw0KLSAgICB9DQotDQotICAgIC8vIC0tIFN0YXJ0IG9mIGludGVybmFsIHBhcnQgLS0tLS0tLS0tLQ0KLSAgICAvLyBIaWRlIGV2ZXJ5dGhpbmcgZG93bi1iZWxvdyBmcm9tIFNXVCBkZXNpZ25lcg0KLSAgICAvLyRoaWRlPj4kDQotDQotICAgIC8vIC0tLSBQdWJsaWMgQVBJIC0tLS0tLS0tLS0tDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBSZWdpc3RlcnMgYW4gZXh0cmEgcGFnZSBmb3IgdGhlIHVwZGF0ZXIgd2luZG93Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIFBhZ2VzIG11c3QgZGVyaXZlIGZyb20ge0BsaW5rIENvbXBvc2l0ZX0gYW5kIGltcGxlbWVudCBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMNCi0gICAgICogYSBzaW5nbGUgcGFyZW50IHtAbGluayBDb21wb3NpdGV9IGFyZ3VtZW50Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIEFsbCBwYWdlcyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHtAbGluayAjb3BlbigpfS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgcGFnZS4NCi0gICAgICogQHBhcmFtIHBhZ2VDbGFzcyBUaGUge0BsaW5rIENvbXBvc2l0ZX0tZGVyaXZlZCBjbGFzcyB0aGF0IHdpbGwgaW1wbGVtZW50IHRoZSBwYWdlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJFeHRyYVBhZ2UoU3RyaW5nIHRpdGxlLCBDbGFzczw/IGV4dGVuZHMgQ29tcG9zaXRlPiBwYWdlQ2xhc3MpIHsNCi0gICAgICAgIGlmIChtRXh0cmFQYWdlcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgbUV4dHJhUGFnZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFtdPigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbUV4dHJhUGFnZXMuYWRkKG5ldyBPYmplY3RbXXsgdGl0bGUsIHBhZ2VDbGFzcyB9KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGUgdGhlIGluaXRpYWwgcGFnZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIHRoZSB3aW5kb3cgb3BlbnMuDQotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHtAbGluayAjb3BlbigpfS4NCi0gICAgICogSWYgbnVsbCBvciBpZiB0aGUgcGFnZSBjbGFzcyBpcyBub3QgZm91bmQsIHRoZSBmaXJzdCBwYWdlIHdpbGwgYmUgc2VsZWN0ZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUGFnZShDbGFzczw/IGV4dGVuZHMgQ29tcG9zaXRlPiBwYWdlQ2xhc3MpIHsNCi0gICAgICAgIG1Jbml0aWFsUGFnZSA9IHBhZ2VDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBhdXRvLXVwZGF0ZSB3aXphcmQgd2lsbCBiZSBzaG93biB3aGVuIG9wZW5pbmcgdGhlIHdpbmRvdy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbCB0byB7QGxpbmsgI29wZW4oKX0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0QXV0b1VwZGF0ZShib29sZWFuIHJlcXVlc3RBdXRvVXBkYXRlKSB7DQotICAgICAgICBtUmVxdWVzdEF1dG9VcGRhdGUgPSByZXF1ZXN0QXV0b1VwZGF0ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhIG5ldyBsaXN0ZW5lciB0byBiZSBub3RpZmllZCB3aGVuIGEgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIFNESy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVycyhJU2RrTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0gICAgICAgIG1VcGRhdGVyRGF0YS5hZGRMaXN0ZW5lcnMobGlzdGVuZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZW1vdmVzIGEgbmV3IGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGFueW1vcmUgd2hlbiBhIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBjb250ZW50IG9mDQotICAgICAqIHRoZSBTREsuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU2RrTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0gICAgICAgIG1VcGRhdGVyRGF0YS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tIEludGVybmFscyAmIFVJIENhbGxiYWNrcyAtLS0tLS0tLS0tLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogSGVscGVyIHRvIHJldHVybiB0aGUgU1dUIHNoZWxsLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsNCi0gICAgICAgIHJldHVybiBtQW5kcm9pZFNka1VwZGF0ZXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSB3aW5kb3cgc2hlbGwgaXMgZGlzcG9zZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25BbmRyb2lkU2RrVXBkYXRlckRpc3Bvc2UoKSB7DQotICAgICAgICBpZiAobVVwZGF0ZXJEYXRhICE9IG51bGwpIHsNCi0gICAgICAgICAgICBJbWFnZUZhY3RvcnkgaW1nRmFjdG9yeSA9IG1VcGRhdGVyRGF0YS5nZXRJbWFnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICBpZiAoaW1nRmFjdG9yeSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGltZ0ZhY3RvcnkuZGlzcG9zZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyB0aGUgaWNvbiBvZiB0aGUgd2luZG93IHNoZWxsLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdpbmRvd0ltYWdlKFNoZWxsIGFuZHJvaWRTZGtVcGRhdGVyKSB7DQotICAgICAgICBTdHJpbmcgaW1hZ2VOYW1lID0gImFuZHJvaWRfaWNvbl8xNi5wbmciOyAvLyROT04tTkxTLTEkDQotICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLmN1cnJlbnRQbGF0Zm9ybSgpID09IFNka0NvbnN0YW50cy5QTEFURk9STV9EQVJXSU4pIHsNCi0gICAgICAgICAgICBpbWFnZU5hbWUgPSAiYW5kcm9pZF9pY29uXzEyOC5wbmciOyAvLyROT04tTkxTLTEkDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobVVwZGF0ZXJEYXRhICE9IG51bGwpIHsNCi0gICAgICAgICAgICBJbWFnZUZhY3RvcnkgaW1nRmFjdG9yeSA9IG1VcGRhdGVyRGF0YS5nZXRJbWFnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICBpZiAoaW1nRmFjdG9yeSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG1BbmRyb2lkU2RrVXBkYXRlci5zZXRJbWFnZShpbWdGYWN0b3J5LmdldEltYWdlQnlOYW1lKGltYWdlTmFtZSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT25jZSB0aGUgVUkgaGFzIGJlZW4gY3JlYXRlZCwgaW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnQuDQotICAgICAqIFRoaXMgY3JlYXRlcyB0aGUgcGFnZXMsIHNlbGVjdHMgdGhlIGZpcnN0IG9uZSwgc2V0dXAgc291cmNlcyBhbmQgc2NhbiBmb3IgbG9jYWwgZm9sZGVycy4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3N0Q3JlYXRlKCkgew0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLnNldFdpbmRvd1NoZWxsKGdldFNoZWxsKCkpOw0KLSAgICAgICAgbVRhc2tGYWN0b3J5ID0gbmV3IFByb2dyZXNzVGFza0ZhY3RvcnkoZ2V0U2hlbGwoKSk7DQotICAgICAgICBtVXBkYXRlckRhdGEuc2V0VGFza0ZhY3RvcnkobVRhc2tGYWN0b3J5KTsNCi0gICAgICAgIG1VcGRhdGVyRGF0YS5zZXRJbWFnZUZhY3RvcnkobmV3IEltYWdlRmFjdG9yeShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSkpOw0KLQ0KLSAgICAgICAgc2V0V2luZG93SW1hZ2UobUFuZHJvaWRTZGtVcGRhdGVyKTsNCi0NCi0gICAgICAgIGFkZFBhZ2UobUF2ZE1hbmFnZXJQYWdlLCAgICAgIlZpcnR1YWwgRGV2aWNlcyIpOw0KLSAgICAgICAgYWRkUGFnZShtTG9jYWxQYWNrYWdlUGFnZSwgICAiSW5zdGFsbGVkIFBhY2thZ2VzIik7DQotICAgICAgICBhZGRQYWdlKG1SZW1vdGVQYWNrYWdlc1BhZ2UsICJBdmFpbGFibGUgUGFja2FnZXMiKTsNCi0gICAgICAgIGFkZEV4dHJhUGFnZXMoKTsNCi0NCi0gICAgICAgIGludCBwYWdlSW5kZXggPSAwOw0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgZm9yIChDb21wb3NpdGUgcCA6IG1QYWdlcykgew0KLSAgICAgICAgICAgIGlmIChwLmdldENsYXNzKCkuZXF1YWxzKG1Jbml0aWFsUGFnZSkpIHsNCi0gICAgICAgICAgICAgICAgcGFnZUluZGV4ID0gaTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGRpc3BsYXlQYWdlKHBhZ2VJbmRleCk7DQotICAgICAgICBtUGFnZUxpc3Quc2V0U2VsZWN0aW9uKHBhZ2VJbmRleCk7DQotDQotICAgICAgICBzZXR1cFNvdXJjZXMoKTsNCi0gICAgICAgIGluaXRpYWxpemVTZXR0aW5ncygpOw0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLm5vdGlmeUxpc3RlbmVycygpOw0KLQ0KLSAgICAgICAgaWYgKG1SZXF1ZXN0QXV0b1VwZGF0ZSkgew0KLSAgICAgICAgICAgIG1VcGRhdGVyRGF0YS51cGRhdGVPckluc3RhbGxBbGwobnVsbCAvKnNlbGVjdGVkQXJjaGl2ZXMqLyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBieSB0aGUgbWFpbiBsb29wIHdoZW4gdGhlIHdpbmRvdyBoYXMgYmVlbiBkaXNwb3NlZC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlKCkgew0KLSAgICAgICAgbVVwZGF0ZXJEYXRhLmdldFNvdXJjZXMoKS5zYXZlVXNlclNvdXJjZXMobVVwZGF0ZXJEYXRhLmdldFNka0xvZygpKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0gcGFnZSBzd2l0Y2hpbmcgLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGFuIGluc3RhbmNlIG9mIGEgcGFnZSB0byB0aGUgcGFnZSBsaXN0Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIEVhY2ggcGFnZSBpcyBhIHtAbGluayBDb21wb3NpdGV9LiBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UgaXMgc3RvcmVkIGluIHRoZQ0KLSAgICAgKiB7QGxpbmsgQ29tcG9zaXRlI2dldERhdGEoKX0gZmllbGQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGFnZShDb21wb3NpdGUgcGFnZSwgU3RyaW5nIHRpdGxlKSB7DQotICAgICAgICBwYWdlLnNldERhdGEodGl0bGUpOw0KLSAgICAgICAgbVBhZ2VzLmFkZChwYWdlKTsNCi0gICAgICAgIG1QYWdlTGlzdC5hZGQodGl0bGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGFsbCBleHRyYSBwYWdlcy4gRm9yIGVhY2ggcGFnZSwgaW5zdGFudGlhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgQ29tcG9zaXRlfQ0KLSAgICAgKiB1c2luZyB0aGUgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSB7QGxpbmsgQ29tcG9zaXRlfSBhcmd1bWVudCBhbmQgdGhlbiBhZGRzIGl0DQotICAgICAqIHRvIHRoZSBwYWdlIGxpc3QuDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEV4dHJhUGFnZXMoKSB7DQotICAgICAgICBpZiAobUV4dHJhUGFnZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoT2JqZWN0W10gZXh0cmFQYWdlIDogbUV4dHJhUGFnZXMpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAoU3RyaW5nKSBleHRyYVBhZ2VbMF07DQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbXBvc2l0ZT4gY2xhenogPSAoQ2xhc3M8PyBleHRlbmRzIENvbXBvc2l0ZT4pIGV4dHJhUGFnZVsxXTsNCi0NCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIENvbXBvc2l0ZSBhcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgQ29tcG9zaXRlPiBjb25zOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGNvbnMgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3M8Pz5bXSB7IENvbXBvc2l0ZS5jbGFzcyB9KTsNCi0gICAgICAgICAgICAgICAgQ29tcG9zaXRlIGluc3RhbmNlID0gY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBtUGFnZXNSb290Q29tcG9zaXRlIH0pOw0KLSAgICAgICAgICAgICAgICBhZGRQYWdlKGluc3RhbmNlLCB0aXRsZSk7DQotDQotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc3VjaCBjb25zdHJ1Y3Rvci4NCi0gICAgICAgICAgICAgICAgbVVwZGF0ZXJEYXRhLmdldFNka0xvZygpLmVycm9yKGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZGQgZXh0cmEgcGFnZSAlMSRzLiBDb25zdHJ1Y3RvciBhcmdzIG11c3QgYmUgKENvbXBvc2l0ZSBwYXJlbnQpLiIsICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyBMb2cgdGhpcyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHRoZSB3aG9sZSBhcHAuDQotICAgICAgICAgICAgICAgIG1VcGRhdGVyRGF0YS5nZXRTZGtMb2coKS5lcnJvcihlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWRkIGV4dHJhIHBhZ2UgJTEkcy4iLCAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgcGFnZSBsaXN0Lg0KLSAgICAgKiBJZiB0aGlzIGlzIG5vdCBhbiBpbnRlcm5hbCBwYWdlIGNoYW5nZSwgZGlzcGxheXMgdGhlIGdpdmVuIHBhZ2UuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25QYWdlTGlzdFNlbGVjdGVkKCkgew0KLSAgICAgICAgaWYgKG1JbnRlcm5hbFBhZ2VDaGFuZ2UgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBtUGFnZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsNCi0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgew0KLSAgICAgICAgICAgICAgICBkaXNwbGF5UGFnZShpbmRleCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEaXNwbGF5cyB0aGUgcGFnZSBhdCB0aGUgZ2l2ZW4gaW5kZXguDQotICAgICAqDQotICAgICAqIEBwYXJhbSBpbmRleCBBbiBpbmRleCBiZXR3ZWVuIDAgYW5kIHtAbGluayAjbVBhZ2VzfSdzIGxlbmd0aCAtIDEuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheVBhZ2UoaW50IGluZGV4KSB7DQotICAgICAgICBDb21wb3NpdGUgcGFnZSA9IG1QYWdlcy5nZXQoaW5kZXgpOw0KLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1TdGFja0xheW91dC50b3BDb250cm9sID0gcGFnZTsNCi0gICAgICAgICAgICBtUGFnZXNSb290Q29tcG9zaXRlLmxheW91dCh0cnVlKTsNCi0NCi0gICAgICAgICAgICBpZiAoIW1JbnRlcm5hbFBhZ2VDaGFuZ2UpIHsNCi0gICAgICAgICAgICAgICAgbUludGVybmFsUGFnZUNoYW5nZSA9IHRydWU7DQotICAgICAgICAgICAgICAgIG1QYWdlTGlzdC5zZXRTZWxlY3Rpb24oaW5kZXgpOw0KLSAgICAgICAgICAgICAgICBtSW50ZXJuYWxQYWdlQ2hhbmdlID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVc2VkIHRvIGluaXRpYWxpemUgdGhlIHNvdXJjZXMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTb3VyY2VzKCkgew0KLSAgICAgICAgUmVwb1NvdXJjZXMgc291cmNlcyA9IG1VcGRhdGVyRGF0YS5nZXRTb3VyY2VzKCk7DQotICAgICAgICBzb3VyY2VzLmFkZChuZXcgUmVwb1NvdXJjZShTZGtSZXBvc2l0b3J5LlVSTF9HT09HTEVfU0RLX1JFUE9fU0lURSwgZmFsc2UgLyp1c2VyU291cmNlKi8pKTsNCi0NCi0gICAgICAgIC8vIFNES19VUERBVEVSX1VSTFMgaXMgYSBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyB0aGF0IGNhbiBiZSB1c2VkIHRvDQotICAgICAgICAvLyBzZWVkIHRoZSBTREsgVXBkYXRlciBsaXN0IGZvciBmdWxsIHJlcG9zaXRvcmllcy4NCi0gICAgICAgIFN0cmluZyBzdHIgPSBTeXN0ZW0uZ2V0ZW52KCJTREtfVVBEQVRFUl9VUkxTIik7DQotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmdbXSB1cmxzID0gc3RyLnNwbGl0KCI7Iik7DQotICAgICAgICAgICAgZm9yIChTdHJpbmcgdXJsIDogdXJscykgew0KLSAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgUmVwb1NvdXJjZSBzID0gbmV3IFJlcG9Tb3VyY2UodXJsLCBmYWxzZSAvKnVzZXJTb3VyY2UqLyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZXMuaGFzU291cmNlKHMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hZGQocyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBMb2FkIHVzZXIgc291cmNlcw0KLSAgICAgICAgc291cmNlcy5sb2FkVXNlclNvdXJjZXMobVVwZGF0ZXJEYXRhLmdldFNka0xvZygpKTsNCi0NCi0gICAgICAgIC8vIFNES19VUERBVEVSX1VTRVJfVVJMUyBpcyBhIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBVUkxzIHRoYXQgY2FuIGJlIHVzZWQgdG8NCi0gICAgICAgIC8vIHNlZWQgdGhlIFNESyBVcGRhdGVyIGxpc3QgZm9yIHVzZXItb25seSByZXBvc2l0b3JpZXMuIFVzZXIgc291cmNlcyBjYW4gb25seSBwcm92aWRlDQotICAgICAgICAvLyBhZGQtb25zIGFuZCBleHRyYSBwYWNrYWdlcy4NCi0gICAgICAgIHN0ciA9IFN5c3RlbS5nZXRlbnYoIlNES19VUERBVEVSX1VTRVJfVVJMUyIpOw0KLSAgICAgICAgaWYgKHN0ciAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nW10gdXJscyA9IHN0ci5zcGxpdCgiOyIpOw0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHVybCA6IHVybHMpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIFJlcG9Tb3VyY2UgcyA9IG5ldyBSZXBvU291cmNlKHVybCwgdHJ1ZSAvKnVzZXJTb3VyY2UqLyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZXMuaGFzU291cmNlKHMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hZGQocyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBtUmVtb3RlUGFja2FnZXNQYWdlLm9uU2RrQ2hhbmdlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEluaXRpYWxpemVzIHNldHRpbmdzLg0KLSAgICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFkZEV4dHJhUGFnZXMoKSwgd2hpY2ggY3JlYXRlZCBhIHNldHRpbmdzIHBhZ2UuDQotICAgICAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHBhZ2VzIHRvIGZpbmQgdGhlIGZpcnN0IChhbmQgc3VwcG9zZWRseSB1bmlxdWUpIHNldHRpbmcgcGFnZSwNCi0gICAgICogYW5kIHVzZSBpdCB0byBsb2FkIGFuZCBhcHBseSB0aGVzZSBzZXR0aW5ncy4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3MoKSB7DQotICAgICAgICBTZXR0aW5nc0NvbnRyb2xsZXIgYyA9IG1VcGRhdGVyRGF0YS5nZXRTZXR0aW5nc0NvbnRyb2xsZXIoKTsNCi0gICAgICAgIGMubG9hZFNldHRpbmdzKCk7DQotICAgICAgICBjLmFwcGx5U2V0dGluZ3MoKTsNCi0NCi0gICAgICAgIGZvciAoT2JqZWN0IHBhZ2UgOiBtUGFnZXMpIHsNCi0gICAgICAgICAgICBpZiAocGFnZSBpbnN0YW5jZW9mIElTZXR0aW5nc1BhZ2UpIHsNCi0gICAgICAgICAgICAgICAgSVNldHRpbmdzUGFnZSBzZXR0aW5nc1BhZ2UgPSAoSVNldHRpbmdzUGFnZSkgcGFnZTsNCi0NCi0gICAgICAgICAgICAgICAgYy5zZXRTZXR0aW5nc1BhZ2Uoc2V0dGluZ3NQYWdlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vIEVuZCBvZiBoaWRpbmcgZnJvbSBTV1QgRGVzaWduZXINCi0gICAgLy8kaGlkZTw8JA0KLX0NCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvSW1hZ2VGYWN0b3J5LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvSW1hZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiZDg0NmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL0ltYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Lmljb25zOw0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BZGRvblBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkFyY2hpdmU7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkRvY1BhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LkV4dHJhUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuUGxhdGZvcm1QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5SZXBvU291cmNlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5Ub29sUGFja2FnZTsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5SZXBvU291cmNlc0FkYXB0ZXI7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBBbiB1dGlsaXR5IGNsYXNzIHRvIHNlcnZlIHtAbGluayBJbWFnZX0gY29ycmVzcG9uZCB0byB0aGUgdmFyaW91cyBpY29ucw0KLSAqIHByZXNlbnQgaW4gdGhpcyBwYWNrYWdlIGFuZCBkaXNwb3NlIG9mIHRoZW0gY29ycmVjdGx5IGF0IHRoZSBlbmQuDQotICovDQotcHVibGljIGNsYXNzIEltYWdlRmFjdG9yeSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheSBtRGlzcGxheTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW1hZ2U+IG1JbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOw0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VGYWN0b3J5KERpc3BsYXkgZGlzcGxheSkgew0KLSAgICAgICAgbURpc3BsYXkgPSBkaXNwbGF5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2FkcyBhbiBpbWFnZSBnaXZlbiBpdHMgZmlsZW5hbWUgKHdpdGggaXRzIGV4dGVuc2lvbikuDQotICAgICAqIE1pZ2h0IHJldHVybiBudWxsIGlmIHRoZSBpbWFnZSBjYW5ub3QgYmUgbG9hZGVkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gaW1hZ2VOYW1lIFRoZSBmaWxlbmFtZSAod2l0aCBleHRlbnNpb24pIG9mIHRoZSBpbWFnZSB0byBsb2FkLg0KLSAgICAgKiBAcmV0dXJuIEEgbmV3IG9yIGV4aXN0aW5nIHtAbGluayBJbWFnZX0uIFRoZSBjYWxsZXIgbXVzdCBOT1QgZGlzcG9zZSB0aGUgaW1hZ2UgKHRoZQ0KLSAgICAgKiAgaW1hZ2Ugd2lsbCBkaXNwb3NlZCBieSB7QGxpbmsgI2Rpc3Bvc2UoKX0pLiBUaGUgcmV0dXJuZWQgaW1hZ2UgY2FuIGJlIG51bGwgaWYgdGhlDQotICAgICAqICBleHBlY3RlZCBmaWxlIGlzIG1pc3NpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VCeU5hbWUoU3RyaW5nIGltYWdlTmFtZSkgew0KLQ0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBtSW1hZ2VzLmdldChpbWFnZU5hbWUpOw0KLSAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gaW1hZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VOYW1lKTsNCi0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKG1EaXNwbGF5LCBzdHJlYW0pOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFN0b3JlIHRoZSBpbWFnZSBpbiB0aGUgaGFzaCwgZXZlbiBpZiB0aGlzIGZhaWxlZC4gSWYgaXQgZmFpbHMgbm93LCBpdCB3aWxsIGZhaWwgbGF0ZXIuDQotICAgICAgICBtSW1hZ2VzLnB1dChpbWFnZU5hbWUsIGltYWdlKTsNCi0NCi0gICAgICAgIHJldHVybiBpbWFnZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9hZHMgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGltYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UsIGFyY2hpdmUgb3Igc291cmNlIG9iamVjdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG9iamVjdCBBIHtAbGluayBSZXBvU291cmNlfSBvciB7QGxpbmsgUGFja2FnZX0gb3Ige0BsaW5rIEFyY2hpdmV9Lg0KLSAgICAgKiBAcmV0dXJuIEEgbmV3IG9yIGV4aXN0aW5nIHtAbGluayBJbWFnZX0uIFRoZSBjYWxsZXIgbXVzdCBOT1QgZGlzcG9zZSB0aGUgaW1hZ2UgKHRoZQ0KLSAgICAgKiAgaW1hZ2Ugd2lsbCBkaXNwb3NlZCBieSB7QGxpbmsgI2Rpc3Bvc2UoKX0pLiBUaGUgcmV0dXJuZWQgaW1hZ2UgY2FuIGJlIG51bGwgaWYgdGhlDQotICAgICAqICBleHBlY3RlZCBmaWxlIGlzIG1pc3NpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgew0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlcG9Tb3VyY2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VCeU5hbWUoInNvdXJjZV9pY29uMTYucG5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVwb1NvdXJjZXNBZGFwdGVyLlJlcG9Tb3VyY2VFcnJvcikgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUJ5TmFtZSgiZXJyb3JfaWNvbjE2LnBuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXBvU291cmNlc0FkYXB0ZXIuUmVwb1NvdXJjZUVtcHR5KSB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlQnlOYW1lKCJub3BrZ19pY29uMTYucG5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotDQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBsYXRmb3JtUGFja2FnZSkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUJ5TmFtZSgiYW5kcm9pZF9pY29uXzE2LnBuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGRvblBhY2thZ2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VCeU5hbWUoImFkZG9uX2ljb24xNi5wbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVG9vbFBhY2thZ2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VCeU5hbWUoInRvb2xfaWNvbjE2LnBuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRG9jUGFja2FnZSkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUJ5TmFtZSgiZG9jX2ljb24xNi5wbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFeHRyYVBhY2thZ2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VCeU5hbWUoImV4dHJhX2ljb24xNi5wbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJjaGl2ZSkgew0KLSAgICAgICAgICAgIGlmICgoKEFyY2hpdmUpIG9iamVjdCkuaXNDb21wYXRpYmxlKCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlQnlOYW1lKCJhcmNoaXZlX2ljb24xNi5wbmciKTsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VCeU5hbWUoImluY29tcGF0X2ljb24xNi5wbmciKTsgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEaXNwb3NlIGFsbCB0aGUgaW1hZ2VzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5IHNvIGZhci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotICAgICAgICBJdGVyYXRvcjxJbWFnZT4gaXQgPSBtSW1hZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBJbWFnZSBpbWcgPSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKGltZyAhPSBudWxsICYmIGltZy5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICAgICAgaW1nLmRpc3Bvc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaXQucmVtb3ZlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FjY2VwdF9pY29uMTYucG5nIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FjY2VwdF9pY29uMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTQ4M2ZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9hY2NlcHRfaWNvbjE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9hZGRvbl9pY29uMTYucG5nIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FkZG9uX2ljb24xNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNmEyMzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FkZG9uX2ljb24xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvYW5kcm9pZF9pY29uXzEyOC5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvYW5kcm9pZF9pY29uXzEyOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjk1OGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FuZHJvaWRfaWNvbl8xMjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2FuZHJvaWRfaWNvbl8xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvYW5kcm9pZF9pY29uXzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIwNzQ0Yi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvYW5kcm9pZF9pY29uXzE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9hcmNoaXZlX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvYXJjaGl2ZV9pY29uMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTVlZGQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9hcmNoaXZlX2ljb24xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvZG9jX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvZG9jX2ljb24xNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNTZjYjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2RvY19pY29uMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2Vycm9yX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvZXJyb3JfaWNvbjE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NiNGQwYS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvZXJyb3JfaWNvbjE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9leHRyYV9pY29uMTYucG5nIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2V4dHJhX2ljb24xNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NTI5ZjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL2V4dHJhX2ljb24xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvaW5jb21wYXRfaWNvbjE2LnBuZyBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9pbmNvbXBhdF9pY29uMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTMwN2U5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9pbmNvbXBhdF9pY29uMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL25vcGtnX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvbm9wa2dfaWNvbjE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQ3ODM3Zi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvbm9wa2dfaWNvbjE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9yZWplY3RfaWNvbjE2LnBuZyBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy9yZWplY3RfaWNvbjE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg3YmJjOS4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvcmVqZWN0X2ljb24xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvc291cmNlX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvc291cmNlX2ljb24xNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlYjFlYWQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL3NvdXJjZV9pY29uMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL3Rvb2xfaWNvbjE2LnBuZyBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy90b29sX2ljb24xNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjYTc3MTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC9yZXBvc2l0b3J5L2ljb25zL3Rvb2xfaWNvbjE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy91bmtub3duX2ljb24xNi5wbmcgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvaWNvbnMvdW5rbm93bl9pY29uMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjk3ZWI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9pY29ucy91bmtub3duX2ljb24xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3Rhc2tzL1Byb2dyZXNzRGlhbG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3Rhc2tzL1Byb2dyZXNzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNzljNjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC90YXNrcy9Qcm9ncmVzc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC50YXNrczsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka0NvbnN0YW50czsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2tNb25pdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50Ow0KLQ0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudHMgYSB7QGxpbmsgUHJvZ3Jlc3NEaWFsb2d9LCB1c2VkIGJ5IHRoZSB7QGxpbmsgUHJvZ3Jlc3NUYXNrfSBjbGFzcy4NCi0gKiBUaGlzIHNlcGFyYXRlcyB0aGUgZGlhbG9nIFVJIGZyb20gdGhlIHRhc2sgbG9naWMuDQotICoNCi0gKiBOb3RlOiB0aGlzIGRvZXMgbm90IGltcGxlbWVudCB0aGUge0BsaW5rIElUYXNrTW9uaXRvcn0gaW50ZXJmYWNlIHRvIGF2b2lkIGNvbmZ1c2luZw0KLSAqIFNXVCBEZXNpZ25lci4NCi0gKi8NCi1maW5hbCBjbGFzcyBQcm9ncmVzc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7DQotDQotICAgIC8qKg0KLSAgICAgKiBNaW4gWSBsb2NhdGlvbiBmb3IgZGlhbG9nLiBOZWVkIHRvIGRlYWwgd2l0aCB0aGUgbWVudSBiYXIgb24gbWFjIG9zLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1JTl9ZID0gU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX0RBUldJTiA/DQotICAgICAgICAgICAgMjAgOiAwOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBlbnVtIENhbmNlbE1vZGUgew0KLSAgICAgICAgLyoqIENhbmNlbCBidXR0b24gc2F5cyAiQ2FuY2VsIiBhbmQgaXMgZW5hYmxlZC4gV2FpdGluZyBmb3IgdXNlciB0byBjYW5jZWwuICovDQotICAgICAgICBBQ1RJVkUsDQotICAgICAgICAvKiogQ2FuY2VsIGJ1dHRvbiBoYXMgYmVlbiBjbGlja2VkLiBXYWl0aW5nIGZvciB0aHJlYWQgdG8gZmluaXNoLiAqLw0KLSAgICAgICAgQ0FOQ0VMX1BFTkRJTkcsDQotICAgICAgICAvKiogQ2xvc2UgcGVuZGluZy4gQ2xvc2UgYnV0dG9uIGNsaWNrZWQgb3IgdGhyZWFkIGZpbmlzaGVkIGJ1dCB0aGVyZSB3ZXJlIHNvbWUNCi0gICAgICAgICAqIG1lc3NhZ2VzIHNvIHRoZSB1c2VyIG5lZWRzIHRvIG1hbnVhbGx5IGNsb3NlLiAqLw0KLSAgICAgICAgQ0xPU0VfTUFOVUFMLA0KLSAgICAgICAgLyoqIENsb3NlIGJ1dHRvbiBjbGlja2VkIG9yIHRocmVhZCBmaW5pc2hlZC4gVGhlIHdpbmRvdyB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2UuICovDQotICAgICAgICBDTE9TRV9BVVRPDQotICAgIH0NCi0NCi0gICAgLyoqIFRoZSBjdXJyZW50IG1vZGUgb2Ygb3BlcmF0aW9uIG9mIHRoZSBkaWFsb2cuICovDQotICAgIHByaXZhdGUgQ2FuY2VsTW9kZSBtQ2FuY2VsTW9kZSA9IENhbmNlbE1vZGUuQUNUSVZFOw0KLQ0KLSAgICAvKiogTGFzdCBkaWFsb2cgc2l6ZSBmb3IgdGhpcyBzZXNzaW9uLiAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBQb2ludCBzTGFzdFNpemU7DQotDQotDQotICAgIC8vIFVJIGZpZWxkcw0KLSAgICBwcml2YXRlIFNoZWxsIG1EaWFsb2dTaGVsbDsNCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVJvb3RDb21wb3NpdGU7DQotICAgIHByaXZhdGUgTGFiZWwgbUxhYmVsOw0KLSAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzc0JhcjsNCi0gICAgcHJpdmF0ZSBCdXR0b24gbUNhbmNlbEJ1dHRvbjsNCi0gICAgcHJpdmF0ZSBUZXh0IG1SZXN1bHRUZXh0Ow0KLSAgICBwcml2YXRlIGZpbmFsIFRocmVhZCBtVGFza1RocmVhZDsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSB0aGUgZGlhbG9nLg0KLSAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjb250YWluZXINCi0gICAgICogQHBhcmFtIHRhc2tUaHJlYWQgVGhlIHRocmVhZCB0byBydW4gdGhlIHRhc2suDQotICAgICAqLw0KLSAgICBwdWJsaWMgUHJvZ3Jlc3NEaWFsb2coU2hlbGwgcGFyZW50LCBUaHJlYWQgdGFza1RocmVhZCkgew0KLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOw0KLSAgICAgICAgbVRhc2tUaHJlYWQgPSB0YXNrVGhyZWFkOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBPcGVuIHRoZSBkaWFsb2cgYW5kIGJsb2NrcyB0aWxsIGl0IGdldHMgY2xvc2VkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBvcGVuKCkgew0KLSAgICAgICAgY3JlYXRlQ29udGVudHMoKTsNCi0gICAgICAgIHBvc2l0aW9uU2hlbGwoKTsgICAgICAgICAgICAvLyRoaWRlJCAoaGlkZSBmcm9tIFNXVCBkZXNpZ25lcikNCi0gICAgICAgIG1EaWFsb2dTaGVsbC5vcGVuKCk7DQotICAgICAgICBtRGlhbG9nU2hlbGwubGF5b3V0KCk7DQotDQotICAgICAgICBzdGFydFRocmVhZCgpOyAgICAgICAgICAgICAgLy8kaGlkZSQgKGhpZGUgZnJvbSBTV1QgZGVzaWduZXIpDQotDQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCk7DQotICAgICAgICB3aGlsZSAoIW1EaWFsb2dTaGVsbC5pc0Rpc3Bvc2VkKCkgJiYgbUNhbmNlbE1vZGUgIT0gQ2FuY2VsTW9kZS5DTE9TRV9BVVRPKSB7DQotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7DQotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRDYW5jZWxSZXF1ZXN0ZWQoKTsgICAgICAgLy8kaGlkZSQgKGhpZGUgZnJvbSBTV1QgZGVzaWduZXIpDQotDQotICAgICAgICBpZiAoIW1EaWFsb2dTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICBzTGFzdFNpemUgPSBtRGlhbG9nU2hlbGwuZ2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIG1EaWFsb2dTaGVsbC5jbG9zZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIGRpYWxvZy4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCi0gICAgICAgIG1EaWFsb2dTaGVsbCA9IG5ldyBTaGVsbChnZXRQYXJlbnQoKSwgU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSk7DQotICAgICAgICBtRGlhbG9nU2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBvblNoZWxsQ2xvc2VkKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgbURpYWxvZ1NoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOw0KLSAgICAgICAgbURpYWxvZ1NoZWxsLnNldFNpemUoNDUwLCAzMDApOw0KLSAgICAgICAgbURpYWxvZ1NoZWxsLnNldFRleHQoZ2V0VGV4dCgpKTsNCi0NCi0gICAgICAgIG1Sb290Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtRGlhbG9nU2hlbGwsIFNXVC5OT05FKTsNCi0gICAgICAgIG1Sb290Q29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOw0KLSAgICAgICAgbVJvb3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7DQotDQotICAgICAgICBtTGFiZWwgPSBuZXcgTGFiZWwobVJvb3RDb21wb3NpdGUsIFNXVC5OT05FKTsNCi0gICAgICAgIG1MYWJlbC5zZXRUZXh0KCJUYXNrIik7DQotICAgICAgICBtTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7DQotDQotICAgICAgICBtUHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIobVJvb3RDb21wb3NpdGUsIFNXVC5OT05FKTsNCi0gICAgICAgIG1Qcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsNCi0gICAgICAgIG1DYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKG1Sb290Q29tcG9zaXRlLCBTV1QuTk9ORSk7DQotICAgICAgICBtQ2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7DQotICAgICAgICBtQ2FuY2VsQnV0dG9uLnNldFRleHQoIkNhbmNlbCIpOw0KLQ0KLSAgICAgICAgbUNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIG9uQ2FuY2VsU2VsZWN0ZWQoKTsgIC8vJGhpZGUkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBtUmVzdWx0VGV4dCA9IG5ldyBUZXh0KG1Sb290Q29tcG9zaXRlLA0KLSAgICAgICAgICAgICAgICBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkNBTkNFTCB8IFNXVC5NVUxUSSk7DQotICAgICAgICBtUmVzdWx0VGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsNCi0gICAgICAgIG1SZXN1bHRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOw0KLSAgICB9DQotDQotICAgIC8vIC0tIEVuZCBvZiBVSSwgU3RhcnQgb2YgaW50ZXJuYWwgbG9naWMgLS0tLS0tLS0tLQ0KLSAgICAvLyBIaWRlIGV2ZXJ5dGhpbmcgZG93bi1iZWxvdyBmcm9tIFNXVCBkZXNpZ25lcg0KLSAgICAvLyRoaWRlPj4kDQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkKCkgew0KLSAgICAgICAgcmV0dXJuIG1DYW5jZWxNb2RlICE9IENhbmNlbE1vZGUuQUNUSVZFOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBtb2RlIHRvIGNhbmNlbCBwZW5kaW5nLg0KLSAgICAgKiBUaGUgZmlyc3QgdGltZSB0aGlzIGdyYXlzIHRoZSBjYW5jZWwgYnV0dG9uLCB0byBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZQ0KLSAgICAgKiBjYW5jZWwgb3BlcmF0aW9uIGlzIHBlbmRpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxSZXF1ZXN0ZWQoKSB7DQotICAgICAgICBpZiAoIW1EaWFsb2dTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAvLyBUaGUgZGlhbG9nIGlzIG5vdCBkaXNwb3NlZCwgbWFrZSBzdXJlIHRvIHJ1biBhbGwgdGhpcyBpbiB0aGUgVUkgdGhyZWFkDQotICAgICAgICAgICAgLy8gYW5kIGxvY2sgb24gdGhlIGNhbmNlbCBidXR0b24gbW9kZS4NCi0gICAgICAgICAgICBtRGlhbG9nU2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FuY2VsTW9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FuY2VsTW9kZSA9PSBDYW5jZWxNb2RlLkFDVElWRSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FuY2VsTW9kZSA9IENhbmNlbE1vZGUuQ0FOQ0VMX1BFTkRJTkc7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUNhbmNlbEJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gVGhlIGRpYWxvZyBpcyBkaXNwb3NlZC4gSnVzdCBzZXQgdGhlIGJvb2xlYW4uIFdlIHNob3VsZG4ndCBiZSBoZXJlLg0KLSAgICAgICAgICAgIGlmIChtQ2FuY2VsTW9kZSA9PSBDYW5jZWxNb2RlLkFDVElWRSkgew0KLSAgICAgICAgICAgICAgICBtQ2FuY2VsTW9kZSA9IENhbmNlbE1vZGUuQ0FOQ0VMX1BFTkRJTkc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBtb2RlIHRvIGNsb3NlIG1hbnVhbC4NCi0gICAgICogVGhlIGZpcnN0IHRpbWUsIHRoaXMgYWxzbyB1bmdyYXlzIHRoZSBwYXVzZSBidXR0b24gYW5kIGNvbnZlcnRzIGl0IHRvIGEgY2xvc2UgYnV0dG9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWFudWFsQ2xvc2VSZXF1ZXN0ZWQoKSB7DQotICAgICAgICBpZiAoIW1EaWFsb2dTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAvLyBUaGUgZGlhbG9nIGlzIG5vdCBkaXNwb3NlZCwgbWFrZSBzdXJlIHRvIHJ1biBhbGwgdGhpcyBpbiB0aGUgVUkgdGhyZWFkDQotICAgICAgICAgICAgLy8gYW5kIGxvY2sgb24gdGhlIGNhbmNlbCBidXR0b24gbW9kZS4NCi0gICAgICAgICAgICBtRGlhbG9nU2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FuY2VsTW9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FuY2VsTW9kZSAhPSBDYW5jZWxNb2RlLkNMT1NFX01BTlVBTCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbE1vZGUgIT0gQ2FuY2VsTW9kZS5DTE9TRV9BVVRPKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxNb2RlID0gQ2FuY2VsTW9kZS5DTE9TRV9NQU5VQUw7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUNhbmNlbEJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0VGV4dCgiQ2xvc2UiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBUaGUgZGlhbG9nIGlzIGRpc3Bvc2VkLiBKdXN0IHNldCB0aGUgYm9vbGVhbnMuIFdlIHNob3VsZG4ndCBiZSBoZXJlLg0KLSAgICAgICAgICAgIGlmIChtQ2FuY2VsTW9kZSAhPSBDYW5jZWxNb2RlLkNMT1NFX01BTlVBTCAmJg0KLSAgICAgICAgICAgICAgICAgICAgbUNhbmNlbE1vZGUgIT0gQ2FuY2VsTW9kZS5DTE9TRV9BVVRPKSB7DQotICAgICAgICAgICAgICAgIG1DYW5jZWxNb2RlID0gQ2FuY2VsTW9kZS5DTE9TRV9NQU5VQUw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBtb2RlIHRvIGNsb3NlIGF1dG8uDQotICAgICAqIFRoZSBtYWluIGxvb3Agd2lsbCBqdXN0IGV4aXQgYW5kIGNsb3NlIHRoZSBzaGVsbCBhdCB0aGUgZmlyc3Qgb3Bwb3J0dW5pdHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ2xvc2VSZXF1ZXN0ZWQoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYW5jZWxNb2RlKSB7DQotICAgICAgICAgICAgaWYgKG1DYW5jZWxNb2RlICE9IENhbmNlbE1vZGUuQ0xPU0VfQVVUTykgew0KLSAgICAgICAgICAgICAgICBtQ2FuY2VsTW9kZSA9IENhbmNlbE1vZGUuQ0xPU0VfQVVUTzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgY2FuY2VsIGJ1dHRvbiBpcyBzZWxlY3RlZC4NCi0gICAgICogV2hlbiBpbiBjbG9zaW5nIG1vZGUsIHRoaXMgc2ltcGx5IGNsb3NlcyB0aGUgc2hlbGwuIE90aGVyd2lzZSB0cmlnZ2VycyBhIGNhbmNlbC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBvbkNhbmNlbFNlbGVjdGVkKCkgew0KLSAgICAgICAgaWYgKG1DYW5jZWxNb2RlID09IENhbmNlbE1vZGUuQ0xPU0VfTUFOVUFMKSB7DQotICAgICAgICAgICAgc2V0QXV0b0Nsb3NlUmVxdWVzdGVkKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHNldENhbmNlbFJlcXVlc3RlZCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHNoZWxsIGlzIGNsb3NlZCBlaXRoZXIgYnkgY2xpY2tpbmcgdGhlIGNsb3NlIGJ1dHRvbg0KLSAgICAgKiBvbiBieSBjYWxsaW5nIHNoZWxsLmNsb3NlKCkuDQotICAgICAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBjbGlja2luZyB0aGUgY2FuY2VsL2Nsb3NlIGJ1dHRvbiB1bmxlc3MgdGhlIG1vZGUgaXMNCi0gICAgICogdG8gYXV0byBjbG9zZSBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBkbyBub3RoaW5nIHRvIGxldCB0aGUgc2hlbGwgY2xvc2Ugbm9ybWFsbHkuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgb25TaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsNCi0gICAgICAgIGlmIChtQ2FuY2VsTW9kZSAhPSBDYW5jZWxNb2RlLkNMT1NFX0FVVE8pIHsNCi0gICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsgLy8gZG9uJ3QgY2xvc2UgZGlyZWN0bHkNCi0gICAgICAgICAgICBvbkNhbmNlbFNlbGVjdGVkKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBjdXJyZW50IHRhc2sgZGlhbG9nLg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbkZvcm1hdCwgZmluYWwgT2JqZWN0Li4uYXJncykgew0KLSAgICAgICAgbURpYWxvZ1NoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLSAgICAgICAgICAgICAgICBpZiAoIW1MYWJlbC5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1MYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoZGVzY3JpcHRpb25Gb3JtYXQsIGFyZ3MpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgY3VycmVudCB0YXNrIGRpYWxvZy4NCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoZmluYWwgU3RyaW5nIHJlc3VsdEZvcm1hdCwgZmluYWwgT2JqZWN0Li4uYXJncykgew0KLSAgICAgICAgaWYgKCFtRGlhbG9nU2hlbGwuaXNEaXNwb3NlZCgpKSB7DQotICAgICAgICAgICAgbURpYWxvZ1NoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVJlc3VsdFRleHQuaXNEaXNwb3NlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFRleHQuc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IFN0cmluZy5mb3JtYXQocmVzdWx0Rm9ybWF0LCBhcmdzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdFRleHQgPSBtUmVzdWx0VGV4dC5nZXRUZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RUZXh0ICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUZXh0Lmxlbmd0aCgpID4gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxhc3RUZXh0LmVuZHNXaXRoKCJcbiIpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VGV4dC5zdGFydHNXaXRoKCJcbiIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRUZXh0LmFwcGVuZCgiXG4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFRleHQuYXBwZW5kKG5ld1RleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICoNCi0gICAgICogQHNlZSBQcm9ncmVzc0JhciNzZXRNYXhpbXVtKGludCkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzTWF4KGZpbmFsIGludCBtYXgpIHsNCi0gICAgICAgIGlmICghbURpYWxvZ1NoZWxsLmlzRGlzcG9zZWQoKSkgew0KLSAgICAgICAgICAgIG1EaWFsb2dTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc0Jhci5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuc2V0TWF4aW11bShtYXgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb2dyZXNzIGJhci4NCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhmaW5hbCBpbnQgdmFsdWUpIHsNCi0gICAgICAgIGlmICghbURpYWxvZ1NoZWxsLmlzRGlzcG9zZWQoKSkgew0KLSAgICAgICAgICAgIG1EaWFsb2dTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc0Jhci5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKHZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBiYXIsDQotICAgICAqIGJldHdlZW4gMCBhbmQgdXAgdG8ge0BsaW5rICNzZXRQcm9ncmVzc01heChpbnQpfSAtIDEuDQotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGZyb20gYSBub24tVUkgdGhyZWFkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGludCBnZXRQcm9ncmVzcygpIHsNCi0gICAgICAgIGZpbmFsIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7IDAgfTsNCi0NCi0gICAgICAgIGlmICghbURpYWxvZ1NoZWxsLmlzRGlzcG9zZWQoKSkgew0KLSAgICAgICAgICAgIG1EaWFsb2dTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc0Jhci5pc0Rpc3Bvc2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSBtUHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRbMF07DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFN0YXJ0cyB0aGUgdGhyZWFkIHRoYXQgcnVucyB0aGUgdGFzay4NCi0gICAgICogVGhpcyBpcyBkZWZlcnJlZCB0aWxsIHRoZSBVSSBpcyBjcmVhdGVkLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGhyZWFkKCkgew0KLSAgICAgICAgaWYgKG1UYXNrVGhyZWFkICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtVGFza1RocmVhZC5zdGFydCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDZW50ZXJzIHRoZSBkaWFsb2cgaW4gaXRzIHBhcmVudCBzaGVsbC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwb3NpdGlvblNoZWxsKCkgew0KLSAgICAgICAgLy8gQ2VudGVycyB0aGUgZGlhbG9nIGluIGl0cyBwYXJlbnQgc2hlbGwNCi0gICAgICAgIFNoZWxsIGNoaWxkID0gbURpYWxvZ1NoZWxsOw0KLSAgICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50KCk7DQotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgew0KLQ0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcGFyZW50IGNsaWVudCBhcmVhIHdpdGggYSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZGlzcGxheQ0KLSAgICAgICAgICAgIFJlY3RhbmdsZSBwYXJlbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0gICAgICAgICAgICBQb2ludCBwYXJlbnRMb2MgPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsNCi0gICAgICAgICAgICBpbnQgcHggPSBwYXJlbnRMb2MueDsNCi0gICAgICAgICAgICBpbnQgcHkgPSBwYXJlbnRMb2MueTsNCi0gICAgICAgICAgICBpbnQgcHcgPSBwYXJlbnRBcmVhLndpZHRoOw0KLSAgICAgICAgICAgIGludCBwaCA9IHBhcmVudEFyZWEuaGVpZ2h0Ow0KLQ0KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBsYXN0IHNpemUgaWYgdGhlcmUncyBvbmUsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQNCi0gICAgICAgICAgICBQb2ludCBjaGlsZFNpemUgPSBzTGFzdFNpemUgIT0gbnVsbCA/IHNMYXN0U2l6ZSA6IGNoaWxkLmdldFNpemUoKTsNCi0gICAgICAgICAgICBpbnQgY3cgPSBjaGlsZFNpemUueDsNCi0gICAgICAgICAgICBpbnQgY2ggPSBjaGlsZFNpemUueTsNCi0NCi0gICAgICAgICAgICBpbnQgeCA9IHB4ICsgKHB3IC0gY3cpIC8gMjsNCi0gICAgICAgICAgICBpZiAoeCA8IDApIHggPSAwOw0KLQ0KLSAgICAgICAgICAgIGludCB5ID0gcHkgKyAocGggLSBjaCkgLyAyOw0KLSAgICAgICAgICAgIGlmICh5IDwgTUlOX1kpIHkgPSBNSU5fWTsNCi0NCi0gICAgICAgICAgICBjaGlsZC5zZXRMb2NhdGlvbih4LCB5KTsNCi0gICAgICAgICAgICBjaGlsZC5zZXRTaXplKGN3LCBjaCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gRW5kIG9mIGhpZGluZyBmcm9tIFNXVCBEZXNpZ25lcg0KLSAgICAvLyRoaWRlPDwkDQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvdGFza3MvUHJvZ3Jlc3NUYXNrLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3Rhc2tzL1Byb2dyZXNzVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTU4YTQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvdGFza3MvUHJvZ3Jlc3NUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnRhc2tzOw0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5JVGFzazsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2tNb25pdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCi0NCi0NCi0vKioNCi0gKiBBbiB7QGxpbmsgSVRhc2tNb25pdG9yfSB0aGF0IGRpc3BsYXlzIGEge0BsaW5rIFByb2dyZXNzRGlhbG9nfS4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvZ3Jlc3NUYXNrIGltcGxlbWVudHMgSVRhc2tNb25pdG9yIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE1BWF9DT1VOVCA9IDEwMDAwLjA7DQotDQotICAgIHByaXZhdGUgZmluYWwgUHJvZ3Jlc3NEaWFsb2cgbURpYWxvZzsNCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvbWF0aWNhbGx5Q2xvc2VPblRhc2tDb21wbGV0aW9uID0gdHJ1ZTsNCi0gICAgcHJpdmF0ZSBkb3VibGUgbUluY0NvZWYgPSAwOw0KLSAgICBwcml2YXRlIGRvdWJsZSBtVmFsdWUgPSAwOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUHJvZ3Jlc3NUYXNrfSB3aXRoIHRoZSBnaXZlbiB0aXRsZS4NCi0gICAgICogVGhlIGdpdmVuIHRhc2sgd2lsbCBleGVjdXRlIGluIGEgc2VwYXJhdGUgdGhyZWFkIChub3QgdGhlIFVJIHRocmVhZCkuDQotICAgICAqDQotICAgICAqIFRoaXMgYmxvY2tzIHRpbGwgdGhlIHRocmVhZCBlbmRzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFByb2dyZXNzVGFzayhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgSVRhc2sgdGFzaykgew0KLSAgICAgICAgbURpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhwYXJlbnQsIGNyZWF0ZVRhc2tUaHJlYWQodGl0bGUsIHRhc2spKTsNCi0gICAgICAgIG1EaWFsb2cuc2V0VGV4dCh0aXRsZSk7DQotICAgICAgICBtRGlhbG9nLm9wZW4oKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIGN1cnJlbnQgdGFzayBkaWFsb2cuDQotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGZyb20gYSBub24tVUkgdGhyZWFkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uRm9ybWF0LCBPYmplY3QuLi5hcmdzKSB7DQotICAgICAgICBtRGlhbG9nLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uRm9ybWF0LCBhcmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIGN1cnJlbnQgdGFzayBkaWFsb2cuDQotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGZyb20gYSBub24tVUkgdGhyZWFkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmVzdWx0KFN0cmluZyByZXN1bHRGb3JtYXQsIE9iamVjdC4uLmFyZ3MpIHsNCi0gICAgICAgIG1BdXRvbWF0aWNhbGx5Q2xvc2VPblRhc2tDb21wbGV0aW9uID0gZmFsc2U7DQotICAgICAgICBtRGlhbG9nLnNldFJlc3VsdChyZXN1bHRGb3JtYXQsIGFyZ3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBtYXggdmFsdWUgb2YgdGhlIHByb2dyZXNzIGJhci4NCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQuDQotICAgICAqDQotICAgICAqIFdlaXJkIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBzZXRQcm9ncmVzc01heCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMNCi0gICAgICogKmFmdGVyKiB7QGxpbmsgI2luY1Byb2dyZXNzKGludCl9OiB3ZSBkb24ndCB0cnkgdG8gYWRqdXN0IGl0IG9uIHRoZQ0KLSAgICAgKiBmbHkuDQotICAgICAqDQotICAgICAqIEBzZWUgUHJvZ3Jlc3NCYXIjc2V0TWF4aW11bShpbnQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01heChpbnQgbWF4KSB7DQotICAgICAgICBhc3NlcnQgbWF4ID4gMDsNCi0gICAgICAgIC8vIEFsd2F5cyBzZXQgdGhlIGRpYWxvZydzIHByb2dyZXNzIG1heCB0byAxMGsgc2luY2UgaXQgb25seSBoYW5kbGVzDQotICAgICAgICAvLyBpbnRlZ2VycyBhbmQgd2Ugd2FudCB0byBoYXZlIGEgYmV0dGVyIGlubmVyIGdyYW51bGFyaXR5LiBJbnN0ZWFkDQotICAgICAgICAvLyB3ZSB1c2UgdGhlIG1heCB0byBjb21wdXRlIGEgY29lZmZpY2llbnQgZm9yIGluYyBkZWx0YXMuDQotICAgICAgICBtRGlhbG9nLnNldFByb2dyZXNzTWF4KChpbnQpIE1BWF9DT1VOVCk7DQotICAgICAgICBtSW5jQ29lZiA9IG1heCA+IDAgPyBNQVhfQ09VTlQgLyBtYXggOiAwOw0KLSAgICAgICAgYXNzZXJ0IG1JbmNDb2VmID4gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5jcmVtZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGluY1Byb2dyZXNzKGludCBkZWx0YSkgew0KLSAgICAgICAgYXNzZXJ0IG1JbmNDb2VmID4gMDsNCi0gICAgICAgIGFzc2VydCBkZWx0YSA+IDA7DQotICAgICAgICBpbnRlcm5hbEluY1Byb2dyZXNzKGRlbHRhICogbUluY0NvZWYpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbEluY1Byb2dyZXNzKGRvdWJsZSByZWFsRGVsdGEpIHsNCi0gICAgICAgIG1WYWx1ZSArPSByZWFsRGVsdGE7DQotICAgICAgICBtRGlhbG9nLnNldFByb2dyZXNzKChpbnQpbVZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLA0KLSAgICAgKiBiZXR3ZWVuIDAgYW5kIHVwIHRvIHtAbGluayAjc2V0UHJvZ3Jlc3NNYXgoaW50KX0gLSAxLg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgbm9uLVVJIHRocmVhZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKSB7DQotICAgICAgICBhc3NlcnQgbUluY0NvZWYgPiAwOw0KLSAgICAgICAgcmV0dXJuIG1JbmNDb2VmID4gMCA/IChpbnQpKG1EaWFsb2cuZ2V0UHJvZ3Jlc3MoKSAvIG1JbmNDb2VmKSA6IDA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgIkNhbmNlbCIgYnV0dG9uIHdhcyBzZWxlY3RlZC4NCi0gICAgICogSXQgaXMgdXAgdG8gdGhlIHRhc2sgdGhyZWFkIHRvIHBvb2wgdGhpcyBhbmQgZXhpdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkKCkgew0KLSAgICAgICAgcmV0dXJuIG1EaWFsb2cuaXNDYW5jZWxSZXF1ZXN0ZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHRocmVhZCB0byBydW4gdGhlIHRhc2suIFRoZSB0aHJlYWQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0Lg0KLSAgICAgKiBXaGVuIHRoZSB0YXNrIGNvbXBsZXRlcywgcmVxdWVzdHMgdG8gY2xvc2UgdGhlIGRpYWxvZy4NCi0gICAgICogQHJldHVybiBBIG5ldyB0aHJlYWQgdGhhdCB3aWxsIHJ1biB0aGUgdGFzay4gVGhlIHRocmVhZCBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFRocmVhZCBjcmVhdGVUYXNrVGhyZWFkKFN0cmluZyB0aXRsZSwgZmluYWwgSVRhc2sgdGFzaykgew0KLSAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVGhyZWFkKHRpdGxlKSB7DQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXNrLnJ1bihQcm9ncmVzc1Rhc2sudGhpcyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobUF1dG9tYXRpY2FsbHlDbG9zZU9uVGFza0NvbXBsZXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGlhbG9nLnNldEF1dG9DbG9zZVJlcXVlc3RlZCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGlhbG9nLnNldE1hbnVhbENsb3NlUmVxdWVzdGVkKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIERpc3BsYXkgYSB5ZXMvbm8gcXVlc3Rpb24gZGlhbG9nIGJveC4NCi0gICAgICoNCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvdyB0aGlzIHRvIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQsIGl0DQotICAgICAqIG1ha2VzIHN1cmUgdGhlIGRpYWxvZyBpcyBvcGVuZWQgc3luY2hyb25vdXNseSBpbiB0aGUgdWkgdGhyZWFkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYm94DQotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBZRVMgd2FzIGNsaWNrZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwbGF5UHJvbXB0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0gICAgICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbURpYWxvZy5nZXRQYXJlbnQoKTsNCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsNCi0NCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gYXNrIHRoZSB1c2VyIHdoYXQgaGUgd2FudHMgdG8gZG8uDQotICAgICAgICBmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07DQotICAgICAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0WzBdOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgc3ViLW1vbml0b3IgdGhhdCB3aWxsIHVzZSB1cCB0byB0aWNrQ291bnQgb24gdGhlIHByb2dyZXNzIGJhci4NCi0gICAgICogdGlja0NvdW50IG11c3QgYmUgMSBvciBtb3JlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIElUYXNrTW9uaXRvciBjcmVhdGVTdWJNb25pdG9yKGludCB0aWNrQ291bnQpIHsNCi0gICAgICAgIGFzc2VydCBtSW5jQ29lZiA+IDA7DQotICAgICAgICBhc3NlcnQgdGlja0NvdW50ID4gMDsNCi0gICAgICAgIHJldHVybiBuZXcgU3ViVGFza01vbml0b3IodGhpcywgbnVsbCwgbVZhbHVlLCB0aWNrQ291bnQgKiBtSW5jQ29lZik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgSVN1YlRhc2tNb25pdG9yIGV4dGVuZHMgSVRhc2tNb25pdG9yIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIHN1YkluY1Byb2dyZXNzKGRvdWJsZSByZWFsRGVsdGEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlRhc2tNb25pdG9yIGltcGxlbWVudHMgSVN1YlRhc2tNb25pdG9yIHsNCi0NCi0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvZ3Jlc3NUYXNrIG1Sb290Ow0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJU3ViVGFza01vbml0b3IgbVBhcmVudDsNCi0gICAgICAgIHByaXZhdGUgZmluYWwgZG91YmxlIG1TdGFydDsNCi0gICAgICAgIHByaXZhdGUgZmluYWwgZG91YmxlIG1TcGFuOw0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVN1YlZhbHVlOw0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVN1YkNvZWY7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc3ViIHRhc2sgbW9uaXRvciB3aGljaCB3aWxsIHdvcmsgZm9yIHRoZSBnaXZlbiByYW5nZSBbc3RhcnQsIHN0YXJ0K3NwYW5dDQotICAgICAgICAgKiBpbiBpdHMgcGFyZW50Lg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBwYXJhbSByb290IFRoZSBQcm9ncmVzc1Rhc2sgcm9vdA0KLSAgICAgICAgICogQHBhcmFtIHBhcmVudCBUaGUgaW1tZWRpYXRlIHBhcmVudC4gQ2FuIGJlIHRoZSBudWxsIG9yIGFub3RoZXIgc3ViIHRhc2sgbW9uaXRvci4NCi0gICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgaW4gdGhlIHJvb3QncyBjb29yZGluYXRlcw0KLSAgICAgICAgICogQHBhcmFtIHNwYW4gVGhlIHNwYW4gdmFsdWUgaW4gdGhlIHJvb3QncyBjb29yZGluYXRlcw0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgU3ViVGFza01vbml0b3IoUHJvZ3Jlc3NUYXNrIHJvb3QsDQotICAgICAgICAgICAgICAgIElTdWJUYXNrTW9uaXRvciBwYXJlbnQsDQotICAgICAgICAgICAgICAgIGRvdWJsZSBzdGFydCwNCi0gICAgICAgICAgICAgICAgZG91YmxlIHNwYW4pIHsNCi0gICAgICAgICAgICBtUm9vdCA9IHJvb3Q7DQotICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsNCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsNCi0gICAgICAgICAgICBtU3BhbiA9IHNwYW47DQotICAgICAgICAgICAgbVN1YlZhbHVlID0gc3RhcnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVJvb3QuaXNDYW5jZWxSZXF1ZXN0ZWQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbkZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsNCi0gICAgICAgICAgICBtUm9vdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbkZvcm1hdCwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoU3RyaW5nIHJlc3VsdEZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsNCi0gICAgICAgICAgICBtUm9vdC5zZXRSZXN1bHQocmVzdWx0Rm9ybWF0LCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzTWF4KGludCBtYXgpIHsNCi0gICAgICAgICAgICBhc3NlcnQgbWF4ID4gMDsNCi0gICAgICAgICAgICBtU3ViQ29lZiA9IG1heCA+IDAgPyBtU3BhbiAvIG1heCA6IDA7DQotICAgICAgICAgICAgYXNzZXJ0IG1TdWJDb2VmID4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKSB7DQotICAgICAgICAgICAgYXNzZXJ0IG1TdWJDb2VmID4gMDsNCi0gICAgICAgICAgICByZXR1cm4gbVN1YkNvZWYgPiAwID8gKGludCkoKG1TdWJWYWx1ZSAtIG1TdGFydCkgLyBtU3ViQ29lZikgOiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgaW5jUHJvZ3Jlc3MoaW50IGRlbHRhKSB7DQotICAgICAgICAgICAgYXNzZXJ0IG1TdWJDb2VmID4gMDsNCi0gICAgICAgICAgICBzdWJJbmNQcm9ncmVzcyhkZWx0YSAqIG1TdWJDb2VmKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHN1YkluY1Byb2dyZXNzKGRvdWJsZSByZWFsRGVsdGEpIHsNCi0gICAgICAgICAgICBtU3ViVmFsdWUgKz0gcmVhbERlbHRhOw0KLSAgICAgICAgICAgIGlmIChtUGFyZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbVBhcmVudC5zdWJJbmNQcm9ncmVzcyhyZWFsRGVsdGEpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1Sb290LmludGVybmFsSW5jUHJvZ3Jlc3MocmVhbERlbHRhKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwbGF5UHJvbXB0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gbVJvb3QuZGlzcGxheVByb21wdCh0aXRsZSwgbWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgSVRhc2tNb25pdG9yIGNyZWF0ZVN1Yk1vbml0b3IoaW50IHRpY2tDb3VudCkgew0KLSAgICAgICAgICAgIGFzc2VydCBtU3ViQ29lZiA+IDA7DQotICAgICAgICAgICAgYXNzZXJ0IHRpY2tDb3VudCA+IDA7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJUYXNrTW9uaXRvcihtUm9vdCwNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsDQotICAgICAgICAgICAgICAgICAgICBtU3ViVmFsdWUsDQotICAgICAgICAgICAgICAgICAgICB0aWNrQ291bnQgKiBtU3ViQ29lZik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC90YXNrcy9Qcm9ncmVzc1Rhc2tGYWN0b3J5LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3Rhc2tzL1Byb2dyZXNzVGFza0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkwZGYyNi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3Rhc2tzL1Byb2dyZXNzVGFza0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC50YXNrczsNCi0NCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2s7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LklUYXNrRmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotDQotLyoqDQotICogQW4ge0BsaW5rIElUYXNrRmFjdG9yeX0gdGhhdCBjcmVhdGVzIGEgbmV3IHtAbGluayBQcm9ncmVzc1Rhc2t9IGRpYWxvZw0KLSAqIGZvciBlYWNoIG5ldyB0YXNrLg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9ncmVzc1Rhc2tGYWN0b3J5IGltcGxlbWVudHMgSVRhc2tGYWN0b3J5IHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTaGVsbCBtU2hlbGw7DQotDQotICAgIHB1YmxpYyBQcm9ncmVzc1Rhc2tGYWN0b3J5KFNoZWxsIHNoZWxsKSB7DQotICAgICAgICBtU2hlbGwgPSBzaGVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgdGl0bGUsIElUYXNrIHRhc2spIHsNCi0gICAgICAgIG5ldyBQcm9ncmVzc1Rhc2sobVNoZWxsLCB0aXRsZSwgdGFzayk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC93aWRnZXRzL0F2ZENyZWF0aW9uRGlhbG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvQXZkQ3JlYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiZGZhZC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvQXZkQ3JlYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQucHJlZnMuQW5kcm9pZExvY2F0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbi5BbmRyb2lkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5TZGtDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLlNka01hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuSGFyZHdhcmVQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuSGFyZHdhcmVQcm9wZXJ0aWVzLkhhcmR3YXJlUHJvcGVydHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5pY29ucy5JbWFnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0cy5BdmRTZWxlY3Rvci5TZGtMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIudWkuR3JpZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ2VsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBBVkQgY3JlYXRvciBkaWFsb2cuCi0gKgotICogVE9ETzoKLSAqIC0gdXNlIFNka1RhcmdldFNlbGVjdG9yIGluc3RlYWQgb2YgQ29tYm8KLSAqIC0gdG9vbHRpcHMgb24gd2lkZ2V0cy4KLSAqCi0gKi8KLWZpbmFsIGNsYXNzIEF2ZENyZWF0aW9uRGlhbG9nIGV4dGVuZHMgR3JpZERpYWxvZyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEF2ZE1hbmFnZXIgbUF2ZE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUcmVlTWFwPFN0cmluZywgSUFuZHJvaWRUYXJnZXQ+IG1DdXJyZW50VGFyZ2V0cyA9Ci0gICAgICAgIG5ldyBUcmVlTWFwPFN0cmluZywgSUFuZHJvaWRUYXJnZXQ+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEhhcmR3YXJlUHJvcGVydHk+IG1IYXJkd2FyZU1hcDsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAvLyBhIGxpc3Qgb2YgdXNlci1lZGl0ZWQgcHJvcGVydGllcy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1FZGl0ZWRQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIFRleHQgbUF2ZE5hbWU7Ci0gICAgcHJpdmF0ZSBDb21ibyBtVGFyZ2V0Q29tYm87Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtU2RDYXJkU2l6ZVJhZGlvOwotICAgIHByaXZhdGUgVGV4dCBtU2RDYXJkU2l6ZTsKLSAgICBwcml2YXRlIENvbWJvIG1TZENhcmRTaXplQ29tYm87Ci0KLSAgICBwcml2YXRlIFRleHQgbVNkQ2FyZEZpbGU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUJyb3dzZVNkQ2FyZDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU2RDYXJkRmlsZVJhZGlvOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVNraW5MaXN0UmFkaW87Ci0gICAgcHJpdmF0ZSBDb21ibyBtU2tpbkNvbWJvOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbVNraW5TaXplUmFkaW87Ci0gICAgcHJpdmF0ZSBUZXh0IG1Ta2luU2l6ZVdpZHRoOwotICAgIHByaXZhdGUgVGV4dCBtU2tpblNpemVIZWlnaHQ7Ci0KLSAgICBwcml2YXRlIFRhYmxlVmlld2VyIG1IYXJkd2FyZVZpZXdlcjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRGVsZXRlSGFyZHdhcmVQcm9wOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbUZvcmNlQ3JlYXRpb247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbU9rQnV0dG9uOwotICAgIHByaXZhdGUgTGFiZWwgbVN0YXR1c0ljb247Ci0gICAgcHJpdmF0ZSBMYWJlbCBtU3RhdHVzTGFiZWw7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbVN0YXR1c0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIGZpbmFsIEltYWdlRmFjdG9yeSBtSW1hZ2VGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIFZlcmlmeUxpc3RlbmVyfSBmb3Ige0BsaW5rIFRleHR9IHdpZGdldHMgdGhhdCBzaG91bGQgb25seSBjb250YWlucyBudW1iZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgVmVyaWZ5TGlzdGVuZXIgbURpZ2l0VmVyaWZpZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGV2ZW50LnRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IGV2ZW50LnRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoZW4gdGhlIEFWRCBuYW1lIGlzIGNoYW5nZWQuCi0gICAgICogRW5hYmxlcyB0aGUgZm9yY2UgY2hlY2tib3ggaWYgdGhlIG5hbWUgaXMgYSBkdXBsaWNhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBDcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtQXZkTmFtZS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgQXZkSW5mbyBhdmRNYXRjaCA9IG1BdmRNYW5hZ2VyLmdldEF2ZChuYW1lLCBmYWxzZSAvKnZhbGlkQXZkT25seSovKTsKLSAgICAgICAgICAgIGlmIChhdmRNYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUZvcmNlQ3JlYXRpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZvcmNlQ3JlYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbUZvcmNlQ3JlYXRpb24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgTW9kaWZ5TGlzdGVuZXJ9IHVzZWQgZm9yIGxpdmUtdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEF2ZENyZWF0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBBdmRNYW5hZ2VyIGF2ZE1hbmFnZXIsCi0gICAgICAgICAgICBJbWFnZUZhY3RvcnkgaW1hZ2VGYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCAyLCBmYWxzZSk7Ci0gICAgICAgIG1BdmRNYW5hZ2VyID0gYXZkTWFuYWdlcjsKLSAgICAgICAgbUltYWdlRmFjdG9yeSA9IGltYWdlRmFjdG9yeTsKLQotICAgICAgICBGaWxlIGhhcmR3YXJlRGVmcyA9IG5ldyBGaWxlIChhdmRNYW5hZ2VyLmdldFNka01hbmFnZXIoKS5nZXRMb2NhdGlvbigpICsgRmlsZS5zZXBhcmF0b3IgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5PU19TREtfVE9PTFNfTElCX0ZPTERFUiwgU2RrQ29uc3RhbnRzLkZOX0hBUkRXQVJFX0lOSSk7Ci0gICAgICAgIG1IYXJkd2FyZU1hcCA9IEhhcmR3YXJlUHJvcGVydGllcy5wYXJzZUhhcmR3YXJlRGVmaW5pdGlvbnMoCi0gICAgICAgICAgICAgICAgaGFyZHdhcmVEZWZzLCBudWxsIC8qc2RrTG9nKi8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgc3VwZXIuY3JlYXRlKCk7Ci0KLSAgICAgICAgUG9pbnQgcCA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgICAgICBpZiAocC54IDwgNDAwKSB7Ci0gICAgICAgICAgICBwLnggPSA0MDA7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRTaXplKHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KCJDcmVhdGUgbmV3IEFWRCIpOwotCi0gICAgICAgIG1Pa0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2w7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRGlhbG9nQ29udGVudChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotICAgICAgICBHcmlkTGF5b3V0IGdsOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJOYW1lOiIpOwotCi0gICAgICAgIG1BdmROYW1lID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgbUF2ZE5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1BdmROYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBDcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIlRhcmdldDoiKTsKLQotICAgICAgICBtVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkRST1BfRE9XTik7Ci0gICAgICAgIG1UYXJnZXRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVRhcmdldENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgcmVsb2FkU2tpbkNvbWJvKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIC0tLSBzZCBjYXJkIGdyb3VwCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJTRCBDYXJkOiIpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkJFR0lOTklORywKLSAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICBmaW5hbCBHcm91cCBzZENhcmRHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2RDYXJkR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHNkQ2FyZEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0gICAgICAgIG1TZENhcmRTaXplUmFkaW8gPSBuZXcgQnV0dG9uKHNkQ2FyZEdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtU2RDYXJkU2l6ZVJhZGlvLnNldFRleHQoIlNpemU6Iik7Ci0gICAgICAgIG1TZENhcmRTaXplUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNpemVNb2RlID0gbVNkQ2FyZFNpemVSYWRpby5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBlbmFibGVTZENhcmRXaWRnZXRzKHNpemVNb2RlKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgVmFsaWRhdGVMaXN0ZW5lciB2YWxpZGF0ZUxpc3RlbmVyID0gbmV3IFZhbGlkYXRlTGlzdGVuZXIoKTsKLQotICAgICAgICBtU2RDYXJkU2l6ZSA9IG5ldyBUZXh0KHNkQ2FyZEdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVNkQ2FyZFNpemUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1TZENhcmRTaXplLmFkZFZlcmlmeUxpc3RlbmVyKG1EaWdpdFZlcmlmaWVyKTsKLQotICAgICAgICBtU2RDYXJkU2l6ZUNvbWJvID0gbmV3IENvbWJvKHNkQ2FyZEdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIG1TZENhcmRTaXplQ29tYm8uYWRkKCJLaUIiKTsKLSAgICAgICAgbVNkQ2FyZFNpemVDb21iby5hZGQoIk1pQiIpOwotICAgICAgICBtU2RDYXJkU2l6ZUNvbWJvLnNlbGVjdCgxKTsKLQotICAgICAgICBtU2RDYXJkRmlsZVJhZGlvID0gbmV3IEJ1dHRvbihzZENhcmRHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgbVNkQ2FyZEZpbGVSYWRpby5zZXRUZXh0KCJGaWxlOiIpOwotCi0gICAgICAgIG1TZENhcmRGaWxlID0gbmV3IFRleHQoc2RDYXJkR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBtU2RDYXJkRmlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgbVNkQ2FyZEZpbGUuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdGVMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUJyb3dzZVNkQ2FyZCA9IG5ldyBCdXR0b24oc2RDYXJkR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgbUJyb3dzZVNkQ2FyZC5zZXRUZXh0KCJCcm93c2UuLi4iKTsKLSAgICAgICAgbUJyb3dzZVNkQ2FyZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICBvbkJyb3dzZVNkQ2FyZCgpOwotICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1TZENhcmRTaXplUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBlbmFibGVTZENhcmRXaWRnZXRzKHRydWUpOwotCi0gICAgICAgIC8vIC0tLSBza2luIGdyb3VwCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCJTa2luOiIpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkJFR0lOTklORywKLSAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICBmaW5hbCBHcm91cCBza2luR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNraW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc2tpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCi0gICAgICAgIG1Ta2luTGlzdFJhZGlvID0gbmV3IEJ1dHRvbihza2luR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIG1Ta2luTGlzdFJhZGlvLnNldFRleHQoIkJ1aWx0LWluOiIpOwotICAgICAgICBtU2tpbkxpc3RSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGlzdE1vZGUgPSBtU2tpbkxpc3RSYWRpby5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBlbmFibGVTa2luV2lkZ2V0cyhsaXN0TW9kZSk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1Ta2luQ29tYm8gPSBuZXcgQ29tYm8oc2tpbkdyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkRST1BfRE9XTik7Ci0gICAgICAgIG1Ta2luQ29tYm8uc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBtU2tpbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBza2luIGluZm8KLSAgICAgICAgICAgICAgICBsb2FkU2tpbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtU2tpblNpemVSYWRpbyA9IG5ldyBCdXR0b24oc2tpbkdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBtU2tpblNpemVSYWRpby5zZXRUZXh0KCJSZXNvbHV0aW9uOiIpOwotCi0gICAgICAgIG1Ta2luU2l6ZVdpZHRoID0gbmV3IFRleHQoc2tpbkdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgbVNraW5TaXplV2lkdGguc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1Ta2luU2l6ZVdpZHRoLmFkZFZlcmlmeUxpc3RlbmVyKG1EaWdpdFZlcmlmaWVyKTsKLSAgICAgICAgbVNraW5TaXplV2lkdGguYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdGVMaXN0ZW5lcik7Ci0KLSAgICAgICAgbmV3IExhYmVsKHNraW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIngiKTsKLQotICAgICAgICBtU2tpblNpemVIZWlnaHQgPSBuZXcgVGV4dChza2luR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBtU2tpblNpemVIZWlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1Ta2luU2l6ZUhlaWdodC5hZGRWZXJpZnlMaXN0ZW5lcihtRGlnaXRWZXJpZmllcik7Ci0gICAgICAgIG1Ta2luU2l6ZUhlaWdodC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0ZUxpc3RlbmVyKTsKLQotICAgICAgICBtU2tpbkxpc3RSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGVuYWJsZVNraW5XaWRnZXRzKHRydWUpOwotCi0gICAgICAgIC8vIC0tLSBoYXJkd2FyZSBncm91cAotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiSGFyZHdhcmU6Iik7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQkVHSU5OSU5HLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIGZpbmFsIEdyb3VwIGh3R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGh3R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGh3R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLSAgICAgICAgY3JlYXRlSGFyZHdhcmVUYWJsZShod0dyb3VwKTsKLQotICAgICAgICAvLyBjb21wb3NpdGUgZm9yIHRoZSBzaWRlIGJ1dHRvbnMKLSAgICAgICAgQ29tcG9zaXRlIGh3QnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoaHdHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBod0J1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgICAgICBod0J1dHRvbnMuc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihod0J1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBiLnNldFRleHQoIk5ldy4uLiIpOwotICAgICAgICBiLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBiLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEhhcmR3YXJlUHJvcGVydHlDaG9vc2VyIGRpYWxvZyA9IG5ldyBIYXJkd2FyZVByb3BlcnR5Q2hvb3NlcihwYXJlbnQuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZU1hcCwgbVByb3BlcnRpZXMua2V5U2V0KCkpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZVByb3BlcnR5IGNob2ljZSA9IGRpYWxvZy5nZXRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hvaWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLnB1dChjaG9pY2UuZ2V0TmFtZSgpLCBjaG9pY2UuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtRGVsZXRlSGFyZHdhcmVQcm9wID0gbmV3IEJ1dHRvbihod0J1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZMQVQpOwotICAgICAgICBtRGVsZXRlSGFyZHdhcmVQcm9wLnNldFRleHQoIkRlbGV0ZSIpOwotICAgICAgICBtRGVsZXRlSGFyZHdhcmVQcm9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRGVsZXRlSGFyZHdhcmVQcm9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtSGFyZHdhcmVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBod05hbWUgPSAoU3RyaW5nKSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3BlcnRpZXMucmVtb3ZlKGh3TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURlbGV0ZUhhcmR3YXJlUHJvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAvLyAtLS0gZW5kIGhhcmR3YXJlIGdyb3VwCi0KLSAgICAgICAgbUZvcmNlQ3JlYXRpb24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbUZvcmNlQ3JlYXRpb24uc2V0VGV4dCgiRm9yY2UgY3JlYXRlIik7Ci0gICAgICAgIG1Gb3JjZUNyZWF0aW9uLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgdGhpcyB0byBvdmVycmlkZSBhbnkgZXhpc3RpbmcgQVZEIik7Ci0gICAgICAgIG1Gb3JjZUNyZWF0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLAotICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0gICAgICAgIG1Gb3JjZUNyZWF0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtRm9yY2VDcmVhdGlvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih2YWxpZGF0ZUxpc3RlbmVyKTsKLQotICAgICAgICAvLyBhZGQgYSBzZXBhcmF0b3IgdG8gc2VwYXJhdGUgZnJvbSB0aGUgb2svY2FuY2VsIGJ1dHRvbgotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQotICAgICAgICAvLyBhZGQgc3R1ZmYgZm9yIHRoZSBlcnJvciBkaXNwbGF5Ci0gICAgICAgIG1TdGF0dXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtU3RhdHVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwKLSAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgMywgMSkpOwotICAgICAgICBtU3RhdHVzQ29tcG9zaXRlLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLQotICAgICAgICBtU3RhdHVzSWNvbiA9IG5ldyBMYWJlbChtU3RhdHVzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TdGF0dXNJY29uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQkVHSU5OSU5HLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOwotICAgICAgICBtU3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwobVN0YXR1c0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBtU3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KCIgXG4gIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICByZWxvYWRUYXJnZXRDb21ibygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFVJIGZvciB0aGUgaGFyZHdhcmUgcHJvcGVydGllcyB0YWJsZS4KLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIHtAbGluayBUYWJsZX0sIGFuZCBzZXZlcmFsIHZpZXdlcnMgKHtAbGluayBUYWJsZVZpZXdlcn0sCi0gICAgICoge0BsaW5rIFRhYmxlVmlld2VyQ29sdW1ufSkgYW5kIGFkZHMgZWRpdCBzdXBwb3J0IGZvciB0aGUgMm5kIGNvbHVtbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVIYXJkd2FyZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgVGFibGUgaGFyZHdhcmVUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICAgICAgZ2Qud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMTAwOwotICAgICAgICBoYXJkd2FyZVRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBoYXJkd2FyZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGhhcmR3YXJlVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIC8vIC0tIFRhYmxlIHZpZXdlcgotICAgICAgICBtSGFyZHdhcmVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoaGFyZHdhcmVUYWJsZSk7Ci0gICAgICAgIG1IYXJkd2FyZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBzaW5nbGUgc2VsZWN0aW9uIG1vZGUsIHdlIGNhbiBqdXN0IGFjY2VzcyB0aGUgc2VsZWN0aW9uIGluZGV4Ci0gICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgdGFibGUgZGlyZWN0bHkuCi0gICAgICAgICAgICAgICAgbURlbGV0ZUhhcmR3YXJlUHJvcC5zZXRFbmFibGVkKGhhcmR3YXJlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIG9ubHkgYSBjb250ZW50IHByb3ZpZGVyLiBVc2Ugdmlld2VycyBwZXIgY29sdW1uIGJlbG93IChmb3IgZWRpdGluZyBzdXBwb3J0KQotICAgICAgICBtSGFyZHdhcmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzLiB3ZSBqdXN0IHVzZSBtUHJvcGVydGllcyBkaXJlY3RseS4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0aWVzLmtleVNldCgpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXNzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIC0tIGNvbHVtbiAxOiBwcm9wIGFic3RyYWN0IG5hbWUKLSAgICAgICAgVGFibGVDb2x1bW4gY29sMSA9IG5ldyBUYWJsZUNvbHVtbihoYXJkd2FyZVRhYmxlLCBTV1QuTEVGVCk7Ci0gICAgICAgIGNvbDEuc2V0VGV4dCgiUHJvcGVydHkiKTsKLSAgICAgICAgY29sMS5zZXRXaWR0aCgxNTApOwotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiB0dmMxID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKG1IYXJkd2FyZVZpZXdlciwgY29sMSk7Ci0gICAgICAgIHR2YzEuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2VsbExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShWaWV3ZXJDZWxsIGNlbGwpIHsKLSAgICAgICAgICAgICAgICBIYXJkd2FyZVByb3BlcnR5IHByb3AgPSBtSGFyZHdhcmVNYXAuZ2V0KGNlbGwuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBjZWxsLnNldFRleHQocHJvcCAhPSBudWxsID8gcHJvcC5nZXRBYnN0cmFjdCgpIDogIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyAtLSBjb2x1bW4gMjogcHJvcCB2YWx1ZQotICAgICAgICBUYWJsZUNvbHVtbiBjb2wyID0gbmV3IFRhYmxlQ29sdW1uKGhhcmR3YXJlVGFibGUsIFNXVC5MRUZUKTsKLSAgICAgICAgY29sMi5zZXRUZXh0KCJWYWx1ZSIpOwotICAgICAgICBjb2wyLnNldFdpZHRoKDUwKTsKLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gdHZjMiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihtSGFyZHdhcmVWaWV3ZXIsIGNvbDIpOwotICAgICAgICB0dmMyLnNldExhYmVsUHJvdmlkZXIobmV3IENlbGxMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoVmlld2VyQ2VsbCBjZWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVByb3BlcnRpZXMuZ2V0KGNlbGwuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBjZWxsLnNldFRleHQodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBhZGQgZWRpdGluZyBzdXBwb3J0IHRvIHRoZSAybmQgY29sdW1uCi0gICAgICAgIHR2YzIuc2V0RWRpdGluZ1N1cHBvcnQobmV3IEVkaXRpbmdTdXBwb3J0KG1IYXJkd2FyZVZpZXdlcikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhcmR3YXJlTmFtZSA9IChTdHJpbmcpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBIYXJkd2FyZVByb3BlcnR5IHByb3BlcnR5ID0gbUhhcmR3YXJlTWFwLmdldChoYXJkd2FyZU5hbWUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKWVsZW1lbnQsIChTdHJpbmcpdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRElTS1NJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSGFyZHdhcmVQcm9wZXJ0aWVzLkRJU0tTSVpFX1BBVFRFUk4ubWF0Y2hlcigoU3RyaW5nKXZhbHVlKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllcy5wdXQoKFN0cmluZyllbGVtZW50LCAoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAoSW50ZWdlcil2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKWVsZW1lbnQsIEhhcmR3YXJlUHJvcGVydGllcy5CT09MRUFOX1ZBTFVFU1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1IYXJkd2FyZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFyZHdhcmVOYW1lID0gKFN0cmluZyllbGVtZW50OwotICAgICAgICAgICAgICAgIEhhcmR3YXJlUHJvcGVydHkgcHJvcGVydHkgPSBtSGFyZHdhcmVNYXAuZ2V0KGhhcmR3YXJlTmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVByb3BlcnRpZXMuZ2V0KGhhcmR3YXJlTmFtZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW5kZWQgZmFsbC10aHJvdWdoLgotICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0tTSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGFyZHdhcmVQcm9wZXJ0aWVzLmdldEJvb2xlYW5WYWx1ZUluZGV4KHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhcmR3YXJlTmFtZSA9IChTdHJpbmcpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBIYXJkd2FyZVByb3BlcnR5IHByb3BlcnR5ID0gbUhhcmR3YXJlTWFwLmdldChoYXJkd2FyZU5hbWUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGN1c3RvbSBUZXh0Q2VsbEVkaXRvciB0aGF0IHJlc3RyaWN0IGlucHV0LgotICAgICAgICAgICAgICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbmRlZCBmYWxsLXRocm91Z2guCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRElTS1NJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGhhcmR3YXJlVGFibGUpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbWJvQm94Q2VsbEVkaXRvcihoYXJkd2FyZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZVByb3BlcnRpZXMuQk9PTEVBTl9WQUxVRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5SRUFEX09OTFkgfCBTV1QuRFJPUF9ET1dOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBoYXJkd2FyZU5hbWUgPSAoU3RyaW5nKWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgSGFyZHdhcmVQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1IYXJkd2FyZU1hcC5nZXQoaGFyZHdhcmVOYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkgIT0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICBtSGFyZHdhcmVWaWV3ZXIuc2V0SW5wdXQobVByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLSAgICAgICAgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLSAgICAgICAgICAgIGxhYmVsID0gIkNyZWF0ZSBBVkQiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGlkLCBsYWJlbCwgZGVmYXVsdEJ1dHRvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBpZiAoY3JlYXRlQXZkKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNkIGNhcmQgd2lkZ2V0cy4KLSAgICAgKiBAcGFyYW0gc2l6ZU1vZGUgaWYgdHJ1ZSB0aGUgc2l6ZS1iYXNlZCB3aWRnZXRzIGFyZSB0byBiZSBlbmFibGVkLCBhbmQgdGhlIGZpbGUtYmFzZWQgb25lcwotICAgICAqIGRpc2FibGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmFibGVTZENhcmRXaWRnZXRzKGJvb2xlYW4gc2l6ZU1vZGUpIHsKLSAgICAgICAgbVNkQ2FyZFNpemUuc2V0RW5hYmxlZChzaXplTW9kZSk7Ci0gICAgICAgIG1TZENhcmRTaXplQ29tYm8uc2V0RW5hYmxlZChzaXplTW9kZSk7Ci0KLSAgICAgICAgbVNkQ2FyZEZpbGUuc2V0RW5hYmxlZCghc2l6ZU1vZGUpOwotICAgICAgICBtQnJvd3NlU2RDYXJkLnNldEVuYWJsZWQoIXNpemVNb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgc2tpbiB3aWRnZXRzLgotICAgICAqIEBwYXJhbSBsaXN0TW9kZSBpZiB0cnVlIHRoZSBsaXN0LWJhc2VkIHdpZGdldHMgYXJlIHRvIGJlIGVuYWJsZWQsIGFuZCB0aGUgc2l6ZS1iYXNlZCBvbmVzCi0gICAgICogZGlzYWJsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVNraW5XaWRnZXRzKGJvb2xlYW4gbGlzdE1vZGUpIHsKLSAgICAgICAgbVNraW5Db21iby5zZXRFbmFibGVkKGxpc3RNb2RlKTsKLQotICAgICAgICBtU2tpblNpemVXaWR0aC5zZXRFbmFibGVkKCFsaXN0TW9kZSk7Ci0gICAgICAgIG1Ta2luU2l6ZUhlaWdodC5zZXRFbmFibGVkKCFsaXN0TW9kZSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm93c2VTZENhcmQoKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZGxnID0gbmV3IEZpbGVEaWFsb2coZ2V0Q29udGVudHMoKS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0gICAgICAgIGRsZy5zZXRUZXh0KCJDaG9vc2UgU0QgQ2FyZCBpbWFnZSBmaWxlLiIpOwotCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGRsZy5vcGVuKCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2RDYXJkRmlsZS5zZXRUZXh0KGZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxvYWRUYXJnZXRDb21ibygpIHsKLSAgICAgICAgU3RyaW5nIHNlbGVjdGVkID0gbnVsbDsKLSAgICAgICAgaW50IGluZGV4ID0gbVRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBzZWxlY3RlZCA9IG1UYXJnZXRDb21iby5nZXRJdGVtKGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50VGFyZ2V0cy5jbGVhcigpOwotICAgICAgICBtVGFyZ2V0Q29tYm8ucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBpbmRleCA9IC0xOwotCi0gICAgICAgIFNka01hbmFnZXIgc2RrTWFuYWdlciA9IG1BdmRNYW5hZ2VyLmdldFNka01hbmFnZXIoKTsKLSAgICAgICAgaWYgKHNka01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBzZGtNYW5hZ2VyLmdldFRhcmdldHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNQbGF0Zm9ybSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBTdHJpbmcuZm9ybWF0KCIlcyAtIEFQSSBMZXZlbCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gU3RyaW5nLmZvcm1hdCgiJXMgKCVzKSAtIEFQSSBMZXZlbCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0VmVuZG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldFZlcnNpb24oKS5nZXRBcGlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50VGFyZ2V0cy5wdXQobmFtZSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0Q29tYm8uYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBuYW1lLmVxdWFscyhzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVRhcmdldENvbWJvLnNldEVuYWJsZWQobUN1cnJlbnRUYXJnZXRzLnNpemUoKSA+IDApOwotCi0gICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgbVRhcmdldENvbWJvLnNlbGVjdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWxvYWRTa2luQ29tYm8oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsb2FkU2tpbkNvbWJvKCkgewotICAgICAgICBTdHJpbmcgc2VsZWN0ZWQgPSBudWxsOwotICAgICAgICBpbnQgaW5kZXggPSBtU2tpbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBzZWxlY3RlZCA9IG1Ta2luQ29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2tpbkNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICBtU2tpbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGluZGV4ID0gbVRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbVRhcmdldENvbWJvLmdldEl0ZW0oaW5kZXgpOwotCi0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBtQ3VycmVudFRhcmdldHMuZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNraW5Db21iby5hZGQoU3RyaW5nLmZvcm1hdCgiRGVmYXVsdCAoJXMpIiwgdGFyZ2V0LmdldERlZmF1bHRTa2luKCkpKTsKLQotICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc2tpbiA6IHRhcmdldC5nZXRTa2lucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ta2luQ29tYm8uYWRkKHNraW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBza2luLmVxdWFscyhzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2tpbkNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNraW5Db21iby5zZWxlY3QoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ta2luQ29tYm8uc2VsZWN0KDApOyAgLy8gZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICBsb2FkU2tpbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZmllbGRzLCBkaXNwbGF5cyBlcnJvcnMgYW5kIHdhcm5pbmdzLgotICAgICAqIEVuYWJsZXMgdGhlIGZpbmlzaCBidXR0b24gaWYgdGhlcmUgYXJlIG5vIGVycm9ycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOwotCi0gICAgICAgIC8vIFZhbGlkYXRlIEFWRCBuYW1lCi0gICAgICAgIFN0cmluZyBhdmROYW1lID0gbUF2ZE5hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgYm9vbGVhbiBoYXNBdmROYW1lID0gYXZkTmFtZS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgIGlmIChoYXNBdmROYW1lICYmICFBdmRNYW5hZ2VyLlJFX0FWRF9OQU1FLm1hdGNoZXIoYXZkTmFtZSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIkFWRCBuYW1lICclMSRzJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuXG5BbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiAlMiRzIiwKLSAgICAgICAgICAgICAgICBhdmROYW1lLCBBdmRNYW5hZ2VyLkNIQVJTX0FWRF9OQU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFZhbGlkYXRlIHRhcmdldAotICAgICAgICBpZiAoaGFzQXZkTmFtZSAmJiBlcnJvciA9PSBudWxsICYmIG1UYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpIDwgMCkgewotICAgICAgICAgICAgZXJyb3IgPSAiQSB0YXJnZXQgbXVzdCBiZSBzZWxlY3RlZCBpbiBvcmRlciB0byBjcmVhdGUgYW4gQVZELiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBWYWxpZGF0ZSBTRENhcmQgcGF0aCBvciB2YWx1ZQotICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBtb2RlLiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGZpbGUgc2luY2UgdGhlCi0gICAgICAgICAgICAvLyB2ZXJpZmllciBvbiB0aGUgc2l6ZSBUZXh0IHdpbGwgcHJldmVudCBpbnZhbGlkIGlucHV0Ci0gICAgICAgICAgICBib29sZWFuIHNkY2FyZEZpbGVNb2RlID0gbVNkQ2FyZEZpbGVSYWRpby5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChzZGNhcmRGaWxlTW9kZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZE5hbWUgPSBtU2RDYXJkRmlsZS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmIChzZE5hbWUubGVuZ3RoKCkgPiAwICYmICFuZXcgRmlsZShzZE5hbWUpLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gIlNEIENhcmQgcGF0aCBpc24ndCB2YWxpZC4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBza2luCi0gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIG1vZGUsIHdlIHNob3VsZCBvbmx5IGNoZWNrIGlmIGl0J3MgaW4gc2l6ZSBtb2RlIHNpbmNlCi0gICAgICAgICAgICAvLyB0aGUgYnVpbHQtaW4gbGlzdCBtb2RlIGlzIGFsd2F5cyB2YWxpZC4KLSAgICAgICAgICAgIGlmIChtU2tpblNpemVSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIC8vIG5lZWQgYm90aCB3aXRoIGFuZCBoZWlnaCB0byBiZSBub24gbnVsbAotICAgICAgICAgICAgICAgIFN0cmluZyB3aWR0aCA9IG1Ta2luU2l6ZVdpZHRoLmdldFRleHQoKTsgICAvLyBubyBuZWVkIGZvciB0cmltLCBzaW5jZSB0aGUgdmVyaWZpZXIKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGVpZ2h0ID0gbVNraW5TaXplSGVpZ2h0LmdldFRleHQoKTsgLy8gcmVqZWN0cyBub24gZGlnaXQuCi0KLSAgICAgICAgICAgICAgICBpZiAod2lkdGgubGVuZ3RoKCkgPT0gMCB8fCBoZWlnaHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJTa2luIHNpemUgaXMgaW5jb3JyZWN0LlxuQm90aCBkaW1lbnNpb25zIG11c3QgYmUgPiAwIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIEFWRCBuYW1lCi0gICAgICAgIGlmIChoYXNBdmROYW1lICYmIGVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEF2ZEluZm8gYXZkTWF0Y2ggPSBtQXZkTWFuYWdlci5nZXRBdmQoYXZkTmFtZSwgZmFsc2UgLyp2YWxpZEF2ZE9ubHkqLyk7Ci0gICAgICAgICAgICBpZiAoYXZkTWF0Y2ggIT0gbnVsbCAmJiAhbUZvcmNlQ3JlYXRpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEFWRCBuYW1lICclcycgaXMgYWxyZWFkeSB1c2VkLlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgXCJGb3JjZSBjcmVhdGVcIiB0byBvdmVycmlkZSBleGlzdGluZyBBVkQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGNyZWF0ZSBidXR0b24KLSAgICAgICAgYm9vbGVhbiBjYW5fY3JlYXRlID0gaGFzQXZkTmFtZSAmJiBlcnJvciA9PSBudWxsOwotICAgICAgICBpZiAoY2FuX2NyZWF0ZSkgewotICAgICAgICAgICAgY2FuX2NyZWF0ZSAmPSBtVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+PSAwOwotICAgICAgICB9Ci0gICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKGNhbl9jcmVhdGUpOwotCi0gICAgICAgIC8vIC0tIHVwZGF0ZSBVSQotICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c0ljb24uc2V0SW1hZ2UobUltYWdlRmFjdG9yeS5nZXRJbWFnZUJ5TmFtZSgicmVqZWN0X2ljb24xNi5wbmciKSk7Ci0gICAgICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dChlcnJvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRJbWFnZShudWxsKTsKLSAgICAgICAgICAgIG1TdGF0dXNMYWJlbC5zZXRUZXh0KCIgXG4gIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNDb21wb3NpdGUucGFjayh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFNraW4oKSB7Ci0gICAgICAgIGludCB0YXJnZXRJbmRleCA9IG1UYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNvbHZlIHRoZSB0YXJnZXQuCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbVRhcmdldENvbWJvLmdldEl0ZW0odGFyZ2V0SW5kZXgpOwotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBtQ3VycmVudFRhcmdldHMuZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgc2tpbiBuYW1lCi0gICAgICAgIFN0cmluZyBza2luTmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBza2luSW5kZXggPSBtU2tpbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChza2luSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoc2tpbkluZGV4ID09IDApIHsgLy8gZGVmYXVsdCBza2luIGZvciB0aGUgdGFyZ2V0Ci0gICAgICAgICAgICBza2luTmFtZSA9IHRhcmdldC5nZXREZWZhdWx0U2tpbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2tpbk5hbWUgPSBtU2tpbkNvbWJvLmdldEl0ZW0oc2tpbkluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgdGhlIHNraW4gcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgcGF0aCA9IHRhcmdldC5nZXRQYXRoKElBbmRyb2lkVGFyZ2V0LlNLSU5TKTsKLSAgICAgICAgRmlsZSBza2luID0gbmV3IEZpbGUocGF0aCwgc2tpbk5hbWUpOwotICAgICAgICBpZiAoc2tpbi5pc0RpcmVjdG9yeSgpID09IGZhbHNlICYmIHRhcmdldC5pc1BsYXRmb3JtKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhlIHNraW4gaXMgaW4gdGhlIHBhcmVudCB0YXJnZXQKLSAgICAgICAgICAgIHBhdGggPSB0YXJnZXQuZ2V0UGFyZW50KCkuZ2V0UGF0aChJQW5kcm9pZFRhcmdldC5TS0lOUyk7Ci0gICAgICAgICAgICBza2luID0gbmV3IEZpbGUocGF0aCwgc2tpbk5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraW4uaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGdldCB0aGUgaGFyZHdhcmUuaW5pIGZyb20gdGhlIGFkZC1vbiAoaWYgYXBwbGljYWJsZSkgYW5kIGZyb20gdGhlIHNraW4KLSAgICAgICAgLy8gKGlmIGFwcGxpY2FibGUpCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhhcmR3YXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGlmICh0YXJnZXQuaXNQbGF0Zm9ybSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEhhcmR3YXJlRmlsZSA9IG5ldyBGaWxlKHRhcmdldC5nZXRMb2NhdGlvbigpLCBBdmRNYW5hZ2VyLkhBUkRXQVJFX0lOSSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0SGFyZHdhcmVGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0YXJnZXRIYXJkd2FyZUNvbmZpZyA9IFNka01hbmFnZXIucGFyc2VQcm9wZXJ0eUZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRIYXJkd2FyZUZpbGUsIG51bGwgLypsb2cqLyk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldEhhcmR3YXJlQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVWYWx1ZXMucHV0QWxsKHRhcmdldEhhcmR3YXJlQ29uZmlnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmcm9tIHRoZSBza2luCi0gICAgICAgIEZpbGUgc2tpbkhhcmR3YXJlRmlsZSA9IG5ldyBGaWxlKHNraW4sIEF2ZE1hbmFnZXIuSEFSRFdBUkVfSU5JKTsKLSAgICAgICAgaWYgKHNraW5IYXJkd2FyZUZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc2tpbkhhcmR3YXJlQ29uZmlnID0gU2RrTWFuYWdlci5wYXJzZVByb3BlcnR5RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgc2tpbkhhcmR3YXJlRmlsZSwgbnVsbCAvKmxvZyovKTsKLSAgICAgICAgICAgIGlmIChza2luSGFyZHdhcmVDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGhhcmR3YXJlVmFsdWVzLnB1dEFsbChza2luSGFyZHdhcmVDb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHNldCB0aG9zZSB2YWx1ZXMgaW4gdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhlIEFWRC4KLSAgICAgICAgLy8gV2UganVzdCBjaGVjayB0aGF0IG5vbmUgb2YgdGhvc2UgcHJvcGVydGllcyBoYXZlIGJlZW4gZWRpdGVkIGJ5IHRoZSB1c2VyIHlldC4KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBoYXJkd2FyZVZhbHVlcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAobUVkaXRlZFByb3BlcnRpZXMuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbVByb3BlcnRpZXMucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1IYXJkd2FyZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBVkQgZnJvbSB0aGUgdmFsdWVzIGluIHRoZSBVSS4gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVBdmQoKSB7Ci0gICAgICAgIFN0cmluZyBhdmROYW1lID0gbUF2ZE5hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgaW50IHRhcmdldEluZGV4ID0gbVRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLSAgICAgICAgLy8gcXVpY2sgY2hlY2sgb24gdGhlIG5hbWUgYW5kIHRoZSB0YXJnZXQgc2VsZWN0aW9uCi0gICAgICAgIGlmIChhdmROYW1lLmxlbmd0aCgpID09IDAgfHwgdGFyZ2V0SW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNvbHZlIHRoZSB0YXJnZXQuCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbVRhcmdldENvbWJvLmdldEl0ZW0odGFyZ2V0SW5kZXgpOwotICAgICAgICBJQW5kcm9pZFRhcmdldCB0YXJnZXQgPSBtQ3VycmVudFRhcmdldHMuZ2V0KHRhcmdldE5hbWUpOwotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgU0QgY2FyZCBkYXRhIGZyb20gdGhlIFVJLgotICAgICAgICBTdHJpbmcgc2ROYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKG1TZENhcmRTaXplUmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIC8vIHNpemUgbW9kZQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbVNkQ2FyZFNpemUuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzZE5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHVuaXQKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TZENhcmRTaXplQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZE5hbWUgKz0gIksiOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNkTmFtZSArPSAiTSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBiZSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmlsZSBtb2RlLgotICAgICAgICAgICAgc2ROYW1lID0gbVNkQ2FyZEZpbGUuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgU2tpbiBkYXRhIGZyb20gdGhlIFVJCi0gICAgICAgIFN0cmluZyBza2luTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChtU2tpbkxpc3RSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgLy8gYnVpbHQtaW4gbGlzdCBwcm92aWRlcyB0aGUgc2tpbgotICAgICAgICAgICAgaW50IHNraW5JbmRleCA9IG1Ta2luQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChza2luSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW5kZXggMCBpcyB0aGUgZGVmYXVsdCwgd2UgZG9uJ3QgdXNlIGl0Ci0gICAgICAgICAgICAgICAgc2tpbk5hbWUgPSBtU2tpbkNvbWJvLmdldEl0ZW0oc2tpbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNpemUgbW9kZS4gZ2V0IGJvdGggc2l6ZSBhbmQgd3JpdGVzIGl0IGFzIGEgc2tpbiBuYW1lCi0gICAgICAgICAgICAvLyB0aGFua3MgdG8gdmFsaWRhdGVQYWdlKCkgd2Uga25vdyB0aGUgY29udGVudCBvZiB0aGUgZmllbGRzIGlzIGNvcnJlY3QKLSAgICAgICAgICAgIHNraW5OYW1lID0gbVNraW5TaXplV2lkdGguZ2V0VGV4dCgpICsgIngiICsgbVNraW5TaXplSGVpZ2h0LmdldFRleHQoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgU2RrTG9nIGxvZyA9IG5ldyBTZGtMb2coU3RyaW5nLmZvcm1hdCgiUmVzdWx0IG9mIGNyZWF0aW5nIEFWRCAnJXMnOiIsIGF2ZE5hbWUpLAotICAgICAgICAgICAgICAgIGdldENvbnRlbnRzKCkuZ2V0RGlzcGxheSgpKTsKLQotICAgICAgICBGaWxlIGF2ZEZvbGRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF2ZEZvbGRlciA9IG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTG9jYXRpb24uZ2V0Rm9sZGVyKCkgKyBBbmRyb2lkTG9jYXRpb24uRk9MREVSX0FWRCwKLSAgICAgICAgICAgICAgICAgICAgYXZkTmFtZSArIEF2ZE1hbmFnZXIuQVZEX0ZPTERFUl9FWFRFTlNJT04pOwotICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBmb3JjZSA9IG1Gb3JjZUNyZWF0aW9uLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICBBdmRJbmZvIGF2ZEluZm8gPSBtQXZkTWFuYWdlci5jcmVhdGVBdmQoCi0gICAgICAgICAgICAgICAgYXZkRm9sZGVyLAotICAgICAgICAgICAgICAgIGF2ZE5hbWUsCi0gICAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgIHNraW5OYW1lLAotICAgICAgICAgICAgICAgIHNkTmFtZSwKLSAgICAgICAgICAgICAgICBtUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBmb3JjZSwKLSAgICAgICAgICAgICAgICBsb2cpOwotCi0gICAgICAgIHN1Y2Nlc3MgPSBhdmRJbmZvICE9IG51bGw7Ci0KLSAgICAgICAgbG9nLmRpc3BsYXlSZXN1bHQoc3VjY2Vzcyk7Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9BdmREZXRhaWxzRGlhbG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvQXZkRGV0YWlsc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1MDU2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9BdmREZXRhaWxzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVmVyc2lvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvLkF2ZFN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERpYWxvZyBkaXNwbGF5aW5nIHRoZSBkZXRhaWxzIG9mIGFuIEFWRC4KLSAqLwotZmluYWwgY2xhc3MgQXZkRGV0YWlsc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLSAgICAvKiogTGFzdCBkaWFsb2cgc2l6ZSBmb3IgdGhpcyBzZXNzaW9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIFBvaW50IHNMYXN0U2l6ZTsKLQotICAgIHByaXZhdGUgU2hlbGwgbURpYWxvZ1NoZWxsOwotICAgIHByaXZhdGUgZmluYWwgQXZkSW5mbyBtQXZkSW5mbzsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG1Sb290Q29tcG9zaXRlOwotCi0gICAgcHVibGljIEF2ZERldGFpbHNEaWFsb2coU2hlbGwgc2hlbGwsIEF2ZEluZm8gYXZkSW5mbykgewotICAgICAgICBzdXBlcihzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgICAgICAgbUF2ZEluZm8gPSBhdmRJbmZvOwotCi0gICAgICAgIHNldFRleHQoIkFWRCBkZXRhaWxzIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgZGlhbG9nIGFuZCBibG9ja3MgdGlsbCBpdCBnZXRzIGNsb3NlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0gICAgICAgIGNyZWF0ZUNvbnRlbnRzKCk7Ci0gICAgICAgIHBvc2l0aW9uU2hlbGwoKTsgICAgICAgICAgICAvLyRoaWRlJCAoaGlkZSBmcm9tIFNXVCBkZXNpZ25lcikKLSAgICAgICAgbURpYWxvZ1NoZWxsLm9wZW4oKTsKLSAgICAgICAgbURpYWxvZ1NoZWxsLmxheW91dCgpOwotCi0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldFBhcmVudCgpLmdldERpc3BsYXkoKTsKLSAgICAgICAgd2hpbGUgKCFtRGlhbG9nU2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1EaWFsb2dTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHNMYXN0U2l6ZSA9IG1EaWFsb2dTaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICBtRGlhbG9nU2hlbGwuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBjb250ZW50cyBvZiB0aGUgZGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLSAgICAgICAgbURpYWxvZ1NoZWxsID0gbmV3IFNoZWxsKGdldFBhcmVudCgpLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFKTsKLSAgICAgICAgbURpYWxvZ1NoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICBtRGlhbG9nU2hlbGwuc2V0U2l6ZSg0NTAsIDMwMCk7Ci0gICAgICAgIG1EaWFsb2dTaGVsbC5zZXRUZXh0KGdldFRleHQoKSk7Ci0KLSAgICAgICAgbVJvb3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1EaWFsb2dTaGVsbCwgU1dULk5PTkUpOwotICAgICAgICBtUm9vdENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgbVJvb3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBnbDsKLQotICAgICAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUobVJvb3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgYy5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotICAgICAgICBnbC5tYXJnaW5IZWlnaHQgPSBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgaWYgKG1BdmRJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BsYXlWYWx1ZShjLCAiTmFtZToiLCBtQXZkSW5mby5nZXROYW1lKCkpOwotICAgICAgICAgICAgZGlzcGxheVZhbHVlKGMsICJQYXRoOiIsIG1BdmRJbmZvLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtQXZkSW5mby5nZXRTdGF0dXMoKSAhPSBBdmRTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUoYywgIkVycm9yOiIsIG1BdmRJbmZvLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gbUF2ZEluZm8uZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgQW5kcm9pZFZlcnNpb24gdmVyc2lvbiA9IHRhcmdldC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlKGMsICJUYXJnZXQ6IiwgU3RyaW5nLmZvcm1hdCgiJXMgKEFQSSBsZXZlbCAlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldE5hbWUoKSwgdmVyc2lvbi5nZXRBcGlTdHJpbmcoKSkpOwotCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSBzb21lIGV4dHJhIHZhbHVlcy4KLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBtQXZkSW5mby5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2tpbiA9IHByb3BlcnRpZXMuZ2V0KEF2ZE1hbmFnZXIuQVZEX0lOSV9TS0lOX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUoYywgIlNraW46Iiwgc2tpbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2RjYXJkID0gcHJvcGVydGllcy5nZXQoQXZkTWFuYWdlci5BVkRfSU5JX1NEQ0FSRF9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNkY2FyZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZGNhcmQgPSBwcm9wZXJ0aWVzLmdldChBdmRNYW5hZ2VyLkFWRF9JTklfU0RDQVJEX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZGNhcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlKGMsICJTRCBDYXJkOiIsIHNkY2FyZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IG90aGVyIGhhcmR3YXJlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNvcHkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzdHVmZiB3ZSBhbHJlYWR5IGRpc3BsYXllZCAob3IgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkpCi0gICAgICAgICAgICAgICAgICAgIGNvcHkucmVtb3ZlKEF2ZE1hbmFnZXIuQVZEX0lOSV9TS0lOX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBjb3B5LnJlbW92ZShBdmRNYW5hZ2VyLkFWRF9JTklfU0tJTl9QQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgY29weS5yZW1vdmUoQXZkTWFuYWdlci5BVkRfSU5JX1NEQ0FSRF9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgY29weS5yZW1vdmUoQXZkTWFuYWdlci5BVkRfSU5JX1NEQ0FSRF9QQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgY29weS5yZW1vdmUoQXZkTWFuYWdlci5BVkRfSU5JX0lNQUdFU18xKTsKLSAgICAgICAgICAgICAgICAgICAgY29weS5yZW1vdmUoQXZkTWFuYWdlci5BVkRfSU5JX0lNQUdFU18yKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29weS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKG1Sb290Q29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG5ldyBDb21wb3NpdGUobVJvb3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0TGF5b3V0KGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSBjb3B5LmtleVNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDoga2V5cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZShjLCBrZXkgKyAiOiIsIGNvcHkuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0gU3RhcnQgb2YgaW50ZXJuYWwgcGFydCAtLS0tLS0tLS0tCi0gICAgLy8gSGlkZSBldmVyeXRoaW5nIGRvd24tYmVsb3cgZnJvbSBTV1QgZGVzaWduZXIKLSAgICAvLyRoaWRlPj4kCi0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5cyBhIHZhbHVlIHdpdGggYSBsYWJlbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBDb21wb3NpdGUgaW4gd2hpY2ggdG8gZGlzcGxheSB0aGUgdmFsdWUuIFRoaXMgQ29tcG9zaXRlIG11c3QgdXNlIGEKLSAgICAgKiB7QGxpbmsgR3JpZExheW91dH0gd2l0aCAyIGNvbHVtbnMuCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBvZiB0aGUgdmFsdWUgdG8gZGlzcGxheS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB2YWx1ZSB0byBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5VmFsdWUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2VudGVycyB0aGUgZGlhbG9nIGluIGl0cyBwYXJlbnQgc2hlbGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvc2l0aW9uU2hlbGwoKSB7Ci0gICAgICAgIC8vIENlbnRlcnMgdGhlIGRpYWxvZyBpbiBpdHMgcGFyZW50IHNoZWxsCi0gICAgICAgIFNoZWxsIGNoaWxkID0gbURpYWxvZ1NoZWxsOwotICAgICAgICBTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgY2xpZW50IGFyZWEgd2l0aCBhIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgICAgICBSZWN0YW5nbGUgcGFyZW50QXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICBQb2ludCBwYXJlbnRMb2MgPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGludCBweCA9IHBhcmVudExvYy54OwotICAgICAgICAgICAgaW50IHB5ID0gcGFyZW50TG9jLnk7Ci0gICAgICAgICAgICBpbnQgcHcgPSBwYXJlbnRBcmVhLndpZHRoOwotICAgICAgICAgICAgaW50IHBoID0gcGFyZW50QXJlYS5oZWlnaHQ7Ci0KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBsYXN0IHNpemUgaWYgdGhlcmUncyBvbmUsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIFBvaW50IGNoaWxkU2l6ZSA9IHNMYXN0U2l6ZSAhPSBudWxsID8gc0xhc3RTaXplIDogY2hpbGQuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgaW50IGN3ID0gY2hpbGRTaXplLng7Ci0gICAgICAgICAgICBpbnQgY2ggPSBjaGlsZFNpemUueTsKLQotICAgICAgICAgICAgY2hpbGQuc2V0TG9jYXRpb24ocHggKyAocHcgLSBjdykgLyAyLCBweSArIChwaCAtIGNoKSAvIDIpOwotICAgICAgICAgICAgY2hpbGQuc2V0U2l6ZShjdywgY2gpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRW5kIG9mIGhpZGluZyBmcm9tIFNXVCBEZXNpZ25lcgotICAgIC8vJGhpZGU8PCQKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9BdmRTZWxlY3Rvci5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC93aWRnZXRzL0F2ZFNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzg3MTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC93aWRnZXRzL0F2ZFNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb24uQW5kcm9pZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuTnVsbFNka0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuU2RrQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkF2ZE1hbmFnZXIuQXZkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkF2ZE1hbmFnZXIuQXZkSW5mby5BdmRTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnJlcG9zaXRvcnkuSVRhc2tNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnkuU2V0dGluZ3NDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnkuaWNvbnMuSW1hZ2VGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnRhc2tzLlByb2dyZXNzVGFzazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZGt1aWxpYi5yZXBvc2l0b3J5LlVwZGF0ZXJXaW5kb3c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgQVZEIHNlbGVjdG9yIGlzIGEgdGFibGUgdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAqIDxwLz4KLSAqIEFmdGVyIHVzaW5nIG9uZSBvZiB0aGUgY29uc3RydWN0b3JzLCBjYWxsIHtAbGluayAjc2V0U2VsZWN0aW9uKEF2ZEluZm8pfSwKLSAqIHtAbGluayAjc2V0U2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIpfSBhbmQgZmluYWxseSB1c2UKLSAqIHtAbGluayAjZ2V0U2VsZWN0ZWQoKX0gdG8gcmV0cmlldmUgdGhlIHNlbGVjdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEF2ZFNlbGVjdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTlVNX0NPTCA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNb2RlIG1EaXNwbGF5TW9kZTsKLQotICAgIHByaXZhdGUgQXZkTWFuYWdlciBtQXZkTWFuYWdlcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtT3NTZGtQYXRoOwotCi0gICAgcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbURlbGV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRGV0YWlsc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtTmV3QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1SZWZyZXNoQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1NYW5hZ2VyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1SZXBhaXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVN0YXJ0QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBtU2VsZWN0aW9uTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBJQXZkRmlsdGVyIG1UYXJnZXRGaWx0ZXI7Ci0KLSAgICAvKiogRGVmYXVsdHMgdG8gdHJ1ZS4gQ2hhbmdlZCBieSB0aGUge0BsaW5rICNzZXRFbmFibGVkKGJvb2xlYW4pfSBtZXRob2QgdG8gcmVwcmVzZW50IHRoZQotICAgICAqICJnbG9iYWwiIGVuYWJsZWQgc3RhdGUgb24gdGhpcyBjb21wb3NpdGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0VuYWJsZWQgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBJbWFnZUZhY3RvcnkgbUltYWdlRmFjdG9yeTsKLSAgICBwcml2YXRlIEltYWdlIG1Pa0ltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgbUJyb2tlbkltYWdlOwotCi0gICAgcHJpdmF0ZSBTZXR0aW5nc0NvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGhlIEFWRCBTZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGVudW0gRGlzcGxheU1vZGUgewotICAgICAgICAvKioKLSAgICAgICAgICogTWFuYWdlciBtb2RlLiBJbnZhbGlkIEFWRHMgYXJlIGRpc3BsYXllZC4gQnV0dG9ucyB0byBjcmVhdGUvZGVsZXRlIEFWRHMKLSAgICAgICAgICovCi0gICAgICAgIE1BTkFHRVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vbiBtYW5hZ2VyIG1vZGUuIE9ubHkgdmFsaWQgQVZEcyBhcmUgZGlzcGxheWVkLiBDYW5ub3QgY3JlYXRlL2RlbGV0ZSBBVkRzLCBidXQKLSAgICAgICAgICogdGhlcmUgaXMgYSBidXR0b24gdG8gb3BlbiB0aGUgQVZEIE1hbmFnZXIuCi0gICAgICAgICAqIEluIHRoZSAiY2hlY2siIHNlbGVjdGlvbiBtb2RlLCBjaGVja2JveGVzIGFyZSBkaXNwbGF5ZWQgb24gZWFjaCBsaW5lCi0gICAgICAgICAqIGFuZCB7QGxpbmsgQXZkU2VsZWN0b3IjZ2V0U2VsZWN0ZWQoKX0gcmV0dXJucyB0aGUgbGluZSB0aGF0IGlzIGNoZWNrZWQKLSAgICAgICAgICogZXZlbiBpZiBpdCBpcyBub3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaW5lLiBPbmx5IG9uZSBsaW5lIGNhbgotICAgICAgICAgKiBiZSBjaGVja2VkIGF0IG9uY2UuCi0gICAgICAgICAqLwotICAgICAgICBTSU1QTEVfQ0hFQ0ssCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vbiBtYW5hZ2VyIG1vZGUuIE9ubHkgdmFsaWQgQVZEcyBhcmUgZGlzcGxheWVkLiBDYW5ub3QgY3JlYXRlL2RlbGV0ZSBBVkRzLCBidXQKLSAgICAgICAgICogdGhlcmUgaXMgYSBidXR0b24gdG8gb3BlbiB0aGUgQVZEIE1hbmFnZXIuCi0gICAgICAgICAqIEluIHRoZSAic2VsZWN0IiBzZWxlY3Rpb24gbW9kZSwgdGhlcmUgYXJlIG5vIGNoZWNrYm94ZXMgYW5kCi0gICAgICAgICAqIHtAbGluayBBdmRTZWxlY3RvciNnZXRTZWxlY3RlZCgpfSByZXR1cm5zIHRoZSBsaW5lIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICogT25seSBvbmUgbGluZSBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZS4KLSAgICAgICAgICovCi0gICAgICAgIFNJTVBMRV9TRUxFQ1RJT04sCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBmaWx0ZXIgdG8gY29udHJvbCB0aGUgd2hldGhlciBvciBub3QgYW4gQVZEIHNob3VsZCBiZSBkaXNwbGF5ZWQgYnkgdGhlIEFWRCBTZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElBdmRGaWx0ZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB7QGxpbmsgI2FjY2VwdChBdmRJbmZvKX0gaXMgY2FsbGVkIGZvciBhbnkgQVZELgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBwcmVwYXJlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB0byBkZWNpZGVkIHdoZXRoZXIgYW4gQVZEIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAgICAgICAqIEBwYXJhbSBhdmQgdGhlIEFWRCB0byB0ZXN0LgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEFWRCBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBhY2NlcHQoQXZkSW5mbyBhdmQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIge0BsaW5rICNhY2NlcHQoQXZkSW5mbyl9IGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgdGhlIEFWRHMuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGNsZWFudXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUF2ZEZpbHRlcn0gdG8gZmlsdGVyIG91dCB0aGUgQVZEcyB0aGF0IGFyZSBub3QKLSAgICAgKiBydW5uaW5nIGFuIGltYWdlIGNvbXBhdGlibGUgd2l0aCBhIHNwZWNpZmljIHRhcmdldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBUYXJnZXRCYXNlZEZpbHRlciBpbXBsZW1lbnRzIElBdmRGaWx0ZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIElBbmRyb2lkVGFyZ2V0IG1UYXJnZXQ7Ci0KLSAgICAgICAgVGFyZ2V0QmFzZWRGaWx0ZXIoSUFuZHJvaWRUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcHJlcGFyZQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEF2ZEluZm8gYXZkKSB7Ci0gICAgICAgICAgICBpZiAoYXZkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVRhcmdldC5pc0NvbXBhdGlibGVCYXNlRm9yKGF2ZC5nZXRUYXJnZXQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGNsZWFuIHVwCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNESyBUYXJnZXQgU2VsZWN0b3IsIGFuZCBmaWxscyBpdCB3aXRoIGEgbGlzdCBvZiB7QGxpbmsgQXZkSW5mb30sIGZpbHRlcmVkCi0gICAgICogYnkgYSB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9LgotICAgICAqIDxwLz5Pbmx5IHRoZSB7QGxpbmsgQXZkSW5mb30gYWJsZSB0byBydW4gYXBwbGljYXRpb24gZGV2ZWxvcGVkIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9IHdpbGwgYmUgZGlzcGxheWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgc2VsZWN0b3Igd2lsbCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gb3NTZGtQYXRoIFRoZSBTREsgcm9vdCBwYXRoLiBXaGVuIG5vdCBudWxsLCBlbmFibGVzIHRoZSBzdGFydCBidXR0b24gdG8gc3RhcnQKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFuIGVtdWxhdG9yIG9uIGEgZ2l2ZW4gQVZELgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBBVkQgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gZmlsdGVyIFdoZW4gbm9uLW51bGwsIHdpbGwgYWxsb3cgZmlsdGVyaW5nIHRoZSBBVkRzIHRvIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGRpc3BsYXlNb2RlIFRoZSBkaXNwbGF5IG1vZGUgKHtAbGluayBEaXNwbGF5TW9kZX0pLgotICAgICAqCi0gICAgICogVE9ETzogcGFzcyBhbiBJU2RrTG9nIGFuZCB1c2UgaXQgd2hlbiByZWxvYWRpbmcsIHN0YXJ0aW5nIHRoZSBlbXVsYXRvciwgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBBdmRTZWxlY3RvcihDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgU3RyaW5nIG9zU2RrUGF0aCwKLSAgICAgICAgICAgIEF2ZE1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIElBdmRGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgRGlzcGxheU1vZGUgZGlzcGxheU1vZGUpIHsKLSAgICAgICAgbU9zU2RrUGF0aCA9IG9zU2RrUGF0aDsKLSAgICAgICAgbUF2ZE1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBtVGFyZ2V0RmlsdGVyID0gZmlsdGVyOwotICAgICAgICBtRGlzcGxheU1vZGUgPSBkaXNwbGF5TW9kZTsKLQotICAgICAgICAvLyBnZXQgc29tZSBiaXRtYXBzLgotICAgICAgICBtSW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeShwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLSAgICAgICAgbU9rSW1hZ2UgPSBtSW1hZ2VGYWN0b3J5LmdldEltYWdlQnlOYW1lKCJhY2NlcHRfaWNvbjE2LnBuZyIpOwotICAgICAgICBtQnJva2VuSW1hZ2UgPSBtSW1hZ2VGYWN0b3J5LmdldEltYWdlQnlOYW1lKCJyZWplY3RfaWNvbjE2LnBuZyIpOwotCi0gICAgICAgIC8vIExheW91dCBoYXMgMiBjb2x1bW5zCi0gICAgICAgIENvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KE5VTV9DT0wsIGZhbHNlIC8qbWFrZUNvbHVtbnNFcXVhbFdpZHRoKi8pKTsKLSAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgZ3JvdXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgZ3JvdXAuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgYXJnMCkgewotICAgICAgICAgICAgICAgIG1JbWFnZUZhY3RvcnkuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnQgc3R5bGUgPSBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUjsKLSAgICAgICAgaWYgKGRpc3BsYXlNb2RlID09IERpc3BsYXlNb2RlLlNJTVBMRV9DSEVDSykgewotICAgICAgICAgICAgc3R5bGUgfD0gU1dULkNIRUNLOwotICAgICAgICB9Ci0gICAgICAgIG1UYWJsZSA9IG5ldyBUYWJsZShncm91cCwgc3R5bGUpOwotICAgICAgICBtVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbVRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHNldFRhYmxlSGVpZ2h0SGludCgwKTsKLQotICAgICAgICBDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgYnV0dG9ucy5zZXRMYXlvdXQoZ2wgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSAvKm1ha2VDb2x1bW5zRXF1YWxXaWR0aCovKSk7Ci0gICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0gICAgICAgIGJ1dHRvbnMuc2V0Rm9udChncm91cC5nZXRGb250KCkpOwotCi0gICAgICAgIGlmIChkaXNwbGF5TW9kZSA9PSBEaXNwbGF5TW9kZS5NQU5BR0VSKSB7Ci0gICAgICAgICAgICBtTmV3QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgICAgIG1OZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBtTmV3QnV0dG9uLnNldFRleHQoIk5ldy4uLiIpOwotICAgICAgICAgICAgbU5ld0J1dHRvbi5zZXRUb29sVGlwVGV4dCgiQ3JlYXRlcyBhIG5ldyBBVkQuIik7Ci0gICAgICAgICAgICBtTmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICAgICAgb25OZXcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgbURlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgICAgICBtRGVsZXRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbURlbGV0ZUJ1dHRvbi5zZXRUZXh0KCJEZWxldGUuLi4iKTsKLSAgICAgICAgICAgIG1EZWxldGVCdXR0b24uc2V0VG9vbFRpcFRleHQoIkRlbGV0ZXMgdGhlIHNlbGVjdGVkIEFWRC4iKTsKLSAgICAgICAgICAgIG1EZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgewotICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtUmVwYWlyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgICAgIG1SZXBhaXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICBtUmVwYWlyQnV0dG9uLnNldFRleHQoIlJlcGFpci4uLiIpOwotICAgICAgICAgICAgbVJlcGFpckJ1dHRvbi5zZXRUb29sVGlwVGV4dCgiUmVwYWlycyB0aGUgc2VsZWN0ZWQgQVZELiIpOwotICAgICAgICAgICAgbVJlcGFpckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUmVwYWlyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoYnV0dG9ucywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGV0YWlsc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1EZXRhaWxzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtRGV0YWlsc0J1dHRvbi5zZXRUZXh0KCJEZXRhaWxzLi4uIik7Ci0gICAgICAgIG1EZXRhaWxzQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJEaXBsYXlzIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEFWRC4iKTsKLSAgICAgICAgbURldGFpbHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBvbkRldGFpbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbVN0YXJ0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgbVN0YXJ0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dCgiU3RhcnQuLi4iKTsKLSAgICAgICAgbVN0YXJ0QnV0dG9uLnNldFRvb2xUaXBUZXh0KCJTdGFydHMgdGhlIHNlbGVjdGVkIEFWRC4iKTsKLSAgICAgICAgbVN0YXJ0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgb25TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBDb21wb3NpdGUgcGFkZGluZyA9IG5ldyBDb21wb3NpdGUoYnV0dG9ucywgU1dULk5PTkUpOwotICAgICAgICBwYWRkaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotICAgICAgICBtUmVmcmVzaEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRkxBVCk7Ci0gICAgICAgIG1SZWZyZXNoQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBtUmVmcmVzaEJ1dHRvbi5zZXRUZXh0KCJSZWZyZXNoIik7Ci0gICAgICAgIG1SZWZyZXNoQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJSZWxvYWRzIHRoZSBsaXN0IG9mIEFWRC5cblVzZSB0aGlzIGlmIHlvdSBjcmVhdGUgQVZEcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIik7Ci0gICAgICAgIG1SZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKGRpc3BsYXlNb2RlICE9IERpc3BsYXlNb2RlLk1BTkFHRVIpIHsKLSAgICAgICAgICAgIG1NYW5hZ2VyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgbU1hbmFnZXJCdXR0b24uc2V0VGV4dCgiTWFuYWdlci4uLiIpOwotICAgICAgICAgICAgbU1hbmFnZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoIkxhdW5jaGVzIHRoZSBBVkQgbWFuYWdlci4iKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb25NYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgbGVnZW5kID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotICAgICAgICAgICAgbGVnZW5kLnNldExheW91dChnbCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlIC8qbWFrZUNvbHVtbnNFcXVhbFdpZHRoKi8pKTsKLSAgICAgICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgIGxlZ2VuZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBOVU1fQ09MLCAxKSk7Ci0gICAgICAgICAgICBsZWdlbmQuc2V0Rm9udChncm91cC5nZXRGb250KCkpOwotCi0gICAgICAgICAgICBuZXcgTGFiZWwobGVnZW5kLCBTV1QuTk9ORSkuc2V0SW1hZ2UobU9rSW1hZ2UpOwotICAgICAgICAgICAgbmV3IExhYmVsKGxlZ2VuZCwgU1dULk5PTkUpLnNldFRleHQoIkEgdmFsaWQgQW5kcm9pZCBWaXJ0dWFsIERldmljZS4iKTsKLSAgICAgICAgICAgIG5ldyBMYWJlbChsZWdlbmQsIFNXVC5OT05FKS5zZXRJbWFnZShtQnJva2VuSW1hZ2UpOwotICAgICAgICAgICAgbmV3IExhYmVsKGxlZ2VuZCwgU1dULk5PTkUpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgICJBbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIHRoYXQgZmFpbGVkIHRvIGxvYWQuIENsaWNrICdEZXRhaWxzJyB0byBzZWUgdGhlIGVycm9yLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0YWJsZSBjb2x1bW5zCi0gICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbjAuc2V0VGV4dCgiQVZEIE5hbWUiKTsKLSAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbihtVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgY29sdW1uMS5zZXRUZXh0KCJUYXJnZXQgTmFtZSIpOwotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZSwgU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4yLnNldFRleHQoIlBsYXRmb3JtIik7Ci0gICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbjMuc2V0VGV4dCgiQVBJIExldmVsIik7Ci0KLSAgICAgICAgYWRqdXN0Q29sdW1uc1dpZHRoKG1UYWJsZSwgY29sdW1uMCwgY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMyk7Ci0gICAgICAgIHNldHVwU2VsZWN0aW9uTGlzdGVuZXIobVRhYmxlKTsKLSAgICAgICAgZmlsbFRhYmxlKG1UYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTREsgVGFyZ2V0IFNlbGVjdG9yLCBhbmQgZmlsbHMgaXQgd2l0aCBhIGxpc3Qgb2Yge0BsaW5rIEF2ZEluZm99LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgc2VsZWN0b3Igd2lsbCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgQVZEIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGRpc3BsYXlNb2RlIFRoZSBkaXNwbGF5IG1vZGUgKHtAbGluayBEaXNwbGF5TW9kZX0pLgotICAgICAqLwotICAgIHB1YmxpYyBBdmRTZWxlY3RvcihDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgU3RyaW5nIG9zU2RrUGF0aCwKLSAgICAgICAgICAgIEF2ZE1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIERpc3BsYXlNb2RlIGRpc3BsYXlNb2RlKSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBvc1Nka1BhdGgsIG1hbmFnZXIsIChJQXZkRmlsdGVyKW51bGwgLyogZmlsdGVyICovLCBkaXNwbGF5TW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTREsgVGFyZ2V0IFNlbGVjdG9yLCBhbmQgZmlsbHMgaXQgd2l0aCBhIGxpc3Qgb2Yge0BsaW5rIEF2ZEluZm99LCBmaWx0ZXJlZAotICAgICAqIGJ5IGFuIHtAbGluayBJQW5kcm9pZFRhcmdldH0uCi0gICAgICogPHAvPk9ubHkgdGhlIHtAbGluayBBdmRJbmZvfSBhYmxlIHRvIHJ1biBhcHBsaWNhdGlvbnMgZGV2ZWxvcGVkIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9IHdpbGwgYmUgZGlzcGxheWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgc2VsZWN0b3Igd2lsbCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgQVZEIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGZpbHRlciBPbmx5IHNob3dzIHRoZSBBVkRzIG1hdGNoaW5nIHRoaXMgdGFyZ2V0IChtdXN0IG5vdCBiZSBudWxsKS4KLSAgICAgKiBAcGFyYW0gZGlzcGxheU1vZGUgVGhlIGRpc3BsYXkgbW9kZSAoe0BsaW5rIERpc3BsYXlNb2RlfSkuCi0gICAgICovCi0gICAgcHVibGljIEF2ZFNlbGVjdG9yKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICBTdHJpbmcgb3NTZGtQYXRoLAotICAgICAgICAgICAgQXZkTWFuYWdlciBtYW5hZ2VyLAotICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgZmlsdGVyLAotICAgICAgICAgICAgRGlzcGxheU1vZGUgZGlzcGxheU1vZGUpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIG9zU2RrUGF0aCwgbWFuYWdlciwgbmV3IFRhcmdldEJhc2VkRmlsdGVyKGZpbHRlciksIGRpc3BsYXlNb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGFuIG9wdGlvbmFsIFNldHRpbmdzQ29udHJvbGxlci4KLSAgICAgKiBAcGFyYW0gY29udHJvbGxlciB0aGUgY29udHJvbGxlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXR0aW5nc0NvbnRyb2xsZXIoU2V0dGluZ3NDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YWJsZSBncmlkIGxheW91dCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlaWdodEhpbnQgSWYgPiAwLCB0aGUgaGVpZ2h0IGhpbnQgaXMgc2V0IHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFibGVIZWlnaHRIaW50KGludCBoZWlnaHRIaW50KSB7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgaWYgKGhlaWdodEhpbnQgPiAwKSB7Ci0gICAgICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotICAgICAgICB9Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgbVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaCB0aGUgZGlzcGxheSBvZiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlcy4KLSAgICAgKiBUcmllcyB0byBrZWVwIHRoZSBzZWxlY3Rpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbG9hZCBpZiB0cnVlLCB0aGUgQVZEIG1hbmFnZXIgd2lsbCByZWxvYWQgdGhlIEFWRCBmcm9tIHRoZSBkaXNrLgotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHJlbG9hZGluZyBmYWlsZWQuIFRoaXMgaXMgYWx3YXlzIHRydWUgaWYgPHZhcj5yZWxvYWQ8L3Zhcj4gaXMKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVmcmVzaChib29sZWFuIHJlbG9hZCkgewotICAgICAgICBpZiAocmVsb2FkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1BdmRNYW5hZ2VyLnJlbG9hZEF2ZHMoTnVsbFNka0xvZy5nZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBbmRyb2lkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEF2ZEluZm8gc2VsZWN0ZWQgPSBnZXRTZWxlY3RlZCgpOwotCi0gICAgICAgIGZpbGxUYWJsZShtVGFibGUpOwotCi0gICAgICAgIHNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBBVkQgbWFuYWdlcgotICAgICAqIFRoaXMgZG9lcyBub3QgcmVmcmVzaCB0aGUgZGlzcGxheS4gQ2FsbCB7QGxpbmsgI3JlZnJlc2goYm9vbGVhbil9IHRvIGRvIHNvLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBBVkQgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKEF2ZE1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBtQXZkTWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBBVkQgZmlsdGVyLgotICAgICAqIFRoaXMgZG9lcyBub3QgcmVmcmVzaCB0aGUgZGlzcGxheS4gQ2FsbCB7QGxpbmsgI3JlZnJlc2goYm9vbGVhbil9IHRvIGRvIHNvLgotICAgICAqIEBwYXJhbSBmaWx0ZXIgQW4gSUF2ZEZpbHRlci4gSWYgbm9uLW51bGwsIHRoaXMgd2lsbCBmaWx0ZXIgb3V0IHRoZSBBVkQgdG8gbm90IGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKElBdmRGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIG1UYXJnZXRGaWx0ZXIgPSBmaWx0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBBbmRyb2lkIFRhcmdldC1iYXNlZCBBVkQgZmlsdGVyLgotICAgICAqIFRoaXMgZG9lcyBub3QgcmVmcmVzaCB0aGUgZGlzcGxheS4gQ2FsbCB7QGxpbmsgI3JlZnJlc2goYm9vbGVhbil9IHRvIGRvIHNvLgotICAgICAqIEBwYXJhbSB0YXJnZXQgQW4gSUFuZHJvaWRUYXJnZXQuIElmIG5vbi1udWxsLCBvbmx5IEFWRCB3aG9zZSB0YXJnZXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICAgKiBmaWx0ZXIgdGFyZ2V0IHdpbGwgZGlzcGxheWVkIGFuIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcihJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0RmlsdGVyID0gbmV3IFRhcmdldEJhc2VkRmlsdGVyKHRhcmdldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0RmlsdGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBzZWxlY3Rpb24gbGlzdGVuZXIuIFNldCBpdCB0byBudWxsIHRvIHJlbW92ZSBpdC4KLSAgICAgKiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgPGVtPmFmdGVyPC9lbT4gdGhpcyB0YWJsZSBwcm9jZXNzZWQgaXRzIHNlbGVjdGlvbgotICAgICAqIGV2ZW50cyBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIHNlZSB0aGUgdXBkYXRlZCBzdGF0ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGV2ZW50J3MgaXRlbSBjb250YWlucyBhIHtAbGluayBUYWJsZUl0ZW19LgotICAgICAqIFRoZSB7QGxpbmsgVGFibGVJdGVtI2dldERhdGEoKX0gY29udGFpbnMgYW4ge0BsaW5rIElBbmRyb2lkVGFyZ2V0fS4KLSAgICAgKiA8cC8+Ci0gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgY2FsbGVyIHVzZXMgdGhlIHtAbGluayAjZ2V0U2VsZWN0ZWQoKX0gbWV0aG9kIGluc3RlYWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBkb3VibGUgY2xpY2sgKHdoZW4gbm90IGluIHtAbGluayBEaXNwbGF5TW9kZSNTSU1QTEVfQ0hFQ0t9KSBpcyB0bwotICAgICAqIGRpc3BsYXkgdGhlIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEFWRC48YnI+Ci0gICAgICogVG8gZGlzYWJsZSBpdCAod2hlbiB5b3UgcHJvdmlkZSB5b3VyIG93biBkb3VibGUgY2xpY2sgYWN0aW9uKSwgc2V0Ci0gICAgICoge0BsaW5rIFNlbGVjdGlvbkV2ZW50I2RvaXR9IHRvIGZhbHNlIGluCi0gICAgICoge0BsaW5rIFNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCl9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uTGlzdGVuZXIgVGhlIG5ldyBsaXN0ZW5lciBvciBudWxsIHRvIHJlbW92ZSBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotICAgICAgICBtU2VsZWN0aW9uTGlzdGVuZXIgPSBzZWxlY3Rpb25MaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRhcmdldCBzZWxlY3Rpb24uCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgY2hhbmdlZCwgdGhpcyB3aWxsIGludm9rZSB0aGUgc2VsZWN0aW9uIGxpc3RlbmVyCi0gICAgICogKGlmIGFueSkgd2l0aCBhIG51bGwgZXZlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgdG8gYmUgc2VsZWN0ZWQuIFVzZSBudWxsIHRvIGRlc2VsZWN0IGV2ZXJ5dGhpbmcuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgY291bGQgYmUgc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRTZWxlY3Rpb24oQXZkSW5mbyB0YXJnZXQpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IHNlbEluZGV4ID0gbVRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoVGFibGVJdGVtIGkgOiBtVGFibGUuZ2V0SXRlbXMoKSkgewotICAgICAgICAgICAgaWYgKG1EaXNwbGF5TW9kZSA9PSBEaXNwbGF5TW9kZS5TSU1QTEVfQ0hFQ0spIHsKLSAgICAgICAgICAgICAgICBpZiAoKEF2ZEluZm8pIGkuZ2V0RGF0YSgpID09IHRhcmdldCkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChBdmRJbmZvKSBpLmdldERhdGEoKSA9PSB0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gc2VsSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS5zZXRTZWxlY3Rpb24oaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kaWZpZWQgJiYgbVNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3Rpb25MaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuYWJsZUFjdGlvbkJ1dHRvbnMoKTsKLQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0uIEluIHtAbGluayBEaXNwbGF5TW9kZSNTSU1QTEVfQ0hFQ0t9IG1vZGUgdGhpcyB3aWxsCi0gICAgICogcmV0dXJuIHRoZSB7QGxpbmsgQXZkSW5mb30gdGhhdCBpcyBjaGVja2VkIGluc3RlYWQgb2YgdGhlIGxpc3Qgc2VsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXZkSW5mbyBnZXRTZWxlY3RlZCgpIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5TW9kZSA9PSBEaXNwbGF5TW9kZS5TSU1QTEVfQ0hFQ0spIHsKLSAgICAgICAgICAgIGZvciAoVGFibGVJdGVtIGkgOiBtVGFibGUuZ2V0SXRlbXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEF2ZEluZm8pIGkuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzZWxJbmRleCA9IG1UYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgaWYgKHNlbEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEF2ZEluZm8pIG1UYWJsZS5nZXRJdGVtKHNlbEluZGV4KS5nZXREYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIHRoZSByZWNlaXZlciBpZiB0aGUgYXJndW1lbnQgaXMgdHJ1ZSwgYW5kIGRpc2FibGVzIGl0IG90aGVyd2lzZS4KLSAgICAgKiBBIGRpc2FibGVkIGNvbnRyb2wgaXMgdHlwaWNhbGx5IG5vdCBzZWxlY3RhYmxlIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlCi0gICAgICogYW5kIGRyYXdzIHdpdGggYW4gaW5hY3RpdmUgb3IgImdyYXllZCIgbG9vay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkIHRoZSBuZXcgZW5hYmxlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtSXNFbmFibGVkID0gZW5hYmxlZDsKLQotICAgICAgICBtVGFibGUuc2V0RW5hYmxlZChtSXNFbmFibGVkKTsKLSAgICAgICAgbVJlZnJlc2hCdXR0b24uc2V0RW5hYmxlZChtSXNFbmFibGVkKTsKLQotICAgICAgICBpZiAobU5ld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV3QnV0dG9uLnNldEVuYWJsZWQobUlzRW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NYW5hZ2VyQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NYW5hZ2VyQnV0dG9uLnNldEVuYWJsZWQobUlzRW5hYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmFibGVBY3Rpb25CdXR0b25zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbUlzRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYWRqdXN0IHRoZSBjb2x1bW5zIHdpZHRoIHdoZW4gdGhlIHBhcmVudCBpcyByZXNpemVkLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB3ZSBuZWVkIHNvbWV0aGluZyBtb3JlIGZhbmN5LCB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGlzOgotICAgICAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmE/dmlldz1jbwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGp1c3RDb2x1bW5zV2lkdGgoZmluYWwgVGFibGUgdGFibGUsCi0gICAgICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4wLAotICAgICAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIsCi0gICAgICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4zKSB7Ci0gICAgICAgIC8vIEFkZCBhIGxpc3RlbmVyIHRvIHJlc2l6ZSB0aGUgY29sdW1uIHRvIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB0YWJsZQotICAgICAgICB0YWJsZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIGNvbHVtbjAuc2V0V2lkdGgoci53aWR0aCAqIDI1IC8gMTAwKTsgLy8gMjUlCi0gICAgICAgICAgICAgICAgY29sdW1uMS5zZXRXaWR0aChyLndpZHRoICogNDUgLyAxMDApOyAvLyA0NSUKLSAgICAgICAgICAgICAgICBjb2x1bW4yLnNldFdpZHRoKHIud2lkdGggKiAxNSAvIDEwMCk7IC8vIDE1JQotICAgICAgICAgICAgICAgIGNvbHVtbjMuc2V0V2lkdGgoci53aWR0aCAqIDE1IC8gMTAwKTsgLy8gMTUlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdGhhdCB3aWxsIGNoZWNrIG9yIHVuY2hlY2sgdGhlIHdob2xlIGxpbmUgd2hlbgotICAgICAqIGRvdWJsZS1jbGlja2VkIChha2EgInRoZSBkZWZhdWx0IHNlbGVjdGlvbiIpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cFNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0gICAgICAgIC8vIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciB0aGF0IHdpbGwgY2hlY2svdW5jaGVjayBpdGVtcyB3aGVuIHRoZXkgYXJlIGRvdWJsZS1jbGlja2VkCi0gICAgICAgIHRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBIYW5kbGVzIHNpbmdsZS1jbGljayBzZWxlY3Rpb24gb24gdGhlIHRhYmxlLgotICAgICAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgZW5mb3JjZVNpbmdsZVNlbGVjdGlvbihpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbkxpc3RlbmVyLndpZGdldFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVuYWJsZUFjdGlvbkJ1dHRvbnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBIYW5kbGVzIGRvdWJsZS1jbGljayBzZWxlY3Rpb24gb24gdGhlIHRhYmxlLgotICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoZSBzaW5nbGUtY2xpY2sgaGFuZGxlciB3aWxsIHByb2JhYmx5IGFscmVhZHkgaGF2ZSBiZWVuIGNhbGxlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBPbiBkb3VibGUtY2xpY2ssIDxlbT5hbHdheXM8L2VtPiBjaGVjayB0aGUgdGFibGUgaXRlbS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EaXNwbGF5TW9kZSA9PSBEaXNwbGF5TW9kZS5TSU1QTEVfQ0hFQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbmZvcmNlU2luZ2xlU2VsZWN0aW9uKGkpOwotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2hldGhlciBvciBub3Qgd2UgZGlzcGxheSBkZXRhaWxzLiBkZWZhdWx0OiB0cnVlIHdoZW4gbm90IGluIFNJTVBMRV9DSEVDSyBtb2RlLgotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd0RldGFpbHMgPSBtRGlzcGxheU1vZGUgIT0gRGlzcGxheU1vZGUuU0lNUExFX0NIRUNLOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25MaXN0ZW5lci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEZXRhaWxzICY9IGUuZG9pdDsgLy8gZW5mb3JjZSBmYWxzZSBpbiBTSU1QTEVfQ0hFQ0sKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2hvd0RldGFpbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgb25EZXRhaWxzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZW5hYmxlQWN0aW9uQnV0dG9ucygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRvIGVuc3VyZSBzaW5nbGUgc2VsZWN0aW9uLCB1bmNoZWNrIGFsbCBvdGhlciBpdGVtcyB3aGVuIHRoaXMgb25lIGlzIHNlbGVjdGVkLgotICAgICAgICAgICAgICogVGhpcyBtYWtlcyB0aGUgY2hla2JveGVzIGFjdCBhcyByYWRpbyBidXR0b25zLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZVNpbmdsZVNlbGVjdGlvbihUYWJsZUl0ZW0gaXRlbSkgewotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheU1vZGUgPT0gRGlzcGxheU1vZGUuU0lNUExFX0NIRUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgcGFyZW50VGFibGUgPSBpdGVtLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChUYWJsZUl0ZW0gaTIgOiBwYXJlbnRUYWJsZS5nZXRJdGVtcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkyICE9IGl0ZW0gJiYgaTIuZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkyLnNldENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxzIHRoZSB0YWJsZSB3aXRoIGFsbCBBVkQuCi0gICAgICogVGhlIHRhYmxlIGNvbHVtbnMgYXJlOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+Y29sdW1uIDA6IHNkayBuYW1lCi0gICAgICogPGxpPmNvbHVtbiAxOiBzZGsgdmVuZG9yCi0gICAgICogPGxpPmNvbHVtbiAyOiBzZGsgYXBpIG5hbWUKLSAgICAgKiA8bGk+Y29sdW1uIDM6IHNkayB2ZXJzaW9uCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbFRhYmxlKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0gICAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgQVZEcwotICAgICAgICBBdmRJbmZvIGF2ZHNbXSA9IG51bGw7Ci0gICAgICAgIGlmIChtQXZkTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobURpc3BsYXlNb2RlID09IERpc3BsYXlNb2RlLk1BTkFHRVIpIHsKLSAgICAgICAgICAgICAgICBhdmRzID0gbUF2ZE1hbmFnZXIuZ2V0QWxsQXZkcygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdmRzID0gbUF2ZE1hbmFnZXIuZ2V0VmFsaWRBdmRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXZkcyAhPSBudWxsICYmIGF2ZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgdGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKG1UYXJnZXRGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1UYXJnZXRGaWx0ZXIucHJlcGFyZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEF2ZEluZm8gYXZkIDogYXZkcykgewotICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0RmlsdGVyID09IG51bGwgfHwgbVRhcmdldEZpbHRlci5hY2NlcHQoYXZkKSkgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXREYXRhKGF2ZCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCBhdmQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EaXNwbGF5TW9kZSA9PSBEaXNwbGF5TW9kZS5NQU5BR0VSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEltYWdlKDAsIGF2ZC5nZXRTdGF0dXMoKSA9PSBBdmRTdGF0dXMuT0sgPyBtT2tJbWFnZSA6IG1Ccm9rZW5JbWFnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gYXZkLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCB0YXJnZXQuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMiwgdGFyZ2V0LmdldFZlcnNpb25OYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDMsIHRhcmdldC5nZXRWZXJzaW9uKCkuZ2V0QXBpU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDEsICI/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMiwgIj8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCAiPyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVRhcmdldEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRhcmdldEZpbHRlci5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFibGUuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgdGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShudWxsKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCAiLS0iKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgxLCAiTm8gQVZEIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDIsICItLSIpOwotICAgICAgICAgICAgaXRlbS5zZXRUZXh0KDMsICItLSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEFWRCBpbiB0aGUgdGFibGUuCi0gICAgICogPHAvPgotICAgICAqIFVubGlrZSB7QGxpbmsgI2dldFNlbGVjdGVkKCl9IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBpdGVtIGJlaW5nIHNlbGVjdGVkCi0gICAgICogaW4gdGhlIGxpc3QsIGlnbm9yaW5nIHRoZSBjaGVjayBib3hlcyBzdGF0ZSBpbiB7QGxpbmsgRGlzcGxheU1vZGUjU0lNUExFX0NIRUNLfSBtb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgQXZkSW5mbyBnZXRUYWJsZVNlbGVjdGlvbigpIHsKLSAgICAgICAgaW50IHNlbEluZGV4ID0gbVRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF2ZEluZm8pIG1UYWJsZS5nZXRJdGVtKHNlbEluZGV4KS5nZXREYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIERldGFpbHMsIFN0YXJ0LCBEZWxldGUgYW5kIFVwZGF0ZSBidXR0b25zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmFibGVBY3Rpb25CdXR0b25zKCkgewotICAgICAgICBpZiAobUlzRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbURldGFpbHNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmIChtRGVsZXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXBhaXJCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1SZXBhaXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBdmRJbmZvIHNlbGVjdGlvbiA9IGdldFRhYmxlU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAhPSBudWxsOwotCi0gICAgICAgICAgICBtRGV0YWlsc0J1dHRvbi5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbik7Ci0gICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChtT3NTZGtQYXRoICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0aW9uICYmCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5nZXRTdGF0dXMoKSA9PSBBdmRTdGF0dXMuT0spOwotCi0gICAgICAgICAgICBpZiAobURlbGV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJlcGFpckJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJlcGFpckJ1dHRvbi5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmdldFN0YXR1cygpID09IEF2ZFN0YXR1cy5FUlJPUl9JTUFHRV9ESVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uTmV3KCkgewotICAgICAgICBBdmRDcmVhdGlvbkRpYWxvZyBkbGcgPSBuZXcgQXZkQ3JlYXRpb25EaWFsb2cobVRhYmxlLmdldFNoZWxsKCksIG1BdmRNYW5hZ2VyLAotICAgICAgICAgICAgICAgIG1JbWFnZUZhY3RvcnkpOwotICAgICAgICBpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIHJlZnJlc2goZmFsc2UgLypyZWxvYWQqLyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25EZXRhaWxzKCkgewotICAgICAgICBmaW5hbCBBdmRJbmZvIGF2ZEluZm8gPSBnZXRUYWJsZVNlbGVjdGlvbigpOwotCi0gICAgICAgIEF2ZERldGFpbHNEaWFsb2cgZGxnID0gbmV3IEF2ZERldGFpbHNEaWFsb2cobVRhYmxlLmdldFNoZWxsKCksIGF2ZEluZm8pOwotICAgICAgICBkbGcub3BlbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkRlbGV0ZSgpIHsKLSAgICAgICAgZmluYWwgQXZkSW5mbyBhdmRJbmZvID0gZ2V0VGFibGVTZWxlY3Rpb24oKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgRGlzcGxheQotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBtVGFibGUuZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIC8vIENvbmZpcm0geW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgQVZECi0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0WzBdID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGVsZXRlIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjb25maXJtIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWVkICclcycuIFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSByZXZlcnRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAocmVzdWx0WzBdID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb2cgZm9yIHRoaXMgYWN0aW9uLgotICAgICAgICBTZGtMb2cgbG9nID0gbmV3IFNka0xvZygKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJSZXN1bHQgb2YgZGVsZXRpbmcgQVZEICclcyc6IiwgYXZkSW5mby5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgIGRpc3BsYXkpOwotCi0gICAgICAgIC8vIGRlbGV0ZSB0aGUgQVZECi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IG1BdmRNYW5hZ2VyLmRlbGV0ZUF2ZChhdmRJbmZvLCBsb2cpOwotCi0gICAgICAgIC8vIGRpc3BsYXkgdGhlIHJlc3VsdAotICAgICAgICBsb2cuZGlzcGxheVJlc3VsdChzdWNjZXNzKTsKLQotICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgcmVmcmVzaChmYWxzZSAvKnJlbG9hZCovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGFpcnMgdGhlIHNlbGVjdGVkIEFWRC4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIG5vdyB0aGlzIG9ubHkgc3VwcG9ydHMgZml4aW5nIHRoZSB3cm9uZyB2YWx1ZSBpbiBpbWFnZS5zeXNkaXIuKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblJlcGFpcigpIHsKLSAgICAgICAgZmluYWwgQXZkSW5mbyBhdmRJbmZvID0gZ2V0VGFibGVTZWxlY3Rpb24oKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgRGlzcGxheQotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBtVGFibGUuZ2V0RGlzcGxheSgpOwotCi0gICAgICAgIC8vIGxvZyBmb3IgdGhpcyBhY3Rpb24uCi0gICAgICAgIFNka0xvZyBsb2cgPSBuZXcgU2RrTG9nKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlJlc3VsdCBvZiB1cGRhdGluZyBBVkQgJyVzJzoiLCBhdmRJbmZvLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgZGlzcGxheSk7Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBBVkQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BdmRNYW5hZ2VyLnVwZGF0ZUF2ZChhdmRJbmZvLCBsb2cpOwotCi0gICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSByZXN1bHQKLSAgICAgICAgICAgIGxvZy5kaXNwbGF5UmVzdWx0KHRydWUgLyogc3VjY2VzcyAqLyk7Ci0KLSAgICAgICAgICAgIHJlZnJlc2goZmFsc2UgLypyZWxvYWQqLyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLCBudWxsKTsKLSAgICAgICAgICAgIGxvZy5kaXNwbGF5UmVzdWx0KGZhbHNlIC8qIHN1Y2Nlc3MgKi8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uTWFuYWdlcigpIHsKLSAgICAgICAgVXBkYXRlcldpbmRvdyB3aW5kb3cgPSBuZXcgVXBkYXRlcldpbmRvdygKLSAgICAgICAgICAgICAgICBtVGFibGUuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBudWxsIC8qc2RrIGxvZyovLAotICAgICAgICAgICAgICAgIG1BdmRNYW5hZ2VyLmdldFNka01hbmFnZXIoKS5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qdXNlckNhbkNoYW5nZVNka1Jvb3QqLyk7Ci0gICAgICAgIHdpbmRvdy5vcGVuKCk7Ci0gICAgICAgIHJlZnJlc2godHJ1ZSAvKnJlbG9hZCovKTsgLy8gVXBkYXRlcldpbmRvdyB1c2VzIGl0cyBvd24gQVZEIG1hbmFnZXIgc28gdGhpcyBvbmUgbXVzdCByZWxvYWQuCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIEF2ZEluZm8gYXZkSW5mbyA9IGdldFRhYmxlU2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGF2ZEluZm8gPT0gbnVsbCB8fCBtT3NTZGtQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEF2ZFN0YXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBdmRTdGFydERpYWxvZyhtVGFibGUuZ2V0U2hlbGwoKSwgYXZkSW5mbywgbU9zU2RrUGF0aCwKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcik7Ci0gICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtT3NTZGtQYXRoICsKLSAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLk9TX1NES19UT09MU19GT0xERVIgKwotICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9FTVVMQVRPUjsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF2ZE5hbWUgPSBhdmRJbmZvLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChwYXRoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKCItYXZkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBsaXN0LmFkZChhdmROYW1lKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cuZ2V0V2lwZURhdGEoKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCItd2lwZS1kYXRhIik7ICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gZGlhbG9nLmdldFNjYWxlKCk7Ci0gICAgICAgICAgICBpZiAoc2NhbGUgIT0gMC5mKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gdGhlIHJvdW5kaW5nIG91cnNlbHZlcy4gVGhpcyBpcyBiZWNhdXNlICUuMWYgd2lsbCB3cml0ZSAuNDg5OSBhcyAuNAotICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5yb3VuZChzY2FsZSAqIDEwMCk7Ci0gICAgICAgICAgICAgICAgc2NhbGUgLz0gIDEwMC5mOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCItc2NhbGUiKTsgICAgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChTdHJpbmcuZm9ybWF0KCIlLjJmIiwgc2NhbGUpKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGxpc3QgaW50byBhbiBhcnJheSBmb3IgdGhlIGNhbGwgdG8gZXhlYy4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNvbW1hbmQgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCi0gICAgICAgICAgICAvLyBsYXVuY2ggdGhlIGVtdWxhdG9yCi0gICAgICAgICAgICBuZXcgUHJvZ3Jlc3NUYXNrKG1UYWJsZS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAiU3RhcnRpbmcgQW5kcm9pZCBFbXVsYXRvciIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJVGFzaygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJVGFza01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0RGVzY3JpcHRpb24oIlN0YXJ0aW5nIGVtdWxhdG9yIGZvciBBVkQgJyUxJHMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXRQcm9ncmVzc01heChuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhYkVtdWxhdG9yT3V0cHV0KHByb2Nlc3MsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc21hbGwgd2FpdCBwcmV2ZW50cyB0aGUgZGlhbG9nIGZyb20gY2xvc2luZyB0b28gZmFzdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBpdCB3b3JrcywgdGhlIGVtdWxhdG9yIHJldHVybnMgaW1tZWRpYXRlbHksIGV2ZW4gaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gVUkgaXMgc2hvd24geWV0LiBBbmQgd2hlbiBpdCBmYWlscyAoYmVjYXVzZSB0aGUgQVZEIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2tlZC9ydW5uaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgd2FpdCB3ZSBkb24ndCBjYXB0dXJlIHRoZSBlcnJvciBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSByZWFzb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuaW5jUHJvZ3Jlc3MoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCJGYWlsZWQgdG8gc3RhcnQgZW11bGF0b3I6ICUxJHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RkZXJyL3N0ZG91dCBvdXRwdXRzIG9mIGEgcHJvY2VzcyBhbmQgcmV0dXJuIHdoZW4gdGhlIHByb2Nlc3MgaXMgZG9uZS4KLSAgICAgKiBCb3RoIDxiPm11c3Q8L2I+IGJlIHJlYWQgb3IgdGhlIHByb2Nlc3Mgd2lsbCBibG9jayBvbiB3aW5kb3dzLgotICAgICAqIEBwYXJhbSBwcm9jZXNzIFRoZSBwcm9jZXNzIHRvIGdldCB0aGUgb3V0cHV0IGZyb20uCi0gICAgICogQHBhcmFtIG1vbml0b3IgQW4ge0BsaW5rIElTZGtMb2d9IHRvIGNhcHR1cmUgZXJyb3JzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBncmFiRW11bGF0b3JPdXRwdXQoZmluYWwgUHJvY2VzcyBwcm9jZXNzLCBmaW5hbCBJVGFza01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAvLyByZWFkIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUuIGlmIG51bGwgaXMgcmV0dXJuZWQsIGl0J3MgYmVjYXVzZSB0aGUgcHJvY2VzcyBmaW5pc2hlZAotICAgICAgICBuZXcgVGhyZWFkKCJlbXUtc3RkZXJyIikgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgdG8gcmVhZCB0aGUgc3RkZXJyIG91dHB1dAotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgZXJyUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGVyclJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iuc2V0UmVzdWx0KCIlMSRzIiwgbGluZSk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgbmV3IFRocmVhZCgiZW11LXN0ZG91dCIpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBvdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gb3V0UmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zZXRSZXN1bHQoIiUxJHMiLCBsaW5lKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0cyBhbGwgbG9nIGZyb20gdGhlIEFWRCBhY3Rpb24gYW5kIGRpc3BsYXlzIGl0IGluIGEgZGlhbG9nLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBTZGtMb2cgaW1wbGVtZW50cyBJU2RrTG9nIHsKLQotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBsb2dNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTWVzc2FnZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5IG1EaXNwbGF5OwotCi0gICAgICAgIHB1YmxpYyBTZGtMb2coU3RyaW5nIG1lc3NhZ2UsIERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICAgICAgbU1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICAgICAgbURpc3BsYXkgPSBkaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSwgU3RyaW5nIGVycm9yRm9ybWF0LCBPYmplY3QuLi4gYXJnKSB7Ci0gICAgICAgICAgICBpZiAoZXJyb3JGb3JtYXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KCJFcnJvcjogIiArIGVycm9yRm9ybWF0LCBhcmcpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nTWVzc2FnZXMuYWRkKHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgd2FybmluZ0Zvcm1hdCwgT2JqZWN0Li4uIGFyZykgewotICAgICAgICAgICAgbG9nTWVzc2FnZXMuYWRkKFN0cmluZy5mb3JtYXQoIldhcm5pbmc6ICIgKyB3YXJuaW5nRm9ybWF0LCBhcmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50ZihTdHJpbmcgbXNnRm9ybWF0LCBPYmplY3QuLi4gYXJnKSB7Ci0gICAgICAgICAgICBsb2dNZXNzYWdlcy5hZGQoU3RyaW5nLmZvcm1hdChtc2dGb3JtYXQsIGFyZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERpc3BsYXlzIHRoZSBsb2cgaWYgYW55dGhpbmcgd2FzIGNhcHR1cmVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcGxheVJlc3VsdChmaW5hbCBib29sZWFuIHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIGlmIChsb2dNZXNzYWdlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG1NZXNzYWdlICsgIlxuXG4iKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBtc2cgOiBsb2dNZXNzYWdlcykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgLy8gZGlhbG9nIGJveCBvbmx5IHJ1biBpbiB1aSB0aHJlYWQuLgotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gbURpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsICJBbmRyb2lkIFZpcnR1YWwgRGV2aWNlcyBNYW5hZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzIE1hbmFnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC93aWRnZXRzL0F2ZFN0YXJ0RGlhbG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvQXZkU3RhcnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhOTIxOC4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvQXZkU3RhcnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLmF2ZC5BdmRNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5hdmQuQXZkTWFuYWdlci5BdmRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLnJlcG9zaXRvcnkuU2V0dGluZ3NDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLnVpLkdyaWREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogRGlhbG9nIGRlYWxpbmcgd2l0aCBlbXVsYXRvciBsYXVuY2ggb3B0aW9ucy4gVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+LXdpcGUtZGF0YTwvbGk+Ci0gKiA8bGk+LXNjYWxlPC9saT4KLSAqIDwvdWw+Ci0gKgotICogVmFsdWVzIGFyZSBzdG9yZWQgKGluIHRoZSBjbGFzcyBhcyBzdGF0aWMgZmllbGQpIHRvIGJlIHJldXNlZCB3aGlsZSB0aGUgYXBwIGlzIHN0aWxsIHJ1bm5pbmcuCi0gKiBUaGUgTW9uaXRvciBkcGkgaXMgc3RvcmVkIGluIHRoZSBzZXR0aW5ncyBpZiBhdmFpbGFiZS4KLSAqLwotZmluYWwgY2xhc3MgQXZkU3RhcnREaWFsb2cgZXh0ZW5kcyBHcmlkRGlhbG9nIHsKLSAgICAvLyBzdGF0aWMgZmllbGQgdG8gcmV1c2UgdmFsdWVzIGR1cmluZyB0aGUgc2FtZSBzZXNzaW9uLgotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc1dpcGVEYXRhID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNNb25pdG9yRHBpID0gNzI7IC8vIHVzZWQgaWYgdGhlcmUncyBubyBzZXR0aW5nIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzU2tpblNjYWxpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1NjcmVlblNpemVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXGQqKFxcLlxcZD8pPyIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBdmRJbmZvIG1BdmQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNka0xvY2F0aW9uOwotICAgIHByaXZhdGUgZmluYWwgU2V0dGluZ3NDb250cm9sbGVyIG1TZXR0aW5nc0NvbnRyb2xsZXI7Ci0KLSAgICBwcml2YXRlIFRleHQgbVNjcmVlblNpemU7Ci0gICAgcHJpdmF0ZSBUZXh0IG1Nb25pdG9yRHBpOwotICAgIHByaXZhdGUgQnV0dG9uIG1TY2FsZUJ1dHRvbjsKLQotICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlID0gMC5mOwotICAgIHByaXZhdGUgYm9vbGVhbiBtV2lwZURhdGEgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtRGVuc2l0eSA9IDE2MDsgLy8gbWVkaXVtIGRlbnNpdHkKLSAgICBwcml2YXRlIGludCBtU2l6ZTEgPSAtMTsKLSAgICBwcml2YXRlIGludCBtU2l6ZTIgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtU2tpbkRpc3BsYXk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVTY2FsaW5nID0gdHJ1ZTsKLSAgICBwcml2YXRlIExhYmVsIG1TY2FsZUZpZWxkOwotCi0gICAgQXZkU3RhcnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEF2ZEluZm8gYXZkLCBTdHJpbmcgc2RrTG9jYXRpb24sCi0gICAgICAgICAgICBTZXR0aW5nc0NvbnRyb2xsZXIgc2V0dGluZ3NDb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCAyLCBmYWxzZSk7Ci0gICAgICAgIG1BdmQgPSBhdmQ7Ci0gICAgICAgIG1TZGtMb2NhdGlvbiA9IHNka0xvY2F0aW9uOwotICAgICAgICBtU2V0dGluZ3NDb250cm9sbGVyID0gc2V0dGluZ3NDb250cm9sbGVyOwotICAgICAgICBpZiAobUF2ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdmQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVNka0xvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNka0xvY2F0aW9uIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wdXRlU2tpbkRhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRXaXBlRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaXBlRGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3Rvciwgb3IgMC5mIGlmIG5vbmUgYXJlIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBtU2NhbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRGlhbG9nQ29udGVudChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEdyaWREYXRhIGdkOwotCi0gICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiU2tpbjoiKTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQobVNraW5EaXNwbGF5ID09IG51bGwgPyAiTm9uZSIgOiBtU2tpbkRpc3BsYXkpOwotICAgICAgICBsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiRGVuc2l0eToiKTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoZ2V0RGVuc2l0eVRleHQoKSk7Ci0gICAgICAgIGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgbVNjYWxlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG1TY2FsZUJ1dHRvbi5zZXRUZXh0KCJTY2FsZSBkaXNwbGF5IHRvIHJlYWwgc2l6ZSIpOwotICAgICAgICBtU2NhbGVCdXR0b24uc2V0RW5hYmxlZChtRW5hYmxlU2NhbGluZyk7Ci0gICAgICAgIGJvb2xlYW4gZGVmYXVsdFN0YXRlID0gbUVuYWJsZVNjYWxpbmcgJiYgc1NraW5TY2FsaW5nLmdldChtQXZkLmdldE5hbWUoKSkgIT0gbnVsbDsKLSAgICAgICAgbVNjYWxlQnV0dG9uLnNldFNlbGVjdGlvbihkZWZhdWx0U3RhdGUpOwotICAgICAgICBtU2NhbGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBmaW5hbCBHcm91cCBzY2FsZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzY2FsZUdyb3VwLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzY2FsZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwoc2NhbGVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIlNjcmVlbiBTaXplIChpbik6Iik7Ci0gICAgICAgIG1TY3JlZW5TaXplID0gbmV3IFRleHQoc2NhbGVHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1TY3JlZW5TaXplLnNldFRleHQoZ2V0U2NyZWVuU2l6ZSgpKTsKLSAgICAgICAgbVNjcmVlblNpemUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIG1TY3JlZW5TaXplLmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBjb21iaW5lIHRoZSBjdXJyZW50IGNvbnRlbnQgYW5kIHRoZSBuZXcgdGV4dAotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbVNjcmVlblNpemUuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCkgKyBldmVudC50ZXh0ICsgdGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyBtYWtlIHN1cmUgaXQncyBhIG1hdGNoIGZvciB0aGUgcmVnZXgKLSAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gc1NjcmVlblNpemVQYXR0ZXJuLm1hdGNoZXIodGV4dCkubWF0Y2hlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbVNjcmVlblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG9uU2NhbGVDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gZW1wdHkgY29tcG9zaXRlLCBvbmx5IDIgd2lkZ2V0cyBvbiB0aGlzIGxpbmUuCi0gICAgICAgIG5ldyBDb21wb3NpdGUoc2NhbGVHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIGdkLndpZHRoSGludCA9IGdkLmhlaWdodEhpbnQgPSAwOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwoc2NhbGVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIk1vbml0b3IgZHBpOiIpOwotICAgICAgICBtTW9uaXRvckRwaSA9IG5ldyBUZXh0KHNjYWxlR3JvdXAsIFNXVC5CT1JERVIpOwotICAgICAgICBtTW9uaXRvckRwaS5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoZ2V0TW9uaXRvckRwaSgpKSk7Ci0gICAgICAgIG1Nb25pdG9yRHBpLnNldExheW91dERhdGEoZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGdkLndpZHRoSGludCA9IDUwOwotICAgICAgICBtTW9uaXRvckRwaS5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGRpZ2l0IG9ubHkuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZXZlbnQudGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgbGV0dGVyID0gZXZlbnQudGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZXR0ZXIgPCAnMCcgfHwgbGV0dGVyID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBtTW9uaXRvckRwaS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgb25TY2FsZUNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzY2FsZUdyb3VwLCBTV1QuUFVTSCB8IFNXVC5GTEFUKTsKLSAgICAgICAgYnV0dG9uLnNldFRleHQoIj8iKTsKLSAgICAgICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KCJDbGljayB0byBmaWd1cmUgb3V0IHlvdXIgbW9uaXRvcidzIHBpeGVsIGRlbnNpdHkiKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgUmVzb2x1dGlvbkNob29zZXJEaWFsb2cgZGlhbG9nID0gbmV3IFJlc29sdXRpb25DaG9vc2VyRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgbU1vbml0b3JEcGkuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGRpYWxvZy5nZXREZW5zaXR5KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwoc2NhbGVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIlNjYWxlOiIpOwotICAgICAgICBtU2NhbGVGaWVsZCA9IG5ldyBMYWJlbChzY2FsZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1TY2FsZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwKLSAgICAgICAgICAgICAgICB0cnVlIC8qZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSovLAotICAgICAgICAgICAgICAgIHRydWUgLypncmFiRXhjZXNzVmVydGljYWxTcGFjZSovLAotICAgICAgICAgICAgICAgIDIgLypob3Jpem9udGFsU3BhbiovLAotICAgICAgICAgICAgICAgIDEgLyp2ZXJ0aWNhbFNwYW4qLykpOwotICAgICAgICBzZXRTY2FsZShtU2NhbGUpOyAvLyBzZXQgaW5pdGlhbCB0ZXh0IHZhbHVlCi0KLSAgICAgICAgZW5hYmxlR3JvdXAoc2NhbGVHcm91cCwgZGVmYXVsdFN0YXRlKTsKLQotICAgICAgICBtU2NhbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gbVNjYWxlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGVuYWJsZUdyb3VwKHNjYWxlR3JvdXAsIGVuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2NhbGVDaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRTY2FsZSgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiB3aXBlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHdpcGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB3aXBlQnV0dG9uLnNldFRleHQoIldpcGUgdXNlciBkYXRhIik7Ci0gICAgICAgIHdpcGVCdXR0b24uc2V0U2VsZWN0aW9uKG1XaXBlRGF0YSA9IHNXaXBlRGF0YSk7Ci0gICAgICAgIHdpcGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBtV2lwZURhdGEgPSB3aXBlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgbC5zZXRMYXlvdXREYXRhKGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgICAgLy8gaWYgdGhlIHNjYWxpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3ZSBtdXN0IGluaXRpYWxpemUgdGhlIHZhbHVlIG9mIG1TY2FsZQotICAgICAgICBpZiAoZGVmYXVsdFN0YXRlKSB7Ci0gICAgICAgICAgICBvblNjYWxlQ2hhbmdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogT24gV2luZG93cyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGVuYWJsZS9kaXNhYmxlIHRoZSBjaGlsZHJlbiBvZiBhIGdyb3VwICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUdyb3VwKGZpbmFsIEdyb3VwIGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgZ3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgZm9yIChDb250cm9sIGMgOiBncm91cC5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBjLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgIG5ld1NoZWxsLnNldFRleHQoIkxhdW5jaCBPcHRpb25zIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotICAgICAgICBpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgbGFiZWwgPSAiTGF1bmNoIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgLy8gb3ZlcnJpZGUgb2sgdG8gc3RvcmUgc29tZSBpbmZvCi0gICAgICAgIC8vIGZpcnN0IHRoZSBtb25pdG9yIGRwaQotICAgICAgICBTdHJpbmcgZHBpID0gbU1vbml0b3JEcGkuZ2V0VGV4dCgpOwotICAgICAgICBpZiAoZHBpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc01vbml0b3JEcGkgPSBJbnRlZ2VyLnBhcnNlSW50KGRwaSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2V0dGluZyBjb250cm9sbGVyLCBzYXZlIGl0Ci0gICAgICAgICAgICBpZiAobVNldHRpbmdzQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNldHRpbmdzQ29udHJvbGxlci5zZXRNb25pdG9yRGVuc2l0eShzTW9uaXRvckRwaSk7Ci0gICAgICAgICAgICAgICAgbVNldHRpbmdzQ29udHJvbGxlci5zYXZlU2V0dGluZ3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyB0aGUgc2NhbGUgZmFjdG9yCi0gICAgICAgIFN0cmluZyBrZXkgPSBtQXZkLmdldE5hbWUoKTsKLSAgICAgICAgc1NraW5TY2FsaW5nLnJlbW92ZShrZXkpOwotICAgICAgICBpZiAobVNjYWxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2l6ZSA9IG1TY3JlZW5TaXplLmdldFRleHQoKTsKLSAgICAgICAgICAgIGlmIChzaXplLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNTa2luU2NhbGluZy5wdXQoa2V5LCBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFuZCB0aGVuIHRoZSB3aXBlLWRhdGEgY2hlY2tib3gKLSAgICAgICAgc1dpcGVEYXRhID0gbVdpcGVEYXRhOwotCi0gICAgICAgIC8vIGZpbmFsbHkgY29udGludWUgd2l0aCB0aGUgb2sgYWN0aW9uCi0gICAgICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wdXRlU2tpbkRhdGEoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcCA9IG1BdmQuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBTdHJpbmcgZHBpID0gcHJvcC5nZXQoImh3LmxjZC5kZW5zaXR5Iik7Ci0gICAgICAgIGlmIChkcGkgIT0gbnVsbCAmJiBkcGkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGVuc2l0eSAgPSBJbnRlZ2VyLnBhcnNlSW50KGRwaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5kU2tpblJlc29sdXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25TY2FsZUNoYW5nZSgpIHsKLSAgICAgICAgU3RyaW5nIHNpemVTdHIgPSBtU2NyZWVuU2l6ZS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChzaXplU3RyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHNldFNjYWxlKDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRwaVN0ciA9IG1Nb25pdG9yRHBpLmdldFRleHQoKTsKLSAgICAgICAgaWYgKGRwaVN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRTY2FsZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkcGkgPSBJbnRlZ2VyLnBhcnNlSW50KGRwaVN0cik7Ci0gICAgICAgIGZsb2F0IHNpemUgPSBGbG9hdC5wYXJzZUZsb2F0KHNpemVTdHIpOwotICAgICAgICAvKgotICAgICAgICAgKiBXZSBhcmUgdHJ5aW5nIHRvIGVtdWxhdGUgdGhlIGZvbGxvd2luZyBkZXZpY2U6Ci0gICAgICAgICAqIHJlc29sdXRpb246ICdtU2l6ZTEneCdtU2l6ZTInCi0gICAgICAgICAqIGRlbnNpdHk6ICdtRGVuc2l0eScKLSAgICAgICAgICogc2NyZWVuIGRpYWdvbmFsOiAnc2l6ZScKLSAgICAgICAgICogb250b3AgYSBtb25pdG9yIHJ1bm5pbmcgYXQgJ2RwaScKLSAgICAgICAgICovCi0gICAgICAgIC8vIFdlIHN0YXJ0IGJ5IGNvbXB1dGluZyB0aGUgc2NyZWVuIGRpYWdvbmFsIGluIHBpeGVscywgaWYgdGhlIGRlbnNpdHkgd2FzIHJlYWxseSBtRGVuc2l0eQotICAgICAgICBmbG9hdCBkaWFnb25hbFB4ID0gKGZsb2F0KU1hdGguc3FydChtU2l6ZTEqbVNpemUxK21TaXplMiptU2l6ZTIpOwotICAgICAgICAvLyBOb3cgd2Ugd291bGQgY29udmVydCB0aGlzIGluIGFjdHVhbCBpbmNoZXM6Ci0gICAgICAgIC8vICAgIGRpYWdvbmFsSW4gPSBkaWFnb25hbCAvIG1EZW5zaXR5Ci0gICAgICAgIC8vIHRoZSBzY2FsZSBmYWN0b3IgaXMgYSBtaXggb2YgYWRhcHRpbmcgdG8gdGhlIG5ldyBkZW5zaXR5IGFuZCB0byB0aGUgbmV3IHNpemUuCi0gICAgICAgIC8vICAgIChzaXplL2RpYWdvbmFsSW4pICogKGRwaS9tRGVuc2l0eSkKLSAgICAgICAgLy8gdGhpcyBjYW4gYmUgc2ltcGxpZmllZCB0bzoKLSAgICAgICAgc2V0U2NhbGUoKHNpemUgKiBkcGkpIC8gZGlhZ29uYWxQeCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNjYWxlKGZsb2F0IHNjYWxlKSB7Ci0gICAgICAgIG1TY2FsZSA9IHNjYWxlOwotCi0gICAgICAgIC8vIERvIHRoZSByb3VuZGluZyBleGFjdGx5IGxpa2UgQXZkU2VsZWN0b3Igd2lsbCBkby4KLSAgICAgICAgc2NhbGUgPSBNYXRoLnJvdW5kKHNjYWxlICogMTAwKTsKLSAgICAgICAgc2NhbGUgLz0gIDEwMC5mOwotCi0gICAgICAgIGlmIChzY2FsZSA9PSAwLmYpIHsKLSAgICAgICAgICAgIG1TY2FsZUZpZWxkLnNldFRleHQoImRlZmF1bHQiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TY2FsZUZpZWxkLnNldFRleHQoU3RyaW5nLmZvcm1hdCgiJS4yZiIsIHNjYWxlKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtb25pdG9yIGRwaSB0byBzdGFydCB3aXRoLgotICAgICAqIFRoaXMgY2FuIGJlIGNvbWluZyBmcm9tIHRoZSBzZXR0aW5ncywgdGhlIHNlc3Npb24tYmFzZWQgc3RvcmFnZSwgb3IgdGhlIGZyb20gd2hhdGV2ZXIgSmF2YQotICAgICAqIGNhbiB0ZWxsIHVzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1vbml0b3JEcGkoKSB7Ci0gICAgICAgIGlmIChtU2V0dGluZ3NDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNNb25pdG9yRHBpID0gbVNldHRpbmdzQ29udHJvbGxlci5nZXRNb25pdG9yRGVuc2l0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNNb25pdG9yRHBpID09IC0xKSB7IC8vIGZpcnN0IHRpbWU/IHRyeSB0byBnZXQgYSB2YWx1ZQotICAgICAgICAgICAgc01vbml0b3JEcGkgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuUmVzb2x1dGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNNb25pdG9yRHBpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiBzaXplIHRvIHN0YXJ0IHdpdGguCi0gICAgICogPHAvPklmIGFuIGVtdWxhdG9yIHdpdGggdGhlIHNhbWUgc2tpbiB3YXMgYWxyZWFkeSBsYXVuY2hlZCwgc2NhbGVkLCB0aGUgc2l6ZSB1c2VkIGlzIHJldXNlZC4KLSAgICAgKiA8cC8+T3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGlzIHJldHVybmVkICgzKQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFNjcmVlblNpemUoKSB7Ci0gICAgICAgIFN0cmluZyBzaXplID0gc1NraW5TY2FsaW5nLmdldChtQXZkLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChzaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIzIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBkZW5zaXR5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldERlbnNpdHlUZXh0KCkgewotICAgICAgICBzd2l0Y2ggKG1EZW5zaXR5KSB7Ci0gICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkxvdyAoMTIwKSI7Ci0gICAgICAgICAgICBjYXNlIDE2MDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1lZGl1bSAoMTYwKSI7Ci0gICAgICAgICAgICBjYXNlIDI0MDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkhpZ2ggKDI0MCkiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcobURlbnNpdHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBza2luIHJlc29sdXRpb24gYW5kIHNldHMgaXQgaW4ge0BsaW5rICNtU2l6ZTF9IGFuZCB7QGxpbmsgI21TaXplMn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRTa2luUmVzb2x1dGlvbigpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wID0gbUF2ZC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFN0cmluZyBza2luTmFtZSA9IHByb3AuZ2V0KEF2ZE1hbmFnZXIuQVZEX0lOSV9TS0lOX05BTUUpOwotCi0gICAgICAgIGlmIChza2luTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG0gPSBBdmRNYW5hZ2VyLk5VTUVSSUNfU0tJTl9TSVpFLm1hdGNoZXIoc2tpbk5hbWUpOwotICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIG1TaXplMSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgbVNpemUyID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICBtU2tpbkRpc3BsYXkgPSBza2luTmFtZTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlU2NhbGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIHJlc29sdXRpb24gaXMgaW5zaWRlIHRoZSBsYXlvdXQgZmlsZSBvZiB0aGUgc2tpbi4KLSAgICAgICAgbUVuYWJsZVNjYWxpbmcgPSBmYWxzZTsgLy8gZGVmYXVsdCB0byBmYWxzZSBmb3Igbm93LgotCi0gICAgICAgIC8vIHBhdGggdG8gdGhlIHNraW4gbGF5b3V0IGZpbGUuCi0gICAgICAgIFN0cmluZyBza2luUGF0aCA9IHByb3AuZ2V0KEF2ZE1hbmFnZXIuQVZEX0lOSV9TS0lOX1BBVEgpOwotICAgICAgICBpZiAoc2tpblBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBza2luRm9sZGVyID0gbmV3IEZpbGUobVNka0xvY2F0aW9uLCBza2luUGF0aCk7Ci0gICAgICAgICAgICBpZiAoc2tpbkZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBsYXlvdXRGaWxlID0gbmV3IEZpbGUoc2tpbkZvbGRlciwgImxheW91dCIpOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXRGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUxheW91dEZpbGUobGF5b3V0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ta2luRGlzcGxheSA9IFN0cmluZy5mb3JtYXQoIiUxJHMgKCUyJGR4JTMkZCkiLCBza2luTmFtZSwgbVNpemUxLCBtU2l6ZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVuYWJsZVNjYWxpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNraW5EaXNwbGF5ID0gc2tpbk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBsYXlvdXQgZmlsZS4KLSAgICAgKiA8cC8+Ci0gICAgICogdGhlIGZvcm1hdCBpcyByZWxhdGl2ZWx5IGVhc3kuIEl0J3MgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIGRlZmluZWQgYXMKLSAgICAgKiAmbGc7bmFtZSZndDsgewotICAgICAqICAgICAmbGc7Y29udGVudCZndDsKLSAgICAgKiB9Ci0gICAgICoKLSAgICAgKiBjb250ZW50IGlzIGVpdGhlciAxKyBpdGVtcyBvciAxKyBwcm9wZXJ0aWVzCi0gICAgICogcHJvcGVydGllcyBhcmUgZGVmaW5lZCBhcwotICAgICAqICZsZztuYW1lJmd0OyZsZzt3aGl0ZXNwYWNlJmd0OyZsZzt2YWx1ZSZndDsKLSAgICAgKgotICAgICAqIFdlJ3JlIGdvaW5nIHRvIGxvb2sgZm9yIGFuIGl0ZW0gY2FsbGVkIGRpc3BsYXksIHdpdGggMiBwcm9wZXJ0aWVzIGhlaWdodCBhbmQgd2lkdGguCi0gICAgICogVGhpcyBpcyB2ZXJ5IGJhc2ljIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXlvdXRGaWxlIHRoZSBmaWxlIHRvIHBhcnNlCi0gICAgICogQHJldHVybiB0cnVlIGlmIGJvdGggc2l6ZXMgd2hlcmUgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlTGF5b3V0RmlsZShGaWxlIGxheW91dEZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGlucHV0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGxheW91dEZpbGUpKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotCi0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbnB1dC5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJpbSB0byByZW1vdmUgd2hpdGVzcGFjZQotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gbGluZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBpdGVtCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KGxlbi0xKSA9PSAneycpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBub2RlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IGxpbmUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXNwbGF5Ii5lcXVhbHModG9rZW5zWzBdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yIQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChtU2l6ZTEgPT0gLTEgfHwgbVNpemUyID09IC0xKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmltIHRvIHJlbW92ZSB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgifSIuZXF1YWxzKGxpbmUpKSB7IC8vIGxvb2tzIGxpa2Ugd2UncmUgZG9uZSB3aXRoIHRoZSBpdGVtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPj0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdsbCBnZXQgYW4gZXh0cmEgZW1wdHkgdG9rZW4gaW4gdGhlIG1pZGRsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ3aWR0aCIuZXF1YWxzKHRva2Vuc1swXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplMSA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJoZWlnaHQiLmVxdWFscyh0b2tlbnNbMF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZTIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TaXplMSAhPSAtMSAmJiBtU2l6ZTIgIT0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGl0IHJlYWNoZXMgaGVyZSwgZGlzcGxheSB3YXMgbm90IGZvdW5kLgotICAgICAgICAgICAgLy8gZmFsc2UgaXMgcmV0dXJuZWQgYmVsb3cuCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZS4KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvSGFyZHdhcmVQcm9wZXJ0eUNob29zZXIuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9IYXJkd2FyZVByb3BlcnR5Q2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTg0NDQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9IYXJkd2FyZVByb3BlcnR5Q2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwuYXZkLkhhcmR3YXJlUHJvcGVydGllcy5IYXJkd2FyZVByb3BlcnR5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNka3VpbGliLnVpLkdyaWREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIERpYWxvZyB0byBjaG9vc2UgYSBoYXJkd2FyZSBwcm9wZXJ0eQotICovCi1jbGFzcyBIYXJkd2FyZVByb3BlcnR5Q2hvb3NlciBleHRlbmRzIEdyaWREaWFsb2cgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBIYXJkd2FyZVByb3BlcnR5PiBtUHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBtRXhjZXB0UHJvcGVydGllczsKLSAgICBwcml2YXRlIEhhcmR3YXJlUHJvcGVydHkgbUNob3NlblByb3BlcnR5OwotICAgIHByaXZhdGUgTGFiZWwgbVR5cGVMYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIG1EZXNjcmlwdGlvbkxhYmVsOwotCi0gICAgSGFyZHdhcmVQcm9wZXJ0eUNob29zZXIoU2hlbGwgcGFyZW50U2hlbGwsIE1hcDxTdHJpbmcsIEhhcmR3YXJlUHJvcGVydHk+IHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gZXhjZXB0UHJvcGVydGllcykgewotICAgICAgICBzdXBlcihwYXJlbnRTaGVsbCwgMiwgZmFsc2UpOwotICAgICAgICBtUHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgICAgIG1FeGNlcHRQcm9wZXJ0aWVzID0gZXhjZXB0UHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFyZHdhcmVQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9zZW5Qcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVEaWFsb2dDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJQcm9wZXJ0eToiKTsKLQotICAgICAgICBmaW5hbCBDb21ibyBjID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICAvLyBzaW1wbGUgbGlzdCBmb3IgaW5kZXgtPm5hbWUgcmVzb2x1dGlvbi4KLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gaW5kZXhUb05hbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIEhhcmR3YXJlUHJvcGVydHk+IGVudHJ5IDogbVByb3BlcnRpZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKG1FeGNlcHRQcm9wZXJ0aWVzLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGMuYWRkKGVudHJ5LmdldFZhbHVlKCkuZ2V0QWJzdHJhY3QoKSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhUb05hbWUuYWRkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGhhc1ZhbHVlcyA9IHRydWU7Ci0gICAgICAgIGlmIChpbmRleFRvTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgaGFzVmFsdWVzID0gZmFsc2U7Ci0gICAgICAgICAgICBjLmFkZCgiTm8gcHJvcGVydGllcyIpOwotICAgICAgICAgICAgYy5zZWxlY3QoMCk7Ci0gICAgICAgICAgICBjLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbmRleFRvTmFtZS5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NTZWxlY3Rpb24obmFtZSwgdHJ1ZSAvKiBwYWNrICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJUeXBlOiIpOwotCi0gICAgICAgIG1UeXBlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbC5zZXRUZXh0KCJEZXNjcmlwdGlvbjoiKTsKLQotICAgICAgICBtRGVzY3JpcHRpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBpZiAoaGFzVmFsdWVzKSB7Ci0gICAgICAgICAgICBjLnNlbGVjdCgwKTsKLSAgICAgICAgICAgIHByb2Nlc3NTZWxlY3Rpb24oaW5kZXhUb05hbWUuZ2V0KDApLCBmYWxzZSAvKiBwYWNrICovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2VsZWN0aW9uKFN0cmluZyBuYW1lLCBib29sZWFuIHBhY2spIHsKLSAgICAgICAgbUNob3NlblByb3BlcnR5ID0gbVByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgICAgICBtVHlwZUxhYmVsLnNldFRleHQobUNob3NlblByb3BlcnR5LmdldFR5cGUoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgU3RyaW5nIGRlc2MgPSBtQ2hvc2VuUHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChtQ2hvc2VuUHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KCJOL0EiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYWNrKSB7Ci0gICAgICAgICAgICBnZXRTaGVsbCgpLnBhY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9pbnRlcm5hbC93aWRnZXRzL1Jlc29sdXRpb25DaG9vc2VyRGlhbG9nLmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvUmVzb2x1dGlvbkNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ODhlNi4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvUmVzb2x1dGlvbkNob29zZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIudWkuR3JpZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBTbWFsbCBkaWFsb2cgdG8gbGV0IGEgdXNlciBjaG9vc2UgYSBzY3JlZW4gc2l6ZSAoZnJvbSBhIGZpeGVkIGxpc3QpIGFuZCBhIHJlc29sdXRpb24KLSAqIChhcyByZXR1cm5lZCBieSB7QGxpbmsgRGlzcGxheSNnZXRNb25pdG9ycygpfSkuCi0KLSAqIEFmdGVyIHRoZSBkaWFsb2cgYXMgcmV0dXJuZWQsIG9uZSBjYW4gcXVlcnkge0BsaW5rICNnZXREZW5zaXR5KCl9IHRvIGdldCB0aGUgY2hvc2VuIG1vbml0b3IKLSAqIHBpeGVsIGRlbnNpdHkuCi0gKi8KLWNsYXNzIFJlc29sdXRpb25DaG9vc2VyRGlhbG9nIGV4dGVuZHMgR3JpZERpYWxvZyB7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBmbG9hdFtdIE1PTklUT1JfU0laRVMgPSBuZXcgZmxvYXRbXSB7Ci0gICAgICAgICAgICAxMy4zZiwgMTQsIDE1LjRmLCAxNS42ZiwgMTcsIDE5LCAyMCwgMjEsIDI0LCAzMCwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBCdXR0b24gbUJ1dHRvbjsKLSAgICBwcml2YXRlIENvbWJvIG1TY3JlZW5TaXplQ29tYm87Ci0gICAgcHJpdmF0ZSBDb21ibyBtTW9uaXRvckNvbWJvOwotCi0gICAgcHJpdmF0ZSBNb25pdG9yW10gbU1vbml0b3JzOwotICAgIHByaXZhdGUgaW50IG1TY3JlZW5TaXplSW5kZXggPSAtMTsKLSAgICBwcml2YXRlIGludCBtTW9uaXRvckluZGV4ID0gMDsKLQotICAgIFJlc29sdXRpb25DaG9vc2VyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsLCAyLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGl4ZWwgZGVuc2l0eSBvZiB0aGUgdXNlci1jaG9zZW4gbW9uaXRvci4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVuc2l0eSgpIHsKLSAgICAgICAgZmxvYXQgc2l6ZSA9IE1PTklUT1JfU0laRVNbbVNjcmVlblNpemVJbmRleF07Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0ID0gbU1vbml0b3JzW21Nb25pdG9ySW5kZXhdLmdldEJvdW5kcygpOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbnNpdHkKLSAgICAgICAgZG91YmxlIGQgPSBNYXRoLnNxcnQocmVjdC53aWR0aCAqIHJlY3Qud2lkdGggKyByZWN0LmhlaWdodCAqIHJlY3QuaGVpZ2h0KSAvIHNpemU7Ci0gICAgICAgIHJldHVybiAoaW50KU1hdGgucm91bmQoZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgbmV3U2hlbGwuc2V0VGV4dCgiTW9uaXRvciBEZW5zaXR5Iik7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgICAgIG1CdXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gICAgICAgIG1CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJldHVybiBjb250cm9sOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZURpYWxvZ0NvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsLnNldFRleHQoIlNjcmVlbiBTaXplOiIpOwotCi0gICAgICAgIG1TY3JlZW5TaXplQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGZvciAoZmxvYXQgc2l6ZSA6IE1PTklUT1JfU0laRVMpIHsKLSAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHNpemUpID09IHNpemUpIHsKLSAgICAgICAgICAgICAgICBtU2NyZWVuU2l6ZUNvbWJvLmFkZChTdHJpbmcuZm9ybWF0KCIlLjBmXCIiLCBzaXplKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TY3JlZW5TaXplQ29tYm8uYWRkKFN0cmluZy5mb3JtYXQoIiUuMWZcIiIsIHNpemUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU2NyZWVuU2l6ZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgbVNjcmVlblNpemVJbmRleCA9IG1TY3JlZW5TaXplQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldEVuYWJsZWQobVNjcmVlblNpemVJbmRleCAhPSAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGwuc2V0VGV4dCgiUmVzb2x1dGlvbjoiKTsKLQotICAgICAgICBtTW9uaXRvckNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBtTW9uaXRvcnMgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldE1vbml0b3JzKCk7Ci0gICAgICAgIGZvciAoTW9uaXRvciBtIDogbU1vbml0b3JzKSB7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgciA9IG0uZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBtTW9uaXRvckNvbWJvLmFkZChTdHJpbmcuZm9ybWF0KCIlZCB4ICVkIiwgci53aWR0aCwgci5oZWlnaHQpKTsKLSAgICAgICAgfQotICAgICAgICBtTW9uaXRvckNvbWJvLnNlbGVjdChtTW9uaXRvckluZGV4KTsKLSAgICAgICAgbU1vbml0b3JDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBtTW9uaXRvckluZGV4ID0gbU1vbml0b3JDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3dpZGdldHMvU2RrVGFyZ2V0U2VsZWN0b3IuamF2YSBiL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9TZGtUYXJnZXRTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJlYjI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvd2lkZ2V0cy9TZGtUYXJnZXRTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNka3VpbGliLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSUFuZHJvaWRUYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotCi0vKioKLSAqIFRoZSBTREsgdGFyZ2V0IHNlbGVjdG9yIGlzIGEgdGFibGUgdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAqIDxwLz4KLSAqIFRvIHVzZSwgY3JlYXRlIGl0IHVzaW5nIHtAbGluayAjU2RrVGFyZ2V0U2VsZWN0b3IoQ29tcG9zaXRlLCBJQW5kcm9pZFRhcmdldFtdLCBib29sZWFuKX0gdGhlbgotICogY2FsbCB7QGxpbmsgI3NldFNlbGVjdGlvbihJQW5kcm9pZFRhcmdldCl9LCB7QGxpbmsgI3NldFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyKX0KLSAqIGFuZCBmaW5hbGx5IHVzZSB7QGxpbmsgI2dldFNlbGVjdGVkKCl9IHRvIHJldHJpZXZlIHRoZQotICogc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2RrVGFyZ2V0U2VsZWN0b3IgewotCi0gICAgcHJpdmF0ZSBJQW5kcm9pZFRhcmdldFtdIG1UYXJnZXRzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQWxsb3dTZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBtU2VsZWN0aW9uTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0gICAgcHJpdmF0ZSBMYWJlbCBtRGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbUlubmVyR3JvdXA7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNESyBUYXJnZXQgU2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIHdoZXJlIHRoZSBzZWxlY3RvciB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSB0YXJnZXRzIFRoZSBsaXN0IG9mIHRhcmdldHMuIFRoaXMgaXMgPGVtPm5vdDwvZW0+IGNvcGllZCwgdGhlIGNhbGxlciBtdXN0IG5vdCBtb2RpZnkuCi0gICAgICogICAgICAgICAgICAgICAgVGFyZ2V0cyBjYW4gYmUgbnVsbCBvciBhbiBlbXB0eSBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgdGFibGUgaXMgZGlzYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIFNka1RhcmdldFNlbGVjdG9yKENvbXBvc2l0ZSBwYXJlbnQsIElBbmRyb2lkVGFyZ2V0W10gdGFyZ2V0cykgewotICAgICAgICB0aGlzKHBhcmVudCwgdGFyZ2V0cywgdHJ1ZSAvKmFsbG93U2VsZWN0aW9uKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU0RLIFRhcmdldCBTZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgd2hlcmUgdGhlIHNlbGVjdG9yIHdpbGwgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIHRhcmdldHMgVGhlIGxpc3Qgb2YgdGFyZ2V0cy4gVGhpcyBpcyA8ZW0+bm90PC9lbT4gY29waWVkLCB0aGUgY2FsbGVyIG11c3Qgbm90IG1vZGlmeS4KLSAgICAgKiAgICAgICAgICAgICAgICBUYXJnZXRzIGNhbiBiZSBudWxsIG9yIGFuIGVtcHR5IGFycmF5LCBpbiB3aGljaCBjYXNlIHRoZSB0YWJsZSBpcyBkaXNhYmxlZC4KLSAgICAgKiBAcGFyYW0gYWxsb3dTZWxlY3Rpb24gVHJ1ZSBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2RrVGFyZ2V0U2VsZWN0b3IoQ29tcG9zaXRlIHBhcmVudCwgSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzLCBib29sZWFuIGFsbG93U2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIExheW91dCBoYXMgMSBjb2x1bW4KLSAgICAgICAgbUlubmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtSW5uZXJHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIG1Jbm5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBtSW5uZXJHcm91cC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIG1BbGxvd1NlbGVjdGlvbiA9IGFsbG93U2VsZWN0aW9uOwotICAgICAgICBpbnQgc3R5bGUgPSBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTjsKLSAgICAgICAgaWYgKGFsbG93U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBzdHlsZSB8PSBTV1QuQ0hFQ0s7Ci0gICAgICAgIH0KLSAgICAgICAgbVRhYmxlID0gbmV3IFRhYmxlKG1Jbm5lckdyb3VwLCBzdHlsZSk7Ci0gICAgICAgIG1UYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgbVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgbURlc2NyaXB0aW9uID0gbmV3IExhYmVsKG1Jbm5lckdyb3VwLCBTV1QuV1JBUCk7Ci0gICAgICAgIG1EZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHRhYmxlIGNvbHVtbnMKLSAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbihtVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgY29sdW1uMC5zZXRUZXh0KCJUYXJnZXQgTmFtZSIpOwotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZSwgU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4xLnNldFRleHQoIlZlbmRvciIpOwotICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZSwgU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4yLnNldFRleHQoIlBsYXRmb3JtIik7Ci0gICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbjMuc2V0VGV4dCgiQVBJIExldmVsIik7Ci0KLSAgICAgICAgYWRqdXN0Q29sdW1uc1dpZHRoKG1UYWJsZSwgY29sdW1uMCwgY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMyk7Ci0gICAgICAgIHNldHVwU2VsZWN0aW9uTGlzdGVuZXIobVRhYmxlKTsKLSAgICAgICAgc2V0VGFyZ2V0cyh0YXJnZXRzKTsKLSAgICAgICAgc2V0dXBUb29sdGlwKG1UYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgb2YgdGhlIGlubmVyIGNvbXBvc2l0ZSB3aWRnZXQgdGhhdCBjb250YWlucyB0aGUgdGFyZ2V0IHNlbGVjdG9yLgotICAgICAqIEJ5IGRlZmF1bHQgdGhlIGxheW91dCBkYXRhIGlzIHNldCB0byBhIHtAbGluayBHcmlkRGF0YX0gd2l0aCBhIHtAbGluayBHcmlkRGF0YSNGSUxMX0JPVEh9Ci0gICAgICogbW9kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUge0BsaW5rIEdyaWREYXRhI2hvcml6b250YWxTcGFufSBmb3IgZXhhbXBsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtSW5uZXJHcm91cC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBrbm93biB0YXJnZXRzLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIG5vdCBhIGNvcHkuIENhbGxlcnMgbXVzdCA8ZW0+bm90PC9lbT4gbW9kaWZ5IHRoaXMgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIElBbmRyb2lkVGFyZ2V0W10gZ2V0VGFyZ2V0cygpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIHRhcmdldHMgb2YgdGhlIFNESyBUYXJnZXQgU2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0cyBUaGUgbGlzdCBvZiB0YXJnZXRzLiBUaGlzIGlzIDxlbT5ub3Q8L2VtPiBjb3BpZWQsIHRoZSBjYWxsZXIgbXVzdCBub3QgbW9kaWZ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldHMoSUFuZHJvaWRUYXJnZXRbXSB0YXJnZXRzKSB7Ci0gICAgICAgIG1UYXJnZXRzID0gdGFyZ2V0czsKLSAgICAgICAgZmlsbFRhYmxlKG1UYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIHNlbGVjdGlvbiBsaXN0ZW5lci4gU2V0IGl0IHRvIG51bGwgdG8gcmVtb3ZlIGl0LgotICAgICAqIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCA8ZW0+YWZ0ZXI8L2VtPiB0aGlzIHRhYmxlIHByb2Nlc3NlZCBpdHMgc2VsZWN0aW9uCi0gICAgICogZXZlbnRzIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gc2VlIHRoZSB1cGRhdGVkIHN0YXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgZXZlbnQncyBpdGVtIGNvbnRhaW5zIGEge0BsaW5rIFRhYmxlSXRlbX0uCi0gICAgICogVGhlIHtAbGluayBUYWJsZUl0ZW0jZ2V0RGF0YSgpfSBjb250YWlucyBhbiB7QGxpbmsgSUFuZHJvaWRUYXJnZXR9LgotICAgICAqIDxwLz4KLSAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBjYWxsZXIgdXNlcyB0aGUge0BsaW5rICNnZXRTZWxlY3RlZCgpfSBtZXRob2QgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb25MaXN0ZW5lciBUaGUgbmV3IGxpc3RlbmVyIG9yIG51bGwgdG8gcmVtb3ZlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0gICAgICAgIG1TZWxlY3Rpb25MaXN0ZW5lciA9IHNlbGVjdGlvbkxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdGFyZ2V0IHNlbGVjdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIHNlbGVjdGlvbiBpcyBhY3R1YWxseSBjaGFuZ2VkLCB0aGlzIHdpbGwgaW52b2tlIHRoZSBzZWxlY3Rpb24gbGlzdGVuZXIKLSAgICAgKiAoaWYgYW55KSB3aXRoIGEgbnVsbCBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCB0byBiZSBzZWxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBjb3VsZCBiZSBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFNlbGVjdGlvbihJQW5kcm9pZFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKCFtQWxsb3dTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtVGFibGUgIT0gbnVsbCAmJiAhbVRhYmxlLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgZm9yIChUYWJsZUl0ZW0gaSA6IG1UYWJsZS5nZXRJdGVtcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChJQW5kcm9pZFRhcmdldCkgaS5nZXREYXRhKCkgPT0gdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGkuc2V0Q2hlY2tlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGlmaWVkICYmIG1TZWxlY3Rpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIGl0ZW0gb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFuZHJvaWRUYXJnZXQgZ2V0U2VsZWN0ZWQoKSB7Ci0gICAgICAgIGlmIChtVGFibGUgPT0gbnVsbCB8fCBtVGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVGFibGVJdGVtIGkgOiBtVGFibGUuZ2V0SXRlbXMoKSkgewotICAgICAgICAgICAgaWYgKGkuZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJQW5kcm9pZFRhcmdldCkgaS5nZXREYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIGFkanVzdCB0aGUgY29sdW1ucyB3aWR0aCB3aGVuIHRoZSBwYXJlbnQgaXMgcmVzaXplZC4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgd2UgbmVlZCBzb21ldGhpbmcgbW9yZSBmYW5jeSwgd2UgbWlnaHQgd2FudCB0byB1c2UgdGhpczoKLSAgICAgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhP3ZpZXc9Y28KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRqdXN0Q29sdW1uc1dpZHRoKGZpbmFsIFRhYmxlIHRhYmxlLAotICAgICAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMCwKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsCi0gICAgICAgICAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yLAotICAgICAgICAgICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMykgewotICAgICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byByZXNpemUgdGhlIGNvbHVtbiB0byB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgdGFibGUKLSAgICAgICAgdGFibGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgciA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBjb2x1bW4wLnNldFdpZHRoKHIud2lkdGggKiAzMCAvIDEwMCk7IC8vIDMwJQotICAgICAgICAgICAgICAgIGNvbHVtbjEuc2V0V2lkdGgoci53aWR0aCAqIDQ1IC8gMTAwKTsgLy8gNDUlCi0gICAgICAgICAgICAgICAgY29sdW1uMi5zZXRXaWR0aChyLndpZHRoICogMTUgLyAxMDApOyAvLyAxNSUKLSAgICAgICAgICAgICAgICBjb2x1bW4zLnNldFdpZHRoKHIud2lkdGggKiAxMCAvIDEwMCk7IC8vIDEwJQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdGhhdCB3aWxsIGNoZWNrIG9yIHVuY2hlY2sgdGhlIHdob2xlIGxpbmUgd2hlbgotICAgICAqIGRvdWJsZS1jbGlja2VkIChha2EgInRoZSBkZWZhdWx0IHNlbGVjdGlvbiIpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cFNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0gICAgICAgIGlmICghbUFsbG93U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdGhhdCB3aWxsIGNoZWNrL3VuY2hlY2sgaXRlbXMgd2hlbiB0aGV5IGFyZSBkb3VibGUtY2xpY2tlZAotICAgICAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAvKiogRGVmYXVsdCBzZWxlY3Rpb24gbWVhbnMgZG91YmxlLWNsaWNrIG9uICJtb3N0IiBwbGF0Zm9ybXMgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgaS5zZXRDaGVja2VkKCFpLmdldENoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZm9yY2VTaW5nbGVTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZURlc2NyaXB0aW9uKGkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGkgPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0gICAgICAgICAgICAgICAgICAgIGVuZm9yY2VTaW5nbGVTZWxlY3Rpb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZURlc2NyaXB0aW9uKGkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIElmIHdlJ3JlIG5vdCBpbiBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSwgdW5jaGVjayBhbGwgb3RoZXIKLSAgICAgICAgICAgICAqIGl0ZW1zIHdoZW4gdGhpcyBvbmUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlU2luZ2xlU2VsZWN0aW9uKFRhYmxlSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlIHBhcmVudFRhYmxlID0gaXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChUYWJsZUl0ZW0gaTIgOiBwYXJlbnRUYWJsZS5nZXRJdGVtcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTIgIT0gaXRlbSAmJiBpMi5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMi5zZXRDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgdGFibGUgd2l0aCBhbGwgU0RLIHRhcmdldHMuCi0gICAgICogVGhlIHRhYmxlIGNvbHVtbnMgYXJlOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+Y29sdW1uIDA6IHNkayBuYW1lCi0gICAgICogPGxpPmNvbHVtbiAxOiBzZGsgdmVuZG9yCi0gICAgICogPGxpPmNvbHVtbiAyOiBzZGsgYXBpIG5hbWUKLSAgICAgKiA8bGk+Y29sdW1uIDM6IHNkayB2ZXJzaW9uCi0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbFRhYmxlKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0KLSAgICAgICAgaWYgKHRhYmxlID09IG51bGwgfHwgdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLQotICAgICAgICBpZiAobVRhcmdldHMgIT0gbnVsbCAmJiBtVGFyZ2V0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgZm9yIChJQW5kcm9pZFRhcmdldCB0YXJnZXQgOiBtVGFyZ2V0cykgewotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YSh0YXJnZXQpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgwLCB0YXJnZXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgdGFyZ2V0LmdldFZlbmRvcigpKTsKLSAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQoMiwgdGFyZ2V0LmdldFZlcnNpb25OYW1lKCkpOwotICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCB0YXJnZXQuZ2V0VmVyc2lvbigpLmdldEFwaVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRhYmxlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBpdGVtLnNldERhdGEobnVsbCk7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMCwgIi0tIik7Ci0gICAgICAgICAgICBpdGVtLnNldFRleHQoMSwgIk5vIHRhcmdldCBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgyLCAiLS0iKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCgzLCAiLS0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgYSB0b29sdGlwIHRoYXQgZGlzcGxheXMgdGhlIGN1cnJlbnQgaXRlbSBkZXNjcmlwdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogRGlzcGxheWluZyBhIHRvb2x0aXAgb3ZlciB0aGUgdGFibGUgbG9va3Mga2luZCBvZiBvZGQgaGVyZS4gSW5zdGVhZCB3ZSBhY3R1YWxseQotICAgICAqIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIGluIGEgbGFiZWwgdW5kZXIgdGhlIHRhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cFRvb2x0aXAoZmluYWwgVGFibGUgdGFibGUpIHsKLQotICAgICAgICBpZiAodGFibGUgPT0gbnVsbCB8fCB0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlZmVyZW5jZToKLSAgICAgICAgICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmE/dmlldz1tYXJrdXAKLSAgICAgICAgICovCi0KLSAgICAgICAgZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCi0gICAgICAgICAgICAgICAgc3dpdGNoKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5LZXlEb3duOgotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlRXhpdDoKLSAgICAgICAgICAgICAgICBjYXNlIFNXVC5Nb3VzZURvd246Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1dULk1vdXNlSG92ZXI6Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZURlc2NyaXB0aW9uKHRhYmxlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTV1QuU2VsZWN0aW9uOgotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVzY3JpcHRpb24oKFRhYmxlSXRlbSkgZXZlbnQuaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGFibGUuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLSAgICAgICAgdGFibGUuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGxpc3RlbmVyKTsKLSAgICAgICAgdGFibGUuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotICAgICAgICB0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VIb3ZlciwgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGxhYmVsIHdpdGggdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtJ3MgYW5kcm9pZCB0YXJnZXQsIGlmIGFueS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oVGFibGVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSUFuZHJvaWRUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VG9vbHRpcCA9ICgoSUFuZHJvaWRUYXJnZXQpIGRhdGEpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uLnNldFRleHQobmV3VG9vbHRpcCA9PSBudWxsID8gIiIgOiBuZXdUb29sdGlwKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBjb250cm9scy4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAobUlubmVyR3JvdXAgIT0gbnVsbCAmJiBtVGFibGUgIT0gbnVsbCAmJiAhbVRhYmxlLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgZW5hYmxlQ29udHJvbChtSW5uZXJHcm91cCwgZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRW5hYmxlcyBvciBkaXNhYmxlcyBjb250cm9sczsgcmVjdXJzaXZlIGZvciBjb21wb3NpdGUgY29udHJvbHMuICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2woQ29udHJvbCBjLCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgYy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgZm9yIChDb250cm9sIGMyIDogKChDb21wb3NpdGUpIGMpLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGVuYWJsZUNvbnRyb2woYzIsIGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL3JlcG9zaXRvcnkvVXBkYXRlcldpbmRvdy5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi9yZXBvc2l0b3J5L1VwZGF0ZXJXaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2I1NjA2Ny4uMDAwMDAwMAotLS0gYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvc3JjL2NvbS9hbmRyb2lkL3Nka3VpbGliL3JlcG9zaXRvcnkvVXBkYXRlcldpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuSVNka0xvZzsNCi1pbXBvcnQgY29tLmFuZHJvaWQuc2RrdWlsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5VcGRhdGVyV2luZG93SW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCi0NCi0vKioNCi0gKiBPcGVucyBhbiBTREsgVXBkYXRlciBXaW5kb3cuDQotICoNCi0gKiBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciB1c2luZyB0aGUgd2luZG93Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVcGRhdGVyV2luZG93IHsNCi0NCi0gICAgcHJpdmF0ZSBVcGRhdGVyV2luZG93SW1wbCBtV2luZG93Ow0KLQ0KLSAgICAvKioNCi0gICAgICogSW50ZXJmYWNlIGZvciBsaXN0ZW5lcnMgb24gU0RLIG1vZGlmaWNhdGlvbnMgKGllIG5ldyBpbnN0YWxsZWQgY29tcG9tZW50cywgb3IgZGVsZXRlZA0KLSAgICAgKiBjb21wb25lbnRzKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGludGVyZmFjZSBJU2RrTGlzdGVuZXIgew0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBTZW50IHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIFNESyBjaGFuZ2VkDQotICAgICAgICAgKi8NCi0gICAgICAgIHZvaWQgb25TZGtDaGFuZ2UoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3aW5kb3cuIENhbGxlciBtdXN0IGNhbGwgb3BlbigpLCB3aGljaCB3aWxsIGJsb2NrLg0KLSAgICAgKiBAcGFyYW0gc2RrTG9nDQotICAgICAqIEBwYXJhbSBvc1Nka1Jvb3QgVGhlIE9TIHBhdGggdG8gdGhlIFNESyByb290Lg0KLSAgICAgKiBAcGFyYW0gdXNlckNhbkNoYW5nZVNka1Jvb3QgSWYgdHJ1ZSwgdGhlIHdpbmRvdyBsZXRzIHRoZSB1c2VyIGNoYW5nZSB0aGUgU0RLIHBhdGgNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGJyb3dzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgVXBkYXRlcldpbmRvdyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNka0xvZyBzZGtMb2csIFN0cmluZyBvc1Nka1Jvb3QsDQotICAgICAgICAgICAgYm9vbGVhbiB1c2VyQ2FuQ2hhbmdlU2RrUm9vdCkgew0KLSAgICAgICAgbVdpbmRvdyA9IG5ldyBVcGRhdGVyV2luZG93SW1wbChwYXJlbnRTaGVsbCwgc2RrTG9nLCBvc1Nka1Jvb3QsIHVzZXJDYW5DaGFuZ2VTZGtSb290KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVnaXN0ZXJzIGFuIGV4dHJhIHBhZ2UgZm9yIHRoZSB1cGRhdGVyIHdpbmRvdy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBQYWdlcyBtdXN0IGRlcml2ZSBmcm9tIHtAbGluayBDb21wb3NpdGV9IGFuZCBpbXBsZW1lbnQgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzDQotICAgICAqIGEgc2luZ2xlIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSBhcmd1bWVudC4NCi0gICAgICogPHAvPg0KLSAgICAgKiBBbGwgcGFnZXMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2FsbCB0byB7QGxpbmsgI29wZW4oKX0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UuDQotICAgICAqIEBwYXJhbSBwYWdlQ2xhc3MgVGhlIHtAbGluayBDb21wb3NpdGV9LWRlcml2ZWQgY2xhc3MgdGhhdCB3aWxsIGltcGxlbWVudCB0aGUgcGFnZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGFnZShTdHJpbmcgdGl0bGUsIENsYXNzPD8gZXh0ZW5kcyBDb21wb3NpdGU+IHBhZ2VDbGFzcykgew0KLSAgICAgICAgbVdpbmRvdy5yZWdpc3RlckV4dHJhUGFnZSh0aXRsZSwgcGFnZUNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGUgdGhlIGluaXRpYWwgcGFnZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIHRoZSB3aW5kb3cgb3BlbnMuDQotICAgICAqIDxwLz4NCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGwgdG8ge0BsaW5rICNvcGVuKCl9Lg0KLSAgICAgKiBJZiBudWxsIG9yIGlmIHRoZSBwYWdlIGNsYXNzIGlzIG5vdCBmb3VuZCwgdGhlIGZpcnN0IHBhZ2Ugd2lsbCBiZSBzZWxlY3RlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQYWdlKENsYXNzPD8gZXh0ZW5kcyBDb21wb3NpdGU+IHBhZ2VDbGFzcykgew0KLSAgICAgICAgbVdpbmRvdy5zZXRJbml0aWFsUGFnZShwYWdlQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGF1dG8tdXBkYXRlIHdpemFyZCB3aWxsIGJlIHNob3duIHdoZW4gb3BlbmluZyB0aGUgd2luZG93Lg0KLSAgICAgKiA8cC8+DQotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHtAbGluayAjb3BlbigpfS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RBdXRvVXBkYXRlKGJvb2xlYW4gcmVxdWVzdEF1dG9VcGRhdGUpIHsNCi0gICAgICAgIG1XaW5kb3cuc2V0UmVxdWVzdEF1dG9VcGRhdGUocmVxdWVzdEF1dG9VcGRhdGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgbmV3IGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgY29udGVudCBvZiB0aGUgU0RLLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKElTZGtMaXN0ZW5lciBsaXN0ZW5lcikgew0KLSAgICAgICAgbVdpbmRvdy5hZGRMaXN0ZW5lcnMobGlzdGVuZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZW1vdmVzIGEgbmV3IGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGFueW1vcmUgd2hlbiBhIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBjb250ZW50IG9mDQotICAgICAqIHRoZSBTREsuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU2RrTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0gICAgICAgIG1XaW5kb3cucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBPcGVucyB0aGUgd2luZG93Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgb3BlbigpIHsNCi0gICAgICAgIG1XaW5kb3cub3BlbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka21hbmFnZXIvbGlicy9zZGt1aWxpYi9zcmMvY29tL2FuZHJvaWQvc2RrdWlsaWIvdWkvR3JpZERpYWxvZy5qYXZhIGIvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi91aS9HcmlkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjlmZDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3NyYy9jb20vYW5kcm9pZC9zZGt1aWxpYi91aS9HcmlkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIGpmYWNlLWJhc2VkIGRpYWxvZyB0aGF0IHByb3Blcmx5IHNldHMgdXAgYSB7QGxpbmsgR3JpZExheW91dH0gdG9wIGNvbXBvc2l0ZSB3aXRoIHRoZSBwcm9wZXIKLSAqIG1hcmdpbi4KLSAqCi0gKiBJbXBsZW1lbnRpbmcgZGlhbG9nIG11c3QgY3JlYXRlIHRoZSBjb250ZW50IG9mIHRoZSBkaWFsb2cgaW4KLSAqIHtAbGluayAjY3JlYXRlRGlhbG9nQ29udGVudChDb21wb3NpdGUpfS4KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmlkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OdW1Db2x1bW5zOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTWFrZUNvbHVtbnNFcXVhbFdpZHRoOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGlhbG9nCi0gICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQge0BsaW5rIFNoZWxsfS4KLSAgICAgKiBAcGFyYW0gbnVtQ29sdW1ucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQKLSAgICAgKiBAcGFyYW0gbWFrZUNvbHVtbnNFcXVhbFdpZHRoIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW5zIHdpbGwgaGF2ZSBlcXVhbCB3aWR0aAotICAgICAqLwotICAgIHB1YmxpYyBHcmlkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBpbnQgbnVtQ29sdW1ucywgYm9vbGVhbiBtYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgICBtTnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgIG1NYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBtYWtlQ29sdW1uc0VxdWFsV2lkdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudCBvZiB0aGUgZGlhbG9nLiBUaGUgPHZhcj5wYXJlbnQ8L3Zhcj4gY29tcG9zaXRlIGlzIGEge0BsaW5rIEdyaWRMYXlvdXR9Ci0gICAgICogY3JlYXRlZCB3aXRoIHRoZSA8dmFyPm51bUNvbHVtbjwvdmFyPiBhbmQgPHZhcj5tYWtlQ29sdW1uc0VxdWFsV2lkdGg8L3Zhcj4gcGFyYW1ldGVycwotICAgICAqIHBhc3NlZCB0byB7QGxpbmsgI0dyaWREaWFsb2coU2hlbGwsIGludCwgYm9vbGVhbil9LgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlRGlhbG9nQ29udGVudChDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChtTnVtQ29sdW1ucywgbU1ha2VDb2x1bW5zRXF1YWxXaWR0aCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygKLSAgICAgICAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIGNyZWF0ZURpYWxvZ0NvbnRlbnQodG9wKTsKLQotICAgICAgICBhcHBseURpYWxvZ0ZvbnQodG9wKTsKLSAgICAgICAgcmV0dXJuIHRvcDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9VcGRhdGVyTG9naWNUZXN0LmphdmEgYi90b29scy9zZGttYW5hZ2VyL2xpYnMvc2RrdWlsaWIvdGVzdHMvY29tL2FuZHJvaWQvc2RrdWlsaWIvaW50ZXJuYWwvcmVwb3NpdG9yeS9VcGRhdGVyTG9naWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlMjJiMzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2RrbWFuYWdlci9saWJzL3Nka3VpbGliL3Rlc3RzL2NvbS9hbmRyb2lkL3Nka3VpbGliL2ludGVybmFsL3JlcG9zaXRvcnkvVXBkYXRlckxvZ2ljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBjb20uYW5kcm9pZC5zZGt1aWxpYi5pbnRlcm5hbC5yZXBvc2l0b3J5Ow0KLQ0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5BcmNoaXZlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5Nb2NrQWRkb25QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5Nb2NrUGxhdGZvcm1QYWNrYWdlOw0KLWltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuaW50ZXJuYWwucmVwb3NpdG9yeS5Nb2NrVG9vbFBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlBhY2thZ2U7DQotaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5yZXBvc2l0b3J5LlJlcG9Tb3VyY2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVXBkYXRlckxvZ2ljVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1VwZGF0ZXJMb2dpYyBleHRlbmRzIFVwZGF0ZXJMb2dpYyB7DQotICAgICAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VbXSBtUmVtb3RlUGFja2FnZXM7DQotDQotICAgICAgICBwdWJsaWMgTW9ja1VwZGF0ZXJMb2dpYyhQYWNrYWdlW10gcmVtb3RlUGFja2FnZXMpIHsNCi0gICAgICAgICAgICBtUmVtb3RlUGFja2FnZXMgPSByZW1vdGVQYWNrYWdlczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmV0Y2hSZW1vdGVQYWNrYWdlcyhBcnJheUxpc3Q8UGFja2FnZT4gcmVtb3RlUGtncywNCi0gICAgICAgICAgICAgICAgUmVwb1NvdXJjZVtdIHJlbW90ZVNvdXJjZXMpIHsNCi0gICAgICAgICAgICAvLyBJZ25vcmUgcmVtb3RlU291cmNlcyBhbmQgaW5zdGVhZCB1c2VzIHRoZSByZW1vdGVQYWNrYWdlcyBsaXN0IGdpdmVuIHRvIHRoZQ0KLSAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yLg0KLSAgICAgICAgICAgIGlmIChtUmVtb3RlUGFja2FnZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZW1vdGVQa2dzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1SZW1vdGVQYWNrYWdlcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEFkZG9uRGVwZW5kZW5jeSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgTW9ja1VwZGF0ZXJMb2dpYyBtdWwgPSBuZXcgTW9ja1VwZGF0ZXJMb2dpYyhudWxsKTsNCi0NCi0gICAgICAgIE1vY2tQbGF0Zm9ybVBhY2thZ2UgcDEgPSBuZXcgTW9ja1BsYXRmb3JtUGFja2FnZSgxLCAxKTsNCi0gICAgICAgIE1vY2tQbGF0Zm9ybVBhY2thZ2UgcDIgPSBuZXcgTW9ja1BsYXRmb3JtUGFja2FnZSgyLCAxKTsNCi0NCi0gICAgICAgIE1vY2tBZGRvblBhY2thZ2UgYTEgPSBuZXcgTW9ja0FkZG9uUGFja2FnZShwMSwgMSk7DQotICAgICAgICBNb2NrQWRkb25QYWNrYWdlIGEyID0gbmV3IE1vY2tBZGRvblBhY2thZ2UocDIsIDIpOw0KLQ0KLSAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmVJbmZvPiBvdXQgPSBuZXcgQXJyYXlMaXN0PEFyY2hpdmVJbmZvPigpOw0KLSAgICAgICAgQXJyYXlMaXN0PEFyY2hpdmU+IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlPigpOw0KLSAgICAgICAgQXJyYXlMaXN0PFBhY2thZ2U+IHJlbW90ZSA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZT4oKTsNCi0NCi0gICAgICAgIC8vIGEyIGRlcGVuZHMgb24gcDIsIHdoaWNoIGlzIG5vdCBpbiB0aGUgbG9jYWxzDQotICAgICAgICBQYWNrYWdlW10gbG9jYWxzID0geyBwMSwgYTEgfTsNCi0gICAgICAgIFJlcG9Tb3VyY2VbXSBzb3VyY2VzID0gbnVsbDsNCi0gICAgICAgIGFzc2VydE51bGwobXVsLmZpbmRQbGF0Zm9ybURlcGVuZGVuY3koYTIsIG91dCwgc2VsZWN0ZWQsIHJlbW90ZSwgc291cmNlcywgbG9jYWxzKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgb3V0LnNpemUoKSk7DQotDQotICAgICAgICAvLyBwMiBpcyBub3cgc2VsZWN0ZWQsIGFuZCBzaG91bGQgYmUgc2NoZWR1bGVkIGZvciBpbnN0YWxsIGluIG91dA0KLSAgICAgICAgQXJjaGl2ZSBwMl9hcmNoaXZlID0gcDIuZ2V0QXJjaGl2ZXMoKVswXTsNCi0gICAgICAgIHNlbGVjdGVkLmFkZChwMl9hcmNoaXZlKTsNCi0gICAgICAgIEFyY2hpdmVJbmZvIGFpMiA9IG11bC5maW5kUGxhdGZvcm1EZXBlbmRlbmN5KGEyLCBvdXQsIHNlbGVjdGVkLCByZW1vdGUsIHNvdXJjZXMsIGxvY2Fscyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGFpMik7DQotICAgICAgICBhc3NlcnRTYW1lKHAyX2FyY2hpdmUsIGFpMi5nZXROZXdBcmNoaXZlKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG91dC5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShwMl9hcmNoaXZlLCBvdXQuZ2V0KDApLmdldE5ld0FyY2hpdmUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRQbGF0Zm9ybURlcGVuZGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1vY2tVcGRhdGVyTG9naWMgbXVsID0gbmV3IE1vY2tVcGRhdGVyTG9naWMobnVsbCk7DQotDQotICAgICAgICBNb2NrVG9vbFBhY2thZ2UgdDEgPSBuZXcgTW9ja1Rvb2xQYWNrYWdlKDEpOw0KLSAgICAgICAgTW9ja1Rvb2xQYWNrYWdlIHQyID0gbmV3IE1vY2tUb29sUGFja2FnZSgyKTsNCi0NCi0gICAgICAgIE1vY2tQbGF0Zm9ybVBhY2thZ2UgcDIgPSBuZXcgTW9ja1BsYXRmb3JtUGFja2FnZSgyLCAxLCAyKTsNCi0NCi0gICAgICAgIEFycmF5TGlzdDxBcmNoaXZlSW5mbz4gb3V0ID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlSW5mbz4oKTsNCi0gICAgICAgIEFycmF5TGlzdDxBcmNoaXZlPiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8QXJjaGl2ZT4oKTsNCi0gICAgICAgIEFycmF5TGlzdDxQYWNrYWdlPiByZW1vdGUgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2U+KCk7DQotDQotICAgICAgICAvLyBwMiBkZXBlbmRzIG9uIHQyLCB3aGljaCBpcyBub3QgbG9jYWxseSBpbnN0YWxsZWQNCi0gICAgICAgIFBhY2thZ2VbXSBsb2NhbHMgPSB7IHQxIH07DQotICAgICAgICBSZXBvU291cmNlW10gc291cmNlcyA9IG51bGw7DQotICAgICAgICBhc3NlcnROdWxsKG11bC5maW5kVG9vbHNEZXBlbmRlbmN5KHAyLCBvdXQsIHNlbGVjdGVkLCByZW1vdGUsIHNvdXJjZXMsIGxvY2FscykpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG91dC5zaXplKCkpOw0KLQ0KLSAgICAgICAgLy8gdDIgaXMgbm93IHNlbGVjdGVkIGFuZCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kNCi0gICAgICAgIEFyY2hpdmUgdDJfYXJjaGl2ZSA9IHQyLmdldEFyY2hpdmVzKClbMF07DQotICAgICAgICBzZWxlY3RlZC5hZGQodDJfYXJjaGl2ZSk7DQotICAgICAgICBBcmNoaXZlSW5mbyBhaTIgPSBtdWwuZmluZFRvb2xzRGVwZW5kZW5jeShwMiwgb3V0LCBzZWxlY3RlZCwgcmVtb3RlLCBzb3VyY2VzLCBsb2NhbHMpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhaTIpOw0KLSAgICAgICAgYXNzZXJ0U2FtZSh0Ml9hcmNoaXZlLCBhaTIuZ2V0TmV3QXJjaGl2ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvdXQuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUodDJfYXJjaGl2ZSwgb3V0LmdldCgwKS5nZXROZXdBcmNoaXZlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka3N0YXRzLy5jbGFzc3BhdGggYi90b29scy9zZGtzdGF0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2IxYWY1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5VU0VSX0xJQlJBUlkvQU5EUk9JRF9TV1QiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvQW5kcm9pZFByZWZzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka3N0YXRzLy5naXRpZ25vcmUgYi90b29scy9zZGtzdGF0cy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk5NTA1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotCmRpZmYgLS1naXQgYS90b29scy9zZGtzdGF0cy8ucHJvamVjdCBiL3Rvb2xzL3Nka3N0YXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJmYTg3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+U2RrU3RhdHNTZXJ2aWNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka3N0YXRzL0FuZHJvaWQubWsgYi90b29scy9zZGtzdGF0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNhYmRjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotU0RLU1RBVFNfTE9DQUxfRElSIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoU0RLU1RBVFNfTE9DQUxfRElSKS9zcmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvc2Rrc3RhdHMvUkVBRE1FIGIvdG9vbHMvc2Rrc3RhdHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQwODgwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUhvdyB0byB1c2UgdGhlIEVjbGlwc2UgcHJvamVjdHMgZm9yIFNka1N0YXRzLgotCi1TZGtTdGF0cyByZXF1aXJlcyBTV1QgdG8gY29tcGlsZS4KLQotU1dUIGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVwb3QgdW5kZXIgLy9kZXZpY2UvcHJlYnVpbGQvPHBsYXRmb3JtPi9zd3QKLQotQmVjYXVzZSB0aGUgYnVpbGQgcGF0aCBjYW5ub3QgY29udGFpbiByZWxhdGl2ZSBwYXRoIHRoYXQgYXJlIG5vdCBpbnNpZGUgdGhlIHByb2plY3QgZGlyZWN0b3J5LAotdGhlIC5jbGFzc3BhdGggZmlsZSByZWZlcmVuY2VzIGEgdXNlciBsaWJyYXJ5IGNhbGxlZCBBTkRST0lEX1NXVC4KLQotSW4gb3JkZXIgdG8gY29tcGlsZSB0aGUgcHJvamVjdCwgbWFrZSBhIHVzZXIgbGlicmFyeSBjYWxsZWQgQU5EUk9JRF9TV1QgY29udGFpbmluZyB0aGUgamFyCi1hdmFpbGFibGUgYXQgLy9kZXZpY2UvcHJlYnVpbGQvPHBsYXRmb3JtPi9zd3QuCmRpZmYgLS1naXQgYS90b29scy9zZGtzdGF0cy9zcmMvQW5kcm9pZC5tayBiL3Rvb2xzL3Nka3N0YXRzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVlNjdhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Nka3N0YXRzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCi0JYW5kcm9pZHByZWZzIFwKLQlzd3QgXAotCW9yZy5lY2xpcHNlLmpmYWNlXzMuNC4yLk0yMDA5MDEwNy0wODAwIFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbl8zLjQuMC52MjAwODA0MjEtMjAwNiBcCi0Jb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kc18zLjQuMC5JMjAwODA1MDktMjAwMAotTE9DQUxfTU9EVUxFIDo9IHNka3N0YXRzCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nka3N0YXRzL3NyYy9jb20vYW5kcm9pZC9zZGtzdGF0cy9TZGtTdGF0c1NlcnZpY2UuamF2YSBiL3Rvb2xzL3Nka3N0YXRzL3NyYy9jb20vYW5kcm9pZC9zZGtzdGF0cy9TZGtTdGF0c1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZmM5NC4uMDAwMDAwMAotLS0gYS90b29scy9zZGtzdGF0cy9zcmMvY29tL2FuZHJvaWQvc2Rrc3RhdHMvU2RrU3RhdHNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2Rrc3RhdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5wcmVmcy5BbmRyb2lkTG9jYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQucHJlZnMuQW5kcm9pZExvY2F0aW9uLkFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqIFV0aWxpdHkgY2xhc3MgdG8gc2VuZCAicGluZyIgdXNhZ2UgcmVwb3J0cyB0byB0aGUgc2VydmVyLiAqLwotcHVibGljIGNsYXNzIFNka1N0YXRzU2VydmljZSB7Ci0KLSAgICAvKiogTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHBpbmcsIGluIG1pbGxpc2Vjb25kcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBJTkdfSU5URVJWQUxfTVNFQyA9IDg2NDAwICogMTAwMDsgIC8vIDEgZGF5Ci0KLSAgICAvKiBUZXh0IHN0cmluZ3MgZGlzcGxheWVkIGluIHRoZSBvcHQtb3V0IGRpYWxvZy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX1RJVExFX1RFWFQgPQotICAgICAgICAiQW5kcm9pZCBTREsiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9URVhUID0KLSAgICAgICAgIlRoYW5rcyBmb3IgdXNpbmcgdGhlIEFuZHJvaWQgU0RLISI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUNFX1RFWFQgPQotICAgICAgICAiV2Uga25vdyB5b3UganVzdCB3YW50IHRvIGdldCBzdGFydGVkIGJ1dCBwbGVhc2UgcmVhZCB0aGlzIGZpcnN0LiI7Ci0KLSAgICAvKiogVXNlZCBpbiB0aGUgcHJlZmVyZW5jZSBwYW5lIChQcmVmc0RpYWxvZykgYXMgd2VsbC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX1RFWFQgPQotICAgICAgICAiQnkgY2hvb3NpbmcgdG8gc2VuZCBjZXJ0YWluIHVzYWdlIHN0YXRpc3RpY3MgdG8gR29vZ2xlLCB5b3UgY2FuICIgKwotICAgICAgICAiaGVscCB1cyBpbXByb3ZlIHRoZSBBbmRyb2lkIFNESy4gIFRoZXNlIHVzYWdlIHN0YXRpc3RpY3MgbGV0IHVzICIgKwotICAgICAgICAibWVhc3VyZSB0aGluZ3MgbGlrZSBhY3RpdmUgdXNhZ2Ugb2YgdGhlIFNESyBhbmQgbGV0IHVzIGtub3cgdGhpbmdzICIgKwotICAgICAgICAibGlrZSB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgU0RLIGFyZSBpbiB1c2UgYW5kIHdoaWNoIHRvb2xzIGFyZSB0aGUgIiArCi0gICAgICAgICJtb3N0IHBvcHVsYXIgd2l0aCBkZXZlbG9wZXJzLiAgVGhpcyBsaW1pdGVkIGRhdGEgaXMgbm90IGFzc29jaWF0ZWQgIiArCi0gICAgICAgICJ3aXRoIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFib3V0IHlvdSwgaXMgZXhhbWluZWQgb24gYW4gYWdncmVnYXRlICIgKwotICAgICAgICAiYmFzaXMsIGFuZCBpcyBtYWludGFpbmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgIiArCi0gICAgICAgICI8YSBocmVmPVwiaHR0cDovL3d3dy5nb29nbGUuY29tL2ludGwvZW4vcHJpdmFjeS5odG1sXCI+R29vZ2xlICIgKwotICAgICAgICAiUHJpdmFjeSBQb2xpY3k8L2E+LiI7Ci0KLSAgICAvKiogVXNlZCBpbiB0aGUgcHJlZmVyZW5jZSBwYW5lIChQcmVmc0RpYWxvZykgYXMgd2VsbC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0JPWF9URVhUID0KLSAgICAgICAgIlNlbmQgdXNhZ2Ugc3RhdGlzdGljcyB0byBHb29nbGUuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT09URVJfVEVYVCA9Ci0gICAgICAgICJJZiB5b3UgbGF0ZXIgZGVjaWRlIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcsIHlvdSBjYW4gZG8gc28gaW4gdGhlICIgKwotICAgICAgICAiXCJkZG1zXCIgdG9vbCB1bmRlciBcIkZpbGVcIiA+IFwiUHJlZmVyZW5jZXNcIiA+IFwiVXNhZ2UgU3RhdHNcIi4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVVFRPTl9URVhUID0KLSAgICAgICAgIiAgIFByb2NlZWQgICAiOwotCi0gICAgLyoqIExpc3Qgb2YgTGludXggYnJvd3NlciBjb21tYW5kcyB0byB0cnksIGluIG9yZGVyIChzZWUgb3BlblVybCkuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElOVVhfQlJPV1NFUlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiZmlyZWZveCAtcmVtb3RlIG9wZW51cmwoJVVSTCUsbmV3LXdpbmRvdykiLCAgLy8gJE5PTi1OTFMtMSQgcnVubmluZyBGRgotICAgICAgICAibW96aWxsYSAtcmVtb3RlIG9wZW51cmwoJVVSTCUsbmV3LXdpbmRvdykiLCAgLy8gJE5PTi1OTFMtMSQgcnVubmluZyBNb3oKLSAgICAgICAgImZpcmVmb3ggJVVSTCUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICROT04tTkxTLTEkIG5ldyBGRgotICAgICAgICAibW96aWxsYSAlVVJMJSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQgbmV3IE1vegotICAgICAgICAia2ZtY2xpZW50IG9wZW5VUkwgJVVSTCUiLCAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQgS29ucXVlcm9yCi0gICAgICAgICJvcGVyYSAtbmV3d2luZG93ICVVUkwlIiwgICAgICAgICAgICAgICAgICAgICAvLyAkTk9OLU5MUy0xJCBPcGVyYQotICAgIH07Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQSU5HX09QVF9JTiA9ICJwaW5nT3B0SW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUElOR19USU1FID0gInBpbmdUaW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBJTkdfSUQgPSAicGluZ0lkIjsgLy8kTk9OLU5MUy0xJAotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlU3RvcmUgc1ByZWZTdG9yZTsKLQotICAgIC8qKgotICAgICAqIFNlbmQgYSAicGluZyIgdG8gdGhlIEdvb2dsZSB0b29sYmFyIHNlcnZlciwgaWYgZW5vdWdoIHRpbWUgaGFzCi0gICAgICogZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBwaW5nLCBhbmQgaWYgdGhlIHVzZXIgaGFzIG5vdCBvcHRlZCBvdXQuCi0gICAgICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSwgbm90aWZ5IHRoZSB1c2VyIGFuZCBvZmZlciBhbiBvcHQtb3V0LgotICAgICAqIE5vdGU6IFVJIG9wZXJhdGlvbnMgKGlmIGFueSkgYXJlIHN5bmNocm9ub3VzLCBidXQgdGhlIGFjdHVhbCBwaW5nCi0gICAgICogKGlmIGFueSkgaXMgc2VudCBpbiBhIDxpPm5vbi1kYWVtb248L2k+IGJhY2tncm91bmQgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGFwcCBuYW1lIHRvIHJlcG9ydCBpbiB0aGUgcGluZwotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRvIHJlcG9ydCBpbiB0aGUgcGluZwotICAgICAqIEBwYXJhbSBkaXNwbGF5IGFuIG9wdGlvbmFsIHtAbGluayBEaXNwbGF5fSBvYmplY3QgdG8gdXNlLCBvciBudWxsLCBpZiBhIG5ldyBvbmUgc2hvdWxkIGJlCi0gICAgICogY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGluZyhmaW5hbCBTdHJpbmcgYXBwLCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB7Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhcHBsaWNhdGlvbiBhbmQgdmVyc2lvbiBpbnB1dC4KLSAgICAgICAgZmluYWwgU3RyaW5nIG5vcm1hbFZlcnNpb24gPSBub3JtYWxpemVWZXJzaW9uKGFwcCwgdmVyc2lvbik7Ci0KLSAgICAgICAgLy8gVW5pcXVlLCByYW5kb21seSBhc3NpZ25lZCBJRCBmb3IgdGhpcyBpbnN0YWxsYXRpb24uCi0gICAgICAgIFByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBpZiAocHJlZnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFwcmVmcy5jb250YWlucyhQSU5HX0lEKSkgewotICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRpbWU6IG1ha2UgdXAgYSBuZXcgSUQuICBUT0RPOiBVc2Ugc29tZXRoaW5nIG1vcmUgcmFuZG9tPwotICAgICAgICAgICAgICAgIHByZWZzLnNldFZhbHVlKFBJTkdfSUQsIG5ldyBSYW5kb20oKS5uZXh0TG9uZygpKTsKLQotICAgICAgICAgICAgICAgIC8vIEFsc28gZ2l2ZSB0aGVtIGEgY2hhbmNlIHRvIG9wdCBvdXQuCi0gICAgICAgICAgICAgICAgcHJlZnMuc2V0VmFsdWUoUElOR19PUFRfSU4sIGdldFVzZXJQZXJtaXNzaW9uKGRpc3BsYXkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcmVmcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBub3Qgb3B0ZWQgaW4sIGRvIG5vdGhpbmcgYW5kIHF1aWV0bHkgcmV0dXJuLgotICAgICAgICAgICAgaWYgKCFwcmVmcy5nZXRCb29sZWFuKFBJTkdfT1BUX0lOKSkgewotICAgICAgICAgICAgICAgIC8vIHVzZXIgb3B0ZWQgb3V0LgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgcGluZyAqZm9yIHRoaXMgYXBwKiB3YXMgdG9vIHJlY2VudCwgZG8gbm90aGluZy4KLSAgICAgICAgICAgIFN0cmluZyB0aW1lUHJlZiA9IFBJTkdfVElNRSArICIuIiArIGFwcDsgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbG9uZyB0aGVuID0gcHJlZnMuZ2V0TG9uZyh0aW1lUHJlZik7Ci0gICAgICAgICAgICBpZiAobm93IC0gdGhlbiA8IFBJTkdfSU5URVJWQUxfTVNFQykgewotICAgICAgICAgICAgICAgIC8vIHRvbyBzb29uIGFmdGVyIGEgcGluZy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBvZiB0aGUgYXR0ZW1wdCwgd2hldGhlciBvciBub3QgaXQgc3VjY2VlZHMuCi0gICAgICAgICAgICBwcmVmcy5zZXRWYWx1ZSh0aW1lUHJlZiwgbm93KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJlZnMuc2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSBwaW5nIGl0c2VsZiBpbiB0aGUgYmFja2dyb3VuZCAoZG9uJ3QgYmxvY2sgaWYgdGhlCi0gICAgICAgICAgICAvLyBuZXR3b3JrIGlzIGRvd24gb3Igc2xvdyBvciBjb25mdXNlZCkuCi0gICAgICAgICAgICBmaW5hbCBsb25nIGlkID0gcHJlZnMuZ2V0TG9uZyhQSU5HX0lEKTsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHlTZW5kUGluZyhhcHAsIG5vcm1hbFZlcnNpb24sIGlkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0uc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIERETVMge0BsaW5rIFByZWZlcmVuY2VTdG9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLSAgICAgICAgaWYgKHNQcmVmU3RvcmUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJlZmVyZW5jZXMKLSAgICAgICAgICAgIFN0cmluZyBob21lRGlyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaG9tZURpciA9IEFuZHJvaWRMb2NhdGlvbi5nZXRGb2xkZXIoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEFuZHJvaWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIHBhc3MsIHdlJ2xsIGRvIGEgZHVtbXkgc3RvcmUgc2luY2UgaG9tZURpciBpcyBudWxsCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChob21lRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmNGaWxlTmFtZSA9IGhvbWVEaXIgKyAiZGRtcy5jZmciOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAvLyBhbHNvIGxvb2sgZm9yIGFuIG9sZCBwcmVmIGZpbGUgaW4gdGhlIHByZXZpb3VzIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgU3RyaW5nIG9sZFByZWZQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLmRkbXNyYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBGaWxlIG9sZFByZWZGaWxlID0gbmV3IEZpbGUob2xkUHJlZlBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChvbGRQcmVmRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZVN0b3JlIG9sZFN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZShvbGRQcmVmUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRTdG9yZS5sb2FkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZFN0b3JlLnNhdmUobmV3IEZpbGVPdXRwdXRTdHJlYW0ocmNGaWxlTmFtZSksICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZFByZWZGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlU3RvcmUgbmV3U3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKHJjRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RvcmUubG9hZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc1ByZWZTdG9yZSA9IG5ld1N0b3JlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgZW1wdHkgc3RvcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBzUHJlZlN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZShyY0ZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNQcmVmU3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKHJjRmlsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzUHJlZlN0b3JlLmxvYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBMb2FkaW5nIFByZWZlcmVuY2VzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNQcmVmU3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc1ByZWZTdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmNvbmRpdGlvbmFsbHkgc2VuZCBhICJwaW5nIiByZXF1ZXN0IHRvIHRoZSBHb29nbGUgdG9vbGJhciBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBwIG5hbWUgdG8gcmVwb3J0IGluIHRoZSBwaW5nCi0gICAgICogQHBhcmFtIHZlcnNpb24gdG8gcmVwb3J0IGluIHRoZSBwaW5nIChkb3R0ZWQgbnVtYmVycywgbm8gbW9yZSB0aGFuIGZvdXIpCi0gICAgICogQHBhcmFtIGlkIG9mIHRoZSBsb2NhbCBpbnN0YWxsYXRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwaW5nIGZhaWxlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhY3R1YWxseVNlbmRQaW5nKFN0cmluZyBhcHAsIFN0cmluZyB2ZXJzaW9uLCBsb25nIGlkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBEZXRlY3QgYW5kIHJlcG9ydCB0aGUgaG9zdCBPUy4KLSAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7ICAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgIGlmIChvcy5zdGFydHNXaXRoKCJNYWMgT1MiKSkgeyAgICAgICAgICAgICAgICAgICAgICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgb3MgPSAibWFjIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0cmluZyBvc1ZlcnMgPSBnZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAob3NWZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcyA9IG9zICsgIi0iICsgb3NWZXJzOyAgICAgICAgICAgICAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob3Muc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7ICAgICAgICAgICAgICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgb3MgPSAid2luIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0cmluZyBvc1ZlcnMgPSBnZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAob3NWZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcyA9IG9zICsgIi0iICsgb3NWZXJzOyAgICAgICAgICAgICAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob3Muc3RhcnRzV2l0aCgiTGludXgiKSkgeyAgICAgICAgICAgICAgICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgb3MgPSAibGludXgiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVua25vd24gLS0gc3VycHJpc2luZyAtLSBzZW5kIGl0IHZlcmJhdGltIHNvIHdlIGNhbiBzZWUgaXQuCi0gICAgICAgICAgICBvcyA9IFVSTEVuY29kZXIuZW5jb2RlKG9zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluY2x1ZGUgdGhlIGFwcGxpY2F0aW9uJ3MgbmFtZSBhcyBwYXJ0IG9mIHRoZSBhcz0gdmFsdWUuCi0gICAgICAgIC8vIFNoYXJlIHRoZSB1c2VyIElEIGZvciBhbGwgYXBwcywgdG8gYWxsb3cgdW5pZmllZCBhY3Rpdml0eSByZXBvcnRzLgotCi0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKAotICAgICAgICAgICAgImh0dHAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ0b29scy5nb29nbGUuY29tIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAiL3NlcnZpY2UvdXBkYXRlP2FzPWFuZHJvaWRzZGtfIiArIGFwcCArICAgICAgICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICImaWQ9IiArIExvbmcudG9IZXhTdHJpbmcoaWQpICsgICAgICAgICAgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiJnZlcnNpb249IiArIHZlcnNpb24gKyAgICAgICAgICAgICAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgIiZvcz0iICsgb3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIERpc2NhcmQgdGhlIGFjdHVhbCByZXNwb25zZSwgYnV0IG1ha2Ugc3VyZSBpdCByZWFkcyBPSwotICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQotICAgICAgICAvLyBCZWxpZXZlIGl0IG9yIG5vdCwgYSA0MDQgcmVzcG9uc2UgaW5kaWNhdGVzIHN1Y2Nlc3M6Ci0gICAgICAgIC8vIHRoZSBwaW5nIHdhcyBsb2dnZWQsIGJ1dCBubyB1cGRhdGUgaXMgY29uZmlndXJlZC4KLSAgICAgICAgaWYgKGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCkgIT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9PSyAmJgotICAgICAgICAgICAgY29ubi5nZXRSZXNwb25zZUNvZGUoKSAhPSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9GT1VORCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGNvbm4uZ2V0UmVzcG9uc2VNZXNzYWdlKCkgKyAiOiAiICsgdXJsKTsgICAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIG9zIGlmIGl0IGlzIGRlZmluZWQgYXMgWC5ZLCBvciBudWxsIG90aGVyd2lzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogRXhhbXBsZSBvZiByZXR1cm5lZCB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2xvcGljYS5zb3VyY2Vmb3JnZS5uZXQvb3MuaHRtbAotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFueSBleGl0aW5nIG1pY3JvIHZlcnNpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIihcXGQrKVxcLihcXGQrKS4qIik7IC8vICROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBvc1ZlcnMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKG9zVmVycyk7Ci0gICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMSkgKyAiLiIgKyBtLmdyb3VwKDIpOyAgICAgICAgIC8vICROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9tcHQgdGhlIHVzZXIgZm9yIHdoZXRoZXIgdGhleSB3YW50IHRvIG9wdCBvdXQgb2YgcmVwb3J0aW5nLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgdXNlciBhbGxvd3MgcmVwb3J0aW5nICh0aGV5IGRvIG5vdCBvcHQgb3V0KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldFVzZXJQZXJtaXNzaW9uKERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICAvLyBXaGV0aGVyIHRoZSB1c2VyIGdhdmUgcGVybWlzc2lvbiAoc2l6ZS0xIGFycmF5IGZvciB3cml0aW5nIHRvKS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0byBmYWxzZSwgc2V0IHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBidXR0b24uCi0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSBwZXJtaXNzaW9uID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0KLSAgICAgICAgYm9vbGVhbiBkaXNwb3NlID0gZmFsc2U7Ci0gICAgICAgIGlmIChkaXNwbGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgICAgICAgICAgZGlzcG9zZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBEaXNwbGF5IGN1cnJlbnREaXNwbGF5ID0gZGlzcGxheTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkaXNwb3NlRGlzcGxheSA9IGRpc3Bvc2U7Ci0KLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoY3VycmVudERpc3BsYXksIFNXVC5USVRMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICAgICAgICAgIHNoZWxsLnNldFRleHQoV0lORE9XX1RJVExFX1RFWFQpOwotICAgICAgICAgICAgICAgIHNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOyAvLyAxIGNvbHVtbgotCi0gICAgICAgICAgICAgICAgLy8gVGFrZSB0aGUgZGVmYXVsdCBmb250IGFuZCBzY2FsZSBpdCB1cCBmb3IgdGhlIHRpdGxlLgotICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsIHRpdGxlID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSIHwgU1dULldSQVApOwotICAgICAgICAgICAgICAgIGZpbmFsIEZvbnREYXRhW10gZm9udGRhdGEgPSB0aXRsZS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbnRkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnRkYXRhW2ldLnNldEhlaWdodChmb250ZGF0YVtpXS5nZXRIZWlnaHQoKSAqIDQgLyAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGl0bGUuc2V0Rm9udChuZXcgRm9udChjdXJyZW50RGlzcGxheSwgZm9udGRhdGEpKTsKLSAgICAgICAgICAgICAgICB0aXRsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgICAgICAgICB0aXRsZS5zZXRUZXh0KEhFQURFUl9URVhUKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsIG5vdGljZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULldSQVApOwotICAgICAgICAgICAgICAgIG5vdGljZS5zZXRGb250KHRpdGxlLmdldEZvbnQoKSk7Ci0gICAgICAgICAgICAgICAgbm90aWNlLnNldEZvcmVncm91bmQobmV3IENvbG9yKGN1cnJlbnREaXNwbGF5LCAyNTUsIDAsIDApKTsKLSAgICAgICAgICAgICAgICBub3RpY2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgICAgICAgICAgbm90aWNlLnNldFRleHQoTk9USUNFX1RFWFQpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgTGluayB0ZXh0ID0gbmV3IExpbmsoc2hlbGwsIFNXVC5XUkFQKTsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChCT0RZX1RFWFQpOwotICAgICAgICAgICAgICAgIHRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BlblVybChldmVudC50ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgZmluYWwgQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLSAgICAgICAgICAgICAgICBjaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7IC8vIE9wdC1pbiBieSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGNoZWNrYm94LnNldFRleHQoQ0hFQ0tCT1hfVEVYVCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaW5rIGZvb3RlciA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuV1JBUCk7Ci0gICAgICAgICAgICAgICAgZm9vdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAgICAgICAgIGZvb3Rlci5zZXRUZXh0KEZPT1RFUl9URVhUKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICAgICAgYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0gICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoQlVUVE9OX1RFWFQpOwotICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uWzBdID0gY2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTaXplIHRoZSB3aW5kb3cgdG8gYSBmaXhlZCB3aWR0aCwgYXMgaGlnaCBhcyBuZWNlc3NhcnksCi0gICAgICAgICAgICAgICAgLy8gY2VudGVyZWQuCi0gICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKDQ1MCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RhbmdsZSBzY3JlZW4gPSBjdXJyZW50RGlzcGxheS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgc2hlbGwuc2V0Qm91bmRzKHNjcmVlbi54ICsgc2NyZWVuLndpZHRoIC8gMiAtIHNpemUueCAvIDIsIHNjcmVlbi55ICsgc2NyZWVuLmhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgLyAyIC0gc2l6ZS55IC8gMiwgc2l6ZS54LCBzaXplLnkpOwotCi0gICAgICAgICAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICAgICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudERpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGlzcGxheS5zbGVlcCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXNwb3NlRGlzcGxheSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcGVybWlzc2lvblswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuIGEgVVJMIGluIGFuIGV4dGVybmFsIGJyb3dzZXIuCi0gICAgICogQHBhcmFtIHVybCB0byBvcGVuIC0gTVVTVCBiZSBzYW5pdGl6ZWQgYW5kIHByb3Blcmx5IGZvcm1lZCEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblVybChmaW5hbCBTdHJpbmcgdXJsKSB7Ci0gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHNvbWV0aGluZyBsaWtlIEJyb3dzZXJMYXVuY2hlcjIKLSAgICAgICAgLy8gKGh0dHA6Ly9icm93c2VybGF1bmNoMi5zb3VyY2Vmb3JnZS5uZXQvKSBpbnN0ZWFkIG9mIHRoZXNlIGhhY2tzLgotCi0gICAgICAgIC8vIFNXVCdzIFByb2dyYW0ubGF1bmNoKCkgc2hvdWxkIHdvcmsgb24gTWFjLCBXaW5kb3dzLCBhbmQgR05PTUUKLSAgICAgICAgLy8gKGJlY2F1c2UgdGhlIE9TIHNoZWxsIGtub3dzIGhvdyB0byBsYXVuY2ggYSBkZWZhdWx0IGJyb3dzZXIpLgotICAgICAgICBpZiAoIVByb2dyYW0ubGF1bmNoKHVybCkpIHsKLSAgICAgICAgICAgIC8vIE11c3QgYmUgTGludXggbm9uLUdOT01FIChvciBzb21ldGhpbmcgZWxzZSBicm9rZSkuCi0gICAgICAgICAgICAvLyBUcnkgYSBmZXcgTGludXggYnJvd3NlciBjb21tYW5kcyBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjbWQgOiBMSU5VWF9CUk9XU0VSUykgewotICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gY21kLnJlcGxhY2VBbGwoIiVVUkwlIiwgdXJsKTsgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYy53YWl0Rm9yKCkgPT0gMCkgYnJlYWs7ICAvLyBTdWNjZXNzIQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXhjZXB0aW9uIGFuZCB0cnkgdGhlIG5leHQgYnJvd3Nlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFBvcCB1cCBzb21lIHNvcnQgb2YgZXJyb3IgaGVyZT8KLSAgICAgICAgICAgICAgICAgICAgLy8gKFdlJ3JlIGluIGEgbmV3IHRocmVhZDsgY2FuJ3QgdXNlIHRoZSBleGlzdGluZyBEaXNwbGF5LikKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgc3VwcGxpZWQgYXBwbGljYXRpb24gdmVyc2lvbiwgYW5kIG5vcm1hbGl6ZSB0aGUgdmVyc2lvbi4KLSAgICAgKiBAcGFyYW0gYXBwIHRvIHJlcG9ydAotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHN1cHBsaWVkIGJ5IGNhbGxlcgotICAgICAqIEByZXR1cm4gbm9ybWFsaXplZCBkb3R0ZWQgcXVhZCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nIGFwcCwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgLy8gQXBwbGljYXRpb24gbmFtZSBtdXN0IGNvbnRhaW4gb25seSB3b3JkIGNoYXJhY3RlcnMgKG5vIHB1bmN0dWFhdGlvbikKLSAgICAgICAgaWYgKCFhcHAubWF0Y2hlcygiXFx3KyIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgYXBwIG5hbWU6ICIgKyBhcHApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVmVyc2lvbiBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNCBkb3R0ZWQgbnVtYmVycwotICAgICAgICBTdHJpbmdbXSBudW1iZXJzID0gdmVyc2lvbi5zcGxpdCgiXFwuIik7Ci0gICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA+IDQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcGFydDogbnVtYmVycykgewotICAgICAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoZXMoIlxcZCsiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHdheXMgb3V0cHV0IDQgbnVtYmVycywgZXZlbiBpZiBmZXdlciB3ZXJlIHN1cHBsaWVkIChwYWQgd2l0aCAuMCkKLSAgICAgICAgU3RyaW5nQnVmZmVyIG5vcm1hbCA9IG5ldyBTdHJpbmdCdWZmZXIobnVtYmVyc1swXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBub3JtYWwuYXBwZW5kKCIuIikuYXBwZW5kKGkgPCBudW1iZXJzLmxlbmd0aCA/IG51bWJlcnNbaV0gOiAiMCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub3JtYWwudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvLmNsYXNzcGF0aCBiL3Rvb2xzL3RyYWNldmlldy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFjYjYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuVVNFUl9MSUJSQVJZL0FORFJPSURfU1dUIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL1Nka1N0YXRzU2VydmljZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvLmdpdGlnbm9yZSBiL3Rvb2xzL3RyYWNldmlldy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvLnByb2plY3QgYi90b29scy90cmFjZXZpZXcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjI5N2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dHJhY2V2aWV3PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9BbmRyb2lkLm1rIGIvdG9vbHMvdHJhY2V2aWV3L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTdiODAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotVFJBQ0VWSUVXX0xPQ0FMX0RJUiA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKFRSQUNFVklFV19MT0NBTF9ESVIpL2V0Yy9BbmRyb2lkLm1rCi1pbmNsdWRlICQoVFJBQ0VWSUVXX0xPQ0FMX0RJUikvc3JjL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9SRUFETUUgYi90b29scy90cmFjZXZpZXcvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ1NzZhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1Vc2luZyB0aGUgRWNsaXBzZSBwcm9qZWN0cyBmb3IgdHJhY2V2aWV3LgotCi10cmFjZXZpZXcgcmVxdWlyZXMgU1dUIHRvIGNvbXBpbGUuCi0KLVNXVCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlcG90IHVuZGVyIC8vZGV2aWNlL3ByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0Ci0KLUJlY2F1c2UgdGhlIGJ1aWxkIHBhdGggY2Fubm90IGNvbnRhaW4gcmVsYXRpdmUgcGF0aCB0aGF0IGFyZSBub3QgaW5zaWRlIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKLXRoZSAuY2xhc3NwYXRoIGZpbGUgcmVmZXJlbmNlcyBhIHVzZXIgbGlicmFyeSBjYWxsZWQgQU5EUk9JRF9TV1QuCi0KLUluIG9yZGVyIHRvIGNvbXBpbGUgdGhlIHByb2plY3QsIG1ha2UgYSB1c2VyIGxpYnJhcnkgY2FsbGVkIEFORFJPSURfU1dUIGNvbnRhaW5pbmcgdGhlIGphcgotYXZhaWxhYmxlIGF0IC8vZGV2aWNlL3ByZWJ1aWxkLzxwbGF0Zm9ybT4vc3d0LgpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L2V0Yy9BbmRyb2lkLm1rIGIvdG9vbHMvdHJhY2V2aWV3L2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZiMTllLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9ldGMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUFJFQlVJTFRfRVhFQ1VUQUJMRVMgOj0gdHJhY2V2aWV3Ci1pbmNsdWRlICQoQlVJTERfSE9TVF9QUkVCVUlMVCkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L2V0Yy9tYW5pZmVzdC50eHQgYi90b29scy90cmFjZXZpZXcvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkYmM3ZS4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvZXRjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQudHJhY2V2aWV3Lk1haW5XaW5kb3cKLUNsYXNzLVBhdGg6IHN3dC5qYXIgb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25fMy4yLjAudjIwMDYwNjAzLmphciBvcmcuZWNsaXBzZS5qZmFjZV8zLjIuMC5JMjAwNjA2MDUtMTQwMC5qYXIgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kc18zLjIuMC5JMjAwNjA2MDUtMTQwMC5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9ldGMvdHJhY2V2aWV3IGIvdG9vbHMvdHJhY2V2aWV3L2V0Yy90cmFjZXZpZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWNkMGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L2V0Yy90cmFjZXZpZXcKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgQ29weXJpZ2h0IDIwMDUtMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFNldCB1cCBwcm9nIHRvIGJlIHRoZSBwYXRoIG9mIHRoaXMgc2NyaXB0LCBpbmNsdWRpbmcgZm9sbG93aW5nIHN5bWxpbmtzLAotIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgotcHJvZz0iJDAiCi13aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwotICAgIG5ld1Byb2c9YC9iaW4vbHMgLWxkICIke3Byb2d9ImAKLSAgICBuZXdQcm9nPWBleHByICIke25ld1Byb2d9IiA6ICIuKiAtPiBcKC4qXCkkImAKLSAgICBpZiBleHByICJ4JHtuZXdQcm9nfSIgOiAneC8nID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgcHJvZz0iJHtuZXdQcm9nfSIKLSAgICBlbHNlCi0gICAgICAgIHByb2dkaXI9YGRpcm5hbWUgIiR7cHJvZ30iYAotICAgICAgICBwcm9nPSIke3Byb2dkaXJ9LyR7bmV3UHJvZ30iCi0gICAgZmkKLWRvbmUKLW9sZHdkPWBwd2RgCi1wcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLXByb2duYW1lPWBiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iLyIke3Byb2duYW1lfSIKLWNkICIke29sZHdkfSIKLQotamFyZmlsZT10cmFjZXZpZXcuamFyCi1mcmFtZXdvcmtkaXI9IiRwcm9nZGlyIgotbGliZGlyPSIkcHJvZ2RpciIKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGZyYW1ld29ya2Rpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLSAgICBsaWJkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvdG9vbHMvbGliCi1maQotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2ZyYW1ld29yawotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBlY2hvICIke3Byb2duYW1lfTogY2FuJ3QgZmluZCAkamFyZmlsZSIKLSAgICBleGl0IDEKLWZpCi0KLWphdmFDbWQ9ImphdmEiCi0KLW9zPWB1bmFtZWAKLWlmIFsgJG9zID09ICdEYXJ3aW4nIF07IHRoZW4KLSAgamF2YU9wdHM9Ii1YbXgxNjAwTSAtWHN0YXJ0T25GaXJzdFRocmVhZCIKLWVsc2UKLSAgamF2YU9wdHM9Ii1YbXgxNjAwTSIKLWZpCi0KLWlmIFsgYHVuYW1lYCA9ICJMaW51eCIgXTsgdGhlbgotICAgIGV4cG9ydCBHREtfTkFUSVZFX1dJTkRPV1M9dHJ1ZQotZmkKLQotd2hpbGUgZXhwciAieCQxIiA6ICd4LUonID4vZGV2L251bGw7IGRvCi0gICAgb3B0PWBleHByICIkMSIgOiAnLUpcKC4qXCknYAotICAgIGphdmFPcHRzPSIke2phdmFPcHRzfSAtJHtvcHR9IgotICAgIHNoaWZ0Ci1kb25lCi0KLWphcnBhdGg9IiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiCi0KLSMgRmlndXJlIG91dCB0aGUgcGF0aCB0byB0aGUgc3d0LmphciBmb3IgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLgotIyBpZiBBTkRST0lEX1NXVCBpcyBkZWZpbmVkLCB0aGVuIGp1c3QgdXNlIHRoaXMuCi0jIGVsc2UsIGlmIHJ1bm5pbmcgaW4gdGhlIEFuZHJvaWQgc291cmNlIHRyZWUsIHRoZW4gbG9vayBmb3IgdGhlIGNvcnJlY3Qgc3d0IGZvbGRlciBpbiBwcmVidWlsdAotIyBlbHNlLCBsb29rIGZvciB0aGUgY29ycmVjdCBzd3QgZm9sZGVyIGluIHRoZSBTREsgdW5kZXIgdG9vbHMvbGliLwotc3d0cGF0aD0iIgotaWYgWyAtbiAiJEFORFJPSURfU1dUIiBdOyB0aGVuCi0gICAgc3d0cGF0aD0iJEFORFJPSURfU1dUIgotZWxzZQotICAgIHZtYXJjaD1gJHtqYXZhQ21kfSAtamFyICIke2ZyYW1ld29ya2Rpcn0iL2FyY2hxdWVyeS5qYXJgCi0gICAgaWYgWyAtbiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCi0gICAgICAgIG9zbmFtZT1gdW5hbWUgLXMgfCB0ciBBLVogYS16YAotICAgICAgICBzd3RwYXRoPSIke0FORFJPSURfQlVJTERfVE9QfS9wcmVidWlsdC8ke29zbmFtZX0tJHt2bWFyY2h9L3N3dCIKLSAgICBlbHNlCi0gICAgICAgIHN3dHBhdGg9IiR7ZnJhbWV3b3JrZGlyfS8ke3ZtYXJjaH0iCi0gICAgZmkKLWZpCi0KLSMgQ29tYmluZSB0aGUgc3d0cGF0aCBhbmQgdGhlIGZyYW1ld29yayBkaXIgcGF0aC4KLWlmIFsgLWQgIiRzd3RwYXRoIiBdOyB0aGVuCi0gICAgZnJhbWV3b3JrZGlyPSIke3N3dHBhdGh9OiR7ZnJhbWV3b3JrZGlyfSIKLWVsc2UKLSAgICBlY2hvICJTV1QgZm9sZGVyICcke3N3dHBhdGh9JyBkb2VzIG5vdCBleGlzdC4iCi0gICAgZWNobyAiUGxlYXNlIGV4cG9ydCBBTkRST0lEX1NXVCB0byBwb2ludCB0byB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgc3d0LmphciBmb3IgeW91ciBwbGF0Zm9ybS4iCi0gICAgZXhpdCAxCi1maQotCi1leGVjICIke2phdmFDbWR9IiAkamF2YU9wdHMgLURqYXZhLmV4dC5kaXJzPSIkZnJhbWV3b3JrZGlyIiAtRGNvbS5hbmRyb2lkLnRyYWNldmlldy50b29sc2Rpcj0iJHByb2dkaXIiIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvZXRjL3RyYWNldmlldy5iYXQgYi90b29scy90cmFjZXZpZXcvZXRjL3RyYWNldmlldy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyZmJlODUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L2V0Yy90cmFjZXZpZXcuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLXJlbQotcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotcmVtIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLXJlbSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1yZW0KLXJlbSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1yZW0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLXJlbSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLXJlbSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1yZW0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXJlbSBkb24ndCBtb2RpZnkgdGhlIGNhbGxlcidzIGVudmlyb25tZW50Ci1zZXRsb2NhbAotCi1yZW0gU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCi1yZW0gYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXNldCBwcm9nPSV+ZjAKLQotcmVtIENoYW5nZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgZHJpdmUgdG8gd2hlcmUgdGhlIHNjcmlwdCBpcywgdG8gYXZvaWQKLXJlbSBpc3N1ZXMgd2l0aCBkaXJlY3RvcmllcyBjb250YWluaW5nIHdoaXRlc3BhY2VzLgotY2QgL2QgJX5kcDAKLQotc2V0IGphcmZpbGU9dHJhY2V2aWV3Lmphcgotc2V0IGZyYW1ld29ya2Rpcj0KLQotaWYgZXhpc3QgJWZyYW1ld29ya2RpciUlamFyZmlsZSUgZ290byBKYXJGaWxlT2sKLSAgICBzZXQgZnJhbWV3b3JrZGlyPWxpYlwKLQotaWYgZXhpc3QgJWZyYW1ld29ya2RpciUlamFyZmlsZSUgZ290byBKYXJGaWxlT2sKLSAgICBzZXQgZnJhbWV3b3JrZGlyPS4uXGZyYW1ld29ya1wKLQotOkphckZpbGVPawotCi1zZXQgamFycGF0aD0lZnJhbWV3b3JrZGlyJSVqYXJmaWxlJQotCi1pZiBub3QgZGVmaW5lZCBBTkRST0lEX1NXVCBnb3RvIFF1ZXJ5QXJjaAotICAgIHNldCBzd3RfcGF0aD0lQU5EUk9JRF9TV1QlCi0gICAgZ290byBTd3REb25lCi0KLTpRdWVyeUFyY2gKLQotICAgIGZvciAvZiAlJWEgaW4gKCdqYXZhIC1qYXIgJWZyYW1ld29ya2RpciVhcmNocXVlcnkuamFyJykgZG8gc2V0IHN3dF9wYXRoPSVmcmFtZXdvcmtkaXIlJSVhCi0KLTpTd3REb25lCi0KLWlmIGV4aXN0ICVzd3RfcGF0aCUgZ290byBTZXRQYXRoCi0gICAgZWNobyBTV1QgZm9sZGVyICclc3d0X3BhdGglJyBkb2VzIG5vdCBleGlzdC4KLSAgICBlY2hvIFBsZWFzZSBzZXQgQU5EUk9JRF9TV1QgdG8gcG9pbnQgdG8gdGhlIGZvbGRlciBjb250YWluaW5nIHN3dC5qYXIgZm9yIHlvdXIgcGxhdGZvcm0uCi0gICAgZXhpdCAvQgotCi06U2V0UGF0aAotc2V0IGphdmFleHRkaXJzPSVzd3RfcGF0aCU7JWZyYW1ld29ya2RpciUKLQotY2FsbCBqYXZhIC1EamF2YS5leHQuZGlycz0lamF2YWV4dGRpcnMlIC1EY29tLmFuZHJvaWQudHJhY2V2aWV3LnRvb2xzZGlyPSAtamFyICVqYXJwYXRoJSAlKgpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9BbmRyb2lkLm1rIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkwMWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSByZXNvdXJjZXMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVJfTUFOSUZFU1QgOj0gLi4vZXRjL21hbmlmZXN0LnR4dAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWFuZHJvaWRwcmVmcyBcCi0Jc2Rrc3RhdHMgXAotCXN3dCBcCi0Jb3JnLmVjbGlwc2UuamZhY2VfMy40LjIuTTIwMDkwMTA3LTA4MDAgXAotCW9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA4MDQyMS0yMDA2IFwKLQlvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuNC4wLkkyMDA4MDUwOS0yMDAwCi1MT0NBTF9NT0RVTEUgOj0gdHJhY2V2aWV3Ci0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L0NhbGwuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L0NhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhYzI0NC4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9DYWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudHJhY2V2aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1jbGFzcyBDYWxsIGltcGxlbWVudHMgVGltZUxpbmVWaWV3LkJsb2NrIHsKLSAgICAKLSAgICAvLyBWYWx1ZXMgZm9yIGJpdHMgd2l0aGluIHRoZSBtRmxhZ3MgZmllbGQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BQ1RJT05fTUFTSyA9IDB4MzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNfUkVDVVJTSVZFID0gMHgxMDsKLQotICAgIHByaXZhdGUgaW50IG1UaHJlYWRJZDsKLSAgICBwcml2YXRlIGludCBtRmxhZ3M7Ci0gICAgTWV0aG9kRGF0YSBtTWV0aG9kRGF0YTsKLSAgICAKLSAgICAvKiogMC1iYXNlZCB0aHJlYWQtbG9jYWwgc3RhcnQgdGltZSAqLwotICAgIGxvbmcgbVRocmVhZFN0YXJ0VGltZTsKLSAgICAKLSAgICAvKiogIGdsb2JhbCBzdGFydCB0aW1lICovCi0gICAgbG9uZyBtR2xvYmFsU3RhcnRUaW1lOwotCi0gICAgLyoqIGdsb2JhbCBlbmQgdGltZSAqLwotICAgIGxvbmcgbUdsb2JhbEVuZFRpbWU7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIHRoZSByb290IG9mIGEgQ2FsbCB0cmVlLiBUaGUgbmFtZSBpcwotICAgICAqIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRocmVhZC4gCi0gICAgICovCi0gICAgQ2FsbChTdHJpbmcgbmFtZSwgTWV0aG9kRGF0YSBtZXRob2REYXRhKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbU1ldGhvZERhdGEgPSBtZXRob2REYXRhOwotICAgIH0KLQotICAgIENhbGwoKSB7Ci0gICAgfQotICAgIAotICAgIENhbGwoaW50IHRocmVhZElkLCBNZXRob2REYXRhIG1ldGhvZERhdGEsIGxvbmcgdGltZSwgaW50IG1ldGhvZEFjdGlvbikgewotICAgICAgICBtVGhyZWFkSWQgPSB0aHJlYWRJZDsKLSAgICAgICAgbU1ldGhvZERhdGEgPSBtZXRob2REYXRhOwotICAgICAgICBtVGhyZWFkU3RhcnRUaW1lID0gdGltZTsKLSAgICAgICAgbUZsYWdzID0gbWV0aG9kQWN0aW9uICYgTUVUSE9EX0FDVElPTl9NQVNLOwotICAgICAgICBtTmFtZSA9IG1ldGhvZERhdGEuZ2V0UHJvZmlsZU5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0KGludCB0aHJlYWRJZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBsb25nIHRpbWUsIGludCBtZXRob2RBY3Rpb24pIHsKLSAgICAgICAgbVRocmVhZElkID0gdGhyZWFkSWQ7Ci0gICAgICAgIG1NZXRob2REYXRhID0gbWV0aG9kRGF0YTsKLSAgICAgICAgbVRocmVhZFN0YXJ0VGltZSA9IHRpbWU7Ci0gICAgICAgIG1GbGFncyA9IG1ldGhvZEFjdGlvbiAmIE1FVEhPRF9BQ1RJT05fTUFTSzsKLSAgICAgICAgbU5hbWUgPSBtZXRob2REYXRhLmdldFByb2ZpbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTmFtZSgpIHsKLSAgICAgICAgbU5hbWUgPSBtTWV0aG9kRGF0YS5nZXRQcm9maWxlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgYWRkV2VpZ2h0KGludCB4LCBpbnQgeSwgZG91YmxlIHdlaWdodCkgewotICAgICAgICByZXR1cm4gbU1ldGhvZERhdGEuYWRkV2VpZ2h0KHgsIHksIHdlaWdodCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJXZWlnaHQoKSB7Ci0gICAgICAgIG1NZXRob2REYXRhLmNsZWFyV2VpZ2h0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgewotICAgICAgICByZXR1cm4gbUdsb2JhbFN0YXJ0VGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbmRUaW1lKCkgewotICAgICAgICByZXR1cm4gbUdsb2JhbEVuZFRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIENvbG9yIGdldENvbG9yKCkgewotICAgICAgICByZXR1cm4gbU1ldGhvZERhdGEuZ2V0Q29sb3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeGNsdXNpdmVUaW1lKGxvbmcgZWxhcHNlZCkgewotICAgICAgICBtTWV0aG9kRGF0YS5hZGRFbGFwc2VkRXhjbHVzaXZlKGVsYXBzZWQpOwotICAgICAgICBpZiAoKG1GbGFncyAmIElTX1JFQ1VSU0lWRSkgPT0gMCkgewotICAgICAgICAgICAgbU1ldGhvZERhdGEuYWRkVG9wRXhjbHVzaXZlKGVsYXBzZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSW5jbHVzaXZlVGltZShsb25nIGVsYXBzZWQsIENhbGwgcGFyZW50KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWN1cnNpdmUgPSAobUZsYWdzICYgSVNfUkVDVVJTSVZFKSAhPSAwOwotICAgICAgICBtTWV0aG9kRGF0YS5hZGRFbGFwc2VkSW5jbHVzaXZlKGVsYXBzZWQsIGlzUmVjdXJzaXZlLCBwYXJlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIGludCBnZXRUaHJlYWRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UaHJlYWRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kRGF0YSBnZXRNZXRob2REYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGhvZERhdGE7Ci0gICAgfQotCi0gICAgaW50IGdldE1ldGhvZEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1GbGFncyAmIE1FVEhPRF9BQ1RJT05fTUFTSzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJXMgWyVkLCAlZF1cbiIsIG1OYW1lLCBtR2xvYmFsU3RhcnRUaW1lLCBtR2xvYmFsRW5kVGltZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gaXNSZWN1cnNpdmUpIHsKLSAgICAgICAgaWYgKGlzUmVjdXJzaXZlKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gSVNfUkVDVVJTSVZFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZsYWdzICY9IH5JU19SRUNVUlNJVkU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlY3Vyc2l2ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19SRUNVUlNJVkUpICE9IDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvQ29sb3JDb250cm9sbGVyLmphdmEgYi90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Db2xvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNGMwZC4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Db2xvckNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgQ29sb3JDb250cm9sbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzeXN0ZW1Db2xvcnMgPSB7IFNXVC5DT0xPUl9CTFVFLCBTV1QuQ09MT1JfUkVELAotICAgICAgICBTV1QuQ09MT1JfR1JFRU4sIFNXVC5DT0xPUl9DWUFOLCBTV1QuQ09MT1JfTUFHRU5UQSwgU1dULkNPTE9SX0RBUktfQkxVRSwKLSAgICAgICAgU1dULkNPTE9SX0RBUktfUkVELCBTV1QuQ09MT1JfREFSS19HUkVFTiwgU1dULkNPTE9SX0RBUktfWUVMTE9XLAotICAgICAgICBTV1QuQ09MT1JfREFSS19DWUFOLCBTV1QuQ09MT1JfREFSS19NQUdFTlRBLCBTV1QuQ09MT1JfQkxBQ0sgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIFJHQltdIHJnYkNvbG9ycyA9IHsgbmV3IFJHQig5MCwgOTAsIDI1NSksIC8vIGJsdWUKLSAgICAgICAgICAgIG5ldyBSR0IoMCwgMjQwLCAwKSwgLy8gZ3JlZW4KLSAgICAgICAgICAgIG5ldyBSR0IoMjU1LCAwLCAwKSwgLy8gcmVkCi0gICAgICAgICAgICBuZXcgUkdCKDAsIDI1NSwgMjU1KSwgLy8gY3lhbgotICAgICAgICAgICAgbmV3IFJHQigyNTUsIDgwLCAyNTUpLCAvLyBtYWdlbnRhCi0gICAgICAgICAgICBuZXcgUkdCKDIwMCwgMjAwLCAwKSwgLy8geWVsbG93Ci0gICAgICAgICAgICBuZXcgUkdCKDQwLCAwLCAyMDApLCAvLyBkYXJrIGJsdWUKLSAgICAgICAgICAgIG5ldyBSR0IoMTUwLCAyNTUsIDE1MCksIC8vIGxpZ2h0IGdyZWVuCi0gICAgICAgICAgICBuZXcgUkdCKDE1MCwgMCwgMCksIC8vIGRhcmsgcmVkCi0gICAgICAgICAgICBuZXcgUkdCKDMwLCAxNTAsIDE1MCksIC8vIGRhcmsgY3lhbgotICAgICAgICAgICAgbmV3IFJHQigyMDAsIDIwMCwgMjU1KSwgLy8gbGlnaHQgYmx1ZQotICAgICAgICAgICAgbmV3IFJHQigwLCAxMjAsIDApLCAvLyBkYXJrIGdyZWVuCi0gICAgICAgICAgICBuZXcgUkdCKDI1NSwgMTUwLCAxNTApLCAvLyBsaWdodCByZWQKLSAgICAgICAgICAgIG5ldyBSR0IoMTQwLCA4MCwgMTQwKSwgLy8gZGFyayBtYWdlbnRhCi0gICAgICAgICAgICBuZXcgUkdCKDE1MCwgMTAwLCA1MCksIC8vIGJyb3duCi0gICAgICAgICAgICBuZXcgUkdCKDcwLCA3MCwgNzApLCAvLyBkYXJrIGdyZXkKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBDb2xvcj4gY29sb3JDYWNoZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIENvbG9yPigpOwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgSW1hZ2U+IGltYWdlQ2FjaGUgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbWFnZT4oKTsKLQotICAgIHB1YmxpYyBDb2xvckNvbnRyb2xsZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb2xvciByZXF1ZXN0Q29sb3IoRGlzcGxheSBkaXNwbGF5LCBSR0IgcmdiKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0Q29sb3IoZGlzcGxheSwgcmdiLnJlZCwgcmdiLmdyZWVuLCByZ2IuYmx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSByZXF1ZXN0Q29sb3JTcXVhcmUoRGlzcGxheSBkaXNwbGF5LCBSR0IgcmdiKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0Q29sb3JTcXVhcmUoZGlzcGxheSwgcmdiLnJlZCwgcmdiLmdyZWVuLCByZ2IuYmx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb2xvciByZXF1ZXN0Q29sb3IoRGlzcGxheSBkaXNwbGF5LCBpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKSB7Ci0gICAgICAgIGludCBrZXkgPSAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7Ci0gICAgICAgIENvbG9yIGNvbG9yID0gY29sb3JDYWNoZS5nZXQoa2V5KTsKLSAgICAgICAgaWYgKGNvbG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJlZCwgZ3JlZW4sIGJsdWUpOwotICAgICAgICAgICAgY29sb3JDYWNoZS5wdXQoa2V5LCBjb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgcmVxdWVzdENvbG9yU3F1YXJlKERpc3BsYXkgZGlzcGxheSwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkgewotICAgICAgICBpbnQga2V5ID0gKHJlZCA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCBibHVlOwotICAgICAgICBJbWFnZSBpbWFnZSA9IGltYWdlQ2FjaGUuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCA4LCAxNCk7Ci0gICAgICAgICAgICBHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0gICAgICAgICAgICBDb2xvciBjb2xvciA9IHJlcXVlc3RDb2xvcihkaXNwbGF5LCByZWQsIGdyZWVuLCBibHVlKTsKLSAgICAgICAgICAgIGdjLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0gICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBpbWFnZUNhY2hlLnB1dChrZXksIGltYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2lnbk1ldGhvZENvbG9ycyhEaXNwbGF5IGRpc3BsYXksIE1ldGhvZERhdGFbXSBtZXRob2RzKSB7Ci0gICAgICAgIGludCBuZXh0Q29sb3JJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoTWV0aG9kRGF0YSBtZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIFJHQiByZ2IgPSByZ2JDb2xvcnNbbmV4dENvbG9ySW5kZXhdOwotICAgICAgICAgICAgaWYgKCsrbmV4dENvbG9ySW5kZXggPT0gcmdiQ29sb3JzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBuZXh0Q29sb3JJbmRleCA9IDA7Ci0gICAgICAgICAgICBDb2xvciBjb2xvciA9IHJlcXVlc3RDb2xvcihkaXNwbGF5LCByZ2IpOwotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSByZXF1ZXN0Q29sb3JTcXVhcmUoZGlzcGxheSwgcmdiKTsKLSAgICAgICAgICAgIG1kLnNldENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgIG1kLnNldEltYWdlKGltYWdlKTsKLQotICAgICAgICAgICAgLy8gQ29tcHV0ZSBhbmQgc2V0IGEgZmFkZWQgY29sb3IKLSAgICAgICAgICAgIGludCBmYWRlZFJlZCA9IDE1MCArIHJnYi5yZWQgLyA0OwotICAgICAgICAgICAgaW50IGZhZGVkR3JlZW4gPSAxNTAgKyByZ2IuZ3JlZW4gLyA0OwotICAgICAgICAgICAgaW50IGZhZGVkQmx1ZSA9IDE1MCArIHJnYi5ibHVlIC8gNDsKLSAgICAgICAgICAgIFJHQiBmYWRlZCA9IG5ldyBSR0IoZmFkZWRSZWQsIGZhZGVkR3JlZW4sIGZhZGVkQmx1ZSk7Ci0gICAgICAgICAgICBjb2xvciA9IHJlcXVlc3RDb2xvcihkaXNwbGF5LCBmYWRlZCk7Ci0gICAgICAgICAgICBpbWFnZSA9IHJlcXVlc3RDb2xvclNxdWFyZShkaXNwbGF5LCBmYWRlZCk7Ci0gICAgICAgICAgICBtZC5zZXRGYWRlZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgIG1kLnNldEZhZGVkSW1hZ2UoaW1hZ2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvRG1UcmFjZVJlYWRlci5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvRG1UcmFjZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE5YzE5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L0RtVHJhY2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgRG1UcmFjZVJlYWRlciBleHRlbmRzIFRyYWNlUmVhZGVyIHsKLQotICAgIHByaXZhdGUgaW50IG1WZXJzaW9uTnVtYmVyID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlYnVnID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQUNFX01BR0lDID0gMHg1NzRmNGM1MzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ3Jlc3Npb247Ci0gICAgcHJpdmF0ZSBQcm9maWxlUHJvdmlkZXIgbVByb2ZpbGVQcm92aWRlcjsKLSAgICBwcml2YXRlIFN0cmluZyBtVHJhY2VGaWxlTmFtZTsKLSAgICBwcml2YXRlIE1ldGhvZERhdGEgbVRvcExldmVsOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PENhbGw+IG1DYWxsTGlzdDsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxDYWxsPiBtU3dpdGNoTGlzdDsKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTWV0aG9kRGF0YT4gbU1ldGhvZE1hcDsKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgVGhyZWFkRGF0YT4gbVRocmVhZE1hcDsKLSAgICBwcml2YXRlIFRocmVhZERhdGFbXSBtU29ydGVkVGhyZWFkczsKLSAgICBwcml2YXRlIE1ldGhvZERhdGFbXSBtU29ydGVkTWV0aG9kczsKLSAgICBwcml2YXRlIGxvbmcgbUdsb2JhbEVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBNZXRob2REYXRhIG1Db250ZXh0U3dpdGNoOwotICAgIHByaXZhdGUgaW50IG1PZmZzZXRUb0RhdGE7Ci0gICAgcHJpdmF0ZSBieXRlW10gbUJ5dGVzID0gbmV3IGJ5dGVbOF07Ci0KLSAgICAvLyBBIHJlZ2V4IGZvciBtYXRjaGluZyB0aGUgdGhyZWFkICJpZCBuYW1lIiBsaW5lcyBpbiB0aGUgLmtleSBmaWxlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBtSWROYW1lUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFxcZCspXHQoLiopIik7ICAvLyAkTk9OLU5MUy0xJAotCi0gICAgRG1UcmFjZVJlYWRlcihTdHJpbmcgdHJhY2VGaWxlTmFtZSwgYm9vbGVhbiByZWdyZXNzaW9uKSB7Ci0gICAgICAgIG1UcmFjZUZpbGVOYW1lID0gdHJhY2VGaWxlTmFtZTsKLSAgICAgICAgbVJlZ3Jlc3Npb24gPSByZWdyZXNzaW9uOwotICAgICAgICBtTWV0aG9kTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTWV0aG9kRGF0YT4oKTsKLSAgICAgICAgbVRocmVhZE1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFRocmVhZERhdGE+KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgc2luZ2xlIHRvcC1sZXZlbCBNZXRob2REYXRhIG9iamVjdCB0byBob2xkIHRoZSBwcm9maWxlIGRhdGEKLSAgICAgICAgLy8gZm9yIHRpbWUgc3BlbnQgaW4gdGhlIHVua25vd24gY2FsbGVyLgotICAgICAgICBtVG9wTGV2ZWwgPSBuZXcgTWV0aG9kRGF0YSgwLCAiKHRvcGxldmVsKSIpOwotICAgICAgICBtQ29udGV4dFN3aXRjaCA9IG5ldyBNZXRob2REYXRhKC0xLCAiKGNvbnRleHQgc3dpdGNoKSIpOwotICAgICAgICBtTWV0aG9kTWFwLnB1dCgwLCBtVG9wTGV2ZWwpOwotICAgICAgICBnZW5lcmF0ZVRyZWVzKCk7Ci0gICAgICAgIC8vIGR1bXBUcmVlcygpOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGVUcmVlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgb2Zmc2V0ID0gcGFyc2VLZXlzKCk7Ci0gICAgICAgICAgICBwYXJzZURhdGEob2Zmc2V0KTsKLSAgICAgICAgICAgIGFuYWx5emVEYXRhKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcm9maWxlUHJvdmlkZXIgZ2V0UHJvZmlsZVByb3ZpZGVyKCkgewotICAgICAgICBpZiAobVByb2ZpbGVQcm92aWRlciA9PSBudWxsKQotICAgICAgICAgICAgbVByb2ZpbGVQcm92aWRlciA9IG5ldyBQcm9maWxlUHJvdmlkZXIodGhpcyk7Ci0gICAgICAgIHJldHVybiBtUHJvZmlsZVByb3ZpZGVyOwotICAgIH0KLQotICAgIENhbGwgcmVhZENhbGwoTWFwcGVkQnl0ZUJ1ZmZlciBidWZmZXIsIENhbGwgY2FsbCkgewotICAgICAgICBpbnQgdGhyZWFkSWQ7Ci0gICAgICAgIGludCBtZXRob2RJZDsKLSAgICAgICAgbG9uZyB0aW1lOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtVmVyc2lvbk51bWJlciA9PSAxKQotICAgICAgICAgICAgICAgIHRocmVhZElkID0gYnVmZmVyLmdldCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocmVhZElkID0gYnVmZmVyLmdldFNob3J0KCk7Ci0gICAgICAgICAgICBtZXRob2RJZCA9IGJ1ZmZlci5nZXRJbnQoKTsKLSAgICAgICAgICAgIHRpbWUgPSBidWZmZXIuZ2V0SW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBtZXRob2RBY3Rpb24gPSBtZXRob2RJZCAmIDB4MDM7Ci0gICAgICAgIG1ldGhvZElkID0gbWV0aG9kSWQgJiB+MHgwMzsKLSAgICAgICAgTWV0aG9kRGF0YSBtZXRob2REYXRhID0gbU1ldGhvZE1hcC5nZXQobWV0aG9kSWQpOwotICAgICAgICBpZiAobWV0aG9kRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFN0cmluZy5mb3JtYXQoIigweCUxJHgpIiwgbWV0aG9kSWQpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1ldGhvZERhdGEgPSBuZXcgTWV0aG9kRGF0YShtZXRob2RJZCwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjYWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhbGwuc2V0KHRocmVhZElkLCBtZXRob2REYXRhLCB0aW1lLCBtZXRob2RBY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FsbCA9IG5ldyBDYWxsKHRocmVhZElkLCBtZXRob2REYXRhLCB0aW1lLCBtZXRob2RBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1hcHBlZEJ5dGVCdWZmZXIgbWFwRmlsZShTdHJpbmcgZmlsZW5hbWUsIGxvbmcgb2Zmc2V0KSB7Ci0gICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBkYXRhRmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgRmlsZUNoYW5uZWwgZmMgPSBkYXRhRmlsZS5nZXRDaGFubmVsKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSBmYy5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIG9mZnNldCwgZmlsZS5sZW5ndGgoKSAtIG9mZnNldCk7Ci0gICAgICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZERhdGFGaWxlSGVhZGVyKE1hcHBlZEJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIGludCBtYWdpYyA9IGJ1ZmZlci5nZXRJbnQoKTsKLSAgICAgICAgaWYgKG1hZ2ljICE9IFRSQUNFX01BR0lDKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBtYWdpYyBudW1iZXIgbWlzbWF0Y2g7IGdvdCAweCV4LCBleHBlY3RlZCAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBtYWdpYywgVFJBQ0VfTUFHSUMpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAvLyByZWFkIHZlcnNpb24KLSAgICAgICAgaW50IHZlcnNpb24gPSBidWZmZXIuZ2V0U2hvcnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJlYWQgb2Zmc2V0Ci0gICAgICAgIG1PZmZzZXRUb0RhdGEgPSBidWZmZXIuZ2V0U2hvcnQoKSAtIDE2OwotICAgICAgICAKLSAgICAgICAgLy8gcmVhZCBzdGFydFdoZW4KLSAgICAgICAgYnVmZmVyLmdldExvbmcoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNraXAgb3ZlciAibU9mZnNldFRvRGF0YSIgYnl0ZXMKLSAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1PZmZzZXRUb0RhdGE7IGlpKyspIHsKLSAgICAgICAgICAgIGJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2F2ZSB0aGlzIHBvc2l0aW9uIHNvIHRoYXQgd2UgY2FuIHJlLXJlYWQgdGhlIGRhdGEgbGF0ZXIKLSAgICAgICAgYnVmZmVyLm1hcmsoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VEYXRhKGxvbmcgb2Zmc2V0KSB7Ci0gICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgYnVmZmVyID0gbWFwRmlsZShtVHJhY2VGaWxlTmFtZSwgb2Zmc2V0KTsKLSAgICAgICAgcmVhZERhdGFGaWxlSGVhZGVyKGJ1ZmZlcik7Ci0gICAgICAgIHBhcnNlRGF0YVBhc3MxKGJ1ZmZlcik7Ci0gICAgICAgIAotICAgICAgICBidWZmZXIucmVzZXQoKTsKLSAgICAgICAgcGFyc2VEYXRhUGFzczIoYnVmZmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlRGF0YVBhc3MxKE1hcHBlZEJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIG1Td2l0Y2hMaXN0ID0gbmV3IEFycmF5TGlzdDxDYWxsPigpOwotCi0gICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGNhbGwgc28gdGhhdCB3ZSBjYW4gc2V0ICJwcmV2VGhyZWFkRGF0YSIKLSAgICAgICAgQ2FsbCBjYWxsID0gbmV3IENhbGwoKTsKLSAgICAgICAgY2FsbCA9IHJlYWRDYWxsKGJ1ZmZlciwgY2FsbCk7Ci0gICAgICAgIGlmIChjYWxsID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGxvbmcgY2FsbFRpbWUgPSBjYWxsLm1UaHJlYWRTdGFydFRpbWU7Ci0gICAgICAgIGxvbmcgcHJldkNhbGxUaW1lID0gMDsKLSAgICAgICAgVGhyZWFkRGF0YSB0aHJlYWREYXRhID0gbVRocmVhZE1hcC5nZXQoY2FsbC5nZXRUaHJlYWRJZCgpKTsKLSAgICAgICAgaWYgKHRocmVhZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmcuZm9ybWF0KCJbJTEkZF0iLCBjYWxsLmdldFRocmVhZElkKCkpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRocmVhZERhdGEgPSBuZXcgVGhyZWFkRGF0YShjYWxsLmdldFRocmVhZElkKCksIG5hbWUsIG1Ub3BMZXZlbCk7Ci0gICAgICAgICAgICBtVGhyZWFkTWFwLnB1dChjYWxsLmdldFRocmVhZElkKCksIHRocmVhZERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIFRocmVhZERhdGEgcHJldlRocmVhZERhdGEgPSB0aHJlYWREYXRhOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgLy8gSWYgYSBjb250ZXh0IHN3aXRjaCBvY2N1cnJlZCwgdGhlbiBpbnNlcnQgYSBwbGFjZWhvbGRlciAiY2FsbCIKLSAgICAgICAgICAgIC8vIHJlY29yZCBzbyB0aGF0IHdlIGNhbiBkbyBzb21ldGhpbmcgcmVhc29uYWJsZSB3aXRoIHRoZSBnbG9iYWwKLSAgICAgICAgICAgIC8vIHRpbWVzdGFtcHMuCi0gICAgICAgICAgICBpZiAocHJldlRocmVhZERhdGEgIT0gdGhyZWFkRGF0YSkgewotICAgICAgICAgICAgICAgIENhbGwgc3dpdGNoRW50ZXIgPSBuZXcgQ2FsbChwcmV2VGhyZWFkRGF0YS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHRTd2l0Y2gsIHByZXZDYWxsVGltZSwgMCk7Ci0gICAgICAgICAgICAgICAgcHJldlRocmVhZERhdGEuc2V0TGFzdENvbnRleHRTd2l0Y2goc3dpdGNoRW50ZXIpOwotICAgICAgICAgICAgICAgIG1Td2l0Y2hMaXN0LmFkZChzd2l0Y2hFbnRlcik7Ci0gICAgICAgICAgICAgICAgQ2FsbCBjb250ZXh0U3dpdGNoID0gdGhyZWFkRGF0YS5nZXRMYXN0Q29udGV4dFN3aXRjaCgpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0U3dpdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBwcmV2U3RhcnRUaW1lID0gY29udGV4dFN3aXRjaC5tVGhyZWFkU3RhcnRUaW1lOwotICAgICAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBjYWxsVGltZSAtIHByZXZTdGFydFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgYmVmb3JlU3dpdGNoID0gZWxhcHNlZCAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgYWZ0ZXJTd2l0Y2ggPSBlbGFwc2VkIC0gYmVmb3JlU3dpdGNoOwotICAgICAgICAgICAgICAgICAgICBsb25nIGV4aXRUaW1lID0gY2FsbFRpbWUgLSBhZnRlclN3aXRjaDsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dFN3aXRjaC5tVGhyZWFkU3RhcnRUaW1lID0gcHJldlN0YXJ0VGltZSArIGJlZm9yZVN3aXRjaDsKLSAgICAgICAgICAgICAgICAgICAgQ2FsbCBzd2l0Y2hFeGl0ID0gbmV3IENhbGwodGhyZWFkRGF0YS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0U3dpdGNoLCBleGl0VGltZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtU3dpdGNoTGlzdC5hZGQoc3dpdGNoRXhpdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZUaHJlYWREYXRhID0gdGhyZWFkRGF0YTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBjYWxsCi0gICAgICAgICAgICBjYWxsID0gcmVhZENhbGwoYnVmZmVyLCBjYWxsKTsKLSAgICAgICAgICAgIGlmIChjYWxsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZDYWxsVGltZSA9IGNhbGxUaW1lOwotICAgICAgICAgICAgY2FsbFRpbWUgPSBjYWxsLm1UaHJlYWRTdGFydFRpbWU7Ci0KLSAgICAgICAgICAgIHRocmVhZERhdGEgPSBtVGhyZWFkTWFwLmdldChjYWxsLmdldFRocmVhZElkKCkpOwotICAgICAgICAgICAgaWYgKHRocmVhZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gU3RyaW5nLmZvcm1hdCgiWyVkXSIsIGNhbGwuZ2V0VGhyZWFkSWQoKSk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkRGF0YSA9IG5ldyBUaHJlYWREYXRhKGNhbGwuZ2V0VGhyZWFkSWQoKSwgbmFtZSwgbVRvcExldmVsKTsKLSAgICAgICAgICAgICAgICBtVGhyZWFkTWFwLnB1dChjYWxsLmdldFRocmVhZElkKCksIHRocmVhZERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZURhdGFQYXNzMihNYXBwZWRCeXRlQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICBtQ2FsbExpc3QgPSBuZXcgQXJyYXlMaXN0PENhbGw+KCk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgY2FsbCBzbyB0aGF0IHdlIGNhbiBzZXQgInByZXZUaHJlYWREYXRhIgotICAgICAgICBDYWxsIGNhbGwgPSByZWFkQ2FsbChidWZmZXIsIG51bGwpOwotICAgICAgICBsb25nIGNhbGxUaW1lID0gY2FsbC5tVGhyZWFkU3RhcnRUaW1lOwotICAgICAgICBsb25nIHByZXZDYWxsVGltZSA9IGNhbGxUaW1lOwotICAgICAgICBUaHJlYWREYXRhIHRocmVhZERhdGEgPSBtVGhyZWFkTWFwLmdldChjYWxsLmdldFRocmVhZElkKCkpOwotICAgICAgICBUaHJlYWREYXRhIHByZXZUaHJlYWREYXRhID0gdGhyZWFkRGF0YTsKLSAgICAgICAgdGhyZWFkRGF0YS5zZXRHbG9iYWxTdGFydFRpbWUoMCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgbnRoQ29udGV4dFN3aXRjaCA9IDA7Ci0KLSAgICAgICAgLy8gQXNzaWduIGEgZ2xvYmFsIHRpbWVzdGFtcCB0byBlYWNoIGV2ZW50LgotICAgICAgICBsb25nIGdsb2JhbFRpbWUgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gY2FsbFRpbWUgLSBwcmV2Q2FsbFRpbWU7Ci0gICAgICAgICAgICBpZiAodGhyZWFkRGF0YSAhPSBwcmV2VGhyZWFkRGF0YSkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCBjb250ZXh0IHN3aXRjaC4gIFRoaXMgb25lIGlzIGVudGVyZWQKLSAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJldmlvdXMgdGhyZWFkLgotICAgICAgICAgICAgICAgIENhbGwgY29udGV4dFN3aXRjaCA9IG1Td2l0Y2hMaXN0LmdldChudGhDb250ZXh0U3dpdGNoKyspOwotICAgICAgICAgICAgICAgIG1DYWxsTGlzdC5hZGQoY29udGV4dFN3aXRjaCk7Ci0gICAgICAgICAgICAgICAgZWxhcHNlZCA9IGNvbnRleHRTd2l0Y2gubVRocmVhZFN0YXJ0VGltZSAtIHByZXZDYWxsVGltZTsKLSAgICAgICAgICAgICAgICBnbG9iYWxUaW1lICs9IGVsYXBzZWQ7Ci0gICAgICAgICAgICAgICAgZWxhcHNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgY29udGV4dFN3aXRjaC5tR2xvYmFsU3RhcnRUaW1lID0gZ2xvYmFsVGltZTsKLSAgICAgICAgICAgICAgICBwcmV2VGhyZWFkRGF0YS5oYW5kbGVDYWxsKGNvbnRleHRTd2l0Y2gsIGdsb2JhbFRpbWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghdGhyZWFkRGF0YS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb250ZXh0IHN3aXRjaCBpcyBleGl0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3dpdGNoID0gbVN3aXRjaExpc3QuZ2V0KG50aENvbnRleHRTd2l0Y2grKyk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsTGlzdC5hZGQoY29udGV4dFN3aXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRTd2l0Y2gubUdsb2JhbFN0YXJ0VGltZSA9IGdsb2JhbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSBjYWxsVGltZSAtIGNvbnRleHRTd2l0Y2gubVRocmVhZFN0YXJ0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkRGF0YS5oYW5kbGVDYWxsKGNvbnRleHRTd2l0Y2gsIGdsb2JhbFRpbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQncyBnbG9iYWwgc3RhcnQgdGltZSBoYXMgbm90IGJlZW4gc2V0IHlldCwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHNldCBpdC4KLSAgICAgICAgICAgICAgICBpZiAodGhyZWFkRGF0YS5nZXRHbG9iYWxTdGFydFRpbWUoKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkRGF0YS5zZXRHbG9iYWxTdGFydFRpbWUoZ2xvYmFsVGltZSk7Ci0gICAgICAgICAgICAgICAgcHJldlRocmVhZERhdGEgPSB0aHJlYWREYXRhOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBnbG9iYWxUaW1lICs9IGVsYXBzZWQ7Ci0gICAgICAgICAgICBjYWxsLm1HbG9iYWxTdGFydFRpbWUgPSBnbG9iYWxUaW1lOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJlYWREYXRhLmhhbmRsZUNhbGwoY2FsbCwgZ2xvYmFsVGltZSk7Ci0gICAgICAgICAgICBtQ2FsbExpc3QuYWRkKGNhbGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGNhbGwKLSAgICAgICAgICAgIGNhbGwgPSByZWFkQ2FsbChidWZmZXIsIG51bGwpOwotICAgICAgICAgICAgaWYgKGNhbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkNhbGxUaW1lID0gY2FsbFRpbWU7Ci0gICAgICAgICAgICBjYWxsVGltZSA9IGNhbGwubVRocmVhZFN0YXJ0VGltZTsKLSAgICAgICAgICAgIHRocmVhZERhdGEgPSBtVGhyZWFkTWFwLmdldChjYWxsLmdldFRocmVhZElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsb3cgZWFjaCB0aHJlYWQgdG8gZG8gYW55IGNsZWFudXAgb2YgdGhlIGNhbGwgc3RhY2suCi0gICAgICAgIC8vIEFsc28gYWRkIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2ggdGhyZWFkIHRvIHRoZSB0b3BsZXZlbAotICAgICAgICAvLyBtZXRob2QncyBpbmNsdXNpdmUgdGltZS4KLSAgICAgICAgZm9yIChpbnQgaWQgOiBtVGhyZWFkTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICB0aHJlYWREYXRhID0gbVRocmVhZE1hcC5nZXQoaWQpOwotICAgICAgICAgICAgbG9uZyBlbmRUaW1lID0gdGhyZWFkRGF0YS5lbmRUcmFjZSgpOwotICAgICAgICAgICAgaWYgKGVuZFRpbWUgPiAwKQotICAgICAgICAgICAgICAgIG1Ub3BMZXZlbC5hZGRFbGFwc2VkSW5jbHVzaXZlKGVuZFRpbWUsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1HbG9iYWxFbmRUaW1lID0gZ2xvYmFsVGltZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtUmVncmVzc2lvbikgewotICAgICAgICAgICAgZHVtcENhbGxUaW1lcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBQQVJTRV9WRVJTSU9OID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RIUkVBRFMgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfTUVUSE9EUyA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBQQVJTRV9PUFRJT05TID0gNDsKLQotICAgIGxvbmcgcGFyc2VLZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobVRyYWNlRmlsZU5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW50IG1vZGUgPSBQQVJTRV9WRVJTSU9OOwotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIktleSBzZWN0aW9uIGRvZXMgbm90IGhhdmUgYW4gKmVuZCBtYXJrZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHdlIGhhdmUgcmVhZCBmcm9tIHRoZSBmaWxlIHNvIGZhci4gIFRoZQotICAgICAgICAgICAgLy8gZXh0cmEgYnl0ZSBpcyBmb3IgdGhlIGxpbmUgZW5kaW5nIG5vdCBpbmNsdWRlZCBieSByZWFkTGluZSgpLgotICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmUubGVuZ3RoKCkgKyAxOwotICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiKiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIqdmVyc2lvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGUgPSBQQVJTRV9WRVJTSU9OOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIqdGhyZWFkcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGUgPSBQQVJTRV9USFJFQURTOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIqbWV0aG9kcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGUgPSBQQVJTRV9NRVRIT0RTOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIqZW5kIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBtVmVyc2lvbk51bWJlciA9IEludGVnZXIuZGVjb2RlKGxpbmUpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBQQVJTRV9PUFRJT05TOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9USFJFQURTOgotICAgICAgICAgICAgICAgIHBhcnNlVGhyZWFkKGxpbmUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9NRVRIT0RTOgotICAgICAgICAgICAgICAgIHBhcnNlTWV0aG9kKGxpbmUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9PUFRJT05TOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZVRocmVhZChTdHJpbmcgbGluZSkgewotICAgICAgICBTdHJpbmcgaWRTdHIgPSBudWxsOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IG1JZE5hbWVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgaWRTdHIgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgbmFtZSA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlkU3RyID09IG51bGwpIHJldHVybjsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgbmFtZSA9ICIodW5rbm93bikiOwotCi0gICAgICAgIGludCBpZCA9IEludGVnZXIuZGVjb2RlKGlkU3RyKTsKLSAgICAgICAgbVRocmVhZE1hcC5wdXQoaWQsIG5ldyBUaHJlYWREYXRhKGlkLCBuYW1lLCBtVG9wTGV2ZWwpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHBhcnNlTWV0aG9kKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFN0cmluZ1tdIHRva2VucyA9IGxpbmUuc3BsaXQoIlx0Iik7Ci0gICAgICAgIGludCBpZCA9IExvbmcuZGVjb2RlKHRva2Vuc1swXSkuaW50VmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHRva2Vuc1sxXTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhdGhuYW1lID0gbnVsbDsKLSAgICAgICAgaW50IGxpbmVOdW1iZXIgPSAtMTsKLSAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gNikgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHRva2Vuc1syXTsKLSAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRva2Vuc1szXTsKLSAgICAgICAgICAgIHBhdGhuYW1lID0gdG9rZW5zWzRdOwotICAgICAgICAgICAgbGluZU51bWJlciA9IEludGVnZXIuZGVjb2RlKHRva2Vuc1s1XSk7Ci0gICAgICAgICAgICBwYXRobmFtZSA9IGNvbnN0cnVjdFBhdGhuYW1lKGNsYXNzTmFtZSwgcGF0aG5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICBpZiAodG9rZW5zWzNdLnN0YXJ0c1dpdGgoIigiKSkgewotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSB0b2tlbnNbMl07Ci0gICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gdG9rZW5zWzNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXRobmFtZSA9IHRva2Vuc1syXTsKLSAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gSW50ZWdlci5kZWNvZGUodG9rZW5zWzNdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1NZXRob2RNYXAucHV0KGlkLCBuZXcgTWV0aG9kRGF0YShpZCwgY2xhc3NOYW1lLCBtZXRob2ROYW1lLCBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgcGF0aG5hbWUsIGxpbmVOdW1iZXIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25zdHJ1Y3RQYXRobmFtZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGF0aG5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBjbGFzc05hbWUubGVuZ3RoKCkgLSAxCi0gICAgICAgICAgICAgICAgJiYgcGF0aG5hbWUuZW5kc1dpdGgoIi5qYXZhIikpCi0gICAgICAgICAgICBwYXRobmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSArIHBhdGhuYW1lOwotICAgICAgICByZXR1cm4gcGF0aG5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuYWx5emVEYXRhKCkgewotICAgICAgICAvLyBTb3J0IHRoZSB0aHJlYWRzIGludG8gZGVjcmVhc2luZyBjcHUgdGltZQotICAgICAgICBDb2xsZWN0aW9uPFRocmVhZERhdGE+IHR2ID0gbVRocmVhZE1hcC52YWx1ZXMoKTsKLSAgICAgICAgbVNvcnRlZFRocmVhZHMgPSB0di50b0FycmF5KG5ldyBUaHJlYWREYXRhW3R2LnNpemUoKV0pOwotICAgICAgICBBcnJheXMuc29ydChtU29ydGVkVGhyZWFkcywgbmV3IENvbXBhcmF0b3I8VGhyZWFkRGF0YT4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVGhyZWFkRGF0YSB0ZDEsIFRocmVhZERhdGEgdGQyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRkMi5nZXRDcHVUaW1lKCkgPiB0ZDEuZ2V0Q3B1VGltZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBpZiAodGQyLmdldENwdVRpbWUoKSA8IHRkMS5nZXRDcHVUaW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGQyLmdldE5hbWUoKS5jb21wYXJlVG8odGQxLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEFuYWx5emUgdGhlIGNhbGwgdHJlZSBzbyB0aGF0IHdlIGNhbiBsYWJlbCB0aGUgIndvcnN0IiBjaGlsZHJlbi4KLSAgICAgICAgLy8gQWxzbyBzZXQgYWxsIHRoZSByb290IHBvaW50ZXJzIGluIGVhY2ggbm9kZSBpbiB0aGUgY2FsbCB0cmVlLgotICAgICAgICBsb25nIHN1bSA9IDA7Ci0gICAgICAgIGZvciAoVGhyZWFkRGF0YSB0IDogbVNvcnRlZFRocmVhZHMpIHsKLSAgICAgICAgICAgIGlmICh0LmlzRW1wdHkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIENhbGwgcm9vdCA9IHQuZ2V0Q2FsbHRyZWVSb290KCk7Ci0gICAgICAgICAgICAgICAgcm9vdC5tR2xvYmFsU3RhcnRUaW1lID0gdC5nZXRHbG9iYWxTdGFydFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNvcnQgdGhlIG1ldGhvZHMgaW50byBkZWNyZWFzaW5nIGluY2x1c2l2ZSB0aW1lCi0gICAgICAgIENvbGxlY3Rpb248TWV0aG9kRGF0YT4gbXYgPSBtTWV0aG9kTWFwLnZhbHVlcygpOwotICAgICAgICBNZXRob2REYXRhW10gbWV0aG9kczsKLSAgICAgICAgbWV0aG9kcyA9IG12LnRvQXJyYXkobmV3IE1ldGhvZERhdGFbbXYuc2l6ZSgpXSk7Ci0gICAgICAgIEFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yPE1ldGhvZERhdGE+KCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1ldGhvZERhdGEgbWQxLCBNZXRob2REYXRhIG1kMikgewotICAgICAgICAgICAgICAgIGlmIChtZDIuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpID4gbWQxLmdldEVsYXBzZWRJbmNsdXNpdmUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgaWYgKG1kMi5nZXRFbGFwc2VkSW5jbHVzaXZlKCkgPCBtZDEuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1kMS5nZXROYW1lKCkuY29tcGFyZVRvKG1kMi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgd2l0aCBub24temVybyBpbmNsdXNpdmUgdGltZQotICAgICAgICBpbnQgbm9uWmVybyA9IDA7Ci0gICAgICAgIGZvciAoTWV0aG9kRGF0YSBtZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChtZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG5vblplcm8gKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvcHkgdGhlIG1ldGhvZHMgd2l0aCBub24temVybyB0aW1lCi0gICAgICAgIG1Tb3J0ZWRNZXRob2RzID0gbmV3IE1ldGhvZERhdGFbbm9uWmVyb107Ci0gICAgICAgIGludCBpaSA9IDA7Ci0gICAgICAgIGZvciAoTWV0aG9kRGF0YSBtZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChtZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG1kLnNldFJhbmsoaWkpOwotICAgICAgICAgICAgbVNvcnRlZE1ldGhvZHNbaWkrK10gPSBtZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExldCBlYWNoIG1ldGhvZCBhbmFseXplIGl0cyBwcm9maWxlIGRhdGEKLSAgICAgICAgZm9yIChNZXRob2REYXRhIG1kIDogbVNvcnRlZE1ldGhvZHMpIHsKLSAgICAgICAgICAgIG1kLmFuYWx5emVEYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgYWxsIHRoZSBjYWxscyB0byBpbmNsdWRlIHRoZSBtZXRob2QgcmFuayBpbgotICAgICAgICAvLyB0aGVpciBuYW1lLgotICAgICAgICBmb3IgKENhbGwgY2FsbCA6IG1DYWxsTGlzdCkgewotICAgICAgICAgICAgY2FsbC51cGRhdGVOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtUmVncmVzc2lvbikgewotICAgICAgICAgICAgZHVtcE1ldGhvZFN0YXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgbWV0aG9kIGNvbXB1dGVzIGEgbGlzdCBvZiByZWNvcmRzIHRoYXQgZGVzY3JpYmUgdGhlIHRoZSBleGVjdXRpb24KLSAgICAgKiB0aW1lbGluZSBmb3IgZWFjaCB0aHJlYWQuIEVhY2ggcmVjb3JkIGlzIGEgcGFpcjogKHJvdywgYmxvY2spIHdoZXJlOiByb3c6Ci0gICAgICogaXMgdGhlIFRocmVhZERhdGEgb2JqZWN0IGJsb2NrOiBpcyB0aGUgY2FsbCAoY29udGFpbmluZyB0aGUgc3RhcnQgYW5kIGVuZAotICAgICAqIHRpbWVzKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBcnJheUxpc3Q8VGltZUxpbmVWaWV3LlJlY29yZD4gZ2V0VGhyZWFkVGltZVJlY29yZHMoKSB7Ci0gICAgICAgIFRpbWVMaW5lVmlldy5SZWNvcmQgcmVjb3JkOwotICAgICAgICBBcnJheUxpc3Q8VGltZUxpbmVWaWV3LlJlY29yZD4gdGltZVJlY3M7Ci0gICAgICAgIHRpbWVSZWNzID0gbmV3IEFycmF5TGlzdDxUaW1lTGluZVZpZXcuUmVjb3JkPigpOwotCi0gICAgICAgIC8vIEZvciBlYWNoIHRocmVhZCwgcHVzaCBhICJ0b3BsZXZlbCIgY2FsbCB0aGF0IGVuY29tcGFzc2VzIHRoZQotICAgICAgICAvLyBlbnRpcmUgZXhlY3V0aW9uIG9mIHRoZSB0aHJlYWQuCi0gICAgICAgIGZvciAoVGhyZWFkRGF0YSB0aHJlYWREYXRhIDogbVNvcnRlZFRocmVhZHMpIHsKLSAgICAgICAgICAgIGlmICghdGhyZWFkRGF0YS5pc0VtcHR5KCkgJiYgdGhyZWFkRGF0YS5nZXRJZCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBDYWxsIGNhbGwgPSBuZXcgQ2FsbCh0aHJlYWREYXRhLmdldElkKCksIG1Ub3BMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZERhdGEuZ2V0R2xvYmFsU3RhcnRUaW1lKCksIDApOwotICAgICAgICAgICAgICAgIGNhbGwubUdsb2JhbFN0YXJ0VGltZSA9IHRocmVhZERhdGEuZ2V0R2xvYmFsU3RhcnRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgY2FsbC5tR2xvYmFsRW5kVGltZSA9IHRocmVhZERhdGEuZ2V0R2xvYmFsRW5kVGltZSgpOwotICAgICAgICAgICAgICAgIHJlY29yZCA9IG5ldyBUaW1lTGluZVZpZXcuUmVjb3JkKHRocmVhZERhdGEsIGNhbGwpOwotICAgICAgICAgICAgICAgIHRpbWVSZWNzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDYWxsIGNhbGwgOiBtQ2FsbExpc3QpIHsKLSAgICAgICAgICAgIGlmIChjYWxsLmdldE1ldGhvZEFjdGlvbigpICE9IDAgfHwgY2FsbC5nZXRUaHJlYWRJZCgpID09IDApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBUaHJlYWREYXRhIHRocmVhZERhdGEgPSBtVGhyZWFkTWFwLmdldChjYWxsLmdldFRocmVhZElkKCkpOwotICAgICAgICAgICAgcmVjb3JkID0gbmV3IFRpbWVMaW5lVmlldy5SZWNvcmQodGhyZWFkRGF0YSwgY2FsbCk7Ci0gICAgICAgICAgICB0aW1lUmVjcy5hZGQocmVjb3JkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1SZWdyZXNzaW9uKSB7Ci0gICAgICAgICAgICBkdW1wVGltZVJlY3ModGltZVJlY3MpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRpbWVSZWNzOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBDYWxsVGltZXMoKSB7Ci0gICAgICAgIFN0cmluZyBhY3Rpb247Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiaWQgdGhyZWFkICBnbG9iYWwgc3RhcnQsZW5kICAgbWV0aG9kXG4iKTsKLSAgICAgICAgZm9yIChDYWxsIGNhbGwgOiBtQ2FsbExpc3QpIHsKLSAgICAgICAgICAgIGlmIChjYWxsLmdldE1ldGhvZEFjdGlvbigpID09IDApIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSAiKyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFjdGlvbiA9ICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvbmcgY2FsbFRpbWUgPSBjYWxsLm1UaHJlYWRTdGFydFRpbWU7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiJTJkICU2ZCAlOGQgJThkICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBjYWxsLmdldFRocmVhZElkKCksIGNhbGxUaW1lLCBjYWxsLm1HbG9iYWxTdGFydFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNhbGwubUdsb2JhbEVuZFRpbWUsIGFjdGlvbiwgY2FsbC5nZXRNZXRob2REYXRhKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICAgICAgaWYgKGNhbGwuZ2V0TWV0aG9kQWN0aW9uKCkgPT0gMCAmJiBjYWxsLmdldEdsb2JhbEVuZFRpbWUoKSA8IGNhbGwuZ2V0R2xvYmFsU3RhcnRUaW1lKCkpIHsKLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJlbmR0aW1lICVkIDwgc3RhcnRUaW1lICVkXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBjYWxsLmdldEdsb2JhbEVuZFRpbWUoKSwgY2FsbC5nZXRHbG9iYWxTdGFydFRpbWUoKSk7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZHVtcE1ldGhvZFN0YXRzKCkgewotICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiXG5FeGNsdXNpdmUgSW5jbHVzaXZlICAgICBDYWxscyAgTWV0aG9kXG4iKTsKLSAgICAgICAgZm9yIChNZXRob2REYXRhIG1kIDogbVNvcnRlZE1ldGhvZHMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCIlOWQgJTlkICU5cyAgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1kLmdldEVsYXBzZWRFeGNsdXNpdmUoKSwgbWQuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpLAotICAgICAgICAgICAgICAgICAgICBtZC5nZXRDYWxscygpLCBtZC5nZXRQcm9maWxlTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wVGltZVJlY3MoQXJyYXlMaXN0PFRpbWVMaW5lVmlldy5SZWNvcmQ+IHRpbWVSZWNzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJcbmlkIHRocmVhZCAgZ2xvYmFsIHN0YXJ0LGVuZCAgbWV0aG9kXG4iKTsKLSAgICAgICAgZm9yIChUaW1lTGluZVZpZXcuUmVjb3JkIHJlY29yZCA6IHRpbWVSZWNzKSB7Ci0gICAgICAgICAgICBDYWxsIGNhbGwgPSAoQ2FsbCkgcmVjb3JkLmJsb2NrOwotICAgICAgICAgICAgbG9uZyBjYWxsVGltZSA9IGNhbGwubVRocmVhZFN0YXJ0VGltZTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCIlMmQgJTZkICU4ZCAlOGQgICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBjYWxsLmdldFRocmVhZElkKCksIGNhbGxUaW1lLAotICAgICAgICAgICAgICAgICAgICBjYWxsLm1HbG9iYWxTdGFydFRpbWUsIGNhbGwubUdsb2JhbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNhbGwuZ2V0TWV0aG9kRGF0YSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldFRocmVhZExhYmVscygpIHsKLSAgICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGxhYmVscyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChUaHJlYWREYXRhIHQgOiBtVGhyZWFkTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBsYWJlbHMucHV0KHQuZ2V0SWQoKSwgdC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYWJlbHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1ldGhvZERhdGFbXSBnZXRNZXRob2RzKCkgewotICAgICAgICByZXR1cm4gbVNvcnRlZE1ldGhvZHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRocmVhZERhdGFbXSBnZXRUaHJlYWRzKCkgewotICAgICAgICByZXR1cm4gbVNvcnRlZFRocmVhZHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0RW5kVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HbG9iYWxFbmRUaW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L01haW5XaW5kb3cuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L01haW5XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmY2M4Yi4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9NYWluV2luZG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudHJhY2V2aWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2Rrc3RhdHMuU2RrU3RhdHNTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE1haW5XaW5kb3cgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUElOR19OQU1FID0gIlRyYWNldmlldyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBJTkdfVkVSU0lPTiA9ICIxLjAiOwotCi0gICAgcHJpdmF0ZSBUcmFjZVJlYWRlciBtUmVhZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIG1UcmFjZU5hbWU7Ci0KLSAgICAvLyBBIGdsb2JhbCBjYWNoZSBvZiBzdHJpbmcgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzU3RyaW5nQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIHB1YmxpYyBNYWluV2luZG93KFN0cmluZyB0cmFjZU5hbWUsIFRyYWNlUmVhZGVyIHJlYWRlcikgewotICAgICAgICBzdXBlcihudWxsKTsKLSAgICAgICAgbVJlYWRlciA9IHJlYWRlcjsKLSAgICAgICAgbVRyYWNlTmFtZSA9IHRyYWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICBvcGVuKCk7Ci0gICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIlRyYWNldmlldzogIiArIG1UcmFjZU5hbWUpOwotICAgICAgICBzaGVsbC5zZXRCb3VuZHMoMTAwLCAxMCwgMTI4MiwgOTAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbG9yQ29udHJvbGxlci5hc3NpZ25NZXRob2RDb2xvcnMocGFyZW50LmdldERpc3BsYXkoKSwgbVJlYWRlci5nZXRNZXRob2RzKCkpOwotICAgICAgICBTZWxlY3Rpb25Db250cm9sbGVyIHNlbGVjdGlvbkNvbnRyb2xsZXIgPSBuZXcgU2VsZWN0aW9uQ29udHJvbGxlcigpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICAgICAgcGFyZW50LnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotICAgICAgICBDb2xvciBkYXJrR3JheSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgc2FzaCBmb3JtIHRvIHNlcGFyYXRlIHRoZSB0aW1lbGluZSB2aWV3IChvbiB0b3ApCi0gICAgICAgIC8vIGFuZCB0aGUgcHJvZmlsZSB2aWV3IChvbiBib3R0b20pCi0gICAgICAgIFNhc2hGb3JtIHNhc2hGb3JtMSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0gICAgICAgIHNhc2hGb3JtMS5zZXRCYWNrZ3JvdW5kKGRhcmtHcmF5KTsKLSAgICAgICAgc2FzaEZvcm0xLlNBU0hfV0lEVEggPSAzOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIHNhc2hGb3JtMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgdGltZWxpbmUgdmlldwotICAgICAgICBuZXcgVGltZUxpbmVWaWV3KHNhc2hGb3JtMSwgbVJlYWRlciwgc2VsZWN0aW9uQ29udHJvbGxlcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBwcm9maWxlIHZpZXcKLSAgICAgICAgbmV3IFByb2ZpbGVWaWV3KHNhc2hGb3JtMSwgbVJlYWRlciwgc2VsZWN0aW9uQ29udHJvbGxlcik7Ci0gICAgICAgIHJldHVybiBzYXNoRm9ybTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCB0aGUgb2xkIHR3by1maWxlIGZvcm1hdCBpbnRvIHRoZSBjdXJyZW50IGNvbmNhdGVuYXRlZCBvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZSBCYXNlIHBhdGggb2YgdGhlIHR3byBmaWxlcywgaS5lLiBiYXNlLmtleSBhbmQgYmFzZS5kYXRhCi0gICAgICogQHJldHVybiBQYXRoIHRvIGEgdGVtcG9yYXJ5IGZpbGUgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgb24gZXhpdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VUZW1wVHJhY2VGaWxlKFN0cmluZyBiYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUgdGhhdCB3aWxsIGdvIGF3YXkgb24gZXhpdCBhbmQgcHJlcGFyZSB0bwotICAgICAgICAvLyB3cml0ZSBpbnRvIGl0LgotICAgICAgICBGaWxlIHRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGJhc2UsICIudHJhY2UiKTsKLSAgICAgICAgdGVtcC5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgRmlsZUNoYW5uZWwgZHN0Q2hhbm5lbCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXApLmdldENoYW5uZWwoKTsKLQotICAgICAgICAvLyBGaXJzdCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUga2V5IGZpbGUgaW50byBvdXIgdGVtcCBmaWxlLgotICAgICAgICBGaWxlQ2hhbm5lbCBzcmNDaGFubmVsID0gbmV3IEZpbGVJbnB1dFN0cmVhbShiYXNlICsgIi5rZXkiKS5nZXRDaGFubmVsKCk7Ci0gICAgICAgIGxvbmcgc2l6ZSA9IGRzdENoYW5uZWwudHJhbnNmZXJGcm9tKHNyY0NoYW5uZWwsIDAsIHNyY0NoYW5uZWwuc2l6ZSgpKTsKLSAgICAgICAgc3JjQ2hhbm5lbC5jbG9zZSgpOwotCi0gICAgICAgIC8vIFRoZW4gY29uY2F0ZW5hdGUgdGhlIGRhdGEgZmlsZS4KLSAgICAgICAgc3JjQ2hhbm5lbCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYmFzZSArICIuZGF0YSIpLmdldENoYW5uZWwoKTsKLSAgICAgICAgZHN0Q2hhbm5lbC50cmFuc2ZlckZyb20oc3JjQ2hhbm5lbCwgc2l6ZSwgc3JjQ2hhbm5lbC5zaXplKCkpOwotCi0gICAgICAgIC8vIENsZWFuIHVwLgotICAgICAgICBzcmNDaGFubmVsLmNsb3NlKCk7Ci0gICAgICAgIGRzdENoYW5uZWwuY2xvc2UoKTsKLQotICAgICAgICAvLyBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIHRlbXAgZmlsZS4KLSAgICAgICAgcmV0dXJuIHRlbXAuZ2V0UGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvb2xzIHJldmlzaW9uIG51bWJlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmV2aXNpb24oKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN0cmluZyB0b29sc2RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY29tLmFuZHJvaWQudHJhY2V2aWV3LnRvb2xzZGlyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEZpbGUgc291cmNlUHJvcDsKLSAgICAgICAgICAgIGlmICh0b29sc2RpciA9PSBudWxsIHx8IHRvb2xzZGlyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VQcm9wID0gbmV3IEZpbGUoInNvdXJjZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc291cmNlUHJvcCA9IG5ldyBGaWxlKHRvb2xzZGlyLCAic291cmNlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcC5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlUHJvcCkpOwotICAgICAgICAgICAgU3RyaW5nIHJldmlzaW9uID0gcC5nZXRQcm9wZXJ0eSgiUGtnLlJldmlzaW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChyZXZpc2lvbiAhPSBudWxsICYmIHJldmlzaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXZpc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGZpbGU/IGRvbid0IHBpbmcuCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGZpbGU/IGRvbid0IHBpbmcuCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVHJhY2VSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZWdyZXNzaW9uID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gcGluZyB0aGUgdXNhZ2Ugc2VydmVyCi0KLSAgICAgICAgU3RyaW5nIHJldmlzaW9uID0gZ2V0UmV2aXNpb24oKTsKLSAgICAgICAgaWYgKHJldmlzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNka1N0YXRzU2VydmljZS5waW5nKFBJTkdfTkFNRSwgcmV2aXNpb24sIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICAgIGludCBhcmdjID0gMDsKLSAgICAgICAgaW50IGxlbiA9IGFyZ3MubGVuZ3RoOwotICAgICAgICB3aGlsZSAoYXJnYyA8IGxlbikgewotICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGFyZ3NbYXJnY107Ci0gICAgICAgICAgICBpZiAoYXJnLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmcuZXF1YWxzKCItciIpKSB7Ci0gICAgICAgICAgICAgICAgcmVncmVzc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJnYysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdjICE9IGxlbiAtIDEpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJVc2FnZTogamF2YSAlcyBbLXJdIHRyYWNlJW4iLCBNYWluV2luZG93LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICAtciAgIHJlZ3Jlc3Npb24gb25seSVuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdHJhY2VOYW1lID0gYXJnc1tsZW4gLSAxXTsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodHJhY2VOYW1lKTsKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiUWVtdSB0cmFjZSBmaWxlcyBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAvLyByZWFkZXIgPSBuZXcgUXRyYWNlUmVhZGVyKHRyYWNlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZmlsZW5hbWUgYXMgZ2l2ZW4gZG9lc24ndCBleGlzdC4uLgotICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJ5IGFwcGVuZGluZyAudHJhY2UuCi0gICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKHRyYWNlTmFtZSArICIudHJhY2UiKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjZU5hbWUgPSB0cmFjZU5hbWUgKyAiLnRyYWNlIjsKLSAgICAgICAgICAgICAgICAvLyBOZXh0LCBzZWUgaWYgaXQgaXMgdGhlIG9sZCB0d28tZmlsZSB0cmFjZS4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ldyBGaWxlKHRyYWNlTmFtZSArICIuZGF0YSIpLmV4aXN0cygpCi0gICAgICAgICAgICAgICAgICAgICYmIG5ldyBGaWxlKHRyYWNlTmFtZSArICIua2V5IikuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZSA9IG1ha2VUZW1wVHJhY2VGaWxlKHRyYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJjYW5ub3QgY29udmVydCBvbGQgdHJhY2UgZmlsZSAnJXMnXG4iLCB0cmFjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGdpdmUgdXAuCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoInRyYWNlIGZpbGUgJyVzJyBub3QgZm91bmRcbiIsIHRyYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVhZGVyID0gbmV3IERtVHJhY2VSZWFkZXIodHJhY2VOYW1lLCByZWdyZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZWFkZXIuZ2V0VHJhY2VVbml0cygpLnNldFRpbWVTY2FsZShUcmFjZVVuaXRzLlRpbWVTY2FsZS5NaWxsaVNlY29uZHMpOwotICAgICAgICBuZXcgTWFpbldpbmRvdyh0cmFjZU5hbWUsIHJlYWRlcikucnVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvTWV0aG9kRGF0YS5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvTWV0aG9kRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM5ODUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L01ldGhvZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGF0YSB7Ci0KLSAgICBwcml2YXRlIGludCBtSWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVJhbmsgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NZXRob2ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1TaWduYXR1cmU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVByb2ZpbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXRobmFtZTsKLSAgICBwcml2YXRlIGludCBtTGluZU51bWJlcjsKLSAgICBwcml2YXRlIGxvbmcgbUVsYXBzZWRFeGNsdXNpdmU7Ci0gICAgcHJpdmF0ZSBsb25nIG1FbGFwc2VkSW5jbHVzaXZlOwotICAgIHByaXZhdGUgbG9uZyBtVG9wRXhjbHVzaXZlOwotICAgIHByaXZhdGUgaW50W10gbU51bUNhbGxzID0gbmV3IGludFsyXTsgLy8gaW5kZXggMD1ub3JtYWwsIDE9cmVjdXJzaXZlCi0gICAgcHJpdmF0ZSBDb2xvciBtQ29sb3I7Ci0gICAgcHJpdmF0ZSBDb2xvciBtRmFkZWRDb2xvcjsKLSAgICBwcml2YXRlIEltYWdlIG1JbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIG1GYWRlZEltYWdlOwotICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBQcm9maWxlRGF0YT4gbVBhcmVudHM7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIFByb2ZpbGVEYXRhPiBtQ2hpbGRyZW47Ci0gICAgCi0gICAgLy8gVGhlIHBhcmVudHMgb2YgdGhpcyBtZXRob2Qgd2hlbiB0aGlzIG1ldGhvZCB3YXMgaW4gYSByZWN1cnNpdmUgY2FsbAotICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBQcm9maWxlRGF0YT4gbVJlY3Vyc2l2ZVBhcmVudHM7Ci0gICAgCi0gICAgLy8gVGhlIGNoaWxkcmVuIG9mIHRoaXMgbWV0aG9kIHdoZW4gdGhpcyBtZXRob2Qgd2FzIGluIGEgcmVjdXJzaXZlIGNhbGwKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUHJvZmlsZURhdGE+IG1SZWN1cnNpdmVDaGlsZHJlbjsKLQotICAgIHByaXZhdGUgUHJvZmlsZU5vZGVbXSBtUHJvZmlsZU5vZGVzOwotICAgIHByaXZhdGUgaW50IG1YOwotICAgIHByaXZhdGUgaW50IG1ZOwotICAgIHByaXZhdGUgZG91YmxlIG1XZWlnaHQ7Ci0KLSAgICBwdWJsaWMgTWV0aG9kRGF0YShpbnQgaWQsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIG1NZXRob2ROYW1lID0gbnVsbDsKLSAgICAgICAgbVNpZ25hdHVyZSA9IG51bGw7Ci0gICAgICAgIG1QYXRobmFtZSA9IG51bGw7Ci0gICAgICAgIG1MaW5lTnVtYmVyID0gLTE7Ci0gICAgICAgIGNvbXB1dGVOYW1lKCk7Ci0gICAgICAgIGNvbXB1dGVQcm9maWxlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REYXRhKGludCBpZCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgcGF0aG5hbWUsIGludCBsaW5lTnVtYmVyKSB7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICBtTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgICAgIG1TaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0gICAgICAgIG1QYXRobmFtZSA9IHBhdGhuYW1lOwotICAgICAgICBtTGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgICAgIGNvbXB1dGVOYW1lKCk7Ci0gICAgICAgIGNvbXB1dGVQcm9maWxlTmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGFyYXRvcjxQcm9maWxlRGF0YT4gbUJ5RWxhcHNlZEluY2x1c2l2ZSA9IG5ldyBDb21wYXJhdG9yPFByb2ZpbGVEYXRhPigpIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKFByb2ZpbGVEYXRhIHBkMSwgUHJvZmlsZURhdGEgcGQyKSB7Ci0gICAgICAgICAgICBpZiAocGQyLmdldEVsYXBzZWRJbmNsdXNpdmUoKSA+IHBkMS5nZXRFbGFwc2VkSW5jbHVzaXZlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBpZiAocGQyLmdldEVsYXBzZWRJbmNsdXNpdmUoKSA8IHBkMS5nZXRFbGFwc2VkSW5jbHVzaXZlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIGRvdWJsZSBhZGRXZWlnaHQoaW50IHgsIGludCB5LCBkb3VibGUgd2VpZ2h0KSB7Ci0gICAgICAgIGlmIChtWCA9PSB4ICYmIG1ZID09IHkpCi0gICAgICAgICAgICBtV2VpZ2h0ICs9IHdlaWdodDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtWCA9IHg7Ci0gICAgICAgICAgICBtWSA9IHk7Ci0gICAgICAgICAgICBtV2VpZ2h0ID0gd2VpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2VpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyV2VpZ2h0KCkgewotICAgICAgICBtV2VpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0gICAgICAgIHJldHVybiBtUmFuazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0gICAgICAgIG1SYW5rID0gcmFuazsKLSAgICAgICAgY29tcHV0ZVByb2ZpbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRWxhcHNlZEV4Y2x1c2l2ZShsb25nIHRpbWUpIHsKLSAgICAgICAgbUVsYXBzZWRFeGNsdXNpdmUgKz0gdGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGFwc2VkSW5jbHVzaXZlKGxvbmcgdGltZSwgYm9vbGVhbiBpc1JlY3Vyc2l2ZSwgQ2FsbCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzUmVjdXJzaXZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtRWxhcHNlZEluY2x1c2l2ZSArPSB0aW1lOwotICAgICAgICAgICAgbU51bUNhbGxzWzBdICs9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTnVtQ2FsbHNbMV0gKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBGaW5kIHRoZSBjaGlsZCBtZXRob2QgaW4gdGhlIHBhcmVudAotICAgICAgICBNZXRob2REYXRhIHBhcmVudE1ldGhvZCA9IHBhcmVudC5tTWV0aG9kRGF0YTsKLSAgICAgICAgaWYgKHBhcmVudC5pc1JlY3Vyc2l2ZSgpKSB7Ci0gICAgICAgICAgICBwYXJlbnRNZXRob2QubVJlY3Vyc2l2ZUNoaWxkcmVuID0gdXBkYXRlSW5jbHVzaXZlKHRpbWUsCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudE1ldGhvZCwgdGhpcywgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudE1ldGhvZC5tUmVjdXJzaXZlQ2hpbGRyZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyZW50TWV0aG9kLm1DaGlsZHJlbiA9IHVwZGF0ZUluY2x1c2l2ZSh0aW1lLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnRNZXRob2QsIHRoaXMsIGZhbHNlLCBwYXJlbnRNZXRob2QubUNoaWxkcmVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBtZXRob2QgaW4gdGhlIGNoaWxkCi0gICAgICAgIGlmIChpc1JlY3Vyc2l2ZSkgewotICAgICAgICAgICAgbVJlY3Vyc2l2ZVBhcmVudHMgPSB1cGRhdGVJbmNsdXNpdmUodGltZSwgdGhpcywgcGFyZW50TWV0aG9kLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBtUmVjdXJzaXZlUGFyZW50cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGFyZW50cyA9IHVwZGF0ZUluY2x1c2l2ZSh0aW1lLCB0aGlzLCBwYXJlbnRNZXRob2QsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIG1QYXJlbnRzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUHJvZmlsZURhdGE+IHVwZGF0ZUluY2x1c2l2ZShsb25nIHRpbWUsCi0gICAgICAgICAgICBNZXRob2REYXRhIGNvbnRleHRNZXRob2QsIE1ldGhvZERhdGEgZWxlbWVudE1ldGhvZCwKLSAgICAgICAgICAgIGJvb2xlYW4gZWxlbWVudElzUGFyZW50LCBIYXNoTWFwPEludGVnZXIsIFByb2ZpbGVEYXRhPiBtYXApIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQcm9maWxlRGF0YT4oNCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQcm9maWxlRGF0YSBwcm9maWxlRGF0YSA9IG1hcC5nZXQoZWxlbWVudE1ldGhvZC5tSWQpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlRGF0YS5hZGRFbGFwc2VkSW5jbHVzaXZlKHRpbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9maWxlRGF0YSBlbGVtZW50RGF0YSA9IG5ldyBQcm9maWxlRGF0YShjb250ZXh0TWV0aG9kLAotICAgICAgICAgICAgICAgIGVsZW1lbnRNZXRob2QsIGVsZW1lbnRJc1BhcmVudCk7Ci0gICAgICAgIGVsZW1lbnREYXRhLnNldEVsYXBzZWRJbmNsdXNpdmUodGltZSk7Ci0gICAgICAgIGVsZW1lbnREYXRhLnNldE51bUNhbGxzKDEpOwotICAgICAgICBtYXAucHV0KGVsZW1lbnRNZXRob2QubUlkLCBlbGVtZW50RGF0YSk7Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5hbHl6ZURhdGEoKSB7Ci0gICAgICAgIC8vIFNvcnQgdGhlIHBhcmVudHMgYW5kIGNoaWxkcmVuIGludG8gZGVjcmVhc2luZyBpbmNsdXNpdmUgdGltZQotICAgICAgICBQcm9maWxlRGF0YVtdIHNvcnRlZFBhcmVudHM7Ci0gICAgICAgIFByb2ZpbGVEYXRhW10gc29ydGVkQ2hpbGRyZW47Ci0gICAgICAgIFByb2ZpbGVEYXRhW10gc29ydGVkUmVjdXJzaXZlUGFyZW50czsKLSAgICAgICAgUHJvZmlsZURhdGFbXSBzb3J0ZWRSZWN1cnNpdmVDaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIHNvcnRlZFBhcmVudHMgPSBzb3J0UHJvZmlsZURhdGEobVBhcmVudHMpOwotICAgICAgICBzb3J0ZWRDaGlsZHJlbiA9IHNvcnRQcm9maWxlRGF0YShtQ2hpbGRyZW4pOwotICAgICAgICBzb3J0ZWRSZWN1cnNpdmVQYXJlbnRzID0gc29ydFByb2ZpbGVEYXRhKG1SZWN1cnNpdmVQYXJlbnRzKTsKLSAgICAgICAgc29ydGVkUmVjdXJzaXZlQ2hpbGRyZW4gPSBzb3J0UHJvZmlsZURhdGEobVJlY3Vyc2l2ZUNoaWxkcmVuKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCAic2VsZiIgdGltZSB0byB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgY2hpbGRyZW4KLSAgICAgICAgc29ydGVkQ2hpbGRyZW4gPSBhZGRTZWxmKHNvcnRlZENoaWxkcmVuKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgUHJvZmlsZU5vZGUgb2JqZWN0cyB0aGF0IHdlIG5lZWQKLSAgICAgICAgQXJyYXlMaXN0PFByb2ZpbGVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8UHJvZmlsZU5vZGU+KCk7Ci0gICAgICAgIFByb2ZpbGVOb2RlIHByb2ZpbGVOb2RlOwotICAgICAgICBpZiAobVBhcmVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZmlsZU5vZGUgPSBuZXcgUHJvZmlsZU5vZGUoIlBhcmVudHMiLCB0aGlzLCBzb3J0ZWRQYXJlbnRzLAotICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQocHJvZmlsZU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZmlsZU5vZGUgPSBuZXcgUHJvZmlsZU5vZGUoIkNoaWxkcmVuIiwgdGhpcywgc29ydGVkQ2hpbGRyZW4sCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQocHJvZmlsZU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVjdXJzaXZlUGFyZW50cyE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2ZpbGVOb2RlID0gbmV3IFByb2ZpbGVOb2RlKCJQYXJlbnRzIHdoaWxlIHJlY3Vyc2l2ZSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlY3Vyc2l2ZVBhcmVudHMsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgbm9kZXMuYWRkKHByb2ZpbGVOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlY3Vyc2l2ZUNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2ZpbGVOb2RlID0gbmV3IFByb2ZpbGVOb2RlKCJDaGlsZHJlbiB3aGlsZSByZWN1cnNpdmUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZWN1cnNpdmVDaGlsZHJlbiwgZmFsc2UsIHRydWUpOwotICAgICAgICAgICAgbm9kZXMuYWRkKHByb2ZpbGVOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZmlsZU5vZGVzID0gbm9kZXMudG9BcnJheShuZXcgUHJvZmlsZU5vZGVbbm9kZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgUHJvZmlsZURhdGFbXSBhcnJheSB0aGF0IGlzIGEgc29ydGVkIGNvcHkKLSAgICAvLyBvZiB0aGUgZ2l2ZW4gSGFzaE1hcCB2YWx1ZXMuCi0gICAgcHJpdmF0ZSBQcm9maWxlRGF0YVtdIHNvcnRQcm9maWxlRGF0YShIYXNoTWFwPEludGVnZXIsIFByb2ZpbGVEYXRhPiBtYXApIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgaGFzaCB2YWx1ZXMgdG8gYW4gYXJyYXkgb2YgUHJvZmlsZURhdGEKLSAgICAgICAgQ29sbGVjdGlvbjxQcm9maWxlRGF0YT4gdmFsdWVzID0gbWFwLnZhbHVlcygpOwotICAgICAgICBQcm9maWxlRGF0YVtdIHNvcnRlZCA9IHZhbHVlcy50b0FycmF5KG5ldyBQcm9maWxlRGF0YVt2YWx1ZXMuc2l6ZSgpXSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTb3J0IHRoZSBhcnJheSBieSBlbGFwc2VkIGluY2x1c2l2ZSB0aW1lCi0gICAgICAgIEFycmF5cy5zb3J0KHNvcnRlZCwgbUJ5RWxhcHNlZEluY2x1c2l2ZSk7Ci0gICAgICAgIHJldHVybiBzb3J0ZWQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUHJvZmlsZURhdGFbXSBhZGRTZWxmKFByb2ZpbGVEYXRhW10gY2hpbGRyZW4pIHsKLSAgICAgICAgUHJvZmlsZURhdGFbXSBwZGF0YTsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIHBkYXRhID0gbmV3IFByb2ZpbGVEYXRhWzFdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGRhdGEgPSBuZXcgUHJvZmlsZURhdGFbY2hpbGRyZW4ubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCBwZGF0YSwgMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBwZGF0YVswXSA9IG5ldyBQcm9maWxlU2VsZih0aGlzKTsKLSAgICAgICAgcmV0dXJuIHBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRvcEV4Y2x1c2l2ZShsb25nIHRpbWUpIHsKLSAgICAgICAgbVRvcEV4Y2x1c2l2ZSArPSB0aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRvcEV4Y2x1c2l2ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3BFeGNsdXNpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcHV0ZU5hbWUoKSB7Ci0gICAgICAgIGlmIChtTWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTmFtZSA9IG1DbGFzc05hbWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKG1DbGFzc05hbWUpOwotICAgICAgICBzYi5hcHBlbmQoIi4iKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2IuYXBwZW5kKG1NZXRob2ROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIHNiLmFwcGVuZChtU2lnbmF0dXJlKTsKLSAgICAgICAgbU5hbWUgPSBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gbUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0aG9kTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVByb2ZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVQcm9maWxlTmFtZSgpIHsKLSAgICAgICAgaWYgKG1SYW5rID09IC0xKSB7Ci0gICAgICAgICAgICBtUHJvZmlsZU5hbWUgPSBtTmFtZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChtUmFuayk7Ci0gICAgICAgIHNiLmFwcGVuZCgiICIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgbVByb2ZpbGVOYW1lID0gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhbGxzKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJWQrJWQiLCBtTnVtQ2FsbHNbMF0sIG1OdW1DYWxsc1sxXSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUb3RhbENhbGxzKCkgewotICAgICAgICByZXR1cm4gbU51bUNhbGxzWzBdICsgbU51bUNhbGxzWzFdOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsKLSAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBjb2xvcikgewotICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotICAgICAgICBtSW1hZ2UgPSBpbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW1hZ2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbGFwc2VkRXhjbHVzaXZlKCkgewotICAgICAgICByZXR1cm4gbUVsYXBzZWRFeGNsdXNpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0RWxhcHNlZEluY2x1c2l2ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1FbGFwc2VkSW5jbHVzaXZlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhZGVkQ29sb3IoQ29sb3IgZmFkZWRDb2xvcikgewotICAgICAgICBtRmFkZWRDb2xvciA9IGZhZGVkQ29sb3I7Ci0gICAgfQotCi0gICAgcHVibGljIENvbG9yIGdldEZhZGVkQ29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBtRmFkZWRDb2xvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWRlZEltYWdlKEltYWdlIGZhZGVkSW1hZ2UpIHsKLSAgICAgICAgbUZhZGVkSW1hZ2UgPSBmYWRlZEltYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRGYWRlZEltYWdlKCkgewotICAgICAgICByZXR1cm4gbUZhZGVkSW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aG5hbWUoU3RyaW5nIHBhdGhuYW1lKSB7Ci0gICAgICAgIG1QYXRobmFtZSA9IHBhdGhuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGF0aG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotICAgICAgICBtTGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbUxpbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2ZpbGVOb2RlW10gZ2V0UHJvZmlsZU5vZGVzKCkgewotICAgICAgICByZXR1cm4gbVByb2ZpbGVOb2RlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvcnRlciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWV0aG9kRGF0YT4gewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kRGF0YSBtZDEsIE1ldGhvZERhdGEgbWQyKSB7Ci0gICAgICAgICAgICBpZiAobUNvbHVtbiA9PSBDb2x1bW4uQllfTkFNRSkgewotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBtZDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtZDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1EaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQ1JFQVNJTkcpID8gcmVzdWx0IDogLXJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ29sdW1uID09IENvbHVtbi5CWV9JTkNMVVNJVkUpIHsKLSAgICAgICAgICAgICAgICBpZiAobWQyLmdldEVsYXBzZWRJbmNsdXNpdmUoKSA+IG1kMS5nZXRFbGFwc2VkSW5jbHVzaXZlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobURpcmVjdGlvbiA9PSBEaXJlY3Rpb24uSU5DUkVBU0lORykgPyAtMSA6IDE7Ci0gICAgICAgICAgICAgICAgaWYgKG1kMi5nZXRFbGFwc2VkSW5jbHVzaXZlKCkgPCBtZDEuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1EaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQ1JFQVNJTkcpID8gMSA6IC0xOwotICAgICAgICAgICAgICAgIHJldHVybiBtZDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtZDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ29sdW1uID09IENvbHVtbi5CWV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgICAgICBpZiAobWQyLmdldEVsYXBzZWRFeGNsdXNpdmUoKSA+IG1kMS5nZXRFbGFwc2VkRXhjbHVzaXZlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobURpcmVjdGlvbiA9PSBEaXJlY3Rpb24uSU5DUkVBU0lORykgPyAtMSA6IDE7Ci0gICAgICAgICAgICAgICAgaWYgKG1kMi5nZXRFbGFwc2VkRXhjbHVzaXZlKCkgPCBtZDEuZ2V0RWxhcHNlZEV4Y2x1c2l2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1EaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQ1JFQVNJTkcpID8gMSA6IC0xOwotICAgICAgICAgICAgICAgIHJldHVybiBtZDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtZDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ29sdW1uID09IENvbHVtbi5CWV9DQUxMUykgewotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBtZDEuZ2V0VG90YWxDYWxscygpIC0gbWQyLmdldFRvdGFsQ2FsbHMoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtZDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1EaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQ1JFQVNJTkcpID8gcmVzdWx0IDogLXJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ29sdW1uID09IENvbHVtbi5CWV9USU1FX1BFUl9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHRpbWUxID0gbWQxLmdldEVsYXBzZWRJbmNsdXNpdmUoKTsKLSAgICAgICAgICAgICAgICB0aW1lMSA9IHRpbWUxIC8gbWQxLmdldFRvdGFsQ2FsbHMoKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgdGltZTIgPSBtZDIuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpOwotICAgICAgICAgICAgICAgIHRpbWUyID0gdGltZTIgLyBtZDIuZ2V0VG90YWxDYWxscygpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkaWZmID0gdGltZTEgLSB0aW1lMjsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpZmYgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1kMS5nZXROYW1lKCkuY29tcGFyZVRvKG1kMi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAobURpcmVjdGlvbiA9PSBEaXJlY3Rpb24uSU5DUkVBU0lORykgPyByZXN1bHQgOiAtcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW4oQ29sdW1uIGNvbHVtbikgewotICAgICAgICAgICAgLy8gSWYgdGhlIHNvcnQgY29sdW1uIHNwZWNpZmllZCBpcyB0aGUgc2FtZSBhcyBsYXN0IHRpbWUsCi0gICAgICAgICAgICAvLyB0aGVuIHJldmVyc2UgdGhlIHNvcnQgb3JkZXIuCi0gICAgICAgICAgICBpZiAobUNvbHVtbiA9PSBjb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBzb3J0IG9yZGVyCi0gICAgICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQ1JFQVNJTkcpCi0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSBEaXJlY3Rpb24uREVDUkVBU0lORzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSBEaXJlY3Rpb24uSU5DUkVBU0lORzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU29ydCBuYW1lcyBpbnRvIGluY3JlYXNpbmcgb3JkZXIsIGRhdGEgaW50byBkZWNyZWFzaW5nIG9yZGVyLgotICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gQ29sdW1uLkJZX05BTUUpCi0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSBEaXJlY3Rpb24uSU5DUkVBU0lORzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSBEaXJlY3Rpb24uREVDUkVBU0lORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db2x1bW4gPSBjb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sdW1uIGdldENvbHVtbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlyZWN0aW9uIGdldERpcmVjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlyZWN0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBlbnVtIENvbHVtbiB7Ci0gICAgICAgICAgICBCWV9OQU1FLCBCWV9FWENMVVNJVkUsIEJZX0lOQ0xVU0lWRSwgQllfQ0FMTFMsIEJZX1RJTUVfUEVSX0NBTEwKLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAgIElOQ1JFQVNJTkcsIERFQ1JFQVNJTkcKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIENvbHVtbiBtQ29sdW1uOwotICAgICAgICBwcml2YXRlIERpcmVjdGlvbiBtRGlyZWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVEYXRhLmphdmEgYi90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Qcm9maWxlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGMxZDYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLQotcHVibGljIGNsYXNzIFByb2ZpbGVEYXRhIHsKLQotICAgIHByb3RlY3RlZCBNZXRob2REYXRhIG1FbGVtZW50OwotICAgIAotICAgIC8qKiBtQ29udGV4dCBpcyBlaXRoZXIgdGhlIHBhcmVudCBvciBjaGlsZCBvZiBtRWxlbWVudCAqLwotICAgIHByb3RlY3RlZCBNZXRob2REYXRhIG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBib29sZWFuIG1FbGVtZW50SXNQYXJlbnQ7Ci0gICAgcHJvdGVjdGVkIGxvbmcgbUVsYXBzZWRJbmNsdXNpdmU7Ci0gICAgcHJvdGVjdGVkIGludCBtTnVtQ2FsbHM7Ci0KLSAgICBwdWJsaWMgUHJvZmlsZURhdGEoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2ZpbGVEYXRhKE1ldGhvZERhdGEgY29udGV4dCwgTWV0aG9kRGF0YSBlbGVtZW50LAotICAgICAgICAgICAgYm9vbGVhbiBlbGVtZW50SXNQYXJlbnQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIG1FbGVtZW50SXNQYXJlbnQgPSBlbGVtZW50SXNQYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1FbGVtZW50LmdldFByb2ZpbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZERhdGEgZ2V0TWV0aG9kRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1FbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVsYXBzZWRJbmNsdXNpdmUobG9uZyBlbGFwc2VkSW5jbHVzaXZlKSB7Ci0gICAgICAgIG1FbGFwc2VkSW5jbHVzaXZlICs9IGVsYXBzZWRJbmNsdXNpdmU7Ci0gICAgICAgIG1OdW1DYWxscyArPSAxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsYXBzZWRJbmNsdXNpdmUobG9uZyBlbGFwc2VkSW5jbHVzaXZlKSB7Ci0gICAgICAgIG1FbGFwc2VkSW5jbHVzaXZlID0gZWxhcHNlZEluY2x1c2l2ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbGFwc2VkSW5jbHVzaXZlKCkgewotICAgICAgICByZXR1cm4gbUVsYXBzZWRJbmNsdXNpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnVtQ2FsbHMoaW50IG51bUNhbGxzKSB7Ci0gICAgICAgIG1OdW1DYWxscyA9IG51bUNhbGxzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVtQ2FsbHMoKSB7Ci0gICAgICAgIGludCB0b3RhbENhbGxzOwotICAgICAgICBpZiAobUVsZW1lbnRJc1BhcmVudCkKLSAgICAgICAgICAgIHRvdGFsQ2FsbHMgPSBtQ29udGV4dC5nZXRUb3RhbENhbGxzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvdGFsQ2FsbHMgPSBtRWxlbWVudC5nZXRUb3RhbENhbGxzKCk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlZC8lZCIsIG1OdW1DYWxscywgdG90YWxDYWxscyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtRWxlbWVudElzUGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REYXRhIGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Qcm9maWxlTm9kZS5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUHJvZmlsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiMGI1ZC4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Qcm9maWxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudHJhY2V2aWV3OwotCi1wdWJsaWMgY2xhc3MgUHJvZmlsZU5vZGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhYmVsOwotICAgIHByaXZhdGUgTWV0aG9kRGF0YSBtTWV0aG9kRGF0YTsKLSAgICBwcml2YXRlIFByb2ZpbGVEYXRhW10gbUNoaWxkcmVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQYXJlbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlY3Vyc2l2ZTsKLQotICAgIHB1YmxpYyBQcm9maWxlTm9kZShTdHJpbmcgbGFiZWwsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwKLSAgICAgICAgICAgIFByb2ZpbGVEYXRhW10gY2hpbGRyZW4sIGJvb2xlYW4gaXNQYXJlbnQsIGJvb2xlYW4gaXNSZWN1cnNpdmUpIHsKLSAgICAgICAgbUxhYmVsID0gbGFiZWw7Ci0gICAgICAgIG1NZXRob2REYXRhID0gbWV0aG9kRGF0YTsKLSAgICAgICAgbUNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgICAgIG1Jc1BhcmVudCA9IGlzUGFyZW50OwotICAgICAgICBtSXNSZWN1cnNpdmUgPSBpc1JlY3Vyc2l2ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotICAgICAgICByZXR1cm4gbUxhYmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvZmlsZURhdGFbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIG1DaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlY3Vyc2l2ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1JlY3Vyc2l2ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9Qcm9maWxlUHJvdmlkZXIuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTVjODMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRyYWNldmlldzsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLWNsYXNzIFByb2ZpbGVQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgTWV0aG9kRGF0YVtdIG1Sb290czsKLSAgICBwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgbUxpc3RlbmVyOwotICAgIHByaXZhdGUgVHJlZVZpZXdlciBtVHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIFRyYWNlUmVhZGVyIG1SZWFkZXI7Ci0gICAgcHJpdmF0ZSBJbWFnZSBtU29ydFVwOwotICAgIHByaXZhdGUgSW1hZ2UgbVNvcnREb3duOwotICAgIHByaXZhdGUgU3RyaW5nIG1Db2x1bW5OYW1lc1tdID0geyAiTmFtZSIsICJJbmNsICUiLCAiSW5jbHVzaXZlIiwgIkV4Y2wgJSIsCi0gICAgICAgICAgICAiRXhjbHVzaXZlIiwgIkNhbGxzK1JlY3VyXG5DYWxscy9Ub3RhbCIsICJUaW1lL0NhbGwiIH07Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbHVtbldpZHRoc1tdID0geyAzNzAsIDcwLCA3MCwgNzAsIDcwLCA5MCwgNzAgfTsKLSAgICBwcml2YXRlIGludCBtQ29sdW1uQWxpZ25tZW50c1tdID0geyBTV1QuTEVGVCwgU1dULlJJR0hULCBTV1QuUklHSFQsCi0gICAgICAgICAgICBTV1QuUklHSFQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgU1dULlJJR0hUIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTF9OQU1FID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MX0lOQ0xVU0lWRV9QRVIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xfSU5DTFVTSVZFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MX0VYQ0xVU0lWRV9QRVIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xfRVhDTFVTSVZFID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MX0NBTExTID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MX1RJTUVfUEVSX0NBTEwgPSA2OwotICAgIHByaXZhdGUgbG9uZyBtVG90YWxUaW1lOwotICAgIHByaXZhdGUgUGF0dGVybiBtVXBwZXJjYXNlOwotICAgIHByaXZhdGUgaW50IG1QcmV2TWF0Y2hJbmRleCA9IC0xOwotCi0gICAgcHVibGljIFByb2ZpbGVQcm92aWRlcihUcmFjZVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgbVJvb3RzID0gcmVhZGVyLmdldE1ldGhvZHMoKTsKLSAgICAgICAgbVJlYWRlciA9IHJlYWRlcjsKLSAgICAgICAgbVRvdGFsVGltZSA9IHJlYWRlci5nZXRFbmRUaW1lKCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgICAgICJpY29ucy9zb3J0X3VwLnBuZyIpOwotICAgICAgICBtU29ydFVwID0gbmV3IEltYWdlKGRpc3BsYXksIGluKTsKLSAgICAgICAgaW4gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKLSAgICAgICAgICAgICAgICAiaWNvbnMvc29ydF9kb3duLnBuZyIpOwotICAgICAgICBtU29ydERvd24gPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW4pOwotICAgICAgICBtVXBwZXJjYXNlID0gUGF0dGVybi5jb21waWxlKCJbQS1aXSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kRGF0YSBkb01hdGNoTmFtZShTdHJpbmcgbmFtZSwgaW50IHN0YXJ0SW5kZXgpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuICJuYW1lIiBoYXMgYW55IHVwcGVyY2FzZSBsZXR0ZXJzCi0gICAgICAgIGJvb2xlYW4gaGFzVXBwZXIgPSBtVXBwZXJjYXNlLm1hdGNoZXIobmFtZSkubWF0Y2hlcygpOwotICAgICAgICBmb3IgKGludCBpaSA9IHN0YXJ0SW5kZXg7IGlpIDwgbVJvb3RzLmxlbmd0aDsgKytpaSkgewotICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IG1Sb290c1tpaV07Ci0gICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBtZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIHVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgZ2l2ZW4gbmFtZSwKLSAgICAgICAgICAgIC8vIHRoZW4gaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZy4KLSAgICAgICAgICAgIGlmICghaGFzVXBwZXIpCi0gICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGZ1bGxOYW1lLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtUHJldk1hdGNoSW5kZXggPSBpaTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZNYXRjaEluZGV4ID0gLTE7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REYXRhIGZpbmRNYXRjaGluZ05hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvTWF0Y2hOYW1lKG5hbWUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REYXRhIGZpbmROZXh0TWF0Y2hpbmdOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb01hdGNoTmFtZShuYW1lLCBtUHJldk1hdGNoSW5kZXggKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kRGF0YSBmaW5kTWF0Y2hpbmdUcmVlSXRlbShUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHRleHQuY2hhckF0KDApKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpbnQgc3BhY2VJbmRleCA9IHRleHQuaW5kZXhPZignICcpOwotICAgICAgICBTdHJpbmcgbnVtc3RyID0gdGV4dC5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCk7Ci0gICAgICAgIGludCByYW5rID0gSW50ZWdlci52YWx1ZU9mKG51bXN0cik7Ci0gICAgICAgIGZvciAoTWV0aG9kRGF0YSBtZCA6IG1Sb290cykgewotICAgICAgICAgICAgaWYgKG1kLmdldFJhbmsoKSA9PSByYW5rKQotICAgICAgICAgICAgICAgIHJldHVybiBtZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmVlVmlld2VyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICBtVHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gbUNvbHVtbk5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBnZXRDb2x1bW5XaWR0aHMoKSB7Ci0gICAgICAgIHJldHVybiBtQ29sdW1uV2lkdGhzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBnZXRDb2x1bW5BbGlnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gbUNvbHVtbkFsaWdubWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IChNZXRob2REYXRhKSBlbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIG1kLmdldFByb2ZpbGVOb2RlcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvZmlsZU5vZGUpIHsKLSAgICAgICAgICAgIFByb2ZpbGVOb2RlIHBuID0gKFByb2ZpbGVOb2RlKSBlbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHBuLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2REYXRhKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvZmlsZU5vZGUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gbVJvb3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiAicm9vdCI7Ci0gICAgfQotCi0gICAgcHVibGljIFNlbGVjdGlvbkFkYXB0ZXIgZ2V0Q29sdW1uTGlzdGVuZXIoKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBDb2x1bW5MaXN0ZW5lcigpOwotICAgICAgICByZXR1cm4gbUxpc3RlbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvZmlsZUxhYmVsUHJvdmlkZXIoKTsKLSAgICB9Ci0KLSAgICBjbGFzcyBQcm9maWxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciwgSUNvbG9yUHJvdmlkZXIgewotICAgICAgICBDb2xvciBjb2xvclJlZDsKLSAgICAgICAgQ29sb3IgY29sb3JQYXJlbnRzQmFjazsKLSAgICAgICAgQ29sb3IgY29sb3JDaGlsZHJlbkJhY2s7Ci0gICAgICAgIFRyYWNlVW5pdHMgdHJhY2VVbml0czsKLQotICAgICAgICBwdWJsaWMgUHJvZmlsZUxhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGNvbG9yUmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLSAgICAgICAgICAgIGNvbG9yUGFyZW50c0JhY2sgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjMwLCAyMzAsIDI1NSk7IC8vIGJsdWUKLSAgICAgICAgICAgIGNvbG9yQ2hpbGRyZW5CYWNrID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyMTApOyAvLyB5ZWxsb3cKLSAgICAgICAgICAgIHRyYWNlVW5pdHMgPSBtUmVhZGVyLmdldFRyYWNlVW5pdHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IChNZXRob2REYXRhKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX05BTUUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZC5nZXRQcm9maWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gbWQuZ2V0RWxhcHNlZEV4Y2x1c2l2ZSgpOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmFjZVVuaXRzLmdldFNjYWxlZFZhbHVlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjNmIiwgdmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBDT0xfRVhDTFVTSVZFX1BFUikgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gbWQuZ2V0RWxhcHNlZEV4Y2x1c2l2ZSgpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyID0gdmFsICogMTAwLjAgLyBtVG90YWxUaW1lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJS4xZiUlIiwgcGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBDT0xfSU5DTFVTSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBtZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHRyYWNlVW5pdHMuZ2V0U2NhbGVkVmFsdWUodmFsKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUuM2YiLCB2YWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sID09IENPTF9JTkNMVVNJVkVfUEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBtZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXIgPSB2YWwgKiAxMDAuMCAvIG1Ub3RhbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmJSUiLCBwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sID09IENPTF9DQUxMUykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1kLmdldENhbGxzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBDT0xfVElNRV9QRVJfQ0FMTCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQ2FsbHMgPSBtZC5nZXRUb3RhbENhbGxzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBtZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAvIG51bUNhbGxzOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmFjZVVuaXRzLmdldFNjYWxlZFZhbHVlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjNmIiwgdmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9maWxlU2VsZikgewotICAgICAgICAgICAgICAgIFByb2ZpbGVTZWxmIHBzID0gKFByb2ZpbGVTZWxmKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX05BTUUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcy5nZXRQcm9maWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX0lOQ0xVU0lWRSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gcHMuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmFjZVVuaXRzLmdldFNjYWxlZFZhbHVlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjNmIiwgdmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBDT0xfSU5DTFVTSVZFX1BFUikgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG90YWw7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBwcy5nZXRFbGFwc2VkSW5jbHVzaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZERhdGEgY29udGV4dCA9IHBzLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgPSBjb250ZXh0LmdldEVsYXBzZWRJbmNsdXNpdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBlciA9IHZhbCAqIDEwMC4wIC8gdG90YWw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmJSUiLCBwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9maWxlRGF0YSkgewotICAgICAgICAgICAgICAgIFByb2ZpbGVEYXRhIHBkID0gKFByb2ZpbGVEYXRhKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX05BTUUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZC5nZXRQcm9maWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gQ09MX0lOQ0xVU0lWRSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gcGQuZ2V0RWxhcHNlZEluY2x1c2l2ZSgpOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmFjZVVuaXRzLmdldFNjYWxlZFZhbHVlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjNmIiwgdmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBDT0xfSU5DTFVTSVZFX1BFUikgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG90YWw7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBwZC5nZXRFbGFwc2VkSW5jbHVzaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZERhdGEgY29udGV4dCA9IHBkLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgPSBjb250ZXh0LmdldEVsYXBzZWRJbmNsdXNpdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBlciA9IHZhbCAqIDEwMC4wIC8gdG90YWw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmJSUiLCBwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sID09IENPTF9DQUxMUykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkLmdldE51bUNhbGxzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvZmlsZU5vZGUpIHsKLSAgICAgICAgICAgICAgICBQcm9maWxlTm9kZSBwbiA9IChQcm9maWxlTm9kZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoY29sID09IENPTF9OQU1FKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG4uZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gImNvbCIgKyBjb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2wpIHsKLSAgICAgICAgICAgIGlmIChjb2wgIT0gQ09MX05BTUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REYXRhIG1kID0gKE1ldGhvZERhdGEpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1kLmdldEltYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2ZpbGVEYXRhKSB7Ci0gICAgICAgICAgICAgICAgUHJvZmlsZURhdGEgcGQgPSAoUHJvZmlsZURhdGEpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IHBkLmdldE1ldGhvZERhdGEoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWQuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvZmlsZURhdGEpIHsKLSAgICAgICAgICAgICAgICBQcm9maWxlRGF0YSBwZCA9IChQcm9maWxlRGF0YSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAocGQuaXNQYXJlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yUGFyZW50c0JhY2s7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yQ2hpbGRyZW5CYWNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9maWxlTm9kZSkgewotICAgICAgICAgICAgICAgIFByb2ZpbGVOb2RlIHBuID0gKFByb2ZpbGVOb2RlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChwbi5pc1BhcmVudCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JQYXJlbnRzQmFjazsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JDaGlsZHJlbkJhY2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIENvbHVtbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0gICAgICAgIE1ldGhvZERhdGEuU29ydGVyIHNvcnRlciA9IG5ldyBNZXRob2REYXRhLlNvcnRlcigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgVHJlZUNvbHVtbiBjb2x1bW4gPSAoVHJlZUNvbHVtbikgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjb2x1bW4uZ2V0VGV4dCgpOwotICAgICAgICAgICAgVHJlZSB0cmVlID0gY29sdW1uLmdldFBhcmVudCgpOwotICAgICAgICAgICAgdHJlZS5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgICAgICAgVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLSAgICAgICAgICAgIGZvciAoVHJlZUNvbHVtbiBjb2wgOiBjb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgY29sLnNldEltYWdlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbUNvbHVtbk5hbWVzW0NPTF9OQU1FXSkgewotICAgICAgICAgICAgICAgIC8vIFNvcnQgbmFtZXMgYWxwaGFiZXRpY2FsbHkKLSAgICAgICAgICAgICAgICBzb3J0ZXIuc2V0Q29sdW1uKE1ldGhvZERhdGEuU29ydGVyLkNvbHVtbi5CWV9OQU1FKTsKLSAgICAgICAgICAgICAgICBBcnJheXMuc29ydChtUm9vdHMsIHNvcnRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gbUNvbHVtbk5hbWVzW0NPTF9FWENMVVNJVkVdKSB7Ci0gICAgICAgICAgICAgICAgc29ydGVyLnNldENvbHVtbihNZXRob2REYXRhLlNvcnRlci5Db2x1bW4uQllfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICBBcnJheXMuc29ydChtUm9vdHMsIHNvcnRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gbUNvbHVtbk5hbWVzW0NPTF9FWENMVVNJVkVfUEVSXSkgewotICAgICAgICAgICAgICAgIHNvcnRlci5zZXRDb2x1bW4oTWV0aG9kRGF0YS5Tb3J0ZXIuQ29sdW1uLkJZX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQobVJvb3RzLCBzb3J0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09IG1Db2x1bW5OYW1lc1tDT0xfSU5DTFVTSVZFXSkgewotICAgICAgICAgICAgICAgIHNvcnRlci5zZXRDb2x1bW4oTWV0aG9kRGF0YS5Tb3J0ZXIuQ29sdW1uLkJZX0lOQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQobVJvb3RzLCBzb3J0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09IG1Db2x1bW5OYW1lc1tDT0xfSU5DTFVTSVZFX1BFUl0pIHsKLSAgICAgICAgICAgICAgICBzb3J0ZXIuc2V0Q29sdW1uKE1ldGhvZERhdGEuU29ydGVyLkNvbHVtbi5CWV9JTkNMVVNJVkUpOwotICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KG1Sb290cywgc29ydGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBtQ29sdW1uTmFtZXNbQ09MX0NBTExTXSkgewotICAgICAgICAgICAgICAgIHNvcnRlci5zZXRDb2x1bW4oTWV0aG9kRGF0YS5Tb3J0ZXIuQ29sdW1uLkJZX0NBTExTKTsKLSAgICAgICAgICAgICAgICBBcnJheXMuc29ydChtUm9vdHMsIHNvcnRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gbUNvbHVtbk5hbWVzW0NPTF9USU1FX1BFUl9DQUxMXSkgewotICAgICAgICAgICAgICAgIHNvcnRlci5zZXRDb2x1bW4oTWV0aG9kRGF0YS5Tb3J0ZXIuQ29sdW1uLkJZX1RJTUVfUEVSX0NBTEwpOwotICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KG1Sb290cywgc29ydGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1ldGhvZERhdGEuU29ydGVyLkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBzb3J0ZXIuZ2V0RGlyZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1ldGhvZERhdGEuU29ydGVyLkRpcmVjdGlvbi5JTkNSRUFTSU5HKQotICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRJbWFnZShtU29ydERvd24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRJbWFnZShtU29ydFVwKTsKLSAgICAgICAgICAgIHRyZWUuc2V0UmVkcmF3KHRydWUpOwotICAgICAgICAgICAgbVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUHJvZmlsZVNlbGYuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVTZWxmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGYzZDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUHJvZmlsZVNlbGYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRyYWNldmlldzsKLQotcHVibGljIGNsYXNzIFByb2ZpbGVTZWxmIGV4dGVuZHMgUHJvZmlsZURhdGEgewotICAgIHB1YmxpYyBQcm9maWxlU2VsZihNZXRob2REYXRhIG1ldGhvZERhdGEpIHsKLSAgICAgICAgbUVsZW1lbnQgPSBtZXRob2REYXRhOwotICAgICAgICBtQ29udGV4dCA9IG1ldGhvZERhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJzZWxmIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRFbGFwc2VkSW5jbHVzaXZlKCkgewotICAgICAgICByZXR1cm4gbUVsZW1lbnQuZ2V0VG9wRXhjbHVzaXZlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUHJvZmlsZVZpZXcuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1Byb2ZpbGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGNiNTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUHJvZmlsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotcHVibGljIGNsYXNzIFByb2ZpbGVWaWV3IGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgT2JzZXJ2ZXIgewotICAgIAotICAgIHByaXZhdGUgVHJlZVZpZXdlciBtVHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIFRleHQgbVNlYXJjaEJveDsKLSAgICBwcml2YXRlIFNlbGVjdGlvbkNvbnRyb2xsZXIgbVNlbGVjdGlvbkNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBQcm9maWxlUHJvdmlkZXIgbVByb2ZpbGVQcm92aWRlcjsKLSAgICBwcml2YXRlIENvbG9yIG1Db2xvck5vTWF0Y2g7Ci0gICAgcHJpdmF0ZSBDb2xvciBtQ29sb3JNYXRjaDsKLSAgICBwcml2YXRlIE1ldGhvZERhdGEgbUN1cnJlbnRIaWdobGlnaHRlZE1ldGhvZDsKLQotICAgIHB1YmxpYyBQcm9maWxlVmlldyhDb21wb3NpdGUgcGFyZW50LCBUcmFjZVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICBTZWxlY3Rpb25Db250cm9sbGVyIHNlbGVjdENvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotICAgICAgICB0aGlzLm1TZWxlY3Rpb25Db250cm9sbGVyID0gc2VsZWN0Q29udHJvbGxlcjsKLSAgICAgICAgbVNlbGVjdGlvbkNvbnRyb2xsZXIuYWRkT2JzZXJ2ZXIodGhpcyk7Ci0KLSAgICAgICAgLy8gQWRkIGEgdHJlZSB2aWV3ZXIgYXQgdGhlIHRvcAotICAgICAgICBtVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRoaXMsIFNXVC5NVUxUSSB8IFNXVC5OT05FKTsKLSAgICAgICAgbVRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLSAgICAgICAgbVByb2ZpbGVQcm92aWRlciA9IHJlYWRlci5nZXRQcm9maWxlUHJvdmlkZXIoKTsKLSAgICAgICAgbVByb2ZpbGVQcm92aWRlci5zZXRUcmVlVmlld2VyKG1UcmVlVmlld2VyKTsKLSAgICAgICAgU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG1Qcm9maWxlUHJvdmlkZXIuZ2V0Q29sdW1uTGlzdGVuZXIoKTsKLSAgICAgICAgZmluYWwgVHJlZSB0cmVlID0gbVRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICB0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIHRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW4gbmFtZXMgZnJvbSB0aGUgUHJvZmlsZVByb3ZpZGVyCi0gICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0gbVByb2ZpbGVQcm92aWRlci5nZXRDb2x1bW5OYW1lcygpOwotICAgICAgICBpbnRbXSBjb2x1bW5XaWR0aHMgPSBtUHJvZmlsZVByb3ZpZGVyLmdldENvbHVtbldpZHRocygpOwotICAgICAgICBpbnRbXSBjb2x1bW5BbGlnbm1lbnRzID0gbVByb2ZpbGVQcm92aWRlci5nZXRDb2x1bW5BbGlnbm1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBjb2x1bW5XaWR0aHMubGVuZ3RoOyArK2lpKSB7Ci0gICAgICAgICAgICBUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLSAgICAgICAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtbk5hbWVzW2lpXSk7Ci0gICAgICAgICAgICBjb2x1bW4uc2V0V2lkdGgoY29sdW1uV2lkdGhzW2lpXSk7Ci0gICAgICAgICAgICBjb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0gICAgICAgICAgICBjb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgY29sdW1uLnNldEFsaWdubWVudChjb2x1bW5BbGlnbm1lbnRzW2lpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byB0aGUgdHJlZSBzbyB0aGF0IHdlIGNhbiBtYWtlIHRoZSByb3cKLSAgICAgICAgLy8gaGVpZ2h0IHNtYWxsZXIuCi0gICAgICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGludCBmb250SGVpZ2h0ID0gZXZlbnQuZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBldmVudC5oZWlnaHQgPSBmb250SGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobVByb2ZpbGVQcm92aWRlcik7Ci0gICAgICAgIG1UcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobVByb2ZpbGVQcm92aWRlci5nZXRMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRJbnB1dChtUHJvZmlsZVByb3ZpZGVyLmdldFJvb3QoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGFub3RoZXIgY29tcG9zaXRlIHRvIGhvbGQgdGhlIGxhYmVsIGFuZCB0ZXh0IGJveAotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIC8vIEFkZCBhIGxhYmVsIGZvciB0aGUgc2VhcmNoIGJveAotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiRmluZDoiKTsKLQotICAgICAgICAvLyBBZGQgYSB0ZXh0IGJveCBmb3Igc2VhcmNoaW5nIGZvciBtZXRob2QgbmFtZXMKLSAgICAgICAgbVNlYXJjaEJveCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1TZWFyY2hCb3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICBtQ29sb3JOb01hdGNoID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjAwLCAyMDApOwotICAgICAgICBtQ29sb3JNYXRjaCA9IG1TZWFyY2hCb3guZ2V0QmFja2dyb3VuZCgpOwotCi0gICAgICAgIG1TZWFyY2hCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldikgewotICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IG1TZWFyY2hCb3guZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChxdWVyeS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgZmluZE5hbWUocXVlcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBBZGQgYSBrZXkgbGlzdGVuZXIgdG8gdGhlIHRleHQgYm94IHNvIHRoYXQgd2UgY2FuIGNsZWFyCi0gICAgICAgIC8vIHRoZSB0ZXh0IGJveCBpZiB0aGUgdXNlciBwcmVzc2VzIDxFU0M+LgotICAgICAgICBtU2VhcmNoQm94LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkVTQykgewotICAgICAgICAgICAgICAgICAgICBtU2VhcmNoQm94LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gbVNlYXJjaEJveC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBmaW5kTmV4dE5hbWUocXVlcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gQWxzbyBhZGQgYSBrZXkgbGlzdGVuZXIgdG8gdGhlIHRyZWUgdmlld2VyIHNvIHRoYXQgdGhlCi0gICAgICAgIC8vIHVzZXIgY2FuIGp1c3Qgc3RhcnQgdHlwaW5nIGFueXdoZXJlIGluIHRoZSB0cmVlIHZpZXcuCi0gICAgICAgIHRyZWUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuRVNDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWFyY2hCb3guc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5CUykgewotICAgICAgICAgICAgICAgICAgICAvLyBFcmFzZSB0aGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VhcmNoIGJveAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1TZWFyY2hCb3guZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNob3BwZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNob3BwZWQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hvcHBlZCA9IHRleHQuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgICAgICAgICBtU2VhcmNoQm94LnNldFRleHQoY2hvcHBlZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5DUikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSBtU2VhcmNoQm94LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGZpbmROZXh0TmFtZShxdWVyeSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBnaXZlbiBjaGFyYWN0ZXIgdG8gdGhlIHNlYXJjaCBib3gKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IFN0cmluZy52YWx1ZU9mKGV2ZW50LmNoYXJhY3Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWFyY2hCb3guYXBwZW5kKHN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gQWRkIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSB0cmVlIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNsaWNrCi0gICAgICAgIC8vIG9uIGEgbWV0aG9kIHRoYXQgaXMgYSBjaGlsZCBvciBwYXJlbnQgYW5kIGp1bXAgdG8gdGhhdCBtZXRob2QuCi0gICAgICAgIG1UcmVlVmlld2VyCi0gICAgICAgICAgICAgICAgLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsID0gZXYuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERhdGEgbWQgPSAoTWV0aG9kRGF0YSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0TWV0aG9kKG1kLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9maWxlRGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REYXRhIG1kID0gKChQcm9maWxlRGF0YSkgZWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRNZXRob2QobWQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGEgdHJlZSBsaXN0ZW5lciBzbyB0aGF0IHdlIGNhbiBleHBhbmQgdGhlIHBhcmVudHMgYW5kIGNoaWxkcmVuCi0gICAgICAgIC8vIG9mIGEgbWV0aG9kIHdoZW4gYSBtZXRob2QgaXMgZXhwYW5kZWQuCi0gICAgICAgIG1UcmVlVmlld2VyLmFkZFRyZWVMaXN0ZW5lcihuZXcgSVRyZWVWaWV3ZXJMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IChNZXRob2REYXRhKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBleHBhbmROb2RlKG1kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Ci0gICAgICAgICAgICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSB0cmVlLmdldEl0ZW0ocG9pbnQpOwotICAgICAgICAgICAgICAgIE1ldGhvZERhdGEgbWQgPSBtUHJvZmlsZVByb3ZpZGVyLmZpbmRNYXRjaGluZ1RyZWVJdGVtKHRyZWVJdGVtKTsKLSAgICAgICAgICAgICAgICBpZiAobWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTZWxlY3Rpb24+IHNlbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFNlbGVjdGlvbj4oKTsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZChTZWxlY3Rpb24uaGlnaGxpZ2h0KCJNZXRob2REYXRhIiwgbWQpKTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0aW9uQ29udHJvbGxlci5jaGFuZ2Uoc2VsZWN0aW9ucywgIlByb2ZpbGVWaWV3Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5kTmFtZShTdHJpbmcgcXVlcnkpIHsKLSAgICAgICAgTWV0aG9kRGF0YSBtZCA9IG1Qcm9maWxlUHJvdmlkZXIuZmluZE1hdGNoaW5nTmFtZShxdWVyeSk7Ci0gICAgICAgIHNlbGVjdE1ldGhvZChtZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmROZXh0TmFtZShTdHJpbmcgcXVlcnkpIHsKLSAgICAgICAgTWV0aG9kRGF0YSBtZCA9IG1Qcm9maWxlUHJvdmlkZXIuZmluZE5leHRNYXRjaGluZ05hbWUocXVlcnkpOwotICAgICAgICBzZWxlY3RNZXRob2QobWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RNZXRob2QoTWV0aG9kRGF0YSBtZCkgewotICAgICAgICBpZiAobWQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlYXJjaEJveC5zZXRCYWNrZ3JvdW5kKG1Db2xvck5vTWF0Y2gpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1TZWFyY2hCb3guc2V0QmFja2dyb3VuZChtQ29sb3JNYXRjaCk7Ci0gICAgICAgIGhpZ2hsaWdodE1ldGhvZChtZCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG9ianNlcnZhYmxlLCBPYmplY3QgYXJnKSB7Ci0gICAgICAgIC8vIElnbm9yZSB1cGRhdGVzIGZyb20gbXlzZWxmCi0gICAgICAgIGlmIChhcmcgPT0gIlByb2ZpbGVWaWV3IikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGYoInByb2ZpbGV2aWV3IHVwZGF0ZSBmcm9tICVzXG4iLCBhcmcpOwotICAgICAgICBBcnJheUxpc3Q8U2VsZWN0aW9uPiBzZWxlY3Rpb25zOwotICAgICAgICBzZWxlY3Rpb25zID0gbVNlbGVjdGlvbkNvbnRyb2xsZXIuZ2V0U2VsZWN0aW9ucygpOwotICAgICAgICBmb3IgKFNlbGVjdGlvbiBzZWxlY3Rpb24gOiBzZWxlY3Rpb25zKSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb24uQWN0aW9uIGFjdGlvbiA9IHNlbGVjdGlvbi5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gU2VsZWN0aW9uLkFjdGlvbi5IaWdobGlnaHQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAiTWV0aG9kRGF0YSIpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REYXRhIG1kID0gKE1ldGhvZERhdGEpIHNlbGVjdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGhpZ2hsaWdodE1ldGhvZChtZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gIkNhbGwiKSB7Ci0gICAgICAgICAgICAgICAgQ2FsbCBjYWxsID0gKENhbGwpIHNlbGVjdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE1ldGhvZERhdGEgbWQgPSBjYWxsLm1NZXRob2REYXRhOwotICAgICAgICAgICAgICAgIGhpZ2hsaWdodE1ldGhvZChtZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodE1ldGhvZChNZXRob2REYXRhIG1kLCBib29sZWFuIGNsZWFyU2VhcmNoKSB7Ci0gICAgICAgIGlmIChtZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBdm9pZCBhbiBpbmZpbml0ZSByZWN1cnNpb24KLSAgICAgICAgaWYgKG1kID09IG1DdXJyZW50SGlnaGxpZ2h0ZWRNZXRob2QpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChjbGVhclNlYXJjaCkgewotICAgICAgICAgICAgbVNlYXJjaEJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIG1TZWFyY2hCb3guc2V0QmFja2dyb3VuZChtQ29sb3JNYXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRIaWdobGlnaHRlZE1ldGhvZCA9IG1kOwotICAgICAgICBtVHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotICAgICAgICAvLyBFeHBhbmQgdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLSAgICAgICAgZXhwYW5kTm9kZShtZCk7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obWQpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKLSAgICAgICAgVHJlZSB0cmVlID0gbVRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICBUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgdHJlZS5zZXRUb3BJdGVtKGl0ZW1zWzBdKTsKLSAgICAgICAgLy8gd29ya2Fyb3VuZCBhIE1hYyBidWcgYnkgYWRkaW5nIHNob3dJdGVtKCkuCi0gICAgICAgIHRyZWUuc2hvd0l0ZW0oaXRlbXNbMF0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmROb2RlKE1ldGhvZERhdGEgbWQpIHsKLSAgICAgICAgUHJvZmlsZU5vZGVbXSBub2RlcyA9IG1kLmdldFByb2ZpbGVOb2RlcygpOwotICAgICAgICBtVHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKG1kLCB0cnVlKTsKLSAgICAgICAgLy8gQWxzbyBleHBhbmQgdGhlICJQYXJlbnRzIiBhbmQgIkNoaWxkcmVuIiBub2Rlcy4KLSAgICAgICAgZm9yIChQcm9maWxlTm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgIGlmIChub2RlLmlzUmVjdXJzaXZlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgbVRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShub2RlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1F0cmFjZVJlYWRlci5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUXRyYWNlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZGI0YTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvUXRyYWNlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgUXRyYWNlUmVhZGVyIGV4dGVuZHMgVHJhY2VSZWFkZXIgewotICAgIFF0cmFjZVJlYWRlcihTdHJpbmcgdHJhY2VOYW1lKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1ldGhvZERhdGFbXSBnZXRNZXRob2RzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldFRocmVhZExhYmVscygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFycmF5TGlzdDxUaW1lTGluZVZpZXcuUmVjb3JkPiBnZXRUaHJlYWRUaW1lUmVjb3JkcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByb2ZpbGVQcm92aWRlciBnZXRQcm9maWxlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1NlbGVjdGlvbi5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjQ2MTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb24gewotCi0gICAgcHJpdmF0ZSBBY3Rpb24gbUFjdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICBwcml2YXRlIE9iamVjdCBtVmFsdWU7Ci0KLSAgICBwdWJsaWMgU2VsZWN0aW9uKEFjdGlvbiBhY3Rpb24sIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlbGVjdGlvbiBoaWdobGlnaHQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihBY3Rpb24uSGlnaGxpZ2h0LCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZWxlY3Rpb24gaW5jbHVkZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKEFjdGlvbi5JbmNsdWRlLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZWxlY3Rpb24gZXhjbHVkZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKEFjdGlvbi5FeGNsdWRlLCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIG1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKEFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWN0aW9uIGdldEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1BY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIEFjdGlvbiB7Ci0gICAgICAgIEhpZ2hsaWdodCwgSW5jbHVkZSwgRXhjbHVkZSwgQWdncmVnYXRlCi0gICAgfTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1NlbGVjdGlvbkNvbnRyb2xsZXIuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1NlbGVjdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MzBlYS4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9TZWxlY3Rpb25Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29udHJvbGxlciBleHRlbmRzIE9ic2VydmFibGUgewotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U2VsZWN0aW9uPiBtU2VsZWN0aW9uczsKLQotICAgIHB1YmxpYyB2b2lkIGNoYW5nZShBcnJheUxpc3Q8U2VsZWN0aW9uPiBzZWxlY3Rpb25zLCBPYmplY3QgYXJnKSB7Ci0gICAgICAgIHRoaXMubVNlbGVjdGlvbnMgPSBzZWxlY3Rpb25zOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG5vdGlmeU9ic2VydmVycyhhcmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8U2VsZWN0aW9uPiBnZXRTZWxlY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvVGhyZWFkRGF0YS5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvVGhyZWFkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVhODkxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RocmVhZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1jbGFzcyBUaHJlYWREYXRhIGltcGxlbWVudHMgVGltZUxpbmVWaWV3LlJvdyB7Ci0KLSAgICBwcml2YXRlIGludCBtSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1HbG9iYWxTdGFydFRpbWUgPSAtMTsKLSAgICBwcml2YXRlIGxvbmcgbUdsb2JhbEVuZFRpbWUgPSAtMTsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RFdmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1DcHVUaW1lOwotICAgIHByaXZhdGUgQ2FsbCBtUm9vdDsKLSAgICBwcml2YXRlIENhbGwgbUN1cnJlbnQ7Ci0gICAgcHJpdmF0ZSBDYWxsIG1MYXN0Q29udGV4dFN3aXRjaDsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxDYWxsPiBtU3RhY2sgPSBuZXcgQXJyYXlMaXN0PENhbGw+KCk7Ci0gICAgCi0gICAgLy8gVGhpcyBpcyBhIGhhc2ggb2YgYWxsIHRoZSBtZXRob2RzIHRoYXQgYXJlIGN1cnJlbnRseSBvbiB0aGUgc3RhY2suCi0gICAgcHJpdmF0ZSBIYXNoTWFwPE1ldGhvZERhdGEsIEludGVnZXI+IG1TdGFja01ldGhvZHMgPSBuZXcgSGFzaE1hcDxNZXRob2REYXRhLCBJbnRlZ2VyPigpOwotICAgIAotICAgIC8vIFRydWUgaWYgbm8gY2FsbHMgaGF2ZSBldmVyIGJlZW4gYWRkZWQgdG8gdGhpcyB0aHJlYWQKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzRW1wdHk7Ci0KLSAgICBUaHJlYWREYXRhKGludCBpZCwgU3RyaW5nIG5hbWUsIE1ldGhvZERhdGEgdG9wTGV2ZWwpIHsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nLmZvcm1hdCgiWyVkXSAlcyIsIGlkLCBuYW1lKTsKLSAgICAgICAgbVJvb3QgPSBuZXcgQ2FsbChtTmFtZSwgdG9wTGV2ZWwpOwotICAgICAgICBtQ3VycmVudCA9IG1Sb290OwotICAgICAgICBtSXNFbXB0eSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0VtcHR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsIGdldENhbGx0cmVlUm9vdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb290OwotICAgIH0KLQotICAgIHZvaWQgaGFuZGxlQ2FsbChDYWxsIGNhbGwsIGxvbmcgZ2xvYmFsVGltZSkgewotICAgICAgICBtSXNFbXB0eSA9IGZhbHNlOwotICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gY2FsbC5tVGhyZWFkU3RhcnRUaW1lOwotICAgICAgICBpZiAoY3VycmVudFRpbWUgPCBtTGFzdEV2ZW50VGltZSkgewotICAgICAgICAgICAgU3lzdGVtLmVycgotICAgICAgICAgICAgLnByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlRocmVhZERhdGE6ICclMSRzJyBjYWxsIHRpbWUgKCUyJGQpIGlzIGxlc3MgdGhhbiBwcmV2aW91cyB0aW1lICglMyRkKSBmb3IgdGhyZWFkICclNCRzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgY2FsbC5nZXROYW1lKCksIGN1cnJlbnRUaW1lLCBtTGFzdEV2ZW50VGltZSwgbU5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBlbGFwc2VkID0gY3VycmVudFRpbWUgLSBtTGFzdEV2ZW50VGltZTsKLSAgICAgICAgbUNwdVRpbWUgKz0gZWxhcHNlZDsKLSAgICAgICAgaWYgKGNhbGwuZ2V0TWV0aG9kQWN0aW9uKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG1ldGhvZCBlbnRyeS4KLSAgICAgICAgICAgIGVudGVyKGNhbGwsIGVsYXBzZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG1ldGhvZCBleGl0LgotICAgICAgICAgICAgZXhpdChjYWxsLCBlbGFwc2VkLCBnbG9iYWxUaW1lKTsKLSAgICAgICAgfQotICAgICAgICBtTGFzdEV2ZW50VGltZSA9IGN1cnJlbnRUaW1lOwotICAgICAgICBtR2xvYmFsRW5kVGltZSA9IGdsb2JhbFRpbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVudGVyKENhbGwgYywgbG9uZyBlbGFwc2VkKSB7Ci0gICAgICAgIENhbGwgY2FsbGVyID0gbUN1cnJlbnQ7Ci0gICAgICAgIHB1c2goYyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgc3RhY2sgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGlzIGNhbGwKLSAgICAgICAgLy8gaXMgcmVjdXJzaXZlLgotICAgICAgICBNZXRob2REYXRhIG1kID0gYy5tTWV0aG9kRGF0YTsKLSAgICAgICAgSW50ZWdlciBudW0gPSBtU3RhY2tNZXRob2RzLmdldChtZCk7Ci0gICAgICAgIGlmIChudW0gPT0gbnVsbCkgewotICAgICAgICAgICAgbnVtID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICBjLnNldFJlY3Vyc2l2ZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBudW0gKz0gMTsKLSAgICAgICAgbVN0YWNrTWV0aG9kcy5wdXQobWQsIG51bSk7Ci0gICAgICAgIG1DdXJyZW50ID0gYzsKLQotICAgICAgICAvLyBBZGQgdGhlIGVsYXBzZWQgdGltZSB0byB0aGUgY2FsbGVyJ3MgZXhjbHVzaXZlIHRpbWUKLSAgICAgICAgY2FsbGVyLmFkZEV4Y2x1c2l2ZVRpbWUoZWxhcHNlZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4aXQoQ2FsbCBjLCBsb25nIGVsYXBzZWQsIGxvbmcgZ2xvYmFsVGltZSkgewotICAgICAgICBtQ3VycmVudC5tR2xvYmFsRW5kVGltZSA9IGdsb2JhbFRpbWU7Ci0gICAgICAgIENhbGwgdG9wID0gcG9wKCk7Ci0gICAgICAgIGlmICh0b3AgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJyZW50Lm1NZXRob2REYXRhICE9IGMubU1ldGhvZERhdGEpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJNZXRob2QgZXhpdCAoIiArIGMuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIikgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBtZXRob2QgKCIgKyBtQ3VycmVudC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiKSI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gYy5tVGhyZWFkU3RhcnRUaW1lIC0gbUN1cnJlbnQubVRocmVhZFN0YXJ0VGltZTsKLSAgICAgICAgICAgIENhbGwgY2FsbGVyID0gdG9wKCk7Ci0gICAgICAgICAgICBtQ3VycmVudC5hZGRFeGNsdXNpdmVUaW1lKGVsYXBzZWQpOwotICAgICAgICAgICAgbUN1cnJlbnQuYWRkSW5jbHVzaXZlVGltZShkdXJhdGlvbiwgY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjYWxsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxlciA9IG1Sb290OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBjYWxsZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoKENhbGwgYykgewotICAgICAgICBtU3RhY2suYWRkKGMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsIHBvcCgpIHsKLSAgICAgICAgQXJyYXlMaXN0PENhbGw+IHN0YWNrID0gbVN0YWNrOwotICAgICAgICBpZiAoc3RhY2suc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgQ2FsbCB0b3AgPSBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7Ci0gICAgICAgIHN0YWNrLnJlbW92ZShzdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERlY3JlbWVudCB0aGUgY291bnQgb24gdGhlIG1ldGhvZCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcmVtb3ZlCi0gICAgICAgIC8vIHRoZSBlbnRyeSB3aGVuIGl0IGdvZXMgdG8gemVyby4KLSAgICAgICAgTWV0aG9kRGF0YSBtZCA9IHRvcC5tTWV0aG9kRGF0YTsKLSAgICAgICAgSW50ZWdlciBudW0gPSBtU3RhY2tNZXRob2RzLmdldChtZCk7Ci0gICAgICAgIGlmIChudW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbnVtIC09IDE7Ci0gICAgICAgICAgICBpZiAobnVtIDw9IDApIHsKLSAgICAgICAgICAgICAgICBtU3RhY2tNZXRob2RzLnJlbW92ZShtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGFja01ldGhvZHMucHV0KG1kLCBudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgcHVibGljIENhbGwgdG9wKCkgewotICAgICAgICBBcnJheUxpc3Q8Q2FsbD4gc3RhY2sgPSBtU3RhY2s7Ci0gICAgICAgIGlmIChzdGFjay5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGVuZFRyYWNlKCkgewotICAgICAgICAvLyBJZiB3ZSBoYXZlIGNhbGxzIG9uIHRoZSBzdGFjayB3aGVuIHRoZSB0cmFjZSBlbmRzLCB0aGVuIGNsZWFuIHVwCi0gICAgICAgIC8vIHRoZSBzdGFjayBhbmQgY29tcHV0ZSB0aGUgaW5jbHVzaXZlIHRpbWUgb2YgdGhlIG1ldGhvZHMgYnkgcHJldGVuZGluZwotICAgICAgICAvLyB0aGF0IHdlIGFyZSBleGl0aW5nIGZyb20gdGhlaXIgbWV0aG9kcyBub3cuCi0gICAgICAgIHdoaWxlIChtQ3VycmVudCAhPSBtUm9vdCkgewotICAgICAgICAgICAgbG9uZyBkdXJhdGlvbiA9IG1MYXN0RXZlbnRUaW1lIC0gbUN1cnJlbnQubVRocmVhZFN0YXJ0VGltZTsKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgICAgQ2FsbCBjYWxsZXIgPSB0b3AoKTsKLSAgICAgICAgICAgIG1DdXJyZW50LmFkZEluY2x1c2l2ZVRpbWUoZHVyYXRpb24sIGNhbGxlcik7Ci0gICAgICAgICAgICBtQ3VycmVudC5tR2xvYmFsRW5kVGltZSA9IG1HbG9iYWxFbmRUaW1lOwotICAgICAgICAgICAgaWYgKGNhbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGVyID0gbVJvb3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudCA9IGNhbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUxhc3RFdmVudFRpbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3B1VGltZShsb25nIGNwdVRpbWUpIHsKLSAgICAgICAgbUNwdVRpbWUgPSBjcHVUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENwdVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQ3B1VGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHbG9iYWxTdGFydFRpbWUobG9uZyBnbG9iYWxTdGFydFRpbWUpIHsKLSAgICAgICAgbUdsb2JhbFN0YXJ0VGltZSA9IGdsb2JhbFN0YXJ0VGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRHbG9iYWxTdGFydFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2xvYmFsU3RhcnRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RFdmVudFRpbWUobG9uZyBsYXN0RXZlbnRUaW1lKSB7Ci0gICAgICAgIG1MYXN0RXZlbnRUaW1lID0gbGFzdEV2ZW50VGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0RXZlbnRUaW1lKCkgewotICAgICAgICByZXR1cm4gbUxhc3RFdmVudFRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2xvYmFsRW5kVGltZShsb25nIGdsb2JhbEVuZFRpbWUpIHsKLSAgICAgICAgbUdsb2JhbEVuZFRpbWUgPSBnbG9iYWxFbmRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEdsb2JhbEVuZFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2xvYmFsRW5kVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0Q29udGV4dFN3aXRjaChDYWxsIGxhc3RDb250ZXh0U3dpdGNoKSB7Ci0gICAgICAgIG1MYXN0Q29udGV4dFN3aXRjaCA9IGxhc3RDb250ZXh0U3dpdGNoOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsIGdldExhc3RDb250ZXh0U3dpdGNoKCkgewotICAgICAgICByZXR1cm4gbUxhc3RDb250ZXh0U3dpdGNoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RpY2tTY2FsZXIuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RpY2tTY2FsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmYTE2MC4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9UaWNrU2NhbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudHJhY2V2aWV3OwotCi1jbGFzcyBUaWNrU2NhbGVyIHsKLQotICAgIHByaXZhdGUgZG91YmxlIG1NaW5WYWw7IC8vIHJlcXVpcmVkIGlucHV0Ci0gICAgcHJpdmF0ZSBkb3VibGUgbU1heFZhbDsgLy8gcmVxdWlyZWQgaW5wdXQKLSAgICBwcml2YXRlIGRvdWJsZSBtUmFuZ2VWYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbU51bVBpeGVsczsgLy8gcmVxdWlyZWQgaW5wdXQKLSAgICBwcml2YXRlIGludCBtUGl4ZWxzUGVyVGljazsgLy8gcmVxdWlyZWQgaW5wdXQKLSAgICBwcml2YXRlIGRvdWJsZSBtUGl4ZWxzUGVyUmFuZ2U7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbVRpY2tJbmNyZW1lbnQ7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbU1pbk1ham9yVGljazsKLQotICAgIFRpY2tTY2FsZXIoZG91YmxlIG1pblZhbCwgZG91YmxlIG1heFZhbCwgaW50IG51bVBpeGVscywgaW50IHBpeGVsc1BlclRpY2spIHsKLSAgICAgICAgbU1pblZhbCA9IG1pblZhbDsKLSAgICAgICAgbU1heFZhbCA9IG1heFZhbDsKLSAgICAgICAgbU51bVBpeGVscyA9IG51bVBpeGVsczsKLSAgICAgICAgbVBpeGVsc1BlclRpY2sgPSBwaXhlbHNQZXJUaWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pblZhbChkb3VibGUgbWluVmFsKSB7Ci0gICAgICAgIG1NaW5WYWwgPSBtaW5WYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRNaW5WYWwoKSB7Ci0gICAgICAgIHJldHVybiBtTWluVmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1heFZhbChkb3VibGUgbWF4VmFsKSB7Ci0gICAgICAgIG1NYXhWYWwgPSBtYXhWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRNYXhWYWwoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4VmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bVBpeGVscyhpbnQgbnVtUGl4ZWxzKSB7Ci0gICAgICAgIG1OdW1QaXhlbHMgPSBudW1QaXhlbHM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1QaXhlbHMoKSB7Ci0gICAgICAgIHJldHVybiBtTnVtUGl4ZWxzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsc1BlclRpY2soaW50IHBpeGVsc1BlclRpY2spIHsKLSAgICAgICAgbVBpeGVsc1BlclRpY2sgPSBwaXhlbHNQZXJUaWNrOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGl4ZWxzUGVyVGljaygpIHsKLSAgICAgICAgcmV0dXJuIG1QaXhlbHNQZXJUaWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsc1BlclJhbmdlKGRvdWJsZSBwaXhlbHNQZXJSYW5nZSkgewotICAgICAgICBtUGl4ZWxzUGVyUmFuZ2UgPSBwaXhlbHNQZXJSYW5nZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFBpeGVsc1BlclJhbmdlKCkgewotICAgICAgICByZXR1cm4gbVBpeGVsc1BlclJhbmdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpY2tJbmNyZW1lbnQoZG91YmxlIHRpY2tJbmNyZW1lbnQpIHsKLSAgICAgICAgbVRpY2tJbmNyZW1lbnQgPSB0aWNrSW5jcmVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0VGlja0luY3JlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1UaWNrSW5jcmVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbk1ham9yVGljayhkb3VibGUgbWluTWFqb3JUaWNrKSB7Ci0gICAgICAgIG1NaW5NYWpvclRpY2sgPSBtaW5NYWpvclRpY2s7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRNaW5NYWpvclRpY2soKSB7Ci0gICAgICAgIHJldHVybiBtTWluTWFqb3JUaWNrOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgYSB0aW1lIHZhbHVlIHRvIGEgMC1iYXNlZCBwaXhlbCB2YWx1ZQotICAgIHB1YmxpYyBpbnQgdmFsdWVUb1BpeGVsKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gKGludCkgTWF0aC5jZWlsKG1QaXhlbHNQZXJSYW5nZSAqICh2YWx1ZSAtIG1NaW5WYWwpIC0gMC41KTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IGEgdGltZSB2YWx1ZSB0byBhIDAtYmFzZWQgZnJhY3Rpb25hbCBwaXhlbAotICAgIHB1YmxpYyBkb3VibGUgdmFsdWVUb1BpeGVsRnJhY3Rpb24oZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtUGl4ZWxzUGVyUmFuZ2UgKiAodmFsdWUgLSBtTWluVmFsKTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IGEgMC1iYXNlZCBwaXhlbCB2YWx1ZSB0byBhIHRpbWUgdmFsdWUKLSAgICBwdWJsaWMgZG91YmxlIHBpeGVsVG9WYWx1ZShpbnQgcGl4ZWwpIHsKLSAgICAgICAgcmV0dXJuIG1NaW5WYWwgKyAocGl4ZWwgLyBtUGl4ZWxzUGVyUmFuZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVUaWNrcyhib29sZWFuIHVzZUdpdmVuRW5kUG9pbnRzKSB7Ci0gICAgICAgIGludCBudW1UaWNrcyA9IG1OdW1QaXhlbHMgLyBtUGl4ZWxzUGVyVGljazsKLSAgICAgICAgbVJhbmdlVmFsID0gbU1heFZhbCAtIG1NaW5WYWw7Ci0gICAgICAgIG1UaWNrSW5jcmVtZW50ID0gbVJhbmdlVmFsIC8gbnVtVGlja3M7Ci0gICAgICAgIGRvdWJsZSBkbG9nVGlja0luY3JlbWVudCA9IE1hdGgubG9nMTAobVRpY2tJbmNyZW1lbnQpOwotICAgICAgICBpbnQgbG9nVGlja0luY3JlbWVudCA9IChpbnQpIE1hdGguZmxvb3IoZGxvZ1RpY2tJbmNyZW1lbnQpOwotICAgICAgICBkb3VibGUgc2NhbGUgPSBNYXRoLnBvdygxMCwgbG9nVGlja0luY3JlbWVudCk7Ci0gICAgICAgIGRvdWJsZSBzY2FsZWRUaWNrSW5jciA9IG1UaWNrSW5jcmVtZW50IC8gc2NhbGU7Ci0gICAgICAgIGlmIChzY2FsZWRUaWNrSW5jciA+IDUuMCkKLSAgICAgICAgICAgIHNjYWxlZFRpY2tJbmNyID0gMTA7Ci0gICAgICAgIGVsc2UgaWYgKHNjYWxlZFRpY2tJbmNyID4gMikKLSAgICAgICAgICAgIHNjYWxlZFRpY2tJbmNyID0gNTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbGVkVGlja0luY3IgPiAxKQotICAgICAgICAgICAgc2NhbGVkVGlja0luY3IgPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzY2FsZWRUaWNrSW5jciA9IDE7Ci0gICAgICAgIG1UaWNrSW5jcmVtZW50ID0gc2NhbGVkVGlja0luY3IgKiBzY2FsZTsKLQotICAgICAgICBpZiAoIXVzZUdpdmVuRW5kUG9pbnRzKSB7Ci0gICAgICAgICAgICAvLyBSb3VuZCB1cCB0aGUgbWF4IHZhbCB0byB0aGUgbmV4dCBtaW5vciB0aWNrCi0gICAgICAgICAgICBkb3VibGUgbWlub3JUaWNrSW5jcmVtZW50ID0gbVRpY2tJbmNyZW1lbnQgLyA1OwotICAgICAgICAgICAgZG91YmxlIGR2YWwgPSBtTWF4VmFsIC8gbWlub3JUaWNrSW5jcmVtZW50OwotICAgICAgICAgICAgaW50IGl2YWwgPSAoaW50KSBkdmFsOwotICAgICAgICAgICAgaWYgKGl2YWwgIT0gZHZhbCkKLSAgICAgICAgICAgICAgICBtTWF4VmFsID0gKGl2YWwgKyAxKSAqIG1pbm9yVGlja0luY3JlbWVudDsKLQotICAgICAgICAgICAgLy8gUm91bmQgZG93biB0aGUgbWluIHZhbCB0byBhIG11bHRpcGxlIG9mIHRpY2tJbmNyZW1lbnQKLSAgICAgICAgICAgIGl2YWwgPSAoaW50KSAobU1pblZhbCAvIG1UaWNrSW5jcmVtZW50KTsKLSAgICAgICAgICAgIG1NaW5WYWwgPSBpdmFsICogbVRpY2tJbmNyZW1lbnQ7Ci0gICAgICAgICAgICBtTWluTWFqb3JUaWNrID0gbU1pblZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBpdmFsID0gKGludCkgKG1NaW5WYWwgLyBtVGlja0luY3JlbWVudCk7Ci0gICAgICAgICAgICBtTWluTWFqb3JUaWNrID0gaXZhbCAqIG1UaWNrSW5jcmVtZW50OwotICAgICAgICAgICAgaWYgKG1NaW5NYWpvclRpY2sgPCBtTWluVmFsKQotICAgICAgICAgICAgICAgIG1NaW5NYWpvclRpY2sgPSBtTWluTWFqb3JUaWNrICsgbVRpY2tJbmNyZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtUmFuZ2VWYWwgPSBtTWF4VmFsIC0gbU1pblZhbDsKLSAgICAgICAgbVBpeGVsc1BlclJhbmdlID0gKGRvdWJsZSkgbU51bVBpeGVscyAvIG1SYW5nZVZhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9UaW1lTGluZVZpZXcuamF2YSBiL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RpbWVMaW5lVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RjOTdiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RpbWVMaW5lVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50cmFjZXZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZlcjsKLQotcHVibGljIGNsYXNzIFRpbWVMaW5lVmlldyBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIE9ic2VydmVyIHsKLQotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFJvd0RhdGE+IG1Sb3dCeU5hbWU7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbVRvdGFsRWxhcHNlZDsKLSAgICBwcml2YXRlIFJvd0RhdGFbXSBtUm93czsKLSAgICBwcml2YXRlIFNlZ21lbnRbXSBtU2VnbWVudHM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U2VnbWVudD4gbVNlZ21lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxTZWdtZW50PigpOwotICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IG1UaHJlYWRMYWJlbHM7Ci0gICAgcHJpdmF0ZSBUaW1lc2NhbGUgbVRpbWVzY2FsZTsKLSAgICBwcml2YXRlIFN1cmZhY2UgbVN1cmZhY2U7Ci0gICAgcHJpdmF0ZSBSb3dMYWJlbHMgbUxhYmVsczsKLSAgICBwcml2YXRlIFNhc2hGb3JtIG1TYXNoRm9ybTsKLSAgICBwcml2YXRlIGludCBtU2Nyb2xsT2Zmc2V0WTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBpeGVsc1BlclRpY2sgPSA1MDsKLSAgICBwcml2YXRlIFRpY2tTY2FsZXIgbVNjYWxlSW5mbyA9IG5ldyBUaWNrU2NhbGVyKDAsIDAsIDAsIFBpeGVsc1BlclRpY2spOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMZWZ0TWFyZ2luID0gMTA7IC8vIGJsYW5rIHNwYWNlIG9uIGxlZnQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUmlnaHRNYXJnaW4gPSA2MDsgLy8gYmxhbmsgc3BhY2Ugb24gcmlnaHQKLQotICAgIHByaXZhdGUgQ29sb3IgbUNvbG9yQmxhY2s7Ci0gICAgcHJpdmF0ZSBDb2xvciBtQ29sb3JHcmF5OwotICAgIHByaXZhdGUgQ29sb3IgbUNvbG9yRGFya0dyYXk7Ci0gICAgcHJpdmF0ZSBDb2xvciBtQ29sb3JGb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgQ29sb3IgbUNvbG9yUm93QmFjazsKLSAgICBwcml2YXRlIENvbG9yIG1Db2xvclpvb21TZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBGb250UmVnaXN0cnkgbUZvbnRSZWdpc3RyeTsKLQotICAgIC8qKiB2ZXJ0aWNhbCBoZWlnaHQgb2YgZHJhd24gYmxvY2tzIGluIGVhY2ggcm93ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJvd0hlaWdodCA9IDIwOwotCi0gICAgLyoqIHRoZSBibGFuayBzcGFjZSBiZXR3ZWVuIHJvd3MgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcm93WU1hcmdpbiA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByb3dZTWFyZ2luSGFsZiA9IHJvd1lNYXJnaW4gLyAyOwotCi0gICAgLyoqIHRvdGFsIHZlcnRpY2FsIHNwYWNlIGZvciByb3cgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcm93WVNwYWNlID0gcm93SGVpZ2h0ICsgcm93WU1hcmdpbjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWFqb3JUaWNrTGVuZ3RoID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWlub3JUaWNrTGVuZ3RoID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGltZUxpbmVPZmZzZXRZID0gMzg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRpY2tUb0ZvbnRTcGFjaW5nID0gMjsKLQotICAgIC8qKiBzdGFydCBvZiBmaXJzdCByb3cgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdG9wTWFyZ2luID0gNzA7Ci0gICAgcHJpdmF0ZSBpbnQgbU1vdXNlUm93ID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbU51bVJvd3M7Ci0gICAgcHJpdmF0ZSBpbnQgbVN0YXJ0Um93OwotICAgIHByaXZhdGUgaW50IG1FbmRSb3c7Ci0gICAgcHJpdmF0ZSBUcmFjZVVuaXRzIG1Vbml0czsKLSAgICBwcml2YXRlIGludCBtU21hbGxGb250V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNtYWxsRm9udEhlaWdodDsKLSAgICBwcml2YXRlIGludCBtTWVkaXVtRm9udFdpZHRoOwotICAgIHByaXZhdGUgU2VsZWN0aW9uQ29udHJvbGxlciBtU2VsZWN0aW9uQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1ldGhvZERhdGEgbUhpZ2hsaWdodE1ldGhvZERhdGE7Ci0gICAgcHJpdmF0ZSBDYWxsIG1IaWdobGlnaHRDYWxsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNaW5JbmNsdXNpdmVSYW5nZSA9IDM7Ci0KLSAgICAvKiogU2V0dGluZyB0aGUgZm9udHMgbG9va3MgZ29vZCBvbiBMaW51eCBidXQgYmFkIG9uIE1hY3MgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVNldEZvbnRzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCbG9jayB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICAgICAgICBwdWJsaWMgTWV0aG9kRGF0YSBnZXRNZXRob2REYXRhKCk7Ci0gICAgICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0VGltZSgpOwotICAgICAgICBwdWJsaWMgbG9uZyBnZXRFbmRUaW1lKCk7Ci0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRDb2xvcigpOwotICAgICAgICBwdWJsaWMgZG91YmxlIGFkZFdlaWdodChpbnQgeCwgaW50IHksIGRvdWJsZSB3ZWlnaHQpOwotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcldlaWdodCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJvdyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKTsKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWNvcmQgewotICAgICAgICBSb3cgcm93OwotICAgICAgICBCbG9jayBibG9jazsKLQotICAgICAgICBwdWJsaWMgUmVjb3JkKFJvdyByb3csIEJsb2NrIGJsb2NrKSB7Ci0gICAgICAgICAgICB0aGlzLnJvdyA9IHJvdzsKLSAgICAgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lTGluZVZpZXcoQ29tcG9zaXRlIHBhcmVudCwgVHJhY2VSZWFkZXIgcmVhZGVyLAotICAgICAgICAgICAgU2VsZWN0aW9uQ29udHJvbGxlciBzZWxlY3Rpb25Db250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBtUm93QnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSb3dEYXRhPigpOwotICAgICAgICB0aGlzLm1TZWxlY3Rpb25Db250cm9sbGVyID0gc2VsZWN0aW9uQ29udHJvbGxlcjsKLSAgICAgICAgc2VsZWN0aW9uQ29udHJvbGxlci5hZGRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgbVVuaXRzID0gcmVhZGVyLmdldFRyYWNlVW5pdHMoKTsKLSAgICAgICAgbVRocmVhZExhYmVscyA9IHJlYWRlci5nZXRUaHJlYWRMYWJlbHMoKTsKLQotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0gICAgICAgIG1Db2xvckdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLSAgICAgICAgbUNvbG9yRGFya0dyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotICAgICAgICBtQ29sb3JCbGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLSAgICAgICAgLy8gbUNvbG9yQmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLSAgICAgICAgbUNvbG9yRm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLSAgICAgICAgbUNvbG9yUm93QmFjayA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNDAsIDI0MCwgMjU1KTsKLSAgICAgICAgbUNvbG9yWm9vbVNlbGVjdGlvbiA9IG5ldyBDb2xvcihkaXNwbGF5LCAyMzAsIDIzMCwgMjMwKTsKLQotICAgICAgICBtRm9udFJlZ2lzdHJ5ID0gbmV3IEZvbnRSZWdpc3RyeShkaXNwbGF5KTsKLSAgICAgICAgbUZvbnRSZWdpc3RyeS5wdXQoInNtYWxsIiwgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbmV3IEZvbnREYXRhW10geyBuZXcgRm9udERhdGEoIkFyaWFsIiwgOCwgU1dULk5PUk1BTCkgfSk7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtRm9udFJlZ2lzdHJ5LnB1dCgiY291cmllcjgiLCAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBuZXcgRm9udERhdGFbXSB7IG5ldyBGb250RGF0YSgiQ291cmllciBOZXciLCA4LCBTV1QuQk9MRCkgfSk7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtRm9udFJlZ2lzdHJ5LnB1dCgibWVkaXVtIiwgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgbmV3IEZvbnREYXRhW10geyBuZXcgRm9udERhdGEoIkNvdXJpZXIgTmV3IiwgMTAsIFNXVC5OT1JNQUwpIH0pOyAgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBuZXcgUmVjdGFuZ2xlKDEwMCwgMTAwLCAxMDAsIDEwMCkpOwotICAgICAgICBHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0gICAgICAgIGlmIChtU2V0Rm9udHMpIHsKLSAgICAgICAgICAgIGdjLnNldEZvbnQobUZvbnRSZWdpc3RyeS5nZXQoInNtYWxsIikpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBtU21hbGxGb250V2lkdGggPSBnYy5nZXRGb250TWV0cmljcygpLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLSAgICAgICAgbVNtYWxsRm9udEhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgaWYgKG1TZXRGb250cykgewotICAgICAgICAgICAgZ2Muc2V0Rm9udChtRm9udFJlZ2lzdHJ5LmdldCgibWVkaXVtIikpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBtTWVkaXVtRm9udFdpZHRoID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0KLSAgICAgICAgaW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICBnYy5kaXNwb3NlKCk7Ci0KLSAgICAgICAgc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHNhc2ggZm9ybSBmb3IgaG9sZGluZyB0d28gY2FudmFzIHZpZXdzLCBvbmUgZm9yIHRoZQotICAgICAgICAvLyB0aHJlYWQgbGFiZWxzIGFuZCBvbmUgZm9yIHRoZSB0aHJlYWQgdGltZWxpbmUuCi0gICAgICAgIG1TYXNoRm9ybSA9IG5ldyBTYXNoRm9ybSh0aGlzLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIG1TYXNoRm9ybS5zZXRCYWNrZ3JvdW5kKG1Db2xvckdyYXkpOwotICAgICAgICBtU2FzaEZvcm0uU0FTSF9XSURUSCA9IDM7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRlIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzYXNoCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1TYXNoRm9ybSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUgLyogbWFrZSBjb2x1bW5zIGVxdWFsIHdpZHRoICovKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBibGFuayBjb3JuZXIgc3BhY2UgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgIEJsYW5rQ29ybmVyIGNvcm5lciA9IG5ldyBCbGFua0Nvcm5lcihjb21wb3NpdGUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gdG9wTWFyZ2luOwotICAgICAgICBjb3JuZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIHRocmVhZCBsYWJlbHMgYmVsb3cgdGhlIGJsYW5rIGNvcm5lci4KLSAgICAgICAgbUxhYmVscyA9IG5ldyBSb3dMYWJlbHMoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgbUxhYmVscy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhbm90aGVyIGNvbXBvc2l0ZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNhc2gKLSAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtU2FzaEZvcm0sIFNXVC5OT05FKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSAvKiBtYWtlIGNvbHVtbnMgZXF1YWwgd2lkdGggKi8pOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgICAgICBtVGltZXNjYWxlID0gbmV3IFRpbWVzY2FsZShjb21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gdG9wTWFyZ2luOwotICAgICAgICBtVGltZXNjYWxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgbVN1cmZhY2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG1TYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDEsIDUgfSk7Ci0KLSAgICAgICAgZmluYWwgU2Nyb2xsQmFyIHZCYXIgPSBtU3VyZmFjZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICB2QmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgICAgbVNjcm9sbE9mZnNldFkgPSB2QmFyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgUG9pbnQgZGltID0gbVN1cmZhY2UuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbE9mZnNldFkgPSBjb21wdXRlVmlzaWJsZVJvd3MoZGltLnkpOwotICAgICAgICAgICAgICAgaWYgKG5ld1Njcm9sbE9mZnNldFkgIT0gbVNjcm9sbE9mZnNldFkpIHsKLSAgICAgICAgICAgICAgICAgICBtU2Nyb2xsT2Zmc2V0WSA9IG5ld1Njcm9sbE9mZnNldFk7Ci0gICAgICAgICAgICAgICAgICAgdkJhci5zZXRTZWxlY3Rpb24obmV3U2Nyb2xsT2Zmc2V0WSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBtTGFiZWxzLnJlZHJhdygpOwotICAgICAgICAgICAgICAgbVN1cmZhY2UucmVkcmF3KCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBtU3VyZmFjZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgZGltID0gbVN1cmZhY2UuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdGhlIHNjcm9sbCBiYXIgdGhlbiBkb24ndCBkaXNwbGF5IGl0LgotICAgICAgICAgICAgICAgIGlmIChkaW0ueSA+PSBtTnVtUm93cyAqIHJvd1lTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICB2QmFyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbE9mZnNldFkgPSBjb21wdXRlVmlzaWJsZVJvd3MoZGltLnkpOwotICAgICAgICAgICAgICAgIGlmIChuZXdTY3JvbGxPZmZzZXRZICE9IG1TY3JvbGxPZmZzZXRZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JvbGxPZmZzZXRZID0gbmV3U2Nyb2xsT2Zmc2V0WTsKLSAgICAgICAgICAgICAgICAgICAgdkJhci5zZXRTZWxlY3Rpb24obmV3U2Nyb2xsT2Zmc2V0WSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBzcGFjZU5lZWRlZCA9IG1OdW1Sb3dzICogcm93WVNwYWNlOwotICAgICAgICAgICAgICAgIHZCYXIuc2V0TWF4aW11bShzcGFjZU5lZWRlZCk7Ci0gICAgICAgICAgICAgICAgdkJhci5zZXRUaHVtYihkaW0ueSk7Ci0KLSAgICAgICAgICAgICAgICBtTGFiZWxzLnJlZHJhdygpOwotICAgICAgICAgICAgICAgIG1TdXJmYWNlLnJlZHJhdygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtU3VyZmFjZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlLm1vdXNlVXAobWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IG1lKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2UubW91c2VEb3duKG1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgbWUpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZS5tb3VzZURvdWJsZUNsaWNrKG1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBtU3VyZmFjZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlLm1vdXNlTW92ZShtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1UaW1lc2NhbGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgbWUpIHsKLSAgICAgICAgICAgICAgICBtVGltZXNjYWxlLm1vdXNlVXAobWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IG1lKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzY2FsZS5tb3VzZURvd24obWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgICAgIG1UaW1lc2NhbGUubW91c2VEb3VibGVDbGljayhtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbVRpbWVzY2FsZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgICAgIG1UaW1lc2NhbGUubW91c2VNb3ZlKG1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbUxhYmVscy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgICAgIG1MYWJlbHMubW91c2VNb3ZlKG1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2V0RGF0YShyZWFkZXIuZ2V0VGhyZWFkVGltZVJlY29yZHMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgb2Jqc2VydmFibGUsIE9iamVjdCBhcmcpIHsKLSAgICAgICAgLy8gSWdub3JlIHVwZGF0ZXMgZnJvbSBteXNlbGYKLSAgICAgICAgaWYgKGFyZyA9PSAiVGltZUxpbmVWaWV3IikgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCJ0aW1lbGluZSB1cGRhdGUgZnJvbSAlc1xuIiwgYXJnKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZEhpZ2hsaWdodCA9IGZhbHNlOwotICAgICAgICBBcnJheUxpc3Q8U2VsZWN0aW9uPiBzZWxlY3Rpb25zOwotICAgICAgICBzZWxlY3Rpb25zID0gbVNlbGVjdGlvbkNvbnRyb2xsZXIuZ2V0U2VsZWN0aW9ucygpOwotICAgICAgICBmb3IgKFNlbGVjdGlvbiBzZWxlY3Rpb24gOiBzZWxlY3Rpb25zKSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb24uQWN0aW9uIGFjdGlvbiA9IHNlbGVjdGlvbi5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gU2VsZWN0aW9uLkFjdGlvbi5IaWdobGlnaHQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50ZigiIHRpbWVsaW5lIGhpZ2hsaWdodCAlcyBmcm9tICVzXG4iLCBuYW1lLCBhcmcpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gIk1ldGhvZERhdGEiKSB7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvdW5kSGlnaGxpZ2h0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0TWV0aG9kRGF0YSA9IChNZXRob2REYXRhKSBzZWxlY3Rpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50ZigiIG1ldGhvZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAvLyBoaWdobGlnaHRNZXRob2REYXRhLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbUhpZ2hsaWdodENhbGwgPSBudWxsOwotICAgICAgICAgICAgICAgIHN0YXJ0SGlnaGxpZ2h0aW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIkNhbGwiKSB7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvdW5kSGlnaGxpZ2h0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0Q2FsbCA9IChDYWxsKSBzZWxlY3Rpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50ZigiIGNhbGwgJXNcbiIsIGhpZ2hsaWdodENhbGwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0TWV0aG9kRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3RhcnRIaWdobGlnaHRpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZm91bmRIaWdobGlnaHQgPT0gZmFsc2UpCi0gICAgICAgICAgICBtU3VyZmFjZS5jbGVhckhpZ2hsaWdodHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKEFycmF5TGlzdDxSZWNvcmQ+IHJlY29yZHMpIHsKLSAgICAgICAgaWYgKHJlY29yZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PFJlY29yZD4oKTsKLQotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZWxpbmVWaWV3KCkgbGlzdCBvZiByZWNvcmRzOiIpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiByZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInJvdyAnJXMnIGJsb2NrICclcycgWyVkLCAlZF1cbiIsIHIucm93ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgci5ibG9jay5nZXROYW1lKCksIHIuYmxvY2suZ2V0U3RhcnRUaW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByLmJsb2NrLmdldEVuZFRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHIuYmxvY2suZ2V0U3RhcnRUaW1lKCkgPiByLmJsb2NrLmdldEVuZFRpbWUoKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiRXJyb3I6IGJsb2NrIHN0YXJ0VGltZSA+IGVuZFRpbWVcbiIpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU29ydCB0aGUgcmVjb3JkcyBpbnRvIGluY3JlYXNpbmcgc3RhcnQgdGltZSwgYW5kIGRlY3JlYXNpbmcgZW5kIHRpbWUKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZWNvcmRzLCBuZXcgQ29tcGFyYXRvcjxSZWNvcmQ+KCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJlY29yZCByMSwgUmVjb3JkIHIyKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydDEgPSByMS5ibG9jay5nZXRTdGFydFRpbWUoKTsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0MiA9IHIyLmJsb2NrLmdldFN0YXJ0VGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydDEgPiBzdGFydDIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIGlmIChzdGFydDEgPCBzdGFydDIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBzdGFydCB0aW1lcyBhcmUgdGhlIHNhbWUsIHNvIGNvbXBhcmUgdGhlIGVuZCB0aW1lcwotICAgICAgICAgICAgICAgIGxvbmcgZW5kMSA9IHIxLmJsb2NrLmdldEVuZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBsb25nIGVuZDIgPSByMi5ibG9jay5nZXRFbmRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZDEgPiBlbmQyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZDEgPCBlbmQyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBUaGUgcmVjb3JkcyBhcmUgc29ydGVkIGludG8gaW5jcmVhc2luZyBzdGFydCB0aW1lLAotICAgICAgICAvLyBzbyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGlzIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBmaXJzdCByZWNvcmQuCi0gICAgICAgIGRvdWJsZSBtaW5WYWwgPSAwOwotICAgICAgICBpZiAocmVjb3Jkcy5zaXplKCkgPiAwKQotICAgICAgICAgICAgbWluVmFsID0gcmVjb3Jkcy5nZXQoMCkuYmxvY2suZ2V0U3RhcnRUaW1lKCk7Ci0KLSAgICAgICAgLy8gU3VtIHRoZSB0aW1lIHNwZW50IGluIGVhY2ggcm93IGFuZCBibG9jaywgYW5kCi0gICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIG1heGltdW0gZW5kIHRpbWUuCi0gICAgICAgIGRvdWJsZSBtYXhWYWwgPSAwOwotICAgICAgICBmb3IgKFJlY29yZCByZWMgOiByZWNvcmRzKSB7Ci0gICAgICAgICAgICBSb3cgcm93ID0gcmVjLnJvdzsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gcmVjLmJsb2NrOwotICAgICAgICAgICAgU3RyaW5nIHJvd05hbWUgPSByb3cuZ2V0TmFtZSgpOwotICAgICAgICAgICAgUm93RGF0YSByZCA9IG1Sb3dCeU5hbWUuZ2V0KHJvd05hbWUpOwotICAgICAgICAgICAgaWYgKHJkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZCA9IG5ldyBSb3dEYXRhKHJvdyk7Ci0gICAgICAgICAgICAgICAgbVJvd0J5TmFtZS5wdXQocm93TmFtZSwgcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9uZyBibG9ja1N0YXJ0VGltZSA9IGJsb2NrLmdldFN0YXJ0VGltZSgpOwotICAgICAgICAgICAgbG9uZyBibG9ja0VuZFRpbWUgPSBibG9jay5nZXRFbmRUaW1lKCk7Ci0gICAgICAgICAgICBpZiAoYmxvY2tFbmRUaW1lID4gcmQubUVuZFRpbWUpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gTWF0aC5tYXgoYmxvY2tTdGFydFRpbWUsIHJkLm1FbmRUaW1lKTsKLSAgICAgICAgICAgICAgICByZC5tRWxhcHNlZCArPSBibG9ja0VuZFRpbWUgLSBzdGFydDsKLSAgICAgICAgICAgICAgICBtVG90YWxFbGFwc2VkICs9IGJsb2NrRW5kVGltZSAtIHN0YXJ0OwotICAgICAgICAgICAgICAgIHJkLm1FbmRUaW1lID0gYmxvY2tFbmRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJsb2NrRW5kVGltZSA+IG1heFZhbCkKLSAgICAgICAgICAgICAgICBtYXhWYWwgPSBibG9ja0VuZFRpbWU7Ci0KLSAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgbmVzdGVkIGJsb2NrcyBieSB1c2luZyBhIHN0YWNrIChmb3IgZWFjaCByb3cpLgotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgU2VnbWVudCBvYmplY3QgZm9yIGVhY2ggdmlzaWJsZSBwYXJ0IG9mIGEgYmxvY2suCi0gICAgICAgICAgICBCbG9jayB0b3AgPSByZC50b3AoKTsKLSAgICAgICAgICAgIGlmICh0b3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJkLnB1c2goYmxvY2spOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIHRvcFN0YXJ0VGltZSA9IHRvcC5nZXRTdGFydFRpbWUoKTsKLSAgICAgICAgICAgIGxvbmcgdG9wRW5kVGltZSA9IHRvcC5nZXRFbmRUaW1lKCk7Ci0gICAgICAgICAgICBpZiAodG9wRW5kVGltZSA+PSBibG9ja1N0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHNlZ21lbnQgaWYgaXQgaGFzIGEgbm9uLXplcm8gZWxhcHNlZCB0aW1lLgotICAgICAgICAgICAgICAgIGlmICh0b3BTdGFydFRpbWUgPCBibG9ja1N0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgICAgICBTZWdtZW50IHNlZ21lbnQgPSBuZXcgU2VnbWVudChyZCwgdG9wLCB0b3BTdGFydFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTdGFydFRpbWUpOwotICAgICAgICAgICAgICAgICAgICBtU2VnbWVudExpc3QuYWRkKHNlZ21lbnQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYmxvY2sgc3RhcnRzIHdoZXJlIHRoZSBwcmV2aW91cyAodG9wKSBibG9jayBlbmRzLAotICAgICAgICAgICAgICAgIC8vIHRoZW4gcG9wIG9mZiB0aGUgdG9wIGJsb2NrLgotICAgICAgICAgICAgICAgIGlmICh0b3BFbmRUaW1lID09IGJsb2NrU3RhcnRUaW1lKQotICAgICAgICAgICAgICAgICAgICByZC5wb3AoKTsKLSAgICAgICAgICAgICAgICByZC5wdXNoKGJsb2NrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgdG8gcG9wIHNldmVyYWwgZnJhbWVzIGhlcmUuCi0gICAgICAgICAgICAgICAgcG9wRnJhbWVzKHJkLCB0b3AsIGJsb2NrU3RhcnRUaW1lKTsKLSAgICAgICAgICAgICAgICByZC5wdXNoKGJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsZWFuIHVwIHRoZSBzdGFjayBvZiBlYWNoIHJvdwotICAgICAgICBmb3IgKFJvd0RhdGEgcmQgOiBtUm93QnlOYW1lLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBCbG9jayB0b3AgPSByZC50b3AoKTsKLSAgICAgICAgICAgIHBvcEZyYW1lcyhyZCwgdG9wLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3VyZmFjZS5zZXRSYW5nZShtaW5WYWwsIG1heFZhbCk7Ci0gICAgICAgIG1TdXJmYWNlLnNldExpbWl0UmFuZ2UobWluVmFsLCBtYXhWYWwpOwotCi0gICAgICAgIC8vIFNvcnQgdGhlIHJvd3MgaW50byBkZWNyZWFzaW5nIGVsYXBzZWQgdGltZQotICAgICAgICBDb2xsZWN0aW9uPFJvd0RhdGE+IHJ2ID0gbVJvd0J5TmFtZS52YWx1ZXMoKTsKLSAgICAgICAgbVJvd3MgPSBydi50b0FycmF5KG5ldyBSb3dEYXRhW3J2LnNpemUoKV0pOwotICAgICAgICBBcnJheXMuc29ydChtUm93cywgbmV3IENvbXBhcmF0b3I8Um93RGF0YT4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUm93RGF0YSByZDEsIFJvd0RhdGEgcmQyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIChyZDIubUVsYXBzZWQgLSByZDEubUVsYXBzZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBBc3NpZ24gcmFua3MgdG8gdGhlIHNvcnRlZCByb3dzCi0gICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBtUm93cy5sZW5ndGg7ICsraWkpIHsKLSAgICAgICAgICAgIG1Sb3dzW2lpXS5tUmFuayA9IGlpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHJvd3Mgd2l0aCBkYXRhCi0gICAgICAgIG1OdW1Sb3dzID0gMDsKLSAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1Sb3dzLmxlbmd0aDsgKytpaSkgewotICAgICAgICAgICAgaWYgKG1Sb3dzW2lpXS5tRWxhcHNlZCA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgbU51bVJvd3MgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNvcnQgdGhlIGJsb2NrcyBpbnRvIGluY3JlYXNpbmcgcm93cywgYW5kIHdpdGhpbiByb3dzIGludG8KLSAgICAgICAgLy8gaW5jcmVhc2luZyBzdGFydCB2YWx1ZXMuCi0gICAgICAgIG1TZWdtZW50cyA9IG1TZWdtZW50TGlzdC50b0FycmF5KG5ldyBTZWdtZW50W21TZWdtZW50TGlzdC5zaXplKCldKTsKLSAgICAgICAgQXJyYXlzLnNvcnQobVNlZ21lbnRzLCBuZXcgQ29tcGFyYXRvcjxTZWdtZW50PigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTZWdtZW50IGJkMSwgU2VnbWVudCBiZDIpIHsKLSAgICAgICAgICAgICAgICBSb3dEYXRhIHJkMSA9IGJkMS5tUm93RGF0YTsKLSAgICAgICAgICAgICAgICBSb3dEYXRhIHJkMiA9IGJkMi5tUm93RGF0YTsKLSAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IHJkMS5tUmFuayAtIHJkMi5tUmFuazsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBiZDEubVN0YXJ0VGltZSAtIGJkMi5tU3RhcnRUaW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAodGltZURpZmYgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEaWZmID0gYmQxLm1FbmRUaW1lIC0gYmQyLm1FbmRUaW1lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgdGltZURpZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBkaWZmOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZvciAoU2VnbWVudCBzZWdtZW50IDogbVNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInNlZyAnJXMnIFslNmQsICU2ZF0gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1Sb3dEYXRhLm1OYW1lLCBzZWdtZW50Lm1TdGFydFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1FbmRUaW1lLCBzZWdtZW50Lm1CbG9jay5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChzZWdtZW50Lm1TdGFydFRpbWUgPiBzZWdtZW50Lm1FbmRUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJFcnJvcjogc2VnbWVudCBzdGFydFRpbWUgPiBlbmRUaW1lXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcEZyYW1lcyhSb3dEYXRhIHJkLCBCbG9jayB0b3AsIGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgIGxvbmcgdG9wRW5kVGltZSA9IHRvcC5nZXRFbmRUaW1lKCk7Ci0gICAgICAgIGxvbmcgbGFzdEVuZFRpbWUgPSB0b3AuZ2V0U3RhcnRUaW1lKCk7Ci0gICAgICAgIHdoaWxlICh0b3BFbmRUaW1lIDw9IHN0YXJ0VGltZSkgewotICAgICAgICAgICAgaWYgKHRvcEVuZFRpbWUgPiBsYXN0RW5kVGltZSkgewotICAgICAgICAgICAgICAgIFNlZ21lbnQgc2VnbWVudCA9IG5ldyBTZWdtZW50KHJkLCB0b3AsIGxhc3RFbmRUaW1lLCB0b3BFbmRUaW1lKTsKLSAgICAgICAgICAgICAgICBtU2VnbWVudExpc3QuYWRkKHNlZ21lbnQpOwotICAgICAgICAgICAgICAgIGxhc3RFbmRUaW1lID0gdG9wRW5kVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJkLnBvcCgpOwotICAgICAgICAgICAgdG9wID0gcmQudG9wKCk7Ci0gICAgICAgICAgICBpZiAodG9wID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgdG9wRW5kVGltZSA9IHRvcC5nZXRFbmRUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB0b3BFbmRUaW1lID4gc3RhcnRUaW1lCi0gICAgICAgIGlmIChsYXN0RW5kVGltZSA8IHN0YXJ0VGltZSkgewotICAgICAgICAgICAgU2VnbWVudCBiZCA9IG5ldyBTZWdtZW50KHJkLCB0b3AsIGxhc3RFbmRUaW1lLCBzdGFydFRpbWUpOwotICAgICAgICAgICAgbVNlZ21lbnRMaXN0LmFkZChiZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJvd0xhYmVscyBleHRlbmRzIENhbnZhcyB7Ci0KLSAgICAgICAgLyoqIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSByb3cgbGFiZWwgYW5kIHRoZSBzYXNoIGxpbmUgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGxhYmVsTWFyZ2luWCA9IDI7Ci0KLSAgICAgICAgcHVibGljIFJvd0xhYmVscyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT19CQUNLR1JPVU5EKTsKLSAgICAgICAgICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJhdyhwZS5kaXNwbGF5LCBwZS5nYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgbWUpIHsKLSAgICAgICAgICAgIGludCByb3dudW0gPSAobWUueSArIG1TY3JvbGxPZmZzZXRZKSAvIHJvd1lTcGFjZTsKLSAgICAgICAgICAgIGlmIChtTW91c2VSb3cgIT0gcm93bnVtKSB7Ci0gICAgICAgICAgICAgICAgbU1vdXNlUm93ID0gcm93bnVtOwotICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgICAgIG1TdXJmYWNlLnJlZHJhdygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXcoRGlzcGxheSBkaXNwbGF5LCBHQyBnYykgewotICAgICAgICAgICAgaWYgKG1TZWdtZW50cy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGdjLnNldEJhY2tncm91bmQoY29sb3JCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgICAgICAvLyBnYy5maWxsUmVjdGFuZ2xlKGdldEJvdW5kcygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQb2ludCBkaW0gPSBnZXRTaXplKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbWFnZSBmb3IgZG91YmxlLWJ1ZmZlcmluZwotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZ2V0Qm91bmRzKCkpOwotCi0gICAgICAgICAgICAvLyBTZXQgdXAgdGhlIG9mZi1zY3JlZW4gZ2MKLSAgICAgICAgICAgIEdDIGdjSW1hZ2UgPSBuZXcgR0MoaW1hZ2UpOwotICAgICAgICAgICAgaWYgKG1TZXRGb250cykKLSAgICAgICAgICAgICAgICBnY0ltYWdlLnNldEZvbnQobUZvbnRSZWdpc3RyeS5nZXQoIm1lZGl1bSIpKTsgIC8vICROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIGlmIChtTnVtUm93cyA+IDIpIHsKLSAgICAgICAgICAgICAgICAvLyBEcmF3IHRoZSByb3cgYmFja2dyb3VuZCBzdHJpcGVzCi0gICAgICAgICAgICAgICAgZ2NJbWFnZS5zZXRCYWNrZ3JvdW5kKG1Db2xvclJvd0JhY2spOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGlpID0gMTsgaWkgPCBtTnVtUm93czsgaWkgKz0gMikgewotICAgICAgICAgICAgICAgICAgICBSb3dEYXRhIHJkID0gbVJvd3NbaWldOwotICAgICAgICAgICAgICAgICAgICBpbnQgeTEgPSByZC5tUmFuayAqIHJvd1lTcGFjZSAtIG1TY3JvbGxPZmZzZXRZOwotICAgICAgICAgICAgICAgICAgICBnY0ltYWdlLmZpbGxSZWN0YW5nbGUoMCwgeTEsIGRpbS54LCByb3dZU3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRHJhdyB0aGUgcm93IGxhYmVscwotICAgICAgICAgICAgaW50IG9mZnNldFkgPSByb3dZTWFyZ2luSGFsZiAtIG1TY3JvbGxPZmZzZXRZOwotICAgICAgICAgICAgZm9yIChpbnQgaWkgPSBtU3RhcnRSb3c7IGlpIDw9IG1FbmRSb3c7ICsraWkpIHsKLSAgICAgICAgICAgICAgICBSb3dEYXRhIHJkID0gbVJvd3NbaWldOwotICAgICAgICAgICAgICAgIGludCB5MSA9IHJkLm1SYW5rICogcm93WVNwYWNlICsgb2Zmc2V0WTsKLSAgICAgICAgICAgICAgICBQb2ludCBleHRlbnQgPSBnY0ltYWdlLnN0cmluZ0V4dGVudChyZC5tTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50IHgxID0gZGltLnggLSBleHRlbnQueCAtIGxhYmVsTWFyZ2luWDsKLSAgICAgICAgICAgICAgICBnY0ltYWdlLmRyYXdTdHJpbmcocmQubU5hbWUsIHgxLCB5MSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYSBoaWdobGlnaHQgYm94IG9uIHRoZSByb3cgd2hlcmUgdGhlIG1vdXNlIGlzLgotICAgICAgICAgICAgaWYgKG1Nb3VzZVJvdyA+PSBtU3RhcnRSb3cgJiYgbU1vdXNlUm93IDw9IG1FbmRSb3cpIHsKLSAgICAgICAgICAgICAgICBnY0ltYWdlLnNldEZvcmVncm91bmQobUNvbG9yR3JheSk7Ci0gICAgICAgICAgICAgICAgaW50IHkxID0gbU1vdXNlUm93ICogcm93WVNwYWNlIC0gbVNjcm9sbE9mZnNldFk7Ci0gICAgICAgICAgICAgICAgZ2NJbWFnZS5kcmF3UmVjdGFuZ2xlKDAsIHkxLCBkaW0ueCwgcm93WVNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRHJhdyB0aGUgb2ZmLXNjcmVlbiBidWZmZXIgdG8gdGhlIHNjcmVlbgotICAgICAgICAgICAgZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQotICAgICAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgICAgIGltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGdjSW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgQmxhbmtDb3JuZXIgZXh0ZW5kcyBDYW52YXMgewotICAgICAgICBwdWJsaWMgQmxhbmtDb3JuZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgLy9zdXBlcihwYXJlbnQsIFNXVC5OT19CQUNLR1JPVU5EKTsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBwZSkgewotICAgICAgICAgICAgICAgICAgICBkcmF3KHBlLmRpc3BsYXksIHBlLmdjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KERpc3BsYXkgZGlzcGxheSwgR0MgZ2MpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJsYW5rIGltYWdlIGFuZCBkcmF3IGl0IHRvIHRoZSBjYW52YXMKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGdldEJvdW5kcygpKTsKLSAgICAgICAgICAgIGdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFuIHVwCi0gICAgICAgICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRpbWVzY2FsZSBleHRlbmRzIENhbnZhcyB7Ci0gICAgICAgIHByaXZhdGUgUG9pbnQgbU1vdXNlID0gbmV3IFBvaW50KExlZnRNYXJnaW4sIDApOwotICAgICAgICBwcml2YXRlIEN1cnNvciBtWm9vbUN1cnNvcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1ldGhvZE5hbWUgPSBudWxsOwotICAgICAgICBwcml2YXRlIENvbG9yIG1NZXRob2RDb2xvciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgaW50IG1NZXRob2RTdGFydFk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1NYXJrU3RhcnRYOwotICAgICAgICBwcml2YXRlIGludCBtTWFya0VuZFg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNwYWNlIGJldHdlZW4gdGhlIGNvbG9yZWQgYmxvY2sgYW5kIHRoZSBtZXRob2QgbmFtZSAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0JMT0NLX01BUkdJTiA9IDEwOwotCi0gICAgICAgIHB1YmxpYyBUaW1lc2NhbGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgLy9zdXBlcihwYXJlbnQsIFNXVC5OT19CQUNLR1JPVU5EKTsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgbVpvb21DdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVdFKTsKLSAgICAgICAgICAgIHNldEN1cnNvcihtWm9vbUN1cnNvcik7Ci0gICAgICAgICAgICBtTWV0aG9kU3RhcnRZID0gbVNtYWxsRm9udEhlaWdodCArIDE7Ci0gICAgICAgICAgICBhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IHBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXcocGUuZGlzcGxheSwgcGUuZ2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmJhclBvc2l0aW9uKGludCB4KSB7Ci0gICAgICAgICAgICBtTW91c2UueCA9IHg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXJrU3RhcnQoaW50IHgpIHsKLSAgICAgICAgICAgIG1NYXJrU3RhcnRYID0geDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1hcmtFbmQoaW50IHgpIHsKLSAgICAgICAgICAgIG1NYXJrRW5kWCA9IHg7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1NZXRob2ROYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kQ29sb3IoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgICAgIG1NZXRob2RDb2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgbWUpIHsKLSAgICAgICAgICAgIG1lLnkgPSAtMTsKLSAgICAgICAgICAgIG1TdXJmYWNlLm1vdXNlTW92ZShtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgbVN1cmZhY2Uuc3RhcnRTY2FsaW5nKG1lLngpOwotICAgICAgICAgICAgbVN1cmZhY2UucmVkcmF3KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgbWUpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLnN0b3BTY2FsaW5nKG1lLngpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IG1lKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS5yZXNldFNjYWxlKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZS5yZWRyYXcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KERpc3BsYXkgZGlzcGxheSwgR0MgZ2MpIHsKLSAgICAgICAgICAgIFBvaW50IGRpbSA9IGdldFNpemUoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGltYWdlIGZvciBkb3VibGUtYnVmZmVyaW5nCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBnZXRCb3VuZHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgb2ZmLXNjcmVlbiBnYwotICAgICAgICAgICAgR0MgZ2NJbWFnZSA9IG5ldyBHQyhpbWFnZSk7Ci0gICAgICAgICAgICBpZiAobVNldEZvbnRzKQotICAgICAgICAgICAgICAgIGdjSW1hZ2Uuc2V0Rm9udChtRm9udFJlZ2lzdHJ5LmdldCgibWVkaXVtIikpOyAgLy8gJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgaWYgKG1TdXJmYWNlLmRyYXdpbmdTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIGRyYXdTZWxlY3Rpb24oZGlzcGxheSwgZ2NJbWFnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRyYXdUaWNrcyhkaXNwbGF5LCBnY0ltYWdlKTsKLQotICAgICAgICAgICAgLy8gRHJhdyB0aGUgdmVydGljYWwgYmFyIHdoZXJlIHRoZSBtb3VzZSBpcwotICAgICAgICAgICAgZ2NJbWFnZS5zZXRGb3JlZ3JvdW5kKG1Db2xvckRhcmtHcmF5KTsKLSAgICAgICAgICAgIGdjSW1hZ2UuZHJhd0xpbmUobU1vdXNlLngsIHRpbWVMaW5lT2Zmc2V0WSwgbU1vdXNlLngsIGRpbS55KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRHJhdyB0aGUgY3VycmVudCBtaWxsc2Vjb25kcwotICAgICAgICAgICAgZHJhd1RpY2tMZWdlbmQoZGlzcGxheSwgZ2NJbWFnZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIERyYXcgdGhlIG1ldGhvZCBuYW1lIGFuZCBjb2xvciwgaWYgbmVlZGVkCi0gICAgICAgICAgICBkcmF3TWV0aG9kKGRpc3BsYXksIGdjSW1hZ2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBEcmF3IHRoZSBvZmYtc2NyZWVuIGJ1ZmZlciB0byB0aGUgc2NyZWVuCi0gICAgICAgICAgICBnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCi0gICAgICAgICAgICAvLyBDbGVhbiB1cAotICAgICAgICAgICAgaW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgZ2NJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3U2VsZWN0aW9uKERpc3BsYXkgZGlzcGxheSwgR0MgZ2MpIHsKLSAgICAgICAgICAgIFBvaW50IGRpbSA9IGdldFNpemUoKTsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUNvbG9yR3JheSk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZShtTWFya1N0YXJ0WCwgdGltZUxpbmVPZmZzZXRZLCBtTWFya1N0YXJ0WCwgZGltLnkpOwotICAgICAgICAgICAgZ2Muc2V0QmFja2dyb3VuZChtQ29sb3Jab29tU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIGludCB4LCB3aWR0aDsKLSAgICAgICAgICAgIGlmIChtTWFya1N0YXJ0WCA8IG1NYXJrRW5kWCkgewotICAgICAgICAgICAgICAgIHggPSBtTWFya1N0YXJ0WDsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IG1NYXJrRW5kWCAtIG1NYXJrU3RhcnRYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4ID0gbU1hcmtFbmRYOwotICAgICAgICAgICAgICAgIHdpZHRoID0gbU1hcmtTdGFydFggLSBtTWFya0VuZFg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZSh4LCB0aW1lTGluZU9mZnNldFksIHdpZHRoLCBkaW0ueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1RpY2tMZWdlbmQoRGlzcGxheSBkaXNwbGF5LCBHQyBnYykgewotICAgICAgICAgICAgaW50IG1vdXNlWCA9IG1Nb3VzZS54IC0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgIGRvdWJsZSBtb3VzZVh2YWwgPSBtU2NhbGVJbmZvLnBpeGVsVG9WYWx1ZShtb3VzZVgpOwotICAgICAgICAgICAgU3RyaW5nIGluZm8gPSBtVW5pdHMubGFiZWxsZWRTdHJpbmcobW91c2VYdmFsKTsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUNvbG9yRm9yZWdyb3VuZCk7Ci0gICAgICAgICAgICBnYy5kcmF3U3RyaW5nKGluZm8sIExlZnRNYXJnaW4gKyAyLCAxLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gRGlzcGxheSB0aGUgbWF4aW11bSBkYXRhIHZhbHVlCi0gICAgICAgICAgICBkb3VibGUgbWF4VmFsID0gbVNjYWxlSW5mby5nZXRNYXhWYWwoKTsKLSAgICAgICAgICAgIGluZm8gPSBtVW5pdHMubGFiZWxsZWRTdHJpbmcobWF4VmFsKTsKLSAgICAgICAgICAgIGluZm8gPSBTdHJpbmcuZm9ybWF0KCIgbWF4ICVzICIsIGluZm8pOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChpbmZvKTsKLSAgICAgICAgICAgIFBvaW50IGRpbSA9IGdldFNpemUoKTsKLSAgICAgICAgICAgIGludCB4MSA9IGRpbS54IC0gUmlnaHRNYXJnaW4gLSBleHRlbnQueDsKLSAgICAgICAgICAgIGdjLmRyYXdTdHJpbmcoaW5mbywgeDEsIDEsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd01ldGhvZChEaXNwbGF5IGRpc3BsYXksIEdDIGdjKSB7Ci0gICAgICAgICAgICBpZiAobU1ldGhvZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHgxID0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgIGludCB5MSA9IG1NZXRob2RTdGFydFk7Ci0gICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKG1NZXRob2RDb2xvcik7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSAyICogbVNtYWxsRm9udFdpZHRoOwotICAgICAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZSh4MSwgeTEsIHdpZHRoLCBtU21hbGxGb250SGVpZ2h0KTsKLSAgICAgICAgICAgIHgxICs9IHdpZHRoICsgTUVUSE9EX0JMT0NLX01BUkdJTjsKLSAgICAgICAgICAgIGdjLmRyYXdTdHJpbmcobU1ldGhvZE5hbWUsIHgxLCB5MSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3VGlja3MoRGlzcGxheSBkaXNwbGF5LCBHQyBnYykgewotICAgICAgICAgICAgUG9pbnQgZGltID0gZ2V0U2l6ZSgpOwotICAgICAgICAgICAgaW50IHkyID0gbWFqb3JUaWNrTGVuZ3RoICsgdGltZUxpbmVPZmZzZXRZOwotICAgICAgICAgICAgaW50IHkzID0gbWlub3JUaWNrTGVuZ3RoICsgdGltZUxpbmVPZmZzZXRZOwotICAgICAgICAgICAgaW50IHk0ID0geTIgKyB0aWNrVG9Gb250U3BhY2luZzsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUNvbG9yRm9yZWdyb3VuZCk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZShMZWZ0TWFyZ2luLCB0aW1lTGluZU9mZnNldFksIGRpbS54IC0gUmlnaHRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgIHRpbWVMaW5lT2Zmc2V0WSk7Ci0gICAgICAgICAgICBkb3VibGUgbWluVmFsID0gbVNjYWxlSW5mby5nZXRNaW5WYWwoKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhWYWwgPSBtU2NhbGVJbmZvLmdldE1heFZhbCgpOwotICAgICAgICAgICAgZG91YmxlIG1pbk1ham9yVGljayA9IG1TY2FsZUluZm8uZ2V0TWluTWFqb3JUaWNrKCk7Ci0gICAgICAgICAgICBkb3VibGUgdGlja0luY3JlbWVudCA9IG1TY2FsZUluZm8uZ2V0VGlja0luY3JlbWVudCgpOwotICAgICAgICAgICAgZG91YmxlIG1pbm9yVGlja0luY3JlbWVudCA9IHRpY2tJbmNyZW1lbnQgLyA1OwotICAgICAgICAgICAgZG91YmxlIHBpeGVsc1BlclJhbmdlID0gbVNjYWxlSW5mby5nZXRQaXhlbHNQZXJSYW5nZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBEcmF3IHRoZSBpbml0aWFsIG1pbm9yIHRpY2tzLCBpZiBhbnkKLSAgICAgICAgICAgIGlmIChtaW5WYWwgPCBtaW5NYWpvclRpY2spIHsKLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKG1Db2xvckdyYXkpOwotICAgICAgICAgICAgICAgIGRvdWJsZSB4TWlub3IgPSBtaW5NYWpvclRpY2s7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaWkgPSAxOyBpaSA8PSA0OyArK2lpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhNaW5vciAtPSBtaW5vclRpY2tJbmNyZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4TWlub3IgPCBtaW5WYWwpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaW50IHgxID0gTGVmdE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGludCkgKDAuNSArICh4TWlub3IgLSBtaW5WYWwpICogcGl4ZWxzUGVyUmFuZ2UpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3TGluZSh4MSwgdGltZUxpbmVPZmZzZXRZLCB4MSwgeTMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRpY2tJbmNyZW1lbnQgPD0gMTApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGF2b2lkIHJlbmRlcmluZyB0aGUgbG9vcCB3aGVuIHRpY2tJbmNyZW1lbnQgaXMgaW52YWxpZC4gSXQgY2FuIGJlIHplcm8KLSAgICAgICAgICAgICAgICAvLyBvciB0b28gc21hbGwuCi0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlRpbWVzY2FsZS5kcmF3VGlja3MgZXJyb3I6IHRpY2tJbmNyZW1lbnQ9JTFmIiwgdGlja0luY3JlbWVudCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoZG91YmxlIHggPSBtaW5NYWpvclRpY2s7IHggPD0gbWF4VmFsOyB4ICs9IHRpY2tJbmNyZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSBMZWZ0TWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIChpbnQpICgwLjUgKyAoeCAtIG1pblZhbCkgKiBwaXhlbHNQZXJSYW5nZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEcmF3IGEgbWFqb3IgdGljawotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUNvbG9yRm9yZWdyb3VuZCk7Ci0gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeDEsIHRpbWVMaW5lT2Zmc2V0WSwgeDEsIHkyKTsKLSAgICAgICAgICAgICAgICBpZiAoeCA+IG1heFZhbCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvLyBEcmF3IHRoZSB0aWNrIHRleHQKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGlja1N0cmluZyA9IG1Vbml0cy52YWx1ZU9mKHgpOwotICAgICAgICAgICAgICAgIGdjLmRyYXdTdHJpbmcodGlja1N0cmluZywgeDEsIHk0LCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIC8vIERyYXcgNCBtaW5vciB0aWNrcyBiZXR3ZWVuIG1ham9yIHRpY2tzCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChtQ29sb3JHcmF5KTsKLSAgICAgICAgICAgICAgICBkb3VibGUgeE1pbm9yID0geDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpaSA9IDE7IGlpIDw9IDQ7IGlpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgeE1pbm9yICs9IG1pbm9yVGlja0luY3JlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhNaW5vciA+IG1heFZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB4MSA9IExlZnRNYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChpbnQpICgwLjUgKyAoeE1pbm9yIC0gbWluVmFsKSAqIHBpeGVsc1BlclJhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoeDEsIHRpbWVMaW5lT2Zmc2V0WSwgeDEsIHkzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBlbnVtIEdyYXBoaWNzU3RhdGUgewotICAgICAgICBOb3JtYWwsIE1hcmtpbmcsIFNjYWxpbmcsIEFuaW1hdGluZwotICAgIH07Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN1cmZhY2UgZXh0ZW5kcyBDYW52YXMgewotCi0gICAgICAgIHB1YmxpYyBTdXJmYWNlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgbU5vcm1hbEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9DUk9TUyk7Ci0gICAgICAgICAgICBtSW5jcmVhc2luZ0N1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFRSk7Ci0gICAgICAgICAgICBtRGVjcmVhc2luZ0N1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFVyk7Ci0KLSAgICAgICAgICAgIGluaXRab29tRnJhY3Rpb25zV2l0aEV4cCgpOwotCi0gICAgICAgICAgICBhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IHBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXcocGUuZGlzcGxheSwgcGUuZ2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtWm9vbUFuaW1hdG9yID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVpvb20oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBtSGlnaGxpZ2h0QW5pbWF0b3IgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBhbmltYXRlSGlnaGxpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0Wm9vbUZyYWN0aW9uc1dpdGhFeHAoKSB7Ci0gICAgICAgICAgICBtWm9vbUZyYWN0aW9ucyA9IG5ldyBkb3VibGVbWk9PTV9TVEVQU107Ci0gICAgICAgICAgICBpbnQgbmV4dCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgWk9PTV9TVEVQUyAvIDI7ICsraWksICsrbmV4dCkgewotICAgICAgICAgICAgICAgIG1ab29tRnJhY3Rpb25zW25leHRdID0gKGRvdWJsZSkgKDEgPDwgaWkpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChkb3VibGUpICgxIDw8IChaT09NX1NURVBTIC8gMikpOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCIlZCAlZlxuIiwgbmV4dCwgem9vbUZyYWN0aW9uc1tuZXh0XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDI7IGlpIDwgMiArIFpPT01fU1RFUFMgLyAyOyArK2lpLCArK25leHQpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUZyYWN0aW9uc1tuZXh0XSA9IChkb3VibGUpICgoMSA8PCBpaSkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG91YmxlKSAoMSA8PCBpaSk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGYoIiVkICVmXG4iLCBuZXh0LCB6b29tRnJhY3Rpb25zW25leHRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdFpvb21GcmFjdGlvbnNXaXRoU2luV2F2ZSgpIHsKLSAgICAgICAgICAgIG1ab29tRnJhY3Rpb25zID0gbmV3IGRvdWJsZVtaT09NX1NURVBTXTsKLSAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBaT09NX1NURVBTOyArK2lpKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG9mZnNldCA9IE1hdGguUEkgKiAoZG91YmxlKSBpaSAvIChkb3VibGUpIFpPT01fU1RFUFM7Ci0gICAgICAgICAgICAgICAgbVpvb21GcmFjdGlvbnNbaWldID0gKE1hdGguc2luKCgxLjUgKiBNYXRoLlBJICsgb2Zmc2V0KSkgKyAxLjApIC8gMi4wOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCIlZCAlZlxuIiwgaWksIHpvb21GcmFjdGlvbnNbaWldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJhbmdlKGRvdWJsZSBtaW5WYWwsIGRvdWJsZSBtYXhWYWwpIHsKLSAgICAgICAgICAgIG1NaW5EYXRhVmFsID0gbWluVmFsOwotICAgICAgICAgICAgbU1heERhdGFWYWwgPSBtYXhWYWw7Ci0gICAgICAgICAgICBtU2NhbGVJbmZvLnNldE1pblZhbChtaW5WYWwpOwotICAgICAgICAgICAgbVNjYWxlSW5mby5zZXRNYXhWYWwobWF4VmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbWl0UmFuZ2UoZG91YmxlIG1pblZhbCwgZG91YmxlIG1heFZhbCkgewotICAgICAgICAgICAgbUxpbWl0TWluVmFsID0gbWluVmFsOwotICAgICAgICAgICAgbUxpbWl0TWF4VmFsID0gbWF4VmFsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNldFNjYWxlKCkgewotICAgICAgICAgICAgbVNjYWxlSW5mby5zZXRNaW5WYWwobUxpbWl0TWluVmFsKTsKLSAgICAgICAgICAgIG1TY2FsZUluZm8uc2V0TWF4VmFsKG1MaW1pdE1heFZhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhdyhEaXNwbGF5IGRpc3BsYXksIEdDIGdjKSB7Ci0gICAgICAgICAgICBpZiAobVNlZ21lbnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2Muc2V0QmFja2dyb3VuZChjb2xvckJhY2tncm91bmQpOwotICAgICAgICAgICAgICAgIC8vIGdjLmZpbGxSZWN0YW5nbGUoZ2V0Qm91bmRzKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGltYWdlIGZvciBkb3VibGUtYnVmZmVyaW5nCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBnZXRCb3VuZHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgb2ZmLXNjcmVlbiBnYwotICAgICAgICAgICAgR0MgZ2NJbWFnZSA9IG5ldyBHQyhpbWFnZSk7Ci0gICAgICAgICAgICBpZiAobVNldEZvbnRzKQotICAgICAgICAgICAgICAgIGdjSW1hZ2Uuc2V0Rm9udChtRm9udFJlZ2lzdHJ5LmdldCgic21hbGwiKSk7ICAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAvLyBnY0ltYWdlLnNldEJhY2tncm91bmQoY29sb3JCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIC8vIGdjSW1hZ2UuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLlNjYWxpbmcpIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IG1Nb3VzZS54IC0gbU1vdXNlTWFya1N0YXJ0WDsKLSAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIG5ld01pblZhbCA9IG1TY2FsZU1pblZhbCAtIGRpZmYgLyBtU2NhbGVQaXhlbHNQZXJSYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pblZhbCA8IG1MaW1pdE1pblZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01pblZhbCA9IG1MaW1pdE1pblZhbDsKLSAgICAgICAgICAgICAgICAgICAgbVNjYWxlSW5mby5zZXRNaW5WYWwobmV3TWluVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGYoImRpZmYgJWYgc2NhbGVNaW4gJWYgbmV3TWluICVmXG4iLAotICAgICAgICAgICAgICAgICAgICAvLyBkaWZmLCBzY2FsZU1pblZhbCwgbmV3TWluVmFsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdNYXhWYWwgPSBtU2NhbGVNYXhWYWwgLSBkaWZmIC8gbVNjYWxlUGl4ZWxzUGVyUmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNYXhWYWwgPiBtTGltaXRNYXhWYWwpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXhWYWwgPSBtTGltaXRNYXhWYWw7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FsZUluZm8uc2V0TWF4VmFsKG5ld01heFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCJkaWZmICVmIHNjYWxlTWF4ICVmIG5ld01heCAlZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlmZiwgc2NhbGVNYXhWYWwsIG5ld01heFZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGhlIHRpY2tzIGFuZCBzdHJpcHMgb25seSBpZiB0aGUgc2l6ZSBoYXMgY2hhbmdlZCwKLSAgICAgICAgICAgIC8vIG9yIHdlIHNjcm9sbGVkIHNvIHRoYXQgYSBuZXcgcm93IGlzIHZpc2libGUuCi0gICAgICAgICAgICBQb2ludCBkaW0gPSBnZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAobVN0YXJ0Um93ICE9IG1DYWNoZWRTdGFydFJvdyB8fCBtRW5kUm93ICE9IG1DYWNoZWRFbmRSb3cgCi0gICAgICAgICAgICAgICAgICAgIHx8IG1TY2FsZUluZm8uZ2V0TWluVmFsKCkgIT0gbUNhY2hlZE1pblZhbAotICAgICAgICAgICAgICAgICAgICB8fCBtU2NhbGVJbmZvLmdldE1heFZhbCgpICE9IG1DYWNoZWRNYXhWYWwpIHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVkU3RhcnRSb3cgPSBtU3RhcnRSb3c7Ci0gICAgICAgICAgICAgICAgbUNhY2hlZEVuZFJvdyA9IG1FbmRSb3c7Ci0gICAgICAgICAgICAgICAgaW50IHhkaW0gPSBkaW0ueCAtIFRvdGFsWE1hcmdpbjsKLSAgICAgICAgICAgICAgICBtU2NhbGVJbmZvLnNldE51bVBpeGVscyh4ZGltKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlRW5kUG9pbnRzID0gKG1HcmFwaGljc1N0YXRlID09IEdyYXBoaWNzU3RhdGUuU2NhbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUdyYXBoaWNzU3RhdGUgPT0gR3JhcGhpY3NTdGF0ZS5BbmltYXRpbmcpOwotICAgICAgICAgICAgICAgIG1TY2FsZUluZm8uY29tcHV0ZVRpY2tzKGZvcmNlRW5kUG9pbnRzKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVkTWluVmFsID0gbVNjYWxlSW5mby5nZXRNaW5WYWwoKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVkTWF4VmFsID0gbVNjYWxlSW5mby5nZXRNYXhWYWwoKTsKLSAgICAgICAgICAgICAgICBpZiAobUxpbWl0TWluVmFsID4gbVNjYWxlSW5mby5nZXRNaW5WYWwoKSkKLSAgICAgICAgICAgICAgICAgICAgbUxpbWl0TWluVmFsID0gbVNjYWxlSW5mby5nZXRNaW5WYWwoKTsKLSAgICAgICAgICAgICAgICBpZiAobUxpbWl0TWF4VmFsIDwgbVNjYWxlSW5mby5nZXRNYXhWYWwoKSkKLSAgICAgICAgICAgICAgICAgICAgbUxpbWl0TWF4VmFsID0gbVNjYWxlSW5mby5nZXRNYXhWYWwoKTsKLQotICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHN0cmlwcwotICAgICAgICAgICAgICAgIGNvbXB1dGVTdHJpcHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1OdW1Sb3dzID4gMikgewotICAgICAgICAgICAgICAgIC8vIERyYXcgdGhlIHJvdyBiYWNrZ3JvdW5kIHN0cmlwZXMKLSAgICAgICAgICAgICAgICBnY0ltYWdlLnNldEJhY2tncm91bmQobUNvbG9yUm93QmFjayk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaWkgPSAxOyBpaSA8IG1OdW1Sb3dzOyBpaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJvd0RhdGEgcmQgPSBtUm93c1tpaV07Ci0gICAgICAgICAgICAgICAgICAgIGludCB5MSA9IHJkLm1SYW5rICogcm93WVNwYWNlIC0gbVNjcm9sbE9mZnNldFk7Ci0gICAgICAgICAgICAgICAgICAgIGdjSW1hZ2UuZmlsbFJlY3RhbmdsZSgwLCB5MSwgZGltLngsIHJvd1lTcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZHJhd2luZ1NlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgZHJhd1NlbGVjdGlvbihkaXNwbGF5LCBnY0ltYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGJsb2NrTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBDb2xvciBibG9ja0NvbG9yID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1EZWJ1ZykgewotICAgICAgICAgICAgICAgIGRvdWJsZSBwaXhlbHNQZXJSYW5nZSA9IG1TY2FsZUluZm8uZ2V0UGl4ZWxzUGVyUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGltLnggJWQgcGl4ZWxzICVkIG1pblZhbCAlZiwgbWF4VmFsICVmIHBwciAlZiBycHAgJWZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbS54LCBkaW0ueCAtIFRvdGFsWE1hcmdpbiwgbVNjYWxlSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNaW5WYWwoKSwgbVNjYWxlSW5mby5nZXRNYXhWYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzUGVyUmFuZ2UsIDEuMCAvIHBpeGVsc1BlclJhbmdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRHJhdyB0aGUgc3RyaXBzCi0gICAgICAgICAgICBCbG9jayBzZWxlY3RCbG9jayA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKFN0cmlwIHN0cmlwIDogbVN0cmlwTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChzdHJpcC5tQ29sb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50Zigic3RyaXAuY29sb3IgaXMgbnVsbFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnY0ltYWdlLnNldEJhY2tncm91bmQoc3RyaXAubUNvbG9yKTsKLSAgICAgICAgICAgICAgICBnY0ltYWdlLmZpbGxSZWN0YW5nbGUoc3RyaXAubVgsIHN0cmlwLm1ZIC0gbVNjcm9sbE9mZnNldFksIHN0cmlwLm1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLm1IZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtTW91c2VSb3cgPT0gc3RyaXAubVJvd0RhdGEubVJhbmspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3VzZS54ID49IHN0cmlwLm1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1vdXNlLnggPCBzdHJpcC5tWCArIHN0cmlwLm1XaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tOYW1lID0gc3RyaXAubVNlZ21lbnQubUJsb2NrLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQ29sb3IgPSBzdHJpcC5tQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3VzZVNlbGVjdC54ID49IHN0cmlwLm1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1vdXNlU2VsZWN0LnggPCBzdHJpcC5tWCArIHN0cmlwLm1XaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0QmxvY2sgPSBzdHJpcC5tU2VnbWVudC5tQmxvY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW91c2VTZWxlY3QueCA9IDA7Ci0gICAgICAgICAgICBtTW91c2VTZWxlY3QueSA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3RCbG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFNlbGVjdGlvbj4gc2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VsZWN0aW9uPigpOwotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcm93IGxhYmVsCi0gICAgICAgICAgICAgICAgUm93RGF0YSByZCA9IG1Sb3dzW21Nb3VzZVJvd107Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5hZGQoU2VsZWN0aW9uLmhpZ2hsaWdodCgiVGhyZWFkIiwgcmQubU5hbWUpKTsgIC8vICROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5hZGQoU2VsZWN0aW9uLmhpZ2hsaWdodCgiQ2FsbCIsIHNlbGVjdEJsb2NrKSk7ICAvLyAkTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgaW50IG1vdXNlWCA9IG1Nb3VzZS54IC0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgICAgICBkb3VibGUgbW91c2VYdmFsID0gbVNjYWxlSW5mby5waXhlbFRvVmFsdWUobW91c2VYKTsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZChTZWxlY3Rpb24uaGlnaGxpZ2h0KCJUaW1lIiwgbW91c2VYdmFsKSk7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Db250cm9sbGVyLmNoYW5nZShzZWxlY3Rpb25zLCAiVGltZUxpbmVWaWV3Iik7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1IaWdobGlnaHRNZXRob2REYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0Q2FsbCA9IChDYWxsKSBzZWxlY3RCbG9jazsKLSAgICAgICAgICAgICAgICBzdGFydEhpZ2hsaWdodGluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEcmF3IGEgaGlnaGxpZ2h0IGJveCBvbiB0aGUgcm93IHdoZXJlIHRoZSBtb3VzZSBpcy4KLSAgICAgICAgICAgIC8vIEV4Y2VwdCBkb24ndCBkcmF3IHRoZSBib3ggaWYgd2UgYXJlIGFuaW1hdGluZyB0aGUKLSAgICAgICAgICAgIC8vIGhpZ2hsaWdoaW5nIG9mIGEgY2FsbCBvciBtZXRob2QgYmVjYXVzZSB0aGUgaW5jbHVzaXZlCi0gICAgICAgICAgICAvLyBoaWdobGlnaHQgYmFyIHBhc3NlcyB0aHJvdWdoIHRoZSBoaWdobGlnaHQgYm94IGFuZAotICAgICAgICAgICAgLy8gY2F1c2VzIGFuIGFubm95aW5nIGZsYXNoaW5nIGFydGlmYWN0LgotICAgICAgICAgICAgaWYgKG1Nb3VzZVJvdyA+PSAwICYmIG1Nb3VzZVJvdyA8IG1OdW1Sb3dzICYmIG1IaWdobGlnaHRTdGVwID09IDApIHsKLSAgICAgICAgICAgICAgICBnY0ltYWdlLnNldEZvcmVncm91bmQobUNvbG9yR3JheSk7Ci0gICAgICAgICAgICAgICAgaW50IHkxID0gbU1vdXNlUm93ICogcm93WVNwYWNlIC0gbVNjcm9sbE9mZnNldFk7Ci0gICAgICAgICAgICAgICAgZ2NJbWFnZS5kcmF3TGluZSgwLCB5MSwgZGltLngsIHkxKTsKLSAgICAgICAgICAgICAgICBnY0ltYWdlLmRyYXdMaW5lKDAsIHkxICsgcm93WVNwYWNlLCBkaW0ueCwgeTEgKyByb3dZU3BhY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBIaWdobGlnaHQgYSBzZWxlY3RlZCBtZXRob2QsIGlmIGFueQotICAgICAgICAgICAgZHJhd0hpZ2hsaWdodHMoZ2NJbWFnZSwgZGltKTsKLQotICAgICAgICAgICAgLy8gRHJhdyBhIHZlcnRpY2FsIGxpbmUgd2hlcmUgdGhlIG1vdXNlIGlzLgotICAgICAgICAgICAgZ2NJbWFnZS5zZXRGb3JlZ3JvdW5kKG1Db2xvckRhcmtHcmF5KTsKLSAgICAgICAgICAgIGludCBsaW5lRW5kID0gTWF0aC5taW4oZGltLnksIG1OdW1Sb3dzICogcm93WVNwYWNlKTsKLSAgICAgICAgICAgIGdjSW1hZ2UuZHJhd0xpbmUobU1vdXNlLngsIDAsIG1Nb3VzZS54LCBsaW5lRW5kKTsKLQotICAgICAgICAgICAgaWYgKGJsb2NrTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzY2FsZS5zZXRNZXRob2ROYW1lKGJsb2NrTmFtZSk7Ci0gICAgICAgICAgICAgICAgbVRpbWVzY2FsZS5zZXRNZXRob2RDb2xvcihibG9ja0NvbG9yKTsKLSAgICAgICAgICAgICAgICBtU2hvd0hpZ2hsaWdodE5hbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNob3dIaWdobGlnaHROYW1lKSB7Ci0gICAgICAgICAgICAgICAgLy8gRHJhdyB0aGUgaGlnaGxpZ2h0ZWQgbWV0aG9kIG5hbWUKLSAgICAgICAgICAgICAgICBNZXRob2REYXRhIG1kID0gbUhpZ2hsaWdodE1ldGhvZERhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKG1kID09IG51bGwgJiYgbUhpZ2hsaWdodENhbGwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbWQgPSBtSGlnaGxpZ2h0Q2FsbC5nZXRNZXRob2REYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1kID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJudWxsIGhpZ2hsaWdodD9cbiIpOyAgLy8gJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAobWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtVGltZXNjYWxlLnNldE1ldGhvZE5hbWUobWQuZ2V0UHJvZmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc2NhbGUuc2V0TWV0aG9kQ29sb3IobWQuZ2V0Q29sb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGltZXNjYWxlLnNldE1ldGhvZE5hbWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVRpbWVzY2FsZS5zZXRNZXRob2RDb2xvcihudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaW1lc2NhbGUucmVkcmF3KCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGhlIG9mZi1zY3JlZW4gYnVmZmVyIHRvIHRoZSBzY3JlZW4KLSAgICAgICAgICAgIGdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFuIHVwCi0gICAgICAgICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBnY0ltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3SGlnaGxpZ2h0cyhHQyBnYywgUG9pbnQgZGltKSB7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gaGlnaGxpZ2h0SGVpZ2h0OwotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGZvciAoUmFuZ2UgcmFuZ2UgOiBtSGlnaGxpZ2h0RXhjbHVzaXZlKSB7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0QmFja2dyb3VuZChyYW5nZS5tQ29sb3IpOwotICAgICAgICAgICAgICAgIGludCB4U3RhcnQgPSByYW5nZS5tWGRpbS54OwotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHJhbmdlLm1YZGltLnk7Ci0gICAgICAgICAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZSh4U3RhcnQsIHJhbmdlLm1ZIC0gaGVpZ2h0IC0gbVNjcm9sbE9mZnNldFksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEcmF3IHRoZSBpbmNsdXNpdmUgbGluZXMgYSBiaXQgc2hvcnRlcgotICAgICAgICAgICAgaGVpZ2h0IC09IDE7Ci0gICAgICAgICAgICBpZiAoaGVpZ2h0IDw9IDApCi0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTsKLQotICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IHRoZSBpbmNsdXNpdmUgcmFuZ2VzCi0gICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKG1Db2xvckRhcmtHcmF5KTsKLSAgICAgICAgICAgIGdjLnNldEJhY2tncm91bmQobUNvbG9yRGFya0dyYXkpOwotICAgICAgICAgICAgZm9yIChSYW5nZSByYW5nZSA6IG1IaWdobGlnaHRJbmNsdXNpdmUpIHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSByYW5nZS5tWGRpbS54OwotICAgICAgICAgICAgICAgIGludCB4MiA9IHJhbmdlLm1YZGltLnk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkcmF3TGVmdEVuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZHJhd1JpZ2h0RW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHgxID49IExlZnRNYXJnaW4pCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHgxID0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgICAgICBpZiAoeDIgPj0gTGVmdE1hcmdpbikKLSAgICAgICAgICAgICAgICAgICAgZHJhd1JpZ2h0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHgyID0gZGltLnggLSBSaWdodE1hcmdpbjsKLSAgICAgICAgICAgICAgICBpbnQgeTEgPSByYW5nZS5tWSArIHJvd0hlaWdodCArIDIgLSBtU2Nyb2xsT2Zmc2V0WTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSByYW5nZSBpcyB2ZXJ5IG5hcnJvdywgdGhlbiBqdXN0IGRyYXcgYSBzbWFsbAotICAgICAgICAgICAgICAgIC8vIHJlY3RhbmdsZS4KLSAgICAgICAgICAgICAgICBpZiAoeDIgLSB4MSA8IE1pbkluY2x1c2l2ZVJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHgyIC0geDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmZpbGxSZWN0YW5nbGUoeDEsIHkxLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkcmF3TGVmdEVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd1JpZ2h0RW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IGJvdGggZW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gcG9pbnRzID0geyB4MSwgeTEsIHgxLCB5MSArIGhlaWdodCwgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxICsgaGVpZ2h0LCB4MiwgeTEgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdjLmRyYXdQb2x5bGluZShwb2ludHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHJhdyB0aGUgbGVmdCBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHBvaW50cyA9IHsgeDEsIHkxLCB4MSwgeTEgKyBoZWlnaHQsIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSArIGhlaWdodCB9OwotICAgICAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1BvbHlsaW5lKHBvaW50cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd1JpZ2h0RW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IHRoZSByaWdodCBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHBvaW50cyA9IHsgeDEsIHkxICsgaGVpZ2h0LCB4MiwgeTEgKyBoZWlnaHQsIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSB9OwotICAgICAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1BvbHlsaW5lKHBvaW50cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IG5laXRoZXIgZW5kLCBqdXN0IHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBwb2ludHMgPSB7IHgxLCB5MSArIGhlaWdodCwgeDIsIHkxICsgaGVpZ2h0IH07Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy5kcmF3UG9seWxpbmUocG9pbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERyYXcgdGhlIGFycm93aGVhZHMsIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgIGlmIChkcmF3TGVmdEVuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBpbnRbXSBwb2ludHMgPSB7IHgxICsgNywgeTEgKyBoZWlnaHQgLSA0LCB4MSwgeTEgKyBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgKyA3LCB5MSArIGhlaWdodCArIDQgfTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZmlsbFBvbHlnb24ocG9pbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRyYXdSaWdodEVuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBpbnRbXSBwb2ludHMgPSB7IHgyIC0gNywgeTEgKyBoZWlnaHQgLSA0LCB4MiwgeTEgKyBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDIgLSA3LCB5MSArIGhlaWdodCArIDQgfTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZmlsbFBvbHlnb24ocG9pbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZHJhd2luZ1NlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLk1hcmtpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgbUdyYXBoaWNzU3RhdGUgPT0gR3JhcGhpY3NTdGF0ZS5BbmltYXRpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3U2VsZWN0aW9uKERpc3BsYXkgZGlzcGxheSwgR0MgZ2MpIHsKLSAgICAgICAgICAgIFBvaW50IGRpbSA9IGdldFNpemUoKTsKLSAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQobUNvbG9yR3JheSk7Ci0gICAgICAgICAgICBnYy5kcmF3TGluZShtTW91c2VNYXJrU3RhcnRYLCAwLCBtTW91c2VNYXJrU3RhcnRYLCBkaW0ueSk7Ci0gICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKG1Db2xvclpvb21TZWxlY3Rpb24pOwotICAgICAgICAgICAgaW50IHdpZHRoOwotICAgICAgICAgICAgaW50IG1vdXNlWCA9IChtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLkFuaW1hdGluZykgPyBtTW91c2VNYXJrRW5kWCA6IG1Nb3VzZS54OwotICAgICAgICAgICAgaW50IHg7Ci0gICAgICAgICAgICBpZiAobU1vdXNlTWFya1N0YXJ0WCA8IG1vdXNlWCkgewotICAgICAgICAgICAgICAgIHggPSBtTW91c2VNYXJrU3RhcnRYOwotICAgICAgICAgICAgICAgIHdpZHRoID0gbW91c2VYIC0gbU1vdXNlTWFya1N0YXJ0WDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeCA9IG1vdXNlWDsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IG1Nb3VzZU1hcmtTdGFydFggLSBtb3VzZVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnYy5maWxsUmVjdGFuZ2xlKHgsIDAsIHdpZHRoLCBkaW0ueSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZVN0cmlwcygpIHsKLSAgICAgICAgICAgIGRvdWJsZSBtaW5WYWwgPSBtU2NhbGVJbmZvLmdldE1pblZhbCgpOwotICAgICAgICAgICAgZG91YmxlIG1heFZhbCA9IG1TY2FsZUluZm8uZ2V0TWF4VmFsKCk7Ci0KLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcGl4ZWwgZGF0YQotICAgICAgICAgICAgUGl4ZWxbXSBwaXhlbHMgPSBuZXcgUGl4ZWxbbU51bVJvd3NdOwotICAgICAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1OdW1Sb3dzOyArK2lpKQotICAgICAgICAgICAgICAgIHBpeGVsc1tpaV0gPSBuZXcgUGl4ZWwoKTsKLQotICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHBlci1ibG9jayBwaXhlbCBkYXRhCi0gICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbVNlZ21lbnRzLmxlbmd0aDsgKytpaSkgewotICAgICAgICAgICAgICAgIG1TZWdtZW50c1tpaV0ubUJsb2NrLmNsZWFyV2VpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdHJpcExpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1IaWdobGlnaHRFeGNsdXNpdmUuY2xlYXIoKTsKLSAgICAgICAgICAgIG1IaWdobGlnaHRJbmNsdXNpdmUuY2xlYXIoKTsKLSAgICAgICAgICAgIE1ldGhvZERhdGEgY2FsbE1ldGhvZCA9IG51bGw7Ci0gICAgICAgICAgICBsb25nIGNhbGxTdGFydCA9IDA7Ci0gICAgICAgICAgICBsb25nIGNhbGxFbmQgPSAtMTsKLSAgICAgICAgICAgIFJvd0RhdGEgY2FsbFJvd0RhdGEgPSBudWxsOwotICAgICAgICAgICAgaW50IHByZXZNZXRob2RTdGFydCA9IC0xOwotICAgICAgICAgICAgaW50IHByZXZDYWxsU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIGlmIChtSGlnaGxpZ2h0Q2FsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNhbGxQaXhlbFN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgaW50IGNhbGxQaXhlbEVuZCA9IC0xOwotICAgICAgICAgICAgICAgIGNhbGxTdGFydCA9IG1IaWdobGlnaHRDYWxsLm1HbG9iYWxTdGFydFRpbWU7Ci0gICAgICAgICAgICAgICAgY2FsbEVuZCA9IG1IaWdobGlnaHRDYWxsLm1HbG9iYWxFbmRUaW1lOwotICAgICAgICAgICAgICAgIGNhbGxNZXRob2QgPSBtSGlnaGxpZ2h0Q2FsbC5tTWV0aG9kRGF0YTsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbFN0YXJ0ID49IG1pblZhbCkKLSAgICAgICAgICAgICAgICAgICAgY2FsbFBpeGVsU3RhcnQgPSBtU2NhbGVJbmZvLnZhbHVlVG9QaXhlbChjYWxsU3RhcnQpOwotICAgICAgICAgICAgICAgIGlmIChjYWxsRW5kIDw9IG1heFZhbCkKLSAgICAgICAgICAgICAgICAgICAgY2FsbFBpeGVsRW5kID0gbVNjYWxlSW5mby52YWx1ZVRvUGl4ZWwoY2FsbEVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGYoImNhbGxTdGFydCxFbmQgJWQsJWQgbWluVmFsLG1heFZhbCAlZiwlZgotICAgICAgICAgICAgICAgIC8vIGNhbGxQaXhlbFN0YXJ0LEVuZCAlZCwlZFxuIiwKLSAgICAgICAgICAgICAgICAvLyBjYWxsU3RhcnQsIGNhbGxFbmQsIG1pblZhbCwgbWF4VmFsLCBjYWxsUGl4ZWxTdGFydCwKLSAgICAgICAgICAgICAgICAvLyBjYWxsUGl4ZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCB0aHJlYWRJZCA9IG1IaWdobGlnaHRDYWxsLmdldFRocmVhZElkKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZE5hbWUgPSBtVGhyZWFkTGFiZWxzLmdldCh0aHJlYWRJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbFJvd0RhdGEgPSBtUm93QnlOYW1lLmdldCh0aHJlYWROYW1lKTsKLSAgICAgICAgICAgICAgICBpbnQgeTEgPSBjYWxsUm93RGF0YS5tUmFuayAqIHJvd1lTcGFjZSArIHJvd1lNYXJnaW5IYWxmOwotICAgICAgICAgICAgICAgIENvbG9yIGNvbG9yID0gY2FsbE1ldGhvZC5nZXRDb2xvcigpOwotICAgICAgICAgICAgICAgIG1IaWdobGlnaHRJbmNsdXNpdmUuYWRkKG5ldyBSYW5nZShjYWxsUGl4ZWxTdGFydCArIExlZnRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUGl4ZWxFbmQgKyBMZWZ0TWFyZ2luLCB5MSwgY29sb3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoU2VnbWVudCBzZWdtZW50IDogbVNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQubUVuZFRpbWUgPD0gbWluVmFsKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5tU3RhcnRUaW1lID49IG1heFZhbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBzZWdtZW50Lm1CbG9jazsKLSAgICAgICAgICAgICAgICBDb2xvciBjb2xvciA9IGJsb2NrLmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZG91YmxlIHJlY29yZFN0YXJ0ID0gTWF0aC5tYXgoc2VnbWVudC5tU3RhcnRUaW1lLCBtaW5WYWwpOwotICAgICAgICAgICAgICAgIGRvdWJsZSByZWNvcmRFbmQgPSBNYXRoLm1pbihzZWdtZW50Lm1FbmRUaW1lLCBtYXhWYWwpOwotICAgICAgICAgICAgICAgIGlmIChyZWNvcmRTdGFydCA9PSByZWNvcmRFbmQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGludCBwaXhlbFN0YXJ0ID0gbVNjYWxlSW5mby52YWx1ZVRvUGl4ZWwocmVjb3JkU3RhcnQpOwotICAgICAgICAgICAgICAgIGludCBwaXhlbEVuZCA9IG1TY2FsZUluZm8udmFsdWVUb1BpeGVsKHJlY29yZEVuZCk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoID0gcGl4ZWxFbmQgLSBwaXhlbFN0YXJ0OwotCi0gICAgICAgICAgICAgICAgUm93RGF0YSByZCA9IHNlZ21lbnQubVJvd0RhdGE7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGF0YSBtZCA9IGJsb2NrLmdldE1ldGhvZERhdGEoKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYWRkIHRoZSBzY3JvbGwgb2Zmc2V0IGxhdGVyIHdoZW4gd2UgZHJhdyB0aGUgc3RyaXBzCi0gICAgICAgICAgICAgICAgaW50IHkxID0gcmQubVJhbmsgKiByb3dZU3BhY2UgKyByb3dZTWFyZ2luSGFsZjsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IGRpc3BsYXkgYW55IG1vcmUgcm93cywgdGhlbiBxdWl0Ci0gICAgICAgICAgICAgICAgaWYgKHJkLm1SYW5rID4gbUVuZFJvdykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50Zigic2VnbWVudCAlcyB2YWw6IFslLjFmLCAlLjFmXSBmcmFjIFslZiwgJWZdCi0gICAgICAgICAgICAgICAgLy8gcGl4ZWw6IFslZCwgJWRdIHBpeC5zdGFydCAlZCB3ZWlnaHQgJS4yZiAlc1xuIiwKLSAgICAgICAgICAgICAgICAvLyBibG9jay5nZXROYW1lKCksIHJlY29yZFN0YXJ0LCByZWNvcmRFbmQsCi0gICAgICAgICAgICAgICAgLy8gc2NhbGVJbmZvLnZhbHVlVG9QaXhlbEZyYWN0aW9uKHJlY29yZFN0YXJ0KSwKLSAgICAgICAgICAgICAgICAvLyBzY2FsZUluZm8udmFsdWVUb1BpeGVsRnJhY3Rpb24ocmVjb3JkRW5kKSwKLSAgICAgICAgICAgICAgICAvLyBwaXhlbFN0YXJ0LCBwaXhlbEVuZCwgcGl4ZWxzW3JkLnJhbmtdLnN0YXJ0LAotICAgICAgICAgICAgICAgIC8vIHBpeGVsc1tyZC5yYW5rXS5tYXhXZWlnaHQsCi0gICAgICAgICAgICAgICAgLy8gcGl4ZWxzW3JkLnJhbmtdLnNlZ21lbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgIC8vID8gcGl4ZWxzW3JkLnJhbmtdLnNlZ21lbnQuYmxvY2suZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgLy8gOiAibnVsbCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1IaWdobGlnaHRNZXRob2REYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IaWdobGlnaHRNZXRob2REYXRhID09IG1kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk1ldGhvZFN0YXJ0ICE9IHBpeGVsU3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2TWV0aG9kU3RhcnQgPSBwaXhlbFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZVdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlV2lkdGggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VXaWR0aCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodEV4Y2x1c2l2ZS5hZGQobmV3IFJhbmdlKHBpeGVsU3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTGVmdE1hcmdpbiwgcmFuZ2VXaWR0aCwgeTEsIGNvbG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCBjYWxsID0gKENhbGwpIGJsb2NrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFydCA9IGNhbGwubUdsb2JhbFN0YXJ0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsbFBpeGVsU3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbFN0YXJ0ID49IG1pblZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFBpeGVsU3RhcnQgPSBtU2NhbGVJbmZvLnZhbHVlVG9QaXhlbChjYWxsU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q2FsbFN0YXJ0ICE9IGNhbGxQaXhlbFN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYWxsU3RhcnQgPSBjYWxsUGl4ZWxTdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGxQaXhlbEVuZCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRW5kID0gY2FsbC5tR2xvYmFsRW5kVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxFbmQgPD0gbWF4VmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFBpeGVsRW5kID0gbVNjYWxlSW5mby52YWx1ZVRvUGl4ZWwoY2FsbEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRJbmNsdXNpdmUuYWRkKG5ldyBSYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsUGl4ZWxTdGFydCArIExlZnRNYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFBpeGVsRW5kICsgTGVmdE1hcmdpbiwgeTEsIGNvbG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GYWRlQ29sb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1kLmdldEZhZGVkQ29sb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUhpZ2hsaWdodENhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5tU3RhcnRUaW1lID49IGNhbGxTdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlZ21lbnQubUVuZFRpbWUgPD0gY2FsbEVuZCAmJiBjYWxsTWV0aG9kID09IG1kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FsbFJvd0RhdGEgPT0gcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2TWV0aG9kU3RhcnQgIT0gcGl4ZWxTdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZNZXRob2RTdGFydCA9IHBpeGVsU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VXaWR0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVdpZHRoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0RXhjbHVzaXZlLmFkZChuZXcgUmFuZ2UocGl4ZWxTdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMZWZ0TWFyZ2luLCByYW5nZVdpZHRoLCB5MSwgY29sb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmFkZUNvbG9ycykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBtZC5nZXRGYWRlZENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDYXNlczoKLSAgICAgICAgICAgICAgICAvLyAxLiBUaGlzIHNlZ21lbnQgc3RhcnRzIG9uIGEgZGlmZmVyZW50IHBpeGVsIHRoYW4gdGhlCi0gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgc2VnbWVudCBzdGFydGVkIG9uLiBJbiB0aGlzIGNhc2UsIGVtaXQKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGl4ZWwgc3RyaXAsIGlmIGFueSwgYW5kOgotICAgICAgICAgICAgICAgIC8vIEEuIElmIHRoZSB3aWR0aCBpcyAwLCB0aGVuIGFkZCB0aGlzIHNlZ21lbnQncwotICAgICAgICAgICAgICAgIC8vIHdlaWdodCB0byB0aGUgUGl4ZWwuCi0gICAgICAgICAgICAgICAgLy8gQi4gSWYgdGhlIHdpZHRoID4gMCwgdGhlbiBlbWl0IGEgc3RyaXAgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBzZWdtZW50IChubyBwYXJ0aWFsIFBpeGVsIGRhdGEpLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gMi4gT3RoZXJ3aXNlICh0aGUgbmV3IHNlZ21lbnQgc3RhcnRzIG9uIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgLy8gcGl4ZWwgYXMgdGhlIHByZXZpb3VzIHNlZ21lbnQpOiBhZGQgaXRzICJ3ZWlnaHQiCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgcGl4ZWwsIGFuZDoKLSAgICAgICAgICAgICAgICAvLyBBLiBJZiB0aGUgbmV3IHNlZ21lbnQgaGFzIHdpZHRoIDEsCi0gICAgICAgICAgICAgICAgLy8gdGhlbiBlbWl0IHRoZSBwaXhlbCBzdHJpcCBhbmQgdGhlbgotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgc2VnbWVudCdzIHdlaWdodCB0byB0aGUgcGl4ZWwuCi0gICAgICAgICAgICAgICAgLy8gQi4gSWYgdGhlIG5ldyBzZWdtZW50IGhhcyB3aWR0aCA+IDEsCi0gICAgICAgICAgICAgICAgLy8gdGhlbiBlbWl0IHRoZSBwaXhlbCBzdHJpcCwgYW5kIGVtaXQgdGhlIHJlc3QKLSAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3RyaXAgZm9yIHRoaXMgc2VnbWVudCAobm8gcGFydGlhbCBQaXhlbAotICAgICAgICAgICAgICAgIC8vIGRhdGEpLgotCi0gICAgICAgICAgICAgICAgUGl4ZWwgcGl4ID0gcGl4ZWxzW3JkLm1SYW5rXTsKLSAgICAgICAgICAgICAgICBpZiAocGl4Lm1TdGFydCAhPSBwaXhlbFN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaXgubVNlZ21lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgcGl4ZWwgc3RyaXAuIFRoaXMgYWxzbyBjbGVhcnMgdGhlIHBpeGVsLgotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFBpeGVsU3RyaXAocmQsIHkxLCBwaXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlICJ3ZWlnaHQiIG9mIHRoaXMgc2VnbWVudCBmb3IgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbC4gRm9yIGEgcGl4ZWwgTiwgdGhlICJ3ZWlnaHQiIG9mIGEgc2VnbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggb2YgdGhlIHJlZ2lvbiBbTiAtIDAuNSwgTiArIDAuNV0gaXMgY292ZXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHNlZ21lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2VpZ2h0ID0gY29tcHV0ZVdlaWdodChyZWNvcmRTdGFydCwgcmVjb3JkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IGJsb2NrLmFkZFdlaWdodChwaXhlbFN0YXJ0LCByZC5tUmFuaywgd2VpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWlnaHQgPiBwaXgubU1heFdlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeC5zZXRGaWVsZHMocGl4ZWxTdGFydCwgd2VpZ2h0LCBzZWdtZW50LCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MSA9IHBpeGVsU3RhcnQgKyBMZWZ0TWFyZ2luOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaXAgc3RyaXAgPSBuZXcgU3RyaXAoeDEsIHkxLCB3aWR0aCwgcm93SGVpZ2h0LCByZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCwgY29sb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlwTGlzdC5hZGQoc3RyaXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdlaWdodCA9IGNvbXB1dGVXZWlnaHQocmVjb3JkU3RhcnQsIHJlY29yZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gYmxvY2suYWRkV2VpZ2h0KHBpeGVsU3RhcnQsIHJkLm1SYW5rLCB3ZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0ID4gcGl4Lm1NYXhXZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeC5zZXRGaWVsZHMocGl4ZWxTdGFydCwgd2VpZ2h0LCBzZWdtZW50LCBjb2xvciwgcmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBwaXhlbCBzdHJpcC4gVGhpcyBhbHNvIGNsZWFycyB0aGUgcGl4ZWwuCi0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0UGl4ZWxTdHJpcChyZCwgeTEsIHBpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHdlaWdodCBmb3IgdGhlIG5leHQgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsU3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IGNvbXB1dGVXZWlnaHQocmVjb3JkU3RhcnQsIHJlY29yZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxTdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSBibG9jay5hZGRXZWlnaHQocGl4ZWxTdGFydCwgcmQubVJhbmssIHdlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXguc2V0RmllbGRzKHBpeGVsU3RhcnQsIHdlaWdodCwgc2VnbWVudCwgY29sb3IsIHJkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIHBpeGVsIHN0cmlwLiBUaGlzIGFsc28gY2xlYXJzIHRoZSBwaXhlbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQaXhlbFN0cmlwKHJkLCB5MSwgcGl4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBhIHN0cmlwIGZvciB0aGUgcmVzdCBvZiB0aGUgc2VnbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsU3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDEgPSBwaXhlbFN0YXJ0ICsgTGVmdE1hcmdpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlwIHN0cmlwID0gbmV3IFN0cmlwKHgxLCB5MSwgd2lkdGgsIHJvd0hlaWdodCwgcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQsIGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpcExpc3QuYWRkKHN0cmlwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW1pdCB0aGUgbGFzdCBwaXhlbHMgb2YgZWFjaCByb3csIGlmIGFueQotICAgICAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1OdW1Sb3dzOyArK2lpKSB7Ci0gICAgICAgICAgICAgICAgUGl4ZWwgcGl4ID0gcGl4ZWxzW2lpXTsKLSAgICAgICAgICAgICAgICBpZiAocGl4Lm1TZWdtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUm93RGF0YSByZCA9IHBpeC5tUm93RGF0YTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHkxID0gcmQubVJhbmsgKiByb3dZU3BhY2UgKyByb3dZTWFyZ2luSGFsZjsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgcGl4ZWwgc3RyaXAuIFRoaXMgYWxzbyBjbGVhcnMgdGhlIHBpeGVsLgotICAgICAgICAgICAgICAgICAgICBlbWl0UGl4ZWxTdHJpcChyZCwgeTEsIHBpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiY29tcHV0ZVN0cmlwcygpXG4iKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmlwIHN0cmlwIDogbVN0cmlwTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJTNkLCAlM2Qgd2lkdGggJTNkIGhlaWdodCAlZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC5tWCwgc3RyaXAubVksIHN0cmlwLm1XaWR0aCwgc3RyaXAubUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC5tU2VnbWVudC5tQmxvY2suZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBjb21wdXRlV2VpZ2h0KGRvdWJsZSBzdGFydCwgZG91YmxlIGVuZCwgaW50IHBpeGVsKSB7Ci0gICAgICAgICAgICBkb3VibGUgcGl4ZWxTdGFydEZyYWN0aW9uID0gbVNjYWxlSW5mby52YWx1ZVRvUGl4ZWxGcmFjdGlvbihzdGFydCk7Ci0gICAgICAgICAgICBkb3VibGUgcGl4ZWxFbmRGcmFjdGlvbiA9IG1TY2FsZUluZm8udmFsdWVUb1BpeGVsRnJhY3Rpb24oZW5kKTsKLSAgICAgICAgICAgIGRvdWJsZSBsZWZ0RW5kUG9pbnQgPSBNYXRoLm1heChwaXhlbFN0YXJ0RnJhY3Rpb24sIHBpeGVsIC0gMC41KTsKLSAgICAgICAgICAgIGRvdWJsZSByaWdodEVuZFBvaW50ID0gTWF0aC5taW4ocGl4ZWxFbmRGcmFjdGlvbiwgcGl4ZWwgKyAwLjUpOwotICAgICAgICAgICAgZG91YmxlIHdlaWdodCA9IHJpZ2h0RW5kUG9pbnQgLSBsZWZ0RW5kUG9pbnQ7Ci0gICAgICAgICAgICByZXR1cm4gd2VpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRQaXhlbFN0cmlwKFJvd0RhdGEgcmQsIGludCB5LCBQaXhlbCBwaXhlbCkgewotICAgICAgICAgICAgU3RyaXAgc3RyaXA7Ci0KLSAgICAgICAgICAgIGlmIChwaXhlbC5tU2VnbWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IHggPSBwaXhlbC5tU3RhcnQgKyBMZWZ0TWFyZ2luOwotICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcm93IGhlaWdodCBwcm9wb3J0aW9uYWwgdG8KLSAgICAgICAgICAgIC8vIHRoZSB3ZWlnaHQgb2YgdGhpcyBwaXhlbC4gQnV0IGRvbid0IGxldCB0aGUgcHJvcG9ydGlvbgotICAgICAgICAgICAgLy8gZXhjZWVkIDMvNCBvZiB0aGUgcm93IGhlaWdodCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgc2VlCi0gICAgICAgICAgICAvLyBpZiBhIGdpdmVuIHRpbWUgcmFuZ2UgaW5jbHVkZXMgbW9yZSB0aGFuIG9uZSBtZXRob2QuCi0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKHBpeGVsLm1NYXhXZWlnaHQgKiByb3dIZWlnaHQgKiAwLjc1KTsKLSAgICAgICAgICAgIGlmIChoZWlnaHQgPCBtTWluU3RyaXBIZWlnaHQpCi0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gbU1pblN0cmlwSGVpZ2h0OwotICAgICAgICAgICAgaW50IHJlbWFpbmRlciA9IHJvd0hlaWdodCAtIGhlaWdodDsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyaXAgPSBuZXcgU3RyaXAoeCwgeSwgMSwgcmVtYWluZGVyLCByZCwgcGl4ZWwubVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRmFkZUNvbG9ycyA/IG1Db2xvckdyYXkgOiBtQ29sb3JCbGFjayk7Ci0gICAgICAgICAgICAgICAgbVN0cmlwTGlzdC5hZGQoc3RyaXApOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCJlbWl0UGl4ZWwgKCVkLCAlZCkgaGVpZ2h0ICVkIGJsYWNrXG4iLAotICAgICAgICAgICAgICAgIC8vIHgsIHksIHJlbWFpbmRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpcCA9IG5ldyBTdHJpcCh4LCB5ICsgcmVtYWluZGVyLCAxLCBoZWlnaHQsIHJkLCBwaXhlbC5tU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwubUNvbG9yKTsKLSAgICAgICAgICAgIG1TdHJpcExpc3QuYWRkKHN0cmlwKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCJlbWl0UGl4ZWwgKCVkLCAlZCkgaGVpZ2h0ICVkICVzXG4iLAotICAgICAgICAgICAgLy8geCwgeSArIHJlbWFpbmRlciwgaGVpZ2h0LCBwaXhlbC5zZWdtZW50LmJsb2NrLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBwaXhlbC5tU2VnbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBwaXhlbC5tTWF4V2VpZ2h0ID0gMC4wOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IG1lKSB7Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAobUhpZ2hsaWdodE1ldGhvZERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0TWV0aG9kRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIGEgcmVjb21wdXRhdGlvbiBvZiB0aGUgc3RyaXAgY29sb3JzCi0gICAgICAgICAgICAgICAgICAgIG1DYWNoZWRFbmRSb3cgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQb2ludCBkaW0gPSBtU3VyZmFjZS5nZXRTaXplKCk7Ci0gICAgICAgICAgICBpbnQgeCA9IG1lLng7Ci0gICAgICAgICAgICBpZiAoeCA8IExlZnRNYXJnaW4pCi0gICAgICAgICAgICAgICAgeCA9IExlZnRNYXJnaW47Ci0gICAgICAgICAgICBpZiAoeCA+IGRpbS54IC0gUmlnaHRNYXJnaW4pCi0gICAgICAgICAgICAgICAgeCA9IGRpbS54IC0gUmlnaHRNYXJnaW47Ci0gICAgICAgICAgICBtTW91c2UueCA9IHg7Ci0gICAgICAgICAgICBtTW91c2UueSA9IG1lLnk7Ci0gICAgICAgICAgICBtVGltZXNjYWxlLnNldFZiYXJQb3NpdGlvbih4KTsKLSAgICAgICAgICAgIGlmIChtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLk1hcmtpbmcpIHsKLSAgICAgICAgICAgICAgICBtVGltZXNjYWxlLnNldE1hcmtFbmQoeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLk5vcm1hbCkgewotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY3Vyc29yIHRvIHRoZSBub3JtYWwgc3RhdGUuCi0gICAgICAgICAgICAgICAgbVN1cmZhY2Uuc2V0Q3Vyc29yKG1Ob3JtYWxDdXJzb3IpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtR3JhcGhpY3NTdGF0ZSA9PSBHcmFwaGljc1N0YXRlLk1hcmtpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBjdXJzb3IgcG9pbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3dlZXAKLSAgICAgICAgICAgICAgICBpZiAobU1vdXNlLnggPj0gbU1vdXNlTWFya1N0YXJ0WCkKLSAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2Uuc2V0Q3Vyc29yKG1JbmNyZWFzaW5nQ3Vyc29yKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLnNldEN1cnNvcihtRGVjcmVhc2luZ0N1cnNvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcm93bnVtID0gKG1Nb3VzZS55ICsgbVNjcm9sbE9mZnNldFkpIC8gcm93WVNwYWNlOwotICAgICAgICAgICAgaWYgKG1lLnkgPCAwIHx8IG1lLnkgPj0gZGltLnkpIHsKLSAgICAgICAgICAgICAgICByb3dudW0gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW91c2VSb3cgIT0gcm93bnVtKSB7Ci0gICAgICAgICAgICAgICAgbU1vdXNlUm93ID0gcm93bnVtOwotICAgICAgICAgICAgICAgIG1MYWJlbHMucmVkcmF3KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgUG9pbnQgZGltID0gbVN1cmZhY2UuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgaW50IHggPSBtZS54OwotICAgICAgICAgICAgaWYgKHggPCBMZWZ0TWFyZ2luKQotICAgICAgICAgICAgICAgIHggPSBMZWZ0TWFyZ2luOwotICAgICAgICAgICAgaWYgKHggPiBkaW0ueCAtIFJpZ2h0TWFyZ2luKQotICAgICAgICAgICAgICAgIHggPSBkaW0ueCAtIFJpZ2h0TWFyZ2luOwotICAgICAgICAgICAgbU1vdXNlTWFya1N0YXJ0WCA9IHg7Ci0gICAgICAgICAgICBtR3JhcGhpY3NTdGF0ZSA9IEdyYXBoaWNzU3RhdGUuTWFya2luZzsKLSAgICAgICAgICAgIG1TdXJmYWNlLnNldEN1cnNvcihtSW5jcmVhc2luZ0N1cnNvcik7Ci0gICAgICAgICAgICBtVGltZXNjYWxlLnNldE1hcmtTdGFydChtTW91c2VNYXJrU3RhcnRYKTsKLSAgICAgICAgICAgIG1UaW1lc2NhbGUuc2V0TWFya0VuZChtTW91c2VNYXJrU3RhcnRYKTsKLSAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBtZSkgewotICAgICAgICAgICAgbVN1cmZhY2Uuc2V0Q3Vyc29yKG1Ob3JtYWxDdXJzb3IpOwotICAgICAgICAgICAgaWYgKG1HcmFwaGljc1N0YXRlICE9IEdyYXBoaWNzU3RhdGUuTWFya2luZykgewotICAgICAgICAgICAgICAgIG1HcmFwaGljc1N0YXRlID0gR3JhcGhpY3NTdGF0ZS5Ob3JtYWw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUdyYXBoaWNzU3RhdGUgPSBHcmFwaGljc1N0YXRlLkFuaW1hdGluZzsKLSAgICAgICAgICAgIFBvaW50IGRpbSA9IG1TdXJmYWNlLmdldFNpemUoKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgcmVsZWFzZWQgdGhlIG1vdXNlIG91dHNpZGUgdGhlIGRyYXdpbmcgYXJlYSB0aGVuCi0gICAgICAgICAgICAvLyBjYW5jZWwgdGhlIHpvb20uCi0gICAgICAgICAgICBpZiAobWUueSA8PSAwIHx8IG1lLnkgPj0gZGltLnkpIHsKLSAgICAgICAgICAgICAgICBtR3JhcGhpY3NTdGF0ZSA9IEdyYXBoaWNzU3RhdGUuTm9ybWFsOwotICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHggPSBtZS54OwotICAgICAgICAgICAgaWYgKHggPCBMZWZ0TWFyZ2luKQotICAgICAgICAgICAgICAgIHggPSBMZWZ0TWFyZ2luOwotICAgICAgICAgICAgaWYgKHggPiBkaW0ueCAtIFJpZ2h0TWFyZ2luKQotICAgICAgICAgICAgICAgIHggPSBkaW0ueCAtIFJpZ2h0TWFyZ2luOwotICAgICAgICAgICAgbU1vdXNlTWFya0VuZFggPSB4OwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBjbGlja2VkIGFuZCByZWxlYXNlZCB0aGUgbW91c2UgYXQgdGhlIHNhbWUgcG9pbnQKLSAgICAgICAgICAgIC8vICgrLy0gYSBwaXhlbCBvciB0d28pIHRoZW4gY2FuY2VsIHRoZSB6b29tIChidXQgc2VsZWN0IHRoZQotICAgICAgICAgICAgLy8gbWV0aG9kKS4KLSAgICAgICAgICAgIGludCBkaXN0ID0gbU1vdXNlTWFya0VuZFggLSBtTW91c2VNYXJrU3RhcnRYOwotICAgICAgICAgICAgaWYgKGRpc3QgPCAwKQotICAgICAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLSAgICAgICAgICAgIGlmIChkaXN0IDw9IDIpIHsKLSAgICAgICAgICAgICAgICBtR3JhcGhpY3NTdGF0ZSA9IEdyYXBoaWNzU3RhdGUuTm9ybWFsOwotCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBtZXRob2QgdW5kZXJuZWF0aCB0aGUgbW91c2UKLSAgICAgICAgICAgICAgICBtTW91c2VTZWxlY3QueCA9IG1Nb3VzZU1hcmtTdGFydFg7Ci0gICAgICAgICAgICAgICAgbU1vdXNlU2VsZWN0LnkgPSBtZS55OwotICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWFrZSBtb3VzZUVuZFggYmUgdGhlIGhpZ2hlciBlbmQgcG9pbnQKLSAgICAgICAgICAgIGlmIChtTW91c2VNYXJrRW5kWCA8IG1Nb3VzZU1hcmtTdGFydFgpIHsKLSAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IG1Nb3VzZU1hcmtFbmRYOwotICAgICAgICAgICAgICAgIG1Nb3VzZU1hcmtFbmRYID0gbU1vdXNlTWFya1N0YXJ0WDsKLSAgICAgICAgICAgICAgICBtTW91c2VNYXJrU3RhcnRYID0gdGVtcDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlIHpvb20gYXJlYSBpcyB0aGUgd2hvbGUgd2luZG93IChvciBuZWFybHkgdGhlIHdob2xlCi0gICAgICAgICAgICAvLyB3aW5kb3cpIHRoZW4gY2FuY2VsIHRoZSB6b29tLgotICAgICAgICAgICAgaWYgKG1Nb3VzZU1hcmtTdGFydFggPD0gTGVmdE1hcmdpbiArIE1pblpvb21QaXhlbE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAmJiBtTW91c2VNYXJrRW5kWCA+PSBkaW0ueCAtIFJpZ2h0TWFyZ2luIC0gTWluWm9vbVBpeGVsTWFyZ2luKSB7Ci0gICAgICAgICAgICAgICAgbUdyYXBoaWNzU3RhdGUgPSBHcmFwaGljc1N0YXRlLk5vcm1hbDsKLSAgICAgICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgc29tZSB2YXJpYWJsZXMgbmVlZGVkIGZvciB6b29taW5nLgotICAgICAgICAgICAgLy8gSXQncyBwcm9iYWJseSBlYXNpZXN0IHRvIGV4cGxhaW4gYnkgYW4gZXhhbXBsZS4gVGhlcmUKLSAgICAgICAgICAgIC8vIGFyZSB0d28gc2NhbGVzIChvciBkaW1lbnNpb25zKSBpbnZvbHZlZDogb25lIGZvciB0aGUgcGl4ZWxzCi0gICAgICAgICAgICAvLyBhbmQgb25lIGZvciB0aGUgdmFsdWVzIChtaWNyb3NlY29uZHMpLiBUbyBrZWVwIHRoZSBleGFtcGxlCi0gICAgICAgICAgICAvLyBzaW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBwaXhlbHMgaW4gdGhlIHJhbmdlIFswLDE2XSBhbmQKLSAgICAgICAgICAgIC8vIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzEwMCwgMjYwXSwgYW5kIHN1cHBvc2UgdGhlIHVzZXIKLSAgICAgICAgICAgIC8vIHNlbGVjdHMgYSB6b29tIHdpbmRvdyBmcm9tIHBpeGVsIDQgdG8gcGl4ZWwgOC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB1c2VjOiAxMDAgMTQwIDE4MCAyNjAKLSAgICAgICAgICAgIC8vIHwtLS0tLS0tfFpaWlpaWlp8LS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAgLy8gcGl4ZWw6IDAgNCA4IDE2Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSSd2ZSBkcmF3biB0aGUgcGl4ZWxzIHN0YXJ0aW5nIGF0IHplcm8gZm9yIHNpbXBsaWNpdHksIGJ1dAotICAgICAgICAgICAgLy8gaW4gZmFjdCB0aGUgZHJhd2FibGUgYXJlYSBpcyBvZmZzZXQgZnJvbSB0aGUgbGVmdCBtYXJnaW4KLSAgICAgICAgICAgIC8vIGJ5IHRoZSB2YWx1ZSBvZiAiTGVmdE1hcmdpbiIuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlICJwaXhlbHMtcGVyLXJhbmdlIiAocHByKSBpbiB0aGlzIGNhc2UgaXMgMC4xIChhIHRlbnRoIG9mCi0gICAgICAgICAgICAvLyBhIHBpeGVsIHBlciB1c2VjKS4gV2hhdCB3ZSB3YW50IGlzIHRvIHJlZHJhdyB0aGUgc2NyZWVuIGluCi0gICAgICAgICAgICAvLyBzZXZlcmFsIHN0ZXBzLCBlYWNoIHRpbWUgaW5jcmVhc2luZyB0aGUgem9vbSB3aW5kb3cgdW50aWwgdGhlCi0gICAgICAgICAgICAvLyB6b29tIHdpbmRvdyBmaWxscyB0aGUgc2NyZWVuLiBGb3Igc2ltcGxpY2l0eSwgYXNzdW1lIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gem9vbSBpbiBmb3VyIGVxdWFsIHN0ZXBzLiBUaGVuIHRoZSBzbmFwc2hvdHMKLSAgICAgICAgICAgIC8vIG9mIHRoZSBzY3JlZW4gYXQgZWFjaCBzdGVwIHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB1c2VjOiAxMDAgMTQwIDE4MCAyNjAKLSAgICAgICAgICAgIC8vIHwtLS0tLS0tfFpaWlpaWlp8LS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAgLy8gcGl4ZWw6IDAgNCA4IDE2Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gdXNlYzogPyAxNDAgMTgwID8KLSAgICAgICAgICAgIC8vIHwtLS0tLXxaWlpaWlpaWlpaWlpafC0tLS0tLS0tLS0tfAotICAgICAgICAgICAgLy8gcGl4ZWw6IDAgMyAxMCAxNgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIHVzZWM6ID8gMTQwIDE4MCA/Ci0gICAgICAgICAgICAvLyB8LS0tfFpaWlpaWlpaWlpaWlpaWlpaWlp8LS0tLS0tLXwKLSAgICAgICAgICAgIC8vIHBpeGVsOiAwIDIgMTIgMTYKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB1c2VjOiA/MTQwIDE4MCA/Ci0gICAgICAgICAgICAvLyB8LXxaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpafC0tLXwKLSAgICAgICAgICAgIC8vIHBpeGVsOiAwIDEgMTQgMTYKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB1c2VjOiAxNDAgMTgwCi0gICAgICAgICAgICAvLyB8WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWnwKLSAgICAgICAgICAgIC8vIHBpeGVsOiAwIDE2Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gaXMgaG93IHRvIGNvbXB1dGUgdGhlIGVuZHBvaW50cyAoZGVub3RlZCBieSA/KQotICAgICAgICAgICAgLy8gZm9yIGVhY2ggc3RlcC4gVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kuIFdlIGZpcnN0IG5lZWQgdG8KLSAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlICJmaXhlZCBwb2ludCI6IHRoaXMgaXMgdGhlIHBvaW50IGluIHRoZSBzZWxlY3Rpb24KLSAgICAgICAgICAgIC8vIHRoYXQgZG9lc24ndCBtb3ZlIGxlZnQgb3IgcmlnaHQuIFRoZW4gd2UgY2FuIHJlY29tcHV0ZSB0aGUKLSAgICAgICAgICAgIC8vICJwcHIiIChwaXhlbHMgcGVyIHJhbmdlKSBhdCBlYWNoIHN0ZXAgYW5kIHRoZW4gZmluZCB0aGUKLSAgICAgICAgICAgIC8vIGVuZHBvaW50cy4gVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBlbmQgcG9pbnRzIGlzIGRvbmUKLSAgICAgICAgICAgIC8vIGluIGFuaW1hdGVab29tKCkuIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBmaXhlZCBwb2ludAotICAgICAgICAgICAgLy8gYW5kIHNvbWUgb3RoZXIgdmFyaWFibGVzIG5lZWRlZCBpbiBhbmltYXRlWm9vbSgpLgotCi0gICAgICAgICAgICBkb3VibGUgbWluVmFsID0gbVNjYWxlSW5mby5nZXRNaW5WYWwoKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhWYWwgPSBtU2NhbGVJbmZvLmdldE1heFZhbCgpOwotICAgICAgICAgICAgZG91YmxlIHBwciA9IG1TY2FsZUluZm8uZ2V0UGl4ZWxzUGVyUmFuZ2UoKTsKLSAgICAgICAgICAgIG1ab29tTWluID0gbWluVmFsICsgKChtTW91c2VNYXJrU3RhcnRYIC0gTGVmdE1hcmdpbikgLyBwcHIpOwotICAgICAgICAgICAgbVpvb21NYXggPSBtaW5WYWwgKyAoKG1Nb3VzZU1hcmtFbmRYIC0gTGVmdE1hcmdpbikgLyBwcHIpOwotCi0gICAgICAgICAgICAvLyBDbGFtcCB0aGUgbWluIGFuZCBtYXggdmFsdWVzIHRvIHRoZSBhY3R1YWwgZGF0YSBtaW4gYW5kIG1heAotICAgICAgICAgICAgaWYgKG1ab29tTWluIDwgbU1pbkRhdGFWYWwpCi0gICAgICAgICAgICAgICAgbVpvb21NaW4gPSBtTWluRGF0YVZhbDsKLSAgICAgICAgICAgIGlmIChtWm9vbU1heCA+IG1NYXhEYXRhVmFsKQotICAgICAgICAgICAgICAgIG1ab29tTWF4ID0gbU1heERhdGFWYWw7Ci0KLSAgICAgICAgICAgIC8vIFNuYXAgdGhlIG1pbiBhbmQgbWF4IHBvaW50cyB0byB0aGUgZ3JpZCBkZXRlcm1pbmVkIGJ5IHRoZQotICAgICAgICAgICAgLy8gVGlja1NjYWxlcgotICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHpvb20uCi0gICAgICAgICAgICBpbnQgeGRpbSA9IGRpbS54IC0gVG90YWxYTWFyZ2luOwotICAgICAgICAgICAgVGlja1NjYWxlciBzY2FsZXIgPSBuZXcgVGlja1NjYWxlcihtWm9vbU1pbiwgbVpvb21NYXgsIHhkaW0sCi0gICAgICAgICAgICAgICAgICAgIFBpeGVsc1BlclRpY2spOwotICAgICAgICAgICAgc2NhbGVyLmNvbXB1dGVUaWNrcyhmYWxzZSk7Ci0gICAgICAgICAgICBtWm9vbU1pbiA9IHNjYWxlci5nZXRNaW5WYWwoKTsKLSAgICAgICAgICAgIG1ab29tTWF4ID0gc2NhbGVyLmdldE1heFZhbCgpOwotCi0gICAgICAgICAgICAvLyBBbHNvIHNuYXAgdGhlIG1vdXNlIHBvaW50cyAoaW4gcGl4ZWwgc3BhY2UpIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAotICAgICAgICAgICAgLy8gem9vbU1pbiBhbmQgem9vbU1heCAoaW4gdmFsdWUgc3BhY2UpLgotICAgICAgICAgICAgbU1vdXNlTWFya1N0YXJ0WCA9IChpbnQpICgobVpvb21NaW4gLSBtaW5WYWwpICogcHByICsgTGVmdE1hcmdpbik7Ci0gICAgICAgICAgICBtTW91c2VNYXJrRW5kWCA9IChpbnQpICgobVpvb21NYXggLSBtaW5WYWwpICogcHByICsgTGVmdE1hcmdpbik7Ci0gICAgICAgICAgICBtVGltZXNjYWxlLnNldE1hcmtTdGFydChtTW91c2VNYXJrU3RhcnRYKTsKLSAgICAgICAgICAgIG1UaW1lc2NhbGUuc2V0TWFya0VuZChtTW91c2VNYXJrRW5kWCk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIG1vdXNlIHNlbGVjdGlvbiBlbmQgcG9pbnQgZGlzdGFuY2VzCi0gICAgICAgICAgICBtTW91c2VFbmREaXN0YW5jZSA9IGRpbS54IC0gUmlnaHRNYXJnaW4gLSBtTW91c2VNYXJrRW5kWDsKLSAgICAgICAgICAgIG1Nb3VzZVN0YXJ0RGlzdGFuY2UgPSBtTW91c2VNYXJrU3RhcnRYIC0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgIG1ab29tTW91c2VTdGFydCA9IG1Nb3VzZU1hcmtTdGFydFg7Ci0gICAgICAgICAgICBtWm9vbU1vdXNlRW5kID0gbU1vdXNlTWFya0VuZFg7Ci0gICAgICAgICAgICBtWm9vbVN0ZXAgPSAwOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmaXhlZCBwb2ludCBpbiBib3RoIHZhbHVlIHNwYWNlIGFuZCBwaXhlbCBzcGFjZS4KLSAgICAgICAgICAgIG1NaW4yWm9vbU1pbiA9IG1ab29tTWluIC0gbWluVmFsOwotICAgICAgICAgICAgbVpvb21NYXgyTWF4ID0gbWF4VmFsIC0gbVpvb21NYXg7Ci0gICAgICAgICAgICBtWm9vbUZpeGVkID0gbVpvb21NaW4gKyAobVpvb21NYXggLSBtWm9vbU1pbikgKiBtTWluMlpvb21NaW4KLSAgICAgICAgICAgICAgICAgICAgLyAobU1pbjJab29tTWluICsgbVpvb21NYXgyTWF4KTsKLSAgICAgICAgICAgIG1ab29tRml4ZWRQaXhlbCA9IChtWm9vbUZpeGVkIC0gbWluVmFsKSAqIHBwciArIExlZnRNYXJnaW47Ci0gICAgICAgICAgICBtRml4ZWRQaXhlbFN0YXJ0RGlzdGFuY2UgPSBtWm9vbUZpeGVkUGl4ZWwgLSBMZWZ0TWFyZ2luOwotICAgICAgICAgICAgbUZpeGVkUGl4ZWxFbmREaXN0YW5jZSA9IGRpbS54IC0gUmlnaHRNYXJnaW4gLSBtWm9vbUZpeGVkUGl4ZWw7Ci0KLSAgICAgICAgICAgIG1ab29tTWluMkZpeGVkID0gbVpvb21GaXhlZCAtIG1ab29tTWluOwotICAgICAgICAgICAgbUZpeGVkMlpvb21NYXggPSBtWm9vbU1heCAtIG1ab29tRml4ZWQ7Ci0KLSAgICAgICAgICAgIGdldERpc3BsYXkoKS50aW1lckV4ZWMoWk9PTV9USU1FUl9JTlRFUlZBTCwgbVpvb21BbmltYXRvcik7Ci0gICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm8gZGVmaW5lZCBiZWhhdmlvciB5ZXQgZm9yIGRvdWJsZS1jbGljay4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBtZSkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFNjYWxpbmcoaW50IG1vdXNlWCkgewotICAgICAgICAgICAgUG9pbnQgZGltID0gbVN1cmZhY2UuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgaW50IHggPSBtb3VzZVg7Ci0gICAgICAgICAgICBpZiAoeCA8IExlZnRNYXJnaW4pCi0gICAgICAgICAgICAgICAgeCA9IExlZnRNYXJnaW47Ci0gICAgICAgICAgICBpZiAoeCA+IGRpbS54IC0gUmlnaHRNYXJnaW4pCi0gICAgICAgICAgICAgICAgeCA9IGRpbS54IC0gUmlnaHRNYXJnaW47Ci0gICAgICAgICAgICBtTW91c2VNYXJrU3RhcnRYID0geDsKLSAgICAgICAgICAgIG1HcmFwaGljc1N0YXRlID0gR3JhcGhpY3NTdGF0ZS5TY2FsaW5nOwotICAgICAgICAgICAgbVNjYWxlUGl4ZWxzUGVyUmFuZ2UgPSBtU2NhbGVJbmZvLmdldFBpeGVsc1BlclJhbmdlKCk7Ci0gICAgICAgICAgICBtU2NhbGVNaW5WYWwgPSBtU2NhbGVJbmZvLmdldE1pblZhbCgpOwotICAgICAgICAgICAgbVNjYWxlTWF4VmFsID0gbVNjYWxlSW5mby5nZXRNYXhWYWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3BTY2FsaW5nKGludCBtb3VzZVgpIHsKLSAgICAgICAgICAgIG1HcmFwaGljc1N0YXRlID0gR3JhcGhpY3NTdGF0ZS5Ob3JtYWw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhbmltYXRlSGlnaGxpZ2h0KCkgewotICAgICAgICAgICAgbUhpZ2hsaWdodFN0ZXAgKz0gMTsKLSAgICAgICAgICAgIGlmIChtSGlnaGxpZ2h0U3RlcCA+PSBISUdITElHSFRfU1RFUFMpIHsKLSAgICAgICAgICAgICAgICBtRmFkZUNvbG9ycyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1IaWdobGlnaHRTdGVwID0gMDsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSBhIHJlY29tcHV0YXRpb24gb2YgdGhlIHN0cmlwIGNvbG9ycwotICAgICAgICAgICAgICAgIG1DYWNoZWRFbmRSb3cgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZhZGVDb2xvcnMgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1TaG93SGlnaGxpZ2h0TmFtZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaGlnaGxpZ2h0SGVpZ2h0ID0gaGlnaGxpZ2h0SGVpZ2h0c1ttSGlnaGxpZ2h0U3RlcF07Ci0gICAgICAgICAgICAgICAgZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhISUdITElHSFRfVElNRVJfSU5URVJWQUwsIG1IaWdobGlnaHRBbmltYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjbGVhckhpZ2hsaWdodHMoKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50ZigiY2xlYXJIaWdobGlnaHRzKClcbiIpOwotICAgICAgICAgICAgbVNob3dIaWdobGlnaHROYW1lID0gZmFsc2U7Ci0gICAgICAgICAgICBoaWdobGlnaHRIZWlnaHQgPSAwOwotICAgICAgICAgICAgbUhpZ2hsaWdodE1ldGhvZERhdGEgPSBudWxsOwotICAgICAgICAgICAgbUhpZ2hsaWdodENhbGwgPSBudWxsOwotICAgICAgICAgICAgbUZhZGVDb2xvcnMgPSBmYWxzZTsKLSAgICAgICAgICAgIG1IaWdobGlnaHRTdGVwID0gMDsKLSAgICAgICAgICAgIC8vIEZvcmNlIGEgcmVjb21wdXRhdGlvbiBvZiB0aGUgc3RyaXAgY29sb3JzCi0gICAgICAgICAgICBtQ2FjaGVkRW5kUm93ID0gLTE7Ci0gICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhbmltYXRlWm9vbSgpIHsKLSAgICAgICAgICAgIG1ab29tU3RlcCArPSAxOwotICAgICAgICAgICAgaWYgKG1ab29tU3RlcCA+IFpPT01fU1RFUFMpIHsKLSAgICAgICAgICAgICAgICBtR3JhcGhpY3NTdGF0ZSA9IEdyYXBoaWNzU3RhdGUuTm9ybWFsOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIGEgbm9ybWFsIHJlY29tcHV0YXRpb24KLSAgICAgICAgICAgICAgICBtQ2FjaGVkTWluVmFsID0gbVNjYWxlSW5mby5nZXRNaW5WYWwoKSArIDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ab29tU3RlcCA9PSBaT09NX1NURVBTKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlSW5mby5zZXRNaW5WYWwobVpvb21NaW4pOwotICAgICAgICAgICAgICAgIG1TY2FsZUluZm8uc2V0TWF4VmFsKG1ab29tTWF4KTsKLSAgICAgICAgICAgICAgICBtTW91c2VNYXJrU3RhcnRYID0gTGVmdE1hcmdpbjsKLSAgICAgICAgICAgICAgICBQb2ludCBkaW0gPSBnZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgbU1vdXNlTWFya0VuZFggPSBkaW0ueCAtIFJpZ2h0TWFyZ2luOwotICAgICAgICAgICAgICAgIG1UaW1lc2NhbGUuc2V0TWFya1N0YXJ0KG1Nb3VzZU1hcmtTdGFydFgpOwotICAgICAgICAgICAgICAgIG1UaW1lc2NhbGUuc2V0TWFya0VuZChtTW91c2VNYXJrRW5kWCk7Ci0gICAgICAgICAgICAgICAgZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhaT09NX1RJTUVSX0lOVEVSVkFMLCBtWm9vbUFuaW1hdG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gWm9vbSBpbiBzbG93bHkgYXQgZmlyc3QsIHRoZW4gc3BlZWQgdXAsIHRoZW4gc2xvdyBkb3duLgotICAgICAgICAgICAgICAgIC8vIFRoZSB6b29tIGZyYWN0aW9ucyBhcmUgcHJlY29tcHV0ZWQgdG8gc2F2ZSB0aW1lLgotICAgICAgICAgICAgICAgIGRvdWJsZSBmcmFjdGlvbiA9IG1ab29tRnJhY3Rpb25zW21ab29tU3RlcF07Ci0gICAgICAgICAgICAgICAgbU1vdXNlTWFya1N0YXJ0WCA9IChpbnQpIChtWm9vbU1vdXNlU3RhcnQgLSBmcmFjdGlvbiAqIG1Nb3VzZVN0YXJ0RGlzdGFuY2UpOwotICAgICAgICAgICAgICAgIG1Nb3VzZU1hcmtFbmRYID0gKGludCkgKG1ab29tTW91c2VFbmQgKyBmcmFjdGlvbiAqIG1Nb3VzZUVuZERpc3RhbmNlKTsKLSAgICAgICAgICAgICAgICBtVGltZXNjYWxlLnNldE1hcmtTdGFydChtTW91c2VNYXJrU3RhcnRYKTsKLSAgICAgICAgICAgICAgICBtVGltZXNjYWxlLnNldE1hcmtFbmQobU1vdXNlTWFya0VuZFgpOwotCi0gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IHBpeGVscy1wZXItcmFuZ2UuIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uCi0gICAgICAgICAgICAgICAgZG91YmxlIHBwcjsKLSAgICAgICAgICAgICAgICBpZiAobVpvb21NaW4yRml4ZWQgPj0gbUZpeGVkMlpvb21NYXgpCi0gICAgICAgICAgICAgICAgICAgIHBwciA9IChtWm9vbUZpeGVkUGl4ZWwgLSBtTW91c2VNYXJrU3RhcnRYKSAvIG1ab29tTWluMkZpeGVkOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHByID0gKG1Nb3VzZU1hcmtFbmRYIC0gbVpvb21GaXhlZFBpeGVsKSAvIG1GaXhlZDJab29tTWF4OwotICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdNaW4gPSBtWm9vbUZpeGVkIC0gbUZpeGVkUGl4ZWxTdGFydERpc3RhbmNlIC8gcHByOwotICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdNYXggPSBtWm9vbUZpeGVkICsgbUZpeGVkUGl4ZWxFbmREaXN0YW5jZSAvIHBwcjsKLSAgICAgICAgICAgICAgICBtU2NhbGVJbmZvLnNldE1pblZhbChuZXdNaW4pOwotICAgICAgICAgICAgICAgIG1TY2FsZUluZm8uc2V0TWF4VmFsKG5ld01heCk7Ci0KLSAgICAgICAgICAgICAgICBnZXREaXNwbGF5KCkudGltZXJFeGVjKFpPT01fVElNRVJfSU5URVJWQUwsIG1ab29tQW5pbWF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVG90YWxYTWFyZ2luID0gTGVmdE1hcmdpbiArIFJpZ2h0TWFyZ2luOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgeU1hcmdpbiA9IDE7IC8vIGJsYW5rIHNwYWNlIG9uIHRvcAotICAgICAgICAvLyBUaGUgbWluaW11bSBtYXJnaW4gb24gZWFjaCBzaWRlIG9mIHRoZSB6b29tIHdpbmRvdywgaW4gcGl4ZWxzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTWluWm9vbVBpeGVsTWFyZ2luID0gMTA7Ci0gICAgICAgIHByaXZhdGUgR3JhcGhpY3NTdGF0ZSBtR3JhcGhpY3NTdGF0ZSA9IEdyYXBoaWNzU3RhdGUuTm9ybWFsOwotICAgICAgICBwcml2YXRlIFBvaW50IG1Nb3VzZSA9IG5ldyBQb2ludChMZWZ0TWFyZ2luLCAwKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vdXNlTWFya1N0YXJ0WDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vdXNlTWFya0VuZFg7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGVidWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaXA+IG1TdHJpcExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmlwPigpOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxSYW5nZT4gbUhpZ2hsaWdodEV4Y2x1c2l2ZSA9IG5ldyBBcnJheUxpc3Q8UmFuZ2U+KCk7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFJhbmdlPiBtSGlnaGxpZ2h0SW5jbHVzaXZlID0gbmV3IEFycmF5TGlzdDxSYW5nZT4oKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1pblN0cmlwSGVpZ2h0ID0gMjsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbUNhY2hlZE1pblZhbDsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbUNhY2hlZE1heFZhbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNhY2hlZFN0YXJ0Um93OwotICAgICAgICBwcml2YXRlIGludCBtQ2FjaGVkRW5kUm93OwotICAgICAgICBwcml2YXRlIGRvdWJsZSBtU2NhbGVQaXhlbHNQZXJSYW5nZTsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVNjYWxlTWluVmFsOwotICAgICAgICBwcml2YXRlIGRvdWJsZSBtU2NhbGVNYXhWYWw7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIG1MaW1pdE1pblZhbDsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbUxpbWl0TWF4VmFsOwotICAgICAgICBwcml2YXRlIGRvdWJsZSBtTWluRGF0YVZhbDsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbU1heERhdGFWYWw7Ci0gICAgICAgIHByaXZhdGUgQ3Vyc29yIG1Ob3JtYWxDdXJzb3I7Ci0gICAgICAgIHByaXZhdGUgQ3Vyc29yIG1JbmNyZWFzaW5nQ3Vyc29yOwotICAgICAgICBwcml2YXRlIEN1cnNvciBtRGVjcmVhc2luZ0N1cnNvcjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fVElNRVJfSU5URVJWQUwgPSAxMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJR0hMSUdIVF9USU1FUl9JTlRFUlZBTCA9IDUwOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9TVEVQUyA9IDg7IC8vIG11c3QgYmUgZXZlbgotICAgICAgICBwcml2YXRlIGludCBoaWdobGlnaHRIZWlnaHQgPSA0OwotICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIGhpZ2hsaWdodEhlaWdodHMgPSB7IDAsIDIsIDQsIDUsIDYsIDUsIDQsIDIsIDQsIDUsCi0gICAgICAgICAgICAgICAgNiB9OwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBISUdITElHSFRfU1RFUFMgPSBoaWdobGlnaHRIZWlnaHRzLmxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GYWRlQ29sb3JzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dIaWdobGlnaHROYW1lOwotICAgICAgICBwcml2YXRlIGRvdWJsZVtdIG1ab29tRnJhY3Rpb25zOwotICAgICAgICBwcml2YXRlIGludCBtWm9vbVN0ZXA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1ab29tTW91c2VTdGFydDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVpvb21Nb3VzZUVuZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vdXNlU3RhcnREaXN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vdXNlRW5kRGlzdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgUG9pbnQgbU1vdXNlU2VsZWN0ID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBwcml2YXRlIGRvdWJsZSBtWm9vbUZpeGVkOwotICAgICAgICBwcml2YXRlIGRvdWJsZSBtWm9vbUZpeGVkUGl4ZWw7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIG1GaXhlZFBpeGVsU3RhcnREaXN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbUZpeGVkUGl4ZWxFbmREaXN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVpvb21NaW4yRml4ZWQ7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIG1NaW4yWm9vbU1pbjsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbUZpeGVkMlpvb21NYXg7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIG1ab29tTWF4Mk1heDsKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVpvb21NaW47Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIG1ab29tTWF4OwotICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQW5pbWF0b3I7Ci0gICAgICAgIHByaXZhdGUgUnVubmFibGUgbUhpZ2hsaWdodEFuaW1hdG9yOwotICAgICAgICBwcml2YXRlIGludCBtSGlnaGxpZ2h0U3RlcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb21wdXRlVmlzaWJsZVJvd3MoaW50IHlkaW0pIHsKLSAgICAgICAgLy8gSWYgd2UgcmVzaXplLCB0aGVuIG1vdmUgdGhlIGJvdHRvbSByb3cgZG93bi4gIERvbid0IGFsbG93IHRoZSBzY3JvbGwKLSAgICAgICAgLy8gdG8gd2FzdGUgc3BhY2UgYXQgdGhlIGJvdHRvbS4KLSAgICAgICAgaW50IG9mZnNldFkgPSBtU2Nyb2xsT2Zmc2V0WTsKLSAgICAgICAgaW50IHNwYWNlTmVlZGVkID0gbU51bVJvd3MgKiByb3dZU3BhY2U7Ci0gICAgICAgIGlmIChvZmZzZXRZICsgeWRpbSA+IHNwYWNlTmVlZGVkKSB7Ci0gICAgICAgICAgICBvZmZzZXRZID0gc3BhY2VOZWVkZWQgLSB5ZGltOwotICAgICAgICAgICAgaWYgKG9mZnNldFkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0WSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXJ0Um93ID0gb2Zmc2V0WSAvIHJvd1lTcGFjZTsKLSAgICAgICAgbUVuZFJvdyA9IChvZmZzZXRZICsgeWRpbSkgLyByb3dZU3BhY2U7Ci0gICAgICAgIGlmIChtRW5kUm93ID49IG1OdW1Sb3dzKSB7Ci0gICAgICAgICAgICBtRW5kUm93ID0gbU51bVJvd3MgLSAxOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gb2Zmc2V0WTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRIaWdobGlnaHRpbmcoKSB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRmKCJzdGFydEhpZ2hsaWdodGluZygpXG4iKTsKLSAgICAgICAgbVN1cmZhY2UubUhpZ2hsaWdodFN0ZXAgPSAwOwotICAgICAgICBtU3VyZmFjZS5tRmFkZUNvbG9ycyA9IHRydWU7Ci0gICAgICAgIC8vIEZvcmNlIGEgcmVjb21wdXRhdGlvbiBvZiB0aGUgY29sb3Igc3RyaXBzCi0gICAgICAgIG1TdXJmYWNlLm1DYWNoZWRFbmRSb3cgPSAtMTsKLSAgICAgICAgZ2V0RGlzcGxheSgpLnRpbWVyRXhlYygwLCBtU3VyZmFjZS5tSGlnaGxpZ2h0QW5pbWF0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJvd0RhdGEgewotICAgICAgICBSb3dEYXRhKFJvdyByb3cpIHsKLSAgICAgICAgICAgIG1OYW1lID0gcm93LmdldE5hbWUoKTsKLSAgICAgICAgICAgIG1TdGFjayA9IG5ldyBBcnJheUxpc3Q8QmxvY2s+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwdXNoKEJsb2NrIGJsb2NrKSB7Ci0gICAgICAgICAgICBtU3RhY2suYWRkKGJsb2NrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCbG9jayB0b3AoKSB7Ci0gICAgICAgICAgICBpZiAobVN0YWNrLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG1TdGFjay5nZXQobVN0YWNrLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcG9wKCkgewotICAgICAgICAgICAgaWYgKG1TdGFjay5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBtU3RhY2sucmVtb3ZlKG1TdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIGludCBtUmFuazsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1FbGFwc2VkOwotICAgICAgICBwcml2YXRlIGxvbmcgbUVuZFRpbWU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PEJsb2NrPiBtU3RhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VnbWVudCB7Ci0gICAgICAgIFNlZ21lbnQoUm93RGF0YSByb3dEYXRhLCBCbG9jayBibG9jaywgbG9uZyBzdGFydFRpbWUsIGxvbmcgZW5kVGltZSkgewotICAgICAgICAgICAgbVJvd0RhdGEgPSByb3dEYXRhOwotICAgICAgICAgICAgbUJsb2NrID0gYmxvY2s7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOwotICAgICAgICAgICAgbUVuZFRpbWUgPSBlbmRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBSb3dEYXRhIG1Sb3dEYXRhOwotICAgICAgICBwcml2YXRlIEJsb2NrIG1CbG9jazsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtRW5kVGltZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpcCB7Ci0gICAgICAgIFN0cmlwKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBSb3dEYXRhIHJvd0RhdGEsCi0gICAgICAgICAgICAgICAgU2VnbWVudCBzZWdtZW50LCBDb2xvciBjb2xvcikgewotICAgICAgICAgICAgbVggPSB4OwotICAgICAgICAgICAgbVkgPSB5OwotICAgICAgICAgICAgbVdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgbVJvd0RhdGEgPSByb3dEYXRhOwotICAgICAgICAgICAgbVNlZ21lbnQgPSBzZWdtZW50OwotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbVg7Ci0gICAgICAgIGludCBtWTsKLSAgICAgICAgaW50IG1XaWR0aDsKLSAgICAgICAgaW50IG1IZWlnaHQ7Ci0gICAgICAgIFJvd0RhdGEgbVJvd0RhdGE7Ci0gICAgICAgIFNlZ21lbnQgbVNlZ21lbnQ7Ci0gICAgICAgIENvbG9yIG1Db2xvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkcyhpbnQgc3RhcnQsIGRvdWJsZSB3ZWlnaHQsIFNlZ21lbnQgc2VnbWVudCwKLSAgICAgICAgICAgICAgICBDb2xvciBjb2xvciwgUm93RGF0YSByb3dEYXRhKSB7Ci0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1NYXhXZWlnaHQgPSB3ZWlnaHQ7Ci0gICAgICAgICAgICBtU2VnbWVudCA9IHNlZ21lbnQ7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG1Sb3dEYXRhID0gcm93RGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtU3RhcnQgPSAtMjsgLy8gc29tZSB2YWx1ZSB0aGF0IHdvbid0IG1hdGNoIGFub3RoZXIgcGl4ZWwKLSAgICAgICAgZG91YmxlIG1NYXhXZWlnaHQ7Ci0gICAgICAgIFNlZ21lbnQgbVNlZ21lbnQ7Ci0gICAgICAgIENvbG9yIG1Db2xvcjsgLy8gd2UgbmVlZCB0aGUgY29sb3IgaGVyZSBiZWNhdXNlIGl0IG1heSBiZSBmYWRlZAotICAgICAgICBSb3dEYXRhIG1Sb3dEYXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJhbmdlIHsKLSAgICAgICAgUmFuZ2UoaW50IHhTdGFydCwgaW50IHdpZHRoLCBpbnQgeSwgQ29sb3IgY29sb3IpIHsKLSAgICAgICAgICAgIG1YZGltLnggPSB4U3RhcnQ7Ci0gICAgICAgICAgICBtWGRpbS55ID0gd2lkdGg7Ci0gICAgICAgICAgICBtWSA9IHk7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIFBvaW50IG1YZGltID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBpbnQgbVk7Ci0gICAgICAgIENvbG9yIG1Db2xvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9UcmFjZVJlYWRlci5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvVHJhY2VSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3NTg3Ni4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3RyYWNldmlldy9UcmFjZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudHJhY2V2aWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYWNlUmVhZGVyIHsKLQotICAgIHByaXZhdGUgVHJhY2VVbml0cyBtVHJhY2VVbml0czsKLQotICAgIHB1YmxpYyBUcmFjZVVuaXRzIGdldFRyYWNlVW5pdHMoKSB7Ci0gICAgICAgIGlmIChtVHJhY2VVbml0cyA9PSBudWxsKQotICAgICAgICAgICAgbVRyYWNlVW5pdHMgPSBuZXcgVHJhY2VVbml0cygpOwotICAgICAgICByZXR1cm4gbVRyYWNlVW5pdHM7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxUaW1lTGluZVZpZXcuUmVjb3JkPiBnZXRUaHJlYWRUaW1lUmVjb3JkcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRUaHJlYWRMYWJlbHMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REYXRhW10gZ2V0TWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFRocmVhZERhdGFbXSBnZXRUaHJlYWRzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbmRUaW1lKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvZmlsZVByb3ZpZGVyIGdldFByb2ZpbGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvVHJhY2VVbml0cy5qYXZhIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9jb20vYW5kcm9pZC90cmFjZXZpZXcvVHJhY2VVbml0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDkzOGY1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3RyYWNldmlldy9zcmMvY29tL2FuZHJvaWQvdHJhY2V2aWV3L1RyYWNlVW5pdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRyYWNldmlldzsKLQotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotCi0vLyBUaGlzIHNob3VsZCBiZSBhIHNpbmdsZXRvbi4KLXB1YmxpYyBjbGFzcyBUcmFjZVVuaXRzIHsKLQotICAgIHByaXZhdGUgVGltZVNjYWxlIG1UaW1lU2NhbGUgPSBUaW1lU2NhbGUuTWljcm9TZWNvbmRzOwotICAgIHByaXZhdGUgZG91YmxlIG1TY2FsZSA9IDEuMDsKLSAgICBEZWNpbWFsRm9ybWF0IG1Gb3JtYXR0ZXIgPSBuZXcgRGVjaW1hbEZvcm1hdCgpOwotCi0gICAgcHVibGljIGRvdWJsZSBnZXRTY2FsZWRWYWx1ZShsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSAqIG1TY2FsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFNjYWxlZFZhbHVlKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUgKiBtU2NhbGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZU9mKGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlT2YoKGRvdWJsZSkgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWVPZihkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm47Ci0gICAgICAgIGRvdWJsZSBzY2FsZWQgPSB2YWx1ZSAqIG1TY2FsZTsKLSAgICAgICAgaWYgKChpbnQpIHNjYWxlZCA9PSBzY2FsZWQpCi0gICAgICAgICAgICBwYXR0ZXJuID0gIiMjIywjIyMiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXR0ZXJuID0gIiMjIywjIyMuIyMjIjsKLSAgICAgICAgbUZvcm1hdHRlci5hcHBseVBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdChzY2FsZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWxsZWRTdHJpbmcoZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyB1bml0cyA9IGxhYmVsKCk7Ci0gICAgICAgIFN0cmluZyBudW0gPSB2YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIHVuaXRzLCBudW0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWxsZWRTdHJpbmcobG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbGFiZWxsZWRTdHJpbmcoKGRvdWJsZSkgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0gICAgICAgIGlmIChtU2NhbGUgPT0gMS4wKQotICAgICAgICAgICAgcmV0dXJuICJ1c2VjIjsKLSAgICAgICAgaWYgKG1TY2FsZSA9PSAwLjAwMSkKLSAgICAgICAgICAgIHJldHVybiAibXNlYyI7Ci0gICAgICAgIGlmIChtU2NhbGUgPT0gMC4wMDAwMDEpCi0gICAgICAgICAgICByZXR1cm4gInNlYyI7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVTY2FsZShUaW1lU2NhbGUgdmFsKSB7Ci0gICAgICAgIG1UaW1lU2NhbGUgPSB2YWw7Ci0gICAgICAgIHN3aXRjaCAodmFsKSB7Ci0gICAgICAgIGNhc2UgU2Vjb25kczoKLSAgICAgICAgICAgIG1TY2FsZSA9IDAuMDAwMDAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTWlsbGlTZWNvbmRzOgotICAgICAgICAgICAgbVNjYWxlID0gMC4wMDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNaWNyb1NlY29uZHM6Ci0gICAgICAgICAgICBtU2NhbGUgPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lU2NhbGUgZ2V0VGltZVNjYWxlKCkgewotICAgICAgICByZXR1cm4gbVRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZW51bSBUaW1lU2NhbGUgewotICAgICAgICBTZWNvbmRzLCBNaWxsaVNlY29uZHMsIE1pY3JvU2Vjb25kcwotICAgIH07Ci19CmRpZmYgLS1naXQgYS90b29scy90cmFjZXZpZXcvc3JjL3Jlc291cmNlcy9pY29ucy9zb3J0X2Rvd24ucG5nIGIvdG9vbHMvdHJhY2V2aWV3L3NyYy9yZXNvdXJjZXMvaWNvbnMvc29ydF9kb3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2YTJhMC4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL3Jlc291cmNlcy9pY29ucy9zb3J0X2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvdHJhY2V2aWV3L3NyYy9yZXNvdXJjZXMvaWNvbnMvc29ydF91cC5wbmcgYi90b29scy90cmFjZXZpZXcvc3JjL3Jlc291cmNlcy9pY29ucy9zb3J0X3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3OGE4Ny4uMDAwMDAwMAotLS0gYS90b29scy90cmFjZXZpZXcvc3JjL3Jlc291cmNlcy9pY29ucy9zb3J0X3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL2dlbmVyYXRlIGIvdG9vbHMvem9uZWluZm8vZ2VuZXJhdGUKaW5kZXggMGIwODdhOC4uZGJiNzYxMCAxMDA3NTUKLS0tIGEvdG9vbHMvem9uZWluZm8vZ2VuZXJhdGUKKysrIGIvdG9vbHMvem9uZWluZm8vZ2VuZXJhdGUKQEAgLTEsNiArMSw2IEBACiAjIS9iaW4vc2gKIAotdmVyc2lvbj10emRhdGEyMDA4aAordmVyc2lvbj10emRhdGEyMDA5cwogCiBta2RpciBkYXRhCiAKQEAgLTMyLDQgKzMyLDYgQEAKIAogamF2YSBab25lQ29tcGFjdG9yIHNldHVwIGRhdGEKIAotY3Agem9uZWluZm8uZGF0IHpvbmVpbmZvLmlkeCAuLi8uLi8uLi9kYXRhL3pvbmVpbmZvCitjcCB6b25laW5mby5kYXQgem9uZWluZm8uaWR4IC4uLy4uLy4uL2Jpb25pYy9saWJjL3pvbmVpbmZvCisKK2VjaG8gJHZlcnNpb24gfCBzZWQgJ3MvdHpkYXRhLy8nID4gLi4vLi4vLi4vYmlvbmljL2xpYmMvem9uZWluZm8vem9uZWluZm8udmVyc2lvbgpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYWZyaWNhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYWZyaWNhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE2MmI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2FmcmljYQorKysgL2Rldi9udWxsCkBAIC0xLDg0MCArMCwwIEBACi0jIEAoIylhZnJpY2EJOC4xNwotIyA8cHJlPgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkwLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgQW5vdGhlciBzb3VyY2Ugb2NjYXNpb25hbGx5IHVzZWQgaXMgRWR3YXJkIFcuIFdoaXRtYW4sIFdvcmxkIFRpbWUgRGlmZmVyZW5jZXMsCi0jIFdoaXRtYW4gUHVibGlzaGluZyBDbywgMiBOaWFnYXJhIEF2LCBFYWxpbmcsIExvbmRvbiAodW5kYXRlZCksIHdoaWNoCi0jIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KLSMKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgotIwotIyBQcmV2aW91cyBlZGl0aW9ucyBvZiB0aGlzIGRhdGFiYXNlIHVzZWQgV0FULCBDQVQsIFNBVCwgYW5kIEVBVAotIyBmb3IgKzA6MDAgdGhyb3VnaCArMzowMCwgcmVzcGVjdGl2ZWx5LAotIyBidXQgTWFyayBSIFYgTXVycmF5IHJlcG9ydHMgdGhhdAotIyBgU0FTVCcgaXMgdGhlIG9mZmljaWFsIGFiYnJldmlhdGlvbiBmb3IgKzI6MDAgaW4gdGhlIGNvdW50cnkgb2YgU291dGggQWZyaWNhLAotIyBgQ0FUJyBpcyBjb21tb25seSB1c2VkIGZvciArMjowMCBpbiBjb3VudHJpZXMgbm9ydGggb2YgU291dGggQWZyaWNhLCBhbmQKLSMgYFdBVCcgaXMgcHJvYmFibHkgdGhlIGJlc3QgbmFtZSBmb3IgKzE6MDAsIGFzIHRoZSBjb21tb24gcGhyYXNlIGZvcgotIyB0aGUgYXJlYSB0aGF0IGluY2x1ZGVzIE5pZ2VyaWEgaXMgYGBXZXN0IEFmcmljYScnLgotIyBIZSBoYXMgaGVhcmQgb2YgYGBXZXN0ZXJuIFNhaGFyYSBUaW1lJycgZm9yICswOjAwIGJ1dCBjYW4gZmluZCBubyByZWZlcmVuY2UuCi0jCi0jIFRvIG1ha2UgdGhpbmdzIGNvbmZ1c2luZywgYFdBVCcgc2VlbXMgdG8gaGF2ZSBiZWVuIHVzZWQgZm9yIC0xOjAwIGxvbmcgYWdvOwotIyBJJ2QgZ3Vlc3MgdGhhdCB0aGlzIHdhcyBiZWNhdXNlIHBlb3BsZSBuZWVkZWQgX3NvbWVfIG5hbWUgZm9yIC0xOjAwLAotIyBhbmQgYXQgdGhlIHRpbWUsIGZhciB3ZXN0IEFmcmljYSB3YXMgdGhlIG9ubHkgbWFqb3IgbGFuZCBhcmVhIGluIC0xOjAwLgotIyBUaGlzIHVzYWdlIGlzIG5vdyBvYnNvbGV0ZSwgYXMgdGhlIGxhc3QgdXNlIG9mIC0xOjAwIG9uIHRoZSBBZnJpY2FuCi0jIG1haW5sYW5kIHNlZW1zIHRvIGhhdmUgYmVlbiAxOTc2IGluIFdlc3Rlcm4gU2FoYXJhLgotIwotIyBUbyBzdW1tYXJpemUsIHRoZSBmb2xsb3dpbmcgYWJicmV2aWF0aW9ucyBzZWVtIHRvIGhhdmUgc29tZSBjdXJyZW5jeToKLSMJLTE6MDAJV0FUCVdlc3QgQWZyaWNhIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotIwkgMDowMAlHTVQJR3JlZW53aWNoIE1lYW4gVGltZQotIwkgMjowMAlDQVQJQ2VudHJhbCBBZnJpY2EgVGltZQotIwkgMjowMAlTQVNUCVNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lCi0jIGFuZCBNdXJyYXkgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb246Ci0jCSAxOjAwCVdBVAlXZXN0IEFmcmljYSBUaW1lCi0jIEkgcmVhbGl6ZSB0aGF0IHRoaXMgbGVhZHMgdG8gYFdBVCcgYmVpbmcgdXNlZCBmb3IgYm90aCAtMTowMCBhbmQgMTowMAotIyBmb3IgdGltZXMgYmVmb3JlIDE5NzYsIGJ1dCB0aGlzIGlzIHRoZSBiZXN0IEkgY2FuIHRoaW5rIG9mCi0jIHVudGlsIHdlIGdldCBtb3JlIGluZm9ybWF0aW9uLgotIwotIyBJIGludmVudGVkIHRoZSBmb2xsb3dpbmcgYWJicmV2aWF0aW9uczsgY29ycmVjdGlvbnMgYXJlIHdlbGNvbWUhCi0jCSAyOjAwCVdBU1QJV2VzdCBBZnJpY2EgU3VtbWVyIFRpbWUKLSMJIDI6MzAJQkVBVAlCcml0aXNoIEVhc3QgQWZyaWNhIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotIwkgMjo0NDo0NSBCRUFVVAlCcml0aXNoIEVhc3QgQWZyaWNhIFVuaWZpZWQgVGltZSAobm8gbG9uZ2VyIHVzZWQpCi0jCSAzOjAwCUNBU1QJQ2VudHJhbCBBZnJpY2EgU3VtbWVyIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotIwkgMzowMAlTQVNUCVNvdXRoIEFmcmljYSBTdW1tZXIgVGltZSAobm8gbG9uZ2VyIHVzZWQpCi0jCSAzOjAwCUVBVAlFYXN0IEFmcmljYSBUaW1lCi0jCSA0OjAwCUVBU1QJRWFzdCBBZnJpY2EgU3VtbWVyIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotCi0jIEFsZ2VyaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFsZ2VyaWEJMTkxNglvbmx5CS0JSnVuCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTE2CTE5MTkJLQlPY3QJU3VuPj0xCTIzOjAwcwkwCS0KLVJ1bGUJQWxnZXJpYQkxOTE3CW9ubHkJLQlNYXIJMjQJMjM6MDBzCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5MTgJb25seQktCU1hcgkgOQkyMzowMHMJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTkxOQlvbmx5CS0JTWFyCSAxCTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTIwCW9ubHkJLQlGZWIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5MjAJb25seQktCU9jdAkyMwkyMzowMHMJMAktCi1SdWxlCUFsZ2VyaWEJMTkyMQlvbmx5CS0JTWFyCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTIxCW9ubHkJLQlKdW4JMjEJMjM6MDBzCTAJLQotUnVsZQlBbGdlcmlhCTE5MzkJb25seQktCVNlcAkxMQkyMzowMHMJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTkzOQlvbmx5CS0JTm92CTE5CSAxOjAwCTAJLQotUnVsZQlBbGdlcmlhCTE5NDQJMTk0NQktCUFwcglNb24+PTEJIDI6MDAJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTk0NAlvbmx5CS0JT2N0CSA4CSAyOjAwCTAJLQotUnVsZQlBbGdlcmlhCTE5NDUJb25seQktCVNlcAkxNgkgMTowMAkwCS0KLVJ1bGUJQWxnZXJpYQkxOTcxCW9ubHkJLQlBcHIJMjUJMjM6MDBzCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5NzEJb25seQktCVNlcAkyNgkyMzowMHMJMAktCi1SdWxlCUFsZ2VyaWEJMTk3Nwlvbmx5CS0JTWF5CSA2CSAwOjAwCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5NzcJb25seQktCU9jdAkyMQkgMDowMAkwCS0KLVJ1bGUJQWxnZXJpYQkxOTc4CW9ubHkJLQlNYXIJMjQJIDE6MDAJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTk3OAlvbmx5CS0JU2VwCTIyCSAzOjAwCTAJLQotUnVsZQlBbGdlcmlhCTE5ODAJb25seQktCUFwcgkyNQkgMDowMAkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTgwCW9ubHkJLQlPY3QJMzEJIDI6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCi0jIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQWxnaWVycwkwOjEyOjEyIC0JTE1UCTE4OTEgTWFyIDE1IDA6MDEKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKLQkJCTA6MDAJQWxnZXJpYQlXRSVzVAkxOTQwIEZlYiAyNSAyOjAwCi0JCQkxOjAwCUFsZ2VyaWEJQ0Ulc1QJMTk0NiBPY3QgIDcKLQkJCTA6MDAJLQlXRVQJMTk1NiBKYW4gMjkKLQkJCTE6MDAJLQlDRVQJMTk2MyBBcHIgMTQKLQkJCTA6MDAJQWxnZXJpYQlXRSVzVAkxOTc3IE9jdCAyMQotCQkJMTowMAlBbGdlcmlhCUNFJXNUCTE5NzkgT2N0IDI2Ci0JCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk4MSBNYXkKLQkJCTE6MDAJLQlDRVQKLQotIyBBbmdvbGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0x1YW5kYQkwOjUyOjU2CS0JTE1UCTE4OTIKLQkJCTA6NTI6MDQJLQlBT1QJMTkxMSBNYXkgMjYgIyBBbmdvbGEgVGltZQotCQkJMTowMAktCVdBVAotCi0jIEJlbmluCi0jIFdoaXRtYW4gc2F5cyB0aGV5IHN3aXRjaGVkIHRvIDE6MDAgaW4gMTk0Niwgbm90IDE5MzQ7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvUG9ydG8tTm92bwkwOjEwOjI4CS0JTE1UCTE5MTIKLQkJCTA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCTE6MDAJLQlXQVQKLQotIyBCb3Rzd2FuYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvR2Fib3JvbmUJMTo0Mzo0MCAtCUxNVAkxODg1Ci0JCQkyOjAwCS0JQ0FUCTE5NDMgU2VwIDE5IDI6MDAKLQkJCTI6MDAJMTowMAlDQVNUCTE5NDQgTWFyIDE5IDI6MDAKLQkJCTI6MDAJLQlDQVQKLQotIyBCdXJraW5hIEZhc28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL091YWdhZG91Z291CS0wOjA2OjA0IC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCi0KLSMgQnVydW5kaQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvQnVqdW1idXJhCTE6NTc6MjgJLQlMTVQJMTg5MAotCQkJMjowMAktCUNBVAotCi0jIENhbWVyb29uCi0jIFdoaXRtYW4gc2F5cyB0aGV5IHN3aXRjaGVkIHRvIDE6MDAgaW4gMTkyMDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Eb3VhbGEJMDozODo0OAktCUxNVAkxOTEyCi0JCQkxOjAwCS0JV0FUCi0KLSMgQ2FwZSBWZXJkZQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBdGxhbnRpYy9DYXBlX1ZlcmRlIC0xOjM0OjA0IC0JTE1UCTE5MDcJCQkjIFByYWlhCi0JCQktMjowMAktCUNWVAkxOTQyIFNlcAotCQkJLTI6MDAJMTowMAlDVlNUCTE5NDUgT2N0IDE1Ci0JCQktMjowMAktCUNWVAkxOTc1IE5vdiAyNSAyOjAwCi0JCQktMTowMAktCUNWVAotCi0jIENlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmFuZ3VpCTE6MTQ6MjAJLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAotCi0jIENoYWQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL05kamFtZW5hCTE6MDA6MTIgLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAkxOTc5IE9jdCAxNAotCQkJMTowMAkxOjAwCVdBU1QJMTk4MCBNYXIgIDgKLQkJCTE6MDAJLQlXQVQKLQotIyBDb21vcm9zCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9Db21vcm8JMjo1MzowNCAtCUxNVAkxOTExIEp1bCAgICMgTW9yb25pLCBHcmFuIENvbW9ybwotCQkJMzowMAktCUVBVAotCi0jIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YgQ29uZ28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0tpbnNoYXNhCTE6MDE6MTIgLQlMTVQJMTg5NyBOb3YgOQotCQkJMTowMAktCVdBVAotWm9uZSBBZnJpY2EvTHVidW1iYXNoaQkxOjQ5OjUyIC0JTE1UCTE4OTcgTm92IDkKLQkJCTI6MDAJLQlDQVQKLQotIyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0JyYXp6YXZpbGxlCTE6MDE6MDggLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAotCi0jIENvdGUgRCdJdm9pcmUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0FiaWRqYW4JLTA6MTY6MDggLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQKLQotIyBEamlib3V0aQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvRGppYm91dGkJMjo1MjozNiAtCUxNVAkxOTExIEp1bAotCQkJMzowMAktCUVBVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRWd5cHQKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRWd5cHQJMTk0MAlvbmx5CS0JSnVsCTE1CTA6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5NDAJb25seQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTQxCW9ubHkJLQlBcHIJMTUJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk0MQlvbmx5CS0JU2VwCTE2CTA6MDAJMAktCi1SdWxlCUVneXB0CTE5NDIJMTk0NAktCUFwcgkgMQkwOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTQyCW9ubHkJLQlPY3QJMjcJMDowMAkwCS0KLVJ1bGUJRWd5cHQJMTk0MwkxOTQ1CS0JTm92CSAxCTA6MDAJMAktCi1SdWxlCUVneXB0CTE5NDUJb25seQktCUFwcgkxNgkwOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTU3CW9ubHkJLQlNYXkJMTAJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk1NwkxOTU4CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCUVneXB0CTE5NTgJb25seQktCU1heQkgMQkwOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTU5CTE5ODEJLQlNYXkJIDEJMTowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk1OQkxOTY1CS0JU2VwCTMwCTM6MDAJMAktCi1SdWxlCUVneXB0CTE5NjYJMTk5NAktCU9jdAkgMQkzOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTgyCW9ubHkJLQlKdWwJMjUJMTowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk4Mwlvbmx5CS0JSnVsCTEyCTE6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5ODQJMTk4OAktCU1heQkgMQkxOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTg5CW9ubHkJLQlNYXkJIDYJMTowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk5MAkxOTk0CS0JTWF5CSAxCTE6MDAJMTowMAlTCi0jIElBVEEgKGFmdGVyIDE5OTApIHNheXMgdHJhbnNpdGlvbnMgYXJlIGF0IDA6MDAuCi0jIEdvIHdpdGggSUFUQSBzdGFydGluZyBpbiAxOTk1LCBleGNlcHQgY29ycmVjdCAxOTk1IGVudHJ5IGZyb20gMDktMzAgdG8gMDktMjkuCi1SdWxlCUVneXB0CTE5OTUJbWF4CS0JQXByCWxhc3RGcmkJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTk1CTIwMDUJLQlTZXAJbGFzdFRodQkyMzowMHMJMAktCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA5LTE5KToKLSMgVGhlIEVneXB0aWFuIEdhemV0dGUsIGlzc3VlIDQxLDA5MCAoMjAwNi0wOS0xOCksIHBhZ2UgMSwgcmVwb3J0czoKLSMgRWd5cHQgd2lsbCB0dXJuIGJhY2sgY2xvY2tzIGJ5IG9uZSBob3VyIGF0IHRoZSBtaWRuaWdodCBvZiBUaHVyc2RheQotIyBhZnRlciBvYnNlcnZpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHNpbmNlIE1heS4KLSMgaHR0cDovL25ld3MuZ29tLmNvbS5lZy9nYXpldHRlL3BkZi8yMDA2LzA5LzE4LzAxLnBkZgotUnVsZQlFZ3lwdAkyMDA2CW9ubHkJLQlTZXAJMjEJMjM6MDBzCTAJLQotIyBGcm9tIERpcmsgTG9zY2ggKDIwMDctMDgtMTQpOgotIyBJIHJlY2VpdmVkIGEgbWFpbCBmcm9tIGFuIGFpcmxpbmUgd2hpY2ggc2F5cyB0aGF0IHRoZSBkYXlsaWdodAotIyBzYXZpbmcgdGltZSBpbiBFZ3lwdCB3aWxsIGVuZCBpbiB0aGUgbmlnaHQgb2YgMjAwNy0wOS0wNiB0byAyMDA3LTA5LTA3LgotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNy0wOC0xNSk6IFtUaGUgZm9sbG93aW5nIGFncmVlOl0KLSMgaHR0cDovL3d3dy5uZW50amVzLmluZm8vQmlsbC9iaWxsNS5odG0gCi0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249NTMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDktMDQpOiBUaGUgb2ZmaWNpYWwgaW5mb3JtYXRpb24uLi46Ci0jIGh0dHA6Ly93d3cuc2lzLmdvdi5lZy9Fbi9FZ3lwdE9ubGluZS9NaXNjZWxsYW5lb3VzLzAwMDAwMi8wMjA3MDAwMDAwMDAwMDAwMDAxNTgwLmh0bQotUnVsZQlFZ3lwdAkyMDA3CW9ubHkJLQlTZXAJVGh1Pj0xCTIzOjAwcwkwCS0KLSMgRnJvbSBBYmRlbHJhaG1hbiBIYXNzYW4gKDIwMDctMDktMDYpOgotIyBEdWUgdG8gdGhlIEhpanJpIChsdW5hciBJc2xhbWljIGNhbGVuZGFyKSB5ZWFyIGJlaW5nIDExIGRheXMgc2hvcnRlcgotIyB0aGFuIHRoZSB5ZWFyIG9mIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsIFJhbWFkYW4gc2hpZnRzIGVhcmxpZXIgZWFjaAotIyB5ZWFyLiBUaGlzIHllYXIgaXQgd2lsbCBiZSBvYnNlcnZlZCBTZXB0ZW1iZXIgMTMgKFNlcHRlbWJlciBpcyBxdWl0ZQotIyBob3QgaW4gRWd5cHQpLCBhbmQgdGhlIGlkZWEgaXMgdG8gbWFrZSBmYXN0aW5nIGVhc2llciBmb3Igd29ya2VycyBieQotIyBzaGlmdGluZyBidXNpbmVzcyBob3VycyBvbmUgaG91ciBvdXQgb2YgZGF5dGltZSBoZWF0LiBDb25zZXF1ZW50bHksCi0jIHVubGVzcyBkaXNjb250aW51ZWQsIG5leHQgRFNUIG1heSBlbmQgVGh1cnNkYXkgMjggQXVndXN0IDIwMDguCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDgtMTcpOgotIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZSBuZXcgcnVsZSBpcyBsYXN0IFRodXJzZGF5IGluIEF1Z3VzdC4KLVJ1bGUJRWd5cHQJMjAwOAltYXgJLQlBdWcJbGFzdFRodQkyMzowMHMJMAktCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0NhaXJvCTI6MDU6MDAgLQlMTVQJMTkwMCBPY3QKLQkJCTI6MDAJRWd5cHQJRUUlc1QKLQotIyBFcXVhdG9yaWFsIEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTWFsYWJvCTA6MzU6MDggLQlMTVQJMTkxMgotCQkJMDowMAktCUdNVAkxOTYzIERlYyAxNQotCQkJMTowMAktCVdBVAotCi0jIEVyaXRyZWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0FzbWFyYQkyOjM1OjMyIC0JTE1UCTE4NzAKLQkJCTI6MzU6MzIJLQlBTVQJMTg5MAkgICAgICAjIEFzbWFyYSBNZWFuIFRpbWUKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKLQkJCTM6MDAJLQlFQVQKLQotIyBFdGhpb3BpYQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRXRoaW9waWEgaGFkIHNpeCBuYXJyb3dseS1zcGFjZWQgdGltZSB6b25lcwotIyBiZXR3ZWVuIDE4NzAgYW5kIDE4OTAsIGFuZCB0aGF0IHRoZXkgbWVyZ2VkIHRvIDM4RTUwICgyOjM1OjIwKSBpbiAxODkwLgotIyBXZSdsbCBndWVzcyB0aGF0IDM4RTUwIGlzIGZvciBBZGlzIERlcmEuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9BZGRpc19BYmFiYQkyOjM0OjQ4IC0JTE1UCTE4NzAKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKLQkJCTM6MDAJLQlFQVQKLQotIyBHYWJvbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvTGlicmV2aWxsZQkwOjM3OjQ4IC0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKLQotIyBHYW1iaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0Jhbmp1bAktMTowNjozNiAtCUxNVAkxOTEyCi0JCQktMTowNjozNiAtCUJNVAkxOTM1CSMgQmFuanVsIE1lYW4gVGltZQotCQkJLTE6MDAJLQlXQVQJMTk2NAotCQkJIDA6MDAJLQlHTVQKLQotIyBHaGFuYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBzYXlzIERTVCB3YXMgb2JzZXJ2ZWQgZnJvbSAxOTMxIHRvIGBgdGhlIHByZXNlbnQnJzsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdoYW5hCTE5MzYJMTk0MgktCVNlcAkgMQkwOjAwCTA6MjAJR0hTVAotUnVsZQlHaGFuYQkxOTM2CTE5NDIJLQlEZWMJMzEJMDowMAkwCUdNVAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQWNjcmEJLTA6MDA6NTIgLQlMTVQJMTkxOAotCQkJIDA6MDAJR2hhbmEJJXMKLQotIyBHdWluZWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0NvbmFrcnkJLTA6NTQ6NTIgLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAKLQkJCSAwOjAwCS0JR01UCi0KLSMgR3VpbmVhLUJpc3NhdQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmlzc2F1CS0xOjAyOjIwIC0JTE1UCTE5MTEgTWF5IDI2Ci0JCQktMTowMAktCVdBVAkxOTc1Ci0JCQkgMDowMAktCUdNVAotCi0jIEtlbnlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9OYWlyb2JpCTI6Mjc6MTYJLQlMTVQJMTkyOCBKdWwKLQkJCTM6MDAJLQlFQVQJMTkzMAotCQkJMjozMAktCUJFQVQJMTk0MAotCQkJMjo0NDo0NQktCUJFQVVUCTE5NjAKLQkJCTM6MDAJLQlFQVQKLQotIyBMZXNvdGhvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9NYXNlcnUJMTo1MDowMCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCVNBU1QJMTk0MyBTZXAgMTkgMjowMAotCQkJMjowMAkxOjAwCVNBU1QJMTk0NCBNYXIgMTkgMjowMAotCQkJMjowMAktCVNBU1QKLQotIyBMaWJlcmlhCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBJbiAxOTcyIExpYmVyaWEgd2FzIHRoZSBsYXN0IGNvdW50cnkgdG8gc3dpdGNoCi0jIGZyb20gYSBVVEMgb2Zmc2V0IHRoYXQgd2FzIG5vdCBhIG11bHRpcGxlIG9mIDE1IG9yIDIwIG1pbnV0ZXMuCi0jIEhvd3NlIHJlcG9ydHMgdGhhdCBpdCB3YXMgaW4gaG9ub3Igb2YgdGhlaXIgcHJlc2lkZW50J3MgYmlydGhkYXkuCi0jIFNoYW5rICYgUG90dGVuZ2VyIHJlcG9ydCB0aGUgZGF0ZSBhcyBNYXkgMSwgd2hlcmVhcyBIb3dzZSByZXBvcnRzIEphbjsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIEZvciBMaWJlcmlhIGJlZm9yZSAxOTcyLCBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IC0wOjQ0LCB3aGVyZWFzIEhvd3NlIGFuZAotIyBXaGl0bWFuIGVhY2ggcmVwb3J0IC0wOjQ0OjMwOyBnbyB3aXRoIHRoZSBtb3JlIHByZWNpc2UgZmlndXJlLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTW9ucm92aWEJLTA6NDM6MDggLQlMTVQJMTg4MgotCQkJLTA6NDM6MDggLQlNTVQJMTkxOSBNYXIgIyBNb25yb3ZpYSBNZWFuIFRpbWUKLQkJCS0wOjQ0OjMwIC0JTFJUCTE5NzIgTWF5ICMgTGliZXJpYSBUaW1lCi0JCQkgMDowMAktCUdNVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTGlieWEKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTGlieWEJMTk1MQlvbmx5CS0JT2N0CTE0CTI6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5NTIJb25seQktCUphbgkgMQkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTUzCW9ubHkJLQlPY3QJIDkJMjowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk1NAlvbmx5CS0JSmFuCSAxCTA6MDAJMAktCi1SdWxlCUxpYnlhCTE5NTUJb25seQktCVNlcAkzMAkwOjAwCTE6MDAJUwotUnVsZQlMaWJ5YQkxOTU2CW9ubHkJLQlKYW4JIDEJMDowMAkwCS0KLVJ1bGUJTGlieWEJMTk4MgkxOTg0CS0JQXByCSAxCTA6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5ODIJMTk4NQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTg1CW9ubHkJLQlBcHIJIDYJMDowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk4Nglvbmx5CS0JQXByCSA0CTA6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5ODYJb25seQktCU9jdAkgMwkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTg3CTE5ODkJLQlBcHIJIDEJMDowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk4NwkxOTg5CS0JT2N0CSAxCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Ucmlwb2xpCTA6NTI6NDQgLQlMTVQJMTkyMAotCQkJMTowMAlMaWJ5YQlDRSVzVAkxOTU5Ci0JCQkyOjAwCS0JRUVUCTE5ODIKLQkJCTE6MDAJTGlieWEJQ0Ulc1QJMTk5MCBNYXkgIDQKLSMgVGhlIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjsKLSMgdGhlIElBVEEgU1NJTSBkYXRhIGNvbnRhaW4gc29tZSBvYnZpb3VzIGVycm9ycy4KLQkJCTI6MDAJLQlFRVQJMTk5NiBTZXAgMzAKLQkJCTE6MDAJLQlDRVQJMTk5NyBBcHIgIDQKLQkJCTE6MDAJMTowMAlDRVNUCTE5OTcgT2N0ICA0Ci0JCQkyOjAwCS0JRUVUCi0KLSMgTWFkYWdhc2NhcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBJbmRpYW4vQW50YW5hbmFyaXZvIDM6MTA6MDQgLQlMTVQJMTkxMSBKdWwKLQkJCTM6MDAJLQlFQVQJMTk1NCBGZWIgMjcgMjM6MDBzCi0JCQkzOjAwCTE6MDAJRUFTVAkxOTU0IE1heSAyOSAyMzowMHMKLQkJCTM6MDAJLQlFQVQKLQotIyBNYWxhd2kKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0JsYW50eXJlCTI6MjA6MDAgLQlMTVQJMTkwMyBNYXIKLQkJCTI6MDAJLQlDQVQKLQotIyBNYWxpCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9CYW1ha28JLTA6MzI6MDAgLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAgSnVuIDIwCi0JCQkgMDowMAktCUdNVAotCi0jIE1hdXJpdGFuaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL05vdWFrY2hvdHQJLTE6MDM6NDggLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAgTm92IDI4Ci0JCQkgMDowMAktCUdNVAotCi0jIE1hdXJpdGl1cwotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA2LTI1KToKLSMgTWF1cml0aXVzIHBsYW5zIHRvIG9ic2VydmUgRFNUIGZyb20gMjAwOC0xMS0wMSB0byAyMDA5LTAzLTMxIG9uIGEgdHJpYWwKLSMgYmFzaXMuLi4uCi0jIEl0IHNlZW1zIHRoYXQgTWF1cml0aXVzIG9ic2VydmVkIGRheWxpZ2h0IHNhdmluZyB0aW1lIGZyb20gMTk4Mi0xMC0xMCB0byAKLSMgMTk4My0wMy0yMCBhcyB3ZWxsLCBidXQgdGhhdCB3YXMgbm90IHN1Y2Nlc3NmdWwuLi4uCi0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tYXVyaXRpdXMtZGF5bGlnaHQtc2F2aW5nLXRpbWUuaHRtbAotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNi0yNSk6Ci0jIGh0dHA6Ly9lY29ub21pY2RldmVsb3BtZW50Lmdvdi5tdS9wb3J0YWwvc2l0ZS9NYWluaG9tZXBhZ2UvbWVudWl0ZW0uYTQyYjI0MTI4MTA0ZDk4NDVkYWJkZGQxNTQ1MDhhMGMvP2NvbnRlbnRfaWQ9MGE3Y2VlOGI1ZDY5YTExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA2LTMwKToKLSMgVGhlIHd3dy50aW1lYW5kZGF0ZS5jb20gYXJ0aWNsZSBjaXRlZCBieSBTdGVmZmVuIFRob3JzZW4gbm90ZXMgdGhhdCAiQQotIyBmaW5hbCBkZWNpc2lvbiBoYXMgeWV0IHRvIGJlIG1hZGUgb24gdGhlIHRpbWVzIHRoYXQgZGF5bGlnaHQgc2F2aW5nCi0jIHdvdWxkIGJlZ2luIGFuZCBlbmQgb24gdGhlc2UgZGF0ZXMuIiBBcyBhIHBsYWNlIGhvbGRlciwgdXNlIG1pZG5pZ2h0LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDYtMzApOgotIyBGb2xsb3cgVGhvcnNlbiBvbiBEU1QgaW4gMTk4Mi8xOTgzLCBpbnN0ZWFkIG9mIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wNy0xMCk6Ci0jIEFjY29yZGluZyB0bwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYiPgotIyBodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYKLSMgPC9hPgotIyAoaW4gRnJlbmNoKSwgTWF1cml0aXVzIHdpbGwgc3RhcnQgYW5kIGVuZCB0aGVpciBEU1QgYSBmZXcgZGF5cyBlYXJsaWVyCi0jIHRoYW4gcHJldmlvdXNseSBhbm5vdW5jZWQgKDIwMDgtMTEtMDEgdG8gMjAwOS0wMy0zMSkuICBUaGUgbmV3IHN0YXJ0Ci0jIGRhdGUgaXMgMjAwOC0xMC0yNiBhdCAwMjowMCBhbmQgdGhlIG5ldyBlbmQgZGF0ZSBpcyAyMDA5LTAzLTI3IChubyB0aW1lCi0jIGdpdmVuLCBidXQgaXQgaXMgcHJvYmFibHkgYXQgZWl0aGVyIDIgb3IgMyB3YWxsIGNsb2NrIHRpbWUpLgotIyAKLSMgQSBsaXR0bGUgc3RyYW5nZSB0aG91Z2gsIHNpbmNlIHRoZSBhcnRpY2xlIHNheXMgdGhhdCB0aGV5IG1vdmVkIHRoZSBkYXRlIAotIyB0byBhbGlnbiBpdHNlbGYgd2l0aCBFdXJvcGUgYW5kIFVTQSB3aGljaCBhbHNvIGNoYW5nZSB0aW1lIG9uIHRoYXQgZGF0ZSwgCi0jIGJ1dCB0aGF0IG1lYW5zIHRoZXkgaGF2ZSBub3QgcGFpZCBhdHRlbnRpb24gdG8gd2hhdCBoYXBwZW5lZCBpbiAKLSMgVVNBL0NhbmFkYSBsYXN0IHllYXIgKERTVCBlbmRzIGZpcnN0IFN1bmRheSBpbiBOb3ZlbWJlcikuIEkgYWxzbyB3b25kZXIgCi0jIHdoeSB0aGF0IHRoZXkgZW5kIG9uIGEgRnJpZGF5LCBpbnN0ZWFkIG9mIGFsaWduaW5nIHdpdGggRXVyb3BlIHdoaWNoIAotIyBjaGFuZ2VzIHR3byBkYXlzIGxhdGVyLgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNy0xMSk6Ci0jIFNlZW1zIHRoYXQgRW5nbGlzaCBsYW5ndWFnZSBhcnRpY2xlICJUaGUgcmV2aXZhbCBvZiBkYXlsaWdodCBzYXZpbmcKLSMgdGltZTogIEVuZXJneSBjb25zZXJ2YXRpb24/Ii0jIE5vLiAxNjU3OCAoMDcvMTEvMjAwOCkgd2FzIG9yaWdpbmFsbHkKLSMgcHVibGlzaGVkIG9uIE1vbmRheSwgSnVuZSAzMCwgMjAwOC4uLgotIwotIyBJIGd1ZXNzIHRoYXQgYXJ0aWNsZSBpbiBGcmVuY2ggIkxlIGdvdXZlcm5lbWVudCBhdmFuY2UgbCdpbnRyb2R1Y3Rpb24KLSMgZGUgbCdoZXVyZSBkJ2V0ZSIgc3RhdGluZyB0aGF0IERTVCBpbiBNYXVyaXRpdXMgc3RhcnRpbmcgb24gT2N0b2JlciAyNgotIyBhbmQgZW5kaW5nIG9uIE1hcmNoIDI3LCAyMDA5IGlzIHRoZSBtb3N0IHJlY2VudCBvbmUuCi0jIC4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwKLSMgPC9hPgotCi0jIEZyb20gUmlhZCBNLiBIb3NzZW4gQWxseSAoMjAwOC0wOC0wMyk6Ci0jIFRoZSBHb3Zlcm5tZW50IG9mIE1hdXJpdGl1cyB3ZWJsaW5rCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9M0Q0NzI4Y2E2OGIyYTViMTEwVmduVkNNMTAwMDAwMGEwNGE4YzBSQ1JEIj4KLSMgaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL3NpdGUvcG1vc2l0ZS9tZW51aXRlbS40Y2EwZWZkZWU0NzQ2MmU3NDQwYTYwMDI0OGE1MjFjYS8/Y29udGVudF9pZD0zRDQ3MjhjYTY4YjJhNWIxMTBWZ25WQ00xMDAwMDAwYTA0YThjMFJDUkQKLSMgPC9hPgotIyBDYWJpbmV0IERlY2lzaW9uIG9mIEp1bHkgMTh0aCwgMjAwOCBzdGF0ZXMgYXMgZm9sbG93czoKLSMKLSMgNC4gLi4uQ2FiaW5ldCBoYXMgYWdyZWVkIHRvIHRoZSBpbnRyb2R1Y3Rpb24gaW50byB0aGUgTmF0aW9uYWwgQXNzZW1ibHkKLSMgb2YgdGhlIFRpbWUgQmlsbCB3aGljaCBwcm92aWRlcyBmb3IgdGhlIGludHJvZHVjdGlvbiBvZiBzdW1tZXIgdGltZSBpbgotIyBNYXVyaXRpdXMuIFRoZSBzdW1tZXIgdGltZSBwZXJpb2Qgd2hpY2ggd2lsbCBiZSBvZiBvbmUgaG91ciBhaGVhZCBvZgotIyB0aGUgc3RhbmRhcmQgdGltZSwgd2lsbCBiZSBhbGlnbmVkIHdpdGggdGhhdCBpbiBFdXJvcGUgYW5kIHRoZSBVbml0ZWQKLSMgU3RhdGVzIG9mIEFtZXJpY2EuIEl0IHdpbGwgc3RhcnQgYXQgdHdvIG8nY2xvY2sgaW4gdGhlIG1vcm5pbmcgb24gdGhlCi0jIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIgYW5kIHdpbGwgZW5kIGF0IHR3byBvJ2Nsb2NrIGluIHRoZSBtb3JuaW5nIG9uCi0jIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCB0aGUgZm9sbG93aW5nIHllYXIuIFRoZSBzdW1tZXIgdGltZSBmb3IgdGhlCi0jIHllYXIgMjAwOCAtIDIwMDkgd2lsbCwgdGhlcmVmb3JlLCBiZSBlZmZlY3RpdmUgYXMgZnJvbSAyNiBPY3RvYmVyIDIwMDgKLSMgYW5kIGVuZCBvbiAyOSBNYXJjaCAyMDA5LgotCi0jIEZyb20gRWQgTWFzdGUgKDIwMDgtMTAtMDcpOgotIyBUSEUgVElNRSBCSUxMIChOby4gWFhWSUkgb2YgMjAwOCkgRXhwbGFuYXRvcnkgTWVtb3JhbmR1bSBzdGF0ZXMgdGhlCi0jIGJlZ2lubmluZyAvIGVuZGluZyBvZiBzdW1tZXIgdGltZSBpcyAyIG8nY2xvY2sgc3RhbmRhcmQgdGltZSBpbiB0aGUKLSMgbW9ybmluZyBvZiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciAvIGxhc3QgU3VuZGF5IG9mIE1hcmNoLgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5tdS9wb3J0YWwvZ29jL2Fzc2VtYmx5c2l0ZS9maWxlL2JpbGwyNzA4LnBkZiI+Ci0jIGh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9nb2MvYXNzZW1ibHlzaXRlL2ZpbGUvYmlsbDI3MDgucGRmCi0jIDwvYT4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUgTWF1cml0aXVzCTE5ODIJb25seQktCU9jdAkxMAkwOjAwCTE6MDAJUwotUnVsZSBNYXVyaXRpdXMJMTk4Mwlvbmx5CS0JTWFyCTIxCTA6MDAJMAktCi1SdWxlIE1hdXJpdGl1cwkyMDA4CW1heAktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJUwotUnVsZSBNYXVyaXRpdXMJMjAwOQltYXgJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgSW5kaWFuL01hdXJpdGl1cwkzOjUwOjAwIC0JTE1UCTE5MDcJCSMgUG9ydCBMb3VpcwotCQkJNDowMCBNYXVyaXRpdXMJTVUlc1QJIyBNYXVyaXRpdXMgVGltZQotIyBBZ2FsZWdhIElzLCBSb2RyaWd1ZXoKLSMgbm8gaW5mb3JtYXRpb247IHByb2JhYmx5IGxpa2UgSW5kaWFuL01hdXJpdGl1cwotCi0jIE1heW90dGUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJSW5kaWFuL01heW90dGUJMzowMDo1NiAtCUxNVAkxOTExIEp1bAkjIE1hbW91dHpvdQotCQkJMzowMAktCUVBVAotCi0jIE1vcm9jY28KLSMgU2VlIHRoZSBgZXVyb3BlJyBmaWxlIGZvciBTcGFuaXNoIE1vcm9jY28gKEFmcmljYS9DZXV0YSkuCi0KLSMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTA5KToKLSMgSGVyZSBpcyBhbiBhcnRpY2xlIHRoYXQgTW9yb2NjbyBwbGFuIHRvIGludHJvZHVjZSBEYXlsaWdodCBTYXZpbmcgVGltZSBiZXR3ZWVuCi0jIDEgSnVuZSwgMjAwOCBhbmQgMjcgU2VwdGVtYmVyLCAyMDA4LgotIwotIyAiLi4uIE1vcm9jY28gaXMgdG8gc2F2ZSBlbmVyZ3kgYnkgYWRqdXN0aW5nIGl0cyBjbG9jayBkdXJpbmcgc3VtbWVyIHNvIGl0IHdpbGwKLSMgYmUgb25lIGhvdXIgYWhlYWQgb2YgR01UIGJldHdlZW4gMSBKdW5lIGFuZCAyNyBTZXB0ZW1iZXIsIGFjY29yZGluZyB0bwotIyBDb21tdW5pY2F0aW9uIE1pbmlzdGVyIGFuZCBHb3YgZXJubWVudCBTcG9rZXNtYW4sIEtoYWxpZCBOYWNpcmkuLi4uIgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUubmV0L2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wMS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDEuaHRtbAotIyA8L2E+Ci0jIE9SCi0jIDxhIGhyZWY9Imh0dHA6Ly9lbi5hZnJpay5jb20vbmV3czExODkyLmh0bWwiPgotIyBodHRwOi8vZW4uYWZyaWsuY29tL25ld3MxMTg5Mi5odG1sCi0jIDwvYT4KLQotIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDUtMDkpOgotIyBUaGUgTW9yb2NjbyB0aW1lIGNoYW5nZSBjYW4gYmUgY29uZmlybWVkIG9uIE1vcm9jY28gd2ViIHNpdGUgTWFnaHJlYiBBcmFiZSBQcmVzc2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFwLm1hL2VuZy9zZWN0aW9ucy9ib3gzL21vcm9jY29fc2hpZnRzX3RvX2RhL3ZpZXciPgotIyBodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvYm94My9tb3JvY2NvX3NoaWZ0c190b19kYS92aWV3Ci0jIDwvYT4KLSMKLSMgTW9yb2NjbyBzaGlmdHMgdG8gZGF5bGlnaHQgdGltZSBvbiBKdW5lIDFzdCB0aHJvdWdoIFNlcHRlbWJlciAyNywgR292dC4KLSMgc3Bva2VzbWFuLgotCi0jIEZyb20gUGF0cmljZSBTY2F0dG9saW4gKDIwMDgtMDUtMDkpOgotIyBBY2NvcmRpbmcgdG8gdGhpcyBhcnRpY2xlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF2bWFyb2MuY29tL2FjdHVhbGl0ZS9oZXVyZS1kZXRlLWNvbW1lbnQtYTEyNzg5Ni5odG1sIj4KLSMgaHR0cDovL3d3dy5hdm1hcm9jLmNvbS9hY3R1YWxpdGUvaGV1cmUtZGV0ZS1jb21tZW50LWExMjc4OTYuaHRtbAotIyA8L2E+Ci0jIChhbmQgcmVwdWJsaXNoZWQgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hY3R1Lm1hL2hldXJlLWRldGUtY29tbWVudF9pMTI3ODk2XzAuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuYWN0dS5tYS9oZXVyZS1kZXRlLWNvbW1lbnRfaTEyNzg5Nl8wLmh0bWwKLSMgPC9hPgotIyApCi0jIHRoZSBjaGFuZ2VzIG9jY3VycyBhdCBtaWRuaWdodDoKLSMKLSMgc2F0dXJkYXkgbmlnaHQgbWF5IDMxc3QgYXQgbWlkbmlnaHQgKHdoaWNoIGluIGZyZW5jaCBpcyB0byBiZQotIyBpbnRyZXByZXRlZCBhcyB0aGUgbmlnaHQgYmV0d2VlbiBzYXR1cmRheSBhbmQgc3VuZGF5KQotIyBzdW5kYXkgbmlnaHQgdGhlIDI4dGggIGF0IG1pZG5pZ2h0Ci0jCi0jIFNlZWluZyB0aGF0IHRoZSAyOHRoIGlzIG1vbmRheSwgSSBhbSBndWVzc2luZyB0aGF0IHNoZSBpbnRlbmRzIHRvIHNheQotIyB0aGUgbWlkbmlnaHQgb2YgdGhlIDI4dGggd2hpY2ggaXMgdGhlIG1pZG5pZ2h0IGJldHdlZW4gc3VuZGF5IGFuZAotIyBtb25kYXksIHdoaWNoIGppdmVzIHdpdGggb3RoZXIgc291cmNlcyB0aGF0IHNheSB0aGF0IGl0J3MgaW5jbHVzaXZlCi0jIGp1bmUxc3QgdG8gc2VwdCAyN3RoLgotIwotIyBUaGUgZGVjaXNpb24gd2FzIHRha2VuIGJ5IGRlY3JlZSAqMi0wOC0yMjQgKmJ1dCBJIGNhbid0IGZpbmQgdGhlIGRlY3JlZQotIyBwdWJsaXNoZWQgb24gdGhlIHdlYi4KLSMKLSMgSXQncyBhbHNvIGNvbmZpcm1lZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcm9jLm1hL05SL2V4ZXJlcy9GQUNGMTQxRi1EOTEwLTQ0QjAtQjdGQS02RTAzNzMzNDI1RDEuaHRtIj4KLSMgaHR0cDovL3d3dy5tYXJvYy5tYS9OUi9leGVyZXMvRkFDRjE0MUYtRDkxMC00NEIwLUI3RkEtNkUwMzczMzQyNUQxLmh0bQotIyA8L2E+Ci0jIG9uIGEgZ292ZXJubWVudCBwb3J0YWwgYXMgYmVpbmcgIGJldHdlZW4ganVuZSAxc3QgYW5kIHNlcHQgMjd0aCAobm90IHlldAotIyBwb3N0ZWQgaW4gZW5nbGlzaCkuCi0jCi0jIFRoZSBmb2xsb3dpbmcgZ29vZ2xlIHF1ZXJ5IHdpbGwgZ2VuZXJhdGUgbWFueSByZWxldmFudCBoaXRzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP2hsPWVuJnE9Q29uc2VpbCtkZStnb3V2ZXJuZW1lbnQrbWFyb2MraGV1cmUrYXZhbmNlJmJ0bkc9U2VhcmNoIj4KLSMgaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9obD1lbiZxPUNvbnNlaWwrZGUrZ291dmVybmVtZW50K21hcm9jK2hldXJlK2F2YW5jZSZidG5HPVNlYXJjaAotIyA8L2E+Ci0KLSMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTA5KToKLSMgSXMgV2VzdGVybiBTYWhhcmEgKHBhcnQgd2hpY2ggYWRtaW5pc3RyYXRlZCBieSBNb3JvY2NvKSBnb2luZyB0byBmb2xsb3cKLSMgTW9yb2NjbyBEU1QgY2hhbmdlcz8gIEFueSBpbmZvcm1hdGlvbj8gIFdoYXQgYWJvdXQgb3RoZXIgcGFydCBvZgotIyBXZXN0ZXJuIFNhaGFyYSAtIHVuZGVyIGFkbWluaXN0cmF0aW9uIG9mIFBPTElTQVJJTyBGcm9udCAoYWxzbyBuYW1lZAotIyBTQURSIFNhaGFyYXdpIEFyYWIgRGVtb2NyYXRpYyBSZXB1YmxpYyk/Ci0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDUtMDkpOgotIyBYWFgtLWd1ZXNzIHRoYXQgaXQgaXMgb25seSBNb3JvY2NvIGZvciBub3c7IGd1ZXNzIG9ubHkgMjAwOCBmb3Igbm93LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA4LTI3KToKLSMgTW9yb2NjbyB3aWxsIGNoYW5nZSB0aGUgY2xvY2tzIGJhY2sgb24gdGhlIG1pZG5pZ2h0IGJldHdlZW4gQXVndXN0IDMxIAotIyBhbmQgU2VwdGVtYmVyIDEuIFRoZXkgb3JpZ2luYWxseSBwbGFubmVkIHRvIG9ic2VydmUgRFNUIHRvIG5lYXIgdGhlIGVuZCAKLSMgb2YgU2VwdGVtYmVyOgotIwotIyBPbmUgYXJ0aWNsZSBhYm91dCBpdCAoaW4gRnJlbmNoKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tZW5hcmEubWEvZnIvQWN0dWFsaXRlcy9NYXJvYy9Tb2NpZXRlL2NpLnJldG91cl9hX2xfaGV1cmVfZ210X2FfcGFydGlyX2R1X2RpbWFuY2hlXzMxX2FvdXRfYV9taW51aXRfb2ZmaWNpZWxfLmRlZmF1bHQiPgotIyBodHRwOi8vd3d3Lm1lbmFyYS5tYS9mci9BY3R1YWxpdGVzL01hcm9jL1NvY2lldGUvY2kucmV0b3VyX2FfbF9oZXVyZV9nbXRfYV9wYXJ0aXJfZHVfZGltYW5jaGVfMzFfYW91dF9hX21pbnVpdF9vZmZpY2llbF8uZGVmYXVsdAotIyA8L2E+Ci0jCi0jIFdlIGhhdmUgc29tZSBmdXJ0aGVyIGRldGFpbHMgcG9zdGVkIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLWVuZHMtZHN0LWVhcmx5LTIwMDguaHRtbCI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLWVuZHMtZHN0LWVhcmx5LTIwMDguaHRtbAotIyA8L2E+Ci0jIFJVTEUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotCi1SdWxlCU1vcm9jY28JMTkzOQlvbmx5CS0JU2VwCTEyCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTE5MzkJb25seQktCU5vdgkxOQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkxOTQwCW9ubHkJLQlGZWIJMjUJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMTk0NQlvbmx5CS0JTm92CTE4CSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NTAJb25seQktCUp1bgkxMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTUwCW9ubHkJLQlPY3QJMjkJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMTk2Nwlvbmx5CS0JSnVuCSAzCTEyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTE5NjcJb25seQktCU9jdAkgMQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkxOTc0CW9ubHkJLQlKdW4JMjQJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMTk3NAlvbmx5CS0JU2VwCSAxCSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NzYJMTk3NwktCU1heQkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTc2CW9ubHkJLQlBdWcJIDEJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMTk3Nwlvbmx5CS0JU2VwCTI4CSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NzgJb25seQktCUp1bgkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTc4CW9ubHkJLQlBdWcJIDQJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAwOAlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMDgJb25seQktCVNlcAkgMQkgMDowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0Nhc2FibGFuY2EJLTA6MzA6MjAgLQlMTVQJMTkxMyBPY3QgMjYKLQkJCSAwOjAwCU1vcm9jY28JV0Ulc1QJMTk4NCBNYXIgMTYKLQkJCSAxOjAwCS0JQ0VUCTE5ODYKLQkJCSAwOjAwCU1vcm9jY28JV0Ulc1QKLSMgV2VzdGVybiBTYWhhcmEKLVpvbmUgQWZyaWNhL0VsX0FhaXVuCS0wOjUyOjQ4IC0JTE1UCTE5MzQgSmFuCi0JCQktMTowMAktCVdBVAkxOTc2IEFwciAxNAotCQkJIDA6MDAJLQlXRVQKLQotIyBNb3phbWJpcXVlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9NYXB1dG8JMjoxMDoyMCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCUNBVAotCi0jIE5hbWliaWEKLSMgVGhlIDE5OTQtMDQtMDMgdHJhbnNpdGlvbiBpcyBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIHJlcG9ydCBubyBEU1QgYWZ0ZXIgMTk5OC0wNDsgZ28gd2l0aCBJQVRBLgotCi0jIEZyb20gUGV0cm9uZWxsYSBTaWJlZW5lICgyMDA3LTAzLTMwKSBpbgotIyA8aHR0cDovL2FsbGFmcmljYS5jb20vc3Rvcmllcy8yMDA3MDMzMDAxNzguaHRtbD46Ci0jIFdoaWxlIHRoZSBlbnRpcmUgY291bnRyeSBjaGFuZ2VzIGl0cyB0aW1lLCBLYXRpbWEgTXVsaWxvIGFuZCBvdGhlcgotIyBzZXR0bGVtZW50cyBpbiBDYXByaXZpIHVub2ZmaWNpYWxseSB3aWxsIG5vdCBiZWNhdXNlIHRoZSBzdW4gdGhlcmUKLSMgcmlzZXMgYW5kIHNldHMgZWFybGllciBjb21wYXJlZCB0byBvdGhlciByZWdpb25zLiAgQ2hpZWYgb2YKLSMgRm9yZWNhc3RpbmcgUmlhYW4gdmFuIFp5bCBleHBsYWluZWQgdGhhdCB0aGUgZmFyIGVhc3Rlcm4gcGFydHMgb2YKLSMgdGhlIGNvdW50cnkgYXJlIGNsb3NlIHRvIDQwIG1pbnV0ZXMgZWFybGllciBpbiBzdW5yaXNlIHRoYW4gdGhlIHJlc3QKLSMgb2YgdGhlIGNvdW50cnkuCi0jIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTMxKToKLSMgQXBwYXJlbnRseSB0aGUgQ2Fwcml2aSBTdHJpcCBpbmZvcm1hbGx5IG9ic2VydmVzIEJvdHN3YW5hIHRpbWUsIGJ1dAotIyB3ZSBoYXZlIG5vIGRldGFpbHMuICBJbiB0aGUgbWVhbnRpbWUgcGVvcGxlIHRoZXJlIGNhbiB1c2UgQWZyaWNhL0dhYm9yb25lLgotCi0jIFJVTEUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOYW1pYmlhCTE5OTQJbWF4CS0JU2VwCVN1bj49MQkyOjAwCTE6MDAJUwotUnVsZQlOYW1pYmlhCTE5OTUJbWF4CS0JQXByCVN1bj49MQkyOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvV2luZGhvZWsJMTowODoyNCAtCUxNVAkxODkyIEZlYiA4Ci0JCQkxOjMwCS0JU1dBVAkxOTAzIE1hcgkjIFNXIEFmcmljYSBUaW1lCi0JCQkyOjAwCS0JU0FTVAkxOTQyIFNlcCAyMCAyOjAwCi0JCQkyOjAwCTE6MDAJU0FTVAkxOTQzIE1hciAyMSAyOjAwCi0JCQkyOjAwCS0JU0FTVAkxOTkwIE1hciAyMSAjIGluZGVwZW5kZW5jZQotCQkJMjowMAktCUNBVAkxOTk0IEFwciAgMwotCQkJMTowMAlOYW1pYmlhCVdBJXNUCi0KLSMgTmlnZXIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL05pYW1leQkgMDowODoyOCAtCUxNVAkxOTEyCi0JCQktMTowMAktCVdBVAkxOTM0IEZlYiAyNgotCQkJIDA6MDAJLQlHTVQJMTk2MAotCQkJIDE6MDAJLQlXQVQKLQotIyBOaWdlcmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9MYWdvcwkwOjEzOjM2IC0JTE1UCTE5MTkgU2VwCi0JCQkxOjAwCS0JV0FUCi0KLSMgUmV1bmlvbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vUmV1bmlvbgkzOjQxOjUyIC0JTE1UCTE5MTEgSnVuCSMgU2FpbnQtRGVuaXMKLQkJCTQ6MDAJLQlSRVQJIyBSZXVuaW9uIFRpbWUKLSMKLSMgU2NhdHRlcmVkIElzbGFuZHMgKElsZXMgRXBhcnNlcykgYWRtaW5pc3RlcmVkIGZyb20gUmV1bmlvbiBhcmUgYXMgZm9sbG93cy4KLSMgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVtIGlzIHRha2VuIGZyb20KLSMgSWxlcyBFcGFyc2VzICh3d3cub3V0cmUtbWVyLmdvdXYuZnIvZG9tdG9tL2lsZS5odG0sIDE5OTctMDctMjIsIGluIEZyZW5jaDsKLSMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBvZiAxOTk5LTA4LTE3KS4KLSMgV2UgaGF2ZSBubyBpbmZvIGFib3V0IHRoZWlyIHRpbWUgem9uZSBoaXN0b3JpZXMuCi0jCi0jIEJhc3NhcyBkYSBJbmRpYSAtIHVuaW5oYWJpdGVkCi0jIEV1cm9wYSBJc2xhbmQgLSBpbmhhYml0ZWQgZnJvbSAxOTA1IHRvIDE5MTAgYnkgdHdvIGZhbWlsaWVzCi0jIEdsb3Jpb3NvIElzIC0gaW5oYWJpdGVkIHVudGlsIGF0IGxlYXN0IDE5NTgKLSMgSnVhbiBkZSBOb3ZhIC0gdW5pbmhhYml0ZWQKLSMgVHJvbWVsaW4gLSBpbmhhYml0ZWQgdW50aWwgYXQgbGVhc3QgMTk1OAotCi0jIFJ3YW5kYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvS2lnYWxpCTI6MDA6MTYgLQlMTVQJMTkzNSBKdW4KLQkJCTI6MDAJLQlDQVQKLQotIyBTdCBIZWxlbmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvU3RfSGVsZW5hCS0wOjIyOjQ4IC0JTE1UCTE4OTAJCSMgSmFtZXN0b3duCi0JCQktMDoyMjo0OCAtCUpNVAkxOTUxCSMgSmFtZXN0b3duIE1lYW4gVGltZQotCQkJIDA6MDAJLQlHTVQKLSMgVGhlIG90aGVyIHBhcnRzIG9mIHRoZSBTdCBIZWxlbmEgdGVycml0b3J5IGFyZSBzaW1pbGFyOgotIwlUcmlzdGFuIGRhIEN1bmhhOiBvbiBHTVQsIHNheSBXaGl0bWFuIGFuZCB0aGUgQ0lBCi0jCUFzY2Vuc2lvbjogb24gR01ULCBzYXlzIHVzbm8xOTk1IGFuZCB0aGUgQ0lBCi0jCUdvdWdoIChzY2llbnRpZmljIHN0YXRpb24gc2luY2UgMTk1NTsgc2VhbGVycyB3aW50ZXJlZCBwcmV2aW91c2x5KToKLSMJCW9uIEdNVCwgc2F5cyB0aGUgQ0lBCi0jCUluYWNjZXNzaWJsZSwgTmlnaHRpbmdhbGU6IG5vIGluZm9ybWF0aW9uLCBidXQgcHJvYmFibHkgR01UCi0KLSMgU2FvIFRvbWUgYW5kIFByaW5jaXBlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9TYW9fVG9tZQkgMDoyNjo1NiAtCUxNVAkxODg0Ci0JCQktMDozNjozMiAtCUxNVAkxOTEyCSMgTGlzYm9uIE1lYW4gVGltZQotCQkJIDA6MDAJLQlHTVQKLQotIyBTZW5lZ2FsCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9EYWthcgktMTowOTo0NCAtCUxNVAkxOTEyCi0JCQktMTowMAktCVdBVAkxOTQxIEp1bgotCQkJIDA6MDAJLQlHTVQKLQotIyBTZXljaGVsbGVzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYWhlCTM6NDE6NDggLQlMTVQJMTkwNiBKdW4JIyBWaWN0b3JpYQotCQkJNDowMAktCVNDVAkjIFNleWNoZWxsZXMgVGltZQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTMwKToKLSMgQWxkYWJyYSwgRmFycXVoYXIsIGFuZCBEZXNyb2NoZXMsIG9yaWdpbmFsbHkgZGVwZW5kZW5jaWVzIG9mIHRoZQotIyBTZXljaGVsbGVzLCB3ZXJlIHRyYW5zZmVycmVkIHRvIHRoZSBCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkKLSMgaW4gMTk2NSBhbmQgcmV0dXJuZWQgdG8gU2V5Y2hlbGxlcyBjb250cm9sIGluIDE5NzYuICBXZSBkb24ndCBrbm93Ci0jIHdoZXRoZXIgdGhpcyBhZmZlY3RlZCB0aGVpciB0aW1lIHpvbmUsIHNvIG9taXQgdGhpcyBmb3Igbm93LgotIyBQb3NzaWJseSB0aGUgaXNsYW5kcyB3ZXJlIHVuaW5oYWJpdGVkLgotCi0jIFNpZXJyYSBMZW9uZQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBnaXZlcyBNYXIgMzEgLSBBdWcgMzEgZm9yIDE5MzEgb247IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTTAkxOTM1CTE5NDIJLQlKdW4JIDEJMDowMAkwOjQwCVNMU1QKLVJ1bGUJU0wJMTkzNQkxOTQyCS0JT2N0CSAxCTA6MDAJMAlXQVQKLVJ1bGUJU0wJMTk1NwkxOTYyCS0JSnVuCSAxCTA6MDAJMTowMAlTTFNUCi1SdWxlCVNMCTE5NTcJMTk2MgktCVNlcAkgMQkwOjAwCTAJR01UCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9GcmVldG93bgktMDo1MzowMCAtCUxNVAkxODgyCi0JCQktMDo1MzowMCAtCUZNVAkxOTEzIEp1biAjIEZyZWV0b3duIE1lYW4gVGltZQotCQkJLTE6MDAJU0wJJXMJMTk1NwotCQkJIDA6MDAJU0wJJXMKLQotIyBTb21hbGlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9Nb2dhZGlzaHUJMzowMToyOCAtCUxNVAkxODkzIE5vdgotCQkJMzowMAktCUVBVAkxOTMxCi0JCQkyOjMwCS0JQkVBVAkxOTU3Ci0JCQkzOjAwCS0JRUFUCi0KLSMgU291dGggQWZyaWNhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlTQQkxOTQyCTE5NDMJLQlTZXAJU3VuPj0xNQkyOjAwCTE6MDAJLQotUnVsZQlTQQkxOTQzCTE5NDQJLQlNYXIJU3VuPj0xNQkyOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvSm9oYW5uZXNidXJnIDE6NTI6MDAgLQlMTVQJMTg5MiBGZWIgOAotCQkJMTozMAktCVNBU1QJMTkwMyBNYXIKLQkJCTI6MDAJU0EJU0FTVAotIyBNYXJpb24gYW5kIFByaW5jZSBFZHdhcmQgSXMKLSMgc2NpZW50aWZpYyBzdGF0aW9uIHNpbmNlIDE5NDcKLSMgbm8gaW5mb3JtYXRpb24KLQotIyBTdWRhbgotIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3VuYW5ld3MubmV0L3NuMTNqYW5lLmh0bWwiPgotIyBTdWRhbiBOZXdzIEFnZW5jeSAoMjAwMC0wMS0xMykKLSMgPC9hPiwgYWxzbyByZXBvcnRlZCBieSBNaWNoYWVsIERlIEJldWtlbGFlci1Eb3NzY2hlIHZpYSBTdGVmZmVuIFRob3JzZW46Ci0jIENsb2NrcyB3aWxsIGJlIG1vdmVkIGFoZWFkIGZvciA2MCBtaW51dGVzIGFsbCBvdmVyIHRoZSBTdWRhbiBhcyBvZiBub29uCi0jIFNhdHVyZGF5Li4uLiAgVGhpcyB3YXMgYW5ub3VuY2VkIFRodXJzZGF5IGJ5IENhcmV0YWtlciBTdGF0ZSBNaW5pc3RlciBmb3IKLSMgTWFucG93ZXIgQWJkdWwtUmFobWFuIE51ci1FZGRpbi4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVN1ZGFuCTE5NzAJb25seQktCU1heQkgMQkwOjAwCTE6MDAJUwotUnVsZQlTdWRhbgkxOTcwCTE5ODUJLQlPY3QJMTUJMDowMAkwCS0KLVJ1bGUJU3VkYW4JMTk3MQlvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlTCi1SdWxlCVN1ZGFuCTE5NzIJMTk4NQktCUFwcglsYXN0U3VuCTA6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9LaGFydG91bQkyOjEwOjA4IC0JTE1UCTE5MzEKLQkJCTI6MDAJU3VkYW4JQ0Elc1QJMjAwMCBKYW4gMTUgMTI6MDAKLQkJCTM6MDAJLQlFQVQKLQotIyBTd2F6aWxhbmQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL01iYWJhbmUJMjowNDoyNCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCVNBU1QKLQotIyBUYW56YW5pYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvRGFyX2VzX1NhbGFhbSAyOjM3OjA4IC0JTE1UCTE5MzEKLQkJCTM6MDAJLQlFQVQJMTk0OAotCQkJMjo0NDo0NQktCUJFQVVUCTE5NjEKLQkJCTM6MDAJLQlFQVQKLQotIyBUb2dvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Mb21lCTA6MDQ6NTIgLQlMTVQJMTg5MwotCQkJMDowMAktCUdNVAotCi0jIFR1bmlzaWEKLQotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA0LTMwKToKLSMgTXkgY29ycmVzcG9uZGVudCwgUmlzdG8gTnlrYW5lbiwgaGFzIGFsZXJ0ZWQgbWUgdG8gYW5vdGhlciBhZG9wdGlvbiBvZiBEU1QsCi0jIHRoaXMgdGltZSBpbiBUdW5pc2lhLiAgQWNjb3JkaW5nIHRvIFlhaG9vIEZyYW5jZSBOZXdzCi0jIDxodHRwOi8vZnIubmV3cy55YWhvby5jb20vMDUwNDI2LzUvNGR1bWsuaHRtbD4sIGluIGEgc3RvcnkgYXR0cmlidXRlZCB0byBBUAotIyBhbmQgZGF0ZWQgMjAwNS0wNC0yNiwgIlR1bmlzaWEgaGFzIGRlY2lkZWQgdG8gYWR2YW5jZSBpdHMgb2ZmaWNpYWwgdGltZSBieQotIyBvbmUgaG91ciwgc3RhcnRpbmcgb24gU3VuZGF5LCBNYXkgMS4gIEhlbmNlZm9ydGgsIFR1bmlzaWFuIHRpbWUgd2lsbCBiZQotIyBVVEMrMiBpbnN0ZWFkIG9mIFVUQysxLiAgVGhlIGNoYW5nZSB3aWxsIHRha2UgcGxhY2UgYXQgMjM6MDAgVVRDIG5leHQKLSMgU2F0dXJkYXkuIiAgKE15IHRyYW5zbGF0aW9uKQotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTA1LTAyKToKLSMgTGFQcmVzc2UsIHRoZSBmaXJzdCBuYXRpb25hbCBkYWlseSBuZXdzcGFwZXIgLi4uCi0jIDxodHRwOi8vd3d3LmxhcHJlc3NlLnRuL2FyY2hpdmVzL2FyY2hpdmVzMjgwNDA1L2FjdHVhbGl0ZXMvbGhldXJlLmh0bWw+Ci0jIC4uLiBEU1QgZm9yIDIwMDU6IG9uOiBTdW4gTWF5IDEgMGggc3RhbmRhcmQgdGltZSwgb2ZmOiBGcmkgU2VwdC4gMzAsCi0jIDFoIHN0YW5kYXJkIHRpbWUuCi0jCi0jIEZyb20gQXRlZiBMb3VraWwgKDIwMDYtMDMtMjgpOgotIyBUaGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgd2lsbCBiZSB0aGUgc2FtZSBlYWNoIHllYXI6Ci0jIEJlZ2lubmluZyAgICAgIDogdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIGF0IDAyOjAwCi0jIEVuZGluZyAgICAgICAgIDogdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIgYXQgMDM6MDAgLi4uCi0jIGh0dHA6Ly93d3cudGFwLmluZm8udG4vZW4vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MTE4OCZJdGVtaWQ9NTAKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVHVuaXNpYQkxOTM5CW9ubHkJLQlBcHIJMTUJMjM6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5MzkJb25seQktCU5vdgkxOAkyMzowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk0MAlvbmx5CS0JRmViCTI1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQxCW9ubHkJLQlPY3QJIDYJIDA6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0Mglvbmx5CS0JTWFyCSA5CSAwOjAwCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5NDIJb25seQktCU5vdgkgMgkgMzowMAkwCS0KLVJ1bGUJVHVuaXNpYQkxOTQzCW9ubHkJLQlNYXIJMjkJIDI6MDAJMTowMAlTCi1SdWxlCVR1bmlzaWEJMTk0Mwlvbmx5CS0JQXByCTE3CSAyOjAwCTAJLQotUnVsZQlUdW5pc2lhCTE5NDMJb25seQktCUFwcgkyNQkgMjowMAkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQzCW9ubHkJLQlPY3QJIDQJIDI6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0NAkxOTQ1CS0JQXByCU1vbj49MQkgMjowMAkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQ0CW9ubHkJLQlPY3QJIDgJIDA6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0NQlvbmx5CS0JU2VwCTE2CSAwOjAwCTAJLQotUnVsZQlUdW5pc2lhCTE5NzcJb25seQktCUFwcgkzMAkgMDowMHMJMTowMAlTCi1SdWxlCVR1bmlzaWEJMTk3Nwlvbmx5CS0JU2VwCTI0CSAwOjAwcwkwCS0KLVJ1bGUJVHVuaXNpYQkxOTc4CW9ubHkJLQlNYXkJIDEJIDA6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5NzgJb25seQktCU9jdAkgMQkgMDowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk4OAlvbmx5CS0JSnVuCSAxCSAwOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTg4CTE5OTAJLQlTZXAJbGFzdFN1bgkgMDowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk4OQlvbmx5CS0JTWFyCTI2CSAwOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTkwCW9ubHkJLQlNYXkJIDEJIDA6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTIwMDUJb25seQktCU1heQkgMQkgMDowMHMJMTowMAlTCi1SdWxlCVR1bmlzaWEJMjAwNQlvbmx5CS0JU2VwCTMwCSAxOjAwcwkwCS0KLVJ1bGUJVHVuaXNpYQkyMDA2CW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkyMDA2CW1heAktCU9jdAlsYXN0U3VuCSAyOjAwcwkwCS0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMDowOToyMCBmb3IgUGFyaXMgTWVhbiBUaW1lOyBnbyB3aXRoIEhvd3NlJ3MKLSMgbW9yZSBwcmVjaXNlIDA6MDk6MjEuCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIDE5MTEgc3dpdGNoIHdhcyBvbiBNYXIgOTsgZ28gd2l0aCBIb3dzZSdzIE1hciAxMS4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL1R1bmlzCTA6NDA6NDQgLQlMTVQJMTg4MSBNYXkgMTIKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKLQkJCTE6MDAJVHVuaXNpYQlDRSVzVAotCi0jIFVnYW5kYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvS2FtcGFsYQkyOjA5OjQwIC0JTE1UCTE5MjggSnVsCi0JCQkzOjAwCS0JRUFUCTE5MzAKLQkJCTI6MzAJLQlCRUFUCTE5NDgKLQkJCTI6NDQ6NDUJLQlCRUFVVAkxOTU3Ci0JCQkzOjAwCS0JRUFUCi0KLSMgWmFtYmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9MdXNha2EJMTo1MzowOCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCUNBVAotCi0jIFppbWJhYndlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9IYXJhcmUJMjowNDoxMiAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCUNBVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYW50YXJjdGljYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2FudGFyY3RpY2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjc5Y2IuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYW50YXJjdGljYQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0jIEAoIylhbnRhcmN0aWNhCTguNAotIyA8cHJlPgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTEtMTUpOgotIyBUbyBrZWVwIHRoaW5ncyBtYW5hZ2VhYmxlLCB3ZSBsaXN0IG9ubHkgbG9jYXRpb25zIG9jY3VwaWVkIHllYXItcm91bmQ7IHNlZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmNvbW5hcC5hcS9jb21uYXAvY29tbmFwLm5zZi9QL1N0YXRpb25zLyI+Ci0jIENPTU5BUCAtIFN0YXRpb25zIGFuZCBCYXNlcwotIyA8L2E+Ci0jIGFuZAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNwcmkuY2FtLmFjLnVrL2JvYi9wZXJpYW50Lmh0bSI+Ci0jIFN1bW1hcnkgb2YgdGhlIFBlcmktQW50YXJjdGljIElzbGFuZHMgKDE5OTgtMDctMjMpCi0jIDwvYT4KLSMgZm9yIGluZm9ybWF0aW9uLgotIyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgd2UgaGF2ZSBubyB0aW1lIHpvbmUgaW5mb3JtYXRpb24uCi0jCi0jIEV4Y2VwdCBmb3IgdGhlIEZyZW5jaCBlbnRyaWVzLAotIyBJIG1hZGUgdXAgYWxsIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIG1lbnRpb25lZCBoZXJlOyBjb3JyZWN0aW9ucyB3ZWxjb21lIQotIyBGT1JNQVQgaXMgYHp6eicgYW5kIEdNVE9GRiBpcyAwIGZvciBsb2NhdGlvbnMgd2hpbGUgdW5pbmhhYml0ZWQuCi0KLSMgVGhlc2UgcnVsZXMgYXJlIHN0b2xlbiBmcm9tIHRoZSBgZXVyb3BlJyBmaWxlLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUnVzc0FRCTE5ODEJMTk4NAktCUFwcgkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJUnVzc0FRCTE5ODEJMTk4MwktCU9jdAkgMQkgMDowMAkwCS0KLVJ1bGUJUnVzc0FRCTE5ODQJMTk5MQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLVJ1bGUJUnVzc0FRCTE5ODUJMTk5MQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUJUnVzc0FRCTE5OTIJb25seQktCU1hcglsYXN0U2F0CSAyMzowMAkxOjAwCVMKLVJ1bGUJUnVzc0FRCTE5OTIJb25seQktCVNlcAlsYXN0U2F0CSAyMzowMAkwCS0KLVJ1bGUJUnVzc0FRCTE5OTMJbWF4CS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUwotUnVsZQlSdXNzQVEJMTk5MwkxOTk1CS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZQlSdXNzQVEJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCi0KLSMgVGhlc2UgcnVsZXMgYXJlIHN0b2xlbiBmcm9tIHRoZSBgc291dGhhbWVyaWNhJyBmaWxlLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQXJnQVEJMTk2NAkxOTY2CS0JTWFyCSAxCTA6MDAJMAktCi1SdWxlCUFyZ0FRCTE5NjQJMTk2NgktCU9jdAkxNQkwOjAwCTE6MDAJUwotUnVsZQlBcmdBUQkxOTY3CW9ubHkJLQlBcHIJIDIJMDowMAkwCS0KLVJ1bGUJQXJnQVEJMTk2NwkxOTY4CS0JT2N0CVN1bj49MQkwOjAwCTE6MDAJUwotUnVsZQlBcmdBUQkxOTY4CTE5NjkJLQlBcHIJU3VuPj0xCTA6MDAJMAktCi1SdWxlCUFyZ0FRCTE5NzQJb25seQktCUphbgkyMwkwOjAwCTE6MDAJUwotUnVsZQlBcmdBUQkxOTc0CW9ubHkJLQlNYXkJIDEJMDowMAkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTcyCTE5ODYJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5NzQJMTk4NwktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlQVEJMTk4Nwlvbmx5CS0JQXByCTEyCTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5ODgJMTk4OQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlQVEJMTk4OAlvbmx5CS0JT2N0CVN1bj49MQk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGVBUQkxOTg5CW9ubHkJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZUFRCTE5OTAJb25seQktCU1hcgkxOAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTkwCW9ubHkJLQlTZXAJMTYJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlQVEJMTk5MQkxOTk2CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTkxCTE5OTcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZUFRCTE5OTcJb25seQktCU1hcgkzMAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTk4CW9ubHkJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5OTgJb25seQktCVNlcAkyNwk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGVBUQkxOTk5CW9ubHkJLQlBcHIJIDQJMzowMHUJMAktCi1SdWxlCUNoaWxlQVEJMTk5OQltYXgJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZUFRCTIwMDAJbWF4CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLQotCi0jIEFyZ2VudGluYSAtIHllYXItcm91bmQgYmFzZXMKLSMgQmVsZ3Jhbm8gSUksIENvbmZpbiBDb2FzdCwgLTc3MDIyNy0wMzQzNzM3LCBzaW5jZSAxOTcyLTAyLTA1Ci0jIEVzcGVyYW56YSwgU2FuIE1hcnRpbiBMYW5kLCAtNjMyMy0wNTY1OSwgc2luY2UgMTk1Mi0xMi0xNwotIyBKdWJhbnksIFBvdHRlciBQZW5pbnN1bGEsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTY0MTQtMDYwMjMyMCwgc2luY2UgMTk4Mi0wMQotIyBNYXJhbWJpbywgU2V5bW91ciBJLCAtNjQxNC0wNTYzNywgc2luY2UgMTk2OS0xMC0yOQotIyBPcmNhZGFzLCBMYXVyaWUgSSwgLTYwMTYtMDQ0NDQsIHNpbmNlIDE5MDQtMDItMjIKLSMgU2FuIE1hcnRpbiwgRGViZW5oYW0gSSwgLTY4MDctMDY3MDgsIHNpbmNlIDE5NTEtMDMtMjEKLSMJKGV4Y2VwdCAxOTYwLTAzIC8gMTk3Ni0wMy0yMSkKLQotIyBBdXN0cmFsaWEgLSB0ZXJyaXRvcmllcwotIyBIZWFyZCBJc2xhbmQsIE1jRG9uYWxkIElzbGFuZHMgKHVuaW5oYWJpdGVkKQotIwlwcmV2aW91c2x5IHNlYWxlcnMgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIHdpbnRlcmVkCi0jCTxhIGhyZWY9Imh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDIxMjA0MjIyMjQ1L2h0dHA6Ly93d3cuZHN0Yy5xdXQuZWR1LmF1L0RTVC9tYXJnL2RheWxpZ2h0Lmh0bWwiPgotIwlNYXJnYXJldCBUdXJuZXIgcmVwb3J0cwotIwk8L2E+ICgxOTk5LTA5LTMwKSB0aGF0IHRoZXkncmUgVVRDKzUsIHdpdGggbm8gRFNUOwotIwlwcmVzdW1hYmx5IHRoaXMgaXMgd2hlbiB0aGV5IGhhdmUgdmlzaXRvcnMuCi0jCi0jIHllYXItcm91bmQgYmFzZXMKLSMgQ2FzZXksIEJhaWxleSBQZW5pbnN1bGEsIC02NjE3KzExMDMyLCBzaW5jZSAxOTY5Ci0jIERhdmlzLCBWZXN0Zm9sZCBIaWxscywgLTY4MzUrMDc3NTksIHNpbmNlIDE5NTctMDEtMTMKLSMJKGV4Y2VwdCAxOTY0LTExIC0gMTk2OS0wMikKLSMgTWF3c29uLCBIb2xtZSBCYXksIC02NzM2KzA2MjUzLCBzaW5jZSAxOTU0LTAyLTEzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFudGFyY3RpY2EvQ2FzZXkJMAktCXp6egkxOTY5Ci0JCQk4OjAwCS0JV1NUCSMgV2VzdGVybiAoQXVzKSBTdGFuZGFyZCBUaW1lCi1ab25lIEFudGFyY3RpY2EvRGF2aXMJMAktCXp6egkxOTU3IEphbiAxMwotCQkJNzowMAktCURBVlQJMTk2NCBOb3YgIyBEYXZpcyBUaW1lCi0JCQkwCS0Jenp6CTE5NjkgRmViCi0JCQk3OjAwCS0JREFWVAotWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0Jenp6CTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JTUFXVAkjIE1hd3NvbiBUaW1lCi0jIFJlZmVyZW5jZXM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW50ZGl2Lmdvdi5hdS9hYWQvZXhvcC9zZm8vY2FzZXkvY2FzZXlfYXdzLmh0bWwiPgotIyBDYXNleSBXZWF0aGVyICgxOTk4LTAyLTI2KQotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW50ZGl2Lmdvdi5hdS9hYWQvZXhvcC9zZm8vZGF2aXMvdmlkZW8uaHRtbCI+Ci0jIERhdmlzIFN0YXRpb24sIEFudGFyY3RpY2EgKDE5OTgtMDItMjYpCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRkaXYuZ292LmF1L2FhZC9leG9wL3Nmby9tYXdzb24vdmlkZW8uaHRtbCI+Ci0jIE1hd3NvbiBTdGF0aW9uLCBBbnRhcmN0aWNhICgxOTk4LTAyLTI1KQotIyA8L2E+Ci0KLSMgQnJhemlsIC0geWVhci1yb3VuZCBiYXNlCi0jIENvbWFuZGFudGUgRmVycmF6LCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA1KzA1ODI0LCBzaW5jZSAxOTgzLzQKLQotIyBDaGlsZSAtIHllYXItcm91bmQgYmFzZXMgYW5kIHRvd25zCi0jIEVzY3VkZXJvLCBTb3V0aCBTaGV0bGFuZCBJcywgLTYyMTE1Ny0wNTg1NzM1LCBzaW5jZSAxOTk0Ci0jIFByZXNpZGVudGUgRWR1YWRybyBGcmVpLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjE0LTA1ODQ4LCBzaW5jZSAxOTY5LTAzLTA3Ci0jIEdlbmVyYWwgQmVybmFyZG8gTydIaWdnaW5zLCBBbnRhcmN0aWMgUGVuaW5zdWxhLCAtNjMxOS0wNTcwNCwgc2luY2UgMTk0OC0wMgotIyBDYXBpdGFuIEFydHVybyBQcmF0LCAtNjIzMC0wNTk0MQotIyBWaWxsYSBMYXMgRXN0cmVsbGFzIChhIHRvd24pLCBhcm91bmQgdGhlIEZyZWkgYmFzZSwgc2luY2UgMTk4NC0wNC0wOQotIyBUaGVzZSBsb2NhdGlvbnMgaGF2ZSBhbHdheXMgdXNlZCBTYW50aWFnbyB0aW1lOyB1c2UgVFo9J0FtZXJpY2EvU2FudGlhZ28nLgotCi0jIENoaW5hIC0geWVhci1yb3VuZCBiYXNlcwotIyBHcmVhdCBXYWxsLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjEzLTA1ODU4LCBzaW5jZSAxOTg1LTAyLTIwCi0jIFpob25nc2hhbiwgTGFyc2VtYW5uIEhpbGxzLCBQcnlkeiBCYXksIC02OTIyKzA3NjIzLCBzaW5jZSAxOTg5LTAyLTI2Ci0KLSMgRnJhbmNlIC0geWVhci1yb3VuZCBiYXNlcwotIwotIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5Ny0wMS0yMCk6Ci0jIFRpbWUgZGF0YSBhcmUgZnJvbSBOaWNvbGUgUGFpbGxlYXUgYXQgdGhlIElGUlRQCi0jIChGcmVuY2ggSW5zdGl0dXRlIGZvciBQb2xhciBSZXNlYXJjaCBhbmQgVGVjaG5vbG9neSkuCi0jIFNoZSBjb25maXJtcyB0aGF0IEZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyBhbmQgVGVycmUgQWRlbGllIGJhc2VzCi0jIGRvbid0IG9ic2VydmUgZGF5bGlnaHQgc2F2aW5nIHRpbWUsIGV2ZW4gaWYgVGVycmUgQWRlbGllIHN1cHBsaWVzIGNhbWUKLSMgZnJvbSBUYXNtYW5pYS4KLSMKLSMgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIHdpdGggeWVhci1yb3VuZCBpbmhhYml0YW50cwotIwotIyBNYXJ0aW4tZGUtVml2aWVzIEJhc2UsIEFtc3RlcmRhbSBJc2xhbmQsIC0zNzQxMDUrMDc3MzE1NSwgc2luY2UgMTk1MAotIyBBbGZyZWQtRmF1cmUgQmFzZSwgQ3JvemV0IElzbGFuZHMsIC00NjI1NTErMDUxNTE1Miwgc2luY2UgMTk2NAotIyBQb3J0LWF1eC1GcmFuY2FpcywgS2VyZ3VlbGVuIElzbGFuZHMsIC00OTIxMTArMDcwMTMwMywgc2luY2UgMTk1MTsKLSMJd2hhbGluZyAmIHNlYWxpbmcgc3RhdGlvbiBvcGVyYXRlZCAxOTA4LzE5MTQsIDE5MjAvMTkyOSwgYW5kIDE5NTEvMTk1NgotIwotIyBTdCBQYXVsIElzbGFuZCAtIG5lYXIgQW1zdGVyZGFtLCB1bmluaGFiaXRlZAotIwlmaXNoaW5nIHN0YXRpb25zIG9wZXJhdGVkIHZhcmlvdXNseSAxODE5LzE5MzEKLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgSW5kaWFuL0tlcmd1ZWxlbgkwCS0Jenp6CTE5NTAJIyBQb3J0LWF1eC1GcmFuY2FpcwotCQkJNTowMAktCVRGVAkjIElTTyBjb2RlIFRGIFRpbWUKLSMKLSMgeWVhci1yb3VuZCBiYXNlIGluIHRoZSBtYWluIGNvbnRpbmVudAotIyBEdW1vbnQtZCdVcnZpbGxlLCBJbGUgZGVzIFBldHJlbHMsIC02NjQwKzE0MDAxLCBzaW5jZSAxOTU2LTExCi0jCi0jIEFub3RoZXIgYmFzZSBhdCBQb3J0LU1hcnRpbiwgNTBrbSBlYXN0LCBiZWdhbiBvcGVyYXRpb24gaW4gMTk0Ny4KLSMgSXQgd2FzIGRlc3Ryb3llZCBieSBmaXJlIG9uIDE5NTItMDEtMTQuCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFudGFyY3RpY2EvRHVtb250RFVydmlsbGUgMCAtCXp6egkxOTQ3Ci0JCQkxMDowMAktCVBNVAkxOTUyIEphbiAxNCAjIFBvcnQtTWFydGluIFRpbWUKLQkJCTAJLQl6enoJMTk1NiBOb3YKLQkJCTEwOjAwCS0JRERVVAkjIER1bW9udC1kJ1VydmlsbGUgVGltZQotIyBSZWZlcmVuY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVtb250X2QnVXJ2aWxsZV9TdGF0aW9uIj4KLSMgRHVtb250IGQnVXJ2aWxsZSBTdGF0aW9uICgyMDA1LTEyLTA1KQotIyA8L2E+Ci0KLSMgR2VybWFueSAtIHllYXItcm91bmQgYmFzZQotIyBHZW9yZyB2b24gTmV1bWF5ZXIsIC03MDM5LTAwODE1Ci0KLSMgSW5kaWEgLSB5ZWFyLXJvdW5kIGJhc2UKLSMgRGFrc2hpbiBHYW5nb3RyaSwgLTcwMDUrMDEyMDAKLQotIyBKYXBhbiAtIHllYXItcm91bmQgYmFzZXMKLSMgRG9tZSBGdWppLCAtNzcxOSswMzk0MgotIyBTeW93YSwgLTY5MDAyMiswMzkzNTI0Ci0jCi0jIEZyb20gSGlkZXl1a2kgU3V6dWtpICgxOTk5LTAyLTA2KToKLSMgSW4gYWxsIEphcGFuZXNlIHN0YXRpb25zLCArMDMwMCBpcyB1c2VkIGFzIHRoZSBzdGFuZGFyZCB0aW1lLgotIwotIyBTeW93YSBzdGF0aW9uLCB3aGljaCBpcyB0aGUgZmlyc3QgYW50YXJjdGljIHN0YXRpb24gb2YgSmFwYW4sCi0jIHdhcyBlc3RhYmxpc2hlZCBvbiAxOTU3LTAxLTI5LiAgU2luY2UgU3lvd2Egc3RhdGlvbiBpcyBzdGlsbCB0aGUgbWFpbgotIyBzdGF0aW9uIG9mIEphcGFuLCBpdCdzIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJpbmNpcGFsIGxvY2F0aW9uLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbnRhcmN0aWNhL1N5b3dhCTAJLQl6enoJMTk1NyBKYW4gMjkKLQkJCTM6MDAJLQlTWU9UCSMgU3lvd2EgVGltZQotIyBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubmlwci5hYy5qcC9lbmdsaXNoL2FyYTAxLmh0bWwiPgotIyBOSVBSIEFudGFyY3RpYyBSZXNlYXJjaCBBY3Rpdml0aWVzICgxOTk5LTA4LTE3KQotIyA8L2E+Ci0KLSMgUyBLb3JlYSAtIHllYXItcm91bmQgYmFzZQotIyBLaW5nIFNlam9uZywgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIxMy0wNTg0Nywgc2luY2UgMTk4OAotCi0jIE5ldyBaZWFsYW5kIC0gY2xhaW1zCi0jIEJhbGxlbnkgSXNsYW5kcyAobmV2ZXIgaW5oYWJpdGVkKQotIyBTY290dCBJc2xhbmQgKG5ldmVyIGluaGFiaXRlZCkKLSMKLSMgeWVhci1yb3VuZCBiYXNlCi0jIFNjb3R0LCBSb3NzIElzbGFuZCwgc2luY2UgMTk1Ny0wMSwgaXMgbGlrZSBBbnRhcmN0aWNhL01jTXVyZG8uCi0jCi0jIFRoZXNlIHJ1bGVzIGZvciBOZXcgWmVhbGFuZCBhcmUgc3RvbGVuIGZyb20gdGhlIGBhdXN0cmFsYXNpYScgZmlsZS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5aQVEJMTk3NAlvbmx5CS0JTm92CSAzCTI6MDBzCTE6MDAJRAotUnVsZQlOWkFRCTE5NzUJMTk4OAktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAotUnVsZQlOWkFRCTE5ODkJb25seQktCU9jdAkgOAkyOjAwcwkxOjAwCUQKLVJ1bGUJTlpBUQkxOTkwCTIwMDYJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJRAotUnVsZQlOWkFRCTE5NzUJb25seQktCUZlYgkyMwkyOjAwcwkwCVMKLVJ1bGUJTlpBUQkxOTc2CTE5ODkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUwotUnVsZQlOWkFRCTE5OTAJMjAwNwktCU1hcglTdW4+PTE1CTI6MDBzCTAJUwotUnVsZQlOWkFRCTIwMDcJbWF4CS0JU2VwCWxhc3RTdW4JMjowMHMJMTowMAlECi1SdWxlCU5aQVEJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUwotCi0jIE5vcndheSAtIHRlcnJpdG9yaWVzCi0jIEJvdXZldCAobmV2ZXIgaW5oYWJpdGVkKQotIwotIyBjbGFpbXMKLSMgUGV0ZXIgSSBJc2xhbmQgKG5ldmVyIGluaGFiaXRlZCkKLQotIyBQb2xhbmQgLSB5ZWFyLXJvdW5kIGJhc2UKLSMgQXJjdG93c2tpLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA5NDUtMDU4Mjc0NSwgc2luY2UgMTk3NwotCi0jIFJ1c3NpYSAtIHllYXItcm91bmQgYmFzZXMKLSMgQmVsbGluZ3NoYXVzZW4sIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTE1OS0wNTg1MzM3LCBzaW5jZSAxOTY4LTAyLTIyCi0jIE1pcm55LCBEYXZpcyBjb2FzdCwgLTY2MzMrMDkzMDEsIHNpbmNlIDE5NTYtMDIKLSMgTW9sb2RlemhuYXlhLCBBbGFzaGV5ZXYgQmF5LCAtNjc0MCswNDU1MSwKLSMJeWVhci1yb3VuZCBmcm9tIDE5NjItMDIgdG8gMTk5OS0wNy0wMQotIyBOb3ZvbGF6YXJldnNrYXlhLCBRdWVlbiBNYXVkIExhbmQsIC03MDQ2KzAxMTUwLAotIwl5ZWFyLXJvdW5kIGZyb20gMTk2MC82MSB0byAxOTkyCi0KLSMgVm9zdG9rLCBzaW5jZSAxOTU3LTEyLTE2LCB0ZW1wb3JhcmlseSBjbG9zZWQgMTk5NC0wMi8xOTk0LTExCi0jIDxhIGhyZWY9Imh0dHA6Ly9xdWVzdC5hcmMubmFzYS5nb3YvYW50YXJjdGljYS9RQS9jb21wdXRlcnMvRGlyZWN0aW9ucyxUaW1lLFpJUCI+Ci0jIEZyb20gQ3JhaWcgTXVuZGVsbCAoMTk5NC0xMi0xNSk8L2E+OgotIyBWb3N0b2ssIHdoaWNoIGlzIG9uZSBvZiB0aGUgUnVzc2lhbiBzdGF0aW9ucywgaXMgc2V0IG9uIHRoZSBzYW1lCi0jIHRpbWUgYXMgTW9zY293LCBSdXNzaWEuCi0jCi0jIEZyb20gTGVlIEhvdHogKDIwMDEtMDMtMDgpOgotIyBJIHF1ZXJpZWQgdGhlIGZvbGtzIGF0IENvbHVtYmlhIHdobyBzcGVudCB0aGUgc3VtbWVyIGF0IFZvc3RvayBhbmQgdGhpcyBpcwotIyB3aGF0IHRoZXkgaGFkIHRvIHNheSBhYm91dCB0aW1lIHRoZXJlOgotIyBgYGluIHRoZSBVUyBDYW1wIChFYXN0IENhbXApIHdlIGhhdmUgYmVlbiBvbiBOZXcgWmVhbGFuZCAoTWNNdXJkbykKLSMgdGltZSwgd2hpY2ggaXMgMTIgaG91cnMgYWhlYWQgb2YgR01ULiBUaGUgUnVzc2lhbiBTdGF0aW9uIFZvc3RvayB3YXMKLSMgNiBob3VycyBiZWhpbmQgdGhhdCAoYWx0aG91Z2ggb25seSAyIG1pbGVzIGF3YXksIGkuZS4gNiBob3VycyBhaGVhZAotIyBvZiBHTVQpLiBUaGlzIGlzIGEgdGltZSB6b25lIEkgdGhpbmsgdHdvIGhvdXJzIGVhc3Qgb2YgTW9zY293LiBUaGUKLSMgbmF0dXJhbCB0aW1lIHpvbmUgaXMgaW4gYmV0d2VlbiB0aGUgdHdvOiA4IGhvdXJzIGFoZWFkIG9mIEdNVC4nJwotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTA0KToKLSMgVGhpcyBzZWVtcyB0byBiZSBob3BlbGVzc2x5IGNvbmZ1c2luZywgc28gSSBhc2tlZCBMZWUgSG90eiBhYm91dCBpdAotIyBpbiBwZXJzb24uICBIZSBzYWlkIHRoYXQgc29tZSBBbnRhcnRpYyBsb2NhdGlvbnMgc2V0IHRoZWlyIGxvY2FsCi0jIHRpbWUgc28gdGhhdCBub29uIGlzIHRoZSB3YXJtZXN0IHBhcnQgb2YgdGhlIGRheSwgYW5kIHRoYXQgdGhpcwotIyBjaGFuZ2VzIGR1cmluZyB0aGUgeWVhciBhbmQgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBtZWFuCi0jIHNvbGFyIG5vb24uICBTbyB0aGUgVm9zdG9rIHRpbWUgbWlnaHQgaGF2ZSBiZWVuIHdoYXRldmVyIHRoZSBjbG9ja3MKLSMgaGFwcGVuZWQgdG8gYmUgZHVyaW5nIHRoZWlyIHZpc2l0LiAgU28gd2Ugc3RpbGwgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aW1lCi0jIGl0IGlzIGF0IFZvc3Rvay4gIEJ1dCB3ZSdsbCBndWVzcyBVVEMrNi4KLSMKLVpvbmUgQW50YXJjdGljYS9Wb3N0b2sJMAktCXp6egkxOTU3IERlYyAxNgotCQkJNjowMAktCVZPU1QJIyBWb3N0b2sgdGltZQotCi0jIFMgQWZyaWNhIC0geWVhci1yb3VuZCBiYXNlcwotIyBNYXJpb24gSXNsYW5kLCAtNDY1MyswMzc1MgotIyBTYW5hZSwgLTcxNDEtMDAyNTAKLQotIyBVSwotIwotIyBCcml0aXNoIEFudGFyY3RpYyBUZXJyaXRvcmllcyAoQkFUKSBjbGFpbXMKLSMgU291dGggT3JrbmV5IElzbGFuZHMKLSMJc2NpZW50aWZpYyBzdGF0aW9uIGZyb20gMTkwMwotIwl3aGFsaW5nIHN0YXRpb24gYXQgU2lnbnkgSSAxOTIwLzE5MjYKLSMgU291dGggU2hldGxhbmQgSXNsYW5kcwotIwotIyB5ZWFyLXJvdW5kIGJhc2VzCi0jIEJpcmQgSXNsYW5kLCBTb3V0aCBHZW9yZ2lhLCAtNTQwMC0wMzgwMywgc2luY2UgMTk4MwotIyBEZWNlcHRpb24gSXNsYW5kLCAtNjI1OS0wNjAzNCwgd2hhbGluZyBzdGF0aW9uIDE5MTIvMTkzMSwKLSMJc2NpZW50aWZpYyBzdGF0aW9uIDE5NDMvMTk2NywKLSMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBhIHNjaWVudGlmaWMgZXhwZWRpdGlvbiB3aW50ZXJlZCBieSBhY2NpZGVudCwKLSMJYW5kIGEgZ2Fycmlzb24gd2FzIGRlcGxveWVkIGJyaWVmbHkKLSMgSGFsbGV5LCBDb2F0ZXMgTGFuZCwgLTc1MzUtMDI2MDQsIHNpbmNlIDE5NTYtMDEtMDYKLSMJSGFsbGV5IGlzIG9uIGEgbW92aW5nIGljZSBzaGVsZiBhbmQgaXMgcGVyaW9kaWNhbGx5IHJlbG9jYXRlZAotIwlzbyB0aGF0IGl0IGlzIG5ldmVyIG1vcmUgdGhhbiAxMGttIGZyb20gaXRzIG5vbWluYWwgbG9jYXRpb24uCi0jIFJvdGhlcmEsIEFkZWxhaWRlIElzbGFuZCwgLTY3MzQtNjgwOCwgc2luY2UgMTk3Ni0xMi0wMQotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTEwLTIyKQotIyA8aHR0cDovL3dlYmV4aGliaXRzLm9yZy9kYXlsaWdodHNhdmluZy9nLmh0bWw+IHNheXMgUm90aGVyYSBpcyAtMDMgYWxsIHllYXIuCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFudGFyY3RpY2EvUm90aGVyYQkwCS0Jenp6CTE5NzYgRGVjICAxCi0JCQktMzowMAktCVJPVFQJIyBSb3RoZXJhIHRpbWUKLQotIyBVcnVndWF5IC0geWVhciByb3VuZCBiYXNlCi0jIEFydGlnYXMsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTEwNC0wNTg1MTA3Ci0KLSMgVVNBIC0geWVhci1yb3VuZCBiYXNlcwotIwotIyBQYWxtZXIsIEFudmVycyBJc2xhbmQsIHNpbmNlIDE5NjUgKG1vdmVkIDIgbWlsZXMgaW4gMTk2OCkKLSMKLSMgRnJvbSBFdGhhbiBEaWNrcyAoMTk5Ni0xMC0wNik6Ci0jIEl0IGtlZXBzIHRoZSBzYW1lIHRpbWUgYXMgUHVudGEgQXJlbmFzLCBDaGlsZSwgYmVjYXVzZSwganVzdCBsaWtlIHVzCi0jIGFuZCB0aGUgU291dGggUG9sZSwgdGhhdCdzIHRoZSBvdGhlciBlbmQgb2YgdGhlaXIgc3VwcGx5IGxpbmUuLi4uCi0jIEkgdmVyaWZpZWQgd2l0aCBzb21lb25lIHdobyB3YXMgdGhlcmUgdGhhdCBzaW5jZSAxOTgwLAotIyBQYWxtZXIgaGFzIGZvbGxvd2VkIENoaWxlLiAgUHJpb3IgdG8gdGhhdCwgYmVmb3JlIHRoZSBGYWxrbGFuZHMgV2FyLAotIyBQYWxtZXIgdXNlZCB0byBiZSBzdXBwbGllZCBmcm9tIEFyZ2VudGluYS4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW50YXJjdGljYS9QYWxtZXIJMAktCXp6egkxOTY1Ci0JCQktNDowMAlBcmdBUQlBUiVzVAkxOTY5IE9jdCA1Ci0JCQktMzowMAlBcmdBUQlBUiVzVAkxOTgyIE1heQotCQkJLTQ6MDAJQ2hpbGVBUQlDTCVzVAotIwotIwotIyBNY011cmRvLCBSb3NzIElzbGFuZCwgc2luY2UgMTk1NS0xMgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbnRhcmN0aWNhL01jTXVyZG8JMAktCXp6egkxOTU2Ci0JCQkxMjowMAlOWkFRCU5aJXNUCi0jCi0jIEFtdW5kc2VuLVNjb3R0LCBTb3V0aCBQb2xlLCBjb250aW51b3VzbHkgb2NjdXBpZWQgc2luY2UgMTk1Ni0xMS0yMAotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA5LTAzKToKLSMgTm9ybWFsbHkgaXQgd291bGRuJ3QgaGF2ZSBhIHNlcGFyYXRlIGVudHJ5LCBzaW5jZSBpdCdzIGxpa2UgdGhlCi0jIGxhcmdlciBBbnRhcmN0aWNhL01jTXVyZG8gc2luY2UgMTk3MCwgYnV0IGl0J3MgdG9vIGZhbW91cyB0byBvbWl0LgotIwotIyBGcm9tIENocmlzIENhcnJpZXIgKDE5OTYtMDYtMjcpOgotIyBTaXBsZSwgdGhlIGZpcnN0IGNvbW1hbmRlciBvZiB0aGUgU291dGggUG9sZSBzdGF0aW9uLAotIyBzdGF0ZWQgdGhhdCBoZSB3b3VsZCBoYXZlIGxpa2VkIHRvIGhhdmUga2VwdCBHTVQgYXQgdGhlIHN0YXRpb24sCi0jIGJ1dCB0aGF0IGhlIGZvdW5kIGl0IG1vcmUgY29udmVuaWVudCB0byBrZWVwIEdNVCsxMgotIyBhcyBzdXBwbGllcyBmb3IgdGhlIHN0YXRpb24gd2VyZSBjb21pbmcgZnJvbSBNY011cmRvIFNvdW5kLAotIyB3aGljaCB3YXMgb24gR01UKzEyIGJlY2F1c2UgTmV3IFplYWxhbmQgd2FzIG9uIEdNVCsxMiBhbGwgeWVhcgotIyBhdCB0aGF0IHRpbWUgKDE5NTcpLiAgKFNvdXJjZTogU2lwbGUncyBib29rIDkwIGRlZ3JlZXMgU09VVEguKQotIwotIyBGcm9tIFN1c2FuIFNtaXRoCi0jIGh0dHA6Ly93d3cuY3liZXJ0b3Vycy5jb20vd2hzL3BvbGUxMC5odG1sCi0jICgxOTk1LTExLTEzIDE2OjI0OjU2ICsxMzAwLCBubyBsb25nZXIgYXZhaWxhYmxlKToKLSMgV2UgdXNlIHRoZSBzYW1lIHRpbWUgYXMgTWNNdXJkbyBkb2VzLgotIyBBbmQgdGhleSB1c2UgdGhlIHNhbWUgdGltZSBhcyBDaHJpc3RjaHVyY2gsIE5aIGRvZXMuLi4uCi0jIE9uZSBsYXN0IHF1aXJrIGFib3V0IFNvdXRoIFBvbGUgdGltZS4KLSMgQWxsIHRoZSBlbGVjdHJpYyBjbG9ja3MgYXJlIHVzdWFsbHkgd3JvbmcuCi0jIFNvbWV0aGluZyBhYm91dCB0aGUgZ2VuZXJhdG9ycyBydW5uaW5nIGF0IDYwLjFoZXJ0eiBvciBzb21ldGhpbmcKLSMgbWFrZXMgYWxsIG9mIHRoZSBjbG9ja3MgcnVuIGZhc3QuICBTbyBldmVyeSBjb3VwbGUgb2YgZGF5cywKLSMgd2UgaGF2ZSB0byBnbyBhcm91bmQgYW5kIHNldCB0aGVtIGJhY2sgNSBtaW51dGVzIG9yIHNvLgotIyBNYXliZSBpZiB3ZSBsZXQgdGhlbSBydW4gZmFzdCBhbGwgb2YgdGhlIHRpbWUsIHdlJ2QgZ2V0IHRvIGxlYXZlIGhlcmUgc29vbmVyISEKLSMKLUxpbmsJQW50YXJjdGljYS9NY011cmRvCUFudGFyY3RpY2EvU291dGhfUG9sZQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYXNpYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2FzaWEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWY0MTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYXNpYQorKysgL2Rldi9udWxsCkBAIC0xLDIwNDMgKzAsMCBAQAotIyBAKCMpYXNpYQk4LjI0Ci0jIDxwcmU+Ci0KLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCi0jIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KLSMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIwotIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKLSMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAotIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgotIwotIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCi0jIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydAotIyBBc3NvY2lhdGlvbidzIFN0YW5kYXJkIFNjaGVkdWxlcyBJbmZvcm1hdGlvbiBNYW51YWwgKElBVEEgU1NJTSksCi0jIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCi0jIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgotIwotIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKLSMgZW50cmllcyB0aHJvdWdoIDE5OTAsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgotIwotIyBBbm90aGVyIHNvdXJjZSBvY2Nhc2lvbmFsbHkgdXNlZCBpcyBFZHdhcmQgVy4gV2hpdG1hbiwgV29ybGQgVGltZSBEaWZmZXJlbmNlcywKLSMgV2hpdG1hbiBQdWJsaXNoaW5nIENvLCAyIE5pYWdhcmEgQXYsIEVhbGluZywgTG9uZG9uICh1bmRhdGVkKSwgd2hpY2gKLSMgSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgotIwotIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKLSMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCi0jCi0jIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkIGAqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwotIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgotIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKLSMJICAgICBzdGQgIGRzdAotIwkgICAgIExNVAlMb2NhbCBNZWFuIFRpbWUKLSMJMjowMCBFRVQgIEVFU1QJRWFzdGVybiBFdXJvcGVhbiBUaW1lCi0jCTI6MDAgSVNUICBJRFQJSXNyYWVsCi0jCTM6MDAgQVNUICBBRFQJQXJhYmlhKgotIwkzOjMwIElSU1QgSVJEVAlJcmFuCi0jCTQ6MDAgR1NUCUd1bGYqCi0jCTU6MzAgSVNUCUluZGlhCi0jCTc6MDAgSUNUCUluZG9jaGluYSoKLSMJNzowMCBXSVQJd2VzdCBJbmRvbmVzaWEKLSMJODowMCBDSVQJY2VudHJhbCBJbmRvbmVzaWEKLSMJODowMCBDU1QJQ2hpbmEKLSMJOTowMCBDSlQJQ2VudHJhbCBKYXBhbmVzZSBUaW1lICgxODk2LzE5MzcpKgotIwk5OjAwIEVJVAllYXN0IEluZG9uZXNpYQotIwk5OjAwIEpTVCAgSkRUCUphcGFuCi0jCTk6MDAgS1NUICBLRFQJS29yZWEKLSMJOTozMCBDU1QJKEF1c3RyYWxpYW4pIENlbnRyYWwgU3RhbmRhcmQgVGltZQotIwotIyBTZWUgdGhlIGBldXJvcGUnIGZpbGUgZm9yIFJ1c3NpYSBhbmQgVHVya2V5IGluIEFzaWEuCi0KLSMgRnJvbSBHdXkgSGFycmlzOgotIyBJbmNvcnBvcmF0ZXMgZGF0YSBmb3IgU2luZ2Fwb3JlIGZyb20gUm9iZXJ0IEVseicgYXNpYSAxLjEsIGFzIHdlbGwgYXMKLSMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIFRvbSBZYXAsIFN1biBNaWNyb3N5c3RlbXMgSW50ZXJjb250aW5lbnRhbAotIyBUZWNobmljYWwgU3VwcG9ydCAoaW5jbHVkaW5nIGEgcGFnZSBmcm9tIHRoZSBPZmZpY2lhbCBBaXJsaW5lIEd1aWRlIC0KLSMgV29ybGR3aWRlIEVkaXRpb24pLiAgVGhlIG5hbWVzIGZvciB0aW1lIHpvbmVzIGFyZSBndWVzc2VzLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGhlc2UgcnVsZXMgYXJlIHN0b2xlbiBmcm9tIHRoZSBgZXVyb3BlJyBmaWxlLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRVVBc2lhCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDE6MDB1CTE6MDAJUwotUnVsZQlFVUFzaWEJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDE6MDB1CTAJLQotUnVsZQlFVUFzaWEJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMTowMHUJMAktCi1SdWxlIEUtRXVyQXNpYQkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAwOjAwCTE6MDAJUwotUnVsZSBFLUV1ckFzaWEJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlIEUtRXVyQXNpYQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAwOjAwCTAJLQotUnVsZSBSdXNzaWFBc2lhCTE5ODEJMTk4NAktCUFwcgkxCSAwOjAwCTE6MDAJUwotUnVsZSBSdXNzaWFBc2lhCTE5ODEJMTk4MwktCU9jdAkxCSAwOjAwCTAJLQotUnVsZSBSdXNzaWFBc2lhCTE5ODQJMTk5MQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLVJ1bGUgUnVzc2lhQXNpYQkxOTg1CTE5OTEJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlIFJ1c3NpYUFzaWEJMTk5Mglvbmx5CS0JTWFyCWxhc3RTYXQJMjM6MDAJMTowMAlTCi1SdWxlIFJ1c3NpYUFzaWEJMTk5Mglvbmx5CS0JU2VwCWxhc3RTYXQJMjM6MDAJMAktCi1SdWxlIFJ1c3NpYUFzaWEJMTk5MwltYXgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlIFJ1c3NpYUFzaWEJMTk5MwkxOTk1CS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZSBSdXNzaWFBc2lhCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDI6MDBzCTAJLQotCi0jIEFmZ2hhbmlzdGFuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvS2FidWwJNDozNjo0OCAtCUxNVAkxODkwCi0JCQk0OjAwCS0JQUZUCTE5NDUKLQkJCTQ6MzAJLQlBRlQKLQotIyBBcm1lbmlhCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgaGF2ZSBZZXJldmFuIHN3aXRjaGluZyB0byAzOjAwICh3aXRoIFJ1c3NpYW4gRFNUKQotIyBpbiBzcHJpbmcgMTk5MSwgdGhlbiB0byA0OjAwIHdpdGggbm8gRFNUIGluIGZhbGwgMTk5NSwgdGhlbgotIyByZWFkb3B0aW5nIFJ1c3NpYW4gRFNUIGluIDE5OTcuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciwgZXZlbgotIyB3aGVuIHRoZXkgZGlzYWdyZWUgd2l0aCBvdGhlcnMuICBFZGdhciBEZXItRGFuaWVsaWFudHoKLSMgcmVwb3J0ZWQgKDE5OTYtMDUtMDQpIHRoYXQgWWVyZXZhbiBwcm9iYWJseSB3b3VsZG4ndCB1c2UgRFNUCi0jIGluIDE5OTYsIHRob3VnaCBpdCBkaWQgdXNlIERTVCBpbiAxOTk1LiAgSUFUQSBTU0lNICgxOTkxLzE5OTgpIHJlcG9ydHMgdGhhdAotIyBBcm1lbmlhIHN3aXRjaGVkIGZyb20gMzowMCB0byA0OjAwIGluIDE5OTggYW5kIG9ic2VydmVkIERTVCBhZnRlciAxOTkxLAotIyBidXQgc3RhcnRlZCBzd2l0Y2hpbmcgYXQgMzowMHMgaW4gMTk5OC4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9ZZXJldmFuCTI6NTg6MDAgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTM6MDAJLQlZRVJUCTE5NTcgTWFyICAgICMgWWVyZXZhbiBUaW1lCi0JCQk0OjAwIFJ1c3NpYUFzaWEgWUVSJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkzOjAwCTE6MDAJWUVSU1QJMTk5MSBTZXAgMjMgIyBpbmRlcGVuZGVuY2UKLQkJCTM6MDAgUnVzc2lhQXNpYQlBTSVzVAkxOTk1IFNlcCAyNCAyOjAwcwotCQkJNDowMAktCUFNVAkxOTk3Ci0JCQk0OjAwIFJ1c3NpYUFzaWEJQU0lc1QKLQotIyBBemVyYmFpamFuCi0jIEZyb20gUnVzdGFtIEFsaXlldiBvZiB0aGUgQXplcmJhaWphbiBJbnRlcm5ldCBGb3J1bSAoMjAwNS0xMC0yMyk6Ci0jIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBDYWJpbmV0IG9mIE1pbmlzdGVycywgMTk5NwotIyBSZXNvbHV0aW9uIGF2YWlsYWJsZSBhdDogaHR0cDovL2FpZi5hei9kb2NzL2RheWxpZ2h0X3Jlcy5wZGYKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUF6ZXIJMTk5NwltYXgJLQlNYXIJbGFzdFN1bgkgNDowMAkxOjAwCVMKLVJ1bGUJQXplcgkxOTk3CW1heAktCU9jdAlsYXN0U3VuCSA1OjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0Jha3UJMzoxOToyNCAtCUxNVAkxOTI0IE1heSAgMgotCQkJMzowMAktCUJBS1QJMTk1NyBNYXIgICAgIyBCYWt1IFRpbWUKLQkJCTQ6MDAgUnVzc2lhQXNpYSBCQUslc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTM6MDAJMTowMAlCQUtTVAkxOTkxIEF1ZyAzMCAjIGluZGVwZW5kZW5jZQotCQkJMzowMCBSdXNzaWFBc2lhCUFaJXNUCTE5OTIgU2VwIGxhc3RTYXQgMjM6MDAKLQkJCTQ6MDAJLQlBWlQJMTk5NiAjIEF6ZXJiYWlqYW4gdGltZQotCQkJNDowMAlFVUFzaWEJQVolc1QJMTk5NwotCQkJNDowMAlBemVyCUFaJXNUCi0KLSMgQmFocmFpbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0JhaHJhaW4JMzoyMjoyMCAtCUxNVAkxOTIwCQkjIEFsIE1hbmFtYWgKLQkJCTQ6MDAJLQlHU1QJMTk3MiBKdW4KLQkJCTM6MDAJLQlBU1QKLQotIyBCYW5nbGFkZXNoCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGhha2EJNjowMTo0MCAtCUxNVAkxODkwCi0JCQk1OjUzOjIwCS0JSE1UCTE5NDEgT2N0ICAgICMgSG93cmFoIE1lYW4gVGltZT8KLQkJCTY6MzAJLQlCVVJUCTE5NDIgTWF5IDE1ICMgQnVybWEgVGltZQotCQkJNTozMAktCUlTVAkxOTQyIFNlcAotCQkJNjozMAktCUJVUlQJMTk1MSBTZXAgMzAKLQkJCTY6MDAJLQlEQUNUCTE5NzEgTWFyIDI2ICMgRGFjY2EgVGltZQotCQkJNjowMAktCUJEVAkjIEJhbmdsYWRlc2ggVGltZQotCi0jIEJodXRhbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RoaW1waHUJNTo1ODozNiAtCUxNVAkxOTQ3IEF1ZyAxNSAjIG9yIFRoaW1idQotCQkJNTozMAktCUlTVAkxOTg3IE9jdAotCQkJNjowMAktCUJUVAkjIEJodXRhbiBUaW1lCi0KLSMgQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5Ci0jIFdoaXRtYW4gYW5kIHRoZSAxOTk1IENJQSB0aW1lIHpvbmUgbWFwIHNheSA1OjAwLCBidXQgdGhlCi0jIDE5OTcgYW5kIGxhdGVyIG1hcHMgc2F5IDY6MDAuICBBc3N1bWUgdGhlIHN3aXRjaCBvY2N1cnJlZCBpbiAxOTk2LgotIyBXZSBoYXZlIG5vIGluZm9ybWF0aW9uIGFzIHRvIHdoZW4gc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZDsKLSMgYXNzdW1lIGl0IG9jY3VycmVkIGluIDE5MDcsIHRoZSBzYW1lIHllYXIgYXMgTWF1cml0aXVzICh3aGljaAotIyB0aGVuIGNvbnRhaW5lZCB0aGUgQ2hhZ29zIEFyY2hpcGVsYWdvKS4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJSW5kaWFuL0NoYWdvcwk0OjQ5OjQwCS0JTE1UCTE5MDcKLQkJCTU6MDAJLQlJT1QJMTk5NiAjIEJJT1QgVGltZQotCQkJNjowMAktCUlPVAotCi0jIEJydW5laQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0JydW5laQk3OjM5OjQwIC0JTE1UCTE5MjYgTWFyICAgIyBCYW5kYXIgU2VyaSBCZWdhd2FuCi0JCQk3OjMwCS0JQk5UCTE5MzMKLQkJCTg6MDAJLQlCTlQKLQotIyBCdXJtYSAvIE15YW5tYXIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9SYW5nb29uCTY6MjQ6NDAgLQlMTVQJMTg4MAkJIyBvciBZYW5nb24KLQkJCTY6MjQ6MzYJLQlSTVQJMTkyMAkgICAjIFJhbmdvb24gTWVhbiBUaW1lPwotCQkJNjozMAktCUJVUlQJMTk0MiBNYXkgICAjIEJ1cm1hIFRpbWUKLQkJCTk6MDAJLQlKU1QJMTk0NSBNYXkgMwotCQkJNjozMAktCU1NVAkJICAgIyBNeWFubWFyIFRpbWUKLQotIyBDYW1ib2RpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1Bobm9tX1BlbmgJNjo1OTo0MCAtCUxNVAkxOTA2IEp1biAgOQotCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAwOjAxICMgU2FpZ29uIE1UPwotCQkJNzowMAktCUlDVAkxOTEyIE1heQotCQkJODowMAktCUlDVAkxOTMxIE1heQotCQkJNzowMAktCUlDVAotCi0jIENoaW5hCi0KLSMgRnJvbSBHdXkgSGFycmlzOgotIyBQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYS4gIFllcywgdGhleSByZWFsbHkgaGF2ZSBvbmx5IG9uZSB0aW1lIHpvbmUuCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgTm8gdGhleSBkb24ndC4gIFNlZSBUSU1FIG1hZywgMTk4Ni0wMi0xNyBwLjUyLiAgRXZlbiB0aG91Z2gKLSMgQ2hpbmEgaXMgYWNyb3NzIDQgcGh5c2ljYWwgdGltZSB6b25lcywgYmVmb3JlIEZlYiAxLCAxOTg2IG9ubHkgdGhlCi0jIFBla2luZyAoQmVqaW5nKSB0aW1lIHpvbmUgd2FzIHJlY29nbml6ZWQuICBTaW5jZSB0aGF0IGRhdGUsIENoaW5hCi0jIGhhcyB0d28gb2YgJ2VtIC0tIFBla2luZydzIGFuZCBVcnVtcWkgKG5hbWVkIGFmdGVyIHRoZSBjYXBpdGFsIG9mCi0jIHRoZSBYaW5qaWFuZyBVeWdodXIgQXV0b25vbW91cyBSZWdpb24pLiAgSSBkb24ndCBrbm93IGFib3V0IERTVCBmb3IgaXQuCi0jCi0jIC4gLiAuSSBqdXN0IGRlbGV0ZWQgdGhlIERTVCB0YWJsZSBhbmQgdGhpcyBlZGl0b3IgbWFrZXMgaXQgdG9vCi0jIHBhaW5mdWwgdG8gc3VjayBpbiBhbm90aGVyIGNvcHkuLiAgU28sIGhlcmUgaXMgd2hhdCBJIGhhdmUgZm9yCi0jIERTVCBzdGFydC9lbmQgZGF0ZXMgZm9yIFBla2luZydzIHRpbWUgem9uZSAoaW5mbyBmcm9tIEFQKToKLSMKLSMgICAgIDE5ODYgTWF5IDQgLSBTZXB0IDE0Ci0jICAgICAxOTg3IG1pZC1BcHJpbCAtID8/Ci0KLSMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OS0wMS0xOSk6Ci0jIENISU5BICAgICAgICAgICAgICAgOCBIICBBSEVBRCBPRiBVVEMgIEFMTCBPRiBDSElOQSwgSU5DTCBUQUlXQU4KLSMgQ0hJTkEgICAgICAgICAgICAgICA5IEggIEFIRUFEIE9GIFVUQyAgQVBSIDE3IC0gU0VQIDEwCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IENoaW5hIChleGNlcHQgZm9yIEhvbmcgS29uZyBhbmQgTWFjYXUpCi0jIGhhcyBoYWQgYSBzaW5nbGUgdGltZSB6b25lIHNpbmNlIDE5ODAgTWF5IDEsIG9ic2VydmluZyBzdW1tZXIgRFNUCi0jIGZyb20gMTk4NiB0aHJvdWdoIDE5OTE7IHRoaXMgY29udHJhZGljdHMgRGV2aW5lJ3MKLSMgbm90ZSBhYm91dCBUaW1lIG1hZ2F6aW5lLCB0aG91Z2ggYXBwYXJlbnRseSBfc29tZXRoaW5nXyBoYXBwZW5lZCBpbiAxOTg2LgotIyBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciBmb3Igbm93LiAgSSBtYWRlIHVwIG5hbWVzIGZvciB0aGUgb3RoZXIKLSMgcHJlLTE5ODAgdGltZSB6b25lcy4KLQotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVNoYW5nCTE5NDAJb25seQktCUp1bgkgMwkwOjAwCTE6MDAJRAotUnVsZQlTaGFuZwkxOTQwCTE5NDEJLQlPY3QJIDEJMDowMAkwCVMKLVJ1bGUJU2hhbmcJMTk0MQlvbmx5CS0JTWFyCTE2CTA6MDAJMTowMAlECi1SdWxlCVBSQwkxOTg2CW9ubHkJLQlNYXkJIDQJMDowMAkxOjAwCUQKLVJ1bGUJUFJDCTE5ODYJMTk5MQktCVNlcAlTdW4+PTExCTA6MDAJMAlTCi1SdWxlCVBSQwkxOTg3CTE5OTEJLQlBcHIJU3VuPj0xMAkwOjAwCTE6MDAJRAotCi0jIEZyb20gQW50aG9ueSBGb2sgKDIwMDEtMTItMjApOgotIyBCVFcsIEkgZGlkIHNvbWUgcmVzZWFyY2ggb24tbGluZSBhbmQgZm91bmQgc29tZSBpbmZvIHJlZ2FyZGluZyB0aGVzZSBmaXZlCi0jIGhpc3RvcmljIHRpbWV6b25lcyBmcm9tIHNvbWUgVGFpd2FuIHdlYnNpdGVzLiAgQW5kIHllcywgdGhlcmUgYXJlIG9mZmljaWFsCi0jIENoaW5lc2UgbmFtZXMgZm9yIHRoZXNlIGxvY2FsZXMgKGJlZm9yZSAxOTQ5KS4KLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDctMTQpOgotIyBJIGhhdmUgaW52ZXN0aWdhdGVkIHRoZSB0aW1lem9uZXMgYXJvdW5kIDE5NzAgb24gdGhlCi0jIGh0dHA6Ly93d3cuYXN0cm8uY29tL2F0bGFzIHNpdGUgW3dpdGggcHJvdmluY2VzIGFuZCBjb3VudHkKLSMgYm91bmRhcmllcyBzdW1tYXJpemVkIGJlbG93XS4uLi4gIEEgZmV3IG90aGVyIGV4Y2VwdGlvbnMgd2VyZSB0d28KLSMgY291bnRpZXMgb24gdGhlIFNpY2h1YW4gc2lkZSBvZiB0aGUgWGl6YW5nLVNpY2h1YW4gYm9yZGVyLAotIyBjb3VudGllcyBEZWdlIGFuZCBCYWl5dSB3aGljaCBsaWVzIG9uIHRoZSBTaWNodWFuIHNpZGUgYW5kIGFyZQotIyB0aGVyZWZvcmUgc3VwcG9zZWQgdG8gYmUgR01UKzcsIFhpemFuZyByZWdpb24gYmVpbmcgR01UKzYsIGJ1dCBEZWdlCi0jIGNvdW50eSBpcyBHTVQrOCBhY2NvcmRpbmcgdG8gYXN0cm8uY29tIHdoaWxlIEJhaXl1IGNvdW50eSBpcyBHTVQrNgotIyAoY291bGQgYmUgdHJ1ZSksIGZvciB0aGUgbW9tZW50IEkgYW0gYXNzdW1pbmcgdGhhdCB0aG9zZSB0d28KLSMgY291bnRpZXMgYXJlIG1pc3Rha2VzIGluIHRoZSBhc3Ryby5jb20gZGF0YS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTAyLTExKToKLSMgSSBqdXN0IG5vdyBjaGVja2VkIEdvb2dsZSBOZXdzIGZvciB3ZXN0ZXJuIG5ld3Mgc291cmNlcyB0aGF0IHRhbGsKLSMgYWJvdXQgQ2hpbmEncyBzaW5nbGUgdGltZSB6b25lLCBhbmQgY291bGRuJ3QgZmluZCBhbnl0aGluZyBiZWZvcmUgMTk4NgotIyB0YWxraW5nIGFib3V0IENoaW5hIGJlaW5nIGluIG9uZSB0aW1lIHpvbmUuICAoVGhhdCBhcnRpY2xlIHdhczogSmltCi0jIE1hbm4sICJBIGNsdW1zeSBlbWJyYWNlIGZvciBhbm90aGVyIHdlc3Rlcm4gY3VzdG9tOiBDaGluYSBvbiBkYXlsaWdodAotIyB0aW1lLS1zb3J0IG9mIiwgTG9zIEFuZ2VsZXMgVGltZXMsIDE5ODYtMDUtMDUuICBCeSB0aGUgd2F5LCB0aGlzCi0jIGFydGljbGUgY29uZmlybXMgdGhlIHR6IGRhdGFiYXNlJ3MgZGF0YSBjbGFpbWluZyB0aGF0IENoaW5hIGJlZ2FuCi0jIG9ic2VydmluZyBkYXlsaWdodCBzYXZpbmcgdGltZSBpbiAxOTg2LgotIwotIyBGcm9tIFRob21hcyBTLiBNdWxsYW5leSAoMjAwOC0wMi0xMSk6Ci0jIEkgdGhpbmsgeW91J3JlIGNvbWJpbmluZyB0d28gc3ViamVjdHMgdGhhdCBuZWVkIHRvIHRyZWF0ZWQgCi0jIHNlcGFyYXRlbHk6IGRheWxpZ2h0IHNhdmluZ3MgKHdoaWNoLCB5b3UncmUgY29ycmVjdCwgd2Fzbid0IAotIyBpbXBsZW1lbnRlZCB1bnRpbCB0aGUgMTk4MHMpIGFuZCB0aGUgdW5pZmllZCB0aW1lIHpvbmUgY2VudGVyZWQgbmVhciAKLSMgQmVpamluZyAod2hpY2ggd2FzIGltcGxlbWVudGVkIGluIDE5NDkpLiBCcmllZmx5LCB0aGVyZSB3YXMgYWxzbyBhIAotIyAiTGhhc2EgVGltZSIgaW4gVGliZXQgYW5kICJVcnVtcWkgVGltZSIgaW4gWGluamlhbmcuIFRoZSBmaXJzdCB3YXMgCi0jIGNlYXNlZCwgYW5kIHRoZSBzZWNvbmQgZXZlbnR1YWxseSByZWNvZ25pemVkIChhZ2FpbiwgaW4gdGhlIDE5ODBzKS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwOC0wNi0zMCk6Ci0jIFRoZXJlIHNlZW1zIHRvIGJlIGEgZ29vZCBjaGFuY2UgQ2hpbmEgc3dpdGNoZWQgdG8gYSBzaW5nbGUgdGltZSB6b25lIGluIDE5NDkKLSMgcmF0aGVyIHRoYW4gaW4gMTk4MCBhcyBTaGFua3MgJiBQb3R0ZW5nZXIgaGF2ZSBpdCwgYnV0IHdlIGRvbid0IGhhdmUgYQotIyByZWxpYWJsZSBkb2N1bWVudGFyeSBzb3VyY2Ugc2F5aW5nIHNvIHlldCwgc28gZm9yIG5vdyB3ZSBzdGlsbCBnbyB3aXRoCi0jIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBDaGFuZ2JhaSBUaW1lICgiTG9uZy13aGl0ZSBUaW1lIiwgTG9uZy13aGl0ZSA9IEhlaWxvbmdqaWFuZyBhcmVhKQotIyBIZWlsb25namlhbmcgKGV4Y2VwdCBNb2hlIGNvdW50eSksIEppbGluCi1ab25lCUFzaWEvSGFyYmluCTg6MjY6NDQJLQlMTVQJMTkyOCAjIG9yIEhhZXJiaW4KLQkJCTg6MzAJLQlDSEFUCTE5MzIgTWFyICMgQ2hhbmdiYWkgVGltZQotCQkJODowMAktCUNTVAkxOTQwCi0JCQk5OjAwCS0JQ0hBVAkxOTY2IE1heQotCQkJODozMAktCUNIQVQJMTk4MCBNYXkKLQkJCTg6MDAJUFJDCUMlc1QKLSMgWmhvbmd5dWFuIFRpbWUgKCJDZW50cmFsIHBsYWluIFRpbWUiKQotIyBtb3N0IG9mIENoaW5hCi1ab25lCUFzaWEvU2hhbmdoYWkJODowNTo1MgktCUxNVAkxOTI4Ci0JCQk4OjAwCVNoYW5nCUMlc1QJMTk0OQotCQkJODowMAlQUkMJQyVzVAotIyBMb25nLXNodSBUaW1lIChwcm9iYWJseSBkdWUgdG8gTG9uZyBhbmQgU2h1IGJlaW5nIHR3byBuYW1lcyBvZiB0aGF0IGFyZWEpCi0jIEd1YW5neGksIEd1aXpob3UsIEhhaW5hbiwgTmluZ3hpYSwgU2ljaHVhbiwgU2hhYW54aSwgYW5kIFl1bm5hbjsKLSMgbW9zdCBvZiBHYW5zdTsgd2VzdCBJbm5lciBNb25nb2xpYTsgd2VzdCBRaW5naGFpOyBhbmQgdGhlIEd1YW5nZG9uZwotIyBjb3VudGllcyBEZXFpbmcsIEVucGluZywgS2FpcGluZywgTHVvZGluZywgVGFpc2hhbiwgWGlueGluZywKLSMgWWFuZ2NodW4sIFlhbmdqaWFuZywgWXUnbmFuLCBhbmQgWXVuZnUuCi1ab25lCUFzaWEvQ2hvbmdxaW5nCTc6MDY6MjAJLQlMTVQJMTkyOCAjIG9yIENodW5na2luZwotCQkJNzowMAktCUxPTlQJMTk4MCBNYXkgIyBMb25nLXNodSBUaW1lCi0JCQk4OjAwCVBSQwlDJXNUCi0jIFhpbi16YW5nIFRpbWUgKCJYaW5qaWFuZy1UaWJldCBUaW1lIikKLSMgVGhlIEdhbnN1IGNvdW50aWVzIEFrc2F5LCBBbnhpLCBEdW5odWFuZywgU3ViZWk7IHdlc3QgUWluZ2hhaTsKLSMgdGhlIEd1YW5nZG9uZyBjb3VudGllcyAgWHV3ZW4sIEhhaWthbmcsIFN1aXhpLCBMaWFuamlhbmcsCi0jIFpoYW5qaWFuZywgV3VjaHVhbiwgSHVhemhvdSwgR2FvemhvdSwgTWFvbWluZywgRGlhbmJhaSwgYW5kIFhpbnlpOwotIyBlYXN0IFRpYmV0LCBpbmNsdWRpbmcgTGhhc2EsIENoYW1kbywgU2hpZ2Fpc2UsIEppbXNhciwgU2hhd2FuIGFuZCBIdXR1Ymk7Ci0jIGVhc3QgWGluamlhbmcsIGluY2x1ZGluZyBVcnVtcWksIFR1cnBhbiwgS2FyYW1heSwgS29ybGEsIE1pbmZlbmcsIEppbmdoZSwKLSMgV3VzdSwgUWllbW8sIFhpbnlhbiwgV3VsYW53dXN1LCBKaW5naGUsIFl1bWluLCBUYWNoZW5nLCBUdW9saSwgRW1pbiwKLSMgU2hpaGV6aSwgQ2hhbmdqaSwgWWFucWksIEhlc2h1bywgVHVva2V4dW4sIFR1bHVmYW4sIFNoYW5zaGFuLCBIYW1pLAotIyBGdWthbmcsIEt1aXR1biwgS3VtdWt1bGksIE1pcXVhbiwgUWl0YWksIGFuZCBUdXJmYW4uCi1ab25lCUFzaWEvVXJ1bXFpCTU6NTA6MjAJLQlMTVQJMTkyOCAjIG9yIFVydW1jaGkKLQkJCTY6MDAJLQlVUlVUCTE5ODAgTWF5ICMgVXJ1bXFpIFRpbWUKLQkJCTg6MDAJUFJDCUMlc1QKLSMgS3VubHVuIFRpbWUKLSMgV2VzdCBUaWJldCwgaW5jbHVkaW5nIFB1bGFuLCBBaGVxaSwgU2h1ZnUsIFNodWxlOwotIyBXZXN0IFhpbmppYW5nLCBpbmNsdWRpbmcgQWtzdSwgQXR1c2hpLCBZaW5pbmcsIEhldGlhbiwgQ2VsZSwgTHVvcHUsIE5pbGVrZSwKLSMgWmhhb3N1LCBUZWtlc2ksIEdvbmdsaXUsIENoYWJ1Y2hhZXIsIEh1b2NoZW5nLCBCb2xlLCBQaXNoYW4sIFN1aWRpbmcsCi0jIGFuZCBZYXJrYW5kLgotWm9uZQlBc2lhL0thc2hnYXIJNTowMzo1NgktCUxNVAkxOTI4ICMgb3IgS2FzaGkgb3IgS2F4Z2FyCi0JCQk1OjMwCS0JS0FTVAkxOTQwCSAjIEthc2hnYXIgVGltZQotCQkJNTowMAktCUtBU1QJMTk4MCBNYXkKLQkJCTg6MDAJUFJDCUMlc1QKLQotIyBIb25nIEtvbmcgKFhpYW5nZ2FuZykKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUhLCTE5NDYJb25seQktCUFwcgkyMAkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTQ2CW9ubHkJLQlEZWMJMQkzOjMwCTAJLQotUnVsZQlISwkxOTQ3CW9ubHkJLQlBcHIJMTMJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk0Nwlvbmx5CS0JRGVjCTMwCTM6MzAJMAktCi1SdWxlCUhLCTE5NDgJb25seQktCU1heQkyCTM6MzAJMTowMAlTCi1SdWxlCUhLCTE5NDgJMTk1MgktCU9jdAlsYXN0U3VuCTM6MzAJMAktCi1SdWxlCUhLCTE5NDkJMTk1MwktCUFwcglTdW4+PTEJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk1Mwlvbmx5CS0JTm92CTEJMzozMAkwCS0KLVJ1bGUJSEsJMTk1NAkxOTY0CS0JTWFyCVN1bj49MTgJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk1NAlvbmx5CS0JT2N0CTMxCTM6MzAJMAktCi1SdWxlCUhLCTE5NTUJMTk2NAktCU5vdglTdW4+PTEJMzozMAkwCS0KLVJ1bGUJSEsJMTk2NQkxOTc3CS0JQXByCVN1bj49MTYJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk2NQkxOTc3CS0JT2N0CVN1bj49MTYJMzozMAkwCS0KLVJ1bGUJSEsJMTk3OQkxOTgwCS0JTWF5CVN1bj49OAkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTc5CTE5ODAJLQlPY3QJU3VuPj0xNgkzOjMwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0hvbmdfS29uZwk3OjM2OjM2IC0JTE1UCTE5MDQgT2N0IDMwCi0JCQk4OjAwCUhLCUhLJXNUCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRhaXdhbgotCi0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IFRhaXdhbiBvYnNlcnZlZCBEU1QgZHVyaW5nIDE5NDUsIHdoZW4gaXQKLSMgd2FzIHN0aWxsIGNvbnRyb2xsZWQgYnkgSmFwYW4uICBUaGlzIGlzIGhhcmQgdG8gYmVsaWV2ZSwgYnV0IHdlIGRvbid0Ci0jIGhhdmUgYW55IG90aGVyIGluZm9ybWF0aW9uLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUYWl3YW4JMTk0NQkxOTUxCS0JTWF5CTEJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NDUJMTk1MQktCU9jdAkxCTA6MDAJMAlTCi1SdWxlCVRhaXdhbgkxOTUyCW9ubHkJLQlNYXIJMQkwOjAwCTE6MDAJRAotUnVsZQlUYWl3YW4JMTk1MgkxOTU0CS0JTm92CTEJMDowMAkwCVMKLVJ1bGUJVGFpd2FuCTE5NTMJMTk1OQktCUFwcgkxCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTU1CTE5NjEJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlUYWl3YW4JMTk2MAkxOTYxCS0JSnVuCTEJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NzQJMTk3NQktCUFwcgkxCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTc0CTE5NzUJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlUYWl3YW4JMTk4MAlvbmx5CS0JSnVuCTMwCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTgwCW9ubHkJLQlTZXAJMzAJMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9UYWlwZWkJODowNjowMCAtCUxNVAkxODk2ICMgb3IgVGFpYmVpIG9yIFQnYWktcGVpCi0JCQk4OjAwCVRhaXdhbglDJXNUCi0KLSMgTWFjYXUgKE1hY2FvLCBBb21lbikKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU1hY2F1CTE5NjEJMTk2MgktCU1hcglTdW4+PTE2CTM6MzAJMTowMAlTCi1SdWxlCU1hY2F1CTE5NjEJMTk2NAktCU5vdglTdW4+PTEJMzozMAkwCS0KLVJ1bGUJTWFjYXUJMTk2Mwlvbmx5CS0JTWFyCVN1bj49MTYJMDowMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk2NAlvbmx5CS0JTWFyCVN1bj49MTYJMzozMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk2NQlvbmx5CS0JTWFyCVN1bj49MTYJMDowMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk2NQlvbmx5CS0JT2N0CTMxCTA6MDAJMAktCi1SdWxlCU1hY2F1CTE5NjYJMTk3MQktCUFwcglTdW4+PTE2CTM6MzAJMTowMAlTCi1SdWxlCU1hY2F1CTE5NjYJMTk3MQktCU9jdAlTdW4+PTE2CTM6MzAJMAktCi1SdWxlCU1hY2F1CTE5NzIJMTk3NAktCUFwcglTdW4+PTE1CTA6MDAJMTowMAlTCi1SdWxlCU1hY2F1CTE5NzIJMTk3MwktCU9jdAlTdW4+PTE1CTA6MDAJMAktCi1SdWxlCU1hY2F1CTE5NzQJMTk3NwktCU9jdAlTdW4+PTE1CTM6MzAJMAktCi1SdWxlCU1hY2F1CTE5NzUJMTk3NwktCUFwcglTdW4+PTE1CTM6MzAJMTowMAlTCi1SdWxlCU1hY2F1CTE5NzgJMTk4MAktCUFwcglTdW4+PTE1CTA6MDAJMTowMAlTCi1SdWxlCU1hY2F1CTE5NzgJMTk4MAktCU9jdAlTdW4+PTE1CTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvTWFjYXUJNzozNDoyMCAtCUxNVAkxOTEyCi0JCQk4OjAwCU1hY2F1CU1PJXNUCTE5OTkgRGVjIDIwICMgcmV0dXJuIHRvIENoaW5hCi0JCQk4OjAwCVBSQwlDJXNUCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEN5cHJ1cwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ3lwcnVzCTE5NzUJb25seQktCUFwcgkxMwkwOjAwCTE6MDAJUwotUnVsZQlDeXBydXMJMTk3NQlvbmx5CS0JT2N0CTEyCTA6MDAJMAktCi1SdWxlCUN5cHJ1cwkxOTc2CW9ubHkJLQlNYXkJMTUJMDowMAkxOjAwCVMKLVJ1bGUJQ3lwcnVzCTE5NzYJb25seQktCU9jdAkxMQkwOjAwCTAJLQotUnVsZQlDeXBydXMJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkwOjAwCTE6MDAJUwotUnVsZQlDeXBydXMJMTk3Nwlvbmx5CS0JU2VwCTI1CTA6MDAJMAktCi1SdWxlCUN5cHJ1cwkxOTc4CW9ubHkJLQlPY3QJMgkwOjAwCTAJLQotUnVsZQlDeXBydXMJMTk3OQkxOTk3CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJQ3lwcnVzCTE5ODEJMTk5OAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvTmljb3NpYQkyOjEzOjI4IC0JTE1UCTE5MjEgTm92IDE0Ci0JCQkyOjAwCUN5cHJ1cwlFRSVzVAkxOTk4IFNlcAotCQkJMjowMAlFVUFzaWEJRUUlc1QKLSMgSUFUQSBTU0lNICgxOTk4LTA5KSBoYXMgQ3lwcnVzIHVzaW5nIEVVIHJ1bGVzIGZvciB0aGUgZmlyc3QgdGltZS4KLQotIyBDbGFzc2ljYWxseSwgQ3lwcnVzIGJlbG9uZ3MgdG8gQXNpYTsgZS5nLiBzZWUgSGVyb2RvdHVzLCBIaXN0b3JpZXMsIEkuNzIuCi0jIEhvd2V2ZXIsIGZvciB2YXJpb3VzIHJlYXNvbnMgbWFueSB1c2VycyBleHBlY3QgdG8gZmluZCBpdCB1bmRlciBFdXJvcGUuCi1MaW5rCUFzaWEvTmljb3NpYQlFdXJvcGUvTmljb3NpYQotCi0jIEdlb3JnaWEKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NC0xMS0xOSk6Ci0jIFRvZGF5J3MgX0Vjb25vbWlzdF8gKHAgNjApIHJlcG9ydHMgdGhhdCBHZW9yZ2lhIG1vdmVkIGl0cyBjbG9ja3MgZm9yd2FyZAotIyBhbiBob3VyIHJlY2VudGx5LCBkdWUgdG8gYSBsYXcgcHJvcG9zZWQgYnkgWnVyYWIgTXVydmFuaWR6ZSwKLSMgYW4gTVAgd2hvIHdlbnQgb24gYSBodW5nZXIgc3RyaWtlIGZvciAxMSBkYXlzIHRvIGZvcmNlIGRpc2N1c3Npb24gYWJvdXQgaXQhCi0jIFdlIGhhdmUgbm8gZGV0YWlscywgYnV0IHdlJ2xsIGd1ZXNzIHRoZXkgZGlkbid0IG1vdmUgdGhlIGNsb2NrcyBiYWNrIGluIGZhbGwuCi0jCi0jIEZyb20gTWF0aGV3IEVuZ2xhbmRlciwgcXVvdGluZyBBUCAoMTk5Ni0xMC0yMyAxMzowNS0wNCk6Ci0jIEluc3RlYWQgb2YgcHV0dGluZyBiYWNrIGNsb2NrcyBhdCB0aGUgZW5kIG9mIE9jdG9iZXIsIEdlb3JnaWEKLSMgd2lsbCBzdGF5IG9uIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB0aGlzIHdpbnRlciB0byBzYXZlIGVuZXJneSwKLSMgUHJlc2lkZW50IEVkdWFyZCBTaGV2YXJkbmFkemUgZGVjcmVlZCBXZWRuZXNkYXkuCi0jCi0jIEZyb20gdGhlIEJCQyB2aWEgSm9zZXBoIFMuIE15ZXJzICgyMDA0LTA2LTI3KToKLSMKLSMgR2VvcmdpYSBtb3ZlZCBjbG9zZXIgdG8gV2VzdGVybiBFdXJvcGUgb24gU3VuZGF5Li4uICBUaGUgZm9ybWVyIFNvdmlldAotIyByZXB1YmxpYyBoYXMgY2hhbmdlZCBpdHMgdGltZSB6b25lIGJhY2sgdG8gdGhhdCBvZiBNb3Njb3cuICBBcyBhIHJlc3VsdCBpdAotIyBpcyBub3cganVzdCBmb3VyIGhvdXJzIGFoZWFkIG9mIEdyZWVud2ljaCBNZWFuIFRpbWUsIHJhdGhlciB0aGFuIGZpdmUgaG91cnMKLSMgYWhlYWQuICBUaGUgc3dpdGNoIHdhcyBkZWNyZWVkIGJ5IHRoZSBwcm8tV2VzdGVybiBwcmVzaWRlbnQgb2YgR2VvcmdpYSwKLSMgTWlraGFpbCBTYWFrYXNodmlsaSwgd2hvIHNhaWQgdGhlIGNoYW5nZSB3YXMgcGFydGx5IHByb21wdGVkIGJ5IHRoZSBwcm9jZXNzCi0jIG9mIGludGVncmF0aW9uIGludG8gRXVyb3BlLgotCi0jIEZyb20gVGVpbXVyYXogQWJhc2hpZHplICgyMDA1LTExLTA3KToKLSMgR292ZXJubWVudCBvZiBHZW9yZ2lhIC4uLiBkZWNpZGVkIHRvIE5PVCBDSEFOR0UgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIG9uCi0jIFtPY3QuXSAzMCwgYXMgaXQgd2FzIGRvbmUgYmVmb3JlIGR1cmluZyBsYXN0IG1vcmUgdGhhbiAxMCB5ZWFycy4KLSMgQ3VycmVudGx5LCB3ZSBhcmUgaW4gZmFjdCBHTVQgKzQ6MDAsIGFzIGJlZm9yZSAzMCBPY3RvYmVyIGl0IHdhcyBHTVQKLSMgKzM6MDAuLi4uIFRoZSBwcm9ibGVtIGlzLCB0aGVyZSBpcyBOTyBGT1JNQUwgTEFXIG9yIGdvdmVybm1lbnRhbCBkb2N1bWVudAotIyBhYm91dCBpdC4gIEFzIGZhciBhcyBJIGNhbiBmaW5kLCBJIHdhcyB0b2xkLCB0aGF0IHRoZXJlIGlzIG5vIGRvY3VtZW50LAotIyBiZWNhdXNlIHdlIGp1c3QgRElETidUIElTU1VFIGRvY3VtZW50IGFib3V0IHN3aXRjaGluZyB0byB3aW50ZXIgdGltZS4uLi4KLSMgSSBkb24ndCBrbm93IHdoYXQgY2FuIGJlIGRvbmUsIGVzcGVjaWFsbHkga25vd2luZyB0aGF0IHNvbWUgeWVhcnMgYWdvIG91cgotIyBEU1QgcnVsZXMgd2hlcmUgY2hhbmdlZCBUSFJFRSBUSU1FUyBkdXJpbmcgb25lIG1vbnRoLgotCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9UYmlsaXNpCTI6NTk6MTYgLQlMTVQJMTg4MAotCQkJMjo1OToxNgktCVRCTVQJMTkyNCBNYXkgIDIgIyBUYmlsaXNpIE1lYW4gVGltZQotCQkJMzowMAktCVRCSVQJMTk1NyBNYXIgICAgIyBUYmlsaXNpIFRpbWUKLQkJCTQ6MDAgUnVzc2lhQXNpYSBUQkklc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTM6MDAJMTowMAlUQklTVAkxOTkxIEFwciAgOSAjIGluZGVwZW5kZW5jZQotCQkJMzowMCBSdXNzaWFBc2lhIEdFJXNUCTE5OTIgIyBHZW9yZ2lhIFRpbWUKLQkJCTM6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTQgU2VwIGxhc3RTdW4KLQkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTYgT2N0IGxhc3RTdW4KLQkJCTQ6MDAJMTowMAlHRVNUCTE5OTcgTWFyIGxhc3RTdW4KLQkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTIwMDQgSnVuIDI3Ci0JCQkzOjAwIFJ1c3NpYUFzaWEJR0Ulc1QJMjAwNSBNYXIgbGFzdFN1biAyOjAwCi0JCQk0OjAwCS0JR0VUCi0KLSMgRWFzdCBUaW1vcgotCi0jIFNlZSBJbmRvbmVzaWEgZm9yIHRoZSAxOTQ1IHRyYW5zaXRpb24uCi0KLSMgRnJvbSBKb2FvIENhcnJhc2NhbGFvLCBicm90aGVyIG9mIHRoZSBmb3JtZXIgZ292ZXJub3Igb2YgRWFzdCBUaW1vciwgaW4KLSMgPGEgaHJlZj0iaHR0cDovL2V0YW4ub3JnL2V0OTljL2RlY2VtYmVyLzI2LTMxLzMwRVRNQVkuaHRtIj4KLSMgRWFzdCBUaW1vciBtYXkgYmUgbGF0ZSBmb3IgaXRzIG1pbGxlbm5pdW0KLSMgPC9hPiAoMTk5OS0xMi0yNi8zMSk6Ci0jIFBvcnR1Z2FsIHRyaWVkIHRvIGNoYW5nZSB0aGUgdGltZSBmb3J3YXJkIGluIDE5NzQgYmVjYXVzZSB0aGUgc3VuCi0jIHJpc2VzIHRvbyBlYXJseSBidXQgdGhlIHN1Z2dlc3Rpb24gcmFpc2VkIGEgbG90IG9mIHByb2JsZW1zIHdpdGggdGhlCi0jIFRpbW9yZXNlIGFuZCBJIHN0aWxsIGRvbid0IHRoaW5rIGl0IHdvdWxkIHdvcmsgdG9kYXkgYmVjYXVzZSBpdAotIyBjb25mbGljdHMgd2l0aCB0aGVpciB3YXkgb2YgbGlmZS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTEyLTA0KToKLSMgV2UgZG9uJ3QgaGF2ZSBhbnkgcmVjb3JkIG9mIHRoZSBhYm92ZSBhdHRlbXB0LgotIyBNb3N0IGxpa2VseSBvdXIgcmVjb3JkcyBhcmUgaW5jb21wbGV0ZSwgYnV0IHdlIGhhdmUgbm8gYmV0dGVyIGRhdGEuCi0KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ocmkub3JnL25ld3Mvd29ybGQvdW5kaC9sYXN0LzAwLTA4LTE2LnVuZGguaHRtbCI+Ci0jIEZyb20gTWFub2VsIGRlIEFsbWVpZGEgZSBTaWx2YSwgRGVwdXR5IFNwb2tlc21hbiBmb3IgdGhlIFVOIFNlY3JldGFyeS1HZW5lcmFsCi0jICgyMDAwLTA4LTE2KTwvYT46Ci0jIFRoZSBDYWJpbmV0IG9mIHRoZSBFYXN0IFRpbW9yIFRyYW5zaXRpb24gQWRtaW5pc3RyYXRpb24gZGVjaWRlZAotIyB0b2RheSB0byBhZHZhbmNlIEVhc3QgVGltb3IncyB0aW1lIGJ5IG9uZSBob3VyLiAgVGhlIHRpbWUgY2hhbmdlLAotIyB3aGljaCB3aWxsIGJlIHBlcm1hbmVudCwgd2l0aCBubyBzZWFzb25hbCBhZGp1c3RtZW50LCB3aWxsIGhhcHBlbiBhdAotIyBtaWRuaWdodCBvbiBTYXR1cmRheSwgU2VwdGVtYmVyIDE2LgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGlsaQk4OjIyOjIwIC0JTE1UCTE5MTIKLQkJCTg6MDAJLQlUTFQJMTk0MiBGZWIgMjEgMjM6MDAgIyBFIFRpbW9yIFRpbWUKLQkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjMKLQkJCTk6MDAJLQlUTFQJMTk3NiBNYXkgIDMKLQkJCTg6MDAJLQlDSVQJMjAwMCBTZXAgMTcgMDA6MDAKLQkJCTk6MDAJLQlUTFQKLQotIyBJbmRpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0tvbGthdGEJNTo1MzoyOCAtCUxNVAkxODgwCSMgS29sa2F0YQotCQkJNTo1MzoyMAktCUhNVAkxOTQxIE9jdCAgICAjIEhvd3JhaCBNZWFuIFRpbWU/Ci0JCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAxNSAjIEJ1cm1hIFRpbWUKLQkJCTU6MzAJLQlJU1QJMTk0MiBTZXAKLQkJCTU6MzAJMTowMAlJU1QJMTk0NSBPY3QgMTUKLQkJCTU6MzAJLQlJU1QKLSMgVGhlIGZvbGxvd2luZyBhcmUgbGlrZSBBc2lhL0tvbGthdGE6Ci0jCUFuZGFtYW4gSXMKLSMJTGFrc2hhZHdlZXAgKExhY2NhZGl2ZSwgTWluaWNveSBhbmQgQW1pbmRpdmkgSXMpCi0jCU5pY29iYXIgSXMKLQotIyBJbmRvbmVzaWEKLSMKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wNS0yOCksIG92ZXJyaWRpbmcgU2hhbmtzICYgUG90dGVuZ2VyOgotIyA8aHR0cDovL3d3dy5zdW1hdGVyYS1pbmMuY29tL2dvX3RvX2ludmVzdC9hYm91dF9pbmRvbmVzaWEuYXNwI3N0YW5kdGltZT4KLSMgc2F5cyB0aGF0IEluZG9uZXNpYSdzIHRpbWUgem9uZXMgY2hhbmdlZCBvbiAxOTg4LTAxLTAxLiAgTG9va2luZyBhdCBzb21lCi0jIHRpbWUgem9uZSBtYXBzLCBJIHRoaW5rIHRoYXQgbXVzdCByZWZlciB0byBXZXN0ZXJuIEJvcm5lbyAoS2FsaW1hbnRhbiBCYXJhdAotIyBhbmQgS2FsaW1hbnRhbiBUZW5nYWgpIHN3aXRjaGluZyBmcm9tIFVUQys4IHRvIFVUQys3LgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTEwKToKLSMgSGVyZSBpcyBhbm90aGVyIGNvcnJlY3Rpb24gdG8gU2hhbmtzICYgUG90dGVuZ2VyLgotIyBKb2huVFdCIHdyaXRlcyB0aGF0IEphcGFuZXNlIGZvcmNlcyBkaWQgbm90IHN1cnJlbmRlciBjb250cm9sIGluCi0jIEluZG9uZXNpYSB1bnRpbCAxOTQ1LTA5LTAxIDAwOjAwIGF0IHRoZSBlYXJsaWVzdCAoaW4gSmFrYXJ0YSkgYW5kCi0jIG90aGVyIGZvcm1hbCBzdXJyZW5kZXIgY2VyZW1vbmllcyB3ZXJlIFNlcHRlbWJlciA5LCAxMSwgYW5kIDEzLCBwbHVzCi0jIFNlcHRlbWJlciAxMiBmb3IgdGhlIHJlZ2lvbmFsIHN1cnJlbmRlciB0byBNb3VudGJhdHRlbiBpbiBTaW5nYXBvcmUuCi0jIFRoZXNlIHdvdWxkIGJlIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lcyBmb3IgYSBjaGFuZ2UuCi0jIFJlZ2ltZXMgaG9yYWlyZXMgcG91ciBsZSBtb25kZSBlbnRpZXIsIGJ5IEhlbnJpIExlIENvcnJlLCAoRWRpdGlvbnMKLSMgVHJhZGl0aW9ubmVsbGVzLCAxOTg3LCBQYXJpcykgc2F5cyB0aGF0IEphdmEgYW5kIE1hZHVyYSBzd2l0Y2hlZAotIyBmcm9tIEpTVCB0byBVVEMrMDc6MzAgb24gMTk0NS0wOS0yMywgYW5kIGdpdmVzIDE5NDQtMDktMDEgZm9yIEpheWFwdXJhCi0jIChIb2xsYW5kaWEpLiAgRm9yIG5vdywgYXNzdW1lIGFsbCBJbmRvbmVzaWFuIGxvY2F0aW9ucyBvdGhlciB0aGFuIEpheWFwdXJhCi0jIHN3aXRjaGVkIG9uIDE5NDUtMDktMjMuCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFzaWEvSmFrYXJ0YQk3OjA3OjEyIC0JTE1UCTE4NjcgQXVnIDEwCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIG5leHQgdHJhbnNpdGlvbiB3YXMgYXQgMTkyNCBKYW4gMSAwOjEzLAotIyBidXQgdGhpcyBtdXN0IGJlIGEgdHlwby4KLQkJCTc6MDc6MTIJLQlKTVQJMTkyMyBEZWMgMzEgMjM6NDc6MTIgIyBKYWthcnRhCi0JCQk3OjIwCS0JSkFWVAkxOTMyIE5vdgkgIyBKYXZhIFRpbWUKLQkJCTc6MzAJLQlXSVQJMTk0MiBNYXIgMjMKLQkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjMKLQkJCTc6MzAJLQlXSVQJMTk0OCBNYXkKLQkJCTg6MDAJLQlXSVQJMTk1MCBNYXkKLQkJCTc6MzAJLQlXSVQJMTk2NAotCQkJNzowMAktCVdJVAotWm9uZSBBc2lhL1BvbnRpYW5hawk3OjE3OjIwCS0JTE1UCTE5MDggTWF5Ci0JCQk3OjE3OjIwCS0JUE1UCTE5MzIgTm92ICAgICMgUG9udGlhbmFrIE1UCi0JCQk3OjMwCS0JV0lUCTE5NDIgSmFuIDI5Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDIzCi0JCQk3OjMwCS0JV0lUCTE5NDggTWF5Ci0JCQk4OjAwCS0JV0lUCTE5NTAgTWF5Ci0JCQk3OjMwCS0JV0lUCTE5NjQKLQkJCTg6MDAJLQlDSVQJMTk4OCBKYW4gIDEKLQkJCTc6MDAJLQlXSVQKLVpvbmUgQXNpYS9NYWthc3Nhcgk3OjU3OjM2IC0JTE1UCTE5MjAKLQkJCTc6NTc6MzYJLQlNTVQJMTkzMiBOb3YgICAgIyBNYWNhc3NhciBNVAotCQkJODowMAktCUNJVAkxOTQyIEZlYiAgOQotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMwotCQkJODowMAktCUNJVAotWm9uZSBBc2lhL0pheWFwdXJhCTk6MjI6NDggLQlMTVQJMTkzMiBOb3YKLQkJCTk6MDAJLQlFSVQJMTk0NCBTZXAgIDEKLQkJCTk6MzAJLQlDU1QJMTk2NAotCQkJOTowMAktCUVJVAotCi0jIElyYW4KLQotIyBGcm9tIFJvb3piZWggUG91cm5hZGVyICgyMDAzLTAzLTE1KToKLSMgVGhpcyBpcyBhbiBFbmdsaXNoIHRyYW5zbGF0aW9uIG9mIHdoYXQgSSBqdXN0IGZvdW5kIChvcmlnaW5hbGx5IGluIFBlcnNpYW4pLgotIyBUaGUgR3JlZ29yaWFuIGRhdGVzIGluIGJyYWNrZXRzIGFyZSBtaW5lOgotIwotIwlPZmZpY2lhbCBOZXdzcGFwZXIgTm8uIDEzNTQ4LTEzNzAvNi8yNSBbMTk5MS0wOS0xNl0KLSMJTm8uIDE2NzYwL1QyMzMgSAkJCQkxMzcwLzYvMTAgWzE5OTEtMDktMDFdCi0jCi0jCVRoZSBSdWxlIEFib3V0IENoYW5nZSBvZiB0aGUgT2ZmaWNpYWwgVGltZSBvZiB0aGUgQ291bnRyeQotIwotIwlUaGUgQm9hcmQgb2YgTWluaXN0ZXJzLCBpbiB0aGUgbWVldGluZyBkYXRlZCAxMzcwLzUvMjMgWzE5OTEtMDgtMTRdLAotIwliYXNlZCBvbiB0aGUgc3VnZ2VzdGlvbiBudW1iZXIgMjIyMS9EIGRhdGVkIDEzNzAvNC8yMiBbMTk5MS0wNy0xM10KLSMJb2YgdGhlIENvdW50cnkncyBPcmdhbml6YXRpb24gZm9yIE9mZmljaWFsIGFuZCBFbXBsb3ltZW50IEFmZmFpcnMsCi0jCWFuZCByZWZlcnJpbmcgdG8gdGhlIGxhdyBmb3IgZXF1YXRpbmcgdGhlIHdvcmtpbmcgaG91cnMgb2Ygd29ya2VycwotIwlhbmQgb2ZmaWNlcnMgaW4gdGhlIHdob2xlIGNvdW50cnkgZGF0ZWQgMTM1OS80LzIzIFsxOTgwLTA3LTE0XSwgYW5kCi0jCWZvciBzeW5jaHJvbml6aW5nIHRoZSBvZmZpY2lhbCB0aW1lcyBvZiB0aGUgY291bnRyeSwgYWdyZWVkIHRoYXQ6Ci0jCi0jCVRoZSBvZmZpY2lhbCB0aW1lIG9mIHRoZSBjb3VudHJ5IHdpbGwgc2hvdWxkIG1vdmUgZm9yd2FyZCBvbmUgaG91cgotIwlhdCB0aGUgMjRbOjAwXSBob3VycyBvZiB0aGUgZmlyc3QgZGF5IG9mIEZhcnZhcmRpbiBhbmQgc2hvdWxkIHJldHVybgotIwl0byBpdHMgcHJldmlvdXMgc3RhdGUgYXQgdGhlIDI0WzowMF0gaG91cnMgb2YgdGhlIDMwdGggZGF5IG9mCi0jCVNoYWhyaXZhci4KLSMKLSMJRmlyc3QgRGVwdXR5IHRvIHRoZSBQcmVzaWRlbnQgLSBIYXNzYW4gSGFiaWJpCi0jCi0jIEZyb20gcGVyc29uYWwgZXhwZXJpZW5jZSwgdGhhdCBhZ3JlZXMgd2l0aCB3aGF0IGhhcyBiZWVuIGZvbGxvd2VkCi0jIGZvciBhdCBsZWFzdCB0aGUgbGFzdCA1IHllYXJzLiAgQmVmb3JlIHRoYXQsIGZvciBhIGZldyB5ZWFycywgdGhlCi0jIGRhdGUgdXNlZCB3YXMgdGhlIGZpcnN0IFRodXJzZGF5IG5pZ2h0IG9mIEZhcnZhcmRpbiBhbmQgdGhlIGxhc3QKLSMgVGh1cnNkYXkgbmlnaHQgb2YgU2hhaHJpdmFyLCBidXQgSSBjYW4ndCBnaXZlIGV4YWN0IGRhdGVzLi4uLgotIyBJIGhhdmUgYWxzbyBjaGFuZ2VkIHRoZSBhYmJyZXZpYXRpb25zIHRvIHdoYXQgaXMgY29uc2lkZXJlZCBjb3JyZWN0Ci0jIGhlcmUgaW4gSXJhbiwgSVJTVCBmb3IgcmVndWxhciB0aW1lIGFuZCBJUkRUIGZvciBkYXlsaWdodCBzYXZpbmcgdGltZS4KLSMKLSMgRnJvbSBSb296YmVoIFBvdXJuYWRlciAoMjAwNS0wNC0wNSk6Ci0jIFRoZSB0ZXh0IG9mIHRoZSBJcmFuaWFuIGxhdywgaW4gZWZmZWN0IHNpbmNlIDE5MjUsIGNsZWFybHkgbWVudGlvbnMKLSMgdGhhdCB0aGUgdHJ1ZSBzb2xhciB5ZWFyIGlzIHRoZSBtZWFzdXJlLCBhbmQgdGhlcmUgaXMgbm8gYXJpdGhtZXRpYwotIyBsZWFwIHllYXIgY2FsY3VsYXRpb24gaW52b2x2ZWQuICBUaGVyZSBoYXMgbmV2ZXIgYmVlbiBhbnkgc2VyaW91cwotIyBwbGFuIHRvIGNoYW5nZSB0aGF0IGxhdy4uLi4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGJlZm9yZSBTZXB0LiAxOTkxLCBhbmQgd2l0aCBQb3VybmFkZXIgdGhlcmVhZnRlci4KLSMgSSB1c2VkIEVkIFJlaW5nb2xkJ3MgY2FsLXBlcnNpYSBpbiBHTlUgRW1hY3MgMjEuMiB0byBjaGVjayBQZXJzaWFuIGRhdGVzLAotIyBzdG9wcGluZyBhZnRlciAyMDM3IHdoZW4gMzItYml0IHRpbWVfdCdzIG92ZXJmbG93LgotIyBUaGF0IGNhbC1wZXJzaWEgdXNlZCBCaXJhc2hrJ3MgYXBwcm94aW1hdGlvbiwgd2hpY2ggZGlzYWdyZWVzIHdpdGggdGhlIHNvbGFyCi0jIGNhbGVuZGFyIHByZWRpY3Rpb25zIGZvciB0aGUgeWVhciAyMDI1LCBzbyBJIGNvcnJlY3RlZCB0aG9zZSBkYXRlcyBieSBoYW5kLgotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTAzLTMwKSwgd3JpdGluZyBhYm91dCBmdXR1cmUKLSMgZGlzY3JlcGFuY2llcyBiZXR3ZWVuIGNhbC1wZXJzaWEgYW5kIHRoZSBJcmFuaWFuIGNhbGVuZGFyOgotIyBGb3IgMjA5MSBzb2xhci1sb25naXR1ZGUtYWZ0ZXIgeWllbGRzIDIwOTEtMDMtMjAgMDg6NDA6MDcuNyBVVCBmb3IKLSMgdGhlIHZlcm5hbCBlcXVpbm94IGFuZCB0aGF0IGdldHMgc28gY2xvc2UgdG8gMTI6MDAgc29tZSBsb2NhbAotIyBJcmFuaWFuIHRpbWUgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29ycmVjdCBsb2NhdGlvbiBuZWVkcyB0byBiZQotIyBrbm93biBleGFjdGx5LCBhbW9uZ3N0IG90aGVyIGZhY3RvcnMuICAyMTU3IGlzIGV2ZW4gY2xvc2VyOgotIyAyMTU3LTAzLTIwIDA4OjM3OjE1LjUgVVQuICBCdXQgdGhlIEdyZWdvcmlhbiB5ZWFyIDIwMjUgc2hvdWxkIGdpdmUKLSMgbm8gaW50ZXJwcmV0YXRpb24gcHJvYmxlbSB3aGF0c29ldmVyLiAgQnkgdGhlIHdheSwgYW5vdGhlciBpbnN0YW50Ci0jIGluIHRoZSBuZWFyIGZ1dHVyZSB3aGVyZSB0aGVyZSB3aWxsIGJlIGEgZGlzY3JlcGFuY3kgYmV0d2VlbgotIyBhcml0aG1ldGljYWwgYW5kIGFzdHJvbm9taWNhbCBJcmFuaWFuIGNhbGVuZGFycyB3aWxsIGJlIGluIDIwNTg6Ci0jIHZlcm5hbCBlcXVpbm94IG9uIDIwNTgtMDMtMjAgMDk6MDM6MDUuOSBVVC4gIFRoZSBKYXZhIHZlcnNpb24gb2YKLSMgUmVpbmdvbGQncy9EZXJzaG93aXR6JyBjYWxjdWxhdG9yIGdpdmVzIGNvcnJlY3RseSB0aGUgR3JlZ29yaWFuIGRhdGUKLSMgMjA1OC0wMy0yMSBmb3IgMSBGYXJ2YXJkaW4gMTQzNyAoYXN0cm9ub21pY2FsKS4KLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDMtMjIpOgotIyBTZXZlcmFsIG9mIG15IHVzZXJzIGhhdmUgcmVwb3J0ZWQgdGhhdCBJcmFuIHdpbGwgbm90IG9ic2VydmUgRFNUIGFueW1vcmU6Ci0jIGh0dHA6Ly93d3cuaXJuYS5pci9lbi9uZXdzL3ZpZXcvbGluZS0xNy8wNjAzMTkzODEyMTY0OTQ4Lmh0bQotIwotIyBGcm9tIFJldXRlcnMgKDIwMDctMDktMTYpLCB3aXRoIGEgaGVhZHMtdXAgZnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW46Ci0jIC4uLiB0aGUgR3VhcmRpYW4gQ291bmNpbCAuLi4gYXBwcm92ZWQgYSBsYXcgb24gU3VuZGF5IHRvIHJlLWludHJvZHVjZQotIyBkYXlsaWdodCBzYXZpbmcgdGltZSAuLi4KLSMgaHR0cDovL3VrLnJldXRlcnMuY29tL2FydGljbGUvb2lsUnB0L2lkVUtCTEE2NTA0ODQyMDA3MDkxNgotIwotIyBGcm9tIFJvb3piZWggUG91cm5hZGVyICgyMDA3LTExLTA1KToKLSMgVGhpcyBpcyBxdW90ZWQgZnJvbSBPZmZpY2lhbCBHYXpldHRlIG9mIHRoZSBJc2xhbWljIFJlcHVibGljIG9mCi0jIElyYW4sIFZvbHVtZSA2MywgTnVtYmVyIDE4MjQyLCBkYXRlZCBUdWVzZGF5IDEzODYvNi8yNAotIyBbMjAwNy0xMC0xNl0uIEkgYW0gZG9pbmcgdGhlIGJlc3QgdHJhbnNsYXRpb24gSSBjYW46Li4uCi0jIFRoZSBvZmZpY2lhbCB0aW1lIG9mIHRoZSBjb3VudHJ5IHdpbGwgYmUgbW92ZWQgZm9yd2FyZCBmb3Igb25lIGhvdXIKLSMgb24gdGhlIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIG9mIEZhcnZhcmRpbiBhbmQgd2lsbAotIyBiZSBjaGFuZ2VkIGJhY2sgdG8gaXRzIHByZXZpb3VzIHN0YXRlIG9uIHRoZSAyNCBob3VycyBvZiB0aGUKLSMgdGhpcnRpZXRoIGRheSBvZiBTaGFocml2YXIuCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlJcmFuCTE5NzgJMTk4MAktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTE5NzgJb25seQktCU9jdAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTE5NzkJb25seQktCVNlcAkxOQkwOjAwCTAJUwotUnVsZQlJcmFuCTE5ODAJb25seQktCVNlcAkyMwkwOjAwCTAJUwotUnVsZQlJcmFuCTE5OTEJb25seQktCU1heQkgMwkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTE5OTIJMTk5NQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTE5OTEJMTk5NQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTE5OTYJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTE5OTYJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTE5OTcJMTk5OQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTE5OTcJMTk5OQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDAJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDAJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDEJMjAwMwktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDEJMjAwMwktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDQJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDQJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDUJb25seQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDUJb25seQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDgJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDgJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMDkJMjAxMQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMDkJMjAxMQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMTIJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMTIJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMTMJMjAxNQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMTMJMjAxNQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMTYJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMTYJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMTcJMjAxOQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMTcJMjAxOQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMjAJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMjAJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMjEJMjAyMwktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMjEJMjAyMwktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMjQJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMjQJb25seQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMjUJMjAyNwktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMjUJMjAyNwktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMjgJMjAyOQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMjgJMjAyOQktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMzAJMjAzMQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMzAJMjAzMQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMzIJMjAzMwktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMzIJMjAzMwktCVNlcAkyMQkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMzQJMjAzNQktCU1hcgkyMgkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMzQJMjAzNQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlJcmFuCTIwMzYJMjAzNwktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFuCTIwMzYJMjAzNwktCVNlcAkyMQkwOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RlaHJhbgkzOjI1OjQ0CS0JTE1UCTE5MTYKLQkJCTM6MjU6NDQJLQlUTVQJMTk0NgkjIFRlaHJhbiBNZWFuIFRpbWUKLQkJCTM6MzAJLQlJUlNUCTE5NzcgTm92Ci0JCQk0OjAwCUlyYW4JSVIlc1QJMTk3OQotCQkJMzozMAlJcmFuCUlSJXNUCi0KLQotIyBJcmFxCi0jCi0jIEZyb20gSm9uYXRoYW4gTGVubm94ICgyMDAwLTA2LTEyKToKLSMgQW4gYXJ0aWNsZSBpbiB0aGlzIHdlZWsncyBFY29ub21pc3QgKCJJbnNpZGUgdGhlIFNhZGRhbS1mcmVlIHpvbmUiLCBwLiA1MCBpbgotIyB0aGUgVS5TLiBlZGl0aW9uKSBvbiB0aGUgSXJhcWkgS3VyZHMgY29udGFpbnMgYSBwYXJhZ3JhcGg6Ci0jICJUaGUgdGhyZWUgbm9ydGhlcm4gcHJvdmluY2VzIC4uLiBzd2l0Y2hlZCB0aGVpciBjbG9ja3MgdGhpcyBzcHJpbmcgYW5kCi0jIGFyZSBhbiBob3VyIGFoZWFkIG9mIEJhZ2hkYWQuIgotIwotIyBCdXQgUml2ZXMgTWNEb3cgKDIwMDAtMDYtMTgpIHF1b3RlcyBhIGNvbnRhY3QgaW4gSXJhcWktS3VyZGlzdGFuIGFzIGZvbGxvd3M6Ci0jIEluIHRoZSBwYXN0LCBzb21lIEt1cmRpc2ggbmF0aW9uYWxpc3RzLCBhcyBhIHByb3Rlc3QgdG8gdGhlIElyYXFpCi0jIEdvdmVybm1lbnQsIGRpZCBub3QgYWRoZXJlIHRvIGRheWxpZ2h0IHNhdmluZyB0aW1lLiAgVGhleSByZWZlcnJlZAotIyB0byBkYXlsaWdodCBzYXZpbmcgYXMgU2FkZGFtIHRpbWUuICBCdXQsIGFzIG9mIHRvZGF5LCB0aGUgdGltZSB6b25lCi0jIGluIElyYXFpLUt1cmRpc3RhbiBpcyBvbiBzdGFuZGFyZCB0aW1lIHdpdGggQmFnaGRhZCwgSXJhcS4KLSMKLSMgU28gd2UnbGwgaWdub3JlIHRoZSBFY29ub21pc3QncyBjbGFpbS4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0xMCk6Ci0jIFRoZSBjYWJpbmV0IGluIElyYXEgYWJvbGlzaGVkIERTVCBsYXN0IHdlZWssIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCi0jIG5ld3Mgc291cmNlcyAoaW4gQXJhYmljKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbGplZXJhbi5uZXQvd2VzaW1hX2FydGljbGVzL25ld3MtMjAwODAzMDUtOTg2MDIuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuYWxqZWVyYW4ubmV0L3dlc2ltYV9hcnRpY2xlcy9uZXdzLTIwMDgwMzA1LTk4NjAyLmh0bWwKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzd2F0YWxpcmFxLmluZm8vbG9vay9hcnRpY2xlLnRwbD9pZD0yMDQ3JklkTGFuZ3VhZ2U9MTcmSWRQdWJsaWNhdGlvbj00Jk5yQXJ0aWNsZT03MTc0MyZOcklzc3VlPTEmTnJTZWN0aW9uPTEwIj4KLSMgaHR0cDovL3d3dy5hc3dhdGFsaXJhcS5pbmZvL2xvb2svYXJ0aWNsZS50cGw/aWQ9MjA0NyZJZExhbmd1YWdlPTE3JklkUHVibGljYXRpb249NCZOckFydGljbGU9NzE3NDMmTnJJc3N1ZT0xJk5yU2VjdGlvbj0xMAotIyA8L2E+Ci0jCi0jIFdlIGhhdmUgcHVibGlzaGVkIGEgc2hvcnQgYXJ0aWNsZSBpbiBFbmdsaXNoIGFib3V0IHRoZSBjaGFuZ2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9pcmFxLWR1bXBzLWRheWxpZ2h0LXNhdmluZy5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2lyYXEtZHVtcHMtZGF5bGlnaHQtc2F2aW5nLmh0bWwKLSMgPC9hPgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlJcmFxCTE5ODIJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCUlyYXEJMTk4MgkxOTg0CS0JT2N0CTEJMDowMAkwCVMKLVJ1bGUJSXJhcQkxOTgzCW9ubHkJLQlNYXIJMzEJMDowMAkxOjAwCUQKLVJ1bGUJSXJhcQkxOTg0CTE5ODUJLQlBcHIJMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFxCTE5ODUJMTk5MAktCVNlcAlsYXN0U3VuCTE6MDBzCTAJUwotUnVsZQlJcmFxCTE5ODYJMTk5MAktCU1hcglsYXN0U3VuCTE6MDBzCTE6MDAJRAotIyBJQVRBIFNTSU0gKDE5OTEvMTk5Nikgc2F5cyBBcHIgMSAxMjowMWFtIFVUQzsgZ3Vlc3MgdGhlIGA6MDEnIGlzIGEgdHlwby4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBJcmFxIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgMTk5Mi8xOTk3OyBpZ25vcmUgdGhpcy4KLSMKLVJ1bGUJSXJhcQkxOTkxCTIwMDcJLQlBcHIJIDEJMzowMHMJMTowMAlECi1SdWxlCUlyYXEJMTk5MQkyMDA3CS0JT2N0CSAxCTM6MDBzCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0JhZ2hkYWQJMjo1Nzo0MAktCUxNVAkxODkwCi0JCQkyOjU3OjM2CS0JQk1UCTE5MTgJICAgICMgQmFnaGRhZCBNZWFuIFRpbWU/Ci0JCQkzOjAwCS0JQVNUCTE5ODIgTWF5Ci0JCQkzOjAwCUlyYXEJQSVzVAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJc3JhZWwKLQotIyBGcm9tIEVwaHJhaW0gU2lsdmVyYmVyZyAoMjAwMS0wMS0xMSk6Ci0jCi0jIEkgY29pbmVkICJJU1QvSURUIiBjaXJjYSAxOTg4LiAgVW50aWwgdGhlbiB0aGVyZSB3ZXJlIHRocmVlCi0jIGRpZmZlcmVudCBhYmJyZXZpYXRpb25zIGluIHVzZToKLSMKLSMgSlNUICBKZXJ1c2FsZW0gU3RhbmRhcmQgVGltZSBbRGFubnkgQnJhbmlzcywgSGVicmV3IFVuaXZlcnNpdHldCi0jIElaVCAgSXNyYWVsIFpvbmFsIChzaWMpIFRpbWUgW1Byb2YuIEhhaW0gUGFwbywgVGVjaG5pb25dCi0jIEVFU1QgRWFzdGVybiBFdXJvcGUgU3RhbmRhcmQgVGltZSBbdXNlZCBieSBhbG1vc3QgZXZlcnlvbmUgZWxzZV0KLSMKLSMgU2luY2UgdGltZXpvbmVzIHNob3VsZCBiZSBjYWxsZWQgYnkgY291bnRyeSBhbmQgbm90IGNhcGl0YWwgY2l0aWVzLAotIyBJIHJ1bGVkIG91dCBKU1QuICBBcyBJc3JhZWwgaXMgaW4gQXNpYSBNaW5vciBhbmQgbm90IEVhc3Rlcm4gRXVyb3BlLAotIyBFRVNUIHdhcyBlcXVhbGx5IHVuYWNjZXB0YWJsZS4gIFNpbmNlICJ6b25hbCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGgKLSMgYW55IG90aGVyIHRpbWV6b25lIGFiYnJldmlhdGlvbiwgSSBmZWx0IHRoYXQgJ0lTVCcgd2FzIHRoZSB3YXkgdG8gZ28KLSMgYW5kLCBpbmRlZWQsIGl0IGhhcyByZWNlaXZlZCBhbG1vc3QgdW5pdmVyc2FsIGFjY2VwdGFuY2UgaW4gdGltZXpvbmUKLSMgc2V0dGluZ3MgaW4gSXNyYWVsaSBjb21wdXRlcnMuCi0jCi0jIEluIGFueSBjYXNlLCBJIGFtIGhhcHB5IHRvIHNoYXJlIHRpbWV6b25lIGFiYnJldmlhdGlvbnMgd2l0aCBJbmRpYSwKLSMgaGlnaCBvbiBteSBmYXZvcml0ZS1jb3VudHJ5IGxpc3QgKGFuZCBub3Qgb25seSBiZWNhdXNlIG15IHdpZmUncwotIyBmYW1pbHkgaXMgZnJvbSBJbmRpYSkuCi0KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlaaW9uCTE5NDAJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDIJMTk0NAktCU5vdgkgMQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NDMJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDQJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDUJb25seQktCUFwcgkxNgkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDUJb25seQktCU5vdgkgMQkyOjAwCTAJUwotUnVsZQlaaW9uCTE5NDYJb25seQktCUFwcgkxNgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDYJb25seQktCU5vdgkgMQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NDgJb25seQktCU1heQkyMwkwOjAwCTI6MDAJREQKLVJ1bGUJWmlvbgkxOTQ4CW9ubHkJLQlTZXAJIDEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTQ4CTE5NDkJLQlOb3YJIDEJMjowMAkwCVMKLVJ1bGUJWmlvbgkxOTQ5CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTUwCW9ubHkJLQlBcHIJMTYJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTUwCW9ubHkJLQlTZXAJMTUJMzowMAkwCVMKLVJ1bGUJWmlvbgkxOTUxCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTUxCW9ubHkJLQlOb3YJMTEJMzowMAkwCVMKLVJ1bGUJWmlvbgkxOTUyCW9ubHkJLQlBcHIJMjAJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTUyCW9ubHkJLQlPY3QJMTkJMzowMAkwCVMKLVJ1bGUJWmlvbgkxOTUzCW9ubHkJLQlBcHIJMTIJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTUzCW9ubHkJLQlTZXAJMTMJMzowMAkwCVMKLVJ1bGUJWmlvbgkxOTU0CW9ubHkJLQlKdW4JMTMJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTU0CW9ubHkJLQlTZXAJMTIJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTU1CW9ubHkJLQlKdW4JMTEJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTU1CW9ubHkJLQlTZXAJMTEJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTU2CW9ubHkJLQlKdW4JIDMJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTU2CW9ubHkJLQlTZXAJMzAJMzowMAkwCVMKLVJ1bGUJWmlvbgkxOTU3CW9ubHkJLQlBcHIJMjkJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTU3CW9ubHkJLQlTZXAJMjIJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTc0CW9ubHkJLQlKdWwJIDcJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTc0CW9ubHkJLQlPY3QJMTMJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTc1CW9ubHkJLQlBcHIJMjAJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTc1CW9ubHkJLQlBdWcJMzEJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTg1CW9ubHkJLQlBcHIJMTQJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTg1CW9ubHkJLQlTZXAJMTUJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTg2CW9ubHkJLQlNYXkJMTgJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTg2CW9ubHkJLQlTZXAJIDcJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTg3CW9ubHkJLQlBcHIJMTUJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTg3CW9ubHkJLQlTZXAJMTMJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTg4CW9ubHkJLQlBcHIJIDkJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTg4CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKLQotIyBGcm9tIEVwaHJhaW0gU2lsdmVyYmVyZwotIyAoMTk5Ny0wMy0wNCwgMTk5OC0wMy0xNiwgMTk5OC0xMi0yOCwgMjAwMC0wMS0xNywgMjAwMC0wNy0yNSwgMjAwNC0xMi0yMiwKLSMgYW5kIDIwMDUtMDItMTcpOgotCi0jIEFjY29yZGluZyB0byB0aGUgT2ZmaWNlIG9mIHRoZSBTZWNyZXRhcnkgR2VuZXJhbCBvZiB0aGUgTWluaXN0cnkgb2YKLSMgSW50ZXJpb3IsIHRoZXJlIGlzIE5PIHNldCBydWxlIGZvciBEYXlsaWdodC1TYXZpbmdzL1N0YW5kYXJkIHRpbWUgY2hhbmdlcy4KLSMgT25lIHRoaW5nIGlzIGVudHJlbmNoZWQgaW4gbGF3LCBob3dldmVyOiB0aGF0IHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMTUwCi0jIGRheXMgb2YgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGFubnVhbGx5LiAgRnJvbSAxOTkzLTE5OTgsIHRoZSBjaGFuZ2UgdG8KLSMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyBvbiBhIEZyaWRheSBtb3JuaW5nIGZyb20gbWlkbmlnaHQgSVNUIHRvCi0jIDEgYS5tIElEVDsgdXAgdW50aWwgMTk5OCwgdGhlIGNoYW5nZSBiYWNrIHRvIHN0YW5kYXJkIHRpbWUgd2FzIG9uIGEKLSMgU2F0dXJkYXkgbmlnaHQgZnJvbSBtaWRuaWdodCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgdG8gMTEgcC5tLiBzdGFuZGFyZAotIyB0aW1lLiAgMTk5NiBpcyBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIHdoZXJlIHRoZSBjaGFuZ2UgYmFjayB0byBzdGFuZGFyZAotIyB0aW1lIHRvb2sgcGxhY2Ugb24gU3VuZGF5IG5pZ2h0IGluc3RlYWQgb2YgU2F0dXJkYXkgbmlnaHQgdG8gYXZvaWQKLSMgY29uZmxpY3RzIHdpdGggdGhlIEpld2lzaCBOZXcgWWVhci4gIEluIDE5OTksIHRoZSBjaGFuZ2UgdG8KLSMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyBzdGlsbCBvbiBhIEZyaWRheSBtb3JuaW5nIGJ1dCBmcm9tCi0jIDIgYS5tLiBJU1QgdG8gMyBhLm0uIElEVDsgZnVydGhlcm1vcmUsIHRoZSBjaGFuZ2UgYmFjayB0byBzdGFuZGFyZCB0aW1lCi0jIHdhcyBhbHNvIG9uIGEgRnJpZGF5IG1vcm5pbmcgZnJvbSAyIGEubS4gSURUIHRvIDEgYS5tLiBJU1QgZm9yCi0jIDE5OTkgb25seS4gIEluIHRoZSB5ZWFyIDIwMDAsIHRoZSBjaGFuZ2UgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcwotIyBzaW1pbGFyIHRvIDE5OTksIGJ1dCBhbHRob3VnaCB0aGUgY2hhbmdlIGJhY2sgd2lsbCBiZSBvbiBhIEZyaWRheSwgaXQKLSMgd2lsbCB0YWtlIHBsYWNlIGZyb20gMSBhLm0uIElEVCB0byBtaWRuaWdodCBJU1QuICBTdGFydGluZyBpbiAyMDAxLCBhbGwKLSMgY2hhbmdlcyB0by9mcm9tIHdpbGwgdGFrZSBwbGFjZSBhdCAxIGEubS4gb2xkIHRpbWUsIGJ1dCBub3cgdGhlcmUgaXMgbm8KLSMgcnVsZSBhcyB0byB3aGF0IGRheSBvZiB0aGUgd2VlayBpdCB3aWxsIHRha2UgcGxhY2UgaW4gYXMgdGhlIHN0YXJ0IGRhdGUKLSMgKGV4Y2VwdCBpbiAyMDAzKSBpcyB0aGUgbmlnaHQgYWZ0ZXIgdGhlIFBhc3NvdmVyIFNlZGVyIChpLmUuIHRoZSBldmUKLSMgb2YgdGhlIDE2dGggb2YgTmlzYW4gaW4gdGhlIGx1bmFyIEhlYnJldyBjYWxlbmRhcikgYW5kIHRoZSBlbmQgZGF0ZQotIyAoZXhjZXB0IGluIDIwMDIpIGlzIHRocmVlIG5pZ2h0cyBiZWZvcmUgWW9tIEtpcHB1ciBbRGF5IG9mIEF0b25lbWVudF0KLSMgKHRoZSBldmUgb2YgdGhlIDd0aCBvZiBUaXNocmVpIGluIHRoZSBsdW5hciBIZWJyZXcgY2FsZW5kYXIpLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlaaW9uCTE5ODkJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5ODkJb25seQktCVNlcAkgMwkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTAJb25seQktCU1hcgkyNQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTAJb25seQktCUF1ZwkyNgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTEJb25seQktCU1hcgkyNAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTEJb25seQktCVNlcAkgMQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTIJb25seQktCU1hcgkyOQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTIJb25seQktCVNlcAkgNgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTMJb25seQktCUFwcgkgMgkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTMJb25seQktCVNlcAkgNQkwOjAwCTAJUwotCi0jIFRoZSBkYXRlcyBmb3IgMTk5NC0xOTk1IHdlcmUgb2J0YWluZWQgZnJvbSBPZmZpY2Ugb2YgdGhlIFNwb2tlc3dvbWFuIGZvciB0aGUKLSMgTWluaXN0cnkgb2YgSW50ZXJpb3IsIEplcnVzYWxlbSwgSXNyYWVsLiAgVGhlIHNwb2tlc3dvbWFuIGNhbiBiZSByZWFjaGVkIGJ5Ci0jIGNhbGxpbmcgdGhlIG9mZmljZSBkaXJlY3RseSBhdCA5NzItMi02NzAxNDQ3IG9yIDk3Mi0yLTY3MDE0NDguCi0KLSMgUnVsZQlOQU1FICAgIEZST00gICAgVE8gICAgICBUWVBFICAgIElOICAgICAgT04gICAgICBBVCAgICAgIFNBVkUgICAgTEVUVEVSL1MKLVJ1bGUJWmlvbgkxOTk0CW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk0CW9ubHkJLQlBdWcJMjgJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTk1CW9ubHkJLQlNYXIJMzEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk1CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKLQotIyBUaGUgZGF0ZXMgZm9yIDE5OTYgd2VyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNaW5pc3RlciBvZiBJbnRlcmlvciBvZiB0aGUKLSMgdGltZSwgSGFpbSBSYW1vbi4gIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgcmVnYXJkaW5nIDE5OTYtMTk5OAotIyAod2l0aCB0aGUgZGF0ZXMgZm9yIDE5OTctMTk5OCBubyBsb25nZXIgYmVpbmcgcmVsZXZhbnQpIGNhbiBiZSB2aWV3ZWQgYXQ6Ci0jCi0jICAgZnRwOi8vZnRwLmNzLmh1amkuYWMuaWwvcHViL3R6L2Fubm91bmNlbWVudHMvMTk5Ni0xOTk4LnJhbW9uLnBzLmd6Ci0jCi0jIFRoZSBkYXRlcyBmb3IgMTk5Ny0xOTk4IHdlcmUgYWx0ZXJlZCBieSBoaXMgc3VjY2Vzc29yLCBSYWJiaSBFbGkgU3Vpc3NhLgotIwotIyBUaGUgb2ZmaWNpYWwgYW5ub3VuY2VtZW50cyBmb3IgdGhlIHllYXJzIDE5OTctMTk5OSBjYW4gYmUgdmlld2VkIGF0OgotIwotIyAgIGZ0cDovL2Z0cC5jcy5odWppLmFjLmlsL3B1Yi90ei9hbm5vdW5jZW1lbnRzL1lZWVkucHMuZ3oKLSMKLSMgICAgICAgd2hlcmUgWVlZWSBpcyB0aGUgcmVsZXZhbnQgeWVhci4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJWmlvbgkxOTk2CW9ubHkJLQlNYXIJMTUJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk2CW9ubHkJLQlTZXAJMTYJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTk3CW9ubHkJLQlNYXIJMjEJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk3CW9ubHkJLQlTZXAJMTQJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTk4CW9ubHkJLQlNYXIJMjAJMDowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk4CW9ubHkJLQlTZXAJIDYJMDowMAkwCVMKLVJ1bGUJWmlvbgkxOTk5CW9ubHkJLQlBcHIJIDIJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkxOTk5CW9ubHkJLQlTZXAJIDMJMjowMAkwCVMKLQotIyBUaGUgS25lc3NldCBJbnRlcmlvciBDb21taXR0ZWUgaGFzIGNoYW5nZWQgdGhlIGRhdGVzIGZvciAyMDAwIGZvcgotIyB0aGUgdGhpcmQgdGltZSBpbiBqdXN0IG92ZXIgYSB5ZWFyIGFuZCBoYXZlIHNldCBuZXcgZGF0ZXMgZm9yIHRoZQotIyB5ZWFycyAyMDAxLTIwMDQgYXMgd2VsbC4KLSMKLSMgVGhlIG9mZmljaWFsIGFubm91bmNlbWVudCBmb3IgdGhlIHN0YXJ0IGRhdGUgb2YgMjAwMCBjYW4gYmUgdmlld2VkIGF0OgotIwotIwlmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8yMDAwLXN0YXJ0LnBzLmd6Ci0jCi0jIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgZm9yIHRoZSBlbmQgZGF0ZSBvZiAyMDAwIGFuZCB0aGUgZGF0ZXMKLSMgZm9yIHRoZSB5ZWFycyAyMDAxLTIwMDQgY2FuIGJlIHZpZXdlZCBhdDoKLSMKLSMJZnRwOi8vZnRwLmNzLmh1amkuYWMuaWwvcHViL3R6L2Fubm91bmNlbWVudHMvMjAwMC0yMDA0LnBzLmd6Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVppb24JMjAwMAlvbmx5CS0JQXByCTE0CTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAwMAlvbmx5CS0JT2N0CSA2CTE6MDAJMAlTCi1SdWxlCVppb24JMjAwMQlvbmx5CS0JQXByCSA5CTE6MDAJMTowMAlECi1SdWxlCVppb24JMjAwMQlvbmx5CS0JU2VwCTI0CTE6MDAJMAlTCi1SdWxlCVppb24JMjAwMglvbmx5CS0JTWFyCTI5CTE6MDAJMTowMAlECi1SdWxlCVppb24JMjAwMglvbmx5CS0JT2N0CSA3CTE6MDAJMAlTCi1SdWxlCVppb24JMjAwMwlvbmx5CS0JTWFyCTI4CTE6MDAJMTowMAlECi1SdWxlCVppb24JMjAwMwlvbmx5CS0JT2N0CSAzCTE6MDAJMAlTCi1SdWxlCVppb24JMjAwNAlvbmx5CS0JQXByCSA3CTE6MDAJMTowMAlECi1SdWxlCVppb24JMjAwNAlvbmx5CS0JU2VwCTIyCTE6MDAJMAlTCi0KLSMgVGhlIHByb3Bvc2VkIGxhdyBhZ3JlZWQgdXBvbiBieSB0aGUgS25lc3NldCBJbnRlcmlvciBDb21taXR0ZWUgb24KLSMgMjAwNS0wMi0xNCBpcyB0aGF0LCBmb3IgMjAwNSBhbmQgYmV5b25kLCBEU1Qgc3RhcnRzIGF0IDAyOjAwIHRoZQotIyBsYXN0IEZyaWRheSBiZWZvcmUgQXByaWwgMm5kIChpLmUuIHRoZSBsYXN0IEZyaWRheSBpbiBNYXJjaCBvciBBcHJpbAotIyAxc3QgaXRzZWxmIGlmIGl0IGZhbGxzIG9uIGEgRnJpZGF5KSBhbmQgZW5kcyBhdCAwMjowMCBvbiB0aGUgU2F0dXJkYXkKLSMgbmlnaHQgX2JlZm9yZV8gdGhlIGZhc3Qgb2YgWW9tIEtpcHB1ci4KLSMKLSMgVGhvc2Ugd2hvIGNhbiByZWFkIEhlYnJldyBjYW4gdmlldyB0aGUgYW5ub3VuY2VtZW50IGF0OgotIwotIwlmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8yMDA1K2JleW9uZC5wcwotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDItMjIpOgotIyBJIHVzZWQgRXBocmFpbSBTaWx2ZXJiZXJnJ3MgZHN0LWlzcmFlbC5lbCBwcm9ncmFtCi0jIDxmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovc29mdHdhcmUvZHN0LWlzcmFlbC5lbD4gKDIwMDUtMDItMjApCi0jIGFsb25nIHdpdGggRWQgUmVpbmdvbGQncyBjYWwtaGVicmV3IGluIEdOVSBFbWFjcyAyMS40LAotIyB0byBnZW5lcmF0ZSB0aGUgdHJhbnNpdGlvbnMgaW4gdGhpcyBsaXN0LgotIyAoSSByZXBsYWNlZCAibGFzdEZyaSIgd2l0aCAiRnJpPj0yNiIgYnkgaGFuZC4pCi0jIFRoZSBzcHJpbmcgdHJhbnNpdGlvbnMgYmVsb3cgYWxsIGNvcnJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBSdWxlOgotIwotIyBSdWxlCVppb24JMjAwNQltYXgJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAotIwotIyBidXQgb2xkZXIgemljIGltcGxlbWVudGF0aW9ucyAoZS5nLiwgU29sYXJpcyA4KSBkbyBub3Qgc3VwcG9ydAotIyAiRnJpPj0yNiIgdG8gbWVhbiBBcHJpbCAxIGluIHllYXJzIGxpa2UgMjAwNSwgc28gZm9yIG5vdyB3ZSBsaXN0IHRoZQotIyBzcHJpbmd0aW1lIHRyYW5zaXRpb25zIGV4cGxpY2l0bHkuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVppb24JMjAwNQlvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAwNQlvbmx5CS0JT2N0CSA5CTI6MDAJMAlTCi1SdWxlCVppb24JMjAwNgkyMDEwCS0JTWFyCUZyaT49MjYJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDA2CW9ubHkJLQlPY3QJIDEJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDA3CW9ubHkJLQlTZXAJMTYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDA4CW9ubHkJLQlPY3QJIDUJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDA5CW9ubHkJLQlTZXAJMjcJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDEwCW9ubHkJLQlTZXAJMTIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDExCW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDExCW9ubHkJLQlPY3QJIDIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDEyCTIwMTUJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMTIJb25seQktCVNlcAkyMwkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTMJb25seQktCVNlcAkgOAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTQJb25seQktCVNlcAkyOAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTUJb25seQktCVNlcAkyMAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTYJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMTYJb25seQktCU9jdAkgOQkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTcJMjAyMQktCU1hcglGcmk+PTI2CTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAxNwlvbmx5CS0JU2VwCTI0CTI6MDAJMAlTCi1SdWxlCVppb24JMjAxOAlvbmx5CS0JU2VwCTE2CTI6MDAJMAlTCi1SdWxlCVppb24JMjAxOQlvbmx5CS0JT2N0CSA2CTI6MDAJMAlTCi1SdWxlCVppb24JMjAyMAlvbmx5CS0JU2VwCTI3CTI6MDAJMAlTCi1SdWxlCVppb24JMjAyMQlvbmx5CS0JU2VwCTEyCTI6MDAJMAlTCi1SdWxlCVppb24JMjAyMglvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAyMglvbmx5CS0JT2N0CSAyCTI6MDAJMAlTCi1SdWxlCVppb24JMjAyMwkyMDMyCS0JTWFyCUZyaT49MjYJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDIzCW9ubHkJLQlTZXAJMjQJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI0CW9ubHkJLQlPY3QJIDYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI1CW9ubHkJLQlTZXAJMjgJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI2CW9ubHkJLQlTZXAJMjAJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI3CW9ubHkJLQlPY3QJMTAJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI4CW9ubHkJLQlTZXAJMjQJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDI5CW9ubHkJLQlTZXAJMTYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDMwCW9ubHkJLQlPY3QJIDYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDMxCW9ubHkJLQlTZXAJMjEJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDMyCW9ubHkJLQlTZXAJMTIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDMzCW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDMzCW9ubHkJLQlPY3QJIDIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDM0CTIwMzcJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMzQJb25seQktCVNlcAkxNwkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzUJb25seQktCU9jdAkgNwkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzYJb25seQktCVNlcAkyOAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzcJb25seQktCVNlcAkxMwkyOjAwCTAJUwotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvSmVydXNhbGVtCTI6MjA6NTYgLQlMTVQJMTg4MAotCQkJMjoyMDo0MAktCUpNVAkxOTE4CSMgSmVydXNhbGVtIE1lYW4gVGltZT8KLQkJCTI6MDAJWmlvbglJJXNUCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSmFwYW4KLQotIyBgOTowMCcgYW5kIGBKU1QnIGlzIGZyb20gR3V5IEhhcnJpcy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTAzLTA2KToKLSMgVG9kYXkncyBfQXNhaGkgRXZlbmluZyBOZXdzXyAocGFnZSA0KSByZXBvcnRzIHRoYXQgSmFwYW4gaGFkCi0jIGRheWxpZ2h0IHNhdmluZyBiZXR3ZWVuIDE5NDggYW5kIDE5NTEsIGJ1dCBgYHRoZSBzeXN0ZW0gd2FzIGRpc2NvbnRpbnVlZAotIyBiZWNhdXNlIHRoZSBwdWJsaWMgYmVsaWV2ZWQgaXQgd291bGQgbGVhZCB0byBsb25nZXIgd29ya2luZyBob3Vycy4nJwotCi0jIEZyb20gTWF5dW1pIE5lZ2lzaGkgaW4gdGhlIDIwMDUtMDgtMTAgSmFwYW4gVGltZXMKLSMgPGh0dHA6Ly93d3cuamFwYW50aW1lcy5jby5qcC9jZ2ktYmluL2dldGFydGljbGUucGw1P25uMjAwNTA4MTBmMi5odG0+OgotIyBPY2N1cGF0aW9uIGF1dGhvcml0aWVzIGltcG9zZWQgZGF5bGlnaHQtc2F2aW5nIHRpbWUgb24gSmFwYW4gb24KLSMgWzE5NDgtMDUtMDFdLi4uLiAgQnV0IGxhY2sgb2YgcHJpb3IgZGViYXRlIGFuZCB0aGUgZXhlY3V0aW9uIG9mCi0jIGRheWxpZ2h0LXNhdmluZyB0aW1lIGp1c3QgdGhyZWUgZGF5cyBhZnRlciB0aGUgYmlsbCB3YXMgcGFzc2VkIGdlbmVyYXRlZAotIyBkZWVwIGhhdHJlZCBvZiB0aGUgY29uY2VwdC4uLi4gIFRoZSBEaWV0IHVuY2VyZW1vbmlvdXNseSBwYXNzZWQgYSBiaWxsIHRvCi0jIGR1bXAgdGhlIHVucG9wdWxhciBzeXN0ZW0gaW4gT2N0b2JlciAxOTUxLCBsZXNzIHRoYW4gYSBtb250aCBhZnRlciB0aGUgU2FuCi0jIEZyYW5jaXNjbyBQZWFjZSBUcmVhdHkgd2FzIHNpZ25lZC4gIChBIGdvdmVybm1lbnQgcG9sbCBpbiAxOTUxIHNob3dlZCA1MyUKLSMgb2YgdGhlIEphcGFuZXNlIHdhbnRlZCB0byBzY3JhcCBkYXlsaWdodC1zYXZpbmcgdGltZSwgYXMgb3Bwb3NlZCB0byAzMCUgd2hvCi0jIHdhbnRlZCB0byBrZWVwIGl0LikKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRFNUIGluIEphcGFuIGR1cmluZyB0aG9zZSB5ZWFycyB3YXMgYXMgZm9sbG93czoKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUphcGFuCTE5NDgJb25seQktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJSmFwYW4JMTk0OAkxOTUxCS0JU2VwCVNhdD49OAkyOjAwCTAJUwotUnVsZQlKYXBhbgkxOTQ5CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCUphcGFuCTE5NTAJMTk1MQktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKLSMgYnV0IHRoZSBvbmx5IGxvY2F0aW9ucyB1c2luZyBpdCAoZm9yIGJpcnRoIGNlcnRpZmljYXRlcywgcHJlc3VtYWJseSwgc2luY2UKLSMgdGhlaXIgYXVkaWVuY2UgaXMgYXN0cm9sb2dlcnMpIHdlcmUgVVMgbWlsaXRhcnkgYmFzZXMuICBGb3Igbm93LCBhc3N1bWUKLSMgdGhhdCBmb3IgbW9zdCBwdXJwb3NlcyBkYXlsaWdodC1zYXZpbmcgdGltZSB3YXMgb2JzZXJ2ZWQ7IG90aGVyd2lzZSwgd2hhdAotIyB3b3VsZCBoYXZlIGJlZW4gdGhlIHBvaW50IG9mIHRoZSAxOTUxIHBvbGw/Ci0KLSMgRnJvbSBIaWRleXVraSBTdXp1a2kgKDE5OTgtMTEtMDkpOgotIyAnVG9reW8nIHVzdWFsbHkgc3RhbmRzIGZvciB0aGUgZm9ybWVyIGxvY2F0aW9uIG9mIFRva3lvIEFzdHJvbm9taWNhbAotIyBPYnNlcnZhdG9yeTogRSAxMzkgNDQnIDQwIi45MCAoOWggMThtIDU4cy43MjcpLCBOIDM1IDM5JyAxNiIuMC4KLSMgVGhpcyBkYXRhIGlzIGZyb20gJ1Jpa2EgTmVucHlvdSAoQ2hyb25vbG9naWNhbCBTY2llbnRpZmljIFRhYmxlcykgMTk5NicKLSMgZWRpdGVkIGJ5IE5hdGlvbmFsIEFzdHJvbm9taWNhbCBPYnNlcnZhdG9yeSBvZiBKYXBhbi4uLi4KLSMgSlNUIChKYXBhbiBTdGFuZGFyZCBUaW1lKSBoYXMgYmVlbiB1c2VkIHNpbmNlIDE4ODgtMDEtMDEgMDA6MDAgKEpTVCkuCi0jIFRoZSBsYXcgaXMgZW5hY3RlZCBvbiAxODg2LTA3LTA3LgotCi0jIEZyb20gSGlkZXl1a2kgU3V6dWtpICgxOTk4LTExLTE2KToKLSMgVGhlIG9yZGluYW5jZSBOby4gNTEgKDE4ODYpIGVzdGFibGlzaGVkICJzdGFuZGFyZCB0aW1lIiBpbiBKYXBhbiwKLSMgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEzNSBkZWdyZWUuCi0jIEluIHRoZSBvcmRpbmFuY2UgTm8uIDE2NyAoMTg5NSksICJzdGFuZGFyZCB0aW1lIiB3YXMgcmVuYW1lZCB0byAiY2VudHJhbAotIyBzdGFuZGFyZCB0aW1lIi4gIEFuZCB0aGUgc2FtZSBvcmRpbmFuY2UgYWxzbyBlc3RhYmxpc2hlZCAid2VzdGVybiBzdGFuZGFyZAotIyB0aW1lIiwgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEyMCBkZWdyZWUuLi4uICBCdXQgIndlc3Rlcm4gc3RhbmRhcmQKLSMgdGltZSIgd2FzIGFib2xpc2hlZCBpbiB0aGUgb3JkaW5hbmNlIE5vLiA1MjkgKDE5MzcpLiAgSW4gdGhlIG9yZGluYW5jZSBOby4KLSMgMTY3LCB0aGVyZSBpcyBubyBtZW50aW9uIHJlZ2FyZGluZyBmb3Igd2hhdCBwbGFjZSB3ZXN0ZXJuIHN0YW5kYXJkIHRpbWUgaXMKLSMgc3RhbmRhcmQuLi4uCi0jCi0jIEkgd3JvdGUgIm9yZGluYW5jZSIgYWJvdmUsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIHRyYW5zbGF0ZS4KLSMgSW4gSmFwYW5lc2UgaXQncyAiY2hva3VyZWkiLCB3aGljaCBtZWFucyBvcmRpbmFuY2UgZnJvbSBlbXBlcm9yLgotCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBjbGFpbSBKU1QgaW4gdXNlIHNpbmNlIDE4OTYsIGFuZCB0aGF0IGEgZmV3Ci0jIHBsYWNlcyAoZS5nLiBJc2hpZ2FraSkgdXNlICswODAwOyBnbyB3aXRoIFN1enVraS4gIEd1ZXNzIHRoYXQgYWxsCi0jIG9yZGluYW5jZXMgdG9vayBlZmZlY3Qgb24gSmFuIDEuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9Ub2t5bwk5OjE4OjU5CS0JTE1UCTE4ODcgRGVjIDMxIDE1OjAwdQotCQkJOTowMAktCUpTVAkxODk2Ci0JCQk5OjAwCS0JQ0pUCTE5MzgKLQkJCTk6MDAJSmFwYW4JSiVzVAotIyBTaW5jZSAxOTM4LCBhbGwgSmFwYW5lc2UgcG9zc2Vzc2lvbnMgaGF2ZSBiZWVuIGxpa2UgQXNpYS9Ub2t5by4KLQotIyBKb3JkYW4KLSMKLSMgRnJvbSA8YSBocmVmPSJodHRwOi8vc3Rhci5hcmFiaWEuY29tLzk5MDcwMS9KTzkuaHRtbCI+Ci0jIEpvcmRhbiBXZWVrICgxOTk5LTA3LTAxKSA8L2E+IHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgotIyBDbG9ja3MgaW4gSm9yZGFuIHdlcmUgZm9yd2FyZGVkIG9uZSBob3VyIG9uIFdlZG5lc2RheSBhdCBtaWRuaWdodCwKLSMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBnb3Zlcm5tZW50J3MgZGVjaXNpb24gdG8gaW1wbGVtZW50IHN1bW1lciB0aW1lCi0jIGFsbCB5ZWFyIHJvdW5kLgotIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwOTMwL0pPOS5odG1sIj4KLSMgSm9yZGFuIFdlZWsgKDE5OTktMDktMzApIDwvYT4gdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0xMS0wOSk6Ci0jIFdpbnRlciB0aW1lIHN0YXJ0cyB0b2RheSBUaHVyc2RheSwgMzAgU2VwdGVtYmVyLiBDbG9ja3Mgd2lsbCBiZSB0dXJuZWQgYmFjawotIyBieSBvbmUgaG91ci4gIFRoaXMgaXMgdGhlIGxhdGVzdCBnb3Zlcm5tZW50IGRlY2lzaW9uIGFuZCBpdCdzIGZpbmFsIQotIyBUaGUgZGVjaXNpb24gd2FzIHRha2VuIGJlY2F1c2Ugb2YgdGhlIGluY3JlYXNlIGluIHdvcmtpbmcgaG91cnMgaW4KLSMgZ292ZXJubWVudCdzIGRlcGFydG1lbnRzIGZyb20gc2l4IHRvIHNldmVuIGhvdXJzLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTExLTIyKToKLSMgU3RhcnRpbmcgMjAwMyB0cmFuc2l0aW9ucyBhcmUgZnJvbSBTdGVmZmVuIFRob3JzZW4ncyB3ZWIgc2l0ZSB0aW1lYW5kZGF0ZS5jb20uCi0jCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTExLTIzKToKLSMgRm9yIEpvcmRhbiBJIGhhdmUgcmVjZWl2ZWQgbXVsdGlwbGUgaW5kZXBlbmRlbnQgdXNlciByZXBvcnRzIGV2ZXJ5IHllYXIKLSMgYWJvdXQgRFNUIGVuZCBkYXRlcywgYXMgdGhlIGVuZC1ydWxlIGlzIGRpZmZlcmVudCBldmVyeSB5ZWFyLgotIwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0xMC0wMSksIGFmdGVyIGEgaGVhZHMtdXAgZnJvbSBIaWxhbCBNYWxhd2k6Ci0jIGh0dHA6Ly93d3cucGV0cmFuZXdzLmdvdi5qby9uZXByYXMvMjAwNi9TZXAvMDUvNDAwMC5odG0KLSMgIkpvcmRhbiB3aWxsIHN3aXRjaCB0byB3aW50ZXIgdGltZSBvbiBGcmlkYXksIE9jdG9iZXIgMjciLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSm9yZGFuCTE5NzMJb25seQktCUp1bgk2CTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTczCTE5NzUJLQlPY3QJMQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk3NAkxOTc3CS0JTWF5CTEJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5NzYJb25seQktCU5vdgkxCTA6MDAJMAktCi1SdWxlCUpvcmRhbgkxOTc3CW9ubHkJLQlPY3QJMQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk3OAlvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTc4CW9ubHkJLQlTZXAJMzAJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5ODUJb25seQktCUFwcgkxCTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTg1CW9ubHkJLQlPY3QJMQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk4NgkxOTg4CS0JQXByCUZyaT49MQkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk4NgkxOTkwCS0JT2N0CUZyaT49MQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk4OQlvbmx5CS0JTWF5CTgJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5OTAJb25seQktCUFwcgkyNwkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk5MQlvbmx5CS0JQXByCTE3CTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTkxCW9ubHkJLQlTZXAJMjcJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5OTIJb25seQktCUFwcgkxMAkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk5MgkxOTkzCS0JT2N0CUZyaT49MQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk5MwkxOTk4CS0JQXByCUZyaT49MQkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk5NAlvbmx5CS0JU2VwCUZyaT49MTUJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5OTUJMTk5OAktCVNlcAlGcmk+PTE1CTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMTk5OQlvbmx5CS0JSnVsCSAxCTA6MDBzCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk5OQkyMDAyCS0JU2VwCWxhc3RUaHUJMDowMHMJMAktCi1SdWxlCUpvcmRhbgkyMDAwCW1heAktCU1hcglsYXN0VGh1CTA6MDBzCTE6MDAJUwotUnVsZQlKb3JkYW4JMjAwMwlvbmx5CS0JT2N0CTI0CTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMjAwNAlvbmx5CS0JT2N0CTE1CTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMjAwNQlvbmx5CS0JU2VwCWxhc3RGcmkJMDowMHMJMAktCi1SdWxlCUpvcmRhbgkyMDA2CW1heAktCU9jdAlsYXN0RnJpCTA6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0FtbWFuCTI6MjM6NDQgLQlMTVQJMTkzMQotCQkJMjowMAlKb3JkYW4JRUUlc1QKLQotCi0jIEthemFraHN0YW4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTExLTIyKToKLSMgQW5kcmV3IEV2dGljaG92ICgxOTk2LTA0LTEzKSB3cml0ZXMgdGhhdCBLYXpha2hzdGFuCi0jIHN0YXllZCBpbiBzeW5jIHdpdGggTW9zY293IGFmdGVyIDE5OTAsIGFuZCB0aGF0IEFxdG9iZSAoZm9ybWVybHkgQWt0eXViaW5zaykKLSMgYW5kIEFxdGF1IChmb3JtZXJseSBTaGV2Y2hlbmtvKSBhcmUgdGhlIGxhcmdlc3QgY2l0aWVzIGluIHRoZWlyIHpvbmVzLgotIyBHdWVzcyB0aGF0IEFxdGF1IGFuZCBBcXRvYmUgZGl2ZXJnZWQgaW4gMTk5NSwgc2luY2UgdGhhdCdzIHRoZSBmaXJzdCB0aW1lCi0jIElBVEEgU1NJTSBtZW50aW9ucyBhIHRoaXJkIHRpbWUgem9uZSBpbiBLYXpha2hzdGFuLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBHZXJtYW4gSW9maXMsIEVMU0ksIEFsbWF0eSAoMjAwMS0xMC0wOSkgcmVwb3J0cyB0aGF0IEthemFraHN0YW4gdXNlcwotIyBSdXNzaWFBc2lhIHJ1bGVzLCBpbnN0ZWFkIG9mIHN3aXRjaGluZyBhdCAwMDowMCBhcyB0aGUgSUFUQSBoYXMgaXQuCi0jIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLCB3aG8gaGF2ZSB0aGVtIGFsd2F5cyB1c2luZyBSdXNzaWFBc2lhIHJ1bGVzLgotIyBBbHNvIGdvIHdpdGggdGhlIGZvbGxvd2luZyBjbGFpbXMgb2YgU2hhbmtzICYgUG90dGVuZ2VyOgotIwotIyAtIEthemFraHN0YW4gZGlkIG5vdCBvYnNlcnZlIERTVCBpbiAxOTkxLgotIyAtIFF5enlsb3JkYSBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs2OjAwIG9uIDE5OTItMDEtMTkgMDI6MDAuCi0jIC0gT3JhbCBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs0OjAwIGluIHNwcmluZyAxOTg5LgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cua2F6c29jaWV0eS5vcmcudWsvbmV3cy8yMDA1LzAzLzMwLmh0bSI+Ci0jIEZyb20gS2F6YWtoc3RhbiBFbWJhc3N5J3MgTmV3cyBCdWxsZXRpbiAjMTEgKDIwMDUtMDMtMjEpOgotIyA8L2E+Ci0jIFRoZSBHb3Zlcm5tZW50IG9mIEthemFraHN0YW4gcGFzc2VkIGEgcmVzb2x1dGlvbiBNYXJjaCAxNSBhYm9saXNoaW5nCi0jIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNpdGluZyBsYWNrIG9mIGVjb25vbWljIGJlbmVmaXRzIGFuZCBoZWFsdGgKLSMgY29tcGxpY2F0aW9ucyBjb3VwbGVkIHdpdGggYSBkZWNyZWFzZSBpbiBwcm9kdWN0aXZpdHkuCi0jCi0jIEZyb20gQnJhbmlzbGF2IEtvamljIChpbiBBc3RhbmEpIHZpYSBHd2lsbGltIExhdyAoMjAwNS0wNi0yOCk6Ci0jIC4uLiB3aGF0IGhhcHBlbmVkIHdhcyB0aGF0IHRoZSBmb3JtZXIgS2F6YWtoc3RhbiBFYXN0ZXJuIHRpbWUgem9uZQotIyB3YXMgImJsZW5kZWQiIHdpdGggdGhlIENlbnRyYWwgem9uZS4gIFRoZXJlZm9yZSwgS2F6YWtoc3RhbiBub3cgaGFzCi0jIHR3byB0aW1lIHpvbmVzLCBhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgb25lIGhvdXIuICBUaGUgem9uZQotIyBjbG9zZXIgdG8gVVRDIGlzIHRoZSBmb3JtZXIgV2VzdGVybiB6b25lIChwcm9iYWJseSBzdGlsbCBjYWxsZWQgdGhlCi0jIHNhbWUpLCBlbmNvbXBhc3NpbmcgZm91ciBwcm92aW5jZXMgaW4gdGhlIHdlc3Q6IEFxdG9iZSwgQXR5cmF1LAotIyBNYW5nZ2h5c3RhdSwgYW5kIFdlc3QgS2F6YWtoc3Rhbi4gIFRoZSBvdGhlciB6b25lIGVuY29tcGFzc2VzCi0jIGV2ZXJ5dGhpbmcgZWxzZS4uLi4gIEkgZ3Vlc3MgdGhhdCB3b3VsZCBtYWtlIEthemFraHN0YW4gdGltZSB6b25lcwotIyBkZSBqdXJlIFVUQys1IGFuZCBVVEMrNiByZXNwZWN0aXZlbHkuCi0KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMKLSMgQWxtYXR5IChmb3JtZXJseSBBbG1hLUF0YSksIHJlcHJlc2VudGluZyBtb3N0IGxvY2F0aW9ucyBpbiBLYXpha2hzdGFuCi1ab25lCUFzaWEvQWxtYXR5CTU6MDc6NDggLQlMTVQJMTkyNCBNYXkgIDIgIyBvciBBbG1hLUF0YQotCQkJNTowMAktCUFMTVQJMTkzMCBKdW4gMjEgIyBBbG1hLUF0YSBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEgQUxNJXNUCTE5OTEKLQkJCTY6MDAJLQlBTE1UCTE5OTIKLQkJCTY6MDAgUnVzc2lhQXNpYQlBTE0lc1QJMjAwNSBNYXIgMTUKLQkJCTY6MDAJLQlBTE1UCi0jIFF5enlsb3JkYSAoYWthIEt5enlsb3JkYSwgS2l6aWxvcmRhLCBLenlsLU9yZGEsIGV0Yy4pCi1ab25lCUFzaWEvUXl6eWxvcmRhCTQ6MjE6NTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlLSVpUCTE5MzAgSnVuIDIxICMgS2l6aWxvcmRhIFRpbWUKLQkJCTU6MDAJLQlLSVpUCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJS0laU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlLSVpUCTE5ODIgQXByICAxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJS0laJXNUCTE5OTEKLQkJCTU6MDAJLQlLSVpUCTE5OTEgRGVjIDE2ICMgaW5kZXBlbmRlbmNlCi0JCQk1OjAwCS0JUVlaVAkxOTkyIEphbiAxOSAyOjAwCi0JCQk2OjAwIFJ1c3NpYUFzaWEJUVlaJXNUCTIwMDUgTWFyIDE1Ci0JCQk2OjAwCS0JUVlaVAotIyBBcXRvYmUgKGFrYSBBa3RvYmUsIGZvcm1lcmx5IEFrdCd1Ymluc2spCi1ab25lCUFzaWEvQXF0b2JlCTM6NDg6NDAJLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlBS1RUCTE5MzAgSnVuIDIxICMgQWt0eXViaW5zayBUaW1lCi0JCQk1OjAwCS0JQUtUVAkxOTgxIEFwciAgMQotCQkJNTowMAkxOjAwCUFLVFNUCTE5ODEgT2N0ICAxCi0JCQk2OjAwCS0JQUtUVAkxOTgyIEFwciAgMQotCQkJNTowMCBSdXNzaWFBc2lhCUFLVCVzVAkxOTkxCi0JCQk1OjAwCS0JQUtUVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCUFRVCVzVAkyMDA1IE1hciAxNSAjIEFxdG9iZSBUaW1lCi0JCQk1OjAwCS0JQVFUVAotIyBNYW5nZ2h5c3RhdQotIyBBcXRhdSB3YXMgbm90IGZvdW5kZWQgdW50aWwgMTk2MywgYnV0IGl0IHJlcHJlc2VudHMgYW4gaW5oYWJpdGVkIHJlZ2lvbiwKLSMgc28gaW5jbHVkZSB0aW1lIHN0YW1wcyBiZWZvcmUgMTk2My4KLVpvbmUJQXNpYS9BcXRhdQkzOjIxOjA0CS0JTE1UCTE5MjQgTWF5ICAyCi0JCQk0OjAwCS0JRk9SVAkxOTMwIEp1biAyMSAjIEZvcnQgU2hldmNoZW5rbyBUCi0JCQk1OjAwCS0JRk9SVAkxOTYzCi0JCQk1OjAwCS0JU0hFVAkxOTgxIE9jdCAgMSAjIFNoZXZjaGVua28gVGltZQotCQkJNjowMAktCVNIRVQJMTk4MiBBcHIgIDEKLQkJCTU6MDAgUnVzc2lhQXNpYQlTSEUlc1QJMTk5MQotCQkJNTowMAktCVNIRVQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAgUnVzc2lhQXNpYQlBUVQlc1QJMTk5NSBNYXIgbGFzdFN1biAyOjAwICMgQXF0YXUgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhCUFRVCVzVAkyMDA1IE1hciAxNQotCQkJNTowMAktCUFRVFQKLSMgV2VzdCBLYXpha2hzdGFuCi1ab25lCUFzaWEvT3JhbAkzOjI1OjI0CS0JTE1UCTE5MjQgTWF5ICAyICMgb3IgVXJhbCdzawotCQkJNDowMAktCVVSQVQJMTkzMCBKdW4gMjEgIyBVcmFsJ3NrIHRpbWUKLQkJCTU6MDAJLQlVUkFUCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJVVJBU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlVUkFUCTE5ODIgQXByICAxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJVVJBJXNUCTE5ODkgTWFyIDI2IDI6MDAKLQkJCTQ6MDAgUnVzc2lhQXNpYQlVUkElc1QJMTk5MQotCQkJNDowMAktCVVSQVQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTQ6MDAgUnVzc2lhQXNpYQlPUkElc1QJMjAwNSBNYXIgMTUgIyBPcmFsIFRpbWUKLQkJCTU6MDAJLQlPUkFUCi0KLSMgS3lyZ3l6c3RhbiAoS2lyZ2l6c3RhbikKLSMgVHJhbnNpdGlvbnMgdGhyb3VnaCAxOTkxIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE1KToKLSMgQWNjb3JkaW5nIHRvIGFuIGFydGljbGUgZGF0ZWQgdG9kYXkgaW4gdGhlIEt5cmd5enN0YW4gRGV2ZWxvcG1lbnQgR2F0ZXdheQotIyA8aHR0cDovL2VuZy5nYXRld2F5LmtnL2NnaS1iaW4vcGFnZS5wbD9pZD0xJnN0b3J5X25hbWU9ZG9jOTk3OS5zaHRtbD4KLSMgS3lyZ3l6c3RhbiBpcyBjYW5jZWxpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHN5c3RlbS4gIEkgdGFrZSB0aGUgYXJ0aWNsZQotIyB0byBtZWFuIHRoYXQgdGhleSB3aWxsIGxlYXZlIHRoZWlyIGNsb2NrcyBhdCA2IGhvdXJzIGFoZWFkIG9mIFVUQy4KLSMgRnJvbSBNYWxpayBBYmR1Z2FsaWV2ICgyMDA1LTA5LTIxKToKLSMgT3VyIGdvdmVybm1lbnQgY2FuY2VscyBkYXlsaWdodCBzYXZpbmcgdGltZSA2dGggb2YgQXVndXN0IDIwMDUuCi0jIEZyb20gMjAwNS0wOC0xMiBvdXIgR01ULW9mZnNldCBpcyArNiwgdy9vIGFueSBkYXlsaWdodCBzYXZpbmcuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUt5cmd5egkxOTkyCTE5OTYJLQlBcHIJU3VuPj03CTA6MDBzCTE6MDAJUwotUnVsZQlLeXJneXoJMTk5MgkxOTk2CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJS3lyZ3l6CTE5OTcJMjAwNQktCU1hcglsYXN0U3VuCTI6MzAJMTowMAlTCi1SdWxlCUt5cmd5egkxOTk3CTIwMDQJLQlPY3QJbGFzdFN1bgkyOjMwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0Jpc2hrZWsJNDo1ODoyNCAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCUZSVVQJMTkzMCBKdW4gMjEgIyBGcnVuemUgVGltZQotCQkJNjowMCBSdXNzaWFBc2lhIEZSVSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJNTowMAkxOjAwCUZSVVNUCTE5OTEgQXVnIDMxIDI6MDAgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAJS3lyZ3l6CUtHJXNUCTIwMDUgQXVnIDEyICAgICMgS3lyZ3l6c3RhbiBUaW1lCi0JCQk2OjAwCS0JS0dUCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBLb3JlYSAoTm9ydGggYW5kIFNvdXRoKQotCi0jIEZyb20gQW5uaWUgSS4gQmFuZyAoMjAwNi0wNy0xMCkgaW4KLSMgPGh0dHA6Ly93d3cua29yZWFoZXJhbGQuY28ua3IvU0lURS9kYXRhL2h0bWxfZGlyLzIwMDYvMDcvMTAvMjAwNjA3MTAwMDEyLmFzcD46Ci0jIFRoZSBNaW5pc3RyeSBvZiBDb21tZXJjZSwgSW5kdXN0cnkgYW5kIEVuZXJneSBoYXMgYWxyZWFkeQotIyBjb21taXNzaW9uZWQgYSByZXNlYXJjaCBwcm9qZWN0IFt0byByZWludHJvZHVjZSBEU1RdIGFuZCBoYXMgc2FpZAotIyB0aGUgc3lzdGVtIG1heSBiZWdpbiBhcyBlYXJseSBhcyAyMDA4Li4uLiAgS29yZWEgcmFuIGEgZGF5bGlnaHQKLSMgc2F2aW5nIHByb2dyYW0gZnJvbSAxOTQ5LTYxIGJ1dCBzdG9wcGVkIGl0IGR1cmluZyB0aGUgMTk1MC01MyBLb3JlYW4gV2FyLgotCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUk9LCTE5NjAJb25seQktCU1heQkxNQkwOjAwCTE6MDAJRAotUnVsZQlST0sJMTk2MAlvbmx5CS0JU2VwCTEzCTA6MDAJMAlTCi1SdWxlCVJPSwkxOTg3CTE5ODgJLQlNYXkJU3VuPj04CTA6MDAJMTowMAlECi1SdWxlCVJPSwkxOTg3CTE5ODgJLQlPY3QJU3VuPj04CTA6MDAJMAlTCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9TZW91bAk4OjI3OjUyCS0JTE1UCTE4OTAKLQkJCTg6MzAJLQlLU1QJMTkwNCBEZWMKLQkJCTk6MDAJLQlLU1QJMTkyOAotCQkJODozMAktCUtTVAkxOTMyCi0JCQk5OjAwCS0JS1NUCTE5NTQgTWFyIDIxCi0JCQk4OjAwCVJPSwlLJXNUCTE5NjEgQXVnIDEwCi0JCQk4OjMwCS0JS1NUCTE5NjggT2N0Ci0JCQk5OjAwCVJPSwlLJXNUCi1ab25lCUFzaWEvUHlvbmd5YW5nCTg6MjM6MDAgLQlMTVQJMTg5MAotCQkJODozMAktCUtTVAkxOTA0IERlYwotCQkJOTowMAktCUtTVAkxOTI4Ci0JCQk4OjMwCS0JS1NUCTE5MzIKLQkJCTk6MDAJLQlLU1QJMTk1NCBNYXIgMjEKLQkJCTg6MDAJLQlLU1QJMTk2MSBBdWcgMTAKLQkJCTk6MDAJLQlLU1QKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEt1d2FpdAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBGcm9tIHRoZSBBcmFiIFRpbWVzICgyMDA3LTAzLTE0KToKLSMgVGhlIENpdmlsIFNlcnZpY2UgQ29tbWlzc2lvbiAoQ1NDKSBoYXMgYXBwcm92ZWQgYSBwcm9wb3NhbCBmb3J3YXJkZWQKLSMgYnkgTVAgQWhtYWQgQmFxZXIgb24gaW1wbGVtZW50aW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSAoRFNUKSBpbgotIyBLdXdhaXQgc3RhcnRpbmcgZnJvbSBBcHJpbCB1bnRpbCB0aGUgZW5kIG9mIFNlcHQgdGhpcyB5ZWFyLCByZXBvcnRzIEFsLUFuYmEuCi0jIDxodHRwOi8vd3d3LmFyYWJ0aW1lc29ubGluZS5jb20vYXJhYnRpbWVzL2t1d2FpdC9WaWV3ZGV0LmFzcD9JRD05OTUwPi4KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0yOSk6Ci0jIFdlIGRvbid0IGtub3cgdGhlIGRldGFpbHMsIG9yIHdoZXRoZXIgdGhlIGFwcHJvdmFsIG1lYW5zIGl0J2xsIGhhcHBlbiwKLSMgc28gZm9yIG5vdyB3ZSBhc3N1bWUgbm8gRFNULgotWm9uZQlBc2lhL0t1d2FpdAkzOjExOjU2IC0JTE1UCTE5NTAKLQkJCTM6MDAJLQlBU1QKLQotIyBMYW9zCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvVmllbnRpYW5lCTY6NTA6MjQgLQlMTVQJMTkwNiBKdW4gIDkgIyBvciBWaWFuZ2NoYW4KLQkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KLQkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKLQkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKLQkJCTc6MDAJLQlJQ1QKLQotIyBMZWJhbm9uCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlMZWJhbm9uCTE5MjAJb25seQktCU1hcgkyOAkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5MjAJb25seQktCU9jdAkyNQkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5MjEJb25seQktCUFwcgkzCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTkyMQlvbmx5CS0JT2N0CTMJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTIyCW9ubHkJLQlNYXIJMjYJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTIyCW9ubHkJLQlPY3QJOAkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5MjMJb25seQktCUFwcgkyMgkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5MjMJb25seQktCVNlcAkxNgkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5NTcJMTk2MQktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk1NwkxOTYxCS0JT2N0CTEJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTcyCW9ubHkJLQlKdW4JMjIJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTcyCTE5NzcJLQlPY3QJMQkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5NzMJMTk3NwktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk3OAlvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk3OAlvbmx5CS0JU2VwCTMwCTA6MDAJMAktCi1SdWxlCUxlYmFub24JMTk4NAkxOTg3CS0JTWF5CTEJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTg0CTE5OTEJLQlPY3QJMTYJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTg4CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5ODkJb25seQktCU1heQkxMAkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5OTAJMTk5MgktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk5Mglvbmx5CS0JT2N0CTQJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTkzCW1heAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk5MwkxOTk4CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTk5CW1heAktCU9jdAlsYXN0U3VuCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmVpcnV0CTI6MjI6MDAgLQlMTVQJMTg4MAotCQkJMjowMAlMZWJhbm9uCUVFJXNUCi0KLSMgTWFsYXlzaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5Cb3JuZW8JMTkzNQkxOTQxCS0JU2VwCTE0CTA6MDAJMDoyMAlUUyAjIG9uZS1UaGlyZCBTdW1tZXIKLVJ1bGUJTkJvcm5lbwkxOTM1CTE5NDEJLQlEZWMJMTQJMDowMAkwCS0KLSMKLSMgcGVuaW5zdWxhciBNYWxheXNpYQotIyBUaGUgZGF0YSBoZXJlIGFyZSB0YWtlbiBmcm9tIE1vayBMeSBZbmcgKDIwMDMtMTAtMzApCi0jIDxodHRwOi8vd3d3Lm1hdGgubnVzLmVkdS5zZy9hc2xha3Nlbi90ZWFjaGluZy90aW1lem9uZS5odG1sPi4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXNpYS9LdWFsYV9MdW1wdXIJNjo0Njo0NiAtCUxNVAkxOTAxIEphbiAgMQotCQkJNjo1NToyNQktCVNNVAkxOTA1IEp1biAgMSAjIFNpbmdhcG9yZSBNLlQuCi0JCQk3OjAwCS0JTUFMVAkxOTMzIEphbiAgMSAjIE1hbGF5YSBUaW1lCi0JCQk3OjAwCTA6MjAJTUFMU1QJMTkzNiBKYW4gIDEKLQkJCTc6MjAJLQlNQUxUCTE5NDEgU2VwICAxCi0JCQk3OjMwCS0JTUFMVAkxOTQyIEZlYiAxNgotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAxMgotCQkJNzozMAktCU1BTFQJMTk4MiBKYW4gIDEKLQkJCTg6MDAJLQlNWVQJIyBNYWxheXNpYSBUaW1lCi0jIFNhYmFoICYgU2FyYXdhawotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIGRhdGEgaGVyZSBhcmUgbW9zdGx5IGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBidXQgdGhlIDE5NDIsIDE5NDUgYW5kIDE5ODIKLSMgdHJhbnNpdGlvbiBkYXRlcyBhcmUgZnJvbSBNb2sgTHkgWW5nLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBc2lhL0t1Y2hpbmcJNzoyMToyMAktCUxNVAkxOTI2IE1hcgotCQkJNzozMAktCUJPUlQJMTkzMwkjIEJvcm5lbyBUaW1lCi0JCQk4OjAwCU5Cb3JuZW8JQk9SJXNUCTE5NDIgRmViIDE2Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDEyCi0JCQk4OjAwCS0JQk9SVAkxOTgyIEphbiAgMQotCQkJODowMAktCU1ZVAotCi0jIE1hbGRpdmVzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYWxkaXZlcwk0OjU0OjAwIC0JTE1UCTE4ODAJIyBNYWxlCi0JCQk0OjU0OjAwCS0JTU1UCTE5NjAJIyBNYWxlIE1lYW4gVGltZQotCQkJNTowMAktCU1WVAkJIyBNYWxkaXZlcyBUaW1lCi0KLSMgTW9uZ29saWEKLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgTW9uZ29saWEgaGFzIHRocmVlIHRpbWUgem9uZXMsIGJ1dAotIyB1c25vMTk5NSBhbmQgdGhlIENJQSBtYXAgU3RhbmRhcmQgVGltZSBab25lcyBvZiB0aGUgV29ybGQgKDIwMDUtMDMpCi0jIGJvdGggc2F5IHRoYXQgaXQgaGFzIGp1c3Qgb25lLgotCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDE5OTktMTItMTEpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vbmdvbGlhdG91cmlzbS5nb3YubW4vZ2VuZXJhbC5odG0iPgotIyBHZW5lcmFsIEluZm9ybWF0aW9uIE1vbmdvbGlhCi0jIDwvYT4gKDE5OTktMDkpCi0jICJUaW1lOiBNb25nb2xpYSBoYXMgdHdvIHRpbWUgem9uZXMuIFRocmVlIHdlc3Rlcm5tb3N0IHByb3ZpbmNlcyBvZgotIyBCYXlhbi1VbGdpaSwgVXZzLCBhbmQgSG92ZCBhcmUgb25lIGhvdXIgZWFybGllciB0aGFuIHRoZSBjYXBpdGFsIGNpdHksIGFuZAotIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeSBmb2xsb3dzIHRoZSBVbGFhbmJhYXRhciB0aW1lLCB3aGljaCBpcyBVVEMvR01UIHBsdXMKLSMgZWlnaHQgaG91cnMuIgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTItMTMpOgotIyBNb25nb2xpYSBkaXNjb250aW51ZWQgdGhlIHVzZSBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW4gMTk5OTsgMTk5OAotIyBiZWluZyB0aGUgbGFzdCB5ZWFyIGl0IHdhcyBpbXBsZW1lbnRlZC4gIFRoZSBkYXRlcyBvZiBpbXBsZW1lbnRhdGlvbiBJIGFtCi0jIHVuc3VyZSBvZiwgYnV0IG1vc3QgcHJvYmFibHkgaXQgd2FzIHNpbWlsYXIgdG8gUnVzc2lhLCBleGNlcHQgZm9yIHRoZSB0aW1lCi0jIG9mIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIGJlZW4gZGlmZmVyZW50Li4uLgotIyBTb21lIG1hcHMgaW4gdGhlIHBhc3QgaGF2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSB3YXMgYW4gYWRkaXRpb25hbCB0aW1lCi0jIHpvbmUgaW4gdGhlIGVhc3Rlcm4gcGFydCBvZiBNb25nb2xpYSwgaW5jbHVkaW5nIHRoZSBwcm92aW5jZXMgb2YgRG9ybm9kLAotIyBTdWhiYWF0YXIsIGFuZCBwb3NzaWJseSBLaGVudGlqLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTItMTUpOgotIyBOYW1pbmcgYW5kIHNwZWxsaW5nIGlzIHRyaWNreSBpbiBNb25nb2xpYS4KLSMgV2UnbGwgdXNlIEhvdmQgKGFsc28gc3BlbGxlZCBDaG92ZCBhbmQgS2hvdmQpIHRvIHJlcHJlc2VudCB0aGUgd2VzdCB6b25lOwotIyB0aGUgY2FwaXRhbCBvZiB0aGUgSG92ZCBwcm92aW5jZSBpcyBzb21ldGltZXMgY2FsbGVkIEhvdmQsIHNvbWV0aW1lcyBEdW5kLVVzLAotIyBhbmQgc29tZXRpbWVzIEppcmdhbGFudGEgKHdpdGggdmFyaWFudCBzcGVsbGluZ3MpLCBidXQgdGhlIG5hbWUgSG92ZAotIyBpcyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMDUtMTMpOgotIyBJbiBhZGRpdGlvbiB0byBNb25nb2xpYSBzdGFydGluZyBkYXlsaWdodCBzYXZpbmdzIGFzIHJlcG9ydGVkIGVhcmxpZXIKLSMgKGFkb3B0ZWQgRFNUIG9uIDIwMDEtMDQtMjcgMDI6MDAgbG9jYWwgdGltZSwgZW5kaW5nIDIwMDEtMDktMjgpLAotIyB0aGVyZSBhcmUgdGhyZWUgdGltZSB6b25lcy4KLSMKLSMgUHJvdmluY2VzIFthdCA3OjAwXTogQmF5YW4tdWxnaWksIFV2cywgS2hvdmQsIFphdmtoYW4sIEdvdmktQWx0YWkKLSMgUHJvdmluY2VzIFthdCA4OjAwXTogS2hvdnNnb2wsIEJ1bGdhbiwgQXJraGFuZ2FpLCBLaGVudGlpLCBUb3YsCi0jCUJheWFua2hvbmdvciwgT3ZvcmtoYW5nYWksIER1bmRnb3ZpLCBEb3Jub2dvdmksIE9tbm9nb3ZpCi0jIFByb3ZpbmNlcyBbYXQgOTowMF06IERvcm5vZCwgU3VraGJhYXRhcgotIwotIyBbVGhlIHByb3ZpbmNlIG9mIFNlbGVuZ2UgaXMgb21pdHRlZCBmcm9tIHRoZSBhYm92ZSBsaXN0cy5dCi0KLSMgRnJvbSBHYW5ib2xkIFRzLiwgVWxhYW5iYWF0YXIgKDIwMDQtMDQtMTcpOgotIyBEYXlsaWdodCBzYXZpbmcgb2NjdXJzIGF0IDAyOjAwIGxvY2FsIHRpbWUgbGFzdCBTYXR1cmRheSBvZiBNYXJjaC4KLSMgSXQgd2lsbCBjaGFuZ2UgYmFjayB0byBub3JtYWwgYXQgMDI6MDAgbG9jYWwgdGltZSBsYXN0IFNhdHVyZGF5IG9mCi0jIFNlcHRlbWJlci4uLi4gQXMgSSByZW1lbWJlciB0aGlzIHJ1bGUgd2FzIGNoYW5nZWQgaW4gMjAwMS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNC0wNC0xNyk6Ci0jIEZvciBub3csIGFzc3VtZSBSaXZlcyBNY0RvdydzIGluZm9ybWFudCBnb3QgY29uZnVzZWQgYWJvdXQgRnJpZGF5IHZzCi0jIFNhdHVyZGF5LCBhbmQgdGhhdCBoaXMgMjAwMSBkYXRlcyBzaG91bGQgaGF2ZSAxIGFkZGVkIHRvIHRoZW0uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wNy0yNik6Ci0jIFdlIGhhdmUgd2lsZGx5IGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IE1vbmdvbGlhJ3MgdGltZSB6b25lcy4KLSMgQmlsbCBCb25uZXQgKDIwMDUtMDUtMTkpIHJlcG9ydHMgdGhhdCB0aGUgVVMgRW1iYXNzeSBpbiBVbGFhbmJhYXRhciBzYXlzCi0jIHRoZXJlIGlzIG9ubHkgb25lIHRpbWUgem9uZSBhbmQgdGhhdCBEU1QgaXMgb2JzZXJ2ZWQsIGNpdGluZyBNaWNyb3NvZnQKLSMgV2luZG93cyBYUCBhcyB0aGUgc291cmNlLiAgUmlzdG8gTnlrYW5lbiAoMjAwNS0wNS0xNikgcmVwb3J0cyB0aGF0Ci0jIHRyYXZlbG1vbmdvbGlhLm9yZyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcyAoVVRDKzcsIFVUQys4KSB3aXRoIG5vIERTVC4KLSMgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMjApIHJlcG9ydHMgdGhhdCB0aGUgTW9uZ29saWFuIEVtYmFzc3kgaW4KLSMgV2FzaGluZ3RvbiwgREMgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMsIHdpdGggRFNUIG9ic2VydmVkLgotIyBIZSBhbHNvIGZvdW5kCi0jIDxodHRwOi8vdWJwb3N0Lm1vbmdvbG5ld3MubW4vaW5kZXgucGhwP3N1YmFjdGlvbj1zaG93Y29tbWVudHMmaWQ9MTExMTYzNDg5NCZhcmNoaXZlPSZzdGFydF9mcm9tPSZ1Y2F0PTEmPgotIyB3aGljaCBhbHNvIHNheXMgdGhhdCB0aGVyZSBpcyBEU1QsIGFuZCB3aGljaCBoYXMgYSBjb21tZW50IGJ5ICJUb2RkaXVzIgotIyAoMjAwNS0wMy0zMSAwNjowNSArMDcwMCkgc2F5aW5nICJNb25nb2xpYSBhY3R1YWxseSBoYXMgMy41IHRpbWUgem9uZXMuCi0jIFRoZSBXZXN0IChPTEdJSSkgaXMgKzcgR01ULCBtb3N0IG9mIHRoZSBjb3VudHJ5IGlzIFVMQVQgaXMgKzggR01UCi0jIGFuZCBzb21lIEVhc3Rlcm4gcHJvdmluY2VzIGFyZSArOSBHTVQgYnV0IFN1a2hiYWF0YXIgQWltYWcgaXMgU1VISyArOC41IEdNVC4KLSMgVGhlIFNVS0ggdGltZXpvbmUgaXMgbmV3IHRoaXMgeWVhciwgaXQgaXMgb25lIG9mIHRoZSBmZXcgdGhpbmdzIHRoZQotIyBwYXJsaWFtZW50IHBhc3NlZCBkdXJpbmcgdGhlIHR1bXVsdHVvdXMgd2ludGVyIHNlc3Npb24uIgotIyBGb3Igbm93LCBsZXQncyBpZ25vcmUgdGhpcyBpbmZvcm1hdGlvbiwgdW50aWwgd2UgaGF2ZSBtb3JlIGNvbmZpcm1hdGlvbi4KLQotIyBGcm9tIEdhbmJvbGQgVHMuICgyMDA3LTAyLTI2KToKLSMgUGFybGlhbWVudCBvZiBNb25nb2xpYSBoYXMganVzdCBjaGFuZ2VkIHRoZSBkYXlsaWdodC1zYXZpbmcgcnVsZSBpbiBGZWJydWFyeS4KLSMgVGhleSBkZWNpZGVkIG5vdCB0byBhZG9wdCBkYXlsaWdodC1zYXZpbmcgdGltZS4uLi4KLSMgaHR0cDovL3d3dy5tb25nb2xuZXdzLm1uL2luZGV4LnBocD9tb2R1bGU9dW51dWR1ciZzZWM9dmlldyZpZD0xNTc0MgotCi0jIEZyb20gRGVib3JhaCBHb2xkc21pdGggKDIwMDgtMDMtMzApOgotIyBXZSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgY2xhaW1pbmcgdGhhdCB0aGUgdHogZGF0YWJhc2UgVVRDIG9mZnNldCBmb3IKLSMgQXNpYS9DaG9pYmFsc2FuIChHTVQrMDk6MDApIGlzIGluY29ycmVjdCwgYW5kIHRoYXQgaXQgc2hvdWxkIGJlIEdNVAotIyArMDg6MDAgaW5zdGVhZC4gRGlmZmVyZW50IHNvdXJjZXMgYXBwZWFyIHRvIGRpc2FncmVlIHdpdGggdGhlIHR6Ci0jIGRhdGFiYXNlIG9uIHRoaXMsIGUuZy46Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNiI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweAotIyA8L2E+Ci0jCi0jIGJvdGggc2F5IEdNVCswODowMC4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0zMSk6Ci0jIGV6bmlzIGFpcndheXMsIHdoaWNoIG9wZXJhdGVzIHNldmVyYWwgZG9tZXN0aWMgZmxpZ2h0cywgaGFzIGEgZmxpZ2h0Ci0jIHNjaGVkdWxlIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXpuaXMuY29tL0NvbnRhaW5lci5qc3A/aWQ9MTEyIj4KLSMgaHR0cDovL3d3dy5lem5pcy5jb20vQ29udGFpbmVyLmpzcD9pZD0xMTIKLSMgPC9hPgotIyAoY2xpY2sgdGhlIEVuZ2xpc2ggZmxhZyBmb3IgRW5nbGlzaCkKLSMKLSMgVGhlcmUgaXQgYXBwZWFycyB0aGF0IGZsaWdodHMgYmV0d2VlbiBDaG9pYmFsc2FuIGFuZCBVbGFhbmJhdGFyIGFycml2ZQotIyBhYm91dCAxOjM1IC0gMTo1MCBob3VycyBsYXRlciBpbiBsb2NhbCBjbG9jayB0aW1lLCBubyBtYXR0ZXIgdGhlCi0jIGRpcmVjdGlvbiwgd2hpbGUgVWxhYW5iYWF0YXItS2h2b2QgdGFrZXMgMiBob3VycyBpbiB0aGUgRWFzdGVybgotIyBkaXJlY3Rpb24gYW5kIDM6MzUgYmFjaywgd2hpY2ggaW5kaWNhdGVzIHRoYXQgVWxhYW5iYXRhciBhbmQgS2h2b2QgYXJlCi0jIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzIChsaWtlIHdlIGtub3cgYWJvdXQpLCB3aGlsZSBDaG9pYmFsc2FuIGFuZAotIyBVbGFhbmJhdGFyIGFyZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgKGNvcnJlY3Rpb24gbmVlZGVkKS4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wNS0xOSk6Ci0jIEFzc3VtZSB0aGF0IENob2liYWxzYW4gaXMgaW5kZWVkIG9mZnNldCBieSA4OjAwLgotIyBYWFgtLWluIHRoZSBhYnNlbmNlIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgYXNzdW1lIHRoYXQgdHJhbnNpdGlvbgotIyB3YXMgYXQgdGhlIHN0YXJ0IG9mIDIwMDgtMDMtMzEgKHRoZSBkYXkgb2YgU3RlZmZlbiBUaG9yc2VuJ3MgcmVwb3J0KTsKLSMgdGhpcyBpcyBhbG1vc3Qgc3VyZWx5IHdyb25nLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlNb25nb2wJMTk4MwkxOTg0CS0JQXByCTEJMDowMAkxOjAwCVMKLVJ1bGUJTW9uZ29sCTE5ODMJb25seQktCU9jdAkxCTA6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBhbmQgSUFUQSBTU0lNIHNheSAxOTkwcyBzd2l0Y2hlcyBvY2N1cnJlZCBhdCAwMDowMCwKLSMgYnV0IE1jRG93IHNheXMgdGhlIDIwMDEgc3dpdGNoZXMgb2NjdXJyZWQgYXQgMDI6MDAuICBBbHNvLCBJQVRBIFNTSU0KLSMgKDE5OTYtMDkpIHNheXMgMTk5Ni0xMC0yNS4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5OC4KLSMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IHRoZSBTZXB0LiAxOTg0IHRocm91Z2ggU2VwdC4gMTk5MCBzd2l0Y2hlcwotIyBpbiBDaG9pYmFsc2FuIChtb3JlIHByZWNpc2VseSwgaW4gRG9ybm9kIGFuZCBTdWtoYmFhdGFyKSB0b29rIHBsYWNlCi0jIGF0IDAyOjAwIHN0YW5kYXJkIHRpbWUsIG5vdCBhdCAwMDowMCBsb2NhbCB0aW1lIGFzIGluIHRoZSByZXN0IG9mCi0jIHRoZSBjb3VudHJ5LiAgVGhhdCB3b3VsZCBiZSBvZGQsIGFuZCBwb3NzaWJseSBpcyBhIHJlc3VsdCBvZiB0aGVpcgotIyBjb3JyZWN0aW9uIG9mIDAyOjAwIChpbiB0aGUgcHJldmlvdXMgZWRpdGlvbikgbm90IGJlaW5nIGRvbmUgY29ycmVjdGx5Ci0jIGluIHRoZSBsYXRlc3QgZWRpdGlvbjsgc28gaWdub3JlIGl0IGZvciBub3cuCi0KLVJ1bGUJTW9uZ29sCTE5ODUJMTk5OAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCU1vbmdvbAkxOTg0CTE5OTgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJLQotIyBJQVRBIFNTSU0gKDE5OTktMDkpIHNheXMgTW9uZ29saWEgbm8gbG9uZ2VyIG9ic2VydmVzIERTVC4KLVJ1bGUJTW9uZ29sCTIwMDEJb25seQktCUFwcglsYXN0U2F0CTI6MDAJMTowMAlTCi1SdWxlCU1vbmdvbAkyMDAxCTIwMDYJLQlTZXAJbGFzdFNhdAkyOjAwCTAJLQotUnVsZQlNb25nb2wJMjAwMgkyMDA2CS0JTWFyCWxhc3RTYXQJMjowMAkxOjAwCVMKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBIb3ZkLCBhLmsuYS4gQ2hvdmQsIER1bmQtVXMsIER6aGFyZ2FsYW50LCBLaG92ZCwgSmlyZ2FsYW50YQotWm9uZQlBc2lhL0hvdmQJNjowNjozNiAtCUxNVAkxOTA1IEF1ZwotCQkJNjowMAktCUhPVlQJMTk3OAkjIEhvdmQgVGltZQotCQkJNzowMAlNb25nb2wJSE9WJXNUCi0jIFVsYWFuYmFhdGFyLCBhLmsuYS4gVWxhbiBCYXRhYXIsIFVsYW4gQmF0b3IsIFVyZ2EKLVpvbmUJQXNpYS9VbGFhbmJhYXRhciA3OjA3OjMyIC0JTE1UCTE5MDUgQXVnCi0JCQk3OjAwCS0JVUxBVAkxOTc4CSMgVWxhYW5iYWF0YXIgVGltZQotCQkJODowMAlNb25nb2wJVUxBJXNUCi0jIENob2liYWxzYW4sIGEuay5hLiBCYWphbiBUdWVtZW4sIEJhamFuIFR1bWVuLCBDaG9qYmFsc2FuLAotIyBDaG95YmFsc2FuLCBTYW5iZWpzZSwgVGNob2liYWxzYW4KLVpvbmUJQXNpYS9DaG9pYmFsc2FuCTc6Mzg6MDAgLQlMTVQJMTkwNSBBdWcKLQkJCTc6MDAJLQlVTEFUCTE5NzgKLQkJCTg6MDAJLQlVTEFUCTE5ODMgQXByCi0JCQk5OjAwCU1vbmdvbAlDSE8lc1QJMjAwOCBNYXIgMzEgIyBDaG9pYmFsc2FuIFRpbWUKLQkJCTg6MDAJTW9uZ29sCUNITyVzVAotCi0jIE5lcGFsCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvS2F0bWFuZHUJNTo0MToxNiAtCUxNVAkxOTIwCi0JCQk1OjMwCS0JSVNUCTE5ODYKLQkJCTU6NDUJLQlOUFQJIyBOZXBhbCBUaW1lCi0KLSMgT21hbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL011c2NhdAkzOjU0OjIwIC0JTE1UCTE5MjAKLQkJCTQ6MDAJLQlHU1QKLQotIyBQYWtpc3RhbgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDItMDMtMTMpOgotIyBJIGhhdmUgYmVlbiBhZHZpc2VkIHRoYXQgUGFraXN0YW4gaGFzIGRlY2lkZWQgdG8gYWRvcHQgZHN0IG9uIGEKLSMgVFJJQUwgYmFzaXMgZm9yIG9uZSB5ZWFyLCBzdGFydGluZyAwMDowMSBsb2NhbCB0aW1lIG9uIEFwcmlsIDcsIDIwMDIKLSMgYW5kIGVuZGluZyBhdCAwMDowMSBsb2NhbCB0aW1lIE9jdG9iZXIgNiwgMjAwMi4gIFRoaXMgaXMgd2hhdCBJIHdhcwotIyB0b2xkLCBidXQgSSBiZWxpZXZlIHRoYXQgdGhlIGFjdHVhbCB0aW1lIG9mIGNoYW5nZSBtYXkgYmUgMDA6MDA7IHRoZQotIyAwMDowMSB3YXMgdG8gbWFrZSBpdCBjbGVhciB3aGljaCBkYXkgaXQgd2FzIG9uLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMDMtMTUpOgotIyBKZXNwZXIgTm9yZ2FhcmQgZm91bmQgdGhpcyBVUkw6Ci0jIGh0dHA6Ly93d3cucGFrLmdvdi5way9wdWJsaWMvbmV3cy9hcHAvYXBwMDZfZGVjLmh0bQotIyAoZGF0ZWQgMjAwMS0xMi0wNikgd2hpY2ggc2F5cyB0aGF0IHRoZSBDYWJpbmV0IGFkb3B0ZWQgYSBzY2hlbWUgInRvCi0jIGFkdmFuY2UgdGhlIGNsb2NrcyBieSBvbmUgaG91ciBvbiB0aGUgbmlnaHQgYmV0d2VlbiB0aGUgZmlyc3QKLSMgU2F0dXJkYXkgYW5kIFN1bmRheSBvZiBBcHJpbCBhbmQgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvbgotIyAxNXRoIE9jdG9iZXIgZWFjaCB5ZWFyIi4gIFRoaXMgYWdyZWVzIHdpdGggTWNEb3cncyAwNC0wNyBhdCAwMDowMCwKLSMgYnV0IGRpc2FncmVlcyBhYm91dCB0aGUgT2N0b2JlciB0cmFuc2l0aW9uLCBhbmQgbWFrZXMgaXQgc291bmQgbGlrZQotIyBpdCdzIG5vdCBvbiBhIHRyaWFsIGJhc2lzLiAgQWxzbywgdGhlICJiZXR3ZWVuIHRoZSBmaXJzdCBTYXR1cmRheQotIyBhbmQgU3VuZGF5IG9mIEFwcmlsIiBwaHJhc2UsIGlmIHRha2VuIGxpdGVyYWxseSwgbWVhbnMgdGhhdCB0aGUKLSMgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZSBhdCAwMDowMCBvbiB0aGUgZmlyc3QgU3VuZGF5IG9uIG9yIGFmdGVyIDA0LTAyLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDItMDkpOgotIyBEQVdOIDxodHRwOi8vd3d3LmRhd24uY29tLzIwMDIvMTAvMDYvdG9wMTMuaHRtPiByZXBvcnRlZCBvbiAyMDAyLTEwLTA1Ci0jIHRoYXQgMjAwMiBEU1QgZW5kZWQgdGhhdCBkYXkgYXQgbWlkbmlnaHQuICBHbyB3aXRoIE1jRG93IGZvciBub3cuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDMtMDMtMTQpOgotIyBBY2NvcmRpbmcgdG8gaHR0cDovL3d3dy5kYXduLmNvbS8yMDAzLzAzLzA3L3RvcDE1Lmh0bQotIyB0aGVyZSB3aWxsIGJlIG5vIERTVCBpbiBQYWtpc3RhbiB0aGlzIHllYXI6Ci0jCi0jIElTTEFNQUJBRCwgTWFyY2ggNjogSW5mb3JtYXRpb24gYW5kIE1lZGlhIERldmVsb3BtZW50IE1pbmlzdGVyIFNoZWlraAotIyBSYXNoaWQgQWhtZWQgb24gVGh1cnNkYXkgc2FpZCB0aGUgY2FiaW5ldCBoYWQgcmV2ZXJzZWQgYSBwcmV2aW91cwotIyBkZWNpc2lvbiB0byBhZHZhbmNlIGNsb2NrcyBieSBvbmUgaG91ciBpbiBzdW1tZXIgYW5kIHB1dCB0aGVtIGJhY2sgYnkKLSMgb25lIGhvdXIgaW4gd2ludGVyIHdpdGggdGhlIGFpbSBvZiBzYXZpbmcgbGlnaHQgaG91cnMgYW5kIGVuZXJneS4KLSMKLSMgVGhlIG1pbmlzdGVyIHRvbGQgYSBuZXdzIGNvbmZlcmVuY2UgdGhhdCB0aGUgZXhwZXJpbWVudCBoYWQgcmF0aGVyCi0jIHNob3duIDggcGVyIGNlbnQgaGlnaGVyIGNvbnN1bXB0aW9uIG9mIGVsZWN0cmljaXR5LgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0xNSk6Ci0jIAotIyBIZXJlIGlzIGFuIGFydGljbGUgdGhhdCBQYWtpc3RhbiBwbGFuIHRvIGludHJvZHVjZSBEYXlsaWdodCBTYXZpbmcgVGltZSAKLSMgb24gSnVuZSAxLCAyMDA4IGZvciAzIG1vbnRocy4KLSMgCi0jICIuLi4gVGhlIGZlZGVyYWwgY2FiaW5ldCBvbiBXZWRuZXNkYXkgYW5ub3VuY2VkIGEgbmV3IGNvbnNlcnZhdGlvbiBwbGFuIHRvIGhlbHAgCi0jIHJlZHVjZSBsb2FkIHNoZWRkaW5nIGJ5IGFwcHJvdmluZyB0aGUgY2xvc3VyZSBvZiBjb21tZXJjaWFsIGNlbnRyZXMgYXQgOXBtIGFuZCAKLSMgbW92aW5nIGNsb2NrcyBmb3J3YXJkIGJ5IG9uZSBob3VyIGZvciB0aGUgbmV4dCB0aHJlZSBtb250aHMuIAotIyAuLi4uIgotIyAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAxLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUubmV0L2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDEuaHRtbAotIyA8L2E+Ci0jIE9SCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGFpbHl0aW1lcy5jb20ucGsvZGVmYXVsdC5hc3A/cGFnZT0yMDA4JTVDMDUlNUMxNSU1Q3N0b3J5XzE1LTUtMjAwOF9wZzFfNCI+Ci0jIGh0dHA6Ly93d3cuZGFpbHl0aW1lcy5jb20ucGsvZGVmYXVsdC5hc3A/cGFnZT0yMDA4JTVDMDUlNUMxNSU1Q3N0b3J5XzE1LTUtMjAwOF9wZzFfNAotIyA8L2E+Ci0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDUtMTkpOgotIyBYWFgtLW1pZG5pZ2h0IHRyYW5zaXRpb25zIGlzIGEgZ3Vlc3M7IDIwMDggb25seSBpcyBhIGd1ZXNzLgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA4LTA4LTI4KToKLSMgUGFraXN0YW4gZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBrZWVwIHRoZSB3YXRjaGVzIG9uZS1ob3VyIGFkdmFuY2VkCi0jIGZvciBhbm90aGVyIDIgbW9udGhzLS1wbGFuIHRvIHJldHVybiB0byBTdGFuZGFyZCBUaW1lIG9uIE9jdG9iZXIgMzEKLSMgaW5zdGVhZCBvZiBBdWd1c3QgMzEuCi0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMi5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAyLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vZGFpbHltYWlsbmV3cy5jb20vMjAwODA4LzI4L25ld3MvZG1icm4wMy5odG1sIj4KLSMgaHR0cDovL2RhaWx5bWFpbG5ld3MuY29tLzIwMDgwOC8yOC9uZXdzL2RtYnJuMDMuaHRtbAotIyA8L2E+Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlIFBha2lzdGFuCTIwMDIJb25seQktCUFwcglTdW4+PTIJMDowMQkxOjAwCVMKLVJ1bGUgUGFraXN0YW4JMjAwMglvbmx5CS0JT2N0CVN1bj49MgkwOjAxCTAJLQotUnVsZSBQYWtpc3RhbgkyMDA4CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJUwotUnVsZSBQYWtpc3RhbgkyMDA4CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0thcmFjaGkJNDoyODoxMiAtCUxNVAkxOTA3Ci0JCQk1OjMwCS0JSVNUCTE5NDIgU2VwCi0JCQk1OjMwCTE6MDAJSVNUCTE5NDUgT2N0IDE1Ci0JCQk1OjMwCS0JSVNUCTE5NTEgU2VwIDMwCi0JCQk1OjAwCS0JS0FSVAkxOTcxIE1hciAyNiAjIEthcmFjaGkgVGltZQotCQkJNTowMCBQYWtpc3RhbglQSyVzVAkjIFBha2lzdGFuIFRpbWUKLQotIyBQYWxlc3RpbmUKLQotIyBGcm9tIEFtb3MgU2hhcGlyICgxOTk4LTAyLTE1KToKLSMKLSMgRnJvbSAxOTE3IHVudGlsIDE5NDgtMDUtMTUsIGFsbCBvZiBQYWxlc3RpbmUsIGluY2x1ZGluZyB0aGUgcGFydHMgbm93Ci0jIGtub3duIGFzIHRoZSBHYXphIFN0cmlwIGFuZCB0aGUgV2VzdCBCYW5rLCB3YXMgdW5kZXIgQnJpdGlzaCBydWxlLgotIyBUaGVyZWZvcmUgdGhlIHJ1bGVzIGdpdmVuIGZvciBJc3JhZWwgZm9yIHRoYXQgcGVyaW9kLCBhcHBseSB0aGVyZSB0b28uLi4KLSMKLSMgVGhlIEdhemEgU3RyaXAgd2FzIHVuZGVyIEVneXB0aWFuIHJ1bGUgYmV0d2VlbiAxOTQ4LTA1LTE1IHVudGlsIDE5NjctMDYtMDUKLSMgKGV4Y2VwdCBhIHNob3J0IG9jY3VwYXRpb24gYnkgSXNyYWVsIGZyb20gMTk1Ni0xMSB0aWxsIDE5NTctMDMsIGJ1dCBubwotIyB0aW1lIHpvbmUgd2FzIGFmZmVjdGVkIHRoZW4pLiAgSXQgd2FzIG5ldmVyIGZvcm1hbGx5IGFubmV4ZWQgdG8gRWd5cHQsCi0jIHRob3VnaC4KLSMKLSMgVGhlIHJlc3Qgb2YgUGFsZXN0aW5lIHdhcyB1bmRlciBKb3JkYW5pYW4gcnVsZSBhdCB0aGF0IHRpbWUsIGZvcm1hbGx5Ci0jIGFubmV4ZWQgaW4gMTk1MCBhcyB0aGUgV2VzdCBCYW5rIChhbmQgdGhlIHdvcmQgIlRyYW5zIiB3YXMgZHJvcHBlZCBmcm9tCi0jIHRoZSBjb3VudHJ5J3MgcHJldmlvdXMgbmFtZSBvZiAidGhlIEhhc2hlbWl0ZSBLaW5nZG9tIG9mIHRoZQotIyBUcmFucy1Kb3JkYW4iKS4gIFNvIHRoZSBydWxlcyBmb3IgSm9yZGFuIGZvciB0aGF0IHRpbWUgYXBwbHkuICBNYWpvcgotIyB0b3ducyBpbiB0aGF0IGFyZWEgYXJlIE5hYmx1cyAoU2hjaGVtKSwgRWwtSGFsaWwgKEhlYnJvbiksIFJhbWFsbGFoLCBhbmQKLSMgRWFzdCBKZXJ1c2FsZW0uCi0jCi0jIEJvdGggYXJlYXMgd2VyZSBvY2N1cGllZCBieSBJc3JhZWwgaW4gSnVuZSAxOTY3LCBidXQgbm90IGFubmV4ZWQgKGV4Y2VwdAotIyBmb3IgRWFzdCBKZXJ1c2FsZW0pLiAgVGhleSB3ZXJlIG9uIElzcmFlbCB0aW1lIHNpbmNlIHRoZW47IHRoZXJlIG1pZ2h0Ci0jIGhhdmUgYmVlbiBhIE1pbGl0YXJ5IEdvdmVybm9yJ3Mgb3JkZXIgYWJvdXQgdGltZSB6b25lcywgYnV0IEknbSBub3QgYXdhcmUKLSMgb2YgYW55IChzdWNoIG9yZGVycyBtYXkgaGF2ZSBiZWVuIGlzc3VlZCBzZW1pLWFubnVhbGx5IHdoZW5ldmVyIHN1bW1lcgotIyB0aW1lIHdhcyBpbiBlZmZlY3QsIGJ1dCBtYXliZSB0aGUgbGVnYWwgYXNwZWN0IG9mIHRpbWUgd2FzIGp1c3QgbmVnbGVjdGVkKS4KLSMKLSMgVGhlIFBhbGVzdGluaWFuIEF1dGhvcml0eSB3YXMgZXN0YWJsaXNoZWQgaW4gMTk5MywgYW5kIGdvdCBob2xkIG9mIG1vc3QKLSMgdG93bnMgaW4gdGhlIFdlc3QgQmFuayBhbmQgR2F6YSBieSAxOTk1LiAgSSBrbm93IHRoYXQgaW4gb3JkZXIgdG8KLSMgZGVtb25zdHJhdGUuLi5pbmRlcGVuZGVuY2UsIHRoZXkgaGF2ZSBiZWVuIHN3aXRjaGluZyB0bwotIyBzdW1tZXIgdGltZSBhbmQgYmFjayBvbiBhIGRpZmZlcmVudCBzY2hlZHVsZSB0aGFuIElzcmFlbCdzLCBidXQgSSBkb24ndAotIyBrbm93IHdoZW4gdGhpcyB3YXMgc3RhcnRlZCwgb3Igd2hhdCBhbGdvcml0aG0gaXMgdXNlZCAobW9zdCBsaWtlbHkgdGhlCi0jIEpvcmRhbmlhbiBvbmUpLgotIwotIyBUbyBzdW1tYXJpemUsIHRoZSB0YWJsZSBzaG91bGQgcHJvYmFibHkgbG9vayBzb21ldGhpbmcgbGlrZSB0aGF0OgotIwotIyBBcmVhIFwgd2hlbiB8IDE5MTgtMTk0NyB8IDE5NDgtMTk2NyB8IDE5NjctMTk5NSB8IDE5OTYtCi0jIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLQotIyBJc3JhZWwgICAgICB8IFppb24gICAgICB8IFppb24gICAgICB8IFppb24gICAgICB8IFppb24KLSMgV2VzdCBiYW5rICAgfCBaaW9uICAgICAgfCBKb3JkYW4gICAgfCBaaW9uICAgICAgfCBKb3JkYW4KLSMgR2F6YSAgICAgICAgfCBaaW9uICAgICAgfCBFZ3lwdCAgICAgfCBaaW9uICAgICAgfCBKb3JkYW4KLSMKLSMgSSBndWVzcyBtb3JlIGluZm8gbWF5IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQQSdzIHdlYiBwYWdlIChpZi93aGVuIHRoZXkKLSMgaGF2ZSBvbmUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBHYXphIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgdW50aWwgMTk1NywgYnV0IGdvCi0jIHdpdGggU2hhcGlyIGFuZCBhc3N1bWUgdGhhdCBpdCBvYnNlcnZlZCBEU1QgZnJvbSAxOTQwIHRocm91Z2ggMTk0NywKLSMgYW5kIHRoYXQgaXQgdXNlZCBKb3JkYW5pYW4gcnVsZXMgc3RhcnRpbmcgaW4gMTk5Ni4KLSMgV2UgZG9uJ3QgeWV0IG5lZWQgYSBzZXBhcmF0ZSBlbnRyeSBmb3IgdGhlIFdlc3QgQmFuaywgc2luY2UKLSMgdGhlIG9ubHkgZGlmZmVyZW5jZXMgYmV0d2VlbiBpdCBhbmQgR2F6YSB0aGF0IHdlIGtub3cgYWJvdXQKLSMgb2NjdXJyZWQgYmVmb3JlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLgotIyBIb3dldmVyLCBhcyB3ZSBnZXQgbW9yZSBpbmZvcm1hdGlvbiwgd2UgbWF5IG5lZWQgdG8gYWRkIGVudHJpZXMKLSMgZm9yIHBhcnRzIG9mIHRoZSBXZXN0IEJhbmsgYXMgdGhleSB0cmFuc2l0aW9uZWQgZnJvbSBJc3JhZWwncyBydWxlcwotIyB0byBQYWxlc3RpbmUncyBydWxlcy4gIElmIHlvdSBoYXZlIG1vcmUgaW5mbyBhYm91dCB0aGlzLCBwbGVhc2UKLSMgc2VuZCBpdCB0byB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGZ1dHVyZSBlZGl0aW9ucy4KLQotIyBGcm9tIElJTlMgTmV3cyBTZXJ2aWNlIC0gSXNyYWVsIC0gMTk5OC0wMy0yMyAxMDozODowNyBJc3JhZWwgdGltZSwKLSMgZm9yd2FyZGVkIGJ5IEVwaHJhaW0gU2lsdmVyYmVyZzoKLSMKLSMgRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IElzcmFlbCBjaGFuZ2VkIG92ZXIgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0jIGxhc3Qgd2VlaywgdGhlIFBMTyBBdXRob3JpdHkgKFBBKSBoYXMgZGVjaWRlZCBub3QgdG8gdHVybiBpdHMgY2xvY2tzCi0jIG9uZS1ob3VyIGZvcndhcmQgYXQgdGhpcyB0aW1lLiAgQXMgYSBzaWduIG9mIGluZGVwZW5kZW5jZSBmcm9tIElzcmFlbGkgcnVsZSwKLSMgdGhlIFBBIGhhcyBkZWNpZGVkIHRvIGltcGxlbWVudCBEU1QgaW4gQXByaWwuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIERhb3VkIEt1dHRhYiB3cml0ZXMgaW4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5qcG9zdC5jb20vY29tL0FyY2hpdmUvMjIuQXByLjE5OTkvT3Bpbmlvbi9BcnRpY2xlLTIuaHRtbCI+Ci0jIEhvbGlkYXkgaGF2b2MKLSMgPC9hPiAoSmVydXNhbGVtIFBvc3QsIDE5OTktMDQtMjIpIHRoYXQKLSMgdGhlIFBhbGVzdGluaWFuIE5hdGlvbmFsIEF1dGhvcml0eSBjaGFuZ2VkIHRvIERTVCBvbiAxOTk5LTA0LTE1LgotIyBJIHZhZ3VlbHkgcmVjYWxsIHRoYXQgdGhleSBzd2l0Y2ggYmFjayBpbiBPY3RvYmVyIChzb3JyeSwgZm9yZ290IHRoZSBzb3VyY2UpLgotIyBGb3Igbm93LCBsZXQncyBhc3N1bWUgdGhhdCB0aGUgc3ByaW5nIHN3aXRjaCB3YXMgYXQgMjQ6MDAsCi0jIGFuZCB0aGF0IHRoZXkgc3dpdGNoIGF0IDA6MDAgb24gdGhlIDNyZCBGcmlkYXlzIG9mIEFwcmlsIGFuZCBPY3RvYmVyLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTEtMjIpOgotIyBTdGFydGluZyAyMDA0IHRyYW5zaXRpb25zIGFyZSBmcm9tIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRpbWVhbmRkYXRlLmNvbS4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0xMS0yMyk6Ci0jIEEgdXNlciBmcm9tIEdhemEgcmVwb3J0ZWQgdGhhdCBHYXphIG1hZGUgdGhlIGNoYW5nZSBlYXJseSBiZWNhdXNlIG9mCi0jIHRoZSBSYW1hZGFuLiAgTmV4dCB5ZWFyIFJhbWFkYW4gd2lsbCBiZSBldmVuIGVhcmxpZXIsIHNvIEkgdGhpbmsKLSMgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSBuZXh0IHllYXIncyBlbmQgZGF0ZSB3aWxsIGJlIGFyb3VuZCB0d28gd2Vla3MKLSMgZWFybGllci0tdGhlIHNhbWUgZ29lcyBmb3IgSm9yZGFuLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA4LTE3KToKLSMgSSB3YXMgaW5mb3JtZWQgYnkgYSB1c2VyIGluIEJldGhsZWhlbSB0aGF0IGluIEJldGhsZWhlbSBpdCBzdGFydGVkIHRoZQotIyBzYW1lIGRheSBhcyBJc3JhZWwsIGFuZCBhZnRlciBjaGVja2luZyB3aXRoIG90aGVyIHVzZXJzIGluIHRoZSBhcmVhLCBJCi0jIHdhcyBpbmZvcm1lZCB0aGF0IHRoZXkgc3RhcnRlZCBEU1Qgb25lIGRheSBhZnRlciBJc3JhZWwuICBJIHdhcyBub3QKLSMgYWJsZSB0byBmaW5kIGFueSBhdXRob3JpdGF0aXZlIHNvdXJjZXMgYXQgdGhlIHRpbWUsIG5vciBkZXRhaWxzIGlmCi0jIEdhemEgY2hhbmdlZCBhcyB3ZWxsLCBidXQgcHJlc3VtZWQgR2F6YSB0byBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMKLSMgdGhlIFdlc3QgQmFuay4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOS0yNik6Ci0jIGFjY29yZGluZyB0byB0aGUgUGFsZXN0aW5lIE5ld3MgTmV0d29yayAoMjAwNi0wOS0xOSk6Ci0jIGh0dHA6Ly9lbmdsaXNoLnBubi5wcy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD01OTYmSXRlbWlkPTUKLSMgPiBUaGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgYW5ub3VuY2VkIHRoYXQgdGhpcyB5ZWFyIGl0cyB3aW50ZXIgc2NoZWR1bGUKLSMgPiB3aWxsIGJlZ2luIGVhcmx5LCBhcyBvZiBtaWRuaWdodCBUaHVyc2RheS4gIEl0IGlzIGFsc28gdGltZSB0byB0dXJuCi0jID4gYmFjayB0aGUgY2xvY2tzIGZvciB3aW50ZXIuICBGcmlkYXkgd2lsbCBiZWdpbiBhbiBob3VyIGxhdGUgdGhpcyB3ZWVrLgotIyBJIGd1ZXNzIGl0IGlzIGxpa2VseSB0aGF0IG5leHQgeWVhcidzIGRhdGUgd2lsbCBiZSBtb3ZlZCBhcyB3ZWxsLAotIyBiZWNhdXNlIG9mIHRoZSBSYW1hZGFuLgotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA3LTA5LTE4KToKLSMgQWNjb3JkaW5nIHRvIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRoZSBHYXphIFN0cmlwIGFuZCB0aGUgcmVzdCBvZiB0aGUKLSMgUGFsZXN0aW5pYW4gdGVycml0b3JpZXMgbGVmdCBEU1QgZWFybHkgb24gMTMudGguIG9mIFNlcHRlbWJlciBhdCAyOjAwLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDktMjApOgotIyBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgR2F6YSBhbmQgdGhlIFdlc3QgQmFuayBkaXNhZ3JlZSBldmVuIG92ZXIgd2hlbgotIyB0aGUgd2Vla2VuZCBpcyAoVGh1cnNkYXkrRnJpZGF5IHZlcnN1cyBGcmlkYXkrU2F0dXJkYXkpLCBzbyBJJ2QgYmUgYSBiaXQKLSMgc3VycHJpc2VkIGlmIHRoZXkgYWdyZWVkIGFib3V0IERTVC4gIEJ1dCBmb3Igbm93LCBhc3N1bWUgdGhleSBhZ3JlZS4KLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBwcmVkaWN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgd2lsbCBiZQotIyB0aGUgMm5kIFRodXJzZGF5IG9mIFNlcHRlbWJlciBhdCAwMjowMC4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOC0yOCk6Ci0jIEhlcmUgaXMgYW4gYXJ0aWNsZSwgdGhhdCBNaWRlYXN0IHJ1bm5pbmcgb24gZGlmZmVyZW50IGNsb2NrcyBhdCBSYW1hZGFuLgotIwotIyBHYXphIFN0cmlwIChhcyBFZ3lwdCkgZW5kZWQgRFNUIGF0IG1pZG5pZ2h0IFRodXJzZGF5IChBdWcgMjgsIDIwMDgpLCB3aGlsZQotIyB0aGUgV2VzdCBCYW5rIHdpbGwgZW5kIERheWxpZ2h0IFNhdmluZyBUaW1lIGF0IG1pZG5pZ2h0IFN1bmRheSAoQXVnIDMxLCAyMDA4KS4KLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxIj4KLSMgaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3Ij4KLSMgaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sCi0jIDwvYT4KLQotIyBUaGUgcnVsZXMgZm9yIEVneXB0IGFyZSBzdG9sZW4gZnJvbSB0aGUgYGFmcmljYScgZmlsZS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlIEVneXB0QXNpYQkxOTU3CW9ubHkJLQlNYXkJMTAJMDowMAkxOjAwCVMKLVJ1bGUgRWd5cHRBc2lhCTE5NTcJMTk1OAktCU9jdAkgMQkwOjAwCTAJLQotUnVsZSBFZ3lwdEFzaWEJMTk1OAlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlIEVneXB0QXNpYQkxOTU5CTE5NjcJLQlNYXkJIDEJMTowMAkxOjAwCVMKLVJ1bGUgRWd5cHRBc2lhCTE5NTkJMTk2NQktCVNlcAkzMAkzOjAwCTAJLQotUnVsZSBFZ3lwdEFzaWEJMTk2Nglvbmx5CS0JT2N0CSAxCTM6MDAJMAktCi0KLVJ1bGUgUGFsZXN0aW5lCTE5OTkJMjAwNQktCUFwcglGcmk+PTE1CTA6MDAJMTowMAlTCi1SdWxlIFBhbGVzdGluZQkxOTk5CTIwMDMJLQlPY3QJRnJpPj0xNQkwOjAwCTAJLQotUnVsZSBQYWxlc3RpbmUJMjAwNAlvbmx5CS0JT2N0CSAxCTE6MDAJMAktCi1SdWxlIFBhbGVzdGluZQkyMDA1CW9ubHkJLQlPY3QJIDQJMjowMAkwCS0KLVJ1bGUgUGFsZXN0aW5lCTIwMDYJbWF4CS0JQXByCSAxCTA6MDAJMTowMAlTCi1SdWxlIFBhbGVzdGluZQkyMDA2CW9ubHkJLQlTZXAJMjIJMDowMAkwCS0KLVJ1bGUgUGFsZXN0aW5lCTIwMDcJb25seQktCVNlcAlUaHU+PTgJMjowMAkwCS0KLVJ1bGUgUGFsZXN0aW5lCTIwMDgJbWF4CS0JQXVnCWxhc3RUaHUJMjowMAkwCS0KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0dhemEJMjoxNzo1MgktCUxNVAkxOTAwIE9jdAotCQkJMjowMAlaaW9uCUVFVAkxOTQ4IE1heSAxNQotCQkJMjowMCBFZ3lwdEFzaWEJRUUlc1QJMTk2NyBKdW4gIDUKLQkJCTI6MDAJWmlvbglJJXNUCTE5OTYKLQkJCTI6MDAJSm9yZGFuCUVFJXNUCTE5OTkKLQkJCTI6MDAgUGFsZXN0aW5lCUVFJXNUCi0KLSMgUGFyYWNlbCBJcwotIyBubyBpbmZvcm1hdGlvbgotCi0jIFBoaWxpcHBpbmVzCi0jIE9uIDE4NDQtMDgtMTYsIE5hcmNpc28gQ2xhdmVyaWEsIGdvdmVybm9yLWdlbmVyYWwgb2YgdGhlCi0jIFBoaWxpcHBpbmVzLCBpc3N1ZWQgYSBwcm9jbGFtYXRpb24gYW5ub3VuY2luZyB0aGF0IDE4NDQtMTItMzAgd2FzIHRvCi0jIGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IDE4NDUtMDEtMDEuICBSb2JlcnQgSC4gdmFuIEdlbnQgaGFzIGEKLSMgdHJhbnNjcmlwdCBvZiB0aGUgZGVjcmVlIGluIDxodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2lkbC9pZGwuaHRtPi4KLSMgVGhlIHJlc3Qgb2YgdGhlIGRhdGEgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMjUpOgotIyBUb21vcnJvdydzIE1hbmlsYSBTdGFuZGFyZCByZXBvcnRzIHRoYXQgdGhlIFBoaWxpcHBpbmVzIERlcGFydG1lbnQgb2YKLSMgVHJhZGUgYW5kIEluZHVzdHJ5IGlzIGNvbnNpZGVyaW5nIGFkb3B0aW5nIERTVCB0aGlzIEp1bmUgd2hlbiB0aGUKLSMgcmFpbnkgc2Vhc29uIGJlZ2lucy4gIFNlZQotIyA8aHR0cDovL3d3dy5tYW5pbGFzdGFuZGFyZHRvZGF5LmNvbS8/cGFnZT1wb2xpdGljczAyX2FwcmlsMjZfMjAwNj4uCi0jIEZvciBub3csIHdlJ2xsIGlnbm9yZSB0aGlzLCBzaW5jZSBpdCdzIG5vdCBkZWZpbml0ZSBhbmQgd2UgbGFjayBkZXRhaWxzLgotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNC0yNik6Ci0jIC4uLiBjbGFpbXMgdGhhdCBQaGlsaXBwaW5lcyBoYWQgRFNUIGxhc3QgdGltZSBpbiAxOTkwOgotIyBodHRwOi8vc3RvcnkucGhpbGlwcGluZXRpbWVzLmNvbS9wLngvY3QvOS9pZC8xNDViZTIwY2M2YjEyMWMwL2NpZC8zZTViYmNjYzczMGQyNThjLwotIyBbYSBzdG9yeSBkYXRlZCAyMDA2LTA0LTI1IGJ5IENyaXMgTGFyYW5vIG9mIERvdyBKb25lcyBOZXdzd2lyZXMsCi0jIGJ1dCBubyBkZXRhaWxzXQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlQaGlsCTE5MzYJb25seQktCU5vdgkxCTA6MDAJMTowMAlTCi1SdWxlCVBoaWwJMTkzNwlvbmx5CS0JRmViCTEJMDowMAkwCS0KLVJ1bGUJUGhpbAkxOTU0CW9ubHkJLQlBcHIJMTIJMDowMAkxOjAwCVMKLVJ1bGUJUGhpbAkxOTU0CW9ubHkJLQlKdWwJMQkwOjAwCTAJLQotUnVsZQlQaGlsCTE5NzgJb25seQktCU1hcgkyMgkwOjAwCTE6MDAJUwotUnVsZQlQaGlsCTE5NzgJb25seQktCVNlcAkyMQkwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL01hbmlsYQktMTU6NTY6MDAgLQlMTVQJMTg0NCBEZWMgMzEKLQkJCTg6MDQ6MDAgLQlMTVQJMTg5OSBNYXkgMTEKLQkJCTg6MDAJUGhpbAlQSCVzVAkxOTQyIE1heQotCQkJOTowMAktCUpTVAkxOTQ0IE5vdgotCQkJODowMAlQaGlsCVBIJXNUCi0KLSMgUWF0YXIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9RYXRhcgkzOjI2OjA4IC0JTE1UCTE5MjAJIyBBbCBEYXdoYWggLyBEb2hhCi0JCQk0OjAwCS0JR1NUCTE5NzIgSnVuCi0JCQkzOjAwCS0JQVNUCi0KLSMgU2F1ZGkgQXJhYmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUml5YWRoCTM6MDY6NTIgLQlMTVQJMTk1MAotCQkJMzowMAktCUFTVAotCi0jIFNpbmdhcG9yZQotIyBUaGUgZGF0YSBoZXJlIGFyZSB0YWtlbiBmcm9tIE1vayBMeSBZbmcgKDIwMDMtMTAtMzApCi0jIDxodHRwOi8vd3d3Lm1hdGgubnVzLmVkdS5zZy9hc2xha3Nlbi90ZWFjaGluZy90aW1lem9uZS5odG1sPi4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9TaW5nYXBvcmUJNjo1NToyNSAtCUxNVAkxOTAxIEphbiAgMQotCQkJNjo1NToyNQktCVNNVAkxOTA1IEp1biAgMSAjIFNpbmdhcG9yZSBNLlQuCi0JCQk3OjAwCS0JTUFMVAkxOTMzIEphbiAgMSAjIE1hbGF5YSBUaW1lCi0JCQk3OjAwCTA6MjAJTUFMU1QJMTkzNiBKYW4gIDEKLQkJCTc6MjAJLQlNQUxUCTE5NDEgU2VwICAxCi0JCQk3OjMwCS0JTUFMVAkxOTQyIEZlYiAxNgotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAxMgotCQkJNzozMAktCU1BTFQJMTk2NSBBdWcgIDkgIyBpbmRlcGVuZGVuY2UKLQkJCTc6MzAJLQlTR1QJMTk4MiBKYW4gIDEgIyBTaW5nYXBvcmUgVGltZQotCQkJODowMAktCVNHVAotCi0jIFNwcmF0bHkgSXMKLSMgbm8gaW5mb3JtYXRpb24KLQotIyBTcmkgTGFua2EKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6Ci0jICJTcmkgTGFua2EgYWR2YW5jZXMgY2xvY2sgYnkgYW4gaG91ciB0byBhdm9pZCBibGFja291dCIKLSMgKHd3dy52aXJ0dWFsLXBjLmNvbS9sYW5rYXdlYi9uZXdzL2l0ZW1zLzI0MDU5Ni0yLmh0bWwsIDE5OTYtMDUtMjQsCi0jIG5vIGxvbmdlciBhdmFpbGFibGUgYXMgb2YgMTk5OS0wOC0xNykKLSMgcmVwb3J0ZWQgYGB0aGUgY291bnRyeSdzIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBwdXQgZm9yd2FyZCBieSBvbmUgaG91ciBhdAotIyBtaWRuaWdodCBGcmlkYXkgKDE4MzAgR01UKSBgaW4gdGhlIGxpZ2h0IG9mIHRoZSBwcmVzZW50IHBvd2VyIGNyaXNpcycuJycKLSMKLSMgRnJvbSBEaGFybWFzaXJpIFNlbmFuYXlha2UsIFNyaSBMYW5rYSBNZWRpYSBNaW5pc3RlciAoMTk5Ni0xMC0yNCksIGFzIHF1b3RlZAotIyBieSBTaGFtaW5kcmEgaW4KLSMgPGEgaHJlZj0ibmV3czo1NHJrYTUkbTVoQG10aW5zYzAxLW1ndC5vcHMud29ybGRuZXQuYXR0Lm5ldCI+Ci0jIERhaWx5IE5ld3MgLSBIb3QgTmV3cyBTZWN0aW9uICgxOTk2LTEwLTI2KQotIyA8L2E+OgotIyBXaXRoIGVmZmVjdCBmcm9tIDEyLjMwIGEubS4gb24gMjZ0aCBPY3RvYmVyIDE5OTYKLSMgU3JpIExhbmthIHdpbGwgYmUgc2l4ICgwNikgaG91cnMgYWhlYWQgb2YgR01ULgotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA0LTE0KSwgcXVvdGluZyBTcmkgTGFua2EgTmV3cyBPbmxpbmUKLSMgPGh0dHA6Ly9uZXdzLnNpbmhhbGF5YS5jb20vd212aWV3LnBocD9BcnRJRD0xMTAwMj4gKDIwMDYtMDQtMTMpOgotIyAwMDMwIGhycyBvbiBBcHJpbCAxNSwgMjAwNiAobWlkbmlnaHQgb2YgQXByaWwgMTQsIDIwMDYgKzMwIG1pbnV0ZXMpCi0jIGF0IHByZXNlbnQsIGJlY29tZSAyNDAwIGhvdXJzIG9mIEFwcmlsIDE0LCAyMDA2IChtaWRuaWdodCBvZiBBcHJpbCAxNCwgMjAwNikuCi0KLSMgRnJvbSBQZXRlciBBcHBzIGFuZCBSYW5nYSBTaXJpbGEgb2YgUmV1dGVycyAoMjAwNi0wNC0xMikgaW46Ci0jIDxodHRwOi8vdG9kYXkucmV1dGVycy5jby51ay9uZXdzL25ld3NBcnRpY2xlLmFzcHg/dHlwZT1zY2llbmNlTmV3cyZzdG9yeUlEPTIwMDYtMDQtMTJUMTcyMjI4Wl8wMV9DT0wyOTU3NjJfUlRSSURTVF8wX1NDSUVOQ0UtU1JJTEFOS0EtVElNRS1EQy5YTUw+Ci0jIFtUaGUgVGFtaWwgVGlnZXJzXSBuZXZlciBhY2NlcHRlZCB0aGUgb3JpZ2luYWwgMTk5NiB0aW1lIGNoYW5nZSBhbmQgc2ltcGx5Ci0jIGtlcHQgdGhlaXIgY2xvY2tzIHNldCBmaXZlIGFuZCBhIGhhbGYgaG91cnMgYWhlYWQgb2YgR3JlZW53aWNoIE1lYW4KLSMgVGltZSAoR01UKSwgaW4gbGluZSB3aXRoIG5laWdoYm9yIEluZGlhLgotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTE4KToKLSMgUGVvcGxlIHdobyBsaXZlIGluIHJlZ2lvbnMgdW5kZXIgVGFtaWwgY29udHJvbCBjYW4gdXNlIFtUWj0nQXNpYS9Lb2xrYXRhJ10sCi0jIGFzIHRoYXQgem9uZSBoYXMgYWdyZWVkIHdpdGggdGhlIFRhbWlsIGFyZWFzIHNpbmNlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLgotCi0jIEZyb20gSyBTZXRodSAoMjAwNi0wNC0yNSk6Ci0jIEkgdGhpbmsgdGhlIGFiYnJldmlhdGlvbiBMS1Qgb3JpZ2luYXRlZCBmcm9tIHRoZSB3b3JsZCBvZiBjb21wdXRlcnMgYXQKLSMgdGhlIHRpbWUgb2Ygb3Igc3Vic2VxdWVudCB0byB0aGUgdGltZSB6b25lIGNoYW5nZXMgYnkgU0wgR292ZXJubWVudAotIyB0d2ljZSBpbiAxOTk2IGFuZCBwcm9iYWJseSBTTCBHb3Zlcm5tZW50IG9yIGl0cyBzdGFuZGFyZGl6YXRpb24KLSMgYWdlbmNpZXMgbmV2ZXIgZGVjbGFyZWQgYW4gYWJicmV2aWF0aW9uIGFzIGEgbmF0aW9uYWwgc3RhbmRhcmQuCi0jCi0jIEkgcmVjb2xsZWN0IGJlZm9yZSB0aGUgcmVjZW50IGNoYW5nZSB0aGUgZ292ZXJubWVudCBhbm5vdWNlbW1lbnRzCi0jIG1lbnRpb25pbmcgaXQgYXMgc2ltcGx5IGNoYW5naW5nIFNyaSBMYW5rYSBTdGFuZGFyZCBUaW1lIG9yIFNyaSBMYW5rYQotIyBUaW1lIGFuZCBubyBtZW50aW9uIHdhcyBtYWRlIGFib3V0IHRoZSBhYmJyZXZpYXRpb24uCi0jCi0jIElmIHdlIGxvb2sgYXQgU3JpIExhbmthIERlcGFydG1lbnQgb2YgR292ZXJubWVudCdzICJPZmZpY2lhbCBOZXdzCi0jIFdlYnNpdGUgb2YgU3JpIExhbmthIiAuLi4gaHR0cDovL3d3dy5uZXdzLmxrLyB3ZSBjYW4gc2VlIHRoYXQgdGhleQotIyB1c2UgU0xUIGFzIGFiYnJldmlhdGlvbiBpbiB0aW1lIHN0YW1wIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBuZXdzCi0jIGl0ZW0uLi4uCi0jCi0jIFdpdGhpbiBTcmkgTGFua2EgSSB0aGluayBMS1QgaXMgd2VsbCBrbm93biBhbW9uZyBjb21wdXRlciB1c2VycyBhbmQKLSMgYWRtaW5zaXRyYXRvcnMuICBJbiBteSBvcGluaW9uIFNMVCBtYXkgbm90IGJlIGEgZ29vZCBjaG9pY2UgYmVjYXVzZSB0aGUKLSMgbmF0aW9uJ3MgbGFyZ2VzdCB0ZWxjb20gLyBpbnRlcm5ldCBvcGVyYXRvciBTcmkgTGFua2EgVGVsY29tIGlzIHdlbGwKLSMga25vd24gYnkgdGhhdCBhYmJyZXZpYXRpb24gLSBzaW1wbHkgYXMgU0xUICh0aGVyZSBJUCBkb21haW5zIGFyZQotIyBzbHQubGsgYW5kIHNsdG5ldC5saykuCi0jCi0jIEJ1dCBpZiBpbmRlZWQgb3VyIGdvdmVybm1lbnQgaGFzIGFkb3B0ZWQgU0xUIGFzIHN0YW5kYXJkIGFiYnJldmlhdGlvbgotIyAodGhhdCB3ZSBoYXZlIG5vdCBrbm93biBzbyBmYXIpIHRoZW4gIGl0IGlzIGJldHRlciB0aGF0IGl0IGJlIHVzZWQgZm9yCi0jIGFsbCBjb21wdXRlcnMuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNC0yNSk6Ci0jIE9uZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHdlIHdhaXQgZm9yIGEgYml0IGZvciB0aGUgZHVzdCB0byBzZXR0bGUgZG93bgotIyBhbmQgdGhlbiBzZWUgd2hhdCBwZW9wbGUgYWN0dWFsbHkgc2F5IGluIHByYWN0aWNlLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQ29sb21ibwk1OjE5OjI0IC0JTE1UCTE4ODAKLQkJCTU6MTk6MzIJLQlNTVQJMTkwNgkjIE1vcmF0dXdhIE1lYW4gVGltZQotCQkJNTozMAktCUlTVAkxOTQyIEphbiAgNQotCQkJNTozMAkwOjMwCUlIU1QJMTk0MiBTZXAKLQkJCTU6MzAJMTowMAlJU1QJMTk0NSBPY3QgMTYgMjowMAotCQkJNTozMAktCUlTVAkxOTk2IE1heSAyNSAwOjAwCi0JCQk2OjMwCS0JTEtUCTE5OTYgT2N0IDI2IDA6MzAKLQkJCTY6MDAJLQlMS1QJMjAwNiBBcHIgMTUgMDozMAotCQkJNTozMAktCUlTVAotCi0jIFN5cmlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlTeXJpYQkxOTIwCTE5MjMJLQlBcHIJU3VuPj0xNQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTIwCTE5MjMJLQlPY3QJU3VuPj0xCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5NjIJb25seQktCUFwcgkyOQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTYyCW9ubHkJLQlPY3QJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTYzCTE5NjUJLQlNYXkJMQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTYzCW9ubHkJLQlTZXAJMzAJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk2NAlvbmx5CS0JT2N0CTEJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk2NQlvbmx5CS0JU2VwCTMwCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5NjYJb25seQktCUFwcgkyNAkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTY2CTE5NzYJLQlPY3QJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTY3CTE5NzgJLQlNYXkJMQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTc3CTE5NzgJLQlTZXAJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTgzCTE5ODQJLQlBcHIJOQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTgzCTE5ODQJLQlPY3QJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTg2CW9ubHkJLQlGZWIJMTYJMjowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk4Nglvbmx5CS0JT2N0CTkJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk4Nwlvbmx5CS0JTWFyCTEJMjowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk4NwkxOTg4CS0JT2N0CTMxCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5ODgJb25seQktCU1hcgkxNQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTg5CW9ubHkJLQlNYXIJMzEJMjowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk4OQlvbmx5CS0JT2N0CTEJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk5MAlvbmx5CS0JQXByCTEJMjowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk5MAlvbmx5CS0JU2VwCTMwCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5OTEJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTkxCTE5OTIJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJU3lyaWEJMTk5Mglvbmx5CS0JQXByCSA4CTA6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5OTMJb25seQktCU1hcgkyNgkwOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTkzCW9ubHkJLQlTZXAJMjUJMDowMAkwCS0KLSMgSUFUQSBTU0lNICgxOTk4LTAyKSBzYXlzIDE5OTgtMDQtMDI7Ci0jICgxOTk4LTA5KSBzYXlzIDE5OTktMDMtMjkgYW5kIDE5OTktMDktMjk7ICgxOTk5LTAyKSBzYXlzIDE5OTktMDQtMDIsCi0jIDIwMDAtMDQtMDIsIGFuZCAyMDAxLTA0LTAyOyAoMTk5OS0wOSkgc2F5cyAyMDAwLTAzLTMxIGFuZCAyMDAxLTAzLTMxOwotIyAoMjAwNikgc2F5cyAyMDA2LTAzLTMxIGFuZCAyMDA2LTA5LTIyOwotIyBmb3Igbm93IGlnbm9yZSBhbGwgdGhlc2UgY2xhaW1zIGFuZCBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciwKLSMgZXhjZXB0IGZvciB0aGUgMjAwNi0wOS0yMiBjbGFpbSAod2hpY2ggc2VlbXMgcmlnaHQgZm9yIFJhbWFkYW4pLgotUnVsZQlTeXJpYQkxOTk0CTE5OTYJLQlBcHIJIDEJMDowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk5NAkyMDA1CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCVN5cmlhCTE5OTcJMTk5OAktCU1hcglsYXN0TW9uCTA6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5OTkJMjAwNgktCUFwcgkgMQkwOjAwCTE6MDAJUwotIyBGcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZSAoMjAwNi0wOS0xOCk6Ci0jIEFjY29yZGluZyB0byBJQVRBIGRhdGEsIFN5cmlhIHdpbGwgY2hhbmdlIERTVCBvbiAyMXN0IFNlcHRlbWJlciBbMjE6MDAgVVRDXQotIyB0aGlzIHllYXIgW29ubHldLi4uLiAgVGhpcyBpcyBwcm9iYWJseSByZWxhdGVkIHRvIFJhbWFkYW4sIGxpa2UgRWd5cHQuCi1SdWxlCVN5cmlhCTIwMDYJb25seQktCVNlcAkyMgkwOjAwCTAJLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTI5KToKLSMgVG9kYXkgdGhlIEFQIHJlcG9ydGVkICJTeXJpYSB3aWxsIHN3aXRjaCB0byBzdW1tZXJ0aW1lIGF0IG1pZG5pZ2h0IFRodXJzZGF5LiIKLSMgaHR0cDovL3d3dy5paHQuY29tL2FydGljbGVzL2FwLzIwMDcvMDMvMjkvYWZyaWNhL01FLUdFTi1TeXJpYS1UaW1lLUNoYW5nZS5waHAKLVJ1bGUJU3lyaWEJMjAwNwlvbmx5CS0JTWFyCWxhc3RGcmkJMDowMAkxOjAwCVMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FyZCAoMjAwNy0xMC0yNyk6Ci0jIFRoZSBzaXN0ZXIgY2VudGVyIElDQVJEQSBvZiBteSB3b3JrIENJTU1ZVCBpcyBjb25maXJtaW5nIHRoYXQgU3lyaWEgRFNUIHdpbGwKLSMgbm90IHRha2UgcGxhY2UgMS5zdCBOb3ZlbWJlciBhdCAwOjAwIG8nY2xvY2sgYnV0IDEuc3QgTm92ZW1iZXIgYXQgMjQ6MDAgb3IKLSMgcmF0aGVyIE1pZG5pZ2h0IGJldHdlZW4gVGh1cnNkYXkgYW5kIEZyaWRheS4gVGhpcyBkb2VzIG1ha2UgbW9yZSBzZW5jZSB0aGFuCi0jIGhhdmluZyBpdCBiZXR3ZWVuIFdlZG5lc2RheSBhbmQgVGh1cnNkYXkgKHR3byB3b3JrZGF5cyBpbiBTeXJpYSkgc2luY2UgdGhlCi0jIHdlZWtlbmQgaW4gU3lyaWEgaXMgbm90IFNhdHVyZGF5IGFuZCBTdW5kYXksIGJ1dCBGcmlkYXkgYW5kIFNhdHVyZGF5LiBTbyBub3cKLSMgaXQgaXMgaW1wbGVtZW50ZWQgYXQgbWlkbmlnaHQgb2YgdGhlIGxhc3Qgd29ya2RheSBiZWZvcmUgd2Vla2VuZC4uLgotIyAKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMTAtMjcpOgotIyBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gd3JvdGU6Ci0jIAotIyA+ICJXaW50ZXIgbG9jYWwgdGltZSBpbiBTeXJpYSB3aWxsIGJlIG9ic2VydmVkIGF0IG1pZG5pZ2h0IG9mIFRodXJzZGF5IDEKLSMgPiBOb3ZlbWJlciAyMDA3LCBhbmQgdGhlIGNsb2NrIHdpbGwgYmUgcHV0IGJhY2sgMSBob3VyLiIKLSMgCi0jIEkgZm91bmQgY29uZmlybWF0aW9uIG9uIHRoaXMgaW4gdGhpcyBnb3Yuc3ktYXJ0aWNsZSAoQXJhYmljKToKLSMgaHR0cDovL3dlaGRhLmFsd2VoZGEuZ292LnN5L19wcmludF92ZWl3LmFzcD9GaWxlTmFtZT0xMjUyMTcxMDUyMDA3MDkyNjExMTI0NwotIyAKLSMgd2hpY2ggdXNpbmcgR29vZ2xlJ3MgdHJhbnNsYXRlIHRvb2xzIHNheXM6Ci0jIENvdW5jaWwgb2YgTWluaXN0ZXJzIGFsc28gYXBwcm92ZWQgdGhlIGNvbW1lbmNlbWVudCBvZiB3b3JrIG9uIAotIyBpZGVudGlmeWluZyB0aGUgd2ludGVyIHRpbWUgYXMgb2YgRnJpZGF5LCAyLzExLzIwMDcgd2hlcmUgdGhlIDYwdGggCi0jIG1pbnV0ZSBkZWxheSBhdCBtaWRuaWdodCBUaHVyc2RheSAxLzExLzIwMDcuCi1SdWxlCVN5cmlhCTIwMDcJb25seQktCU5vdgkgRnJpPj0xCTA6MDAJMAktCi0KLSMgRnJvbSBTdGVwaGVuIENvbGVib3VybmUgKDIwMDgtMDMtMTcpOgotIyBGb3IgZXZlcnlvbmUncyBpbmZvLCBJIHNhdyBhbiBJQVRBIHRpbWUgem9uZSBjaGFuZ2UgZm9yIFtTeXJpYV0gZm9yCi0jIHRoaXMgbW9udGggKE1hcmNoIDIwMDgpIGluIHRoZSBsYXN0IGRheSBvciBzby4uLlRoaXMgaXMgdGhlIGRhdGEgSUFUQQotIyBhcmUgbm93IHVzaW5nOgotIyBDb3VudHJ5ICAgICBUaW1lIFN0YW5kYXJkICAgLS0tIERTVCBTdGFydCAtLS0gICAtLS0gRFNUIEVuZCAtLS0gIERTVAotIyBOYW1lICAgICAgICBab25lIFZhcmlhdGlvbiAgIFRpbWUgICAgRGF0ZSAgICAgICAgVGltZSAgICBEYXRlCi0jIFZhcmlhdGlvbgotIyBTeXJpYW4gQXJhYgotIyBSZXB1YmxpYyAgICBTWSAgICArMDIwMCAgICAgIDIyMDAgIDAzQVBSMDggICAgICAgMjEwMCAgMzBTRVAwOCAgICswMzAwCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMCAgMDJBUFIwOSAgICAgICAyMTAwICAzMFNFUDA5ICAgKzAzMDAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAwICAwMUFQUjEwICAgICAgIDIxMDAgIDMwU0VQMTAgICArMDMwMAotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTE3KToKLSMgSGVyZSdzIGEgbGluayB0byBFbmdsaXNoLWxhbmd1YWdlIGNvdmVyYWdlIGJ5IHRoZSBTeXJpYW4gQXJhYiBOZXdzCi0jIEFnZW5jeSAoU0FOQSkuLi4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5hLnN5L2VuZy8yMS8yMDA4LzAzLzExLzE2NTE3My5odG0iPgotIyBodHRwOi8vd3d3LnNhbmEuc3kvZW5nLzIxLzIwMDgvMDMvMTEvMTY1MTczLmh0bQotIyA8L2E+Li4ud2hpY2ggcmVhZHMgKGluIHBhcnQpICJUaGUgQ2FiaW5ldCBhcHByb3ZlZCB0aGUgc3VnZ2VzdGlvbiBvZiB0aGUKLSMgTWluaXN0cnkgb2YgRWxlY3RyaWNpdHkgdG8gYmVnaW4gZGF5bGlnaHQgc2F2aW5ncyB0aW1lIG9uIEZyaWRheSBBcHJpbAotIyA0dGgsIGFkdmFuY2luZyBjbG9ja3Mgb25lIGhvdXIgYWhlYWQgb24gbWlkbmlnaHQgb2YgVGh1cnNkYXkgQXByaWwgM3JkLiIKLSMgU2luY2UgU3lyaWEgaXMgdHdvIGhvdXJzIGVhc3Qgb2YgVVRDLCB0aGUgMjIwMCBhbmQgMjEwMCB0cmFuc2l0aW9uIHRpbWVzCi0jIHNob3duIGFib3ZlIG1hdGNoIHVwIHdpdGggbWlkbmlnaHQgaW4gU3lyaWEuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTgpOgotIyBNeSBidWVzdCBndWVzcyBhdCBhIFN5cmlhbiBydWxlIGlzICJ0aGUgRnJpZGF5IG5lYXJlc3QgQXByaWwgMSI7Ci0jIGNvZGluZyB0aGF0IGludm9sdmVzIGVpdGhlciB1c2luZyBhICJNYXIgRnJpPj0yOSIgY29uc3RydWN0IHRoYXQgb2xkIHRpbWUgem9uZQotIyBjb21waWxlcnMgY2FuJ3QgaGFuZGxlICBvciBoYXZpbmcgbXVsdGlwbGUgUnVsZXMgKGEgbGEgSXNyYWVsKS4KLSMgRm9yIG5vdywgdXNlICJBcHIgRnJpPj0xIiwgYW5kIGdvIHdpdGggSUFUQSBvbiBhIHVuaWZvcm0gU2VwIDMwIGVuZC4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0xMC0wNyk6Ci0jIFN5cmlhIGhhcyBub3cgb2ZmaWNpYWxseSBkZWNpZGVkIHRvIGVuZCBEU1Qgb24gMjAwOC0xMS0wMSB0aGlzIHllYXIsCi0jIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGFydGljbGUgaW4gdGhlIFN5cmlhbiBBcmFiIE5ld3MgQWdlbmN5IChTQU5BKS4KLSMKLSMgVGhlIGFydGljbGUgaXMgaW4gQXJhYmljLCBhbmQgc2VlbXMgdG8gdGVsbCB0aGF0IHRoZXkgd2lsbCBnbyBiYWNrIHRvCi0jIHdpbnRlciB0aW1lIG9uIDIwMDgtMTEtMDEgYXQgMDA6MDAgbG9jYWwgZGF5bGlnaHQgdGltZSAoZGVsYXlpbmcvc2V0dGluZwotIyBjbG9ja3MgYmFjayA2MCBtaW51dGVzKS4KLSMKLSMgPGEgaHJlZj0iaHR0cDovL3NhbmEuc3kvYXJhLzIvMjAwOC8xMC8wNy8xOTU0NTkuaHRtIj4KLSMgaHR0cDovL3NhbmEuc3kvYXJhLzIvMjAwOC8xMC8wNy8xOTU0NTkuaHRtCi0jIDwvYT4KLQotUnVsZQlTeXJpYQkyMDA4CW1heAktCUFwcglGcmk+PTEJMDowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMjAwOAltYXgJLQlOb3YJMQkwOjAwCTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGFtYXNjdXMJMjoyNToxMiAtCUxNVAkxOTIwCSMgRGltYXNocQotCQkJMjowMAlTeXJpYQlFRSVzVAotCi0jIFRhamlraXN0YW4KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRHVzaGFuYmUJNDozNToxMiAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCURVU1QJMTkzMCBKdW4gMjEgIyBEdXNoYW5iZSBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEgRFVTJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQk1OjAwCTE6MDAJRFVTU1QJMTk5MSBTZXAgIDkgMjowMHMKLQkJCTU6MDAJLQlUSlQJCSAgICAjIFRhamlraXN0YW4gVGltZQotCi0jIFRoYWlsYW5kCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFuZ2tvawk2OjQyOjA0CS0JTE1UCTE4ODAKLQkJCTY6NDI6MDQJLQlCTVQJMTkyMCBBcHIgIyBCYW5na29rIE1lYW4gVGltZQotCQkJNzowMAktCUlDVAotCi0jIFR1cmttZW5pc3RhbgotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9Bc2hnYWJhdAkzOjUzOjMyIC0JTE1UCTE5MjQgTWF5ICAyICMgb3IgQXNoa2hhYmFkCi0JCQk0OjAwCS0JQVNIVAkxOTMwIEp1biAyMSAjIEFzaGtoYWJhZCBUaW1lCi0JCQk1OjAwIFJ1c3NpYUFzaWEJQVNIJXNUCTE5OTEgTWFyIDMxIDI6MDAKLQkJCTQ6MDAgUnVzc2lhQXNpYQlBU0glc1QJMTk5MSBPY3QgMjcgIyBpbmRlcGVuZGVuY2UKLQkJCTQ6MDAgUnVzc2lhQXNpYQlUTSVzVAkxOTkyIEphbiAxOSAyOjAwCi0JCQk1OjAwCS0JVE1UCi0KLSMgVW5pdGVkIEFyYWIgRW1pcmF0ZXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9EdWJhaQkzOjQxOjEyIC0JTE1UCTE5MjAKLQkJCTQ6MDAJLQlHU1QKLQotIyBVemJla2lzdGFuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvU2FtYXJrYW5kCTQ6Mjc6MTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlTQU1UCTE5MzAgSnVuIDIxICMgU2FtYXJrYW5kIFRpbWUKLQkJCTU6MDAJLQlTQU1UCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJU0FNU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlUQVNUCTE5ODIgQXByICAxICMgVGFzaGtlbnQgVGltZQotCQkJNTowMCBSdXNzaWFBc2lhCVNBTSVzVAkxOTkxIFNlcCAgMSAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCVVaJXNUCTE5OTIKLQkJCTU6MDAJLQlVWlQKLVpvbmUJQXNpYS9UYXNoa2VudAk0OjM3OjEyIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQk1OjAwCS0JVEFTVAkxOTMwIEp1biAyMSAjIFRhc2hrZW50IFRpbWUKLQkJCTY6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBNYXIgMzEgMjowMAotCQkJNTowMCBSdXNzaWFBc2lhCVRBUyVzVAkxOTkxIFNlcCAgMSAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCVVaJXNUCTE5OTIKLQkJCTU6MDAJLQlVWlQKLQotIyBWaWV0bmFtCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTgpOgotIyBUaGUgRW5nbGlzaC1sYW5ndWFnZSBuYW1lIG9mIFZpZXRuYW0ncyBtb3N0IHBvcHVsb3VzIGNpdHkgaXMgIkhvIENoaSBNaW4gQ2l0eSI7Ci0jIHdlIHVzZSBIb19DaGlfTWluaCBiZWxvdyB0byBhdm9pZCBhIG5hbWUgb2YgbW9yZSB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvSG9fQ2hpX01pbmgJNzowNjo0MCAtCUxNVAkxOTA2IEp1biAgOQotCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAwOjAxICMgU2FpZ29uIE1UPwotCQkJNzowMAktCUlDVAkxOTEyIE1heQotCQkJODowMAktCUlDVAkxOTMxIE1heQotCQkJNzowMAktCUlDVAotCi0jIFllbWVuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQWRlbgkzOjAwOjQ4CS0JTE1UCTE5NTAKLQkJCTM6MDAJLQlBU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2F1c3RyYWxhc2lhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYXVzdHJhbGFzaWEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjA4Y2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvYXVzdHJhbGFzaWEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU0ICswLDAgQEAKLSMgQCgjKWF1c3RyYWxhc2lhCTguOQotIyA8cHJlPgotCi0jIFRoaXMgZmlsZSBhbHNvIGluY2x1ZGVzIFBhY2lmaWMgaXNsYW5kcy4KLQotIyBOb3RlcyBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF1c3RyYWxpYQotCi0jIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGJlbG93IGZvciB0aGUgY29udHJvdmVyc3kgYWJvdXQgIkVTVCIgdmVyc3VzICJBRVNUIiBldGMuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUF1cwkxOTE3CW9ubHkJLQlKYW4JIDEJMDowMQkxOjAwCS0KLVJ1bGUJQXVzCTE5MTcJb25seQktCU1hcgkyNQkyOjAwCTAJLQotUnVsZQlBdXMJMTk0Mglvbmx5CS0JSmFuCSAxCTI6MDAJMTowMAktCi1SdWxlCUF1cwkxOTQyCW9ubHkJLQlNYXIJMjkJMjowMAkwCS0KLVJ1bGUJQXVzCTE5NDIJb25seQktCVNlcAkyNwkyOjAwCTE6MDAJLQotUnVsZQlBdXMJMTk0MwkxOTQ0CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KLVJ1bGUJQXVzCTE5NDMJb25seQktCU9jdAkgMwkyOjAwCTE6MDAJLQotIyBHbyB3aXRoIFdoaXRtYW4gYW5kIHRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFN0YW5kYXJkcyBDb21taXNzaW9uLCB3aGljaAotIyBzYXlzIFcgQXVzdHJhbGlhIGRpZG4ndCB1c2UgRFNUIGluIDE5NDMvMTk0NC4gIElnbm9yZSBXaGl0bWFuJ3MgY2xhaW0gdGhhdAotIyAxOTQ0LzE5NDUgd2FzIGp1c3QgbGlrZSAxOTQzLzE5NDQuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgTm9ydGhlcm4gVGVycml0b3J5Ci1ab25lIEF1c3RyYWxpYS9EYXJ3aW4JIDg6NDM6MjAgLQlMTVQJMTg5NSBGZWIKLQkJCSA5OjAwCS0JQ1NUCTE4OTkgTWF5Ci0JCQkgOTozMAlBdXMJQ1NUCi0jIFdlc3Rlcm4gQXVzdHJhbGlhCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBVwkxOTc0CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk3NQlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMTk4Mwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFXCTE5ODQJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFXCTE5OTEJb25seQktCU5vdgkxNwkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk5Mglvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMjAwNglvbmx5CS0JRGVjCSAzCTI6MDBzCTE6MDAJLQotUnVsZQlBVwkyMDA3CTIwMDkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVcJMjAwNwkyMDA4CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1ab25lIEF1c3RyYWxpYS9QZXJ0aAkgNzo0MzoyNCAtCUxNVAkxODk1IERlYwotCQkJIDg6MDAJQXVzCVdTVAkxOTQzIEp1bAotCQkJIDg6MDAJQVcJV1NUCi1ab25lIEF1c3RyYWxpYS9FdWNsYQkgODozNToyOCAtCUxNVAkxODk1IERlYwotCQkJIDg6NDUJQXVzCUNXU1QJMTk0MyBKdWwKLQkJCSA4OjQ1CUFXCUNXU1QKLQotIyBRdWVlbnNsYW5kCi0jCi0jIEZyb20gQWxleCBMaXZpbmdzdG9uICgxOTk2LTExLTAxKToKLSMgSSBoYXZlIGhlYXJkIG9yIHJlYWQgbW9yZSB0aGFuIG9uY2UgdGhhdCBzb21lIHJlc29ydCBpc2xhbmRzIG9mZiB0aGUgY29hc3QKLSMgb2YgUXVlZW5zbGFuZCBjaG9zZSB0byBrZWVwIG9ic2VydmluZyBkYXlsaWdodC1zYXZpbmcgdGltZSBldmVuIGFmdGVyCi0jIFF1ZWVuc2xhbmQgY2Vhc2VkIHRvLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTExLTIyKToKLSMgSUFUQSBTU0lNICgxOTkzLTAyLzE5OTQtMDkpIHNheSB0aGF0IHRoZSBIb2xpZGF5IElzbGFuZHMgKEhheW1hbiwgTGluZGVtYW4sCi0jIEhhbWlsdG9uKSBvYnNlcnZlZCBEU1QgZm9yIHR3byB5ZWFycyBhZnRlciB0aGUgcmVzdCBvZiBRdWVlbnNsYW5kIHN0b3BwZWQuCi0jIEhhbWlsdG9uIGlzIHRoZSBsYXJnZXN0LCBidXQgdGhlcmUgaXMgYWxzbyBhIEhhbWlsdG9uIGluIFZpY3RvcmlhLAotIyBzbyB1c2UgTGluZGVtYW4uCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBUQkxOTcxCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVEJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFRCTE5ODkJMTk5MQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBUQkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlIb2xpZGF5CTE5OTIJMTk5MwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlIb2xpZGF5CTE5OTMJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAktCi1ab25lIEF1c3RyYWxpYS9CcmlzYmFuZQkxMDoxMjowOCAtCUxNVAkxODk1Ci0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFRCUVTVAotWm9uZSBBdXN0cmFsaWEvTGluZGVtYW4gIDk6NTU6NTYgLQlMTVQJMTg5NQotCQkJMTA6MDAJQXVzCUVTVAkxOTcxCi0JCQkxMDowMAlBUQlFU1QJMTk5MiBKdWwKLQkJCTEwOjAwCUhvbGlkYXkJRVNUCi0KLSMgU291dGggQXVzdHJhbGlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBUwkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVMJMTk4Nglvbmx5CS0JT2N0CTE5CTI6MDBzCTE6MDAJLQotUnVsZQlBUwkxOTg3CTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVMJMTk3Mglvbmx5CS0JRmViCTI3CTI6MDBzCTAJLQotUnVsZQlBUwkxOTczCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBUwkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5MAlvbmx5CS0JTWFyCVN1bj49MTgJMjowMHMJMAktCi1SdWxlCUFTCTE5OTEJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFTCTE5OTIJb25seQktCU1hcglTdW4+PTE4CTI6MDBzCTAJLQotUnVsZQlBUwkxOTkzCW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBUwkxOTk0CW9ubHkJLQlNYXIJU3VuPj0xOAkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5NQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFTCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFTCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBUwkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFTCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXVzdHJhbGlhL0FkZWxhaWRlCTk6MTQ6MjAgLQlMTVQJMTg5NSBGZWIKLQkJCTk6MDAJLQlDU1QJMTg5OSBNYXkKLQkJCTk6MzAJQXVzCUNTVAkxOTcxCi0JCQk5OjMwCUFTCUNTVAotCi0jIFRhc21hbmlhCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDgtMTYpOgotIyA8aHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RzdF90aW1lcy5zaHRtbD4KLSMgc2F5cyBLaW5nIElzbGFuZCBkaWRuJ3Qgb2JzZXJ2ZSBEU1QgZnJvbSBXV0lJIHVudGlsIGxhdGUgMTk3MS4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFUCTE5NjcJb25seQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUCTE5NjgJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkxOTY4CTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk2OQkxOTcxCS0JTWFyCVN1bj49OAkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTE5NzMJMTk4MQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUCTE5ODIJMTk4MwktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkxOTg0CTE5ODYJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVAkxOTg2CW9ubHkJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk4NwkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFUCTE5ODcJb25seQktCU9jdAlTdW4+PTIyCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTg4CTE5OTAJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk5MQkxOTk5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk5MQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkyMDAxCW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF1c3RyYWxpYS9Ib2JhcnQJOTo0OToxNgktCUxNVAkxODk1IFNlcAotCQkJMTA6MDAJLQlFU1QJMTkxNiBPY3QgMSAyOjAwCi0JCQkxMDowMAkxOjAwCUVTVAkxOTE3IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTY3Ci0JCQkxMDowMAlBVAlFU1QKLVpvbmUgQXVzdHJhbGlhL0N1cnJpZQk5OjM1OjI4CS0JTE1UCTE4OTUgU2VwCi0JCQkxMDowMAktCUVTVAkxOTE2IE9jdCAxIDI6MDAKLQkJCTEwOjAwCTE6MDAJRVNUCTE5MTcgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NzEgSnVsCi0JCQkxMDowMAlBVAlFU1QKLQotIyBWaWN0b3JpYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQVYJMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVgkxOTczCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVgkxOTg2CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KLVJ1bGUJQVYJMTk4NgkxOTg3CS0JT2N0CVN1bj49MTUJMjowMHMJMTowMAktCi1SdWxlCUFWCTE5ODgJMTk5OQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVgkxOTkxCTE5OTQJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVgkxOTk1CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVYJMjAwMAlvbmx5CS0JQXVnCWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVgkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVgkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVYJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVgkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF1c3RyYWxpYS9NZWxib3VybmUgOTozOTo1MiAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTcxCi0JCQkxMDowMAlBVglFU1QKLQotIyBOZXcgU291dGggV2FsZXMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFOCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBTgkxOTcyCW9ubHkJLQlGZWIJMjcJMjowMHMJMAktCi1SdWxlCUFOCTE5NzMJMTk4MQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTE5ODIJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTE5ODMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlBTgkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMHMJMTowMAktCi1SdWxlCUFOCTE5ODcJMTk5OQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBTgkxOTkwCTE5OTUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkxOTk2CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQU4JMjAwMAlvbmx5CS0JQXVnCWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBTgkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQU4JMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF1c3RyYWxpYS9TeWRuZXkJMTA6MDQ6NTIgLQlMTVQJMTg5NSBGZWIKLQkJCTEwOjAwCUF1cwlFU1QJMTk3MQotCQkJMTA6MDAJQU4JRVNUCi1ab25lIEF1c3RyYWxpYS9Ccm9rZW5fSGlsbCA5OjI1OjQ4IC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAktCUVTVAkxODk2IEF1ZyAyMwotCQkJOTowMAktCUNTVAkxODk5IE1heQotCQkJOTozMAlBdXMJQ1NUCTE5NzEKLQkJCTk6MzAJQU4JQ1NUCTIwMDAKLQkJCTk6MzAJQVMJQ1NUCi0KLSMgTG9yZCBIb3dlIElzbGFuZAotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTEgJMTk4MQkxOTg0CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCS0KLVJ1bGUJTEgJMTk4MgkxOTg1CS0JTWFyCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkxOTg1CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwCTAJLQotUnVsZQlMSAkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMAkwOjMwCS0KLVJ1bGUJTEgJMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMAkwOjMwCS0KLVJ1bGUJTEgJMTk5MAkxOTk1CS0JTWFyCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkxOTk2CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwCTAJLQotUnVsZQlMSAkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUxICTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMAkwOjMwCS0KLVpvbmUgQXVzdHJhbGlhL0xvcmRfSG93ZSAxMDozNjoyMCAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJLQlFU1QJMTk4MSBNYXIKLQkJCTEwOjMwCUxICUxIU1QKLQotIyBBdXN0cmFsaWFuIG1pc2NlbGxhbnkKLSMKLSMgQXNobW9yZSBJcywgQ2FydGllcgotIyBubyBpbmRpZ2Vub3VzIGluaGFiaXRhbnRzOyBvbmx5IHNlYXNvbmFsIGNhcmV0YWtlcnMKLSMgbm8gdGltZXMgYXJlIHNldAotIwotIyBDb3JhbCBTZWEgSXMKLSMgbm8gaW5kaWdlbm91cyBpbmhhYml0YW50czsgb25seSBtZXRlb3JvbG9naXN0cwotIyBubyB0aW1lcyBhcmUgc2V0Ci0jCi0jIE1hY3F1YXJpZQotIyBwZXJtYW5lbnQgb2NjdXBhdGlvbiAoc2NpZW50aWZpYyBzdGF0aW9uKSBzaW5jZSAxOTQ4OwotIyBzZWFsaW5nIGFuZCBwZW5ndWluIG9pbCBzdGF0aW9uIG9wZXJhdGVkIDE4ODgvMTkxNwotIyBsaWtlIEF1c3RyYWxpYS9Ib2JhcnQKLQotIyBDaHJpc3RtYXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgSW5kaWFuL0NocmlzdG1hcwk3OjAyOjUyIC0JTE1UCTE4OTUgRmViCi0JCQk3OjAwCS0JQ1hUCSMgQ2hyaXN0bWFzIElzbGFuZCBUaW1lCi0KLSMgQ29vayBJcwotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUNvb2sJMTk3OAlvbmx5CS0JTm92CTEyCTA6MDAJMDozMAlIUwotUnVsZQlDb29rCTE5NzkJMTk5MQktCU1hcglTdW4+PTEJMDowMAkwCS0KLVJ1bGUJQ29vawkxOTc5CTE5OTAJLQlPY3QJbGFzdFN1bgkwOjAwCTA6MzAJSFMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9SYXJvdG9uZ2EJLTEwOjM5OjA0IC0JTE1UCTE5MDEJCSMgQXZhcnVhCi0JCQktMTA6MzAJLQlDS1QJMTk3OCBOb3YgMTIJIyBDb29rIElzIFRpbWUKLQkJCS0xMDowMAlDb29rCUNLJXNUCi0KLSMgQ29jb3MKLSMgVGhlc2UgaXNsYW5kcyB3ZXJlIHJ1bGVkIGJ5IHRoZSBSb3NzIGZhbWlseSBmcm9tIGFib3V0IDE4MzAgdG8gMTk3OC4KLSMgV2UgZG9uJ3Qga25vdyB3aGVuIHN0YW5kYXJkIHRpbWUgd2FzIGludHJvZHVjZWQ7IGZvciBub3csIHdlIGd1ZXNzIDE5MDAuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9Db2Nvcwk2OjI3OjQwCS0JTE1UCTE5MDAKLQkJCTY6MzAJLQlDQ1QJIyBDb2NvcyBJc2xhbmRzIFRpbWUKLQotIyBGaWppCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlGaWppCTE5OTgJMTk5OQktCU5vdglTdW4+PTEJMjowMAkxOjAwCVMKLVJ1bGUJRmlqaQkxOTk5CTIwMDAJLQlGZWIJbGFzdFN1bgkzOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0ZpamkJMTE6NTM6NDAgLQlMTVQJMTkxNSBPY3QgMjYJIyBTdXZhCi0JCQkxMjowMAlGaWppCUZKJXNUCSMgRmlqaSBUaW1lCi0KLSMgRnJlbmNoIFBvbHluZXNpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0dhbWJpZXIJIC04OjU5OjQ4IC0JTE1UCTE5MTIgT2N0CSMgUmlraXRlYQotCQkJIC05OjAwCS0JR0FNVAkjIEdhbWJpZXIgVGltZQotWm9uZQlQYWNpZmljL01hcnF1ZXNhcyAtOToxODowMCAtCUxNVAkxOTEyIE9jdAotCQkJIC05OjMwCS0JTUFSVAkjIE1hcnF1ZXNhcyBUaW1lCi1ab25lCVBhY2lmaWMvVGFoaXRpCSAtOTo1ODoxNiAtCUxNVAkxOTEyIE9jdAkjIFBhcGVldGUKLQkJCS0xMDowMAktCVRBSFQJIyBUYWhpdGkgVGltZQotIyBDbGlwcGVydG9uIChuZWFyIE5vcnRoIEFtZXJpY2EpIGlzIGFkbWluaXN0ZXJlZCBmcm9tIEZyZW5jaCBQb2x5bmVzaWE7Ci0jIGl0IGlzIHVuaW5oYWJpdGVkLgotCi0jIEd1YW0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9HdWFtCS0xNDoyMTowMCAtCUxNVAkxODQ0IERlYyAzMQotCQkJIDk6Mzk6MDAgLQlMTVQJMTkwMQkJIyBBZ2FuYQotCQkJMTA6MDAJLQlHU1QJMjAwMCBEZWMgMjMJIyBHdWFtCi0JCQkxMDowMAktCUNoU1QJIyBDaGFtb3JybyBTdGFuZGFyZCBUaW1lCi0KLSMgS2lyaWJhdGkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9UYXJhd2EJIDExOjMyOjA0IC0JTE1UCTE5MDEJCSMgQmFpcmlraQotCQkJIDEyOjAwCS0JR0lMVAkJICMgR2lsYmVydCBJcyBUaW1lCi1ab25lIFBhY2lmaWMvRW5kZXJidXJ5CS0xMToyNDoyMCAtCUxNVAkxOTAxCi0JCQktMTI6MDAJLQlQSE9UCTE5NzkgT2N0ICMgUGhvZW5peCBJcyBUaW1lCi0JCQktMTE6MDAJLQlQSE9UCTE5OTUKLQkJCSAxMzowMAktCVBIT1QKLVpvbmUgUGFjaWZpYy9LaXJpdGltYXRpCS0xMDoyOToyMCAtCUxNVAkxOTAxCi0JCQktMTA6NDAJLQlMSU5UCTE5NzkgT2N0ICMgTGluZSBJcyBUaW1lCi0JCQktMTA6MDAJLQlMSU5UCTE5OTUKLQkJCSAxNDowMAktCUxJTlQKLQotIyBOIE1hcmlhbmEgSXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9TYWlwYW4JLTE0OjE3OjAwIC0JTE1UCTE4NDQgRGVjIDMxCi0JCQkgOTo0MzowMCAtCUxNVAkxOTAxCi0JCQkgOTowMAktCU1QVAkxOTY5IE9jdCAjIE4gTWFyaWFuYSBJcyBUaW1lCi0JCQkxMDowMAktCU1QVAkyMDAwIERlYyAyMwotCQkJMTA6MDAJLQlDaFNUCSMgQ2hhbW9ycm8gU3RhbmRhcmQgVGltZQotCi0jIE1hcnNoYWxsIElzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvTWFqdXJvCTExOjI0OjQ4IC0JTE1UCTE5MDEKLQkJCTExOjAwCS0JTUhUCTE5NjkgT2N0ICMgTWFyc2hhbGwgSXNsYW5kcyBUaW1lCi0JCQkxMjowMAktCU1IVAotWm9uZSBQYWNpZmljL0t3YWphbGVpbgkxMTowOToyMCAtCUxNVAkxOTAxCi0JCQkxMTowMAktCU1IVAkxOTY5IE9jdAotCQkJLTEyOjAwCS0JS1dBVAkxOTkzIEF1ZyAyMAkjIEt3YWphbGVpbiBUaW1lCi0JCQkxMjowMAktCU1IVAotCi0jIE1pY3JvbmVzaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9UcnVrCTEwOjA3OjA4IC0JTE1UCTE5MDEKLQkJCTEwOjAwCS0JVFJVVAkJCSMgVHJ1ayBUaW1lCi1ab25lIFBhY2lmaWMvUG9uYXBlCTEwOjMyOjUyIC0JTE1UCTE5MDEJCSMgS29sb25pYQotCQkJMTE6MDAJLQlQT05UCQkJIyBQb25hcGUgVGltZQotWm9uZSBQYWNpZmljL0tvc3JhZQkxMDo1MTo1NiAtCUxNVAkxOTAxCi0JCQkxMTowMAktCUtPU1QJMTk2OSBPY3QJIyBLb3NyYWUgVGltZQotCQkJMTI6MDAJLQlLT1NUCTE5OTkKLQkJCTExOjAwCS0JS09TVAotCi0jIE5hdXJ1Ci0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTmF1cnUJMTE6MDc6NDAgLQlMTVQJMTkyMSBKYW4gMTUJIyBVYW9iZQotCQkJMTE6MzAJLQlOUlQJMTk0MiBNYXIgMTUJIyBOYXVydSBUaW1lCi0JCQk5OjAwCS0JSlNUCTE5NDQgQXVnIDE1Ci0JCQkxMTozMAktCU5SVAkxOTc5IE1heQotCQkJMTI6MDAJLQlOUlQKLQotIyBOZXcgQ2FsZWRvbmlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOQwkxOTc3CTE5NzgJLQlEZWMJU3VuPj0xCTA6MDAJMTowMAlTCi1SdWxlCU5DCTE5NzgJMTk3OQktCUZlYgkyNwkwOjAwCTAJLQotUnVsZQlOQwkxOTk2CW9ubHkJLQlEZWMJIDEJMjowMHMJMTowMAlTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIGZvbGxvd2luZyB3YXMgYXQgMjowMDsgZ28gd2l0aCBJQVRBLgotUnVsZQlOQwkxOTk3CW9ubHkJLQlNYXIJIDIJMjowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm91bWVhCTExOjA1OjQ4IC0JTE1UCTE5MTIgSmFuIDEzCi0JCQkxMTowMAlOQwlOQyVzVAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOZXcgWmVhbGFuZAotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOWgkxOTI3CW9ubHkJLQlOb3YJIDYJMjowMAkxOjAwCVMKLVJ1bGUJTloJMTkyOAlvbmx5CS0JTWFyCSA0CTI6MDAJMAlNCi1SdWxlCU5aCTE5MjgJMTkzMwktCU9jdAlTdW4+PTgJMjowMAkwOjMwCVMKLVJ1bGUJTloJMTkyOQkxOTMzCS0JTWFyCVN1bj49MTUJMjowMAkwCU0KLVJ1bGUJTloJMTkzNAkxOTQwCS0JQXByCWxhc3RTdW4JMjowMAkwCU0KLVJ1bGUJTloJMTkzNAkxOTQwCS0JU2VwCWxhc3RTdW4JMjowMAkwOjMwCVMKLVJ1bGUJTloJMTk0Nglvbmx5CS0JSmFuCSAxCTA6MDAJMAlTCi0jIFNpbmNlIDE5NTcgQ2hhdGhhbSBoYXMgYmVlbiA0NSBtaW51dGVzIGFoZWFkIG9mIE5aLCBidXQgdGhlcmUncyBubwotIyBjb252ZW5pZW50IG5vdGF0aW9uIGZvciB0aGlzIHNvIHdlIG11c3QgZHVwbGljYXRlIHRoZSBSdWxlIGxpbmVzLgotUnVsZQlOWgkxOTc0CW9ubHkJLQlOb3YJU3VuPj0xCTI6MDBzCTE6MDAJRAotUnVsZQlDaGF0aGFtCTE5NzQJb25seQktCU5vdglTdW4+PTEJMjo0NXMJMTowMAlECi1SdWxlCU5aCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUwotUnVsZQlDaGF0aGFtCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6NDVzCTAJUwotUnVsZQlOWgkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKLVJ1bGUJQ2hhdGhhbQkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMTk3NgkxOTg5CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKLVJ1bGUJQ2hhdGhhbQkxOTc2CTE5ODkJLQlNYXIJU3VuPj0xCTI6NDVzCTAJUwotUnVsZQlOWgkxOTg5CW9ubHkJLQlPY3QJU3VuPj04CTI6MDBzCTE6MDAJRAotUnVsZQlDaGF0aGFtCTE5ODkJb25seQktCU9jdAlTdW4+PTgJMjo0NXMJMTowMAlECi1SdWxlCU5aCTE5OTAJMjAwNgktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECi1SdWxlCUNoYXRoYW0JMTk5MAkyMDA2CS0JT2N0CVN1bj49MQkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCi1SdWxlCUNoYXRoYW0JMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjo0NXMJMAlTCi1SdWxlCU5aCTIwMDcJbWF4CS0JU2VwCWxhc3RTdW4JMjowMHMJMTowMAlECi1SdWxlCUNoYXRoYW0JMjAwNwltYXgJLQlTZXAJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUwotUnVsZQlDaGF0aGFtCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjQ1cwkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9BdWNrbGFuZAkxMTozOTowNCAtCUxNVAkxODY4IE5vdiAgMgotCQkJMTE6MzAJTloJTlolc1QJMTk0NiBKYW4gIDEKLQkJCTEyOjAwCU5aCU5aJXNUCi1ab25lIFBhY2lmaWMvQ2hhdGhhbQkxMjoxMzo0OCAtCUxNVAkxOTU3IEphbiAgMQotCQkJMTI6NDUJQ2hhdGhhbQlDSEElc1QKLQotCi0jIEF1Y2tsYW5kIElzCi0jIHVuaW5oYWJpdGVkOyBNYW9yaSBhbmQgTW9yaW9yaSwgY29sb25pYWwgc2V0dGxlcnMsIHBhc3RvcmFsaXN0cywgc2VhbGVycywKLSMgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKLQotIyBDYW1wYmVsbCBJCi0jIG1pbm9yIHdoYWxpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgMTkwOS8xOTE0Ci0jIHNjaWVudGlmaWMgc3RhdGlvbiBvcGVyYXRlZCAxOTQxLzE5OTU7Ci0jIHByZXZpb3VzbHkgd2hhbGVycywgc2VhbGVycywgcGFzdG9yYWxpc3RzLCBhbmQgc2NpZW50aWZpYyBwZXJzb25uZWwgd2ludGVyZWQKLSMgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9BdWNrbGFuZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyBOaXVlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTml1ZQktMTE6MTk6NDAgLQlMTVQJMTkwMQkJIyBBbG9maQotCQkJLTExOjIwCS0JTlVUCTE5NTEJIyBOaXVlIFRpbWUKLQkJCS0xMTozMAktCU5VVAkxOTc4IE9jdCAxCi0JCQktMTE6MDAJLQlOVVQKLQotIyBOb3Jmb2xrCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm9yZm9sawkxMToxMTo1MiAtCUxNVAkxOTAxCQkjIEtpbmdzdG9uCi0JCQkxMToxMgktCU5NVAkxOTUxCSMgTm9yZm9sayBNZWFuIFRpbWUKLQkJCTExOjMwCS0JTkZUCQkjIE5vcmZvbGsgVGltZQotCi0jIFBhbGF1IChCZWxhdSkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9QYWxhdQk4OjU3OjU2IC0JTE1UCTE5MDEJCSMgS29yb3IKLQkJCTk6MDAJLQlQV1QJIyBQYWxhdSBUaW1lCi0KLSMgUGFwdWEgTmV3IEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BvcnRfTW9yZXNieSA5OjQ4OjQwIC0JTE1UCTE4ODAKLQkJCTk6NDg6MzIJLQlQTU1UCTE4OTUJIyBQb3J0IE1vcmVzYnkgTWVhbiBUaW1lCi0JCQkxMDowMAktCVBHVAkJIyBQYXB1YSBOZXcgR3VpbmVhIFRpbWUKLQotIyBQaXRjYWlybgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BpdGNhaXJuCS04OjQwOjIwIC0JTE1UCTE5MDEJCSMgQWRhbXN0b3duCi0JCQktODozMAktCVBOVAkxOTk4IEFwciAyNyAwMDowMAotCQkJLTg6MDAJLQlQU1QJIyBQaXRjYWlybiBTdGFuZGFyZCBUaW1lCi0KLSMgQW1lcmljYW4gU2Ftb2EKLVpvbmUgUGFjaWZpYy9QYWdvX1BhZ28JIDEyOjM3OjEyIC0JTE1UCTE4NzkgSnVsICA1Ci0JCQktMTE6MjI6NDggLQlMTVQJMTkxMQotCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgkjIE49Tm9tZQotCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwCSMgQj1CZXJpbmcKLQkJCS0xMTowMAktCVNTVAkJCSMgUz1TYW1vYQotCi0jIFNhbW9hCi1ab25lIFBhY2lmaWMvQXBpYQkgMTI6MzM6MDQgLQlMTVQJMTg3OSBKdWwgIDUKLQkJCS0xMToyNjo1NiAtCUxNVAkxOTExCi0JCQktMTE6MzAJLQlTQU1UCTE5NTAJCSMgU2Ftb2EgVGltZQotCQkJLTExOjAwCS0JV1NUCQkJIyBTYW1vYSBUaW1lCi0KLSMgU29sb21vbiBJcwotIyBleGNsdWRlcyBCb3VnYWludmlsbGUsIGZvciB3aGljaCBzZWUgUGFwdWEgTmV3IEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL0d1YWRhbGNhbmFsIDEwOjM5OjQ4IC0JTE1UCTE5MTIgT2N0CSMgSG9uaWFyYQotCQkJMTE6MDAJLQlTQlQJIyBTb2xvbW9uIElzIFRpbWUKLQotIyBUb2tlbGF1IElzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvRmFrYW9mbwktMTE6MjQ6NTYgLQlMTVQJMTkwMQotCQkJLTEwOjAwCS0JVEtUCSMgVG9rZWxhdSBUaW1lCi0KLSMgVG9uZ2EKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVRvbmdhCTE5OTkJb25seQktCU9jdAkgNwkyOjAwcwkxOjAwCVMKLVJ1bGUJVG9uZ2EJMjAwMAlvbmx5CS0JTWFyCTE5CTI6MDBzCTAJLQotUnVsZQlUb25nYQkyMDAwCTIwMDEJLQlOb3YJU3VuPj0xCTI6MDAJMTowMAlTCi1SdWxlCVRvbmdhCTIwMDEJMjAwMgktCUphbglsYXN0U3VuCTI6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvVG9uZ2F0YXB1CTEyOjE5OjIwIC0JTE1UCTE5MDEKLQkJCTEyOjIwCS0JVE9UCTE5NDEgIyBUb25nYSBUaW1lCi0JCQkxMzowMAktCVRPVAkxOTk5Ci0JCQkxMzowMAlUb25nYQlUTyVzVAotCi0jIFR1dmFsdQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL0Z1bmFmdXRpCTExOjU2OjUyIC0JTE1UCTE5MDEKLQkJCTEyOjAwCS0JVFZUCSMgVHV2YWx1IFRpbWUKLQotCi0jIFVTIG1pbm9yIG91dGx5aW5nIGlzbGFuZHMKLQotIyBIb3dsYW5kLCBCYWtlcgotIyBIb3dsYW5kIHdhcyBtaW5lZCBmb3IgZ3Vhbm8gYnkgQW1lcmljYW4gY29tcGFuaWVzIDE4NTctMTg3OCBhbmQgQnJpdGlzaAotIyAxODg2LTE4OTE7IEJha2VyIHdhcyBzaW1pbGFyIGJ1dCBleGFjdCBkYXRlcyBhcmUgbm90IGtub3duLgotIyBJbmhhYml0ZWQgYnkgY2l2aWxpYW5zIDE5MzUtMTk0MjsgVS5TLiBtaWxpdGFyeSBiYXNlcyAxOTQzLTE5NDQ7Ci0jIHVuaW5oYWJpdGVkIHRoZXJlYWZ0ZXIuCi0jIEhvd2xhbmQgb2JzZXJ2ZWQgSGF3YWlpIFN0YW5kYXJkIFRpbWUgKFVUQy0xMDozMCkgaW4gMTkzNzsKLSMgc2VlIHBhZ2UgMjA2IG9mIEVsZ2VuIE0uIExvbmcgYW5kIE1hcmllIEsuIExvbmcsCi0jIEFtZWxpYSBFYXJoYXJ0OiB0aGUgTXlzdGVyeSBTb2x2ZWQsIFNpbW9uICYgU2NodXN0ZXIgKDIwMDApLgotIyBTbyBtb3N0IGxpa2VseSBIb3dsYW5kIGFuZCBCYWtlciBvYnNlcnZlZCBIYXdhaWkgVGltZSBmcm9tIDE5MzUKLSMgdW50aWwgdGhleSB3ZXJlIGFiYW5kb25lZCBhZnRlciB0aGUgd2FyLgotCi0jIEphcnZpcwotIyBNaW5lZCBmb3IgZ3Vhbm8gYnkgQW1lcmljYW4gY29tcGFuaWVzIDE4NTctMTg3OSBhbmQgQnJpdGlzaCAxODgzPy0xODkxPy4KLSMgSW5oYWJpdGVkIGJ5IGNpdmlsaWFucyAxOTM1LTE5NDI7IElHWSBzY2llbnRpZmljIGJhc2UgMTk1Ny0xOTU4OwotIyB1bmluaGFiaXRlZCB0aGVyZWFmdGVyLgotIyBubyBpbmZvcm1hdGlvbjsgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9LaXJpdGltYXRpCi0KLSMgSm9obnN0b24KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9Kb2huc3RvbgktMTA6MDAJLQlIU1QKLQotIyBLaW5nbWFuCi0jIHVuaW5oYWJpdGVkCi0KLSMgTWlkd2F5Ci0jCi0jIEZyb20gTWFyayBCcmFkZXIgKDIwMDUtMDEtMjMpOgotIyBbRmFsbGFjaWVzIGFuZCBGYW50YXNpZXMgb2YgQWlyIFRyYW5zcG9ydCBIaXN0b3J5LCBieSBSLkUuRy4gRGF2aWVzLAotIyBwdWJsaXNoZWQgMTk5NCBieSBQYWxhZHdyIFByZXNzLCBNY0xlYW4sIFZBLCBVU0E7IElTQk4gMC05NjI2NDgzLTUtM10KLSMgcmVwcm9kdWNlZCBhIFBhbiBBbWVyaWNhbiBBaXJ3YXlzIHRpbWVhYmxlcyBmcm9tIDE5MzYsIGZvciB0aGVpciB3ZWVrbHkKLSMgIk9yaWVudCBFeHByZXNzIiBmbGlnaHRzIGJldHdlZW4gU2FuIEZyYW5jaXNjbyBhbmQgTWFuaWxhLCBhbmQgY29ubmVjdGluZwotIyBmbGlnaHRzIHRvIENoaWNhZ28gYW5kIHRoZSBVUyBFYXN0IENvYXN0LiAgQXMgaXQgdXNlcyBzb21lIHRpbWUgem9uZQotIyBkZXNpZ25hdGlvbnMgdGhhdCBJJ3ZlIG5ldmVyIHNlZW4gYmVmb3JlOi4uLi4KLSMgRnJpLiA2OjMwQSBMdi4gSE9OT0xPTFUgKFBlYXJsIEhhcmJvciksIEguSS4gICBILkwuVC4gQXIuIDU6MzBQIFN1bi4KLSMgICIgICAzOjAwUCBBci4gTUlEV0FZIElTTEFORCAuIC4gLiAuIC4gLiAuIC4gLiBNLkwuVC4gTHYuIDY6MDBBICAiCi0jCi1ab25lIFBhY2lmaWMvTWlkd2F5CS0xMTo0OToyOCAtCUxNVAkxOTAxCi0JCQktMTE6MDAJLQlOU1QJMTk1NiBKdW4gIDMKLQkJCS0xMTowMAkxOjAwCU5EVAkxOTU2IFNlcCAgMgotCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCSMgTj1Ob21lCi0JCQktMTE6MDAJLQlCU1QJMTk4MyBOb3YgMzAJIyBCPUJlcmluZwotCQkJLTExOjAwCS0JU1NUCQkJIyBTPVNhbW9hCi0KLSMgUGFsbXlyYQotIyB1bmluaGFiaXRlZCBzaW5jZSBXb3JsZCBXYXIgSUk7IHdhcyBwcm9iYWJseSBsaWtlIFBhY2lmaWMvS2lyaXRpbWF0aQotCi0jIFdha2UKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9XYWtlCTExOjA2OjI4IC0JTE1UCTE5MDEKLQkJCTEyOjAwCS0JV0FLVAkjIFdha2UgVGltZQotCi0KLSMgVmFudWF0dQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVmFudWF0dQkxOTgzCW9ubHkJLQlTZXAJMjUJMDowMAkxOjAwCVMKLVJ1bGUJVmFudWF0dQkxOTg0CTE5OTEJLQlNYXIJU3VuPj0yMwkwOjAwCTAJLQotUnVsZQlWYW51YXR1CTE5ODQJb25seQktCU9jdAkyMwkwOjAwCTE6MDAJUwotUnVsZQlWYW51YXR1CTE5ODUJMTk5MQktCVNlcAlTdW4+PTIzCTA6MDAJMTowMAlTCi1SdWxlCVZhbnVhdHUJMTk5MgkxOTkzCS0JSmFuCVN1bj49MjMJMDowMAkwCS0KLVJ1bGUJVmFudWF0dQkxOTkyCW9ubHkJLQlPY3QJU3VuPj0yMwkwOjAwCTE6MDAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0VmYXRlCTExOjEzOjE2IC0JTE1UCTE5MTIgSmFuIDEzCQkjIFZpbGEKLQkJCTExOjAwCVZhbnVhdHUJVlUlc1QJIyBWYW51YXR1IFRpbWUKLQotIyBXYWxsaXMgYW5kIEZ1dHVuYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL1dhbGxpcwkxMjoxNToyMCAtCUxNVAkxOTAxCi0JCQkxMjowMAktCVdGVAkjIFdhbGxpcyAmIEZ1dHVuYSBUaW1lCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOT1RFUwotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkwLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgQW5vdGhlciBzb3VyY2Ugb2NjYXNpb25hbGx5IHVzZWQgaXMgRWR3YXJkIFcuIFdoaXRtYW4sIFdvcmxkIFRpbWUgRGlmZmVyZW5jZXMsCi0jIFdoaXRtYW4gUHVibGlzaGluZyBDbywgMiBOaWFnYXJhIEF2LCBFYWxpbmcsIExvbmRvbiAodW5kYXRlZCksIHdoaWNoCi0jIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KLSMKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgotIwotIyBJIGludmVudGVkIHRoZSBhYmJyZXZpYXRpb25zIG1hcmtlZCBgKicgaW4gdGhlIGZvbGxvd2luZyB0YWJsZTsKLSMgdGhlIHJlc3QgYXJlIGZyb20gZWFybGllciB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUsIG9yIGZyb20gb3RoZXIgc291cmNlcy4KLSMgQ29ycmVjdGlvbnMgYXJlIHdlbGNvbWUhCi0jCQlzdGQgZHN0Ci0jCQlMTVQJTG9jYWwgTWVhbiBUaW1lCi0jCSAgODowMAlXU1QgV1NUCVdlc3Rlcm4gQXVzdHJhbGlhCi0jCSAgODo0NQlDV1NUIENXU1QgQ2VudHJhbCBXZXN0ZXJuIEF1c3RyYWxpYSoKLSMJICA5OjAwCUpTVAlKYXBhbgotIwkgIDk6MzAJQ1NUIENTVAlDZW50cmFsIEF1c3RyYWxpYQotIwkgMTA6MDAJRVNUIEVTVAlFYXN0ZXJuIEF1c3RyYWxpYQotIwkgMTA6MDAJQ2hTVAlDaGFtb3JybwotIwkgMTA6MzAJTEhTVCBMSFNUIExvcmQgSG93ZSoKLSMJIDExOjMwCU5aTVQgTlpTVCBOZXcgWmVhbGFuZCB0aHJvdWdoIDE5NDUKLSMJIDEyOjAwCU5aU1QgTlpEVCBOZXcgWmVhbGFuZCAxOTQ2LXByZXNlbnQKLSMJIDEyOjQ1CUNIQVNUIENIQURUIENoYXRoYW0qCi0jCS0xMTowMAlTU1QJU2Ftb2EKLSMJLTEwOjAwCUhTVAlIYXdhaWkKLSMJLSA4OjAwCVBTVAlQaXRjYWlybioKLSMKLSMgU2VlIHRoZSBgbm9ydGhhbWVyaWNhJyBmaWxlIGZvciBIYXdhaWkuCi0jIFNlZSB0aGUgYHNvdXRoYW1lcmljYScgZmlsZSBmb3IgRWFzdGVyIEkgYW5kIHRoZSBHYWxhcGFnb3MgSXMuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBBdXN0cmFsaWEKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTEyLTA4KToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RzdF90aW1lcy5zaHRtbCI+Ci0jIEltcGxlbWVudGF0aW9uIERhdGVzIG9mIERheWxpZ2h0IFNhdmluZyBUaW1lIHdpdGhpbiBBdXN0cmFsaWEKLSMgPC9hPiBzdW1tYXJpemVzIGRheWxpZ2h0IHNhdmluZyBpc3N1ZXMgaW4gQXVzdHJhbGlhLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA1LTEyLTEyKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYXdsaW5rLm5zdy5nb3YuYXUvbGF3bGluay9Db3Jwb3JhdGUvbGxfYWdkaW5mby5uc2YvcGFnZXMvY29tbXVuaXR5X3JlbGF0aW9uc19kYXlsaWdodF9zYXZpbmciPgotIyBMYXdsaW5rIE5TVzpEYXlsaWdodCBTYXZpbmcgaW4gTmV3IFNvdXRoIFdhbGVzCi0jIDwvYT4gY292ZXJzIE5ldyBTb3V0aCBXYWxlcyBpbiBwYXJ0aWN1bGFyLgotCi0jIEZyb20gSm9obiBNYWNraW4gKDE5OTEtMDMtMDYpOgotIyBXZSBpbiBBdXN0cmFsaWEgaGF2ZSBfbmV2ZXJfIHJlZmVycmVkIHRvIERTVCBhcyBgZGF5bGlnaHQnIHRpbWUuCi0jIEl0IGlzIGNhbGxlZCBgc3VtbWVyJyB0aW1lLiAgTm93IGJ5IGEgaGFwcHkgY29pbmNpZGVuY2UsIGBzdW1tZXInCi0jIGFuZCBgc3RhbmRhcmQnIGhhcHBlbiB0byBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlcjsgaGVuY2UsIHRoZQotIyBhYmJyZXZpYXRpb24gZG9lcyBfbm90XyBjaGFuZ2UuLi4KLSMgVGhlIGxlZ2lzbGF0aW9uIGRvZXMgbm90IGFjdHVhbGx5IGRlZmluZSBhYmJyZXZpYXRpb25zLCBhdCBsZWFzdAotIyBpbiB0aGlzIFN0YXRlLCBidXQgdGhlIGFiYnJldmlhdGlvbiBpcyBqdXN0IGNvbW1vbmx5IHRha2VuIHRvIGJlIHRoZQotIyBpbml0aWFscyBvZiB0aGUgcGhyYXNlLCBhbmQgdGhlIGxlZ2lzbGF0aW9uIGhlcmUgdW5pZm9ybWx5IHVzZXMKLSMgdGhlIHBocmFzZSBgc3VtbWVyIHRpbWUnIGFuZCBkb2VzIG5vdCB1c2UgdGhlIHBocmFzZSBgZGF5bGlnaHQKLSMgdGltZScuCi0jIEFubm91bmNlcnMgb24gdGhlIENvbW1vbndlYWx0aCByYWRpbyBuZXR3b3JrLCB0aGUgQUJDIChmb3IgQXVzdHJhbGlhbgotIyBCcm9hZGNhc3RpbmcgQ29tbWlzc2lvbiksIHVzZSB0aGUgcGhyYXNlcyBgRWFzdGVybiBTdGFuZGFyZCBUaW1lJwotIyBvciBgRWFzdGVybiBTdW1tZXIgVGltZScuICAoTm90ZSwgdGhvdWdoLCB0aGF0IGFzIEkgc2F5IGluIHRoZQotIyBjdXJyZW50IGF1c3RyYWxhc2lhIGZpbGUsIHRoZXJlIGlzIHJlYWxseSBubyBzdWNoIHRoaW5nLikgIEFubm91bmNlcnMKLSMgb24gaXRzIG92ZXJzZWFzIHNlcnZpY2UsIFJhZGlvIEF1c3RyYWxpYSwgdXNlIHRoZSBzYW1lIHBocmFzZXMKLSMgcHJlZml4ZWQgYnkgdGhlIHdvcmQgYEF1c3RyYWxpYW4nIHdoZW4gcmVmZXJyaW5nIHRvIGxvY2FsIHRpbWVzOwotIyB0aW1lIGFubm91bmNlbWVudHMgb24gdGhhdCBzZXJ2aWNlLCBuYXR1cmFsbHkgZW5vdWdoLCBhcmUgbWFkZSBpbiBVVEMuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTItMDMtMDgpOgotIyBHaXZlbiB0aGUgYWJvdmUsIHdoYXQncyBjaG9zZW4gZm9yIHllYXItcm91bmQgdXNlIGlzOgotIwlDU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgOTozMAotIwlXU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgODowMAotIwlFU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgMTA6MDAKLQotIyBGcm9tIENodWNrIFNvcGVyICgyMDA2LTA2LTAxKToKLSMgSSByZWNlbnRseSBmb3VuZCB0aGlzIEF1c3RyYWxpYW4gZ292ZXJubWVudCB3ZWIgcGFnZSBvbiB0aW1lIHpvbmVzOgotIyA8aHR0cDovL3d3dy5hdXN0cmFsaWEuZ292LmF1L2Fib3V0LWF1c3RyYWxpYS0xM3RpbWU+Ci0jIEFuZCB0aGlzIGdvdmVybm1lbnQgd2ViIHBhZ2UgbGlzdHMgdGltZSB6b25lIG5hbWVzIGFuZCBhYmJyZXZpYXRpb25zOgotIyA8aHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RheXNhdnRtLnNodG1sPgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDQtMDUpLCBzdW1tYXJpemluZyBhIGxvbmcgZGlzY3Vzc2lvbiBhYm91dCAiRVNUIgotIyB2ZXJzdXMgIkFFU1QiIGV0Yy46Ci0jCi0jIEkgc2VlIHRoZSBmb2xsb3dpbmcgcG9pbnRzIG9mIGRpc3B1dGU6Ci0jCi0jICogSG93IGltcG9ydGFudCBhcmUgdW5pcXVlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zPwotIwotIyAgIEhlcmUgSSB0ZW5kIHRvIGFncmVlIHdpdGggdGhlIHBvaW50IChtb3N0IHJlY2VudGx5IG1hZGUgYnkgQ2hyaXMKLSMgICBOZXdtYW4pIHRoYXQgdW5pcXVlIGFiYnJldmlhdGlvbnMgc2hvdWxkIG5vdCBiZSBlc3NlbnRpYWwgZm9yIHByb3BlcgotIyAgIG9wZXJhdGlvbiBvZiBzb2Z0d2FyZS4gIFdlIGhhdmUgb3RoZXIgaW5zdGFuY2VzIG9mIGFtYmlndWl0eQotIyAgIChlLmcuICJJU1QiIGRlbm90aW5nIGJvdGggIklzcmFlbCBTdGFuZGFyZCBUaW1lIiBhbmQgIkluZGlhbgotIyAgIFN0YW5kYXJkIFRpbWUiKSwgYW5kIHRoZXkgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBhbnkgdGltZSBzb29uLgotIyAgIEluIHRoZSBvbGQgZGF5cywgc29tZSBzb2Z0d2FyZSBtaXN0YWtlbmx5IHJlbGllZCBvbiB1bmlxdWUKLSMgICBhYmJyZXZpYXRpb25zLCBidXQgdGhpcyBpcyBiZWNvbWluZyBsZXNzIHRydWUgd2l0aCB0aW1lLCBhbmQgSSBkb24ndAotIyAgIHRoaW5rIGl0J3MgdGhhdCBpbXBvcnRhbnQgdG8gY2F0ZXIgdG8gc3VjaCBzb2Z0d2FyZSB0aGVzZSBkYXlzLgotIwotIyAgIE9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBpcyBhbm90aGVyIG1vdGl2YXRpb24gZm9yIHVuYW1iaWd1b3VzCi0jICAgYWJicmV2aWF0aW9uczogaXQgY3V0cyBkb3duIG9uIGh1bWFuIGNvbmZ1c2lvbi4gIFRoaXMgaXMKLSMgICBwYXJ0aWN1bGFybHkgdHJ1ZSBmb3IgQXVzdHJhbGlhLCB3aGVyZSAiRVNUIiBjYW4gbWVhbiBvbmUgdGhpbmcgZm9yCi0jICAgdGltZSBUIGFuZCBhIGRpZmZlcmVudCB0aGluZyBmb3IgdGltZSBUIHBsdXMgMSBzZWNvbmQuCi0jCi0jICogRG9lcyB0aGUgcmVsZXZhbnQgbGVnaXNsYXRpb24gaW5kaWNhdGUgd2hpY2ggYWJicmV2aWF0aW9ucyBzaG91bGQgYmUgdXNlZD8KLSMKLSMgICBIZXJlIEkgdGVuZCB0byB0aGluayB0aGF0IHRoaW5ncyBhcmUgYSBtZXNzLCBqdXN0IGFzIHRoZXkgYXJlIGluCi0jICAgbWFueSBvdGhlciBjb3VudHJpZXMuICBXZSBBbWVyaWNhbnMgYXJlIGN1cnJlbnRseSBkaXNhZ3JlZWluZyBhYm91dAotIyAgIHdoaWNoIGFiYnJldmlhdGlvbiB0byB1c2UgZm9yIHRoZSBuZXdseSBsZWdpc2xhdGVkIENoYW1vcnJvIFN0YW5kYXJkCi0jICAgVGltZSwgZm9yIGV4YW1wbGUuCi0jCi0jICAgUGVyc29uYWxseSwgSSB3b3VsZCBwcmVmZXIgdG8gdXNlIGNvbW1vbiBwcmFjdGljZTsgSSB3b3VsZCBsaWtlIHRvCi0jICAgcmVmZXIgdG8gbGVnaXNsYXRpb24gb25seSBmb3IgZXhhbXBsZXMgb2YgY29tbW9uIHByYWN0aWNlLCBvciBhcyBhCi0jICAgdGllYnJlYWtlci4KLSMKLSMgKiBEbyBBdXN0cmFsaWFucyBtb3JlIG9mdGVuIHVzZSAiRWFzdGVybiBEYXlsaWdodCBUaW1lIiBvciAiRWFzdGVybgotIyAgIFN1bW1lciBUaW1lIj8gIERvIHRoZXkgdHlwaWNhbGx5IHByZWZpeCB0aGUgdGltZSB6b25lIG5hbWVzIHdpdGgKLSMgICB0aGUgd29yZCAiQXVzdHJhbGlhbiI/Ci0jCi0jICAgTXkgb3duIGltcHJlc3Npb24gaXMgdGhhdCBib3RoICJEYXlsaWdodCBUaW1lIiBhbmQgIlN1bW1lciBUaW1lIiBhcmUKLSMgICBjb21tb24gYW5kIGFyZSB3aWRlbHkgdW5kZXJzdG9vZCwgYnV0IHRoYXQgIlN1bW1lciBUaW1lIiBpcyBtb3JlCi0jICAgcG9wdWxhcjsgYW5kIHRoYXQgdGhlIGxlYWRpbmcgIkEiIGlzIGFsc28gY29tbW9uIGJ1dCBpcyBvbWl0dGVkIG1vcmUKLSMgICBvZnRlbiB0aGFuIG5vdC4gIEkganVzdCB1c2VkIEFsdGFWaXN0YSBhZHZhbmNlZCBzZWFyY2ggYW5kIGdvdCB0aGUKLSMgICBmb2xsb3dpbmcgY291bnQgb2YgcGFnZSBoaXRzOgotIwotIyAgICAgMSwxMDMgIkVhc3Rlcm4gU3VtbWVyIFRpbWUiIEFORCBkb21haW46YXUKLSMgICAgICAgOTcxICJBdXN0cmFsaWFuIEVhc3Rlcm4gU3VtbWVyIFRpbWUiIEFORCBkb21haW46YXUKLSMgICAgICAgNjEzICJFYXN0ZXJuIERheWxpZ2h0IFRpbWUiIEFORCBkb21haW46YXUKLSMgICAgICAgMTI3ICJBdXN0cmFsaWFuIEVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgQU5EIGRvbWFpbjphdQotIwotIyAgIEhlcmUgIlN1bW1lciIgc2VlbXMgcXVpdGUgYSBiaXQgbW9yZSBwb3B1bGFyIHRoYW4gIkRheWxpZ2h0IiwKLSMgICBwYXJ0aWN1bGFybHkgd2hlbiB3ZSBrbm93IHRoZSB0aW1lIHpvbmUgaXMgQXVzdHJhbGlhbiBhbmQgbm90IFVTLAotIyAgIHNheS4gIFRoZSAiQXVzdHJhbGlhbiIgcHJlZml4IHNlZW1zIHRvIGJlIHBvcHVsYXIgZm9yIEVhc3Rlcm4gU3VtbWVyCi0jICAgVGltZSwgYnV0IHVucG9wdWxhciBmb3IgRWFzdGVybiBEYXlsaWdodCBUaW1lLgotIwotIyAgIEZvciBhYmJyZXZpYXRpb25zLCB0b29scyBsaWtlIEFsdGFWaXN0YSBhcmUgbGVzcyB1c2VmdWwgYmVjYXVzZSBvZgotIyAgIGFtYmlndWl0eS4gIE1hbnkgaGl0cyBhcmUgbm90IHJlYWxseSB0aW1lIHpvbmVzLCB1bmZvcnR1bmF0ZWx5LCBhbmQKLSMgICBtYW55IGhpdHMgZGVub3RlIFVTIHRpbWUgem9uZXMgYW5kIG5vdCBBdXN0cmFsaWFuIG9uZXMuICBCdXQgaGVyZQotIyAgIGFyZSB0aGUgaGl0IGNvdW50cyBhbnl3YXk6Ci0jCi0jICAgICAxNjEsMzA0ICJFU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAyNSwxNTYgIkVEVCIgYW5kIGRvbWFpbjphdQotIyAgICAgIDE4LDI2MyAiQUVTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgIDEwLDQxNiAiQUVEVCIgYW5kIGRvbWFpbjphdQotIwotIyAgICAgIDE0LDUzOCAiQ1NUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgIDUsNzI4ICJDRFQiIGFuZCBkb21haW46YXUKLSMgICAgICAgICAxNzYgIkFDU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAgICAgMjkgIkFDRFQiIGFuZCBkb21haW46YXUKLSMKLSMgICAgICAgNyw1MzkgIldTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICAgICA2OCAiQVdTVCIgYW5kIGRvbWFpbjphdQotIwotIyAgIFRoaXMgZGF0YSBzdWdnZXN0IHRoYXQgQXVzdHJhbGlhbnMgdGVuZCB0byBvbWl0IHRoZSAiQSIgcHJlZml4IGluCi0jICAgcHJhY3RpY2UuICBUaGUgc2l0dWF0aW9uIGZvciAiU1QiIHZlcnN1cyAiRFQiIGlzIGxlc3MgY2xlYXIsIGdpdmVuCi0jICAgdGhlIGFtYmlndWl0aWVzIGludm9sdmVkLgotIwotIyAqIEhvdyBkbyBBdXN0cmFsaWFucyBmZWVsIGFib3V0IHRoZSBhYmJyZXZpYXRpb25zIGluIHRoZSB0eiBkYXRhYmFzZT8KLSMKLSMgICBJZiB5b3UganVzdCBjb3VudCBBdXN0cmFsaWFucyBvbiB0aGlzIGxpc3QsIEkgY291bnQgMiBpbiBmYXZvciBhbmQgMwotIyAgIGFnYWluc3QuICBPbmUgb2YgdGhlICJhZ2FpbnN0IiB2b3RlcyAoRGF2aWQgS2VlZ2VsKSBjb3Vuc2VsZWQgZGVsYXksCi0jICAgc2F5aW5nIHRoYXQgYm90aCBBRVNUL0FFRFQgYW5kIEVTVC9FU1QgYXJlIHdpZGVseSB1c2VkIGFuZAotIyAgIHVuZGVyc3Rvb2QgaW4gQXVzdHJhbGlhLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMTItMTkpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IDI6MDAgZm9yIGFsbCBhdXR1bW4gY2hhbmdlcyBpbiBBdXN0cmFsaWEgYW5kIE5aLgotIyBNYXJrIFByaW9yIHdyaXRlcyB0aGF0IGhpcyBuZXdzcGFwZXIKLSMgcmVwb3J0cyB0aGF0IE5TVydzIGZhbGwgMTk5NSBjaGFuZ2Ugd2lsbCBvY2N1ciBhdCAyOjAwLAotIyBidXQgUm9iZXJ0IEVseiBzYXlzIGl0J3MgYmVlbiAzOjAwIGluIFZpY3RvcmlhIHNpbmNlIDE5NzAKLSMgYW5kIHBlcmhhcHMgdGhlIG5ld3NwYXBlcidzIGAyOjAwJyBpcyByZWZlcnJpbmcgdG8gc3RhbmRhcmQgdGltZS4KLSMgRm9yIG5vdyB3ZSdsbCBjb250aW51ZSB0byBhc3N1bWUgMjowMHMgZm9yIGNoYW5nZXMgc2luY2UgMTk2MC4KLQotIyBGcm9tIEVyaWMgVWxldmlrICgxOTk4LTAxLTA1KToKLSMKLSMgSGVyZSBhcmUgc29tZSBVUkxzIHRvIEF1c3RyYWxpYW4gdGltZSBsZWdpc2xhdGlvbi4gVGhlc2UgVVJMcyBhcmUgc3RhYmxlLAotIyBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhIGZpbGUuIFRoZXJlIGFyZSBwcm9iYWJseSBtb3JlCi0jIHJlbGV2YW50IGVudHJpZXMgaW4gdGhpcyBkYXRhYmFzZS4KLSMKLSMgTlNXIChpbmNsdWRpbmcgTEhJIGFuZCBCcm9rZW4gSGlsbCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvbnN3L2NvbnNvbF9hY3Qvc3RhMTk4NzEzNy9pbmRleC5odG1sIj4KLSMgU3RhbmRhcmQgVGltZSBBY3QgMTk4NyAodXBkYXRlZCAxOTk1LTA0LTA0KQotIyA8L2E+Ci0jIEFDVAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL2FjdC9jb25zb2xfYWN0L3N0YXN0YTE5NzIyNzkvaW5kZXguaHRtbCI+Ci0jIFN0YW5kYXJkIFRpbWUgYW5kIFN1bW1lciBUaW1lIEFjdCAxOTcyCi0jIDwvYT4KLSMgU0EKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9zYS9jb25zb2xfYWN0L3N0YTE4OTgxMzcvaW5kZXguaHRtbCI+Ci0jIFN0YW5kYXJkIFRpbWUgQWN0LCAxODk4Ci0jIDwvYT4KLQotIyBGcm9tIERhdmlkIEdyb3N6ICgyMDA1LTA2LTEzKToKLSMgSXQgd2FzIGFubm91bmNlZCBsYXN0IHdlZWsgdGhhdCBEYXlsaWdodCBTYXZpbmcgd291bGQgYmUgZXh0ZW5kZWQgYnkKLSMgb25lIHdlZWsgbmV4dCB5ZWFyIHRvIGFsbG93IGZvciB0aGUgMjAwNiBDb21tb253ZWFsdGggR2FtZXMuCi0jIERheWxpZ2h0IFNhdmluZyBpcyBub3cgdG8gZW5kIGZvciBuZXh0IHllYXIgb25seSBvbiB0aGUgZmlyc3QgU3VuZGF5Ci0jIGluIEFwcmlsIGluc3RlYWQgb2YgdGhlIGxhc3QgU3VuZGF5IGluIE1hcmNoLgotIwotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA2LTE0KToKLSMgSSBkaWQgc29tZSBHb29nbGluZyBhbmQgZm91bmQgdGhhdCBhbGwgb2YgdGhvc2Ugc3RhdGVzIChhbmQgdGVycml0b3J5KSBwbGFuCi0jIHRvIGV4dGVuZCBEU1QgdG9nZXRoZXIgaW4gMjAwNi4KLSMgQUNUOiBodHRwOi8vd3d3LmNtZC5hY3QuZ292LmF1L21lZGlhcmVsZWFzZXMvZmlsZXJlYWQuY2ZtP2ZpbGU9ODYudHh0Ci0jIE5ldyBTb3V0aCBXYWxlczogaHR0cDovL3d3dy50aGVjb3VyaWVybWFpbC5uZXdzLmNvbS5hdS9jb21tb24vc3RvcnlfcGFnZS8wLDU5MzYsMTU1Mzg4NjklMjU1RTE3MDIsMDAuaHRtbAotIyBTb3V0aCBBdXN0cmFsaWE6IGh0dHA6Ly93d3cubmV3cy5jb20uYXUvc3RvcnkvMCwxMDExNywxNTU1NTAzMS0xMjQ2LDAwLmh0bWwKLSMgVGFzbWFuaWE6IGh0dHA6Ly93d3cubWVkaWEudGFzLmdvdi5hdS9yZWxlYXNlLnBocD9pZD0xNDc3MgotIyBWaWN0b3JpYTogSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGFueXRoaW5nIHNlcGFyYXRlLCBidXQgdGhlIG90aGVyIGFydGljbGVzCi0jIGFsbHVkZSB0byBpdC4KLSMgQnV0IG5vdCBRdWVlbnNsYW5kCi0jIGh0dHA6Ly93d3cubmV3cy5jb20uYXUvc3RvcnkvMCwxMDExNywxNTU2NDAzMC0xMjQ4LDAwLmh0bWwuCi0KLSMgTm9ydGhlcm4gVGVycml0b3J5Ci0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyBUaGUgTk9SVEhFUk4gVEVSUklUT1JZLi4gIFsgQ291cnRlc3kgTi5ULiBEZXB0IG9mIHRoZSBDaGllZiBNaW5pc3RlciBdCi0jICMJCQkJCVsgTm92IDE5OTAgXQotIyAjCU4uVC4gaGF2ZSBuZXZlciB1dGlsaXNlZCBhbnkgRFNUIGR1ZSB0byBzdWItdHJvcGljYWwvdHJvcGljYWwgbG9jYXRpb24uCi0jIC4uLgotIyBab25lICAgICAgICBBdXN0cmFsaWEvTm9ydGggICAgICAgICA5OjMwICAgIC0gICAgICAgQ1NUCi0KLSMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkxLTAzLTA0KToKLSMgQSByZWNlbnQgZXhjZXJwdCBmcm9tIGFuIEF1c3RyYWxpYW4gbmV3c3BhcGVyLi4uCi0jIHRoZSBOb3J0aGVybiBUZXJyaXRvcnkgZG9bZXNdIG5vdCBoYXZlIGRheWxpZ2h0IHNhdmluZy4KLQotIyBXZXN0ZXJuIEF1c3RyYWxpYQotCi0jIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgIFRoZSBzdGF0ZSBvZiBXRVNURVJOIEFVU1RSQUxJQS4uICBbIENvdXJ0ZXN5IFcuQS4gZGVwdCBQcmVtaWVyK0NhYmluZXQgXQotIyAjCQkJCQkJWyBOb3YgMTk5MCBdCi0jICMJVy5BLiBzdWZmZXJzIGZyb20gYSBncmVhdCBkZWFsIG9mIHB1YmxpYyBhbmQgcG9saXRpY2FsIG9wcG9zaXRpb24gdG8KLSMgIwlEU1QgaW4gcHJpbmNpcGxlLiBBIGJpbGwgaXMgYnJvdWdodCBiZWZvcmUgcGFybGlhbWVudCBpbiBtb3N0IHllYXJzLCBidXQKLSMgIwl1c3VhbGx5IGRlZmVhdGVkIGVpdGhlciBpbiB0aGUgdXBwZXIgaG91c2UsIG9yIGluIHBhcnR5IGNhdWN1cwotIyAjCWJlZm9yZSByZWFjaGluZyBwYXJsaWFtZW50LgotIyAuLi4KLSMgWm9uZQlBdXN0cmFsaWEvV2VzdAkJODowMAlBVwklc1NUCi0jIC4uLgotIyBSdWxlCUFXCTE5NzQJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJQVcJMTk3NQlvbmx5CS0JTWFyCVN1bj49MQkzOjAwCTAJVwotIyBSdWxlCUFXCTE5ODMJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJQVcJMTk4NAlvbmx5CS0JTWFyCVN1bj49MQkzOjAwCTAJVwotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5MS0wMy0wNCk6Ci0jIEEgcmVjZW50IGV4Y2VycHQgZnJvbSBhbiBBdXN0cmFsaWFuIG5ld3NwYXBlci4uLgotIyBXZXN0ZXJuIEF1c3RyYWxpYS4uLmRvW2VzXSBub3QgaGF2ZSBkYXlsaWdodCBzYXZpbmcuCi0KLSMgRnJvbSBKb2huIEQuIE5ld21hbiB2aWEgQnJhZGxleSBXaGl0ZSAoMTk5MS0xMS0wMik6Ci0jIFdlc3Rlcm4gQXVzdHJhbGlhIGlzIHN0aWxsIG9uICJ3aW50ZXIgdGltZSIuIFNvbWUgREggaW4gU3lkbmV5Ci0jIHJhbmcgbWUgYXQgaG9tZSBhIGZldyBkYXlzIGFnbyBhdCA2LjAwYW0uIChIZSBoYWQganVzdCBhcnJpdmVkIGF0Ci0jIHdvcmsgYXQgOS4wMGFtLikKLSMgVy5BLiBpcyBzd2l0Y2hpbmcgdG8gU3VtbWVyIFRpbWUgb24gTm92IDE3dGgganVzdCB0byBjb25mdXNlCi0jIGV2ZXJ5Ym9keSBhZ2Fpbi4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5Mi0wMy0wOCk6Ci0jIFRoZSAxOTkyIGVuZGluZyBkYXRlIHVzZWQgaW4gdGhlIHJ1bGVzIGlzIGEgYmVzdCBndWVzczsKLSMgaXQgbWF0Y2hlcyB3aGF0IHdhcyB1c2VkIGluIHRoZSBwYXN0LgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9tLmdvdi5hdS9mYXEvZmFxZ2VuLmh0bSI+Ci0jIFRoZSBBdXN0cmFsaWFuIEJ1cmVhdSBvZiBNZXRlb3JvbG9neSBGQVEKLSMgPC9hPiAoMTk5OS0wOS0yNykgd3JpdGVzIHRoYXQgR2lsZXMgTWV0ZW9yb2xvZ2ljYWwgU3RhdGlvbiB1c2VzCi0jIFNvdXRoIEF1c3RyYWxpYW4gdGltZSBldmVuIHRob3VnaCBpdCdzIGxvY2F0ZWQgaW4gV2VzdGVybiBBdXN0cmFsaWEuCi0KLSMgUXVlZW5zbGFuZAotIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgotIyAjICAgVGhlIHN0YXRlIG9mIFFVRUVOU0xBTkQuLiBbIENvdXJ0ZXN5IFFsZC4gRGVwdCBQcmVtaWVyIEVjb24mVHJhZGUgRGV2ZWwgXQotIyAjCQkJCQkJWyBEZWMgMTk5MCBdCi0jIC4uLgotIyBab25lCUF1c3RyYWxpYS9RdWVlbnNsYW5kCTEwOjAwCUFRCSVzU1QKLSMgLi4uCi0jIFJ1bGUJQVEJMTk3MQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlBUQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkzOjAwCTAJRQotIyBSdWxlCUFRCTE5ODkJbWF4CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlBUQkxOTkwCW1heAktCU1hcglTdW4+PTEJMzowMAkwCUUKLQotIyBGcm9tIEJyYWRsZXkgV2hpdGUgKDE5ODktMTItMjQpOgotIyAiQXVzdHJhbGlhL1F1ZWVuc2xhbmQiIG5vdyBvYnNlcnZlcyBkYXlsaWdodCB0aW1lIChpLmUuIGZyb20KLSMgT2N0b2JlciAxOTg5KS4KLQotIyBGcm9tIEJyYWRsZXkgV2hpdGUgKDE5OTEtMDMtMDQpOgotIyBBIHJlY2VudCBleGNlcnB0IGZyb20gYW4gQXVzdHJhbGlhbiBuZXdzcGFwZXIuLi4KLSMgLi4uUXVlZW5zbGFuZC4uLltoYXNdIGFncmVlZCB0byBlbmQgZGF5bGlnaHQgc2F2aW5nCi0jIGF0IDNhbSB0b21vcnJvdyAoTWFyY2ggMykuLi4KLQotIyBGcm9tIEpvaG4gTWFja2luICgxOTkxLTAzLTA2KToKLSMgSSBjYW4gY2VydGFpbmx5IGNvbmZpcm0gZm9yIG15IHBhcnQgdGhhdCBEYXlsaWdodCBTYXZpbmcgaW4gTlNXIGRpZCBpbiBmYWN0Ci0jIGVuZCBvbiBTdW5kYXksIDMgTWFyY2guICBJIGRvbid0IGtub3cgYXQgd2hhdCBob3VyLCB0aG91Z2guICAoSXQgc3VycHJpc2VkCi0jIG1lLikKLQotIyBGcm9tIEJyYWRsZXkgV2hpdGUgKDE5OTItMDMtMDgpOgotIyAuLi50aGVyZSB3YXMgcmVjZW50bHkgYSByZWZlcmVuZHVtIGluIFF1ZWVuc2xhbmQgd2hpY2ggcmVzdWx0ZWQKLSMgaW4gdGhlIGV4cGVyaW1lbnRhbCBkYXlsaWdodCBzYXZpbmcgc3lzdGVtIGJlaW5nIGFiYW5kb25lZC4gU28sIC4uLgotIyAuLi4KLSMgUnVsZQlRTEQJMTk4OQkxOTkxCS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlRTEQJMTk5MAkxOTkyCS0JTWFyCVN1bj49MQkzOjAwCTAJUwotIyAuLi4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5Mi0wMy0wOCk6Ci0jIFRoZSBjaG9zZW4gcnVsZXMgdGhlIHVuaW9uIG9mIHRoZSAxOTcxLzE5NzIgY2hhbmdlIGFuZCB0aGUgMTk4OS0xOTkyIGNoYW5nZXMuCi0KLSMgRnJvbSBDaHJpc3RvcGhlciBIdW50ICgyMDA2LTExLTIxKSwgYWZ0ZXIgYW4gYWR2YW5jZSB3YXJuaW5nCi0jIGZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTExLTAxKToKLSMgV0EgYXJlIHRyaWFsaW5nIERTVCBmb3IgdGhyZWUgeWVhcnMuCi0jIDxodHRwOi8vd3d3LnBhcmxpYW1lbnQud2EuZ292LmF1L3BhcmxpYW1lbnQvYmlsbHMubnNmLzlBMUIxODMxNDQ0MDNEQTU0ODI1NzIxMjAwMDg4REYxLyRGaWxlL0JpbGwxNzUtMUIucGRmPgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDItMDQtMDkpOgotIyBUaGUgbW9zdCBpbnRlcmVzdGluZyByZWdpb24gSSBoYXZlIGZvdW5kIGNvbnNpc3RzIG9mIHRocmVlIHRvd25zIG9uIHRoZQotIyBzb3V0aGVybiBjb2FzdC4uLi4gIFNvdXRoIEF1c3RyYWxpYSBvYnNlcnZlcyBkYXlsaWdodCBzYXZpbmcgdGltZTsgV2VzdGVybgotIyBBdXN0cmFsaWEgZG9lcyBub3QuICBUaGUgdHdvIHN0YXRlcyBhcmUgb25lIGFuZCBhIGhhbGYgaG91cnMgYXBhcnQuICBUaGUKLSMgcmVzaWRlbnRzIGRlY2lkZWQgdG8gZm9yZ2V0IGFib3V0IHRoaXMgbm9uc2Vuc2Ugb2YgY2hhbmdpbmcgdGhlIGNsb2NrIHNvCi0jIG11Y2ggYW5kIHNldCB0aGUgbG9jYWwgdGltZSAyMCBob3VycyBhbmQgNDUgbWludXRlcyBmcm9tIHRoZQotIyBpbnRlcm5hdGlvbmFsIGRhdGUgbGluZSwgb3IgcmlnaHQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGltZSBvZiBTb3V0aAotIyBBdXN0cmFsaWEgYW5kIFdlc3Rlcm4gQXVzdHJhbGlhLi4uLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTA0LTA5KToKLSMgVGhpcyBpcyBjb25maXJtZWQgYnkgdGhlIHNlY3Rpb24gZW50aXRsZWQKLSMgIldoYXQncyB0aGUgZGVhbCB3aXRoIHRpbWUgem9uZXM/Pz8iIGluCi0jIDxodHRwOi8vd3d3LmVhcnRoc2NpLnVuaW1lbGIuZWR1LmF1L35hd2F0a2lucy9udWxsLmh0bWw+LgotIwotIyBGcm9tIEFsZXggTGl2aW5nc3RvbiAoMjAwNi0xMi0wNyk6Ci0jIC4uLiBpdCB3YXMganVzdCBvbiBmb3VyIHllYXJzIGFnbyB0aGF0IEkgZHJvdmUgYWxvbmcgdGhlIEV5cmUgSGlnaHdheSwKLSMgd2hpY2ggcGFzc2VzIHRocm91Z2ggZWFzdGVybiBXZXN0ZXJuIEF1c3RyYWxpYSBjbG9zZSB0byB0aGUgc291dGhlcm4KLSMgY29hc3Qgb2YgdGhlIGNvbnRpbmVudC4KLSMKLSMgSSBwYWlkIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSB0aW1lIGtlcHQgdGhlcmUuIFRoZXJlIGNhbiBiZSBubwotIyBkaXNwdXRlIHRoYXQgVVRDKzA4OjQ1IHdhcyBjb25zaWRlcmVkICJ0aGUgdGltZSIgZnJvbSB0aGUgYm9yZGVyCi0jIHZpbGxhZ2UganVzdCBpbnNpZGUgdGhlIGJvcmRlciB3aXRoIFNvdXRoIEF1c3RyYWxpYSB0byBhcyBmYXIgd2VzdAotIyBhcyBqdXN0IGVhc3Qgb2YgQ2FpZ3VuYS4gVGhlcmUgY2FuIGFsc28gYmUgbm8gZGlzcHV0ZSB0aGF0IEV1Y2xhIGlzCi0jIHRoZSBsYXJnZXN0IHBvcHVsYXRpb24gY2VudHJlIGluIHRoaXMgem9uZS4uLi4KLSMKLSMgTm93IHRoYXQgV2VzdGVybiBBdXN0cmFsaWEgaXMgb2JzZXJ2aW5nIGRheWxpZ2h0IHNhdmluZywgdGhlCi0jIHF1ZXN0aW9uIGFyb3NlIHdoZXRoZXIgdGhpcyBwYXJ0IG9mIHRoZSBzdGF0ZSB3b3VsZCBmb2xsb3cgc3VpdC4gSQotIyBqdXN0IGNhbGxlZCB0aGUgYm9yZGVyIHZpbGxhZ2UgYW5kIGNvbmZpcm1lZCB0aGF0IGluZGVlZCB0aGV5IGhhdmUsCi0jIG1lYW5pbmcgdGhhdCB0aGV5IGFyZSBub3cgb2JzZXJ2aW5nIFVUQyswOTo0NS4KLSMKLSMgKDIwMDYtMTItMDkpOgotIyBJIHBlcnNvbmFsbHkgZG91YnQgdGhhdCBlaXRoZXIgZXhwZXJpbWVudGF0aW9uIHdpdGggZGF5bGlnaHQgc2F2aW5nCi0jIGluIFdBIG9yIGl0cyBpbnRyb2R1Y3Rpb24gaW4gU0EgaGFkIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGdlbmVzaXMKLSMgb2YgdGhpcyB0aW1lIHpvbmUuICBNeSBodW5jaCBpcyB0aGF0IGl0J3MgYmVlbiBhcm91bmQgc2luY2Ugd2VsbAotIyBiZWZvcmUgMTk3NS4gIEkgcmVtZW1iZXIgc2VlaW5nIGl0IG5vdGVkIG9uIHJvYWQgbWFwcyBkZWNhZGVzIGFnby4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTEyLTE1KToKLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGFzc3VtZSB0aGUgdHJhZGl0aW9uIGRhdGVzIGJhY2sgdG8gdGhlCi0jIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZCB0aW1lIGluIDE4OTUuCi0KLQotIyBzb3V0aGVhc3QgQXVzdHJhbGlhCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTdGFydGluZyBhdXR1bW4gMjAwOCBWaWN0b3JpYSwgTlNXLCBTb3V0aCBBdXN0cmFsaWEsIFRhc21hbmlhIGFuZCB0aGUgQUNUCi0jIGVuZCBEU1QgdGhlIGZpcnN0IFN1bmRheSBpbiBBcHJpbCBhbmQgc3RhcnQgRFNUIHRoZSBmaXJzdCBTdW5kYXkgaW4gT2N0b2Jlci4KLSMgaHR0cDovL3d3dy50aGVhZ2UuY29tLmF1L25ld3MvbmF0aW9uYWwvZGF5bGlnaHQtc2F2aW5ncy10by1zcGFuLXNpeC1tb250aHMvMjAwNy8wNi8yNy8xMTgyNjIzOTY2NzAzLmh0bWwKLQotCi0jIFNvdXRoIEF1c3RyYWxpYQotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5MS0wMy0wNCk6Ci0jIEEgcmVjZW50IGV4Y2VycHQgZnJvbSBhbiBBdXN0cmFsaWFuIG5ld3NwYXBlci4uLgotIyAuLi5Tb3V0aCBBdXN0cmFsaWEuLi5baGFzXSBhZ3JlZWQgdG8gZW5kIGRheWxpZ2h0IHNhdmluZwotIyBhdCAzYW0gdG9tb3Jyb3cgKE1hcmNoIDMpLi4uCi0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyAgIFRoZSBzdGF0ZSBvZiBTT1VUSCBBVVNUUkFMSUEuLi4uWyBDb3VydGVzeSBvZiBTLkEuIERlcHQgb2YgTGFib3VyIF0KLSMgIwkJCQkJCVsgTm92IDE5OTAgXQotIyAuLi4KLSMgWm9uZQlBdXN0cmFsaWEvU291dGgJCTk6MzAJQVMJJXNTVAotIyAuLi4KLSMgUnVsZQkgQVMJMTk3MQltYXgJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBSdWxlCSBBUwkxOTcyCTE5ODUJLQlNYXIJU3VuPj0xCTM6MDAJMAlDCi0jIFJ1bGUJIEFTCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTM6MDAJMAlDCi0jIFJ1bGUJIEFTCTE5OTEJbWF4CS0JTWFyCVN1bj49MQkzOjAwCTAJQwotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5Mi0wMy0xMSk6Ci0jIFJlY2VudCBjb3JyZXNwb25kZW5jZSB3aXRoIGEgZnJpZW5kIGluIEFkZWxhaWRlCi0jIGNvbnRhaW5lZCB0aGUgZm9sbG93aW5nIGV4Y2hhbmdlOiAgIkR1ZSB0byB0aGUgQWRlbGFpZGUgRmVzdGl2YWwsCi0jIFNvdXRoIEF1c3RyYWxpYSBkZWxheXMgc2V0dGluZyBiYWNrIG91ciBjbG9ja3MgZm9yIGEgZmV3IHdlZWtzLiIKLQotIyBGcm9tIFJvYmVydCBFbHogKDE5OTItMDMtMTMpOgotIyBJIGhlYXJkIHRoYXQgYXBwYXJlbnRseSAob3IgYXQgbGVhc3QsIGl0IGFwcGVhcnMgdGhhdCkKLSMgU291dGggQXVzIHdpbGwgaGF2ZSBhbiBleHRyYSAzIHdlZWtzIGRheWxpZ2h0IHNhdmluZyBldmVyeSBldmVuCi0jIG51bWJlcmVkIHllYXIgKGZyb20gMTk5MCkuICBUaGF0J3Mgd2hlbiB0aGUgQWRlbGFpZGUgRmVzdGl2YWwKLSMgaXMgb24uLi4KLQotIyBGcm9tIFJvYmVydCBFbHogKDE5OTItMDMtMTYsIDAwOjU3OjA3ICsxMDAwKToKLSMgRFNUIGRpZG4ndCBlbmQgaW4gQWRlbGFpZGUgdG9kYXkgKHllc3RlcmRheSkuLi4uCi0jIEJ1dCB3aGV0aGVyIGl0J3MgIjR0aCBTdW5kYXkiIG9yICIybmQgbGFzdCBTdW5kYXkiIEkgaGF2ZSBubyBpZGVhIHdoYXRldmVyLi4uCi0jIChpdCdzIGp1c3QgYXMgbGlrZWx5IHRvIGJlICJ0aGUgU3VuZGF5IHdlIHBpY2sgZm9yIHRoaXMgeWVhciIuLi4pLgotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5NC0wNC0xMSk6Ci0jIElmIFN1biwgMTUgTWFyY2gsIDE5OTIgd2FzIGF0ICsxMDMwIGFzIGtyZSBhc3NlcnRzLCBidXQgeWV0IFN1biwgMjAgTWFyY2gsCi0jIDE5OTQgd2FzIGF0ICswOTMwIGFzIEpvaG4gQ29ubm9sbHkncyBjdXN0b21lciBzZWVtcyB0byBhc3NlcnQsIHRoZW4gSSBjYW4KLSMgb25seSBjb25jbHVkZSB0aGF0IHRoZSBhY3R1YWwgcnVsZSBpcyBtb3JlIGNvbXBsaWNhdGVkLi4uLgotCi0jIEZyb20gSm9obiBXYXJidXJ0b24gKDE5OTQtMTAtMDcpOgotIyBUaGUgbmV3IERheWxpZ2h0IFNhdmluZ3MgZGF0ZXMgZm9yIFNvdXRoIEF1c3RyYWxpYSAuLi4KLSMgd2FzIGdhemV0dGVkIGluIHRoZSBHb3Zlcm5tZW50IEhhbnNhcmQgb24gU2VwIDI2IDE5OTQuLi4uCi0jIHN0YXJ0IG9uIGxhc3QgU3VuZGF5IGluIE9jdG9iZXIgYW5kIGVuZCBpbiBsYXN0IHN1bmRheSBpbiBNYXJjaC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA3LTIzKToKLSMgU2VlICJzb3V0aGVhc3QgQXVzdHJhbGlhIiBhYm92ZSBmb3IgMjAwOCBhbmQgbGF0ZXIuCi0KLSMgVGFzbWFuaWEKLQotIyBUaGUgcnVsZXMgZm9yIDE5NjcgdGhyb3VnaCAxOTkxIHdlcmUgcmVwb3J0ZWQgYnkgR2VvcmdlIFNoZXBoZXJkCi0jIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgIFRoZSBzdGF0ZSBvZiBUQVNNQU5JQS4uIFtDb3VydGVzeSBUYXNtYW5pYW4gRGVwdCBvZiBQcmVtaWVyICsgQ2FiaW5ldCBdCi0jICMJCQkJCVsgTm92IDE5OTAgXQotCi0jIEZyb20gQmlsbCBIYXJ0IHZpYSBHdXkgSGFycmlzICgxOTkxLTEwLTEwKToKLSMgT2ggeWVzLCB0aGUgbmV3IGRheWxpZ2h0IHNhdmluZ3MgcnVsZXMgYXJlIHVuaXF1ZWx5IHRhc21hbmlhbiwgd2UgaGF2ZQotIyA2IHdlZWtzIGEgeWVhciBub3cgd2hlbiB3ZSBhcmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgcmVzdCBvZiBBdXN0cmFsaWEKLSMgKGJ1dCBub3RoaW5nIG5ldyBhYm91dCB0aGF0KS4KLQotIyBGcm9tIEFsZXggTGl2aW5nc3RvbiAoMTk5OS0xMC0wNCk6Ci0jIEkgaGVhcmQgb24gdGhlIEFCQyAoQXVzdHJhbGlhbiBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24pIHJhZGlvIG5ld3Mgb24gdGhlCi0jIChsb25nKSB3ZWVrZW5kIHRoYXQgVGFzbWFuaWEsIHdoaWNoIHVzdWFsbHkgZ29lcyBpdHMgb3duIHdheSBpbiB0aGlzIHJlZ2FyZCwKLSMgaGFzIGRlY2lkZWQgdG8gam9pbiB3aXRoIG1vc3Qgb2YgTlNXLCB0aGUgQUNULCBhbmQgbW9zdCBvZiBWaWN0b3JpYQotIyAoQXVzdHJhbGlhKSBhbmQgc3RhcnQgZGF5bGlnaHQgc2F2aW5nIG9uIHRoZSBsYXN0IFN1bmRheSBpbiBBdWd1c3QgaW4gMjAwMAotIyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBTdW5kYXkgaW4gT2N0b2Jlci4KLQotIyBTaW0gQWxhbSAoMjAwMC0wNy0wMykgcmVwb3J0ZWQgYSBsZWdhbCBjaXRhdGlvbiBmb3IgdGhlIDIwMDAvMjAwMSBydWxlczoKLSMgaHR0cDovL3d3dy50aGVsYXcudGFzLmdvdi5hdS9mcmFndmlldy80MisrMTk2OCtHUzNBQEVOKzIwMDAwNzAzMDAKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA3LTIzKToKLSMgU2VlICJzb3V0aGVhc3QgQXVzdHJhbGlhIiBhYm92ZSBmb3IgMjAwOCBhbmQgbGF0ZXIuCi0KLSMgVmljdG9yaWEKLQotIyBUaGUgcnVsZXMgZm9yIDE5NzEgdGhyb3VnaCAxOTkxIHdlcmUgcmVwb3J0ZWQgYnkgR2VvcmdlIFNoZXBoZXJkCi0jIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgICBUaGUgc3RhdGUgb2YgVklDVE9SSUEuLiBbIENvdXJ0ZXN5IG9mIFZpYy4gRGVwdCBvZiBQcmVtaWVyICsgQ2FiaW5ldCBdCi0jICMJCQkJCQlbIE5vdiAxOTkwIF0KLQotIyBGcm9tIFNjb3R0IEhhcnJpbmd0b24gKDIwMDEtMDgtMjkpOgotIyBPbiBLUUVEJ3MgIkNpdHkgQXJ0cyBhbmQgTGVjdHVyZXMiIHByb2dyYW0gbGFzdCBuaWdodCBJIGhlYXJkIGFuCi0jIGludGVyZXN0aW5nIHN0b3J5IGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZS4gIERyLiBKb2huIEhlaWxicm9uIHdhcwotIyBkaXNjdXNzaW5nIGhpcyBib29rICJUaGUgU3VuIGluIHRoZSBDaHVyY2g6IENhdGhlZHJhbHMgYXMgU29sYXIKLSMgT2JzZXJ2YXRvcmllcyJbMV0sIGFuZCBpbiBwYXJ0aWN1bGFyIHRoZSBTaHJpbmUgb2YgUmVtZW1icmFuY2VbMl0gbG9jYXRlZAotIyBpbiBNZWxib3VybmUsIEF1c3RyYWxpYS4KLSMKLSMgQXBwYXJlbnRseSB0aGUgc2hyaW5lJ3MgbWFpbiBwdXJwb3NlIGlzIGEgYmVhbSBvZiBzdW5saWdodCB3aGljaAotIyBpbGx1bWluYXRlcyBhIHNwZWNpYWwgc3BvdCBvbiB0aGUgZmxvb3IgYXQgdGhlIDExdGggaG91ciBvZiB0aGUgMTF0aCBkYXkKLSMgb2YgdGhlIDExdGggbW9udGggKFJlbWVtYnJhbmNlIERheSkgZXZlcnkgeWVhciBpbiBtZW1vcnkgb2YgQXVzdHJhbGlhJ3MKLSMgZmFsbGVuIFdXSSBzb2xkaWVycy4gIEFuZCBpZiB5b3UgZ28gdGhlcmUgb24gTm92LiAxMSwgYXQgMTFhbSBsb2NhbCB0aW1lLAotIyB5b3Ugd2lsbCBpbmRlZWQgc2VlIHRoZSBzdW5iZWFtIGlsbHVtaW5hdGUgdGhlIHNwZWNpYWwgc3BvdCBhdCB0aGUKLSMgZXhwZWN0ZWQgdGltZS4KLSMKLSMgSG93ZXZlciwgdGhhdCBpcyBvbmx5IGJlY2F1c2Ugb2Ygc29tZSBzcGVjaWFsIG1pcnJvciBjb250cmFwdGlvbiB0aGF0IGhhZAotIyB0byBiZSBlbXBsb3llZCwgc2luY2UgZHVlIHRvIGRheWxpZ2h0IHNhdmluZ3MgdGltZSwgdGhlIHRydWUgc29sYXIgdGltZSBvZgotIyB0aGUgcmVtZW1icmFuY2UgbW9tZW50IG9jY3VycyBvbmUgaG91ciBsYXRlciAob3IgZWFybGllcj8pLiAgUGVyaGFwcwotIyBzb21lb25lIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGp1cnktcmlnIGNhbiB0ZWxsIHVzIG1vcmUuCi0jCi0jIFsxXSBodHRwOi8vd3d3Lmh1cC5oYXJ2YXJkLmVkdS9jYXRhbG9nL0hFSVNVTi5odG1sCi0jIFsyXSBodHRwOi8vd3d3LnNocmluZS5vcmcuYXUKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA3LTIzKToKLSMgU2VlICJzb3V0aGVhc3QgQXVzdHJhbGlhIiBhYm92ZSBmb3IgMjAwOCBhbmQgbGF0ZXIuCi0KLSMgTmV3IFNvdXRoIFdhbGVzCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb246Ci0jIE5ldyBTb3V0aCBXYWxlcyBhbmQgc3VianVyaXNkaWN0aW9ucyBoYXZlIHRoZWlyIG93biBpZGVhcyBvZiBhIGZ1biB0aW1lLgotIyBCYXNlZCBvbiBsYXcgbGlicmFyeSByZXNlYXJjaCBieSBKb2huIE1hY2tpbiwKLSMgd2hvIG5vdGVzOgotIwlJbiBBdXN0cmFsaWEsIHRpbWUgaXMgbm90IGxlZ2lzbGF0ZWQgZmVkZXJhbGx5LCBidXQgcmF0aGVyIGJ5IHRoZQotIwlpbmRpdmlkdWFsIHN0YXRlcy4gIFRodXMsIHdoaWxlIHN1Y2ggdGVybXMgYXMgYGBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUnJwotIwlbSSBtZWFuLCBvZiBjb3Vyc2UsIEF1c3RyYWxpYW4gRVNULCBub3QgYW55IG90aGVyIGtpbmRdIGFyZSBpbiBjb21tb24KLSMJdXNlLCBfdGhleSBoYXZlIE5PIFJFQUwgTUVBTklOR18sIGFzIHRoZXkgYXJlIG5vdCBkZWZpbmVkIGluIHRoZQotIwlsZWdpc2xhdGlvbi4gIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZC4KLSMJSSBoYXZlIHJlc2VhcmNoZWQgTmV3IFNvdXRoIFdhbGVzIHRpbWUgb25seS4uLgotCi0jIEZyb20gRXJpYyBVbGV2aWsgKDE5OTktMDUtMjYpOgotIyBEU1Qgd2lsbCBzdGFydCBpbiBOU1cgb24gdGhlIGxhc3QgU3VuZGF5IG9mIEF1Z3VzdCwgcmF0aGVyIHRoYW4gdGhlIHVzdWFsCi0jIE9jdG9iZXIgaW4gMjAwMC4gIFtTZWU6IE1hdHRoZXcgTW9vcmUsCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc21oLmNvbS5hdS9uZXdzLzk5MDUvMjYvcGFnZW9uZS9wYWdlb25lNC5odG1sIj4KLSMgVHdvIG1vbnRocyBtb3JlIGRheWxpZ2h0IHNhdmluZwotIyA8L2E+Ci0jIFN5ZG5leSBNb3JuaW5nIEhlcmFsZCAoMTk5OS0wNS0yNikuXQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDktMjcpOgotIyBTZWUgdGhlIGZvbGxvd2luZyBvZmZpY2lhbCBOU1cgc291cmNlOgotIyA8YSBocmVmPSJodHRwOi8vZGlyLmdpcy5uc3cuZ292LmF1L2NnaS1iaW4vZ2Vub2JqZWN0L2RvY3VtZW50L290aGVyL2RheWxpZ2h0c2F2aW5nL3RpZ0dtWiI+Ci0jIERheWxpZ2h0IFNhdmluZyBpbiBOZXcgU291dGggV2FsZXMuCi0jIDwvYT4KLSMKLSMgTmFycmFicmkgU2hpcmUgKE5TVykgY291bmNpbCBoYXMgYW5ub3VuY2VkIGl0IHdpbGwgaWdub3JlIHRoZSBleHRlbnNpb24gb2YKLSMgZGF5bGlnaHQgc2F2aW5nIG5leHQgeWVhci4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9yZWdpb25hbHMvbmV3ZW5nL21vbnRobHkvcmVnZW5nLTIyanVsMTk5OS0xLmh0bSI+Ci0jIE5hcnJhYnJpIENvdW5jaWwgdG8gaWdub3JlIGRheWxpZ2h0IHNhdmluZwotIyA8L2E+ICgxOTk5LTA3LTIyKS4gIEZvciBub3csIHdlJ2xsIHdhaXQgdG8gc2VlIGlmIHRoaXMgcmVhbGx5IGhhcHBlbnMuCi0jCi0jIFZpY3RvcmlhIHdpbGwgZm9sbG93aW5nIE5TVy4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbG9jYWwvbmV3cy9vbHltcGljcy8xOTk5LzA3L2l0ZW0xOTk5MDcyODExMjMxNF8xLmh0bSI+Ci0jIFZpYyB0byBleHRlbmQgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4gKDE5OTktMDctMjgpLgotIwotIyBIb3dldmVyLCBTb3V0aCBBdXN0cmFsaWEgcmVqZWN0ZWQgdGhlIERTVCByZXF1ZXN0LiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDcvaXRlbTE5OTkwNzE5MTUxNzU0XzEuaHRtIj4KLSMgU291dGggQXVzdHJhbGlhIHJlamVjdHMgT2x5bXBpY3MgZGF5bGlnaHQgc2F2aW5ncyByZXF1ZXN0Ci0jIDwvYT4gKDE5OTktMDctMTkpLgotIwotIyBRdWVlbnNsYW5kIGFsc28gd2lsbCBub3Qgb2JzZXJ2ZSBEU1QgZm9yIHRoZSBPbHltcGljcy4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9vbHltcGljcy8xOTk5LzA2L2l0ZW0xOTk5MDYwMTExNDYwOF8xLmh0bSI+Ci0jIFFsZCBzYXlzIG5vIHRvIGRheWxpZ2h0IHNhdmluZ3MgZm9yIE9seW1waWNzCi0jIDwvYT4gKDE5OTktMDYtMDEpLCB3aGljaCBxdW90ZXMgUXVlZW5zbGFuZCBQcmVtaWVyIFBldGVyIEJlYXR0aWUgYXMgc2F5aW5nCi0jIGBgTG9vayB5b3UndmUgZ290IHRvIHJlbWVtYmVyIGluIG15IGZhbWlseSB3aGVuIHRoaXMgY2FtZSB1cCBsYXN0IHRpbWUKLSMgSSB2b3RlZCBmb3IgaXQsIG15IHdpZmUgdm90ZWQgYWdhaW5zdCBpdCBhbmQgc2hlIHNhaWQgdG8gbWUgaXQncyBhbGwgdmVyeQotIyB3ZWxsIGZvciB5b3UsIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGdldHRpbmcgdGhlIGNoaWxkcmVuIG91dCBvZgotIyBiZWQsIGdldHRpbmcgdGhlbSB0byBzY2hvb2wsIGdldHRpbmcgdGhlbSB0byBzbGVlcCBhdCBuaWdodC4KLSMgSSd2ZSBiZWVuIHRocm91Z2ggYWxsIHRoaXMgYXJndW1lbnQgZG9tZXN0aWNhbGx5Li4ubXkgd2lmZSBydWxlcy4nJwotIwotIyBCcm9rZW4gSGlsbCB3aWxsIHN0aWNrIHdpdGggU291dGggQXVzdHJhbGlhbiB0aW1lIGluIDIwMDAuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3MvcmVnaW9uYWxzL2Jyb2tlbmgvbW9udGhseS9yZWdicm9rLTIxanVsMTk5OS02Lmh0bSI+Ci0jIEJyb2tlbiBIaWxsIHRvIGJlIGJlaGluZCB0aGUgdGltZXMKLSMgPC9hPiAoMTk5OS0wNy0yMSkuCi0KLSMgSUFUQSBTU0lNICgxOTk4LTA5KSBzYXlzIHRoYXQgdGhlIHNwcmluZyAyMDAwIGNoYW5nZSBmb3IgQXVzdHJhbGlhbgotIyBDYXBpdGFsIFRlcnJpdG9yeSwgTmV3IFNvdXRoIFdhbGVzIGV4Y2VwdCBMb3JkIEhvd2UgSXNsYW5kIGFuZCBCcm9rZW4KLSMgSGlsbCwgYW5kIFZpY3RvcmlhIHdpbGwgYmUgQXVndXN0IDI3LCBwcmVzdW1hYmx5IGR1ZSB0byB0aGUgU3lkbmV5IE9seW1waWNzLgotCi0jIEZyb20gRXJpYyBVbGV2aWssIHJlZmVycmluZyB0byBTeWRuZXkncyBTdW4gSGVyYWxkICgyMDAwLTA4LTEzKSwgcGFnZSAyOToKLSMgVGhlIFF1ZWVuc2xhbmQgUHJlbWllciBQZXRlciBCZWF0dGllIGlzIGVuY291cmFnaW5nIG5vcnRoZXJuIE5TVwotIyB0b3ducyB0byB1c2UgUXVlZW5zbGFuZCB0aW1lLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KLQotIyBZYW5jb3dpbm5hCi0KLSMgRnJvbSBKb2huIE1hY2tpbiAoMTk4OS0wMS0wNCk6Ci0jIGBCcm9rZW4gSGlsbCcgbWVhbnMgdGhlIENvdW50eSBvZiBZYW5jb3dpbm5hLgotCi0jIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgWUFOQ09XSU5OQS4uICBbIENvbmZpcm1hdGlvbiBjb3VydGVzeSBvZiBCcm9rZW4gSGlsbCBQb3N0bWFzdGVyIF0KLSMgIwkJCQkJWyBEZWMgMTk5MCBdCi0jIC4uLgotIyAjIFlhbmNvd2lubmEgdXNlcyBDZW50cmFsIFN0YW5kYXJkIFRpbWUsIGRlc3BpdGUgW2l0c10gbG9jYXRpb24gb24gdGhlCi0jICMgTmV3IFNvdXRoIFdhbGVzIHNpZGUgb2YgdGhlIFMuQS4gYm9yZGVyLiBNb3N0IGJ1c2luZXNzIGFuZCBzb2NpYWwgZGVhbGluZ3MKLSMgIyBhcmUgd2l0aCBDU1Qgem9uZXMsIHRoZXJlZm9yZSBDU1QgaXMgbGVnaXNsYXRlZCBieSBsb2NhbCBnb3Zlcm5tZW50Ci0jICMgYWx0aG91Z2ggdGhlIHN3aXRjaCB0byBTdW1tZXIgVGltZSBvY2N1cnMgaW4gbGluZSB3aXRoIE4uUy5XLiBUaGVyZSBoYXZlCi0jICMgYmVlbiB5ZWFycyB3aGVuIHRoaXMgZGlkIG5vdCBhcHBseSwgYnV0IHRoZSBoaXN0b3JpY2FsIGRhdGEgaXMgbm90Ci0jICMgcHJlc2VudGx5IGF2YWlsYWJsZS4KLSMgWm9uZQlBdXN0cmFsaWEvWWFuY293aW5uYQk5OjMwCSBBWQklc1NUCi0jIC4uLgotIyBSdWxlCSBBWQkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBSdWxlCSBBWQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkzOjAwCTAJQwotIyBbZm9sbG93ZWQgYnkgb3RoZXIgUnVsZXNdCi0KLSMgTG9yZCBIb3dlIElzbGFuZAotCi0jIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jIExISS4uLgkJWyBDb3VydGVzeSBvZiBQYXVsaW5lIFZhbiBXaW5zZW4gXQotIwkJCQkJWyBEZWMgMTk5MCBdCi0jIExvcmQgSG93ZSBJc2xhbmQgaXMgbG9jYXRlZCBvZmYgdGhlIE5ldyBTb3V0aCBXYWxlcyBjb2FzdCwgYW5kIGlzIGhhbGYgYW4KLSMgaG91ciBhaGVhZCBvZiBOU1cgdGltZS4KLQotIyBGcm9tIEphbWVzIExvbmVyZ2FuLCBTZWNyZXRhcnksIExvcmQgSG93ZSBJc2xhbmQgQm9hcmQgKDIwMDAtMDEtMjcpOgotIyBMb3JkIEhvd2UgSXNsYW5kIHN1bW1lciB0aW1lIGluIDIwMDAvMjAwMSB3aWxsIGNvbW1lbmNlIG9uIHRoZSBzYW1lCi0jIGRhdGUgYXMgdGhlIHJlc3Qgb2YgTlNXIChpLmUuIDIwMDAtMDgtMjcpLiAgRm9yIHlvdXIgaW5mb3JtYXRpb24gdGhlCi0jIExvcmQgSG93ZSBJc2xhbmQgQm9hcmQgKGNvbnRyb2xsaW5nIGF1dGhvcml0eSBmb3IgdGhlIElzbGFuZCkgaXMKLSMgc2Vla2luZyB0aGUgY29tbXVuaXR5J3Mgdmlld3Mgb24gdmFyaW91cyBvcHRpb25zIGZvciBzdW1tZXIgdGltZQotIyBhcnJhbmdlbWVudHMgb24gdGhlIElzbGFuZCwgZS5nLiBhZHZhbmNlIGNsb2NrcyBieSAxIGZ1bGwgaG91cgotIyBpbnN0ZWFkIG9mIG9ubHkgMzAgbWludXRlcy4gIERlcGVuZGFudCBvbiB0aGUgd2lzaGVzIG9mIHJlc2lkZW50cwotIyB0aGUgQm9hcmQgbWF5IGFwcHJvYWNoIHRoZSBOU1cgZ292ZXJubWVudCB0byBjaGFuZ2UgdGhlIGV4aXN0aW5nCi0jIGFycmFuZ2VtZW50cy4gIFRoZSBzdGFydGluZyBkYXRlIGZvciBzdW1tZXIgdGltZSBvbiB0aGUgSXNsYW5kIHdpbGwKLSMgaG93ZXZlciBhbHdheXMgY29pbmNpZGUgd2l0aCB0aGUgcmVzdCBvZiBOU1cuCi0KLSMgRnJvbSBKYW1lcyBMb25lcmdhbiwgU2VjcmV0YXJ5LCBMb3JkIEhvd2UgSXNsYW5kIEJvYXJkICgyMDAwLTEwLTI1KToKLSMgTG9yZCBIb3dlIElzbGFuZCBhZHZhbmNlcyBjbG9ja3MgYnkgMzAgbWludXRlcyBkdXJpbmcgRFNUIGluIE5TVyBhbmQgcmV0YXJkcwotIyBjbG9ja3MgYnkgMzAgbWludXRlcyB3aGVuIERTVCBmaW5pc2hlcy4gU2luY2UgRFNUIHdhcyBtb3N0IHJlY2VudGx5Ci0jIGludHJvZHVjZWQgaW4gTlNXLCB0aGUgImNoYW5nZW92ZXIiIHRpbWUgb24gdGhlIElzbGFuZCBoYXMgYmVlbiAwMjowMCBhcwotIyBzaG93biBvbiBjbG9ja3Mgb24gTEhJLiBJIGd1ZXNzIHRoaXMgbWVhbnMgdGhhdCBmb3IgMzAgbWludXRlcyBhdCB0aGUgc3RhcnQKLSMgb2YgRFNULCBMSEkgaXMgYWN0dWFsbHkgMSBob3VyIGFoZWFkIG9mIHRoZSByZXN0IG9mIE5TVy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgRm9yIExvcmQgSG93ZSBkYXRlcyB3ZSB1c2UgU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk4OSwgYW5kCi0jIExvbmVyZ2FuIHRoZXJlYWZ0ZXIuICBGb3IgdGltZXMgd2UgdXNlIExvbmVyZ2FuLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5ldyBaZWFsYW5kCi0KLSMgRnJvbSBNYXJrIERhdmllcyAoMTk5MC0xMC0wMyk6Ci0jIHRoZSAxOTg5LzkwIHllYXIgd2FzIGEgdHJpYWwgb2YgYW4gZXh0ZW5kZWQgImRheWxpZ2h0IHNhdmluZyIgcGVyaW9kLgotIyBUaGlzIHRyaWFsIHdhcyBkZWVtZWQgc3VjY2Vzc2Z1bCBhbmQgdGhlIGV4dGVuZGVkIHBlcmlvZCBhZG9wdGVkIGZvcgotIyBzdWJzZXF1ZW50IHllYXJzICh3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIGZ1cnRoZXIgd2VlayBhdCB0aGUgc3RhcnQpLgotIyBzb3VyY2UgLS0gcGhvbmUgY2FsbCB0byBNaW5pc3RyeSBvZiBJbnRlcm5hbCBBZmZhaXJzIEhlYWQgT2ZmaWNlLgotCi0jIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgVGhlIENvdW50cnkgb2YgTmV3IFplYWxhbmQgICAoQXVzdHJhbGlhJ3MgZWFzdCBpc2xhbmQgLSkgR2VlIHRoZXkgaGF0ZSB0aGF0IQotIyAjCQkJCSAgIG9yIGlzIEF1c3RyYWxpYSB0aGUgd2VzdCBpc2xhbmQgb2YgTi5aLgotIyAjCVsgY291cnRlc3kgb2YgR2VvZmYgVHJpYmJsZS4uIEF1Y2tsYW5kIE4uWi4gXQotIyAjCQkJCVsgTm92IDE5OTAgXQotIyAuLi4KLSMgUnVsZQlOWiAgICAgIDE5NzQgICAgMTk4OAktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJTloJMTk4OQltYXgJLQlPY3QJU3VuPj0xCTI6MDAJMTowMAlECi0jIFJ1bGUJTlogICAgICAxOTc1ICAgIDE5ODkJLQlNYXIJU3VuPj0xCTM6MDAJMAlTCi0jIFJ1bGUJTloJMTk5MAltYXgJLQlNYXIJbGFzdFN1bgkzOjAwCTAJUwotIyAuLi4KLSMgWm9uZQlOWgkJCTEyOjAwCU5aCQlOWiVzVAkjIE5ldyBaZWFsYW5kCi0jIFpvbmUJTlotQ0hBVAkJCTEyOjQ1CS0JCU5aLUNIQVQgIyBDaGF0aGFtIElzbGFuZAotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTkyLTAzLTA4KToKLSMgVGhlIGNob3NlbiBydWxlcyB1c2UgdGhlIERhdmllcyBPY3RvYmVyIDggdmFsdWVzIGZvciB0aGUgc3RhcnQgb2YgRFNUIGluIDE5ODkKLSMgcmF0aGVyIHRoYW4gdGhlIE9jdG9iZXIgMSB2YWx1ZS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTEyLTE5KTsKLSMgU2hhbmsgJiBQb3R0ZW5nZXIgcmVwb3J0IDI6MDAgZm9yIGFsbCBhdXR1bW4gY2hhbmdlcyBpbiBBdXN0cmFsaWEgYW5kIE5aLgotIyBSb2JlcnQgVXpnYWxpcyB3cml0ZXMgdGhhdCB0aGUgTmV3IFplYWxhbmQgRGF5bGlnaHQKLSMgU2F2aW5ncyBUaW1lIE9yZGVyIGluIENvdW5jaWwgZGF0ZWQgMTk5MC0wNi0xOCBzcGVjaWZpZXMgMjowMCBzdGFuZGFyZAotIyB0aW1lIG9uIGJvdGggdGhlIGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyIGFuZCB0aGUgdGhpcmQgU3VuZGF5IGluIE1hcmNoLgotIyBBcyB3aXRoIEF1c3RyYWxpYSwgd2UnbGwgYXNzdW1lIHRoZSB0cmFkaXRpb24gaXMgMjowMHMsIG5vdCAyOjAwLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIERlcGFydG1lbnQgb2YgSW50ZXJuYWwgQWZmYWlycyAoRElBKSBtYWludGFpbnMgYSBicmllZiBoaXN0b3J5LAotIyBhcyBkb2VzIENhcm9sIFNxdWlyZXM7IHNlZSB0ei1saW5rLmh0bSBmb3IgdGhlIGZ1bGwgcmVmZXJlbmNlcy4KLSMgVXNlIHRoZXNlIHNvdXJjZXMgaW4gcHJlZmVyZW5jZSB0byBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jCi0jIEZvciBDaGF0aGFtLCBJQVRBIFNTSU0gKDE5OTEvMTk5OSkgZ2l2ZXMgdGhlIE5aIHJ1bGVzIGJ1dCB3aXRoCi0jIHRyYW5zaXRpb25zIGF0IDI6NDUgbG9jYWwgc3RhbmRhcmQgdGltZTsgdGhpcyBjb25maXJtcyB0aGF0IENoYXRoYW0KLSMgaXMgYWx3YXlzIGV4YWN0bHkgNDUgbWludXRlcyBhaGVhZCBvZiBBdWNrbGFuZC4KLQotIyBGcm9tIENvbGluIFNoYXJwbGVzICgyMDA3LTA0LTMwKToKLSMgRFNUIHdpbGwgbm93IHN0YXJ0IG9uIHRoZSBsYXN0IFN1bmRheSBpbiBTZXB0ZW1iZXIsIGFuZCBlbmQgb24gdGhlCi0jIGZpcnN0IFN1bmRheSBpbiBBcHJpbC4gIFRoZSBjaGFuZ2VzIHRha2UgZWZmZWN0IHRoaXMgeWVhciwgbWVhbmluZwotIyB0aGF0IERTVCB3aWxsIGJlZ2luIG9uIDIwMDctMDktMzAgMjAwOC0wNC0wNi4KLSMgaHR0cDovL3d3dy5kaWEuZ292dC5uei9kaWF3ZWJzaXRlLm5zZi93cGdfVVJML1NlcnZpY2VzLURheWxpZ2h0LVNhdmluZy1EYXlsaWdodC1zYXZpbmctdG8tYmUtZXh0ZW5kZWQKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgRmlqaQotCi0jIEhvd3NlIHdyaXRlcyAocCAxNTMpIHRoYXQgaW4gMTg3OSB0aGUgQnJpdGlzaCBnb3Zlcm5vciBvZiBGaWppCi0jIGVuYWN0ZWQgYW4gb3JkaW5hbmNlIHN0YW5kYXJkaXppbmcgdGhlIGlzbGFuZHMgb24gQW50aXBvZGVhbiBUaW1lCi0jIGluc3RlYWQgb2YgdGhlIEFtZXJpY2FuIHN5c3RlbSAod2hpY2ggd2FzIG9uZSBkYXkgYmVoaW5kKS4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk4LTEwLTA4KToKLSMgRmlqaSB3aWxsIGludHJvZHVjZSBEU1QgZWZmZWN0aXZlIDAyMDAgbG9jYWwgdGltZSwgMTk5OC0xMS0wMQotIyB1bnRpbCAwMzAwIGxvY2FsIHRpbWUgMTk5OS0wMi0yOC4gIEVhY2ggeWVhciB0aGUgRFNUIHBlcmlvZCB3aWxsCi0jIGJlIGZyb20gdGhlIGZpcnN0IFN1bmRheSBpbiBOb3ZlbWJlciB1bnRpbCB0aGUgbGFzdCBTdW5kYXkgaW4gRmVicnVhcnkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0wMS0wOCk6Ci0jIElBVEEgU1NJTSAoMTk5OS0wOSkgc2F5cyBEU1QgZW5kcyAwMTAwIGxvY2FsIHRpbWUuICBHbyB3aXRoIE1jRG93LgotCi0jIEZyb20gdGhlIEJCQyBXb3JsZCBTZXJ2aWNlICgxOTk4LTEwLTMxIDExOjMyIFVUQyk6Ci0jIFRoZSBGaWppaWFuIGdvdmVybm1lbnQgc2F5cyB0aGUgbWFpbiByZWFzb25zIGZvciB0aGUgdGltZSBjaGFuZ2UgaXMgdG8KLSMgaW1wcm92ZSBwcm9kdWN0aXZpdHkgYW5kIHJlZHVjZSByb2FkIGFjY2lkZW50cy4gIEJ1dCBjb3JyZXNwb25kZW50cyBzYXkgaXQKLSMgYWxzbyBob3BlcyB0aGUgbW92ZSB3aWxsIGJvb3N0IEZpamkncyBhYmlsaXR5IHRvIGNvbXBldGUgd2l0aCBvdGhlciBwYWNpZmljCi0jIGlzbGFuZHMgaW4gdGhlIGVmZm9ydCB0byBhdHRyYWN0IHRvdXJpc3RzIHRvIHdpdG5lc3MgdGhlIGRhd25pbmcgb2YgdGhlIG5ldwotIyBtaWxsZW5pdW0uCi0KLSMgaHR0cDovL3d3dy5maWppLmdvdi5mai9wcmVzcy8yMDAwXzA5LzIwMDBfMDlfMTMtMDUuc2h0bWwgKDIwMDAtMDktMTMpCi0jIHJlcG9ydHMgdGhhdCBGaWppIGhhcyBkaXNjb250aW51ZWQgRFNULgotCi0jIEpvaG5zdG9uCi0KLSMgSm9obnN0b24gZGF0YSBpcyBmcm9tIHVzbm8xOTk1LgotCi0KLSMgS2lyaWJhdGkKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTAxLTIyKToKLSMgVG9kYXkncyBfV2FsbCBTdHJlZXQgSm91cm5hbF8gKHBhZ2UgMSkgcmVwb3J0cyB0aGF0IEtpcmliYXRpCi0jIGBgZGVjbGFyZWQgaXQgdGhlIHNhbWUgZGF5IHRocm91Z2h0IHRoZSBjb3VudHJ5IGFzIG9mIEphbi4gMSwgMTk5NScnCi0jIGFzIHBhcnQgb2YgdGhlIGNvbXBldGl0aW9uIHRvIGJlIGZpcnN0IGludG8gdGhlIDIxc3QgY2VudHVyeS4KLQotCi0jIEt3YWphbGVpbgotCi0jIEluIGNvbXAucmlza3MgMTQuODcgKDI2IEF1Z3VzdCAxOTkzKSwgUGV0ZXIgTmV1bWFubiB3cml0ZXM6Ci0jIEkgd29uZGVyIHdoYXQgaGFwcGVuZWQgaW4gS3dhamFsZWluLCB3aGVyZSB0aGVyZSB3YXMgTk8gRnJpZGF5LAotIyAxOTkzLTA4LTIwLiAgVGh1cnNkYXkgbmlnaHQgYXQgbWlkbmlnaHQgS3dhamFsZWluIHN3aXRjaGVkIHNpZGVzIHdpdGgKLSMgcmVzcGVjdCB0byB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIHRvIHJlam9pbiBpdHMgZmVsbG93IGlzbGFuZHMsCi0jIGdvaW5nIGZyb20gMTE6NTkgcC5tLiBUaHVyc2RheSB0byAxMjowMCBtLiBTYXR1cmRheSBpbiBhIGJsaW5rLgotCi0KLSMgTiBNYXJpYW5hIElzLCBHdWFtCi0KLSMgSG93c2Ugd3JpdGVzIChwIDE1MykgYGBUaGUgU3BhbmlhcmRzLCBvbiB0aGUgb3RoZXIgaGFuZCwgcmVhY2hlZCB0aGUKLSMgUGhpbGlwcGluZXMgYW5kIHRoZSBMYWRyb25lcyBmcm9tIEFtZXJpY2EsJycgYW5kIGltcGxpZXMgdGhhdCB0aGUgTGFkcm9uZXMKLSMgKG5vdyBjYWxsZWQgdGhlIE1hcmlhbmFzKSBrZXB0IEFtZXJpY2FuIGRhdGUgZm9yIHF1aXRlIHNvbWUgdGltZS4KLSMgRm9yIG5vdywgd2UgYXNzdW1lIHRoZSBMYWRyb25lcyBzd2l0Y2hlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBQaGlsaXBwaW5lczsKLSMgc2VlIEFzaWEvTWFuaWxhLgotCi0jIFVTIFB1YmxpYyBMYXcgMTA2LTU2NCAoMjAwMC0xMi0yMykgbWFkZSBVVEMrMTAgdGhlIG9mZmljaWFsIHN0YW5kYXJkIHRpbWUsCi0jIHVuZGVyIHRoZSBuYW1lICJDaGFtb3JybyBTdGFuZGFyZCBUaW1lIi4gIFRoZXJlIGlzIG5vIG9mZmljaWFsIGFiYnJldmlhdGlvbiwKLSMgYnV0IENvbmdyZXNzbWFuIFJvYmVydCBBLiBVbmRlcndvb2QsIGF1dGhvciBvZiB0aGUgYmlsbCB0aGF0IGJlY2FtZSBsYXcsCi0jIHdyb3RlIGluIGEgcHJlc3MgcmVsZWFzZSAoMjAwMC0xMi0yNykgdGhhdCBoZSB3aWxsIHNlZWsgdGhlIHVzZSBvZiAiQ2hTVCIuCi0KLQotIyBNaWNyb25lc2lhCi0KLSMgQWxhbiBFdWdlbmUgRGF2aXMgd3JpdGVzICgxOTk2LTAzLTE2KSwKLSMgYGBJIGFtIGNlcnRhaW4sIGhhdmluZyBsaXZlZCB0aGVyZSBmb3IgdGhlIHBhc3QgZGVjYWRlLCB0aGF0ICJUcnVrIgotIyAobm93IHByb3Blcmx5IGtub3duIGFzIENodXVrKSAuLi4gaXMgaW4gdGhlIHRpbWUgem9uZSBHTVQrMTAuJycKLSMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgVHJ1ayBzd2l0Y2hlZCBmcm9tIFVUQysxMCB0byBVVEMrMTEKLSMgb24gMTk3OC0xMC0wMTsgaWdub3JlIHRoaXMgZm9yIG5vdy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTI5KToKLSMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSBWaXNpdG9ycyBCb2FyZCB3cml0ZXMgaW4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5mc21nb3Yub3JnL2luZm8vY2xvY2tzLmh0bWwiPgotIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIC0gVmlzaXRvciBJbmZvcm1hdGlvbgotIyA8L2E+ICgxOTk5LTAxLTI2KQotIyB0aGF0IFRydWsgYW5kIFlhcCBhcmUgVVRDKzEwLCBhbmQgUG9uYXBlIGFuZCBLb3NyYWUgYXJlIFVUQysxMS4KLSMgV2UgZG9uJ3Qga25vdyB3aGVuIEtvc3JhZSBzd2l0Y2hlZCBmcm9tIFVUQysxMjsgYXNzdW1lIEphbnVhcnkgMSBmb3Igbm93LgotCi0KLSMgTWlkd2F5Ci0KLSMgRnJvbSBDaGFybGVzIFQgTydDb25ub3IsIEtNVEggREogKDE5NTYpLAotIyBxdW90ZWQgaW4gdGhlIEtUTUggc2VjdGlvbiBvZiB0aGUgUmFkaW8gSGVyaXRhZ2UgQ29sbGVjdGlvbgotIyA8aHR0cDovL3JhZGlvZHguY29tL3NwZHhyL0tNVEguaHRtPiAoMjAwMi0xMi0zMSk6Ci0jIEZvciB0aGUgcGFzdCB0d28gbW9udGhzIHdlJ3ZlIGJlZW4gb24gd2hhdCBpcyBrbm93biBhcyBEYXlsaWdodAotIyBTYXZpbmcgVGltZS4gIFRoaXMgdGltZSBoYXMgcHV0IHVzIG9uIGFpciBhdCA1YW0gaW4gdGhlIG1vcm5pbmcsCi0jIHlvdXIgdGltZSBkb3duIHRoZXJlIGluIE5ldyBaZWFsYW5kLiAgU3RhcnRpbmcgU2VwdGVtYmVyIDIsIDE5NTYKLSMgd2UnbGwgYWdhaW4gZ28gYmFjayB0byBTdGFuZGFyZCBUaW1lLiAgVGhpcydsbCBtZWFuIHRoYXQgd2UnbGwgZ28gdG8KLSMgYWlyIGF0IDZhbSB5b3VyIHRpbWUuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDMtMjMpOgotIyBXZSBkb24ndCBrbm93IHRoZSBkYXRlIG9mIHRoYXQgcXVvdGUsIGJ1dCB3ZSdsbCBndWVzcyB0aGV5Ci0jIHN0YXJ0ZWQgRFNUIG9uIEp1bmUgMy4gIFBvc3NpYmx5IERTVCB3YXMgb2JzZXJ2ZWQgb3RoZXIgeWVhcnMKLSMgaW4gTWlkd2F5LCBidXQgd2UgaGF2ZSBubyByZWNvcmQgb2YgaXQuCi0KLQotIyBQaXRjYWlybgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDgpOgotIyBBIFByb2NsYW1hdGlvbiB3YXMgc2lnbmVkIGJ5IHRoZSBHb3Zlcm5vciBvZiBQaXRjYWlybiBvbiB0aGUgMjd0aCBNYXJjaCAxOTk4Ci0jIHdpdGggcmVnYXJkIHRvIFBpdGNhaXJuIFN0YW5kYXJkIFRpbWUuICBUaGUgUHJvY2xhbWF0aW9uIGlzIGFzIGZvbGxvd3MuCi0jCi0jCVRoZSBsb2NhbCB0aW1lIGZvciBnZW5lcmFsIHB1cnBvc2VzIGluIHRoZSBJc2xhbmRzIHNoYWxsIGJlCi0jCUNvLW9yZGluYXRlZCBVbml2ZXJzYWwgdGltZSBtaW51cyA4IGhvdXJzIGFuZCBzaGFsbCBiZSBrbm93bgotIwlhcyBQaXRjYWlybiBTdGFuZGFyZCBUaW1lLgotIwotIyAuLi4gSSBoYXZlIGFsc28gc2VlbiBQaXRjYWlybiBsaXN0ZWQgYXMgVVRDIG1pbnVzIDkgaG91cnMgaW4gc2V2ZXJhbAotIyByZWZlcmVuY2VzLCBhbmQgY2FuIG9ubHkgYXNzdW1lIHRoYXQgdGhpcyB3YXMgYW4gZXJyb3IgaW4gaW50ZXJwcmV0YXRpb24KLSMgc29tZWhvdyBpbiBsaWdodCBvZiB0aGlzIHByb2NsYW1hdGlvbi4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTExLTA5KToKLSMgVGhlIFByb2NsYW1hdGlvbiByZWdhcmRpbmcgUGl0Y2Fpcm4gdGltZSBjYW1lIGludG8gZWZmZWN0IG9uIDI3IEFwcmlsIDE5OTgKLSMgLi4uIGF0IG1pZG5pZ2h0LgotCi0jIEZyb20gSG93aWUgUGhlbHBzICgxOTk5LTExLTEwKSwgd2hvIHRhbGtlZCB0byBhIFBpdGNhaXJuZXIgdmlhIHNob3J0d2F2ZToKLSMgQmV0dHkgQ2hyaXN0aWFuIHRvbGQgbWUgeWVzdGVyZGF5IHRoYXQgdGhlaXIgbG9jYWwgdGltZSBpcyB0aGUgc2FtZSBhcwotIyBQYWNpZmljIFN0YW5kYXJkIFRpbWUuIFRoZXkgdXNlZCB0byBiZSAxLzIgaG91ciBkaWZmZXJlbnQgZnJvbSB1cyBoZXJlIGluCi0jIFNhY3JhbWVudG8gYnV0IGl0IHdhcyBjaGFuZ2VkIGEgY291cGxlIG9mIHllYXJzIGFnby4KLQotCi0jIFNhbW9hCi0KLSMgSG93c2Ugd3JpdGVzIChwIDE1MywgY2l0aW5nIHAgMTAgb2YgdGhlIDE4ODMtMTEtMTggTmV3IFlvcmsgSGVyYWxkKQotIyB0aGF0IGluIDE4NzkgdGhlIEtpbmcgb2YgU2Ftb2EgZGVjaWRlZCB0byBjaGFuZ2UKLSMgYGB0aGUgZGF0ZSBpbiBoaXMga2luZ2RvbSBmcm9tIHRoZSBBbnRpcG9kZWFuIHRvIHRoZSBBbWVyaWNhbiBzeXN0ZW0sCi0jIG9yZGFpbmluZyAtLSBieSBhIG1hc3RlcnBpZWNlIG9mIGRpcGxvbWF0aWMgZmxhdHRlcnkgLS0gdGhhdAotIyB0aGUgRm91cnRoIG9mIEp1bHkgc2hvdWxkIGJlIGNlbGVicmF0ZWQgdHdpY2UgaW4gdGhhdCB5ZWFyLicnCi0KLQotIyBUb25nYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDEtMjIpOgotIyBUb2RheSdzIF9XYWxsIFN0cmVldCBKb3VybmFsXyAocCAxKSByZXBvcnRzIHRoYXQgYGBUb25nYSBoYXMgYmVlbiBwbG90dGluZwotIyB0byBzbmVhayBhaGVhZCBvZiBbTmV3IFplYWxhbmRlcnNdIGJ5IGludHJvZHVjaW5nIGRheWxpZ2h0LXNhdmluZyB0aW1lLicnCi0jIFNpbmNlIEtpcmliYXRpIGhhcyBtb3ZlZCB0aGUgRGF0ZSBMaW5lIGl0J3Mgbm90IGNsZWFyIHdoYXQgVG9uZ2Egd2lsbCBkby4KLQotIyBEb24gTXVuZGVsbCB3cml0ZXMgaW4gdGhlIDE5OTctMDItMjAgVG9uZ2EgQ2hyb25pY2xlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudG9uZ2F0YXB1Lm5ldC50by90b25nYS9ob21lbGFuZC90aW1lYmVnaW5zLmh0bSI+Ci0jIEhvdyBUb25nYSBiZWNhbWUgYFRoZSBMYW5kIHdoZXJlIFRpbWUgQmVnaW5zJwotIyA8L2E+OgotCi0jIFVudGlsIDE5NDEgVG9uZ2EgbWFpbnRhaW5lZCBhIHN0YW5kYXJkIHRpbWUgNTAgbWludXRlcyBhaGVhZCBvZiBOWlNUCi0jIDEyIGhvdXJzIGFuZCAyMCBtaW51dGVzIGFoZWFkIG9mIEdNVC4gIFdoZW4gTmV3IFplYWxhbmQgYWRqdXN0ZWQgaXRzCi0jIHN0YW5kYXJkIHRpbWUgaW4gMTk0MHMsIFRvbmdhIGhhZCB0aGUgY2hvaWNlIG9mIHN1YnRyYWN0aW5nIGZyb20gaXRzCi0jIGxvY2FsIHRpbWUgdG8gY29tZSBvbiB0aGUgc2FtZSBzdGFuZGFyZCB0aW1lIGFzIE5ldyBaZWFsYW5kIG9yIG9mCi0jIGFkdmFuY2luZyBpdHMgdGltZSB0byBtYWludGFpbiB0aGUgZGlmZmVyZW50aWFsIG9mIDEzIGRlZ3JlZXMKLSMgKGFwcHJveGltYXRlbHkgNTAgbWludXRlcyBhaGVhZCBvZiBOZXcgWmVhbGFuZCB0aW1lKS4KLSMKLSMgQmVjYXVzZSBIaXMgTWFqZXN0eSBLaW5nIFRhdWZhJ2FoYXUgVHVwb3UgSVYsIHRoZW4gQ3Jvd24gUHJpbmNlCi0jIFR1bmdpLCBwcmVmZXJyZWQgdG8gZW5zdXJlIFRvbmdhJ3MgdGl0bGUgYXMgdGhlIGxhbmQgd2hlcmUgdGltZQotIyBiZWdpbnMsIHRoZSBMZWdpc2xhdGl2ZSBBc3NlbWJseSBhcHByb3ZlZCB0aGUgbGF0dGVyIGNoYW5nZS4KLSMKLSMgQnV0IHNvbWUgb2YgdGhlIG9sZGVyLCBtb3JlIGNvbnNlcnZhdGl2ZSBtZW1iZXJzIGZyb20gdGhlIG91dGVyCi0jIGlzbGFuZHMgb2JqZWN0ZWQuICJJZiBhdCBtaWRuaWdodCBvbiBEZWMuIDMxLCB3ZSBtb3ZlIGFoZWFkIDQwCi0jIG1pbnV0ZXMsIGFzIHlvdXIgUm95YWwgSGlnaG5lc3Mgd2lzaGVzLCB3aGF0IGJlY29tZXMgb2YgdGhlIDQwCi0jIG1pbnV0ZXMgd2UgaGF2ZSBsb3N0PyIKLSMKLSMgVGhlIENyb3duIFByaW5jZSwgcHJlc2VudGVkIGFuIHVuYW5zd2VyYWJsZSBhcmd1bWVudDogIlJlbWVtYmVyIHRoYXQKLSMgb24gdGhlIFdvcmxkIERheSBvZiBQcmF5ZXIsIHlvdSB3b3VsZCBiZSB0aGUgZmlyc3QgcGVvcGxlIG9uIEVhcnRoCi0jIHRvIHNheSB5b3VyIHByYXllcnMgaW4gdGhlIG1vcm5pbmcuIgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZSB0cmFuc2l0aW9uIHdhcyBvbiAxOTY4LTEwLTAxOyBnbyB3aXRoIE11bmRlbGwuCi0KLSMgRnJvbSBFcmljIFVsZXZpayAoMTk5OS0wNS0wMyk6Ci0jIFRvbmdhJ3MgZGlyZWN0b3Igb2YgdG91cmlzbSwgd2hvIGlzIGFsc28gc2VjcmV0YXJ5IG9mIHRoZSBOYXRpb25hbCBNaWxsZW5pdW0KLSMgQ29tbWl0dGVlLCBoYXMgYSBwbGFuIHRvIGdldCBUb25nYSBiYWNrIGluIGZyb250LgotIyBIZSBoYXMgcHJvcG9zZWQgYSBvbmUtb2ZmIG1vdmUgdG8gdHJvcGljYWwgZGF5bGlnaHQgc2F2aW5nIGZvciBUb25nYSBmcm9tCi0jIE9jdG9iZXIgdG8gTWFyY2gsIHdoaWNoIGhhcyB3b24gYXBwcm92YWwgaW4gcHJpbmNpcGxlIGZyb20gdGhlIFRvbmdhbgotIyBHb3Zlcm5tZW50LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgxOTk5LTA5LTA5KToKLSMgKiBUb25nYSB3aWxsIGludHJvZHVjZSBEU1QgaW4gTm92ZW1iZXIKLSMKLSMgSSB3YXMgZ2l2ZW4gdGhpcyBsaW5rIGJ5IEpvaG4gTGV0dHM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9uZXdzLmJiYy5jby51ay9oaS9lbmdsaXNoL3dvcmxkL2FzaWEtcGFjaWZpYy9uZXdzaWRfNDI0MDAwLzQyNDc2NC5zdG0iPgotIyBodHRwOi8vbmV3cy5iYmMuY28udWsvaGkvZW5nbGlzaC93b3JsZC9hc2lhLXBhY2lmaWMvbmV3c2lkXzQyNDAwMC80MjQ3NjQuc3RtCi0jIDwvYT4KLSMKLSMgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gZmluZCBleGFjdCBkYXRlcyBmb3IgdGhlIHRyYW5zaXRpb24gaW4gTm92ZW1iZXIKLSMgeWV0LiBCeSByZWFkaW5nIHRoaXMgYXJ0aWNsZSBpdCBzZWVtcyBsaWtlIEZpamkgd2lsbCBiZSAxNCBob3VycyBhaGVhZAotIyBvZiBVVEMgYXMgd2VsbCwgYnV0IGFzIGZhciBhcyBJIGtub3cgRmlqaSB3aWxsIG9ubHkgYmUgMTMgaG91cnMgYWhlYWQKLSMgKDEyICsgMSBob3VyIERTVCkuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTktMDktMjApOgotIyBBY2NvcmRpbmcgdG8gPGEgaHJlZj0iaHR0cDovL3d3dy50b25nYW9ubGluZS5jb20vbmV3cy9zZXB0MTc5OS5odG1sIj4KLSMgaHR0cDovL3d3dy50b25nYW9ubGluZS5jb20vbmV3cy9zZXB0MTc5OS5odG1sCi0jIDwvYT46Ci0jICJEYXlsaWdodCBTYXZpbmdzIFRpbWUgd2lsbCB0YWtlIGVmZmVjdCBvbiBPY3QuIDIgdGhyb3VnaCBBcHJpbCAxNSwgMjAwMAotIyBhbmQgYW5udWFsbHkgdGhlcmVhZnRlciBmcm9tIHRoZSBmaXJzdCBTYXR1cmRheSBpbiBPY3RvYmVyIHRocm91Z2ggdGhlCi0jIHRoaXJkIFNhdHVyZGF5IG9mIEFwcmlsLiAgVW5kZXIgdGhlIHN5c3RlbSBhcHByb3ZlZCBieSBQcml2eSBDb3VuY2lsIG9uCi0jIFNlcHQuIDEwLCBjbG9ja3MgbXVzdCBiZSB0dXJuZWQgYWhlYWQgb25lIGhvdXIgb24gdGhlIG9wZW5pbmcgZGF5IGFuZAotIyBzZXQgYmFjayBhbiBob3VyIG9uIHRoZSBjbG9zaW5nIGRhdGUuIgotIyBBbGFzLCBubyBpbmRpY2F0aW9uIG9mIHRoZSB0aW1lIG9mIGRheS4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTEwLTA2KToKLSMgVG9uZ2Egc3RhcnRlZCBpdHMgRGF5bGlnaHQgU2F2aW5nIG9uIFNhdHVyZGF5IG1vcm5pbmcgT2N0b2JlciAybmQgYXQgMDIwMGFtLgotIyBEYXlsaWdodCBTYXZpbmcgZW5kcyBvbiBBcHJpbCAxNiBhdCAwMzAwYW0gd2hpY2ggaXMgU3VuZGF5IG1vcm5pbmcuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDAtMTAtMzEpOgotIyBCYWNrIGluIE1hcmNoIEkgZm91bmQgYSBub3RpY2Ugb24gdGhlIHdlYnNpdGUgaHR0cDovL3d3dy50b25nYW9ubGluZS5jb20KLSMgdGhhdCBUb25nYSBjaGFuZ2VkIGJhY2sgdG8gc3RhbmRhcmQgdGltZSBvbmUgbW9udGggZWFybHksIG9uIE1hcmNoIDE5Ci0jIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydGVkIGRhdGUgQXByaWwgMTYuIFVuZm9ydHVuYXRlbHksIHRoZSBhcnRpY2xlCi0jIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgb24gdGhlIHNpdGUsIGFuZCBJIGRpZCBub3QgbWFrZSBhIGNvcHkgb2YgdGhlCi0jIHRleHQsIGFuZCBJIGhhdmUgZm9yZ290dGVuIHRvIHJlcG9ydCBpdCBoZXJlLgotIyAoT3JpZ2luYWwgVVJMIHdhczogaHR0cDovL3d3dy50b25nYW9ubGluZS5jb20vbmV3cy9tYXJjaDE2MjAwMC5odG0gKQotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMTItMDEpOgotIyBUb25nYSBpcyBvYnNlcnZpbmcgRFNUIGFzIG9mIDIwMDAtMTEtMDQgYW5kIHdpbGwgc3RvcCBvbiAyMDAxLTAxLTI3LgotCi0jIEZyb20gU2lvbmUgTW9hbGEtTWFmaSAoMjAwMS0wOS0yMCkgdmlhIFJpdmVzIE1jRG93OgotIyBBdCAyOjAwYW0gb24gdGhlIGZpcnN0IFN1bmRheSBvZiBOb3ZlbWJlciwgdGhlIHN0YW5kYXJkIHRpbWUgaW4gdGhlIEtpbmdkb20KLSMgc2hhbGwgYmUgbW92ZWQgZm9yd2FyZCBieSBvbmUgaG91ciB0byAzOjAwYW0uICBBdCAyOjAwYW0gb24gdGhlIGxhc3QgU3VuZGF5Ci0jIG9mIEphbnVhcnkgdGhlIHN0YW5kYXJkIHRpbWUgaW4gdGhlIEtpbmdkb20gc2hhbGwgYmUgbW92ZWQgYmFja3dhcmQgYnkgb25lCi0jIGhvdXIgdG8gMTowMGFtLgotCi0jIEZyb20gUHVsdSAnQW5hdSAoMjAwMi0xMS0wNSk6Ci0jIFRoZSBsYXcgd2FzIGZvciAzIHllYXJzLCBzdXBwb3NlZGx5IHRvIGdldCByZW5ld2VkLiAgSXQgd2Fzbid0LgotCi0KLSMgV2FrZQotCi0jIEZyb20gVmVybmljZSBBbmRlcnNvbiwgUGVyc29uYWwgU2VjcmV0YXJ5IHRvIFBoaWxpcCBKZXNzdXAsCi0jIFVTIEFtYmFzc2Fkb3IgQXQgTGFyZ2UgKG9yYWwgaGlzdG9yeSBpbnRlcnZpZXcsIDE5NzEtMDItMDIpOgotIwotIyBTYXR1cmRheSwgdGhlIDE0dGggW29mIE9jdG9iZXIsIDE5NTBdIC0tIC4uLiAgVGhlIHRpbWUgd2FzIGFsbCB0aGUKLSMgbW9yZSBjb25mdXNpbmcgYXQgdGhhdCBwb2ludCwgYmVjYXVzZSB3ZSBoYWQgY3Jvc3NlZCB0aGUKLSMgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIHRodXMgZ2V0dGluZyB0d28gU3VuZGF5cy4gIEZ1cnRoZXJtb3JlLCB3ZQotIyBkaXNjb3ZlcmVkIHRoYXQgV2FrZSBJc2xhbmQgaGFkIHR3byBob3VycyBvZiBkYXlsaWdodCBzYXZpbmcgdGltZQotIyBtYWtpbmcgY2FsY3VsYXRpb24gb2YgdGltZSBpbiBXYXNoaW5ndG9uIGRpZmZpY3VsdCBpZiBub3QgYWxtb3N0Ci0jIGltcG9zc2libGUuCi0jCi0jIGh0dHA6Ly93d3cudHJ1bWFubGlicmFyeS5vcmcvd2FrZS9tZWV0aW5nLmh0bQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDMtMjMpOgotIyBXZSBoYXZlIG5vIG90aGVyIHJlcG9ydCBvZiBEU1QgaW4gV2FrZSBJc2xhbmQsIHNvIG9taXQgdGhpcyBpbmZvIGZvciBub3cuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUaGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUKLQotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDAwLTAxLTAzKToKLSMKLSMgVGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIGlzIG5vdCBkZWZpbmVkIGJ5IGFueSBpbnRlcm5hdGlvbmFsIHN0YW5kYXJkLAotIyBjb252ZW50aW9uLCBvciB0cmVhdHkuICBNYXBtYWtlcnMgYXJlIGZyZWUgdG8gZHJhdyBpdCBhcyB0aGV5IHBsZWFzZS4KLSMgUmVwdXRhYmxlIG1hcG1ha2VycyB3aWxsIHNpbXBseSBlbnN1cmUgdGhhdCBldmVyeSBwb2ludCBvZiBsYW5kIGFwcGVhcnMgb24KLSMgdGhlIGNvcnJlY3Qgc2lkZSBvZiB0aGUgSURMLCBhY2NvcmRpbmcgdG8gdGhlIGRhdGUgbGVnYWxseSBvYnNlcnZlZCB0aGVyZS4KLSMKLSMgV2hlbiBLaXJpYmF0aSBhZG9wdGVkIGEgdW5pZm9ybSBkYXRlIGluIDE5OTUsIHRoZXJlYnkgbW92aW5nIHRoZSBQaG9lbml4IGFuZAotIyBMaW5lIElzbGFuZHMgdG8gdGhlIHdlc3Qgc2lkZSBvZiB0aGUgSURMIChvciwgaWYgeW91IHByZWZlciwgbW92aW5nIHRoZSBJREwKLSMgdG8gdGhlIGVhc3Qgc2lkZSBvZiB0aGUgUGhvZW5peCBhbmQgTGluZSBJc2xhbmRzKSwgSSBzdXBwb3NlIHRoYXQgbW9zdAotIyBtYXBtYWtlcnMgcmVkcmV3IHRoZSBJREwgZm9sbG93aW5nIHRoZSBib3VuZGFyeSBvZiBLaXJpYmF0aS4gIEV2ZW4gdGhhdCBsaW5lCi0jIGhhcyBhIHJhdGhlciBhcmJpdHJhcnkgbmF0dXJlLiAgVGhlIHN0cmFpZ2h0LWxpbmUgYm91bmRhcmllcyBiZXR3ZWVuIFBhY2lmaWMKLSMgaXNsYW5kIG5hdGlvbnMgdGhhdCBhcmUgc2hvd24gb24gbWFueSBtYXBzIGFyZSBiYXNlZCBvbiBhbiBpbnRlcm5hdGlvbmFsCi0jIGNvbnZlbnRpb24sIGJ1dCBhcmUgbm90IGxlZ2FsbHkgYmluZGluZyBuYXRpb25hbCBib3JkZXJzLi4uLiBUaGUgZGF0ZSBpcwotIyBnb3Zlcm5lZCBieSB0aGUgSURMOyB0aGVyZWZvcmUsIGV2ZW4gb24gdGhlIGhpZ2ggc2VhcywgdGhlcmUgbWF5IGJlIHNvbWUKLSMgcGxhY2VzIGFzIGxhdGUgYXMgZm91cnRlZW4gaG91cnMgbGF0ZXIgdGhhbiBVVEMuICBBbmQsIHNpbmNlIHRoZSBJREwgaXMgbm90Ci0jIGFuIGludGVybmF0aW9uYWwgc3RhbmRhcmQsIHRoZXJlIGFyZSBzb21lIHBsYWNlcyBvbiB0aGUgaGlnaCBzZWFzIHdoZXJlIHRoZQotIyBjb3JyZWN0IGRhdGUgaXMgYW1iaWd1b3VzLgotCi0jIEZyb20gV2lraXBlZGlhIDxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RpbWVfem9uZT4gKDIwMDUtMDgtMzEpOgotIyBCZWZvcmUgMTkyMCwgYWxsIHNoaXBzIGtlcHQgbG9jYWwgYXBwYXJlbnQgdGltZSBvbiB0aGUgaGlnaCBzZWFzIGJ5IHNldHRpbmcKLSMgdGhlaXIgY2xvY2tzIGF0IG5pZ2h0IG9yIGF0IHRoZSBtb3JuaW5nIHNpZ2h0IHNvIHRoYXQsIGdpdmVuIHRoZSBzaGlwJ3MKLSMgc3BlZWQgYW5kIGRpcmVjdGlvbiwgaXQgd291bGQgYmUgMTIgbydjbG9jayB3aGVuIHRoZSBTdW4gY3Jvc3NlZCB0aGUgc2hpcCdzCi0jIG1lcmlkaWFuICgxMiBvJ2Nsb2NrID0gbG9jYWwgYXBwYXJlbnQgbm9vbikuICBEdXJpbmcgMTkxNywgYXQgdGhlCi0jIEFuZ2xvLUZyZW5jaCBDb25mZXJlbmNlIG9uIFRpbWUta2VlcGluZyBhdCBTZWEsIGl0IHdhcyByZWNvbW1lbmRlZCB0aGF0IGFsbAotIyBzaGlwcywgYm90aCBtaWxpdGFyeSBhbmQgY2l2aWxpYW4sIHNob3VsZCBhZG9wdCBob3VybHkgc3RhbmRhcmQgdGltZSB6b25lcwotIyBvbiB0aGUgaGlnaCBzZWFzLiAgV2hlbmV2ZXIgYSBzaGlwIHdhcyB3aXRoaW4gdGhlIHRlcnJpdG9yaWFsIHdhdGVycyBvZiBhbnkKLSMgbmF0aW9uIGl0IHdvdWxkIHVzZSB0aGF0IG5hdGlvbidzIHN0YW5kYXJkIHRpbWUuICBUaGUgY2FwdGFpbiB3YXMgcGVybWl0dGVkCi0jIHRvIGNoYW5nZSBoaXMgc2hpcCdzIGNsb2NrcyBhdCBhIHRpbWUgb2YgaGlzIGNob2ljZSBmb2xsb3dpbmcgaGlzIHNoaXAncwotIyBlbnRyeSBpbnRvIGFub3RoZXIgem9uZSB0aW1lLS1oZSBvZnRlbiBjaG9zZSBtaWRuaWdodC4gIFRoZXNlIHpvbmVzIHdlcmUKLSMgYWRvcHRlZCBieSBhbGwgbWFqb3IgZmxlZXRzIGJldHdlZW4gMTkyMCBhbmQgMTkyNSBidXQgbm90IGJ5IG1hbnkKLSMgaW5kZXBlbmRlbnQgbWVyY2hhbnQgc2hpcHMgdW50aWwgV29ybGQgV2FyIElJLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQsIHVzaW5nIHJlZmVyZW5jZXMgc3VnZ2VzdGVkIGJ5IE9zY2FyIHZhbiBWbGlqbWVuCi0jICgyMDA1LTAzLTIwKToKLSMKLSMgVGhlIEFtZXJpY2FuIFByYWN0aWNhbCBOYXZpZ2F0b3IgKDIwMDIpCi0jIDxodHRwOi8vcG9sbHV4Lm5zcy5uaW1hLm1pbC9wdWJzL3B1YnNfal9hcG5fc2VjdGlvbnMuaHRtbD9yaWQ9MTg3PgotIyB0YWxrcyBvbmx5IGFib3V0IHRoZSAxODAtZGVncmVlIG1lcmlkaWFuIHdpdGggcmVzcGVjdCB0byBzaGlwcyBpbgotIyBpbnRlcm5hdGlvbmFsIHdhdGVyczsgaXQgaWdub3JlcyB0aGUgaW50ZXJuYXRpb25hbCBkYXRlIGxpbmUuCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9iYWNrd2FyZCBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2JhY2t3YXJkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU5OTFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2JhY2t3YXJkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMgQCgjKWJhY2t3YXJkCTguNgotCi0jIFRoaXMgZmlsZSBwcm92aWRlcyBsaW5rcyBiZXR3ZWVuIGN1cnJlbnQgbmFtZXMgZm9yIHRpbWUgem9uZXMKLSMgYW5kIHRoZWlyIG9sZCBuYW1lcy4gIE1hbnkgbmFtZXMgY2hhbmdlZCBpbiBsYXRlIDE5OTMuCi0KLUxpbmsJQWZyaWNhL0FzbWFyYQkJQWZyaWNhL0FzbWVyYQotTGluawlBZnJpY2EvQmFtYWtvCQlBZnJpY2EvVGltYnVrdHUKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvQ2F0YW1hcmNhCUFtZXJpY2EvQXJnZW50aW5hL0NvbW9kUml2YWRhdmlhCi1MaW5rCUFtZXJpY2EvQWRhawkJQW1lcmljYS9BdGthCi1MaW5rCUFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcwlBbWVyaWNhL0J1ZW5vc19BaXJlcwotTGluawlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQW1lcmljYS9DYXRhbWFyY2EKLUxpbmsJQW1lcmljYS9BdGlrb2thbglBbWVyaWNhL0NvcmFsX0hhcmJvdXIKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvQ29yZG9iYQlBbWVyaWNhL0NvcmRvYmEKLUxpbmsJQW1lcmljYS9UaWp1YW5hCQlBbWVyaWNhL0Vuc2VuYWRhCi1MaW5rCUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJQW1lcmljYS9Gb3J0X1dheW5lCi1MaW5rCUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJQW1lcmljYS9JbmRpYW5hcG9saXMKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvSnVqdXkJQW1lcmljYS9KdWp1eQotTGluawlBbWVyaWNhL0luZGlhbmEvS25veAlBbWVyaWNhL0tub3hfSU4KLUxpbmsJQW1lcmljYS9LZW50dWNreS9Mb3Vpc3ZpbGxlCUFtZXJpY2EvTG91aXN2aWxsZQotTGluawlBbWVyaWNhL0FyZ2VudGluYS9NZW5kb3phCUFtZXJpY2EvTWVuZG96YQotTGluawlBbWVyaWNhL1Jpb19CcmFuY28JQW1lcmljYS9Qb3J0b19BY3JlCi1MaW5rCUFtZXJpY2EvQXJnZW50aW5hL0NvcmRvYmEJQW1lcmljYS9Sb3NhcmlvCi1MaW5rCUFtZXJpY2EvU3RfVGhvbWFzCUFtZXJpY2EvVmlyZ2luCi1MaW5rCUFzaWEvQXNoZ2FiYXQJCUFzaWEvQXNoa2hhYmFkCi1MaW5rCUFzaWEvQ2hvbmdxaW5nCQlBc2lhL0NodW5na2luZwotTGluawlBc2lhL0RoYWthCQlBc2lhL0RhY2NhCi1MaW5rCUFzaWEvS29sa2F0YQkJQXNpYS9DYWxjdXR0YQotTGluawlBc2lhL01hY2F1CQlBc2lhL01hY2FvCi1MaW5rCUFzaWEvSmVydXNhbGVtCQlBc2lhL1RlbF9Bdml2Ci1MaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KLUxpbmsJQXNpYS9UaGltcGh1CQlBc2lhL1RoaW1idQotTGluawlBc2lhL01ha2Fzc2FyCQlBc2lhL1VqdW5nX1BhbmRhbmcKLUxpbmsJQXNpYS9VbGFhbmJhYXRhcglBc2lhL1VsYW5fQmF0b3IKLUxpbmsJQXRsYW50aWMvRmFyb2UJCUF0bGFudGljL0ZhZXJvZQotTGluawlFdXJvcGUvT3NsbwkJQXRsYW50aWMvSmFuX01heWVuCi1MaW5rCUF1c3RyYWxpYS9TeWRuZXkJQXVzdHJhbGlhL0FDVAotTGluawlBdXN0cmFsaWEvU3lkbmV5CUF1c3RyYWxpYS9DYW5iZXJyYQotTGluawlBdXN0cmFsaWEvTG9yZF9Ib3dlCUF1c3RyYWxpYS9MSEkKLUxpbmsJQXVzdHJhbGlhL1N5ZG5leQlBdXN0cmFsaWEvTlNXCi1MaW5rCUF1c3RyYWxpYS9EYXJ3aW4JQXVzdHJhbGlhL05vcnRoCi1MaW5rCUF1c3RyYWxpYS9CcmlzYmFuZQlBdXN0cmFsaWEvUXVlZW5zbGFuZAotTGluawlBdXN0cmFsaWEvQWRlbGFpZGUJQXVzdHJhbGlhL1NvdXRoCi1MaW5rCUF1c3RyYWxpYS9Ib2JhcnQJQXVzdHJhbGlhL1Rhc21hbmlhCi1MaW5rCUF1c3RyYWxpYS9NZWxib3VybmUJQXVzdHJhbGlhL1ZpY3RvcmlhCi1MaW5rCUF1c3RyYWxpYS9QZXJ0aAkJQXVzdHJhbGlhL1dlc3QKLUxpbmsJQXVzdHJhbGlhL0Jyb2tlbl9IaWxsCUF1c3RyYWxpYS9ZYW5jb3dpbm5hCi1MaW5rCUFtZXJpY2EvUmlvX0JyYW5jbwlCcmF6aWwvQWNyZQotTGluawlBbWVyaWNhL05vcm9uaGEJCUJyYXppbC9EZU5vcm9uaGEKLUxpbmsJQW1lcmljYS9TYW9fUGF1bG8JQnJhemlsL0Vhc3QKLUxpbmsJQW1lcmljYS9NYW5hdXMJCUJyYXppbC9XZXN0Ci1MaW5rCUFtZXJpY2EvSGFsaWZheAkJQ2FuYWRhL0F0bGFudGljCi1MaW5rCUFtZXJpY2EvV2lubmlwZWcJQ2FuYWRhL0NlbnRyYWwKLUxpbmsJQW1lcmljYS9SZWdpbmEJCUNhbmFkYS9FYXN0LVNhc2thdGNoZXdhbgotTGluawlBbWVyaWNhL1Rvcm9udG8JCUNhbmFkYS9FYXN0ZXJuCi1MaW5rCUFtZXJpY2EvRWRtb250b24JQ2FuYWRhL01vdW50YWluCi1MaW5rCUFtZXJpY2EvU3RfSm9obnMJQ2FuYWRhL05ld2ZvdW5kbGFuZAotTGluawlBbWVyaWNhL1ZhbmNvdXZlcglDYW5hZGEvUGFjaWZpYwotTGluawlBbWVyaWNhL1JlZ2luYQkJQ2FuYWRhL1Nhc2thdGNoZXdhbgotTGluawlBbWVyaWNhL1doaXRlaG9yc2UJQ2FuYWRhL1l1a29uCi1MaW5rCUFtZXJpY2EvU2FudGlhZ28JQ2hpbGUvQ29udGluZW50YWwKLUxpbmsJUGFjaWZpYy9FYXN0ZXIJCUNoaWxlL0Vhc3RlcklzbGFuZAotTGluawlBbWVyaWNhL0hhdmFuYQkJQ3ViYQotTGluawlBZnJpY2EvQ2Fpcm8JCUVneXB0Ci1MaW5rCUV1cm9wZS9EdWJsaW4JCUVpcmUKLUxpbmsJRXVyb3BlL0xvbmRvbgkJRXVyb3BlL0JlbGZhc3QKLUxpbmsJRXVyb3BlL0NoaXNpbmF1CQlFdXJvcGUvVGlyYXNwb2wKLUxpbmsJRXVyb3BlL0xvbmRvbgkJR0IKLUxpbmsJRXVyb3BlL0xvbmRvbgkJR0ItRWlyZQotTGluawlFdGMvR01UCQkJR01UKzAKLUxpbmsJRXRjL0dNVAkJCUdNVC0wCi1MaW5rCUV0Yy9HTVQJCQlHTVQwCi1MaW5rCUV0Yy9HTVQJCQlHcmVlbndpY2gKLUxpbmsJQXNpYS9Ib25nX0tvbmcJCUhvbmdrb25nCi1MaW5rCUF0bGFudGljL1JleWtqYXZpawlJY2VsYW5kCi1MaW5rCUFzaWEvVGVocmFuCQlJcmFuCi1MaW5rCUFzaWEvSmVydXNhbGVtCQlJc3JhZWwKLUxpbmsJQW1lcmljYS9KYW1haWNhCQlKYW1haWNhCi1MaW5rCUFzaWEvVG9reW8JCUphcGFuCi1MaW5rCVBhY2lmaWMvS3dhamFsZWluCUt3YWphbGVpbgotTGluawlBZnJpY2EvVHJpcG9saQkJTGlieWEKLUxpbmsJQW1lcmljYS9UaWp1YW5hCQlNZXhpY28vQmFqYU5vcnRlCi1MaW5rCUFtZXJpY2EvTWF6YXRsYW4JTWV4aWNvL0JhamFTdXIKLUxpbmsJQW1lcmljYS9NZXhpY29fQ2l0eQlNZXhpY28vR2VuZXJhbAotTGluawlQYWNpZmljL0F1Y2tsYW5kCU5aCi1MaW5rCVBhY2lmaWMvQ2hhdGhhbQkJTlotQ0hBVAotTGluawlBbWVyaWNhL0RlbnZlcgkJTmF2YWpvCi1MaW5rCUFzaWEvU2hhbmdoYWkJCVBSQwotTGluawlQYWNpZmljL1BhZ29fUGFnbwlQYWNpZmljL1NhbW9hCi1MaW5rCVBhY2lmaWMvVHJ1awkJUGFjaWZpYy9ZYXAKLUxpbmsJRXVyb3BlL1dhcnNhdwkJUG9sYW5kCi1MaW5rCUV1cm9wZS9MaXNib24JCVBvcnR1Z2FsCi1MaW5rCUFzaWEvVGFpcGVpCQlST0MKLUxpbmsJQXNpYS9TZW91bAkJUk9LCi1MaW5rCUFzaWEvU2luZ2Fwb3JlCQlTaW5nYXBvcmUKLUxpbmsJRXVyb3BlL0lzdGFuYnVsCQlUdXJrZXkKLUxpbmsJRXRjL1VDVAkJCVVDVAotTGluawlBbWVyaWNhL0FuY2hvcmFnZQlVUy9BbGFza2EKLUxpbmsJQW1lcmljYS9BZGFrCQlVUy9BbGV1dGlhbgotTGluawlBbWVyaWNhL1Bob2VuaXgJCVVTL0FyaXpvbmEKLUxpbmsJQW1lcmljYS9DaGljYWdvCQlVUy9DZW50cmFsCi1MaW5rCUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJVVMvRWFzdC1JbmRpYW5hCi1MaW5rCUFtZXJpY2EvTmV3X1lvcmsJVVMvRWFzdGVybgotTGluawlQYWNpZmljL0hvbm9sdWx1CVVTL0hhd2FpaQotTGluawlBbWVyaWNhL0luZGlhbmEvS25veAlVUy9JbmRpYW5hLVN0YXJrZQotTGluawlBbWVyaWNhL0RldHJvaXQJCVVTL01pY2hpZ2FuCi1MaW5rCUFtZXJpY2EvRGVudmVyCQlVUy9Nb3VudGFpbgotTGluawlBbWVyaWNhL0xvc19BbmdlbGVzCVVTL1BhY2lmaWMKLUxpbmsJUGFjaWZpYy9QYWdvX1BhZ28JVVMvU2Ftb2EKLUxpbmsJRXRjL1VUQwkJCVVUQwotTGluawlFdGMvVVRDCQkJVW5pdmVyc2FsCi1MaW5rCUV1cm9wZS9Nb3Njb3cJCVctU1UKLUxpbmsJRXRjL1VUQwkJCVp1bHUKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2V0Y2V0ZXJhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvZXRjZXRlcmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZGJlOGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvZXRjZXRlcmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jIEAoIylldGNldGVyYQk4LjEKLQotIyBUaGVzZSBlbnRyaWVzIGFyZSBtb3N0bHkgcHJlc2VudCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBzbyB0aGF0Ci0jIHBlb3BsZSBpbiBhcmVhcyBub3Qgb3RoZXJ3aXNlIGNvdmVyZWQgYnkgdGhlIHR6IGZpbGVzIGNvdWxkICJ6aWMgLWwiCi0jIHRvIGEgdGltZSB6b25lIHRoYXQgd2FzIHJpZ2h0IGZvciB0aGVpciBhcmVhLiAgVGhlc2UgZGF5cywgdGhlCi0jIHR6IGZpbGVzIGNvdmVyIGFsbW9zdCBhbGwgdGhlIGluaGFiaXRlZCB3b3JsZCwgYW5kIHRoZSBvbmx5IHByYWN0aWNhbAotIyBuZWVkIG5vdyBmb3IgdGhlIGVudHJpZXMgdGhhdCBhcmUgbm90IG9uIFVUQyBhcmUgZm9yIHNoaXBzIGF0IHNlYQotIyB0aGF0IGNhbm5vdCB1c2UgUE9TSVggVFogc2V0dGluZ3MuCi0KLVpvbmUJRXRjL0dNVAkJMAktCUdNVAotWm9uZQlFdGMvVVRDCQkwCS0JVVRDCi1ab25lCUV0Yy9VQ1QJCTAJLQlVQ1QKLQotIyBUaGUgZm9sbG93aW5nIGxpbmsgdXNlcyBvbGRlciBuYW1pbmcgY29udmVudGlvbnMsCi0jIGJ1dCBpdCBiZWxvbmdzIGhlcmUsIG5vdCBpbiB0aGUgZmlsZSBgYmFja3dhcmQnLAotIyBhcyBmdW5jdGlvbnMgbGlrZSBnbXRpbWUgbG9hZCB0aGUgIkdNVCIgZmlsZSB0byBoYW5kbGUgbGVhcCBzZWNvbmRzIHByb3Blcmx5LgotIyBXZSB3YW50IHRoaXMgdG8gd29yayBldmVuIG9uIGluc3RhbGxhdGlvbnMgdGhhdCBvbWl0IHRoZSBvdGhlciBvbGRlciBuYW1lcy4KLUxpbmsJRXRjL0dNVAkJCQlHTVQKLQotTGluawlFdGMvVVRDCQkJCUV0Yy9Vbml2ZXJzYWwKLUxpbmsJRXRjL1VUQwkJCQlFdGMvWnVsdQotCi1MaW5rCUV0Yy9HTVQJCQkJRXRjL0dyZWVud2ljaAotTGluawlFdGMvR01UCQkJCUV0Yy9HTVQtMAotTGluawlFdGMvR01UCQkJCUV0Yy9HTVQrMAotTGluawlFdGMvR01UCQkJCUV0Yy9HTVQwCi0KLSMgV2UgdXNlIFBPU0lYLXN0eWxlIHNpZ25zIGluIHRoZSBab25lIG5hbWVzIGFuZCB0aGUgb3V0cHV0IGFiYnJldmlhdGlvbnMsCi0jIGV2ZW4gdGhvdWdoIHRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgbWFueSBwZW9wbGUgZXhwZWN0LgotIyBQT1NJWCBoYXMgcG9zaXRpdmUgc2lnbnMgd2VzdCBvZiBHcmVlbndpY2gsIGJ1dCBtYW55IHBlb3BsZSBleHBlY3QKLSMgcG9zaXRpdmUgc2lnbnMgZWFzdCBvZiBHcmVlbndpY2guICBGb3IgZXhhbXBsZSwgVFo9J0V0Yy9HTVQrNCcgdXNlcwotIyB0aGUgYWJicmV2aWF0aW9uICJHTVQrNCIgYW5kIGNvcnJlc3BvbmRzIHRvIDQgaG91cnMgYmVoaW5kIFVUQwotIyAoaS5lLiB3ZXN0IG9mIEdyZWVud2ljaCkgZXZlbiB0aG91Z2ggbWFueSBwZW9wbGUgd291bGQgZXhwZWN0IGl0IHRvCi0jIG1lYW4gNCBob3VycyBhaGVhZCBvZiBVVEMgKGkuZS4gZWFzdCBvZiBHcmVlbndpY2gpLgotIwotIyBJbiB0aGUgZHJhZnQgNSBvZiBQT1NJWCAxMDAzLjEtMjAweCwgdGhlIGFuZ2xlIGJyYWNrZXQgbm90YXRpb24KLSMgKHdoaWNoIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoZSB0eiBjb2RlKSBhbGxvd3MgZm9yCi0jIFRaPSc8R01ULTQ+KzQnOyBpZiB5b3Ugd2FudCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBjb25mb3JtaW5nIHRvCi0jIElTTyA4NjAxIHlvdSBjYW4gdXNlIFRaPSc8LTA0MDA+KzQnLiAgVGh1cyB0aGUgY29tbW9ubHktZXhwZWN0ZWQKLSMgb2Zmc2V0IGlzIGtlcHQgd2l0aGluIHRoZSBhbmdsZSBicmFja2V0IChhbmQgaXMgdXNlZCBmb3IgZGlzcGxheSkKLSMgd2hpbGUgdGhlIFBPU0lYIHNpZ24gaXMga2VwdCBvdXRzaWRlIHRoZSBhbmdsZSBicmFja2V0IChhbmQgaXMgdXNlZAotIyBmb3IgY2FsY3VsYXRpb24pLgotIwotIyBEbyBub3QgdXNlIGEgVFogc2V0dGluZyBsaWtlIFRaPSdHTVQrNCcsIHdoaWNoIGlzIGZvdXIgaG91cnMgYmVoaW5kCi0jIEdNVCBidXQgdXNlcyB0aGUgY29tcGxldGVseSBtaXNsZWFkaW5nIGFiYnJldmlhdGlvbiAiR01UIi4KLQotIyBFYXJsaWVyIGluY2FybmF0aW9ucyBvZiB0aGlzIHBhY2thZ2Ugd2VyZSBub3QgUE9TSVgtY29tcGxpYW50LAotIyBhbmQgaGFkIGxpbmVzIHN1Y2ggYXMKLSMJCVpvbmUJR01ULTEyCQktMTIJLQlHTVQtMTIwMAotIyBXZSBkaWQgbm90IHdhbnQgdGhpbmdzIHRvIGNoYW5nZSBxdWlldGx5IGlmIHNvbWVvbmUgYWNjdXN0b21lZCB0byB0aGUgb2xkCi0jIHdheSBkb2VzIGEKLSMJCXppYyAtbCBHTVQtMTIKLSMgc28gd2UgbW92ZWQgdGhlIG5hbWVzIGludG8gdGhlIEV0YyBzdWJkaXJlY3RvcnkuCi0KLVpvbmUJRXRjL0dNVC0xNAkxNAktCUdNVC0xNAkjIDE0IGhvdXJzIGFoZWFkIG9mIEdNVAotWm9uZQlFdGMvR01ULTEzCTEzCS0JR01ULTEzCi1ab25lCUV0Yy9HTVQtMTIJMTIJLQlHTVQtMTIKLVpvbmUJRXRjL0dNVC0xMQkxMQktCUdNVC0xMQotWm9uZQlFdGMvR01ULTEwCTEwCS0JR01ULTEwCi1ab25lCUV0Yy9HTVQtOQk5CS0JR01ULTkKLVpvbmUJRXRjL0dNVC04CTgJLQlHTVQtOAotWm9uZQlFdGMvR01ULTcJNwktCUdNVC03Ci1ab25lCUV0Yy9HTVQtNgk2CS0JR01ULTYKLVpvbmUJRXRjL0dNVC01CTUJLQlHTVQtNQotWm9uZQlFdGMvR01ULTQJNAktCUdNVC00Ci1ab25lCUV0Yy9HTVQtMwkzCS0JR01ULTMKLVpvbmUJRXRjL0dNVC0yCTIJLQlHTVQtMgotWm9uZQlFdGMvR01ULTEJMQktCUdNVC0xCi1ab25lCUV0Yy9HTVQrMQktMQktCUdNVCsxCi1ab25lCUV0Yy9HTVQrMgktMgktCUdNVCsyCi1ab25lCUV0Yy9HTVQrMwktMwktCUdNVCszCi1ab25lCUV0Yy9HTVQrNAktNAktCUdNVCs0Ci1ab25lCUV0Yy9HTVQrNQktNQktCUdNVCs1Ci1ab25lCUV0Yy9HTVQrNgktNgktCUdNVCs2Ci1ab25lCUV0Yy9HTVQrNwktNwktCUdNVCs3Ci1ab25lCUV0Yy9HTVQrOAktOAktCUdNVCs4Ci1ab25lCUV0Yy9HTVQrOQktOQktCUdNVCs5Ci1ab25lCUV0Yy9HTVQrMTAJLTEwCS0JR01UKzEwCi1ab25lCUV0Yy9HTVQrMTEJLTExCS0JR01UKzExCi1ab25lCUV0Yy9HTVQrMTIJLTEyCS0JR01UKzEyCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9ldXJvcGUgYi90b29scy96b25laW5mby90emRhdGEyMDA4aC9ldXJvcGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjk4NjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvZXVyb3BlCisrKyAvZGV2L251bGwKQEAgLTEsMjU5NCArMCwwIEBACi0jIEAoIylldXJvcGUJOC4xOAotIyA8cHJlPgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkxLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgT3RoZXIgc291cmNlcyBvY2Nhc2lvbmFsbHkgdXNlZCBpbmNsdWRlOgotIwotIwlFZHdhcmQgVy4gV2hpdG1hbiwgV29ybGQgVGltZSBEaWZmZXJlbmNlcywKLSMJV2hpdG1hbiBQdWJsaXNoaW5nIENvLCAyIE5pYWdhcmEgQXYsIEVhbGluZywgTG9uZG9uICh1bmRhdGVkKSwKLSMJd2hpY2ggSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgotIwotIwk8YSBocmVmPSJodHRwOi8vd3d3LnBldHRzd29vZHZpbGxhZ2UuY28udWsvRGF5bGlnaHRfU2F2aW5nc19XaWxsaWFtX1dpbGxldHQucGRmIj4KLSMJV2lsbGlhbSBXaWxsZXR0LCBUaGUgV2FzdGUgb2YgRGF5bGlnaHQsIDE5dGggZWRpdGlvbgotIwk8L2E+ICgxOTE0LTAzKQotIwotIwlCcmF6aWwncyBEZXBhcnRhbWVudG8gU2VydmljbyBkYSBIb3JhIChEU0gpLAotIwk8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ISVNUSFYuaHRtIj4KLSMJSGlzdG9yeSBvZiBTdW1tZXIgVGltZQotIwk8L2E+ICgxOTk4LTA5LTIxLCBpbiBQb3J0dWd1ZXNlKQotCi0jCi0jIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkIGAqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwotIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgotIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKLSMgICAgICAgICAgICAgICAgICAgc3RkIGRzdCAgMmRzdAotIyAgICAgICAgICAgICAgICAgICBMTVQgICAgICAgICAgIExvY2FsIE1lYW4gVGltZQotIyAgICAgICAtNDowMCAgICAgICBBU1QgQURUICAgICAgIEF0bGFudGljCi0jICAgICAgIC0zOjAwICAgICAgIFdHVCBXR1NUICAgICAgV2VzdGVybiBHcmVlbmxhbmQqCi0jICAgICAgIC0xOjAwICAgICAgIEVHVCBFR1NUICAgICAgRWFzdGVybiBHcmVlbmxhbmQqCi0jICAgICAgICAwOjAwICAgICAgIEdNVCBCU1QgIEJEU1QgR3JlZW53aWNoLCBCcml0aXNoIFN1bW1lcgotIyAgICAgICAgMDowMCAgICAgICBHTVQgSVNUICAgICAgIEdyZWVud2ljaCwgSXJpc2ggU3VtbWVyCi0jICAgICAgICAwOjAwICAgICAgIFdFVCBXRVNUIFdFTVQgV2VzdGVybiBFdXJvcGUKLSMgICAgICAgIDA6MTk6MzIuMTMgQU1UIE5TVCAgICAgICBBbXN0ZXJkYW0sIE5ldGhlcmxhbmRzIFN1bW1lciAoMTgzNS0xOTM3KSoKLSMgICAgICAgIDA6MjAgICAgICAgTkVUIE5FU1QgICAgICBOZXRoZXJsYW5kcyAoMTkzNy0xOTQwKSoKLSMgICAgICAgIDE6MDAgICAgICAgQ0VUIENFU1QgQ0VNVCBDZW50cmFsIEV1cm9wZQotIyAgICAgICAgMTowMDoxNCAgICBTRVQgICAgICAgICAgIFN3ZWRpc2ggKDE4NzktMTg5OSkqCi0jICAgICAgICAyOjAwICAgICAgIEVFVCBFRVNUICAgICAgRWFzdGVybiBFdXJvcGUKLSMgICAgICAgIDM6MDAgICAgICAgTVNLIE1TRCAgICAgICBNb3Njb3cKLSMKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzLCBlc3BlY2lhbGx5IGluIEJyaXRhaW4sCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgotCi0jIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk0LTEyLTA0KSwKLSMgVGhlIG9yaWdpbmFsIHNpeCBbRVUgbWVtYmVyc106IEJlbGdpdW0sIEZyYW5jZSwgKFdlc3QpIEdlcm1hbnksIEl0YWx5LAotIyBMdXhlbWJvdXJnLCB0aGUgTmV0aGVybGFuZHMuCi0jIFBsdXMsIGZyb20gMSBKYW4gNzM6IERlbm1hcmssIElyZWxhbmQsIFVuaXRlZCBLaW5nZG9tLgotIyBQbHVzLCBmcm9tIDEgSmFuIDgxOiBHcmVlY2UuCi0jIFBsdXMsIGZyb20gMSBKYW4gODY6IFNwYWluLCBQb3J0dWdhbC4KLSMgUGx1cywgZnJvbSAxIEphbiA5NTogQXVzdHJpYSwgRmlubGFuZCwgU3dlZGVuLiAoTm9yd2F5IG5lZ290aWF0ZWQgdGVybXMgZm9yCi0jIGVudHJ5IGJ1dCBpbiBhIHJlZmVyZW5kdW0gb24gMjggTm92IDk0IHRoZSBwZW9wbGUgdm90ZWQgTm8gYnkgNTIuMiUgdG8gNDcuOCUKLSMgb24gYSB0dXJub3V0IG9mIDg4LjYlLiBUaGlzIHdhcyBhbG1vc3QgdGhlIHNhbWUgcmVzdWx0IGFzIE5vcndheSdzIHByZXZpb3VzCi0jIHJlZmVyZW5kdW0gaW4gMTk3MiwgdGhleSBhcmUgdGhlIG9ubHkgY291bnRyeSB0byBoYXZlIHNhaWQgTm8gdHdpY2UuCi0jIFJlZmVyZW5kdW1zIGluIHRoZSBvdGhlciB0aHJlZSBjb3VudHJpZXMgdm90ZWQgWWVzLikKLSMgLi4uCi0jIEVzdG9uaWEgLi4uIHVzZXMgRVUgZGF0ZXMgYnV0IG5vdCBhdCAwMTowMCBHTVQsIHRoZXkgdXNlIG1pZG5pZ2h0IEdNVC4KLSMgSSBkb24ndCB0aGluayB0aGV5IGtub3cgeWV0IHdoYXQgdGhleSB3aWxsIGRvIGZyb20gMTk5NiBvbndhcmRzLgotIyAuLi4KLSMgVGhlcmUgc2hvdWxkbid0IGJlIGFueSBbY3VycmVudCBtZW1iZXJzIHdobyBhcmUgbm90IHVzaW5nIEVVIHJ1bGVzXS4KLSMgQSBEaXJlY3RpdmUgaGFzIHRoZSBmb3JjZSBvZiBsYXcsIG1lbWJlciBzdGF0ZXMgYXJlIG9ibGlnZWQgdG8gZW5hY3QKLSMgbmF0aW9uYWwgbGF3IHRvIGltcGxlbWVudCBpdC4gVGhlIG9ubHkgY29udGVudGlvdXMgaXNzdWUgd2FzIHRoZQotIyBkaWZmZXJlbnQgZW5kIGRhdGUgZm9yIHRoZSBVSyBhbmQgSXJlbGFuZCwgYW5kIHRoaXMgd2FzIGFsd2F5cyBhbGxvd2VkCi0jIGluIHRoZSBEaXJlY3RpdmUuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEJyaXRhaW4gKFVuaXRlZCBLaW5nZG9tKSBhbmQgSXJlbGFuZCAoRWlyZSkKLQotIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5NC0wNy0wNik6Ci0jCi0jIE9uIDE3IEphbiAxOTk0IHRoZSBJbmRlcGVuZGVudCwgYSBVSyBxdWFsaXR5IG5ld3NwYXBlciwgaGFkIGEgcGllY2UgYWJvdXQKLSMgaGlzdG9yaWNhbCB2aXN0YXMgYWxvbmcgdGhlIFRoYW1lcyBpbiB3ZXN0IExvbmRvbi4gVGhlcmUgd2FzIGEgcGhvdG8KLSMgYW5kIGEgc2tldGNoIG1hcCBzaG93aW5nIHNvbWUgb2YgdGhlIHNpZ2h0bGluZXMgaW52b2x2ZWQuIE9uZSBwYXJhZ3JhcGgKLSMgb2YgdGhlIHRleHQgc2FpZDoKLSMKLSMgYEFuIG9sZCBzdG9uZSBvYmVsaXNrIG1hcmtpbmcgYSBmb3Jnb3R0ZW4gdGVycmVzdHJpYWwgbWVyaWRpYW4gc3RhbmRzCi0jIGJlc2lkZSB0aGUgcml2ZXIgYXQgS2V3LiBJbiB0aGUgMTh0aCBjZW50dXJ5LCBiZWZvcmUgdGltZSBhbmQgbG9uZ2l0dWRlCi0jIHdhcyBzdGFuZGFyZGlzZWQgYnkgdGhlIFJveWFsIE9ic2VydmF0b3J5IGluIEdyZWVud2ljaCwgc2Nob2xhcnMgb2JzZXJ2ZWQKLSMgdGhpcyBzdG9uZSBhbmQgdGhlIG1vdmVtZW50IG9mIHN0YXJzIGZyb20gS2V3IE9ic2VydmF0b3J5IG5lYXJieS4gVGhleQotIyBtYWRlIHRoZWlyIGNhbGN1bGF0aW9ucyBhbmQgc2V0IHRoZSB0aW1lIGZvciB0aGUgSG9yc2UgR3VhcmRzIGFuZCBQYXJsaWFtZW50LAotIyBidXQgbm93IHRoZSBzdG9uZSBpcyBvYnNjdXJlZCBieSBzY3J1Yndvb2QgYW5kIGNhbiBvbmx5IGJlIHNlZW4gYnkgd2Fsa2luZwotIyBhbG9uZyB0aGUgdG93cGF0aCB3aXRoaW4gYSBmZXcgeWFyZHMgb2YgaXQuJwotIwotIyBJIGhhdmUgYSBvbmUgaW5jaCB0byBvbmUgbWlsZSBtYXAgb2YgTG9uZG9uIGFuZCBteSBlc3RpbWF0ZSBvZiB0aGUgc3RvbmUncwotIyBwb3NpdGlvbiBpcyA1MSBkZWcuIDI4JyAzMCIgTiwgMCBkZWcuIDE4JyA0NSIgVy4gVGhlIGxvbmdpdHVkZSBzaG91bGQKLSMgYmUgd2l0aGluIGFib3V0ICstMiIuIFRoZSBPcmRuYW5jZSBTdXJ2ZXkgZ3JpZCByZWZlcmVuY2UgaXMgVFExNzI3NjEuCi0jCi0jIFtUaGlzIHlpZWxkcyBHTVRPRkYgPSAtMDowMToxNSBmb3IgTG9uZG9uIExNVCBpbiB0aGUgMTh0aCBjZW50dXJ5Ll0KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTkzLTExLTE4KToKLSMKLSMgSG93c2Ugd3JpdGVzIHRoYXQgQnJpdGFpbiB3YXMgdGhlIGZpcnN0IGNvdW50cnkgdG8gdXNlIHN0YW5kYXJkIHRpbWUuCi0jIFRoZSByYWlsd2F5cyBjYXJlZCBtb3N0IGFib3V0IHRoZSBpbmNvbnNpc3RlbmNpZXMgb2YgbG9jYWwgbWVhbiB0aW1lLAotIyBhbmQgaXQgd2FzIHRoZXkgd2hvIGZvcmNlZCBhIHVuaWZvcm0gdGltZSBvbiB0aGUgY291bnRyeS4KLSMgVGhlIG9yaWdpbmFsIGlkZWEgd2FzIGNyZWRpdGVkIHRvIERyLiBXaWxsaWFtIEh5ZGUgV29sbGFzdG9uICgxNzY2LTE4MjgpCi0jIGFuZCB3YXMgcG9wdWxhcml6ZWQgYnkgQWJyYWhhbSBGb2xsZXR0IE9zbGVyICgxODA4LTE5MDMpLgotIyBUaGUgZmlyc3QgcmFpbHdheSB0byBhZG9wdCBMb25kb24gdGltZSB3YXMgdGhlIEdyZWF0IFdlc3Rlcm4gUmFpbHdheQotIyBpbiBOb3ZlbWJlciAxODQwOyBvdGhlciByYWlsd2F5cyBmb2xsb3dlZCBzdWl0LCBhbmQgYnkgMTg0NyBtb3N0Ci0jICh0aG91Z2ggbm90IGFsbCkgcmFpbHdheXMgdXNlZCBMb25kb24gdGltZS4gIE9uIDE4NDctMDktMjIgdGhlCi0jIFJhaWx3YXkgQ2xlYXJpbmcgSG91c2UsIGFuIGluZHVzdHJ5IHN0YW5kYXJkcyBib2R5LCByZWNvbW1lbmRlZCB0aGF0IEdNVCBiZQotIyBhZG9wdGVkIGF0IGFsbCBzdGF0aW9ucyBhcyBzb29uIGFzIHRoZSBHZW5lcmFsIFBvc3QgT2ZmaWNlIHBlcm1pdHRlZCBpdC4KLSMgVGhlIHRyYW5zaXRpb24gb2NjdXJyZWQgb24gMTItMDEgZm9yIHRoZSBMJk5XLCB0aGUgQ2FsZWRvbmlhbiwKLSMgYW5kIHByZXN1bWFibHkgb3RoZXIgcmFpbHdheXM7IHRoZSBKYW51YXJ5IDE4NDggQnJhZHNoYXcncyBsaXN0cyBtYW55Ci0jIHJhaWx3YXlzIGFzIHVzaW5nIEdNVC4gIEJ5IDE4NTUgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcHVibGljCi0jIGNsb2NrcyBpbiBCcml0YWluIHdlcmUgc2V0IHRvIEdNVCAodGhvdWdoIHNvbWUsIGxpa2UgdGhlIGdyZWF0IGNsb2NrCi0jIG9uIFRvbSBUb3dlciBhdCBDaHJpc3QgQ2h1cmNoLCBPeGZvcmQsIHdlcmUgZml0dGVkIHdpdGggdHdvIG1pbnV0ZSBoYW5kcywKLSMgb25lIGZvciBsb2NhbCB0aW1lIGFuZCBvbmUgZm9yIEdNVCkuICBUaGUgbGFzdCBtYWpvciBob2xkb3V0IHdhcyB0aGUgbGVnYWwKLSMgc3lzdGVtLCB3aGljaCBzdHViYm9ybmx5IHN0dWNrIHRvIGxvY2FsIHRpbWUgZm9yIG1hbnkgeWVhcnMsIGxlYWRpbmcKLSMgdG8gb2RkaXRpZXMgbGlrZSBwb2xscyBvcGVuaW5nIGF0IDA4OjEzIGFuZCBjbG9zaW5nIGF0IDE2OjEzLgotIyBUaGUgbGVnYWwgc3lzdGVtIGZpbmFsbHkgc3dpdGNoZWQgdG8gR01UIHdoZW4gdGhlIFN0YXR1dGVzIChEZWZpbml0aW9uCi0jIG9mIFRpbWUpIEFjdCB0b29rIGVmZmVjdDsgaXQgcmVjZWl2ZWQgdGhlIFJveWFsIEFzc2VudCBvbiAxODgwLTA4LTAyLgotIwotIyBJbiB0aGUgdGFibGVzIGJlbG93LCB3ZSBjb25kZW5zZSB0aGlzIGNvbXBsaWNhdGVkIHN0b3J5IGludG8gYSBzaW5nbGUKLSMgdHJhbnNpdGlvbiBkYXRlIGZvciBMb25kb24sIG5hbWVseSAxODQ3LTEyLTAxLiAgV2UgZG9uJ3Qga25vdyBhcyBtdWNoCi0jIGFib3V0IER1Ymxpbiwgc28gd2UgdXNlIDE4ODAtMDgtMDIsIHRoZSBsZWdhbCB0cmFuc2l0aW9uIHRpbWUuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wOS0yNyk6Ci0jIFN1bW1lciBUaW1lIHdhcyBmaXJzdCBzZXJpb3VzbHkgcHJvcG9zZWQgYnkgV2lsbGlhbSBXaWxsZXR0ICgxODU3LTE5MTUpLAotIyBhIExvbmRvbiBidWlsZGVyIGFuZCBtZW1iZXIgb2YgdGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5Ci0jIHdobyBjaXJjdWxhdGVkIGEgcGFtcGhsZXQgYGBUaGUgV2FzdGUgb2YgRGF5bGlnaHQnJyAoMTkwNykKLSMgdGhhdCBwcm9wb3NlZCBhZHZhbmNpbmcgY2xvY2tzIDIwIG1pbnV0ZXMgb24gZWFjaCBvZiBmb3VyIFN1bmRheXMgaW4gQXByaWwsCi0jIGFuZCByZXRhcmRpbmcgdGhlbSBieSB0aGUgc2FtZSBhbW91bnQgb24gZm91ciBTdW5kYXlzIGluIFNlcHRlbWJlci4KLSMgQSBiaWxsIHdhcyBkcmFmdGVkIGluIDE5MDkgYW5kIGludHJvZHVjZWQgaW4gUGFybGlhbWVudCBzZXZlcmFsIHRpbWVzLAotIyBidXQgaXQgbWV0IHdpdGggcmlkaWN1bGUgYW5kIG9wcG9zaXRpb24sIGVzcGVjaWFsbHkgZnJvbSBmYXJtaW5nIGludGVyZXN0cy4KLSMgTGF0ZXIgZWRpdGlvbnMgb2YgdGhlIHBhbXBobGV0IHByb3Bvc2VkIG9uZS1ob3VyIHN1bW1lciB0aW1lLCBhbmQKLSMgaXQgd2FzIGV2ZW50dWFsbHkgYWRvcHRlZCBhcyBhIHdhcnRpbWUgbWVhc3VyZSBpbiAxOTE2LgotIyBTZWU6IFN1bW1lciBUaW1lIEFycml2ZXMgRWFybHksIFRoZSBUaW1lcyAoMjAwMC0wNS0xOCkuCi0jIEEgbW9udW1lbnQgdG8gV2lsbGV0dCB3YXMgdW52ZWlsZWQgb24gMTkyNy0wNS0yMSwgaW4gYW4gb3BlbiBzcGFjZSBpbgotIyBhIDQ1LWFjcmUgd29vZCBuZWFyIENoaXNsZWh1cnN0LCBLZW50IHRoYXQgd2FzIHB1cmNoYXNlZCBieSBwb3B1bGFyCi0jIHN1YnNjcmlwdGlvbiBhbmQgb3BlbiB0byB0aGUgcHVibGljLiAgT24gdGhlIHNvdXRoIGZhY2Ugb2YgdGhlIG1vbm9saXRoLAotIyBkZXNpZ25lZCBieSBHLiBXLiBNaWxsZXIsIGlzIHRoZSB0aGUgV2lsbGlhbSBXaWxsZXR0IE1lbW9yaWFsIFN1bmRpYWwsCi0jIHdoaWNoIGlzIHBlcm1hbmVudGx5IHNldCB0byBTdW1tZXIgVGltZS4KLQotIyBGcm9tIFdpbnN0b24gQ2h1cmNoaWxsICgxOTM0LTA0LTI4KToKLSMgSXQgaXMgb25lIG9mIHRoZSBwYXJhZG94ZXMgb2YgaGlzdG9yeSB0aGF0IHdlIHNob3VsZCBvd2UgdGhlIGJvb24gb2YKLSMgc3VtbWVyIHRpbWUsIHdoaWNoIGdpdmVzIGV2ZXJ5IHllYXIgdG8gdGhlIHBlb3BsZSBvZiB0aGlzIGNvdW50cnkKLSMgYmV0d2VlbiAxNjAgYW5kIDE3MCBob3VycyBtb3JlIGRheWxpZ2h0IGxlaXN1cmUsIHRvIGEgd2FyIHdoaWNoCi0jIHBsdW5nZWQgRXVyb3BlIGludG8gZGFya25lc3MgZm9yIGZvdXIgeWVhcnMsIGFuZCBzaG9vayB0aGUKLSMgZm91bmRhdGlvbnMgb2YgY2l2aWxpemF0aW9uIHRocm91Z2hvdXQgdGhlIHdvcmxkLgotIwktLSA8YSBocmVmPSJodHRwOi8vd3d3LndpbnN0b25jaHVyY2hpbGwub3JnL2ZoMTE0d2lsbGV0dC5odG0iPgotIwkiQSBTaWxlbnQgVG9hc3QgdG8gV2lsbGlhbSBXaWxsZXR0IiwgUGljdG9yaWFsIFdlZWtseQotIwk8L2E+Ci0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6Ci0jIFRoZSBPRUQgU3VwcGxlbWVudCBzYXlzIHRoYXQgdGhlIEVuZ2xpc2ggb3JpZ2luYWxseSBzYWlkIGBgRGF5bGlnaHQgU2F2aW5nJycKLSMgd2hlbiB0aGV5IHdlcmUgZGViYXRpbmcgdGhlIGFkb3B0aW9uIG9mIERTVCBpbiAxOTA4OyBidXQgYnkgMTkxNiB0aGlzCi0jIHRlcm0gYXBwZWFycyBvbmx5IGluIHF1b3RlcyB0YWtlbiBmcm9tIERTVCdzIG9wcG9uZW50cywgd2hlcmVhcyB0aGUKLSMgcHJvcG9uZW50cyAod2hvIGV2ZW50dWFsbHkgd29uIHRoZSBhcmd1bWVudCkgYXJlIHF1b3RlZCBhcyB1c2luZyBgYFN1bW1lcicnLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTg5LTAxLTE5KToKLSMKLSMgQSBzb3VyY2UgYXQgdGhlIEJyaXRpc2ggSW5mb3JtYXRpb24gT2ZmaWNlIGluIE5ldyBZb3JrIGF2ZXJzIHRoYXQgaXQncwotIyBrbm93biBhcyAiQnJpdGlzaCIgU3VtbWVyIFRpbWUgaW4gYWxsIHBhcnRzIG9mIHRoZSBVbml0ZWQgS2luZ2RvbS4KLQotIyBEYXRlOiA0IEphbiA4OSAwODo1NzoyNSBHTVQgKFdlZCkKLSMgRnJvbTogSm9uYXRoYW4gTGVmZmxlcgotIyBbQnJpdGlzaCBTdW1tZXIgVGltZV0gaXMgZml4ZWQgYW5udWFsbHkgYnkgQWN0IG9mIFBhcmxpYW1lbnQuCi0jIElmIHlvdSBjYW4gcHJlZGljdCB3aGF0IFBhcmxpYW1lbnQgd2lsbCBkbywgeW91IHNob3VsZCBiZSBpbgotIyBwb2xpdGljcyBtYWtpbmcgYSBmb3J0dW5lLCBub3QgY29tcHV0aW5nLgotCi0jIEZyb20gQ2hyaXMgQ2FycmllciAoMTk5Ni0wNi0xNCk6Ci0jIEkgcmVtZW1iZXIgcmVhZGluZyBpbiB2YXJpb3VzIHdhcnRpbWUgaXNzdWVzIG9mIHRoZSBMb25kb24gVGltZXMgdGhlCi0jIGFjcm9ueW0gQkRTVCBmb3IgQnJpdGlzaCBEb3VibGUgU3VtbWVyIFRpbWUuICBMb29rIGZvciB0aGUgcHVibGlzaGVkCi0jIHRpbWUgb2Ygc3VucmlzZSBhbmQgc3Vuc2V0IGluIFRoZSBUaW1lcywgd2hlbiBCRFNUIHdhcyBpbiBlZmZlY3QsIGFuZAotIyBpZiB5b3UgZmluZCBhIHpvbmUgcmVmZXJlbmNlIGl0IHdpbGwgc2F5LCAiQWxsIHRpbWVzIEIuRC5TLlQuIgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgxOTk5LTA5LTAyKToKLSMgLi4uIHNvbWUgbWlsaXRhcnkgY2FibGVzIChXTyAyMTkvNDEwMCAtIHRoaXMgaXMgYSBjb3B5IGZyb20gdGhlCi0jIG1haW4gU0hBRUYgYXJjaGl2ZXMgaGVsZCBpbiB0aGUgVVMgTmF0aW9uYWwgQXJjaGl2ZXMsIFNIQUVGLzUyNTIvOC81MTYpCi0jIGFncmVlIHRoYXQgdGhlIHVzYWdlIGlzIEJEU1QgKHRoaXMgYXBwZWFycyBpbiBhIG1lc3NhZ2UgZGF0ZWQgMTcgRmViIDE5NDUpLgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgyMDAwLTEwLTAzKToKLSMgT24gMTh0aCBBcHJpbCAxOTQxLCBTaXIgU3RlcGhlbiBUYWxsZW50cyBvZiB0aGUgQkJDIHdyb3RlIHRvIFNpcgotIyBBbGV4YW5kZXIgTWF4d2VsbCBvZiB0aGUgSG9tZSBPZmZpY2UgYXNraW5nIHdoZXRoZXIgdGhlcmUgd2FzIGFueQotIyBvZmZpY2lhbCBkZXNpZ25hdGlvbjsgdGhlIHJlcGx5IG9mIHRoZSAyMXN0IHdhcyB0aGF0IHRoZXJlIHdhc24ndAotIyBidXQgaGUgY291bGRuJ3QgdGhpbmsgb2YgYW55dGhpbmcgYmV0dGVyIHRoYW4gdGhlICJEb3VibGUgQnJpdGlzaAotIyBTdW1tZXIgVGltZSIgdGhhdCB0aGUgQkJDIGhhZCBiZWVuIHVzaW5nIGluZm9ybWFsbHkuCi0jIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvYmJjLTE5NDEwNDE4LnBuZwotIyBodHRwOi8vc3R1ZGVudC5jdXN1LmNhbS5hYy51ay9+anNtMjgvYnJpdGlzaC10aW1lL2hvLTE5NDEwNDIxLnBuZwotCi0jIEZyb20gU2lyIEFsZXhhbmRlciBNYXh3ZWxsIGluIHRoZSBhYm92ZS1tZW50aW9uZWQgbGV0dGVyICgxOTQxLTA0LTIxKToKLSMgW05dbyBvZmZpY2lhbCBkZXNpZ25hdGlvbiBoYXMgYXMgZmFyIGFzIEkga25vdyBiZWVuIGFkb3B0ZWQgZm9yIHRoZSB0aW1lCi0jIHdoaWNoIGlzIHRvIGJlIGludHJvZHVjZWQgaW4gTWF5Li4uLgotIyBJIGNhbm5vdCB0aGluayBvZiBhbnl0aGluZyBiZXR0ZXIgdGhhbiAiRG91YmxlIEJyaXRpc2ggU3VtbWVyIFRpbWUiCi0jIHdoaWNoIGNvdWxkIG5vdCBiZSBzYWlkIHRvIHJ1biBjb3VudGVyIHRvIGFueSBvZmZpY2lhbCBkZXNjcmlwdGlvbi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTEwLTAyKToKLSMgSG93c2Ugd3JpdGVzIChwIDE1NykgYERCU1QnIHRvbywgYnV0IGBCRFNUJyBzZWVtcyB0byBoYXZlIGJlZW4gY29tbW9uCi0jIGFuZCBmb2xsb3dzIHRoZSBtb3JlIHVzdWFsIGNvbnZlbnRpb24gb2YgcHV0dGluZyB0aGUgbG9jYXRpb24gbmFtZSBmaXJzdCwKLSMgc28gd2UgdXNlIGBCRFNUJy4KLQotIyBQZXRlciBJbGlldmUgKDE5OTgtMDQtMTkpIGRlc2NyaWJlZCBhdCBsZW5ndGgKLSMgdGhlIGhpc3Rvcnkgb2Ygc3VtbWVyIHRpbWUgbGVnaXNsYXRpb24gaW4gdGhlIFVuaXRlZCBLaW5nZG9tLgotIyBTaW5jZSAxOTk4IEpvc2VwaCBTLiBNeWVycyBoYXMgYmVlbiB1cGRhdGluZwotIyBhbmQgZXh0ZW5kaW5nIHRoaXMgbGlzdCwgd2hpY2ggY2FuIGJlIGZvdW5kIGluCi0jIDxhIGhyZWY9Imh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvIj4KLSMgSGlzdG9yeSBvZiBsZWdhbCB0aW1lIGluIEJyaXRhaW4KLSMgPC9hPgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgxOTk4LTAxLTA2KToKLSMKLSMgVGhlIGxlZ2FsIHRpbWUgaW4gdGhlIFVLIG91dHNpZGUgb2Ygc3VtbWVyIHRpbWUgaXMgZGVmaW5pdGVseSBHTVQsIG5vdCBVVEM7Ci0jIHNlZSBMb3JkIFRhbmxhdydzIHNwZWVjaAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxpYW1lbnQudGhlLXN0YXRpb25lcnktb2ZmaWNlLmNvLnVrL3BhL2xkMTk5Njk3L2xkaGFuc3JkL3Bkdm4vbGRzOTcvdGV4dC83MDYxMS0yMC5odG0jNzA2MTEtMjBfaGVhZDAiPgotIyAoTG9yZHMgSGFuc2FyZCAxMSBKdW5lIDE5OTcgY29sdW1ucyA5NjQgdG8gOTc2KQotIyA8L2E+LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIwotIyBGb3IgbGFjayBvZiBvdGhlciBkYXRhLCBmb2xsb3cgU2hhbmtzICYgUG90dGVuZ2VyIGZvciBFaXJlIGluIDE5NDAtMTk0OC4KLSMKLSMgR2l2ZW4gSWxpZXZlIGFuZCBNeWVycydzIGRhdGEsIHRoZSBmb2xsb3dpbmcgY2xhaW1zIGJ5IFNoYW5rcyAmIFBvdHRlbmdlcgotIyBhcmUgaW5jb3JyZWN0OgotIyAgICAgKiBXYWxlcyBkaWQgbm90IHN3aXRjaCBmcm9tIEdNVCB0byBkYXlsaWdodCBzYXZpbmcgdGltZSB1bnRpbAotIwkxOTIxIEFwciAzLCB3aGVuIHRoZXkgYmVnYW4gdG8gY29uZm9ybSB3aXRoIHRoZSByZXN0IG9mIEdyZWF0IEJyaXRhaW4uCi0jIEFjdHVhbGx5LCBXYWxlcyB3YXMgaWRlbnRpY2FsIGFmdGVyIDE4ODAuCi0jICAgICAqIEVpcmUgaGFkIHR3byB0cmFuc2l0aW9ucyBvbiAxOTE2IE9jdCAxLgotIyBJdCBhY3R1YWxseSBqdXN0IGhhZCBvbmUgdHJhbnNpdGlvbi4KLSMgICAgICogTm9ydGhlcm4gSXJlbGFuZCB1c2VkIHNpbmdsZSBkYXlsaWdodCBzYXZpbmcgdGltZSB0aHJvdWdob3V0IFdXIElJLgotIyBBY3R1YWxseSwgaXQgY29uZm9ybWVkIHRvIEJyaXRhaW4uCi0jICAgICAqIEdCLUVpcmUgY2hhbmdlZCBzdGFuZGFyZCB0aW1lIHRvIDEgaG91ciBhaGVhZCBvZiBHTVQgb24gMTk2OC0wMi0xOC4KLSMgQWN0dWFsbHksIHRoYXQgZGF0ZSBzYXcgdGhlIHVzdWFsIHN3aXRjaCB0byBzdW1tZXIgdGltZS4KLSMgU3RhbmRhcmQgdGltZSB3YXMgbm90IGNoYW5nZWQgdW50aWwgMTk2OC0xMC0yNyAodGhlIGNsb2NrcyBkaWRuJ3QgY2hhbmdlKS4KLSMKLSMgSGVyZSBpcyBhbm90aGVyIGluY29ycmVjdCBjbGFpbSBieSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jICAgICAqIEplcnNleSwgR3Vlcm5zZXksIGFuZCB0aGUgSXNsZSBvZiBNYW4gZGlkIG5vdCBzd2l0Y2ggZnJvbSBHTVQKLSMJdG8gZGF5bGlnaHQgc2F2aW5nIHRpbWUgdW50aWwgMTkyMSBBcHIgMywgd2hlbiB0aGV5IGJlZ2FuIHRvCi0jCWNvbmZvcm0gd2l0aCBHcmVhdCBCcml0YWluLgotIyBTLlIuJk8uIDE5MTYsIE5vLiAzODIgYW5kIEhPIDQ1LzEwODExLzMxMjM2NCAocXVvdGVkIGFib3ZlKSBzYXkgb3RoZXJ3aXNlLgotIwotIyBUaGUgZm9sbG93aW5nIGNsYWltIGJ5IFNoYW5rcyAmIFBvdHRlbmdlciBpcyBwb3NzaWJsZSB0aG91Z2ggZG91YnRmdWw7Ci0jIHdlJ2xsIGlnbm9yZSBpdCBmb3Igbm93LgotIyAgICAgKiBEdWJsaW4ncyAxOTcxLTEwLTMxIHN3aXRjaCB3YXMgYXQgMDI6MDAsIGV2ZW4gdGhvdWdoIExvbmRvbidzIHdhcyAwMzowMC4KLSMKLSMKLSMgV2hpdG1hbiBzYXlzIER1YmxpbiBNZWFuIFRpbWUgd2FzIC0wOjI1OjIxLCB3aGljaCBpcyBtb3JlIHByZWNpc2UgdGhhbgotIyBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFBlcmhhcHMgdGhpcyB3YXMgRHVuc2luayBPYnNlcnZhdG9yeSBUaW1lLCBhcyBEdW5zaW5rIE9ic2VydmF0b3J5Ci0jICg4IGttIE5XIG9mIER1YmxpbidzIGNlbnRlcikgc2VlbWluZ2x5IHdhcyB0byBEdWJsaW4gYXMgR3JlZW53aWNoIHdhcwotIyB0byBMb25kb24uICBGb3IgZXhhbXBsZToKLSMKLSMgICAiVGltZWJhbGwgb24gdGhlIGJhbGxhc3Qgb2ZmaWNlIGlzIGRvd24uICBEdW5zaW5rIHRpbWUuIgotIyAgIC0tIEphbWVzIEpveWNlLCBVbHlzc2VzCi0KLSMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDIwMDUtMDEtMjYpOgotIyBJcmlzaCBsYXdzIGFyZSBhdmFpbGFibGUgb25saW5lIGF0IHd3dy5pcmlzaHN0YXR1dGVib29rLmllLiAgVGhlc2UgaW5jbHVkZQotIyB2YXJpb3VzIHJlbGF0aW5nIHRvIGxlZ2FsIHRpbWUsIGZvciBleGFtcGxlOgotIwotIyBaWkExM1kxOTIzLmh0bWwgWlpBMTJZMTkyNC5odG1sIFpaQThZMTkyNS5odG1sIFpaU0lWMjBQRzEyNjcuaHRtbAotIwotIyBaWlNJNzFZMTk0Ny5odG1sIFpaU0kxMjhZMTk0OC5odG1sIFpaU0kyM1kxOTQ5Lmh0bWwgWlpTSTQxWTE5NTAuaHRtbAotIyBaWlNJMjdZMTk1MS5odG1sIFpaU0k3M1kxOTUyLmh0bWwKLSMKLSMgWlpTSTExWTE5NjEuaHRtbCBaWlNJMjMyWTE5NjEuaHRtbCBaWlNJMTgyWTE5NjIuaHRtbAotIyBaWlNJMTY3WTE5NjMuaHRtbCBaWlNJMjU3WTE5NjQuaHRtbCBaWlNJMTk4WTE5NjcuaHRtbAotIyBaWkEyM1kxOTY4Lmh0bWwgWlpBMTdZMTk3MS5odG1sCi0jCi0jIFpaU0k2N1kxOTgxLmh0bWwgWlpTSTIxMlkxOTgyLmh0bWwgWlpTSTQ1WTE5ODYuaHRtbAotIyBaWlNJMjY0WTE5ODguaHRtbCBaWlNJNTJZMTk5MC5odG1sIFpaU0kzNzFZMTk5Mi5odG1sCi0jIFpaU0kzOTVZMTk5NC5odG1sIFpaU0k0ODRZMTk5Ny5odG1sIFpaU0k1MDZZMjAwMS5odG1sCi0jCi0jIFtUaGVzZSBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZSByb290LCBlLmcuLCB0aGUgZmlyc3QgaXMKLSMgPGh0dHA6Ly93d3cuaXJpc2hzdGF0dXRlYm9vay5pZS9aWkExM1kxOTIzLmh0bWw+Ll0KLSMKLSMgKFRoZXNlIGFyZSB0aG9zZSBJIGZvdW5kLCBidXQgdGhlcmUgY291bGQgYmUgbW9yZS4gIEluIGFueSBjYXNlIHRoZXNlCi0jIHNob3VsZCBhbGxvdyB2YXJpb3VzIHVwZGF0ZXMgdG8gdGhlIGNvbW1lbnRzIGluIHRoZSBldXJvcGUgZmlsZSB0byBjb3ZlcgotIyB0aGUgbGF3cyBhcHBsaWNhYmxlIGluIElyZWxhbmQuKQotIwotIyAoTm90ZSB0aGF0IHRoZSB0aW1lIGluIHRoZSBSZXB1YmxpYyBvZiBJcmVsYW5kIHNpbmNlIDE5NjggaGFzIGJlZW4gZGVmaW5lZAotIyBpbiB0ZXJtcyBvZiBzdGFuZGFyZCB0aW1lIGJlaW5nIEdNVCsxIHdpdGggYSBwZXJpb2Qgb2Ygd2ludGVyIHRpbWUgd2hlbiBpdAotIyBpcyBHTVQsIHJhdGhlciB0aGFuIHN0YW5kYXJkIHRpbWUgYmVpbmcgR01UIHdpdGggYSBwZXJpb2Qgb2Ygc3VtbWVyIHRpbWUKLSMgYmVpbmcgR01UKzEuKQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjgpOgotIyBDbGl2ZSBGZWF0aGVyICg8bmV3czo4NTk4NDU3MDYuMjYwNDMuMEBvZmZpY2UuZGVtb24ubmV0PiwgMTk5Ny0wMy0zMSkKLSMgcmVwb3J0cyB0aGF0IEZvbGtlc3RvbmUgKENoZXJpdG9uKSBTaHV0dGxlIFRlcm1pbmFsIHVzZXMgQ29uY2Vzc2lvbiBUaW1lCi0jIChDVCksIGVxdWl2YWxlbnQgdG8gRnJlbmNoIGNpdmlsIHRpbWUuCi0jIEp1bGlhbiBIaWxsICg8bmV3czozNjExODEyOC41QTE0QHZpcmdpbi5uZXQ+LCAxOTk4LTA5LTMwKSByZXBvcnRzIHRoYXQKLSMgdHJhaW5zIGJldHdlZW4gRG9sbGFuZHMgTW9vciAodGhlIGZyZWlnaHQgZmFjaWxpdHkgbmV4dCBkb29yKQotIyBhbmQgRnJldGh1biBydW4gaW4gQ1QuCi0jIE15IGFkbWl0dGVkbHkgdW5pbmZvcm1lZCBndWVzcyBpcyB0aGF0IHRoZSB0ZXJtaW5hbCBoYXMgdHdvIGF1dGhvcml0aWVzLAotIyB0aGUgRnJlbmNoIGNvbmNlc3Npb24gb3BlcmF0b3JzIGFuZCB0aGUgQnJpdGlzaCBjaXZpbCBhdXRob3JpdGllcywKLSMgYW5kIHRoYXQgdGhlIHRpbWUgZGVwZW5kcyBvbiB3aG8geW91J3JlIHRhbGtpbmcgdG8uCi0jIElmLCBzYXksIHRoZSBCcml0aXNoIHBvbGljZSB3ZXJlIGNhbGxlZCB0byB0aGUgc3RhdGlvbiBmb3Igc29tZSByZWFzb24sCi0jIEkgd291bGQgZXhwZWN0IHRoZSBvZmZpY2lhbCBwb2xpY2UgcmVwb3J0IHRvIHVzZSBHTVQvQlNUIGFuZCBub3QgQ0VUL0NFU1QuCi0jIFRoaXMgaXMgYSBib3JkZXJsaW5lIGNhc2UsIGJ1dCBmb3Igbm93IGxldCdzIHN0aWNrIHRvIEdNVC9CU1QuCi0KLSMgRnJvbSBhbiBhbm9ueW1vdXMgY29udHJpYnV0b3IgKDE5OTYtMDYtMDIpOgotIyBUaGUgbGF3IGdvdmVybmluZyB0aW1lIGluIElyZWxhbmQgaXMgdW5kZXIgU3RhdHV0b3J5IEluc3RydW1lbnQgU0kgMzk1Lzk0LAotIyB3aGljaCBnaXZlcyBmb3JjZSB0byBFdXJvcGVhbiBVbmlvbiA3dGggQ291bmNpbCBEaXJlY3RpdmUgIyA5NC8yMS9FQy4KLSMgVW5kZXIgdGhpcyBkaXJlY3RpdmUsIHRoZSBNaW5pc3RlciBmb3IgSnVzdGljZSBpbiBJcmVsYW5kIG1ha2VzIGFwcHJvcHJpYXRlCi0jIHJlZ3VsYXRpb25zLiBJIHNwb2tlIHRoaXMgbW9ybmluZyB3aXRoIHRoZSBTZWNyZXRhcnkgb2YgdGhlIERlcGFydG1lbnQgb2YKLSMgSnVzdGljZSAodGVsICszNTMgMSA2NzggOTcxMSkgd2hvIGNvbmZpcm1lZCB0byBtZSB0aGF0IHRoZSBjb3JyZWN0IG5hbWUgaXMKLSMgIklyaXNoIFN1bW1lciBUaW1lIiwgYWJicmV2aWF0ZWQgdG8gIklTVCIuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIFN1bW1lciBUaW1lIEFjdCwgMTkxNgotUnVsZQlHQi1FaXJlCTE5MTYJb25seQktCU1heQkyMQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MTYJb25seQktCU9jdAkgMQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MTcsIE5vLiAzNTgKLVJ1bGUJR0ItRWlyZQkxOTE3CW9ubHkJLQlBcHIJIDgJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTE3CW9ubHkJLQlTZXAJMTcJMjowMHMJMAlHTVQKLSMgUy5SLiZPLiAxOTE4LCBOby4gMjc0Ci1SdWxlCUdCLUVpcmUJMTkxOAlvbmx5CS0JTWFyCTI0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkxOAlvbmx5CS0JU2VwCTMwCTI6MDBzCTAJR01UCi0jIFMuUi4mTy4gMTkxOSwgTm8uIDI5NwotUnVsZQlHQi1FaXJlCTE5MTkJb25seQktCU1hcgkzMAkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MTkJb25seQktCVNlcAkyOQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MjAsIE5vLiA0NTgKLVJ1bGUJR0ItRWlyZQkxOTIwCW9ubHkJLQlNYXIJMjgJMjowMHMJMTowMAlCU1QKLSMgUy5SLiZPLiAxOTIwLCBOby4gMTg0NAotUnVsZQlHQi1FaXJlCTE5MjAJb25seQktCU9jdAkyNQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MjEsIE5vLiAzNjMKLVJ1bGUJR0ItRWlyZQkxOTIxCW9ubHkJLQlBcHIJIDMJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTIxCW9ubHkJLQlPY3QJIDMJMjowMHMJMAlHTVQKLSMgUy5SLiZPLiAxOTIyLCBOby4gMjY0Ci1SdWxlCUdCLUVpcmUJMTkyMglvbmx5CS0JTWFyCTI2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkyMglvbmx5CS0JT2N0CSA4CTI6MDBzCTAJR01UCi0jIFRoZSBTdW1tZXIgVGltZSBBY3QsIDE5MjIKLVJ1bGUJR0ItRWlyZQkxOTIzCW9ubHkJLQlBcHIJU3VuPj0xNgkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjMJMTkyNAktCVNlcAlTdW4+PTE2CTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTkyNAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjUJMTkyNgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi0jIFRoZSBTdW1tZXIgVGltZSBBY3QsIDE5MjUKLVJ1bGUJR0ItRWlyZQkxOTI1CTE5MzgJLQlPY3QJU3VuPj0yCTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTkyNwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjgJMTkyOQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzMAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzEJMTkzMgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzMwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzQJb25seQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzNQlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzYJMTkzNwktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzOAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzkJb25seQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTkzOSwgTm8uIDEzNzkKLVJ1bGUJR0ItRWlyZQkxOTM5CW9ubHkJLQlOb3YJU3VuPj0xNgkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5NDAsIE5vLiAxNzIgYW5kIE5vLiAxODgzCi1SdWxlCUdCLUVpcmUJMTk0MAlvbmx5CS0JRmViCVN1bj49MjMJMjowMHMJMTowMAlCU1QKLSMgUy5SLiZPLiAxOTQxLCBOby4gNDc2Ci1SdWxlCUdCLUVpcmUJMTk0MQlvbmx5CS0JTWF5CVN1bj49MgkxOjAwcwkyOjAwCUJEU1QKLVJ1bGUJR0ItRWlyZQkxOTQxCTE5NDMJLQlBdWcJU3VuPj05CTE6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTk0MiwgTm8uIDUwNgotUnVsZQlHQi1FaXJlCTE5NDIJMTk0NAktCUFwcglTdW4+PTIJMTowMHMJMjowMAlCRFNUCi0jIFMuUi4mTy4gMTk0NCwgTm8uIDkzMgotUnVsZQlHQi1FaXJlCTE5NDQJb25seQktCVNlcAlTdW4+PTE2CTE6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTk0NSwgTm8uIDMxMgotUnVsZQlHQi1FaXJlCTE5NDUJb25seQktCUFwcglNb24+PTIJMTowMHMJMjowMAlCRFNUCi1SdWxlCUdCLUVpcmUJMTk0NQlvbmx5CS0JSnVsCVN1bj49OQkxOjAwcwkxOjAwCUJTVAotIyBTLlIuJk8uIDE5NDUsIE5vLiAxMjA4Ci1SdWxlCUdCLUVpcmUJMTk0NQkxOTQ2CS0JT2N0CVN1bj49MgkyOjAwcwkwCUdNVAotUnVsZQlHQi1FaXJlCTE5NDYJb25seQktCUFwcglTdW4+PTkJMjowMHMJMTowMAlCU1QKLSMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTk0NwotUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCU1hcgkxNgkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCUFwcgkxMwkxOjAwcwkyOjAwCUJEU1QKLVJ1bGUJR0ItRWlyZQkxOTQ3CW9ubHkJLQlBdWcJMTAJMTowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTQ3CW9ubHkJLQlOb3YJIDIJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NDggKFMuSS4gMTk0OC80OTUpCi1SdWxlCUdCLUVpcmUJMTk0OAlvbmx5CS0JTWFyCTE0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk0OAlvbmx5CS0JT2N0CTMxCTI6MDBzCTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTQ5IChTLkkuIDE5NDkvMzczKQotUnVsZQlHQi1FaXJlCTE5NDkJb25seQktCUFwcgkgMwkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NDkJb25seQktCU9jdAkzMAkyOjAwcwkwCUdNVAotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk1MCAoUy5JLiAxOTUwLzUxOCkKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NTEgKFMuSS4gMTk1MS80MzApCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTUyIChTLkkuIDE5NTIvNDUxKQotUnVsZQlHQi1FaXJlCTE5NTAJMTk1MgktCUFwcglTdW4+PTE0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk1MAkxOTUyCS0JT2N0CVN1bj49MjEJMjowMHMJMAlHTVQKLSMgcmV2ZXJ0IHRvIHRoZSBydWxlcyBvZiB0aGUgU3VtbWVyIFRpbWUgQWN0LCAxOTI1Ci1SdWxlCUdCLUVpcmUJMTk1Mwlvbmx5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTUzCTE5NjAJLQlPY3QJU3VuPj0yCTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTk1NAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NTUJMTk1NgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk1Nwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NTgJMTk1OQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk2MAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2MSAoUy5JLiAxOTYxLzcxKQotIyBTdW1tZXIgVGltZSAoMTk2MikgT3JkZXIsIDE5NjEgKFMuSS4gMTk2MS8yNDY1KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2MyAoUy5JLiAxOTYzLzgxKQotUnVsZQlHQi1FaXJlCTE5NjEJMTk2MwktCU1hcglsYXN0U3VuCTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk2MQkxOTY4CS0JT2N0CVN1bj49MjMJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgKDE5NjQpIE9yZGVyLCAxOTYzIChTLkkuIDE5NjMvMjEwMSkKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NjQgKFMuSS4gMTk2NC8xMjAxKQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2NyAoUy5JLiAxOTY3LzExNDgpCi1SdWxlCUdCLUVpcmUJMTk2NAkxOTY3CS0JTWFyCVN1bj49MTkJMjowMHMJMTowMAlCU1QKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NjggKFMuSS4gMTk2OC8xMTcpCi1SdWxlCUdCLUVpcmUJMTk2OAlvbmx5CS0JRmViCTE4CTI6MDBzCTE6MDAJQlNUCi0jIFRoZSBCcml0aXNoIFN0YW5kYXJkIFRpbWUgQWN0LCAxOTY4Ci0jCShubyBzdW1tZXIgdGltZSkKLSMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTk3MgotUnVsZQlHQi1FaXJlCTE5NzIJMTk4MAktCU1hcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk3MgkxOTgwCS0JT2N0CVN1bj49MjMJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5ODAgKFMuSS4gMTk4MC8xMDg5KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk4MiAoUy5JLiAxOTgyLzE2NzMpCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTg2IChTLkkuIDE5ODYvMjIzKQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk4OCAoUy5JLiAxOTg4LzkzMSkKLVJ1bGUJR0ItRWlyZQkxOTgxCTE5OTUJLQlNYXIJbGFzdFN1bgkxOjAwdQkxOjAwCUJTVAotUnVsZQlHQi1FaXJlIDE5ODEJMTk4OQktCU9jdAlTdW4+PTIzCTE6MDB1CTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTg5IChTLkkuIDE5ODkvOTg1KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk5MiAoUy5JLiAxOTkyLzE3MjkpCi0jIFN1bW1lciBUaW1lIE9yZGVyIDE5OTQgKFMuSS4gMTk5NC8yNzk4KQotUnVsZQlHQi1FaXJlIDE5OTAJMTk5NQktCU9jdAlTdW4+PTIyCTE6MDB1CTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyIDE5OTcgKFMuSS4gMTk5Ny8yOTgyKQotIyBTZWUgRVUgZm9yIHJ1bGVzIHN0YXJ0aW5nIGluIDE5OTYuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0xvbmRvbgktMDowMToxNSAtCUxNVAkxODQ3IERlYyAgMSAwOjAwcwotCQkJIDA6MDAJR0ItRWlyZQklcwkxOTY4IE9jdCAyNwotCQkJIDE6MDAJLQlCU1QJMTk3MSBPY3QgMzEgMjowMHUKLQkJCSAwOjAwCUdCLUVpcmUJJXMJMTk5NgotCQkJIDA6MDAJRVUJR01UL0JTVAotTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9KZXJzZXkKLUxpbmsJRXVyb3BlL0xvbmRvbglFdXJvcGUvR3Vlcm5zZXkKLUxpbmsJRXVyb3BlL0xvbmRvbglFdXJvcGUvSXNsZV9vZl9NYW4KLVpvbmUJRXVyb3BlL0R1YmxpbgktMDoyNTowMCAtCUxNVAkxODgwIEF1ZyAgMgotCQkJLTA6MjU6MjEgLQlETVQJMTkxNiBNYXkgMjEgMjowMAotCQkJLTA6MjU6MjEgMTowMAlJU1QJMTkxNiBPY3QgIDEgMjowMHMKLQkJCSAwOjAwCUdCLUVpcmUJJXMJMTkyMSBEZWMgIDYgIyBpbmRlcGVuZGVuY2UKLQkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTQwIEZlYiAyNSAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ2IE9jdCAgNiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ3IE1hciAxNiAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ3IE5vdiAgMiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ4IEFwciAxOCAyOjAwCi0JCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk2OCBPY3QgMjcKLQkJCSAxOjAwCS0JSVNUCTE5NzEgT2N0IDMxIDI6MDB1Ci0JCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk5NgotCQkJIDA6MDAJRVUJR01UL0lTVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRXVyb3BlCi0KLSMgRVUgcnVsZXMgYXJlIGZvciB0aGUgRXVyb3BlYW4gVW5pb24sIHByZXZpb3VzbHkga25vd24gYXMgdGhlIEVDLCBFRUMsCi0jIENvbW1vbiBNYXJrZXQsIGV0Yy4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRVUJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMTowMHUJMTowMAlTCi1SdWxlCUVVCTE5NzcJb25seQktCVNlcAlsYXN0U3VuCSAxOjAwdQkwCS0KLVJ1bGUJRVUJMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwdQkwCS0KLVJ1bGUJRVUJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDE6MDB1CTAJLQotUnVsZQlFVQkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAxOjAwdQkxOjAwCVMKLVJ1bGUJRVUJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMTowMHUJMAktCi0jIFRoZSBtb3N0IHJlY2VudCBkaXJlY3RpdmUgY292ZXJzIHRoZSB5ZWFycyBzdGFydGluZyBpbiAyMDAyLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vZXVyb3BhLmV1LmludC9ldXItbGV4L2VuL2xpZi9kYXQvMjAwMC9lbl8zMDBMMDA4NC5odG1sIj4KLSMgRGlyZWN0aXZlIDIwMDAvODQvRUMgb2YgdGhlIEV1cm9wZWFuIFBhcmxpYW1lbnQgYW5kIG9mIHRoZSBDb3VuY2lsCi0jIG9mIDE5IEphbnVhcnkgMjAwMSBvbiBzdW1tZXItdGltZSBhcnJhbmdlbWVudHMuCi0jIDwvYT4KLQotIyBXLUV1ciBkaWZmZXJzIGZyb20gRVUgb25seSBpbiB0aGF0IFctRXVyIHVzZXMgc3RhbmRhcmQgdGltZS4KLVJ1bGUJVy1FdXIJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMTowMHMJMTowMAlTCi1SdWxlCVctRXVyCTE5NzcJb25seQktCVNlcAlsYXN0U3VuCSAxOjAwcwkwCS0KLVJ1bGUJVy1FdXIJMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwcwkwCS0KLVJ1bGUJVy1FdXIJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDE6MDBzCTAJLQotUnVsZQlXLUV1cgkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAxOjAwcwkxOjAwCVMKLVJ1bGUJVy1FdXIJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMTowMHMJMAktCi0KLSMgT2xkZXIgQy1FdXIgcnVsZXMgYXJlIGZvciBjb252ZW5pZW5jZSBpbiB0aGUgdGFibGVzLgotIyBGcm9tIDE5Nzcgb24sIEMtRXVyIGRpZmZlcnMgZnJvbSBFVSBvbmx5IGluIHRoYXQgQy1FdXIgdXNlcyBzdGFuZGFyZCB0aW1lLgotUnVsZQlDLUV1cgkxOTE2CW9ubHkJLQlBcHIJMzAJMjM6MDAJMTowMAlTCi1SdWxlCUMtRXVyCTE5MTYJb25seQktCU9jdAkgMQkgMTowMAkwCS0KLVJ1bGUJQy1FdXIJMTkxNwkxOTE4CS0JQXByCU1vbj49MTUJIDI6MDBzCTE6MDAJUwotUnVsZQlDLUV1cgkxOTE3CTE5MTgJLQlTZXAJTW9uPj0xNQkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NDAJb25seQktCUFwcgkgMQkgMjowMHMJMTowMAlTCi1SdWxlCUMtRXVyCTE5NDIJb25seQktCU5vdgkgMgkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NDMJb25seQktCU1hcgkyOQkgMjowMHMJMTowMAlTCi1SdWxlCUMtRXVyCTE5NDMJb25seQktCU9jdAkgNAkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NDQJMTk0NQktCUFwcglNb24+PTEJIDI6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5NDQgT2N0IDc7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlDLUV1cgkxOTQ0CW9ubHkJLQlPY3QJIDIJIDI6MDBzCTAJLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwOC0wNy0xMyk6Ci0jCi0jIEkgZm91bmQgd2hhdCBpcyBwcm9iYWJseSBhIHR5cG8gb2YgMjowMCB3aGljaCBzaG91bGQgcGVyaGFwcyBiZSAyOjAwcwotIyBpbiB0aGUgQy1FdXIgcnVsZSBmcm9tIHR6IGRhdGFiYXNlIHZlcnNpb24gMjAwOGQgKHRoaXMgcGFydCB3YXMKLSMgY29ycmVjdGVkIGluIHZlcnNpb24gMjAwOGQpLiBUaGUgY2lyY3Vtc3RhbmNpYWwgZXZpZGVuY2UgaXMgc2ltcGx5IHRoZQotIyB0eiBkYXRhYmFzZSBpdHNlbGYsIGFzIHNlZW4gYmVsb3c6Ci0jCi0jIFpvbmUgRXVyb3BlL1BhcmlzIDA6MDk6MjEgLSBMTVQgMTg5MSBNYXIgMTUgIDA6MDEKLSMgICAgMDowMCBGcmFuY2UgV0Ulc1QgMTk0NSBTZXAgMTYgIDM6MDAKLSMKLSMgWm9uZSBFdXJvcGUvTW9uYWNvIDA6Mjk6MzIgLSBMTVQgMTg5MSBNYXIgMTUKLSMgICAgMDowMCBGcmFuY2UgV0Ulc1QgMTk0NSBTZXAgMTYgMzowMAotIwotIyBab25lIEV1cm9wZS9CZWxncmFkZSAxOjIyOjAwIC0gTE1UIDE4ODQKLSMgICAgMTowMCAxOjAwIENFU1QgMTk0NSBTZXAgMTYgIDI6MDBzCi0jCi0jIFJ1bGUgRnJhbmNlIDE5NDUgb25seSAtIFNlcCAxNiAgMzowMCAwIC0KLSMgUnVsZSBCZWxnaXVtIDE5NDUgb25seSAtIFNlcCAxNiAgMjowMHMgMCAtCi0jIFJ1bGUgTmV0aCAxOTQ1IG9ubHkgLSBTZXAgMTYgMjowMHMgMCAtCi0jCi0jIFRoZSBydWxlIGxpbmUgdG8gYmUgY2hhbmdlZCBpczoKLSMKLSMgUnVsZSBDLUV1ciAxOTQ1IG9ubHkgLSBTZXAgMTYgIDI6MDAgMCAtCi0jCi0jIEl0IHNlZW1zIHRoYXQgUGFyaXMsIE1vbmFjbywgUnVsZSBGcmFuY2UsIFJ1bGUgQmVsZ2l1bSBhbGwgYWdyZWUgb24KLSMgMjowMCBzdGFuZGFyZCB0aW1lLCBlLmcuIDM6MDAgbG9jYWwgdGltZS4gIEhvd2V2ZXIgdGhlcmUgYXJlIG5vCi0jIGNvdW50cmllcyB0aGF0IHVzZSBDLUV1ciBydWxlcyBpbiBTZXB0ZW1iZXIgMTk0NSwgc28gdGhlIG9ubHkgaXRlbXMKLSMgYWZmZWN0ZWQgYXJlIGFwcGFyZW50bHkgdGhlc2UgZmljdGljaW91cyB6b25lcyB0aGF0IHRyYW5zbGF0ZXMgYWNyb255bXMKLSMgQ0VUIGFuZCBNRVQ6Ci0jCi0jIFpvbmUgQ0VUICAxOjAwIEMtRXVyIENFJXNUCi0jIFpvbmUgTUVUICAxOjAwIEMtRXVyIE1FJXNUCi0jCi0jIEl0IHRoaXMgaXMgcmlnaHQgdGhlbiB0aGUgY29ycmVjdGVkIHZlcnNpb24gd291bGQgbG9vayBsaWtlOgotIwotIyBSdWxlIEMtRXVyIDE5NDUgb25seSAtIFNlcCAxNiAgMjowMHMgMCAtCi0jCi0jIEEgc21hbGwgc3RlcCBmb3IgbWFua2luZCB0aG91Z2ggOC0pCi1SdWxlCUMtRXVyCTE5NDUJb25seQktCVNlcAkxNgkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NzcJMTk4MAktCUFwcglTdW4+PTEJIDI6MDBzCTE6MDAJUwotUnVsZQlDLUV1cgkxOTc3CW9ubHkJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NzgJb25seQktCU9jdAkgMQkgMjowMHMJMAktCi1SdWxlCUMtRXVyCTE5NzkJMTk5NQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlCUMtRXVyCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDI6MDBzCTAJLQotCi0jIEUtRXVyIGRpZmZlcnMgZnJvbSBFVSBvbmx5IGluIHRoYXQgRS1FdXIgc3dpdGNoZXMgYXQgbWlkbmlnaHQgbG9jYWwgdGltZS4KLVJ1bGUJRS1FdXIJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMDowMAkxOjAwCVMKLVJ1bGUJRS1FdXIJMTk3Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlCUUtRXVyCTE5NzgJb25seQktCU9jdAkgMQkgMDowMAkwCS0KLVJ1bGUJRS1FdXIJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlCUUtRXVyCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDA6MDAJMTowMAlTCi1SdWxlCUUtRXVyCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDA6MDAJMAktCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVJ1c3NpYQkxOTE3CW9ubHkJLQlKdWwJIDEJMjM6MDAJMTowMAlNU1QJIyBNb3Njb3cgU3VtbWVyIFRpbWUKLVJ1bGUJUnVzc2lhCTE5MTcJb25seQktCURlYwkyOAkgMDowMAkwCU1NVAkjIE1vc2NvdyBNZWFuIFRpbWUKLVJ1bGUJUnVzc2lhCTE5MTgJb25seQktCU1heQkzMQkyMjowMAkyOjAwCU1EU1QJIyBNb3Njb3cgRG91YmxlIFN1bW1lciBUaW1lCi1SdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlTZXAJMTYJIDE6MDAJMTowMAlNU1QKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCU1heQkzMQkyMzowMAkyOjAwCU1EU1QKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCUp1bAkgMQkgMjowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCUF1ZwkxNgkgMDowMAkwCS0KLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCUZlYgkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCU1hcgkyMAkyMzowMAkyOjAwCU0gIyBNaWRzdW1tZXIKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCVNlcAkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCU9jdAkgMQkgMDowMAkwCS0KLSMgQWN0IE5vLjkyNSBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgdGhlIFVTU1IgKDE5ODAtMTAtMjQpOgotUnVsZQlSdXNzaWEJMTk4MQkxOTg0CS0JQXByCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlSdXNzaWEJMTk4MQkxOTgzCS0JT2N0CSAxCSAwOjAwCTAJLQotIyBBY3QgTm8uOTY3IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiB0aGUgVVNTUiAoMTk4NC0wOS0xMyksIHJlcGVhdGVkIGluCi0jIEFjdCBOby4yMjcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIHRoZSBVU1NSICgxOTg5LTAzLTE0KToKLVJ1bGUJUnVzc2lhCTE5ODQJMTk5MQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLVJ1bGUJUnVzc2lhCTE5ODUJMTk5MQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLSMKLVJ1bGUJUnVzc2lhCTE5OTIJb25seQktCU1hcglsYXN0U2F0CSAyMzowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5OTIJb25seQktCVNlcAlsYXN0U2F0CSAyMzowMAkwCS0KLVJ1bGUJUnVzc2lhCTE5OTMJbWF4CS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUwotUnVsZQlSdXNzaWEJMTk5MwkxOTk1CS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZQlSdXNzaWEJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCi0KLSMgVGhlc2UgYXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJV0VUCQkwOjAwCUVVCVdFJXNUCi1ab25lCUNFVAkJMTowMAlDLUV1cglDRSVzVAotWm9uZQlNRVQJCTE6MDAJQy1FdXIJTUUlc1QKLVpvbmUJRUVUCQkyOjAwCUVVCUVFJXNUCi0KLSMgUHJldmlvdXMgZWRpdGlvbnMgb2YgdGhpcyBkYXRhYmFzZSB1c2VkIGFiYnJldmlhdGlvbnMgbGlrZSBNRVQgRFNUCi0jIGZvciBDZW50cmFsIEV1cm9wZWFuIFN1bW1lciBUaW1lLCBidXQgdGhpcyBkaWRuJ3QgYWdyZWUgd2l0aCBjb21tb24gdXNhZ2UuCi0KLSMgRnJvbSBNYXJrdXMgS3VobiAoMTk5Ni0wNy0xMik6Ci0jIFRoZSBvZmZpY2lhbCBHZXJtYW4gbmFtZXMgLi4uIGFyZQotIwotIwlNaXR0ZWxldXJvcGFlaXNjaGUgWmVpdCAoTUVaKSAgICAgICAgID0gVVRDKzAxOjAwCi0jCU1pdHRlbGV1cm9wYWVpc2NoZSBTb21tZXJ6ZWl0IChNRVNaKSAgPSBVVEMrMDI6MDAKLSMKLSMgYXMgZGVmaW5lZCBpbiB0aGUgR2VybWFuIFRpbWUgQWN0IChHZXNldHogdWViZXIgZGllIFplaXRiZXN0aW1tdW5nIChaZWl0RyksCi0jIDE5NzgtMDctMjUsIEJ1bmRlc2dlc2V0emJsYXR0LCBKYWhyZ2FuZyAxOTc4LCBUZWlsIEksIFMuIDExMTAtMTExMSkuLi4uCi0jIEkgd3JvdGUgLi4uIHRvIHRoZSBHZXJtYW4gRmVkZXJhbCBQaHlzaWNhbC1UZWNobmljYWwgSW5zdGl0dXRpb24KLSMKLSMJUGh5c2lrYWxpc2NoLVRlY2huaXNjaGUgQnVuZGVzYW5zdGFsdCAoUFRCKQotIwlMYWJvcmF0b3JpdW0gNC40MSAiWmVpdGVpbmhlaXQiCi0jCVBvc3RmYWNoIDMzNDUKLSMJRC0zODAyMyBCcmF1bnNjaHdlaWcKLSMJcGhvbmU6ICs0OSA1MzEgNTkyLTAKLSMKLSMgLi4uIEkgcmVjZWl2ZWQgdG9kYXkgYW4gYW5zd2VyIGxldHRlciBmcm9tIERyLiBQZXRlciBIZXR6ZWwsIGhlYWQgb2YgdGhlIFBUQgotIyBkZXBhcnRtZW50IGZvciB0aW1lIGFuZCBmcmVxdWVuY3kgdHJhbnNtaXNzaW9uLiAgSGUgZXhwbGFpbmVkIHRoYXQgdGhlCi0jIFBUQiB0cmFuc2xhdGVzIE1FWiBhbmQgTUVTWiBpbnRvIEVuZ2xpc2ggYXMKLSMKLSMJQ2VudHJhbCBFdXJvcGVhbiBUaW1lIChDRVQpICAgICAgICAgPSBVVEMrMDE6MDAKLSMJQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSAoQ0VTVCkgPSBVVEMrMDI6MDAKLQotCi0jIEFsYmFuaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFsYmFuaWEJMTk0MAlvbmx5CS0JSnVuCTE2CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk0Mglvbmx5CS0JTm92CSAyCTM6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk0Mwlvbmx5CS0JTWFyCTI5CTI6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk0Mwlvbmx5CS0JQXByCTEwCTM6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3NAlvbmx5CS0JTWF5CSA0CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3NAlvbmx5CS0JT2N0CSAyCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3NQlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3NQlvbmx5CS0JT2N0CSAyCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3Nglvbmx5CS0JTWF5CSAyCTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3Nglvbmx5CS0JT2N0CSAzCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3Nwlvbmx5CS0JTWF5CSA4CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3Nwlvbmx5CS0JT2N0CSAyCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3OAlvbmx5CS0JTWF5CSA2CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3OAlvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk3OQlvbmx5CS0JTWF5CSA1CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk3OQlvbmx5CS0JU2VwCTMwCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk4MAlvbmx5CS0JTWF5CSAzCTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk4MAlvbmx5CS0JT2N0CSA0CTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk4MQlvbmx5CS0JQXByCTI2CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk4MQlvbmx5CS0JU2VwCTI3CTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk4Mglvbmx5CS0JTWF5CSAyCTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk4Mglvbmx5CS0JT2N0CSAzCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk4Mwlvbmx5CS0JQXByCTE4CTA6MDAJMTowMAlTCi1SdWxlCUFsYmFuaWEJMTk4Mwlvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCUFsYmFuaWEJMTk4NAlvbmx5CS0JQXByCSAxCTA6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9UaXJhbmUJMToxOToyMCAtCUxNVAkxOTE0Ci0JCQkxOjAwCS0JQ0VUCTE5NDAgSnVuIDE2Ci0JCQkxOjAwCUFsYmFuaWEJQ0Ulc1QJMTk4NCBKdWwKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBBbmRvcnJhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9BbmRvcnJhCTA6MDY6MDQgLQlMTVQJMTkwMQotCQkJMDowMAktCVdFVAkxOTQ2IFNlcCAzMAotCQkJMTowMAktCUNFVAkxOTg1IE1hciAzMSAyOjAwCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgQXVzdHJpYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOiBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTE4LTA2LTE2IGFuZAotIyAxOTQ1LTExLTE4LCBidXQgdGhlIEF1c3RyaWFuIEZlZGVyYWwgT2ZmaWNlIG9mIE1ldHJvbG9neSBhbmQKLSMgU3VydmV5aW5nIChCRVYpIGdpdmVzIDE5MTgtMDktMTYgYW5kIGZvciBWaWVubmEgZ2l2ZXMgdGhlICJhbGxlZ2VkIgotIyBkYXRlIG9mIDE5NDUtMDQtMTIgd2l0aCBubyB0aW1lLiAgRm9yIHRoZSAxOTgwLTA0LTA2IHRyYW5zaXRpb24KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMDI6MDAsIHRoZSBCRVYgMDA6MDAuICBHbyB3aXRoIHRoZSBCRVYsCi0jIGFuZCBndWVzcyAwMjowMCBmb3IgMTk0NS0wNC0xMi4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQXVzdHJpYQkxOTIwCW9ubHkJLQlBcHIJIDUJMjowMHMJMTowMAlTCi1SdWxlCUF1c3RyaWEJMTkyMAlvbmx5CS0JU2VwCTEzCTI6MDBzCTAJLQotUnVsZQlBdXN0cmlhCTE5NDYJb25seQktCUFwcgkxNAkyOjAwcwkxOjAwCVMKLVJ1bGUJQXVzdHJpYQkxOTQ2CTE5NDgJLQlPY3QJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBdXN0cmlhCTE5NDcJb25seQktCUFwcgkgNgkyOjAwcwkxOjAwCVMKLVJ1bGUJQXVzdHJpYQkxOTQ4CW9ubHkJLQlBcHIJMTgJMjowMHMJMTowMAlTCi1SdWxlCUF1c3RyaWEJMTk4MAlvbmx5CS0JQXByCSA2CTA6MDAJMTowMAlTCi1SdWxlCUF1c3RyaWEJMTk4MAlvbmx5CS0JU2VwCTI4CTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9WaWVubmEJMTowNToyMCAtCUxNVAkxODkzIEFwcgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTIwCi0JCQkxOjAwCUF1c3RyaWEJQ0Ulc1QJMTk0MCBBcHIgIDEgMjowMHMKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMHMKLQkJCTE6MDAJMTowMAlDRVNUCTE5NDUgQXByIDEyIDI6MDBzCi0JCQkxOjAwCS0JQ0VUCTE5NDYKLQkJCTE6MDAJQXVzdHJpYQlDRSVzVAkxOTgxCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgQmVsYXJ1cwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvTWluc2sJMTo1MDoxNiAtCUxNVAkxODgwCi0JCQkxOjUwCS0JTU1UCTE5MjQgTWF5IDIgIyBNaW5zayBNZWFuIFRpbWUKLQkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKLQkJCTM6MDAJLQlNU0sJMTk0MSBKdW4gMjgKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBKdWwgIDMKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkxIE1hciAzMSAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMjowMHMKLQkJCTI6MDAJLQlFRVQJMTk5MiBNYXIgMjkgMDowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5OTIgU2VwIDI3IDA6MDBzCi0JCQkyOjAwCVJ1c3NpYQlFRSVzVAotCi0jIEJlbGdpdW0KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ny0wNy0wMik6Ci0jIEVudHJpZXMgZnJvbSAxOTE4IHRocm91Z2ggMTk5MSBhcmUgdGFrZW4gZnJvbToKLSMJQW5udWFpcmUgZGUgTCdPYnNlcnZhdG9pcmUgUm95YWwgZGUgQmVsZ2lxdWUsCi0jCUF2ZW51ZSBDaXJjdWxhaXJlLCAzLCBCLTExODAgQlJVWEVMTEVTLCBDTFZJSWUgYW5uZWUsIDE5OTEKLSMJKEltcHJpbWVyaWUgSEFZRVosIHMucC5yLmwuLCBSdWUgRmluLCA0LCAxMDgwIEJSVVhFTExFUywgTUNNWEMpLAotIwlwcCA4LTkuCi0jIExNVCBiZWZvcmUgMTg5MiB3YXMgMDoxNzozMCwgYWNjb3JkaW5nIHRvIHRoZSBvZmZpY2lhbCBqb3VybmFsIG9mIEJlbGdpdW06Ci0jCU1vbml0ZXVyIEJlbGdlLCBTYW1lZGkgMzAgQXZyaWwgMTg5MiwgTi4xMjEuCi0jIFRoYW5rcyB0byBQYXNjYWwgRGVsbW9pdGllIGZvciB0aGVzZSByZWZlcmVuY2VzLgotIyBUaGUgMTkxOCBydWxlcyBhcmUgbGlzdGVkIGZvciBjb21wbGV0ZW5lc3M7IHRoZXkgYXBwbHkgdG8gdW5vY2N1cGllZCBCZWxnaXVtLgotIyBBc3N1bWUgQnJ1c3NlbHMgc3dpdGNoZWQgdG8gV0VUIGluIDE5MTggd2hlbiB0aGUgYXJtaXN0aWNlIHRvb2sgZWZmZWN0LgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQmVsZ2l1bQkxOTE4CW9ubHkJLQlNYXIJIDkJIDA6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MTgJMTkxOQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5MTkJb25seQktCU1hcgkgMQkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTIwCW9ubHkJLQlPY3QJMjMJMjM6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5MjEJb25seQktCU1hcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyMQlvbmx5CS0JT2N0CTI1CTIzOjAwcwkwCS0KLVJ1bGUJQmVsZ2l1bQkxOTIyCW9ubHkJLQlNYXIJMjUJMjM6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MjIJMTkyNwktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5MjMJb25seQktCUFwcgkyMQkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyNAlvbmx5CS0JTWFyCTI5CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTI1CW9ubHkJLQlBcHIJIDQJMjM6MDBzCTE6MDAJUwotIyBEU0ggd3JpdGVzIHRoYXQgYSByb3lhbCBkZWNyZWUgb2YgMTkyNi0wMi0yMiBzcGVjaWZpZWQgdGhlIFN1biBmb2xsb3dpbmcgM3JkCi0jIFNhdCBpbiBBcHIgKGV4Y2VwdCBpZiBpdCdzIEVhc3RlciwgaW4gd2hpY2ggY2FzZSBpdCdzIG9uZSBTdW5kYXkgZWFybGllciksCi0jIHRvIFN1biBmb2xsb3dpbmcgMXN0IFNhdCBpbiBPY3QsIGFuZCB0aGF0IGEgcm95YWwgZGVjcmVlIG9mIDE5MjgtMDktMTUKLSMgY2hhbmdlZCB0aGUgdHJhbnNpdGlvbiB0aW1lcyB0byAwMjowMCBHTVQuCi1SdWxlCUJlbGdpdW0JMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MjgJb25seQktCUFwcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyOAkxOTM4CS0JT2N0CVN1bj49MgkgMjowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTkyOQlvbmx5CS0JQXByCTIxCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTMwCW9ubHkJLQlBcHIJMTMJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzEJb25seQktCUFwcgkxOQkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzMglvbmx5CS0JQXByCSAzCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTMzCW9ubHkJLQlNYXIJMjYJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzQJb25seQktCUFwcgkgOAkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzNQlvbmx5CS0JTWFyCTMxCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTM2CW9ubHkJLQlBcHIJMTkJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzcJb25seQktCUFwcgkgNAkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzOAlvbmx5CS0JTWFyCTI3CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTM5CW9ubHkJLQlBcHIJMTYJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzkJb25seQktCU5vdgkxOQkgMjowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTk0MAlvbmx5CS0JRmViCTI1CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTQ0CW9ubHkJLQlTZXAJMTcJIDI6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5NDUJb25seQktCUFwcgkgMgkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTk0NQlvbmx5CS0JU2VwCTE2CSAyOjAwcwkwCS0KLVJ1bGUJQmVsZ2l1bQkxOTQ2CW9ubHkJLQlNYXkJMTkJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5NDYJb25seQktCU9jdAkgNwkgMjowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9CcnVzc2VscwkwOjE3OjMwIC0JTE1UCTE4ODAKLQkJCTA6MTc6MzAJLQlCTVQJMTg5MiBNYXkgIDEgMTI6MDAgIyBCcnVzc2VscyBNVAotCQkJMDowMAktCVdFVAkxOTE0IE5vdiAgOAotCQkJMTowMAktCUNFVAkxOTE2IE1heSAgMSAgMDowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4IE5vdiAxMSAxMTowMHUKLQkJCTA6MDAJQmVsZ2l1bQlXRSVzVAkxOTQwIE1heSAyMCAgMjowMHMKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBTZXAgIDMKLQkJCTE6MDAJQmVsZ2l1bQlDRSVzVAkxOTc3Ci0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQotIyBzZWUgU2VyYmlhCi0KLSMgQnVsZ2FyaWEKLSMKLSMgRnJvbSBQbGFtZW4gU2ltZW5vdiB2aWEgU3RlZmZlbiBUaG9yc2VuICgxOTk5LTA5LTA5KToKLSMgQSBkb2N1bWVudCBvZiBHb3Zlcm5tZW50IG9mIEJ1bGdhcmlhIChOby45NC8xOTk3KSBzYXlzOgotIyBFRVQgLS0+IEVFVERTVCBpcyBpbiAwMzowMCBMb2NhbCB0aW1lIGluIGxhc3QgU3VuZGF5IG9mIE1hcmNoIC4uLgotIyBFRVREU1QgLS0+IEVFVCBpcyBpbiAwNDowMCBMb2NhbCB0aW1lIGluIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIKLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUJ1bGcJMTk3OQlvbmx5CS0JTWFyCTMxCTIzOjAwCTE6MDAJUwotUnVsZQlCdWxnCTE5NzkJb25seQktCU9jdAkgMQkgMTowMAkwCS0KLVJ1bGUJQnVsZwkxOTgwCTE5ODIJLQlBcHIJU2F0Pj0xCTIzOjAwCTE6MDAJUwotUnVsZQlCdWxnCTE5ODAJb25seQktCVNlcAkyOQkgMTowMAkwCS0KLVJ1bGUJQnVsZwkxOTgxCW9ubHkJLQlTZXAJMjcJIDI6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9Tb2ZpYQkxOjMzOjE2IC0JTE1UCTE4ODAKLQkJCTE6NTY6NTYJLQlJTVQJMTg5NCBOb3YgMzAgIyBJc3RhbmJ1bCBNVD8KLQkJCTI6MDAJLQlFRVQJMTk0MiBOb3YgIDIgIDM6MDAKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NQotCQkJMTowMAktCUNFVAkxOTQ1IEFwciAyIDM6MDAKLQkJCTI6MDAJLQlFRVQJMTk3OSBNYXIgMzEgMjM6MDAKLQkJCTI6MDAJQnVsZwlFRSVzVAkxOTgyIFNlcCAyNiAgMjowMAotCQkJMjowMAlDLUV1cglFRSVzVAkxOTkxCi0JCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTcKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBDcm9hdGlhCi0jIHNlZSBTZXJiaWEKLQotIyBDeXBydXMKLSMgUGxlYXNlIHNlZSB0aGUgYGFzaWEnIGZpbGUgZm9yIEFzaWEvTmljb3NpYS4KLQotIyBDemVjaCBSZXB1YmxpYwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ3plY2gJMTk0NQlvbmx5CS0JQXByCSA4CTI6MDBzCTE6MDAJUwotUnVsZQlDemVjaAkxOTQ1CW9ubHkJLQlOb3YJMTgJMjowMHMJMAktCi1SdWxlCUN6ZWNoCTE5NDYJb25seQktCU1heQkgNgkyOjAwcwkxOjAwCVMKLVJ1bGUJQ3plY2gJMTk0NgkxOTQ5CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQ3plY2gJMTk0Nwlvbmx5CS0JQXByCTIwCTI6MDBzCTE6MDAJUwotUnVsZQlDemVjaAkxOTQ4CW9ubHkJLQlBcHIJMTgJMjowMHMJMTowMAlTCi1SdWxlCUN6ZWNoCTE5NDkJb25seQktCUFwcgkgOQkyOjAwcwkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1ByYWd1ZQkwOjU3OjQ0IC0JTE1UCTE4NTAKLQkJCTA6NTc6NDQJLQlQTVQJMTg5MSBPY3QgICAgICMgUHJhZ3VlIE1lYW4gVGltZQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAxNyAyOjAwcwotCQkJMTowMAlDemVjaAlDRSVzVAkxOTc5Ci0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgRGVubWFyaywgRmFyb2UgSXNsYW5kcywgYW5kIEdyZWVubGFuZAotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTA0LTI2KToKLSMgaHR0cDovL3d3dy5odW0uYWF1LmRrL35wb2UvdGlkL3RpbmUvRGFuc2tUaWQuaHRtIHNheXMgdGhhdCB0aGUgbGF3Ci0jIFtpbnRyb2R1Y2luZyBzdGFuZGFyZCB0aW1lXSB3YXMgaW4gZWZmZWN0IGZyb20gMTg5NC0wMS0wMS4uLi4KLSMgVGhlIHBhZ2UgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTg5MzAwMDgzMzAtUkVHTAotIyBjb25maXJtcyB0aGlzLCBhbmQgc3RhdGVzIHRoYXQgdGhlIGxhdyB3YXMgcHV0IGZvcnRoIDE4OTMtMDMtMjkuCi0jCi0jIFRoZSBFVSB0cmVhdHkgd2l0aCBlZmZlY3QgZnJvbSAxOTczOgotIyBodHRwOi8vd3d3LnJldHNpbmZvLmRrL19HRVRET0NJXy9BQ0NOL0ExOTcyMjExMDAzMC1SRUdMCi0jCi0jIFRoaXMgcHJvdm9rZWQgYSBuZXcgbGF3IGZyb20gMTk3NCB0byBtYWtlIHBvc3NpYmxlIHN1bW1lciB0aW1lIGNoYW5nZXMKLSMgaW4gc3Vic2VxdWVuZXQgZGVjcmVlcyB3aXRoIHRoZSBsYXcKLSMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTk3NDAwMjIzMzAtUkVHTAotIwotIyBJdCBzZWVtcyBob3dldmVyIHRoYXQgbm8gZGVjcmVlIHdhcyBzZXQgZm9yd2FyZCB1bnRpbCAxOTgwLiAgSSBoYXZlCi0jIG5vdCBmb3VuZCBhbnkgZGVjcmVlLCBidXQgaW4gYW5vdGhlciByZWxhdGVkIGxhdywgdGhlIGVmZmVjdGluZyBEU1QKLSMgY2hhbmdlcyBhcmUgc3RhdGVkIGV4cGxpY2l0bHkgdG8gYmUgZnJvbSAxOTgwLTA0LTA2IGF0IDAyOjAwIHRvCi0jIDE5ODAtMDktMjggYXQgMDI6MDAuICBJZiB0aGlzIGlzIHRydWUsIHRoaXMgZGlmZmVycyBzbGlnaHRseSBmcm9tCi0jIHRoZSBFVSBydWxlIGluIHRoYXQgRFNUIHJ1bnMgdG8gMDI6MDAsIG5vdCAwMzowMC4gIFdlIGRvbid0IGtub3cKLSMgd2hlbiBEZW5tYXJrIGJlZ2FuIHVzaW5nIHRoZSBFVSBydWxlIGNvcnJlY3RseSwgYnV0IHdlIGhhdmUgb25seQotIyBjb25maXJtYXRpb24gb2YgdGhlIDE5ODAtdGltZSwgc28gSSBwcmVzdW1lIGl0IHdhcyBjb3JyZWN0IGluIDE5ODE6Ci0jIFRoZSBsYXcgaXMgYWJvdXQgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIGV4dHJhIGhvdXIsIGNvbmNlcm5pbmcKLSMgd29ya2luZyBob3VycyByZXBvcnRlZCBhbmQgZWZmZWN0IG9uIG9ibGlnYXRvcnktcmVzdCBydWxlcyAod2hpY2gKLSMgd2FzIHN1c3BlbmRlZCBvbiB0aGF0IG5pZ2h0KToKLSMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9DMTk4MDExMjA1NTQtUkVHTAotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTA2LTExKToKLSMgVGhlIEhlcm5pbmcgRm9sa2VibGFkICgxOTgwLTA5LTI2KSByZXBvcnRlZCB0aGF0IHRoZSBuaWdodCBiZXR3ZWVuCi0jIFNhdHVyZGF5IGFuZCBTdW5kYXkgdGhlIGNsb2NrIGlzIHNldCBiYWNrIGZyb20gdGhyZWUgdG8gdHdvLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDYtMTEpOgotIyBIZW5jZSB0aGUgIjAyOjAwIiBvZiB0aGUgMTk4MCBsYXcgcmVmZXJzIHRvIHN0YW5kYXJkIHRpbWUsIG5vdAotIyB3YWxsLWNsb2NrIHRpbWUsIGFuZCBzbyB0aGUgRVUgcnVsZXMgd2VyZSBpbiBlZmZlY3QgaW4gMTk4MC4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRGVubWFyawkxOTE2CW9ubHkJLQlNYXkJMTQJMjM6MDAJMTowMAlTCi1SdWxlCURlbm1hcmsJMTkxNglvbmx5CS0JU2VwCTMwCTIzOjAwCTAJLQotUnVsZQlEZW5tYXJrCTE5NDAJb25seQktCU1heQkxNQkgMDowMAkxOjAwCVMKLVJ1bGUJRGVubWFyawkxOTQ1CW9ubHkJLQlBcHIJIDIJIDI6MDBzCTE6MDAJUwotUnVsZQlEZW5tYXJrCTE5NDUJb25seQktCUF1ZwkxNQkgMjowMHMJMAktCi1SdWxlCURlbm1hcmsJMTk0Nglvbmx5CS0JTWF5CSAxCSAyOjAwcwkxOjAwCVMKLVJ1bGUJRGVubWFyawkxOTQ2CW9ubHkJLQlTZXAJIDEJIDI6MDBzCTAJLQotUnVsZQlEZW5tYXJrCTE5NDcJb25seQktCU1heQkgNAkgMjowMHMJMTowMAlTCi1SdWxlCURlbm1hcmsJMTk0Nwlvbmx5CS0JQXVnCTEwCSAyOjAwcwkwCS0KLVJ1bGUJRGVubWFyawkxOTQ4CW9ubHkJLQlNYXkJIDkJIDI6MDBzCTE6MDAJUwotUnVsZQlEZW5tYXJrCTE5NDgJb25seQktCUF1ZwkgOAkgMjowMHMJMAktCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEV1cm9wZS9Db3BlbmhhZ2VuCSAwOjUwOjIwIC0JTE1UCTE4OTAKLQkJCSAwOjUwOjIwIC0JQ01UCTE4OTQgSmFuICAxICMgQ29wZW5oYWdlbiBNVAotCQkJIDE6MDAJRGVubWFyawlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcwotCQkJIDE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMAotCQkJIDE6MDAJRGVubWFyawlDRSVzVAkxOTgwCi0JCQkgMTowMAlFVQlDRSVzVAotWm9uZSBBdGxhbnRpYy9GYXJvZQktMDoyNzowNCAtCUxNVAkxOTA4IEphbiAxMQkjIFRvcnNoYXZuCi0JCQkgMDowMAktCVdFVAkxOTgxCi0JCQkgMDowMAlFVQlXRSVzVAotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA0LTEwLTMxKToKLSMgRHVyaW5nIFdvcmxkIFdhciBJSSwgR2VybWFueSBtYWludGFpbmVkIHNlY3JldCBtYW5uZWQgd2VhdGhlciBzdGF0aW9ucyBpbgotIyBFYXN0IEdyZWVubGFuZCBhbmQgRnJhbnogSm9zZWYgTGFuZCwgYnV0IHdlIGRvbid0IGtub3cgdGhlaXIgdGltZSB6b25lcy4KLSMgTXkgc291cmNlIGZvciB0aGlzIGlzIFdpbGhlbG0gRGVnZSdzIGJvb2sgbWVudGlvbmVkIHVuZGVyIFN2YWxiYXJkLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgR3JlZW5sYW5kIGpvaW5lZCB0aGUgRVUgYXMgcGFydCBvZiBEZW5tYXJrLCBvYnRhaW5lZCBob21lIHJ1bGUgb24gMTk3OS0wNS0wMSwKLSMgYW5kIGxlZnQgdGhlIEVVIG9uIDE5ODUtMDItMDEuICBJdCB0aGVyZWZvcmUgc2hvdWxkIGhhdmUgYmVlbiB1c2luZyBFVQotIyBydWxlcyBhdCBsZWFzdCB0aHJvdWdoIDE5ODQuICBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IFNjb3Jlc2J5c3VuZCBhbmQgR29kdGhhYgotIyB1c2VkIEMtRXVyIHJ1bGVzIGFmdGVyIDE5ODAsIGJ1dCBJQVRBIFNTSU0gKDE5OTEvMTk5Nikgc2F5cyB0aGV5IHVzZSBFVQotIyBydWxlcyBzaW5jZSBhdCBsZWFzdCAxOTkxLiAgQXNzdW1lIEVVIHJ1bGVzIHNpbmNlIDE5ODAuCi0KLSMgRnJvbSBHd2lsbGluIExhdyAoMjAwMS0wNi0wNiksIGNpdGluZwotIyA8aHR0cDovL3d3dy5zdGF0a2FydC5uby9lZnMvZWZzaGVmdGVyLzIwMDEvZWZzNS0yMDAxLnBkZj4gKDIwMDEtMDMtMTUpLAotIyBhbmQgd2l0aCB0cmFuc2xhdGlvbnMgY29ycmVjdGVkIGJ5IFN0ZWZmZW4gVGhvcnNlbjoKLSMKLSMgR3JlZW5sYW5kIGhhcyBmb3VyIGxvY2FsIHRpbWVzLCBhbmQgdGhlIHJlbGF0aW9uIHRvIFVUQwotIyBpcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0aW1lIGxpbmU6Ci0jCi0jIFRoZSBtaWxpdGFyeSB6b25lIG5lYXIgVGh1bGUJVVRDLTQKLSMgU3RhbmRhcmQgR3JlZW5sYW5kIHRpbWUJVVRDLTMKLSMgU2NvcmVzYnlzdW5kCQkJVVRDLTEKLSMgRGFubWFya3NoYXZuCQkJVVRDCi0jCi0jIEluIHRoZSBtaWxpdGFyeSBhcmVhIG5lYXIgVGh1bGUgYW5kIGluIERhbm1hcmtzaGF2biBEU1Qgd2lsbCBub3QgYmUKLSMgaW50cm9kdWNlZC4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTExLTAxKToKLSMKLSMgSSBjb3JyZXNwb25kIHJlZ3VsYXJseSB3aXRoIHRoZSBEYW5zayBQb2xhcmNlbnRlciwgYW5kIHdyb3RlIHRoZW0gYXQKLSMgdGhlIHRpbWUgdG8gY2xhcmlmeSB0aGUgc2l0dWF0aW9uIGluIFRodWxlLiAgVW5mb3J0dW5hdGVseSwgSSBoYXZlCi0jIG5vdCBoZWFyZCBiYWNrIGZyb20gdGhlbSByZWdhcmRpbmcgbXkgcmVjZW50IGxldHRlci4gIFtCdXQgSSBoYXZlCi0jIGluZm8gZnJvbSBlYXJsaWVyIGNvcnJlc3BvbmRlbmNlLl0KLSMKLSMgQWNjb3JkaW5nIHRvIHRoZSBjZW50ZXIsIGEgdmVyeSBzbWFsbCBsb2NhbCB0aW1lIHpvbmUgYXJvdW5kIFRodWxlCi0jIEFpciBCYXNlIGtlZXBzIHRoZSB0aW1lIGFjY29yZGluZyB0byBVVEMtNCwgaW1wbGVtZW50aW5nIGRheWxpZ2h0Ci0jIHNhdmluZ3MgdXNpbmcgTm9ydGggQW1lcmljYSBydWxlcywgY2hhbmdpbmcgdGhlIHRpbWUgYXQgMDI6MDAgbG9jYWwgdGltZS4uLi4KLSMKLSMgVGhlIGVhc3QgY29hc3Qgb2YgR3JlZW5sYW5kIG5vcnRoIG9mIHRoZSBjb21tdW5pdHkgb2YgU2NvcmVzYnlzdW5kCi0jIHVzZXMgVVRDIGluIHRoZSBzYW1lIHdheSBhcyBpbiBJY2VsYW5kLCB5ZWFyIHJvdW5kLCB3aXRoIG5vIGRzdC4KLSMgVGhlcmUgYXJlIGp1c3QgYSBmZXcgc3RhdGlvbnMgb24gdGhpcyBjb2FzdCwgaW5jbHVkaW5nIHRoZQotIyBEYW5tYXJrc2hhdm4gSUNBTyB3ZWF0aGVyIHN0YXRpb24gbWVudGlvbmVkIGluIHlvdXIgU2VwdGVtYmVyIDI5dGgKLSMgZW1haWwuICBUaGUgb3RoZXIgc3RhdGlvbnMgYXJlIHR3byBzbGVkZ2UgcGF0cm9sIHN0YXRpb25zIGluCi0jIE1lc3RlcnN2aWcgYW5kIERhbmVib3JnLCB0aGUgYWlyIGZvcmNlIGJhc2UgYXQgU3RhdGlvbiBOb3JkLCBhbmQgdGhlCi0jIERQQyByZXNlYXJjaCBzdGF0aW9uIGF0IFphY2tlbmJlcmcuCi0jCi0jIFNjb3Jlc2J5c3VuZCBhbmQgdHdvIHNtYWxsIHZpbGxhZ2VzIG5lYXJieSBrZWVwIHRpbWUgVVRDLTEgYW5kIHVzZQotIyB0aGUgc2FtZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kIGFzIGluIFdlc3QgR3JlZW5sYW5kIChHb2R0aGFiKS4KLSMKLSMgVGhlIHJlc3Qgb2YgR3JlZW5sYW5kLCBpbmNsdWRpbmcgR29kdGhhYiAodGhpcyBhcmVhLCBhbHRob3VnaCBpdAotIyBpbmNsdWRlcyBjZW50cmFsIEdyZWVubGFuZCwgaXMga25vd24gYXMgd2VzdCBHcmVlbmxhbmQpLCBrZWVwcyB0aW1lCi0jIFVUQy0zLCB3aXRoIGRheWxpZ2h0IHNhdmluZ3MgbWV0aG9kcyBhY2NvcmRpbmcgdG8gRXVyb3BlYW4gcnVsZXMuCi0jCi0jIEl0IGlzIGNvbW1vbiBwcm9jZWR1cmUgdG8gdXNlIFVUQyAwIGluIHRoZSB3aWxkZXJuZXNzIG9mIEVhc3QgYW5kCi0jIE5vcnRoIEdyZWVubGFuZCwgYmVjYXVzZSBpdCBpcyBtYWlubHkgSWNlbGFuZGljIGFpcmNyYWZ0IG9wZXJhdG9ycwotIyBtYWludGFpbmluZyB0cmFmZmljIGluIHRoZXNlIGFyZWFzLiAgSG93ZXZlciwgdGhlIG9mZmljaWFsIHN0YXR1cyBvZgotIyB0aGlzIGFyZWEgaXMgdGhhdCBpdCBzdGlja3Mgd2l0aCBHb2R0aGFiIHRpbWUuICBUaGlzIGFyZWEgbWlnaHQgYmUKLSMgY29uc2lkZXJlZCBhIGR1YWwgdGltZSB6b25lIGluIHNvbWUgcmVzcGVjdHMgYmVjYXVzZSBvZiB0aGlzLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMTEtMTkpOgotIyBJIGhlYXJkIGJhY2sgZnJvbSBzb21lb25lIHN0YXRpb25lZCBhdCBUaHVsZTsgdGhlIHRpbWUgY2hhbmdlIHRvb2sgcGxhY2UKLSMgdGhlcmUgYXQgMjowMCBBTS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgRnJvbSAxOTk3IG9uIHRoZSBDSUEgbWFwIHNob3dzIERhbm1hcmtzaGF2biBvbiBHTVQ7Ci0jIHRoZSAxOTk1IG1hcCBhcyBsaWtlIEdvZHRoYWIuCi0jIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLCBhc3N1bWUgdGhleSB3ZXJlIGxpa2UgR29kdGhhYiBiZWZvcmUgMTk5Ni4KLSMgc3RhcnRrYXJ0Lm5vIHNheXMgVGh1bGUgZG9lcyBub3Qgb2JzZXJ2ZSBEU1QsIGJ1dCB0aGlzIGlzIGNsZWFybHkgYW4gZXJyb3IsCi0jIHNvIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGZvciBUaHVsZSB0cmFuc2l0aW9ucyB1bnRpbCB0aGlzIHllYXIuCi0jIEZvciAyMDA3IG9uIGFzc3VtZSBUaHVsZSB3aWxsIHN0YXkgaW4gc3luYyB3aXRoIFVTIERTVCBydWxlcy4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVRodWxlCTE5OTEJMTk5MgktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRodWxlCTE5OTEJMTk5MgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVRodWxlCTE5OTMJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJVGh1bGUJMTk5MwkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJVGh1bGUJMjAwNwltYXgJLQlNYXIJU3VuPj04CTI6MDAJMTowMAlECi1SdWxlCVRodWxlCTIwMDcJbWF4CS0JTm92CVN1bj49MQkyOjAwCTAJUwotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0Rhbm1hcmtzaGF2biAtMToxNDo0MCAtCUxNVAkxOTE2IEp1bCAyOAotCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgMjowMAotCQkJLTM6MDAJRVUJV0clc1QJMTk5NgotCQkJMDowMAktCUdNVAotWm9uZSBBbWVyaWNhL1Njb3Jlc2J5c3VuZCAtMToyNzo1MiAtCUxNVAkxOTE2IEp1bCAyOCAjIEl0dG9xcW9ydG9vcm1paXQKLQkJCS0yOjAwCS0JQ0dUCTE5ODAgQXByICA2IDI6MDAKLQkJCS0yOjAwCUMtRXVyCUNHJXNUCTE5ODEgTWFyIDI5Ci0JCQktMTowMAlFVQlFRyVzVAotWm9uZSBBbWVyaWNhL0dvZHRoYWIJLTM6MjY6NTYgLQlMTVQJMTkxNiBKdWwgMjggIyBOdXVrCi0JCQktMzowMAktCVdHVAkxOTgwIEFwciAgNiAyOjAwCi0JCQktMzowMAlFVQlXRyVzVAotWm9uZSBBbWVyaWNhL1RodWxlCS00OjM1OjA4IC0JTE1UCTE5MTYgSnVsIDI4ICMgUGl0dWZmaWsgYWlyIGJhc2UKLQkJCS00OjAwCVRodWxlCUElc1QKLQotIyBFc3RvbmlhCi0jIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk0LTEwLTE1KToKLSMgQSByZWxhdGl2ZSBpbiBUYWxsaW5uIGNvbmZpcm1zIHRoZSBhY2N1cmFjeSBvZiB0aGUgZGF0YSBmb3IgMTk4OSBvbndhcmRzCi0jIFt0aHJvdWdoIDE5OTRdIGFuZCBnaXZlcyB0aGUgbGVnYWwgYXV0aG9yaXR5IGZvciBpdCwKLSMgYSByZWd1bGF0aW9uIG9mIHRoZSBHb3Zlcm5tZW50IG9mIEVzdG9uaWEsIE5vLiAxMTEgb2YgMTk4OS4uLi4KLSMKLSMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTYtMTAtMjgpOgotIyBbSUFUQSBTU0lNICgxOTkyLzE5OTYpIGNsYWltcyB0aGF0IHRoZSBCYWx0aWMgcmVwdWJsaWNzIHN3aXRjaCBhdCAwMTowMHMsCi0jIGJ1dCBhIHJlbGF0aXZlIGNvbmZpcm1zIHRoYXQgRXN0b25pYSBzdGlsbCBzd2l0Y2hlcyBhdCAwMjowMHMsIHdyaXRpbmc6XQotIyBgYEkgZG8gbm90IFtrbm93XSBleGFjdGx5IGJ1dCB0aGVyZSBhcmUgc29tZSBsaXR0bGUgZGlmZmVyZW50Ci0jIChjb25mdXNpbmcpIHJ1bGVzIGZvciBJbnRlcm5hdGlvbmFsIEFpciBhbmQgUmFpbHdheSBUcmFuc3BvcnQgU2NoZWR1bGVzCi0jIGNvbnZlcnNpb24gaW4gU3VuZGF5IGNvbm5lY3RlZCB3aXRoIGVuZCBvZiBzdW1tZXIgdGltZSBpbiBFc3RvbmlhLi4uLgotIyBBIGRpc2N1c3Npb24gaXMgcnVubmluZyBhYm91dCB0aGUgc3VtbWVyIHRpbWUgZWZmaWNpZW5jeSBhbmQgZWZmZWN0IG9uCi0jIGh1bWFuIHBoeXNpb2xvZ3kuICBJdCBzZWVtcyB0aGF0IEVzdG9uaWEgbWF5YmUgd2lsbCBub3QgY2hhbmdlIHRvCi0jIHN1bW1lciB0aW1lIG5leHQgc3ByaW5nLicnCi0KLSMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTgtMTEtMDQpLCBoZWF2aWx5IGVkaXRlZDoKLSMgPGEgaHJlZj0iaHR0cDovL3RyaXAucmsuZWUvY2dpLWJpbi90aHc/JHtCQVNFfT1ha3QmJHtPT0hUTUx9PXJ0ZCZUQT0xOTk4JlRPPTEmQU49MTM5MCI+Ci0jIFRoZSAxOTk4LTA5LTIyIEVzdG9uaWFuIHRpbWUgbGF3Ci0jIDwvYT4KLSMgcmVmZXJzIHRvIHRoZSBFaWdodGggRGlyZWN0aXZlIGFuZCBjaXRlcyB0aGUgYXNzb2NpYXRpb24gYWdyZWVtZW50IGJldHdlZW4KLSMgdGhlIEVVIGFuZCBFc3RvbmlhLCByYXRpZmllZCBieSB0aGUgRXN0b25pYW4gbGF3IChSVCBJSSAxOTk1LCAyMi0tMjcsIDEyMCkuCi0jCi0jIEkgYWxzbyBhc2tlZCBbbXkgcmVsYXRpdmVdIHdoZXRoZXIgdGhleSB1c2UgYW55IHN0YW5kYXJkIGFiYnJldmlhdGlvbgotIyBmb3IgdGhlaXIgc3RhbmRhcmQgYW5kIHN1bW1lciB0aW1lcy4gSGUgc2F5cyBubywgdGhleSB1c2UgInN1dmVhZWciCi0jIChzdW1tZXIgdGltZSkgYW5kICJ0YWx2ZWFlZyIgKHdpbnRlciB0aW1lKS4KLQotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFsdGljdGltZXMuY29tLyI+VGhlIEJhbHRpYyBUaW1lczwvYT4gKDE5OTktMDktMDkpCi0jIHZpYSBTdGVmZmVuIFRob3JzZW46Ci0jIFRoaXMgeWVhciB3aWxsIG1hcmsgdGhlIGxhc3QgdGltZSBFc3RvbmlhIHNoaWZ0cyB0byBzdW1tZXIgdGltZSwKLSMgYSBjb3VuY2lsIG9mIHRoZSBydWxpbmcgY29hbGl0aW9uIGFubm91bmNlZCBTZXB0LiA2Li4uLgotIyBCdXQgd2hhdCB0aGlzIGNvdWxkIG1lYW4gZm9yIEVzdG9uaWEncyBjaGFuY2VzIG9mIGpvaW5pbmcgdGhlIEV1cm9wZWFuCi0jIFVuaW9uIGFyZSBzdGlsbCB1bmNsZWFyLiAgSW4gMTk5NCwgdGhlIEVVIGRlY2xhcmVkIHN1bW1lciB0aW1lIGNvbXB1bHNvcnkKLSMgZm9yIGFsbCBtZW1iZXIgc3RhdGVzIHVudGlsIDIwMDEuICBCcnVzc2VscyBoYXMgeWV0IHRvIGRlY2lkZSB3aGF0IHRvIGRvCi0jIGFmdGVyIHRoYXQuCi0KLSMgRnJvbSBNYXJ0IE9ydWFhcyAoMjAwMC0wMS0yOSk6Ci0jIFJlZ3VsYXRpb24gbm8uIDMwMSAoMTk5OS0xMC0xMikgb2Jzb2xldGVzIHByZXZpb3VzIHJlZ3VsYXRpb24KLSMgbm8uIDIwNiAoMTk5OC0wOS0yMikgYW5kIHRodXMgc3RpY2tzIEVzdG9uaWEgdG8gKzAyOjAwIEdNVCBmb3IgYWxsCi0jIHRoZSB5ZWFyIHJvdW5kLiAgVGhlIHJlZ3VsYXRpb24gaXMgZWZmZWN0aXZlIDE5OTktMTEtMDEuCi0KLSMgRnJvbSBUb29tYXMgU29vbWUgKDIwMDItMDItMjEpOgotIyBUaGUgRXN0b25pYW4gZ292ZXJubWVudCBoYXMgY2hhbmdlZCBvbmNlIGFnYWluIHRpbWV6b25lIHBvbGl0aWNzLgotIyBOb3cgd2UgYXJlIHVzaW5nIGFnYWluIEVVIHJ1bGVzLgotIwotIyBGcm9tIFVybWV0IEphYW5lcyAoMjAwMi0wMy0yOCk6Ci0jIFRoZSBsZWdpc2xhdGl2ZSByZWZlcmVuY2UgaXMgR292ZXJubWVudCBkZWNyZWUgTm8uIDg0IG9uIDIwMDItMDItMjEuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1RhbGxpbm4JMTozOTowMAktCUxNVAkxODgwCi0JCQkxOjM5OjAwCS0JVE1UCTE5MTggRmViICMgVGFsbGlubiBNZWFuIFRpbWUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOSBKdWwKLQkJCTE6Mzk6MDAJLQlUTVQJMTkyMSBNYXkKLQkJCTI6MDAJLQlFRVQJMTk0MCBBdWcgIDYKLQkJCTM6MDAJLQlNU0sJMTk0MSBTZXAgMTUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBTZXAgMjIKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgMjYgMjowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5ODkgU2VwIDI0IDI6MDBzCi0JCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTggU2VwIDIyCi0JCQkyOjAwCUVVCUVFJXNUCTE5OTkgTm92ICAxCi0JCQkyOjAwCS0JRUVUCTIwMDIgRmViIDIxCi0JCQkyOjAwCUVVCUVFJXNUCi0KLSMgRmlubGFuZAotIwotIyBGcm9tIEhhbm51IFN0cmFuZyAoMTk5NC0wOS0yNSAwNjowMzozNyBVVEMpOgotIyBXZWxsLCBoZXJlIGluIEhlbHNpbmtpIHdlJ3JlIGp1c3QgY2hhbmdpbmcgZnJvbSBzdW1tZXIgdGltZSB0byByZWd1bGFyIG9uZSwKLSMgYW5kIGl0J3Mgc3VwcG9zZWQgdG8gY2hhbmdlIGF0IDRhbS4uLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBGaW5sYW5kIGhhcyBzd2l0Y2hlZCBhdCAwMjowMCBzdGFuZGFyZCB0aW1lCi0jIHNpbmNlIDE5ODEuICBHbyB3aXRoIFN0cmFuZyBpbnN0ZWFkLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlBcHIJMwkwOjAwCTE6MDAJUwotUnVsZQlGaW5sYW5kCTE5NDIJb25seQktCU9jdAkzCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9IZWxzaW5raQkxOjM5OjUyIC0JTE1UCTE4NzggTWF5IDMxCi0JCQkxOjM5OjUyCS0JSE1UCTE5MjEgTWF5ICAgICMgSGVsc2lua2kgTWVhbiBUaW1lCi0JCQkyOjAwCUZpbmxhbmQJRUUlc1QJMTk4MSBNYXIgMjkgMjowMAotCQkJMjowMAlFVQlFRSVzVAotCi0jIEFhbGFuZCBJcwotTGluawlFdXJvcGUvSGVsc2lua2kJRXVyb3BlL01hcmllaGFtbgotCi0KLSMgRnJhbmNlCi0KLSMgRnJvbSBDaXJvIERpc2NlcG9sbyAoMjAwMC0xMi0yMCk6Ci0jCi0jIEhlbnJpIExlIENvcnJlLCBSZWdpbWVzIEhvcmFpcmVzIHBvdXIgbGUgbW9uZGUgZW50aWVyLCBFZGl0aW9ucwotIyBUcmFkaXRpb25uZWxsZXMgLSBQYXJpcyAyIGJvb2tzLCAxOTkzCi0jCi0jIEdhYnJpZWwsIFRyYWl0ZSBkZSBsJ2hldXJlIGRhbnMgbGUgbW9uZGUsIEd1eSBUcmVkYW5pZWwgZWRpdGV1ciwKLSMgUGFyaXMsIDE5OTEKLSMKLSMgRnJhbmNvaXNlIEdhdXF1ZWxpbiwgUHJvYmxlbWVzIGRlIGwnaGV1cmUgcmVzb2x1cyBlbiBhc3Ryb2xvZ2llLAotIyBHdXkgdHJlZGFuaWVsLCBQYXJpcyAxOTg3Ci0KLQotIwotIyBTaGFuayAmIFBvdHRlbmdlciBzZWVtIHRvIHVzZSBgMjQ6MDAnIGFtYmlndW91c2x5OyByZXNvbHZlIGl0IHdpdGggV2hpdG1hbi4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUZyYW5jZQkxOTE2CW9ubHkJLQlKdW4JMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkxNgkxOTE5CS0JT2N0CVN1bj49MQkyMzowMHMJMAktCi1SdWxlCUZyYW5jZQkxOTE3CW9ubHkJLQlNYXIJMjQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkxOAlvbmx5CS0JTWFyCSA5CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MTkJb25seQktCU1hcgkgMQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTIwCW9ubHkJLQlGZWIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyMAlvbmx5CS0JT2N0CTIzCTIzOjAwcwkwCS0KLVJ1bGUJRnJhbmNlCTE5MjEJb25seQktCU1hcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTIxCW9ubHkJLQlPY3QJMjUJMjM6MDBzCTAJLQotUnVsZQlGcmFuY2UJMTkyMglvbmx5CS0JTWFyCTI1CTIzOjAwcwkxOjAwCVMKLSMgRFNIIHdyaXRlcyB0aGF0IGEgbGF3IG9mIDE5MjMtMDUtMjQgc3BlY2lmaWVkIDNyZCBTYXQgaW4gQXByIGF0IDIzOjAwIHRvIDFzdAotIyBTYXQgaW4gT2N0IGF0IDI0OjAwOyBhbmQgdGhhdCBpbiAxOTMwLCBiZWNhdXNlIG9mIEVhc3RlciwgdGhlIHRyYW5zaXRpb25zCi0jIHdlcmUgQXByIDEyIGFuZCBPY3QgNS4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlGcmFuY2UJMTkyMgkxOTM4CS0JT2N0CVNhdD49MQkyMzowMHMJMAktCi1SdWxlCUZyYW5jZQkxOTIzCW9ubHkJLQlNYXkJMjYJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyNAlvbmx5CS0JTWFyCTI5CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MjUJb25seQktCUFwcgkgNAkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTI2CW9ubHkJLQlBcHIJMTcJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyNwlvbmx5CS0JQXByCSA5CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MjgJb25seQktCUFwcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTI5CW9ubHkJLQlBcHIJMjAJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzMAlvbmx5CS0JQXByCTEyCTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzEJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTMyCW9ubHkJLQlBcHIJIDIJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzMwlvbmx5CS0JTWFyCTI1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzQJb25seQktCUFwcgkgNwkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTM1CW9ubHkJLQlNYXIJMzAJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzNglvbmx5CS0JQXByCTE4CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzcJb25seQktCUFwcgkgMwkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTM4CW9ubHkJLQlNYXIJMjYJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzOQlvbmx5CS0JQXByCTE1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzkJb25seQktCU5vdgkxOAkyMzowMHMJMAktCi1SdWxlCUZyYW5jZQkxOTQwCW9ubHkJLQlGZWIJMjUJIDI6MDAJMTowMAlTCi0jIFRoZSBGcmVuY2ggcnVsZXMgZm9yIDE5NDEtMTk0NCB3ZXJlIG5vdCB1c2VkIGluIFBhcmlzLCBidXQgU2hhbmtzICYgUG90dGVuZ2VyCi0jIHdyaXRlIHRoYXQgdGhleSB3ZXJlIHVzZWQgaW4gTW9uYWNvIGFuZCBpbiBtYW55IEZyZW5jaCBsb2NhdGlvbnMuCi0jIExlIENvcnJlIHdyaXRlcyB0aGF0IHRoZSB1cHBlciBsaW1pdCBvZiB0aGUgZnJlZSB6b25lIHdhcyBBcm5lZ3V5LCBPcnRoZXosCi0jIE1vbnQtZGUtTWFyc2FuLCBCYXphcywgTGFuZ29uLCBMYW1vdHRlLU1vbnRyYXZlbCwgTWFyb3VpbCwgTGEKLSMgUm9jaGVmb3VjYXVsdCwgQ2hhbXBhZ25lLU1vdXRvbiwgTGEgUm9jaGUtUG9zYXksIExhIEhheWUtRGVjYXJ0ZXMsCi0jIExvY2hlcywgTW9udHJpY2hhcmQsIFZpZXJ6b24sIEJvdXJnZXMsIE1vdWxpbnMsIERpZ29pbiwKLSMgUGFyYXktbGUtTW9uaWFsLCBNb250Y2VhdS1sZXMtTWluZXMsIENoYWxvbnMtc3VyLVNhb25lLCBBcmJvaXMsCi0jIERvbGUsIE1vcmV6LCBTdC1DbGF1ZGUsIGFuZCBDb2xsb2duZXMgKEhhdXRlLVNhdmlvZSkuCi1SdWxlCUZyYW5jZQkxOTQxCW9ubHkJLQlNYXkJIDUJIDA6MDAJMjowMAlNICMgTWlkc3VtbWVyCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhpcyB0cmFuc2l0aW9uIG9jY3VycmVkIGF0IE9jdCA2IDE6MDAsCi0jIGJ1dCBnbyB3aXRoIERlbmlzIEV4Y29mZmllciAoMTk5Ny0xMi0xMiksCi0jIHdobyBxdW90ZXMgdGhlIEVwaGVtZXJpZGVzIEFzdHJvbm9taXF1ZXMgZm9yIDE5OTggZnJvbSBCdXJlYXUgZGVzIExvbmdpdHVkZXMKLSMgYXMgc2F5aW5nIDUvMTAvNDEgMjJoVVQuCi1SdWxlCUZyYW5jZQkxOTQxCW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTQyCW9ubHkJLQlNYXIJIDkJIDA6MDAJMjowMAlNCi1SdWxlCUZyYW5jZQkxOTQyCW9ubHkJLQlOb3YJIDIJIDM6MDAJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTQzCW9ubHkJLQlNYXIJMjkJIDI6MDAJMjowMAlNCi1SdWxlCUZyYW5jZQkxOTQzCW9ubHkJLQlPY3QJIDQJIDM6MDAJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTQ0CW9ubHkJLQlBcHIJIDMJIDI6MDAJMjowMAlNCi1SdWxlCUZyYW5jZQkxOTQ0CW9ubHkJLQlPY3QJIDgJIDE6MDAJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTQ1CW9ubHkJLQlBcHIJIDIJIDI6MDAJMjowMAlNCi1SdWxlCUZyYW5jZQkxOTQ1CW9ubHkJLQlTZXAJMTYJIDM6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIE1hciAyOCAyOjAwIGFuZCBTZXAgMjYgMzowMDsKLSMgZ28gd2l0aCBFeGNvZmZpZXIncyAyOC8zLzc2IDBoVVQgYW5kIDI1LzkvNzYgMjNoVVQuCi1SdWxlCUZyYW5jZQkxOTc2CW9ubHkJLQlNYXIJMjgJIDE6MDAJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTc2CW9ubHkJLQlTZXAJMjYJIDE6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZSwgYW5kIFdoaXRtYW4gMDowOTowNSwKLSMgYnV0IEhvd3NlIHF1b3RlcyB0aGUgYWN0dWFsIEZyZW5jaCBsZWdpc2xhdGlvbiBhcyBzYXlpbmcgMDowOToyMS4KLSMgR28gd2l0aCBIb3dzZS4gIEhvd3NlIHdyaXRlcyB0aGF0IHRoZSB0aW1lIGluIEZyYW5jZSB3YXMgb2ZmaWNpYWxseSBiYXNlZAotIyBvbiBQTVQtMDowOToyMSB1bnRpbCAxOTc4LTA4LTA5LCB3aGVuIHRoZSB0aW1lIGJhc2UgZmluYWxseSBzd2l0Y2hlZCB0byBVVEMuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9QYXJpcwkwOjA5OjIxIC0JTE1UCTE4OTEgTWFyIDE1ICAwOjAxCi0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAwOjAxICAjIFBhcmlzIE1UCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5NDAgSnVuIDE0IDA6MDA7IGdvIHdpdGggRXhjb2ZmaWVyIGFuZCBMZSBDb3JyZS4KLQkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDAgSnVuIDE0IDIzOjAwCi0jIExlIENvcnJlIHNheXMgUGFyaXMgc3R1Y2sgd2l0aCBvY2N1cGllZC1GcmFuY2UgdGltZSBhZnRlciB0aGUgbGliZXJhdGlvbjsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXVnIDI1Ci0JCQkwOjAwCUZyYW5jZQlXRSVzVAkxOTQ1IFNlcCAxNiAgMzowMAotCQkJMTowMAlGcmFuY2UJQ0Ulc1QJMTk3NwotCQkJMTowMAlFVQlDRSVzVAotCi0jIEdlcm1hbnkKLQotIyBGcm9tIE1hcmt1cyBLdWhuICgxOTk4LTA5LTI5KToKLSMgVGhlIEdlcm1hbiB0aW1lIHpvbmUgd2ViIHNpdGUgYnkgdGhlIFBoeXNpa2FsaXNjaC1UZWNobmlzY2hlCi0jIEJ1bmRlc2Fuc3RhbHQgY29udGFpbnMgRFNUIGluZm9ybWF0aW9uIGJhY2sgdG8gMTkxNi4KLSMgW1NlZSB0ei1saW5rLmh0bSBmb3IgdGhlIFVSTC5dCi0KLSMgRnJvbSBKb2VyZyBTY2hpbGxpbmcgKDIwMDItMTAtMjMpOgotIyBJbiAxOTQ1LCBCZXJsaW4gd2FzIHN3aXRjaGVkIHRvIE1vc2NvdyBTdW1tZXIgdGltZSAoR01UKzQpIGJ5Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGhtLmRlL2xlbW8vaHRtbC9iaW9ncmFmaWVuL0JlcnNhcmluTmlrb2xhaS8iPgotIyBHZW5lcmFsIFtOaWtvbGFpXSBCZXJzYXJpbjwvYT4uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0wOCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGFybGFtZW50LWJlcmxpbi5kZS9wZHMtZnJha3Rpb24ubnNmLzcyNzQ1OTEyN2M4YjY2ZWU4NTI1NjYyMzAwNDU5MDk5L2RlZmM3N2NiNzg0ZjE4MGFjMTI1NmMyYjAwMzAyNzRiLyRGSUxFL2JlcnNhcmludC5wZGYiPgotIyBodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmCi0jIDwvYT4KLSMgc2F5cyB0aGF0IEJlcnNhcmluIGlzc3VlZCBhbiBvcmRlciB0byB1c2UgTW9zY293IHRpbWUgb24gTWF5IDIwLgotIyBIb3dldmVyLCBNb3Njb3cgZGlkIG5vdCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZyBpbiAxOTQ1LCBzbwotIyB0aGlzIHdhcyBlcXVpdmFsZW50IHRvIENFTVQgKEdNVCszKSwgbm90IEdNVCs0LgotCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUdlcm1hbnkJMTk0Nglvbmx5CS0JQXByCTE0CTI6MDBzCTE6MDAJUwotUnVsZQlHZXJtYW55CTE5NDYJb25seQktCU9jdAkgNwkyOjAwcwkwCS0KLVJ1bGUJR2VybWFueQkxOTQ3CTE5NDkJLQlPY3QJU3VuPj0xCTI6MDBzCTAJLQotIyBodHRwOi8vd3d3LnB0Yi5kZS9kZS9vcmcvNC80NC80NDEvc2FsdC5odG0gc2F5cyB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb24KLSMgb2NjdXJyZWQgYXQgMzowMCBNRVosIG5vdCB0aGUgMjowMCBNRVogZ2l2ZW4gaW4gU2hhbmtzICYgUG90dGVuZ2VyLgotIyBHbyB3aXRoIHRoZSBQVEIuCi1SdWxlCUdlcm1hbnkJMTk0Nwlvbmx5CS0JQXByCSA2CTM6MDBzCTE6MDAJUwotUnVsZQlHZXJtYW55CTE5NDcJb25seQktCU1heQkxMQkyOjAwcwkyOjAwCU0KLVJ1bGUJR2VybWFueQkxOTQ3CW9ubHkJLQlKdW4JMjkJMzowMAkxOjAwCVMKLVJ1bGUJR2VybWFueQkxOTQ4CW9ubHkJLQlBcHIJMTgJMjowMHMJMTowMAlTCi1SdWxlCUdlcm1hbnkJMTk0OQlvbmx5CS0JQXByCTEwCTI6MDBzCTE6MDAJUwotCi1SdWxlIFNvdmlldFpvbmUJMTk0NQlvbmx5CS0JTWF5CTI0CTI6MDAJMjowMAlNICMgTWlkc3VtbWVyCi1SdWxlIFNvdmlldFpvbmUJMTk0NQlvbmx5CS0JU2VwCTI0CTM6MDAJMTowMAlTCi1SdWxlIFNvdmlldFpvbmUJMTk0NQlvbmx5CS0JTm92CTE4CTI6MDBzCTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9CZXJsaW4JMDo1MzoyOCAtCUxNVAkxODkzIEFwcgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IE1heSAyNCAyOjAwCi0JCQkxOjAwIFNvdmlldFpvbmUJQ0Ulc1QJMTk0NgotCQkJMTowMAlHZXJtYW55CUNFJXNUCTE5ODAKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBHZW9yZ2lhCi0jIFBsZWFzZSBzZWUgdGhlICJhc2lhIiBmaWxlIGZvciBBc2lhL1RiaWxpc2kuCi0jIEhlcm9kb3R1cyAoSGlzdG9yaWVzLCBJVi40NSkgc2F5cyBHZW9yZ2lhIG5vcnRoIG9mIHRoZSBQaGFzaXMgKG5vdyBSaW9uaSkKLSMgaXMgaW4gRXVyb3BlLiAgT3VyIHJlZmVyZW5jZSBsb2NhdGlvbiBUYmlsaXNpIGlzIGluIHRoZSBBc2lhbiBwYXJ0LgotCi0jIEdpYnJhbHRhcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvR2licmFsdGFyCS0wOjIxOjI0IC0JTE1UCTE4ODAgQXVnICAyIDA6MDBzCi0JCQkwOjAwCUdCLUVpcmUJJXMJMTk1NyBBcHIgMTQgMjowMAotCQkJMTowMAktCUNFVAkxOTgyCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgR3JlZWNlCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBXaGl0bWFuIGdpdmVzIDE5MzIgSnVsIDUgLSBOb3YgMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdyZWVjZQkxOTMyCW9ubHkJLQlKdWwJIDcJMDowMAkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5MzIJb25seQktCVNlcAkgMQkwOjAwCTAJLQotIyBXaGl0bWFuIGdpdmVzIDE5NDEgQXByIDI1IC0gPzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdyZWVjZQkxOTQxCW9ubHkJLQlBcHIJIDcJMDowMAkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTQyIEZlYiAyIC0gPzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdyZWVjZQkxOTQyCW9ubHkJLQlOb3YJIDIJMzowMAkwCS0KLVJ1bGUJR3JlZWNlCTE5NDMJb25seQktCU1hcgkzMAkwOjAwCTE6MDAJUwotUnVsZQlHcmVlY2UJMTk0Mwlvbmx5CS0JT2N0CSA0CTA6MDAJMAktCi0jIFdoaXRtYW4gZ2l2ZXMgMTk0NCBPY3QgMyAtIE9jdCAzMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdyZWVjZQkxOTUyCW9ubHkJLQlKdWwJIDEJMDowMAkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5NTIJb25seQktCU5vdgkgMgkwOjAwCTAJLQotUnVsZQlHcmVlY2UJMTk3NQlvbmx5CS0JQXByCTEyCTA6MDBzCTE6MDAJUwotUnVsZQlHcmVlY2UJMTk3NQlvbmx5CS0JTm92CTI2CTA6MDBzCTAJLQotUnVsZQlHcmVlY2UJMTk3Nglvbmx5CS0JQXByCTExCTI6MDBzCTE6MDAJUwotUnVsZQlHcmVlY2UJMTk3Nglvbmx5CS0JT2N0CTEwCTI6MDBzCTAJLQotUnVsZQlHcmVlY2UJMTk3NwkxOTc4CS0JQXByCVN1bj49MQkyOjAwcwkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5NzcJb25seQktCVNlcAkyNgkyOjAwcwkwCS0KLVJ1bGUJR3JlZWNlCTE5NzgJb25seQktCVNlcAkyNAk0OjAwCTAJLQotUnVsZQlHcmVlY2UJMTk3OQlvbmx5CS0JQXByCSAxCTk6MDAJMTowMAlTCi1SdWxlCUdyZWVjZQkxOTc5CW9ubHkJLQlTZXAJMjkJMjowMAkwCS0KLVJ1bGUJR3JlZWNlCTE5ODAJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJUwotUnVsZQlHcmVlY2UJMTk4MAlvbmx5CS0JU2VwCTI4CTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9BdGhlbnMJMTozNDo1MiAtCUxNVAkxODk1IFNlcCAxNAotCQkJMTozNDo1MgktCUFNVAkxOTE2IEp1bCAyOCAwOjAxICAgICAjIEF0aGVucyBNVAotCQkJMjowMAlHcmVlY2UJRUUlc1QJMTk0MSBBcHIgMzAKLQkJCTE6MDAJR3JlZWNlCUNFJXNUCTE5NDQgQXByICA0Ci0JCQkyOjAwCUdyZWVjZQlFRSVzVAkxOTgxCi0JCQkjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgaXQgc3dpdGNoZWQgdG8gQy1FdXIgaW4gMTk4MTsKLQkJCSMgZ28gd2l0aCBFVSBpbnN0ZWFkLCBzaW5jZSBHcmVlY2Ugam9pbmVkIGl0IG9uIEphbiAxLgotCQkJMjowMAlFVQlFRSVzVAotCi0jIEh1bmdhcnkKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUh1bmdhcnkJMTkxOAlvbmx5CS0JQXByCSAxCSAzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5MTgJb25seQktCVNlcAkyOQkgMzowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTE5CW9ubHkJLQlBcHIJMTUJIDM6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTkxOQlvbmx5CS0JU2VwCTE1CSAzOjAwCTAJLQotUnVsZQlIdW5nYXJ5CTE5MjAJb25seQktCUFwcgkgNQkgMzowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTIwCW9ubHkJLQlTZXAJMzAJIDM6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTk0NQlvbmx5CS0JTWF5CSAxCTIzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NDUJb25seQktCU5vdgkgMwkgMDowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTQ2CW9ubHkJLQlNYXIJMzEJIDI6MDBzCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NDYJMTk0OQktCU9jdAlTdW4+PTEJIDI6MDBzCTAJLQotUnVsZQlIdW5nYXJ5CTE5NDcJMTk0OQktCUFwcglTdW4+PTQJIDI6MDBzCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NTAJb25seQktCUFwcgkxNwkgMjowMHMJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTk1MAlvbmx5CS0JT2N0CTIzCSAyOjAwcwkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTU0CTE5NTUJLQlNYXkJMjMJIDA6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTk1NAkxOTU1CS0JT2N0CSAzCSAwOjAwCTAJLQotUnVsZQlIdW5nYXJ5CTE5NTYJb25seQktCUp1bglTdW4+PTEJIDA6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTk1Nglvbmx5CS0JU2VwCWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTk1Nwlvbmx5CS0JSnVuCVN1bj49MQkgMTowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTU3CW9ubHkJLQlTZXAJbGFzdFN1bgkgMzowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTgwCW9ubHkJLQlBcHIJIDYJIDE6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9CdWRhcGVzdAkxOjE2OjIwIC0JTE1UCTE4OTAgT2N0Ci0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTgKLQkJCTE6MDAJSHVuZ2FyeQlDRSVzVAkxOTQxIEFwciAgNiAgMjowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkxOjAwCUh1bmdhcnkJQ0Ulc1QJMTk4MCBTZXAgMjggIDI6MDBzCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgSWNlbGFuZAotIwotIyBGcm9tIEFkYW0gRGF2aWQgKDE5OTMtMTEtMDYpOgotIyBUaGUgbmFtZSBvZiB0aGUgdGltZXpvbmUgaW4gSWNlbGFuZCBmb3Igc3lzdGVtIC8gbWFpbCAvIG5ld3MgcHVycG9zZXMgaXMgR01ULgotIwotIyAoMTk5My0xMi0wNSk6Ci0jIFRoaXMgbWF0ZXJpYWwgaXMgcGFyYXBocmFzZWQgZnJvbSB0aGUgMTk4OCBlZGl0aW9uIG9mIHRoZSBVbml2ZXJzaXR5IG9mCi0jIEljZWxhbmQgQWxtYW5hay4KLSMKLSMgRnJvbSBKYW51YXJ5IDFzdCwgMTkwOCB0aGUgd2hvbGUgb2YgSWNlbGFuZCB3YXMgc3RhbmRhcmRpc2VkIGF0IDEgaG91cgotIyBiZWhpbmQgR01ULiBQcmV2aW91c2x5LCBsb2NhbCBtZWFuIHNvbGFyIHRpbWUgd2FzIHVzZWQgaW4gZGlmZmVyZW50IHBhcnRzCi0jIG9mIEljZWxhbmQsIHRoZSBhbG1hbmFrIGhhZCBiZWVuIGJhc2VkIG9uIFJleWtqYXZpayBtZWFuIHNvbGFyIHRpbWUgd2hpY2gKLSMgd2FzIDEgaG91ciBhbmQgMjggbWludXRlcyBiZWhpbmQgR01ULgotIwotIyAiZmlyc3QgZGF5IG9mIHdpbnRlciIgcmVmZXJyZWQgdG8gW2JlbG93XSBtZWFucyB0aGUgZmlyc3QgZGF5IG9mIHRoZSAyNiB3ZWVrcwotIyBvZiB3aW50ZXIsIGFjY29yZGluZyB0byB0aGUgb2xkIGljZWxhbmRpYyBjYWxlbmRhciB0aGF0IGRhdGVzIGJhY2sgdG8gdGhlCi0jIHRpbWUgdGhlIG5vcnNlbWVuIGZpcnN0IHNldHRsZWQgSWNlbGFuZC4gIFRoZSBmaXJzdCBkYXkgb2Ygd2ludGVyIGlzIGFsd2F5cwotIyBTYXR1cmRheSwgYnV0IGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIEp1bGlhbiBvciBHcmVnb3JpYW4gY2FsZW5kYXJzLgotIwotIyAoMTk5My0xMi0xMCk6Ci0jIEkgaGF2ZSBhIHJlZmVyZW5jZSBmcm9tIHRoZSBPeGZvcmQgSWNlbGFuZGljLUVuZ2xpc2ggZGljdGlvbmFyeSBmb3IgdGhlCi0jIGJlZ2lubmluZyBvZiB3aW50ZXIsIHdoaWNoIHRpZXMgaXQgdG8gdGhlIGVjY2xlc2lhc3RpY2FsIGNhbGVuZGFyIChhbmQgdGh1cwotIyB0byB0aGUganVsaWFuL2dyZWdvcmlhbiBjYWxlbmRhcikgb3ZlciB0aGUgcGVyaW9kIGluIHF1ZXN0aW9uLgotIwl0aGUgd2ludGVyIGJlZ2lucyBvbiB0aGUgU2F0dXJkYXkgbmV4dCBiZWZvcmUgU3QuIEx1a2UncyBkYXkKLSMJKG9sZCBzdHlsZSksIG9yIG9uIFN0LiBMdWtlJ3MgZGF5LCBpZiBhIFNhdHVyZGF5LgotIyBTdC4gTHVrZSdzIGRheSBvdWdodCB0byBiZSB0cmFjZWFibGUgZnJvbSBlY2NsZXNpYXN0aWNhbCBzb3VyY2VzLiAib2xkIHN0eWxlIgotIyBtaWdodCBiZSBhIHJlZmVyZW5jZSB0byB0aGUgSnVsaWFuIGNhbGVuZGFyIGFzIG9wcG9zZWQgdG8gR3JlZ29yaWFuLCBvciBpdAotIyBtaWdodCBtZWFuIHNvbWV0aGluZyBlbHNlICg/Pz8pLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIEljZWxhbmQgQWxtYW5haywgU2hhbmtzICYgUG90dGVuZ2VyLCBhbmQgV2hpdG1hbiBkaXNhZ3JlZSBvbiBtYW55IHBvaW50cy4KLSMgV2UgZ28gd2l0aCB0aGUgQWxtYW5haywgZXhjZXB0IGZvciBvbmUgY2xhaW0gZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIsIG5hbWVseQotIyB0aGF0IFJleWthdmlrIHdhcyAyMVc1NyBmcm9tIDE4MzcgdG8gMTkwOCwgbG9jYWwgbWVhbiB0aW1lIGJlZm9yZSB0aGF0LgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSWNlbGFuZAkxOTE3CTE5MTgJLQlGZWIJMTkJMjM6MDAJMTowMAlTCi1SdWxlCUljZWxhbmQJMTkxNwlvbmx5CS0JT2N0CTIxCSAxOjAwCTAJLQotUnVsZQlJY2VsYW5kCTE5MTgJb25seQktCU5vdgkxNgkgMTowMAkwCS0KLVJ1bGUJSWNlbGFuZAkxOTM5CW9ubHkJLQlBcHIJMjkJMjM6MDAJMTowMAlTCi1SdWxlCUljZWxhbmQJMTkzOQlvbmx5CS0JTm92CTI5CSAyOjAwCTAJLQotUnVsZQlJY2VsYW5kCTE5NDAJb25seQktCUZlYgkyNQkgMjowMAkxOjAwCVMKLVJ1bGUJSWNlbGFuZAkxOTQwCW9ubHkJLQlOb3YJIDMJIDI6MDAJMAktCi1SdWxlCUljZWxhbmQJMTk0MQlvbmx5CS0JTWFyCSAyCSAxOjAwcwkxOjAwCVMKLVJ1bGUJSWNlbGFuZAkxOTQxCW9ubHkJLQlOb3YJIDIJIDE6MDBzCTAJLQotUnVsZQlJY2VsYW5kCTE5NDIJb25seQktCU1hcgkgOAkgMTowMHMJMTowMAlTCi1SdWxlCUljZWxhbmQJMTk0Mglvbmx5CS0JT2N0CTI1CSAxOjAwcwkwCS0KLSMgMTk0My0xOTQ2IC0gZmlyc3QgU3VuZGF5IGluIE1hcmNoIHVudGlsIGZpcnN0IFN1bmRheSBpbiB3aW50ZXIKLVJ1bGUJSWNlbGFuZAkxOTQzCTE5NDYJLQlNYXIJU3VuPj0xCSAxOjAwcwkxOjAwCVMKLVJ1bGUJSWNlbGFuZAkxOTQzCTE5NDgJLQlPY3QJU3VuPj0yMgkgMTowMHMJMAktCi0jIDE5NDctMTk2NyAtIGZpcnN0IFN1bmRheSBpbiBBcHJpbCB1bnRpbCBmaXJzdCBTdW5kYXkgaW4gd2ludGVyCi1SdWxlCUljZWxhbmQJMTk0NwkxOTY3CS0JQXByCVN1bj49MQkgMTowMHMJMTowMAlTCi0jIDE5NDkgT2N0IHRyYW5zaXRpb24gZGVsYXllZCBieSAxIHdlZWsKLVJ1bGUJSWNlbGFuZAkxOTQ5CW9ubHkJLQlPY3QJMzAJIDE6MDBzCTAJLQotUnVsZQlJY2VsYW5kCTE5NTAJMTk2NgktCU9jdAlTdW4+PTIyCSAxOjAwcwkwCS0KLVJ1bGUJSWNlbGFuZAkxOTY3CW9ubHkJLQlPY3QJMjkJIDE6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBdGxhbnRpYy9SZXlramF2aWsJLTE6Mjc6MjQgLQlMTVQJMTgzNwotCQkJLTE6Mjc6NDggLQlSTVQJMTkwOCAjIFJleWtqYXZpayBNZWFuIFRpbWU/Ci0JCQktMTowMAlJY2VsYW5kCUlTJXNUCTE5NjggQXByIDcgMTowMHMKLQkJCSAwOjAwCS0JR01UCi0KLSMgSXRhbHkKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wNik6Ci0jIFNpY2lseSBhbmQgU2FyZGluaWEgZWFjaCBoYWQgdGhlaXIgb3duIHRpbWUgem9uZXMgZnJvbSAxODY2IHRvIDE4OTMsCi0jIGNhbGxlZCBQYWxlcm1vIFRpbWUgKCswMDo1MzoyOCkgYW5kIENhZ2xpYXJpIFRpbWUgKCswMDozNjozMikuCi0jIER1cmluZyBXb3JsZCBXYXIgSUksIEdlcm1hbi1jb250cm9sbGVkIEl0YWx5IHVzZWQgR2VybWFuIHRpbWUuCi0jIEJ1dCB0aGVzZSBldmVudHMgYWxsIG9jY3VycmVkIGJlZm9yZSB0aGUgMTk3MCBjdXRvZmYsCi0jIHNvIHJlY29yZCBvbmx5IHRoZSB0aW1lIGluIFJvbWUuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBGb3IgSXRhbGlhbiBEU1Qgd2UgaGF2ZSB0aHJlZSBzb3VyY2VzOiBTaGFua3MgJiBQb3R0ZW5nZXIsIFdoaXRtYW4sIGFuZAotIyBGLiBQb2xsYXN0cmkKLSMgPGEgaHJlZj0iaHR0cDovL3RvaS5pcml0aS5jbnIuaXQvdWsvaWVuaXRsdC5odG1sIj4KLSMgRGF5LWxpZ2h0IFNhdmluZyBUaW1lIGluIEl0YWx5ICgyMDA2LTAyLTAzKQotIyA8L2E+Ci0jIChgRlAnIGJlbG93KSwgdGFrZW4gZnJvbSBhbiBJdGFsaWFuIE5hdGlvbmFsIEVsZWN0cm90ZWNobmljYWwgSW5zdGl0dXRlCi0jIHB1YmxpY2F0aW9uLiBXaGVuIHRoZSB0aHJlZSBzb3VyY2VzIGRpc2FncmVlLCBndWVzcyB3aG8ncyByaWdodCwgYXMgZm9sbG93czoKLSMKLSMgeWVhcglGUAlTaGFua3MmUC4gKFMpCVdoaXRtYW4gKFcpCUdvIHdpdGg6Ci0jIDE5MTYJMDYtMDMJMDYtMDMgMjQ6MDAJMDYtMDMgMDA6MDAJRlAgJiBXCi0jCTA5LTMwCTA5LTMwIDI0OjAwCTA5LTMwIDAxOjAwCUZQOyBndWVzcyAyNDowMHMKLSMgMTkxNwkwNC0wMQkwMy0zMSAyNDowMAkwMy0zMSAwMDowMAlGUCAmIFMKLSMJMDktMzAJMDktMjkgMjQ6MDAJMDktMzAgMDE6MDAJRlAgJiBXCi0jIDE5MTgJMDMtMDkJMDMtMDkgMjQ6MDAJMDMtMDkgMDA6MDAJRlAgJiBTCi0jCTEwLTA2CTEwLTA1IDI0OjAwCTEwLTA2IDAxOjAwCUZQICYgVwotIyAxOTE5CTAzLTAxCTAzLTAxIDI0OjAwCTAzLTAxIDAwOjAwCUZQICYgUwotIwkxMC0wNAkxMC0wNCAyNDowMAkxMC0wNCAwMTowMAlGUDsgZ3Vlc3MgMjQ6MDBzCi0jIDE5MjAJMDMtMjAJMDMtMjAgMjQ6MDAJMDMtMjAgMDA6MDAJRlAgJiBTCi0jCTA5LTE4CTA5LTE4IDI0OjAwCTEwLTAxIDAxOjAwCUZQOyBndWVzcyAyNDowMHMKLSMgMTk0NAkwNC0wMgkwNC0wMyAwMjowMAkJCVMgKHNlZSBDLUV1cikKLSMJMDktMTYJMTAtMDIgMDM6MDAJCQlGUDsgZ3Vlc3MgMjQ6MDBzCi0jIDE5NDUJMDktMTQJMDktMTYgMjQ6MDAJCQlGUDsgZ3Vlc3MgMjQ6MDBzCi0jIDE5NzAJMDUtMjEJMDUtMzEgMDA6MDAJCQlTCi0jCTA5LTIwCTA5LTI3IDAwOjAwCQkJUwotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSXRhbHkJMTkxNglvbmx5CS0JSnVuCSAzCTA6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTE2CW9ubHkJLQlPY3QJIDEJMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5MTcJb25seQktCUFwcgkgMQkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTkxNwlvbmx5CS0JU2VwCTMwCTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTE4CW9ubHkJLQlNYXIJMTAJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5MTgJMTkxOQktCU9jdAlTdW4+PTEJMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5MTkJb25seQktCU1hcgkgMgkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTkyMAlvbmx5CS0JTWFyCTIxCTA6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTIwCW9ubHkJLQlTZXAJMTkJMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5NDAJb25seQktCUp1bgkxNQkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk0NAlvbmx5CS0JU2VwCTE3CTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTQ1CW9ubHkJLQlBcHIJIDIJMjowMAkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk0NQlvbmx5CS0JU2VwCTE1CTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTQ2CW9ubHkJLQlNYXIJMTcJMjowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NDYJb25seQktCU9jdAkgNgkyOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTk0Nwlvbmx5CS0JTWFyCTE2CTA6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTQ3CW9ubHkJLQlPY3QJIDUJMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5NDgJb25seQktCUZlYgkyOQkyOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk0OAlvbmx5CS0JT2N0CSAzCTI6MDBzCTAJLQotUnVsZQlJdGFseQkxOTY2CTE5NjgJLQlNYXkJU3VuPj0yMgkwOjAwCTE6MDAJUwotUnVsZQlJdGFseQkxOTY2CTE5NjkJLQlTZXAJU3VuPj0yMgkwOjAwCTAJLQotUnVsZQlJdGFseQkxOTY5CW9ubHkJLQlKdW4JIDEJMDowMAkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk3MAlvbmx5CS0JTWF5CTMxCTA6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzAJb25seQktCVNlcAlsYXN0U3VuCTA6MDAJMAktCi1SdWxlCUl0YWx5CTE5NzEJMTk3MgktCU1heQlTdW4+PTIyCTA6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzEJb25seQktCVNlcAlsYXN0U3VuCTE6MDAJMAktCi1SdWxlCUl0YWx5CTE5NzIJb25seQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlJdGFseQkxOTczCW9ubHkJLQlKdW4JIDMJMDowMAkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk3MwkxOTc0CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJSXRhbHkJMTk3NAlvbmx5CS0JTWF5CTI2CTA6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzUJb25seQktCUp1bgkgMQkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk3NQkxOTc3CS0JU2VwCWxhc3RTdW4JMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5NzYJb25seQktCU1heQkzMAkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk3NwkxOTc5CS0JTWF5CVN1bj49MjIJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzgJb25seQktCU9jdAkgMQkwOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTk3OQlvbmx5CS0JU2VwCTMwCTA6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvUm9tZQkwOjQ5OjU2IC0JTE1UCTE4NjYgU2VwIDIyCi0JCQkwOjQ5OjU2CS0JUk1UCTE4OTMgTm92ICAxIDA6MDBzICMgUm9tZSBNZWFuCi0JCQkxOjAwCUl0YWx5CUNFJXNUCTE5NDIgTm92ICAyIDI6MDBzCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgSnVsCi0JCQkxOjAwCUl0YWx5CUNFJXNUCTE5ODAKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotTGluawlFdXJvcGUvUm9tZQlFdXJvcGUvVmF0aWNhbgotTGluawlFdXJvcGUvUm9tZQlFdXJvcGUvU2FuX01hcmlubwotCi0jIExhdHZpYQotCi0jIEZyb20gTGllbmUgS2FuZXBlICgxOTk4LTA5LTE3KToKLQotIyBJIGFza2VkIGFib3V0IHRoaXMgbWF0dGVyIFNjaWVudGlmaWMgU2VjcmV0YXJ5IG9mIHRoZSBJbnN0aXR1dGUgb2YgQXN0cm9ub215Ci0jIG9mIFRoZSBVbml2ZXJzaXR5IG9mIExhdHZpYSBEci4gcGFlZCBNci4gSWxnb25pcyBWaWxrcy4gSSBhbHNvIHNlYXJjaGVkIHRoZQotIyBjb3JyZWN0IGRhdGEgaW4ganVyaWRpY2FsIGFjdHMgYW5kIEkgZm91bmQgc29tZSBqdXJpZGljYWwgZG9jdW1lbnRzIGFib3V0Ci0jIGNoYW5nZXMgaW4gdGhlIGNvdW50aW5nIG9mIHRpbWUgaW4gTGF0dmlhIGZyb20gMTk4MS4uLi4KLSMKLSMgQWN0IE5vLjM1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBMYXR2aWFuIFNTUiBvZiAxOTgxLTAxLTIyIC4uLgotIyBhY2NvcmRpbmcgdG8gdGhlIEFjdCBOby45MjUgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIFVTU1Igb2YgMTk4MC0xMC0yNAotIyAuLi46IGFsbCB5ZWFyIHJvdW5kIHRoZSB0aW1lIG9mIDJuZCB0aW1lIHpvbmUgKyAxIGhvdXIsIGluIGFkZGl0aW9uIHR1cm5pbmcKLSMgdGhlIGhhbmRzIG9mIHRoZSBjbG9jayAxIGhvdXIgZm9yd2FyZCBvbiAxIEFwcmlsIGF0IDAwOjAwIChHTVQgMzEgTWFyY2ggMjE6MDApCi0jIGFuZCAxIGhvdXIgYmFja3dhcmQgb24gdGhlIDEgT2N0b2JlciBhdCAwMDowMCAoR01UIDMwIFNlcHRlbWJlciAyMDowMCkuCi0jCi0jIEFjdCBOby41OTIgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIExhdHZpYW4gU1NSIG9mIDE5ODQtMDktMjQgLi4uCi0jIGFjY29yZGluZyB0byB0aGUgQWN0IE5vLjk2NyBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgVVNTUiBvZiAxOTg0LTA5LTEzCi0jIC4uLjogYWxsIHllYXIgcm91bmQgdGhlIHRpbWUgb2YgMm5kIHRpbWUgem9uZSArIDEgaG91ciwgaW4gYWRkaXRpb24gdHVybmluZwotIyB0aGUgaGFuZHMgb2YgdGhlIGNsb2NrIDEgaG91ciBmb3J3YXJkIG9uIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCBhdCAwMjowMAotIyAoR01UIDIzOjAwIG9uIHRoZSBwcmV2aW91cyBkYXkpIGFuZCAxIGhvdXIgYmFja3dhcmQgb24gdGhlIGxhc3QgU3VuZGF5IG9mCi0jIFNlcHRlbWJlciBhdCAwMzowMCAoR01UIDIzOjAwIG9uIHRoZSBwcmV2aW91cyBkYXkpLgotIwotIyBBY3QgTm8uODEgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIExhdHZpYW4gU1NSIG9mIDE5ODktMDMtMjIgLi4uCi0jIGFjY29yZGluZyB0byB0aGUgQWN0IE5vLjIyNyBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgVVNTUiBvZiAxOTg5LTAzLTE0Ci0jIC4uLjogc2luY2UgdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIDE5ODkgaW4gTGl0aHVhbmlhbiBTU1IsIExhdHZpYW4gU1NSLAotIyBFc3RvbmlhbiBTU1IgYW5kIEthbGluaW5ncmFkIHJlZ2lvbiBvZiBSdXNzaWFuIEZlZGVyYXRpb24gYWxsIHllYXIgcm91bmQgdGhlCi0jIHRpbWUgb2YgMm5kIHRpbWUgem9uZSAoTW9zY293IHRpbWUgbWludXMgb25lIGhvdXIpLiBPbiB0aGUgdGVycml0b3J5IG9mIExhdHZpYQotIyB0cmFuc2l0aW9uIHRvIHN1bW1lciB0aW1lIGlzIHBlcmZvcm1lZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgTWFyY2ggYXQgMDI6MDAKLSMgKEdNVCAwMDowMCksIHR1cm5pbmcgdGhlIGhhbmRzIG9mIHRoZSBjbG9jayAxIGhvdXIgZm9yd2FyZC4gIFRoZSBlbmQgb2YKLSMgZGF5bGlnaHQgc2F2aW5nIHRpbWUgaXMgcGVyZm9ybWVkIG9uIHRoZSBsYXN0IFN1bmRheSBvZiBTZXB0ZW1iZXIgYXQgMDM6MDAKLSMgKEdNVCAwMDowMCksIHR1cm5pbmcgdGhlIGhhbmRzIG9mIHRoZSBjbG9jayAxIGhvdXIgYmFja3dhcmQuIEV4Y2VwdGlvbiBpcwotIyAxOTg5LTAzLTI2LCB3aGVuIHdlIG11c3Qgbm90IHR1cm4gdGhlIGhhbmRzIG9mIHRoZSBjbG9jay4uLi4KLSMKLSMgVGhlIFJlZ3VsYXRpb25zIG9mIHRoZSBDYWJpbmV0IG9mIE1pbmlzdGVycyBvZiB0aGUgUmVwdWJsaWMgb2YgTGF0dmlhIG9mCi0jIDE5OTctMDEtMjEgb24gdHJhbnNpdGlvbiB0byBTdW1tZXIgdGltZSAuLi4gZXN0YWJsaXNoZWQgdGhlIHNhbWUgb3JkZXIgb2YKLSMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHNldHRpbmdzIGFzIGluIHRoZSBTdGF0ZXMgb2YgdGhlIEV1cm9wZWFuIFVuaW9uLgotCi0jIEZyb20gQW5kcmVpIEl2YW5vdiAoMjAwMC0wMy0wNik6Ci0jIFRoaXMgeWVhciBMYXR2aWEgd2lsbCBub3Qgc3dpdGNoIHRvIERheWxpZ2h0IFNhdmluZ3MgVGltZSAoYXMgc3BlY2lmaWVkIGluCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubHYtbGFpa3MubHYvd3d3cmFrc3RpLzIwMDAvMDcxMDcyL3ZkNC5odG0iPgotIyBUaGUgUmVndWxhdGlvbnMgb2YgdGhlIENhYmluZXQgb2YgTWluaXN0ZXJzIG9mIHRoZSBSZXAuIG9mIExhdHZpYSBvZgotIyAyOS1GZWItMjAwMCAoIzc5KTwvYT4sIGluIExhdHZpYW4gZm9yIHN1YnNjcmliZXJzIG9ubHkpLgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucmZlcmwub3JnL25ld3NsaW5lLzIwMDEvMDEvMy1DRUUvY2VlLTAzMDEwMS5odG1sIj4KLSMgRnJvbSBSRkUvUkwgTmV3c2xpbmUgKDIwMDEtMDEtMDMpLCBub3RlZCBhZnRlciBhIGhlYWRzLXVwIGJ5IFJpdmVzIE1jRG93OgotIyA8L2E+Ci0jIFRoZSBMYXR2aWFuIGdvdmVybm1lbnQgb24gMiBKYW51YXJ5IGRlY2lkZWQgdGhhdCB0aGUgY291bnRyeSB3aWxsCi0jIGluc3RpdHV0ZSBkYXlsaWdodC1zYXZpbmcgdGltZSB0aGlzIHNwcmluZywgTEVUQSByZXBvcnRlZC4KLSMgTGFzdCBGZWJydWFyeSB0aGUgdGhyZWUgQmFsdGljIHN0YXRlcyBkZWNpZGVkIG5vdCB0byB0dXJuIGJhY2sgdGhlaXIKLSMgY2xvY2tzIG9uZSBob3VyIGluIHRoZSBzcHJpbmcuLi4uCi0jIE1pbmlzdGVyIG9mIEVjb25vbXkgQWlnYXJzIEthbHZpdGlzIG5vdGVkIHRoYXQgTGF0dmlhIGhhZCB0b28gZmV3Ci0jIGRheWxpZ2h0IGhvdXJzIGFuZCB0aHVzIGRlY2lkZWQgdG8gY29tcGx5IHdpdGggYSBkcmFmdCBFdXJvcGVhbgotIyBDb21taXNzaW9uIGRpcmVjdGl2ZSB0aGF0IHByb3ZpZGVzIGZvciBpbnN0aXR1dGluZyBkYXlsaWdodC1zYXZpbmcKLSMgdGltZSBpbiBFVSBjb3VudHJpZXMgYmV0d2VlbiAyMDAyIGFuZCAyMDA2LiBUaGUgTGF0dmlhbiBnb3Zlcm5tZW50Ci0jIHVyZ2VkIExpdGh1YW5pYSBhbmQgRXN0b25pYSB0byBhZG9wdCBhIHNpbWlsYXIgdGltZSBwb2xpY3ksIGJ1dCBpdAotIyBhcHBlYXJzIHRoYXQgdGhleSB3aWxsIG5vdCBkbyBzby4uLi4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTGF0dmlhCTE5ODkJMTk5NgktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUJTGF0dmlhCTE5ODkJMTk5NgktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1JpZ2EJMTozNjoyNAktCUxNVAkxODgwCi0JCQkxOjM2OjI0CS0JUk1UCTE5MTggQXByIDE1IDI6MDAgI1JpZ2EgTWVhbiBUaW1lCi0JCQkxOjM2OjI0CTE6MDAJTFNUCTE5MTggU2VwIDE2IDM6MDAgI0xhdHZpYW4gU3VtbWVyCi0JCQkxOjM2OjI0CS0JUk1UCTE5MTkgQXByICAxIDI6MDAKLQkJCTE6MzY6MjQJMTowMAlMU1QJMTkxOSBNYXkgMjIgMzowMAotCQkJMTozNjoyNAktCVJNVAkxOTI2IE1heSAxMQotCQkJMjowMAktCUVFVAkxOTQwIEF1ZyAgNQotCQkJMzowMAktCU1TSwkxOTQxIEp1bAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IE9jdCAxMwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTg5IE1hciBsYXN0U3VuIDI6MDBzCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTg5IFNlcCBsYXN0U3VuIDI6MDBzCi0JCQkyOjAwCUxhdHZpYQlFRSVzVAkxOTk3IEphbiAyMQotCQkJMjowMAlFVQlFRSVzVAkyMDAwIEZlYiAyOQotCQkJMjowMAktCUVFVAkyMDAxIEphbiAgMgotCQkJMjowMAlFVQlFRSVzVAotCi0jIExpZWNodGVuc3RlaW4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1ZhZHV6CTA6Mzg6MDQgLQlMTVQJMTg5NCBKdW4KLQkJCTE6MDAJLQlDRVQJMTk4MQotCQkJMTowMAlFVQlDRSVzVAotCi0jIExpdGh1YW5pYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMTEtMjIpOgotIyBJQVRBIFNTSU0gKDE5OTIvMTk5Nikgc2F5cyBMaXRodWFuaWEgdXNlcyBXLUV1ciBydWxlcywgYnV0IHNpbmNlIGl0IGlzCi0jIGtub3duIHRvIGJlIHdyb25nIGFib3V0IEVzdG9uaWEgYW5kIExhdHZpYSwgYXNzdW1lIGl0J3Mgd3JvbmcgaGVyZSB0b28uCi0KLSMgRnJvbSBNYXJpdXMgR2VkbWluYXMgKDE5OTgtMDgtMDcpOgotIyBJIHdvdWxkIGxpa2UgdG8gaW5mb3JtIHRoYXQgaW4gdGhpcyB5ZWFyIExpdGh1YW5pYW4gdGltZSB6b25lCi0jIChFdXJvcGUvVmlsbml1cykgd2FzIGNoYW5nZWQuCi0KLSMgRnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmVsdGEubHQvIj5FTFRBPC9hPiBOby4gOTcyICgyNTgyKSAoMTk5OS0wOS0yOSksCi0jIHZpYSBTdGVmZmVuIFRob3JzZW46Ci0jIExpdGh1YW5pYSBoYXMgc2hpZnRlZCBiYWNrIHRvIHRoZSBzZWNvbmQgdGltZSB6b25lIChHTVQgcGx1cyB0d28gaG91cnMpCi0jIHRvIGJlIHZhbGlkIGhlcmUgc3RhcnRpbmcgZnJvbSBPY3RvYmVyIDMxLAotIyBhcyBkZWNpZGVkIGJ5IHRoZSBuYXRpb25hbCBnb3Zlcm5tZW50IG9uIFdlZG5lc2RheS4uLi4KLSMgVGhlIExpdGh1YW5pYW4gZ292ZXJubWVudCBhbHNvIGFubm91bmNlZCBwbGFucyB0byBjb25zaWRlciBhCi0jIG1vdGlvbiB0byBnaXZlIHVwIHNoaWZ0aW5nIHRvIHN1bW1lciB0aW1lIGluIHNwcmluZywgYXMgaXQgd2FzCi0jIGFscmVhZHkgZG9uZSBieSBFc3RvbmlhLgotCi0jIEZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudG91cmlzbS5sdC9pbmZvcm1hL2ZmLmh0bSI+Ci0jIEZhY3QgRmlsZSwgTGl0aHVhbmlhbiBTdGF0ZSBEZXBhcnRtZW50IG9mIFRvdXJpc20KLSMgPC9hPiAoMjAwMC0wMy0yNyk6IExvY2FsIHRpbWUgaXMgR01UKzIgaG91cnMgLi4uLCBubyBkYXlsaWdodCBzYXZpbmcuCi0KLSMgRnJvbSBhIHVzZXIgdmlhIEtsYXVzIE1hcnRlbiAoMjAwMy0wMi0wNyk6Ci0jIEFzIGEgY2FuZGlkYXRlIGZvciBtZW1iZXJzaGlwIG9mIHRoZSBFdXJvcGVhbiBVbmlvbiwgTGl0aHVhbmlhIHdpbGwKLSMgb2JzZXJ2ZSBTdW1tZXIgVGltZSBpbiAyMDAzLCBjaGFuZ2luZyBpdHMgY2xvY2tzIGF0IHRoZSB0aW1lcyBsYWlkCi0jIGRvd24gaW4gRVUgRGlyZWN0aXZlIDIwMDAvODQgb2YgMTkuSS4wMSAoaS5lLiBhdCB0aGUgc2FtZSB0aW1lcyBhcyBpdHMKLSMgbmVpZ2hib3VyIExhdHZpYSkuIFRoZSB0ZXh0IG9mIHRoZSBMaXRodWFuaWFuIGdvdmVybm1lbnQgT3JkZXIgb2YKLSMgNy5YSS4wMiB0byB0aGlzIGVmZmVjdCBjYW4gYmUgZm91bmQgYXQKLSMgaHR0cDovL3d3dy5scnZrLmx0L251dC8xMS9uMTc0OS5odG0KLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9WaWxuaXVzCTE6NDE6MTYJLQlMTVQJMTg4MAotCQkJMToyNDowMAktCVdNVAkxOTE3CSAgICAjIFdhcnNhdyBNZWFuIFRpbWUKLQkJCTE6MzU6MzYJLQlLTVQJMTkxOSBPY3QgMTAgIyBLYXVuYXMgTWVhbiBUaW1lCi0JCQkxOjAwCS0JQ0VUCTE5MjAgSnVsIDEyCi0JCQkyOjAwCS0JRUVUCTE5MjAgT2N0ICA5Ci0JCQkxOjAwCS0JQ0VUCTE5NDAgQXVnICAzCi0JCQkzOjAwCS0JTVNLCTE5NDEgSnVuIDI0Ci0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXVnCi0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTkxIFNlcCAyOSAyOjAwcwotCQkJMjowMAlDLUV1cglFRSVzVAkxOTk4Ci0JCQkyOjAwCS0JRUVUCTE5OTggTWFyIDI5IDE6MDB1Ci0JCQkxOjAwCUVVCUNFJXNUCTE5OTkgT2N0IDMxIDE6MDB1Ci0JCQkyOjAwCS0JRUVUCTIwMDMgSmFuICAxCi0JCQkyOjAwCUVVCUVFJXNUCi0KLSMgTHV4ZW1ib3VyZwotIyBXaGl0bWFuIGRpc2FncmVlcyB3aXRoIG1vc3Qgb2YgdGhlc2UgZGF0ZXMgaW4gbWlub3Igd2F5czsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlMdXgJMTkxNglvbmx5CS0JTWF5CTE0CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkxNglvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQotUnVsZQlMdXgJMTkxNwlvbmx5CS0JQXByCTI4CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkxNwlvbmx5CS0JU2VwCTE3CSAxOjAwCTAJLQotUnVsZQlMdXgJMTkxOAlvbmx5CS0JQXByCU1vbj49MTUJIDI6MDBzCTE6MDAJUwotUnVsZQlMdXgJMTkxOAlvbmx5CS0JU2VwCU1vbj49MTUJIDI6MDBzCTAJLQotUnVsZQlMdXgJMTkxOQlvbmx5CS0JTWFyCSAxCTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkxOQlvbmx5CS0JT2N0CSA1CSAzOjAwCTAJLQotUnVsZQlMdXgJMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyMAlvbmx5CS0JT2N0CTI0CSAyOjAwCTAJLQotUnVsZQlMdXgJMTkyMQlvbmx5CS0JTWFyCTE0CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyMQlvbmx5CS0JT2N0CTI2CSAyOjAwCTAJLQotUnVsZQlMdXgJMTkyMglvbmx5CS0JTWFyCTI1CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyMglvbmx5CS0JT2N0CVN1bj49MgkgMTowMAkwCS0KLVJ1bGUJTHV4CTE5MjMJb25seQktCUFwcgkyMQkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjMJb25seQktCU9jdAlTdW4+PTIJIDI6MDAJMAktCi1SdWxlCUx1eAkxOTI0CW9ubHkJLQlNYXIJMjkJMjM6MDAJMTowMAlTCi1SdWxlCUx1eAkxOTI0CTE5MjgJLQlPY3QJU3VuPj0yCSAxOjAwCTAJLQotUnVsZQlMdXgJMTkyNQlvbmx5CS0JQXByCSA1CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyNwlvbmx5CS0JQXByCSA5CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyOAlvbmx5CS0JQXByCTE0CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyOQlvbmx5CS0JQXByCTIwCTIzOjAwCTE6MDAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvTHV4ZW1ib3VyZwkwOjI0OjM2IC0JTE1UCTE5MDQgSnVuCi0JCQkxOjAwCUx1eAlDRSVzVAkxOTE4IE5vdiAyNQotCQkJMDowMAlMdXgJV0Ulc1QJMTkyOSBPY3QgIDYgMjowMHMKLQkJCTA6MDAJQmVsZ2l1bQlXRSVzVAkxOTQwIE1heSAxNCAzOjAwCi0JCQkxOjAwCUMtRXVyCVdFJXNUCTE5NDQgU2VwIDE4IDM6MDAKLQkJCTE6MDAJQmVsZ2l1bQlDRSVzVAkxOTc3Ci0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgTWFjZWRvbmlhCi0jIHNlZSBTZXJiaWEKLQotIyBNYWx0YQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTWFsdGEJMTk3Mwlvbmx5CS0JTWFyCTMxCTA6MDBzCTE6MDAJUwotUnVsZQlNYWx0YQkxOTczCW9ubHkJLQlTZXAJMjkJMDowMHMJMAktCi1SdWxlCU1hbHRhCTE5NzQJb25seQktCUFwcgkyMQkwOjAwcwkxOjAwCVMKLVJ1bGUJTWFsdGEJMTk3NAlvbmx5CS0JU2VwCTE2CTA6MDBzCTAJLQotUnVsZQlNYWx0YQkxOTc1CTE5NzkJLQlBcHIJU3VuPj0xNQkyOjAwCTE6MDAJUwotUnVsZQlNYWx0YQkxOTc1CTE5ODAJLQlTZXAJU3VuPj0xNQkyOjAwCTAJLQotUnVsZQlNYWx0YQkxOTgwCW9ubHkJLQlNYXIJMzEJMjowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL01hbHRhCTA6NTg6MDQgLQlMTVQJMTg5MyBOb3YgIDIgMDowMHMgIyBWYWxsZXR0YQotCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwcwotCQkJMTowMAlJdGFseQlDRSVzVAkxOTczIE1hciAzMQotCQkJMTowMAlNYWx0YQlDRSVzVAkxOTgxCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgTW9sZG92YQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBkYXRhYmFzZSBmb2xsb3dlZCBTaGFua3MgJiBQb3R0ZW5nZXIsIHdobyB3cml0ZQotIyB0aGF0IFRpcmFzcG9sIHN3aXRjaGVkIHRvIE1vc2NvdyB0aW1lIG9uIDE5OTItMDEtMTkgYXQgMDI6MDAuCi0jIEhvd2V2ZXIsIHRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gZXJyb3IsIGFzIE1vbGRvdmEgZGVjbGFyZWQgaW5kZXBlbmRlbmNlCi0jIG9uIDE5OTEtMDgtMjcgKHRoZSAxOTkyLTAxLTE5IGRhdGUgaXMgdGhhdCBvZiBhIFJ1c3NpYW4gZGVjcmVlKS4KLSMgSW4gZWFybHkgMTk5MiB0aGVyZSB3YXMgbGFyZ2Utc2NhbGUgaW50ZXJldGhuaWMgdmlvbGVuY2UgaW4gdGhlIGFyZWEKLSMgYW5kIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIFJ1c3NvcGhvbmVzIGNvbnRpbnVlZCB0byBvYnNlcnZlIE1vc2NvdyB0aW1lLgotIyBCdXQgW3R3byBwZW9wbGVdIHNlcGFyYXRlbHkgcmVwb3J0ZWQgdmlhCi0jIEplc3BlciBOb3JnYWFyZCB0aGF0IGFzIG9mIDIwMDEtMDEtMjQgVGlyYXNwb2wgd2FzIGxpa2UgQ2hpc2luYXUuCi0jIFRoZSBUaXJhc3BvbCBlbnRyeSBoYXMgdGhlcmVmb3JlIGJlZW4gcmVtb3ZlZCBmb3Igbm93LgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9DaGlzaW5hdQkxOjU1OjIwIC0JTE1UCTE4ODAKLQkJCTE6NTUJLQlDTVQJMTkxOCBGZWIgMTUgIyBDaGlzaW5hdSBNVAotCQkJMTo0NDoyNAktCUJNVAkxOTMxIEp1bCAyNCAjIEJ1Y2hhcmVzdCBNVAotCQkJMjowMAlSb21hbmlhCUVFJXNUCTE5NDAgQXVnIDE1Ci0JCQkyOjAwCTE6MDAJRUVTVAkxOTQxIEp1bCAxNwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZyAyNAotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTAgTWF5IDYKLQkJCTI6MDAJLQlFRVQJMTk5MQotCQkJMjowMAlSdXNzaWEJRUUlc1QJMTk5MgotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk3Ci0jIFNlZSBSb21hbmlhIGNvbW1lbnRhcnkgZm9yIHRoZSBndWVzc2VkIDE5OTcgdHJhbnNpdGlvbiB0byBFVSBydWxlcy4KLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBNb25hY28KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMDowOToyMCBmb3IgUGFyaXMgTWVhbiBUaW1lOyBnbyB3aXRoIEhvd3NlJ3MKLSMgbW9yZSBwcmVjaXNlIDA6MDk6MjEuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9Nb25hY28JMDoyOTozMiAtCUxNVAkxODkxIE1hciAxNQotCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgICAjIFBhcmlzIE1lYW4gVGltZQotCQkJMDowMAlGcmFuY2UJV0Ulc1QJMTk0NSBTZXAgMTYgMzowMAotCQkJMTowMAlGcmFuY2UJQ0Ulc1QJMTk3NwotCQkJMTowMAlFVQlDRSVzVAotCi0jIE1vbnRlbmVncm8KLSMgc2VlIFNlcmJpYQotCi0jIE5ldGhlcmxhbmRzCi0KLSMgSG93c2Ugd3JpdGVzIHRoYXQgdGhlIE5ldGhlcmxhbmRzJyByYWlsd2F5cyB1c2VkIEdNVCBiZXR3ZWVuIDE4OTIgYW5kIDE5NDAsCi0jIGJ1dCBmb3Igb3RoZXIgcHVycG9zZXMgdGhlIE5ldGhlcmxhbmRzIHVzZWQgQW1zdGVyZGFtIG1lYW4gdGltZS4KLQotIyBIb3dldmVyLCBSb2JlcnQgSC4gdmFuIEdlbnQgd3JpdGVzICgyMDAxLTA0LTAxKToKLSMgSG93c2UncyBzdGF0ZW1lbnQgaXMgb25seSBjb3JyZWN0IHVwIHRvIDE5MDkuIEZyb20gMTkwOS0wNS0wMSAoMDA6MDA6MDAKLSMgQW1zdGVyZGFtIG1lYW4gdGltZSkgb253YXJkcywgdGhlIHdob2xlIG9mIHRoZSBOZXRoZXJsYW5kcyAoaW5jbHVkaW5nCi0jIHRoZSBEdXRjaCByYWlsd2F5cykgd2FzIHJlcXVpcmVkIGJ5IGxhdyB0byBvYnNlcnZlIEFtc3RlcmRhbSBtZWFuIHRpbWUKLSMgKDE5IG1pbnV0ZXMgMzIuMTMgc2Vjb25kcyBhaGVhZCBvZiBHTVQpLiBUaGlzIGhhZCBhbHJlYWR5IGJlZW4gdGhlCi0jIGNvbW1vbiBwcmFjdGljZSAoZXhjZXB0IGZvciB0aGUgcmFpbHdheXMpIGZvciBtYW55IGRlY2FkZXMgYnV0IGl0IHdhcwotIyBub3QgdW50aWwgMTkwOSB3aGVuIHRoZSBEdXRjaCBnb3Zlcm5tZW50IGZpbmFsbHkgZGVmaW5lZCB0aGlzIGJ5IGxhdy4KLSMgT24gMTkzNy0wNy0wMSB0aGlzIHdhcyBjaGFuZ2VkIHRvIDIwIG1pbnV0ZXMgKGV4YWN0bHkpIGFoZWFkIG9mIEdNVCBhbmQKLSMgd2FzIGdlbmVyYWxseSBrbm93biBhcyBEdXRjaCBUaW1lICgiTmVkZXJsYW5kc2UgVGlqZCIpLgotIwotIyAoMjAwMS0wNC0wOCk6Ci0jIDE4OTItMDUtMDEgd2FzIHRoZSBkYXRlIHdoZW4gdGhlIER1dGNoIHJhaWx3YXlzIHdlcmUgYnkgbGF3IHJlcXVpcmVkIHRvCi0jIG9ic2VydmUgR01UIHdoaWxlIHRoZSByZW1haW5kZXIgb2YgdGhlIE5ldGhlcmxhbmRzIGFkaGVyZWQgdG8gdGhlIGNvbW1vbgotIyBwcmFjdGljZSBvZiBmb2xsb3dpbmcgQW1zdGVyZGFtIG1lYW4gdGltZS4KLSMKLSMgKDIwMDEtMDQtMDkpOgotIyBJbiAxODM1IHRoZSBhdXRob3JpdGllcyBvZiB0aGUgcHJvdmluY2Ugb2YgTm9ydGggSG9sbGFuZCByZXF1ZXN0ZWQgdGhlCi0jIG11bmljaXBhbCBhdXRob3JpdGllcyBvZiB0aGUgdG93bnMgYW5kIGNpdGllcyBpbiB0aGUgcHJvdmluY2UgdG8gb2JzZXJ2ZQotIyBBbXN0ZXJkYW0gbWVhbiB0aW1lIGJ1dCBJIGRvIG5vdCBrbm93IGluIGhvdyBtYW55IGNhc2VzIHRoaXMgcmVxdWVzdCB3YXMKLSMgYWN0dWFsbHkgZm9sbG93ZWQuCi0jCi0jIEZyb20gMTg1MiBvbndhcmRzIHRoZSBEdXRjaCB0ZWxlZ3JhcGggb2ZmaWNlcyB3ZXJlIGJ5IGxhdyByZXF1aXJlZCB0bwotIyBvYnNlcnZlIEFtc3RlcmRhbSBtZWFuIHRpbWUuIEFzIHRoZSB0aW1lIHNpZ25hbHMgZnJvbSB0aGUgb2JzZXJ2YXRvcnkgb2YKLSMgTGVpZGVuIHdlcmUgYWxzbyBkaXN0cmlidXRlZCBieSB0aGUgdGVsZWdyYXBoIHN5c3RlbSwgSSBhc3N1bWUgdGhhdCBtb3N0Ci0jIHBsYWNlcyBsaW5rZWQgdXAgd2l0aCB0aGUgdGVsZWdyYXBoIChhbmQgcmFpbHdheSkgc3lzdGVtIGF1dG9tYXRpY2FsbHkKLSMgYWRvcHRlZCBBbXN0ZXJkYW0gbWVhbiB0aW1lLgotIwotIyBBbHRob3VnaCB0aGUgZWFybHkgRHV0Y2ggcmFpbHdheSBjb21wYW5pZXMgaW5pdGlhbGx5IG9ic2VydmVkIGEgdmFyaWV0eQotIyBvZiB0aW1lcywgbW9zdCBvZiB0aGVtIGhhZCBhZG9wdGVkIEFtc3RlcmRhbSBtZWFuIHRpbWUgYnkgMTg1OCBidXQgaXQKLSMgd2FzIG5vdCB1bnRpbCAxODY2IHdoZW4gdGhleSB3ZXJlIGFsbCByZXF1aXJlZCBieSBsYXcgdG8gb2JzZXJ2ZQotIyBBbXN0ZXJkYW0gbWVhbiB0aW1lLgotCi0jIFRoZSBkYXRhIGJlZm9yZSAxOTQ1IGFyZSB0YWtlbiBmcm9tCi0jIDxodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L3dldHRpamQvd2V0dGlqZC5odG0+LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOZXRoCTE5MTYJb25seQktCU1heQkgMQkwOjAwCTE6MDAJTlNUCSMgTmV0aGVybGFuZHMgU3VtbWVyIFRpbWUKLVJ1bGUJTmV0aAkxOTE2CW9ubHkJLQlPY3QJIDEJMDowMAkwCUFNVAkjIEFtc3RlcmRhbSBNZWFuIFRpbWUKLVJ1bGUJTmV0aAkxOTE3CW9ubHkJLQlBcHIJMTYJMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTE3CW9ubHkJLQlTZXAJMTcJMjowMHMJMAlBTVQKLVJ1bGUJTmV0aAkxOTE4CTE5MjEJLQlBcHIJTW9uPj0xCTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkxOAkxOTIxCS0JU2VwCWxhc3RNb24JMjowMHMJMAlBTVQKLVJ1bGUJTmV0aAkxOTIyCW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkxOjAwCU5TVAotUnVsZQlOZXRoCTE5MjIJMTkzNgktCU9jdAlTdW4+PTIJMjowMHMJMAlBTVQKLVJ1bGUJTmV0aAkxOTIzCW9ubHkJLQlKdW4JRnJpPj0xCTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkyNAlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTI1CW9ubHkJLQlKdW4JRnJpPj0xCTI6MDBzCTE6MDAJTlNUCi0jIEZyb20gMTkyNiB0aHJvdWdoIDE5MzkgRFNUIGJlZ2FuIDA1LTE1LCBleGNlcHQgdGhhdCBpdCB3YXMgZGVsYXllZCBieSBhIHdlZWsKLSMgaW4geWVhcnMgd2hlbiAwNS0xNSBmZWxsIGluIHRoZSBQZW50ZWNvc3Qgd2Vla2VuZC4KLVJ1bGUJTmV0aAkxOTI2CTE5MzEJLQlNYXkJMTUJMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTMyCW9ubHkJLQlNYXkJMjIJMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTMzCTE5MzYJLQlNYXkJMTUJMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTM3CW9ubHkJLQlNYXkJMjIJMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTM3CW9ubHkJLQlKdWwJIDEJMDowMAkxOjAwCVMKLVJ1bGUJTmV0aAkxOTM3CTE5MzkJLQlPY3QJU3VuPj0yCTI6MDBzCTAJLQotUnVsZQlOZXRoCTE5MzgJMTkzOQktCU1heQkxNQkyOjAwcwkxOjAwCVMKLVJ1bGUJTmV0aAkxOTQ1CW9ubHkJLQlBcHIJIDIJMjowMHMJMTowMAlTCi1SdWxlCU5ldGgJMTk0NQlvbmx5CS0JU2VwCTE2CTI6MDBzCTAJLQotIwotIyBBbXN0ZXJkYW0gTWVhbiBUaW1lIHdhcyArMDA6MTk6MzIuMTMgZXhhY3RseSwgYnV0IHRoZSAuMTMgaXMgb21pdHRlZAotIyBiZWxvdyBiZWNhdXNlIHRoZSBjdXJyZW50IGZvcm1hdCByZXF1aXJlcyBHTVRPRkYgdG8gYmUgYW4gaW50ZWdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgRXVyb3BlL0Ftc3RlcmRhbQkwOjE5OjMyIC0JTE1UCTE4MzUKLQkJCTA6MTk6MzIJTmV0aAklcwkxOTM3IEp1bCAgMQotCQkJMDoyMAlOZXRoCU5FJXNUCTE5NDAgTWF5IDE2IDA6MDAgIyBEdXRjaCBUaW1lCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDAKLQkJCTE6MDAJTmV0aAlDRSVzVAkxOTc3Ci0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgTm9yd2F5Ci0jIGh0dHA6Ly9tZXQubm8vbWV0L21ldF9sZXgvcV91L3NvbW1lcnRpZC5odG1sICgyMDA0LTAxKSBhZ3JlZXMgd2l0aCBTaGFua3MgJgotIyBQb3R0ZW5nZXIuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOb3J3YXkJMTkxNglvbmx5CS0JTWF5CTIyCTE6MDAJMTowMAlTCi1SdWxlCU5vcndheQkxOTE2CW9ubHkJLQlTZXAJMzAJMDowMAkwCS0KLVJ1bGUJTm9yd2F5CTE5NDUJb25seQktCUFwcgkgMgkyOjAwcwkxOjAwCVMKLVJ1bGUJTm9yd2F5CTE5NDUJb25seQktCU9jdAkgMQkyOjAwcwkwCS0KLVJ1bGUJTm9yd2F5CTE5NTkJMTk2NAktCU1hcglTdW4+PTE1CTI6MDBzCTE6MDAJUwotUnVsZQlOb3J3YXkJMTk1OQkxOTY1CS0JU2VwCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCU5vcndheQkxOTY1CW9ubHkJLQlBcHIJMjUJMjowMHMJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9Pc2xvCTA6NDM6MDAgLQlMTVQJMTg5NSBKYW4gIDEKLQkJCTE6MDAJTm9yd2F5CUNFJXNUCTE5NDAgQXVnIDEwIDIzOjAwCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyICAyOjAwCi0JCQkxOjAwCU5vcndheQlDRSVzVAkxOTgwCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgU3ZhbGJhcmQgJiBKYW4gTWF5ZW4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMS0wNS0wMSk6Ci0jIEFsdGhvdWdoIEkgY291bGQgbm90IGZpbmQgaXQgZXhwbGljaXRseSwgaXQgc2VlbXMgdGhhdCBKYW4gTWF5ZW4gYW5kCi0jIFN2YWxiYXJkIGhhdmUgYmVlbiB1c2luZyB0aGUgc2FtZSB0aW1lIGFzIE5vcndheSBhdCBsZWFzdCBzaW5jZSB0aGUKLSMgdGltZSB0aGV5IHdlcmUgZGVjbGFyZWQgYXMgcGFydHMgb2YgTm9yd2F5LiAgU3ZhbGJhcmQgd2FzIGRlY2xhcmVkCi0jIGFzIGEgcGFydCBvZiBOb3J3YXkgYnkgbGF3IG9mIDE5MjUtMDctMTcgbm8gMTEsIHNlY3Rpb24gNCBhbmQgSmFuCi0jIE1heWVuIGJ5IGxhdyBvZiAxOTMwLTAyLTI3IG5vIDIsIHNlY3Rpb24gMi4gKEZyb20KLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTI1MDcxNy0wMTEuaHRtbCBhbmQKLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTMwMDIyNy0wMDIuaHRtbCkuICBUaGUgbGF3L3JlZ3VsYXRpb24KLSMgZm9yIG5vcm1hbC9zdGFuZGFyZCB0aW1lIGluIE5vcndheSBpcyBmcm9tIDE4OTQtMDYtMjkgbm8gMSAoY2FtZQotIyBpbnRvIG9wZXJhdGlvbiBvbiAxODk1LTAxLTAxKSBhbmQgU3ZhbGJhcmQvSmFuIE1heWVuIHNlZW0gdG8gYmUgYQotIyBwYXJ0IG9mIHRoaXMgbGF3IHNpbmNlIDE5MjUvMTkzMC4gKEZyb20KLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xODk0MDYyOS0wMDEuaHRtbCApIEkgaGF2ZSBub3QgYmVlbgotIyBhYmxlIHRvIGZpbmQgaWYgSmFuIE1heWVuIHVzZWQgYSBkaWZmZXJlbnQgdGltZSB6b25lIChlLmcuIC0wMTAwKQotIyBiZWZvcmUgMTkzMC4gSmFuIE1heWVuIGhhcyBvbmx5IGJlZW4gImluaGFiaXRhdGVkIiBzaW5jZSAxOTIxIGJ5Ci0jIE5vcndlZ2lhbiBtZXRlb3JvbG9naXN0cyBhbmQgbWF5YmUgdXNlZCB0aGUgc2FtZSB0aW1lIGFzIE5vcndheSBldmVyCi0jIHNpbmNlIDE5MjEuICBTdmFsYmFyZCAoQXJjdGljL0xvbmd5ZWFyYnllbikgaGFzIGJlZW4gaW5oYWJpdGVkIHNpbmNlCi0jIGJlZm9yZSAxODk1LCBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IGNoYW5nZWQgdGhlIGxvY2FsIHRpbWUgc29tZXdoZXJlCi0jIGJldHdlZW4gMTg5NSBhbmQgMTkyNSAoaW5jbHVzaXZlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTAxKToKLSMKLSMgQWN0dWFsbHksIEphbiBNYXllbiB3YXMgbmV2ZXIgb2NjdXBpZWQgYnkgR2VybWFueSBkdXJpbmcgV29ybGQgV2FyIElJLAotIyBzbyBpdCBtdXN0IGhhdmUgZGl2ZXJnZWQgZnJvbSBPc2xvIHRpbWUgZHVyaW5nIHRoZSB3YXIsIGFzIE9zbG8gd2FzCi0jIGtlZXBpbmcgQmVybGluIHRpbWUuCi0jCi0jIDxodHRwOi8vaG9tZS5uby5uZXQvamFubWF5ZW4vaGlzdG9yeS5odG0+IHNheXMgdGhhdCB0aGUgbWV0ZW9yb2xvZ2lzdHMKLSMgYnVybmVkIGRvd24gdGhlaXIgc3RhdGlvbiBpbiAxOTQwIGFuZCBsZWZ0IHRoZSBpc2xhbmQsIGJ1dCByZXR1cm5lZCBpbgotIyAxOTQxIHdpdGggYSBzbWFsbCBOb3J3ZWdpYW4gZ2Fycmlzb24gYW5kIGNvbnRpbnVlZCBvcGVyYXRpb25zIGRlc3BpdGUKLSMgZnJlcXVlbnQgYWlyIHR0YWNrcyBmcm9tIEdlcm1hbnMuICBJbiAxOTQzIHRoZSBBbWVyaWNhbnMgZXN0YWJsaXNoZWQgYQotIyByYWRpb2xvY2F0aW5nIHN0YXRpb24gb24gdGhlIGlzbGFuZCwgY2FsbGVkICJBdGxhbnRpYyBDaXR5Ii4gIFBvc3NpYmx5Ci0jIHRoZSBVVEMgb2Zmc2V0IGNoYW5nZWQgZHVyaW5nIHRoZSB3YXIsIGJ1dCBJIHRoaW5rIGl0IHVubGlrZWx5IHRoYXQKLSMgSmFuIE1heWVuIHVzZWQgR2VybWFuIGRheWxpZ2h0LXNhdmluZyBydWxlcy4KLSMKLSMgU3ZhbGJhcmQgaXMgbW9yZSBjb21wbGljYXRlZCwgYXMgaXQgd2FzIHJhaWRlZCBpbiBBdWd1c3QgMTk0MSBieSBhbgotIyBBbGxpZWQgcGFydHkgdGhhdCBldmFjdWF0ZWQgdGhlIGNpdmlsaWFuIHBvcHVsYXRpb24gdG8gRW5nbGFuZCAoc2F5cwotIyA8aHR0cDovL3d3dy5iYXJ0bGVieS5jb20vNjUvc3YvU3ZhbGJhcmQuaHRtbD4pLiAgVGhlIFN2YWxiYXJkIEZBUQotIyA8aHR0cDovL3d3dy5zdmFsYmFyZC5jb20vU3ZhbGJhcmRGQVEuaHRtbD4gc2F5cyB0aGF0IHRoZSBHZXJtYW5zIHdlcmUKLSMgZXhwZWxsZWQgb24gMTk0Mi0wNS0xNC4gIEhvd2V2ZXIsIHNtYWxsIHBhcnRpZXMgb2YgR2VybWFucyBkaWQgcmV0dXJuLAotIyBhbmQgYWNjb3JkaW5nIHRvIFdpbGhlbG0gRGVnZSdzIGJvb2sgIldhciBOb3J0aCBvZiA4MCIgKDE5NTQpCi0jIDxodHRwOi8vd3d3LnVjYWxnYXJ5LmNhL1VvZkMvZGVwYXJ0bWVudHMvVVAvMS01NTIzOC8xLTU1MjM4LTExMC0yLmh0bWw+Ci0jIHRoZSBHZXJtYW4gYXJtZWQgZm9yY2VzIGF0IHRoZSBTdmFsYmFyZCB3ZWF0aGVyIHN0YXRpb24gY29kZS1uYW1lZAotIyBIYXVkZWdlbiBkaWQgbm90IHN1cnJlbmRlciB0byB0aGUgQWxsaWVzIHVudGlsIFNlcHRlbWJlciAxOTQ1LgotIwotIyBBbGwgdGhlc2UgZXZlbnRzIHByZWRhdGUgb3VyIGN1dG9mZiBkYXRlIG9mIDE5NzAuICBVbmxlc3Mgd2UgY2FuCi0jIGNvbWUgdXAgd2l0aCBtb3JlIGRlZmluaXRpdmUgaW5mbyBhYm91dCB0aGUgdGltZWtlZXBpbmcgZHVyaW5nIHRoZQotIyB3YXIgeWVhcnMgaXQncyBwcm9iYWJseSBiZXN0IGp1c3QgZG8gZG8gdGhlIGZvbGxvd2luZyBmb3Igbm93OgotTGluawlFdXJvcGUvT3NsbwlBcmN0aWMvTG9uZ3llYXJieWVuCi0KLSMgUG9sYW5kCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlQb2xhbmQJMTkxOAkxOTE5CS0JU2VwCTE2CTI6MDBzCTAJLQotUnVsZQlQb2xhbmQJMTkxOQlvbmx5CS0JQXByCTE1CTI6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk0NAlvbmx5CS0JQXByCSAzCTI6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5NDQgTm92IDMwOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9sYW5kCTE5NDQJb25seQktCU9jdAkgNAkyOjAwCTAJLQotIyBGb3IgMTk0NC0xOTQ4IFdoaXRtYW4gZ2l2ZXMgdGhlIHByZXZpb3VzIGRheTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvbGFuZAkxOTQ1CW9ubHkJLQlBcHIJMjkJMDowMAkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NDUJb25seQktCU5vdgkgMQkwOjAwCTAJLQotIyBGb3IgMTk0NiBvbiB0aGUgc291cmNlIGlzIEthemltaWVyeiBCb3Jrb3dza2ksCi0jIFRvcnVuIENlbnRlciBmb3IgQXN0cm9ub215LCBEZXB0LiBvZiBSYWRpbyBBc3Ryb25vbXksIE5pY29sYXVzIENvcGVybmljdXMgVS4sCi0jIDxodHRwOi8vd3d3LmFzdHJvLnVuaS50b3J1bi5wbC9+a2IvQXJ0eWt1bHkvVS1QQS9DemFzMi5odG0jdHRoX3RBYjE+Ci0jIFRoYW5rcyB0byBQcnplbXlzbGF3IEF1Z3VzdHluaWFrICgyMDA1LTA1LTI4KSBmb3IgdGhpcyByZWZlcmVuY2UuCi0jIEhlIGFsc28gZ2l2ZXMgdGhlc2UgZnVydGhlciByZWZlcmVuY2VzOgotIyBNb24gUG9sIG5yIDEzLCBwb3ogMTYyICgxOTk1KSA8aHR0cDovL3d3dy5hYmMuY29tLnBsL3Nlcndpcy9tcC8xOTk1LzAxNjIuaHRtPgotIyBEcnVrIG5yIDIxODAgKDIwMDMpIDxodHRwOi8vd3d3LnNlbmF0Lmdvdi5wbC9rNS9kb2svc2VqbS8wNTMvMjE4MC5wZGY+Ci1SdWxlCVBvbGFuZAkxOTQ2CW9ubHkJLQlBcHIJMTQJMDowMHMJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTQ2CW9ubHkJLQlPY3QJIDcJMjowMHMJMAktCi1SdWxlCVBvbGFuZAkxOTQ3CW9ubHkJLQlNYXkJIDQJMjowMHMJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTQ3CTE5NDkJLQlPY3QJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlQb2xhbmQJMTk0OAlvbmx5CS0JQXByCTE4CTI6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk0OQlvbmx5CS0JQXByCTEwCTI6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk1Nwlvbmx5CS0JSnVuCSAyCTE6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk1NwkxOTU4CS0JU2VwCWxhc3RTdW4JMTowMHMJMAktCi1SdWxlCVBvbGFuZAkxOTU4CW9ubHkJLQlNYXIJMzAJMTowMHMJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTU5CW9ubHkJLQlNYXkJMzEJMTowMHMJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTU5CTE5NjEJLQlPY3QJU3VuPj0xCTE6MDBzCTAJLQotUnVsZQlQb2xhbmQJMTk2MAlvbmx5CS0JQXByCSAzCTE6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk2MQkxOTY0CS0JTWF5CWxhc3RTdW4JMTowMHMJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTYyCTE5NjQJLQlTZXAJbGFzdFN1bgkxOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1dhcnNhdwkxOjI0OjAwIC0JTE1UCTE4ODAKLQkJCTE6MjQ6MDAJLQlXTVQJMTkxNSBBdWcgIDUgICAjIFdhcnNhdyBNZWFuIFRpbWUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOCBTZXAgMTYgMzowMAotCQkJMjowMAlQb2xhbmQJRUUlc1QJMTkyMiBKdW4KLQkJCTE6MDAJUG9sYW5kCUNFJXNUCTE5NDAgSnVuIDIzIDI6MDAKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBPY3QKLQkJCTE6MDAJUG9sYW5kCUNFJXNUCTE5NzcKLQkJCTE6MDAJVy1FdXIJQ0Ulc1QJMTk4OAotCQkJMTowMAlFVQlDRSVzVAotCi0jIFBvcnR1Z2FsCi0jCi0jIEZyb20gUnVpIFBlZHJvIFNhbGd1ZWlybyAoMTk5Mi0xMS0xMik6Ci0jIFBvcnR1Z2FsIGhhcyByZWNlbnRseSAoU2VwdGVtYmVyLCAyNykgY2hhbmdlZCB0aW1lem9uZQotIyAoZnJvbSBXRVQgdG8gTUVUIG9yIENFVCkgdG8gaGFybW9uaXplIHdpdGggRUVDLgotIwotIyBNYXJ0aW4gQnJ1Y2ttYW5uICgxOTk2LTAyLTI5KSByZXBvcnRzIHZpYSBQZXRlciBJbGlldmUKLSMgdGhhdCBQb3J0dWdhbCBpcyByZXZlcnRpbmcgdG8gMDowMCBieSBub3QgbW92aW5nIGl0cyBjbG9ja3MgdGhpcyBzcHJpbmcuCi0jIFRoZSBuZXcgUHJpbWUgTWluaXN0ZXIgd2FzIGZlZCB1cCB3aXRoIGdldHRpbmcgdXAgaW4gdGhlIGRhcmsgaW4gdGhlIHdpbnRlci4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0xMS0xMik6Ci0jIElBVEEgU1NJTSAoMTk5MS0wOSkgcmVwb3J0cyBzZXZlcmFsIDE5OTEtMDkgYW5kIDE5OTItMDkgdHJhbnNpdGlvbnMKLSMgYXQgMDI6MDB1LCBub3QgMDE6MDB1LiAgQXNzdW1lIHRoYXQgdGhlc2UgYXJlIHR5cG9zLgotIyBJQVRBIFNTSU0gKDE5OTEvMTk5MikgcmVwb3J0cyB0aGF0IHRoZSBBem9yZXMgd2VyZSBhdCAtMTowMC4KLSMgSUFUQSBTU0lNICgxOTkzLTAyKSBzYXlzICswOjAwOyBsYXRlciBpc3N1ZXMgKHRocm91Z2ggMTk5Ni0wOSkgc2F5IC0xOjAwLgotIyBHdWVzcyB0aGF0IHRoZSBBem9yZXMgY2hhbmdlZCB0byBFVSBydWxlcyBpbiAxOTkyIChzaW5jZSB0aGF0J3Mgd2hlbiBQb3J0dWdhbAotIyBoYXJtb25pemVkIHdpdGggdGhlIEVVKSwgYW5kIHRoYXQgdGhleSBzdGF5ZWQgKzA6MDAgdGhhdCB3aW50ZXIuCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBEU0ggd3JpdGVzIHRoYXQgZGVzcGl0ZSBEZWNyZWUgMSw0NjkgKDE5MTUpLCB0aGUgY2hhbmdlIHRvIHRoZSBjbG9ja3Mgd2FzIG5vdAotIyBkb25lIGV2ZXJ5IHllYXIsIGRlcGVuZGluZyBvbiB3aGF0IFNwYWluIGRpZCwgYmVjYXVzZSBvZiByYWlscm9hZCBzY2hlZHVsZXMuCi0jIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb3J0CTE5MTYJb25seQktCUp1bgkxNwkyMzowMAkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTE2IE9jdCAzMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvcnQJMTkxNglvbmx5CS0JTm92CSAxCSAxOjAwCTAJLQotUnVsZQlQb3J0CTE5MTcJb25seQktCUZlYgkyOAkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkxNwkxOTIxCS0JT2N0CTE0CTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTE4CW9ubHkJLQlNYXIJIDEJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MTkJb25seQktCUZlYgkyOAkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkyMAlvbmx5CS0JRmViCTI5CTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTIxCW9ubHkJLQlGZWIJMjgJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MjQJb25seQktCUFwcgkxNgkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkyNAlvbmx5CS0JT2N0CTE0CTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTI2CW9ubHkJLQlBcHIJMTcJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MjYJMTkyOQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlQb3J0CTE5MjcJb25seQktCUFwcgkgOQkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkyOAlvbmx5CS0JQXByCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTI5CW9ubHkJLQlBcHIJMjAJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MzEJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTkzMSBPY3QgODsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvcnQJMTkzMQkxOTMyCS0JT2N0CVNhdD49MQkyMzowMHMJMAktCi1SdWxlCVBvcnQJMTkzMglvbmx5CS0JQXByCSAyCTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTM0CW9ubHkJLQlBcHIJIDcJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MzQgT2N0IDU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb3J0CTE5MzQJMTkzOAktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTM1IEFwciAzMDsgZ28gd2l0aCBXaGl0bWFuLgotUnVsZQlQb3J0CTE5MzUJb25seQktCU1hcgkzMAkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkzNglvbmx5CS0JQXByCTE4CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTM3IEFwciAyOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9ydAkxOTM3CW9ubHkJLQlBcHIJIDMJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MzgJb25seQktCU1hcgkyNgkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkzOQlvbmx5CS0JQXByCTE1CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTM5IE9jdCA3OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9ydAkxOTM5CW9ubHkJLQlOb3YJMTgJMjM6MDBzCTAJLQotUnVsZQlQb3J0CTE5NDAJb25seQktCUZlYgkyNAkyMzowMHMJMTowMAlTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5NDAgT2N0IDc7IGdvIHdpdGggV2hpdG1hbi4KLVJ1bGUJUG9ydAkxOTQwCTE5NDEJLQlPY3QJIDUJMjM6MDBzCTAJLQotUnVsZQlQb3J0CTE5NDEJb25seQktCUFwcgkgNQkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk0MgkxOTQ1CS0JTWFyCVNhdD49OAkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk0Mglvbmx5CS0JQXByCTI1CTIyOjAwcwkyOjAwCU0gIyBNaWRzdW1tZXIKLVJ1bGUJUG9ydAkxOTQyCW9ubHkJLQlBdWcJMTUJMjI6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NDIJMTk0NQktCU9jdAlTYXQ+PTI0CTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTQzCW9ubHkJLQlBcHIJMTcJMjI6MDBzCTI6MDAJTQotUnVsZQlQb3J0CTE5NDMJMTk0NQktCUF1ZwlTYXQ+PTI1CTIyOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTQ0CTE5NDUJLQlBcHIJU2F0Pj0yMQkyMjowMHMJMjowMAlNCi1SdWxlCVBvcnQJMTk0Nglvbmx5CS0JQXByCVNhdD49MQkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk0Nglvbmx5CS0JT2N0CVNhdD49MQkyMzowMHMJMAktCi1SdWxlCVBvcnQJMTk0NwkxOTQ5CS0JQXByCVN1bj49MQkgMjowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk0NwkxOTQ5CS0JT2N0CVN1bj49MQkgMjowMHMJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgRFNUIHdhcyBvYnNlcnZlZCBpbiAxOTUwOyBnbyB3aXRoIFdoaXRtYW4uCi0jIFdoaXRtYW4gZ2l2ZXMgT2N0IGxhc3RTdW4gZm9yIDE5NTIgb247IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb3J0CTE5NTEJMTk2NQktCUFwcglTdW4+PTEJIDI6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NTEJMTk2NQktCU9jdAlTdW4+PTEJIDI6MDBzCTAJLQotUnVsZQlQb3J0CTE5NzcJb25seQktCU1hcgkyNwkgMDowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk3Nwlvbmx5CS0JU2VwCTI1CSAwOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTc4CTE5NzkJLQlBcHIJU3VuPj0xCSAwOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTc4CW9ubHkJLQlPY3QJIDEJIDA6MDBzCTAJLQotUnVsZQlQb3J0CTE5NzkJMTk4MgktCVNlcAlsYXN0U3VuCSAxOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTgwCW9ubHkJLQlNYXIJbGFzdFN1bgkgMDowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk4MQkxOTgyCS0JTWFyCWxhc3RTdW4JIDE6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5ODMJb25seQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGUgdHJhbnNpdGlvbiBmcm9tIExNVCB0byBXRVQgb2NjdXJyZWQgMTkxMS0wNS0yNDsKLSMgV2lsbGV0dCBzYXlzIDE5MTItMDEtMDEuICBHbyB3aXRoIFdpbGxldHQuCi1ab25lCUV1cm9wZS9MaXNib24JLTA6MzY6MzIgLQlMTVQJMTg4NAotCQkJLTA6MzY6MzIgLQlMTVQJMTkxMiBKYW4gIDEgICMgTGlzYm9uIE1lYW4gVGltZQotCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTY2IEFwciAgMyAyOjAwCi0JCQkgMTowMAktCUNFVAkxOTc2IFNlcCAyNiAxOjAwCi0JCQkgMDowMAlQb3J0CVdFJXNUCTE5ODMgU2VwIDI1IDE6MDBzCi0JCQkgMDowMAlXLUV1cglXRSVzVAkxOTkyIFNlcCAyNyAxOjAwcwotCQkJIDE6MDAJRVUJQ0Ulc1QJMTk5NiBNYXIgMzEgMTowMHUKLQkJCSAwOjAwCUVVCVdFJXNUCi1ab25lIEF0bGFudGljL0F6b3JlcwktMTo0Mjo0MCAtCUxNVAkxODg0CQkjIFBvbnRhIERlbGdhZGEKLQkJCS0xOjU0OjMyIC0JSE1UCTE5MTEgTWF5IDI0ICAjIEhvcnRhIE1lYW4gVGltZQotCQkJLTI6MDAJUG9ydAlBWk8lc1QJMTk2NiBBcHIgIDMgMjowMCAjIEF6b3JlcyBUaW1lCi0JCQktMTowMAlQb3J0CUFaTyVzVAkxOTgzIFNlcCAyNSAxOjAwcwotCQkJLTE6MDAJVy1FdXIJQVpPJXNUCTE5OTIgU2VwIDI3IDE6MDBzCi0JCQkgMDowMAlFVQlXRSVzVAkxOTkzIE1hciAyOCAxOjAwdQotCQkJLTE6MDAJRVUJQVpPJXNUCi1ab25lIEF0bGFudGljL01hZGVpcmEJLTE6MDc6MzYgLQlMTVQJMTg4NAkJIyBGdW5jaGFsCi0JCQktMTowNzozNiAtCUZNVAkxOTExIE1heSAyNCAgIyBGdW5jaGFsIE1lYW4gVGltZQotCQkJLTE6MDAJUG9ydAlNQUQlc1QJMTk2NiBBcHIgIDMgMjowMCAjIE1hZGVpcmEgVGltZQotCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTgzIFNlcCAyNSAxOjAwcwotCQkJIDA6MDAJRVUJV0Ulc1QKLQotIyBSb21hbmlhCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTAtMDcpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5pbmVvY2xvY2sucm8vUE9MLzE3Nzhwb2wuaHRtbCI+Ci0jIE5pbmUgTydjbG9jazwvYT4gKDE5OTgtMTAtMjMpIHJlcG9ydHMgdGhhdCB0aGUgc3dpdGNoIG9jY3VycmVkIGF0Ci0jIDA0OjAwIGxvY2FsIHRpbWUgaW4gZmFsbCAxOTk4LiAgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sCi0jIGFzc3VtZSB0aGF0IFJvbWFuaWEgYW5kIE1vbGRvdmEgc3dpdGNoZWQgdG8gRVUgcnVsZXMgaW4gMTk5NywKLSMgdGhlIHNhbWUgeWVhciBhcyBCdWxnYXJpYS4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVJvbWFuaWEJMTkzMglvbmx5CS0JTWF5CTIxCSAwOjAwcwkxOjAwCVMKLVJ1bGUJUm9tYW5pYQkxOTMyCTE5MzkJLQlPY3QJU3VuPj0xCSAwOjAwcwkwCS0KLVJ1bGUJUm9tYW5pYQkxOTMzCTE5MzkJLQlBcHIJU3VuPj0yCSAwOjAwcwkxOjAwCVMKLVJ1bGUJUm9tYW5pYQkxOTc5CW9ubHkJLQlNYXkJMjcJIDA6MDAJMTowMAlTCi1SdWxlCVJvbWFuaWEJMTk3OQlvbmx5CS0JU2VwCWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlCVJvbWFuaWEJMTk4MAlvbmx5CS0JQXByCSA1CTIzOjAwCTE6MDAJUwotUnVsZQlSb21hbmlhCTE5ODAJb25seQktCVNlcAlsYXN0U3VuCSAxOjAwCTAJLQotUnVsZQlSb21hbmlhCTE5OTEJMTk5MwktCU1hcglsYXN0U3VuCSAwOjAwcwkxOjAwCVMKLVJ1bGUJUm9tYW5pYQkxOTkxCTE5OTMJLQlTZXAJbGFzdFN1bgkgMDowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEV1cm9wZS9CdWNoYXJlc3QJMTo0NDoyNCAtCUxNVAkxODkxIE9jdAotCQkJMTo0NDoyNAktCUJNVAkxOTMxIEp1bCAyNAkjIEJ1Y2hhcmVzdCBNVAotCQkJMjowMAlSb21hbmlhCUVFJXNUCTE5ODEgTWFyIDI5IDI6MDBzCi0JCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTEKLQkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTk0Ci0JCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTcKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBSdXNzaWEKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgRXhjZXB0IGZvciBNb3Njb3cgYWZ0ZXIgMTkxOS0wNy0wMSwgSSBpbnZlbnRlZCB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMuCi0jIE1vc2NvdyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBhZnRlciAxOTE5LTA3LTAxLCBhbmQgTW9zY293IHJ1bGVzIGFmdGVyIDE5OTEsCi0jIGFyZSBmcm9tIEFuZHJleSBBLiBDaGVybm92LiAgVGhlIHJlc3QgaXMgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIsCi0jIGV4Y2VwdCB3ZSBmb2xsb3cgQ2hlcm5vdidzIHJlcG9ydCB0aGF0IDE5OTIgRFNUIHRyYW5zaXRpb25zIHdlcmUgU2F0Ci0jIDIzOjAwLCBub3QgU3VuIDAyOjAwcy4KLSMKLSMgRnJvbSBTdGFuaXNsYXcgQS4gS3V6aWtvd3NraSAoMTk5NC0wNi0yOSk6Ci0jIEJ1dCBub3cgaXQgaXMgc29tZSBtb250aHMgc2luY2UgTm92b3NpYmlyc2sgaXMgMyBob3VycyBhaGVhZCBvZiBNb3Njb3chCi0jIEkgZG8gbm90IGtub3cgd2h5IHRoZXkgaGF2ZSBkZWNpZGVkIHRvIG1ha2UgdGhpcyBjaGFuZ2U7Ci0jIGFzIGZhciBhcyBJIHJlbWVtYmVyIGl0IHdhcyBkb25lIGV4YWN0bHkgZHVyaW5nIHdpbnRlci0+c3VtbWVyIHN3aXRjaGluZwotIyBzbyB3ZSAoTm92b3NpYmlyc2spIHNpbXBseSBkaWQgbm90IHN3aXRjaC4KLSMKLSMgRnJvbSBBbmRyZXkgQS4gQ2hlcm5vdiAoMTk5Ni0xMC0wNCk6Ci0jIGBNU0snIGFuZCBgTVNEJyB3ZXJlIGJvcm4gYW5kIHVzZWQgaW5pdGlhbGx5IG9uIE1vc2NvdyBjb21wdXRlcnMgd2l0aAotIyBVTklYLWxpa2UgT1NlcyBieSBzZXZlcmFsIGRldmVsb3BlciBncm91cHMgKGUuZy4gRGVtb3MgZ3JvdXAsIEtpYWUgZ3JvdXApLi4uLgotIyBUaGUgbmV4dCBzdGVwIHdhcyB0aGUgVVVDUCBuZXR3b3JrLCB0aGUgUmVsY29tIHByZWRlY2Vzc29yCi0jICh1c2VkIG1haW5seSBmb3IgbWFpbCksIGFuZCBNU0svTVNEIHdhcyBhY3RpdmVseSB1c2VkIHRoZXJlLgotIwotIyBGcm9tIENocmlzIENhcnJpZXIgKDE5OTYtMTAtMzApOgotIyBBY2NvcmRpbmcgdG8gYSBmcmllbmQgb2YgbWluZSB3aG8gcm9kZSB0aGUgVHJhbnMtU2liZXJpYW4gUmFpbHJvYWQgZnJvbQotIyBNb3Njb3cgdG8gSXJrdXRzayBpbiAxOTk1LCBwdWJsaWMgYWlyIGFuZCByYWlsIHRyYW5zcG9ydCBpbiBSdXNzaWEgLi4uCi0jIHN0aWxsIGZvbGxvd3MgTW9zY293IHRpbWUsIG5vIG1hdHRlciB3aGVyZSBpbiBSdXNzaWEgaXQgaXMgbG9jYXRlZC4KLSMKLSMgRm9yIEdyb3pueSwgQ2hlY2hueWEsIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBzdG9yeSBmcm9tCi0jIEpvaG4gRGFuaXN6ZXdza2ksICJTY2F2ZW5nZXJzIGluIHRoZSBSdWJibGUiLCBMb3MgQW5nZWxlcyBUaW1lcyAoMjAwMS0wMi0wNyk6Ci0jIE5ld3MtLW9mdGVuIGZhbHNlLS1pcyBzcHJlYWQgYnkgd29yZCBvZiBtb3V0aC4gIEEgcnVtb3IgdGhhdCBpdCB3YXMKLSMgdGltZSB0byBtb3ZlIHRoZSBjbG9ja3MgYmFjayBwdXQgdGhpcyB3aG9sZSBjaXR5IG91dCBvZiBzeW5jIHdpdGgKLSMgdGhlIHJlc3Qgb2YgUnVzc2lhIGZvciB0d28gd2Vla3MtLWV2ZW4gc29sZGllcnMgc3RhdGlvbmVkIGhlcmUgYmVnYW4KLSMgZW5mb3JjaW5nIGN1cmZldyBhdCB0aGUgd3JvbmcgdGltZS4KLSMKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wNi0wNSk6Ci0jIFRoZXJlJ3MgY29uc2lkZXJhYmxlIGV2aWRlbmNlIHRoYXQgU2FraGFsaW4gSXNsYW5kIHVzZWQgdG8gYmUgaW4KLSMgVVRDKzExLCBhbmQgaGFzIGNoYW5nZWQgdG8gVVRDKzEwLCBpbiB0aGlzIGRlY2FkZS4gIEkgc3RhcnQgd2l0aCB0aGUKLSMgU1NJTSwgd2hpY2ggbGlzdGVkIFl1emhuby1TYWtoYWxpbnNrIGluIHpvbmUgUlUxMCBhbG9uZyB3aXRoIE1hZ2FkYW4KLSMgdW50aWwgRmVicnVhcnkgMTk5NywgYW5kIHRoZW4gaW4gUlU5IHdpdGggS2hhYmFyb3ZzayBhbmQgVmxhZGl2b3N0b2sKLSMgc2luY2UgU2VwdGVtYmVyIDE5OTcuLi4uICBBbHRob3VnaCB0aGUgS3VyaWwgSXNsYW5kcyBhcmUKLSMgYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIFNha2hhbGluIG9ibGFzdCcsIHRoZXkgYXBwZWFyIHRvIGhhdmUKLSMgcmVtYWluZWQgb24gVVRDKzExIGFsb25nIHdpdGggTWFnYWRhbi4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMKLSMgS2FsaW5pbmdyYWRza2F5YSBvYmxhc3QnLgotWm9uZSBFdXJvcGUvS2FsaW5pbmdyYWQJIDE6MjI6MDAgLQlMTVQJMTg5MyBBcHIKLQkJCSAxOjAwCUMtRXVyCUNFJXNUCTE5NDUKLQkJCSAyOjAwCVBvbGFuZAlDRSVzVAkxOTQ2Ci0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCUVFJXNUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQWR5Z2V5YSwgQXJraGFuZ2VsJ3NrYXlhIG9ibGFzdCcsCi0jIEJlbGdvcm9kc2theWEgb2JsYXN0JywgQnJ5YW5za2F5YSBvYmxhc3QnLCBWbGFkaW1pcnNrYXlhIG9ibGFzdCcsCi0jIFZvbG9nb2Rza2F5YSBvYmxhc3QnLCBWb3JvbmV6aHNrYXlhIG9ibGFzdCcsCi0jIFJlc3B1Ymxpa2EgRGFnZXN0YW4sIEl2YW5vdnNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgSW5ndXNoZXRpeWEsCi0jIEthYmFyYmluby1CYWxrYXJza2F5YSBSZXNwdWJsaWthLCBSZXNwdWJsaWthIEthbG15a2l5YSwKLSMgS2FseXpoc2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBLYXJhY2hhZXZvLUNoZXJrZXNzaXlhLAotIyBSZXNwdWJsaWthIEthcmVsaXlhLCBSZXNwdWJsaWthIEtvbWksCi0jIEtvc3Ryb21za2F5YSBvYmxhc3QnLCBLcmFzbm9kYXJza2lqIGtyYWosIEt1cnNrYXlhIG9ibGFzdCcsCi0jIExlbmluZ3JhZHNrYXlhIG9ibGFzdCcsIExpcGV0c2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBNYXJpaiBFbCwKLSMgUmVzcHVibGlrYSBNb3Jkb3ZpeWEsIE1vc2t2YSwgTW9za292c2theWEgb2JsYXN0JywKLSMgTXVybWFuc2theWEgb2JsYXN0JywgTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWcsCi0jIE5pemhlZ29yb2Rza2F5YSBvYmxhc3QnLCBOb3Znb3JvZHNrYXlhIG9ibGFzdCcsIE9ybG92c2theWEgb2JsYXN0JywKLSMgUGVuemVuc2theWEgb2JsYXN0JywgUHNrb3Zza2F5YSBvYmxhc3QnLCBSb3N0b3Zza2F5YSBvYmxhc3QnLAotIyBSeWF6YW5za2F5YSBvYmxhc3QnLCBTYW5rdC1QZXRlcmJ1cmcsCi0jIFJlc3B1Ymxpa2EgU2V2ZXJuYXlhIE9zZXRpeWEsIFNtb2xlbnNrYXlhIG9ibGFzdCcsCi0jIFN0YXZyb3BvbCdza2lqIGtyYWosIFRhbWJvdnNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgVGF0YXJzdGFuLAotIyBUdmVyc2theWEgb2JsYXN0JywgVHlsJ3NrYXlhIG9ibGFzdCcsIFVsJ3lhbm92c2theWEgb2JsYXN0JywKLSMgQ2hlY2hlbnNrYXlhIFJlc3B1Ymxpa2EsIENodXZhc2hza2F5YSBvYmxhc3QnLAotIyBZYXJvc2xhdnNrYXlhIG9ibGFzdCcKLVpvbmUgRXVyb3BlL01vc2NvdwkgMjozMDoyMCAtCUxNVAkxODgwCi0JCQkgMjozMAktCU1NVAkxOTE2IEp1bCAgMyAjIE1vc2NvdyBNZWFuIFRpbWUKLQkJCSAyOjMwOjQ4IFJ1c3NpYQklcwkxOTE5IEp1bCAgMSAyOjAwCi0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTIyIE9jdAotCQkJIDI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKLQkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgMjowMAlSdXNzaWEJRUUlc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECi0jCi0jIEFzdHJha2hhbnNrYXlhIG9ibGFzdCcsIEtpcm92c2theWEgb2JsYXN0JywgU2FyYXRvdnNrYXlhIG9ibGFzdCcsCi0jIFZvbGdvZ3JhZHNrYXlhIG9ibGFzdCcuICBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IEtpcm92IGlzIHN0aWxsIGF0ICswNDAwCi0jIGJ1dCBXaWtpcGVkaWEgKDIwMDYtMDUtMDkpIHNheXMgKzAzMDAuICBQZXJoYXBzIGl0IHN3aXRjaGVkIGFmdGVyIHRoZQotIyBvdGhlcnM/ICBCdXQgd2UgaGF2ZSBubyBkYXRhLgotWm9uZSBFdXJvcGUvVm9sZ29ncmFkCSAyOjU3OjQwIC0JTE1UCTE5MjAgSmFuICAzCi0JCQkgMzowMAktCVRTQVQJMTkyNSBBcHIgIDYgIyBUc2FyaXRzeW4gVGltZQotCQkJIDM6MDAJLQlTVEFUCTE5MzAgSnVuIDIxICMgU3RhbGluZ3JhZCBUaW1lCi0JCQkgNDowMAktCVNUQVQJMTk2MSBOb3YgMTEKLQkJCSA0OjAwCVJ1c3NpYQlWT0wlc1QJMTk4OSBNYXIgMjYgMjowMHMgIyBWb2xnb2dyYWQgVAotCQkJIDM6MDAJUnVzc2lhCVZPTCVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDQ6MDAJLQlWT0xUCTE5OTIgTWFyIDI5IDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJVk9MJXNUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFNhbWFyc2theWEgb2JsYXN0JywgVWRteXJ0c2theWEgcmVzcHVibGlrYQotWm9uZSBFdXJvcGUvU2FtYXJhCSAzOjIwOjM2IC0JTE1UCTE5MTkgSnVsICAxIDI6MDAKLQkJCSAzOjAwCS0JU0FNVAkxOTMwIEp1biAyMQotCQkJIDQ6MDAJLQlTQU1UCTE5MzUgSmFuIDI3Ci0JCQkgNDowMAlSdXNzaWEJS1VZJXNUCTE5ODkgTWFyIDI2IDI6MDBzICMgS3V5YnlzaGV2Ci0JCQkgMzowMAlSdXNzaWEJS1VZJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgMjowMAlSdXNzaWEJS1VZJXNUCTE5OTEgU2VwIDI5IDI6MDBzCi0JCQkgMzowMAktCUtVWVQJMTk5MSBPY3QgMjAgMzowMAotCQkJIDQ6MDAJUnVzc2lhCVNBTSVzVAkjIFNhbWFyYSBUaW1lCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQmFzaGtvcnRvc3RhbiwgS29taS1QZXJteWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLAotIyBLdXJnYW5za2F5YSBvYmxhc3QnLCBPcmVuYnVyZ3NrYXlhIG9ibGFzdCcsIFBlcm1za2F5YSBvYmxhc3QnLAotIyBTdmVyZGxvdnNrYXlhIG9ibGFzdCcsIFR5dW1lbnNrYXlhIG9ibGFzdCcsCi0jIEtoYW50eS1NYW5za2lqc2tpaiBhdnRvbm9tbnlqIG9rcnVnLCBDaGVseWFiaW5za2F5YSBvYmxhc3QnLAotIyBZYW1hbG8tTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvWWVrYXRlcmluYnVyZwkgNDowMjoyNCAtCUxNVAkxOTE5IEp1bCAxNSA0OjAwCi0JCQkgNDowMAktCVNWRVQJMTkzMCBKdW4gMjEgIyBTdmVyZGxvdnNrIFRpbWUKLQkJCSA1OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA0OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA1OjAwCVJ1c3NpYQlZRUslc1QJIyBZZWthdGVyaW5idXJnIFRpbWUKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBBbHRhaiwgQWx0YWpza2lqIGtyYWosIE9tc2theWEgb2JsYXN0Jy4KLVpvbmUgQXNpYS9PbXNrCQkgNDo1MzozNiAtCUxNVAkxOTE5IE5vdiAxNAotCQkJIDU6MDAJLQlPTVNUCTE5MzAgSnVuIDIxICMgT21zayBUSW1lCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNTowMAlSdXNzaWEJT01TJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDgtMTkpOiBJJ20gZ3Vlc3NpbmcgYWJvdXQgVG9tc2sgaGVyZTsgaXQncwotIyBub3QgY2xlYXIgd2hlbiBpdCBzd2l0Y2hlZCBmcm9tICs3IHRvICs2LgotIyBOb3Zvc2liaXJza2F5YSBvYmxhc3QnLCBUb21za2F5YSBvYmxhc3QnLgotWm9uZSBBc2lhL05vdm9zaWJpcnNrCSA1OjMxOjQwIC0JTE1UCTE5MTkgRGVjIDE0IDY6MDAKLQkJCSA2OjAwCS0JTk9WVAkxOTMwIEp1biAyMSAjIE5vdm9zaWJpcnNrIFRpbWUKLQkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MyBNYXkgMjMgIyBzYXkgU2hhbmtzICYgUC4KLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgS2VtZXJvdnNrYXlhIG9ibGFzdCcsIEtyYXNub3lhcnNraWoga3JhaiwKLSMgVGFqbXlyc2tpaiAoRG9sZ2Fuby1OZW5ldHNraWopIGF2dG9ub21ueWogb2tydWcsCi0jIFJlc3B1Ymxpa2EgVHV2YSwgUmVzcHVibGlrYSBLaGFrYXNpeWEsIEV2ZW5raWpza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvS3Jhc25veWFyc2sJIDY6MTE6MjAgLQlMTVQJMTkyMCBKYW4gIDYKLQkJCSA2OjAwCS0JS1JBVAkxOTMwIEp1biAyMSAjIEtyYXNub3lhcnNrIFRpbWUKLQkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlLUkElc1QKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBCdXJ5YXRpeWEsIElya3V0c2theWEgb2JsYXN0JywKLSMgVXN0Jy1PcmR5bnNraWogQnVyeWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLgotWm9uZSBBc2lhL0lya3V0c2sJIDY6NTc6MjAgLQlMTVQJMTg4MAotCQkJIDY6NTc6MjAgLQlJTVQJMTkyMCBKYW4gMjUgIyBJcmt1dHNrIE1lYW4gVGltZQotCQkJIDc6MDAJLQlJUktUCTE5MzAgSnVuIDIxICMgSXJrdXRzayBUaW1lCi0JCQkgODowMAlSdXNzaWEJSVJLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNzowMAlSdXNzaWEJSVJLJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgODowMAlSdXNzaWEJSVJLJXNUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIEFnaW5za2lqIEJ1cnlhdHNraWogYXZ0b25vbW55aiBva3J1ZywgQW11cnNrYXlhIG9ibGFzdCcsCi0jIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLCBDaGl0aW5za2F5YSBvYmxhc3QnLgotIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogQWxkYW5za2lqLCBBbWdpbnNraWosIEFuYWJhcnNraWosCi0jIEJ1bHVuc2tpaiwgVmVya2huZWtvbHltc2tpaiwgVmVya2huZXZpbHl1anNraWosIFZpbHl1anNraWosIEdvcm55aiwKLSMgWmhpZ2Fuc2tpaiwgS29ieWFqc2tpaiwgTGVuc2tpaiwgTWVnaW5vLUthbmdhbGFzc2tpaiwgTWlybmluc2tpaiwKLSMgTmFtc2tpaiwgTnl1cmJpbnNraWosIE9sZW5la3NraWosIE9sZWttaW5za2lqLCBTcmVkbmVrb2x5bXNraWosCi0jIFN1bnRhcnNraWosIFRhdHRpbnNraWosIFVzdCctQWxkYW5za2lqLCBLaGFuZ2FsYXNza2lqLAotIyBDaHVyYXBjaGluc2tpaiwgRXZlbm8tQnl0YW50YWpza2lqLgotWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NDAgLQlMTVQJMTkxOSBEZWMgMTUKLQkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBFdnJlanNrYXlhIGF2dG9ub21uYXlhIG9ibGFzdCcsIEtoYWJhcm92c2tpaiBrcmFqLCBQcmltb3Jza2lqIGtyYWosCi0jIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgotIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogVmVya2hveWFuc2tpaiwgVG9tcG9uc2tpaiwgVXN0Jy1NYWpza2lqLAotIyBVc3QnLVlhbnNraWouCi1ab25lIEFzaWEvVmxhZGl2b3N0b2sJIDg6NDc6NDQgLQlMTVQJMTkyMiBOb3YgMTUKLQkJCSA5OjAwCS0JVkxBVAkxOTMwIEp1biAyMSAjIFZsYWRpdm9zdG9rIFRpbWUKLQkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA5OjAwCVJ1c3NpYQlWTEElc1NUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJVkxBJXNUCi0jCi0jIFNha2hhbGluc2theWEgb2JsYXN0Jy4KLSMgVGhlIFpvbmUgbmFtZSBzaG91bGQgYmUgWXV6aG5vLVNha2hhbGluc2ssIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCi1ab25lIEFzaWEvU2FraGFsaW4JIDk6MzA6NDggLQlMTVQJMTkwNSBBdWcgMjMKLQkJCSA5OjAwCS0JQ0pUCTE5MzgKLQkJCSA5OjAwCS0JSlNUCTE5NDUgQXVnIDI1Ci0JCQkxMTowMAlSdXNzaWEJU0FLJXNUCTE5OTEgTWFyIDMxIDI6MDBzICMgU2FraGFsaW4gVC4KLQkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5NyBNYXIgbGFzdFN1biAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBNYWdhZGFuc2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgotIyBQcm9iYWJseSBhbHNvOiBLdXJpbCBJc2xhbmRzLgotIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogQWJ5anNraWosIEFsbGFpa2hvdnNraWosIE1vbXNraWosCi0jIE5pemhuZWtvbHltc2tpaiwgT2pteWFrb25za2lqLgotWm9uZSBBc2lhL01hZ2FkYW4JMTA6MDM6MTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBLYW1jaGF0c2theWEgb2JsYXN0JywgS29yeWFrc2tpaiBhdnRvbm9tbnlqIG9rcnVnLgotIwotIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNraSwgYnV0IHRoYXQncyB0b28gbG9uZy4KLVpvbmUgQXNpYS9LYW1jaGF0a2EJMTA6MzQ6MzYgLQlMTVQJMTkyMiBOb3YgMTAKLQkJCTExOjAwCS0JUEVUVAkxOTMwIEp1biAyMSAjIFAtSyBUaW1lCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJUEVUJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCi0jCi0jIENodWtvdHNraWogYXZ0b25vbW55aiBva3J1ZwotWm9uZSBBc2lhL0FuYWR5cgkxMTo0OTo1NiAtCUxNVAkxOTI0IE1heSAgMgotCQkJMTI6MDAJLQlBTkFUCTE5MzAgSnVuIDIxICMgQW5hZHlyIFRpbWUKLQkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgMDowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QKLQotIyBTZXJiaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0JlbGdyYWRlCTE6MjI6MDAJLQlMTVQJMTg4NAotCQkJMTowMAktCUNFVAkxOTQxIEFwciAxOCAyMzowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkxOjAwCS0JQ0VUCTE5NDUgTWF5IDggMjowMHMKLQkJCTE6MDAJMTowMAlDRVNUCTE5NDUgU2VwIDE2ICAyOjAwcwotIyBNZXRvZCBLb3plbGogcmVwb3J0cyB0aGF0IHRoZSBsZWdhbCBkYXRlIG9mCi0jIHRyYW5zaXRpb24gdG8gRVUgcnVsZXMgd2FzIDE5ODItMTEtMjcsIGZvciBhbGwgb2YgWXVnb3NsYXZpYSBhdCB0aGUgdGltZS4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGdpdmUgYXMgbXVjaCBkZXRhaWwsIHNvIGdvIHdpdGggS296ZWxqLgotCQkJMTowMAktCUNFVAkxOTgyIE5vdiAyNwotCQkJMTowMAlFVQlDRSVzVAotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL0xqdWJsamFuYQkjIFNsb3ZlbmlhCi1MaW5rIEV1cm9wZS9CZWxncmFkZSBFdXJvcGUvUG9kZ29yaWNhCSMgTW9udGVuZWdybwotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1NhcmFqZXZvCSMgQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1Nrb3BqZQkjIE1hY2Vkb25pYQotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1phZ3JlYgkjIENyb2F0aWEKLQotIyBTbG92YWtpYQotTGluayBFdXJvcGUvUHJhZ3VlIEV1cm9wZS9CcmF0aXNsYXZhCi0KLSMgU2xvdmVuaWEKLSMgc2VlIFNlcmJpYQotCi0jIFNwYWluCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBGb3IgMTkxNy0xOTE5IFdoaXRtYW4gZ2l2ZXMgQXByIFNhdD49MSAtIE9jdCBTYXQ+PTE7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTE3CW9ubHkJLQlNYXkJIDUJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTE3CTE5MTkJLQlPY3QJIDYJMjM6MDBzCTAJLQotUnVsZQlTcGFpbgkxOTE4CW9ubHkJLQlBcHIJMTUJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTE5CW9ubHkJLQlBcHIJIDUJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MjEgRmViIDI4IC0gT2N0IDE0OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJU3BhaW4JMTkyNAlvbmx5CS0JQXByCTE2CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTI0IE9jdCAxNDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNwYWluCTE5MjQJb25seQktCU9jdAkgNAkyMzowMHMJMAktCi1SdWxlCVNwYWluCTE5MjYJb25seQktCUFwcgkxNwkyMzowMHMJMTowMAlTCi0jIFdoaXRtYW4gc2F5cyBubyBEU1QgaW4gMTkyOTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNwYWluCTE5MjYJMTkyOQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlTcGFpbgkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTI5CW9ubHkJLQlBcHIJMjAJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MzcgSnVuIDE2LCAxOTM4IEFwciAxNiwgMTk0MCBBcHIgMTM7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTM3CW9ubHkJLQlNYXkJMjIJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTM3CTE5MzkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KLVJ1bGUJU3BhaW4JMTkzOAlvbmx5CS0JTWFyCTIyCTIzOjAwcwkxOjAwCVMKLVJ1bGUJU3BhaW4JMTkzOQlvbmx5CS0JQXByCTE1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk0MAlvbmx5CS0JTWFyCTE2CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBzYXlzIG5vIERTVCAxOTQyLTE5NDU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlNYXkJIDIJMjI6MDBzCTI6MDAJTSAjIE1pZHN1bW1lcgotUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlTZXAJIDEJMjI6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTQzCTE5NDYJLQlBcHIJU2F0Pj0xMwkyMjowMHMJMjowMAlNCi1SdWxlCVNwYWluCTE5NDMJb25seQktCU9jdAkgMwkyMjowMHMJMTowMAlTCi1SdWxlCVNwYWluCTE5NDQJb25seQktCU9jdAkxMAkyMjowMHMJMTowMAlTCi1SdWxlCVNwYWluCTE5NDUJb25seQktCVNlcAkzMAkgMTowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk0Nglvbmx5CS0JU2VwCTMwCSAwOjAwCTAJLQotUnVsZQlTcGFpbgkxOTQ5CW9ubHkJLQlBcHIJMzAJMjM6MDAJMTowMAlTCi1SdWxlCVNwYWluCTE5NDkJb25seQktCVNlcAkzMAkgMTowMAkwCS0KLVJ1bGUJU3BhaW4JMTk3NAkxOTc1CS0JQXByCVNhdD49MTMJMjM6MDAJMTowMAlTCi1SdWxlCVNwYWluCTE5NzQJMTk3NQktCU9jdAlTdW4+PTEJIDE6MDAJMAktCi1SdWxlCVNwYWluCTE5NzYJb25seQktCU1hcgkyNwkyMzowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk3NgkxOTc3CS0JU2VwCWxhc3RTdW4JIDE6MDAJMAktCi1SdWxlCVNwYWluCTE5NzcJMTk3OAktCUFwcgkgMgkyMzowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQotIyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBjb3BpZWQgZnJvbSBNb3JvY2NvIGZyb20gMTk2NyB0aHJvdWdoIDE5NzguCi1SdWxlIFNwYWluQWZyaWNhIDE5NjcJb25seQktCUp1bgkgMwkxMjowMAkxOjAwCVMKLVJ1bGUgU3BhaW5BZnJpY2EgMTk2Nwlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQotUnVsZSBTcGFpbkFmcmljYSAxOTc0CW9ubHkJLQlKdW4JMjQJIDA6MDAJMTowMAlTCi1SdWxlIFNwYWluQWZyaWNhIDE5NzQJb25seQktCVNlcAkgMQkgMDowMAkwCS0KLVJ1bGUgU3BhaW5BZnJpY2EgMTk3NgkxOTc3CS0JTWF5CSAxCSAwOjAwCTE6MDAJUwotUnVsZSBTcGFpbkFmcmljYSAxOTc2CW9ubHkJLQlBdWcJIDEJIDA6MDAJMAktCi1SdWxlIFNwYWluQWZyaWNhIDE5NzcJb25seQktCVNlcAkyOAkgMDowMAkwCS0KLVJ1bGUgU3BhaW5BZnJpY2EgMTk3OAlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUwotUnVsZSBTcGFpbkFmcmljYSAxOTc4CW9ubHkJLQlBdWcJIDQJIDA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9NYWRyaWQJLTA6MTQ6NDQgLQlMTVQJMTkwMSBKYW4gIDEgIDA6MDBzCi0JCQkgMDowMAlTcGFpbglXRSVzVAkxOTQ2IFNlcCAzMAotCQkJIDE6MDAJU3BhaW4JQ0Ulc1QJMTk3OQotCQkJIDE6MDAJRVUJQ0Ulc1QKLVpvbmUJQWZyaWNhL0NldXRhCS0wOjIxOjE2IC0JTE1UCTE5MDEKLQkJCSAwOjAwCS0JV0VUCTE5MTggTWF5ICA2IDIzOjAwCi0JCQkgMDowMAkxOjAwCVdFU1QJMTkxOCBPY3QgIDcgMjM6MDAKLQkJCSAwOjAwCS0JV0VUCTE5MjQKLQkJCSAwOjAwCVNwYWluCVdFJXNUCTE5MjkKLQkJCSAwOjAwIFNwYWluQWZyaWNhIFdFJXNUIDE5ODQgTWFyIDE2Ci0JCQkgMTowMAktCUNFVAkxOTg2Ci0JCQkgMTowMAlFVQlDRSVzVAotWm9uZQlBdGxhbnRpYy9DYW5hcnkJLTE6MDE6MzYgLQlMTVQJMTkyMiBNYXIgIyBMYXMgUGFsbWFzIGRlIEdyYW4gQy4KLQkJCS0xOjAwCS0JQ0FOVAkxOTQ2IFNlcCAzMCAxOjAwICMgQ2FuYXJpZXMgVGltZQotCQkJIDA6MDAJLQlXRVQJMTk4MCBBcHIgIDYgMDowMHMKLQkJCSAwOjAwCTE6MDAJV0VTVAkxOTgwIFNlcCAyOCAwOjAwcwotCQkJIDA6MDAJRVUJV0Ulc1QKLSMgSUFUQSBTU0lNICgxOTk2LTA5KSBzYXlzIHRoZSBDYW5hcmllcyBzd2l0Y2ggYXQgMjowMHUsIG5vdCAxOjAwdS4KLSMgSWdub3JlIHRoaXMgZm9yIG5vdywgYXMgdGhlIENhbmFyaWVzIGFyZSBwYXJ0IG9mIHRoZSBFVS4KLQotIyBTd2VkZW4KLQotIyBGcm9tIEl2YW4gTmlsc3NvbiAoMjAwMS0wNC0xMyksIHN1cGVyc2VkaW5nIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMKLSMgVGhlIGxhdyAiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTg3OCwgbm8gMTQiIGFib3V0IHN0YW5kYXJkIHRpbWUgaW4gMTg3OToKLSMgRnJvbSB0aGUgYmVnaW5uaW5nIG9mIDE4NzkgKHRoYXQgaXMgMDEtMDEgMDA6MDApIHRoZSB0aW1lIGZvciBhbGwKLSMgcGxhY2VzIGluIHRoZSBjb3VudHJ5IGlzICJ0aGUgbWVhbiBzb2xhciB0aW1lIGZvciB0aGUgbWVyaWRpYW4gYXQKLSMgdGhyZWUgZGVncmVlcywgb3IgdHdlbHZlIG1pbnV0ZXMgb2YgdGltZSwgdG8gdGhlIHdlc3Qgb2YgdGhlCi0jIG1lcmlkaWFuIG9mIHRoZSBPYnNlcnZhdG9yeSBvZiBTdG9ja2hvbG0iLiAgVGhlIGxhdyBpcyBkYXRlZCAxODc4LTA1LTMxLgotIwotIyBUaGUgb2JzZXJ2YXRvcnkgYXQgdGhhdCB0aW1lIGhhZCB0aGUgbWVyaWRpYW4gMTggZGVncmVlcyAwMycgMzAiCi0jIGVhc3Rlcm4gbG9uZ2l0dWRlID0gMDE6MTI6MTQgaW4gdGltZS4gIExlc3MgMTIgbWludXRlcyBnaXZlcyB0aGUKLSMgbmF0aW9uYWwgc3RhbmRhcmQgdGltZSBhcyAwMTowMDoxNCBhaGVhZCBvZiBHTVQuLi4uCi0jCi0jIEFib3V0IHRoZSBiZWdpbm5pbmcgb2YgQ0VUIGluIFN3ZWRlbi4gVGhlIGxhd3RleHQgKCJTdmVuc2sKLSMgZm9yZmF0dG5pbmdzc2FtbGluZyAxODk5LCBubyA0NCIpIHN0YXRlcywgdGhhdCAiZnJvbSB0aGUgYmVnaW5uaW5nCi0jIG9mIDE5MDAuLi4gLi4uIHRoZSBzYW1lIGFzIHRoZSBtZWFuIHNvbGFyIHRpbWUgZm9yIHRoZSBtZXJpZGlhbiBhdAotIyB0aGUgZGlzdGFuY2Ugb2Ygb25lIGhvdXIgb2YgdGltZSBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgRW5nbGlzaAotIyBvYnNlcnZhdG9yeSBhdCBHcmVlbndpY2gsIG9yIGF0IDEyIG1pbnV0ZXMgMTQgc2Vjb25kcyB0byB0aGUgd2VzdAotIyBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgT2JzZXJ2YXRvcnkgb2YgU3RvY2tob2xtIi4gVGhlIGxhdyBpcyBkYXRlZAotIyAxODk5LTA2LTE2LiAgSW4gc2hvcnQ6IEF0IDE5MDAtMDEtMDEgMDA6MDA6MDAgdGhlIG5ldyBzdGFuZGFyZCB0aW1lCi0jIGluIFN3ZWRlbiBpcyAwMTowMDowMCBhaGVhZCBvZiBHTVQuCi0jCi0jIDE5MTY6IFRoZSBsYXd0ZXh0ICgiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTkxNiwgbm8gMTI0Iikgc3RhdGVzCi0jIHRoYXQgIjE5MTYtMDUtMTUgaXMgY29uc2lkZXJlZCB0byBiZWdpbiBvbmUgaG91ciBlYXJsaWVyIi4gSXQgaXMKLSMgcHJldHR5IG9idmlvdXMgdGhhdCBhdCAwNS0xNCAyMzowMCB0aGUgY2xvY2tzIGFyZSBzZXQgdG8gMDUtMTUgMDA6MDAuLi4uCi0jIEZ1cnRoZXIgdGhlIGxhdyBzYXlzLCB0aGF0ICIxOTE2LTA5LTMwIGlzIGNvbnNpZGVyZWQgdG8gZW5kIG9uZSBob3VyIGxhdGVyIi4KLSMKLSMgVGhlIGxhd3MgcmVndWxhdGluZyBbRFNUXSBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzaXRlIG9mIHRoZSBTd2VkaXNoCi0jIFBhcmxpYW1lbnQgYmVnaW5uaW5nIHdpdGggMTk4NSAtIHRoZSBsYXdzIHJlZ3VsYXRpbmcgMTk4MC8xOTg0IGFyZQotIyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaXRlICh0byBteSBrbm93bGVkZ2UgdGhleSBhcmUgb25seSBhdmFpbGFibGUKLSMgaW4gU3dlZGlzaCk6IDxodHRwOi8vd3d3LnJpa3NkYWdlbi5zZS9lbmdsaXNoL3dvcmsvc2ZzdC5hc3A+ICh0eXBlCi0jICJzb21tYXJ0aWQiIHdpdGhvdXQgdGhlIHF1b3RlcyBpbiB0aGUgZmllbGQgIkZyaXRleHQiIGFuZCB0aGVuIGNsaWNrCi0jIHRoZSBTb2stYnV0dG9uKS4KLSMKLSMgKDIwMDEtMDUtMTMpOgotIwotIyBJIGhhdmUgbm93IGZvdW5kIGEgbmV3c3BhcGVyIHN0YXRpbmcgdGhhdCBhdCAxOTE2LTEwLTAxIDAxOjAwCi0jIHN1bW1lcnRpbWUgdGhlIGNodXJjaC1jbG9ja3MgZXRjIHdlcmUgc2V0IGJhY2sgb25lIGhvdXIgdG8gc2hvdwotIyAxOTE2LTEwLTAxIDAwOjAwIHN0YW5kYXJkIHRpbWUuICBUaGUgYXJ0aWNsZSBhbHNvIHJlcG9ydHMgdGhhdCBzb21lCi0jIHBlb3BsZSB0aG91Z2h0IHRoZSBzd2l0Y2ggdG8gc3RhbmRhcmQgdGltZSB3b3VsZCB0YWtlIHBsYWNlIGFscmVhZHkKLSMgYXQgMTkxNi0xMC0wMSAwMDowMCBzdW1tZXIgdGltZSwgYnV0IHRoZXkgaGFkIHRvIHdhaXQgZm9yIGFub3RoZXIKLSMgaG91ciBiZWZvcmUgdGhlIGV2ZW50IHRvb2sgcGxhY2UuCi0jCi0jIFNvdXJjZTogVGhlIG5ld3NwYXBlciAiRGFnZW5zIE55aGV0ZXIiLCAxOTE2LTEwLTAxLCBwYWdlIDcgdXBwZXIgbGVmdC4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvU3RvY2tob2xtCTE6MTI6MTIgLQlMTVQJMTg3OSBKYW4gIDEKLQkJCTE6MDA6MTQJLQlTRVQJMTkwMCBKYW4gIDEJIyBTd2VkaXNoIFRpbWUKLQkJCTE6MDAJLQlDRVQJMTkxNiBNYXkgMTQgMjM6MDAKLQkJCTE6MDAJMTowMAlDRVNUCTE5MTYgT2N0ICAxIDAxOjAwCi0JCQkxOjAwCS0JQ0VUCTE5ODAKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBTd2l0emVybGFuZAotIyBGcm9tIEhvd3NlOgotIyBCeSB0aGUgZW5kIG9mIHRoZSAxOHRoIGNlbnR1cnkgY2xvY2tzIGFuZCB3YXRjaGVzIGJlY2FtZSBjb21tb25wbGFjZQotIyBhbmQgdGhlaXIgcGVyZm9ybWFuY2UgaW1wcm92ZWQgZW5vcm1vdXNseS4gIENvbW11bml0aWVzIGJlZ2FuIHRvIGtlZXAKLSMgbWVhbiB0aW1lIGluIHByZWZlcmVuY2UgdG8gYXBwYXJlbnQgdGltZSAtLSBHZW5ldmEgZnJvbSAxNzgwIC4uLi4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIEZyb20gV2hpdG1hbiAod2hvIHdyaXRlcyBgYE1pZG5pZ2h0PycnKToKLVJ1bGUJU3dpc3MJMTk0MAlvbmx5CS0JTm92CSAyCTA6MDAJMTowMAlTCi1SdWxlCVN3aXNzCTE5NDAJb25seQktCURlYwkzMQkwOjAwCTAJLQotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLVJ1bGUJU3dpc3MJMTk0MQkxOTQyCS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJUwotUnVsZQlTd2lzcwkxOTQxCTE5NDIJLQlPY3QJU3VuPj0xCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9adXJpY2gJMDozNDowOCAtCUxNVAkxODQ4IFNlcCAxMgotCQkJMDoyOTo0NAktCUJNVAkxODk0IEp1biAjIEJlcm4gTWVhbiBUaW1lCi0JCQkxOjAwCVN3aXNzCUNFJXNUCTE5ODEKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBUdXJrZXkKLQotIyBGcm9tIEFtYXIgRGV2ZWdvd2RhICgyMDA3LTAxLTAzKToKLSMgVGhlIHRpbWUgem9uZSBydWxlcyBmb3IgSXN0YW5idWwsIFR1cmtleSBoYXZlIG5vdCBiZWVuIGNoYW5nZWQgZm9yIHllYXJzIG5vdy4KLSMgLi4uIFRoZSBsYXRlc3QgcnVsZXMgYXJlIGF2YWlsYWJsZSBhdCAtCi0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svdGltZXpvbmUuaHRtbD9uPTEwNwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wMS0wMyk6Ci0jIEkgaGF2ZSBiZWVuIGFibGUgdG8gZmluZCBwcmVzcyByZWNvcmRzIGJhY2sgdG8gMTk5NiB3aGljaCBhbGwgc2F5IHRoYXQKLSMgRFNUIHN0YXJ0ZWQgMDE6MDAgbG9jYWwgdGltZSBhbmQgZW5kIGF0IDAyOjAwIGxvY2FsIHRpbWUuICBJIGFtIG5vdCBzdXJlCi0jIHdoYXQgaGFwcGVuZWQgYmVmb3JlIHRoYXQuICBPbmUgZXhhbXBsZSBmb3IgZWFjaCB5ZWFyIGZyb20gMTk5NiB0byAyMDAxOgotIyBodHRwOi8vbmV3c3BvdC5ieWVnbS5nb3YudHIvYXJzaXYvMTk5Ni8yMS9ONC5odG0KLSMgaHR0cDovL3d3dy5ieWVnbS5nb3YudHIvWUFZSU5MQVJJTUlaL0NIUi9JTkc5Ny8wMy85N1gwM1gyNS5UWFQKLSMgaHR0cDovL3d3dy5ieWVnbS5nb3YudHIvWUFZSU5MQVJJTUlaL0NIUi9JTkc5OC8wMy85OFgwM1gwMi5IVE0KLSMgaHR0cDovL3d3dy5ieWVnbS5nb3YudHIvWUFZSU5MQVJJTUlaL0NIUi9JTkc5OS8xMC85OVgxMFgyNi5IVE0jJTIwMTYKLSMgaHR0cDovL3d3dy5ieWVnbS5nb3YudHIvWUFZSU5MQVJJTUlaL0NIUi9JTkcyMDAwLzAzLzAwWDAzWDA2LkhUTSMlMjAyMQotIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzIwMDEvMDMvMjN4MDN4MDEuSFRNIyUyMDI3Ci0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDEtMDMpOgotIyBQcmVmZXIgdGhlIGFib3ZlIHNvdXJjZSB0byBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIHRpbWUgc3RhbXBzIGFmdGVyIDE5OTAuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDMtMDkpOgotIyBTdGFydGluZyAyMDA3IHRob3VnaCwgaXQgc2VlbXMgdGhhdCB0aGV5IGFyZSBhZG9wdGluZyBFVSdzIDE6MDAgVVRDCi0jIHN0YXJ0L2VuZCB0aW1lLCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBwYWdlICgyMDA3LTAzLTA3KToKLSMgaHR0cDovL3d3dy5udHZtc25iYy5jb20vbmV3cy80MDIwMjkuYXNwCi0jIFRoZSBvZmZpY2lhbCBkb2N1bWVudCBpcyBsb2NhdGVkIGhlcmUgLSBpdCBpcyBpbiBUdXJraXNoLi4uOgotIyBodHRwOi8vcmVnYS5iYXNiYWthbmxpay5nb3YudHIvZXNraWxlci8yMDA3LzAzLzIwMDcwMzA3LTcuaHRtCi0jIEkgd2FzIGFibGUgdG8gbG9jYXRlIHRoZSBmb2xsb3dpbmcgc2VlbWluZ2x5IG9mZmljaWFsIGRvY3VtZW50Ci0jIChvbiBhIG5vbi1nb3Zlcm5tZW50IHNlcnZlciB0aG91Z2gpIGRlc2NyaWJpbmcgZGF0ZXMgYmV0d2VlbiAyMDAyIGFuZCAyMDA2OgotIyBodHRwOi8vd3d3LmFsb21hbGl5ZS5jb20vYmtrXzIwMDJfMzc2OS5odG0KLQotIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwOC0wOC0xMSk6Ci0jIEkgc3BvdHRlZCB0aGlzIG5ld3MgYXJ0aWNsZSBhYm91dCBhIHBvdGVudGlhbCBjaGFuZ2UgaW4gVHVya2V5LgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmh1cnJpeWV0LmNvbS50ci9lbmdsaXNoL2RvbWVzdGljLzk2MjYxNzQuYXNwP3Njcj0xIj4KLSMgaHR0cDovL3d3dy5odXJyaXlldC5jb20udHIvZW5nbGlzaC9kb21lc3RpYy85NjI2MTc0LmFzcD9zY3I9MQotIyA8L2E+Ci0KLSMgRnJvbSBTdWUgV2lsbGlhbXMgKDIwMDgtMDgtMjApOgotIyBUaGlzIGFydGljbGUgc2F5cyB0aGF0IGFyb3VuZCB0aGUgZW5kIG9mIE1hcmNoIDIwMTEsIFR1cmtleSB3YW50cyB0bwotIyBhZGp1c3QgdGhlIGNsb2NrcyBmb3J3YXJkIGJ5IDEvMiBob3VyIGFuZCBzdGF5IHRoYXQgd2F5IHBlcm1hbmVudGx5LgotIyBUaGUgYXJ0aWNsZSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgY2hhbmdlIGluIHRpbWV6b25lIG9mZnNldCBpbiBhZGRpdGlvbgotIyB0byBzdG9wcGluZyBvYnNlcnZhbmNlIG9mIERTVC4KLSMgVGhpcyBwcm9wb3NhbCBoYXMgbm90IHlldCBiZWVuIGFwcHJvdmVkLgotIwotIyBSZWFkIG1vcmUgaGVyZS4uLgotIwotIyBUdXJrZXkgdG8gYWJhbmRvbiBkYXlsaWdodCBzYXZpbmcgdGltZSBpbiAyMDExCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudHVya2lzaGRhaWx5bmV3cy5jb20udHIvYXJ0aWNsZS5waHA/ZW5ld3NpZD0xMTI5ODkiPgotIyBodHRwOi8vd3d3LnR1cmtpc2hkYWlseW5ld3MuY29tLnRyL2FydGljbGUucGhwP2VuZXdzaWQ9MTEyOTg5Ci0jIDwvYT4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVHVya2V5CTE5MTYJb25seQktCU1heQkgMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTIwCW9ubHkJLQlNYXIJMjgJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5MjAJb25seQktCU9jdAkyNQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTkyMQlvbmx5CS0JQXByCSAzCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTIxCW9ubHkJLQlPY3QJIDMJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5MjIJb25seQktCU1hcgkyNgkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTkyMglvbmx5CS0JT2N0CSA4CTA6MDAJMAktCi0jIFdoaXRtYW4gZ2l2ZXMgMTkyMyBBcHIgMjggLSBTZXAgMTYgYW5kIG5vIERTVCBpbiAxOTI0LTE5MjU7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlUdXJrZXkJMTkyNAlvbmx5CS0JTWF5CTEzCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTI0CTE5MjUJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5MjUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk0MAlvbmx5CS0JSnVuCTMwCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTQwCW9ubHkJLQlPY3QJIDUJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NDAJb25seQktCURlYwkgMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk0MQlvbmx5CS0JU2VwCTIxCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTQyCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCVMKLSMgV2hpdG1hbiBvbWl0cyB0aGUgbmV4dCB0d28gdHJhbnNpdGlvbiBhbmQgZ2l2ZXMgMTk0NSBPY3QgMTsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVR1cmtleQkxOTQyCW9ubHkJLQlOb3YJIDEJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NDUJb25seQktCUFwcgkgMgkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk0NQlvbmx5CS0JT2N0CSA4CTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTQ2CW9ubHkJLQlKdW4JIDEJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NDYJb25seQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk0NwkxOTQ4CS0JQXByCVN1bj49MTYJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NDcJMTk1MAktCU9jdAlTdW4+PTIJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NDkJb25seQktCUFwcgkxMAkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk1MAlvbmx5CS0JQXByCTE5CTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTUxCW9ubHkJLQlBcHIJMjIJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NTEJb25seQktCU9jdAkgOAkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk2Mglvbmx5CS0JSnVsCTE1CTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTYyCW9ubHkJLQlPY3QJIDgJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NjQJb25seQktCU1heQkxNQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk2NAlvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTcwCTE5NzIJLQlNYXkJU3VuPj0yCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTcwCTE5NzIJLQlPY3QJU3VuPj0yCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTczCW9ubHkJLQlKdW4JIDMJMTowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NzMJb25seQktCU5vdgkgNAkzOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk3NAlvbmx5CS0JTWFyCTMxCTI6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTc0CW9ubHkJLQlOb3YJIDMJNTowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NzUJb25seQktCU1hcgkzMAkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk3NQkxOTc2CS0JT2N0CWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NzYJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk3NwkxOTc4CS0JQXByCVN1bj49MQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk3Nwlvbmx5CS0JT2N0CTE2CTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTc5CTE5ODAJLQlBcHIJU3VuPj0xCTM6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTc5CTE5ODIJLQlPY3QJTW9uPj0xMQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk4MQkxOTgyCS0JTWFyCWxhc3RTdW4JMzowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5ODMJb25seQktCUp1bAkzMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk4Mwlvbmx5CS0JT2N0CSAyCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTg1CW9ubHkJLQlBcHIJMjAJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5ODUJb25seQktCVNlcAkyOAkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk4NgkxOTkwCS0JTWFyCWxhc3RTdW4JMjowMHMJMTowMAlTCi1SdWxlCVR1cmtleQkxOTg2CTE5OTAJLQlTZXAJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJVHVya2V5CTE5OTEJMjAwNgktCU1hcglsYXN0U3VuCTE6MDBzCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk5MQkxOTk1CS0JU2VwCWxhc3RTdW4JMTowMHMJMAktCi1SdWxlCVR1cmtleQkxOTk2CTIwMDYJLQlPY3QJbGFzdFN1bgkxOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0lzdGFuYnVsCTE6NTU6NTIgLQlMTVQJMTg4MAotCQkJMTo1Njo1NgktCUlNVAkxOTEwIE9jdCAjIElzdGFuYnVsIE1lYW4gVGltZT8KLQkJCTI6MDAJVHVya2V5CUVFJXNUCTE5NzggT2N0IDE1Ci0JCQkzOjAwCVR1cmtleQlUUiVzVAkxOTg1IEFwciAyMCAjIFR1cmtleSBUaW1lCi0JCQkyOjAwCVR1cmtleQlFRSVzVAkyMDA3Ci0JCQkyOjAwCUVVCUVFJXNUCi1MaW5rCUV1cm9wZS9Jc3RhbmJ1bAlBc2lhL0lzdGFuYnVsCSMgSXN0YW5idWwgaXMgaW4gYm90aCBjb250aW5lbnRzLgotCi0jIFVrcmFpbmUKLSMKLSMgRnJvbSBJZ29yIEthcnBvdiwgd2hvIHdvcmtzIGZvciB0aGUgVWtyYW5pYW4gTWluaXN0cnkgb2YgSnVzdGljZSwKLSMgdmlhIEdhcnJldHQgV29sbG1hbiAoMjAwMy0wMS0yNyk6Ci0jIEJUVywgSSd2ZSBmb3VuZCB0aGUgb2ZmaWNpYWwgZG9jdW1lbnQgb24gdGhpcyBtYXR0ZXIuIEl0J3MgZ292ZXJtZW50Ci0jIHJlZ3VsYXRpb25zIG51bWJlciA1MDksIE1heSAxMywgMTk5Ni4gSW4gbXkgcG9vciB0cmFuc2xhdGlvbiBpdCBzYXlzOgotIyAiVGltZSBpbiBVa3JhaW5lIGlzIHNldCB0byBzZWNvbmQgdGltZXpvbmUgKEtpZXYgdGltZSkuIEVhY2ggbGFzdCBTdW5kYXkKLSMgb2YgTWFyY2ggYXQgM2FtIHRoZSB0aW1lIGlzIGNoYW5naW5nIHRvIDRhbSBhbmQgZWFjaCBsYXN0IFN1bmRheSBvZgotIyBPY3RvYmVyIHRoZSB0aW1lIGF0IDRhbSBpcyBjaGFuZ2luZyB0byAzYW0iCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgTW9zdCBvZiBVa3JhaW5lIHNpbmNlIDE5NzAgaGFzIGJlZW4gbGlrZSBLaWV2LgotIyAiS3lpdiIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgVWtyYWluaWFuIG5hbWUsIGJ1dAotIyAiS2lldiIgaXMgbW9yZSBjb21tb24gaW4gRW5nbGlzaC4KLVpvbmUgRXVyb3BlL0tpZXYJMjowMjowNCAtCUxNVAkxODgwCi0JCQkyOjAyOjA0CS0JS01UCTE5MjQgTWF5ICAyICMgS2lldiBNZWFuIFRpbWUKLQkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKLQkJCTM6MDAJLQlNU0sJMTk0MSBTZXAgMjAKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0MyBOb3YgIDYKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkwIEp1bCAgMSAyOjAwCi0JCQkyOjAwCS0JRUVUCTE5OTIKLQkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NQotCQkJMjowMAlFVQlFRSVzVAotIyBSdXRoZW5pYSB1c2VkIENFVCAxOTkwLzE5OTEuCi0jICJVemhob3JvZCIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgVWtyYWluaWFuIG5hbWUsIGJ1dAotIyAiVXpoZ29yb2QiIGlzIG1vcmUgY29tbW9uIGluIEVuZ2xpc2guCi1ab25lIEV1cm9wZS9Vemhnb3JvZAkxOjI5OjEyIC0JTE1UCTE4OTAgT2N0Ci0JCQkxOjAwCS0JQ0VUCTE5NDAKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBPY3QKLQkJCTE6MDAJMTowMAlDRVNUCTE5NDQgT2N0IDI2Ci0JCQkxOjAwCS0JQ0VUCTE5NDUgSnVuIDI5Ci0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKLQkJCTM6MDAJLQlNU0sJMTk5MCBKdWwgIDEgMjowMAotCQkJMTowMAktCUNFVAkxOTkxIE1hciAzMSAzOjAwCi0JCQkyOjAwCS0JRUVUCTE5OTIKLQkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NQotCQkJMjowMAlFVQlFRSVzVAotIyBaYXBvcm96aCd5ZSBhbmQgZWFzdGVybiBMdWdhbnNrIG9ibGFzdHMgb2JzZXJ2ZWQgRFNUIDE5OTAvMTk5MS4KLSMgIlphcG9yaXpoaWEiIGlzIHRoZSB0cmFuc2xpdGVyYXRpb24gb2YgdGhlIFVrcmFpbmlhbiBuYW1lLCBidXQKLSMgIlphcG9yb3poJ3llIiBpcyBtb3JlIGNvbW1vbiBpbiBFbmdsaXNoLiAgVXNlIHRoZSBjb21tb24gRW5nbGlzaAotIyBzcGVsbGluZywgZXhjZXB0IG9taXQgdGhlIGFwb3N0cm9waGUgYXMgaXQgaXMgbm90IGFsbG93ZWQgaW4KLSMgcG9ydGFibGUgUG9zaXggZmlsZSBuYW1lcy4KLVpvbmUgRXVyb3BlL1phcG9yb3poeWUJMjoyMDo0MCAtCUxNVAkxODgwCi0JCQkyOjIwCS0JQ1VUCTE5MjQgTWF5ICAyICMgQ2VudHJhbCBVa3JhaW5lIFQKLQkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKLQkJCTM6MDAJLQlNU0sJMTk0MSBBdWcgMjUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0MyBPY3QgMjUKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMAotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1Ci0JCQkyOjAwCUVVCUVFJXNUCi0jIENlbnRyYWwgQ3JpbWVhIHVzZWQgTW9zY293IHRpbWUgMTk5NC8xOTk3LgotWm9uZSBFdXJvcGUvU2ltZmVyb3BvbAkyOjE2OjI0IC0JTE1UCTE4ODAKLQkJCTI6MTYJLQlTTVQJMTkyNCBNYXkgIDIgIyBTaW1mZXJvcG9sIE1lYW4gVAotCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQotCQkJMzowMAktCU1TSwkxOTQxIE5vdgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEFwciAxMwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTAgSnVsICAxIDI6MDAKLQkJCTI6MDAJLQlFRVQJMTk5MgotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIF9FY29ub21pc3RfICgxOTk0LTA1LTI4LCBwIDQ1KSByZXBvcnRzIHRoYXQgY2VudHJhbCBDcmltZWEgc3dpdGNoZWQKLSMgZnJvbSBLaWV2IHRvIE1vc2NvdyB0aW1lIHNvbWV0aW1lIGFmdGVyIHRoZSBKYW51YXJ5IDE5OTQgZWxlY3Rpb25zLgotIyBTaGFua3MgKDE5OTkpIHNheXMgYGBkYXRlIG9mIGNoYW5nZSB1bmNlcnRhaW4nJywgYnV0IGltcGxpZXMgdGhhdCBpdCBoYXBwZW5lZAotIyBzb21ldGltZSBiZXR3ZWVuIHRoZSAxOTk0IERTVCBzd2l0Y2hlcy4gIFNoYW5rcyAmIFBvdHRlbmdlciBzaW1wbHkgc2F5Ci0jIDE5OTQtMDktMjUgMDM6MDAsIGJ1dCB0aGF0IGNhbid0IGJlIHJpZ2h0LiAgRm9yIG5vdywgZ3Vlc3MgaXQKLSMgY2hhbmdlZCBpbiBNYXkuCi0JCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTQgTWF5Ci0jIEZyb20gSUFUQSBTU0lNICgxOTk0LzE5OTcpLCB3aGljaCBhbHNvIHNheXMgdGhhdCBLZXJjaCBpcyBzdGlsbCBsaWtlIEtpZXYuCi0JCQkzOjAwCUUtRXVyCU1TSy9NU0QJMTk5NiBNYXIgMzEgMzowMHMKLQkJCTM6MDAJMTowMAlNU0QJMTk5NiBPY3QgMjcgMzowMHMKLSMgSUFUQSBTU0lNICgxOTk3LTA5KSBzYXlzIENyaW1lYSBzd2l0Y2hlZCB0byBFRVQvRUVTVC4KLSMgQXNzdW1lIGl0IGhhcHBlbmVkIGluIE1hcmNoIGJ5IG5vdCBjaGFuZ2luZyB0aGUgY2xvY2tzLgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTk3Ci0JCQkzOjAwCS0JTVNLCTE5OTcgTWFyIGxhc3RTdW4gMTowMHUKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE9uZSBzb3VyY2Ugc2hvd3MgdGhhdCBCdWxnYXJpYSwgQ3lwcnVzLCBGaW5sYW5kLCBhbmQgR3JlZWNlIG9ic2VydmUgRFNUIGZyb20KLSMgdGhlIGxhc3QgU3VuZGF5IGluIE1hcmNoIHRvIHRoZSBsYXN0IFN1bmRheSBpbiBTZXB0ZW1iZXIgaW4gMTk4Ni4KLSMgVGhlIHNvdXJjZSBzaG93cyBSb21hbmlhIGNoYW5naW5nIGEgZGF5IGxhdGVyIHRoYW4gZXZlcnlib2R5IGVsc2UuCi0jCi0jIEFjY29yZGluZyB0byBCZXJuYXJkIFNpZWxvZmYncyBzb3VyY2UsIFBvbGFuZCBpcyBpbiB0aGUgTUVUIHRpbWUgem9uZSBidXQKLSMgdXNlcyB0aGUgV0UgRFNUIHJ1bGVzLiAgVGhlIFdlc3Rlcm4gVVNTUiB1c2VzIEVFVCsxIGFuZCBNRSBEU1QgcnVsZXMuCi0jIEJlcm5hcmQgU2llbG9mZidzIHNvdXJjZSBjbGFpbXMgUm9tYW5pYSBzd2l0Y2hlcyBvbiB0aGUgc2FtZSBkYXksIGJ1dCBhdAotIyAwMDowMCBzdGFuZGFyZCB0aW1lIChpLmUuLCAwMTowMCBEU1QpLiAgSXQgYWxzbyBjbGFpbXMgdGhhdCBUdXJrZXkKLSMgc3dpdGNoZXMgb24gdGhlIHNhbWUgZGF5LCBidXQgc3dpdGNoZXMgb24gYXQgMDE6MDAgc3RhbmRhcmQgdGltZQotIyBhbmQgb2ZmIGF0IDAwOjAwIHN0YW5kYXJkIHRpbWUgKGkuZS4sIDAxOjAwIERTVCkKLQotIyAuLi4KLSMgRGF0ZTogV2VkLCAyOCBKYW4gODcgMTY6NTY6MjcgLTAxMDAKLSMgRnJvbTogVG9tIEhvZm1hbm4KLSMgLi4uCi0jCi0jIC4uLnRoZSBFdXJvcGVhbiB0aW1lIHJ1bGVzIGFyZS4uLnN0YW5kYXJkaXplZCBzaW5jZSAxOTgxLCB3aGVuCi0jIG1vc3QgRXVyb3BlYW4gY291blt0cl1pZXMgc3RhcnRlZCBEU1QuICBCZWZvcmUgdGhhdCB5ZWFyLCBvbmx5Ci0jIGEgZmV3IGNvdW50cmllcyAoVUssIEZyYW5jZSwgSXRhbHkpIGhhZCBEU1QsIGVhY2ggYWNjb3JkaW5nCi0jIHRvIG93biBuYXRpb25hbCBydWxlcy4gIEluIDE5ODEsIGhvd2V2ZXIsIERTVCBzdGFydGVkIG9uCi0jICdBcHIgZmlyc3RTdW4nLCBhbmQgbm90IG9uICdNYXIgbGFzdFN1bicgYXMgaW4gdGhlIGZvbGxvd2luZwotIyB5ZWFycy4uLgotIyBCdXQgYWxzbyBzaW5jZSAxOTgxIHRoZXJlIGFyZSBzb21lIG1vcmUgbmF0aW9uYWwgZXhjZXB0aW9ucwotIyB0aGFuIGxpc3RlZCBpbiAnZXVyb3BlJzogU3dpdHplcmxhbmQsIGZvciBleGFtcGxlLCBqb2luZWQgRFNUCi0jIG9uZSB5ZWFyIGxhdGVyLCBEZW5tYXJrIGVuZGVkIERTVCBvbiAnT2N0IDEnIGluc3RlYWQgb2YgJ1NlcAotIyBsYXN0U3VuJyBpbiAxOTgxLS0tSSBkb24ndCBrbm93IGhvdyB0aGV5IGhhbmRsZSBub3cuCi0jCi0jIEZpbmFsbHksIERTVCBpc3QgYWx3YXlzIGZyb20gJ0FwciAxJyB0byAnT2N0IDEnIGluIHRoZQotIyBTb3ZpZXQgVW5pb24gKGFzIGZhciBhcyBJIGtub3cpLgotIwotIyBUb20gSG9mbWFubiwgU2NpZW50aWZpYyBDb21wdXRlciBDZW50ZXIsIENJQkEtR0VJR1kgQUcsCi0jIDQwMDIgQmFzbGUsIFN3aXR6ZXJsYW5kCi0jIC4uLgotCi0jIC4uLgotIyBEYXRlOiBXZWQsIDQgRmViIDg3IDIyOjM1OjIyICswMTAwCi0jIEZyb206IERpayBULiBXaW50ZXIKLSMgLi4uCi0jCi0jIFRoZSBpbmZvcm1hdGlvbiBmcm9tIFRvbSBIb2ZtYW5uIGlzIChhcyBmYXIgYXMgSSBrbm93KSBub3QgZW50aXJlbHkgY29ycmVjdC4KLSMgQWZ0ZXIgYSByZXF1ZXN0IGZyb20gY2hvbmdvIGF0IGFtZGFobCBJIHRyaWVkIHRvIHJldHJpZXZlIGFsbCBpbmZvcm1hdGlvbgotIyBhYm91dCBEU1QgaW4gRXVyb3BlLiAgSSB3YXMgYWJsZSB0byBmaW5kIGFsbCBmcm9tIGFib3V0IDE5NjkuCi0jCi0jIC4uLnN0YW5kYXJkaXphdGlvbiBvbiBEU1QgaW4gRXVyb3BlIHN0YXJ0ZWQgaW4gYWJvdXQgMTk3NyB3aXRoIHN3aXRjaGVzIG9uCi0jIGZpcnN0IFN1bmRheSBpbiBBcHJpbCBhbmQgbGFzdCBTdW5kYXkgaW4gU2VwdGVtYmVyLi4uCi0jIEluIDE5ODEgVUsgam9pbmVkIEV1cm9wZSBpbnNvZmFyIHRoYXQKLSMgdGhlIHN0YXJ0aW5nIGRheSBmb3IgYm90aCBzaGlmdGVkIHRvIGxhc3QgU3VuZGF5IGluIE1hcmNoLiAgQW5kIGZyb20gMTk4MgotIyB0aGUgd2hvbGUgb2YgRXVyb3BlIHVzZWQgRFNULCB3aXRoIHN3aXRjaCBkYXRlcyBBcHJpbCAxIGFuZCBPY3RvYmVyIDEgaW4KLSMgdGhlIFNvdltpXWV0IFVuaW9uLiAgSW4gMTk4NSB0aGUgU1UgcmV2ZXJ0ZWQgdG8gc3RhbmRhcmQgRXVyb3BlW2FdbiBzd2l0Y2gKLSMgZGF0ZXMuLi4KLSMKLSMgSXQgc2hvdWxkIGFsc28gYmUgcmVtZW1iZXJlZCB0aGF0IHRpbWUtem9uZXMgYXJlIG5vdCBjb25zdGFudHM7IGUuZy4KLSMgUG9ydHVnYWwgc3dpdGNoZWQgaW4gMTk3NiBmcm9tIE1FVCAob3IgQ0VUKSB0byBXRVQgd2l0aCBEU1QuLi4KLSMgTm90ZSBhbHNvIHRoYXQgdGhvdWdoIHRoZXJlIHdlcmUgcnVsZXMgZm9yIHN3aXRjaCBkYXRlcyBub3QKLSMgYWxsIGNvdW50cmllcyBhYmlkZWQgdG8gdGhlc2UgZGF0ZXMsIGFuZCBtYW55IGluZGl2aWR1YWwgZGV2aWF0aW9ucwotIyBvY2N1cnJlZCwgdGhvdWdoIG5vdCBzaW5jZSAxOTgyIEkgYmVsaWV2ZS4gIEFub3RoZXIgbm90ZTogaXQgaXMgYWx3YXlzCi0jIGFzc3VtZWQgdGhhdCBEU1QgaXMgMSBob3VyIGFoZWFkIG9mIG5vcm1hbCB0aW1lLCB0aGlzIG5lZWQgbm90IGJlIHRoZQotIyBjYXNlOyBhdCBsZWFzdCBpbiB0aGUgTmV0aGVybGFuZHMgdGhlcmUgaGF2ZSBiZWVuIHRpbWVzIHdoZW4gRFNUIHdhcyAyIGhvdXJzCi0jIGluIGFkdmFuY2Ugb2Ygbm9ybWFsIHRpbWUuCi0jCi0jIC4uLgotIyBkaWsgdC4gd2ludGVyLCBjd2ksIGFtc3RlcmRhbSwgbmVkZXJsYW5kCi0jIC4uLgotCi0jIEZyb20gQm9iIERldmluZSAoMTk4OC0wMS0yOCk6Ci0jIC4uLgotIyBHcmVlY2U6IExhc3QgU3VuZGF5IGluIEFwcmlsIHRvIGxhc3QgU3VuZGF5IGluIFNlcHRlbWJlciAoaWZmeSBvbiBkYXRlcykuCi0jIFNpbmNlIDE5NzguICBDaGFuZ2UgYXQgbWlkbmlnaHQuCi0jIC4uLgotIyBNb25hY286IGhhcyBzYW1lIERTVCBhcyBGcmFuY2UuCi0jIC4uLgpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvZmFjdG9yeSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2ZhY3RvcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NjA2M2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvZmFjdG9yeQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBAKCMpZmFjdG9yeQk4LjEKLQotIyBGb3IgY29tcGFuaWVzIHdobyBkb24ndCB3YW50IHRvIHB1dCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBpbgotIyB0aGVpciBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcy4gIFdoZW4gdXNlcnMgcnVuIGRhdGUsIHRoZXknbGwgZ2V0IHRoZSBtZXNzYWdlLgotIyBBbHNvIHVzZWZ1bCBmb3IgdGhlICJjb21wLnNvdXJjZXMiIHZlcnNpb24uCi0KLSMgWm9uZQlOQU1FCUdNVE9GRglSVUxFUwlGT1JNQVQKLVpvbmUJRmFjdG9yeQkwCS0gIkxvY2FsIHRpbWUgem9uZSBtdXN0IGJlIHNldC0tc2VlIHppYyBtYW51YWwgcGFnZSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2lzbzMxNjYudGFiIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvaXNvMzE2Ni50YWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjIzOTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvaXNvMzE2Ni50YWIKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotIyBJU08gMzE2NiBhbHBoYS0yIGNvdW50cnkgY29kZXMKLSMKLSMgQCgjKWlzbzMxNjYudGFiCTguNQotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA5LTI3KToKLSMKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6Ci0jIDEuICBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLCBjdXJyZW50IGFzIG9mCi0jICAgICBJU08gMzE2Ni0xIE5ld3NsZXR0ZXIgVkktMSAoMjAwNy0wOS0yMSkuICBTZWU6Ci0jICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS9pbmRleC5odG1sIj4KLSMgICAgIElTTyAzMTY2IE1haW50ZW5hbmNlIGFnZW5jeSAoSVNPIDMxNjYvTUEpCi0jICAgICA8L2E+LgotIyAyLiAgVGhlIHVzdWFsIEVuZ2xpc2ggbmFtZSBmb3IgdGhlIGNvdW50cnksCi0jICAgICBjaG9zZW4gc28gdGhhdCBhbHBoYWJldGljIHNvcnRpbmcgb2Ygc3Vic2V0cyBwcm9kdWNlcyBoZWxwZnVsIGxpc3RzLgotIyAgICAgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVuZ2xpc2ggbmFtZSBpbiB0aGUgSVNPIDMxNjYgdGFibGVzLgotIwotIyBDb2x1bW5zIGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgdGFiLgotIyBUaGUgdGFibGUgaXMgc29ydGVkIGJ5IGNvdW50cnkgY29kZS4KLSMKLSMgTGluZXMgYmVnaW5uaW5nIHdpdGggYCMnIGFyZSBjb21tZW50cy4KLSMKLSNjb3VudHJ5LQotI2NvZGUJY291bnRyeSBuYW1lCi1BRAlBbmRvcnJhCi1BRQlVbml0ZWQgQXJhYiBFbWlyYXRlcwotQUYJQWZnaGFuaXN0YW4KLUFHCUFudGlndWEgJiBCYXJidWRhCi1BSQlBbmd1aWxsYQotQUwJQWxiYW5pYQotQU0JQXJtZW5pYQotQU4JTmV0aGVybGFuZHMgQW50aWxsZXMKLUFPCUFuZ29sYQotQVEJQW50YXJjdGljYQotQVIJQXJnZW50aW5hCi1BUwlTYW1vYSAoQW1lcmljYW4pCi1BVAlBdXN0cmlhCi1BVQlBdXN0cmFsaWEKLUFXCUFydWJhCi1BWAlBYWxhbmQgSXNsYW5kcwotQVoJQXplcmJhaWphbgotQkEJQm9zbmlhICYgSGVyemVnb3ZpbmEKLUJCCUJhcmJhZG9zCi1CRAlCYW5nbGFkZXNoCi1CRQlCZWxnaXVtCi1CRglCdXJraW5hIEZhc28KLUJHCUJ1bGdhcmlhCi1CSAlCYWhyYWluCi1CSQlCdXJ1bmRpCi1CSglCZW5pbgotQkwJU3QgQmFydGhlbGVteQotQk0JQmVybXVkYQotQk4JQnJ1bmVpCi1CTwlCb2xpdmlhCi1CUglCcmF6aWwKLUJTCUJhaGFtYXMKLUJUCUJodXRhbgotQlYJQm91dmV0IElzbGFuZAotQlcJQm90c3dhbmEKLUJZCUJlbGFydXMKLUJaCUJlbGl6ZQotQ0EJQ2FuYWRhCi1DQwlDb2NvcyAoS2VlbGluZykgSXNsYW5kcwotQ0QJQ29uZ28gKERlbS4gUmVwLikKLUNGCUNlbnRyYWwgQWZyaWNhbiBSZXAuCi1DRwlDb25nbyAoUmVwLikKLUNICVN3aXR6ZXJsYW5kCi1DSQlDb3RlIGQnSXZvaXJlCi1DSwlDb29rIElzbGFuZHMKLUNMCUNoaWxlCi1DTQlDYW1lcm9vbgotQ04JQ2hpbmEKLUNPCUNvbG9tYmlhCi1DUglDb3N0YSBSaWNhCi1DVQlDdWJhCi1DVglDYXBlIFZlcmRlCi1DWAlDaHJpc3RtYXMgSXNsYW5kCi1DWQlDeXBydXMKLUNaCUN6ZWNoIFJlcHVibGljCi1ERQlHZXJtYW55Ci1ESglEamlib3V0aQotREsJRGVubWFyawotRE0JRG9taW5pY2EKLURPCURvbWluaWNhbiBSZXB1YmxpYwotRFoJQWxnZXJpYQotRUMJRWN1YWRvcgotRUUJRXN0b25pYQotRUcJRWd5cHQKLUVICVdlc3Rlcm4gU2FoYXJhCi1FUglFcml0cmVhCi1FUwlTcGFpbgotRVQJRXRoaW9waWEKLUZJCUZpbmxhbmQKLUZKCUZpamkKLUZLCUZhbGtsYW5kIElzbGFuZHMKLUZNCU1pY3JvbmVzaWEKLUZPCUZhcm9lIElzbGFuZHMKLUZSCUZyYW5jZQotR0EJR2Fib24KLUdCCUJyaXRhaW4gKFVLKQotR0QJR3JlbmFkYQotR0UJR2VvcmdpYQotR0YJRnJlbmNoIEd1aWFuYQotR0cJR3Vlcm5zZXkKLUdICUdoYW5hCi1HSQlHaWJyYWx0YXIKLUdMCUdyZWVubGFuZAotR00JR2FtYmlhCi1HTglHdWluZWEKLUdQCUd1YWRlbG91cGUKLUdRCUVxdWF0b3JpYWwgR3VpbmVhCi1HUglHcmVlY2UKLUdTCVNvdXRoIEdlb3JnaWEgJiB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcwotR1QJR3VhdGVtYWxhCi1HVQlHdWFtCi1HVwlHdWluZWEtQmlzc2F1Ci1HWQlHdXlhbmEKLUhLCUhvbmcgS29uZwotSE0JSGVhcmQgSXNsYW5kICYgTWNEb25hbGQgSXNsYW5kcwotSE4JSG9uZHVyYXMKLUhSCUNyb2F0aWEKLUhUCUhhaXRpCi1IVQlIdW5nYXJ5Ci1JRAlJbmRvbmVzaWEKLUlFCUlyZWxhbmQKLUlMCUlzcmFlbAotSU0JSXNsZSBvZiBNYW4KLUlOCUluZGlhCi1JTwlCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkKLUlRCUlyYXEKLUlSCUlyYW4KLUlTCUljZWxhbmQKLUlUCUl0YWx5Ci1KRQlKZXJzZXkKLUpNCUphbWFpY2EKLUpPCUpvcmRhbgotSlAJSmFwYW4KLUtFCUtlbnlhCi1LRwlLeXJneXpzdGFuCi1LSAlDYW1ib2RpYQotS0kJS2lyaWJhdGkKLUtNCUNvbW9yb3MKLUtOCVN0IEtpdHRzICYgTmV2aXMKLUtQCUtvcmVhIChOb3J0aCkKLUtSCUtvcmVhIChTb3V0aCkKLUtXCUt1d2FpdAotS1kJQ2F5bWFuIElzbGFuZHMKLUtaCUthemFraHN0YW4KLUxBCUxhb3MKLUxCCUxlYmFub24KLUxDCVN0IEx1Y2lhCi1MSQlMaWVjaHRlbnN0ZWluCi1MSwlTcmkgTGFua2EKLUxSCUxpYmVyaWEKLUxTCUxlc290aG8KLUxUCUxpdGh1YW5pYQotTFUJTHV4ZW1ib3VyZwotTFYJTGF0dmlhCi1MWQlMaWJ5YQotTUEJTW9yb2NjbwotTUMJTW9uYWNvCi1NRAlNb2xkb3ZhCi1NRQlNb250ZW5lZ3JvCi1NRglTdCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KQotTUcJTWFkYWdhc2NhcgotTUgJTWFyc2hhbGwgSXNsYW5kcwotTUsJTWFjZWRvbmlhCi1NTAlNYWxpCi1NTQlNeWFubWFyIChCdXJtYSkKLU1OCU1vbmdvbGlhCi1NTwlNYWNhdQotTVAJTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzCi1NUQlNYXJ0aW5pcXVlCi1NUglNYXVyaXRhbmlhCi1NUwlNb250c2VycmF0Ci1NVAlNYWx0YQotTVUJTWF1cml0aXVzCi1NVglNYWxkaXZlcwotTVcJTWFsYXdpCi1NWAlNZXhpY28KLU1ZCU1hbGF5c2lhCi1NWglNb3phbWJpcXVlCi1OQQlOYW1pYmlhCi1OQwlOZXcgQ2FsZWRvbmlhCi1ORQlOaWdlcgotTkYJTm9yZm9sayBJc2xhbmQKLU5HCU5pZ2VyaWEKLU5JCU5pY2FyYWd1YQotTkwJTmV0aGVybGFuZHMKLU5PCU5vcndheQotTlAJTmVwYWwKLU5SCU5hdXJ1Ci1OVQlOaXVlCi1OWglOZXcgWmVhbGFuZAotT00JT21hbgotUEEJUGFuYW1hCi1QRQlQZXJ1Ci1QRglGcmVuY2ggUG9seW5lc2lhCi1QRwlQYXB1YSBOZXcgR3VpbmVhCi1QSAlQaGlsaXBwaW5lcwotUEsJUGFraXN0YW4KLVBMCVBvbGFuZAotUE0JU3QgUGllcnJlICYgTWlxdWVsb24KLVBOCVBpdGNhaXJuCi1QUglQdWVydG8gUmljbwotUFMJUGFsZXN0aW5lCi1QVAlQb3J0dWdhbAotUFcJUGFsYXUKLVBZCVBhcmFndWF5Ci1RQQlRYXRhcgotUkUJUmV1bmlvbgotUk8JUm9tYW5pYQotUlMJU2VyYmlhCi1SVQlSdXNzaWEKLVJXCVJ3YW5kYQotU0EJU2F1ZGkgQXJhYmlhCi1TQglTb2xvbW9uIElzbGFuZHMKLVNDCVNleWNoZWxsZXMKLVNECVN1ZGFuCi1TRQlTd2VkZW4KLVNHCVNpbmdhcG9yZQotU0gJU3QgSGVsZW5hCi1TSQlTbG92ZW5pYQotU0oJU3ZhbGJhcmQgJiBKYW4gTWF5ZW4KLVNLCVNsb3Zha2lhCi1TTAlTaWVycmEgTGVvbmUKLVNNCVNhbiBNYXJpbm8KLVNOCVNlbmVnYWwKLVNPCVNvbWFsaWEKLVNSCVN1cmluYW1lCi1TVAlTYW8gVG9tZSAmIFByaW5jaXBlCi1TVglFbCBTYWx2YWRvcgotU1kJU3lyaWEKLVNaCVN3YXppbGFuZAotVEMJVHVya3MgJiBDYWljb3MgSXMKLVRECUNoYWQKLVRGCUZyZW5jaCBTb3V0aGVybiAmIEFudGFyY3RpYyBMYW5kcwotVEcJVG9nbwotVEgJVGhhaWxhbmQKLVRKCVRhamlraXN0YW4KLVRLCVRva2VsYXUKLVRMCUVhc3QgVGltb3IKLVRNCVR1cmttZW5pc3RhbgotVE4JVHVuaXNpYQotVE8JVG9uZ2EKLVRSCVR1cmtleQotVFQJVHJpbmlkYWQgJiBUb2JhZ28KLVRWCVR1dmFsdQotVFcJVGFpd2FuCi1UWglUYW56YW5pYQotVUEJVWtyYWluZQotVUcJVWdhbmRhCi1VTQlVUyBtaW5vciBvdXRseWluZyBpc2xhbmRzCi1VUwlVbml0ZWQgU3RhdGVzCi1VWQlVcnVndWF5Ci1VWglVemJla2lzdGFuCi1WQQlWYXRpY2FuIENpdHkKLVZDCVN0IFZpbmNlbnQKLVZFCVZlbmV6dWVsYQotVkcJVmlyZ2luIElzbGFuZHMgKFVLKQotVkkJVmlyZ2luIElzbGFuZHMgKFVTKQotVk4JVmlldG5hbQotVlUJVmFudWF0dQotV0YJV2FsbGlzICYgRnV0dW5hCi1XUwlTYW1vYSAod2VzdGVybikKLVlFCVllbWVuCi1ZVAlNYXlvdHRlCi1aQQlTb3V0aCBBZnJpY2EKLVpNCVphbWJpYQotWlcJWmltYmFid2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL2xlYXBzZWNvbmRzIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvbGVhcHNlY29uZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjRmMGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvbGVhcHNlY29uZHMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jIEAoIylsZWFwc2Vjb25kcwk4LjYKLQotIyBBbGxvd2FuY2UgZm9yIGxlYXBzZWNvbmRzIGFkZGVkIHRvIGVhY2ggdGltZXpvbmUgZmlsZS4KLQotIyBUaGUgSW50ZXJuYXRpb25hbCBFYXJ0aCBSb3RhdGlvbiBTZXJ2aWNlIHBlcmlvZGljYWxseSB1c2VzIGxlYXAgc2Vjb25kcwotIyB0byBrZWVwIFVUQyB0byB3aXRoaW4gMC45IHMgb2YgVVQxCi0jICh3aGljaCBtZWFzdXJlcyB0aGUgdHJ1ZSBhbmd1bGFyIG9yaWVudGF0aW9uIG9mIHRoZSBlYXJ0aCBpbiBzcGFjZSk7IHNlZQotIyBUZXJyeSBKIFF1aW5uLCBUaGUgQklQTSBhbmQgdGhlIGFjY3VyYXRlIG1lYXN1cmUgb2YgdGltZSwKLSMgUHJvYyBJRUVFIDc5LCA3IChKdWx5IDE5OTEpLCA4OTQtOTA1LgotIyBUaGVyZSB3ZXJlIG5vIGxlYXAgc2Vjb25kcyBiZWZvcmUgMTk3MiwgYmVjYXVzZSB0aGUgb2ZmaWNpYWwgbWVjaGFuaXNtCi0jIGFjY291bnRpbmcgZm9yIHRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIGF0b21pYyB0aW1lIGFuZCB0aGUgZWFydGgncyByb3RhdGlvbgotIyBkaWQgbm90IGV4aXN0IHVudGlsIHRoZSBlYXJseSAxOTcwcy4KLQotIyBUaGUgY29ycmVjdGlvbiAoKyBvciAtKSBpcyBtYWRlIGF0IHRoZSBnaXZlbiB0aW1lLCBzbyBsaW5lcwotIyB3aWxsIHR5cGljYWxseSBsb29rIGxpa2U6Ci0jCUxlYXAJWUVBUglNT04JREFZCTIzOjU5OjYwCSsJUi9TCi0jIG9yCi0jCUxlYXAJWUVBUglNT04JREFZCTIzOjU5OjU5CS0JUi9TCi0KLSMgSWYgdGhlIGxlYXBzZWNvbmQgaXMgUm9sbGluZyAoUikgdGhlIGdpdmVuIHRpbWUgaXMgbG9jYWwgdGltZQotIyBJZiB0aGUgbGVhcHNlY29uZCBpcyBTdGF0aW9uYXJ5IChTKSB0aGUgZ2l2ZW4gdGltZSBpcyBVVEMKLQotIyBMZWFwCVlFQVIJTU9OVEgJREFZCUhIOk1NOlNTCUNPUlIJUi9TCi1MZWFwCTE5NzIJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTcyCURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3MwlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5NzQJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTc1CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3NglEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5NzcJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTc4CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3OQlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5ODEJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTgyCUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk4MwlKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTE5ODUJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTg3CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk4OQlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5OTAJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTkyCUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk5MwlKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTE5OTQJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTk1CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk5NwlKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTE5OTgJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkyMDA1CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMjAwOAlEZWMJMzEJMjM6NTk6NjAJKwlTCi0KLSMgSU5URVJOQVRJT05BTCBFQVJUSCBST1RBVElPTiBBTkQgUkVGRVJFTkNFIFNZU1RFTVMgU0VSVklDRSAoSUVSUykKLSMKLSMgU0VSVklDRSBJTlRFUk5BVElPTkFMIERFIExBIFJPVEFUSU9OIFRFUlJFU1RSRSBFVCBERVMgU1lTVEVNRVMgREUgUkVGRVJFTkNFCi0jCi0jIFNFUlZJQ0UgREUgTEEgUk9UQVRJT04gVEVSUkVTVFJFCi0jIE9CU0VSVkFUT0lSRSBERSBQQVJJUwotIyA2MSwgQXYuIGRlIGwnT2JzZXJ2YXRvaXJlIDc1MDE0IFBBUklTIChGcmFuY2UpCi0jIFRlbC4gICAgICA6IDMzICgwKSAxIDQwIDUxIDIyIDI2Ci0jIEZBWCAgICAgICA6IDMzICgwKSAxIDQwIDUxIDIyIDkxCi0jIGUtbWFpbCAgICA6IHNlcnZpY2VzLmllcnNAb2JzcG0uZnIKLSMgaHR0cDovL2hwaWVycy5vYnNwbS5mci9lb3AtcGMKLSMKLSMgUGFyaXMsIDQgSnVseSAyMDA4Ci0jCi0jIEJ1bGxldGluIEMgMzYKLSMKLSMgVG8gYXV0aG9yaXRpZXMgcmVzcG9uc2libGUKLSMgZm9yIHRoZSBtZWFzdXJlbWVudCBhbmQKLSMgZGlzdHJpYnV0aW9uIG9mIHRpbWUKLSMKLSMgVVRDIFRJTUUgU1RFUAotIyBvbiB0aGUgMXN0IG9mIEphbnVhcnkgMjAwOQotIwotIyBBIHBvc2l0aXZlIGxlYXAgc2Vjb25kIHdpbGwgYmUgaW50cm9kdWNlZCBhdCB0aGUgZW5kIG9mIERlY2VtYmVyIDIwMDguCi0jIFRoZSBzZXF1ZW5jZSBvZiBkYXRlcyBvZiB0aGUgVVRDIHNlY29uZCBtYXJrZXJzIHdpbGwgYmU6CQkKLSMKLSMgMjAwOCBEZWNlbWJlciAzMSwgICAgIDIzaCA1OW0gNTlzCi0jIDIwMDggRGVjZW1iZXIgMzEsICAgICAyM2ggNTltIDYwcwotIyAyMDA5IEphbnVhcnkgICAxLCAgICAgIDBoICAwbSAgMHMKLSMKLSMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBVVEMgYW5kIHRoZSBJbnRlcm5hdGlvbmFsIEF0b21pYyBUaW1lIFRBSSBpczoKLSMKLSMgZnJvbSAyMDA2IEphbnVhcnkgMSwgMGggVVRDLCB0byAyMDA5IEphbnVhcnkgMSAgMGggVVRDICA6IFVUQy1UQUkgPSAtIDMzcwotIyBmcm9tIDIwMDkgSmFudWFyeSAxLCAwaCBVVEMsIHVudGlsIGZ1cnRoZXIgbm90aWNlICAgICAgIDogVVRDLVRBSSA9IC0gMzRzCi0jCi0jIExlYXAgc2Vjb25kcyBjYW4gYmUgaW50cm9kdWNlZCBpbiBVVEMgYXQgdGhlIGVuZCBvZiB0aGUgbW9udGhzIG9mIERlY2VtYmVyCi0jIG9yIEp1bmUsIGRlcGVuZGluZyBvbiB0aGUgZXZvbHV0aW9uIG9mIFVUMS1UQUkuIEJ1bGxldGluIEMgaXMgbWFpbGVkIGV2ZXJ5Ci0jIHNpeCBtb250aHMsIGVpdGhlciB0byBhbm5vdW5jZSBhIHRpbWUgc3RlcCBpbiBVVEMgb3IgdG8gY29uZmlybSB0aGF0IHRoZXJlCi0jIHdpbGwgYmUgbm8gdGltZSBzdGVwIGF0IHRoZSBuZXh0IHBvc3NpYmxlIGRhdGUuCi0jCi0jIERhbmllbCBHQU1CSVMKLSMgSGVhZAkJCi0jIEVhcnRoIE9yaWVudGF0aW9uIENlbnRlciBvZiBJRVJTCi0jIE9ic2VydmF0b2lyZSBkZSBQYXJpcywgRnJhbmNlCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9ub3J0aGFtZXJpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDA4aC9ub3J0aGFtZXJpY2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YjMzM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvbm9ydGhhbWVyaWNhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1MSArMCwwIEBACi0jIEAoIylub3J0aGFtZXJpY2EJOC4yNAotIyA8cHJlPgotCi0jIGFsc28gaW5jbHVkZXMgQ2VudHJhbCBBbWVyaWNhIGFuZCB0aGUgQ2FyaWJiZWFuCi0KLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCi0jIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KLSMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjIpOgotIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKLSMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBVbml0ZWQgU3RhdGVzCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wMy0zMSk6Ci0jIEhvd3NlIHdyaXRlcyAocHAgMTIxLTEyNSkgdGhhdCB0aW1lIHpvbmVzIHdlcmUgaW52ZW50ZWQgYnkKLSMgUHJvZmVzc29yIENoYXJsZXMgRmVyZGluYW5kIERvd2QgKDE4MjUtMTkwNCksCi0jIFByaW5jaXBhbCBvZiBUZW1wbGUgR3JvdmUgTGFkaWVzJyBTZW1pbmFyeSAoU2FyYXRvZ2EgU3ByaW5ncywgTlkpLgotIyBIaXMgcGFtcGhsZXQgYGBBIFN5c3RlbSBvZiBOYXRpb25hbCBUaW1lIGZvciBSYWlscm9hZHMnJyAoMTg3MCkKLSMgd2FzIHRoZSByZXN1bHQgb2YgaGlzIHByb3Bvc2FscyBhdCB0aGUgQ29udmVudGlvbiBvZiBSYWlscm9hZCBUcnVuayBMaW5lcwotIyBpbiBOZXcgWW9yayBDaXR5ICgxODY5LTEwKS4gIEhpcyAxODcwIHByb3Bvc2FsIHdhcyBiYXNlZCBvbiBXYXNoaW5ndG9uLCBEQywKLSMgYnV0IGluIDE4NzItMDUgaGUgbW92ZWQgdGhlIHByb3Bvc2VkIG9yaWdpbiB0byBHcmVlbndpY2guCi0jIEhpcyBwcm9wb3NhbCB3YXMgYWRvcHRlZCBieSB0aGUgcmFpbHJvYWRzIG9uIDE4ODMtMTEtMTggYXQgMTI6MDAsCi0jIGFuZCB0aGUgbW9zdCBvZiB0aGUgY291bnRyeSBzb29uIGZvbGxvd2VkIHN1aXQuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wNC0xNik6Ci0jIFRoYXQgMTg4MyB0cmFuc2l0aW9uIG9jY3VycmVkIGF0IDEyOjAwIG5ldyB0aW1lLCBub3QgYXQgMTI6MDAgb2xkIHRpbWUuCi0jIFNlZSBwIDQ2IG9mIERhdmlkIFByZXJhdSwgU2VpemUgdGhlIGRheWxpZ2h0LCBUaHVuZGVyJ3MgTW91dGggUHJlc3MgKDIwMDUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIGluIHRoZSBVUyBpcwotIyBUaG9tYXMgRy4gU2hhbmtzLCBUaGUgQW1lcmljYW4gQXRsYXMgKDV0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgxOTkxKS4KLSMgTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBlcnJhdGEgc2hlZXQ7IHRoZSBib29rIGlzIHNvbWV3aGF0IHVzZWxlc3Mgd2l0aG91dCBpdC4KLSMgSXQgaXMgdGhlIHNvdXJjZSBmb3IgbW9zdCBvZiB0aGUgcHJlLTE5OTEgVVMgZW50cmllcyBiZWxvdy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA2KToKLSMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2FzIGZpcnN0IHN1Z2dlc3RlZCBhcyBhIGpva2UgYnkgQmVuamFtaW4gRnJhbmtsaW4KLSMgaW4gaGlzIHdoaW1zaWNhbCBlc3NheSBgYEFuIEVjb25vbWljYWwgUHJvamVjdCBmb3IgRGltaW5pc2hpbmcgdGhlIENvc3QKLSMgb2YgTGlnaHQnJyBwdWJsaXNoZWQgaW4gdGhlIEpvdXJuYWwgZGUgUGFyaXMgKDE3ODQtMDQtMjYpLgotIyBOb3QgZXZlcnlvbmUgaXMgaGFwcHkgd2l0aCB0aGUgcmVzdWx0czoKLSMKLSMJSSBkb24ndCByZWFsbHkgY2FyZSBob3cgdGltZSBpcyByZWNrb25lZCBzbyBsb25nIGFzIHRoZXJlIGlzIHNvbWUKLSMJYWdyZWVtZW50IGFib3V0IGl0LCBidXQgSSBvYmplY3QgdG8gYmVpbmcgdG9sZCB0aGF0IEkgYW0gc2F2aW5nCi0jCWRheWxpZ2h0IHdoZW4gbXkgcmVhc29uIHRlbGxzIG1lIHRoYXQgSSBhbSBkb2luZyBub3RoaW5nIG9mIHRoZSBraW5kLgotIwlJIGV2ZW4gb2JqZWN0IHRvIHRoZSBpbXBsaWNhdGlvbiB0aGF0IEkgYW0gd2FzdGluZyBzb21ldGhpbmcKLSMJdmFsdWFibGUgaWYgSSBzdGF5IGluIGJlZCBhZnRlciB0aGUgc3VuIGhhcyByaXNlbi4gIEFzIGFuIGFkbWlyZXIKLSMJb2YgbW9vbmxpZ2h0IEkgcmVzZW50IHRoZSBib3NzeSBpbnNpc3RlbmNlIG9mIHRob3NlIHdobyB3YW50IHRvCi0jCXJlZHVjZSBteSB0aW1lIGZvciBlbmpveWluZyBpdC4gIEF0IHRoZSBiYWNrIG9mIHRoZSBEYXlsaWdodCBTYXZpbmcKLSMJc2NoZW1lIEkgZGV0ZWN0IHRoZSBib255LCBibHVlLWZpbmdlcmVkIGhhbmQgb2YgUHVyaXRhbmlzbSwgZWFnZXIKLSMJdG8gcHVzaCBwZW9wbGUgaW50byBiZWQgZWFybGllciwgYW5kIGdldCB0aGVtIHVwIGVhcmxpZXIsIHRvIG1ha2UKLSMJdGhlbSBoZWFsdGh5LCB3ZWFsdGh5IGFuZCB3aXNlIGluIHNwaXRlIG9mIHRoZW1zZWx2ZXMuCi0jCi0jCS0tIFJvYmVydHNvbiBEYXZpZXMsIFRoZSBkaWFyeSBvZiBTYW11ZWwgTWFyY2hiYW5rcywKLSMJICAgQ2xhcmtlLCBJcndpbiAoMTk0NyksIFhJWCwgU3VuZGF5Ci0jCi0jIEZvciBtb3JlIGFib3V0IHRoZSBmaXJzdCB0ZW4geWVhcnMgb2YgRFNUIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBzZWUKLSMgUm9iZXJ0IEdhcmxhbmQncyA8YSBocmVmPSJodHRwOi8vd3d3LmNscGdoLm9yZy9leGhpYml0L2RzdC5odG1sIj4KLSMgVGVuIHllYXJzIG9mIGRheWxpZ2h0IHNhdmluZyBmcm9tIHRoZSBQaXR0c2J1cmdoIHN0YW5kcG9pbnQKLSMgKENhcm5lZ2llIExpYnJhcnkgb2YgUGl0dHNidXJnaCwgMTkyNyk8L2E+LgotIwotIyBTaGFua3Mgc2F5cyB0aGF0IERTVCB3YXMgY2FsbGVkICJXYXIgVGltZSIgaW4gdGhlIFVTIGluIDE5MTggYW5kIDE5MTkuCi0jIEhvd2V2ZXIsIERTVCB3YXMgaW1wb3NlZCBieSB0aGUgU3RhbmRhcmQgVGltZSBBY3Qgb2YgMTkxOCwgd2hpY2gKLSMgd2FzIHRoZSBmaXJzdCBuYXRpb253aWRlIGxlZ2FsIHRpbWUgc3RhbmRhcmQsIGFuZCBhcHBhcmVudGx5Ci0jIHRpbWUgd2FzIGp1c3QgY2FsbGVkICJTdGFuZGFyZCBUaW1lIiBvciAiRGF5bGlnaHQgU2F2aW5nIFRpbWUiLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uOgotIyBVUyBEYXlsaWdodCBTYXZpbmcgVGltZSBlbmRlZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgKk9jdG9iZXIqIGluIDE5NzQuCi0jIFNlZSwgZm9yIGV4YW1wbGUsIHRoZSBmcm9udCBwYWdlIG9mIHRoZSBTYXR1cmRheSwgMTk3NC0xMC0yNgotIyBhbmQgU3VuZGF5LCAxOTc0LTEwLTI3IGVkaXRpb25zIG9mIHRoZSBXYXNoaW5ndG9uIFBvc3QuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb246Ci0jIEJlZm9yZSB0aGUgVW5pZm9ybSBUaW1lIEFjdCBvZiAxOTY2IHRvb2sgZWZmZWN0IGluIDE5NjcsIG9ic2VydmFuY2Ugb2YKLSMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgaW4gdGhlIFVTIHdhcyBieSBsb2NhbCBvcHRpb24sIGV4Y2VwdCBkdXJpbmcgd2FydGltZS4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwMC0wOS0yNSk6Ci0jIExhc3QgbmlnaHQgSSBoZWFyZCBwYXJ0IG9mIGEgcmVicm9hZGNhc3Qgb2YgYSAxOTQ1IEFyY2ggT2JvbGVyIHJhZGlvIGRyYW1hLgotIyBJbiB0aGUgaW50cm9kdWN0aW9uLCBPYm9sZXIgc3Bva2Ugb2YgIkVhc3Rlcm4gUGVhY2UgVGltZS4iCi0jIEFuIEFsdGFWaXN0YSBzZWFyY2ggdHVybmVkIHVwCi0jIDxhIGhyZWY9Imh0dHA6Ly9yb3dheXRvbi5vcmcvcmhzL2hzdGF1ZzQ1Lmh0bWwiPjoKLSMgIldoZW4gdGhlIHRpbWUgaXMgYW5ub3VuY2VkIG92ZXIgdGhlIHJhZGlvIG5vdywgaXQgaXMgJ0Vhc3Rlcm4gUGVhY2UKLSMgVGltZScgaW5zdGVhZCBvZiB0aGUgb2xkIGZhbWlsaWFyICdFYXN0ZXJuIFdhciBUaW1lLicgIFBlYWNlIGlzIHdvbmRlcmZ1bC4iCi0jIDwvYT4gKEF1Z3VzdCAxOTQ1KSBieSB3YXkgb2YgY29uZmlybWF0aW9uLgotCi0jIEZyb20gSm9zZXBoIEdhbGxhbnQgY2l0aW5nCi0jIEdlb3JnZSBILiBEb3VnbGFzLCBfVGhlIEVhcmx5IERheXMgb2YgUmFkaW8gQnJvYWRjYXN0aW5nXyAoMTk4Nyk6Ci0jIEF0IDcgUC5NLiAoRWFzdGVybiBXYXIgVGltZSkgW29uIDE5NDUtMDgtMTRdLCB0aGUgbmV0d29ya3Mgd2VyZSBzZXQKLSMgdG8gc3dpdGNoIHRvIExvbmRvbiBmb3IgQXR0bGVlJ3MgYWRkcmVzcywgYnV0IHRoZSBBbWVyaWNhbiBwZW9wbGUKLSMgbmV2ZXIgZ290IHRvIGhlYXIgaGlzIHNwZWVjaCBsaXZlLiBBY2NvcmRpbmcgdG8gb25lIHByZXNzIGFjY291bnQsCi0jIENCUycgQm9iIFRyb3V0IHdhcyBmaXJzdCB0byBhbm5vdW5jZSB0aGUgd29yZCBvZiBKYXBhbidzIHN1cnJlbmRlciwKLSMgYnV0IGEgZmV3IHNlY29uZHMgbGF0ZXIsIE5CQywgQUJDIGFuZCBNdXR1YWwgYWxzbyBmbGFzaGVkIHRoZSB3b3JkCi0jIG9mIHN1cnJlbmRlciwgYWxsIG9mIHdob20gaW50ZXJydXB0aW5nIHRoZSBiZWxscyBvZiBCaWcgQmVuIGluCi0jIExvbmRvbiB3aGljaCB3ZXJlIHRvIHByZWNlZGUgTXIuIEF0dGxlZSdzIHNwZWVjaC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTAyLTA5KTogSXQgd2FzIFJvYmVydCBTdCBKb2huLCBub3QgQm9iIFRyb3V0LiAgRnJvbQotIyBNeXJuYSBPbGl2ZXIncyBvYml0dWFyeSBvZiBTdCBKb2huIG9uIHBhZ2UgQjE2IG9mIHRvZGF5J3MgTG9zIEFuZ2VsZXMgVGltZXM6Ci0jCi0jIC4uLiBhIHdhci13ZWFyeSBVLlMuIGNsdW5nIHRvIHJhZGlvcywgYXdhaXRpbmcgd29yZCBvZiBKYXBhbidzIHN1cnJlbmRlci4KLSMgQW55IGFubm91bmNlbWVudCBmcm9tIEFzaWEgd291bGQgcmVhY2ggU3QuIEpvaG4ncyBOZXcgWW9yayBuZXdzcm9vbSBvbiBhCi0jIHdpcmUgc2VydmljZSB0ZWxldHlwZSBtYWNoaW5lLCB3aGljaCBoYWQgcHJlc2NyaWJlZCBzaWduYWxzIGZvciBtYWpvciBuZXdzLgotIyBBc3NvY2lhdGVkIFByZXNzLCBmb3IgZXhhbXBsZSwgd291bGQgcmluZyBmaXZlIGJlbGxzIGJlZm9yZSBzcGV3aW5nIG91dAotIyB0eXBlZCBjb3B5IG9mIGFuIGltcG9ydGFudCBzdG9yeSwgYW5kIDEwIGJlbGxzIGZvciBuZXdzICJvZiB0cmFuc2NlbmRlbnRhbAotIyBpbXBvcnRhbmNlLiIKLSMKLSMgT24gQXVnLiAxNCwgc3RhbGxpbmcgd2hpbGUgdGFsa2luZyBzdGVhZGlseSBpbnRvIHRoZSBOQkMgbmV0d29ya3MnIG9wZW4KLSMgbWljcm9waG9uZSwgU3QuIEpvaG4gaGVhcmQgZml2ZSBiZWxscyBhbmQgd2FpdGVkIG9ubHkgdG8gaGVhciBhIHNpeHRoIGJlbGwsCi0jIGJlZm9yZSBhbm5vdW5jaW5nIGNvbmZpZGVudGx5OiAiTGFkaWVzIGFuZCBnZW50bGVtZW4sIFdvcmxkIFdhciBJSSBpcyBvdmVyLgotIyBUaGUgSmFwYW5lc2UgaGF2ZSBhZ3JlZWQgdG8gb3VyIHN1cnJlbmRlciB0ZXJtcy4iCi0jCi0jIEhlIGhhZCBzY29yZWQgYSAyMC1zZWNvbmQgc2Nvb3Agb24gb3RoZXIgYnJvYWRjYXN0ZXJzLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA1LTA4LTIyKToKLSMgUGF1bCBoYXMgYmVlbiBjYXJlZnVsIHRvIHVzZSB0aGUgIlVTIiBydWxlcyBvbmx5IGluIHRob3NlIGxvY2F0aW9ucwotIyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBVbml0ZWQgU3RhdGVzOyB0aGlzIHJlZmxlY3RzIHRoZSByZWFsIHNjb3BlIG9mCi0jIFUuUy4gZ292ZXJubWVudCBhY3Rpb24uICBTbyBldmVuIHRob3VnaCB0aGUgIlVTIiBydWxlcyBoYXZlIGNoYW5nZWQKLSMgaW4gdGhlIGxhdGVzdCByZWxlYXNlLCBvdGhlciBjb3VudHJpZXMgd29uJ3QgYmUgYWZmZWN0ZWQuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVVTCTE5MTgJMTkxOQktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVVTCTE5MTgJMTkxOQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVVTCTE5NDIJb25seQktCUZlYgk5CTI6MDAJMTowMAlXICMgV2FyCi1SdWxlCVVTCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJVVMJMTk0NQlvbmx5CS0JU2VwCTMwCTI6MDAJMAlTCi1SdWxlCVVTCTE5NjcJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVVTCTE5NjcJMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVVTCTE5NzQJb25seQktCUphbgk2CTI6MDAJMTowMAlECi1SdWxlCVVTCTE5NzUJb25seQktCUZlYgkyMwkyOjAwCTE6MDAJRAotUnVsZQlVUwkxOTc2CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlVUwkxOTg3CTIwMDYJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCVVTCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlVUwkyMDA3CW1heAktCU5vdglTdW4+PTEJMjowMAkwCVMKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiwgMjAwNS0xMi0xOQotIyBXZSBnZW5lcmF0ZSB0aGUgZmlsZXMgc3BlY2lmaWVkIGJlbG93IHRvIGd1YXJkIGFnYWluc3Qgb2xkIGZpbGVzIHdpdGgKLSMgb2Jzb2xldGUgaW5mb3JtYXRpb24gYmVpbmcgbGVmdCBpbiB0aGUgdGltZSB6b25lIGJpbmFyeSBkaXJlY3RvcnkuCi0jIFdlIGxpbWl0IHRoZSBsaXN0IHRvIG5hbWVzIHRoYXQgaGF2ZSBhcHBlYXJlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZgotIyB0aGlzIHRpbWUgem9uZSBwYWNrYWdlLgotIyBXZSBkbyB0aGVzZSBhcyBzZXBhcmF0ZSBab25lcyByYXRoZXIgdGhhbiBhcyBMaW5rcyB0byBhdm9pZCBwcm9ibGVtcyBpZgotIyBhIHBhcnRpY3VsYXIgcGxhY2UgY2hhbmdlcyB3aGV0aGVyIGl0IG9ic2VydmVzIERTVC4KLSMgV2UgcHV0IHRoZXNlIHNwZWNpZmljYXRpb25zIGhlcmUgaW4gdGhlIG5vcnRoYW1lcmljYSBmaWxlIGJvdGggdG8KLSMgaW5jcmVhc2UgdGhlIGNoYW5jZXMgdGhhdCB0aGV5J2xsIGFjdHVhbGx5IGdldCBjb21waWxlZCBhbmQgdG8KLSMgYXZvaWQgdGhlIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBVUyBydWxlcyBpbiBhbm90aGVyIGZpbGUuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRVNUCQkgLTU6MDAJLQlFU1QKLVpvbmUJTVNUCQkgLTc6MDAJLQlNU1QKLVpvbmUJSFNUCQktMTA6MDAJLQlIU1QKLVpvbmUJRVNUNUVEVAkJIC01OjAwCVVTCUUlc1QKLVpvbmUJQ1NUNkNEVAkJIC02OjAwCVVTCUMlc1QKLVpvbmUJTVNUN01EVAkJIC03OjAwCVVTCU0lc1QKLVpvbmUJUFNUOFBEVAkJIC04OjAwCVVTCVAlc1QKLQotIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgotIyAuLi5BbGFza2EgKGFuZCBIYXdhaWkpIGhhZCB0aGUgdGltZXpvbmUgbmFtZXMgY2hhbmdlZCBpbiAxOTY3LgotIyAgICBvbGQJCQkgbmV3Ci0jICAgIFBhY2lmaWMgU3RhbmRhcmQgVGltZShQU1QpICAtc2FtZS0KLSMgICAgWXVrb24gU3RhbmRhcmQgVGltZShZU1QpICAgIC1zYW1lLQotIyAgICBDZW50cmFsIEFsYXNrYSBTLlQuIChDQVQpICAgQWxhc2thLUhhd2FpaSBTdFthbl1kYXJkIFRpbWUgKEFIU1QpCi0jICAgIE5vbWUgU3RhbmRhcmQgVGltZSAoTlQpICAgICBCZXJpbmcgU3RhbmRhcmQgVGltZSAoQlNUKQotIwotIyAuLi5BbGFza2EncyB0aW1lem9uZSBsaW5lcyB3ZXJlIHJlZHJhd24gaW4gMTk4MyB0byBnaXZlIG9ubHkgMiB0ei4KLSMgICAgVGhlIFlTVCB6b25lIG5vdyBjb3ZlcnMgbmVhcmx5IGFsbCBvZiB0aGUgc3RhdGUsIEFIU1QganVzdCBwYXJ0Ci0jICAgIG9mIHRoZSBBbGV1dGlhbiBpc2xhbmRzLiAgIE5vIERTVC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTEyLTE5KToKLSMgVGhlIHRhYmxlcyBiZWxvdyB1c2UgYE5TVCcsIG5vdCBgTlQnLCBmb3IgTm9tZSBTdGFuZGFyZCBUaW1lLgotIyBJIGludmVudGVkIGBDQVdUJyBmb3IgQ2VudHJhbCBBbGFza2EgV2FyIFRpbWUuCi0KLSMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OS0wMS0xOSk6Ci0jIFVTQSAgRUFTVEVSTiAgICAgICA1IEggIEJFSElORCBVVEMgICAgTkVXIFlPUkssIFdBU0hJTkdUT04KLSMgVVNBICBFQVNURVJOICAgICAgIDQgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAotIyBVU0EgIENFTlRSQUwgICAgICAgNiBIICBCRUhJTkQgVVRDICAgIENISUNBR08sIEhPVVNUT04KLSMgVVNBICBDRU5UUkFMICAgICAgIDUgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAotIyBVU0EgIE1PVU5UQUlOICAgICAgNyBIICBCRUhJTkQgVVRDICAgIERFTlZFUgotIyBVU0EgIE1PVU5UQUlOICAgICAgNiBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwCi0jIFVTQSAgUEFDSUZJQyAgICAgICA4IEggIEJFSElORCBVVEMgICAgTC5BLiwgU0FOIEZSQU5DSVNDTwotIyBVU0EgIFBBQ0lGSUMgICAgICAgNyBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwCi0jIFVTQSAgQUxBU0tBIFNURCAgICA5IEggIEJFSElORCBVVEMgICAgTU9TVCBPRiBBTEFTS0EgICAgIChBS1NUKQotIyBVU0EgIEFMQVNLQSBTVEQgICAgOCBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwIChBS0RUKQotIyBVU0EgIEFMRVVUSUFOICAgICAxMCBIICBCRUhJTkQgVVRDICAgIElTTEFORFMgV0VTVCBPRiAxNzBXCi0jIFVTQSAgLSAiIC0gICAgICAgICA5IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKLSMgVVNBICBIQVdBSUkgICAgICAgMTAgSCAgQkVISU5EIFVUQwotIyBVU0EgIEJFUklORyAgICAgICAxMSBIICBCRUhJTkQgVVRDICAgIFNBTU9BLCBNSURXQVkKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OS0wMS0yMSk6Ci0jIFRoZSBhYm92ZSBkYXRlcyBhcmUgZm9yIDE5ODguCi0jIE5vdGUgdGhlICJBS1NUIiBhbmQgIkFLRFQiIGFiYnJldmlhdGlvbnMsIHRoZSBjbGFpbSB0aGF0IHRoZXJlJ3MKLSMgbm8gRFNUIGluIFNhbW9hLCBhbmQgdGhlIGNsYWltIHRoYXQgdGhlcmUgaXMgRFNUIGluIEFsYXNrYSBhbmQgdGhlCi0jIEFsZXV0aWFucy4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OC0wMi0xMyk6Ci0jIExlZ2FsIHN0YW5kYXJkIHRpbWUgem9uZSBuYW1lcywgZnJvbSBVbml0ZWQgU3RhdGVzIENvZGUgKDE5ODIgRWRpdGlvbiBhbmQKLSMgU3VwcGxlbWVudCBJSUkpLCBUaXRsZSAxNSwgQ2hhcHRlciA2LCBTZWN0aW9uIDI2MCBhbmQgZm9yd2FyZC4gIEZpcnN0LCBuYW1lcwotIyB1cCB0byAxOTY3LTA0LTAxICh3aGVuIG1vc3QgcHJvdmlzaW9ucyBvZiB0aGUgVW5pZm9ybSBUaW1lIEFjdCBvZiAxOTY2Ci0jIHRvb2sgZWZmZWN0KSwgYXMgZXhwbGFpbmVkIGluIHNlY3Rpb25zIDI2MyBhbmQgMjYxOgotIwkobm9uZSkKLSMJVW5pdGVkIFN0YXRlcyBzdGFuZGFyZCBlYXN0ZXJuIHRpbWUKLSMJVW5pdGVkIFN0YXRlcyBzdGFuZGFyZCBtb3VudGFpbiB0aW1lCi0jCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgY2VudHJhbCB0aW1lCi0jCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgUGFjaWZpYyB0aW1lCi0jCShub25lKQotIwlVbml0ZWQgU3RhdGVzIHN0YW5kYXJkIEFsYXNrYSB0aW1lCi0jCShub25lKQotIyBOZXh0LCBuYW1lcyBmcm9tIDE5NjctMDQtMDEgdW50aWwgMTk4My0xMS0zMCAodGhlIGRhdGUgZm9yCi0jIHB1YmxpYyBsYXcgOTgtMTgxKToKLSMJQXRsYW50aWMgc3RhbmRhcmQgdGltZQotIwllYXN0ZXJuIHN0YW5kYXJkIHRpbWUKLSMJY2VudHJhbCBzdGFuZGFyZCB0aW1lCi0jCW1vdW50YWluIHN0YW5kYXJkIHRpbWUKLSMJUGFjaWZpYyBzdGFuZGFyZCB0aW1lCi0jCVl1a29uIHN0YW5kYXJkIHRpbWUKLSMJQWxhc2thLUhhd2FpaSBzdGFuZGFyZCB0aW1lCi0jCUJlcmluZyBzdGFuZGFyZCB0aW1lCi0jIEFuZCBhZnRlciAxOTgzLTExLTMwOgotIwlBdGxhbnRpYyBzdGFuZGFyZCB0aW1lCi0jCWVhc3Rlcm4gc3RhbmRhcmQgdGltZQotIwljZW50cmFsIHN0YW5kYXJkIHRpbWUKLSMJbW91bnRhaW4gc3RhbmRhcmQgdGltZQotIwlQYWNpZmljIHN0YW5kYXJkIHRpbWUKLSMJQWxhc2thIHN0YW5kYXJkIHRpbWUKLSMJSGF3YWlpLUFsZXV0aWFuIHN0YW5kYXJkIHRpbWUKLSMJU2Ftb2Egc3RhbmRhcmQgdGltZQotIyBUaGUgbGF3IGRvZXNuJ3QgZ2l2ZSBhYmJyZXZpYXRpb25zLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTAxLTA4KSwgZm9sbG93aW5nIGEgaGVhZHMtdXAgZnJvbSBSaXZlcyBNY0RvdzoKLSMgUHVibGljIGxhdyAxMDYtNTY0ICgyMDAwLTEyLTIzKSBpbnRyb2R1Y2VkIHRoZSBhYmJyZXZpYXRpb24KLSMgIkNoYW1vcnJvIFN0YW5kYXJkIFRpbWUiIGZvciB0aW1lIGluIEd1YW0gYW5kIHRoZSBOb3J0aGVybiBNYXJpYW5hcy4KLSMgU2VlIHRoZSBmaWxlICJhdXN0cmFsYXNpYSIuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24sIDIwMDUtMDgtMDkKLSMgVGhlIGZvbGxvd2luZyB3YXMgc2lnbmVkIGludG8gbGF3IG9uIDIwMDUtMDgtMDguCi0jCi0jIEguUi4gNiwgRW5lcmd5IFBvbGljeSBBY3Qgb2YgMjAwNSwgU0VDLiAxMTAuIERBWUxJR0hUIFNBVklOR1MuCi0jICAgKGEpIEFtZW5kbWVudC0gU2VjdGlvbiAzKGEpIG9mIHRoZSBVbmlmb3JtIFRpbWUgQWN0IG9mIDE5NjYgKDE1Ci0jICAgVS5TLkMuIDI2MGEoYSkpIGlzIGFtZW5kZWQtLQotIyAgICAgKDEpIGJ5IHN0cmlraW5nIGBmaXJzdCBTdW5kYXkgb2YgQXByaWwnIGFuZCBpbnNlcnRpbmcgYHNlY29uZAotIyAgICAgU3VuZGF5IG9mIE1hcmNoJzsgYW5kCi0jICAgICAoMikgYnkgc3RyaWtpbmcgYGxhc3QgU3VuZGF5IG9mIE9jdG9iZXInIGFuZCBpbnNlcnRpbmcgYGZpcnN0Ci0jICAgICBTdW5kYXkgb2YgTm92ZW1iZXInLgotIyAgIChiKSBFZmZlY3RpdmUgRGF0ZS0gU3Vic2VjdGlvbiAoYSkgc2hhbGwgdGFrZSBlZmZlY3QgMSB5ZWFyIGFmdGVyIHRoZQotIyAgIGRhdGUgb2YgZW5hY3RtZW50IG9mIHRoaXMgQWN0IG9yIE1hcmNoIDEsIDIwMDcsIHdoaWNoZXZlciBpcyBsYXRlci4KLSMgICAoYykgUmVwb3J0IHRvIENvbmdyZXNzLSBOb3QgbGF0ZXIgdGhhbiA5IG1vbnRocyBhZnRlciB0aGUgZWZmZWN0aXZlCi0jICAgZGF0ZSBzdGF0ZWQgaW4gc3Vic2VjdGlvbiAoYiksIHRoZSBTZWNyZXRhcnkgc2hhbGwgcmVwb3J0IHRvIENvbmdyZXNzCi0jICAgb24gdGhlIGltcGFjdCBvZiB0aGlzIHNlY3Rpb24gb24gZW5lcmd5IGNvbnN1bXB0aW9uIGluIHRoZSBVbml0ZWQKLSMgICBTdGF0ZXMuCi0jICAgKGQpIFJpZ2h0IHRvIFJldmVydC0gQ29uZ3Jlc3MgcmV0YWlucyB0aGUgcmlnaHQgdG8gcmV2ZXJ0IHRoZQotIyAgIERheWxpZ2h0IFNhdmluZyBUaW1lIGJhY2sgdG8gdGhlIDIwMDUgdGltZSBzY2hlZHVsZXMgb25jZSB0aGUKLSMgICBEZXBhcnRtZW50IHN0dWR5IGlzIGNvbXBsZXRlLgotCi0jIFVTIGVhc3Rlcm4gdGltZSwgcmVwcmVzZW50ZWQgYnkgTmV3IFlvcmsKLQotIyBDb25uZWN0aWN1dCwgRGVsYXdhcmUsIERpc3RyaWN0IG9mIENvbHVtYmlhLCBtb3N0IG9mIEZsb3JpZGEsCi0jIEdlb3JnaWEsIHNvdXRoZWFzdCBJbmRpYW5hIChEZWFyYm9ybiBhbmQgT2hpbyBjb3VudGllcyksIGVhc3Rlcm4gS2VudHVja3kKLSMgKGV4Y2VwdCBBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUgYmVsb3cpLCBNYWluZSwgTWFyeWxhbmQsIE1hc3NhY2h1c2V0dHMsCi0jIE5ldyBIYW1wc2hpcmUsIE5ldyBKZXJzZXksIE5ldyBZb3JrLCBOb3J0aCBDYXJvbGluYSwgT2hpbywKLSMgUGVubnN5bHZhbmlhLCBSaG9kZSBJc2xhbmQsIFNvdXRoIENhcm9saW5hLCBlYXN0ZXJuIFRlbm5lc3NlZSwKLSMgVmVybW9udCwgVmlyZ2luaWEsIFdlc3QgVmlyZ2luaWEKLQotIyBGcm9tIERhdmUgQ2FudG9yICgyMDA0LTExLTAyKToKLSMgRWFybHkgdGhpcyBzdW1tZXIgSSBoYWQgdGhlIG9jY2FzaW9uIHRvIHZpc2l0IHRoZSBNb3VudCBXYXNoaW5ndG9uCi0jIE9ic2VydmF0b3J5IHdlYXRoZXIgc3RhdGlvbiBhdG9wIChvZiBjb3Vyc2UhKSBNb3VudCBXYXNoaW5ndG9uIFssIE5IXS4uLi4KLSMgT25lIG9mIHRoZSBzdGFmZiBtZW1iZXJzIHNhaWQgdGhhdCB0aGUgc3RhdGlvbiB3YXMgb24gRWFzdGVybiBTdGFuZGFyZCBUaW1lCi0jIGFuZCBkaWRuJ3QgY2hhbmdlIHRoZWlyIGNsb2NrcyBmb3IgRGF5bGlnaHQgU2F2aW5nIC4uLiBzbyB0aGF0IHRoZWlyCi0jIHJlcG9ydHMgd2lsbCBhbHdheXMgaGF2ZSB0aW1lcyB3aGljaCBhcmUgNSBob3VycyBiZWhpbmQgVVRDLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDgtMjYpOgotIyBBY2NvcmRpbmcgdG8gdG9kYXkncyBIdW50c3ZpbGxlIFRpbWVzCi0jIDxodHRwOi8vd3d3LmFsLmNvbS9uZXdzL2h1bnRzdmlsbGV0aW1lcy9pbmRleC5zc2Y/L2Jhc2UvbmV3cy8xMTI1MDQ3NzgzMjI4MzIwLnhtbCZjb2xsPTE+Ci0jIGEgZmV3IHRvd25zIG9uIEFsYWJhbWEncyAiZWFzdGVybiBib3JkZXIgd2l0aCBHZW9yZ2lhLCBzdWNoIGFzIFBoZW5peCBDaXR5Ci0jIGluIFJ1c3NlbGwgQ291bnR5LCBMYW5ldHQgaW4gQ2hhbWJlcnMgQ291bnR5IGFuZCBzb21lIHRvd25zIGluIExlZSBDb3VudHksCi0jIHNldCB0aGVpciB3YXRjaGVzIGFuZCBjbG9ja3Mgb24gRWFzdGVybiB0aW1lLiIgIEl0IHF1b3RlcyBILkguICJCdWJiYSIKLSMgUm9iZXJ0cywgY2l0eSBhZG1pbmlzdHJhdG9yIGluIFBoZW5peCBDaXR5LiBhcyBzYXlpbmcgIldlIGFyZSBpbiB0aGUgQ2VudHJhbAotIyB0aW1lIHpvbmUsIGJ1dCB3ZSBkbyBnbyBieSB0aGUgRWFzdGVybiB0aW1lIHpvbmUgYmVjYXVzZSBzbyBtYW55IHBlb3BsZSB3b3JrCi0jIGluIENvbHVtYnVzLiIKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCU5ZQwkxOTIwCW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlOWUMJMTkyMAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTllDCTE5MjEJMTk2NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU5ZQwkxOTIxCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlOWUMJMTk1NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9OZXdfWW9yawktNDo1NjowMiAtCUxNVAkxODgzIE5vdiAxOCAxMjowMzo1OAotCQkJLTU6MDAJVVMJRSVzVAkxOTIwCi0JCQktNTowMAlOWUMJRSVzVAkxOTQyCi0JCQktNTowMAlVUwlFJXNUCTE5NDYKLQkJCS01OjAwCU5ZQwlFJXNUCTE5NjcKLQkJCS01OjAwCVVTCUUlc1QKLQotIyBVUyBjZW50cmFsIHRpbWUsIHJlcHJlc2VudGVkIGJ5IENoaWNhZ28KLQotIyBBbGFiYW1hLCBBcmthbnNhcywgRmxvcmlkYSBwYW5oYW5kbGUgKEJheSwgQ2FsaG91biwgRXNjYW1iaWEsCi0jIEd1bGYsIEhvbG1lcywgSmFja3NvbiwgT2thbG9vc2EsIFNhbnRhIFJvc2EsIFdhbHRvbiwgYW5kCi0jIFdhc2hpbmd0b24gY291bnRpZXMpLCBJbGxpbm9pcywgd2VzdGVybiBJbmRpYW5hCi0jIChHaWJzb24sIEphc3BlciwgTGFrZSwgTGFQb3J0ZSwgTmV3dG9uLCBQb3J0ZXIsIFBvc2V5LCBTcGVuY2VyLAotIyBWYW5kZXJidXJnaCwgYW5kIFdhcnJpY2sgY291bnRpZXMpLCBJb3dhLCBtb3N0IG9mIEthbnNhcywgd2VzdGVybgotIyBLZW50dWNreSwgTG91aXNpYW5hLCBNaW5uZXNvdGEsIE1pc3Npc3NpcHBpLCBNaXNzb3VyaSwgZWFzdGVybgotIyBOZWJyYXNrYSwgZWFzdGVybiBOb3J0aCBEYWtvdGEsIE9rbGFob21hLCBlYXN0ZXJuIFNvdXRoIERha290YSwKLSMgd2VzdGVybiBUZW5uZXNzZWUsIG1vc3Qgb2YgVGV4YXMsIFdpc2NvbnNpbgotCi0jIEZyb20gTGFycnkgTS4gU21pdGggKDIwMDYtMDQtMjYpIHJlIFdpc2NvbnNpbjoKLSMgaHR0cDovL3d3dy5sZWdpcy5zdGF0ZS53aS51cy9zdGF0dXRlcy9TdGF0MDE3NS5wZGYgLi4uCi0jIGlzIGN1cnJlbnRseSBlbmZvcmNlZCBhdCB0aGUgMDE6MDAgdGltZSBvZiBjaGFuZ2UuICBCZWNhdXNlIHRoZSBsb2NhbAotIyAiYmFyIHRpbWUiIGluIHRoZSBzdGF0ZSBjb3JyZXNwb25kcyB0byAwMjowMCwgYSBudW1iZXIgb2YgY2l0YXRpb25zCi0jIGFyZSBpc3N1ZWQgZm9yIHRoZSAic2FsZSBvZiBjbGFzcyAnQicgYWxjb2hvbCBhZnRlciBwcm9oaWJpdGVkCi0jIGhvdXJzIiB3aXRoaW4gdGhlIGRldmlhdGVkIGhvdXIgb2YgdGhpcyBjaGFuZ2UgZXZlcnkgeWVhci4uLi4KLSMKLSMgRnJvbSBEb3VnbGFzIFIuIEJvbWJlcmcgKDIwMDctMDMtMTIpOgotIyBXaXNjb25zaW4gaGFzIGVuYWN0ZWQgKG5lYXJseSBlbGV2ZW50aC1ob3VyKSBsZWdpc2xhdGlvbiB0byBnZXQgV0kKLSMgU3RhdHVlIDE3NSBjbG9zZXIgaW4gc3luY2ggd2l0aCB0aGUgVVMgQ29uZ3Jlc3MnIGludGVudC4uLi4KLSMgaHR0cDovL3d3dy5sZWdpcy5zdGF0ZS53aS51cy8yMDA3L2RhdGEvYWN0cy8wN0FjdDMucGRmCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlDaGljYWdvCTE5MjAJb25seQktCUp1bgkxMwkyOjAwCTE6MDAJRAotUnVsZQlDaGljYWdvCTE5MjAJMTkyMQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUNoaWNhZ28JMTkyMQlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJQ2hpY2FnbwkxOTIyCTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlDaGljYWdvCTE5MjIJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUNoaWNhZ28JMTk1NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9DaGljYWdvCS01OjUwOjM2IC0JTE1UCTE4ODMgTm92IDE4IDEyOjA5OjI0Ci0JCQktNjowMAlVUwlDJXNUCTE5MjAKLQkJCS02OjAwCUNoaWNhZ28JQyVzVAkxOTM2IE1hciAgMSAyOjAwCi0JCQktNTowMAktCUVTVAkxOTM2IE5vdiAxNSAyOjAwCi0JCQktNjowMAlDaGljYWdvCUMlc1QJMTk0MgotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMAlDaGljYWdvCUMlc1QJMTk2NwotCQkJLTY6MDAJVVMJQyVzVAotIyBPbGl2ZXIgQ291bnR5LCBORCBzd2l0Y2hlZCBmcm9tIG1vdW50YWluIHRvIGNlbnRyYWwgdGltZSBvbiAxOTkyLTEwLTI1LgotWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIgLTY6NDU6MTIgLSBMTVQJMTg4MyBOb3YgMTggMTI6MTQ6NDgKLQkJCS03OjAwCVVTCU0lc1QJMTk5MiBPY3QgMjUgMDI6MDAKLQkJCS02OjAwCVVTCUMlc1QKLSMgTW9ydG9uIENvdW50eSwgTkQsIHN3aXRjaGVkIGZyb20gbW91bnRhaW4gdG8gY2VudHJhbCB0aW1lIG9uCi0jIDIwMDMtMTAtMjYsIGV4Y2VwdCBmb3IgdGhlIGFyZWEgYXJvdW5kIE1hbmRhbiB3aGljaCB3YXMgYWxyZWFkeSBjZW50cmFsIHRpbWUuCi0jIFNlZSA8aHR0cDovL2Rtc2VzLmRvdC5nb3YvZG9jaW1hZ2VzL3A2My8xMzU4MTgucGRmPi4KLSMgT2ZmaWNpYWxseSB0aGlzIHN3aXRjaCBhbHNvIGluY2x1ZGVkIHBhcnQgb2YgU2lvdXggQ291bnR5LCBhbmQKLSMgSm9uZXMsIE1lbGxldHRlLCBhbmQgVG9kZCBDb3VudGllcyBpbiBTb3V0aCBEYWtvdGE7Ci0jIGJ1dCBpbiBwcmFjdGljZSB0aGVzZSBvdGhlciBjb3VudGllcyB3ZXJlIGFscmVhZHkgb2JzZXJ2aW5nIGNlbnRyYWwgdGltZS4KLSMgU2VlIDxodHRwOi8vd3d3LmVwYS5nb3YvZmVkcmdzdHIvRVBBLUlNUEFDVC8yMDAzL09jdG9iZXIvRGF5LTI4L2kyNzA1Ni5odG0+LgotWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0gLTY6NDU6MzkgLSBMTVQgMTg4MyBOb3YgMTggMTI6MTQ6MjEKLQkJCS03OjAwCVVTCU0lc1QJMjAwMyBPY3QgMjYgMDI6MDAKLQkJCS02OjAwCVVTCUMlc1QKLQotIyBVUyBtb3VudGFpbiB0aW1lLCByZXByZXNlbnRlZCBieSBEZW52ZXIKLSMKLSMgQ29sb3JhZG8sIGZhciB3ZXN0ZXJuIEthbnNhcywgTW9udGFuYSwgd2VzdGVybgotIyBOZWJyYXNrYSwgTmV2YWRhIGJvcmRlciAoSmFja3BvdCwgT3d5aGVlLCBhbmQgTW91bnRhaW4gQ2l0eSksCi0jIE5ldyBNZXhpY28sIHNvdXRod2VzdGVybiBOb3J0aCBEYWtvdGEsCi0jIHdlc3Rlcm4gU291dGggRGFrb3RhLCBmYXIgd2VzdGVybiBUZXhhcyAoRWwgUGFzbyBDb3VudHksIEh1ZHNwZXRoIENvdW50eSwKLSMgYW5kIFBpbmUgU3ByaW5ncyBhbmQgTmlja2VsIENyZWVrIGluIEN1bGJlcnNvbiBDb3VudHkpLCBVdGFoLCBXeW9taW5nCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJRGVudmVyCTE5MjAJMTkyMQktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCURlbnZlcgkxOTIwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlEZW52ZXIJMTkyMQlvbmx5CS0JTWF5CTIyCTI6MDAJMAlTCi1SdWxlCURlbnZlcgkxOTY1CTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlEZW52ZXIJMTk2NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9EZW52ZXIJLTY6NTk6NTYgLQlMTVQJMTg4MyBOb3YgMTggMTI6MDA6MDQKLQkJCS03OjAwCVVTCU0lc1QJMTkyMAotCQkJLTc6MDAJRGVudmVyCU0lc1QJMTk0MgotCQkJLTc6MDAJVVMJTSVzVAkxOTQ2Ci0JCQktNzowMAlEZW52ZXIJTSVzVAkxOTY3Ci0JCQktNzowMAlVUwlNJXNUCi0KLSMgVVMgUGFjaWZpYyB0aW1lLCByZXByZXNlbnRlZCBieSBMb3MgQW5nZWxlcwotIwotIyBDYWxpZm9ybmlhLCBub3J0aGVybiBJZGFobyAoQmVuZXdhaCwgQm9ubmVyLCBCb3VuZGFyeSwgQ2xlYXJ3YXRlciwKLSMgSWRhaG8sIEtvb3RlbmFpLCBMYXRhaCwgTGV3aXMsIE5leiBQZXJjZSwgYW5kIFNob3Nob25lIGNvdW50aWVzLAotIyBhbmQgdGhlIG5vcnRoZXJuIHRocmVlLXF1YXJ0ZXJzIG9mIElkYWhvIGNvdW50eSksCi0jIG1vc3Qgb2YgTmV2YWRhLCBtb3N0IG9mIE9yZWdvbiwgYW5kIFdhc2hpbmd0b24KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlDQQkxOTQ4CW9ubHkJLQlNYXIJMTQJMjowMAkxOjAwCUQKLVJ1bGUJQ0EJMTk0OQlvbmx5CS0JSmFuCSAxCTI6MDAJMAlTCi1SdWxlCUNBCTE5NTAJMTk2NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUNBCTE5NTAJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUNBCTE5NjIJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTG9zX0FuZ2VsZXMgLTc6NTI6NTggLQlMTVQJMTg4MyBOb3YgMTggMTI6MDc6MDIKLQkJCS04OjAwCVVTCVAlc1QJMTk0NgotCQkJLTg6MDAJQ0EJUCVzVAkxOTY3Ci0JCQktODowMAlVUwlQJXNUCi0KLSMgQWxhc2thCi0jIEFLJXNUIGlzIHRoZSBtb2Rlcm4gYWJicmV2aWF0aW9uIGZvciAtOTowMCBwZXIgVVNOTy4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0zMCk6Ci0jIEhvd3NlIHdyaXRlcyB0aGF0IEFsYXNrYSBzd2l0Y2hlZCBmcm9tIHRoZSBKdWxpYW4gdG8gdGhlIEdyZWdvcmlhbiBjYWxlbmRhciwKLSMgYW5kIGZyb20gZWFzdC1vZi1HTVQgdG8gd2VzdC1vZi1HTVQgZGF5cywgd2hlbiB0aGUgVVMgYm91Z2h0IGl0IGZyb20gUnVzc2lhLgotIyBUaGlzIHdhcyBvbiAxODY3LTEwLTE4LCBhIEZyaWRheTsgdGhlIHByZXZpb3VzIGRheSB3YXMgMTg2Ny0xMC0wNiBKdWxpYW4sCi0jIGFsc28gYSBGcmlkYXkuICBJbmNsdWRlIG9ubHkgdGhlIHRpbWUgem9uZSBwYXJ0IG9mIHRoaXMgdHJhbnNpdGlvbiwKLSMgaWdub3JpbmcgdGhlIHN3aXRjaCBmcm9tIEp1bGlhbiB0byBHcmVnb3JpYW4sIHNpbmNlIHdlIGNhbid0IHJlcHJlc2VudAotIyB0aGUgSnVsaWFuIGNhbGVuZGFyLgotIwotIyBBcyBmYXIgYXMgd2Uga25vdywgbm9uZSBvZiB0aGUgZXhhY3QgbG9jYXRpb25zIG1lbnRpb25lZCBiZWxvdyB3ZXJlCi0jIHBlcm1hbmVudGx5IGluaGFiaXRlZCBpbiAxODY3IGJ5IGFueW9uZSB1c2luZyBlaXRoZXIgY2FsZW5kYXIuCi0jIChZYWt1dGF0IHdhcyBjb2xvbml6ZWQgYnkgdGhlIFJ1c3NpYW5zIGluIDE3OTksIGJ1dCB0aGUgc2V0dGxlbWVudAotIyB3YXMgZGVzdHJveWVkIGluIDE4MDUgYnkgYSBZYWt1dGF0LWtvbiB3YXIgcGFydHkuKSAgSG93ZXZlciwgdGhlcmUKLSMgd2VyZSBuZWFyYnkgaW5oYWJpdGFudHMgaW4gc29tZSBjYXNlcyBhbmQgZm9yIG91ciBwdXJwb3NlcyBwZXJoYXBzCi0jIGl0J3MgYmVzdCB0byBzaW1wbHkgdXNlIHRoZSBvZmZpY2lhbCB0cmFuc2l0aW9uLgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0p1bmVhdQkgMTU6MDI6MTkgLQlMTVQJMTg2NyBPY3QgMTgKLQkJCSAtODo1Nzo0MSAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAotCQkJIC04OjAwCS0JUFNUCTE5NDIKLQkJCSAtODowMAlVUwlQJXNUCTE5NDYKLQkJCSAtODowMAktCVBTVAkxOTY5Ci0JCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAyOjAwCi0JCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAotCQkJIC05OjAwCVVTCUFLJXNUCi1ab25lIEFtZXJpY2EvWWFrdXRhdAkgMTQ6NDE6MDUgLQlMTVQJMTg2NyBPY3QgMTgKLQkJCSAtOToxODo1NSAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAotCQkJIC05OjAwCS0JWVNUCTE5NDIKLQkJCSAtOTowMAlVUwlZJXNUCTE5NDYKLQkJCSAtOTowMAktCVlTVAkxOTY5Ci0JCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAotCQkJIC05OjAwCVVTCUFLJXNUCi1ab25lIEFtZXJpY2EvQW5jaG9yYWdlCSAxNDowMDoyNCAtCUxNVAkxODY3IE9jdCAxOAotCQkJIC05OjU5OjM2IC0JTE1UCTE5MDAgQXVnIDIwIDEyOjAwCi0JCQktMTA6MDAJLQlDQVQJMTk0MgotCQkJLTEwOjAwCVVTCUNBVC9DQVdUIDE5NDUgQXVnIDE0IDIzOjAwdQotCQkJLTEwOjAwCVVTCUNBVC9DQVBUIDE5NDYgIyBQZWFjZQotCQkJLTEwOjAwCS0JQ0FUCTE5NjcgQXByCi0JCQktMTA6MDAJLQlBSFNUCTE5NjkKLQkJCS0xMDowMAlVUwlBSCVzVAkxOTgzIE9jdCAzMCAyOjAwCi0JCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAotCQkJIC05OjAwCVVTCUFLJXNUCi1ab25lIEFtZXJpY2EvTm9tZQkgMTI6NTg6MjEgLQlMTVQJMTg2NyBPY3QgMTgKLQkJCS0xMTowMTozOCAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAotCQkJLTExOjAwCS0JTlNUCTE5NDIKLQkJCS0xMTowMAlVUwlOJXNUCTE5NDYKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgotCQkJLTExOjAwCS0JQlNUCTE5NjkKLQkJCS0xMTowMAlVUwlCJXNUCTE5ODMgT2N0IDMwIDI6MDAKLQkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCi0JCQkgLTk6MDAJVVMJQUslc1QKLVpvbmUgQW1lcmljYS9BZGFrCSAxMjoxMzoyMSAtCUxNVAkxODY3IE9jdCAxOAotCQkJLTExOjQ2OjM4IC0JTE1UCTE5MDAgQXVnIDIwIDEyOjAwCi0JCQktMTE6MDAJLQlOU1QJMTk0MgotCQkJLTExOjAwCVVTCU4lc1QJMTk0NgotCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCi0JCQktMTE6MDAJLQlCU1QJMTk2OQotCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgMjowMAotCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgTm92IDMwCi0JCQktMTA6MDAJVVMJSEElc1QKLSMgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBkb24ndCBxdWl0ZSBtYWtlIG91ciAxOTcwIGN1dG9mZi4KLSMKLSMgU2hhbmtzIHdyaXRlcyB0aGF0IHBhcnQgb2Ygc291dGh3ZXN0IEFsYXNrYSAoZS5nLiBBbmlhaykKLSMgc3dpdGNoZWQgZnJvbSAtMTE6MDAgdG8gLTEwOjAwIG9uIDE5NjgtMDktMjIgYXQgMDI6MDAsCi0jIGFuZCBhbm90aGVyIHBhcnQgKGUuZy4gQWtpYWspIG1hZGUgdGhlIHNhbWUgc3dpdGNoIGZpdmUgd2Vla3MgbGF0ZXIuCi0jCi0jIEZyb20gRGF2aWQgRmxhdGVyICgyMDA0LTExLTA5KToKLSMgSW4gZS1tYWlsLCAyMDA0LTExLTAyLCBSYXkgSHVkc29uLCBoaXN0b3JpYW4vbGlhaXNvbiB0byB0aGUgVW5hbGFza2EKLSMgSGlzdG9yaWMgUHJlc2VydmF0aW9uIENvbW1pc3Npb24sIHByb3ZpZGVkIHRoaXMgaW5mb3JtYXRpb24sIHdoaWNoCi0jIHN1Z2dlc3RzIHRoYXQgVW5hbGFza2EgZGV2aWF0ZWQgZnJvbSBzdGF0dXRvcnkgdGltZSBmcm9tIGVhcmx5IDE5NjcKLSMgcG9zc2libHkgdW50aWwgMTk4MzoKLSMKLSMgIE1pbnV0ZXMgb2YgdGhlIFVuYWxhc2thIENpdHkgQ291bmNpbCBNZWV0aW5nLCBKYW51YXJ5IDEwLCAxOTY3OgotIyAgIkV4Y2VwdCBmb3IgU3QuIFBhdWwgYW5kIEFrdXRhbiwgVW5hbGFza2EgaXMgdGhlIG9ubHkgaW1wb3J0YW50Ci0jICBsb2NhdGlvbiBub3Qgb24gQWxhc2thIFN0YW5kYXJkIFRpbWUuICBUaGUgZm9sbG93aW5nIHJlc29sdXRpb24gd2FzCi0jICBtYWRlIGJ5IFdpbGxpYW0gUm9iaW5zb24gYW5kIHNlY29uZGVkIGJ5IEhlbnJ5IFN3YW5zb246ICBCZSBpdAotIyAgcmVzb2x2ZWQgdGhhdCB0aGUgQ2l0eSBvZiBVbmFsYXNrYSBoZXJlYnkgZ29lcyB0byBBbGFza2EgU3RhbmRhcmQKLSMgIFRpbWUgYXMgb2YgbWlkbmlnaHQgRnJpZGF5LCBKYW51YXJ5IDEzLCAxOTY3ICgxIEEuTS4gU2F0dXJkYXksCi0jICBKYW51YXJ5IDE0LCBBbGFza2EgU3RhbmRhcmQgVGltZS4pICBUaGlzIHJlc29sdXRpb24gd2FzIHBhc3NlZCB3aXRoCi0jICB0aHJlZSB2b3RlcyBmb3IgYW5kIG9uZSBhZ2FpbnN0LiIKLQotIyBIYXdhaWkKLSMKLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb246Ci0jIEFuZCB0aGVuIHRoZXJlJ3MgSGF3YWlpLgotIyBEU1Qgd2FzIG9ic2VydmVkIGZvciBvbmUgZGF5IGluIDE5MzM7Ci0jIHN0YW5kYXJkIHRpbWUgd2FzIGNoYW5nZWQgYnkgaGFsZiBhbiBob3VyIGluIDE5NDc7Ci0jIGl0J3MgYWx3YXlzIHN0YW5kYXJkIGFzIG9mIDE5ODYuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQ6Ci0jIFNoYW5rcyBzYXlzIHRoZSAxOTMzIGV4cGVyaW1lbnQgbGFzdGVkIGZvciB0aHJlZSB3ZWVrcy4gIEdvIHdpdGggU2hhbmtzLgotIwotWm9uZSBQYWNpZmljL0hvbm9sdWx1CS0xMDozMToyNiAtCUxNVAkxOTAwIEphbiAgMSAxMjowMAotCQkJLTEwOjMwCS0JSFNUCTE5MzMgQXByIDMwIDI6MDAKLQkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAyOjAwCi0JCQktMTA6MzAJVVMJSCVzVAkxOTQ3IEp1biAgOCAyOjAwCi0JCQktMTA6MDAJLQlIU1QKLQotIyBOb3cgd2UgdHVybiB0byBVUyBhcmVhcyB0aGF0IGhhdmUgZGl2ZXJnZWQgZnJvbSB0aGUgY29uc2Vuc3VzIHNpbmNlIDE5NzAuCi0KLSMgQXJpem9uYSBtb3N0bHkgdXNlcyBNU1QuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0xMC0yMCk6Ci0jCi0jIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzdCBvZiB0aGlzIHBhcmFncmFwaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGxhcHIubGliLmF6LnVzL2xpbmtzL2RheWxpZ2h0Lmh0bSI+Ci0jIERheWxpZ2h0IFNhdmluZyBUaW1lIHdlYiBwYWdlICgyMDAyLTAxLTIzKTwvYT4gbWFpbnRhaW5lZCBieSB0aGUKLSMgQXJpem9uYSBTdGF0ZSBMaWJyYXJ5LCBBcmNoaXZlcyBhbmQgUHVibGljIFJlY29yZHMuCi0jIEJldHdlZW4gMTk0NC0wMS0wMSBhbmQgMTk0NC0wNC0wMSB0aGUgU3RhdGUgb2YgQXJpem9uYSB1c2VkIHN0YW5kYXJkCi0jIHRpbWUsIGJ1dCBieSBmZWRlcmFsIGxhdyByYWlscm9hZHMsIGFpcmxpbmVzLCBidXMgbGluZXMsIG1pbGl0YXJ5Ci0jIHBlcnNvbm5lbCwgYW5kIHNvbWUgZW5nYWdlZCBpbiBpbnRlcnN0YXRlIGNvbW1lcmNlIGNvbnRpbnVlZCB0bwotIyBvYnNlcnZlIHdhciAoaS5lLiwgZGF5bGlnaHQgc2F2aW5nKSB0aW1lLiAgVGhlIDE5NDQtMDMtMTcgUGhvZW5peAotIyBHYXpldHRlIHNheXMgdGhhdCB3YXMgdGhlIGRhdGUgdGhlIGxhdyBjaGFuZ2VkLCBhbmQgdGhhdCAwNC0wMSB3YXMKLSMgdGhlIGRhdGUgdGhlIHN0YXRlJ3MgY2xvY2tzIHdvdWxkIGNoYW5nZS4gIEluIDE5NDUgdGhlIFN0YXRlIG9mCi0jIEFyaXpvbmEgdXNlZCBzdGFuZGFyZCB0aW1lIGFsbCB5ZWFyLCBhZ2FpbiB3aXRoIGV4Y2VwdGlvbnMgb25seSBhcwotIyBtYW5kYXRlZCBieSBmZWRlcmFsIGxhdy4gIEFyaXpvbmEgb2JzZXJ2ZWQgRFNUIGluIDE5NjcsIGJ1dCBBcml6b25hCi0jIExhd3MgMTk2OCwgY2guIDE4MyAoZWZmZWN0aXZlIDE5NjgtMDMtMjEpIHJlcGVhbGVkIERTVC4KLSMKLSMgU2hhbmtzIHNheXMgdGhlIDE5NDQgZXhwZXJpbWVudCBjYW1lIHRvIGFuIGVuZCBvbiAxOTQ0LTAzLTE3LgotIyBHbyB3aXRoIHRoZSBBcml6b25hIFN0YXRlIExpYnJhcnkgaW5zdGVhZC4KLQotWm9uZSBBbWVyaWNhL1Bob2VuaXgJLTc6Mjg6MTggLQlMTVQJMTg4MyBOb3YgMTggMTE6MzE6NDIKLQkJCS03OjAwCVVTCU0lc1QJMTk0NCBKYW4gIDEgMDA6MDEKLQkJCS03OjAwCS0JTVNUCTE5NDQgQXByICAxIDAwOjAxCi0JCQktNzowMAlVUwlNJXNUCTE5NDQgT2N0ICAxIDAwOjAxCi0JCQktNzowMAktCU1TVAkxOTY3Ci0JCQktNzowMAlVUwlNJXNUCTE5NjggTWFyIDIxCi0JCQktNzowMAktCU1TVAotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OC0wMi0xMyk6Ci0jIEEgd3JpdGVyIGZyb20gdGhlIEludGVyIFRyaWJhbCBDb3VuY2lsIG9mIEFyaXpvbmEsIEluYy4sCi0jIG5vdGVzIGluIHByaXZhdGUgY29ycmVzcG9uZGVuY2UgZGF0ZWQgMTk4Ny0xMi0yOCB0aGF0ICJQcmVzZW50bHksIG9ubHkgdGhlCi0jIE5hdmFqbyBOYXRpb24gcGFydGljaXBhdGVzIGluIHRoZSBEYXlsaWdodCBTYXZpbmcgVGltZSBwb2xpY3ksIGR1ZSB0byBpdHMKLSMgbGFyZ2Ugc2l6ZSBhbmQgbG9jYXRpb24gaW4gdGhyZWUgc3RhdGVzLiIgIChUaGUgIm9ubHkiIG1lYW5zIHRoYXQgb3RoZXIKLSMgdHJpYmFsIG5hdGlvbnMgZG9uJ3QgdXNlIERTVC4pCi0KLUxpbmsgQW1lcmljYS9EZW52ZXIgQW1lcmljYS9TaGlwcm9jawotCi0jIFNvdXRoZXJuIElkYWhvIChBZGEsIEFkYW1zLCBCYW5ub2NrLCBCZWFyIExha2UsIEJpbmdoYW0sIEJsYWluZSwKLSMgQm9pc2UsIEJvbm5ldmlsbGUsIEJ1dHRlLCBDYW1hcywgQ2FueW9uLCBDYXJpYm91LCBDYXNzaWEsIENsYXJrLAotIyBDdXN0ZXIsIEVsbW9yZSwgRnJhbmtsaW4sIEZyZW1vbnQsIEdlbSwgR29vZGluZywgSmVmZmVyc29uLCBKZXJvbWUsCi0jIExlbWhpLCBMaW5jb2xuLCBNYWRpc29uLCBNaW5pZG9rYSwgT25laWRhLCBPd3loZWUsIFBheWV0dGUsIFBvd2VyLAotIyBUZXRvbiwgVHdpbiBGYWxscywgVmFsbGV5LCBXYXNoaW5ndG9uIGNvdW50aWVzLCBhbmQgdGhlIHNvdXRoZXJuCi0jIHF1YXJ0ZXIgb2YgSWRhaG8gY291bnR5KSBhbmQgZWFzdGVybiBPcmVnb24gKG1vc3Qgb2YgTWFsaGV1ciBDb3VudHkpCi0jIHN3aXRjaGVkIGZvdXIgd2Vla3MgbGF0ZSBpbiAxOTc0LgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0JvaXNlCS03OjQ0OjQ5IC0JTE1UCTE4ODMgTm92IDE4IDEyOjE1OjExCi0JCQktODowMAlVUwlQJXNUCTE5MjMgTWF5IDEzIDI6MDAKLQkJCS03OjAwCVVTCU0lc1QJMTk3NAotCQkJLTc6MDAJLQlNU1QJMTk3NCBGZWIgIDMgMjowMAotCQkJLTc6MDAJVVMJTSVzVAotCi0jIEluZGlhbmEKLSMKLSMgRm9yIGEgbWFwIG9mIEluZGlhbmEncyB0aW1lIHpvbmUgcmVnaW9ucywgc2VlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jY3NjLmVkdS90aW1lLmh0bWwiPgotIyBXaGF0IHRpbWUgaXMgaXQgaW4gSW5kaWFuYT8KLSMgPC9hPiAoMjAwNi0wMy0wMSkKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wOC0xNyk6Ci0jIFNpbmNlIDE5NzAsIG1vc3Qgb2YgSW5kaWFuYSBoYXMgYmVlbiBsaWtlIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMsCi0jIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgotIwotIyAtIEdpYnNvbiwgSmFzcGVyLCBMYWtlLCBMYVBvcnRlLCBOZXd0b24sIFBvcnRlciwgUG9zZXksIFNwZW5jZXIsCi0jICAgVmFuZGVuYnVyZ2gsIGFuZCBXYXJyaWNrIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvQ2hpY2Fnby4KLSMKLSMgLSBEZWFyYm9ybiBhbmQgT2hpbyBjb3VudGllcyBoYXZlIGJlZW4gbGlrZSBBbWVyaWNhL05ld19Zb3JrLgotIwotIyAtIENsYXJrLCBGbG95ZCwgYW5kIEhhcnJpc29uIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlCi0jICAgQW1lcmljYS9LZW50dWNreS9Mb3Vpc3ZpbGxlLgotIwotIyAtIENyYXdmb3JkLCBEYXZpZXNzLCBEdWJvaXMsIEtub3gsIE1hcnRpbiwgUGVycnksIFBpa2UsIFB1bGFza2ksIFN0YXJrZSwKLSMgICBhbmQgU3dpdHplcmxhbmQgY291bnRpZXMgaGF2ZSB0aGVpciBvd24gdGltZSB6b25lIGhpc3RvcmllcyBhcyBub3RlZCBiZWxvdy4KLSMKLSMgU2hhbmtzIHBhcnRpdGlvbmVkIEluZGlhbmEgaW50byAzNDUgcmVnaW9ucywgZWFjaCB3aXRoIGl0cyBvd24gdGltZSBoaXN0b3J5LAotIyBhbmQgd3JvdGUgYGBFdmVuIG5ld3NwYXBlciByZXBvcnRzIHByZXNlbnQgY29udHJhZGljdG9yeSBpbmZvcm1hdGlvbi4nJwotIyBUaG9zZSBIb29zaWVycyEgIFN1Y2ggYSBmbGlnaHR5IGFuZCBjaGFuZ2VhYmxlIHBlb3BsZSEKLSMgRm9ydHVuYXRlbHksIG1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgb2NjdXJyZWQgYmVmb3JlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLgotIwotIyBPdGhlciB0aGFuIEluZGlhbmFwb2xpcywgdGhlIEluZGlhbmEgcGxhY2UgbmFtZXMgYXJlIHNvIG5vbmRlc2NyaXB0Ci0jIHRoYXQgdGhleSB3b3VsZCBiZSBhbWJpZ3VvdXMgaWYgd2UgbGVmdCB0aGVtIGF0IHRoZSBgQW1lcmljYScgbGV2ZWwuCi0jIFNvIHdlIHJlbHVjdGFudGx5IHB1dCB0aGVtIGFsbCBpbiBhIHN1YmRpcmVjdG9yeSBgQW1lcmljYS9JbmRpYW5hJy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE2KToKLSMgaHR0cDovL3d3dy5tY2NzYy5lZHUvdGltZS5odG1sIHNheXMgdGhhdCBJbmRpYW5hIHdpbGwgdXNlIERTVCBzdGFydGluZyAyMDA2LgotCi0jIEZyb20gTmF0aGFuIFN0cmF0dG9uIFRyZWFkd2F5ICgyMDA2LTAzLTMwKToKLSMgaHR0cDovL3d3dy5kb3QuZ292L2FmZmFpcnMvZG90MDQwNi5odG0gWzM3MDUgQl0KLSMgRnJvbSBEZWJvcmFoIEdvbGRzbWl0aCAoMjAwNi0wMS0xOCk6Ci0jIGh0dHA6Ly9kbXNlcy5kb3QuZ292L2RvY2ltYWdlcy9wZGY5NS8zODIzMjlfd2ViLnBkZiBbMi45IE1CXQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAxLTIwKToKLSMgSXQgc2F5cyAiRE9UIGlzIHJlbG9jYXRpbmcgdGhlIHRpbWUgem9uZSBib3VuZGFyeSBpbiBJbmRpYW5hIHRvIG1vdmUgU3RhcmtlLAotIyBQdWxhc2tpLCBLbm94LCBEYXZpZXNzLCBNYXJ0aW4sIFBpa2UsIER1Ym9pcywgYW5kIFBlcnJ5IENvdW50aWVzIGZyb20gdGhlCi0jIEVhc3Rlcm4gVGltZSBab25lIHRvIHRoZSBDZW50cmFsIFRpbWUgWm9uZS4uLi4gVGhlIGVmZmVjdGl2ZSBkYXRlIG9mCi0jIHRoaXMgcnVsZSBpcyAyOk9PIGEubS4gRVNUIFN1bmRheSwgQXByaWwgMiwgMjAwNiwgd2hpY2ggaXMgdGhlCi0jIGNoYW5nZW92ZXIgZGF0ZSBmcm9tIHN0YW5kYXJkIHRpbWUgdG8gRGF5bGlnaHQgU2F2aW5nIFRpbWUuIgotIyBTdHJpY3RseSBzcGVha2luZywgdGhpcyBtZWFucyB0aGUgYWZmZWN0ZWQgY291bnRpZXMgd2lsbCBjaGFuZ2UgdGhlaXIKLSMgY2xvY2tzIHR3aWNlIHRoYXQgbmlnaHQsIGJ1dCB0aGlzIG9idmlvdXNseSBpcyBpbiBlcnJvci4gIFRoZSBpbnRlbnQKLSMgaXMgdGhhdCAwMTo1OTo1OSBFU1QgYmUgZm9sbG93ZWQgYnkgMDI6MDA6MDAgQ0RULgotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDctMDItMTApOgotIyBUaGUgQXNzb2NpYXRlZCBQcmVzcyBoYXMgYmVlbiByZXBvcnRpbmcgdGhhdCBQdWxhc2tpIENvdW50eSwgSW5kaWFuYSBpcwotIyBnb2luZyB0byBzd2l0Y2ggZnJvbSBDZW50cmFsIHRvIEVhc3Rlcm4gVGltZSBvbiBNYXJjaCAxMSwgMjAwNy4uLi4KLSMgaHR0cDovL3d3dy5pbmR5c3Rhci5jb20vYXBwcy9wYmNzLmRsbC9hcnRpY2xlP0FJRD0vMjAwNzAyMDcvTE9DQUwxOTAxMDgvNzAyMDcwNTI0LzAvTE9DQUwKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlIEluZGlhbmFwb2xpcyAxOTQxCW9ubHkJLQlKdW4JMjIJMjowMAkxOjAwCUQKLVJ1bGUgSW5kaWFuYXBvbGlzIDE5NDEJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIEluZGlhbmFwb2xpcyAxOTQ2CTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzIC01OjQ0OjM4IC0gTE1UIDE4ODMgTm92IDE4IDEyOjE1OjIyCi0JCQktNjowMAlVUwlDJXNUCTE5MjAKLQkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NDIKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAgSW5kaWFuYXBvbGlzIEMlc1QJMTk1NSBBcHIgMjQgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk1NyBTZXAgMjkgMjowMAotCQkJLTY6MDAJLQlDU1QJMTk1OCBBcHIgMjcgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTcxCi0JCQktNTowMAktCUVTVAkyMDA2Ci0JCQktNTowMAlVUwlFJXNUCi0jCi0jIEVhc3Rlcm4gQ3Jhd2ZvcmQgQ291bnR5LCBJbmRpYW5hLCBsZWZ0IGl0cyBjbG9ja3MgYWxvbmUgaW4gMTk3NCwKLSMgYXMgd2VsbCBhcyBmcm9tIDE5NzYgdGhyb3VnaCAyMDA1LgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCU1hcmVuZ28JMTk1MQlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJTWFyZW5nbwkxOTUxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlNYXJlbmdvCTE5NTQJMTk2MAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU1hcmVuZ28JMTk1NAkxOTYwCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL01hcmVuZ28gLTU6NDU6MjMgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTQ6MzcKLQkJCS02OjAwCVVTCUMlc1QJMTk1MQotCQkJLTY6MDAJTWFyZW5nbwlDJXNUCTE5NjEgQXByIDMwIDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjkKLQkJCS01OjAwCVVTCUUlc1QJMTk3NCBKYW4gIDYgMjowMAotCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgMjowMAotCQkJLTU6MDAJVVMJRSVzVAkxOTc2Ci0JCQktNTowMAktCUVTVAkyMDA2Ci0JCQktNTowMAlVUwlFJXNUCi0jCi0jIERhdmllc3MsIER1Ym9pcywgS25veCwgYW5kIE1hcnRpbiBDb3VudGllcywgSW5kaWFuYSwKLSMgc3dpdGNoZWQgZnJvbSBlYXN0ZXJuIHRvIGNlbnRyYWwgdGltZSBpbiBBcHJpbCAyMDA2LCB0aGVuIHN3aXRjaGVkIGJhY2sKLSMgaW4gTm92ZW1iZXIgMjAwNy4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZSBWaW5jZW5uZXMJMTk0Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgVmluY2VubmVzCTE5NDYJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIFZpbmNlbm5lcwkxOTUzCTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZSBWaW5jZW5uZXMJMTk1MwkxOTU5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgVmluY2VubmVzCTE5NTUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAotUnVsZSBWaW5jZW5uZXMJMTk1NgkxOTYzCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgVmluY2VubmVzCTE5NjAJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIFZpbmNlbm5lcwkxOTYxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBWaW5jZW5uZXMJMTk2MgkxOTYzCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL1ZpbmNlbm5lcyAtNTo1MDowNyAtIExNVAkxODgzIE5vdiAxOCAxMjowOTo1MwotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMCBWaW5jZW5uZXMJQyVzVAkxOTY0IEFwciAyNiAyOjAwCi0JCQktNTowMAktCUVTVAkxOTY5Ci0JCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgMjowMAotCQkJLTU6MDAJVVMJRSVzVAotIwotIyBQZXJyeSBDb3VudHksIEluZGlhbmEsIHN3aXRjaGVkIGZyb20gZWFzdGVybiB0byBjZW50cmFsIHRpbWUgaW4gQXByaWwgMjAwNi4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZSBQZXJyeQkxOTQ2CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZSBQZXJyeQkxOTQ2CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBQZXJyeQkxOTUzCTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZSBQZXJyeQkxOTUzCTE5NTkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBQZXJyeQkxOTU1CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUgUGVycnkJMTk1NgkxOTYzCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgUGVycnkJMTk2MAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgUGVycnkJMTk2MQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgUGVycnkJMTk2MgkxOTYzCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL1RlbGxfQ2l0eSAtNTo0NzowMyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMjo1NwotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMCBQZXJyeQlDJXNUCTE5NjQgQXByIDI2IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjkKLQkJCS01OjAwCVVTCUUlc1QJMTk3MQotCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgMjowMAotCQkJLTY6MDAJVVMJQyVzVAotIwotIyBQaWtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5NzcsCi0jIHRoZW4gc3dpdGNoZWQgYmFjayBpbiAyMDA2LCB0aGVuIHN3aXRjaGVkIGJhY2sgYWdhaW4gaW4gMjAwNy4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlQaWtlCTE5NTUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAotUnVsZQlQaWtlCTE5NTUJMTk2MAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVBpa2UJMTk1NgkxOTY0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJUGlrZQkxOTYxCTE5NjQJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZyAtNTo0OTowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMDo1MwotCQkJLTY6MDAJVVMJQyVzVAkxOTU1Ci0JCQktNjowMAlQaWtlCUMlc1QJMTk2NSBBcHIgMjUgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTc3IE9jdCAzMCAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0IDI6MDAKLQkJCS01OjAwCVVTCUUlc1QKLSMKLSMgU3RhcmtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5OTEsCi0jIHRoZW4gc3dpdGNoZWQgYmFjayBpbiAyMDA2LgotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5MS0xMC0yOCk6Ci0jIEFuIGFydGljbGUgb24gcGFnZSBBMyBvZiB0aGUgU3VuZGF5LCAxOTkxLTEwLTI3IFdhc2hpbmd0b24gUG9zdAotIyBub3RlcyB0aGF0IFN0YXJrZSBDb3VudHkgc3dpdGNoZWQgZnJvbSBDZW50cmFsIHRpbWUgdG8gRWFzdGVybiB0aW1lIGFzIG9mCi0jIDE5OTEtMTAtMjcuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJU3RhcmtlCTE5NDcJMTk2MQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVN0YXJrZQkxOTQ3CTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlTdGFya2UJMTk1NQkxOTU2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3RhcmtlCTE5NTcJMTk1OAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN0YXJrZQkxOTU5CTE5NjEJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0luZGlhbmEvS25veCAtNTo0NjozMCAtCUxNVAkxODgzIE5vdiAxOCAxMjoxMzozMAotCQkJLTY6MDAJVVMJQyVzVAkxOTQ3Ci0JCQktNjowMAlTdGFya2UJQyVzVAkxOTYyIEFwciAyOSAyOjAwCi0JCQktNTowMAktCUVTVAkxOTYzIE9jdCAyNyAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTE5OTEgT2N0IDI3IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QKLSMKLSMgUHVsYXNraSBDb3VudHksIEluZGlhbmEsIHN3aXRjaGVkIGZyb20gZWFzdGVybiB0byBjZW50cmFsIHRpbWUgaW4KLSMgQXByaWwgMjAwNiBhbmQgdGhlbiBzd2l0Y2hlZCBiYWNrIGluIE1hcmNoIDIwMDcuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJUHVsYXNraQkxOTQ2CTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlQdWxhc2tpCTE5NDYJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVB1bGFza2kJMTk1NQkxOTU2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJUHVsYXNraQkxOTU3CTE5NjAJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0luZGlhbmEvV2luYW1hYyAtNTo0NjoyNSAtIExNVAkxODgzIE5vdiAxOCAxMjoxMzozNQotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMAlQdWxhc2tpCUMlc1QJMTk2MSBBcHIgMzAgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTcxCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTIwMDcgTWFyIDExIDI6MDAKLQkJCS01OjAwCVVTCUUlc1QKLSMKLSMgU3dpdHplcmxhbmQgQ291bnR5LCBJbmRpYW5hLCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3MyB0aHJvdWdoIDIwMDUuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9WZXZheSAtNTo0MDoxNiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxOTo0NAotCQkJLTY6MDAJVVMJQyVzVAkxOTU0IEFwciAyNSAyOjAwCi0JCQktNTowMAktCUVTVAkxOTY5Ci0JCQktNTowMAlVUwlFJXNUCTE5NzMKLQkJCS01OjAwCS0JRVNUCTIwMDYKLQkJCS01OjAwCVVTCUUlc1QKLQotIyBQYXJ0IG9mIEtlbnR1Y2t5IGxlZnQgaXRzIGNsb2NrcyBhbG9uZSBpbiAxOTc0LgotIyBUaGlzIGFsc28gaW5jbHVkZXMgQ2xhcmssIEZsb3lkLCBhbmQgSGFycmlzb24gY291bnRpZXMgaW4gSW5kaWFuYS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZSBMb3Vpc3ZpbGxlCTE5MjEJb25seQktCU1heQkxCTI6MDAJMTowMAlECi1SdWxlIExvdWlzdmlsbGUJMTkyMQlvbmx5CS0JU2VwCTEJMjowMAkwCVMKLVJ1bGUgTG91aXN2aWxsZQkxOTQxCTE5NjEJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZSBMb3Vpc3ZpbGxlCTE5NDEJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIExvdWlzdmlsbGUJMTk0Nglvbmx5CS0JSnVuCTIJMjowMAkwCVMKLVJ1bGUgTG91aXN2aWxsZQkxOTUwCTE5NTUJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBMb3Vpc3ZpbGxlCTE5NTYJMTk2MAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvS2VudHVja3kvTG91aXN2aWxsZSAtNTo0MzowMiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxNjo1OAotCQkJLTY6MDAJVVMJQyVzVAkxOTIxCi0JCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk0MgotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk2MSBKdWwgMjMgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2OAotCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAyOjAwCi0JCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAyOjAwCi0JCQktNTowMAlVUwlFJXNUCi0jCi0jIFdheW5lIENvdW50eSwgS2VudHVja3kKLSMKLSMgRnJvbQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmxha2UtY3VtYmVybGFuZC5jb20vbGlmZS9hcmNoaXZlL25ld3M5OTAxMjl0aW1lLnNodG1sIj4KLSMgTGFrZSBDdW1iZXJsYW5kIExJRkUKLSMgPC9hPiAoMTk5OS0wMS0yOSkgdmlhIFdLWU0tMTAxLjc6Ci0jIENsaW50b24gQ291bnR5IGhhcyBqb2luZWQgV2F5bmUgQ291bnR5IGluIGFza2luZyB0aGUgRG9UIHRvIGNoYW5nZSBmcm9tCi0jIHRoZSBDZW50cmFsIHRvIHRoZSBFYXN0ZXJuIHRpbWUgem9uZS4uLi4gIFRoZSBXYXluZSBDb3VudHkgZ292ZXJubWVudCBtYWRlCi0jIHRoZSBzYW1lIHJlcXVlc3QgaW4gRGVjZW1iZXIuICBBbmQgd2hpbGUgUnVzc2VsbCBDb3VudHkgb2ZmaWNpYWxzIGhhdmUgbm90Ci0jIHRha2VuIGFjdGlvbiwgdGhlIG1ham9yaXR5IG9mIHJlc3BvbmRlbnRzIHRvIGEgcG9sbCBjb25kdWN0ZWQgdGhlcmUgaW4KLSMgQXVndXN0IGluZGljYXRlZCB0aGV5IHdvdWxkIGxpa2UgdG8gY2hhbmdlIHRvICJmYXN0IHRpbWUiIGFsc28uCi0jIFRoZSB0aHJlZSBMYWtlIEN1bWJlcmxhbmQgY291bnRpZXMgYXJlIHRoZSBmYXJ0aGVzdCBlYXN0IG9mIGFueSBVLlMuCi0jIGxvY2F0aW9uIGluIHRoZSBDZW50cmFsIHRpbWUgem9uZS4KLSMKLSMgRnJvbSBSaWNoIFdhbGVzICgyMDAwLTA4LTI5KToKLSMgQWZ0ZXIgcHJvbG9uZ2VkIGRlYmF0ZSwgYW5kIGRlc3BpdGUgY29udGludWluZyBkZWVwIGRpZmZlcmVuY2VzIG9mIG9waW5pb24sCi0jIFdheW5lIENvdW50eSAoY2VudHJhbCBLZW50dWNreSkgaXMgc3dpdGNoaW5nIGZyb20gQ2VudHJhbCAoLTA2MDApIHRvIEVhc3Rlcm4KLSMgKC0wNTAwKSB0aW1lLiAgVGhleSB3b24ndCAiZmFsbCBiYWNrIiB0aGlzIHllYXIuICBTZWUgU2FyYSBTaGlwbGV5LAotIyBUaGUgZGlmZmVyZW5jZSBhbiBob3VyIG1ha2VzLCBOYW5kbyBUaW1lcyAoMjAwMC0wOC0yOSAxNTozMyAtMDQwMCkuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDctMTYpOgotIyBUaGUgZmluYWwgcnVsZSB3YXMgcHVibGlzaGVkIGluIHRoZQotIyA8YSBocmVmPSJodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MjAwMF9yZWdpc3RlciZkb2NpZD1mcjE3YXUwMC0yMiI+Ci0jIEZlZGVyYWwgUmVnaXN0ZXIgNjUsIDE2MCAoMjAwMC0wOC0xNyksIHBhZ2UgNTAxNTQtNTAxNTguCi0jIDwvYT4KLSMKLVpvbmUgQW1lcmljYS9LZW50dWNreS9Nb250aWNlbGxvIC01OjM5OjI0IC0gTE1UCTE4ODMgTm92IDE4IDEyOjIwOjM2Ci0JCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwCS0JQ1NUCTE5NjgKLQkJCS02OjAwCVVTCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKLQkJCS01OjAwCVVTCUUlc1QKLQotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMDgtMzApOgotIyBIZXJlIC4uLiBhcmUgYWxsIHRoZSBjaGFuZ2VzIGluIHRoZSBVUyBzaW5jZSAxOTg1LgotIyBLZWFybnkgQ291bnR5LCBLUyAocHV0IGFsbCBvZiBjb3VudHkgb24gY2VudHJhbDsKLSMJcHJldmlvdXNseSBzcGxpdCBiZXR3ZWVuIE1TVCBhbmQgQ1NUKSAuLi4gMTk5MC0xMAotIyBTdGFya2UgQ291bnR5LCBJTiAoZnJvbSBDU1QgdG8gRVNUKSAuLi4gMTk5MS0xMAotIyBPbGl2ZXIgQ291bnR5LCBORCAoZnJvbSBNU1QgdG8gQ1NUKSAuLi4gMTk5Mi0xMAotIyBXZXN0IFdlbmRvdmVyLCBOViAoZnJvbSBQU1QgVE8gTVNUKSAuLi4gMTk5OS0xMAotIyBXYXluZSBDb3VudHksIEtZIChmcm9tIENTVCB0byBFU1QpIC4uLiAyMDAwLTEwCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDctMTcpOgotIyBXZSBkb24ndCBrbm93IHdoZXJlIHRoZSBsaW5lIHVzZWQgdG8gYmUgd2l0aGluIEtlYXJueSBDb3VudHksIEtTLAotIyBzbyBvbWl0IHRoYXQgY2hhbmdlIGZvciBub3cuCi0jIFNlZSBBbWVyaWNhL0luZGlhbmEvS25veCBmb3IgdGhlIFN0YXJrZSBDb3VudHksIElOIGNoYW5nZS4KLSMgU2VlIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0NlbnRlciBmb3IgdGhlIE9saXZlciBDb3VudHksIE5EIGNoYW5nZS4KLSMgV2VzdCBXZW5kb3ZlciwgTlYgb2ZmaWNpYWxseSBzd2l0Y2hlZCBmcm9tIFBhY2lmaWMgdG8gbW91bnRhaW4gdGltZSBvbgotIyAxOTk5LTEwLTMxLiAgU2VlIHRoZQotIyA8YSBocmVmPSJodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MTk5OV9yZWdpc3RlciZkb2NpZD1mcjIxb2M5OS0xNSI+Ci0jIEZlZGVyYWwgUmVnaXN0ZXIgNjQsIDIwMyAoMTk5OS0xMC0yMSksIHBhZ2UgNTY3MDUtNTY3MDcuCi0jIDwvYT4KLSMgSG93ZXZlciwgdGhlIEZlZGVyYWwgUmVnaXN0ZXIgc2F5cyB0aGF0IFdlc3QgV2VuZG92ZXIgYWxyZWFkeSBvcGVyYXRlZAotIyBvbiBtb3VudGFpbiB0aW1lLCBhbmQgdGhlIHJ1bGUgbWVyZWx5IG1hZGUgdGhpcyBvZmZpY2lhbDsKLSMgaGVuY2UgYSBzZXBhcmF0ZSB0eiBlbnRyeSBpcyBub3QgbmVlZGVkLgotCi0jIE1pY2hpZ2FuCi0jCi0jIEZyb20gQm9iIERldmluZSAoMTk4OC0wMS0yOCk6Ci0jIE1pY2hpZ2FuIGRpZG4ndCBvYnNlcnZlIERTVCBmcm9tIDE5NjggdG8gMTk3My4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wMy0zMSk6Ci0jIFNoYW5rcyB3cml0ZXMgdGhhdCBNaWNoaWdhbiBzdGFydGVkIHVzaW5nIHN0YW5kYXJkIHRpbWUgb24gMTg4NS0wOS0xOCwKLSMgYnV0IEhvd3NlIHdyaXRlcyAocHAgMTI0LTEyNSwgcmVmZXJyaW5nIHRvIFBvcHVsYXIgQXN0cm9ub215LCAxOTAxLTAxKQotIyB0aGF0IERldHJvaXQga2VwdAotIwotIwlsb2NhbCB0aW1lIHVudGlsIDE5MDAgd2hlbiB0aGUgQ2l0eSBDb3VuY2lsIGRlY3JlZWQgdGhhdCBjbG9ja3Mgc2hvdWxkCi0jCWJlIHB1dCBiYWNrIHR3ZW50eS1laWdodCBtaW51dGVzIHRvIENlbnRyYWwgU3RhbmRhcmQgVGltZS4gIEhhbGYgdGhlCi0jCWNpdHkgb2JleWVkLCBoYWxmIHJlZnVzZWQuICBBZnRlciBjb25zaWRlcmFibGUgZGViYXRlLCB0aGUgZGVjaXNpb24KLSMJd2FzIHJlc2NpbmRlZCBhbmQgdGhlIGNpdHkgcmV2ZXJ0ZWQgdG8gU3VuIHRpbWUuICBBIGRlcmlzaXZlIG9mZmVyIHRvCi0jCWVyZWN0IGEgc3VuZGlhbCBpbiBmcm9udCBvZiB0aGUgY2l0eSBoYWxsIHdhcyByZWZlcnJlZCB0byB0aGUKLSMJQ29tbWl0dGVlIG9uIFNld2Vycy4gIFRoZW4sIGluIDE5MDUsIENlbnRyYWwgdGltZSB3YXMgYWRvcHRlZAotIwlieSBjaXR5IHZvdGUuCi0jCi0jIFRoaXMgc3RvcnkgaXMgdG9vIGVudGVydGFpbmluZyB0byBiZSBmYWxzZSwgc28gZ28gd2l0aCBIb3dzZSBvdmVyIFNoYW5rcy4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wNik6Ci0jIEdhcmxhbmQgKDE5MjcpIHdyaXRlcyBgYENsZXZlbGFuZCBhbmQgRGV0cm9pdCBhZHZhbmNlZCB0aGVpciBjbG9ja3MKLSMgb25lIGhvdXIgaW4gMTkxNC4nJyAgVGhpcyBjaGFuZ2UgaXMgbm90IGluIFNoYW5rcy4gIFdlIGhhdmUgbm8gbW9yZQotIyBpbmZvLCBzbyBvbWl0IHRoaXMgZm9yIG5vdy4KLSMKLSMgTW9zdCBvZiBNaWNoaWdhbiBvYnNlcnZlZCBEU1QgZnJvbSAxOTczIG9uLCBidXQgd2FzIGEgYml0IGxhdGUgaW4gMTk3NS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlEZXRyb2l0CTE5NDgJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCURldHJvaXQJMTk0OAlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRGV0cm9pdAkxOTY3CW9ubHkJLQlKdW4JMTQJMjowMAkxOjAwCUQKLVJ1bGUJRGV0cm9pdAkxOTY3CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0RldHJvaXQJLTU6MzI6MTEgLQlMTVQJMTkwNQotCQkJLTY6MDAJLQlDU1QJMTkxNSBNYXkgMTUgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk0MgotCQkJLTU6MDAJVVMJRSVzVAkxOTQ2Ci0JCQktNTowMAlEZXRyb2l0CUUlc1QJMTk3MwotCQkJLTU6MDAJVVMJRSVzVAkxOTc1Ci0JCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAyOjAwCi0JCQktNTowMAlVUwlFJXNUCi0jCi0jIERpY2tpbnNvbiwgR29nZWJpYywgSXJvbiwgYW5kIE1lbm9taW5lZSBDb3VudGllcywgTWljaGlnYW4sCi0jIHN3aXRjaGVkIGZyb20gRVNUIHRvIENTVC9DRFQgaW4gMTk3My4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZSBNZW5vbWluZWUJMTk0Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgTWVub21pbmVlCTE5NDYJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIE1lbm9taW5lZQkxOTY2CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZSBNZW5vbWluZWUJMTk2Nglvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9NZW5vbWluZWUJLTU6NTA6MjcgLQlMTVQJMTg4NSBTZXAgMTggMTI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAgTWVub21pbmVlCUMlc1QJMTk2OSBBcHIgMjcgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk3MyBBcHIgMjkgMjowMAotCQkJLTY6MDAJVVMJQyVzVAotCi0jIE5hdmFzc2EKLSMgYWRtaW5pc3RlcmVkIGJ5IHRoZSBVUyBGaXNoIGFuZCBXaWxkbGlmZSBTZXJ2aWNlCi0jIGNsYWltZWQgYnkgVVMgdW5kZXIgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIDE4NTYgR3Vhbm8gSXNsYW5kcyBBY3QKLSMgYWxzbyBjbGFpbWVkIGJ5IEhhaXRpCi0jIG9jY3VwaWVkIDE4NTcvMTkwMCBieSB0aGUgTmF2YXNzYSBQaG9zcGhhdGUgQ28KLSMgVVMgbGlnaHRob3VzZSAxOTE3LzE5OTYtMDkKLSMgY3VycmVudGx5IHVuaW5oYWJpdGVkCi0jIHNlZSBNYXJrIEZpbmVtYW4sIGBgQW4gSXNsZSBSaWNoIGluIEd1YW5vIGFuZCBEaXNjb3JkJycsCi0jIF9Mb3MgQW5nZWxlcyBUaW1lc18gKDE5OTgtMTEtMTApLCBBMSwgQTEwOyBpdCBjaXRlcwotIyBKaW1teSBTa2FnZ3MsIF9UaGUgR3JlYXQgR3Vhbm8gUnVzaF8gKDE5OTQpLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwotIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCi0jIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCi0jCi0jIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKLSMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0Ci0jIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKLSMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKLSMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCi0jCi0jIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgotIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCi0jCi0jIE90aGVyIHNvdXJjZXMgb2NjYXNpb25hbGx5IHVzZWQgaW5jbHVkZToKLSMKLSMJRWR3YXJkIFcuIFdoaXRtYW4sIFdvcmxkIFRpbWUgRGlmZmVyZW5jZXMsCi0jCVdoaXRtYW4gUHVibGlzaGluZyBDbywgMiBOaWFnYXJhIEF2LCBFYWxpbmcsIExvbmRvbiAodW5kYXRlZCksCi0jCXdoaWNoIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KLSMKLSMJPGEgaHJlZj0iaHR0cDovL3d3dy5wZXR0c3dvb2R2aWxsYWdlLmNvLnVrL0RheWxpZ2h0X1NhdmluZ3NfV2lsbGlhbV9XaWxsZXR0LnBkZiI+Ci0jCVdpbGxpYW0gV2lsbGV0dCwgVGhlIFdhc3RlIG9mIERheWxpZ2h0LCAxOXRoIGVkaXRpb24KLSMJPC9hPiAoMTkxNC0wMykKLSMKLSMgU2VlIHRoZSBgZXVyb3BlJyBmaWxlIGZvciBHcmVlbmxhbmQuCi0KLSMgQ2FuYWRhCi0KLSMgRnJvbSBBbGFpbiBMYUJvbnQ8ZSc+ICgxOTk0LTExLTE0KToKLSMgSSBwb3N0IGhlcmUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHN0YW5kYXJkaXplZCBpbiBDYW5hZGEKLSMgZm9yIGJvdGggRW5nbGlzaCBhbmQgRnJlbmNoIGluIHRoZSBDQU4vQ1NBLVoyMzQuNC04OSBzdGFuZGFyZC4uLi4KLSMKLSMJVVRDCVN0YW5kYXJkIHRpbWUJRGF5bGlnaHQgc2F2aW5ncyB0aW1lCi0jCW9mZnNldAlGcmVuY2gJRW5nbGlzaAlGcmVuY2gJRW5nbGlzaAotIwktMjozMAktCS0JSEFUCU5EVAotIwktMwktCS0JSEFBCUFEVAotIwktMzozMAlITlQJTlNUCS0JLQotIwktNAlITkEJQVNUCUhBRQlFRFQKLSMJLTUJSE5FCUVTVAlIQUMJQ0RUCi0jCS02CUhOQwlDU1QJSEFSCU1EVAotIwktNwlITlIJTVNUCUhBUAlQRFQKLSMJLTgJSE5QCVBTVAlIQVkJWURUCi0jCS05CUhOWQlZU1QJLQktCi0jCi0jCUhOOiBIZXVyZSBOb3JtYWxlCVNUOiBTdGFuZGFyZCBUaW1lCi0jCUhBOiBIZXVyZSBBdmFuYzxlJz5lCURUOiBEYXlsaWdodCBzYXZpbmcgVGltZQotIwotIwlBOiBkZSBsJ0F0bGFudGlxdWUJQXRsYW50aWMKLSMJQzogZHUgQ2VudHJlCQlDZW50cmFsCi0jCUU6IGRlIGwnRXN0CQlFYXN0ZXJuCi0jCU06CQkJTW91bnRhaW4KLSMJTjoJCQlOZXdmb3VuZGxhbmQKLSMJUDogZHUgUGFjaWZpcXVlCQlQYWNpZmljCi0jCVI6IGRlcyBSb2NoZXVzZXMKLSMJVDogZGUgVGVycmUtTmV1dmUKLSMJWTogZHUgWXVrb24JCVl1a29uCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTQtMTEtMjIpOgotIyBBbGFzLCB0aGlzIHNvcnQgb2YgdGhpbmcgbXVzdCBiZSBoYW5kbGVkIGJ5IGxvY2FsaXphdGlvbiBzb2Z0d2FyZS4KLQotIyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhlIGRhdGEgZm9yIENhbmFkYSBhcmUgYWxsIGZyb20gU2hhbmtzCi0jICYgUG90dGVuZ2VyLgotCi0jIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA0LTAxLCAyMDA2LTA0LTI1LCAyMDA2LTA2LTI2LCAyMDA3LTAxLTMxLAotIyAyMDA3LTAzLTAxKToKLSMgVGhlIEJyaXRpc2ggQ29sdW1iaWEgZ292ZXJubWVudCBhbm5vdW5jZWQgeWVzdGVyZGF5IHRoYXQgaXQgd2lsbAotIyBhZGp1c3QgZGF5bGlnaHQgc2F2aW5ncyBuZXh0IHllYXIgdG8gYWxpZ24gd2l0aCBjaGFuZ2VzIGluIHRoZQotIyBVLlMuIGFuZCB0aGUgcmVzdCBvZiBDYW5hZGEuLi4uCi0jIGh0dHA6Ly93d3cyLm5ld3MuZ292LmJjLmNhL25ld3NfcmVsZWFzZXNfMjAwNS0yMDA5LzIwMDZBRzAwMTQtMDAwMzMwLmh0bQotIyAuLi4KLSMgTm92YSBTY290aWEKLSMgRGF5bGlnaHQgc2F2aW5nIHRpbWUgd2lsbCBiZSBleHRlbmRlZCBieSBmb3VyIHdlZWtzIHN0YXJ0aW5nIGluIDIwMDcuLi4uCi0jIGh0dHA6Ly93d3cuZ292Lm5zLmNhL2p1c3QvcmVndWxhdGlvbnMvcmcyLzIwMDYvbWExMjA2LnBkZgotIwotIyBbRm9yIE5ldyBCcnVuc3dpY2tdIHRoZSBuZXcgbGVnaXNsYXRpb24gZGljdGF0ZXMgdGhhdCB0aGUgdGltZSBjaGFuZ2UgaXMgdG8KLSMgYmUgZG9uZSBhdCAwMjowMCBpbnN0ZWFkIG9mIDAwOjAxLgotIyBodHRwOi8vd3d3LmduYi5jYS8wMDYyL2FjdHMvQkJBLTIwMDYvQ2hhcC0xOS5wZGYKLSMgLi4uCi0jIE1hbml0b2JhIGhhcyB0cmFkaXRpb25hbGx5IGNoYW5nZWQgdGhlIGNsb2NrIGV2ZXJ5IGZhbGwgYXQgMDM6MDAuCi0jIEFzIG9mIDIwMDYsIHRoZSB0cmFuc2l0aW9uIGlzIHRvIHRha2UgcGxhY2Ugb25lIGhvdXIgZWFybGllciBhdCAwMjowMC4KLSMgaHR0cDovL3dlYjIuZ292Lm1iLmNhL2xhd3Mvc3RhdHV0ZXMvY2NzbS9vMDMwZS5waHAKLSMgLi4uCi0jIFtBbGJlcnRhLCBPbnRhcmlvLCBRdWViZWNdIHdpbGwgZm9sbG93IFVTIHJ1bGVzLgotIyBodHRwOi8vd3d3LnFwLmdvdi5hYi5jYS9kb2N1bWVudHMvc3ByaW5nL0NIMDNfMDYuQ0ZNCi0jIGh0dHA6Ly93d3cuZS1sYXdzLmdvdi5vbi5jYS9EQkxhd3MvU291cmNlL1JlZ3MvRW5nbGlzaC8yMDA2L1IwNjExMV9lLmh0bQotIyBodHRwOi8vd3d3Mi5wdWJsaWNhdGlvbnNkdXF1ZWJlYy5nb3V2LnFjLmNhL2R5bmFtaWNTZWFyY2gvdGVsZWNoYXJnZS5waHA/dHlwZT01JmZpbGU9MjAwNkMzOUEuUERGCi0jIC4uLgotIyBQLkUuSS4gd2lsbCBmb2xsb3cgVVMgcnVsZXMuLi4uCi0jIGh0dHA6Ly93d3cuYXNzZW1ibHkucGUuY2EvYmlsbHMvcGRmX2NoYXB0ZXIvNjIvMy9jaGFwdGVyLTQxLnBkZgotIyAuLi4KLSMgUHJvdmluY2Ugb2YgTmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvci4uLi4KLSMgaHR0cDovL3d3dy5ob2EuZ292Lm5sLmNhL2hvYS9iaWxscy9CaWxsMDYzNC5odG0KLSMgLi4uCi0jIFl1a29uCi0jIGh0dHA6Ly93d3cuZ292LnlrLmNhL2xlZ2lzbGF0aW9uL3JlZ3Mvb2ljMjAwNl8xMjcucGRmCi0jIC4uLgotIyBOLlcuVC4gd2lsbCBmb2xsb3cgVVMgcnVsZXMuICBXaG9ldmVyIG1haW50YWlucyB0aGUgZ292ZXJubWVudCB3ZWIgc2l0ZQotIyBkb2VzIG5vdCBzZWVtIHRvIGJlbGlldmUgaW4gYm9va21hcmtzLiAgVG8gc2VlIHRoZSBuZXdzIHJlbGVhc2UsIGNsaWNrIHRoZQotIyBmb2xsb3dpbmcgbGluayBhbmQgc2VhcmNoIGZvciAiRGF5bGlnaHQgU2F2aW5ncyBUaW1lIENoYW5nZSIuICBQcmVzcyB0aGUKLSMgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSBDaGFuZ2UiIGxpbms7IGl0IHdpbGwgZmlyZSBvZmYgYSBwb3B1cCB1c2luZwotIyBKYXZhU2NyaXB0LgotIyBodHRwOi8vd3d3LmV4ZWMuZ292Lm50LmNhL2N1cnJlbnRuZXdzL2N1cnJlbnRQUi5hc3A/bW9kZT1hcmNoaXZlCi0jIC4uLgotIyBOdW5hdnV0Ci0jIEFuIGFtZW5kbWVudCB0byB0aGUgSW50ZXJwcmV0YXRpb24gQWN0IHdhcyByZWdpc3RlcmVkIG9uIEZlYnJ1YXJ5IDE5LzIwMDcuLi4uCi0jIGh0dHA6Ly9hY3Rpb24uYXR0YXZpay5jYS9ob21lL2p1c3RpY2UtZ24vYXR0YWNoLzIwMDcvZ2F6MDJwYXJ0Mi5wZGYKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTI1KToKLSMgSC4gRGF2aWQgTWF0dGhld3MgYW5kIE1hcnkgVmluY2VudCdzIG1hcAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmNhbmFkaWFuZ2VvZ3JhcGhpYy5jYS9NYWdhemluZS9TTzk4L2dlb21hcC5hc3AiPgotIyAiSXQncyBhYm91dCBUSU1FIiwgX0NhbmFkaWFuIEdlb2dyYXBoaWNfIChTZXB0ZW1iZXItT2N0b2JlciAxOTk4KQotIyA8L2E+IGNvbnRhaW5zIGRldGFpbGVkIGJvdW5kYXJpZXMgZm9yIHJlZ2lvbnMgb2JzZXJ2aW5nIG5vbnN0YW5kYXJkCi0jIHRpbWUgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFycmFuZ2VtZW50cyBpbiBDYW5hZGEgY2lyY2EgMTk5OC4KLSMKLSMgSU5NUywgdGhlIEluc3RpdHV0ZSBmb3IgTmF0aW9uYWwgTWVhc3VyZW1lbnQgU3RhbmRhcmRzIGluIE90dGF3YSwgaGFzIDxhCi0jIGhyZWY9Imh0dHA6Ly9pbm1zLWllbm0ubnJjLWNucmMuZ2MuY2EvZW4vdGltZV9zZXJ2aWNlcy9kYXlsaWdodF9zYXZpbmdfZS5waHAiPgotIyBpbmZvcm1hdGlvbiBhYm91dCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgc2F2aW5nIHRpbWUgem9uZXMgaW4gQ2FuYWRhLgotIyA8L2E+ICh1cGRhdGVkIHBlcmlvZGljYWxseSkuCi0jIEl0cyB1bm9mZmljaWFsIGluZm9ybWF0aW9uIGlzIG9mdGVuIHRha2VuIGZyb20gTWF0dGhld3MgYW5kIFZpbmNlbnQuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6Ci0jIEZvciBub3csIGFzc3VtZSBhbGwgb2YgRFNULW9ic2VydmluZyBDYW5hZGEgd2lsbCBmYWxsIGludG8gbGluZSB3aXRoIHRoZQotIyBuZXcgVVMgRFNUIHJ1bGVzLAotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDYW5hZGEJMTkxOAlvbmx5CS0JQXByCTE0CTI6MDAJMTowMAlECi1SdWxlCUNhbmFkYQkxOTE4CW9ubHkJLQlPY3QJMzEJMjowMAkwCVMKLVJ1bGUJQ2FuYWRhCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlDYW5hZGEJMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQotUnVsZQlDYW5hZGEJMTk0NQlvbmx5CS0JU2VwCTMwCTI6MDAJMAlTCi1SdWxlCUNhbmFkYQkxOTc0CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlDYW5hZGEJMTk3NAkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJQ2FuYWRhCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJQ2FuYWRhCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlDYW5hZGEJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCi0KLQotIyBOZXdmb3VuZGxhbmQgYW5kIExhYnJhZG9yCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0xMC0wMik6Ci0jIE1hdHRoZXdzIGFuZCBWaW5jZW50ICgxOTk4KSB3cml0ZSB0aGF0IExhYnJhZG9yIHNob3VsZCB1c2UgTlNUL05EVCwKLSMgYnV0IHRoZSBvbmx5IHBhcnQgb2YgTGFicmFkb3IgdGhhdCBmb2xsb3dzIHRoZSBydWxlcyBpcyB0aGUKLSMgc291dGhlYXN0IGNvcm5lciwgaW5jbHVkaW5nIFBvcnQgSG9wZSBTaW1wc29uIGFuZCBNYXJ5J3MgSGFyYm91ciwKLSMgYnV0IGV4Y2x1ZGluZywgc2F5LCBCbGFjayBUaWNrbGUuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVN0Sm9obnMJMTkxNwlvbmx5CS0JQXByCSA4CTI6MDAJMTowMAlECi1SdWxlCVN0Sm9obnMJMTkxNwlvbmx5CS0JU2VwCTE3CTI6MDAJMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTkxOSBBcHIgNSBhbmQgMTkyMCBBcHIgNTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVN0Sm9obnMJMTkxOQlvbmx5CS0JTWF5CSA1CTIzOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5MTkJb25seQktCUF1ZwkxMgkyMzowMAkwCVMKLSMgRm9yIDE5MzEtMTkzNSBXaGl0bWFuIGdpdmVzIEFwciBzYW1lIGRhdGU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTdEpvaG5zCTE5MjAJMTkzNQktCU1heQlTdW4+PTEJMjM6MDAJMTowMAlECi1SdWxlCVN0Sm9obnMJMTkyMAkxOTM1CS0JT2N0CWxhc3RTdW4JMjM6MDAJMAlTCi0jIEZvciAxOTM2LTE5NDEgV2hpdG1hbiBnaXZlcyBNYXkgU3VuPj04IGFuZCBPY3QgU3VuPj0xOyBnbyB3aXRoIFNoYW5rcyAmCi0jIFBvdHRlbmdlci4KLVJ1bGUJU3RKb2hucwkxOTM2CTE5NDEJLQlNYXkJTW9uPj05CTA6MDAJMTowMAlECi1SdWxlCVN0Sm9obnMJMTkzNgkxOTQxCS0JT2N0CU1vbj49MgkwOjAwCTAJUwotIyBXaGl0bWFuIGdpdmVzIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6Ci0jIDE5NDIgMDMtMDEvMTItMzEsIDE5NDMgMDUtMzAvMDktMDUsIDE5NDQgMDctMTAvMDktMDIsIDE5NDUgMDEtMDEvMTAtMDcKLSMgYnV0IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGFuZCBhc3N1bWUgdGhleSB1c2VkIENhbmFkaWFuIHJ1bGVzLgotIyBGb3IgMTk0Ni05IFdoaXRtYW4gZ2l2ZXMgTWF5IDUsNCw5LDEgLSBPY3QgMSw1LDMsMiwgYW5kIGZvciAxOTUwIGhlIGdpdmVzCi0jIEFwciAzMCAtIFNlcCAyNDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVN0Sm9obnMJMTk0NgkxOTUwCS0JTWF5CVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5NDYJMTk1MAktCU9jdAlTdW4+PTIJMjowMAkwCVMKLVJ1bGUJU3RKb2hucwkxOTUxCTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5NTEJMTk1OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN0Sm9obnMJMTk2MAkxOTg2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0xMC0wMik6Ci0jIElOTVMgKDIwMDAtMDktMTIpIHNheXMgdGhhdCwgc2luY2UgMTk4OCBhdCBsZWFzdCwgTmV3Zm91bmRsYW5kIHN3aXRjaGVzCi0jIGF0IDAwOjAxIGxvY2FsIHRpbWUuICBGb3Igbm93LCBhc3N1bWUgaXQgc3RhcnRlZCBpbiAxOTg3LgotUnVsZQlTdEpvaG5zCTE5ODcJb25seQktCUFwcglTdW4+PTEJMDowMQkxOjAwCUQKLVJ1bGUJU3RKb2hucwkxOTg3CTIwMDYJLQlPY3QJbGFzdFN1bgkwOjAxCTAJUwotUnVsZQlTdEpvaG5zCTE5ODgJb25seQktCUFwcglTdW4+PTEJMDowMQkyOjAwCURECi1SdWxlCVN0Sm9obnMJMTk4OQkyMDA2CS0JQXByCVN1bj49MQkwOjAxCTE6MDAJRAotUnVsZQlTdEpvaG5zCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkwOjAxCTE6MDAJRAotUnVsZQlTdEpvaG5zCTIwMDcJbWF4CS0JTm92CVN1bj49MQkwOjAxCTAJUwotIwotIyBTdCBKb2huJ3MgaGFzIGFuIGFwb3N0cm9waGUsIGJ1dCBQb3NpeCBmaWxlIG5hbWVzIGNhbid0IGhhdmUgYXBvc3Ryb3BoZXMuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvU3RfSm9obnMJLTM6MzA6NTIgLQlMTVQJMTg4NAotCQkJLTM6MzA6NTIgU3RKb2hucyBOJXNUCTE5MTgKLQkJCS0zOjMwOjUyIENhbmFkYQlOJXNUCTE5MTkKLQkJCS0zOjMwOjUyIFN0Sm9obnMgTiVzVAkxOTM1IE1hciAzMAotCQkJLTM6MzAJU3RKb2hucwlOJXNUCTE5NDIgTWF5IDExCi0JCQktMzozMAlDYW5hZGEJTiVzVAkxOTQ2Ci0JCQktMzozMAlTdEpvaG5zCU4lc1QKLQotIyBtb3N0IG9mIGVhc3QgTGFicmFkb3IKLQotIyBUaGUgbmFtZSBgSGFwcHkgVmFsbGV5LUdvb3NlIEJheScgaXMgdG9vIGxvbmc7IHVzZSBgR29vc2UgQmF5Jy4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Hb29zZV9CYXkJLTQ6MDE6NDAgLQlMTVQJMTg4NCAjIEhhcHB5IFZhbGxleS1Hb29zZSBCYXkKLQkJCS0zOjMwOjUyIC0JTlNUCTE5MTgKLQkJCS0zOjMwOjUyIENhbmFkYSBOJXNUCTE5MTkKLQkJCS0zOjMwOjUyIC0JTlNUCTE5MzUgTWFyIDMwCi0JCQktMzozMAktCU5TVAkxOTM2Ci0JCQktMzozMAlTdEpvaG5zCU4lc1QJMTk0MiBNYXkgMTEKLQkJCS0zOjMwCUNhbmFkYQlOJXNUCTE5NDYKLQkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTY2IE1hciAxNSAyOjAwCi0JCQktNDowMAlTdEpvaG5zCUElc1QKLQotCi0jIHdlc3QgTGFicmFkb3IsIE5vdmEgU2NvdGlhLCBQcmluY2UgRWR3YXJkIEkKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgc2luY2UgMTk3MCBtb3N0IG9mIHRoaXMgcmVnaW9uIGhhcyBiZWVuIGxpa2UKLSMgSGFsaWZheC4gIE1hbnkgbG9jYWxlcyBkaWQgbm90IG9ic2VydmUgcGVhY2V0aW1lIERTVCB1bnRpbCAxOTcyOwotIyBHbGFjZSBCYXksIE5TIGlzIHRoZSBsYXJnZXN0IHRoYXQgd2Uga25vdyBvZi4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGFsc28gd3JpdGUgdGhhdCBMaXZlcnBvb2wsIE5TIHdhcyB0aGUgb25seSB0b3duCi0jIGluIENhbmFkYSB0byBvYnNlcnZlIERTVCBpbiAxOTcxIGJ1dCBub3QgMTk3MDsgZm9yIG5vdyB3ZSdsbCBhc3N1bWUKLSMgdGhpcyBpcyBhIHR5cG8uCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUhhbGlmYXgJMTkxNglvbmx5CS0JQXByCSAxCTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkyMAlvbmx5CS0JTWF5CSA5CTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkyMAlvbmx5CS0JQXVnCTI5CTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkyMQlvbmx5CS0JTWF5CSA2CTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkyMQkxOTIyCS0JU2VwCSA1CTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkyMglvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkyMwkxOTI1CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjMJb25seQktCVNlcAkgNAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjQJb25seQktCVNlcAkxNQkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjUJb25seQktCVNlcAkyOAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjYJb25seQktCU1heQkxNgkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjYJb25seQktCVNlcAkxMwkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjcJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjcJb25seQktCVNlcAkyNgkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjgJMTkzMQktCU1heQlTdW4+PTgJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTI4CW9ubHkJLQlTZXAJIDkJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI5CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTMwCW9ubHkJLQlTZXAJMTUJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTMxCTE5MzIJLQlTZXAJTW9uPj0yNAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzIJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MzMJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MzMJb25seQktCU9jdAkgMgkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzQJb25seQktCU1heQkyMAkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MzQJb25seQktCVNlcAkxNgkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzUJb25seQktCUp1bgkgMgkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MzUJb25seQktCVNlcAkzMAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzYJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MzYJb25seQktCVNlcAkxNAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzcJMTkzOAktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTM3CTE5NDEJLQlTZXAJTW9uPj0yNAkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MzkJb25seQktCU1heQkyOAkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5NDAJMTk0MQktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTQ2CTE5NDkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5NDYJMTk0OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTk1MQkxOTU0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTUxCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5NTYJMTk1OQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTk1NgkxOTU5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTYyCTE5NzMJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5NjIJMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSGFsaWZheAktNDoxNDoyNCAtCUxNVAkxOTAyIEp1biAxNQotCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5MTgKLQkJCS00OjAwCUNhbmFkYQlBJXNUCTE5MTkKLQkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTk0NgotCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5NzQKLQkJCS00OjAwCUNhbmFkYQlBJXNUCi1ab25lIEFtZXJpY2EvR2xhY2VfQmF5CS0zOjU5OjQ4IC0JTE1UCTE5MDIgSnVuIDE1Ci0JCQktNDowMAlDYW5hZGEJQSVzVAkxOTUzCi0JCQktNDowMAlIYWxpZmF4CUElc1QJMTk1NAotCQkJLTQ6MDAJLQlBU1QJMTk3MgotCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5NzQKLQkJCS00OjAwCUNhbmFkYQlBJXNUCi0KLSMgTmV3IEJydW5zd2ljawotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDEtMzEpOgotIyBUaGUgVGltZSBEZWZpbml0aW9uIEFjdCA8aHR0cDovL3d3dy5nbmIuY2EvMDA2Mi9QREYtYWN0cy90LTA2LnBkZj4KLSMgc2F5cyB0aGV5IGNoYW5nZWQgYXQgMDA6MDEgdGhyb3VnaCAyMDA2LCBhbmQKLSMgPGh0dHA6Ly93d3cuY2FubGlpLm9yZy9uYi9sYXdzL3N0YS90LTYvMjAwMzAxMjcvd2hvbGUuaHRtbD4gbWFrZXMgaXQKLSMgY2xlYXIgdGhhdCB0aGlzIHdhcyB0aGUgY2FzZSBzaW5jZSBhdCBsZWFzdCAxOTkzLgotIyBGb3Igbm93LCBhc3N1bWUgaXQgc3RhcnRlZCBpbiAxOTkzLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlNb25jdG9uCTE5MzMJMTkzNQktCUp1bglTdW4+PTgJMTowMAkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTMzCTE5MzUJLQlTZXAJU3VuPj04CTE6MDAJMAlTCi1SdWxlCU1vbmN0b24JMTkzNgkxOTM4CS0JSnVuCVN1bj49MQkxOjAwCTE6MDAJRAotUnVsZQlNb25jdG9uCTE5MzYJMTkzOAktCVNlcAlTdW4+PTEJMTowMAkwCVMKLVJ1bGUJTW9uY3RvbgkxOTM5CW9ubHkJLQlNYXkJMjcJMTowMAkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTM5CTE5NDEJLQlTZXAJU2F0Pj0yMQkxOjAwCTAJUwotUnVsZQlNb25jdG9uCTE5NDAJb25seQktCU1heQkxOQkxOjAwCTE6MDAJRAotUnVsZQlNb25jdG9uCTE5NDEJb25seQktCU1heQkgNAkxOjAwCTE6MDAJRAotUnVsZQlNb25jdG9uCTE5NDYJMTk3MgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU1vbmN0b24JMTk0NgkxOTU2CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTW9uY3RvbgkxOTU3CTE5NzIJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlNb25jdG9uCTE5OTMJMjAwNgktCUFwcglTdW4+PTEJMDowMQkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTkzCTIwMDYJLQlPY3QJbGFzdFN1bgkwOjAxCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01vbmN0b24JLTQ6MTk6MDggLQlMTVQJMTg4MyBEZWMgIDkKLQkJCS01OjAwCS0JRVNUCTE5MDIgSnVuIDE1Ci0JCQktNDowMAlDYW5hZGEJQSVzVAkxOTMzCi0JCQktNDowMAlNb25jdG9uCUElc1QJMTk0MgotCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTk0NgotCQkJLTQ6MDAJTW9uY3RvbglBJXNUCTE5NzMKLQkJCS00OjAwCUNhbmFkYQlBJXNUCTE5OTMKLQkJCS00OjAwCU1vbmN0b24JQSVzVAkyMDA3Ci0JCQktNDowMAlDYW5hZGEJQSVzVAotCi0jIFF1ZWJlYwotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDctMDkpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgUXVlYmVjIGhhcyBiZWVuCi0jIGxpa2UgTW9udHJlYWwuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6Ci0jIE1hdHRoZXdzIGFuZCBWaW5jZW50ICgxOTk4KSBhbHNvIHdyaXRlIHRoYXQgUXVlYmVjIGVhc3Qgb2YgdGhlIC02MwotIyBtZXJpZGlhbiBpcyBzdXBwb3NlZCB0byBvYnNlcnZlIEFTVCwgYnV0IHJlc2lkZW50cyBhcyBmYXIgZWFzdCBhcwotIyBOYXRhc2hxdWFuIHVzZSBFU1QvRURULCBhbmQgcmVzaWRlbnRzIGVhc3Qgb2YgTmF0YXNocXVhbiB1c2UgQVNULgotIyBJbiAiT2ZmaWNpYWwgdGltZSBpbiBRdWViZWMiIHRoZSBRdWViZWMgZGVwYXJ0bWVudCBvZiBqdXN0aWNlIHdyaXRlcyBpbgotIyBodHRwOi8vd3d3Lmp1c3RpY2UuZ291di5xYy5jYS9lbmdsaXNoL3B1YmxpY2F0aW9ucy9nZW5lcmFsZS90ZW1wcy1yZWdsLTEtYS5odG0KLSMgdGhhdCAiVGhlIHJlc2lkZW50cyBvZiB0aGUgTXVuaWNpcGFsaXR5IG9mIHRoZQotIyBDb3RlLU5vcmQtZHUtR29sZmUtU2FpbnQtTGF1cmVudCBhbmQgdGhlIG11bmljaXBhbGl0aWVzIG9mIFNhaW50LUF1Z3VzdGluLAotIyBCb25uZS1Fc3BlcmFuY2UgYW5kIEJsYW5jLVNhYmxvbiBhcHBseSB0aGUgT2ZmaWNpYWwgVGltZSBBY3QgYXMgaXQgaXMKLSMgd3JpdHRlbiBhbmQgdXNlIEF0bGFudGljIHN0YW5kYXJkIHRpbWUgYWxsIHllYXIgcm91bmQuIFRoZSBzYW1lIGFwcGxpZXMgdG8KLSMgdGhlIHJlc2lkZW50cyBvZiB0aGUgTmF0aXZlIGZhY2lsaXRpZXMgYWxvbmcgdGhlIGxvd2VyIE5vcnRoIFNob3JlLiIKLSMgPGh0dHA6Ly93d3cuYXNzbmF0LnFjLmNhL2VuZy8zN2xlZ2lzbGF0dXJlMi9Qcm9qZXRzLWxvaS9QdWJsaWNzLzA2LWEwMDIuaHRtPgotIyBzYXlzIHRoaXMgY29tbW9uIHByYWN0aWNlIHdhcyBjb2RpZmllZCBpbnRvIGxhdyBhcyBvZiAyMDA3LgotIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgZ3Vlc3MgdGhpcyBwcmFjdGljZSBiZWdhbiBhcm91bmQgMTk3MCwgY29udHJhIHRvCi0jIFNoYW5rcyAmIFBvdHRlbmdlciB3aG8gaGF2ZSB0aGlzIHJlZ2lvbiBvYnNlcnZpbmcgQVNUL0FEVC4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTW9udAkxOTE3CW9ubHkJLQlNYXIJMjUJMjowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTE3CW9ubHkJLQlBcHIJMjQJMDowMAkwCVMKLVJ1bGUJTW9udAkxOTE5CW9ubHkJLQlNYXIJMzEJMjozMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTE5CW9ubHkJLQlPY3QJMjUJMjozMAkwCVMKLVJ1bGUJTW9udAkxOTIwCW9ubHkJLQlNYXkJIDIJMjozMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTIwCTE5MjIJLQlPY3QJU3VuPj0xCTI6MzAJMAlTCi1SdWxlCU1vbnQJMTkyMQlvbmx5CS0JTWF5CSAxCTI6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyMglvbmx5CS0JQXByCTMwCTI6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyNAlvbmx5CS0JTWF5CTE3CTI6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyNAkxOTI2CS0JU2VwCWxhc3RTdW4JMjozMAkwCVMKLVJ1bGUJTW9udAkxOTI1CTE5MjYJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECi0jIFRoZSAxOTI3LXRvLTE5MzcgcnVsZXMgY2FuIGJlIGV4cHJlc3NlZCBtb3JlIHNpbXBseSBhcwotIyBSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECi0jIFJ1bGUJTW9udAkxOTI3CTE5MzcJLQlTZXAJbGFzdFNhdAkyNDowMAkwCVMKLSMgVGhlIHJ1bGVzIGJlbG93IGF2b2lkIHVzZSBvZiAyNDowMAotIyAod2hpY2ggcHJlLTE5OTggdmVyc2lvbnMgb2YgemljIGNhbm5vdCBoYW5kbGUpLgotUnVsZQlNb250CTE5MjcJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyNwkxOTMyCS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJTW9udAkxOTI4CTE5MzEJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MzIJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkzMwkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTMzCW9ubHkJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlNb250CTE5MzQJMTkzOQktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCi1SdWxlCU1vbnQJMTk0NgkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTQ1CTE5NDgJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlNb250CTE5NDkJMTk1MAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU1vbnQJMTk1MQkxOTU2CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTW9udAkxOTU3CTE5NzMJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvQmxhbmMtU2FibG9uIC0zOjQ4OjI4IC0JTE1UCTE4ODQKLQkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NzAKLQkJCS00OjAwCS0JQVNUCi1ab25lIEFtZXJpY2EvTW9udHJlYWwJLTQ6NTQ6MTYgLQlMTVQJMTg4NAotCQkJLTU6MDAJTW9udAlFJXNUCTE5MTgKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5MTkKLQkJCS01OjAwCU1vbnQJRSVzVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk0NgotCQkJLTU6MDAJTW9udAlFJXNUCTE5NzQKLQkJCS01OjAwCUNhbmFkYQlFJXNUCi0KLQotIyBPbnRhcmlvCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNy0wOSk6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IHNpbmNlIDE5NzAgbW9zdCBvZiBPbnRhcmlvIGhhcyBiZWVuIGxpa2UKLSMgVG9yb250by4KLSMgVGh1bmRlciBCYXkgc2tpcHBlZCBEU1QgaW4gMTk3My4KLSMgTWFueSBzbWFsbGVyIGxvY2FsZXMgZGlkIG5vdCBvYnNlcnZlIHBlYWNldGltZSBEU1QgdW50aWwgMTk3NDsKLSMgTmlwaWdvbiAoRVNUKSBhbmQgUmFpbnkgUml2ZXIgKENTVCkgYXJlIHRoZSBsYXJnZXN0IHRoYXQgd2Uga25vdyBvZi4KLSMgRmFyIHdlc3QgT250YXJpbyBpcyBsaWtlIFdpbm5pcGVnOyBmYXIgZWFzdCBRdWViZWMgaXMgbGlrZSBIYWxpZmF4LgotCi0jIEZyb20gTWFyayBCcmFkZXIgKDIwMDMtMDctMjYpOgotIyBbQWNjb3JkaW5nIHRvIHRoZSBUb3JvbnRvIFN0YXJdIE9yaWxsaWEsIE9udGFyaW8sIGFkb3B0ZWQgRFNUCi0jIGVmZmVjdGl2ZSBTYXR1cmRheSwgMTkxMi0wNi0yMiwgMjI6MDA7IHRoZSBhcnRpY2xlIG1lbnRpb25zIHRoYXQKLSMgUG9ydCBBcnRodXIgKG5vdyBwYXJ0IG9mIFRodW5kZXIgQmF5LCBPbnRhcmlvKSBhcyB3ZWxsIGFzIE1vb3NlIEphdwotIyBoYXZlIGFscmVhZHkgZG9uZSBzby4gIEluIE9yaWxsaWEgRFNUIHdhcyB0byBydW4gdW50aWwgU2F0dXJkYXksCi0jIDE5MTItMDgtMzEgKG5vIHRpbWUgbWVudGlvbmVkKSwgYnV0IGl0IHdhcyBtZXQgd2l0aCBjb25zaWRlcmFibGUKLSMgaG9zdGlsaXR5IGZyb20gY2VydGFpbiBzZWdtZW50cyBvZiB0aGUgcHVibGljLCBhbmQgd2FzIHJldm9rZWQgYWZ0ZXIKLSMgb25seSB0d28gd2Vla3MgLS0gSSBjb3BpZWQgaXQgYXMgU2F0dXJkYXksIDE5MTItMDctMDcsIDIyOjAwLCBidXQKLSMgcHJlc3VtYWJseSB0aGF0IHNob3VsZCBiZSAtMDctMDYuICAoMTkxMi0wNi0xOSwgLTA3LTEyOyBhbHNvIGxldHRlcnMKLSMgZWFybGllciBpbiBKdW5lKS4KLSMKLSMgS2Vub3JhLCBPbnRhcmlvLCB3YXMgdG8gYWJhbmRvbiBEU1Qgb24gMTkxNC0wNi0wMSAoLTA1LTIxKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk3LTEwLTE3KToKLSMgTWFyayBCcmFkZXIgd3JpdGVzIHRoYXQgYW4gYXJ0aWNsZSBpbiB0aGUgMTk5Ny0xMC0xNCBUb3JvbnRvIFN0YXIKLSMgc2F5cyB0aGF0IEF0aWtva2FuLCBPbnRhcmlvIGN1cnJlbnRseSBkb2VzIG5vdCBvYnNlcnZlIERTVCwKLSMgYnV0IHdpbGwgdm90ZSBvbiAxMS0xMCB3aGV0aGVyIHRvIHVzZSBFU1QvRURULgotIyBIZSBhbHNvIHdyaXRlcyB0aGF0IHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbCI+Ci0jIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQotIyA8L2E+Ci0jIHNheXMgdGhhdCBPbnRhcmlvIGVhc3Qgb2YgOTBXIHVzZXMgRVNUL0VEVCwgYW5kIHdlc3Qgb2YgOTBXIHVzZXMgQ1NUL0NEVC4KLSMgT2ZmaWNpYWxseSBBdGlrb2thbiBpcyB0aGVyZWZvcmUgb24gQ1NUL0NEVCwgYW5kIG1vc3QgbGlrZWx5IHRoaXMgcmVwb3J0Ci0jIGNvbmNlcm5zIGEgbm9uLW9mZmljaWFsIHRpbWUgb2JzZXJ2ZWQgYXMgYSBtYXR0ZXIgb2YgbG9jYWwgcHJhY3RpY2UuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBBdGlrb2thbiwgUGlja2xlIExha2UsIGFuZAotIyBOZXcgT3NuYWJ1cmdoIG9ic2VydmUgQ1NUIGFsbCB5ZWFyLCB0aGF0IEJpZyBUcm91dCBMYWtlIG9ic2VydmVzCi0jIENTVC9DRFQsIGFuZCB0aGF0IFVwc2FsYSBhbmQgU2hlYmFuZG93YW4gb2JzZXJ2ZSBFU1QvRURULCBhbGwgaW4KLSMgdmlvbGF0aW9uIG9mIHRoZSBvZmZpY2lhbCBPbnRhcmlvIHJ1bGVzLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA3LTA5KToKLSMgQ2hyaXMgV2FsdG9uICgyMDA2LTA3LTA2KSBtZW50aW9uZWQgYW4gYXJ0aWNsZSBieSBTdGVwaGFuaWUgTWFjTGVsbGFuIGluIHRoZQotIyAyMDA1LTA3LTIxIENocm9uaWNsZS1Kb3VybmFsLCB3aGljaCBzYWlkOgotIwotIwlUaGUgY2xvY2tzIGluIEF0aWtva2FuIHN0YXkgc2V0IG9uIHN0YW5kYXJkIHRpbWUgeWVhci1yb3VuZC4KLSMJVGhpcyBtZWFucyB0aGV5IHNwZW5kIGFib3V0IGhhbGYgdGhlIHRpbWUgb24gY2VudHJhbCB0aW1lIGFuZAotIwl0aGUgb3RoZXIgaGFsZiBvbiBlYXN0ZXJuIHRpbWUuCi0jCi0jCUZvciB0aGUgbW9zdCBwYXJ0LCB0aGUgc3lzdGVtIHdvcmtzLCBNYXlvciBEZW5uaXMgQnJvd24gc2FpZC4KLSMKLSMJIlRoZSBtYWpvcml0eSBvZiBidXNpbmVzc2VzIGluIEF0aWtva2FuIGRlYWwgbW9yZSB3aXRoIEVhc3Rlcm4KLSMJQ2FuYWRhLCBidXQgdGhlcmUgYXJlIHNvbWUgdGhhdCBkZWFsIHdpdGggV2VzdGVybiBDYW5hZGEsIiBoZQotIwlzYWlkLiAgIkkgZG9uJ3Qgc2VlIGFueSBjaGFuZ2VzIGhhcHBlbmluZyBoZXJlLiIKLSMKLSMgV2FsdG9uIGFsc28gd3JpdGVzICJTdXBwb3NlZGx5IFBpY2tsZSBMYWtlIGFuZCBNaXNoa2VlZ29nYW1hbmcKLSMgW05ldyBPc25hYnVyZ2hdIGZvbGxvdyB0aGUgc2FtZSBwcmFjdGljZS4iCi0KLSMgRnJvbSBHYXJyeSBNY0tpbm5vbiAoMjAwNi0wNy0xNCkgdmlhIENocmlzIFdhbHRvbjoKLSMgSSBjaGF0dGVkIHdpdGggYSBtZW1iZXIgb2YgbXkgYm9hcmQgd2hvIGhhcyBhbiBvdXRzdGFuZGluZyBtZW1vcnkKLSMgYW5kIGEgbG9uZyBoaXN0b3J5IGluIEF0aWtva2FuIChhbmQgaW4gdGhlIHRlbGVjb20gaW5kdXN0cnkpIGFuZCBoZQotIyBjYW4gc2F5IGZvciBjZXJ0YWluIHRoYXQgQXRpa29rYW4gaGFzIGJlZW4gcHJhY3RpY2luZyB0aGUgY3VycmVudAotIyB0aW1lIGtlZXBpbmcgc2luY2UgMTk1MiwgYXQgbGVhc3QuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNy0xNyk6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBBdGlrb2thbiBoYXMgYWdyZWVkIHdpdGggUmFpbnkgUml2ZXIKLSMgZXZlciBzaW5jZSBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkLCBidXQgdGhlIGluZm9ybWF0aW9uIGZyb20KLSMgTWNLaW5ub24gc291bmRzIG1vcmUgYXV0aG9yaXRhdGl2ZS4gIEZvciBub3csIGFzc3VtZSB0aGF0IEF0aWtva2FuCi0jIHN3aXRjaGVkIHRvIEVTVCBpbW1lZGlhdGVseSBhZnRlciBXV0lJIGVyYSBkYXlsaWdodCBzYXZpbmcgdGltZQotIyBlbmRlZC4gIFRoaXMgbWF0Y2hlcyB0aGUgb2xkIChsZXNzLXBvcHVsb3VzKSBBbWVyaWNhL0NvcmFsX0hhcmJvdXIKLSMgZW50cnkgc2luY2Ugb3VyIGN1dG9mZiBkYXRlIG9mIDE5NzAsIHNvIHdlIGNhbiBtb3ZlCi0jIEFtZXJpY2EvQ29yYWxfSGFyYm91ciB0byB0aGUgJ2JhY2t3YXJkJyBmaWxlLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUb3JvbnRvCTE5MTkJb25seQktCU1hcgkzMAkyMzozMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTE5CW9ubHkJLQlPY3QJMjYJMDowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlNYXkJIDIJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlTZXAJMjYJMDowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlNYXkJMTUJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlTZXAJMTUJMjowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIyCTE5MjMJLQlNYXkJU3VuPj04CTI6MDAJMTowMAlECi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkyMy0wOS0xOTsgYXNzdW1lIGl0J3MgYSB0eXBvIGFuZCB0aGF0ICItMTYiCi0jIHdhcyBtZWFudC4KLVJ1bGUJVG9yb250bwkxOTIyCTE5MjYJLQlTZXAJU3VuPj0xNQkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5MjQJMTkyNwktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKLSMgVGhlIDE5MjctdG8tMTkzOSBydWxlcyBjYW4gYmUgZXhwcmVzc2VkIG1vcmUgc2ltcGx5IGFzCi0jIFJ1bGUJVG9yb250bwkxOTI3CTE5MzcJLQlTZXAJU3VuPj0yNQkyOjAwCTAJUwotIyBSdWxlCVRvcm9udG8JMTkyOAkxOTM3CS0JQXByCVN1bj49MjUJMjowMAkxOjAwCUQKLSMgUnVsZQlUb3JvbnRvCTE5MzgJMTk0MAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJVG9yb250bwkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotIyBUaGUgcnVsZXMgYmVsb3cgYXZvaWQgdXNlIG9mIFN1bj49MjUKLSMgKHdoaWNoIHByZS0yMDA0IHZlcnNpb25zIG9mIHppYyBjYW5ub3QgaGFuZGxlKS4KLVJ1bGUJVG9yb250bwkxOTI3CTE5MzIJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5MjgJMTkzMQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRvcm9udG8JMTkzMglvbmx5CS0JTWF5CTEJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTMzCTE5NDAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlUb3JvbnRvCTE5MzMJb25seQktCU9jdAkxCTI6MDAJMAlTCi1SdWxlCVRvcm9udG8JMTkzNAkxOTM5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTQ1CTE5NDYJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NDYJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRvcm9udG8JMTk0NwkxOTQ5CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTQ3CTE5NDgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NDkJb25seQktCU5vdglsYXN0U3VuCTA6MDAJMAlTCi1SdWxlCVRvcm9udG8JMTk1MAkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTUwCW9ubHkJLQlOb3YJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NTEJMTk1NgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgVG9yb250byBlbmRlZCBEU1QgYSB3ZWVrIGVhcmx5IGluIDE5NzEsCi0jIG5hbWVseSBvbiAxOTcxLTEwLTI0LCBidXQgTWFyayBCcmFkZXIgd3JvdGUgKDIwMDMtMDUtMzEpIHRoYXQgdGhpcwotIyBpcyB3cm9uZywgYW5kIHRoYXQgaGUgaGFkIGNvbmZpcm1lZCBpdCBieSBjaGVja2luZyB0aGUgMTk3MS0xMC0zMAotIyBUb3JvbnRvIFN0YXIsIHdoaWNoIHNhaWQgdGhhdCBEU1Qgd2FzIGVuZGluZyAxOTcxLTEwLTMxIGFzIHVzdWFsLgotUnVsZQlUb3JvbnRvCTE5NTcJMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wNy0yNyk6Ci0jIFdpbGxldHQgKDE5MTQtMDMpIHdyaXRlcyAocC4gMTcpICJJbiB0aGUgQ2l0aWVzIG9mIEZvcnQgV2lsbGlhbSwgYW5kCi0jIFBvcnQgQXJ0aHVyLCBPbnRhcmlvLCB0aGUgcHJpbmNpcGxlIG9mIHRoZSBCaWxsIGhhcyBiZWVuIGluCi0jIG9wZXJhdGlvbiBmb3IgdGhlIHBhc3QgdGhyZWUgeWVhcnMsIGFuZCBpbiB0aGUgQ2l0eSBvZiBNb29zZSBKYXcsCi0jIFNhc2thdGNoZXdhbiwgZm9yIG9uZSB5ZWFyLiIKLQotIyBGcm9tIERhdmlkIEJyeWFuIHZpYSBUb3J5IFRyb25ydWQsIERpcmVjdG9yL0N1cmF0b3IsCi0jIFRodW5kZXIgQmF5IE11c2V1bSAoMjAwMy0xMS0xMik6Ci0jIFRoZXJlIGlzIHNvbWUgc3VnZ2VzdGlvbiwgaG93ZXZlciwgdGhhdCwgYnktbGF3IG9yIG5vdCwgZGF5bGlnaHQKLSMgc2F2aW5ncyB0aW1lIHdhcyBiZWluZyBwcmFjdGljZWQgaW4gRm9ydCBXaWxsaWFtIGFuZCBQb3J0IEFydGh1cgotIyBiZWZvcmUgMTkwOS4uLi4gW0ldbiAxOTEwLCB0aGUgbGluZSBiZXR3ZWVuIHRoZSBFYXN0ZXJuIGFuZCBDZW50cmFsCi0jIFRpbWUgWm9uZXMgd2FzIHBlcm1hbmVudGx5IG1vdmVkIGFib3V0IHR3byBodW5kcmVkIG1pbGVzIHdlc3QgdG8KLSMgaW5jbHVkZSB0aGUgVGh1bmRlciBCYXkgYXJlYS4uLi4gIFdoZW4gQ2FuYWRhIGFkb3B0ZWQgZGF5bGlnaHQKLSMgc2F2aW5ncyB0aW1lIGluIDE5MTYsIEZvcnQgV2lsbGlhbSBhbmQgUG9ydCBBcnRodXIsIGhhdmluZyBkb25lIHNvCi0jIGFscmVhZHksIGRpZCBub3QgY2hhbmdlIHRoZWlyIGNsb2Nrcy4uLi4gIER1cmluZyB0aGUgU2Vjb25kIFdvcmxkCi0jIFdhciwuLi4gW3RdaGUgY2l0aWVzIGFncmVlZCB0byBpbXBsZW1lbnQgRFNUIGR1cmluZyB0aGUgc3VtbWVyCi0jIG1vbnRocyBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgd2FyIHllYXJzLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvVG9yb250bwktNToxNzozMiAtCUxNVAkxODk1Ci0JCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5Ci0JCQktNTowMAlUb3JvbnRvCUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKLQkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTc0Ci0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL1RodW5kZXJfQmF5IC01OjU3OjAwIC0JTE1UCTE4OTUKLQkJCS02OjAwCS0JQ1NUCTE5MTAKLQkJCS01OjAwCS0JRVNUCTE5NDIKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NzAKLQkJCS01OjAwCU1vbnQJRSVzVAkxOTczCi0JCQktNTowMAktCUVTVAkxOTc0Ci0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL05pcGlnb24JLTU6NTM6MDQgLQlMTVQJMTg5NQotCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk0MCBTZXAgMjkKLQkJCS01OjAwCTE6MDAJRURUCTE5NDIgRmViICA5IDI6MDBzCi0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL1JhaW55X1JpdmVyIC02OjE4OjE2IC0JTE1UCTE4OTUKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTY6MDAJQ2FuYWRhCUMlc1QKLVpvbmUgQW1lcmljYS9BdGlrb2thbgktNjowNjoyOCAtCUxNVAkxODk1Ci0JCQktNjowMAlDYW5hZGEJQyVzVAkxOTQwIFNlcCAyOQotCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDUgU2VwIDMwIDI6MDAKLQkJCS01OjAwCS0JRVNUCi0KLQotIyBNYW5pdG9iYQotCi0jIEZyb20gUm9iIERvdWdsYXMgKDIwMDYtMDQtMDYpOgotIyB0aGUgb2xkIE1hbml0b2JhIFRpbWUgQWN0IC0gYXMgYW1lbmRlZCBieSBCaWxsIDIsIGFzc2VudGVkIHRvCi0jIE1hcmNoIDI3LCAxOTg3IC4uLiBzYWlkIC4uLgotIyAiYmV0d2VlbiB0d28gbydjbG9jayBDZW50cmFsIFN0YW5kYXJkIFRpbWUgaW4gdGhlIG1vcm5pbmcgb2YKLSMgdGhlIGZpcnN0IFN1bmRheSBvZiBBcHJpbCBvZiBlYWNoIHllYXIgYW5kIHR3byBvJ2Nsb2NrIENlbnRyYWwKLSMgU3RhbmRhcmQgVGltZSBpbiB0aGUgbW9ybmluZyBvZiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBuZXh0Ci0jIGZvbGxvd2luZywgb25lIGhvdXIgaW4gYWR2YW5jZSBvZiBDZW50cmFsIFN0YW5kYXJkIFRpbWUuIi4uLgotIyBJIGJlbGlldmUgdGhhdCB0aGUgRW5nbGlzaCBsZWdpc2xhdGlvbiBbb2YgdGhlIG9sZCB0aW1lIGFjdF0gaGFkID0KLSMgYmVlbiBhc3NlbnRlZCB0byAoTWFyY2ggMjIsIDE5NjcpLi4uLgotIyBBbHNvLCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUgd2FzIG5vIG9yZGVyLWluLWNvdW5jaWwgdmFyeWluZwotIyB0aGUgdGltZSBvZiBEYXlsaWdodCBTYXZpbmcgVGltZSBmb3IgMjAwNSBhbmQgc28gdGhlIHByb3Zpc2lvbnMgb2YKLSMgdGhlIDE5ODcgdmVyc2lvbiB3b3VsZCBhcHBseSAtIHRoZSBjaGFuZ2VvdmVyIHdhcyBhdCAyOjAwIENlbnRyYWwKLSMgU3RhbmRhcmQgVGltZSAoaS5lLiBub3QgdW50aWwgMzowMCBDZW50cmFsIERheWxpZ2h0IFRpbWUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMTApOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IE1hbml0b2JhIHN3aXRjaGVkIGF0IDAyOjAwIChub3QgMDI6MDBzKQotIyBzdGFydGluZyAxOTY2LiAgU2luY2UgMDI6MDBzIGlzIGNsZWFybHkgY29ycmVjdCBmb3IgMTk2NyBvbiwgYXNzdW1lCi0jIGl0IHdhcyBhbHNvIDAyOjAwcyBpbiAxOTY2LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlXaW5uCTE5MTYJb25seQktCUFwcgkyMwkwOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MTYJb25seQktCVNlcAkxNwkwOjAwCTAJUwotUnVsZQlXaW5uCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlXaW5uCTE5MzcJb25seQktCU1heQkxNgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MzcJb25seQktCVNlcAkyNgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlXaW5uCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJV2lubgkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDYJb25seQktCU1heQkxMgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDcJMTk0OQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVdpbm4JMTk0NwkxOTQ5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJV2lubgkxOTUwCW9ubHkJLQlNYXkJIDEJMjowMAkxOjAwCUQKLVJ1bGUJV2lubgkxOTUwCW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJV2lubgkxOTUxCTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5NTEJMTk1OAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVdpbm4JMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJV2lubgkxOTYwCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NjMJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVdpbm4JMTk2Mwlvbmx5CS0JU2VwCTIyCTI6MDAJMAlTCi1SdWxlCVdpbm4JMTk2NgkxOTg2CS0JQXByCWxhc3RTdW4JMjowMHMJMTowMAlECi1SdWxlCVdpbm4JMTk2NgkyMDA1CS0JT2N0CWxhc3RTdW4JMjowMHMJMAlTCi1SdWxlCVdpbm4JMTk4NwkyMDA1CS0JQXByCVN1bj49MQkyOjAwcwkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9XaW5uaXBlZwktNjoyODozNiAtCUxNVAkxODg3IEp1bCAxNgotCQkJLTY6MDAJV2lubglDJXNUCTIwMDYKLQkJCS02OjAwCUNhbmFkYQlDJXNUCi0KLQotIyBTYXNrYXRjaGV3YW4KLQotIyBGcm9tIE1hcmsgQnJhZGVyICgyMDAzLTA3LTI2KToKLSMgVGhlIGZpcnN0IGFjdHVhbCBhZG9wdGlvbiBvZiBEU1QgaW4gQ2FuYWRhIHdhcyBhdCB0aGUgbXVuaWNpcGFsCi0jIGxldmVsLiAgQXMgdGhlIFtUb3JvbnRvXSBTdGFyIHB1dCBpdCAoMTkxMi0wNi0wNyksICJXaGlsZSBwZW9wbGUKLSMgZWxzZXdoZXJlIGhhdmUgbG9uZyBiZWVuIHRhbGtpbmcgb2YgbGVnaXNsYXRpb24gdG8gc2F2ZSBkYXlsaWdodCwKLSMgdGhlIGNpdHkgb2YgTW9vc2UgSmF3IFtTYXNrYXRjaGV3YW5dIGhhcyBhY3RlZCBvbiBpdHMgb3duIGhvb2suIgotIyBEU1QgaW4gTW9vc2UgSmF3IGJlZ2FuIG9uIFNhdHVyZGF5LCAxOTEyLTA2LTAxIChubyB0aW1lIG1lbnRpb25lZDoKLSMgcHJlc3VtYWJseSBsYXRlIGV2ZW5pbmcsIGFzIGJlbG93KSwgYW5kIHdvdWxkIHJ1biB1bnRpbCAidGhlIGVuZCBvZgotIyB0aGUgc3VtbWVyIi4gIFRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIG11bmljaXBhbCB0aW1lIGFuZCByYWlscm9hZAotIyB0aW1lIHdhcyBub3RlZC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTA3LTI3KToKLSMgV2lsbGV0dCAoMTkxNC0wMykgbm90ZXMgdGhhdCBEU1QgImhhcyBiZWVuIGluIG9wZXJhdGlvbiAuLi4gaW4gdGhlCi0jIENpdHkgb2YgTW9vc2UgSmF3LCBTYXNrYXRjaGV3YW4sIGZvciBvbmUgeWVhci4iCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzaW5jZSAxOTcwIHRoaXMgcmVnaW9uIGhhcyBtb3N0bHkgYmVlbiBhcyBSZWdpbmEuCi0jIFNvbWUgd2VzdGVybiB0b3ducyAoZS5nLiBTd2lmdCBDdXJyZW50KSBzd2l0Y2hlZCBmcm9tIE1TVC9NRFQgdG8gQ1NUIGluIDE5NzIuCi0jIE90aGVyIHdlc3Rlcm4gdG93bnMgKGUuZy4gTGxveWRtaW5zdGVyKSBhcmUgbGlrZSBFZG1vbnRvbi4KLSMgTWF0dGhld3MgYW5kIFZpbmNlbnQgKDE5OTgpIHdyaXRlIHRoYXQgRGVuYXJlIEJlYWNoIGFuZCBDcmVpZ2h0b24KLSMgYXJlIGxpa2UgV2lubmlwZWcsIGluIHZpb2xhdGlvbiBvZiBTYXNrYXRjaGV3YW4gbGF3LgotCi0jIEZyb20gVy4gSm9uZXMgKDE5OTItMTEtMDYpOgotIyBUaGUuIC4gLmJlbG93IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIEkgZ290IGZyb20gb3VyIGxhdyBsaWJyYXJ5LCB0aGUKLSMgcHJvdmluY2lhbCBhcmNoaXZlcywgYW5kIHRoZSBwcm92aW5jaWFsIENvbW11bml0eSBTZXJ2aWNlcyBkZXBhcnRtZW50LgotIyBBIHByZWNpc2UgaGlzdG9yeSB3b3VsZCByZXF1aXJlIGRpZ2dpbmcgdGhyb3VnaCBuZXdzcGFwZXIgYXJjaGl2ZXMsIGFuZAotIyBzaW5jZSB5b3UgZGlkbid0IHNheSB3aGF0IHlvdSB3YW50ZWQsIEkgZGlkbid0IGJvdGhlci4KLSMKLSMgU2Fza2F0Y2hld2FuIGlzIHNwbGl0IGJ5IGEgdGltZSB6b25lIG1lcmlkaWFuICgxMDVXKSBhbmQgb3ZlciB0aGUgeWVhcnMKLSMgdGhlIGJvdW5kYXJ5IGJlY2FtZSBwcmV0dHkgcmFnZ2VkIGFzIGNvbW11bml0aWVzIG5lYXIgaXQgcmVldmFsdWF0ZWQKLSMgdGhlaXIgYWZmaWxpYXRpb25zIGluIG9uZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLiAgSW4gMTk2NSBhIHByb3ZpbmNpYWwKLSMgcmVmZXJlbmR1bSBmYXZvdXJlZCBsZWdpc2xhdGluZyBjb21tb24gdGltZSBwcmFjdGljZXMuCi0jCi0jIE9uIDE1IEFwcmlsIDE5NjYgdGhlIFRpbWUgQWN0IChjLiBULTE0LCBSZXZpc2VkIFN0YXR1dGVzIG9mCi0jIFNhc2thdGNoZXdhbiAxOTc4KSB3YXMgcHJvY2xhaW1lZCwgYW5kIGVzdGFibGlzaGVkIHRoYXQgdGhlIGVhc3Rlcm4KLSMgcGFydCBvZiBTYXNrYXRjaGV3YW4gd291bGQgdXNlIENTVCB5ZWFyIHJvdW5kLCB0aGF0IGRpc3RyaWN0cyBpbgotIyBub3J0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkIGJ5IGRlZmF1bHQgZm9sbG93IENTVCBidXQgY291bGQgb3B0IHRvCi0jIGZvbGxvdyBNb3VudGFpbiBUaW1lIHJ1bGVzICh0aHVzIDEgaG91ciBkaWZmZXJlbmNlIGluIHRoZSB3aW50ZXIgYW5kCi0jIHplcm8gaW4gdGhlIHN1bW1lciksIGFuZCB0aGF0IGRpc3RyaWN0cyBpbiBzb3V0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkCi0jIGJ5IGRlZmF1bHQgZm9sbG93IE1UIGJ1dCBjb3VsZCBvcHQgdG8gZm9sbG93IENTVC4KLSMKLSMgSXQgdG9vayBhIGZldyB5ZWFycyBmb3IgdGhlIGR1c3QgdG8gc2V0dGxlIChJIGtub3cgb25lIHN0b3J5IG9mIGEgdG93bgotIyBvbiBvbmUgdGltZSB6b25lIGhhdmluZyBpdHMgc2Nob29sIGluIGFub3RoZXIsIHN1Y2ggdGhhdCBhIG1vbSBoYWQgdG8KLSMgc2VydmUgaGVyIGZhbWlseSBsdW5jaCBpbiB0d28gc2hpZnRzKSwgYnV0IHByZXNlbnRseSBpdCBzZWVtcyB0aGF0IG9ubHkKLSMgYSBmZXcgdG93bnMgb24gdGhlIGJvcmRlciB3aXRoIEFsYmVydGEgKGUuZy4gTGxveWRtaW5zdGVyKSBmb2xsb3cgTVQKLSMgcnVsZXMgYW55IG1vcmU7IGFsbCBvdGhlciBkaXN0cmljdHMgYXBwZWFyIHRvIGhhdmUgdXNlZCBDU1QgeWVhciByb3VuZAotIyBzaW5jZSBzb21ldGltZSBpbiB0aGUgMTk2MHMuCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDYtMDYtMjYpOgotIyBUaGUgU2Fza2F0Y2hld2FuIHRpbWUgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk5NiBpcyBhYm91dCAzMCBwYWdlcwotIyBsb25nIGFuZCByYXRoZXIgcGFpbmZ1bCB0byByZWFkLgotIyBodHRwOi8vd3d3LnFwLmdvdi5zay5jYS9kb2N1bWVudHMvRW5nbGlzaC9TdGF0dXRlcy9TdGF0dXRlcy9UMTQucGRmCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVJlZ2luYQkxOTE4CW9ubHkJLQlBcHIJMTQJMjowMAkxOjAwCUQKLVJ1bGUJUmVnaW5hCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JT2N0CVN1bj49MQkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzNwkxOTQxCS0JQXByCVN1bj49OAkwOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTkzNwlvbmx5CS0JT2N0CVN1bj49OAkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzOAlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzOQkxOTQxCS0JT2N0CVN1bj49OAkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0Mglvbmx5CS0JRmViCSA5CTI6MDAJMTowMAlXICMgV2FyCi1SdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlBdWcJMTQJMjM6MDB1CTE6MDAJUCAjIFBlYWNlCi1SdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JT2N0CVN1bj49OAkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0NwkxOTU3CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJUmVnaW5hCTE5NDcJMTk1NwktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVJlZ2luYQkxOTU5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMKLVJ1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3dpZnQJMTk1OQkxOTYxCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3dpZnQJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3dpZnQJMTk2MAkxOTYxCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9SZWdpbmEJLTY6NTg6MzYgLQlMTVQJMTkwNSBTZXAKLQkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NjAgQXByIGxhc3RTdW4gMjowMAotCQkJLTY6MDAJLQlDU1QKLVpvbmUgQW1lcmljYS9Td2lmdF9DdXJyZW50IC03OjExOjIwIC0JTE1UCTE5MDUgU2VwCi0JCQktNzowMAlDYW5hZGEJTSVzVAkxOTQ2IEFwciBsYXN0U3VuIDI6MDAKLQkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NTAKLQkJCS03OjAwCVN3aWZ0CU0lc1QJMTk3MiBBcHIgbGFzdFN1biAyOjAwCi0JCQktNjowMAktCUNTVAotCi0KLSMgQWxiZXJ0YQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlFZG0JMTkxOAkxOTE5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlFZG0JMTkxOAlvbmx5CS0JT2N0CTMxCTI6MDAJMAlTCi1SdWxlCUVkbQkxOTE5CW9ubHkJLQlNYXkJMjcJMjowMAkwCVMKLVJ1bGUJRWRtCTE5MjAJMTkyMwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTIwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlFZG0JMTkyMQkxOTIzCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlFZG0JMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQotUnVsZQlFZG0JMTk0NQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NDcJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTQ3CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlFZG0JMTk2Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJRWRtCTE5NjcJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUVkbQkxOTY5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlFZG0JMTk2OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NzIJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTcyCTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0VkbW9udG9uCS03OjMzOjUyIC0JTE1UCTE5MDYgU2VwCi0JCQktNzowMAlFZG0JTSVzVAkxOTg3Ci0JCQktNzowMAlDYW5hZGEJTSVzVAotCi0KLSMgQnJpdGlzaCBDb2x1bWJpYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgdGhpcyByZWdpb24gaGFzCi0jIGJlZW4gbGlrZSBWYW5jb3V2ZXIuCi0jIERhd3NvbiBDcmVlayB1c2VzIE1TVC4gIE11Y2ggb2YgZWFzdCBCQyBpcyBsaWtlIEVkbW9udG9uLgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBDcmVzdG9uIGlzIGxpa2UgRGF3c29uIENyZWVrLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlWYW5jCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlWYW5jCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlWYW5jCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlWYW5jCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJVmFuYwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJVmFuYwkxOTQ2CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlWYW5jCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUwotUnVsZQlWYW5jCTE5NDcJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVZhbmMJMTk2MgkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9WYW5jb3V2ZXIJLTg6MTI6MjggLQlMTVQJMTg4NAotCQkJLTg6MDAJVmFuYwlQJXNUCTE5ODcKLQkJCS04OjAwCUNhbmFkYQlQJXNUCi1ab25lIEFtZXJpY2EvRGF3c29uX0NyZWVrIC04OjAwOjU2IC0JTE1UCTE4ODQKLQkJCS04OjAwCUNhbmFkYQlQJXNUCTE5NDcKLQkJCS04OjAwCVZhbmMJUCVzVAkxOTcyIEF1ZyAzMCAyOjAwCi0JCQktNzowMAktCU1TVAotCi0KLSMgTm9ydGh3ZXN0IFRlcnJpdG9yaWVzLCBOdW5hdnV0LCBZdWtvbgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBEYXdzb24gc3dpdGNoZWQgdG8gUFNUIGluIDE5NzMuICBJbnV2aWsgc3dpdGNoZWQgdG8gTVNUIGluIDE5NzkuCi0jIE1hdGhldyBFbmdsYW5kZXIgKDE5OTYtMTAtMDcpIGdpdmVzIHRoZSBmb2xsb3dpbmcgcmVmczoKLSMJKiAxOTY3LiBQYXJhZ3JhcGggMjgoMzQpKGcpIG9mIHRoZSBJbnRlcnByZXRhdGlvbiBBY3QsIFMuQy4gMTk2Ny02OCwKLSMJYy4gNyBkZWZpbmVzIFl1a29uIHN0YW5kYXJkIHRpbWUgYXMgVVRDLTkuICBUaGlzIGlzIHN0aWxsIHZhbGlkOwotIwlzZWUgSW50ZXJwcmV0YXRpb24gQWN0LCBSLlMuQy4gMTk4NSwgYy4gSS0yMSwgcy4gMzUoMSkuCi0jCSogQy5PLiAxOTczLzIxNCBzd2l0Y2hlZCBZdWtvbiB0byBQU1Qgb24gMTk3My0xMC0yOCAwMDowMC4KLSMJKiBPLkkuQy4gMTk4MC8wMiBlc3RhYmxpc2hlZCBEU1QuCi0jCSogTy5JLkMuIDE5ODcvMDU2IGNoYW5nZWQgRFNUIHRvIEFwciBmaXJzdFN1biAyOjAwIHRvIE9jdCBsYXN0U3VuIDI6MDAuCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgWXVrb24ncyAxOTczLTEwLTI4IHN3aXRjaCB3YXMgYXQgMjowMDsgZ28KLSMgd2l0aCBFbmdsYW5kZXIuCi0jIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA2LTI2KToKLSMgSGVyZSBpcyBhIGxpbmsgdG8gdGhlIG9sZCBkYXlsaWdodCBzYXZpbmcgcG9ydGlvbiBvZiB0aGUgaW50ZXJwcmV0YXRpb24KLSMgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk4NzoKLSMgaHR0cDovL3d3dy5nb3YueWsuY2EvbGVnaXNsYXRpb24vcmVncy9vaWMxOTg3XzA1Ni5wZGYKLQotIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTA5LTA0KToKLSMgTnVuYXZ1dCAuLi4gbW92ZWQgLi4uIHRvIGluY29ycG9yYXRlIHRoZSB3aG9sZSB0ZXJyaXRvcnkgaW50byBvbmUgdGltZSB6b25lLgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vbnVuYXZ1dC9udnQ5MDkwM18xMy5odG1sIj4KLSMgTnVuYXZ1dCBtb3ZlcyB0byBzaW5nbGUgdGltZSB6b25lIE9jdC4gMzEKLSMgPC9hPgotIwotIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5OS0wOS0wNik6Ci0jIFdlIHRoZW4gbmVlZCB0byBjcmVhdGUgYSBuZXcgdGltZXpvbmUgZm9yIHRoZSBLaXRpa21lb3QgcmVnaW9uIG9mIE51bmF2dXQKLSMgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBZZWxsb3drbmlmZSByZWdpb24uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sIj4KLSMgQmFzaWMgRmFjdHM6IFRoZSBOZXcgVGVycml0b3J5Ci0jIDwvYT4gKDE5OTkpIHJlcG9ydHMgdGhhdCBQYW5nbmlydHVuZyBvcGVyYXRlcyBvbiBlYXN0ZXJuIHRpbWUsCi0jIGFuZCB0aGF0IENvcmFsIEhhcmJvdXIgZG9lcyBub3Qgb2JzZXJ2ZSBEU1QuICBXZSBkb24ndCBrbm93IHdoZW4KLSMgUGFuZ25pcnR1bmcgc3dpdGNoZWQgdG8gZWFzdGVybiB0aW1lOyB3ZSdsbCBndWVzcyAxOTk1LgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDgpOgotIyBPbiBPY3RvYmVyIDMxLCB3aGVuIHRoZSByZXN0IG9mIE51bmF2dXQgd2VudCB0byBDZW50cmFsIHRpbWUsCi0jIFBhbmduaXJ0dW5nIHdvYmJsZWQuICBIZXJlIGlzIHRoZSByZXN1bHQgb2YgdGhlaXIgd29iYmxlOgotIwotIyBUaGUgZm9sbG93aW5nIGJ1c2luZXNzZXMgYW5kIG9yZ2FuaXphdGlvbnMgaW4gUGFuZ25pcnR1bmcgdXNlIENlbnRyYWwgVGltZToKLSMKLSMJRmlyc3QgQWlyLCBQb3dlciBDb3JwLCBOdW5hdnV0IENvbnN0cnVjdGlvbiwgSGVhbHRoIENlbnRlciwgUkNNUCwKLSMJRWFzdGVybiBBcmN0aWMgTmF0aW9uYWwgUGFya3MsIEEgJiBEIFNwZWNpYWxpc3QKLSMKLSMgVGhlIGZvbGxvd2luZyBidXNpbmVzc2VzIGFuZCBvcmdhbml6YXRpb25zIGluIFBhbmduaXJ0dW5nIHVzZSBFYXN0ZXJuIFRpbWU6Ci0jCi0jCUhhbWxldCBvZmZpY2UsIEFsbCBvdGhlciBidXNpbmVzc2VzLCBCb3RoIHNjaG9vbHMsIEFpcnBvcnQgb3BlcmF0b3IKLSMKLSMgVGhpcyBoYXMgbWFkZSBmb3IgYW4gaW50ZXJlc3Rpbmcgc2l0dWF0aW9uIHRoZXJlLCB3aGljaCB3YXJyYW50ZWQgdGhlIG5ld3MuCi0jIE5vIG9uZSB0aGVyZSB0aGF0IEkgc3Bva2Ugd2l0aCBzZWVtcyBjb25jZXJuZWQsIG9yIGhhcyBwbGFucyB0bwotIyBjaGFuZ2UgdGhlIGxvY2FsIG1ldGhvZHMgb2Yga2VlcGluZyB0aW1lLCBhcyBpdCBldmlkZW50bHkgZG9lcyBub3QKLSMgcmVhbGx5IGludGVyZmVyZSB3aXRoIGFueSBhY3Rpdml0aWVzIG9yIG1ha2UgdGhpbmdzIGRpZmZpY3VsdCBsb2NhbGx5LgotIyBUaGV5IHBsYW4gdG8gY2VsZWJyYXRlIE5ldyBZZWFyJ3MgdHVybi1vdmVyIHR3aWNlLCBvbmUgaG91ciBhcGFydCwKLSMgc28gaXQgYXBwZWFycyB0aGF0IHRoZSBzaXR1YXRpb24gd2lsbCBsYXN0IGF0IGxlYXN0IHRoYXQgbG9uZy4KLSMgVGhlIE51bmF2dXQgSW50ZXJnb3Zlcm5tZW50YWwgQWZmYWlycyBob3BlcyB0aGF0IHRoZXkgd2lsbCAiY29tZSB0bwotIyB0aGVpciBzZW5zZXMiLCBidXQgdGhlIGxvY2FscyBldmlkZW50bHkgZG9uJ3Qgc2VlIGFueSBwcm9ibGVtIHdpdGgKLSMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycy4KLQotIyBGcm9tIE1pY2hhZWxhIFJvZHJpZ3VlLCB3cml0aW5nIGluIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sIj4KLSMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpPC9hPjoKLSMgQ2x5ZGUgUml2ZXIsIFBhbmduaXJ0dW5nIGFuZCBTYW5pa2lsdWFxIG5vdyBvcGVyYXRlIHdpdGggdHdvIHRpbWUgem9uZXMsCi0jIGNlbnRyYWwgLSBvciBOdW5hdnV0IHRpbWUgLSBmb3IgZ292ZXJubWVudCBvZmZpY2VzLCBhbmQgZWFzdGVybiB0aW1lCi0jIGZvciBtdW5pY2lwYWwgb2ZmaWNlcyBhbmQgc2Nob29scy4uLi4gIElnbG9vbGlrIFt3YXMgc2ltaWxhciBidXQgdGhlbl0KLSMgbWFkZSB0aGUgc3dpdGNoIHRvIGNlbnRyYWwgdGltZSBvbiBTYXR1cmRheSwgTm92LiA2LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgc2F5IHRoZSBmb2xsb3dpbmcsIGJ1dCB3ZSBsYWNrIGhpc3RvcmllcwotIyBmb3IgdGhlc2UgcG90ZW50aWFsIG5ldyBab25lcy4KLSMKLSMgVGhlIENhbmFkaWFuIEZvcmNlcyBzdGF0aW9uIGF0IEFsZXJ0IHVzZXMgRWFzdGVybiBUaW1lIHdoaWxlIHRoZQotIyBoYW5kZnVsIG9mIHJlc2lkZW50cyBhdCB0aGUgRXVyZWthIHdlYXRoZXIgc3RhdGlvbiBbaW4gdGhlIENlbnRyYWwKLSMgem9uZV0gc2tpcCBkYXlsaWdodCBzYXZpbmdzLiAgQmFmZmluIElzbGFuZCwgd2hpY2ggaXMgY3Jvc3NlZCBieSB0aGUKLSMgQ2VudHJhbCwgRWFzdGVybiBhbmQgQXRsYW50aWMgVGltZSB6b25lcyBvbmx5IHVzZXMgRWFzdGVybiBUaW1lLgotIyBHam9hIEhhdmVuLCBUYWxveW9hayBhbmQgUGVsbHkgQmF5IGFsbCB1c2UgTW91bnRhaW4gaW5zdGVhZCBvZgotIyBDZW50cmFsIFRpbWUgYW5kIFNvdXRoYW1wdG9uIElzbGFuZCBbaW4gdGhlIENlbnRyYWwgem9uZV0gaXMgbm90Ci0jIHJlcXVpcmVkIHRvIHVzZSBkYXlsaWdodCBzYXZpbmdzLgotCi0jIEZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL2FyY2hpdmVzL251bmF2dXQwMDExMzAvbnZ0MjExMTBfMDIuaHRtbCI+Ci0jIE51bmF2dXQgbm93IGhhcyB0d28gdGltZSB6b25lcwotIyA8L2E+ICgyMDAwLTExLTEwKToKLSMgVGhlIE51bmF2dXQgZ292ZXJubWVudCB3b3VsZCBhbGxvdyBpdHMgZW1wbG95ZWVzIGluIEt1Z2x1a3R1ayBhbmQKLSMgQ2FtYnJpZGdlIEJheSB0byBvcGVyYXRlIG9uIGNlbnRyYWwgdGltZSB5ZWFyLXJvdW5kLCBwdXR0aW5nIHRoZW0KLSMgb25lIGhvdXIgYmVoaW5kIHRoZSByZXN0IG9mIE51bmF2dXQgZm9yIHNpeCBtb250aHMgZHVyaW5nIHRoZSB3aW50ZXIuCi0jIEF0IHRoZSBlbmQgb2YgT2N0b2JlciB0aGUgdHdvIGNvbW11bml0aWVzIGhhZCByZWJlbGxlZCBhZ2FpbnN0Ci0jIE51bmF2dXQncyB1bmlmaWVkIHRpbWUgem9uZSwgcmVmdXNpbmcgdG8gc2hpZnQgdG8gZWFzdGVybiB0aW1lIHdpdGgKLSMgdGhlIHJlc3Qgb2YgdGhlIHRlcnJpdG9yeSBmb3IgdGhlIHdpbnRlci4gIENhbWJyaWRnZSBCYXkgcmVtYWluZWQgb24KLSMgY2VudHJhbCB0aW1lLCB3aGlsZSBLdWdsdWt0dWssIGV2ZW4gZmFydGhlciB3ZXN0LCByZXZlcnRlZCB0bwotIyBtb3VudGFpbiB0aW1lLCB3aGljaCB0aGV5IGhhZCB1c2VkIGJlZm9yZSB0aGUgYWR2ZW50IG9mIE51bmF2dXQncwotIyB1bmlmaWVkIHRpbWUgem9uZSBpbiAxOTk5LgotIwotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTAxLTIwKSwgcXVvdGluZyB0aGUgTnVuYXZ1dCBnb3Zlcm5tZW50OgotIyBUaGUgcHJlY2VkaW5nIGRlY2lzaW9uIGNhbWUgaW50byBlZmZlY3QgYXQgbWlkbmlnaHQsIFNhdHVyZGF5IE5vdiA0LCAyMDAwLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgotIyBMZXQncyBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIG9mZmljaWFsIHRpbWVzIGZvciBub3cuCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0wMy0wNyk6Ci0jIFRoZSBwcmVtaWVyIG9mIE51bmF2dXQgaGFzIGlzc3VlZCBhIG1pbmlzdGVyaWFsIHN0YXRlbWVudCBhZHZpc2luZwotIyB0aGF0IGVmZmVjdGl2ZSAyMDAxLTA0LTAxLCB0aGUgdGVycml0b3J5IG9mIE51bmF2dXQgd2lsbCByZXZlcnQKLSMgYmFjayB0byB0aHJlZSB0aW1lIHpvbmVzIChtb3VudGFpbiwgY2VudHJhbCwgYW5kIGVhc3Rlcm4pLiAgT2YgdGhlCi0jIGNpdGllcyBpbiBOdW5hdnV0LCBDb3JhbCBIYXJib3IgaXMgdGhlIG9ubHkgb25lIHRoYXQgSSBrbm93IG9mIHRoYXQKLSMgaGFzIHNhaWQgaXQgd2lsbCBub3Qgb2JzZXJ2ZSBkc3QsIHN0YXlpbmcgb24gRVNUIHllYXIgcm91bmQuICBJJ20KLSMgY2hlY2tpbmcgZm9yIG1vcmUgaW5mbywgYW5kIHdpbGwgZ2V0IGJhY2sgdG8geW91IGlmIEkgY29tZSB1cCB3aXRoCi0jIG1vcmUuCi0jIFtBbHNvIHNlZSA8aHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0MTAzMDlfMDYuaHRtbD4gKDIwMDEtMDMtMDkpLl0KLQotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA1LTIxKToKLSMgQWNjb3JkaW5nIHRvIG1hcHMgYXQKLSMgaHR0cDovL2lubXMtaWVubS5ucmMtY25yYy5nYy5jYS9pbWFnZXMvdGltZV9zZXJ2aWNlcy9UWjAxU1dFLmpwZwotIyBodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2ltYWdlcy90aW1lX3NlcnZpY2VzL1RaMDFTU0UuanBnCi0jIChib3RoIGRhdGVkIDIwMDMpLCBhbmQKLSMgaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwCi0jIChmcm9tIGEgMTk5OCBDYW5hZGlhbiBHZW9ncmFwaGljIGFydGljbGUpLCB0aGUgZGUgZmFjdG8gYW5kIGRlIGp1cmUgdGltZQotIyBmb3IgU291dGhhbXB0b24gSXNsYW5kIChhdCB0aGUgbm9ydGggZW5kIG9mIEh1ZHNvbiBCYXkpIGlzIFVUQy01IGFsbCB5ZWFyCi0jIHJvdW5kLiAgVXNpbmcgR29vZ2xlLCBpdCdzIGVhc3kgdG8gZmluZCBvdGhlciB3ZWJzaXRlcyB0aGF0IGNvbmZpcm0gdGhpcy4KLSMgSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGhvdyBmYXIgYmFjayB0aGlzIHRpbWUgcmVnaW1lbiBnb2VzLCBidXQgc2luY2UgaXQKLSMgcHJlZGF0ZXMgdGhlIGNyZWF0aW9uIG9mIE51bmF2dXQsIGl0IHByb2JhYmx5IGdvZXMgYmFjayBtYW55IHllYXJzLi4uLgotIyBUaGUgSW51a3RpdHV0IG5hbWUgb2YgQ29yYWwgSGFyYm91ciBpcyBTYWxsaXQsIGJ1dCBpdCdzIHJhcmVseSB1c2VkLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA3LTI2KToKLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBhc3N1bWUgdGhhdCBTb3V0aGFtcHRvbiBJc2xhbmQgb2JzZXJ2ZWQKLSMgZGF5bGlnaHQgc2F2aW5nIG9ubHkgZHVyaW5nIHdhcnRpbWUuCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMDEpOgotIyAuLi4gdGhlIGNvbW11bml0eSBvZiBSZXNvbHV0ZSAobG9jYXRlZCBvbiBDb3Jud2FsbGlzIElzbGFuZCBpbgotIyBOdW5hdnV0KSBtb3ZlZCBmcm9tIENlbnRyYWwgVGltZSB0byBFYXN0ZXJuIFRpbWUgbGFzdCBOb3ZlbWJlci4KLSMgQmFzaWNhbGx5IHRoZSBjb21tdW5pdHkgZGlkIG5vdCBjaGFuZ2UgaXRzIGNsb2NrcyBhdCB0aGUgZW5kIG9mCi0jIGRheWxpZ2h0IHNhdmluZy4uLi4KLSMgaHR0cDovL3d3dy5ubnNsLmNvbS9mcmFtZXMvbmV3c3BhcGVycy8yMDA2LTExL25vdjEzXzA2bm9uZS5odG1sCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMTQpOgotIyBUb2RheSBJIHBob25lZCB0aGUgImhhbWxldCBvZmZpY2UiIHRvIGZpbmQgb3V0IHdoYXQgUmVzb2x1dGUgd2FzIGRvaW5nIHdpdGgKLSMgaXRzIGNsb2Nrcy4KLSMKLSMgVGhlIGluZGl2aWR1YWwgdGhhdCBhbnN3ZXJlZCB0aGUgcGhvbmUgY29uZmlybWVkIHRoYXQgdGhlIGNsb2NrcyBkaWQgbm90Ci0jIG1vdmUgYXQgdGhlIGVuZCBvZiBkYXlsaWdodCBzYXZpbmcgb24gT2N0b2JlciAyOS8yMDA2LiAgSGUgYWxzbyB0b2xkIG1lIHRoYXQKLSMgdGhlIGNsb2NrcyBkaWQgbm90IG1vdmUgdGhpcyBwYXN0IHdlZWtlbmQgKE1hcmNoIDExLzIwMDcpLi4uLgotIwotIyBBbWVyaWNhL1Jlc29sdXRlIHNob3VsZCB1c2UgdGhlICJDYW5hZGEiIFJ1bGUgdXAgdG8gT2N0b2JlciAyOS8yMDA2LgotIyBBZnRlciB0aGF0IGl0IHNob3VsZCBiZSBmaXhlZCBvbiBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgdW50aWwgZnVydGhlciBub3RpY2UuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5UX1lLCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlOVF9ZSwkxOTE4CW9ubHkJLQlPY3QJMjcJMjowMAkwCVMKLVJ1bGUJTlRfWUsJMTkxOQlvbmx5CS0JTWF5CTI1CTI6MDAJMTowMAlECi1SdWxlCU5UX1lLCTE5MTkJb25seQktCU5vdgkgMQkwOjAwCTAJUwotUnVsZQlOVF9ZSwkxOTQyCW9ubHkJLQlGZWIJIDkJMjowMAkxOjAwCVcgIyBXYXIKLVJ1bGUJTlRfWUsJMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQotUnVsZQlOVF9ZSwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJTlRfWUsJMTk2NQlvbmx5CS0JQXByCWxhc3RTdW4JMDowMAkyOjAwCURECi1SdWxlCU5UX1lLCTE5NjUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU5UX1lLCTE5ODAJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU5UX1lLCTE5ODAJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU5UX1lLCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgYWthIFBhbm5pcXR1dXEKLVpvbmUgQW1lcmljYS9QYW5nbmlydHVuZyAwCS0Jenp6CTE5MjEgIyB0cmFkaW5nIHBvc3QgZXN0LgotCQkJLTQ6MDAJTlRfWUsJQSVzVAkxOTk1IEFwciBTdW4+PTEgMjowMAotCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk5OSBPY3QgMzEgMjowMAotCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMjAwMCBPY3QgMjkgMjowMAotCQkJLTU6MDAJQ2FuYWRhCUUlc1QKLSMgZm9ybWVybHkgRnJvYmlzaGVyIEJheQotWm9uZSBBbWVyaWNhL0lxYWx1aXQJMAktCXp6egkxOTQyIEF1ZyAjIEZyb2Jpc2hlciBCYXkgZXN0LgotCQkJLTU6MDAJTlRfWUsJRSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCi0JCQktNTowMAlDYW5hZGEJRSVzVAotIyBha2EgUWF1c3VpdHR1cQotWm9uZSBBbWVyaWNhL1Jlc29sdXRlCTAJLQl6enoJMTk0NyBBdWcgMzEgIyBSZXNvbHV0ZSBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDYgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCi0jIGFrYSBLYW5naXFpbmlxCi1ab25lIEFtZXJpY2EvUmFua2luX0lubGV0IDAJLQl6enoJMTk1NyAjIFJhbmtpbiBJbmxldCBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCi0jIGFrYSBJcWFsdWt0dXV0dGlhcQotWm9uZSBBbWVyaWNhL0NhbWJyaWRnZV9CYXkgMAktCXp6egkxOTIwICMgdHJhZGluZyBwb3N0IGVzdC4/Ci0JCQktNzowMAlOVF9ZSwlNJXNUCTE5OTkgT2N0IDMxIDI6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDAgTm92ICA1IDA6MDAKLQkJCS02OjAwCS0JQ1NUCTIwMDEgQXByICAxIDM6MDAKLQkJCS03OjAwCUNhbmFkYQlNJXNUCi1ab25lIEFtZXJpY2EvWWVsbG93a25pZmUgMAktCXp6egkxOTM1ICMgWWVsbG93a25pZmUgZm91bmRlZD8KLQkJCS03OjAwCU5UX1lLCU0lc1QJMTk4MAotCQkJLTc6MDAJQ2FuYWRhCU0lc1QKLVpvbmUgQW1lcmljYS9JbnV2aWsJMAktCXp6egkxOTUzICMgSW51dmlrIGZvdW5kZWQKLQkJCS04OjAwCU5UX1lLCVAlc1QJMTk3OSBBcHIgbGFzdFN1biAyOjAwCi0JCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKLQkJCS03OjAwCUNhbmFkYQlNJXNUCi1ab25lIEFtZXJpY2EvV2hpdGVob3JzZQktOTowMDoxMiAtCUxNVAkxOTAwIEF1ZyAyMAotCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTY2IEp1bCAxIDI6MDAKLQkJCS04OjAwCU5UX1lLCVAlc1QJMTk4MAotCQkJLTg6MDAJQ2FuYWRhCVAlc1QKLVpvbmUgQW1lcmljYS9EYXdzb24JLTk6MTc6NDAgLQlMTVQJMTkwMCBBdWcgMjAKLQkJCS05OjAwCU5UX1lLCVklc1QJMTk3MyBPY3QgMjggMDowMAotCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTgwCi0JCQktODowMAlDYW5hZGEJUCVzVAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNZXhpY28KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKLSMgVGhlIEludmVzdGlnYXRpb24gYW5kIEFuYWx5c2lzIFNlcnZpY2Ugb2YgdGhlCi0jIE1leGljYW4gTGlicmFyeSBvZiBDb25ncmVzcyAoTUxvQykgaGFzIHB1Ymxpc2hlZCBhCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvIj4KLSMgaGlzdG9yeSBvZiBNZXhpY2FuIGxvY2FsIHRpbWUgKGluIFNwYW5pc2gpCi0jIDwvYT4uCi0jCi0jIEhlcmUgYXJlIHRoZSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gU2hhbmtzICYgUG90dGVuZ2VyIChTJlApIGFuZCB0aGUgTUxvQy4KLSMgKEluIGFsbCBjYXNlcyB3ZSBnbyB3aXRoIHRoZSBNTG9DLikKLSMgUyZQIHJlcG9ydCB0aGF0IEJhamEgd2FzIGF0IC04OjAwIGluIDE5MjIvMTkyMy4KLSMgUyZQIHNheSB0aGUgMTkzMCB0cmFuc2l0aW9uIGluIEJhamEgd2FzIDE5MzAtMTEtMTYuCi0jIFMmUCByZXBvcnQgbm8gRFNUIGR1cmluZyBzdW1tZXIgMTkzMS4KLSMgUyZQIHJlcG9ydCBhIHRyYW5zaXRpb24gYXQgMTkzMi0wMy0zMCAyMzowMCwgbm90IDE5MzItMDQtMDEuCi0KLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wMi0yMCk6Ci0jIFRoZXJlIGFyZSBzb21lIG90aGVyIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiB0aGUgRGVjcmVlcyBwYWdlIGFuZCB0aGUKLSMgdHogZGF0YWJhc2UuICBJIHRoaW5rIHRoZXkgY2FuIGJlc3QgYmUgZXhwbGFpbmVkIGJ5IHN1cHBvc2luZyB0aGF0Ci0jIHRoZSByZXNlYXJjaGVycyB3aG8gcHJlcGFyZWQgdGhlIERlY3JlZXMgcGFnZSBmYWlsZWQgdG8gZmluZCBzb21lIG9mCi0jIHRoZSByZWxldmFudCBkb2N1bWVudHMuCi0KLSMgRnJvbSBBbGFuIFBlcnJ5ICgxOTk2LTAyLTE1KToKLSMgQSBndXkgZnJvbSBvdXIgTWV4aWNvIHN1YnNpZGlhcnkgZmluYWxseSBmb3VuZCB0aGUgUHJlc2lkZW50aWFsIERlY3JlZQotIyBvdXRsaW5pbmcgdGhlIHRpbWV6b25lIGNoYW5nZXMgaW4gTWV4aWNvLgotIwotIyAtLS0tLS0tLS0tLS0tIEJlZ2luIEZvcndhcmRlZCBNZXNzYWdlIC0tLS0tLS0tLS0tLS0KLSMKLSMgSSBmaW5hbGx5IGdvdCBteSBoYW5kcyBvbiB0aGUgT2ZmaWNpYWwgUHJlc2lkZW50aWFsIERlY3JlZSB0aGF0IHNldHMgdXAgdGhlCi0jIHJ1bGVzIGZvciB0aGUgRFNUIGNoYW5nZXMuIFRoZSBydWxlcyBhcmU6Ci0jCi0jIDEuIFRoZSBjb3VudHJ5IGlzIGRpdmlkZWQgaW4gMyB0aW1lem9uZXM6Ci0jICAgIC0gQmFqYSBDYWxpZm9ybmlhIE5vcnRlICh0aGUgTWV4aWNvL0JhamFOb3J0ZSBUWikKLSMgICAgLSBCYWphIENhbGlmb3JuaWEgU3VyLCBOYXlhcml0LCBTaW5hbG9hIGFuZCBTb25vcmEgKHRoZSBNZXhpY28vQmFqYVN1ciBUWikKLSMgICAgLSBUaGUgcmVzdCBvZiB0aGUgY291bnRyeSAodGhlIE1leGljby9HZW5lcmFsIFRaKQotIwotIyAyLiBGcm9tIHRoZSBmaXJzdCBTdW5kYXkgaW4gQXByaWwgYXQgMjowMCBBTSB0byB0aGUgbGFzdCBTdW5kYXkgaW4gT2N0b2JlcgotIyAgICBhdCAyOjAwIEFNLCB0aGUgdGltZXMgaW4gZWFjaCB6b25lIGFyZSBhcyBmb2xsb3dzOgotIyAgICBCYWphTm9ydGU6IEdNVCs3Ci0jICAgIEJhamFTdXI6ICAgR01UKzYKLSMgICAgR2VuZXJhbDogICBHTVQrNQotIwotIyAzLiBUaGUgcmVzdCBvZiB0aGUgeWVhciwgdGhlIHRpbWVzIGFyZSBhcyBmb2xsb3dzOgotIyAgICBCYWphTm9ydGU6IEdNVCs4Ci0jICAgIEJhamFTdXI6ICAgR01UKzcKLSMgICAgR2VuZXJhbDogICBHTVQrNgotIwotIyBUaGUgRGVjcmVlIHdhcyBwdWJsaXNoZWQgaW4gTWV4aWNvJ3MgT2ZmaWNpYWwgTmV3c3BhcGVyIG9uIEphbnVhcnkgNHRoLgotIwotIyAtLS0tLS0tLS0tLS0tLSBFbmQgRm9yd2FyZGVkIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wNi0xMik6Ci0jIEZvciBhbiBFbmdsaXNoIHRyYW5zbGF0aW9uIG9mIHRoZSBkZWNyZWUsIHNlZQotIyA8YSBocmVmPSJodHRwOi8vbWV4aWNvLXRyYXZlbC5jb20vZXh0cmEvdGltZXpvbmVfZW5nLmh0bWwiPgotIyBgYERpYXJpbyBPZmljaWFsOiBUaW1lIFpvbmUgQ2hhbmdlb3ZlcicnICgxOTk2LTAxLTA0KS4KLSMgPC9hPgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTgtMTAtMDgpOgotIyBUaGUgU3RhdGUgb2YgUXVpbnRhbmEgUm9vIGhhcyByZXZlcnRlZCBiYWNrIHRvIGNlbnRyYWwgU1REIGFuZCBEU1QgdGltZXMKLSMgKGkuZS4gVVRDIC0wNjAwIGFuZCAtMDUwMCBhcyBvZiAxOTk4LTA4LTAyKS4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTAxLTEwKToKLSMgRWZmZWN0aXZlIEFwcmlsIDQsIDE5OTkgYXQgMjowMCBBTSBsb2NhbCB0aW1lLCBTb25vcmEgY2hhbmdlZCB0byB0aGUgdGltZQotIyB6b25lIDUgaG91cnMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIGFuZCB3aWxsIG5vdCBvYnNlcnZlIGRheWxpZ2h0Ci0jIHNhdmluZ3MgdGltZSBzbyBhcyB0byBzdGF5IG9uIHRoZSBzYW1lIHRpbWUgem9uZSBhcyB0aGUgc291dGhlcm4gcGFydCBvZgotIyBBcml6b25hIHllYXIgcm91bmQuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQsIHRyYW5zbGF0aW5nCi0jIDxodHRwOi8vd3d3LnJlZm9ybWEuY29tL25hY2lvbmFsL2FydGljdWxvLzA2NDMyNy8+ICgyMDAxLTAxLTE3KToKLSMgSW4gT2F4YWNhLCB0aGUgNTUuMDAwIHRlYWNoZXJzIGZyb20gdGhlIFNlY3Rpb24gMjIgb2YgdGhlIE5hdGlvbmFsCi0jIFN5bmRpY2F0ZSBvZiBFZHVjYXRpb24gV29ya2VycywgcmVmdXNlIHRvIGFwcGx5IGRheWxpZ2h0IHNhdmluZyBlYWNoCi0jIHllYXIsIHNvIHRoYXQgdGhlIG1vcmUgdGhhbiAxMCwwMDAgc2Nob29scyB3b3JrIGF0IG5vcm1hbCBob3VyIHRoZQotIyB3aG9sZSB5ZWFyLgotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDEtMTkpOgotIyA8aHR0cDovL3d3dy5yZWZvcm1hLmNvbS9uZWdvY2lvc195X2RpbmVyby9hcnRpY3Vsby8wNjQ0ODEvPiAuLi4gc2F5cwotIyAodHJhbnNsYXRlZCk6Li4uCi0jIEphbnVhcnkgMTcsIDIwMDAgLSBUaGUgRW5lcmd5IFNlY3JldGFyeSwgRXJuZXN0byBNYXJ0ZW5zLCBhbm5vdW5jZWQKLSMgdGhhdCBTdW1tZXIgVGltZSB3aWxsIGJlIHJlZHVjZWQgZnJvbSBzZXZlbiB0byBmaXZlIG1vbnRocywgc3RhcnRpbmcKLSMgdGhpcyB5ZWFyLi4uLgotIyA8aHR0cDovL3d3dy5wdWJsaWNvLmNvbS5teC9zY3JpcHRzL3RleHRvMy5hc3A/YWN0aW9uPXBhZ2luYSZwYWc9MjEmcG9zPXAmc2VjYz1uYWNpJmRhdGU9MDEvMTcvMjAwMT4KLSMgW3RyYW5zbGF0ZWRdLCBzYXlzICJzdW1tZXIgdGltZSB3aWxsIC4uLiB0YWtlIGVmZmVjdCBvbiB0aGUgZmlyc3QgU3VuZGF5Ci0jIGluIE1heSwgYW5kIGVuZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDAxLTAxLTI1KToKLSMgVGhlIDIwMDEtMDEtMjQgdHJhZGl0aW9uYWwgV2FzaGluZ3RvbiBQb3N0IGNvbnRhaW5lZCB0aGUgcGFnZSBvbmUKLSMgc3RvcnkgIlRpbWVseSBJc3N1ZSBEaXZpZGVzIE1leGljYW5zLiIuLi4KLSMgaHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtZHluL2FydGljbGVzL0EzNzM4My0yMDAxSmFuMjMuaHRtbAotIyAuLi4gTWV4aWNvIENpdHkgTWF5b3IgTG9wZXogT2JyYWRvciAiLi4uaXMgdGhyZWF0ZW5pbmcgdG8ga2VlcAotIyBNZXhpY28gQ2l0eSBhbmQgaXRzIDIwIG1pbGxpb24gcmVzaWRlbnRzIG9uIGEgZGlmZmVyZW50IHRpbWUgdGhhbgotIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeS4uLiIgSW4gcGFydGljdWxhciwgTG9wZXogT2JyYWRvciB3b3VsZCBhYm9saXNoCi0jIG9ic2VydmF0aW9uIG9mIERheWxpZ2h0IFNhdmluZyBUaW1lLgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29uYWUuZ29iLm14L2Fob3Jyby9kZWNyZXRvaG9ydmVyMjAwMS5odG1sI2RlY3JlIj4KLSMgT2ZmaWNpYWwgc3RhdHV0ZSBwdWJsaXNoZWQgYnkgdGhlIEVuZXJneSBEZXBhcnRtZW50Ci0jIDwvYT4gKDIwMDEtMDItMDEpIHNob3dzIEJhamEgYW5kIENoaWhhdWh1YSBhcyBzdGlsbCB1c2luZyBVUyBEU1QgcnVsZXMsCi0jIGFuZCBTb25vcmEgd2l0aCBubyBEU1QuICBUaGlzIHdhcyByZXBvcnRlZCBieSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDItMDMpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDMpOgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhdGltZXMuY29tL25ld3MvbmF0aW9uLzIwMDEwMzAzL3QwMDAwMTg3NjYuaHRtbCI+Ci0jIEphbWVzIEYuIFNtaXRoIHdyaXRlcyBpbiB0b2RheSdzIExBIFRpbWVzCi0jIDwvYT4KLSMgKiBTb25vcmEgd2lsbCBjb250aW51ZSB0byBvYnNlcnZlIHN0YW5kYXJkIHRpbWUuCi0jICogTGFzdCB3ZWVrIE1leGljbyBDaXR5J3MgbWF5b3IgQW5kcmVzIE1hbnVlbCBMb3BleiBPYnJhZG9yIGRlY3JlZWQgdGhhdAotIyAgIHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgbm90IGFkb3B0IERTVC4KLSMgKiA0IG9mIDE2IGRpc3RyaWN0IGxlYWRlcnMgYW5ub3VuY2VkIHRoZXknbGwgaWdub3JlIHRoZSBkZWNyZWUuCi0jICogVGhlIGRlY3JlZSBkb2VzIG5vdCBhZmZlY3QgZmVkZXJhbC1jb250cm9sbGVkIGZhY2lsaXRpZXMgaW5jbHVkaW5nCi0jICAgdGhlIGFpcnBvcnQsIGJhbmtzLCBob3NwaXRhbHMsIGFuZCBzY2hvb2xzLgotIwotIyBGb3Igbm93IHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgYm93IHRvIGZlZGVyYWwgcnVsZXMuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDQtMDEpOgotIyBJIGZvdW5kIHNvbWUgcmVmZXJlbmNlcyB0byB0aGUgTWV4aWNhbiBhcHBsaWNhdGlvbiBvZiBkYXlsaWdodAotIyBzYXZpbmcsIHdoaWNoIG1vZGlmaWVzIHdoYXQgSSBoYWQgYWxyZWFkeSBzZW50IHlvdSwgc3RhdGluZyBlYXJsaWVyCi0jIHRoYXQgYSBudW1iZXIgb2Ygbm9ydGhlcm4gTWV4aWNhbiBzdGF0ZXMgd291bGQgZ28gb24gZGF5bGlnaHQKLSMgc2F2aW5nLiBUaGUgbW9kaWZpY2F0aW9uIHJldmVydHMgdGhpcyB0byBvbmx5IGNvdmVyIEJhamEgQ2FsaWZvcm5pYQotIyAoTm9ydGUpLCB3aGlsZSBhbGwgb3RoZXIgc3RhdGVzIChleGNlcHQgU29ub3JhLCB3aG8gaGFzIG5vIGRheWxpZ2h0Ci0jIHNhdmluZyBhbGwgeWVhcikgd2lsbCBmb2xsb3cgdGhlIG9yaWdpbmFsIGRlY3JlZSBvZiBwcmVzaWRlbnQKLSMgVmljZW50ZSBGb3gsIHN0YXJ0aW5nIGRheWxpZ2h0IHNhdmluZyBNYXkgNiwgMjAwMSBhbmQgZW5kaW5nCi0jIFNlcHRlbWJlciAzMCwgMjAwMS4KLSMgUmVmZXJlbmNlczogIkRpYXJpbyBkZSBNb250ZXJyZXkiIDx3d3cuZGlhcmlvZGVtb250ZXJyZXkuY29tL2luZGV4LmFzcD4KLSMgUGFsYWJyYSA8aHR0cDovL3BhbGFicmEuaW5mb3NlbC5jb20vMDEwMzMxL3ByaW1lcmEvcHByaTMxMDEucGRmPiAoMjAwMS0wMy0zMSkKLQotIyBGcm9tIFJldXRlcnMgKDIwMDEtMDktMDQpOgotIyBNZXhpY28ncyBTdXByZW1lIENvdXJ0IG9uIFR1ZXNkYXkgZGVjbGFyZWQgdGhhdCBkYXlsaWdodCBzYXZpbmdzIHdhcwotIyB1bmNvbnN0aXR1dGlvbmFsIGluIE1leGljbyBDaXR5LCBjcmVhdGluZyB0aGUgcG9zc2liaWxpdHkgdGhlCi0jIGNhcGl0YWwgd2lsbCBiZSBpbiBhIGRpZmZlcmVudCB0aW1lIHpvbmUgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbmF0aW9uCi0jIG5leHQgeWVhci4uLi4gIFRoZSBTdXByZW1lIENvdXJ0J3MgcnVsaW5nIHRha2VzIGVmZmVjdCBhdCAyOjAwCi0jIGEubS4gKDA4MDAgR01UKSBvbiBTZXB0LiAzMCwgd2hlbiBNZXhpY28gaXMgc2NoZWR1bGVkIHRvIHJldmVydCB0bwotIyBzdGFuZGFyZCB0aW1lLiAiVGhpcyBpcyBzbyByZXNpZGVudHMgb2YgdGhlIEZlZGVyYWwgRGlzdHJpY3QgYXJlIG5vdAotIyBzdWJqZWN0IHRvIHVuZXhwZWN0ZWQgdGltZSBjaGFuZ2VzLCIgYSBzdGF0ZW1lbnQgZnJvbSB0aGUgY291cnQgc2FpZC4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwMi0wMy0xMik6Ci0jIC4uLiBjb25zdWx0aW5nIG15IGxvY2FsIGdyb2Nlcnkgc3RvcmUoISkgYW5kIG15IGNvd29ya2VycywgdGhleSBhbGwgaW5zaXN0ZWQKLSMgdGhhdCBhIG5ldyBkZWNpc2lvbiBoYWQgYmVlbiBtYWRlIHRvIHJlaW5zdGF0ZSBVUyBzdHlsZSBEU1QgaW4gTWV4aWNvLi4uLgotIyBodHRwOi8vd3d3LmNvbmFlLmdvYi5teC9haG9ycm8vaG9yYXZlcjIwMDFfbTFfMjAwMi5odG1sICgyMDAyLTAyLTIwKQotIyBjb25maXJtcyB0aGlzLiAgU29ub3JhIGFzIHVzdWFsIGlzIHRoZSBvbmx5IHN0YXRlIHdoZXJlIERTVCBpcyBub3QgYXBwbGllZC4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTWV4aWNvCTE5MzkJb25seQktCUZlYgk1CTA6MDAJMTowMAlECi1SdWxlCU1leGljbwkxOTM5CW9ubHkJLQlKdW4JMjUJMDowMAkwCVMKLVJ1bGUJTWV4aWNvCTE5NDAJb25seQktCURlYwk5CTA6MDAJMTowMAlECi1SdWxlCU1leGljbwkxOTQxCW9ubHkJLQlBcHIJMQkwOjAwCTAJUwotUnVsZQlNZXhpY28JMTk0Mwlvbmx5CS0JRGVjCTE2CTA6MDAJMTowMAlXICMgV2FyCi1SdWxlCU1leGljbwkxOTQ0CW9ubHkJLQlNYXkJMQkwOjAwCTAJUwotUnVsZQlNZXhpY28JMTk1MAlvbmx5CS0JRmViCTEyCTA6MDAJMTowMAlECi1SdWxlCU1leGljbwkxOTUwCW9ubHkJLQlKdWwJMzAJMDowMAkwCVMKLVJ1bGUJTWV4aWNvCTE5OTYJMjAwMAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTE5OTYJMjAwMAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU1leGljbwkyMDAxCW9ubHkJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCU1leGljbwkyMDAxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlNZXhpY28JMjAwMgltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCU1leGljbwkyMDAyCW1heAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi0jIFF1aW50YW5hIFJvbwotWm9uZSBBbWVyaWNhL0NhbmN1bgktNTo0NzowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMjo1NgotCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKLQkJCS01OjAwCU1leGljbwlFJXNUCTE5OTggQXVnICAyICAyOjAwCi0JCQktNjowMAlNZXhpY28JQyVzVAotIyBDYW1wZWNoZSwgWXVjYXRhbgotWm9uZSBBbWVyaWNhL01lcmlkYQktNTo1ODoyOCAtCUxNVAkxOTIyIEphbiAgMSAgMDowMTozMgotCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKLQkJCS01OjAwCS0JRVNUCTE5ODIgRGVjICAyCi0JCQktNjowMAlNZXhpY28JQyVzVAotIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGVvbiwgVGFtYXVsaXBhcwotWm9uZSBBbWVyaWNhL01vbnRlcnJleQktNjo0MToxNiAtCUxNVAkxOTIxIERlYyAzMSAyMzoxODo0NAotCQkJLTY6MDAJLQlDU1QJMTk4OAotCQkJLTY6MDAJVVMJQyVzVAkxOTg5Ci0JCQktNjowMAlNZXhpY28JQyVzVAotIyBDZW50cmFsIE1leGljbwotWm9uZSBBbWVyaWNhL01leGljb19DaXR5IC02OjM2OjM2IC0JTE1UCTE5MjIgSmFuICAxICAwOjIzOjI0Ci0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCU1leGljbwlDJXNUCTIwMDEgU2VwIDMwIDAyOjAwCi0JCQktNjowMAktCUNTVAkyMDAyIEZlYiAyMAotCQkJLTY6MDAJTWV4aWNvCUMlc1QKLSMgQ2hpaHVhaHVhCi1ab25lIEFtZXJpY2EvQ2hpaHVhaHVhCS03OjA0OjIwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU1OjQwCi0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5OTYKLQkJCS02OjAwCU1leGljbwlDJXNUCTE5OTgKLQkJCS02OjAwCS0JQ1NUCTE5OTggQXByIFN1bj49MSAzOjAwCi0JCQktNzowMAlNZXhpY28JTSVzVAotIyBTb25vcmEKLVpvbmUgQW1lcmljYS9IZXJtb3NpbGxvCS03OjIzOjUyIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjM2OjA4Ci0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0Ci0JCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMTk5OQotCQkJLTc6MDAJLQlNU1QKLSMgQmFqYSBDYWxpZm9ybmlhIFN1ciwgTmF5YXJpdCwgU2luYWxvYQotWm9uZSBBbWVyaWNhL01hemF0bGFuCS03OjA1OjQwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU0OjIwCi0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0Ci0JCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QKLSMgQmFqYSBDYWxpZm9ybmlhCi1ab25lIEFtZXJpY2EvVGlqdWFuYQktNzo0ODowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMTo1NgotCQkJLTc6MDAJLQlNU1QJMTkyNAotCQkJLTg6MDAJLQlQU1QJMTkyNyBKdW4gMTAgMjM6MDAKLQkJCS03OjAwCS0JTVNUCTE5MzAgTm92IDE1Ci0JCQktODowMAktCVBTVAkxOTMxIEFwciAgMQotCQkJLTg6MDAJMTowMAlQRFQJMTkzMSBTZXAgMzAKLQkJCS04OjAwCS0JUFNUCTE5NDIgQXByIDI0Ci0JCQktODowMAkxOjAwCVBXVAkxOTQ1IEF1ZyAxNCAyMzowMHUKLQkJCS04OjAwCTE6MDAJUFBUCTE5NDUgTm92IDEyICMgUGVhY2UKLQkJCS04OjAwCS0JUFNUCTE5NDggQXByICA1Ci0JCQktODowMAkxOjAwCVBEVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk1NAotCQkJLTg6MDAJQ0EJUCVzVAkxOTYxCi0JCQktODowMAktCVBTVAkxOTc2Ci0JCQktODowMAlVUwlQJXNUCTE5OTYKLQkJCS04OjAwCU1leGljbwlQJXNUCTIwMDEKLQkJCS04OjAwCVVTCVAlc1QJMjAwMiBGZWIgMjAKLQkJCS04OjAwCU1leGljbwlQJXNUCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBGb3JtZXJseSB0aGVyZSB3YXMgYW4gQW1lcmljYS9FbnNlbmFkYSB6b25lLCB3aGljaCBkaWZmZXJlZCBmcm9tCi0jIEFtZXJpY2EvVGlqdWFuYSBvbmx5IGluIHRoYXQgaXQgZGlkIG5vdCBvYnNlcnZlIERTVCBmcm9tIDE5NzYKLSMgdGhyb3VnaCAxOTk1LiAgVGhpcyB3YXMgYXMgcGVyIFNoYW5rcyAoMTk5OSkuICBCdXQgU2hhbmtzICYgUG90dGVuZ2VyIHNheQotIyBFbnNlbmFkYSBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk0OCB0aHJvdWdoIDE5NzUuICBHdXkgSGFycmlzIHJlcG9ydHMKLSMgdGhhdCB0aGUgMTk4NyBPQUcgc2F5cyAiT25seSBFbnNlbmFkYSwgTWV4aWNhbGUsIFNhbiBGZWxpcGUgYW5kCi0jIFRpanVhbmEgb2JzZXJ2ZSBEU1QsIiB3aGljaCBhZ3JlZXMgd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYnV0IGltcGxpZXMgdGhhdAotIyBEU1Qtb2JzZXJ2YW5jZSB3YXMgYSB0b3duLWJ5LXRvd24gbWF0dGVyIGJhY2sgdGhlbi4gIFRoaXMgY29uY2VybnMKLSMgZGF0YSBhZnRlciAxOTcwIHNvIG1vc3QgbGlrZWx5IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgWm9uZQotIyBvdGhlciB0aGFuIEFtZXJpY2EvVGlqdWFuYSBmb3IgQmFqYSwgYnV0IGl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IGl0cwotIyBuYW1lIG9yIGNvbnRlbnRzIHNob3VsZCBiZS4KLSMKLSMgUmV2aWxsYWdpZ2VkbyBJcwotIyBubyBpbmZvcm1hdGlvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQW5ndWlsbGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Bbmd1aWxsYQktNDoxMjoxNiAtCUxNVAkxOTEyIE1hciAyCi0JCQktNDowMAktCUFTVAotCi0jIEFudGlndWEgYW5kIEJhcmJ1ZGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9BbnRpZ3VhCS00OjA3OjEyIC0JTE1UCTE5MTIgTWFyIDIKLQkJCS01OjAwCS0JRVNUCTE5NTEKLQkJCS00OjAwCS0JQVNUCi0KLSMgQmFoYW1hcwotIwotIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwNi0xMi0wNyk6Ci0jIFRoZSBCYWhhbWFzIGFubm91bmNlZCBhYm91dCBhIG1vbnRoIGFnbyB0aGF0IHRoZXkgcGxhbiB0byBjaGFuZ2UgdGhlaXIgRFNUCi0jIHJ1bGVzIHRvIHN5bmMgd2l0aCB0aGUgVS5TLiBzdGFydGluZyBpbiAyMDA3Li4uLgotIyBodHRwOi8vd3d3LmpvbmVzYmFoYW1hcy5jb20vP2M9NDUmYT0xMDQxMgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlCYWhhbWFzCTE5NjQJMTk3NQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUJhaGFtYXMJMTk2NAkxOTc1CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9OYXNzYXUJLTU6MDk6MjQgLQlMTVQJMTkxMiBNYXIgMgotCQkJLTU6MDAJQmFoYW1hcwlFJXNUCTE5NzYKLQkJCS01OjAwCVVTCUUlc1QKLQotIyBCYXJiYWRvcwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQmFyYgkxOTc3CW9ubHkJLQlKdW4JMTIJMjowMAkxOjAwCUQKLVJ1bGUJQmFyYgkxOTc3CTE5NzgJLQlPY3QJU3VuPj0xCTI6MDAJMAlTCi1SdWxlCUJhcmIJMTk3OAkxOTgwCS0JQXByCVN1bj49MTUJMjowMAkxOjAwCUQKLVJ1bGUJQmFyYgkxOTc5CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJQmFyYgkxOTgwCW9ubHkJLQlTZXAJMjUJMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9CYXJiYWRvcwktMzo1ODoyOCAtCUxNVAkxOTI0CQkjIEJyaWRnZXRvd24KLQkJCS0zOjU4OjI4IC0JQk1UCTE5MzIJICAjIEJyaWRnZXRvd24gTWVhbiBUaW1lCi0JCQktNDowMAlCYXJiCUElc1QKLQotIyBCZWxpemUKLSMgV2hpdG1hbiBlbnRpcmVseSBkaXNhZ3JlZXMgd2l0aCBTaGFua3M7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQmVsaXplCTE5MTgJMTk0MgktCU9jdAlTdW4+PTIJMDowMAkwOjMwCUhECi1SdWxlCUJlbGl6ZQkxOTE5CTE5NDMJLQlGZWIJU3VuPj05CTA6MDAJMAlTCi1SdWxlCUJlbGl6ZQkxOTczCW9ubHkJLQlEZWMJIDUJMDowMAkxOjAwCUQKLVJ1bGUJQmVsaXplCTE5NzQJb25seQktCUZlYgkgOQkwOjAwCTAJUwotUnVsZQlCZWxpemUJMTk4Mglvbmx5CS0JRGVjCTE4CTA6MDAJMTowMAlECi1SdWxlCUJlbGl6ZQkxOTgzCW9ubHkJLQlGZWIJMTIJMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9CZWxpemUJLTU6NTI6NDggLQlMTVQJMTkxMiBBcHIKLQkJCS02OjAwCUJlbGl6ZQlDJXNUCi0KLSMgQmVybXVkYQotCi0jIEZyb20gRGFuIEpvbmVzLCByZXBvcnRpbmcgaW4gVGhlIFJveWFsIEdhemV0dGUgKDIwMDYtMDYtMjYpOgotCi0jIE5leHQgeWVhciwgaG93ZXZlciwgY2xvY2tzIGluIHRoZSBVUyB3aWxsIGdvIGZvcndhcmQgb24gdGhlIHNlY29uZCBTdW5kYXkKLSMgaW4gTWFyY2gsIHVudGlsIHRoZSBmaXJzdCBTdW5kYXkgaW4gTm92ZW1iZXIuICBBbmQsIGFmdGVyIHRoZSBUaW1lIFpvbmUKLSMgKFNlYXNvbmFsIFZhcmlhdGlvbikgQmlsbCAyMDA2IHdhcyBwYXNzZWQgaW4gdGhlIEhvdXNlIG9mIEFzc2VtYmx5IG9uCi0jIEZyaWRheSwgdGhlIHNhbWUgdGhpbmcgd2lsbCBoYXBwZW4gaW4gQmVybXVkYS4KLSMgaHR0cDovL3d3dy50aGVyb3lhbGdhemV0dGUuY29tL2FwcHMvcGJjcy5kbGwvYXJ0aWNsZT9BSUQ9LzIwMDYwNTI5L05FV1MvMTA1MjkwMTM1Ci0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvQmVybXVkYQktNDoxOTowNCAtCUxNVAkxOTMwIEphbiAgMSAyOjAwICAgICMgSGFtaWx0b24KLQkJCS00OjAwCS0JQVNUCTE5NzQgQXByIDI4IDI6MDAKLQkJCS00OjAwCUJhaGFtYXMJQSVzVAkxOTc2Ci0JCQktNDowMAlVUwlBJXNUCi0KLSMgQ2F5bWFuIElzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvQ2F5bWFuCS01OjI1OjMyIC0JTE1UCTE4OTAJCSMgR2VvcmdldG93bgotCQkJLTU6MDc6MTIgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKLQkJCS01OjAwCS0JRVNUCi0KLSMgQ29zdGEgUmljYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ1IJMTk3OQkxOTgwCS0JRmViCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJQ1IJMTk3OQkxOTgwCS0JSnVuCVN1bj49MQkwOjAwCTAJUwotUnVsZQlDUgkxOTkxCTE5OTIJLQlKYW4JU2F0Pj0xNQkwOjAwCTE6MDAJRAotIyBJQVRBIFNTSU0gKDE5OTEtMDkpIHNheXMgdGhlIGZvbGxvd2luZyB3YXMgYXQgMTowMDsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUNSCTE5OTEJb25seQktCUp1bAkgMQkwOjAwCTAJUwotUnVsZQlDUgkxOTkyCW9ubHkJLQlNYXIJMTUJMDowMAkwCVMKLSMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBKb3NlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSBgQ29zdGEgUmljYScuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvQ29zdGFfUmljYQktNTozNjoyMCAtCUxNVAkxODkwCQkjIFNhbiBKb3NlCi0JCQktNTozNjoyMCAtCVNKTVQJMTkyMSBKYW4gMTUgIyBTYW4gSm9zZSBNZWFuIFRpbWUKLQkJCS02OjAwCUNSCUMlc1QKLSMgQ29jbwotIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBBbWVyaWNhL0Nvc3RhX1JpY2EKLQotIyBDdWJhCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTktMDMtMjkpOgotIyBUaGUgMTk5OS0wMy0yOCBleGhpYml0aW9uIGJhc2ViYWxsIGdhbWUgaGVsZCBpbiBIYXZhbmEsIEN1YmEsIGJldHdlZW4KLSMgdGhlIEN1YmFuIE5hdGlvbmFsIFRlYW0gYW5kIHRoZSBCYWx0aW1vcmUgT3Jpb2xlcyB3YXMgY2FycmllZCBsaXZlIG9uCi0jIHRoZSBPcmlvbGVzIFJhZGlvIE5ldHdvcmssIGluY2x1ZGluZyBhZmZpbGlhdGUgV1RPUCBpbiBXYXNoaW5ndG9uLCBEQy4KLSMgRHVyaW5nIHRoZSBnYW1lLCBwbGF5LWJ5LXBsYXkgYW5ub3VuY2VyIEppbSBIdW50ZXIgbm90ZWQgdGhhdAotIyAiV2UnbGwgYmUgbG9zaW5nIHR3byBob3VycyBvZiBzbGVlcC4uLkN1YmEgc3dpdGNoZWQgdG8gRGF5bGlnaHQgU2F2aW5nCi0jIFRpbWUgdG9kYXkuIiAgKFRoZSAidHdvIGhvdXIiIHJlbWFyayByZWZlcnJlZCB0byBsb3Npbmcgb25lIGhvdXIgb2YKLSMgc2xlZXAgb24gMTk5OS0wMy0yOC0td2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKLSMgdG8gRFNULS1hbmQgb25lIG1vcmUgaG91ciBvbiAxOTk5LTA0LTA0LS13aGVuIHRoZSBhbm5vdW5jZXJzIHdpbGwgaGF2ZQotIyByZXR1cm5lZCB0byBCYWx0aW1vcmUsIHdoaWNoIHN3aXRjaGVzIG9uIHRoYXQgZGF0ZS4pCi0KLSMgRnJvbSBFdmVydCB2YW4gZGVyIFZlZXIgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNC0xMC0yOCk6Ci0jIEN1YmEgaXMgbm90IGdvaW5nIGJhY2sgdG8gc3RhbmRhcmQgdGltZSB0aGlzIHllYXIuCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBodHRwOi8vd3d3LmdyYW5tYS5jdS9pbmdsZXMvMjAwNC9zZXB0aWVtYnJlL2p1ZXYzMC80MW1lZGlkLWkuaHRtbAotIyBzYXlzIHRoYXQgaXQncyBkdWUgdG8gYSBwcm9ibGVtIGF0IHRoZSBBbnRvbmlvIEd1aXRlcmFzCi0jIHRoZXJtb2VsZWN0cmljIHBsYW50LCBhbmQgc2F5cyAiVGhpcyBPY3RvYmVyIHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuCi0jIHRvIG5vcm1hbCBob3VycyAoYWZ0ZXIgZGF5bGlnaHQgc2F2aW5nIHRpbWUpIi4KLSMgRm9yIG5vdywgbGV0J3MgYXNzdW1lIHRoYXQgaXQncyBhIHRlbXBvcmFyeSBtZWFzdXJlLgotCi0jIEZyb20gQ2FybG9zIEEuIENhcm5lcm8gRGVsZ2FkbyAoMjAwNS0xMS0xMik6Ci0jIFRoaXMgeWVhciAoanVzdCBsaWtlIGluIDIwMDQtMjAwNSkgdGhlcmUncyBubyBjaGFuZ2UgaW4gdGltZSB6b25lCi0jIGFkanVzdG1lbnQgaW4gQ3ViYS4gIFdlIHdpbGwgc3RheSBpbiBkYXlsaWdodCBzYXZpbmcgdGltZToKLSMgaHR0cDovL3d3dy5ncmFubWEuY3UvZXNwYW5vbC8yMDA1L25vdmllbWJyZS9taWVyOS9ob3JhcmlvLmh0bWwKLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6Ci0jIEFuIGFydGljbGUgaW4gR1JBTk1BIElOVEVSTkFDSU9OQUwgY2xhaW1zIHRoYXQgQ3ViYSB3aWxsIGVuZAotIyB0aGUgMyB5ZWFycyBvZiBwZXJtYW5lbnQgRFNUIG5leHQgd2Vla2VuZCwgc2VlCi0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1L2luZ2xlcy8yMDA2L29jdHVicmUvbHVuMTYvNDNob3JhcmlvLmh0bWwKLSMgIk9uIFNhdHVyZGF5IG5pZ2h0LCBPY3RvYmVyIDI4IGdvaW5nIGludG8gU3VuZGF5LCBPY3RvYmVyIDI5LCBhdCAwMTowMCwKLSMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLS0gZ29pbmcgYmFjayB0byAwMDowMCBob3VycyAtLSByZXR1cm5pbmcKLSMgdG8gdGhlIG5vcm1hbCBzY2hlZHVsZS4uLi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTAyKToKLSMgaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS9lbmdsaXNoL25ld3MvYXJ0ODkuaHRtbCwgZGF0ZWQgeWVzdGVyZGF5LAotIyBzYXlzIEN1YmFuIGNsb2NrcyB3aWxsIGFkdmFuY2UgYXQgbWlkbmlnaHQgb24gTWFyY2ggMTAuCi0jIEZvciBsYWNrIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgYXNzdW1lIEN1YmEgd2lsbCB1c2UgVVMgcnVsZXMsCi0jIGV4Y2VwdCB0aGF0IGl0IHN3aXRjaGVzIGF0IG1pZG5pZ2h0IHN0YW5kYXJkIHRpbWUgYXMgdXN1YWwuCi0jCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTEwLTI1KToKLSMgQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiBpbmZvcm1lZCBtZSB0aGF0IEN1YmEgd2lsbCBlbmQgRFNUIG9uZSB3ZWVrIAotIyBlYXJsaWVyIC0gb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIsIGp1c3QgbGlrZSBpbiAyMDA2LgotIyAKLSMgSGUgc3VwcGxpZWQgdGhlc2UgcmVmZXJlbmNlczoKLSMgCi0jIGh0dHA6Ly93d3cucHJlbnNhbGF0aW5hLmNvbS5teC9hcnRpY2xlLmFzcD9JRD0lN0I0Q0MzMkMxQi1BOUY3LTQyRkItOEEwNy04NjMxQUZDOTIzQUYlN0QmbGFuZ3VhZ2U9RVMKLSMgaHR0cDovL2FjdHVhbGlkYWQudGVycmEuZXMvc29jaWVkYWQvYXJ0aWN1bG8vY3ViYV9sbGFtYV9haG9ycmFyX2VuZXJnaWFfY2FtYmlvXzE5NTcwNDQuaHRtCi0jIAotIyBGcm9tIEFsZXggS3J5dmVuaXNoZXYgKDIwMDctMTAtMjUpOgotIyBIZXJlIGlzIGFsc28gYXJ0aWNsZSBmcm9tIEdyYW5tYSAoQ3ViYSk6Ci0jIAotIyBbUmVnaXJhXSBlbCBIb3JhcmlvIE5vcm1hbCBkZXNkZSBlbCBbcHJveGltb10gZG9taW5nbyAyOCBkZSBvY3R1YnJlCi0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwNy8xMC8yNC9uYWNpb25hbC9hcnRpYzA3Lmh0bWwKLSMgCi0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfY3ViYTAzLmh0bWwKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0wOSk6Ci0jIEknbSBpbiBNYXJ5bGFuZCB3aGljaCBpcyBub3cgb2JzZXJ2aW5nIFVuaXRlZCBTdGF0ZXMgRWFzdGVybiBEYXlsaWdodAotIyBUaW1lLiBBdCA5OjQ0IGxvY2FsIHRpbWUgSSB1c2VkIFJlYWxQbGF5ZXIgdG8gbGlzdGVuIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JhZGlvcmVsb2oiPgotIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yYWRpb3JlbG9qCi0jIDwvYT4sIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCi0jIHRoZSB0aW1lIGFubm91bmNlZCBhcyAib2NobyBjdWFyZW50YSB5IGN1YXRybyIgKCJlaWdodCBmb3J0eS1mb3VyIiksCi0jIGluZGljYXRpbmcgdGhhdCBDdWJhIGlzIHN0aWxsIG9uIHN0YW5kYXJkIHRpbWUuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTIpOgotIyBJdCBzZWVtcyB0aGF0IEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gU3VuZGF5LCAyMDA3LTAzLTE2Li4uCi0jIEl0IHdhcyBhbm5vdW5jZWQgeWVzdGVyZGF5LCBhY2NvcmRpbmcgdG8gdGhpcyBzb3VyY2UgKGluIFNwYW5pc2gpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5uYy5jdWJhd2ViLmN1L21hcnpvLTIwMDgvY2llbi0xLTExLTMtMDguaHRtIj4KLSMgaHR0cDovL3d3dy5ubmMuY3ViYXdlYi5jdS9tYXJ6by0yMDA4L2NpZW4tMS0xMS0zLTA4Lmh0bQotIyA8L2E+Ci0jCi0jIFNvbWUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGlzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwKLSMgPC9hPgotIwotIyBUaGUgYXJ0aWNsZSBhbHNvIHNheXMgdGhhdCBDdWJhIGhhcyBiZWVuIG9ic2VydmluZyBEU1Qgc2luY2UgMTk2MywKLSMgd2hpbGUgU2hhbmtzIChhbmQgdHpkYXRhKSBoYXMgMTk2NSBhcyB0aGUgZmlyc3QgZGF0ZSAoZXhjZXB0IGluIHRoZQotIyAxOTQwJ3MpLiBNYW55IG90aGVyIHdlYiBwYWdlcyBpbiBDdWJhIGFsc28gY2xhaW0gdGhhdCBpdCBoYXMgYmVlbgotIyBvYnNlcnZlZCBzaW5jZSAxOTYzLCBidXQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIDE5NzAgLSBhbiBleGNlcHRpb24KLSMgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gdHpkYXRhL1NoYW5rcy4gU28gdGhlcmUgaXMgYSBjaGFuY2Ugd2UgbmVlZCB0bwotIyBjaGFuZ2Ugc29tZSBoaXN0b3JpYyByZWNvcmRzIGFzIHdlbGwuCi0jCi0jIE9uZSBleGFtcGxlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvaGMuY3UvZXNwYW5vbC9ub3RpY2lhcy9tYXIwNy8xMW1hci9ob3IuaHRtIj4KLSMgaHR0cDovL3d3dy5yYWRpb2hjLmN1L2VzcGFub2wvbm90aWNpYXMvbWFyMDcvMTFtYXIvaG9yLmh0bQotIyA8L2E+Ci0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgotIyBUaGUgQ3ViYW4gdGltZSBjaGFuZ2UgaGFzIGp1c3QgYmVlbiBjb25maXJtZWQgb24gdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZQotIyB3ZWIgc2l0ZSwgdGhlIEdyYW5tYS4gIFBsZWFzZSBjaGVjayBvdXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS8yMDA4LzAzLzEzL25hY2lvbmFsL2FydGljMTAuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwOC8wMy8xMy9uYWNpb25hbC9hcnRpYzEwLmh0bWwKLSMgPC9hPgotIwotIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VucyBpbmZvcm1hdGlvbiwgdGhlIGNoYW5nZQotIyB3aWxsIHRha2UgcGxhY2UgbWlkbmlnaHQgYmV0d2VlbiBTYXR1cmRheSBhbmQgU3VuZGF5LgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTEyKToKLSMgQXNzdW1lIFN1bj49MTUgKHRoaXJkIFN1bmRheSkgZ29pbmcgZm9yd2FyZC4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ3ViYQkxOTI4CW9ubHkJLQlKdW4JMTAJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTI4CW9ubHkJLQlPY3QJMTAJMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTQwCTE5NDIJLQlKdW4JU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk0MAkxOTQyCS0JU2VwCVN1bj49MQkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NDUJMTk0NgktCUp1bglTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTQ1CTE5NDYJLQlTZXAJU3VuPj0xCTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk2NQlvbmx5CS0JSnVuCTEJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTY1CW9ubHkJLQlTZXAJMzAJMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTY2CW9ubHkJLQlNYXkJMjkJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTY2CW9ubHkJLQlPY3QJMgkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NjcJb25seQktCUFwcgk4CTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk2NwkxOTY4CS0JU2VwCVN1bj49OAkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NjgJb25seQktCUFwcgkxNAkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5NjkJMTk3NwktCUFwcglsYXN0U3VuCTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk2OQkxOTcxCS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTcyCTE5NzQJLQlPY3QJOAkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NzUJMTk3NwktCU9jdAlsYXN0U3VuCTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk3OAlvbmx5CS0JTWF5CTcJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTc4CTE5OTAJLQlPY3QJU3VuPj04CTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk3OQkxOTgwCS0JTWFyCVN1bj49MTUJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTgxCTE5ODUJLQlNYXkJU3VuPj01CTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk4NgkxOTg5CS0JTWFyCVN1bj49MTQJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTkwCTE5OTcJLQlBcHIJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk5MQkxOTk1CS0JT2N0CVN1bj49OAkwOjAwcwkwCVMKLVJ1bGUJQ3ViYQkxOTk2CW9ubHkJLQlPY3QJIDYJMDowMHMJMAlTCi1SdWxlCUN1YmEJMTk5Nwlvbmx5CS0JT2N0CTEyCTA6MDBzCTAJUwotUnVsZQlDdWJhCTE5OTgJMTk5OQktCU1hcglsYXN0U3VuCTA6MDBzCTE6MDAJRAotUnVsZQlDdWJhCTE5OTgJMjAwMwktCU9jdAlsYXN0U3VuCTA6MDBzCTAJUwotUnVsZQlDdWJhCTIwMDAJMjAwNgktCUFwcglTdW4+PTEJMDowMHMJMTowMAlECi1SdWxlCUN1YmEJMjAwNgltYXgJLQlPY3QJbGFzdFN1bgkwOjAwcwkwCVMKLVJ1bGUJQ3ViYQkyMDA3CW9ubHkJLQlNYXIJU3VuPj04CTA6MDBzCTE6MDAJRAotUnVsZQlDdWJhCTIwMDgJbWF4CS0JTWFyCVN1bj49MTUJMDowMHMJMTowMAlECi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9IYXZhbmEJLTU6Mjk6MjggLQlMTVQJMTg5MAotCQkJLTU6Mjk6MzYgLQlITVQJMTkyNSBKdWwgMTkgMTI6MDAgIyBIYXZhbmEgTVQKLQkJCS01OjAwCUN1YmEJQyVzVAotCi0jIERvbWluaWNhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvRG9taW5pY2EJLTQ6MDU6MzYgLQlMTVQJMTkxMSBKdWwgMSAwOjAxCQkjIFJvc2VhdQotCQkJLTQ6MDAJLQlBU1QKLQotIyBEb21pbmljYW4gUmVwdWJsaWMKLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0xMC0zMCk6Ci0jIEVucmlxdWUgTW9yYWxlcyByZXBvcnRlZCB0byBtZSB0aGF0IHRoZSBEb21pbmljYW4gUmVwdWJsaWMgaGFzIGNoYW5nZWQgdGhlCi0jIHRpbWUgem9uZSB0byBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgYXMgb2YgU3VuZGF5IDI5IGF0IDIgYW0uLi4uCi0jIGh0dHA6Ly93d3cubGlzdGluLmNvbS5kby9hbnRlcy8yNjEwMDAvcmVwdWJsaWNhL3ByaW5jaS5odG1sCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0xMi0wNCk6Ci0jIFRoYXQgVVJMICgyMDAwLTEwLTI2LCBpbiBTcGFuaXNoKSBzYXlzIHRoZXkgcGxhbm5lZCB0byB1c2UgVVMtc3R5bGUgRFNULgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMTItMDEpOgotIyBEb21pbmljYW4gUmVwdWJsaWMgY2hhbmdlZCBpdHMgbWluZCBhbmQgcHJlc2lkZW50aWFsIGRlY3JlZSBvbiBUdWVzZGF5LAotIyBOb3ZlbWJlciAyOCwgMjAwMCwgd2l0aCBhIG5ldyBkZWNyZWUuICBPbiBTdW5kYXksIERlY2VtYmVyIDMgYXQgMTowMCBBTSB0aGUKLSMgRG9taW5pY2FuIFJlcHVibGljIHdpbGwgYmUgcmV2ZXJ0aW5nIHRvIDggaG91cnMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlCi0jIExpbmUsIGFuZCB3aWxsIG5vdCBiZSB1c2luZyBEU1QgaW4gdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4gIFRoZSByZWFzb24gdGhleQotIyBkZWNpZGVkIHRvIHVzZSBEU1Qgd2FzIHRvIGJlIGluIHN5bmNoIHdpdGggUHVlcnRvIFJpY28sIHdobyB3YXMgYWxzbyBnb2luZwotIyB0byBpbXBsZW1lbnQgRFNULiAgV2hlbiBQdWVydG8gUmljbyBkaWRuJ3QgaW1wbGVtZW50IERTVCwgdGhlIHByZXNpZGVudAotIyBkZWNpZGVkIHRvIHJldmVydC4KLQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlEUgkxOTY2CW9ubHkJLQlPY3QJMzAJMDowMAkxOjAwCUQKLVJ1bGUJRFIJMTk2Nwlvbmx5CS0JRmViCTI4CTA6MDAJMAlTCi1SdWxlCURSCTE5NjkJMTk3MwktCU9jdAlsYXN0U3VuCTA6MDAJMDozMAlIRAotUnVsZQlEUgkxOTcwCW9ubHkJLQlGZWIJMjEJMDowMAkwCVMKLVJ1bGUJRFIJMTk3MQlvbmx5CS0JSmFuCTIwCTA6MDAJMAlTCi1SdWxlCURSCTE5NzIJMTk3NAktCUphbgkyMQkwOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1NhbnRvX0RvbWluZ28gLTQ6Mzk6MzYgLQlMTVQJMTg5MAotCQkJLTQ6NDAJLQlTRE1UCTE5MzMgQXByICAxIDEyOjAwICMgUy4gRG9tLiBNVAotCQkJLTU6MDAJRFIJRSVzVAkxOTc0IE9jdCAyNwotCQkJLTQ6MDAJLQlBU1QJMjAwMCBPY3QgMjkgMDI6MDAKLQkJCS01OjAwCVVTCUUlc1QJMjAwMCBEZWMgIDMgMDE6MDAKLQkJCS00OjAwCS0JQVNUCi0KLSMgRWwgU2FsdmFkb3IKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJU2FsdgkxOTg3CTE5ODgJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCVNhbHYJMTk4NwkxOTg4CS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKLSMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBTYWx2YWRvcnMgZWxzZXdoZXJlLCBzbyB1c2UgQW1lcmljYS9FbF9TYWx2YWRvcgotIyBpbnN0ZWFkIG9mIEFtZXJpY2EvU2FuX1NhbHZhZG9yLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0VsX1NhbHZhZG9yIC01OjU2OjQ4IC0JTE1UCTE5MjEJCSMgU2FuIFNhbHZhZG9yCi0JCQktNjowMAlTYWx2CUMlc1QKLQotIyBHcmVuYWRhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvR3JlbmFkYQktNDowNzowMCAtCUxNVAkxOTExIEp1bAkjIFN0IEdlb3JnZSdzCi0JCQktNDowMAktCUFTVAotCi0jIEd1YWRlbG91cGUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9HdWFkZWxvdXBlCS00OjA2OjA4IC0JTE1UCTE5MTEgSnVuIDgJIyBQb2ludGUgYSBQaXRyZQotCQkJLTQ6MDAJLQlBU1QKLSMgU3QgQmFydGhlbGVteQotTGluayBBbWVyaWNhL0d1YWRlbG91cGUJQW1lcmljYS9TdF9CYXJ0aGVsZW15Ci0jIFN0IE1hcnRpbiAoRnJlbmNoIHBhcnQpCi1MaW5rIEFtZXJpY2EvR3VhZGVsb3VwZQlBbWVyaWNhL01hcmlnb3QKLQotIyBHdWF0ZW1hbGEKLSMKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwNi0wNC0yMiksIGFmdGVyIGEgaGVhZHMtdXAgZnJvbSBPc2NhciB2YW4gVmxpam1lbjoKLSMgRGlhcmlvIENvIExhdGlubywgYXQKLSMgaHR0cDovL3d3dy5kaWFyaW9jb2xhdGluby5jb20vaW50ZXJuYWNpb25hbGVzL2RldGFsbGVzLmFzcD9OZXdzSUQ9ODA3OSwKLSMgc2F5cyBpbiBhbiBhcnRpY2xlIGRhdGVkIDIwMDYtMDQtMTkgdGhhdCB0aGUgR3VhdGVtYWxhbiBnb3Zlcm5tZW50IGhhZAotIyBkZWNpZGVkIG9uIHRoYXQgZGF0ZSB0byBhZHZhbmNlIG9mZmljaWFsIHRpbWUgYnkgNjAgbWludXRlcywgdG8gbGVzc2VuIHRoZQotIyBpbXBhY3Qgb2YgdGhlIGVsZXZhdGVkIGNvc3Qgb2Ygb2lsLi4uLiAgRGF5bGlnaHQgc2F2aW5nIHRpbWUgd2lsbCBsYXN0IGZyb20KLSMgMjAwNi0wNC0yOSAyNDowMCAoR3VhdGVtYWxhbiBzdGFuZGFyZCB0aW1lKSB0byAyMDA2LTA5LTMwICh0aW1lIHVuc3BlY2lmaWVkKS4KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yMik6Ci0jIFRoZSBNaW5pc3RyeSBvZiBFbmVyZ3kgYW5kIE1pbmVzLCBwcmVzcyByZWxlYXNlIENQLTE1LzIwMDYKLSMgKDIwMDYtMDQtMTkpLCBzYXlzIERTVCBlbmRzIGF0IDI0OjAwLiAgU2VlCi0jIDxodHRwOi8vd3d3LnNpZWNhLm9yZy5ndC9TaXRpb19wdWJsaWNvL0VuZXJnZXRpY29zL0RvYy9NZWRpZGFzL0NhbWJpb19Ib3JhcmlvX05hY18xOTA0MDYucGRmPi4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJR3VhdAkxOTczCW9ubHkJLQlOb3YJMjUJMDowMAkxOjAwCUQKLVJ1bGUJR3VhdAkxOTc0CW9ubHkJLQlGZWIJMjQJMDowMAkwCVMKLVJ1bGUJR3VhdAkxOTgzCW9ubHkJLQlNYXkJMjEJMDowMAkxOjAwCUQKLVJ1bGUJR3VhdAkxOTgzCW9ubHkJLQlTZXAJMjIJMDowMAkwCVMKLVJ1bGUJR3VhdAkxOTkxCW9ubHkJLQlNYXIJMjMJMDowMAkxOjAwCUQKLVJ1bGUJR3VhdAkxOTkxCW9ubHkJLQlTZXAJIDcJMDowMAkwCVMKLVJ1bGUJR3VhdAkyMDA2CW9ubHkJLQlBcHIJMzAJMDowMAkxOjAwCUQKLVJ1bGUJR3VhdAkyMDA2CW9ubHkJLQlPY3QJIDEJMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9HdWF0ZW1hbGEJLTY6MDI6MDQgLQlMTVQJMTkxOCBPY3QgNQotCQkJLTY6MDAJR3VhdAlDJXNUCi0KLSMgSGFpdGkKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0xNSk6Ci0jIFJpc3RvIE8uIE55a2FuZW4gd3JvdGUgbWUgdGhhdCBIYWl0aSBpcyBub3cgb24gRFNULgotIyBJIHNlYXJjaGVkIGZvciBjb25maXJtYXRpb24sIGFuZCBJIGZvdW5kIGEKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oYWl0aWFuY29uc3VsYXRlLm9yZy90aW1lLmRvYyI+IHByZXNzIHJlbGVhc2UKLSMgb24gdGhlIFdlYiBwYWdlIG9mIHRoZSBIYWl0aWFuIENvbnN1bGF0ZSBpbiBDaGljYWdvICgyMDA1LTAzLTMxKSwKLSMgPC9hPi4gIFRyYW5zbGF0ZWQgZnJvbSBGcmVuY2gsIGl0IHNheXM6Ci0jCi0jICAiVGhlIFByaW1lIE1pbmlzdGVyJ3MgQ29tbXVuaWNhdGlvbiBPZmZpY2Ugbm90aWZpZXMgdGhlIHB1YmxpYyBpbiBnZW5lcmFsCi0jICAgYW5kIHRoZSBwcmVzcyBpbiBwYXJ0aWN1bGFyIHRoYXQsIGZvbGxvd2luZyBhIGRlY2lzaW9uIG9mIHRoZSBJbnRlcmlvcgotIyAgIE1pbmlzdHJ5IGFuZCB0aGUgVGVycml0b3JpYWwgQ29sbGVjdGl2aXRpZXMgW0kgc3VwcG9zZSB0aGF0IG1lYW5zIHRoZQotIyAgIHByb3ZpbmNlc10sIEhhaXRpIHdpbGwgbW92ZSB0byBFYXN0ZXJuIERheWxpZ2h0IFRpbWUgaW4gdGhlIG5pZ2h0IGZyb20gbmV4dAotIyAgIFNhdHVyZGF5IHRoZSAybmQgdG8gU3VuZGF5IHRoZSAzcmQuCi0jCi0jICAiQ29uc2VxdWVudGx5LCB0aGUgUHJpbWUgTWluaXN0ZXIncyBDb21tdW5pY2F0aW9uIE9mZmljZSB3aXNoZXMgdG8gaW5mb3JtCi0jICAgdGhlIHBvcHVsYXRpb24gdGhhdCB0aGUgY291bnRyeSdzIGNsb2NrcyB3aWxsIGJlIHNldCBmb3J3YXJkIG9uZSBob3VyCi0jICAgc3RhcnRpbmcgYXQgbWlkbmlnaHQuICBUaGlzIHByb3Zpc2lvbiB3aWxsIGhvbGQgdW50aWwgdGhlIGxhc3QgU2F0dXJkYXkgaW4KLSMgICBPY3RvYmVyIDIwMDUuCi0jCi0jICAiUG9ydC1hdS1QcmluY2UsIE1hcmNoIDMxLCAyMDA1IgotIwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wNC0wNCk6Ci0jIEkgaGF2ZSBiZWVuIGluZm9ybWVkIGJ5IHVzZXJzIHRoYXQgSGFpdGkgb2JzZXJ2ZXMgRFNUIHRoaXMgeWVhciBsaWtlCi0jIGxhc3QgeWVhciwgc28gdGhlIGN1cnJlbnQgIm9ubHkiIHJ1bGUgZm9yIDIwMDUgbWlnaHQgYmUgY2hhbmdlZCB0byBhCi0jICJtYXgiIHJ1bGUgb3IgdG8gbGFzdCB1bnRpbCAyMDA2LiAoV2hvIGtub3dzIGlmIHRoZXkgd2lsbCBvYnNlcnZlIERTVAotIyBuZXh0IHllYXIgb3IgaWYgdGhleSB3aWxsIGV4dGVuZCB0aGVpciBEU1QgbGlrZSBVUy9DYW5hZGEgbmV4dCB5ZWFyKS4KLSMKLSMgSSBoYXZlIGZvdW5kIHRoaXMgYXJ0aWNsZSBhYm91dCBpdCAoaW4gRnJlbmNoKToKLSMgaHR0cDovL3d3dy5oYWl0aXByZXNzbmV0d29yay5jb20vbmV3cy5jZm0/YXJ0aWNsZUlEPTc2MTIKLSMKLSMgVGhlIHJlYXNvbiBzZWVtcyB0byBiZSBhbiBlbmVyZ3kgY3Jpc2lzLgotCi0jIEZyb20gU3RlcGhlbiBDb2xlYm91cm5lICgyMDA3LTAyLTIyKToKLSMgU29tZSBJQVRBIGluZm86IEhhaXRpIHdvbid0IGJlIGhhdmluZyBEU1QgaW4gMjAwNy4KLQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlIYWl0aQkxOTgzCW9ubHkJLQlNYXkJOAkwOjAwCTE6MDAJRAotUnVsZQlIYWl0aQkxOTg0CTE5ODcJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJRAotUnVsZQlIYWl0aQkxOTgzCTE5ODcJLQlPY3QJbGFzdFN1bgkwOjAwCTAJUwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IEFUIGlzIDI6MDAsIGJ1dCBJQVRBIFNTSU0gKDE5OTEvMTk5Nykgc2F5cyAxOjAwcy4KLSMgR28gd2l0aCBJQVRBLgotUnVsZQlIYWl0aQkxOTg4CTE5OTcJLQlBcHIJU3VuPj0xCTE6MDBzCTE6MDAJRAotUnVsZQlIYWl0aQkxOTg4CTE5OTcJLQlPY3QJbGFzdFN1bgkxOjAwcwkwCVMKLVJ1bGUJSGFpdGkJMjAwNQkyMDA2CS0JQXByCVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlIYWl0aQkyMDA1CTIwMDYJLQlPY3QJbGFzdFN1bgkwOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1BvcnQtYXUtUHJpbmNlIC00OjQ5OjIwIC0JTE1UCTE4OTAKLQkJCS00OjQ5CS0JUFBNVAkxOTE3IEphbiAyNCAxMjowMCAjIFAtYS1QIE1UCi0JCQktNTowMAlIYWl0aQlFJXNUCi0KLSMgSG9uZHVyYXMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSAxOTIxIEphbiAxOyBnbyB3aXRoIFdoaXRtYW4ncyBtb3JlIHByZWNpc2UgQXByIDEuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNS0wNSk6Ci0jIHdvcmxkdGltZXpvbmUuY29tIHJlcG9ydHMgYSAyMDA2LTA1LTAyIFNwYW5pc2gtbGFuZ3VhZ2UgQVAgYXJ0aWNsZQotIyBzYXlpbmcgSG9uZHVyYXMgd2lsbCBzdGFydCB1c2luZyBEU1QgbWlkbmlnaHQgU2F0dXJkYXksIGVmZmVjdGl2ZSA0Ci0jIG1vbnRocyB1bnRpbCBTZXB0ZW1iZXIuICBMYSBUcmlidW5hIHJlcG9ydGVkIHRvZGF5Ci0jIDxodHRwOi8vd3d3LmxhdHJpYnVuYS5obi85OTI5OS5odG1sPiB0aGF0IE1hbnVlbCBaZWxheWEsIHRoZSBwcmVzaWRlbnQKLSMgb2YgSG9uZHVyYXMsIHJlZnVzZWQgdG8gYmFjayBkb3duIG9uIHRoaXMuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDgtMDgpOgotIyBJdCBzZWVtcyB0aGF0IEhvbmR1cmFzIGhhcyByZXR1cm5lZCBmcm9tIERTVCB0byBzdGFuZGFyZCB0aW1lIHRoaXMgTW9uZGF5IGF0Ci0jIDAwOjAwIGhvdXJzIChwcm9sb25naW5nIFN1bmRheSB0byAyNSBob3VycyBkdXJhdGlvbikuCi0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfaG9uZHVyYXMwNC5odG1sCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wOC0wOCk6Ci0jIEFsc28gc2VlIERpYXJpbyBFbCBIZXJhbGRvLCBUaGUgY291bnRyeSByZXR1cm5zIHRvIHN0YW5kYXJkIHRpbWUgKDIwMDYtMDgtMDgpCi0jIDxodHRwOi8vd3d3LmVsaGVyYWxkby5obi9ub3RhLnBocD9uaWQ9NTQ5NDEmc2VjPTEyPi4KLSMgSXQgbWVudGlvbnMgZXhlY3V0aXZlIGRlY3JlZSAxOC0yMDA2LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA4LTE3KToKLSMgSG9uZHVyYXMgd2lsbCBvYnNlcnZlIERTVCBmcm9tIDIwMDcgdG8gMjAwOSwgZXhhY3QgZGF0ZXMgYXJlIG5vdAotIyBwdWJsaXNoZWQsIEkgaGF2ZSBsb2NhdGVkIHRoaXMgYXV0aG9yaXRhdGl2ZSBzb3VyY2U6Ci0jIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ29iLmhuL25vdGljaWEuYXNweD9uSWQ9NDcKLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wMy0zMCk6Ci0jIGh0dHA6Ly93d3cubGFwcmVuc2Fobi5jb20vcGFpc19ub3RhLnBocD9pZDA0OTYyPTczODYKLSMgU28gaXQgc2VlbXMgdGhhdCBIb25kdXJhcyB3aWxsIG5vdCBlbnRlciBEU1QgdGhpcyB5ZWFyLi4uLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlIb25kCTE5ODcJMTk4OAktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSG9uZAkxOTg3CTE5ODgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwotUnVsZQlIb25kCTIwMDYJb25seQktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSG9uZAkyMDA2CW9ubHkJLQlBdWcJTW9uPj0xCTA6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvVGVndWNpZ2FscGEgLTU6NDg6NTIgLQlMTVQJMTkyMSBBcHIKLQkJCS02OjAwCUhvbmQJQyVzVAotIwotIyBHcmVhdCBTd2FuIEkgY2VkZWQgYnkgVVMgdG8gSG9uZHVyYXMgaW4gMTk3MgotCi0jIEphbWFpY2EKLQotIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgotIyBGb2xsb3dzIFVTIHJ1bGVzLgotCi0jIEZyb20gVS4gUy4gTmF2YWwgT2JzZXJ2YXRvcnkgKDE5ODktMDEtMTkpOgotIyBKQU1BSUNBICAgICAgICAgICAgIDUgSCAgQkVISU5EIFVUQwotCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0phbWFpY2EJLTU6MDc6MTIgLQlMTVQJMTg5MAkJIyBLaW5nc3RvbgotCQkJLTU6MDc6MTIgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKLQkJCS01OjAwCS0JRVNUCTE5NzQgQXByIDI4IDI6MDAKLQkJCS01OjAwCVVTCUUlc1QJMTk4NAotCQkJLTU6MDAJLQlFU1QKLQotIyBNYXJ0aW5pcXVlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTWFydGluaXF1ZQktNDowNDoyMCAtICAgICAgTE1UCTE4OTAJCSMgRm9ydC1kZS1GcmFuY2UKLQkJCS00OjA0OjIwIC0JRkZNVAkxOTExIE1heSAgICAgIyBGb3J0LWRlLUZyYW5jZSBNVAotCQkJLTQ6MDAJLQlBU1QJMTk4MCBBcHIgIDYKLQkJCS00OjAwCTE6MDAJQURUCTE5ODAgU2VwIDI4Ci0JCQktNDowMAktCUFTVAotCi0jIE1vbnRzZXJyYXQKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIEluIDE5OTUgdm9sY2FuaWMgZXJ1cHRpb25zIGZvcmNlZCBldmFjdWF0aW9uIG9mIFBseW1vdXRoLCB0aGUgY2FwaXRhbC4KLSMgd29ybGQuZ2F6ZXR0ZWVyLmNvbSBzYXlzIENvcmsgSGlsbCBpcyB0aGUgbW9zdCBwb3B1bG91cyBsb2NhdGlvbiBub3cuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTW9udHNlcnJhdAktNDowODo1MiAtCUxNVAkxOTExIEp1bCAxIDA6MDEgICAjIENvcmsgSGlsbAotCQkJLTQ6MDAJLQlBU1QKLQotIyBOaWNhcmFndWEKLSMKLSMgVGhpcyB1c2VzIFNoYW5rcyAmIFBvdHRlbmdlciBmb3IgdGltZXMgYmVmb3JlIDIwMDUuCi0jCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTA0LTEyKToKLSMgSSd2ZSBnb3QgcmVwb3J0cyBmcm9tIDggZGlmZmVyZW50IHBlb3BsZSB0aGF0IE5pY2FyYWd1YSBqdXN0IHN0YXJ0ZWQKLSMgRFNUIG9uIFN1bmRheSAyMDA1LTA0LTEwLCBpbiBvcmRlciB0byBzYXZlIGVuZXJneSBiZWNhdXNlIG9mCi0jIGV4cGVuc2l2ZSBwZXRyb2xldW0uICBUaGUgZXhhY3QgZW5kIGRhdGUgZm9yIERTVCBpcyBub3QgeWV0Ci0jIGFubm91bmNlZCwgb25seSAiU2VwdGVtYmVyIiBidXQgc29tZSBzaXRlcyBhbHNvIHNheSAibWlkLVNlcHRlbWJlciIuCi0jIFNvbWUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlIFByZXNpZGVudCdzIG9mZmljaWFsIHNpdGU6Ci0jIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ29iLm5pL1ByZXNpZGVuY2lhL0ZpbGVzX2luZGV4L1NlY3JldGFyaWEvTm90YXMlMjBkZSUyMFByZW5zYS9QcmVzaWRlbnRlLzIwMDUvQUJSSUwvR29iaWVybm8tZGUtbmljYXJhZ3VhLWFkZWxhbnRhLWhvcmEtb2ZpY2lhbC0wNmFicmlsLmh0bQotIyBUaGUgRGVjcmVlLCBubyAyMy0yMDA1IGlzIGF2YWlsYWJsZSBoZXJlOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9idXNjYWRvcl9nYWNldGEvQkQvREVDUkVUT1MvMjAwNS9EZWNyZXRvJTIwMjMtMjAwNSUyMFNlJTIwYWRlbGFudGElMjBlbiUyMHVuYSUyMGhvcmElMjBlbiUyMHRvZG8lMjBlbCUyMHRlcnJpdG9yaW8lMjBuYWNpb25hbCUyMGFwYXJ0aXIlMjBkZSUyMGxhcyUyMDI0aG9yYXMlMjBkZWwlMjAwOSUyMGRlJTIwQWJyaWwucGRmCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDUtMDEpOgotIyBUaGUgZGVjcmVlIGRvZXNuJ3Qgc2F5IGFueXRoaW5nIGFib3V0IGRheWxpZ2h0IHNhdmluZywgYnV0IGZvciBub3cgbGV0J3MKLSMgYXNzdW1lIHRoYXQgaXQgaXMgZGF5bGlnaHQgc2F2aW5nLi4uLgotIwotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA0LTIxKToKLSMgVGhlIEFzc29jaWF0ZWQgUHJlc3Mgc3Rvcnkgb24gdGhlIHRpbWUgY2hhbmdlLCB3aGljaCBjYW4gYmUgZm91bmQgYXQKLSMgaHR0cDovL3d3dy5sYXBhbG1haW50ZXJhY3Rpdm8uY29tL2d1aWFzL2NvbnRlbnQvZ2VuL2FwL0FtZXJpY2FfTGF0aW5hL0FNQ19HRU5fTklDQVJBR1VBX0hPUkEuaHRtbAotIyBhbmQgZWxzZXdoZXJlLCBzYXlzIChmaWZ0aCBwYXJhZ3JhcGgsIHRyYW5zbGF0ZWQgZnJvbSBTcGFuaXNoKTogICJUaGUgbGFzdAotIyB0aW1lIHRoYXQgYSBjaGFuZ2Ugb2YgY2xvY2tzIHdhcyBhcHBsaWVkIHRvIHNhdmUgZW5lcmd5IHdhcyBpbiB0aGUgeWVhciAyMDAwCi0jIGR1cmluZyB0aGUgQXJub2xkbyBBbGVtYW4gYWRtaW5pc3RyYXRpb24uIi4uLgotIyBUaGUgbm9ydGhhbWVyaWNhIGZpbGUgc2F5cyB0aGF0IE5pY2FyYWd1YSBoYXMgYmVlbiBvbiBVVEMtNiBjb250aW51b3VzbHkKLSMgc2luY2UgRGVjZW1iZXIgMTk5OC4gIEkgd2Fzbid0IGFibGUgdG8gZmluZCBhbnkgZGV0YWlscyBvZiBOaWNhcmFndWFuIHRpbWUKLSMgY2hhbmdlcyBpbiAyMDAwLiAgUGVyaGFwcyBhIG5vdGUgY291bGQgYmUgYWRkZWQgdG8gdGhlIG5vcnRoYW1lcmljYSBmaWxlLCB0bwotIyB0aGUgZWZmZWN0IHRoYXQgd2UgaGF2ZSBpbmRpcmVjdCBldmlkZW5jZSB0aGF0IERTVCB3YXMgb2JzZXJ2ZWQgaW4gMjAwMC4KLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDUtMTEtMDIpOgotIyBOaWNhcmFndWEgbGVmdCBEU1QgdGhlIDIwMDUtMTAtMDIgYXQgMDA6MDAgKGxvY2FsIHRpbWUpLgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9wcmVzaWRlbmNpYS9maWxlc19pbmRleC9zZWNyZXRhcmlhL2NvbXVuaWNhZG9zLzIwMDUvc2VwdGllbWJyZS8yNnNlcHRpZW1icmUtY2FtYmlvLWhvcmEuaHRtCi0jICgyMDA1LTA5LTI2KQotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNS0wNSk6Ci0jIGh0dHA6Ly93d3cuZWxudWV2b2RpYXJpby5jb20ubmkvMjAwNi8wNS8wMS9uYWNpb25hbGVzLzE4NDEwCi0jIChteSBpbmZvcm1hbCB0cmFuc2xhdGlvbikKLSMgQnkgb3JkZXIgb2YgdGhlIHByZXNpZGVudCBvZiB0aGUgcmVwdWJsaWMsIEVucmlxdWUgQm9sYW5vcywgTmljYXJhZ3VhCi0jIGFkdmFuY2VkIGJ5IHNpeHR5IG1pbnV0ZXMgdGhlaXIgb2ZmaWNpYWwgdGltZSwgeWVzdGVyZGF5IGF0IDIgaW4gdGhlCi0jIG1vcm5pbmcsIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkgdW50aWwgMzAudGguIG9mIHNlcHRlbWJlci4KLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMzApOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9idXNjYWRvcl9nYWNldGEvQkQvREVDUkVUT1MvMjAwNi9ELTA2My0yMDA2UC1QUk4tQ2FtYmlvLUhvcmEucGRmCi0jIE15IGluZm9ybWFsIHRyYW5zbGF0aW9uIHJ1bnM6Ci0jIFRoZSBuYXR1cmFsIHN1biB0aW1lIGlzIHJlc3RvcmVkIGluIGFsbCB0aGUgbmF0aW9uYWwgdGVycml0b3J5LCBpbiB0aGF0IHRoZQotIyB0aW1lIGlzIHJldHVybmVkIG9uZSBob3VyIGF0IDAxOjAwIGFtIG9mIE9jdG9iZXIgMSBvZiAyMDA2LgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTmljCTE5NzkJMTk4MAktCU1hcglTdW4+PTE2CTA6MDAJMTowMAlECi1SdWxlCU5pYwkxOTc5CTE5ODAJLQlKdW4JTW9uPj0yMwkwOjAwCTAJUwotUnVsZQlOaWMJMjAwNQlvbmx5CS0JQXByCTEwCTA6MDAJMTowMAlECi1SdWxlCU5pYwkyMDA1CW9ubHkJLQlPY3QJU3VuPj0xCTA6MDAJMAlTCi1SdWxlCU5pYwkyMDA2CW9ubHkJLQlBcHIJMzAJMjowMAkxOjAwCUQKLVJ1bGUJTmljCTIwMDYJb25seQktCU9jdAlTdW4+PTEJMTowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9NYW5hZ3VhCS01OjQ1OjA4IC0JTE1UCTE4OTAKLQkJCS01OjQ1OjEyIC0JTU1UCTE5MzQgSnVuIDIzICMgTWFuYWd1YSBNZWFuIFRpbWU/Ci0JCQktNjowMAktCUNTVAkxOTczIE1heQotCQkJLTU6MDAJLQlFU1QJMTk3NSBGZWIgMTYKLQkJCS02OjAwCU5pYwlDJXNUCTE5OTIgSmFuICAxIDQ6MDAKLQkJCS01OjAwCS0JRVNUCTE5OTIgU2VwIDI0Ci0JCQktNjowMAktCUNTVAkxOTkzCi0JCQktNTowMAktCUVTVAkxOTk3Ci0JCQktNjowMAlOaWMJQyVzVAotCi0jIFBhbmFtYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL1BhbmFtYQktNToxODowOCAtCUxNVAkxODkwCi0JCQktNToxOTozNiAtCUNNVAkxOTA4IEFwciAyMiAgICMgQ29sb24gTWVhbiBUaW1lCi0JCQktNTowMAktCUVTVAotCi0jIFB1ZXJ0byBSaWNvCi0jIFRoZXJlIGFyZSB0b28gbWFueSBTYW4gSnVhbnMgZWxzZXdoZXJlLCBzbyB3ZSdsbCB1c2UgYFB1ZXJ0b19SaWNvJy4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9QdWVydG9fUmljbyAtNDoyNDoyNSAtCUxNVAkxODk5IE1hciAyOCAxMjowMCAgICAjIFNhbiBKdWFuCi0JCQktNDowMAktCUFTVAkxOTQyIE1heSAgMwotCQkJLTQ6MDAJVVMJQSVzVAkxOTQ2Ci0JCQktNDowMAktCUFTVAotCi0jIFN0IEtpdHRzLU5ldmlzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvU3RfS2l0dHMJLTQ6MTA6NTIgLQlMTVQJMTkxMiBNYXIgMgkjIEJhc3NldGVycmUKLQkJCS00OjAwCS0JQVNUCi0KLSMgU3QgTHVjaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9TdF9MdWNpYQktNDowNDowMCAtCUxNVAkxODkwCQkjIENhc3RyaWVzCi0JCQktNDowNDowMCAtCUNNVAkxOTEyCSAgICAjIENhc3RyaWVzIE1lYW4gVGltZQotCQkJLTQ6MDAJLQlBU1QKLQotIyBTdCBQaWVycmUgYW5kIE1pcXVlbG9uCi0jIFRoZXJlIGFyZSB0b28gbWFueSBTdCBQaWVycmVzIGVsc2V3aGVyZSwgc28gd2UnbGwgdXNlIGBNaXF1ZWxvbicuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTWlxdWVsb24JLTM6NDQ6NDAgLQlMTVQJMTkxMSBNYXkgMTUJIyBTdCBQaWVycmUKLQkJCS00OjAwCS0JQVNUCTE5ODAgTWF5Ci0JCQktMzowMAktCVBNU1QJMTk4NyAjIFBpZXJyZSAmIE1pcXVlbG9uIFRpbWUKLQkJCS0zOjAwCUNhbmFkYQlQTSVzVAotCi0jIFN0IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvU3RfVmluY2VudAktNDowNDo1NiAtCUxNVAkxODkwCQkjIEtpbmdzdG93bgotCQkJLTQ6MDQ6NTYgLQlLTVQJMTkxMgkgICAjIEtpbmdzdG93biBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQVNUCi0KLSMgVHVya3MgYW5kIENhaWNvcwotIwotIyBGcm9tIENocmlzIER1bm4gaW4KLSMgPGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00MTUwMDc+Ci0jICgyMDA3LTAzLTE1KTogSW4gdGhlIFR1cmtzICYgQ2FpY29zIElzbGFuZHMgKEFtZXJpY2EvR3JhbmRfVHVyaykgdGhlCi0jIGRheWxpZ2h0IHNhdmluZyBkYXRlcyBmb3IgdGltZSBjaGFuZ2VzIGhhdmUgYmVlbiBhZGp1c3RlZCB0byBtYXRjaAotIyB0aGUgcmVjZW50IFUuUy4gY2hhbmdlIG9mIGRhdGVzLgotIwotIyBGcm9tIEJyaWFuIEluZ2xpcyAoMjAwNy0wNC0yOCk6Ci0jIGh0dHA6Ly93d3cudHVya3NhbmRjYWljb3MudGMvY2FsZW5kYXIvaW5kZXguaHRtIFsyMDA3LTA0LTI2XQotIyB0aGVyZSBpcyBhbiBlbnRyeSBmb3IgTm92IDQgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSBFbmRzIDIwMDciIGFuZCB0aHJlZQotIyByb3dzIGJlZm9yZSB0aGF0IHRoZXJlIGlzIGFuIG91dCBvZiBkYXRlIGVudHJ5IGZvciBPY3Q6Ci0jICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVzIEJlZ2lucyAyMDA3Ci0jIENsb2NrcyBhcmUgc2V0IGJhY2sgb25lIGhvdXIgYXQgMjowMCBhLm0uIGxvY2FsIERheWxpZ2h0IFNhdmluZyBUaW1lIgotIyBpbmRpY2F0aW5nIHRoYXQgdGhlIG5vcm1hbCBFVCBydWxlcyBhcmUgZm9sbG93ZWQuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDUtMDEpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZXkgdXNlIFVTIERTVCBydWxlcywgYnV0IElBVEEgU1NJTSAoMTk5MS8xOTk4KQotIyBzYXlzIHRoZXkgc3dpdGNoIGF0IG1pZG5pZ2h0LiAgR28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUQwkxOTc5CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlUQwkxOTc5CTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUQwkxOTg3CTIwMDYJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCVRDCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlUQwkyMDA3CW1heAktCU5vdglTdW4+PTEJMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9HcmFuZF9UdXJrCS00OjQ0OjMyIC0JTE1UCTE4OTAKLQkJCS01OjA3OjEyIC0JS01UCTE5MTIgRmViICAgICMgS2luZ3N0b24gTWVhbiBUaW1lCi0JCQktNTowMAlUQwlFJXNUCi0KLSMgQnJpdGlzaCBWaXJnaW4gSXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Ub3J0b2xhCS00OjE4OjI4IC0JTE1UCTE5MTEgSnVsICAgICMgUm9hZCBUb3duCi0JCQktNDowMAktCUFTVAotCi0jIFZpcmdpbiBJcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1N0X1Rob21hcwktNDoxOTo0NCAtCUxNVAkxOTExIEp1bCAgICAjIENoYXJsb3R0ZSBBbWFsaWUKLQkJCS00OjAwCS0JQVNUCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9wYWNpZmljbmV3IGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvcGFjaWZpY25ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3OTQwYi4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9wYWNpZmljbmV3CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBAKCMpcGFjaWZpY25ldwk4LjEKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OS0wNC0wNSk6Ci0jIE9uIDE5ODktMDQtMDUsIHRoZSBVLiBTLiBIb3VzZSBvZiBSZXByZXNlbnRhdGl2ZXMgcGFzc2VkICgyMzgtMTU0KSBhIGJpbGwKLSMgZXN0YWJsaXNoaW5nICJQYWNpZmljIFByZXNpZGVudGlhbCBFbGVjdGlvbiBUaW1lIjsgaXQgd2FzIG5vdCBhY3RlZCBvbgotIyBieSB0aGUgU2VuYXRlIG9yIHNpZ25lZCBpbnRvIGxhdyBieSB0aGUgUHJlc2lkZW50LgotIyBZb3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlICJQRSIgKFByZXNpZGVudGlhbCBFbGVjdGlvbikgYmVsb3cgdG8KLSMgIlEiIChRdWFkcmVubmlhbCkgdG8gbWFpbnRhaW4gdGhyZWUtY2hhcmFjdGVyIHpvbmUgYWJicmV2aWF0aW9ucy4KLSMgSWYgeW91J3JlIHJlYWxseSBjb25zZXJ2YXRpdmUsIHlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSBpdCB0byAiRCIuCi0jIEF2b2lkICJMIiAoTGVhcCBZZWFyKSwgd2hpY2ggd29uJ3QgYmUgdHJ1ZSBpbiAyMTAwLgotCi0jIElmIFByZXNpZGVudGlhbCBFbGVjdGlvbiBUaW1lIGlzIGV2ZXIgZXN0YWJsaXNoZWQsIHJlcGxhY2UgIlhYWFgiIGJlbG93Ci0jIHdpdGggdGhlIHllYXIgdGhlIGxhdyB0YWtlcyBlZmZlY3QgYW5kIHVuY29tbWVudCB0aGUgIiMjIiBsaW5lcy4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMjIFJ1bGUJVHdpbGl0ZQlYWFhYCW1heAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLSMjIFJ1bGUJVHdpbGl0ZQlYWFhYCW1heAl1c3ByZXMJT2N0CWxhc3RTdW4JMjowMAkxOjAwCVBFCi0jIyBSdWxlCVR3aWxpdGUJWFhYWAltYXgJdXNwcmVzCU5vdglTdW4+PTcJMjowMAkwCVMKLSMjIFJ1bGUJVHdpbGl0ZQlYWFhYCW1heAlub25wcmVzCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0KLSMgWm9uZQlOQU1FCQkJR01UT0ZGCVJVTEVTL1NBVkUJRk9STUFUCVtVTlRJTF0KLSMjIFpvbmUJQW1lcmljYS9Mb3NfQW5nZWxlcy1QRVQJLTg6MDAJVVMJCVAlc1QJWFhYWAotIyMJCQkJLTg6MDAJVHdpbGl0ZQkJUCVzVAotCi0jIEZvciBub3cuLi4KLUxpbmsJQW1lcmljYS9Mb3NfQW5nZWxlcwlVUy9QYWNpZmljLU5ldwkjIwpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4NyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL3NvbGFyODcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODM5MzIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4NworKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0jIEAoIylzb2xhcjg3CTguMQotCi0jIFNvIG11Y2ggZm9yIGZvb3Rub3RlcyBhYm91dCBTYXVkaSBBcmFiaWEuCi0jIEFwcGFyZW50IG5vb24gdGltZXMgYmVsb3cgYXJlIGZvciBSaXlhZGg7IHlvdXIgbWlsZWFnZSB3aWxsIHZhcnkuCi0jIFRpbWVzIHdlcmUgY29tcHV0ZWQgdXNpbmcgZm9ybXVsYXMgaW4gdGhlIFUuUy4gTmF2YWwgT2JzZXJ2YXRvcnkncwotIyBBbG1hbmFjIGZvciBDb21wdXRlcnMgMTk4NzsgdGhlIGZvcm11bGFzICJ3aWxsIGdpdmUgRXFUIHRvIGFuIGFjY3VyYWN5IG9mCi0jIFtwbHVzIG9yIG1pbnVzIHR3b10gc2Vjb25kcyBkdXJpbmcgdGhlIGN1cnJlbnQgeWVhci4iCi0jCi0jIFJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGZpdmUgc2Vjb25kcyByZXN1bHRzIGluIGZld2VyIHRoYW4KLSMgMjU2IGRpZmZlcmVudCAidGltZSB0eXBlcyItLWEgbGltaXQgdGhhdCdzIGZhY2VkIGJlY2F1c2UgdGltZSB0eXBlcyBhcmUKLSMgc3RvcmVkIG9uIGRpc2sgYXMgdW5zaWduZWQgY2hhcnMuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxCTEyOjAzOjIwcyAtMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyCTEyOjAzOjUwcyAtMDowMzo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkzCTEyOjA0OjE1cyAtMDowNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk0CTEyOjA0OjQ1cyAtMDowNDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk1CTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk2CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk3CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk4CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk5CTEyOjA2OjU1cyAtMDowNjo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxMAkxMjowNzoyMHMgLTA6MDc6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTEJMTI6MDc6NDVzIC0wOjA3OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTEyCTEyOjA4OjEwcyAtMDowODoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxMwkxMjowODozMHMgLTA6MDg6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTQJMTI6MDg6NTVzIC0wOjA4OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE1CTEyOjA5OjE1cyAtMDowOToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxNgkxMjowOTozNXMgLTA6MDk6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTcJMTI6MDk6NTVzIC0wOjA5OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE4CTEyOjEwOjE1cyAtMDoxMDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxOQkxMjoxMDozNXMgLTA6MTA6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjAJMTI6MTA6NTVzIC0wOjEwOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTIxCTEyOjExOjEwcyAtMDoxMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyMgkxMjoxMTozMHMgLTA6MTE6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjMJMTI6MTE6NDVzIC0wOjExOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI0CTEyOjEyOjAwcyAtMDoxMjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyNQkxMjoxMjoxNXMgLTA6MTI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjYJMTI6MTI6MzBzIC0wOjEyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI3CTEyOjEyOjQwcyAtMDoxMjo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyOAkxMjoxMjo1NXMgLTA6MTI6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjkJMTI6MTM6MDVzIC0wOjEzOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTMwCTEyOjEzOjE1cyAtMDoxMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkzMQkxMjoxMzoyNXMgLTA6MTM6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMQkxMjoxMzozNXMgLTA6MTM6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMgkxMjoxMzo0MHMgLTA6MTM6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMwkxMjoxMzo1MHMgLTA6MTM6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNAkxMjoxMzo1NXMgLTA6MTM6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNQkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNgkxMjoxNDowNXMgLTA6MTQ6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNwkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJOAkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJOQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTAJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTExCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxMgkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTMJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE0CTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxNQkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTYJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE3CTEyOjE0OjA1cyAtMDoxNDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxOAkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTkJMTI6MTM6NTVzIC0wOjEzOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIwCTEyOjEzOjUwcyAtMDoxMzo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyMQkxMjoxMzo0NXMgLTA6MTM6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjIJMTI6MTM6MzVzIC0wOjEzOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIzCTEyOjEzOjMwcyAtMDoxMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyNAkxMjoxMzoyMHMgLTA6MTM6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjUJMTI6MTM6MTBzIC0wOjEzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTI2CTEyOjEzOjAwcyAtMDoxMzowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyNwkxMjoxMjo1MHMgLTA6MTI6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjgJMTI6MTI6NDBzIC0wOjEyOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEJMTI6MTI6MzBzIC0wOjEyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTIJMTI6MTI6MjBzIC0wOjEyOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTMJMTI6MTI6MDVzIC0wOjEyOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTQJMTI6MTE6NTVzIC0wOjExOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTUJMTI6MTE6NDBzIC0wOjExOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTYJMTI6MTE6MjVzIC0wOjExOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTcJMTI6MTE6MTVzIC0wOjExOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTgJMTI6MTE6MDBzIC0wOjExOjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTkJMTI6MTA6NDVzIC0wOjEwOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEwCTEyOjEwOjMwcyAtMDoxMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxMQkxMjoxMDoxNXMgLTA6MTA6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTIJMTI6MDk6NTVzIC0wOjA5OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEzCTEyOjA5OjQwcyAtMDowOTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxNAkxMjowOToyNXMgLTA6MDk6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTUJMTI6MDk6MTBzIC0wOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE2CTEyOjA4OjUwcyAtMDowODo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxNwkxMjowODozNXMgLTA6MDg6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTgJMTI6MDg6MTVzIC0wOjA4OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE5CTEyOjA4OjAwcyAtMDowODowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyMAkxMjowNzo0MHMgLTA6MDc6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjEJMTI6MDc6MjVzIC0wOjA3OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTIyCTEyOjA3OjA1cyAtMDowNzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyMwkxMjowNjo1MHMgLTA6MDY6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjQJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI1CTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyNgkxMjowNTo1NXMgLTA6MDU6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjcJMTI6MDU6MzVzIC0wOjA1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI4CTEyOjA1OjE1cyAtMDowNToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyOQkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMzAJMTI6MDQ6NDBzIC0wOjA0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTMxCTEyOjA0OjI1cyAtMDowNDoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxCTEyOjA0OjA1cyAtMDowNDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyCTEyOjAzOjQ1cyAtMDowMzo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkzCTEyOjAzOjMwcyAtMDowMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk0CTEyOjAzOjEwcyAtMDowMzoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk1CTEyOjAyOjU1cyAtMDowMjo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk2CTEyOjAyOjM1cyAtMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk3CTEyOjAyOjIwcyAtMDowMjoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk4CTEyOjAyOjA1cyAtMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk5CTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxMAkxMjowMTozMHMgLTA6MDE6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTEJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTEyCTEyOjAwOjU1cyAtMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxMwkxMjowMDo0MHMgLTA6MDA6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTQJMTI6MDA6MjVzIC0wOjAwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTE1CTEyOjAwOjEwcyAtMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxNgkxMTo1OTo1NXMgMDowMDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxNwkxMTo1OTo0NXMgMDowMDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxOAkxMTo1OTozMHMgMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxOQkxMTo1OToxNXMgMDowMDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMAkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMQkxMTo1ODo1MHMgMDowMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMgkxMTo1ODo0MHMgMDowMToyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMwkxMTo1ODoyNXMgMDowMTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNAkxMTo1ODoxNXMgMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNQkxMTo1ODowNXMgMDowMTo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNgkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNwkxMTo1Nzo0NXMgMDowMjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyOAkxMTo1NzozNXMgMDowMjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyOQkxMTo1NzoyNXMgMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkzMAkxMTo1NzoxNXMgMDowMjo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxCTExOjU3OjEwcyAwOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTIJMTE6NTc6MDBzIDA6MDM6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMwkxMTo1Njo1NXMgMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk0CTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTUJMTE6NTY6NDVzIDA6MDM6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJNgkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk3CTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTgJMTE6NTY6MzBzIDA6MDM6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMAkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxOAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMAkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMQkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMgkxMTo1NjozNXMgMDowMzoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMwkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNAkxMTo1Njo0NXMgMDowMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNQkxMTo1Njo1MHMgMDowMzoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNgkxMTo1Njo1NXMgMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNwkxMTo1NzowMHMgMDowMzowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyOAkxMTo1NzoxMHMgMDowMjo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyOQkxMTo1NzoxNXMgMDowMjo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkzMAkxMTo1NzoyNXMgMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkzMQkxMTo1NzozMHMgMDowMjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxCTExOjU3OjQwcyAwOjAyOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTIJMTE6NTc6NTBzIDA6MDI6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMwkxMTo1ODowMHMgMDowMjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk0CTExOjU4OjEwcyAwOjAxOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTUJMTE6NTg6MjBzIDA6MDE6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JNgkxMTo1ODozMHMgMDowMTozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk3CTExOjU4OjQwcyAwOjAxOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTgJMTE6NTg6NTBzIDA6MDE6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JOQkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMAkxMTo1OToxNXMgMDowMDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMQkxMTo1OTozMHMgMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMgkxMTo1OTo0MHMgMDowMDoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMwkxMTo1OTo1MHMgMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxNAkxMjowMDowNXMgLTA6MDA6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTUJMTI6MDA6MTVzIC0wOjAwOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE2CTEyOjAwOjMwcyAtMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxNwkxMjowMDo0NXMgLTA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTgJMTI6MDA6NTVzIC0wOjAwOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE5CTEyOjAxOjEwcyAtMDowMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyMAkxMjowMToyMHMgLTA6MDE6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjEJMTI6MDE6MzVzIC0wOjAxOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTIyCTEyOjAxOjUwcyAtMDowMTo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyMwkxMjowMjowMHMgLTA6MDI6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjQJMTI6MDI6MTVzIC0wOjAyOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI1CTEyOjAyOjI1cyAtMDowMjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyNgkxMjowMjo0MHMgLTA6MDI6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjcJMTI6MDI6NTBzIC0wOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI4CTEyOjAzOjA1cyAtMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyOQkxMjowMzoxNXMgLTA6MDM6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMzAJMTI6MDM6MzBzIC0wOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEJMTI6MDM6NDBzIC0wOjAzOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTIJMTI6MDM6NTBzIC0wOjAzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTMJMTI6MDQ6MDVzIC0wOjA0OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTQJMTI6MDQ6MTVzIC0wOjA0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTUJMTI6MDQ6MjVzIC0wOjA0OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTYJMTI6MDQ6MzVzIC0wOjA0OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTcJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTgJMTI6MDQ6NTVzIC0wOjA0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTkJMTI6MDU6MDVzIC0wOjA1OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEwCTEyOjA1OjE1cyAtMDowNToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxMQkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTIJMTI6MDU6MzBzIC0wOjA1OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEzCTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxNAkxMjowNTo0NXMgLTA6MDU6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTUJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE2CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxNwkxMjowNjowNXMgLTA6MDY6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTgJMTI6MDY6MTBzIC0wOjA2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE5CTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyMAkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjEJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTIyCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyMwkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjQJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI1CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyNgkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjcJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI4CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyOQkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMzAJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTMxCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxCTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyCTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkzCTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk0CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk1CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk2CTEyOjA1OjU1cyAtMDowNTo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk3CTEyOjA1OjUwcyAtMDowNTo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk4CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk5CTEyOjA1OjM1cyAtMDowNTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxMAkxMjowNToyNXMgLTA6MDU6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTEJMTI6MDU6MTVzIC0wOjA1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTEyCTEyOjA1OjA1cyAtMDowNTowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxMwkxMjowNDo1NXMgLTA6MDQ6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTQJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE1CTEyOjA0OjM1cyAtMDowNDozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxNgkxMjowNDoyNXMgLTA6MDQ6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTcJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE4CTEyOjA0OjAwcyAtMDowNDowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxOQkxMjowMzo0NXMgLTA6MDM6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjAJMTI6MDM6MzBzIC0wOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTIxCTEyOjAzOjE1cyAtMDowMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyMgkxMjowMzowMHMgLTA6MDM6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjMJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI0CTEyOjAyOjMwcyAtMDowMjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyNQkxMjowMjoxNXMgLTA6MDI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjYJMTI6MDI6MDBzIC0wOjAyOjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI3CTEyOjAxOjQwcyAtMDowMTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyOAkxMjowMToyNXMgLTA6MDE6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjkJMTI6MDE6MDVzIC0wOjAxOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTMwCTEyOjAwOjUwcyAtMDowMDo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkzMQkxMjowMDozMHMgLTA6MDA6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJMQkxMjowMDoxMHMgLTA6MDA6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJMgkxMTo1OTo1MHMgMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkzCTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTQJMTE6NTk6MTVzIDA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJNQkxMTo1ODo1NXMgMDowMTowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk2CTExOjU4OjM1cyAwOjAxOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTcJMTE6NTg6MTVzIDA6MDE6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJOAkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk5CTExOjU3OjMwcyAwOjAyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEwCTExOjU3OjEwcyAwOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTExCTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEyCTExOjU2OjMwcyAwOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEzCTExOjU2OjEwcyAwOjAzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE0CTExOjU1OjQ1cyAwOjA0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE1CTExOjU1OjI1cyAwOjA0OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE2CTExOjU1OjA1cyAwOjA0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE3CTExOjU0OjQ1cyAwOjA1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE4CTExOjU0OjIwcyAwOjA1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE5CTExOjU0OjAwcyAwOjA2OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIwCTExOjUzOjQwcyAwOjA2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIxCTExOjUzOjE1cyAwOjA2OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIyCTExOjUyOjU1cyAwOjA3OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIzCTExOjUyOjM1cyAwOjA3OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI0CTExOjUyOjE1cyAwOjA3OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI1CTExOjUxOjU1cyAwOjA4OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI2CTExOjUxOjM1cyAwOjA4OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI3CTExOjUxOjEwcyAwOjA4OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI4CTExOjUwOjUwcyAwOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI5CTExOjUwOjMwcyAwOjA5OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTMwCTExOjUwOjEwcyAwOjA5OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEJMTE6NDk6NTBzIDA6MTA6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJMgkxMTo0OTozNXMgMDoxMDoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkzCTExOjQ5OjE1cyAwOjEwOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTQJMTE6NDg6NTVzIDA6MTE6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJNQkxMTo0ODozNXMgMDoxMToyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk2CTExOjQ4OjIwcyAwOjExOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTcJMTE6NDg6MDBzIDA6MTI6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJOAkxMTo0Nzo0NXMgMDoxMjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk5CTExOjQ3OjI1cyAwOjEyOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEwCTExOjQ3OjEwcyAwOjEyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTExCTExOjQ2OjU1cyAwOjEzOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEyCTExOjQ2OjQwcyAwOjEzOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEzCTExOjQ2OjI1cyAwOjEzOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE0CTExOjQ2OjEwcyAwOjEzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE1CTExOjQ1OjU1cyAwOjE0OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE2CTExOjQ1OjQ1cyAwOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE3CTExOjQ1OjMwcyAwOjE0OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE4CTExOjQ1OjIwcyAwOjE0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE5CTExOjQ1OjA1cyAwOjE0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIwCTExOjQ0OjU1cyAwOjE1OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIxCTExOjQ0OjQ1cyAwOjE1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIyCTExOjQ0OjM1cyAwOjE1OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIzCTExOjQ0OjI1cyAwOjE1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI0CTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI1CTExOjQ0OjEwcyAwOjE1OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI2CTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI3CTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI4CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI5CTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTMwCTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTMxCTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJMgkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkzCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTQJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJNQkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk2CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTcJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk5CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEwCTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTExCTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEyCTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEzCTExOjQ0OjE1cyAwOjE1OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE0CTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE1CTExOjQ0OjMwcyAwOjE1OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE2CTExOjQ0OjQwcyAwOjE1OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE3CTExOjQ0OjUwcyAwOjE1OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE4CTExOjQ1OjA1cyAwOjE0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE5CTExOjQ1OjE1cyAwOjE0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIwCTExOjQ1OjMwcyAwOjE0OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIxCTExOjQ1OjQ1cyAwOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIyCTExOjQ2OjAwcyAwOjE0OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIzCTExOjQ2OjE1cyAwOjEzOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI0CTExOjQ2OjMwcyAwOjEzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI1CTExOjQ2OjUwcyAwOjEzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI2CTExOjQ3OjEwcyAwOjEyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI3CTExOjQ3OjI1cyAwOjEyOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI4CTExOjQ3OjQ1cyAwOjEyOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI5CTExOjQ4OjA1cyAwOjExOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTMwCTExOjQ4OjMwcyAwOjExOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEJMTE6NDg6NTBzIDA6MTE6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMgkxMTo0OToxMHMgMDoxMDo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkzCTExOjQ5OjM1cyAwOjEwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTQJMTE6NTA6MDBzIDA6MTA6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJNQkxMTo1MDoyNXMgMDowOTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk2CTExOjUwOjUwcyAwOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTcJMTE6NTE6MTVzIDA6MDg6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJOAkxMTo1MTo0MHMgMDowODoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk5CTExOjUyOjA1cyAwOjA3OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEwCTExOjUyOjMwcyAwOjA3OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTExCTExOjUzOjAwcyAwOjA3OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEyCTExOjUzOjI1cyAwOjA2OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEzCTExOjUzOjU1cyAwOjA2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE0CTExOjU0OjI1cyAwOjA1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE1CTExOjU0OjUwcyAwOjA1OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE2CTExOjU1OjIwcyAwOjA0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE3CTExOjU1OjUwcyAwOjA0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE4CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE5CTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIwCTExOjU3OjIwcyAwOjAyOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIxCTExOjU3OjUwcyAwOjAyOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIyCTExOjU4OjIwcyAwOjAxOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIzCTExOjU4OjUwcyAwOjAxOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI0CTExOjU5OjIwcyAwOjAwOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI1CTExOjU5OjUwcyAwOjAwOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI2CTEyOjAwOjIwcyAtMDowMDoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyNwkxMjowMDo0NXMgLTA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMjgJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI5CTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkzMAkxMjowMjoxNXMgLTA6MDI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMzEJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLQotIyBSaXlhZGggaXMgYXQgYWJvdXQgNDYgZGVncmVlcyA0NiBtaW51dGVzIEVhc3Q6ICAzIGhycywgNyBtaW5zLCA0IHNlY3MKLSMgQmVmb3JlIGFuZCBhZnRlciAxOTg3LCB3ZSdsbCBvcGVyYXRlIG9uIGxvY2FsIG1lYW4gc29sYXIgdGltZS4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUml5YWRoODcJMzowNzowNAktCQl6enoJMTk4NwotCQkJMzowNzowNAlzb2w4NwkJenp6CTE5ODgKLQkJCTM6MDc6MDQJLQkJenp6Ci0jIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uCi1MaW5rCUFzaWEvUml5YWRoODcJTWlkZWFzdC9SaXlhZGg4NwpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4OCBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL3NvbGFyODgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2ZlOGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4OAorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0jIEAoIylzb2xhcjg4CTguMQotCi0jIEFwcGFyZW50IG5vb24gdGltZXMgYmVsb3cgYXJlIGZvciBSaXlhZGg7IHRoZXkncmUgYSBiaXQgb2ZmIGZvciBvdGhlciBwbGFjZXMuCi0jIFRpbWVzIHdlcmUgY29tcHV0ZWQgdXNpbmcgZm9ybXVsYXMgaW4gdGhlIFUuUy4gTmF2YWwgT2JzZXJ2YXRvcnkncwotIyBBbG1hbmFjIGZvciBDb21wdXRlcnMgMTk4ODsgdGhlIGZvcm11bGFzICJ3aWxsIGdpdmUgRXFUIHRvIGFuIGFjY3VyYWN5IG9mCi0jIFtwbHVzIG9yIG1pbnVzIHR3b10gc2Vjb25kcyBkdXJpbmcgdGhlIGN1cnJlbnQgeWVhci4iCi0jCi0jIFJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGZpdmUgc2Vjb25kcyByZXN1bHRzIGluIGZld2VyIHRoYW4KLSMgMjU2IGRpZmZlcmVudCAidGltZSB0eXBlcyItLWEgbGltaXQgdGhhdCdzIGZhY2VkIGJlY2F1c2UgdGltZSB0eXBlcyBhcmUKLSMgc3RvcmVkIG9uIGRpc2sgYXMgdW5zaWduZWQgY2hhcnMuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxCTEyOjAzOjE1cyAtMDowMzoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyCTEyOjAzOjQwcyAtMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkzCTEyOjA0OjEwcyAtMDowNDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk0CTEyOjA0OjQwcyAtMDowNDo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk1CTEyOjA1OjA1cyAtMDowNTowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk2CTEyOjA1OjMwcyAtMDowNTozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk3CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk4CTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgk5CTEyOjA2OjUwcyAtMDowNjo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxMAkxMjowNzoxNXMgLTA6MDc6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTEJMTI6MDc6NDBzIC0wOjA3OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTEyCTEyOjA4OjA1cyAtMDowODowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxMwkxMjowODoyNXMgLTA6MDg6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTQJMTI6MDg6NTBzIC0wOjA4OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE1CTEyOjA5OjEwcyAtMDowOToxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxNgkxMjowOTozMHMgLTA6MDk6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTcJMTI6MDk6NTBzIC0wOjA5OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE4CTEyOjEwOjEwcyAtMDoxMDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxOQkxMjoxMDozMHMgLTA6MTA6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjAJMTI6MTA6NTBzIC0wOjEwOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTIxCTEyOjExOjA1cyAtMDoxMTowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyMgkxMjoxMToyNXMgLTA6MTE6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjMJMTI6MTE6NDBzIC0wOjExOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI0CTEyOjExOjU1cyAtMDoxMTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyNQkxMjoxMjoxMHMgLTA6MTI6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjYJMTI6MTI6MjVzIC0wOjEyOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI3CTEyOjEyOjQwcyAtMDoxMjo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyOAkxMjoxMjo1MHMgLTA6MTI6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjkJMTI6MTM6MDBzIC0wOjEzOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTMwCTEyOjEzOjEwcyAtMDoxMzoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkzMQkxMjoxMzoyMHMgLTA6MTM6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMQkxMjoxMzozMHMgLTA6MTM6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMgkxMjoxMzo0MHMgLTA6MTM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMwkxMjoxMzo0NXMgLTA6MTM6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJNAkxMjoxMzo1NXMgLTA6MTM6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJNQkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJNgkxMjoxNDowNXMgLTA6MTQ6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJNwkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJOAkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJOQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTAJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTExCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxMgkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTMJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE0CTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxNQkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTYJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE3CTEyOjE0OjA1cyAtMDoxNDowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxOAkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTkJMTI6MTM6NTVzIC0wOjEzOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIwCTEyOjEzOjUwcyAtMDoxMzo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyMQkxMjoxMzo0NXMgLTA6MTM6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjIJMTI6MTM6NDBzIC0wOjEzOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIzCTEyOjEzOjMwcyAtMDoxMzozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyNAkxMjoxMzoyMHMgLTA6MTM6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjUJMTI6MTM6MTVzIC0wOjEzOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI2CTEyOjEzOjA1cyAtMDoxMzowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyNwkxMjoxMjo1NXMgLTA6MTI6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjgJMTI6MTI6NDVzIC0wOjEyOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI5CTEyOjEyOjMwcyAtMDoxMjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxCTEyOjEyOjIwcyAtMDoxMjoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyCTEyOjEyOjEwcyAtMDoxMjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkzCTEyOjExOjU1cyAtMDoxMTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk0CTEyOjExOjQ1cyAtMDoxMTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk1CTEyOjExOjMwcyAtMDoxMTozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk2CTEyOjExOjE1cyAtMDoxMToxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk3CTEyOjExOjAwcyAtMDoxMTowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk4CTEyOjEwOjQ1cyAtMDoxMDo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgk5CTEyOjEwOjMwcyAtMDoxMDozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxMAkxMjoxMDoxNXMgLTA6MTA6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTEJMTI6MTA6MDBzIC0wOjEwOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTEyCTEyOjA5OjQ1cyAtMDowOTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxMwkxMjowOTozMHMgLTA6MDk6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTQJMTI6MDk6MTBzIC0wOjA5OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE1CTEyOjA4OjU1cyAtMDowODo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxNgkxMjowODo0MHMgLTA6MDg6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTcJMTI6MDg6MjBzIC0wOjA4OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE4CTEyOjA4OjA1cyAtMDowODowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxOQkxMjowNzo0NXMgLTA6MDc6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjAJMTI6MDc6MzBzIC0wOjA3OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTIxCTEyOjA3OjEwcyAtMDowNzoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyMgkxMjowNjo1MHMgLTA6MDY6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjMJMTI6MDY6MzVzIC0wOjA2OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI0CTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyNQkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjYJMTI6MDU6NDBzIC0wOjA1OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI3CTEyOjA1OjIwcyAtMDowNToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyOAkxMjowNTowNXMgLTA6MDU6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjkJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTMwCTEyOjA0OjI1cyAtMDowNDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkzMQkxMjowNDoxMHMgLTA6MDQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMQkxMjowMzo1MHMgLTA6MDM6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMgkxMjowMzozNXMgLTA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMwkxMjowMzoxNXMgLTA6MDM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJNAkxMjowMzowMHMgLTA6MDM6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJNQkxMjowMjo0MHMgLTA6MDI6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJNgkxMjowMjoyNXMgLTA6MDI6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJNwkxMjowMjowNXMgLTA6MDI6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJOAkxMjowMTo1MHMgLTA6MDE6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJOQkxMjowMTozNXMgLTA6MDE6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTAJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTExCTEyOjAxOjAwcyAtMDowMTowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxMgkxMjowMDo0NXMgLTA6MDA6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTMJMTI6MDA6MzBzIC0wOjAwOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTE0CTEyOjAwOjE1cyAtMDowMDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxNQkxMjowMDowMHMgMDowMDowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxNgkxMTo1OTo0NXMgMDowMDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxNwkxMTo1OTozMHMgMDowMDozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxOAkxMTo1OToyMHMgMDowMDo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxOQkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyMAkxMTo1ODo1NXMgMDowMTowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyMQkxMTo1ODo0MHMgMDowMToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyMgkxMTo1ODozMHMgMDowMTozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyMwkxMTo1ODoxNXMgMDowMTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyNAkxMTo1ODowNXMgMDowMTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyNQkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyNgkxMTo1Nzo0NXMgMDowMjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyNwkxMTo1NzozNXMgMDowMjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyOAkxMTo1NzozMHMgMDowMjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkyOQkxMTo1NzoyMHMgMDowMjo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkzMAkxMTo1NzoxMHMgMDowMjo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxCTExOjU3OjA1cyAwOjAyOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTIJMTE6NTY6NTVzIDA6MDM6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMwkxMTo1Njo1MHMgMDowMzoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk0CTExOjU2OjQ1cyAwOjAzOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTUJMTE6NTY6NDBzIDA6MDM6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJNgkxMTo1NjozNXMgMDowMzoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk3CTExOjU2OjMwcyAwOjAzOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTgJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxMAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxMQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxMgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxMwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxNAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxNQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxNgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxNwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxOAkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkxOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyMAkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyMQkxMTo1NjozNXMgMDowMzoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyMgkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyMwkxMTo1Njo0NXMgMDowMzoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyNAkxMTo1Njo1MHMgMDowMzoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyNQkxMTo1Njo1NXMgMDowMzowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyNgkxMTo1NzowMHMgMDowMzowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyNwkxMTo1NzowNXMgMDowMjo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyOAkxMTo1NzoxNXMgMDowMjo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyOQkxMTo1NzoyMHMgMDowMjo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkzMAkxMTo1NzozMHMgMDowMjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkzMQkxMTo1Nzo0MHMgMDowMjoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxCTExOjU3OjUwcyAwOjAyOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTIJMTE6NTc6NTVzIDA6MDI6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMwkxMTo1ODowNXMgMDowMTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk0CTExOjU4OjE1cyAwOjAxOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTUJMTE6NTg6MzBzIDA6MDE6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JNgkxMTo1ODo0MHMgMDowMToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk3CTExOjU4OjUwcyAwOjAxOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTgJMTE6NTk6MDBzIDA6MDE6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JOQkxMTo1OToxNXMgMDowMDo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxMAkxMTo1OToyNXMgMDowMDozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxMQkxMTo1OTozNXMgMDowMDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxMgkxMTo1OTo1MHMgMDowMDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxMwkxMjowMDowMHMgMDowMDowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxNAkxMjowMDoxNXMgLTA6MDA6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTUJMTI6MDA6MjVzIC0wOjAwOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE2CTEyOjAwOjQwcyAtMDowMDo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxNwkxMjowMDo1NXMgLTA6MDA6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTgJMTI6MDE6MDVzIC0wOjAxOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE5CTEyOjAxOjIwcyAtMDowMToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyMAkxMjowMTozMHMgLTA6MDE6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjEJMTI6MDE6NDVzIC0wOjAxOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTIyCTEyOjAyOjAwcyAtMDowMjowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyMwkxMjowMjoxMHMgLTA6MDI6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjQJMTI6MDI6MjVzIC0wOjAyOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI1CTEyOjAyOjM1cyAtMDowMjozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyNgkxMjowMjo1MHMgLTA6MDI6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjcJMTI6MDM6MDBzIC0wOjAzOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI4CTEyOjAzOjE1cyAtMDowMzoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyOQkxMjowMzoyNXMgLTA6MDM6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMzAJMTI6MDM6NDBzIC0wOjAzOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTEJMTI6MDM6NTBzIC0wOjAzOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTIJMTI6MDQ6MDBzIC0wOjA0OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTMJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTQJMTI6MDQ6MjVzIC0wOjA0OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTUJMTI6MDQ6MzVzIC0wOjA0OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTYJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTcJMTI6MDQ6NTVzIC0wOjA0OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTgJMTI6MDU6MDVzIC0wOjA1OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTkJMTI6MDU6MTBzIC0wOjA1OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTEwCTEyOjA1OjIwcyAtMDowNToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxMQkxMjowNTozMHMgLTA6MDU6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTIJMTI6MDU6MzVzIC0wOjA1OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTEzCTEyOjA1OjQ1cyAtMDowNTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxNAkxMjowNTo1MHMgLTA6MDU6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTUJMTI6MDU6NTVzIC0wOjA1OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE2CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxNwkxMjowNjowNXMgLTA6MDY6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTgJMTI6MDY6MTBzIC0wOjA2OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE5CTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyMAkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjEJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTIyCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyMwkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjQJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI1CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyNgkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjcJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI4CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyOQkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMzAJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTMxCTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxCTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyCTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkzCTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk0CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk1CTEyOjA1OjU1cyAtMDowNTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk2CTEyOjA1OjUwcyAtMDowNTo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk3CTEyOjA1OjQ1cyAtMDowNTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk4CTEyOjA1OjM1cyAtMDowNTozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1Zwk5CTEyOjA1OjI1cyAtMDowNToyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxMAkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTEJMTI6MDU6MTBzIC0wOjA1OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTEyCTEyOjA1OjAwcyAtMDowNTowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxMwkxMjowNDo1MHMgLTA6MDQ6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTQJMTI6MDQ6MzVzIC0wOjA0OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE1CTEyOjA0OjI1cyAtMDowNDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxNgkxMjowNDoxNXMgLTA6MDQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTcJMTI6MDQ6MDBzIC0wOjA0OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE4CTEyOjAzOjUwcyAtMDowMzo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxOQkxMjowMzozNXMgLTA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjAJMTI6MDM6MjBzIC0wOjAzOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTIxCTEyOjAzOjA1cyAtMDowMzowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyMgkxMjowMjo1MHMgLTA6MDI6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjMJMTI6MDI6MzVzIC0wOjAyOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI0CTEyOjAyOjIwcyAtMDowMjoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyNQkxMjowMjowMHMgLTA6MDI6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjYJMTI6MDE6NDVzIC0wOjAxOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI3CTEyOjAxOjMwcyAtMDowMTozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyOAkxMjowMToxMHMgLTA6MDE6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjkJMTI6MDA6NTBzIC0wOjAwOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTMwCTEyOjAwOjM1cyAtMDowMDozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkzMQkxMjowMDoxNXMgLTA6MDA6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMQkxMTo1OTo1NXMgMDowMDowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAkyCTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTMJMTE6NTk6MjBzIDA6MDA6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJNAkxMTo1OTowMHMgMDowMTowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk1CTExOjU4OjQwcyAwOjAxOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTYJMTE6NTg6MjBzIDA6MDE6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJNwkxMTo1ODowMHMgMDowMjowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk4CTExOjU3OjM1cyAwOjAyOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTkJMTE6NTc6MTVzIDA6MDI6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTAJMTE6NTY6NTVzIDA6MDM6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTEJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTIJMTE6NTY6MTVzIDA6MDM6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTMJMTE6NTU6NTBzIDA6MDQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTQJMTE6NTU6MzBzIDA6MDQ6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTUJMTE6NTU6MTBzIDA6MDQ6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTYJMTE6NTQ6NTBzIDA6MDU6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTcJMTE6NTQ6MjVzIDA6MDU6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTgJMTE6NTQ6MDVzIDA6MDU6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMTkJMTE6NTM6NDVzIDA6MDY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjAJMTE6NTM6MjVzIDA6MDY6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjEJMTE6NTM6MDBzIDA6MDc6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjIJMTE6NTI6NDBzIDA6MDc6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjMJMTE6NTI6MjBzIDA6MDc6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjQJMTE6NTI6MDBzIDA6MDg6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjUJMTE6NTE6NDBzIDA6MDg6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjYJMTE6NTE6MTVzIDA6MDg6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjcJMTE6NTA6NTVzIDA6MDk6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjgJMTE6NTA6MzVzIDA6MDk6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMjkJMTE6NTA6MTVzIDA6MDk6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMzAJMTE6NDk6NTVzIDA6MTA6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMQkxMTo0OTozNXMgMDoxMDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAkyCTExOjQ5OjIwcyAwOjEwOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTMJMTE6NDk6MDBzIDA6MTE6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJNAkxMTo0ODo0MHMgMDoxMToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk1CTExOjQ4OjI1cyAwOjExOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTYJMTE6NDg6MDVzIDA6MTE6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJNwkxMTo0Nzo1MHMgMDoxMjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk4CTExOjQ3OjMwcyAwOjEyOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTkJMTE6NDc6MTVzIDA6MTI6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTAJMTE6NDc6MDBzIDA6MTM6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTEJMTE6NDY6NDVzIDA6MTM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTIJMTE6NDY6MzBzIDA6MTM6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTMJMTE6NDY6MTVzIDA6MTM6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTQJMTE6NDY6MDBzIDA6MTQ6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTUJMTE6NDU6NDVzIDA6MTQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTYJMTE6NDU6MzVzIDA6MTQ6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTcJMTE6NDU6MjBzIDA6MTQ6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTgJMTE6NDU6MTBzIDA6MTQ6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMTkJMTE6NDU6MDBzIDA6MTU6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjAJMTE6NDQ6NDVzIDA6MTU6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjEJMTE6NDQ6NDBzIDA6MTU6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjIJMTE6NDQ6MzBzIDA6MTU6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjMJMTE6NDQ6MjBzIDA6MTU6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjQJMTE6NDQ6MTBzIDA6MTU6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjUJMTE6NDQ6MDVzIDA6MTU6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjYJMTE6NDQ6MDBzIDA6MTY6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjcJMTE6NDM6NTVzIDA6MTY6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjgJMTE6NDM6NTBzIDA6MTY6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMjkJMTE6NDM6NDVzIDA6MTY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMzAJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMzEJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMQkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgkyCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTMJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJNAkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk1CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTYJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJNwkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk4CTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTkJMTE6NDM6NTBzIDA6MTY6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTAJMTE6NDQ6MDBzIDA6MTY6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTEJMTE6NDQ6MDVzIDA6MTU6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTIJMTE6NDQ6MTBzIDA6MTU6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTMJMTE6NDQ6MjBzIDA6MTU6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTQJMTE6NDQ6MzBzIDA6MTU6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTUJMTE6NDQ6NDBzIDA6MTU6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTYJMTE6NDQ6NTBzIDA6MTU6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTcJMTE6NDU6MDBzIDA6MTU6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTgJMTE6NDU6MTVzIDA6MTQ6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMTkJMTE6NDU6MjVzIDA6MTQ6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjAJMTE6NDU6NDBzIDA6MTQ6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjEJMTE6NDU6NTVzIDA6MTQ6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjIJMTE6NDY6MTBzIDA6MTM6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjMJMTE6NDY6MzBzIDA6MTM6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjQJMTE6NDY6NDVzIDA6MTM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjUJMTE6NDc6MDVzIDA6MTI6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjYJMTE6NDc6MjBzIDA6MTI6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjcJMTE6NDc6NDBzIDA6MTI6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjgJMTE6NDg6MDBzIDA6MTI6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMjkJMTE6NDg6MjVzIDA6MTE6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMzAJMTE6NDg6NDVzIDA6MTE6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMQkxMTo0OTowNXMgMDoxMDo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyCTExOjQ5OjMwcyAwOjEwOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTMJMTE6NDk6NTVzIDA6MTA6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJNAkxMTo1MDoxNXMgMDowOTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk1CTExOjUwOjQwcyAwOjA5OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTYJMTE6NTE6MDVzIDA6MDg6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJNwkxMTo1MTozNXMgMDowODoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk4CTExOjUyOjAwcyAwOjA4OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTkJMTE6NTI6MjVzIDA6MDc6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTAJMTE6NTI6NTVzIDA6MDc6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTEJMTE6NTM6MjBzIDA6MDY6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTIJMTE6NTM6NTBzIDA6MDY6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTMJMTE6NTQ6MTVzIDA6MDU6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTQJMTE6NTQ6NDVzIDA6MDU6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTUJMTE6NTU6MTVzIDA6MDQ6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTYJMTE6NTU6NDVzIDA6MDQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTcJMTE6NTY6MTVzIDA6MDM6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTgJMTE6NTY6NDBzIDA6MDM6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMTkJMTE6NTc6MTBzIDA6MDI6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjAJMTE6NTc6NDBzIDA6MDI6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjEJMTE6NTg6MTBzIDA6MDE6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjIJMTE6NTg6NDBzIDA6MDE6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjMJMTE6NTk6MTBzIDA6MDA6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjQJMTE6NTk6NDBzIDA6MDA6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjUJMTI6MDA6MTBzIC0wOjAwOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI2CTEyOjAwOjQwcyAtMDowMDo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyNwkxMjowMToxMHMgLTA6MDE6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjgJMTI6MDE6NDBzIC0wOjAxOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI5CTEyOjAyOjEwcyAtMDowMjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkzMAkxMjowMjozNXMgLTA6MDI6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMzEJMTI6MDM6MDVzIC0wOjAzOjA1IC0KLQotIyBSaXlhZGggaXMgYXQgYWJvdXQgNDYgZGVncmVlcyA0NiBtaW51dGVzIEVhc3Q6ICAzIGhycywgNyBtaW5zLCA0IHNlY3MKLSMgQmVmb3JlIGFuZCBhZnRlciAxOTg4LCB3ZSdsbCBvcGVyYXRlIG9uIGxvY2FsIG1lYW4gc29sYXIgdGltZS4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUml5YWRoODgJMzowNzowNAktCQl6enoJMTk4OAotCQkJMzowNzowNAlzb2w4OAkJenp6CTE5ODkKLQkJCTM6MDc6MDQJLQkJenp6Ci0jIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uCi1MaW5rCUFzaWEvUml5YWRoODgJTWlkZWFzdC9SaXlhZGg4OApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4OSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL3NvbGFyODkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDg1MzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc29sYXI4OQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0jIEAoIylzb2xhcjg5CTguMQotCi0jIEFwcGFyZW50IG5vb24gdGltZXMgYmVsb3cgYXJlIGZvciBSaXlhZGg7IHRoZXkncmUgYSBiaXQgb2ZmIGZvciBvdGhlciBwbGFjZXMuCi0jIFRpbWVzIHdlcmUgY29tcHV0ZWQgdXNpbmcgYSBmb3JtdWxhIHByb3ZpZGVkIGJ5IHRoZSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeToKLSMJZXF0ID0gLTEwNS44ICogc2luKGwpICsgNTk2LjIgKiBzaW4oMiAqIGwpICsgNC40ICogc2luKDMgKiBsKQotIwkJLTEyLjcgKiBzaW4oNCAqIGwpIC0gNDI5LjAgKiBjb3MobCkgLSAyLjEgKiBjb3MgKDIgKiBsKQotIwkJKyAxOS4zICogY29zKDMgKiBsKTsKLSMgd2hlcmUgbCBpcyB0aGUgIm1lYW4gbG9uZ2l0dWRlIG9mIHRoZSBTdW4iIGdpdmVuIGJ5Ci0jCWwgPSAyNzkuNjQyIGRlZ3JlZXMgKyAwLjk4NTY0NyAqIGQKLSMgYW5kIGQgaXMgdGhlIGludGVydmFsIGluIGRheXMgZnJvbSBKYW51YXJ5IDAsIDAgaG91cnMgVW5pdmVyc2FsIFRpbWUKLSMgKGVxdWFsaW5nIHRoZSBkYXkgb2YgdGhlIHllYXIgcGx1cyB0aGUgZnJhY3Rpb24gb2YgYSBkYXkgZnJvbSB6ZXJvIGhvdXJzKS4KLSMgVGhlIGFjY3VyYWN5IG9mIHRoZSBmb3JtdWxhIGlzIHBsdXMgb3IgbWludXMgdGhyZWUgc2Vjb25kcy4KLSMKLSMgUm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgZml2ZSBzZWNvbmRzIHJlc3VsdHMgaW4gZmV3ZXIgdGhhbgotIyAyNTYgZGlmZmVyZW50ICJ0aW1lIHR5cGVzIi0tYSBsaW1pdCB0aGF0J3MgZmFjZWQgYmVjYXVzZSB0aW1lIHR5cGVzIGFyZQotIyBzdG9yZWQgb24gZGlzayBhcyB1bnNpZ25lZCBjaGFycy4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTEJMTI6MDM6MzVzIC0wOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTIJMTI6MDQ6MDVzIC0wOjA0OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTMJMTI6MDQ6MzBzIC0wOjA0OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTQJMTI6MDU6MDBzIC0wOjA1OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTUJMTI6MDU6MjVzIC0wOjA1OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTYJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTcJMTI6MDY6MTVzIC0wOjA2OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTgJMTI6MDY6NDVzIC0wOjA2OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTkJMTI6MDc6MTBzIC0wOjA3OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTEwCTEyOjA3OjM1cyAtMDowNzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxMQkxMjowNzo1NXMgLTA6MDc6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTIJMTI6MDg6MjBzIC0wOjA4OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTEzCTEyOjA4OjQ1cyAtMDowODo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxNAkxMjowOTowNXMgLTA6MDk6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTUJMTI6MDk6MjVzIC0wOjA5OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE2CTEyOjA5OjQ1cyAtMDowOTo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxNwkxMjoxMDowNXMgLTA6MTA6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTgJMTI6MTA6MjVzIC0wOjEwOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE5CTEyOjEwOjQ1cyAtMDoxMDo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyMAkxMjoxMTowNXMgLTA6MTE6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjEJMTI6MTE6MjBzIC0wOjExOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTIyCTEyOjExOjM1cyAtMDoxMTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyMwkxMjoxMTo1NXMgLTA6MTE6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjQJMTI6MTI6MTBzIC0wOjEyOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI1CTEyOjEyOjIwcyAtMDoxMjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyNgkxMjoxMjozNXMgLTA6MTI6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjcJMTI6MTI6NTBzIC0wOjEyOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI4CTEyOjEzOjAwcyAtMDoxMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyOQkxMjoxMzoxMHMgLTA6MTM6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMzAJMTI6MTM6MjBzIC0wOjEzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTMxCTEyOjEzOjMwcyAtMDoxMzozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxCTEyOjEzOjQwcyAtMDoxMzo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyCTEyOjEzOjQ1cyAtMDoxMzo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkzCTEyOjEzOjU1cyAtMDoxMzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk0CTEyOjE0OjAwcyAtMDoxNDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk1CTEyOjE0OjA1cyAtMDoxNDowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk2CTEyOjE0OjEwcyAtMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk3CTEyOjE0OjEwcyAtMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk4CTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgk5CTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxMAkxMjoxNDoyMHMgLTA6MTQ6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTEJMTI6MTQ6MjBzIC0wOjE0OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTEyCTEyOjE0OjIwcyAtMDoxNDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxMwkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTQJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE1CTEyOjE0OjEwcyAtMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxNgkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTcJMTI6MTQ6MDVzIC0wOjE0OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE4CTEyOjE0OjAwcyAtMDoxNDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxOQkxMjoxMzo1NXMgLTA6MTM6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjAJMTI6MTM6NTBzIC0wOjEzOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTIxCTEyOjEzOjQwcyAtMDoxMzo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyMgkxMjoxMzozNXMgLTA6MTM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjMJMTI6MTM6MjVzIC0wOjEzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTI0CTEyOjEzOjE1cyAtMDoxMzoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyNQkxMjoxMzowNXMgLTA6MTM6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjYJMTI6MTI6NTVzIC0wOjEyOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTI3CTEyOjEyOjQ1cyAtMDoxMjo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyOAkxMjoxMjozNXMgLTA6MTI6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMQkxMjoxMjoyNXMgLTA6MTI6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMgkxMjoxMjoxMHMgLTA6MTI6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMwkxMjoxMjowMHMgLTA6MTI6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJNAkxMjoxMTo0NXMgLTA6MTE6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJNQkxMjoxMTozNXMgLTA6MTE6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJNgkxMjoxMToyMHMgLTA6MTE6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJNwkxMjoxMTowNXMgLTA6MTE6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJOAkxMjoxMDo1MHMgLTA6MTA6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJOQkxMjoxMDozNXMgLTA6MTA6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTAJMTI6MTA6MjBzIC0wOjEwOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTExCTEyOjEwOjA1cyAtMDoxMDowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxMgkxMjowOTo1MHMgLTA6MDk6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTMJMTI6MDk6MzBzIC0wOjA5OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE0CTEyOjA5OjE1cyAtMDowOToxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxNQkxMjowOTowMHMgLTA6MDk6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTYJMTI6MDg6NDBzIC0wOjA4OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE3CTEyOjA4OjI1cyAtMDowODoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxOAkxMjowODowNXMgLTA6MDg6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTkJMTI6MDc6NTBzIC0wOjA3OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTIwCTEyOjA3OjMwcyAtMDowNzozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyMQkxMjowNzoxNXMgLTA6MDc6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjIJMTI6MDY6NTVzIC0wOjA2OjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTIzCTEyOjA2OjM1cyAtMDowNjozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyNAkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjUJMTI6MDY6MDBzIC0wOjA2OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI2CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyNwkxMjowNToyNXMgLTA6MDU6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjgJMTI6MDU6MDVzIC0wOjA1OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI5CTEyOjA0OjUwcyAtMDowNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkzMAkxMjowNDozMHMgLTA6MDQ6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMzEJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTEJMTI6MDM6NTVzIC0wOjAzOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTIJMTI6MDM6MzVzIC0wOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTMJMTI6MDM6MjBzIC0wOjAzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTQJMTI6MDM6MDBzIC0wOjAzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTUJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTYJMTI6MDI6MjVzIC0wOjAyOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTcJMTI6MDI6MTBzIC0wOjAyOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTgJMTI6MDE6NTBzIC0wOjAxOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTkJMTI6MDE6MzVzIC0wOjAxOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTEwCTEyOjAxOjIwcyAtMDowMToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxMQkxMjowMTowNXMgLTA6MDE6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTIJMTI6MDA6NTBzIC0wOjAwOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTEzCTEyOjAwOjM1cyAtMDowMDozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxNAkxMjowMDoyMHMgLTA6MDA6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTUJMTI6MDA6MDVzIC0wOjAwOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE2CTExOjU5OjUwcyAwOjAwOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE3CTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE4CTExOjU5OjIwcyAwOjAwOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE5CTExOjU5OjEwcyAwOjAwOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTIwCTExOjU4OjU1cyAwOjAxOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTIxCTExOjU4OjQ1cyAwOjAxOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTIyCTExOjU4OjMwcyAwOjAxOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTIzCTExOjU4OjIwcyAwOjAxOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI0CTExOjU4OjEwcyAwOjAxOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI1CTExOjU4OjAwcyAwOjAyOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI2CTExOjU3OjUwcyAwOjAyOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI3CTExOjU3OjQwcyAwOjAyOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI4CTExOjU3OjMwcyAwOjAyOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTI5CTExOjU3OjIwcyAwOjAyOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTMwCTExOjU3OjE1cyAwOjAyOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTEJMTE6NTc6MDVzIDA6MDI6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMgkxMTo1NzowMHMgMDowMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkzCTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTQJMTE6NTY6NDVzIDA6MDM6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJNQkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk2CTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTcJMTE6NTY6MzBzIDA6MDM6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJOAkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk5CTExOjU2OjI1cyAwOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTEwCTExOjU2OjI1cyAwOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTExCTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTEyCTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTEzCTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE0CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE1CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE2CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE3CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE4CTExOjU2OjI1cyAwOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTE5CTExOjU2OjI1cyAwOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTIwCTExOjU2OjMwcyAwOjAzOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTIxCTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTIyCTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTIzCTExOjU2OjQwcyAwOjAzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI0CTExOjU2OjQ1cyAwOjAzOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI1CTExOjU2OjU1cyAwOjAzOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI2CTExOjU3OjAwcyAwOjAzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI3CTExOjU3OjA1cyAwOjAyOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI4CTExOjU3OjE1cyAwOjAyOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTI5CTExOjU3OjIwcyAwOjAyOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTMwCTExOjU3OjMwcyAwOjAyOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTMxCTExOjU3OjM1cyAwOjAyOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTEJMTE6NTc6NDVzIDA6MDI6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMgkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkzCTExOjU4OjA1cyAwOjAxOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTQJMTE6NTg6MTVzIDA6MDE6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JNQkxMTo1ODoyNXMgMDowMTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk2CTExOjU4OjM1cyAwOjAxOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTcJMTE6NTg6NDVzIDA6MDE6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JOAkxMTo1OTowMHMgMDowMTowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk5CTExOjU5OjEwcyAwOjAwOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTEwCTExOjU5OjIwcyAwOjAwOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTExCTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTEyCTExOjU5OjQ1cyAwOjAwOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTEzCTEyOjAwOjAwcyAwOjAwOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE0CTEyOjAwOjEwcyAtMDowMDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxNQkxMjowMDoyNXMgLTA6MDA6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTYJMTI6MDA6MzVzIC0wOjAwOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE3CTEyOjAwOjUwcyAtMDowMDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxOAkxMjowMTowNXMgLTA6MDE6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTkJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTIwCTEyOjAxOjMwcyAtMDowMTozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyMQkxMjowMTo0MHMgLTA6MDE6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjIJMTI6MDE6NTVzIC0wOjAxOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTIzCTEyOjAyOjEwcyAtMDowMjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyNAkxMjowMjoyMHMgLTA6MDI6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjUJMTI6MDI6MzVzIC0wOjAyOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI2CTEyOjAyOjQ1cyAtMDowMjo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyNwkxMjowMzowMHMgLTA6MDM6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjgJMTI6MDM6MTBzIC0wOjAzOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI5CTEyOjAzOjI1cyAtMDowMzoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkzMAkxMjowMzozNXMgLTA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMQkxMjowMzo0NXMgLTA6MDM6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMgkxMjowNDowMHMgLTA6MDQ6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMwkxMjowNDoxMHMgLTA6MDQ6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJNAkxMjowNDoyMHMgLTA6MDQ6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJNQkxMjowNDozMHMgLTA6MDQ6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJNgkxMjowNDo0MHMgLTA6MDQ6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJNwkxMjowNDo1MHMgLTA6MDQ6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJOAkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJOQkxMjowNToxMHMgLTA6MDU6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTAJMTI6MDU6MjBzIC0wOjA1OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTExCTEyOjA1OjI1cyAtMDowNToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxMgkxMjowNTozNXMgLTA6MDU6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTMJMTI6MDU6NDBzIC0wOjA1OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE0CTEyOjA1OjUwcyAtMDowNTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxNQkxMjowNTo1NXMgLTA6MDU6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTYJMTI6MDY6MDBzIC0wOjA2OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE3CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxOAkxMjowNjoxMHMgLTA6MDY6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTkJMTI6MDY6MTVzIC0wOjA2OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTIwCTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyMQkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjIJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTIzCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyNAkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjUJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI2CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyNwkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjgJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI5CTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkzMAkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMzEJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTEJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTIJMTI6MDY6MTVzIC0wOjA2OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTMJMTI6MDY6MTBzIC0wOjA2OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTQJMTI6MDY6MDVzIC0wOjA2OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTUJMTI6MDY6MDBzIC0wOjA2OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTYJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTcJMTI6MDU6NDVzIC0wOjA1OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTgJMTI6MDU6MzVzIC0wOjA1OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTkJMTI6MDU6MzBzIC0wOjA1OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTEwCTEyOjA1OjIwcyAtMDowNToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxMQkxMjowNToxMHMgLTA6MDU6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTIJMTI6MDU6MDBzIC0wOjA1OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTEzCTEyOjA0OjUwcyAtMDowNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxNAkxMjowNDo0MHMgLTA6MDQ6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTUJMTI6MDQ6MzBzIC0wOjA0OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE2CTEyOjA0OjE1cyAtMDowNDoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxNwkxMjowNDowNXMgLTA6MDQ6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTgJMTI6MDM6NTBzIC0wOjAzOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE5CTEyOjAzOjM1cyAtMDowMzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyMAkxMjowMzoyNXMgLTA6MDM6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjEJMTI6MDM6MTBzIC0wOjAzOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTIyCTEyOjAyOjU1cyAtMDowMjo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyMwkxMjowMjo0MHMgLTA6MDI6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjQJMTI6MDI6MjBzIC0wOjAyOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI1CTEyOjAyOjA1cyAtMDowMjowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyNgkxMjowMTo1MHMgLTA6MDE6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjcJMTI6MDE6MzBzIC0wOjAxOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI4CTEyOjAxOjE1cyAtMDowMToxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyOQkxMjowMDo1NXMgLTA6MDA6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMzAJMTI6MDA6NDBzIC0wOjAwOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTMxCTEyOjAwOjIwcyAtMDowMDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxCTEyOjAwOjAwcyAwOjAwOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTIJMTE6NTk6NDVzIDA6MDA6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMwkxMTo1OToyNXMgMDowMDozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk0CTExOjU5OjA1cyAwOjAwOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTUJMTE6NTg6NDVzIDA6MDE6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJNgkxMTo1ODoyNXMgMDowMTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk3CTExOjU4OjA1cyAwOjAxOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTgJMTE6NTc6NDVzIDA6MDI6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJOQkxMTo1NzoyMHMgMDowMjo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxMAkxMTo1NzowMHMgMDowMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxMQkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxMgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxMwkxMTo1NjowMHMgMDowNDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxNAkxMTo1NTozNXMgMDowNDoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxNQkxMTo1NToxNXMgMDowNDo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxNgkxMTo1NDo1NXMgMDowNTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxNwkxMTo1NDozNXMgMDowNToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxOAkxMTo1NDoxMHMgMDowNTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkxOQkxMTo1Mzo1MHMgMDowNjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyMAkxMTo1MzozMHMgMDowNjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyMQkxMTo1MzoxMHMgMDowNjo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyMgkxMTo1Mjo0NXMgMDowNzoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyMwkxMTo1MjoyNXMgMDowNzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyNAkxMTo1MjowNXMgMDowNzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyNQkxMTo1MTo0NXMgMDowODoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyNgkxMTo1MToyNXMgMDowODozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyNwkxMTo1MTowNXMgMDowODo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyOAkxMTo1MDo0MHMgMDowOToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyOQkxMTo1MDoyMHMgMDowOTo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkzMAkxMTo1MDowMHMgMDoxMDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxCTExOjQ5OjQ1cyAwOjEwOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTIJMTE6NDk6MjVzIDA6MTA6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMwkxMTo0OTowNXMgMDoxMDo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk0CTExOjQ4OjQ1cyAwOjExOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTUJMTE6NDg6MzBzIDA6MTE6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJNgkxMTo0ODoxMHMgMDoxMTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk3CTExOjQ3OjUwcyAwOjEyOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTgJMTE6NDc6MzVzIDA6MTI6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJOQkxMTo0NzoyMHMgMDoxMjo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxMAkxMTo0NzowMHMgMDoxMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxMQkxMTo0Njo0NXMgMDoxMzoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxMgkxMTo0NjozMHMgMDoxMzozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxMwkxMTo0NjoxNXMgMDoxMzo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxNAkxMTo0NjowMHMgMDoxNDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxNQkxMTo0NTo1MHMgMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxNgkxMTo0NTozNXMgMDoxNDoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxNwkxMTo0NToyMHMgMDoxNDo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxOAkxMTo0NToxMHMgMDoxNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkxOQkxMTo0NTowMHMgMDoxNTowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyMAkxMTo0NDo1MHMgMDoxNToxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyMQkxMTo0NDo0MHMgMDoxNToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyMgkxMTo0NDozMHMgMDoxNTozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyMwkxMTo0NDoyMHMgMDoxNTo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyNAkxMTo0NDoxMHMgMDoxNTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyNQkxMTo0NDowNXMgMDoxNTo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyNgkxMTo0NDowMHMgMDoxNjowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyNwkxMTo0Mzo1MHMgMDoxNjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyOQkxMTo0Mzo0MHMgMDoxNjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkzMAkxMTo0Mzo0MHMgMDoxNjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkzMQkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTIJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMwkxMTo0MzozMHMgMDoxNjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk0CTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTUJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJNgkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk3CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTgJMTE6NDM6NDVzIDA6MTY6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJOQkxMTo0Mzo1MHMgMDoxNjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxMAkxMTo0Mzo1NXMgMDoxNjowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxMQkxMTo0NDowMHMgMDoxNjowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxMgkxMTo0NDowNXMgMDoxNTo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxMwkxMTo0NDoxNXMgMDoxNTo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxNAkxMTo0NDoyNXMgMDoxNTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxNQkxMTo0NDozNXMgMDoxNToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxNgkxMTo0NDo0NXMgMDoxNToxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxNwkxMTo0NDo1NXMgMDoxNTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxOAkxMTo0NToxMHMgMDoxNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkxOQkxMTo0NToyMHMgMDoxNDo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyMAkxMTo0NTozNXMgMDoxNDoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyMQkxMTo0NTo1MHMgMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyMgkxMTo0NjowNXMgMDoxMzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyMwkxMTo0NjoyNXMgMDoxMzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyNAkxMTo0Njo0MHMgMDoxMzoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyNQkxMTo0NzowMHMgMDoxMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyNgkxMTo0NzoyMHMgMDoxMjo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyNwkxMTo0NzozNXMgMDoxMjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyOAkxMTo0Nzo1NXMgMDoxMjowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyOQkxMTo0ODoyMHMgMDoxMTo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkzMAkxMTo0ODo0MHMgMDoxMToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxCTExOjQ5OjAwcyAwOjExOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTIJMTE6NDk6MjVzIDA6MTA6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMwkxMTo0OTo1MHMgMDoxMDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk0CTExOjUwOjE1cyAwOjA5OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTUJMTE6NTA6MzVzIDA6MDk6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJNgkxMTo1MTowMHMgMDowOTowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk3CTExOjUxOjMwcyAwOjA4OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTgJMTE6NTE6NTVzIDA6MDg6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJOQkxMTo1MjoyMHMgMDowNzo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxMAkxMTo1Mjo1MHMgMDowNzoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxMQkxMTo1MzoxNXMgMDowNjo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxMgkxMTo1Mzo0NXMgMDowNjoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxMwkxMTo1NDoxMHMgMDowNTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxNAkxMTo1NDo0MHMgMDowNToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxNQkxMTo1NToxMHMgMDowNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxNgkxMTo1NTo0MHMgMDowNDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxNwkxMTo1NjowNXMgMDowMzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxOAkxMTo1NjozNXMgMDowMzoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkxOQkxMTo1NzowNXMgMDowMjo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyMAkxMTo1NzozNXMgMDowMjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyMQkxMTo1ODowNXMgMDowMTo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyMgkxMTo1ODozNXMgMDowMToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyMwkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyNAkxMTo1OTozNXMgMDowMDoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyNQkxMjowMDowNXMgLTA6MDA6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjYJMTI6MDA6MzVzIC0wOjAwOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI3CTEyOjAxOjA1cyAtMDowMTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyOAkxMjowMTozNXMgLTA6MDE6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjkJMTI6MDI6MDBzIC0wOjAyOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTMwCTEyOjAyOjMwcyAtMDowMjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkzMQkxMjowMzowMHMgLTA6MDM6MDAgLQotCi0jIFJpeWFkaCBpcyBhdCBhYm91dCA0NiBkZWdyZWVzIDQ2IG1pbnV0ZXMgRWFzdDogIDMgaHJzLCA3IG1pbnMsIDQgc2VjcwotIyBCZWZvcmUgYW5kIGFmdGVyIDE5ODksIHdlJ2xsIG9wZXJhdGUgb24gbG9jYWwgbWVhbiBzb2xhciB0aW1lLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTL1NBVkUJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9SaXlhZGg4OQkzOjA3OjA0CS0JCXp6egkxOTg5Ci0JCQkzOjA3OjA0CXNvbDg5CQl6enoJMTk5MAotCQkJMzowNzowNAktCQl6enoKLSMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuLi4KLUxpbmsJQXNpYS9SaXlhZGg4OQlNaWRlYXN0L1JpeWFkaDg5CmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9zb3V0aGFtZXJpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDA4aC9zb3V0aGFtZXJpY2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYWU2MWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc291dGhhbWVyaWNhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5MCArMCwwIEBACi0jIEAoIylzb3V0aGFtZXJpY2EJOC4zMAotIyA8cHJlPgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkwLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgRWFybGllciBlZGl0aW9ucyBvZiB0aGVzZSB0YWJsZXMgdXNlZCB0aGUgTm9ydGggQW1lcmljYW4gc3R5bGUgKGUuZy4gQVJTVCBhbmQKLSMgQVJEVCBmb3IgQXJnZW50aW5lIFN0YW5kYXJkIGFuZCBEYXlsaWdodCBUaW1lKSwgYnV0IHRoZSBmb2xsb3dpbmcgcXVvdGUKLSMgc3VnZ2VzdHMgdGhhdCBpdCdzIGJldHRlciB0byB1c2UgRXVyb3BlYW4gc3R5bGUgKGUuZy4gQVJUIGFuZCBBUlNUKS4KLSMJSSBzdWdnZXN0IHRoZSB1c2Ugb2YgX1N1bW1lciB0aW1lXyBpbnN0ZWFkIG9mIHRoZSBtb3JlIGN1bWJlcnNvbWUKLSMJX2RheWxpZ2h0LXNhdmluZyB0aW1lXy4gIF9TdW1tZXIgdGltZV8gc2VlbXMgdG8gYmUgaW4gZ2VuZXJhbCB1c2UKLSMJaW4gRXVyb3BlIGFuZCBTb3V0aCBBbWVyaWNhLgotIwktLSBFIE8gQ3V0bGVyLCBfTmV3IFlvcmsgVGltZXNfICgxOTM3LTAyLTE0KSwgcXVvdGVkIGluCi0jCUggTCBNZW5ja2VuLCBfVGhlIEFtZXJpY2FuIExhbmd1YWdlOiBTdXBwbGVtZW50IElfICgxOTYwKSwgcCA0NjYKLSMKLSMgRWFybGllciBlZGl0aW9ucyBvZiB0aGVzZSB0YWJsZXMgYWxzbyB1c2VkIHRoZSBOb3J0aCBBbWVyaWNhbiBzdHlsZQotIyBmb3IgdGltZSB6b25lcyBpbiBCcmF6aWwsIGJ1dCB0aGlzIHdhcyBpbmNvcnJlY3QsIGFzIEJyYXppbGlhbnMgc2F5Ci0jICJzdW1tZXIgdGltZSIuICBSZWluYWxkbyBHb3VsYXJ0LCBhIFNhbyBQYXVsbyBidXNpbmVzc21hbiBhY3RpdmUgaW4KLSMgdGhlIHJhaWxyb2FkIHNlY3Rvciwgd3JpdGVzICgxOTk5LTA3LTA2KToKLSMJVGhlIHN1YmplY3Qgb2YgdGltZSB6b25lcyBpcyBjdXJyZW50bHkgYSBtYXR0ZXIgb2YgZGlzY3Vzc2lvbi9kZWJhdGUgaW4KLSMJQnJhemlsLiAgTGV0J3Mgc2F5IHRoYXQgInRoZSBCcmFzaWxpYSB0aW1lIiBpcyBjb25zaWRlcmVkIHRoZQotIwkib2ZmaWNpYWwgdGltZSIgYmVjYXVzZSBCcmFzaWxpYSBpcyB0aGUgY2FwaXRhbCBjaXR5LgotIwlUaGUgb3RoZXIgdGhyZWUgdGltZSB6b25lcyBhcmUgY2FsbGVkICJCcmFzaWxpYSB0aW1lICJtaW51cyBvbmUiIG9yCi0jCSJwbHVzIG9uZSIgb3IgInBsdXMgdHdvIi4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gc3VjaAotIwluYW1lL2Rlc2lnbmF0aW9uIGFzICJFYXN0ZXJuIFRpbWUiIG9yICJDZW50cmFsIFRpbWUiLgotIyBTbyBJIGludmVudGVkIHRoZSBmb2xsb3dpbmcgKEVuZ2xpc2gtbGFuZ3VhZ2UpIGFiYnJldmlhdGlvbnMgZm9yIG5vdy4KLSMgQ29ycmVjdGlvbnMgYXJlIHdlbGNvbWUhCi0jCQlzdGQJZHN0Ci0jCS0yOjAwCUZOVAlGTlNUCUZlcm5hbmRvIGRlIE5vcm9uaGEKLSMJLTM6MDAJQlJUCUJSU1QJQnJhc2lsaWEKLSMJLTQ6MDAJQU1UCUFNU1QJQW1hem9uCi0jCS01OjAwCUFDVAlBQ1NUCUFjcmUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQXJnZW50aW5hCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgQXJnZW50aW5hOiBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciB0byBmaXJzdCBTdW5kYXkgaW4gQXByaWwgc2luY2UgMTk3Ni4KLSMgRG91YmxlIFN1bW1lciB0aW1lIGZyb20gMTk2OSB0byAxOTc0LiAgU3dpdGNoZXMgYXQgbWlkbmlnaHQuCi0KLSMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OC0wMS0xOTkpOgotIyBBUkdFTlRJTkEgICAgICAgICAgIDMgSCBCRUhJTkQgICBVVEMKLQotIyBGcm9tIEhlcm5hbiBHLiBPdGVybyAoMTk5NS0wNi0yNik6Ci0jIEkgYW0gc2VuZGluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBBcmdlbnRpbmUgdGltZSB6b25lIHRhYmxlLi4uCi0jIEFSIHdhcyBjaG9zZW4gYmVjYXVzZSB0aGV5IGFyZSB0aGUgSVNPIGxldHRlcnMgdGhhdCByZXByZXNlbnQgQXJnZW50aW5hLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBcmcJMTkzMAlvbmx5CS0JRGVjCSAxCTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTMxCW9ubHkJLQlBcHIJIDEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5MzEJb25seQktCU9jdAkxNQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTkzMgkxOTQwCS0JTWFyCSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTMyCTE5MzkJLQlOb3YJIDEJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NDAJb25seQktCUp1bAkgMQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk0MQlvbmx5CS0JSnVuCTE1CTA6MDAJMAktCi1SdWxlCUFyZwkxOTQxCW9ubHkJLQlPY3QJMTUJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NDMJb25seQktCUF1ZwkgMQkwOjAwCTAJLQotUnVsZQlBcmcJMTk0Mwlvbmx5CS0JT2N0CTE1CTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTQ2CW9ubHkJLQlNYXIJIDEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NDYJb25seQktCU9jdAkgMQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk2Mwlvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTYzCW9ubHkJLQlEZWMJMTUJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NjQJMTk2NgktCU1hcgkgMQkwOjAwCTAJLQotUnVsZQlBcmcJMTk2NAkxOTY2CS0JT2N0CTE1CTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTY3CW9ubHkJLQlBcHIJIDIJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NjcJMTk2OAktCU9jdAlTdW4+PTEJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NjgJMTk2OQktCUFwcglTdW4+PTEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NzQJb25seQktCUphbgkyMwkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk3NAlvbmx5CS0JTWF5CSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTg4CW9ubHkJLQlEZWMJIDEJMDowMAkxOjAwCVMKLSMKLSMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgotIyBUaGVzZSBjb3JyZWN0aW9ucyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEludGVyU29mdCBBcmdlbnRpbmEgUy5BLiwKLSMgb2J0YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlOgotIyBUYWxsZXJlcyBkZSBIaWRyb2dyYWZpYSBOYXZhbCBBcmdlbnRpbmEKLSMgKEFyZ2VudGluZSBOYXZhbCBIeWRyb2dyYXBoeSBJbnN0aXR1dGUpCi1SdWxlCUFyZwkxOTg5CTE5OTMJLQlNYXIJU3VuPj0xCTA6MDAJMAktCi1SdWxlCUFyZwkxOTg5CTE5OTIJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotIwotIyBGcm9tIEhlcm5hbiBHLiBPdGVybyAoMTk5NS0wNi0yNik6Ci0jIEZyb20gdGhpcyBtb21lbnQgb24sIHRoZSBsYXcgdGhhdCBtYW5kYXRlZCB0aGUgZGF5bGlnaHQgc2F2aW5nCi0jIHRpbWUgY29ycmVjdGlvbnMgd2FzIGRlcm9nYXRlZCBhbmQgbm8gbW9yZSBtb2RpZmljYXRpb25zCi0jIHRvIHRoZSB0aW1lIHpvbmVzIChmb3IgZGF5bGlnaHQgc2F2aW5nKSBhcmUgbm93IG1hZGUuCi0jCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMDEtMTApOgotIyBPbiBPY3RvYmVyIDMsIDE5OTksIDA6MDAgbG9jYWwsIEFyZ2VudGluYSBpbXBsZW1lbnRlZCBkYXlsaWdodCBzYXZpbmdzIHRpbWUsCi0jIHdoaWNoIGRpZCBub3QgcmVzdWx0IGluIHRoZSBzd2l0Y2ggb2YgYSB0aW1lIHpvbmUsIGFzIHRoZXkgc3RheWVkIDkgaG91cnMKLSMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUuCi1SdWxlCUFyZwkxOTk5CW9ubHkJLQlPY3QJU3VuPj0xCTA6MDAJMTowMAlTCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMTItMjgpOgotIyBEU1Qgd2FzIHNldCB0byBleHBpcmUgb24gTWFyY2ggNSwgbm90IE1hcmNoIDMsIGJ1dCBzaW5jZSBpdCB3YXMgY29udmVydGVkCi0jIHRvIHN0YW5kYXJkIHRpbWUgb24gTWFyY2ggMyBpdCdzIG1vcmUgY29udmVuaWVudCBmb3IgdXMgdG8gcHJldGVuZCB0aGF0Ci0jIGl0IGVuZGVkIG9uIE1hcmNoIDMuCi1SdWxlCUFyZwkyMDAwCW9ubHkJLQlNYXIJMwkwOjAwCTAJLQotIwotIyBGcm9tIFBldGVyIEdyYWRlbHNraSB2aWEgU3RlZmZlbiBUaG9yc2VuICgyMDAwLTAzLTAxKToKLSMgV2UganVzdCBjaGVja2VkIHdpdGggb3VyIFNhbyBQYXVsbyBvZmZpY2UgYW5kIHRoZXkgc2F5IHRoZSBnb3Zlcm5tZW50IG9mCi0jIEFyZ2VudGluYSBkZWNpZGVkIG5vdCB0byBiZWNvbWUgb25lIG9mIHRoZSBjb3VudHJpZXMgdGhhdCBnbyBvbiBvciBvZmYgRFNULgotIyBTbyBCdWVub3MgQWlyZXMgc2hvdWxkIGJlIC0zIGhvdXJzIGZyb20gR01UIGF0IGFsbCB0aW1lcy4KLSMKLSMgRnJvbSBGYWJpYW4gTC4gQXJjZSBKb2ZyZSAoMjAwMC0wNC0wNCk6Ci0jIFRoZSBsYXcgdGhhdCBjbGFpbWVkIERTVCBmb3IgQXJnZW50aW5hIHdhcyBkZXJvZ2F0ZWQgYnkgUHJlc2lkZW50IEZlcm5hbmRvCi0jIGRlIGxhIFJ1YSBvbiBNYXJjaCAyLCAyMDAwLCBiZWNhdXNlIGl0IHdvdWxkIG1ha2UgcGVvcGxlIHNwZW5kIG1vcmUgZW5lcmd5Ci0jIGluIHRoZSB3aW50ZXIgdGltZSwgcmF0aGVyIHRoYW4gbGVzcy4gIFRoZSBjaGFuZ2UgdG9vayBlZmZlY3Qgb24gTWFyY2ggMy4KLSMKLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwMS0wNi0wNik6Ci0jIG9uZSBvZiB0aGUgbWFqb3IgbmV3c3BhcGVycyBoZXJlIGluIEFyZ2VudGluYSBzYWlkIHRoYXQgdGhlIDE5OTkKLSMgVGltZXpvbmUgTGF3ICh3aGljaCBuZXZlciB3YXMgZWZmZWN0aXZlbHkgYXBwbGllZCkgd2lsbCAod291bGQ/KSBiZQotIyBpbiBlZmZlY3QuLi4uIFRoZSBhcnRpY2xlIGlzIGF0Ci0jIGh0dHA6Ly9hci5jbGFyaW4uY29tL2RpYXJpby8yMDAxLTA2LTA2L2UtMDE3MDEuaHRtCi0jIC4uLiBUaGUgTGF3IGl0c2VsZiBpcyAiTGV5IE5vIDI1MTU1Iiwgc2FuY3Rpb25lZCBvbiAxOTk5LTA4LTI1LCBlbmFjdGVkCi0jIDE5OTktMDktMTcsIGFuZCBwdWJsaXNoZWQgMTk5OS0wOS0yMS4gIFRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiBpcyBhdDoKLSMgaHR0cDovL3d3dy5ib2xldGluLmp1cy5nb3YuYXIvQk9OL1ByaW1lcmEvMTk5OS8wOS1TZXB0aWVtYnJlLzIxL1BERi9CTzIxLTA5LTk5TEVHLlBERgotIyBSZWdyZXRmdWxseSwgeW91IGhhdmUgdG8gc3Vic2NyaWJlIChhbmQgcGF5KSBmb3IgdGhlIG9uLWxpbmUgdmVyc2lvbi4uLi4KLSMKLSMgKDIwMDEtMDYtMTIpOgotIyB0aGUgdGltZXpvbmUgZm9yIEFyZ2VudGluYSB3aWxsIG5vdCBjaGFuZ2UgbmV4dCBTdW5kYXkuCi0jIEFwcGFyZW50bHkgaXQgd2lsbCBkbyBzbyBvbiBTdW5kYXkgMjR0aC4uLi4KLSMgaHR0cDovL2FyLmNsYXJpbi5jb20vZGlhcmlvLzIwMDEtMDYtMTIvcy0wMzUwMS5odG0KLSMKLSMgKDIwMDEtMDYtMjUpOgotIyBMYXN0IEZyaWRheSAoeWVzLCB0aGUgbGFzdCB3b3JraW5nIGRheSBiZWZvcmUgdGhlIGRhdGUgb2YgdGhlIGNoYW5nZSksIHRoZQotIyBTZW5hdGUgYW5udWxsZWQgdGhlIDE5OTkgbGF3IHRoYXQgaW50cm9kdWNlZCB0aGUgY2hhbmdlcyBsYXRlciBwb3N0cG9uZWQuCi0jIGh0dHA6Ly93d3cuY2xhcmluLmNvbS5hci9kaWFyaW8vMjAwMS0wNi0yMi9zLTAzNjAxLmh0bQotIyBJdCByZW1haW5zIHRoZSB2b3RlIG9mIHRoZSBEZXB1dGllcy4uLiwgYnV0IGl0IHdpbGwgYmUgdGhlIHNhbWUuLi4uCi0jIFRoaXMga2luZCBvZiB0aGluZ3MgaGFkIGFsd2F5cyBiZWVuIGRvbmUgdGhpcyB3YXkgaW4gQXJnZW50aW5hLgotIyBXZSBhcmUgc3RpbGwgLTAzOjAwIGFsbCB5ZWFyIHJvdW5kIGluIGFsbCBvZiB0aGUgY291bnRyeS4KLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMTItMjEpOgotIyBBIHVzZXIgKExlb25hcmRvIENoYWltKSByZXBvcnRlZCB0aGF0IEFyZ2VudGluYSB3aWxsIGFkb3B0IERTVC4uLi4KLSMgYWxsIG9mIHRoZSBjb3VudHJ5IChhbGwgWm9uZS1lbnRyaWVzKSBhcmUgYWZmZWN0ZWQuICBOZXdzIHJlcG9ydHMgbGlrZQotIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9vcGluaW9uL25vdGEuYXNwP25vdGFfaWQ9OTczMDM3IGluZGljYXRlCi0jIHRoYXQgQXJnZW50aW5hIHdpbGwgdXNlIERTVCBuZXh0IHllYXIgYXMgd2VsbCwgZnJvbSBPY3RvYmVyIHRvCi0jIE1hcmNoLCBhbHRob3VnaCBleGFjdCBydWxlcyBhcmUgbm90IGdpdmVuLgotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNy0xMi0yNikKLSMgVGhlIGxhc3QgaHVyZGxlIG9mIEFyZ2VudGluYSBEU1QgaXMgb3ZlciwgdGhlIHByb3Bvc2FsIHdhcyBhcHByb3ZlZCBpbgotIyB0aGUgbG93ZXIgY2hhbWJlciB0b28gKERlcHV0YWRvcykgd2l0aCBhIHZvdGUgMTkyIGZvciBhbmQgMiBhZ2FpbnN0LgotIyBCeSB0aGUgd2F5IHRoYW5rcyB0byBNYXJpYW5vIEFic2F0eiBhbmQgRGFuaWVsIE1hcmlvIFZlZ2EgZm9yIHRoZSBsaW5rIHRvCi0jIHRoZSBvcmlnaW5hbCBzY2FubmVkIHByb3Bvc2FsLCB3aGVyZSB0aGUgZGF0ZXMgYW5kIHRoZSB6ZXJvIGhvdXJzIGFyZQotIyBjbGVhciBhbmQgdW5hbWJpZ3VvdXMuLi5UaGlzIGlzIHRoZSBhcnRpY2xlIGFib3V0IGZpbmFsIGFwcHJvdmFsOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9wb2xpdGljYS9ub3RhLmFzcD9ub3RhX2lkPTk3Mzk5NiI+Ci0jIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyL3BvbGl0aWNhL25vdGEuYXNwP25vdGFfaWQ9OTczOTk2Ci0jIDwvYT4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0xMi0yMik6Ci0jIEZvciBkYXRlcyBhZnRlciBtaWQtMjAwOCwgdGhlIGZvbGxvd2luZyBydWxlcyBhcmUgbXkgZ3Vlc3NlcyBhbmQKLSMgYXJlIHF1aXRlIHBvc3NpYmx5IHdyb25nLCBidXQgYXJlIG1vcmUgbGlrZWx5IHRoYW4gbm8gRFNUIGF0IGFsbC4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOS0wNSk6Ci0jIEFzIHBlciBtZXNzYWdlIGZyb20gQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiAoTmljYXJhZ3VhKSwKLSMgQXJnZW50aW5hIHdpbGwgc3RhcnQgRFNUIG9uIFN1bmRheSBPY3RvYmVyIDE5LCAyMDA4LgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmltcHVsc29iYWlyZXMuY29tLmFyL25vdGEucGhwP2lkPTU3ODMyIChpbiBzcGFuaXNoKSI+Ci0jIGh0dHA6Ly93d3cuaW1wdWxzb2JhaXJlcy5jb20uYXIvbm90YS5waHA/aWQ9NTc4MzIgKGluIHNwYW5pc2gpCi0jIDwvYT4KLQotIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTEwLTA2KToKLSMgSGVyZSBpcyBzb21lIGluZm8gYXZhaWxhYmxlIGF0IGEgR2VudG9vIGJ1ZyByZWxhdGVkIHRvIFRaIG9uIEFyZ2VudGluYSdzIERTVDoKLSMgLi4uCi0jIC0tLS0tLS0gQ29tbWVudCAjMSBmcm9tIFtqbWRvY2lsZV0gIDIwMDgtMTAtMDYgMTY6MjggMDAwMCAtLS0tLS0tCi0jIEhpLCB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aW1lem9uZS1kYXRhLTIwMDhlIGFuZCBtYXliZSB3aXRoCi0jIHRpbWV6b25lLWRhdGEtMjAwOGYKLSMgQXJnZW50aW5pYW4gbGF3IFtOdW1iZXJdIDI1LjE1NSBpcyBubyBsb25nZXIgdmFsaWQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb2xlZy5nb3YuYXIvaW5mb2xlZ0ludGVybmV0L2FuZXhvcy82MDAwMC02NDk5OS82MDAzNi9ub3JtYS5odG0iPgotIyBodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvNjAwMDAtNjQ5OTkvNjAwMzYvbm9ybWEuaHRtCi0jIDwvYT4KLSMgVGhlIG5ldyBvbmUgaXMgbGF3IFtOdW1iZXJdIDI2LjM1MAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvMTM1MDAwLTEzOTk5OS8xMzYxOTEvbm9ybWEuaHRtIj4KLSMgaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzEzNTAwMC0xMzk5OTkvMTM2MTkxL25vcm1hLmh0bQotIyA8L2E+Ci0jIFNvIHRoZXJlIGlzIG5vIHN1bW1lciB0aW1lIGluIEFyZ2VudGluYSBmb3Igbm93LgotCi1SdWxlCUFyZwkyMDA3CW9ubHkJLQlEZWMJMzAJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTIwMDgJbWF4CS0JTWFyCVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJQXJnCTIwMDgJbWF4CS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKLSAKLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwNC0wNS0yMSk6Ci0jIFRvZGF5IGl0IHdhcyBvZmZpY2lhbGx5IHB1Ymxpc2hlZCB0aGF0IHRoZSBQcm92aW5jZSBvZiBNZW5kb3phIGlzIGNoYW5naW5nCi0jIGl0cyB0aW1lem9uZSB0aGlzIHdpbnRlci4uLiBzdGFydGluZyB0b21vcnJvdyBuaWdodC4uLi4KLSMgaHR0cDovL3d3dy5nb2Jlcm5hYy5tZW5kb3phLmdvdi5hci9ib2xldGluL3BkZi8yMDA0MDUyMS0yNzE1OC1ub3JtYXMucGRmCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDQtMDUtMjQpOgotIyBJdCdzIExhdyBOby4gNywyMTAuICBUaGlzIGNoYW5nZSBpcyBkdWUgdG8gYSBwdWJsaWMgcG93ZXIgZW1lcmdlbmN5LCBzbyBmb3IKLSMgbm93IHdlJ2xsIGFzc3VtZSBpdCdzIGZvciB0aGlzIHllYXIgb25seS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3BpY2FzYy5uZXQvaG9ydmVyYS5odG1sIj4KLSMgSG9yYSBkZSB2ZXJhbm8gcGFyYSBsYSBSZXB1YmxpY2EgQXJnZW50aW5hICgyMDAzLTA2LTA4KQotIyA8L2E+IHNheXMgdGhhdCBzdGFuZGFyZCB0aW1lIGluIEFyZ2VudGluYSBmcm9tIDE4OTQtMTAtMzEKLSMgdG8gMTkyMC0wNS0wMSB3YXMgLTQ6MTY6NDguMjUuICBHbyB3aXRoIHRoaXMgbW9yZS1wcmVjaXNlIHZhbHVlCi0jIG92ZXIgU2hhbmtzICYgUG90dGVuZ2VyLgotIwotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA2LTA1KToKLSMgVGhlc2UgbWVkaWEgYXJ0aWNsZXMgZnJvbSBhIG1ham9yIG5ld3NwYXBlciBtb3N0bHkgY292ZXIgdGhlIGN1cnJlbnQgc3RhdGU6Ci0jIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyLzA0LzA1LzI3L2RlXzYwNDgyNS5hc3AKLSMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvMDQvMDUvMjgvZGVfNjA1MjAzLmFzcAotIwotIyBUaGUgZm9sbG93aW5nIGVpZ2h0ICg4KSBwcm92aW5jZXMgcHVsbGVkIGNsb2NrcyBiYWNrIHRvIFVUQy0wNDowMCBhdAotIyBtaWRuaWdodCBNb25kYXkgTWF5IDMxc3QuICh0aGF0IGlzLCB0aGUgbmlnaHQgYmV0d2VlbiAwNS8zMSBhbmQgMDYvMDEpLgotIyBBcHBhcmVudGx5LCBhbGwgbmluZSBwcm92aW5jZXMgd291bGQgZ28gYmFjayB0byBVVEMtMDM6MDAgYXQgdGhlIHNhbWUKLSMgdGltZSBpbiBPY3RvYmVyIDE3dGguCi0jCi0jIENhdGFtYXJjYSwgQ2h1YnV0LCBMYSBSaW9qYSwgU2FuIEp1YW4sIFNhbiBMdWlzLCBTYW50YSBDcnV6LAotIyBUaWVycmEgZGVsIEZ1ZWdvLCBUdWN1bWFuLgotIwotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA2LTE0KToKLSMgLi4uIHRoaXMgd2Vla2VuZCwgdGhlIFByb3ZpbmNlIG9mIFR1Y3VtYW4gZGVjaWRlZCBpdCdkIGdvIGJhY2sgdG8gVVRDLTAzOjAwCi0jIHllc3RlcmRheSBtaWRuaWdodCAodGhhdCBpcywgYXQgMjQ6MDAgU2F0dXJkYXkgMTJ0aCksIHNpbmNlIHRoZSBwZW9wbGUncwotIyBhbm5veWFuY2Ugd2l0aCB0aGUgY2hhbmdlIGlzIG11Y2ggaGlnaGVyIHRoYW4gdGhlIHBvd2VyIHNhdmluZ3Mgb2J0YWluZWQuLi4uCi0jCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDQtMDYtMTQpOgotIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci8wNC8wNi8xMC9kZV82MDkwNzguYXNwIC4uLgotIyAgICAgIlRoZSB0aW1lIGNoYW5nZSBpbiBUaWVycmEgZGVsIEZ1ZWdvIHdhcyBhIGNvbmZsaWN0ZWQgZGVjaXNpb24gZnJvbQotIyAgIHRoZSBzdGFydC4gIFRoZSBnb3Zlcm5tZW50IGhhZCBkZWNyZWVkIHRoYXQgdGhlIG1lYXN1cmUgd291bGQgdGFrZQotIyAgIGVmZmVjdCBvbiBKdW5lIDEsIGJ1dCBhIG5vcm1hdGl2ZSBlcnJvciBmb3JjZWQgdGhlIG5ldyB0aW1lIHRvIGJlZ2luCi0jICAgdGhyZWUgZGF5cyBlYXJsaWVyLCBmcm9tIGEgU2F0dXJkYXkgdG8gYSBTdW5kYXkuLi4uCi0jIE91ciB1bmRlcnN0YW5kaW5nIHdhcyB0aGF0IHRoZSBjaGFuZ2Ugd2FzIG9yaWdpbmFsbHkgc2NoZWR1bGVkIHRvIHRha2UgcGxhY2UKLSMgb24gSnVuZSAxIGF0IDAwOjAwIGluIENodWJ1dCwgU2FudGEgQ3J1eiwgVGllcnJhIGRlbCBGdWVnbyAoYW5kIHNvbWUgb3RoZXIKLSMgcHJvdmluY2VzKS4gIFN1bmRheSB3YXMgTWF5IDMwLCBvbmx5IHR3byBkYXlzIGVhcmxpZXIuICBTbyB0aGUgYXJ0aWNsZQotIyBjb250YWlucyBhIGNvbnRyYWRpY3Rpb24uICBJIHdvdWxkIGdpdmUgbW9yZSBjcmVkZW5jZSB0byB0aGUgU2F0dXJkYXkvU3VuZGF5Ci0jIGRhdGUgdGhhbiB0aGUgInRocmVlIGRheXMgZWFybGllciIgcGhyYXNlLCBhbmQgY29uY2x1ZGUgdGhhdCBUaWVycmEgZGVsCi0jIEZ1ZWdvIHNldCBpdHMgY2xvY2tzIGJhY2sgYXQgMjAwNC0wNS0zMCAwMDowMC4KLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDQtMTAtMDUpOgotIyBUaGUgcHJldmlvdXMgbGF3IDcyMTAgd2hpY2ggY2hhbmdlZCB0aGUgcHJvdmluY2Ugb2YgTWVuZG96YSdzIHRpbWUgem9uZQotIyBiYWNrIGluIE1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgaW4gYSBuZXcgbGF3IDcyNzcsIHdoaWNoIHNldCB0aGUKLSMgbmV3IGVuZCBkYXRlIHRvIDIwMDQtMDktMjYgKG9yaWdpbmFsIGRhdGUgd2FzIDIwMDQtMTAtMTcpLgotIyBodHRwOi8vd3d3LmdvYmVybmFjLm1lbmRvemEuZ292LmFyL2JvbGV0aW4vcGRmLzIwMDQwOTI0LTI3MjQ0LW5vcm1hcy5wZGYKLSMKLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwNC0xMC0wNSk6Ci0jIFNhbiBKdWFuIGNoYW5nZWQgZnJvbSBVVEMtMDM6MDAgdG8gVVRDLTA0OjAwIGF0IG1pZG5pZ2h0IGJldHdlZW4KLSMgU3VuZGF5LCBNYXkgMzB0aCBhbmQgTW9uZGF5LCBNYXkgMzFzdC4gIEl0IGNoYW5nZWQgYmFjayB0byBVVEMtMDM6MDAKLSMgYXQgbWlkbmlnaHQgYmV0d2VlbiBTYXR1cmRheSwgSnVseSAyNHRoIGFuZCBTdW5kYXksIEp1bHkgMjV0aC4uLi4KLSMgaHR0cDovL3d3dy5zYW5qdWFuLmdvdi5hci9wcmVuc2EvYXJjaGl2by8wMDAzMjkuaHRtbAotIyBodHRwOi8vd3d3LnNhbmp1YW4uZ292LmFyL3ByZW5zYS9hcmNoaXZvLzAwMDQyNi5odG1sCi0jIGh0dHA6Ly93d3cuc2FuanVhbi5nb3YuYXIvcHJlbnNhL2FyY2hpdm8vMDAwNDQxLmh0bWwKLQotIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDEtMTcpOgotIyBIZXJlIGFyZSBhcnRpY2xlcyB0aGF0IEFyZ2VudGluYSBQcm92aW5jZSBTYW4gTHVpcyBpcyBwbGFubmluZyB0byBlbmQgRFNUCi0jIGFzIGVhcmxpZXIgYXMgdXBjb21pbmcgTW9uZGF5IEphbnVhcnkgMjEsIDIwMDggb3IgRmVicnVhcnkgMjAwODoKLSMKLSMgUHJvdmluY2lhIGFyZ2VudGluYSByZXRyYXNhIHJlbG9qIHkgbWFyY2EgZGlmZXJlbmNpYSBjb24gcmVzdG8gZGVsIHBhaXMKLSMgKEFyZ2VudGluZSBQcm92aW5jZSBkZWxheWVkIGNsb2NrIGFuZCBtYXJrIGRpZmZlcmVuY2Ugd2l0aCB0aGUgcmVzdCBvZiB0aGUKLSMgY291bnRyeSkKLSMgPGEgaHJlZj0iaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsIj4KLSMgaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsCi0jIDwvYT4KLSMKLSMgRXMgaW5taW5lbnRlIHF1ZSBlbiBTYW4gTHVpcyBhdHJhc2VuIHVuYSBob3JhIGxvcyByZWxvamVzCi0jIChJdCBpcyBpbW1pbmVudCBpbiBTYW4gTHVpcyBjbG9ja3Mgb25lIGhvdXIgZGVsYXkpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNCI+Ci0jIGh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNAotIyA8L2E+Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMTgpOgotIyBUaGUgcGFnZSBvZiB0aGUgU2FuIEx1aXMgcHJvdmluY2lhbCBnb3Zlcm5tZW50Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMiI+Ci0jIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMgotIyA8L2E+Ci0jIGNvbmZpcm1zIHdoYXQgQWxleCBLcml2ZW55c2hldiBoYXMgZWFybGllciBzZW50IHRvIHRoZSB0egotIyBlbWFpbGluZyBsaXN0IGFib3V0IHRoYXQgU2FuIEx1aXMgcGxhbnMgdG8gcmV0dXJuIHRvIHN0YW5kYXJkCi0jIHRpbWUgbXVjaCBlYXJsaWVyIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkuIEl0IGFsc28KLSMgY29uZmlybXMgdGhhdCB1cG9uIHJlcXVlc3QgdGhlIHByb3ZpbmNlcyBTYW4gSnVhbiBhbmQgTWVuZG96YSAKLSMgcmVmdXNlZCB0byBmb2xsb3cgU2FuIEx1aXMgaW4gdGhpcyBjaGFuZ2UuIAotIyAKLSMgVGhlIGNoYW5nZSBpcyBzdXBwb3NlZCB0byB0YWtlIHBsYWNlIE1vbmRheSB0aGUgMjEuc3QgYXQgMDowMAotIyBob3Vycy4gQXMgZmFyIGFzIEkgdW5kZXJzdGFuZCBpdCBpZiB0aGlzIGdvZXMgYWhlYWQsIHdlIG5lZWQKLSMgYSBuZXcgdGltZXpvbmUgZm9yIFNhbiBMdWlzIChhbHRob3VnaCB0aGVyZSBhcmUgYWxzbyBkb2N1bWVudGVkCi0jIGluZGVwZW5kZW50IGNoYW5nZXMgaW4gdGhlIHNvdXRoYW1lcmljYSBmaWxlIG9mIFNhbiBMdWlzIGluCi0jIDE5OTAgYW5kIDE5OTEgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbmZpcm1lZCkuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMjUpOgotIyBVbmZvcnR1bmF0ZWx5IHRoZSBiZWxvdyBwYWdlIGhhcyBiZWNvbWUgZGVmdW5jdCwgYWJvdXQgdGhlIFNhbiBMdWlzCi0jIHRpbWUgY2hhbmdlLiBQZXJoYXBzIGJlY2F1c2UgaXQgbm93IGlzIHBhcnQgb2YgYSBncm91cCBvZiBwYWdlcyAiTW9zdAotIyBpbXBvcnRhbnQgcGFnZXMgb2YgMjAwOC4iCi0jCi0jIFlvdSBjYW4gdXNlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNCI+Ci0jIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNAotIyA8L2E+Ci0jIGluc3RlYWQgaXQgc2VlbXMuIE9yIHVzZSAiQnVzY2Fkb3IiIGZyb20gdGhlIG1haW4gcGFnZSBvZiB0aGUgU2FuIEx1aXMKLSMgZ292ZXJubWVudCwgYW5kIGZpbGwgaW4gImh1c28iIGFuZCBjbGljayBPSywgYW5kIHlvdSB3aWxsIGdldCAzIHBhZ2VzCi0jIGZyb20gd2hpY2ggdGhlIGZpcnN0IG9uZSBpcyBpZGVudGljYWwgdG8gdGhlIGFib3ZlLgotCi0jIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDgtMDEtMjgpOgotIyBJIGNhbiBjb25maXJtIHRoYXQgdGhlIFByb3ZpbmNlIG9mIFNhbiBMdWlzIChhbmQgc28gZmFyIG9ubHkgdGhhdAotIyBwcm92aW5jZSkgZGVjaWRlZCB0byBnbyBiYWNrIHRvIFVUQy0zIGVmZmVjdGl2ZSBtaWRuaWdodCBKYW4gMjB0aCAyMDA4Ci0jICh0aGF0IGlzLCBNb25kYXkgMjFzdCBhdCAwOjAwIGlzIHRoZSB0aW1lIHRoZSBjbG9ja3Mgd2VyZSBkZWxheWVkIGJhY2sKLSMgMSBob3VyKSwgYW5kIHRoZXkgaW50ZW5kIHRvIGtlZXAgVVRDLTMgYXMgdGhlaXIgdGltZXpvbmUgYWxsIHllYXIgcm91bmQKLSMgKHRoYXQgaXMsIHVubGVzcyB0aGV5IGNoYW5nZSB0aGVpciBtaW5kIGFueSBtaW51dGUgbm93KS4KLSMKLSMgU28gd2UnbGwgaGF2ZSB0byBhZGQgeWV0IGFub3RoZXIgY2l0eSB0byAnc291dGhhbWVyaWNhJyAoSSB0aGluayBTYW4KLSMgTHVpcyBjaXR5IGlzIHRoZSBtb3MgcG9wdWxhdGVkIGNpdHkgaW4gdGhlIFByb3ZpbmNlLCBzbyBpdCdkIGJlCi0jIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzLi4uIG9mIGNvdXJzZSBJIGNhbid0IHJlbWVtYmVyIGlmIFNhbiBMdWlzJ3MKLSMgaGlzdG9yeSBvZiBwYXJ0aWN1bGFyIGNoYW5nZXMgZ29lcyBhbG9uZyB3aXRoIE1lbmRvemEgb3IgU2FuIEp1YW4gOi0oCi0jIChJIG9ubHkgcmVtZW1iZXIgbm90IGJlaW5nIGFibGUgdG8gY29sbGVjdCBoYXJkIGZhY3RzIGFib3V0IFNhbiBMdWlzCi0jIGJhY2sgaW4gMjAwNCwgd2hlbiB0aGVzZSBwcm92aW5jZXMgY2hhbmdlZCB0byBVVEMtNCBmb3IgYSBmZXcgZGF5cywgSQotIyBtYWlsZWQgdGhlbSBwZXJzb25hbGx5IGFuZCBuZXZlciBnb3QgYW4gYW5zd2VyKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTA2LTMwKToKLSMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGRhdGEgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5MiwKLSMgZnJvbSB0aGUgSUFUQSBvdGhlcndpc2UuICBBcyBub3RlZCBiZWxvdywgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0Ci0jIEFtZXJpY2EvQ29yZG9iYSBzcGxpdCBpbnRvIDYgc3VicmVnaW9ucyBkdXJpbmcgMTk5MS8xOTkyLCBvbmUgb2Ygd2hpY2gKLSMgd2FzIEFtZXJpY2EvU2FuX0x1aXMsIGJ1dCB3ZSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgeWV0IHNvIGZvciBub3cgd2UnbGwKLSMga2VlcCBBbWVyaWNhL0NvcmRvYmEgYSBzaW5nbGUgcmVnaW9uIHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdCBpbnRvIHRoZQotIyBvdGhlciA1IHN1YnJlZ2lvbnMuCi0KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMKLSMgQnVlbm9zIEFpcmVzIChCQSksIENhcGl0YWwgRmVkZXJhbCAoQ0YpLAotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMgLTM6NTM6NDggLSBMTVQgMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAlBcmcJQVIlc1QKLSMKLSMgU2FudGEgRmUgKFNGKSwgRW50cmUgUmlvcyAoRVIpLCBDb3JyaWVudGVzIChDTiksIE1pc2lvbmVzIChNTiksIENoYWNvIChDQyksCi0jIEZvcm1vc2EgKEZNKSwgU2FsdGEgKFNBKSwgU2FudGlhZ28gZGVsIEVzdGVybyAoU0UpLCBDb3Jkb2JhIChDQiksCi0jIExhIFBhbXBhIChMUCksIE5ldXF1ZW4gKE5RKSwgUmlvIE5lZ3JvIChSTikKLSMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIGFsc28gbWFrZSB0aGUgZm9sbG93aW5nIGNsYWltcywgd2hpY2ggd2UgaGF2ZW4ndCB2ZXJpZmllZDoKLSMgLSBGb3Jtb3NhIHN3aXRjaGVkIHRvIC0zOjAwIG9uIDE5OTEtMDEtMDcuCi0jIC0gTWlzaW9uZXMgc3dpdGNoZWQgdG8gLTM6MDAgb24gMTk5MC0xMi0yOS4KLSMgLSBDaGFjbyBzd2l0Y2hlZCB0byAtMzowMCBvbiAxOTkxLTAxLTA0LgotIyAtIFNhbnRpYWdvIGRlbCBFc3Rlcm8gc3dpdGNoZWQgdG8gLTQ6MDAgb24gMTk5MS0wNC0wMSwKLSMgICB0aGVuIHRvIC0zOjAwIG9uIDE5OTEtMDQtMjYuCi0jCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL0NvcmRvYmEgLTQ6MTY6NDggLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDMKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAyMAotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBUdWN1bWFuIChUTSkKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hbiAtNDoyMDo1MiAtIExNVAkxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTkxIE1hciAgMwotCQkJLTQ6MDAJLQlXQVJUCTE5OTEgT2N0IDIwCi0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJLQlBUlQJMjAwNCBKdW4gIDEKLQkJCS00OjAwCS0JV0FSVAkyMDA0IEp1biAxMwotCQkJLTM6MDAJQXJnCUFSJXNUCi0jCi0jIExhIFJpb2phIChMUikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvTGFfUmlvamEgLTQ6Mjc6MjQgLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDEKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE1heSAgNwotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgSnVuICAxCi0JCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBTYW4gSnVhbiAoU0opCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9KdWFuIC00OjM0OjA0IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTEgTWFyICAxCi0JCQktNDowMAktCVdBUlQJMTk5MSBNYXkgIDcKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IE1heSAzMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVsIDI1Ci0JCQktMzowMAlBcmcJQVIlc1QKLSMKLSMgSnVqdXkgKEpZKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9KdWp1eSAtNDoyMToxMiAtCUxNVAkxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTkwIE1hciAgNAotCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDI4Ci0JCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyIDE3Ci0JCQktNDowMAktCVdBUlQJMTk5MSBPY3QgIDYKLQkJCS0zOjAwCTE6MDAJQVJTVAkxOTkyCi0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJQXJnCUFSJXNUCi0jCi0jIENhdGFtYXJjYSAoQ1QpLCBDaHVidXQgKENIKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EgLTQ6MjM6MDggLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDMKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAyMAotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgSnVuICAxCi0JCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBNZW5kb3phIChNWikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvTWVuZG96YSAtNDozNToxNiAtIExNVAkxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTkwIE1hciAgNAotCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDE1Ci0JCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyICAxCi0JCQktNDowMAktCVdBUlQJMTk5MSBPY3QgMTUKLQkJCS00OjAwCTE6MDAJV0FSU1QJMTk5MiBNYXIgIDEKLQkJCS00OjAwCS0JV0FSVAkxOTkyIE9jdCAxOAotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgTWF5IDIzCi0JCQktNDowMAktCVdBUlQJMjAwNCBTZXAgMjYKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBTYW4gTHVpcyAoU0wpCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzIC00OjI1OjI0IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTAKLQkJCS0zOjAwCTE6MDAJQVJTVAkxOTkwIE1hciAxNAotCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDE1Ci0JCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyICAxCi0JCQktNDowMAktCVdBUlQJMTk5MSBKdW4gIDEKLQkJCS0zOjAwCS0JQVJUCTE5OTkgT2N0ICAzCi0JCQktNDowMAkxOjAwCVdBUlNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IE1heSAzMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVsIDI1Ci0JCQktMzowMAlBcmcJQVIlc1QJMjAwOCBKYW4gMjEKLQkJCS0zOjAwCS0JQVJUCi0jCi0jIFNhbnRhIENydXogKFNDKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MgLTQ6MzY6NTIgLSBMTVQgMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IEp1biAgMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVuIDIwCi0JCQktMzowMAlBcmcJQVIlc1QKLSMKLSMgVGllcnJhIGRlbCBGdWVnbywgQW50YXJ0aWRhIGUgSXNsYXMgZGVsIEF0bGFudGljbyBTdXIgKFRGKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhIC00OjMzOjEyIC0gTE1UIDE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAjIENvcmRvYmEgTWVhbiBUaW1lCi0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJLQlBUlQJMjAwNCBNYXkgMzAKLQkJCS00OjAwCS0JV0FSVAkyMDA0IEp1biAyMAotCQkJLTM6MDAJQXJnCUFSJXNUCi0KLSMgQXJ1YmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9BcnViYQktNDo0MDoyNCAtCUxNVAkxOTEyIEZlYiAxMgkjIE9yYW5qZXN0YWQKLQkJCS00OjMwCS0JQU5UCTE5NjUgIyBOZXRoZXJsYW5kcyBBbnRpbGxlcyBUaW1lCi0JCQktNDowMAktCUFTVAotCi0jIEJvbGl2aWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9MYV9QYXoJLTQ6MzI6MzYgLQlMTVQJMTg5MAotCQkJLTQ6MzI6MzYgLQlDTVQJMTkzMSBPY3QgMTUgIyBDYWxhbWFyY2EgTVQKLQkJCS00OjMyOjM2IDE6MDAJQk9TVAkxOTMyIE1hciAyMSAjIEJvbGl2aWEgU1QKLQkJCS00OjAwCS0JQk9UCSMgQm9saXZpYSBUaW1lCi0KLSMgQnJhemlsCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5My0xMS0xOCk6Ci0jIFRoZSBtYXlvciBvZiBSaW8gcmVjZW50bHkgYXR0ZW1wdGVkIHRvIGNoYW5nZSB0aGUgdGltZSB6b25lIHJ1bGVzCi0jIGp1c3QgaW4gaGlzIGNpdHksIGluIG9yZGVyIHRvIGxlYXZlIG1vcmUgc3VtbWVyIHRpbWUgZm9yIHRoZSB0b3VyaXN0IHRyYWRlLgotIyBUaGUgcnVsZSBjaGFuZ2UgbGFzdGVkIG9ubHkgcGFydCBvZiB0aGUgZGF5OwotIyB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50IHJlZnVzZWQgdG8gZm9sbG93IHRoZSBjaXR5J3MgcnVsZXMsIGFuZCBidXNpbmVzcwotIyB3YXMgaW4gYSBjaGFvcywgc28gdGhlIG1heW9yIGJhY2tlZCBkb3duIHRoYXQgYWZ0ZXJub29uLgotCi0jIEZyb20gSUFUQSBTU0lNICgxOTk2LTAyKToKLSMgX09ubHlfIHRoZSBmb2xsb3dpbmcgc3RhdGVzIGluIEJSMSBvYnNlcnZlIERTVDogUmlvIEdyYW5kZSBkbyBTdWwgKFJTKSwKLSMgU2FudGEgQ2F0YXJpbmEgKFNDKSwgUGFyYW5hIChQUiksIFNhbyBQYXVsbyAoU1ApLCBSaW8gZGUgSmFuZWlybyAoUkopLAotIyBFc3Bpcml0byBTYW50byAoRVMpLCBNaW5hcyBHZXJhaXMgKE1HKSwgQmFoaWEgKEJBKSwgR29pYXMgKEdPKSwKLSMgRGlzdHJpdG8gRmVkZXJhbCAoREYpLCBUb2NhbnRpbnMgKFRPKSwgU2VyZ2lwZSBbU0VdIGFuZCBBbGFnb2FzIFtBTF0uCi0jIFtUaGUgbGFzdCB0aHJlZSBzdGF0ZXMgYXJlIG5ldyB0byB0aGlzIGlzc3VlIG9mIHRoZSBJQVRBIFNTSU0uXQotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDE5OTYtMTAtMDcpOgotIyBHZW9ncmFwaHksIGhpc3RvcnkgKFRvY2FudGlucyB3YXMgcGFydCBvZiBHb2lhcyB1bnRpbCAxOTg5KSwgYW5kIG90aGVyCi0jIHNvdXJjZXMgb2YgdGltZSB6b25lIGluZm9ybWF0aW9uIGxlYWQgbWUgdG8gYmVsaWV2ZSB0aGF0IEFMLCBTRSwgYW5kIFRPIHdlcmUKLSMgYWx3YXlzIGluIEJSMSwgYW5kIHNvIHRoZSBvbmx5IGNoYW5nZSB3YXMgd2hldGhlciBvciBub3QgdGhleSBvYnNlcnZlZCBEU1QuLi4uCi0jIFRoZSBlYXJsaWVzdCBpc3N1ZSBvZiB0aGUgU1NJTSBJIGhhdmUgaXMgMi85MS4gIEVhY2ggaXNzdWUgZnJvbSB0aGVuIHVudGlsCi0jIDkvOTUgc2F5cyB0aGF0IERTVCBpcyBvYnNlcnZlZCBvbmx5IGluIHRoZSB0ZW4gc3RhdGVzIEkgcXVvdGVkIGZyb20gOS85NSwKLSMgYWxvbmcgd2l0aCBNYXRvIEdyb3NzbyAoTVQpIGFuZCBNYXRvIEdyb3NzbyBkbyBTdWwgKE1TKSwgd2hpY2ggYXJlIGluIEJSMgotIyAoVVRDLTQpLi4uLiAgVGhlIG90aGVyIHR3byB0aW1lIHpvbmVzIGdpdmVuIGZvciBCcmF6aWwgYXJlIEJSMywgd2hpY2ggaXMKLSMgVVRDLTUsIG5vIERTVCwgYW5kIGFwcGxpZXMgb25seSBpbiB0aGUgc3RhdGUgb2YgQWNyZSAoQUMpOyBhbmQgQlI0LCB3aGljaCBpcwotIyBVVEMtMiwgYW5kIGFwcGxpZXMgdG8gRmVybmFuZG8gZGUgTm9yb25oYSAoZm9ybWVybHkgRk4sIGJ1dCBJIGJlbGlldmUgaXQncwotIyBiZWNvbWUgcGFydCBvZiB0aGUgc3RhdGUgb2YgUGVybmFtYnVjbykuICBUaGUgYm91bmRhcnkgYmV0d2VlbiBCUjEgYW5kIEJSMgotIyBoYXMgbmV2ZXIgYmVlbiBjbGVhcmx5IHN0YXRlZC4gIFRoZXkndmUgc2ltcGx5IGJlZW4gY2FsbGVkIEVhc3QgYW5kIFdlc3QuCi0jIEhvd2V2ZXIsIHNvbWUgY29uY2x1c2lvbnMgY2FuIGJlIGRyYXduIGZyb20gYW5vdGhlciBJQVRBIG1hbnVhbDogdGhlIEFpcmxpbmUKLSMgQ29kaW5nIERpcmVjdG9yeSwgd2hpY2ggbGlzdHMgY2xvc2UgdG8gNDAwIGFpcnBvcnRzIGluIEJyYXppbC4gIEZvciBlYWNoCi0jIGFpcnBvcnQgaXQgZ2l2ZXMgYSB0aW1lIHpvbmUgd2hpY2ggaXMgY29kZWQgdG8gdGhlIFNTSU0uICBGcm9tIHRoYXQKLSMgaW5mb3JtYXRpb24sIEknbSBsZWQgdG8gY29uY2x1ZGUgdGhhdCB0aGUgc3RhdGVzIG9mIEFtYXBhIChBUCksIENlYXJhIChDRSksCi0jIE1hcmFuaGFvIChNQSksIFBhcmFpYmEgKFBSKSwgUGVybmFtYnVjbyAoUEUpLCBQaWF1aSAoUEkpLCBhbmQgUmlvIEdyYW5kZSBkbwotIyBOb3J0ZSAoUk4pLCBhbmQgdGhlIGVhc3Rlcm4gcGFydCBvZiBQYXJhIChQQSkgYXJlIGFsbCBpbiBCUjEgd2l0aG91dCBEU1QuCi0KLSMgRnJvbSBNYXJjb3MgVGFkZXUgKDE5OTgtMDktMjcpOgotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici92ZXJhbzEuaHRtbCI+Ci0jIEJyYXppbGlhbiBvZmZpY2lhbCBwYWdlCi0jIDwvYT4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCAoMjAwMC0xMS0wMyk6Ci0jIFtGb3IgYW4gb2ZmaWNpYWwgbGlzdCBvZiB3aGljaCByZWdpb25zIGluIEJyYXppbCB1c2Ugd2hpY2ggdGltZSB6b25lcywgc2VlOl0KLSMgaHR0cDovL3BjZHNoMDEub24uYnIvRnVzYnIuaHRtCi0jIGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0Z1c2JyaHYuaHRtCi0KLSMgRnJvbSBDZWxzbyBEb3JpYSB2aWEgRGF2aWQgTWFkZW8gKDIwMDItMTAtMDkpOgotIyBUaGUgcmVhc29uIGZvciB0aGUgZGVsYXkgdGhpcyB5ZWFyIGhhcyB0byBkbyB3aXRoIGVsZWN0aW9ucyBpbiBCcmF6aWwuCi0jCi0jIFVubGlrZSBpbiB0aGUgVW5pdGVkIFN0YXRlcywgZWxlY3Rpb25zIGluIEJyYXppbCBhcmUgMTAwJSBjb21wdXRlcml6ZWQgYW5kCi0jIHRoZSByZXN1bHRzIGFyZSBrbm93biBhbG1vc3QgaW1tZWRpYXRlbHkuICBZZXN0ZXJkYXksIGl0IHdhcyB0aGUgZmlyc3QKLSMgcm91bmQgb2YgdGhlIGVsZWN0aW9ucyB3aGVuIDExNSBtaWxsaW9uIEJyYXppbGlhbnMgdm90ZWQgZm9yIFByZXNpZGVudCwKLSMgR292ZXJub3IsIFNlbmF0b3JzLCBGZWRlcmFsIERlcHV0aWVzLCBhbmQgU3RhdGUgRGVwdXRpZXMuICBOb2JvZHkgaXMKLSMgY291bnRpbmcgKG9yIHJlLWNvdW50aW5nKSB2b3RlcyBhbnltb3JlIGFuZCB3ZSBrbm93IHRoZXJlIHdpbGwgYmUgYSBzZWNvbmQKLSMgcm91bmQgZm9yIHRoZSBQcmVzaWRlbmN5IGFuZCBhbHNvIGZvciBzb21lIEdvdmVybm9ycy4gIFRoZSAybmQgcm91bmQgd2lsbAotIyB0YWtlIHBsYWNlIG9uIE9jdG9iZXIgMjd0aC4KLSMKLSMgVGhlIHJlYXNvbiB3aHkgdGhlIERTVCB3aWxsIG9ubHkgYmVnaW4gTm92ZW1iZXIgM3JkIGlzIHRoYXQgdGhlIHRob3VzYW5kcwotIyBvZiBlbGVjdG9yYWwgbWFjaGluZXMgdXNlZCBjYW5ub3QgaGF2ZSB0aGVpciB0aW1lIGNoYW5nZWQsIGFuZCBzaW5jZSB0aGUKLSMgQ29uc3RpdHV0aW9uIHNheXMgdGhlIGVsZWN0aW9ucyBtdXN0IGJlZ2luIGF0IDg6MDAgQU0gYW5kIGVuZCBhdCA1OjAwIFBNLAotIyB0aGUgR292ZXJubWVudCBkZWNpZGVkIHRvIHBvc3Rwb25lIERTVCwgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUgQ29uc3RpdHV0aW9uCi0jIChtYXliZSwgZm9yIHRoZSBuZXh0IGVsZWN0aW9ucywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGNsb2NrKS4uLgotCi0jIEZyb20gUm9kcmlnbyBTZXZlcm8gKDIwMDQtMTAtMDQpOgotIyBJdCdzIGp1c3QgdGhlIGJpYW5udWFsIGNoYW5nZSBtYWRlIG5lY2Vzc2FyeSBieSB0aGUgbXVjaCBoeXBlZCwgc3VwcG9zZWRseQotIyBtb2Rlcm4gQnJhemlsaWFuIGVsZXRyb25pYyB2b3RpbmcgbWFjaGluZXMgd2hpY2gsIGFwcGFyZW50bHksIGNhbid0IGRlYWwKLSMgd2l0aCBhIHRpbWUgY2hhbmdlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgc2Vjb25kIHJvdW5kcyBvZiB0aGUgZWxlY3Rpb25zLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTA5LTIwKToKLSMgQnJhemlsIHdpbGwgc3RhcnQgRFNUIG9uIDIwMDctMTAtMTQgMDA6MDAgYW5kIGVuZCBvbiAyMDA4LTAyLTE3IDAwOjAwOgotIyBodHRwOi8vd3d3Lm1tZS5nb3YuYnIvc2l0ZS9uZXdzL2RldGFpbC5kbztqc2Vzc2lvbmlkPUJCQTA2ODExQUZDQUFDMjhGMDI4NTIxMDkxMzUxM0RBP25ld3NJZD0xMzk3NQotCi0jIEZyb20gUGF1bCBTY2h1bHplICgyMDA4LTA2LTI0KToKLSMgLi4uYnkgbGF3IG51bWJlciAxMS42NjIgb2YgQXByaWwgMjQsIDIwMDggKHB1Ymxpc2hlZCBpbiB0aGUgIkRpYXJpbwotIyBPZmljaWFsIGRhIFVuaWFvIi4uLikgaW4gQnJhemlsIHRoZXJlIGFyZSBjaGFuZ2VzIGluIHRoZSB0aW1lem9uZXMsCi0jIGVmZmVjdGl2ZSB0b2RheSAoMDA6MDBhbSBhdCBKdW5lIDI0LCAyMDA4KSBhcyBmb2xsb3dzOgotIwotIyBhKSBUaGUgdGltZXpvbmUgVVRDKzUgaXMgZVt4XXRpbmd1aXNoZWQsIHdpdGggYWxsIHRoZSBBY3JlIHN0YXRlIGFuZCB0aGUKLSMgcGFydCBvZiB0aGUgQW1hem9uYXMgc3RhdGUgdGhhdCBoYWQgdGhpcyB0aW1lem9uZSBub3cgYmVpbmcgcHV0IHRvIHRoZQotIyB0aW1lem9uZSBVVEMrNAotIyBiKSBUaGUgd2hvbGUgUGFyYSBzdGF0ZSBub3cgaXMgcHV0IGF0IHRpbWV6b25lIFVUQyszLCBpbnN0ZWFkIG9mIGp1c3QKLSMgcGFydCBvZiBpdCwgYXMgd2FzIGJlZm9yZS4KLSMKLSMgVGhpcyBjaGFuZ2UgZm9sbG93cyBhIHByb3Bvc2FsIG9mIHNlbmF0b3IgVGlhbyBWaWFuYSBvZiBBY3JlIHN0YXRlLCB0aGF0Ci0jIHByb3Bvc2VkIGl0IGR1ZSB0byBjb25jZXJucyBhYm91dCBvcGVuIHRlbGV2aXNpb24gY2hhbm5lbHMgZGlzcGxheWluZwotIyBwcm9ncmFtcyBpbmFwcHJvcHJpYXRlIHRvIHlvdXRocyBpbiB0aGUgc3RhdGVzIHRoYXQgaGFkIHRoZSB0aW1lem9uZQotIyBVVEMrNSB0b28gZWFybHkgaW4gdGhlIG5pZ2h0LiBJbiB0aGUgb2NjYXNpb24sIHNvbWUgbW9yZSBjb3JyZWN0aW9ucwotIyB3ZXJlIHByb3Bvc2VkLCB0cnlpbmcgdG8gdW5pZnkgdGhlIHRpbWV6b25lcyBvZiBhbnkgZ2l2ZW4gc3RhdGUuIFRoaXMKLSMgY2hhbmdlIG1vZGlmaWVzIHRpbWV6b25lIHJ1bGVzIGRlZmluZWQgaW4gZGVjcmVlIDIuNzg0IG9mIDE4IEp1bmUsCi0jIDE5MTMuCi0KLSMgRnJvbSBSb2RyaWdvIFNldmVybyAoMjAwOC0wNi0yNCk6Ci0jIEp1c3QgY29ycmVjdGluZyB0aGUgVVJMOgotIyA8YSBocmVmPSJodHRwczovL3d3dy5pbi5nb3YuYnIvaW1wcmVuc2EvdmlzdWFsaXphL2luZGV4LmpzcD9qb3JuYWw9M0RkbyZzZWNhbz0zRDEmcGFnaW5hPTNEMSZkYXRhPTNEMjUvMDQvMjAwOCI+Ci0jIGh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD0zRGRvJnNlY2FvPTNEMSZwYWdpbmE9M0QxJmRhdGE9M0QyNS8wNC8yMDA4Ci0jIDwvYT4KLSMKLSMgQXMgYSByZXN1bHQgb2YgdGhlIGFib3ZlIERlY3JlZSBJIGJlbGlldmUgdGhlIEFtZXJpY2EvUmlvX0JyYW5jbwotIyB0aW1lem9uZSBzaGFsbCBiZSBtb2RpZmllZCBmcm9tIFVUQy01IHRvIFVUQy00IGFuZCBhIG5ldyB0aW1lem9uZSBzaGFsbAotIyBiZSBjcmVhdGVkIHRvIHJlcHJlc2VudCB0aGUgdGhlIHdlc3Qgc2lkZSBvZiB0aGUgUGFyYSBTdGF0ZS4gSQotIyBzdWdnZXN0IHRoaXMgbmV3IHRpbWV6b25lIGJlIGNhbGxlZCBTYW50YXJlbSBhcyB0aGUgbW9zdAotIyBpbXBvcnRhbnQvcG9wdWxhdGVkIGNpdHkgaW4gdGhlIGFmZmVjdGVkIGFyZWEuCi0jCi0jIFRoaXMgbmV3IHRpbWV6b25lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBSaW9fQnJhbmNvIHRpbWV6b25lIHVwIHRvCi0jIHRoZSAyMDA4LzA2LzI0IGNoYW5nZSB3aGljaCB3b3VsZCBiZSB0byBVVEMtMyBpbnN0ZWFkIG9mIFVUQy00LgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNi0yNCk6Ci0jIFRoaXMgaXMgYSBxdWljayByZWZlcmVuY2UgcGFnZSBmb3IgTmV3IGFuZCBPbGQgQnJhemlsIFRpbWUgWm9uZXMgbWFwLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2JyYXppbC10aW1lLW5ldy1vbGQucGhwIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9icmF6aWwtdGltZS1uZXctb2xkLnBocAotIyA8L2E+Ci0jCi0jIC0gNCB0aW1lIHpvbmVzIHJlcGxhY2VkIGJ5IDMgdGltZSB6b25lcy1lbGltaW5hdGluZyB0aW1lIHpvbmUgVVRDLSAwNQotIyAoc3RhdGUgQWNyZSBhbmQgdGhlIHBhcnQgb2YgdGhlIEFtYXpvbmFzIHdpbGwgYmUgVVRDL0dNVC0gMDQpIC0gd2VzdGVybgotIyBwYXJ0IG9mIFBhciBzdGF0ZSBpcyBtb3ZpbmcgdG8gb25lIHRpbWV6b25lIFVUQy0gMDMgKGZyb20gVVRDIC0wNCkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0xMC0xMCk6Ci0jIFRoZSBvZmZpY2lhbCBkZWNyZWVzIHJlZmVyZW5jZWQgYmVsb3cgYXJlIG1vc3RseSB0YWtlbiBmcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWLmh0bWwiPgotIyBEZWNyZXRvcyBzb2JyZSBvIEhvcmFyaW8gZGUgVmVyYW8gbm8gQnJhc2lsCi0jIDwvYT4uCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDgtMjkpOgotIyBBcyBhbm5vdW5jZWQgYnkgdGhlIGdvdmVybm1lbnQgYW5kIG1hbnkgbmV3c3BhcGVycyBpbiBCcmF6aWwgbGF0ZQotIyB5ZXN0ZXJkYXksIEJyYXppbCB3aWxsIHN0YXJ0IERTVCBvbiAyMDA4LTEwLTE5IChuZWVkIHRvIGNoYW5nZSBydWxlKSBhbmQKLSMgaXQgd2lsbCBlbmQgb24gMjAwOS0wMi0xNSAoY3VycmVudCBydWxlIGZvciBCcmF6aWwgaXMgZmluZSkuIEJhc2VkIG9uCi0jIHBhc3QgeWVhcnMgZXhwZXJpZW5jZSB3aXRoIHRoZSBlbGVjdGlvbnMsIHRoZXJlIHdhcyBhIGdvb2QgY2hhbmNlIHRoYXQKLSMgdGhlIHN0YXJ0IHdhcyBwb3N0cG9uZWQgdG8gTm92ZW1iZXIsIGJ1dCBpdCBkaWQgbm90IGhhcHBlbiB0aGlzIHllYXIuCi0jCi0jIEl0IGhhcyBub3QgeWV0IGJlZW4gcG9zdGVkIHRvIGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWLmh0bWwKLSMKLSMgQW4gb2ZmaWNpYWwgcGFnZSBhYm91dCBpdDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tbWUuZ292LmJyL3NpdGUvbmV3cy9kZXRhaWwuZG8/bmV3c0lkPTE2NzIyIj4KLSMgaHR0cDovL3d3dy5tbWUuZ292LmJyL3NpdGUvbmV3cy9kZXRhaWwuZG8/bmV3c0lkPTE2NzIyCi0jIDwvYT4KLSMgTm90ZSB0aGF0IHRoaXMgbGluayBkb2VzIG5vdCBhbHdheXMgd29yayBkaXJlY3RseSwgYnV0IG11c3QgYmUgYWNjZXNzZWQKLSMgYnkgZ29pbmcgdG8KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tbWUuZ292LmJyL2ZpcnN0Ij4KLSMgaHR0cDovL3d3dy5tbWUuZ292LmJyL2ZpcnN0Ci0jIDwvYT4KLSMKLSMgT25lIGV4YW1wbGUgbGluayB0aGF0IHdvcmtzIGRpcmVjdGx5OgotIyA8YSBocmVmPSJodHRwOi8vam9ybmFsZS5jb20uYnIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MTM1MzAmSXRlbWlkPTU0Ij4KLSMgaHR0cDovL2pvcm5hbGUuY29tLmJyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTEzNTMwJkl0ZW1pZD01NAotIyAoUG9ydHVndWVzZSkKLSMgPC9hPgotIwotIyBXZSBoYXZlIGEgd3JpdHRlbiBhIHNob3J0IGFydGljbGUgYWJvdXQgaXQgYXMgd2VsbDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JyYXppbC1kc3QtMjAwOC0yMDA5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvYnJhemlsLWRzdC0yMDA4LTIwMDkuaHRtbAotIyA8L2E+Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwNDY2Lmh0bSI+MjAsNDY2PC9hPiAoMTkzMS0xMC0wMSkKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjE4OTYuaHRtIj4yMSw4OTY8L2E+ICgxOTMyLTAxLTEwKQotUnVsZQlCcmF6aWwJMTkzMQlvbmx5CS0JT2N0CSAzCTExOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTkzMgkxOTMzCS0JQXByCSAxCSAwOjAwCTAJLQotUnVsZQlCcmF6aWwJMTkzMglvbmx5CS0JT2N0CSAzCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyMzE5NS5odG0iPjIzLDE5NTwvYT4gKDE5MzMtMTAtMTApCi0jIHJldm9rZWQgRFNULgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzQ5Ni5odG0iPjI3LDQ5NjwvYT4gKDE5NDktMTEtMjQpCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjI3OTk4Lmh0bSI+MjcsOTk4PC9hPiAoMTk1MC0wNC0xMykKLVJ1bGUJQnJhemlsCTE5NDkJMTk1MgktCURlYwkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTE5NTAJb25seQktCUFwcgkxNgkgMTowMAkwCS0KLVJ1bGUJQnJhemlsCTE5NTEJMTk1MgktCUFwcgkgMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzIzMDguaHRtIj4zMiwzMDg8L2E+ICgxOTUzLTAyLTI0KQotUnVsZQlCcmF6aWwJMTk1Mwlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYzNDcyNC5odG0iPjM0LDcyNDwvYT4gKDE5NTMtMTEtMzApCi0jIHJldm9rZWQgRFNULgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MjcwMC5odG0iPjUyLDcwMDwvYT4gKDE5NjMtMTAtMTgpCi0jIGVzdGFibGlzaGVkIERTVCBmcm9tIDE5NjMtMTAtMjMgMDA6MDAgdG8gMTk2NC0wMi0yOSAwMDowMAotIyBpbiBTUCwgUkosIEdCLCBNRywgRVMsIGR1ZSB0byB0aGUgcHJvbG9uZ2F0aW9uIG9mIHRoZSBkcm91Z2h0LgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzA3MS5odG0iPjUzLDA3MTwvYT4gKDE5NjMtMTItMDMpCi0jIGV4dGVuZGVkIHRoZSBhYm92ZSBkZWNyZWUgdG8gYWxsIG9mIHRoZSBuYXRpb25hbCB0ZXJyaXRvcnkgb24gMTItMDkuCi1SdWxlCUJyYXppbAkxOTYzCW9ubHkJLQlEZWMJIDkJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjUzNjA0Lmh0bSI+NTMsNjA0PC9hPiAoMTk2NC0wMi0yNSkKLSMgZXh0ZW5kZWQgc3VtbWVyIHRpbWUgYnkgb25lIGRheSB0byAxOTY0LTAzLTAxIDAwOjAwIChzdGFydCBvZiBzY2hvb2wpLgotUnVsZQlCcmF6aWwJMTk2NAlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1NTYzOS5odG0iPjU1LDYzOTwvYT4gKDE5NjUtMDEtMjcpCi1SdWxlCUJyYXppbAkxOTY1CW9ubHkJLQlKYW4JMzEJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTY1CW9ubHkJLQlNYXIJMzEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3MzAzLmh0bSI+NTcsMzAzPC9hPiAoMTk2NS0xMS0yMikKLVJ1bGUJQnJhemlsCTE5NjUJb25seQktCURlYwkgMQkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTc4NDMuaHRtIj41Nyw4NDM8L2E+ICgxOTY2LTAyLTE4KQotUnVsZQlCcmF6aWwJMTk2NgkxOTY4CS0JTWFyCSAxCSAwOjAwCTAJLQotUnVsZQlCcmF6aWwJMTk2NgkxOTY3CS0JTm92CSAxCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY2MzQyOS5odG0iPjYzLDQyOTwvYT4gKDE5NjgtMTAtMTUpCi0jIHJldm9rZWQgRFNULgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5MTY5OC5odG0iPjkxLDY5ODwvYT4gKDE5ODUtMDktMjcpCi1SdWxlCUJyYXppbAkxOTg1CW9ubHkJLQlOb3YJIDIJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA5MiwzMTAgKDE5ODYtMDEtMjEpCi0jIERlY3JlZSA5Miw0NjMgKDE5ODYtMDMtMTMpCi1SdWxlCUJyYXppbAkxOTg2CW9ubHkJLQlNYXIJMTUJIDA6MDAJMAktCi0jIERlY3JlZSA5MywzMTYgKDE5ODYtMTAtMDEpCi1SdWxlCUJyYXppbAkxOTg2CW9ubHkJLQlPY3QJMjUJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTg3CW9ubHkJLQlGZWIJMTQJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk0OTIyLmh0bSI+OTQsOTIyPC9hPiAoMTk4Ny0wOS0yMikKLVJ1bGUJQnJhemlsCTE5ODcJb25seQktCU9jdAkyNQkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTE5ODgJb25seQktCUZlYgkgNwkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTY2NzYuaHRtIj45Niw2NzY8L2E+ICgxOTg4LTA5LTEyKQotIyBleGNlcHQgZm9yIHRoZSBzdGF0ZXMgb2YgQUMsIEFNLCBQQSwgUlIsIFJPLCBhbmQgQVAgKHRoZW4gYSB0ZXJyaXRvcnkpCi1SdWxlCUJyYXppbAkxOTg4CW9ubHkJLQlPY3QJMTYJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTg5CW9ubHkJLQlKYW4JMjkJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk4MDc3Lmh0bSI+OTgsMDc3PC9hPiAoMTk4OS0wOC0yMSkKLSMgd2l0aCB0aGUgc2FtZSBleGNlcHRpb25zCi1SdWxlCUJyYXppbAkxOTg5CW9ubHkJLQlPY3QJMTUJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTkwCW9ubHkJLQlGZWIJMTEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk5NTMwLmh0bSI+OTksNTMwPC9hPiAoMTk5MC0wOS0xNykKLSMgYWRvcHRlZCBieSBSUywgU0MsIFBSLCBTUCwgUkosIEVTLCBNRywgR08sIE1TLCBERi4KLSMgRGVjcmVlIDk5LDYyOSAoMTk5MC0xMC0xOSkgYWRkcyBCQSwgTVQuCi1SdWxlCUJyYXppbAkxOTkwCW9ubHkJLQlPY3QJMjEJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTkxCW9ubHkJLQlGZWIJMTcJIDA6MDAJMAktCi0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTk5MS5odG0iPlVubnVtYmVyZWQgZGVjcmVlPC9hPiAoMTk5MS0wOS0yNSkKLSMgYWRvcHRlZCBieSBSUywgU0MsIFBSLCBTUCwgUkosIEVTLCBNRywgQkEsIEdPLCBNVCwgTVMsIERGLgotUnVsZQlCcmF6aWwJMTk5MQlvbmx5CS0JT2N0CTIwCSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5Mglvbmx5CS0JRmViCSA5CSAwOjAwCTAJLQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTIuaHRtIj5Vbm51bWJlcmVkIGRlY3JlZTwvYT4gKDE5OTItMTAtMTYpCi0jIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCi1SdWxlCUJyYXppbAkxOTkyCW9ubHkJLQlPY3QJMjUJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTkzCW9ubHkJLQlKYW4JMzEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk0Mi5odG0iPjk0MjwvYT4gKDE5OTMtMDktMjgpCi0jIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIHBsdXMgQU0uCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjEyNTIuaHRtIj4xLDI1MjwvYT4gKDE5OTQtMDktMjI7Ci0jIHdlYiBwYWdlIGNvcnJlY3RlZCAyMDA0LTAxLTA3KSBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBtaW51cyBBTS4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTYzNi5odG0iPjEsNjM2PC9hPiAoMTk5NS0wOS0xNCkKLSMgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgcGx1cyBNVCBhbmQgVE8uCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE2NzQuaHRtIj4xLDY3NDwvYT4gKDE5OTUtMTAtMTMpCi0jIGFkZHMgQUwsIFNFLgotUnVsZQlCcmF6aWwJMTk5MwkxOTk1CS0JT2N0CVN1bj49MTEJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTk0CTE5OTUJLQlGZWIJU3VuPj0xNQkgMDowMAkwCS0KLVJ1bGUJQnJhemlsCTE5OTYJb25seQktCUZlYgkxMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjAwMC5odG0iPjIsMDAwPC9hPiAoMTk5Ni0wOS0wNCkKLSMgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgbWludXMgQUwsIFNFLgotUnVsZQlCcmF6aWwJMTk5Nglvbmx5CS0JT2N0CSA2CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5Nwlvbmx5CS0JRmViCTE2CSAwOjAwCTAJLQotIyBGcm9tIERhbmllbCBDLiBTb2JyYWwgKDE5OTgtMDItMTIpOgotIyBJbiAxOTk3LCB0aGUgRFMgYmVnYW4gb24gT2N0b2JlciA2LiBUaGUgc3RhdGVkIHJlYXNvbiB3YXMgdGhhdAotIyBiZWNhdXNlIGludGVybmF0aW9uYWwgdGVsZXZpc2lvbiBuZXR3b3JrcyBpZ25vcmVkIEJyYXppbCdzIHBvbGljeSBvbiBEUywKLSMgdGhleSBib3VnaHQgdGhlIHdyb25nIHRpbWVzIG9uIHNhdGVsbGl0ZSBmb3IgY292ZXJhZ2Ugb2YgUG9wZSdzIHZpc2l0LgotIyBUaGlzIHllYXIsIHRoZSBlbmRpbmcgZGF0ZSBvZiBEUyB3YXMgcG9zdHBvbmVkIHRvIE1hcmNoIDEKLSMgdG8gaGVscCBkZWFsaW5nIHdpdGggdGhlIHNob3J0YWdlcyBvZiBlbGVjdHJpYyBwb3dlci4KLSMKLSMgRGVjcmVlIDIsMzE3ICgxOTk3LTA5LTA0KSwgYWRvcHRlZCBieSBzYW1lIHN0YXRlcy4KLVJ1bGUJQnJhemlsCTE5OTcJb25seQktCU9jdAkgNgkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSFYyNDk1LkpQRyI+Miw0OTU8L2E+Ci0jICgxOTk4LTAyLTEwKQotUnVsZQlCcmF6aWwJMTk5OAlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9Idjk4LmpwZyI+Miw3ODA8L2E+ICgxOTk4LTA5LTExKQotIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCi1SdWxlCUJyYXppbAkxOTk4CW9ubHkJLQlPY3QJMTEJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTk5CW9ubHkJLQlGZWIJMjEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMzE1MC5naWYiPjMsMTUwPC9hPgotIyAoMTk5OS0wOC0yMykgYWRvcHRlZCBieSBzYW1lIHN0YXRlcy4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWOTkuZ2lmIj4zLDE4ODwvYT4gKDE5OTktMDktMzApCi0jIGFkZHMgU0UsIEFMLCBQQiwgUEUsIFJOLCBDRSwgUEksIE1BIGFuZCBSUi4KLVJ1bGUJQnJhemlsCTE5OTkJb25seQktCU9jdAkgMwkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTIwMDAJb25seQktCUZlYgkyNwkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RFQzM1OTIuaHRtIj4zLDU5MjwvYT4gKDIwMDAtMDktMDYpCi0jIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlYzM2MzAuanBnIj4zLDYzMDwvYT4gKDIwMDAtMTAtMTMpCi0jIHJlcGVhbHMgRFNUIGluIFBFIGFuZCBSUiwgZWZmZWN0aXZlIDIwMDAtMTAtMTUgMDA6MDAuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMyLmpwZyI+Myw2MzI8L2E+ICgyMDAwLTEwLTE3KQotIyByZXBlYWxzIERTVCBpbiBTRSwgQUwsIFBCLCBSTiwgQ0UsIFBJIGFuZCBNQSwgZWZmZWN0aXZlIDIwMDAtMTAtMjIgMDA6MDAuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMzkxNi5naWYiPjMsOTE2PC9hPgotIyAoMjAwMS0wOS0xMykgcmVlc3RhYmxpc2hlcyBEU1QgaW4gQUwsIENFLCBNQSwgUEIsIFBFLCBQSSwgUk4sIFNFLgotUnVsZQlCcmF6aWwJMjAwMAkyMDAxCS0JT2N0CVN1bj49OAkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTIwMDEJMjAwNgktCUZlYglTdW4+PTE1CSAwOjAwCTAJLQotIyBEZWNyZWUgNCwzOTkgKDIwMDItMTAtMDEpIHJlcGVhbHMgRFNUIGluIEFMLCBDRSwgTUEsIFBCLCBQRSwgUEksIFJOLCBTRS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMi9ENDM5OS5odG0iPjQsMzk5PC9hPgotUnVsZQlCcmF6aWwJMjAwMglvbmx5CS0JTm92CSAzCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgNCw4NDQgKDIwMDMtMDktMjQ7IGNvcnJlY3RlZCAyMDAzLTA5LTI2KSByZXBlYWxzIERTVCBpbiBCQSwgTVQsIFRPLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5ici9DQ0lWSUwvZGVjcmV0by8yMDAzL0Q0ODQ0Lmh0bSI+NCw4NDQ8L2E+Ci1SdWxlCUJyYXppbAkyMDAzCW9ubHkJLQlPY3QJMTkJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA1LDIyMyAoMjAwNC0xMC0wMSkgcmVlc3RhYmxpc2hlcyBEU1QgaW4gTVQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNC0yMDA2LzIwMDQvRGVjcmV0by9ENTIyMy5odG0iPjUsMjIzPC9hPgotUnVsZQlCcmF6aWwJMjAwNAlvbmx5CS0JTm92CSAyCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY1NTM5LmdpZiI+NSw1Mzk8L2E+ICgyMDA1LTA5LTE5KSwKLSMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgotUnVsZQlCcmF6aWwJMjAwNQlvbmx5CS0JT2N0CTE2CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY1OTIwLmdpZiI+NSw5MjA8L2E+ICgyMDA2LTEwLTAzKSwKLSMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgotUnVsZQlCcmF6aWwJMjAwNglvbmx5CS0JTm92CSA1CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMjAwNwlvbmx5CS0JRmViCTI1CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY2MjEyLmdpZiI+NiwyMTI8L2E+ICgyMDA3LTA5LTI2KSwKLSMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgotUnVsZQlCcmF6aWwJMjAwNwlvbmx5CS0JT2N0CVN1bj49OAkgMDowMAkxOjAwCVMKLSMgRnJvbSBGcmVkZXJpY28gQS4gQy4gTmV2ZXMgKDIwMDgtMDktMTApOgotIyBBY29yZGluZyB0byB0aGlzIGRlY3JlZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDctMjAxMC8yMDA4L0RlY3JldG8vRDY1NTguaHRtIj4KLSMgaHR0cDovL3d3dy5wbGFuYWx0by5nb3YuYnIvY2NpdmlsXzAzL19BdG8yMDA3LTIwMTAvMjAwOC9EZWNyZXRvL0Q2NTU4Lmh0bQotIyA8L2E+Ci0jIFt0XWhlIERTVCBwZXJpb2QgaW4gQnJhemlsIG5vdyBvbiB3aWxsIGJlIGZyb20gdGhlIDNyZCBPY3QgU3VuZGF5IHRvIHRoZQotIyAzcmQgRmViIFN1bmRheS4gVGhlcmUgaXMgYW4gZXhjZXB0aW9uIG9uIHRoZSByZXR1cm4gZGF0ZSB3aGVuIHRoaXMgaXMKLSMgdGhlIENhcm5pdmFsIFN1bmRheSB0aGVuIHRoZSByZXR1cm4gZGF0ZSB3aWxsIGJlIHRoZSBuZXh0IFN1bmRheS4uLgotUnVsZQlCcmF6aWwJMjAwOAltYXgJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMjAwOAkyMDExCS0JRmViCVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMTIJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDEzCTIwMTQJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAxNQlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMTYJMjAyMgktCUZlYglTdW4+PTE1CTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDIzCW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAyNAkyMDI1CS0JRmViCVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMjYJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDI3CTIwMzMJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAzNAlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMzUJMjAzNgktCUZlYglTdW4+PTE1CTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDM3CW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wOS0yOSk6Ci0jIFRoZSBuZXh0IGlzIHdyb25nIGluIHNvbWUgeWVhcnMgYnV0IGlzIGJldHRlciB0aGFuIG5vdGhpbmcuCi1SdWxlCUJyYXppbAkyMDM4CW1heAktCUZlYglTdW4+PTE1CTA6MDAJMAktCi0KLSMgVGhlIGxhdGVzdCBydWxlc2V0IGxpc3RlZCBhYm92ZSBzYXlzIHRoYXQgdGhlIGZvbGxvd2luZyBzdGF0ZXMgb2JzZXJ2ZSBEU1Q6Ci0jIERGLCBFUywgR08sIE1HLCBNUywgTVQsIFBSLCBSSiwgUlMsIFNDLCBTUC4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIwotIyBGZXJuYW5kbyBkZSBOb3JvbmhhIChhZG1pbmlzdHJhdGl2ZWx5IHBhcnQgb2YgUEUpCi1ab25lIEFtZXJpY2EvTm9yb25oYQktMjowOTo0MCAtCUxNVAkxOTE0Ci0JCQktMjowMAlCcmF6aWwJRk4lc1QJMTk5MCBTZXAgMTcKLQkJCS0yOjAwCS0JRk5UCTE5OTkgU2VwIDMwCi0JCQktMjowMAlCcmF6aWwJRk4lc1QJMjAwMCBPY3QgMTUKLQkJCS0yOjAwCS0JRk5UCTIwMDEgU2VwIDEzCi0JCQktMjowMAlCcmF6aWwJRk4lc1QJMjAwMiBPY3QgIDEKLQkJCS0yOjAwCS0JRk5UCi0jIE90aGVyIEF0bGFudGljIGlzbGFuZHMgaGF2ZSBubyBwZXJtYW5lbnQgc2V0dGxlbWVudC4KLSMgVGhlc2UgaW5jbHVkZSBUcmluZGFkZSBhbmQgTWFydGluIFZheiAoYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIEVTKSwKLSMgQXRvbCBkYXMgUm9jYXMgKFJOKSwgYW5kIFBlbmVkb3MgZGUgU2FvIFBlZHJvIGUgU2FvIFBhdWxvIChQRSkuCi0jIEZlcm5hbmRvIGRlIE5vcm9uaGEgd2FzIGEgc2VwYXJhdGUgdGVycml0b3J5IGZyb20gMTk0Mi0wOS0wMiB0byAxOTg5LTAxLTAxOwotIyBpdCBhbHNvIGluY2x1ZGVkIHRoZSBQZW5lZG9zLgotIwotIyBBbWFwYSAoQVApLCBlYXN0IFBhcmEgKFBBKQotIyBFYXN0IFBhcmEgaW5jbHVkZXMgQmVsZW0sIE1hcmFiYSwgU2VycmEgTm9ydGUsIGFuZCBTYW8gRmVsaXggZG8gWGluZ3UuCi0jIFRoZSBkaXZpc2lvbiBiZXR3ZWVuIGVhc3QgYW5kIHdlc3QgUGFyYSBpcyB0aGUgcml2ZXIgWGluZ3UuCi0jIEluIHRoZSBub3J0aCBhIHZlcnkgc21hbGwgcGFydCBmcm9tIHRoZSByaXZlciBKYXZhcnkgKG5vdyBKYXJpIEkgZ3Vlc3MsCi0jIHRoZSBib3JkZXIgd2l0aCBBbWFwYSkgdG8gdGhlIEFtYXpvbiwgdGhlbiB0byB0aGUgWGluZ3UuCi1ab25lIEFtZXJpY2EvQmVsZW0JLTM6MTM6NTYgLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5ODggU2VwIDEyCi0JCQktMzowMAktCUJSVAotIwotIyB3ZXN0IFBhcmEgKFBBKQotIyBXZXN0IFBhcmEgaW5jbHVkZXMgQWx0YW1pcmEsIE9yaWJpZG9zLCBQcmFpbmhhLCBPcml4aW1pbmEsIGFuZCBTYW50YXJlbS4KLVpvbmUgQW1lcmljYS9TYW50YXJlbQktMzozODo0OCAtCUxNVAkxOTE0Ci0JCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKLQkJCS00OjAwCS0JQU1UCTIwMDggSnVuIDI0IDAwOjAwCi0JCQktMzowMAktCUJSVAotIwotIyBNYXJhbmhhbyAoTUEpLCBQaWF1aSAoUEkpLCBDZWFyYSAoQ0UpLCBSaW8gR3JhbmRlIGRvIE5vcnRlIChSTiksCi0jIFBhcmFpYmEgKFBCKQotWm9uZSBBbWVyaWNhL0ZvcnRhbGV6YQktMjozNDowMCAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5MCBTZXAgMTcKLQkJCS0zOjAwCS0JQlJUCTE5OTkgU2VwIDMwCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMCBPY3QgMjIKLQkJCS0zOjAwCS0JQlJUCTIwMDEgU2VwIDEzCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMiBPY3QgIDEKLQkJCS0zOjAwCS0JQlJUCi0jCi0jIFBlcm5hbWJ1Y28gKFBFKSAoZXhjZXB0IEF0bGFudGljIGlzbGFuZHMpCi1ab25lIEFtZXJpY2EvUmVjaWZlCS0yOjE5OjM2IC0JTE1UCTE5MTQKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTkwIFNlcCAxNwotCQkJLTM6MDAJLQlCUlQJMTk5OSBTZXAgMzAKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkyMDAwIE9jdCAxNQotCQkJLTM6MDAJLQlCUlQJMjAwMSBTZXAgMTMKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkyMDAyIE9jdCAgMQotCQkJLTM6MDAJLQlCUlQKLSMKLSMgVG9jYW50aW5zIChUTykKLVpvbmUgQW1lcmljYS9BcmFndWFpbmEJLTM6MTI6NDggLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3Ci0JCQktMzowMAktCUJSVAkxOTk1IFNlcCAxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDMgU2VwIDI0Ci0JCQktMzowMAktCUJSVAotIwotIyBBbGFnb2FzIChBTCksIFNlcmdpcGUgKFNFKQotWm9uZSBBbWVyaWNhL01hY2VpbwktMjoyMjo1MiAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5MCBTZXAgMTcKLQkJCS0zOjAwCS0JQlJUCTE5OTUgT2N0IDEzCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5NiBTZXAgIDQKLQkJCS0zOjAwCS0JQlJUCTE5OTkgU2VwIDMwCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMCBPY3QgMjIKLQkJCS0zOjAwCS0JQlJUCTIwMDEgU2VwIDEzCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMiBPY3QgIDEKLQkJCS0zOjAwCS0JQlJUCi0jCi0jIEJhaGlhIChCQSkKLSMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbHZhZG9ycyBlbHNld2hlcmUsIHNvIHVzZSBBbWVyaWNhL0JhaGlhIGluc3RlYWQKLSMgb2YgQW1lcmljYS9TYWx2YWRvci4KLVpvbmUgQW1lcmljYS9CYWhpYQktMjozNDowNCAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMyBTZXAgMjQKLQkJCS0zOjAwCS0JQlJUCi0jCi0jIEdvaWFzIChHTyksIERpc3RyaXRvIEZlZGVyYWwgKERGKSwgTWluYXMgR2VyYWlzIChNRyksCi0jIEVzcGlyaXRvIFNhbnRvIChFUyksIFJpbyBkZSBKYW5laXJvIChSSiksIFNhbyBQYXVsbyAoU1ApLCBQYXJhbmEgKFBSKSwKLSMgU2FudGEgQ2F0YXJpbmEgKFNDKSwgUmlvIEdyYW5kZSBkbyBTdWwgKFJTKQotWm9uZSBBbWVyaWNhL1Nhb19QYXVsbwktMzowNjoyOCAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk2MyBPY3QgMjMgMDA6MDAKLQkJCS0zOjAwCTE6MDAJQlJTVAkxOTY0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QKLSMKLSMgTWF0byBHcm9zc28gZG8gU3VsIChNUykKLVpvbmUgQW1lcmljYS9DYW1wb19HcmFuZGUgLTM6Mzg6MjggLQlMTVQJMTkxNAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCi0jCi0jIE1hdG8gR3Jvc3NvIChNVCkKLVpvbmUgQW1lcmljYS9DdWlhYmEJLTM6NDQ6MjAgLQlMTVQJMTkxNAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTIwMDMgU2VwIDI0Ci0JCQktNDowMAktCUFNVAkyMDA0IE9jdCAgMQotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCi0jCi0jIFJvbmRvbmlhIChSTykKLVpvbmUgQW1lcmljYS9Qb3J0b19WZWxobyAtNDoxNTozNiAtCUxNVAkxOTE0Ci0JCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKLQkJCS00OjAwCS0JQU1UCi0jCi0jIFJvcmFpbWEgKFJSKQotWm9uZSBBbWVyaWNhL0JvYV9WaXN0YQktNDowMjo0MCAtCUxNVAkxOTE0Ci0JCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKLQkJCS00OjAwCS0JQU1UCTE5OTkgU2VwIDMwCi0JCQktNDowMAlCcmF6aWwJQU0lc1QJMjAwMCBPY3QgMTUKLQkJCS00OjAwCS0JQU1UCi0jCi0jIGVhc3QgQW1hem9uYXMgKEFNKTogQm9jYSBkbyBBY3JlLCBKdXRhaSwgTWFuYXVzLCBGbG9yaWFubyBQZWl4b3RvCi0jIFRoZSBncmVhdCBjaXJjbGUgbGluZSBmcm9tIFRhYmF0aW5nYSB0byBQb3J0byBBY3JlIGRpdmlkZXMKLSMgZWFzdCBmcm9tIHdlc3QgQW1hem9uYXMuCi1ab25lIEFtZXJpY2EvTWFuYXVzCS00OjAwOjA0IC0JTE1UCTE5MTQKLQkJCS00OjAwCUJyYXppbAlBTSVzVAkxOTg4IFNlcCAxMgotCQkJLTQ6MDAJLQlBTVQJMTk5MyBTZXAgMjgKLQkJCS00OjAwCUJyYXppbAlBTSVzVAkxOTk0IFNlcCAyMgotCQkJLTQ6MDAJLQlBTVQKLSMKLSMgd2VzdCBBbWF6b25hcyAoQU0pOiBBdGFsYWlhIGRvIE5vcnRlLCBCb2NhIGRvIE1hb2NvLCBCZW5qYW1pbiBDb25zdGFudCwKLSMJRWlydW5lcGUsIEVudmlyYSwgSXBpeHVuYQotWm9uZSBBbWVyaWNhL0VpcnVuZXBlCS00OjM5OjI4IC0JTE1UCTE5MTQKLQkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTg4IFNlcCAxMgotCQkJLTU6MDAJLQlBQ1QJMTk5MyBTZXAgMjgKLQkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTk0IFNlcCAyMgotCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgMDA6MDAKLQkJCS00OjAwCS0JQU1UCi0jCi0jIEFjcmUgKEFDKQotWm9uZSBBbWVyaWNhL1Jpb19CcmFuY28JLTQ6MzE6MTIgLQlMTVQJMTkxNAotCQkJLTU6MDAJQnJhemlsCUFDJXNUCTE5ODggU2VwIDEyCi0JCQktNTowMAktCUFDVAkyMDA4IEp1biAyNCAwMDowMAotCQkJLTQ6MDAJLQlBTVQKLQotIyBDaGlsZQotCi0jIEZyb20gRWR1YXJkbyBLcmVsbCAoMTk5NS0xMC0xOSk6Ci0jIFRoZSBsYXcgc2F5cyB0byBzd2l0Y2ggdG8gRFNUIGF0IG1pZG5pZ2h0IFsyNDowMF0gb24gdGhlIHNlY29uZCBTQVRVUkRBWQotIyBvZiBPY3RvYmVyLi4uLiAgVGhlIGxhdyBpcyB0aGUgc2FtZSBmb3IgTWFyY2ggYW5kIE9jdG9iZXIuCi0jICgxOTk4LTA5LTI5KToKLSMgQmVjYXVzZSBvZiB0aGUgZHJvdWdodCB0aGlzIHllYXIsIHRoZSBnb3Zlcm5tZW50IGRlY2lkZWQgdG8gZ28gaW50bwotIyBEU1QgZWFybGllciAoc2F0dXJkYXkgOS8yNiBhdCAyNDowMCkuIFRoaXMgaXMgYSBvbmUtdGltZSBjaGFuZ2Ugb25seSAuLi4KLSMgKHVubGVzcyB0aGVyZSdzIGFub3RoZXIgZHJ5IHNlYXNvbiBuZXh0IHllYXIsIEkgZ3Vlc3MpLgotCi0jIEZyb20gSnVsaW8gSS4gUGFjaGVjbyBUcm9uY29zbyAoMTk5OS0wMy0xOCk6Ci0jIEJlY2F1c2Ugb2YgdGhlIHNhbWUgZHJvdWdodCwgdGhlIGdvdmVybm1lbnQgZGVjaWRlZCB0byBlbmQgRFNUIGxhdGVyLAotIyBvbiBBcHJpbCAzLCAob25lLXRpbWUgY2hhbmdlKS4KLQotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA2LTEwLTA4KToKLSMgaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMDgpOgotIyBJIHRoaW5rIHRoYXQgdGhlcmUgYXJlIHNvbWUgb2J2aW91cyBtaXN0YWtlcyBpbiB0aGUgc3VnZ2VzdGVkIGxpbmsKLSMgZnJvbSBPc2NhciB2YW4gVmxpam1lbiwuLi4gZm9yIGluc3RhbmNlIGVudHJ5IDY2IHNheXMgdGhhdCBHTVQtNAotIyBlbmRlZCAxOTkwLTA5LTEyIHdoaWxlIGVudHJ5IDY3IG9ubHkgYmVnaW5zIEdNVC0zIGF0IDE5OTAtMDktMTUKLSMgKHRoZXkgc2hvdWxkIGhhdmUgYmVlbiAxOTkwLTA5LTE1IGFuZCAxOTkwLTA5LTE2IHJlc3BlY3RpdmVseSksIGJ1dAotIyBhbnlob3cgaXQgY2xlYXJzIHVwIHNvbWUgZG91YnRzIHRvby4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTEyLTI3KToKLSMgVGhlIGZvbGxvd2luZyBkYXRhIGZvciBDaGlsZSBhbmQgQW1lcmljYS9TYW50aWFnbyBhcmUgZnJvbQotIyA8aHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9ob3Jhb2YuaHRtPiAoMjAwNi0wOS0yMCksIHRyYW5zY3JpYmVkIGJ5Ci0jIEplc3BlciBOb3JnYWFyZCBXZWxlbi4gIFRoZSBkYXRhIGZvciBQYWNpZmljL0Vhc3RlciBhcmUgZnJvbSBTaGFua3MKLSMgJiBQb3R0ZW5nZXIsIGV4Y2VwdCB3aXRoIERTVCB0cmFuc2l0aW9ucyBhZnRlciAxOTMyIGNsb25lZCBmcm9tCi0jIEFtZXJpY2EvU2FudGlhZ28uICBUaGUgcHJlLTE5ODAgUGFjaWZpYy9FYXN0ZXIgZGF0YSBhcmUgZHViaW91cywKLSMgYnV0IHdlIGhhdmUgbm8gb3RoZXIgc291cmNlLgotCi0jIEZyb20gR2VybWFuIFBvby1DYWFtYW5+byAoMjAwOC0wMy0wMyk6Ci0jIER1ZSB0byBkcm91Z2h0LCBDaGlsZSBleHRlbmRzIERheWxpZ2h0IFRpbWUgaW4gdGhyZWUgd2Vla3MuICBUaGlzCi0jIGlzIG9uZS10aW1lIGNoYW5nZSAoU2F0dXJkYXkgMy8yOSBhdCAyNDowMCBmb3IgQW1lcmljYS9TYW50aWFnbwotIyBhbmQgU2F0dXJkYXkgMy8yOSBhdCAyMjowMCBmb3IgUGFjaWZpYy9FYXN0ZXIpCi0jIFRoZSBTdXByZW1lIERlY3JlZSBpcyBsb2NhdGVkIGF0IAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNob2EuY2wvc2VydmljaW9zL3N1cHJlbW8zMTYucGRmIj4KLSMgaHR0cDovL3d3dy5zaG9hLmNsL3NlcnZpY2lvcy9zdXByZW1vMzE2LnBkZgotIyA8L2E+Ci0jIGFuZCB0aGUgaW5zdHJ1Y3Rpb25zIGZvciAyMDA4IGFyZSBsb2NhdGVkIGluOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0iPgotIyBodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0KLSMgPC9hPi4KLQotIyBGcm9tIEpvc2UgTWlndWVsIEdhcnJpZG8gKDIwMDgtMDMtMDUpOgotIyAuLi4KLSMgWW91IGNvdWxkIHNlZSB0aGUgYW5ub3VuY2VzIG9mIHRoZSBjaGFuZ2Ugb24gCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2hvYS5jbC9ub3RpY2lhcy8yMDA4LzA0aG9yYS9ob3JhLmh0bSI+Ci0jIGh0dHA6Ly93d3cuc2hvYS5jbC9ub3RpY2lhcy8yMDA4LzA0aG9yYS9ob3JhLmh0bQotIyA8L2E+LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDaGlsZQkxOTI3CTE5MzIJLQlTZXAJIDEJMDowMAkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTkyOAkxOTMyCS0JQXByCSAxCTA6MDAJMAktCi1SdWxlCUNoaWxlCTE5NDIJb25seQktCUp1bgkgMQk0OjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk0Mglvbmx5CS0JQXVnCSAxCTU6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTQ2CW9ubHkJLQlKdWwJMTUJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5NDYJb25seQktCVNlcAkgMQkzOjAwdQkwOjAwCS0KLVJ1bGUJQ2hpbGUJMTk0Nwlvbmx5CS0JQXByCSAxCTQ6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTY4CW9ubHkJLQlOb3YJIDMJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5NjkJb25seQktCU1hcgkzMAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk2OQlvbmx5CS0JTm92CTIzCTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTcwCW9ubHkJLQlNYXIJMjkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5NzEJb25seQktCU1hcgkxNAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk3MAkxOTcyCS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTk3MgkxOTg2CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk3Mwlvbmx5CS0JU2VwCTMwCTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTc0CTE5ODcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTg3CW9ubHkJLQlBcHIJMTIJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5ODgJMTk4OQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5ODgJb25seQktCU9jdAlTdW4+PTEJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5ODkJb25seQktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5OTAJb25seQktCU1hcgkxOAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk5MAlvbmx5CS0JU2VwCTE2CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTkxCTE5OTYJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTkxCTE5OTcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTk3CW9ubHkJLQlNYXIJMzAJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5OTgJb25seQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5OTgJb25seQktCVNlcAkyNwk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTk5OQlvbmx5CS0JQXByCSA0CTM6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTk5CW1heAktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTIwMDAJMjAwNwktCU1hcglTdW4+PTkJMzowMHUJMAktCi0jIE4uQi46IHRoZSBlbmQgb2YgTWFyY2ggMjkgaW4gQ2hpbGUgaXMgTWFyY2ggMzAgaW4gVW5pdmVyc2FsIHRpbWUsCi0jIHdoaWNoIGlzIHVzZWQgYmVsb3cgaW4gc3BlY2lmeWluZyB0aGUgdHJhbnNpdGlvbi4KLVJ1bGUJQ2hpbGUJMjAwOAlvbmx5CS0JTWFyCTMwCTM6MDB1CTAJLQotUnVsZQlDaGlsZQkyMDA5CW1heAktCU1hcglTdW4+PTkJMzowMHUJMAktCi0jIElBVEEgU1NJTSBhbm9tYWxpZXM6ICgxOTkyLTAyKSBzYXlzIDE5OTItMDMtMTQ7Ci0jICgxOTk2LTA5KSBzYXlzIDE5OTgtMDMtMDguICBJZ25vcmUgdGhlc2UuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvU2FudGlhZ28JLTQ6NDI6NDYgLQlMTVQJMTg5MAotCQkJLTQ6NDI6NDYgLQlTTVQJMTkxMCAJICAgICMgU2FudGlhZ28gTWVhbiBUaW1lCi0JCQktNTowMAktCUNMVAkxOTE2IEp1bCAgMSAjIENoaWxlIFRpbWUKLQkJCS00OjQyOjQ2IC0JU01UCTE5MTggU2VwICAxICMgU2FudGlhZ28gTWVhbiBUaW1lCi0JCQktNDowMAktCUNMVAkxOTE5IEp1bCAgMSAjIENoaWxlIFRpbWUKLQkJCS00OjQyOjQ2IC0JU01UCTE5MjcgU2VwICAxICMgU2FudGlhZ28gTWVhbiBUaW1lCi0JCQktNTowMAlDaGlsZQlDTCVzVAkxOTQ3IE1heSAyMiAjIENoaWxlIFRpbWUKLQkJCS00OjAwCUNoaWxlCUNMJXNUCi1ab25lIFBhY2lmaWMvRWFzdGVyCS03OjE3OjQ0IC0JTE1UCTE4OTAKLQkJCS03OjE3OjI4IC0JRU1UCTE5MzIgU2VwICAgICMgRWFzdGVyIE1lYW4gVGltZQotCQkJLTc6MDAJQ2hpbGUJRUFTJXNUCTE5ODIgTWFyIDEzIDIxOjAwICMgRWFzdGVyIEkgVGltZQotCQkJLTY6MDAJQ2hpbGUJRUFTJXNUCi0jCi0jIFNhbGEgeSBHb21leiBJc2xhbmQgaXMgbGlrZSBQYWNpZmljL0Vhc3Rlci4KLSMgT3RoZXIgQ2hpbGVhbiBsb2NhdGlvbnMsIGluY2x1ZGluZyBKdWFuIEZlcm5hbmRleiBJcywgU2FuIEFtYnJvc2lvLAotIyBTYW4gRmVsaXgsIGFuZCBBbnRhcmN0aWMgYmFzZXMsIGFyZSBsaWtlIEFtZXJpY2EvU2FudGlhZ28uCi0KLSMgQ29sb21iaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUNPCTE5OTIJb25seQktCU1heQkgMwkwOjAwCTE6MDAJUwotUnVsZQlDTwkxOTkzCW9ubHkJLQlBcHIJIDQJMDowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9Cb2dvdGEJLTQ6NTY6MjAgLQlMTVQJMTg4NCBNYXIgMTMKLQkJCS00OjU2OjIwIC0JQk1UCTE5MTQgTm92IDIzICMgQm9nb3RhIE1lYW4gVGltZQotCQkJLTU6MDAJQ08JQ08lc1QJIyBDb2xvbWJpYSBUaW1lCi0jIE1hbHBlbG8sIFByb3ZpZGVuY2lhLCBTYW4gQW5kcmVzCi0jIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEFtZXJpY2EvQm9nb3RhCi0KLSMgQ3VyYWNhbwotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IFRoZSBCb3R0b20gYW5kIFBoaWxpcHNidXJnIGhhdmUgYmVlbiBhdAotIyAtNDowMCBzaW5jZSBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkIG9uIDE5MTItMDMtMDI7IGFuZCB0aGF0Ci0jIEtyYWxlbmRpamsgYW5kIFJpbmNvbiB1c2VkIEtyYWxlbmRpamsgTWVhbiBUaW1lICgtNDozMzowOCkgZnJvbQotIyAxOTEyLTAyLTAyIHRvIDE5NjUtMDEtMDEuICBUaGUgZm9ybWVyIGlzIGR1YmlvdXMsIHNpbmNlIFMmUCBhbHNvIHNheQotIyBTYWJhIElzbGFuZCBoYXMgYmVlbiBsaWtlIEN1cmFjYW8uCi0jIFRoaXMgYWxsIHByZWRhdGVzIG91ciAxOTcwIGN1dG9mZiwgdGhvdWdoLgotIwotIyBCeSBKdWx5IDIwMDcgQ3VyYWNhbyBhbmQgU3QgTWFhcnRlbiBhcmUgcGxhbm5lZCB0byBiZWNvbWUKLSMgYXNzb2NpYXRlZCBzdGF0ZXMgd2l0aGluIHRoZSBOZXRoZXJsYW5kcywgbXVjaCBsaWtlIEFydWJhOwotIyBCb25haXJlLCBTYWJhIGFuZCBTdCBFdXN0YXRpdXMgd291bGQgYmVjb21lIGRpcmVjdGx5IHBhcnQgb2YgdGhlCi0jIE5ldGhlcmxhbmRzIGFzIEtpbmdkb20gSXNsYW5kcy4gIFRoaXMgd29uJ3QgYWZmZWN0IHRoZWlyIHRpbWUgem9uZXMKLSMgdGhvdWdoLCBhcyBmYXIgYXMgd2Uga25vdy4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9DdXJhY2FvCS00OjM1OjQ0IC0JTE1UCTE5MTIgRmViIDEyCSMgV2lsbGVtc3RhZAotCQkJLTQ6MzAJLQlBTlQJMTk2NSAjIE5ldGhlcmxhbmRzIEFudGlsbGVzIFRpbWUKLQkJCS00OjAwCS0JQVNUCi0KLSMgRWN1YWRvcgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTA0KToKLSMgQXBwYXJlbnRseSBFY3VhZG9yIGhhZCBhIGZhaWxlZCBleHBlcmltZW50IHdpdGggRFNUIGluIDE5OTIuCi0jIDxodHRwOi8vbWlkZW5hLmdvdi5lYy9jb250ZW50L3ZpZXcvMTI2MS8yMDgvPiAoMjAwNy0wMi0yNykgYW5kCi0jIDxodHRwOi8vd3d3LmhveS5jb20uZWMvTm90aWNpYU51ZS5hc3A/cm93X2lkPTI0OTg1Nj4gKDIwMDYtMTEtMDYpIGJvdGgKLSMgdGFsayBhYm91dCAiaG9yYSBTaXh0byIuICBMZWF2ZSB0aGlzIGFsb25lIGZvciBub3csIGFzIHdlIGhhdmUgbm8gZGF0YS4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9HdWF5YXF1aWwJLTU6MTk6MjAgLQlMTVQJMTg5MAotCQkJLTU6MTQ6MDAgLQlRTVQJMTkzMSAjIFF1aXRvIE1lYW4gVGltZQotCQkJLTU6MDAJLQlFQ1QJICAgICAjIEVjdWFkb3IgVGltZQotWm9uZSBQYWNpZmljL0dhbGFwYWdvcwktNTo1ODoyNCAtCUxNVAkxOTMxICMgUHVlcnRvIEJhcXVlcml6byBNb3Jlbm8KLQkJCS01OjAwCS0JRUNUCTE5ODYKLQkJCS02OjAwCS0JR0FMVAkgICAgICMgR2FsYXBhZ29zIFRpbWUKLQotIyBGYWxrbGFuZHMKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQmV0d2VlbiAxOTkwIGFuZCAyMDAwIGluY2x1c2l2ZSwgU2hhbmtzICYgUG90dGVuZ2VyIGFuZCB0aGUgSUFUQSBhZ3JlZSBleGNlcHQKLSMgdGhlIElBVEEgZ2l2ZXMgMTk5Ni0wOS0wOC4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotCi0jIEZyb20gRmFsa2xhbmQgSXNsYW5kcyBHb3Zlcm5tZW50IE9mZmljZSwgTG9uZG9uICgyMDAxLTAxLTIyKQotIyB2aWEgSmVzcGVyIE5vcmdhYXJkOgotIyAuLi4gdGhlIGNsb2NrcyByZXZlcnQgYmFjayB0byBMb2NhbCBNZWFuIFRpbWUgYXQgMiBhbSBvbiBTdW5kYXkgMTUKLSMgQXByaWwgMjAwMSBhbmQgYWR2YW5jZSBvbmUgaG91ciB0byBzdW1tZXIgdGltZSBhdCAyIGFtIG9uIFN1bmRheSAyCi0jIFNlcHRlbWJlci4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgdGhlIGNsb2NrcyB3aWxsIHJldmVydCBiYWNrIGF0IDIKLSMgYW0gb24gU3VuZGF5IDIxIEFwcmlsIDIwMDIgYW5kIGFkdmFuY2UgdG8gc3VtbWVyIHRpbWUgYXQgMiBhbSBvbgotIyBTdW5kYXkgMSBTZXB0ZW1iZXIuCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0wMi0xMyk6Ci0jCi0jIEkgaGF2ZSBjb21tdW5pY2F0ZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHBlb3BsZSB0aGVyZSwgYW5kIHRoZSBsYXN0Ci0jIHRpbWUgSSBoYWQgY29tbXVuaWNhdGlvbnMgdGhhdCB3YXMgaGVscGZ1bCB3YXMgaW4gMTk5OC4gIEhlcmUgaXMKLSMgd2hhdCB3YXMgc2FpZCB0aGVuOgotIwotIyAiVGhlIGdlbmVyYWwgcnVsZSB3YXMgdGhhdCBTdGFubGV5IHVzZWQgZGF5bGlnaHQgc2F2aW5nIGFuZCB0aGUgQ2FtcAotIyBkaWQgbm90LiBIb3dldmVyIGZvciB2YXJpb3VzIHJlYXNvbnMgbWFueSBwZW9wbGUgaW4gdGhlIENhbXAgaGF2ZQotIyBzdGFydGVkIHRvIHVzZSBkYXlsaWdodCBzYXZpbmcgKGtub3duIGxvY2FsbHkgYXMgJ1N0YW5sZXkgVGltZScpCi0jIFRoZXJlIGlzIG5vIHJ1bGUgYXMgdG8gd2hvIHVzZXMgZGF5bGlnaHQgc2F2aW5nIC0gaXQgaXMgYSBtYXR0ZXIgb2YKLSMgcGVyc29uYWwgY2hvaWNlIGFuZCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRyYXcgYSBtYXAgc2hvd2luZyB3aG8KLSMgdXNlcyBpdCBhbmQgd2hvIGRvZXMgbm90LiBBbnkgbGlzdCB3b3VsZCBiZSBvdXQgb2YgZGF0ZSBhcyBzb29uIGFzCi0jIGl0IHdhcyBwcm9kdWNlZC4gVGhpcyB5ZWFyIGRheWxpZ2h0IHNhdmluZyBlbmRlZCBvbiBBcHJpbCAxOC8xOXRoCi0jIGFuZCBzdGFydGVkIGFnYWluIG9uIFNlcHRlbWJlciAxMi8xM3RoLiAgSSBkbyBub3Qga25vdyB3aGF0IHRoZSBydWxlCi0jIGlzLCBidXQgY2FuIGZpbmQgb3V0IGlmIHlvdSBsaWtlLiAgV2UgZG8gbm90IGNoYW5nZSBhdCB0aGUgc2FtZSB0aW1lCi0jIGFzIFVLIG9yIENoaWxlLiIKLSMKLSMgSSBkaWQgaGF2ZSBpbiBteSBub3RlcyB0aGF0IHRoZSBydWxlIHdhcyAiU2Vjb25kIFNhdHVyZGF5IGluIFNlcCBhdAotIyAwOjAwIHVudGlsIHRoaXJkIFNhdHVyZGF5IGluIEFwciBhdCAwOjAwIi4gIEkgdGhpbmsgdGhhdCB0aGlzIGRvZXMKLSMgbm90IGFncmVlIGluIHNvbWUgY2FzZXMgd2l0aCBTaGFua3M7IGlzIHRoaXMgdHJ1ZT8KLSMKLSMgQWxzbywgdGhlcmUgaXMgbm8gbWVudGlvbiBpbiB0aGUgbGlzdCB0aGF0IHNvbWUgYXJlYXMgaW4gdGhlCi0jIEZhbGtsYW5kcyBkbyBub3QgdXNlIERTVC4gIEkgaGF2ZSBmb3VuZCBpbiBteSBjb21tdW5pY2F0aW9ucyB0aGVyZQotIyB0aGF0IHRoZXNlIGFyZWFzIGFyZSBvbiB0aGUgd2VzdGVybiBoYWxmIG9mIEVhc3QgRmFsa2xhbmQgYW5kIGFsbCBvZgotIyBXZXN0IEZhbGtsYW5kLiAgU3RhbmxleSBpcyB0aGUgb25seSBwbGFjZSB0aGF0IGNvbnNpc3RlbnRseSBvYnNlcnZlcwotIyBEU1QuICBBZ2FpbiwgYXMgaW4gb3RoZXIgcGxhY2VzIGluIHRoZSB3b3JsZCwgdGhlIGZhcm1lcnMgZG9uJ3QgbGlrZQotIyBpdC4gIFdlc3QgRmFsa2xhbmQgaXMgYWxtb3N0IGVudGlyZWx5IHNoZWVwIGZhcm1lcnMuCi0jCi0jIEkga25vdyBvbmUgbGFkeSB0aGVyZSB0aGF0IGtlZXBzIGEgbGlzdCBvZiB3aGljaCBmYXJtIGtlZXBzIERTVCBhbmQKLSMgd2hpY2ggZG9lc24ndCBlYWNoIHllYXIuICBTaGUgcnVucyBhIHNob3AgaW4gU3RhbmxleSwgYW5kIHNheXMgdGhhdAotIyB0aGUgbGlzdCBjaGFuZ2VzIGVhY2ggeWVhci4gIFNoZSB1c2VzIGl0IHRvIGNvbW11bmljYXRlIHRvIGhlcgotIyBjdXN0b21lcnMsIGNhdGNoaW5nIHRoZW0gd2hlbiB0aGV5IGFyZSBob21lIGZvciBsdW5jaCBvciBkaW5uZXIuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wNSk6Ci0jIEZvciBub3csIHdlJ2xsIGp1c3QgcmVjb3JkIHRoZSB0aW1lIGluIFN0YW5sZXksIHNpbmNlIHdlIGhhdmUgbm8KLSMgYmV0dGVyIGluZm8uCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUZhbGsJMTkzNwkxOTM4CS0JU2VwCWxhc3RTdW4JMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTM4CTE5NDIJLQlNYXIJU3VuPj0xOQkwOjAwCTAJLQotUnVsZQlGYWxrCTE5MzkJb25seQktCU9jdAkxCTA6MDAJMTowMAlTCi1SdWxlCUZhbGsJMTk0MAkxOTQyCS0JU2VwCWxhc3RTdW4JMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTQzCW9ubHkJLQlKYW4JMQkwOjAwCTAJLQotUnVsZQlGYWxrCTE5ODMJb25seQktCVNlcAlsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCUZhbGsJMTk4NAkxOTg1CS0JQXByCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJRmFsawkxOTg0CW9ubHkJLQlTZXAJMTYJMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTg1CTIwMDAJLQlTZXAJU3VuPj05CTA6MDAJMTowMAlTCi1SdWxlCUZhbGsJMTk4NgkyMDAwCS0JQXByCVN1bj49MTYJMDowMAkwCS0KLVJ1bGUJRmFsawkyMDAxCW1heAktCUFwcglTdW4+PTE1CTI6MDAJMAktCi1SdWxlCUZhbGsJMjAwMQltYXgJLQlTZXAJU3VuPj0xCTI6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL1N0YW5sZXkJLTM6NTE6MjQgLQlMTVQJMTg5MAotCQkJLTM6NTE6MjQgLQlTTVQJMTkxMiBNYXIgMTIgICMgU3RhbmxleSBNZWFuIFRpbWUKLQkJCS00OjAwCUZhbGsJRkslc1QJMTk4MyBNYXkgICAgICMgRmFsa2xhbmQgSXMgVGltZQotCQkJLTM6MDAJRmFsawlGSyVzVAkxOTg1IFNlcCAxNQotCQkJLTQ6MDAJRmFsawlGSyVzVAotCi0jIEZyZW5jaCBHdWlhbmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9DYXllbm5lCS0zOjI5OjIwIC0JTE1UCTE5MTEgSnVsCi0JCQktNDowMAktCUdGVAkxOTY3IE9jdCAjIEZyZW5jaCBHdWlhbmEgVGltZQotCQkJLTM6MDAJLQlHRlQKLQotIyBHdXlhbmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9HdXlhbmEJLTM6NTI6NDAgLQlMTVQJMTkxNSBNYXIJIyBHZW9yZ2V0b3duCi0JCQktMzo0NQktCUdCR1QJMTk2NiBNYXkgMjYgIyBCciBHdWlhbmEgVGltZQotCQkJLTM6NDUJLQlHWVQJMTk3NSBKdWwgMzEgIyBHdXlhbmEgVGltZQotCQkJLTM6MDAJLQlHWVQJMTk5MQotIyBJQVRBIFNTSU0gKDE5OTYtMDYpIHNheXMgLTQ6MDAuICBBc3N1bWUgYSAxOTkxIHN3aXRjaC4KLQkJCS00OjAwCS0JR1lUCi0KLSMgUGFyYWd1YXkKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzcHJpbmcgdHJhbnNpdGlvbnMgYXJlIGZyb20gMDE6MDAgLT4gMDI6MDAsCi0jIGFuZCBhdXR1bW4gdHJhbnNpdGlvbnMgYXJlIGZyb20gMDA6MDAgLT4gMjM6MDAuICBHbyB3aXRoIHByZS0xOTk5Ci0jIGVkaXRpb25zIG9mIFNoYW5rcywgYW5kIHdpdGggdGhlIElBVEEsIHdobyBzYXkgdHJhbnNpdGlvbnMgb2NjdXIgYXQgMDA6MDAuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlQYXJhCTE5NzUJMTk4OAktCU9jdAkgMQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5NzUJMTk3OAktCU1hcgkgMQkwOjAwCTAJLQotUnVsZQlQYXJhCTE5NzkJMTk5MQktCUFwcgkgMQkwOjAwCTAJLQotUnVsZQlQYXJhCTE5ODkJb25seQktCU9jdAkyMgkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5OTAJb25seQktCU9jdAkgMQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5OTEJb25seQktCU9jdAkgNgkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5OTIJb25seQktCU1hcgkgMQkwOjAwCTAJLQotUnVsZQlQYXJhCTE5OTIJb25seQktCU9jdAkgNQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5OTMJb25seQktCU1hcgkzMQkwOjAwCTAJLQotUnVsZQlQYXJhCTE5OTMJMTk5NQktCU9jdAkgMQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTE5OTQJMTk5NQktCUZlYglsYXN0U3VuCTA6MDAJMAktCi1SdWxlCVBhcmEJMTk5Nglvbmx5CS0JTWFyCSAxCTA6MDAJMAktCi0jIElBVEEgU1NJTSAoMjAwMC0wMikgc2F5cyAxOTk5LTEwLTEwOyBpZ25vcmUgdGhpcyBmb3Igbm93LgotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0xMC0wMik6Ci0jIEkgaGF2ZSB0aHJlZSBpbmRlcGVuZGVudCByZXBvcnRzIHRoYXQgUGFyYWd1YXkgY2hhbmdlZCB0byBEU1QgdGhpcyBTdW5kYXkKLSMgKDEwLTAxKS4KLSMKLSMgVHJhbnNsYXRlZCBieSBHd2lsbGltIExhdyAoMjAwMS0wMi0yNykgZnJvbQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRpYXJpb25vdGljaWFzLmNvbS5weS8wMTEwMDAvbmFjaW9uYWwvbmFjaW9uYTEuaHRtIj4KLSMgTm90aWNpYXMsIGEgZGFpbHkgcGFwZXIgaW4gQXN1bmNpb24sIFBhcmFndWF5ICgyMDAwLTEwLTAxKQotIyA8L2E+OgotIyBTdGFydGluZyBhdCAwOjAwIHRvZGF5LCB0aGUgY2xvY2sgd2lsbCBiZSBzZXQgZm9yd2FyZCA2MCBtaW51dGVzLCBpbgotIyBmdWxmaWxsbWVudCBvZiBEZWNyZWUgTm8uIDcsMjczIG9mIHRoZSBFeGVjdXRpdmUgUG93ZXIuLi4uICBUaGUgdGltZSBjaGFuZ2UKLSMgc3lzdGVtIGhhcyBiZWVuIG9wZXJhdGluZyBmb3Igc2V2ZXJhbCB5ZWFycy4gIEZvcm1lcmx5IHRoZXJlIHdhcyBhIHNlcGFyYXRlCi0jIGRlY3JlZSBlYWNoIHllYXI7IHRoZSBuZXcgbGF3IGhhcyB0aGUgc2FtZSBlZmZlY3QsIGJ1dCBwZXJtYW5lbnRseS4gIEV2ZXJ5Ci0jIHllYXIsIHRoZSB0aW1lIHdpbGwgY2hhbmdlIG9uIHRoZSBmaXJzdCBTdW5kYXkgb2YgT2N0b2JlcjsgbGlrZXdpc2UsIHRoZQotIyBjbG9jayB3aWxsIGJlIHNldCBiYWNrIG9uIHRoZSBmaXJzdCBTdW5kYXkgb2YgTWFyY2guCi0jCi1SdWxlCVBhcmEJMTk5NgkyMDAxCS0JT2N0CVN1bj49MQkwOjAwCTE6MDAJUwotIyBJQVRBIFNTSU0gKDE5OTctMDkpIHNheXMgTWFyIDE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQYXJhCTE5OTcJb25seQktCUZlYglsYXN0U3VuCTA6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTk5OS0wMi0yODsgSUFUQSBTU0lNICgxOTk5LTAyKSBzYXlzIDE5OTktMDItMjcsIGJ1dAotIyAoMTk5OS0wOSkgcmVwb3J0cyBubyBkYXRlOyBnbyB3aXRoIGFib3ZlIHNvdXJjZXMgYW5kIEdlcmQgS25vcHMgKDIwMDEtMDItMjcpLgotUnVsZQlQYXJhCTE5OTgJMjAwMQktCU1hcglTdW4+PTEJMDowMAkwCS0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMi0wMi0yOCk6Ci0jIEEgZGVjcmVlIHdhcyBpc3N1ZWQgaW4gUGFyYWd1YXkgKG5vLiAxNjM1MCkgb24gMjAwMi0wMi0yNiB0aGF0IGNoYW5nZWQgdGhlCi0jIGRzdCBtZXRob2QgdG8gYmUgZnJvbSB0aGUgZmlyc3QgU3VuZGF5IGluIFNlcHRlbWJlciB0byB0aGUgZmlyc3QgU3VuZGF5IGluCi0jIEFwcmlsLgotUnVsZQlQYXJhCTIwMDIJMjAwNAktCUFwcglTdW4+PTEJMDowMAkwCS0KLVJ1bGUJUGFyYQkyMDAyCTIwMDMJLQlTZXAJU3VuPj0xCTA6MDAJMTowMAlTCi0jCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTAxLTAyKToKLSMgVGhlcmUgYXJlIHNldmVyYWwgc291cmNlcyB0aGF0IGNsYWltIHRoYXQgUGFyYWd1YXkgbWFkZQotIyBhIHRpbWV6b25lIHJ1bGUgY2hhbmdlIGluIGF1dHVtbiAyMDA0LgotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0wMS0wNSk6Ci0jIERlY3JlZSAxLDg2NyAoMjAwNC0wMy0wNSkKLSMgRnJvbSBDYXJsb3MgUmF1bCBQZXJhc3NvIHZpYSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMTMpCi0jIDxodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS9kZWNyZXRvcy9EMTg2Ny5wZGY+Ci1SdWxlCVBhcmEJMjAwNAltYXgJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTIwMDUJbWF4CS0JTWFyCVN1bj49OAkwOjAwCTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvQXN1bmNpb24JLTM6NTA6NDAgLQlMTVQJMTg5MAotCQkJLTM6NTA6NDAgLQlBTVQJMTkzMSBPY3QgMTAgIyBBc3VuY2lvbiBNZWFuIFRpbWUKLQkJCS00OjAwCS0JUFlUCTE5NzIgT2N0ICMgUGFyYWd1YXkgVGltZQotCQkJLTM6MDAJLQlQWVQJMTk3NCBBcHIKLQkJCS00OjAwCVBhcmEJUFklc1QKLQotIyBQZXJ1Ci0jCi0jIDxhIGhyZWY9Im5ld3M6eHJHbWIuMzk5MzUkZ0ExLjEzODk2MTEzQG5ld3M0LnNydi5oY3ZsbnkuY3YubmV0Ij4KLSMgRnJvbSBFdmVseW4gQy4gTGVlcGVyIHZpYSBNYXJrIEJyYWRlciAoMjAwMy0xMC0yNik6PC9hPgotIyBXaGVuIHdlIHdlcmUgaW4gUGVydSBpbiAxOTg1LTE5ODYsIHRoZXkgYXBwYXJlbnRseSBzd2l0Y2hlZCBvdmVyCi0jIHNvbWV0aW1lIGJldHdlZW4gRGVjZW1iZXIgMjkgYW5kIEphbnVhcnkgMyB3aGlsZSB3ZSB3ZXJlIG9uIHRoZSBBbWF6b24uCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZG9uJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24uICBBc3N1bWUgMTk4NiB3YXMgbGlrZSAxOTg3LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlQZXJ1CTE5MzgJb25seQktCUphbgkgMQkwOjAwCTE6MDAJUwotUnVsZQlQZXJ1CTE5MzgJb25seQktCUFwcgkgMQkwOjAwCTAJLQotUnVsZQlQZXJ1CTE5MzgJMTkzOQktCVNlcAlsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCVBlcnUJMTkzOQkxOTQwCS0JTWFyCVN1bj49MjQJMDowMAkwCS0KLVJ1bGUJUGVydQkxOTg2CTE5ODcJLQlKYW4JIDEJMDowMAkxOjAwCVMKLVJ1bGUJUGVydQkxOTg2CTE5ODcJLQlBcHIJIDEJMDowMAkwCS0KLVJ1bGUJUGVydQkxOTkwCW9ubHkJLQlKYW4JIDEJMDowMAkxOjAwCVMKLVJ1bGUJUGVydQkxOTkwCW9ubHkJLQlBcHIJIDEJMDowMAkwCS0KLSMgSUFUQSBpcyBhbWJpZ3VvdXMgZm9yIDE5OTMvMTk5NTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBlcnUJMTk5NAlvbmx5CS0JSmFuCSAxCTA6MDAJMTowMAlTCi1SdWxlCVBlcnUJMTk5NAlvbmx5CS0JQXByCSAxCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvTGltYQktNTowODoxMiAtCUxNVAkxODkwCi0JCQktNTowODozNiAtCUxNVAkxOTA4IEp1bCAyOCAjIExpbWEgTWVhbiBUaW1lPwotCQkJLTU6MDAJUGVydQlQRSVzVAkjIFBlcnUgVGltZQotCi0jIFNvdXRoIEdlb3JnaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvU291dGhfR2VvcmdpYSAtMjoyNjowOCAtCUxNVAkxODkwCQkjIEdyeXR2aWtlbgotCQkJLTI6MDAJLQlHU1QJIyBTb3V0aCBHZW9yZ2lhIFRpbWUKLQotIyBTb3V0aCBTYW5kd2ljaCBJcwotIyB1bmluaGFiaXRlZDsgc2NpZW50aWZpYyBwZXJzb25uZWwgaGF2ZSB3aW50ZXJlZAotCi0jIFN1cmluYW1lCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvUGFyYW1hcmlibwktMzo0MDo0MCAtCUxNVAkxOTExCi0JCQktMzo0MDo1MiAtCVBNVAkxOTM1ICAgICAjIFBhcmFtYXJpYm8gTWVhbiBUaW1lCi0JCQktMzo0MDozNiAtCVBNVAkxOTQ1IE9jdCAjIFRoZSBjYXBpdGFsIG1vdmVkPwotCQkJLTM6MzAJLQlORUdUCTE5NzUgTm92IDIwICMgRHV0Y2ggR3VpYW5hIFRpbWUKLQkJCS0zOjMwCS0JU1JUCTE5ODQgT2N0ICMgU3VyaW5hbWUgVGltZQotCQkJLTM6MDAJLQlTUlQKLQotIyBUcmluaWRhZCBhbmQgVG9iYWdvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvUG9ydF9vZl9TcGFpbiAtNDowNjowNCAtCUxNVAkxOTEyIE1hciAyCi0JCQktNDowMAktCUFTVAotCi0jIFVydWd1YXkKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5My0xMS0xOCk6Ci0jIFVydWd1YXkgd2lucyB0aGUgcHJpemUgZm9yIHRoZSBzdHJhbmdlc3QgcGVhY2V0aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGUgcnVsZXMuCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBnaXZlcyAxOTIzIE9jdCAxOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJVXJ1Z3VheQkxOTIzCW9ubHkJLQlPY3QJIDIJIDA6MDAJMDozMAlIUwotUnVsZQlVcnVndWF5CTE5MjQJMTkyNgktCUFwcgkgMQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTI0CTE5MjUJLQlPY3QJIDEJIDA6MDAJMDozMAlIUwotUnVsZQlVcnVndWF5CTE5MzMJMTkzNQktCU9jdAlsYXN0U3VuCSAwOjAwCTA6MzAJSFMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMTkzNSBBcHIgMSAwOjAwICYgMTkzNiBNYXIgMzAgMDowMDsgZ28gd2l0aCBXaGl0bWFuLgotUnVsZQlVcnVndWF5CTE5MzQJMTkzNgktCU1hcglTYXQ+PTI1CTIzOjMwcwkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTM2CW9ubHkJLQlOb3YJIDEJIDA6MDAJMDozMAlIUwotUnVsZQlVcnVndWF5CTE5MzcJMTk0MQktCU1hcglsYXN0U3VuCSAwOjAwCTAJLQotIyBXaGl0bWFuIGdpdmVzIDE5MzcgT2N0IDM7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlVcnVndWF5CTE5MzcJMTk0MAktCU9jdAlsYXN0U3VuCSAwOjAwCTA6MzAJSFMKLSMgV2hpdG1hbiBnaXZlcyAxOTQxIE9jdCAyNCAtIDE5NDIgTWFyIDI3LCAxOTQyIERlYyAxNCAtIDE5NDMgQXByIDEzLAotIyBhbmQgMTk0MyBBcHIgMTMgYGB0byBwcmVzZW50IHRpbWUnJzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVVydWd1YXkJMTk0MQlvbmx5CS0JQXVnCSAxCSAwOjAwCTA6MzAJSFMKLVJ1bGUJVXJ1Z3VheQkxOTQyCW9ubHkJLQlKYW4JIDEJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk0Mglvbmx5CS0JRGVjCTE0CSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5NDMJb25seQktCU1hcgkxNAkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTU5CW9ubHkJLQlNYXkJMjQJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk1OQlvbmx5CS0JTm92CTE1CSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NjAJb25seQktCUphbgkxNwkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTYwCW9ubHkJLQlNYXIJIDYJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk2NQkxOTY3CS0JQXByCVN1bj49MQkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTY1CW9ubHkJLQlTZXAJMjYJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk2NgkxOTY3CS0JT2N0CTMxCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NjgJMTk3MAktCU1heQkyNwkgMDowMAkwOjMwCUhTCi1SdWxlCVVydWd1YXkJMTk2OAkxOTcwCS0JRGVjCSAyCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NzIJb25seQktCUFwcgkyNAkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTcyCW9ubHkJLQlBdWcJMTUJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk3NAlvbmx5CS0JTWFyCTEwCSAwOjAwCTA6MzAJSFMKLVJ1bGUJVXJ1Z3VheQkxOTc0CW9ubHkJLQlEZWMJMjIJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk3Nglvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NzcJb25seQktCURlYwkgNAkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTc4CW9ubHkJLQlBcHIJIDEJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk3OQlvbmx5CS0JT2N0CSAxCSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5ODAJb25seQktCU1heQkgMQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTg3CW9ubHkJLQlEZWMJMTQJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk4OAlvbmx5CS0JTWFyCTE0CSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5ODgJb25seQktCURlYwkxMQkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTg5CW9ubHkJLQlNYXIJMTIJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk4OQlvbmx5CS0JT2N0CTI5CSAwOjAwCTE6MDAJUwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IG5vIERTVCB3YXMgb2JzZXJ2ZWQgaW4gMTk5MC8xIGFuZCAxOTkxLzIsCi0jIGFuZCB0aGF0IDE5OTIvMydzIERTVCB3YXMgZnJvbSAxMC0yNSB0byAwMy0wMS4gIEdvIHdpdGggSUFUQS4KLVJ1bGUJVXJ1Z3VheQkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5OTAJMTk5MQktCU9jdAlTdW4+PTIxCSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5OTIJb25seQktCU9jdAkxOAkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTkzCW9ubHkJLQlGZWIJMjgJIDA6MDAJMAktCi0jIEZyb20gRWR1YXJkbyBDb3RhICgyMDA0LTA5LTIwKToKLSMgVGhlIHVydWd1YXlhbiBnb3Zlcm5tZW50IGhhcyBkZWNyZWVkIGEgY2hhbmdlIGluIHRoZSBsb2NhbCB0aW1lLi4uLgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9kZWNyZXRvcy8yMDA0MDkxNTAyLmh0bQotUnVsZQlVcnVndWF5CTIwMDQJb25seQktCVNlcAkxOQkgMDowMAkxOjAwCVMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMDMtMTEpOgotIyBVcnVndWF5J3MgRFNUIHdhcyBzY2hlZHVsZWQgdG8gZW5kIG9uIFN1bmRheSwgMjAwNS0wMy0xMywgYnV0IGluIG9yZGVyIHRvCi0jIHNhdmUgZW5lcmd5IC4uLiBpdCB3YXMgcG9zdHBvbmVkIHR3byB3ZWVrcy4uLi4KLSMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5ndWIudXkvX1dlYi9ub3RpY2lhcy8yMDA1LzAzLzIwMDUwMzEwMDUuaHRtCi1SdWxlCVVydWd1YXkJMjAwNQlvbmx5CS0JTWFyCTI3CSAyOjAwCTAJLQotIyBGcm9tIEVkdWFyZG8gQ290YSAoMjAwNS0wOS0yNyk6Ci0jIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L19XZWIvZGVjcmV0b3MvMjAwNS8wOS9DTSUyMDExOV8wOSUyMDA5JTIwMjAwNV8wMDAwMS5QREYKLSMgVGhpcyBtZWFucyB0aGF0IGZyb20gMjAwNS0xMC0wOSBhdCAwMjowMCBsb2NhbCB0aW1lLCB1bnRpbCAyMDA2LTAzLTEyIGF0Ci0jIDAyOjAwIGxvY2FsIHRpbWUsIG9mZmljaWFsIHRpbWUgaW4gVXJ1Z3VheSB3aWxsIGJlIGF0IEdNVCAtMi4KLVJ1bGUJVXJ1Z3VheQkyMDA1CW9ubHkJLQlPY3QJIDkJIDI6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMjAwNglvbmx5CS0JTWFyCTEyCSAyOjAwCTAJLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wOS0wNik6Ci0jIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L193ZWIvZGVjcmV0b3MvMjAwNi8wOS9DTSUyMDIxMF8wOCUyMDA2JTIwMjAwNl8wMDAwMS5QREYKLVJ1bGUJVXJ1Z3VheQkyMDA2CW1heAktCU9jdAlTdW4+PTEJIDI6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMjAwNwltYXgJLQlNYXIJU3VuPj04CSAyOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01vbnRldmlkZW8JLTM6NDQ6NDQgLQlMTVQJMTg5OCBKdW4gMjgKLQkJCS0zOjQ0OjQ0IC0JTU1UCTE5MjAgTWF5ICAxCSMgTW9udGV2aWRlbyBNVAotCQkJLTM6MzAJVXJ1Z3VheQlVWSVzVAkxOTQyIERlYyAxNAkjIFVydWd1YXkgVGltZQotCQkJLTM6MDAJVXJ1Z3VheQlVWSVzVAotCi0jIFZlbmV6dWVsYQotIwotIyBGcm9tIEpvaG4gU3RhaW5mb3J0aCAoMjAwNy0xMS0yOCk6Ci0jIC4uLiB0aGUgY2hhbmdlIGZvciBWZW5lenVlbGEgb3JpZ2luYWxseSBleHBlY3RlZCBmb3IgMjAwNy0xMi0zMSBoYXMKLSMgYmVlbiBicm91Z2h0IGZvcndhcmQgdG8gMjAwNy0xMi0wOS4gIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgd2FzCi0jIHB1Ymxpc2hlZCB0b2RheSBpbiB0aGUgIkdhY2V0YSBPZmljaWFsIGRlIGxhIFJlcHVibGljYSBCb2xpdmFyaWFuYQotIyBkZSBWZW5lenVlbGEsIG51bWVybyAzOC44MTkiIChvZmZpY2lhbCBkb2N1bWVudCBmb3IgYWxsIGxhd3Mgb3IKLSMgcmVzb2x1dGlvbiBwdWJsaWNhdGlvbikKLSMgaHR0cDovL3d3dy5nbG9ib3Zpc2lvbi5jb20vbmV3cy5waHA/bmlkPTcyMjA4Ci0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9DYXJhY2FzCS00OjI3OjQ0IC0JTE1UCTE4OTAKLQkJCS00OjI3OjQwIC0JQ01UCTE5MTIgRmViIDEyICMgQ2FyYWNhcyBNZWFuIFRpbWU/Ci0JCQktNDozMAktCVZFVAkxOTY1CSAgICAgIyBWZW5lenVlbGEgVGltZQotCQkJLTQ6MDAJLQlWRVQJMjAwNyBEZWMgIDkgMDM6MDAKLQkJCS00OjMwCS0JVkVUCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9zeXN0ZW12IGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvc3lzdGVtdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmOTY0NS4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDA4aC9zeXN0ZW12CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBAKCMpc3lzdGVtdgk4LjEKLQotIyBPbGQgcnVsZXMsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KLSMgTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGhhbmRsZSBOZXdmb3VuZGxhbmQsIHNpbmNlIGl0IGNhbm5vdCBiZSBleHByZXNzZWQKLSMgdXNpbmcgdGhlIFN5c3RlbSBWICJUWiIgc2NoZW1lIChoYWxmLWhvdXIgb2Zmc2V0KSwgb3IgYW55dGhpbmcgb3V0c2lkZQotIyBOb3J0aCBBbWVyaWNhIChubyBzdXBwb3J0IGZvciBub24tc3RhbmRhcmQgRFNUIHN0YXJ0L2VuZCBkYXRlcyksIG5vcgotIyB0aGUgY2hhbmdlcyBpbiB0aGUgRFNUIHJ1bGVzIGluIHRoZSBVUyBhZnRlciAxOTc2ICh3aGljaCBvY2N1cnJlZCBhZnRlcgotIyB0aGUgb2xkIHJ1bGVzIHdlcmUgd3JpdHRlbikuCi0jCi0jIElmIHlvdSBuZWVkIHRoZSBvbGQgcnVsZXMsIHVuY29tbWVudCAjIyBsaW5lcy4KLSMgQ29tcGlsZSB0aGlzICp3aXRob3V0KiBsZWFwIHNlY29uZCBjb3JyZWN0aW9uIGZvciB0cnVlIGNvbmZvcm1hbmNlLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlTeXN0ZW1WCW1pbgkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3lzdGVtVgltaW4JMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN5c3RlbVYJMTk3NAlvbmx5CS0JSmFuCTYJMjowMAkxOjAwCUQKLVJ1bGUJU3lzdGVtVgkxOTc0CW9ubHkJLQlOb3YJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlTeXN0ZW1WCTE5NzUJb25seQktCUZlYgkyMwkyOjAwCTE6MDAJRAotUnVsZQlTeXN0ZW1WCTE5NzUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN5c3RlbVYJMTk3NgltYXgJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlTeXN0ZW1WCTE5NzYJbWF4CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCi0jIyBab25lCVN5c3RlbVYvQVNUNEFEVAktNDowMAlTeXN0ZW1WCQlBJXNUCi0jIyBab25lCVN5c3RlbVYvRVNUNUVEVAktNTowMAlTeXN0ZW1WCQlFJXNUCi0jIyBab25lCVN5c3RlbVYvQ1NUNkNEVAktNjowMAlTeXN0ZW1WCQlDJXNUCi0jIyBab25lCVN5c3RlbVYvTVNUN01EVAktNzowMAlTeXN0ZW1WCQlNJXNUCi0jIyBab25lCVN5c3RlbVYvUFNUOFBEVAktODowMAlTeXN0ZW1WCQlQJXNUCi0jIyBab25lCVN5c3RlbVYvWVNUOVlEVAktOTowMAlTeXN0ZW1WCQlZJXNUCi0jIyBab25lCVN5c3RlbVYvQVNUNAktNDowMAktCQlBU1QKLSMjIFpvbmUJU3lzdGVtVi9FU1Q1CS01OjAwCS0JCUVTVAotIyMgWm9uZQlTeXN0ZW1WL0NTVDYJLTY6MDAJLQkJQ1NUCi0jIyBab25lCVN5c3RlbVYvTVNUNwktNzowMAktCQlNU1QKLSMjIFpvbmUJU3lzdGVtVi9QU1Q4CS04OjAwCS0JCVBTVAotIyMgWm9uZQlTeXN0ZW1WL1lTVDkJLTk6MDAJLQkJWVNUCi0jIyBab25lCVN5c3RlbVYvSFNUMTAJLTEwOjAwCS0JCUhTVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvem9uZS50YWIgYi90b29scy96b25laW5mby90emRhdGEyMDA4aC96b25lLnRhYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5Yzc2Yi4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDA4aC96b25lLnRhYgorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0jIEAoIyl6b25lLnRhYgk4LjE5Ci0jCi0jIFRaIHpvbmUgZGVzY3JpcHRpb25zCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDgtMDUpOgotIwotIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29sdW1uczoKLSMgMS4gIElTTyAzMTY2IDItY2hhcmFjdGVyIGNvdW50cnkgY29kZS4gIFNlZSB0aGUgZmlsZSBgaXNvMzE2Ni50YWInLgotIyAyLiAgTGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBvZiB0aGUgem9uZSdzIHByaW5jaXBhbCBsb2NhdGlvbgotIyAgICAgaW4gSVNPIDY3MDkgc2lnbi1kZWdyZWVzLW1pbnV0ZXMtc2Vjb25kcyBmb3JtYXQsCi0jICAgICBlaXRoZXIgKy1ERE1NKy1ERERNTSBvciArLURETU1TUystRERETU1TUywKLSMgICAgIGZpcnN0IGxhdGl0dWRlICgrIGlzIG5vcnRoKSwgdGhlbiBsb25naXR1ZGUgKCsgaXMgZWFzdCkuCi0jIDMuICBab25lIG5hbWUgdXNlZCBpbiB2YWx1ZSBvZiBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSMgNC4gIENvbW1lbnRzOyBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBjb3VudHJ5IGhhcyBtdWx0aXBsZSByb3dzLgotIwotIyBDb2x1bW5zIGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgdGFiLgotIyBUaGUgdGFibGUgaXMgc29ydGVkIGZpcnN0IGJ5IGNvdW50cnksIHRoZW4gYW4gb3JkZXIgd2l0aGluIHRoZSBjb3VudHJ5IHRoYXQKLSMgKDEpIG1ha2VzIHNvbWUgZ2VvZ3JhcGhpY2FsIHNlbnNlLCBhbmQKLSMgKDIpIHB1dHMgdGhlIG1vc3QgcG9wdWxvdXMgem9uZXMgZmlyc3QsIHdoZXJlIHRoYXQgZG9lcyBub3QgY29udHJhZGljdCAoMSkuCi0jCi0jIExpbmVzIGJlZ2lubmluZyB3aXRoIGAjJyBhcmUgY29tbWVudHMuCi0jCi0jY291bnRyeS0KLSNjb2RlCWNvb3JkaW5hdGVzCVRaCQkJY29tbWVudHMKLUFECSs0MjMwKzAwMTMxCUV1cm9wZS9BbmRvcnJhCi1BRQkrMjUxOCswNTUxOAlBc2lhL0R1YmFpCi1BRgkrMzQzMSswNjkxMglBc2lhL0thYnVsCi1BRwkrMTcwMy0wNjE0OAlBbWVyaWNhL0FudGlndWEKLUFJCSsxODEyLTA2MzA0CUFtZXJpY2EvQW5ndWlsbGEKLUFMCSs0MTIwKzAxOTUwCUV1cm9wZS9UaXJhbmUKLUFNCSs0MDExKzA0NDMwCUFzaWEvWWVyZXZhbgotQU4JKzEyMTEtMDY5MDAJQW1lcmljYS9DdXJhY2FvCi1BTwktMDg0OCswMTMxNAlBZnJpY2EvTHVhbmRhCi1BUQktNzc1MCsxNjYzNglBbnRhcmN0aWNhL01jTXVyZG8JTWNNdXJkbyBTdGF0aW9uLCBSb3NzIElzbGFuZAotQVEJLTkwMDArMDAwMDAJQW50YXJjdGljYS9Tb3V0aF9Qb2xlCUFtdW5kc2VuLVNjb3R0IFN0YXRpb24sIFNvdXRoIFBvbGUKLUFRCS02NzM0LTA2ODA4CUFudGFyY3RpY2EvUm90aGVyYQlSb3RoZXJhIFN0YXRpb24sIEFkZWxhaWRlIElzbGFuZAotQVEJLTY0NDgtMDY0MDYJQW50YXJjdGljYS9QYWxtZXIJUGFsbWVyIFN0YXRpb24sIEFudmVycyBJc2xhbmQKLUFRCS02NzM2KzA2MjUzCUFudGFyY3RpY2EvTWF3c29uCU1hd3NvbiBTdGF0aW9uLCBIb2xtZSBCYXkKLUFRCS02ODM1KzA3NzU4CUFudGFyY3RpY2EvRGF2aXMJRGF2aXMgU3RhdGlvbiwgVmVzdGZvbGQgSGlsbHMKLUFRCS02NjE3KzExMDMxCUFudGFyY3RpY2EvQ2FzZXkJQ2FzZXkgU3RhdGlvbiwgQmFpbGV5IFBlbmluc3VsYQotQVEJLTc4MjQrMTA2NTQJQW50YXJjdGljYS9Wb3N0b2sJVm9zdG9rIFN0YXRpb24sIFMgTWFnbmV0aWMgUG9sZQotQVEJLTY2NDArMTQwMDEJQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZQlEdW1vbnQtZCdVcnZpbGxlIFN0YXRpb24sIFRlcnJlIEFkZWxpZQotQVEJLTY5MDAyMiswMzkzNTI0CUFudGFyY3RpY2EvU3lvd2EJU3lvd2EgU3RhdGlvbiwgRSBPbmd1bCBJCi1BUgktMzQzNi0wNTgyNwlBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMJQnVlbm9zIEFpcmVzIChCQSwgQ0YpCi1BUgktMzEyNC0wNjQxMQlBbWVyaWNhL0FyZ2VudGluYS9Db3Jkb2JhCW1vc3QgbG9jYXRpb25zIChDQiwgQ0MsIENOLCBFUiwgRk0sIExQLCBNTiwgTlEsIFJOLCBTQSwgU0UsIFNGKQotQVIJLTMzMTktMDY2MjEJQW1lcmljYS9BcmdlbnRpbmEvU2FuX0x1aXMJU2FuIEx1aXMgKFNMKQotQVIJLTI0MTEtMDY1MTgJQW1lcmljYS9BcmdlbnRpbmEvSnVqdXkJSnVqdXkgKEpZKQotQVIJLTI2NDktMDY1MTMJQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hbglUdWN1bWFuIChUTSkKLUFSCS0yODI4LTA2NTQ3CUFtZXJpY2EvQXJnZW50aW5hL0NhdGFtYXJjYQlDYXRhbWFyY2EgKENUKSwgQ2h1YnV0IChDSCkKLUFSCS0yOTI2LTA2NjUxCUFtZXJpY2EvQXJnZW50aW5hL0xhX1Jpb2phCUxhIFJpb2phIChMUikKLUFSCS0zMTMyLTA2ODMxCUFtZXJpY2EvQXJnZW50aW5hL1Nhbl9KdWFuCVNhbiBKdWFuIChTSikKLUFSCS0zMjUzLTA2ODQ5CUFtZXJpY2EvQXJnZW50aW5hL01lbmRvemEJTWVuZG96YSAoTVopCi1BUgktNTEzOC0wNjkxMwlBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MJU2FudGEgQ3J1eiAoU0MpCi1BUgktNTQ0OC0wNjgxOAlBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhCVRpZXJyYSBkZWwgRnVlZ28gKFRGKQotQVMJLTE0MTYtMTcwNDIJUGFjaWZpYy9QYWdvX1BhZ28KLUFUCSs0ODEzKzAxNjIwCUV1cm9wZS9WaWVubmEKLUFVCS0zMTMzKzE1OTA1CUF1c3RyYWxpYS9Mb3JkX0hvd2UJTG9yZCBIb3dlIElzbGFuZAotQVUJLTQyNTMrMTQ3MTkJQXVzdHJhbGlhL0hvYmFydAlUYXNtYW5pYSAtIG1vc3QgbG9jYXRpb25zCi1BVQktMzk1NisxNDM1MglBdXN0cmFsaWEvQ3VycmllCVRhc21hbmlhIC0gS2luZyBJc2xhbmQKLUFVCS0zNzQ5KzE0NDU4CUF1c3RyYWxpYS9NZWxib3VybmUJVmljdG9yaWEKLUFVCS0zMzUyKzE1MTEzCUF1c3RyYWxpYS9TeWRuZXkJTmV3IFNvdXRoIFdhbGVzIC0gbW9zdCBsb2NhdGlvbnMKLUFVCS0zMTU3KzE0MTI3CUF1c3RyYWxpYS9Ccm9rZW5fSGlsbAlOZXcgU291dGggV2FsZXMgLSBZYW5jb3dpbm5hCi1BVQktMjcyOCsxNTMwMglBdXN0cmFsaWEvQnJpc2JhbmUJUXVlZW5zbGFuZCAtIG1vc3QgbG9jYXRpb25zCi1BVQktMjAxNisxNDkwMAlBdXN0cmFsaWEvTGluZGVtYW4JUXVlZW5zbGFuZCAtIEhvbGlkYXkgSXNsYW5kcwotQVUJLTM0NTUrMTM4MzUJQXVzdHJhbGlhL0FkZWxhaWRlCVNvdXRoIEF1c3RyYWxpYQotQVUJLTEyMjgrMTMwNTAJQXVzdHJhbGlhL0RhcndpbglOb3J0aGVybiBUZXJyaXRvcnkKLUFVCS0zMTU3KzExNTUxCUF1c3RyYWxpYS9QZXJ0aAlXZXN0ZXJuIEF1c3RyYWxpYSAtIG1vc3QgbG9jYXRpb25zCi1BVQktMzE0MysxMjg1MglBdXN0cmFsaWEvRXVjbGEJV2VzdGVybiBBdXN0cmFsaWEgLSBFdWNsYSBhcmVhCi1BVwkrMTIzMC0wNjk1OAlBbWVyaWNhL0FydWJhCi1BWAkrNjAwNiswMTk1NwlFdXJvcGUvTWFyaWVoYW1uCi1BWgkrNDAyMyswNDk1MQlBc2lhL0Jha3UKLUJBCSs0MzUyKzAxODI1CUV1cm9wZS9TYXJhamV2bwotQkIJKzEzMDYtMDU5MzcJQW1lcmljYS9CYXJiYWRvcwotQkQJKzIzNDMrMDkwMjUJQXNpYS9EaGFrYQotQkUJKzUwNTArMDA0MjAJRXVyb3BlL0JydXNzZWxzCi1CRgkrMTIyMi0wMDEzMQlBZnJpY2EvT3VhZ2Fkb3Vnb3UKLUJHCSs0MjQxKzAyMzE5CUV1cm9wZS9Tb2ZpYQotQkgJKzI2MjMrMDUwMzUJQXNpYS9CYWhyYWluCi1CSQktMDMyMyswMjkyMglBZnJpY2EvQnVqdW1idXJhCi1CSgkrMDYyOSswMDIzNwlBZnJpY2EvUG9ydG8tTm92bwotQkwJKzE3NTMtMDYyNTEJQW1lcmljYS9TdF9CYXJ0aGVsZW15Ci1CTQkrMzIxNy0wNjQ0NglBdGxhbnRpYy9CZXJtdWRhCi1CTgkrMDQ1NisxMTQ1NQlBc2lhL0JydW5laQotQk8JLTE2MzAtMDY4MDkJQW1lcmljYS9MYV9QYXoKLUJSCS0wMzUxLTAzMjI1CUFtZXJpY2EvTm9yb25oYQlBdGxhbnRpYyBpc2xhbmRzCi1CUgktMDEyNy0wNDgyOQlBbWVyaWNhL0JlbGVtCUFtYXBhLCBFIFBhcmEKLUJSCS0wMzQzLTAzODMwCUFtZXJpY2EvRm9ydGFsZXphCU5FIEJyYXppbCAoTUEsIFBJLCBDRSwgUk4sIFBCKQotQlIJLTA4MDMtMDM0NTQJQW1lcmljYS9SZWNpZmUJUGVybmFtYnVjbwotQlIJLTA3MTItMDQ4MTIJQW1lcmljYS9BcmFndWFpbmEJVG9jYW50aW5zCi1CUgktMDk0MC0wMzU0MwlBbWVyaWNhL01hY2VpbwlBbGFnb2FzLCBTZXJnaXBlCi1CUgktMTI1OS0wMzgzMQlBbWVyaWNhL0JhaGlhCUJhaGlhCi1CUgktMjMzMi0wNDYzNwlBbWVyaWNhL1Nhb19QYXVsbwlTICYgU0UgQnJhemlsIChHTywgREYsIE1HLCBFUywgUkosIFNQLCBQUiwgU0MsIFJTKQotQlIJLTIwMjctMDU0MzcJQW1lcmljYS9DYW1wb19HcmFuZGUJTWF0byBHcm9zc28gZG8gU3VsCi1CUgktMTUzNS0wNTYwNQlBbWVyaWNhL0N1aWFiYQlNYXRvIEdyb3NzbwotQlIJLTAyMjYtMDU0NTIJQW1lcmljYS9TYW50YXJlbQlXIFBhcmEKLUJSCS0wODQ2LTA2MzU0CUFtZXJpY2EvUG9ydG9fVmVsaG8JUm9uZG9uaWEKLUJSCSswMjQ5LTA2MDQwCUFtZXJpY2EvQm9hX1Zpc3RhCVJvcmFpbWEKLUJSCS0wMzA4LTA2MDAxCUFtZXJpY2EvTWFuYXVzCUUgQW1hem9uYXMKLUJSCS0wNjQwLTA2OTUyCUFtZXJpY2EvRWlydW5lcGUJVyBBbWF6b25hcwotQlIJLTA5NTgtMDY3NDgJQW1lcmljYS9SaW9fQnJhbmNvCUFjcmUKLUJTCSsyNTA1LTA3NzIxCUFtZXJpY2EvTmFzc2F1Ci1CVAkrMjcyOCswODkzOQlBc2lhL1RoaW1waHUKLUJXCS0yNTQ1KzAyNTU1CUFmcmljYS9HYWJvcm9uZQotQlkJKzUzNTQrMDI3MzQJRXVyb3BlL01pbnNrCi1CWgkrMTczMC0wODgxMglBbWVyaWNhL0JlbGl6ZQotQ0EJKzQ3MzQtMDUyNDMJQW1lcmljYS9TdF9Kb2hucwlOZXdmb3VuZGxhbmQgVGltZSwgaW5jbHVkaW5nIFNFIExhYnJhZG9yCi1DQQkrNDQzOS0wNjMzNglBbWVyaWNhL0hhbGlmYXgJQXRsYW50aWMgVGltZSAtIE5vdmEgU2NvdGlhIChtb3N0IHBsYWNlcyksIFBFSQotQ0EJKzQ2MTItMDU5NTcJQW1lcmljYS9HbGFjZV9CYXkJQXRsYW50aWMgVGltZSAtIE5vdmEgU2NvdGlhIC0gcGxhY2VzIHRoYXQgZGlkIG5vdCBvYnNlcnZlIERTVCAxOTY2LTE5NzEKLUNBCSs0NjA2LTA2NDQ3CUFtZXJpY2EvTW9uY3RvbglBdGxhbnRpYyBUaW1lIC0gTmV3IEJydW5zd2ljawotQ0EJKzUzMjAtMDYwMjUJQW1lcmljYS9Hb29zZV9CYXkJQXRsYW50aWMgVGltZSAtIExhYnJhZG9yIC0gbW9zdCBsb2NhdGlvbnMKLUNBCSs1MTI1LTA1NzA3CUFtZXJpY2EvQmxhbmMtU2FibG9uCUF0bGFudGljIFN0YW5kYXJkIFRpbWUgLSBRdWViZWMgLSBMb3dlciBOb3J0aCBTaG9yZQotQ0EJKzQ1MzEtMDczMzQJQW1lcmljYS9Nb250cmVhbAlFYXN0ZXJuIFRpbWUgLSBRdWViZWMgLSBtb3N0IGxvY2F0aW9ucwotQ0EJKzQzMzktMDc5MjMJQW1lcmljYS9Ub3JvbnRvCUVhc3Rlcm4gVGltZSAtIE9udGFyaW8gLSBtb3N0IGxvY2F0aW9ucwotQ0EJKzQ5MDEtMDg4MTYJQW1lcmljYS9OaXBpZ29uCUVhc3Rlcm4gVGltZSAtIE9udGFyaW8gJiBRdWViZWMgLSBwbGFjZXMgdGhhdCBkaWQgbm90IG9ic2VydmUgRFNUIDE5NjctMTk3MwotQ0EJKzQ4MjMtMDg5MTUJQW1lcmljYS9UaHVuZGVyX0JheQlFYXN0ZXJuIFRpbWUgLSBUaHVuZGVyIEJheSwgT250YXJpbwotQ0EJKzYzNDQtMDY4MjgJQW1lcmljYS9JcWFsdWl0CUVhc3Rlcm4gVGltZSAtIGVhc3QgTnVuYXZ1dCAtIG1vc3QgbG9jYXRpb25zCi1DQQkrNjYwOC0wNjU0NAlBbWVyaWNhL1BhbmduaXJ0dW5nCUVhc3Rlcm4gVGltZSAtIFBhbmduaXJ0dW5nLCBOdW5hdnV0Ci1DQQkrNzQ0MTQ0LTA5NDQ5NDUJQW1lcmljYS9SZXNvbHV0ZQlFYXN0ZXJuIFRpbWUgLSBSZXNvbHV0ZSwgTnVuYXZ1dAotQ0EJKzQ4NDUzMS0wOTEzNzE4CUFtZXJpY2EvQXRpa29rYW4JRWFzdGVybiBTdGFuZGFyZCBUaW1lIC0gQXRpa29rYW4sIE9udGFyaW8gYW5kIFNvdXRoYW1wdG9uIEksIE51bmF2dXQKLUNBCSs2MjQ5MDAtMDkyMDQ1OQlBbWVyaWNhL1Jhbmtpbl9JbmxldAlDZW50cmFsIFRpbWUgLSBjZW50cmFsIE51bmF2dXQKLUNBCSs0OTUzLTA5NzA5CUFtZXJpY2EvV2lubmlwZWcJQ2VudHJhbCBUaW1lIC0gTWFuaXRvYmEgJiB3ZXN0IE9udGFyaW8KLUNBCSs0ODQzLTA5NDM0CUFtZXJpY2EvUmFpbnlfUml2ZXIJQ2VudHJhbCBUaW1lIC0gUmFpbnkgUml2ZXIgJiBGb3J0IEZyYW5jZXMsIE9udGFyaW8KLUNBCSs1MDI0LTEwNDM5CUFtZXJpY2EvUmVnaW5hCUNlbnRyYWwgU3RhbmRhcmQgVGltZSAtIFNhc2thdGNoZXdhbiAtIG1vc3QgbG9jYXRpb25zCi1DQQkrNTAxNy0xMDc1MAlBbWVyaWNhL1N3aWZ0X0N1cnJlbnQJQ2VudHJhbCBTdGFuZGFyZCBUaW1lIC0gU2Fza2F0Y2hld2FuIC0gbWlkd2VzdAotQ0EJKzUzMzMtMTEzMjgJQW1lcmljYS9FZG1vbnRvbglNb3VudGFpbiBUaW1lIC0gQWxiZXJ0YSwgZWFzdCBCcml0aXNoIENvbHVtYmlhICYgd2VzdCBTYXNrYXRjaGV3YW4KLUNBCSs2OTA2NTAtMTA1MDMxMAlBbWVyaWNhL0NhbWJyaWRnZV9CYXkJTW91bnRhaW4gVGltZSAtIHdlc3QgTnVuYXZ1dAotQ0EJKzYyMjctMTE0MjEJQW1lcmljYS9ZZWxsb3drbmlmZQlNb3VudGFpbiBUaW1lIC0gY2VudHJhbCBOb3J0aHdlc3QgVGVycml0b3JpZXMKLUNBCSs2ODIwNTktMTMzNDMwMAlBbWVyaWNhL0ludXZpawlNb3VudGFpbiBUaW1lIC0gd2VzdCBOb3J0aHdlc3QgVGVycml0b3JpZXMKLUNBCSs1OTQ2LTEyMDE0CUFtZXJpY2EvRGF3c29uX0NyZWVrCU1vdW50YWluIFN0YW5kYXJkIFRpbWUgLSBEYXdzb24gQ3JlZWsgJiBGb3J0IFNhaW50IEpvaG4sIEJyaXRpc2ggQ29sdW1iaWEKLUNBCSs0OTE2LTEyMzA3CUFtZXJpY2EvVmFuY291dmVyCVBhY2lmaWMgVGltZSAtIHdlc3QgQnJpdGlzaCBDb2x1bWJpYQotQ0EJKzYwNDMtMTM1MDMJQW1lcmljYS9XaGl0ZWhvcnNlCVBhY2lmaWMgVGltZSAtIHNvdXRoIFl1a29uCi1DQQkrNjQwNC0xMzkyNQlBbWVyaWNhL0Rhd3NvbglQYWNpZmljIFRpbWUgLSBub3J0aCBZdWtvbgotQ0MJLTEyMTArMDk2NTUJSW5kaWFuL0NvY29zCi1DRAktMDQxOCswMTUxOAlBZnJpY2EvS2luc2hhc2EJd2VzdCBEZW0uIFJlcC4gb2YgQ29uZ28KLUNECS0xMTQwKzAyNzI4CUFmcmljYS9MdWJ1bWJhc2hpCWVhc3QgRGVtLiBSZXAuIG9mIENvbmdvCi1DRgkrMDQyMiswMTgzNQlBZnJpY2EvQmFuZ3VpCi1DRwktMDQxNiswMTUxNwlBZnJpY2EvQnJhenphdmlsbGUKLUNICSs0NzIzKzAwODMyCUV1cm9wZS9adXJpY2gKLUNJCSswNTE5LTAwNDAyCUFmcmljYS9BYmlkamFuCi1DSwktMjExNC0xNTk0NglQYWNpZmljL1Jhcm90b25nYQotQ0wJLTMzMjctMDcwNDAJQW1lcmljYS9TYW50aWFnbwltb3N0IGxvY2F0aW9ucwotQ0wJLTI3MDktMTA5MjYJUGFjaWZpYy9FYXN0ZXIJRWFzdGVyIElzbGFuZCAmIFNhbGEgeSBHb21legotQ00JKzA0MDMrMDA5NDIJQWZyaWNhL0RvdWFsYQotQ04JKzMxMTQrMTIxMjgJQXNpYS9TaGFuZ2hhaQllYXN0IENoaW5hIC0gQmVpamluZywgR3Vhbmdkb25nLCBTaGFuZ2hhaSwgZXRjLgotQ04JKzQ1NDUrMTI2NDEJQXNpYS9IYXJiaW4JSGVpbG9uZ2ppYW5nIChleGNlcHQgTW9oZSksIEppbGluCi1DTgkrMjkzNCsxMDYzNQlBc2lhL0Nob25ncWluZwljZW50cmFsIENoaW5hIC0gU2ljaHVhbiwgWXVubmFuLCBHdWFuZ3hpLCBTaGFhbnhpLCBHdWl6aG91LCBldGMuCi1DTgkrNDM0OCswODczNQlBc2lhL1VydW1xaQltb3N0IG9mIFRpYmV0ICYgWGluamlhbmcKLUNOCSszOTI5KzA3NTU5CUFzaWEvS2FzaGdhcgl3ZXN0IFRpYmV0ICYgWGluamlhbmcKLUNPCSswNDM2LTA3NDA1CUFtZXJpY2EvQm9nb3RhCi1DUgkrMDk1Ni0wODQwNQlBbWVyaWNhL0Nvc3RhX1JpY2EKLUNVCSsyMzA4LTA4MjIyCUFtZXJpY2EvSGF2YW5hCi1DVgkrMTQ1NS0wMjMzMQlBdGxhbnRpYy9DYXBlX1ZlcmRlCi1DWAktMTAyNSsxMDU0MwlJbmRpYW4vQ2hyaXN0bWFzCi1DWQkrMzUxMCswMzMyMglBc2lhL05pY29zaWEKLUNaCSs1MDA1KzAxNDI2CUV1cm9wZS9QcmFndWUKLURFCSs1MjMwKzAxMzIyCUV1cm9wZS9CZXJsaW4KLURKCSsxMTM2KzA0MzA5CUFmcmljYS9Eamlib3V0aQotREsJKzU1NDArMDEyMzUJRXVyb3BlL0NvcGVuaGFnZW4KLURNCSsxNTE4LTA2MTI0CUFtZXJpY2EvRG9taW5pY2EKLURPCSsxODI4LTA2OTU0CUFtZXJpY2EvU2FudG9fRG9taW5nbwotRFoJKzM2NDcrMDAzMDMJQWZyaWNhL0FsZ2llcnMKLUVDCS0wMjEwLTA3OTUwCUFtZXJpY2EvR3VheWFxdWlsCW1haW5sYW5kCi1FQwktMDA1NC0wODkzNglQYWNpZmljL0dhbGFwYWdvcwlHYWxhcGFnb3MgSXNsYW5kcwotRUUJKzU5MjUrMDI0NDUJRXVyb3BlL1RhbGxpbm4KLUVHCSszMDAzKzAzMTE1CUFmcmljYS9DYWlybwotRUgJKzI3MDktMDEzMTIJQWZyaWNhL0VsX0FhaXVuCi1FUgkrMTUyMCswMzg1MwlBZnJpY2EvQXNtYXJhCi1FUwkrNDAyNC0wMDM0MQlFdXJvcGUvTWFkcmlkCW1haW5sYW5kCi1FUwkrMzU1My0wMDUxOQlBZnJpY2EvQ2V1dGEJQ2V1dGEgJiBNZWxpbGxhCi1FUwkrMjgwNi0wMTUyNAlBdGxhbnRpYy9DYW5hcnkJQ2FuYXJ5IElzbGFuZHMKLUVUCSswOTAyKzAzODQyCUFmcmljYS9BZGRpc19BYmFiYQotRkkJKzYwMTArMDI0NTgJRXVyb3BlL0hlbHNpbmtpCi1GSgktMTgwOCsxNzgyNQlQYWNpZmljL0ZpamkKLUZLCS01MTQyLTA1NzUxCUF0bGFudGljL1N0YW5sZXkKLUZNCSswNzI1KzE1MTQ3CVBhY2lmaWMvVHJ1awlUcnVrIChDaHV1aykgYW5kIFlhcAotRk0JKzA2NTgrMTU4MTMJUGFjaWZpYy9Qb25hcGUJUG9uYXBlIChQb2hucGVpKQotRk0JKzA1MTkrMTYyNTkJUGFjaWZpYy9Lb3NyYWUJS29zcmFlCi1GTwkrNjIwMS0wMDY0NglBdGxhbnRpYy9GYXJvZQotRlIJKzQ4NTIrMDAyMjAJRXVyb3BlL1BhcmlzCi1HQQkrMDAyMyswMDkyNwlBZnJpY2EvTGlicmV2aWxsZQotR0IJKzUxMzAzMC0wMDAwNzMxCUV1cm9wZS9Mb25kb24KLUdECSsxMjAzLTA2MTQ1CUFtZXJpY2EvR3JlbmFkYQotR0UJKzQxNDMrMDQ0NDkJQXNpYS9UYmlsaXNpCi1HRgkrMDQ1Ni0wNTIyMAlBbWVyaWNhL0NheWVubmUKLUdHCSs0OTI3LTAwMjMyCUV1cm9wZS9HdWVybnNleQotR0gJKzA1MzMtMDAwMTMJQWZyaWNhL0FjY3JhCi1HSQkrMzYwOC0wMDUyMQlFdXJvcGUvR2licmFsdGFyCi1HTAkrNjQxMS0wNTE0NAlBbWVyaWNhL0dvZHRoYWIJbW9zdCBsb2NhdGlvbnMKLUdMCSs3NjQ2LTAxODQwCUFtZXJpY2EvRGFubWFya3NoYXZuCWVhc3QgY29hc3QsIG5vcnRoIG9mIFNjb3Jlc2J5c3VuZAotR0wJKzcwMjktMDIxNTgJQW1lcmljYS9TY29yZXNieXN1bmQJU2NvcmVzYnlzdW5kIC8gSXR0b3Fxb3J0b29ybWlpdAotR0wJKzc2MzQtMDY4NDcJQW1lcmljYS9UaHVsZQlUaHVsZSAvIFBpdHVmZmlrCi1HTQkrMTMyOC0wMTYzOQlBZnJpY2EvQmFuanVsCi1HTgkrMDkzMS0wMTM0MwlBZnJpY2EvQ29uYWtyeQotR1AJKzE2MTQtMDYxMzIJQW1lcmljYS9HdWFkZWxvdXBlCi1HUQkrMDM0NSswMDg0NwlBZnJpY2EvTWFsYWJvCi1HUgkrMzc1OCswMjM0MwlFdXJvcGUvQXRoZW5zCi1HUwktNTQxNi0wMzYzMglBdGxhbnRpYy9Tb3V0aF9HZW9yZ2lhCi1HVAkrMTQzOC0wOTAzMQlBbWVyaWNhL0d1YXRlbWFsYQotR1UJKzEzMjgrMTQ0NDUJUGFjaWZpYy9HdWFtCi1HVwkrMTE1MS0wMTUzNQlBZnJpY2EvQmlzc2F1Ci1HWQkrMDY0OC0wNTgxMAlBbWVyaWNhL0d1eWFuYQotSEsJKzIyMTcrMTE0MDkJQXNpYS9Ib25nX0tvbmcKLUhOCSsxNDA2LTA4NzEzCUFtZXJpY2EvVGVndWNpZ2FscGEKLUhSCSs0NTQ4KzAxNTU4CUV1cm9wZS9aYWdyZWIKLUhUCSsxODMyLTA3MjIwCUFtZXJpY2EvUG9ydC1hdS1QcmluY2UKLUhVCSs0NzMwKzAxOTA1CUV1cm9wZS9CdWRhcGVzdAotSUQJLTA2MTArMTA2NDgJQXNpYS9KYWthcnRhCUphdmEgJiBTdW1hdHJhCi1JRAktMDAwMisxMDkyMAlBc2lhL1BvbnRpYW5hawl3ZXN0ICYgY2VudHJhbCBCb3JuZW8KLUlECS0wNTA3KzExOTI0CUFzaWEvTWFrYXNzYXIJZWFzdCAmIHNvdXRoIEJvcm5lbywgQ2VsZWJlcywgQmFsaSwgTnVzYSBUZW5nYXJyYSwgd2VzdCBUaW1vcgotSUQJLTAyMzIrMTQwNDIJQXNpYS9KYXlhcHVyYQlJcmlhbiBKYXlhICYgdGhlIE1vbHVjY2FzCi1JRQkrNTMyMC0wMDYxNQlFdXJvcGUvRHVibGluCi1JTAkrMzE0NiswMzUxNAlBc2lhL0plcnVzYWxlbQotSU0JKzU0MDktMDA0MjgJRXVyb3BlL0lzbGVfb2ZfTWFuCi1JTgkrMjIzMiswODgyMglBc2lhL0tvbGthdGEKLUlPCS0wNzIwKzA3MjI1CUluZGlhbi9DaGFnb3MKLUlRCSszMzIxKzA0NDI1CUFzaWEvQmFnaGRhZAotSVIJKzM1NDArMDUxMjYJQXNpYS9UZWhyYW4KLUlTCSs2NDA5LTAyMTUxCUF0bGFudGljL1JleWtqYXZpawotSVQJKzQxNTQrMDEyMjkJRXVyb3BlL1JvbWUKLUpFCSs0OTEyLTAwMjA3CUV1cm9wZS9KZXJzZXkKLUpNCSsxODAwLTA3NjQ4CUFtZXJpY2EvSmFtYWljYQotSk8JKzMxNTcrMDM1NTYJQXNpYS9BbW1hbgotSlAJKzM1MzkxNisxMzk0NDQxCUFzaWEvVG9reW8KLUtFCS0wMTE3KzAzNjQ5CUFmcmljYS9OYWlyb2JpCi1LRwkrNDI1NCswNzQzNglBc2lhL0Jpc2hrZWsKLUtICSsxMTMzKzEwNDU1CUFzaWEvUGhub21fUGVuaAotS0kJKzAxMjUrMTczMDAJUGFjaWZpYy9UYXJhd2EJR2lsYmVydCBJc2xhbmRzCi1LSQktMDMwOC0xNzEwNQlQYWNpZmljL0VuZGVyYnVyeQlQaG9lbml4IElzbGFuZHMKLUtJCSswMTUyLTE1NzIwCVBhY2lmaWMvS2lyaXRpbWF0aQlMaW5lIElzbGFuZHMKLUtNCS0xMTQxKzA0MzE2CUluZGlhbi9Db21vcm8KLUtOCSsxNzE4LTA2MjQzCUFtZXJpY2EvU3RfS2l0dHMKLUtQCSszOTAxKzEyNTQ1CUFzaWEvUHlvbmd5YW5nCi1LUgkrMzczMysxMjY1OAlBc2lhL1Nlb3VsCi1LVwkrMjkyMCswNDc1OQlBc2lhL0t1d2FpdAotS1kJKzE5MTgtMDgxMjMJQW1lcmljYS9DYXltYW4KLUtaCSs0MzE1KzA3NjU3CUFzaWEvQWxtYXR5CW1vc3QgbG9jYXRpb25zCi1LWgkrNDQ0OCswNjUyOAlBc2lhL1F5enlsb3JkYQlReXp5bG9yZGEgKEt5enlsb3JkYSwgS3p5bC1PcmRhKQotS1oJKzUwMTcrMDU3MTAJQXNpYS9BcXRvYmUJQXF0b2JlIChBa3RvYmUpCi1LWgkrNDQzMSswNTAxNglBc2lhL0FxdGF1CUF0eXJhdSAoQXRpcmF1LCBHdXIneWV2KSwgTWFuZ2doeXN0YXUgKE1hbmtpc3RhdSkKLUtaCSs1MTEzKzA1MTIxCUFzaWEvT3JhbAlXZXN0IEthemFraHN0YW4KLUxBCSsxNzU4KzEwMjM2CUFzaWEvVmllbnRpYW5lCi1MQgkrMzM1MyswMzUzMAlBc2lhL0JlaXJ1dAotTEMJKzE0MDEtMDYxMDAJQW1lcmljYS9TdF9MdWNpYQotTEkJKzQ3MDkrMDA5MzEJRXVyb3BlL1ZhZHV6Ci1MSwkrMDY1NiswNzk1MQlBc2lhL0NvbG9tYm8KLUxSCSswNjE4LTAxMDQ3CUFmcmljYS9Nb25yb3ZpYQotTFMJLTI5MjgrMDI3MzAJQWZyaWNhL01hc2VydQotTFQJKzU0NDErMDI1MTkJRXVyb3BlL1ZpbG5pdXMKLUxVCSs0OTM2KzAwNjA5CUV1cm9wZS9MdXhlbWJvdXJnCi1MVgkrNTY1NyswMjQwNglFdXJvcGUvUmlnYQotTFkJKzMyNTQrMDEzMTEJQWZyaWNhL1RyaXBvbGkKLU1BCSszMzM5LTAwNzM1CUFmcmljYS9DYXNhYmxhbmNhCi1NQwkrNDM0MiswMDcyMwlFdXJvcGUvTW9uYWNvCi1NRAkrNDcwMCswMjg1MAlFdXJvcGUvQ2hpc2luYXUKLU1FCSs0MjI2KzAxOTE2CUV1cm9wZS9Qb2Rnb3JpY2EKLU1GCSsxODA0LTA2MzA1CUFtZXJpY2EvTWFyaWdvdAotTUcJLTE4NTUrMDQ3MzEJSW5kaWFuL0FudGFuYW5hcml2bwotTUgJKzA3MDkrMTcxMTIJUGFjaWZpYy9NYWp1cm8JbW9zdCBsb2NhdGlvbnMKLU1ICSswOTA1KzE2NzIwCVBhY2lmaWMvS3dhamFsZWluCUt3YWphbGVpbgotTUsJKzQxNTkrMDIxMjYJRXVyb3BlL1Nrb3BqZQotTUwJKzEyMzktMDA4MDAJQWZyaWNhL0JhbWFrbwotTU0JKzE2NDcrMDk2MTAJQXNpYS9SYW5nb29uCi1NTgkrNDc1NSsxMDY1MwlBc2lhL1VsYWFuYmFhdGFyCW1vc3QgbG9jYXRpb25zCi1NTgkrNDgwMSswOTEzOQlBc2lhL0hvdmQJQmF5YW4tT2xnaXksIEdvdmktQWx0YWksIEhvdmQsIFV2cywgWmF2a2hhbgotTU4JKzQ4MDQrMTE0MzAJQXNpYS9DaG9pYmFsc2FuCURvcm5vZCwgU3VraGJhYXRhcgotTU8JKzIyMTQrMTEzMzUJQXNpYS9NYWNhdQotTVAJKzE1MTIrMTQ1NDUJUGFjaWZpYy9TYWlwYW4KLU1RCSsxNDM2LTA2MTA1CUFtZXJpY2EvTWFydGluaXF1ZQotTVIJKzE4MDYtMDE1NTcJQWZyaWNhL05vdWFrY2hvdHQKLU1TCSsxNjQzLTA2MjEzCUFtZXJpY2EvTW9udHNlcnJhdAotTVQJKzM1NTQrMDE0MzEJRXVyb3BlL01hbHRhCi1NVQktMjAxMCswNTczMAlJbmRpYW4vTWF1cml0aXVzCi1NVgkrMDQxMCswNzMzMAlJbmRpYW4vTWFsZGl2ZXMKLU1XCS0xNTQ3KzAzNTAwCUFmcmljYS9CbGFudHlyZQotTVgJKzE5MjQtMDk5MDkJQW1lcmljYS9NZXhpY29fQ2l0eQlDZW50cmFsIFRpbWUgLSBtb3N0IGxvY2F0aW9ucwotTVgJKzIxMDUtMDg2NDYJQW1lcmljYS9DYW5jdW4JQ2VudHJhbCBUaW1lIC0gUXVpbnRhbmEgUm9vCi1NWAkrMjA1OC0wODkzNwlBbWVyaWNhL01lcmlkYQlDZW50cmFsIFRpbWUgLSBDYW1wZWNoZSwgWXVjYXRhbgotTVgJKzI1NDAtMTAwMTkJQW1lcmljYS9Nb250ZXJyZXkJQ2VudHJhbCBUaW1lIC0gQ29haHVpbGEsIER1cmFuZ28sIE51ZXZvIExlb24sIFRhbWF1bGlwYXMKLU1YCSsyMzEzLTEwNjI1CUFtZXJpY2EvTWF6YXRsYW4JTW91bnRhaW4gVGltZSAtIFMgQmFqYSwgTmF5YXJpdCwgU2luYWxvYQotTVgJKzI4MzgtMTA2MDUJQW1lcmljYS9DaGlodWFodWEJTW91bnRhaW4gVGltZSAtIENoaWh1YWh1YQotTVgJKzI5MDQtMTEwNTgJQW1lcmljYS9IZXJtb3NpbGxvCU1vdW50YWluIFN0YW5kYXJkIFRpbWUgLSBTb25vcmEKLU1YCSszMjMyLTExNzAxCUFtZXJpY2EvVGlqdWFuYQlQYWNpZmljIFRpbWUKLU1ZCSswMzEwKzEwMTQyCUFzaWEvS3VhbGFfTHVtcHVyCXBlbmluc3VsYXIgTWFsYXlzaWEKLU1ZCSswMTMzKzExMDIwCUFzaWEvS3VjaGluZwlTYWJhaCAmIFNhcmF3YWsKLU1aCS0yNTU4KzAzMjM1CUFmcmljYS9NYXB1dG8KLU5BCS0yMjM0KzAxNzA2CUFmcmljYS9XaW5kaG9lawotTkMJLTIyMTYrMTY1MzAJUGFjaWZpYy9Ob3VtZWEKLU5FCSsxMzMxKzAwMjA3CUFmcmljYS9OaWFtZXkKLU5GCS0yOTAzKzE2NzU4CVBhY2lmaWMvTm9yZm9sawotTkcJKzA2MjcrMDAzMjQJQWZyaWNhL0xhZ29zCi1OSQkrMTIwOS0wODYxNwlBbWVyaWNhL01hbmFndWEKLU5MCSs1MjIyKzAwNDU0CUV1cm9wZS9BbXN0ZXJkYW0KLU5PCSs1OTU1KzAxMDQ1CUV1cm9wZS9Pc2xvCi1OUAkrMjc0MyswODUxOQlBc2lhL0thdG1hbmR1Ci1OUgktMDAzMSsxNjY1NQlQYWNpZmljL05hdXJ1Ci1OVQktMTkwMS0xNjk1NQlQYWNpZmljL05pdWUKLU5aCS0zNjUyKzE3NDQ2CVBhY2lmaWMvQXVja2xhbmQJbW9zdCBsb2NhdGlvbnMKLU5aCS00MzU3LTE3NjMzCVBhY2lmaWMvQ2hhdGhhbQlDaGF0aGFtIElzbGFuZHMKLU9NCSsyMzM2KzA1ODM1CUFzaWEvTXVzY2F0Ci1QQQkrMDg1OC0wNzkzMglBbWVyaWNhL1BhbmFtYQotUEUJLTEyMDMtMDc3MDMJQW1lcmljYS9MaW1hCi1QRgktMTczMi0xNDkzNAlQYWNpZmljL1RhaGl0aQlTb2NpZXR5IElzbGFuZHMKLVBGCS0wOTAwLTEzOTMwCVBhY2lmaWMvTWFycXVlc2FzCU1hcnF1ZXNhcyBJc2xhbmRzCi1QRgktMjMwOC0xMzQ1NwlQYWNpZmljL0dhbWJpZXIJR2FtYmllciBJc2xhbmRzCi1QRwktMDkzMCsxNDcxMAlQYWNpZmljL1BvcnRfTW9yZXNieQotUEgJKzE0MzUrMTIxMDAJQXNpYS9NYW5pbGEKLVBLCSsyNDUyKzA2NzAzCUFzaWEvS2FyYWNoaQotUEwJKzUyMTUrMDIxMDAJRXVyb3BlL1dhcnNhdwotUE0JKzQ3MDMtMDU2MjAJQW1lcmljYS9NaXF1ZWxvbgotUE4JLTI1MDQtMTMwMDUJUGFjaWZpYy9QaXRjYWlybgotUFIJKzE4MjgwNi0wNjYwNjIyCUFtZXJpY2EvUHVlcnRvX1JpY28KLVBTCSszMTMwKzAzNDI4CUFzaWEvR2F6YQotUFQJKzM4NDMtMDA5MDgJRXVyb3BlL0xpc2JvbgltYWlubGFuZAotUFQJKzMyMzgtMDE2NTQJQXRsYW50aWMvTWFkZWlyYQlNYWRlaXJhIElzbGFuZHMKLVBUCSszNzQ0LTAyNTQwCUF0bGFudGljL0F6b3JlcwlBem9yZXMKLVBXCSswNzIwKzEzNDI5CVBhY2lmaWMvUGFsYXUKLVBZCS0yNTE2LTA1NzQwCUFtZXJpY2EvQXN1bmNpb24KLVFBCSsyNTE3KzA1MTMyCUFzaWEvUWF0YXIKLVJFCS0yMDUyKzA1NTI4CUluZGlhbi9SZXVuaW9uCi1STwkrNDQyNiswMjYwNglFdXJvcGUvQnVjaGFyZXN0Ci1SUwkrNDQ1MCswMjAzMAlFdXJvcGUvQmVsZ3JhZGUKLVJVCSs1NDQzKzAyMDMwCUV1cm9wZS9LYWxpbmluZ3JhZAlNb3Njb3ctMDEgLSBLYWxpbmluZ3JhZAotUlUJKzU1NDUrMDM3MzUJRXVyb3BlL01vc2NvdwlNb3Njb3crMDAgLSB3ZXN0IFJ1c3NpYQotUlUJKzQ4NDQrMDQ0MjUJRXVyb3BlL1ZvbGdvZ3JhZAlNb3Njb3crMDAgLSBDYXNwaWFuIFNlYQotUlUJKzUzMTIrMDUwMDkJRXVyb3BlL1NhbWFyYQlNb3Njb3crMDEgLSBTYW1hcmEsIFVkbXVydGlhCi1SVQkrNTY1MSswNjAzNglBc2lhL1lla2F0ZXJpbmJ1cmcJTW9zY293KzAyIC0gVXJhbHMKLVJVCSs1NTAwKzA3MzI0CUFzaWEvT21zawlNb3Njb3crMDMgLSB3ZXN0IFNpYmVyaWEKLVJVCSs1NTAyKzA4MjU1CUFzaWEvTm92b3NpYmlyc2sJTW9zY293KzAzIC0gTm92b3NpYmlyc2sKLVJVCSs1NjAxKzA5MjUwCUFzaWEvS3Jhc25veWFyc2sJTW9zY293KzA0IC0gWWVuaXNlaSBSaXZlcgotUlUJKzUyMTYrMTA0MjAJQXNpYS9Jcmt1dHNrCU1vc2NvdyswNSAtIExha2UgQmFpa2FsCi1SVQkrNjIwMCsxMjk0MAlBc2lhL1lha3V0c2sJTW9zY293KzA2IC0gTGVuYSBSaXZlcgotUlUJKzQzMTArMTMxNTYJQXNpYS9WbGFkaXZvc3RvawlNb3Njb3crMDcgLSBBbXVyIFJpdmVyCi1SVQkrNDY1OCsxNDI0MglBc2lhL1Nha2hhbGluCU1vc2NvdyswNyAtIFNha2hhbGluIElzbGFuZAotUlUJKzU5MzQrMTUwNDgJQXNpYS9NYWdhZGFuCU1vc2NvdyswOCAtIE1hZ2FkYW4KLVJVCSs1MzAxKzE1ODM5CUFzaWEvS2FtY2hhdGthCU1vc2NvdyswOSAtIEthbWNoYXRrYQotUlUJKzY0NDUrMTc3MjkJQXNpYS9BbmFkeXIJTW9zY293KzEwIC0gQmVyaW5nIFNlYQotUlcJLTAxNTcrMDMwMDQJQWZyaWNhL0tpZ2FsaQotU0EJKzI0MzgrMDQ2NDMJQXNpYS9SaXlhZGgKLVNCCS0wOTMyKzE2MDEyCVBhY2lmaWMvR3VhZGFsY2FuYWwKLVNDCS0wNDQwKzA1NTI4CUluZGlhbi9NYWhlCi1TRAkrMTUzNiswMzIzMglBZnJpY2EvS2hhcnRvdW0KLVNFCSs1OTIwKzAxODAzCUV1cm9wZS9TdG9ja2hvbG0KLVNHCSswMTE3KzEwMzUxCUFzaWEvU2luZ2Fwb3JlCi1TSAktMTU1NS0wMDU0MglBdGxhbnRpYy9TdF9IZWxlbmEKLVNJCSs0NjAzKzAxNDMxCUV1cm9wZS9ManVibGphbmEKLVNKCSs3ODAwKzAxNjAwCUFyY3RpYy9Mb25neWVhcmJ5ZW4KLVNLCSs0ODA5KzAxNzA3CUV1cm9wZS9CcmF0aXNsYXZhCi1TTAkrMDgzMC0wMTMxNQlBZnJpY2EvRnJlZXRvd24KLVNNCSs0MzU1KzAxMjI4CUV1cm9wZS9TYW5fTWFyaW5vCi1TTgkrMTQ0MC0wMTcyNglBZnJpY2EvRGFrYXIKLVNPCSswMjA0KzA0NTIyCUFmcmljYS9Nb2dhZGlzaHUKLVNSCSswNTUwLTA1NTEwCUFtZXJpY2EvUGFyYW1hcmlibwotU1QJKzAwMjArMDA2NDQJQWZyaWNhL1Nhb19Ub21lCi1TVgkrMTM0Mi0wODkxMglBbWVyaWNhL0VsX1NhbHZhZG9yCi1TWQkrMzMzMCswMzYxOAlBc2lhL0RhbWFzY3VzCi1TWgktMjYxOCswMzEwNglBZnJpY2EvTWJhYmFuZQotVEMJKzIxMjgtMDcxMDgJQW1lcmljYS9HcmFuZF9UdXJrCi1URAkrMTIwNyswMTUwMwlBZnJpY2EvTmRqYW1lbmEKLVRGCS00OTIxMTArMDcwMTMwMwlJbmRpYW4vS2VyZ3VlbGVuCi1URwkrMDYwOCswMDExMwlBZnJpY2EvTG9tZQotVEgJKzEzNDUrMTAwMzEJQXNpYS9CYW5na29rCi1USgkrMzgzNSswNjg0OAlBc2lhL0R1c2hhbmJlCi1USwktMDkyMi0xNzExNAlQYWNpZmljL0Zha2FvZm8KLVRMCS0wODMzKzEyNTM1CUFzaWEvRGlsaQotVE0JKzM3NTcrMDU4MjMJQXNpYS9Bc2hnYWJhdAotVE4JKzM2NDgrMDEwMTEJQWZyaWNhL1R1bmlzCi1UTwktMjExMCsxNzUxMAlQYWNpZmljL1RvbmdhdGFwdQotVFIJKzQxMDErMDI4NTgJRXVyb3BlL0lzdGFuYnVsCi1UVAkrMTAzOS0wNjEzMQlBbWVyaWNhL1BvcnRfb2ZfU3BhaW4KLVRWCS0wODMxKzE3OTEzCVBhY2lmaWMvRnVuYWZ1dGkKLVRXCSsyNTAzKzEyMTMwCUFzaWEvVGFpcGVpCi1UWgktMDY0OCswMzkxNwlBZnJpY2EvRGFyX2VzX1NhbGFhbQotVUEJKzUwMjYrMDMwMzEJRXVyb3BlL0tpZXYJbW9zdCBsb2NhdGlvbnMKLVVBCSs0ODM3KzAyMjE4CUV1cm9wZS9Vemhnb3JvZAlSdXRoZW5pYQotVUEJKzQ3NTArMDM1MTAJRXVyb3BlL1phcG9yb3poeWUJWmFwb3JvemgneWUsIEUgTHVnYW5zayAvIFphcG9yaXpoaWEsIEUgTHVoYW5zawotVUEJKzQ0NTcrMDM0MDYJRXVyb3BlL1NpbWZlcm9wb2wJY2VudHJhbCBDcmltZWEKLVVHCSswMDE5KzAzMjI1CUFmcmljYS9LYW1wYWxhCi1VTQkrMTY0NS0xNjkzMQlQYWNpZmljL0pvaG5zdG9uCUpvaG5zdG9uIEF0b2xsCi1VTQkrMjgxMy0xNzcyMglQYWNpZmljL01pZHdheQlNaWR3YXkgSXNsYW5kcwotVU0JKzE5MTcrMTY2MzcJUGFjaWZpYy9XYWtlCVdha2UgSXNsYW5kCi1VUwkrNDA0MjUxLTA3NDAwMjMJQW1lcmljYS9OZXdfWW9yawlFYXN0ZXJuIFRpbWUKLVVTCSs0MjE5NTMtMDgzMDI0NQlBbWVyaWNhL0RldHJvaXQJRWFzdGVybiBUaW1lIC0gTWljaGlnYW4gLSBtb3N0IGxvY2F0aW9ucwotVVMJKzM4MTUxNS0wODU0NTM0CUFtZXJpY2EvS2VudHVja3kvTG91aXN2aWxsZQlFYXN0ZXJuIFRpbWUgLSBLZW50dWNreSAtIExvdWlzdmlsbGUgYXJlYQotVVMJKzM2NDk0Ny0wODQ1MDU3CUFtZXJpY2EvS2VudHVja3kvTW9udGljZWxsbwlFYXN0ZXJuIFRpbWUgLSBLZW50dWNreSAtIFdheW5lIENvdW50eQotVVMJKzM5NDYwNi0wODYwOTI5CUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIG1vc3QgbG9jYXRpb25zCi1VUwkrMzg0MDM4LTA4NzMxNDMJQW1lcmljYS9JbmRpYW5hL1ZpbmNlbm5lcwlFYXN0ZXJuIFRpbWUgLSBJbmRpYW5hIC0gRGF2aWVzcywgRHVib2lzLCBLbm94ICYgTWFydGluIENvdW50aWVzCi1VUwkrNDExNzQ1LTA4NjM3MzAJQW1lcmljYS9JbmRpYW5hL0tub3gJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIFN0YXJrZSBDb3VudHkKLVVTCSs0MTAzMDUtMDg2MzYxMQlBbWVyaWNhL0luZGlhbmEvV2luYW1hYwlFYXN0ZXJuIFRpbWUgLSBJbmRpYW5hIC0gUHVsYXNraSBDb3VudHkKLVVTCSszODIyMzItMDg2MjA0MQlBbWVyaWNhL0luZGlhbmEvTWFyZW5nbwlFYXN0ZXJuIFRpbWUgLSBJbmRpYW5hIC0gQ3Jhd2ZvcmQgQ291bnR5Ci1VUwkrMzg0NDUyLTA4NTA0MDIJQW1lcmljYS9JbmRpYW5hL1ZldmF5CUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBTd2l0emVybGFuZCBDb3VudHkKLVVTCSs0MTUxMDAtMDg3MzkwMAlBbWVyaWNhL0NoaWNhZ28JQ2VudHJhbCBUaW1lCi1VUwkrMzc1NzExLTA4NjQ1NDEJQW1lcmljYS9JbmRpYW5hL1RlbGxfQ2l0eQlDZW50cmFsIFRpbWUgLSBJbmRpYW5hIC0gUGVycnkgQ291bnR5Ci1VUwkrMzgyOTMxLTA4NzE2NDMJQW1lcmljYS9JbmRpYW5hL1BldGVyc2J1cmcJQ2VudHJhbCBUaW1lIC0gSW5kaWFuYSAtIFBpa2UgQ291bnR5Ci1VUwkrNDUwNjI4LTA4NzM2NTEJQW1lcmljYS9NZW5vbWluZWUJQ2VudHJhbCBUaW1lIC0gTWljaGlnYW4gLSBEaWNraW5zb24sIEdvZ2ViaWMsIElyb24gJiBNZW5vbWluZWUgQ291bnRpZXMKLVVTCSs0NzA2NTktMTAxMTc1NwlBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIJQ2VudHJhbCBUaW1lIC0gTm9ydGggRGFrb3RhIC0gT2xpdmVyIENvdW50eQotVVMJKzQ2NTA0Mi0xMDEyNDM5CUFtZXJpY2EvTm9ydGhfRGFrb3RhL05ld19TYWxlbQlDZW50cmFsIFRpbWUgLSBOb3J0aCBEYWtvdGEgLSBNb3J0b24gQ291bnR5IChleGNlcHQgTWFuZGFuIGFyZWEpCi1VUwkrMzk0NDIxLTEwNDU5MDMJQW1lcmljYS9EZW52ZXIJTW91bnRhaW4gVGltZQotVVMJKzQzMzY0OS0xMTYxMjA5CUFtZXJpY2EvQm9pc2UJTW91bnRhaW4gVGltZSAtIHNvdXRoIElkYWhvICYgZWFzdCBPcmVnb24KLVVTCSszNjQ3MDgtMTA4NDExMQlBbWVyaWNhL1NoaXByb2NrCU1vdW50YWluIFRpbWUgLSBOYXZham8KLVVTCSszMzI2NTQtMTEyMDQyNAlBbWVyaWNhL1Bob2VuaXgJTW91bnRhaW4gU3RhbmRhcmQgVGltZSAtIEFyaXpvbmEKLVVTCSszNDAzMDgtMTE4MTQzNAlBbWVyaWNhL0xvc19BbmdlbGVzCVBhY2lmaWMgVGltZQotVVMJKzYxMTMwNS0xNDk1NDAxCUFtZXJpY2EvQW5jaG9yYWdlCUFsYXNrYSBUaW1lCi1VUwkrNTgxODA3LTEzNDI1MTEJQW1lcmljYS9KdW5lYXUJQWxhc2thIFRpbWUgLSBBbGFza2EgcGFuaGFuZGxlCi1VUwkrNTkzMjQ5LTEzOTQzMzgJQW1lcmljYS9ZYWt1dGF0CUFsYXNrYSBUaW1lIC0gQWxhc2thIHBhbmhhbmRsZSBuZWNrCi1VUwkrNjQzMDA0LTE2NTI0MjMJQW1lcmljYS9Ob21lCUFsYXNrYSBUaW1lIC0gd2VzdCBBbGFza2EKLVVTCSs1MTUyNDgtMTc2MzkyOQlBbWVyaWNhL0FkYWsJQWxldXRpYW4gSXNsYW5kcwotVVMJKzIxMTgyNS0xNTc1MTMwCVBhY2lmaWMvSG9ub2x1bHUJSGF3YWlpCi1VWQktMzQ1My0wNTYxMQlBbWVyaWNhL01vbnRldmlkZW8KLVVaCSszOTQwKzA2NjQ4CUFzaWEvU2FtYXJrYW5kCXdlc3QgVXpiZWtpc3RhbgotVVoJKzQxMjArMDY5MTgJQXNpYS9UYXNoa2VudAllYXN0IFV6YmVraXN0YW4KLVZBCSs0MTU0KzAxMjI3CUV1cm9wZS9WYXRpY2FuCi1WQwkrMTMwOS0wNjExNAlBbWVyaWNhL1N0X1ZpbmNlbnQKLVZFCSsxMDMwLTA2NjU2CUFtZXJpY2EvQ2FyYWNhcwotVkcJKzE4MjctMDY0MzcJQW1lcmljYS9Ub3J0b2xhCi1WSQkrMTgyMS0wNjQ1NglBbWVyaWNhL1N0X1Rob21hcwotVk4JKzEwNDUrMTA2NDAJQXNpYS9Ib19DaGlfTWluaAotVlUJLTE3NDArMTY4MjUJUGFjaWZpYy9FZmF0ZQotV0YJLTEzMTgtMTc2MTAJUGFjaWZpYy9XYWxsaXMKLVdTCS0xMzUwLTE3MTQ0CVBhY2lmaWMvQXBpYQotWUUJKzEyNDUrMDQ1MTIJQXNpYS9BZGVuCi1ZVAktMTI0NyswNDUxNAlJbmRpYW4vTWF5b3R0ZQotWkEJLTI2MTUrMDI4MDAJQWZyaWNhL0pvaGFubmVzYnVyZwotWk0JLTE1MjUrMDI4MTcJQWZyaWNhL0x1c2FrYQotWlcJLTE3NTArMDMxMDMJQWZyaWNhL0hhcmFyZQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOGgvTU9EVUxFX0xJQ0VOU0VfUFVCTElDX0RPTUFJTiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL01PRFVMRV9MSUNFTlNFX1BVQkxJQ19ET01BSU4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL01PRFVMRV9MSUNFTlNFX1BVQkxJQ19ET01BSU4KcmVuYW1lIHRvIHRvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL01PRFVMRV9MSUNFTlNFX1BVQkxJQ19ET01BSU4KZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2FmcmljYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2FmcmljYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg5YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvYWZyaWNhCkBAIC0wLDAgKzEsOTk3IEBACisjIDxwcmU+CisjIEAoIylhZnJpY2EJOC4yMworIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKKyMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bworIyB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjCisjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcworIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCisjIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCisjCisjIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKKyMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0CisjIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKKyMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKKyMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCisjCisjIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgorIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCisjCisjIEFub3RoZXIgc291cmNlIG9jY2FzaW9uYWxseSB1c2VkIGlzIEVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAorIyBXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLCB3aGljaAorIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCisjCisjIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcworIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KKyMKKyMgUHJldmlvdXMgZWRpdGlvbnMgb2YgdGhpcyBkYXRhYmFzZSB1c2VkIFdBVCwgQ0FULCBTQVQsIGFuZCBFQVQKKyMgZm9yICswOjAwIHRocm91Z2ggKzM6MDAsIHJlc3BlY3RpdmVseSwKKyMgYnV0IE1hcmsgUiBWIE11cnJheSByZXBvcnRzIHRoYXQKKyMgYFNBU1QnIGlzIHRoZSBvZmZpY2lhbCBhYmJyZXZpYXRpb24gZm9yICsyOjAwIGluIHRoZSBjb3VudHJ5IG9mIFNvdXRoIEFmcmljYSwKKyMgYENBVCcgaXMgY29tbW9ubHkgdXNlZCBmb3IgKzI6MDAgaW4gY291bnRyaWVzIG5vcnRoIG9mIFNvdXRoIEFmcmljYSwgYW5kCisjIGBXQVQnIGlzIHByb2JhYmx5IHRoZSBiZXN0IG5hbWUgZm9yICsxOjAwLCBhcyB0aGUgY29tbW9uIHBocmFzZSBmb3IKKyMgdGhlIGFyZWEgdGhhdCBpbmNsdWRlcyBOaWdlcmlhIGlzIGBgV2VzdCBBZnJpY2EnJy4KKyMgSGUgaGFzIGhlYXJkIG9mIGBgV2VzdGVybiBTYWhhcmEgVGltZScnIGZvciArMDowMCBidXQgY2FuIGZpbmQgbm8gcmVmZXJlbmNlLgorIworIyBUbyBtYWtlIHRoaW5ncyBjb25mdXNpbmcsIGBXQVQnIHNlZW1zIHRvIGhhdmUgYmVlbiB1c2VkIGZvciAtMTowMCBsb25nIGFnbzsKKyMgSSdkIGd1ZXNzIHRoYXQgdGhpcyB3YXMgYmVjYXVzZSBwZW9wbGUgbmVlZGVkIF9zb21lXyBuYW1lIGZvciAtMTowMCwKKyMgYW5kIGF0IHRoZSB0aW1lLCBmYXIgd2VzdCBBZnJpY2Egd2FzIHRoZSBvbmx5IG1ham9yIGxhbmQgYXJlYSBpbiAtMTowMC4KKyMgVGhpcyB1c2FnZSBpcyBub3cgb2Jzb2xldGUsIGFzIHRoZSBsYXN0IHVzZSBvZiAtMTowMCBvbiB0aGUgQWZyaWNhbgorIyBtYWlubGFuZCBzZWVtcyB0byBoYXZlIGJlZW4gMTk3NiBpbiBXZXN0ZXJuIFNhaGFyYS4KKyMKKyMgVG8gc3VtbWFyaXplLCB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbnMgc2VlbSB0byBoYXZlIHNvbWUgY3VycmVuY3k6CisjCS0xOjAwCVdBVAlXZXN0IEFmcmljYSBUaW1lIChubyBsb25nZXIgdXNlZCkKKyMJIDA6MDAJR01UCUdyZWVud2ljaCBNZWFuIFRpbWUKKyMJIDI6MDAJQ0FUCUNlbnRyYWwgQWZyaWNhIFRpbWUKKyMJIDI6MDAJU0FTVAlTb3V0aCBBZnJpY2EgU3RhbmRhcmQgVGltZQorIyBhbmQgTXVycmF5IHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgYWJicmV2aWF0aW9uOgorIwkgMTowMAlXQVQJV2VzdCBBZnJpY2EgVGltZQorIyBJIHJlYWxpemUgdGhhdCB0aGlzIGxlYWRzIHRvIGBXQVQnIGJlaW5nIHVzZWQgZm9yIGJvdGggLTE6MDAgYW5kIDE6MDAKKyMgZm9yIHRpbWVzIGJlZm9yZSAxOTc2LCBidXQgdGhpcyBpcyB0aGUgYmVzdCBJIGNhbiB0aGluayBvZgorIyB1bnRpbCB3ZSBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KKyMKKyMgSSBpbnZlbnRlZCB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbnM7IGNvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQorIwkgMjowMAlXQVNUCVdlc3QgQWZyaWNhIFN1bW1lciBUaW1lCisjCSAyOjMwCUJFQVQJQnJpdGlzaCBFYXN0IEFmcmljYSBUaW1lIChubyBsb25nZXIgdXNlZCkKKyMJIDI6NDQ6NDUgQkVBVVQJQnJpdGlzaCBFYXN0IEFmcmljYSBVbmlmaWVkIFRpbWUgKG5vIGxvbmdlciB1c2VkKQorIwkgMzowMAlDQVNUCUNlbnRyYWwgQWZyaWNhIFN1bW1lciBUaW1lIChubyBsb25nZXIgdXNlZCkKKyMJIDM6MDAJU0FTVAlTb3V0aCBBZnJpY2EgU3VtbWVyIFRpbWUgKG5vIGxvbmdlciB1c2VkKQorIwkgMzowMAlFQVQJRWFzdCBBZnJpY2EgVGltZQorIwkgNDowMAlFQVNUCUVhc3QgQWZyaWNhIFN1bW1lciBUaW1lIChubyBsb25nZXIgdXNlZCkKKworIyBBbGdlcmlhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlBbGdlcmlhCTE5MTYJb25seQktCUp1bgkxNAkyMzowMHMJMTowMAlTCitSdWxlCUFsZ2VyaWEJMTkxNgkxOTE5CS0JT2N0CVN1bj49MQkyMzowMHMJMAktCitSdWxlCUFsZ2VyaWEJMTkxNwlvbmx5CS0JTWFyCTI0CTIzOjAwcwkxOjAwCVMKK1J1bGUJQWxnZXJpYQkxOTE4CW9ubHkJLQlNYXIJIDkJMjM6MDBzCTE6MDAJUworUnVsZQlBbGdlcmlhCTE5MTkJb25seQktCU1hcgkgMQkyMzowMHMJMTowMAlTCitSdWxlCUFsZ2VyaWEJMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwcwkxOjAwCVMKK1J1bGUJQWxnZXJpYQkxOTIwCW9ubHkJLQlPY3QJMjMJMjM6MDBzCTAJLQorUnVsZQlBbGdlcmlhCTE5MjEJb25seQktCU1hcgkxNAkyMzowMHMJMTowMAlTCitSdWxlCUFsZ2VyaWEJMTkyMQlvbmx5CS0JSnVuCTIxCTIzOjAwcwkwCS0KK1J1bGUJQWxnZXJpYQkxOTM5CW9ubHkJLQlTZXAJMTEJMjM6MDBzCTE6MDAJUworUnVsZQlBbGdlcmlhCTE5MzkJb25seQktCU5vdgkxOQkgMTowMAkwCS0KK1J1bGUJQWxnZXJpYQkxOTQ0CTE5NDUJLQlBcHIJTW9uPj0xCSAyOjAwCTE6MDAJUworUnVsZQlBbGdlcmlhCTE5NDQJb25seQktCU9jdAkgOAkgMjowMAkwCS0KK1J1bGUJQWxnZXJpYQkxOTQ1CW9ubHkJLQlTZXAJMTYJIDE6MDAJMAktCitSdWxlCUFsZ2VyaWEJMTk3MQlvbmx5CS0JQXByCTI1CTIzOjAwcwkxOjAwCVMKK1J1bGUJQWxnZXJpYQkxOTcxCW9ubHkJLQlTZXAJMjYJMjM6MDBzCTAJLQorUnVsZQlBbGdlcmlhCTE5NzcJb25seQktCU1heQkgNgkgMDowMAkxOjAwCVMKK1J1bGUJQWxnZXJpYQkxOTc3CW9ubHkJLQlPY3QJMjEJIDA6MDAJMAktCitSdWxlCUFsZ2VyaWEJMTk3OAlvbmx5CS0JTWFyCTI0CSAxOjAwCTE6MDAJUworUnVsZQlBbGdlcmlhCTE5NzgJb25seQktCVNlcAkyMgkgMzowMAkwCS0KK1J1bGUJQWxnZXJpYQkxOTgwCW9ubHkJLQlBcHIJMjUJIDA6MDAJMTowMAlTCitSdWxlCUFsZ2VyaWEJMTk4MAlvbmx5CS0JT2N0CTMxCSAyOjAwCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwOjA5OjIwIGZvciBQYXJpcyBNZWFuIFRpbWU7IGdvIHdpdGggSG93c2UncworIyBtb3JlIHByZWNpc2UgMDowOToyMS4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0FsZ2llcnMJMDoxMjoxMiAtCUxNVAkxODkxIE1hciAxNSAwOjAxCisJCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCisJCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk0MCBGZWIgMjUgMjowMAorCQkJMTowMAlBbGdlcmlhCUNFJXNUCTE5NDYgT2N0ICA3CisJCQkwOjAwCS0JV0VUCTE5NTYgSmFuIDI5CisJCQkxOjAwCS0JQ0VUCTE5NjMgQXByIDE0CisJCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk3NyBPY3QgMjEKKwkJCTE6MDAJQWxnZXJpYQlDRSVzVAkxOTc5IE9jdCAyNgorCQkJMDowMAlBbGdlcmlhCVdFJXNUCTE5ODEgTWF5CisJCQkxOjAwCS0JQ0VUCisKKyMgQW5nb2xhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9MdWFuZGEJMDo1Mjo1NgktCUxNVAkxODkyCisJCQkwOjUyOjA0CS0JQU9UCTE5MTEgTWF5IDI2ICMgQW5nb2xhIFRpbWUKKwkJCTE6MDAJLQlXQVQKKworIyBCZW5pbgorIyBXaGl0bWFuIHNheXMgdGhleSBzd2l0Y2hlZCB0byAxOjAwIGluIDE5NDYsIG5vdCAxOTM0OworIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQWZyaWNhL1BvcnRvLU5vdm8JMDoxMDoyOAktCUxNVAkxOTEyCisJCQkwOjAwCS0JR01UCTE5MzQgRmViIDI2CisJCQkxOjAwCS0JV0FUCisKKyMgQm90c3dhbmEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0dhYm9yb25lCTE6NDM6NDAgLQlMTVQJMTg4NQorCQkJMjowMAktCUNBVAkxOTQzIFNlcCAxOSAyOjAwCisJCQkyOjAwCTE6MDAJQ0FTVAkxOTQ0IE1hciAxOSAyOjAwCisJCQkyOjAwCS0JQ0FUCisKKyMgQnVya2luYSBGYXNvCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFmcmljYS9PdWFnYWRvdWdvdQktMDowNjowNCAtCUxNVAkxOTEyCisJCQkgMDowMAktCUdNVAorCisjIEJ1cnVuZGkKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQWZyaWNhL0J1anVtYnVyYQkxOjU3OjI4CS0JTE1UCTE4OTAKKwkJCTI6MDAJLQlDQVQKKworIyBDYW1lcm9vbgorIyBXaGl0bWFuIHNheXMgdGhleSBzd2l0Y2hlZCB0byAxOjAwIGluIDE5MjA7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvRG91YWxhCTA6Mzg6NDgJLQlMTVQJMTkxMgorCQkJMTowMAktCVdBVAorCisjIENhcGUgVmVyZGUKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXRsYW50aWMvQ2FwZV9WZXJkZSAtMTozNDowNCAtCUxNVAkxOTA3CQkJIyBQcmFpYQorCQkJLTI6MDAJLQlDVlQJMTk0MiBTZXAKKwkJCS0yOjAwCTE6MDAJQ1ZTVAkxOTQ1IE9jdCAxNQorCQkJLTI6MDAJLQlDVlQJMTk3NSBOb3YgMjUgMjowMAorCQkJLTE6MDAJLQlDVlQKKworIyBDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0Jhbmd1aQkxOjE0OjIwCS0JTE1UCTE5MTIKKwkJCTE6MDAJLQlXQVQKKworIyBDaGFkCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9OZGphbWVuYQkxOjAwOjEyIC0JTE1UCTE5MTIKKwkJCTE6MDAJLQlXQVQJMTk3OSBPY3QgMTQKKwkJCTE6MDAJMTowMAlXQVNUCTE5ODAgTWFyICA4CisJCQkxOjAwCS0JV0FUCisKKyMgQ29tb3JvcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlJbmRpYW4vQ29tb3JvCTI6NTM6MDQgLQlMTVQJMTkxMSBKdWwgICAjIE1vcm9uaSwgR3JhbiBDb21vcm8KKwkJCTM6MDAJLQlFQVQKKworIyBEZW1vY3JhdGljIFJlcHVibGljIG9mIENvbmdvCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFmcmljYS9LaW5zaGFzYQkxOjAxOjEyIC0JTE1UCTE4OTcgTm92IDkKKwkJCTE6MDAJLQlXQVQKK1pvbmUgQWZyaWNhL0x1YnVtYmFzaGkJMTo0OTo1MiAtCUxNVAkxODk3IE5vdiA5CisJCQkyOjAwCS0JQ0FUCisKKyMgUmVwdWJsaWMgb2YgdGhlIENvbmdvCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFmcmljYS9CcmF6emF2aWxsZQkxOjAxOjA4IC0JTE1UCTE5MTIKKwkJCTE6MDAJLQlXQVQKKworIyBDb3RlIEQnSXZvaXJlCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9BYmlkamFuCS0wOjE2OjA4IC0JTE1UCTE5MTIKKwkJCSAwOjAwCS0JR01UCisKKyMgRGppYm91dGkKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0RqaWJvdXRpCTI6NTI6MzYgLQlMTVQJMTkxMSBKdWwKKwkJCTM6MDAJLQlFQVQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEVneXB0CisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUVneXB0CTE5NDAJb25seQktCUp1bAkxNQkwOjAwCTE6MDAJUworUnVsZQlFZ3lwdAkxOTQwCW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KK1J1bGUJRWd5cHQJMTk0MQlvbmx5CS0JQXByCTE1CTA6MDAJMTowMAlTCitSdWxlCUVneXB0CTE5NDEJb25seQktCVNlcAkxNgkwOjAwCTAJLQorUnVsZQlFZ3lwdAkxOTQyCTE5NDQJLQlBcHIJIDEJMDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMTk0Mglvbmx5CS0JT2N0CTI3CTA6MDAJMAktCitSdWxlCUVneXB0CTE5NDMJMTk0NQktCU5vdgkgMQkwOjAwCTAJLQorUnVsZQlFZ3lwdAkxOTQ1CW9ubHkJLQlBcHIJMTYJMDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMTk1Nwlvbmx5CS0JTWF5CTEwCTA6MDAJMTowMAlTCitSdWxlCUVneXB0CTE5NTcJMTk1OAktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlFZ3lwdAkxOTU4CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMTk1OQkxOTgxCS0JTWF5CSAxCTE6MDAJMTowMAlTCitSdWxlCUVneXB0CTE5NTkJMTk2NQktCVNlcAkzMAkzOjAwCTAJLQorUnVsZQlFZ3lwdAkxOTY2CTE5OTQJLQlPY3QJIDEJMzowMAkwCS0KK1J1bGUJRWd5cHQJMTk4Mglvbmx5CS0JSnVsCTI1CTE6MDAJMTowMAlTCitSdWxlCUVneXB0CTE5ODMJb25seQktCUp1bAkxMgkxOjAwCTE6MDAJUworUnVsZQlFZ3lwdAkxOTg0CTE5ODgJLQlNYXkJIDEJMTowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMTk4OQlvbmx5CS0JTWF5CSA2CTE6MDAJMTowMAlTCitSdWxlCUVneXB0CTE5OTAJMTk5NAktCU1heQkgMQkxOjAwCTE6MDAJUworIyBJQVRBIChhZnRlciAxOTkwKSBzYXlzIHRyYW5zaXRpb25zIGFyZSBhdCAwOjAwLgorIyBHbyB3aXRoIElBVEEgc3RhcnRpbmcgaW4gMTk5NSwgZXhjZXB0IGNvcnJlY3QgMTk5NSBlbnRyeSBmcm9tIDA5LTMwIHRvIDA5LTI5LgorUnVsZQlFZ3lwdAkxOTk1CW1heAktCUFwcglsYXN0RnJpCSAwOjAwcwkxOjAwCVMKK1J1bGUJRWd5cHQJMTk5NQkyMDA1CS0JU2VwCWxhc3RUaHUJMjM6MDBzCTAJLQorIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOS0xOSk6CisjIFRoZSBFZ3lwdGlhbiBHYXpldHRlLCBpc3N1ZSA0MSwwOTAgKDIwMDYtMDktMTgpLCBwYWdlIDEsIHJlcG9ydHM6CisjIEVneXB0IHdpbGwgdHVybiBiYWNrIGNsb2NrcyBieSBvbmUgaG91ciBhdCB0aGUgbWlkbmlnaHQgb2YgVGh1cnNkYXkKKyMgYWZ0ZXIgb2JzZXJ2aW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBzaW5jZSBNYXkuCisjIGh0dHA6Ly9uZXdzLmdvbS5jb20uZWcvZ2F6ZXR0ZS9wZGYvMjAwNi8wOS8xOC8wMS5wZGYKK1J1bGUJRWd5cHQJMjAwNglvbmx5CS0JU2VwCTIxCTIzOjAwcwkwCS0KKyMgRnJvbSBEaXJrIExvc2NoICgyMDA3LTA4LTE0KToKKyMgSSByZWNlaXZlZCBhIG1haWwgZnJvbSBhbiBhaXJsaW5lIHdoaWNoIHNheXMgdGhhdCB0aGUgZGF5bGlnaHQKKyMgc2F2aW5nIHRpbWUgaW4gRWd5cHQgd2lsbCBlbmQgaW4gdGhlIG5pZ2h0IG9mIDIwMDctMDktMDYgdG8gMjAwNy0wOS0wNy4KKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDctMDgtMTUpOiBbVGhlIGZvbGxvd2luZyBhZ3JlZTpdCisjIGh0dHA6Ly93d3cubmVudGplcy5pbmZvL0JpbGwvYmlsbDUuaHRtIAorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2NpdHkuaHRtbD9uPTUzCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTA5LTA0KTogVGhlIG9mZmljaWFsIGluZm9ybWF0aW9uLi4uOgorIyBodHRwOi8vd3d3LnNpcy5nb3YuZWcvRW4vRWd5cHRPbmxpbmUvTWlzY2VsbGFuZW91cy8wMDAwMDIvMDIwNzAwMDAwMDAwMDAwMDAwMTU4MC5odG0KK1J1bGUJRWd5cHQJMjAwNwlvbmx5CS0JU2VwCVRodT49MQkyMzowMHMJMAktCisjIEZyb20gQWJkZWxyYWhtYW4gSGFzc2FuICgyMDA3LTA5LTA2KToKKyMgRHVlIHRvIHRoZSBIaWpyaSAobHVuYXIgSXNsYW1pYyBjYWxlbmRhcikgeWVhciBiZWluZyAxMSBkYXlzIHNob3J0ZXIKKyMgdGhhbiB0aGUgeWVhciBvZiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyLCBSYW1hZGFuIHNoaWZ0cyBlYXJsaWVyIGVhY2gKKyMgeWVhci4gVGhpcyB5ZWFyIGl0IHdpbGwgYmUgb2JzZXJ2ZWQgU2VwdGVtYmVyIDEzIChTZXB0ZW1iZXIgaXMgcXVpdGUKKyMgaG90IGluIEVneXB0KSwgYW5kIHRoZSBpZGVhIGlzIHRvIG1ha2UgZmFzdGluZyBlYXNpZXIgZm9yIHdvcmtlcnMgYnkKKyMgc2hpZnRpbmcgYnVzaW5lc3MgaG91cnMgb25lIGhvdXIgb3V0IG9mIGRheXRpbWUgaGVhdC4gQ29uc2VxdWVudGx5LAorIyB1bmxlc3MgZGlzY29udGludWVkLCBuZXh0IERTVCBtYXkgZW5kIFRodXJzZGF5IDI4IEF1Z3VzdCAyMDA4LgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA4LTE3KToKKyMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGFzc3VtZSB0aGUgbmV3IHJ1bGUgaXMgbGFzdCBUaHVyc2RheSBpbiBBdWd1c3QuCisKKyMgRnJvbSBQZXRyIE1hY2hhdGEgKDIwMDktMDQtMDYpOgorIyBUaGUgZm9sbG93aW5nIGFwcGVhcmVkIGluIFJlZCBIYXQgYnVnemlsbGFbMV0gKGVkaXRlZCk6CisjCisjID4gJCB6ZHVtcCAtdiAvdXNyL3NoYXJlL3pvbmVpbmZvL0FmcmljYS9DYWlybyB8IGdyZXAgMjAwOQorIyA+IC91c3Ivc2hhcmUvem9uZWluZm8vQWZyaWNhL0NhaXJvICBUaHUgQXByIDIzIDIxOjU5OjU5IDIwMDkgVVRDID0gVGh1ID0KKyMgQXByIDIzCisjID4gMjM6NTk6NTkgMjAwOSBFRVQgaXNkc3Q9MCBnbXRvZmY9NzIwMAorIyA+IC91c3Ivc2hhcmUvem9uZWluZm8vQWZyaWNhL0NhaXJvICBUaHUgQXByIDIzIDIyOjAwOjAwIDIwMDkgVVRDID0gRnJpID0KKyMgQXByIDI0CisjID4gMDE6MDA6MDAgMjAwOSBFRVNUIGlzZHN0PTEgZ210b2ZmPTEwODAwCisjID4gL3Vzci9zaGFyZS96b25laW5mby9BZnJpY2EvQ2Fpcm8gIFRodSBBdWcgMjcgMjA6NTk6NTkgMjAwOSBVVEMgPSBUaHUgPQorIyBBdWcgMjcKKyMgPiAyMzo1OTo1OSAyMDA5IEVFU1QgaXNkc3Q9MSBnbXRvZmY9MTA4MDAKKyMgPiAvdXNyL3NoYXJlL3pvbmVpbmZvL0FmcmljYS9DYWlybyAgVGh1IEF1ZyAyNyAyMTowMDowMCAyMDA5IFVUQyA9IFRodSA9CisjIEF1ZyAyNworIyA+IDIzOjAwOjAwIDIwMDkgRUVUIGlzZHN0PTAgZ210b2ZmPTcyMDAKKyMKKyMgPiBlbmQgZGF0ZSBzaG91bGQgYmUgVGh1IFNlcCAyNCAyMDA5IChMYXN0IFRodXJzZGF5IGluIFNlcHRlbWJlciBhdCAyMzo1OT0KKyMgOjU5KQorIyA+IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvOTU4NzI5LworIworIyB0aW1lYW5kZGF0ZVsyXSBhbmQgYW5vdGhlciBzaXRlIEkndmUgZm91bmRbM10gYWxzbyBzdXBwb3J0IHRoYXQuCisjCisjIFsxXSA8YSBocmVmPSJodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ5MjI2MyI+CisjIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMjYzCisjIDwvYT4KKyMgWzJdIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2xvY2tjaGFuZ2UuaHRtbD9uPTUzIj4KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jbG9ja2NoYW5nZS5odG1sP249NTMKKyMgPC9hPgorIyBbM10gPGEgaHJlZj0iaHR0cDovL3d3cC5ncmVlbndpY2htZWFudGltZS5jb20vdGltZS16b25lL2FmcmljYS9lZ3lwdC8iPgorIyBodHRwOi8vd3dwLmdyZWVud2ljaG1lYW50aW1lLmNvbS90aW1lLXpvbmUvYWZyaWNhL2VneXB0LworIyA8L2E+CisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDQtMjApOgorIyBJbiAyMDA5IChhbmQgZm9yIHRoZSBuZXh0IHNldmVyYWwgeWVhcnMpLCBSYW1hZGFuIGVuZHMgYmVmb3JlIHRoZSBmb3VydGgKKyMgVGh1cnNkYXkgaW4gU2VwdGVtYmVyOyBFZ3lwdCBpcyBleHBlY3RlZCB0byByZXZlcnQgdG8gdGhlIGxhc3QgVGh1cnNkYXkKKyMgaW4gU2VwdGVtYmVyLgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA4LTExKToKKyMgV2UgaGF2ZSBiZWVuIGFibGUgdG8gY29uZmlybSB0aGUgQXVndXN0IGNoYW5nZSB3aXRoIHRoZSBFZ3lwdGlhbiBDYWJpbmV0IAorIyBJbmZvcm1hdGlvbiBhbmQgRGVjaXNpb24gU3VwcG9ydCBDZW50ZXI6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9lZ3lwdC1kc3QtZW5kcy0yMDA5Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZWd5cHQtZHN0LWVuZHMtMjAwOS5odG1sCisjIDwvYT4KKyMgCisjIFRoZSBNaWRkbGUgRWFzdCBOZXdzIEFnZW5jeQorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgiPgorIyBodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgKKyMgPC9hPgorIyBhbHNvIHJlcG9ydHMgIkVneXB0IHN0YXJ0cyB3aW50ZXIgdGltZSBvbiBBdWd1c3QgMjEiCisjIHRvZGF5IGluIGFydGljbGUgbnVtYmVyZWQgIjcxLCAxMS8wOC8yMDA5IDEyOjI1IEdNVC4iIAorIyBPbmx5IHRoZSB0aXRsZSBhYm92ZSBpcyBhdmFpbGFibGUgd2l0aG91dCBhIHN1YnNjcmlwdGlvbiB0byB0aGVpciBzZXJ2aWNlLAorIyBhbmQgY2FuIGJlIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3IgIndpbnRlciIgaW4gdGhlaXIgc2VhcmNoIGVuZ2luZQorIyAoYXQgbGVhc3QgdG9kYXkpLgorCitSdWxlCUVneXB0CTIwMDgJb25seQktCUF1ZwlsYXN0VGh1CTIzOjAwcwkwCS0KK1J1bGUJRWd5cHQJMjAwOQlvbmx5CS0JQXVnCTIwCTIzOjAwcwkwCS0KK1J1bGUJRWd5cHQJMjAxMAltYXgJLQlTZXAJbGFzdFRodQkyMzowMHMJMAktCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0NhaXJvCTI6MDU6MDAgLQlMTVQJMTkwMCBPY3QKKwkJCTI6MDAJRWd5cHQJRUUlc1QKKworIyBFcXVhdG9yaWFsIEd1aW5lYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTWFsYWJvCTA6MzU6MDggLQlMTVQJMTkxMgorCQkJMDowMAktCUdNVAkxOTYzIERlYyAxNQorCQkJMTowMAktCVdBVAorCisjIEVyaXRyZWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0FzbWFyYQkyOjM1OjMyIC0JTE1UCTE4NzAKKwkJCTI6MzU6MzIJLQlBTVQJMTg5MAkgICAgICAjIEFzbWFyYSBNZWFuIFRpbWUKKwkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKKwkJCTM6MDAJLQlFQVQKKworIyBFdGhpb3BpYQorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRXRoaW9waWEgaGFkIHNpeCBuYXJyb3dseS1zcGFjZWQgdGltZSB6b25lcworIyBiZXR3ZWVuIDE4NzAgYW5kIDE4OTAsIGFuZCB0aGF0IHRoZXkgbWVyZ2VkIHRvIDM4RTUwICgyOjM1OjIwKSBpbiAxODkwLgorIyBXZSdsbCBndWVzcyB0aGF0IDM4RTUwIGlzIGZvciBBZGlzIERlcmEuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFmcmljYS9BZGRpc19BYmFiYQkyOjM0OjQ4IC0JTE1UCTE4NzAKKwkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKKwkJCTM6MDAJLQlFQVQKKworIyBHYWJvbgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBZnJpY2EvTGlicmV2aWxsZQkwOjM3OjQ4IC0JTE1UCTE5MTIKKwkJCTE6MDAJLQlXQVQKKworIyBHYW1iaWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0Jhbmp1bAktMTowNjozNiAtCUxNVAkxOTEyCisJCQktMTowNjozNiAtCUJNVAkxOTM1CSMgQmFuanVsIE1lYW4gVGltZQorCQkJLTE6MDAJLQlXQVQJMTk2NAorCQkJIDA6MDAJLQlHTVQKKworIyBHaGFuYQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKKyMgV2hpdG1hbiBzYXlzIERTVCB3YXMgb2JzZXJ2ZWQgZnJvbSAxOTMxIHRvIGBgdGhlIHByZXNlbnQnJzsKKyMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCUdoYW5hCTE5MzYJMTk0MgktCVNlcAkgMQkwOjAwCTA6MjAJR0hTVAorUnVsZQlHaGFuYQkxOTM2CTE5NDIJLQlEZWMJMzEJMDowMAkwCUdNVAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvQWNjcmEJLTA6MDA6NTIgLQlMTVQJMTkxOAorCQkJIDA6MDAJR2hhbmEJJXMKKworIyBHdWluZWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0NvbmFrcnkJLTA6NTQ6NTIgLQlMTVQJMTkxMgorCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKKwkJCS0xOjAwCS0JV0FUCTE5NjAKKwkJCSAwOjAwCS0JR01UCisKKyMgR3VpbmVhLUJpc3NhdQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvQmlzc2F1CS0xOjAyOjIwIC0JTE1UCTE5MTEgTWF5IDI2CisJCQktMTowMAktCVdBVAkxOTc1CisJCQkgMDowMAktCUdNVAorCisjIEtlbnlhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9OYWlyb2JpCTI6Mjc6MTYJLQlMTVQJMTkyOCBKdWwKKwkJCTM6MDAJLQlFQVQJMTkzMAorCQkJMjozMAktCUJFQVQJMTk0MAorCQkJMjo0NDo0NQktCUJFQVVUCTE5NjAKKwkJCTM6MDAJLQlFQVQKKworIyBMZXNvdGhvCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9NYXNlcnUJMTo1MDowMCAtCUxNVAkxOTAzIE1hcgorCQkJMjowMAktCVNBU1QJMTk0MyBTZXAgMTkgMjowMAorCQkJMjowMAkxOjAwCVNBU1QJMTk0NCBNYXIgMTkgMjowMAorCQkJMjowMAktCVNBU1QKKworIyBMaWJlcmlhCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBJbiAxOTcyIExpYmVyaWEgd2FzIHRoZSBsYXN0IGNvdW50cnkgdG8gc3dpdGNoCisjIGZyb20gYSBVVEMgb2Zmc2V0IHRoYXQgd2FzIG5vdCBhIG11bHRpcGxlIG9mIDE1IG9yIDIwIG1pbnV0ZXMuCisjIEhvd3NlIHJlcG9ydHMgdGhhdCBpdCB3YXMgaW4gaG9ub3Igb2YgdGhlaXIgcHJlc2lkZW50J3MgYmlydGhkYXkuCisjIFNoYW5rICYgUG90dGVuZ2VyIHJlcG9ydCB0aGUgZGF0ZSBhcyBNYXkgMSwgd2hlcmVhcyBIb3dzZSByZXBvcnRzIEphbjsKKyMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCisjIEZvciBMaWJlcmlhIGJlZm9yZSAxOTcyLCBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IC0wOjQ0LCB3aGVyZWFzIEhvd3NlIGFuZAorIyBXaGl0bWFuIGVhY2ggcmVwb3J0IC0wOjQ0OjMwOyBnbyB3aXRoIHRoZSBtb3JlIHByZWNpc2UgZmlndXJlLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTW9ucm92aWEJLTA6NDM6MDggLQlMTVQJMTg4MgorCQkJLTA6NDM6MDggLQlNTVQJMTkxOSBNYXIgIyBNb25yb3ZpYSBNZWFuIFRpbWUKKwkJCS0wOjQ0OjMwIC0JTFJUCTE5NzIgTWF5ICMgTGliZXJpYSBUaW1lCisJCQkgMDowMAktCUdNVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTGlieWEKKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTGlieWEJMTk1MQlvbmx5CS0JT2N0CTE0CTI6MDAJMTowMAlTCitSdWxlCUxpYnlhCTE5NTIJb25seQktCUphbgkgMQkwOjAwCTAJLQorUnVsZQlMaWJ5YQkxOTUzCW9ubHkJLQlPY3QJIDkJMjowMAkxOjAwCVMKK1J1bGUJTGlieWEJMTk1NAlvbmx5CS0JSmFuCSAxCTA6MDAJMAktCitSdWxlCUxpYnlhCTE5NTUJb25seQktCVNlcAkzMAkwOjAwCTE6MDAJUworUnVsZQlMaWJ5YQkxOTU2CW9ubHkJLQlKYW4JIDEJMDowMAkwCS0KK1J1bGUJTGlieWEJMTk4MgkxOTg0CS0JQXByCSAxCTA6MDAJMTowMAlTCitSdWxlCUxpYnlhCTE5ODIJMTk4NQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlMaWJ5YQkxOTg1CW9ubHkJLQlBcHIJIDYJMDowMAkxOjAwCVMKK1J1bGUJTGlieWEJMTk4Nglvbmx5CS0JQXByCSA0CTA6MDAJMTowMAlTCitSdWxlCUxpYnlhCTE5ODYJb25seQktCU9jdAkgMwkwOjAwCTAJLQorUnVsZQlMaWJ5YQkxOTg3CTE5ODkJLQlBcHIJIDEJMDowMAkxOjAwCVMKK1J1bGUJTGlieWEJMTk4NwkxOTg5CS0JT2N0CSAxCTA6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9Ucmlwb2xpCTA6NTI6NDQgLQlMTVQJMTkyMAorCQkJMTowMAlMaWJ5YQlDRSVzVAkxOTU5CisJCQkyOjAwCS0JRUVUCTE5ODIKKwkJCTE6MDAJTGlieWEJQ0Ulc1QJMTk5MCBNYXkgIDQKKyMgVGhlIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjsKKyMgdGhlIElBVEEgU1NJTSBkYXRhIGNvbnRhaW4gc29tZSBvYnZpb3VzIGVycm9ycy4KKwkJCTI6MDAJLQlFRVQJMTk5NiBTZXAgMzAKKwkJCTE6MDAJLQlDRVQJMTk5NyBBcHIgIDQKKwkJCTE6MDAJMTowMAlDRVNUCTE5OTcgT2N0ICA0CisJCQkyOjAwCS0JRUVUCisKKyMgTWFkYWdhc2NhcgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBJbmRpYW4vQW50YW5hbmFyaXZvIDM6MTA6MDQgLQlMTVQJMTkxMSBKdWwKKwkJCTM6MDAJLQlFQVQJMTk1NCBGZWIgMjcgMjM6MDBzCisJCQkzOjAwCTE6MDAJRUFTVAkxOTU0IE1heSAyOSAyMzowMHMKKwkJCTM6MDAJLQlFQVQKKworIyBNYWxhd2kKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0JsYW50eXJlCTI6MjA6MDAgLQlMTVQJMTkwMyBNYXIKKwkJCTI6MDAJLQlDQVQKKworIyBNYWxpCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9CYW1ha28JLTA6MzI6MDAgLQlMTVQJMTkxMgorCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKKwkJCS0xOjAwCS0JV0FUCTE5NjAgSnVuIDIwCisJCQkgMDowMAktCUdNVAorCisjIE1hdXJpdGFuaWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQWZyaWNhL05vdWFrY2hvdHQJLTE6MDM6NDggLQlMTVQJMTkxMgorCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKKwkJCS0xOjAwCS0JV0FUCTE5NjAgTm92IDI4CisJCQkgMDowMAktCUdNVAorCisjIE1hdXJpdGl1cworCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA2LTI1KToKKyMgTWF1cml0aXVzIHBsYW5zIHRvIG9ic2VydmUgRFNUIGZyb20gMjAwOC0xMS0wMSB0byAyMDA5LTAzLTMxIG9uIGEgdHJpYWwKKyMgYmFzaXMuLi4uCisjIEl0IHNlZW1zIHRoYXQgTWF1cml0aXVzIG9ic2VydmVkIGRheWxpZ2h0IHNhdmluZyB0aW1lIGZyb20gMTk4Mi0xMC0xMCB0byAKKyMgMTk4My0wMy0yMCBhcyB3ZWxsLCBidXQgdGhhdCB3YXMgbm90IHN1Y2Nlc3NmdWwuLi4uCisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tYXVyaXRpdXMtZGF5bGlnaHQtc2F2aW5nLXRpbWUuaHRtbAorCisjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNi0yNSk6CisjIGh0dHA6Ly9lY29ub21pY2RldmVsb3BtZW50Lmdvdi5tdS9wb3J0YWwvc2l0ZS9NYWluaG9tZXBhZ2UvbWVudWl0ZW0uYTQyYjI0MTI4MTA0ZDk4NDVkYWJkZGQxNTQ1MDhhMGMvP2NvbnRlbnRfaWQ9MGE3Y2VlOGI1ZDY5YTExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA2LTMwKToKKyMgVGhlIHd3dy50aW1lYW5kZGF0ZS5jb20gYXJ0aWNsZSBjaXRlZCBieSBTdGVmZmVuIFRob3JzZW4gbm90ZXMgdGhhdCAiQQorIyBmaW5hbCBkZWNpc2lvbiBoYXMgeWV0IHRvIGJlIG1hZGUgb24gdGhlIHRpbWVzIHRoYXQgZGF5bGlnaHQgc2F2aW5nCisjIHdvdWxkIGJlZ2luIGFuZCBlbmQgb24gdGhlc2UgZGF0ZXMuIiBBcyBhIHBsYWNlIGhvbGRlciwgdXNlIG1pZG5pZ2h0LgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDYtMzApOgorIyBGb2xsb3cgVGhvcnNlbiBvbiBEU1QgaW4gMTk4Mi8xOTgzLCBpbnN0ZWFkIG9mIFNoYW5rcyAmIFBvdHRlbmdlci4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wNy0xMCk6CisjIEFjY29yZGluZyB0bworIyA8YSBocmVmPSJodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYiPgorIyBodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYKKyMgPC9hPgorIyAoaW4gRnJlbmNoKSwgTWF1cml0aXVzIHdpbGwgc3RhcnQgYW5kIGVuZCB0aGVpciBEU1QgYSBmZXcgZGF5cyBlYXJsaWVyCisjIHRoYW4gcHJldmlvdXNseSBhbm5vdW5jZWQgKDIwMDgtMTEtMDEgdG8gMjAwOS0wMy0zMSkuICBUaGUgbmV3IHN0YXJ0CisjIGRhdGUgaXMgMjAwOC0xMC0yNiBhdCAwMjowMCBhbmQgdGhlIG5ldyBlbmQgZGF0ZSBpcyAyMDA5LTAzLTI3IChubyB0aW1lCisjIGdpdmVuLCBidXQgaXQgaXMgcHJvYmFibHkgYXQgZWl0aGVyIDIgb3IgMyB3YWxsIGNsb2NrIHRpbWUpLgorIyAKKyMgQSBsaXR0bGUgc3RyYW5nZSB0aG91Z2gsIHNpbmNlIHRoZSBhcnRpY2xlIHNheXMgdGhhdCB0aGV5IG1vdmVkIHRoZSBkYXRlIAorIyB0byBhbGlnbiBpdHNlbGYgd2l0aCBFdXJvcGUgYW5kIFVTQSB3aGljaCBhbHNvIGNoYW5nZSB0aW1lIG9uIHRoYXQgZGF0ZSwgCisjIGJ1dCB0aGF0IG1lYW5zIHRoZXkgaGF2ZSBub3QgcGFpZCBhdHRlbnRpb24gdG8gd2hhdCBoYXBwZW5lZCBpbiAKKyMgVVNBL0NhbmFkYSBsYXN0IHllYXIgKERTVCBlbmRzIGZpcnN0IFN1bmRheSBpbiBOb3ZlbWJlcikuIEkgYWxzbyB3b25kZXIgCisjIHdoeSB0aGF0IHRoZXkgZW5kIG9uIGEgRnJpZGF5LCBpbnN0ZWFkIG9mIGFsaWduaW5nIHdpdGggRXVyb3BlIHdoaWNoIAorIyBjaGFuZ2VzIHR3byBkYXlzIGxhdGVyLgorCisjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNy0xMSk6CisjIFNlZW1zIHRoYXQgRW5nbGlzaCBsYW5ndWFnZSBhcnRpY2xlICJUaGUgcmV2aXZhbCBvZiBkYXlsaWdodCBzYXZpbmcKKyMgdGltZTogIEVuZXJneSBjb25zZXJ2YXRpb24/Ii0jIE5vLiAxNjU3OCAoMDcvMTEvMjAwOCkgd2FzIG9yaWdpbmFsbHkKKyMgcHVibGlzaGVkIG9uIE1vbmRheSwgSnVuZSAzMCwgMjAwOC4uLgorIworIyBJIGd1ZXNzIHRoYXQgYXJ0aWNsZSBpbiBGcmVuY2ggIkxlIGdvdXZlcm5lbWVudCBhdmFuY2UgbCdpbnRyb2R1Y3Rpb24KKyMgZGUgbCdoZXVyZSBkJ2V0ZSIgc3RhdGluZyB0aGF0IERTVCBpbiBNYXVyaXRpdXMgc3RhcnRpbmcgb24gT2N0b2JlciAyNgorIyBhbmQgZW5kaW5nIG9uIE1hcmNoIDI3LCAyMDA5IGlzIHRoZSBtb3N0IHJlY2VudCBvbmUuCisjIC4uLgorIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwKKyMgPC9hPgorCisjIEZyb20gUmlhZCBNLiBIb3NzZW4gQWxseSAoMjAwOC0wOC0wMyk6CisjIFRoZSBHb3Zlcm5tZW50IG9mIE1hdXJpdGl1cyB3ZWJsaW5rCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRCI+CisjIGh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAorIyA8L2E+CisjIENhYmluZXQgRGVjaXNpb24gb2YgSnVseSAxOHRoLCAyMDA4IHN0YXRlcyBhcyBmb2xsb3dzOgorIworIyA0LiAuLi5DYWJpbmV0IGhhcyBhZ3JlZWQgdG8gdGhlIGludHJvZHVjdGlvbiBpbnRvIHRoZSBOYXRpb25hbCBBc3NlbWJseQorIyBvZiB0aGUgVGltZSBCaWxsIHdoaWNoIHByb3ZpZGVzIGZvciB0aGUgaW50cm9kdWN0aW9uIG9mIHN1bW1lciB0aW1lIGluCisjIE1hdXJpdGl1cy4gVGhlIHN1bW1lciB0aW1lIHBlcmlvZCB3aGljaCB3aWxsIGJlIG9mIG9uZSBob3VyIGFoZWFkIG9mCisjIHRoZSBzdGFuZGFyZCB0aW1lLCB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGF0IGluIEV1cm9wZSBhbmQgdGhlIFVuaXRlZAorIyBTdGF0ZXMgb2YgQW1lcmljYS4gSXQgd2lsbCBzdGFydCBhdCB0d28gbydjbG9jayBpbiB0aGUgbW9ybmluZyBvbiB0aGUKKyMgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBhbmQgd2lsbCBlbmQgYXQgdHdvIG8nY2xvY2sgaW4gdGhlIG1vcm5pbmcgb24KKyMgdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIHRoZSBmb2xsb3dpbmcgeWVhci4gVGhlIHN1bW1lciB0aW1lIGZvciB0aGUKKyMgeWVhciAyMDA4IC0gMjAwOSB3aWxsLCB0aGVyZWZvcmUsIGJlIGVmZmVjdGl2ZSBhcyBmcm9tIDI2IE9jdG9iZXIgMjAwOAorIyBhbmQgZW5kIG9uIDI5IE1hcmNoIDIwMDkuCisKKyMgRnJvbSBFZCBNYXN0ZSAoMjAwOC0xMC0wNyk6CisjIFRIRSBUSU1FIEJJTEwgKE5vLiBYWFZJSSBvZiAyMDA4KSBFeHBsYW5hdG9yeSBNZW1vcmFuZHVtIHN0YXRlcyB0aGUKKyMgYmVnaW5uaW5nIC8gZW5kaW5nIG9mIHN1bW1lciB0aW1lIGlzIDIgbydjbG9jayBzdGFuZGFyZCB0aW1lIGluIHRoZQorIyBtb3JuaW5nIG9mIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIC8gbGFzdCBTdW5kYXkgb2YgTWFyY2guCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9nb2MvYXNzZW1ibHlzaXRlL2ZpbGUvYmlsbDI3MDgucGRmIj4KKyMgaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL2dvYy9hc3NlbWJseXNpdGUvZmlsZS9iaWxsMjcwOC5wZGYKKyMgPC9hPgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA2LTA1KToKKyMgQWNjb3JkaW5nIHRvIHNldmVyYWwgc291cmNlcywgTWF1cml0aXVzIHdpbGwgbm90IGNvbnRpbnVlIHRvIG9ic2VydmUKKyMgRFNUIHRoZSBjb21pbmcgc3VtbWVyLi4uCisjCisjIFNvbWUgc291cmNlcywgaW4gRnJlbmNoOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmRlZmltZWRpYS5pbmZvL25ld3MvOTQ2L1Jhc2hpZC1CZWViZWVqYXVuLTotJUMyJUFCLUwlRTIlODAlOTloZXVyZS1kJUUyJTgwJTk5JUMzJUE5dCVDMyVBOS1uZS1zZXJhLXBhcy1hcHBsaXF1JUMzJUE5ZS1jZXR0ZS1hbm4lQzMlQTllLSVDMiVCQiI+CisjIGh0dHA6Ly93d3cuZGVmaW1lZGlhLmluZm8vbmV3cy85NDYvUmFzaGlkLUJlZWJlZWphdW4tOi0lQzIlQUItTCVFMiU4MCU5OWhldXJlLWQlRTIlODAlOTklQzMlQTl0JUMzJUE5LW5lLXNlcmEtcGFzLWFwcGxpcXUlQzMlQTllLWNldHRlLWFubiVDMyVBOWUtJUMyJUJCCisjIDwvYT4KKyMgPGEgaHJlZj0iaHR0cDovL2xleHByZXNzLm11L1N0b3J5LzMzOTh+QmVlYmVlamF1bi0tLUxlcy1vYmplY3RpZnMtZC0lQzMlQTljb25vbWllLWQtJUMzJUE5bmVyZ2llLWRlLWwtaGV1cmUtZC0lQzMlQTl0JUMzJUE5LW9udC0lQzMlQTl0JUMzJUE5LWF0dGVpbnRzLSI+CisjIGh0dHA6Ly9sZXhwcmVzcy5tdS9TdG9yeS8zMzk4fkJlZWJlZWphdW4tLS1MZXMtb2JqZWN0aWZzLWQtJUMzJUE5Y29ub21pZS1kLSVDMyVBOW5lcmdpZS1kZS1sLWhldXJlLWQtJUMzJUE5dCVDMyVBOS1vbnQtJUMzJUE5dCVDMyVBOS1hdHRlaW50cy0KKyMgPC9hPgorIworIyBPdXIgd3JhcC11cDoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbWF1cml0aXVzLWRzdC13aWxsLW5vdC1yZXBlYXQuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDctMTEpOgorIyBUaGUgIm1hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0IiB3cmFwdXAgaW5jbHVkZXMgdGhpczogCisjICJUaGUgdHJpYWwgZW5kZWQgb24gTWFyY2ggMjksIDIwMDksIHdoZW4gdGhlIGNsb2NrcyBtb3ZlZCBiYWNrIGJ5IG9uZSBob3VyCisjIGF0IDJhbSAob3IgMDI6MDApIGxvY2FsIHRpbWUuLi4iCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlIE1hdXJpdGl1cwkxOTgyCW9ubHkJLQlPY3QJMTAJMDowMAkxOjAwCVMKK1J1bGUgTWF1cml0aXVzCTE5ODMJb25seQktCU1hcgkyMQkwOjAwCTAJLQorUnVsZSBNYXVyaXRpdXMJMjAwOAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCVMKK1J1bGUgTWF1cml0aXVzCTIwMDkJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEluZGlhbi9NYXVyaXRpdXMJMzo1MDowMCAtCUxNVAkxOTA3CQkjIFBvcnQgTG91aXMKKwkJCTQ6MDAgTWF1cml0aXVzCU1VJXNUCSMgTWF1cml0aXVzIFRpbWUKKyMgQWdhbGVnYSBJcywgUm9kcmlndWV6CisjIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEluZGlhbi9NYXVyaXRpdXMKKworIyBNYXlvdHRlCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUluZGlhbi9NYXlvdHRlCTM6MDA6NTYgLQlMTVQJMTkxMSBKdWwJIyBNYW1vdXR6b3UKKwkJCTM6MDAJLQlFQVQKKworIyBNb3JvY2NvCisjIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgU3BhbmlzaCBNb3JvY2NvIChBZnJpY2EvQ2V1dGEpLgorCisjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0wOSk6CisjIEhlcmUgaXMgYW4gYXJ0aWNsZSB0aGF0IE1vcm9jY28gcGxhbiB0byBpbnRyb2R1Y2UgRGF5bGlnaHQgU2F2aW5nIFRpbWUgYmV0d2VlbgorIyAxIEp1bmUsIDIwMDggYW5kIDI3IFNlcHRlbWJlciwgMjAwOC4KKyMKKyMgIi4uLiBNb3JvY2NvIGlzIHRvIHNhdmUgZW5lcmd5IGJ5IGFkanVzdGluZyBpdHMgY2xvY2sgZHVyaW5nIHN1bW1lciBzbyBpdCB3aWxsCisjIGJlIG9uZSBob3VyIGFoZWFkIG9mIEdNVCBiZXR3ZWVuIDEgSnVuZSBhbmQgMjcgU2VwdGVtYmVyLCBhY2NvcmRpbmcgdG8KKyMgQ29tbXVuaWNhdGlvbiBNaW5pc3RlciBhbmQgR292IGVybm1lbnQgU3Bva2VzbWFuLCBLaGFsaWQgTmFjaXJpLi4uLiIKKyMKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDEuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAxLmh0bWwKKyMgPC9hPgorIyBPUgorIyA8YSBocmVmPSJodHRwOi8vZW4uYWZyaWsuY29tL25ld3MxMTg5Mi5odG1sIj4KKyMgaHR0cDovL2VuLmFmcmlrLmNvbS9uZXdzMTE4OTIuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTA5KToKKyMgVGhlIE1vcm9jY28gdGltZSBjaGFuZ2UgY2FuIGJlIGNvbmZpcm1lZCBvbiBNb3JvY2NvIHdlYiBzaXRlIE1hZ2hyZWIgQXJhYmUgUHJlc3NlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvYm94My9tb3JvY2NvX3NoaWZ0c190b19kYS92aWV3Ij4KKyMgaHR0cDovL3d3dy5tYXAubWEvZW5nL3NlY3Rpb25zL2JveDMvbW9yb2Njb19zaGlmdHNfdG9fZGEvdmlldworIyA8L2E+CisjCisjIE1vcm9jY28gc2hpZnRzIHRvIGRheWxpZ2h0IHRpbWUgb24gSnVuZSAxc3QgdGhyb3VnaCBTZXB0ZW1iZXIgMjcsIEdvdnQuCisjIHNwb2tlc21hbi4KKworIyBGcm9tIFBhdHJpY2UgU2NhdHRvbGluICgyMDA4LTA1LTA5KToKKyMgQWNjb3JkaW5nIHRvIHRoaXMgYXJ0aWNsZToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdm1hcm9jLmNvbS9hY3R1YWxpdGUvaGV1cmUtZGV0ZS1jb21tZW50LWExMjc4OTYuaHRtbCI+CisjIGh0dHA6Ly93d3cuYXZtYXJvYy5jb20vYWN0dWFsaXRlL2hldXJlLWRldGUtY29tbWVudC1hMTI3ODk2Lmh0bWwKKyMgPC9hPgorIyAoYW5kIHJlcHVibGlzaGVkIGhlcmU6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWN0dS5tYS9oZXVyZS1kZXRlLWNvbW1lbnRfaTEyNzg5Nl8wLmh0bWwiPgorIyBodHRwOi8vd3d3LmFjdHUubWEvaGV1cmUtZGV0ZS1jb21tZW50X2kxMjc4OTZfMC5odG1sCisjIDwvYT4KKyMgKQorIyB0aGUgY2hhbmdlcyBvY2N1cnMgYXQgbWlkbmlnaHQ6CisjCisjIHNhdHVyZGF5IG5pZ2h0IG1heSAzMXN0IGF0IG1pZG5pZ2h0ICh3aGljaCBpbiBmcmVuY2ggaXMgdG8gYmUKKyMgaW50cmVwcmV0ZWQgYXMgdGhlIG5pZ2h0IGJldHdlZW4gc2F0dXJkYXkgYW5kIHN1bmRheSkKKyMgc3VuZGF5IG5pZ2h0IHRoZSAyOHRoICBhdCBtaWRuaWdodAorIworIyBTZWVpbmcgdGhhdCB0aGUgMjh0aCBpcyBtb25kYXksIEkgYW0gZ3Vlc3NpbmcgdGhhdCBzaGUgaW50ZW5kcyB0byBzYXkKKyMgdGhlIG1pZG5pZ2h0IG9mIHRoZSAyOHRoIHdoaWNoIGlzIHRoZSBtaWRuaWdodCBiZXR3ZWVuIHN1bmRheSBhbmQKKyMgbW9uZGF5LCB3aGljaCBqaXZlcyB3aXRoIG90aGVyIHNvdXJjZXMgdGhhdCBzYXkgdGhhdCBpdCdzIGluY2x1c2l2ZQorIyBqdW5lMXN0IHRvIHNlcHQgMjd0aC4KKyMKKyMgVGhlIGRlY2lzaW9uIHdhcyB0YWtlbiBieSBkZWNyZWUgKjItMDgtMjI0ICpidXQgSSBjYW4ndCBmaW5kIHRoZSBkZWNyZWUKKyMgcHVibGlzaGVkIG9uIHRoZSB3ZWIuCisjCisjIEl0J3MgYWxzbyBjb25maXJtZWQgaGVyZToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYXJvYy5tYS9OUi9leGVyZXMvRkFDRjE0MUYtRDkxMC00NEIwLUI3RkEtNkUwMzczMzQyNUQxLmh0bSI+CisjIGh0dHA6Ly93d3cubWFyb2MubWEvTlIvZXhlcmVzL0ZBQ0YxNDFGLUQ5MTAtNDRCMC1CN0ZBLTZFMDM3MzM0MjVEMS5odG0KKyMgPC9hPgorIyBvbiBhIGdvdmVybm1lbnQgcG9ydGFsIGFzIGJlaW5nICBiZXR3ZWVuIGp1bmUgMXN0IGFuZCBzZXB0IDI3dGggKG5vdCB5ZXQKKyMgcG9zdGVkIGluIGVuZ2xpc2gpLgorIworIyBUaGUgZm9sbG93aW5nIGdvb2dsZSBxdWVyeSB3aWxsIGdlbmVyYXRlIG1hbnkgcmVsZXZhbnQgaGl0czoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9obD1lbiZxPUNvbnNlaWwrZGUrZ291dmVybmVtZW50K21hcm9jK2hldXJlK2F2YW5jZSZidG5HPVNlYXJjaCI+CisjIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/aGw9ZW4mcT1Db25zZWlsK2RlK2dvdXZlcm5lbWVudCttYXJvYytoZXVyZSthdmFuY2UmYnRuRz1TZWFyY2gKKyMgPC9hPgorCisjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0wOSk6CisjIElzIFdlc3Rlcm4gU2FoYXJhIChwYXJ0IHdoaWNoIGFkbWluaXN0cmF0ZWQgYnkgTW9yb2NjbykgZ29pbmcgdG8gZm9sbG93CisjIE1vcm9jY28gRFNUIGNoYW5nZXM/ICBBbnkgaW5mb3JtYXRpb24/ICBXaGF0IGFib3V0IG90aGVyIHBhcnQgb2YKKyMgV2VzdGVybiBTYWhhcmEgLSB1bmRlciBhZG1pbmlzdHJhdGlvbiBvZiBQT0xJU0FSSU8gRnJvbnQgKGFsc28gbmFtZWQKKyMgU0FEUiBTYWhhcmF3aSBBcmFiIERlbW9jcmF0aWMgUmVwdWJsaWMpPworCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA1LTA5KToKKyMgWFhYLS1ndWVzcyB0aGF0IGl0IGlzIG9ubHkgTW9yb2NjbyBmb3Igbm93OyBndWVzcyBvbmx5IDIwMDggZm9yIG5vdy4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wOC0yNyk6CisjIE1vcm9jY28gd2lsbCBjaGFuZ2UgdGhlIGNsb2NrcyBiYWNrIG9uIHRoZSBtaWRuaWdodCBiZXR3ZWVuIEF1Z3VzdCAzMSAKKyMgYW5kIFNlcHRlbWJlciAxLiBUaGV5IG9yaWdpbmFsbHkgcGxhbm5lZCB0byBvYnNlcnZlIERTVCB0byBuZWFyIHRoZSBlbmQgCisjIG9mIFNlcHRlbWJlcjoKKyMKKyMgT25lIGFydGljbGUgYWJvdXQgaXQgKGluIEZyZW5jaCk6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubWVuYXJhLm1hL2ZyL0FjdHVhbGl0ZXMvTWFyb2MvU29jaWV0ZS9jaS5yZXRvdXJfYV9sX2hldXJlX2dtdF9hX3BhcnRpcl9kdV9kaW1hbmNoZV8zMV9hb3V0X2FfbWludWl0X29mZmljaWVsXy5kZWZhdWx0Ij4KKyMgaHR0cDovL3d3dy5tZW5hcmEubWEvZnIvQWN0dWFsaXRlcy9NYXJvYy9Tb2NpZXRlL2NpLnJldG91cl9hX2xfaGV1cmVfZ210X2FfcGFydGlyX2R1X2RpbWFuY2hlXzMxX2FvdXRfYV9taW51aXRfb2ZmaWNpZWxfLmRlZmF1bHQKKyMgPC9hPgorIworIyBXZSBoYXZlIHNvbWUgZnVydGhlciBkZXRhaWxzIHBvc3RlZCBoZXJlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE3KToKKyMgTW9yb2NjbyB3aWxsIG9ic2VydmUgRFNUIGZyb20gMjAwOS0wNi0wMSAwMDowMCB0byAyMDA5LTA4LTIxIDAwOjAwIGFjY29yZGluZworIyB0byBtYW55IHNvdXJjZXMsIHN1Y2ggYXMKKyMgPGEgaHJlZj0iaHR0cDovL25ld3MubWFyd2ViLmNvbS9tb3JvY2NvL2VudGVydGFpbm1lbnQvbW9yb2Njby1kYXlsaWdodC1zYXZpbmcuaHRtbCI+CisjIGh0dHA6Ly9uZXdzLm1hcndlYi5jb20vbW9yb2Njby9lbnRlcnRhaW5tZW50L21vcm9jY28tZGF5bGlnaHQtc2F2aW5nLmh0bWwKKyMgPC9hPgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lZGkxc2F0Lm1hL2ZyL2RlcGVjaGUuYXNweD9pZHA9MjMxMiI+CisjIGh0dHA6Ly93d3cubWVkaTFzYXQubWEvZnIvZGVwZWNoZS5hc3B4P2lkcD0yMzEyCisjIDwvYT4KKyMgKEZyZW5jaCkKKyMKKyMgT3VyIHN1bW1hcnk6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAwOS5odG1sIj4KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tc3RhcnRzLWRzdC0yMDA5Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTAzLTE3KToKKyMgSGVyZSBpcyBhIGxpbmsgdG8gb2ZmaWNpYWwgZG9jdW1lbnQgZnJvbSBSb3lhdW1lIGR1IE1hcm9jIFByZW1pZXIgTWluaXN0cmUsCisjIE1pbmlzdGVyZSBkZSBsYSBNb2Rlcm5pc2F0aW9uIGRlcyBTZWN0ZXVycyBQdWJsaWNzCisjCisjIFVuZGVyIEFydGljbGUgMSBvZiBSb3lhbCBEZWNyZWUgTm8uIDQ1NS02NyBvZiBBY3QgMjMgc2FmYXIgMTM4NyAoMiBqdW5lIDE5NjcpCisjIGNvbmNlcm5pbmcgdGhlIGFtZW5kbWVudCBvZiB0aGUgbGVnYWwgdGltZSwgdGhlIE1pbmlzdHJ5IG9mIE1vZGVybml6YXRpb24gb2YKKyMgUHVibGljIFNlY3RvcnMgYW5ub3VuY2VkIHRoYXQgdGhlIG9mZmljaWFsIHRpbWUgaW4gdGhlIEtpbmdkb20gd2lsbCBiZQorIyBhZHZhbmNlZCA2MCBtaW51dGVzIGZyb20gU3VuZGF5IDMxIE1heSAyMDA5IGF0IG1pZG5pZ2h0LgorIworIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyYW5jYWlzL0FjdHVhbGl0ZXNfZnIvUERGX0FjdHVhbGl0ZXNfRnIvSGV1cmVFdGVfRlIucGRmIj4KKyMgaHR0cDovL3d3dy5tbXNwLmdvdi5tYS9mcmFuY2Fpcy9BY3R1YWxpdGVzX2ZyL1BERl9BY3R1YWxpdGVzX0ZyL0hldXJlRXRlX0ZSLnBkZgorIyA8L2E+CisjCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAzLmh0bWwiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wMy5odG1sCisjIDwvYT4KKworIyBSVUxFCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKKworUnVsZQlNb3JvY2NvCTE5MzkJb25seQktCVNlcAkxMgkgMDowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkxOTM5CW9ubHkJLQlOb3YJMTkJIDA6MDAJMAktCitSdWxlCU1vcm9jY28JMTk0MAlvbmx5CS0JRmViCTI1CSAwOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTE5NDUJb25seQktCU5vdgkxOAkgMDowMAkwCS0KK1J1bGUJTW9yb2NjbwkxOTUwCW9ubHkJLQlKdW4JMTEJIDA6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMTk1MAlvbmx5CS0JT2N0CTI5CSAwOjAwCTAJLQorUnVsZQlNb3JvY2NvCTE5NjcJb25seQktCUp1bgkgMwkxMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkxOTY3CW9ubHkJLQlPY3QJIDEJIDA6MDAJMAktCitSdWxlCU1vcm9jY28JMTk3NAlvbmx5CS0JSnVuCTI0CSAwOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTE5NzQJb25seQktCVNlcAkgMQkgMDowMAkwCS0KK1J1bGUJTW9yb2NjbwkxOTc2CTE5NzcJLQlNYXkJIDEJIDA6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMTk3Nglvbmx5CS0JQXVnCSAxCSAwOjAwCTAJLQorUnVsZQlNb3JvY2NvCTE5NzcJb25seQktCVNlcAkyOAkgMDowMAkwCS0KK1J1bGUJTW9yb2NjbwkxOTc4CW9ubHkJLQlKdW4JIDEJIDA6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMTk3OAlvbmx5CS0JQXVnCSA0CSAwOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMDgJb25seQktCUp1bgkgMQkgMDowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDA4CW9ubHkJLQlTZXAJIDEJIDA6MDAJMAktCitSdWxlCU1vcm9jY28JMjAwOQlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMDkJb25seQktCUF1ZwkgMjEJIDA6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFmcmljYS9DYXNhYmxhbmNhCS0wOjMwOjIwIC0JTE1UCTE5MTMgT2N0IDI2CisJCQkgMDowMAlNb3JvY2NvCVdFJXNUCTE5ODQgTWFyIDE2CisJCQkgMTowMAktCUNFVAkxOTg2CisJCQkgMDowMAlNb3JvY2NvCVdFJXNUCisjIFdlc3Rlcm4gU2FoYXJhCitab25lIEFmcmljYS9FbF9BYWl1bgktMDo1Mjo0OCAtCUxNVAkxOTM0IEphbgorCQkJLTE6MDAJLQlXQVQJMTk3NiBBcHIgMTQKKwkJCSAwOjAwCS0JV0VUCisKKyMgTW96YW1iaXF1ZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTWFwdXRvCTI6MTA6MjAgLQlMTVQJMTkwMyBNYXIKKwkJCTI6MDAJLQlDQVQKKworIyBOYW1pYmlhCisjIFRoZSAxOTk0LTA0LTAzIHRyYW5zaXRpb24gaXMgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCisjIFNoYW5rcyAmIFBvdHRlbmdlciByZXBvcnQgbm8gRFNUIGFmdGVyIDE5OTgtMDQ7IGdvIHdpdGggSUFUQS4KKworIyBGcm9tIFBldHJvbmVsbGEgU2liZWVuZSAoMjAwNy0wMy0zMCkgaW4KKyMgPGh0dHA6Ly9hbGxhZnJpY2EuY29tL3N0b3JpZXMvMjAwNzAzMzAwMTc4Lmh0bWw+OgorIyBXaGlsZSB0aGUgZW50aXJlIGNvdW50cnkgY2hhbmdlcyBpdHMgdGltZSwgS2F0aW1hIE11bGlsbyBhbmQgb3RoZXIKKyMgc2V0dGxlbWVudHMgaW4gQ2Fwcml2aSB1bm9mZmljaWFsbHkgd2lsbCBub3QgYmVjYXVzZSB0aGUgc3VuIHRoZXJlCisjIHJpc2VzIGFuZCBzZXRzIGVhcmxpZXIgY29tcGFyZWQgdG8gb3RoZXIgcmVnaW9ucy4gIENoaWVmIG9mCisjIEZvcmVjYXN0aW5nIFJpYWFuIHZhbiBaeWwgZXhwbGFpbmVkIHRoYXQgdGhlIGZhciBlYXN0ZXJuIHBhcnRzIG9mCisjIHRoZSBjb3VudHJ5IGFyZSBjbG9zZSB0byA0MCBtaW51dGVzIGVhcmxpZXIgaW4gc3VucmlzZSB0aGFuIHRoZSByZXN0CisjIG9mIHRoZSBjb3VudHJ5LgorIyAKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0zMSk6CisjIEFwcGFyZW50bHkgdGhlIENhcHJpdmkgU3RyaXAgaW5mb3JtYWxseSBvYnNlcnZlcyBCb3Rzd2FuYSB0aW1lLCBidXQKKyMgd2UgaGF2ZSBubyBkZXRhaWxzLiAgSW4gdGhlIG1lYW50aW1lIHBlb3BsZSB0aGVyZSBjYW4gdXNlIEFmcmljYS9HYWJvcm9uZS4KKworIyBSVUxFCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTmFtaWJpYQkxOTk0CW1heAktCVNlcAlTdW4+PTEJMjowMAkxOjAwCVMKK1J1bGUJTmFtaWJpYQkxOTk1CW1heAktCUFwcglTdW4+PTEJMjowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL1dpbmRob2VrCTE6MDg6MjQgLQlMTVQJMTg5MiBGZWIgOAorCQkJMTozMAktCVNXQVQJMTkwMyBNYXIJIyBTVyBBZnJpY2EgVGltZQorCQkJMjowMAktCVNBU1QJMTk0MiBTZXAgMjAgMjowMAorCQkJMjowMAkxOjAwCVNBU1QJMTk0MyBNYXIgMjEgMjowMAorCQkJMjowMAktCVNBU1QJMTk5MCBNYXIgMjEgIyBpbmRlcGVuZGVuY2UKKwkJCTI6MDAJLQlDQVQJMTk5NCBBcHIgIDMKKwkJCTE6MDAJTmFtaWJpYQlXQSVzVAorCisjIE5pZ2VyCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9OaWFtZXkJIDA6MDg6MjggLQlMTVQJMTkxMgorCQkJLTE6MDAJLQlXQVQJMTkzNCBGZWIgMjYKKwkJCSAwOjAwCS0JR01UCTE5NjAKKwkJCSAxOjAwCS0JV0FUCisKKyMgTmlnZXJpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTGFnb3MJMDoxMzozNiAtCUxNVAkxOTE5IFNlcAorCQkJMTowMAktCVdBVAorCisjIFJldW5pb24KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJSW5kaWFuL1JldW5pb24JMzo0MTo1MiAtCUxNVAkxOTExIEp1bgkjIFNhaW50LURlbmlzCisJCQk0OjAwCS0JUkVUCSMgUmV1bmlvbiBUaW1lCisjCisjIFNjYXR0ZXJlZCBJc2xhbmRzIChJbGVzIEVwYXJzZXMpIGFkbWluaXN0ZXJlZCBmcm9tIFJldW5pb24gYXJlIGFzIGZvbGxvd3MuCisjIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlbSBpcyB0YWtlbiBmcm9tCisjIElsZXMgRXBhcnNlcyAod3d3Lm91dHJlLW1lci5nb3V2LmZyL2RvbXRvbS9pbGUuaHRtLCAxOTk3LTA3LTIyLCBpbiBGcmVuY2g7CisjIG5vIGxvbmdlciBhdmFpbGFibGUgYXMgb2YgMTk5OS0wOC0xNykuCisjIFdlIGhhdmUgbm8gaW5mbyBhYm91dCB0aGVpciB0aW1lIHpvbmUgaGlzdG9yaWVzLgorIworIyBCYXNzYXMgZGEgSW5kaWEgLSB1bmluaGFiaXRlZAorIyBFdXJvcGEgSXNsYW5kIC0gaW5oYWJpdGVkIGZyb20gMTkwNSB0byAxOTEwIGJ5IHR3byBmYW1pbGllcworIyBHbG9yaW9zbyBJcyAtIGluaGFiaXRlZCB1bnRpbCBhdCBsZWFzdCAxOTU4CisjIEp1YW4gZGUgTm92YSAtIHVuaW5oYWJpdGVkCisjIFRyb21lbGluIC0gaW5oYWJpdGVkIHVudGlsIGF0IGxlYXN0IDE5NTgKKworIyBSd2FuZGEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0tpZ2FsaQkyOjAwOjE2IC0JTE1UCTE5MzUgSnVuCisJCQkyOjAwCS0JQ0FUCisKKyMgU3QgSGVsZW5hCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEF0bGFudGljL1N0X0hlbGVuYQktMDoyMjo0OCAtCUxNVAkxODkwCQkjIEphbWVzdG93bgorCQkJLTA6MjI6NDggLQlKTVQJMTk1MQkjIEphbWVzdG93biBNZWFuIFRpbWUKKwkJCSAwOjAwCS0JR01UCisjIFRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgU3QgSGVsZW5hIHRlcnJpdG9yeSBhcmUgc2ltaWxhcjoKKyMJVHJpc3RhbiBkYSBDdW5oYTogb24gR01ULCBzYXkgV2hpdG1hbiBhbmQgdGhlIENJQQorIwlBc2NlbnNpb246IG9uIEdNVCwgc2F5cyB1c25vMTk5NSBhbmQgdGhlIENJQQorIwlHb3VnaCAoc2NpZW50aWZpYyBzdGF0aW9uIHNpbmNlIDE5NTU7IHNlYWxlcnMgd2ludGVyZWQgcHJldmlvdXNseSk6CisjCQlvbiBHTVQsIHNheXMgdGhlIENJQQorIwlJbmFjY2Vzc2libGUsIE5pZ2h0aW5nYWxlOiBubyBpbmZvcm1hdGlvbiwgYnV0IHByb2JhYmx5IEdNVAorCisjIFNhbyBUb21lIGFuZCBQcmluY2lwZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvU2FvX1RvbWUJIDA6MjY6NTYgLQlMTVQJMTg4NAorCQkJLTA6MzY6MzIgLQlMTVQJMTkxMgkjIExpc2JvbiBNZWFuIFRpbWUKKwkJCSAwOjAwCS0JR01UCisKKyMgU2VuZWdhbAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvRGFrYXIJLTE6MDk6NDQgLQlMTVQJMTkxMgorCQkJLTE6MDAJLQlXQVQJMTk0MSBKdW4KKwkJCSAwOjAwCS0JR01UCisKKyMgU2V5Y2hlbGxlcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlJbmRpYW4vTWFoZQkzOjQxOjQ4IC0JTE1UCTE5MDYgSnVuCSMgVmljdG9yaWEKKwkJCTQ6MDAJLQlTQ1QJIyBTZXljaGVsbGVzIFRpbWUKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0zMCk6CisjIEFsZGFicmEsIEZhcnF1aGFyLCBhbmQgRGVzcm9jaGVzLCBvcmlnaW5hbGx5IGRlcGVuZGVuY2llcyBvZiB0aGUKKyMgU2V5Y2hlbGxlcywgd2VyZSB0cmFuc2ZlcnJlZCB0byB0aGUgQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5CisjIGluIDE5NjUgYW5kIHJldHVybmVkIHRvIFNleWNoZWxsZXMgY29udHJvbCBpbiAxOTc2LiAgV2UgZG9uJ3Qga25vdworIyB3aGV0aGVyIHRoaXMgYWZmZWN0ZWQgdGhlaXIgdGltZSB6b25lLCBzbyBvbWl0IHRoaXMgZm9yIG5vdy4KKyMgUG9zc2libHkgdGhlIGlzbGFuZHMgd2VyZSB1bmluaGFiaXRlZC4KKworIyBTaWVycmEgTGVvbmUKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCisjIFdoaXRtYW4gZ2l2ZXMgTWFyIDMxIC0gQXVnIDMxIGZvciAxOTMxIG9uOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJU0wJMTkzNQkxOTQyCS0JSnVuCSAxCTA6MDAJMDo0MAlTTFNUCitSdWxlCVNMCTE5MzUJMTk0MgktCU9jdAkgMQkwOjAwCTAJV0FUCitSdWxlCVNMCTE5NTcJMTk2MgktCUp1bgkgMQkwOjAwCTE6MDAJU0xTVAorUnVsZQlTTAkxOTU3CTE5NjIJLQlTZXAJIDEJMDowMAkwCUdNVAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvRnJlZXRvd24JLTA6NTM6MDAgLQlMTVQJMTg4MgorCQkJLTA6NTM6MDAgLQlGTVQJMTkxMyBKdW4gIyBGcmVldG93biBNZWFuIFRpbWUKKwkJCS0xOjAwCVNMCSVzCTE5NTcKKwkJCSAwOjAwCVNMCSVzCisKKyMgU29tYWxpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBZnJpY2EvTW9nYWRpc2h1CTM6MDE6MjggLQlMTVQJMTg5MyBOb3YKKwkJCTM6MDAJLQlFQVQJMTkzMQorCQkJMjozMAktCUJFQVQJMTk1NworCQkJMzowMAktCUVBVAorCisjIFNvdXRoIEFmcmljYQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJU0EJMTk0MgkxOTQzCS0JU2VwCVN1bj49MTUJMjowMAkxOjAwCS0KK1J1bGUJU0EJMTk0MwkxOTQ0CS0JTWFyCVN1bj49MTUJMjowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQWZyaWNhL0pvaGFubmVzYnVyZyAxOjUyOjAwIC0JTE1UCTE4OTIgRmViIDgKKwkJCTE6MzAJLQlTQVNUCTE5MDMgTWFyCisJCQkyOjAwCVNBCVNBU1QKKyMgTWFyaW9uIGFuZCBQcmluY2UgRWR3YXJkIElzCisjIHNjaWVudGlmaWMgc3RhdGlvbiBzaW5jZSAxOTQ3CisjIG5vIGluZm9ybWF0aW9uCisKKyMgU3VkYW4KKyMKKyMgRnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnN1bmFuZXdzLm5ldC9zbjEzamFuZS5odG1sIj4KKyMgU3VkYW4gTmV3cyBBZ2VuY3kgKDIwMDAtMDEtMTMpCisjIDwvYT4sIGFsc28gcmVwb3J0ZWQgYnkgTWljaGFlbCBEZSBCZXVrZWxhZXItRG9zc2NoZSB2aWEgU3RlZmZlbiBUaG9yc2VuOgorIyBDbG9ja3Mgd2lsbCBiZSBtb3ZlZCBhaGVhZCBmb3IgNjAgbWludXRlcyBhbGwgb3ZlciB0aGUgU3VkYW4gYXMgb2Ygbm9vbgorIyBTYXR1cmRheS4uLi4gIFRoaXMgd2FzIGFubm91bmNlZCBUaHVyc2RheSBieSBDYXJldGFrZXIgU3RhdGUgTWluaXN0ZXIgZm9yCisjIE1hbnBvd2VyIEFiZHVsLVJhaG1hbiBOdXItRWRkaW4uCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlTdWRhbgkxOTcwCW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKK1J1bGUJU3VkYW4JMTk3MAkxOTg1CS0JT2N0CTE1CTA6MDAJMAktCitSdWxlCVN1ZGFuCTE5NzEJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJUworUnVsZQlTdWRhbgkxOTcyCTE5ODUJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvS2hhcnRvdW0JMjoxMDowOCAtCUxNVAkxOTMxCisJCQkyOjAwCVN1ZGFuCUNBJXNUCTIwMDAgSmFuIDE1IDEyOjAwCisJCQkzOjAwCS0JRUFUCisKKyMgU3dhemlsYW5kCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9NYmFiYW5lCTI6MDQ6MjQgLQlMTVQJMTkwMyBNYXIKKwkJCTI6MDAJLQlTQVNUCisKKyMgVGFuemFuaWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQWZyaWNhL0Rhcl9lc19TYWxhYW0gMjozNzowOCAtCUxNVAkxOTMxCisJCQkzOjAwCS0JRUFUCTE5NDgKKwkJCTI6NDQ6NDUJLQlCRUFVVAkxOTYxCisJCQkzOjAwCS0JRUFUCisKKyMgVG9nbworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTG9tZQkwOjA0OjUyIC0JTE1UCTE4OTMKKwkJCTA6MDAJLQlHTVQKKworIyBUdW5pc2lhCisKKyMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0zMCk6CisjIE15IGNvcnJlc3BvbmRlbnQsIFJpc3RvIE55a2FuZW4sIGhhcyBhbGVydGVkIG1lIHRvIGFub3RoZXIgYWRvcHRpb24gb2YgRFNULAorIyB0aGlzIHRpbWUgaW4gVHVuaXNpYS4gIEFjY29yZGluZyB0byBZYWhvbyBGcmFuY2UgTmV3cworIyA8aHR0cDovL2ZyLm5ld3MueWFob28uY29tLzA1MDQyNi81LzRkdW1rLmh0bWw+LCBpbiBhIHN0b3J5IGF0dHJpYnV0ZWQgdG8gQVAKKyMgYW5kIGRhdGVkIDIwMDUtMDQtMjYsICJUdW5pc2lhIGhhcyBkZWNpZGVkIHRvIGFkdmFuY2UgaXRzIG9mZmljaWFsIHRpbWUgYnkKKyMgb25lIGhvdXIsIHN0YXJ0aW5nIG9uIFN1bmRheSwgTWF5IDEuICBIZW5jZWZvcnRoLCBUdW5pc2lhbiB0aW1lIHdpbGwgYmUKKyMgVVRDKzIgaW5zdGVhZCBvZiBVVEMrMS4gIFRoZSBjaGFuZ2Ugd2lsbCB0YWtlIHBsYWNlIGF0IDIzOjAwIFVUQyBuZXh0CisjIFNhdHVyZGF5LiIgIChNeSB0cmFuc2xhdGlvbikKKyMKKyMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwNS0wNS0wMik6CisjIExhUHJlc3NlLCB0aGUgZmlyc3QgbmF0aW9uYWwgZGFpbHkgbmV3c3BhcGVyIC4uLgorIyA8aHR0cDovL3d3dy5sYXByZXNzZS50bi9hcmNoaXZlcy9hcmNoaXZlczI4MDQwNS9hY3R1YWxpdGVzL2xoZXVyZS5odG1sPgorIyAuLi4gRFNUIGZvciAyMDA1OiBvbjogU3VuIE1heSAxIDBoIHN0YW5kYXJkIHRpbWUsIG9mZjogRnJpIFNlcHQuIDMwLAorIyAxaCBzdGFuZGFyZCB0aW1lLgorIworIyBGcm9tIEF0ZWYgTG91a2lsICgyMDA2LTAzLTI4KToKKyMgVGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgYmUgdGhlIHNhbWUgZWFjaCB5ZWFyOgorIyBCZWdpbm5pbmcgICAgICA6IHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCBhdCAwMjowMAorIyBFbmRpbmcgICAgICAgICA6IHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIGF0IDAzOjAwIC4uLgorIyBodHRwOi8vd3d3LnRhcC5pbmZvLnRuL2VuL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTExODgmSXRlbWlkPTUwCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDMtMTYpOgorIyBBY2NvcmRpbmcgdG8gc2V2ZXJhbCBuZXdzIHNvdXJjZXMsIFR1bmlzaWEgd2lsbCBub3Qgb2JzZXJ2ZSBEU1QgdGhpcyB5ZWFyLgorIyAoQXJhYmljKQorIyA8YSBocmVmPSJodHRwOi8vd3d3LmVsYmFzaGF5ZXIuY29tLz9wYWdlPXZpZXduJm5pZD00MjU0NiI+CisjIGh0dHA6Ly93d3cuZWxiYXNoYXllci5jb20vP3BhZ2U9dmlld24mbmlkPTQyNTQ2CisjIDwvYT4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5iYWJuZXQubmV0L2tpd2lkZXRhaWwtMTUyOTUuYXNwIj4KKyMgaHR0cDovL3d3dy5iYWJuZXQubmV0L2tpd2lkZXRhaWwtMTUyOTUuYXNwCisjIDwvYT4KKyMKKyMgV2UgaGF2ZSBhbHNvIGNvbmZpcm1lZCB0aGlzIHdpdGggdGhlIFVTIGVtYmFzc3kgaW4gVHVuaXNpYS4KKyMgV2UgaGF2ZSBhIHdyYXAtdXAgYWJvdXQgdGhpcyBvbiB0aGUgZm9sbG93aW5nIHBhZ2U6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS90dW5pc2lhLWNhbmNlbHMtZHN0LTIwMDkuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS90dW5pc2lhLWNhbmNlbHMtZHN0LTIwMDkuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDMtMTcpOgorIyBIZXJlIGlzIGEgbGluayB0byBUdW5pcyBBZnJpcXVlIFByZXNzZSBOZXdzIEFnZW5jeQorIworIyBTdGFuZGFyZCB0aW1lIHRvIGJlIGtlcHQgdGhlIHdob2xlIHllYXIgbG9uZyAodGFwLmluZm8udG4pOgorIworIyAoaW4gRW5nbGlzaCkKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50YXAuaW5mby50bi9lbi9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0yNjgxMyZJdGVtaWQ9MTU3Ij4KKyMgaHR0cDovL3d3dy50YXAuaW5mby50bi9lbi9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0yNjgxMyZJdGVtaWQ9MTU3CisjIDwvYT4KKyMKKyMgKGluIEFyYWJpYykKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50YXAuaW5mby50bi9hci9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD02MTI0MCZJdGVtaWQ9MSI+CisjIGh0dHA6Ly93d3cudGFwLmluZm8udG4vYXIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NjEyNDAmSXRlbWlkPTEKKyMgPC9hPgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LS0zLTE4KToKKyMgVGhlIFR1bmlzIEFmcmlxdWUgUHJlc3NlIE5ld3MgQWdlbmN5IG5vdGljZSBjb250YWlucyB0aGlzOiAiVGhpcyBtZWFzdXJlIGlzIGR1ZSB0byB0aGUgZmFjdAorIyB0aGF0IHRoZSBmYXN0aW5nIG1vbnRoIG9mIHJhbWFkYW4gY29pbmNpZGVzIHdpdGggdGhlIHBlcmlvZCBjb25jZXJuZWQgYnkgc3VtbWVyIHRpbWUuCisjIFRoZXJlZm9yZSwgdGhlIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBrZXB0IHVuY2hhbmdlZCB0aGUgd2hvbGUgeWVhciBsb25nLiIKKyMgU28gZm9yZWdvaW5nIERTVCBzZWVtcyB0byBiZSBhbiBleGNlcHRpb24gKGFsYmVpdCBvbmUgdGhhdCBtYXkgYmUgcmVwZWF0ZWQgaW4gdGhlICBmdXR1cmUpLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlUdW5pc2lhCTE5MzkJb25seQktCUFwcgkxNQkyMzowMHMJMTowMAlTCitSdWxlCVR1bmlzaWEJMTkzOQlvbmx5CS0JTm92CTE4CTIzOjAwcwkwCS0KK1J1bGUJVHVuaXNpYQkxOTQwCW9ubHkJLQlGZWIJMjUJMjM6MDBzCTE6MDAJUworUnVsZQlUdW5pc2lhCTE5NDEJb25seQktCU9jdAkgNgkgMDowMAkwCS0KK1J1bGUJVHVuaXNpYQkxOTQyCW9ubHkJLQlNYXIJIDkJIDA6MDAJMTowMAlTCitSdWxlCVR1bmlzaWEJMTk0Mglvbmx5CS0JTm92CSAyCSAzOjAwCTAJLQorUnVsZQlUdW5pc2lhCTE5NDMJb25seQktCU1hcgkyOQkgMjowMAkxOjAwCVMKK1J1bGUJVHVuaXNpYQkxOTQzCW9ubHkJLQlBcHIJMTcJIDI6MDAJMAktCitSdWxlCVR1bmlzaWEJMTk0Mwlvbmx5CS0JQXByCTI1CSAyOjAwCTE6MDAJUworUnVsZQlUdW5pc2lhCTE5NDMJb25seQktCU9jdAkgNAkgMjowMAkwCS0KK1J1bGUJVHVuaXNpYQkxOTQ0CTE5NDUJLQlBcHIJTW9uPj0xCSAyOjAwCTE6MDAJUworUnVsZQlUdW5pc2lhCTE5NDQJb25seQktCU9jdAkgOAkgMDowMAkwCS0KK1J1bGUJVHVuaXNpYQkxOTQ1CW9ubHkJLQlTZXAJMTYJIDA6MDAJMAktCitSdWxlCVR1bmlzaWEJMTk3Nwlvbmx5CS0JQXByCTMwCSAwOjAwcwkxOjAwCVMKK1J1bGUJVHVuaXNpYQkxOTc3CW9ubHkJLQlTZXAJMjQJIDA6MDBzCTAJLQorUnVsZQlUdW5pc2lhCTE5NzgJb25seQktCU1heQkgMQkgMDowMHMJMTowMAlTCitSdWxlCVR1bmlzaWEJMTk3OAlvbmx5CS0JT2N0CSAxCSAwOjAwcwkwCS0KK1J1bGUJVHVuaXNpYQkxOTg4CW9ubHkJLQlKdW4JIDEJIDA6MDBzCTE6MDAJUworUnVsZQlUdW5pc2lhCTE5ODgJMTk5MAktCVNlcAlsYXN0U3VuCSAwOjAwcwkwCS0KK1J1bGUJVHVuaXNpYQkxOTg5CW9ubHkJLQlNYXIJMjYJIDA6MDBzCTE6MDAJUworUnVsZQlUdW5pc2lhCTE5OTAJb25seQktCU1heQkgMQkgMDowMHMJMTowMAlTCitSdWxlCVR1bmlzaWEJMjAwNQlvbmx5CS0JTWF5CSAxCSAwOjAwcwkxOjAwCVMKK1J1bGUJVHVuaXNpYQkyMDA1CW9ubHkJLQlTZXAJMzAJIDE6MDBzCTAJLQorUnVsZQlUdW5pc2lhCTIwMDYJMjAwOAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKK1J1bGUJVHVuaXNpYQkyMDA2CTIwMDgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCitSdWxlCVR1bmlzaWEJMjAxMAltYXgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCitSdWxlCVR1bmlzaWEJMjAxMAltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCisjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCisjIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZSAxOTExIHN3aXRjaCB3YXMgb24gTWFyIDk7IGdvIHdpdGggSG93c2UncyBNYXIgMTEuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFmcmljYS9UdW5pcwkwOjQwOjQ0IC0JTE1UCTE4ODEgTWF5IDEyCisJCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCisJCQkxOjAwCVR1bmlzaWEJQ0Ulc1QKKworIyBVZ2FuZGEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQWZyaWNhL0thbXBhbGEJMjowOTo0MCAtCUxNVAkxOTI4IEp1bAorCQkJMzowMAktCUVBVAkxOTMwCisJCQkyOjMwCS0JQkVBVAkxOTQ4CisJCQkyOjQ0OjQ1CS0JQkVBVVQJMTk1NworCQkJMzowMAktCUVBVAorCisjIFphbWJpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvTHVzYWthCTE6NTM6MDggLQlMTVQJMTkwMyBNYXIKKwkJCTI6MDAJLQlDQVQKKworIyBaaW1iYWJ3ZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBZnJpY2EvSGFyYXJlCTI6MDQ6MTIgLQlMTVQJMTkwMyBNYXIKKwkJCTI6MDAJLQlDQVQKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2FudGFyY3RpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9hbnRhcmN0aWNhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9hbnRhcmN0aWNhCkBAIC0wLDAgKzEsMzUyIEBACisjIDxwcmU+CisjIEAoIylhbnRhcmN0aWNhCTguNworIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTExLTE1KToKKyMgVG8ga2VlcCB0aGluZ3MgbWFuYWdlYWJsZSwgd2UgbGlzdCBvbmx5IGxvY2F0aW9ucyBvY2N1cGllZCB5ZWFyLXJvdW5kOyBzZWUKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5jb21uYXAuYXEvY29tbmFwL2NvbW5hcC5uc2YvUC9TdGF0aW9ucy8iPgorIyBDT01OQVAgLSBTdGF0aW9ucyBhbmQgQmFzZXMKKyMgPC9hPgorIyBhbmQKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5zcHJpLmNhbS5hYy51ay9ib2IvcGVyaWFudC5odG0iPgorIyBTdW1tYXJ5IG9mIHRoZSBQZXJpLUFudGFyY3RpYyBJc2xhbmRzICgxOTk4LTA3LTIzKQorIyA8L2E+CisjIGZvciBpbmZvcm1hdGlvbi4KKyMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHdlIGhhdmUgbm8gdGltZSB6b25lIGluZm9ybWF0aW9uLgorIworIyBFeGNlcHQgZm9yIHRoZSBGcmVuY2ggZW50cmllcywKKyMgSSBtYWRlIHVwIGFsbCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBtZW50aW9uZWQgaGVyZTsgY29ycmVjdGlvbnMgd2VsY29tZSEKKyMgRk9STUFUIGlzIGB6enonIGFuZCBHTVRPRkYgaXMgMCBmb3IgbG9jYXRpb25zIHdoaWxlIHVuaW5oYWJpdGVkLgorCisjIFRoZXNlIHJ1bGVzIGFyZSBzdG9sZW4gZnJvbSB0aGUgYGV1cm9wZScgZmlsZS4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVJ1c3NBUQkxOTgxCTE5ODQJLQlBcHIJIDEJIDA6MDAJMTowMAlTCitSdWxlCVJ1c3NBUQkxOTgxCTE5ODMJLQlPY3QJIDEJIDA6MDAJMAktCitSdWxlCVJ1c3NBUQkxOTg0CTE5OTEJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCitSdWxlCVJ1c3NBUQkxOTg1CTE5OTEJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCitSdWxlCVJ1c3NBUQkxOTkyCW9ubHkJLQlNYXIJbGFzdFNhdAkgMjM6MDAJMTowMAlTCitSdWxlCVJ1c3NBUQkxOTkyCW9ubHkJLQlTZXAJbGFzdFNhdAkgMjM6MDAJMAktCitSdWxlCVJ1c3NBUQkxOTkzCW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKK1J1bGUJUnVzc0FRCTE5OTMJMTk5NQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KK1J1bGUJUnVzc0FRCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDI6MDBzCTAJLQorCisjIFRoZXNlIHJ1bGVzIGFyZSBzdG9sZW4gZnJvbSB0aGUgYHNvdXRoYW1lcmljYScgZmlsZS4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUFyZ0FRCTE5NjQJMTk2NgktCU1hcgkgMQkwOjAwCTAJLQorUnVsZQlBcmdBUQkxOTY0CTE5NjYJLQlPY3QJMTUJMDowMAkxOjAwCVMKK1J1bGUJQXJnQVEJMTk2Nwlvbmx5CS0JQXByCSAyCTA6MDAJMAktCitSdWxlCUFyZ0FRCTE5NjcJMTk2OAktCU9jdAlTdW4+PTEJMDowMAkxOjAwCVMKK1J1bGUJQXJnQVEJMTk2OAkxOTY5CS0JQXByCVN1bj49MQkwOjAwCTAJLQorUnVsZQlBcmdBUQkxOTc0CW9ubHkJLQlKYW4JMjMJMDowMAkxOjAwCVMKK1J1bGUJQXJnQVEJMTk3NAlvbmx5CS0JTWF5CSAxCTA6MDAJMAktCitSdWxlCUNoaWxlQVEJMTk3MgkxOTg2CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KK1J1bGUJQ2hpbGVBUQkxOTc0CTE5ODcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZUFRCTE5ODcJb25seQktCUFwcgkxMgkzOjAwdQkwCS0KK1J1bGUJQ2hpbGVBUQkxOTg4CTE5ODkJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQorUnVsZQlDaGlsZUFRCTE5ODgJb25seQktCU9jdAlTdW4+PTEJNDowMHUJMTowMAlTCitSdWxlCUNoaWxlQVEJMTk4OQlvbmx5CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGVBUQkxOTkwCW9ubHkJLQlNYXIJMTgJMzowMHUJMAktCitSdWxlCUNoaWxlQVEJMTk5MAlvbmx5CS0JU2VwCTE2CTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZUFRCTE5OTEJMTk5NgktCU1hcglTdW4+PTkJMzowMHUJMAktCitSdWxlCUNoaWxlQVEJMTk5MQkxOTk3CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGVBUQkxOTk3CW9ubHkJLQlNYXIJMzAJMzowMHUJMAktCitSdWxlCUNoaWxlQVEJMTk5OAlvbmx5CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KK1J1bGUJQ2hpbGVBUQkxOTk4CW9ubHkJLQlTZXAJMjcJNDowMHUJMTowMAlTCitSdWxlCUNoaWxlQVEJMTk5OQlvbmx5CS0JQXByCSA0CTM6MDB1CTAJLQorUnVsZQlDaGlsZUFRCTE5OTkJbWF4CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGVBUQkyMDAwCW1heAktCU1hcglTdW4+PTkJMzowMHUJMAktCisKKworIyBBcmdlbnRpbmEgLSB5ZWFyLXJvdW5kIGJhc2VzCisjIEJlbGdyYW5vIElJLCBDb25maW4gQ29hc3QsIC03NzAyMjctMDM0MzczNywgc2luY2UgMTk3Mi0wMi0wNQorIyBFc3BlcmFuemEsIFNhbiBNYXJ0aW4gTGFuZCwgLTYzMjMtMDU2NTksIHNpbmNlIDE5NTItMTItMTcKKyMgSnViYW55LCBQb3R0ZXIgUGVuaW5zdWxhLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02NDE0LTA2MDIzMjAsIHNpbmNlIDE5ODItMDEKKyMgTWFyYW1iaW8sIFNleW1vdXIgSSwgLTY0MTQtMDU2MzcsIHNpbmNlIDE5NjktMTAtMjkKKyMgT3JjYWRhcywgTGF1cmllIEksIC02MDE2LTA0NDQ0LCBzaW5jZSAxOTA0LTAyLTIyCisjIFNhbiBNYXJ0aW4sIERlYmVuaGFtIEksIC02ODA3LTA2NzA4LCBzaW5jZSAxOTUxLTAzLTIxCisjCShleGNlcHQgMTk2MC0wMyAvIDE5NzYtMDMtMjEpCisKKyMgQXVzdHJhbGlhIC0gdGVycml0b3JpZXMKKyMgSGVhcmQgSXNsYW5kLCBNY0RvbmFsZCBJc2xhbmRzICh1bmluaGFiaXRlZCkKKyMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAorIwk8YSBocmVmPSJodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTIwNDIyMjI0NS9odHRwOi8vd3d3LmRzdGMucXV0LmVkdS5hdS9EU1QvbWFyZy9kYXlsaWdodC5odG1sIj4KKyMJTWFyZ2FyZXQgVHVybmVyIHJlcG9ydHMKKyMJPC9hPiAoMTk5OS0wOS0zMCkgdGhhdCB0aGV5J3JlIFVUQys1LCB3aXRoIG5vIERTVDsKKyMJcHJlc3VtYWJseSB0aGlzIGlzIHdoZW4gdGhleSBoYXZlIHZpc2l0b3JzLgorIworIyB5ZWFyLXJvdW5kIGJhc2VzCisjIENhc2V5LCBCYWlsZXkgUGVuaW5zdWxhLCAtNjYxNysxMTAzMiwgc2luY2UgMTk2OQorIyBEYXZpcywgVmVzdGZvbGQgSGlsbHMsIC02ODM1KzA3NzU5LCBzaW5jZSAxOTU3LTAxLTEzCisjCShleGNlcHQgMTk2NC0xMSAtIDE5NjktMDIpCisjIE1hd3NvbiwgSG9sbWUgQmF5LCAtNjczNiswNjI1Mywgc2luY2UgMTk1NC0wMi0xMworCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTExKToKKyMgVGhyZWUgQXVzdHJhbGlhbiBzdGF0aW9ucyBpbiBBbnRhcmN0aWNhIGhhdmUgY2hhbmdlZCB0aGVpciB0aW1lIHpvbmU6CisjIENhc2V5IG1vdmVkIGZyb20gVVRDKzggdG8gVVRDKzExCisjIERhdmlzIG1vdmVkIGZyb20gVVRDKzcgdG8gVVRDKzUKKyMgTWF3c29uIG1vdmVkIGZyb20gVVRDKzYgdG8gVVRDKzUKKyMgVGhlIGNoYW5nZXMgb2NjdXJyZWQgb24gMjAwOS0xMC0xOCBhdCAwMjowMCAobG9jYWwgdGltZXMpLgorIworIyBHb3Zlcm5tZW50IHNvdXJjZTogKEF1c3RyYWxpYW4gQW50YXJjdGljIERpdmlzaW9uKQorIyA8YSBocmVmPSJodHRwOi8vd3d3LmFhZC5nb3YuYXUvZGVmYXVsdC5hc3A/Y2FzaWQ9MzcwNzkiPgorIyBodHRwOi8vd3d3LmFhZC5nb3YuYXUvZGVmYXVsdC5hc3A/Y2FzaWQ9MzcwNzkKKyMgPC9hPgorIworIyBXZSBoYXZlIG1vcmUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBoZXJlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvYW50YXJjdGljYS1uZXctdGltZXMuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9hbnRhcmN0aWNhLW5ldy10aW1lcy5odG1sCisjIDwvYT4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbnRhcmN0aWNhL0Nhc2V5CTAJLQl6enoJMTk2OQorCQkJODowMAktCVdTVAkyMDA5IE9jdCAxOCAyOjAwCisJCQkJCQkjIFdlc3Rlcm4gKEF1cykgU3RhbmRhcmQgVGltZQorCQkJMTE6MDAJLQlDQVNUCSMgQ2FzZXkgVGltZQorWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQl6enoJMTk1NyBKYW4gMTMKKwkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICMgRGF2aXMgVGltZQorCQkJMAktCXp6egkxOTY5IEZlYgorCQkJNzowMAktCURBVlQJMjAwOSBPY3QgMTggMjowMAorCQkJNTowMAktCURBVlQKK1pvbmUgQW50YXJjdGljYS9NYXdzb24JMAktCXp6egkxOTU0IEZlYiAxMworCQkJNjowMAktCU1BV1QJMjAwOSBPY3QgMTggMjowMAorCQkJCQkJIyBNYXdzb24gVGltZQorCQkJNTowMAktCU1BV1QKKyMgUmVmZXJlbmNlczoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRkaXYuZ292LmF1L2FhZC9leG9wL3Nmby9jYXNleS9jYXNleV9hd3MuaHRtbCI+CisjIENhc2V5IFdlYXRoZXIgKDE5OTgtMDItMjYpCisjIDwvYT4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRkaXYuZ292LmF1L2FhZC9leG9wL3Nmby9kYXZpcy92aWRlby5odG1sIj4KKyMgRGF2aXMgU3RhdGlvbiwgQW50YXJjdGljYSAoMTk5OC0wMi0yNikKKyMgPC9hPgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL21hd3Nvbi92aWRlby5odG1sIj4KKyMgTWF3c29uIFN0YXRpb24sIEFudGFyY3RpY2EgKDE5OTgtMDItMjUpCisjIDwvYT4KKworIyBCcmF6aWwgLSB5ZWFyLXJvdW5kIGJhc2UKKyMgQ29tYW5kYW50ZSBGZXJyYXosIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMDUrMDU4MjQsIHNpbmNlIDE5ODMvNAorCisjIENoaWxlIC0geWVhci1yb3VuZCBiYXNlcyBhbmQgdG93bnMKKyMgRXNjdWRlcm8sIFNvdXRoIFNoZXRsYW5kIElzLCAtNjIxMTU3LTA1ODU3MzUsIHNpbmNlIDE5OTQKKyMgUHJlc2lkZW50ZSBFZHVhZHJvIEZyZWksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTQtMDU4NDgsIHNpbmNlIDE5NjktMDMtMDcKKyMgR2VuZXJhbCBCZXJuYXJkbyBPJ0hpZ2dpbnMsIEFudGFyY3RpYyBQZW5pbnN1bGEsIC02MzE5LTA1NzA0LCBzaW5jZSAxOTQ4LTAyCisjIENhcGl0YW4gQXJ0dXJvIFByYXQsIC02MjMwLTA1OTQxCisjIFZpbGxhIExhcyBFc3RyZWxsYXMgKGEgdG93biksIGFyb3VuZCB0aGUgRnJlaSBiYXNlLCBzaW5jZSAxOTg0LTA0LTA5CisjIFRoZXNlIGxvY2F0aW9ucyBoYXZlIGFsd2F5cyB1c2VkIFNhbnRpYWdvIHRpbWU7IHVzZSBUWj0nQW1lcmljYS9TYW50aWFnbycuCisKKyMgQ2hpbmEgLSB5ZWFyLXJvdW5kIGJhc2VzCisjIEdyZWF0IFdhbGwsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTMtMDU4NTgsIHNpbmNlIDE5ODUtMDItMjAKKyMgWmhvbmdzaGFuLCBMYXJzZW1hbm4gSGlsbHMsIFByeWR6IEJheSwgLTY5MjIrMDc2MjMsIHNpbmNlIDE5ODktMDItMjYKKworIyBGcmFuY2UgLSB5ZWFyLXJvdW5kIGJhc2VzCisjCisjIEZyb20gQW50b2luZSBMZWNhICgxOTk3LTAxLTIwKToKKyMgVGltZSBkYXRhIGFyZSBmcm9tIE5pY29sZSBQYWlsbGVhdSBhdCB0aGUgSUZSVFAKKyMgKEZyZW5jaCBJbnN0aXR1dGUgZm9yIFBvbGFyIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5KS4KKyMgU2hlIGNvbmZpcm1zIHRoYXQgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIGFuZCBUZXJyZSBBZGVsaWUgYmFzZXMKKyMgZG9uJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgdGltZSwgZXZlbiBpZiBUZXJyZSBBZGVsaWUgc3VwcGxpZXMgY2FtZQorIyBmcm9tIFRhc21hbmlhLgorIworIyBGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMgd2l0aCB5ZWFyLXJvdW5kIGluaGFiaXRhbnRzCisjCisjIE1hcnRpbi1kZS1WaXZpZXMgQmFzZSwgQW1zdGVyZGFtIElzbGFuZCwgLTM3NDEwNSswNzczMTU1LCBzaW5jZSAxOTUwCisjIEFsZnJlZC1GYXVyZSBCYXNlLCBDcm96ZXQgSXNsYW5kcywgLTQ2MjU1MSswNTE1MTUyLCBzaW5jZSAxOTY0CisjIFBvcnQtYXV4LUZyYW5jYWlzLCBLZXJndWVsZW4gSXNsYW5kcywgLTQ5MjExMCswNzAxMzAzLCBzaW5jZSAxOTUxOworIwl3aGFsaW5nICYgc2VhbGluZyBzdGF0aW9uIG9wZXJhdGVkIDE5MDgvMTkxNCwgMTkyMC8xOTI5LCBhbmQgMTk1MS8xOTU2CisjCisjIFN0IFBhdWwgSXNsYW5kIC0gbmVhciBBbXN0ZXJkYW0sIHVuaW5oYWJpdGVkCisjCWZpc2hpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgdmFyaW91c2x5IDE4MTkvMTkzMQorIworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBJbmRpYW4vS2VyZ3VlbGVuCTAJLQl6enoJMTk1MAkjIFBvcnQtYXV4LUZyYW5jYWlzCisJCQk1OjAwCS0JVEZUCSMgSVNPIGNvZGUgVEYgVGltZQorIworIyB5ZWFyLXJvdW5kIGJhc2UgaW4gdGhlIG1haW4gY29udGluZW50CisjIER1bW9udC1kJ1VydmlsbGUsIElsZSBkZXMgUGV0cmVscywgLTY2NDArMTQwMDEsIHNpbmNlIDE5NTYtMTEKKyMKKyMgQW5vdGhlciBiYXNlIGF0IFBvcnQtTWFydGluLCA1MGttIGVhc3QsIGJlZ2FuIG9wZXJhdGlvbiBpbiAxOTQ3LgorIyBJdCB3YXMgZGVzdHJveWVkIGJ5IGZpcmUgb24gMTk1Mi0wMS0xNC4KKyMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZSAwIC0Jenp6CTE5NDcKKwkJCTEwOjAwCS0JUE1UCTE5NTIgSmFuIDE0ICMgUG9ydC1NYXJ0aW4gVGltZQorCQkJMAktCXp6egkxOTU2IE5vdgorCQkJMTA6MDAJLQlERFVUCSMgRHVtb250LWQnVXJ2aWxsZSBUaW1lCisjIFJlZmVyZW5jZToKKyMgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EdW1vbnRfZCdVcnZpbGxlX1N0YXRpb24iPgorIyBEdW1vbnQgZCdVcnZpbGxlIFN0YXRpb24gKDIwMDUtMTItMDUpCisjIDwvYT4KKworIyBHZXJtYW55IC0geWVhci1yb3VuZCBiYXNlCisjIEdlb3JnIHZvbiBOZXVtYXllciwgLTcwMzktMDA4MTUKKworIyBJbmRpYSAtIHllYXItcm91bmQgYmFzZQorIyBEYWtzaGluIEdhbmdvdHJpLCAtNzAwNSswMTIwMAorCisjIEphcGFuIC0geWVhci1yb3VuZCBiYXNlcworIyBEb21lIEZ1amksIC03NzE5KzAzOTQyCisjIFN5b3dhLCAtNjkwMDIyKzAzOTM1MjQKKyMKKyMgRnJvbSBIaWRleXVraSBTdXp1a2kgKDE5OTktMDItMDYpOgorIyBJbiBhbGwgSmFwYW5lc2Ugc3RhdGlvbnMsICswMzAwIGlzIHVzZWQgYXMgdGhlIHN0YW5kYXJkIHRpbWUuCisjCisjIFN5b3dhIHN0YXRpb24sIHdoaWNoIGlzIHRoZSBmaXJzdCBhbnRhcmN0aWMgc3RhdGlvbiBvZiBKYXBhbiwKKyMgd2FzIGVzdGFibGlzaGVkIG9uIDE5NTctMDEtMjkuICBTaW5jZSBTeW93YSBzdGF0aW9uIGlzIHN0aWxsIHRoZSBtYWluCisjIHN0YXRpb24gb2YgSmFwYW4sIGl0J3MgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcmluY2lwYWwgbG9jYXRpb24uCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFudGFyY3RpY2EvU3lvd2EJMAktCXp6egkxOTU3IEphbiAyOQorCQkJMzowMAktCVNZT1QJIyBTeW93YSBUaW1lCisjIFNlZToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbCI+CisjIE5JUFIgQW50YXJjdGljIFJlc2VhcmNoIEFjdGl2aXRpZXMgKDE5OTktMDgtMTcpCisjIDwvYT4KKworIyBTIEtvcmVhIC0geWVhci1yb3VuZCBiYXNlCisjIEtpbmcgU2Vqb25nLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjEzLTA1ODQ3LCBzaW5jZSAxOTg4CisKKyMgTmV3IFplYWxhbmQgLSBjbGFpbXMKKyMgQmFsbGVueSBJc2xhbmRzIChuZXZlciBpbmhhYml0ZWQpCisjIFNjb3R0IElzbGFuZCAobmV2ZXIgaW5oYWJpdGVkKQorIworIyB5ZWFyLXJvdW5kIGJhc2UKKyMgU2NvdHQsIFJvc3MgSXNsYW5kLCBzaW5jZSAxOTU3LTAxLCBpcyBsaWtlIEFudGFyY3RpY2EvTWNNdXJkby4KKyMKKyMgVGhlc2UgcnVsZXMgZm9yIE5ldyBaZWFsYW5kIGFyZSBzdG9sZW4gZnJvbSB0aGUgYGF1c3RyYWxhc2lhJyBmaWxlLgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTlpBUQkxOTc0CW9ubHkJLQlOb3YJIDMJMjowMHMJMTowMAlECitSdWxlCU5aQVEJMTk3NQkxOTg4CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCU5aQVEJMTk4OQlvbmx5CS0JT2N0CSA4CTI6MDBzCTE6MDAJRAorUnVsZQlOWkFRCTE5OTAJMjAwNgktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECitSdWxlCU5aQVEJMTk3NQlvbmx5CS0JRmViCTIzCTI6MDBzCTAJUworUnVsZQlOWkFRCTE5NzYJMTk4OQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCU5aQVEJMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCitSdWxlCU5aQVEJMjAwNwltYXgJLQlTZXAJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJTlpBUQkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAlTCisKKyMgTm9yd2F5IC0gdGVycml0b3JpZXMKKyMgQm91dmV0IChuZXZlciBpbmhhYml0ZWQpCisjCisjIGNsYWltcworIyBQZXRlciBJIElzbGFuZCAobmV2ZXIgaW5oYWJpdGVkKQorCisjIFBvbGFuZCAtIHllYXItcm91bmQgYmFzZQorIyBBcmN0b3dza2ksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMDk0NS0wNTgyNzQ1LCBzaW5jZSAxOTc3CisKKyMgUnVzc2lhIC0geWVhci1yb3VuZCBiYXNlcworIyBCZWxsaW5nc2hhdXNlbiwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIxMTU5LTA1ODUzMzcsIHNpbmNlIDE5NjgtMDItMjIKKyMgTWlybnksIERhdmlzIGNvYXN0LCAtNjYzMyswOTMwMSwgc2luY2UgMTk1Ni0wMgorIyBNb2xvZGV6aG5heWEsIEFsYXNoZXlldiBCYXksIC02NzQwKzA0NTUxLAorIwl5ZWFyLXJvdW5kIGZyb20gMTk2Mi0wMiB0byAxOTk5LTA3LTAxCisjIE5vdm9sYXphcmV2c2theWEsIFF1ZWVuIE1hdWQgTGFuZCwgLTcwNDYrMDExNTAsCisjCXllYXItcm91bmQgZnJvbSAxOTYwLzYxIHRvIDE5OTIKKworIyBWb3N0b2ssIHNpbmNlIDE5NTctMTItMTYsIHRlbXBvcmFyaWx5IGNsb3NlZCAxOTk0LTAyLzE5OTQtMTEKKyMgPGEgaHJlZj0iaHR0cDovL3F1ZXN0LmFyYy5uYXNhLmdvdi9hbnRhcmN0aWNhL1FBL2NvbXB1dGVycy9EaXJlY3Rpb25zLFRpbWUsWklQIj4KKyMgRnJvbSBDcmFpZyBNdW5kZWxsICgxOTk0LTEyLTE1KTwvYT46CisjIFZvc3Rvaywgd2hpY2ggaXMgb25lIG9mIHRoZSBSdXNzaWFuIHN0YXRpb25zLCBpcyBzZXQgb24gdGhlIHNhbWUKKyMgdGltZSBhcyBNb3Njb3csIFJ1c3NpYS4KKyMKKyMgRnJvbSBMZWUgSG90eiAoMjAwMS0wMy0wOCk6CisjIEkgcXVlcmllZCB0aGUgZm9sa3MgYXQgQ29sdW1iaWEgd2hvIHNwZW50IHRoZSBzdW1tZXIgYXQgVm9zdG9rIGFuZCB0aGlzIGlzCisjIHdoYXQgdGhleSBoYWQgdG8gc2F5IGFib3V0IHRpbWUgdGhlcmU6CisjIGBgaW4gdGhlIFVTIENhbXAgKEVhc3QgQ2FtcCkgd2UgaGF2ZSBiZWVuIG9uIE5ldyBaZWFsYW5kIChNY011cmRvKQorIyB0aW1lLCB3aGljaCBpcyAxMiBob3VycyBhaGVhZCBvZiBHTVQuIFRoZSBSdXNzaWFuIFN0YXRpb24gVm9zdG9rIHdhcworIyA2IGhvdXJzIGJlaGluZCB0aGF0IChhbHRob3VnaCBvbmx5IDIgbWlsZXMgYXdheSwgaS5lLiA2IGhvdXJzIGFoZWFkCisjIG9mIEdNVCkuIFRoaXMgaXMgYSB0aW1lIHpvbmUgSSB0aGluayB0d28gaG91cnMgZWFzdCBvZiBNb3Njb3cuIFRoZQorIyBuYXR1cmFsIHRpbWUgem9uZSBpcyBpbiBiZXR3ZWVuIHRoZSB0d286IDggaG91cnMgYWhlYWQgb2YgR01ULicnCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDUtMDQpOgorIyBUaGlzIHNlZW1zIHRvIGJlIGhvcGVsZXNzbHkgY29uZnVzaW5nLCBzbyBJIGFza2VkIExlZSBIb3R6IGFib3V0IGl0CisjIGluIHBlcnNvbi4gIEhlIHNhaWQgdGhhdCBzb21lIEFudGFydGljIGxvY2F0aW9ucyBzZXQgdGhlaXIgbG9jYWwKKyMgdGltZSBzbyB0aGF0IG5vb24gaXMgdGhlIHdhcm1lc3QgcGFydCBvZiB0aGUgZGF5LCBhbmQgdGhhdCB0aGlzCisjIGNoYW5nZXMgZHVyaW5nIHRoZSB5ZWFyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lYW4KKyMgc29sYXIgbm9vbi4gIFNvIHRoZSBWb3N0b2sgdGltZSBtaWdodCBoYXZlIGJlZW4gd2hhdGV2ZXIgdGhlIGNsb2NrcworIyBoYXBwZW5lZCB0byBiZSBkdXJpbmcgdGhlaXIgdmlzaXQuICBTbyB3ZSBzdGlsbCBkb24ndCByZWFsbHkga25vdyB3aGF0IHRpbWUKKyMgaXQgaXMgYXQgVm9zdG9rLiAgQnV0IHdlJ2xsIGd1ZXNzIFVUQys2LgorIworWm9uZSBBbnRhcmN0aWNhL1Zvc3RvawkwCS0Jenp6CTE5NTcgRGVjIDE2CisJCQk2OjAwCS0JVk9TVAkjIFZvc3RvayB0aW1lCisKKyMgUyBBZnJpY2EgLSB5ZWFyLXJvdW5kIGJhc2VzCisjIE1hcmlvbiBJc2xhbmQsIC00NjUzKzAzNzUyCisjIFNhbmFlLCAtNzE0MS0wMDI1MAorCisjIFVLCisjCisjIEJyaXRpc2ggQW50YXJjdGljIFRlcnJpdG9yaWVzIChCQVQpIGNsYWltcworIyBTb3V0aCBPcmtuZXkgSXNsYW5kcworIwlzY2llbnRpZmljIHN0YXRpb24gZnJvbSAxOTAzCisjCXdoYWxpbmcgc3RhdGlvbiBhdCBTaWdueSBJIDE5MjAvMTkyNgorIyBTb3V0aCBTaGV0bGFuZCBJc2xhbmRzCisjCisjIHllYXItcm91bmQgYmFzZXMKKyMgQmlyZCBJc2xhbmQsIFNvdXRoIEdlb3JnaWEsIC01NDAwLTAzODAzLCBzaW5jZSAxOTgzCisjIERlY2VwdGlvbiBJc2xhbmQsIC02MjU5LTA2MDM0LCB3aGFsaW5nIHN0YXRpb24gMTkxMi8xOTMxLAorIwlzY2llbnRpZmljIHN0YXRpb24gMTk0My8xOTY3LAorIwlwcmV2aW91c2x5IHNlYWxlcnMgYW5kIGEgc2NpZW50aWZpYyBleHBlZGl0aW9uIHdpbnRlcmVkIGJ5IGFjY2lkZW50LAorIwlhbmQgYSBnYXJyaXNvbiB3YXMgZGVwbG95ZWQgYnJpZWZseQorIyBIYWxsZXksIENvYXRlcyBMYW5kLCAtNzUzNS0wMjYwNCwgc2luY2UgMTk1Ni0wMS0wNgorIwlIYWxsZXkgaXMgb24gYSBtb3ZpbmcgaWNlIHNoZWxmIGFuZCBpcyBwZXJpb2RpY2FsbHkgcmVsb2NhdGVkCisjCXNvIHRoYXQgaXQgaXMgbmV2ZXIgbW9yZSB0aGFuIDEwa20gZnJvbSBpdHMgbm9taW5hbCBsb2NhdGlvbi4KKyMgUm90aGVyYSwgQWRlbGFpZGUgSXNsYW5kLCAtNjczNC02ODA4LCBzaW5jZSAxOTc2LTEyLTAxCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMjIpCisjIDxodHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL2cuaHRtbD4gc2F5cyBSb3RoZXJhIGlzIC0wMyBhbGwgeWVhci4KKyMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW50YXJjdGljYS9Sb3RoZXJhCTAJLQl6enoJMTk3NiBEZWMgIDEKKwkJCS0zOjAwCS0JUk9UVAkjIFJvdGhlcmEgdGltZQorCisjIFVydWd1YXkgLSB5ZWFyIHJvdW5kIGJhc2UKKyMgQXJ0aWdhcywgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIxMTA0LTA1ODUxMDcKKworIyBVU0EgLSB5ZWFyLXJvdW5kIGJhc2VzCisjCisjIFBhbG1lciwgQW52ZXJzIElzbGFuZCwgc2luY2UgMTk2NSAobW92ZWQgMiBtaWxlcyBpbiAxOTY4KQorIworIyBGcm9tIEV0aGFuIERpY2tzICgxOTk2LTEwLTA2KToKKyMgSXQga2VlcHMgdGhlIHNhbWUgdGltZSBhcyBQdW50YSBBcmVuYXMsIENoaWxlLCBiZWNhdXNlLCBqdXN0IGxpa2UgdXMKKyMgYW5kIHRoZSBTb3V0aCBQb2xlLCB0aGF0J3MgdGhlIG90aGVyIGVuZCBvZiB0aGVpciBzdXBwbHkgbGluZS4uLi4KKyMgSSB2ZXJpZmllZCB3aXRoIHNvbWVvbmUgd2hvIHdhcyB0aGVyZSB0aGF0IHNpbmNlIDE5ODAsCisjIFBhbG1lciBoYXMgZm9sbG93ZWQgQ2hpbGUuICBQcmlvciB0byB0aGF0LCBiZWZvcmUgdGhlIEZhbGtsYW5kcyBXYXIsCisjIFBhbG1lciB1c2VkIHRvIGJlIHN1cHBsaWVkIGZyb20gQXJnZW50aW5hLgorIworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbnRhcmN0aWNhL1BhbG1lcgkwCS0Jenp6CTE5NjUKKwkJCS00OjAwCUFyZ0FRCUFSJXNUCTE5NjkgT2N0IDUKKwkJCS0zOjAwCUFyZ0FRCUFSJXNUCTE5ODIgTWF5CisJCQktNDowMAlDaGlsZUFRCUNMJXNUCisjCisjCisjIE1jTXVyZG8sIFJvc3MgSXNsYW5kLCBzaW5jZSAxOTU1LTEyCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFudGFyY3RpY2EvTWNNdXJkbwkwCS0Jenp6CTE5NTYKKwkJCTEyOjAwCU5aQVEJTlolc1QKKyMKKyMgQW11bmRzZW4tU2NvdHQsIFNvdXRoIFBvbGUsIGNvbnRpbnVvdXNseSBvY2N1cGllZCBzaW5jZSAxOTU2LTExLTIwCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDktMDMpOgorIyBOb3JtYWxseSBpdCB3b3VsZG4ndCBoYXZlIGEgc2VwYXJhdGUgZW50cnksIHNpbmNlIGl0J3MgbGlrZSB0aGUKKyMgbGFyZ2VyIEFudGFyY3RpY2EvTWNNdXJkbyBzaW5jZSAxOTcwLCBidXQgaXQncyB0b28gZmFtb3VzIHRvIG9taXQuCisjCisjIEZyb20gQ2hyaXMgQ2FycmllciAoMTk5Ni0wNi0yNyk6CisjIFNpcGxlLCB0aGUgZmlyc3QgY29tbWFuZGVyIG9mIHRoZSBTb3V0aCBQb2xlIHN0YXRpb24sCisjIHN0YXRlZCB0aGF0IGhlIHdvdWxkIGhhdmUgbGlrZWQgdG8gaGF2ZSBrZXB0IEdNVCBhdCB0aGUgc3RhdGlvbiwKKyMgYnV0IHRoYXQgaGUgZm91bmQgaXQgbW9yZSBjb252ZW5pZW50IHRvIGtlZXAgR01UKzEyCisjIGFzIHN1cHBsaWVzIGZvciB0aGUgc3RhdGlvbiB3ZXJlIGNvbWluZyBmcm9tIE1jTXVyZG8gU291bmQsCisjIHdoaWNoIHdhcyBvbiBHTVQrMTIgYmVjYXVzZSBOZXcgWmVhbGFuZCB3YXMgb24gR01UKzEyIGFsbCB5ZWFyCisjIGF0IHRoYXQgdGltZSAoMTk1NykuICAoU291cmNlOiBTaXBsZSdzIGJvb2sgOTAgZGVncmVlcyBTT1VUSC4pCisjCisjIEZyb20gU3VzYW4gU21pdGgKKyMgaHR0cDovL3d3dy5jeWJlcnRvdXJzLmNvbS93aHMvcG9sZTEwLmh0bWwKKyMgKDE5OTUtMTEtMTMgMTY6MjQ6NTYgKzEzMDAsIG5vIGxvbmdlciBhdmFpbGFibGUpOgorIyBXZSB1c2UgdGhlIHNhbWUgdGltZSBhcyBNY011cmRvIGRvZXMuCisjIEFuZCB0aGV5IHVzZSB0aGUgc2FtZSB0aW1lIGFzIENocmlzdGNodXJjaCwgTlogZG9lcy4uLi4KKyMgT25lIGxhc3QgcXVpcmsgYWJvdXQgU291dGggUG9sZSB0aW1lLgorIyBBbGwgdGhlIGVsZWN0cmljIGNsb2NrcyBhcmUgdXN1YWxseSB3cm9uZy4KKyMgU29tZXRoaW5nIGFib3V0IHRoZSBnZW5lcmF0b3JzIHJ1bm5pbmcgYXQgNjAuMWhlcnR6IG9yIHNvbWV0aGluZworIyBtYWtlcyBhbGwgb2YgdGhlIGNsb2NrcyBydW4gZmFzdC4gIFNvIGV2ZXJ5IGNvdXBsZSBvZiBkYXlzLAorIyB3ZSBoYXZlIHRvIGdvIGFyb3VuZCBhbmQgc2V0IHRoZW0gYmFjayA1IG1pbnV0ZXMgb3Igc28uCisjIE1heWJlIGlmIHdlIGxldCB0aGVtIHJ1biBmYXN0IGFsbCBvZiB0aGUgdGltZSwgd2UnZCBnZXQgdG8gbGVhdmUgaGVyZSBzb29uZXIhIQorIworTGluawlBbnRhcmN0aWNhL01jTXVyZG8JQW50YXJjdGljYS9Tb3V0aF9Qb2xlCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA5cy9hc2lhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvYXNpYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTg3ZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvYXNpYQpAQCAtMCwwICsxLDIzOTYgQEAKKyMgQCgjKWFzaWEJOC40NAorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKKyMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bworIyB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjCisjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcworIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCisjIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCisjCisjIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKKyMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0CisjIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKKyMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKKyMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCisjCisjIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgorIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCisjCisjIEFub3RoZXIgc291cmNlIG9jY2FzaW9uYWxseSB1c2VkIGlzIEVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAorIyBXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLCB3aGljaAorIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCisjCisjIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcworIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KKyMKKyMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgYConIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CisjIHRoZSByZXN0IGFyZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvciBmcm9tIG90aGVyIHNvdXJjZXMuCisjIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQorIwkgICAgIHN0ZCAgZHN0CisjCSAgICAgTE1UCUxvY2FsIE1lYW4gVGltZQorIwkyOjAwIEVFVCAgRUVTVAlFYXN0ZXJuIEV1cm9wZWFuIFRpbWUKKyMJMjowMCBJU1QgIElEVAlJc3JhZWwKKyMJMzowMCBBU1QgIEFEVAlBcmFiaWEqCisjCTM6MzAgSVJTVCBJUkRUCUlyYW4KKyMJNDowMCBHU1QJR3VsZioKKyMJNTozMCBJU1QJSW5kaWEKKyMJNzowMCBJQ1QJSW5kb2NoaW5hKgorIwk3OjAwIFdJVAl3ZXN0IEluZG9uZXNpYQorIwk4OjAwIENJVAljZW50cmFsIEluZG9uZXNpYQorIwk4OjAwIENTVAlDaGluYQorIwk5OjAwIENKVAlDZW50cmFsIEphcGFuZXNlIFRpbWUgKDE4OTYvMTkzNykqCisjCTk6MDAgRUlUCWVhc3QgSW5kb25lc2lhCisjCTk6MDAgSlNUICBKRFQJSmFwYW4KKyMJOTowMCBLU1QgIEtEVAlLb3JlYQorIwk5OjMwIENTVAkoQXVzdHJhbGlhbikgQ2VudHJhbCBTdGFuZGFyZCBUaW1lCisjCisjIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgUnVzc2lhIGFuZCBUdXJrZXkgaW4gQXNpYS4KKworIyBGcm9tIEd1eSBIYXJyaXM6CisjIEluY29ycG9yYXRlcyBkYXRhIGZvciBTaW5nYXBvcmUgZnJvbSBSb2JlcnQgRWx6JyBhc2lhIDEuMSwgYXMgd2VsbCBhcworIyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gVG9tIFlhcCwgU3VuIE1pY3Jvc3lzdGVtcyBJbnRlcmNvbnRpbmVudGFsCisjIFRlY2huaWNhbCBTdXBwb3J0IChpbmNsdWRpbmcgYSBwYWdlIGZyb20gdGhlIE9mZmljaWFsIEFpcmxpbmUgR3VpZGUgLQorIyBXb3JsZHdpZGUgRWRpdGlvbikuICBUaGUgbmFtZXMgZm9yIHRpbWUgem9uZXMgYXJlIGd1ZXNzZXMuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGVzZSBydWxlcyBhcmUgc3RvbGVuIGZyb20gdGhlIGBldXJvcGUnIGZpbGUuCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlFVUFzaWEJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMTowMHUJMTowMAlTCitSdWxlCUVVQXNpYQkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMTowMHUJMAktCitSdWxlCUVVQXNpYQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAxOjAwdQkwCS0KK1J1bGUgRS1FdXJBc2lhCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDA6MDAJMTowMAlTCitSdWxlIEUtRXVyQXNpYQkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMDowMAkwCS0KK1J1bGUgRS1FdXJBc2lhCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDA6MDAJMAktCitSdWxlIFJ1c3NpYUFzaWEJMTk4MQkxOTg0CS0JQXByCTEJIDA6MDAJMTowMAlTCitSdWxlIFJ1c3NpYUFzaWEJMTk4MQkxOTgzCS0JT2N0CTEJIDA6MDAJMAktCitSdWxlIFJ1c3NpYUFzaWEJMTk4NAkxOTkxCS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQorUnVsZSBSdXNzaWFBc2lhCTE5ODUJMTk5MQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKK1J1bGUgUnVzc2lhQXNpYQkxOTkyCW9ubHkJLQlNYXIJbGFzdFNhdAkyMzowMAkxOjAwCVMKK1J1bGUgUnVzc2lhQXNpYQkxOTkyCW9ubHkJLQlTZXAJbGFzdFNhdAkyMzowMAkwCS0KK1J1bGUgUnVzc2lhQXNpYQkxOTkzCW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKK1J1bGUgUnVzc2lhQXNpYQkxOTkzCTE5OTUJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCitSdWxlIFJ1c3NpYUFzaWEJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCisKKyMgQWZnaGFuaXN0YW4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9LYWJ1bAk0OjM2OjQ4IC0JTE1UCTE4OTAKKwkJCTQ6MDAJLQlBRlQJMTk0NQorCQkJNDozMAktCUFGVAorCisjIEFybWVuaWEKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBoYXZlIFllcmV2YW4gc3dpdGNoaW5nIHRvIDM6MDAgKHdpdGggUnVzc2lhbiBEU1QpCisjIGluIHNwcmluZyAxOTkxLCB0aGVuIHRvIDQ6MDAgd2l0aCBubyBEU1QgaW4gZmFsbCAxOTk1LCB0aGVuCisjIHJlYWRvcHRpbmcgUnVzc2lhbiBEU1QgaW4gMTk5Ny4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLCBldmVuCisjIHdoZW4gdGhleSBkaXNhZ3JlZSB3aXRoIG90aGVycy4gIEVkZ2FyIERlci1EYW5pZWxpYW50egorIyByZXBvcnRlZCAoMTk5Ni0wNS0wNCkgdGhhdCBZZXJldmFuIHByb2JhYmx5IHdvdWxkbid0IHVzZSBEU1QKKyMgaW4gMTk5NiwgdGhvdWdoIGl0IGRpZCB1c2UgRFNUIGluIDE5OTUuICBJQVRBIFNTSU0gKDE5OTEvMTk5OCkgcmVwb3J0cyB0aGF0CisjIEFybWVuaWEgc3dpdGNoZWQgZnJvbSAzOjAwIHRvIDQ6MDAgaW4gMTk5OCBhbmQgb2JzZXJ2ZWQgRFNUIGFmdGVyIDE5OTEsCisjIGJ1dCBzdGFydGVkIHN3aXRjaGluZyBhdCAzOjAwcyBpbiAxOTk4LgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1llcmV2YW4JMjo1ODowMCAtCUxNVAkxOTI0IE1heSAgMgorCQkJMzowMAktCVlFUlQJMTk1NyBNYXIgICAgIyBZZXJldmFuIFRpbWUKKwkJCTQ6MDAgUnVzc2lhQXNpYSBZRVIlc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCTM6MDAJMTowMAlZRVJTVAkxOTkxIFNlcCAyMyAjIGluZGVwZW5kZW5jZQorCQkJMzowMCBSdXNzaWFBc2lhCUFNJXNUCTE5OTUgU2VwIDI0IDI6MDBzCisJCQk0OjAwCS0JQU1UCTE5OTcKKwkJCTQ6MDAgUnVzc2lhQXNpYQlBTSVzVAorCisjIEF6ZXJiYWlqYW4KKyMgRnJvbSBSdXN0YW0gQWxpeWV2IG9mIHRoZSBBemVyYmFpamFuIEludGVybmV0IEZvcnVtICgyMDA1LTEwLTIzKToKKyMgQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIENhYmluZXQgb2YgTWluaXN0ZXJzLCAxOTk3CisjIFJlc29sdXRpb24gYXZhaWxhYmxlIGF0OiBodHRwOi8vYWlmLmF6L2RvY3MvZGF5bGlnaHRfcmVzLnBkZgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQXplcgkxOTk3CW1heAktCU1hcglsYXN0U3VuCSA0OjAwCTE6MDAJUworUnVsZQlBemVyCTE5OTcJbWF4CS0JT2N0CWxhc3RTdW4JIDU6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvQmFrdQkzOjE5OjI0IC0JTE1UCTE5MjQgTWF5ICAyCisJCQkzOjAwCS0JQkFLVAkxOTU3IE1hciAgICAjIEJha3UgVGltZQorCQkJNDowMCBSdXNzaWFBc2lhIEJBSyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJMzowMAkxOjAwCUJBS1NUCTE5OTEgQXVnIDMwICMgaW5kZXBlbmRlbmNlCisJCQkzOjAwIFJ1c3NpYUFzaWEJQVolc1QJMTk5MiBTZXAgbGFzdFNhdCAyMzowMAorCQkJNDowMAktCUFaVAkxOTk2ICMgQXplcmJhaWphbiB0aW1lCisJCQk0OjAwCUVVQXNpYQlBWiVzVAkxOTk3CisJCQk0OjAwCUF6ZXIJQVolc1QKKworIyBCYWhyYWluCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvQmFocmFpbgkzOjIyOjIwIC0JTE1UCTE5MjAJCSMgQWwgTWFuYW1haAorCQkJNDowMAktCUdTVAkxOTcyIEp1bgorCQkJMzowMAktCUFTVAorCisjIEJhbmdsYWRlc2gKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDUtMTMpOgorIyBBY2NvcmRpbmcgdG8gbmV3c3BhcGVyIEFzaWFuIFRyaWJ1bmUgKE1heSA2LCAyMDA5KSBCYW5nbGFkZXNoIG1heSBpbnRyb2R1Y2UKKyMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZnJvbSBKdW5lIDE2IHRvIFNlcHQgMzAKKyMKKyMgQmFuZ2xhZGVzaCB0byBpbnRyb2R1Y2UgZGF5bGlnaHQgc2F2aW5nIHRpbWUgbGlrZWx5IGZyb20gSnVuZSAxNgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzaWFudHJpYnVuZS5jb20vP3E9bm9kZS8xNzI4OCI+CisjIGh0dHA6Ly93d3cuYXNpYW50cmlidW5lLmNvbS8/cT1ub2RlLzE3Mjg4CisjIDwvYT4KKyMgb3IKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDIuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDAyLmh0bWwKKyMgPC9hPgorIworIyAiLi4uIEJhbmdsYWRlc2ggZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBzd2l0Y2ggZGF5bGlnaHQgc2F2aW5nIHRpbWUgZnJvbQorIyBKdW5lCisjIDE2IHRpbGwgU2VwdGVtYmVyIDMwIGluIGEgYmlkIHRvIGVuc3VyZSBtYXhpbXVtIHVzZSBvZiBkYXlsaWdodCB0byBjb3BlIHdpdGgKKyMgY3JpcHBsaW5nIHBvd2VyIGNyaXNpcy4gIgorIworIyBUaGUgc3dpdGNoIHdpbGwgcmVtYWluIGluIGVmZmVjdCBmcm9tIEp1bmUgMTYgdG8gU2VwdCAzMCAoMjAwOSkgYnV0IGlmCisjIGltcGxlbWVudGVkIHRoZSBuZXh0IHllYXIsIGl0IHdpbGwgY29tZSBpbiBmb3JjZSBmcm9tIEFwcmlsIDEsIDIwMTAKKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wNi0wMik6CisjIFRoZXkgaGF2ZSBmaW5hbGx5IGRlY2lkZWQgbm93LCBidXQgY2hhbmdlZCB0aGUgc3RhcnQgZGF0ZSB0byBtaWRuaWdodCBiZXR3ZWVuCisjIHRoZSAxOXRoIGFuZCAyMHRoLCBhbmQgdGhleSBoYXZlIG5vdCBzZXQgdGhlIGVuZCBkYXRlIHlldC4KKyMKKyMgU29tZSBzb3VyY2VzOgorIyA8YSBocmVmPSJodHRwOi8vaW4ucmV1dGVycy5jb20vYXJ0aWNsZS9zb3V0aEFzaWFOZXdzL2lkSU5JbmRpYS00MDAxNzYyMDA5MDYwMSI+CisjIGh0dHA6Ly9pbi5yZXV0ZXJzLmNvbS9hcnRpY2xlL3NvdXRoQXNpYU5ld3MvaWRJTkluZGlhLTQwMDE3NjIwMDkwNjAxCisjIDwvYT4KKyMgPGEgaHJlZj0iaHR0cDovL2JkbmV3czI0LmNvbS9kZXRhaWxzLnBocD9pZD04NTg4OSZjaWQ9MiI+CisjIGh0dHA6Ly9iZG5ld3MyNC5jb20vZGV0YWlscy5waHA/aWQ9ODU4ODkmY2lkPTIKKyMgPC9hPgorIworIyBPdXIgd3JhcC11cDoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JhbmdsYWRlc2gtZGF5bGlnaHQtc2F2aW5nLTIwMDkuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9iYW5nbGFkZXNoLWRheWxpZ2h0LXNhdmluZy0yMDA5Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gQS4gTi4gTS4gS2FtcnVzIFNhYWRhdCAoMjAwOS0wNi0xNSk6CisjIEZpbmFsbHkgd2UndmUgZ290IHRoZSBvZmZpY2lhbCBtYWlsIHJlZ2FyZGluZyBEU1Qgc3RhcnQgdGltZSB3aGVyZSBEU1Qgc3RhcnQgCisjIHRpbWUgaXMgbWVudGlvbmVkIGFzIEp1biAxOSAyMDA5LCAyMzowMCBmcm9tIEJUUkMgKEJhbmdsYWRlc2ggCisjIFRlbGVjb21tdW5pY2F0aW9uIFJlZ3VsYXRvcnkgQ29tbWlzc2lvbikuIAorIworIyBObyBEU1QgZW5kIGRhdGUgaGFzIGJlZW4gYW5ub3VuY2VkIHlldC4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wOS0yNSk6CisjIEJhbmdsYWRlc2ggd29uJ3QgZ28gYmFjayB0byBTdGFuZGFyZCBUaW1lIGZyb20gT2N0b2JlciAxLCAyMDA5LCAKKyMgaW5zdGVhZCBpdCB3aWxsIGNvbnRpbnVlIERTVCBtZWFzdXJlIHRpbGwgdGhlIGNhYmluZXQgbWFrZXMgYSBmcmVzaCBkZWNpc2lvbi4gCisjCisjIEZvbGxvd2luZyByZXBvcnQgYnkgc2FtZSBuZXdzcGFwZXItIlRoZSBEYWlseSBTdGFyIEZyaWRheSI6CisjICJEU1QgY2hhbmdlIGF3YWl0cyBjYWJpbmV0IGRlY2lzaW9uLUNsb2NrIHdvbid0IGdvIGJhY2sgYnkgMS1ociBmcm9tIE9jdCAxIgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL25ld3MtZGV0YWlscy5waHA/bmlkPTEwNzAyMSI+CisjIGh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTA3MDIxCisjIDwvYT4KKyMgb3IKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDQuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA0Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTEzKToKKyMgSUFOUyAoSW5kby1Bc2lhbiBOZXdzIFNlcnZpY2UpIG5vdyByZXBvcnRzOgorIyBCYW5nbGFkZXNoIGhhcyBkZWNpZGVkIHRoYXQgdGhlIGNsb2NrIGFkdmFuY2VkIGJ5IGFuIGhvdXIgdG8gbWFrZSAKKyMgbWF4aW11bSB1c2Ugb2YgZGF5bGlnaHQgaG91cnMgYXMgYW4gZW5lcmd5IHNhdmluZyBtZWFzdXJlIHdvdWxkIAorIyAiY29udGludWUgZm9yIGFuIGluZGVmaW5pdGUgcGVyaW9kLiIKKyMKKyMgT25lIG9mIG1hbnkgcGxhY2VzIHdoZXJlIGl0IGlzIHB1Ymxpc2hlZDoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sIj4KKyMgaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sCisjIDwvYT4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0RoYWthCTY6MDE6NDAgLQlMTVQJMTg5MAorCQkJNTo1MzoyMAktCUhNVAkxOTQxIE9jdCAgICAjIEhvd3JhaCBNZWFuIFRpbWU/CisJCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAxNSAjIEJ1cm1hIFRpbWUKKwkJCTU6MzAJLQlJU1QJMTk0MiBTZXAKKwkJCTY6MzAJLQlCVVJUCTE5NTEgU2VwIDMwCisJCQk2OjAwCS0JREFDVAkxOTcxIE1hciAyNiAjIERhY2NhIFRpbWUKKwkJCTY6MDAJLQlCRFQJMjAwOSBKdW4gMTkgMjM6MDAgIyBCYW5nbGFkZXNoIFRpbWUKKwkJCTY6MDAJMTowMAlCRFNUCisKKyMgQmh1dGFuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvVGhpbXBodQk1OjU4OjM2IC0JTE1UCTE5NDcgQXVnIDE1ICMgb3IgVGhpbWJ1CisJCQk1OjMwCS0JSVNUCTE5ODcgT2N0CisJCQk2OjAwCS0JQlRUCSMgQmh1dGFuIFRpbWUKKworIyBCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkKKyMgV2hpdG1hbiBhbmQgdGhlIDE5OTUgQ0lBIHRpbWUgem9uZSBtYXAgc2F5IDU6MDAsIGJ1dCB0aGUKKyMgMTk5NyBhbmQgbGF0ZXIgbWFwcyBzYXkgNjowMC4gIEFzc3VtZSB0aGUgc3dpdGNoIG9jY3VycmVkIGluIDE5OTYuCisjIFdlIGhhdmUgbm8gaW5mb3JtYXRpb24gYXMgdG8gd2hlbiBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkOworIyBhc3N1bWUgaXQgb2NjdXJyZWQgaW4gMTkwNywgdGhlIHNhbWUgeWVhciBhcyBNYXVyaXRpdXMgKHdoaWNoCisjIHRoZW4gY29udGFpbmVkIHRoZSBDaGFnb3MgQXJjaGlwZWxhZ28pLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlJbmRpYW4vQ2hhZ29zCTQ6NDk6NDAJLQlMTVQJMTkwNworCQkJNTowMAktCUlPVAkxOTk2ICMgQklPVCBUaW1lCisJCQk2OjAwCS0JSU9UCisKKyMgQnJ1bmVpCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvQnJ1bmVpCTc6Mzk6NDAgLQlMTVQJMTkyNiBNYXIgICAjIEJhbmRhciBTZXJpIEJlZ2F3YW4KKwkJCTc6MzAJLQlCTlQJMTkzMworCQkJODowMAktCUJOVAorCisjIEJ1cm1hIC8gTXlhbm1hcgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1Jhbmdvb24JNjoyNDo0MCAtCUxNVAkxODgwCQkjIG9yIFlhbmdvbgorCQkJNjoyNDozNgktCVJNVAkxOTIwCSAgICMgUmFuZ29vbiBNZWFuIFRpbWU/CisJCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAgICMgQnVybWEgVGltZQorCQkJOTowMAktCUpTVAkxOTQ1IE1heSAzCisJCQk2OjMwCS0JTU1UCQkgICAjIE15YW5tYXIgVGltZQorCisjIENhbWJvZGlhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvUGhub21fUGVuaAk2OjU5OjQwIC0JTE1UCTE5MDYgSnVuICA5CisJCQk3OjA2OjIwCS0JU01UCTE5MTEgTWFyIDExIDA6MDEgIyBTYWlnb24gTVQ/CisJCQk3OjAwCS0JSUNUCTE5MTIgTWF5CisJCQk4OjAwCS0JSUNUCTE5MzEgTWF5CisJCQk3OjAwCS0JSUNUCisKKyMgQ2hpbmEKKworIyBGcm9tIEd1eSBIYXJyaXM6CisjIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hLiAgWWVzLCB0aGV5IHJlYWxseSBoYXZlIG9ubHkgb25lIHRpbWUgem9uZS4KKworIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgorIyBObyB0aGV5IGRvbid0LiAgU2VlIFRJTUUgbWFnLCAxOTg2LTAyLTE3IHAuNTIuICBFdmVuIHRob3VnaAorIyBDaGluYSBpcyBhY3Jvc3MgNCBwaHlzaWNhbCB0aW1lIHpvbmVzLCBiZWZvcmUgRmViIDEsIDE5ODYgb25seSB0aGUKKyMgUGVraW5nIChCZWppbmcpIHRpbWUgem9uZSB3YXMgcmVjb2duaXplZC4gIFNpbmNlIHRoYXQgZGF0ZSwgQ2hpbmEKKyMgaGFzIHR3byBvZiAnZW0gLS0gUGVraW5nJ3MgYW5kIFVydW1xaSAobmFtZWQgYWZ0ZXIgdGhlIGNhcGl0YWwgb2YKKyMgdGhlIFhpbmppYW5nIFV5Z2h1ciBBdXRvbm9tb3VzIFJlZ2lvbikuICBJIGRvbid0IGtub3cgYWJvdXQgRFNUIGZvciBpdC4KKyMKKyMgLiAuIC5JIGp1c3QgZGVsZXRlZCB0aGUgRFNUIHRhYmxlIGFuZCB0aGlzIGVkaXRvciBtYWtlcyBpdCB0b28KKyMgcGFpbmZ1bCB0byBzdWNrIGluIGFub3RoZXIgY29weS4uICBTbywgaGVyZSBpcyB3aGF0IEkgaGF2ZSBmb3IKKyMgRFNUIHN0YXJ0L2VuZCBkYXRlcyBmb3IgUGVraW5nJ3MgdGltZSB6b25lIChpbmZvIGZyb20gQVApOgorIworIyAgICAgMTk4NiBNYXkgNCAtIFNlcHQgMTQKKyMgICAgIDE5ODcgbWlkLUFwcmlsIC0gPz8KKworIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg5LTAxLTE5KToKKyMgQ0hJTkEgICAgICAgICAgICAgICA4IEggIEFIRUFEIE9GIFVUQyAgQUxMIE9GIENISU5BLCBJTkNMIFRBSVdBTgorIyBDSElOQSAgICAgICAgICAgICAgIDkgSCAgQUhFQUQgT0YgVVRDICBBUFIgMTcgLSBTRVAgMTAKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgQ2hpbmEgKGV4Y2VwdCBmb3IgSG9uZyBLb25nIGFuZCBNYWNhdSkKKyMgaGFzIGhhZCBhIHNpbmdsZSB0aW1lIHpvbmUgc2luY2UgMTk4MCBNYXkgMSwgb2JzZXJ2aW5nIHN1bW1lciBEU1QKKyMgZnJvbSAxOTg2IHRocm91Z2ggMTk5MTsgdGhpcyBjb250cmFkaWN0cyBEZXZpbmUncworIyBub3RlIGFib3V0IFRpbWUgbWFnYXppbmUsIHRob3VnaCBhcHBhcmVudGx5IF9zb21ldGhpbmdfIGhhcHBlbmVkIGluIDE5ODYuCisjIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGZvciBub3cuICBJIG1hZGUgdXAgbmFtZXMgZm9yIHRoZSBvdGhlcgorIyBwcmUtMTk4MCB0aW1lIHpvbmVzLgorCisjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJU2hhbmcJMTk0MAlvbmx5CS0JSnVuCSAzCTA6MDAJMTowMAlECitSdWxlCVNoYW5nCTE5NDAJMTk0MQktCU9jdAkgMQkwOjAwCTAJUworUnVsZQlTaGFuZwkxOTQxCW9ubHkJLQlNYXIJMTYJMDowMAkxOjAwCUQKK1J1bGUJUFJDCTE5ODYJb25seQktCU1heQkgNAkwOjAwCTE6MDAJRAorUnVsZQlQUkMJMTk4NgkxOTkxCS0JU2VwCVN1bj49MTEJMDowMAkwCVMKK1J1bGUJUFJDCTE5ODcJMTk5MQktCUFwcglTdW4+PTEwCTA6MDAJMTowMAlECisKKyMgRnJvbSBBbnRob255IEZvayAoMjAwMS0xMi0yMCk6CisjIEJUVywgSSBkaWQgc29tZSByZXNlYXJjaCBvbi1saW5lIGFuZCBmb3VuZCBzb21lIGluZm8gcmVnYXJkaW5nIHRoZXNlIGZpdmUKKyMgaGlzdG9yaWMgdGltZXpvbmVzIGZyb20gc29tZSBUYWl3YW4gd2Vic2l0ZXMuICBBbmQgeWVzLCB0aGVyZSBhcmUgb2ZmaWNpYWwKKyMgQ2hpbmVzZSBuYW1lcyBmb3IgdGhlc2UgbG9jYWxlcyAoYmVmb3JlIDE5NDkpLgorIworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNy0xNCk6CisjIEkgaGF2ZSBpbnZlc3RpZ2F0ZWQgdGhlIHRpbWV6b25lcyBhcm91bmQgMTk3MCBvbiB0aGUKKyMgaHR0cDovL3d3dy5hc3Ryby5jb20vYXRsYXMgc2l0ZSBbd2l0aCBwcm92aW5jZXMgYW5kIGNvdW50eQorIyBib3VuZGFyaWVzIHN1bW1hcml6ZWQgYmVsb3ddLi4uLiAgQSBmZXcgb3RoZXIgZXhjZXB0aW9ucyB3ZXJlIHR3bworIyBjb3VudGllcyBvbiB0aGUgU2ljaHVhbiBzaWRlIG9mIHRoZSBYaXphbmctU2ljaHVhbiBib3JkZXIsCisjIGNvdW50aWVzIERlZ2UgYW5kIEJhaXl1IHdoaWNoIGxpZXMgb24gdGhlIFNpY2h1YW4gc2lkZSBhbmQgYXJlCisjIHRoZXJlZm9yZSBzdXBwb3NlZCB0byBiZSBHTVQrNywgWGl6YW5nIHJlZ2lvbiBiZWluZyBHTVQrNiwgYnV0IERlZ2UKKyMgY291bnR5IGlzIEdNVCs4IGFjY29yZGluZyB0byBhc3Ryby5jb20gd2hpbGUgQmFpeXUgY291bnR5IGlzIEdNVCs2CisjIChjb3VsZCBiZSB0cnVlKSwgZm9yIHRoZSBtb21lbnQgSSBhbSBhc3N1bWluZyB0aGF0IHRob3NlIHR3bworIyBjb3VudGllcyBhcmUgbWlzdGFrZXMgaW4gdGhlIGFzdHJvLmNvbSBkYXRhLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDItMTEpOgorIyBJIGp1c3Qgbm93IGNoZWNrZWQgR29vZ2xlIE5ld3MgZm9yIHdlc3Rlcm4gbmV3cyBzb3VyY2VzIHRoYXQgdGFsaworIyBhYm91dCBDaGluYSdzIHNpbmdsZSB0aW1lIHpvbmUsIGFuZCBjb3VsZG4ndCBmaW5kIGFueXRoaW5nIGJlZm9yZSAxOTg2CisjIHRhbGtpbmcgYWJvdXQgQ2hpbmEgYmVpbmcgaW4gb25lIHRpbWUgem9uZS4gIChUaGF0IGFydGljbGUgd2FzOiBKaW0KKyMgTWFubiwgIkEgY2x1bXN5IGVtYnJhY2UgZm9yIGFub3RoZXIgd2VzdGVybiBjdXN0b206IENoaW5hIG9uIGRheWxpZ2h0CisjIHRpbWUtLXNvcnQgb2YiLCBMb3MgQW5nZWxlcyBUaW1lcywgMTk4Ni0wNS0wNS4gIEJ5IHRoZSB3YXksIHRoaXMKKyMgYXJ0aWNsZSBjb25maXJtcyB0aGUgdHogZGF0YWJhc2UncyBkYXRhIGNsYWltaW5nIHRoYXQgQ2hpbmEgYmVnYW4KKyMgb2JzZXJ2aW5nIGRheWxpZ2h0IHNhdmluZyB0aW1lIGluIDE5ODYuCisjCisjIEZyb20gVGhvbWFzIFMuIE11bGxhbmV5ICgyMDA4LTAyLTExKToKKyMgSSB0aGluayB5b3UncmUgY29tYmluaW5nIHR3byBzdWJqZWN0cyB0aGF0IG5lZWQgdG8gdHJlYXRlZCAKKyMgc2VwYXJhdGVseTogZGF5bGlnaHQgc2F2aW5ncyAod2hpY2gsIHlvdSdyZSBjb3JyZWN0LCB3YXNuJ3QgCisjIGltcGxlbWVudGVkIHVudGlsIHRoZSAxOTgwcykgYW5kIHRoZSB1bmlmaWVkIHRpbWUgem9uZSBjZW50ZXJlZCBuZWFyIAorIyBCZWlqaW5nICh3aGljaCB3YXMgaW1wbGVtZW50ZWQgaW4gMTk0OSkuIEJyaWVmbHksIHRoZXJlIHdhcyBhbHNvIGEgCisjICJMaGFzYSBUaW1lIiBpbiBUaWJldCBhbmQgIlVydW1xaSBUaW1lIiBpbiBYaW5qaWFuZy4gVGhlIGZpcnN0IHdhcyAKKyMgY2Vhc2VkLCBhbmQgdGhlIHNlY29uZCBldmVudHVhbGx5IHJlY29nbml6ZWQgKGFnYWluLCBpbiB0aGUgMTk4MHMpLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTA2LTMwKToKKyMgVGhlcmUgc2VlbXMgdG8gYmUgYSBnb29kIGNoYW5jZSBDaGluYSBzd2l0Y2hlZCB0byBhIHNpbmdsZSB0aW1lIHpvbmUgaW4gMTk0OQorIyByYXRoZXIgdGhhbiBpbiAxOTgwIGFzIFNoYW5rcyAmIFBvdHRlbmdlciBoYXZlIGl0LCBidXQgd2UgZG9uJ3QgaGF2ZSBhCisjIHJlbGlhYmxlIGRvY3VtZW50YXJ5IHNvdXJjZSBzYXlpbmcgc28geWV0LCBzbyBmb3Igbm93IHdlIHN0aWxsIGdvIHdpdGgKKyMgU2hhbmtzICYgUG90dGVuZ2VyLgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjIENoYW5nYmFpIFRpbWUgKCJMb25nLXdoaXRlIFRpbWUiLCBMb25nLXdoaXRlID0gSGVpbG9uZ2ppYW5nIGFyZWEpCisjIEhlaWxvbmdqaWFuZyAoZXhjZXB0IE1vaGUgY291bnR5KSwgSmlsaW4KK1pvbmUJQXNpYS9IYXJiaW4JODoyNjo0NAktCUxNVAkxOTI4ICMgb3IgSGFlcmJpbgorCQkJODozMAktCUNIQVQJMTkzMiBNYXIgIyBDaGFuZ2JhaSBUaW1lCisJCQk4OjAwCS0JQ1NUCTE5NDAKKwkJCTk6MDAJLQlDSEFUCTE5NjYgTWF5CisJCQk4OjMwCS0JQ0hBVAkxOTgwIE1heQorCQkJODowMAlQUkMJQyVzVAorIyBaaG9uZ3l1YW4gVGltZSAoIkNlbnRyYWwgcGxhaW4gVGltZSIpCisjIG1vc3Qgb2YgQ2hpbmEKK1pvbmUJQXNpYS9TaGFuZ2hhaQk4OjA1OjUyCS0JTE1UCTE5MjgKKwkJCTg6MDAJU2hhbmcJQyVzVAkxOTQ5CisJCQk4OjAwCVBSQwlDJXNUCisjIExvbmctc2h1IFRpbWUgKHByb2JhYmx5IGR1ZSB0byBMb25nIGFuZCBTaHUgYmVpbmcgdHdvIG5hbWVzIG9mIHRoYXQgYXJlYSkKKyMgR3Vhbmd4aSwgR3VpemhvdSwgSGFpbmFuLCBOaW5neGlhLCBTaWNodWFuLCBTaGFhbnhpLCBhbmQgWXVubmFuOworIyBtb3N0IG9mIEdhbnN1OyB3ZXN0IElubmVyIE1vbmdvbGlhOyB3ZXN0IFFpbmdoYWk7IGFuZCB0aGUgR3Vhbmdkb25nCisjIGNvdW50aWVzIERlcWluZywgRW5waW5nLCBLYWlwaW5nLCBMdW9kaW5nLCBUYWlzaGFuLCBYaW54aW5nLAorIyBZYW5nY2h1biwgWWFuZ2ppYW5nLCBZdSduYW4sIGFuZCBZdW5mdS4KK1pvbmUJQXNpYS9DaG9uZ3FpbmcJNzowNjoyMAktCUxNVAkxOTI4ICMgb3IgQ2h1bmdraW5nCisJCQk3OjAwCS0JTE9OVAkxOTgwIE1heSAjIExvbmctc2h1IFRpbWUKKwkJCTg6MDAJUFJDCUMlc1QKKyMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKQorIyBUaGUgR2Fuc3UgY291bnRpZXMgQWtzYXksIEFueGksIER1bmh1YW5nLCBTdWJlaTsgd2VzdCBRaW5naGFpOworIyB0aGUgR3Vhbmdkb25nIGNvdW50aWVzICBYdXdlbiwgSGFpa2FuZywgU3VpeGksIExpYW5qaWFuZywKKyMgWmhhbmppYW5nLCBXdWNodWFuLCBIdWF6aG91LCBHYW96aG91LCBNYW9taW5nLCBEaWFuYmFpLCBhbmQgWGlueWk7CisjIGVhc3QgVGliZXQsIGluY2x1ZGluZyBMaGFzYSwgQ2hhbWRvLCBTaGlnYWlzZSwgSmltc2FyLCBTaGF3YW4gYW5kIEh1dHViaTsKKyMgZWFzdCBYaW5qaWFuZywgaW5jbHVkaW5nIFVydW1xaSwgVHVycGFuLCBLYXJhbWF5LCBLb3JsYSwgTWluZmVuZywgSmluZ2hlLAorIyBXdXN1LCBRaWVtbywgWGlueWFuLCBXdWxhbnd1c3UsIEppbmdoZSwgWXVtaW4sIFRhY2hlbmcsIFR1b2xpLCBFbWluLAorIyBTaGloZXppLCBDaGFuZ2ppLCBZYW5xaSwgSGVzaHVvLCBUdW9rZXh1biwgVHVsdWZhbiwgU2hhbnNoYW4sIEhhbWksCisjIEZ1a2FuZywgS3VpdHVuLCBLdW11a3VsaSwgTWlxdWFuLCBRaXRhaSwgYW5kIFR1cmZhbi4KK1pvbmUJQXNpYS9VcnVtcWkJNTo1MDoyMAktCUxNVAkxOTI4ICMgb3IgVXJ1bWNoaQorCQkJNjowMAktCVVSVVQJMTk4MCBNYXkgIyBVcnVtcWkgVGltZQorCQkJODowMAlQUkMJQyVzVAorIyBLdW5sdW4gVGltZQorIyBXZXN0IFRpYmV0LCBpbmNsdWRpbmcgUHVsYW4sIEFoZXFpLCBTaHVmdSwgU2h1bGU7CisjIFdlc3QgWGluamlhbmcsIGluY2x1ZGluZyBBa3N1LCBBdHVzaGksIFlpbmluZywgSGV0aWFuLCBDZWxlLCBMdW9wdSwgTmlsZWtlLAorIyBaaGFvc3UsIFRla2VzaSwgR29uZ2xpdSwgQ2hhYnVjaGFlciwgSHVvY2hlbmcsIEJvbGUsIFBpc2hhbiwgU3VpZGluZywKKyMgYW5kIFlhcmthbmQuCitab25lCUFzaWEvS2FzaGdhcgk1OjAzOjU2CS0JTE1UCTE5MjggIyBvciBLYXNoaSBvciBLYXhnYXIKKwkJCTU6MzAJLQlLQVNUCTE5NDAJICMgS2FzaGdhciBUaW1lCisJCQk1OjAwCS0JS0FTVAkxOTgwIE1heQorCQkJODowMAlQUkMJQyVzVAorCisKKyMgRnJvbSBMZWUgWWl1IENodW5nICgyMDA5LTEwLTI0KToKKyMgSSBmb3VuZCB0aGVyZSBhcmUgc29tZSBtaXN0YWtlcyBmb3IgdGhlIGhpc3RvcmlhbCBEU1QgcnVsZSBmb3IgSG9uZworIyBLb25nLiBBY2NvcmluZyB0byB0aGUgRFNUIHJlY29yZCBmcm9tIEhvbmcgS29uZyBPYnNlcnZhdG9yeSAoYWN0dWFsbHksCisjIGl0IGlzIG5vdCBbYW5dIG9ic2VydmF0b3J5LCBidXQgdGhlIG9mZmljaWFsIG1ldGVvcm9sb2dpY2FsIGFnZW5jeSBvZiBISywKKyMgYW5kIGFsc28gc2VydmVzIGFzIHRoZSBvZmZpY2lhbCB0aW1pbmcgYWdlbmN5KSwgdGhlcmUgYXJlIHNvbWUgbWlzc2luZworIyBhbmQgaW5jb3JyZWN0IHJ1bGVzLiBBbHRob3VnaCB0aGUgZXhhY3Qgc3dpdGNoIG92ZXIgdGltZSBpcyBtaXNzaW5nLCBJCisjIHRoaW5rIDM6MzAgaXMgY29ycmVjdC4gVGhlIG9mZmljaWFsIERTVCByZWNvcmQgZm9yIEhvbmcgS29uZyBjYW4gYmUKKyMgb2J0YWluZWQgZnJvbQorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmhrby5nb3YuaGsvZ3RzL3RpbWUvU3VtbWVydGltZS5odG0iPgorIyBodHRwOi8vd3d3Lmhrby5nb3YuaGsvZ3RzL3RpbWUvU3VtbWVydGltZS5odG0KKyMgPC9hPi4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0xMC0yOCk6CisjIEhlcmUgYXJlIHRoZSBkYXRlcyBnaXZlbiBhdAorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmhrby5nb3YuaGsvZ3RzL3RpbWUvU3VtbWVydGltZS5odG0iPgorIyBodHRwOi8vd3d3Lmhrby5nb3YuaGsvZ3RzL3RpbWUvU3VtbWVydGltZS5odG0KKyMgPC9hPgorIyBhcyBvZiAyMDA5LTEwLTI4OgorIyBZZWFyICAgICAgICBQZXJpb2QKKyMgMTk0MSAgICAgICAgMSBBcHIgdG8gMzAgU2VwCisjIDE5NDIgICAgICAgIFdob2xlIHllYXIgCisjIDE5NDMgICAgICAgIFdob2xlIHllYXIKKyMgMTk0NCAgICAgICAgV2hvbGUgeWVhcgorIyAxOTQ1ICAgICAgICBXaG9sZSB5ZWFyCisjIDE5NDYgICAgICAgIDIwIEFwciB0byAxIERlYworIyAxOTQ3ICAgICAgICAxMyBBcHIgdG8gMzAgRGVjCisjIDE5NDggICAgICAgIDIgTWF5IHRvIDMxIE9jdAorIyAxOTQ5ICAgICAgICAzIEFwciB0byAzMCBPY3QKKyMgMTk1MCAgICAgICAgMiBBcHIgdG8gMjkgT2N0CisjIDE5NTEgICAgICAgIDEgQXByIHRvIDI4IE9jdAorIyAxOTUyICAgICAgICA2IEFwciB0byAyNSBPY3QKKyMgMTk1MyAgICAgICAgNSBBcHIgdG8gMSBOb3YKKyMgMTk1NCAgICAgICAgMjEgTWFyIHRvIDMxIE9jdAorIyAxOTU1ICAgICAgICAyMCBNYXIgdG8gNiBOb3YKKyMgMTk1NiAgICAgICAgMTggTWFyIHRvIDQgTm92CisjIDE5NTcgICAgICAgIDI0IE1hciB0byAzIE5vdgorIyAxOTU4ICAgICAgICAyMyBNYXIgdG8gMiBOb3YKKyMgMTk1OSAgICAgICAgMjIgTWFyIHRvIDEgTm92CisjIDE5NjAgICAgICAgIDIwIE1hciB0byA2IE5vdgorIyAxOTYxICAgICAgICAxOSBNYXIgdG8gNSBOb3YKKyMgMTk2MiAgICAgICAgMTggTWFyIHRvIDQgTm92CisjIDE5NjMgICAgICAgIDI0IE1hciB0byAzIE5vdgorIyAxOTY0ICAgICAgICAyMiBNYXIgdG8gMSBOb3YKKyMgMTk2NSAgICAgICAgMTggQXByIHRvIDE3IE9jdAorIyAxOTY2ICAgICAgICAxNyBBcHIgdG8gMTYgT2N0CisjIDE5NjcgICAgICAgIDE2IEFwciB0byAyMiBPY3QKKyMgMTk2OCAgICAgICAgMjEgQXByIHRvIDIwIE9jdAorIyAxOTY5ICAgICAgICAyMCBBcHIgdG8gMTkgT2N0CisjIDE5NzAgICAgICAgIDE5IEFwciB0byAxOCBPY3QKKyMgMTk3MSAgICAgICAgMTggQXByIHRvIDE3IE9jdAorIyAxOTcyICAgICAgICAxNiBBcHIgdG8gMjIgT2N0CisjIDE5NzMgICAgICAgIDIyIEFwciB0byAyMSBPY3QKKyMgMTk3My83NCAgICAgMzAgRGVjIDczIHRvIDIwIE9jdCA3NAorIyAxOTc1ICAgICAgICAyMCBBcHIgdG8gMTkgT2N0CisjIDE5NzYgICAgICAgIDE4IEFwciB0byAxNyBPY3QKKyMgMTk3NyAgICAgICAgTmlsCisjIDE5NzggICAgICAgIE5pbAorIyAxOTc5ICAgICAgICAxMyBNYXkgdG8gMjEgT2N0CisjIDE5ODAgdG8gTm93IE5pbAorIyBUaGUgcGFnZSBkb2VzIG5vdCBnaXZlIHN0YXJ0IG9yIGVuZCB0aW1lcyBvZiBkYXkuCisjIFRoZSBwYWdlIGRvZXMgbm90IGdpdmUgYSBzdGFydCBkYXRlIGZvciAxOTQyLgorIyBUaGUgcGFnZSBkb2VzIG5vdCBnaXZ3IGFuIGVuZCBkYXRlIGZvciAxOTQ1LgorIyBUaGUgSmFwYW5lc2Ugb2NjdXBhdGlvbiBvZiBIb25nIEtvbmcgYmVnYW4gb24gMTk0MS0xMi0yNS4KKyMgVGhlIEphcGFuZXNlIHN1cnJlbmRlciBvZiBIb25nIEtvbmcgd2FzIHNpZ25lZCAxOTQ1LTA5LTE1LgorIyBGb3IgbGFjayBvZiBhbnl0aGluZyBiZXR0ZXIsIHVzZSBzdGFydCBvZiB0aG9zZSBkYXlzIGFzIHRoZSB0cmFuc2l0aW9uIHRpbWVzLgorCisjIEhvbmcgS29uZyAoWGlhbmdnYW5nKQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJSEsJMTk0MQlvbmx5CS0JQXByCTEJMzozMAkxOjAwCVMKK1J1bGUJSEsJMTk0MQlvbmx5CS0JU2VwCTMwCTM6MzAJMAktCitSdWxlCUhLCTE5NDYJb25seQktCUFwcgkyMAkzOjMwCTE6MDAJUworUnVsZQlISwkxOTQ2CW9ubHkJLQlEZWMJMQkzOjMwCTAJLQorUnVsZQlISwkxOTQ3CW9ubHkJLQlBcHIJMTMJMzozMAkxOjAwCVMKK1J1bGUJSEsJMTk0Nwlvbmx5CS0JRGVjCTMwCTM6MzAJMAktCitSdWxlCUhLCTE5NDgJb25seQktCU1heQkyCTM6MzAJMTowMAlTCitSdWxlCUhLCTE5NDgJMTk1MQktCU9jdAlsYXN0U3VuCTM6MzAJMAktCitSdWxlCUhLCTE5NTIJb25seQktCU9jdAkyNQkzOjMwCTAJLQorUnVsZQlISwkxOTQ5CTE5NTMJLQlBcHIJU3VuPj0xCTM6MzAJMTowMAlTCitSdWxlCUhLCTE5NTMJb25seQktCU5vdgkxCTM6MzAJMAktCitSdWxlCUhLCTE5NTQJMTk2NAktCU1hcglTdW4+PTE4CTM6MzAJMTowMAlTCitSdWxlCUhLCTE5NTQJb25seQktCU9jdAkzMQkzOjMwCTAJLQorUnVsZQlISwkxOTU1CTE5NjQJLQlOb3YJU3VuPj0xCTM6MzAJMAktCitSdWxlCUhLCTE5NjUJMTk3NwktCUFwcglTdW4+PTE2CTM6MzAJMTowMAlTCitSdWxlCUhLCTE5NjUJMTk3NwktCU9jdAlTdW4+PTE2CTM6MzAJMAktCitSdWxlCUhLCTE5NzMJb25seQktCURlYwkzMAkzOjMwCTE6MDAJUworUnVsZQlISwkxOTc5CW9ubHkJLQlNYXkJU3VuPj04CTM6MzAJMTowMAlTCitSdWxlCUhLCTE5NzkJb25seQktCU9jdAlTdW4+PTE2CTM6MzAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvSG9uZ19Lb25nCTc6MzY6MzYgLQlMTVQJMTkwNCBPY3QgMzAKKwkJCTg6MDAJSEsJSEslc1QJMTk0MSBEZWMgMjUKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMTUKKwkJCTg6MDAJSEsJSEslc1QKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRhaXdhbgorCisjIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IFRhaXdhbiBvYnNlcnZlZCBEU1QgZHVyaW5nIDE5NDUsIHdoZW4gaXQKKyMgd2FzIHN0aWxsIGNvbnRyb2xsZWQgYnkgSmFwYW4uICBUaGlzIGlzIGhhcmQgdG8gYmVsaWV2ZSwgYnV0IHdlIGRvbid0CisjIGhhdmUgYW55IG90aGVyIGluZm9ybWF0aW9uLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlUYWl3YW4JMTk0NQkxOTUxCS0JTWF5CTEJMDowMAkxOjAwCUQKK1J1bGUJVGFpd2FuCTE5NDUJMTk1MQktCU9jdAkxCTA6MDAJMAlTCitSdWxlCVRhaXdhbgkxOTUyCW9ubHkJLQlNYXIJMQkwOjAwCTE6MDAJRAorUnVsZQlUYWl3YW4JMTk1MgkxOTU0CS0JTm92CTEJMDowMAkwCVMKK1J1bGUJVGFpd2FuCTE5NTMJMTk1OQktCUFwcgkxCTA6MDAJMTowMAlECitSdWxlCVRhaXdhbgkxOTU1CTE5NjEJLQlPY3QJMQkwOjAwCTAJUworUnVsZQlUYWl3YW4JMTk2MAkxOTYxCS0JSnVuCTEJMDowMAkxOjAwCUQKK1J1bGUJVGFpd2FuCTE5NzQJMTk3NQktCUFwcgkxCTA6MDAJMTowMAlECitSdWxlCVRhaXdhbgkxOTc0CTE5NzUJLQlPY3QJMQkwOjAwCTAJUworUnVsZQlUYWl3YW4JMTk4MAlvbmx5CS0JSnVuCTMwCTA6MDAJMTowMAlECitSdWxlCVRhaXdhbgkxOTgwCW9ubHkJLQlTZXAJMzAJMDowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9UYWlwZWkJODowNjowMCAtCUxNVAkxODk2ICMgb3IgVGFpYmVpIG9yIFQnYWktcGVpCisJCQk4OjAwCVRhaXdhbglDJXNUCisKKyMgTWFjYXUgKE1hY2FvLCBBb21lbikKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCU1hY2F1CTE5NjEJMTk2MgktCU1hcglTdW4+PTE2CTM6MzAJMTowMAlTCitSdWxlCU1hY2F1CTE5NjEJMTk2NAktCU5vdglTdW4+PTEJMzozMAkwCS0KK1J1bGUJTWFjYXUJMTk2Mwlvbmx5CS0JTWFyCVN1bj49MTYJMDowMAkxOjAwCVMKK1J1bGUJTWFjYXUJMTk2NAlvbmx5CS0JTWFyCVN1bj49MTYJMzozMAkxOjAwCVMKK1J1bGUJTWFjYXUJMTk2NQlvbmx5CS0JTWFyCVN1bj49MTYJMDowMAkxOjAwCVMKK1J1bGUJTWFjYXUJMTk2NQlvbmx5CS0JT2N0CTMxCTA6MDAJMAktCitSdWxlCU1hY2F1CTE5NjYJMTk3MQktCUFwcglTdW4+PTE2CTM6MzAJMTowMAlTCitSdWxlCU1hY2F1CTE5NjYJMTk3MQktCU9jdAlTdW4+PTE2CTM6MzAJMAktCitSdWxlCU1hY2F1CTE5NzIJMTk3NAktCUFwcglTdW4+PTE1CTA6MDAJMTowMAlTCitSdWxlCU1hY2F1CTE5NzIJMTk3MwktCU9jdAlTdW4+PTE1CTA6MDAJMAktCitSdWxlCU1hY2F1CTE5NzQJMTk3NwktCU9jdAlTdW4+PTE1CTM6MzAJMAktCitSdWxlCU1hY2F1CTE5NzUJMTk3NwktCUFwcglTdW4+PTE1CTM6MzAJMTowMAlTCitSdWxlCU1hY2F1CTE5NzgJMTk4MAktCUFwcglTdW4+PTE1CTA6MDAJMTowMAlTCitSdWxlCU1hY2F1CTE5NzgJMTk4MAktCU9jdAlTdW4+PTE1CTA6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvTWFjYXUJNzozNDoyMCAtCUxNVAkxOTEyCisJCQk4OjAwCU1hY2F1CU1PJXNUCTE5OTkgRGVjIDIwICMgcmV0dXJuIHRvIENoaW5hCisJCQk4OjAwCVBSQwlDJXNUCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEN5cHJ1cworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQ3lwcnVzCTE5NzUJb25seQktCUFwcgkxMwkwOjAwCTE6MDAJUworUnVsZQlDeXBydXMJMTk3NQlvbmx5CS0JT2N0CTEyCTA6MDAJMAktCitSdWxlCUN5cHJ1cwkxOTc2CW9ubHkJLQlNYXkJMTUJMDowMAkxOjAwCVMKK1J1bGUJQ3lwcnVzCTE5NzYJb25seQktCU9jdAkxMQkwOjAwCTAJLQorUnVsZQlDeXBydXMJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkwOjAwCTE6MDAJUworUnVsZQlDeXBydXMJMTk3Nwlvbmx5CS0JU2VwCTI1CTA6MDAJMAktCitSdWxlCUN5cHJ1cwkxOTc4CW9ubHkJLQlPY3QJMgkwOjAwCTAJLQorUnVsZQlDeXBydXMJMTk3OQkxOTk3CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KK1J1bGUJQ3lwcnVzCTE5ODEJMTk5OAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvTmljb3NpYQkyOjEzOjI4IC0JTE1UCTE5MjEgTm92IDE0CisJCQkyOjAwCUN5cHJ1cwlFRSVzVAkxOTk4IFNlcAorCQkJMjowMAlFVUFzaWEJRUUlc1QKKyMgSUFUQSBTU0lNICgxOTk4LTA5KSBoYXMgQ3lwcnVzIHVzaW5nIEVVIHJ1bGVzIGZvciB0aGUgZmlyc3QgdGltZS4KKworIyBDbGFzc2ljYWxseSwgQ3lwcnVzIGJlbG9uZ3MgdG8gQXNpYTsgZS5nLiBzZWUgSGVyb2RvdHVzLCBIaXN0b3JpZXMsIEkuNzIuCisjIEhvd2V2ZXIsIGZvciB2YXJpb3VzIHJlYXNvbnMgbWFueSB1c2VycyBleHBlY3QgdG8gZmluZCBpdCB1bmRlciBFdXJvcGUuCitMaW5rCUFzaWEvTmljb3NpYQlFdXJvcGUvTmljb3NpYQorCisjIEdlb3JnaWEKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NC0xMS0xOSk6CisjIFRvZGF5J3MgX0Vjb25vbWlzdF8gKHAgNjApIHJlcG9ydHMgdGhhdCBHZW9yZ2lhIG1vdmVkIGl0cyBjbG9ja3MgZm9yd2FyZAorIyBhbiBob3VyIHJlY2VudGx5LCBkdWUgdG8gYSBsYXcgcHJvcG9zZWQgYnkgWnVyYWIgTXVydmFuaWR6ZSwKKyMgYW4gTVAgd2hvIHdlbnQgb24gYSBodW5nZXIgc3RyaWtlIGZvciAxMSBkYXlzIHRvIGZvcmNlIGRpc2N1c3Npb24gYWJvdXQgaXQhCisjIFdlIGhhdmUgbm8gZGV0YWlscywgYnV0IHdlJ2xsIGd1ZXNzIHRoZXkgZGlkbid0IG1vdmUgdGhlIGNsb2NrcyBiYWNrIGluIGZhbGwuCisjCisjIEZyb20gTWF0aGV3IEVuZ2xhbmRlciwgcXVvdGluZyBBUCAoMTk5Ni0xMC0yMyAxMzowNS0wNCk6CisjIEluc3RlYWQgb2YgcHV0dGluZyBiYWNrIGNsb2NrcyBhdCB0aGUgZW5kIG9mIE9jdG9iZXIsIEdlb3JnaWEKKyMgd2lsbCBzdGF5IG9uIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB0aGlzIHdpbnRlciB0byBzYXZlIGVuZXJneSwKKyMgUHJlc2lkZW50IEVkdWFyZCBTaGV2YXJkbmFkemUgZGVjcmVlZCBXZWRuZXNkYXkuCisjCisjIEZyb20gdGhlIEJCQyB2aWEgSm9zZXBoIFMuIE15ZXJzICgyMDA0LTA2LTI3KToKKyMKKyMgR2VvcmdpYSBtb3ZlZCBjbG9zZXIgdG8gV2VzdGVybiBFdXJvcGUgb24gU3VuZGF5Li4uICBUaGUgZm9ybWVyIFNvdmlldAorIyByZXB1YmxpYyBoYXMgY2hhbmdlZCBpdHMgdGltZSB6b25lIGJhY2sgdG8gdGhhdCBvZiBNb3Njb3cuICBBcyBhIHJlc3VsdCBpdAorIyBpcyBub3cganVzdCBmb3VyIGhvdXJzIGFoZWFkIG9mIEdyZWVud2ljaCBNZWFuIFRpbWUsIHJhdGhlciB0aGFuIGZpdmUgaG91cnMKKyMgYWhlYWQuICBUaGUgc3dpdGNoIHdhcyBkZWNyZWVkIGJ5IHRoZSBwcm8tV2VzdGVybiBwcmVzaWRlbnQgb2YgR2VvcmdpYSwKKyMgTWlraGFpbCBTYWFrYXNodmlsaSwgd2hvIHNhaWQgdGhlIGNoYW5nZSB3YXMgcGFydGx5IHByb21wdGVkIGJ5IHRoZSBwcm9jZXNzCisjIG9mIGludGVncmF0aW9uIGludG8gRXVyb3BlLgorCisjIEZyb20gVGVpbXVyYXogQWJhc2hpZHplICgyMDA1LTExLTA3KToKKyMgR292ZXJubWVudCBvZiBHZW9yZ2lhIC4uLiBkZWNpZGVkIHRvIE5PVCBDSEFOR0UgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIG9uCisjIFtPY3QuXSAzMCwgYXMgaXQgd2FzIGRvbmUgYmVmb3JlIGR1cmluZyBsYXN0IG1vcmUgdGhhbiAxMCB5ZWFycy4KKyMgQ3VycmVudGx5LCB3ZSBhcmUgaW4gZmFjdCBHTVQgKzQ6MDAsIGFzIGJlZm9yZSAzMCBPY3RvYmVyIGl0IHdhcyBHTVQKKyMgKzM6MDAuLi4uIFRoZSBwcm9ibGVtIGlzLCB0aGVyZSBpcyBOTyBGT1JNQUwgTEFXIG9yIGdvdmVybm1lbnRhbCBkb2N1bWVudAorIyBhYm91dCBpdC4gIEFzIGZhciBhcyBJIGNhbiBmaW5kLCBJIHdhcyB0b2xkLCB0aGF0IHRoZXJlIGlzIG5vIGRvY3VtZW50LAorIyBiZWNhdXNlIHdlIGp1c3QgRElETidUIElTU1VFIGRvY3VtZW50IGFib3V0IHN3aXRjaGluZyB0byB3aW50ZXIgdGltZS4uLi4KKyMgSSBkb24ndCBrbm93IHdoYXQgY2FuIGJlIGRvbmUsIGVzcGVjaWFsbHkga25vd2luZyB0aGF0IHNvbWUgeWVhcnMgYWdvIG91cgorIyBEU1QgcnVsZXMgd2hlcmUgY2hhbmdlZCBUSFJFRSBUSU1FUyBkdXJpbmcgb25lIG1vbnRoLgorCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9UYmlsaXNpCTI6NTk6MTYgLQlMTVQJMTg4MAorCQkJMjo1OToxNgktCVRCTVQJMTkyNCBNYXkgIDIgIyBUYmlsaXNpIE1lYW4gVGltZQorCQkJMzowMAktCVRCSVQJMTk1NyBNYXIgICAgIyBUYmlsaXNpIFRpbWUKKwkJCTQ6MDAgUnVzc2lhQXNpYSBUQkklc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCTM6MDAJMTowMAlUQklTVAkxOTkxIEFwciAgOSAjIGluZGVwZW5kZW5jZQorCQkJMzowMCBSdXNzaWFBc2lhIEdFJXNUCTE5OTIgIyBHZW9yZ2lhIFRpbWUKKwkJCTM6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTQgU2VwIGxhc3RTdW4KKwkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTYgT2N0IGxhc3RTdW4KKwkJCTQ6MDAJMTowMAlHRVNUCTE5OTcgTWFyIGxhc3RTdW4KKwkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTIwMDQgSnVuIDI3CisJCQkzOjAwIFJ1c3NpYUFzaWEJR0Ulc1QJMjAwNSBNYXIgbGFzdFN1biAyOjAwCisJCQk0OjAwCS0JR0VUCisKKyMgRWFzdCBUaW1vcgorCisjIFNlZSBJbmRvbmVzaWEgZm9yIHRoZSAxOTQ1IHRyYW5zaXRpb24uCisKKyMgRnJvbSBKb2FvIENhcnJhc2NhbGFvLCBicm90aGVyIG9mIHRoZSBmb3JtZXIgZ292ZXJub3Igb2YgRWFzdCBUaW1vciwgaW4KKyMgPGEgaHJlZj0iaHR0cDovL2V0YW4ub3JnL2V0OTljL2RlY2VtYmVyLzI2LTMxLzMwRVRNQVkuaHRtIj4KKyMgRWFzdCBUaW1vciBtYXkgYmUgbGF0ZSBmb3IgaXRzIG1pbGxlbm5pdW0KKyMgPC9hPiAoMTk5OS0xMi0yNi8zMSk6CisjIFBvcnR1Z2FsIHRyaWVkIHRvIGNoYW5nZSB0aGUgdGltZSBmb3J3YXJkIGluIDE5NzQgYmVjYXVzZSB0aGUgc3VuCisjIHJpc2VzIHRvbyBlYXJseSBidXQgdGhlIHN1Z2dlc3Rpb24gcmFpc2VkIGEgbG90IG9mIHByb2JsZW1zIHdpdGggdGhlCisjIFRpbW9yZXNlIGFuZCBJIHN0aWxsIGRvbid0IHRoaW5rIGl0IHdvdWxkIHdvcmsgdG9kYXkgYmVjYXVzZSBpdAorIyBjb25mbGljdHMgd2l0aCB0aGVpciB3YXkgb2YgbGlmZS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTEyLTA0KToKKyMgV2UgZG9uJ3QgaGF2ZSBhbnkgcmVjb3JkIG9mIHRoZSBhYm92ZSBhdHRlbXB0LgorIyBNb3N0IGxpa2VseSBvdXIgcmVjb3JkcyBhcmUgaW5jb21wbGV0ZSwgYnV0IHdlIGhhdmUgbm8gYmV0dGVyIGRhdGEuCisKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5ocmkub3JnL25ld3Mvd29ybGQvdW5kaC9sYXN0LzAwLTA4LTE2LnVuZGguaHRtbCI+CisjIEZyb20gTWFub2VsIGRlIEFsbWVpZGEgZSBTaWx2YSwgRGVwdXR5IFNwb2tlc21hbiBmb3IgdGhlIFVOIFNlY3JldGFyeS1HZW5lcmFsCisjICgyMDAwLTA4LTE2KTwvYT46CisjIFRoZSBDYWJpbmV0IG9mIHRoZSBFYXN0IFRpbW9yIFRyYW5zaXRpb24gQWRtaW5pc3RyYXRpb24gZGVjaWRlZAorIyB0b2RheSB0byBhZHZhbmNlIEVhc3QgVGltb3IncyB0aW1lIGJ5IG9uZSBob3VyLiAgVGhlIHRpbWUgY2hhbmdlLAorIyB3aGljaCB3aWxsIGJlIHBlcm1hbmVudCwgd2l0aCBubyBzZWFzb25hbCBhZGp1c3RtZW50LCB3aWxsIGhhcHBlbiBhdAorIyBtaWRuaWdodCBvbiBTYXR1cmRheSwgU2VwdGVtYmVyIDE2LgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvRGlsaQk4OjIyOjIwIC0JTE1UCTE5MTIKKwkJCTg6MDAJLQlUTFQJMTk0MiBGZWIgMjEgMjM6MDAgIyBFIFRpbW9yIFRpbWUKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjMKKwkJCTk6MDAJLQlUTFQJMTk3NiBNYXkgIDMKKwkJCTg6MDAJLQlDSVQJMjAwMCBTZXAgMTcgMDA6MDAKKwkJCTk6MDAJLQlUTFQKKworIyBJbmRpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0tvbGthdGEJNTo1MzoyOCAtCUxNVAkxODgwCSMgS29sa2F0YQorCQkJNTo1MzoyMAktCUhNVAkxOTQxIE9jdCAgICAjIEhvd3JhaCBNZWFuIFRpbWU/CisJCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAxNSAjIEJ1cm1hIFRpbWUKKwkJCTU6MzAJLQlJU1QJMTk0MiBTZXAKKwkJCTU6MzAJMTowMAlJU1QJMTk0NSBPY3QgMTUKKwkJCTU6MzAJLQlJU1QKKyMgVGhlIGZvbGxvd2luZyBhcmUgbGlrZSBBc2lhL0tvbGthdGE6CisjCUFuZGFtYW4gSXMKKyMJTGFrc2hhZHdlZXAgKExhY2NhZGl2ZSwgTWluaWNveSBhbmQgQW1pbmRpdmkgSXMpCisjCU5pY29iYXIgSXMKKworIyBJbmRvbmVzaWEKKyMKKyMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wNS0yOCksIG92ZXJyaWRpbmcgU2hhbmtzICYgUG90dGVuZ2VyOgorIyA8aHR0cDovL3d3dy5zdW1hdGVyYS1pbmMuY29tL2dvX3RvX2ludmVzdC9hYm91dF9pbmRvbmVzaWEuYXNwI3N0YW5kdGltZT4KKyMgc2F5cyB0aGF0IEluZG9uZXNpYSdzIHRpbWUgem9uZXMgY2hhbmdlZCBvbiAxOTg4LTAxLTAxLiAgTG9va2luZyBhdCBzb21lCisjIHRpbWUgem9uZSBtYXBzLCBJIHRoaW5rIHRoYXQgbXVzdCByZWZlciB0byBXZXN0ZXJuIEJvcm5lbyAoS2FsaW1hbnRhbiBCYXJhdAorIyBhbmQgS2FsaW1hbnRhbiBUZW5nYWgpIHN3aXRjaGluZyBmcm9tIFVUQys4IHRvIFVUQys3LgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTEwKToKKyMgSGVyZSBpcyBhbm90aGVyIGNvcnJlY3Rpb24gdG8gU2hhbmtzICYgUG90dGVuZ2VyLgorIyBKb2huVFdCIHdyaXRlcyB0aGF0IEphcGFuZXNlIGZvcmNlcyBkaWQgbm90IHN1cnJlbmRlciBjb250cm9sIGluCisjIEluZG9uZXNpYSB1bnRpbCAxOTQ1LTA5LTAxIDAwOjAwIGF0IHRoZSBlYXJsaWVzdCAoaW4gSmFrYXJ0YSkgYW5kCisjIG90aGVyIGZvcm1hbCBzdXJyZW5kZXIgY2VyZW1vbmllcyB3ZXJlIFNlcHRlbWJlciA5LCAxMSwgYW5kIDEzLCBwbHVzCisjIFNlcHRlbWJlciAxMiBmb3IgdGhlIHJlZ2lvbmFsIHN1cnJlbmRlciB0byBNb3VudGJhdHRlbiBpbiBTaW5nYXBvcmUuCisjIFRoZXNlIHdvdWxkIGJlIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lcyBmb3IgYSBjaGFuZ2UuCisjIFJlZ2ltZXMgaG9yYWlyZXMgcG91ciBsZSBtb25kZSBlbnRpZXIsIGJ5IEhlbnJpIExlIENvcnJlLCAoRWRpdGlvbnMKKyMgVHJhZGl0aW9ubmVsbGVzLCAxOTg3LCBQYXJpcykgc2F5cyB0aGF0IEphdmEgYW5kIE1hZHVyYSBzd2l0Y2hlZAorIyBmcm9tIEpTVCB0byBVVEMrMDc6MzAgb24gMTk0NS0wOS0yMywgYW5kIGdpdmVzIDE5NDQtMDktMDEgZm9yIEpheWFwdXJhCisjIChIb2xsYW5kaWEpLiAgRm9yIG5vdywgYXNzdW1lIGFsbCBJbmRvbmVzaWFuIGxvY2F0aW9ucyBvdGhlciB0aGFuIEpheWFwdXJhCisjIHN3aXRjaGVkIG9uIDE5NDUtMDktMjMuCisjCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFzaWEvSmFrYXJ0YQk3OjA3OjEyIC0JTE1UCTE4NjcgQXVnIDEwCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIG5leHQgdHJhbnNpdGlvbiB3YXMgYXQgMTkyNCBKYW4gMSAwOjEzLAorIyBidXQgdGhpcyBtdXN0IGJlIGEgdHlwby4KKwkJCTc6MDc6MTIJLQlKTVQJMTkyMyBEZWMgMzEgMjM6NDc6MTIgIyBKYWthcnRhCisJCQk3OjIwCS0JSkFWVAkxOTMyIE5vdgkgIyBKYXZhIFRpbWUKKwkJCTc6MzAJLQlXSVQJMTk0MiBNYXIgMjMKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjMKKwkJCTc6MzAJLQlXSVQJMTk0OCBNYXkKKwkJCTg6MDAJLQlXSVQJMTk1MCBNYXkKKwkJCTc6MzAJLQlXSVQJMTk2NAorCQkJNzowMAktCVdJVAorWm9uZSBBc2lhL1BvbnRpYW5hawk3OjE3OjIwCS0JTE1UCTE5MDggTWF5CisJCQk3OjE3OjIwCS0JUE1UCTE5MzIgTm92ICAgICMgUG9udGlhbmFrIE1UCisJCQk3OjMwCS0JV0lUCTE5NDIgSmFuIDI5CisJCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDIzCisJCQk3OjMwCS0JV0lUCTE5NDggTWF5CisJCQk4OjAwCS0JV0lUCTE5NTAgTWF5CisJCQk3OjMwCS0JV0lUCTE5NjQKKwkJCTg6MDAJLQlDSVQJMTk4OCBKYW4gIDEKKwkJCTc6MDAJLQlXSVQKK1pvbmUgQXNpYS9NYWthc3Nhcgk3OjU3OjM2IC0JTE1UCTE5MjAKKwkJCTc6NTc6MzYJLQlNTVQJMTkzMiBOb3YgICAgIyBNYWNhc3NhciBNVAorCQkJODowMAktCUNJVAkxOTQyIEZlYiAgOQorCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMworCQkJODowMAktCUNJVAorWm9uZSBBc2lhL0pheWFwdXJhCTk6MjI6NDggLQlMTVQJMTkzMiBOb3YKKwkJCTk6MDAJLQlFSVQJMTk0NCBTZXAgIDEKKwkJCTk6MzAJLQlDU1QJMTk2NAorCQkJOTowMAktCUVJVAorCisjIElyYW4KKworIyBGcm9tIFJvb3piZWggUG91cm5hZGVyICgyMDAzLTAzLTE1KToKKyMgVGhpcyBpcyBhbiBFbmdsaXNoIHRyYW5zbGF0aW9uIG9mIHdoYXQgSSBqdXN0IGZvdW5kIChvcmlnaW5hbGx5IGluIFBlcnNpYW4pLgorIyBUaGUgR3JlZ29yaWFuIGRhdGVzIGluIGJyYWNrZXRzIGFyZSBtaW5lOgorIworIwlPZmZpY2lhbCBOZXdzcGFwZXIgTm8uIDEzNTQ4LTEzNzAvNi8yNSBbMTk5MS0wOS0xNl0KKyMJTm8uIDE2NzYwL1QyMzMgSAkJCQkxMzcwLzYvMTAgWzE5OTEtMDktMDFdCisjCisjCVRoZSBSdWxlIEFib3V0IENoYW5nZSBvZiB0aGUgT2ZmaWNpYWwgVGltZSBvZiB0aGUgQ291bnRyeQorIworIwlUaGUgQm9hcmQgb2YgTWluaXN0ZXJzLCBpbiB0aGUgbWVldGluZyBkYXRlZCAxMzcwLzUvMjMgWzE5OTEtMDgtMTRdLAorIwliYXNlZCBvbiB0aGUgc3VnZ2VzdGlvbiBudW1iZXIgMjIyMS9EIGRhdGVkIDEzNzAvNC8yMiBbMTk5MS0wNy0xM10KKyMJb2YgdGhlIENvdW50cnkncyBPcmdhbml6YXRpb24gZm9yIE9mZmljaWFsIGFuZCBFbXBsb3ltZW50IEFmZmFpcnMsCisjCWFuZCByZWZlcnJpbmcgdG8gdGhlIGxhdyBmb3IgZXF1YXRpbmcgdGhlIHdvcmtpbmcgaG91cnMgb2Ygd29ya2VycworIwlhbmQgb2ZmaWNlcnMgaW4gdGhlIHdob2xlIGNvdW50cnkgZGF0ZWQgMTM1OS80LzIzIFsxOTgwLTA3LTE0XSwgYW5kCisjCWZvciBzeW5jaHJvbml6aW5nIHRoZSBvZmZpY2lhbCB0aW1lcyBvZiB0aGUgY291bnRyeSwgYWdyZWVkIHRoYXQ6CisjCisjCVRoZSBvZmZpY2lhbCB0aW1lIG9mIHRoZSBjb3VudHJ5IHdpbGwgc2hvdWxkIG1vdmUgZm9yd2FyZCBvbmUgaG91cgorIwlhdCB0aGUgMjRbOjAwXSBob3VycyBvZiB0aGUgZmlyc3QgZGF5IG9mIEZhcnZhcmRpbiBhbmQgc2hvdWxkIHJldHVybgorIwl0byBpdHMgcHJldmlvdXMgc3RhdGUgYXQgdGhlIDI0WzowMF0gaG91cnMgb2YgdGhlIDMwdGggZGF5IG9mCisjCVNoYWhyaXZhci4KKyMKKyMJRmlyc3QgRGVwdXR5IHRvIHRoZSBQcmVzaWRlbnQgLSBIYXNzYW4gSGFiaWJpCisjCisjIEZyb20gcGVyc29uYWwgZXhwZXJpZW5jZSwgdGhhdCBhZ3JlZXMgd2l0aCB3aGF0IGhhcyBiZWVuIGZvbGxvd2VkCisjIGZvciBhdCBsZWFzdCB0aGUgbGFzdCA1IHllYXJzLiAgQmVmb3JlIHRoYXQsIGZvciBhIGZldyB5ZWFycywgdGhlCisjIGRhdGUgdXNlZCB3YXMgdGhlIGZpcnN0IFRodXJzZGF5IG5pZ2h0IG9mIEZhcnZhcmRpbiBhbmQgdGhlIGxhc3QKKyMgVGh1cnNkYXkgbmlnaHQgb2YgU2hhaHJpdmFyLCBidXQgSSBjYW4ndCBnaXZlIGV4YWN0IGRhdGVzLi4uLgorIyBJIGhhdmUgYWxzbyBjaGFuZ2VkIHRoZSBhYmJyZXZpYXRpb25zIHRvIHdoYXQgaXMgY29uc2lkZXJlZCBjb3JyZWN0CisjIGhlcmUgaW4gSXJhbiwgSVJTVCBmb3IgcmVndWxhciB0aW1lIGFuZCBJUkRUIGZvciBkYXlsaWdodCBzYXZpbmcgdGltZS4KKyMKKyMgRnJvbSBSb296YmVoIFBvdXJuYWRlciAoMjAwNS0wNC0wNSk6CisjIFRoZSB0ZXh0IG9mIHRoZSBJcmFuaWFuIGxhdywgaW4gZWZmZWN0IHNpbmNlIDE5MjUsIGNsZWFybHkgbWVudGlvbnMKKyMgdGhhdCB0aGUgdHJ1ZSBzb2xhciB5ZWFyIGlzIHRoZSBtZWFzdXJlLCBhbmQgdGhlcmUgaXMgbm8gYXJpdGhtZXRpYworIyBsZWFwIHllYXIgY2FsY3VsYXRpb24gaW52b2x2ZWQuICBUaGVyZSBoYXMgbmV2ZXIgYmVlbiBhbnkgc2VyaW91cworIyBwbGFuIHRvIGNoYW5nZSB0aGF0IGxhdy4uLi4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGJlZm9yZSBTZXB0LiAxOTkxLCBhbmQgd2l0aCBQb3VybmFkZXIgdGhlcmVhZnRlci4KKyMgSSB1c2VkIEVkIFJlaW5nb2xkJ3MgY2FsLXBlcnNpYSBpbiBHTlUgRW1hY3MgMjEuMiB0byBjaGVjayBQZXJzaWFuIGRhdGVzLAorIyBzdG9wcGluZyBhZnRlciAyMDM3IHdoZW4gMzItYml0IHRpbWVfdCdzIG92ZXJmbG93LgorIyBUaGF0IGNhbC1wZXJzaWEgdXNlZCBCaXJhc2hrJ3MgYXBwcm94aW1hdGlvbiwgd2hpY2ggZGlzYWdyZWVzIHdpdGggdGhlIHNvbGFyCisjIGNhbGVuZGFyIHByZWRpY3Rpb25zIGZvciB0aGUgeWVhciAyMDI1LCBzbyBJIGNvcnJlY3RlZCB0aG9zZSBkYXRlcyBieSBoYW5kLgorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTAzLTMwKSwgd3JpdGluZyBhYm91dCBmdXR1cmUKKyMgZGlzY3JlcGFuY2llcyBiZXR3ZWVuIGNhbC1wZXJzaWEgYW5kIHRoZSBJcmFuaWFuIGNhbGVuZGFyOgorIyBGb3IgMjA5MSBzb2xhci1sb25naXR1ZGUtYWZ0ZXIgeWllbGRzIDIwOTEtMDMtMjAgMDg6NDA6MDcuNyBVVCBmb3IKKyMgdGhlIHZlcm5hbCBlcXVpbm94IGFuZCB0aGF0IGdldHMgc28gY2xvc2UgdG8gMTI6MDAgc29tZSBsb2NhbAorIyBJcmFuaWFuIHRpbWUgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29ycmVjdCBsb2NhdGlvbiBuZWVkcyB0byBiZQorIyBrbm93biBleGFjdGx5LCBhbW9uZ3N0IG90aGVyIGZhY3RvcnMuICAyMTU3IGlzIGV2ZW4gY2xvc2VyOgorIyAyMTU3LTAzLTIwIDA4OjM3OjE1LjUgVVQuICBCdXQgdGhlIEdyZWdvcmlhbiB5ZWFyIDIwMjUgc2hvdWxkIGdpdmUKKyMgbm8gaW50ZXJwcmV0YXRpb24gcHJvYmxlbSB3aGF0c29ldmVyLiAgQnkgdGhlIHdheSwgYW5vdGhlciBpbnN0YW50CisjIGluIHRoZSBuZWFyIGZ1dHVyZSB3aGVyZSB0aGVyZSB3aWxsIGJlIGEgZGlzY3JlcGFuY3kgYmV0d2VlbgorIyBhcml0aG1ldGljYWwgYW5kIGFzdHJvbm9taWNhbCBJcmFuaWFuIGNhbGVuZGFycyB3aWxsIGJlIGluIDIwNTg6CisjIHZlcm5hbCBlcXVpbm94IG9uIDIwNTgtMDMtMjAgMDk6MDM6MDUuOSBVVC4gIFRoZSBKYXZhIHZlcnNpb24gb2YKKyMgUmVpbmdvbGQncy9EZXJzaG93aXR6JyBjYWxjdWxhdG9yIGdpdmVzIGNvcnJlY3RseSB0aGUgR3JlZ29yaWFuIGRhdGUKKyMgMjA1OC0wMy0yMSBmb3IgMSBGYXJ2YXJkaW4gMTQzNyAoYXN0cm9ub21pY2FsKS4KKyMKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDMtMjIpOgorIyBTZXZlcmFsIG9mIG15IHVzZXJzIGhhdmUgcmVwb3J0ZWQgdGhhdCBJcmFuIHdpbGwgbm90IG9ic2VydmUgRFNUIGFueW1vcmU6CisjIGh0dHA6Ly93d3cuaXJuYS5pci9lbi9uZXdzL3ZpZXcvbGluZS0xNy8wNjAzMTkzODEyMTY0OTQ4Lmh0bQorIworIyBGcm9tIFJldXRlcnMgKDIwMDctMDktMTYpLCB3aXRoIGEgaGVhZHMtdXAgZnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW46CisjIC4uLiB0aGUgR3VhcmRpYW4gQ291bmNpbCAuLi4gYXBwcm92ZWQgYSBsYXcgb24gU3VuZGF5IHRvIHJlLWludHJvZHVjZQorIyBkYXlsaWdodCBzYXZpbmcgdGltZSAuLi4KKyMgaHR0cDovL3VrLnJldXRlcnMuY29tL2FydGljbGUvb2lsUnB0L2lkVUtCTEE2NTA0ODQyMDA3MDkxNgorIworIyBGcm9tIFJvb3piZWggUG91cm5hZGVyICgyMDA3LTExLTA1KToKKyMgVGhpcyBpcyBxdW90ZWQgZnJvbSBPZmZpY2lhbCBHYXpldHRlIG9mIHRoZSBJc2xhbWljIFJlcHVibGljIG9mCisjIElyYW4sIFZvbHVtZSA2MywgTnVtYmVyIDE4MjQyLCBkYXRlZCBUdWVzZGF5IDEzODYvNi8yNAorIyBbMjAwNy0xMC0xNl0uIEkgYW0gZG9pbmcgdGhlIGJlc3QgdHJhbnNsYXRpb24gSSBjYW46Li4uCisjIFRoZSBvZmZpY2lhbCB0aW1lIG9mIHRoZSBjb3VudHJ5IHdpbGwgYmUgbW92ZWQgZm9yd2FyZCBmb3Igb25lIGhvdXIKKyMgb24gdGhlIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIG9mIEZhcnZhcmRpbiBhbmQgd2lsbAorIyBiZSBjaGFuZ2VkIGJhY2sgdG8gaXRzIHByZXZpb3VzIHN0YXRlIG9uIHRoZSAyNCBob3VycyBvZiB0aGUKKyMgdGhpcnRpZXRoIGRheSBvZiBTaGFocml2YXIuCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlJcmFuCTE5NzgJMTk4MAktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTE5NzgJb25seQktCU9jdAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTE5NzkJb25seQktCVNlcAkxOQkwOjAwCTAJUworUnVsZQlJcmFuCTE5ODAJb25seQktCVNlcAkyMwkwOjAwCTAJUworUnVsZQlJcmFuCTE5OTEJb25seQktCU1heQkgMwkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTE5OTIJMTk5NQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTE5OTEJMTk5NQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTE5OTYJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTE5OTYJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTE5OTcJMTk5OQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTE5OTcJMTk5OQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDAJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDAJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDEJMjAwMwktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDEJMjAwMwktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDQJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDQJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDUJb25seQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDUJb25seQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDgJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDgJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMDkJMjAxMQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMDkJMjAxMQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMTIJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMTIJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMTMJMjAxNQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMTMJMjAxNQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMTYJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMTYJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMTcJMjAxOQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMTcJMjAxOQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMjAJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMjAJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMjEJMjAyMwktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMjEJMjAyMwktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMjQJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMjQJb25seQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMjUJMjAyNwktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMjUJMjAyNwktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMjgJMjAyOQktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMjgJMjAyOQktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMzAJMjAzMQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMzAJMjAzMQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMzIJMjAzMwktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMzIJMjAzMwktCVNlcAkyMQkwOjAwCTAJUworUnVsZQlJcmFuCTIwMzQJMjAzNQktCU1hcgkyMgkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMzQJMjAzNQktCVNlcAkyMgkwOjAwCTAJUworUnVsZQlJcmFuCTIwMzYJMjAzNwktCU1hcgkyMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFuCTIwMzYJMjAzNwktCVNlcAkyMQkwOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1RlaHJhbgkzOjI1OjQ0CS0JTE1UCTE5MTYKKwkJCTM6MjU6NDQJLQlUTVQJMTk0NgkjIFRlaHJhbiBNZWFuIFRpbWUKKwkJCTM6MzAJLQlJUlNUCTE5NzcgTm92CisJCQk0OjAwCUlyYW4JSVIlc1QJMTk3OQorCQkJMzozMAlJcmFuCUlSJXNUCisKKworIyBJcmFxCisjCisjIEZyb20gSm9uYXRoYW4gTGVubm94ICgyMDAwLTA2LTEyKToKKyMgQW4gYXJ0aWNsZSBpbiB0aGlzIHdlZWsncyBFY29ub21pc3QgKCJJbnNpZGUgdGhlIFNhZGRhbS1mcmVlIHpvbmUiLCBwLiA1MCBpbgorIyB0aGUgVS5TLiBlZGl0aW9uKSBvbiB0aGUgSXJhcWkgS3VyZHMgY29udGFpbnMgYSBwYXJhZ3JhcGg6CisjICJUaGUgdGhyZWUgbm9ydGhlcm4gcHJvdmluY2VzIC4uLiBzd2l0Y2hlZCB0aGVpciBjbG9ja3MgdGhpcyBzcHJpbmcgYW5kCisjIGFyZSBhbiBob3VyIGFoZWFkIG9mIEJhZ2hkYWQuIgorIworIyBCdXQgUml2ZXMgTWNEb3cgKDIwMDAtMDYtMTgpIHF1b3RlcyBhIGNvbnRhY3QgaW4gSXJhcWktS3VyZGlzdGFuIGFzIGZvbGxvd3M6CisjIEluIHRoZSBwYXN0LCBzb21lIEt1cmRpc2ggbmF0aW9uYWxpc3RzLCBhcyBhIHByb3Rlc3QgdG8gdGhlIElyYXFpCisjIEdvdmVybm1lbnQsIGRpZCBub3QgYWRoZXJlIHRvIGRheWxpZ2h0IHNhdmluZyB0aW1lLiAgVGhleSByZWZlcnJlZAorIyB0byBkYXlsaWdodCBzYXZpbmcgYXMgU2FkZGFtIHRpbWUuICBCdXQsIGFzIG9mIHRvZGF5LCB0aGUgdGltZSB6b25lCisjIGluIElyYXFpLUt1cmRpc3RhbiBpcyBvbiBzdGFuZGFyZCB0aW1lIHdpdGggQmFnaGRhZCwgSXJhcS4KKyMKKyMgU28gd2UnbGwgaWdub3JlIHRoZSBFY29ub21pc3QncyBjbGFpbS4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0xMCk6CisjIFRoZSBjYWJpbmV0IGluIElyYXEgYWJvbGlzaGVkIERTVCBsYXN0IHdlZWssIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisjIG5ld3Mgc291cmNlcyAoaW4gQXJhYmljKToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbGplZXJhbi5uZXQvd2VzaW1hX2FydGljbGVzL25ld3MtMjAwODAzMDUtOTg2MDIuaHRtbCI+CisjIGh0dHA6Ly93d3cuYWxqZWVyYW4ubmV0L3dlc2ltYV9hcnRpY2xlcy9uZXdzLTIwMDgwMzA1LTk4NjAyLmh0bWwKKyMgPC9hPgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzd2F0YWxpcmFxLmluZm8vbG9vay9hcnRpY2xlLnRwbD9pZD0yMDQ3JklkTGFuZ3VhZ2U9MTcmSWRQdWJsaWNhdGlvbj00Jk5yQXJ0aWNsZT03MTc0MyZOcklzc3VlPTEmTnJTZWN0aW9uPTEwIj4KKyMgaHR0cDovL3d3dy5hc3dhdGFsaXJhcS5pbmZvL2xvb2svYXJ0aWNsZS50cGw/aWQ9MjA0NyZJZExhbmd1YWdlPTE3JklkUHVibGljYXRpb249NCZOckFydGljbGU9NzE3NDMmTnJJc3N1ZT0xJk5yU2VjdGlvbj0xMAorIyA8L2E+CisjCisjIFdlIGhhdmUgcHVibGlzaGVkIGEgc2hvcnQgYXJ0aWNsZSBpbiBFbmdsaXNoIGFib3V0IHRoZSBjaGFuZ2U6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9pcmFxLWR1bXBzLWRheWxpZ2h0LXNhdmluZy5odG1sIj4KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2lyYXEtZHVtcHMtZGF5bGlnaHQtc2F2aW5nLmh0bWwKKyMgPC9hPgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlJcmFxCTE5ODIJb25seQktCU1heQkxCTA6MDAJMTowMAlECitSdWxlCUlyYXEJMTk4MgkxOTg0CS0JT2N0CTEJMDowMAkwCVMKK1J1bGUJSXJhcQkxOTgzCW9ubHkJLQlNYXIJMzEJMDowMAkxOjAwCUQKK1J1bGUJSXJhcQkxOTg0CTE5ODUJLQlBcHIJMQkwOjAwCTE6MDAJRAorUnVsZQlJcmFxCTE5ODUJMTk5MAktCVNlcAlsYXN0U3VuCTE6MDBzCTAJUworUnVsZQlJcmFxCTE5ODYJMTk5MAktCU1hcglsYXN0U3VuCTE6MDBzCTE6MDAJRAorIyBJQVRBIFNTSU0gKDE5OTEvMTk5Nikgc2F5cyBBcHIgMSAxMjowMWFtIFVUQzsgZ3Vlc3MgdGhlIGA6MDEnIGlzIGEgdHlwby4KKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBJcmFxIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgMTk5Mi8xOTk3OyBpZ25vcmUgdGhpcy4KKyMKK1J1bGUJSXJhcQkxOTkxCTIwMDcJLQlBcHIJIDEJMzowMHMJMTowMAlECitSdWxlCUlyYXEJMTk5MQkyMDA3CS0JT2N0CSAxCTM6MDBzCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0JhZ2hkYWQJMjo1Nzo0MAktCUxNVAkxODkwCisJCQkyOjU3OjM2CS0JQk1UCTE5MTgJICAgICMgQmFnaGRhZCBNZWFuIFRpbWU/CisJCQkzOjAwCS0JQVNUCTE5ODIgTWF5CisJCQkzOjAwCUlyYXEJQSVzVAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJc3JhZWwKKworIyBGcm9tIEVwaHJhaW0gU2lsdmVyYmVyZyAoMjAwMS0wMS0xMSk6CisjCisjIEkgY29pbmVkICJJU1QvSURUIiBjaXJjYSAxOTg4LiAgVW50aWwgdGhlbiB0aGVyZSB3ZXJlIHRocmVlCisjIGRpZmZlcmVudCBhYmJyZXZpYXRpb25zIGluIHVzZToKKyMKKyMgSlNUICBKZXJ1c2FsZW0gU3RhbmRhcmQgVGltZSBbRGFubnkgQnJhbmlzcywgSGVicmV3IFVuaXZlcnNpdHldCisjIElaVCAgSXNyYWVsIFpvbmFsIChzaWMpIFRpbWUgW1Byb2YuIEhhaW0gUGFwbywgVGVjaG5pb25dCisjIEVFU1QgRWFzdGVybiBFdXJvcGUgU3RhbmRhcmQgVGltZSBbdXNlZCBieSBhbG1vc3QgZXZlcnlvbmUgZWxzZV0KKyMKKyMgU2luY2UgdGltZXpvbmVzIHNob3VsZCBiZSBjYWxsZWQgYnkgY291bnRyeSBhbmQgbm90IGNhcGl0YWwgY2l0aWVzLAorIyBJIHJ1bGVkIG91dCBKU1QuICBBcyBJc3JhZWwgaXMgaW4gQXNpYSBNaW5vciBhbmQgbm90IEVhc3Rlcm4gRXVyb3BlLAorIyBFRVNUIHdhcyBlcXVhbGx5IHVuYWNjZXB0YWJsZS4gIFNpbmNlICJ6b25hbCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGgKKyMgYW55IG90aGVyIHRpbWV6b25lIGFiYnJldmlhdGlvbiwgSSBmZWx0IHRoYXQgJ0lTVCcgd2FzIHRoZSB3YXkgdG8gZ28KKyMgYW5kLCBpbmRlZWQsIGl0IGhhcyByZWNlaXZlZCBhbG1vc3QgdW5pdmVyc2FsIGFjY2VwdGFuY2UgaW4gdGltZXpvbmUKKyMgc2V0dGluZ3MgaW4gSXNyYWVsaSBjb21wdXRlcnMuCisjCisjIEluIGFueSBjYXNlLCBJIGFtIGhhcHB5IHRvIHNoYXJlIHRpbWV6b25lIGFiYnJldmlhdGlvbnMgd2l0aCBJbmRpYSwKKyMgaGlnaCBvbiBteSBmYXZvcml0ZS1jb3VudHJ5IGxpc3QgKGFuZCBub3Qgb25seSBiZWNhdXNlIG15IHdpZmUncworIyBmYW1pbHkgaXMgZnJvbSBJbmRpYSkuCisKKyMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6CisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlaaW9uCTE5NDAJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5NDIJMTk0NAktCU5vdgkgMQkwOjAwCTAJUworUnVsZQlaaW9uCTE5NDMJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5NDQJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5NDUJb25seQktCUFwcgkxNgkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5NDUJb25seQktCU5vdgkgMQkyOjAwCTAJUworUnVsZQlaaW9uCTE5NDYJb25seQktCUFwcgkxNgkyOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5NDYJb25seQktCU5vdgkgMQkwOjAwCTAJUworUnVsZQlaaW9uCTE5NDgJb25seQktCU1heQkyMwkwOjAwCTI6MDAJREQKK1J1bGUJWmlvbgkxOTQ4CW9ubHkJLQlTZXAJIDEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTQ4CTE5NDkJLQlOb3YJIDEJMjowMAkwCVMKK1J1bGUJWmlvbgkxOTQ5CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTUwCW9ubHkJLQlBcHIJMTYJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTUwCW9ubHkJLQlTZXAJMTUJMzowMAkwCVMKK1J1bGUJWmlvbgkxOTUxCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTUxCW9ubHkJLQlOb3YJMTEJMzowMAkwCVMKK1J1bGUJWmlvbgkxOTUyCW9ubHkJLQlBcHIJMjAJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTUyCW9ubHkJLQlPY3QJMTkJMzowMAkwCVMKK1J1bGUJWmlvbgkxOTUzCW9ubHkJLQlBcHIJMTIJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTUzCW9ubHkJLQlTZXAJMTMJMzowMAkwCVMKK1J1bGUJWmlvbgkxOTU0CW9ubHkJLQlKdW4JMTMJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTU0CW9ubHkJLQlTZXAJMTIJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTU1CW9ubHkJLQlKdW4JMTEJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTU1CW9ubHkJLQlTZXAJMTEJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTU2CW9ubHkJLQlKdW4JIDMJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTU2CW9ubHkJLQlTZXAJMzAJMzowMAkwCVMKK1J1bGUJWmlvbgkxOTU3CW9ubHkJLQlBcHIJMjkJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTU3CW9ubHkJLQlTZXAJMjIJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTc0CW9ubHkJLQlKdWwJIDcJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTc0CW9ubHkJLQlPY3QJMTMJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTc1CW9ubHkJLQlBcHIJMjAJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTc1CW9ubHkJLQlBdWcJMzEJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTg1CW9ubHkJLQlBcHIJMTQJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTg1CW9ubHkJLQlTZXAJMTUJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTg2CW9ubHkJLQlNYXkJMTgJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTg2CW9ubHkJLQlTZXAJIDcJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTg3CW9ubHkJLQlBcHIJMTUJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTg3CW9ubHkJLQlTZXAJMTMJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTg4CW9ubHkJLQlBcHIJIDkJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTg4CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKKworIyBGcm9tIEVwaHJhaW0gU2lsdmVyYmVyZworIyAoMTk5Ny0wMy0wNCwgMTk5OC0wMy0xNiwgMTk5OC0xMi0yOCwgMjAwMC0wMS0xNywgMjAwMC0wNy0yNSwgMjAwNC0xMi0yMiwKKyMgYW5kIDIwMDUtMDItMTcpOgorCisjIEFjY29yZGluZyB0byB0aGUgT2ZmaWNlIG9mIHRoZSBTZWNyZXRhcnkgR2VuZXJhbCBvZiB0aGUgTWluaXN0cnkgb2YKKyMgSW50ZXJpb3IsIHRoZXJlIGlzIE5PIHNldCBydWxlIGZvciBEYXlsaWdodC1TYXZpbmdzL1N0YW5kYXJkIHRpbWUgY2hhbmdlcy4KKyMgT25lIHRoaW5nIGlzIGVudHJlbmNoZWQgaW4gbGF3LCBob3dldmVyOiB0aGF0IHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMTUwCisjIGRheXMgb2YgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGFubnVhbGx5LiAgRnJvbSAxOTkzLTE5OTgsIHRoZSBjaGFuZ2UgdG8KKyMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyBvbiBhIEZyaWRheSBtb3JuaW5nIGZyb20gbWlkbmlnaHQgSVNUIHRvCisjIDEgYS5tIElEVDsgdXAgdW50aWwgMTk5OCwgdGhlIGNoYW5nZSBiYWNrIHRvIHN0YW5kYXJkIHRpbWUgd2FzIG9uIGEKKyMgU2F0dXJkYXkgbmlnaHQgZnJvbSBtaWRuaWdodCBkYXlsaWdodCBzYXZpbmdzIHRpbWUgdG8gMTEgcC5tLiBzdGFuZGFyZAorIyB0aW1lLiAgMTk5NiBpcyBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIHdoZXJlIHRoZSBjaGFuZ2UgYmFjayB0byBzdGFuZGFyZAorIyB0aW1lIHRvb2sgcGxhY2Ugb24gU3VuZGF5IG5pZ2h0IGluc3RlYWQgb2YgU2F0dXJkYXkgbmlnaHQgdG8gYXZvaWQKKyMgY29uZmxpY3RzIHdpdGggdGhlIEpld2lzaCBOZXcgWWVhci4gIEluIDE5OTksIHRoZSBjaGFuZ2UgdG8KKyMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyBzdGlsbCBvbiBhIEZyaWRheSBtb3JuaW5nIGJ1dCBmcm9tCisjIDIgYS5tLiBJU1QgdG8gMyBhLm0uIElEVDsgZnVydGhlcm1vcmUsIHRoZSBjaGFuZ2UgYmFjayB0byBzdGFuZGFyZCB0aW1lCisjIHdhcyBhbHNvIG9uIGEgRnJpZGF5IG1vcm5pbmcgZnJvbSAyIGEubS4gSURUIHRvIDEgYS5tLiBJU1QgZm9yCisjIDE5OTkgb25seS4gIEluIHRoZSB5ZWFyIDIwMDAsIHRoZSBjaGFuZ2UgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcworIyBzaW1pbGFyIHRvIDE5OTksIGJ1dCBhbHRob3VnaCB0aGUgY2hhbmdlIGJhY2sgd2lsbCBiZSBvbiBhIEZyaWRheSwgaXQKKyMgd2lsbCB0YWtlIHBsYWNlIGZyb20gMSBhLm0uIElEVCB0byBtaWRuaWdodCBJU1QuICBTdGFydGluZyBpbiAyMDAxLCBhbGwKKyMgY2hhbmdlcyB0by9mcm9tIHdpbGwgdGFrZSBwbGFjZSBhdCAxIGEubS4gb2xkIHRpbWUsIGJ1dCBub3cgdGhlcmUgaXMgbm8KKyMgcnVsZSBhcyB0byB3aGF0IGRheSBvZiB0aGUgd2VlayBpdCB3aWxsIHRha2UgcGxhY2UgaW4gYXMgdGhlIHN0YXJ0IGRhdGUKKyMgKGV4Y2VwdCBpbiAyMDAzKSBpcyB0aGUgbmlnaHQgYWZ0ZXIgdGhlIFBhc3NvdmVyIFNlZGVyIChpLmUuIHRoZSBldmUKKyMgb2YgdGhlIDE2dGggb2YgTmlzYW4gaW4gdGhlIGx1bmFyIEhlYnJldyBjYWxlbmRhcikgYW5kIHRoZSBlbmQgZGF0ZQorIyAoZXhjZXB0IGluIDIwMDIpIGlzIHRocmVlIG5pZ2h0cyBiZWZvcmUgWW9tIEtpcHB1ciBbRGF5IG9mIEF0b25lbWVudF0KKyMgKHRoZSBldmUgb2YgdGhlIDd0aCBvZiBUaXNocmVpIGluIHRoZSBsdW5hciBIZWJyZXcgY2FsZW5kYXIpLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlaaW9uCTE5ODkJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5ODkJb25seQktCVNlcAkgMwkwOjAwCTAJUworUnVsZQlaaW9uCTE5OTAJb25seQktCU1hcgkyNQkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5OTAJb25seQktCUF1ZwkyNgkwOjAwCTAJUworUnVsZQlaaW9uCTE5OTEJb25seQktCU1hcgkyNAkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5OTEJb25seQktCVNlcAkgMQkwOjAwCTAJUworUnVsZQlaaW9uCTE5OTIJb25seQktCU1hcgkyOQkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5OTIJb25seQktCVNlcAkgNgkwOjAwCTAJUworUnVsZQlaaW9uCTE5OTMJb25seQktCUFwcgkgMgkwOjAwCTE6MDAJRAorUnVsZQlaaW9uCTE5OTMJb25seQktCVNlcAkgNQkwOjAwCTAJUworCisjIFRoZSBkYXRlcyBmb3IgMTk5NC0xOTk1IHdlcmUgb2J0YWluZWQgZnJvbSBPZmZpY2Ugb2YgdGhlIFNwb2tlc3dvbWFuIGZvciB0aGUKKyMgTWluaXN0cnkgb2YgSW50ZXJpb3IsIEplcnVzYWxlbSwgSXNyYWVsLiAgVGhlIHNwb2tlc3dvbWFuIGNhbiBiZSByZWFjaGVkIGJ5CisjIGNhbGxpbmcgdGhlIG9mZmljZSBkaXJlY3RseSBhdCA5NzItMi02NzAxNDQ3IG9yIDk3Mi0yLTY3MDE0NDguCisKKyMgUnVsZQlOQU1FICAgIEZST00gICAgVE8gICAgICBUWVBFICAgIElOICAgICAgT04gICAgICBBVCAgICAgIFNBVkUgICAgTEVUVEVSL1MKK1J1bGUJWmlvbgkxOTk0CW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk0CW9ubHkJLQlBdWcJMjgJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTk1CW9ubHkJLQlNYXIJMzEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk1CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKKworIyBUaGUgZGF0ZXMgZm9yIDE5OTYgd2VyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNaW5pc3RlciBvZiBJbnRlcmlvciBvZiB0aGUKKyMgdGltZSwgSGFpbSBSYW1vbi4gIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgcmVnYXJkaW5nIDE5OTYtMTk5OAorIyAod2l0aCB0aGUgZGF0ZXMgZm9yIDE5OTctMTk5OCBubyBsb25nZXIgYmVpbmcgcmVsZXZhbnQpIGNhbiBiZSB2aWV3ZWQgYXQ6CisjCisjICAgZnRwOi8vZnRwLmNzLmh1amkuYWMuaWwvcHViL3R6L2Fubm91bmNlbWVudHMvMTk5Ni0xOTk4LnJhbW9uLnBzLmd6CisjCisjIFRoZSBkYXRlcyBmb3IgMTk5Ny0xOTk4IHdlcmUgYWx0ZXJlZCBieSBoaXMgc3VjY2Vzc29yLCBSYWJiaSBFbGkgU3Vpc3NhLgorIworIyBUaGUgb2ZmaWNpYWwgYW5ub3VuY2VtZW50cyBmb3IgdGhlIHllYXJzIDE5OTctMTk5OSBjYW4gYmUgdmlld2VkIGF0OgorIworIyAgIGZ0cDovL2Z0cC5jcy5odWppLmFjLmlsL3B1Yi90ei9hbm5vdW5jZW1lbnRzL1lZWVkucHMuZ3oKKyMKKyMgICAgICAgd2hlcmUgWVlZWSBpcyB0aGUgcmVsZXZhbnQgeWVhci4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJWmlvbgkxOTk2CW9ubHkJLQlNYXIJMTUJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk2CW9ubHkJLQlTZXAJMTYJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTk3CW9ubHkJLQlNYXIJMjEJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk3CW9ubHkJLQlTZXAJMTQJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTk4CW9ubHkJLQlNYXIJMjAJMDowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk4CW9ubHkJLQlTZXAJIDYJMDowMAkwCVMKK1J1bGUJWmlvbgkxOTk5CW9ubHkJLQlBcHIJIDIJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkxOTk5CW9ubHkJLQlTZXAJIDMJMjowMAkwCVMKKworIyBUaGUgS25lc3NldCBJbnRlcmlvciBDb21taXR0ZWUgaGFzIGNoYW5nZWQgdGhlIGRhdGVzIGZvciAyMDAwIGZvcgorIyB0aGUgdGhpcmQgdGltZSBpbiBqdXN0IG92ZXIgYSB5ZWFyIGFuZCBoYXZlIHNldCBuZXcgZGF0ZXMgZm9yIHRoZQorIyB5ZWFycyAyMDAxLTIwMDQgYXMgd2VsbC4KKyMKKyMgVGhlIG9mZmljaWFsIGFubm91bmNlbWVudCBmb3IgdGhlIHN0YXJ0IGRhdGUgb2YgMjAwMCBjYW4gYmUgdmlld2VkIGF0OgorIworIwlmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8yMDAwLXN0YXJ0LnBzLmd6CisjCisjIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgZm9yIHRoZSBlbmQgZGF0ZSBvZiAyMDAwIGFuZCB0aGUgZGF0ZXMKKyMgZm9yIHRoZSB5ZWFycyAyMDAxLTIwMDQgY2FuIGJlIHZpZXdlZCBhdDoKKyMKKyMJZnRwOi8vZnRwLmNzLmh1amkuYWMuaWwvcHViL3R6L2Fubm91bmNlbWVudHMvMjAwMC0yMDA0LnBzLmd6CisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVppb24JMjAwMAlvbmx5CS0JQXByCTE0CTI6MDAJMTowMAlECitSdWxlCVppb24JMjAwMAlvbmx5CS0JT2N0CSA2CTE6MDAJMAlTCitSdWxlCVppb24JMjAwMQlvbmx5CS0JQXByCSA5CTE6MDAJMTowMAlECitSdWxlCVppb24JMjAwMQlvbmx5CS0JU2VwCTI0CTE6MDAJMAlTCitSdWxlCVppb24JMjAwMglvbmx5CS0JTWFyCTI5CTE6MDAJMTowMAlECitSdWxlCVppb24JMjAwMglvbmx5CS0JT2N0CSA3CTE6MDAJMAlTCitSdWxlCVppb24JMjAwMwlvbmx5CS0JTWFyCTI4CTE6MDAJMTowMAlECitSdWxlCVppb24JMjAwMwlvbmx5CS0JT2N0CSAzCTE6MDAJMAlTCitSdWxlCVppb24JMjAwNAlvbmx5CS0JQXByCSA3CTE6MDAJMTowMAlECitSdWxlCVppb24JMjAwNAlvbmx5CS0JU2VwCTIyCTE6MDAJMAlTCisKKyMgVGhlIHByb3Bvc2VkIGxhdyBhZ3JlZWQgdXBvbiBieSB0aGUgS25lc3NldCBJbnRlcmlvciBDb21taXR0ZWUgb24KKyMgMjAwNS0wMi0xNCBpcyB0aGF0LCBmb3IgMjAwNSBhbmQgYmV5b25kLCBEU1Qgc3RhcnRzIGF0IDAyOjAwIHRoZQorIyBsYXN0IEZyaWRheSBiZWZvcmUgQXByaWwgMm5kIChpLmUuIHRoZSBsYXN0IEZyaWRheSBpbiBNYXJjaCBvciBBcHJpbAorIyAxc3QgaXRzZWxmIGlmIGl0IGZhbGxzIG9uIGEgRnJpZGF5KSBhbmQgZW5kcyBhdCAwMjowMCBvbiB0aGUgU2F0dXJkYXkKKyMgbmlnaHQgX2JlZm9yZV8gdGhlIGZhc3Qgb2YgWW9tIEtpcHB1ci4KKyMKKyMgVGhvc2Ugd2hvIGNhbiByZWFkIEhlYnJldyBjYW4gdmlldyB0aGUgYW5ub3VuY2VtZW50IGF0OgorIworIwlmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8yMDA1K2JleW9uZC5wcworCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDItMjIpOgorIyBJIHVzZWQgRXBocmFpbSBTaWx2ZXJiZXJnJ3MgZHN0LWlzcmFlbC5lbCBwcm9ncmFtCisjIDxmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovc29mdHdhcmUvZHN0LWlzcmFlbC5lbD4gKDIwMDUtMDItMjApCisjIGFsb25nIHdpdGggRWQgUmVpbmdvbGQncyBjYWwtaGVicmV3IGluIEdOVSBFbWFjcyAyMS40LAorIyB0byBnZW5lcmF0ZSB0aGUgdHJhbnNpdGlvbnMgaW4gdGhpcyBsaXN0LgorIyAoSSByZXBsYWNlZCAibGFzdEZyaSIgd2l0aCAiRnJpPj0yNiIgYnkgaGFuZC4pCisjIFRoZSBzcHJpbmcgdHJhbnNpdGlvbnMgYmVsb3cgYWxsIGNvcnJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBSdWxlOgorIworIyBSdWxlCVppb24JMjAwNQltYXgJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAorIworIyBidXQgb2xkZXIgemljIGltcGxlbWVudGF0aW9ucyAoZS5nLiwgU29sYXJpcyA4KSBkbyBub3Qgc3VwcG9ydAorIyAiRnJpPj0yNiIgdG8gbWVhbiBBcHJpbCAxIGluIHllYXJzIGxpa2UgMjAwNSwgc28gZm9yIG5vdyB3ZSBsaXN0IHRoZQorIyBzcHJpbmd0aW1lIHRyYW5zaXRpb25zIGV4cGxpY2l0bHkuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVppb24JMjAwNQlvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECitSdWxlCVppb24JMjAwNQlvbmx5CS0JT2N0CSA5CTI6MDAJMAlTCitSdWxlCVppb24JMjAwNgkyMDEwCS0JTWFyCUZyaT49MjYJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkyMDA2CW9ubHkJLQlPY3QJIDEJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDA3CW9ubHkJLQlTZXAJMTYJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDA4CW9ubHkJLQlPY3QJIDUJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDA5CW9ubHkJLQlTZXAJMjcJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDEwCW9ubHkJLQlTZXAJMTIJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDExCW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkyMDExCW9ubHkJLQlPY3QJIDIJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDEyCTIwMTUJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAorUnVsZQlaaW9uCTIwMTIJb25seQktCVNlcAkyMwkyOjAwCTAJUworUnVsZQlaaW9uCTIwMTMJb25seQktCVNlcAkgOAkyOjAwCTAJUworUnVsZQlaaW9uCTIwMTQJb25seQktCVNlcAkyOAkyOjAwCTAJUworUnVsZQlaaW9uCTIwMTUJb25seQktCVNlcAkyMAkyOjAwCTAJUworUnVsZQlaaW9uCTIwMTYJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAorUnVsZQlaaW9uCTIwMTYJb25seQktCU9jdAkgOQkyOjAwCTAJUworUnVsZQlaaW9uCTIwMTcJMjAyMQktCU1hcglGcmk+PTI2CTI6MDAJMTowMAlECitSdWxlCVppb24JMjAxNwlvbmx5CS0JU2VwCTI0CTI6MDAJMAlTCitSdWxlCVppb24JMjAxOAlvbmx5CS0JU2VwCTE2CTI6MDAJMAlTCitSdWxlCVppb24JMjAxOQlvbmx5CS0JT2N0CSA2CTI6MDAJMAlTCitSdWxlCVppb24JMjAyMAlvbmx5CS0JU2VwCTI3CTI6MDAJMAlTCitSdWxlCVppb24JMjAyMQlvbmx5CS0JU2VwCTEyCTI6MDAJMAlTCitSdWxlCVppb24JMjAyMglvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECitSdWxlCVppb24JMjAyMglvbmx5CS0JT2N0CSAyCTI6MDAJMAlTCitSdWxlCVppb24JMjAyMwkyMDMyCS0JTWFyCUZyaT49MjYJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkyMDIzCW9ubHkJLQlTZXAJMjQJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI0CW9ubHkJLQlPY3QJIDYJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI1CW9ubHkJLQlTZXAJMjgJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI2CW9ubHkJLQlTZXAJMjAJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI3CW9ubHkJLQlPY3QJMTAJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI4CW9ubHkJLQlTZXAJMjQJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDI5CW9ubHkJLQlTZXAJMTYJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDMwCW9ubHkJLQlPY3QJIDYJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDMxCW9ubHkJLQlTZXAJMjEJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDMyCW9ubHkJLQlTZXAJMTIJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDMzCW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKK1J1bGUJWmlvbgkyMDMzCW9ubHkJLQlPY3QJIDIJMjowMAkwCVMKK1J1bGUJWmlvbgkyMDM0CTIwMzcJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAorUnVsZQlaaW9uCTIwMzQJb25seQktCVNlcAkxNwkyOjAwCTAJUworUnVsZQlaaW9uCTIwMzUJb25seQktCU9jdAkgNwkyOjAwCTAJUworUnVsZQlaaW9uCTIwMzYJb25seQktCVNlcAkyOAkyOjAwCTAJUworUnVsZQlaaW9uCTIwMzcJb25seQktCVNlcAkxMwkyOjAwCTAJUworCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvSmVydXNhbGVtCTI6MjA6NTYgLQlMTVQJMTg4MAorCQkJMjoyMDo0MAktCUpNVAkxOTE4CSMgSmVydXNhbGVtIE1lYW4gVGltZT8KKwkJCTI6MDAJWmlvbglJJXNUCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSmFwYW4KKworIyBgOTowMCcgYW5kIGBKU1QnIGlzIGZyb20gR3V5IEhhcnJpcy4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTAzLTA2KToKKyMgVG9kYXkncyBfQXNhaGkgRXZlbmluZyBOZXdzXyAocGFnZSA0KSByZXBvcnRzIHRoYXQgSmFwYW4gaGFkCisjIGRheWxpZ2h0IHNhdmluZyBiZXR3ZWVuIDE5NDggYW5kIDE5NTEsIGJ1dCBgYHRoZSBzeXN0ZW0gd2FzIGRpc2NvbnRpbnVlZAorIyBiZWNhdXNlIHRoZSBwdWJsaWMgYmVsaWV2ZWQgaXQgd291bGQgbGVhZCB0byBsb25nZXIgd29ya2luZyBob3Vycy4nJworCisjIEZyb20gTWF5dW1pIE5lZ2lzaGkgaW4gdGhlIDIwMDUtMDgtMTAgSmFwYW4gVGltZXMKKyMgPGh0dHA6Ly93d3cuamFwYW50aW1lcy5jby5qcC9jZ2ktYmluL2dldGFydGljbGUucGw1P25uMjAwNTA4MTBmMi5odG0+OgorIyBPY2N1cGF0aW9uIGF1dGhvcml0aWVzIGltcG9zZWQgZGF5bGlnaHQtc2F2aW5nIHRpbWUgb24gSmFwYW4gb24KKyMgWzE5NDgtMDUtMDFdLi4uLiAgQnV0IGxhY2sgb2YgcHJpb3IgZGViYXRlIGFuZCB0aGUgZXhlY3V0aW9uIG9mCisjIGRheWxpZ2h0LXNhdmluZyB0aW1lIGp1c3QgdGhyZWUgZGF5cyBhZnRlciB0aGUgYmlsbCB3YXMgcGFzc2VkIGdlbmVyYXRlZAorIyBkZWVwIGhhdHJlZCBvZiB0aGUgY29uY2VwdC4uLi4gIFRoZSBEaWV0IHVuY2VyZW1vbmlvdXNseSBwYXNzZWQgYSBiaWxsIHRvCisjIGR1bXAgdGhlIHVucG9wdWxhciBzeXN0ZW0gaW4gT2N0b2JlciAxOTUxLCBsZXNzIHRoYW4gYSBtb250aCBhZnRlciB0aGUgU2FuCisjIEZyYW5jaXNjbyBQZWFjZSBUcmVhdHkgd2FzIHNpZ25lZC4gIChBIGdvdmVybm1lbnQgcG9sbCBpbiAxOTUxIHNob3dlZCA1MyUKKyMgb2YgdGhlIEphcGFuZXNlIHdhbnRlZCB0byBzY3JhcCBkYXlsaWdodC1zYXZpbmcgdGltZSwgYXMgb3Bwb3NlZCB0byAzMCUgd2hvCisjIHdhbnRlZCB0byBrZWVwIGl0LikKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRFNUIGluIEphcGFuIGR1cmluZyB0aG9zZSB5ZWFycyB3YXMgYXMgZm9sbG93czoKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUphcGFuCTE5NDgJb25seQktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKK1J1bGUJSmFwYW4JMTk0OAkxOTUxCS0JU2VwCVNhdD49OAkyOjAwCTAJUworUnVsZQlKYXBhbgkxOTQ5CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECitSdWxlCUphcGFuCTE5NTAJMTk1MQktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKKyMgYnV0IHRoZSBvbmx5IGxvY2F0aW9ucyB1c2luZyBpdCAoZm9yIGJpcnRoIGNlcnRpZmljYXRlcywgcHJlc3VtYWJseSwgc2luY2UKKyMgdGhlaXIgYXVkaWVuY2UgaXMgYXN0cm9sb2dlcnMpIHdlcmUgVVMgbWlsaXRhcnkgYmFzZXMuICBGb3Igbm93LCBhc3N1bWUKKyMgdGhhdCBmb3IgbW9zdCBwdXJwb3NlcyBkYXlsaWdodC1zYXZpbmcgdGltZSB3YXMgb2JzZXJ2ZWQ7IG90aGVyd2lzZSwgd2hhdAorIyB3b3VsZCBoYXZlIGJlZW4gdGhlIHBvaW50IG9mIHRoZSAxOTUxIHBvbGw/CisKKyMgRnJvbSBIaWRleXVraSBTdXp1a2kgKDE5OTgtMTEtMDkpOgorIyAnVG9reW8nIHVzdWFsbHkgc3RhbmRzIGZvciB0aGUgZm9ybWVyIGxvY2F0aW9uIG9mIFRva3lvIEFzdHJvbm9taWNhbAorIyBPYnNlcnZhdG9yeTogRSAxMzkgNDQnIDQwIi45MCAoOWggMThtIDU4cy43MjcpLCBOIDM1IDM5JyAxNiIuMC4KKyMgVGhpcyBkYXRhIGlzIGZyb20gJ1Jpa2EgTmVucHlvdSAoQ2hyb25vbG9naWNhbCBTY2llbnRpZmljIFRhYmxlcykgMTk5NicKKyMgZWRpdGVkIGJ5IE5hdGlvbmFsIEFzdHJvbm9taWNhbCBPYnNlcnZhdG9yeSBvZiBKYXBhbi4uLi4KKyMgSlNUIChKYXBhbiBTdGFuZGFyZCBUaW1lKSBoYXMgYmVlbiB1c2VkIHNpbmNlIDE4ODgtMDEtMDEgMDA6MDAgKEpTVCkuCisjIFRoZSBsYXcgaXMgZW5hY3RlZCBvbiAxODg2LTA3LTA3LgorCisjIEZyb20gSGlkZXl1a2kgU3V6dWtpICgxOTk4LTExLTE2KToKKyMgVGhlIG9yZGluYW5jZSBOby4gNTEgKDE4ODYpIGVzdGFibGlzaGVkICJzdGFuZGFyZCB0aW1lIiBpbiBKYXBhbiwKKyMgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEzNSBkZWdyZWUuCisjIEluIHRoZSBvcmRpbmFuY2UgTm8uIDE2NyAoMTg5NSksICJzdGFuZGFyZCB0aW1lIiB3YXMgcmVuYW1lZCB0byAiY2VudHJhbAorIyBzdGFuZGFyZCB0aW1lIi4gIEFuZCB0aGUgc2FtZSBvcmRpbmFuY2UgYWxzbyBlc3RhYmxpc2hlZCAid2VzdGVybiBzdGFuZGFyZAorIyB0aW1lIiwgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEyMCBkZWdyZWUuLi4uICBCdXQgIndlc3Rlcm4gc3RhbmRhcmQKKyMgdGltZSIgd2FzIGFib2xpc2hlZCBpbiB0aGUgb3JkaW5hbmNlIE5vLiA1MjkgKDE5MzcpLiAgSW4gdGhlIG9yZGluYW5jZSBOby4KKyMgMTY3LCB0aGVyZSBpcyBubyBtZW50aW9uIHJlZ2FyZGluZyBmb3Igd2hhdCBwbGFjZSB3ZXN0ZXJuIHN0YW5kYXJkIHRpbWUgaXMKKyMgc3RhbmRhcmQuLi4uCisjCisjIEkgd3JvdGUgIm9yZGluYW5jZSIgYWJvdmUsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIHRyYW5zbGF0ZS4KKyMgSW4gSmFwYW5lc2UgaXQncyAiY2hva3VyZWkiLCB3aGljaCBtZWFucyBvcmRpbmFuY2UgZnJvbSBlbXBlcm9yLgorCisjIFNoYW5rcyAmIFBvdHRlbmdlciBjbGFpbSBKU1QgaW4gdXNlIHNpbmNlIDE4OTYsIGFuZCB0aGF0IGEgZmV3CisjIHBsYWNlcyAoZS5nLiBJc2hpZ2FraSkgdXNlICswODAwOyBnbyB3aXRoIFN1enVraS4gIEd1ZXNzIHRoYXQgYWxsCisjIG9yZGluYW5jZXMgdG9vayBlZmZlY3Qgb24gSmFuIDEuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9Ub2t5bwk5OjE4OjU5CS0JTE1UCTE4ODcgRGVjIDMxIDE1OjAwdQorCQkJOTowMAktCUpTVAkxODk2CisJCQk5OjAwCS0JQ0pUCTE5MzgKKwkJCTk6MDAJSmFwYW4JSiVzVAorIyBTaW5jZSAxOTM4LCBhbGwgSmFwYW5lc2UgcG9zc2Vzc2lvbnMgaGF2ZSBiZWVuIGxpa2UgQXNpYS9Ub2t5by4KKworIyBKb3JkYW4KKyMKKyMgRnJvbSA8YSBocmVmPSJodHRwOi8vc3Rhci5hcmFiaWEuY29tLzk5MDcwMS9KTzkuaHRtbCI+CisjIEpvcmRhbiBXZWVrICgxOTk5LTA3LTAxKSA8L2E+IHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgorIyBDbG9ja3MgaW4gSm9yZGFuIHdlcmUgZm9yd2FyZGVkIG9uZSBob3VyIG9uIFdlZG5lc2RheSBhdCBtaWRuaWdodCwKKyMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBnb3Zlcm5tZW50J3MgZGVjaXNpb24gdG8gaW1wbGVtZW50IHN1bW1lciB0aW1lCisjIGFsbCB5ZWFyIHJvdW5kLgorIworIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwOTMwL0pPOS5odG1sIj4KKyMgSm9yZGFuIFdlZWsgKDE5OTktMDktMzApIDwvYT4gdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0xMS0wOSk6CisjIFdpbnRlciB0aW1lIHN0YXJ0cyB0b2RheSBUaHVyc2RheSwgMzAgU2VwdGVtYmVyLiBDbG9ja3Mgd2lsbCBiZSB0dXJuZWQgYmFjaworIyBieSBvbmUgaG91ci4gIFRoaXMgaXMgdGhlIGxhdGVzdCBnb3Zlcm5tZW50IGRlY2lzaW9uIGFuZCBpdCdzIGZpbmFsIQorIyBUaGUgZGVjaXNpb24gd2FzIHRha2VuIGJlY2F1c2Ugb2YgdGhlIGluY3JlYXNlIGluIHdvcmtpbmcgaG91cnMgaW4KKyMgZ292ZXJubWVudCdzIGRlcGFydG1lbnRzIGZyb20gc2l4IHRvIHNldmVuIGhvdXJzLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTExLTIyKToKKyMgU3RhcnRpbmcgMjAwMyB0cmFuc2l0aW9ucyBhcmUgZnJvbSBTdGVmZmVuIFRob3JzZW4ncyB3ZWIgc2l0ZSB0aW1lYW5kZGF0ZS5jb20uCisjCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTExLTIzKToKKyMgRm9yIEpvcmRhbiBJIGhhdmUgcmVjZWl2ZWQgbXVsdGlwbGUgaW5kZXBlbmRlbnQgdXNlciByZXBvcnRzIGV2ZXJ5IHllYXIKKyMgYWJvdXQgRFNUIGVuZCBkYXRlcywgYXMgdGhlIGVuZC1ydWxlIGlzIGRpZmZlcmVudCBldmVyeSB5ZWFyLgorIworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0xMC0wMSksIGFmdGVyIGEgaGVhZHMtdXAgZnJvbSBIaWxhbCBNYWxhd2k6CisjIGh0dHA6Ly93d3cucGV0cmFuZXdzLmdvdi5qby9uZXByYXMvMjAwNi9TZXAvMDUvNDAwMC5odG0KKyMgIkpvcmRhbiB3aWxsIHN3aXRjaCB0byB3aW50ZXIgdGltZSBvbiBGcmlkYXksIE9jdG9iZXIgMjciLgorIworCisjIEZyb20gUGhpbCBQaXp6ZXkgKDIwMDktMDQtMDIpOgorIyAuLi5JIHRoaW5rIEkgbWF5IGhhdmUgc3BvdHRlZCBhbiBlcnJvciBpbiB0aGUgdGltZXpvbmUgZGF0YSBmb3IKKyMgSm9yZGFuLgorIyBUaGUgY3VycmVudCAoMjAwOWQpIGFzaWEgZmlsZSBzaG93cyBKb3JkYW4gZ29pbmcgdG8gZGF5bGlnaHQKKyMgc2F2aW5nCisjIHRpbWUgb24gdGhlIGxhc3QgVGh1cnNkYXkgaW4gTWFyY2guCisjCisjIFJ1bGUgIEpvcmRhbiAgICAgIDIwMDAgIG1heAktICBNYXIgICBsYXN0VGh1ICAgICAwOjAwcyAxOjAwICBTCisjCisjIEhvd2V2ZXIgdGltZWFuZGRhdGUuY29tLCB3aGljaCBJIHVzdWFsbHkgZmluZCByZWxpYWJsZSwgc2hvd3MgSm9yZGFuCisjIGdvaW5nIHRvIGRheWxpZ2h0IHNhdmluZyB0aW1lIG9uIHRoZSBsYXN0IEZyaWRheSBpbiBNYXJjaCBzaW5jZSAyMDAyLgorIyBQbGVhc2Ugc2VlCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svdGltZXpvbmUuaHRtbD9uPTExIj4KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay90aW1lem9uZS5odG1sP249MTEKKyMgPC9hPgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA0LTAyKToKKyMgVGhpcyBzaW5nbGUgb25lIG1pZ2h0IGJlIGdvb2QgZW5vdWdoLCAoMjAwOS0wMy0yNCwgQXJhYmljKToKKyMgPGEgaHJlZj0iaHR0cDovL3BldHJhLmdvdi5qby9BcnRpY2FsLmFzcHg/TG5nPTImU2VjdGlvbj04JkFydGljYWw9OTUyNzkiPgorIyBodHRwOi8vcGV0cmEuZ292LmpvL0FydGljYWwuYXNweD9Mbmc9MiZTZWN0aW9uPTgmQXJ0aWNhbD05NTI3OQorIyA8L2E+CisjCisjIEdvb2dsZSdzIHRyYW5zbGF0aW9uOgorIworIyA+IFRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBkZWNpZGVkIGluIDIwMDIgdG8gYWRvcHQgdGhlIHByaW5jaXBsZSBvZiB0aW1lbHkKKyMgPiBzdWJtaXNzaW9uIG9mIHRoZSBzdW1tZXIgYXQgNjAgbWludXRlcyBhcyBvZiBtaWRuaWdodCBvbiB0aGUgbGFzdCBUaHVyc2RheQorIyA+IG9mIHRoZSBtb250aCBvZiBNYXJjaCBvZiBlYWNoIHllYXIuCisjCisjIFNvIC0gdGhpcyBtZWFucyB0aGUgbWlkbmlnaHQgYmV0d2VlbiBUaHVyc2RheSBhbmQgRnJpZGF5IHNpbmNlIDIwMDIuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDQtMDYpOgorIyBXZSBzdGlsbCBoYXZlIEpvcmRhbiBzd2l0Y2hpbmcgdG8gRFNUIG9uIFRodXJzZGF5cyBpbiAyMDAwIGFuZCAyMDAxLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlKb3JkYW4JMTk3Mwlvbmx5CS0JSnVuCTYJMDowMAkxOjAwCVMKK1J1bGUJSm9yZGFuCTE5NzMJMTk3NQktCU9jdAkxCTA6MDAJMAktCitSdWxlCUpvcmRhbgkxOTc0CTE5NzcJLQlNYXkJMQkwOjAwCTE6MDAJUworUnVsZQlKb3JkYW4JMTk3Nglvbmx5CS0JTm92CTEJMDowMAkwCS0KK1J1bGUJSm9yZGFuCTE5NzcJb25seQktCU9jdAkxCTA6MDAJMAktCitSdWxlCUpvcmRhbgkxOTc4CW9ubHkJLQlBcHIJMzAJMDowMAkxOjAwCVMKK1J1bGUJSm9yZGFuCTE5NzgJb25seQktCVNlcAkzMAkwOjAwCTAJLQorUnVsZQlKb3JkYW4JMTk4NQlvbmx5CS0JQXByCTEJMDowMAkxOjAwCVMKK1J1bGUJSm9yZGFuCTE5ODUJb25seQktCU9jdAkxCTA6MDAJMAktCitSdWxlCUpvcmRhbgkxOTg2CTE5ODgJLQlBcHIJRnJpPj0xCTA6MDAJMTowMAlTCitSdWxlCUpvcmRhbgkxOTg2CTE5OTAJLQlPY3QJRnJpPj0xCTA6MDAJMAktCitSdWxlCUpvcmRhbgkxOTg5CW9ubHkJLQlNYXkJOAkwOjAwCTE6MDAJUworUnVsZQlKb3JkYW4JMTk5MAlvbmx5CS0JQXByCTI3CTA6MDAJMTowMAlTCitSdWxlCUpvcmRhbgkxOTkxCW9ubHkJLQlBcHIJMTcJMDowMAkxOjAwCVMKK1J1bGUJSm9yZGFuCTE5OTEJb25seQktCVNlcAkyNwkwOjAwCTAJLQorUnVsZQlKb3JkYW4JMTk5Mglvbmx5CS0JQXByCTEwCTA6MDAJMTowMAlTCitSdWxlCUpvcmRhbgkxOTkyCTE5OTMJLQlPY3QJRnJpPj0xCTA6MDAJMAktCitSdWxlCUpvcmRhbgkxOTkzCTE5OTgJLQlBcHIJRnJpPj0xCTA6MDAJMTowMAlTCitSdWxlCUpvcmRhbgkxOTk0CW9ubHkJLQlTZXAJRnJpPj0xNQkwOjAwCTAJLQorUnVsZQlKb3JkYW4JMTk5NQkxOTk4CS0JU2VwCUZyaT49MTUJMDowMHMJMAktCitSdWxlCUpvcmRhbgkxOTk5CW9ubHkJLQlKdWwJIDEJMDowMHMJMTowMAlTCitSdWxlCUpvcmRhbgkxOTk5CTIwMDIJLQlTZXAJbGFzdEZyaQkwOjAwcwkwCS0KK1J1bGUJSm9yZGFuCTIwMDAJMjAwMQktCU1hcglsYXN0VGh1CTA6MDBzCTE6MDAJUworUnVsZQlKb3JkYW4JMjAwMgltYXgJLQlNYXIJbGFzdFRodQkyNDowMAkxOjAwCVMKK1J1bGUJSm9yZGFuCTIwMDMJb25seQktCU9jdAkyNAkwOjAwcwkwCS0KK1J1bGUJSm9yZGFuCTIwMDQJb25seQktCU9jdAkxNQkwOjAwcwkwCS0KK1J1bGUJSm9yZGFuCTIwMDUJb25seQktCVNlcAlsYXN0RnJpCTA6MDBzCTAJLQorUnVsZQlKb3JkYW4JMjAwNgltYXgJLQlPY3QJbGFzdEZyaQkwOjAwcwkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9BbW1hbgkyOjIzOjQ0IC0JTE1UCTE5MzEKKwkJCTI6MDAJSm9yZGFuCUVFJXNUCisKKworIyBLYXpha2hzdGFuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0xMS0yMik6CisjIEFuZHJldyBFdnRpY2hvdiAoMTk5Ni0wNC0xMykgd3JpdGVzIHRoYXQgS2F6YWtoc3RhbgorIyBzdGF5ZWQgaW4gc3luYyB3aXRoIE1vc2NvdyBhZnRlciAxOTkwLCBhbmQgdGhhdCBBcXRvYmUgKGZvcm1lcmx5IEFrdHl1Ymluc2spCisjIGFuZCBBcXRhdSAoZm9ybWVybHkgU2hldmNoZW5rbykgYXJlIHRoZSBsYXJnZXN0IGNpdGllcyBpbiB0aGVpciB6b25lcy4KKyMgR3Vlc3MgdGhhdCBBcXRhdSBhbmQgQXF0b2JlIGRpdmVyZ2VkIGluIDE5OTUsIHNpbmNlIHRoYXQncyB0aGUgZmlyc3QgdGltZQorIyBJQVRBIFNTSU0gbWVudGlvbnMgYSB0aGlyZCB0aW1lIHpvbmUgaW4gS2F6YWtoc3Rhbi4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgR2VybWFuIElvZmlzLCBFTFNJLCBBbG1hdHkgKDIwMDEtMTAtMDkpIHJlcG9ydHMgdGhhdCBLYXpha2hzdGFuIHVzZXMKKyMgUnVzc2lhQXNpYSBydWxlcywgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgYXQgMDA6MDAgYXMgdGhlIElBVEEgaGFzIGl0LgorIyBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciwgd2hvIGhhdmUgdGhlbSBhbHdheXMgdXNpbmcgUnVzc2lhQXNpYSBydWxlcy4KKyMgQWxzbyBnbyB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhaW1zIG9mIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMKKyMgLSBLYXpha2hzdGFuIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgaW4gMTk5MS4KKyMgLSBReXp5bG9yZGEgc3dpdGNoZWQgZnJvbSArNTowMCB0byArNjowMCBvbiAxOTkyLTAxLTE5IDAyOjAwLgorIyAtIE9yYWwgc3dpdGNoZWQgZnJvbSArNTowMCB0byArNDowMCBpbiBzcHJpbmcgMTk4OS4KKworIyA8YSBocmVmPSJodHRwOi8vd3d3LmthenNvY2lldHkub3JnLnVrL25ld3MvMjAwNS8wMy8zMC5odG0iPgorIyBGcm9tIEthemFraHN0YW4gRW1iYXNzeSdzIE5ld3MgQnVsbGV0aW4gIzExICgyMDA1LTAzLTIxKToKKyMgPC9hPgorIyBUaGUgR292ZXJubWVudCBvZiBLYXpha2hzdGFuIHBhc3NlZCBhIHJlc29sdXRpb24gTWFyY2ggMTUgYWJvbGlzaGluZworIyBkYXlsaWdodCBzYXZpbmcgdGltZSBjaXRpbmcgbGFjayBvZiBlY29ub21pYyBiZW5lZml0cyBhbmQgaGVhbHRoCisjIGNvbXBsaWNhdGlvbnMgY291cGxlZCB3aXRoIGEgZGVjcmVhc2UgaW4gcHJvZHVjdGl2aXR5LgorIworIyBGcm9tIEJyYW5pc2xhdiBLb2ppYyAoaW4gQXN0YW5hKSB2aWEgR3dpbGxpbSBMYXcgKDIwMDUtMDYtMjgpOgorIyAuLi4gd2hhdCBoYXBwZW5lZCB3YXMgdGhhdCB0aGUgZm9ybWVyIEthemFraHN0YW4gRWFzdGVybiB0aW1lIHpvbmUKKyMgd2FzICJibGVuZGVkIiB3aXRoIHRoZSBDZW50cmFsIHpvbmUuICBUaGVyZWZvcmUsIEthemFraHN0YW4gbm93IGhhcworIyB0d28gdGltZSB6b25lcywgYW5kIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIG9uZSBob3VyLiAgVGhlIHpvbmUKKyMgY2xvc2VyIHRvIFVUQyBpcyB0aGUgZm9ybWVyIFdlc3Rlcm4gem9uZSAocHJvYmFibHkgc3RpbGwgY2FsbGVkIHRoZQorIyBzYW1lKSwgZW5jb21wYXNzaW5nIGZvdXIgcHJvdmluY2VzIGluIHRoZSB3ZXN0OiBBcXRvYmUsIEF0eXJhdSwKKyMgTWFuZ2doeXN0YXUsIGFuZCBXZXN0IEthemFraHN0YW4uICBUaGUgb3RoZXIgem9uZSBlbmNvbXBhc3NlcworIyBldmVyeXRoaW5nIGVsc2UuLi4uICBJIGd1ZXNzIHRoYXQgd291bGQgbWFrZSBLYXpha2hzdGFuIHRpbWUgem9uZXMKKyMgZGUganVyZSBVVEMrNSBhbmQgVVRDKzYgcmVzcGVjdGl2ZWx5LgorCisjCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjCisjIEFsbWF0eSAoZm9ybWVybHkgQWxtYS1BdGEpLCByZXByZXNlbnRpbmcgbW9zdCBsb2NhdGlvbnMgaW4gS2F6YWtoc3RhbgorWm9uZQlBc2lhL0FsbWF0eQk1OjA3OjQ4IC0JTE1UCTE5MjQgTWF5ICAyICMgb3IgQWxtYS1BdGEKKwkJCTU6MDAJLQlBTE1UCTE5MzAgSnVuIDIxICMgQWxtYS1BdGEgVGltZQorCQkJNjowMCBSdXNzaWFBc2lhIEFMTSVzVAkxOTkxCisJCQk2OjAwCS0JQUxNVAkxOTkyCisJCQk2OjAwIFJ1c3NpYUFzaWEJQUxNJXNUCTIwMDUgTWFyIDE1CisJCQk2OjAwCS0JQUxNVAorIyBReXp5bG9yZGEgKGFrYSBLeXp5bG9yZGEsIEtpemlsb3JkYSwgS3p5bC1PcmRhLCBldGMuKQorWm9uZQlBc2lhL1F5enlsb3JkYQk0OjIxOjUyIC0JTE1UCTE5MjQgTWF5ICAyCisJCQk0OjAwCS0JS0laVAkxOTMwIEp1biAyMSAjIEtpemlsb3JkYSBUaW1lCisJCQk1OjAwCS0JS0laVAkxOTgxIEFwciAgMQorCQkJNTowMAkxOjAwCUtJWlNUCTE5ODEgT2N0ICAxCisJCQk2OjAwCS0JS0laVAkxOTgyIEFwciAgMQorCQkJNTowMCBSdXNzaWFBc2lhCUtJWiVzVAkxOTkxCisJCQk1OjAwCS0JS0laVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQorCQkJNTowMAktCVFZWlQJMTk5MiBKYW4gMTkgMjowMAorCQkJNjowMCBSdXNzaWFBc2lhCVFZWiVzVAkyMDA1IE1hciAxNQorCQkJNjowMAktCVFZWlQKKyMgQXF0b2JlIChha2EgQWt0b2JlLCBmb3JtZXJseSBBa3QndWJpbnNrKQorWm9uZQlBc2lhL0FxdG9iZQkzOjQ4OjQwCS0JTE1UCTE5MjQgTWF5ICAyCisJCQk0OjAwCS0JQUtUVAkxOTMwIEp1biAyMSAjIEFrdHl1Ymluc2sgVGltZQorCQkJNTowMAktCUFLVFQJMTk4MSBBcHIgIDEKKwkJCTU6MDAJMTowMAlBS1RTVAkxOTgxIE9jdCAgMQorCQkJNjowMAktCUFLVFQJMTk4MiBBcHIgIDEKKwkJCTU6MDAgUnVzc2lhQXNpYQlBS1Qlc1QJMTk5MQorCQkJNTowMAktCUFLVFQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAgUnVzc2lhQXNpYQlBUVQlc1QJMjAwNSBNYXIgMTUgIyBBcXRvYmUgVGltZQorCQkJNTowMAktCUFRVFQKKyMgTWFuZ2doeXN0YXUKKyMgQXF0YXUgd2FzIG5vdCBmb3VuZGVkIHVudGlsIDE5NjMsIGJ1dCBpdCByZXByZXNlbnRzIGFuIGluaGFiaXRlZCByZWdpb24sCisjIHNvIGluY2x1ZGUgdGltZSBzdGFtcHMgYmVmb3JlIDE5NjMuCitab25lCUFzaWEvQXF0YXUJMzoyMTowNAktCUxNVAkxOTI0IE1heSAgMgorCQkJNDowMAktCUZPUlQJMTkzMCBKdW4gMjEgIyBGb3J0IFNoZXZjaGVua28gVAorCQkJNTowMAktCUZPUlQJMTk2MworCQkJNTowMAktCVNIRVQJMTk4MSBPY3QgIDEgIyBTaGV2Y2hlbmtvIFRpbWUKKwkJCTY6MDAJLQlTSEVUCTE5ODIgQXByICAxCisJCQk1OjAwIFJ1c3NpYUFzaWEJU0hFJXNUCTE5OTEKKwkJCTU6MDAJLQlTSEVUCTE5OTEgRGVjIDE2ICMgaW5kZXBlbmRlbmNlCisJCQk1OjAwIFJ1c3NpYUFzaWEJQVFUJXNUCTE5OTUgTWFyIGxhc3RTdW4gMjowMCAjIEFxdGF1IFRpbWUKKwkJCTQ6MDAgUnVzc2lhQXNpYQlBUVQlc1QJMjAwNSBNYXIgMTUKKwkJCTU6MDAJLQlBUVRUCisjIFdlc3QgS2F6YWtoc3RhbgorWm9uZQlBc2lhL09yYWwJMzoyNToyNAktCUxNVAkxOTI0IE1heSAgMiAjIG9yIFVyYWwnc2sKKwkJCTQ6MDAJLQlVUkFUCTE5MzAgSnVuIDIxICMgVXJhbCdzayB0aW1lCisJCQk1OjAwCS0JVVJBVAkxOTgxIEFwciAgMQorCQkJNTowMAkxOjAwCVVSQVNUCTE5ODEgT2N0ICAxCisJCQk2OjAwCS0JVVJBVAkxOTgyIEFwciAgMQorCQkJNTowMCBSdXNzaWFBc2lhCVVSQSVzVAkxOTg5IE1hciAyNiAyOjAwCisJCQk0OjAwIFJ1c3NpYUFzaWEJVVJBJXNUCTE5OTEKKwkJCTQ6MDAJLQlVUkFUCTE5OTEgRGVjIDE2ICMgaW5kZXBlbmRlbmNlCisJCQk0OjAwIFJ1c3NpYUFzaWEJT1JBJXNUCTIwMDUgTWFyIDE1ICMgT3JhbCBUaW1lCisJCQk1OjAwCS0JT1JBVAorCisjIEt5cmd5enN0YW4gKEtpcmdpenN0YW4pCisjIFRyYW5zaXRpb25zIHRocm91Z2ggMTk5MSBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNSk6CisjIEFjY29yZGluZyB0byBhbiBhcnRpY2xlIGRhdGVkIHRvZGF5IGluIHRoZSBLeXJneXpzdGFuIERldmVsb3BtZW50IEdhdGV3YXkKKyMgPGh0dHA6Ly9lbmcuZ2F0ZXdheS5rZy9jZ2ktYmluL3BhZ2UucGw/aWQ9MSZzdG9yeV9uYW1lPWRvYzk5Nzkuc2h0bWw+CisjIEt5cmd5enN0YW4gaXMgY2FuY2VsaW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBzeXN0ZW0uICBJIHRha2UgdGhlIGFydGljbGUKKyMgdG8gbWVhbiB0aGF0IHRoZXkgd2lsbCBsZWF2ZSB0aGVpciBjbG9ja3MgYXQgNiBob3VycyBhaGVhZCBvZiBVVEMuCisjIEZyb20gTWFsaWsgQWJkdWdhbGlldiAoMjAwNS0wOS0yMSk6CisjIE91ciBnb3Zlcm5tZW50IGNhbmNlbHMgZGF5bGlnaHQgc2F2aW5nIHRpbWUgNnRoIG9mIEF1Z3VzdCAyMDA1LgorIyBGcm9tIDIwMDUtMDgtMTIgb3VyIEdNVC1vZmZzZXQgaXMgKzYsIHcvbyBhbnkgZGF5bGlnaHQgc2F2aW5nLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlLeXJneXoJMTk5MgkxOTk2CS0JQXByCVN1bj49NwkwOjAwcwkxOjAwCVMKK1J1bGUJS3lyZ3l6CTE5OTIJMTk5NgktCVNlcAlsYXN0U3VuCTA6MDAJMAktCitSdWxlCUt5cmd5egkxOTk3CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjMwCTE6MDAJUworUnVsZQlLeXJneXoJMTk5NwkyMDA0CS0JT2N0CWxhc3RTdW4JMjozMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9CaXNoa2VrCTQ6NTg6MjQgLQlMTVQJMTkyNCBNYXkgIDIKKwkJCTU6MDAJLQlGUlVUCTE5MzAgSnVuIDIxICMgRnJ1bnplIFRpbWUKKwkJCTY6MDAgUnVzc2lhQXNpYSBGUlUlc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCTU6MDAJMTowMAlGUlVTVAkxOTkxIEF1ZyAzMSAyOjAwICMgaW5kZXBlbmRlbmNlCisJCQk1OjAwCUt5cmd5eglLRyVzVAkyMDA1IEF1ZyAxMiAgICAjIEt5cmd5enN0YW4gVGltZQorCQkJNjowMAktCUtHVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgS29yZWEgKE5vcnRoIGFuZCBTb3V0aCkKKworIyBGcm9tIEFubmllIEkuIEJhbmcgKDIwMDYtMDctMTApIGluCisjIDxodHRwOi8vd3d3LmtvcmVhaGVyYWxkLmNvLmtyL1NJVEUvZGF0YS9odG1sX2Rpci8yMDA2LzA3LzEwLzIwMDYwNzEwMDAxMi5hc3A+OgorIyBUaGUgTWluaXN0cnkgb2YgQ29tbWVyY2UsIEluZHVzdHJ5IGFuZCBFbmVyZ3kgaGFzIGFscmVhZHkKKyMgY29tbWlzc2lvbmVkIGEgcmVzZWFyY2ggcHJvamVjdCBbdG8gcmVpbnRyb2R1Y2UgRFNUXSBhbmQgaGFzIHNhaWQKKyMgdGhlIHN5c3RlbSBtYXkgYmVnaW4gYXMgZWFybHkgYXMgMjAwOC4uLi4gIEtvcmVhIHJhbiBhIGRheWxpZ2h0CisjIHNhdmluZyBwcm9ncmFtIGZyb20gMTk0OS02MSBidXQgc3RvcHBlZCBpdCBkdXJpbmcgdGhlIDE5NTAtNTMgS29yZWFuIFdhci4KKworIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVJPSwkxOTYwCW9ubHkJLQlNYXkJMTUJMDowMAkxOjAwCUQKK1J1bGUJUk9LCTE5NjAJb25seQktCVNlcAkxMwkwOjAwCTAJUworUnVsZQlST0sJMTk4NwkxOTg4CS0JTWF5CVN1bj49OAkwOjAwCTE6MDAJRAorUnVsZQlST0sJMTk4NwkxOTg4CS0JT2N0CVN1bj49OAkwOjAwCTAJUworCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvU2VvdWwJODoyNzo1MgktCUxNVAkxODkwCisJCQk4OjMwCS0JS1NUCTE5MDQgRGVjCisJCQk5OjAwCS0JS1NUCTE5MjgKKwkJCTg6MzAJLQlLU1QJMTkzMgorCQkJOTowMAktCUtTVAkxOTU0IE1hciAyMQorCQkJODowMAlST0sJSyVzVAkxOTYxIEF1ZyAxMAorCQkJODozMAktCUtTVAkxOTY4IE9jdAorCQkJOTowMAlST0sJSyVzVAorWm9uZQlBc2lhL1B5b25neWFuZwk4OjIzOjAwIC0JTE1UCTE4OTAKKwkJCTg6MzAJLQlLU1QJMTkwNCBEZWMKKwkJCTk6MDAJLQlLU1QJMTkyOAorCQkJODozMAktCUtTVAkxOTMyCisJCQk5OjAwCS0JS1NUCTE5NTQgTWFyIDIxCisJCQk4OjAwCS0JS1NUCTE5NjEgQXVnIDEwCisJCQk5OjAwCS0JS1NUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBLdXdhaXQKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KKyMgRnJvbSB0aGUgQXJhYiBUaW1lcyAoMjAwNy0wMy0xNCk6CisjIFRoZSBDaXZpbCBTZXJ2aWNlIENvbW1pc3Npb24gKENTQykgaGFzIGFwcHJvdmVkIGEgcHJvcG9zYWwgZm9yd2FyZGVkCisjIGJ5IE1QIEFobWFkIEJhcWVyIG9uIGltcGxlbWVudGluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgKERTVCkgaW4KKyMgS3V3YWl0IHN0YXJ0aW5nIGZyb20gQXByaWwgdW50aWwgdGhlIGVuZCBvZiBTZXB0IHRoaXMgeWVhciwgcmVwb3J0cyBBbC1BbmJhLgorIyA8aHR0cDovL3d3dy5hcmFidGltZXNvbmxpbmUuY29tL2FyYWJ0aW1lcy9rdXdhaXQvVmlld2RldC5hc3A/SUQ9OTk1MD4uCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMjkpOgorIyBXZSBkb24ndCBrbm93IHRoZSBkZXRhaWxzLCBvciB3aGV0aGVyIHRoZSBhcHByb3ZhbCBtZWFucyBpdCdsbCBoYXBwZW4sCisjIHNvIGZvciBub3cgd2UgYXNzdW1lIG5vIERTVC4KK1pvbmUJQXNpYS9LdXdhaXQJMzoxMTo1NiAtCUxNVAkxOTUwCisJCQkzOjAwCS0JQVNUCisKKyMgTGFvcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1ZpZW50aWFuZQk2OjUwOjI0IC0JTE1UCTE5MDYgSnVuICA5ICMgb3IgVmlhbmdjaGFuCisJCQk3OjA2OjIwCS0JU01UCTE5MTEgTWFyIDExIDA6MDEgIyBTYWlnb24gTVQ/CisJCQk3OjAwCS0JSUNUCTE5MTIgTWF5CisJCQk4OjAwCS0JSUNUCTE5MzEgTWF5CisJCQk3OjAwCS0JSUNUCisKKyMgTGViYW5vbgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTGViYW5vbgkxOTIwCW9ubHkJLQlNYXIJMjgJMDowMAkxOjAwCVMKK1J1bGUJTGViYW5vbgkxOTIwCW9ubHkJLQlPY3QJMjUJMDowMAkwCS0KK1J1bGUJTGViYW5vbgkxOTIxCW9ubHkJLQlBcHIJMwkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5MjEJb25seQktCU9jdAkzCTA6MDAJMAktCitSdWxlCUxlYmFub24JMTkyMglvbmx5CS0JTWFyCTI2CTA6MDAJMTowMAlTCitSdWxlCUxlYmFub24JMTkyMglvbmx5CS0JT2N0CTgJMDowMAkwCS0KK1J1bGUJTGViYW5vbgkxOTIzCW9ubHkJLQlBcHIJMjIJMDowMAkxOjAwCVMKK1J1bGUJTGViYW5vbgkxOTIzCW9ubHkJLQlTZXAJMTYJMDowMAkwCS0KK1J1bGUJTGViYW5vbgkxOTU3CTE5NjEJLQlNYXkJMQkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5NTcJMTk2MQktCU9jdAkxCTA6MDAJMAktCitSdWxlCUxlYmFub24JMTk3Mglvbmx5CS0JSnVuCTIyCTA6MDAJMTowMAlTCitSdWxlCUxlYmFub24JMTk3MgkxOTc3CS0JT2N0CTEJMDowMAkwCS0KK1J1bGUJTGViYW5vbgkxOTczCTE5NzcJLQlNYXkJMQkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5NzgJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5NzgJb25seQktCVNlcAkzMAkwOjAwCTAJLQorUnVsZQlMZWJhbm9uCTE5ODQJMTk4NwktCU1heQkxCTA6MDAJMTowMAlTCitSdWxlCUxlYmFub24JMTk4NAkxOTkxCS0JT2N0CTE2CTA6MDAJMAktCitSdWxlCUxlYmFub24JMTk4OAlvbmx5CS0JSnVuCTEJMDowMAkxOjAwCVMKK1J1bGUJTGViYW5vbgkxOTg5CW9ubHkJLQlNYXkJMTAJMDowMAkxOjAwCVMKK1J1bGUJTGViYW5vbgkxOTkwCTE5OTIJLQlNYXkJMQkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5OTIJb25seQktCU9jdAk0CTA6MDAJMAktCitSdWxlCUxlYmFub24JMTk5MwltYXgJLQlNYXIJbGFzdFN1bgkwOjAwCTE6MDAJUworUnVsZQlMZWJhbm9uCTE5OTMJMTk5OAktCVNlcAlsYXN0U3VuCTA6MDAJMAktCitSdWxlCUxlYmFub24JMTk5OQltYXgJLQlPY3QJbGFzdFN1bgkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0JlaXJ1dAkyOjIyOjAwIC0JTE1UCTE4ODAKKwkJCTI6MDAJTGViYW5vbglFRSVzVAorCisjIE1hbGF5c2lhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlOQm9ybmVvCTE5MzUJMTk0MQktCVNlcAkxNAkwOjAwCTA6MjAJVFMgIyBvbmUtVGhpcmQgU3VtbWVyCitSdWxlCU5Cb3JuZW8JMTkzNQkxOTQxCS0JRGVjCTE0CTA6MDAJMAktCisjCisjIHBlbmluc3VsYXIgTWFsYXlzaWEKKyMgVGhlIGRhdGEgaGVyZSBhcmUgdGFrZW4gZnJvbSBNb2sgTHkgWW5nICgyMDAzLTEwLTMwKQorIyA8aHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbD4uCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFzaWEvS3VhbGFfTHVtcHVyCTY6NDY6NDYgLQlMTVQJMTkwMSBKYW4gIDEKKwkJCTY6NTU6MjUJLQlTTVQJMTkwNSBKdW4gIDEgIyBTaW5nYXBvcmUgTS5ULgorCQkJNzowMAktCU1BTFQJMTkzMyBKYW4gIDEgIyBNYWxheWEgVGltZQorCQkJNzowMAkwOjIwCU1BTFNUCTE5MzYgSmFuICAxCisJCQk3OjIwCS0JTUFMVAkxOTQxIFNlcCAgMQorCQkJNzozMAktCU1BTFQJMTk0MiBGZWIgMTYKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMTIKKwkJCTc6MzAJLQlNQUxUCTE5ODIgSmFuICAxCisJCQk4OjAwCS0JTVlUCSMgTWFsYXlzaWEgVGltZQorIyBTYWJhaCAmIFNhcmF3YWsKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFRoZSBkYXRhIGhlcmUgYXJlIG1vc3RseSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciwgYnV0IHRoZSAxOTQyLCAxOTQ1IGFuZCAxOTgyCisjIHRyYW5zaXRpb24gZGF0ZXMgYXJlIGZyb20gTW9rIEx5IFluZy4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXNpYS9LdWNoaW5nCTc6MjE6MjAJLQlMTVQJMTkyNiBNYXIKKwkJCTc6MzAJLQlCT1JUCTE5MzMJIyBCb3JuZW8gVGltZQorCQkJODowMAlOQm9ybmVvCUJPUiVzVAkxOTQyIEZlYiAxNgorCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAxMgorCQkJODowMAktCUJPUlQJMTk4MiBKYW4gIDEKKwkJCTg6MDAJLQlNWVQKKworIyBNYWxkaXZlcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlJbmRpYW4vTWFsZGl2ZXMJNDo1NDowMCAtCUxNVAkxODgwCSMgTWFsZQorCQkJNDo1NDowMAktCU1NVAkxOTYwCSMgTWFsZSBNZWFuIFRpbWUKKwkJCTU6MDAJLQlNVlQJCSMgTWFsZGl2ZXMgVGltZQorCisjIE1vbmdvbGlhCisKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IE1vbmdvbGlhIGhhcyB0aHJlZSB0aW1lIHpvbmVzLCBidXQKKyMgdXNubzE5OTUgYW5kIHRoZSBDSUEgbWFwIFN0YW5kYXJkIFRpbWUgWm9uZXMgb2YgdGhlIFdvcmxkICgyMDA1LTAzKQorIyBib3RoIHNheSB0aGF0IGl0IGhhcyBqdXN0IG9uZS4KKworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgxOTk5LTEyLTExKToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5tb25nb2xpYXRvdXJpc20uZ292Lm1uL2dlbmVyYWwuaHRtIj4KKyMgR2VuZXJhbCBJbmZvcm1hdGlvbiBNb25nb2xpYQorIyA8L2E+ICgxOTk5LTA5KQorIyAiVGltZTogTW9uZ29saWEgaGFzIHR3byB0aW1lIHpvbmVzLiBUaHJlZSB3ZXN0ZXJubW9zdCBwcm92aW5jZXMgb2YKKyMgQmF5YW4tVWxnaWksIFV2cywgYW5kIEhvdmQgYXJlIG9uZSBob3VyIGVhcmxpZXIgdGhhbiB0aGUgY2FwaXRhbCBjaXR5LCBhbmQKKyMgdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkgZm9sbG93cyB0aGUgVWxhYW5iYWF0YXIgdGltZSwgd2hpY2ggaXMgVVRDL0dNVCBwbHVzCisjIGVpZ2h0IGhvdXJzLiIKKworIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTEyLTEzKToKKyMgTW9uZ29saWEgZGlzY29udGludWVkIHRoZSB1c2Ugb2YgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGluIDE5OTk7IDE5OTgKKyMgYmVpbmcgdGhlIGxhc3QgeWVhciBpdCB3YXMgaW1wbGVtZW50ZWQuICBUaGUgZGF0ZXMgb2YgaW1wbGVtZW50YXRpb24gSSBhbQorIyB1bnN1cmUgb2YsIGJ1dCBtb3N0IHByb2JhYmx5IGl0IHdhcyBzaW1pbGFyIHRvIFJ1c3NpYSwgZXhjZXB0IGZvciB0aGUgdGltZQorIyBvZiBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBiZWVuIGRpZmZlcmVudC4uLi4KKyMgU29tZSBtYXBzIGluIHRoZSBwYXN0IGhhdmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGFuIGFkZGl0aW9uYWwgdGltZQorIyB6b25lIGluIHRoZSBlYXN0ZXJuIHBhcnQgb2YgTW9uZ29saWEsIGluY2x1ZGluZyB0aGUgcHJvdmluY2VzIG9mIERvcm5vZCwKKyMgU3VoYmFhdGFyLCBhbmQgcG9zc2libHkgS2hlbnRpai4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEyLTE1KToKKyMgTmFtaW5nIGFuZCBzcGVsbGluZyBpcyB0cmlja3kgaW4gTW9uZ29saWEuCisjIFdlJ2xsIHVzZSBIb3ZkIChhbHNvIHNwZWxsZWQgQ2hvdmQgYW5kIEtob3ZkKSB0byByZXByZXNlbnQgdGhlIHdlc3Qgem9uZTsKKyMgdGhlIGNhcGl0YWwgb2YgdGhlIEhvdmQgcHJvdmluY2UgaXMgc29tZXRpbWVzIGNhbGxlZCBIb3ZkLCBzb21ldGltZXMgRHVuZC1VcywKKyMgYW5kIHNvbWV0aW1lcyBKaXJnYWxhbnRhICh3aXRoIHZhcmlhbnQgc3BlbGxpbmdzKSwgYnV0IHRoZSBuYW1lIEhvdmQKKyMgaXMgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KKworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTA1LTEzKToKKyMgSW4gYWRkaXRpb24gdG8gTW9uZ29saWEgc3RhcnRpbmcgZGF5bGlnaHQgc2F2aW5ncyBhcyByZXBvcnRlZCBlYXJsaWVyCisjIChhZG9wdGVkIERTVCBvbiAyMDAxLTA0LTI3IDAyOjAwIGxvY2FsIHRpbWUsIGVuZGluZyAyMDAxLTA5LTI4KSwKKyMgdGhlcmUgYXJlIHRocmVlIHRpbWUgem9uZXMuCisjCisjIFByb3ZpbmNlcyBbYXQgNzowMF06IEJheWFuLXVsZ2lpLCBVdnMsIEtob3ZkLCBaYXZraGFuLCBHb3ZpLUFsdGFpCisjIFByb3ZpbmNlcyBbYXQgODowMF06IEtob3ZzZ29sLCBCdWxnYW4sIEFya2hhbmdhaSwgS2hlbnRpaSwgVG92LAorIwlCYXlhbmtob25nb3IsIE92b3JraGFuZ2FpLCBEdW5kZ292aSwgRG9ybm9nb3ZpLCBPbW5vZ292aQorIyBQcm92aW5jZXMgW2F0IDk6MDBdOiBEb3Jub2QsIFN1a2hiYWF0YXIKKyMKKyMgW1RoZSBwcm92aW5jZSBvZiBTZWxlbmdlIGlzIG9taXR0ZWQgZnJvbSB0aGUgYWJvdmUgbGlzdHMuXQorCisjIEZyb20gR2FuYm9sZCBUcy4sIFVsYWFuYmFhdGFyICgyMDA0LTA0LTE3KToKKyMgRGF5bGlnaHQgc2F2aW5nIG9jY3VycyBhdCAwMjowMCBsb2NhbCB0aW1lIGxhc3QgU2F0dXJkYXkgb2YgTWFyY2guCisjIEl0IHdpbGwgY2hhbmdlIGJhY2sgdG8gbm9ybWFsIGF0IDAyOjAwIGxvY2FsIHRpbWUgbGFzdCBTYXR1cmRheSBvZgorIyBTZXB0ZW1iZXIuLi4uIEFzIEkgcmVtZW1iZXIgdGhpcyBydWxlIHdhcyBjaGFuZ2VkIGluIDIwMDEuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDQtMDQtMTcpOgorIyBGb3Igbm93LCBhc3N1bWUgUml2ZXMgTWNEb3cncyBpbmZvcm1hbnQgZ290IGNvbmZ1c2VkIGFib3V0IEZyaWRheSB2cworIyBTYXR1cmRheSwgYW5kIHRoYXQgaGlzIDIwMDEgZGF0ZXMgc2hvdWxkIGhhdmUgMSBhZGRlZCB0byB0aGVtLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDctMjYpOgorIyBXZSBoYXZlIHdpbGRseSBjb25mbGljdGluZyBpbmZvcm1hdGlvbiBhYm91dCBNb25nb2xpYSdzIHRpbWUgem9uZXMuCisjIEJpbGwgQm9ubmV0ICgyMDA1LTA1LTE5KSByZXBvcnRzIHRoYXQgdGhlIFVTIEVtYmFzc3kgaW4gVWxhYW5iYWF0YXIgc2F5cworIyB0aGVyZSBpcyBvbmx5IG9uZSB0aW1lIHpvbmUgYW5kIHRoYXQgRFNUIGlzIG9ic2VydmVkLCBjaXRpbmcgTWljcm9zb2Z0CisjIFdpbmRvd3MgWFAgYXMgdGhlIHNvdXJjZS4gIFJpc3RvIE55a2FuZW4gKDIwMDUtMDUtMTYpIHJlcG9ydHMgdGhhdAorIyB0cmF2ZWxtb25nb2xpYS5vcmcgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMgKFVUQys3LCBVVEMrOCkgd2l0aCBubyBEU1QuCisjIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTA1LTIwKSByZXBvcnRzIHRoYXQgdGhlIE1vbmdvbGlhbiBFbWJhc3N5IGluCisjIFdhc2hpbmd0b24sIERDIHNheXMgdGhlcmUgYXJlIHR3byB0aW1lIHpvbmVzLCB3aXRoIERTVCBvYnNlcnZlZC4KKyMgSGUgYWxzbyBmb3VuZAorIyA8aHR0cDovL3VicG9zdC5tb25nb2xuZXdzLm1uL2luZGV4LnBocD9zdWJhY3Rpb249c2hvd2NvbW1lbnRzJmlkPTExMTE2MzQ4OTQmYXJjaGl2ZT0mc3RhcnRfZnJvbT0mdWNhdD0xJj4KKyMgd2hpY2ggYWxzbyBzYXlzIHRoYXQgdGhlcmUgaXMgRFNULCBhbmQgd2hpY2ggaGFzIGEgY29tbWVudCBieSAiVG9kZGl1cyIKKyMgKDIwMDUtMDMtMzEgMDY6MDUgKzA3MDApIHNheWluZyAiTW9uZ29saWEgYWN0dWFsbHkgaGFzIDMuNSB0aW1lIHpvbmVzLgorIyBUaGUgV2VzdCAoT0xHSUkpIGlzICs3IEdNVCwgbW9zdCBvZiB0aGUgY291bnRyeSBpcyBVTEFUIGlzICs4IEdNVAorIyBhbmQgc29tZSBFYXN0ZXJuIHByb3ZpbmNlcyBhcmUgKzkgR01UIGJ1dCBTdWtoYmFhdGFyIEFpbWFnIGlzIFNVSEsgKzguNSBHTVQuCisjIFRoZSBTVUtIIHRpbWV6b25lIGlzIG5ldyB0aGlzIHllYXIsIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHRoaW5ncyB0aGUKKyMgcGFybGlhbWVudCBwYXNzZWQgZHVyaW5nIHRoZSB0dW11bHR1b3VzIHdpbnRlciBzZXNzaW9uLiIKKyMgRm9yIG5vdywgbGV0J3MgaWdub3JlIHRoaXMgaW5mb3JtYXRpb24sIHVudGlsIHdlIGhhdmUgbW9yZSBjb25maXJtYXRpb24uCisKKyMgRnJvbSBHYW5ib2xkIFRzLiAoMjAwNy0wMi0yNik6CisjIFBhcmxpYW1lbnQgb2YgTW9uZ29saWEgaGFzIGp1c3QgY2hhbmdlZCB0aGUgZGF5bGlnaHQtc2F2aW5nIHJ1bGUgaW4gRmVicnVhcnkuCisjIFRoZXkgZGVjaWRlZCBub3QgdG8gYWRvcHQgZGF5bGlnaHQtc2F2aW5nIHRpbWUuLi4uCisjIGh0dHA6Ly93d3cubW9uZ29sbmV3cy5tbi9pbmRleC5waHA/bW9kdWxlPXVudXVkdXImc2VjPXZpZXcmaWQ9MTU3NDIKKworIyBGcm9tIERlYm9yYWggR29sZHNtaXRoICgyMDA4LTAzLTMwKToKKyMgV2UgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGNsYWltaW5nIHRoYXQgdGhlIHR6IGRhdGFiYXNlIFVUQyBvZmZzZXQgZm9yCisjIEFzaWEvQ2hvaWJhbHNhbiAoR01UKzA5OjAwKSBpcyBpbmNvcnJlY3QsIGFuZCB0aGF0IGl0IHNob3VsZCBiZSBHTVQKKyMgKzA4OjAwIGluc3RlYWQuIERpZmZlcmVudCBzb3VyY2VzIGFwcGVhciB0byBkaXNhZ3JlZSB3aXRoIHRoZSB0egorIyBkYXRhYmFzZSBvbiB0aGlzLCBlLmcuOgorIworIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2NpdHkuaHRtbD9uPTEwMjYiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2NpdHkuaHRtbD9uPTEwMjYKKyMgPC9hPgorIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXNlcnZlci5jb20vY3VycmVudF90aW1lX2luX01OLmFzcHgiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXNlcnZlci5jb20vY3VycmVudF90aW1lX2luX01OLmFzcHgKKyMgPC9hPgorIworIyBib3RoIHNheSBHTVQrMDg6MDAuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMzEpOgorIyBlem5pcyBhaXJ3YXlzLCB3aGljaCBvcGVyYXRlcyBzZXZlcmFsIGRvbWVzdGljIGZsaWdodHMsIGhhcyBhIGZsaWdodAorIyBzY2hlZHVsZSBoZXJlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmV6bmlzLmNvbS9Db250YWluZXIuanNwP2lkPTExMiI+CisjIGh0dHA6Ly93d3cuZXpuaXMuY29tL0NvbnRhaW5lci5qc3A/aWQ9MTEyCisjIDwvYT4KKyMgKGNsaWNrIHRoZSBFbmdsaXNoIGZsYWcgZm9yIEVuZ2xpc2gpCisjCisjIFRoZXJlIGl0IGFwcGVhcnMgdGhhdCBmbGlnaHRzIGJldHdlZW4gQ2hvaWJhbHNhbiBhbmQgVWxhYW5iYXRhciBhcnJpdmUKKyMgYWJvdXQgMTozNSAtIDE6NTAgaG91cnMgbGF0ZXIgaW4gbG9jYWwgY2xvY2sgdGltZSwgbm8gbWF0dGVyIHRoZQorIyBkaXJlY3Rpb24sIHdoaWxlIFVsYWFuYmFhdGFyLUtodm9kIHRha2VzIDIgaG91cnMgaW4gdGhlIEVhc3Rlcm4KKyMgZGlyZWN0aW9uIGFuZCAzOjM1IGJhY2ssIHdoaWNoIGluZGljYXRlcyB0aGF0IFVsYWFuYmF0YXIgYW5kIEtodm9kIGFyZQorIyBpbiBkaWZmZXJlbnQgdGltZSB6b25lcyAobGlrZSB3ZSBrbm93IGFib3V0KSwgd2hpbGUgQ2hvaWJhbHNhbiBhbmQKKyMgVWxhYW5iYXRhciBhcmUgaW4gdGhlIHNhbWUgdGltZSB6b25lIChjb3JyZWN0aW9uIG5lZWRlZCkuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDUtMTkpOgorIyBBc3N1bWUgdGhhdCBDaG9pYmFsc2FuIGlzIGluZGVlZCBvZmZzZXQgYnkgODowMC4KKyMgWFhYLS1pbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgaW5mb3JtYXRpb24sIGFzc3VtZSB0aGF0IHRyYW5zaXRpb24KKyMgd2FzIGF0IHRoZSBzdGFydCBvZiAyMDA4LTAzLTMxICh0aGUgZGF5IG9mIFN0ZWZmZW4gVGhvcnNlbidzIHJlcG9ydCk7CisjIHRoaXMgaXMgYWxtb3N0IHN1cmVseSB3cm9uZy4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTW9uZ29sCTE5ODMJMTk4NAktCUFwcgkxCTA6MDAJMTowMAlTCitSdWxlCU1vbmdvbAkxOTgzCW9ubHkJLQlPY3QJMQkwOjAwCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgYW5kIElBVEEgU1NJTSBzYXkgMTk5MHMgc3dpdGNoZXMgb2NjdXJyZWQgYXQgMDA6MDAsCisjIGJ1dCBNY0RvdyBzYXlzIHRoZSAyMDAxIHN3aXRjaGVzIG9jY3VycmVkIGF0IDAyOjAwLiAgQWxzbywgSUFUQSBTU0lNCisjICgxOTk2LTA5KSBzYXlzIDE5OTYtMTAtMjUuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciB0aHJvdWdoIDE5OTguCisjCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCB0aGUgU2VwdC4gMTk4NCB0aHJvdWdoIFNlcHQuIDE5OTAgc3dpdGNoZXMKKyMgaW4gQ2hvaWJhbHNhbiAobW9yZSBwcmVjaXNlbHksIGluIERvcm5vZCBhbmQgU3VraGJhYXRhcikgdG9vayBwbGFjZQorIyBhdCAwMjowMCBzdGFuZGFyZCB0aW1lLCBub3QgYXQgMDA6MDAgbG9jYWwgdGltZSBhcyBpbiB0aGUgcmVzdCBvZgorIyB0aGUgY291bnRyeS4gIFRoYXQgd291bGQgYmUgb2RkLCBhbmQgcG9zc2libHkgaXMgYSByZXN1bHQgb2YgdGhlaXIKKyMgY29ycmVjdGlvbiBvZiAwMjowMCAoaW4gdGhlIHByZXZpb3VzIGVkaXRpb24pIG5vdCBiZWluZyBkb25lIGNvcnJlY3RseQorIyBpbiB0aGUgbGF0ZXN0IGVkaXRpb247IHNvIGlnbm9yZSBpdCBmb3Igbm93LgorCitSdWxlCU1vbmdvbAkxOTg1CTE5OTgJLQlNYXIJbGFzdFN1bgkwOjAwCTE6MDAJUworUnVsZQlNb25nb2wJMTk4NAkxOTk4CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KKyMgSUFUQSBTU0lNICgxOTk5LTA5KSBzYXlzIE1vbmdvbGlhIG5vIGxvbmdlciBvYnNlcnZlcyBEU1QuCitSdWxlCU1vbmdvbAkyMDAxCW9ubHkJLQlBcHIJbGFzdFNhdAkyOjAwCTE6MDAJUworUnVsZQlNb25nb2wJMjAwMQkyMDA2CS0JU2VwCWxhc3RTYXQJMjowMAkwCS0KK1J1bGUJTW9uZ29sCTIwMDIJMjAwNgktCU1hcglsYXN0U2F0CTI6MDAJMTowMAlTCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KKyMgSG92ZCwgYS5rLmEuIENob3ZkLCBEdW5kLVVzLCBEemhhcmdhbGFudCwgS2hvdmQsIEppcmdhbGFudGEKK1pvbmUJQXNpYS9Ib3ZkCTY6MDY6MzYgLQlMTVQJMTkwNSBBdWcKKwkJCTY6MDAJLQlIT1ZUCTE5NzgJIyBIb3ZkIFRpbWUKKwkJCTc6MDAJTW9uZ29sCUhPViVzVAorIyBVbGFhbmJhYXRhciwgYS5rLmEuIFVsYW4gQmF0YWFyLCBVbGFuIEJhdG9yLCBVcmdhCitab25lCUFzaWEvVWxhYW5iYWF0YXIgNzowNzozMiAtCUxNVAkxOTA1IEF1ZworCQkJNzowMAktCVVMQVQJMTk3OAkjIFVsYWFuYmFhdGFyIFRpbWUKKwkJCTg6MDAJTW9uZ29sCVVMQSVzVAorIyBDaG9pYmFsc2FuLCBhLmsuYS4gQmFqYW4gVHVlbWVuLCBCYWphbiBUdW1lbiwgQ2hvamJhbHNhbiwKKyMgQ2hveWJhbHNhbiwgU2FuYmVqc2UsIFRjaG9pYmFsc2FuCitab25lCUFzaWEvQ2hvaWJhbHNhbgk3OjM4OjAwIC0JTE1UCTE5MDUgQXVnCisJCQk3OjAwCS0JVUxBVAkxOTc4CisJCQk4OjAwCS0JVUxBVAkxOTgzIEFwcgorCQkJOTowMAlNb25nb2wJQ0hPJXNUCTIwMDggTWFyIDMxICMgQ2hvaWJhbHNhbiBUaW1lCisJCQk4OjAwCU1vbmdvbAlDSE8lc1QKKworIyBOZXBhbAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0thdGhtYW5kdQk1OjQxOjE2IC0JTE1UCTE5MjAKKwkJCTU6MzAJLQlJU1QJMTk4NgorCQkJNTo0NQktCU5QVAkjIE5lcGFsIFRpbWUKKworIyBPbWFuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvTXVzY2F0CTM6NTQ6MjAgLQlMTVQJMTkyMAorCQkJNDowMAktCUdTVAorCisjIFBha2lzdGFuCisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMi0wMy0xMyk6CisjIEkgaGF2ZSBiZWVuIGFkdmlzZWQgdGhhdCBQYWtpc3RhbiBoYXMgZGVjaWRlZCB0byBhZG9wdCBkc3Qgb24gYQorIyBUUklBTCBiYXNpcyBmb3Igb25lIHllYXIsIHN0YXJ0aW5nIDAwOjAxIGxvY2FsIHRpbWUgb24gQXByaWwgNywgMjAwMgorIyBhbmQgZW5kaW5nIGF0IDAwOjAxIGxvY2FsIHRpbWUgT2N0b2JlciA2LCAyMDAyLiAgVGhpcyBpcyB3aGF0IEkgd2FzCisjIHRvbGQsIGJ1dCBJIGJlbGlldmUgdGhhdCB0aGUgYWN0dWFsIHRpbWUgb2YgY2hhbmdlIG1heSBiZSAwMDowMDsgdGhlCisjIDAwOjAxIHdhcyB0byBtYWtlIGl0IGNsZWFyIHdoaWNoIGRheSBpdCB3YXMgb24uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0wMy0xNSk6CisjIEplc3BlciBOb3JnYWFyZCBmb3VuZCB0aGlzIFVSTDoKKyMgaHR0cDovL3d3dy5wYWsuZ292LnBrL3B1YmxpYy9uZXdzL2FwcC9hcHAwNl9kZWMuaHRtCisjIChkYXRlZCAyMDAxLTEyLTA2KSB3aGljaCBzYXlzIHRoYXQgdGhlIENhYmluZXQgYWRvcHRlZCBhIHNjaGVtZSAidG8KKyMgYWR2YW5jZSB0aGUgY2xvY2tzIGJ5IG9uZSBob3VyIG9uIHRoZSBuaWdodCBiZXR3ZWVuIHRoZSBmaXJzdAorIyBTYXR1cmRheSBhbmQgU3VuZGF5IG9mIEFwcmlsIGFuZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9uCisjIDE1dGggT2N0b2JlciBlYWNoIHllYXIiLiAgVGhpcyBhZ3JlZXMgd2l0aCBNY0RvdydzIDA0LTA3IGF0IDAwOjAwLAorIyBidXQgZGlzYWdyZWVzIGFib3V0IHRoZSBPY3RvYmVyIHRyYW5zaXRpb24sIGFuZCBtYWtlcyBpdCBzb3VuZCBsaWtlCisjIGl0J3Mgbm90IG9uIGEgdHJpYWwgYmFzaXMuICBBbHNvLCB0aGUgImJldHdlZW4gdGhlIGZpcnN0IFNhdHVyZGF5CisjIGFuZCBTdW5kYXkgb2YgQXByaWwiIHBocmFzZSwgaWYgdGFrZW4gbGl0ZXJhbGx5LCBtZWFucyB0aGF0IHRoZQorIyB0cmFuc2l0aW9uIHRha2VzIHBsYWNlIGF0IDAwOjAwIG9uIHRoZSBmaXJzdCBTdW5kYXkgb24gb3IgYWZ0ZXIgMDQtMDIuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMi0wOSk6CisjIERBV04gPGh0dHA6Ly93d3cuZGF3bi5jb20vMjAwMi8xMC8wNi90b3AxMy5odG0+IHJlcG9ydGVkIG9uIDIwMDItMTAtMDUKKyMgdGhhdCAyMDAyIERTVCBlbmRlZCB0aGF0IGRheSBhdCBtaWRuaWdodC4gIEdvIHdpdGggTWNEb3cgZm9yIG5vdy4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMy0wMy0xNCk6CisjIEFjY29yZGluZyB0byBodHRwOi8vd3d3LmRhd24uY29tLzIwMDMvMDMvMDcvdG9wMTUuaHRtCisjIHRoZXJlIHdpbGwgYmUgbm8gRFNUIGluIFBha2lzdGFuIHRoaXMgeWVhcjoKKyMKKyMgSVNMQU1BQkFELCBNYXJjaCA2OiBJbmZvcm1hdGlvbiBhbmQgTWVkaWEgRGV2ZWxvcG1lbnQgTWluaXN0ZXIgU2hlaWtoCisjIFJhc2hpZCBBaG1lZCBvbiBUaHVyc2RheSBzYWlkIHRoZSBjYWJpbmV0IGhhZCByZXZlcnNlZCBhIHByZXZpb3VzCisjIGRlY2lzaW9uIHRvIGFkdmFuY2UgY2xvY2tzIGJ5IG9uZSBob3VyIGluIHN1bW1lciBhbmQgcHV0IHRoZW0gYmFjayBieQorIyBvbmUgaG91ciBpbiB3aW50ZXIgd2l0aCB0aGUgYWltIG9mIHNhdmluZyBsaWdodCBob3VycyBhbmQgZW5lcmd5LgorIworIyBUaGUgbWluaXN0ZXIgdG9sZCBhIG5ld3MgY29uZmVyZW5jZSB0aGF0IHRoZSBleHBlcmltZW50IGhhZCByYXRoZXIKKyMgc2hvd24gOCBwZXIgY2VudCBoaWdoZXIgY29uc3VtcHRpb24gb2YgZWxlY3RyaWNpdHkuCisKKyMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTE1KToKKyMgCisjIEhlcmUgaXMgYW4gYXJ0aWNsZSB0aGF0IFBha2lzdGFuIHBsYW4gdG8gaW50cm9kdWNlIERheWxpZ2h0IFNhdmluZyBUaW1lIAorIyBvbiBKdW5lIDEsIDIwMDggZm9yIDMgbW9udGhzLgorIyAKKyMgIi4uLiBUaGUgZmVkZXJhbCBjYWJpbmV0IG9uIFdlZG5lc2RheSBhbm5vdW5jZWQgYSBuZXcgY29uc2VydmF0aW9uIHBsYW4gdG8gaGVscCAKKyMgcmVkdWNlIGxvYWQgc2hlZGRpbmcgYnkgYXBwcm92aW5nIHRoZSBjbG9zdXJlIG9mIGNvbW1lcmNpYWwgY2VudHJlcyBhdCA5cG0gYW5kIAorIyBtb3ZpbmcgY2xvY2tzIGZvcndhcmQgYnkgb25lIGhvdXIgZm9yIHRoZSBuZXh0IHRocmVlIG1vbnRocy4gCisjIC4uLi4iCisjIAorIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUubmV0L2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDEuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMS5odG1sCisjIDwvYT4KKyMgT1IKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5kYWlseXRpbWVzLmNvbS5way9kZWZhdWx0LmFzcD9wYWdlPTIwMDglNUMwNSU1QzE1JTVDc3RvcnlfMTUtNS0yMDA4X3BnMV80Ij4KKyMgaHR0cDovL3d3dy5kYWlseXRpbWVzLmNvbS5way9kZWZhdWx0LmFzcD9wYWdlPTIwMDglNUMwNSU1QzE1JTVDc3RvcnlfMTUtNS0yMDA4X3BnMV80CisjIDwvYT4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wNS0xOSk6CisjIFhYWC0tbWlkbmlnaHQgdHJhbnNpdGlvbnMgaXMgYSBndWVzczsgMjAwOCBvbmx5IGlzIGEgZ3Vlc3MuCisKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDgtMDgtMjgpOgorIyBQYWtpc3RhbiBnb3Zlcm5tZW50IGhhcyBkZWNpZGVkIHRvIGtlZXAgdGhlIHdhdGNoZXMgb25lLWhvdXIgYWR2YW5jZWQKKyMgZm9yIGFub3RoZXIgMiBtb250aHMtLXBsYW4gdG8gcmV0dXJuIHRvIFN0YW5kYXJkIFRpbWUgb24gT2N0b2JlciAzMQorIyBpbnN0ZWFkIG9mIEF1Z3VzdCAzMS4KKyMKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAyLmh0bWwiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDIuaHRtbAorIyA8L2E+CisjIE9SCisjIDxhIGhyZWY9Imh0dHA6Ly9kYWlseW1haWxuZXdzLmNvbS8yMDA4MDgvMjgvbmV3cy9kbWJybjAzLmh0bWwiPgorIyBodHRwOi8vZGFpbHltYWlsbmV3cy5jb20vMjAwODA4LzI4L25ld3MvZG1icm4wMy5odG1sCisjIDwvYT4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wNC0wOCk6CisjIEJhc2VkIG9uIHByZXZpb3VzIG1lZGlhIHJlcG9ydHMgdGhhdCAiLi4uIHByb3Bvc2VkIHBsYW4gdG8KKyMgYWR2YW5jZSBjbG9ja3MgYnkgb25lIGhvdXIgZnJvbSBNYXkgMSB3aWxsIGNhdXNlIGRpc3R1cmJhbmNlCisjIHRvIHRoZSB3b3JraW5nIHNjaGVkdWxlcyByYXRoZXIgdGhhbiBicmluZ2luZyBkaXNjaXBsaW5lIGluCisjIG9mZmljaWFsIHdvcmtpbmcuIgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL2RhaWx5X2RldGFpbC5hc3A/aWQ9MTcxMjgwIj4KKyMgaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way9kYWlseV9kZXRhaWwuYXNwP2lkPTE3MTI4MAorIyA8L2E+CisjCisjIHJlY2VudCBuZXdzIHRoYXQgaW5zdGVhZCBvZiBNYXkgMjAwOSAtIFBha2lzdGFuIHBsYW4gdG8KKyMgaW50cm9kdWNlIERTVCBmcm9tIEFwcmlsIDE1LCAyMDA5CisjCisjIEZZSTogQXNzb2NpYXRlZCBQcmVzcyBPZiBQYWtpc3RhbgorIyBBcHJpbCAwOCwgMjAwOQorIyBDYWJpbmV0IG9rYXlzIHByb3Bvc2FsIHRvIGFkdmFuY2UgY2xvY2tzIGJ5IG9uZSBob3VyIGZyb20gQXByaWwgMTUKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD03MzA0MyZJdGVtaWQ9MSI+CisjIGh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NzMwNDMmSXRlbWlkPTEKKyMgPC9hPgorIworIyBvcgorIworIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDUuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNS5odG1sCisjIDwvYT4KKyMKKyMgLi4uLgorIyBUaGUgRmVkZXJhbCBDYWJpbmV0IG9uIFdlZG5lc2RheSBhcHByb3ZlZCB0aGUgcHJvcG9zYWwgdG8KKyMgYWR2YW5jZSBjbG9ja3MgaW4gdGhlIGNvdW50cnkgYnkgb25lIGhvdXIgZnJvbSBBcHJpbCAxNSB0bworIyBjb25zZXJ2ZSBlbmVyZ3kiCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDktMTcpOgorIyAiVGhlIE5ld3MgSW50ZXJuYXRpb25hbCwiIFBha2lzdGFuIHJlcG9ydHMgdGhhdDogIlRoZSBGZWRlcmFsCisjIEdvdmVybm1lbnQgaGFzIGRlY2lkZWQgdG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgdGltZSBieSBtb3ZpbmcgdGhlCisjIGNsb2NrcyBiYWNrd2FyZCBieSBvbmUgaG91ciBmcm9tIE9jdG9iZXIgMS4gQSBmb3JtYWwgYW5ub3VuY2VtZW50IHRvCisjIHRoaXMgZWZmZWN0IHdpbGwgYmUgbWFkZSBhZnRlciB0aGUgUHJpbWUgTWluaXN0ZXIgZ3JhbnRzIGFwcHJvdmFsIGluCisjIHRoaXMgcmVnYXJkLiIgCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdXBkYXRlcy5hc3A/aWQ9ODcxNjgiPgorIyBodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL3VwZGF0ZXMuYXNwP2lkPTg3MTY4CisjIDwvYT4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wOS0yOCk6CisjIEFjY29yZGluZyB0byBBc3NvY2lhdGVkIFByZXNzIE9mIFBha2lzdGFuLCBpdCBpcyBjb25maXJtZWQgdGhhdAorIyBQYWtpc3RhbiBjbG9ja3MgYWNyb3NzIHRoZSBjb3VudHJ5IHdvdWxkIGJlIHR1cm5lZCBiYWNrIGJ5IGFuIGhvdXIgZnJvbSBPY3RvYmVyCisjIDEsIDIwMDkuCisjCisjICJDbG9ja3MgdG8gZ28gYmFjayBvbmUgaG91ciBmcm9tIDEgT2N0IgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTg2NzE1Jkl0ZW1pZD0yIj4KKyMgaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD04NjcxNSZJdGVtaWQ9MgorIyA8L2E+CisjIG9yCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNy5odG0iPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDcuaHRtCisjIDwvYT4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wOS0yOSk6CisjIEFsZXhhbmRlciBLcml2ZW55c2hldiB3cm90ZToKKyMgPiBBY2NvcmRpbmcgdG8gQXNzb2NpYXRlZCBQcmVzcyBPZiBQYWtpc3RhbiwgaXQgaXMgY29uZmlybWVkIHRoYXQKKyMgPiBQYWtpc3RhbiBjbG9ja3MgYWNyb3NzIHRoZSBjb3VudHJ5IHdvdWxkIGJlIHR1cm5lZCBiYWNrIGJ5IGFuIGhvdXIgZnJvbSBPY3RvYmVyCisjID4gMSwgMjAwOS4KKyMKKyMgTm93IHRoZXkgc2VlbSB0byBoYXZlIGNoYW5nZWQgdGhlaXIgbWluZCwgTm92ZW1iZXIgMSBpcyB0aGUgbmV3IGRhdGU6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdG9wX3N0b3J5X2RldGFpbC5hc3A/SWQ9MjQ3NDIiPgorIyBodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL3RvcF9zdG9yeV9kZXRhaWwuYXNwP0lkPTI0NzQyCisjIDwvYT4KKyMgIlRoZSBjb3VudHJ5J3MgY2xvY2tzIHdpbGwgYmUgcmV2ZXJzZWQgYnkgb25lIGhvdXIgb24gTm92ZW1iZXIgMS4KKyMgT2ZmaWNpYWxzIG9mIEZlZGVyYWwgTWluaXN0cnkgZm9yIEludGVyaW9yIHRvbGQgdGhpcyB0byBHZW8gTmV3cyBvbgorIyBNb25kYXkuIgorIworIyBBbmQgbW9yZSBpbXBvcnRhbnRseSwgaXQgc2VlbXMgdGhhdCB0aGVzZSBkYXRlcyB3aWxsIGJlIGtlcHQgZXZlcnkgeWVhcjoKKyMgIkl0IGhhcyBub3cgYmVlbiBkZWNpZGVkIHRoYXQgY2xvY2tzIHdpbGwgYmUgd291bmQgZm9yd2FyZCBieSBvbmUgaG91cgorIyBvbiBBcHJpbCAxNSBhbmQgcmV2ZXJzZWQgYnkgYW4gaG91ciBvbiBOb3ZlbWJlciAxIGV2ZXJ5IHllYXIgd2l0aG91dAorIyBvYnRhaW5pbmcgcHJpb3IgYXBwcm92YWwsIHRoZSBvZmZpY2lhbHMgYWRkZWQuIgorIworIyBXZSBoYXZlIGNvbmZpcm1lZCB0aGlzIHllYXIncyBlbmQgZGF0ZSB3aXRoIGJvdGggd2l0aCB0aGUgTWluaXN0cnkgb2YKKyMgV2F0ZXIgYW5kIFBvd2VyIGFuZCB0aGUgUGFraXN0YW4gRWxlY3RyaWMgUG93ZXIgQ29tcGFueToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3Bha2lzdGFuLWVuZHMtZHN0MDkuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9wYWtpc3Rhbi1lbmRzLWRzdDA5Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gQ2hyaXN0b3BoIEdvZWhyZSAoMjAwOS0xMC0wMSk6CisjIFtUXWhlIEdlcm1hbiBDb25zdWxhdGUgR2VuZXJhbCBpbiBLYXJhY2hpIHJlcG9ydGVkIG1lIHRvZGF5IHRoYXQgUGFraXN0YW4KKyMgd2lsbCBnbyBiYWNrIHRvIHN0YW5kYXJkIHRpbWUgb24gMXN0IG9mIE5vdmVtYmVyLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZSBQYWtpc3RhbgkyMDAyCW9ubHkJLQlBcHIJU3VuPj0yCTA6MDEJMTowMAlTCitSdWxlIFBha2lzdGFuCTIwMDIJb25seQktCU9jdAlTdW4+PTIJMDowMQkwCS0KK1J1bGUgUGFraXN0YW4JMjAwOAlvbmx5CS0JSnVuCTEJMDowMAkxOjAwCVMKK1J1bGUgUGFraXN0YW4JMjAwOAlvbmx5CS0JTm92CTEJMDowMAkwCS0KK1J1bGUgUGFraXN0YW4JMjAwOQltYXgJLQlBcHIJMTUJMDowMAkxOjAwCVMKK1J1bGUgUGFraXN0YW4JMjAwOQltYXgJLQlOb3YJMQkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0thcmFjaGkJNDoyODoxMiAtCUxNVAkxOTA3CisJCQk1OjMwCS0JSVNUCTE5NDIgU2VwCisJCQk1OjMwCTE6MDAJSVNUCTE5NDUgT2N0IDE1CisJCQk1OjMwCS0JSVNUCTE5NTEgU2VwIDMwCisJCQk1OjAwCS0JS0FSVAkxOTcxIE1hciAyNiAjIEthcmFjaGkgVGltZQorCQkJNTowMCBQYWtpc3RhbglQSyVzVAkjIFBha2lzdGFuIFRpbWUKKworIyBQYWxlc3RpbmUKKworIyBGcm9tIEFtb3MgU2hhcGlyICgxOTk4LTAyLTE1KToKKyMKKyMgRnJvbSAxOTE3IHVudGlsIDE5NDgtMDUtMTUsIGFsbCBvZiBQYWxlc3RpbmUsIGluY2x1ZGluZyB0aGUgcGFydHMgbm93CisjIGtub3duIGFzIHRoZSBHYXphIFN0cmlwIGFuZCB0aGUgV2VzdCBCYW5rLCB3YXMgdW5kZXIgQnJpdGlzaCBydWxlLgorIyBUaGVyZWZvcmUgdGhlIHJ1bGVzIGdpdmVuIGZvciBJc3JhZWwgZm9yIHRoYXQgcGVyaW9kLCBhcHBseSB0aGVyZSB0b28uLi4KKyMKKyMgVGhlIEdhemEgU3RyaXAgd2FzIHVuZGVyIEVneXB0aWFuIHJ1bGUgYmV0d2VlbiAxOTQ4LTA1LTE1IHVudGlsIDE5NjctMDYtMDUKKyMgKGV4Y2VwdCBhIHNob3J0IG9jY3VwYXRpb24gYnkgSXNyYWVsIGZyb20gMTk1Ni0xMSB0aWxsIDE5NTctMDMsIGJ1dCBubworIyB0aW1lIHpvbmUgd2FzIGFmZmVjdGVkIHRoZW4pLiAgSXQgd2FzIG5ldmVyIGZvcm1hbGx5IGFubmV4ZWQgdG8gRWd5cHQsCisjIHRob3VnaC4KKyMKKyMgVGhlIHJlc3Qgb2YgUGFsZXN0aW5lIHdhcyB1bmRlciBKb3JkYW5pYW4gcnVsZSBhdCB0aGF0IHRpbWUsIGZvcm1hbGx5CisjIGFubmV4ZWQgaW4gMTk1MCBhcyB0aGUgV2VzdCBCYW5rIChhbmQgdGhlIHdvcmQgIlRyYW5zIiB3YXMgZHJvcHBlZCBmcm9tCisjIHRoZSBjb3VudHJ5J3MgcHJldmlvdXMgbmFtZSBvZiAidGhlIEhhc2hlbWl0ZSBLaW5nZG9tIG9mIHRoZQorIyBUcmFucy1Kb3JkYW4iKS4gIFNvIHRoZSBydWxlcyBmb3IgSm9yZGFuIGZvciB0aGF0IHRpbWUgYXBwbHkuICBNYWpvcgorIyB0b3ducyBpbiB0aGF0IGFyZWEgYXJlIE5hYmx1cyAoU2hjaGVtKSwgRWwtSGFsaWwgKEhlYnJvbiksIFJhbWFsbGFoLCBhbmQKKyMgRWFzdCBKZXJ1c2FsZW0uCisjCisjIEJvdGggYXJlYXMgd2VyZSBvY2N1cGllZCBieSBJc3JhZWwgaW4gSnVuZSAxOTY3LCBidXQgbm90IGFubmV4ZWQgKGV4Y2VwdAorIyBmb3IgRWFzdCBKZXJ1c2FsZW0pLiAgVGhleSB3ZXJlIG9uIElzcmFlbCB0aW1lIHNpbmNlIHRoZW47IHRoZXJlIG1pZ2h0CisjIGhhdmUgYmVlbiBhIE1pbGl0YXJ5IEdvdmVybm9yJ3Mgb3JkZXIgYWJvdXQgdGltZSB6b25lcywgYnV0IEknbSBub3QgYXdhcmUKKyMgb2YgYW55IChzdWNoIG9yZGVycyBtYXkgaGF2ZSBiZWVuIGlzc3VlZCBzZW1pLWFubnVhbGx5IHdoZW5ldmVyIHN1bW1lcgorIyB0aW1lIHdhcyBpbiBlZmZlY3QsIGJ1dCBtYXliZSB0aGUgbGVnYWwgYXNwZWN0IG9mIHRpbWUgd2FzIGp1c3QgbmVnbGVjdGVkKS4KKyMKKyMgVGhlIFBhbGVzdGluaWFuIEF1dGhvcml0eSB3YXMgZXN0YWJsaXNoZWQgaW4gMTk5MywgYW5kIGdvdCBob2xkIG9mIG1vc3QKKyMgdG93bnMgaW4gdGhlIFdlc3QgQmFuayBhbmQgR2F6YSBieSAxOTk1LiAgSSBrbm93IHRoYXQgaW4gb3JkZXIgdG8KKyMgZGVtb25zdHJhdGUuLi5pbmRlcGVuZGVuY2UsIHRoZXkgaGF2ZSBiZWVuIHN3aXRjaGluZyB0bworIyBzdW1tZXIgdGltZSBhbmQgYmFjayBvbiBhIGRpZmZlcmVudCBzY2hlZHVsZSB0aGFuIElzcmFlbCdzLCBidXQgSSBkb24ndAorIyBrbm93IHdoZW4gdGhpcyB3YXMgc3RhcnRlZCwgb3Igd2hhdCBhbGdvcml0aG0gaXMgdXNlZCAobW9zdCBsaWtlbHkgdGhlCisjIEpvcmRhbmlhbiBvbmUpLgorIworIyBUbyBzdW1tYXJpemUsIHRoZSB0YWJsZSBzaG91bGQgcHJvYmFibHkgbG9vayBzb21ldGhpbmcgbGlrZSB0aGF0OgorIworIyBBcmVhIFwgd2hlbiB8IDE5MTgtMTk0NyB8IDE5NDgtMTk2NyB8IDE5NjctMTk5NSB8IDE5OTYtCisjIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLQorIyBJc3JhZWwgICAgICB8IFppb24gICAgICB8IFppb24gICAgICB8IFppb24gICAgICB8IFppb24KKyMgV2VzdCBiYW5rICAgfCBaaW9uICAgICAgfCBKb3JkYW4gICAgfCBaaW9uICAgICAgfCBKb3JkYW4KKyMgR2F6YSAgICAgICAgfCBaaW9uICAgICAgfCBFZ3lwdCAgICAgfCBaaW9uICAgICAgfCBKb3JkYW4KKyMKKyMgSSBndWVzcyBtb3JlIGluZm8gbWF5IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQQSdzIHdlYiBwYWdlIChpZi93aGVuIHRoZXkKKyMgaGF2ZSBvbmUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBHYXphIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgdW50aWwgMTk1NywgYnV0IGdvCisjIHdpdGggU2hhcGlyIGFuZCBhc3N1bWUgdGhhdCBpdCBvYnNlcnZlZCBEU1QgZnJvbSAxOTQwIHRocm91Z2ggMTk0NywKKyMgYW5kIHRoYXQgaXQgdXNlZCBKb3JkYW5pYW4gcnVsZXMgc3RhcnRpbmcgaW4gMTk5Ni4KKyMgV2UgZG9uJ3QgeWV0IG5lZWQgYSBzZXBhcmF0ZSBlbnRyeSBmb3IgdGhlIFdlc3QgQmFuaywgc2luY2UKKyMgdGhlIG9ubHkgZGlmZmVyZW5jZXMgYmV0d2VlbiBpdCBhbmQgR2F6YSB0aGF0IHdlIGtub3cgYWJvdXQKKyMgb2NjdXJyZWQgYmVmb3JlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLgorIyBIb3dldmVyLCBhcyB3ZSBnZXQgbW9yZSBpbmZvcm1hdGlvbiwgd2UgbWF5IG5lZWQgdG8gYWRkIGVudHJpZXMKKyMgZm9yIHBhcnRzIG9mIHRoZSBXZXN0IEJhbmsgYXMgdGhleSB0cmFuc2l0aW9uZWQgZnJvbSBJc3JhZWwncyBydWxlcworIyB0byBQYWxlc3RpbmUncyBydWxlcy4gIElmIHlvdSBoYXZlIG1vcmUgaW5mbyBhYm91dCB0aGlzLCBwbGVhc2UKKyMgc2VuZCBpdCB0byB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGZ1dHVyZSBlZGl0aW9ucy4KKworIyBGcm9tIElJTlMgTmV3cyBTZXJ2aWNlIC0gSXNyYWVsIC0gMTk5OC0wMy0yMyAxMDozODowNyBJc3JhZWwgdGltZSwKKyMgZm9yd2FyZGVkIGJ5IEVwaHJhaW0gU2lsdmVyYmVyZzoKKyMKKyMgRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IElzcmFlbCBjaGFuZ2VkIG92ZXIgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lCisjIGxhc3Qgd2VlaywgdGhlIFBMTyBBdXRob3JpdHkgKFBBKSBoYXMgZGVjaWRlZCBub3QgdG8gdHVybiBpdHMgY2xvY2tzCisjIG9uZS1ob3VyIGZvcndhcmQgYXQgdGhpcyB0aW1lLiAgQXMgYSBzaWduIG9mIGluZGVwZW5kZW5jZSBmcm9tIElzcmFlbGkgcnVsZSwKKyMgdGhlIFBBIGhhcyBkZWNpZGVkIHRvIGltcGxlbWVudCBEU1QgaW4gQXByaWwuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6CisjIERhb3VkIEt1dHRhYiB3cml0ZXMgaW4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5qcG9zdC5jb20vY29tL0FyY2hpdmUvMjIuQXByLjE5OTkvT3Bpbmlvbi9BcnRpY2xlLTIuaHRtbCI+CisjIEhvbGlkYXkgaGF2b2MKKyMgPC9hPiAoSmVydXNhbGVtIFBvc3QsIDE5OTktMDQtMjIpIHRoYXQKKyMgdGhlIFBhbGVzdGluaWFuIE5hdGlvbmFsIEF1dGhvcml0eSBjaGFuZ2VkIHRvIERTVCBvbiAxOTk5LTA0LTE1LgorIyBJIHZhZ3VlbHkgcmVjYWxsIHRoYXQgdGhleSBzd2l0Y2ggYmFjayBpbiBPY3RvYmVyIChzb3JyeSwgZm9yZ290IHRoZSBzb3VyY2UpLgorIyBGb3Igbm93LCBsZXQncyBhc3N1bWUgdGhhdCB0aGUgc3ByaW5nIHN3aXRjaCB3YXMgYXQgMjQ6MDAsCisjIGFuZCB0aGF0IHRoZXkgc3dpdGNoIGF0IDA6MDAgb24gdGhlIDNyZCBGcmlkYXlzIG9mIEFwcmlsIGFuZCBPY3RvYmVyLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTEtMjIpOgorIyBTdGFydGluZyAyMDA0IHRyYW5zaXRpb25zIGFyZSBmcm9tIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRpbWVhbmRkYXRlLmNvbS4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0xMS0yMyk6CisjIEEgdXNlciBmcm9tIEdhemEgcmVwb3J0ZWQgdGhhdCBHYXphIG1hZGUgdGhlIGNoYW5nZSBlYXJseSBiZWNhdXNlIG9mCisjIHRoZSBSYW1hZGFuLiAgTmV4dCB5ZWFyIFJhbWFkYW4gd2lsbCBiZSBldmVuIGVhcmxpZXIsIHNvIEkgdGhpbmsKKyMgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSBuZXh0IHllYXIncyBlbmQgZGF0ZSB3aWxsIGJlIGFyb3VuZCB0d28gd2Vla3MKKyMgZWFybGllci0tdGhlIHNhbWUgZ29lcyBmb3IgSm9yZGFuLgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA4LTE3KToKKyMgSSB3YXMgaW5mb3JtZWQgYnkgYSB1c2VyIGluIEJldGhsZWhlbSB0aGF0IGluIEJldGhsZWhlbSBpdCBzdGFydGVkIHRoZQorIyBzYW1lIGRheSBhcyBJc3JhZWwsIGFuZCBhZnRlciBjaGVja2luZyB3aXRoIG90aGVyIHVzZXJzIGluIHRoZSBhcmVhLCBJCisjIHdhcyBpbmZvcm1lZCB0aGF0IHRoZXkgc3RhcnRlZCBEU1Qgb25lIGRheSBhZnRlciBJc3JhZWwuICBJIHdhcyBub3QKKyMgYWJsZSB0byBmaW5kIGFueSBhdXRob3JpdGF0aXZlIHNvdXJjZXMgYXQgdGhlIHRpbWUsIG5vciBkZXRhaWxzIGlmCisjIEdhemEgY2hhbmdlZCBhcyB3ZWxsLCBidXQgcHJlc3VtZWQgR2F6YSB0byBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMKKyMgdGhlIFdlc3QgQmFuay4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOS0yNik6CisjIGFjY29yZGluZyB0byB0aGUgUGFsZXN0aW5lIE5ld3MgTmV0d29yayAoMjAwNi0wOS0xOSk6CisjIGh0dHA6Ly9lbmdsaXNoLnBubi5wcy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD01OTYmSXRlbWlkPTUKKyMgPiBUaGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgYW5ub3VuY2VkIHRoYXQgdGhpcyB5ZWFyIGl0cyB3aW50ZXIgc2NoZWR1bGUKKyMgPiB3aWxsIGJlZ2luIGVhcmx5LCBhcyBvZiBtaWRuaWdodCBUaHVyc2RheS4gIEl0IGlzIGFsc28gdGltZSB0byB0dXJuCisjID4gYmFjayB0aGUgY2xvY2tzIGZvciB3aW50ZXIuICBGcmlkYXkgd2lsbCBiZWdpbiBhbiBob3VyIGxhdGUgdGhpcyB3ZWVrLgorIyBJIGd1ZXNzIGl0IGlzIGxpa2VseSB0aGF0IG5leHQgeWVhcidzIGRhdGUgd2lsbCBiZSBtb3ZlZCBhcyB3ZWxsLAorIyBiZWNhdXNlIG9mIHRoZSBSYW1hZGFuLgorCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA3LTA5LTE4KToKKyMgQWNjb3JkaW5nIHRvIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRoZSBHYXphIFN0cmlwIGFuZCB0aGUgcmVzdCBvZiB0aGUKKyMgUGFsZXN0aW5pYW4gdGVycml0b3JpZXMgbGVmdCBEU1QgZWFybHkgb24gMTMudGguIG9mIFNlcHRlbWJlciBhdCAyOjAwLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDktMjApOgorIyBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgR2F6YSBhbmQgdGhlIFdlc3QgQmFuayBkaXNhZ3JlZSBldmVuIG92ZXIgd2hlbgorIyB0aGUgd2Vla2VuZCBpcyAoVGh1cnNkYXkrRnJpZGF5IHZlcnN1cyBGcmlkYXkrU2F0dXJkYXkpLCBzbyBJJ2QgYmUgYSBiaXQKKyMgc3VycHJpc2VkIGlmIHRoZXkgYWdyZWVkIGFib3V0IERTVC4gIEJ1dCBmb3Igbm93LCBhc3N1bWUgdGhleSBhZ3JlZS4KKyMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBwcmVkaWN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgd2lsbCBiZQorIyB0aGUgMm5kIFRodXJzZGF5IG9mIFNlcHRlbWJlciBhdCAwMjowMC4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOC0yOCk6CisjIEhlcmUgaXMgYW4gYXJ0aWNsZSwgdGhhdCBNaWRlYXN0IHJ1bm5pbmcgb24gZGlmZmVyZW50IGNsb2NrcyBhdCBSYW1hZGFuLgorIworIyBHYXphIFN0cmlwIChhcyBFZ3lwdCkgZW5kZWQgRFNUIGF0IG1pZG5pZ2h0IFRodXJzZGF5IChBdWcgMjgsIDIwMDgpLCB3aGlsZQorIyB0aGUgV2VzdCBCYW5rIHdpbGwgZW5kIERheWxpZ2h0IFNhdmluZyBUaW1lIGF0IG1pZG5pZ2h0IFN1bmRheSAoQXVnIDMxLCAyMDA4KS4KKyMKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxIj4KKyMgaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxCisjIDwvYT4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3Ij4KKyMgaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3CisjIDwvYT4KKyMgb3IKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sIj4KKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sCisjIDwvYT4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wMy0yNik6CisjIEFjY29yZGluZyB0byB0aGUgUGFsZXN0aW5lIE5ld3MgTmV0d29yayAoYXJhYmljLnBubi5wcyksIFBhbGVzdGluaWFuCisjIGdvdmVybm1lbnQgZGVjaWRlZCB0byBzdGFydCBEYXlsaWdodCBUaW1lIG9uIFRodXJzZGF5IG5pZ2h0IE1hcmNoCisjIDI2IGFuZCBjb250aW51ZSB1bnRpbCB0aGUgbmlnaHQgb2YgMjcgU2VwdGVtYmVyIDIwMDkuCisjCisjIChpbiBBcmFiaWMpCisjIDxhIGhyZWY9Imh0dHA6Ly9hcmFiaWMucG5uLnBzL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTUwODUwIj4KKyMgaHR0cDovL2FyYWJpYy5wbm4ucHMvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NTA4NTAKKyMgPC9hPgorIworIyBvcgorIyAoRW5nbGlzaCB0cmFuc2xhdGlvbikKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAxLmh0bWwiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3dlc3RiYW5rMDEuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDgtMzEpOgorIyBQYWxlc3RpbmUncyBDb3VuY2lsIG9mIE1pbmlzdGVycyBhbm5vdW5jZWQgdGhhdCB0aGV5IHdpbGwgcmV2ZXJ0IGJhY2sgdG8KKyMgd2ludGVyIHRpbWUgb24gRnJpZGF5LCAyMDA5LTA5LTA0LgorIworIyBPbmUgbmV3cyBzb3VyY2U6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FmYS5wcy9hcmEvP2FjdGlvbj1zaG93ZGV0YWlsJnNlaWQ9NDE1OCI+CisjIGh0dHA6Ly93d3cuc2FmYS5wcy9hcmEvP2FjdGlvbj1zaG93ZGV0YWlsJnNlaWQ9NDE1OAorIyA8L2E+CisjIChQYWxlc3RpbmlhbiBwcmVzcyBhZ2VuY3ksIEFyYWJpYyksCisjIEdvb2dsZSB0cmFuc2xhdGU6ICJEZWNpZGVkIHRoYXQgdGhlIFBhbGVzdGluaWFuIGdvdmVybm1lbnQgaW4gUmFtYWxsYWgKKyMgaGVhZGVkIGJ5IFNhbGFtIEZheXlhZCwgdGhlIHN0YXJ0IG9mIHdvcmsgaW4gdGltZSBmb3IgdGhlIHdpbnRlciBvZgorIyAyMDA5LCBzdGFydGluZyBvbiBGcmlkYXkgYXBwcm92ZWQgdGhlIGZvdXJ0aCBkZWxheSBTZXB0LiBjbG9jayBzaXh0eQorIyBtaW51dGVzIHBlciBob3VyIGFzIG9mIEZyaWRheSBtb3JuaW5nLiIKKyMKKyMgV2UgYXJlIG5vdCBzdXJlIGlmIEdhemEgd2lsbCBkbyB0aGUgc2FtZSwgbGFzdCB5ZWFyIHRoZXkgaGFkIGEgZGlmZmVyZW50CisjIGVuZCBkYXRlLCB3ZSB3aWxsIGtlZXAgdGhpcyBwYWdlIHVwZGF0ZWQ6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS93ZXN0YmFuay1nYXphLWRzdC0yMDA5Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1kc3QtMjAwOS5odG1sCisjIDwvYT4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wOS0wMik6CisjIFNlZW1zIHRoYXQgR2F6YSBTdHJpcCB3aWxsIGdvIGJhY2sgdG8gV2ludGVyIFRpbWUgc2FtZSBkYXRlIGFzIFdlc3QgQmFuay4KKyMKKyMgQWNjb3JkaW5nIHRvIFBhbGVzdGluaWFuIE1pbmlzdHJ5IE9mIEludGVyaW9yLCBXZXN0IEJhbmsgYW5kIEdhemEgU3RyaXAgcGxhbgorIyB0byBjaGFuZ2UgdGltZSBiYWNrIHRvIFN0YW5kYXJkIHRpbWUgb24gU2VwdGVtYmVyIDQsIDIwMDkuCisjCisjICJXaW50ZXIgdGltZSB1bml0ZSB0aGUgV2VzdCBCYW5rIGFuZCBHYXphIgorIyAoZnJvbSBQYWxlc3RpbmlhbiBOYXRpb25hbCBBdXRob3JpdHkpOgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vaS5nb3YucHMvZW4vP3BhZ2U9NjMzMTY3MzQzMjUwNTk0MDI1Jm5pZD0xMTUwNQorIyBodHRwOi8vd3d3Lm1vaS5nb3YucHMvZW4vP3BhZ2U9NjMzMTY3MzQzMjUwNTk0MDI1Jm5pZD0xMTUwNQorIyA8L2E+CisjIG9yCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDIuaHRtbD4KKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMi5odG1sCisjIDwvYT4KKworIyBUaGUgcnVsZXMgZm9yIEVneXB0IGFyZSBzdG9sZW4gZnJvbSB0aGUgYGFmcmljYScgZmlsZS4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlIEVneXB0QXNpYQkxOTU3CW9ubHkJLQlNYXkJMTAJMDowMAkxOjAwCVMKK1J1bGUgRWd5cHRBc2lhCTE5NTcJMTk1OAktCU9jdAkgMQkwOjAwCTAJLQorUnVsZSBFZ3lwdEFzaWEJMTk1OAlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCitSdWxlIEVneXB0QXNpYQkxOTU5CTE5NjcJLQlNYXkJIDEJMTowMAkxOjAwCVMKK1J1bGUgRWd5cHRBc2lhCTE5NTkJMTk2NQktCVNlcAkzMAkzOjAwCTAJLQorUnVsZSBFZ3lwdEFzaWEJMTk2Nglvbmx5CS0JT2N0CSAxCTM6MDAJMAktCisKK1J1bGUgUGFsZXN0aW5lCTE5OTkJMjAwNQktCUFwcglGcmk+PTE1CTA6MDAJMTowMAlTCitSdWxlIFBhbGVzdGluZQkxOTk5CTIwMDMJLQlPY3QJRnJpPj0xNQkwOjAwCTAJLQorUnVsZSBQYWxlc3RpbmUJMjAwNAlvbmx5CS0JT2N0CSAxCTE6MDAJMAktCitSdWxlIFBhbGVzdGluZQkyMDA1CW9ubHkJLQlPY3QJIDQJMjowMAkwCS0KK1J1bGUgUGFsZXN0aW5lCTIwMDYJMjAwOAktCUFwcgkgMQkwOjAwCTE6MDAJUworUnVsZSBQYWxlc3RpbmUJMjAwNglvbmx5CS0JU2VwCTIyCTA6MDAJMAktCitSdWxlIFBhbGVzdGluZQkyMDA3CW9ubHkJLQlTZXAJVGh1Pj04CTI6MDAJMAktCitSdWxlIFBhbGVzdGluZQkyMDA4CW9ubHkJLQlBdWcJbGFzdEZyaQkyOjAwCTAJLQorUnVsZSBQYWxlc3RpbmUJMjAwOQltYXgJLQlNYXIJbGFzdEZyaQkwOjAwCTE6MDAJUworUnVsZSBQYWxlc3RpbmUJMjAwOQltYXgJLQlTZXAJRnJpPj0xCTI6MDAJMAktCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9HYXphCTI6MTc6NTIJLQlMTVQJMTkwMCBPY3QKKwkJCTI6MDAJWmlvbglFRVQJMTk0OCBNYXkgMTUKKwkJCTI6MDAgRWd5cHRBc2lhCUVFJXNUCTE5NjcgSnVuICA1CisJCQkyOjAwCVppb24JSSVzVAkxOTk2CisJCQkyOjAwCUpvcmRhbglFRSVzVAkxOTk5CisJCQkyOjAwIFBhbGVzdGluZQlFRSVzVAorCisjIFBhcmFjZWwgSXMKKyMgbm8gaW5mb3JtYXRpb24KKworIyBQaGlsaXBwaW5lcworIyBPbiAxODQ0LTA4LTE2LCBOYXJjaXNvIENsYXZlcmlhLCBnb3Zlcm5vci1nZW5lcmFsIG9mIHRoZQorIyBQaGlsaXBwaW5lcywgaXNzdWVkIGEgcHJvY2xhbWF0aW9uIGFubm91bmNpbmcgdGhhdCAxODQ0LTEyLTMwIHdhcyB0bworIyBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAxODQ1LTAxLTAxLiAgUm9iZXJ0IEguIHZhbiBHZW50IGhhcyBhCisjIHRyYW5zY3JpcHQgb2YgdGhlIGRlY3JlZSBpbiA8aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC9pZGwvaWRsLmh0bT4uCisjIFRoZSByZXN0IG9mIHRoZSBkYXRhIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTI1KToKKyMgVG9tb3Jyb3cncyBNYW5pbGEgU3RhbmRhcmQgcmVwb3J0cyB0aGF0IHRoZSBQaGlsaXBwaW5lcyBEZXBhcnRtZW50IG9mCisjIFRyYWRlIGFuZCBJbmR1c3RyeSBpcyBjb25zaWRlcmluZyBhZG9wdGluZyBEU1QgdGhpcyBKdW5lIHdoZW4gdGhlCisjIHJhaW55IHNlYXNvbiBiZWdpbnMuICBTZWUKKyMgPGh0dHA6Ly93d3cubWFuaWxhc3RhbmRhcmR0b2RheS5jb20vP3BhZ2U9cG9saXRpY3MwMl9hcHJpbDI2XzIwMDY+LgorIyBGb3Igbm93LCB3ZSdsbCBpZ25vcmUgdGhpcywgc2luY2UgaXQncyBub3QgZGVmaW5pdGUgYW5kIHdlIGxhY2sgZGV0YWlscy4KKyMKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMjYpOgorIyAuLi4gY2xhaW1zIHRoYXQgUGhpbGlwcGluZXMgaGFkIERTVCBsYXN0IHRpbWUgaW4gMTk5MDoKKyMgaHR0cDovL3N0b3J5LnBoaWxpcHBpbmV0aW1lcy5jb20vcC54L2N0LzkvaWQvMTQ1YmUyMGNjNmIxMjFjMC9jaWQvM2U1YmJjY2M3MzBkMjU4Yy8KKyMgW2Egc3RvcnkgZGF0ZWQgMjAwNi0wNC0yNSBieSBDcmlzIExhcmFubyBvZiBEb3cgSm9uZXMgTmV3c3dpcmVzLAorIyBidXQgbm8gZGV0YWlsc10KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJUGhpbAkxOTM2CW9ubHkJLQlOb3YJMQkwOjAwCTE6MDAJUworUnVsZQlQaGlsCTE5MzcJb25seQktCUZlYgkxCTA6MDAJMAktCitSdWxlCVBoaWwJMTk1NAlvbmx5CS0JQXByCTEyCTA6MDAJMTowMAlTCitSdWxlCVBoaWwJMTk1NAlvbmx5CS0JSnVsCTEJMDowMAkwCS0KK1J1bGUJUGhpbAkxOTc4CW9ubHkJLQlNYXIJMjIJMDowMAkxOjAwCVMKK1J1bGUJUGhpbAkxOTc4CW9ubHkJLQlTZXAJMjEJMDowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQXNpYS9NYW5pbGEJLTE1OjU2OjAwIC0JTE1UCTE4NDQgRGVjIDMxCisJCQk4OjA0OjAwIC0JTE1UCTE4OTkgTWF5IDExCisJCQk4OjAwCVBoaWwJUEglc1QJMTk0MiBNYXkKKwkJCTk6MDAJLQlKU1QJMTk0NCBOb3YKKwkJCTg6MDAJUGhpbAlQSCVzVAorCisjIFFhdGFyCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvUWF0YXIJMzoyNjowOCAtCUxNVAkxOTIwCSMgQWwgRGF3aGFoIC8gRG9oYQorCQkJNDowMAktCUdTVAkxOTcyIEp1bgorCQkJMzowMAktCUFTVAorCisjIFNhdWRpIEFyYWJpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1JpeWFkaAkzOjA2OjUyIC0JTE1UCTE5NTAKKwkJCTM6MDAJLQlBU1QKKworIyBTaW5nYXBvcmUKKyMgVGhlIGRhdGEgaGVyZSBhcmUgdGFrZW4gZnJvbSBNb2sgTHkgWW5nICgyMDAzLTEwLTMwKQorIyA8aHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbD4uCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvU2luZ2Fwb3JlCTY6NTU6MjUgLQlMTVQJMTkwMSBKYW4gIDEKKwkJCTY6NTU6MjUJLQlTTVQJMTkwNSBKdW4gIDEgIyBTaW5nYXBvcmUgTS5ULgorCQkJNzowMAktCU1BTFQJMTkzMyBKYW4gIDEgIyBNYWxheWEgVGltZQorCQkJNzowMAkwOjIwCU1BTFNUCTE5MzYgSmFuICAxCisJCQk3OjIwCS0JTUFMVAkxOTQxIFNlcCAgMQorCQkJNzozMAktCU1BTFQJMTk0MiBGZWIgMTYKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMTIKKwkJCTc6MzAJLQlNQUxUCTE5NjUgQXVnICA5ICMgaW5kZXBlbmRlbmNlCisJCQk3OjMwCS0JU0dUCTE5ODIgSmFuICAxICMgU2luZ2Fwb3JlIFRpbWUKKwkJCTg6MDAJLQlTR1QKKworIyBTcHJhdGx5IElzCisjIG5vIGluZm9ybWF0aW9uCisKKyMgU3JpIExhbmthCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDktMDMpOgorIyAiU3JpIExhbmthIGFkdmFuY2VzIGNsb2NrIGJ5IGFuIGhvdXIgdG8gYXZvaWQgYmxhY2tvdXQiCisjICh3d3cudmlydHVhbC1wYy5jb20vbGFua2F3ZWIvbmV3cy9pdGVtcy8yNDA1OTYtMi5odG1sLCAxOTk2LTA1LTI0LAorIyBubyBsb25nZXIgYXZhaWxhYmxlIGFzIG9mIDE5OTktMDgtMTcpCisjIHJlcG9ydGVkIGBgdGhlIGNvdW50cnkncyBzdGFuZGFyZCB0aW1lIHdpbGwgYmUgcHV0IGZvcndhcmQgYnkgb25lIGhvdXIgYXQKKyMgbWlkbmlnaHQgRnJpZGF5ICgxODMwIEdNVCkgYGluIHRoZSBsaWdodCBvZiB0aGUgcHJlc2VudCBwb3dlciBjcmlzaXMnLicnCisjCisjIEZyb20gRGhhcm1hc2lyaSBTZW5hbmF5YWtlLCBTcmkgTGFua2EgTWVkaWEgTWluaXN0ZXIgKDE5OTYtMTAtMjQpLCBhcyBxdW90ZWQKKyMgYnkgU2hhbWluZHJhIGluCisjIDxhIGhyZWY9Im5ld3M6NTRya2E1JG01aEBtdGluc2MwMS1tZ3Qub3BzLndvcmxkbmV0LmF0dC5uZXQiPgorIyBEYWlseSBOZXdzIC0gSG90IE5ld3MgU2VjdGlvbiAoMTk5Ni0xMC0yNikKKyMgPC9hPjoKKyMgV2l0aCBlZmZlY3QgZnJvbSAxMi4zMCBhLm0uIG9uIDI2dGggT2N0b2JlciAxOTk2CisjIFNyaSBMYW5rYSB3aWxsIGJlIHNpeCAoMDYpIGhvdXJzIGFoZWFkIG9mIEdNVC4KKworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNC0xNCksIHF1b3RpbmcgU3JpIExhbmthIE5ld3MgT25saW5lCisjIDxodHRwOi8vbmV3cy5zaW5oYWxheWEuY29tL3dtdmlldy5waHA/QXJ0SUQ9MTEwMDI+ICgyMDA2LTA0LTEzKToKKyMgMDAzMCBocnMgb24gQXByaWwgMTUsIDIwMDYgKG1pZG5pZ2h0IG9mIEFwcmlsIDE0LCAyMDA2ICszMCBtaW51dGVzKQorIyBhdCBwcmVzZW50LCBiZWNvbWUgMjQwMCBob3VycyBvZiBBcHJpbCAxNCwgMjAwNiAobWlkbmlnaHQgb2YgQXByaWwgMTQsIDIwMDYpLgorCisjIEZyb20gUGV0ZXIgQXBwcyBhbmQgUmFuZ2EgU2lyaWxhIG9mIFJldXRlcnMgKDIwMDYtMDQtMTIpIGluOgorIyA8aHR0cDovL3RvZGF5LnJldXRlcnMuY28udWsvbmV3cy9uZXdzQXJ0aWNsZS5hc3B4P3R5cGU9c2NpZW5jZU5ld3Mmc3RvcnlJRD0yMDA2LTA0LTEyVDE3MjIyOFpfMDFfQ09MMjk1NzYyX1JUUklEU1RfMF9TQ0lFTkNFLVNSSUxBTktBLVRJTUUtREMuWE1MPgorIyBbVGhlIFRhbWlsIFRpZ2Vyc10gbmV2ZXIgYWNjZXB0ZWQgdGhlIG9yaWdpbmFsIDE5OTYgdGltZSBjaGFuZ2UgYW5kIHNpbXBseQorIyBrZXB0IHRoZWlyIGNsb2NrcyBzZXQgZml2ZSBhbmQgYSBoYWxmIGhvdXJzIGFoZWFkIG9mIEdyZWVud2ljaCBNZWFuCisjIFRpbWUgKEdNVCksIGluIGxpbmUgd2l0aCBuZWlnaGJvciBJbmRpYS4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNC0xOCk6CisjIFBlb3BsZSB3aG8gbGl2ZSBpbiByZWdpb25zIHVuZGVyIFRhbWlsIGNvbnRyb2wgY2FuIHVzZSBbVFo9J0FzaWEvS29sa2F0YSddLAorIyBhcyB0aGF0IHpvbmUgaGFzIGFncmVlZCB3aXRoIHRoZSBUYW1pbCBhcmVhcyBzaW5jZSBvdXIgY3V0b2ZmIGRhdGUgb2YgMTk3MC4KKworIyBGcm9tIEsgU2V0aHUgKDIwMDYtMDQtMjUpOgorIyBJIHRoaW5rIHRoZSBhYmJyZXZpYXRpb24gTEtUIG9yaWdpbmF0ZWQgZnJvbSB0aGUgd29ybGQgb2YgY29tcHV0ZXJzIGF0CisjIHRoZSB0aW1lIG9mIG9yIHN1YnNlcXVlbnQgdG8gdGhlIHRpbWUgem9uZSBjaGFuZ2VzIGJ5IFNMIEdvdmVybm1lbnQKKyMgdHdpY2UgaW4gMTk5NiBhbmQgcHJvYmFibHkgU0wgR292ZXJubWVudCBvciBpdHMgc3RhbmRhcmRpemF0aW9uCisjIGFnZW5jaWVzIG5ldmVyIGRlY2xhcmVkIGFuIGFiYnJldmlhdGlvbiBhcyBhIG5hdGlvbmFsIHN0YW5kYXJkLgorIworIyBJIHJlY29sbGVjdCBiZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2UgdGhlIGdvdmVybm1lbnQgYW5ub3VjZW1tZW50cworIyBtZW50aW9uaW5nIGl0IGFzIHNpbXBseSBjaGFuZ2luZyBTcmkgTGFua2EgU3RhbmRhcmQgVGltZSBvciBTcmkgTGFua2EKKyMgVGltZSBhbmQgbm8gbWVudGlvbiB3YXMgbWFkZSBhYm91dCB0aGUgYWJicmV2aWF0aW9uLgorIworIyBJZiB3ZSBsb29rIGF0IFNyaSBMYW5rYSBEZXBhcnRtZW50IG9mIEdvdmVybm1lbnQncyAiT2ZmaWNpYWwgTmV3cworIyBXZWJzaXRlIG9mIFNyaSBMYW5rYSIgLi4uIGh0dHA6Ly93d3cubmV3cy5say8gd2UgY2FuIHNlZSB0aGF0IHRoZXkKKyMgdXNlIFNMVCBhcyBhYmJyZXZpYXRpb24gaW4gdGltZSBzdGFtcCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbmV3cworIyBpdGVtLi4uLgorIworIyBXaXRoaW4gU3JpIExhbmthIEkgdGhpbmsgTEtUIGlzIHdlbGwga25vd24gYW1vbmcgY29tcHV0ZXIgdXNlcnMgYW5kCisjIGFkbWluc2l0cmF0b3JzLiAgSW4gbXkgb3BpbmlvbiBTTFQgbWF5IG5vdCBiZSBhIGdvb2QgY2hvaWNlIGJlY2F1c2UgdGhlCisjIG5hdGlvbidzIGxhcmdlc3QgdGVsY29tIC8gaW50ZXJuZXQgb3BlcmF0b3IgU3JpIExhbmthIFRlbGNvbSBpcyB3ZWxsCisjIGtub3duIGJ5IHRoYXQgYWJicmV2aWF0aW9uIC0gc2ltcGx5IGFzIFNMVCAodGhlcmUgSVAgZG9tYWlucyBhcmUKKyMgc2x0LmxrIGFuZCBzbHRuZXQubGspLgorIworIyBCdXQgaWYgaW5kZWVkIG91ciBnb3Zlcm5tZW50IGhhcyBhZG9wdGVkIFNMVCBhcyBzdGFuZGFyZCBhYmJyZXZpYXRpb24KKyMgKHRoYXQgd2UgaGF2ZSBub3Qga25vd24gc28gZmFyKSB0aGVuICBpdCBpcyBiZXR0ZXIgdGhhdCBpdCBiZSB1c2VkIGZvcgorIyBhbGwgY29tcHV0ZXJzLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMjUpOgorIyBPbmUgcG9zc2liaWxpdHkgaXMgdGhhdCB3ZSB3YWl0IGZvciBhIGJpdCBmb3IgdGhlIGR1c3QgdG8gc2V0dGxlIGRvd24KKyMgYW5kIHRoZW4gc2VlIHdoYXQgcGVvcGxlIGFjdHVhbGx5IHNheSBpbiBwcmFjdGljZS4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0NvbG9tYm8JNToxOToyNCAtCUxNVAkxODgwCisJCQk1OjE5OjMyCS0JTU1UCTE5MDYJIyBNb3JhdHV3YSBNZWFuIFRpbWUKKwkJCTU6MzAJLQlJU1QJMTk0MiBKYW4gIDUKKwkJCTU6MzAJMDozMAlJSFNUCTE5NDIgU2VwCisJCQk1OjMwCTE6MDAJSVNUCTE5NDUgT2N0IDE2IDI6MDAKKwkJCTU6MzAJLQlJU1QJMTk5NiBNYXkgMjUgMDowMAorCQkJNjozMAktCUxLVAkxOTk2IE9jdCAyNiAwOjMwCisJCQk2OjAwCS0JTEtUCTIwMDYgQXByIDE1IDA6MzAKKwkJCTU6MzAJLQlJU1QKKworIyBTeXJpYQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJU3lyaWEJMTkyMAkxOTIzCS0JQXByCVN1bj49MTUJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTkyMAkxOTIzCS0JT2N0CVN1bj49MQkyOjAwCTAJLQorUnVsZQlTeXJpYQkxOTYyCW9ubHkJLQlBcHIJMjkJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk2Mglvbmx5CS0JT2N0CTEJMjowMAkwCS0KK1J1bGUJU3lyaWEJMTk2MwkxOTY1CS0JTWF5CTEJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk2Mwlvbmx5CS0JU2VwCTMwCTI6MDAJMAktCitSdWxlCVN5cmlhCTE5NjQJb25seQktCU9jdAkxCTI6MDAJMAktCitSdWxlCVN5cmlhCTE5NjUJb25seQktCVNlcAkzMAkyOjAwCTAJLQorUnVsZQlTeXJpYQkxOTY2CW9ubHkJLQlBcHIJMjQJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk2NgkxOTc2CS0JT2N0CTEJMjowMAkwCS0KK1J1bGUJU3lyaWEJMTk2NwkxOTc4CS0JTWF5CTEJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk3NwkxOTc4CS0JU2VwCTEJMjowMAkwCS0KK1J1bGUJU3lyaWEJMTk4MwkxOTg0CS0JQXByCTkJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk4MwkxOTg0CS0JT2N0CTEJMjowMAkwCS0KK1J1bGUJU3lyaWEJMTk4Nglvbmx5CS0JRmViCTE2CTI6MDAJMTowMAlTCitSdWxlCVN5cmlhCTE5ODYJb25seQktCU9jdAk5CTI6MDAJMAktCitSdWxlCVN5cmlhCTE5ODcJb25seQktCU1hcgkxCTI6MDAJMTowMAlTCitSdWxlCVN5cmlhCTE5ODcJMTk4OAktCU9jdAkzMQkyOjAwCTAJLQorUnVsZQlTeXJpYQkxOTg4CW9ubHkJLQlNYXIJMTUJMjowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk4OQlvbmx5CS0JTWFyCTMxCTI6MDAJMTowMAlTCitSdWxlCVN5cmlhCTE5ODkJb25seQktCU9jdAkxCTI6MDAJMAktCitSdWxlCVN5cmlhCTE5OTAJb25seQktCUFwcgkxCTI6MDAJMTowMAlTCitSdWxlCVN5cmlhCTE5OTAJb25seQktCVNlcAkzMAkyOjAwCTAJLQorUnVsZQlTeXJpYQkxOTkxCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk5MQkxOTkyCS0JT2N0CSAxCTA6MDAJMAktCitSdWxlCVN5cmlhCTE5OTIJb25seQktCUFwcgkgOAkwOjAwCTE6MDAJUworUnVsZQlTeXJpYQkxOTkzCW9ubHkJLQlNYXIJMjYJMDowMAkxOjAwCVMKK1J1bGUJU3lyaWEJMTk5Mwlvbmx5CS0JU2VwCTI1CTA6MDAJMAktCisjIElBVEEgU1NJTSAoMTk5OC0wMikgc2F5cyAxOTk4LTA0LTAyOworIyAoMTk5OC0wOSkgc2F5cyAxOTk5LTAzLTI5IGFuZCAxOTk5LTA5LTI5OyAoMTk5OS0wMikgc2F5cyAxOTk5LTA0LTAyLAorIyAyMDAwLTA0LTAyLCBhbmQgMjAwMS0wNC0wMjsgKDE5OTktMDkpIHNheXMgMjAwMC0wMy0zMSBhbmQgMjAwMS0wMy0zMTsKKyMgKDIwMDYpIHNheXMgMjAwNi0wMy0zMSBhbmQgMjAwNi0wOS0yMjsKKyMgZm9yIG5vdyBpZ25vcmUgYWxsIHRoZXNlIGNsYWltcyBhbmQgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIsCisjIGV4Y2VwdCBmb3IgdGhlIDIwMDYtMDktMjIgY2xhaW0gKHdoaWNoIHNlZW1zIHJpZ2h0IGZvciBSYW1hZGFuKS4KK1J1bGUJU3lyaWEJMTk5NAkxOTk2CS0JQXByCSAxCTA6MDAJMTowMAlTCitSdWxlCVN5cmlhCTE5OTQJMjAwNQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlTeXJpYQkxOTk3CTE5OTgJLQlNYXIJbGFzdE1vbgkwOjAwCTE6MDAJUworUnVsZQlTeXJpYQkxOTk5CTIwMDYJLQlBcHIJIDEJMDowMAkxOjAwCVMKKyMgRnJvbSBTdGVwaGVuIENvbGVib3VybmUgKDIwMDYtMDktMTgpOgorIyBBY2NvcmRpbmcgdG8gSUFUQSBkYXRhLCBTeXJpYSB3aWxsIGNoYW5nZSBEU1Qgb24gMjFzdCBTZXB0ZW1iZXIgWzIxOjAwIFVUQ10KKyMgdGhpcyB5ZWFyIFtvbmx5XS4uLi4gIFRoaXMgaXMgcHJvYmFibHkgcmVsYXRlZCB0byBSYW1hZGFuLCBsaWtlIEVneXB0LgorUnVsZQlTeXJpYQkyMDA2CW9ubHkJLQlTZXAJMjIJMDowMAkwCS0KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0yOSk6CisjIFRvZGF5IHRoZSBBUCByZXBvcnRlZCAiU3lyaWEgd2lsbCBzd2l0Y2ggdG8gc3VtbWVydGltZSBhdCBtaWRuaWdodCBUaHVyc2RheS4iCisjIGh0dHA6Ly93d3cuaWh0LmNvbS9hcnRpY2xlcy9hcC8yMDA3LzAzLzI5L2FmcmljYS9NRS1HRU4tU3lyaWEtVGltZS1DaGFuZ2UucGhwCitSdWxlCVN5cmlhCTIwMDcJb25seQktCU1hcglsYXN0RnJpCTA6MDAJMTowMAlTCisjIEZyb20gSmVzcGVyIE5vcmdhcmQgKDIwMDctMTAtMjcpOgorIyBUaGUgc2lzdGVyIGNlbnRlciBJQ0FSREEgb2YgbXkgd29yayBDSU1NWVQgaXMgY29uZmlybWluZyB0aGF0IFN5cmlhIERTVCB3aWxsCisjIG5vdCB0YWtlIHBsYWNlIDEuc3QgTm92ZW1iZXIgYXQgMDowMCBvJ2Nsb2NrIGJ1dCAxLnN0IE5vdmVtYmVyIGF0IDI0OjAwIG9yCisjIHJhdGhlciBNaWRuaWdodCBiZXR3ZWVuIFRodXJzZGF5IGFuZCBGcmlkYXkuIFRoaXMgZG9lcyBtYWtlIG1vcmUgc2VuY2UgdGhhbgorIyBoYXZpbmcgaXQgYmV0d2VlbiBXZWRuZXNkYXkgYW5kIFRodXJzZGF5ICh0d28gd29ya2RheXMgaW4gU3lyaWEpIHNpbmNlIHRoZQorIyB3ZWVrZW5kIGluIFN5cmlhIGlzIG5vdCBTYXR1cmRheSBhbmQgU3VuZGF5LCBidXQgRnJpZGF5IGFuZCBTYXR1cmRheS4gU28gbm93CisjIGl0IGlzIGltcGxlbWVudGVkIGF0IG1pZG5pZ2h0IG9mIHRoZSBsYXN0IHdvcmtkYXkgYmVmb3JlIHdlZWtlbmQuLi4KKyMgCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTEwLTI3KToKKyMgSmVzcGVyIE5vcmdhYXJkIFdlbGVuIHdyb3RlOgorIyAKKyMgPiAiV2ludGVyIGxvY2FsIHRpbWUgaW4gU3lyaWEgd2lsbCBiZSBvYnNlcnZlZCBhdCBtaWRuaWdodCBvZiBUaHVyc2RheSAxCisjID4gTm92ZW1iZXIgMjAwNywgYW5kIHRoZSBjbG9jayB3aWxsIGJlIHB1dCBiYWNrIDEgaG91ci4iCisjIAorIyBJIGZvdW5kIGNvbmZpcm1hdGlvbiBvbiB0aGlzIGluIHRoaXMgZ292LnN5LWFydGljbGUgKEFyYWJpYyk6CisjIGh0dHA6Ly93ZWhkYS5hbHdlaGRhLmdvdi5zeS9fcHJpbnRfdmVpdy5hc3A/RmlsZU5hbWU9MTI1MjE3MTA1MjAwNzA5MjYxMTEyNDcKKyMgCisjIHdoaWNoIHVzaW5nIEdvb2dsZSdzIHRyYW5zbGF0ZSB0b29scyBzYXlzOgorIyBDb3VuY2lsIG9mIE1pbmlzdGVycyBhbHNvIGFwcHJvdmVkIHRoZSBjb21tZW5jZW1lbnQgb2Ygd29yayBvbiAKKyMgaWRlbnRpZnlpbmcgdGhlIHdpbnRlciB0aW1lIGFzIG9mIEZyaWRheSwgMi8xMS8yMDA3IHdoZXJlIHRoZSA2MHRoIAorIyBtaW51dGUgZGVsYXkgYXQgbWlkbmlnaHQgVGh1cnNkYXkgMS8xMS8yMDA3LgorUnVsZQlTeXJpYQkyMDA3CW9ubHkJLQlOb3YJIEZyaT49MQkwOjAwCTAJLQorCisjIEZyb20gU3RlcGhlbiBDb2xlYm91cm5lICgyMDA4LTAzLTE3KToKKyMgRm9yIGV2ZXJ5b25lJ3MgaW5mbywgSSBzYXcgYW4gSUFUQSB0aW1lIHpvbmUgY2hhbmdlIGZvciBbU3lyaWFdIGZvcgorIyB0aGlzIG1vbnRoIChNYXJjaCAyMDA4KSBpbiB0aGUgbGFzdCBkYXkgb3Igc28uLi5UaGlzIGlzIHRoZSBkYXRhIElBVEEKKyMgYXJlIG5vdyB1c2luZzoKKyMgQ291bnRyeSAgICAgVGltZSBTdGFuZGFyZCAgIC0tLSBEU1QgU3RhcnQgLS0tICAgLS0tIERTVCBFbmQgLS0tICBEU1QKKyMgTmFtZSAgICAgICAgWm9uZSBWYXJpYXRpb24gICBUaW1lICAgIERhdGUgICAgICAgIFRpbWUgICAgRGF0ZQorIyBWYXJpYXRpb24KKyMgU3lyaWFuIEFyYWIKKyMgUmVwdWJsaWMgICAgU1kgICAgKzAyMDAgICAgICAyMjAwICAwM0FQUjA4ICAgICAgIDIxMDAgIDMwU0VQMDggICArMDMwMAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDAgIDAyQVBSMDkgICAgICAgMjEwMCAgMzBTRVAwOSAgICswMzAwCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMCAgMDFBUFIxMCAgICAgICAyMTAwICAzMFNFUDEwICAgKzAzMDAKKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xNyk6CisjIEhlcmUncyBhIGxpbmsgdG8gRW5nbGlzaC1sYW5ndWFnZSBjb3ZlcmFnZSBieSB0aGUgU3lyaWFuIEFyYWIgTmV3cworIyBBZ2VuY3kgKFNBTkEpLi4uCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOC8wMy8xMS8xNjUxNzMuaHRtIj4KKyMgaHR0cDovL3d3dy5zYW5hLnN5L2VuZy8yMS8yMDA4LzAzLzExLzE2NTE3My5odG0KKyMgPC9hPi4uLndoaWNoIHJlYWRzIChpbiBwYXJ0KSAiVGhlIENhYmluZXQgYXBwcm92ZWQgdGhlIHN1Z2dlc3Rpb24gb2YgdGhlCisjIE1pbmlzdHJ5IG9mIEVsZWN0cmljaXR5IHRvIGJlZ2luIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBvbiBGcmlkYXkgQXByaWwKKyMgNHRoLCBhZHZhbmNpbmcgY2xvY2tzIG9uZSBob3VyIGFoZWFkIG9uIG1pZG5pZ2h0IG9mIFRodXJzZGF5IEFwcmlsIDNyZC4iCisjIFNpbmNlIFN5cmlhIGlzIHR3byBob3VycyBlYXN0IG9mIFVUQywgdGhlIDIyMDAgYW5kIDIxMDAgdHJhbnNpdGlvbiB0aW1lcworIyBzaG93biBhYm92ZSBtYXRjaCB1cCB3aXRoIG1pZG5pZ2h0IGluIFN5cmlhLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTE4KToKKyMgTXkgYnVlc3QgZ3Vlc3MgYXQgYSBTeXJpYW4gcnVsZSBpcyAidGhlIEZyaWRheSBuZWFyZXN0IEFwcmlsIDEiOworIyBjb2RpbmcgdGhhdCBpbnZvbHZlcyBlaXRoZXIgdXNpbmcgYSAiTWFyIEZyaT49MjkiIGNvbnN0cnVjdCB0aGF0IG9sZCB0aW1lIHpvbmUKKyMgY29tcGlsZXJzIGNhbid0IGhhbmRsZSAgb3IgaGF2aW5nIG11bHRpcGxlIFJ1bGVzIChhIGxhIElzcmFlbCkuCisjIEZvciBub3csIHVzZSAiQXByIEZyaT49MSIsIGFuZCBnbyB3aXRoIElBVEEgb24gYSB1bmlmb3JtIFNlcCAzMCBlbmQuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMTAtMDcpOgorIyBTeXJpYSBoYXMgbm93IG9mZmljaWFsbHkgZGVjaWRlZCB0byBlbmQgRFNUIG9uIDIwMDgtMTEtMDEgdGhpcyB5ZWFyLAorIyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBhcnRpY2xlIGluIHRoZSBTeXJpYW4gQXJhYiBOZXdzIEFnZW5jeSAoU0FOQSkuCisjCisjIFRoZSBhcnRpY2xlIGlzIGluIEFyYWJpYywgYW5kIHNlZW1zIHRvIHRlbGwgdGhhdCB0aGV5IHdpbGwgZ28gYmFjayB0bworIyB3aW50ZXIgdGltZSBvbiAyMDA4LTExLTAxIGF0IDAwOjAwIGxvY2FsIGRheWxpZ2h0IHRpbWUgKGRlbGF5aW5nL3NldHRpbmcKKyMgY2xvY2tzIGJhY2sgNjAgbWludXRlcykuCisjCisjIDxhIGhyZWY9Imh0dHA6Ly9zYW5hLnN5L2FyYS8yLzIwMDgvMTAvMDcvMTk1NDU5Lmh0bSI+CisjIGh0dHA6Ly9zYW5hLnN5L2FyYS8yLzIwMDgvMTAvMDcvMTk1NDU5Lmh0bQorIyA8L2E+CisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDMtMTkpOgorIyBTeXJpYSB3aWxsIHN0YXJ0IERTVCBvbiAyMDA5LTAzLTI3IDAwOjAwIHRoaXMgeWVhciBhY2NvcmRpbmcgdG8gbWFueSBzb3VyY2VzLAorIyB0d28gZXhhbXBsZXM6CisjCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOS8wMy8xNy8yMTc1NjMuaHRtIj4KKyMgaHR0cDovL3d3dy5zYW5hLnN5L2VuZy8yMS8yMDA5LzAzLzE3LzIxNzU2My5odG0KKyMgPC9hPgorIyAoRW5nbGlzaCwgU3lyaWFuIEFyYWIgTmV3cyAjIEFnZW5jeSkKKyMgPGEgaHJlZj0iaHR0cDovL3RoYXdyYS5hbHdlaGRhLmdvdi5zeS9fVmlld19uZXdzMi5hc3A/RmlsZU5hbWU9OTQ0NTkyNTg3MjAwOTAzMTgwMTIyMDkiPgorIyBodHRwOi8vdGhhd3JhLmFsd2VoZGEuZ292LnN5L19WaWV3X25ld3MyLmFzcD9GaWxlTmFtZT05NDQ1OTI1ODcyMDA5MDMxODAxMjIwOQorIyA8L2E+CisjIChBcmFiaWMsIGdvdi1zaXRlKQorIworIyBXZSBoYXZlIG5vdCBmb3VuZCBhbnkgc291cmNlcyBzYXlpbmcgYW55dGhpbmcgYWJvdXQgd2hlbiBEU1QgZW5kcyB0aGlzIHllYXIuCisjCisjIE91ciBzdW1tYXJ5CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3Qtc3RhcnRzLW1hcmNoLTI3LTIwMDkuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3Qtc3RhcnRzLW1hcmNoLTI3LTIwMDkuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMTAtMjcpOgorIyBUaGUgU3lyaWFuIEFyYWIgTmV3cyBOZXR3b3JrIG9uIDIwMDktMDktMjkgcmVwb3J0ZWQgdGhhdCBTeXJpYSB3aWxsIAorIyByZXZlcnQgYmFjayB0byB3aW50ZXIgKHN0YW5kYXJkKSB0aW1lIG9uIG1pZG5pZ2h0IGJldHdlZW4gVGh1cnNkYXkgCisjIDIwMDktMTAtMjkgYW5kIEZyaWRheSAyMDA5LTEwLTMwOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvYXJhLzIvMjAwOS8wOS8yOS8yNDcwMTIuaHRtIj4KKyMgaHR0cDovL3d3dy5zYW5hLnN5L2FyYS8yLzIwMDkvMDkvMjkvMjQ3MDEyLmh0bSAoQXJhYmljKQorIyA8L2E+CisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMTAtMjgpOgorIyBXZSdsbCBzZWUgaWYgZnV0dXJlIERTVCBzd2l0Y2hpbmcgdGltZXMgdHVybiBvdXQgdG8gYmUgZW5kIG9mIHRoZSBsYXN0CisjIFRodXJzZGF5IG9mIHRoZSBtb250aCBvciB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgRnJpZGF5IG9mIHRoZSBtb250aCBvcgorIyBzb21ldGhpbmcgZWxzZS4gRm9yIG5vdywgdXNlIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBGcmlkYXkuCisKK1J1bGUJU3lyaWEJMjAwOAlvbmx5CS0JQXByCUZyaT49MQkwOjAwCTE6MDAJUworUnVsZQlTeXJpYQkyMDA4CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQorUnVsZQlTeXJpYQkyMDA5CW1heAktCU1hcglsYXN0RnJpCTA6MDAJMTowMAlTCitSdWxlCVN5cmlhCTIwMDkJbWF4CS0JT2N0CWxhc3RGcmkJMDowMAkwCS0KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0RhbWFzY3VzCTI6MjU6MTIgLQlMTVQJMTkyMAkjIERpbWFzaHEKKwkJCTI6MDAJU3lyaWEJRUUlc1QKKworIyBUYWppa2lzdGFuCisjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0R1c2hhbmJlCTQ6MzU6MTIgLQlMTVQJMTkyNCBNYXkgIDIKKwkJCTU6MDAJLQlEVVNUCTE5MzAgSnVuIDIxICMgRHVzaGFuYmUgVGltZQorCQkJNjowMCBSdXNzaWFBc2lhIERVUyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJNTowMAkxOjAwCURVU1NUCTE5OTEgU2VwICA5IDI6MDBzCisJCQk1OjAwCS0JVEpUCQkgICAgIyBUYWppa2lzdGFuIFRpbWUKKworIyBUaGFpbGFuZAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0Jhbmdrb2sJNjo0MjowNAktCUxNVAkxODgwCisJCQk2OjQyOjA0CS0JQk1UCTE5MjAgQXByICMgQmFuZ2tvayBNZWFuIFRpbWUKKwkJCTc6MDAJLQlJQ1QKKworIyBUdXJrbWVuaXN0YW4KKyMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvQXNoZ2FiYXQJMzo1MzozMiAtCUxNVAkxOTI0IE1heSAgMiAjIG9yIEFzaGtoYWJhZAorCQkJNDowMAktCUFTSFQJMTkzMCBKdW4gMjEgIyBBc2hraGFiYWQgVGltZQorCQkJNTowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE1hciAzMSAyOjAwCisJCQk0OjAwIFJ1c3NpYUFzaWEJQVNIJXNUCTE5OTEgT2N0IDI3ICMgaW5kZXBlbmRlbmNlCisJCQk0OjAwIFJ1c3NpYUFzaWEJVE0lc1QJMTk5MiBKYW4gMTkgMjowMAorCQkJNTowMAktCVRNVAorCisjIFVuaXRlZCBBcmFiIEVtaXJhdGVzCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvRHViYWkJMzo0MToxMiAtCUxNVAkxOTIwCisJCQk0OjAwCS0JR1NUCisKKyMgVXpiZWtpc3RhbgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1NhbWFya2FuZAk0OjI3OjEyIC0JTE1UCTE5MjQgTWF5ICAyCisJCQk0OjAwCS0JU0FNVAkxOTMwIEp1biAyMSAjIFNhbWFya2FuZCBUaW1lCisJCQk1OjAwCS0JU0FNVAkxOTgxIEFwciAgMQorCQkJNTowMAkxOjAwCVNBTVNUCTE5ODEgT2N0ICAxCisJCQk2OjAwCS0JVEFTVAkxOTgyIEFwciAgMSAjIFRhc2hrZW50IFRpbWUKKwkJCTU6MDAgUnVzc2lhQXNpYQlTQU0lc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCisJCQk1OjAwCS0JVVpUCitab25lCUFzaWEvVGFzaGtlbnQJNDozNzoxMiAtCUxNVAkxOTI0IE1heSAgMgorCQkJNTowMAktCVRBU1QJMTkzMCBKdW4gMjEgIyBUYXNoa2VudCBUaW1lCisJCQk2OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgTWFyIDMxIDI6MDAKKwkJCTU6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCisJCQk1OjAwCS0JVVpUCisKKyMgVmlldG5hbQorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTE4KToKKyMgVGhlIEVuZ2xpc2gtbGFuZ3VhZ2UgbmFtZSBvZiBWaWV0bmFtJ3MgbW9zdCBwb3B1bG91cyBjaXR5IGlzICJIbyBDaGkgTWluIENpdHkiOworIyB3ZSB1c2UgSG9fQ2hpX01pbmggYmVsb3cgdG8gYXZvaWQgYSBuYW1lIG9mIG1vcmUgdGhhbiAxNCBjaGFyYWN0ZXJzLgorCisjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0hvX0NoaV9NaW5oCTc6MDY6NDAgLQlMTVQJMTkwNiBKdW4gIDkKKwkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KKwkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKKwkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKKwkJCTc6MDAJLQlJQ1QKKworIyBZZW1lbgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL0FkZW4JMzowMDo0OAktCUxNVAkxOTUwCisJCQkzOjAwCS0JQVNUCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA5cy9hdXN0cmFsYXNpYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2F1c3RyYWxhc2lhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTIzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9hdXN0cmFsYXNpYQpAQCAtMCwwICsxLDE1NjAgQEAKKyMgPHByZT4KKyMgQCgjKWF1c3RyYWxhc2lhCTguMTUKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisKKyMgVGhpcyBmaWxlIGFsc28gaW5jbHVkZXMgUGFjaWZpYyBpc2xhbmRzLgorCisjIE5vdGVzIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXVzdHJhbGlhCisKKyMgUGxlYXNlIHNlZSB0aGUgbm90ZXMgYmVsb3cgZm9yIHRoZSBjb250cm92ZXJzeSBhYm91dCAiRVNUIiB2ZXJzdXMgIkFFU1QiIGV0Yy4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQXVzCTE5MTcJb25seQktCUphbgkgMQkwOjAxCTE6MDAJLQorUnVsZQlBdXMJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMAktCitSdWxlCUF1cwkxOTQyCW9ubHkJLQlKYW4JIDEJMjowMAkxOjAwCS0KK1J1bGUJQXVzCTE5NDIJb25seQktCU1hcgkyOQkyOjAwCTAJLQorUnVsZQlBdXMJMTk0Mglvbmx5CS0JU2VwCTI3CTI6MDAJMTowMAktCitSdWxlCUF1cwkxOTQzCTE5NDQJLQlNYXIJbGFzdFN1bgkyOjAwCTAJLQorUnVsZQlBdXMJMTk0Mwlvbmx5CS0JT2N0CSAzCTI6MDAJMTowMAktCisjIEdvIHdpdGggV2hpdG1hbiBhbmQgdGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgU3RhbmRhcmRzIENvbW1pc3Npb24sIHdoaWNoCisjIHNheXMgVyBBdXN0cmFsaWEgZGlkbid0IHVzZSBEU1QgaW4gMTk0My8xOTQ0LiAgSWdub3JlIFdoaXRtYW4ncyBjbGFpbSB0aGF0CisjIDE5NDQvMTk0NSB3YXMganVzdCBsaWtlIDE5NDMvMTk0NC4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorIyBOb3J0aGVybiBUZXJyaXRvcnkKK1pvbmUgQXVzdHJhbGlhL0RhcndpbgkgODo0MzoyMCAtCUxNVAkxODk1IEZlYgorCQkJIDk6MDAJLQlDU1QJMTg5OSBNYXkKKwkJCSA5OjMwCUF1cwlDU1QKKyMgV2VzdGVybiBBdXN0cmFsaWEKKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUFXCTE5NzQJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQorUnVsZQlBVwkxOTgzCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1J1bGUJQVcJMTk4NAlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVcJMTk5MQlvbmx5CS0JTm92CTE3CTI6MDBzCTE6MDAJLQorUnVsZQlBVwkxOTkyCW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQorUnVsZQlBVwkyMDA2CW9ubHkJLQlEZWMJIDMJMjowMHMJMTowMAktCitSdWxlCUFXCTIwMDcJMjAwOQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlBVwkyMDA3CTIwMDgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1pvbmUgQXVzdHJhbGlhL1BlcnRoCSA3OjQzOjI0IC0JTE1UCTE4OTUgRGVjCisJCQkgODowMAlBdXMJV1NUCTE5NDMgSnVsCisJCQkgODowMAlBVwlXU1QKK1pvbmUgQXVzdHJhbGlhL0V1Y2xhCSA4OjM1OjI4IC0JTE1UCTE4OTUgRGVjCisJCQkgODo0NQlBdXMJQ1dTVAkxOTQzIEp1bAorCQkJIDg6NDUJQVcJQ1dTVAorCisjIFF1ZWVuc2xhbmQKKyMKKyMgRnJvbSBBbGV4IExpdmluZ3N0b24gKDE5OTYtMTEtMDEpOgorIyBJIGhhdmUgaGVhcmQgb3IgcmVhZCBtb3JlIHRoYW4gb25jZSB0aGF0IHNvbWUgcmVzb3J0IGlzbGFuZHMgb2ZmIHRoZSBjb2FzdAorIyBvZiBRdWVlbnNsYW5kIGNob3NlIHRvIGtlZXAgb2JzZXJ2aW5nIGRheWxpZ2h0LXNhdmluZyB0aW1lIGV2ZW4gYWZ0ZXIKKyMgUXVlZW5zbGFuZCBjZWFzZWQgdG8uCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMTEtMjIpOgorIyBJQVRBIFNTSU0gKDE5OTMtMDIvMTk5NC0wOSkgc2F5IHRoYXQgdGhlIEhvbGlkYXkgSXNsYW5kcyAoSGF5bWFuLCBMaW5kZW1hbiwKKyMgSGFtaWx0b24pIG9ic2VydmVkIERTVCBmb3IgdHdvIHllYXJzIGFmdGVyIHRoZSByZXN0IG9mIFF1ZWVuc2xhbmQgc3RvcHBlZC4KKyMgSGFtaWx0b24gaXMgdGhlIGxhcmdlc3QsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgSGFtaWx0b24gaW4gVmljdG9yaWEsCisjIHNvIHVzZSBMaW5kZW1hbi4KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUFRCTE5NzEJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBUQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KK1J1bGUJQVEJMTk4OQkxOTkxCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFRCTE5OTAJMTk5MgktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUhvbGlkYXkJMTk5MgkxOTkzCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUhvbGlkYXkJMTk5MwkxOTk0CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1pvbmUgQXVzdHJhbGlhL0JyaXNiYW5lCTEwOjEyOjA4IC0JTE1UCTE4OTUKKwkJCTEwOjAwCUF1cwlFU1QJMTk3MQorCQkJMTA6MDAJQVEJRVNUCitab25lIEF1c3RyYWxpYS9MaW5kZW1hbiAgOTo1NTo1NiAtCUxNVAkxODk1CisJCQkxMDowMAlBdXMJRVNUCTE5NzEKKwkJCTEwOjAwCUFRCUVTVAkxOTkyIEp1bAorCQkJMTA6MDAJSG9saWRheQlFU1QKKworIyBTb3V0aCBBdXN0cmFsaWEKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUFTCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBUwkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMHMJMTowMAktCitSdWxlCUFTCTE5ODcJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBUwkxOTcyCW9ubHkJLQlGZWIJMjcJMjowMHMJMAktCitSdWxlCUFTCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFTCTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQorUnVsZQlBUwkxOTkwCW9ubHkJLQlNYXIJU3VuPj0xOAkyOjAwcwkwCS0KK1J1bGUJQVMJMTk5MQlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVMJMTk5Mglvbmx5CS0JTWFyCVN1bj49MTgJMjowMHMJMAktCitSdWxlCUFTCTE5OTMJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFTCTE5OTQJb25seQktCU1hcglTdW4+PTE4CTI6MDBzCTAJLQorUnVsZQlBUwkxOTk1CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KK1J1bGUJQVMJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVMJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCitSdWxlCUFTCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVMJMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBdXN0cmFsaWEvQWRlbGFpZGUJOToxNDoyMCAtCUxNVAkxODk1IEZlYgorCQkJOTowMAktCUNTVAkxODk5IE1heQorCQkJOTozMAlBdXMJQ1NUCTE5NzEKKwkJCTk6MzAJQVMJQ1NUCisKKyMgVGFzbWFuaWEKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6CisjIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sPgorIyBzYXlzIEtpbmcgSXNsYW5kIGRpZG4ndCBvYnNlcnZlIERTVCBmcm9tIFdXSUkgdW50aWwgbGF0ZSAxOTcxLgorIworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQVQJMTk2Nwlvbmx5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KK1J1bGUJQVQJMTk2OAlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCitSdWxlCUFUCTE5NjgJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBVAkxOTY5CTE5NzEJLQlNYXIJU3VuPj04CTI6MDBzCTAJLQorUnVsZQlBVAkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KK1J1bGUJQVQJMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVQJMTk4MgkxOTgzCS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCitSdWxlCUFUCTE5ODQJMTk4NgktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFUCTE5ODYJb25seQktCU9jdAlTdW4+PTE1CTI6MDBzCTE6MDAJLQorUnVsZQlBVAkxOTg3CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KK1J1bGUJQVQJMTk4Nwlvbmx5CS0JT2N0CVN1bj49MjIJMjowMHMJMTowMAktCitSdWxlCUFUCTE5ODgJMTk5MAktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQorUnVsZQlBVAkxOTkxCTE5OTkJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQorUnVsZQlBVAkxOTkxCTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KK1J1bGUJQVQJMjAwMAlvbmx5CS0JQXVnCWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFUCTIwMDEJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KK1J1bGUJQVQJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQVQJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCitSdWxlCUFUCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXVzdHJhbGlhL0hvYmFydAk5OjQ5OjE2CS0JTE1UCTE4OTUgU2VwCisJCQkxMDowMAktCUVTVAkxOTE2IE9jdCAxIDI6MDAKKwkJCTEwOjAwCTE6MDAJRVNUCTE5MTcgRmViCisJCQkxMDowMAlBdXMJRVNUCTE5NjcKKwkJCTEwOjAwCUFUCUVTVAorWm9uZSBBdXN0cmFsaWEvQ3VycmllCTk6MzU6MjgJLQlMTVQJMTg5NSBTZXAKKwkJCTEwOjAwCS0JRVNUCTE5MTYgT2N0IDEgMjowMAorCQkJMTA6MDAJMTowMAlFU1QJMTkxNyBGZWIKKwkJCTEwOjAwCUF1cwlFU1QJMTk3MSBKdWwKKwkJCTEwOjAwCUFUCUVTVAorCisjIFZpY3RvcmlhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlBVgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1J1bGUJQVYJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCitSdWxlCUFWCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFWCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQorUnVsZQlBVgkxOTg2CTE5ODcJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCS0KK1J1bGUJQVYJMTk4OAkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFWCTE5OTEJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFWCTE5OTUJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlBVgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1J1bGUJQVYJMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFWCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFWCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlBVgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFWCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXVzdHJhbGlhL01lbGJvdXJuZSA5OjM5OjUyIC0JTE1UCTE4OTUgRmViCisJCQkxMDowMAlBdXMJRVNUCTE5NzEKKwkJCTEwOjAwCUFWCUVTVAorCisjIE5ldyBTb3V0aCBXYWxlcworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQU4JMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFOCTE5NzIJb25seQktCUZlYgkyNwkyOjAwcwkwCS0KK1J1bGUJQU4JMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQU4JMTk4Mglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQU4JMTk4MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQU4JMTk4NgkxOTg5CS0JTWFyCVN1bj49MTUJMjowMHMJMAktCitSdWxlCUFOCTE5ODYJb25seQktCU9jdAkxOQkyOjAwcwkxOjAwCS0KK1J1bGUJQU4JMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFOCTE5OTAJMTk5NQktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFOCTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlBTgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1J1bGUJQU4JMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFOCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFOCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlBTgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFOCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXVzdHJhbGlhL1N5ZG5leQkxMDowNDo1MiAtCUxNVAkxODk1IEZlYgorCQkJMTA6MDAJQXVzCUVTVAkxOTcxCisJCQkxMDowMAlBTglFU1QKK1pvbmUgQXVzdHJhbGlhL0Jyb2tlbl9IaWxsIDk6MjU6NDggLQlMTVQJMTg5NSBGZWIKKwkJCTEwOjAwCS0JRVNUCTE4OTYgQXVnIDIzCisJCQk5OjAwCS0JQ1NUCTE4OTkgTWF5CisJCQk5OjMwCUF1cwlDU1QJMTk3MQorCQkJOTozMAlBTglDU1QJMjAwMAorCQkJOTozMAlBUwlDU1QKKworIyBMb3JkIEhvd2UgSXNsYW5kCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlMSAkxOTgxCTE5ODQJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJLQorUnVsZQlMSAkxOTgyCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCitSdWxlCUxICTE5ODUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCitSdWxlCUxICTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDAJMAktCitSdWxlCUxICTE5ODYJb25seQktCU9jdAkxOQkyOjAwCTA6MzAJLQorUnVsZQlMSAkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQorUnVsZQlMSAkxOTkwCTE5OTUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCitSdWxlCUxICTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDAJMAktCitSdWxlCUxICTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDAJMDozMAktCitSdWxlCUxICTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCitSdWxlCUxICTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMAkwCS0KK1J1bGUJTEgJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KK1J1bGUJTEgJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAktCitSdWxlCUxICTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwCTA6MzAJLQorWm9uZSBBdXN0cmFsaWEvTG9yZF9Ib3dlIDEwOjM2OjIwIC0JTE1UCTE4OTUgRmViCisJCQkxMDowMAktCUVTVAkxOTgxIE1hcgorCQkJMTA6MzAJTEgJTEhTVAorCisjIEF1c3RyYWxpYW4gbWlzY2VsbGFueQorIworIyBBc2htb3JlIElzLCBDYXJ0aWVyCisjIG5vIGluZGlnZW5vdXMgaW5oYWJpdGFudHM7IG9ubHkgc2Vhc29uYWwgY2FyZXRha2VycworIyBubyB0aW1lcyBhcmUgc2V0CisjCisjIENvcmFsIFNlYSBJcworIyBubyBpbmRpZ2Vub3VzIGluaGFiaXRhbnRzOyBvbmx5IG1ldGVvcm9sb2dpc3RzCisjIG5vIHRpbWVzIGFyZSBzZXQKKyMKKyMgTWFjcXVhcmllCisjIHBlcm1hbmVudCBvY2N1cGF0aW9uIChzY2llbnRpZmljIHN0YXRpb24pIHNpbmNlIDE5NDg7CisjIHNlYWxpbmcgYW5kIHBlbmd1aW4gb2lsIHN0YXRpb24gb3BlcmF0ZWQgMTg4OC8xOTE3CisjIGxpa2UgQXVzdHJhbGlhL0hvYmFydAorCisjIENocmlzdG1hcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBJbmRpYW4vQ2hyaXN0bWFzCTc6MDI6NTIgLQlMTVQJMTg5NSBGZWIKKwkJCTc6MDAJLQlDWFQJIyBDaHJpc3RtYXMgSXNsYW5kIFRpbWUKKworIyBDb29rIElzCisjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQ29vawkxOTc4CW9ubHkJLQlOb3YJMTIJMDowMAkwOjMwCUhTCitSdWxlCUNvb2sJMTk3OQkxOTkxCS0JTWFyCVN1bj49MQkwOjAwCTAJLQorUnVsZQlDb29rCTE5NzkJMTk5MAktCU9jdAlsYXN0U3VuCTA6MDAJMDozMAlIUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBQYWNpZmljL1Jhcm90b25nYQktMTA6Mzk6MDQgLQlMTVQJMTkwMQkJIyBBdmFydWEKKwkJCS0xMDozMAktCUNLVAkxOTc4IE5vdiAxMgkjIENvb2sgSXMgVGltZQorCQkJLTEwOjAwCUNvb2sJQ0slc1QKKworIyBDb2NvcworIyBUaGVzZSBpc2xhbmRzIHdlcmUgcnVsZWQgYnkgdGhlIFJvc3MgZmFtaWx5IGZyb20gYWJvdXQgMTgzMCB0byAxOTc4LgorIyBXZSBkb24ndCBrbm93IHdoZW4gc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZDsgZm9yIG5vdywgd2UgZ3Vlc3MgMTkwMC4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJSW5kaWFuL0NvY29zCTY6Mjc6NDAJLQlMTVQJMTkwMAorCQkJNjozMAktCUNDVAkjIENvY29zIElzbGFuZHMgVGltZQorCisjIEZpamkKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMTEtMTApOgorIyBBY2NvcmRpbmcgdG8gRmlqaSBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24sICBGaWppIHBsYW5zIHRvIHJlLWludHJvZHVjZSBEU1QKKyMgZnJvbSBOb3ZlbWJlciAyOXRoIDIwMDkgIHRvIEFwcmlsIDI1dGggMjAxMC4KKyMKKyMgIkRheWxpZ2h0IHNhdmluZ3MgdG8gY29tbWVuY2UgdGhpcyBtb250aCIKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWRpb2ZpamkuY29tLmZqL2Z1bGxzdG9yeS5waHA/aWQ9MjM3MTkiPgorIyBodHRwOi8vd3d3LnJhZGlvZmlqaS5jb20uZmovZnVsbHN0b3J5LnBocD9pZD0yMzcxOQorIyA8L2E+CisjIG9yCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZmlqaTAxLmh0bWwiPgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2ZpamkwMS5odG1sCisjIDwvYT4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMS0xMCk6CisjIFRoZSBGaWppIEdvdmVybm1lbnQgaGFzIHBvc3RlZCBzb21lIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgYXBwcm92ZWQKKyMgYW1lbmRtZW50czoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5maWppLmdvdi5mai9wdWJsaXNoL3BhZ2VfMTYxOTguc2h0bWwiPgorIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL3B1Ymxpc2gvcGFnZV8xNjE5OC5zaHRtbAorIyA8L2E+CisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlGaWppCTE5OTgJMTk5OQktCU5vdglTdW4+PTEJMjowMAkxOjAwCVMKK1J1bGUJRmlqaQkxOTk5CTIwMDAJLQlGZWIJbGFzdFN1bgkzOjAwCTAJLQorUnVsZQlGaWppCTIwMDkJb25seQktCU5vdgkyOQkyOjAwCTE6MDAJUworUnVsZQlGaWppCTIwMTAJb25seQktCUFwcgkyNQkzOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlQYWNpZmljL0ZpamkJMTE6NTM6NDAgLQlMTVQJMTkxNSBPY3QgMjYJIyBTdXZhCisJCQkxMjowMAlGaWppCUZKJXNUCSMgRmlqaSBUaW1lCisKKyMgRnJlbmNoIFBvbHluZXNpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlQYWNpZmljL0dhbWJpZXIJIC04OjU5OjQ4IC0JTE1UCTE5MTIgT2N0CSMgUmlraXRlYQorCQkJIC05OjAwCS0JR0FNVAkjIEdhbWJpZXIgVGltZQorWm9uZQlQYWNpZmljL01hcnF1ZXNhcyAtOToxODowMCAtCUxNVAkxOTEyIE9jdAorCQkJIC05OjMwCS0JTUFSVAkjIE1hcnF1ZXNhcyBUaW1lCitab25lCVBhY2lmaWMvVGFoaXRpCSAtOTo1ODoxNiAtCUxNVAkxOTEyIE9jdAkjIFBhcGVldGUKKwkJCS0xMDowMAktCVRBSFQJIyBUYWhpdGkgVGltZQorIyBDbGlwcGVydG9uIChuZWFyIE5vcnRoIEFtZXJpY2EpIGlzIGFkbWluaXN0ZXJlZCBmcm9tIEZyZW5jaCBQb2x5bmVzaWE7CisjIGl0IGlzIHVuaW5oYWJpdGVkLgorCisjIEd1YW0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJUGFjaWZpYy9HdWFtCS0xNDoyMTowMCAtCUxNVAkxODQ0IERlYyAzMQorCQkJIDk6Mzk6MDAgLQlMTVQJMTkwMQkJIyBBZ2FuYQorCQkJMTA6MDAJLQlHU1QJMjAwMCBEZWMgMjMJIyBHdWFtCisJCQkxMDowMAktCUNoU1QJIyBDaGFtb3JybyBTdGFuZGFyZCBUaW1lCisKKyMgS2lyaWJhdGkKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9UYXJhd2EJIDExOjMyOjA0IC0JTE1UCTE5MDEJCSMgQmFpcmlraQorCQkJIDEyOjAwCS0JR0lMVAkJICMgR2lsYmVydCBJcyBUaW1lCitab25lIFBhY2lmaWMvRW5kZXJidXJ5CS0xMToyNDoyMCAtCUxNVAkxOTAxCisJCQktMTI6MDAJLQlQSE9UCTE5NzkgT2N0ICMgUGhvZW5peCBJcyBUaW1lCisJCQktMTE6MDAJLQlQSE9UCTE5OTUKKwkJCSAxMzowMAktCVBIT1QKK1pvbmUgUGFjaWZpYy9LaXJpdGltYXRpCS0xMDoyOToyMCAtCUxNVAkxOTAxCisJCQktMTA6NDAJLQlMSU5UCTE5NzkgT2N0ICMgTGluZSBJcyBUaW1lCisJCQktMTA6MDAJLQlMSU5UCTE5OTUKKwkJCSAxNDowMAktCUxJTlQKKworIyBOIE1hcmlhbmEgSXMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9TYWlwYW4JLTE0OjE3OjAwIC0JTE1UCTE4NDQgRGVjIDMxCisJCQkgOTo0MzowMCAtCUxNVAkxOTAxCisJCQkgOTowMAktCU1QVAkxOTY5IE9jdCAjIE4gTWFyaWFuYSBJcyBUaW1lCisJCQkxMDowMAktCU1QVAkyMDAwIERlYyAyMworCQkJMTA6MDAJLQlDaFNUCSMgQ2hhbW9ycm8gU3RhbmRhcmQgVGltZQorCisjIE1hcnNoYWxsIElzCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIFBhY2lmaWMvTWFqdXJvCTExOjI0OjQ4IC0JTE1UCTE5MDEKKwkJCTExOjAwCS0JTUhUCTE5NjkgT2N0ICMgTWFyc2hhbGwgSXNsYW5kcyBUaW1lCisJCQkxMjowMAktCU1IVAorWm9uZSBQYWNpZmljL0t3YWphbGVpbgkxMTowOToyMCAtCUxNVAkxOTAxCisJCQkxMTowMAktCU1IVAkxOTY5IE9jdAorCQkJLTEyOjAwCS0JS1dBVAkxOTkzIEF1ZyAyMAkjIEt3YWphbGVpbiBUaW1lCisJCQkxMjowMAktCU1IVAorCisjIE1pY3JvbmVzaWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9UcnVrCTEwOjA3OjA4IC0JTE1UCTE5MDEKKwkJCTEwOjAwCS0JVFJVVAkJCSMgVHJ1ayBUaW1lCitab25lIFBhY2lmaWMvUG9uYXBlCTEwOjMyOjUyIC0JTE1UCTE5MDEJCSMgS29sb25pYQorCQkJMTE6MDAJLQlQT05UCQkJIyBQb25hcGUgVGltZQorWm9uZSBQYWNpZmljL0tvc3JhZQkxMDo1MTo1NiAtCUxNVAkxOTAxCisJCQkxMTowMAktCUtPU1QJMTk2OSBPY3QJIyBLb3NyYWUgVGltZQorCQkJMTI6MDAJLQlLT1NUCTE5OTkKKwkJCTExOjAwCS0JS09TVAorCisjIE5hdXJ1CisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvTmF1cnUJMTE6MDc6NDAgLQlMTVQJMTkyMSBKYW4gMTUJIyBVYW9iZQorCQkJMTE6MzAJLQlOUlQJMTk0MiBNYXIgMTUJIyBOYXVydSBUaW1lCisJCQk5OjAwCS0JSlNUCTE5NDQgQXVnIDE1CisJCQkxMTozMAktCU5SVAkxOTc5IE1heQorCQkJMTI6MDAJLQlOUlQKKworIyBOZXcgQ2FsZWRvbmlhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlOQwkxOTc3CTE5NzgJLQlEZWMJU3VuPj0xCTA6MDAJMTowMAlTCitSdWxlCU5DCTE5NzgJMTk3OQktCUZlYgkyNwkwOjAwCTAJLQorUnVsZQlOQwkxOTk2CW9ubHkJLQlEZWMJIDEJMjowMHMJMTowMAlTCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIGZvbGxvd2luZyB3YXMgYXQgMjowMDsgZ28gd2l0aCBJQVRBLgorUnVsZQlOQwkxOTk3CW9ubHkJLQlNYXIJIDIJMjowMHMJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvTm91bWVhCTExOjA1OjQ4IC0JTE1UCTE5MTIgSmFuIDEzCisJCQkxMTowMAlOQwlOQyVzVAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBOZXcgWmVhbGFuZAorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlOWgkxOTI3CW9ubHkJLQlOb3YJIDYJMjowMAkxOjAwCVMKK1J1bGUJTloJMTkyOAlvbmx5CS0JTWFyCSA0CTI6MDAJMAlNCitSdWxlCU5aCTE5MjgJMTkzMwktCU9jdAlTdW4+PTgJMjowMAkwOjMwCVMKK1J1bGUJTloJMTkyOQkxOTMzCS0JTWFyCVN1bj49MTUJMjowMAkwCU0KK1J1bGUJTloJMTkzNAkxOTQwCS0JQXByCWxhc3RTdW4JMjowMAkwCU0KK1J1bGUJTloJMTkzNAkxOTQwCS0JU2VwCWxhc3RTdW4JMjowMAkwOjMwCVMKK1J1bGUJTloJMTk0Nglvbmx5CS0JSmFuCSAxCTA6MDAJMAlTCisjIFNpbmNlIDE5NTcgQ2hhdGhhbSBoYXMgYmVlbiA0NSBtaW51dGVzIGFoZWFkIG9mIE5aLCBidXQgdGhlcmUncyBubworIyBjb252ZW5pZW50IG5vdGF0aW9uIGZvciB0aGlzIHNvIHdlIG11c3QgZHVwbGljYXRlIHRoZSBSdWxlIGxpbmVzLgorUnVsZQlOWgkxOTc0CW9ubHkJLQlOb3YJU3VuPj0xCTI6MDBzCTE6MDAJRAorUnVsZQlDaGF0aGFtCTE5NzQJb25seQktCU5vdglTdW4+PTEJMjo0NXMJMTowMAlECitSdWxlCU5aCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlDaGF0aGFtCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6NDVzCTAJUworUnVsZQlOWgkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQ2hhdGhhbQkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKK1J1bGUJTloJMTk3NgkxOTg5CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQ2hhdGhhbQkxOTc2CTE5ODkJLQlNYXIJU3VuPj0xCTI6NDVzCTAJUworUnVsZQlOWgkxOTg5CW9ubHkJLQlPY3QJU3VuPj04CTI6MDBzCTE6MDAJRAorUnVsZQlDaGF0aGFtCTE5ODkJb25seQktCU9jdAlTdW4+PTgJMjo0NXMJMTowMAlECitSdWxlCU5aCTE5OTAJMjAwNgktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECitSdWxlCUNoYXRoYW0JMTk5MAkyMDA2CS0JT2N0CVN1bj49MQkyOjQ1cwkxOjAwCUQKK1J1bGUJTloJMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCitSdWxlCUNoYXRoYW0JMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjo0NXMJMAlTCitSdWxlCU5aCTIwMDcJbWF4CS0JU2VwCWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUNoYXRoYW0JMjAwNwltYXgJLQlTZXAJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKK1J1bGUJTloJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlDaGF0aGFtCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjQ1cwkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9BdWNrbGFuZAkxMTozOTowNCAtCUxNVAkxODY4IE5vdiAgMgorCQkJMTE6MzAJTloJTlolc1QJMTk0NiBKYW4gIDEKKwkJCTEyOjAwCU5aCU5aJXNUCitab25lIFBhY2lmaWMvQ2hhdGhhbQkxMjoxMzo0OCAtCUxNVAkxOTU3IEphbiAgMQorCQkJMTI6NDUJQ2hhdGhhbQlDSEElc1QKKworCisjIEF1Y2tsYW5kIElzCisjIHVuaW5oYWJpdGVkOyBNYW9yaSBhbmQgTW9yaW9yaSwgY29sb25pYWwgc2V0dGxlcnMsIHBhc3RvcmFsaXN0cywgc2VhbGVycywKKyMgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKKworIyBDYW1wYmVsbCBJCisjIG1pbm9yIHdoYWxpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgMTkwOS8xOTE0CisjIHNjaWVudGlmaWMgc3RhdGlvbiBvcGVyYXRlZCAxOTQxLzE5OTU7CisjIHByZXZpb3VzbHkgd2hhbGVycywgc2VhbGVycywgcGFzdG9yYWxpc3RzLCBhbmQgc2NpZW50aWZpYyBwZXJzb25uZWwgd2ludGVyZWQKKyMgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9BdWNrbGFuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBOaXVlCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvTml1ZQktMTE6MTk6NDAgLQlMTVQJMTkwMQkJIyBBbG9maQorCQkJLTExOjIwCS0JTlVUCTE5NTEJIyBOaXVlIFRpbWUKKwkJCS0xMTozMAktCU5VVAkxOTc4IE9jdCAxCisJCQktMTE6MDAJLQlOVVQKKworIyBOb3Jmb2xrCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvTm9yZm9sawkxMToxMTo1MiAtCUxNVAkxOTAxCQkjIEtpbmdzdG9uCisJCQkxMToxMgktCU5NVAkxOTUxCSMgTm9yZm9sayBNZWFuIFRpbWUKKwkJCTExOjMwCS0JTkZUCQkjIE5vcmZvbGsgVGltZQorCisjIFBhbGF1IChCZWxhdSkKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9QYWxhdQk4OjU3OjU2IC0JTE1UCTE5MDEJCSMgS29yb3IKKwkJCTk6MDAJLQlQV1QJIyBQYWxhdSBUaW1lCisKKyMgUGFwdWEgTmV3IEd1aW5lYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBQYWNpZmljL1BvcnRfTW9yZXNieSA5OjQ4OjQwIC0JTE1UCTE4ODAKKwkJCTk6NDg6MzIJLQlQTU1UCTE4OTUJIyBQb3J0IE1vcmVzYnkgTWVhbiBUaW1lCisJCQkxMDowMAktCVBHVAkJIyBQYXB1YSBOZXcgR3VpbmVhIFRpbWUKKworIyBQaXRjYWlybgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBQYWNpZmljL1BpdGNhaXJuCS04OjQwOjIwIC0JTE1UCTE5MDEJCSMgQWRhbXN0b3duCisJCQktODozMAktCVBOVAkxOTk4IEFwciAyNyAwMDowMAorCQkJLTg6MDAJLQlQU1QJIyBQaXRjYWlybiBTdGFuZGFyZCBUaW1lCisKKyMgQW1lcmljYW4gU2Ftb2EKK1pvbmUgUGFjaWZpYy9QYWdvX1BhZ28JIDEyOjM3OjEyIC0JTE1UCTE4NzkgSnVsICA1CisJCQktMTE6MjI6NDggLQlMTVQJMTkxMQorCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKKwkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgkjIE49Tm9tZQorCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwCSMgQj1CZXJpbmcKKwkJCS0xMTowMAktCVNTVAkJCSMgUz1TYW1vYQorCisjIFNhbW9hCisKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDgtMTItMDYpOgorIyBUaGUgU2Ftb2EgZ292ZXJubWVudCAoV2VzdGVybiBTYW1vYSkgbWF5IGltcGxlbWVudCBEU1Qgb24gdGhlIGZpcnN0IFN1bmRheSBvZiAKKyMgT2N0b2JlciAyMDA5IChPY3RvYmVyIDQsIDIwMDkpIHVudGlsIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCAyMDEwIChNYXJjaCAyOCwgCisjIDIwMTApLiAKKyMgCisjICJTZWxlY3RlZCBDb21taXR0ZWUgcmVwb3J0cyB0byBDYWJpbmV0IG9uIERheWxpZ2h0IFNhdmluZyBUaW1lIiwKKyMgR292ZXJubWVudCBvZiBTYW1vYToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3Z0LndzL3ByX2FydGljbGUuY2ZtP3ByX2lkPTU2MCI+CisjIGh0dHA6Ly93d3cuZ292dC53cy9wcl9hcnRpY2xlLmNmbT9wcl9pZD01NjAKKyMgPC9hPgorIyBvcgorIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3NhbW9hMDEuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3Nfc2Ftb2EwMS5odG1sCisjIDwvYT4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wOC0yNyk6CisjIFNhbW9hJ3MgcGFybGlhbWVudCBwYXNzZWQgdGhlIERheWxpZ2h0IFNhdmluZyBCaWxsIDIwMDksIGFuZCB3aWxsIHN0YXJ0IAorIyBkYXlsaWdodCBzYXZpbmcgdGltZSBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE9jdG9iZXIgMjAwOSBhbmQgZW5kIG9uIHRoZSAKKyMgbGFzdCBTdW5kYXkgb2YgTWFyY2ggMjAxMC4gV2UgaG9wZSB0aGF0IHRoZSBmdWxsIHRleHQgd2lsbCBiZSBwdWJsaXNoZWQgCisjIHNvb24sIGJ1dCB3ZSBiZWxpZXZlIHRoYXQgdGhlIGJpbGwgaXMgb25seSB2YWxpZCBmb3IgMjAwOS0yMDEwLiBTYW1vYSdzIAorIyBEYXlsaWdodCBTYXZpbmcgQWN0IDIwMDkgd2lsbCBiZSBlbmZvcmNlZCBhcyBzb29uIGFzIHRoZSBIZWFkIG9mIFN0YXRlIAorIyBleGVjdXRlcyBhIHByb2NsYW1hdGlvbiBwdWJsaWNpemluZyB0aGlzIEFjdC4KKyMKKyMgU29tZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGhlcmUsIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBvbmNlIHdlIGhhdmUgCisjIG1vcmUgZGV0YWlsczoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3NhbW9hLWRzdC1wbGFuLTIwMDkuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zYW1vYS1kc3QtcGxhbi0yMDA5Lmh0bWwKKyMgPC9hPgorCisjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTEwLTAzKToKKyMgRmlyc3QsIG15IGRlZXBlc3QgY29uZG9sZW5jZXMgdG8gcGVvcGxlIG9mIFNhbW9hIGlzbGFuZHMgYW5kIGFsbCBmYW1pbGllcyBhbmQKKyMgbG92ZWQgb25lcyBhcm91bmQgdGhlIHdvcmxkIHdobyBsb3N0IHRoZWlyIGxpdmVzIGluIHRoZSBlYXJ0aHF1YWtlIGFuZCB0c3VuYW1pLgorIworIyBDb25zaWRlcmluZyB0aGUgcmVjZW50IGRldmFzdGF0aW9uIG9uIFNhbW9hIGJ5IGVhcnRocXVha2UgYW5kIHRzdW5hbWkgYW5kIHRoYXQKKyMgbWFueSBnb3Zlcm5tZW50IG9mZmljZXMvIG1pbmlzdGVycyBhcmUgY2xvc2VkLSBub3Qgc3VyZSBpZiAiRGF5bGlnaHQgU2F2aW5nCisjIEJpbGwgMjAwOSIgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBuZXh0IGZldyBkYXlzLSBvbiBPY3RvYmVyIDQsIDIwMDkuCisjCisjIEhlcmUgaXMgcmVwbHkgZnJvbSBDb25zdWxhdGUtR2VuZXJhbCBvZiBTYW1vYSBpbiBOZXcgWmVhbGFuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uc3VsIEdlbmVyYWwKKyMgY29uc3VsZ2VuZXJhbEBzYW1vYWNvbnN1bGF0ZS5vcmcubnoKKyMKKyMgVGFsb2ZhIEFsZXhhbmRlciwKKyMKKyMgVGhhbmsgeW91IGZvciB5b3VyIHN5bXBhdGh5IGZvciBvdXIgY291bnRyeSBidXQgYXQgdGhpcyB0aW1lIHdlIGhhdmUgbm90CisjIGJlZW4gaW5mb3JtZWQgYWJvdXQgdGhlIERheWxpZ2h0IFNhdmluZ3MgVGltZSBDaGFuZ2UuICBNb3N0IE1pbmlzdHJpZXMgaW4KKyMgQXBpYSBhcmUgY2xvc2VkIG9yIHJlbG9jYXRpbmcgZHVlIHRvIHdlYXRoZXIgY29uY2VybnMuCisjCisjIFdoZW4gd2UgZG8gZmluZCBvdXQgaWYgdGhleSBhcmUgc3RpbGwgcHJvY2VlZGluZyB3aXRoIHRoZSB0aW1lIGNoYW5nZSB3ZQorIyB3aWxsIGFkdmlzZSB5b3Ugc29vbmVzdC4KKyMKKyMgS2luZCBSZWdhcmRzLAorIyBMYW5hCisjIGZvcjogQ29uc3VsIEdlbmVyYWwKKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMC0wNSk6CisjIFdlIGhhdmUgY2FsbGVkIGEgaG90ZWwgaW4gU2Ftb2EgYW5kIGFza2VkIGFib3V0IGxvY2FsIHRpbWUgdGhlcmUgLSB0aGV5IAorIyBhcmUgc3RpbGwgb24gc3RhbmRhcmQgdGltZS4KKworWm9uZSBQYWNpZmljL0FwaWEJIDEyOjMzOjA0IC0JTE1UCTE4NzkgSnVsICA1CisJCQktMTE6MjY6NTYgLQlMTVQJMTkxMQorCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKKwkJCS0xMTowMAktCVdTVAkyMDA5IE9jdCA0CisJCQktMTE6MDAJMTowMAlXU0RUCTIwMTAgTWFyIDI4CisJCQktMTE6MDAJLQlXU1QKKworIyBTb2xvbW9uIElzCisjIGV4Y2x1ZGVzIEJvdWdhaW52aWxsZSwgZm9yIHdoaWNoIHNlZSBQYXB1YSBOZXcgR3VpbmVhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIFBhY2lmaWMvR3VhZGFsY2FuYWwgMTA6Mzk6NDggLQlMTVQJMTkxMiBPY3QJIyBIb25pYXJhCisJCQkxMTowMAktCVNCVAkjIFNvbG9tb24gSXMgVGltZQorCisjIFRva2VsYXUgSXMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJUGFjaWZpYy9GYWthb2ZvCS0xMToyNDo1NiAtCUxNVAkxOTAxCisJCQktMTA6MDAJLQlUS1QJIyBUb2tlbGF1IFRpbWUKKworIyBUb25nYQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJVG9uZ2EJMTk5OQlvbmx5CS0JT2N0CSA3CTI6MDBzCTE6MDAJUworUnVsZQlUb25nYQkyMDAwCW9ubHkJLQlNYXIJMTkJMjowMHMJMAktCitSdWxlCVRvbmdhCTIwMDAJMjAwMQktCU5vdglTdW4+PTEJMjowMAkxOjAwCVMKK1J1bGUJVG9uZ2EJMjAwMQkyMDAyCS0JSmFuCWxhc3RTdW4JMjowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9Ub25nYXRhcHUJMTI6MTk6MjAgLQlMTVQJMTkwMQorCQkJMTI6MjAJLQlUT1QJMTk0MSAjIFRvbmdhIFRpbWUKKwkJCTEzOjAwCS0JVE9UCTE5OTkKKwkJCTEzOjAwCVRvbmdhCVRPJXNUCisKKyMgVHV2YWx1CisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIFBhY2lmaWMvRnVuYWZ1dGkJMTE6NTY6NTIgLQlMTVQJMTkwMQorCQkJMTI6MDAJLQlUVlQJIyBUdXZhbHUgVGltZQorCisKKyMgVVMgbWlub3Igb3V0bHlpbmcgaXNsYW5kcworCisjIEhvd2xhbmQsIEJha2VyCisjIEhvd2xhbmQgd2FzIG1pbmVkIGZvciBndWFubyBieSBBbWVyaWNhbiBjb21wYW5pZXMgMTg1Ny0xODc4IGFuZCBCcml0aXNoCisjIDE4ODYtMTg5MTsgQmFrZXIgd2FzIHNpbWlsYXIgYnV0IGV4YWN0IGRhdGVzIGFyZSBub3Qga25vd24uCisjIEluaGFiaXRlZCBieSBjaXZpbGlhbnMgMTkzNS0xOTQyOyBVLlMuIG1pbGl0YXJ5IGJhc2VzIDE5NDMtMTk0NDsKKyMgdW5pbmhhYml0ZWQgdGhlcmVhZnRlci4KKyMgSG93bGFuZCBvYnNlcnZlZCBIYXdhaWkgU3RhbmRhcmQgVGltZSAoVVRDLTEwOjMwKSBpbiAxOTM3OworIyBzZWUgcGFnZSAyMDYgb2YgRWxnZW4gTS4gTG9uZyBhbmQgTWFyaWUgSy4gTG9uZywKKyMgQW1lbGlhIEVhcmhhcnQ6IHRoZSBNeXN0ZXJ5IFNvbHZlZCwgU2ltb24gJiBTY2h1c3RlciAoMjAwMCkuCisjIFNvIG1vc3QgbGlrZWx5IEhvd2xhbmQgYW5kIEJha2VyIG9ic2VydmVkIEhhd2FpaSBUaW1lIGZyb20gMTkzNQorIyB1bnRpbCB0aGV5IHdlcmUgYWJhbmRvbmVkIGFmdGVyIHRoZSB3YXIuCisKKyMgSmFydmlzCisjIE1pbmVkIGZvciBndWFubyBieSBBbWVyaWNhbiBjb21wYW5pZXMgMTg1Ny0xODc5IGFuZCBCcml0aXNoIDE4ODM/LTE4OTE/LgorIyBJbmhhYml0ZWQgYnkgY2l2aWxpYW5zIDE5MzUtMTk0MjsgSUdZIHNjaWVudGlmaWMgYmFzZSAxOTU3LTE5NTg7CisjIHVuaW5oYWJpdGVkIHRoZXJlYWZ0ZXIuCisjIG5vIGluZm9ybWF0aW9uOyB3YXMgcHJvYmFibHkgbGlrZSBQYWNpZmljL0tpcml0aW1hdGkKKworIyBKb2huc3RvbgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBQYWNpZmljL0pvaG5zdG9uCS0xMDowMAktCUhTVAorCisjIEtpbmdtYW4KKyMgdW5pbmhhYml0ZWQKKworIyBNaWR3YXkKKyMKKyMgRnJvbSBNYXJrIEJyYWRlciAoMjAwNS0wMS0yMyk6CisjIFtGYWxsYWNpZXMgYW5kIEZhbnRhc2llcyBvZiBBaXIgVHJhbnNwb3J0IEhpc3RvcnksIGJ5IFIuRS5HLiBEYXZpZXMsCisjIHB1Ymxpc2hlZCAxOTk0IGJ5IFBhbGFkd3IgUHJlc3MsIE1jTGVhbiwgVkEsIFVTQTsgSVNCTiAwLTk2MjY0ODMtNS0zXQorIyByZXByb2R1Y2VkIGEgUGFuIEFtZXJpY2FuIEFpcndheXMgdGltZWFibGVzIGZyb20gMTkzNiwgZm9yIHRoZWlyIHdlZWtseQorIyAiT3JpZW50IEV4cHJlc3MiIGZsaWdodHMgYmV0d2VlbiBTYW4gRnJhbmNpc2NvIGFuZCBNYW5pbGEsIGFuZCBjb25uZWN0aW5nCisjIGZsaWdodHMgdG8gQ2hpY2FnbyBhbmQgdGhlIFVTIEVhc3QgQ29hc3QuICBBcyBpdCB1c2VzIHNvbWUgdGltZSB6b25lCisjIGRlc2lnbmF0aW9ucyB0aGF0IEkndmUgbmV2ZXIgc2VlbiBiZWZvcmU6Li4uLgorIyBGcmkuIDY6MzBBIEx2LiBIT05PTE9MVSAoUGVhcmwgSGFyYm9yKSwgSC5JLiAgIEguTC5ULiBBci4gNTozMFAgU3VuLgorIyAgIiAgIDM6MDBQIEFyLiBNSURXQVkgSVNMQU5EIC4gLiAuIC4gLiAuIC4gLiAuIE0uTC5ULiBMdi4gNjowMEEgICIKKyMKK1pvbmUgUGFjaWZpYy9NaWR3YXkJLTExOjQ5OjI4IC0JTE1UCTE5MDEKKwkJCS0xMTowMAktCU5TVAkxOTU2IEp1biAgMworCQkJLTExOjAwCTE6MDAJTkRUCTE5NTYgU2VwICAyCisJCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIJIyBOPU5vbWUKKwkJCS0xMTowMAktCUJTVAkxOTgzIE5vdiAzMAkjIEI9QmVyaW5nCisJCQktMTE6MDAJLQlTU1QJCQkjIFM9U2Ftb2EKKworIyBQYWxteXJhCisjIHVuaW5oYWJpdGVkIHNpbmNlIFdvcmxkIFdhciBJSTsgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9LaXJpdGltYXRpCisKKyMgV2FrZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlQYWNpZmljL1dha2UJMTE6MDY6MjggLQlMTVQJMTkwMQorCQkJMTI6MDAJLQlXQUtUCSMgV2FrZSBUaW1lCisKKworIyBWYW51YXR1CisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlWYW51YXR1CTE5ODMJb25seQktCVNlcAkyNQkwOjAwCTE6MDAJUworUnVsZQlWYW51YXR1CTE5ODQJMTk5MQktCU1hcglTdW4+PTIzCTA6MDAJMAktCitSdWxlCVZhbnVhdHUJMTk4NAlvbmx5CS0JT2N0CTIzCTA6MDAJMTowMAlTCitSdWxlCVZhbnVhdHUJMTk4NQkxOTkxCS0JU2VwCVN1bj49MjMJMDowMAkxOjAwCVMKK1J1bGUJVmFudWF0dQkxOTkyCTE5OTMJLQlKYW4JU3VuPj0yMwkwOjAwCTAJLQorUnVsZQlWYW51YXR1CTE5OTIJb25seQktCU9jdAlTdW4+PTIzCTA6MDAJMTowMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvRWZhdGUJMTE6MTM6MTYgLQlMTVQJMTkxMiBKYW4gMTMJCSMgVmlsYQorCQkJMTE6MDAJVmFudWF0dQlWVSVzVAkjIFZhbnVhdHUgVGltZQorCisjIFdhbGxpcyBhbmQgRnV0dW5hCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVBhY2lmaWMvV2FsbGlzCTEyOjE1OjIwIC0JTE1UCTE5MDEKKwkJCTEyOjAwCS0JV0ZUCSMgV2FsbGlzICYgRnV0dW5hIFRpbWUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5PVEVTCisKKyMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KKyMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKKyMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAorIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgorIworIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCisjIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydAorIyBBc3NvY2lhdGlvbidzIFN0YW5kYXJkIFNjaGVkdWxlcyBJbmZvcm1hdGlvbiBNYW51YWwgKElBVEEgU1NJTSksCisjIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCisjIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgorIworIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKKyMgZW50cmllcyB0aHJvdWdoIDE5OTAsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgorIworIyBBbm90aGVyIHNvdXJjZSBvY2Nhc2lvbmFsbHkgdXNlZCBpcyBFZHdhcmQgVy4gV2hpdG1hbiwgV29ybGQgVGltZSBEaWZmZXJlbmNlcywKKyMgV2hpdG1hbiBQdWJsaXNoaW5nIENvLCAyIE5pYWdhcmEgQXYsIEVhbGluZywgTG9uZG9uICh1bmRhdGVkKSwgd2hpY2gKKyMgSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgorIworIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKKyMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCisjCisjIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkIGAqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOworIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgorIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKKyMJCXN0ZCBkc3QKKyMJCUxNVAlMb2NhbCBNZWFuIFRpbWUKKyMJICA4OjAwCVdTVCBXU1QJV2VzdGVybiBBdXN0cmFsaWEKKyMJICA4OjQ1CUNXU1QgQ1dTVCBDZW50cmFsIFdlc3Rlcm4gQXVzdHJhbGlhKgorIwkgIDk6MDAJSlNUCUphcGFuCisjCSAgOTozMAlDU1QgQ1NUCUNlbnRyYWwgQXVzdHJhbGlhCisjCSAxMDowMAlFU1QgRVNUCUVhc3Rlcm4gQXVzdHJhbGlhCisjCSAxMDowMAlDaFNUCUNoYW1vcnJvCisjCSAxMDozMAlMSFNUIExIU1QgTG9yZCBIb3dlKgorIwkgMTE6MzAJTlpNVCBOWlNUIE5ldyBaZWFsYW5kIHRocm91Z2ggMTk0NQorIwkgMTI6MDAJTlpTVCBOWkRUIE5ldyBaZWFsYW5kIDE5NDYtcHJlc2VudAorIwkgMTI6NDUJQ0hBU1QgQ0hBRFQgQ2hhdGhhbSoKKyMJLTExOjAwCVNTVAlTYW1vYQorIwktMTA6MDAJSFNUCUhhd2FpaQorIwktIDg6MDAJUFNUCVBpdGNhaXJuKgorIworIyBTZWUgdGhlIGBub3J0aGFtZXJpY2EnIGZpbGUgZm9yIEhhd2FpaS4KKyMgU2VlIHRoZSBgc291dGhhbWVyaWNhJyBmaWxlIGZvciBFYXN0ZXIgSSBhbmQgdGhlIEdhbGFwYWdvcyBJcy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF1c3RyYWxpYQorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTItMDgpOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sIj4KKyMgSW1wbGVtZW50YXRpb24gRGF0ZXMgb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2l0aGluIEF1c3RyYWxpYQorIyA8L2E+IHN1bW1hcml6ZXMgZGF5bGlnaHQgc2F2aW5nIGlzc3VlcyBpbiBBdXN0cmFsaWEuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDUtMTItMTIpOgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmxhd2xpbmsubnN3Lmdvdi5hdS9sYXdsaW5rL0NvcnBvcmF0ZS9sbF9hZ2RpbmZvLm5zZi9wYWdlcy9jb21tdW5pdHlfcmVsYXRpb25zX2RheWxpZ2h0X3NhdmluZyI+CisjIExhd2xpbmsgTlNXOkRheWxpZ2h0IFNhdmluZyBpbiBOZXcgU291dGggV2FsZXMKKyMgPC9hPiBjb3ZlcnMgTmV3IFNvdXRoIFdhbGVzIGluIHBhcnRpY3VsYXIuCisKKyMgRnJvbSBKb2huIE1hY2tpbiAoMTk5MS0wMy0wNik6CisjIFdlIGluIEF1c3RyYWxpYSBoYXZlIF9uZXZlcl8gcmVmZXJyZWQgdG8gRFNUIGFzIGBkYXlsaWdodCcgdGltZS4KKyMgSXQgaXMgY2FsbGVkIGBzdW1tZXInIHRpbWUuICBOb3cgYnkgYSBoYXBweSBjb2luY2lkZW5jZSwgYHN1bW1lcicKKyMgYW5kIGBzdGFuZGFyZCcgaGFwcGVuIHRvIHN0YXJ0IHdpdGggdGhlIHNhbWUgbGV0dGVyOyBoZW5jZSwgdGhlCisjIGFiYnJldmlhdGlvbiBkb2VzIF9ub3RfIGNoYW5nZS4uLgorIyBUaGUgbGVnaXNsYXRpb24gZG9lcyBub3QgYWN0dWFsbHkgZGVmaW5lIGFiYnJldmlhdGlvbnMsIGF0IGxlYXN0CisjIGluIHRoaXMgU3RhdGUsIGJ1dCB0aGUgYWJicmV2aWF0aW9uIGlzIGp1c3QgY29tbW9ubHkgdGFrZW4gdG8gYmUgdGhlCisjIGluaXRpYWxzIG9mIHRoZSBwaHJhc2UsIGFuZCB0aGUgbGVnaXNsYXRpb24gaGVyZSB1bmlmb3JtbHkgdXNlcworIyB0aGUgcGhyYXNlIGBzdW1tZXIgdGltZScgYW5kIGRvZXMgbm90IHVzZSB0aGUgcGhyYXNlIGBkYXlsaWdodAorIyB0aW1lJy4KKyMgQW5ub3VuY2VycyBvbiB0aGUgQ29tbW9ud2VhbHRoIHJhZGlvIG5ldHdvcmssIHRoZSBBQkMgKGZvciBBdXN0cmFsaWFuCisjIEJyb2FkY2FzdGluZyBDb21taXNzaW9uKSwgdXNlIHRoZSBwaHJhc2VzIGBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUnCisjIG9yIGBFYXN0ZXJuIFN1bW1lciBUaW1lJy4gIChOb3RlLCB0aG91Z2gsIHRoYXQgYXMgSSBzYXkgaW4gdGhlCisjIGN1cnJlbnQgYXVzdHJhbGFzaWEgZmlsZSwgdGhlcmUgaXMgcmVhbGx5IG5vIHN1Y2ggdGhpbmcuKSAgQW5ub3VuY2VycworIyBvbiBpdHMgb3ZlcnNlYXMgc2VydmljZSwgUmFkaW8gQXVzdHJhbGlhLCB1c2UgdGhlIHNhbWUgcGhyYXNlcworIyBwcmVmaXhlZCBieSB0aGUgd29yZCBgQXVzdHJhbGlhbicgd2hlbiByZWZlcnJpbmcgdG8gbG9jYWwgdGltZXM7CisjIHRpbWUgYW5ub3VuY2VtZW50cyBvbiB0aGF0IHNlcnZpY2UsIG5hdHVyYWxseSBlbm91Z2gsIGFyZSBtYWRlIGluIFVUQy4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5Mi0wMy0wOCk6CisjIEdpdmVuIHRoZSBhYm92ZSwgd2hhdCdzIGNob3NlbiBmb3IgeWVhci1yb3VuZCB1c2UgaXM6CisjCUNTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA5OjMwCisjCVdTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA4OjAwCisjCUVTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiAxMDowMAorCisjIEZyb20gQ2h1Y2sgU29wZXIgKDIwMDYtMDYtMDEpOgorIyBJIHJlY2VudGx5IGZvdW5kIHRoaXMgQXVzdHJhbGlhbiBnb3Zlcm5tZW50IHdlYiBwYWdlIG9uIHRpbWUgem9uZXM6CisjIDxodHRwOi8vd3d3LmF1c3RyYWxpYS5nb3YuYXUvYWJvdXQtYXVzdHJhbGlhLTEzdGltZT4KKyMgQW5kIHRoaXMgZ292ZXJubWVudCB3ZWIgcGFnZSBsaXN0cyB0aW1lIHpvbmUgbmFtZXMgYW5kIGFiYnJldmlhdGlvbnM6CisjIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZGF5c2F2dG0uc2h0bWw+CisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNC0wNSksIHN1bW1hcml6aW5nIGEgbG9uZyBkaXNjdXNzaW9uIGFib3V0ICJFU1QiCisjIHZlcnN1cyAiQUVTVCIgZXRjLjoKKyMKKyMgSSBzZWUgdGhlIGZvbGxvd2luZyBwb2ludHMgb2YgZGlzcHV0ZToKKyMKKyMgKiBIb3cgaW1wb3J0YW50IGFyZSB1bmlxdWUgdGltZSB6b25lIGFiYnJldmlhdGlvbnM/CisjCisjICAgSGVyZSBJIHRlbmQgdG8gYWdyZWUgd2l0aCB0aGUgcG9pbnQgKG1vc3QgcmVjZW50bHkgbWFkZSBieSBDaHJpcworIyAgIE5ld21hbikgdGhhdCB1bmlxdWUgYWJicmV2aWF0aW9ucyBzaG91bGQgbm90IGJlIGVzc2VudGlhbCBmb3IgcHJvcGVyCisjICAgb3BlcmF0aW9uIG9mIHNvZnR3YXJlLiAgV2UgaGF2ZSBvdGhlciBpbnN0YW5jZXMgb2YgYW1iaWd1aXR5CisjICAgKGUuZy4gIklTVCIgZGVub3RpbmcgYm90aCAiSXNyYWVsIFN0YW5kYXJkIFRpbWUiIGFuZCAiSW5kaWFuCisjICAgU3RhbmRhcmQgVGltZSIpLCBhbmQgdGhleSBhcmUgbm90IGxpa2VseSB0byBnbyBhd2F5IGFueSB0aW1lIHNvb24uCisjICAgSW4gdGhlIG9sZCBkYXlzLCBzb21lIHNvZnR3YXJlIG1pc3Rha2VubHkgcmVsaWVkIG9uIHVuaXF1ZQorIyAgIGFiYnJldmlhdGlvbnMsIGJ1dCB0aGlzIGlzIGJlY29taW5nIGxlc3MgdHJ1ZSB3aXRoIHRpbWUsIGFuZCBJIGRvbid0CisjICAgdGhpbmsgaXQncyB0aGF0IGltcG9ydGFudCB0byBjYXRlciB0byBzdWNoIHNvZnR3YXJlIHRoZXNlIGRheXMuCisjCisjICAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGlzIGFub3RoZXIgbW90aXZhdGlvbiBmb3IgdW5hbWJpZ3VvdXMKKyMgICBhYmJyZXZpYXRpb25zOiBpdCBjdXRzIGRvd24gb24gaHVtYW4gY29uZnVzaW9uLiAgVGhpcyBpcworIyAgIHBhcnRpY3VsYXJseSB0cnVlIGZvciBBdXN0cmFsaWEsIHdoZXJlICJFU1QiIGNhbiBtZWFuIG9uZSB0aGluZyBmb3IKKyMgICB0aW1lIFQgYW5kIGEgZGlmZmVyZW50IHRoaW5nIGZvciB0aW1lIFQgcGx1cyAxIHNlY29uZC4KKyMKKyMgKiBEb2VzIHRoZSByZWxldmFudCBsZWdpc2xhdGlvbiBpbmRpY2F0ZSB3aGljaCBhYmJyZXZpYXRpb25zIHNob3VsZCBiZSB1c2VkPworIworIyAgIEhlcmUgSSB0ZW5kIHRvIHRoaW5rIHRoYXQgdGhpbmdzIGFyZSBhIG1lc3MsIGp1c3QgYXMgdGhleSBhcmUgaW4KKyMgICBtYW55IG90aGVyIGNvdW50cmllcy4gIFdlIEFtZXJpY2FucyBhcmUgY3VycmVudGx5IGRpc2FncmVlaW5nIGFib3V0CisjICAgd2hpY2ggYWJicmV2aWF0aW9uIHRvIHVzZSBmb3IgdGhlIG5ld2x5IGxlZ2lzbGF0ZWQgQ2hhbW9ycm8gU3RhbmRhcmQKKyMgICBUaW1lLCBmb3IgZXhhbXBsZS4KKyMKKyMgICBQZXJzb25hbGx5LCBJIHdvdWxkIHByZWZlciB0byB1c2UgY29tbW9uIHByYWN0aWNlOyBJIHdvdWxkIGxpa2UgdG8KKyMgICByZWZlciB0byBsZWdpc2xhdGlvbiBvbmx5IGZvciBleGFtcGxlcyBvZiBjb21tb24gcHJhY3RpY2UsIG9yIGFzIGEKKyMgICB0aWVicmVha2VyLgorIworIyAqIERvIEF1c3RyYWxpYW5zIG1vcmUgb2Z0ZW4gdXNlICJFYXN0ZXJuIERheWxpZ2h0IFRpbWUiIG9yICJFYXN0ZXJuCisjICAgU3VtbWVyIFRpbWUiPyAgRG8gdGhleSB0eXBpY2FsbHkgcHJlZml4IHRoZSB0aW1lIHpvbmUgbmFtZXMgd2l0aAorIyAgIHRoZSB3b3JkICJBdXN0cmFsaWFuIj8KKyMKKyMgICBNeSBvd24gaW1wcmVzc2lvbiBpcyB0aGF0IGJvdGggIkRheWxpZ2h0IFRpbWUiIGFuZCAiU3VtbWVyIFRpbWUiIGFyZQorIyAgIGNvbW1vbiBhbmQgYXJlIHdpZGVseSB1bmRlcnN0b29kLCBidXQgdGhhdCAiU3VtbWVyIFRpbWUiIGlzIG1vcmUKKyMgICBwb3B1bGFyOyBhbmQgdGhhdCB0aGUgbGVhZGluZyAiQSIgaXMgYWxzbyBjb21tb24gYnV0IGlzIG9taXR0ZWQgbW9yZQorIyAgIG9mdGVuIHRoYW4gbm90LiAgSSBqdXN0IHVzZWQgQWx0YVZpc3RhIGFkdmFuY2VkIHNlYXJjaCBhbmQgZ290IHRoZQorIyAgIGZvbGxvd2luZyBjb3VudCBvZiBwYWdlIGhpdHM6CisjCisjICAgICAxLDEwMyAiRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQorIyAgICAgICA5NzEgIkF1c3RyYWxpYW4gRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQorIyAgICAgICA2MTMgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgQU5EIGRvbWFpbjphdQorIyAgICAgICAxMjcgIkF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIiBBTkQgZG9tYWluOmF1CisjCisjICAgSGVyZSAiU3VtbWVyIiBzZWVtcyBxdWl0ZSBhIGJpdCBtb3JlIHBvcHVsYXIgdGhhbiAiRGF5bGlnaHQiLAorIyAgIHBhcnRpY3VsYXJseSB3aGVuIHdlIGtub3cgdGhlIHRpbWUgem9uZSBpcyBBdXN0cmFsaWFuIGFuZCBub3QgVVMsCisjICAgc2F5LiAgVGhlICJBdXN0cmFsaWFuIiBwcmVmaXggc2VlbXMgdG8gYmUgcG9wdWxhciBmb3IgRWFzdGVybiBTdW1tZXIKKyMgICBUaW1lLCBidXQgdW5wb3B1bGFyIGZvciBFYXN0ZXJuIERheWxpZ2h0IFRpbWUuCisjCisjICAgRm9yIGFiYnJldmlhdGlvbnMsIHRvb2xzIGxpa2UgQWx0YVZpc3RhIGFyZSBsZXNzIHVzZWZ1bCBiZWNhdXNlIG9mCisjICAgYW1iaWd1aXR5LiAgTWFueSBoaXRzIGFyZSBub3QgcmVhbGx5IHRpbWUgem9uZXMsIHVuZm9ydHVuYXRlbHksIGFuZAorIyAgIG1hbnkgaGl0cyBkZW5vdGUgVVMgdGltZSB6b25lcyBhbmQgbm90IEF1c3RyYWxpYW4gb25lcy4gIEJ1dCBoZXJlCisjICAgYXJlIHRoZSBoaXQgY291bnRzIGFueXdheToKKyMKKyMgICAgIDE2MSwzMDQgIkVTVCIgYW5kIGRvbWFpbjphdQorIyAgICAgIDI1LDE1NiAiRURUIiBhbmQgZG9tYWluOmF1CisjICAgICAgMTgsMjYzICJBRVNUIiBhbmQgZG9tYWluOmF1CisjICAgICAgMTAsNDE2ICJBRURUIiBhbmQgZG9tYWluOmF1CisjCisjICAgICAgMTQsNTM4ICJDU1QiIGFuZCBkb21haW46YXUKKyMgICAgICAgNSw3MjggIkNEVCIgYW5kIGRvbWFpbjphdQorIyAgICAgICAgIDE3NiAiQUNTVCIgYW5kIGRvbWFpbjphdQorIyAgICAgICAgICAyOSAiQUNEVCIgYW5kIGRvbWFpbjphdQorIworIyAgICAgICA3LDUzOSAiV1NUIiBhbmQgZG9tYWluOmF1CisjICAgICAgICAgIDY4ICJBV1NUIiBhbmQgZG9tYWluOmF1CisjCisjICAgVGhpcyBkYXRhIHN1Z2dlc3QgdGhhdCBBdXN0cmFsaWFucyB0ZW5kIHRvIG9taXQgdGhlICJBIiBwcmVmaXggaW4KKyMgICBwcmFjdGljZS4gIFRoZSBzaXR1YXRpb24gZm9yICJTVCIgdmVyc3VzICJEVCIgaXMgbGVzcyBjbGVhciwgZ2l2ZW4KKyMgICB0aGUgYW1iaWd1aXRpZXMgaW52b2x2ZWQuCisjCisjICogSG93IGRvIEF1c3RyYWxpYW5zIGZlZWwgYWJvdXQgdGhlIGFiYnJldmlhdGlvbnMgaW4gdGhlIHR6IGRhdGFiYXNlPworIworIyAgIElmIHlvdSBqdXN0IGNvdW50IEF1c3RyYWxpYW5zIG9uIHRoaXMgbGlzdCwgSSBjb3VudCAyIGluIGZhdm9yIGFuZCAzCisjICAgYWdhaW5zdC4gIE9uZSBvZiB0aGUgImFnYWluc3QiIHZvdGVzIChEYXZpZCBLZWVnZWwpIGNvdW5zZWxlZCBkZWxheSwKKyMgICBzYXlpbmcgdGhhdCBib3RoIEFFU1QvQUVEVCBhbmQgRVNUL0VTVCBhcmUgd2lkZWx5IHVzZWQgYW5kCisjICAgdW5kZXJzdG9vZCBpbiBBdXN0cmFsaWEuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NS0xMi0xOSk6CisjIFNoYW5rcyAmIFBvdHRlbmdlciByZXBvcnQgMjowMCBmb3IgYWxsIGF1dHVtbiBjaGFuZ2VzIGluIEF1c3RyYWxpYSBhbmQgTlouCisjIE1hcmsgUHJpb3Igd3JpdGVzIHRoYXQgaGlzIG5ld3NwYXBlcgorIyByZXBvcnRzIHRoYXQgTlNXJ3MgZmFsbCAxOTk1IGNoYW5nZSB3aWxsIG9jY3VyIGF0IDI6MDAsCisjIGJ1dCBSb2JlcnQgRWx6IHNheXMgaXQncyBiZWVuIDM6MDAgaW4gVmljdG9yaWEgc2luY2UgMTk3MAorIyBhbmQgcGVyaGFwcyB0aGUgbmV3c3BhcGVyJ3MgYDI6MDAnIGlzIHJlZmVycmluZyB0byBzdGFuZGFyZCB0aW1lLgorIyBGb3Igbm93IHdlJ2xsIGNvbnRpbnVlIHRvIGFzc3VtZSAyOjAwcyBmb3IgY2hhbmdlcyBzaW5jZSAxOTYwLgorCisjIEZyb20gRXJpYyBVbGV2aWsgKDE5OTgtMDEtMDUpOgorIworIyBIZXJlIGFyZSBzb21lIFVSTHMgdG8gQXVzdHJhbGlhbiB0aW1lIGxlZ2lzbGF0aW9uLiBUaGVzZSBVUkxzIGFyZSBzdGFibGUsCisjIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZmlsZS4gVGhlcmUgYXJlIHByb2JhYmx5IG1vcmUKKyMgcmVsZXZhbnQgZW50cmllcyBpbiB0aGlzIGRhdGFiYXNlLgorIworIyBOU1cgKGluY2x1ZGluZyBMSEkgYW5kIEJyb2tlbiBIaWxsKToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9uc3cvY29uc29sX2FjdC9zdGExOTg3MTM3L2luZGV4Lmh0bWwiPgorIyBTdGFuZGFyZCBUaW1lIEFjdCAxOTg3ICh1cGRhdGVkIDE5OTUtMDQtMDQpCisjIDwvYT4KKyMgQUNUCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvYWN0L2NvbnNvbF9hY3Qvc3Rhc3RhMTk3MjI3OS9pbmRleC5odG1sIj4KKyMgU3RhbmRhcmQgVGltZSBhbmQgU3VtbWVyIFRpbWUgQWN0IDE5NzIKKyMgPC9hPgorIyBTQQorIyA8YSBocmVmPSJodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL3NhL2NvbnNvbF9hY3Qvc3RhMTg5ODEzNy9pbmRleC5odG1sIj4KKyMgU3RhbmRhcmQgVGltZSBBY3QsIDE4OTgKKyMgPC9hPgorCisjIEZyb20gRGF2aWQgR3Jvc3ogKDIwMDUtMDYtMTMpOgorIyBJdCB3YXMgYW5ub3VuY2VkIGxhc3Qgd2VlayB0aGF0IERheWxpZ2h0IFNhdmluZyB3b3VsZCBiZSBleHRlbmRlZCBieQorIyBvbmUgd2VlayBuZXh0IHllYXIgdG8gYWxsb3cgZm9yIHRoZSAyMDA2IENvbW1vbndlYWx0aCBHYW1lcy4KKyMgRGF5bGlnaHQgU2F2aW5nIGlzIG5vdyB0byBlbmQgZm9yIG5leHQgeWVhciBvbmx5IG9uIHRoZSBmaXJzdCBTdW5kYXkKKyMgaW4gQXByaWwgaW5zdGVhZCBvZiB0aGUgbGFzdCBTdW5kYXkgaW4gTWFyY2guCisjCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDUtMDYtMTQpOgorIyBJIGRpZCBzb21lIEdvb2dsaW5nIGFuZCBmb3VuZCB0aGF0IGFsbCBvZiB0aG9zZSBzdGF0ZXMgKGFuZCB0ZXJyaXRvcnkpIHBsYW4KKyMgdG8gZXh0ZW5kIERTVCB0b2dldGhlciBpbiAyMDA2LgorIyBBQ1Q6IGh0dHA6Ly93d3cuY21kLmFjdC5nb3YuYXUvbWVkaWFyZWxlYXNlcy9maWxlcmVhZC5jZm0/ZmlsZT04Ni50eHQKKyMgTmV3IFNvdXRoIFdhbGVzOiBodHRwOi8vd3d3LnRoZWNvdXJpZXJtYWlsLm5ld3MuY29tLmF1L2NvbW1vbi9zdG9yeV9wYWdlLzAsNTkzNiwxNTUzODg2OSUyNTVFMTcwMiwwMC5odG1sCisjIFNvdXRoIEF1c3RyYWxpYTogaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTU1MDMxLTEyNDYsMDAuaHRtbAorIyBUYXNtYW5pYTogaHR0cDovL3d3dy5tZWRpYS50YXMuZ292LmF1L3JlbGVhc2UucGhwP2lkPTE0NzcyCisjIFZpY3RvcmlhOiBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55dGhpbmcgc2VwYXJhdGUsIGJ1dCB0aGUgb3RoZXIgYXJ0aWNsZXMKKyMgYWxsdWRlIHRvIGl0LgorIyBCdXQgbm90IFF1ZWVuc2xhbmQKKyMgaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTY0MDMwLTEyNDgsMDAuaHRtbC4KKworIyBOb3J0aGVybiBUZXJyaXRvcnkKKworIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgorIyAjIFRoZSBOT1JUSEVSTiBURVJSSVRPUlkuLiAgWyBDb3VydGVzeSBOLlQuIERlcHQgb2YgdGhlIENoaWVmIE1pbmlzdGVyIF0KKyMgIwkJCQkJWyBOb3YgMTk5MCBdCisjICMJTi5ULiBoYXZlIG5ldmVyIHV0aWxpc2VkIGFueSBEU1QgZHVlIHRvIHN1Yi10cm9waWNhbC90cm9waWNhbCBsb2NhdGlvbi4KKyMgLi4uCisjIFpvbmUgICAgICAgIEF1c3RyYWxpYS9Ob3J0aCAgICAgICAgIDk6MzAgICAgLSAgICAgICBDU1QKKworIyBGcm9tIEJyYWRsZXkgV2hpdGUgKDE5OTEtMDMtMDQpOgorIyBBIHJlY2VudCBleGNlcnB0IGZyb20gYW4gQXVzdHJhbGlhbiBuZXdzcGFwZXIuLi4KKyMgdGhlIE5vcnRoZXJuIFRlcnJpdG9yeSBkb1tlc10gbm90IGhhdmUgZGF5bGlnaHQgc2F2aW5nLgorCisjIFdlc3Rlcm4gQXVzdHJhbGlhCisKKyMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgIyAgVGhlIHN0YXRlIG9mIFdFU1RFUk4gQVVTVFJBTElBLi4gIFsgQ291cnRlc3kgVy5BLiBkZXB0IFByZW1pZXIrQ2FiaW5ldCBdCisjICMJCQkJCQlbIE5vdiAxOTkwIF0KKyMgIwlXLkEuIHN1ZmZlcnMgZnJvbSBhIGdyZWF0IGRlYWwgb2YgcHVibGljIGFuZCBwb2xpdGljYWwgb3Bwb3NpdGlvbiB0bworIyAjCURTVCBpbiBwcmluY2lwbGUuIEEgYmlsbCBpcyBicm91Z2h0IGJlZm9yZSBwYXJsaWFtZW50IGluIG1vc3QgeWVhcnMsIGJ1dAorIyAjCXVzdWFsbHkgZGVmZWF0ZWQgZWl0aGVyIGluIHRoZSB1cHBlciBob3VzZSwgb3IgaW4gcGFydHkgY2F1Y3VzCisjICMJYmVmb3JlIHJlYWNoaW5nIHBhcmxpYW1lbnQuCisjIC4uLgorIyBab25lCUF1c3RyYWxpYS9XZXN0CQk4OjAwCUFXCSVzU1QKKyMgLi4uCisjIFJ1bGUJQVcJMTk3NAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKKyMgUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTM6MDAJMAlXCisjIFJ1bGUJQVcJMTk4Mwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKKyMgUnVsZQlBVwkxOTg0CW9ubHkJLQlNYXIJU3VuPj0xCTM6MDAJMAlXCisKKyMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkxLTAzLTA0KToKKyMgQSByZWNlbnQgZXhjZXJwdCBmcm9tIGFuIEF1c3RyYWxpYW4gbmV3c3BhcGVyLi4uCisjIFdlc3Rlcm4gQXVzdHJhbGlhLi4uZG9bZXNdIG5vdCBoYXZlIGRheWxpZ2h0IHNhdmluZy4KKworIyBGcm9tIEpvaG4gRC4gTmV3bWFuIHZpYSBCcmFkbGV5IFdoaXRlICgxOTkxLTExLTAyKToKKyMgV2VzdGVybiBBdXN0cmFsaWEgaXMgc3RpbGwgb24gIndpbnRlciB0aW1lIi4gU29tZSBESCBpbiBTeWRuZXkKKyMgcmFuZyBtZSBhdCBob21lIGEgZmV3IGRheXMgYWdvIGF0IDYuMDBhbS4gKEhlIGhhZCBqdXN0IGFycml2ZWQgYXQKKyMgd29yayBhdCA5LjAwYW0uKQorIyBXLkEuIGlzIHN3aXRjaGluZyB0byBTdW1tZXIgVGltZSBvbiBOb3YgMTd0aCBqdXN0IHRvIGNvbmZ1c2UKKyMgZXZlcnlib2R5IGFnYWluLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTkyLTAzLTA4KToKKyMgVGhlIDE5OTIgZW5kaW5nIGRhdGUgdXNlZCBpbiB0aGUgcnVsZXMgaXMgYSBiZXN0IGd1ZXNzOworIyBpdCBtYXRjaGVzIHdoYXQgd2FzIHVzZWQgaW4gdGhlIHBhc3QuCisKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib20uZ292LmF1L2ZhcS9mYXFnZW4uaHRtIj4KKyMgVGhlIEF1c3RyYWxpYW4gQnVyZWF1IG9mIE1ldGVvcm9sb2d5IEZBUQorIyA8L2E+ICgxOTk5LTA5LTI3KSB3cml0ZXMgdGhhdCBHaWxlcyBNZXRlb3JvbG9naWNhbCBTdGF0aW9uIHVzZXMKKyMgU291dGggQXVzdHJhbGlhbiB0aW1lIGV2ZW4gdGhvdWdoIGl0J3MgbG9jYXRlZCBpbiBXZXN0ZXJuIEF1c3RyYWxpYS4KKworIyBRdWVlbnNsYW5kCisjIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6CisjICMgICBUaGUgc3RhdGUgb2YgUVVFRU5TTEFORC4uIFsgQ291cnRlc3kgUWxkLiBEZXB0IFByZW1pZXIgRWNvbiZUcmFkZSBEZXZlbCBdCisjICMJCQkJCQlbIERlYyAxOTkwIF0KKyMgLi4uCisjIFpvbmUJQXVzdHJhbGlhL1F1ZWVuc2xhbmQJMTA6MDAJQVEJJXNTVAorIyAuLi4KKyMgUnVsZQlBUQkxOTcxCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAorIyBSdWxlCUFRCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTM6MDAJMAlFCisjIFJ1bGUJQVEJMTk4OQltYXgJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAorIyBSdWxlCUFRCTE5OTAJbWF4CS0JTWFyCVN1bj49MQkzOjAwCTAJRQorCisjIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk4OS0xMi0yNCk6CisjICJBdXN0cmFsaWEvUXVlZW5zbGFuZCIgbm93IG9ic2VydmVzIGRheWxpZ2h0IHRpbWUgKGkuZS4gZnJvbQorIyBPY3RvYmVyIDE5ODkpLgorCisjIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5MS0wMy0wNCk6CisjIEEgcmVjZW50IGV4Y2VycHQgZnJvbSBhbiBBdXN0cmFsaWFuIG5ld3NwYXBlci4uLgorIyAuLi5RdWVlbnNsYW5kLi4uW2hhc10gYWdyZWVkIHRvIGVuZCBkYXlsaWdodCBzYXZpbmcKKyMgYXQgM2FtIHRvbW9ycm93IChNYXJjaCAzKS4uLgorCisjIEZyb20gSm9obiBNYWNraW4gKDE5OTEtMDMtMDYpOgorIyBJIGNhbiBjZXJ0YWlubHkgY29uZmlybSBmb3IgbXkgcGFydCB0aGF0IERheWxpZ2h0IFNhdmluZyBpbiBOU1cgZGlkIGluIGZhY3QKKyMgZW5kIG9uIFN1bmRheSwgMyBNYXJjaC4gIEkgZG9uJ3Qga25vdyBhdCB3aGF0IGhvdXIsIHRob3VnaC4gIChJdCBzdXJwcmlzZWQKKyMgbWUuKQorCisjIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5Mi0wMy0wOCk6CisjIC4uLnRoZXJlIHdhcyByZWNlbnRseSBhIHJlZmVyZW5kdW0gaW4gUXVlZW5zbGFuZCB3aGljaCByZXN1bHRlZAorIyBpbiB0aGUgZXhwZXJpbWVudGFsIGRheWxpZ2h0IHNhdmluZyBzeXN0ZW0gYmVpbmcgYWJhbmRvbmVkLiBTbywgLi4uCisjIC4uLgorIyBSdWxlCVFMRAkxOTg5CTE5OTEJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAorIyBSdWxlCVFMRAkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCTM6MDAJMAlTCisjIC4uLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTkyLTAzLTA4KToKKyMgVGhlIGNob3NlbiBydWxlcyB0aGUgdW5pb24gb2YgdGhlIDE5NzEvMTk3MiBjaGFuZ2UgYW5kIHRoZSAxOTg5LTE5OTIgY2hhbmdlcy4KKworIyBGcm9tIENocmlzdG9waGVyIEh1bnQgKDIwMDYtMTEtMjEpLCBhZnRlciBhbiBhZHZhbmNlIHdhcm5pbmcKKyMgZnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTEtMDEpOgorIyBXQSBhcmUgdHJpYWxpbmcgRFNUIGZvciB0aHJlZSB5ZWFycy4KKyMgPGh0dHA6Ly93d3cucGFybGlhbWVudC53YS5nb3YuYXUvcGFybGlhbWVudC9iaWxscy5uc2YvOUExQjE4MzE0NDQwM0RBNTQ4MjU3MjEyMDAwODhERjEvJEZpbGUvQmlsbDE3NS0xQi5wZGY+CisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMi0wNC0wOSk6CisjIFRoZSBtb3N0IGludGVyZXN0aW5nIHJlZ2lvbiBJIGhhdmUgZm91bmQgY29uc2lzdHMgb2YgdGhyZWUgdG93bnMgb24gdGhlCisjIHNvdXRoZXJuIGNvYXN0Li4uLiAgU291dGggQXVzdHJhbGlhIG9ic2VydmVzIGRheWxpZ2h0IHNhdmluZyB0aW1lOyBXZXN0ZXJuCisjIEF1c3RyYWxpYSBkb2VzIG5vdC4gIFRoZSB0d28gc3RhdGVzIGFyZSBvbmUgYW5kIGEgaGFsZiBob3VycyBhcGFydC4gIFRoZQorIyByZXNpZGVudHMgZGVjaWRlZCB0byBmb3JnZXQgYWJvdXQgdGhpcyBub25zZW5zZSBvZiBjaGFuZ2luZyB0aGUgY2xvY2sgc28KKyMgbXVjaCBhbmQgc2V0IHRoZSBsb2NhbCB0aW1lIDIwIGhvdXJzIGFuZCA0NSBtaW51dGVzIGZyb20gdGhlCisjIGludGVybmF0aW9uYWwgZGF0ZSBsaW5lLCBvciByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aW1lIG9mIFNvdXRoCisjIEF1c3RyYWxpYSBhbmQgV2VzdGVybiBBdXN0cmFsaWEuLi4uCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMDQtMDkpOgorIyBUaGlzIGlzIGNvbmZpcm1lZCBieSB0aGUgc2VjdGlvbiBlbnRpdGxlZAorIyAiV2hhdCdzIHRoZSBkZWFsIHdpdGggdGltZSB6b25lcz8/PyIgaW4KKyMgPGh0dHA6Ly93d3cuZWFydGhzY2kudW5pbWVsYi5lZHUuYXUvfmF3YXRraW5zL251bGwuaHRtbD4uCisjCisjIEZyb20gQWxleCBMaXZpbmdzdG9uICgyMDA2LTEyLTA3KToKKyMgLi4uIGl0IHdhcyBqdXN0IG9uIGZvdXIgeWVhcnMgYWdvIHRoYXQgSSBkcm92ZSBhbG9uZyB0aGUgRXlyZSBIaWdod2F5LAorIyB3aGljaCBwYXNzZXMgdGhyb3VnaCBlYXN0ZXJuIFdlc3Rlcm4gQXVzdHJhbGlhIGNsb3NlIHRvIHRoZSBzb3V0aGVybgorIyBjb2FzdCBvZiB0aGUgY29udGluZW50LgorIworIyBJIHBhaWQgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHRpbWUga2VwdCB0aGVyZS4gVGhlcmUgY2FuIGJlIG5vCisjIGRpc3B1dGUgdGhhdCBVVEMrMDg6NDUgd2FzIGNvbnNpZGVyZWQgInRoZSB0aW1lIiBmcm9tIHRoZSBib3JkZXIKKyMgdmlsbGFnZSBqdXN0IGluc2lkZSB0aGUgYm9yZGVyIHdpdGggU291dGggQXVzdHJhbGlhIHRvIGFzIGZhciB3ZXN0CisjIGFzIGp1c3QgZWFzdCBvZiBDYWlndW5hLiBUaGVyZSBjYW4gYWxzbyBiZSBubyBkaXNwdXRlIHRoYXQgRXVjbGEgaXMKKyMgdGhlIGxhcmdlc3QgcG9wdWxhdGlvbiBjZW50cmUgaW4gdGhpcyB6b25lLi4uLgorIworIyBOb3cgdGhhdCBXZXN0ZXJuIEF1c3RyYWxpYSBpcyBvYnNlcnZpbmcgZGF5bGlnaHQgc2F2aW5nLCB0aGUKKyMgcXVlc3Rpb24gYXJvc2Ugd2hldGhlciB0aGlzIHBhcnQgb2YgdGhlIHN0YXRlIHdvdWxkIGZvbGxvdyBzdWl0LiBJCisjIGp1c3QgY2FsbGVkIHRoZSBib3JkZXIgdmlsbGFnZSBhbmQgY29uZmlybWVkIHRoYXQgaW5kZWVkIHRoZXkgaGF2ZSwKKyMgbWVhbmluZyB0aGF0IHRoZXkgYXJlIG5vdyBvYnNlcnZpbmcgVVRDKzA5OjQ1LgorIworIyAoMjAwNi0xMi0wOSk6CisjIEkgcGVyc29uYWxseSBkb3VidCB0aGF0IGVpdGhlciBleHBlcmltZW50YXRpb24gd2l0aCBkYXlsaWdodCBzYXZpbmcKKyMgaW4gV0Egb3IgaXRzIGludHJvZHVjdGlvbiBpbiBTQSBoYWQgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgZ2VuZXNpcworIyBvZiB0aGlzIHRpbWUgem9uZS4gIE15IGh1bmNoIGlzIHRoYXQgaXQncyBiZWVuIGFyb3VuZCBzaW5jZSB3ZWxsCisjIGJlZm9yZSAxOTc1LiAgSSByZW1lbWJlciBzZWVpbmcgaXQgbm90ZWQgb24gcm9hZCBtYXBzIGRlY2FkZXMgYWdvLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMTItMTUpOgorIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZSB0cmFkaXRpb24gZGF0ZXMgYmFjayB0byB0aGUKKyMgaW50cm9kdWN0aW9uIG9mIHN0YW5kYXJkIHRpbWUgaW4gMTg5NS4KKworCisjIHNvdXRoZWFzdCBBdXN0cmFsaWEKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6CisjIFN0YXJ0aW5nIGF1dHVtbiAyMDA4IFZpY3RvcmlhLCBOU1csIFNvdXRoIEF1c3RyYWxpYSwgVGFzbWFuaWEgYW5kIHRoZSBBQ1QKKyMgZW5kIERTVCB0aGUgZmlyc3QgU3VuZGF5IGluIEFwcmlsIGFuZCBzdGFydCBEU1QgdGhlIGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyLgorIyBodHRwOi8vd3d3LnRoZWFnZS5jb20uYXUvbmV3cy9uYXRpb25hbC9kYXlsaWdodC1zYXZpbmdzLXRvLXNwYW4tc2l4LW1vbnRocy8yMDA3LzA2LzI3LzExODI2MjM5NjY3MDMuaHRtbAorCisKKyMgU291dGggQXVzdHJhbGlhCisKKyMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkxLTAzLTA0KToKKyMgQSByZWNlbnQgZXhjZXJwdCBmcm9tIGFuIEF1c3RyYWxpYW4gbmV3c3BhcGVyLi4uCisjIC4uLlNvdXRoIEF1c3RyYWxpYS4uLltoYXNdIGFncmVlZCB0byBlbmQgZGF5bGlnaHQgc2F2aW5nCisjIGF0IDNhbSB0b21vcnJvdyAoTWFyY2ggMykuLi4KKworIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgorIyAjICAgVGhlIHN0YXRlIG9mIFNPVVRIIEFVU1RSQUxJQS4uLi5bIENvdXJ0ZXN5IG9mIFMuQS4gRGVwdCBvZiBMYWJvdXIgXQorIyAjCQkJCQkJWyBOb3YgMTk5MCBdCisjIC4uLgorIyBab25lCUF1c3RyYWxpYS9Tb3V0aAkJOTozMAlBUwklc1NUCisjIC4uLgorIyBSdWxlCSBBUwkxOTcxCW1heAktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECisjIFJ1bGUJIEFTCTE5NzIJMTk4NQktCU1hcglTdW4+PTEJMzowMAkwCUMKKyMgUnVsZQkgQVMJMTk4NgkxOTkwCS0JTWFyCVN1bj49MTUJMzowMAkwCUMKKyMgUnVsZQkgQVMJMTk5MQltYXgJLQlNYXIJU3VuPj0xCTM6MDAJMAlDCisKKyMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkyLTAzLTExKToKKyMgUmVjZW50IGNvcnJlc3BvbmRlbmNlIHdpdGggYSBmcmllbmQgaW4gQWRlbGFpZGUKKyMgY29udGFpbmVkIHRoZSBmb2xsb3dpbmcgZXhjaGFuZ2U6ICAiRHVlIHRvIHRoZSBBZGVsYWlkZSBGZXN0aXZhbCwKKyMgU291dGggQXVzdHJhbGlhIGRlbGF5cyBzZXR0aW5nIGJhY2sgb3VyIGNsb2NrcyBmb3IgYSBmZXcgd2Vla3MuIgorCisjIEZyb20gUm9iZXJ0IEVseiAoMTk5Mi0wMy0xMyk6CisjIEkgaGVhcmQgdGhhdCBhcHBhcmVudGx5IChvciBhdCBsZWFzdCwgaXQgYXBwZWFycyB0aGF0KQorIyBTb3V0aCBBdXMgd2lsbCBoYXZlIGFuIGV4dHJhIDMgd2Vla3MgZGF5bGlnaHQgc2F2aW5nIGV2ZXJ5IGV2ZW4KKyMgbnVtYmVyZWQgeWVhciAoZnJvbSAxOTkwKS4gIFRoYXQncyB3aGVuIHRoZSBBZGVsYWlkZSBGZXN0aXZhbAorIyBpcyBvbi4uLgorCisjIEZyb20gUm9iZXJ0IEVseiAoMTk5Mi0wMy0xNiwgMDA6NTc6MDcgKzEwMDApOgorIyBEU1QgZGlkbid0IGVuZCBpbiBBZGVsYWlkZSB0b2RheSAoeWVzdGVyZGF5KS4uLi4KKyMgQnV0IHdoZXRoZXIgaXQncyAiNHRoIFN1bmRheSIgb3IgIjJuZCBsYXN0IFN1bmRheSIgSSBoYXZlIG5vIGlkZWEgd2hhdGV2ZXIuLi4KKyMgKGl0J3MganVzdCBhcyBsaWtlbHkgdG8gYmUgInRoZSBTdW5kYXkgd2UgcGljayBmb3IgdGhpcyB5ZWFyIi4uLikuCisKKyMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTk0LTA0LTExKToKKyMgSWYgU3VuLCAxNSBNYXJjaCwgMTk5MiB3YXMgYXQgKzEwMzAgYXMga3JlIGFzc2VydHMsIGJ1dCB5ZXQgU3VuLCAyMCBNYXJjaCwKKyMgMTk5NCB3YXMgYXQgKzA5MzAgYXMgSm9obiBDb25ub2xseSdzIGN1c3RvbWVyIHNlZW1zIHRvIGFzc2VydCwgdGhlbiBJIGNhbgorIyBvbmx5IGNvbmNsdWRlIHRoYXQgdGhlIGFjdHVhbCBydWxlIGlzIG1vcmUgY29tcGxpY2F0ZWQuLi4uCisKKyMgRnJvbSBKb2huIFdhcmJ1cnRvbiAoMTk5NC0xMC0wNyk6CisjIFRoZSBuZXcgRGF5bGlnaHQgU2F2aW5ncyBkYXRlcyBmb3IgU291dGggQXVzdHJhbGlhIC4uLgorIyB3YXMgZ2F6ZXR0ZWQgaW4gdGhlIEdvdmVybm1lbnQgSGFuc2FyZCBvbiBTZXAgMjYgMTk5NC4uLi4KKyMgc3RhcnQgb24gbGFzdCBTdW5kYXkgaW4gT2N0b2JlciBhbmQgZW5kIGluIGxhc3Qgc3VuZGF5IGluIE1hcmNoLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgorIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KKworIyBUYXNtYW5pYQorCisjIFRoZSBydWxlcyBmb3IgMTk2NyB0aHJvdWdoIDE5OTEgd2VyZSByZXBvcnRlZCBieSBHZW9yZ2UgU2hlcGhlcmQKKyMgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgIyAgVGhlIHN0YXRlIG9mIFRBU01BTklBLi4gW0NvdXJ0ZXN5IFRhc21hbmlhbiBEZXB0IG9mIFByZW1pZXIgKyBDYWJpbmV0IF0KKyMgIwkJCQkJWyBOb3YgMTk5MCBdCisKKyMgRnJvbSBCaWxsIEhhcnQgdmlhIEd1eSBIYXJyaXMgKDE5OTEtMTAtMTApOgorIyBPaCB5ZXMsIHRoZSBuZXcgZGF5bGlnaHQgc2F2aW5ncyBydWxlcyBhcmUgdW5pcXVlbHkgdGFzbWFuaWFuLCB3ZSBoYXZlCisjIDYgd2Vla3MgYSB5ZWFyIG5vdyB3aGVuIHdlIGFyZSBvdXQgb2Ygc3luYyB3aXRoIHRoZSByZXN0IG9mIEF1c3RyYWxpYQorIyAoYnV0IG5vdGhpbmcgbmV3IGFib3V0IHRoYXQpLgorCisjIEZyb20gQWxleCBMaXZpbmdzdG9uICgxOTk5LTEwLTA0KToKKyMgSSBoZWFyZCBvbiB0aGUgQUJDIChBdXN0cmFsaWFuIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbikgcmFkaW8gbmV3cyBvbiB0aGUKKyMgKGxvbmcpIHdlZWtlbmQgdGhhdCBUYXNtYW5pYSwgd2hpY2ggdXN1YWxseSBnb2VzIGl0cyBvd24gd2F5IGluIHRoaXMgcmVnYXJkLAorIyBoYXMgZGVjaWRlZCB0byBqb2luIHdpdGggbW9zdCBvZiBOU1csIHRoZSBBQ1QsIGFuZCBtb3N0IG9mIFZpY3RvcmlhCisjIChBdXN0cmFsaWEpIGFuZCBzdGFydCBkYXlsaWdodCBzYXZpbmcgb24gdGhlIGxhc3QgU3VuZGF5IGluIEF1Z3VzdCBpbiAyMDAwCisjIGluc3RlYWQgb2YgdGhlIGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyLgorCisjIFNpbSBBbGFtICgyMDAwLTA3LTAzKSByZXBvcnRlZCBhIGxlZ2FsIGNpdGF0aW9uIGZvciB0aGUgMjAwMC8yMDAxIHJ1bGVzOgorIyBodHRwOi8vd3d3LnRoZWxhdy50YXMuZ292LmF1L2ZyYWd2aWV3LzQyKysxOTY4K0dTM0FARU4rMjAwMDA3MDMwMAorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgorIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KKworIyBWaWN0b3JpYQorCisjIFRoZSBydWxlcyBmb3IgMTk3MSB0aHJvdWdoIDE5OTEgd2VyZSByZXBvcnRlZCBieSBHZW9yZ2UgU2hlcGhlcmQKKyMgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgIyAgIFRoZSBzdGF0ZSBvZiBWSUNUT1JJQS4uIFsgQ291cnRlc3kgb2YgVmljLiBEZXB0IG9mIFByZW1pZXIgKyBDYWJpbmV0IF0KKyMgIwkJCQkJCVsgTm92IDE5OTAgXQorCisjIEZyb20gU2NvdHQgSGFycmluZ3RvbiAoMjAwMS0wOC0yOSk6CisjIE9uIEtRRUQncyAiQ2l0eSBBcnRzIGFuZCBMZWN0dXJlcyIgcHJvZ3JhbSBsYXN0IG5pZ2h0IEkgaGVhcmQgYW4KKyMgaW50ZXJlc3Rpbmcgc3RvcnkgYWJvdXQgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLiAgRHIuIEpvaG4gSGVpbGJyb24gd2FzCisjIGRpc2N1c3NpbmcgaGlzIGJvb2sgIlRoZSBTdW4gaW4gdGhlIENodXJjaDogQ2F0aGVkcmFscyBhcyBTb2xhcgorIyBPYnNlcnZhdG9yaWVzIlsxXSwgYW5kIGluIHBhcnRpY3VsYXIgdGhlIFNocmluZSBvZiBSZW1lbWJyYW5jZVsyXSBsb2NhdGVkCisjIGluIE1lbGJvdXJuZSwgQXVzdHJhbGlhLgorIworIyBBcHBhcmVudGx5IHRoZSBzaHJpbmUncyBtYWluIHB1cnBvc2UgaXMgYSBiZWFtIG9mIHN1bmxpZ2h0IHdoaWNoCisjIGlsbHVtaW5hdGVzIGEgc3BlY2lhbCBzcG90IG9uIHRoZSBmbG9vciBhdCB0aGUgMTF0aCBob3VyIG9mIHRoZSAxMXRoIGRheQorIyBvZiB0aGUgMTF0aCBtb250aCAoUmVtZW1icmFuY2UgRGF5KSBldmVyeSB5ZWFyIGluIG1lbW9yeSBvZiBBdXN0cmFsaWEncworIyBmYWxsZW4gV1dJIHNvbGRpZXJzLiAgQW5kIGlmIHlvdSBnbyB0aGVyZSBvbiBOb3YuIDExLCBhdCAxMWFtIGxvY2FsIHRpbWUsCisjIHlvdSB3aWxsIGluZGVlZCBzZWUgdGhlIHN1bmJlYW0gaWxsdW1pbmF0ZSB0aGUgc3BlY2lhbCBzcG90IGF0IHRoZQorIyBleHBlY3RlZCB0aW1lLgorIworIyBIb3dldmVyLCB0aGF0IGlzIG9ubHkgYmVjYXVzZSBvZiBzb21lIHNwZWNpYWwgbWlycm9yIGNvbnRyYXB0aW9uIHRoYXQgaGFkCisjIHRvIGJlIGVtcGxveWVkLCBzaW5jZSBkdWUgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lLCB0aGUgdHJ1ZSBzb2xhciB0aW1lIG9mCisjIHRoZSByZW1lbWJyYW5jZSBtb21lbnQgb2NjdXJzIG9uZSBob3VyIGxhdGVyIChvciBlYXJsaWVyPykuICBQZXJoYXBzCisjIHNvbWVvbmUgd2l0aCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMganVyeS1yaWcgY2FuIHRlbGwgdXMgbW9yZS4KKyMKKyMgWzFdIGh0dHA6Ly93d3cuaHVwLmhhcnZhcmQuZWR1L2NhdGFsb2cvSEVJU1VOLmh0bWwKKyMgWzJdIGh0dHA6Ly93d3cuc2hyaW5lLm9yZy5hdQorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgorIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KKworIyBOZXcgU291dGggV2FsZXMKKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbjoKKyMgTmV3IFNvdXRoIFdhbGVzIGFuZCBzdWJqdXJpc2RpY3Rpb25zIGhhdmUgdGhlaXIgb3duIGlkZWFzIG9mIGEgZnVuIHRpbWUuCisjIEJhc2VkIG9uIGxhdyBsaWJyYXJ5IHJlc2VhcmNoIGJ5IEpvaG4gTWFja2luLAorIyB3aG8gbm90ZXM6CisjCUluIEF1c3RyYWxpYSwgdGltZSBpcyBub3QgbGVnaXNsYXRlZCBmZWRlcmFsbHksIGJ1dCByYXRoZXIgYnkgdGhlCisjCWluZGl2aWR1YWwgc3RhdGVzLiAgVGh1cywgd2hpbGUgc3VjaCB0ZXJtcyBhcyBgYEVhc3Rlcm4gU3RhbmRhcmQgVGltZScnCisjCVtJIG1lYW4sIG9mIGNvdXJzZSwgQXVzdHJhbGlhbiBFU1QsIG5vdCBhbnkgb3RoZXIga2luZF0gYXJlIGluIGNvbW1vbgorIwl1c2UsIF90aGV5IGhhdmUgTk8gUkVBTCBNRUFOSU5HXywgYXMgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gdGhlCisjCWxlZ2lzbGF0aW9uLiAgVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kLgorIwlJIGhhdmUgcmVzZWFyY2hlZCBOZXcgU291dGggV2FsZXMgdGltZSBvbmx5Li4uCisKKyMgRnJvbSBFcmljIFVsZXZpayAoMTk5OS0wNS0yNik6CisjIERTVCB3aWxsIHN0YXJ0IGluIE5TVyBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgQXVndXN0LCByYXRoZXIgdGhhbiB0aGUgdXN1YWwKKyMgT2N0b2JlciBpbiAyMDAwLiAgW1NlZTogTWF0dGhldyBNb29yZSwKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5zbWguY29tLmF1L25ld3MvOTkwNS8yNi9wYWdlb25lL3BhZ2VvbmU0Lmh0bWwiPgorIyBUd28gbW9udGhzIG1vcmUgZGF5bGlnaHQgc2F2aW5nCisjIDwvYT4KKyMgU3lkbmV5IE1vcm5pbmcgSGVyYWxkICgxOTk5LTA1LTI2KS5dCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yNyk6CisjIFNlZSB0aGUgZm9sbG93aW5nIG9mZmljaWFsIE5TVyBzb3VyY2U6CisjIDxhIGhyZWY9Imh0dHA6Ly9kaXIuZ2lzLm5zdy5nb3YuYXUvY2dpLWJpbi9nZW5vYmplY3QvZG9jdW1lbnQvb3RoZXIvZGF5bGlnaHRzYXZpbmcvdGlnR21aIj4KKyMgRGF5bGlnaHQgU2F2aW5nIGluIE5ldyBTb3V0aCBXYWxlcy4KKyMgPC9hPgorIworIyBOYXJyYWJyaSBTaGlyZSAoTlNXKSBjb3VuY2lsIGhhcyBhbm5vdW5jZWQgaXQgd2lsbCBpZ25vcmUgdGhlIGV4dGVuc2lvbiBvZgorIyBkYXlsaWdodCBzYXZpbmcgbmV4dCB5ZWFyLiAgU2VlOgorIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9uZXdlbmcvbW9udGhseS9yZWdlbmctMjJqdWwxOTk5LTEuaHRtIj4KKyMgTmFycmFicmkgQ291bmNpbCB0byBpZ25vcmUgZGF5bGlnaHQgc2F2aW5nCisjIDwvYT4gKDE5OTktMDctMjIpLiAgRm9yIG5vdywgd2UnbGwgd2FpdCB0byBzZWUgaWYgdGhpcyByZWFsbHkgaGFwcGVucy4KKyMKKyMgVmljdG9yaWEgd2lsbCBmb2xsb3dpbmcgTlNXLiAgU2VlOgorIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9sb2NhbC9uZXdzL29seW1waWNzLzE5OTkvMDcvaXRlbTE5OTkwNzI4MTEyMzE0XzEuaHRtIj4KKyMgVmljIHRvIGV4dGVuZCBkYXlsaWdodCBzYXZpbmcKKyMgPC9hPiAoMTk5OS0wNy0yOCkuCisjCisjIEhvd2V2ZXIsIFNvdXRoIEF1c3RyYWxpYSByZWplY3RlZCB0aGUgRFNUIHJlcXVlc3QuICBTZWU6CisjIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3Mvb2x5bXBpY3MvMTk5OS8wNy9pdGVtMTk5OTA3MTkxNTE3NTRfMS5odG0iPgorIyBTb3V0aCBBdXN0cmFsaWEgcmVqZWN0cyBPbHltcGljcyBkYXlsaWdodCBzYXZpbmdzIHJlcXVlc3QKKyMgPC9hPiAoMTk5OS0wNy0xOSkuCisjCisjIFF1ZWVuc2xhbmQgYWxzbyB3aWxsIG5vdCBvYnNlcnZlIERTVCBmb3IgdGhlIE9seW1waWNzLiAgU2VlOgorIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDYvaXRlbTE5OTkwNjAxMTE0NjA4XzEuaHRtIj4KKyMgUWxkIHNheXMgbm8gdG8gZGF5bGlnaHQgc2F2aW5ncyBmb3IgT2x5bXBpY3MKKyMgPC9hPiAoMTk5OS0wNi0wMSksIHdoaWNoIHF1b3RlcyBRdWVlbnNsYW5kIFByZW1pZXIgUGV0ZXIgQmVhdHRpZSBhcyBzYXlpbmcKKyMgYGBMb29rIHlvdSd2ZSBnb3QgdG8gcmVtZW1iZXIgaW4gbXkgZmFtaWx5IHdoZW4gdGhpcyBjYW1lIHVwIGxhc3QgdGltZQorIyBJIHZvdGVkIGZvciBpdCwgbXkgd2lmZSB2b3RlZCBhZ2FpbnN0IGl0IGFuZCBzaGUgc2FpZCB0byBtZSBpdCdzIGFsbCB2ZXJ5CisjIHdlbGwgZm9yIHlvdSwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZ2V0dGluZyB0aGUgY2hpbGRyZW4gb3V0IG9mCisjIGJlZCwgZ2V0dGluZyB0aGVtIHRvIHNjaG9vbCwgZ2V0dGluZyB0aGVtIHRvIHNsZWVwIGF0IG5pZ2h0LgorIyBJJ3ZlIGJlZW4gdGhyb3VnaCBhbGwgdGhpcyBhcmd1bWVudCBkb21lc3RpY2FsbHkuLi5teSB3aWZlIHJ1bGVzLicnCisjCisjIEJyb2tlbiBIaWxsIHdpbGwgc3RpY2sgd2l0aCBTb3V0aCBBdXN0cmFsaWFuIHRpbWUgaW4gMjAwMC4gIFNlZToKKyMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9yZWdpb25hbHMvYnJva2VuaC9tb250aGx5L3JlZ2Jyb2stMjFqdWwxOTk5LTYuaHRtIj4KKyMgQnJva2VuIEhpbGwgdG8gYmUgYmVoaW5kIHRoZSB0aW1lcworIyA8L2E+ICgxOTk5LTA3LTIxKS4KKworIyBJQVRBIFNTSU0gKDE5OTgtMDkpIHNheXMgdGhhdCB0aGUgc3ByaW5nIDIwMDAgY2hhbmdlIGZvciBBdXN0cmFsaWFuCisjIENhcGl0YWwgVGVycml0b3J5LCBOZXcgU291dGggV2FsZXMgZXhjZXB0IExvcmQgSG93ZSBJc2xhbmQgYW5kIEJyb2tlbgorIyBIaWxsLCBhbmQgVmljdG9yaWEgd2lsbCBiZSBBdWd1c3QgMjcsIHByZXN1bWFibHkgZHVlIHRvIHRoZSBTeWRuZXkgT2x5bXBpY3MuCisKKyMgRnJvbSBFcmljIFVsZXZpaywgcmVmZXJyaW5nIHRvIFN5ZG5leSdzIFN1biBIZXJhbGQgKDIwMDAtMDgtMTMpLCBwYWdlIDI5OgorIyBUaGUgUXVlZW5zbGFuZCBQcmVtaWVyIFBldGVyIEJlYXR0aWUgaXMgZW5jb3VyYWdpbmcgbm9ydGhlcm4gTlNXCisjIHRvd25zIHRvIHVzZSBRdWVlbnNsYW5kIHRpbWUuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6CisjIFNlZSAic291dGhlYXN0IEF1c3RyYWxpYSIgYWJvdmUgZm9yIDIwMDggYW5kIGxhdGVyLgorCisjIFlhbmNvd2lubmEKKworIyBGcm9tIEpvaG4gTWFja2luICgxOTg5LTAxLTA0KToKKyMgYEJyb2tlbiBIaWxsJyBtZWFucyB0aGUgQ291bnR5IG9mIFlhbmNvd2lubmEuCisKKyMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgIyBZQU5DT1dJTk5BLi4gIFsgQ29uZmlybWF0aW9uIGNvdXJ0ZXN5IG9mIEJyb2tlbiBIaWxsIFBvc3RtYXN0ZXIgXQorIyAjCQkJCQlbIERlYyAxOTkwIF0KKyMgLi4uCisjICMgWWFuY293aW5uYSB1c2VzIENlbnRyYWwgU3RhbmRhcmQgVGltZSwgZGVzcGl0ZSBbaXRzXSBsb2NhdGlvbiBvbiB0aGUKKyMgIyBOZXcgU291dGggV2FsZXMgc2lkZSBvZiB0aGUgUy5BLiBib3JkZXIuIE1vc3QgYnVzaW5lc3MgYW5kIHNvY2lhbCBkZWFsaW5ncworIyAjIGFyZSB3aXRoIENTVCB6b25lcywgdGhlcmVmb3JlIENTVCBpcyBsZWdpc2xhdGVkIGJ5IGxvY2FsIGdvdmVybm1lbnQKKyMgIyBhbHRob3VnaCB0aGUgc3dpdGNoIHRvIFN1bW1lciBUaW1lIG9jY3VycyBpbiBsaW5lIHdpdGggTi5TLlcuIFRoZXJlIGhhdmUKKyMgIyBiZWVuIHllYXJzIHdoZW4gdGhpcyBkaWQgbm90IGFwcGx5LCBidXQgdGhlIGhpc3RvcmljYWwgZGF0YSBpcyBub3QKKyMgIyBwcmVzZW50bHkgYXZhaWxhYmxlLgorIyBab25lCUF1c3RyYWxpYS9ZYW5jb3dpbm5hCTk6MzAJIEFZCSVzU1QKKyMgLi4uCisjIFJ1bGUJIEFZCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECisjIFJ1bGUJIEFZCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTM6MDAJMAlDCisjIFtmb2xsb3dlZCBieSBvdGhlciBSdWxlc10KKworIyBMb3JkIEhvd2UgSXNsYW5kCisKKyMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgTEhJLi4uCQlbIENvdXJ0ZXN5IG9mIFBhdWxpbmUgVmFuIFdpbnNlbiBdCisjCQkJCQlbIERlYyAxOTkwIF0KKyMgTG9yZCBIb3dlIElzbGFuZCBpcyBsb2NhdGVkIG9mZiB0aGUgTmV3IFNvdXRoIFdhbGVzIGNvYXN0LCBhbmQgaXMgaGFsZiBhbgorIyBob3VyIGFoZWFkIG9mIE5TVyB0aW1lLgorCisjIEZyb20gSmFtZXMgTG9uZXJnYW4sIFNlY3JldGFyeSwgTG9yZCBIb3dlIElzbGFuZCBCb2FyZCAoMjAwMC0wMS0yNyk6CisjIExvcmQgSG93ZSBJc2xhbmQgc3VtbWVyIHRpbWUgaW4gMjAwMC8yMDAxIHdpbGwgY29tbWVuY2Ugb24gdGhlIHNhbWUKKyMgZGF0ZSBhcyB0aGUgcmVzdCBvZiBOU1cgKGkuZS4gMjAwMC0wOC0yNykuICBGb3IgeW91ciBpbmZvcm1hdGlvbiB0aGUKKyMgTG9yZCBIb3dlIElzbGFuZCBCb2FyZCAoY29udHJvbGxpbmcgYXV0aG9yaXR5IGZvciB0aGUgSXNsYW5kKSBpcworIyBzZWVraW5nIHRoZSBjb21tdW5pdHkncyB2aWV3cyBvbiB2YXJpb3VzIG9wdGlvbnMgZm9yIHN1bW1lciB0aW1lCisjIGFycmFuZ2VtZW50cyBvbiB0aGUgSXNsYW5kLCBlLmcuIGFkdmFuY2UgY2xvY2tzIGJ5IDEgZnVsbCBob3VyCisjIGluc3RlYWQgb2Ygb25seSAzMCBtaW51dGVzLiAgRGVwZW5kYW50IG9uIHRoZSB3aXNoZXMgb2YgcmVzaWRlbnRzCisjIHRoZSBCb2FyZCBtYXkgYXBwcm9hY2ggdGhlIE5TVyBnb3Zlcm5tZW50IHRvIGNoYW5nZSB0aGUgZXhpc3RpbmcKKyMgYXJyYW5nZW1lbnRzLiAgVGhlIHN0YXJ0aW5nIGRhdGUgZm9yIHN1bW1lciB0aW1lIG9uIHRoZSBJc2xhbmQgd2lsbAorIyBob3dldmVyIGFsd2F5cyBjb2luY2lkZSB3aXRoIHRoZSByZXN0IG9mIE5TVy4KKworIyBGcm9tIEphbWVzIExvbmVyZ2FuLCBTZWNyZXRhcnksIExvcmQgSG93ZSBJc2xhbmQgQm9hcmQgKDIwMDAtMTAtMjUpOgorIyBMb3JkIEhvd2UgSXNsYW5kIGFkdmFuY2VzIGNsb2NrcyBieSAzMCBtaW51dGVzIGR1cmluZyBEU1QgaW4gTlNXIGFuZCByZXRhcmRzCisjIGNsb2NrcyBieSAzMCBtaW51dGVzIHdoZW4gRFNUIGZpbmlzaGVzLiBTaW5jZSBEU1Qgd2FzIG1vc3QgcmVjZW50bHkKKyMgaW50cm9kdWNlZCBpbiBOU1csIHRoZSAiY2hhbmdlb3ZlciIgdGltZSBvbiB0aGUgSXNsYW5kIGhhcyBiZWVuIDAyOjAwIGFzCisjIHNob3duIG9uIGNsb2NrcyBvbiBMSEkuIEkgZ3Vlc3MgdGhpcyBtZWFucyB0aGF0IGZvciAzMCBtaW51dGVzIGF0IHRoZSBzdGFydAorIyBvZiBEU1QsIExISSBpcyBhY3R1YWxseSAxIGhvdXIgYWhlYWQgb2YgdGhlIHJlc3Qgb2YgTlNXLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBGb3IgTG9yZCBIb3dlIGRhdGVzIHdlIHVzZSBTaGFua3MgJiBQb3R0ZW5nZXIgdGhyb3VnaCAxOTg5LCBhbmQKKyMgTG9uZXJnYW4gdGhlcmVhZnRlci4gIEZvciB0aW1lcyB3ZSB1c2UgTG9uZXJnYW4uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6CisjIFNlZSAic291dGhlYXN0IEF1c3RyYWxpYSIgYWJvdmUgZm9yIDIwMDggYW5kIGxhdGVyLgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA0LTI4KToKKyMgQWNjb3JkaW5nIHRvIHRoZSBvZmZpY2lhbCBwcmVzcyByZWxlYXNlLCBTb3V0aCBBdXN0cmFsaWEncyBleHRlbmRlZCBkYXlsaWdodCAKKyMgc2F2aW5nIHBlcmlvZCB3aWxsIGNvbnRpbnVlIHdpdGggdGhlIHNhbWUgcnVsZXMgYXMgdXNlZCBkdXJpbmcgdGhlIDIwMDgtMjAwOSAKKyMgc3VtbWVyIChzb3V0aGVybiBoZW1pc3BoZXJlKS4KKyMgCisjIEZyb20KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYWZld29yay5zYS5nb3YuYXUvdXBsb2FkZWRfZmlsZXMvRGF5bGlnaHREYXRlc1NldC5wZGYiPgorIyBodHRwOi8vd3d3LnNhZmV3b3JrLnNhLmdvdi5hdS91cGxvYWRlZF9maWxlcy9EYXlsaWdodERhdGVzU2V0LnBkZgorIyA8L2E+CisjIFRoZSBleHRlbmRlZCBkYXlsaWdodCBzYXZpbmcgcGVyaW9kIHRoYXQgU291dGggQXVzdHJhbGlhIGhhcyBiZWVuIHRyaWFsbGluZyAKKyMgZm9yIG92ZXIgdGhlIGxhc3QgeWVhciBpcyBub3cgc2V0IHRvIGJlIG9uZ29pbmcuCisjIERheWxpZ2h0IHNhdmluZyB3aWxsIGNvbnRpbnVlIHRvIHN0YXJ0IG9uIHRoZSBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciBlYWNoIAorIyB5ZWFyIGFuZCBmaW5pc2ggb24gdGhlIGZpcnN0IFN1bmRheSBpbiBBcHJpbCB0aGUgZm9sbG93aW5nIHllYXIuCisjIEluZHVzdHJpYWwgUmVsYXRpb25zIE1pbmlzdGVyLCBQYXVsIENhaWNhLCBzYXlzIHRoaXMgcHJvdmlkZXMgU291dGggQXVzdHJhbGlhIAorIyB3aXRoIGEgY29uc2lzdGVudCBoYWxmIGhvdXIgdGltZSBkaWZmZXJlbmNlIHdpdGggTlNXLCBWaWN0b3JpYSwgVGFzbWFuaWEgYW5kIAorIyB0aGUgQUNUIGZvciBhbGwgNTIgd2Vla3Mgb2YgdGhlIHllYXIuLi4KKyMgCisjIFdlIGhhdmUgYSB3cmFwLXVwIGhlcmU6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbCI+CisjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbAorIyA8L2E+CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTmV3IFplYWxhbmQKKworIyBGcm9tIE1hcmsgRGF2aWVzICgxOTkwLTEwLTAzKToKKyMgdGhlIDE5ODkvOTAgeWVhciB3YXMgYSB0cmlhbCBvZiBhbiBleHRlbmRlZCAiZGF5bGlnaHQgc2F2aW5nIiBwZXJpb2QuCisjIFRoaXMgdHJpYWwgd2FzIGRlZW1lZCBzdWNjZXNzZnVsIGFuZCB0aGUgZXh0ZW5kZWQgcGVyaW9kIGFkb3B0ZWQgZm9yCisjIHN1YnNlcXVlbnQgeWVhcnMgKHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgZnVydGhlciB3ZWVrIGF0IHRoZSBzdGFydCkuCisjIHNvdXJjZSAtLSBwaG9uZSBjYWxsIHRvIE1pbmlzdHJ5IG9mIEludGVybmFsIEFmZmFpcnMgSGVhZCBPZmZpY2UuCisKKyMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKKyMgIyBUaGUgQ291bnRyeSBvZiBOZXcgWmVhbGFuZCAgIChBdXN0cmFsaWEncyBlYXN0IGlzbGFuZCAtKSBHZWUgdGhleSBoYXRlIHRoYXQhCisjICMJCQkJICAgb3IgaXMgQXVzdHJhbGlhIHRoZSB3ZXN0IGlzbGFuZCBvZiBOLlouCisjICMJWyBjb3VydGVzeSBvZiBHZW9mZiBUcmliYmxlLi4gQXVja2xhbmQgTi5aLiBdCisjICMJCQkJWyBOb3YgMTk5MCBdCisjIC4uLgorIyBSdWxlCU5aICAgICAgMTk3NCAgICAxOTg4CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKKyMgUnVsZQlOWgkxOTg5CW1heAktCU9jdAlTdW4+PTEJMjowMAkxOjAwCUQKKyMgUnVsZQlOWiAgICAgIDE5NzUgICAgMTk4OQktCU1hcglTdW4+PTEJMzowMAkwCVMKKyMgUnVsZQlOWgkxOTkwCW1heAktCU1hcglsYXN0U3VuCTM6MDAJMAlTCisjIC4uLgorIyBab25lCU5aCQkJMTI6MDAJTloJCU5aJXNUCSMgTmV3IFplYWxhbmQKKyMgWm9uZQlOWi1DSEFUCQkJMTI6NDUJLQkJTlotQ0hBVCAjIENoYXRoYW0gSXNsYW5kCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTItMDMtMDgpOgorIyBUaGUgY2hvc2VuIHJ1bGVzIHVzZSB0aGUgRGF2aWVzIE9jdG9iZXIgOCB2YWx1ZXMgZm9yIHRoZSBzdGFydCBvZiBEU1QgaW4gMTk4OQorIyByYXRoZXIgdGhhbiB0aGUgT2N0b2JlciAxIHZhbHVlLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMTItMTkpOworIyBTaGFuayAmIFBvdHRlbmdlciByZXBvcnQgMjowMCBmb3IgYWxsIGF1dHVtbiBjaGFuZ2VzIGluIEF1c3RyYWxpYSBhbmQgTlouCisjIFJvYmVydCBVemdhbGlzIHdyaXRlcyB0aGF0IHRoZSBOZXcgWmVhbGFuZCBEYXlsaWdodAorIyBTYXZpbmdzIFRpbWUgT3JkZXIgaW4gQ291bmNpbCBkYXRlZCAxOTkwLTA2LTE4IHNwZWNpZmllcyAyOjAwIHN0YW5kYXJkCisjIHRpbWUgb24gYm90aCB0aGUgZmlyc3QgU3VuZGF5IGluIE9jdG9iZXIgYW5kIHRoZSB0aGlyZCBTdW5kYXkgaW4gTWFyY2guCisjIEFzIHdpdGggQXVzdHJhbGlhLCB3ZSdsbCBhc3N1bWUgdGhlIHRyYWRpdGlvbiBpcyAyOjAwcywgbm90IDI6MDAuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBUaGUgRGVwYXJ0bWVudCBvZiBJbnRlcm5hbCBBZmZhaXJzIChESUEpIG1haW50YWlucyBhIGJyaWVmIGhpc3RvcnksCisjIGFzIGRvZXMgQ2Fyb2wgU3F1aXJlczsgc2VlIHR6LWxpbmsuaHRtIGZvciB0aGUgZnVsbCByZWZlcmVuY2VzLgorIyBVc2UgdGhlc2Ugc291cmNlcyBpbiBwcmVmZXJlbmNlIHRvIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMKKyMgRm9yIENoYXRoYW0sIElBVEEgU1NJTSAoMTk5MS8xOTk5KSBnaXZlcyB0aGUgTlogcnVsZXMgYnV0IHdpdGgKKyMgdHJhbnNpdGlvbnMgYXQgMjo0NSBsb2NhbCBzdGFuZGFyZCB0aW1lOyB0aGlzIGNvbmZpcm1zIHRoYXQgQ2hhdGhhbQorIyBpcyBhbHdheXMgZXhhY3RseSA0NSBtaW51dGVzIGFoZWFkIG9mIEF1Y2tsYW5kLgorCisjIEZyb20gQ29saW4gU2hhcnBsZXMgKDIwMDctMDQtMzApOgorIyBEU1Qgd2lsbCBub3cgc3RhcnQgb24gdGhlIGxhc3QgU3VuZGF5IGluIFNlcHRlbWJlciwgYW5kIGVuZCBvbiB0aGUKKyMgZmlyc3QgU3VuZGF5IGluIEFwcmlsLiAgVGhlIGNoYW5nZXMgdGFrZSBlZmZlY3QgdGhpcyB5ZWFyLCBtZWFuaW5nCisjIHRoYXQgRFNUIHdpbGwgYmVnaW4gb24gMjAwNy0wOS0zMCAyMDA4LTA0LTA2LgorIyBodHRwOi8vd3d3LmRpYS5nb3Z0Lm56L2RpYXdlYnNpdGUubnNmL3dwZ19VUkwvU2VydmljZXMtRGF5bGlnaHQtU2F2aW5nLURheWxpZ2h0LXNhdmluZy10by1iZS1leHRlbmRlZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBGaWppCisKKyMgSG93c2Ugd3JpdGVzIChwIDE1MykgdGhhdCBpbiAxODc5IHRoZSBCcml0aXNoIGdvdmVybm9yIG9mIEZpamkKKyMgZW5hY3RlZCBhbiBvcmRpbmFuY2Ugc3RhbmRhcmRpemluZyB0aGUgaXNsYW5kcyBvbiBBbnRpcG9kZWFuIFRpbWUKKyMgaW5zdGVhZCBvZiB0aGUgQW1lcmljYW4gc3lzdGVtICh3aGljaCB3YXMgb25lIGRheSBiZWhpbmQpLgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDE5OTgtMTAtMDgpOgorIyBGaWppIHdpbGwgaW50cm9kdWNlIERTVCBlZmZlY3RpdmUgMDIwMCBsb2NhbCB0aW1lLCAxOTk4LTExLTAxCisjIHVudGlsIDAzMDAgbG9jYWwgdGltZSAxOTk5LTAyLTI4LiAgRWFjaCB5ZWFyIHRoZSBEU1QgcGVyaW9kIHdpbGwKKyMgYmUgZnJvbSB0aGUgZmlyc3QgU3VuZGF5IGluIE5vdmVtYmVyIHVudGlsIHRoZSBsYXN0IFN1bmRheSBpbiBGZWJydWFyeS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTAxLTA4KToKKyMgSUFUQSBTU0lNICgxOTk5LTA5KSBzYXlzIERTVCBlbmRzIDAxMDAgbG9jYWwgdGltZS4gIEdvIHdpdGggTWNEb3cuCisKKyMgRnJvbSB0aGUgQkJDIFdvcmxkIFNlcnZpY2UgKDE5OTgtMTAtMzEgMTE6MzIgVVRDKToKKyMgVGhlIEZpamlpYW4gZ292ZXJubWVudCBzYXlzIHRoZSBtYWluIHJlYXNvbnMgZm9yIHRoZSB0aW1lIGNoYW5nZSBpcyB0bworIyBpbXByb3ZlIHByb2R1Y3Rpdml0eSBhbmQgcmVkdWNlIHJvYWQgYWNjaWRlbnRzLiAgQnV0IGNvcnJlc3BvbmRlbnRzIHNheSBpdAorIyBhbHNvIGhvcGVzIHRoZSBtb3ZlIHdpbGwgYm9vc3QgRmlqaSdzIGFiaWxpdHkgdG8gY29tcGV0ZSB3aXRoIG90aGVyIHBhY2lmaWMKKyMgaXNsYW5kcyBpbiB0aGUgZWZmb3J0IHRvIGF0dHJhY3QgdG91cmlzdHMgdG8gd2l0bmVzcyB0aGUgZGF3bmluZyBvZiB0aGUgbmV3CisjIG1pbGxlbml1bS4KKworIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL3ByZXNzLzIwMDBfMDkvMjAwMF8wOV8xMy0wNS5zaHRtbCAoMjAwMC0wOS0xMykKKyMgcmVwb3J0cyB0aGF0IEZpamkgaGFzIGRpc2NvbnRpbnVlZCBEU1QuCisKKyMgSm9obnN0b24KKworIyBKb2huc3RvbiBkYXRhIGlzIGZyb20gdXNubzE5OTUuCisKKworIyBLaXJpYmF0aQorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDEtMjIpOgorIyBUb2RheSdzIF9XYWxsIFN0cmVldCBKb3VybmFsXyAocGFnZSAxKSByZXBvcnRzIHRoYXQgS2lyaWJhdGkKKyMgYGBkZWNsYXJlZCBpdCB0aGUgc2FtZSBkYXkgdGhyb3VnaHQgdGhlIGNvdW50cnkgYXMgb2YgSmFuLiAxLCAxOTk1JycKKyMgYXMgcGFydCBvZiB0aGUgY29tcGV0aXRpb24gdG8gYmUgZmlyc3QgaW50byB0aGUgMjFzdCBjZW50dXJ5LgorCisKKyMgS3dhamFsZWluCisKKyMgSW4gY29tcC5yaXNrcyAxNC44NyAoMjYgQXVndXN0IDE5OTMpLCBQZXRlciBOZXVtYW5uIHdyaXRlczoKKyMgSSB3b25kZXIgd2hhdCBoYXBwZW5lZCBpbiBLd2FqYWxlaW4sIHdoZXJlIHRoZXJlIHdhcyBOTyBGcmlkYXksCisjIDE5OTMtMDgtMjAuICBUaHVyc2RheSBuaWdodCBhdCBtaWRuaWdodCBLd2FqYWxlaW4gc3dpdGNoZWQgc2lkZXMgd2l0aAorIyByZXNwZWN0IHRvIHRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSwgdG8gcmVqb2luIGl0cyBmZWxsb3cgaXNsYW5kcywKKyMgZ29pbmcgZnJvbSAxMTo1OSBwLm0uIFRodXJzZGF5IHRvIDEyOjAwIG0uIFNhdHVyZGF5IGluIGEgYmxpbmsuCisKKworIyBOIE1hcmlhbmEgSXMsIEd1YW0KKworIyBIb3dzZSB3cml0ZXMgKHAgMTUzKSBgYFRoZSBTcGFuaWFyZHMsIG9uIHRoZSBvdGhlciBoYW5kLCByZWFjaGVkIHRoZQorIyBQaGlsaXBwaW5lcyBhbmQgdGhlIExhZHJvbmVzIGZyb20gQW1lcmljYSwnJyBhbmQgaW1wbGllcyB0aGF0IHRoZSBMYWRyb25lcworIyAobm93IGNhbGxlZCB0aGUgTWFyaWFuYXMpIGtlcHQgQW1lcmljYW4gZGF0ZSBmb3IgcXVpdGUgc29tZSB0aW1lLgorIyBGb3Igbm93LCB3ZSBhc3N1bWUgdGhlIExhZHJvbmVzIHN3aXRjaGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIFBoaWxpcHBpbmVzOworIyBzZWUgQXNpYS9NYW5pbGEuCisKKyMgVVMgUHVibGljIExhdyAxMDYtNTY0ICgyMDAwLTEyLTIzKSBtYWRlIFVUQysxMCB0aGUgb2ZmaWNpYWwgc3RhbmRhcmQgdGltZSwKKyMgdW5kZXIgdGhlIG5hbWUgIkNoYW1vcnJvIFN0YW5kYXJkIFRpbWUiLiAgVGhlcmUgaXMgbm8gb2ZmaWNpYWwgYWJicmV2aWF0aW9uLAorIyBidXQgQ29uZ3Jlc3NtYW4gUm9iZXJ0IEEuIFVuZGVyd29vZCwgYXV0aG9yIG9mIHRoZSBiaWxsIHRoYXQgYmVjYW1lIGxhdywKKyMgd3JvdGUgaW4gYSBwcmVzcyByZWxlYXNlICgyMDAwLTEyLTI3KSB0aGF0IGhlIHdpbGwgc2VlayB0aGUgdXNlIG9mICJDaFNUIi4KKworCisjIE1pY3JvbmVzaWEKKworIyBBbGFuIEV1Z2VuZSBEYXZpcyB3cml0ZXMgKDE5OTYtMDMtMTYpLAorIyBgYEkgYW0gY2VydGFpbiwgaGF2aW5nIGxpdmVkIHRoZXJlIGZvciB0aGUgcGFzdCBkZWNhZGUsIHRoYXQgIlRydWsiCisjIChub3cgcHJvcGVybHkga25vd24gYXMgQ2h1dWspIC4uLiBpcyBpbiB0aGUgdGltZSB6b25lIEdNVCsxMC4nJworIworIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBUcnVrIHN3aXRjaGVkIGZyb20gVVRDKzEwIHRvIFVUQysxMQorIyBvbiAxOTc4LTEwLTAxOyBpZ25vcmUgdGhpcyBmb3Igbm93LgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTAtMjkpOgorIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIFZpc2l0b3JzIEJvYXJkIHdyaXRlcyBpbgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmZzbWdvdi5vcmcvaW5mby9jbG9ja3MuaHRtbCI+CisjIFRoZSBGZWRlcmF0ZWQgU3RhdGVzIG9mIE1pY3JvbmVzaWEgLSBWaXNpdG9yIEluZm9ybWF0aW9uCisjIDwvYT4gKDE5OTktMDEtMjYpCisjIHRoYXQgVHJ1ayBhbmQgWWFwIGFyZSBVVEMrMTAsIGFuZCBQb25hcGUgYW5kIEtvc3JhZSBhcmUgVVRDKzExLgorIyBXZSBkb24ndCBrbm93IHdoZW4gS29zcmFlIHN3aXRjaGVkIGZyb20gVVRDKzEyOyBhc3N1bWUgSmFudWFyeSAxIGZvciBub3cuCisKKworIyBNaWR3YXkKKworIyBGcm9tIENoYXJsZXMgVCBPJ0Nvbm5vciwgS01USCBESiAoMTk1NiksCisjIHF1b3RlZCBpbiB0aGUgS1RNSCBzZWN0aW9uIG9mIHRoZSBSYWRpbyBIZXJpdGFnZSBDb2xsZWN0aW9uCisjIDxodHRwOi8vcmFkaW9keC5jb20vc3BkeHIvS01USC5odG0+ICgyMDAyLTEyLTMxKToKKyMgRm9yIHRoZSBwYXN0IHR3byBtb250aHMgd2UndmUgYmVlbiBvbiB3aGF0IGlzIGtub3duIGFzIERheWxpZ2h0CisjIFNhdmluZyBUaW1lLiAgVGhpcyB0aW1lIGhhcyBwdXQgdXMgb24gYWlyIGF0IDVhbSBpbiB0aGUgbW9ybmluZywKKyMgeW91ciB0aW1lIGRvd24gdGhlcmUgaW4gTmV3IFplYWxhbmQuICBTdGFydGluZyBTZXB0ZW1iZXIgMiwgMTk1NgorIyB3ZSdsbCBhZ2FpbiBnbyBiYWNrIHRvIFN0YW5kYXJkIFRpbWUuICBUaGlzJ2xsIG1lYW4gdGhhdCB3ZSdsbCBnbyB0bworIyBhaXIgYXQgNmFtIHlvdXIgdGltZS4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0yMyk6CisjIFdlIGRvbid0IGtub3cgdGhlIGRhdGUgb2YgdGhhdCBxdW90ZSwgYnV0IHdlJ2xsIGd1ZXNzIHRoZXkKKyMgc3RhcnRlZCBEU1Qgb24gSnVuZSAzLiAgUG9zc2libHkgRFNUIHdhcyBvYnNlcnZlZCBvdGhlciB5ZWFycworIyBpbiBNaWR3YXksIGJ1dCB3ZSBoYXZlIG5vIHJlY29yZCBvZiBpdC4KKworCisjIFBpdGNhaXJuCisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMTk5OS0xMS0wOCk6CisjIEEgUHJvY2xhbWF0aW9uIHdhcyBzaWduZWQgYnkgdGhlIEdvdmVybm9yIG9mIFBpdGNhaXJuIG9uIHRoZSAyN3RoIE1hcmNoIDE5OTgKKyMgd2l0aCByZWdhcmQgdG8gUGl0Y2Fpcm4gU3RhbmRhcmQgVGltZS4gIFRoZSBQcm9jbGFtYXRpb24gaXMgYXMgZm9sbG93cy4KKyMKKyMJVGhlIGxvY2FsIHRpbWUgZm9yIGdlbmVyYWwgcHVycG9zZXMgaW4gdGhlIElzbGFuZHMgc2hhbGwgYmUKKyMJQ28tb3JkaW5hdGVkIFVuaXZlcnNhbCB0aW1lIG1pbnVzIDggaG91cnMgYW5kIHNoYWxsIGJlIGtub3duCisjCWFzIFBpdGNhaXJuIFN0YW5kYXJkIFRpbWUuCisjCisjIC4uLiBJIGhhdmUgYWxzbyBzZWVuIFBpdGNhaXJuIGxpc3RlZCBhcyBVVEMgbWludXMgOSBob3VycyBpbiBzZXZlcmFsCisjIHJlZmVyZW5jZXMsIGFuZCBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGlzIHdhcyBhbiBlcnJvciBpbiBpbnRlcnByZXRhdGlvbgorIyBzb21laG93IGluIGxpZ2h0IG9mIHRoaXMgcHJvY2xhbWF0aW9uLgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDkpOgorIyBUaGUgUHJvY2xhbWF0aW9uIHJlZ2FyZGluZyBQaXRjYWlybiB0aW1lIGNhbWUgaW50byBlZmZlY3Qgb24gMjcgQXByaWwgMTk5OAorIyAuLi4gYXQgbWlkbmlnaHQuCisKKyMgRnJvbSBIb3dpZSBQaGVscHMgKDE5OTktMTEtMTApLCB3aG8gdGFsa2VkIHRvIGEgUGl0Y2Fpcm5lciB2aWEgc2hvcnR3YXZlOgorIyBCZXR0eSBDaHJpc3RpYW4gdG9sZCBtZSB5ZXN0ZXJkYXkgdGhhdCB0aGVpciBsb2NhbCB0aW1lIGlzIHRoZSBzYW1lIGFzCisjIFBhY2lmaWMgU3RhbmRhcmQgVGltZS4gVGhleSB1c2VkIHRvIGJlIDEvMiBob3VyIGRpZmZlcmVudCBmcm9tIHVzIGhlcmUgaW4KKyMgU2FjcmFtZW50byBidXQgaXQgd2FzIGNoYW5nZWQgYSBjb3VwbGUgb2YgeWVhcnMgYWdvLgorCisKKyMgU2Ftb2EKKworIyBIb3dzZSB3cml0ZXMgKHAgMTUzLCBjaXRpbmcgcCAxMCBvZiB0aGUgMTg4My0xMS0xOCBOZXcgWW9yayBIZXJhbGQpCisjIHRoYXQgaW4gMTg3OSB0aGUgS2luZyBvZiBTYW1vYSBkZWNpZGVkIHRvIGNoYW5nZQorIyBgYHRoZSBkYXRlIGluIGhpcyBraW5nZG9tIGZyb20gdGhlIEFudGlwb2RlYW4gdG8gdGhlIEFtZXJpY2FuIHN5c3RlbSwKKyMgb3JkYWluaW5nIC0tIGJ5IGEgbWFzdGVycGllY2Ugb2YgZGlwbG9tYXRpYyBmbGF0dGVyeSAtLSB0aGF0CisjIHRoZSBGb3VydGggb2YgSnVseSBzaG91bGQgYmUgY2VsZWJyYXRlZCB0d2ljZSBpbiB0aGF0IHllYXIuJycKKworCisjIFRvbmdhCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wMS0yMik6CisjIFRvZGF5J3MgX1dhbGwgU3RyZWV0IEpvdXJuYWxfIChwIDEpIHJlcG9ydHMgdGhhdCBgYFRvbmdhIGhhcyBiZWVuIHBsb3R0aW5nCisjIHRvIHNuZWFrIGFoZWFkIG9mIFtOZXcgWmVhbGFuZGVyc10gYnkgaW50cm9kdWNpbmcgZGF5bGlnaHQtc2F2aW5nIHRpbWUuJycKKyMgU2luY2UgS2lyaWJhdGkgaGFzIG1vdmVkIHRoZSBEYXRlIExpbmUgaXQncyBub3QgY2xlYXIgd2hhdCBUb25nYSB3aWxsIGRvLgorCisjIERvbiBNdW5kZWxsIHdyaXRlcyBpbiB0aGUgMTk5Ny0wMi0yMCBUb25nYSBDaHJvbmljbGUKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50b25nYXRhcHUubmV0LnRvL3RvbmdhL2hvbWVsYW5kL3RpbWViZWdpbnMuaHRtIj4KKyMgSG93IFRvbmdhIGJlY2FtZSBgVGhlIExhbmQgd2hlcmUgVGltZSBCZWdpbnMnCisjIDwvYT46CisKKyMgVW50aWwgMTk0MSBUb25nYSBtYWludGFpbmVkIGEgc3RhbmRhcmQgdGltZSA1MCBtaW51dGVzIGFoZWFkIG9mIE5aU1QKKyMgMTIgaG91cnMgYW5kIDIwIG1pbnV0ZXMgYWhlYWQgb2YgR01ULiAgV2hlbiBOZXcgWmVhbGFuZCBhZGp1c3RlZCBpdHMKKyMgc3RhbmRhcmQgdGltZSBpbiAxOTQwcywgVG9uZ2EgaGFkIHRoZSBjaG9pY2Ugb2Ygc3VidHJhY3RpbmcgZnJvbSBpdHMKKyMgbG9jYWwgdGltZSB0byBjb21lIG9uIHRoZSBzYW1lIHN0YW5kYXJkIHRpbWUgYXMgTmV3IFplYWxhbmQgb3Igb2YKKyMgYWR2YW5jaW5nIGl0cyB0aW1lIHRvIG1haW50YWluIHRoZSBkaWZmZXJlbnRpYWwgb2YgMTMgZGVncmVlcworIyAoYXBwcm94aW1hdGVseSA1MCBtaW51dGVzIGFoZWFkIG9mIE5ldyBaZWFsYW5kIHRpbWUpLgorIworIyBCZWNhdXNlIEhpcyBNYWplc3R5IEtpbmcgVGF1ZmEnYWhhdSBUdXBvdSBJViwgdGhlbiBDcm93biBQcmluY2UKKyMgVHVuZ2ksIHByZWZlcnJlZCB0byBlbnN1cmUgVG9uZ2EncyB0aXRsZSBhcyB0aGUgbGFuZCB3aGVyZSB0aW1lCisjIGJlZ2lucywgdGhlIExlZ2lzbGF0aXZlIEFzc2VtYmx5IGFwcHJvdmVkIHRoZSBsYXR0ZXIgY2hhbmdlLgorIworIyBCdXQgc29tZSBvZiB0aGUgb2xkZXIsIG1vcmUgY29uc2VydmF0aXZlIG1lbWJlcnMgZnJvbSB0aGUgb3V0ZXIKKyMgaXNsYW5kcyBvYmplY3RlZC4gIklmIGF0IG1pZG5pZ2h0IG9uIERlYy4gMzEsIHdlIG1vdmUgYWhlYWQgNDAKKyMgbWludXRlcywgYXMgeW91ciBSb3lhbCBIaWdobmVzcyB3aXNoZXMsIHdoYXQgYmVjb21lcyBvZiB0aGUgNDAKKyMgbWludXRlcyB3ZSBoYXZlIGxvc3Q/IgorIworIyBUaGUgQ3Jvd24gUHJpbmNlLCBwcmVzZW50ZWQgYW4gdW5hbnN3ZXJhYmxlIGFyZ3VtZW50OiAiUmVtZW1iZXIgdGhhdAorIyBvbiB0aGUgV29ybGQgRGF5IG9mIFByYXllciwgeW91IHdvdWxkIGJlIHRoZSBmaXJzdCBwZW9wbGUgb24gRWFydGgKKyMgdG8gc2F5IHlvdXIgcHJheWVycyBpbiB0aGUgbW9ybmluZy4iCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIHRyYW5zaXRpb24gd2FzIG9uIDE5NjgtMTAtMDE7IGdvIHdpdGggTXVuZGVsbC4KKworIyBGcm9tIEVyaWMgVWxldmlrICgxOTk5LTA1LTAzKToKKyMgVG9uZ2EncyBkaXJlY3RvciBvZiB0b3VyaXNtLCB3aG8gaXMgYWxzbyBzZWNyZXRhcnkgb2YgdGhlIE5hdGlvbmFsIE1pbGxlbml1bQorIyBDb21taXR0ZWUsIGhhcyBhIHBsYW4gdG8gZ2V0IFRvbmdhIGJhY2sgaW4gZnJvbnQuCisjIEhlIGhhcyBwcm9wb3NlZCBhIG9uZS1vZmYgbW92ZSB0byB0cm9waWNhbCBkYXlsaWdodCBzYXZpbmcgZm9yIFRvbmdhIGZyb20KKyMgT2N0b2JlciB0byBNYXJjaCwgd2hpY2ggaGFzIHdvbiBhcHByb3ZhbCBpbiBwcmluY2lwbGUgZnJvbSB0aGUgVG9uZ2FuCisjIEdvdmVybm1lbnQuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgorIyAqIFRvbmdhIHdpbGwgaW50cm9kdWNlIERTVCBpbiBOb3ZlbWJlcgorIworIyBJIHdhcyBnaXZlbiB0aGlzIGxpbmsgYnkgSm9obiBMZXR0czoKKyMgPGEgaHJlZj0iaHR0cDovL25ld3MuYmJjLmNvLnVrL2hpL2VuZ2xpc2gvd29ybGQvYXNpYS1wYWNpZmljL25ld3NpZF80MjQwMDAvNDI0NzY0LnN0bSI+CisjIGh0dHA6Ly9uZXdzLmJiYy5jby51ay9oaS9lbmdsaXNoL3dvcmxkL2FzaWEtcGFjaWZpYy9uZXdzaWRfNDI0MDAwLzQyNDc2NC5zdG0KKyMgPC9hPgorIworIyBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBmaW5kIGV4YWN0IGRhdGVzIGZvciB0aGUgdHJhbnNpdGlvbiBpbiBOb3ZlbWJlcgorIyB5ZXQuIEJ5IHJlYWRpbmcgdGhpcyBhcnRpY2xlIGl0IHNlZW1zIGxpa2UgRmlqaSB3aWxsIGJlIDE0IGhvdXJzIGFoZWFkCisjIG9mIFVUQyBhcyB3ZWxsLCBidXQgYXMgZmFyIGFzIEkga25vdyBGaWppIHdpbGwgb25seSBiZSAxMyBob3VycyBhaGVhZAorIyAoMTIgKyAxIGhvdXIgRFNUKS4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5OS0wOS0yMCk6CisjIEFjY29yZGluZyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwKKyMgPC9hPjoKKyMgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSB3aWxsIHRha2UgZWZmZWN0IG9uIE9jdC4gMiB0aHJvdWdoIEFwcmlsIDE1LCAyMDAwCisjIGFuZCBhbm51YWxseSB0aGVyZWFmdGVyIGZyb20gdGhlIGZpcnN0IFNhdHVyZGF5IGluIE9jdG9iZXIgdGhyb3VnaCB0aGUKKyMgdGhpcmQgU2F0dXJkYXkgb2YgQXByaWwuICBVbmRlciB0aGUgc3lzdGVtIGFwcHJvdmVkIGJ5IFByaXZ5IENvdW5jaWwgb24KKyMgU2VwdC4gMTAsIGNsb2NrcyBtdXN0IGJlIHR1cm5lZCBhaGVhZCBvbmUgaG91ciBvbiB0aGUgb3BlbmluZyBkYXkgYW5kCisjIHNldCBiYWNrIGFuIGhvdXIgb24gdGhlIGNsb3NpbmcgZGF0ZS4iCisjIEFsYXMsIG5vIGluZGljYXRpb24gb2YgdGhlIHRpbWUgb2YgZGF5LgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTAtMDYpOgorIyBUb25nYSBzdGFydGVkIGl0cyBEYXlsaWdodCBTYXZpbmcgb24gU2F0dXJkYXkgbW9ybmluZyBPY3RvYmVyIDJuZCBhdCAwMjAwYW0uCisjIERheWxpZ2h0IFNhdmluZyBlbmRzIG9uIEFwcmlsIDE2IGF0IDAzMDBhbSB3aGljaCBpcyBTdW5kYXkgbW9ybmluZy4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0xMC0zMSk6CisjIEJhY2sgaW4gTWFyY2ggSSBmb3VuZCBhIG5vdGljZSBvbiB0aGUgd2Vic2l0ZSBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbQorIyB0aGF0IFRvbmdhIGNoYW5nZWQgYmFjayB0byBzdGFuZGFyZCB0aW1lIG9uZSBtb250aCBlYXJseSwgb24gTWFyY2ggMTkKKyMgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0ZWQgZGF0ZSBBcHJpbCAxNi4gVW5mb3J0dW5hdGVseSwgdGhlIGFydGljbGUKKyMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBvbiB0aGUgc2l0ZSwgYW5kIEkgZGlkIG5vdCBtYWtlIGEgY29weSBvZiB0aGUKKyMgdGV4dCwgYW5kIEkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcmVwb3J0IGl0IGhlcmUuCisjIChPcmlnaW5hbCBVUkwgd2FzOiBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL21hcmNoMTYyMDAwLmh0bSApCisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMC0xMi0wMSk6CisjIFRvbmdhIGlzIG9ic2VydmluZyBEU1QgYXMgb2YgMjAwMC0xMS0wNCBhbmQgd2lsbCBzdG9wIG9uIDIwMDEtMDEtMjcuCisKKyMgRnJvbSBTaW9uZSBNb2FsYS1NYWZpICgyMDAxLTA5LTIwKSB2aWEgUml2ZXMgTWNEb3c6CisjIEF0IDI6MDBhbSBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE5vdmVtYmVyLCB0aGUgc3RhbmRhcmQgdGltZSBpbiB0aGUgS2luZ2RvbQorIyBzaGFsbCBiZSBtb3ZlZCBmb3J3YXJkIGJ5IG9uZSBob3VyIHRvIDM6MDBhbS4gIEF0IDI6MDBhbSBvbiB0aGUgbGFzdCBTdW5kYXkKKyMgb2YgSmFudWFyeSB0aGUgc3RhbmRhcmQgdGltZSBpbiB0aGUgS2luZ2RvbSBzaGFsbCBiZSBtb3ZlZCBiYWNrd2FyZCBieSBvbmUKKyMgaG91ciB0byAxOjAwYW0uCisKKyMgRnJvbSBQdWx1ICdBbmF1ICgyMDAyLTExLTA1KToKKyMgVGhlIGxhdyB3YXMgZm9yIDMgeWVhcnMsIHN1cHBvc2VkbHkgdG8gZ2V0IHJlbmV3ZWQuICBJdCB3YXNuJ3QuCisKKworIyBXYWtlCisKKyMgRnJvbSBWZXJuaWNlIEFuZGVyc29uLCBQZXJzb25hbCBTZWNyZXRhcnkgdG8gUGhpbGlwIEplc3N1cCwKKyMgVVMgQW1iYXNzYWRvciBBdCBMYXJnZSAob3JhbCBoaXN0b3J5IGludGVydmlldywgMTk3MS0wMi0wMik6CisjCisjIFNhdHVyZGF5LCB0aGUgMTR0aCBbb2YgT2N0b2JlciwgMTk1MF0gLS0gLi4uICBUaGUgdGltZSB3YXMgYWxsIHRoZQorIyBtb3JlIGNvbmZ1c2luZyBhdCB0aGF0IHBvaW50LCBiZWNhdXNlIHdlIGhhZCBjcm9zc2VkIHRoZQorIyBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSwgdGh1cyBnZXR0aW5nIHR3byBTdW5kYXlzLiAgRnVydGhlcm1vcmUsIHdlCisjIGRpc2NvdmVyZWQgdGhhdCBXYWtlIElzbGFuZCBoYWQgdHdvIGhvdXJzIG9mIGRheWxpZ2h0IHNhdmluZyB0aW1lCisjIG1ha2luZyBjYWxjdWxhdGlvbiBvZiB0aW1lIGluIFdhc2hpbmd0b24gZGlmZmljdWx0IGlmIG5vdCBhbG1vc3QKKyMgaW1wb3NzaWJsZS4KKyMKKyMgaHR0cDovL3d3dy50cnVtYW5saWJyYXJ5Lm9yZy93YWtlL21lZXRpbmcuaHRtCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0yMyk6CisjIFdlIGhhdmUgbm8gb3RoZXIgcmVwb3J0IG9mIERTVCBpbiBXYWtlIElzbGFuZCwgc28gb21pdCB0aGlzIGluZm8gZm9yIG5vdy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZQorCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDAtMDEtMDMpOgorIworIyBUaGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUgaXMgbm90IGRlZmluZWQgYnkgYW55IGludGVybmF0aW9uYWwgc3RhbmRhcmQsCisjIGNvbnZlbnRpb24sIG9yIHRyZWF0eS4gIE1hcG1ha2VycyBhcmUgZnJlZSB0byBkcmF3IGl0IGFzIHRoZXkgcGxlYXNlLgorIyBSZXB1dGFibGUgbWFwbWFrZXJzIHdpbGwgc2ltcGx5IGVuc3VyZSB0aGF0IGV2ZXJ5IHBvaW50IG9mIGxhbmQgYXBwZWFycyBvbgorIyB0aGUgY29ycmVjdCBzaWRlIG9mIHRoZSBJREwsIGFjY29yZGluZyB0byB0aGUgZGF0ZSBsZWdhbGx5IG9ic2VydmVkIHRoZXJlLgorIworIyBXaGVuIEtpcmliYXRpIGFkb3B0ZWQgYSB1bmlmb3JtIGRhdGUgaW4gMTk5NSwgdGhlcmVieSBtb3ZpbmcgdGhlIFBob2VuaXggYW5kCisjIExpbmUgSXNsYW5kcyB0byB0aGUgd2VzdCBzaWRlIG9mIHRoZSBJREwgKG9yLCBpZiB5b3UgcHJlZmVyLCBtb3ZpbmcgdGhlIElETAorIyB0byB0aGUgZWFzdCBzaWRlIG9mIHRoZSBQaG9lbml4IGFuZCBMaW5lIElzbGFuZHMpLCBJIHN1cHBvc2UgdGhhdCBtb3N0CisjIG1hcG1ha2VycyByZWRyZXcgdGhlIElETCBmb2xsb3dpbmcgdGhlIGJvdW5kYXJ5IG9mIEtpcmliYXRpLiAgRXZlbiB0aGF0IGxpbmUKKyMgaGFzIGEgcmF0aGVyIGFyYml0cmFyeSBuYXR1cmUuICBUaGUgc3RyYWlnaHQtbGluZSBib3VuZGFyaWVzIGJldHdlZW4gUGFjaWZpYworIyBpc2xhbmQgbmF0aW9ucyB0aGF0IGFyZSBzaG93biBvbiBtYW55IG1hcHMgYXJlIGJhc2VkIG9uIGFuIGludGVybmF0aW9uYWwKKyMgY29udmVudGlvbiwgYnV0IGFyZSBub3QgbGVnYWxseSBiaW5kaW5nIG5hdGlvbmFsIGJvcmRlcnMuLi4uIFRoZSBkYXRlIGlzCisjIGdvdmVybmVkIGJ5IHRoZSBJREw7IHRoZXJlZm9yZSwgZXZlbiBvbiB0aGUgaGlnaCBzZWFzLCB0aGVyZSBtYXkgYmUgc29tZQorIyBwbGFjZXMgYXMgbGF0ZSBhcyBmb3VydGVlbiBob3VycyBsYXRlciB0aGFuIFVUQy4gIEFuZCwgc2luY2UgdGhlIElETCBpcyBub3QKKyMgYW4gaW50ZXJuYXRpb25hbCBzdGFuZGFyZCwgdGhlcmUgYXJlIHNvbWUgcGxhY2VzIG9uIHRoZSBoaWdoIHNlYXMgd2hlcmUgdGhlCisjIGNvcnJlY3QgZGF0ZSBpcyBhbWJpZ3VvdXMuCisKKyMgRnJvbSBXaWtpcGVkaWEgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGltZV96b25lPiAoMjAwNS0wOC0zMSk6CisjIEJlZm9yZSAxOTIwLCBhbGwgc2hpcHMga2VwdCBsb2NhbCBhcHBhcmVudCB0aW1lIG9uIHRoZSBoaWdoIHNlYXMgYnkgc2V0dGluZworIyB0aGVpciBjbG9ja3MgYXQgbmlnaHQgb3IgYXQgdGhlIG1vcm5pbmcgc2lnaHQgc28gdGhhdCwgZ2l2ZW4gdGhlIHNoaXAncworIyBzcGVlZCBhbmQgZGlyZWN0aW9uLCBpdCB3b3VsZCBiZSAxMiBvJ2Nsb2NrIHdoZW4gdGhlIFN1biBjcm9zc2VkIHRoZSBzaGlwJ3MKKyMgbWVyaWRpYW4gKDEyIG8nY2xvY2sgPSBsb2NhbCBhcHBhcmVudCBub29uKS4gIER1cmluZyAxOTE3LCBhdCB0aGUKKyMgQW5nbG8tRnJlbmNoIENvbmZlcmVuY2Ugb24gVGltZS1rZWVwaW5nIGF0IFNlYSwgaXQgd2FzIHJlY29tbWVuZGVkIHRoYXQgYWxsCisjIHNoaXBzLCBib3RoIG1pbGl0YXJ5IGFuZCBjaXZpbGlhbiwgc2hvdWxkIGFkb3B0IGhvdXJseSBzdGFuZGFyZCB0aW1lIHpvbmVzCisjIG9uIHRoZSBoaWdoIHNlYXMuICBXaGVuZXZlciBhIHNoaXAgd2FzIHdpdGhpbiB0aGUgdGVycml0b3JpYWwgd2F0ZXJzIG9mIGFueQorIyBuYXRpb24gaXQgd291bGQgdXNlIHRoYXQgbmF0aW9uJ3Mgc3RhbmRhcmQgdGltZS4gIFRoZSBjYXB0YWluIHdhcyBwZXJtaXR0ZWQKKyMgdG8gY2hhbmdlIGhpcyBzaGlwJ3MgY2xvY2tzIGF0IGEgdGltZSBvZiBoaXMgY2hvaWNlIGZvbGxvd2luZyBoaXMgc2hpcCdzCisjIGVudHJ5IGludG8gYW5vdGhlciB6b25lIHRpbWUtLWhlIG9mdGVuIGNob3NlIG1pZG5pZ2h0LiAgVGhlc2Ugem9uZXMgd2VyZQorIyBhZG9wdGVkIGJ5IGFsbCBtYWpvciBmbGVldHMgYmV0d2VlbiAxOTIwIGFuZCAxOTI1IGJ1dCBub3QgYnkgbWFueQorIyBpbmRlcGVuZGVudCBtZXJjaGFudCBzaGlwcyB1bnRpbCBXb3JsZCBXYXIgSUkuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCwgdXNpbmcgcmVmZXJlbmNlcyBzdWdnZXN0ZWQgYnkgT3NjYXIgdmFuIFZsaWptZW4KKyMgKDIwMDUtMDMtMjApOgorIworIyBUaGUgQW1lcmljYW4gUHJhY3RpY2FsIE5hdmlnYXRvciAoMjAwMikKKyMgPGh0dHA6Ly9wb2xsdXgubnNzLm5pbWEubWlsL3B1YnMvcHVic19qX2Fwbl9zZWN0aW9ucy5odG1sP3JpZD0xODc+CisjIHRhbGtzIG9ubHkgYWJvdXQgdGhlIDE4MC1kZWdyZWUgbWVyaWRpYW4gd2l0aCByZXNwZWN0IHRvIHNoaXBzIGluCisjIGludGVybmF0aW9uYWwgd2F0ZXJzOyBpdCBpZ25vcmVzIHRoZSBpbnRlcm5hdGlvbmFsIGRhdGUgbGluZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2JhY2t3YXJkIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvYmFja3dhcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5Njk2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2JhY2t3YXJkCkBAIC0wLDAgKzEsMTE2IEBACisjIDxwcmU+CisjIEAoIyliYWNrd2FyZAk4LjgKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisKKyMgVGhpcyBmaWxlIHByb3ZpZGVzIGxpbmtzIGJldHdlZW4gY3VycmVudCBuYW1lcyBmb3IgdGltZSB6b25lcworIyBhbmQgdGhlaXIgb2xkIG5hbWVzLiAgTWFueSBuYW1lcyBjaGFuZ2VkIGluIGxhdGUgMTk5My4KKworTGluawlBZnJpY2EvQXNtYXJhCQlBZnJpY2EvQXNtZXJhCitMaW5rCUFmcmljYS9CYW1ha28JCUFmcmljYS9UaW1idWt0dQorTGluawlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQW1lcmljYS9BcmdlbnRpbmEvQ29tb2RSaXZhZGF2aWEKK0xpbmsJQW1lcmljYS9BZGFrCQlBbWVyaWNhL0F0a2EKK0xpbmsJQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzCUFtZXJpY2EvQnVlbm9zX0FpcmVzCitMaW5rCUFtZXJpY2EvQXJnZW50aW5hL0NhdGFtYXJjYQlBbWVyaWNhL0NhdGFtYXJjYQorTGluawlBbWVyaWNhL0F0aWtva2FuCUFtZXJpY2EvQ29yYWxfSGFyYm91cgorTGluawlBbWVyaWNhL0FyZ2VudGluYS9Db3Jkb2JhCUFtZXJpY2EvQ29yZG9iYQorTGluawlBbWVyaWNhL1RpanVhbmEJCUFtZXJpY2EvRW5zZW5hZGEKK0xpbmsJQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcwlBbWVyaWNhL0ZvcnRfV2F5bmUKK0xpbmsJQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcwlBbWVyaWNhL0luZGlhbmFwb2xpcworTGluawlBbWVyaWNhL0FyZ2VudGluYS9KdWp1eQlBbWVyaWNhL0p1anV5CitMaW5rCUFtZXJpY2EvSW5kaWFuYS9Lbm94CUFtZXJpY2EvS25veF9JTgorTGluawlBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUJQW1lcmljYS9Mb3Vpc3ZpbGxlCitMaW5rCUFtZXJpY2EvQXJnZW50aW5hL01lbmRvemEJQW1lcmljYS9NZW5kb3phCitMaW5rCUFtZXJpY2EvUmlvX0JyYW5jbwlBbWVyaWNhL1BvcnRvX0FjcmUKK0xpbmsJQW1lcmljYS9BcmdlbnRpbmEvQ29yZG9iYQlBbWVyaWNhL1Jvc2FyaW8KK0xpbmsJQW1lcmljYS9TdF9UaG9tYXMJQW1lcmljYS9WaXJnaW4KK0xpbmsJQXNpYS9Bc2hnYWJhdAkJQXNpYS9Bc2hraGFiYWQKK0xpbmsJQXNpYS9DaG9uZ3FpbmcJCUFzaWEvQ2h1bmdraW5nCitMaW5rCUFzaWEvRGhha2EJCUFzaWEvRGFjY2EKK0xpbmsJQXNpYS9LYXRobWFuZHUJCUFzaWEvS2F0bWFuZHUKK0xpbmsJQXNpYS9Lb2xrYXRhCQlBc2lhL0NhbGN1dHRhCitMaW5rCUFzaWEvTWFjYXUJCUFzaWEvTWFjYW8KK0xpbmsJQXNpYS9KZXJ1c2FsZW0JCUFzaWEvVGVsX0F2aXYKK0xpbmsJQXNpYS9Ib19DaGlfTWluaAlBc2lhL1NhaWdvbgorTGluawlBc2lhL1RoaW1waHUJCUFzaWEvVGhpbWJ1CitMaW5rCUFzaWEvTWFrYXNzYXIJCUFzaWEvVWp1bmdfUGFuZGFuZworTGluawlBc2lhL1VsYWFuYmFhdGFyCUFzaWEvVWxhbl9CYXRvcgorTGluawlBdGxhbnRpYy9GYXJvZQkJQXRsYW50aWMvRmFlcm9lCitMaW5rCUV1cm9wZS9Pc2xvCQlBdGxhbnRpYy9KYW5fTWF5ZW4KK0xpbmsJQXVzdHJhbGlhL1N5ZG5leQlBdXN0cmFsaWEvQUNUCitMaW5rCUF1c3RyYWxpYS9TeWRuZXkJQXVzdHJhbGlhL0NhbmJlcnJhCitMaW5rCUF1c3RyYWxpYS9Mb3JkX0hvd2UJQXVzdHJhbGlhL0xISQorTGluawlBdXN0cmFsaWEvU3lkbmV5CUF1c3RyYWxpYS9OU1cKK0xpbmsJQXVzdHJhbGlhL0RhcndpbglBdXN0cmFsaWEvTm9ydGgKK0xpbmsJQXVzdHJhbGlhL0JyaXNiYW5lCUF1c3RyYWxpYS9RdWVlbnNsYW5kCitMaW5rCUF1c3RyYWxpYS9BZGVsYWlkZQlBdXN0cmFsaWEvU291dGgKK0xpbmsJQXVzdHJhbGlhL0hvYmFydAlBdXN0cmFsaWEvVGFzbWFuaWEKK0xpbmsJQXVzdHJhbGlhL01lbGJvdXJuZQlBdXN0cmFsaWEvVmljdG9yaWEKK0xpbmsJQXVzdHJhbGlhL1BlcnRoCQlBdXN0cmFsaWEvV2VzdAorTGluawlBdXN0cmFsaWEvQnJva2VuX0hpbGwJQXVzdHJhbGlhL1lhbmNvd2lubmEKK0xpbmsJQW1lcmljYS9SaW9fQnJhbmNvCUJyYXppbC9BY3JlCitMaW5rCUFtZXJpY2EvTm9yb25oYQkJQnJhemlsL0RlTm9yb25oYQorTGluawlBbWVyaWNhL1Nhb19QYXVsbwlCcmF6aWwvRWFzdAorTGluawlBbWVyaWNhL01hbmF1cwkJQnJhemlsL1dlc3QKK0xpbmsJQW1lcmljYS9IYWxpZmF4CQlDYW5hZGEvQXRsYW50aWMKK0xpbmsJQW1lcmljYS9XaW5uaXBlZwlDYW5hZGEvQ2VudHJhbAorTGluawlBbWVyaWNhL1JlZ2luYQkJQ2FuYWRhL0Vhc3QtU2Fza2F0Y2hld2FuCitMaW5rCUFtZXJpY2EvVG9yb250bwkJQ2FuYWRhL0Vhc3Rlcm4KK0xpbmsJQW1lcmljYS9FZG1vbnRvbglDYW5hZGEvTW91bnRhaW4KK0xpbmsJQW1lcmljYS9TdF9Kb2hucwlDYW5hZGEvTmV3Zm91bmRsYW5kCitMaW5rCUFtZXJpY2EvVmFuY291dmVyCUNhbmFkYS9QYWNpZmljCitMaW5rCUFtZXJpY2EvUmVnaW5hCQlDYW5hZGEvU2Fza2F0Y2hld2FuCitMaW5rCUFtZXJpY2EvV2hpdGVob3JzZQlDYW5hZGEvWXVrb24KK0xpbmsJQW1lcmljYS9TYW50aWFnbwlDaGlsZS9Db250aW5lbnRhbAorTGluawlQYWNpZmljL0Vhc3RlcgkJQ2hpbGUvRWFzdGVySXNsYW5kCitMaW5rCUFtZXJpY2EvSGF2YW5hCQlDdWJhCitMaW5rCUFmcmljYS9DYWlybwkJRWd5cHQKK0xpbmsJRXVyb3BlL0R1YmxpbgkJRWlyZQorTGluawlFdXJvcGUvTG9uZG9uCQlFdXJvcGUvQmVsZmFzdAorTGluawlFdXJvcGUvQ2hpc2luYXUJCUV1cm9wZS9UaXJhc3BvbAorTGluawlFdXJvcGUvTG9uZG9uCQlHQgorTGluawlFdXJvcGUvTG9uZG9uCQlHQi1FaXJlCitMaW5rCUV0Yy9HTVQJCQlHTVQrMAorTGluawlFdGMvR01UCQkJR01ULTAKK0xpbmsJRXRjL0dNVAkJCUdNVDAKK0xpbmsJRXRjL0dNVAkJCUdyZWVud2ljaAorTGluawlBc2lhL0hvbmdfS29uZwkJSG9uZ2tvbmcKK0xpbmsJQXRsYW50aWMvUmV5a2phdmlrCUljZWxhbmQKK0xpbmsJQXNpYS9UZWhyYW4JCUlyYW4KK0xpbmsJQXNpYS9KZXJ1c2FsZW0JCUlzcmFlbAorTGluawlBbWVyaWNhL0phbWFpY2EJCUphbWFpY2EKK0xpbmsJQXNpYS9Ub2t5bwkJSmFwYW4KK0xpbmsJUGFjaWZpYy9Ld2FqYWxlaW4JS3dhamFsZWluCitMaW5rCUFmcmljYS9Ucmlwb2xpCQlMaWJ5YQorTGluawlBbWVyaWNhL1RpanVhbmEJCU1leGljby9CYWphTm9ydGUKK0xpbmsJQW1lcmljYS9NYXphdGxhbglNZXhpY28vQmFqYVN1cgorTGluawlBbWVyaWNhL01leGljb19DaXR5CU1leGljby9HZW5lcmFsCitMaW5rCVBhY2lmaWMvQXVja2xhbmQJTloKK0xpbmsJUGFjaWZpYy9DaGF0aGFtCQlOWi1DSEFUCitMaW5rCUFtZXJpY2EvRGVudmVyCQlOYXZham8KK0xpbmsJQXNpYS9TaGFuZ2hhaQkJUFJDCitMaW5rCVBhY2lmaWMvUGFnb19QYWdvCVBhY2lmaWMvU2Ftb2EKK0xpbmsJUGFjaWZpYy9UcnVrCQlQYWNpZmljL1lhcAorTGluawlFdXJvcGUvV2Fyc2F3CQlQb2xhbmQKK0xpbmsJRXVyb3BlL0xpc2JvbgkJUG9ydHVnYWwKK0xpbmsJQXNpYS9UYWlwZWkJCVJPQworTGluawlBc2lhL1Nlb3VsCQlST0sKK0xpbmsJQXNpYS9TaW5nYXBvcmUJCVNpbmdhcG9yZQorTGluawlFdXJvcGUvSXN0YW5idWwJCVR1cmtleQorTGluawlFdGMvVUNUCQkJVUNUCitMaW5rCUFtZXJpY2EvQW5jaG9yYWdlCVVTL0FsYXNrYQorTGluawlBbWVyaWNhL0FkYWsJCVVTL0FsZXV0aWFuCitMaW5rCUFtZXJpY2EvUGhvZW5peAkJVVMvQXJpem9uYQorTGluawlBbWVyaWNhL0NoaWNhZ28JCVVTL0NlbnRyYWwKK0xpbmsJQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcwlVUy9FYXN0LUluZGlhbmEKK0xpbmsJQW1lcmljYS9OZXdfWW9yawlVUy9FYXN0ZXJuCitMaW5rCVBhY2lmaWMvSG9ub2x1bHUJVVMvSGF3YWlpCitMaW5rCUFtZXJpY2EvSW5kaWFuYS9Lbm94CVVTL0luZGlhbmEtU3RhcmtlCitMaW5rCUFtZXJpY2EvRGV0cm9pdAkJVVMvTWljaGlnYW4KK0xpbmsJQW1lcmljYS9EZW52ZXIJCVVTL01vdW50YWluCitMaW5rCUFtZXJpY2EvTG9zX0FuZ2VsZXMJVVMvUGFjaWZpYworTGluawlQYWNpZmljL1BhZ29fUGFnbwlVUy9TYW1vYQorTGluawlFdGMvVVRDCQkJVVRDCitMaW5rCUV0Yy9VVEMJCQlVbml2ZXJzYWwKK0xpbmsJRXVyb3BlL01vc2NvdwkJVy1TVQorTGluawlFdGMvVVRDCQkJWnVsdQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvZXRjZXRlcmEgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9ldGNldGVyYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkzNjgyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvZXRjZXRlcmEKQEAgLTAsMCArMSw4MyBAQAorIyA8cHJlPgorIyBAKCMpZXRjZXRlcmEJOC4yCisjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCisjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgorCisjIFRoZXNlIGVudHJpZXMgYXJlIG1vc3RseSBwcmVzZW50IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHNvIHRoYXQKKyMgcGVvcGxlIGluIGFyZWFzIG5vdCBvdGhlcndpc2UgY292ZXJlZCBieSB0aGUgdHogZmlsZXMgY291bGQgInppYyAtbCIKKyMgdG8gYSB0aW1lIHpvbmUgdGhhdCB3YXMgcmlnaHQgZm9yIHRoZWlyIGFyZWEuICBUaGVzZSBkYXlzLCB0aGUKKyMgdHogZmlsZXMgY292ZXIgYWxtb3N0IGFsbCB0aGUgaW5oYWJpdGVkIHdvcmxkLCBhbmQgdGhlIG9ubHkgcHJhY3RpY2FsCisjIG5lZWQgbm93IGZvciB0aGUgZW50cmllcyB0aGF0IGFyZSBub3Qgb24gVVRDIGFyZSBmb3Igc2hpcHMgYXQgc2VhCisjIHRoYXQgY2Fubm90IHVzZSBQT1NJWCBUWiBzZXR0aW5ncy4KKworWm9uZQlFdGMvR01UCQkwCS0JR01UCitab25lCUV0Yy9VVEMJCTAJLQlVVEMKK1pvbmUJRXRjL1VDVAkJMAktCVVDVAorCisjIFRoZSBmb2xsb3dpbmcgbGluayB1c2VzIG9sZGVyIG5hbWluZyBjb252ZW50aW9ucywKKyMgYnV0IGl0IGJlbG9uZ3MgaGVyZSwgbm90IGluIHRoZSBmaWxlIGBiYWNrd2FyZCcsCisjIGFzIGZ1bmN0aW9ucyBsaWtlIGdtdGltZSBsb2FkIHRoZSAiR01UIiBmaWxlIHRvIGhhbmRsZSBsZWFwIHNlY29uZHMgcHJvcGVybHkuCisjIFdlIHdhbnQgdGhpcyB0byB3b3JrIGV2ZW4gb24gaW5zdGFsbGF0aW9ucyB0aGF0IG9taXQgdGhlIG90aGVyIG9sZGVyIG5hbWVzLgorTGluawlFdGMvR01UCQkJCUdNVAorCitMaW5rCUV0Yy9VVEMJCQkJRXRjL1VuaXZlcnNhbAorTGluawlFdGMvVVRDCQkJCUV0Yy9adWx1CisKK0xpbmsJRXRjL0dNVAkJCQlFdGMvR3JlZW53aWNoCitMaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVC0wCitMaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVCswCitMaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVDAKKworIyBXZSB1c2UgUE9TSVgtc3R5bGUgc2lnbnMgaW4gdGhlIFpvbmUgbmFtZXMgYW5kIHRoZSBvdXRwdXQgYWJicmV2aWF0aW9ucywKKyMgZXZlbiB0aG91Z2ggdGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBtYW55IHBlb3BsZSBleHBlY3QuCisjIFBPU0lYIGhhcyBwb3NpdGl2ZSBzaWducyB3ZXN0IG9mIEdyZWVud2ljaCwgYnV0IG1hbnkgcGVvcGxlIGV4cGVjdAorIyBwb3NpdGl2ZSBzaWducyBlYXN0IG9mIEdyZWVud2ljaC4gIEZvciBleGFtcGxlLCBUWj0nRXRjL0dNVCs0JyB1c2VzCisjIHRoZSBhYmJyZXZpYXRpb24gIkdNVCs0IiBhbmQgY29ycmVzcG9uZHMgdG8gNCBob3VycyBiZWhpbmQgVVRDCisjIChpLmUuIHdlc3Qgb2YgR3JlZW53aWNoKSBldmVuIHRob3VnaCBtYW55IHBlb3BsZSB3b3VsZCBleHBlY3QgaXQgdG8KKyMgbWVhbiA0IGhvdXJzIGFoZWFkIG9mIFVUQyAoaS5lLiBlYXN0IG9mIEdyZWVud2ljaCkuCisjCisjIEluIHRoZSBkcmFmdCA1IG9mIFBPU0lYIDEwMDMuMS0yMDB4LCB0aGUgYW5nbGUgYnJhY2tldCBub3RhdGlvbgorIyAod2hpY2ggaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHR6IGNvZGUpIGFsbG93cyBmb3IKKyMgVFo9JzxHTVQtND4rNCc7IGlmIHlvdSB3YW50IHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIGNvbmZvcm1pbmcgdG8KKyMgSVNPIDg2MDEgeW91IGNhbiB1c2UgVFo9JzwtMDQwMD4rNCcuICBUaHVzIHRoZSBjb21tb25seS1leHBlY3RlZAorIyBvZmZzZXQgaXMga2VwdCB3aXRoaW4gdGhlIGFuZ2xlIGJyYWNrZXQgKGFuZCBpcyB1c2VkIGZvciBkaXNwbGF5KQorIyB3aGlsZSB0aGUgUE9TSVggc2lnbiBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXQgKGFuZCBpcyB1c2VkCisjIGZvciBjYWxjdWxhdGlvbikuCisjCisjIERvIG5vdCB1c2UgYSBUWiBzZXR0aW5nIGxpa2UgVFo9J0dNVCs0Jywgd2hpY2ggaXMgZm91ciBob3VycyBiZWhpbmQKKyMgR01UIGJ1dCB1c2VzIHRoZSBjb21wbGV0ZWx5IG1pc2xlYWRpbmcgYWJicmV2aWF0aW9uICJHTVQiLgorCisjIEVhcmxpZXIgaW5jYXJuYXRpb25zIG9mIHRoaXMgcGFja2FnZSB3ZXJlIG5vdCBQT1NJWC1jb21wbGlhbnQsCisjIGFuZCBoYWQgbGluZXMgc3VjaCBhcworIwkJWm9uZQlHTVQtMTIJCS0xMgktCUdNVC0xMjAwCisjIFdlIGRpZCBub3Qgd2FudCB0aGluZ3MgdG8gY2hhbmdlIHF1aWV0bHkgaWYgc29tZW9uZSBhY2N1c3RvbWVkIHRvIHRoZSBvbGQKKyMgd2F5IGRvZXMgYQorIwkJemljIC1sIEdNVC0xMgorIyBzbyB3ZSBtb3ZlZCB0aGUgbmFtZXMgaW50byB0aGUgRXRjIHN1YmRpcmVjdG9yeS4KKworWm9uZQlFdGMvR01ULTE0CTE0CS0JR01ULTE0CSMgMTQgaG91cnMgYWhlYWQgb2YgR01UCitab25lCUV0Yy9HTVQtMTMJMTMJLQlHTVQtMTMKK1pvbmUJRXRjL0dNVC0xMgkxMgktCUdNVC0xMgorWm9uZQlFdGMvR01ULTExCTExCS0JR01ULTExCitab25lCUV0Yy9HTVQtMTAJMTAJLQlHTVQtMTAKK1pvbmUJRXRjL0dNVC05CTkJLQlHTVQtOQorWm9uZQlFdGMvR01ULTgJOAktCUdNVC04Citab25lCUV0Yy9HTVQtNwk3CS0JR01ULTcKK1pvbmUJRXRjL0dNVC02CTYJLQlHTVQtNgorWm9uZQlFdGMvR01ULTUJNQktCUdNVC01Citab25lCUV0Yy9HTVQtNAk0CS0JR01ULTQKK1pvbmUJRXRjL0dNVC0zCTMJLQlHTVQtMworWm9uZQlFdGMvR01ULTIJMgktCUdNVC0yCitab25lCUV0Yy9HTVQtMQkxCS0JR01ULTEKK1pvbmUJRXRjL0dNVCsxCS0xCS0JR01UKzEKK1pvbmUJRXRjL0dNVCsyCS0yCS0JR01UKzIKK1pvbmUJRXRjL0dNVCszCS0zCS0JR01UKzMKK1pvbmUJRXRjL0dNVCs0CS00CS0JR01UKzQKK1pvbmUJRXRjL0dNVCs1CS01CS0JR01UKzUKK1pvbmUJRXRjL0dNVCs2CS02CS0JR01UKzYKK1pvbmUJRXRjL0dNVCs3CS03CS0JR01UKzcKK1pvbmUJRXRjL0dNVCs4CS04CS0JR01UKzgKK1pvbmUJRXRjL0dNVCs5CS05CS0JR01UKzkKK1pvbmUJRXRjL0dNVCsxMAktMTAJLQlHTVQrMTAKK1pvbmUJRXRjL0dNVCsxMQktMTEJLQlHTVQrMTEKK1pvbmUJRXRjL0dNVCsxMgktMTIJLQlHTVQrMTIKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2V1cm9wZSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2V1cm9wZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFiODgwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvZXVyb3BlCkBAIC0wLDAgKzEsMjY4MyBAQAorIyA8cHJlPgorIyBAKCMpZXVyb3BlCTguMjQKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisKKyMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KKyMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKKyMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAorIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgorIworIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCisjIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydAorIyBBc3NvY2lhdGlvbidzIFN0YW5kYXJkIFNjaGVkdWxlcyBJbmZvcm1hdGlvbiBNYW51YWwgKElBVEEgU1NJTSksCisjIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCisjIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgorIworIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKKyMgZW50cmllcyB0aHJvdWdoIDE5OTEsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgorIworIyBPdGhlciBzb3VyY2VzIG9jY2FzaW9uYWxseSB1c2VkIGluY2x1ZGU6CisjCisjCUVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAorIwlXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLAorIwl3aGljaCBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCisjCisjCTxhIGhyZWY9Imh0dHA6Ly93d3cucGV0dHN3b29kdmlsbGFnZS5jby51ay9EYXlsaWdodF9TYXZpbmdzX1dpbGxpYW1fV2lsbGV0dC5wZGYiPgorIwlXaWxsaWFtIFdpbGxldHQsIFRoZSBXYXN0ZSBvZiBEYXlsaWdodCwgMTl0aCBlZGl0aW9uCisjCTwvYT4gKDE5MTQtMDMpCisjCisjCUJyYXppbCdzIERlcGFydGFtZW50byBTZXJ2aWNvIGRhIEhvcmEgKERTSCksCisjCTxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hJU1RIVi5odG0iPgorIwlIaXN0b3J5IG9mIFN1bW1lciBUaW1lCisjCTwvYT4gKDE5OTgtMDktMjEsIGluIFBvcnR1Z3Vlc2UpCisKKyMKKyMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgYConIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CisjIHRoZSByZXN0IGFyZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvciBmcm9tIG90aGVyIHNvdXJjZXMuCisjIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQorIyAgICAgICAgICAgICAgICAgICBzdGQgZHN0ICAyZHN0CisjICAgICAgICAgICAgICAgICAgIExNVCAgICAgICAgICAgTG9jYWwgTWVhbiBUaW1lCisjICAgICAgIC00OjAwICAgICAgIEFTVCBBRFQgICAgICAgQXRsYW50aWMKKyMgICAgICAgLTM6MDAgICAgICAgV0dUIFdHU1QgICAgICBXZXN0ZXJuIEdyZWVubGFuZCoKKyMgICAgICAgLTE6MDAgICAgICAgRUdUIEVHU1QgICAgICBFYXN0ZXJuIEdyZWVubGFuZCoKKyMgICAgICAgIDA6MDAgICAgICAgR01UIEJTVCAgQkRTVCBHcmVlbndpY2gsIEJyaXRpc2ggU3VtbWVyCisjICAgICAgICAwOjAwICAgICAgIEdNVCBJU1QgICAgICAgR3JlZW53aWNoLCBJcmlzaCBTdW1tZXIKKyMgICAgICAgIDA6MDAgICAgICAgV0VUIFdFU1QgV0VNVCBXZXN0ZXJuIEV1cm9wZQorIyAgICAgICAgMDoxOTozMi4xMyBBTVQgTlNUICAgICAgIEFtc3RlcmRhbSwgTmV0aGVybGFuZHMgU3VtbWVyICgxODM1LTE5MzcpKgorIyAgICAgICAgMDoyMCAgICAgICBORVQgTkVTVCAgICAgIE5ldGhlcmxhbmRzICgxOTM3LTE5NDApKgorIyAgICAgICAgMTowMCAgICAgICBDRVQgQ0VTVCBDRU1UIENlbnRyYWwgRXVyb3BlCisjICAgICAgICAxOjAwOjE0ICAgIFNFVCAgICAgICAgICAgU3dlZGlzaCAoMTg3OS0xODk5KSoKKyMgICAgICAgIDI6MDAgICAgICAgRUVUIEVFU1QgICAgICBFYXN0ZXJuIEV1cm9wZQorIyAgICAgICAgMzowMCAgICAgICBNU0sgTVNEICAgICAgIE1vc2NvdworIworIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMsIGVzcGVjaWFsbHkgaW4gQnJpdGFpbiwKKyMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCisKKyMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTQtMTItMDQpLAorIyBUaGUgb3JpZ2luYWwgc2l4IFtFVSBtZW1iZXJzXTogQmVsZ2l1bSwgRnJhbmNlLCAoV2VzdCkgR2VybWFueSwgSXRhbHksCisjIEx1eGVtYm91cmcsIHRoZSBOZXRoZXJsYW5kcy4KKyMgUGx1cywgZnJvbSAxIEphbiA3MzogRGVubWFyaywgSXJlbGFuZCwgVW5pdGVkIEtpbmdkb20uCisjIFBsdXMsIGZyb20gMSBKYW4gODE6IEdyZWVjZS4KKyMgUGx1cywgZnJvbSAxIEphbiA4NjogU3BhaW4sIFBvcnR1Z2FsLgorIyBQbHVzLCBmcm9tIDEgSmFuIDk1OiBBdXN0cmlhLCBGaW5sYW5kLCBTd2VkZW4uIChOb3J3YXkgbmVnb3RpYXRlZCB0ZXJtcyBmb3IKKyMgZW50cnkgYnV0IGluIGEgcmVmZXJlbmR1bSBvbiAyOCBOb3YgOTQgdGhlIHBlb3BsZSB2b3RlZCBObyBieSA1Mi4yJSB0byA0Ny44JQorIyBvbiBhIHR1cm5vdXQgb2YgODguNiUuIFRoaXMgd2FzIGFsbW9zdCB0aGUgc2FtZSByZXN1bHQgYXMgTm9yd2F5J3MgcHJldmlvdXMKKyMgcmVmZXJlbmR1bSBpbiAxOTcyLCB0aGV5IGFyZSB0aGUgb25seSBjb3VudHJ5IHRvIGhhdmUgc2FpZCBObyB0d2ljZS4KKyMgUmVmZXJlbmR1bXMgaW4gdGhlIG90aGVyIHRocmVlIGNvdW50cmllcyB2b3RlZCBZZXMuKQorIyAuLi4KKyMgRXN0b25pYSAuLi4gdXNlcyBFVSBkYXRlcyBidXQgbm90IGF0IDAxOjAwIEdNVCwgdGhleSB1c2UgbWlkbmlnaHQgR01ULgorIyBJIGRvbid0IHRoaW5rIHRoZXkga25vdyB5ZXQgd2hhdCB0aGV5IHdpbGwgZG8gZnJvbSAxOTk2IG9ud2FyZHMuCisjIC4uLgorIyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IFtjdXJyZW50IG1lbWJlcnMgd2hvIGFyZSBub3QgdXNpbmcgRVUgcnVsZXNdLgorIyBBIERpcmVjdGl2ZSBoYXMgdGhlIGZvcmNlIG9mIGxhdywgbWVtYmVyIHN0YXRlcyBhcmUgb2JsaWdlZCB0byBlbmFjdAorIyBuYXRpb25hbCBsYXcgdG8gaW1wbGVtZW50IGl0LiBUaGUgb25seSBjb250ZW50aW91cyBpc3N1ZSB3YXMgdGhlCisjIGRpZmZlcmVudCBlbmQgZGF0ZSBmb3IgdGhlIFVLIGFuZCBJcmVsYW5kLCBhbmQgdGhpcyB3YXMgYWx3YXlzIGFsbG93ZWQKKyMgaW4gdGhlIERpcmVjdGl2ZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQnJpdGFpbiAoVW5pdGVkIEtpbmdkb20pIGFuZCBJcmVsYW5kIChFaXJlKQorCisjIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk0LTA3LTA2KToKKyMKKyMgT24gMTcgSmFuIDE5OTQgdGhlIEluZGVwZW5kZW50LCBhIFVLIHF1YWxpdHkgbmV3c3BhcGVyLCBoYWQgYSBwaWVjZSBhYm91dAorIyBoaXN0b3JpY2FsIHZpc3RhcyBhbG9uZyB0aGUgVGhhbWVzIGluIHdlc3QgTG9uZG9uLiBUaGVyZSB3YXMgYSBwaG90bworIyBhbmQgYSBza2V0Y2ggbWFwIHNob3dpbmcgc29tZSBvZiB0aGUgc2lnaHRsaW5lcyBpbnZvbHZlZC4gT25lIHBhcmFncmFwaAorIyBvZiB0aGUgdGV4dCBzYWlkOgorIworIyBgQW4gb2xkIHN0b25lIG9iZWxpc2sgbWFya2luZyBhIGZvcmdvdHRlbiB0ZXJyZXN0cmlhbCBtZXJpZGlhbiBzdGFuZHMKKyMgYmVzaWRlIHRoZSByaXZlciBhdCBLZXcuIEluIHRoZSAxOHRoIGNlbnR1cnksIGJlZm9yZSB0aW1lIGFuZCBsb25naXR1ZGUKKyMgd2FzIHN0YW5kYXJkaXNlZCBieSB0aGUgUm95YWwgT2JzZXJ2YXRvcnkgaW4gR3JlZW53aWNoLCBzY2hvbGFycyBvYnNlcnZlZAorIyB0aGlzIHN0b25lIGFuZCB0aGUgbW92ZW1lbnQgb2Ygc3RhcnMgZnJvbSBLZXcgT2JzZXJ2YXRvcnkgbmVhcmJ5LiBUaGV5CisjIG1hZGUgdGhlaXIgY2FsY3VsYXRpb25zIGFuZCBzZXQgdGhlIHRpbWUgZm9yIHRoZSBIb3JzZSBHdWFyZHMgYW5kIFBhcmxpYW1lbnQsCisjIGJ1dCBub3cgdGhlIHN0b25lIGlzIG9ic2N1cmVkIGJ5IHNjcnVid29vZCBhbmQgY2FuIG9ubHkgYmUgc2VlbiBieSB3YWxraW5nCisjIGFsb25nIHRoZSB0b3dwYXRoIHdpdGhpbiBhIGZldyB5YXJkcyBvZiBpdC4nCisjCisjIEkgaGF2ZSBhIG9uZSBpbmNoIHRvIG9uZSBtaWxlIG1hcCBvZiBMb25kb24gYW5kIG15IGVzdGltYXRlIG9mIHRoZSBzdG9uZSdzCisjIHBvc2l0aW9uIGlzIDUxIGRlZy4gMjgnIDMwIiBOLCAwIGRlZy4gMTgnIDQ1IiBXLiBUaGUgbG9uZ2l0dWRlIHNob3VsZAorIyBiZSB3aXRoaW4gYWJvdXQgKy0yIi4gVGhlIE9yZG5hbmNlIFN1cnZleSBncmlkIHJlZmVyZW5jZSBpcyBUUTE3Mjc2MS4KKyMKKyMgW1RoaXMgeWllbGRzIEdNVE9GRiA9IC0wOjAxOjE1IGZvciBMb25kb24gTE1UIGluIHRoZSAxOHRoIGNlbnR1cnkuXQorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTMtMTEtMTgpOgorIworIyBIb3dzZSB3cml0ZXMgdGhhdCBCcml0YWluIHdhcyB0aGUgZmlyc3QgY291bnRyeSB0byB1c2Ugc3RhbmRhcmQgdGltZS4KKyMgVGhlIHJhaWx3YXlzIGNhcmVkIG1vc3QgYWJvdXQgdGhlIGluY29uc2lzdGVuY2llcyBvZiBsb2NhbCBtZWFuIHRpbWUsCisjIGFuZCBpdCB3YXMgdGhleSB3aG8gZm9yY2VkIGEgdW5pZm9ybSB0aW1lIG9uIHRoZSBjb3VudHJ5LgorIyBUaGUgb3JpZ2luYWwgaWRlYSB3YXMgY3JlZGl0ZWQgdG8gRHIuIFdpbGxpYW0gSHlkZSBXb2xsYXN0b24gKDE3NjYtMTgyOCkKKyMgYW5kIHdhcyBwb3B1bGFyaXplZCBieSBBYnJhaGFtIEZvbGxldHQgT3NsZXIgKDE4MDgtMTkwMykuCisjIFRoZSBmaXJzdCByYWlsd2F5IHRvIGFkb3B0IExvbmRvbiB0aW1lIHdhcyB0aGUgR3JlYXQgV2VzdGVybiBSYWlsd2F5CisjIGluIE5vdmVtYmVyIDE4NDA7IG90aGVyIHJhaWx3YXlzIGZvbGxvd2VkIHN1aXQsIGFuZCBieSAxODQ3IG1vc3QKKyMgKHRob3VnaCBub3QgYWxsKSByYWlsd2F5cyB1c2VkIExvbmRvbiB0aW1lLiAgT24gMTg0Ny0wOS0yMiB0aGUKKyMgUmFpbHdheSBDbGVhcmluZyBIb3VzZSwgYW4gaW5kdXN0cnkgc3RhbmRhcmRzIGJvZHksIHJlY29tbWVuZGVkIHRoYXQgR01UIGJlCisjIGFkb3B0ZWQgYXQgYWxsIHN0YXRpb25zIGFzIHNvb24gYXMgdGhlIEdlbmVyYWwgUG9zdCBPZmZpY2UgcGVybWl0dGVkIGl0LgorIyBUaGUgdHJhbnNpdGlvbiBvY2N1cnJlZCBvbiAxMi0wMSBmb3IgdGhlIEwmTlcsIHRoZSBDYWxlZG9uaWFuLAorIyBhbmQgcHJlc3VtYWJseSBvdGhlciByYWlsd2F5czsgdGhlIEphbnVhcnkgMTg0OCBCcmFkc2hhdydzIGxpc3RzIG1hbnkKKyMgcmFpbHdheXMgYXMgdXNpbmcgR01ULiAgQnkgMTg1NSB0aGUgdmFzdCBtYWpvcml0eSBvZiBwdWJsaWMKKyMgY2xvY2tzIGluIEJyaXRhaW4gd2VyZSBzZXQgdG8gR01UICh0aG91Z2ggc29tZSwgbGlrZSB0aGUgZ3JlYXQgY2xvY2sKKyMgb24gVG9tIFRvd2VyIGF0IENocmlzdCBDaHVyY2gsIE94Zm9yZCwgd2VyZSBmaXR0ZWQgd2l0aCB0d28gbWludXRlIGhhbmRzLAorIyBvbmUgZm9yIGxvY2FsIHRpbWUgYW5kIG9uZSBmb3IgR01UKS4gIFRoZSBsYXN0IG1ham9yIGhvbGRvdXQgd2FzIHRoZSBsZWdhbAorIyBzeXN0ZW0sIHdoaWNoIHN0dWJib3JubHkgc3R1Y2sgdG8gbG9jYWwgdGltZSBmb3IgbWFueSB5ZWFycywgbGVhZGluZworIyB0byBvZGRpdGllcyBsaWtlIHBvbGxzIG9wZW5pbmcgYXQgMDg6MTMgYW5kIGNsb3NpbmcgYXQgMTY6MTMuCisjIFRoZSBsZWdhbCBzeXN0ZW0gZmluYWxseSBzd2l0Y2hlZCB0byBHTVQgd2hlbiB0aGUgU3RhdHV0ZXMgKERlZmluaXRpb24KKyMgb2YgVGltZSkgQWN0IHRvb2sgZWZmZWN0OyBpdCByZWNlaXZlZCB0aGUgUm95YWwgQXNzZW50IG9uIDE4ODAtMDgtMDIuCisjCisjIEluIHRoZSB0YWJsZXMgYmVsb3csIHdlIGNvbmRlbnNlIHRoaXMgY29tcGxpY2F0ZWQgc3RvcnkgaW50byBhIHNpbmdsZQorIyB0cmFuc2l0aW9uIGRhdGUgZm9yIExvbmRvbiwgbmFtZWx5IDE4NDctMTItMDEuICBXZSBkb24ndCBrbm93IGFzIG11Y2gKKyMgYWJvdXQgRHVibGluLCBzbyB3ZSB1c2UgMTg4MC0wOC0wMiwgdGhlIGxlZ2FsIHRyYW5zaXRpb24gdGltZS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTA5LTI3KToKKyMgU3VtbWVyIFRpbWUgd2FzIGZpcnN0IHNlcmlvdXNseSBwcm9wb3NlZCBieSBXaWxsaWFtIFdpbGxldHQgKDE4NTctMTkxNSksCisjIGEgTG9uZG9uIGJ1aWxkZXIgYW5kIG1lbWJlciBvZiB0aGUgUm95YWwgQXN0cm9ub21pY2FsIFNvY2lldHkKKyMgd2hvIGNpcmN1bGF0ZWQgYSBwYW1waGxldCBgYFRoZSBXYXN0ZSBvZiBEYXlsaWdodCcnICgxOTA3KQorIyB0aGF0IHByb3Bvc2VkIGFkdmFuY2luZyBjbG9ja3MgMjAgbWludXRlcyBvbiBlYWNoIG9mIGZvdXIgU3VuZGF5cyBpbiBBcHJpbCwKKyMgYW5kIHJldGFyZGluZyB0aGVtIGJ5IHRoZSBzYW1lIGFtb3VudCBvbiBmb3VyIFN1bmRheXMgaW4gU2VwdGVtYmVyLgorIyBBIGJpbGwgd2FzIGRyYWZ0ZWQgaW4gMTkwOSBhbmQgaW50cm9kdWNlZCBpbiBQYXJsaWFtZW50IHNldmVyYWwgdGltZXMsCisjIGJ1dCBpdCBtZXQgd2l0aCByaWRpY3VsZSBhbmQgb3Bwb3NpdGlvbiwgZXNwZWNpYWxseSBmcm9tIGZhcm1pbmcgaW50ZXJlc3RzLgorIyBMYXRlciBlZGl0aW9ucyBvZiB0aGUgcGFtcGhsZXQgcHJvcG9zZWQgb25lLWhvdXIgc3VtbWVyIHRpbWUsIGFuZAorIyBpdCB3YXMgZXZlbnR1YWxseSBhZG9wdGVkIGFzIGEgd2FydGltZSBtZWFzdXJlIGluIDE5MTYuCisjIFNlZTogU3VtbWVyIFRpbWUgQXJyaXZlcyBFYXJseSwgVGhlIFRpbWVzICgyMDAwLTA1LTE4KS4KKyMgQSBtb251bWVudCB0byBXaWxsZXR0IHdhcyB1bnZlaWxlZCBvbiAxOTI3LTA1LTIxLCBpbiBhbiBvcGVuIHNwYWNlIGluCisjIGEgNDUtYWNyZSB3b29kIG5lYXIgQ2hpc2xlaHVyc3QsIEtlbnQgdGhhdCB3YXMgcHVyY2hhc2VkIGJ5IHBvcHVsYXIKKyMgc3Vic2NyaXB0aW9uIGFuZCBvcGVuIHRvIHRoZSBwdWJsaWMuICBPbiB0aGUgc291dGggZmFjZSBvZiB0aGUgbW9ub2xpdGgsCisjIGRlc2lnbmVkIGJ5IEcuIFcuIE1pbGxlciwgaXMgdGhlIHRoZSBXaWxsaWFtIFdpbGxldHQgTWVtb3JpYWwgU3VuZGlhbCwKKyMgd2hpY2ggaXMgcGVybWFuZW50bHkgc2V0IHRvIFN1bW1lciBUaW1lLgorCisjIEZyb20gV2luc3RvbiBDaHVyY2hpbGwgKDE5MzQtMDQtMjgpOgorIyBJdCBpcyBvbmUgb2YgdGhlIHBhcmFkb3hlcyBvZiBoaXN0b3J5IHRoYXQgd2Ugc2hvdWxkIG93ZSB0aGUgYm9vbiBvZgorIyBzdW1tZXIgdGltZSwgd2hpY2ggZ2l2ZXMgZXZlcnkgeWVhciB0byB0aGUgcGVvcGxlIG9mIHRoaXMgY291bnRyeQorIyBiZXR3ZWVuIDE2MCBhbmQgMTcwIGhvdXJzIG1vcmUgZGF5bGlnaHQgbGVpc3VyZSwgdG8gYSB3YXIgd2hpY2gKKyMgcGx1bmdlZCBFdXJvcGUgaW50byBkYXJrbmVzcyBmb3IgZm91ciB5ZWFycywgYW5kIHNob29rIHRoZQorIyBmb3VuZGF0aW9ucyBvZiBjaXZpbGl6YXRpb24gdGhyb3VnaG91dCB0aGUgd29ybGQuCisjCS0tIDxhIGhyZWY9Imh0dHA6Ly93d3cud2luc3RvbmNodXJjaGlsbC5vcmcvZmgxMTR3aWxsZXR0Lmh0bSI+CisjCSJBIFNpbGVudCBUb2FzdCB0byBXaWxsaWFtIFdpbGxldHQiLCBQaWN0b3JpYWwgV2Vla2x5CisjCTwvYT4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA5LTAzKToKKyMgVGhlIE9FRCBTdXBwbGVtZW50IHNheXMgdGhhdCB0aGUgRW5nbGlzaCBvcmlnaW5hbGx5IHNhaWQgYGBEYXlsaWdodCBTYXZpbmcnJworIyB3aGVuIHRoZXkgd2VyZSBkZWJhdGluZyB0aGUgYWRvcHRpb24gb2YgRFNUIGluIDE5MDg7IGJ1dCBieSAxOTE2IHRoaXMKKyMgdGVybSBhcHBlYXJzIG9ubHkgaW4gcXVvdGVzIHRha2VuIGZyb20gRFNUJ3Mgb3Bwb25lbnRzLCB3aGVyZWFzIHRoZQorIyBwcm9wb25lbnRzICh3aG8gZXZlbnR1YWxseSB3b24gdGhlIGFyZ3VtZW50KSBhcmUgcXVvdGVkIGFzIHVzaW5nIGBgU3VtbWVyJycuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5ODktMDEtMTkpOgorIworIyBBIHNvdXJjZSBhdCB0aGUgQnJpdGlzaCBJbmZvcm1hdGlvbiBPZmZpY2UgaW4gTmV3IFlvcmsgYXZlcnMgdGhhdCBpdCdzCisjIGtub3duIGFzICJCcml0aXNoIiBTdW1tZXIgVGltZSBpbiBhbGwgcGFydHMgb2YgdGhlIFVuaXRlZCBLaW5nZG9tLgorCisjIERhdGU6IDQgSmFuIDg5IDA4OjU3OjI1IEdNVCAoV2VkKQorIyBGcm9tOiBKb25hdGhhbiBMZWZmbGVyCisjIFtCcml0aXNoIFN1bW1lciBUaW1lXSBpcyBmaXhlZCBhbm51YWxseSBieSBBY3Qgb2YgUGFybGlhbWVudC4KKyMgSWYgeW91IGNhbiBwcmVkaWN0IHdoYXQgUGFybGlhbWVudCB3aWxsIGRvLCB5b3Ugc2hvdWxkIGJlIGluCisjIHBvbGl0aWNzIG1ha2luZyBhIGZvcnR1bmUsIG5vdCBjb21wdXRpbmcuCisKKyMgRnJvbSBDaHJpcyBDYXJyaWVyICgxOTk2LTA2LTE0KToKKyMgSSByZW1lbWJlciByZWFkaW5nIGluIHZhcmlvdXMgd2FydGltZSBpc3N1ZXMgb2YgdGhlIExvbmRvbiBUaW1lcyB0aGUKKyMgYWNyb255bSBCRFNUIGZvciBCcml0aXNoIERvdWJsZSBTdW1tZXIgVGltZS4gIExvb2sgZm9yIHRoZSBwdWJsaXNoZWQKKyMgdGltZSBvZiBzdW5yaXNlIGFuZCBzdW5zZXQgaW4gVGhlIFRpbWVzLCB3aGVuIEJEU1Qgd2FzIGluIGVmZmVjdCwgYW5kCisjIGlmIHlvdSBmaW5kIGEgem9uZSByZWZlcmVuY2UgaXQgd2lsbCBzYXksICJBbGwgdGltZXMgQi5ELlMuVC4iCisKKyMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDE5OTktMDktMDIpOgorIyAuLi4gc29tZSBtaWxpdGFyeSBjYWJsZXMgKFdPIDIxOS80MTAwIC0gdGhpcyBpcyBhIGNvcHkgZnJvbSB0aGUKKyMgbWFpbiBTSEFFRiBhcmNoaXZlcyBoZWxkIGluIHRoZSBVUyBOYXRpb25hbCBBcmNoaXZlcywgU0hBRUYvNTI1Mi84LzUxNikKKyMgYWdyZWUgdGhhdCB0aGUgdXNhZ2UgaXMgQkRTVCAodGhpcyBhcHBlYXJzIGluIGEgbWVzc2FnZSBkYXRlZCAxNyBGZWIgMTk0NSkuCisKKyMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDIwMDAtMTAtMDMpOgorIyBPbiAxOHRoIEFwcmlsIDE5NDEsIFNpciBTdGVwaGVuIFRhbGxlbnRzIG9mIHRoZSBCQkMgd3JvdGUgdG8gU2lyCisjIEFsZXhhbmRlciBNYXh3ZWxsIG9mIHRoZSBIb21lIE9mZmljZSBhc2tpbmcgd2hldGhlciB0aGVyZSB3YXMgYW55CisjIG9mZmljaWFsIGRlc2lnbmF0aW9uOyB0aGUgcmVwbHkgb2YgdGhlIDIxc3Qgd2FzIHRoYXQgdGhlcmUgd2Fzbid0CisjIGJ1dCBoZSBjb3VsZG4ndCB0aGluayBvZiBhbnl0aGluZyBiZXR0ZXIgdGhhbiB0aGUgIkRvdWJsZSBCcml0aXNoCisjIFN1bW1lciBUaW1lIiB0aGF0IHRoZSBCQkMgaGFkIGJlZW4gdXNpbmcgaW5mb3JtYWxseS4KKyMgaHR0cDovL3N0dWRlbnQuY3VzdS5jYW0uYWMudWsvfmpzbTI4L2JyaXRpc2gtdGltZS9iYmMtMTk0MTA0MTgucG5nCisjIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvaG8tMTk0MTA0MjEucG5nCisKKyMgRnJvbSBTaXIgQWxleGFuZGVyIE1heHdlbGwgaW4gdGhlIGFib3ZlLW1lbnRpb25lZCBsZXR0ZXIgKDE5NDEtMDQtMjEpOgorIyBbTl1vIG9mZmljaWFsIGRlc2lnbmF0aW9uIGhhcyBhcyBmYXIgYXMgSSBrbm93IGJlZW4gYWRvcHRlZCBmb3IgdGhlIHRpbWUKKyMgd2hpY2ggaXMgdG8gYmUgaW50cm9kdWNlZCBpbiBNYXkuLi4uCisjIEkgY2Fubm90IHRoaW5rIG9mIGFueXRoaW5nIGJldHRlciB0aGFuICJEb3VibGUgQnJpdGlzaCBTdW1tZXIgVGltZSIKKyMgd2hpY2ggY291bGQgbm90IGJlIHNhaWQgdG8gcnVuIGNvdW50ZXIgdG8gYW55IG9mZmljaWFsIGRlc2NyaXB0aW9uLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgorIyBIb3dzZSB3cml0ZXMgKHAgMTU3KSBgREJTVCcgdG9vLCBidXQgYEJEU1QnIHNlZW1zIHRvIGhhdmUgYmVlbiBjb21tb24KKyMgYW5kIGZvbGxvd3MgdGhlIG1vcmUgdXN1YWwgY29udmVudGlvbiBvZiBwdXR0aW5nIHRoZSBsb2NhdGlvbiBuYW1lIGZpcnN0LAorIyBzbyB3ZSB1c2UgYEJEU1QnLgorCisjIFBldGVyIElsaWV2ZSAoMTk5OC0wNC0xOSkgZGVzY3JpYmVkIGF0IGxlbmd0aAorIyB0aGUgaGlzdG9yeSBvZiBzdW1tZXIgdGltZSBsZWdpc2xhdGlvbiBpbiB0aGUgVW5pdGVkIEtpbmdkb20uCisjIFNpbmNlIDE5OTggSm9zZXBoIFMuIE15ZXJzIGhhcyBiZWVuIHVwZGF0aW5nCisjIGFuZCBleHRlbmRpbmcgdGhpcyBsaXN0LCB3aGljaCBjYW4gYmUgZm91bmQgaW4KKyMgPGEgaHJlZj0iaHR0cDovL3N0dWRlbnQuY3VzdS5jYW0uYWMudWsvfmpzbTI4L2JyaXRpc2gtdGltZS8iPgorIyBIaXN0b3J5IG9mIGxlZ2FsIHRpbWUgaW4gQnJpdGFpbgorIyA8L2E+CisKKyMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDE5OTgtMDEtMDYpOgorIworIyBUaGUgbGVnYWwgdGltZSBpbiB0aGUgVUsgb3V0c2lkZSBvZiBzdW1tZXIgdGltZSBpcyBkZWZpbml0ZWx5IEdNVCwgbm90IFVUQzsKKyMgc2VlIExvcmQgVGFubGF3J3Mgc3BlZWNoCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cucGFybGlhbWVudC50aGUtc3RhdGlvbmVyeS1vZmZpY2UuY28udWsvcGEvbGQxOTk2OTcvbGRoYW5zcmQvcGR2bi9sZHM5Ny90ZXh0LzcwNjExLTIwLmh0bSM3MDYxMS0yMF9oZWFkMCI+CisjIChMb3JkcyBIYW5zYXJkIDExIEp1bmUgMTk5NyBjb2x1bW5zIDk2NCB0byA5NzYpCisjIDwvYT4uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjCisjIEZvciBsYWNrIG9mIG90aGVyIGRhdGEsIGZvbGxvdyBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIEVpcmUgaW4gMTk0MC0xOTQ4LgorIworIyBHaXZlbiBJbGlldmUgYW5kIE15ZXJzJ3MgZGF0YSwgdGhlIGZvbGxvd2luZyBjbGFpbXMgYnkgU2hhbmtzICYgUG90dGVuZ2VyCisjIGFyZSBpbmNvcnJlY3Q6CisjICAgICAqIFdhbGVzIGRpZCBub3Qgc3dpdGNoIGZyb20gR01UIHRvIGRheWxpZ2h0IHNhdmluZyB0aW1lIHVudGlsCisjCTE5MjEgQXByIDMsIHdoZW4gdGhleSBiZWdhbiB0byBjb25mb3JtIHdpdGggdGhlIHJlc3Qgb2YgR3JlYXQgQnJpdGFpbi4KKyMgQWN0dWFsbHksIFdhbGVzIHdhcyBpZGVudGljYWwgYWZ0ZXIgMTg4MC4KKyMgICAgICogRWlyZSBoYWQgdHdvIHRyYW5zaXRpb25zIG9uIDE5MTYgT2N0IDEuCisjIEl0IGFjdHVhbGx5IGp1c3QgaGFkIG9uZSB0cmFuc2l0aW9uLgorIyAgICAgKiBOb3J0aGVybiBJcmVsYW5kIHVzZWQgc2luZ2xlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHRocm91Z2hvdXQgV1cgSUkuCisjIEFjdHVhbGx5LCBpdCBjb25mb3JtZWQgdG8gQnJpdGFpbi4KKyMgICAgICogR0ItRWlyZSBjaGFuZ2VkIHN0YW5kYXJkIHRpbWUgdG8gMSBob3VyIGFoZWFkIG9mIEdNVCBvbiAxOTY4LTAyLTE4LgorIyBBY3R1YWxseSwgdGhhdCBkYXRlIHNhdyB0aGUgdXN1YWwgc3dpdGNoIHRvIHN1bW1lciB0aW1lLgorIyBTdGFuZGFyZCB0aW1lIHdhcyBub3QgY2hhbmdlZCB1bnRpbCAxOTY4LTEwLTI3ICh0aGUgY2xvY2tzIGRpZG4ndCBjaGFuZ2UpLgorIworIyBIZXJlIGlzIGFub3RoZXIgaW5jb3JyZWN0IGNsYWltIGJ5IFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMgICAgICogSmVyc2V5LCBHdWVybnNleSwgYW5kIHRoZSBJc2xlIG9mIE1hbiBkaWQgbm90IHN3aXRjaCBmcm9tIEdNVAorIwl0byBkYXlsaWdodCBzYXZpbmcgdGltZSB1bnRpbCAxOTIxIEFwciAzLCB3aGVuIHRoZXkgYmVnYW4gdG8KKyMJY29uZm9ybSB3aXRoIEdyZWF0IEJyaXRhaW4uCisjIFMuUi4mTy4gMTkxNiwgTm8uIDM4MiBhbmQgSE8gNDUvMTA4MTEvMzEyMzY0IChxdW90ZWQgYWJvdmUpIHNheSBvdGhlcndpc2UuCisjCisjIFRoZSBmb2xsb3dpbmcgY2xhaW0gYnkgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHBvc3NpYmxlIHRob3VnaCBkb3VidGZ1bDsKKyMgd2UnbGwgaWdub3JlIGl0IGZvciBub3cuCisjICAgICAqIER1YmxpbidzIDE5NzEtMTAtMzEgc3dpdGNoIHdhcyBhdCAwMjowMCwgZXZlbiB0aG91Z2ggTG9uZG9uJ3Mgd2FzIDAzOjAwLgorIworIworIyBXaGl0bWFuIHNheXMgRHVibGluIE1lYW4gVGltZSB3YXMgLTA6MjU6MjEsIHdoaWNoIGlzIG1vcmUgcHJlY2lzZSB0aGFuCisjIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgUGVyaGFwcyB0aGlzIHdhcyBEdW5zaW5rIE9ic2VydmF0b3J5IFRpbWUsIGFzIER1bnNpbmsgT2JzZXJ2YXRvcnkKKyMgKDgga20gTlcgb2YgRHVibGluJ3MgY2VudGVyKSBzZWVtaW5nbHkgd2FzIHRvIER1YmxpbiBhcyBHcmVlbndpY2ggd2FzCisjIHRvIExvbmRvbi4gIEZvciBleGFtcGxlOgorIworIyAgICJUaW1lYmFsbCBvbiB0aGUgYmFsbGFzdCBvZmZpY2UgaXMgZG93bi4gIER1bnNpbmsgdGltZS4iCisjICAgLS0gSmFtZXMgSm95Y2UsIFVseXNzZXMKKworIyBGcm9tIEpvc2VwaCBTLiBNeWVycyAoMjAwNS0wMS0yNik6CisjIElyaXNoIGxhd3MgYXJlIGF2YWlsYWJsZSBvbmxpbmUgYXQgd3d3LmlyaXNoc3RhdHV0ZWJvb2suaWUuICBUaGVzZSBpbmNsdWRlCisjIHZhcmlvdXMgcmVsYXRpbmcgdG8gbGVnYWwgdGltZSwgZm9yIGV4YW1wbGU6CisjCisjIFpaQTEzWTE5MjMuaHRtbCBaWkExMlkxOTI0Lmh0bWwgWlpBOFkxOTI1Lmh0bWwgWlpTSVYyMFBHMTI2Ny5odG1sCisjCisjIFpaU0k3MVkxOTQ3Lmh0bWwgWlpTSTEyOFkxOTQ4Lmh0bWwgWlpTSTIzWTE5NDkuaHRtbCBaWlNJNDFZMTk1MC5odG1sCisjIFpaU0kyN1kxOTUxLmh0bWwgWlpTSTczWTE5NTIuaHRtbAorIworIyBaWlNJMTFZMTk2MS5odG1sIFpaU0kyMzJZMTk2MS5odG1sIFpaU0kxODJZMTk2Mi5odG1sCisjIFpaU0kxNjdZMTk2My5odG1sIFpaU0kyNTdZMTk2NC5odG1sIFpaU0kxOThZMTk2Ny5odG1sCisjIFpaQTIzWTE5NjguaHRtbCBaWkExN1kxOTcxLmh0bWwKKyMKKyMgWlpTSTY3WTE5ODEuaHRtbCBaWlNJMjEyWTE5ODIuaHRtbCBaWlNJNDVZMTk4Ni5odG1sCisjIFpaU0kyNjRZMTk4OC5odG1sIFpaU0k1MlkxOTkwLmh0bWwgWlpTSTM3MVkxOTkyLmh0bWwKKyMgWlpTSTM5NVkxOTk0Lmh0bWwgWlpTSTQ4NFkxOTk3Lmh0bWwgWlpTSTUwNlkyMDAxLmh0bWwKKyMKKyMgW1RoZXNlIGFyZSBhbGwgcmVsYXRpdmUgdG8gdGhlIHJvb3QsIGUuZy4sIHRoZSBmaXJzdCBpcworIyA8aHR0cDovL3d3dy5pcmlzaHN0YXR1dGVib29rLmllL1paQTEzWTE5MjMuaHRtbD4uXQorIworIyAoVGhlc2UgYXJlIHRob3NlIEkgZm91bmQsIGJ1dCB0aGVyZSBjb3VsZCBiZSBtb3JlLiAgSW4gYW55IGNhc2UgdGhlc2UKKyMgc2hvdWxkIGFsbG93IHZhcmlvdXMgdXBkYXRlcyB0byB0aGUgY29tbWVudHMgaW4gdGhlIGV1cm9wZSBmaWxlIHRvIGNvdmVyCisjIHRoZSBsYXdzIGFwcGxpY2FibGUgaW4gSXJlbGFuZC4pCisjCisjIChOb3RlIHRoYXQgdGhlIHRpbWUgaW4gdGhlIFJlcHVibGljIG9mIElyZWxhbmQgc2luY2UgMTk2OCBoYXMgYmVlbiBkZWZpbmVkCisjIGluIHRlcm1zIG9mIHN0YW5kYXJkIHRpbWUgYmVpbmcgR01UKzEgd2l0aCBhIHBlcmlvZCBvZiB3aW50ZXIgdGltZSB3aGVuIGl0CisjIGlzIEdNVCwgcmF0aGVyIHRoYW4gc3RhbmRhcmQgdGltZSBiZWluZyBHTVQgd2l0aCBhIHBlcmlvZCBvZiBzdW1tZXIgdGltZQorIyBiZWluZyBHTVQrMS4pCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wMy0yOCk6CisjIENsaXZlIEZlYXRoZXIgKDxuZXdzOjg1OTg0NTcwNi4yNjA0My4wQG9mZmljZS5kZW1vbi5uZXQ+LCAxOTk3LTAzLTMxKQorIyByZXBvcnRzIHRoYXQgRm9sa2VzdG9uZSAoQ2hlcml0b24pIFNodXR0bGUgVGVybWluYWwgdXNlcyBDb25jZXNzaW9uIFRpbWUKKyMgKENUKSwgZXF1aXZhbGVudCB0byBGcmVuY2ggY2l2aWwgdGltZS4KKyMgSnVsaWFuIEhpbGwgKDxuZXdzOjM2MTE4MTI4LjVBMTRAdmlyZ2luLm5ldD4sIDE5OTgtMDktMzApIHJlcG9ydHMgdGhhdAorIyB0cmFpbnMgYmV0d2VlbiBEb2xsYW5kcyBNb29yICh0aGUgZnJlaWdodCBmYWNpbGl0eSBuZXh0IGRvb3IpCisjIGFuZCBGcmV0aHVuIHJ1biBpbiBDVC4KKyMgTXkgYWRtaXR0ZWRseSB1bmluZm9ybWVkIGd1ZXNzIGlzIHRoYXQgdGhlIHRlcm1pbmFsIGhhcyB0d28gYXV0aG9yaXRpZXMsCisjIHRoZSBGcmVuY2ggY29uY2Vzc2lvbiBvcGVyYXRvcnMgYW5kIHRoZSBCcml0aXNoIGNpdmlsIGF1dGhvcml0aWVzLAorIyBhbmQgdGhhdCB0aGUgdGltZSBkZXBlbmRzIG9uIHdobyB5b3UncmUgdGFsa2luZyB0by4KKyMgSWYsIHNheSwgdGhlIEJyaXRpc2ggcG9saWNlIHdlcmUgY2FsbGVkIHRvIHRoZSBzdGF0aW9uIGZvciBzb21lIHJlYXNvbiwKKyMgSSB3b3VsZCBleHBlY3QgdGhlIG9mZmljaWFsIHBvbGljZSByZXBvcnQgdG8gdXNlIEdNVC9CU1QgYW5kIG5vdCBDRVQvQ0VTVC4KKyMgVGhpcyBpcyBhIGJvcmRlcmxpbmUgY2FzZSwgYnV0IGZvciBub3cgbGV0J3Mgc3RpY2sgdG8gR01UL0JTVC4KKworIyBGcm9tIGFuIGFub255bW91cyBjb250cmlidXRvciAoMTk5Ni0wNi0wMik6CisjIFRoZSBsYXcgZ292ZXJuaW5nIHRpbWUgaW4gSXJlbGFuZCBpcyB1bmRlciBTdGF0dXRvcnkgSW5zdHJ1bWVudCBTSSAzOTUvOTQsCisjIHdoaWNoIGdpdmVzIGZvcmNlIHRvIEV1cm9wZWFuIFVuaW9uIDd0aCBDb3VuY2lsIERpcmVjdGl2ZSAjIDk0LzIxL0VDLgorIyBVbmRlciB0aGlzIGRpcmVjdGl2ZSwgdGhlIE1pbmlzdGVyIGZvciBKdXN0aWNlIGluIElyZWxhbmQgbWFrZXMgYXBwcm9wcmlhdGUKKyMgcmVndWxhdGlvbnMuIEkgc3Bva2UgdGhpcyBtb3JuaW5nIHdpdGggdGhlIFNlY3JldGFyeSBvZiB0aGUgRGVwYXJ0bWVudCBvZgorIyBKdXN0aWNlICh0ZWwgKzM1MyAxIDY3OCA5NzExKSB3aG8gY29uZmlybWVkIHRvIG1lIHRoYXQgdGhlIGNvcnJlY3QgbmFtZSBpcworIyAiSXJpc2ggU3VtbWVyIFRpbWUiLCBhYmJyZXZpYXRlZCB0byAiSVNUIi4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKKyMgU3VtbWVyIFRpbWUgQWN0LCAxOTE2CitSdWxlCUdCLUVpcmUJMTkxNglvbmx5CS0JTWF5CTIxCTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkxNglvbmx5CS0JT2N0CSAxCTI6MDBzCTAJR01UCisjIFMuUi4mTy4gMTkxNywgTm8uIDM1OAorUnVsZQlHQi1FaXJlCTE5MTcJb25seQktCUFwcgkgOAkyOjAwcwkxOjAwCUJTVAorUnVsZQlHQi1FaXJlCTE5MTcJb25seQktCVNlcAkxNwkyOjAwcwkwCUdNVAorIyBTLlIuJk8uIDE5MTgsIE5vLiAyNzQKK1J1bGUJR0ItRWlyZQkxOTE4CW9ubHkJLQlNYXIJMjQJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTE4CW9ubHkJLQlTZXAJMzAJMjowMHMJMAlHTVQKKyMgUy5SLiZPLiAxOTE5LCBOby4gMjk3CitSdWxlCUdCLUVpcmUJMTkxOQlvbmx5CS0JTWFyCTMwCTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkxOQlvbmx5CS0JU2VwCTI5CTI6MDBzCTAJR01UCisjIFMuUi4mTy4gMTkyMCwgTm8uIDQ1OAorUnVsZQlHQi1FaXJlCTE5MjAJb25seQktCU1hcgkyOAkyOjAwcwkxOjAwCUJTVAorIyBTLlIuJk8uIDE5MjAsIE5vLiAxODQ0CitSdWxlCUdCLUVpcmUJMTkyMAlvbmx5CS0JT2N0CTI1CTI6MDBzCTAJR01UCisjIFMuUi4mTy4gMTkyMSwgTm8uIDM2MworUnVsZQlHQi1FaXJlCTE5MjEJb25seQktCUFwcgkgMwkyOjAwcwkxOjAwCUJTVAorUnVsZQlHQi1FaXJlCTE5MjEJb25seQktCU9jdAkgMwkyOjAwcwkwCUdNVAorIyBTLlIuJk8uIDE5MjIsIE5vLiAyNjQKK1J1bGUJR0ItRWlyZQkxOTIyCW9ubHkJLQlNYXIJMjYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTIyCW9ubHkJLQlPY3QJIDgJMjowMHMJMAlHTVQKKyMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTkyMgorUnVsZQlHQi1FaXJlCTE5MjMJb25seQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkyMwkxOTI0CS0JU2VwCVN1bj49MTYJMjowMHMJMAlHTVQKK1J1bGUJR0ItRWlyZQkxOTI0CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkyNQkxOTI2CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKKyMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTkyNQorUnVsZQlHQi1FaXJlCTE5MjUJMTkzOAktCU9jdAlTdW4+PTIJMjowMHMJMAlHTVQKK1J1bGUJR0ItRWlyZQkxOTI3CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkyOAkxOTI5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTMwCW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkzMQkxOTMyCS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTMzCW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkzNAlvbmx5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTM1CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkzNgkxOTM3CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTM4CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTkzOQlvbmx5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKKyMgUy5SLiZPLiAxOTM5LCBOby4gMTM3OQorUnVsZQlHQi1FaXJlCTE5MzkJb25seQktCU5vdglTdW4+PTE2CTI6MDBzCTAJR01UCisjIFMuUi4mTy4gMTk0MCwgTm8uIDE3MiBhbmQgTm8uIDE4ODMKK1J1bGUJR0ItRWlyZQkxOTQwCW9ubHkJLQlGZWIJU3VuPj0yMwkyOjAwcwkxOjAwCUJTVAorIyBTLlIuJk8uIDE5NDEsIE5vLiA0NzYKK1J1bGUJR0ItRWlyZQkxOTQxCW9ubHkJLQlNYXkJU3VuPj0yCTE6MDBzCTI6MDAJQkRTVAorUnVsZQlHQi1FaXJlCTE5NDEJMTk0MwktCUF1ZwlTdW4+PTkJMTowMHMJMTowMAlCU1QKKyMgUy5SLiZPLiAxOTQyLCBOby4gNTA2CitSdWxlCUdCLUVpcmUJMTk0MgkxOTQ0CS0JQXByCVN1bj49MgkxOjAwcwkyOjAwCUJEU1QKKyMgUy5SLiZPLiAxOTQ0LCBOby4gOTMyCitSdWxlCUdCLUVpcmUJMTk0NAlvbmx5CS0JU2VwCVN1bj49MTYJMTowMHMJMTowMAlCU1QKKyMgUy5SLiZPLiAxOTQ1LCBOby4gMzEyCitSdWxlCUdCLUVpcmUJMTk0NQlvbmx5CS0JQXByCU1vbj49MgkxOjAwcwkyOjAwCUJEU1QKK1J1bGUJR0ItRWlyZQkxOTQ1CW9ubHkJLQlKdWwJU3VuPj05CTE6MDBzCTE6MDAJQlNUCisjIFMuUi4mTy4gMTk0NSwgTm8uIDEyMDgKK1J1bGUJR0ItRWlyZQkxOTQ1CTE5NDYJLQlPY3QJU3VuPj0yCTI6MDBzCTAJR01UCitSdWxlCUdCLUVpcmUJMTk0Nglvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAorIyBUaGUgU3VtbWVyIFRpbWUgQWN0LCAxOTQ3CitSdWxlCUdCLUVpcmUJMTk0Nwlvbmx5CS0JTWFyCTE2CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTk0Nwlvbmx5CS0JQXByCTEzCTE6MDBzCTI6MDAJQkRTVAorUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCUF1ZwkxMAkxOjAwcwkxOjAwCUJTVAorUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCU5vdgkgMgkyOjAwcwkwCUdNVAorIyBTdW1tZXIgVGltZSBPcmRlciwgMTk0OCAoUy5JLiAxOTQ4LzQ5NSkKK1J1bGUJR0ItRWlyZQkxOTQ4CW9ubHkJLQlNYXIJMTQJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTQ4CW9ubHkJLQlPY3QJMzEJMjowMHMJMAlHTVQKKyMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NDkgKFMuSS4gMTk0OS8zNzMpCitSdWxlCUdCLUVpcmUJMTk0OQlvbmx5CS0JQXByCSAzCTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTk0OQlvbmx5CS0JT2N0CTMwCTI6MDBzCTAJR01UCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTUwIChTLkkuIDE5NTAvNTE4KQorIyBTdW1tZXIgVGltZSBPcmRlciwgMTk1MSAoUy5JLiAxOTUxLzQzMCkKKyMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NTIgKFMuSS4gMTk1Mi80NTEpCitSdWxlCUdCLUVpcmUJMTk1MAkxOTUyCS0JQXByCVN1bj49MTQJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTUwCTE5NTIJLQlPY3QJU3VuPj0yMQkyOjAwcwkwCUdNVAorIyByZXZlcnQgdG8gdGhlIHJ1bGVzIG9mIHRoZSBTdW1tZXIgVGltZSBBY3QsIDE5MjUKK1J1bGUJR0ItRWlyZQkxOTUzCW9ubHkJLQlBcHIJU3VuPj0xNgkyOjAwcwkxOjAwCUJTVAorUnVsZQlHQi1FaXJlCTE5NTMJMTk2MAktCU9jdAlTdW4+PTIJMjowMHMJMAlHTVQKK1J1bGUJR0ItRWlyZQkxOTU0CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTk1NQkxOTU2CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTU3CW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCitSdWxlCUdCLUVpcmUJMTk1OAkxOTU5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTYwCW9ubHkJLQlBcHIJU3VuPj05CTI6MDBzCTE6MDAJQlNUCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTYxIChTLkkuIDE5NjEvNzEpCisjIFN1bW1lciBUaW1lICgxOTYyKSBPcmRlciwgMTk2MSAoUy5JLiAxOTYxLzI0NjUpCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTYzIChTLkkuIDE5NjMvODEpCitSdWxlCUdCLUVpcmUJMTk2MQkxOTYzCS0JTWFyCWxhc3RTdW4JMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTYxCTE5NjgJLQlPY3QJU3VuPj0yMwkyOjAwcwkwCUdNVAorIyBTdW1tZXIgVGltZSAoMTk2NCkgT3JkZXIsIDE5NjMgKFMuSS4gMTk2My8yMTAxKQorIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2NCAoUy5JLiAxOTY0LzEyMDEpCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTY3IChTLkkuIDE5NjcvMTE0OCkKK1J1bGUJR0ItRWlyZQkxOTY0CTE5NjcJLQlNYXIJU3VuPj0xOQkyOjAwcwkxOjAwCUJTVAorIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2OCAoUy5JLiAxOTY4LzExNykKK1J1bGUJR0ItRWlyZQkxOTY4CW9ubHkJLQlGZWIJMTgJMjowMHMJMTowMAlCU1QKKyMgVGhlIEJyaXRpc2ggU3RhbmRhcmQgVGltZSBBY3QsIDE5NjgKKyMJKG5vIHN1bW1lciB0aW1lKQorIyBUaGUgU3VtbWVyIFRpbWUgQWN0LCAxOTcyCitSdWxlCUdCLUVpcmUJMTk3MgkxOTgwCS0JTWFyCVN1bj49MTYJMjowMHMJMTowMAlCU1QKK1J1bGUJR0ItRWlyZQkxOTcyCTE5ODAJLQlPY3QJU3VuPj0yMwkyOjAwcwkwCUdNVAorIyBTdW1tZXIgVGltZSBPcmRlciwgMTk4MCAoUy5JLiAxOTgwLzEwODkpCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTgyIChTLkkuIDE5ODIvMTY3MykKKyMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5ODYgKFMuSS4gMTk4Ni8yMjMpCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTg4IChTLkkuIDE5ODgvOTMxKQorUnVsZQlHQi1FaXJlCTE5ODEJMTk5NQktCU1hcglsYXN0U3VuCTE6MDB1CTE6MDAJQlNUCitSdWxlCUdCLUVpcmUgMTk4MQkxOTg5CS0JT2N0CVN1bj49MjMJMTowMHUJMAlHTVQKKyMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5ODkgKFMuSS4gMTk4OS85ODUpCisjIFN1bW1lciBUaW1lIE9yZGVyLCAxOTkyIChTLkkuIDE5OTIvMTcyOSkKKyMgU3VtbWVyIFRpbWUgT3JkZXIgMTk5NCAoUy5JLiAxOTk0LzI3OTgpCitSdWxlCUdCLUVpcmUgMTk5MAkxOTk1CS0JT2N0CVN1bj49MjIJMTowMHUJMAlHTVQKKyMgU3VtbWVyIFRpbWUgT3JkZXIgMTk5NyAoUy5JLiAxOTk3LzI5ODIpCisjIFNlZSBFVSBmb3IgcnVsZXMgc3RhcnRpbmcgaW4gMTk5Ni4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvTG9uZG9uCS0wOjAxOjE1IC0JTE1UCTE4NDcgRGVjICAxIDA6MDBzCisJCQkgMDowMAlHQi1FaXJlCSVzCTE5NjggT2N0IDI3CisJCQkgMTowMAktCUJTVAkxOTcxIE9jdCAzMSAyOjAwdQorCQkJIDA6MDAJR0ItRWlyZQklcwkxOTk2CisJCQkgMDowMAlFVQlHTVQvQlNUCitMaW5rCUV1cm9wZS9Mb25kb24JRXVyb3BlL0plcnNleQorTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9HdWVybnNleQorTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9Jc2xlX29mX01hbgorWm9uZQlFdXJvcGUvRHVibGluCS0wOjI1OjAwIC0JTE1UCTE4ODAgQXVnICAyCisJCQktMDoyNToyMSAtCURNVAkxOTE2IE1heSAyMSAyOjAwCisJCQktMDoyNToyMSAxOjAwCUlTVAkxOTE2IE9jdCAgMSAyOjAwcworCQkJIDA6MDAJR0ItRWlyZQklcwkxOTIxIERlYyAgNiAjIGluZGVwZW5kZW5jZQorCQkJIDA6MDAJR0ItRWlyZQlHTVQvSVNUCTE5NDAgRmViIDI1IDI6MDAKKwkJCSAwOjAwCTE6MDAJSVNUCTE5NDYgT2N0ICA2IDI6MDAKKwkJCSAwOjAwCS0JR01UCTE5NDcgTWFyIDE2IDI6MDAKKwkJCSAwOjAwCTE6MDAJSVNUCTE5NDcgTm92ICAyIDI6MDAKKwkJCSAwOjAwCS0JR01UCTE5NDggQXByIDE4IDI6MDAKKwkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTY4IE9jdCAyNworCQkJIDE6MDAJLQlJU1QJMTk3MSBPY3QgMzEgMjowMHUKKwkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTk2CisJCQkgMDowMAlFVQlHTVQvSVNUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFdXJvcGUKKworIyBFVSBydWxlcyBhcmUgZm9yIHRoZSBFdXJvcGVhbiBVbmlvbiwgcHJldmlvdXNseSBrbm93biBhcyB0aGUgRUMsIEVFQywKKyMgQ29tbW9uIE1hcmtldCwgZXRjLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlFVQkxOTc3CTE5ODAJLQlBcHIJU3VuPj0xCSAxOjAwdQkxOjAwCVMKK1J1bGUJRVUJMTk3Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDE6MDB1CTAJLQorUnVsZQlFVQkxOTc4CW9ubHkJLQlPY3QJIDEJIDE6MDB1CTAJLQorUnVsZQlFVQkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMTowMHUJMAktCitSdWxlCUVVCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDE6MDB1CTE6MDAJUworUnVsZQlFVQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAxOjAwdQkwCS0KKyMgVGhlIG1vc3QgcmVjZW50IGRpcmVjdGl2ZSBjb3ZlcnMgdGhlIHllYXJzIHN0YXJ0aW5nIGluIDIwMDIuICBTZWU6CisjIDxhPSJodHRwOi8vZXVyLWxleC5ldXJvcGEuZXUvTGV4VXJpU2Vydi9MZXhVcmlTZXJ2LmRvP3VyaT1DRUxFWDozMjAwMEwwMDg0OkVOOk5PVCI+CisjIERpcmVjdGl2ZSAyMDAwLzg0L0VDIG9mIHRoZSBFdXJvcGVhbiBQYXJsaWFtZW50IGFuZCBvZiB0aGUgQ291bmNpbAorIyBvZiAxOSBKYW51YXJ5IDIwMDEgb24gc3VtbWVyLXRpbWUgYXJyYW5nZW1lbnRzLgorIyA8L2E+CisKKyMgVy1FdXIgZGlmZmVycyBmcm9tIEVVIG9ubHkgaW4gdGhhdCBXLUV1ciB1c2VzIHN0YW5kYXJkIHRpbWUuCitSdWxlCVctRXVyCTE5NzcJMTk4MAktCUFwcglTdW4+PTEJIDE6MDBzCTE6MDAJUworUnVsZQlXLUV1cgkxOTc3CW9ubHkJLQlTZXAJbGFzdFN1bgkgMTowMHMJMAktCitSdWxlCVctRXVyCTE5NzgJb25seQktCU9jdAkgMQkgMTowMHMJMAktCitSdWxlCVctRXVyCTE5NzkJMTk5NQktCVNlcAlsYXN0U3VuCSAxOjAwcwkwCS0KK1J1bGUJVy1FdXIJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMTowMHMJMTowMAlTCitSdWxlCVctRXVyCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDE6MDBzCTAJLQorCisjIE9sZGVyIEMtRXVyIHJ1bGVzIGFyZSBmb3IgY29udmVuaWVuY2UgaW4gdGhlIHRhYmxlcy4KKyMgRnJvbSAxOTc3IG9uLCBDLUV1ciBkaWZmZXJzIGZyb20gRVUgb25seSBpbiB0aGF0IEMtRXVyIHVzZXMgc3RhbmRhcmQgdGltZS4KK1J1bGUJQy1FdXIJMTkxNglvbmx5CS0JQXByCTMwCTIzOjAwCTE6MDAJUworUnVsZQlDLUV1cgkxOTE2CW9ubHkJLQlPY3QJIDEJIDE6MDAJMAktCitSdWxlCUMtRXVyCTE5MTcJMTkxOAktCUFwcglNb24+PTE1CSAyOjAwcwkxOjAwCVMKK1J1bGUJQy1FdXIJMTkxNwkxOTE4CS0JU2VwCU1vbj49MTUJIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTQwCW9ubHkJLQlBcHIJIDEJIDI6MDBzCTE6MDAJUworUnVsZQlDLUV1cgkxOTQyCW9ubHkJLQlOb3YJIDIJIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTQzCW9ubHkJLQlNYXIJMjkJIDI6MDBzCTE6MDAJUworUnVsZQlDLUV1cgkxOTQzCW9ubHkJLQlPY3QJIDQJIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTQ0CTE5NDUJLQlBcHIJTW9uPj0xCSAyOjAwcwkxOjAwCVMKKyMgV2hpdG1hbiBnaXZlcyAxOTQ0IE9jdCA3OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJQy1FdXIJMTk0NAlvbmx5CS0JT2N0CSAyCSAyOjAwcwkwCS0KKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDctMTMpOgorIworIyBJIGZvdW5kIHdoYXQgaXMgcHJvYmFibHkgYSB0eXBvIG9mIDI6MDAgd2hpY2ggc2hvdWxkIHBlcmhhcHMgYmUgMjowMHMKKyMgaW4gdGhlIEMtRXVyIHJ1bGUgZnJvbSB0eiBkYXRhYmFzZSB2ZXJzaW9uIDIwMDhkICh0aGlzIHBhcnQgd2FzCisjIGNvcnJlY3RlZCBpbiB2ZXJzaW9uIDIwMDhkKS4gVGhlIGNpcmN1bXN0YW5jaWFsIGV2aWRlbmNlIGlzIHNpbXBseSB0aGUKKyMgdHogZGF0YWJhc2UgaXRzZWxmLCBhcyBzZWVuIGJlbG93OgorIworIyBab25lIEV1cm9wZS9QYXJpcyAwOjA5OjIxIC0gTE1UIDE4OTEgTWFyIDE1ICAwOjAxCisjICAgIDA6MDAgRnJhbmNlIFdFJXNUIDE5NDUgU2VwIDE2ICAzOjAwCisjCisjIFpvbmUgRXVyb3BlL01vbmFjbyAwOjI5OjMyIC0gTE1UIDE4OTEgTWFyIDE1CisjICAgIDA6MDAgRnJhbmNlIFdFJXNUIDE5NDUgU2VwIDE2IDM6MDAKKyMKKyMgWm9uZSBFdXJvcGUvQmVsZ3JhZGUgMToyMjowMCAtIExNVCAxODg0CisjICAgIDE6MDAgMTowMCBDRVNUIDE5NDUgU2VwIDE2ICAyOjAwcworIworIyBSdWxlIEZyYW5jZSAxOTQ1IG9ubHkgLSBTZXAgMTYgIDM6MDAgMCAtCisjIFJ1bGUgQmVsZ2l1bSAxOTQ1IG9ubHkgLSBTZXAgMTYgIDI6MDBzIDAgLQorIyBSdWxlIE5ldGggMTk0NSBvbmx5IC0gU2VwIDE2IDI6MDBzIDAgLQorIworIyBUaGUgcnVsZSBsaW5lIHRvIGJlIGNoYW5nZWQgaXM6CisjCisjIFJ1bGUgQy1FdXIgMTk0NSBvbmx5IC0gU2VwIDE2ICAyOjAwIDAgLQorIworIyBJdCBzZWVtcyB0aGF0IFBhcmlzLCBNb25hY28sIFJ1bGUgRnJhbmNlLCBSdWxlIEJlbGdpdW0gYWxsIGFncmVlIG9uCisjIDI6MDAgc3RhbmRhcmQgdGltZSwgZS5nLiAzOjAwIGxvY2FsIHRpbWUuICBIb3dldmVyIHRoZXJlIGFyZSBubworIyBjb3VudHJpZXMgdGhhdCB1c2UgQy1FdXIgcnVsZXMgaW4gU2VwdGVtYmVyIDE5NDUsIHNvIHRoZSBvbmx5IGl0ZW1zCisjIGFmZmVjdGVkIGFyZSBhcHBhcmVudGx5IHRoZXNlIGZpY3RpY2lvdXMgem9uZXMgdGhhdCB0cmFuc2xhdGVzIGFjcm9ueW1zCisjIENFVCBhbmQgTUVUOgorIworIyBab25lIENFVCAgMTowMCBDLUV1ciBDRSVzVAorIyBab25lIE1FVCAgMTowMCBDLUV1ciBNRSVzVAorIworIyBJdCB0aGlzIGlzIHJpZ2h0IHRoZW4gdGhlIGNvcnJlY3RlZCB2ZXJzaW9uIHdvdWxkIGxvb2sgbGlrZToKKyMKKyMgUnVsZSBDLUV1ciAxOTQ1IG9ubHkgLSBTZXAgMTYgIDI6MDBzIDAgLQorIworIyBBIHNtYWxsIHN0ZXAgZm9yIG1hbmtpbmQgdGhvdWdoIDgtKQorUnVsZQlDLUV1cgkxOTQ1CW9ubHkJLQlTZXAJMTYJIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTc3CTE5ODAJLQlBcHIJU3VuPj0xCSAyOjAwcwkxOjAwCVMKK1J1bGUJQy1FdXIJMTk3Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTc4CW9ubHkJLQlPY3QJIDEJIDI6MDBzCTAJLQorUnVsZQlDLUV1cgkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCitSdWxlCUMtRXVyCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUworUnVsZQlDLUV1cgkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAyOjAwcwkwCS0KKworIyBFLUV1ciBkaWZmZXJzIGZyb20gRVUgb25seSBpbiB0aGF0IEUtRXVyIHN3aXRjaGVzIGF0IG1pZG5pZ2h0IGxvY2FsIHRpbWUuCitSdWxlCUUtRXVyCTE5NzcJMTk4MAktCUFwcglTdW4+PTEJIDA6MDAJMTowMAlTCitSdWxlCUUtRXVyCTE5NzcJb25seQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQorUnVsZQlFLUV1cgkxOTc4CW9ubHkJLQlPY3QJIDEJIDA6MDAJMAktCitSdWxlCUUtRXVyCTE5NzkJMTk5NQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQorUnVsZQlFLUV1cgkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAwOjAwCTE6MDAJUworUnVsZQlFLUV1cgkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAwOjAwCTAJLQorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JSnVsCSAxCTIzOjAwCTE6MDAJTVNUCSMgTW9zY293IFN1bW1lciBUaW1lCitSdWxlCVJ1c3NpYQkxOTE3CW9ubHkJLQlEZWMJMjgJIDA6MDAJMAlNTVQJIyBNb3Njb3cgTWVhbiBUaW1lCitSdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlNYXkJMzEJMjI6MDAJMjowMAlNRFNUCSMgTW9zY293IERvdWJsZSBTdW1tZXIgVGltZQorUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JU2VwCTE2CSAxOjAwCTE6MDAJTVNUCitSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlNYXkJMzEJMjM6MDAJMjowMAlNRFNUCitSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlKdWwJIDEJIDI6MDAJMTowMAlTCitSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlBdWcJMTYJIDA6MDAJMAktCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlGZWIJMTQJMjM6MDAJMTowMAlTCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlNYXIJMjAJMjM6MDAJMjowMAlNICMgTWlkc3VtbWVyCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlTZXAJIDEJIDA6MDAJMTowMAlTCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlPY3QJIDEJIDA6MDAJMAktCisjIEFjdCBOby45MjUgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIHRoZSBVU1NSICgxOTgwLTEwLTI0KToKK1J1bGUJUnVzc2lhCTE5ODEJMTk4NAktCUFwcgkgMQkgMDowMAkxOjAwCVMKK1J1bGUJUnVzc2lhCTE5ODEJMTk4MwktCU9jdAkgMQkgMDowMAkwCS0KKyMgQWN0IE5vLjk2NyBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgdGhlIFVTU1IgKDE5ODQtMDktMTMpLCByZXBlYXRlZCBpbgorIyBBY3QgTm8uMjI3IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiB0aGUgVVNTUiAoMTk4OS0wMy0xNCk6CitSdWxlCVJ1c3NpYQkxOTg0CTE5OTEJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCitSdWxlCVJ1c3NpYQkxOTg1CTE5OTEJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCisjCitSdWxlCVJ1c3NpYQkxOTkyCW9ubHkJLQlNYXIJbGFzdFNhdAkgMjM6MDAJMTowMAlTCitSdWxlCVJ1c3NpYQkxOTkyCW9ubHkJLQlTZXAJbGFzdFNhdAkgMjM6MDAJMAktCitSdWxlCVJ1c3NpYQkxOTkzCW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKK1J1bGUJUnVzc2lhCTE5OTMJMTk5NQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KK1J1bGUJUnVzc2lhCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDI6MDBzCTAJLQorCisjIFRoZXNlIGFyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCVdFVAkJMDowMAlFVQlXRSVzVAorWm9uZQlDRVQJCTE6MDAJQy1FdXIJQ0Ulc1QKK1pvbmUJTUVUCQkxOjAwCUMtRXVyCU1FJXNUCitab25lCUVFVAkJMjowMAlFVQlFRSVzVAorCisjIFByZXZpb3VzIGVkaXRpb25zIG9mIHRoaXMgZGF0YWJhc2UgdXNlZCBhYmJyZXZpYXRpb25zIGxpa2UgTUVUIERTVAorIyBmb3IgQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSwgYnV0IHRoaXMgZGlkbid0IGFncmVlIHdpdGggY29tbW9uIHVzYWdlLgorCisjIEZyb20gTWFya3VzIEt1aG4gKDE5OTYtMDctMTIpOgorIyBUaGUgb2ZmaWNpYWwgR2VybWFuIG5hbWVzIC4uLiBhcmUKKyMKKyMJTWl0dGVsZXVyb3BhZWlzY2hlIFplaXQgKE1FWikgICAgICAgICA9IFVUQyswMTowMAorIwlNaXR0ZWxldXJvcGFlaXNjaGUgU29tbWVyemVpdCAoTUVTWikgID0gVVRDKzAyOjAwCisjCisjIGFzIGRlZmluZWQgaW4gdGhlIEdlcm1hbiBUaW1lIEFjdCAoR2VzZXR6IHVlYmVyIGRpZSBaZWl0YmVzdGltbXVuZyAoWmVpdEcpLAorIyAxOTc4LTA3LTI1LCBCdW5kZXNnZXNldHpibGF0dCwgSmFocmdhbmcgMTk3OCwgVGVpbCBJLCBTLiAxMTEwLTExMTEpLi4uLgorIyBJIHdyb3RlIC4uLiB0byB0aGUgR2VybWFuIEZlZGVyYWwgUGh5c2ljYWwtVGVjaG5pY2FsIEluc3RpdHV0aW9uCisjCisjCVBoeXNpa2FsaXNjaC1UZWNobmlzY2hlIEJ1bmRlc2Fuc3RhbHQgKFBUQikKKyMJTGFib3JhdG9yaXVtIDQuNDEgIlplaXRlaW5oZWl0IgorIwlQb3N0ZmFjaCAzMzQ1CisjCUQtMzgwMjMgQnJhdW5zY2h3ZWlnCisjCXBob25lOiArNDkgNTMxIDU5Mi0wCisjCisjIC4uLiBJIHJlY2VpdmVkIHRvZGF5IGFuIGFuc3dlciBsZXR0ZXIgZnJvbSBEci4gUGV0ZXIgSGV0emVsLCBoZWFkIG9mIHRoZSBQVEIKKyMgZGVwYXJ0bWVudCBmb3IgdGltZSBhbmQgZnJlcXVlbmN5IHRyYW5zbWlzc2lvbi4gIEhlIGV4cGxhaW5lZCB0aGF0IHRoZQorIyBQVEIgdHJhbnNsYXRlcyBNRVogYW5kIE1FU1ogaW50byBFbmdsaXNoIGFzCisjCisjCUNlbnRyYWwgRXVyb3BlYW4gVGltZSAoQ0VUKSAgICAgICAgID0gVVRDKzAxOjAwCisjCUNlbnRyYWwgRXVyb3BlYW4gU3VtbWVyIFRpbWUgKENFU1QpID0gVVRDKzAyOjAwCisKKworIyBBbGJhbmlhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlBbGJhbmlhCTE5NDAJb25seQktCUp1bgkxNgkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NDIJb25seQktCU5vdgkgMgkzOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NDMJb25seQktCU1hcgkyOQkyOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NDMJb25seQktCUFwcgkxMAkzOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzQJb25seQktCU1heQkgNAkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzQJb25seQktCU9jdAkgMgkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzUJb25seQktCU9jdAkgMgkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzYJb25seQktCU1heQkgMgkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzYJb25seQktCU9jdAkgMwkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzcJb25seQktCU1heQkgOAkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzcJb25seQktCU9jdAkgMgkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzgJb25seQktCU1heQkgNgkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzgJb25seQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5NzkJb25seQktCU1heQkgNQkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5NzkJb25seQktCVNlcAkzMAkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5ODAJb25seQktCU1heQkgMwkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5ODAJb25seQktCU9jdAkgNAkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5ODEJb25seQktCUFwcgkyNgkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5ODEJb25seQktCVNlcAkyNwkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5ODIJb25seQktCU1heQkgMgkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5ODIJb25seQktCU9jdAkgMwkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5ODMJb25seQktCUFwcgkxOAkwOjAwCTE6MDAJUworUnVsZQlBbGJhbmlhCTE5ODMJb25seQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlBbGJhbmlhCTE5ODQJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvVGlyYW5lCTE6MTk6MjAgLQlMTVQJMTkxNAorCQkJMTowMAktCUNFVAkxOTQwIEp1biAxNgorCQkJMTowMAlBbGJhbmlhCUNFJXNUCTE5ODQgSnVsCisJCQkxOjAwCUVVCUNFJXNUCisKKyMgQW5kb3JyYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQW5kb3JyYQkwOjA2OjA0IC0JTE1UCTE5MDEKKwkJCTA6MDAJLQlXRVQJMTk0NiBTZXAgMzAKKwkJCTE6MDAJLQlDRVQJMTk4NSBNYXIgMzEgMjowMAorCQkJMTowMAlFVQlDRSVzVAorCisjIEF1c3RyaWEKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKTogU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMTkxOC0wNi0xNiBhbmQKKyMgMTk0NS0xMS0xOCwgYnV0IHRoZSBBdXN0cmlhbiBGZWRlcmFsIE9mZmljZSBvZiBNZXRyb2xvZ3kgYW5kCisjIFN1cnZleWluZyAoQkVWKSBnaXZlcyAxOTE4LTA5LTE2IGFuZCBmb3IgVmllbm5hIGdpdmVzIHRoZSAiYWxsZWdlZCIKKyMgZGF0ZSBvZiAxOTQ1LTA0LTEyIHdpdGggbm8gdGltZS4gIEZvciB0aGUgMTk4MC0wNC0wNiB0cmFuc2l0aW9uCisjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDAyOjAwLCB0aGUgQkVWIDAwOjAwLiAgR28gd2l0aCB0aGUgQkVWLAorIyBhbmQgZ3Vlc3MgMDI6MDAgZm9yIDE5NDUtMDQtMTIuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUF1c3RyaWEJMTkyMAlvbmx5CS0JQXByCSA1CTI6MDBzCTE6MDAJUworUnVsZQlBdXN0cmlhCTE5MjAJb25seQktCVNlcAkxMwkyOjAwcwkwCS0KK1J1bGUJQXVzdHJpYQkxOTQ2CW9ubHkJLQlBcHIJMTQJMjowMHMJMTowMAlTCitSdWxlCUF1c3RyaWEJMTk0NgkxOTQ4CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJQXVzdHJpYQkxOTQ3CW9ubHkJLQlBcHIJIDYJMjowMHMJMTowMAlTCitSdWxlCUF1c3RyaWEJMTk0OAlvbmx5CS0JQXByCTE4CTI6MDBzCTE6MDAJUworUnVsZQlBdXN0cmlhCTE5ODAJb25seQktCUFwcgkgNgkwOjAwCTE6MDAJUworUnVsZQlBdXN0cmlhCTE5ODAJb25seQktCVNlcAkyOAkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvVmllbm5hCTE6MDU6MjAgLQlMTVQJMTg5MyBBcHIKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkyMAorCQkJMTowMAlBdXN0cmlhCUNFJXNUCTE5NDAgQXByICAxIDI6MDBzCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDBzCisJCQkxOjAwCTE6MDAJQ0VTVAkxOTQ1IEFwciAxMiAyOjAwcworCQkJMTowMAktCUNFVAkxOTQ2CisJCQkxOjAwCUF1c3RyaWEJQ0Ulc1QJMTk4MQorCQkJMTowMAlFVQlDRSVzVAorCisjIEJlbGFydXMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJRXVyb3BlL01pbnNrCTE6NTA6MTYgLQlMTVQJMTg4MAorCQkJMTo1MAktCU1NVAkxOTI0IE1heSAyICMgTWluc2sgTWVhbiBUaW1lCisJCQkyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCisJCQkzOjAwCS0JTVNLCTE5NDEgSnVuIDI4CisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgSnVsICAzCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKKwkJCTM6MDAJLQlNU0sJMTk5MSBNYXIgMzEgMjowMHMKKwkJCTI6MDAJMTowMAlFRVNUCTE5OTEgU2VwIDI5IDI6MDBzCisJCQkyOjAwCS0JRUVUCTE5OTIgTWFyIDI5IDA6MDBzCisJCQkyOjAwCTE6MDAJRUVTVAkxOTkyIFNlcCAyNyAwOjAwcworCQkJMjowMAlSdXNzaWEJRUUlc1QKKworIyBCZWxnaXVtCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTctMDctMDIpOgorIyBFbnRyaWVzIGZyb20gMTkxOCB0aHJvdWdoIDE5OTEgYXJlIHRha2VuIGZyb206CisjCUFubnVhaXJlIGRlIEwnT2JzZXJ2YXRvaXJlIFJveWFsIGRlIEJlbGdpcXVlLAorIwlBdmVudWUgQ2lyY3VsYWlyZSwgMywgQi0xMTgwIEJSVVhFTExFUywgQ0xWSUllIGFubmVlLCAxOTkxCisjCShJbXByaW1lcmllIEhBWUVaLCBzLnAuci5sLiwgUnVlIEZpbiwgNCwgMTA4MCBCUlVYRUxMRVMsIE1DTVhDKSwKKyMJcHAgOC05LgorIyBMTVQgYmVmb3JlIDE4OTIgd2FzIDA6MTc6MzAsIGFjY29yZGluZyB0byB0aGUgb2ZmaWNpYWwgam91cm5hbCBvZiBCZWxnaXVtOgorIwlNb25pdGV1ciBCZWxnZSwgU2FtZWRpIDMwIEF2cmlsIDE4OTIsIE4uMTIxLgorIyBUaGFua3MgdG8gUGFzY2FsIERlbG1vaXRpZSBmb3IgdGhlc2UgcmVmZXJlbmNlcy4KKyMgVGhlIDE5MTggcnVsZXMgYXJlIGxpc3RlZCBmb3IgY29tcGxldGVuZXNzOyB0aGV5IGFwcGx5IHRvIHVub2NjdXBpZWQgQmVsZ2l1bS4KKyMgQXNzdW1lIEJydXNzZWxzIHN3aXRjaGVkIHRvIFdFVCBpbiAxOTE4IHdoZW4gdGhlIGFybWlzdGljZSB0b29rIGVmZmVjdC4KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUJlbGdpdW0JMTkxOAlvbmx5CS0JTWFyCSA5CSAwOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTE4CTE5MTkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KK1J1bGUJQmVsZ2l1bQkxOTE5CW9ubHkJLQlNYXIJIDEJMjM6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MjAJb25seQktCUZlYgkxNAkyMzowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkyMAlvbmx5CS0JT2N0CTIzCTIzOjAwcwkwCS0KK1J1bGUJQmVsZ2l1bQkxOTIxCW9ubHkJLQlNYXIJMTQJMjM6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MjEJb25seQktCU9jdAkyNQkyMzowMHMJMAktCitSdWxlCUJlbGdpdW0JMTkyMglvbmx5CS0JTWFyCTI1CTIzOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTIyCTE5MjcJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KK1J1bGUJQmVsZ2l1bQkxOTIzCW9ubHkJLQlBcHIJMjEJMjM6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MjQJb25seQktCU1hcgkyOQkyMzowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkyNQlvbmx5CS0JQXByCSA0CTIzOjAwcwkxOjAwCVMKKyMgRFNIIHdyaXRlcyB0aGF0IGEgcm95YWwgZGVjcmVlIG9mIDE5MjYtMDItMjIgc3BlY2lmaWVkIHRoZSBTdW4gZm9sbG93aW5nIDNyZAorIyBTYXQgaW4gQXByIChleGNlcHQgaWYgaXQncyBFYXN0ZXIsIGluIHdoaWNoIGNhc2UgaXQncyBvbmUgU3VuZGF5IGVhcmxpZXIpLAorIyB0byBTdW4gZm9sbG93aW5nIDFzdCBTYXQgaW4gT2N0LCBhbmQgdGhhdCBhIHJveWFsIGRlY3JlZSBvZiAxOTI4LTA5LTE1CisjIGNoYW5nZWQgdGhlIHRyYW5zaXRpb24gdGltZXMgdG8gMDI6MDAgR01ULgorUnVsZQlCZWxnaXVtCTE5MjYJb25seQktCUFwcgkxNwkyMzowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkyNwlvbmx5CS0JQXByCSA5CTIzOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MjgJMTkzOAktCU9jdAlTdW4+PTIJIDI6MDBzCTAJLQorUnVsZQlCZWxnaXVtCTE5MjkJb25seQktCUFwcgkyMQkgMjowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkzMAlvbmx5CS0JQXByCTEzCSAyOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTMxCW9ubHkJLQlBcHIJMTkJIDI6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MzIJb25seQktCUFwcgkgMwkgMjowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkzMwlvbmx5CS0JTWFyCTI2CSAyOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTM0CW9ubHkJLQlBcHIJIDgJIDI6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MzUJb25seQktCU1hcgkzMQkgMjowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkzNglvbmx5CS0JQXByCTE5CSAyOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTM3CW9ubHkJLQlBcHIJIDQJIDI6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5MzgJb25seQktCU1hcgkyNwkgMjowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTkzOQlvbmx5CS0JQXByCTE2CSAyOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTM5CW9ubHkJLQlOb3YJMTkJIDI6MDBzCTAJLQorUnVsZQlCZWxnaXVtCTE5NDAJb25seQktCUZlYgkyNQkgMjowMHMJMTowMAlTCitSdWxlCUJlbGdpdW0JMTk0NAlvbmx5CS0JU2VwCTE3CSAyOjAwcwkwCS0KK1J1bGUJQmVsZ2l1bQkxOTQ1CW9ubHkJLQlBcHIJIDIJIDI6MDBzCTE6MDAJUworUnVsZQlCZWxnaXVtCTE5NDUJb25seQktCVNlcAkxNgkgMjowMHMJMAktCitSdWxlCUJlbGdpdW0JMTk0Nglvbmx5CS0JTWF5CTE5CSAyOjAwcwkxOjAwCVMKK1J1bGUJQmVsZ2l1bQkxOTQ2CW9ubHkJLQlPY3QJIDcJIDI6MDBzCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQnJ1c3NlbHMJMDoxNzozMCAtCUxNVAkxODgwCisJCQkwOjE3OjMwCS0JQk1UCTE4OTIgTWF5ICAxIDEyOjAwICMgQnJ1c3NlbHMgTVQKKwkJCTA6MDAJLQlXRVQJMTkxNCBOb3YgIDgKKwkJCTE6MDAJLQlDRVQJMTkxNiBNYXkgIDEgIDA6MDAKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOCBOb3YgMTEgMTE6MDB1CisJCQkwOjAwCUJlbGdpdW0JV0Ulc1QJMTk0MCBNYXkgMjAgIDI6MDBzCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgU2VwICAzCisJCQkxOjAwCUJlbGdpdW0JQ0Ulc1QJMTk3NworCQkJMTowMAlFVQlDRSVzVAorCisjIEJvc25pYSBhbmQgSGVyemVnb3ZpbmEKKyMgc2VlIFNlcmJpYQorCisjIEJ1bGdhcmlhCisjCisjIEZyb20gUGxhbWVuIFNpbWVub3YgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0wOS0wOSk6CisjIEEgZG9jdW1lbnQgb2YgR292ZXJubWVudCBvZiBCdWxnYXJpYSAoTm8uOTQvMTk5Nykgc2F5czoKKyMgRUVUIC0tPiBFRVREU1QgaXMgaW4gMDM6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBNYXJjaCAuLi4KKyMgRUVURFNUIC0tPiBFRVQgaXMgaW4gMDQ6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBPY3RvYmVyCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlCdWxnCTE5NzkJb25seQktCU1hcgkzMQkyMzowMAkxOjAwCVMKK1J1bGUJQnVsZwkxOTc5CW9ubHkJLQlPY3QJIDEJIDE6MDAJMAktCitSdWxlCUJ1bGcJMTk4MAkxOTgyCS0JQXByCVNhdD49MQkyMzowMAkxOjAwCVMKK1J1bGUJQnVsZwkxOTgwCW9ubHkJLQlTZXAJMjkJIDE6MDAJMAktCitSdWxlCUJ1bGcJMTk4MQlvbmx5CS0JU2VwCTI3CSAyOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvU29maWEJMTozMzoxNiAtCUxNVAkxODgwCisJCQkxOjU2OjU2CS0JSU1UCTE4OTQgTm92IDMwICMgSXN0YW5idWwgTVQ/CisJCQkyOjAwCS0JRUVUCTE5NDIgTm92ICAyICAzOjAwCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUKKwkJCTE6MDAJLQlDRVQJMTk0NSBBcHIgMiAzOjAwCisJCQkyOjAwCS0JRUVUCTE5NzkgTWFyIDMxIDIzOjAwCisJCQkyOjAwCUJ1bGcJRUUlc1QJMTk4MiBTZXAgMjYgIDI6MDAKKwkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5MQorCQkJMjowMAlFLUV1cglFRSVzVAkxOTk3CisJCQkyOjAwCUVVCUVFJXNUCisKKyMgQ3JvYXRpYQorIyBzZWUgU2VyYmlhCisKKyMgQ3lwcnVzCisjIFBsZWFzZSBzZWUgdGhlIGBhc2lhJyBmaWxlIGZvciBBc2lhL05pY29zaWEuCisKKyMgQ3plY2ggUmVwdWJsaWMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUN6ZWNoCTE5NDUJb25seQktCUFwcgkgOAkyOjAwcwkxOjAwCVMKK1J1bGUJQ3plY2gJMTk0NQlvbmx5CS0JTm92CTE4CTI6MDBzCTAJLQorUnVsZQlDemVjaAkxOTQ2CW9ubHkJLQlNYXkJIDYJMjowMHMJMTowMAlTCitSdWxlCUN6ZWNoCTE5NDYJMTk0OQktCU9jdAlTdW4+PTEJMjowMHMJMAktCitSdWxlCUN6ZWNoCTE5NDcJb25seQktCUFwcgkyMAkyOjAwcwkxOjAwCVMKK1J1bGUJQ3plY2gJMTk0OAlvbmx5CS0JQXByCTE4CTI6MDBzCTE6MDAJUworUnVsZQlDemVjaAkxOTQ5CW9ubHkJLQlBcHIJIDkJMjowMHMJMTowMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9QcmFndWUJMDo1Nzo0NCAtCUxNVAkxODUwCisJCQkwOjU3OjQ0CS0JUE1UCTE4OTEgT2N0ICAgICAjIFByYWd1ZSBNZWFuIFRpbWUKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBTZXAgMTcgMjowMHMKKwkJCTE6MDAJQ3plY2gJQ0Ulc1QJMTk3OQorCQkJMTowMAlFVQlDRSVzVAorCisjIERlbm1hcmssIEZhcm9lIElzbGFuZHMsIGFuZCBHcmVlbmxhbmQKKworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNS0wNC0yNik6CisjIGh0dHA6Ly93d3cuaHVtLmFhdS5kay9+cG9lL3RpZC90aW5lL0RhbnNrVGlkLmh0bSBzYXlzIHRoYXQgdGhlIGxhdworIyBbaW50cm9kdWNpbmcgc3RhbmRhcmQgdGltZV0gd2FzIGluIGVmZmVjdCBmcm9tIDE4OTQtMDEtMDEuLi4uCisjIFRoZSBwYWdlIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQTE4OTMwMDA4MzMwLVJFR0wKKyMgY29uZmlybXMgdGhpcywgYW5kIHN0YXRlcyB0aGF0IHRoZSBsYXcgd2FzIHB1dCBmb3J0aCAxODkzLTAzLTI5LgorIworIyBUaGUgRVUgdHJlYXR5IHdpdGggZWZmZWN0IGZyb20gMTk3MzoKKyMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTk3MjIxMTAwMzAtUkVHTAorIworIyBUaGlzIHByb3Zva2VkIGEgbmV3IGxhdyBmcm9tIDE5NzQgdG8gbWFrZSBwb3NzaWJsZSBzdW1tZXIgdGltZSBjaGFuZ2VzCisjIGluIHN1YnNlcXVlbmV0IGRlY3JlZXMgd2l0aCB0aGUgbGF3CisjIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQTE5NzQwMDIyMzMwLVJFR0wKKyMKKyMgSXQgc2VlbXMgaG93ZXZlciB0aGF0IG5vIGRlY3JlZSB3YXMgc2V0IGZvcndhcmQgdW50aWwgMTk4MC4gIEkgaGF2ZQorIyBub3QgZm91bmQgYW55IGRlY3JlZSwgYnV0IGluIGFub3RoZXIgcmVsYXRlZCBsYXcsIHRoZSBlZmZlY3RpbmcgRFNUCisjIGNoYW5nZXMgYXJlIHN0YXRlZCBleHBsaWNpdGx5IHRvIGJlIGZyb20gMTk4MC0wNC0wNiBhdCAwMjowMCB0bworIyAxOTgwLTA5LTI4IGF0IDAyOjAwLiAgSWYgdGhpcyBpcyB0cnVlLCB0aGlzIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbQorIyB0aGUgRVUgcnVsZSBpbiB0aGF0IERTVCBydW5zIHRvIDAyOjAwLCBub3QgMDM6MDAuICBXZSBkb24ndCBrbm93CisjIHdoZW4gRGVubWFyayBiZWdhbiB1c2luZyB0aGUgRVUgcnVsZSBjb3JyZWN0bHksIGJ1dCB3ZSBoYXZlIG9ubHkKKyMgY29uZmlybWF0aW9uIG9mIHRoZSAxOTgwLXRpbWUsIHNvIEkgcHJlc3VtZSBpdCB3YXMgY29ycmVjdCBpbiAxOTgxOgorIyBUaGUgbGF3IGlzIGFib3V0IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBleHRyYSBob3VyLCBjb25jZXJuaW5nCisjIHdvcmtpbmcgaG91cnMgcmVwb3J0ZWQgYW5kIGVmZmVjdCBvbiBvYmxpZ2F0b3J5LXJlc3QgcnVsZXMgKHdoaWNoCisjIHdhcyBzdXNwZW5kZWQgb24gdGhhdCBuaWdodCk6CisjIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQzE5ODAxMTIwNTU0LVJFR0wKKworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNS0wNi0xMSk6CisjIFRoZSBIZXJuaW5nIEZvbGtlYmxhZCAoMTk4MC0wOS0yNikgcmVwb3J0ZWQgdGhhdCB0aGUgbmlnaHQgYmV0d2VlbgorIyBTYXR1cmRheSBhbmQgU3VuZGF5IHRoZSBjbG9jayBpcyBzZXQgYmFjayBmcm9tIHRocmVlIHRvIHR3by4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA2LTExKToKKyMgSGVuY2UgdGhlICIwMjowMCIgb2YgdGhlIDE5ODAgbGF3IHJlZmVycyB0byBzdGFuZGFyZCB0aW1lLCBub3QKKyMgd2FsbC1jbG9jayB0aW1lLCBhbmQgc28gdGhlIEVVIHJ1bGVzIHdlcmUgaW4gZWZmZWN0IGluIDE5ODAuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCURlbm1hcmsJMTkxNglvbmx5CS0JTWF5CTE0CTIzOjAwCTE6MDAJUworUnVsZQlEZW5tYXJrCTE5MTYJb25seQktCVNlcAkzMAkyMzowMAkwCS0KK1J1bGUJRGVubWFyawkxOTQwCW9ubHkJLQlNYXkJMTUJIDA6MDAJMTowMAlTCitSdWxlCURlbm1hcmsJMTk0NQlvbmx5CS0JQXByCSAyCSAyOjAwcwkxOjAwCVMKK1J1bGUJRGVubWFyawkxOTQ1CW9ubHkJLQlBdWcJMTUJIDI6MDBzCTAJLQorUnVsZQlEZW5tYXJrCTE5NDYJb25seQktCU1heQkgMQkgMjowMHMJMTowMAlTCitSdWxlCURlbm1hcmsJMTk0Nglvbmx5CS0JU2VwCSAxCSAyOjAwcwkwCS0KK1J1bGUJRGVubWFyawkxOTQ3CW9ubHkJLQlNYXkJIDQJIDI6MDBzCTE6MDAJUworUnVsZQlEZW5tYXJrCTE5NDcJb25seQktCUF1ZwkxMAkgMjowMHMJMAktCitSdWxlCURlbm1hcmsJMTk0OAlvbmx5CS0JTWF5CSA5CSAyOjAwcwkxOjAwCVMKK1J1bGUJRGVubWFyawkxOTQ4CW9ubHkJLQlBdWcJIDgJIDI6MDBzCTAJLQorIworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBFdXJvcGUvQ29wZW5oYWdlbgkgMDo1MDoyMCAtCUxNVAkxODkwCisJCQkgMDo1MDoyMCAtCUNNVAkxODk0IEphbiAgMSAjIENvcGVuaGFnZW4gTVQKKwkJCSAxOjAwCURlbm1hcmsJQ0Ulc1QJMTk0MiBOb3YgIDIgMjowMHMKKwkJCSAxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDAKKwkJCSAxOjAwCURlbm1hcmsJQ0Ulc1QJMTk4MAorCQkJIDE6MDAJRVUJQ0Ulc1QKK1pvbmUgQXRsYW50aWMvRmFyb2UJLTA6Mjc6MDQgLQlMTVQJMTkwOCBKYW4gMTEJIyBUb3JzaGF2bgorCQkJIDA6MDAJLQlXRVQJMTk4MQorCQkJIDA6MDAJRVUJV0Ulc1QKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNC0xMC0zMSk6CisjIER1cmluZyBXb3JsZCBXYXIgSUksIEdlcm1hbnkgbWFpbnRhaW5lZCBzZWNyZXQgbWFubmVkIHdlYXRoZXIgc3RhdGlvbnMgaW4KKyMgRWFzdCBHcmVlbmxhbmQgYW5kIEZyYW56IEpvc2VmIExhbmQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZWlyIHRpbWUgem9uZXMuCisjIE15IHNvdXJjZSBmb3IgdGhpcyBpcyBXaWxoZWxtIERlZ2UncyBib29rIG1lbnRpb25lZCB1bmRlciBTdmFsYmFyZC4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEdyZWVubGFuZCBqb2luZWQgdGhlIEVVIGFzIHBhcnQgb2YgRGVubWFyaywgb2J0YWluZWQgaG9tZSBydWxlIG9uIDE5NzktMDUtMDEsCisjIGFuZCBsZWZ0IHRoZSBFVSBvbiAxOTg1LTAyLTAxLiAgSXQgdGhlcmVmb3JlIHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgRVUKKyMgcnVsZXMgYXQgbGVhc3QgdGhyb3VnaCAxOTg0LiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBTY29yZXNieXN1bmQgYW5kIEdvZHRoYWIKKyMgdXNlZCBDLUV1ciBydWxlcyBhZnRlciAxOTgwLCBidXQgSUFUQSBTU0lNICgxOTkxLzE5OTYpIHNheXMgdGhleSB1c2UgRVUKKyMgcnVsZXMgc2luY2UgYXQgbGVhc3QgMTk5MS4gIEFzc3VtZSBFVSBydWxlcyBzaW5jZSAxOTgwLgorCisjIEZyb20gR3dpbGxpbiBMYXcgKDIwMDEtMDYtMDYpLCBjaXRpbmcKKyMgPGh0dHA6Ly93d3cuc3RhdGthcnQubm8vZWZzL2Vmc2hlZnRlci8yMDAxL2VmczUtMjAwMS5wZGY+ICgyMDAxLTAzLTE1KSwKKyMgYW5kIHdpdGggdHJhbnNsYXRpb25zIGNvcnJlY3RlZCBieSBTdGVmZmVuIFRob3JzZW46CisjCisjIEdyZWVubGFuZCBoYXMgZm91ciBsb2NhbCB0aW1lcywgYW5kIHRoZSByZWxhdGlvbiB0byBVVEMKKyMgaXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGltZSBsaW5lOgorIworIyBUaGUgbWlsaXRhcnkgem9uZSBuZWFyIFRodWxlCVVUQy00CisjIFN0YW5kYXJkIEdyZWVubGFuZCB0aW1lCVVUQy0zCisjIFNjb3Jlc2J5c3VuZAkJCVVUQy0xCisjIERhbm1hcmtzaGF2bgkJCVVUQworIworIyBJbiB0aGUgbWlsaXRhcnkgYXJlYSBuZWFyIFRodWxlIGFuZCBpbiBEYW5tYXJrc2hhdm4gRFNUIHdpbGwgbm90IGJlCisjIGludHJvZHVjZWQuCisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0xMS0wMSk6CisjCisjIEkgY29ycmVzcG9uZCByZWd1bGFybHkgd2l0aCB0aGUgRGFuc2sgUG9sYXJjZW50ZXIsIGFuZCB3cm90ZSB0aGVtIGF0CisjIHRoZSB0aW1lIHRvIGNsYXJpZnkgdGhlIHNpdHVhdGlvbiBpbiBUaHVsZS4gIFVuZm9ydHVuYXRlbHksIEkgaGF2ZQorIyBub3QgaGVhcmQgYmFjayBmcm9tIHRoZW0gcmVnYXJkaW5nIG15IHJlY2VudCBsZXR0ZXIuICBbQnV0IEkgaGF2ZQorIyBpbmZvIGZyb20gZWFybGllciBjb3JyZXNwb25kZW5jZS5dCisjCisjIEFjY29yZGluZyB0byB0aGUgY2VudGVyLCBhIHZlcnkgc21hbGwgbG9jYWwgdGltZSB6b25lIGFyb3VuZCBUaHVsZQorIyBBaXIgQmFzZSBrZWVwcyB0aGUgdGltZSBhY2NvcmRpbmcgdG8gVVRDLTQsIGltcGxlbWVudGluZyBkYXlsaWdodAorIyBzYXZpbmdzIHVzaW5nIE5vcnRoIEFtZXJpY2EgcnVsZXMsIGNoYW5naW5nIHRoZSB0aW1lIGF0IDAyOjAwIGxvY2FsIHRpbWUuLi4uCisjCisjIFRoZSBlYXN0IGNvYXN0IG9mIEdyZWVubGFuZCBub3J0aCBvZiB0aGUgY29tbXVuaXR5IG9mIFNjb3Jlc2J5c3VuZAorIyB1c2VzIFVUQyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gSWNlbGFuZCwgeWVhciByb3VuZCwgd2l0aCBubyBkc3QuCisjIFRoZXJlIGFyZSBqdXN0IGEgZmV3IHN0YXRpb25zIG9uIHRoaXMgY29hc3QsIGluY2x1ZGluZyB0aGUKKyMgRGFubWFya3NoYXZuIElDQU8gd2VhdGhlciBzdGF0aW9uIG1lbnRpb25lZCBpbiB5b3VyIFNlcHRlbWJlciAyOXRoCisjIGVtYWlsLiAgVGhlIG90aGVyIHN0YXRpb25zIGFyZSB0d28gc2xlZGdlIHBhdHJvbCBzdGF0aW9ucyBpbgorIyBNZXN0ZXJzdmlnIGFuZCBEYW5lYm9yZywgdGhlIGFpciBmb3JjZSBiYXNlIGF0IFN0YXRpb24gTm9yZCwgYW5kIHRoZQorIyBEUEMgcmVzZWFyY2ggc3RhdGlvbiBhdCBaYWNrZW5iZXJnLgorIworIyBTY29yZXNieXN1bmQgYW5kIHR3byBzbWFsbCB2aWxsYWdlcyBuZWFyYnkga2VlcCB0aW1lIFVUQy0xIGFuZCB1c2UKKyMgdGhlIHNhbWUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCBhcyBpbiBXZXN0IEdyZWVubGFuZCAoR29kdGhhYikuCisjCisjIFRoZSByZXN0IG9mIEdyZWVubGFuZCwgaW5jbHVkaW5nIEdvZHRoYWIgKHRoaXMgYXJlYSwgYWx0aG91Z2ggaXQKKyMgaW5jbHVkZXMgY2VudHJhbCBHcmVlbmxhbmQsIGlzIGtub3duIGFzIHdlc3QgR3JlZW5sYW5kKSwga2VlcHMgdGltZQorIyBVVEMtMywgd2l0aCBkYXlsaWdodCBzYXZpbmdzIG1ldGhvZHMgYWNjb3JkaW5nIHRvIEV1cm9wZWFuIHJ1bGVzLgorIworIyBJdCBpcyBjb21tb24gcHJvY2VkdXJlIHRvIHVzZSBVVEMgMCBpbiB0aGUgd2lsZGVybmVzcyBvZiBFYXN0IGFuZAorIyBOb3J0aCBHcmVlbmxhbmQsIGJlY2F1c2UgaXQgaXMgbWFpbmx5IEljZWxhbmRpYyBhaXJjcmFmdCBvcGVyYXRvcnMKKyMgbWFpbnRhaW5pbmcgdHJhZmZpYyBpbiB0aGVzZSBhcmVhcy4gIEhvd2V2ZXIsIHRoZSBvZmZpY2lhbCBzdGF0dXMgb2YKKyMgdGhpcyBhcmVhIGlzIHRoYXQgaXQgc3RpY2tzIHdpdGggR29kdGhhYiB0aW1lLiAgVGhpcyBhcmVhIG1pZ2h0IGJlCisjIGNvbnNpZGVyZWQgYSBkdWFsIHRpbWUgem9uZSBpbiBzb21lIHJlc3BlY3RzIGJlY2F1c2Ugb2YgdGhpcy4KKworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTExLTE5KToKKyMgSSBoZWFyZCBiYWNrIGZyb20gc29tZW9uZSBzdGF0aW9uZWQgYXQgVGh1bGU7IHRoZSB0aW1lIGNoYW5nZSB0b29rIHBsYWNlCisjIHRoZXJlIGF0IDI6MDAgQU0uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEZyb20gMTk5NyBvbiB0aGUgQ0lBIG1hcCBzaG93cyBEYW5tYXJrc2hhdm4gb24gR01UOworIyB0aGUgMTk5NSBtYXAgYXMgbGlrZSBHb2R0aGFiLgorIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZXkgd2VyZSBsaWtlIEdvZHRoYWIgYmVmb3JlIDE5OTYuCisjIHN0YXJ0a2FydC5ubyBzYXlzIFRodWxlIGRvZXMgbm90IG9ic2VydmUgRFNULCBidXQgdGhpcyBpcyBjbGVhcmx5IGFuIGVycm9yLAorIyBzbyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciBmb3IgVGh1bGUgdHJhbnNpdGlvbnMgdW50aWwgdGhpcyB5ZWFyLgorIyBGb3IgMjAwNyBvbiBhc3N1bWUgVGh1bGUgd2lsbCBzdGF5IGluIHN5bmMgd2l0aCBVUyBEU1QgcnVsZXMuCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlUaHVsZQkxOTkxCTE5OTIJLQlNYXIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlUaHVsZQkxOTkxCTE5OTIJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlUaHVsZQkxOTkzCTIwMDYJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECitSdWxlCVRodWxlCTE5OTMJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVRodWxlCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlUaHVsZQkyMDA3CW1heAktCU5vdglTdW4+PTEJMjowMAkwCVMKKyMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9EYW5tYXJrc2hhdm4gLTE6MTQ6NDAgLQlMTVQJMTkxNiBKdWwgMjgKKwkJCS0zOjAwCS0JV0dUCTE5ODAgQXByICA2IDI6MDAKKwkJCS0zOjAwCUVVCVdHJXNUCTE5OTYKKwkJCTA6MDAJLQlHTVQKK1pvbmUgQW1lcmljYS9TY29yZXNieXN1bmQgLTE6Mjc6NTIgLQlMTVQJMTkxNiBKdWwgMjggIyBJdHRvcXFvcnRvb3JtaWl0CisJCQktMjowMAktCUNHVAkxOTgwIEFwciAgNiAyOjAwCisJCQktMjowMAlDLUV1cglDRyVzVAkxOTgxIE1hciAyOQorCQkJLTE6MDAJRVUJRUclc1QKK1pvbmUgQW1lcmljYS9Hb2R0aGFiCS0zOjI2OjU2IC0JTE1UCTE5MTYgSnVsIDI4ICMgTnV1aworCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgMjowMAorCQkJLTM6MDAJRVUJV0clc1QKK1pvbmUgQW1lcmljYS9UaHVsZQktNDozNTowOCAtCUxNVAkxOTE2IEp1bCAyOCAjIFBpdHVmZmlrIGFpciBiYXNlCisJCQktNDowMAlUaHVsZQlBJXNUCisKKyMgRXN0b25pYQorIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5NC0xMC0xNSk6CisjIEEgcmVsYXRpdmUgaW4gVGFsbGlubiBjb25maXJtcyB0aGUgYWNjdXJhY3kgb2YgdGhlIGRhdGEgZm9yIDE5ODkgb253YXJkcworIyBbdGhyb3VnaCAxOTk0XSBhbmQgZ2l2ZXMgdGhlIGxlZ2FsIGF1dGhvcml0eSBmb3IgaXQsCisjIGEgcmVndWxhdGlvbiBvZiB0aGUgR292ZXJubWVudCBvZiBFc3RvbmlhLCBOby4gMTExIG9mIDE5ODkuLi4uCisjCisjIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk2LTEwLTI4KToKKyMgW0lBVEEgU1NJTSAoMTk5Mi8xOTk2KSBjbGFpbXMgdGhhdCB0aGUgQmFsdGljIHJlcHVibGljcyBzd2l0Y2ggYXQgMDE6MDBzLAorIyBidXQgYSByZWxhdGl2ZSBjb25maXJtcyB0aGF0IEVzdG9uaWEgc3RpbGwgc3dpdGNoZXMgYXQgMDI6MDBzLCB3cml0aW5nOl0KKyMgYGBJIGRvIG5vdCBba25vd10gZXhhY3RseSBidXQgdGhlcmUgYXJlIHNvbWUgbGl0dGxlIGRpZmZlcmVudAorIyAoY29uZnVzaW5nKSBydWxlcyBmb3IgSW50ZXJuYXRpb25hbCBBaXIgYW5kIFJhaWx3YXkgVHJhbnNwb3J0IFNjaGVkdWxlcworIyBjb252ZXJzaW9uIGluIFN1bmRheSBjb25uZWN0ZWQgd2l0aCBlbmQgb2Ygc3VtbWVyIHRpbWUgaW4gRXN0b25pYS4uLi4KKyMgQSBkaXNjdXNzaW9uIGlzIHJ1bm5pbmcgYWJvdXQgdGhlIHN1bW1lciB0aW1lIGVmZmljaWVuY3kgYW5kIGVmZmVjdCBvbgorIyBodW1hbiBwaHlzaW9sb2d5LiAgSXQgc2VlbXMgdGhhdCBFc3RvbmlhIG1heWJlIHdpbGwgbm90IGNoYW5nZSB0bworIyBzdW1tZXIgdGltZSBuZXh0IHNwcmluZy4nJworCisjIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk4LTExLTA0KSwgaGVhdmlseSBlZGl0ZWQ6CisjIDxhIGhyZWY9Imh0dHA6Ly90cmlwLnJrLmVlL2NnaS1iaW4vdGh3PyR7QkFTRX09YWt0JiR7T09IVE1MfT1ydGQmVEE9MTk5OCZUTz0xJkFOPTEzOTAiPgorIyBUaGUgMTk5OC0wOS0yMiBFc3RvbmlhbiB0aW1lIGxhdworIyA8L2E+CisjIHJlZmVycyB0byB0aGUgRWlnaHRoIERpcmVjdGl2ZSBhbmQgY2l0ZXMgdGhlIGFzc29jaWF0aW9uIGFncmVlbWVudCBiZXR3ZWVuCisjIHRoZSBFVSBhbmQgRXN0b25pYSwgcmF0aWZpZWQgYnkgdGhlIEVzdG9uaWFuIGxhdyAoUlQgSUkgMTk5NSwgMjItLTI3LCAxMjApLgorIworIyBJIGFsc28gYXNrZWQgW215IHJlbGF0aXZlXSB3aGV0aGVyIHRoZXkgdXNlIGFueSBzdGFuZGFyZCBhYmJyZXZpYXRpb24KKyMgZm9yIHRoZWlyIHN0YW5kYXJkIGFuZCBzdW1tZXIgdGltZXMuIEhlIHNheXMgbm8sIHRoZXkgdXNlICJzdXZlYWVnIgorIyAoc3VtbWVyIHRpbWUpIGFuZCAidGFsdmVhZWciICh3aW50ZXIgdGltZSkuCisKKyMgRnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmJhbHRpY3RpbWVzLmNvbS8iPlRoZSBCYWx0aWMgVGltZXM8L2E+ICgxOTk5LTA5LTA5KQorIyB2aWEgU3RlZmZlbiBUaG9yc2VuOgorIyBUaGlzIHllYXIgd2lsbCBtYXJrIHRoZSBsYXN0IHRpbWUgRXN0b25pYSBzaGlmdHMgdG8gc3VtbWVyIHRpbWUsCisjIGEgY291bmNpbCBvZiB0aGUgcnVsaW5nIGNvYWxpdGlvbiBhbm5vdW5jZWQgU2VwdC4gNi4uLi4KKyMgQnV0IHdoYXQgdGhpcyBjb3VsZCBtZWFuIGZvciBFc3RvbmlhJ3MgY2hhbmNlcyBvZiBqb2luaW5nIHRoZSBFdXJvcGVhbgorIyBVbmlvbiBhcmUgc3RpbGwgdW5jbGVhci4gIEluIDE5OTQsIHRoZSBFVSBkZWNsYXJlZCBzdW1tZXIgdGltZSBjb21wdWxzb3J5CisjIGZvciBhbGwgbWVtYmVyIHN0YXRlcyB1bnRpbCAyMDAxLiAgQnJ1c3NlbHMgaGFzIHlldCB0byBkZWNpZGUgd2hhdCB0byBkbworIyBhZnRlciB0aGF0LgorCisjIEZyb20gTWFydCBPcnVhYXMgKDIwMDAtMDEtMjkpOgorIyBSZWd1bGF0aW9uIG5vLiAzMDEgKDE5OTktMTAtMTIpIG9ic29sZXRlcyBwcmV2aW91cyByZWd1bGF0aW9uCisjIG5vLiAyMDYgKDE5OTgtMDktMjIpIGFuZCB0aHVzIHN0aWNrcyBFc3RvbmlhIHRvICswMjowMCBHTVQgZm9yIGFsbAorIyB0aGUgeWVhciByb3VuZC4gIFRoZSByZWd1bGF0aW9uIGlzIGVmZmVjdGl2ZSAxOTk5LTExLTAxLgorCisjIEZyb20gVG9vbWFzIFNvb21lICgyMDAyLTAyLTIxKToKKyMgVGhlIEVzdG9uaWFuIGdvdmVybm1lbnQgaGFzIGNoYW5nZWQgb25jZSBhZ2FpbiB0aW1lem9uZSBwb2xpdGljcy4KKyMgTm93IHdlIGFyZSB1c2luZyBhZ2FpbiBFVSBydWxlcy4KKyMKKyMgRnJvbSBVcm1ldCBKYWFuZXMgKDIwMDItMDMtMjgpOgorIyBUaGUgbGVnaXNsYXRpdmUgcmVmZXJlbmNlIGlzIEdvdmVybm1lbnQgZGVjcmVlIE5vLiA4NCBvbiAyMDAyLTAyLTIxLgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9UYWxsaW5uCTE6Mzk6MDAJLQlMTVQJMTg4MAorCQkJMTozOTowMAktCVRNVAkxOTE4IEZlYiAjIFRhbGxpbm4gTWVhbiBUaW1lCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTkgSnVsCisJCQkxOjM5OjAwCS0JVE1UCTE5MjEgTWF5CisJCQkyOjAwCS0JRUVUCTE5NDAgQXVnICA2CisJCQkzOjAwCS0JTVNLCTE5NDEgU2VwIDE1CisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgU2VwIDIyCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5ODkgTWFyIDI2IDI6MDBzCisJCQkyOjAwCTE6MDAJRUVTVAkxOTg5IFNlcCAyNCAyOjAwcworCQkJMjowMAlDLUV1cglFRSVzVAkxOTk4IFNlcCAyMgorCQkJMjowMAlFVQlFRSVzVAkxOTk5IE5vdiAgMQorCQkJMjowMAktCUVFVAkyMDAyIEZlYiAyMQorCQkJMjowMAlFVQlFRSVzVAorCisjIEZpbmxhbmQKKyMKKyMgRnJvbSBIYW5udSBTdHJhbmcgKDE5OTQtMDktMjUgMDY6MDM6MzcgVVRDKToKKyMgV2VsbCwgaGVyZSBpbiBIZWxzaW5raSB3ZSdyZSBqdXN0IGNoYW5naW5nIGZyb20gc3VtbWVyIHRpbWUgdG8gcmVndWxhciBvbmUsCisjIGFuZCBpdCdzIHN1cHBvc2VkIHRvIGNoYW5nZSBhdCA0YW0uLi4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgRmlubGFuZCBoYXMgc3dpdGNoZWQgYXQgMDI6MDAgc3RhbmRhcmQgdGltZQorIyBzaW5jZSAxOTgxLiAgR28gd2l0aCBTdHJhbmcgaW5zdGVhZC4KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUZpbmxhbmQJMTk0Mglvbmx5CS0JQXByCTMJMDowMAkxOjAwCVMKK1J1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlPY3QJMwkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvSGVsc2lua2kJMTozOTo1MiAtCUxNVAkxODc4IE1heSAzMQorCQkJMTozOTo1MgktCUhNVAkxOTIxIE1heSAgICAjIEhlbHNpbmtpIE1lYW4gVGltZQorCQkJMjowMAlGaW5sYW5kCUVFJXNUCTE5ODEgTWFyIDI5IDI6MDAKKwkJCTI6MDAJRVUJRUUlc1QKKworIyBBYWxhbmQgSXMKK0xpbmsJRXVyb3BlL0hlbHNpbmtpCUV1cm9wZS9NYXJpZWhhbW4KKworCisjIEZyYW5jZQorCisjIEZyb20gQ2lybyBEaXNjZXBvbG8gKDIwMDAtMTItMjApOgorIworIyBIZW5yaSBMZSBDb3JyZSwgUmVnaW1lcyBIb3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgRWRpdGlvbnMKKyMgVHJhZGl0aW9ubmVsbGVzIC0gUGFyaXMgMiBib29rcywgMTk5MworIworIyBHYWJyaWVsLCBUcmFpdGUgZGUgbCdoZXVyZSBkYW5zIGxlIG1vbmRlLCBHdXkgVHJlZGFuaWVsIGVkaXRldXIsCisjIFBhcmlzLCAxOTkxCisjCisjIEZyYW5jb2lzZSBHYXVxdWVsaW4sIFByb2JsZW1lcyBkZSBsJ2hldXJlIHJlc29sdXMgZW4gYXN0cm9sb2dpZSwKKyMgR3V5IHRyZWRhbmllbCwgUGFyaXMgMTk4NworCisKKyMKKyMgU2hhbmsgJiBQb3R0ZW5nZXIgc2VlbSB0byB1c2UgYDI0OjAwJyBhbWJpZ3VvdXNseTsgcmVzb2x2ZSBpdCB3aXRoIFdoaXRtYW4uCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlGcmFuY2UJMTkxNglvbmx5CS0JSnVuCTE0CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MTYJMTkxOQktCU9jdAlTdW4+PTEJMjM6MDBzCTAJLQorUnVsZQlGcmFuY2UJMTkxNwlvbmx5CS0JTWFyCTI0CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MTgJb25seQktCU1hcgkgOQkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTE5CW9ubHkJLQlNYXIJIDEJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MjAJb25seQktCU9jdAkyMwkyMzowMHMJMAktCitSdWxlCUZyYW5jZQkxOTIxCW9ubHkJLQlNYXIJMTQJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkyMQlvbmx5CS0JT2N0CTI1CTIzOjAwcwkwCS0KK1J1bGUJRnJhbmNlCTE5MjIJb25seQktCU1hcgkyNQkyMzowMHMJMTowMAlTCisjIERTSCB3cml0ZXMgdGhhdCBhIGxhdyBvZiAxOTIzLTA1LTI0IHNwZWNpZmllZCAzcmQgU2F0IGluIEFwciBhdCAyMzowMCB0byAxc3QKKyMgU2F0IGluIE9jdCBhdCAyNDowMDsgYW5kIHRoYXQgaW4gMTkzMCwgYmVjYXVzZSBvZiBFYXN0ZXIsIHRoZSB0cmFuc2l0aW9ucworIyB3ZXJlIEFwciAxMiBhbmQgT2N0IDUuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJRnJhbmNlCTE5MjIJMTkzOAktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQorUnVsZQlGcmFuY2UJMTkyMwlvbmx5CS0JTWF5CTI2CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MjQJb25seQktCU1hcgkyOQkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTI1CW9ubHkJLQlBcHIJIDQJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MjcJb25seQktCUFwcgkgOQkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkyOQlvbmx5CS0JQXByCTIwCTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MzAJb25seQktCUFwcgkxMgkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTMxCW9ubHkJLQlBcHIJMTgJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkzMglvbmx5CS0JQXByCSAyCTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MzMJb25seQktCU1hcgkyNQkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTM0CW9ubHkJLQlBcHIJIDcJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkzNQlvbmx5CS0JTWFyCTMwCTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MzYJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTM3CW9ubHkJLQlBcHIJIDMJMjM6MDBzCTE6MDAJUworUnVsZQlGcmFuY2UJMTkzOAlvbmx5CS0JTWFyCTI2CTIzOjAwcwkxOjAwCVMKK1J1bGUJRnJhbmNlCTE5MzkJb25seQktCUFwcgkxNQkyMzowMHMJMTowMAlTCitSdWxlCUZyYW5jZQkxOTM5CW9ubHkJLQlOb3YJMTgJMjM6MDBzCTAJLQorUnVsZQlGcmFuY2UJMTk0MAlvbmx5CS0JRmViCTI1CSAyOjAwCTE6MDAJUworIyBUaGUgRnJlbmNoIHJ1bGVzIGZvciAxOTQxLTE5NDQgd2VyZSBub3QgdXNlZCBpbiBQYXJpcywgYnV0IFNoYW5rcyAmIFBvdHRlbmdlcgorIyB3cml0ZSB0aGF0IHRoZXkgd2VyZSB1c2VkIGluIE1vbmFjbyBhbmQgaW4gbWFueSBGcmVuY2ggbG9jYXRpb25zLgorIyBMZSBDb3JyZSB3cml0ZXMgdGhhdCB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIGZyZWUgem9uZSB3YXMgQXJuZWd1eSwgT3J0aGV6LAorIyBNb250LWRlLU1hcnNhbiwgQmF6YXMsIExhbmdvbiwgTGFtb3R0ZS1Nb250cmF2ZWwsIE1hcm91aWwsIExhCisjIFJvY2hlZm91Y2F1bHQsIENoYW1wYWduZS1Nb3V0b24sIExhIFJvY2hlLVBvc2F5LCBMYSBIYXllLURlY2FydGVzLAorIyBMb2NoZXMsIE1vbnRyaWNoYXJkLCBWaWVyem9uLCBCb3VyZ2VzLCBNb3VsaW5zLCBEaWdvaW4sCisjIFBhcmF5LWxlLU1vbmlhbCwgTW9udGNlYXUtbGVzLU1pbmVzLCBDaGFsb25zLXN1ci1TYW9uZSwgQXJib2lzLAorIyBEb2xlLCBNb3JleiwgU3QtQ2xhdWRlLCBhbmQgQ29sbG9nbmVzIChIYXV0ZS1TYXZpb2UpLgorUnVsZQlGcmFuY2UJMTk0MQlvbmx5CS0JTWF5CSA1CSAwOjAwCTI6MDAJTSAjIE1pZHN1bW1lcgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoaXMgdHJhbnNpdGlvbiBvY2N1cnJlZCBhdCBPY3QgNiAxOjAwLAorIyBidXQgZ28gd2l0aCBEZW5pcyBFeGNvZmZpZXIgKDE5OTctMTItMTIpLAorIyB3aG8gcXVvdGVzIHRoZSBFcGhlbWVyaWRlcyBBc3Ryb25vbWlxdWVzIGZvciAxOTk4IGZyb20gQnVyZWF1IGRlcyBMb25naXR1ZGVzCisjIGFzIHNheWluZyA1LzEwLzQxIDIyaFVULgorUnVsZQlGcmFuY2UJMTk0MQlvbmx5CS0JT2N0CSA2CSAwOjAwCTE6MDAJUworUnVsZQlGcmFuY2UJMTk0Mglvbmx5CS0JTWFyCSA5CSAwOjAwCTI6MDAJTQorUnVsZQlGcmFuY2UJMTk0Mglvbmx5CS0JTm92CSAyCSAzOjAwCTE6MDAJUworUnVsZQlGcmFuY2UJMTk0Mwlvbmx5CS0JTWFyCTI5CSAyOjAwCTI6MDAJTQorUnVsZQlGcmFuY2UJMTk0Mwlvbmx5CS0JT2N0CSA0CSAzOjAwCTE6MDAJUworUnVsZQlGcmFuY2UJMTk0NAlvbmx5CS0JQXByCSAzCSAyOjAwCTI6MDAJTQorUnVsZQlGcmFuY2UJMTk0NAlvbmx5CS0JT2N0CSA4CSAxOjAwCTE6MDAJUworUnVsZQlGcmFuY2UJMTk0NQlvbmx5CS0JQXByCSAyCSAyOjAwCTI6MDAJTQorUnVsZQlGcmFuY2UJMTk0NQlvbmx5CS0JU2VwCTE2CSAzOjAwCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSBNYXIgMjggMjowMCBhbmQgU2VwIDI2IDM6MDA7CisjIGdvIHdpdGggRXhjb2ZmaWVyJ3MgMjgvMy83NiAwaFVUIGFuZCAyNS85Lzc2IDIzaFVULgorUnVsZQlGcmFuY2UJMTk3Nglvbmx5CS0JTWFyCTI4CSAxOjAwCTE6MDAJUworUnVsZQlGcmFuY2UJMTk3Nglvbmx5CS0JU2VwCTI2CSAxOjAwCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwOjA5OjIwIGZvciBQYXJpcyBNZWFuIFRpbWUsIGFuZCBXaGl0bWFuIDA6MDk6MDUsCisjIGJ1dCBIb3dzZSBxdW90ZXMgdGhlIGFjdHVhbCBGcmVuY2ggbGVnaXNsYXRpb24gYXMgc2F5aW5nIDA6MDk6MjEuCisjIEdvIHdpdGggSG93c2UuICBIb3dzZSB3cml0ZXMgdGhhdCB0aGUgdGltZSBpbiBGcmFuY2Ugd2FzIG9mZmljaWFsbHkgYmFzZWQKKyMgb24gUE1ULTA6MDk6MjEgdW50aWwgMTk3OC0wOC0wOSwgd2hlbiB0aGUgdGltZSBiYXNlIGZpbmFsbHkgc3dpdGNoZWQgdG8gVVRDLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvUGFyaXMJMDowOToyMSAtCUxNVAkxODkxIE1hciAxNSAgMDowMQorCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgMDowMSAgIyBQYXJpcyBNVAorIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTQwIEp1biAxNCAwOjAwOyBnbyB3aXRoIEV4Y29mZmllciBhbmQgTGUgQ29ycmUuCisJCQkwOjAwCUZyYW5jZQlXRSVzVAkxOTQwIEp1biAxNCAyMzowMAorIyBMZSBDb3JyZSBzYXlzIFBhcmlzIHN0dWNrIHdpdGggb2NjdXBpZWQtRnJhbmNlIHRpbWUgYWZ0ZXIgdGhlIGxpYmVyYXRpb247CisjIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZyAyNQorCQkJMDowMAlGcmFuY2UJV0Ulc1QJMTk0NSBTZXAgMTYgIDM6MDAKKwkJCTE6MDAJRnJhbmNlCUNFJXNUCTE5NzcKKwkJCTE6MDAJRVUJQ0Ulc1QKKworIyBHZXJtYW55CisKKyMgRnJvbSBNYXJrdXMgS3VobiAoMTk5OC0wOS0yOSk6CisjIFRoZSBHZXJtYW4gdGltZSB6b25lIHdlYiBzaXRlIGJ5IHRoZSBQaHlzaWthbGlzY2gtVGVjaG5pc2NoZQorIyBCdW5kZXNhbnN0YWx0IGNvbnRhaW5zIERTVCBpbmZvcm1hdGlvbiBiYWNrIHRvIDE5MTYuCisjIFtTZWUgdHotbGluay5odG0gZm9yIHRoZSBVUkwuXQorCisjIEZyb20gSm9lcmcgU2NoaWxsaW5nICgyMDAyLTEwLTIzKToKKyMgSW4gMTk0NSwgQmVybGluIHdhcyBzd2l0Y2hlZCB0byBNb3Njb3cgU3VtbWVyIHRpbWUgKEdNVCs0KSBieQorIyA8YSBocmVmPSJodHRwOi8vd3d3LmRobS5kZS9sZW1vL2h0bWwvYmlvZ3JhZmllbi9CZXJzYXJpbk5pa29sYWkvIj4KKyMgR2VuZXJhbCBbTmlrb2xhaV0gQmVyc2FyaW48L2E+LgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDMtMDgpOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmIj4KKyMgaHR0cDovL3d3dy5wYXJsYW1lbnQtYmVybGluLmRlL3Bkcy1mcmFrdGlvbi5uc2YvNzI3NDU5MTI3YzhiNjZlZTg1MjU2NjIzMDA0NTkwOTkvZGVmYzc3Y2I3ODRmMTgwYWMxMjU2YzJiMDAzMDI3NGIvJEZJTEUvYmVyc2FyaW50LnBkZgorIyA8L2E+CisjIHNheXMgdGhhdCBCZXJzYXJpbiBpc3N1ZWQgYW4gb3JkZXIgdG8gdXNlIE1vc2NvdyB0aW1lIG9uIE1heSAyMC4KKyMgSG93ZXZlciwgTW9zY293IGRpZCBub3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgaW4gMTk0NSwgc28KKyMgdGhpcyB3YXMgZXF1aXZhbGVudCB0byBDRU1UIChHTVQrMyksIG5vdCBHTVQrNC4KKworCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlHZXJtYW55CTE5NDYJb25seQktCUFwcgkxNAkyOjAwcwkxOjAwCVMKK1J1bGUJR2VybWFueQkxOTQ2CW9ubHkJLQlPY3QJIDcJMjowMHMJMAktCitSdWxlCUdlcm1hbnkJMTk0NwkxOTQ5CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KKyMgaHR0cDovL3d3dy5wdGIuZGUvZGUvb3JnLzQvNDQvNDQxL3NhbHQuaHRtIHNheXMgdGhlIGZvbGxvd2luZyB0cmFuc2l0aW9uCisjIG9jY3VycmVkIGF0IDM6MDAgTUVaLCBub3QgdGhlIDI6MDAgTUVaIGdpdmVuIGluIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgR28gd2l0aCB0aGUgUFRCLgorUnVsZQlHZXJtYW55CTE5NDcJb25seQktCUFwcgkgNgkzOjAwcwkxOjAwCVMKK1J1bGUJR2VybWFueQkxOTQ3CW9ubHkJLQlNYXkJMTEJMjowMHMJMjowMAlNCitSdWxlCUdlcm1hbnkJMTk0Nwlvbmx5CS0JSnVuCTI5CTM6MDAJMTowMAlTCitSdWxlCUdlcm1hbnkJMTk0OAlvbmx5CS0JQXByCTE4CTI6MDBzCTE6MDAJUworUnVsZQlHZXJtYW55CTE5NDkJb25seQktCUFwcgkxMAkyOjAwcwkxOjAwCVMKKworUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCU1heQkyNAkyOjAwCTI6MDAJTSAjIE1pZHN1bW1lcgorUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCVNlcAkyNAkzOjAwCTE6MDAJUworUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCU5vdgkxOAkyOjAwcwkwCS0KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQmVybGluCTA6NTM6MjggLQlMTVQJMTg5MyBBcHIKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBNYXkgMjQgMjowMAorCQkJMTowMCBTb3ZpZXRab25lCUNFJXNUCTE5NDYKKwkJCTE6MDAJR2VybWFueQlDRSVzVAkxOTgwCisJCQkxOjAwCUVVCUNFJXNUCisKKyMgR2VvcmdpYQorIyBQbGVhc2Ugc2VlIHRoZSAiYXNpYSIgZmlsZSBmb3IgQXNpYS9UYmlsaXNpLgorIyBIZXJvZG90dXMgKEhpc3RvcmllcywgSVYuNDUpIHNheXMgR2VvcmdpYSBub3J0aCBvZiB0aGUgUGhhc2lzIChub3cgUmlvbmkpCisjIGlzIGluIEV1cm9wZS4gIE91ciByZWZlcmVuY2UgbG9jYXRpb24gVGJpbGlzaSBpcyBpbiB0aGUgQXNpYW4gcGFydC4KKworIyBHaWJyYWx0YXIKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgRXVyb3BlL0dpYnJhbHRhcgktMDoyMToyNCAtCUxNVAkxODgwIEF1ZyAgMiAwOjAwcworCQkJMDowMAlHQi1FaXJlCSVzCTE5NTcgQXByIDE0IDI6MDAKKwkJCTE6MDAJLQlDRVQJMTk4MgorCQkJMTowMAlFVQlDRSVzVAorCisjIEdyZWVjZQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKKyMgV2hpdG1hbiBnaXZlcyAxOTMyIEp1bCA1IC0gTm92IDE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlHcmVlY2UJMTkzMglvbmx5CS0JSnVsCSA3CTA6MDAJMTowMAlTCitSdWxlCUdyZWVjZQkxOTMyCW9ubHkJLQlTZXAJIDEJMDowMAkwCS0KKyMgV2hpdG1hbiBnaXZlcyAxOTQxIEFwciAyNSAtID87IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlHcmVlY2UJMTk0MQlvbmx5CS0JQXByCSA3CTA6MDAJMTowMAlTCisjIFdoaXRtYW4gZ2l2ZXMgMTk0MiBGZWIgMiAtID87IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlHcmVlY2UJMTk0Mglvbmx5CS0JTm92CSAyCTM6MDAJMAktCitSdWxlCUdyZWVjZQkxOTQzCW9ubHkJLQlNYXIJMzAJMDowMAkxOjAwCVMKK1J1bGUJR3JlZWNlCTE5NDMJb25seQktCU9jdAkgNAkwOjAwCTAJLQorIyBXaGl0bWFuIGdpdmVzIDE5NDQgT2N0IDMgLSBPY3QgMzE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlHcmVlY2UJMTk1Mglvbmx5CS0JSnVsCSAxCTA6MDAJMTowMAlTCitSdWxlCUdyZWVjZQkxOTUyCW9ubHkJLQlOb3YJIDIJMDowMAkwCS0KK1J1bGUJR3JlZWNlCTE5NzUJb25seQktCUFwcgkxMgkwOjAwcwkxOjAwCVMKK1J1bGUJR3JlZWNlCTE5NzUJb25seQktCU5vdgkyNgkwOjAwcwkwCS0KK1J1bGUJR3JlZWNlCTE5NzYJb25seQktCUFwcgkxMQkyOjAwcwkxOjAwCVMKK1J1bGUJR3JlZWNlCTE5NzYJb25seQktCU9jdAkxMAkyOjAwcwkwCS0KK1J1bGUJR3JlZWNlCTE5NzcJMTk3OAktCUFwcglTdW4+PTEJMjowMHMJMTowMAlTCitSdWxlCUdyZWVjZQkxOTc3CW9ubHkJLQlTZXAJMjYJMjowMHMJMAktCitSdWxlCUdyZWVjZQkxOTc4CW9ubHkJLQlTZXAJMjQJNDowMAkwCS0KK1J1bGUJR3JlZWNlCTE5NzkJb25seQktCUFwcgkgMQk5OjAwCTE6MDAJUworUnVsZQlHcmVlY2UJMTk3OQlvbmx5CS0JU2VwCTI5CTI6MDAJMAktCitSdWxlCUdyZWVjZQkxOTgwCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCVMKK1J1bGUJR3JlZWNlCTE5ODAJb25seQktCVNlcAkyOAkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQXRoZW5zCTE6MzQ6NTIgLQlMTVQJMTg5NSBTZXAgMTQKKwkJCTE6MzQ6NTIJLQlBTVQJMTkxNiBKdWwgMjggMDowMSAgICAgIyBBdGhlbnMgTVQKKwkJCTI6MDAJR3JlZWNlCUVFJXNUCTE5NDEgQXByIDMwCisJCQkxOjAwCUdyZWVjZQlDRSVzVAkxOTQ0IEFwciAgNAorCQkJMjowMAlHcmVlY2UJRUUlc1QJMTk4MQorCQkJIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IGl0IHN3aXRjaGVkIHRvIEMtRXVyIGluIDE5ODE7CisJCQkjIGdvIHdpdGggRVUgaW5zdGVhZCwgc2luY2UgR3JlZWNlIGpvaW5lZCBpdCBvbiBKYW4gMS4KKwkJCTI6MDAJRVUJRUUlc1QKKworIyBIdW5nYXJ5CisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlIdW5nYXJ5CTE5MTgJb25seQktCUFwcgkgMQkgMzowMAkxOjAwCVMKK1J1bGUJSHVuZ2FyeQkxOTE4CW9ubHkJLQlTZXAJMjkJIDM6MDAJMAktCitSdWxlCUh1bmdhcnkJMTkxOQlvbmx5CS0JQXByCTE1CSAzOjAwCTE6MDAJUworUnVsZQlIdW5nYXJ5CTE5MTkJb25seQktCVNlcAkxNQkgMzowMAkwCS0KK1J1bGUJSHVuZ2FyeQkxOTIwCW9ubHkJLQlBcHIJIDUJIDM6MDAJMTowMAlTCitSdWxlCUh1bmdhcnkJMTkyMAlvbmx5CS0JU2VwCTMwCSAzOjAwCTAJLQorUnVsZQlIdW5nYXJ5CTE5NDUJb25seQktCU1heQkgMQkyMzowMAkxOjAwCVMKK1J1bGUJSHVuZ2FyeQkxOTQ1CW9ubHkJLQlOb3YJIDMJIDA6MDAJMAktCitSdWxlCUh1bmdhcnkJMTk0Nglvbmx5CS0JTWFyCTMxCSAyOjAwcwkxOjAwCVMKK1J1bGUJSHVuZ2FyeQkxOTQ2CTE5NDkJLQlPY3QJU3VuPj0xCSAyOjAwcwkwCS0KK1J1bGUJSHVuZ2FyeQkxOTQ3CTE5NDkJLQlBcHIJU3VuPj00CSAyOjAwcwkxOjAwCVMKK1J1bGUJSHVuZ2FyeQkxOTUwCW9ubHkJLQlBcHIJMTcJIDI6MDBzCTE6MDAJUworUnVsZQlIdW5nYXJ5CTE5NTAJb25seQktCU9jdAkyMwkgMjowMHMJMAktCitSdWxlCUh1bmdhcnkJMTk1NAkxOTU1CS0JTWF5CTIzCSAwOjAwCTE6MDAJUworUnVsZQlIdW5nYXJ5CTE5NTQJMTk1NQktCU9jdAkgMwkgMDowMAkwCS0KK1J1bGUJSHVuZ2FyeQkxOTU2CW9ubHkJLQlKdW4JU3VuPj0xCSAwOjAwCTE6MDAJUworUnVsZQlIdW5nYXJ5CTE5NTYJb25seQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQorUnVsZQlIdW5nYXJ5CTE5NTcJb25seQktCUp1bglTdW4+PTEJIDE6MDAJMTowMAlTCitSdWxlCUh1bmdhcnkJMTk1Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDM6MDAJMAktCitSdWxlCUh1bmdhcnkJMTk4MAlvbmx5CS0JQXByCSA2CSAxOjAwCTE6MDAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQnVkYXBlc3QJMToxNjoyMCAtCUxNVAkxODkwIE9jdAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4CisJCQkxOjAwCUh1bmdhcnkJQ0Ulc1QJMTk0MSBBcHIgIDYgIDI6MDAKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NQorCQkJMTowMAlIdW5nYXJ5CUNFJXNUCTE5ODAgU2VwIDI4ICAyOjAwcworCQkJMTowMAlFVQlDRSVzVAorCisjIEljZWxhbmQKKyMKKyMgRnJvbSBBZGFtIERhdmlkICgxOTkzLTExLTA2KToKKyMgVGhlIG5hbWUgb2YgdGhlIHRpbWV6b25lIGluIEljZWxhbmQgZm9yIHN5c3RlbSAvIG1haWwgLyBuZXdzIHB1cnBvc2VzIGlzIEdNVC4KKyMKKyMgKDE5OTMtMTItMDUpOgorIyBUaGlzIG1hdGVyaWFsIGlzIHBhcmFwaHJhc2VkIGZyb20gdGhlIDE5ODggZWRpdGlvbiBvZiB0aGUgVW5pdmVyc2l0eSBvZgorIyBJY2VsYW5kIEFsbWFuYWsuCisjCisjIEZyb20gSmFudWFyeSAxc3QsIDE5MDggdGhlIHdob2xlIG9mIEljZWxhbmQgd2FzIHN0YW5kYXJkaXNlZCBhdCAxIGhvdXIKKyMgYmVoaW5kIEdNVC4gUHJldmlvdXNseSwgbG9jYWwgbWVhbiBzb2xhciB0aW1lIHdhcyB1c2VkIGluIGRpZmZlcmVudCBwYXJ0cworIyBvZiBJY2VsYW5kLCB0aGUgYWxtYW5hayBoYWQgYmVlbiBiYXNlZCBvbiBSZXlramF2aWsgbWVhbiBzb2xhciB0aW1lIHdoaWNoCisjIHdhcyAxIGhvdXIgYW5kIDI4IG1pbnV0ZXMgYmVoaW5kIEdNVC4KKyMKKyMgImZpcnN0IGRheSBvZiB3aW50ZXIiIHJlZmVycmVkIHRvIFtiZWxvd10gbWVhbnMgdGhlIGZpcnN0IGRheSBvZiB0aGUgMjYgd2Vla3MKKyMgb2Ygd2ludGVyLCBhY2NvcmRpbmcgdG8gdGhlIG9sZCBpY2VsYW5kaWMgY2FsZW5kYXIgdGhhdCBkYXRlcyBiYWNrIHRvIHRoZQorIyB0aW1lIHRoZSBub3JzZW1lbiBmaXJzdCBzZXR0bGVkIEljZWxhbmQuICBUaGUgZmlyc3QgZGF5IG9mIHdpbnRlciBpcyBhbHdheXMKKyMgU2F0dXJkYXksIGJ1dCBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBKdWxpYW4gb3IgR3JlZ29yaWFuIGNhbGVuZGFycy4KKyMKKyMgKDE5OTMtMTItMTApOgorIyBJIGhhdmUgYSByZWZlcmVuY2UgZnJvbSB0aGUgT3hmb3JkIEljZWxhbmRpYy1FbmdsaXNoIGRpY3Rpb25hcnkgZm9yIHRoZQorIyBiZWdpbm5pbmcgb2Ygd2ludGVyLCB3aGljaCB0aWVzIGl0IHRvIHRoZSBlY2NsZXNpYXN0aWNhbCBjYWxlbmRhciAoYW5kIHRodXMKKyMgdG8gdGhlIGp1bGlhbi9ncmVnb3JpYW4gY2FsZW5kYXIpIG92ZXIgdGhlIHBlcmlvZCBpbiBxdWVzdGlvbi4KKyMJdGhlIHdpbnRlciBiZWdpbnMgb24gdGhlIFNhdHVyZGF5IG5leHQgYmVmb3JlIFN0LiBMdWtlJ3MgZGF5CisjCShvbGQgc3R5bGUpLCBvciBvbiBTdC4gTHVrZSdzIGRheSwgaWYgYSBTYXR1cmRheS4KKyMgU3QuIEx1a2UncyBkYXkgb3VnaHQgdG8gYmUgdHJhY2VhYmxlIGZyb20gZWNjbGVzaWFzdGljYWwgc291cmNlcy4gIm9sZCBzdHlsZSIKKyMgbWlnaHQgYmUgYSByZWZlcmVuY2UgdG8gdGhlIEp1bGlhbiBjYWxlbmRhciBhcyBvcHBvc2VkIHRvIEdyZWdvcmlhbiwgb3IgaXQKKyMgbWlnaHQgbWVhbiBzb21ldGhpbmcgZWxzZSAoPz8/KS4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFRoZSBJY2VsYW5kIEFsbWFuYWssIFNoYW5rcyAmIFBvdHRlbmdlciwgYW5kIFdoaXRtYW4gZGlzYWdyZWUgb24gbWFueSBwb2ludHMuCisjIFdlIGdvIHdpdGggdGhlIEFsbWFuYWssIGV4Y2VwdCBmb3Igb25lIGNsYWltIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBuYW1lbHkKKyMgdGhhdCBSZXlrYXZpayB3YXMgMjFXNTcgZnJvbSAxODM3IHRvIDE5MDgsIGxvY2FsIG1lYW4gdGltZSBiZWZvcmUgdGhhdC4KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUljZWxhbmQJMTkxNwkxOTE4CS0JRmViCTE5CTIzOjAwCTE6MDAJUworUnVsZQlJY2VsYW5kCTE5MTcJb25seQktCU9jdAkyMQkgMTowMAkwCS0KK1J1bGUJSWNlbGFuZAkxOTE4CW9ubHkJLQlOb3YJMTYJIDE6MDAJMAktCitSdWxlCUljZWxhbmQJMTkzOQlvbmx5CS0JQXByCTI5CTIzOjAwCTE6MDAJUworUnVsZQlJY2VsYW5kCTE5MzkJb25seQktCU5vdgkyOQkgMjowMAkwCS0KK1J1bGUJSWNlbGFuZAkxOTQwCW9ubHkJLQlGZWIJMjUJIDI6MDAJMTowMAlTCitSdWxlCUljZWxhbmQJMTk0MAlvbmx5CS0JTm92CSAzCSAyOjAwCTAJLQorUnVsZQlJY2VsYW5kCTE5NDEJb25seQktCU1hcgkgMgkgMTowMHMJMTowMAlTCitSdWxlCUljZWxhbmQJMTk0MQlvbmx5CS0JTm92CSAyCSAxOjAwcwkwCS0KK1J1bGUJSWNlbGFuZAkxOTQyCW9ubHkJLQlNYXIJIDgJIDE6MDBzCTE6MDAJUworUnVsZQlJY2VsYW5kCTE5NDIJb25seQktCU9jdAkyNQkgMTowMHMJMAktCisjIDE5NDMtMTk0NiAtIGZpcnN0IFN1bmRheSBpbiBNYXJjaCB1bnRpbCBmaXJzdCBTdW5kYXkgaW4gd2ludGVyCitSdWxlCUljZWxhbmQJMTk0MwkxOTQ2CS0JTWFyCVN1bj49MQkgMTowMHMJMTowMAlTCitSdWxlCUljZWxhbmQJMTk0MwkxOTQ4CS0JT2N0CVN1bj49MjIJIDE6MDBzCTAJLQorIyAxOTQ3LTE5NjcgLSBmaXJzdCBTdW5kYXkgaW4gQXByaWwgdW50aWwgZmlyc3QgU3VuZGF5IGluIHdpbnRlcgorUnVsZQlJY2VsYW5kCTE5NDcJMTk2NwktCUFwcglTdW4+PTEJIDE6MDBzCTE6MDAJUworIyAxOTQ5IE9jdCB0cmFuc2l0aW9uIGRlbGF5ZWQgYnkgMSB3ZWVrCitSdWxlCUljZWxhbmQJMTk0OQlvbmx5CS0JT2N0CTMwCSAxOjAwcwkwCS0KK1J1bGUJSWNlbGFuZAkxOTUwCTE5NjYJLQlPY3QJU3VuPj0yMgkgMTowMHMJMAktCitSdWxlCUljZWxhbmQJMTk2Nwlvbmx5CS0JT2N0CTI5CSAxOjAwcwkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXRsYW50aWMvUmV5a2phdmlrCS0xOjI3OjI0IC0JTE1UCTE4MzcKKwkJCS0xOjI3OjQ4IC0JUk1UCTE5MDggIyBSZXlramF2aWsgTWVhbiBUaW1lPworCQkJLTE6MDAJSWNlbGFuZAlJUyVzVAkxOTY4IEFwciA3IDE6MDBzCisJCQkgMDowMAktCUdNVAorCisjIEl0YWx5CisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDYpOgorIyBTaWNpbHkgYW5kIFNhcmRpbmlhIGVhY2ggaGFkIHRoZWlyIG93biB0aW1lIHpvbmVzIGZyb20gMTg2NiB0byAxODkzLAorIyBjYWxsZWQgUGFsZXJtbyBUaW1lICgrMDA6NTM6MjgpIGFuZCBDYWdsaWFyaSBUaW1lICgrMDA6MzY6MzIpLgorIyBEdXJpbmcgV29ybGQgV2FyIElJLCBHZXJtYW4tY29udHJvbGxlZCBJdGFseSB1c2VkIEdlcm1hbiB0aW1lLgorIyBCdXQgdGhlc2UgZXZlbnRzIGFsbCBvY2N1cnJlZCBiZWZvcmUgdGhlIDE5NzAgY3V0b2ZmLAorIyBzbyByZWNvcmQgb25seSB0aGUgdGltZSBpbiBSb21lLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgRm9yIEl0YWxpYW4gRFNUIHdlIGhhdmUgdGhyZWUgc291cmNlczogU2hhbmtzICYgUG90dGVuZ2VyLCBXaGl0bWFuLCBhbmQKKyMgRi4gUG9sbGFzdHJpCisjIDxhIGhyZWY9Imh0dHA6Ly90b2kuaXJpdGkuY25yLml0L3VrL2llbml0bHQuaHRtbCI+CisjIERheS1saWdodCBTYXZpbmcgVGltZSBpbiBJdGFseSAoMjAwNi0wMi0wMykKKyMgPC9hPgorIyAoYEZQJyBiZWxvdyksIHRha2VuIGZyb20gYW4gSXRhbGlhbiBOYXRpb25hbCBFbGVjdHJvdGVjaG5pY2FsIEluc3RpdHV0ZQorIyBwdWJsaWNhdGlvbi4gV2hlbiB0aGUgdGhyZWUgc291cmNlcyBkaXNhZ3JlZSwgZ3Vlc3Mgd2hvJ3MgcmlnaHQsIGFzIGZvbGxvd3M6CisjCisjIHllYXIJRlAJU2hhbmtzJlAuIChTKQlXaGl0bWFuIChXKQlHbyB3aXRoOgorIyAxOTE2CTA2LTAzCTA2LTAzIDI0OjAwCTA2LTAzIDAwOjAwCUZQICYgVworIwkwOS0zMAkwOS0zMCAyNDowMAkwOS0zMCAwMTowMAlGUDsgZ3Vlc3MgMjQ6MDBzCisjIDE5MTcJMDQtMDEJMDMtMzEgMjQ6MDAJMDMtMzEgMDA6MDAJRlAgJiBTCisjCTA5LTMwCTA5LTI5IDI0OjAwCTA5LTMwIDAxOjAwCUZQICYgVworIyAxOTE4CTAzLTA5CTAzLTA5IDI0OjAwCTAzLTA5IDAwOjAwCUZQICYgUworIwkxMC0wNgkxMC0wNSAyNDowMAkxMC0wNiAwMTowMAlGUCAmIFcKKyMgMTkxOQkwMy0wMQkwMy0wMSAyNDowMAkwMy0wMSAwMDowMAlGUCAmIFMKKyMJMTAtMDQJMTAtMDQgMjQ6MDAJMTAtMDQgMDE6MDAJRlA7IGd1ZXNzIDI0OjAwcworIyAxOTIwCTAzLTIwCTAzLTIwIDI0OjAwCTAzLTIwIDAwOjAwCUZQICYgUworIwkwOS0xOAkwOS0xOCAyNDowMAkxMC0wMSAwMTowMAlGUDsgZ3Vlc3MgMjQ6MDBzCisjIDE5NDQJMDQtMDIJMDQtMDMgMDI6MDAJCQlTIChzZWUgQy1FdXIpCisjCTA5LTE2CTEwLTAyIDAzOjAwCQkJRlA7IGd1ZXNzIDI0OjAwcworIyAxOTQ1CTA5LTE0CTA5LTE2IDI0OjAwCQkJRlA7IGd1ZXNzIDI0OjAwcworIyAxOTcwCTA1LTIxCTA1LTMxIDAwOjAwCQkJUworIwkwOS0yMAkwOS0yNyAwMDowMAkJCVMKKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUl0YWx5CTE5MTYJb25seQktCUp1bgkgMwkwOjAwcwkxOjAwCVMKK1J1bGUJSXRhbHkJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDBzCTAJLQorUnVsZQlJdGFseQkxOTE3CW9ubHkJLQlBcHIJIDEJMDowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5MTcJb25seQktCVNlcAkzMAkwOjAwcwkwCS0KK1J1bGUJSXRhbHkJMTkxOAlvbmx5CS0JTWFyCTEwCTA6MDBzCTE6MDAJUworUnVsZQlJdGFseQkxOTE4CTE5MTkJLQlPY3QJU3VuPj0xCTA6MDBzCTAJLQorUnVsZQlJdGFseQkxOTE5CW9ubHkJLQlNYXIJIDIJMDowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5MjAJb25seQktCU1hcgkyMQkwOjAwcwkxOjAwCVMKK1J1bGUJSXRhbHkJMTkyMAlvbmx5CS0JU2VwCTE5CTA6MDBzCTAJLQorUnVsZQlJdGFseQkxOTQwCW9ubHkJLQlKdW4JMTUJMDowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5NDQJb25seQktCVNlcAkxNwkwOjAwcwkwCS0KK1J1bGUJSXRhbHkJMTk0NQlvbmx5CS0JQXByCSAyCTI6MDAJMTowMAlTCitSdWxlCUl0YWx5CTE5NDUJb25seQktCVNlcAkxNQkwOjAwcwkwCS0KK1J1bGUJSXRhbHkJMTk0Nglvbmx5CS0JTWFyCTE3CTI6MDBzCTE6MDAJUworUnVsZQlJdGFseQkxOTQ2CW9ubHkJLQlPY3QJIDYJMjowMHMJMAktCitSdWxlCUl0YWx5CTE5NDcJb25seQktCU1hcgkxNgkwOjAwcwkxOjAwCVMKK1J1bGUJSXRhbHkJMTk0Nwlvbmx5CS0JT2N0CSA1CTA6MDBzCTAJLQorUnVsZQlJdGFseQkxOTQ4CW9ubHkJLQlGZWIJMjkJMjowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5NDgJb25seQktCU9jdAkgMwkyOjAwcwkwCS0KK1J1bGUJSXRhbHkJMTk2NgkxOTY4CS0JTWF5CVN1bj49MjIJMDowMAkxOjAwCVMKK1J1bGUJSXRhbHkJMTk2NgkxOTY5CS0JU2VwCVN1bj49MjIJMDowMAkwCS0KK1J1bGUJSXRhbHkJMTk2OQlvbmx5CS0JSnVuCSAxCTA6MDAJMTowMAlTCitSdWxlCUl0YWx5CTE5NzAJb25seQktCU1heQkzMQkwOjAwCTE6MDAJUworUnVsZQlJdGFseQkxOTcwCW9ubHkJLQlTZXAJbGFzdFN1bgkwOjAwCTAJLQorUnVsZQlJdGFseQkxOTcxCTE5NzIJLQlNYXkJU3VuPj0yMgkwOjAwCTE6MDAJUworUnVsZQlJdGFseQkxOTcxCW9ubHkJLQlTZXAJbGFzdFN1bgkxOjAwCTAJLQorUnVsZQlJdGFseQkxOTcyCW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KK1J1bGUJSXRhbHkJMTk3Mwlvbmx5CS0JSnVuCSAzCTA6MDAJMTowMAlTCitSdWxlCUl0YWx5CTE5NzMJMTk3NAktCVNlcAlsYXN0U3VuCTA6MDAJMAktCitSdWxlCUl0YWx5CTE5NzQJb25seQktCU1heQkyNgkwOjAwCTE6MDAJUworUnVsZQlJdGFseQkxOTc1CW9ubHkJLQlKdW4JIDEJMDowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5NzUJMTk3NwktCVNlcAlsYXN0U3VuCTA6MDBzCTAJLQorUnVsZQlJdGFseQkxOTc2CW9ubHkJLQlNYXkJMzAJMDowMHMJMTowMAlTCitSdWxlCUl0YWx5CTE5NzcJMTk3OQktCU1heQlTdW4+PTIyCTA6MDBzCTE6MDAJUworUnVsZQlJdGFseQkxOTc4CW9ubHkJLQlPY3QJIDEJMDowMHMJMAktCitSdWxlCUl0YWx5CTE5NzkJb25seQktCVNlcAkzMAkwOjAwcwkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJRXVyb3BlL1JvbWUJMDo0OTo1NiAtCUxNVAkxODY2IFNlcCAyMgorCQkJMDo0OTo1NgktCVJNVAkxODkzIE5vdiAgMSAwOjAwcyAjIFJvbWUgTWVhbgorCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcworCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEp1bAorCQkJMTowMAlJdGFseQlDRSVzVAkxOTgwCisJCQkxOjAwCUVVCUNFJXNUCisKK0xpbmsJRXVyb3BlL1JvbWUJRXVyb3BlL1ZhdGljYW4KK0xpbmsJRXVyb3BlL1JvbWUJRXVyb3BlL1Nhbl9NYXJpbm8KKworIyBMYXR2aWEKKworIyBGcm9tIExpZW5lIEthbmVwZSAoMTk5OC0wOS0xNyk6CisKKyMgSSBhc2tlZCBhYm91dCB0aGlzIG1hdHRlciBTY2llbnRpZmljIFNlY3JldGFyeSBvZiB0aGUgSW5zdGl0dXRlIG9mIEFzdHJvbm9teQorIyBvZiBUaGUgVW5pdmVyc2l0eSBvZiBMYXR2aWEgRHIuIHBhZWQgTXIuIElsZ29uaXMgVmlsa3MuIEkgYWxzbyBzZWFyY2hlZCB0aGUKKyMgY29ycmVjdCBkYXRhIGluIGp1cmlkaWNhbCBhY3RzIGFuZCBJIGZvdW5kIHNvbWUganVyaWRpY2FsIGRvY3VtZW50cyBhYm91dAorIyBjaGFuZ2VzIGluIHRoZSBjb3VudGluZyBvZiB0aW1lIGluIExhdHZpYSBmcm9tIDE5ODEuLi4uCisjCisjIEFjdCBOby4zNSBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgTGF0dmlhbiBTU1Igb2YgMTk4MS0wMS0yMiAuLi4KKyMgYWNjb3JkaW5nIHRvIHRoZSBBY3QgTm8uOTI1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBVU1NSIG9mIDE5ODAtMTAtMjQKKyMgLi4uOiBhbGwgeWVhciByb3VuZCB0aGUgdGltZSBvZiAybmQgdGltZSB6b25lICsgMSBob3VyLCBpbiBhZGRpdGlvbiB0dXJuaW5nCisjIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGZvcndhcmQgb24gMSBBcHJpbCBhdCAwMDowMCAoR01UIDMxIE1hcmNoIDIxOjAwKQorIyBhbmQgMSBob3VyIGJhY2t3YXJkIG9uIHRoZSAxIE9jdG9iZXIgYXQgMDA6MDAgKEdNVCAzMCBTZXB0ZW1iZXIgMjA6MDApLgorIworIyBBY3QgTm8uNTkyIG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBMYXR2aWFuIFNTUiBvZiAxOTg0LTA5LTI0IC4uLgorIyBhY2NvcmRpbmcgdG8gdGhlIEFjdCBOby45Njcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIFVTU1Igb2YgMTk4NC0wOS0xMworIyAuLi46IGFsbCB5ZWFyIHJvdW5kIHRoZSB0aW1lIG9mIDJuZCB0aW1lIHpvbmUgKyAxIGhvdXIsIGluIGFkZGl0aW9uIHR1cm5pbmcKKyMgdGhlIGhhbmRzIG9mIHRoZSBjbG9jayAxIGhvdXIgZm9yd2FyZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgTWFyY2ggYXQgMDI6MDAKKyMgKEdNVCAyMzowMCBvbiB0aGUgcHJldmlvdXMgZGF5KSBhbmQgMSBob3VyIGJhY2t3YXJkIG9uIHRoZSBsYXN0IFN1bmRheSBvZgorIyBTZXB0ZW1iZXIgYXQgMDM6MDAgKEdNVCAyMzowMCBvbiB0aGUgcHJldmlvdXMgZGF5KS4KKyMKKyMgQWN0IE5vLjgxIG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBMYXR2aWFuIFNTUiBvZiAxOTg5LTAzLTIyIC4uLgorIyBhY2NvcmRpbmcgdG8gdGhlIEFjdCBOby4yMjcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIFVTU1Igb2YgMTk4OS0wMy0xNAorIyAuLi46IHNpbmNlIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCAxOTg5IGluIExpdGh1YW5pYW4gU1NSLCBMYXR2aWFuIFNTUiwKKyMgRXN0b25pYW4gU1NSIGFuZCBLYWxpbmluZ3JhZCByZWdpb24gb2YgUnVzc2lhbiBGZWRlcmF0aW9uIGFsbCB5ZWFyIHJvdW5kIHRoZQorIyB0aW1lIG9mIDJuZCB0aW1lIHpvbmUgKE1vc2NvdyB0aW1lIG1pbnVzIG9uZSBob3VyKS4gT24gdGhlIHRlcnJpdG9yeSBvZiBMYXR2aWEKKyMgdHJhbnNpdGlvbiB0byBzdW1tZXIgdGltZSBpcyBwZXJmb3JtZWQgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIGF0IDAyOjAwCisjIChHTVQgMDA6MDApLCB0dXJuaW5nIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGZvcndhcmQuICBUaGUgZW5kIG9mCisjIGRheWxpZ2h0IHNhdmluZyB0aW1lIGlzIHBlcmZvcm1lZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyIGF0IDAzOjAwCisjIChHTVQgMDA6MDApLCB0dXJuaW5nIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGJhY2t3YXJkLiBFeGNlcHRpb24gaXMKKyMgMTk4OS0wMy0yNiwgd2hlbiB3ZSBtdXN0IG5vdCB0dXJuIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2suLi4uCisjCisjIFRoZSBSZWd1bGF0aW9ucyBvZiB0aGUgQ2FiaW5ldCBvZiBNaW5pc3RlcnMgb2YgdGhlIFJlcHVibGljIG9mIExhdHZpYSBvZgorIyAxOTk3LTAxLTIxIG9uIHRyYW5zaXRpb24gdG8gU3VtbWVyIHRpbWUgLi4uIGVzdGFibGlzaGVkIHRoZSBzYW1lIG9yZGVyIG9mCisjIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzZXR0aW5ncyBhcyBpbiB0aGUgU3RhdGVzIG9mIHRoZSBFdXJvcGVhbiBVbmlvbi4KKworIyBGcm9tIEFuZHJlaSBJdmFub3YgKDIwMDAtMDMtMDYpOgorIyBUaGlzIHllYXIgTGF0dmlhIHdpbGwgbm90IHN3aXRjaCB0byBEYXlsaWdodCBTYXZpbmdzIFRpbWUgKGFzIHNwZWNpZmllZCBpbgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmx2LWxhaWtzLmx2L3d3d3Jha3N0aS8yMDAwLzA3MTA3Mi92ZDQuaHRtIj4KKyMgVGhlIFJlZ3VsYXRpb25zIG9mIHRoZSBDYWJpbmV0IG9mIE1pbmlzdGVycyBvZiB0aGUgUmVwLiBvZiBMYXR2aWEgb2YKKyMgMjktRmViLTIwMDAgKCM3OSk8L2E+LCBpbiBMYXR2aWFuIGZvciBzdWJzY3JpYmVycyBvbmx5KS4KKworIyA8YSBocmVmPSJodHRwOi8vd3d3LnJmZXJsLm9yZy9uZXdzbGluZS8yMDAxLzAxLzMtQ0VFL2NlZS0wMzAxMDEuaHRtbCI+CisjIEZyb20gUkZFL1JMIE5ld3NsaW5lICgyMDAxLTAxLTAzKSwgbm90ZWQgYWZ0ZXIgYSBoZWFkcy11cCBieSBSaXZlcyBNY0RvdzoKKyMgPC9hPgorIyBUaGUgTGF0dmlhbiBnb3Zlcm5tZW50IG9uIDIgSmFudWFyeSBkZWNpZGVkIHRoYXQgdGhlIGNvdW50cnkgd2lsbAorIyBpbnN0aXR1dGUgZGF5bGlnaHQtc2F2aW5nIHRpbWUgdGhpcyBzcHJpbmcsIExFVEEgcmVwb3J0ZWQuCisjIExhc3QgRmVicnVhcnkgdGhlIHRocmVlIEJhbHRpYyBzdGF0ZXMgZGVjaWRlZCBub3QgdG8gdHVybiBiYWNrIHRoZWlyCisjIGNsb2NrcyBvbmUgaG91ciBpbiB0aGUgc3ByaW5nLi4uLgorIyBNaW5pc3RlciBvZiBFY29ub215IEFpZ2FycyBLYWx2aXRpcyBub3RlZCB0aGF0IExhdHZpYSBoYWQgdG9vIGZldworIyBkYXlsaWdodCBob3VycyBhbmQgdGh1cyBkZWNpZGVkIHRvIGNvbXBseSB3aXRoIGEgZHJhZnQgRXVyb3BlYW4KKyMgQ29tbWlzc2lvbiBkaXJlY3RpdmUgdGhhdCBwcm92aWRlcyBmb3IgaW5zdGl0dXRpbmcgZGF5bGlnaHQtc2F2aW5nCisjIHRpbWUgaW4gRVUgY291bnRyaWVzIGJldHdlZW4gMjAwMiBhbmQgMjAwNi4gVGhlIExhdHZpYW4gZ292ZXJubWVudAorIyB1cmdlZCBMaXRodWFuaWEgYW5kIEVzdG9uaWEgdG8gYWRvcHQgYSBzaW1pbGFyIHRpbWUgcG9saWN5LCBidXQgaXQKKyMgYXBwZWFycyB0aGF0IHRoZXkgd2lsbCBub3QgZG8gc28uLi4uCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCitSdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9SaWdhCTE6MzY6MjQJLQlMTVQJMTg4MAorCQkJMTozNjoyNAktCVJNVAkxOTE4IEFwciAxNSAyOjAwICNSaWdhIE1lYW4gVGltZQorCQkJMTozNjoyNAkxOjAwCUxTVAkxOTE4IFNlcCAxNiAzOjAwICNMYXR2aWFuIFN1bW1lcgorCQkJMTozNjoyNAktCVJNVAkxOTE5IEFwciAgMSAyOjAwCisJCQkxOjM2OjI0CTE6MDAJTFNUCTE5MTkgTWF5IDIyIDM6MDAKKwkJCTE6MzY6MjQJLQlSTVQJMTkyNiBNYXkgMTEKKwkJCTI6MDAJLQlFRVQJMTk0MCBBdWcgIDUKKwkJCTM6MDAJLQlNU0sJMTk0MSBKdWwKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBPY3QgMTMKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgbGFzdFN1biAyOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk4OSBTZXAgbGFzdFN1biAyOjAwcworCQkJMjowMAlMYXR2aWEJRUUlc1QJMTk5NyBKYW4gMjEKKwkJCTI6MDAJRVUJRUUlc1QJMjAwMCBGZWIgMjkKKwkJCTI6MDAJLQlFRVQJMjAwMSBKYW4gIDIKKwkJCTI6MDAJRVUJRUUlc1QKKworIyBMaWVjaHRlbnN0ZWluCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9WYWR1egkwOjM4OjA0IC0JTE1UCTE4OTQgSnVuCisJCQkxOjAwCS0JQ0VUCTE5ODEKKwkJCTE6MDAJRVUJQ0Ulc1QKKworIyBMaXRodWFuaWEKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTExLTIyKToKKyMgSUFUQSBTU0lNICgxOTkyLzE5OTYpIHNheXMgTGl0aHVhbmlhIHVzZXMgVy1FdXIgcnVsZXMsIGJ1dCBzaW5jZSBpdCBpcworIyBrbm93biB0byBiZSB3cm9uZyBhYm91dCBFc3RvbmlhIGFuZCBMYXR2aWEsIGFzc3VtZSBpdCdzIHdyb25nIGhlcmUgdG9vLgorCisjIEZyb20gTWFyaXVzIEdlZG1pbmFzICgxOTk4LTA4LTA3KToKKyMgSSB3b3VsZCBsaWtlIHRvIGluZm9ybSB0aGF0IGluIHRoaXMgeWVhciBMaXRodWFuaWFuIHRpbWUgem9uZQorIyAoRXVyb3BlL1ZpbG5pdXMpIHdhcyBjaGFuZ2VkLgorCisjIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5lbHRhLmx0LyI+RUxUQTwvYT4gTm8uIDk3MiAoMjU4MikgKDE5OTktMDktMjkpLAorIyB2aWEgU3RlZmZlbiBUaG9yc2VuOgorIyBMaXRodWFuaWEgaGFzIHNoaWZ0ZWQgYmFjayB0byB0aGUgc2Vjb25kIHRpbWUgem9uZSAoR01UIHBsdXMgdHdvIGhvdXJzKQorIyB0byBiZSB2YWxpZCBoZXJlIHN0YXJ0aW5nIGZyb20gT2N0b2JlciAzMSwKKyMgYXMgZGVjaWRlZCBieSB0aGUgbmF0aW9uYWwgZ292ZXJubWVudCBvbiBXZWRuZXNkYXkuLi4uCisjIFRoZSBMaXRodWFuaWFuIGdvdmVybm1lbnQgYWxzbyBhbm5vdW5jZWQgcGxhbnMgdG8gY29uc2lkZXIgYQorIyBtb3Rpb24gdG8gZ2l2ZSB1cCBzaGlmdGluZyB0byBzdW1tZXIgdGltZSBpbiBzcHJpbmcsIGFzIGl0IHdhcworIyBhbHJlYWR5IGRvbmUgYnkgRXN0b25pYS4KKworIyBGcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdXJpc20ubHQvaW5mb3JtYS9mZi5odG0iPgorIyBGYWN0IEZpbGUsIExpdGh1YW5pYW4gU3RhdGUgRGVwYXJ0bWVudCBvZiBUb3VyaXNtCisjIDwvYT4gKDIwMDAtMDMtMjcpOiBMb2NhbCB0aW1lIGlzIEdNVCsyIGhvdXJzIC4uLiwgbm8gZGF5bGlnaHQgc2F2aW5nLgorCisjIEZyb20gYSB1c2VyIHZpYSBLbGF1cyBNYXJ0ZW4gKDIwMDMtMDItMDcpOgorIyBBcyBhIGNhbmRpZGF0ZSBmb3IgbWVtYmVyc2hpcCBvZiB0aGUgRXVyb3BlYW4gVW5pb24sIExpdGh1YW5pYSB3aWxsCisjIG9ic2VydmUgU3VtbWVyIFRpbWUgaW4gMjAwMywgY2hhbmdpbmcgaXRzIGNsb2NrcyBhdCB0aGUgdGltZXMgbGFpZAorIyBkb3duIGluIEVVIERpcmVjdGl2ZSAyMDAwLzg0IG9mIDE5LkkuMDEgKGkuZS4gYXQgdGhlIHNhbWUgdGltZXMgYXMgaXRzCisjIG5laWdoYm91ciBMYXR2aWEpLiBUaGUgdGV4dCBvZiB0aGUgTGl0aHVhbmlhbiBnb3Zlcm5tZW50IE9yZGVyIG9mCisjIDcuWEkuMDIgdG8gdGhpcyBlZmZlY3QgY2FuIGJlIGZvdW5kIGF0CisjIGh0dHA6Ly93d3cubHJ2ay5sdC9udXQvMTEvbjE3NDkuaHRtCisKKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvVmlsbml1cwkxOjQxOjE2CS0JTE1UCTE4ODAKKwkJCTE6MjQ6MDAJLQlXTVQJMTkxNwkgICAgIyBXYXJzYXcgTWVhbiBUaW1lCisJCQkxOjM1OjM2CS0JS01UCTE5MTkgT2N0IDEwICMgS2F1bmFzIE1lYW4gVGltZQorCQkJMTowMAktCUNFVAkxOTIwIEp1bCAxMgorCQkJMjowMAktCUVFVAkxOTIwIE9jdCAgOQorCQkJMTowMAktCUNFVAkxOTQwIEF1ZyAgMworCQkJMzowMAktCU1TSwkxOTQxIEp1biAyNAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZworCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMjowMHMKKwkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5OAorCQkJMjowMAktCUVFVAkxOTk4IE1hciAyOSAxOjAwdQorCQkJMTowMAlFVQlDRSVzVAkxOTk5IE9jdCAzMSAxOjAwdQorCQkJMjowMAktCUVFVAkyMDAzIEphbiAgMQorCQkJMjowMAlFVQlFRSVzVAorCisjIEx1eGVtYm91cmcKKyMgV2hpdG1hbiBkaXNhZ3JlZXMgd2l0aCBtb3N0IG9mIHRoZXNlIGRhdGVzIGluIG1pbm9yIHdheXM7CisjIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTHV4CTE5MTYJb25seQktCU1heQkxNAkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MTYJb25seQktCU9jdAkgMQkgMTowMAkwCS0KK1J1bGUJTHV4CTE5MTcJb25seQktCUFwcgkyOAkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MTcJb25seQktCVNlcAkxNwkgMTowMAkwCS0KK1J1bGUJTHV4CTE5MTgJb25seQktCUFwcglNb24+PTE1CSAyOjAwcwkxOjAwCVMKK1J1bGUJTHV4CTE5MTgJb25seQktCVNlcAlNb24+PTE1CSAyOjAwcwkwCS0KK1J1bGUJTHV4CTE5MTkJb25seQktCU1hcgkgMQkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MTkJb25seQktCU9jdAkgNQkgMzowMAkwCS0KK1J1bGUJTHV4CTE5MjAJb25seQktCUZlYgkxNAkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjAJb25seQktCU9jdAkyNAkgMjowMAkwCS0KK1J1bGUJTHV4CTE5MjEJb25seQktCU1hcgkxNAkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjEJb25seQktCU9jdAkyNgkgMjowMAkwCS0KK1J1bGUJTHV4CTE5MjIJb25seQktCU1hcgkyNQkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjIJb25seQktCU9jdAlTdW4+PTIJIDE6MDAJMAktCitSdWxlCUx1eAkxOTIzCW9ubHkJLQlBcHIJMjEJMjM6MDAJMTowMAlTCitSdWxlCUx1eAkxOTIzCW9ubHkJLQlPY3QJU3VuPj0yCSAyOjAwCTAJLQorUnVsZQlMdXgJMTkyNAlvbmx5CS0JTWFyCTI5CTIzOjAwCTE6MDAJUworUnVsZQlMdXgJMTkyNAkxOTI4CS0JT2N0CVN1bj49MgkgMTowMAkwCS0KK1J1bGUJTHV4CTE5MjUJb25seQktCUFwcgkgNQkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjYJb25seQktCUFwcgkxNwkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjcJb25seQktCUFwcgkgOQkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjgJb25seQktCUFwcgkxNAkyMzowMAkxOjAwCVMKK1J1bGUJTHV4CTE5MjkJb25seQktCUFwcgkyMAkyMzowMAkxOjAwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgRXVyb3BlL0x1eGVtYm91cmcJMDoyNDozNiAtCUxNVAkxOTA0IEp1bgorCQkJMTowMAlMdXgJQ0Ulc1QJMTkxOCBOb3YgMjUKKwkJCTA6MDAJTHV4CVdFJXNUCTE5MjkgT2N0ICA2IDI6MDBzCisJCQkwOjAwCUJlbGdpdW0JV0Ulc1QJMTk0MCBNYXkgMTQgMzowMAorCQkJMTowMAlDLUV1cglXRSVzVAkxOTQ0IFNlcCAxOCAzOjAwCisJCQkxOjAwCUJlbGdpdW0JQ0Ulc1QJMTk3NworCQkJMTowMAlFVQlDRSVzVAorCisjIE1hY2Vkb25pYQorIyBzZWUgU2VyYmlhCisKKyMgTWFsdGEKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCU1hbHRhCTE5NzMJb25seQktCU1hcgkzMQkwOjAwcwkxOjAwCVMKK1J1bGUJTWFsdGEJMTk3Mwlvbmx5CS0JU2VwCTI5CTA6MDBzCTAJLQorUnVsZQlNYWx0YQkxOTc0CW9ubHkJLQlBcHIJMjEJMDowMHMJMTowMAlTCitSdWxlCU1hbHRhCTE5NzQJb25seQktCVNlcAkxNgkwOjAwcwkwCS0KK1J1bGUJTWFsdGEJMTk3NQkxOTc5CS0JQXByCVN1bj49MTUJMjowMAkxOjAwCVMKK1J1bGUJTWFsdGEJMTk3NQkxOTgwCS0JU2VwCVN1bj49MTUJMjowMAkwCS0KK1J1bGUJTWFsdGEJMTk4MAlvbmx5CS0JTWFyCTMxCTI6MDAJMTowMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9NYWx0YQkwOjU4OjA0IC0JTE1UCTE4OTMgTm92ICAyIDA6MDBzICMgVmFsbGV0dGEKKwkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk0MiBOb3YgIDIgMjowMHMKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMHMKKwkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk3MyBNYXIgMzEKKwkJCTE6MDAJTWFsdGEJQ0Ulc1QJMTk4MQorCQkJMTowMAlFVQlDRSVzVAorCisjIE1vbGRvdmEKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZGF0YWJhc2UgZm9sbG93ZWQgU2hhbmtzICYgUG90dGVuZ2VyLCB3aG8gd3JpdGUKKyMgdGhhdCBUaXJhc3BvbCBzd2l0Y2hlZCB0byBNb3Njb3cgdGltZSBvbiAxOTkyLTAxLTE5IGF0IDAyOjAwLgorIyBIb3dldmVyLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGFuIGVycm9yLCBhcyBNb2xkb3ZhIGRlY2xhcmVkIGluZGVwZW5kZW5jZQorIyBvbiAxOTkxLTA4LTI3ICh0aGUgMTk5Mi0wMS0xOSBkYXRlIGlzIHRoYXQgb2YgYSBSdXNzaWFuIGRlY3JlZSkuCisjIEluIGVhcmx5IDE5OTIgdGhlcmUgd2FzIGxhcmdlLXNjYWxlIGludGVyZXRobmljIHZpb2xlbmNlIGluIHRoZSBhcmVhCisjIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBSdXNzb3Bob25lcyBjb250aW51ZWQgdG8gb2JzZXJ2ZSBNb3Njb3cgdGltZS4KKyMgQnV0IFt0d28gcGVvcGxlXSBzZXBhcmF0ZWx5IHJlcG9ydGVkIHZpYQorIyBKZXNwZXIgTm9yZ2FhcmQgdGhhdCBhcyBvZiAyMDAxLTAxLTI0IFRpcmFzcG9sIHdhcyBsaWtlIENoaXNpbmF1LgorIyBUaGUgVGlyYXNwb2wgZW50cnkgaGFzIHRoZXJlZm9yZSBiZWVuIHJlbW92ZWQgZm9yIG5vdy4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvQ2hpc2luYXUJMTo1NToyMCAtCUxNVAkxODgwCisJCQkxOjU1CS0JQ01UCTE5MTggRmViIDE1ICMgQ2hpc2luYXUgTVQKKwkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQgIyBCdWNoYXJlc3QgTVQKKwkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTQwIEF1ZyAxNQorCQkJMjowMAkxOjAwCUVFU1QJMTk0MSBKdWwgMTcKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBBdWcgMjQKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAorCQkJMzowMAktCU1TSwkxOTkwIE1heSA2CisJCQkyOjAwCS0JRUVUCTE5OTEKKwkJCTI6MDAJUnVzc2lhCUVFJXNUCTE5OTIKKwkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NworIyBTZWUgUm9tYW5pYSBjb21tZW50YXJ5IGZvciB0aGUgZ3Vlc3NlZCAxOTk3IHRyYW5zaXRpb24gdG8gRVUgcnVsZXMuCisJCQkyOjAwCUVVCUVFJXNUCisKKyMgTW9uYWNvCisjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCisjIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvTW9uYWNvCTA6Mjk6MzIgLQlMTVQJMTg5MSBNYXIgMTUKKwkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKKwkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDUgU2VwIDE2IDM6MDAKKwkJCTE6MDAJRnJhbmNlCUNFJXNUCTE5NzcKKwkJCTE6MDAJRVUJQ0Ulc1QKKworIyBNb250ZW5lZ3JvCisjIHNlZSBTZXJiaWEKKworIyBOZXRoZXJsYW5kcworCisjIEhvd3NlIHdyaXRlcyB0aGF0IHRoZSBOZXRoZXJsYW5kcycgcmFpbHdheXMgdXNlZCBHTVQgYmV0d2VlbiAxODkyIGFuZCAxOTQwLAorIyBidXQgZm9yIG90aGVyIHB1cnBvc2VzIHRoZSBOZXRoZXJsYW5kcyB1c2VkIEFtc3RlcmRhbSBtZWFuIHRpbWUuCisKKyMgSG93ZXZlciwgUm9iZXJ0IEguIHZhbiBHZW50IHdyaXRlcyAoMjAwMS0wNC0wMSk6CisjIEhvd3NlJ3Mgc3RhdGVtZW50IGlzIG9ubHkgY29ycmVjdCB1cCB0byAxOTA5LiBGcm9tIDE5MDktMDUtMDEgKDAwOjAwOjAwCisjIEFtc3RlcmRhbSBtZWFuIHRpbWUpIG9ud2FyZHMsIHRoZSB3aG9sZSBvZiB0aGUgTmV0aGVybGFuZHMgKGluY2x1ZGluZworIyB0aGUgRHV0Y2ggcmFpbHdheXMpIHdhcyByZXF1aXJlZCBieSBsYXcgdG8gb2JzZXJ2ZSBBbXN0ZXJkYW0gbWVhbiB0aW1lCisjICgxOSBtaW51dGVzIDMyLjEzIHNlY29uZHMgYWhlYWQgb2YgR01UKS4gVGhpcyBoYWQgYWxyZWFkeSBiZWVuIHRoZQorIyBjb21tb24gcHJhY3RpY2UgKGV4Y2VwdCBmb3IgdGhlIHJhaWx3YXlzKSBmb3IgbWFueSBkZWNhZGVzIGJ1dCBpdCB3YXMKKyMgbm90IHVudGlsIDE5MDkgd2hlbiB0aGUgRHV0Y2ggZ292ZXJubWVudCBmaW5hbGx5IGRlZmluZWQgdGhpcyBieSBsYXcuCisjIE9uIDE5MzctMDctMDEgdGhpcyB3YXMgY2hhbmdlZCB0byAyMCBtaW51dGVzIChleGFjdGx5KSBhaGVhZCBvZiBHTVQgYW5kCisjIHdhcyBnZW5lcmFsbHkga25vd24gYXMgRHV0Y2ggVGltZSAoIk5lZGVybGFuZHNlIFRpamQiKS4KKyMKKyMgKDIwMDEtMDQtMDgpOgorIyAxODkyLTA1LTAxIHdhcyB0aGUgZGF0ZSB3aGVuIHRoZSBEdXRjaCByYWlsd2F5cyB3ZXJlIGJ5IGxhdyByZXF1aXJlZCB0bworIyBvYnNlcnZlIEdNVCB3aGlsZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBOZXRoZXJsYW5kcyBhZGhlcmVkIHRvIHRoZSBjb21tb24KKyMgcHJhY3RpY2Ugb2YgZm9sbG93aW5nIEFtc3RlcmRhbSBtZWFuIHRpbWUuCisjCisjICgyMDAxLTA0LTA5KToKKyMgSW4gMTgzNSB0aGUgYXV0aG9yaXRpZXMgb2YgdGhlIHByb3ZpbmNlIG9mIE5vcnRoIEhvbGxhbmQgcmVxdWVzdGVkIHRoZQorIyBtdW5pY2lwYWwgYXV0aG9yaXRpZXMgb2YgdGhlIHRvd25zIGFuZCBjaXRpZXMgaW4gdGhlIHByb3ZpbmNlIHRvIG9ic2VydmUKKyMgQW1zdGVyZGFtIG1lYW4gdGltZSBidXQgSSBkbyBub3Qga25vdyBpbiBob3cgbWFueSBjYXNlcyB0aGlzIHJlcXVlc3Qgd2FzCisjIGFjdHVhbGx5IGZvbGxvd2VkLgorIworIyBGcm9tIDE4NTIgb253YXJkcyB0aGUgRHV0Y2ggdGVsZWdyYXBoIG9mZmljZXMgd2VyZSBieSBsYXcgcmVxdWlyZWQgdG8KKyMgb2JzZXJ2ZSBBbXN0ZXJkYW0gbWVhbiB0aW1lLiBBcyB0aGUgdGltZSBzaWduYWxzIGZyb20gdGhlIG9ic2VydmF0b3J5IG9mCisjIExlaWRlbiB3ZXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgdGhlIHRlbGVncmFwaCBzeXN0ZW0sIEkgYXNzdW1lIHRoYXQgbW9zdAorIyBwbGFjZXMgbGlua2VkIHVwIHdpdGggdGhlIHRlbGVncmFwaCAoYW5kIHJhaWx3YXkpIHN5c3RlbSBhdXRvbWF0aWNhbGx5CisjIGFkb3B0ZWQgQW1zdGVyZGFtIG1lYW4gdGltZS4KKyMKKyMgQWx0aG91Z2ggdGhlIGVhcmx5IER1dGNoIHJhaWx3YXkgY29tcGFuaWVzIGluaXRpYWxseSBvYnNlcnZlZCBhIHZhcmlldHkKKyMgb2YgdGltZXMsIG1vc3Qgb2YgdGhlbSBoYWQgYWRvcHRlZCBBbXN0ZXJkYW0gbWVhbiB0aW1lIGJ5IDE4NTggYnV0IGl0CisjIHdhcyBub3QgdW50aWwgMTg2NiB3aGVuIHRoZXkgd2VyZSBhbGwgcmVxdWlyZWQgYnkgbGF3IHRvIG9ic2VydmUKKyMgQW1zdGVyZGFtIG1lYW4gdGltZS4KKworIyBUaGUgZGF0YSBiZWZvcmUgMTk0NSBhcmUgdGFrZW4gZnJvbQorIyA8aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC93ZXR0aWpkL3dldHRpamQuaHRtPi4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTmV0aAkxOTE2CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCU5TVAkjIE5ldGhlcmxhbmRzIFN1bW1lciBUaW1lCitSdWxlCU5ldGgJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlBTVQJIyBBbXN0ZXJkYW0gTWVhbiBUaW1lCitSdWxlCU5ldGgJMTkxNwlvbmx5CS0JQXByCTE2CTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkxNwlvbmx5CS0JU2VwCTE3CTI6MDBzCTAJQU1UCitSdWxlCU5ldGgJMTkxOAkxOTIxCS0JQXByCU1vbj49MQkyOjAwcwkxOjAwCU5TVAorUnVsZQlOZXRoCTE5MTgJMTkyMQktCVNlcAlsYXN0TW9uCTI6MDBzCTAJQU1UCitSdWxlCU5ldGgJMTkyMglvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMTowMAlOU1QKK1J1bGUJTmV0aAkxOTIyCTE5MzYJLQlPY3QJU3VuPj0yCTI6MDBzCTAJQU1UCitSdWxlCU5ldGgJMTkyMwlvbmx5CS0JSnVuCUZyaT49MQkyOjAwcwkxOjAwCU5TVAorUnVsZQlOZXRoCTE5MjQJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkyNQlvbmx5CS0JSnVuCUZyaT49MQkyOjAwcwkxOjAwCU5TVAorIyBGcm9tIDE5MjYgdGhyb3VnaCAxOTM5IERTVCBiZWdhbiAwNS0xNSwgZXhjZXB0IHRoYXQgaXQgd2FzIGRlbGF5ZWQgYnkgYSB3ZWVrCisjIGluIHllYXJzIHdoZW4gMDUtMTUgZmVsbCBpbiB0aGUgUGVudGVjb3N0IHdlZWtlbmQuCitSdWxlCU5ldGgJMTkyNgkxOTMxCS0JTWF5CTE1CTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkzMglvbmx5CS0JTWF5CTIyCTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkzMwkxOTM2CS0JTWF5CTE1CTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkzNwlvbmx5CS0JTWF5CTIyCTI6MDBzCTE6MDAJTlNUCitSdWxlCU5ldGgJMTkzNwlvbmx5CS0JSnVsCSAxCTA6MDAJMTowMAlTCitSdWxlCU5ldGgJMTkzNwkxOTM5CS0JT2N0CVN1bj49MgkyOjAwcwkwCS0KK1J1bGUJTmV0aAkxOTM4CTE5MzkJLQlNYXkJMTUJMjowMHMJMTowMAlTCitSdWxlCU5ldGgJMTk0NQlvbmx5CS0JQXByCSAyCTI6MDBzCTE6MDAJUworUnVsZQlOZXRoCTE5NDUJb25seQktCVNlcAkxNgkyOjAwcwkwCS0KKyMKKyMgQW1zdGVyZGFtIE1lYW4gVGltZSB3YXMgKzAwOjE5OjMyLjEzIGV4YWN0bHksIGJ1dCB0aGUgLjEzIGlzIG9taXR0ZWQKKyMgYmVsb3cgYmVjYXVzZSB0aGUgY3VycmVudCBmb3JtYXQgcmVxdWlyZXMgR01UT0ZGIHRvIGJlIGFuIGludGVnZXIuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEV1cm9wZS9BbXN0ZXJkYW0JMDoxOTozMiAtCUxNVAkxODM1CisJCQkwOjE5OjMyCU5ldGgJJXMJMTkzNyBKdWwgIDEKKwkJCTA6MjAJTmV0aAlORSVzVAkxOTQwIE1heSAxNiAwOjAwICMgRHV0Y2ggVGltZQorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwCisJCQkxOjAwCU5ldGgJQ0Ulc1QJMTk3NworCQkJMTowMAlFVQlDRSVzVAorCisjIE5vcndheQorIyBodHRwOi8vbWV0Lm5vL21ldC9tZXRfbGV4L3FfdS9zb21tZXJ0aWQuaHRtbCAoMjAwNC0wMSkgYWdyZWVzIHdpdGggU2hhbmtzICYKKyMgUG90dGVuZ2VyLgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTm9yd2F5CTE5MTYJb25seQktCU1heQkyMgkxOjAwCTE6MDAJUworUnVsZQlOb3J3YXkJMTkxNglvbmx5CS0JU2VwCTMwCTA6MDAJMAktCitSdWxlCU5vcndheQkxOTQ1CW9ubHkJLQlBcHIJIDIJMjowMHMJMTowMAlTCitSdWxlCU5vcndheQkxOTQ1CW9ubHkJLQlPY3QJIDEJMjowMHMJMAktCitSdWxlCU5vcndheQkxOTU5CTE5NjQJLQlNYXIJU3VuPj0xNQkyOjAwcwkxOjAwCVMKK1J1bGUJTm9yd2F5CTE5NTkJMTk2NQktCVNlcAlTdW4+PTE1CTI6MDBzCTAJLQorUnVsZQlOb3J3YXkJMTk2NQlvbmx5CS0JQXByCTI1CTI6MDBzCTE6MDAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvT3NsbwkwOjQzOjAwIC0JTE1UCTE4OTUgSmFuICAxCisJCQkxOjAwCU5vcndheQlDRSVzVAkxOTQwIEF1ZyAxMCAyMzowMAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMAorCQkJMTowMAlOb3J3YXkJQ0Ulc1QJMTk4MAorCQkJMTowMAlFVQlDRSVzVAorCisjIFN2YWxiYXJkICYgSmFuIE1heWVuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDEtMDUtMDEpOgorIyBBbHRob3VnaCBJIGNvdWxkIG5vdCBmaW5kIGl0IGV4cGxpY2l0bHksIGl0IHNlZW1zIHRoYXQgSmFuIE1heWVuIGFuZAorIyBTdmFsYmFyZCBoYXZlIGJlZW4gdXNpbmcgdGhlIHNhbWUgdGltZSBhcyBOb3J3YXkgYXQgbGVhc3Qgc2luY2UgdGhlCisjIHRpbWUgdGhleSB3ZXJlIGRlY2xhcmVkIGFzIHBhcnRzIG9mIE5vcndheS4gIFN2YWxiYXJkIHdhcyBkZWNsYXJlZAorIyBhcyBhIHBhcnQgb2YgTm9yd2F5IGJ5IGxhdyBvZiAxOTI1LTA3LTE3IG5vIDExLCBzZWN0aW9uIDQgYW5kIEphbgorIyBNYXllbiBieSBsYXcgb2YgMTkzMC0wMi0yNyBubyAyLCBzZWN0aW9uIDIuIChGcm9tCisjIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTkyNTA3MTctMDExLmh0bWwgYW5kCisjIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTkzMDAyMjctMDAyLmh0bWwpLiAgVGhlIGxhdy9yZWd1bGF0aW9uCisjIGZvciBub3JtYWwvc3RhbmRhcmQgdGltZSBpbiBOb3J3YXkgaXMgZnJvbSAxODk0LTA2LTI5IG5vIDEgKGNhbWUKKyMgaW50byBvcGVyYXRpb24gb24gMTg5NS0wMS0wMSkgYW5kIFN2YWxiYXJkL0phbiBNYXllbiBzZWVtIHRvIGJlIGEKKyMgcGFydCBvZiB0aGlzIGxhdyBzaW5jZSAxOTI1LzE5MzAuIChGcm9tCisjIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTg5NDA2MjktMDAxLmh0bWwgKSBJIGhhdmUgbm90IGJlZW4KKyMgYWJsZSB0byBmaW5kIGlmIEphbiBNYXllbiB1c2VkIGEgZGlmZmVyZW50IHRpbWUgem9uZSAoZS5nLiAtMDEwMCkKKyMgYmVmb3JlIDE5MzAuIEphbiBNYXllbiBoYXMgb25seSBiZWVuICJpbmhhYml0YXRlZCIgc2luY2UgMTkyMSBieQorIyBOb3J3ZWdpYW4gbWV0ZW9yb2xvZ2lzdHMgYW5kIG1heWJlIHVzZWQgdGhlIHNhbWUgdGltZSBhcyBOb3J3YXkgZXZlcgorIyBzaW5jZSAxOTIxLiAgU3ZhbGJhcmQgKEFyY3RpYy9Mb25neWVhcmJ5ZW4pIGhhcyBiZWVuIGluaGFiaXRlZCBzaW5jZQorIyBiZWZvcmUgMTg5NSwgYW5kIHRoZXJlZm9yZSBwcm9iYWJseSBjaGFuZ2VkIHRoZSBsb2NhbCB0aW1lIHNvbWV3aGVyZQorIyBiZXR3ZWVuIDE4OTUgYW5kIDE5MjUgKGluY2x1c2l2ZSkuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0wMSk6CisjCisjIEFjdHVhbGx5LCBKYW4gTWF5ZW4gd2FzIG5ldmVyIG9jY3VwaWVkIGJ5IEdlcm1hbnkgZHVyaW5nIFdvcmxkIFdhciBJSSwKKyMgc28gaXQgbXVzdCBoYXZlIGRpdmVyZ2VkIGZyb20gT3NsbyB0aW1lIGR1cmluZyB0aGUgd2FyLCBhcyBPc2xvIHdhcworIyBrZWVwaW5nIEJlcmxpbiB0aW1lLgorIworIyA8aHR0cDovL2hvbWUubm8ubmV0L2phbm1heWVuL2hpc3RvcnkuaHRtPiBzYXlzIHRoYXQgdGhlIG1ldGVvcm9sb2dpc3RzCisjIGJ1cm5lZCBkb3duIHRoZWlyIHN0YXRpb24gaW4gMTk0MCBhbmQgbGVmdCB0aGUgaXNsYW5kLCBidXQgcmV0dXJuZWQgaW4KKyMgMTk0MSB3aXRoIGEgc21hbGwgTm9yd2VnaWFuIGdhcnJpc29uIGFuZCBjb250aW51ZWQgb3BlcmF0aW9ucyBkZXNwaXRlCisjIGZyZXF1ZW50IGFpciB0dGFja3MgZnJvbSBHZXJtYW5zLiAgSW4gMTk0MyB0aGUgQW1lcmljYW5zIGVzdGFibGlzaGVkIGEKKyMgcmFkaW9sb2NhdGluZyBzdGF0aW9uIG9uIHRoZSBpc2xhbmQsIGNhbGxlZCAiQXRsYW50aWMgQ2l0eSIuICBQb3NzaWJseQorIyB0aGUgVVRDIG9mZnNldCBjaGFuZ2VkIGR1cmluZyB0aGUgd2FyLCBidXQgSSB0aGluayBpdCB1bmxpa2VseSB0aGF0CisjIEphbiBNYXllbiB1c2VkIEdlcm1hbiBkYXlsaWdodC1zYXZpbmcgcnVsZXMuCisjCisjIFN2YWxiYXJkIGlzIG1vcmUgY29tcGxpY2F0ZWQsIGFzIGl0IHdhcyByYWlkZWQgaW4gQXVndXN0IDE5NDEgYnkgYW4KKyMgQWxsaWVkIHBhcnR5IHRoYXQgZXZhY3VhdGVkIHRoZSBjaXZpbGlhbiBwb3B1bGF0aW9uIHRvIEVuZ2xhbmQgKHNheXMKKyMgPGh0dHA6Ly93d3cuYmFydGxlYnkuY29tLzY1L3N2L1N2YWxiYXJkLmh0bWw+KS4gIFRoZSBTdmFsYmFyZCBGQVEKKyMgPGh0dHA6Ly93d3cuc3ZhbGJhcmQuY29tL1N2YWxiYXJkRkFRLmh0bWw+IHNheXMgdGhhdCB0aGUgR2VybWFucyB3ZXJlCisjIGV4cGVsbGVkIG9uIDE5NDItMDUtMTQuICBIb3dldmVyLCBzbWFsbCBwYXJ0aWVzIG9mIEdlcm1hbnMgZGlkIHJldHVybiwKKyMgYW5kIGFjY29yZGluZyB0byBXaWxoZWxtIERlZ2UncyBib29rICJXYXIgTm9ydGggb2YgODAiICgxOTU0KQorIyA8aHR0cDovL3d3dy51Y2FsZ2FyeS5jYS9Vb2ZDL2RlcGFydG1lbnRzL1VQLzEtNTUyMzgvMS01NTIzOC0xMTAtMi5odG1sPgorIyB0aGUgR2VybWFuIGFybWVkIGZvcmNlcyBhdCB0aGUgU3ZhbGJhcmQgd2VhdGhlciBzdGF0aW9uIGNvZGUtbmFtZWQKKyMgSGF1ZGVnZW4gZGlkIG5vdCBzdXJyZW5kZXIgdG8gdGhlIEFsbGllcyB1bnRpbCBTZXB0ZW1iZXIgMTk0NS4KKyMKKyMgQWxsIHRoZXNlIGV2ZW50cyBwcmVkYXRlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLiAgVW5sZXNzIHdlIGNhbgorIyBjb21lIHVwIHdpdGggbW9yZSBkZWZpbml0aXZlIGluZm8gYWJvdXQgdGhlIHRpbWVrZWVwaW5nIGR1cmluZyB0aGUKKyMgd2FyIHllYXJzIGl0J3MgcHJvYmFibHkgYmVzdCBqdXN0IGRvIGRvIHRoZSBmb2xsb3dpbmcgZm9yIG5vdzoKK0xpbmsJRXVyb3BlL09zbG8JQXJjdGljL0xvbmd5ZWFyYnllbgorCisjIFBvbGFuZAorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJUG9sYW5kCTE5MTgJMTkxOQktCVNlcAkxNgkyOjAwcwkwCS0KK1J1bGUJUG9sYW5kCTE5MTkJb25seQktCUFwcgkxNQkyOjAwcwkxOjAwCVMKK1J1bGUJUG9sYW5kCTE5NDQJb25seQktCUFwcgkgMwkyOjAwcwkxOjAwCVMKKyMgV2hpdG1hbiBnaXZlcyAxOTQ0IE5vdiAzMDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVBvbGFuZAkxOTQ0CW9ubHkJLQlPY3QJIDQJMjowMAkwCS0KKyMgRm9yIDE5NDQtMTk0OCBXaGl0bWFuIGdpdmVzIHRoZSBwcmV2aW91cyBkYXk7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlQb2xhbmQJMTk0NQlvbmx5CS0JQXByCTI5CTA6MDAJMTowMAlTCitSdWxlCVBvbGFuZAkxOTQ1CW9ubHkJLQlOb3YJIDEJMDowMAkwCS0KKyMgRm9yIDE5NDYgb24gdGhlIHNvdXJjZSBpcyBLYXppbWllcnogQm9ya293c2tpLAorIyBUb3J1biBDZW50ZXIgZm9yIEFzdHJvbm9teSwgRGVwdC4gb2YgUmFkaW8gQXN0cm9ub215LCBOaWNvbGF1cyBDb3Blcm5pY3VzIFUuLAorIyA8aHR0cDovL3d3dy5hc3Ryby51bmkudG9ydW4ucGwvfmtiL0FydHlrdWx5L1UtUEEvQ3phczIuaHRtI3R0aF90QWIxPgorIyBUaGFua3MgdG8gUHJ6ZW15c2xhdyBBdWd1c3R5bmlhayAoMjAwNS0wNS0yOCkgZm9yIHRoaXMgcmVmZXJlbmNlLgorIyBIZSBhbHNvIGdpdmVzIHRoZXNlIGZ1cnRoZXIgcmVmZXJlbmNlczoKKyMgTW9uIFBvbCBuciAxMywgcG96IDE2MiAoMTk5NSkgPGh0dHA6Ly93d3cuYWJjLmNvbS5wbC9zZXJ3aXMvbXAvMTk5NS8wMTYyLmh0bT4KKyMgRHJ1ayBuciAyMTgwICgyMDAzKSA8aHR0cDovL3d3dy5zZW5hdC5nb3YucGwvazUvZG9rL3Nlam0vMDUzLzIxODAucGRmPgorUnVsZQlQb2xhbmQJMTk0Nglvbmx5CS0JQXByCTE0CTA6MDBzCTE6MDAJUworUnVsZQlQb2xhbmQJMTk0Nglvbmx5CS0JT2N0CSA3CTI6MDBzCTAJLQorUnVsZQlQb2xhbmQJMTk0Nwlvbmx5CS0JTWF5CSA0CTI6MDBzCTE6MDAJUworUnVsZQlQb2xhbmQJMTk0NwkxOTQ5CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KK1J1bGUJUG9sYW5kCTE5NDgJb25seQktCUFwcgkxOAkyOjAwcwkxOjAwCVMKK1J1bGUJUG9sYW5kCTE5NDkJb25seQktCUFwcgkxMAkyOjAwcwkxOjAwCVMKK1J1bGUJUG9sYW5kCTE5NTcJb25seQktCUp1bgkgMgkxOjAwcwkxOjAwCVMKK1J1bGUJUG9sYW5kCTE5NTcJMTk1OAktCVNlcAlsYXN0U3VuCTE6MDBzCTAJLQorUnVsZQlQb2xhbmQJMTk1OAlvbmx5CS0JTWFyCTMwCTE6MDBzCTE6MDAJUworUnVsZQlQb2xhbmQJMTk1OQlvbmx5CS0JTWF5CTMxCTE6MDBzCTE6MDAJUworUnVsZQlQb2xhbmQJMTk1OQkxOTYxCS0JT2N0CVN1bj49MQkxOjAwcwkwCS0KK1J1bGUJUG9sYW5kCTE5NjAJb25seQktCUFwcgkgMwkxOjAwcwkxOjAwCVMKK1J1bGUJUG9sYW5kCTE5NjEJMTk2NAktCU1heQlsYXN0U3VuCTE6MDBzCTE6MDAJUworUnVsZQlQb2xhbmQJMTk2MgkxOTY0CS0JU2VwCWxhc3RTdW4JMTowMHMJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9XYXJzYXcJMToyNDowMCAtCUxNVAkxODgwCisJCQkxOjI0OjAwCS0JV01UCTE5MTUgQXVnICA1ICAgIyBXYXJzYXcgTWVhbiBUaW1lCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTggU2VwIDE2IDM6MDAKKwkJCTI6MDAJUG9sYW5kCUVFJXNUCTE5MjIgSnVuCisJCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTQwIEp1biAyMyAyOjAwCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgT2N0CisJCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTc3CisJCQkxOjAwCVctRXVyCUNFJXNUCTE5ODgKKwkJCTE6MDAJRVUJQ0Ulc1QKKworIyBQb3J0dWdhbAorIworIyBGcm9tIFJ1aSBQZWRybyBTYWxndWVpcm8gKDE5OTItMTEtMTIpOgorIyBQb3J0dWdhbCBoYXMgcmVjZW50bHkgKFNlcHRlbWJlciwgMjcpIGNoYW5nZWQgdGltZXpvbmUKKyMgKGZyb20gV0VUIHRvIE1FVCBvciBDRVQpIHRvIGhhcm1vbml6ZSB3aXRoIEVFQy4KKyMKKyMgTWFydGluIEJydWNrbWFubiAoMTk5Ni0wMi0yOSkgcmVwb3J0cyB2aWEgUGV0ZXIgSWxpZXZlCisjIHRoYXQgUG9ydHVnYWwgaXMgcmV2ZXJ0aW5nIHRvIDA6MDAgYnkgbm90IG1vdmluZyBpdHMgY2xvY2tzIHRoaXMgc3ByaW5nLgorIyBUaGUgbmV3IFByaW1lIE1pbmlzdGVyIHdhcyBmZWQgdXAgd2l0aCBnZXR0aW5nIHVwIGluIHRoZSBkYXJrIGluIHRoZSB3aW50ZXIuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMTEtMTIpOgorIyBJQVRBIFNTSU0gKDE5OTEtMDkpIHJlcG9ydHMgc2V2ZXJhbCAxOTkxLTA5IGFuZCAxOTkyLTA5IHRyYW5zaXRpb25zCisjIGF0IDAyOjAwdSwgbm90IDAxOjAwdS4gIEFzc3VtZSB0aGF0IHRoZXNlIGFyZSB0eXBvcy4KKyMgSUFUQSBTU0lNICgxOTkxLzE5OTIpIHJlcG9ydHMgdGhhdCB0aGUgQXpvcmVzIHdlcmUgYXQgLTE6MDAuCisjIElBVEEgU1NJTSAoMTk5My0wMikgc2F5cyArMDowMDsgbGF0ZXIgaXNzdWVzICh0aHJvdWdoIDE5OTYtMDkpIHNheSAtMTowMC4KKyMgR3Vlc3MgdGhhdCB0aGUgQXpvcmVzIGNoYW5nZWQgdG8gRVUgcnVsZXMgaW4gMTk5MiAoc2luY2UgdGhhdCdzIHdoZW4gUG9ydHVnYWwKKyMgaGFybW9uaXplZCB3aXRoIHRoZSBFVSksIGFuZCB0aGF0IHRoZXkgc3RheWVkICswOjAwIHRoYXQgd2ludGVyLgorIworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKKyMgRFNIIHdyaXRlcyB0aGF0IGRlc3BpdGUgRGVjcmVlIDEsNDY5ICgxOTE1KSwgdGhlIGNoYW5nZSB0byB0aGUgY2xvY2tzIHdhcyBub3QKKyMgZG9uZSBldmVyeSB5ZWFyLCBkZXBlbmRpbmcgb24gd2hhdCBTcGFpbiBkaWQsIGJlY2F1c2Ugb2YgcmFpbHJvYWQgc2NoZWR1bGVzLgorIyBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJUG9ydAkxOTE2CW9ubHkJLQlKdW4JMTcJMjM6MDAJMTowMAlTCisjIFdoaXRtYW4gZ2l2ZXMgMTkxNiBPY3QgMzE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlQb3J0CTE5MTYJb25seQktCU5vdgkgMQkgMTowMAkwCS0KK1J1bGUJUG9ydAkxOTE3CW9ubHkJLQlGZWIJMjgJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MTcJMTkyMQktCU9jdAkxNAkyMzowMHMJMAktCitSdWxlCVBvcnQJMTkxOAlvbmx5CS0JTWFyCSAxCTIzOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTE5CW9ubHkJLQlGZWIJMjgJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MjAJb25seQktCUZlYgkyOQkyMzowMHMJMTowMAlTCitSdWxlCVBvcnQJMTkyMQlvbmx5CS0JRmViCTI4CTIzOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTI0CW9ubHkJLQlBcHIJMTYJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MjQJb25seQktCU9jdAkxNAkyMzowMHMJMAktCitSdWxlCVBvcnQJMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTI2CTE5MjkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KK1J1bGUJUG9ydAkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MjgJb25seQktCUFwcgkxNAkyMzowMHMJMTowMAlTCitSdWxlCVBvcnQJMTkyOQlvbmx5CS0JQXByCTIwCTIzOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTMxCW9ubHkJLQlBcHIJMTgJMjM6MDBzCTE6MDAJUworIyBXaGl0bWFuIGdpdmVzIDE5MzEgT2N0IDg7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlQb3J0CTE5MzEJMTkzMgktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQorUnVsZQlQb3J0CTE5MzIJb25seQktCUFwcgkgMgkyMzowMHMJMTowMAlTCitSdWxlCVBvcnQJMTkzNAlvbmx5CS0JQXByCSA3CTIzOjAwcwkxOjAwCVMKKyMgV2hpdG1hbiBnaXZlcyAxOTM0IE9jdCA1OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJUG9ydAkxOTM0CTE5MzgJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KKyMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMTkzNSBBcHIgMzA7IGdvIHdpdGggV2hpdG1hbi4KK1J1bGUJUG9ydAkxOTM1CW9ubHkJLQlNYXIJMzAJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MzYJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCisjIFdoaXRtYW4gZ2l2ZXMgMTkzNyBBcHIgMjsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVBvcnQJMTkzNwlvbmx5CS0JQXByCSAzCTIzOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTM4CW9ubHkJLQlNYXIJMjYJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5MzkJb25seQktCUFwcgkxNQkyMzowMHMJMTowMAlTCisjIFdoaXRtYW4gZ2l2ZXMgMTkzOSBPY3QgNzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVBvcnQJMTkzOQlvbmx5CS0JTm92CTE4CTIzOjAwcwkwCS0KK1J1bGUJUG9ydAkxOTQwCW9ubHkJLQlGZWIJMjQJMjM6MDBzCTE6MDAJUworIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTQwIE9jdCA3OyBnbyB3aXRoIFdoaXRtYW4uCitSdWxlCVBvcnQJMTk0MAkxOTQxCS0JT2N0CSA1CTIzOjAwcwkwCS0KK1J1bGUJUG9ydAkxOTQxCW9ubHkJLQlBcHIJIDUJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5NDIJMTk0NQktCU1hcglTYXQ+PTgJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5NDIJb25seQktCUFwcgkyNQkyMjowMHMJMjowMAlNICMgTWlkc3VtbWVyCitSdWxlCVBvcnQJMTk0Mglvbmx5CS0JQXVnCTE1CTIyOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTQyCTE5NDUJLQlPY3QJU2F0Pj0yNAkyMzowMHMJMAktCitSdWxlCVBvcnQJMTk0Mwlvbmx5CS0JQXByCTE3CTIyOjAwcwkyOjAwCU0KK1J1bGUJUG9ydAkxOTQzCTE5NDUJLQlBdWcJU2F0Pj0yNQkyMjowMHMJMTowMAlTCitSdWxlCVBvcnQJMTk0NAkxOTQ1CS0JQXByCVNhdD49MjEJMjI6MDBzCTI6MDAJTQorUnVsZQlQb3J0CTE5NDYJb25seQktCUFwcglTYXQ+PTEJMjM6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5NDYJb25seQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQorUnVsZQlQb3J0CTE5NDcJMTk0OQktCUFwcglTdW4+PTEJIDI6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5NDcJMTk0OQktCU9jdAlTdW4+PTEJIDI6MDBzCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IERTVCB3YXMgb2JzZXJ2ZWQgaW4gMTk1MDsgZ28gd2l0aCBXaGl0bWFuLgorIyBXaGl0bWFuIGdpdmVzIE9jdCBsYXN0U3VuIGZvciAxOTUyIG9uOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJUG9ydAkxOTUxCTE5NjUJLQlBcHIJU3VuPj0xCSAyOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTUxCTE5NjUJLQlPY3QJU3VuPj0xCSAyOjAwcwkwCS0KK1J1bGUJUG9ydAkxOTc3CW9ubHkJLQlNYXIJMjcJIDA6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5NzcJb25seQktCVNlcAkyNQkgMDowMHMJMAktCitSdWxlCVBvcnQJMTk3OAkxOTc5CS0JQXByCVN1bj49MQkgMDowMHMJMTowMAlTCitSdWxlCVBvcnQJMTk3OAlvbmx5CS0JT2N0CSAxCSAwOjAwcwkwCS0KK1J1bGUJUG9ydAkxOTc5CTE5ODIJLQlTZXAJbGFzdFN1bgkgMTowMHMJMAktCitSdWxlCVBvcnQJMTk4MAlvbmx5CS0JTWFyCWxhc3RTdW4JIDA6MDBzCTE6MDAJUworUnVsZQlQb3J0CTE5ODEJMTk4MgktCU1hcglsYXN0U3VuCSAxOjAwcwkxOjAwCVMKK1J1bGUJUG9ydAkxOTgzCW9ubHkJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIHRyYW5zaXRpb24gZnJvbSBMTVQgdG8gV0VUIG9jY3VycmVkIDE5MTEtMDUtMjQ7CisjIFdpbGxldHQgc2F5cyAxOTEyLTAxLTAxLiAgR28gd2l0aCBXaWxsZXR0LgorWm9uZQlFdXJvcGUvTGlzYm9uCS0wOjM2OjMyIC0JTE1UCTE4ODQKKwkJCS0wOjM2OjMyIC0JTE1UCTE5MTIgSmFuICAxICAjIExpc2JvbiBNZWFuIFRpbWUKKwkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk2NiBBcHIgIDMgMjowMAorCQkJIDE6MDAJLQlDRVQJMTk3NiBTZXAgMjYgMTowMAorCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTgzIFNlcCAyNSAxOjAwcworCQkJIDA6MDAJVy1FdXIJV0Ulc1QJMTk5MiBTZXAgMjcgMTowMHMKKwkJCSAxOjAwCUVVCUNFJXNUCTE5OTYgTWFyIDMxIDE6MDB1CisJCQkgMDowMAlFVQlXRSVzVAorWm9uZSBBdGxhbnRpYy9Bem9yZXMJLTE6NDI6NDAgLQlMTVQJMTg4NAkJIyBQb250YSBEZWxnYWRhCisJCQktMTo1NDozMiAtCUhNVAkxOTExIE1heSAyNCAgIyBIb3J0YSBNZWFuIFRpbWUKKwkJCS0yOjAwCVBvcnQJQVpPJXNUCTE5NjYgQXByICAzIDI6MDAgIyBBem9yZXMgVGltZQorCQkJLTE6MDAJUG9ydAlBWk8lc1QJMTk4MyBTZXAgMjUgMTowMHMKKwkJCS0xOjAwCVctRXVyCUFaTyVzVAkxOTkyIFNlcCAyNyAxOjAwcworCQkJIDA6MDAJRVUJV0Ulc1QJMTk5MyBNYXIgMjggMTowMHUKKwkJCS0xOjAwCUVVCUFaTyVzVAorWm9uZSBBdGxhbnRpYy9NYWRlaXJhCS0xOjA3OjM2IC0JTE1UCTE4ODQJCSMgRnVuY2hhbAorCQkJLTE6MDc6MzYgLQlGTVQJMTkxMSBNYXkgMjQgICMgRnVuY2hhbCBNZWFuIFRpbWUKKwkJCS0xOjAwCVBvcnQJTUFEJXNUCTE5NjYgQXByICAzIDI6MDAgIyBNYWRlaXJhIFRpbWUKKwkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk4MyBTZXAgMjUgMTowMHMKKwkJCSAwOjAwCUVVCVdFJXNUCisKKyMgUm9tYW5pYQorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTA3KToKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaW5lb2Nsb2NrLnJvL1BPTC8xNzc4cG9sLmh0bWwiPgorIyBOaW5lIE8nY2xvY2s8L2E+ICgxOTk4LTEwLTIzKSByZXBvcnRzIHRoYXQgdGhlIHN3aXRjaCBvY2N1cnJlZCBhdAorIyAwNDowMCBsb2NhbCB0aW1lIGluIGZhbGwgMTk5OC4gIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLAorIyBhc3N1bWUgdGhhdCBSb21hbmlhIGFuZCBNb2xkb3ZhIHN3aXRjaGVkIHRvIEVVIHJ1bGVzIGluIDE5OTcsCisjIHRoZSBzYW1lIHllYXIgYXMgQnVsZ2FyaWEuCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlSb21hbmlhCTE5MzIJb25seQktCU1heQkyMQkgMDowMHMJMTowMAlTCitSdWxlCVJvbWFuaWEJMTkzMgkxOTM5CS0JT2N0CVN1bj49MQkgMDowMHMJMAktCitSdWxlCVJvbWFuaWEJMTkzMwkxOTM5CS0JQXByCVN1bj49MgkgMDowMHMJMTowMAlTCitSdWxlCVJvbWFuaWEJMTk3OQlvbmx5CS0JTWF5CTI3CSAwOjAwCTE6MDAJUworUnVsZQlSb21hbmlhCTE5NzkJb25seQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQorUnVsZQlSb21hbmlhCTE5ODAJb25seQktCUFwcgkgNQkyMzowMAkxOjAwCVMKK1J1bGUJUm9tYW5pYQkxOTgwCW9ubHkJLQlTZXAJbGFzdFN1bgkgMTowMAkwCS0KK1J1bGUJUm9tYW5pYQkxOTkxCTE5OTMJLQlNYXIJbGFzdFN1bgkgMDowMHMJMTowMAlTCitSdWxlCVJvbWFuaWEJMTk5MQkxOTkzCS0JU2VwCWxhc3RTdW4JIDA6MDBzCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBFdXJvcGUvQnVjaGFyZXN0CTE6NDQ6MjQgLQlMTVQJMTg5MSBPY3QKKwkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQJIyBCdWNoYXJlc3QgTVQKKwkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTgxIE1hciAyOSAyOjAwcworCQkJMjowMAlDLUV1cglFRSVzVAkxOTkxCisJCQkyOjAwCVJvbWFuaWEJRUUlc1QJMTk5NAorCQkJMjowMAlFLUV1cglFRSVzVAkxOTk3CisJCQkyOjAwCUVVCUVFJXNUCisKKyMgUnVzc2lhCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEV4Y2VwdCBmb3IgTW9zY293IGFmdGVyIDE5MTktMDctMDEsIEkgaW52ZW50ZWQgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zLgorIyBNb3Njb3cgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgYWZ0ZXIgMTkxOS0wNy0wMSwgYW5kIE1vc2NvdyBydWxlcyBhZnRlciAxOTkxLAorIyBhcmUgZnJvbSBBbmRyZXkgQS4gQ2hlcm5vdi4gIFRoZSByZXN0IGlzIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLAorIyBleGNlcHQgd2UgZm9sbG93IENoZXJub3YncyByZXBvcnQgdGhhdCAxOTkyIERTVCB0cmFuc2l0aW9ucyB3ZXJlIFNhdAorIyAyMzowMCwgbm90IFN1biAwMjowMHMuCisjCisjIEZyb20gU3RhbmlzbGF3IEEuIEt1emlrb3dza2kgKDE5OTQtMDYtMjkpOgorIyBCdXQgbm93IGl0IGlzIHNvbWUgbW9udGhzIHNpbmNlIE5vdm9zaWJpcnNrIGlzIDMgaG91cnMgYWhlYWQgb2YgTW9zY293IQorIyBJIGRvIG5vdCBrbm93IHdoeSB0aGV5IGhhdmUgZGVjaWRlZCB0byBtYWtlIHRoaXMgY2hhbmdlOworIyBhcyBmYXIgYXMgSSByZW1lbWJlciBpdCB3YXMgZG9uZSBleGFjdGx5IGR1cmluZyB3aW50ZXItPnN1bW1lciBzd2l0Y2hpbmcKKyMgc28gd2UgKE5vdm9zaWJpcnNrKSBzaW1wbHkgZGlkIG5vdCBzd2l0Y2guCisjCisjIEZyb20gQW5kcmV5IEEuIENoZXJub3YgKDE5OTYtMTAtMDQpOgorIyBgTVNLJyBhbmQgYE1TRCcgd2VyZSBib3JuIGFuZCB1c2VkIGluaXRpYWxseSBvbiBNb3Njb3cgY29tcHV0ZXJzIHdpdGgKKyMgVU5JWC1saWtlIE9TZXMgYnkgc2V2ZXJhbCBkZXZlbG9wZXIgZ3JvdXBzIChlLmcuIERlbW9zIGdyb3VwLCBLaWFlIGdyb3VwKS4uLi4KKyMgVGhlIG5leHQgc3RlcCB3YXMgdGhlIFVVQ1AgbmV0d29yaywgdGhlIFJlbGNvbSBwcmVkZWNlc3NvcgorIyAodXNlZCBtYWlubHkgZm9yIG1haWwpLCBhbmQgTVNLL01TRCB3YXMgYWN0aXZlbHkgdXNlZCB0aGVyZS4KKyMKKyMgRnJvbSBDaHJpcyBDYXJyaWVyICgxOTk2LTEwLTMwKToKKyMgQWNjb3JkaW5nIHRvIGEgZnJpZW5kIG9mIG1pbmUgd2hvIHJvZGUgdGhlIFRyYW5zLVNpYmVyaWFuIFJhaWxyb2FkIGZyb20KKyMgTW9zY293IHRvIElya3V0c2sgaW4gMTk5NSwgcHVibGljIGFpciBhbmQgcmFpbCB0cmFuc3BvcnQgaW4gUnVzc2lhIC4uLgorIyBzdGlsbCBmb2xsb3dzIE1vc2NvdyB0aW1lLCBubyBtYXR0ZXIgd2hlcmUgaW4gUnVzc2lhIGl0IGlzIGxvY2F0ZWQuCisjCisjIEZvciBHcm96bnksIENoZWNobnlhLCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgc3RvcnkgZnJvbQorIyBKb2huIERhbmlzemV3c2tpLCAiU2NhdmVuZ2VycyBpbiB0aGUgUnViYmxlIiwgTG9zIEFuZ2VsZXMgVGltZXMgKDIwMDEtMDItMDcpOgorIyBOZXdzLS1vZnRlbiBmYWxzZS0taXMgc3ByZWFkIGJ5IHdvcmQgb2YgbW91dGguICBBIHJ1bW9yIHRoYXQgaXQgd2FzCisjIHRpbWUgdG8gbW92ZSB0aGUgY2xvY2tzIGJhY2sgcHV0IHRoaXMgd2hvbGUgY2l0eSBvdXQgb2Ygc3luYyB3aXRoCisjIHRoZSByZXN0IG9mIFJ1c3NpYSBmb3IgdHdvIHdlZWtzLS1ldmVuIHNvbGRpZXJzIHN0YXRpb25lZCBoZXJlIGJlZ2FuCisjIGVuZm9yY2luZyBjdXJmZXcgYXQgdGhlIHdyb25nIHRpbWUuCisjCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDYtMDUpOgorIyBUaGVyZSdzIGNvbnNpZGVyYWJsZSBldmlkZW5jZSB0aGF0IFNha2hhbGluIElzbGFuZCB1c2VkIHRvIGJlIGluCisjIFVUQysxMSwgYW5kIGhhcyBjaGFuZ2VkIHRvIFVUQysxMCwgaW4gdGhpcyBkZWNhZGUuICBJIHN0YXJ0IHdpdGggdGhlCisjIFNTSU0sIHdoaWNoIGxpc3RlZCBZdXpobm8tU2FraGFsaW5zayBpbiB6b25lIFJVMTAgYWxvbmcgd2l0aCBNYWdhZGFuCisjIHVudGlsIEZlYnJ1YXJ5IDE5OTcsIGFuZCB0aGVuIGluIFJVOSB3aXRoIEtoYWJhcm92c2sgYW5kIFZsYWRpdm9zdG9rCisjIHNpbmNlIFNlcHRlbWJlciAxOTk3Li4uLiAgQWx0aG91Z2ggdGhlIEt1cmlsIElzbGFuZHMgYXJlCisjIGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBTYWtoYWxpbiBvYmxhc3QnLCB0aGV5IGFwcGVhciB0byBoYXZlCisjIHJlbWFpbmVkIG9uIFVUQysxMSBhbG9uZyB3aXRoIE1hZ2FkYW4uCisjCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjCisjIEthbGluaW5ncmFkc2theWEgb2JsYXN0Jy4KK1pvbmUgRXVyb3BlL0thbGluaW5ncmFkCSAxOjIyOjAwIC0JTE1UCTE4OTMgQXByCisJCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1CisJCQkgMjowMAlQb2xhbmQJQ0Ulc1QJMTk0NgorCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCSAyOjAwCVJ1c3NpYQlFRSVzVAorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBSZXNwdWJsaWthIEFkeWdleWEsIEFya2hhbmdlbCdza2F5YSBvYmxhc3QnLAorIyBCZWxnb3JvZHNrYXlhIG9ibGFzdCcsIEJyeWFuc2theWEgb2JsYXN0JywgVmxhZGltaXJza2F5YSBvYmxhc3QnLAorIyBWb2xvZ29kc2theWEgb2JsYXN0JywgVm9yb25lemhza2F5YSBvYmxhc3QnLAorIyBSZXNwdWJsaWthIERhZ2VzdGFuLCBJdmFub3Zza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIEluZ3VzaGV0aXlhLAorIyBLYWJhcmJpbm8tQmFsa2Fyc2theWEgUmVzcHVibGlrYSwgUmVzcHVibGlrYSBLYWxteWtpeWEsCisjIEthbHl6aHNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgS2FyYWNoYWV2by1DaGVya2Vzc2l5YSwKKyMgUmVzcHVibGlrYSBLYXJlbGl5YSwgUmVzcHVibGlrYSBLb21pLAorIyBLb3N0cm9tc2theWEgb2JsYXN0JywgS3Jhc25vZGFyc2tpaiBrcmFqLCBLdXJza2F5YSBvYmxhc3QnLAorIyBMZW5pbmdyYWRza2F5YSBvYmxhc3QnLCBMaXBldHNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgTWFyaWogRWwsCisjIFJlc3B1Ymxpa2EgTW9yZG92aXlhLCBNb3NrdmEsIE1vc2tvdnNrYXlhIG9ibGFzdCcsCisjIE11cm1hbnNrYXlhIG9ibGFzdCcsIE5lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLAorIyBOaXpoZWdvcm9kc2theWEgb2JsYXN0JywgTm92Z29yb2Rza2F5YSBvYmxhc3QnLCBPcmxvdnNrYXlhIG9ibGFzdCcsCisjIFBlbnplbnNrYXlhIG9ibGFzdCcsIFBza292c2theWEgb2JsYXN0JywgUm9zdG92c2theWEgb2JsYXN0JywKKyMgUnlhemFuc2theWEgb2JsYXN0JywgU2Fua3QtUGV0ZXJidXJnLAorIyBSZXNwdWJsaWthIFNldmVybmF5YSBPc2V0aXlhLCBTbW9sZW5za2F5YSBvYmxhc3QnLAorIyBTdGF2cm9wb2wnc2tpaiBrcmFqLCBUYW1ib3Zza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIFRhdGFyc3RhbiwKKyMgVHZlcnNrYXlhIG9ibGFzdCcsIFR5bCdza2F5YSBvYmxhc3QnLCBVbCd5YW5vdnNrYXlhIG9ibGFzdCcsCisjIENoZWNoZW5za2F5YSBSZXNwdWJsaWthLCBDaHV2YXNoc2theWEgb2JsYXN0JywKKyMgWWFyb3NsYXZza2F5YSBvYmxhc3QnCitab25lIEV1cm9wZS9Nb3Njb3cJIDI6MzA6MjAgLQlMTVQJMTg4MAorCQkJIDI6MzAJLQlNTVQJMTkxNiBKdWwgIDMgIyBNb3Njb3cgTWVhbiBUaW1lCisJCQkgMjozMDo0OCBSdXNzaWEJJXMJMTkxOSBKdWwgIDEgMjowMAorCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTkyMiBPY3QKKwkJCSAyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcworCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAorIworIyBBc3RyYWtoYW5za2F5YSBvYmxhc3QnLCBLaXJvdnNrYXlhIG9ibGFzdCcsIFNhcmF0b3Zza2F5YSBvYmxhc3QnLAorIyBWb2xnb2dyYWRza2F5YSBvYmxhc3QnLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBLaXJvdiBpcyBzdGlsbCBhdCArMDQwMAorIyBidXQgV2lraXBlZGlhICgyMDA2LTA1LTA5KSBzYXlzICswMzAwLiAgUGVyaGFwcyBpdCBzd2l0Y2hlZCBhZnRlciB0aGUKKyMgb3RoZXJzPyAgQnV0IHdlIGhhdmUgbm8gZGF0YS4KK1pvbmUgRXVyb3BlL1ZvbGdvZ3JhZAkgMjo1Nzo0MCAtCUxNVAkxOTIwIEphbiAgMworCQkJIDM6MDAJLQlUU0FUCTE5MjUgQXByICA2ICMgVHNhcml0c3luIFRpbWUKKwkJCSAzOjAwCS0JU1RBVAkxOTMwIEp1biAyMSAjIFN0YWxpbmdyYWQgVGltZQorCQkJIDQ6MDAJLQlTVEFUCTE5NjEgTm92IDExCisJCQkgNDowMAlSdXNzaWEJVk9MJXNUCTE5ODkgTWFyIDI2IDI6MDBzICMgVm9sZ29ncmFkIFQKKwkJCSAzOjAwCVJ1c3NpYQlWT0wlc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCSA0OjAwCS0JVk9MVAkxOTkyIE1hciAyOSAyOjAwcworCQkJIDM6MDAJUnVzc2lhCVZPTCVzVAorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBTYW1hcnNrYXlhIG9ibGFzdCcsIFVkbXlydHNrYXlhIHJlc3B1Ymxpa2EKK1pvbmUgRXVyb3BlL1NhbWFyYQkgMzoyMDozNiAtCUxNVAkxOTE5IEp1bCAgMSAyOjAwCisJCQkgMzowMAktCVNBTVQJMTkzMCBKdW4gMjEKKwkJCSA0OjAwCS0JU0FNVAkxOTM1IEphbiAyNworCQkJIDQ6MDAJUnVzc2lhCUtVWSVzVAkxOTg5IE1hciAyNiAyOjAwcyAjIEt1eWJ5c2hldgorCQkJIDM6MDAJUnVzc2lhCUtVWSVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJIDI6MDAJUnVzc2lhCUtVWSVzVAkxOTkxIFNlcCAyOSAyOjAwcworCQkJIDM6MDAJLQlLVVlUCTE5OTEgT2N0IDIwIDM6MDAKKwkJCSA0OjAwCVJ1c3NpYQlTQU0lc1QJIyBTYW1hcmEgVGltZQorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBSZXNwdWJsaWthIEJhc2hrb3J0b3N0YW4sIEtvbWktUGVybXlhdHNraWogYXZ0b25vbW55aiBva3J1ZywKKyMgS3VyZ2Fuc2theWEgb2JsYXN0JywgT3JlbmJ1cmdza2F5YSBvYmxhc3QnLCBQZXJtc2theWEgb2JsYXN0JywKKyMgU3ZlcmRsb3Zza2F5YSBvYmxhc3QnLCBUeXVtZW5za2F5YSBvYmxhc3QnLAorIyBLaGFudHktTWFuc2tpanNraWogYXZ0b25vbW55aiBva3J1ZywgQ2hlbHlhYmluc2theWEgb2JsYXN0JywKKyMgWWFtYWxvLU5lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLgorWm9uZSBBc2lhL1lla2F0ZXJpbmJ1cmcJIDQ6MDI6MjQgLQlMTVQJMTkxOSBKdWwgMTUgNDowMAorCQkJIDQ6MDAJLQlTVkVUCTE5MzAgSnVuIDIxICMgU3ZlcmRsb3ZzayBUaW1lCisJCQkgNTowMAlSdXNzaWEJU1ZFJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQkgNDowMAlSdXNzaWEJU1ZFJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkgNTowMAlSdXNzaWEJWUVLJXNUCSMgWWVrYXRlcmluYnVyZyBUaW1lCisjCisjIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCisjIFJlc3B1Ymxpa2EgQWx0YWosIEFsdGFqc2tpaiBrcmFqLCBPbXNrYXlhIG9ibGFzdCcuCitab25lIEFzaWEvT21zawkJIDQ6NTM6MzYgLQlMTVQJMTkxOSBOb3YgMTQKKwkJCSA1OjAwCS0JT01TVAkxOTMwIEp1biAyMSAjIE9tc2sgVEltZQorCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJIDU6MDAJUnVzc2lhCU9NUyVzVAkxOTkyIEphbiAxOSAyOjAwcworCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA4LTE5KTogSSdtIGd1ZXNzaW5nIGFib3V0IFRvbXNrIGhlcmU7IGl0J3MKKyMgbm90IGNsZWFyIHdoZW4gaXQgc3dpdGNoZWQgZnJvbSArNyB0byArNi4KKyMgTm92b3NpYmlyc2theWEgb2JsYXN0JywgVG9tc2theWEgb2JsYXN0Jy4KK1pvbmUgQXNpYS9Ob3Zvc2liaXJzawkgNTozMTo0MCAtCUxNVAkxOTE5IERlYyAxNCA2OjAwCisJCQkgNjowMAktCU5PVlQJMTkzMCBKdW4gMjEgIyBOb3Zvc2liaXJzayBUaW1lCisJCQkgNzowMAlSdXNzaWEJTk9WJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJTk9WJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkgNzowMAlSdXNzaWEJTk9WJXNUCTE5OTMgTWF5IDIzICMgc2F5IFNoYW5rcyAmIFAuCisJCQkgNjowMAlSdXNzaWEJTk9WJXNUCisKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMTAtMTMpOgorIyBLZW1lcm92byBvYmxhc3QnIChLZW1lcm92byByZWdpb24pIGluIFJ1c3NpYSB3aWxsIGNoYW5nZSBjdXJyZW50IHRpbWUgem9uZSBvbgorIyBNYXJjaCAyOCwgMjAxMDoKKyMgZnJvbSBjdXJyZW50IFJ1c3NpYSBab25lIDYgLSBLcmFzbm95YXJzayBUaW1lIFpvbmUgKEtSQSkgVVRDICswNzAwCisjIHRvIFJ1c3NpYSBab25lIDUgLSBOb3Zvc2liaXJzayBUaW1lIFpvbmUgKE5PVikgVVRDICswNjAwCisjCisjIFRoaXMgaXMgYWNjb3JkaW5nIHRvIEdvdmVybm1lbnQgb2YgUnVzc2lhIGRlY3JlZSAjIDc0MCwgb24gU2VwdGVtYmVyCisjIDE0LCAyMDA5ICJBcHBsaWNhdGlvbiBpbiB0aGUgdGVycml0b3J5IG9mIHRoZSBLZW1lcm92byByZWdpb24gdGhlIEZpZnRoCisjIHRpbWUgem9uZS4iICgiUnVzc2lhIFpvbmUgNSIgb3Igb2xkICJVU1NSIFpvbmUgNSIgaXMgR01UICswNjAwKQorIworIyBSdXNzaWFuIEdvdmVybm1lbnQgd2ViIHNpdGUgKFJ1c3NpYW4gbGFuZ3VhZ2UpCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292ZXJubWVudC5ydS9jb250ZW50L2dvdmVybm1lbnRhY3Rpdml0eS9yZmdvdmVybm1lbnRkZWNpc2lvbnMvYXJjaGl2Ij4KKyMgaHR0cDovL3d3dy5nb3Zlcm5tZW50LnJ1L2NvbnRlbnQvZ292ZXJubWVudGFjdGl2aXR5L3JmZ292ZXJubWVudGRlY2lzaW9ucy9hcmNoaXZlLzIwMDkvMDkvMTQvOTkxNjMzLmh0bQorIyA8L2E+CisjIG9yIFJ1c3NpYW4tRW5nbGlzaCB0cmFuc2xhdGlvbiBieSBXb3JsZFRpbWVab25lLmNvbSB3aXRoIHJlZmVyZW5jZQorIyBtYXAgdG8gbG9jYWwgcmVnaW9uIGFuZCBuZXcgUnVzc2lhIFRpbWUgWm9uZSBtYXAgYWZ0ZXIgTWFyY2ggMjgsIDIwMTAKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEwMy5odG1sIj4KKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEwMy5odG1sCisjIDwvYT4KKyMKKyMgVGh1cywgd2hlbiBSdXNzaWEgd2lsbCBzd2l0Y2ggdG8gRFNUIG9uIHRoZSBuaWdodCBvZiBNYXJjaCAyOCwgMjAxMAorIyBLZW1lcm92byByZWdpb24gKEtlbWVyb3ZvIG9ibGFzdCcpIHdpbGwgbm90IGNoYW5nZSB0aGUgY2xvY2suCisjCisjIEFzIGEgcmVzdWx0LCBLZW1lcm92byBvYmxhc3QnIHdpbGwgYmUgaW4gdGhlIHNhbWUgdGltZSB6b25lIGFzCisjIE5vdm9zaWJpcnNrLCBPbXNrLCBUb21zaywgQmFybmF1bCBhbmQgQWx0YWkgUmVwdWJsaWMuCisKK1pvbmUgQXNpYS9Ob3Zva3V6bmV0c2sJIDU6NDg6NDggLQlOTVQJMTkyMCBKYW4gIDYKKwkJCSA2OjAwCS0JS1JBVAkxOTMwIEp1biAyMSAjIEtyYXNub3lhcnNrIFRpbWUKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMjAxMCBNYXIgMjggMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QgIyBOb3Zvc2liaXJzay9Ob3Zva3V6bmV0c2sgVGltZQorCisjCisjIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCisjIEtyYXNub3lhcnNraWoga3JhaiwKKyMgVGFqbXlyc2tpaiAoRG9sZ2Fuby1OZW5ldHNraWopIGF2dG9ub21ueWogb2tydWcsCisjIFJlc3B1Ymxpa2EgVHV2YSwgUmVzcHVibGlrYSBLaGFrYXNpeWEsIEV2ZW5raWpza2lqIGF2dG9ub21ueWogb2tydWcuCitab25lIEFzaWEvS3Jhc25veWFyc2sJIDY6MTE6MjAgLQlMTVQJMTkyMCBKYW4gIDYKKwkJCSA2OjAwCS0JS1JBVAkxOTMwIEp1biAyMSAjIEtyYXNub3lhcnNrIFRpbWUKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QKKyMKKyMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KKyMgUmVzcHVibGlrYSBCdXJ5YXRpeWEsIElya3V0c2theWEgb2JsYXN0JywKKyMgVXN0Jy1PcmR5bnNraWogQnVyeWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLgorWm9uZSBBc2lhL0lya3V0c2sJIDY6NTc6MjAgLQlMTVQJMTg4MAorCQkJIDY6NTc6MjAgLQlJTVQJMTkyMCBKYW4gMjUgIyBJcmt1dHNrIE1lYW4gVGltZQorCQkJIDc6MDAJLQlJUktUCTE5MzAgSnVuIDIxICMgSXJrdXRzayBUaW1lCisJCQkgODowMAlSdXNzaWEJSVJLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQkgNzowMAlSdXNzaWEJSVJLJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkgODowMAlSdXNzaWEJSVJLJXNUCisjCisjIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCisjIEFnaW5za2lqIEJ1cnlhdHNraWogYXZ0b25vbW55aiBva3J1ZywgQW11cnNrYXlhIG9ibGFzdCcsCisjIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLCBDaGl0aW5za2F5YSBvYmxhc3QnLgorIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogQWxkYW5za2lqLCBBbWdpbnNraWosIEFuYWJhcnNraWosCisjIEJ1bHVuc2tpaiwgVmVya2huZWtvbHltc2tpaiwgVmVya2huZXZpbHl1anNraWosIFZpbHl1anNraWosIEdvcm55aiwKKyMgWmhpZ2Fuc2tpaiwgS29ieWFqc2tpaiwgTGVuc2tpaiwgTWVnaW5vLUthbmdhbGFzc2tpaiwgTWlybmluc2tpaiwKKyMgTmFtc2tpaiwgTnl1cmJpbnNraWosIE9sZW5la3NraWosIE9sZWttaW5za2lqLCBTcmVkbmVrb2x5bXNraWosCisjIFN1bnRhcnNraWosIFRhdHRpbnNraWosIFVzdCctQWxkYW5za2lqLCBLaGFuZ2FsYXNza2lqLAorIyBDaHVyYXBjaGluc2tpaiwgRXZlbm8tQnl0YW50YWpza2lqLgorWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NDAgLQlMTVQJMTkxOSBEZWMgMTUKKwkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQorCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBFdnJlanNrYXlhIGF2dG9ub21uYXlhIG9ibGFzdCcsIEtoYWJhcm92c2tpaiBrcmFqLCBQcmltb3Jza2lqIGtyYWosCisjIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgorIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogVmVya2hveWFuc2tpaiwgVG9tcG9uc2tpaiwgVXN0Jy1NYWpza2lqLAorIyBVc3QnLVlhbnNraWouCitab25lIEFzaWEvVmxhZGl2b3N0b2sJIDg6NDc6NDQgLQlMTVQJMTkyMiBOb3YgMTUKKwkJCSA5OjAwCS0JVkxBVAkxOTMwIEp1biAyMSAjIFZsYWRpdm9zdG9rIFRpbWUKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCSA5OjAwCVJ1c3NpYQlWTEElc1NUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkxMDowMAlSdXNzaWEJVkxBJXNUCisjCisjIFNha2hhbGluc2theWEgb2JsYXN0Jy4KKyMgVGhlIFpvbmUgbmFtZSBzaG91bGQgYmUgWXV6aG5vLVNha2hhbGluc2ssIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCitab25lIEFzaWEvU2FraGFsaW4JIDk6MzA6NDggLQlMTVQJMTkwNSBBdWcgMjMKKwkJCSA5OjAwCS0JQ0pUCTE5MzgKKwkJCSA5OjAwCS0JSlNUCTE5NDUgQXVnIDI1CisJCQkxMTowMAlSdXNzaWEJU0FLJXNUCTE5OTEgTWFyIDMxIDI6MDBzICMgU2FraGFsaW4gVC4KKwkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMTk5MiBKYW4gMTkgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5NyBNYXIgbGFzdFN1biAyOjAwcworCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBNYWdhZGFuc2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgorIyBQcm9iYWJseSBhbHNvOiBLdXJpbCBJc2xhbmRzLgorIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogQWJ5anNraWosIEFsbGFpa2hvdnNraWosIE1vbXNraWosCisjIE5pemhuZWtvbHltc2tpaiwgT2pteWFrb25za2lqLgorWm9uZSBBc2lhL01hZ2FkYW4JMTA6MDM6MTIgLQlMTVQJMTkyNCBNYXkgIDIKKwkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQorCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAorIworIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQorIyBLYW1jaGF0c2theWEgb2JsYXN0JywgS29yeWFrc2tpaiBhdnRvbm9tbnlqIG9rcnVnLgorIworIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNraSwgYnV0IHRoYXQncyB0b28gbG9uZy4KK1pvbmUgQXNpYS9LYW1jaGF0a2EJMTA6MzQ6MzYgLQlMTVQJMTkyMiBOb3YgMTAKKwkJCTExOjAwCS0JUEVUVAkxOTMwIEp1biAyMSAjIFAtSyBUaW1lCisJCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJUEVUJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkxMjowMAlSdXNzaWEJUEVUJXNUCisjCisjIENodWtvdHNraWogYXZ0b25vbW55aiBva3J1ZworWm9uZSBBc2lhL0FuYWR5cgkxMTo0OTo1NiAtCUxNVAkxOTI0IE1heSAgMgorCQkJMTI6MDAJLQlBTkFUCTE5MzAgSnVuIDIxICMgQW5hZHlyIFRpbWUKKwkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgMDowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMTk5MiBKYW4gMTkgMjowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QKKworIyBTZXJiaWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJRXVyb3BlL0JlbGdyYWRlCTE6MjI6MDAJLQlMTVQJMTg4NAorCQkJMTowMAktCUNFVAkxOTQxIEFwciAxOCAyMzowMAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1CisJCQkxOjAwCS0JQ0VUCTE5NDUgTWF5IDggMjowMHMKKwkJCTE6MDAJMTowMAlDRVNUCTE5NDUgU2VwIDE2ICAyOjAwcworIyBNZXRvZCBLb3plbGogcmVwb3J0cyB0aGF0IHRoZSBsZWdhbCBkYXRlIG9mCisjIHRyYW5zaXRpb24gdG8gRVUgcnVsZXMgd2FzIDE5ODItMTEtMjcsIGZvciBhbGwgb2YgWXVnb3NsYXZpYSBhdCB0aGUgdGltZS4KKyMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGdpdmUgYXMgbXVjaCBkZXRhaWwsIHNvIGdvIHdpdGggS296ZWxqLgorCQkJMTowMAktCUNFVAkxOTgyIE5vdiAyNworCQkJMTowMAlFVQlDRSVzVAorTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL0xqdWJsamFuYQkjIFNsb3ZlbmlhCitMaW5rIEV1cm9wZS9CZWxncmFkZSBFdXJvcGUvUG9kZ29yaWNhCSMgTW9udGVuZWdybworTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1NhcmFqZXZvCSMgQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQorTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1Nrb3BqZQkjIE1hY2Vkb25pYQorTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1phZ3JlYgkjIENyb2F0aWEKKworIyBTbG92YWtpYQorTGluayBFdXJvcGUvUHJhZ3VlIEV1cm9wZS9CcmF0aXNsYXZhCisKKyMgU2xvdmVuaWEKKyMgc2VlIFNlcmJpYQorCisjIFNwYWluCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworIyBGb3IgMTkxNy0xOTE5IFdoaXRtYW4gZ2l2ZXMgQXByIFNhdD49MSAtIE9jdCBTYXQ+PTE7CisjIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlTcGFpbgkxOTE3CW9ubHkJLQlNYXkJIDUJMjM6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTE3CTE5MTkJLQlPY3QJIDYJMjM6MDBzCTAJLQorUnVsZQlTcGFpbgkxOTE4CW9ubHkJLQlBcHIJMTUJMjM6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTE5CW9ubHkJLQlBcHIJIDUJMjM6MDBzCTE6MDAJUworIyBXaGl0bWFuIGdpdmVzIDE5MjEgRmViIDI4IC0gT2N0IDE0OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJU3BhaW4JMTkyNAlvbmx5CS0JQXByCTE2CTIzOjAwcwkxOjAwCVMKKyMgV2hpdG1hbiBnaXZlcyAxOTI0IE9jdCAxNDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVNwYWluCTE5MjQJb25seQktCU9jdAkgNAkyMzowMHMJMAktCitSdWxlCVNwYWluCTE5MjYJb25seQktCUFwcgkxNwkyMzowMHMJMTowMAlTCisjIFdoaXRtYW4gc2F5cyBubyBEU1QgaW4gMTkyOTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVNwYWluCTE5MjYJMTkyOQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQorUnVsZQlTcGFpbgkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTI5CW9ubHkJLQlBcHIJMjAJMjM6MDBzCTE6MDAJUworIyBXaGl0bWFuIGdpdmVzIDE5MzcgSnVuIDE2LCAxOTM4IEFwciAxNiwgMTk0MCBBcHIgMTM7CisjIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlTcGFpbgkxOTM3CW9ubHkJLQlNYXkJMjIJMjM6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTM3CTE5MzkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KK1J1bGUJU3BhaW4JMTkzOAlvbmx5CS0JTWFyCTIyCTIzOjAwcwkxOjAwCVMKK1J1bGUJU3BhaW4JMTkzOQlvbmx5CS0JQXByCTE1CTIzOjAwcwkxOjAwCVMKK1J1bGUJU3BhaW4JMTk0MAlvbmx5CS0JTWFyCTE2CTIzOjAwcwkxOjAwCVMKKyMgV2hpdG1hbiBzYXlzIG5vIERTVCAxOTQyLTE5NDU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlNYXkJIDIJMjI6MDBzCTI6MDAJTSAjIE1pZHN1bW1lcgorUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlTZXAJIDEJMjI6MDBzCTE6MDAJUworUnVsZQlTcGFpbgkxOTQzCTE5NDYJLQlBcHIJU2F0Pj0xMwkyMjowMHMJMjowMAlNCitSdWxlCVNwYWluCTE5NDMJb25seQktCU9jdAkgMwkyMjowMHMJMTowMAlTCitSdWxlCVNwYWluCTE5NDQJb25seQktCU9jdAkxMAkyMjowMHMJMTowMAlTCitSdWxlCVNwYWluCTE5NDUJb25seQktCVNlcAkzMAkgMTowMAkxOjAwCVMKK1J1bGUJU3BhaW4JMTk0Nglvbmx5CS0JU2VwCTMwCSAwOjAwCTAJLQorUnVsZQlTcGFpbgkxOTQ5CW9ubHkJLQlBcHIJMzAJMjM6MDAJMTowMAlTCitSdWxlCVNwYWluCTE5NDkJb25seQktCVNlcAkzMAkgMTowMAkwCS0KK1J1bGUJU3BhaW4JMTk3NAkxOTc1CS0JQXByCVNhdD49MTMJMjM6MDAJMTowMAlTCitSdWxlCVNwYWluCTE5NzQJMTk3NQktCU9jdAlTdW4+PTEJIDE6MDAJMAktCitSdWxlCVNwYWluCTE5NzYJb25seQktCU1hcgkyNwkyMzowMAkxOjAwCVMKK1J1bGUJU3BhaW4JMTk3NgkxOTc3CS0JU2VwCWxhc3RTdW4JIDE6MDAJMAktCitSdWxlCVNwYWluCTE5NzcJMTk3OAktCUFwcgkgMgkyMzowMAkxOjAwCVMKK1J1bGUJU3BhaW4JMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQorIyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBjb3BpZWQgZnJvbSBNb3JvY2NvIGZyb20gMTk2NyB0aHJvdWdoIDE5NzguCitSdWxlIFNwYWluQWZyaWNhIDE5NjcJb25seQktCUp1bgkgMwkxMjowMAkxOjAwCVMKK1J1bGUgU3BhaW5BZnJpY2EgMTk2Nwlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQorUnVsZSBTcGFpbkFmcmljYSAxOTc0CW9ubHkJLQlKdW4JMjQJIDA6MDAJMTowMAlTCitSdWxlIFNwYWluQWZyaWNhIDE5NzQJb25seQktCVNlcAkgMQkgMDowMAkwCS0KK1J1bGUgU3BhaW5BZnJpY2EgMTk3NgkxOTc3CS0JTWF5CSAxCSAwOjAwCTE6MDAJUworUnVsZSBTcGFpbkFmcmljYSAxOTc2CW9ubHkJLQlBdWcJIDEJIDA6MDAJMAktCitSdWxlIFNwYWluQWZyaWNhIDE5NzcJb25seQktCVNlcAkyOAkgMDowMAkwCS0KK1J1bGUgU3BhaW5BZnJpY2EgMTk3OAlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUworUnVsZSBTcGFpbkFmcmljYSAxOTc4CW9ubHkJLQlBdWcJIDQJIDA6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUV1cm9wZS9NYWRyaWQJLTA6MTQ6NDQgLQlMTVQJMTkwMSBKYW4gIDEgIDA6MDBzCisJCQkgMDowMAlTcGFpbglXRSVzVAkxOTQ2IFNlcCAzMAorCQkJIDE6MDAJU3BhaW4JQ0Ulc1QJMTk3OQorCQkJIDE6MDAJRVUJQ0Ulc1QKK1pvbmUJQWZyaWNhL0NldXRhCS0wOjIxOjE2IC0JTE1UCTE5MDEKKwkJCSAwOjAwCS0JV0VUCTE5MTggTWF5ICA2IDIzOjAwCisJCQkgMDowMAkxOjAwCVdFU1QJMTkxOCBPY3QgIDcgMjM6MDAKKwkJCSAwOjAwCS0JV0VUCTE5MjQKKwkJCSAwOjAwCVNwYWluCVdFJXNUCTE5MjkKKwkJCSAwOjAwIFNwYWluQWZyaWNhIFdFJXNUIDE5ODQgTWFyIDE2CisJCQkgMTowMAktCUNFVAkxOTg2CisJCQkgMTowMAlFVQlDRSVzVAorWm9uZQlBdGxhbnRpYy9DYW5hcnkJLTE6MDE6MzYgLQlMTVQJMTkyMiBNYXIgIyBMYXMgUGFsbWFzIGRlIEdyYW4gQy4KKwkJCS0xOjAwCS0JQ0FOVAkxOTQ2IFNlcCAzMCAxOjAwICMgQ2FuYXJpZXMgVGltZQorCQkJIDA6MDAJLQlXRVQJMTk4MCBBcHIgIDYgMDowMHMKKwkJCSAwOjAwCTE6MDAJV0VTVAkxOTgwIFNlcCAyOCAwOjAwcworCQkJIDA6MDAJRVUJV0Ulc1QKKyMgSUFUQSBTU0lNICgxOTk2LTA5KSBzYXlzIHRoZSBDYW5hcmllcyBzd2l0Y2ggYXQgMjowMHUsIG5vdCAxOjAwdS4KKyMgSWdub3JlIHRoaXMgZm9yIG5vdywgYXMgdGhlIENhbmFyaWVzIGFyZSBwYXJ0IG9mIHRoZSBFVS4KKworIyBTd2VkZW4KKworIyBGcm9tIEl2YW4gTmlsc3NvbiAoMjAwMS0wNC0xMyksIHN1cGVyc2VkaW5nIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMKKyMgVGhlIGxhdyAiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTg3OCwgbm8gMTQiIGFib3V0IHN0YW5kYXJkIHRpbWUgaW4gMTg3OToKKyMgRnJvbSB0aGUgYmVnaW5uaW5nIG9mIDE4NzkgKHRoYXQgaXMgMDEtMDEgMDA6MDApIHRoZSB0aW1lIGZvciBhbGwKKyMgcGxhY2VzIGluIHRoZSBjb3VudHJ5IGlzICJ0aGUgbWVhbiBzb2xhciB0aW1lIGZvciB0aGUgbWVyaWRpYW4gYXQKKyMgdGhyZWUgZGVncmVlcywgb3IgdHdlbHZlIG1pbnV0ZXMgb2YgdGltZSwgdG8gdGhlIHdlc3Qgb2YgdGhlCisjIG1lcmlkaWFuIG9mIHRoZSBPYnNlcnZhdG9yeSBvZiBTdG9ja2hvbG0iLiAgVGhlIGxhdyBpcyBkYXRlZCAxODc4LTA1LTMxLgorIworIyBUaGUgb2JzZXJ2YXRvcnkgYXQgdGhhdCB0aW1lIGhhZCB0aGUgbWVyaWRpYW4gMTggZGVncmVlcyAwMycgMzAiCisjIGVhc3Rlcm4gbG9uZ2l0dWRlID0gMDE6MTI6MTQgaW4gdGltZS4gIExlc3MgMTIgbWludXRlcyBnaXZlcyB0aGUKKyMgbmF0aW9uYWwgc3RhbmRhcmQgdGltZSBhcyAwMTowMDoxNCBhaGVhZCBvZiBHTVQuLi4uCisjCisjIEFib3V0IHRoZSBiZWdpbm5pbmcgb2YgQ0VUIGluIFN3ZWRlbi4gVGhlIGxhd3RleHQgKCJTdmVuc2sKKyMgZm9yZmF0dG5pbmdzc2FtbGluZyAxODk5LCBubyA0NCIpIHN0YXRlcywgdGhhdCAiZnJvbSB0aGUgYmVnaW5uaW5nCisjIG9mIDE5MDAuLi4gLi4uIHRoZSBzYW1lIGFzIHRoZSBtZWFuIHNvbGFyIHRpbWUgZm9yIHRoZSBtZXJpZGlhbiBhdAorIyB0aGUgZGlzdGFuY2Ugb2Ygb25lIGhvdXIgb2YgdGltZSBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgRW5nbGlzaAorIyBvYnNlcnZhdG9yeSBhdCBHcmVlbndpY2gsIG9yIGF0IDEyIG1pbnV0ZXMgMTQgc2Vjb25kcyB0byB0aGUgd2VzdAorIyBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgT2JzZXJ2YXRvcnkgb2YgU3RvY2tob2xtIi4gVGhlIGxhdyBpcyBkYXRlZAorIyAxODk5LTA2LTE2LiAgSW4gc2hvcnQ6IEF0IDE5MDAtMDEtMDEgMDA6MDA6MDAgdGhlIG5ldyBzdGFuZGFyZCB0aW1lCisjIGluIFN3ZWRlbiBpcyAwMTowMDowMCBhaGVhZCBvZiBHTVQuCisjCisjIDE5MTY6IFRoZSBsYXd0ZXh0ICgiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTkxNiwgbm8gMTI0Iikgc3RhdGVzCisjIHRoYXQgIjE5MTYtMDUtMTUgaXMgY29uc2lkZXJlZCB0byBiZWdpbiBvbmUgaG91ciBlYXJsaWVyIi4gSXQgaXMKKyMgcHJldHR5IG9idmlvdXMgdGhhdCBhdCAwNS0xNCAyMzowMCB0aGUgY2xvY2tzIGFyZSBzZXQgdG8gMDUtMTUgMDA6MDAuLi4uCisjIEZ1cnRoZXIgdGhlIGxhdyBzYXlzLCB0aGF0ICIxOTE2LTA5LTMwIGlzIGNvbnNpZGVyZWQgdG8gZW5kIG9uZSBob3VyIGxhdGVyIi4KKyMKKyMgVGhlIGxhd3MgcmVndWxhdGluZyBbRFNUXSBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzaXRlIG9mIHRoZSBTd2VkaXNoCisjIFBhcmxpYW1lbnQgYmVnaW5uaW5nIHdpdGggMTk4NSAtIHRoZSBsYXdzIHJlZ3VsYXRpbmcgMTk4MC8xOTg0IGFyZQorIyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaXRlICh0byBteSBrbm93bGVkZ2UgdGhleSBhcmUgb25seSBhdmFpbGFibGUKKyMgaW4gU3dlZGlzaCk6IDxodHRwOi8vd3d3LnJpa3NkYWdlbi5zZS9lbmdsaXNoL3dvcmsvc2ZzdC5hc3A+ICh0eXBlCisjICJzb21tYXJ0aWQiIHdpdGhvdXQgdGhlIHF1b3RlcyBpbiB0aGUgZmllbGQgIkZyaXRleHQiIGFuZCB0aGVuIGNsaWNrCisjIHRoZSBTb2stYnV0dG9uKS4KKyMKKyMgKDIwMDEtMDUtMTMpOgorIworIyBJIGhhdmUgbm93IGZvdW5kIGEgbmV3c3BhcGVyIHN0YXRpbmcgdGhhdCBhdCAxOTE2LTEwLTAxIDAxOjAwCisjIHN1bW1lcnRpbWUgdGhlIGNodXJjaC1jbG9ja3MgZXRjIHdlcmUgc2V0IGJhY2sgb25lIGhvdXIgdG8gc2hvdworIyAxOTE2LTEwLTAxIDAwOjAwIHN0YW5kYXJkIHRpbWUuICBUaGUgYXJ0aWNsZSBhbHNvIHJlcG9ydHMgdGhhdCBzb21lCisjIHBlb3BsZSB0aG91Z2h0IHRoZSBzd2l0Y2ggdG8gc3RhbmRhcmQgdGltZSB3b3VsZCB0YWtlIHBsYWNlIGFscmVhZHkKKyMgYXQgMTkxNi0xMC0wMSAwMDowMCBzdW1tZXIgdGltZSwgYnV0IHRoZXkgaGFkIHRvIHdhaXQgZm9yIGFub3RoZXIKKyMgaG91ciBiZWZvcmUgdGhlIGV2ZW50IHRvb2sgcGxhY2UuCisjCisjIFNvdXJjZTogVGhlIG5ld3NwYXBlciAiRGFnZW5zIE55aGV0ZXIiLCAxOTE2LTEwLTAxLCBwYWdlIDcgdXBwZXIgbGVmdC4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBFdXJvcGUvU3RvY2tob2xtCTE6MTI6MTIgLQlMTVQJMTg3OSBKYW4gIDEKKwkJCTE6MDA6MTQJLQlTRVQJMTkwMCBKYW4gIDEJIyBTd2VkaXNoIFRpbWUKKwkJCTE6MDAJLQlDRVQJMTkxNiBNYXkgMTQgMjM6MDAKKwkJCTE6MDAJMTowMAlDRVNUCTE5MTYgT2N0ICAxIDAxOjAwCisJCQkxOjAwCS0JQ0VUCTE5ODAKKwkJCTE6MDAJRVUJQ0Ulc1QKKworIyBTd2l0emVybGFuZAorIyBGcm9tIEhvd3NlOgorIyBCeSB0aGUgZW5kIG9mIHRoZSAxOHRoIGNlbnR1cnkgY2xvY2tzIGFuZCB3YXRjaGVzIGJlY2FtZSBjb21tb25wbGFjZQorIyBhbmQgdGhlaXIgcGVyZm9ybWFuY2UgaW1wcm92ZWQgZW5vcm1vdXNseS4gIENvbW11bml0aWVzIGJlZ2FuIHRvIGtlZXAKKyMgbWVhbiB0aW1lIGluIHByZWZlcmVuY2UgdG8gYXBwYXJlbnQgdGltZSAtLSBHZW5ldmEgZnJvbSAxNzgwIC4uLi4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCisjIEZyb20gV2hpdG1hbiAod2hvIHdyaXRlcyBgYE1pZG5pZ2h0PycnKToKKyMgUnVsZQlTd2lzcwkxOTQwCW9ubHkJLQlOb3YJIDIJMDowMAkxOjAwCVMKKyMgUnVsZQlTd2lzcwkxOTQwCW9ubHkJLQlEZWMJMzEJMDowMAkwCS0KKyMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6CisjIFJ1bGUJU3dpc3MJMTk0MQkxOTQyCS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJUworIyBSdWxlCVN3aXNzCTE5NDEJMTk0MgktCU9jdAlTdW4+PTEJMDowMAkwCS0KKworIyBGcm9tIEFsb2lzIFRyZWluZGwgKDIwMDgtMTItMTcpOgorIyBJIGhhdmUgcmVzZWFyY2hlZCB0aGUgRFNUIHVzYWdlIGluIFN3aXR6ZXJsYW5kIGR1cmluZyB0aGUgMTk0MGllcy4KKyMKKyMgQXMgSSB3cm90ZSBpbiBhbiBlYXJsaWVyIG1lc3NhZ2UsIEkgc3VzcGVjdGVkIHRoZSBjdXJyZW50IHR6ZGF0YSB2YWx1ZXMKKyMgdG8gYmUgd3JvbmcuIFRoaXMgaXMgbm93IHZlcmlmaWVkLgorIworIyBJIGhhdmUgZm91bmQgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBydWxpbmcgYnkgdGhlIFN3aXNzIEZlZGVyYWwKKyMgZ292ZXJubWVudCwgaW4gJ0VpZGdlbltvXXNzaXNjaGUgR2VzZXR6ZXNzYW1tbHVuZyAxOTQxIGFuZCAxOTQyJyAoU3dpc3MKKyMgZmVkZXJhbCBsYXcgY29sbGVjdGlvbikuLi4KKyMKKyMgRFNUIGJlZ2FuIG9uIE1vbmRheSA1IE1heSAxOTQxLCAxOjAwIGFtIGJ5IHNoaWZ0aW5nIHRoZSBjbG9ja3MgdG8gMjowMCBhbQorIyBEU1QgZW5kZWQgb24gTW9uZGF5IDYgT2N0IDE5NDEsIDI6MDAgYW0gYnkgc2hpZnRpbmcgdGhlIGNsb2NrcyB0byAxOjAwIGFtLgorIworIyBEU1QgYmVnYW4gb24gTW9uZGF5LCA0IE1heSAxOTQyIGF0IDAxOjAwIGFtCisjIERTVCBlbmRlZCBvbiBNb25kYXksIDUgT2N0IDE5NDIgYXQgMDI6MDAgYW0KKyMKKyMgVGhlcmUgd2FzIG5vIERTVCBpbiAxOTQwLCBJIGhhdmUgY2hlY2tlZCB0aGUgbGF3IGNvbGxlY3Rpb24gY2FyZWZ1bGx5LgorIyBJdCBpcyBhbHNvIGluZGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSAxOTQyIGVudHJ5IGluIHRoZSBsYXcKKyMgY29sbGVjdGlvbiBwb2ludHMgYmFjayB0byAxOTQxIGFzIGEgcmVmZXJlbmNlLCBidXQgbm8gcmVmZXJlbmNlIHRvIGFueQorIyBvdGhlciB5ZWFycyBhcmUgbWFkZS4KKyMKKyMgTmV3c3BhcGVyIGFydGljbGVzIEkgaGF2ZSByZWFkIGluIHRoZSBhcmNoaXZlcyBvbiA2IE1heSAxOTQxIHJlcG9ydGVkCisjIGFib3V0IHRoZSBpbnRyb2R1Y3Rpb24gb2YgRFNUIChTb21tZXJ6ZWl0IGluIEdlcm1hbikgZHVyaW5nIHRoZSBwcmV2aW91cworIyBuaWdodCBhcyBhbiBhYnNvbHV0ZSBub3ZlbHR5LCBiZWNhdXNlIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoYXQgc3VjaAorIyBhIHRoaW5nIGhhZCBoYXBwZW5lZCBpbiBTd2l0emVybGFuZC4KKyMKKyMgSSBoYXZlIGFsc28gY2hlY2tlZCAxOTE2LCBiZWNhdXNlIG9uZSBib29rIHNvdXJjZSAoR2FicmllbCwgVHJhaXRlIGRlCisjIGwnaGV1cmUgZGFucyBsZSBtb25kZSkgY2xhaW1zIHRoYXQgU3dpdHplcmxhbmQgaGFkIERTVCBpbiAxOTE2LiBUaGlzIGlzCisjIGZhbHNlLCBubyBvZmZpY2lhbCBkb2N1bWVudCBjb3VsZCBiZSBmb3VuZC4gUHJvYmFibHkgR2FicmllbCBnb3QgbWlzbGVkCisjIGJ5IHJlZmVyZW5jZXMgdG8gR2VybWFueSwgd2hpY2ggaW50cm9kdWNlZCBEU1QgaW4gMTkxNiBmb3IgdGhlIGZpcnN0IHRpbWUuCisjCisjIFRoZSB0emRhdGEgcnVsZXMgZm9yIFN3aXR6ZXJsYW5kIG11c3QgYmUgY2hhbmdlZCB0bzoKKyMgUnVsZSAgU3dpc3MgICAxOTQxICAgIDE5NDIgICAgLSAgICAgICBNYXkgICAgIE1vbj49MSAgMTowMCAgICAxOjAwICAgIFMKKyMgUnVsZSAgU3dpc3MgICAxOTQxICAgIDE5NDIgICAgLSAgICAgICBPY3QgICAgIE1vbj49MSAgMjowMCAgICAwICAgICAgIC0KKyMKKyMgVGhlIDE5NDAgcnVsZXMgbXVzdCBiZSBkZWxldGVkLgorIworIyBPbmUgZnVydGhlciBkZXRhaWwgZm9yIFN3aXR6ZXJsYW5kLCB3aGljaCBpcyBwcm9iYWJseSBvdXQgb2Ygc2NvcGUgZm9yCisjIG1vc3QgdXNlcnMgb2YgdHpkYXRhOgorIyBUaGUgem9uZSBmaWxlCisjIFpvbmUgICAgRXVyb3BlL1p1cmljaCAgIDA6MzQ6MDggLSAgICAgICBMTVQgICAgIDE4NDggU2VwIDEyCisjICAgICAgICAgICAgICAgICAgICAgICAgICAwOjI5OjQ0IC0gICAgICAgQk1UICAgICAxODk0IEp1biAjQmVybiBNZWFuIFRpbWUKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MDAgICAgU3dpc3MgICBDRSVzVCAgIDE5ODEKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MDAgICAgRVUgICAgICBDRSVzVAorIyBkZXNjcmliZXMgYWxsIG9mIFN3aXR6ZXJsYW5kIGNvcnJlY3RseSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCisjIHRoZSBDYW50b25lIEdlbmV2ZSAoR2VuZXZhLCBHZW5mKS4gQmV0d2VlbiAxODQ4IGFuZCAxODk0IEdlbmV2ZSBkaWQgbm90CisjIGZvbGxvdyBCZXJuIE1lYW4gVGltZSBidXQga2VwdCBpdHMgb3duIGxvY2FsIG1lYW4gdGltZS4KKyMgVG8gcmVwcmVzZW50IHRoaXMsIGFuIGV4dHJhIHpvbmUgd291bGQgYmUgbmVlZGVkLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlTd2lzcwkxOTQxCTE5NDIJLQlNYXkJTW9uPj0xCTE6MDAJMTowMAlTCitSdWxlCVN3aXNzCTE5NDEJMTk0MgktCU9jdAlNb24+PTEJMjowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJRXVyb3BlL1p1cmljaAkwOjM0OjA4IC0JTE1UCTE4NDggU2VwIDEyCisJCQkwOjI5OjQ0CS0JQk1UCTE4OTQgSnVuICMgQmVybiBNZWFuIFRpbWUKKwkJCTE6MDAJU3dpc3MJQ0Ulc1QJMTk4MQorCQkJMTowMAlFVQlDRSVzVAorCisjIFR1cmtleQorCisjIEZyb20gQW1hciBEZXZlZ293ZGEgKDIwMDctMDEtMDMpOgorIyBUaGUgdGltZSB6b25lIHJ1bGVzIGZvciBJc3RhbmJ1bCwgVHVya2V5IGhhdmUgbm90IGJlZW4gY2hhbmdlZCBmb3IgeWVhcnMgbm93LgorIyAuLi4gVGhlIGxhdGVzdCBydWxlcyBhcmUgYXZhaWxhYmxlIGF0IC0KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay90aW1lem9uZS5odG1sP249MTA3CisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTAxLTAzKToKKyMgSSBoYXZlIGJlZW4gYWJsZSB0byBmaW5kIHByZXNzIHJlY29yZHMgYmFjayB0byAxOTk2IHdoaWNoIGFsbCBzYXkgdGhhdAorIyBEU1Qgc3RhcnRlZCAwMTowMCBsb2NhbCB0aW1lIGFuZCBlbmQgYXQgMDI6MDAgbG9jYWwgdGltZS4gIEkgYW0gbm90IHN1cmUKKyMgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhhdC4gIE9uZSBleGFtcGxlIGZvciBlYWNoIHllYXIgZnJvbSAxOTk2IHRvIDIwMDE6CisjIGh0dHA6Ly9uZXdzcG90LmJ5ZWdtLmdvdi50ci9hcnNpdi8xOTk2LzIxL040Lmh0bQorIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk3LzAzLzk3WDAzWDI1LlRYVAorIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk4LzAzLzk4WDAzWDAyLkhUTQorIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk5LzEwLzk5WDEwWDI2LkhUTSMlMjAxNgorIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzIwMDAvMDMvMDBYMDNYMDYuSFRNIyUyMDIxCisjIGh0dHA6Ly93d3cuYnllZ20uZ292LnRyL1lBWUlOTEFSSU1JWi9DSFIvSU5HMjAwMS8wMy8yM3gwM3gwMS5IVE0jJTIwMjcKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMS0wMyk6CisjIFByZWZlciB0aGUgYWJvdmUgc291cmNlIHRvIFNoYW5rcyAmIFBvdHRlbmdlciBmb3IgdGltZSBzdGFtcHMgYWZ0ZXIgMTk5MC4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wMy0wOSk6CisjIFN0YXJ0aW5nIDIwMDcgdGhvdWdoLCBpdCBzZWVtcyB0aGF0IHRoZXkgYXJlIGFkb3B0aW5nIEVVJ3MgMTowMCBVVEMKKyMgc3RhcnQvZW5kIHRpbWUsIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHBhZ2UgKDIwMDctMDMtMDcpOgorIyBodHRwOi8vd3d3Lm50dm1zbmJjLmNvbS9uZXdzLzQwMjAyOS5hc3AKKyMgVGhlIG9mZmljaWFsIGRvY3VtZW50IGlzIGxvY2F0ZWQgaGVyZSAtIGl0IGlzIGluIFR1cmtpc2guLi46CisjIGh0dHA6Ly9yZWdhLmJhc2Jha2FubGlrLmdvdi50ci9lc2tpbGVyLzIwMDcvMDMvMjAwNzAzMDctNy5odG0KKyMgSSB3YXMgYWJsZSB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBzZWVtaW5nbHkgb2ZmaWNpYWwgZG9jdW1lbnQKKyMgKG9uIGEgbm9uLWdvdmVybm1lbnQgc2VydmVyIHRob3VnaCkgZGVzY3JpYmluZyBkYXRlcyBiZXR3ZWVuIDIwMDIgYW5kIDIwMDY6CisjIGh0dHA6Ly93d3cuYWxvbWFsaXllLmNvbS9ia2tfMjAwMl8zNzY5Lmh0bQorCisjIEZyb20gU3VlIFdpbGxpYW1zICgyMDA4LTA4LTExKToKKyMgSSBzcG90dGVkIHRoaXMgbmV3cyBhcnRpY2xlIGFib3V0IGEgcG90ZW50aWFsIGNoYW5nZSBpbiBUdXJrZXkuCisjCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuaHVycml5ZXQuY29tLnRyL2VuZ2xpc2gvZG9tZXN0aWMvOTYyNjE3NC5hc3A/c2NyPTEiPgorIyBodHRwOi8vd3d3Lmh1cnJpeWV0LmNvbS50ci9lbmdsaXNoL2RvbWVzdGljLzk2MjYxNzQuYXNwP3Njcj0xCisjIDwvYT4KKworIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwOC0wOC0yMCk6CisjIFRoaXMgYXJ0aWNsZSBzYXlzIHRoYXQgYXJvdW5kIHRoZSBlbmQgb2YgTWFyY2ggMjAxMSwgVHVya2V5IHdhbnRzIHRvCisjIGFkanVzdCB0aGUgY2xvY2tzIGZvcndhcmQgYnkgMS8yIGhvdXIgYW5kIHN0YXkgdGhhdCB3YXkgcGVybWFuZW50bHkuCisjIFRoZSBhcnRpY2xlIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBjaGFuZ2UgaW4gdGltZXpvbmUgb2Zmc2V0IGluIGFkZGl0aW9uCisjIHRvIHN0b3BwaW5nIG9ic2VydmFuY2Ugb2YgRFNULgorIyBUaGlzIHByb3Bvc2FsIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuCisjCisjIFJlYWQgbW9yZSBoZXJlLi4uCisjCisjIFR1cmtleSB0byBhYmFuZG9uIGRheWxpZ2h0IHNhdmluZyB0aW1lIGluIDIwMTEKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy50dXJraXNoZGFpbHluZXdzLmNvbS50ci9hcnRpY2xlLnBocD9lbmV3c2lkPTExMjk4OSI+CisjIGh0dHA6Ly93d3cudHVya2lzaGRhaWx5bmV3cy5jb20udHIvYXJ0aWNsZS5waHA/ZW5ld3NpZD0xMTI5ODkKKyMgPC9hPgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlUdXJrZXkJMTkxNglvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTE2CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5MjAJb25seQktCU1hcgkyOAkwOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTkyMAlvbmx5CS0JT2N0CTI1CTA6MDAJMAktCitSdWxlCVR1cmtleQkxOTIxCW9ubHkJLQlBcHIJIDMJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5MjEJb25seQktCU9jdAkgMwkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTkyMglvbmx5CS0JTWFyCTI2CTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTIyCW9ubHkJLQlPY3QJIDgJMDowMAkwCS0KKyMgV2hpdG1hbiBnaXZlcyAxOTIzIEFwciAyOCAtIFNlcCAxNiBhbmQgbm8gRFNUIGluIDE5MjQtMTkyNTsKKyMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVR1cmtleQkxOTI0CW9ubHkJLQlNYXkJMTMJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5MjQJMTkyNQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTkyNQlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTQwCW9ubHkJLQlKdW4JMzAJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NDAJb25seQktCU9jdAkgNQkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTk0MAlvbmx5CS0JRGVjCSAxCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTQxCW9ubHkJLQlTZXAJMjEJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5NDIJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJUworIyBXaGl0bWFuIG9taXRzIHRoZSBuZXh0IHR3byB0cmFuc2l0aW9uIGFuZCBnaXZlcyAxOTQ1IE9jdCAxOworIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJVHVya2V5CTE5NDIJb25seQktCU5vdgkgMQkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTk0NQlvbmx5CS0JQXByCSAyCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTQ1CW9ubHkJLQlPY3QJIDgJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5NDYJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk0Nglvbmx5CS0JT2N0CSAxCTA6MDAJMAktCitSdWxlCVR1cmtleQkxOTQ3CTE5NDgJLQlBcHIJU3VuPj0xNgkwOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk0NwkxOTUwCS0JT2N0CVN1bj49MgkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTk0OQlvbmx5CS0JQXByCTEwCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTUwCW9ubHkJLQlBcHIJMTkJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NTEJb25seQktCUFwcgkyMgkwOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk1MQlvbmx5CS0JT2N0CSA4CTA6MDAJMAktCitSdWxlCVR1cmtleQkxOTYyCW9ubHkJLQlKdWwJMTUJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NjIJb25seQktCU9jdAkgOAkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTk2NAlvbmx5CS0JTWF5CTE1CTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTY0CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5NzAJMTk3MgktCU1heQlTdW4+PTIJMDowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NzAJMTk3MgktCU9jdAlTdW4+PTIJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5NzMJb25seQktCUp1bgkgMwkxOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk3Mwlvbmx5CS0JTm92CSA0CTM6MDAJMAktCitSdWxlCVR1cmtleQkxOTc0CW9ubHkJLQlNYXIJMzEJMjowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NzQJb25seQktCU5vdgkgMwk1OjAwCTAJLQorUnVsZQlUdXJrZXkJMTk3NQlvbmx5CS0JTWFyCTMwCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTc1CTE5NzYJLQlPY3QJbGFzdFN1bgkwOjAwCTAJLQorUnVsZQlUdXJrZXkJMTk3Nglvbmx5CS0JSnVuCSAxCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTc3CTE5NzgJLQlBcHIJU3VuPj0xCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTc3CW9ubHkJLQlPY3QJMTYJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5NzkJMTk4MAktCUFwcglTdW4+PTEJMzowMAkxOjAwCVMKK1J1bGUJVHVya2V5CTE5NzkJMTk4MgktCU9jdAlNb24+PTExCTA6MDAJMAktCitSdWxlCVR1cmtleQkxOTgxCTE5ODIJLQlNYXIJbGFzdFN1bgkzOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk4Mwlvbmx5CS0JSnVsCTMxCTA6MDAJMTowMAlTCitSdWxlCVR1cmtleQkxOTgzCW9ubHkJLQlPY3QJIDIJMDowMAkwCS0KK1J1bGUJVHVya2V5CTE5ODUJb25seQktCUFwcgkyMAkwOjAwCTE6MDAJUworUnVsZQlUdXJrZXkJMTk4NQlvbmx5CS0JU2VwCTI4CTA6MDAJMAktCitSdWxlCVR1cmtleQkxOTg2CTE5OTAJLQlNYXIJbGFzdFN1bgkyOjAwcwkxOjAwCVMKK1J1bGUJVHVya2V5CTE5ODYJMTk5MAktCVNlcAlsYXN0U3VuCTI6MDBzCTAJLQorUnVsZQlUdXJrZXkJMTk5MQkyMDA2CS0JTWFyCWxhc3RTdW4JMTowMHMJMTowMAlTCitSdWxlCVR1cmtleQkxOTkxCTE5OTUJLQlTZXAJbGFzdFN1bgkxOjAwcwkwCS0KK1J1bGUJVHVya2V5CTE5OTYJMjAwNgktCU9jdAlsYXN0U3VuCTE6MDBzCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlFdXJvcGUvSXN0YW5idWwJMTo1NTo1MiAtCUxNVAkxODgwCisJCQkxOjU2OjU2CS0JSU1UCTE5MTAgT2N0ICMgSXN0YW5idWwgTWVhbiBUaW1lPworCQkJMjowMAlUdXJrZXkJRUUlc1QJMTk3OCBPY3QgMTUKKwkJCTM6MDAJVHVya2V5CVRSJXNUCTE5ODUgQXByIDIwICMgVHVya2V5IFRpbWUKKwkJCTI6MDAJVHVya2V5CUVFJXNUCTIwMDcKKwkJCTI6MDAJRVUJRUUlc1QKK0xpbmsJRXVyb3BlL0lzdGFuYnVsCUFzaWEvSXN0YW5idWwJIyBJc3RhbmJ1bCBpcyBpbiBib3RoIGNvbnRpbmVudHMuCisKKyMgVWtyYWluZQorIworIyBGcm9tIElnb3IgS2FycG92LCB3aG8gd29ya3MgZm9yIHRoZSBVa3JhbmlhbiBNaW5pc3RyeSBvZiBKdXN0aWNlLAorIyB2aWEgR2FycmV0dCBXb2xsbWFuICgyMDAzLTAxLTI3KToKKyMgQlRXLCBJJ3ZlIGZvdW5kIHRoZSBvZmZpY2lhbCBkb2N1bWVudCBvbiB0aGlzIG1hdHRlci4gSXQncyBnb3Zlcm1lbnQKKyMgcmVndWxhdGlvbnMgbnVtYmVyIDUwOSwgTWF5IDEzLCAxOTk2LiBJbiBteSBwb29yIHRyYW5zbGF0aW9uIGl0IHNheXM6CisjICJUaW1lIGluIFVrcmFpbmUgaXMgc2V0IHRvIHNlY29uZCB0aW1lem9uZSAoS2lldiB0aW1lKS4gRWFjaCBsYXN0IFN1bmRheQorIyBvZiBNYXJjaCBhdCAzYW0gdGhlIHRpbWUgaXMgY2hhbmdpbmcgdG8gNGFtIGFuZCBlYWNoIGxhc3QgU3VuZGF5IG9mCisjIE9jdG9iZXIgdGhlIHRpbWUgYXQgNGFtIGlzIGNoYW5naW5nIHRvIDNhbSIKKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorIyBNb3N0IG9mIFVrcmFpbmUgc2luY2UgMTk3MCBoYXMgYmVlbiBsaWtlIEtpZXYuCisjICJLeWl2IiBpcyB0aGUgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZSBVa3JhaW5pYW4gbmFtZSwgYnV0CisjICJLaWV2IiBpcyBtb3JlIGNvbW1vbiBpbiBFbmdsaXNoLgorWm9uZSBFdXJvcGUvS2lldgkyOjAyOjA0IC0JTE1UCTE4ODAKKwkJCTI6MDI6MDQJLQlLTVQJMTkyNCBNYXkgIDIgIyBLaWV2IE1lYW4gVGltZQorCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQorCQkJMzowMAktCU1TSwkxOTQxIFNlcCAyMAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE5vdiAgNgorCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCisJCQkzOjAwCS0JTVNLCTE5OTAgSnVsICAxIDI6MDAKKwkJCTI6MDAJLQlFRVQJMTk5MgorCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1CisJCQkyOjAwCUVVCUVFJXNUCisjIFJ1dGhlbmlhIHVzZWQgQ0VUIDE5OTAvMTk5MS4KKyMgIlV6aGhvcm9kIiBpcyB0aGUgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZSBVa3JhaW5pYW4gbmFtZSwgYnV0CisjICJVemhnb3JvZCIgaXMgbW9yZSBjb21tb24gaW4gRW5nbGlzaC4KK1pvbmUgRXVyb3BlL1V6aGdvcm9kCTE6Mjk6MTIgLQlMTVQJMTg5MCBPY3QKKwkJCTE6MDAJLQlDRVQJMTk0MAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IE9jdAorCQkJMTowMAkxOjAwCUNFU1QJMTk0NCBPY3QgMjYKKwkJCTE6MDAJLQlDRVQJMTk0NSBKdW4gMjkKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAorCQkJMzowMAktCU1TSwkxOTkwIEp1bCAgMSAyOjAwCisJCQkxOjAwCS0JQ0VUCTE5OTEgTWFyIDMxIDM6MDAKKwkJCTI6MDAJLQlFRVQJMTk5MgorCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1CisJCQkyOjAwCUVVCUVFJXNUCisjIFphcG9yb3poJ3llIGFuZCBlYXN0ZXJuIEx1Z2Fuc2sgb2JsYXN0cyBvYnNlcnZlZCBEU1QgMTk5MC8xOTkxLgorIyAiWmFwb3JpemhpYSIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgVWtyYWluaWFuIG5hbWUsIGJ1dAorIyAiWmFwb3JvemgneWUiIGlzIG1vcmUgY29tbW9uIGluIEVuZ2xpc2guICBVc2UgdGhlIGNvbW1vbiBFbmdsaXNoCisjIHNwZWxsaW5nLCBleGNlcHQgb21pdCB0aGUgYXBvc3Ryb3BoZSBhcyBpdCBpcyBub3QgYWxsb3dlZCBpbgorIyBwb3J0YWJsZSBQb3NpeCBmaWxlIG5hbWVzLgorWm9uZSBFdXJvcGUvWmFwb3Jvemh5ZQkyOjIwOjQwIC0JTE1UCTE4ODAKKwkJCTI6MjAJLQlDVVQJMTkyNCBNYXkgIDIgIyBDZW50cmFsIFVrcmFpbmUgVAorCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQorCQkJMzowMAktCU1TSwkxOTQxIEF1ZyAyNQorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE9jdCAyNQorCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwCisJCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTUKKwkJCTI6MDAJRVUJRUUlc1QKKyMgQ2VudHJhbCBDcmltZWEgdXNlZCBNb3Njb3cgdGltZSAxOTk0LzE5OTcuCitab25lIEV1cm9wZS9TaW1mZXJvcG9sCTI6MTY6MjQgLQlMTVQJMTg4MAorCQkJMjoxNgktCVNNVAkxOTI0IE1heSAgMiAjIFNpbWZlcm9wb2wgTWVhbiBUCisJCQkyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCisJCQkzOjAwCS0JTVNLCTE5NDEgTm92CisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXByIDEzCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKKwkJCTM6MDAJLQlNU0sJMTk5MCBKdWwgIDEgMjowMAorCQkJMjowMAktCUVFVAkxOTkyCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBUaGUgX0Vjb25vbWlzdF8gKDE5OTQtMDUtMjgsIHAgNDUpIHJlcG9ydHMgdGhhdCBjZW50cmFsIENyaW1lYSBzd2l0Y2hlZAorIyBmcm9tIEtpZXYgdG8gTW9zY293IHRpbWUgc29tZXRpbWUgYWZ0ZXIgdGhlIEphbnVhcnkgMTk5NCBlbGVjdGlvbnMuCisjIFNoYW5rcyAoMTk5OSkgc2F5cyBgYGRhdGUgb2YgY2hhbmdlIHVuY2VydGFpbicnLCBidXQgaW1wbGllcyB0aGF0IGl0IGhhcHBlbmVkCisjIHNvbWV0aW1lIGJldHdlZW4gdGhlIDE5OTQgRFNUIHN3aXRjaGVzLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNpbXBseSBzYXkKKyMgMTk5NC0wOS0yNSAwMzowMCwgYnV0IHRoYXQgY2FuJ3QgYmUgcmlnaHQuICBGb3Igbm93LCBndWVzcyBpdAorIyBjaGFuZ2VkIGluIE1heS4KKwkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NCBNYXkKKyMgRnJvbSBJQVRBIFNTSU0gKDE5OTQvMTk5NyksIHdoaWNoIGFsc28gc2F5cyB0aGF0IEtlcmNoIGlzIHN0aWxsIGxpa2UgS2lldi4KKwkJCTM6MDAJRS1FdXIJTVNLL01TRAkxOTk2IE1hciAzMSAzOjAwcworCQkJMzowMAkxOjAwCU1TRAkxOTk2IE9jdCAyNyAzOjAwcworIyBJQVRBIFNTSU0gKDE5OTctMDkpIHNheXMgQ3JpbWVhIHN3aXRjaGVkIHRvIEVFVC9FRVNULgorIyBBc3N1bWUgaXQgaGFwcGVuZWQgaW4gTWFyY2ggYnkgbm90IGNoYW5naW5nIHRoZSBjbG9ja3MuCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTcKKwkJCTM6MDAJLQlNU0sJMTk5NyBNYXIgbGFzdFN1biAxOjAwdQorCQkJMjowMAlFVQlFRSVzVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgT25lIHNvdXJjZSBzaG93cyB0aGF0IEJ1bGdhcmlhLCBDeXBydXMsIEZpbmxhbmQsIGFuZCBHcmVlY2Ugb2JzZXJ2ZSBEU1QgZnJvbQorIyB0aGUgbGFzdCBTdW5kYXkgaW4gTWFyY2ggdG8gdGhlIGxhc3QgU3VuZGF5IGluIFNlcHRlbWJlciBpbiAxOTg2LgorIyBUaGUgc291cmNlIHNob3dzIFJvbWFuaWEgY2hhbmdpbmcgYSBkYXkgbGF0ZXIgdGhhbiBldmVyeWJvZHkgZWxzZS4KKyMKKyMgQWNjb3JkaW5nIHRvIEJlcm5hcmQgU2llbG9mZidzIHNvdXJjZSwgUG9sYW5kIGlzIGluIHRoZSBNRVQgdGltZSB6b25lIGJ1dAorIyB1c2VzIHRoZSBXRSBEU1QgcnVsZXMuICBUaGUgV2VzdGVybiBVU1NSIHVzZXMgRUVUKzEgYW5kIE1FIERTVCBydWxlcy4KKyMgQmVybmFyZCBTaWVsb2ZmJ3Mgc291cmNlIGNsYWltcyBSb21hbmlhIHN3aXRjaGVzIG9uIHRoZSBzYW1lIGRheSwgYnV0IGF0CisjIDAwOjAwIHN0YW5kYXJkIHRpbWUgKGkuZS4sIDAxOjAwIERTVCkuICBJdCBhbHNvIGNsYWltcyB0aGF0IFR1cmtleQorIyBzd2l0Y2hlcyBvbiB0aGUgc2FtZSBkYXksIGJ1dCBzd2l0Y2hlcyBvbiBhdCAwMTowMCBzdGFuZGFyZCB0aW1lCisjIGFuZCBvZmYgYXQgMDA6MDAgc3RhbmRhcmQgdGltZSAoaS5lLiwgMDE6MDAgRFNUKQorCisjIC4uLgorIyBEYXRlOiBXZWQsIDI4IEphbiA4NyAxNjo1NjoyNyAtMDEwMAorIyBGcm9tOiBUb20gSG9mbWFubgorIyAuLi4KKyMKKyMgLi4udGhlIEV1cm9wZWFuIHRpbWUgcnVsZXMgYXJlLi4uc3RhbmRhcmRpemVkIHNpbmNlIDE5ODEsIHdoZW4KKyMgbW9zdCBFdXJvcGVhbiBjb3VuW3RyXWllcyBzdGFydGVkIERTVC4gIEJlZm9yZSB0aGF0IHllYXIsIG9ubHkKKyMgYSBmZXcgY291bnRyaWVzIChVSywgRnJhbmNlLCBJdGFseSkgaGFkIERTVCwgZWFjaCBhY2NvcmRpbmcKKyMgdG8gb3duIG5hdGlvbmFsIHJ1bGVzLiAgSW4gMTk4MSwgaG93ZXZlciwgRFNUIHN0YXJ0ZWQgb24KKyMgJ0FwciBmaXJzdFN1bicsIGFuZCBub3Qgb24gJ01hciBsYXN0U3VuJyBhcyBpbiB0aGUgZm9sbG93aW5nCisjIHllYXJzLi4uCisjIEJ1dCBhbHNvIHNpbmNlIDE5ODEgdGhlcmUgYXJlIHNvbWUgbW9yZSBuYXRpb25hbCBleGNlcHRpb25zCisjIHRoYW4gbGlzdGVkIGluICdldXJvcGUnOiBTd2l0emVybGFuZCwgZm9yIGV4YW1wbGUsIGpvaW5lZCBEU1QKKyMgb25lIHllYXIgbGF0ZXIsIERlbm1hcmsgZW5kZWQgRFNUIG9uICdPY3QgMScgaW5zdGVhZCBvZiAnU2VwCisjIGxhc3RTdW4nIGluIDE5ODEtLS1JIGRvbid0IGtub3cgaG93IHRoZXkgaGFuZGxlIG5vdy4KKyMKKyMgRmluYWxseSwgRFNUIGlzdCBhbHdheXMgZnJvbSAnQXByIDEnIHRvICdPY3QgMScgaW4gdGhlCisjIFNvdmlldCBVbmlvbiAoYXMgZmFyIGFzIEkga25vdykuCisjCisjIFRvbSBIb2ZtYW5uLCBTY2llbnRpZmljIENvbXB1dGVyIENlbnRlciwgQ0lCQS1HRUlHWSBBRywKKyMgNDAwMiBCYXNsZSwgU3dpdHplcmxhbmQKKyMgLi4uCisKKyMgLi4uCisjIERhdGU6IFdlZCwgNCBGZWIgODcgMjI6MzU6MjIgKzAxMDAKKyMgRnJvbTogRGlrIFQuIFdpbnRlcgorIyAuLi4KKyMKKyMgVGhlIGluZm9ybWF0aW9uIGZyb20gVG9tIEhvZm1hbm4gaXMgKGFzIGZhciBhcyBJIGtub3cpIG5vdCBlbnRpcmVseSBjb3JyZWN0LgorIyBBZnRlciBhIHJlcXVlc3QgZnJvbSBjaG9uZ28gYXQgYW1kYWhsIEkgdHJpZWQgdG8gcmV0cmlldmUgYWxsIGluZm9ybWF0aW9uCisjIGFib3V0IERTVCBpbiBFdXJvcGUuICBJIHdhcyBhYmxlIHRvIGZpbmQgYWxsIGZyb20gYWJvdXQgMTk2OS4KKyMKKyMgLi4uc3RhbmRhcmRpemF0aW9uIG9uIERTVCBpbiBFdXJvcGUgc3RhcnRlZCBpbiBhYm91dCAxOTc3IHdpdGggc3dpdGNoZXMgb24KKyMgZmlyc3QgU3VuZGF5IGluIEFwcmlsIGFuZCBsYXN0IFN1bmRheSBpbiBTZXB0ZW1iZXIuLi4KKyMgSW4gMTk4MSBVSyBqb2luZWQgRXVyb3BlIGluc29mYXIgdGhhdAorIyB0aGUgc3RhcnRpbmcgZGF5IGZvciBib3RoIHNoaWZ0ZWQgdG8gbGFzdCBTdW5kYXkgaW4gTWFyY2guICBBbmQgZnJvbSAxOTgyCisjIHRoZSB3aG9sZSBvZiBFdXJvcGUgdXNlZCBEU1QsIHdpdGggc3dpdGNoIGRhdGVzIEFwcmlsIDEgYW5kIE9jdG9iZXIgMSBpbgorIyB0aGUgU292W2ldZXQgVW5pb24uICBJbiAxOTg1IHRoZSBTVSByZXZlcnRlZCB0byBzdGFuZGFyZCBFdXJvcGVbYV1uIHN3aXRjaAorIyBkYXRlcy4uLgorIworIyBJdCBzaG91bGQgYWxzbyBiZSByZW1lbWJlcmVkIHRoYXQgdGltZS16b25lcyBhcmUgbm90IGNvbnN0YW50czsgZS5nLgorIyBQb3J0dWdhbCBzd2l0Y2hlZCBpbiAxOTc2IGZyb20gTUVUIChvciBDRVQpIHRvIFdFVCB3aXRoIERTVC4uLgorIyBOb3RlIGFsc28gdGhhdCB0aG91Z2ggdGhlcmUgd2VyZSBydWxlcyBmb3Igc3dpdGNoIGRhdGVzIG5vdAorIyBhbGwgY291bnRyaWVzIGFiaWRlZCB0byB0aGVzZSBkYXRlcywgYW5kIG1hbnkgaW5kaXZpZHVhbCBkZXZpYXRpb25zCisjIG9jY3VycmVkLCB0aG91Z2ggbm90IHNpbmNlIDE5ODIgSSBiZWxpZXZlLiAgQW5vdGhlciBub3RlOiBpdCBpcyBhbHdheXMKKyMgYXNzdW1lZCB0aGF0IERTVCBpcyAxIGhvdXIgYWhlYWQgb2Ygbm9ybWFsIHRpbWUsIHRoaXMgbmVlZCBub3QgYmUgdGhlCisjIGNhc2U7IGF0IGxlYXN0IGluIHRoZSBOZXRoZXJsYW5kcyB0aGVyZSBoYXZlIGJlZW4gdGltZXMgd2hlbiBEU1Qgd2FzIDIgaG91cnMKKyMgaW4gYWR2YW5jZSBvZiBub3JtYWwgdGltZS4KKyMKKyMgLi4uCisjIGRpayB0LiB3aW50ZXIsIGN3aSwgYW1zdGVyZGFtLCBuZWRlcmxhbmQKKyMgLi4uCisKKyMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKKyMgLi4uCisjIEdyZWVjZTogTGFzdCBTdW5kYXkgaW4gQXByaWwgdG8gbGFzdCBTdW5kYXkgaW4gU2VwdGVtYmVyIChpZmZ5IG9uIGRhdGVzKS4KKyMgU2luY2UgMTk3OC4gIENoYW5nZSBhdCBtaWRuaWdodC4KKyMgLi4uCisjIE1vbmFjbzogaGFzIHNhbWUgRFNUIGFzIEZyYW5jZS4KKyMgLi4uCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA5cy9mYWN0b3J5IGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvZmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjRjY2MwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvZmFjdG9yeQpAQCAtMCwwICsxLDExIEBACisjIDxwcmU+CisjIEAoIylmYWN0b3J5CTguMgorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBGb3IgY29tcGFuaWVzIHdobyBkb24ndCB3YW50IHRvIHB1dCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBpbgorIyB0aGVpciBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcy4gIFdoZW4gdXNlcnMgcnVuIGRhdGUsIHRoZXknbGwgZ2V0IHRoZSBtZXNzYWdlLgorIyBBbHNvIHVzZWZ1bCBmb3IgdGhlICJjb21wLnNvdXJjZXMiIHZlcnNpb24uCisKKyMgWm9uZQlOQU1FCUdNVE9GRglSVUxFUwlGT1JNQVQKK1pvbmUJRmFjdG9yeQkwCS0gIkxvY2FsIHRpbWUgem9uZSBtdXN0IGJlIHNldC0tc2VlIHppYyBtYW51YWwgcGFnZSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2lzbzMxNjYudGFiIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvaXNvMzE2Ni50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhMjU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2lzbzMxNjYudGFiCkBAIC0wLDAgKzEsMjcxIEBACisjIDxwcmU+CisjIEAoIylpc28zMTY2LnRhYgk4LjYKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisjIElTTyAzMTY2IGFscGhhLTIgY291bnRyeSBjb2RlcworIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA5LTI3KToKKyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6CisjIDEuICBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLCBjdXJyZW50IGFzIG9mCisjICAgICBJU08gMzE2Ni0xIE5ld3NsZXR0ZXIgVkktMSAoMjAwNy0wOS0yMSkuICBTZWU6CisjICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS9pbmRleC5odG1sIj4KKyMgICAgIElTTyAzMTY2IE1haW50ZW5hbmNlIGFnZW5jeSAoSVNPIDMxNjYvTUEpCisjICAgICA8L2E+LgorIyAyLiAgVGhlIHVzdWFsIEVuZ2xpc2ggbmFtZSBmb3IgdGhlIGNvdW50cnksCisjICAgICBjaG9zZW4gc28gdGhhdCBhbHBoYWJldGljIHNvcnRpbmcgb2Ygc3Vic2V0cyBwcm9kdWNlcyBoZWxwZnVsIGxpc3RzLgorIyAgICAgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVuZ2xpc2ggbmFtZSBpbiB0aGUgSVNPIDMxNjYgdGFibGVzLgorIworIyBDb2x1bW5zIGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgdGFiLgorIyBUaGUgdGFibGUgaXMgc29ydGVkIGJ5IGNvdW50cnkgY29kZS4KKyMKKyMgTGluZXMgYmVnaW5uaW5nIHdpdGggYCMnIGFyZSBjb21tZW50cy4KKyMKKyNjb3VudHJ5LQorI2NvZGUJY291bnRyeSBuYW1lCitBRAlBbmRvcnJhCitBRQlVbml0ZWQgQXJhYiBFbWlyYXRlcworQUYJQWZnaGFuaXN0YW4KK0FHCUFudGlndWEgJiBCYXJidWRhCitBSQlBbmd1aWxsYQorQUwJQWxiYW5pYQorQU0JQXJtZW5pYQorQU4JTmV0aGVybGFuZHMgQW50aWxsZXMKK0FPCUFuZ29sYQorQVEJQW50YXJjdGljYQorQVIJQXJnZW50aW5hCitBUwlTYW1vYSAoQW1lcmljYW4pCitBVAlBdXN0cmlhCitBVQlBdXN0cmFsaWEKK0FXCUFydWJhCitBWAlBYWxhbmQgSXNsYW5kcworQVoJQXplcmJhaWphbgorQkEJQm9zbmlhICYgSGVyemVnb3ZpbmEKK0JCCUJhcmJhZG9zCitCRAlCYW5nbGFkZXNoCitCRQlCZWxnaXVtCitCRglCdXJraW5hIEZhc28KK0JHCUJ1bGdhcmlhCitCSAlCYWhyYWluCitCSQlCdXJ1bmRpCitCSglCZW5pbgorQkwJU3QgQmFydGhlbGVteQorQk0JQmVybXVkYQorQk4JQnJ1bmVpCitCTwlCb2xpdmlhCitCUglCcmF6aWwKK0JTCUJhaGFtYXMKK0JUCUJodXRhbgorQlYJQm91dmV0IElzbGFuZAorQlcJQm90c3dhbmEKK0JZCUJlbGFydXMKK0JaCUJlbGl6ZQorQ0EJQ2FuYWRhCitDQwlDb2NvcyAoS2VlbGluZykgSXNsYW5kcworQ0QJQ29uZ28gKERlbS4gUmVwLikKK0NGCUNlbnRyYWwgQWZyaWNhbiBSZXAuCitDRwlDb25nbyAoUmVwLikKK0NICVN3aXR6ZXJsYW5kCitDSQlDb3RlIGQnSXZvaXJlCitDSwlDb29rIElzbGFuZHMKK0NMCUNoaWxlCitDTQlDYW1lcm9vbgorQ04JQ2hpbmEKK0NPCUNvbG9tYmlhCitDUglDb3N0YSBSaWNhCitDVQlDdWJhCitDVglDYXBlIFZlcmRlCitDWAlDaHJpc3RtYXMgSXNsYW5kCitDWQlDeXBydXMKK0NaCUN6ZWNoIFJlcHVibGljCitERQlHZXJtYW55CitESglEamlib3V0aQorREsJRGVubWFyaworRE0JRG9taW5pY2EKK0RPCURvbWluaWNhbiBSZXB1YmxpYworRFoJQWxnZXJpYQorRUMJRWN1YWRvcgorRUUJRXN0b25pYQorRUcJRWd5cHQKK0VICVdlc3Rlcm4gU2FoYXJhCitFUglFcml0cmVhCitFUwlTcGFpbgorRVQJRXRoaW9waWEKK0ZJCUZpbmxhbmQKK0ZKCUZpamkKK0ZLCUZhbGtsYW5kIElzbGFuZHMKK0ZNCU1pY3JvbmVzaWEKK0ZPCUZhcm9lIElzbGFuZHMKK0ZSCUZyYW5jZQorR0EJR2Fib24KK0dCCUJyaXRhaW4gKFVLKQorR0QJR3JlbmFkYQorR0UJR2VvcmdpYQorR0YJRnJlbmNoIEd1aWFuYQorR0cJR3Vlcm5zZXkKK0dICUdoYW5hCitHSQlHaWJyYWx0YXIKK0dMCUdyZWVubGFuZAorR00JR2FtYmlhCitHTglHdWluZWEKK0dQCUd1YWRlbG91cGUKK0dRCUVxdWF0b3JpYWwgR3VpbmVhCitHUglHcmVlY2UKK0dTCVNvdXRoIEdlb3JnaWEgJiB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcworR1QJR3VhdGVtYWxhCitHVQlHdWFtCitHVwlHdWluZWEtQmlzc2F1CitHWQlHdXlhbmEKK0hLCUhvbmcgS29uZworSE0JSGVhcmQgSXNsYW5kICYgTWNEb25hbGQgSXNsYW5kcworSE4JSG9uZHVyYXMKK0hSCUNyb2F0aWEKK0hUCUhhaXRpCitIVQlIdW5nYXJ5CitJRAlJbmRvbmVzaWEKK0lFCUlyZWxhbmQKK0lMCUlzcmFlbAorSU0JSXNsZSBvZiBNYW4KK0lOCUluZGlhCitJTwlCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkKK0lRCUlyYXEKK0lSCUlyYW4KK0lTCUljZWxhbmQKK0lUCUl0YWx5CitKRQlKZXJzZXkKK0pNCUphbWFpY2EKK0pPCUpvcmRhbgorSlAJSmFwYW4KK0tFCUtlbnlhCitLRwlLeXJneXpzdGFuCitLSAlDYW1ib2RpYQorS0kJS2lyaWJhdGkKK0tNCUNvbW9yb3MKK0tOCVN0IEtpdHRzICYgTmV2aXMKK0tQCUtvcmVhIChOb3J0aCkKK0tSCUtvcmVhIChTb3V0aCkKK0tXCUt1d2FpdAorS1kJQ2F5bWFuIElzbGFuZHMKK0taCUthemFraHN0YW4KK0xBCUxhb3MKK0xCCUxlYmFub24KK0xDCVN0IEx1Y2lhCitMSQlMaWVjaHRlbnN0ZWluCitMSwlTcmkgTGFua2EKK0xSCUxpYmVyaWEKK0xTCUxlc290aG8KK0xUCUxpdGh1YW5pYQorTFUJTHV4ZW1ib3VyZworTFYJTGF0dmlhCitMWQlMaWJ5YQorTUEJTW9yb2NjbworTUMJTW9uYWNvCitNRAlNb2xkb3ZhCitNRQlNb250ZW5lZ3JvCitNRglTdCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KQorTUcJTWFkYWdhc2NhcgorTUgJTWFyc2hhbGwgSXNsYW5kcworTUsJTWFjZWRvbmlhCitNTAlNYWxpCitNTQlNeWFubWFyIChCdXJtYSkKK01OCU1vbmdvbGlhCitNTwlNYWNhdQorTVAJTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzCitNUQlNYXJ0aW5pcXVlCitNUglNYXVyaXRhbmlhCitNUwlNb250c2VycmF0CitNVAlNYWx0YQorTVUJTWF1cml0aXVzCitNVglNYWxkaXZlcworTVcJTWFsYXdpCitNWAlNZXhpY28KK01ZCU1hbGF5c2lhCitNWglNb3phbWJpcXVlCitOQQlOYW1pYmlhCitOQwlOZXcgQ2FsZWRvbmlhCitORQlOaWdlcgorTkYJTm9yZm9sayBJc2xhbmQKK05HCU5pZ2VyaWEKK05JCU5pY2FyYWd1YQorTkwJTmV0aGVybGFuZHMKK05PCU5vcndheQorTlAJTmVwYWwKK05SCU5hdXJ1CitOVQlOaXVlCitOWglOZXcgWmVhbGFuZAorT00JT21hbgorUEEJUGFuYW1hCitQRQlQZXJ1CitQRglGcmVuY2ggUG9seW5lc2lhCitQRwlQYXB1YSBOZXcgR3VpbmVhCitQSAlQaGlsaXBwaW5lcworUEsJUGFraXN0YW4KK1BMCVBvbGFuZAorUE0JU3QgUGllcnJlICYgTWlxdWVsb24KK1BOCVBpdGNhaXJuCitQUglQdWVydG8gUmljbworUFMJUGFsZXN0aW5lCitQVAlQb3J0dWdhbAorUFcJUGFsYXUKK1BZCVBhcmFndWF5CitRQQlRYXRhcgorUkUJUmV1bmlvbgorUk8JUm9tYW5pYQorUlMJU2VyYmlhCitSVQlSdXNzaWEKK1JXCVJ3YW5kYQorU0EJU2F1ZGkgQXJhYmlhCitTQglTb2xvbW9uIElzbGFuZHMKK1NDCVNleWNoZWxsZXMKK1NECVN1ZGFuCitTRQlTd2VkZW4KK1NHCVNpbmdhcG9yZQorU0gJU3QgSGVsZW5hCitTSQlTbG92ZW5pYQorU0oJU3ZhbGJhcmQgJiBKYW4gTWF5ZW4KK1NLCVNsb3Zha2lhCitTTAlTaWVycmEgTGVvbmUKK1NNCVNhbiBNYXJpbm8KK1NOCVNlbmVnYWwKK1NPCVNvbWFsaWEKK1NSCVN1cmluYW1lCitTVAlTYW8gVG9tZSAmIFByaW5jaXBlCitTVglFbCBTYWx2YWRvcgorU1kJU3lyaWEKK1NaCVN3YXppbGFuZAorVEMJVHVya3MgJiBDYWljb3MgSXMKK1RECUNoYWQKK1RGCUZyZW5jaCBTb3V0aGVybiAmIEFudGFyY3RpYyBMYW5kcworVEcJVG9nbworVEgJVGhhaWxhbmQKK1RKCVRhamlraXN0YW4KK1RLCVRva2VsYXUKK1RMCUVhc3QgVGltb3IKK1RNCVR1cmttZW5pc3RhbgorVE4JVHVuaXNpYQorVE8JVG9uZ2EKK1RSCVR1cmtleQorVFQJVHJpbmlkYWQgJiBUb2JhZ28KK1RWCVR1dmFsdQorVFcJVGFpd2FuCitUWglUYW56YW5pYQorVUEJVWtyYWluZQorVUcJVWdhbmRhCitVTQlVUyBtaW5vciBvdXRseWluZyBpc2xhbmRzCitVUwlVbml0ZWQgU3RhdGVzCitVWQlVcnVndWF5CitVWglVemJla2lzdGFuCitWQQlWYXRpY2FuIENpdHkKK1ZDCVN0IFZpbmNlbnQKK1ZFCVZlbmV6dWVsYQorVkcJVmlyZ2luIElzbGFuZHMgKFVLKQorVkkJVmlyZ2luIElzbGFuZHMgKFVTKQorVk4JVmlldG5hbQorVlUJVmFudWF0dQorV0YJV2FsbGlzICYgRnV0dW5hCitXUwlTYW1vYSAod2VzdGVybikKK1lFCVllbWVuCitZVAlNYXlvdHRlCitaQQlTb3V0aCBBZnJpY2EKK1pNCVphbWJpYQorWlcJWmltYmFid2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2xlYXBzZWNvbmRzIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvbGVhcHNlY29uZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjOTVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL2xlYXBzZWNvbmRzCkBAIC0wLDAgKzEsODcgQEAKKyMgPHByZT4KKyMgQCgjKWxlYXBzZWNvbmRzCTguOQorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBBbGxvd2FuY2UgZm9yIGxlYXBzZWNvbmRzIGFkZGVkIHRvIGVhY2ggdGltZXpvbmUgZmlsZS4KKworIyBUaGUgSW50ZXJuYXRpb25hbCBFYXJ0aCBSb3RhdGlvbiBTZXJ2aWNlIHBlcmlvZGljYWxseSB1c2VzIGxlYXAgc2Vjb25kcworIyB0byBrZWVwIFVUQyB0byB3aXRoaW4gMC45IHMgb2YgVVQxCisjICh3aGljaCBtZWFzdXJlcyB0aGUgdHJ1ZSBhbmd1bGFyIG9yaWVudGF0aW9uIG9mIHRoZSBlYXJ0aCBpbiBzcGFjZSk7IHNlZQorIyBUZXJyeSBKIFF1aW5uLCBUaGUgQklQTSBhbmQgdGhlIGFjY3VyYXRlIG1lYXN1cmUgb2YgdGltZSwKKyMgUHJvYyBJRUVFIDc5LCA3IChKdWx5IDE5OTEpLCA4OTQtOTA1LgorIyBUaGVyZSB3ZXJlIG5vIGxlYXAgc2Vjb25kcyBiZWZvcmUgMTk3MiwgYmVjYXVzZSB0aGUgb2ZmaWNpYWwgbWVjaGFuaXNtCisjIGFjY291bnRpbmcgZm9yIHRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIGF0b21pYyB0aW1lIGFuZCB0aGUgZWFydGgncyByb3RhdGlvbgorIyBkaWQgbm90IGV4aXN0IHVudGlsIHRoZSBlYXJseSAxOTcwcy4KKworIyBUaGUgY29ycmVjdGlvbiAoKyBvciAtKSBpcyBtYWRlIGF0IHRoZSBnaXZlbiB0aW1lLCBzbyBsaW5lcworIyB3aWxsIHR5cGljYWxseSBsb29rIGxpa2U6CisjCUxlYXAJWUVBUglNT04JREFZCTIzOjU5OjYwCSsJUi9TCisjIG9yCisjCUxlYXAJWUVBUglNT04JREFZCTIzOjU5OjU5CS0JUi9TCisKKyMgSWYgdGhlIGxlYXBzZWNvbmQgaXMgUm9sbGluZyAoUikgdGhlIGdpdmVuIHRpbWUgaXMgbG9jYWwgdGltZQorIyBJZiB0aGUgbGVhcHNlY29uZCBpcyBTdGF0aW9uYXJ5IChTKSB0aGUgZ2l2ZW4gdGltZSBpcyBVVEMKKworIyBMZWFwCVlFQVIJTU9OVEgJREFZCUhIOk1NOlNTCUNPUlIJUi9TCitMZWFwCTE5NzIJSnVuCTMwCTIzOjU5OjYwCSsJUworTGVhcAkxOTcyCURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMTk3MwlEZWMJMzEJMjM6NTk6NjAJKwlTCitMZWFwCTE5NzQJRGVjCTMxCTIzOjU5OjYwCSsJUworTGVhcAkxOTc1CURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMTk3NglEZWMJMzEJMjM6NTk6NjAJKwlTCitMZWFwCTE5NzcJRGVjCTMxCTIzOjU5OjYwCSsJUworTGVhcAkxOTc4CURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMTk3OQlEZWMJMzEJMjM6NTk6NjAJKwlTCitMZWFwCTE5ODEJSnVuCTMwCTIzOjU5OjYwCSsJUworTGVhcAkxOTgyCUp1bgkzMAkyMzo1OTo2MAkrCVMKK0xlYXAJMTk4MwlKdW4JMzAJMjM6NTk6NjAJKwlTCitMZWFwCTE5ODUJSnVuCTMwCTIzOjU5OjYwCSsJUworTGVhcAkxOTg3CURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMTk4OQlEZWMJMzEJMjM6NTk6NjAJKwlTCitMZWFwCTE5OTAJRGVjCTMxCTIzOjU5OjYwCSsJUworTGVhcAkxOTkyCUp1bgkzMAkyMzo1OTo2MAkrCVMKK0xlYXAJMTk5MwlKdW4JMzAJMjM6NTk6NjAJKwlTCitMZWFwCTE5OTQJSnVuCTMwCTIzOjU5OjYwCSsJUworTGVhcAkxOTk1CURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMTk5NwlKdW4JMzAJMjM6NTk6NjAJKwlTCitMZWFwCTE5OTgJRGVjCTMxCTIzOjU5OjYwCSsJUworTGVhcAkyMDA1CURlYwkzMQkyMzo1OTo2MAkrCVMKK0xlYXAJMjAwOAlEZWMJMzEJMjM6NTk6NjAJKwlTCisKKyMgSU5URVJOQVRJT05BTCBFQVJUSCBST1RBVElPTiBBTkQgUkVGRVJFTkNFIFNZU1RFTVMgU0VSVklDRSAoSUVSUykKKyMKKyMgU0VSVklDRSBJTlRFUk5BVElPTkFMIERFIExBIFJPVEFUSU9OIFRFUlJFU1RSRSBFVCBERVMgU1lTVEVNRVMgREUgUkVGRVJFTkNFCisjCisjIFNFUlZJQ0UgREUgTEEgUk9UQVRJT04gVEVSUkVTVFJFCisjIE9CU0VSVkFUT0lSRSBERSBQQVJJUworIyA2MSwgQXYuIGRlIGwnT2JzZXJ2YXRvaXJlIDc1MDE0IFBBUklTIChGcmFuY2UpCisjIFRlbC4gICAgICA6IDMzICgwKSAxIDQwIDUxIDIyIDI2CisjIEZBWCAgICAgICA6IDMzICgwKSAxIDQwIDUxIDIyIDkxCisjIEludGVybmV0ICA6IHNlcnZpY2VzLmllcnNAb2JzcG0uZnIKKyMKKyMgUGFyaXMsIDQgSnVseSAyMDA5CisjCisjIEJ1bGxldGluIEMgMzgKKyMKKyMgVG8gYXV0aG9yaXRpZXMgcmVzcG9uc2libGUKKyMgZm9yIHRoZSBtZWFzdXJlbWVudCBhbmQKKyMgZGlzdHJpYnV0aW9uIG9mIHRpbWUKKyMKKyMgSU5GT1JNQVRJT04gT04gVVRDIC0gVEFJCisjCisjIE5PIHBvc2l0aXZlIGxlYXAgc2Vjb25kIHdpbGwgYmUgaW50cm9kdWNlZCBhdCB0aGUgZW5kIG9mIERlY2VtYmVyIDIwMDkuCisjIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgVVRDIGFuZCB0aGUKKyMgSW50ZXJuYXRpb25hbCBBdG9taWMgVGltZSBUQUkgaXMgOgkJCisjCisjIGZyb20gMjAwOSBKYW51YXJ5IDEsIDBoIFVUQywgdW50aWwgZnVydGhlciBub3RpY2UgOiBVVEMtVEFJID0gLTM0IHMKKyMKKyMgTGVhcCBzZWNvbmRzIGNhbiBiZSBpbnRyb2R1Y2VkIGluIFVUQyBhdCB0aGUgZW5kIG9mIHRoZSBtb250aHMgb2YgRGVjZW1iZXIKKyMgb3IgSnVuZSwgIGRlcGVuZGluZyBvbiB0aGUgZXZvbHV0aW9uIG9mIFVUMS1UQUkuIEJ1bGxldGluIEMgaXMgbWFpbGVkIGV2ZXJ5CisjIHNpeCBtb250aHMsIGVpdGhlciB0byBhbm5vdW5jZSBhIHRpbWUgc3RlcCBpbiBVVEMsIG9yIHRvIGNvbmZpcm0gdGhhdCB0aGVyZQorIyB3aWxsIGJlIG5vIHRpbWUgc3RlcCBhdCB0aGUgbmV4dCBwb3NzaWJsZSBkYXRlLgorIworIyBEYW5pZWwgR0FNQklTCisjIERpcmVjdG9yCQkJCisjIEVhcnRoIE9yaWVudGF0aW9uIENlbnRlciBvZiBJRVJTCisjIE9ic2VydmF0b2lyZSBkZSBQYXJpcywgRnJhbmNlCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA5cy9ub3J0aGFtZXJpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9ub3J0aGFtZXJpY2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2OTIyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL25vcnRoYW1lcmljYQpAQCAtMCwwICsxLDI2ODAgQEAKKyMgPHByZT4KKyMgQCgjKW5vcnRoYW1lcmljYQk4LjI4CisjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCisjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgorCisjIGFsc28gaW5jbHVkZXMgQ2VudHJhbCBBbWVyaWNhIGFuZCB0aGUgQ2FyaWJiZWFuCisKKyMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KKyMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjIpOgorIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKKyMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBVbml0ZWQgU3RhdGVzCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wMy0zMSk6CisjIEhvd3NlIHdyaXRlcyAocHAgMTIxLTEyNSkgdGhhdCB0aW1lIHpvbmVzIHdlcmUgaW52ZW50ZWQgYnkKKyMgUHJvZmVzc29yIENoYXJsZXMgRmVyZGluYW5kIERvd2QgKDE4MjUtMTkwNCksCisjIFByaW5jaXBhbCBvZiBUZW1wbGUgR3JvdmUgTGFkaWVzJyBTZW1pbmFyeSAoU2FyYXRvZ2EgU3ByaW5ncywgTlkpLgorIyBIaXMgcGFtcGhsZXQgYGBBIFN5c3RlbSBvZiBOYXRpb25hbCBUaW1lIGZvciBSYWlscm9hZHMnJyAoMTg3MCkKKyMgd2FzIHRoZSByZXN1bHQgb2YgaGlzIHByb3Bvc2FscyBhdCB0aGUgQ29udmVudGlvbiBvZiBSYWlscm9hZCBUcnVuayBMaW5lcworIyBpbiBOZXcgWW9yayBDaXR5ICgxODY5LTEwKS4gIEhpcyAxODcwIHByb3Bvc2FsIHdhcyBiYXNlZCBvbiBXYXNoaW5ndG9uLCBEQywKKyMgYnV0IGluIDE4NzItMDUgaGUgbW92ZWQgdGhlIHByb3Bvc2VkIG9yaWdpbiB0byBHcmVlbndpY2guCisjIEhpcyBwcm9wb3NhbCB3YXMgYWRvcHRlZCBieSB0aGUgcmFpbHJvYWRzIG9uIDE4ODMtMTEtMTggYXQgMTI6MDAsCisjIGFuZCB0aGUgbW9zdCBvZiB0aGUgY291bnRyeSBzb29uIGZvbGxvd2VkIHN1aXQuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wNC0xNik6CisjIFRoYXQgMTg4MyB0cmFuc2l0aW9uIG9jY3VycmVkIGF0IDEyOjAwIG5ldyB0aW1lLCBub3QgYXQgMTI6MDAgb2xkIHRpbWUuCisjIFNlZSBwIDQ2IG9mIERhdmlkIFByZXJhdSwgU2VpemUgdGhlIGRheWxpZ2h0LCBUaHVuZGVyJ3MgTW91dGggUHJlc3MgKDIwMDUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIGluIHRoZSBVUyBpcworIyBUaG9tYXMgRy4gU2hhbmtzLCBUaGUgQW1lcmljYW4gQXRsYXMgKDV0aCBlZGl0aW9uKSwKKyMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgxOTkxKS4KKyMgTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBlcnJhdGEgc2hlZXQ7IHRoZSBib29rIGlzIHNvbWV3aGF0IHVzZWxlc3Mgd2l0aG91dCBpdC4KKyMgSXQgaXMgdGhlIHNvdXJjZSBmb3IgbW9zdCBvZiB0aGUgcHJlLTE5OTEgVVMgZW50cmllcyBiZWxvdy4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA2KToKKyMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2FzIGZpcnN0IHN1Z2dlc3RlZCBhcyBhIGpva2UgYnkgQmVuamFtaW4gRnJhbmtsaW4KKyMgaW4gaGlzIHdoaW1zaWNhbCBlc3NheSBgYEFuIEVjb25vbWljYWwgUHJvamVjdCBmb3IgRGltaW5pc2hpbmcgdGhlIENvc3QKKyMgb2YgTGlnaHQnJyBwdWJsaXNoZWQgaW4gdGhlIEpvdXJuYWwgZGUgUGFyaXMgKDE3ODQtMDQtMjYpLgorIyBOb3QgZXZlcnlvbmUgaXMgaGFwcHkgd2l0aCB0aGUgcmVzdWx0czoKKyMKKyMJSSBkb24ndCByZWFsbHkgY2FyZSBob3cgdGltZSBpcyByZWNrb25lZCBzbyBsb25nIGFzIHRoZXJlIGlzIHNvbWUKKyMJYWdyZWVtZW50IGFib3V0IGl0LCBidXQgSSBvYmplY3QgdG8gYmVpbmcgdG9sZCB0aGF0IEkgYW0gc2F2aW5nCisjCWRheWxpZ2h0IHdoZW4gbXkgcmVhc29uIHRlbGxzIG1lIHRoYXQgSSBhbSBkb2luZyBub3RoaW5nIG9mIHRoZSBraW5kLgorIwlJIGV2ZW4gb2JqZWN0IHRvIHRoZSBpbXBsaWNhdGlvbiB0aGF0IEkgYW0gd2FzdGluZyBzb21ldGhpbmcKKyMJdmFsdWFibGUgaWYgSSBzdGF5IGluIGJlZCBhZnRlciB0aGUgc3VuIGhhcyByaXNlbi4gIEFzIGFuIGFkbWlyZXIKKyMJb2YgbW9vbmxpZ2h0IEkgcmVzZW50IHRoZSBib3NzeSBpbnNpc3RlbmNlIG9mIHRob3NlIHdobyB3YW50IHRvCisjCXJlZHVjZSBteSB0aW1lIGZvciBlbmpveWluZyBpdC4gIEF0IHRoZSBiYWNrIG9mIHRoZSBEYXlsaWdodCBTYXZpbmcKKyMJc2NoZW1lIEkgZGV0ZWN0IHRoZSBib255LCBibHVlLWZpbmdlcmVkIGhhbmQgb2YgUHVyaXRhbmlzbSwgZWFnZXIKKyMJdG8gcHVzaCBwZW9wbGUgaW50byBiZWQgZWFybGllciwgYW5kIGdldCB0aGVtIHVwIGVhcmxpZXIsIHRvIG1ha2UKKyMJdGhlbSBoZWFsdGh5LCB3ZWFsdGh5IGFuZCB3aXNlIGluIHNwaXRlIG9mIHRoZW1zZWx2ZXMuCisjCisjCS0tIFJvYmVydHNvbiBEYXZpZXMsIFRoZSBkaWFyeSBvZiBTYW11ZWwgTWFyY2hiYW5rcywKKyMJICAgQ2xhcmtlLCBJcndpbiAoMTk0NyksIFhJWCwgU3VuZGF5CisjCisjIEZvciBtb3JlIGFib3V0IHRoZSBmaXJzdCB0ZW4geWVhcnMgb2YgRFNUIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBzZWUKKyMgUm9iZXJ0IEdhcmxhbmQncyA8YSBocmVmPSJodHRwOi8vd3d3LmNscGdoLm9yZy9leGhpYml0L2RzdC5odG1sIj4KKyMgVGVuIHllYXJzIG9mIGRheWxpZ2h0IHNhdmluZyBmcm9tIHRoZSBQaXR0c2J1cmdoIHN0YW5kcG9pbnQKKyMgKENhcm5lZ2llIExpYnJhcnkgb2YgUGl0dHNidXJnaCwgMTkyNyk8L2E+LgorIworIyBTaGFua3Mgc2F5cyB0aGF0IERTVCB3YXMgY2FsbGVkICJXYXIgVGltZSIgaW4gdGhlIFVTIGluIDE5MTggYW5kIDE5MTkuCisjIEhvd2V2ZXIsIERTVCB3YXMgaW1wb3NlZCBieSB0aGUgU3RhbmRhcmQgVGltZSBBY3Qgb2YgMTkxOCwgd2hpY2gKKyMgd2FzIHRoZSBmaXJzdCBuYXRpb253aWRlIGxlZ2FsIHRpbWUgc3RhbmRhcmQsIGFuZCBhcHBhcmVudGx5CisjIHRpbWUgd2FzIGp1c3QgY2FsbGVkICJTdGFuZGFyZCBUaW1lIiBvciAiRGF5bGlnaHQgU2F2aW5nIFRpbWUiLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uOgorIyBVUyBEYXlsaWdodCBTYXZpbmcgVGltZSBlbmRlZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgKk9jdG9iZXIqIGluIDE5NzQuCisjIFNlZSwgZm9yIGV4YW1wbGUsIHRoZSBmcm9udCBwYWdlIG9mIHRoZSBTYXR1cmRheSwgMTk3NC0xMC0yNgorIyBhbmQgU3VuZGF5LCAxOTc0LTEwLTI3IGVkaXRpb25zIG9mIHRoZSBXYXNoaW5ndG9uIFBvc3QuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb246CisjIEJlZm9yZSB0aGUgVW5pZm9ybSBUaW1lIEFjdCBvZiAxOTY2IHRvb2sgZWZmZWN0IGluIDE5NjcsIG9ic2VydmFuY2Ugb2YKKyMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgaW4gdGhlIFVTIHdhcyBieSBsb2NhbCBvcHRpb24sIGV4Y2VwdCBkdXJpbmcgd2FydGltZS4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwMC0wOS0yNSk6CisjIExhc3QgbmlnaHQgSSBoZWFyZCBwYXJ0IG9mIGEgcmVicm9hZGNhc3Qgb2YgYSAxOTQ1IEFyY2ggT2JvbGVyIHJhZGlvIGRyYW1hLgorIyBJbiB0aGUgaW50cm9kdWN0aW9uLCBPYm9sZXIgc3Bva2Ugb2YgIkVhc3Rlcm4gUGVhY2UgVGltZS4iCisjIEFuIEFsdGFWaXN0YSBzZWFyY2ggdHVybmVkIHVwCisjIDxhIGhyZWY9Imh0dHA6Ly9yb3dheXRvbi5vcmcvcmhzL2hzdGF1ZzQ1Lmh0bWwiPjoKKyMgIldoZW4gdGhlIHRpbWUgaXMgYW5ub3VuY2VkIG92ZXIgdGhlIHJhZGlvIG5vdywgaXQgaXMgJ0Vhc3Rlcm4gUGVhY2UKKyMgVGltZScgaW5zdGVhZCBvZiB0aGUgb2xkIGZhbWlsaWFyICdFYXN0ZXJuIFdhciBUaW1lLicgIFBlYWNlIGlzIHdvbmRlcmZ1bC4iCisjIDwvYT4gKEF1Z3VzdCAxOTQ1KSBieSB3YXkgb2YgY29uZmlybWF0aW9uLgorCisjIEZyb20gSm9zZXBoIEdhbGxhbnQgY2l0aW5nCisjIEdlb3JnZSBILiBEb3VnbGFzLCBfVGhlIEVhcmx5IERheXMgb2YgUmFkaW8gQnJvYWRjYXN0aW5nXyAoMTk4Nyk6CisjIEF0IDcgUC5NLiAoRWFzdGVybiBXYXIgVGltZSkgW29uIDE5NDUtMDgtMTRdLCB0aGUgbmV0d29ya3Mgd2VyZSBzZXQKKyMgdG8gc3dpdGNoIHRvIExvbmRvbiBmb3IgQXR0bGVlJ3MgYWRkcmVzcywgYnV0IHRoZSBBbWVyaWNhbiBwZW9wbGUKKyMgbmV2ZXIgZ290IHRvIGhlYXIgaGlzIHNwZWVjaCBsaXZlLiBBY2NvcmRpbmcgdG8gb25lIHByZXNzIGFjY291bnQsCisjIENCUycgQm9iIFRyb3V0IHdhcyBmaXJzdCB0byBhbm5vdW5jZSB0aGUgd29yZCBvZiBKYXBhbidzIHN1cnJlbmRlciwKKyMgYnV0IGEgZmV3IHNlY29uZHMgbGF0ZXIsIE5CQywgQUJDIGFuZCBNdXR1YWwgYWxzbyBmbGFzaGVkIHRoZSB3b3JkCisjIG9mIHN1cnJlbmRlciwgYWxsIG9mIHdob20gaW50ZXJydXB0aW5nIHRoZSBiZWxscyBvZiBCaWcgQmVuIGluCisjIExvbmRvbiB3aGljaCB3ZXJlIHRvIHByZWNlZGUgTXIuIEF0dGxlZSdzIHNwZWVjaC4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTAyLTA5KTogSXQgd2FzIFJvYmVydCBTdCBKb2huLCBub3QgQm9iIFRyb3V0LiAgRnJvbQorIyBNeXJuYSBPbGl2ZXIncyBvYml0dWFyeSBvZiBTdCBKb2huIG9uIHBhZ2UgQjE2IG9mIHRvZGF5J3MgTG9zIEFuZ2VsZXMgVGltZXM6CisjCisjIC4uLiBhIHdhci13ZWFyeSBVLlMuIGNsdW5nIHRvIHJhZGlvcywgYXdhaXRpbmcgd29yZCBvZiBKYXBhbidzIHN1cnJlbmRlci4KKyMgQW55IGFubm91bmNlbWVudCBmcm9tIEFzaWEgd291bGQgcmVhY2ggU3QuIEpvaG4ncyBOZXcgWW9yayBuZXdzcm9vbSBvbiBhCisjIHdpcmUgc2VydmljZSB0ZWxldHlwZSBtYWNoaW5lLCB3aGljaCBoYWQgcHJlc2NyaWJlZCBzaWduYWxzIGZvciBtYWpvciBuZXdzLgorIyBBc3NvY2lhdGVkIFByZXNzLCBmb3IgZXhhbXBsZSwgd291bGQgcmluZyBmaXZlIGJlbGxzIGJlZm9yZSBzcGV3aW5nIG91dAorIyB0eXBlZCBjb3B5IG9mIGFuIGltcG9ydGFudCBzdG9yeSwgYW5kIDEwIGJlbGxzIGZvciBuZXdzICJvZiB0cmFuc2NlbmRlbnRhbAorIyBpbXBvcnRhbmNlLiIKKyMKKyMgT24gQXVnLiAxNCwgc3RhbGxpbmcgd2hpbGUgdGFsa2luZyBzdGVhZGlseSBpbnRvIHRoZSBOQkMgbmV0d29ya3MnIG9wZW4KKyMgbWljcm9waG9uZSwgU3QuIEpvaG4gaGVhcmQgZml2ZSBiZWxscyBhbmQgd2FpdGVkIG9ubHkgdG8gaGVhciBhIHNpeHRoIGJlbGwsCisjIGJlZm9yZSBhbm5vdW5jaW5nIGNvbmZpZGVudGx5OiAiTGFkaWVzIGFuZCBnZW50bGVtZW4sIFdvcmxkIFdhciBJSSBpcyBvdmVyLgorIyBUaGUgSmFwYW5lc2UgaGF2ZSBhZ3JlZWQgdG8gb3VyIHN1cnJlbmRlciB0ZXJtcy4iCisjCisjIEhlIGhhZCBzY29yZWQgYSAyMC1zZWNvbmQgc2Nvb3Agb24gb3RoZXIgYnJvYWRjYXN0ZXJzLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA1LTA4LTIyKToKKyMgUGF1bCBoYXMgYmVlbiBjYXJlZnVsIHRvIHVzZSB0aGUgIlVTIiBydWxlcyBvbmx5IGluIHRob3NlIGxvY2F0aW9ucworIyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBVbml0ZWQgU3RhdGVzOyB0aGlzIHJlZmxlY3RzIHRoZSByZWFsIHNjb3BlIG9mCisjIFUuUy4gZ292ZXJubWVudCBhY3Rpb24uICBTbyBldmVuIHRob3VnaCB0aGUgIlVTIiBydWxlcyBoYXZlIGNoYW5nZWQKKyMgaW4gdGhlIGxhdGVzdCByZWxlYXNlLCBvdGhlciBjb3VudHJpZXMgd29uJ3QgYmUgYWZmZWN0ZWQuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVVTCTE5MTgJMTkxOQktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVVTCTE5MTgJMTkxOQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVVTCTE5NDIJb25seQktCUZlYgk5CTI6MDAJMTowMAlXICMgV2FyCitSdWxlCVVTCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKK1J1bGUJVVMJMTk0NQlvbmx5CS0JU2VwCTMwCTI6MDAJMAlTCitSdWxlCVVTCTE5NjcJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVVTCTE5NjcJMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVVTCTE5NzQJb25seQktCUphbgk2CTI6MDAJMTowMAlECitSdWxlCVVTCTE5NzUJb25seQktCUZlYgkyMwkyOjAwCTE6MDAJRAorUnVsZQlVUwkxOTc2CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlVUwkxOTg3CTIwMDYJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECitSdWxlCVVTCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlVUwkyMDA3CW1heAktCU5vdglTdW4+PTEJMjowMAkwCVMKKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiwgMjAwNS0xMi0xOQorIyBXZSBnZW5lcmF0ZSB0aGUgZmlsZXMgc3BlY2lmaWVkIGJlbG93IHRvIGd1YXJkIGFnYWluc3Qgb2xkIGZpbGVzIHdpdGgKKyMgb2Jzb2xldGUgaW5mb3JtYXRpb24gYmVpbmcgbGVmdCBpbiB0aGUgdGltZSB6b25lIGJpbmFyeSBkaXJlY3RvcnkuCisjIFdlIGxpbWl0IHRoZSBsaXN0IHRvIG5hbWVzIHRoYXQgaGF2ZSBhcHBlYXJlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZgorIyB0aGlzIHRpbWUgem9uZSBwYWNrYWdlLgorIyBXZSBkbyB0aGVzZSBhcyBzZXBhcmF0ZSBab25lcyByYXRoZXIgdGhhbiBhcyBMaW5rcyB0byBhdm9pZCBwcm9ibGVtcyBpZgorIyBhIHBhcnRpY3VsYXIgcGxhY2UgY2hhbmdlcyB3aGV0aGVyIGl0IG9ic2VydmVzIERTVC4KKyMgV2UgcHV0IHRoZXNlIHNwZWNpZmljYXRpb25zIGhlcmUgaW4gdGhlIG5vcnRoYW1lcmljYSBmaWxlIGJvdGggdG8KKyMgaW5jcmVhc2UgdGhlIGNoYW5jZXMgdGhhdCB0aGV5J2xsIGFjdHVhbGx5IGdldCBjb21waWxlZCBhbmQgdG8KKyMgYXZvaWQgdGhlIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBVUyBydWxlcyBpbiBhbm90aGVyIGZpbGUuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJRVNUCQkgLTU6MDAJLQlFU1QKK1pvbmUJTVNUCQkgLTc6MDAJLQlNU1QKK1pvbmUJSFNUCQktMTA6MDAJLQlIU1QKK1pvbmUJRVNUNUVEVAkJIC01OjAwCVVTCUUlc1QKK1pvbmUJQ1NUNkNEVAkJIC02OjAwCVVTCUMlc1QKK1pvbmUJTVNUN01EVAkJIC03OjAwCVVTCU0lc1QKK1pvbmUJUFNUOFBEVAkJIC04OjAwCVVTCVAlc1QKKworIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgorIyAuLi5BbGFza2EgKGFuZCBIYXdhaWkpIGhhZCB0aGUgdGltZXpvbmUgbmFtZXMgY2hhbmdlZCBpbiAxOTY3LgorIyAgICBvbGQJCQkgbmV3CisjICAgIFBhY2lmaWMgU3RhbmRhcmQgVGltZShQU1QpICAtc2FtZS0KKyMgICAgWXVrb24gU3RhbmRhcmQgVGltZShZU1QpICAgIC1zYW1lLQorIyAgICBDZW50cmFsIEFsYXNrYSBTLlQuIChDQVQpICAgQWxhc2thLUhhd2FpaSBTdFthbl1kYXJkIFRpbWUgKEFIU1QpCisjICAgIE5vbWUgU3RhbmRhcmQgVGltZSAoTlQpICAgICBCZXJpbmcgU3RhbmRhcmQgVGltZSAoQlNUKQorIworIyAuLi5BbGFza2EncyB0aW1lem9uZSBsaW5lcyB3ZXJlIHJlZHJhd24gaW4gMTk4MyB0byBnaXZlIG9ubHkgMiB0ei4KKyMgICAgVGhlIFlTVCB6b25lIG5vdyBjb3ZlcnMgbmVhcmx5IGFsbCBvZiB0aGUgc3RhdGUsIEFIU1QganVzdCBwYXJ0CisjICAgIG9mIHRoZSBBbGV1dGlhbiBpc2xhbmRzLiAgIE5vIERTVC4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTEyLTE5KToKKyMgVGhlIHRhYmxlcyBiZWxvdyB1c2UgYE5TVCcsIG5vdCBgTlQnLCBmb3IgTm9tZSBTdGFuZGFyZCBUaW1lLgorIyBJIGludmVudGVkIGBDQVdUJyBmb3IgQ2VudHJhbCBBbGFza2EgV2FyIFRpbWUuCisKKyMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OS0wMS0xOSk6CisjIFVTQSAgRUFTVEVSTiAgICAgICA1IEggIEJFSElORCBVVEMgICAgTkVXIFlPUkssIFdBU0hJTkdUT04KKyMgVVNBICBFQVNURVJOICAgICAgIDQgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAorIyBVU0EgIENFTlRSQUwgICAgICAgNiBIICBCRUhJTkQgVVRDICAgIENISUNBR08sIEhPVVNUT04KKyMgVVNBICBDRU5UUkFMICAgICAgIDUgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAorIyBVU0EgIE1PVU5UQUlOICAgICAgNyBIICBCRUhJTkQgVVRDICAgIERFTlZFUgorIyBVU0EgIE1PVU5UQUlOICAgICAgNiBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwCisjIFVTQSAgUEFDSUZJQyAgICAgICA4IEggIEJFSElORCBVVEMgICAgTC5BLiwgU0FOIEZSQU5DSVNDTworIyBVU0EgIFBBQ0lGSUMgICAgICAgNyBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwCisjIFVTQSAgQUxBU0tBIFNURCAgICA5IEggIEJFSElORCBVVEMgICAgTU9TVCBPRiBBTEFTS0EgICAgIChBS1NUKQorIyBVU0EgIEFMQVNLQSBTVEQgICAgOCBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwIChBS0RUKQorIyBVU0EgIEFMRVVUSUFOICAgICAxMCBIICBCRUhJTkQgVVRDICAgIElTTEFORFMgV0VTVCBPRiAxNzBXCisjIFVTQSAgLSAiIC0gICAgICAgICA5IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKKyMgVVNBICBIQVdBSUkgICAgICAgMTAgSCAgQkVISU5EIFVUQworIyBVU0EgIEJFUklORyAgICAgICAxMSBIICBCRUhJTkQgVVRDICAgIFNBTU9BLCBNSURXQVkKKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OS0wMS0yMSk6CisjIFRoZSBhYm92ZSBkYXRlcyBhcmUgZm9yIDE5ODguCisjIE5vdGUgdGhlICJBS1NUIiBhbmQgIkFLRFQiIGFiYnJldmlhdGlvbnMsIHRoZSBjbGFpbSB0aGF0IHRoZXJlJ3MKKyMgbm8gRFNUIGluIFNhbW9hLCBhbmQgdGhlIGNsYWltIHRoYXQgdGhlcmUgaXMgRFNUIGluIEFsYXNrYSBhbmQgdGhlCisjIEFsZXV0aWFucy4KKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OC0wMi0xMyk6CisjIExlZ2FsIHN0YW5kYXJkIHRpbWUgem9uZSBuYW1lcywgZnJvbSBVbml0ZWQgU3RhdGVzIENvZGUgKDE5ODIgRWRpdGlvbiBhbmQKKyMgU3VwcGxlbWVudCBJSUkpLCBUaXRsZSAxNSwgQ2hhcHRlciA2LCBTZWN0aW9uIDI2MCBhbmQgZm9yd2FyZC4gIEZpcnN0LCBuYW1lcworIyB1cCB0byAxOTY3LTA0LTAxICh3aGVuIG1vc3QgcHJvdmlzaW9ucyBvZiB0aGUgVW5pZm9ybSBUaW1lIEFjdCBvZiAxOTY2CisjIHRvb2sgZWZmZWN0KSwgYXMgZXhwbGFpbmVkIGluIHNlY3Rpb25zIDI2MyBhbmQgMjYxOgorIwkobm9uZSkKKyMJVW5pdGVkIFN0YXRlcyBzdGFuZGFyZCBlYXN0ZXJuIHRpbWUKKyMJVW5pdGVkIFN0YXRlcyBzdGFuZGFyZCBtb3VudGFpbiB0aW1lCisjCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgY2VudHJhbCB0aW1lCisjCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgUGFjaWZpYyB0aW1lCisjCShub25lKQorIwlVbml0ZWQgU3RhdGVzIHN0YW5kYXJkIEFsYXNrYSB0aW1lCisjCShub25lKQorIyBOZXh0LCBuYW1lcyBmcm9tIDE5NjctMDQtMDEgdW50aWwgMTk4My0xMS0zMCAodGhlIGRhdGUgZm9yCisjIHB1YmxpYyBsYXcgOTgtMTgxKToKKyMJQXRsYW50aWMgc3RhbmRhcmQgdGltZQorIwllYXN0ZXJuIHN0YW5kYXJkIHRpbWUKKyMJY2VudHJhbCBzdGFuZGFyZCB0aW1lCisjCW1vdW50YWluIHN0YW5kYXJkIHRpbWUKKyMJUGFjaWZpYyBzdGFuZGFyZCB0aW1lCisjCVl1a29uIHN0YW5kYXJkIHRpbWUKKyMJQWxhc2thLUhhd2FpaSBzdGFuZGFyZCB0aW1lCisjCUJlcmluZyBzdGFuZGFyZCB0aW1lCisjIEFuZCBhZnRlciAxOTgzLTExLTMwOgorIwlBdGxhbnRpYyBzdGFuZGFyZCB0aW1lCisjCWVhc3Rlcm4gc3RhbmRhcmQgdGltZQorIwljZW50cmFsIHN0YW5kYXJkIHRpbWUKKyMJbW91bnRhaW4gc3RhbmRhcmQgdGltZQorIwlQYWNpZmljIHN0YW5kYXJkIHRpbWUKKyMJQWxhc2thIHN0YW5kYXJkIHRpbWUKKyMJSGF3YWlpLUFsZXV0aWFuIHN0YW5kYXJkIHRpbWUKKyMJU2Ftb2Egc3RhbmRhcmQgdGltZQorIyBUaGUgbGF3IGRvZXNuJ3QgZ2l2ZSBhYmJyZXZpYXRpb25zLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTAxLTA4KSwgZm9sbG93aW5nIGEgaGVhZHMtdXAgZnJvbSBSaXZlcyBNY0RvdzoKKyMgUHVibGljIGxhdyAxMDYtNTY0ICgyMDAwLTEyLTIzKSBpbnRyb2R1Y2VkIHRoZSBhYmJyZXZpYXRpb24KKyMgIkNoYW1vcnJvIFN0YW5kYXJkIFRpbWUiIGZvciB0aW1lIGluIEd1YW0gYW5kIHRoZSBOb3J0aGVybiBNYXJpYW5hcy4KKyMgU2VlIHRoZSBmaWxlICJhdXN0cmFsYXNpYSIuCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24sIDIwMDUtMDgtMDkKKyMgVGhlIGZvbGxvd2luZyB3YXMgc2lnbmVkIGludG8gbGF3IG9uIDIwMDUtMDgtMDguCisjCisjIEguUi4gNiwgRW5lcmd5IFBvbGljeSBBY3Qgb2YgMjAwNSwgU0VDLiAxMTAuIERBWUxJR0hUIFNBVklOR1MuCisjICAgKGEpIEFtZW5kbWVudC0gU2VjdGlvbiAzKGEpIG9mIHRoZSBVbmlmb3JtIFRpbWUgQWN0IG9mIDE5NjYgKDE1CisjICAgVS5TLkMuIDI2MGEoYSkpIGlzIGFtZW5kZWQtLQorIyAgICAgKDEpIGJ5IHN0cmlraW5nIGBmaXJzdCBTdW5kYXkgb2YgQXByaWwnIGFuZCBpbnNlcnRpbmcgYHNlY29uZAorIyAgICAgU3VuZGF5IG9mIE1hcmNoJzsgYW5kCisjICAgICAoMikgYnkgc3RyaWtpbmcgYGxhc3QgU3VuZGF5IG9mIE9jdG9iZXInIGFuZCBpbnNlcnRpbmcgYGZpcnN0CisjICAgICBTdW5kYXkgb2YgTm92ZW1iZXInLgorIyAgIChiKSBFZmZlY3RpdmUgRGF0ZS0gU3Vic2VjdGlvbiAoYSkgc2hhbGwgdGFrZSBlZmZlY3QgMSB5ZWFyIGFmdGVyIHRoZQorIyAgIGRhdGUgb2YgZW5hY3RtZW50IG9mIHRoaXMgQWN0IG9yIE1hcmNoIDEsIDIwMDcsIHdoaWNoZXZlciBpcyBsYXRlci4KKyMgICAoYykgUmVwb3J0IHRvIENvbmdyZXNzLSBOb3QgbGF0ZXIgdGhhbiA5IG1vbnRocyBhZnRlciB0aGUgZWZmZWN0aXZlCisjICAgZGF0ZSBzdGF0ZWQgaW4gc3Vic2VjdGlvbiAoYiksIHRoZSBTZWNyZXRhcnkgc2hhbGwgcmVwb3J0IHRvIENvbmdyZXNzCisjICAgb24gdGhlIGltcGFjdCBvZiB0aGlzIHNlY3Rpb24gb24gZW5lcmd5IGNvbnN1bXB0aW9uIGluIHRoZSBVbml0ZWQKKyMgICBTdGF0ZXMuCisjICAgKGQpIFJpZ2h0IHRvIFJldmVydC0gQ29uZ3Jlc3MgcmV0YWlucyB0aGUgcmlnaHQgdG8gcmV2ZXJ0IHRoZQorIyAgIERheWxpZ2h0IFNhdmluZyBUaW1lIGJhY2sgdG8gdGhlIDIwMDUgdGltZSBzY2hlZHVsZXMgb25jZSB0aGUKKyMgICBEZXBhcnRtZW50IHN0dWR5IGlzIGNvbXBsZXRlLgorCisjIFVTIGVhc3Rlcm4gdGltZSwgcmVwcmVzZW50ZWQgYnkgTmV3IFlvcmsKKworIyBDb25uZWN0aWN1dCwgRGVsYXdhcmUsIERpc3RyaWN0IG9mIENvbHVtYmlhLCBtb3N0IG9mIEZsb3JpZGEsCisjIEdlb3JnaWEsIHNvdXRoZWFzdCBJbmRpYW5hIChEZWFyYm9ybiBhbmQgT2hpbyBjb3VudGllcyksIGVhc3Rlcm4gS2VudHVja3kKKyMgKGV4Y2VwdCBBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUgYmVsb3cpLCBNYWluZSwgTWFyeWxhbmQsIE1hc3NhY2h1c2V0dHMsCisjIE5ldyBIYW1wc2hpcmUsIE5ldyBKZXJzZXksIE5ldyBZb3JrLCBOb3J0aCBDYXJvbGluYSwgT2hpbywKKyMgUGVubnN5bHZhbmlhLCBSaG9kZSBJc2xhbmQsIFNvdXRoIENhcm9saW5hLCBlYXN0ZXJuIFRlbm5lc3NlZSwKKyMgVmVybW9udCwgVmlyZ2luaWEsIFdlc3QgVmlyZ2luaWEKKworIyBGcm9tIERhdmUgQ2FudG9yICgyMDA0LTExLTAyKToKKyMgRWFybHkgdGhpcyBzdW1tZXIgSSBoYWQgdGhlIG9jY2FzaW9uIHRvIHZpc2l0IHRoZSBNb3VudCBXYXNoaW5ndG9uCisjIE9ic2VydmF0b3J5IHdlYXRoZXIgc3RhdGlvbiBhdG9wIChvZiBjb3Vyc2UhKSBNb3VudCBXYXNoaW5ndG9uIFssIE5IXS4uLi4KKyMgT25lIG9mIHRoZSBzdGFmZiBtZW1iZXJzIHNhaWQgdGhhdCB0aGUgc3RhdGlvbiB3YXMgb24gRWFzdGVybiBTdGFuZGFyZCBUaW1lCisjIGFuZCBkaWRuJ3QgY2hhbmdlIHRoZWlyIGNsb2NrcyBmb3IgRGF5bGlnaHQgU2F2aW5nIC4uLiBzbyB0aGF0IHRoZWlyCisjIHJlcG9ydHMgd2lsbCBhbHdheXMgaGF2ZSB0aW1lcyB3aGljaCBhcmUgNSBob3VycyBiZWhpbmQgVVRDLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDgtMjYpOgorIyBBY2NvcmRpbmcgdG8gdG9kYXkncyBIdW50c3ZpbGxlIFRpbWVzCisjIDxodHRwOi8vd3d3LmFsLmNvbS9uZXdzL2h1bnRzdmlsbGV0aW1lcy9pbmRleC5zc2Y/L2Jhc2UvbmV3cy8xMTI1MDQ3NzgzMjI4MzIwLnhtbCZjb2xsPTE+CisjIGEgZmV3IHRvd25zIG9uIEFsYWJhbWEncyAiZWFzdGVybiBib3JkZXIgd2l0aCBHZW9yZ2lhLCBzdWNoIGFzIFBoZW5peCBDaXR5CisjIGluIFJ1c3NlbGwgQ291bnR5LCBMYW5ldHQgaW4gQ2hhbWJlcnMgQ291bnR5IGFuZCBzb21lIHRvd25zIGluIExlZSBDb3VudHksCisjIHNldCB0aGVpciB3YXRjaGVzIGFuZCBjbG9ja3Mgb24gRWFzdGVybiB0aW1lLiIgIEl0IHF1b3RlcyBILkguICJCdWJiYSIKKyMgUm9iZXJ0cywgY2l0eSBhZG1pbmlzdHJhdG9yIGluIFBoZW5peCBDaXR5LiBhcyBzYXlpbmcgIldlIGFyZSBpbiB0aGUgQ2VudHJhbAorIyB0aW1lIHpvbmUsIGJ1dCB3ZSBkbyBnbyBieSB0aGUgRWFzdGVybiB0aW1lIHpvbmUgYmVjYXVzZSBzbyBtYW55IHBlb3BsZSB3b3JrCisjIGluIENvbHVtYnVzLiIKKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCitSdWxlCU5ZQwkxOTIwCW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlOWUMJMTkyMAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJTllDCTE5MjEJMTk2NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCU5ZQwkxOTIxCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlOWUMJMTk1NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9OZXdfWW9yawktNDo1NjowMiAtCUxNVAkxODgzIE5vdiAxOCAxMjowMzo1OAorCQkJLTU6MDAJVVMJRSVzVAkxOTIwCisJCQktNTowMAlOWUMJRSVzVAkxOTQyCisJCQktNTowMAlVUwlFJXNUCTE5NDYKKwkJCS01OjAwCU5ZQwlFJXNUCTE5NjcKKwkJCS01OjAwCVVTCUUlc1QKKworIyBVUyBjZW50cmFsIHRpbWUsIHJlcHJlc2VudGVkIGJ5IENoaWNhZ28KKworIyBBbGFiYW1hLCBBcmthbnNhcywgRmxvcmlkYSBwYW5oYW5kbGUgKEJheSwgQ2FsaG91biwgRXNjYW1iaWEsCisjIEd1bGYsIEhvbG1lcywgSmFja3NvbiwgT2thbG9vc2EsIFNhbnRhIFJvc2EsIFdhbHRvbiwgYW5kCisjIFdhc2hpbmd0b24gY291bnRpZXMpLCBJbGxpbm9pcywgd2VzdGVybiBJbmRpYW5hCisjIChHaWJzb24sIEphc3BlciwgTGFrZSwgTGFQb3J0ZSwgTmV3dG9uLCBQb3J0ZXIsIFBvc2V5LCBTcGVuY2VyLAorIyBWYW5kZXJidXJnaCwgYW5kIFdhcnJpY2sgY291bnRpZXMpLCBJb3dhLCBtb3N0IG9mIEthbnNhcywgd2VzdGVybgorIyBLZW50dWNreSwgTG91aXNpYW5hLCBNaW5uZXNvdGEsIE1pc3Npc3NpcHBpLCBNaXNzb3VyaSwgZWFzdGVybgorIyBOZWJyYXNrYSwgZWFzdGVybiBOb3J0aCBEYWtvdGEsIE9rbGFob21hLCBlYXN0ZXJuIFNvdXRoIERha290YSwKKyMgd2VzdGVybiBUZW5uZXNzZWUsIG1vc3Qgb2YgVGV4YXMsIFdpc2NvbnNpbgorCisjIEZyb20gTGFycnkgTS4gU21pdGggKDIwMDYtMDQtMjYpIHJlIFdpc2NvbnNpbjoKKyMgaHR0cDovL3d3dy5sZWdpcy5zdGF0ZS53aS51cy9zdGF0dXRlcy9TdGF0MDE3NS5wZGYgLi4uCisjIGlzIGN1cnJlbnRseSBlbmZvcmNlZCBhdCB0aGUgMDE6MDAgdGltZSBvZiBjaGFuZ2UuICBCZWNhdXNlIHRoZSBsb2NhbAorIyAiYmFyIHRpbWUiIGluIHRoZSBzdGF0ZSBjb3JyZXNwb25kcyB0byAwMjowMCwgYSBudW1iZXIgb2YgY2l0YXRpb25zCisjIGFyZSBpc3N1ZWQgZm9yIHRoZSAic2FsZSBvZiBjbGFzcyAnQicgYWxjb2hvbCBhZnRlciBwcm9oaWJpdGVkCisjIGhvdXJzIiB3aXRoaW4gdGhlIGRldmlhdGVkIGhvdXIgb2YgdGhpcyBjaGFuZ2UgZXZlcnkgeWVhci4uLi4KKyMKKyMgRnJvbSBEb3VnbGFzIFIuIEJvbWJlcmcgKDIwMDctMDMtMTIpOgorIyBXaXNjb25zaW4gaGFzIGVuYWN0ZWQgKG5lYXJseSBlbGV2ZW50aC1ob3VyKSBsZWdpc2xhdGlvbiB0byBnZXQgV0kKKyMgU3RhdHVlIDE3NSBjbG9zZXIgaW4gc3luY2ggd2l0aCB0aGUgVVMgQ29uZ3Jlc3MnIGludGVudC4uLi4KKyMgaHR0cDovL3d3dy5sZWdpcy5zdGF0ZS53aS51cy8yMDA3L2RhdGEvYWN0cy8wN0FjdDMucGRmCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZQlDaGljYWdvCTE5MjAJb25seQktCUp1bgkxMwkyOjAwCTE6MDAJRAorUnVsZQlDaGljYWdvCTE5MjAJMTkyMQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUNoaWNhZ28JMTkyMQlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJQ2hpY2FnbwkxOTIyCTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlDaGljYWdvCTE5MjIJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUNoaWNhZ28JMTk1NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9DaGljYWdvCS01OjUwOjM2IC0JTE1UCTE4ODMgTm92IDE4IDEyOjA5OjI0CisJCQktNjowMAlVUwlDJXNUCTE5MjAKKwkJCS02OjAwCUNoaWNhZ28JQyVzVAkxOTM2IE1hciAgMSAyOjAwCisJCQktNTowMAktCUVTVAkxOTM2IE5vdiAxNSAyOjAwCisJCQktNjowMAlDaGljYWdvCUMlc1QJMTk0MgorCQkJLTY6MDAJVVMJQyVzVAkxOTQ2CisJCQktNjowMAlDaGljYWdvCUMlc1QJMTk2NworCQkJLTY6MDAJVVMJQyVzVAorIyBPbGl2ZXIgQ291bnR5LCBORCBzd2l0Y2hlZCBmcm9tIG1vdW50YWluIHRvIGNlbnRyYWwgdGltZSBvbiAxOTkyLTEwLTI1LgorWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIgLTY6NDU6MTIgLSBMTVQJMTg4MyBOb3YgMTggMTI6MTQ6NDgKKwkJCS03OjAwCVVTCU0lc1QJMTk5MiBPY3QgMjUgMDI6MDAKKwkJCS02OjAwCVVTCUMlc1QKKyMgTW9ydG9uIENvdW50eSwgTkQsIHN3aXRjaGVkIGZyb20gbW91bnRhaW4gdG8gY2VudHJhbCB0aW1lIG9uCisjIDIwMDMtMTAtMjYsIGV4Y2VwdCBmb3IgdGhlIGFyZWEgYXJvdW5kIE1hbmRhbiB3aGljaCB3YXMgYWxyZWFkeSBjZW50cmFsIHRpbWUuCisjIFNlZSA8aHR0cDovL2Rtc2VzLmRvdC5nb3YvZG9jaW1hZ2VzL3A2My8xMzU4MTgucGRmPi4KKyMgT2ZmaWNpYWxseSB0aGlzIHN3aXRjaCBhbHNvIGluY2x1ZGVkIHBhcnQgb2YgU2lvdXggQ291bnR5LCBhbmQKKyMgSm9uZXMsIE1lbGxldHRlLCBhbmQgVG9kZCBDb3VudGllcyBpbiBTb3V0aCBEYWtvdGE7CisjIGJ1dCBpbiBwcmFjdGljZSB0aGVzZSBvdGhlciBjb3VudGllcyB3ZXJlIGFscmVhZHkgb2JzZXJ2aW5nIGNlbnRyYWwgdGltZS4KKyMgU2VlIDxodHRwOi8vd3d3LmVwYS5nb3YvZmVkcmdzdHIvRVBBLUlNUEFDVC8yMDAzL09jdG9iZXIvRGF5LTI4L2kyNzA1Ni5odG0+LgorWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0gLTY6NDU6MzkgLSBMTVQgMTg4MyBOb3YgMTggMTI6MTQ6MjEKKwkJCS03OjAwCVVTCU0lc1QJMjAwMyBPY3QgMjYgMDI6MDAKKwkJCS02OjAwCVVTCUMlc1QKKworIyBVUyBtb3VudGFpbiB0aW1lLCByZXByZXNlbnRlZCBieSBEZW52ZXIKKyMKKyMgQ29sb3JhZG8sIGZhciB3ZXN0ZXJuIEthbnNhcywgTW9udGFuYSwgd2VzdGVybgorIyBOZWJyYXNrYSwgTmV2YWRhIGJvcmRlciAoSmFja3BvdCwgT3d5aGVlLCBhbmQgTW91bnRhaW4gQ2l0eSksCisjIE5ldyBNZXhpY28sIHNvdXRod2VzdGVybiBOb3J0aCBEYWtvdGEsCisjIHdlc3Rlcm4gU291dGggRGFrb3RhLCBmYXIgd2VzdGVybiBUZXhhcyAoRWwgUGFzbyBDb3VudHksIEh1ZHNwZXRoIENvdW50eSwKKyMgYW5kIFBpbmUgU3ByaW5ncyBhbmQgTmlja2VsIENyZWVrIGluIEN1bGJlcnNvbiBDb3VudHkpLCBVdGFoLCBXeW9taW5nCisjCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKK1J1bGUJRGVudmVyCTE5MjAJMTkyMQktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCURlbnZlcgkxOTIwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlEZW52ZXIJMTkyMQlvbmx5CS0JTWF5CTIyCTI6MDAJMAlTCitSdWxlCURlbnZlcgkxOTY1CTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlEZW52ZXIJMTk2NQkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9EZW52ZXIJLTY6NTk6NTYgLQlMTVQJMTg4MyBOb3YgMTggMTI6MDA6MDQKKwkJCS03OjAwCVVTCU0lc1QJMTkyMAorCQkJLTc6MDAJRGVudmVyCU0lc1QJMTk0MgorCQkJLTc6MDAJVVMJTSVzVAkxOTQ2CisJCQktNzowMAlEZW52ZXIJTSVzVAkxOTY3CisJCQktNzowMAlVUwlNJXNUCisKKyMgVVMgUGFjaWZpYyB0aW1lLCByZXByZXNlbnRlZCBieSBMb3MgQW5nZWxlcworIworIyBDYWxpZm9ybmlhLCBub3J0aGVybiBJZGFobyAoQmVuZXdhaCwgQm9ubmVyLCBCb3VuZGFyeSwgQ2xlYXJ3YXRlciwKKyMgSWRhaG8sIEtvb3RlbmFpLCBMYXRhaCwgTGV3aXMsIE5leiBQZXJjZSwgYW5kIFNob3Nob25lIGNvdW50aWVzLAorIyBhbmQgdGhlIG5vcnRoZXJuIHRocmVlLXF1YXJ0ZXJzIG9mIElkYWhvIGNvdW50eSksCisjIG1vc3Qgb2YgTmV2YWRhLCBtb3N0IG9mIE9yZWdvbiwgYW5kIFdhc2hpbmd0b24KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZQlDQQkxOTQ4CW9ubHkJLQlNYXIJMTQJMjowMAkxOjAwCUQKK1J1bGUJQ0EJMTk0OQlvbmx5CS0JSmFuCSAxCTI6MDAJMAlTCitSdWxlCUNBCTE5NTAJMTk2NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCUNBCTE5NTAJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUNBCTE5NjIJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvTG9zX0FuZ2VsZXMgLTc6NTI6NTggLQlMTVQJMTg4MyBOb3YgMTggMTI6MDc6MDIKKwkJCS04OjAwCVVTCVAlc1QJMTk0NgorCQkJLTg6MDAJQ0EJUCVzVAkxOTY3CisJCQktODowMAlVUwlQJXNUCisKKyMgQWxhc2thCisjIEFLJXNUIGlzIHRoZSBtb2Rlcm4gYWJicmV2aWF0aW9uIGZvciAtOTowMCBwZXIgVVNOTy4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0zMCk6CisjIEhvd3NlIHdyaXRlcyB0aGF0IEFsYXNrYSBzd2l0Y2hlZCBmcm9tIHRoZSBKdWxpYW4gdG8gdGhlIEdyZWdvcmlhbiBjYWxlbmRhciwKKyMgYW5kIGZyb20gZWFzdC1vZi1HTVQgdG8gd2VzdC1vZi1HTVQgZGF5cywgd2hlbiB0aGUgVVMgYm91Z2h0IGl0IGZyb20gUnVzc2lhLgorIyBUaGlzIHdhcyBvbiAxODY3LTEwLTE4LCBhIEZyaWRheTsgdGhlIHByZXZpb3VzIGRheSB3YXMgMTg2Ny0xMC0wNiBKdWxpYW4sCisjIGFsc28gYSBGcmlkYXkuICBJbmNsdWRlIG9ubHkgdGhlIHRpbWUgem9uZSBwYXJ0IG9mIHRoaXMgdHJhbnNpdGlvbiwKKyMgaWdub3JpbmcgdGhlIHN3aXRjaCBmcm9tIEp1bGlhbiB0byBHcmVnb3JpYW4sIHNpbmNlIHdlIGNhbid0IHJlcHJlc2VudAorIyB0aGUgSnVsaWFuIGNhbGVuZGFyLgorIworIyBBcyBmYXIgYXMgd2Uga25vdywgbm9uZSBvZiB0aGUgZXhhY3QgbG9jYXRpb25zIG1lbnRpb25lZCBiZWxvdyB3ZXJlCisjIHBlcm1hbmVudGx5IGluaGFiaXRlZCBpbiAxODY3IGJ5IGFueW9uZSB1c2luZyBlaXRoZXIgY2FsZW5kYXIuCisjIChZYWt1dGF0IHdhcyBjb2xvbml6ZWQgYnkgdGhlIFJ1c3NpYW5zIGluIDE3OTksIGJ1dCB0aGUgc2V0dGxlbWVudAorIyB3YXMgZGVzdHJveWVkIGluIDE4MDUgYnkgYSBZYWt1dGF0LWtvbiB3YXIgcGFydHkuKSAgSG93ZXZlciwgdGhlcmUKKyMgd2VyZSBuZWFyYnkgaW5oYWJpdGFudHMgaW4gc29tZSBjYXNlcyBhbmQgZm9yIG91ciBwdXJwb3NlcyBwZXJoYXBzCisjIGl0J3MgYmVzdCB0byBzaW1wbHkgdXNlIHRoZSBvZmZpY2lhbCB0cmFuc2l0aW9uLgorIworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0p1bmVhdQkgMTU6MDI6MTkgLQlMTVQJMTg2NyBPY3QgMTgKKwkJCSAtODo1Nzo0MSAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAorCQkJIC04OjAwCS0JUFNUCTE5NDIKKwkJCSAtODowMAlVUwlQJXNUCTE5NDYKKwkJCSAtODowMAktCVBTVAkxOTY5CisJCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAorCQkJIC05OjAwCVVTCUFLJXNUCitab25lIEFtZXJpY2EvWWFrdXRhdAkgMTQ6NDE6MDUgLQlMTVQJMTg2NyBPY3QgMTgKKwkJCSAtOToxODo1NSAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAorCQkJIC05OjAwCS0JWVNUCTE5NDIKKwkJCSAtOTowMAlVUwlZJXNUCTE5NDYKKwkJCSAtOTowMAktCVlTVAkxOTY5CisJCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAorCQkJIC05OjAwCVVTCUFLJXNUCitab25lIEFtZXJpY2EvQW5jaG9yYWdlCSAxNDowMDoyNCAtCUxNVAkxODY3IE9jdCAxOAorCQkJIC05OjU5OjM2IC0JTE1UCTE5MDAgQXVnIDIwIDEyOjAwCisJCQktMTA6MDAJLQlDQVQJMTk0MgorCQkJLTEwOjAwCVVTCUNBVC9DQVdUIDE5NDUgQXVnIDE0IDIzOjAwdQorCQkJLTEwOjAwCVVTCUNBVC9DQVBUIDE5NDYgIyBQZWFjZQorCQkJLTEwOjAwCS0JQ0FUCTE5NjcgQXByCisJCQktMTA6MDAJLQlBSFNUCTE5NjkKKwkJCS0xMDowMAlVUwlBSCVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAorCQkJIC05OjAwCVVTCUFLJXNUCitab25lIEFtZXJpY2EvTm9tZQkgMTI6NTg6MjEgLQlMTVQJMTg2NyBPY3QgMTgKKwkJCS0xMTowMTozOCAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAorCQkJLTExOjAwCS0JTlNUCTE5NDIKKwkJCS0xMTowMAlVUwlOJXNUCTE5NDYKKwkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgorCQkJLTExOjAwCS0JQlNUCTE5NjkKKwkJCS0xMTowMAlVUwlCJXNUCTE5ODMgT2N0IDMwIDI6MDAKKwkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCisJCQkgLTk6MDAJVVMJQUslc1QKK1pvbmUgQW1lcmljYS9BZGFrCSAxMjoxMzoyMSAtCUxNVAkxODY3IE9jdCAxOAorCQkJLTExOjQ2OjM4IC0JTE1UCTE5MDAgQXVnIDIwIDEyOjAwCisJCQktMTE6MDAJLQlOU1QJMTk0MgorCQkJLTExOjAwCVVTCU4lc1QJMTk0NgorCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCisJCQktMTE6MDAJLQlCU1QJMTk2OQorCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgMjowMAorCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgTm92IDMwCisJCQktMTA6MDAJVVMJSEElc1QKKyMgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBkb24ndCBxdWl0ZSBtYWtlIG91ciAxOTcwIGN1dG9mZi4KKyMKKyMgU2hhbmtzIHdyaXRlcyB0aGF0IHBhcnQgb2Ygc291dGh3ZXN0IEFsYXNrYSAoZS5nLiBBbmlhaykKKyMgc3dpdGNoZWQgZnJvbSAtMTE6MDAgdG8gLTEwOjAwIG9uIDE5NjgtMDktMjIgYXQgMDI6MDAsCisjIGFuZCBhbm90aGVyIHBhcnQgKGUuZy4gQWtpYWspIG1hZGUgdGhlIHNhbWUgc3dpdGNoIGZpdmUgd2Vla3MgbGF0ZXIuCisjCisjIEZyb20gRGF2aWQgRmxhdGVyICgyMDA0LTExLTA5KToKKyMgSW4gZS1tYWlsLCAyMDA0LTExLTAyLCBSYXkgSHVkc29uLCBoaXN0b3JpYW4vbGlhaXNvbiB0byB0aGUgVW5hbGFza2EKKyMgSGlzdG9yaWMgUHJlc2VydmF0aW9uIENvbW1pc3Npb24sIHByb3ZpZGVkIHRoaXMgaW5mb3JtYXRpb24sIHdoaWNoCisjIHN1Z2dlc3RzIHRoYXQgVW5hbGFza2EgZGV2aWF0ZWQgZnJvbSBzdGF0dXRvcnkgdGltZSBmcm9tIGVhcmx5IDE5NjcKKyMgcG9zc2libHkgdW50aWwgMTk4MzoKKyMKKyMgIE1pbnV0ZXMgb2YgdGhlIFVuYWxhc2thIENpdHkgQ291bmNpbCBNZWV0aW5nLCBKYW51YXJ5IDEwLCAxOTY3OgorIyAgIkV4Y2VwdCBmb3IgU3QuIFBhdWwgYW5kIEFrdXRhbiwgVW5hbGFza2EgaXMgdGhlIG9ubHkgaW1wb3J0YW50CisjICBsb2NhdGlvbiBub3Qgb24gQWxhc2thIFN0YW5kYXJkIFRpbWUuICBUaGUgZm9sbG93aW5nIHJlc29sdXRpb24gd2FzCisjICBtYWRlIGJ5IFdpbGxpYW0gUm9iaW5zb24gYW5kIHNlY29uZGVkIGJ5IEhlbnJ5IFN3YW5zb246ICBCZSBpdAorIyAgcmVzb2x2ZWQgdGhhdCB0aGUgQ2l0eSBvZiBVbmFsYXNrYSBoZXJlYnkgZ29lcyB0byBBbGFza2EgU3RhbmRhcmQKKyMgIFRpbWUgYXMgb2YgbWlkbmlnaHQgRnJpZGF5LCBKYW51YXJ5IDEzLCAxOTY3ICgxIEEuTS4gU2F0dXJkYXksCisjICBKYW51YXJ5IDE0LCBBbGFza2EgU3RhbmRhcmQgVGltZS4pICBUaGlzIHJlc29sdXRpb24gd2FzIHBhc3NlZCB3aXRoCisjICB0aHJlZSB2b3RlcyBmb3IgYW5kIG9uZSBhZ2FpbnN0LiIKKworIyBIYXdhaWkKKyMKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb246CisjIEFuZCB0aGVuIHRoZXJlJ3MgSGF3YWlpLgorIyBEU1Qgd2FzIG9ic2VydmVkIGZvciBvbmUgZGF5IGluIDE5MzM7CisjIHN0YW5kYXJkIHRpbWUgd2FzIGNoYW5nZWQgYnkgaGFsZiBhbiBob3VyIGluIDE5NDc7CisjIGl0J3MgYWx3YXlzIHN0YW5kYXJkIGFzIG9mIDE5ODYuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQ6CisjIFNoYW5rcyBzYXlzIHRoZSAxOTMzIGV4cGVyaW1lbnQgbGFzdGVkIGZvciB0aHJlZSB3ZWVrcy4gIEdvIHdpdGggU2hhbmtzLgorIworWm9uZSBQYWNpZmljL0hvbm9sdWx1CS0xMDozMToyNiAtCUxNVAkxOTAwIEphbiAgMSAxMjowMAorCQkJLTEwOjMwCS0JSFNUCTE5MzMgQXByIDMwIDI6MDAKKwkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAyOjAwCisJCQktMTA6MzAJVVMJSCVzVAkxOTQ3IEp1biAgOCAyOjAwCisJCQktMTA6MDAJLQlIU1QKKworIyBOb3cgd2UgdHVybiB0byBVUyBhcmVhcyB0aGF0IGhhdmUgZGl2ZXJnZWQgZnJvbSB0aGUgY29uc2Vuc3VzIHNpbmNlIDE5NzAuCisKKyMgQXJpem9uYSBtb3N0bHkgdXNlcyBNU1QuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0xMC0yMCk6CisjCisjIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzdCBvZiB0aGlzIHBhcmFncmFwaCBpcyBkZXJpdmVkIGZyb20gdGhlCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGxhcHIubGliLmF6LnVzL2xpbmtzL2RheWxpZ2h0Lmh0bSI+CisjIERheWxpZ2h0IFNhdmluZyBUaW1lIHdlYiBwYWdlICgyMDAyLTAxLTIzKTwvYT4gbWFpbnRhaW5lZCBieSB0aGUKKyMgQXJpem9uYSBTdGF0ZSBMaWJyYXJ5LCBBcmNoaXZlcyBhbmQgUHVibGljIFJlY29yZHMuCisjIEJldHdlZW4gMTk0NC0wMS0wMSBhbmQgMTk0NC0wNC0wMSB0aGUgU3RhdGUgb2YgQXJpem9uYSB1c2VkIHN0YW5kYXJkCisjIHRpbWUsIGJ1dCBieSBmZWRlcmFsIGxhdyByYWlscm9hZHMsIGFpcmxpbmVzLCBidXMgbGluZXMsIG1pbGl0YXJ5CisjIHBlcnNvbm5lbCwgYW5kIHNvbWUgZW5nYWdlZCBpbiBpbnRlcnN0YXRlIGNvbW1lcmNlIGNvbnRpbnVlZCB0bworIyBvYnNlcnZlIHdhciAoaS5lLiwgZGF5bGlnaHQgc2F2aW5nKSB0aW1lLiAgVGhlIDE5NDQtMDMtMTcgUGhvZW5peAorIyBHYXpldHRlIHNheXMgdGhhdCB3YXMgdGhlIGRhdGUgdGhlIGxhdyBjaGFuZ2VkLCBhbmQgdGhhdCAwNC0wMSB3YXMKKyMgdGhlIGRhdGUgdGhlIHN0YXRlJ3MgY2xvY2tzIHdvdWxkIGNoYW5nZS4gIEluIDE5NDUgdGhlIFN0YXRlIG9mCisjIEFyaXpvbmEgdXNlZCBzdGFuZGFyZCB0aW1lIGFsbCB5ZWFyLCBhZ2FpbiB3aXRoIGV4Y2VwdGlvbnMgb25seSBhcworIyBtYW5kYXRlZCBieSBmZWRlcmFsIGxhdy4gIEFyaXpvbmEgb2JzZXJ2ZWQgRFNUIGluIDE5NjcsIGJ1dCBBcml6b25hCisjIExhd3MgMTk2OCwgY2guIDE4MyAoZWZmZWN0aXZlIDE5NjgtMDMtMjEpIHJlcGVhbGVkIERTVC4KKyMKKyMgU2hhbmtzIHNheXMgdGhlIDE5NDQgZXhwZXJpbWVudCBjYW1lIHRvIGFuIGVuZCBvbiAxOTQ0LTAzLTE3LgorIyBHbyB3aXRoIHRoZSBBcml6b25hIFN0YXRlIExpYnJhcnkgaW5zdGVhZC4KKworWm9uZSBBbWVyaWNhL1Bob2VuaXgJLTc6Mjg6MTggLQlMTVQJMTg4MyBOb3YgMTggMTE6MzE6NDIKKwkJCS03OjAwCVVTCU0lc1QJMTk0NCBKYW4gIDEgMDA6MDEKKwkJCS03OjAwCS0JTVNUCTE5NDQgQXByICAxIDAwOjAxCisJCQktNzowMAlVUwlNJXNUCTE5NDQgT2N0ICAxIDAwOjAxCisJCQktNzowMAktCU1TVAkxOTY3CisJCQktNzowMAlVUwlNJXNUCTE5NjggTWFyIDIxCisJCQktNzowMAktCU1TVAorIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OC0wMi0xMyk6CisjIEEgd3JpdGVyIGZyb20gdGhlIEludGVyIFRyaWJhbCBDb3VuY2lsIG9mIEFyaXpvbmEsIEluYy4sCisjIG5vdGVzIGluIHByaXZhdGUgY29ycmVzcG9uZGVuY2UgZGF0ZWQgMTk4Ny0xMi0yOCB0aGF0ICJQcmVzZW50bHksIG9ubHkgdGhlCisjIE5hdmFqbyBOYXRpb24gcGFydGljaXBhdGVzIGluIHRoZSBEYXlsaWdodCBTYXZpbmcgVGltZSBwb2xpY3ksIGR1ZSB0byBpdHMKKyMgbGFyZ2Ugc2l6ZSBhbmQgbG9jYXRpb24gaW4gdGhyZWUgc3RhdGVzLiIgIChUaGUgIm9ubHkiIG1lYW5zIHRoYXQgb3RoZXIKKyMgdHJpYmFsIG5hdGlvbnMgZG9uJ3QgdXNlIERTVC4pCisKK0xpbmsgQW1lcmljYS9EZW52ZXIgQW1lcmljYS9TaGlwcm9jaworCisjIFNvdXRoZXJuIElkYWhvIChBZGEsIEFkYW1zLCBCYW5ub2NrLCBCZWFyIExha2UsIEJpbmdoYW0sIEJsYWluZSwKKyMgQm9pc2UsIEJvbm5ldmlsbGUsIEJ1dHRlLCBDYW1hcywgQ2FueW9uLCBDYXJpYm91LCBDYXNzaWEsIENsYXJrLAorIyBDdXN0ZXIsIEVsbW9yZSwgRnJhbmtsaW4sIEZyZW1vbnQsIEdlbSwgR29vZGluZywgSmVmZmVyc29uLCBKZXJvbWUsCisjIExlbWhpLCBMaW5jb2xuLCBNYWRpc29uLCBNaW5pZG9rYSwgT25laWRhLCBPd3loZWUsIFBheWV0dGUsIFBvd2VyLAorIyBUZXRvbiwgVHdpbiBGYWxscywgVmFsbGV5LCBXYXNoaW5ndG9uIGNvdW50aWVzLCBhbmQgdGhlIHNvdXRoZXJuCisjIHF1YXJ0ZXIgb2YgSWRhaG8gY291bnR5KSBhbmQgZWFzdGVybiBPcmVnb24gKG1vc3Qgb2YgTWFsaGV1ciBDb3VudHkpCisjIHN3aXRjaGVkIGZvdXIgd2Vla3MgbGF0ZSBpbiAxOTc0LgorIworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0JvaXNlCS03OjQ0OjQ5IC0JTE1UCTE4ODMgTm92IDE4IDEyOjE1OjExCisJCQktODowMAlVUwlQJXNUCTE5MjMgTWF5IDEzIDI6MDAKKwkJCS03OjAwCVVTCU0lc1QJMTk3NAorCQkJLTc6MDAJLQlNU1QJMTk3NCBGZWIgIDMgMjowMAorCQkJLTc6MDAJVVMJTSVzVAorCisjIEluZGlhbmEKKyMKKyMgRm9yIGEgbWFwIG9mIEluZGlhbmEncyB0aW1lIHpvbmUgcmVnaW9ucywgc2VlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jY3NjLmVkdS90aW1lLmh0bWwiPgorIyBXaGF0IHRpbWUgaXMgaXQgaW4gSW5kaWFuYT8KKyMgPC9hPiAoMjAwNi0wMy0wMSkKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wOC0xNyk6CisjIFNpbmNlIDE5NzAsIG1vc3Qgb2YgSW5kaWFuYSBoYXMgYmVlbiBsaWtlIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMsCisjIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorIworIyAtIEdpYnNvbiwgSmFzcGVyLCBMYWtlLCBMYVBvcnRlLCBOZXd0b24sIFBvcnRlciwgUG9zZXksIFNwZW5jZXIsCisjICAgVmFuZGVuYnVyZ2gsIGFuZCBXYXJyaWNrIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvQ2hpY2Fnby4KKyMKKyMgLSBEZWFyYm9ybiBhbmQgT2hpbyBjb3VudGllcyBoYXZlIGJlZW4gbGlrZSBBbWVyaWNhL05ld19Zb3JrLgorIworIyAtIENsYXJrLCBGbG95ZCwgYW5kIEhhcnJpc29uIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlCisjICAgQW1lcmljYS9LZW50dWNreS9Mb3Vpc3ZpbGxlLgorIworIyAtIENyYXdmb3JkLCBEYXZpZXNzLCBEdWJvaXMsIEtub3gsIE1hcnRpbiwgUGVycnksIFBpa2UsIFB1bGFza2ksIFN0YXJrZSwKKyMgICBhbmQgU3dpdHplcmxhbmQgY291bnRpZXMgaGF2ZSB0aGVpciBvd24gdGltZSB6b25lIGhpc3RvcmllcyBhcyBub3RlZCBiZWxvdy4KKyMKKyMgU2hhbmtzIHBhcnRpdGlvbmVkIEluZGlhbmEgaW50byAzNDUgcmVnaW9ucywgZWFjaCB3aXRoIGl0cyBvd24gdGltZSBoaXN0b3J5LAorIyBhbmQgd3JvdGUgYGBFdmVuIG5ld3NwYXBlciByZXBvcnRzIHByZXNlbnQgY29udHJhZGljdG9yeSBpbmZvcm1hdGlvbi4nJworIyBUaG9zZSBIb29zaWVycyEgIFN1Y2ggYSBmbGlnaHR5IGFuZCBjaGFuZ2VhYmxlIHBlb3BsZSEKKyMgRm9ydHVuYXRlbHksIG1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgb2NjdXJyZWQgYmVmb3JlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLgorIworIyBPdGhlciB0aGFuIEluZGlhbmFwb2xpcywgdGhlIEluZGlhbmEgcGxhY2UgbmFtZXMgYXJlIHNvIG5vbmRlc2NyaXB0CisjIHRoYXQgdGhleSB3b3VsZCBiZSBhbWJpZ3VvdXMgaWYgd2UgbGVmdCB0aGVtIGF0IHRoZSBgQW1lcmljYScgbGV2ZWwuCisjIFNvIHdlIHJlbHVjdGFudGx5IHB1dCB0aGVtIGFsbCBpbiBhIHN1YmRpcmVjdG9yeSBgQW1lcmljYS9JbmRpYW5hJy4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE2KToKKyMgaHR0cDovL3d3dy5tY2NzYy5lZHUvdGltZS5odG1sIHNheXMgdGhhdCBJbmRpYW5hIHdpbGwgdXNlIERTVCBzdGFydGluZyAyMDA2LgorCisjIEZyb20gTmF0aGFuIFN0cmF0dG9uIFRyZWFkd2F5ICgyMDA2LTAzLTMwKToKKyMgaHR0cDovL3d3dy5kb3QuZ292L2FmZmFpcnMvZG90MDQwNi5odG0gWzM3MDUgQl0KKyMgRnJvbSBEZWJvcmFoIEdvbGRzbWl0aCAoMjAwNi0wMS0xOCk6CisjIGh0dHA6Ly9kbXNlcy5kb3QuZ292L2RvY2ltYWdlcy9wZGY5NS8zODIzMjlfd2ViLnBkZiBbMi45IE1CXQorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAxLTIwKToKKyMgSXQgc2F5cyAiRE9UIGlzIHJlbG9jYXRpbmcgdGhlIHRpbWUgem9uZSBib3VuZGFyeSBpbiBJbmRpYW5hIHRvIG1vdmUgU3RhcmtlLAorIyBQdWxhc2tpLCBLbm94LCBEYXZpZXNzLCBNYXJ0aW4sIFBpa2UsIER1Ym9pcywgYW5kIFBlcnJ5IENvdW50aWVzIGZyb20gdGhlCisjIEVhc3Rlcm4gVGltZSBab25lIHRvIHRoZSBDZW50cmFsIFRpbWUgWm9uZS4uLi4gVGhlIGVmZmVjdGl2ZSBkYXRlIG9mCisjIHRoaXMgcnVsZSBpcyAyOk9PIGEubS4gRVNUIFN1bmRheSwgQXByaWwgMiwgMjAwNiwgd2hpY2ggaXMgdGhlCisjIGNoYW5nZW92ZXIgZGF0ZSBmcm9tIHN0YW5kYXJkIHRpbWUgdG8gRGF5bGlnaHQgU2F2aW5nIFRpbWUuIgorIyBTdHJpY3RseSBzcGVha2luZywgdGhpcyBtZWFucyB0aGUgYWZmZWN0ZWQgY291bnRpZXMgd2lsbCBjaGFuZ2UgdGhlaXIKKyMgY2xvY2tzIHR3aWNlIHRoYXQgbmlnaHQsIGJ1dCB0aGlzIG9idmlvdXNseSBpcyBpbiBlcnJvci4gIFRoZSBpbnRlbnQKKyMgaXMgdGhhdCAwMTo1OTo1OSBFU1QgYmUgZm9sbG93ZWQgYnkgMDI6MDA6MDAgQ0RULgorCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDctMDItMTApOgorIyBUaGUgQXNzb2NpYXRlZCBQcmVzcyBoYXMgYmVlbiByZXBvcnRpbmcgdGhhdCBQdWxhc2tpIENvdW50eSwgSW5kaWFuYSBpcworIyBnb2luZyB0byBzd2l0Y2ggZnJvbSBDZW50cmFsIHRvIEVhc3Rlcm4gVGltZSBvbiBNYXJjaCAxMSwgMjAwNy4uLi4KKyMgaHR0cDovL3d3dy5pbmR5c3Rhci5jb20vYXBwcy9wYmNzLmRsbC9hcnRpY2xlP0FJRD0vMjAwNzAyMDcvTE9DQUwxOTAxMDgvNzAyMDcwNTI0LzAvTE9DQUwKKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCitSdWxlIEluZGlhbmFwb2xpcyAxOTQxCW9ubHkJLQlKdW4JMjIJMjowMAkxOjAwCUQKK1J1bGUgSW5kaWFuYXBvbGlzIDE5NDEJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlIEluZGlhbmFwb2xpcyAxOTQ2CTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzIC01OjQ0OjM4IC0gTE1UIDE4ODMgTm92IDE4IDEyOjE1OjIyCisJCQktNjowMAlVUwlDJXNUCTE5MjAKKwkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NDIKKwkJCS02OjAwCVVTCUMlc1QJMTk0NgorCQkJLTY6MDAgSW5kaWFuYXBvbGlzIEMlc1QJMTk1NSBBcHIgMjQgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk1NyBTZXAgMjkgMjowMAorCQkJLTY6MDAJLQlDU1QJMTk1OCBBcHIgMjcgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2OQorCQkJLTU6MDAJVVMJRSVzVAkxOTcxCisJCQktNTowMAktCUVTVAkyMDA2CisJCQktNTowMAlVUwlFJXNUCisjCisjIEVhc3Rlcm4gQ3Jhd2ZvcmQgQ291bnR5LCBJbmRpYW5hLCBsZWZ0IGl0cyBjbG9ja3MgYWxvbmUgaW4gMTk3NCwKKyMgYXMgd2VsbCBhcyBmcm9tIDE5NzYgdGhyb3VnaCAyMDA1LgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCitSdWxlCU1hcmVuZ28JMTk1MQlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJTWFyZW5nbwkxOTUxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlNYXJlbmdvCTE5NTQJMTk2MAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCU1hcmVuZ28JMTk1NAkxOTYwCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9JbmRpYW5hL01hcmVuZ28gLTU6NDU6MjMgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTQ6MzcKKwkJCS02OjAwCVVTCUMlc1QJMTk1MQorCQkJLTY6MDAJTWFyZW5nbwlDJXNUCTE5NjEgQXByIDMwIDI6MDAKKwkJCS01OjAwCS0JRVNUCTE5NjkKKwkJCS01OjAwCVVTCUUlc1QJMTk3NCBKYW4gIDYgMjowMAorCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgMjowMAorCQkJLTU6MDAJVVMJRSVzVAkxOTc2CisJCQktNTowMAktCUVTVAkyMDA2CisJCQktNTowMAlVUwlFJXNUCisjCisjIERhdmllc3MsIER1Ym9pcywgS25veCwgYW5kIE1hcnRpbiBDb3VudGllcywgSW5kaWFuYSwKKyMgc3dpdGNoZWQgZnJvbSBlYXN0ZXJuIHRvIGNlbnRyYWwgdGltZSBpbiBBcHJpbCAyMDA2LCB0aGVuIHN3aXRjaGVkIGJhY2sKKyMgaW4gTm92ZW1iZXIgMjAwNy4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZSBWaW5jZW5uZXMJMTk0Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUgVmluY2VubmVzCTE5NDYJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlIFZpbmNlbm5lcwkxOTUzCTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZSBWaW5jZW5uZXMJMTk1MwkxOTU5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUgVmluY2VubmVzCTE5NTUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAorUnVsZSBWaW5jZW5uZXMJMTk1NgkxOTYzCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUgVmluY2VubmVzCTE5NjAJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlIFZpbmNlbm5lcwkxOTYxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZSBWaW5jZW5uZXMJMTk2MgkxOTYzCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9JbmRpYW5hL1ZpbmNlbm5lcyAtNTo1MDowNyAtIExNVAkxODgzIE5vdiAxOCAxMjowOTo1MworCQkJLTY6MDAJVVMJQyVzVAkxOTQ2CisJCQktNjowMCBWaW5jZW5uZXMJQyVzVAkxOTY0IEFwciAyNiAyOjAwCisJCQktNTowMAktCUVTVAkxOTY5CisJCQktNTowMAlVUwlFJXNUCTE5NzEKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgMjowMAorCQkJLTU6MDAJVVMJRSVzVAorIworIyBQZXJyeSBDb3VudHksIEluZGlhbmEsIHN3aXRjaGVkIGZyb20gZWFzdGVybiB0byBjZW50cmFsIHRpbWUgaW4gQXByaWwgMjAwNi4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZSBQZXJyeQkxOTQ2CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZSBQZXJyeQkxOTQ2CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZSBQZXJyeQkxOTUzCTE5NTQJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZSBQZXJyeQkxOTUzCTE5NTkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZSBQZXJyeQkxOTU1CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKK1J1bGUgUGVycnkJMTk1NgkxOTYzCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUgUGVycnkJMTk2MAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUgUGVycnkJMTk2MQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUgUGVycnkJMTk2MgkxOTYzCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9JbmRpYW5hL1RlbGxfQ2l0eSAtNTo0NzowMyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMjo1NworCQkJLTY6MDAJVVMJQyVzVAkxOTQ2CisJCQktNjowMCBQZXJyeQlDJXNUCTE5NjQgQXByIDI2IDI6MDAKKwkJCS01OjAwCS0JRVNUCTE5NjkKKwkJCS01OjAwCVVTCUUlc1QJMTk3MQorCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgMjowMAorCQkJLTY6MDAJVVMJQyVzVAorIworIyBQaWtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5NzcsCisjIHRoZW4gc3dpdGNoZWQgYmFjayBpbiAyMDA2LCB0aGVuIHN3aXRjaGVkIGJhY2sgYWdhaW4gaW4gMjAwNy4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZQlQaWtlCTE5NTUJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAorUnVsZQlQaWtlCTE5NTUJMTk2MAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVBpa2UJMTk1NgkxOTY0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJUGlrZQkxOTYxCTE5NjQJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZyAtNTo0OTowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMDo1MworCQkJLTY6MDAJVVMJQyVzVAkxOTU1CisJCQktNjowMAlQaWtlCUMlc1QJMTk2NSBBcHIgMjUgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgMjowMAorCQkJLTY6MDAJVVMJQyVzVAkxOTc3IE9jdCAzMCAyOjAwCisJCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0IDI6MDAKKwkJCS01OjAwCVVTCUUlc1QKKyMKKyMgU3RhcmtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5OTEsCisjIHRoZW4gc3dpdGNoZWQgYmFjayBpbiAyMDA2LgorIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5MS0xMC0yOCk6CisjIEFuIGFydGljbGUgb24gcGFnZSBBMyBvZiB0aGUgU3VuZGF5LCAxOTkxLTEwLTI3IFdhc2hpbmd0b24gUG9zdAorIyBub3RlcyB0aGF0IFN0YXJrZSBDb3VudHkgc3dpdGNoZWQgZnJvbSBDZW50cmFsIHRpbWUgdG8gRWFzdGVybiB0aW1lIGFzIG9mCisjIDE5OTEtMTAtMjcuCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKK1J1bGUJU3RhcmtlCTE5NDcJMTk2MQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVN0YXJrZQkxOTQ3CTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlTdGFya2UJMTk1NQkxOTU2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJU3RhcmtlCTE5NTcJMTk1OAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVN0YXJrZQkxOTU5CTE5NjEJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0luZGlhbmEvS25veCAtNTo0NjozMCAtCUxNVAkxODgzIE5vdiAxOCAxMjoxMzozMAorCQkJLTY6MDAJVVMJQyVzVAkxOTQ3CisJCQktNjowMAlTdGFya2UJQyVzVAkxOTYyIEFwciAyOSAyOjAwCisJCQktNTowMAktCUVTVAkxOTYzIE9jdCAyNyAyOjAwCisJCQktNjowMAlVUwlDJXNUCTE5OTEgT2N0IDI3IDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QKKyMKKyMgUHVsYXNraSBDb3VudHksIEluZGlhbmEsIHN3aXRjaGVkIGZyb20gZWFzdGVybiB0byBjZW50cmFsIHRpbWUgaW4KKyMgQXByaWwgMjAwNiBhbmQgdGhlbiBzd2l0Y2hlZCBiYWNrIGluIE1hcmNoIDIwMDcuCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKK1J1bGUJUHVsYXNraQkxOTQ2CTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlQdWxhc2tpCTE5NDYJMTk1NAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVB1bGFza2kJMTk1NQkxOTU2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJUHVsYXNraQkxOTU3CTE5NjAJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0luZGlhbmEvV2luYW1hYyAtNTo0NjoyNSAtIExNVAkxODgzIE5vdiAxOCAxMjoxMzozNQorCQkJLTY6MDAJVVMJQyVzVAkxOTQ2CisJCQktNjowMAlQdWxhc2tpCUMlc1QJMTk2MSBBcHIgMzAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2OQorCQkJLTU6MDAJVVMJRSVzVAkxOTcxCisJCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNjowMAlVUwlDJXNUCTIwMDcgTWFyIDExIDI6MDAKKwkJCS01OjAwCVVTCUUlc1QKKyMKKyMgU3dpdHplcmxhbmQgQ291bnR5LCBJbmRpYW5hLCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3MyB0aHJvdWdoIDIwMDUuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvSW5kaWFuYS9WZXZheSAtNTo0MDoxNiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxOTo0NAorCQkJLTY6MDAJVVMJQyVzVAkxOTU0IEFwciAyNSAyOjAwCisJCQktNTowMAktCUVTVAkxOTY5CisJCQktNTowMAlVUwlFJXNUCTE5NzMKKwkJCS01OjAwCS0JRVNUCTIwMDYKKwkJCS01OjAwCVVTCUUlc1QKKworIyBQYXJ0IG9mIEtlbnR1Y2t5IGxlZnQgaXRzIGNsb2NrcyBhbG9uZSBpbiAxOTc0LgorIyBUaGlzIGFsc28gaW5jbHVkZXMgQ2xhcmssIEZsb3lkLCBhbmQgSGFycmlzb24gY291bnRpZXMgaW4gSW5kaWFuYS4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZSBMb3Vpc3ZpbGxlCTE5MjEJb25seQktCU1heQkxCTI6MDAJMTowMAlECitSdWxlIExvdWlzdmlsbGUJMTkyMQlvbmx5CS0JU2VwCTEJMjowMAkwCVMKK1J1bGUgTG91aXN2aWxsZQkxOTQxCTE5NjEJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZSBMb3Vpc3ZpbGxlCTE5NDEJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlIExvdWlzdmlsbGUJMTk0Nglvbmx5CS0JSnVuCTIJMjowMAkwCVMKK1J1bGUgTG91aXN2aWxsZQkxOTUwCTE5NTUJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZSBMb3Vpc3ZpbGxlCTE5NTYJMTk2MAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvS2VudHVja3kvTG91aXN2aWxsZSAtNTo0MzowMiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxNjo1OAorCQkJLTY6MDAJVVMJQyVzVAkxOTIxCisJCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk0MgorCQkJLTY6MDAJVVMJQyVzVAkxOTQ2CisJCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk2MSBKdWwgMjMgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2OAorCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAyOjAwCisJCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAyOjAwCisJCQktNTowMAlVUwlFJXNUCisjCisjIFdheW5lIENvdW50eSwgS2VudHVja3kKKyMKKyMgRnJvbQorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmxha2UtY3VtYmVybGFuZC5jb20vbGlmZS9hcmNoaXZlL25ld3M5OTAxMjl0aW1lLnNodG1sIj4KKyMgTGFrZSBDdW1iZXJsYW5kIExJRkUKKyMgPC9hPiAoMTk5OS0wMS0yOSkgdmlhIFdLWU0tMTAxLjc6CisjIENsaW50b24gQ291bnR5IGhhcyBqb2luZWQgV2F5bmUgQ291bnR5IGluIGFza2luZyB0aGUgRG9UIHRvIGNoYW5nZSBmcm9tCisjIHRoZSBDZW50cmFsIHRvIHRoZSBFYXN0ZXJuIHRpbWUgem9uZS4uLi4gIFRoZSBXYXluZSBDb3VudHkgZ292ZXJubWVudCBtYWRlCisjIHRoZSBzYW1lIHJlcXVlc3QgaW4gRGVjZW1iZXIuICBBbmQgd2hpbGUgUnVzc2VsbCBDb3VudHkgb2ZmaWNpYWxzIGhhdmUgbm90CisjIHRha2VuIGFjdGlvbiwgdGhlIG1ham9yaXR5IG9mIHJlc3BvbmRlbnRzIHRvIGEgcG9sbCBjb25kdWN0ZWQgdGhlcmUgaW4KKyMgQXVndXN0IGluZGljYXRlZCB0aGV5IHdvdWxkIGxpa2UgdG8gY2hhbmdlIHRvICJmYXN0IHRpbWUiIGFsc28uCisjIFRoZSB0aHJlZSBMYWtlIEN1bWJlcmxhbmQgY291bnRpZXMgYXJlIHRoZSBmYXJ0aGVzdCBlYXN0IG9mIGFueSBVLlMuCisjIGxvY2F0aW9uIGluIHRoZSBDZW50cmFsIHRpbWUgem9uZS4KKyMKKyMgRnJvbSBSaWNoIFdhbGVzICgyMDAwLTA4LTI5KToKKyMgQWZ0ZXIgcHJvbG9uZ2VkIGRlYmF0ZSwgYW5kIGRlc3BpdGUgY29udGludWluZyBkZWVwIGRpZmZlcmVuY2VzIG9mIG9waW5pb24sCisjIFdheW5lIENvdW50eSAoY2VudHJhbCBLZW50dWNreSkgaXMgc3dpdGNoaW5nIGZyb20gQ2VudHJhbCAoLTA2MDApIHRvIEVhc3Rlcm4KKyMgKC0wNTAwKSB0aW1lLiAgVGhleSB3b24ndCAiZmFsbCBiYWNrIiB0aGlzIHllYXIuICBTZWUgU2FyYSBTaGlwbGV5LAorIyBUaGUgZGlmZmVyZW5jZSBhbiBob3VyIG1ha2VzLCBOYW5kbyBUaW1lcyAoMjAwMC0wOC0yOSAxNTozMyAtMDQwMCkuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDctMTYpOgorIyBUaGUgZmluYWwgcnVsZSB3YXMgcHVibGlzaGVkIGluIHRoZQorIyA8YSBocmVmPSJodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MjAwMF9yZWdpc3RlciZkb2NpZD1mcjE3YXUwMC0yMiI+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjUsIDE2MCAoMjAwMC0wOC0xNyksIHBhZ2UgNTAxNTQtNTAxNTguCisjIDwvYT4KKyMKK1pvbmUgQW1lcmljYS9LZW50dWNreS9Nb250aWNlbGxvIC01OjM5OjI0IC0gTE1UCTE4ODMgTm92IDE4IDEyOjIwOjM2CisJCQktNjowMAlVUwlDJXNUCTE5NDYKKwkJCS02OjAwCS0JQ1NUCTE5NjgKKwkJCS02OjAwCVVTCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCVVTCUUlc1QKKworCisjIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMDgtMzApOgorIyBIZXJlIC4uLiBhcmUgYWxsIHRoZSBjaGFuZ2VzIGluIHRoZSBVUyBzaW5jZSAxOTg1LgorIyBLZWFybnkgQ291bnR5LCBLUyAocHV0IGFsbCBvZiBjb3VudHkgb24gY2VudHJhbDsKKyMJcHJldmlvdXNseSBzcGxpdCBiZXR3ZWVuIE1TVCBhbmQgQ1NUKSAuLi4gMTk5MC0xMAorIyBTdGFya2UgQ291bnR5LCBJTiAoZnJvbSBDU1QgdG8gRVNUKSAuLi4gMTk5MS0xMAorIyBPbGl2ZXIgQ291bnR5LCBORCAoZnJvbSBNU1QgdG8gQ1NUKSAuLi4gMTk5Mi0xMAorIyBXZXN0IFdlbmRvdmVyLCBOViAoZnJvbSBQU1QgVE8gTVNUKSAuLi4gMTk5OS0xMAorIyBXYXluZSBDb3VudHksIEtZIChmcm9tIENTVCB0byBFU1QpIC4uLiAyMDAwLTEwCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDctMTcpOgorIyBXZSBkb24ndCBrbm93IHdoZXJlIHRoZSBsaW5lIHVzZWQgdG8gYmUgd2l0aGluIEtlYXJueSBDb3VudHksIEtTLAorIyBzbyBvbWl0IHRoYXQgY2hhbmdlIGZvciBub3cuCisjIFNlZSBBbWVyaWNhL0luZGlhbmEvS25veCBmb3IgdGhlIFN0YXJrZSBDb3VudHksIElOIGNoYW5nZS4KKyMgU2VlIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0NlbnRlciBmb3IgdGhlIE9saXZlciBDb3VudHksIE5EIGNoYW5nZS4KKyMgV2VzdCBXZW5kb3ZlciwgTlYgb2ZmaWNpYWxseSBzd2l0Y2hlZCBmcm9tIFBhY2lmaWMgdG8gbW91bnRhaW4gdGltZSBvbgorIyAxOTk5LTEwLTMxLiAgU2VlIHRoZQorIyA8YSBocmVmPSJodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MTk5OV9yZWdpc3RlciZkb2NpZD1mcjIxb2M5OS0xNSI+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjQsIDIwMyAoMTk5OS0xMC0yMSksIHBhZ2UgNTY3MDUtNTY3MDcuCisjIDwvYT4KKyMgSG93ZXZlciwgdGhlIEZlZGVyYWwgUmVnaXN0ZXIgc2F5cyB0aGF0IFdlc3QgV2VuZG92ZXIgYWxyZWFkeSBvcGVyYXRlZAorIyBvbiBtb3VudGFpbiB0aW1lLCBhbmQgdGhlIHJ1bGUgbWVyZWx5IG1hZGUgdGhpcyBvZmZpY2lhbDsKKyMgaGVuY2UgYSBzZXBhcmF0ZSB0eiBlbnRyeSBpcyBub3QgbmVlZGVkLgorCisjIE1pY2hpZ2FuCisjCisjIEZyb20gQm9iIERldmluZSAoMTk4OC0wMS0yOCk6CisjIE1pY2hpZ2FuIGRpZG4ndCBvYnNlcnZlIERTVCBmcm9tIDE5NjggdG8gMTk3My4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wMy0zMSk6CisjIFNoYW5rcyB3cml0ZXMgdGhhdCBNaWNoaWdhbiBzdGFydGVkIHVzaW5nIHN0YW5kYXJkIHRpbWUgb24gMTg4NS0wOS0xOCwKKyMgYnV0IEhvd3NlIHdyaXRlcyAocHAgMTI0LTEyNSwgcmVmZXJyaW5nIHRvIFBvcHVsYXIgQXN0cm9ub215LCAxOTAxLTAxKQorIyB0aGF0IERldHJvaXQga2VwdAorIworIwlsb2NhbCB0aW1lIHVudGlsIDE5MDAgd2hlbiB0aGUgQ2l0eSBDb3VuY2lsIGRlY3JlZWQgdGhhdCBjbG9ja3Mgc2hvdWxkCisjCWJlIHB1dCBiYWNrIHR3ZW50eS1laWdodCBtaW51dGVzIHRvIENlbnRyYWwgU3RhbmRhcmQgVGltZS4gIEhhbGYgdGhlCisjCWNpdHkgb2JleWVkLCBoYWxmIHJlZnVzZWQuICBBZnRlciBjb25zaWRlcmFibGUgZGViYXRlLCB0aGUgZGVjaXNpb24KKyMJd2FzIHJlc2NpbmRlZCBhbmQgdGhlIGNpdHkgcmV2ZXJ0ZWQgdG8gU3VuIHRpbWUuICBBIGRlcmlzaXZlIG9mZmVyIHRvCisjCWVyZWN0IGEgc3VuZGlhbCBpbiBmcm9udCBvZiB0aGUgY2l0eSBoYWxsIHdhcyByZWZlcnJlZCB0byB0aGUKKyMJQ29tbWl0dGVlIG9uIFNld2Vycy4gIFRoZW4sIGluIDE5MDUsIENlbnRyYWwgdGltZSB3YXMgYWRvcHRlZAorIwlieSBjaXR5IHZvdGUuCisjCisjIFRoaXMgc3RvcnkgaXMgdG9vIGVudGVydGFpbmluZyB0byBiZSBmYWxzZSwgc28gZ28gd2l0aCBIb3dzZSBvdmVyIFNoYW5rcy4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wNik6CisjIEdhcmxhbmQgKDE5MjcpIHdyaXRlcyBgYENsZXZlbGFuZCBhbmQgRGV0cm9pdCBhZHZhbmNlZCB0aGVpciBjbG9ja3MKKyMgb25lIGhvdXIgaW4gMTkxNC4nJyAgVGhpcyBjaGFuZ2UgaXMgbm90IGluIFNoYW5rcy4gIFdlIGhhdmUgbm8gbW9yZQorIyBpbmZvLCBzbyBvbWl0IHRoaXMgZm9yIG5vdy4KKyMKKyMgTW9zdCBvZiBNaWNoaWdhbiBvYnNlcnZlZCBEU1QgZnJvbSAxOTczIG9uLCBidXQgd2FzIGEgYml0IGxhdGUgaW4gMTk3NS4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZQlEZXRyb2l0CTE5NDgJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCURldHJvaXQJMTk0OAlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJRGV0cm9pdAkxOTY3CW9ubHkJLQlKdW4JMTQJMjowMAkxOjAwCUQKK1J1bGUJRGV0cm9pdAkxOTY3CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0RldHJvaXQJLTU6MzI6MTEgLQlMTVQJMTkwNQorCQkJLTY6MDAJLQlDU1QJMTkxNSBNYXkgMTUgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk0MgorCQkJLTU6MDAJVVMJRSVzVAkxOTQ2CisJCQktNTowMAlEZXRyb2l0CUUlc1QJMTk3MworCQkJLTU6MDAJVVMJRSVzVAkxOTc1CisJCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAyOjAwCisJCQktNTowMAlVUwlFJXNUCisjCisjIERpY2tpbnNvbiwgR29nZWJpYywgSXJvbiwgYW5kIE1lbm9taW5lZSBDb3VudGllcywgTWljaGlnYW4sCisjIHN3aXRjaGVkIGZyb20gRVNUIHRvIENTVC9DRFQgaW4gMTk3My4KKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgorUnVsZSBNZW5vbWluZWUJMTk0Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUgTWVub21pbmVlCTE5NDYJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlIE1lbm9taW5lZQkxOTY2CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZSBNZW5vbWluZWUJMTk2Nglvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9NZW5vbWluZWUJLTU6NTA6MjcgLQlMTVQJMTg4NSBTZXAgMTggMTI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMTk0NgorCQkJLTY6MDAgTWVub21pbmVlCUMlc1QJMTk2OSBBcHIgMjcgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk3MyBBcHIgMjkgMjowMAorCQkJLTY6MDAJVVMJQyVzVAorCisjIE5hdmFzc2EKKyMgYWRtaW5pc3RlcmVkIGJ5IHRoZSBVUyBGaXNoIGFuZCBXaWxkbGlmZSBTZXJ2aWNlCisjIGNsYWltZWQgYnkgVVMgdW5kZXIgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIDE4NTYgR3Vhbm8gSXNsYW5kcyBBY3QKKyMgYWxzbyBjbGFpbWVkIGJ5IEhhaXRpCisjIG9jY3VwaWVkIDE4NTcvMTkwMCBieSB0aGUgTmF2YXNzYSBQaG9zcGhhdGUgQ28KKyMgVVMgbGlnaHRob3VzZSAxOTE3LzE5OTYtMDkKKyMgY3VycmVudGx5IHVuaW5oYWJpdGVkCisjIHNlZSBNYXJrIEZpbmVtYW4sIGBgQW4gSXNsZSBSaWNoIGluIEd1YW5vIGFuZCBEaXNjb3JkJycsCisjIF9Mb3MgQW5nZWxlcyBUaW1lc18gKDE5OTgtMTEtMTApLCBBMSwgQTEwOyBpdCBjaXRlcworIyBKaW1teSBTa2FnZ3MsIF9UaGUgR3JlYXQgR3Vhbm8gUnVzaF8gKDE5OTQpLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcworIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCisjIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCisjCisjIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKKyMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0CisjIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKKyMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKKyMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCisjCisjIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgorIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCisjCisjIE90aGVyIHNvdXJjZXMgb2NjYXNpb25hbGx5IHVzZWQgaW5jbHVkZToKKyMKKyMJRWR3YXJkIFcuIFdoaXRtYW4sIFdvcmxkIFRpbWUgRGlmZmVyZW5jZXMsCisjCVdoaXRtYW4gUHVibGlzaGluZyBDbywgMiBOaWFnYXJhIEF2LCBFYWxpbmcsIExvbmRvbiAodW5kYXRlZCksCisjCXdoaWNoIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KKyMKKyMJPGEgaHJlZj0iaHR0cDovL3d3dy5wZXR0c3dvb2R2aWxsYWdlLmNvLnVrL0RheWxpZ2h0X1NhdmluZ3NfV2lsbGlhbV9XaWxsZXR0LnBkZiI+CisjCVdpbGxpYW0gV2lsbGV0dCwgVGhlIFdhc3RlIG9mIERheWxpZ2h0LCAxOXRoIGVkaXRpb24KKyMJPC9hPiAoMTkxNC0wMykKKyMKKyMgU2VlIHRoZSBgZXVyb3BlJyBmaWxlIGZvciBHcmVlbmxhbmQuCisKKyMgQ2FuYWRhCisKKyMgRnJvbSBBbGFpbiBMYUJvbnQ8ZSc+ICgxOTk0LTExLTE0KToKKyMgSSBwb3N0IGhlcmUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHN0YW5kYXJkaXplZCBpbiBDYW5hZGEKKyMgZm9yIGJvdGggRW5nbGlzaCBhbmQgRnJlbmNoIGluIHRoZSBDQU4vQ1NBLVoyMzQuNC04OSBzdGFuZGFyZC4uLi4KKyMKKyMJVVRDCVN0YW5kYXJkIHRpbWUJRGF5bGlnaHQgc2F2aW5ncyB0aW1lCisjCW9mZnNldAlGcmVuY2gJRW5nbGlzaAlGcmVuY2gJRW5nbGlzaAorIwktMjozMAktCS0JSEFUCU5EVAorIwktMwktCS0JSEFBCUFEVAorIwktMzozMAlITlQJTlNUCS0JLQorIwktNAlITkEJQVNUCUhBRQlFRFQKKyMJLTUJSE5FCUVTVAlIQUMJQ0RUCisjCS02CUhOQwlDU1QJSEFSCU1EVAorIwktNwlITlIJTVNUCUhBUAlQRFQKKyMJLTgJSE5QCVBTVAlIQVkJWURUCisjCS05CUhOWQlZU1QJLQktCisjCisjCUhOOiBIZXVyZSBOb3JtYWxlCVNUOiBTdGFuZGFyZCBUaW1lCisjCUhBOiBIZXVyZSBBdmFuYzxlJz5lCURUOiBEYXlsaWdodCBzYXZpbmcgVGltZQorIworIwlBOiBkZSBsJ0F0bGFudGlxdWUJQXRsYW50aWMKKyMJQzogZHUgQ2VudHJlCQlDZW50cmFsCisjCUU6IGRlIGwnRXN0CQlFYXN0ZXJuCisjCU06CQkJTW91bnRhaW4KKyMJTjoJCQlOZXdmb3VuZGxhbmQKKyMJUDogZHUgUGFjaWZpcXVlCQlQYWNpZmljCisjCVI6IGRlcyBSb2NoZXVzZXMKKyMJVDogZGUgVGVycmUtTmV1dmUKKyMJWTogZHUgWXVrb24JCVl1a29uCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTQtMTEtMjIpOgorIyBBbGFzLCB0aGlzIHNvcnQgb2YgdGhpbmcgbXVzdCBiZSBoYW5kbGVkIGJ5IGxvY2FsaXphdGlvbiBzb2Z0d2FyZS4KKworIyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhlIGRhdGEgZm9yIENhbmFkYSBhcmUgYWxsIGZyb20gU2hhbmtzCisjICYgUG90dGVuZ2VyLgorCisjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA0LTAxLCAyMDA2LTA0LTI1LCAyMDA2LTA2LTI2LCAyMDA3LTAxLTMxLAorIyAyMDA3LTAzLTAxKToKKyMgVGhlIEJyaXRpc2ggQ29sdW1iaWEgZ292ZXJubWVudCBhbm5vdW5jZWQgeWVzdGVyZGF5IHRoYXQgaXQgd2lsbAorIyBhZGp1c3QgZGF5bGlnaHQgc2F2aW5ncyBuZXh0IHllYXIgdG8gYWxpZ24gd2l0aCBjaGFuZ2VzIGluIHRoZQorIyBVLlMuIGFuZCB0aGUgcmVzdCBvZiBDYW5hZGEuLi4uCisjIGh0dHA6Ly93d3cyLm5ld3MuZ292LmJjLmNhL25ld3NfcmVsZWFzZXNfMjAwNS0yMDA5LzIwMDZBRzAwMTQtMDAwMzMwLmh0bQorIyAuLi4KKyMgTm92YSBTY290aWEKKyMgRGF5bGlnaHQgc2F2aW5nIHRpbWUgd2lsbCBiZSBleHRlbmRlZCBieSBmb3VyIHdlZWtzIHN0YXJ0aW5nIGluIDIwMDcuLi4uCisjIGh0dHA6Ly93d3cuZ292Lm5zLmNhL2p1c3QvcmVndWxhdGlvbnMvcmcyLzIwMDYvbWExMjA2LnBkZgorIworIyBbRm9yIE5ldyBCcnVuc3dpY2tdIHRoZSBuZXcgbGVnaXNsYXRpb24gZGljdGF0ZXMgdGhhdCB0aGUgdGltZSBjaGFuZ2UgaXMgdG8KKyMgYmUgZG9uZSBhdCAwMjowMCBpbnN0ZWFkIG9mIDAwOjAxLgorIyBodHRwOi8vd3d3LmduYi5jYS8wMDYyL2FjdHMvQkJBLTIwMDYvQ2hhcC0xOS5wZGYKKyMgLi4uCisjIE1hbml0b2JhIGhhcyB0cmFkaXRpb25hbGx5IGNoYW5nZWQgdGhlIGNsb2NrIGV2ZXJ5IGZhbGwgYXQgMDM6MDAuCisjIEFzIG9mIDIwMDYsIHRoZSB0cmFuc2l0aW9uIGlzIHRvIHRha2UgcGxhY2Ugb25lIGhvdXIgZWFybGllciBhdCAwMjowMC4KKyMgaHR0cDovL3dlYjIuZ292Lm1iLmNhL2xhd3Mvc3RhdHV0ZXMvY2NzbS9vMDMwZS5waHAKKyMgLi4uCisjIFtBbGJlcnRhLCBPbnRhcmlvLCBRdWViZWNdIHdpbGwgZm9sbG93IFVTIHJ1bGVzLgorIyBodHRwOi8vd3d3LnFwLmdvdi5hYi5jYS9kb2N1bWVudHMvc3ByaW5nL0NIMDNfMDYuQ0ZNCisjIGh0dHA6Ly93d3cuZS1sYXdzLmdvdi5vbi5jYS9EQkxhd3MvU291cmNlL1JlZ3MvRW5nbGlzaC8yMDA2L1IwNjExMV9lLmh0bQorIyBodHRwOi8vd3d3Mi5wdWJsaWNhdGlvbnNkdXF1ZWJlYy5nb3V2LnFjLmNhL2R5bmFtaWNTZWFyY2gvdGVsZWNoYXJnZS5waHA/dHlwZT01JmZpbGU9MjAwNkMzOUEuUERGCisjIC4uLgorIyBQLkUuSS4gd2lsbCBmb2xsb3cgVVMgcnVsZXMuLi4uCisjIGh0dHA6Ly93d3cuYXNzZW1ibHkucGUuY2EvYmlsbHMvcGRmX2NoYXB0ZXIvNjIvMy9jaGFwdGVyLTQxLnBkZgorIyAuLi4KKyMgUHJvdmluY2Ugb2YgTmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvci4uLi4KKyMgaHR0cDovL3d3dy5ob2EuZ292Lm5sLmNhL2hvYS9iaWxscy9CaWxsMDYzNC5odG0KKyMgLi4uCisjIFl1a29uCisjIGh0dHA6Ly93d3cuZ292LnlrLmNhL2xlZ2lzbGF0aW9uL3JlZ3Mvb2ljMjAwNl8xMjcucGRmCisjIC4uLgorIyBOLlcuVC4gd2lsbCBmb2xsb3cgVVMgcnVsZXMuICBXaG9ldmVyIG1haW50YWlucyB0aGUgZ292ZXJubWVudCB3ZWIgc2l0ZQorIyBkb2VzIG5vdCBzZWVtIHRvIGJlbGlldmUgaW4gYm9va21hcmtzLiAgVG8gc2VlIHRoZSBuZXdzIHJlbGVhc2UsIGNsaWNrIHRoZQorIyBmb2xsb3dpbmcgbGluayBhbmQgc2VhcmNoIGZvciAiRGF5bGlnaHQgU2F2aW5ncyBUaW1lIENoYW5nZSIuICBQcmVzcyB0aGUKKyMgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSBDaGFuZ2UiIGxpbms7IGl0IHdpbGwgZmlyZSBvZmYgYSBwb3B1cCB1c2luZworIyBKYXZhU2NyaXB0LgorIyBodHRwOi8vd3d3LmV4ZWMuZ292Lm50LmNhL2N1cnJlbnRuZXdzL2N1cnJlbnRQUi5hc3A/bW9kZT1hcmNoaXZlCisjIC4uLgorIyBOdW5hdnV0CisjIEFuIGFtZW5kbWVudCB0byB0aGUgSW50ZXJwcmV0YXRpb24gQWN0IHdhcyByZWdpc3RlcmVkIG9uIEZlYnJ1YXJ5IDE5LzIwMDcuLi4uCisjIGh0dHA6Ly9hY3Rpb24uYXR0YXZpay5jYS9ob21lL2p1c3RpY2UtZ24vYXR0YWNoLzIwMDcvZ2F6MDJwYXJ0Mi5wZGYKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTI1KToKKyMgSC4gRGF2aWQgTWF0dGhld3MgYW5kIE1hcnkgVmluY2VudCdzIG1hcAorIyA8YSBocmVmPSJodHRwOi8vd3d3LmNhbmFkaWFuZ2VvZ3JhcGhpYy5jYS9NYWdhemluZS9TTzk4L2dlb21hcC5hc3AiPgorIyAiSXQncyBhYm91dCBUSU1FIiwgX0NhbmFkaWFuIEdlb2dyYXBoaWNfIChTZXB0ZW1iZXItT2N0b2JlciAxOTk4KQorIyA8L2E+IGNvbnRhaW5zIGRldGFpbGVkIGJvdW5kYXJpZXMgZm9yIHJlZ2lvbnMgb2JzZXJ2aW5nIG5vbnN0YW5kYXJkCisjIHRpbWUgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFycmFuZ2VtZW50cyBpbiBDYW5hZGEgY2lyY2EgMTk5OC4KKyMKKyMgSU5NUywgdGhlIEluc3RpdHV0ZSBmb3IgTmF0aW9uYWwgTWVhc3VyZW1lbnQgU3RhbmRhcmRzIGluIE90dGF3YSwgaGFzIDxhCisjIGhyZWY9Imh0dHA6Ly9pbm1zLWllbm0ubnJjLWNucmMuZ2MuY2EvZW4vdGltZV9zZXJ2aWNlcy9kYXlsaWdodF9zYXZpbmdfZS5waHAiPgorIyBpbmZvcm1hdGlvbiBhYm91dCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgc2F2aW5nIHRpbWUgem9uZXMgaW4gQ2FuYWRhLgorIyA8L2E+ICh1cGRhdGVkIHBlcmlvZGljYWxseSkuCisjIEl0cyB1bm9mZmljaWFsIGluZm9ybWF0aW9uIGlzIG9mdGVuIHRha2VuIGZyb20gTWF0dGhld3MgYW5kIFZpbmNlbnQuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6CisjIEZvciBub3csIGFzc3VtZSBhbGwgb2YgRFNULW9ic2VydmluZyBDYW5hZGEgd2lsbCBmYWxsIGludG8gbGluZSB3aXRoIHRoZQorIyBuZXcgVVMgRFNUIHJ1bGVzLAorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlDYW5hZGEJMTkxOAlvbmx5CS0JQXByCTE0CTI6MDAJMTowMAlECitSdWxlCUNhbmFkYQkxOTE4CW9ubHkJLQlPY3QJMzEJMjowMAkwCVMKK1J1bGUJQ2FuYWRhCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgorUnVsZQlDYW5hZGEJMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQorUnVsZQlDYW5hZGEJMTk0NQlvbmx5CS0JU2VwCTMwCTI6MDAJMAlTCitSdWxlCUNhbmFkYQkxOTc0CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlDYW5hZGEJMTk3NAkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJQ2FuYWRhCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKK1J1bGUJQ2FuYWRhCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlDYW5hZGEJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCisKKworIyBOZXdmb3VuZGxhbmQgYW5kIExhYnJhZG9yCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0xMC0wMik6CisjIE1hdHRoZXdzIGFuZCBWaW5jZW50ICgxOTk4KSB3cml0ZSB0aGF0IExhYnJhZG9yIHNob3VsZCB1c2UgTlNUL05EVCwKKyMgYnV0IHRoZSBvbmx5IHBhcnQgb2YgTGFicmFkb3IgdGhhdCBmb2xsb3dzIHRoZSBydWxlcyBpcyB0aGUKKyMgc291dGhlYXN0IGNvcm5lciwgaW5jbHVkaW5nIFBvcnQgSG9wZSBTaW1wc29uIGFuZCBNYXJ5J3MgSGFyYm91ciwKKyMgYnV0IGV4Y2x1ZGluZywgc2F5LCBCbGFjayBUaWNrbGUuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVN0Sm9obnMJMTkxNwlvbmx5CS0JQXByCSA4CTI6MDAJMTowMAlECitSdWxlCVN0Sm9obnMJMTkxNwlvbmx5CS0JU2VwCTE3CTI6MDAJMAlTCisjIFdoaXRtYW4gZ2l2ZXMgMTkxOSBBcHIgNSBhbmQgMTkyMCBBcHIgNTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVN0Sm9obnMJMTkxOQlvbmx5CS0JTWF5CSA1CTIzOjAwCTE6MDAJRAorUnVsZQlTdEpvaG5zCTE5MTkJb25seQktCUF1ZwkxMgkyMzowMAkwCVMKKyMgRm9yIDE5MzEtMTkzNSBXaGl0bWFuIGdpdmVzIEFwciBzYW1lIGRhdGU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlTdEpvaG5zCTE5MjAJMTkzNQktCU1heQlTdW4+PTEJMjM6MDAJMTowMAlECitSdWxlCVN0Sm9obnMJMTkyMAkxOTM1CS0JT2N0CWxhc3RTdW4JMjM6MDAJMAlTCisjIEZvciAxOTM2LTE5NDEgV2hpdG1hbiBnaXZlcyBNYXkgU3VuPj04IGFuZCBPY3QgU3VuPj0xOyBnbyB3aXRoIFNoYW5rcyAmCisjIFBvdHRlbmdlci4KK1J1bGUJU3RKb2hucwkxOTM2CTE5NDEJLQlNYXkJTW9uPj05CTA6MDAJMTowMAlECitSdWxlCVN0Sm9obnMJMTkzNgkxOTQxCS0JT2N0CU1vbj49MgkwOjAwCTAJUworIyBXaGl0bWFuIGdpdmVzIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6CisjIDE5NDIgMDMtMDEvMTItMzEsIDE5NDMgMDUtMzAvMDktMDUsIDE5NDQgMDctMTAvMDktMDIsIDE5NDUgMDEtMDEvMTAtMDcKKyMgYnV0IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGFuZCBhc3N1bWUgdGhleSB1c2VkIENhbmFkaWFuIHJ1bGVzLgorIyBGb3IgMTk0Ni05IFdoaXRtYW4gZ2l2ZXMgTWF5IDUsNCw5LDEgLSBPY3QgMSw1LDMsMiwgYW5kIGZvciAxOTUwIGhlIGdpdmVzCisjIEFwciAzMCAtIFNlcCAyNDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVN0Sm9obnMJMTk0NgkxOTUwCS0JTWF5CVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlTdEpvaG5zCTE5NDYJMTk1MAktCU9jdAlTdW4+PTIJMjowMAkwCVMKK1J1bGUJU3RKb2hucwkxOTUxCTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlTdEpvaG5zCTE5NTEJMTk1OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVN0Sm9obnMJMTk2MAkxOTg2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0xMC0wMik6CisjIElOTVMgKDIwMDAtMDktMTIpIHNheXMgdGhhdCwgc2luY2UgMTk4OCBhdCBsZWFzdCwgTmV3Zm91bmRsYW5kIHN3aXRjaGVzCisjIGF0IDAwOjAxIGxvY2FsIHRpbWUuICBGb3Igbm93LCBhc3N1bWUgaXQgc3RhcnRlZCBpbiAxOTg3LgorUnVsZQlTdEpvaG5zCTE5ODcJb25seQktCUFwcglTdW4+PTEJMDowMQkxOjAwCUQKK1J1bGUJU3RKb2hucwkxOTg3CTIwMDYJLQlPY3QJbGFzdFN1bgkwOjAxCTAJUworUnVsZQlTdEpvaG5zCTE5ODgJb25seQktCUFwcglTdW4+PTEJMDowMQkyOjAwCURECitSdWxlCVN0Sm9obnMJMTk4OQkyMDA2CS0JQXByCVN1bj49MQkwOjAxCTE6MDAJRAorUnVsZQlTdEpvaG5zCTIwMDcJbWF4CS0JTWFyCVN1bj49OAkwOjAxCTE6MDAJRAorUnVsZQlTdEpvaG5zCTIwMDcJbWF4CS0JTm92CVN1bj49MQkwOjAxCTAJUworIworIyBTdCBKb2huJ3MgaGFzIGFuIGFwb3N0cm9waGUsIGJ1dCBQb3NpeCBmaWxlIG5hbWVzIGNhbid0IGhhdmUgYXBvc3Ryb3BoZXMuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvU3RfSm9obnMJLTM6MzA6NTIgLQlMTVQJMTg4NAorCQkJLTM6MzA6NTIgU3RKb2hucyBOJXNUCTE5MTgKKwkJCS0zOjMwOjUyIENhbmFkYQlOJXNUCTE5MTkKKwkJCS0zOjMwOjUyIFN0Sm9obnMgTiVzVAkxOTM1IE1hciAzMAorCQkJLTM6MzAJU3RKb2hucwlOJXNUCTE5NDIgTWF5IDExCisJCQktMzozMAlDYW5hZGEJTiVzVAkxOTQ2CisJCQktMzozMAlTdEpvaG5zCU4lc1QKKworIyBtb3N0IG9mIGVhc3QgTGFicmFkb3IKKworIyBUaGUgbmFtZSBgSGFwcHkgVmFsbGV5LUdvb3NlIEJheScgaXMgdG9vIGxvbmc7IHVzZSBgR29vc2UgQmF5Jy4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9Hb29zZV9CYXkJLTQ6MDE6NDAgLQlMTVQJMTg4NCAjIEhhcHB5IFZhbGxleS1Hb29zZSBCYXkKKwkJCS0zOjMwOjUyIC0JTlNUCTE5MTgKKwkJCS0zOjMwOjUyIENhbmFkYSBOJXNUCTE5MTkKKwkJCS0zOjMwOjUyIC0JTlNUCTE5MzUgTWFyIDMwCisJCQktMzozMAktCU5TVAkxOTM2CisJCQktMzozMAlTdEpvaG5zCU4lc1QJMTk0MiBNYXkgMTEKKwkJCS0zOjMwCUNhbmFkYQlOJXNUCTE5NDYKKwkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTY2IE1hciAxNSAyOjAwCisJCQktNDowMAlTdEpvaG5zCUElc1QKKworCisjIHdlc3QgTGFicmFkb3IsIE5vdmEgU2NvdGlhLCBQcmluY2UgRWR3YXJkIEkKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgc2luY2UgMTk3MCBtb3N0IG9mIHRoaXMgcmVnaW9uIGhhcyBiZWVuIGxpa2UKKyMgSGFsaWZheC4gIE1hbnkgbG9jYWxlcyBkaWQgbm90IG9ic2VydmUgcGVhY2V0aW1lIERTVCB1bnRpbCAxOTcyOworIyBHbGFjZSBCYXksIE5TIGlzIHRoZSBsYXJnZXN0IHRoYXQgd2Uga25vdyBvZi4KKyMgU2hhbmtzICYgUG90dGVuZ2VyIGFsc28gd3JpdGUgdGhhdCBMaXZlcnBvb2wsIE5TIHdhcyB0aGUgb25seSB0b3duCisjIGluIENhbmFkYSB0byBvYnNlcnZlIERTVCBpbiAxOTcxIGJ1dCBub3QgMTk3MDsgZm9yIG5vdyB3ZSdsbCBhc3N1bWUKKyMgdGhpcyBpcyBhIHR5cG8uCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUhhbGlmYXgJMTkxNglvbmx5CS0JQXByCSAxCTA6MDAJMTowMAlECitSdWxlCUhhbGlmYXgJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlTCitSdWxlCUhhbGlmYXgJMTkyMAlvbmx5CS0JTWF5CSA5CTA6MDAJMTowMAlECitSdWxlCUhhbGlmYXgJMTkyMAlvbmx5CS0JQXVnCTI5CTA6MDAJMAlTCitSdWxlCUhhbGlmYXgJMTkyMQlvbmx5CS0JTWF5CSA2CTA6MDAJMTowMAlECitSdWxlCUhhbGlmYXgJMTkyMQkxOTIyCS0JU2VwCSA1CTA6MDAJMAlTCitSdWxlCUhhbGlmYXgJMTkyMglvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlECitSdWxlCUhhbGlmYXgJMTkyMwkxOTI1CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MjMJb25seQktCVNlcAkgNAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MjQJb25seQktCVNlcAkxNQkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MjUJb25seQktCVNlcAkyOAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MjYJb25seQktCU1heQkxNgkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MjYJb25seQktCVNlcAkxMwkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MjcJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MjcJb25seQktCVNlcAkyNgkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MjgJMTkzMQktCU1heQlTdW4+PTgJMDowMAkxOjAwCUQKK1J1bGUJSGFsaWZheAkxOTI4CW9ubHkJLQlTZXAJIDkJMDowMAkwCVMKK1J1bGUJSGFsaWZheAkxOTI5CW9ubHkJLQlTZXAJIDMJMDowMAkwCVMKK1J1bGUJSGFsaWZheAkxOTMwCW9ubHkJLQlTZXAJMTUJMDowMAkwCVMKK1J1bGUJSGFsaWZheAkxOTMxCTE5MzIJLQlTZXAJTW9uPj0yNAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzIJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MzMJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MzMJb25seQktCU9jdAkgMgkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzQJb25seQktCU1heQkyMAkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MzQJb25seQktCVNlcAkxNgkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzUJb25seQktCUp1bgkgMgkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MzUJb25seQktCVNlcAkzMAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzYJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5MzYJb25seQktCVNlcAkxNAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzcJMTkzOAktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKK1J1bGUJSGFsaWZheAkxOTM3CTE5NDEJLQlTZXAJTW9uPj0yNAkwOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5MzkJb25seQktCU1heQkyOAkwOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5NDAJMTk0MQktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKK1J1bGUJSGFsaWZheAkxOTQ2CTE5NDkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5NDYJMTk0OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUhhbGlmYXgJMTk1MQkxOTU0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJSGFsaWZheAkxOTUxCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlIYWxpZmF4CTE5NTYJMTk1OQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCUhhbGlmYXgJMTk1NgkxOTU5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJSGFsaWZheAkxOTYyCTE5NzMJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlIYWxpZmF4CTE5NjIJMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvSGFsaWZheAktNDoxNDoyNCAtCUxNVAkxOTAyIEp1biAxNQorCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5MTgKKwkJCS00OjAwCUNhbmFkYQlBJXNUCTE5MTkKKwkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTk0NgorCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5NzQKKwkJCS00OjAwCUNhbmFkYQlBJXNUCitab25lIEFtZXJpY2EvR2xhY2VfQmF5CS0zOjU5OjQ4IC0JTE1UCTE5MDIgSnVuIDE1CisJCQktNDowMAlDYW5hZGEJQSVzVAkxOTUzCisJCQktNDowMAlIYWxpZmF4CUElc1QJMTk1NAorCQkJLTQ6MDAJLQlBU1QJMTk3MgorCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5NzQKKwkJCS00OjAwCUNhbmFkYQlBJXNUCisKKyMgTmV3IEJydW5zd2ljaworCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDEtMzEpOgorIyBUaGUgVGltZSBEZWZpbml0aW9uIEFjdCA8aHR0cDovL3d3dy5nbmIuY2EvMDA2Mi9QREYtYWN0cy90LTA2LnBkZj4KKyMgc2F5cyB0aGV5IGNoYW5nZWQgYXQgMDA6MDEgdGhyb3VnaCAyMDA2LCBhbmQKKyMgPGh0dHA6Ly93d3cuY2FubGlpLm9yZy9uYi9sYXdzL3N0YS90LTYvMjAwMzAxMjcvd2hvbGUuaHRtbD4gbWFrZXMgaXQKKyMgY2xlYXIgdGhhdCB0aGlzIHdhcyB0aGUgY2FzZSBzaW5jZSBhdCBsZWFzdCAxOTkzLgorIyBGb3Igbm93LCBhc3N1bWUgaXQgc3RhcnRlZCBpbiAxOTkzLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlNb25jdG9uCTE5MzMJMTkzNQktCUp1bglTdW4+PTgJMTowMAkxOjAwCUQKK1J1bGUJTW9uY3RvbgkxOTMzCTE5MzUJLQlTZXAJU3VuPj04CTE6MDAJMAlTCitSdWxlCU1vbmN0b24JMTkzNgkxOTM4CS0JSnVuCVN1bj49MQkxOjAwCTE6MDAJRAorUnVsZQlNb25jdG9uCTE5MzYJMTkzOAktCVNlcAlTdW4+PTEJMTowMAkwCVMKK1J1bGUJTW9uY3RvbgkxOTM5CW9ubHkJLQlNYXkJMjcJMTowMAkxOjAwCUQKK1J1bGUJTW9uY3RvbgkxOTM5CTE5NDEJLQlTZXAJU2F0Pj0yMQkxOjAwCTAJUworUnVsZQlNb25jdG9uCTE5NDAJb25seQktCU1heQkxOQkxOjAwCTE6MDAJRAorUnVsZQlNb25jdG9uCTE5NDEJb25seQktCU1heQkgNAkxOjAwCTE6MDAJRAorUnVsZQlNb25jdG9uCTE5NDYJMTk3MgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCU1vbmN0b24JMTk0NgkxOTU2CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJTW9uY3RvbgkxOTU3CTE5NzIJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlNb25jdG9uCTE5OTMJMjAwNgktCUFwcglTdW4+PTEJMDowMQkxOjAwCUQKK1J1bGUJTW9uY3RvbgkxOTkzCTIwMDYJLQlPY3QJbGFzdFN1bgkwOjAxCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL01vbmN0b24JLTQ6MTk6MDggLQlMTVQJMTg4MyBEZWMgIDkKKwkJCS01OjAwCS0JRVNUCTE5MDIgSnVuIDE1CisJCQktNDowMAlDYW5hZGEJQSVzVAkxOTMzCisJCQktNDowMAlNb25jdG9uCUElc1QJMTk0MgorCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTk0NgorCQkJLTQ6MDAJTW9uY3RvbglBJXNUCTE5NzMKKwkJCS00OjAwCUNhbmFkYQlBJXNUCTE5OTMKKwkJCS00OjAwCU1vbmN0b24JQSVzVAkyMDA3CisJCQktNDowMAlDYW5hZGEJQSVzVAorCisjIFF1ZWJlYworCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDctMDkpOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgUXVlYmVjIGhhcyBiZWVuCisjIGxpa2UgTW9udHJlYWwuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6CisjIE1hdHRoZXdzIGFuZCBWaW5jZW50ICgxOTk4KSBhbHNvIHdyaXRlIHRoYXQgUXVlYmVjIGVhc3Qgb2YgdGhlIC02MworIyBtZXJpZGlhbiBpcyBzdXBwb3NlZCB0byBvYnNlcnZlIEFTVCwgYnV0IHJlc2lkZW50cyBhcyBmYXIgZWFzdCBhcworIyBOYXRhc2hxdWFuIHVzZSBFU1QvRURULCBhbmQgcmVzaWRlbnRzIGVhc3Qgb2YgTmF0YXNocXVhbiB1c2UgQVNULgorIyBJbiAiT2ZmaWNpYWwgdGltZSBpbiBRdWViZWMiIHRoZSBRdWViZWMgZGVwYXJ0bWVudCBvZiBqdXN0aWNlIHdyaXRlcyBpbgorIyBodHRwOi8vd3d3Lmp1c3RpY2UuZ291di5xYy5jYS9lbmdsaXNoL3B1YmxpY2F0aW9ucy9nZW5lcmFsZS90ZW1wcy1yZWdsLTEtYS5odG0KKyMgdGhhdCAiVGhlIHJlc2lkZW50cyBvZiB0aGUgTXVuaWNpcGFsaXR5IG9mIHRoZQorIyBDb3RlLU5vcmQtZHUtR29sZmUtU2FpbnQtTGF1cmVudCBhbmQgdGhlIG11bmljaXBhbGl0aWVzIG9mIFNhaW50LUF1Z3VzdGluLAorIyBCb25uZS1Fc3BlcmFuY2UgYW5kIEJsYW5jLVNhYmxvbiBhcHBseSB0aGUgT2ZmaWNpYWwgVGltZSBBY3QgYXMgaXQgaXMKKyMgd3JpdHRlbiBhbmQgdXNlIEF0bGFudGljIHN0YW5kYXJkIHRpbWUgYWxsIHllYXIgcm91bmQuIFRoZSBzYW1lIGFwcGxpZXMgdG8KKyMgdGhlIHJlc2lkZW50cyBvZiB0aGUgTmF0aXZlIGZhY2lsaXRpZXMgYWxvbmcgdGhlIGxvd2VyIE5vcnRoIFNob3JlLiIKKyMgPGh0dHA6Ly93d3cuYXNzbmF0LnFjLmNhL2VuZy8zN2xlZ2lzbGF0dXJlMi9Qcm9qZXRzLWxvaS9QdWJsaWNzLzA2LWEwMDIuaHRtPgorIyBzYXlzIHRoaXMgY29tbW9uIHByYWN0aWNlIHdhcyBjb2RpZmllZCBpbnRvIGxhdyBhcyBvZiAyMDA3LgorIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgZ3Vlc3MgdGhpcyBwcmFjdGljZSBiZWdhbiBhcm91bmQgMTk3MCwgY29udHJhIHRvCisjIFNoYW5rcyAmIFBvdHRlbmdlciB3aG8gaGF2ZSB0aGlzIHJlZ2lvbiBvYnNlcnZpbmcgQVNUL0FEVC4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTW9udAkxOTE3CW9ubHkJLQlNYXIJMjUJMjowMAkxOjAwCUQKK1J1bGUJTW9udAkxOTE3CW9ubHkJLQlBcHIJMjQJMDowMAkwCVMKK1J1bGUJTW9udAkxOTE5CW9ubHkJLQlNYXIJMzEJMjozMAkxOjAwCUQKK1J1bGUJTW9udAkxOTE5CW9ubHkJLQlPY3QJMjUJMjozMAkwCVMKK1J1bGUJTW9udAkxOTIwCW9ubHkJLQlNYXkJIDIJMjozMAkxOjAwCUQKK1J1bGUJTW9udAkxOTIwCTE5MjIJLQlPY3QJU3VuPj0xCTI6MzAJMAlTCitSdWxlCU1vbnQJMTkyMQlvbmx5CS0JTWF5CSAxCTI6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyMglvbmx5CS0JQXByCTMwCTI6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyNAlvbmx5CS0JTWF5CTE3CTI6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyNAkxOTI2CS0JU2VwCWxhc3RTdW4JMjozMAkwCVMKK1J1bGUJTW9udAkxOTI1CTE5MjYJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECisjIFRoZSAxOTI3LXRvLTE5MzcgcnVsZXMgY2FuIGJlIGV4cHJlc3NlZCBtb3JlIHNpbXBseSBhcworIyBSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECisjIFJ1bGUJTW9udAkxOTI3CTE5MzcJLQlTZXAJbGFzdFNhdAkyNDowMAkwCVMKKyMgVGhlIHJ1bGVzIGJlbG93IGF2b2lkIHVzZSBvZiAyNDowMAorIyAod2hpY2ggcHJlLTE5OTggdmVyc2lvbnMgb2YgemljIGNhbm5vdCBoYW5kbGUpLgorUnVsZQlNb250CTE5MjcJb25seQktCU1heQkxCTA6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyNwkxOTMyCS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKK1J1bGUJTW9udAkxOTI4CTE5MzEJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJRAorUnVsZQlNb250CTE5MzIJb25seQktCU1heQkxCTA6MDAJMTowMAlECitSdWxlCU1vbnQJMTkzMwkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJTW9udAkxOTMzCW9ubHkJLQlPY3QJMQkwOjAwCTAJUworUnVsZQlNb250CTE5MzQJMTkzOQktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCitSdWxlCU1vbnQJMTk0NgkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJTW9udAkxOTQ1CTE5NDgJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlNb250CTE5NDkJMTk1MAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCU1vbnQJMTk1MQkxOTU2CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJTW9udAkxOTU3CTE5NzMJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvQmxhbmMtU2FibG9uIC0zOjQ4OjI4IC0JTE1UCTE4ODQKKwkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NzAKKwkJCS00OjAwCS0JQVNUCitab25lIEFtZXJpY2EvTW9udHJlYWwJLTQ6NTQ6MTYgLQlMTVQJMTg4NAorCQkJLTU6MDAJTW9udAlFJXNUCTE5MTgKKwkJCS01OjAwCUNhbmFkYQlFJXNUCTE5MTkKKwkJCS01OjAwCU1vbnQJRSVzVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk0NgorCQkJLTU6MDAJTW9udAlFJXNUCTE5NzQKKwkJCS01OjAwCUNhbmFkYQlFJXNUCisKKworIyBPbnRhcmlvCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNy0wOSk6CisjIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IHNpbmNlIDE5NzAgbW9zdCBvZiBPbnRhcmlvIGhhcyBiZWVuIGxpa2UKKyMgVG9yb250by4KKyMgVGh1bmRlciBCYXkgc2tpcHBlZCBEU1QgaW4gMTk3My4KKyMgTWFueSBzbWFsbGVyIGxvY2FsZXMgZGlkIG5vdCBvYnNlcnZlIHBlYWNldGltZSBEU1QgdW50aWwgMTk3NDsKKyMgTmlwaWdvbiAoRVNUKSBhbmQgUmFpbnkgUml2ZXIgKENTVCkgYXJlIHRoZSBsYXJnZXN0IHRoYXQgd2Uga25vdyBvZi4KKyMgRmFyIHdlc3QgT250YXJpbyBpcyBsaWtlIFdpbm5pcGVnOyBmYXIgZWFzdCBRdWViZWMgaXMgbGlrZSBIYWxpZmF4LgorCisjIEZyb20gTWFyayBCcmFkZXIgKDIwMDMtMDctMjYpOgorIyBbQWNjb3JkaW5nIHRvIHRoZSBUb3JvbnRvIFN0YXJdIE9yaWxsaWEsIE9udGFyaW8sIGFkb3B0ZWQgRFNUCisjIGVmZmVjdGl2ZSBTYXR1cmRheSwgMTkxMi0wNi0yMiwgMjI6MDA7IHRoZSBhcnRpY2xlIG1lbnRpb25zIHRoYXQKKyMgUG9ydCBBcnRodXIgKG5vdyBwYXJ0IG9mIFRodW5kZXIgQmF5LCBPbnRhcmlvKSBhcyB3ZWxsIGFzIE1vb3NlIEphdworIyBoYXZlIGFscmVhZHkgZG9uZSBzby4gIEluIE9yaWxsaWEgRFNUIHdhcyB0byBydW4gdW50aWwgU2F0dXJkYXksCisjIDE5MTItMDgtMzEgKG5vIHRpbWUgbWVudGlvbmVkKSwgYnV0IGl0IHdhcyBtZXQgd2l0aCBjb25zaWRlcmFibGUKKyMgaG9zdGlsaXR5IGZyb20gY2VydGFpbiBzZWdtZW50cyBvZiB0aGUgcHVibGljLCBhbmQgd2FzIHJldm9rZWQgYWZ0ZXIKKyMgb25seSB0d28gd2Vla3MgLS0gSSBjb3BpZWQgaXQgYXMgU2F0dXJkYXksIDE5MTItMDctMDcsIDIyOjAwLCBidXQKKyMgcHJlc3VtYWJseSB0aGF0IHNob3VsZCBiZSAtMDctMDYuICAoMTkxMi0wNi0xOSwgLTA3LTEyOyBhbHNvIGxldHRlcnMKKyMgZWFybGllciBpbiBKdW5lKS4KKyMKKyMgS2Vub3JhLCBPbnRhcmlvLCB3YXMgdG8gYWJhbmRvbiBEU1Qgb24gMTkxNC0wNi0wMSAoLTA1LTIxKS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk3LTEwLTE3KToKKyMgTWFyayBCcmFkZXIgd3JpdGVzIHRoYXQgYW4gYXJ0aWNsZSBpbiB0aGUgMTk5Ny0xMC0xNCBUb3JvbnRvIFN0YXIKKyMgc2F5cyB0aGF0IEF0aWtva2FuLCBPbnRhcmlvIGN1cnJlbnRseSBkb2VzIG5vdCBvYnNlcnZlIERTVCwKKyMgYnV0IHdpbGwgdm90ZSBvbiAxMS0xMCB3aGV0aGVyIHRvIHVzZSBFU1QvRURULgorIyBIZSBhbHNvIHdyaXRlcyB0aGF0IHRoZQorIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbCI+CisjIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQorIyA8L2E+CisjIHNheXMgdGhhdCBPbnRhcmlvIGVhc3Qgb2YgOTBXIHVzZXMgRVNUL0VEVCwgYW5kIHdlc3Qgb2YgOTBXIHVzZXMgQ1NUL0NEVC4KKyMgT2ZmaWNpYWxseSBBdGlrb2thbiBpcyB0aGVyZWZvcmUgb24gQ1NUL0NEVCwgYW5kIG1vc3QgbGlrZWx5IHRoaXMgcmVwb3J0CisjIGNvbmNlcm5zIGEgbm9uLW9mZmljaWFsIHRpbWUgb2JzZXJ2ZWQgYXMgYSBtYXR0ZXIgb2YgbG9jYWwgcHJhY3RpY2UuCisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgorIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBBdGlrb2thbiwgUGlja2xlIExha2UsIGFuZAorIyBOZXcgT3NuYWJ1cmdoIG9ic2VydmUgQ1NUIGFsbCB5ZWFyLCB0aGF0IEJpZyBUcm91dCBMYWtlIG9ic2VydmVzCisjIENTVC9DRFQsIGFuZCB0aGF0IFVwc2FsYSBhbmQgU2hlYmFuZG93YW4gb2JzZXJ2ZSBFU1QvRURULCBhbGwgaW4KKyMgdmlvbGF0aW9uIG9mIHRoZSBvZmZpY2lhbCBPbnRhcmlvIHJ1bGVzLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA3LTA5KToKKyMgQ2hyaXMgV2FsdG9uICgyMDA2LTA3LTA2KSBtZW50aW9uZWQgYW4gYXJ0aWNsZSBieSBTdGVwaGFuaWUgTWFjTGVsbGFuIGluIHRoZQorIyAyMDA1LTA3LTIxIENocm9uaWNsZS1Kb3VybmFsLCB3aGljaCBzYWlkOgorIworIwlUaGUgY2xvY2tzIGluIEF0aWtva2FuIHN0YXkgc2V0IG9uIHN0YW5kYXJkIHRpbWUgeWVhci1yb3VuZC4KKyMJVGhpcyBtZWFucyB0aGV5IHNwZW5kIGFib3V0IGhhbGYgdGhlIHRpbWUgb24gY2VudHJhbCB0aW1lIGFuZAorIwl0aGUgb3RoZXIgaGFsZiBvbiBlYXN0ZXJuIHRpbWUuCisjCisjCUZvciB0aGUgbW9zdCBwYXJ0LCB0aGUgc3lzdGVtIHdvcmtzLCBNYXlvciBEZW5uaXMgQnJvd24gc2FpZC4KKyMKKyMJIlRoZSBtYWpvcml0eSBvZiBidXNpbmVzc2VzIGluIEF0aWtva2FuIGRlYWwgbW9yZSB3aXRoIEVhc3Rlcm4KKyMJQ2FuYWRhLCBidXQgdGhlcmUgYXJlIHNvbWUgdGhhdCBkZWFsIHdpdGggV2VzdGVybiBDYW5hZGEsIiBoZQorIwlzYWlkLiAgIkkgZG9uJ3Qgc2VlIGFueSBjaGFuZ2VzIGhhcHBlbmluZyBoZXJlLiIKKyMKKyMgV2FsdG9uIGFsc28gd3JpdGVzICJTdXBwb3NlZGx5IFBpY2tsZSBMYWtlIGFuZCBNaXNoa2VlZ29nYW1hbmcKKyMgW05ldyBPc25hYnVyZ2hdIGZvbGxvdyB0aGUgc2FtZSBwcmFjdGljZS4iCisKKyMgRnJvbSBHYXJyeSBNY0tpbm5vbiAoMjAwNi0wNy0xNCkgdmlhIENocmlzIFdhbHRvbjoKKyMgSSBjaGF0dGVkIHdpdGggYSBtZW1iZXIgb2YgbXkgYm9hcmQgd2hvIGhhcyBhbiBvdXRzdGFuZGluZyBtZW1vcnkKKyMgYW5kIGEgbG9uZyBoaXN0b3J5IGluIEF0aWtva2FuIChhbmQgaW4gdGhlIHRlbGVjb20gaW5kdXN0cnkpIGFuZCBoZQorIyBjYW4gc2F5IGZvciBjZXJ0YWluIHRoYXQgQXRpa29rYW4gaGFzIGJlZW4gcHJhY3RpY2luZyB0aGUgY3VycmVudAorIyB0aW1lIGtlZXBpbmcgc2luY2UgMTk1MiwgYXQgbGVhc3QuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNy0xNyk6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBBdGlrb2thbiBoYXMgYWdyZWVkIHdpdGggUmFpbnkgUml2ZXIKKyMgZXZlciBzaW5jZSBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkLCBidXQgdGhlIGluZm9ybWF0aW9uIGZyb20KKyMgTWNLaW5ub24gc291bmRzIG1vcmUgYXV0aG9yaXRhdGl2ZS4gIEZvciBub3csIGFzc3VtZSB0aGF0IEF0aWtva2FuCisjIHN3aXRjaGVkIHRvIEVTVCBpbW1lZGlhdGVseSBhZnRlciBXV0lJIGVyYSBkYXlsaWdodCBzYXZpbmcgdGltZQorIyBlbmRlZC4gIFRoaXMgbWF0Y2hlcyB0aGUgb2xkIChsZXNzLXBvcHVsb3VzKSBBbWVyaWNhL0NvcmFsX0hhcmJvdXIKKyMgZW50cnkgc2luY2Ugb3VyIGN1dG9mZiBkYXRlIG9mIDE5NzAsIHNvIHdlIGNhbiBtb3ZlCisjIEFtZXJpY2EvQ29yYWxfSGFyYm91ciB0byB0aGUgJ2JhY2t3YXJkJyBmaWxlLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlUb3JvbnRvCTE5MTkJb25seQktCU1hcgkzMAkyMzozMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTE5CW9ubHkJLQlPY3QJMjYJMDowMAkwCVMKK1J1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlNYXkJIDIJMjowMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlTZXAJMjYJMDowMAkwCVMKK1J1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlNYXkJMTUJMjowMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlTZXAJMTUJMjowMAkwCVMKK1J1bGUJVG9yb250bwkxOTIyCTE5MjMJLQlNYXkJU3VuPj04CTI6MDAJMTowMAlECisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkyMy0wOS0xOTsgYXNzdW1lIGl0J3MgYSB0eXBvIGFuZCB0aGF0ICItMTYiCisjIHdhcyBtZWFudC4KK1J1bGUJVG9yb250bwkxOTIyCTE5MjYJLQlTZXAJU3VuPj0xNQkyOjAwCTAJUworUnVsZQlUb3JvbnRvCTE5MjQJMTkyNwktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKKyMgVGhlIDE5MjctdG8tMTkzOSBydWxlcyBjYW4gYmUgZXhwcmVzc2VkIG1vcmUgc2ltcGx5IGFzCisjIFJ1bGUJVG9yb250bwkxOTI3CTE5MzcJLQlTZXAJU3VuPj0yNQkyOjAwCTAJUworIyBSdWxlCVRvcm9udG8JMTkyOAkxOTM3CS0JQXByCVN1bj49MjUJMjowMAkxOjAwCUQKKyMgUnVsZQlUb3JvbnRvCTE5MzgJMTk0MAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECisjIFJ1bGUJVG9yb250bwkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworIyBUaGUgcnVsZXMgYmVsb3cgYXZvaWQgdXNlIG9mIFN1bj49MjUKKyMgKHdoaWNoIHByZS0yMDA0IHZlcnNpb25zIG9mIHppYyBjYW5ub3QgaGFuZGxlKS4KK1J1bGUJVG9yb250bwkxOTI3CTE5MzIJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlUb3JvbnRvCTE5MjgJMTkzMQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVRvcm9udG8JMTkzMglvbmx5CS0JTWF5CTEJMjowMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTMzCTE5NDAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlUb3JvbnRvCTE5MzMJb25seQktCU9jdAkxCTI6MDAJMAlTCitSdWxlCVRvcm9udG8JMTkzNAkxOTM5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJVG9yb250bwkxOTQ1CTE5NDYJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlUb3JvbnRvCTE5NDYJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVRvcm9udG8JMTk0NwkxOTQ5CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTQ3CTE5NDgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUworUnVsZQlUb3JvbnRvCTE5NDkJb25seQktCU5vdglsYXN0U3VuCTA6MDAJMAlTCitSdWxlCVRvcm9udG8JMTk1MAkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJVG9yb250bwkxOTUwCW9ubHkJLQlOb3YJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlUb3JvbnRvCTE5NTEJMTk1NgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgVG9yb250byBlbmRlZCBEU1QgYSB3ZWVrIGVhcmx5IGluIDE5NzEsCisjIG5hbWVseSBvbiAxOTcxLTEwLTI0LCBidXQgTWFyayBCcmFkZXIgd3JvdGUgKDIwMDMtMDUtMzEpIHRoYXQgdGhpcworIyBpcyB3cm9uZywgYW5kIHRoYXQgaGUgaGFkIGNvbmZpcm1lZCBpdCBieSBjaGVja2luZyB0aGUgMTk3MS0xMC0zMAorIyBUb3JvbnRvIFN0YXIsIHdoaWNoIHNhaWQgdGhhdCBEU1Qgd2FzIGVuZGluZyAxOTcxLTEwLTMxIGFzIHVzdWFsLgorUnVsZQlUb3JvbnRvCTE5NTcJMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wNy0yNyk6CisjIFdpbGxldHQgKDE5MTQtMDMpIHdyaXRlcyAocC4gMTcpICJJbiB0aGUgQ2l0aWVzIG9mIEZvcnQgV2lsbGlhbSwgYW5kCisjIFBvcnQgQXJ0aHVyLCBPbnRhcmlvLCB0aGUgcHJpbmNpcGxlIG9mIHRoZSBCaWxsIGhhcyBiZWVuIGluCisjIG9wZXJhdGlvbiBmb3IgdGhlIHBhc3QgdGhyZWUgeWVhcnMsIGFuZCBpbiB0aGUgQ2l0eSBvZiBNb29zZSBKYXcsCisjIFNhc2thdGNoZXdhbiwgZm9yIG9uZSB5ZWFyLiIKKworIyBGcm9tIERhdmlkIEJyeWFuIHZpYSBUb3J5IFRyb25ydWQsIERpcmVjdG9yL0N1cmF0b3IsCisjIFRodW5kZXIgQmF5IE11c2V1bSAoMjAwMy0xMS0xMik6CisjIFRoZXJlIGlzIHNvbWUgc3VnZ2VzdGlvbiwgaG93ZXZlciwgdGhhdCwgYnktbGF3IG9yIG5vdCwgZGF5bGlnaHQKKyMgc2F2aW5ncyB0aW1lIHdhcyBiZWluZyBwcmFjdGljZWQgaW4gRm9ydCBXaWxsaWFtIGFuZCBQb3J0IEFydGh1cgorIyBiZWZvcmUgMTkwOS4uLi4gW0ldbiAxOTEwLCB0aGUgbGluZSBiZXR3ZWVuIHRoZSBFYXN0ZXJuIGFuZCBDZW50cmFsCisjIFRpbWUgWm9uZXMgd2FzIHBlcm1hbmVudGx5IG1vdmVkIGFib3V0IHR3byBodW5kcmVkIG1pbGVzIHdlc3QgdG8KKyMgaW5jbHVkZSB0aGUgVGh1bmRlciBCYXkgYXJlYS4uLi4gIFdoZW4gQ2FuYWRhIGFkb3B0ZWQgZGF5bGlnaHQKKyMgc2F2aW5ncyB0aW1lIGluIDE5MTYsIEZvcnQgV2lsbGlhbSBhbmQgUG9ydCBBcnRodXIsIGhhdmluZyBkb25lIHNvCisjIGFscmVhZHksIGRpZCBub3QgY2hhbmdlIHRoZWlyIGNsb2Nrcy4uLi4gIER1cmluZyB0aGUgU2Vjb25kIFdvcmxkCisjIFdhciwuLi4gW3RdaGUgY2l0aWVzIGFncmVlZCB0byBpbXBsZW1lbnQgRFNUIGR1cmluZyB0aGUgc3VtbWVyCisjIG1vbnRocyBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgd2FyIHllYXJzLgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvVG9yb250bwktNToxNzozMiAtCUxNVAkxODk1CisJCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5CisJCQktNTowMAlUb3JvbnRvCUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKKwkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTc0CisJCQktNTowMAlDYW5hZGEJRSVzVAorWm9uZSBBbWVyaWNhL1RodW5kZXJfQmF5IC01OjU3OjAwIC0JTE1UCTE4OTUKKwkJCS02OjAwCS0JQ1NUCTE5MTAKKwkJCS01OjAwCS0JRVNUCTE5NDIKKwkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NzAKKwkJCS01OjAwCU1vbnQJRSVzVAkxOTczCisJCQktNTowMAktCUVTVAkxOTc0CisJCQktNTowMAlDYW5hZGEJRSVzVAorWm9uZSBBbWVyaWNhL05pcGlnb24JLTU6NTM6MDQgLQlMTVQJMTg5NQorCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk0MCBTZXAgMjkKKwkJCS01OjAwCTE6MDAJRURUCTE5NDIgRmViICA5IDI6MDBzCisJCQktNTowMAlDYW5hZGEJRSVzVAorWm9uZSBBbWVyaWNhL1JhaW55X1JpdmVyIC02OjE4OjE2IC0JTE1UCTE4OTUKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5CisJCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTY6MDAJQ2FuYWRhCUMlc1QKK1pvbmUgQW1lcmljYS9BdGlrb2thbgktNjowNjoyOCAtCUxNVAkxODk1CisJCQktNjowMAlDYW5hZGEJQyVzVAkxOTQwIFNlcCAyOQorCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDUgU2VwIDMwIDI6MDAKKwkJCS01OjAwCS0JRVNUCisKKworIyBNYW5pdG9iYQorCisjIEZyb20gUm9iIERvdWdsYXMgKDIwMDYtMDQtMDYpOgorIyB0aGUgb2xkIE1hbml0b2JhIFRpbWUgQWN0IC0gYXMgYW1lbmRlZCBieSBCaWxsIDIsIGFzc2VudGVkIHRvCisjIE1hcmNoIDI3LCAxOTg3IC4uLiBzYWlkIC4uLgorIyAiYmV0d2VlbiB0d28gbydjbG9jayBDZW50cmFsIFN0YW5kYXJkIFRpbWUgaW4gdGhlIG1vcm5pbmcgb2YKKyMgdGhlIGZpcnN0IFN1bmRheSBvZiBBcHJpbCBvZiBlYWNoIHllYXIgYW5kIHR3byBvJ2Nsb2NrIENlbnRyYWwKKyMgU3RhbmRhcmQgVGltZSBpbiB0aGUgbW9ybmluZyBvZiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBuZXh0CisjIGZvbGxvd2luZywgb25lIGhvdXIgaW4gYWR2YW5jZSBvZiBDZW50cmFsIFN0YW5kYXJkIFRpbWUuIi4uLgorIyBJIGJlbGlldmUgdGhhdCB0aGUgRW5nbGlzaCBsZWdpc2xhdGlvbiBbb2YgdGhlIG9sZCB0aW1lIGFjdF0gaGFkID0KKyMgYmVlbiBhc3NlbnRlZCB0byAoTWFyY2ggMjIsIDE5NjcpLi4uLgorIyBBbHNvLCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUgd2FzIG5vIG9yZGVyLWluLWNvdW5jaWwgdmFyeWluZworIyB0aGUgdGltZSBvZiBEYXlsaWdodCBTYXZpbmcgVGltZSBmb3IgMjAwNSBhbmQgc28gdGhlIHByb3Zpc2lvbnMgb2YKKyMgdGhlIDE5ODcgdmVyc2lvbiB3b3VsZCBhcHBseSAtIHRoZSBjaGFuZ2VvdmVyIHdhcyBhdCAyOjAwIENlbnRyYWwKKyMgU3RhbmRhcmQgVGltZSAoaS5lLiBub3QgdW50aWwgMzowMCBDZW50cmFsIERheWxpZ2h0IFRpbWUpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMTApOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IE1hbml0b2JhIHN3aXRjaGVkIGF0IDAyOjAwIChub3QgMDI6MDBzKQorIyBzdGFydGluZyAxOTY2LiAgU2luY2UgMDI6MDBzIGlzIGNsZWFybHkgY29ycmVjdCBmb3IgMTk2NyBvbiwgYXNzdW1lCisjIGl0IHdhcyBhbHNvIDAyOjAwcyBpbiAxOTY2LgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlXaW5uCTE5MTYJb25seQktCUFwcgkyMwkwOjAwCTE6MDAJRAorUnVsZQlXaW5uCTE5MTYJb25seQktCVNlcAkxNwkwOjAwCTAJUworUnVsZQlXaW5uCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAorUnVsZQlXaW5uCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUworUnVsZQlXaW5uCTE5MzcJb25seQktCU1heQkxNgkyOjAwCTE6MDAJRAorUnVsZQlXaW5uCTE5MzcJb25seQktCVNlcAkyNgkyOjAwCTAJUworUnVsZQlXaW5uCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgorUnVsZQlXaW5uCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKK1J1bGUJV2lubgkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlXaW5uCTE5NDYJb25seQktCU1heQkxMgkyOjAwCTE6MDAJRAorUnVsZQlXaW5uCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUworUnVsZQlXaW5uCTE5NDcJMTk0OQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVdpbm4JMTk0NwkxOTQ5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJV2lubgkxOTUwCW9ubHkJLQlNYXkJIDEJMjowMAkxOjAwCUQKK1J1bGUJV2lubgkxOTUwCW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKK1J1bGUJV2lubgkxOTUxCTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlXaW5uCTE5NTEJMTk1OAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVdpbm4JMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJV2lubgkxOTYwCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlXaW5uCTE5NjMJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVdpbm4JMTk2Mwlvbmx5CS0JU2VwCTIyCTI6MDAJMAlTCitSdWxlCVdpbm4JMTk2NgkxOTg2CS0JQXByCWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCVdpbm4JMTk2NgkyMDA1CS0JT2N0CWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCVdpbm4JMTk4NwkyMDA1CS0JQXByCVN1bj49MQkyOjAwcwkxOjAwCUQKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9XaW5uaXBlZwktNjoyODozNiAtCUxNVAkxODg3IEp1bCAxNgorCQkJLTY6MDAJV2lubglDJXNUCTIwMDYKKwkJCS02OjAwCUNhbmFkYQlDJXNUCisKKworIyBTYXNrYXRjaGV3YW4KKworIyBGcm9tIE1hcmsgQnJhZGVyICgyMDAzLTA3LTI2KToKKyMgVGhlIGZpcnN0IGFjdHVhbCBhZG9wdGlvbiBvZiBEU1QgaW4gQ2FuYWRhIHdhcyBhdCB0aGUgbXVuaWNpcGFsCisjIGxldmVsLiAgQXMgdGhlIFtUb3JvbnRvXSBTdGFyIHB1dCBpdCAoMTkxMi0wNi0wNyksICJXaGlsZSBwZW9wbGUKKyMgZWxzZXdoZXJlIGhhdmUgbG9uZyBiZWVuIHRhbGtpbmcgb2YgbGVnaXNsYXRpb24gdG8gc2F2ZSBkYXlsaWdodCwKKyMgdGhlIGNpdHkgb2YgTW9vc2UgSmF3IFtTYXNrYXRjaGV3YW5dIGhhcyBhY3RlZCBvbiBpdHMgb3duIGhvb2suIgorIyBEU1QgaW4gTW9vc2UgSmF3IGJlZ2FuIG9uIFNhdHVyZGF5LCAxOTEyLTA2LTAxIChubyB0aW1lIG1lbnRpb25lZDoKKyMgcHJlc3VtYWJseSBsYXRlIGV2ZW5pbmcsIGFzIGJlbG93KSwgYW5kIHdvdWxkIHJ1biB1bnRpbCAidGhlIGVuZCBvZgorIyB0aGUgc3VtbWVyIi4gIFRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIG11bmljaXBhbCB0aW1lIGFuZCByYWlscm9hZAorIyB0aW1lIHdhcyBub3RlZC4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTA3LTI3KToKKyMgV2lsbGV0dCAoMTkxNC0wMykgbm90ZXMgdGhhdCBEU1QgImhhcyBiZWVuIGluIG9wZXJhdGlvbiAuLi4gaW4gdGhlCisjIENpdHkgb2YgTW9vc2UgSmF3LCBTYXNrYXRjaGV3YW4sIGZvciBvbmUgeWVhci4iCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzaW5jZSAxOTcwIHRoaXMgcmVnaW9uIGhhcyBtb3N0bHkgYmVlbiBhcyBSZWdpbmEuCisjIFNvbWUgd2VzdGVybiB0b3ducyAoZS5nLiBTd2lmdCBDdXJyZW50KSBzd2l0Y2hlZCBmcm9tIE1TVC9NRFQgdG8gQ1NUIGluIDE5NzIuCisjIE90aGVyIHdlc3Rlcm4gdG93bnMgKGUuZy4gTGxveWRtaW5zdGVyKSBhcmUgbGlrZSBFZG1vbnRvbi4KKyMgTWF0dGhld3MgYW5kIFZpbmNlbnQgKDE5OTgpIHdyaXRlIHRoYXQgRGVuYXJlIEJlYWNoIGFuZCBDcmVpZ2h0b24KKyMgYXJlIGxpa2UgV2lubmlwZWcsIGluIHZpb2xhdGlvbiBvZiBTYXNrYXRjaGV3YW4gbGF3LgorCisjIEZyb20gVy4gSm9uZXMgKDE5OTItMTEtMDYpOgorIyBUaGUuIC4gLmJlbG93IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIEkgZ290IGZyb20gb3VyIGxhdyBsaWJyYXJ5LCB0aGUKKyMgcHJvdmluY2lhbCBhcmNoaXZlcywgYW5kIHRoZSBwcm92aW5jaWFsIENvbW11bml0eSBTZXJ2aWNlcyBkZXBhcnRtZW50LgorIyBBIHByZWNpc2UgaGlzdG9yeSB3b3VsZCByZXF1aXJlIGRpZ2dpbmcgdGhyb3VnaCBuZXdzcGFwZXIgYXJjaGl2ZXMsIGFuZAorIyBzaW5jZSB5b3UgZGlkbid0IHNheSB3aGF0IHlvdSB3YW50ZWQsIEkgZGlkbid0IGJvdGhlci4KKyMKKyMgU2Fza2F0Y2hld2FuIGlzIHNwbGl0IGJ5IGEgdGltZSB6b25lIG1lcmlkaWFuICgxMDVXKSBhbmQgb3ZlciB0aGUgeWVhcnMKKyMgdGhlIGJvdW5kYXJ5IGJlY2FtZSBwcmV0dHkgcmFnZ2VkIGFzIGNvbW11bml0aWVzIG5lYXIgaXQgcmVldmFsdWF0ZWQKKyMgdGhlaXIgYWZmaWxpYXRpb25zIGluIG9uZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLiAgSW4gMTk2NSBhIHByb3ZpbmNpYWwKKyMgcmVmZXJlbmR1bSBmYXZvdXJlZCBsZWdpc2xhdGluZyBjb21tb24gdGltZSBwcmFjdGljZXMuCisjCisjIE9uIDE1IEFwcmlsIDE5NjYgdGhlIFRpbWUgQWN0IChjLiBULTE0LCBSZXZpc2VkIFN0YXR1dGVzIG9mCisjIFNhc2thdGNoZXdhbiAxOTc4KSB3YXMgcHJvY2xhaW1lZCwgYW5kIGVzdGFibGlzaGVkIHRoYXQgdGhlIGVhc3Rlcm4KKyMgcGFydCBvZiBTYXNrYXRjaGV3YW4gd291bGQgdXNlIENTVCB5ZWFyIHJvdW5kLCB0aGF0IGRpc3RyaWN0cyBpbgorIyBub3J0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkIGJ5IGRlZmF1bHQgZm9sbG93IENTVCBidXQgY291bGQgb3B0IHRvCisjIGZvbGxvdyBNb3VudGFpbiBUaW1lIHJ1bGVzICh0aHVzIDEgaG91ciBkaWZmZXJlbmNlIGluIHRoZSB3aW50ZXIgYW5kCisjIHplcm8gaW4gdGhlIHN1bW1lciksIGFuZCB0aGF0IGRpc3RyaWN0cyBpbiBzb3V0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkCisjIGJ5IGRlZmF1bHQgZm9sbG93IE1UIGJ1dCBjb3VsZCBvcHQgdG8gZm9sbG93IENTVC4KKyMKKyMgSXQgdG9vayBhIGZldyB5ZWFycyBmb3IgdGhlIGR1c3QgdG8gc2V0dGxlIChJIGtub3cgb25lIHN0b3J5IG9mIGEgdG93bgorIyBvbiBvbmUgdGltZSB6b25lIGhhdmluZyBpdHMgc2Nob29sIGluIGFub3RoZXIsIHN1Y2ggdGhhdCBhIG1vbSBoYWQgdG8KKyMgc2VydmUgaGVyIGZhbWlseSBsdW5jaCBpbiB0d28gc2hpZnRzKSwgYnV0IHByZXNlbnRseSBpdCBzZWVtcyB0aGF0IG9ubHkKKyMgYSBmZXcgdG93bnMgb24gdGhlIGJvcmRlciB3aXRoIEFsYmVydGEgKGUuZy4gTGxveWRtaW5zdGVyKSBmb2xsb3cgTVQKKyMgcnVsZXMgYW55IG1vcmU7IGFsbCBvdGhlciBkaXN0cmljdHMgYXBwZWFyIHRvIGhhdmUgdXNlZCBDU1QgeWVhciByb3VuZAorIyBzaW5jZSBzb21ldGltZSBpbiB0aGUgMTk2MHMuCisKKyMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDYtMDYtMjYpOgorIyBUaGUgU2Fza2F0Y2hld2FuIHRpbWUgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk5NiBpcyBhYm91dCAzMCBwYWdlcworIyBsb25nIGFuZCByYXRoZXIgcGFpbmZ1bCB0byByZWFkLgorIyBodHRwOi8vd3d3LnFwLmdvdi5zay5jYS9kb2N1bWVudHMvRW5nbGlzaC9TdGF0dXRlcy9TdGF0dXRlcy9UMTQucGRmCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVJlZ2luYQkxOTE4CW9ubHkJLQlBcHIJMTQJMjowMAkxOjAwCUQKK1J1bGUJUmVnaW5hCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUworUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAorUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JT2N0CVN1bj49MQkwOjAwCTAJUworUnVsZQlSZWdpbmEJMTkzNwkxOTQxCS0JQXByCVN1bj49OAkwOjAwCTE6MDAJRAorUnVsZQlSZWdpbmEJMTkzNwlvbmx5CS0JT2N0CVN1bj49OAkwOjAwCTAJUworUnVsZQlSZWdpbmEJMTkzOAlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTAJUworUnVsZQlSZWdpbmEJMTkzOQkxOTQxCS0JT2N0CVN1bj49OAkwOjAwCTAJUworUnVsZQlSZWdpbmEJMTk0Mglvbmx5CS0JRmViCSA5CTI6MDAJMTowMAlXICMgV2FyCitSdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlBdWcJMTQJMjM6MDB1CTE6MDAJUCAjIFBlYWNlCitSdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JT2N0CVN1bj49OAkyOjAwCTAJUworUnVsZQlSZWdpbmEJMTk0NwkxOTU3CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJUmVnaW5hCTE5NDcJMTk1NwktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVJlZ2luYQkxOTU5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlSZWdpbmEJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMKK1J1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJU3dpZnQJMTk1OQkxOTYxCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJU3dpZnQJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJU3dpZnQJMTk2MAkxOTYxCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9SZWdpbmEJLTY6NTg6MzYgLQlMTVQJMTkwNSBTZXAKKwkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NjAgQXByIGxhc3RTdW4gMjowMAorCQkJLTY6MDAJLQlDU1QKK1pvbmUgQW1lcmljYS9Td2lmdF9DdXJyZW50IC03OjExOjIwIC0JTE1UCTE5MDUgU2VwCisJCQktNzowMAlDYW5hZGEJTSVzVAkxOTQ2IEFwciBsYXN0U3VuIDI6MDAKKwkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NTAKKwkJCS03OjAwCVN3aWZ0CU0lc1QJMTk3MiBBcHIgbGFzdFN1biAyOjAwCisJCQktNjowMAktCUNTVAorCisKKyMgQWxiZXJ0YQorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlFZG0JMTkxOAkxOTE5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAorUnVsZQlFZG0JMTkxOAlvbmx5CS0JT2N0CTMxCTI6MDAJMAlTCitSdWxlCUVkbQkxOTE5CW9ubHkJLQlNYXkJMjcJMjowMAkwCVMKK1J1bGUJRWRtCTE5MjAJMTkyMwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCUVkbQkxOTIwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlFZG0JMTkyMQkxOTIzCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJRWRtCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgorUnVsZQlFZG0JMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQorUnVsZQlFZG0JMTk0NQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJRWRtCTE5NDcJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCUVkbQkxOTQ3CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlFZG0JMTk2Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJRWRtCTE5NjcJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUVkbQkxOTY5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlFZG0JMTk2OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJRWRtCTE5NzIJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCUVkbQkxOTcyCTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0VkbW9udG9uCS03OjMzOjUyIC0JTE1UCTE5MDYgU2VwCisJCQktNzowMAlFZG0JTSVzVAkxOTg3CisJCQktNzowMAlDYW5hZGEJTSVzVAorCisKKyMgQnJpdGlzaCBDb2x1bWJpYQorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgdGhpcyByZWdpb24gaGFzCisjIGJlZW4gbGlrZSBWYW5jb3V2ZXIuCisjIERhd3NvbiBDcmVlayB1c2VzIE1TVC4gIE11Y2ggb2YgZWFzdCBCQyBpcyBsaWtlIEVkbW9udG9uLgorIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBDcmVzdG9uIGlzIGxpa2UgRGF3c29uIENyZWVrLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlWYW5jCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAorUnVsZQlWYW5jCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUworUnVsZQlWYW5jCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgorUnVsZQlWYW5jCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKK1J1bGUJVmFuYwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKK1J1bGUJVmFuYwkxOTQ2CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlWYW5jCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUworUnVsZQlWYW5jCTE5NDcJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCVZhbmMJMTk2MgkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9WYW5jb3V2ZXIJLTg6MTI6MjggLQlMTVQJMTg4NAorCQkJLTg6MDAJVmFuYwlQJXNUCTE5ODcKKwkJCS04OjAwCUNhbmFkYQlQJXNUCitab25lIEFtZXJpY2EvRGF3c29uX0NyZWVrIC04OjAwOjU2IC0JTE1UCTE4ODQKKwkJCS04OjAwCUNhbmFkYQlQJXNUCTE5NDcKKwkJCS04OjAwCVZhbmMJUCVzVAkxOTcyIEF1ZyAzMCAyOjAwCisJCQktNzowMAktCU1TVAorCisKKyMgTm9ydGh3ZXN0IFRlcnJpdG9yaWVzLCBOdW5hdnV0LCBZdWtvbgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBEYXdzb24gc3dpdGNoZWQgdG8gUFNUIGluIDE5NzMuICBJbnV2aWsgc3dpdGNoZWQgdG8gTVNUIGluIDE5NzkuCisjIE1hdGhldyBFbmdsYW5kZXIgKDE5OTYtMTAtMDcpIGdpdmVzIHRoZSBmb2xsb3dpbmcgcmVmczoKKyMJKiAxOTY3LiBQYXJhZ3JhcGggMjgoMzQpKGcpIG9mIHRoZSBJbnRlcnByZXRhdGlvbiBBY3QsIFMuQy4gMTk2Ny02OCwKKyMJYy4gNyBkZWZpbmVzIFl1a29uIHN0YW5kYXJkIHRpbWUgYXMgVVRDLTkuICBUaGlzIGlzIHN0aWxsIHZhbGlkOworIwlzZWUgSW50ZXJwcmV0YXRpb24gQWN0LCBSLlMuQy4gMTk4NSwgYy4gSS0yMSwgcy4gMzUoMSkuCisjCSogQy5PLiAxOTczLzIxNCBzd2l0Y2hlZCBZdWtvbiB0byBQU1Qgb24gMTk3My0xMC0yOCAwMDowMC4KKyMJKiBPLkkuQy4gMTk4MC8wMiBlc3RhYmxpc2hlZCBEU1QuCisjCSogTy5JLkMuIDE5ODcvMDU2IGNoYW5nZWQgRFNUIHRvIEFwciBmaXJzdFN1biAyOjAwIHRvIE9jdCBsYXN0U3VuIDI6MDAuCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgWXVrb24ncyAxOTczLTEwLTI4IHN3aXRjaCB3YXMgYXQgMjowMDsgZ28KKyMgd2l0aCBFbmdsYW5kZXIuCisjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA2LTI2KToKKyMgSGVyZSBpcyBhIGxpbmsgdG8gdGhlIG9sZCBkYXlsaWdodCBzYXZpbmcgcG9ydGlvbiBvZiB0aGUgaW50ZXJwcmV0YXRpb24KKyMgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk4NzoKKyMgaHR0cDovL3d3dy5nb3YueWsuY2EvbGVnaXNsYXRpb24vcmVncy9vaWMxOTg3XzA1Ni5wZGYKKworIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTA5LTA0KToKKyMgTnVuYXZ1dCAuLi4gbW92ZWQgLi4uIHRvIGluY29ycG9yYXRlIHRoZSB3aG9sZSB0ZXJyaXRvcnkgaW50byBvbmUgdGltZSB6b25lLgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vbnVuYXZ1dC9udnQ5MDkwM18xMy5odG1sIj4KKyMgTnVuYXZ1dCBtb3ZlcyB0byBzaW5nbGUgdGltZSB6b25lIE9jdC4gMzEKKyMgPC9hPgorIworIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5OS0wOS0wNik6CisjIFdlIHRoZW4gbmVlZCB0byBjcmVhdGUgYSBuZXcgdGltZXpvbmUgZm9yIHRoZSBLaXRpa21lb3QgcmVnaW9uIG9mIE51bmF2dXQKKyMgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBZZWxsb3drbmlmZSByZWdpb24uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sIj4KKyMgQmFzaWMgRmFjdHM6IFRoZSBOZXcgVGVycml0b3J5CisjIDwvYT4gKDE5OTkpIHJlcG9ydHMgdGhhdCBQYW5nbmlydHVuZyBvcGVyYXRlcyBvbiBlYXN0ZXJuIHRpbWUsCisjIGFuZCB0aGF0IENvcmFsIEhhcmJvdXIgZG9lcyBub3Qgb2JzZXJ2ZSBEU1QuICBXZSBkb24ndCBrbm93IHdoZW4KKyMgUGFuZ25pcnR1bmcgc3dpdGNoZWQgdG8gZWFzdGVybiB0aW1lOyB3ZSdsbCBndWVzcyAxOTk1LgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDgpOgorIyBPbiBPY3RvYmVyIDMxLCB3aGVuIHRoZSByZXN0IG9mIE51bmF2dXQgd2VudCB0byBDZW50cmFsIHRpbWUsCisjIFBhbmduaXJ0dW5nIHdvYmJsZWQuICBIZXJlIGlzIHRoZSByZXN1bHQgb2YgdGhlaXIgd29iYmxlOgorIworIyBUaGUgZm9sbG93aW5nIGJ1c2luZXNzZXMgYW5kIG9yZ2FuaXphdGlvbnMgaW4gUGFuZ25pcnR1bmcgdXNlIENlbnRyYWwgVGltZToKKyMKKyMJRmlyc3QgQWlyLCBQb3dlciBDb3JwLCBOdW5hdnV0IENvbnN0cnVjdGlvbiwgSGVhbHRoIENlbnRlciwgUkNNUCwKKyMJRWFzdGVybiBBcmN0aWMgTmF0aW9uYWwgUGFya3MsIEEgJiBEIFNwZWNpYWxpc3QKKyMKKyMgVGhlIGZvbGxvd2luZyBidXNpbmVzc2VzIGFuZCBvcmdhbml6YXRpb25zIGluIFBhbmduaXJ0dW5nIHVzZSBFYXN0ZXJuIFRpbWU6CisjCisjCUhhbWxldCBvZmZpY2UsIEFsbCBvdGhlciBidXNpbmVzc2VzLCBCb3RoIHNjaG9vbHMsIEFpcnBvcnQgb3BlcmF0b3IKKyMKKyMgVGhpcyBoYXMgbWFkZSBmb3IgYW4gaW50ZXJlc3Rpbmcgc2l0dWF0aW9uIHRoZXJlLCB3aGljaCB3YXJyYW50ZWQgdGhlIG5ld3MuCisjIE5vIG9uZSB0aGVyZSB0aGF0IEkgc3Bva2Ugd2l0aCBzZWVtcyBjb25jZXJuZWQsIG9yIGhhcyBwbGFucyB0bworIyBjaGFuZ2UgdGhlIGxvY2FsIG1ldGhvZHMgb2Yga2VlcGluZyB0aW1lLCBhcyBpdCBldmlkZW50bHkgZG9lcyBub3QKKyMgcmVhbGx5IGludGVyZmVyZSB3aXRoIGFueSBhY3Rpdml0aWVzIG9yIG1ha2UgdGhpbmdzIGRpZmZpY3VsdCBsb2NhbGx5LgorIyBUaGV5IHBsYW4gdG8gY2VsZWJyYXRlIE5ldyBZZWFyJ3MgdHVybi1vdmVyIHR3aWNlLCBvbmUgaG91ciBhcGFydCwKKyMgc28gaXQgYXBwZWFycyB0aGF0IHRoZSBzaXR1YXRpb24gd2lsbCBsYXN0IGF0IGxlYXN0IHRoYXQgbG9uZy4KKyMgVGhlIE51bmF2dXQgSW50ZXJnb3Zlcm5tZW50YWwgQWZmYWlycyBob3BlcyB0aGF0IHRoZXkgd2lsbCAiY29tZSB0bworIyB0aGVpciBzZW5zZXMiLCBidXQgdGhlIGxvY2FscyBldmlkZW50bHkgZG9uJ3Qgc2VlIGFueSBwcm9ibGVtIHdpdGgKKyMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycy4KKworIyBGcm9tIE1pY2hhZWxhIFJvZHJpZ3VlLCB3cml0aW5nIGluIHRoZQorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sIj4KKyMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpPC9hPjoKKyMgQ2x5ZGUgUml2ZXIsIFBhbmduaXJ0dW5nIGFuZCBTYW5pa2lsdWFxIG5vdyBvcGVyYXRlIHdpdGggdHdvIHRpbWUgem9uZXMsCisjIGNlbnRyYWwgLSBvciBOdW5hdnV0IHRpbWUgLSBmb3IgZ292ZXJubWVudCBvZmZpY2VzLCBhbmQgZWFzdGVybiB0aW1lCisjIGZvciBtdW5pY2lwYWwgb2ZmaWNlcyBhbmQgc2Nob29scy4uLi4gIElnbG9vbGlrIFt3YXMgc2ltaWxhciBidXQgdGhlbl0KKyMgbWFkZSB0aGUgc3dpdGNoIHRvIGNlbnRyYWwgdGltZSBvbiBTYXR1cmRheSwgTm92LiA2LgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgorIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgc2F5IHRoZSBmb2xsb3dpbmcsIGJ1dCB3ZSBsYWNrIGhpc3RvcmllcworIyBmb3IgdGhlc2UgcG90ZW50aWFsIG5ldyBab25lcy4KKyMKKyMgVGhlIENhbmFkaWFuIEZvcmNlcyBzdGF0aW9uIGF0IEFsZXJ0IHVzZXMgRWFzdGVybiBUaW1lIHdoaWxlIHRoZQorIyBoYW5kZnVsIG9mIHJlc2lkZW50cyBhdCB0aGUgRXVyZWthIHdlYXRoZXIgc3RhdGlvbiBbaW4gdGhlIENlbnRyYWwKKyMgem9uZV0gc2tpcCBkYXlsaWdodCBzYXZpbmdzLiAgQmFmZmluIElzbGFuZCwgd2hpY2ggaXMgY3Jvc3NlZCBieSB0aGUKKyMgQ2VudHJhbCwgRWFzdGVybiBhbmQgQXRsYW50aWMgVGltZSB6b25lcyBvbmx5IHVzZXMgRWFzdGVybiBUaW1lLgorIyBHam9hIEhhdmVuLCBUYWxveW9hayBhbmQgUGVsbHkgQmF5IGFsbCB1c2UgTW91bnRhaW4gaW5zdGVhZCBvZgorIyBDZW50cmFsIFRpbWUgYW5kIFNvdXRoYW1wdG9uIElzbGFuZCBbaW4gdGhlIENlbnRyYWwgem9uZV0gaXMgbm90CisjIHJlcXVpcmVkIHRvIHVzZSBkYXlsaWdodCBzYXZpbmdzLgorCisjIEZyb20KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL2FyY2hpdmVzL251bmF2dXQwMDExMzAvbnZ0MjExMTBfMDIuaHRtbCI+CisjIE51bmF2dXQgbm93IGhhcyB0d28gdGltZSB6b25lcworIyA8L2E+ICgyMDAwLTExLTEwKToKKyMgVGhlIE51bmF2dXQgZ292ZXJubWVudCB3b3VsZCBhbGxvdyBpdHMgZW1wbG95ZWVzIGluIEt1Z2x1a3R1ayBhbmQKKyMgQ2FtYnJpZGdlIEJheSB0byBvcGVyYXRlIG9uIGNlbnRyYWwgdGltZSB5ZWFyLXJvdW5kLCBwdXR0aW5nIHRoZW0KKyMgb25lIGhvdXIgYmVoaW5kIHRoZSByZXN0IG9mIE51bmF2dXQgZm9yIHNpeCBtb250aHMgZHVyaW5nIHRoZSB3aW50ZXIuCisjIEF0IHRoZSBlbmQgb2YgT2N0b2JlciB0aGUgdHdvIGNvbW11bml0aWVzIGhhZCByZWJlbGxlZCBhZ2FpbnN0CisjIE51bmF2dXQncyB1bmlmaWVkIHRpbWUgem9uZSwgcmVmdXNpbmcgdG8gc2hpZnQgdG8gZWFzdGVybiB0aW1lIHdpdGgKKyMgdGhlIHJlc3Qgb2YgdGhlIHRlcnJpdG9yeSBmb3IgdGhlIHdpbnRlci4gIENhbWJyaWRnZSBCYXkgcmVtYWluZWQgb24KKyMgY2VudHJhbCB0aW1lLCB3aGlsZSBLdWdsdWt0dWssIGV2ZW4gZmFydGhlciB3ZXN0LCByZXZlcnRlZCB0bworIyBtb3VudGFpbiB0aW1lLCB3aGljaCB0aGV5IGhhZCB1c2VkIGJlZm9yZSB0aGUgYWR2ZW50IG9mIE51bmF2dXQncworIyB1bmlmaWVkIHRpbWUgem9uZSBpbiAxOTk5LgorIworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTAxLTIwKSwgcXVvdGluZyB0aGUgTnVuYXZ1dCBnb3Zlcm5tZW50OgorIyBUaGUgcHJlY2VkaW5nIGRlY2lzaW9uIGNhbWUgaW50byBlZmZlY3QgYXQgbWlkbmlnaHQsIFNhdHVyZGF5IE5vdiA0LCAyMDAwLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgorIyBMZXQncyBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIG9mZmljaWFsIHRpbWVzIGZvciBub3cuCisKKyMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0wMy0wNyk6CisjIFRoZSBwcmVtaWVyIG9mIE51bmF2dXQgaGFzIGlzc3VlZCBhIG1pbmlzdGVyaWFsIHN0YXRlbWVudCBhZHZpc2luZworIyB0aGF0IGVmZmVjdGl2ZSAyMDAxLTA0LTAxLCB0aGUgdGVycml0b3J5IG9mIE51bmF2dXQgd2lsbCByZXZlcnQKKyMgYmFjayB0byB0aHJlZSB0aW1lIHpvbmVzIChtb3VudGFpbiwgY2VudHJhbCwgYW5kIGVhc3Rlcm4pLiAgT2YgdGhlCisjIGNpdGllcyBpbiBOdW5hdnV0LCBDb3JhbCBIYXJib3IgaXMgdGhlIG9ubHkgb25lIHRoYXQgSSBrbm93IG9mIHRoYXQKKyMgaGFzIHNhaWQgaXQgd2lsbCBub3Qgb2JzZXJ2ZSBkc3QsIHN0YXlpbmcgb24gRVNUIHllYXIgcm91bmQuICBJJ20KKyMgY2hlY2tpbmcgZm9yIG1vcmUgaW5mbywgYW5kIHdpbGwgZ2V0IGJhY2sgdG8geW91IGlmIEkgY29tZSB1cCB3aXRoCisjIG1vcmUuCisjIFtBbHNvIHNlZSA8aHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0MTAzMDlfMDYuaHRtbD4gKDIwMDEtMDMtMDkpLl0KKworIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA1LTIxKToKKyMgQWNjb3JkaW5nIHRvIG1hcHMgYXQKKyMgaHR0cDovL2lubXMtaWVubS5ucmMtY25yYy5nYy5jYS9pbWFnZXMvdGltZV9zZXJ2aWNlcy9UWjAxU1dFLmpwZworIyBodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2ltYWdlcy90aW1lX3NlcnZpY2VzL1RaMDFTU0UuanBnCisjIChib3RoIGRhdGVkIDIwMDMpLCBhbmQKKyMgaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwCisjIChmcm9tIGEgMTk5OCBDYW5hZGlhbiBHZW9ncmFwaGljIGFydGljbGUpLCB0aGUgZGUgZmFjdG8gYW5kIGRlIGp1cmUgdGltZQorIyBmb3IgU291dGhhbXB0b24gSXNsYW5kIChhdCB0aGUgbm9ydGggZW5kIG9mIEh1ZHNvbiBCYXkpIGlzIFVUQy01IGFsbCB5ZWFyCisjIHJvdW5kLiAgVXNpbmcgR29vZ2xlLCBpdCdzIGVhc3kgdG8gZmluZCBvdGhlciB3ZWJzaXRlcyB0aGF0IGNvbmZpcm0gdGhpcy4KKyMgSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGhvdyBmYXIgYmFjayB0aGlzIHRpbWUgcmVnaW1lbiBnb2VzLCBidXQgc2luY2UgaXQKKyMgcHJlZGF0ZXMgdGhlIGNyZWF0aW9uIG9mIE51bmF2dXQsIGl0IHByb2JhYmx5IGdvZXMgYmFjayBtYW55IHllYXJzLi4uLgorIyBUaGUgSW51a3RpdHV0IG5hbWUgb2YgQ29yYWwgSGFyYm91ciBpcyBTYWxsaXQsIGJ1dCBpdCdzIHJhcmVseSB1c2VkLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA3LTI2KToKKyMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBhc3N1bWUgdGhhdCBTb3V0aGFtcHRvbiBJc2xhbmQgb2JzZXJ2ZWQKKyMgZGF5bGlnaHQgc2F2aW5nIG9ubHkgZHVyaW5nIHdhcnRpbWUuCisKKyMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMDEpOgorIyAuLi4gdGhlIGNvbW11bml0eSBvZiBSZXNvbHV0ZSAobG9jYXRlZCBvbiBDb3Jud2FsbGlzIElzbGFuZCBpbgorIyBOdW5hdnV0KSBtb3ZlZCBmcm9tIENlbnRyYWwgVGltZSB0byBFYXN0ZXJuIFRpbWUgbGFzdCBOb3ZlbWJlci4KKyMgQmFzaWNhbGx5IHRoZSBjb21tdW5pdHkgZGlkIG5vdCBjaGFuZ2UgaXRzIGNsb2NrcyBhdCB0aGUgZW5kIG9mCisjIGRheWxpZ2h0IHNhdmluZy4uLi4KKyMgaHR0cDovL3d3dy5ubnNsLmNvbS9mcmFtZXMvbmV3c3BhcGVycy8yMDA2LTExL25vdjEzXzA2bm9uZS5odG1sCisKKyMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMTQpOgorIyBUb2RheSBJIHBob25lZCB0aGUgImhhbWxldCBvZmZpY2UiIHRvIGZpbmQgb3V0IHdoYXQgUmVzb2x1dGUgd2FzIGRvaW5nIHdpdGgKKyMgaXRzIGNsb2Nrcy4KKyMKKyMgVGhlIGluZGl2aWR1YWwgdGhhdCBhbnN3ZXJlZCB0aGUgcGhvbmUgY29uZmlybWVkIHRoYXQgdGhlIGNsb2NrcyBkaWQgbm90CisjIG1vdmUgYXQgdGhlIGVuZCBvZiBkYXlsaWdodCBzYXZpbmcgb24gT2N0b2JlciAyOS8yMDA2LiAgSGUgYWxzbyB0b2xkIG1lIHRoYXQKKyMgdGhlIGNsb2NrcyBkaWQgbm90IG1vdmUgdGhpcyBwYXN0IHdlZWtlbmQgKE1hcmNoIDExLzIwMDcpLi4uLgorCisjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA4LTExLTEzKToKKyMgLi4udGhlIHJlc2lkZW50cyBvZiBSZXNvbHV0ZSBiZWxpZXZlIHRoYXQgdGhleSBhcmUgY2hhbmdpbmcgInRpbWUgem9uZXMiCisjIHR3aWNlIGEgeWVhci4gIEluIHdpbnRlciBtb250aHMsIGxvY2FsIHRpbWUgaXMgcXVhbGlmaWVkIHdpdGggIkVhc3Rlcm4KKyMgVGltZSIgd2hpY2ggaXMgcmVhbGx5ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgKFVUQy01KSIuICBJbiBzdW1tZXIKKyMgbW9udGhzLCBsb2NhbCB0aW1lIGlzIHF1YWxpZmllZCB3aXRoICJDZW50cmFsIFRpbWUiIHdoaWNoIGlzIHJlYWxseQorIyAiQ2VudHJhbCBEYXlsaWdodCBUaW1lIChVVEMtNSkiLi4uCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCU5UX1lLCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAorUnVsZQlOVF9ZSwkxOTE4CW9ubHkJLQlPY3QJMjcJMjowMAkwCVMKK1J1bGUJTlRfWUsJMTkxOQlvbmx5CS0JTWF5CTI1CTI6MDAJMTowMAlECitSdWxlCU5UX1lLCTE5MTkJb25seQktCU5vdgkgMQkwOjAwCTAJUworUnVsZQlOVF9ZSwkxOTQyCW9ubHkJLQlGZWIJIDkJMjowMAkxOjAwCVcgIyBXYXIKK1J1bGUJTlRfWUsJMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQorUnVsZQlOVF9ZSwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKK1J1bGUJTlRfWUsJMTk2NQlvbmx5CS0JQXByCWxhc3RTdW4JMDowMAkyOjAwCURECitSdWxlCU5UX1lLCTE5NjUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCU5UX1lLCTE5ODAJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCU5UX1lLCTE5ODAJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCU5UX1lLCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KKyMgYWthIFBhbm5pcXR1dXEKK1pvbmUgQW1lcmljYS9QYW5nbmlydHVuZyAwCS0Jenp6CTE5MjEgIyB0cmFkaW5nIHBvc3QgZXN0LgorCQkJLTQ6MDAJTlRfWUsJQSVzVAkxOTk1IEFwciBTdW4+PTEgMjowMAorCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk5OSBPY3QgMzEgMjowMAorCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMjAwMCBPY3QgMjkgMjowMAorCQkJLTU6MDAJQ2FuYWRhCUUlc1QKKyMgZm9ybWVybHkgRnJvYmlzaGVyIEJheQorWm9uZSBBbWVyaWNhL0lxYWx1aXQJMAktCXp6egkxOTQyIEF1ZyAjIEZyb2Jpc2hlciBCYXkgZXN0LgorCQkJLTU6MDAJTlRfWUsJRSVzVAkxOTk5IE9jdCAzMSAyOjAwCisJCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCisJCQktNTowMAlDYW5hZGEJRSVzVAorIyBha2EgUWF1c3VpdHR1cQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJUmVzb2x1dGUgMjAwNgltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlFUworUnVsZQlSZXNvbHV0ZSAyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkwCUNECitab25lIEFtZXJpY2EvUmVzb2x1dGUJMAktCXp6egkxOTQ3IEF1ZyAzMSAjIFJlc29sdXRlIGZvdW5kZWQKKwkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwMSBBcHIgIDEgMzowMAorCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMjAwNiBPY3QgMjkgMjowMAorCQkJLTU6MDAJUmVzb2x1dGUJJXNUCisjIGFrYSBLYW5naXFpbmlxCitab25lIEFtZXJpY2EvUmFua2luX0lubGV0IDAJLQl6enoJMTk1NyAjIFJhbmtpbiBJbmxldCBmb3VuZGVkCisJCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCisjIGFrYSBJcWFsdWt0dXV0dGlhcQorWm9uZSBBbWVyaWNhL0NhbWJyaWRnZV9CYXkgMAktCXp6egkxOTIwICMgdHJhZGluZyBwb3N0IGVzdC4/CisJCQktNzowMAlOVF9ZSwlNJXNUCTE5OTkgT2N0IDMxIDI6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDAgTm92ICA1IDA6MDAKKwkJCS02OjAwCS0JQ1NUCTIwMDEgQXByICAxIDM6MDAKKwkJCS03OjAwCUNhbmFkYQlNJXNUCitab25lIEFtZXJpY2EvWWVsbG93a25pZmUgMAktCXp6egkxOTM1ICMgWWVsbG93a25pZmUgZm91bmRlZD8KKwkJCS03OjAwCU5UX1lLCU0lc1QJMTk4MAorCQkJLTc6MDAJQ2FuYWRhCU0lc1QKK1pvbmUgQW1lcmljYS9JbnV2aWsJMAktCXp6egkxOTUzICMgSW51dmlrIGZvdW5kZWQKKwkJCS04OjAwCU5UX1lLCVAlc1QJMTk3OSBBcHIgbGFzdFN1biAyOjAwCisJCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKKwkJCS03OjAwCUNhbmFkYQlNJXNUCitab25lIEFtZXJpY2EvV2hpdGVob3JzZQktOTowMDoxMiAtCUxNVAkxOTAwIEF1ZyAyMAorCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTY2IEp1bCAxIDI6MDAKKwkJCS04OjAwCU5UX1lLCVAlc1QJMTk4MAorCQkJLTg6MDAJQ2FuYWRhCVAlc1QKK1pvbmUgQW1lcmljYS9EYXdzb24JLTk6MTc6NDAgLQlMTVQJMTkwMCBBdWcgMjAKKwkJCS05OjAwCU5UX1lLCVklc1QJMTk3MyBPY3QgMjggMDowMAorCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTgwCisJCQktODowMAlDYW5hZGEJUCVzVAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBNZXhpY28KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKKyMgVGhlIEludmVzdGlnYXRpb24gYW5kIEFuYWx5c2lzIFNlcnZpY2Ugb2YgdGhlCisjIE1leGljYW4gTGlicmFyeSBvZiBDb25ncmVzcyAoTUxvQykgaGFzIHB1Ymxpc2hlZCBhCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvIj4KKyMgaGlzdG9yeSBvZiBNZXhpY2FuIGxvY2FsIHRpbWUgKGluIFNwYW5pc2gpCisjIDwvYT4uCisjCisjIEhlcmUgYXJlIHRoZSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gU2hhbmtzICYgUG90dGVuZ2VyIChTJlApIGFuZCB0aGUgTUxvQy4KKyMgKEluIGFsbCBjYXNlcyB3ZSBnbyB3aXRoIHRoZSBNTG9DLikKKyMgUyZQIHJlcG9ydCB0aGF0IEJhamEgd2FzIGF0IC04OjAwIGluIDE5MjIvMTkyMy4KKyMgUyZQIHNheSB0aGUgMTkzMCB0cmFuc2l0aW9uIGluIEJhamEgd2FzIDE5MzAtMTEtMTYuCisjIFMmUCByZXBvcnQgbm8gRFNUIGR1cmluZyBzdW1tZXIgMTkzMS4KKyMgUyZQIHJlcG9ydCBhIHRyYW5zaXRpb24gYXQgMTkzMi0wMy0zMCAyMzowMCwgbm90IDE5MzItMDQtMDEuCisKKyMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wMi0yMCk6CisjIFRoZXJlIGFyZSBzb21lIG90aGVyIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiB0aGUgRGVjcmVlcyBwYWdlIGFuZCB0aGUKKyMgdHogZGF0YWJhc2UuICBJIHRoaW5rIHRoZXkgY2FuIGJlc3QgYmUgZXhwbGFpbmVkIGJ5IHN1cHBvc2luZyB0aGF0CisjIHRoZSByZXNlYXJjaGVycyB3aG8gcHJlcGFyZWQgdGhlIERlY3JlZXMgcGFnZSBmYWlsZWQgdG8gZmluZCBzb21lIG9mCisjIHRoZSByZWxldmFudCBkb2N1bWVudHMuCisKKyMgRnJvbSBBbGFuIFBlcnJ5ICgxOTk2LTAyLTE1KToKKyMgQSBndXkgZnJvbSBvdXIgTWV4aWNvIHN1YnNpZGlhcnkgZmluYWxseSBmb3VuZCB0aGUgUHJlc2lkZW50aWFsIERlY3JlZQorIyBvdXRsaW5pbmcgdGhlIHRpbWV6b25lIGNoYW5nZXMgaW4gTWV4aWNvLgorIworIyAtLS0tLS0tLS0tLS0tIEJlZ2luIEZvcndhcmRlZCBNZXNzYWdlIC0tLS0tLS0tLS0tLS0KKyMKKyMgSSBmaW5hbGx5IGdvdCBteSBoYW5kcyBvbiB0aGUgT2ZmaWNpYWwgUHJlc2lkZW50aWFsIERlY3JlZSB0aGF0IHNldHMgdXAgdGhlCisjIHJ1bGVzIGZvciB0aGUgRFNUIGNoYW5nZXMuIFRoZSBydWxlcyBhcmU6CisjCisjIDEuIFRoZSBjb3VudHJ5IGlzIGRpdmlkZWQgaW4gMyB0aW1lem9uZXM6CisjICAgIC0gQmFqYSBDYWxpZm9ybmlhIE5vcnRlICh0aGUgTWV4aWNvL0JhamFOb3J0ZSBUWikKKyMgICAgLSBCYWphIENhbGlmb3JuaWEgU3VyLCBOYXlhcml0LCBTaW5hbG9hIGFuZCBTb25vcmEgKHRoZSBNZXhpY28vQmFqYVN1ciBUWikKKyMgICAgLSBUaGUgcmVzdCBvZiB0aGUgY291bnRyeSAodGhlIE1leGljby9HZW5lcmFsIFRaKQorIworIyAyLiBGcm9tIHRoZSBmaXJzdCBTdW5kYXkgaW4gQXByaWwgYXQgMjowMCBBTSB0byB0aGUgbGFzdCBTdW5kYXkgaW4gT2N0b2JlcgorIyAgICBhdCAyOjAwIEFNLCB0aGUgdGltZXMgaW4gZWFjaCB6b25lIGFyZSBhcyBmb2xsb3dzOgorIyAgICBCYWphTm9ydGU6IEdNVCs3CisjICAgIEJhamFTdXI6ICAgR01UKzYKKyMgICAgR2VuZXJhbDogICBHTVQrNQorIworIyAzLiBUaGUgcmVzdCBvZiB0aGUgeWVhciwgdGhlIHRpbWVzIGFyZSBhcyBmb2xsb3dzOgorIyAgICBCYWphTm9ydGU6IEdNVCs4CisjICAgIEJhamFTdXI6ICAgR01UKzcKKyMgICAgR2VuZXJhbDogICBHTVQrNgorIworIyBUaGUgRGVjcmVlIHdhcyBwdWJsaXNoZWQgaW4gTWV4aWNvJ3MgT2ZmaWNpYWwgTmV3c3BhcGVyIG9uIEphbnVhcnkgNHRoLgorIworIyAtLS0tLS0tLS0tLS0tLSBFbmQgRm9yd2FyZGVkIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wNi0xMik6CisjIEZvciBhbiBFbmdsaXNoIHRyYW5zbGF0aW9uIG9mIHRoZSBkZWNyZWUsIHNlZQorIyA8YSBocmVmPSJodHRwOi8vbWV4aWNvLXRyYXZlbC5jb20vZXh0cmEvdGltZXpvbmVfZW5nLmh0bWwiPgorIyBgYERpYXJpbyBPZmljaWFsOiBUaW1lIFpvbmUgQ2hhbmdlb3ZlcicnICgxOTk2LTAxLTA0KS4KKyMgPC9hPgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDE5OTgtMTAtMDgpOgorIyBUaGUgU3RhdGUgb2YgUXVpbnRhbmEgUm9vIGhhcyByZXZlcnRlZCBiYWNrIHRvIGNlbnRyYWwgU1REIGFuZCBEU1QgdGltZXMKKyMgKGkuZS4gVVRDIC0wNjAwIGFuZCAtMDUwMCBhcyBvZiAxOTk4LTA4LTAyKS4KKworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTAxLTEwKToKKyMgRWZmZWN0aXZlIEFwcmlsIDQsIDE5OTkgYXQgMjowMCBBTSBsb2NhbCB0aW1lLCBTb25vcmEgY2hhbmdlZCB0byB0aGUgdGltZQorIyB6b25lIDUgaG91cnMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIGFuZCB3aWxsIG5vdCBvYnNlcnZlIGRheWxpZ2h0CisjIHNhdmluZ3MgdGltZSBzbyBhcyB0byBzdGF5IG9uIHRoZSBzYW1lIHRpbWUgem9uZSBhcyB0aGUgc291dGhlcm4gcGFydCBvZgorIyBBcml6b25hIHllYXIgcm91bmQuCisKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQsIHRyYW5zbGF0aW5nCisjIDxodHRwOi8vd3d3LnJlZm9ybWEuY29tL25hY2lvbmFsL2FydGljdWxvLzA2NDMyNy8+ICgyMDAxLTAxLTE3KToKKyMgSW4gT2F4YWNhLCB0aGUgNTUuMDAwIHRlYWNoZXJzIGZyb20gdGhlIFNlY3Rpb24gMjIgb2YgdGhlIE5hdGlvbmFsCisjIFN5bmRpY2F0ZSBvZiBFZHVjYXRpb24gV29ya2VycywgcmVmdXNlIHRvIGFwcGx5IGRheWxpZ2h0IHNhdmluZyBlYWNoCisjIHllYXIsIHNvIHRoYXQgdGhlIG1vcmUgdGhhbiAxMCwwMDAgc2Nob29scyB3b3JrIGF0IG5vcm1hbCBob3VyIHRoZQorIyB3aG9sZSB5ZWFyLgorCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDEtMTkpOgorIyA8aHR0cDovL3d3dy5yZWZvcm1hLmNvbS9uZWdvY2lvc195X2RpbmVyby9hcnRpY3Vsby8wNjQ0ODEvPiAuLi4gc2F5cworIyAodHJhbnNsYXRlZCk6Li4uCisjIEphbnVhcnkgMTcsIDIwMDAgLSBUaGUgRW5lcmd5IFNlY3JldGFyeSwgRXJuZXN0byBNYXJ0ZW5zLCBhbm5vdW5jZWQKKyMgdGhhdCBTdW1tZXIgVGltZSB3aWxsIGJlIHJlZHVjZWQgZnJvbSBzZXZlbiB0byBmaXZlIG1vbnRocywgc3RhcnRpbmcKKyMgdGhpcyB5ZWFyLi4uLgorIyA8aHR0cDovL3d3dy5wdWJsaWNvLmNvbS5teC9zY3JpcHRzL3RleHRvMy5hc3A/YWN0aW9uPXBhZ2luYSZwYWc9MjEmcG9zPXAmc2VjYz1uYWNpJmRhdGU9MDEvMTcvMjAwMT4KKyMgW3RyYW5zbGF0ZWRdLCBzYXlzICJzdW1tZXIgdGltZSB3aWxsIC4uLiB0YWtlIGVmZmVjdCBvbiB0aGUgZmlyc3QgU3VuZGF5CisjIGluIE1heSwgYW5kIGVuZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyLgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDAxLTAxLTI1KToKKyMgVGhlIDIwMDEtMDEtMjQgdHJhZGl0aW9uYWwgV2FzaGluZ3RvbiBQb3N0IGNvbnRhaW5lZCB0aGUgcGFnZSBvbmUKKyMgc3RvcnkgIlRpbWVseSBJc3N1ZSBEaXZpZGVzIE1leGljYW5zLiIuLi4KKyMgaHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtZHluL2FydGljbGVzL0EzNzM4My0yMDAxSmFuMjMuaHRtbAorIyAuLi4gTWV4aWNvIENpdHkgTWF5b3IgTG9wZXogT2JyYWRvciAiLi4uaXMgdGhyZWF0ZW5pbmcgdG8ga2VlcAorIyBNZXhpY28gQ2l0eSBhbmQgaXRzIDIwIG1pbGxpb24gcmVzaWRlbnRzIG9uIGEgZGlmZmVyZW50IHRpbWUgdGhhbgorIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeS4uLiIgSW4gcGFydGljdWxhciwgTG9wZXogT2JyYWRvciB3b3VsZCBhYm9saXNoCisjIG9ic2VydmF0aW9uIG9mIERheWxpZ2h0IFNhdmluZyBUaW1lLgorCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29uYWUuZ29iLm14L2Fob3Jyby9kZWNyZXRvaG9ydmVyMjAwMS5odG1sI2RlY3JlIj4KKyMgT2ZmaWNpYWwgc3RhdHV0ZSBwdWJsaXNoZWQgYnkgdGhlIEVuZXJneSBEZXBhcnRtZW50CisjIDwvYT4gKDIwMDEtMDItMDEpIHNob3dzIEJhamEgYW5kIENoaWhhdWh1YSBhcyBzdGlsbCB1c2luZyBVUyBEU1QgcnVsZXMsCisjIGFuZCBTb25vcmEgd2l0aCBubyBEU1QuICBUaGlzIHdhcyByZXBvcnRlZCBieSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDItMDMpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDMpOgorIworIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhdGltZXMuY29tL25ld3MvbmF0aW9uLzIwMDEwMzAzL3QwMDAwMTg3NjYuaHRtbCI+CisjIEphbWVzIEYuIFNtaXRoIHdyaXRlcyBpbiB0b2RheSdzIExBIFRpbWVzCisjIDwvYT4KKyMgKiBTb25vcmEgd2lsbCBjb250aW51ZSB0byBvYnNlcnZlIHN0YW5kYXJkIHRpbWUuCisjICogTGFzdCB3ZWVrIE1leGljbyBDaXR5J3MgbWF5b3IgQW5kcmVzIE1hbnVlbCBMb3BleiBPYnJhZG9yIGRlY3JlZWQgdGhhdAorIyAgIHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgbm90IGFkb3B0IERTVC4KKyMgKiA0IG9mIDE2IGRpc3RyaWN0IGxlYWRlcnMgYW5ub3VuY2VkIHRoZXknbGwgaWdub3JlIHRoZSBkZWNyZWUuCisjICogVGhlIGRlY3JlZSBkb2VzIG5vdCBhZmZlY3QgZmVkZXJhbC1jb250cm9sbGVkIGZhY2lsaXRpZXMgaW5jbHVkaW5nCisjICAgdGhlIGFpcnBvcnQsIGJhbmtzLCBob3NwaXRhbHMsIGFuZCBzY2hvb2xzLgorIworIyBGb3Igbm93IHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgYm93IHRvIGZlZGVyYWwgcnVsZXMuCisKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDQtMDEpOgorIyBJIGZvdW5kIHNvbWUgcmVmZXJlbmNlcyB0byB0aGUgTWV4aWNhbiBhcHBsaWNhdGlvbiBvZiBkYXlsaWdodAorIyBzYXZpbmcsIHdoaWNoIG1vZGlmaWVzIHdoYXQgSSBoYWQgYWxyZWFkeSBzZW50IHlvdSwgc3RhdGluZyBlYXJsaWVyCisjIHRoYXQgYSBudW1iZXIgb2Ygbm9ydGhlcm4gTWV4aWNhbiBzdGF0ZXMgd291bGQgZ28gb24gZGF5bGlnaHQKKyMgc2F2aW5nLiBUaGUgbW9kaWZpY2F0aW9uIHJldmVydHMgdGhpcyB0byBvbmx5IGNvdmVyIEJhamEgQ2FsaWZvcm5pYQorIyAoTm9ydGUpLCB3aGlsZSBhbGwgb3RoZXIgc3RhdGVzIChleGNlcHQgU29ub3JhLCB3aG8gaGFzIG5vIGRheWxpZ2h0CisjIHNhdmluZyBhbGwgeWVhcikgd2lsbCBmb2xsb3cgdGhlIG9yaWdpbmFsIGRlY3JlZSBvZiBwcmVzaWRlbnQKKyMgVmljZW50ZSBGb3gsIHN0YXJ0aW5nIGRheWxpZ2h0IHNhdmluZyBNYXkgNiwgMjAwMSBhbmQgZW5kaW5nCisjIFNlcHRlbWJlciAzMCwgMjAwMS4KKyMgUmVmZXJlbmNlczogIkRpYXJpbyBkZSBNb250ZXJyZXkiIDx3d3cuZGlhcmlvZGVtb250ZXJyZXkuY29tL2luZGV4LmFzcD4KKyMgUGFsYWJyYSA8aHR0cDovL3BhbGFicmEuaW5mb3NlbC5jb20vMDEwMzMxL3ByaW1lcmEvcHByaTMxMDEucGRmPiAoMjAwMS0wMy0zMSkKKworIyBGcm9tIFJldXRlcnMgKDIwMDEtMDktMDQpOgorIyBNZXhpY28ncyBTdXByZW1lIENvdXJ0IG9uIFR1ZXNkYXkgZGVjbGFyZWQgdGhhdCBkYXlsaWdodCBzYXZpbmdzIHdhcworIyB1bmNvbnN0aXR1dGlvbmFsIGluIE1leGljbyBDaXR5LCBjcmVhdGluZyB0aGUgcG9zc2liaWxpdHkgdGhlCisjIGNhcGl0YWwgd2lsbCBiZSBpbiBhIGRpZmZlcmVudCB0aW1lIHpvbmUgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbmF0aW9uCisjIG5leHQgeWVhci4uLi4gIFRoZSBTdXByZW1lIENvdXJ0J3MgcnVsaW5nIHRha2VzIGVmZmVjdCBhdCAyOjAwCisjIGEubS4gKDA4MDAgR01UKSBvbiBTZXB0LiAzMCwgd2hlbiBNZXhpY28gaXMgc2NoZWR1bGVkIHRvIHJldmVydCB0bworIyBzdGFuZGFyZCB0aW1lLiAiVGhpcyBpcyBzbyByZXNpZGVudHMgb2YgdGhlIEZlZGVyYWwgRGlzdHJpY3QgYXJlIG5vdAorIyBzdWJqZWN0IHRvIHVuZXhwZWN0ZWQgdGltZSBjaGFuZ2VzLCIgYSBzdGF0ZW1lbnQgZnJvbSB0aGUgY291cnQgc2FpZC4KKworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwMi0wMy0xMik6CisjIC4uLiBjb25zdWx0aW5nIG15IGxvY2FsIGdyb2Nlcnkgc3RvcmUoISkgYW5kIG15IGNvd29ya2VycywgdGhleSBhbGwgaW5zaXN0ZWQKKyMgdGhhdCBhIG5ldyBkZWNpc2lvbiBoYWQgYmVlbiBtYWRlIHRvIHJlaW5zdGF0ZSBVUyBzdHlsZSBEU1QgaW4gTWV4aWNvLi4uLgorIyBodHRwOi8vd3d3LmNvbmFlLmdvYi5teC9haG9ycm8vaG9yYXZlcjIwMDFfbTFfMjAwMi5odG1sICgyMDAyLTAyLTIwKQorIyBjb25maXJtcyB0aGlzLiAgU29ub3JhIGFzIHVzdWFsIGlzIHRoZSBvbmx5IHN0YXRlIHdoZXJlIERTVCBpcyBub3QgYXBwbGllZC4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJTWV4aWNvCTE5MzkJb25seQktCUZlYgk1CTA6MDAJMTowMAlECitSdWxlCU1leGljbwkxOTM5CW9ubHkJLQlKdW4JMjUJMDowMAkwCVMKK1J1bGUJTWV4aWNvCTE5NDAJb25seQktCURlYwk5CTA6MDAJMTowMAlECitSdWxlCU1leGljbwkxOTQxCW9ubHkJLQlBcHIJMQkwOjAwCTAJUworUnVsZQlNZXhpY28JMTk0Mwlvbmx5CS0JRGVjCTE2CTA6MDAJMTowMAlXICMgV2FyCitSdWxlCU1leGljbwkxOTQ0CW9ubHkJLQlNYXkJMQkwOjAwCTAJUworUnVsZQlNZXhpY28JMTk1MAlvbmx5CS0JRmViCTEyCTA6MDAJMTowMAlECitSdWxlCU1leGljbwkxOTUwCW9ubHkJLQlKdWwJMzAJMDowMAkwCVMKK1J1bGUJTWV4aWNvCTE5OTYJMjAwMAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKK1J1bGUJTWV4aWNvCTE5OTYJMjAwMAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCU1leGljbwkyMDAxCW9ubHkJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECitSdWxlCU1leGljbwkyMDAxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlNZXhpY28JMjAwMgltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECitSdWxlCU1leGljbwkyMDAyCW1heAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjIFF1aW50YW5hIFJvbworWm9uZSBBbWVyaWNhL0NhbmN1bgktNTo0NzowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMjo1NgorCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKKwkJCS01OjAwCU1leGljbwlFJXNUCTE5OTggQXVnICAyICAyOjAwCisJCQktNjowMAlNZXhpY28JQyVzVAorIyBDYW1wZWNoZSwgWXVjYXRhbgorWm9uZSBBbWVyaWNhL01lcmlkYQktNTo1ODoyOCAtCUxNVAkxOTIyIEphbiAgMSAgMDowMTozMgorCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKKwkJCS01OjAwCS0JRVNUCTE5ODIgRGVjICAyCisJCQktNjowMAlNZXhpY28JQyVzVAorIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGVvbiwgVGFtYXVsaXBhcworWm9uZSBBbWVyaWNhL01vbnRlcnJleQktNjo0MToxNiAtCUxNVAkxOTIxIERlYyAzMSAyMzoxODo0NAorCQkJLTY6MDAJLQlDU1QJMTk4OAorCQkJLTY6MDAJVVMJQyVzVAkxOTg5CisJCQktNjowMAlNZXhpY28JQyVzVAorIyBDZW50cmFsIE1leGljbworWm9uZSBBbWVyaWNhL01leGljb19DaXR5IC02OjM2OjM2IC0JTE1UCTE5MjIgSmFuICAxICAwOjIzOjI0CisJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAorCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKKwkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCisJCQktNjowMAktCUNTVAkxOTMxIE9jdAorCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKKwkJCS02OjAwCU1leGljbwlDJXNUCTIwMDEgU2VwIDMwIDAyOjAwCisJCQktNjowMAktCUNTVAkyMDAyIEZlYiAyMAorCQkJLTY6MDAJTWV4aWNvCUMlc1QKKyMgQ2hpaHVhaHVhCitab25lIEFtZXJpY2EvQ2hpaHVhaHVhCS03OjA0OjIwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU1OjQwCisJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAorCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKKwkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCisJCQktNjowMAktCUNTVAkxOTMxIE9jdAorCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKKwkJCS02OjAwCS0JQ1NUCTE5OTYKKwkJCS02OjAwCU1leGljbwlDJXNUCTE5OTgKKwkJCS02OjAwCS0JQ1NUCTE5OTggQXByIFN1bj49MSAzOjAwCisJCQktNzowMAlNZXhpY28JTSVzVAorIyBTb25vcmEKK1pvbmUgQW1lcmljYS9IZXJtb3NpbGxvCS03OjIzOjUyIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjM2OjA4CisJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAorCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKKwkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCisJCQktNjowMAktCUNTVAkxOTMxIE9jdAorCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKKwkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0CisJCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAorCQkJLTg6MDAJLQlQU1QJMTk3MAorCQkJLTc6MDAJTWV4aWNvCU0lc1QJMTk5OQorCQkJLTc6MDAJLQlNU1QKKyMgQmFqYSBDYWxpZm9ybmlhIFN1ciwgTmF5YXJpdCwgU2luYWxvYQorWm9uZSBBbWVyaWNhL01hemF0bGFuCS03OjA1OjQwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU0OjIwCisJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAorCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKKwkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCisJCQktNjowMAktCUNTVAkxOTMxIE9jdAorCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKKwkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0CisJCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAorCQkJLTg6MDAJLQlQU1QJMTk3MAorCQkJLTc6MDAJTWV4aWNvCU0lc1QKKyMgQmFqYSBDYWxpZm9ybmlhCitab25lIEFtZXJpY2EvVGlqdWFuYQktNzo0ODowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMTo1NgorCQkJLTc6MDAJLQlNU1QJMTkyNAorCQkJLTg6MDAJLQlQU1QJMTkyNyBKdW4gMTAgMjM6MDAKKwkJCS03OjAwCS0JTVNUCTE5MzAgTm92IDE1CisJCQktODowMAktCVBTVAkxOTMxIEFwciAgMQorCQkJLTg6MDAJMTowMAlQRFQJMTkzMSBTZXAgMzAKKwkJCS04OjAwCS0JUFNUCTE5NDIgQXByIDI0CisJCQktODowMAkxOjAwCVBXVAkxOTQ1IEF1ZyAxNCAyMzowMHUKKwkJCS04OjAwCTE6MDAJUFBUCTE5NDUgTm92IDEyICMgUGVhY2UKKwkJCS04OjAwCS0JUFNUCTE5NDggQXByICA1CisJCQktODowMAkxOjAwCVBEVAkxOTQ5IEphbiAxNAorCQkJLTg6MDAJLQlQU1QJMTk1NAorCQkJLTg6MDAJQ0EJUCVzVAkxOTYxCisJCQktODowMAktCVBTVAkxOTc2CisJCQktODowMAlVUwlQJXNUCTE5OTYKKwkJCS04OjAwCU1leGljbwlQJXNUCTIwMDEKKwkJCS04OjAwCVVTCVAlc1QJMjAwMiBGZWIgMjAKKwkJCS04OjAwCU1leGljbwlQJXNUCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBGb3JtZXJseSB0aGVyZSB3YXMgYW4gQW1lcmljYS9FbnNlbmFkYSB6b25lLCB3aGljaCBkaWZmZXJlZCBmcm9tCisjIEFtZXJpY2EvVGlqdWFuYSBvbmx5IGluIHRoYXQgaXQgZGlkIG5vdCBvYnNlcnZlIERTVCBmcm9tIDE5NzYKKyMgdGhyb3VnaCAxOTk1LiAgVGhpcyB3YXMgYXMgcGVyIFNoYW5rcyAoMTk5OSkuICBCdXQgU2hhbmtzICYgUG90dGVuZ2VyIHNheQorIyBFbnNlbmFkYSBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk0OCB0aHJvdWdoIDE5NzUuICBHdXkgSGFycmlzIHJlcG9ydHMKKyMgdGhhdCB0aGUgMTk4NyBPQUcgc2F5cyAiT25seSBFbnNlbmFkYSwgTWV4aWNhbGUsIFNhbiBGZWxpcGUgYW5kCisjIFRpanVhbmEgb2JzZXJ2ZSBEU1QsIiB3aGljaCBhZ3JlZXMgd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYnV0IGltcGxpZXMgdGhhdAorIyBEU1Qtb2JzZXJ2YW5jZSB3YXMgYSB0b3duLWJ5LXRvd24gbWF0dGVyIGJhY2sgdGhlbi4gIFRoaXMgY29uY2VybnMKKyMgZGF0YSBhZnRlciAxOTcwIHNvIG1vc3QgbGlrZWx5IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgWm9uZQorIyBvdGhlciB0aGFuIEFtZXJpY2EvVGlqdWFuYSBmb3IgQmFqYSwgYnV0IGl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IGl0cworIyBuYW1lIG9yIGNvbnRlbnRzIHNob3VsZCBiZS4KKyMKKyMgUmV2aWxsYWdpZ2VkbyBJcworIyBubyBpbmZvcm1hdGlvbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQW5ndWlsbGEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9Bbmd1aWxsYQktNDoxMjoxNiAtCUxNVAkxOTEyIE1hciAyCisJCQktNDowMAktCUFTVAorCisjIEFudGlndWEgYW5kIEJhcmJ1ZGEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQW1lcmljYS9BbnRpZ3VhCS00OjA3OjEyIC0JTE1UCTE5MTIgTWFyIDIKKwkJCS01OjAwCS0JRVNUCTE5NTEKKwkJCS00OjAwCS0JQVNUCisKKyMgQmFoYW1hcworIworIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwNi0xMi0wNyk6CisjIFRoZSBCYWhhbWFzIGFubm91bmNlZCBhYm91dCBhIG1vbnRoIGFnbyB0aGF0IHRoZXkgcGxhbiB0byBjaGFuZ2UgdGhlaXIgRFNUCisjIHJ1bGVzIHRvIHN5bmMgd2l0aCB0aGUgVS5TLiBzdGFydGluZyBpbiAyMDA3Li4uLgorIyBodHRwOi8vd3d3LmpvbmVzYmFoYW1hcy5jb20vP2M9NDUmYT0xMDQxMgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlCYWhhbWFzCTE5NjQJMTk3NQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUJhaGFtYXMJMTk2NAkxOTc1CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQW1lcmljYS9OYXNzYXUJLTU6MDk6MjQgLQlMTVQJMTkxMiBNYXIgMgorCQkJLTU6MDAJQmFoYW1hcwlFJXNUCTE5NzYKKwkJCS01OjAwCVVTCUUlc1QKKworIyBCYXJiYWRvcworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQmFyYgkxOTc3CW9ubHkJLQlKdW4JMTIJMjowMAkxOjAwCUQKK1J1bGUJQmFyYgkxOTc3CTE5NzgJLQlPY3QJU3VuPj0xCTI6MDAJMAlTCitSdWxlCUJhcmIJMTk3OAkxOTgwCS0JQXByCVN1bj49MTUJMjowMAkxOjAwCUQKK1J1bGUJQmFyYgkxOTc5CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKK1J1bGUJQmFyYgkxOTgwCW9ubHkJLQlTZXAJMjUJMjowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9CYXJiYWRvcwktMzo1ODoyOCAtCUxNVAkxOTI0CQkjIEJyaWRnZXRvd24KKwkJCS0zOjU4OjI4IC0JQk1UCTE5MzIJICAjIEJyaWRnZXRvd24gTWVhbiBUaW1lCisJCQktNDowMAlCYXJiCUElc1QKKworIyBCZWxpemUKKyMgV2hpdG1hbiBlbnRpcmVseSBkaXNhZ3JlZXMgd2l0aCBTaGFua3M7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQmVsaXplCTE5MTgJMTk0MgktCU9jdAlTdW4+PTIJMDowMAkwOjMwCUhECitSdWxlCUJlbGl6ZQkxOTE5CTE5NDMJLQlGZWIJU3VuPj05CTA6MDAJMAlTCitSdWxlCUJlbGl6ZQkxOTczCW9ubHkJLQlEZWMJIDUJMDowMAkxOjAwCUQKK1J1bGUJQmVsaXplCTE5NzQJb25seQktCUZlYgkgOQkwOjAwCTAJUworUnVsZQlCZWxpemUJMTk4Mglvbmx5CS0JRGVjCTE4CTA6MDAJMTowMAlECitSdWxlCUJlbGl6ZQkxOTgzCW9ubHkJLQlGZWIJMTIJMDowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQW1lcmljYS9CZWxpemUJLTU6NTI6NDggLQlMTVQJMTkxMiBBcHIKKwkJCS02OjAwCUJlbGl6ZQlDJXNUCisKKyMgQmVybXVkYQorCisjIEZyb20gRGFuIEpvbmVzLCByZXBvcnRpbmcgaW4gVGhlIFJveWFsIEdhemV0dGUgKDIwMDYtMDYtMjYpOgorCisjIE5leHQgeWVhciwgaG93ZXZlciwgY2xvY2tzIGluIHRoZSBVUyB3aWxsIGdvIGZvcndhcmQgb24gdGhlIHNlY29uZCBTdW5kYXkKKyMgaW4gTWFyY2gsIHVudGlsIHRoZSBmaXJzdCBTdW5kYXkgaW4gTm92ZW1iZXIuICBBbmQsIGFmdGVyIHRoZSBUaW1lIFpvbmUKKyMgKFNlYXNvbmFsIFZhcmlhdGlvbikgQmlsbCAyMDA2IHdhcyBwYXNzZWQgaW4gdGhlIEhvdXNlIG9mIEFzc2VtYmx5IG9uCisjIEZyaWRheSwgdGhlIHNhbWUgdGhpbmcgd2lsbCBoYXBwZW4gaW4gQmVybXVkYS4KKyMgaHR0cDovL3d3dy50aGVyb3lhbGdhemV0dGUuY29tL2FwcHMvcGJjcy5kbGwvYXJ0aWNsZT9BSUQ9LzIwMDYwNTI5L05FV1MvMTA1MjkwMTM1CisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQXRsYW50aWMvQmVybXVkYQktNDoxOTowNCAtCUxNVAkxOTMwIEphbiAgMSAyOjAwICAgICMgSGFtaWx0b24KKwkJCS00OjAwCS0JQVNUCTE5NzQgQXByIDI4IDI6MDAKKwkJCS00OjAwCUJhaGFtYXMJQSVzVAkxOTc2CisJCQktNDowMAlVUwlBJXNUCisKKyMgQ2F5bWFuIElzCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvQ2F5bWFuCS01OjI1OjMyIC0JTE1UCTE4OTAJCSMgR2VvcmdldG93bgorCQkJLTU6MDc6MTIgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKKwkJCS01OjAwCS0JRVNUCisKKyMgQ29zdGEgUmljYQorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQ1IJMTk3OQkxOTgwCS0JRmViCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJQ1IJMTk3OQkxOTgwCS0JSnVuCVN1bj49MQkwOjAwCTAJUworUnVsZQlDUgkxOTkxCTE5OTIJLQlKYW4JU2F0Pj0xNQkwOjAwCTE6MDAJRAorIyBJQVRBIFNTSU0gKDE5OTEtMDkpIHNheXMgdGhlIGZvbGxvd2luZyB3YXMgYXQgMTowMDsKKyMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCUNSCTE5OTEJb25seQktCUp1bAkgMQkwOjAwCTAJUworUnVsZQlDUgkxOTkyCW9ubHkJLQlNYXIJMTUJMDowMAkwCVMKKyMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBKb3NlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSBgQ29zdGEgUmljYScuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvQ29zdGFfUmljYQktNTozNjoyMCAtCUxNVAkxODkwCQkjIFNhbiBKb3NlCisJCQktNTozNjoyMCAtCVNKTVQJMTkyMSBKYW4gMTUgIyBTYW4gSm9zZSBNZWFuIFRpbWUKKwkJCS02OjAwCUNSCUMlc1QKKyMgQ29jbworIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBBbWVyaWNhL0Nvc3RhX1JpY2EKKworIyBDdWJhCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTktMDMtMjkpOgorIyBUaGUgMTk5OS0wMy0yOCBleGhpYml0aW9uIGJhc2ViYWxsIGdhbWUgaGVsZCBpbiBIYXZhbmEsIEN1YmEsIGJldHdlZW4KKyMgdGhlIEN1YmFuIE5hdGlvbmFsIFRlYW0gYW5kIHRoZSBCYWx0aW1vcmUgT3Jpb2xlcyB3YXMgY2FycmllZCBsaXZlIG9uCisjIHRoZSBPcmlvbGVzIFJhZGlvIE5ldHdvcmssIGluY2x1ZGluZyBhZmZpbGlhdGUgV1RPUCBpbiBXYXNoaW5ndG9uLCBEQy4KKyMgRHVyaW5nIHRoZSBnYW1lLCBwbGF5LWJ5LXBsYXkgYW5ub3VuY2VyIEppbSBIdW50ZXIgbm90ZWQgdGhhdAorIyAiV2UnbGwgYmUgbG9zaW5nIHR3byBob3VycyBvZiBzbGVlcC4uLkN1YmEgc3dpdGNoZWQgdG8gRGF5bGlnaHQgU2F2aW5nCisjIFRpbWUgdG9kYXkuIiAgKFRoZSAidHdvIGhvdXIiIHJlbWFyayByZWZlcnJlZCB0byBsb3Npbmcgb25lIGhvdXIgb2YKKyMgc2xlZXAgb24gMTk5OS0wMy0yOC0td2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKKyMgdG8gRFNULS1hbmQgb25lIG1vcmUgaG91ciBvbiAxOTk5LTA0LTA0LS13aGVuIHRoZSBhbm5vdW5jZXJzIHdpbGwgaGF2ZQorIyByZXR1cm5lZCB0byBCYWx0aW1vcmUsIHdoaWNoIHN3aXRjaGVzIG9uIHRoYXQgZGF0ZS4pCisKKyMgRnJvbSBFdmVydCB2YW4gZGVyIFZlZXIgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNC0xMC0yOCk6CisjIEN1YmEgaXMgbm90IGdvaW5nIGJhY2sgdG8gc3RhbmRhcmQgdGltZSB0aGlzIHllYXIuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBodHRwOi8vd3d3LmdyYW5tYS5jdS9pbmdsZXMvMjAwNC9zZXB0aWVtYnJlL2p1ZXYzMC80MW1lZGlkLWkuaHRtbAorIyBzYXlzIHRoYXQgaXQncyBkdWUgdG8gYSBwcm9ibGVtIGF0IHRoZSBBbnRvbmlvIEd1aXRlcmFzCisjIHRoZXJtb2VsZWN0cmljIHBsYW50LCBhbmQgc2F5cyAiVGhpcyBPY3RvYmVyIHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuCisjIHRvIG5vcm1hbCBob3VycyAoYWZ0ZXIgZGF5bGlnaHQgc2F2aW5nIHRpbWUpIi4KKyMgRm9yIG5vdywgbGV0J3MgYXNzdW1lIHRoYXQgaXQncyBhIHRlbXBvcmFyeSBtZWFzdXJlLgorCisjIEZyb20gQ2FybG9zIEEuIENhcm5lcm8gRGVsZ2FkbyAoMjAwNS0xMS0xMik6CisjIFRoaXMgeWVhciAoanVzdCBsaWtlIGluIDIwMDQtMjAwNSkgdGhlcmUncyBubyBjaGFuZ2UgaW4gdGltZSB6b25lCisjIGFkanVzdG1lbnQgaW4gQ3ViYS4gIFdlIHdpbGwgc3RheSBpbiBkYXlsaWdodCBzYXZpbmcgdGltZToKKyMgaHR0cDovL3d3dy5ncmFubWEuY3UvZXNwYW5vbC8yMDA1L25vdmllbWJyZS9taWVyOS9ob3JhcmlvLmh0bWwKKworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6CisjIEFuIGFydGljbGUgaW4gR1JBTk1BIElOVEVSTkFDSU9OQUwgY2xhaW1zIHRoYXQgQ3ViYSB3aWxsIGVuZAorIyB0aGUgMyB5ZWFycyBvZiBwZXJtYW5lbnQgRFNUIG5leHQgd2Vla2VuZCwgc2VlCisjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1L2luZ2xlcy8yMDA2L29jdHVicmUvbHVuMTYvNDNob3JhcmlvLmh0bWwKKyMgIk9uIFNhdHVyZGF5IG5pZ2h0LCBPY3RvYmVyIDI4IGdvaW5nIGludG8gU3VuZGF5LCBPY3RvYmVyIDI5LCBhdCAwMTowMCwKKyMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLS0gZ29pbmcgYmFjayB0byAwMDowMCBob3VycyAtLSByZXR1cm5pbmcKKyMgdG8gdGhlIG5vcm1hbCBzY2hlZHVsZS4uLi4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTAyKToKKyMgaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS9lbmdsaXNoL25ld3MvYXJ0ODkuaHRtbCwgZGF0ZWQgeWVzdGVyZGF5LAorIyBzYXlzIEN1YmFuIGNsb2NrcyB3aWxsIGFkdmFuY2UgYXQgbWlkbmlnaHQgb24gTWFyY2ggMTAuCisjIEZvciBsYWNrIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgYXNzdW1lIEN1YmEgd2lsbCB1c2UgVVMgcnVsZXMsCisjIGV4Y2VwdCB0aGF0IGl0IHN3aXRjaGVzIGF0IG1pZG5pZ2h0IHN0YW5kYXJkIHRpbWUgYXMgdXN1YWwuCisjCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTEwLTI1KToKKyMgQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiBpbmZvcm1lZCBtZSB0aGF0IEN1YmEgd2lsbCBlbmQgRFNUIG9uZSB3ZWVrIAorIyBlYXJsaWVyIC0gb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIsIGp1c3QgbGlrZSBpbiAyMDA2LgorIyAKKyMgSGUgc3VwcGxpZWQgdGhlc2UgcmVmZXJlbmNlczoKKyMgCisjIGh0dHA6Ly93d3cucHJlbnNhbGF0aW5hLmNvbS5teC9hcnRpY2xlLmFzcD9JRD0lN0I0Q0MzMkMxQi1BOUY3LTQyRkItOEEwNy04NjMxQUZDOTIzQUYlN0QmbGFuZ3VhZ2U9RVMKKyMgaHR0cDovL2FjdHVhbGlkYWQudGVycmEuZXMvc29jaWVkYWQvYXJ0aWN1bG8vY3ViYV9sbGFtYV9haG9ycmFyX2VuZXJnaWFfY2FtYmlvXzE5NTcwNDQuaHRtCisjIAorIyBGcm9tIEFsZXggS3J5dmVuaXNoZXYgKDIwMDctMTAtMjUpOgorIyBIZXJlIGlzIGFsc28gYXJ0aWNsZSBmcm9tIEdyYW5tYSAoQ3ViYSk6CisjIAorIyBbUmVnaXJhXSBlbCBIb3JhcmlvIE5vcm1hbCBkZXNkZSBlbCBbcHJveGltb10gZG9taW5nbyAyOCBkZSBvY3R1YnJlCisjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwNy8xMC8yNC9uYWNpb25hbC9hcnRpYzA3Lmh0bWwKKyMgCisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfY3ViYTAzLmh0bWwKKworIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0wOSk6CisjIEknbSBpbiBNYXJ5bGFuZCB3aGljaCBpcyBub3cgb2JzZXJ2aW5nIFVuaXRlZCBTdGF0ZXMgRWFzdGVybiBEYXlsaWdodAorIyBUaW1lLiBBdCA5OjQ0IGxvY2FsIHRpbWUgSSB1c2VkIFJlYWxQbGF5ZXIgdG8gbGlzdGVuIHRvCisjIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JhZGlvcmVsb2oiPgorIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yYWRpb3JlbG9qCisjIDwvYT4sIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCisjIHRoZSB0aW1lIGFubm91bmNlZCBhcyAib2NobyBjdWFyZW50YSB5IGN1YXRybyIgKCJlaWdodCBmb3J0eS1mb3VyIiksCisjIGluZGljYXRpbmcgdGhhdCBDdWJhIGlzIHN0aWxsIG9uIHN0YW5kYXJkIHRpbWUuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTIpOgorIyBJdCBzZWVtcyB0aGF0IEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gU3VuZGF5LCAyMDA3LTAzLTE2Li4uCisjIEl0IHdhcyBhbm5vdW5jZWQgeWVzdGVyZGF5LCBhY2NvcmRpbmcgdG8gdGhpcyBzb3VyY2UgKGluIFNwYW5pc2gpOgorIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5uYy5jdWJhd2ViLmN1L21hcnpvLTIwMDgvY2llbi0xLTExLTMtMDguaHRtIj4KKyMgaHR0cDovL3d3dy5ubmMuY3ViYXdlYi5jdS9tYXJ6by0yMDA4L2NpZW4tMS0xMS0zLTA4Lmh0bQorIyA8L2E+CisjCisjIFNvbWUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGlzIHBvc3RlZCBoZXJlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwiPgorIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwKKyMgPC9hPgorIworIyBUaGUgYXJ0aWNsZSBhbHNvIHNheXMgdGhhdCBDdWJhIGhhcyBiZWVuIG9ic2VydmluZyBEU1Qgc2luY2UgMTk2MywKKyMgd2hpbGUgU2hhbmtzIChhbmQgdHpkYXRhKSBoYXMgMTk2NSBhcyB0aGUgZmlyc3QgZGF0ZSAoZXhjZXB0IGluIHRoZQorIyAxOTQwJ3MpLiBNYW55IG90aGVyIHdlYiBwYWdlcyBpbiBDdWJhIGFsc28gY2xhaW0gdGhhdCBpdCBoYXMgYmVlbgorIyBvYnNlcnZlZCBzaW5jZSAxOTYzLCBidXQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIDE5NzAgLSBhbiBleGNlcHRpb24KKyMgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gdHpkYXRhL1NoYW5rcy4gU28gdGhlcmUgaXMgYSBjaGFuY2Ugd2UgbmVlZCB0bworIyBjaGFuZ2Ugc29tZSBoaXN0b3JpYyByZWNvcmRzIGFzIHdlbGwuCisjCisjIE9uZSBleGFtcGxlOgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvaGMuY3UvZXNwYW5vbC9ub3RpY2lhcy9tYXIwNy8xMW1hci9ob3IuaHRtIj4KKyMgaHR0cDovL3d3dy5yYWRpb2hjLmN1L2VzcGFub2wvbm90aWNpYXMvbWFyMDcvMTFtYXIvaG9yLmh0bQorIyA8L2E+CisKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgorIyBUaGUgQ3ViYW4gdGltZSBjaGFuZ2UgaGFzIGp1c3QgYmVlbiBjb25maXJtZWQgb24gdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZQorIyB3ZWIgc2l0ZSwgdGhlIEdyYW5tYS4gIFBsZWFzZSBjaGVjayBvdXQKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS8yMDA4LzAzLzEzL25hY2lvbmFsL2FydGljMTAuaHRtbCI+CisjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwOC8wMy8xMy9uYWNpb25hbC9hcnRpYzEwLmh0bWwKKyMgPC9hPgorIworIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VucyBpbmZvcm1hdGlvbiwgdGhlIGNoYW5nZQorIyB3aWxsIHRha2UgcGxhY2UgbWlkbmlnaHQgYmV0d2VlbiBTYXR1cmRheSBhbmQgU3VuZGF5LgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTEyKToKKyMgQXNzdW1lIFN1bj49MTUgKHRoaXJkIFN1bmRheSkgZ29pbmcgZm9yd2FyZC4KKworIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wMy0wNCkKKyMgQWNjb3JkaW5nIHRvIHRoZSBSYWRpbyBSZWxvaiAtIEN1YmEgd2lsbCBzdGFydCBEYXlsaWdodCBTYXZpbmcgVGltZSBvbgorIyBtaWRuaWdodCBiZXR3ZWVuIFNhdHVyZGF5LCBNYXJjaCAwNywgMjAwOSBhbmQgU3VuZGF5LCBNYXJjaCAwOCwgMjAwOS0KKyMgbm90IG9uIG1pZG5pZ2h0IE1hcmNoIDE0IC8gTWFyY2ggMTUgYXMgcHJldmlvdXNseSB0aG91Z2h0LgorIworIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2N1YmEwNS5odG1sIj4KKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19jdWJhMDUuaHRtbAorIyAoaW4gU3BhbmlzaCkKKyMgPC9hPgorCisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTAzLTA5KQorIyBJIGxpc3RlbmVkIG92ZXIgdGhlIEludGVybmV0IHRvCisjIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JlYWRpb3JlbG9qIj4KKyMgaHR0cDovL21lZGlhLmVuZXQuY3UvcmVhZGlvcmVsb2oKKyMgPC9hPgorIyB0aGlzIG1vcm5pbmc7IHdoZW4gaXQgd2FzIDEwOjA1IGEuIG0uIGhlcmUgaW4gQmV0aGVzZGEsIE1hcnlsYW5kIHRoZQorIyB0aGUgdGltZSB3YXMgYW5ub3VuY2VkIGFzICJkaWV6IGNpbmNvIi0tdGhlIHNhbWUgdGltZSBhcyBoZXJlLCBpbmRpY2F0aW5nCisjIHRoYXQgaGFzIGluZGVlZCBzd2l0Y2hlZCB0byBEU1QuIEFzc3VtZSBzZWNvbmQgU3VuZGF5IGZyb20gMjAwOSBmb3J3YXJkLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlDdWJhCTE5MjgJb25seQktCUp1bgkxMAkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5MjgJb25seQktCU9jdAkxMAkwOjAwCTAJUworUnVsZQlDdWJhCTE5NDAJMTk0MgktCUp1bglTdW4+PTEJMDowMAkxOjAwCUQKK1J1bGUJQ3ViYQkxOTQwCTE5NDIJLQlTZXAJU3VuPj0xCTA6MDAJMAlTCitSdWxlCUN1YmEJMTk0NQkxOTQ2CS0JSnVuCVN1bj49MQkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5NDUJMTk0NgktCVNlcAlTdW4+PTEJMDowMAkwCVMKK1J1bGUJQ3ViYQkxOTY1CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5NjUJb25seQktCVNlcAkzMAkwOjAwCTAJUworUnVsZQlDdWJhCTE5NjYJb25seQktCU1heQkyOQkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5NjYJb25seQktCU9jdAkyCTA6MDAJMAlTCitSdWxlCUN1YmEJMTk2Nwlvbmx5CS0JQXByCTgJMDowMAkxOjAwCUQKK1J1bGUJQ3ViYQkxOTY3CTE5NjgJLQlTZXAJU3VuPj04CTA6MDAJMAlTCitSdWxlCUN1YmEJMTk2OAlvbmx5CS0JQXByCTE0CTA6MDAJMTowMAlECitSdWxlCUN1YmEJMTk2OQkxOTc3CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJQ3ViYQkxOTY5CTE5NzEJLQlPY3QJbGFzdFN1bgkwOjAwCTAJUworUnVsZQlDdWJhCTE5NzIJMTk3NAktCU9jdAk4CTA6MDAJMAlTCitSdWxlCUN1YmEJMTk3NQkxOTc3CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKK1J1bGUJQ3ViYQkxOTc4CW9ubHkJLQlNYXkJNwkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5NzgJMTk5MAktCU9jdAlTdW4+PTgJMDowMAkwCVMKK1J1bGUJQ3ViYQkxOTc5CTE5ODAJLQlNYXIJU3VuPj0xNQkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5ODEJMTk4NQktCU1heQlTdW4+PTUJMDowMAkxOjAwCUQKK1J1bGUJQ3ViYQkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNAkwOjAwCTE6MDAJRAorUnVsZQlDdWJhCTE5OTAJMTk5NwktCUFwcglTdW4+PTEJMDowMAkxOjAwCUQKK1J1bGUJQ3ViYQkxOTkxCTE5OTUJLQlPY3QJU3VuPj04CTA6MDBzCTAJUworUnVsZQlDdWJhCTE5OTYJb25seQktCU9jdAkgNgkwOjAwcwkwCVMKK1J1bGUJQ3ViYQkxOTk3CW9ubHkJLQlPY3QJMTIJMDowMHMJMAlTCitSdWxlCUN1YmEJMTk5OAkxOTk5CS0JTWFyCWxhc3RTdW4JMDowMHMJMTowMAlECitSdWxlCUN1YmEJMTk5OAkyMDAzCS0JT2N0CWxhc3RTdW4JMDowMHMJMAlTCitSdWxlCUN1YmEJMjAwMAkyMDA0CS0JQXByCVN1bj49MQkwOjAwcwkxOjAwCUQKK1J1bGUJQ3ViYQkyMDA2CW1heAktCU9jdAlsYXN0U3VuCTA6MDBzCTAJUworUnVsZQlDdWJhCTIwMDcJb25seQktCU1hcglTdW4+PTgJMDowMHMJMTowMAlECitSdWxlCUN1YmEJMjAwOAlvbmx5CS0JTWFyCVN1bj49MTUJMDowMHMJMTowMAlECitSdWxlCUN1YmEJMjAwOQltYXgJLQlNYXIJU3VuPj04CTA6MDBzCTE6MDAJRAorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvSGF2YW5hCS01OjI5OjI4IC0JTE1UCTE4OTAKKwkJCS01OjI5OjM2IC0JSE1UCTE5MjUgSnVsIDE5IDEyOjAwICMgSGF2YW5hIE1UCisJCQktNTowMAlDdWJhCUMlc1QKKworIyBEb21pbmljYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0RvbWluaWNhCS00OjA1OjM2IC0JTE1UCTE5MTEgSnVsIDEgMDowMQkJIyBSb3NlYXUKKwkJCS00OjAwCS0JQVNUCisKKyMgRG9taW5pY2FuIFJlcHVibGljCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDAtMTAtMzApOgorIyBFbnJpcXVlIE1vcmFsZXMgcmVwb3J0ZWQgdG8gbWUgdGhhdCB0aGUgRG9taW5pY2FuIFJlcHVibGljIGhhcyBjaGFuZ2VkIHRoZQorIyB0aW1lIHpvbmUgdG8gRWFzdGVybiBTdGFuZGFyZCBUaW1lIGFzIG9mIFN1bmRheSAyOSBhdCAyIGFtLi4uLgorIyBodHRwOi8vd3d3Lmxpc3Rpbi5jb20uZG8vYW50ZXMvMjYxMDAwL3JlcHVibGljYS9wcmluY2kuaHRtbAorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgorIyBUaGF0IFVSTCAoMjAwMC0xMC0yNiwgaW4gU3BhbmlzaCkgc2F5cyB0aGV5IHBsYW5uZWQgdG8gdXNlIFVTLXN0eWxlIERTVC4KKworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTEyLTAxKToKKyMgRG9taW5pY2FuIFJlcHVibGljIGNoYW5nZWQgaXRzIG1pbmQgYW5kIHByZXNpZGVudGlhbCBkZWNyZWUgb24gVHVlc2RheSwKKyMgTm92ZW1iZXIgMjgsIDIwMDAsIHdpdGggYSBuZXcgZGVjcmVlLiAgT24gU3VuZGF5LCBEZWNlbWJlciAzIGF0IDE6MDAgQU0gdGhlCisjIERvbWluaWNhbiBSZXB1YmxpYyB3aWxsIGJlIHJldmVydGluZyB0byA4IGhvdXJzIGZyb20gdGhlIEludGVybmF0aW9uYWwgRGF0ZQorIyBMaW5lLCBhbmQgd2lsbCBub3QgYmUgdXNpbmcgRFNUIGluIHRoZSBmb3Jlc2VlYWJsZSBmdXR1cmUuICBUaGUgcmVhc29uIHRoZXkKKyMgZGVjaWRlZCB0byB1c2UgRFNUIHdhcyB0byBiZSBpbiBzeW5jaCB3aXRoIFB1ZXJ0byBSaWNvLCB3aG8gd2FzIGFsc28gZ29pbmcKKyMgdG8gaW1wbGVtZW50IERTVC4gIFdoZW4gUHVlcnRvIFJpY28gZGlkbid0IGltcGxlbWVudCBEU1QsIHRoZSBwcmVzaWRlbnQKKyMgZGVjaWRlZCB0byByZXZlcnQuCisKKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJRFIJMTk2Nglvbmx5CS0JT2N0CTMwCTA6MDAJMTowMAlECitSdWxlCURSCTE5NjcJb25seQktCUZlYgkyOAkwOjAwCTAJUworUnVsZQlEUgkxOTY5CTE5NzMJLQlPY3QJbGFzdFN1bgkwOjAwCTA6MzAJSEQKK1J1bGUJRFIJMTk3MAlvbmx5CS0JRmViCTIxCTA6MDAJMAlTCitSdWxlCURSCTE5NzEJb25seQktCUphbgkyMAkwOjAwCTAJUworUnVsZQlEUgkxOTcyCTE5NzQJLQlKYW4JMjEJMDowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9TYW50b19Eb21pbmdvIC00OjM5OjM2IC0JTE1UCTE4OTAKKwkJCS00OjQwCS0JU0RNVAkxOTMzIEFwciAgMSAxMjowMCAjIFMuIERvbS4gTVQKKwkJCS01OjAwCURSCUUlc1QJMTk3NCBPY3QgMjcKKwkJCS00OjAwCS0JQVNUCTIwMDAgT2N0IDI5IDAyOjAwCisJCQktNTowMAlVUwlFJXNUCTIwMDAgRGVjICAzIDAxOjAwCisJCQktNDowMAktCUFTVAorCisjIEVsIFNhbHZhZG9yCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVNhbHYJMTk4NwkxOTg4CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAorUnVsZQlTYWx2CTE5ODcJMTk4OAktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCisjIFRoZXJlIGFyZSB0b28gbWFueSBTYW4gU2FsdmFkb3JzIGVsc2V3aGVyZSwgc28gdXNlIEFtZXJpY2EvRWxfU2FsdmFkb3IKKyMgaW5zdGVhZCBvZiBBbWVyaWNhL1Nhbl9TYWx2YWRvci4KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9FbF9TYWx2YWRvciAtNTo1Njo0OCAtCUxNVAkxOTIxCQkjIFNhbiBTYWx2YWRvcgorCQkJLTY6MDAJU2FsdglDJXNUCisKKyMgR3JlbmFkYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBbWVyaWNhL0dyZW5hZGEJLTQ6MDc6MDAgLQlMTVQJMTkxMSBKdWwJIyBTdCBHZW9yZ2UncworCQkJLTQ6MDAJLQlBU1QKKworIyBHdWFkZWxvdXBlCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvR3VhZGVsb3VwZQktNDowNjowOCAtCUxNVAkxOTExIEp1biA4CSMgUG9pbnRlIGEgUGl0cmUKKwkJCS00OjAwCS0JQVNUCisjIFN0IEJhcnRoZWxlbXkKK0xpbmsgQW1lcmljYS9HdWFkZWxvdXBlCUFtZXJpY2EvU3RfQmFydGhlbGVteQorIyBTdCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KQorTGluayBBbWVyaWNhL0d1YWRlbG91cGUJQW1lcmljYS9NYXJpZ290CisKKyMgR3VhdGVtYWxhCisjCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDYtMDQtMjIpLCBhZnRlciBhIGhlYWRzLXVwIGZyb20gT3NjYXIgdmFuIFZsaWptZW46CisjIERpYXJpbyBDbyBMYXRpbm8sIGF0CisjIGh0dHA6Ly93d3cuZGlhcmlvY29sYXRpbm8uY29tL2ludGVybmFjaW9uYWxlcy9kZXRhbGxlcy5hc3A/TmV3c0lEPTgwNzksCisjIHNheXMgaW4gYW4gYXJ0aWNsZSBkYXRlZCAyMDA2LTA0LTE5IHRoYXQgdGhlIEd1YXRlbWFsYW4gZ292ZXJubWVudCBoYWQKKyMgZGVjaWRlZCBvbiB0aGF0IGRhdGUgdG8gYWR2YW5jZSBvZmZpY2lhbCB0aW1lIGJ5IDYwIG1pbnV0ZXMsIHRvIGxlc3NlbiB0aGUKKyMgaW1wYWN0IG9mIHRoZSBlbGV2YXRlZCBjb3N0IG9mIG9pbC4uLi4gIERheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgbGFzdCBmcm9tCisjIDIwMDYtMDQtMjkgMjQ6MDAgKEd1YXRlbWFsYW4gc3RhbmRhcmQgdGltZSkgdG8gMjAwNi0wOS0zMCAodGltZSB1bnNwZWNpZmllZCkuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDYtMjIpOgorIyBUaGUgTWluaXN0cnkgb2YgRW5lcmd5IGFuZCBNaW5lcywgcHJlc3MgcmVsZWFzZSBDUC0xNS8yMDA2CisjICgyMDA2LTA0LTE5KSwgc2F5cyBEU1QgZW5kcyBhdCAyNDowMC4gIFNlZQorIyA8aHR0cDovL3d3dy5zaWVjYS5vcmcuZ3QvU2l0aW9fcHVibGljby9FbmVyZ2V0aWNvcy9Eb2MvTWVkaWRhcy9DYW1iaW9fSG9yYXJpb19OYWNfMTkwNDA2LnBkZj4uCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUd1YXQJMTk3Mwlvbmx5CS0JTm92CTI1CTA6MDAJMTowMAlECitSdWxlCUd1YXQJMTk3NAlvbmx5CS0JRmViCTI0CTA6MDAJMAlTCitSdWxlCUd1YXQJMTk4Mwlvbmx5CS0JTWF5CTIxCTA6MDAJMTowMAlECitSdWxlCUd1YXQJMTk4Mwlvbmx5CS0JU2VwCTIyCTA6MDAJMAlTCitSdWxlCUd1YXQJMTk5MQlvbmx5CS0JTWFyCTIzCTA6MDAJMTowMAlECitSdWxlCUd1YXQJMTk5MQlvbmx5CS0JU2VwCSA3CTA6MDAJMAlTCitSdWxlCUd1YXQJMjAwNglvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlECitSdWxlCUd1YXQJMjAwNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvR3VhdGVtYWxhCS02OjAyOjA0IC0JTE1UCTE5MTggT2N0IDUKKwkJCS02OjAwCUd1YXQJQyVzVAorCisjIEhhaXRpCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDUtMDQtMTUpOgorIyBSaXN0byBPLiBOeWthbmVuIHdyb3RlIG1lIHRoYXQgSGFpdGkgaXMgbm93IG9uIERTVC4KKyMgSSBzZWFyY2hlZCBmb3IgY29uZmlybWF0aW9uLCBhbmQgSSBmb3VuZCBhCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGFpdGlhbmNvbnN1bGF0ZS5vcmcvdGltZS5kb2MiPiBwcmVzcyByZWxlYXNlCisjIG9uIHRoZSBXZWIgcGFnZSBvZiB0aGUgSGFpdGlhbiBDb25zdWxhdGUgaW4gQ2hpY2FnbyAoMjAwNS0wMy0zMSksCisjIDwvYT4uICBUcmFuc2xhdGVkIGZyb20gRnJlbmNoLCBpdCBzYXlzOgorIworIyAgIlRoZSBQcmltZSBNaW5pc3RlcidzIENvbW11bmljYXRpb24gT2ZmaWNlIG5vdGlmaWVzIHRoZSBwdWJsaWMgaW4gZ2VuZXJhbAorIyAgIGFuZCB0aGUgcHJlc3MgaW4gcGFydGljdWxhciB0aGF0LCBmb2xsb3dpbmcgYSBkZWNpc2lvbiBvZiB0aGUgSW50ZXJpb3IKKyMgICBNaW5pc3RyeSBhbmQgdGhlIFRlcnJpdG9yaWFsIENvbGxlY3Rpdml0aWVzIFtJIHN1cHBvc2UgdGhhdCBtZWFucyB0aGUKKyMgICBwcm92aW5jZXNdLCBIYWl0aSB3aWxsIG1vdmUgdG8gRWFzdGVybiBEYXlsaWdodCBUaW1lIGluIHRoZSBuaWdodCBmcm9tIG5leHQKKyMgICBTYXR1cmRheSB0aGUgMm5kIHRvIFN1bmRheSB0aGUgM3JkLgorIworIyAgIkNvbnNlcXVlbnRseSwgdGhlIFByaW1lIE1pbmlzdGVyJ3MgQ29tbXVuaWNhdGlvbiBPZmZpY2Ugd2lzaGVzIHRvIGluZm9ybQorIyAgIHRoZSBwb3B1bGF0aW9uIHRoYXQgdGhlIGNvdW50cnkncyBjbG9ja3Mgd2lsbCBiZSBzZXQgZm9yd2FyZCBvbmUgaG91cgorIyAgIHN0YXJ0aW5nIGF0IG1pZG5pZ2h0LiAgVGhpcyBwcm92aXNpb24gd2lsbCBob2xkIHVudGlsIHRoZSBsYXN0IFNhdHVyZGF5IGluCisjICAgT2N0b2JlciAyMDA1LgorIworIyAgIlBvcnQtYXUtUHJpbmNlLCBNYXJjaCAzMSwgMjAwNSIKKyMKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDQtMDQpOgorIyBJIGhhdmUgYmVlbiBpbmZvcm1lZCBieSB1c2VycyB0aGF0IEhhaXRpIG9ic2VydmVzIERTVCB0aGlzIHllYXIgbGlrZQorIyBsYXN0IHllYXIsIHNvIHRoZSBjdXJyZW50ICJvbmx5IiBydWxlIGZvciAyMDA1IG1pZ2h0IGJlIGNoYW5nZWQgdG8gYQorIyAibWF4IiBydWxlIG9yIHRvIGxhc3QgdW50aWwgMjAwNi4gKFdobyBrbm93cyBpZiB0aGV5IHdpbGwgb2JzZXJ2ZSBEU1QKKyMgbmV4dCB5ZWFyIG9yIGlmIHRoZXkgd2lsbCBleHRlbmQgdGhlaXIgRFNUIGxpa2UgVVMvQ2FuYWRhIG5leHQgeWVhcikuCisjCisjIEkgaGF2ZSBmb3VuZCB0aGlzIGFydGljbGUgYWJvdXQgaXQgKGluIEZyZW5jaCk6CisjIGh0dHA6Ly93d3cuaGFpdGlwcmVzc25ldHdvcmsuY29tL25ld3MuY2ZtP2FydGljbGVJRD03NjEyCisjCisjIFRoZSByZWFzb24gc2VlbXMgdG8gYmUgYW4gZW5lcmd5IGNyaXNpcy4KKworIyBGcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZSAoMjAwNy0wMi0yMik6CisjIFNvbWUgSUFUQSBpbmZvOiBIYWl0aSB3b24ndCBiZSBoYXZpbmcgRFNUIGluIDIwMDcuCisKKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJSGFpdGkJMTk4Mwlvbmx5CS0JTWF5CTgJMDowMAkxOjAwCUQKK1J1bGUJSGFpdGkJMTk4NAkxOTg3CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJSGFpdGkJMTk4MwkxOTg3CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBBVCBpcyAyOjAwLCBidXQgSUFUQSBTU0lNICgxOTkxLzE5OTcpIHNheXMgMTowMHMuCisjIEdvIHdpdGggSUFUQS4KK1J1bGUJSGFpdGkJMTk4OAkxOTk3CS0JQXByCVN1bj49MQkxOjAwcwkxOjAwCUQKK1J1bGUJSGFpdGkJMTk4OAkxOTk3CS0JT2N0CWxhc3RTdW4JMTowMHMJMAlTCitSdWxlCUhhaXRpCTIwMDUJMjAwNgktCUFwcglTdW4+PTEJMDowMAkxOjAwCUQKK1J1bGUJSGFpdGkJMjAwNQkyMDA2CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9Qb3J0LWF1LVByaW5jZSAtNDo0OToyMCAtCUxNVAkxODkwCisJCQktNDo0OQktCVBQTVQJMTkxNyBKYW4gMjQgMTI6MDAgIyBQLWEtUCBNVAorCQkJLTU6MDAJSGFpdGkJRSVzVAorCisjIEhvbmR1cmFzCisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkyMSBKYW4gMTsgZ28gd2l0aCBXaGl0bWFuJ3MgbW9yZSBwcmVjaXNlIEFwciAxLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDUtMDUpOgorIyB3b3JsZHRpbWV6b25lLmNvbSByZXBvcnRzIGEgMjAwNi0wNS0wMiBTcGFuaXNoLWxhbmd1YWdlIEFQIGFydGljbGUKKyMgc2F5aW5nIEhvbmR1cmFzIHdpbGwgc3RhcnQgdXNpbmcgRFNUIG1pZG5pZ2h0IFNhdHVyZGF5LCBlZmZlY3RpdmUgNAorIyBtb250aHMgdW50aWwgU2VwdGVtYmVyLiAgTGEgVHJpYnVuYSByZXBvcnRlZCB0b2RheQorIyA8aHR0cDovL3d3dy5sYXRyaWJ1bmEuaG4vOTkyOTkuaHRtbD4gdGhhdCBNYW51ZWwgWmVsYXlhLCB0aGUgcHJlc2lkZW50CisjIG9mIEhvbmR1cmFzLCByZWZ1c2VkIHRvIGJhY2sgZG93biBvbiB0aGlzLgorCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA4LTA4KToKKyMgSXQgc2VlbXMgdGhhdCBIb25kdXJhcyBoYXMgcmV0dXJuZWQgZnJvbSBEU1QgdG8gc3RhbmRhcmQgdGltZSB0aGlzIE1vbmRheSBhdAorIyAwMDowMCBob3VycyAocHJvbG9uZ2luZyBTdW5kYXkgdG8gMjUgaG91cnMgZHVyYXRpb24pLgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2hvbmR1cmFzMDQuaHRtbAorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDgtMDgpOgorIyBBbHNvIHNlZSBEaWFyaW8gRWwgSGVyYWxkbywgVGhlIGNvdW50cnkgcmV0dXJucyB0byBzdGFuZGFyZCB0aW1lICgyMDA2LTA4LTA4KQorIyA8aHR0cDovL3d3dy5lbGhlcmFsZG8uaG4vbm90YS5waHA/bmlkPTU0OTQxJnNlYz0xMj4uCisjIEl0IG1lbnRpb25zIGV4ZWN1dGl2ZSBkZWNyZWUgMTgtMjAwNi4KKworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOC0xNyk6CisjIEhvbmR1cmFzIHdpbGwgb2JzZXJ2ZSBEU1QgZnJvbSAyMDA3IHRvIDIwMDksIGV4YWN0IGRhdGVzIGFyZSBub3QKKyMgcHVibGlzaGVkLCBJIGhhdmUgbG9jYXRlZCB0aGlzIGF1dGhvcml0YXRpdmUgc291cmNlOgorIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5obi9ub3RpY2lhLmFzcHg/bklkPTQ3CisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDMtMzApOgorIyBodHRwOi8vd3d3LmxhcHJlbnNhaG4uY29tL3BhaXNfbm90YS5waHA/aWQwNDk2Mj03Mzg2CisjIFNvIGl0IHNlZW1zIHRoYXQgSG9uZHVyYXMgd2lsbCBub3QgZW50ZXIgRFNUIHRoaXMgeWVhci4uLi4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJSG9uZAkxOTg3CTE5ODgJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECitSdWxlCUhvbmQJMTk4NwkxOTg4CS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKK1J1bGUJSG9uZAkyMDA2CW9ubHkJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECitSdWxlCUhvbmQJMjAwNglvbmx5CS0JQXVnCU1vbj49MQkwOjAwCTAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1RlZ3VjaWdhbHBhIC01OjQ4OjUyIC0JTE1UCTE5MjEgQXByCisJCQktNjowMAlIb25kCUMlc1QKKyMKKyMgR3JlYXQgU3dhbiBJIGNlZGVkIGJ5IFVTIHRvIEhvbmR1cmFzIGluIDE5NzIKKworIyBKYW1haWNhCisKKyMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKKyMgRm9sbG93cyBVUyBydWxlcy4KKworIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg5LTAxLTE5KToKKyMgSkFNQUlDQSAgICAgICAgICAgICA1IEggIEJFSElORCBVVEMKKworIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQW1lcmljYS9KYW1haWNhCS01OjA3OjEyIC0JTE1UCTE4OTAJCSMgS2luZ3N0b24KKwkJCS01OjA3OjEyIC0JS01UCTE5MTIgRmViICAgICMgS2luZ3N0b24gTWVhbiBUaW1lCisJCQktNTowMAktCUVTVAkxOTc0IEFwciAyOCAyOjAwCisJCQktNTowMAlVUwlFJXNUCTE5ODQKKwkJCS01OjAwCS0JRVNUCisKKyMgTWFydGluaXF1ZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL01hcnRpbmlxdWUJLTQ6MDQ6MjAgLSAgICAgIExNVAkxODkwCQkjIEZvcnQtZGUtRnJhbmNlCisJCQktNDowNDoyMCAtCUZGTVQJMTkxMSBNYXkgICAgICMgRm9ydC1kZS1GcmFuY2UgTVQKKwkJCS00OjAwCS0JQVNUCTE5ODAgQXByICA2CisJCQktNDowMAkxOjAwCUFEVAkxOTgwIFNlcCAyOAorCQkJLTQ6MDAJLQlBU1QKKworIyBNb250c2VycmF0CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBJbiAxOTk1IHZvbGNhbmljIGVydXB0aW9ucyBmb3JjZWQgZXZhY3VhdGlvbiBvZiBQbHltb3V0aCwgdGhlIGNhcGl0YWwuCisjIHdvcmxkLmdhemV0dGVlci5jb20gc2F5cyBDb3JrIEhpbGwgaXMgdGhlIG1vc3QgcG9wdWxvdXMgbG9jYXRpb24gbm93LgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL01vbnRzZXJyYXQJLTQ6MDg6NTIgLQlMTVQJMTkxMSBKdWwgMSAwOjAxICAgIyBDb3JrIEhpbGwKKwkJCS00OjAwCS0JQVNUCisKKyMgTmljYXJhZ3VhCisjCisjIFRoaXMgdXNlcyBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIHRpbWVzIGJlZm9yZSAyMDA1LgorIworIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0wNC0xMik6CisjIEkndmUgZ290IHJlcG9ydHMgZnJvbSA4IGRpZmZlcmVudCBwZW9wbGUgdGhhdCBOaWNhcmFndWEganVzdCBzdGFydGVkCisjIERTVCBvbiBTdW5kYXkgMjAwNS0wNC0xMCwgaW4gb3JkZXIgdG8gc2F2ZSBlbmVyZ3kgYmVjYXVzZSBvZgorIyBleHBlbnNpdmUgcGV0cm9sZXVtLiAgVGhlIGV4YWN0IGVuZCBkYXRlIGZvciBEU1QgaXMgbm90IHlldAorIyBhbm5vdW5jZWQsIG9ubHkgIlNlcHRlbWJlciIgYnV0IHNvbWUgc2l0ZXMgYWxzbyBzYXkgIm1pZC1TZXB0ZW1iZXIiLgorIyBTb21lIGJhY2tncm91bmQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBQcmVzaWRlbnQncyBvZmZpY2lhbCBzaXRlOgorIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9QcmVzaWRlbmNpYS9GaWxlc19pbmRleC9TZWNyZXRhcmlhL05vdGFzJTIwZGUlMjBQcmVuc2EvUHJlc2lkZW50ZS8yMDA1L0FCUklML0dvYmllcm5vLWRlLW5pY2FyYWd1YS1hZGVsYW50YS1ob3JhLW9maWNpYWwtMDZhYnJpbC5odG0KKyMgVGhlIERlY3JlZSwgbm8gMjMtMjAwNSBpcyBhdmFpbGFibGUgaGVyZToKKyMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvYnVzY2Fkb3JfZ2FjZXRhL0JEL0RFQ1JFVE9TLzIwMDUvRGVjcmV0byUyMDIzLTIwMDUlMjBTZSUyMGFkZWxhbnRhJTIwZW4lMjB1bmElMjBob3JhJTIwZW4lMjB0b2RvJTIwZWwlMjB0ZXJyaXRvcmlvJTIwbmFjaW9uYWwlMjBhcGFydGlyJTIwZGUlMjBsYXMlMjAyNGhvcmFzJTIwZGVsJTIwMDklMjBkZSUyMEFicmlsLnBkZgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA1LTAxKToKKyMgVGhlIGRlY3JlZSBkb2Vzbid0IHNheSBhbnl0aGluZyBhYm91dCBkYXlsaWdodCBzYXZpbmcsIGJ1dCBmb3Igbm93IGxldCdzCisjIGFzc3VtZSB0aGF0IGl0IGlzIGRheWxpZ2h0IHNhdmluZy4uLi4KKyMKKyMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0yMSk6CisjIFRoZSBBc3NvY2lhdGVkIFByZXNzIHN0b3J5IG9uIHRoZSB0aW1lIGNoYW5nZSwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0CisjIGh0dHA6Ly93d3cubGFwYWxtYWludGVyYWN0aXZvLmNvbS9ndWlhcy9jb250ZW50L2dlbi9hcC9BbWVyaWNhX0xhdGluYS9BTUNfR0VOX05JQ0FSQUdVQV9IT1JBLmh0bWwKKyMgYW5kIGVsc2V3aGVyZSwgc2F5cyAoZmlmdGggcGFyYWdyYXBoLCB0cmFuc2xhdGVkIGZyb20gU3BhbmlzaCk6ICAiVGhlIGxhc3QKKyMgdGltZSB0aGF0IGEgY2hhbmdlIG9mIGNsb2NrcyB3YXMgYXBwbGllZCB0byBzYXZlIGVuZXJneSB3YXMgaW4gdGhlIHllYXIgMjAwMAorIyBkdXJpbmcgdGhlIEFybm9sZG8gQWxlbWFuIGFkbWluaXN0cmF0aW9uLiIuLi4KKyMgVGhlIG5vcnRoYW1lcmljYSBmaWxlIHNheXMgdGhhdCBOaWNhcmFndWEgaGFzIGJlZW4gb24gVVRDLTYgY29udGludW91c2x5CisjIHNpbmNlIERlY2VtYmVyIDE5OTguICBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55IGRldGFpbHMgb2YgTmljYXJhZ3VhbiB0aW1lCisjIGNoYW5nZXMgaW4gMjAwMC4gIFBlcmhhcHMgYSBub3RlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBub3J0aGFtZXJpY2EgZmlsZSwgdG8KKyMgdGhlIGVmZmVjdCB0aGF0IHdlIGhhdmUgaW5kaXJlY3QgZXZpZGVuY2UgdGhhdCBEU1Qgd2FzIG9ic2VydmVkIGluIDIwMDAuCisjCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKKyMgTmljYXJhZ3VhIGxlZnQgRFNUIHRoZSAyMDA1LTEwLTAyIGF0IDAwOjAwIChsb2NhbCB0aW1lKS4KKyMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvcHJlc2lkZW5jaWEvZmlsZXNfaW5kZXgvc2VjcmV0YXJpYS9jb211bmljYWRvcy8yMDA1L3NlcHRpZW1icmUvMjZzZXB0aWVtYnJlLWNhbWJpby1ob3JhLmh0bQorIyAoMjAwNS0wOS0yNikKKyMKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgorIyBodHRwOi8vd3d3LmVsbnVldm9kaWFyaW8uY29tLm5pLzIwMDYvMDUvMDEvbmFjaW9uYWxlcy8xODQxMAorIyAobXkgaW5mb3JtYWwgdHJhbnNsYXRpb24pCisjIEJ5IG9yZGVyIG9mIHRoZSBwcmVzaWRlbnQgb2YgdGhlIHJlcHVibGljLCBFbnJpcXVlIEJvbGFub3MsIE5pY2FyYWd1YQorIyBhZHZhbmNlZCBieSBzaXh0eSBtaW51dGVzIHRoZWlyIG9mZmljaWFsIHRpbWUsIHllc3RlcmRheSBhdCAyIGluIHRoZQorIyBtb3JuaW5nLCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5IHVudGlsIDMwLnRoLiBvZiBzZXB0ZW1iZXIuCisjCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA5LTMwKToKKyMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvYnVzY2Fkb3JfZ2FjZXRhL0JEL0RFQ1JFVE9TLzIwMDYvRC0wNjMtMjAwNlAtUFJOLUNhbWJpby1Ib3JhLnBkZgorIyBNeSBpbmZvcm1hbCB0cmFuc2xhdGlvbiBydW5zOgorIyBUaGUgbmF0dXJhbCBzdW4gdGltZSBpcyByZXN0b3JlZCBpbiBhbGwgdGhlIG5hdGlvbmFsIHRlcnJpdG9yeSwgaW4gdGhhdCB0aGUKKyMgdGltZSBpcyByZXR1cm5lZCBvbmUgaG91ciBhdCAwMTowMCBhbSBvZiBPY3RvYmVyIDEgb2YgMjAwNi4KKyMKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCU5pYwkxOTc5CTE5ODAJLQlNYXIJU3VuPj0xNgkwOjAwCTE6MDAJRAorUnVsZQlOaWMJMTk3OQkxOTgwCS0JSnVuCU1vbj49MjMJMDowMAkwCVMKK1J1bGUJTmljCTIwMDUJb25seQktCUFwcgkxMAkwOjAwCTE6MDAJRAorUnVsZQlOaWMJMjAwNQlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTAJUworUnVsZQlOaWMJMjAwNglvbmx5CS0JQXByCTMwCTI6MDAJMTowMAlECitSdWxlCU5pYwkyMDA2CW9ubHkJLQlPY3QJU3VuPj0xCTE6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvTWFuYWd1YQktNTo0NTowOCAtCUxNVAkxODkwCisJCQktNTo0NToxMiAtCU1NVAkxOTM0IEp1biAyMyAjIE1hbmFndWEgTWVhbiBUaW1lPworCQkJLTY6MDAJLQlDU1QJMTk3MyBNYXkKKwkJCS01OjAwCS0JRVNUCTE5NzUgRmViIDE2CisJCQktNjowMAlOaWMJQyVzVAkxOTkyIEphbiAgMSA0OjAwCisJCQktNTowMAktCUVTVAkxOTkyIFNlcCAyNAorCQkJLTY6MDAJLQlDU1QJMTk5MworCQkJLTU6MDAJLQlFU1QJMTk5NworCQkJLTY6MDAJTmljCUMlc1QKKworIyBQYW5hbWEKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUJQW1lcmljYS9QYW5hbWEJLTU6MTg6MDggLQlMTVQJMTg5MAorCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgICAjIENvbG9uIE1lYW4gVGltZQorCQkJLTU6MDAJLQlFU1QKKworIyBQdWVydG8gUmljbworIyBUaGVyZSBhcmUgdG9vIG1hbnkgU2FuIEp1YW5zIGVsc2V3aGVyZSwgc28gd2UnbGwgdXNlIGBQdWVydG9fUmljbycuCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvUHVlcnRvX1JpY28gLTQ6MjQ6MjUgLQlMTVQJMTg5OSBNYXIgMjggMTI6MDAgICAgIyBTYW4gSnVhbgorCQkJLTQ6MDAJLQlBU1QJMTk0MiBNYXkgIDMKKwkJCS00OjAwCVVTCUElc1QJMTk0NgorCQkJLTQ6MDAJLQlBU1QKKworIyBTdCBLaXR0cy1OZXZpcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1N0X0tpdHRzCS00OjEwOjUyIC0JTE1UCTE5MTIgTWFyIDIJIyBCYXNzZXRlcnJlCisJCQktNDowMAktCUFTVAorCisjIFN0IEx1Y2lhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvU3RfTHVjaWEJLTQ6MDQ6MDAgLQlMTVQJMTg5MAkJIyBDYXN0cmllcworCQkJLTQ6MDQ6MDAgLQlDTVQJMTkxMgkgICAgIyBDYXN0cmllcyBNZWFuIFRpbWUKKwkJCS00OjAwCS0JQVNUCisKKyMgU3QgUGllcnJlIGFuZCBNaXF1ZWxvbgorIyBUaGVyZSBhcmUgdG9vIG1hbnkgU3QgUGllcnJlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSBgTWlxdWVsb24nLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL01pcXVlbG9uCS0zOjQ0OjQwIC0JTE1UCTE5MTEgTWF5IDE1CSMgU3QgUGllcnJlCisJCQktNDowMAktCUFTVAkxOTgwIE1heQorCQkJLTM6MDAJLQlQTVNUCTE5ODcgIyBQaWVycmUgJiBNaXF1ZWxvbiBUaW1lCisJCQktMzowMAlDYW5hZGEJUE0lc1QKKworIyBTdCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1N0X1ZpbmNlbnQJLTQ6MDQ6NTYgLQlMTVQJMTg5MAkJIyBLaW5nc3Rvd24KKwkJCS00OjA0OjU2IC0JS01UCTE5MTIJICAgIyBLaW5nc3Rvd24gTWVhbiBUaW1lCisJCQktNDowMAktCUFTVAorCisjIFR1cmtzIGFuZCBDYWljb3MKKyMKKyMgRnJvbSBDaHJpcyBEdW5uIGluCisjIDxodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDE1MDA3PgorIyAoMjAwNy0wMy0xNSk6IEluIHRoZSBUdXJrcyAmIENhaWNvcyBJc2xhbmRzIChBbWVyaWNhL0dyYW5kX1R1cmspIHRoZQorIyBkYXlsaWdodCBzYXZpbmcgZGF0ZXMgZm9yIHRpbWUgY2hhbmdlcyBoYXZlIGJlZW4gYWRqdXN0ZWQgdG8gbWF0Y2gKKyMgdGhlIHJlY2VudCBVLlMuIGNoYW5nZSBvZiBkYXRlcy4KKyMKKyMgRnJvbSBCcmlhbiBJbmdsaXMgKDIwMDctMDQtMjgpOgorIyBodHRwOi8vd3d3LnR1cmtzYW5kY2FpY29zLnRjL2NhbGVuZGFyL2luZGV4Lmh0bSBbMjAwNy0wNC0yNl0KKyMgdGhlcmUgaXMgYW4gZW50cnkgZm9yIE5vdiA0ICJEYXlsaWdodCBTYXZpbmdzIFRpbWUgRW5kcyAyMDA3IiBhbmQgdGhyZWUKKyMgcm93cyBiZWZvcmUgdGhhdCB0aGVyZSBpcyBhbiBvdXQgb2YgZGF0ZSBlbnRyeSBmb3IgT2N0OgorIyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lcyBCZWdpbnMgMjAwNworIyBDbG9ja3MgYXJlIHNldCBiYWNrIG9uZSBob3VyIGF0IDI6MDAgYS5tLiBsb2NhbCBEYXlsaWdodCBTYXZpbmcgVGltZSIKKyMgaW5kaWNhdGluZyB0aGF0IHRoZSBub3JtYWwgRVQgcnVsZXMgYXJlIGZvbGxvd2VkLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA1LTAxKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGV5IHVzZSBVUyBEU1QgcnVsZXMsIGJ1dCBJQVRBIFNTSU0gKDE5OTEvMTk5OCkKKyMgc2F5cyB0aGV5IHN3aXRjaCBhdCBtaWRuaWdodC4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorIworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJVEMJMTk3OQkxOTg2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJVEMJMTk3OQkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJVEMJMTk4NwkyMDA2CS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAorUnVsZQlUQwkyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkxOjAwCUQKK1J1bGUJVEMJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvR3JhbmRfVHVyawktNDo0NDozMiAtCUxNVAkxODkwCisJCQktNTowNzoxMiAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQorCQkJLTU6MDAJVEMJRSVzVAorCisjIEJyaXRpc2ggVmlyZ2luIElzCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvVG9ydG9sYQktNDoxODoyOCAtCUxNVAkxOTExIEp1bCAgICAjIFJvYWQgVG93bgorCQkJLTQ6MDAJLQlBU1QKKworIyBWaXJnaW4gSXMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9TdF9UaG9tYXMJLTQ6MTk6NDQgLQlMTVQJMTkxMSBKdWwgICAgIyBDaGFybG90dGUgQW1hbGllCisJCQktNDowMAktCUFTVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvcGFjaWZpY25ldyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3BhY2lmaWNuZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MTJjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3BhY2lmaWNuZXcKQEAgLTAsMCArMSwyOSBAQAorIyA8cHJlPgorIyBAKCMpcGFjaWZpY25ldwk4LjIKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5ODktMDQtMDUpOgorIyBPbiAxOTg5LTA0LTA1LCB0aGUgVS4gUy4gSG91c2Ugb2YgUmVwcmVzZW50YXRpdmVzIHBhc3NlZCAoMjM4LTE1NCkgYSBiaWxsCisjIGVzdGFibGlzaGluZyAiUGFjaWZpYyBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVGltZSI7IGl0IHdhcyBub3QgYWN0ZWQgb24KKyMgYnkgdGhlIFNlbmF0ZSBvciBzaWduZWQgaW50byBsYXcgYnkgdGhlIFByZXNpZGVudC4KKyMgWW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZSAiUEUiIChQcmVzaWRlbnRpYWwgRWxlY3Rpb24pIGJlbG93IHRvCisjICJRIiAoUXVhZHJlbm5pYWwpIHRvIG1haW50YWluIHRocmVlLWNoYXJhY3RlciB6b25lIGFiYnJldmlhdGlvbnMuCisjIElmIHlvdSdyZSByZWFsbHkgY29uc2VydmF0aXZlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgaXQgdG8gIkQiLgorIyBBdm9pZCAiTCIgKExlYXAgWWVhciksIHdoaWNoIHdvbid0IGJlIHRydWUgaW4gMjEwMC4KKworIyBJZiBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVGltZSBpcyBldmVyIGVzdGFibGlzaGVkLCByZXBsYWNlICJYWFhYIiBiZWxvdworIyB3aXRoIHRoZSB5ZWFyIHRoZSBsYXcgdGFrZXMgZWZmZWN0IGFuZCB1bmNvbW1lbnQgdGhlICIjIyIgbGluZXMuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCisjIyBSdWxlCVR3aWxpdGUJWFhYWAltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECisjIyBSdWxlCVR3aWxpdGUJWFhYWAltYXgJdXNwcmVzCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlQRQorIyMgUnVsZQlUd2lsaXRlCVhYWFgJbWF4CXVzcHJlcwlOb3YJU3VuPj03CTI6MDAJMAlTCisjIyBSdWxlCVR3aWxpdGUJWFhYWAltYXgJbm9ucHJlcwlPY3QJbGFzdFN1bgkyOjAwCTAJUworCisjIFpvbmUJTkFNRQkJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCisjIyBab25lCUFtZXJpY2EvTG9zX0FuZ2VsZXMtUEVUCS04OjAwCVVTCQlQJXNUCVhYWFgKKyMjCQkJCS04OjAwCVR3aWxpdGUJCVAlc1QKKworIyBGb3Igbm93Li4uCitMaW5rCUFtZXJpY2EvTG9zX0FuZ2VsZXMJVVMvUGFjaWZpYy1OZXcJIyMKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3NvbGFyODcgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZWU3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg3CkBAIC0wLDAgKzEsMzkxIEBACisjIDxwcmU+CisjIEAoIylzb2xhcjg3CTguMgorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBTbyBtdWNoIGZvciBmb290bm90ZXMgYWJvdXQgU2F1ZGkgQXJhYmlhLgorIyBBcHBhcmVudCBub29uIHRpbWVzIGJlbG93IGFyZSBmb3IgUml5YWRoOyB5b3VyIG1pbGVhZ2Ugd2lsbCB2YXJ5LgorIyBUaW1lcyB3ZXJlIGNvbXB1dGVkIHVzaW5nIGZvcm11bGFzIGluIHRoZSBVLlMuIE5hdmFsIE9ic2VydmF0b3J5J3MKKyMgQWxtYW5hYyBmb3IgQ29tcHV0ZXJzIDE5ODc7IHRoZSBmb3JtdWxhcyAid2lsbCBnaXZlIEVxVCB0byBhbiBhY2N1cmFjeSBvZgorIyBbcGx1cyBvciBtaW51cyB0d29dIHNlY29uZHMgZHVyaW5nIHRoZSBjdXJyZW50IHllYXIuIgorIworIyBSb3VuZGluZyB0byB0aGUgbmVhcmVzdCBmaXZlIHNlY29uZHMgcmVzdWx0cyBpbiBmZXdlciB0aGFuCisjIDI1NiBkaWZmZXJlbnQgInRpbWUgdHlwZXMiLS1hIGxpbWl0IHRoYXQncyBmYWNlZCBiZWNhdXNlIHRpbWUgdHlwZXMgYXJlCisjIHN0b3JlZCBvbiBkaXNrIGFzIHVuc2lnbmVkIGNoYXJzLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMQkxMjowMzoyMHMgLTA6MDM6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMgkxMjowMzo1MHMgLTA6MDM6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMwkxMjowNDoxNXMgLTA6MDQ6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JNAkxMjowNDo0NXMgLTA6MDQ6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JNQkxMjowNToxMHMgLTA6MDU6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JNgkxMjowNTo0MHMgLTA6MDU6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JNwkxMjowNjowNXMgLTA6MDY6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JOAkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JOQkxMjowNjo1NXMgLTA6MDY6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTAJMTI6MDc6MjBzIC0wOjA3OjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTExCTEyOjA3OjQ1cyAtMDowNzo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxMgkxMjowODoxMHMgLTA6MDg6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTMJMTI6MDg6MzBzIC0wOjA4OjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE0CTEyOjA4OjU1cyAtMDowODo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxNQkxMjowOToxNXMgLTA6MDk6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTYJMTI6MDk6MzVzIC0wOjA5OjM1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE3CTEyOjA5OjU1cyAtMDowOTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxOAkxMjoxMDoxNXMgLTA6MTA6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTkJMTI6MTA6MzVzIC0wOjEwOjM1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTIwCTEyOjEwOjU1cyAtMDoxMDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyMQkxMjoxMToxMHMgLTA6MTE6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjIJMTI6MTE6MzBzIC0wOjExOjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTIzCTEyOjExOjQ1cyAtMDoxMTo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyNAkxMjoxMjowMHMgLTA6MTI6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjUJMTI6MTI6MTVzIC0wOjEyOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI2CTEyOjEyOjMwcyAtMDoxMjozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyNwkxMjoxMjo0MHMgLTA6MTI6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjgJMTI6MTI6NTVzIC0wOjEyOjU1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI5CTEyOjEzOjA1cyAtMDoxMzowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkzMAkxMjoxMzoxNXMgLTA6MTM6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMzEJMTI6MTM6MjVzIC0wOjEzOjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTEJMTI6MTM6MzVzIC0wOjEzOjM1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIJMTI6MTM6NDBzIC0wOjEzOjQwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTMJMTI6MTM6NTBzIC0wOjEzOjUwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTQJMTI6MTM6NTVzIC0wOjEzOjU1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTUJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTYJMTI6MTQ6MDVzIC0wOjE0OjA1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTcJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTgJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTkJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTEwCTEyOjE0OjE1cyAtMDoxNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxMQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTIJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTEzCTEyOjE0OjE1cyAtMDoxNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxNAkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTUJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE2CTEyOjE0OjEwcyAtMDoxNDoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxNwkxMjoxNDowNXMgLTA6MTQ6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTgJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE5CTEyOjEzOjU1cyAtMDoxMzo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyMAkxMjoxMzo1MHMgLTA6MTM6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjEJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIyCTEyOjEzOjM1cyAtMDoxMzozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyMwkxMjoxMzozMHMgLTA6MTM6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjQJMTI6MTM6MjBzIC0wOjEzOjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTI1CTEyOjEzOjEwcyAtMDoxMzoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyNgkxMjoxMzowMHMgLTA6MTM6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjcJMTI6MTI6NTBzIC0wOjEyOjUwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTI4CTEyOjEyOjQwcyAtMDoxMjo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxCTEyOjEyOjMwcyAtMDoxMjozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyCTEyOjEyOjIwcyAtMDoxMjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkzCTEyOjEyOjA1cyAtMDoxMjowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk0CTEyOjExOjU1cyAtMDoxMTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk1CTEyOjExOjQwcyAtMDoxMTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk2CTEyOjExOjI1cyAtMDoxMToyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk3CTEyOjExOjE1cyAtMDoxMToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk4CTEyOjExOjAwcyAtMDoxMTowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgk5CTEyOjEwOjQ1cyAtMDoxMDo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxMAkxMjoxMDozMHMgLTA6MTA6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTEJMTI6MTA6MTVzIC0wOjEwOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEyCTEyOjA5OjU1cyAtMDowOTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxMwkxMjowOTo0MHMgLTA6MDk6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTQJMTI6MDk6MjVzIC0wOjA5OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE1CTEyOjA5OjEwcyAtMDowOToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxNgkxMjowODo1MHMgLTA6MDg6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTcJMTI6MDg6MzVzIC0wOjA4OjM1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE4CTEyOjA4OjE1cyAtMDowODoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxOQkxMjowODowMHMgLTA6MDg6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjAJMTI6MDc6NDBzIC0wOjA3OjQwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTIxCTEyOjA3OjI1cyAtMDowNzoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyMgkxMjowNzowNXMgLTA6MDc6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjMJMTI6MDY6NTBzIC0wOjA2OjUwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI0CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyNQkxMjowNjoxMHMgLTA6MDY6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjYJMTI6MDU6NTVzIC0wOjA1OjU1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI3CTEyOjA1OjM1cyAtMDowNTozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyOAkxMjowNToxNXMgLTA6MDU6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjkJMTI6MDU6MDBzIC0wOjA1OjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTMwCTEyOjA0OjQwcyAtMDowNDo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkzMQkxMjowNDoyNXMgLTA6MDQ6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMQkxMjowNDowNXMgLTA6MDQ6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMgkxMjowMzo0NXMgLTA6MDM6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMwkxMjowMzozMHMgLTA6MDM6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJNAkxMjowMzoxMHMgLTA6MDM6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJNQkxMjowMjo1NXMgLTA6MDI6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJNgkxMjowMjozNXMgLTA6MDI6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJNwkxMjowMjoyMHMgLTA6MDI6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJOAkxMjowMjowNXMgLTA6MDI6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJOQkxMjowMTo0NXMgLTA6MDE6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTAJMTI6MDE6MzBzIC0wOjAxOjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTExCTEyOjAxOjE1cyAtMDowMToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxMgkxMjowMDo1NXMgLTA6MDA6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTMJMTI6MDA6NDBzIC0wOjAwOjQwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTE0CTEyOjAwOjI1cyAtMDowMDoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxNQkxMjowMDoxMHMgLTA6MDA6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTYJMTE6NTk6NTVzIDA6MDA6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTcJMTE6NTk6NDVzIDA6MDA6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTgJMTE6NTk6MzBzIDA6MDA6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTkJMTE6NTk6MTVzIDA6MDA6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjAJMTE6NTk6MDVzIDA6MDA6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjEJMTE6NTg6NTBzIDA6MDE6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjIJMTE6NTg6NDBzIDA6MDE6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjMJMTE6NTg6MjVzIDA6MDE6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjQJMTE6NTg6MTVzIDA6MDE6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjUJMTE6NTg6MDVzIDA6MDE6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjYJMTE6NTc6NTVzIDA6MDI6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjcJMTE6NTc6NDVzIDA6MDI6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjgJMTE6NTc6MzVzIDA6MDI6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMjkJMTE6NTc6MjVzIDA6MDI6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMzAJMTE6NTc6MTVzIDA6MDI6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMQkxMTo1NzoxMHMgMDowMjo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyCTExOjU3OjAwcyAwOjAzOjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTMJMTE6NTY6NTVzIDA6MDM6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJNAkxMTo1Njo1MHMgMDowMzoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk1CTExOjU2OjQ1cyAwOjAzOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTYJMTE6NTY6NDBzIDA6MDM6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJNwkxMTo1NjozNXMgMDowMzoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk4CTExOjU2OjMwcyAwOjAzOjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTkJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTAJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTEJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTIJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTMJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTQJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTUJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTYJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTcJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTgJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMTkJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjAJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjEJMTE6NTY6MzBzIDA6MDM6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjIJMTE6NTY6MzVzIDA6MDM6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjMJMTE6NTY6NDBzIDA6MDM6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjQJMTE6NTY6NDVzIDA6MDM6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjUJMTE6NTY6NTBzIDA6MDM6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjYJMTE6NTY6NTVzIDA6MDM6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjcJMTE6NTc6MDBzIDA6MDM6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjgJMTE6NTc6MTBzIDA6MDI6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMjkJMTE6NTc6MTVzIDA6MDI6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMzAJMTE6NTc6MjVzIDA6MDI6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMzEJMTE6NTc6MzBzIDA6MDI6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMQkxMTo1Nzo0MHMgMDowMjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyCTExOjU3OjUwcyAwOjAyOjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTMJMTE6NTg6MDBzIDA6MDI6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JNAkxMTo1ODoxMHMgMDowMTo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk1CTExOjU4OjIwcyAwOjAxOjQwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTYJMTE6NTg6MzBzIDA6MDE6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JNwkxMTo1ODo0MHMgMDowMToyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk4CTExOjU4OjUwcyAwOjAxOjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTkJMTE6NTk6MDVzIDA6MDA6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTAJMTE6NTk6MTVzIDA6MDA6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTEJMTE6NTk6MzBzIDA6MDA6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTIJMTE6NTk6NDBzIDA6MDA6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTMJMTE6NTk6NTBzIDA6MDA6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTQJMTI6MDA6MDVzIC0wOjAwOjA1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE1CTEyOjAwOjE1cyAtMDowMDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxNgkxMjowMDozMHMgLTA6MDA6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTcJMTI6MDA6NDVzIC0wOjAwOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE4CTEyOjAwOjU1cyAtMDowMDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxOQkxMjowMToxMHMgLTA6MDE6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjAJMTI6MDE6MjBzIC0wOjAxOjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTIxCTEyOjAxOjM1cyAtMDowMTozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyMgkxMjowMTo1MHMgLTA6MDE6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjMJMTI6MDI6MDBzIC0wOjAyOjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI0CTEyOjAyOjE1cyAtMDowMjoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyNQkxMjowMjoyNXMgLTA6MDI6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjYJMTI6MDI6NDBzIC0wOjAyOjQwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI3CTEyOjAyOjUwcyAtMDowMjo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyOAkxMjowMzowNXMgLTA6MDM6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjkJMTI6MDM6MTVzIC0wOjAzOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTMwCTEyOjAzOjMwcyAtMDowMzozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxCTEyOjAzOjQwcyAtMDowMzo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyCTEyOjAzOjUwcyAtMDowMzo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkzCTEyOjA0OjA1cyAtMDowNDowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk0CTEyOjA0OjE1cyAtMDowNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk1CTEyOjA0OjI1cyAtMDowNDoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk2CTEyOjA0OjM1cyAtMDowNDozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk3CTEyOjA0OjQ1cyAtMDowNDo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk4CTEyOjA0OjU1cyAtMDowNDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAk5CTEyOjA1OjA1cyAtMDowNTowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxMAkxMjowNToxNXMgLTA6MDU6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTEJMTI6MDU6MjBzIC0wOjA1OjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEyCTEyOjA1OjMwcyAtMDowNTozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxMwkxMjowNTo0MHMgLTA6MDU6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTQJMTI6MDU6NDVzIC0wOjA1OjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE1CTEyOjA1OjUwcyAtMDowNTo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxNgkxMjowNjowMHMgLTA6MDY6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTcJMTI6MDY6MDVzIC0wOjA2OjA1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE4CTEyOjA2OjEwcyAtMDowNjoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxOQkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjAJMTI6MDY6MTVzIC0wOjA2OjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTIxCTEyOjA2OjIwcyAtMDowNjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyMgkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjMJMTI6MDY6MjVzIC0wOjA2OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI0CTEyOjA2OjI1cyAtMDowNjoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyNQkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjYJMTI6MDY6MzBzIC0wOjA2OjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI3CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyOAkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjkJMTI6MDY6MjVzIC0wOjA2OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTMwCTEyOjA2OjI1cyAtMDowNjoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkzMQkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMQkxMjowNjoyMHMgLTA6MDY6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMgkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMwkxMjowNjoxMHMgLTA6MDY6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJNAkxMjowNjowNXMgLTA6MDY6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJNQkxMjowNjowMHMgLTA6MDY6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJNgkxMjowNTo1NXMgLTA6MDU6NTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJNwkxMjowNTo1MHMgLTA6MDU6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJOAkxMjowNTo0MHMgLTA6MDU6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJOQkxMjowNTozNXMgLTA6MDU6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTAJMTI6MDU6MjVzIC0wOjA1OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTExCTEyOjA1OjE1cyAtMDowNToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxMgkxMjowNTowNXMgLTA6MDU6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTMJMTI6MDQ6NTVzIC0wOjA0OjU1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE0CTEyOjA0OjQ1cyAtMDowNDo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxNQkxMjowNDozNXMgLTA6MDQ6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTYJMTI6MDQ6MjVzIC0wOjA0OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE3CTEyOjA0OjEwcyAtMDowNDoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxOAkxMjowNDowMHMgLTA6MDQ6MDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTkJMTI6MDM6NDVzIC0wOjAzOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTIwCTEyOjAzOjMwcyAtMDowMzozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyMQkxMjowMzoxNXMgLTA6MDM6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjIJMTI6MDM6MDBzIC0wOjAzOjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTIzCTEyOjAyOjQ1cyAtMDowMjo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyNAkxMjowMjozMHMgLTA6MDI6MzAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjUJMTI6MDI6MTVzIC0wOjAyOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI2CTEyOjAyOjAwcyAtMDowMjowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyNwkxMjowMTo0MHMgLTA6MDE6NDAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjgJMTI6MDE6MjVzIC0wOjAxOjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI5CTEyOjAxOjA1cyAtMDowMTowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkzMAkxMjowMDo1MHMgLTA6MDA6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMzEJMTI6MDA6MzBzIC0wOjAwOjMwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEJMTI6MDA6MTBzIC0wOjAwOjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIJMTE6NTk6NTBzIDA6MDA6MTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJMwkxMTo1OTozNXMgMDowMDoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk0CTExOjU5OjE1cyAwOjAwOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTUJMTE6NTg6NTVzIDA6MDE6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJNgkxMTo1ODozNXMgMDowMToyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk3CTExOjU4OjE1cyAwOjAxOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTgJMTE6NTc6NTVzIDA6MDI6MDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJOQkxMTo1NzozMHMgMDowMjozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxMAkxMTo1NzoxMHMgMDowMjo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxMQkxMTo1Njo1MHMgMDowMzoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxMgkxMTo1NjozMHMgMDowMzozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxMwkxMTo1NjoxMHMgMDowMzo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxNAkxMTo1NTo0NXMgMDowNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxNQkxMTo1NToyNXMgMDowNDozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxNgkxMTo1NTowNXMgMDowNDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxNwkxMTo1NDo0NXMgMDowNToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxOAkxMTo1NDoyMHMgMDowNTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkxOQkxMTo1NDowMHMgMDowNjowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyMAkxMTo1Mzo0MHMgMDowNjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyMQkxMTo1MzoxNXMgMDowNjo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyMgkxMTo1Mjo1NXMgMDowNzowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyMwkxMTo1MjozNXMgMDowNzoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyNAkxMTo1MjoxNXMgMDowNzo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyNQkxMTo1MTo1NXMgMDowODowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyNgkxMTo1MTozNXMgMDowODoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyNwkxMTo1MToxMHMgMDowODo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyOAkxMTo1MDo1MHMgMDowOToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkyOQkxMTo1MDozMHMgMDowOTozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkzMAkxMTo1MDoxMHMgMDowOTo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxCTExOjQ5OjUwcyAwOjEwOjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIJMTE6NDk6MzVzIDA6MTA6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJMwkxMTo0OToxNXMgMDoxMDo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk0CTExOjQ4OjU1cyAwOjExOjA1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTUJMTE6NDg6MzVzIDA6MTE6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJNgkxMTo0ODoyMHMgMDoxMTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk3CTExOjQ4OjAwcyAwOjEyOjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTgJMTE6NDc6NDVzIDA6MTI6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJOQkxMTo0NzoyNXMgMDoxMjozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxMAkxMTo0NzoxMHMgMDoxMjo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxMQkxMTo0Njo1NXMgMDoxMzowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxMgkxMTo0Njo0MHMgMDoxMzoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxMwkxMTo0NjoyNXMgMDoxMzozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxNAkxMTo0NjoxMHMgMDoxMzo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxNQkxMTo0NTo1NXMgMDoxNDowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxNgkxMTo0NTo0NXMgMDoxNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxNwkxMTo0NTozMHMgMDoxNDozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxOAkxMTo0NToyMHMgMDoxNDo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkxOQkxMTo0NTowNXMgMDoxNDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyMAkxMTo0NDo1NXMgMDoxNTowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyMQkxMTo0NDo0NXMgMDoxNToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyMgkxMTo0NDozNXMgMDoxNToyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyMwkxMTo0NDoyNXMgMDoxNTozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyNAkxMTo0NDoyMHMgMDoxNTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyNQkxMTo0NDoxMHMgMDoxNTo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyNgkxMTo0NDowNXMgMDoxNTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyNwkxMTo0Mzo1NXMgMDoxNjowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyOAkxMTo0Mzo1MHMgMDoxNjoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkyOQkxMTo0Mzo0NXMgMDoxNjoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkzMAkxMTo0Mzo0NXMgMDoxNjoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkzMQkxMTo0Mzo0MHMgMDoxNjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxCTExOjQzOjQwcyAwOjE2OjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJMwkxMTo0MzozNXMgMDoxNjoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk0CTExOjQzOjM1cyAwOjE2OjI1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTUJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJNgkxMTo0Mzo0MHMgMDoxNjoyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk3CTExOjQzOjQwcyAwOjE2OjIwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTgJMTE6NDM6NDVzIDA6MTY6MTUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJOQkxMTo0Mzo1MHMgMDoxNjoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxMAkxMTo0Mzo1NXMgMDoxNjowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxMQkxMTo0NDowMHMgMDoxNjowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxMgkxMTo0NDowNXMgMDoxNTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxMwkxMTo0NDoxNXMgMDoxNTo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxNAkxMTo0NDoyMHMgMDoxNTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxNQkxMTo0NDozMHMgMDoxNTozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxNgkxMTo0NDo0MHMgMDoxNToyMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxNwkxMTo0NDo1MHMgMDoxNToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxOAkxMTo0NTowNXMgMDoxNDo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkxOQkxMTo0NToxNXMgMDoxNDo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyMAkxMTo0NTozMHMgMDoxNDozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyMQkxMTo0NTo0NXMgMDoxNDoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyMgkxMTo0NjowMHMgMDoxNDowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyMwkxMTo0NjoxNXMgMDoxMzo0NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyNAkxMTo0NjozMHMgMDoxMzozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyNQkxMTo0Njo1MHMgMDoxMzoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyNgkxMTo0NzoxMHMgMDoxMjo1MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyNwkxMTo0NzoyNXMgMDoxMjozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyOAkxMTo0Nzo0NXMgMDoxMjoxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkyOQkxMTo0ODowNXMgMDoxMTo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkzMAkxMTo0ODozMHMgMDoxMTozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxCTExOjQ4OjUwcyAwOjExOjEwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIJMTE6NDk6MTBzIDA6MTA6NTAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMwkxMTo0OTozNXMgMDoxMDoyNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk0CTExOjUwOjAwcyAwOjEwOjAwIC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTUJMTE6NTA6MjVzIDA6MDk6MzUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJNgkxMTo1MDo1MHMgMDowOToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk3CTExOjUxOjE1cyAwOjA4OjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTgJMTE6NTE6NDBzIDA6MDg6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJOQkxMTo1MjowNXMgMDowNzo1NSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxMAkxMTo1MjozMHMgMDowNzozMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxMQkxMTo1MzowMHMgMDowNzowMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxMgkxMTo1MzoyNXMgMDowNjozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxMwkxMTo1Mzo1NXMgMDowNjowNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxNAkxMTo1NDoyNXMgMDowNTozNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxNQkxMTo1NDo1MHMgMDowNToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxNgkxMTo1NToyMHMgMDowNDo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxNwkxMTo1NTo1MHMgMDowNDoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxOAkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkxOQkxMTo1Njo1MHMgMDowMzoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyMAkxMTo1NzoyMHMgMDowMjo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyMQkxMTo1Nzo1MHMgMDowMjoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyMgkxMTo1ODoyMHMgMDowMTo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyMwkxMTo1ODo1MHMgMDowMToxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyNAkxMTo1OToyMHMgMDowMDo0MCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyNQkxMTo1OTo1MHMgMDowMDoxMCAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyNgkxMjowMDoyMHMgLTA6MDA6MjAgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMjcJMTI6MDA6NDVzIC0wOjAwOjQ1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI4CTEyOjAxOjE1cyAtMDowMToxNSAtCitSdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyOQkxMjowMTo0NXMgLTA6MDE6NDUgLQorUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMzAJMTI6MDI6MTVzIC0wOjAyOjE1IC0KK1J1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTMxCTEyOjAyOjQ1cyAtMDowMjo0NSAtCisKKyMgUml5YWRoIGlzIGF0IGFib3V0IDQ2IGRlZ3JlZXMgNDYgbWludXRlcyBFYXN0OiAgMyBocnMsIDcgbWlucywgNCBzZWNzCisjIEJlZm9yZSBhbmQgYWZ0ZXIgMTk4Nywgd2UnbGwgb3BlcmF0ZSBvbiBsb2NhbCBtZWFuIHNvbGFyIHRpbWUuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1JpeWFkaDg3CTM6MDc6MDQJLQkJenp6CTE5ODcKKwkJCTM6MDc6MDQJc29sODcJCXp6egkxOTg4CisJCQkzOjA3OjA0CS0JCXp6egorIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4uLgorTGluawlBc2lhL1JpeWFkaDg3CU1pZGVhc3QvUml5YWRoODcKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3NvbGFyODggYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjU5MGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg4CkBAIC0wLDAgKzEsMzkxIEBACisjIDxwcmU+CisjIEAoIylzb2xhcjg4CTguMgorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBBcHBhcmVudCBub29uIHRpbWVzIGJlbG93IGFyZSBmb3IgUml5YWRoOyB0aGV5J3JlIGEgYml0IG9mZiBmb3Igb3RoZXIgcGxhY2VzLgorIyBUaW1lcyB3ZXJlIGNvbXB1dGVkIHVzaW5nIGZvcm11bGFzIGluIHRoZSBVLlMuIE5hdmFsIE9ic2VydmF0b3J5J3MKKyMgQWxtYW5hYyBmb3IgQ29tcHV0ZXJzIDE5ODg7IHRoZSBmb3JtdWxhcyAid2lsbCBnaXZlIEVxVCB0byBhbiBhY2N1cmFjeSBvZgorIyBbcGx1cyBvciBtaW51cyB0d29dIHNlY29uZHMgZHVyaW5nIHRoZSBjdXJyZW50IHllYXIuIgorIworIyBSb3VuZGluZyB0byB0aGUgbmVhcmVzdCBmaXZlIHNlY29uZHMgcmVzdWx0cyBpbiBmZXdlciB0aGFuCisjIDI1NiBkaWZmZXJlbnQgInRpbWUgdHlwZXMiLS1hIGxpbWl0IHRoYXQncyBmYWNlZCBiZWNhdXNlIHRpbWUgdHlwZXMgYXJlCisjIHN0b3JlZCBvbiBkaXNrIGFzIHVuc2lnbmVkIGNoYXJzLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMQkxMjowMzoxNXMgLTA6MDM6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMgkxMjowMzo0MHMgLTA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMwkxMjowNDoxMHMgLTA6MDQ6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNAkxMjowNDo0MHMgLTA6MDQ6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNQkxMjowNTowNXMgLTA6MDU6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNgkxMjowNTozMHMgLTA6MDU6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNwkxMjowNjowMHMgLTA6MDY6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JOAkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JOQkxMjowNjo1MHMgLTA6MDY6NTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTAJMTI6MDc6MTVzIC0wOjA3OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTExCTEyOjA3OjQwcyAtMDowNzo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxMgkxMjowODowNXMgLTA6MDg6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTMJMTI6MDg6MjVzIC0wOjA4OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE0CTEyOjA4OjUwcyAtMDowODo1MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxNQkxMjowOToxMHMgLTA6MDk6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTYJMTI6MDk6MzBzIC0wOjA5OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE3CTEyOjA5OjUwcyAtMDowOTo1MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxOAkxMjoxMDoxMHMgLTA6MTA6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTkJMTI6MTA6MzBzIC0wOjEwOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTIwCTEyOjEwOjUwcyAtMDoxMDo1MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyMQkxMjoxMTowNXMgLTA6MTE6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjIJMTI6MTE6MjVzIC0wOjExOjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTIzCTEyOjExOjQwcyAtMDoxMTo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyNAkxMjoxMTo1NXMgLTA6MTE6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjUJMTI6MTI6MTBzIC0wOjEyOjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI2CTEyOjEyOjI1cyAtMDoxMjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyNwkxMjoxMjo0MHMgLTA6MTI6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjgJMTI6MTI6NTBzIC0wOjEyOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI5CTEyOjEzOjAwcyAtMDoxMzowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkzMAkxMjoxMzoxMHMgLTA6MTM6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMzEJMTI6MTM6MjBzIC0wOjEzOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEJMTI6MTM6MzBzIC0wOjEzOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIJMTI6MTM6NDBzIC0wOjEzOjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTMJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTQJMTI6MTM6NTVzIC0wOjEzOjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTUJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTYJMTI6MTQ6MDVzIC0wOjE0OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTcJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTgJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTkJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEwCTEyOjE0OjE1cyAtMDoxNDoxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxMQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTIJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEzCTEyOjE0OjE1cyAtMDoxNDoxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxNAkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTUJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE2CTEyOjE0OjEwcyAtMDoxNDoxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxNwkxMjoxNDowNXMgLTA6MTQ6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTgJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE5CTEyOjEzOjU1cyAtMDoxMzo1NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyMAkxMjoxMzo1MHMgLTA6MTM6NTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjEJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIyCTEyOjEzOjQwcyAtMDoxMzo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyMwkxMjoxMzozMHMgLTA6MTM6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjQJMTI6MTM6MjBzIC0wOjEzOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI1CTEyOjEzOjE1cyAtMDoxMzoxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyNgkxMjoxMzowNXMgLTA6MTM6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjcJMTI6MTI6NTVzIC0wOjEyOjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI4CTEyOjEyOjQ1cyAtMDoxMjo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyOQkxMjoxMjozMHMgLTA6MTI6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMQkxMjoxMjoyMHMgLTA6MTI6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMgkxMjoxMjoxMHMgLTA6MTI6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMwkxMjoxMTo1NXMgLTA6MTE6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNAkxMjoxMTo0NXMgLTA6MTE6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNQkxMjoxMTozMHMgLTA6MTE6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNgkxMjoxMToxNXMgLTA6MTE6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNwkxMjoxMTowMHMgLTA6MTE6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJOAkxMjoxMDo0NXMgLTA6MTA6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJOQkxMjoxMDozMHMgLTA6MTA6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTAJMTI6MTA6MTVzIC0wOjEwOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTExCTEyOjEwOjAwcyAtMDoxMDowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxMgkxMjowOTo0NXMgLTA6MDk6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTMJMTI6MDk6MzBzIC0wOjA5OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE0CTEyOjA5OjEwcyAtMDowOToxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxNQkxMjowODo1NXMgLTA6MDg6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTYJMTI6MDg6NDBzIC0wOjA4OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE3CTEyOjA4OjIwcyAtMDowODoyMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxOAkxMjowODowNXMgLTA6MDg6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTkJMTI6MDc6NDVzIC0wOjA3OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTIwCTEyOjA3OjMwcyAtMDowNzozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyMQkxMjowNzoxMHMgLTA6MDc6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjIJMTI6MDY6NTBzIC0wOjA2OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTIzCTEyOjA2OjM1cyAtMDowNjozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyNAkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjUJMTI6MDY6MDBzIC0wOjA2OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI2CTEyOjA1OjQwcyAtMDowNTo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyNwkxMjowNToyMHMgLTA6MDU6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjgJMTI6MDU6MDVzIC0wOjA1OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI5CTEyOjA0OjQ1cyAtMDowNDo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkzMAkxMjowNDoyNXMgLTA6MDQ6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMzEJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEJMTI6MDM6NTBzIC0wOjAzOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTIJMTI6MDM6MzVzIC0wOjAzOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTMJMTI6MDM6MTVzIC0wOjAzOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTQJMTI6MDM6MDBzIC0wOjAzOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTUJMTI6MDI6NDBzIC0wOjAyOjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTYJMTI6MDI6MjVzIC0wOjAyOjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTcJMTI6MDI6MDVzIC0wOjAyOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTgJMTI6MDE6NTBzIC0wOjAxOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTkJMTI6MDE6MzVzIC0wOjAxOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEwCTEyOjAxOjE1cyAtMDowMToxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxMQkxMjowMTowMHMgLTA6MDE6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTIJMTI6MDA6NDVzIC0wOjAwOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEzCTEyOjAwOjMwcyAtMDowMDozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxNAkxMjowMDoxNXMgLTA6MDA6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTUJMTI6MDA6MDBzIDA6MDA6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTYJMTE6NTk6NDVzIDA6MDA6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTcJMTE6NTk6MzBzIDA6MDA6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTgJMTE6NTk6MjBzIDA6MDA6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTkJMTE6NTk6MDVzIDA6MDA6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjAJMTE6NTg6NTVzIDA6MDE6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjEJMTE6NTg6NDBzIDA6MDE6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjIJMTE6NTg6MzBzIDA6MDE6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjMJMTE6NTg6MTVzIDA6MDE6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjQJMTE6NTg6MDVzIDA6MDE6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjUJMTE6NTc6NTVzIDA6MDI6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjYJMTE6NTc6NDVzIDA6MDI6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjcJMTE6NTc6MzVzIDA6MDI6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjgJMTE6NTc6MzBzIDA6MDI6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMzAJMTE6NTc6MTBzIDA6MDI6NTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMQkxMTo1NzowNXMgMDowMjo1NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyCTExOjU2OjU1cyAwOjAzOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTMJMTE6NTY6NTBzIDA6MDM6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJNAkxMTo1Njo0NXMgMDowMzoxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk1CTExOjU2OjQwcyAwOjAzOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTYJMTE6NTY6MzVzIDA6MDM6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJNwkxMTo1NjozMHMgMDowMzozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk4CTExOjU2OjI1cyAwOjAzOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTkJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTAJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTEJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTIJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTMJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTQJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTUJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTYJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTcJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTgJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTkJMTE6NTY6MjVzIDA6MDM6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjAJMTE6NTY6MzBzIDA6MDM6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjEJMTE6NTY6MzVzIDA6MDM6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjIJMTE6NTY6NDBzIDA6MDM6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjMJMTE6NTY6NDVzIDA6MDM6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjQJMTE6NTY6NTBzIDA6MDM6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjUJMTE6NTY6NTVzIDA6MDM6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjYJMTE6NTc6MDBzIDA6MDM6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjcJMTE6NTc6MDVzIDA6MDI6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjgJMTE6NTc6MTVzIDA6MDI6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMzAJMTE6NTc6MzBzIDA6MDI6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMzEJMTE6NTc6NDBzIDA6MDI6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMQkxMTo1Nzo1MHMgMDowMjoxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyCTExOjU3OjU1cyAwOjAyOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTMJMTE6NTg6MDVzIDA6MDE6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JNAkxMTo1ODoxNXMgMDowMTo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk1CTExOjU4OjMwcyAwOjAxOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTYJMTE6NTg6NDBzIDA6MDE6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JNwkxMTo1ODo1MHMgMDowMToxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk4CTExOjU5OjAwcyAwOjAxOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTkJMTE6NTk6MTVzIDA6MDA6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTAJMTE6NTk6MjVzIDA6MDA6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTEJMTE6NTk6MzVzIDA6MDA6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTIJMTE6NTk6NTBzIDA6MDA6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTMJMTI6MDA6MDBzIDA6MDA6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTQJMTI6MDA6MTVzIC0wOjAwOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE1CTEyOjAwOjI1cyAtMDowMDoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxNgkxMjowMDo0MHMgLTA6MDA6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTcJMTI6MDA6NTVzIC0wOjAwOjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE4CTEyOjAxOjA1cyAtMDowMTowNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxOQkxMjowMToyMHMgLTA6MDE6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjAJMTI6MDE6MzBzIC0wOjAxOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTIxCTEyOjAxOjQ1cyAtMDowMTo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyMgkxMjowMjowMHMgLTA6MDI6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjMJMTI6MDI6MTBzIC0wOjAyOjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI0CTEyOjAyOjI1cyAtMDowMjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyNQkxMjowMjozNXMgLTA6MDI6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjYJMTI6MDI6NTBzIC0wOjAyOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI3CTEyOjAzOjAwcyAtMDowMzowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyOAkxMjowMzoxNXMgLTA6MDM6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjkJMTI6MDM6MjVzIC0wOjAzOjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTMwCTEyOjAzOjQwcyAtMDowMzo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxCTEyOjAzOjUwcyAtMDowMzo1MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyCTEyOjA0OjAwcyAtMDowNDowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkzCTEyOjA0OjEwcyAtMDowNDoxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk0CTEyOjA0OjI1cyAtMDowNDoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk1CTEyOjA0OjM1cyAtMDowNDozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk2CTEyOjA0OjQ1cyAtMDowNDo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk3CTEyOjA0OjU1cyAtMDowNDo1NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk4CTEyOjA1OjA1cyAtMDowNTowNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk5CTEyOjA1OjEwcyAtMDowNToxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxMAkxMjowNToyMHMgLTA6MDU6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTEJMTI6MDU6MzBzIC0wOjA1OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTEyCTEyOjA1OjM1cyAtMDowNTozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxMwkxMjowNTo0NXMgLTA6MDU6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTQJMTI6MDU6NTBzIC0wOjA1OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE1CTEyOjA1OjU1cyAtMDowNTo1NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxNgkxMjowNjowMHMgLTA6MDY6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTcJMTI6MDY6MDVzIC0wOjA2OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE4CTEyOjA2OjEwcyAtMDowNjoxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxOQkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjAJMTI6MDY6MjBzIC0wOjA2OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTIxCTEyOjA2OjI1cyAtMDowNjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyMgkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjMJMTI6MDY6MjVzIC0wOjA2OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI0CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyNQkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjYJMTI6MDY6MzBzIC0wOjA2OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI3CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyOAkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjkJMTI6MDY6MjVzIC0wOjA2OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTMwCTEyOjA2OjI1cyAtMDowNjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkzMQkxMjowNjoyMHMgLTA6MDY6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMQkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMgkxMjowNjoxNXMgLTA6MDY6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMwkxMjowNjoxMHMgLTA6MDY6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNAkxMjowNjowNXMgLTA6MDY6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNQkxMjowNTo1NXMgLTA6MDU6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNgkxMjowNTo1MHMgLTA6MDU6NTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNwkxMjowNTo0NXMgLTA6MDU6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJOAkxMjowNTozNXMgLTA6MDU6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJOQkxMjowNToyNXMgLTA6MDU6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTAJMTI6MDU6MjBzIC0wOjA1OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTExCTEyOjA1OjEwcyAtMDowNToxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxMgkxMjowNTowMHMgLTA6MDU6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTMJMTI6MDQ6NTBzIC0wOjA0OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE0CTEyOjA0OjM1cyAtMDowNDozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxNQkxMjowNDoyNXMgLTA6MDQ6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTYJMTI6MDQ6MTVzIC0wOjA0OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE3CTEyOjA0OjAwcyAtMDowNDowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxOAkxMjowMzo1MHMgLTA6MDM6NTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTkJMTI6MDM6MzVzIC0wOjAzOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTIwCTEyOjAzOjIwcyAtMDowMzoyMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyMQkxMjowMzowNXMgLTA6MDM6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjIJMTI6MDI6NTBzIC0wOjAyOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTIzCTEyOjAyOjM1cyAtMDowMjozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyNAkxMjowMjoyMHMgLTA6MDI6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjUJMTI6MDI6MDBzIC0wOjAyOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI2CTEyOjAxOjQ1cyAtMDowMTo0NSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyNwkxMjowMTozMHMgLTA6MDE6MzAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjgJMTI6MDE6MTBzIC0wOjAxOjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI5CTEyOjAwOjUwcyAtMDowMDo1MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkzMAkxMjowMDozNXMgLTA6MDA6MzUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMzEJMTI6MDA6MTVzIC0wOjAwOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEJMTE6NTk6NTVzIDA6MDA6MDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMgkxMTo1OTozNXMgMDowMDoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAkzCTExOjU5OjIwcyAwOjAwOjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTQJMTE6NTk6MDBzIDA6MDE6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJNQkxMTo1ODo0MHMgMDowMToyMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk2CTExOjU4OjIwcyAwOjAxOjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTcJMTE6NTg6MDBzIDA6MDI6MDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJOAkxMTo1NzozNXMgMDowMjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk5CTExOjU3OjE1cyAwOjAyOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEwCTExOjU2OjU1cyAwOjAzOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTExCTExOjU2OjM1cyAwOjAzOjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEyCTExOjU2OjE1cyAwOjAzOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEzCTExOjU1OjUwcyAwOjA0OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE0CTExOjU1OjMwcyAwOjA0OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE1CTExOjU1OjEwcyAwOjA0OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE2CTExOjU0OjUwcyAwOjA1OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE3CTExOjU0OjI1cyAwOjA1OjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE4CTExOjU0OjA1cyAwOjA1OjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE5CTExOjUzOjQ1cyAwOjA2OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIwCTExOjUzOjI1cyAwOjA2OjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIxCTExOjUzOjAwcyAwOjA3OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIyCTExOjUyOjQwcyAwOjA3OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIzCTExOjUyOjIwcyAwOjA3OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI0CTExOjUyOjAwcyAwOjA4OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI1CTExOjUxOjQwcyAwOjA4OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI2CTExOjUxOjE1cyAwOjA4OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI3CTExOjUwOjU1cyAwOjA5OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI4CTExOjUwOjM1cyAwOjA5OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI5CTExOjUwOjE1cyAwOjA5OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTMwCTExOjQ5OjU1cyAwOjEwOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEJMTE6NDk6MzVzIDA6MTA6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMgkxMTo0OToyMHMgMDoxMDo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAkzCTExOjQ5OjAwcyAwOjExOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTQJMTE6NDg6NDBzIDA6MTE6MjAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJNQkxMTo0ODoyNXMgMDoxMTozNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk2CTExOjQ4OjA1cyAwOjExOjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTcJMTE6NDc6NTBzIDA6MTI6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJOAkxMTo0NzozMHMgMDoxMjozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk5CTExOjQ3OjE1cyAwOjEyOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEwCTExOjQ3OjAwcyAwOjEzOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTExCTExOjQ2OjQ1cyAwOjEzOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEyCTExOjQ2OjMwcyAwOjEzOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEzCTExOjQ2OjE1cyAwOjEzOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE0CTExOjQ2OjAwcyAwOjE0OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE1CTExOjQ1OjQ1cyAwOjE0OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE2CTExOjQ1OjM1cyAwOjE0OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE3CTExOjQ1OjIwcyAwOjE0OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE4CTExOjQ1OjEwcyAwOjE0OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE5CTExOjQ1OjAwcyAwOjE1OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIwCTExOjQ0OjQ1cyAwOjE1OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIxCTExOjQ0OjQwcyAwOjE1OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIyCTExOjQ0OjMwcyAwOjE1OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIzCTExOjQ0OjIwcyAwOjE1OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI0CTExOjQ0OjEwcyAwOjE1OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI1CTExOjQ0OjA1cyAwOjE1OjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI2CTExOjQ0OjAwcyAwOjE2OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI3CTExOjQzOjU1cyAwOjE2OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI4CTExOjQzOjUwcyAwOjE2OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI5CTExOjQzOjQ1cyAwOjE2OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTMwCTExOjQzOjQwcyAwOjE2OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTMxCTExOjQzOjQwcyAwOjE2OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMgkxMTo0MzozNXMgMDoxNjoyNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgkzCTExOjQzOjM1cyAwOjE2OjI1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTQJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJNQkxMTo0Mzo0MHMgMDoxNjoyMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk2CTExOjQzOjQwcyAwOjE2OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTcJMTE6NDM6NDVzIDA6MTY6MTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk5CTExOjQzOjUwcyAwOjE2OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEwCTExOjQ0OjAwcyAwOjE2OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTExCTExOjQ0OjA1cyAwOjE1OjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEyCTExOjQ0OjEwcyAwOjE1OjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEzCTExOjQ0OjIwcyAwOjE1OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE0CTExOjQ0OjMwcyAwOjE1OjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE1CTExOjQ0OjQwcyAwOjE1OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE2CTExOjQ0OjUwcyAwOjE1OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE3CTExOjQ1OjAwcyAwOjE1OjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE4CTExOjQ1OjE1cyAwOjE0OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE5CTExOjQ1OjI1cyAwOjE0OjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIwCTExOjQ1OjQwcyAwOjE0OjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIxCTExOjQ1OjU1cyAwOjE0OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIyCTExOjQ2OjEwcyAwOjEzOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIzCTExOjQ2OjMwcyAwOjEzOjMwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI0CTExOjQ2OjQ1cyAwOjEzOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI1CTExOjQ3OjA1cyAwOjEyOjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI2CTExOjQ3OjIwcyAwOjEyOjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI3CTExOjQ3OjQwcyAwOjEyOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI4CTExOjQ4OjAwcyAwOjEyOjAwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI5CTExOjQ4OjI1cyAwOjExOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTMwCTExOjQ4OjQ1cyAwOjExOjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEJMTE6NDk6MDVzIDA6MTA6NTUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMgkxMTo0OTozMHMgMDoxMDozMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkzCTExOjQ5OjU1cyAwOjEwOjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTQJMTE6NTA6MTVzIDA6MDk6NDUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJNQkxMTo1MDo0MHMgMDowOToyMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk2CTExOjUxOjA1cyAwOjA4OjU1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTcJMTE6NTE6MzVzIDA6MDg6MjUgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJOAkxMTo1MjowMHMgMDowODowMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk5CTExOjUyOjI1cyAwOjA3OjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEwCTExOjUyOjU1cyAwOjA3OjA1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTExCTExOjUzOjIwcyAwOjA2OjQwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEyCTExOjUzOjUwcyAwOjA2OjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEzCTExOjU0OjE1cyAwOjA1OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE0CTExOjU0OjQ1cyAwOjA1OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE1CTExOjU1OjE1cyAwOjA0OjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE2CTExOjU1OjQ1cyAwOjA0OjE1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE3CTExOjU2OjE1cyAwOjAzOjQ1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE4CTExOjU2OjQwcyAwOjAzOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE5CTExOjU3OjEwcyAwOjAyOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIwCTExOjU3OjQwcyAwOjAyOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIxCTExOjU4OjEwcyAwOjAxOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIyCTExOjU4OjQwcyAwOjAxOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIzCTExOjU5OjEwcyAwOjAwOjUwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI0CTExOjU5OjQwcyAwOjAwOjIwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI1CTEyOjAwOjEwcyAtMDowMDoxMCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyNgkxMjowMDo0MHMgLTA6MDA6NDAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjcJMTI6MDE6MTBzIC0wOjAxOjEwIC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI4CTEyOjAxOjQwcyAtMDowMTo0MCAtCitSdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyOQkxMjowMjoxMHMgLTA6MDI6MTAgLQorUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMzAJMTI6MDI6MzVzIC0wOjAyOjM1IC0KK1J1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTMxCTEyOjAzOjA1cyAtMDowMzowNSAtCisKKyMgUml5YWRoIGlzIGF0IGFib3V0IDQ2IGRlZ3JlZXMgNDYgbWludXRlcyBFYXN0OiAgMyBocnMsIDcgbWlucywgNCBzZWNzCisjIEJlZm9yZSBhbmQgYWZ0ZXIgMTk4OCwgd2UnbGwgb3BlcmF0ZSBvbiBsb2NhbCBtZWFuIHNvbGFyIHRpbWUuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQorWm9uZQlBc2lhL1JpeWFkaDg4CTM6MDc6MDQJLQkJenp6CTE5ODgKKwkJCTM6MDc6MDQJc29sODgJCXp6egkxOTg5CisJCQkzOjA3OjA0CS0JCXp6egorIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4uLgorTGluawlBc2lhL1JpeWFkaDg4CU1pZGVhc3QvUml5YWRoODgKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3NvbGFyODkgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNGRlNGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb2xhcjg5CkBAIC0wLDAgKzEsMzk2IEBACisjIDxwcmU+CisjIEAoIylzb2xhcjg5CTguMgorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBBcHBhcmVudCBub29uIHRpbWVzIGJlbG93IGFyZSBmb3IgUml5YWRoOyB0aGV5J3JlIGEgYml0IG9mZiBmb3Igb3RoZXIgcGxhY2VzLgorIyBUaW1lcyB3ZXJlIGNvbXB1dGVkIHVzaW5nIGEgZm9ybXVsYSBwcm92aWRlZCBieSB0aGUgVS4gUy4gTmF2YWwgT2JzZXJ2YXRvcnk6CisjCWVxdCA9IC0xMDUuOCAqIHNpbihsKSArIDU5Ni4yICogc2luKDIgKiBsKSArIDQuNCAqIHNpbigzICogbCkKKyMJCS0xMi43ICogc2luKDQgKiBsKSAtIDQyOS4wICogY29zKGwpIC0gMi4xICogY29zICgyICogbCkKKyMJCSsgMTkuMyAqIGNvcygzICogbCk7CisjIHdoZXJlIGwgaXMgdGhlICJtZWFuIGxvbmdpdHVkZSBvZiB0aGUgU3VuIiBnaXZlbiBieQorIwlsID0gMjc5LjY0MiBkZWdyZWVzICsgMC45ODU2NDcgKiBkCisjIGFuZCBkIGlzIHRoZSBpbnRlcnZhbCBpbiBkYXlzIGZyb20gSmFudWFyeSAwLCAwIGhvdXJzIFVuaXZlcnNhbCBUaW1lCisjIChlcXVhbGluZyB0aGUgZGF5IG9mIHRoZSB5ZWFyIHBsdXMgdGhlIGZyYWN0aW9uIG9mIGEgZGF5IGZyb20gemVybyBob3VycykuCisjIFRoZSBhY2N1cmFjeSBvZiB0aGUgZm9ybXVsYSBpcyBwbHVzIG9yIG1pbnVzIHRocmVlIHNlY29uZHMuCisjCisjIFJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGZpdmUgc2Vjb25kcyByZXN1bHRzIGluIGZld2VyIHRoYW4KKyMgMjU2IGRpZmZlcmVudCAidGltZSB0eXBlcyItLWEgbGltaXQgdGhhdCdzIGZhY2VkIGJlY2F1c2UgdGltZSB0eXBlcyBhcmUKKyMgc3RvcmVkIG9uIGRpc2sgYXMgdW5zaWduZWQgY2hhcnMuCisKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxCTEyOjAzOjM1cyAtMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyCTEyOjA0OjA1cyAtMDowNDowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkzCTEyOjA0OjMwcyAtMDowNDozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk0CTEyOjA1OjAwcyAtMDowNTowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk1CTEyOjA1OjI1cyAtMDowNToyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk2CTEyOjA1OjUwcyAtMDowNTo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk3CTEyOjA2OjE1cyAtMDowNjoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk4CTEyOjA2OjQ1cyAtMDowNjo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgk5CTEyOjA3OjEwcyAtMDowNzoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxMAkxMjowNzozNXMgLTA6MDc6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTEJMTI6MDc6NTVzIC0wOjA3OjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTEyCTEyOjA4OjIwcyAtMDowODoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxMwkxMjowODo0NXMgLTA6MDg6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTQJMTI6MDk6MDVzIC0wOjA5OjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE1CTEyOjA5OjI1cyAtMDowOToyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxNgkxMjowOTo0NXMgLTA6MDk6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTcJMTI6MTA6MDVzIC0wOjEwOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE4CTEyOjEwOjI1cyAtMDoxMDoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxOQkxMjoxMDo0NXMgLTA6MTA6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjAJMTI6MTE6MDVzIC0wOjExOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTIxCTEyOjExOjIwcyAtMDoxMToyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyMgkxMjoxMTozNXMgLTA6MTE6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjMJMTI6MTE6NTVzIC0wOjExOjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI0CTEyOjEyOjEwcyAtMDoxMjoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyNQkxMjoxMjoyMHMgLTA6MTI6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjYJMTI6MTI6MzVzIC0wOjEyOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI3CTEyOjEyOjUwcyAtMDoxMjo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyOAkxMjoxMzowMHMgLTA6MTM6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjkJMTI6MTM6MTBzIC0wOjEzOjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTMwCTEyOjEzOjIwcyAtMDoxMzoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkzMQkxMjoxMzozMHMgLTA6MTM6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMQkxMjoxMzo0MHMgLTA6MTM6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMgkxMjoxMzo0NXMgLTA6MTM6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMwkxMjoxMzo1NXMgLTA6MTM6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJNAkxMjoxNDowMHMgLTA6MTQ6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJNQkxMjoxNDowNXMgLTA6MTQ6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJNgkxMjoxNDoxMHMgLTA6MTQ6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJNwkxMjoxNDoxMHMgLTA6MTQ6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJOAkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJOQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTAJMTI6MTQ6MjBzIC0wOjE0OjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTExCTEyOjE0OjIwcyAtMDoxNDoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxMgkxMjoxNDoyMHMgLTA6MTQ6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTMJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE0CTEyOjE0OjE1cyAtMDoxNDoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxNQkxMjoxNDoxMHMgLTA6MTQ6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTYJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE3CTEyOjE0OjA1cyAtMDoxNDowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxOAkxMjoxNDowMHMgLTA6MTQ6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTkJMTI6MTM6NTVzIC0wOjEzOjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTIwCTEyOjEzOjUwcyAtMDoxMzo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyMQkxMjoxMzo0MHMgLTA6MTM6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjIJMTI6MTM6MzVzIC0wOjEzOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTIzCTEyOjEzOjI1cyAtMDoxMzoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyNAkxMjoxMzoxNXMgLTA6MTM6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjUJMTI6MTM6MDVzIC0wOjEzOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTI2CTEyOjEyOjU1cyAtMDoxMjo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyNwkxMjoxMjo0NXMgLTA6MTI6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjgJMTI6MTI6MzVzIC0wOjEyOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTEJMTI6MTI6MjVzIC0wOjEyOjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTIJMTI6MTI6MTBzIC0wOjEyOjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTMJMTI6MTI6MDBzIC0wOjEyOjAwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTQJMTI6MTE6NDVzIC0wOjExOjQ1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTUJMTI6MTE6MzVzIC0wOjExOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTYJMTI6MTE6MjBzIC0wOjExOjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTcJMTI6MTE6MDVzIC0wOjExOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTgJMTI6MTA6NTBzIC0wOjEwOjUwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTkJMTI6MTA6MzVzIC0wOjEwOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTEwCTEyOjEwOjIwcyAtMDoxMDoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxMQkxMjoxMDowNXMgLTA6MTA6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTIJMTI6MDk6NTBzIC0wOjA5OjUwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTEzCTEyOjA5OjMwcyAtMDowOTozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxNAkxMjowOToxNXMgLTA6MDk6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTUJMTI6MDk6MDBzIC0wOjA5OjAwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE2CTEyOjA4OjQwcyAtMDowODo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxNwkxMjowODoyNXMgLTA6MDg6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTgJMTI6MDg6MDVzIC0wOjA4OjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE5CTEyOjA3OjUwcyAtMDowNzo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyMAkxMjowNzozMHMgLTA6MDc6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjEJMTI6MDc6MTVzIC0wOjA3OjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTIyCTEyOjA2OjU1cyAtMDowNjo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyMwkxMjowNjozNXMgLTA6MDY6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjQJMTI6MDY6MjBzIC0wOjA2OjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI1CTEyOjA2OjAwcyAtMDowNjowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyNgkxMjowNTo0MHMgLTA6MDU6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjcJMTI6MDU6MjVzIC0wOjA1OjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI4CTEyOjA1OjA1cyAtMDowNTowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyOQkxMjowNDo1MHMgLTA6MDQ6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMzAJMTI6MDQ6MzBzIC0wOjA0OjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTMxCTEyOjA0OjEwcyAtMDowNDoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxCTEyOjAzOjU1cyAtMDowMzo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyCTEyOjAzOjM1cyAtMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkzCTEyOjAzOjIwcyAtMDowMzoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk0CTEyOjAzOjAwcyAtMDowMzowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk1CTEyOjAyOjQ1cyAtMDowMjo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk2CTEyOjAyOjI1cyAtMDowMjoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk3CTEyOjAyOjEwcyAtMDowMjoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk4CTEyOjAxOjUwcyAtMDowMTo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgk5CTEyOjAxOjM1cyAtMDowMTozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxMAkxMjowMToyMHMgLTA6MDE6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTEJMTI6MDE6MDVzIC0wOjAxOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTEyCTEyOjAwOjUwcyAtMDowMDo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxMwkxMjowMDozNXMgLTA6MDA6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTQJMTI6MDA6MjBzIC0wOjAwOjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE1CTEyOjAwOjA1cyAtMDowMDowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxNgkxMTo1OTo1MHMgMDowMDoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxNwkxMTo1OTozNXMgMDowMDoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxOAkxMTo1OToyMHMgMDowMDo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxOQkxMTo1OToxMHMgMDowMDo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyMAkxMTo1ODo1NXMgMDowMTowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyMQkxMTo1ODo0NXMgMDowMToxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyMgkxMTo1ODozMHMgMDowMTozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyMwkxMTo1ODoyMHMgMDowMTo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyNAkxMTo1ODoxMHMgMDowMTo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyNQkxMTo1ODowMHMgMDowMjowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyNgkxMTo1Nzo1MHMgMDowMjoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyNwkxMTo1Nzo0MHMgMDowMjoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyOAkxMTo1NzozMHMgMDowMjozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkyOQkxMTo1NzoyMHMgMDowMjo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkzMAkxMTo1NzoxNXMgMDowMjo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxCTExOjU3OjA1cyAwOjAyOjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTIJMTE6NTc6MDBzIDA6MDM6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMwkxMTo1Njo1MHMgMDowMzoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk0CTExOjU2OjQ1cyAwOjAzOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTUJMTE6NTY6NDBzIDA6MDM6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJNgkxMTo1NjozNXMgMDowMzoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk3CTExOjU2OjMwcyAwOjAzOjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTgJMTE6NTY6MzBzIDA6MDM6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJOQkxMTo1NjoyNXMgMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxMAkxMTo1NjoyNXMgMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxMQkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxMgkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxMwkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxNAkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxNQkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxNgkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxNwkxMTo1NjoyMHMgMDowMzo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxOAkxMTo1NjoyNXMgMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkxOQkxMTo1NjoyNXMgMDowMzozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyMAkxMTo1NjozMHMgMDowMzozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyMQkxMTo1NjozNXMgMDowMzoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyMgkxMTo1NjozNXMgMDowMzoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyMwkxMTo1Njo0MHMgMDowMzoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyNAkxMTo1Njo0NXMgMDowMzoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyNQkxMTo1Njo1NXMgMDowMzowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyNgkxMTo1NzowMHMgMDowMzowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyNwkxMTo1NzowNXMgMDowMjo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyOAkxMTo1NzoxNXMgMDowMjo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyOQkxMTo1NzoyMHMgMDowMjo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkzMAkxMTo1NzozMHMgMDowMjozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkzMQkxMTo1NzozNXMgMDowMjoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxCTExOjU3OjQ1cyAwOjAyOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTIJMTE6NTc6NTVzIDA6MDI6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMwkxMTo1ODowNXMgMDowMTo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk0CTExOjU4OjE1cyAwOjAxOjQ1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTUJMTE6NTg6MjVzIDA6MDE6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JNgkxMTo1ODozNXMgMDowMToyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk3CTExOjU4OjQ1cyAwOjAxOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTgJMTE6NTk6MDBzIDA6MDE6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JOQkxMTo1OToxMHMgMDowMDo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxMAkxMTo1OToyMHMgMDowMDo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxMQkxMTo1OTozNXMgMDowMDoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxMgkxMTo1OTo0NXMgMDowMDoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxMwkxMjowMDowMHMgMDowMDowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxNAkxMjowMDoxMHMgLTA6MDA6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTUJMTI6MDA6MjVzIC0wOjAwOjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE2CTEyOjAwOjM1cyAtMDowMDozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxNwkxMjowMDo1MHMgLTA6MDA6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTgJMTI6MDE6MDVzIC0wOjAxOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE5CTEyOjAxOjE1cyAtMDowMToxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyMAkxMjowMTozMHMgLTA6MDE6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjEJMTI6MDE6NDBzIC0wOjAxOjQwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTIyCTEyOjAxOjU1cyAtMDowMTo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyMwkxMjowMjoxMHMgLTA6MDI6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjQJMTI6MDI6MjBzIC0wOjAyOjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI1CTEyOjAyOjM1cyAtMDowMjozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyNgkxMjowMjo0NXMgLTA6MDI6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjcJMTI6MDM6MDBzIC0wOjAzOjAwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI4CTEyOjAzOjEwcyAtMDowMzoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyOQkxMjowMzoyNXMgLTA6MDM6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMzAJMTI6MDM6MzVzIC0wOjAzOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTEJMTI6MDM6NDVzIC0wOjAzOjQ1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTIJMTI6MDQ6MDBzIC0wOjA0OjAwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTMJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTQJMTI6MDQ6MjBzIC0wOjA0OjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTUJMTI6MDQ6MzBzIC0wOjA0OjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTYJMTI6MDQ6NDBzIC0wOjA0OjQwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTcJMTI6MDQ6NTBzIC0wOjA0OjUwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTgJMTI6MDU6MDBzIC0wOjA1OjAwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTkJMTI6MDU6MTBzIC0wOjA1OjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTEwCTEyOjA1OjIwcyAtMDowNToyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxMQkxMjowNToyNXMgLTA6MDU6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTIJMTI6MDU6MzVzIC0wOjA1OjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTEzCTEyOjA1OjQwcyAtMDowNTo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxNAkxMjowNTo1MHMgLTA6MDU6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTUJMTI6MDU6NTVzIC0wOjA1OjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE2CTEyOjA2OjAwcyAtMDowNjowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxNwkxMjowNjowNXMgLTA6MDY6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTgJMTI6MDY6MTBzIC0wOjA2OjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE5CTEyOjA2OjE1cyAtMDowNjoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyMAkxMjowNjoyMHMgLTA6MDY6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjEJMTI6MDY6MjBzIC0wOjA2OjIwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTIyCTEyOjA2OjI1cyAtMDowNjoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyMwkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjQJMTI6MDY6MzBzIC0wOjA2OjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI1CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyNgkxMjowNjozMHMgLTA6MDY6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjcJMTI6MDY6MzBzIC0wOjA2OjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI4CTEyOjA2OjMwcyAtMDowNjozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyOQkxMjowNjoyNXMgLTA6MDY6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMzAJMTI6MDY6MjVzIC0wOjA2OjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTMxCTEyOjA2OjIwcyAtMDowNjoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxCTEyOjA2OjIwcyAtMDowNjoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyCTEyOjA2OjE1cyAtMDowNjoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkzCTEyOjA2OjEwcyAtMDowNjoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk0CTEyOjA2OjA1cyAtMDowNjowNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk1CTEyOjA2OjAwcyAtMDowNjowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk2CTEyOjA1OjUwcyAtMDowNTo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk3CTEyOjA1OjQ1cyAtMDowNTo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk4CTEyOjA1OjM1cyAtMDowNTozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1Zwk5CTEyOjA1OjMwcyAtMDowNTozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxMAkxMjowNToyMHMgLTA6MDU6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTEJMTI6MDU6MTBzIC0wOjA1OjEwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTEyCTEyOjA1OjAwcyAtMDowNTowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxMwkxMjowNDo1MHMgLTA6MDQ6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTQJMTI6MDQ6NDBzIC0wOjA0OjQwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE1CTEyOjA0OjMwcyAtMDowNDozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxNgkxMjowNDoxNXMgLTA6MDQ6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTcJMTI6MDQ6MDVzIC0wOjA0OjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE4CTEyOjAzOjUwcyAtMDowMzo1MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxOQkxMjowMzozNXMgLTA6MDM6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjAJMTI6MDM6MjVzIC0wOjAzOjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTIxCTEyOjAzOjEwcyAtMDowMzoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyMgkxMjowMjo1NXMgLTA6MDI6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjMJMTI6MDI6NDBzIC0wOjAyOjQwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI0CTEyOjAyOjIwcyAtMDowMjoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyNQkxMjowMjowNXMgLTA6MDI6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjYJMTI6MDE6NTBzIC0wOjAxOjUwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI3CTEyOjAxOjMwcyAtMDowMTozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyOAkxMjowMToxNXMgLTA6MDE6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjkJMTI6MDA6NTVzIC0wOjAwOjU1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTMwCTEyOjAwOjQwcyAtMDowMDo0MCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkzMQkxMjowMDoyMHMgLTA6MDA6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMQkxMjowMDowMHMgMDowMDowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkyCTExOjU5OjQ1cyAwOjAwOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTMJMTE6NTk6MjVzIDA6MDA6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJNAkxMTo1OTowNXMgMDowMDo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk1CTExOjU4OjQ1cyAwOjAxOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTYJMTE6NTg6MjVzIDA6MDE6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJNwkxMTo1ODowNXMgMDowMTo1NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk4CTExOjU3OjQ1cyAwOjAyOjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTkJMTE6NTc6MjBzIDA6MDI6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTAJMTE6NTc6MDBzIDA6MDM6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTEJMTE6NTY6NDBzIDA6MDM6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTIJMTE6NTY6MjBzIDA6MDM6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTMJMTE6NTY6MDBzIDA6MDQ6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTQJMTE6NTU6MzVzIDA6MDQ6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTUJMTE6NTU6MTVzIDA6MDQ6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTYJMTE6NTQ6NTVzIDA6MDU6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTcJMTE6NTQ6MzVzIDA6MDU6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTgJMTE6NTQ6MTBzIDA6MDU6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMTkJMTE6NTM6NTBzIDA6MDY6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjAJMTE6NTM6MzBzIDA6MDY6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjEJMTE6NTM6MTBzIDA6MDY6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjIJMTE6NTI6NDVzIDA6MDc6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjMJMTE6NTI6MjVzIDA6MDc6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjQJMTE6NTI6MDVzIDA6MDc6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjUJMTE6NTE6NDVzIDA6MDg6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjYJMTE6NTE6MjVzIDA6MDg6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjcJMTE6NTE6MDVzIDA6MDg6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjgJMTE6NTA6NDBzIDA6MDk6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMjkJMTE6NTA6MjBzIDA6MDk6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMzAJMTE6NTA6MDBzIDA6MTA6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMQkxMTo0OTo0NXMgMDoxMDoxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkyCTExOjQ5OjI1cyAwOjEwOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTMJMTE6NDk6MDVzIDA6MTA6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJNAkxMTo0ODo0NXMgMDoxMToxNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk1CTExOjQ4OjMwcyAwOjExOjMwIC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTYJMTE6NDg6MTBzIDA6MTE6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJNwkxMTo0Nzo1MHMgMDoxMjoxMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk4CTExOjQ3OjM1cyAwOjEyOjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTkJMTE6NDc6MjBzIDA6MTI6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTAJMTE6NDc6MDBzIDA6MTM6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTEJMTE6NDY6NDVzIDA6MTM6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTIJMTE6NDY6MzBzIDA6MTM6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTMJMTE6NDY6MTVzIDA6MTM6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTQJMTE6NDY6MDBzIDA6MTQ6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTUJMTE6NDU6NTBzIDA6MTQ6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTYJMTE6NDU6MzVzIDA6MTQ6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTcJMTE6NDU6MjBzIDA6MTQ6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTgJMTE6NDU6MTBzIDA6MTQ6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMTkJMTE6NDU6MDBzIDA6MTU6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjAJMTE6NDQ6NTBzIDA6MTU6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjEJMTE6NDQ6NDBzIDA6MTU6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjIJMTE6NDQ6MzBzIDA6MTU6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjMJMTE6NDQ6MjBzIDA6MTU6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjQJMTE6NDQ6MTBzIDA6MTU6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjUJMTE6NDQ6MDVzIDA6MTU6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjYJMTE6NDQ6MDBzIDA6MTY6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjcJMTE6NDM6NTBzIDA6MTY6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjgJMTE6NDM6NDVzIDA6MTY6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMjkJMTE6NDM6NDBzIDA6MTY6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMzAJMTE6NDM6NDBzIDA6MTY6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMzEJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMQkxMTo0MzozNXMgMDoxNjoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkyCTExOjQzOjM1cyAwOjE2OjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTMJMTE6NDM6MzBzIDA6MTY6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJNAkxMTo0MzozNXMgMDoxNjoyNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk1CTExOjQzOjM1cyAwOjE2OjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTYJMTE6NDM6MzVzIDA6MTY6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJNwkxMTo0Mzo0MHMgMDoxNjoyMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk4CTExOjQzOjQ1cyAwOjE2OjE1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTkJMTE6NDM6NTBzIDA6MTY6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTAJMTE6NDM6NTVzIDA6MTY6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTEJMTE6NDQ6MDBzIDA6MTY6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTIJMTE6NDQ6MDVzIDA6MTU6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTMJMTE6NDQ6MTVzIDA6MTU6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTQJMTE6NDQ6MjVzIDA6MTU6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTUJMTE6NDQ6MzVzIDA6MTU6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTYJMTE6NDQ6NDVzIDA6MTU6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTcJMTE6NDQ6NTVzIDA6MTU6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTgJMTE6NDU6MTBzIDA6MTQ6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMTkJMTE6NDU6MjBzIDA6MTQ6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjAJMTE6NDU6MzVzIDA6MTQ6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjEJMTE6NDU6NTBzIDA6MTQ6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjIJMTE6NDY6MDVzIDA6MTM6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjMJMTE6NDY6MjVzIDA6MTM6MzUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjQJMTE6NDY6NDBzIDA6MTM6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjUJMTE6NDc6MDBzIDA6MTM6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjYJMTE6NDc6MjBzIDA6MTI6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjcJMTE6NDc6MzVzIDA6MTI6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjgJMTE6NDc6NTVzIDA6MTI6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMjkJMTE6NDg6MjBzIDA6MTE6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMzAJMTE6NDg6NDBzIDA6MTE6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMQkxMTo0OTowMHMgMDoxMTowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyCTExOjQ5OjI1cyAwOjEwOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTMJMTE6NDk6NTBzIDA6MTA6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJNAkxMTo1MDoxNXMgMDowOTo0NSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk1CTExOjUwOjM1cyAwOjA5OjI1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTYJMTE6NTE6MDBzIDA6MDk6MDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJNwkxMTo1MTozMHMgMDowODozMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk4CTExOjUxOjU1cyAwOjA4OjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTkJMTE6NTI6MjBzIDA6MDc6NDAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTAJMTE6NTI6NTBzIDA6MDc6MTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTEJMTE6NTM6MTVzIDA6MDY6NDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTIJMTE6NTM6NDVzIDA6MDY6MTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTMJMTE6NTQ6MTBzIDA6MDU6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTQJMTE6NTQ6NDBzIDA6MDU6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTUJMTE6NTU6MTBzIDA6MDQ6NTAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTYJMTE6NTU6NDBzIDA6MDQ6MjAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTcJMTE6NTY6MDVzIDA6MDM6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTgJMTE6NTY6MzVzIDA6MDM6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMTkJMTE6NTc6MDVzIDA6MDI6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjAJMTE6NTc6MzVzIDA6MDI6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjEJMTE6NTg6MDVzIDA6MDE6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjIJMTE6NTg6MzVzIDA6MDE6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjMJMTE6NTk6MDVzIDA6MDA6NTUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjQJMTE6NTk6MzVzIDA6MDA6MjUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjUJMTI6MDA6MDVzIC0wOjAwOjA1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI2CTEyOjAwOjM1cyAtMDowMDozNSAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyNwkxMjowMTowNXMgLTA6MDE6MDUgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjgJMTI6MDE6MzVzIC0wOjAxOjM1IC0KK1J1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI5CTEyOjAyOjAwcyAtMDowMjowMCAtCitSdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkzMAkxMjowMjozMHMgLTA6MDI6MzAgLQorUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMzEJMTI6MDM6MDBzIC0wOjAzOjAwIC0KKworIyBSaXlhZGggaXMgYXQgYWJvdXQgNDYgZGVncmVlcyA0NiBtaW51dGVzIEVhc3Q6ICAzIGhycywgNyBtaW5zLCA0IHNlY3MKKyMgQmVmb3JlIGFuZCBhZnRlciAxOTg5LCB3ZSdsbCBvcGVyYXRlIG9uIGxvY2FsIG1lYW4gc29sYXIgdGltZS4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCitab25lCUFzaWEvUml5YWRoODkJMzowNzowNAktCQl6enoJMTk4OQorCQkJMzowNzowNAlzb2w4OQkJenp6CTE5OTAKKwkJCTM6MDc6MDQJLQkJenp6CisjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uCitMaW5rCUFzaWEvUml5YWRoODkJTWlkZWFzdC9SaXlhZGg4OQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvc291dGhhbWVyaWNhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvc291dGhhbWVyaWNhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGVkY2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy9zb3V0aGFtZXJpY2EKQEAgLTAsMCArMSwxNTE3IEBACisjIDxwcmU+CisjIEAoIylzb3V0aGFtZXJpY2EJOC40MAorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKworIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKKyMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bworIyB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcworIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCisjIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCisjCisjIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKKyMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0CisjIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKKyMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKKyMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCisjCisjIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgorIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCisjCisjIEVhcmxpZXIgZWRpdGlvbnMgb2YgdGhlc2UgdGFibGVzIHVzZWQgdGhlIE5vcnRoIEFtZXJpY2FuIHN0eWxlIChlLmcuIEFSU1QgYW5kCisjIEFSRFQgZm9yIEFyZ2VudGluZSBTdGFuZGFyZCBhbmQgRGF5bGlnaHQgVGltZSksIGJ1dCB0aGUgZm9sbG93aW5nIHF1b3RlCisjIHN1Z2dlc3RzIHRoYXQgaXQncyBiZXR0ZXIgdG8gdXNlIEV1cm9wZWFuIHN0eWxlIChlLmcuIEFSVCBhbmQgQVJTVCkuCisjCUkgc3VnZ2VzdCB0aGUgdXNlIG9mIF9TdW1tZXIgdGltZV8gaW5zdGVhZCBvZiB0aGUgbW9yZSBjdW1iZXJzb21lCisjCV9kYXlsaWdodC1zYXZpbmcgdGltZV8uICBfU3VtbWVyIHRpbWVfIHNlZW1zIHRvIGJlIGluIGdlbmVyYWwgdXNlCisjCWluIEV1cm9wZSBhbmQgU291dGggQW1lcmljYS4KKyMJLS0gRSBPIEN1dGxlciwgX05ldyBZb3JrIFRpbWVzXyAoMTkzNy0wMi0xNCksIHF1b3RlZCBpbgorIwlIIEwgTWVuY2tlbiwgX1RoZSBBbWVyaWNhbiBMYW5ndWFnZTogU3VwcGxlbWVudCBJXyAoMTk2MCksIHAgNDY2CisjCisjIEVhcmxpZXIgZWRpdGlvbnMgb2YgdGhlc2UgdGFibGVzIGFsc28gdXNlZCB0aGUgTm9ydGggQW1lcmljYW4gc3R5bGUKKyMgZm9yIHRpbWUgem9uZXMgaW4gQnJhemlsLCBidXQgdGhpcyB3YXMgaW5jb3JyZWN0LCBhcyBCcmF6aWxpYW5zIHNheQorIyAic3VtbWVyIHRpbWUiLiAgUmVpbmFsZG8gR291bGFydCwgYSBTYW8gUGF1bG8gYnVzaW5lc3NtYW4gYWN0aXZlIGluCisjIHRoZSByYWlscm9hZCBzZWN0b3IsIHdyaXRlcyAoMTk5OS0wNy0wNik6CisjCVRoZSBzdWJqZWN0IG9mIHRpbWUgem9uZXMgaXMgY3VycmVudGx5IGEgbWF0dGVyIG9mIGRpc2N1c3Npb24vZGViYXRlIGluCisjCUJyYXppbC4gIExldCdzIHNheSB0aGF0ICJ0aGUgQnJhc2lsaWEgdGltZSIgaXMgY29uc2lkZXJlZCB0aGUKKyMJIm9mZmljaWFsIHRpbWUiIGJlY2F1c2UgQnJhc2lsaWEgaXMgdGhlIGNhcGl0YWwgY2l0eS4KKyMJVGhlIG90aGVyIHRocmVlIHRpbWUgem9uZXMgYXJlIGNhbGxlZCAiQnJhc2lsaWEgdGltZSAibWludXMgb25lIiBvcgorIwkicGx1cyBvbmUiIG9yICJwbHVzIHR3byIuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIHN1Y2gKKyMJbmFtZS9kZXNpZ25hdGlvbiBhcyAiRWFzdGVybiBUaW1lIiBvciAiQ2VudHJhbCBUaW1lIi4KKyMgU28gSSBpbnZlbnRlZCB0aGUgZm9sbG93aW5nIChFbmdsaXNoLWxhbmd1YWdlKSBhYmJyZXZpYXRpb25zIGZvciBub3cuCisjIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQorIwkJc3RkCWRzdAorIwktMjowMAlGTlQJRk5TVAlGZXJuYW5kbyBkZSBOb3JvbmhhCisjCS0zOjAwCUJSVAlCUlNUCUJyYXNpbGlhCisjCS00OjAwCUFNVAlBTVNUCUFtYXpvbgorIwktNTowMAlBQ1QJQUNTVAlBY3JlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEFyZ2VudGluYQorCisjIEZyb20gQm9iIERldmluZSAoMTk4OC0wMS0yOCk6CisjIEFyZ2VudGluYTogZmlyc3QgU3VuZGF5IGluIE9jdG9iZXIgdG8gZmlyc3QgU3VuZGF5IGluIEFwcmlsIHNpbmNlIDE5NzYuCisjIERvdWJsZSBTdW1tZXIgdGltZSBmcm9tIDE5NjkgdG8gMTk3NC4gIFN3aXRjaGVzIGF0IG1pZG5pZ2h0LgorCisjIEZyb20gVS4gUy4gTmF2YWwgT2JzZXJ2YXRvcnkgKDE5ODgtMDEtMTk5KToKKyMgQVJHRU5USU5BICAgICAgICAgICAzIEggQkVISU5EICAgVVRDCisKKyMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgorIyBJIGFtIHNlbmRpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgQXJnZW50aW5lIHRpbWUgem9uZSB0YWJsZS4uLgorIyBBUiB3YXMgY2hvc2VuIGJlY2F1c2UgdGhleSBhcmUgdGhlIElTTyBsZXR0ZXJzIHRoYXQgcmVwcmVzZW50IEFyZ2VudGluYS4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQXJnCTE5MzAJb25seQktCURlYwkgMQkwOjAwCTE6MDAJUworUnVsZQlBcmcJMTkzMQlvbmx5CS0JQXByCSAxCTA6MDAJMAktCitSdWxlCUFyZwkxOTMxCW9ubHkJLQlPY3QJMTUJMDowMAkxOjAwCVMKK1J1bGUJQXJnCTE5MzIJMTk0MAktCU1hcgkgMQkwOjAwCTAJLQorUnVsZQlBcmcJMTkzMgkxOTM5CS0JTm92CSAxCTA6MDAJMTowMAlTCitSdWxlCUFyZwkxOTQwCW9ubHkJLQlKdWwJIDEJMDowMAkxOjAwCVMKK1J1bGUJQXJnCTE5NDEJb25seQktCUp1bgkxNQkwOjAwCTAJLQorUnVsZQlBcmcJMTk0MQlvbmx5CS0JT2N0CTE1CTA6MDAJMTowMAlTCitSdWxlCUFyZwkxOTQzCW9ubHkJLQlBdWcJIDEJMDowMAkwCS0KK1J1bGUJQXJnCTE5NDMJb25seQktCU9jdAkxNQkwOjAwCTE6MDAJUworUnVsZQlBcmcJMTk0Nglvbmx5CS0JTWFyCSAxCTA6MDAJMAktCitSdWxlCUFyZwkxOTQ2CW9ubHkJLQlPY3QJIDEJMDowMAkxOjAwCVMKK1J1bGUJQXJnCTE5NjMJb25seQktCU9jdAkgMQkwOjAwCTAJLQorUnVsZQlBcmcJMTk2Mwlvbmx5CS0JRGVjCTE1CTA6MDAJMTowMAlTCitSdWxlCUFyZwkxOTY0CTE5NjYJLQlNYXIJIDEJMDowMAkwCS0KK1J1bGUJQXJnCTE5NjQJMTk2NgktCU9jdAkxNQkwOjAwCTE6MDAJUworUnVsZQlBcmcJMTk2Nwlvbmx5CS0JQXByCSAyCTA6MDAJMAktCitSdWxlCUFyZwkxOTY3CTE5NjgJLQlPY3QJU3VuPj0xCTA6MDAJMTowMAlTCitSdWxlCUFyZwkxOTY4CTE5NjkJLQlBcHIJU3VuPj0xCTA6MDAJMAktCitSdWxlCUFyZwkxOTc0CW9ubHkJLQlKYW4JMjMJMDowMAkxOjAwCVMKK1J1bGUJQXJnCTE5NzQJb25seQktCU1heQkgMQkwOjAwCTAJLQorUnVsZQlBcmcJMTk4OAlvbmx5CS0JRGVjCSAxCTA6MDAJMTowMAlTCisjCisjIEZyb20gSGVybmFuIEcuIE90ZXJvICgxOTk1LTA2LTI2KToKKyMgVGhlc2UgY29ycmVjdGlvbnMgd2VyZSBjb250cmlidXRlZCBieSBJbnRlclNvZnQgQXJnZW50aW5hIFMuQS4sCisjIG9idGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZToKKyMgVGFsbGVyZXMgZGUgSGlkcm9ncmFmaWEgTmF2YWwgQXJnZW50aW5hCisjIChBcmdlbnRpbmUgTmF2YWwgSHlkcm9ncmFwaHkgSW5zdGl0dXRlKQorUnVsZQlBcmcJMTk4OQkxOTkzCS0JTWFyCVN1bj49MQkwOjAwCTAJLQorUnVsZQlBcmcJMTk4OQkxOTkyCS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKKyMKKyMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgorIyBGcm9tIHRoaXMgbW9tZW50IG9uLCB0aGUgbGF3IHRoYXQgbWFuZGF0ZWQgdGhlIGRheWxpZ2h0IHNhdmluZworIyB0aW1lIGNvcnJlY3Rpb25zIHdhcyBkZXJvZ2F0ZWQgYW5kIG5vIG1vcmUgbW9kaWZpY2F0aW9ucworIyB0byB0aGUgdGltZSB6b25lcyAoZm9yIGRheWxpZ2h0IHNhdmluZykgYXJlIG5vdyBtYWRlLgorIworIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTAxLTEwKToKKyMgT24gT2N0b2JlciAzLCAxOTk5LCAwOjAwIGxvY2FsLCBBcmdlbnRpbmEgaW1wbGVtZW50ZWQgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLAorIyB3aGljaCBkaWQgbm90IHJlc3VsdCBpbiB0aGUgc3dpdGNoIG9mIGEgdGltZSB6b25lLCBhcyB0aGV5IHN0YXllZCA5IGhvdXJzCisjIGZyb20gdGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lLgorUnVsZQlBcmcJMTk5OQlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTE6MDAJUworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTEyLTI4KToKKyMgRFNUIHdhcyBzZXQgdG8gZXhwaXJlIG9uIE1hcmNoIDUsIG5vdCBNYXJjaCAzLCBidXQgc2luY2UgaXQgd2FzIGNvbnZlcnRlZAorIyB0byBzdGFuZGFyZCB0aW1lIG9uIE1hcmNoIDMgaXQncyBtb3JlIGNvbnZlbmllbnQgZm9yIHVzIHRvIHByZXRlbmQgdGhhdAorIyBpdCBlbmRlZCBvbiBNYXJjaCAzLgorUnVsZQlBcmcJMjAwMAlvbmx5CS0JTWFyCTMJMDowMAkwCS0KKyMKKyMgRnJvbSBQZXRlciBHcmFkZWxza2kgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0wMy0wMSk6CisjIFdlIGp1c3QgY2hlY2tlZCB3aXRoIG91ciBTYW8gUGF1bG8gb2ZmaWNlIGFuZCB0aGV5IHNheSB0aGUgZ292ZXJubWVudCBvZgorIyBBcmdlbnRpbmEgZGVjaWRlZCBub3QgdG8gYmVjb21lIG9uZSBvZiB0aGUgY291bnRyaWVzIHRoYXQgZ28gb24gb3Igb2ZmIERTVC4KKyMgU28gQnVlbm9zIEFpcmVzIHNob3VsZCBiZSAtMyBob3VycyBmcm9tIEdNVCBhdCBhbGwgdGltZXMuCisjCisjIEZyb20gRmFiaWFuIEwuIEFyY2UgSm9mcmUgKDIwMDAtMDQtMDQpOgorIyBUaGUgbGF3IHRoYXQgY2xhaW1lZCBEU1QgZm9yIEFyZ2VudGluYSB3YXMgZGVyb2dhdGVkIGJ5IFByZXNpZGVudCBGZXJuYW5kbworIyBkZSBsYSBSdWEgb24gTWFyY2ggMiwgMjAwMCwgYmVjYXVzZSBpdCB3b3VsZCBtYWtlIHBlb3BsZSBzcGVuZCBtb3JlIGVuZXJneQorIyBpbiB0aGUgd2ludGVyIHRpbWUsIHJhdGhlciB0aGFuIGxlc3MuICBUaGUgY2hhbmdlIHRvb2sgZWZmZWN0IG9uIE1hcmNoIDMuCisjCisjIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDEtMDYtMDYpOgorIyBvbmUgb2YgdGhlIG1ham9yIG5ld3NwYXBlcnMgaGVyZSBpbiBBcmdlbnRpbmEgc2FpZCB0aGF0IHRoZSAxOTk5CisjIFRpbWV6b25lIExhdyAod2hpY2ggbmV2ZXIgd2FzIGVmZmVjdGl2ZWx5IGFwcGxpZWQpIHdpbGwgKHdvdWxkPykgYmUKKyMgaW4gZWZmZWN0Li4uLiBUaGUgYXJ0aWNsZSBpcyBhdAorIyBodHRwOi8vYXIuY2xhcmluLmNvbS9kaWFyaW8vMjAwMS0wNi0wNi9lLTAxNzAxLmh0bQorIyAuLi4gVGhlIExhdyBpdHNlbGYgaXMgIkxleSBObyAyNTE1NSIsIHNhbmN0aW9uZWQgb24gMTk5OS0wOC0yNSwgZW5hY3RlZAorIyAxOTk5LTA5LTE3LCBhbmQgcHVibGlzaGVkIDE5OTktMDktMjEuICBUaGUgb2ZmaWNpYWwgcHVibGljYXRpb24gaXMgYXQ6CisjIGh0dHA6Ly93d3cuYm9sZXRpbi5qdXMuZ292LmFyL0JPTi9QcmltZXJhLzE5OTkvMDktU2VwdGllbWJyZS8yMS9QREYvQk8yMS0wOS05OUxFRy5QREYKKyMgUmVncmV0ZnVsbHksIHlvdSBoYXZlIHRvIHN1YnNjcmliZSAoYW5kIHBheSkgZm9yIHRoZSBvbi1saW5lIHZlcnNpb24uLi4uCisjCisjICgyMDAxLTA2LTEyKToKKyMgdGhlIHRpbWV6b25lIGZvciBBcmdlbnRpbmEgd2lsbCBub3QgY2hhbmdlIG5leHQgU3VuZGF5LgorIyBBcHBhcmVudGx5IGl0IHdpbGwgZG8gc28gb24gU3VuZGF5IDI0dGguLi4uCisjIGh0dHA6Ly9hci5jbGFyaW4uY29tL2RpYXJpby8yMDAxLTA2LTEyL3MtMDM1MDEuaHRtCisjCisjICgyMDAxLTA2LTI1KToKKyMgTGFzdCBGcmlkYXkgKHllcywgdGhlIGxhc3Qgd29ya2luZyBkYXkgYmVmb3JlIHRoZSBkYXRlIG9mIHRoZSBjaGFuZ2UpLCB0aGUKKyMgU2VuYXRlIGFubnVsbGVkIHRoZSAxOTk5IGxhdyB0aGF0IGludHJvZHVjZWQgdGhlIGNoYW5nZXMgbGF0ZXIgcG9zdHBvbmVkLgorIyBodHRwOi8vd3d3LmNsYXJpbi5jb20uYXIvZGlhcmlvLzIwMDEtMDYtMjIvcy0wMzYwMS5odG0KKyMgSXQgcmVtYWlucyB0aGUgdm90ZSBvZiB0aGUgRGVwdXRpZXMuLi4sIGJ1dCBpdCB3aWxsIGJlIHRoZSBzYW1lLi4uLgorIyBUaGlzIGtpbmQgb2YgdGhpbmdzIGhhZCBhbHdheXMgYmVlbiBkb25lIHRoaXMgd2F5IGluIEFyZ2VudGluYS4KKyMgV2UgYXJlIHN0aWxsIC0wMzowMCBhbGwgeWVhciByb3VuZCBpbiBhbGwgb2YgdGhlIGNvdW50cnkuCisjCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTEyLTIxKToKKyMgQSB1c2VyIChMZW9uYXJkbyBDaGFpbSkgcmVwb3J0ZWQgdGhhdCBBcmdlbnRpbmEgd2lsbCBhZG9wdCBEU1QuLi4uCisjIGFsbCBvZiB0aGUgY291bnRyeSAoYWxsIFpvbmUtZW50cmllcykgYXJlIGFmZmVjdGVkLiAgTmV3cyByZXBvcnRzIGxpa2UKKyMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvb3Bpbmlvbi9ub3RhLmFzcD9ub3RhX2lkPTk3MzAzNyBpbmRpY2F0ZQorIyB0aGF0IEFyZ2VudGluYSB3aWxsIHVzZSBEU1QgbmV4dCB5ZWFyIGFzIHdlbGwsIGZyb20gT2N0b2JlciB0bworIyBNYXJjaCwgYWx0aG91Z2ggZXhhY3QgcnVsZXMgYXJlIG5vdCBnaXZlbi4KKyMKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDctMTItMjYpCisjIFRoZSBsYXN0IGh1cmRsZSBvZiBBcmdlbnRpbmEgRFNUIGlzIG92ZXIsIHRoZSBwcm9wb3NhbCB3YXMgYXBwcm92ZWQgaW4KKyMgdGhlIGxvd2VyIGNoYW1iZXIgdG9vIChEZXB1dGFkb3MpIHdpdGggYSB2b3RlIDE5MiBmb3IgYW5kIDIgYWdhaW5zdC4KKyMgQnkgdGhlIHdheSB0aGFua3MgdG8gTWFyaWFubyBBYnNhdHogYW5kIERhbmllbCBNYXJpbyBWZWdhIGZvciB0aGUgbGluayB0bworIyB0aGUgb3JpZ2luYWwgc2Nhbm5lZCBwcm9wb3NhbCwgd2hlcmUgdGhlIGRhdGVzIGFuZCB0aGUgemVybyBob3VycyBhcmUKKyMgY2xlYXIgYW5kIHVuYW1iaWd1b3VzLi4uVGhpcyBpcyB0aGUgYXJ0aWNsZSBhYm91dCBmaW5hbCBhcHByb3ZhbDoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvcG9saXRpY2Evbm90YS5hc3A/bm90YV9pZD05NzM5OTYiPgorIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9wb2xpdGljYS9ub3RhLmFzcD9ub3RhX2lkPTk3Mzk5NgorIyA8L2E+CisjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMTItMjIpOgorIyBGb3IgZGF0ZXMgYWZ0ZXIgbWlkLTIwMDgsIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIG15IGd1ZXNzZXMgYW5kCisjIGFyZSBxdWl0ZSBwb3NzaWJseSB3cm9uZywgYnV0IGFyZSBtb3JlIGxpa2VseSB0aGFuIG5vIERTVCBhdCBhbGwuCisKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDgtMDktMDUpOgorIyBBcyBwZXIgbWVzc2FnZSBmcm9tIENhcmxvcyBBbGJlcnRvIEZvbnNlY2EgQXJhdXogKE5pY2FyYWd1YSksCisjIEFyZ2VudGluYSB3aWxsIHN0YXJ0IERTVCBvbiBTdW5kYXkgT2N0b2JlciAxOSwgMjAwOC4KKyMKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMy5odG1sIj4KKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMy5odG1sCisjIDwvYT4KKyMgT1IKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbXB1bHNvYmFpcmVzLmNvbS5hci9ub3RhLnBocD9pZD01NzgzMiAoaW4gc3BhbmlzaCkiPgorIyBodHRwOi8vd3d3LmltcHVsc29iYWlyZXMuY29tLmFyL25vdGEucGhwP2lkPTU3ODMyIChpbiBzcGFuaXNoKQorIyA8L2E+CisKKyMgRnJvbSBSb2RyaWdvIFNldmVybyAoMjAwOC0xMC0wNik6CisjIEhlcmUgaXMgc29tZSBpbmZvIGF2YWlsYWJsZSBhdCBhIEdlbnRvbyBidWcgcmVsYXRlZCB0byBUWiBvbiBBcmdlbnRpbmEncyBEU1Q6CisjIC4uLgorIyAtLS0tLS0tIENvbW1lbnQgIzEgZnJvbSBbam1kb2NpbGVdICAyMDA4LTEwLTA2IDE2OjI4IDAwMDAgLS0tLS0tLQorIyBIaSwgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGltZXpvbmUtZGF0YS0yMDA4ZSBhbmQgbWF5YmUgd2l0aAorIyB0aW1lem9uZS1kYXRhLTIwMDhmCisjIEFyZ2VudGluaWFuIGxhdyBbTnVtYmVyXSAyNS4xNTUgaXMgbm8gbG9uZ2VyIHZhbGlkLgorIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvNjAwMDAtNjQ5OTkvNjAwMzYvbm9ybWEuaHRtIj4KKyMgaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzYwMDAwLTY0OTk5LzYwMDM2L25vcm1hLmh0bQorIyA8L2E+CisjIFRoZSBuZXcgb25lIGlzIGxhdyBbTnVtYmVyXSAyNi4zNTAKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzEzNTAwMC0xMzk5OTkvMTM2MTkxL25vcm1hLmh0bSI+CisjIGh0dHA6Ly93d3cuaW5mb2xlZy5nb3YuYXIvaW5mb2xlZ0ludGVybmV0L2FuZXhvcy8xMzUwMDAtMTM5OTk5LzEzNjE5MS9ub3JtYS5odG0KKyMgPC9hPgorIyBTbyB0aGVyZSBpcyBubyBzdW1tZXIgdGltZSBpbiBBcmdlbnRpbmEgZm9yIG5vdy4KKworIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA4LTEwLTIwKToKKyMgRGVjcmVlIDE2OTMvMjAwOCBhcHBsaWVzIExhdyAyNi4zNTAgZm9yIHRoZSBzdW1tZXIgMjAwOC8yMDA5IGVzdGFibGlzaGluZyBEU1QgaW4gQXJnZW50aW5hCisjIEZyb20gMjAwOC0xMC0xOSB1bnRpbCAyMDA5LTAzLTE1CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9sZXRpbm9maWNpYWwuZ292LmFyL0JvcmEuUG9ydGFsL0N1c3RvbUNvbnRyb2xzL1BkZkNvbnRlbnQuYXNweD9mcD0xNjEwMjAwOCZwaT0zJnBmPTQmcz0wJnNlYz0wMSI+CisjIGh0dHA6Ly93d3cuYm9sZXRpbm9maWNpYWwuZ292LmFyL0JvcmEuUG9ydGFsL0N1c3RvbUNvbnRyb2xzL1BkZkNvbnRlbnQuYXNweD9mcD0xNjEwMjAwOCZwaT0zJnBmPTQmcz0wJnNlYz0wMQorIyA8L2E+CisjCisjIERlY3JlZSAxNzA1LzIwMDggZXhjZXB0aW5nIDEyIFByb3ZpbmNlcyBmcm9tIGFwcGx5aW5nIERTVCBpbiB0aGUgc3VtbWVyIDIwMDgvMjAwOToKKyMgQ2F0YW1hcmNhLCBMYSBSaW9qYSwgTWVuZG96YSwgU2FsdGEsIFNhbiBKdWFuLCBTYW4gTHVpcywgTGEgUGFtcGEsIE5ldXF1ZW4sIFJpbyBOZWdybywgQ2h1YnV0LCBTYW50YSBDcnV6CisjIGFuZCBUaWVycmEgZGVsIEZ1ZWdvCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9sZXRpbm9maWNpYWwuZ292LmFyL0JvcmEuUG9ydGFsL0N1c3RvbUNvbnRyb2xzL1BkZkNvbnRlbnQuYXNweD9mcD0xNzEwMjAwOCZwaT0xJnBmPTEmcz0wJnNlYz0wMSI+CisjIGh0dHA6Ly93d3cuYm9sZXRpbm9maWNpYWwuZ292LmFyL0JvcmEuUG9ydGFsL0N1c3RvbUNvbnRyb2xzL1BkZkNvbnRlbnQuYXNweD9mcD0xNzEwMjAwOCZwaT0xJnBmPTEmcz0wJnNlYz0wMQorIyA8L2E+CisjCisjIFByZXNzIHJlbGVhc2UgMjM1IGRhdGVkIFNhdHVyZGF5IE9jdG9iZXIgMTh0aCwgZnJvbSB0aGUgR292ZXJubWVudCBvZiB0aGUgUHJvdmluY2Ugb2YgSnVqdXkgc2F5aW5nCisjIGl0IHdpbGwgbm90IGFwcGx5IERTVCBlaXRoZXIgKGV2ZW4gd2hlbiBpdCB3YXMgbm90IGluY2x1ZGVkIGluIERlY3JlZSAxNzA1LzIwMDgpCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVqdXkuZ292LmFyL2luZGV4Mi9wYXJ0ZXNfcHJlbnNhLzE4XzEwXzA4LzIzNS0xODEwMDguZG9jIj4KKyMgaHR0cDovL3d3dy5qdWp1eS5nb3YuYXIvaW5kZXgyL3BhcnRlc19wcmVuc2EvMThfMTBfMDgvMjM1LTE4MTAwOC5kb2MKKyMgPC9hPgorCisjIEZyb20gZnVsbGluZXQgKDIwMDktMTAtMTgpOgorIyBBcyBhbm5vdW5jZWQgaW4KKyMgPGEgaGVmPSJodHRwOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvYXJnZW50aW5hL3BvcnRhbC9wYWdpbmFzLmRodG1sP3BhZ2luYT0zNTYiPgorIyBodHRwOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvYXJnZW50aW5hL3BvcnRhbC9wYWdpbmFzLmRodG1sP3BhZ2luYT0zNTYKKyMgPC9hPgorIyAoYW4gb2ZmaWNpYWwgLmdvYi5hcikgdW5kZXIgdGl0bGU6ICJTaW4gQ2FtYmlvIGRlIEhvcmEiIChlbmdsaXNoOiAiTm8gaG91ciBjaGFuZ2UiKQorIworIyAiUG9yIGVsIG1vbWVudG8sIGVsIEdvYmllcm5vIE5hY2lvbmFsIHJlc29sdmlvIG5vIG1vZGlmaWNhciBsYSBob3JhCisjIG9maWNpYWwsIGRlY2lzaW9uIHF1ZSBlc3RhYmEgZW4gZXN0dWRpbyBwYXJhIHN1IGltcGxlbWVudGFjaW9uIGVsCisjIGRvbWluZ28gMTggZGUgb2N0dWJyZS4gRGVzZGUgZWwgTWluaXN0ZXJpbyBkZSBQbGFuaWZpY2FjaW9uIHNlIGFudW5jaW8KKyMgcXVlIGxhIEFyZ2VudGluYSBob3ksIGVuIGVzdGFzIGNvbmRpY2lvbmVzIG1ldGVvcm9sb2dpY2FzLCBubyBuZWNlc2l0YQorIyBsYSBtb2RpZmljYWNpb24gZGVsIGh1c28gaG9yYXJpbywgeWEgcXVlIDIwMDkgbm9zIGVuY3VlbnRyYSBjb24KKyMgY3JlY2ltaWVudG8gZW4gbGEgcHJvZHVjY2lvbiB5IGRpc3RyaWJ1Y2lvbiBlbmVyZ2V0aWNhLiIKKworUnVsZQlBcmcJMjAwNwlvbmx5CS0JRGVjCTMwCTA6MDAJMTowMAlTCitSdWxlCUFyZwkyMDA4CTIwMDkJLQlNYXIJU3VuPj0xNQkwOjAwCTAJLQorUnVsZQlBcmcJMjAwOAlvbmx5CS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKKyAKKyMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwNC0wNS0yMSk6CisjIFRvZGF5IGl0IHdhcyBvZmZpY2lhbGx5IHB1Ymxpc2hlZCB0aGF0IHRoZSBQcm92aW5jZSBvZiBNZW5kb3phIGlzIGNoYW5naW5nCisjIGl0cyB0aW1lem9uZSB0aGlzIHdpbnRlci4uLiBzdGFydGluZyB0b21vcnJvdyBuaWdodC4uLi4KKyMgaHR0cDovL3d3dy5nb2Jlcm5hYy5tZW5kb3phLmdvdi5hci9ib2xldGluL3BkZi8yMDA0MDUyMS0yNzE1OC1ub3JtYXMucGRmCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDQtMDUtMjQpOgorIyBJdCdzIExhdyBOby4gNywyMTAuICBUaGlzIGNoYW5nZSBpcyBkdWUgdG8gYSBwdWJsaWMgcG93ZXIgZW1lcmdlbmN5LCBzbyBmb3IKKyMgbm93IHdlJ2xsIGFzc3VtZSBpdCdzIGZvciB0aGlzIHllYXIgb25seS4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3BpY2FzYy5uZXQvaG9ydmVyYS5odG1sIj4KKyMgSG9yYSBkZSB2ZXJhbm8gcGFyYSBsYSBSZXB1YmxpY2EgQXJnZW50aW5hICgyMDAzLTA2LTA4KQorIyA8L2E+IHNheXMgdGhhdCBzdGFuZGFyZCB0aW1lIGluIEFyZ2VudGluYSBmcm9tIDE4OTQtMTAtMzEKKyMgdG8gMTkyMC0wNS0wMSB3YXMgLTQ6MTY6NDguMjUuICBHbyB3aXRoIHRoaXMgbW9yZS1wcmVjaXNlIHZhbHVlCisjIG92ZXIgU2hhbmtzICYgUG90dGVuZ2VyLgorIworIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA2LTA1KToKKyMgVGhlc2UgbWVkaWEgYXJ0aWNsZXMgZnJvbSBhIG1ham9yIG5ld3NwYXBlciBtb3N0bHkgY292ZXIgdGhlIGN1cnJlbnQgc3RhdGU6CisjIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyLzA0LzA1LzI3L2RlXzYwNDgyNS5hc3AKKyMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvMDQvMDUvMjgvZGVfNjA1MjAzLmFzcAorIworIyBUaGUgZm9sbG93aW5nIGVpZ2h0ICg4KSBwcm92aW5jZXMgcHVsbGVkIGNsb2NrcyBiYWNrIHRvIFVUQy0wNDowMCBhdAorIyBtaWRuaWdodCBNb25kYXkgTWF5IDMxc3QuICh0aGF0IGlzLCB0aGUgbmlnaHQgYmV0d2VlbiAwNS8zMSBhbmQgMDYvMDEpLgorIyBBcHBhcmVudGx5LCBhbGwgbmluZSBwcm92aW5jZXMgd291bGQgZ28gYmFjayB0byBVVEMtMDM6MDAgYXQgdGhlIHNhbWUKKyMgdGltZSBpbiBPY3RvYmVyIDE3dGguCisjCisjIENhdGFtYXJjYSwgQ2h1YnV0LCBMYSBSaW9qYSwgU2FuIEp1YW4sIFNhbiBMdWlzLCBTYW50YSBDcnV6LAorIyBUaWVycmEgZGVsIEZ1ZWdvLCBUdWN1bWFuLgorIworIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA2LTE0KToKKyMgLi4uIHRoaXMgd2Vla2VuZCwgdGhlIFByb3ZpbmNlIG9mIFR1Y3VtYW4gZGVjaWRlZCBpdCdkIGdvIGJhY2sgdG8gVVRDLTAzOjAwCisjIHllc3RlcmRheSBtaWRuaWdodCAodGhhdCBpcywgYXQgMjQ6MDAgU2F0dXJkYXkgMTJ0aCksIHNpbmNlIHRoZSBwZW9wbGUncworIyBhbm5veWFuY2Ugd2l0aCB0aGUgY2hhbmdlIGlzIG11Y2ggaGlnaGVyIHRoYW4gdGhlIHBvd2VyIHNhdmluZ3Mgb2J0YWluZWQuLi4uCisjCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDQtMDYtMTQpOgorIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci8wNC8wNi8xMC9kZV82MDkwNzguYXNwIC4uLgorIyAgICAgIlRoZSB0aW1lIGNoYW5nZSBpbiBUaWVycmEgZGVsIEZ1ZWdvIHdhcyBhIGNvbmZsaWN0ZWQgZGVjaXNpb24gZnJvbQorIyAgIHRoZSBzdGFydC4gIFRoZSBnb3Zlcm5tZW50IGhhZCBkZWNyZWVkIHRoYXQgdGhlIG1lYXN1cmUgd291bGQgdGFrZQorIyAgIGVmZmVjdCBvbiBKdW5lIDEsIGJ1dCBhIG5vcm1hdGl2ZSBlcnJvciBmb3JjZWQgdGhlIG5ldyB0aW1lIHRvIGJlZ2luCisjICAgdGhyZWUgZGF5cyBlYXJsaWVyLCBmcm9tIGEgU2F0dXJkYXkgdG8gYSBTdW5kYXkuLi4uCisjIE91ciB1bmRlcnN0YW5kaW5nIHdhcyB0aGF0IHRoZSBjaGFuZ2Ugd2FzIG9yaWdpbmFsbHkgc2NoZWR1bGVkIHRvIHRha2UgcGxhY2UKKyMgb24gSnVuZSAxIGF0IDAwOjAwIGluIENodWJ1dCwgU2FudGEgQ3J1eiwgVGllcnJhIGRlbCBGdWVnbyAoYW5kIHNvbWUgb3RoZXIKKyMgcHJvdmluY2VzKS4gIFN1bmRheSB3YXMgTWF5IDMwLCBvbmx5IHR3byBkYXlzIGVhcmxpZXIuICBTbyB0aGUgYXJ0aWNsZQorIyBjb250YWlucyBhIGNvbnRyYWRpY3Rpb24uICBJIHdvdWxkIGdpdmUgbW9yZSBjcmVkZW5jZSB0byB0aGUgU2F0dXJkYXkvU3VuZGF5CisjIGRhdGUgdGhhbiB0aGUgInRocmVlIGRheXMgZWFybGllciIgcGhyYXNlLCBhbmQgY29uY2x1ZGUgdGhhdCBUaWVycmEgZGVsCisjIEZ1ZWdvIHNldCBpdHMgY2xvY2tzIGJhY2sgYXQgMjAwNC0wNS0zMCAwMDowMC4KKyMKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDQtMTAtMDUpOgorIyBUaGUgcHJldmlvdXMgbGF3IDcyMTAgd2hpY2ggY2hhbmdlZCB0aGUgcHJvdmluY2Ugb2YgTWVuZG96YSdzIHRpbWUgem9uZQorIyBiYWNrIGluIE1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgaW4gYSBuZXcgbGF3IDcyNzcsIHdoaWNoIHNldCB0aGUKKyMgbmV3IGVuZCBkYXRlIHRvIDIwMDQtMDktMjYgKG9yaWdpbmFsIGRhdGUgd2FzIDIwMDQtMTAtMTcpLgorIyBodHRwOi8vd3d3LmdvYmVybmFjLm1lbmRvemEuZ292LmFyL2JvbGV0aW4vcGRmLzIwMDQwOTI0LTI3MjQ0LW5vcm1hcy5wZGYKKyMKKyMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwNC0xMC0wNSk6CisjIFNhbiBKdWFuIGNoYW5nZWQgZnJvbSBVVEMtMDM6MDAgdG8gVVRDLTA0OjAwIGF0IG1pZG5pZ2h0IGJldHdlZW4KKyMgU3VuZGF5LCBNYXkgMzB0aCBhbmQgTW9uZGF5LCBNYXkgMzFzdC4gIEl0IGNoYW5nZWQgYmFjayB0byBVVEMtMDM6MDAKKyMgYXQgbWlkbmlnaHQgYmV0d2VlbiBTYXR1cmRheSwgSnVseSAyNHRoIGFuZCBTdW5kYXksIEp1bHkgMjV0aC4uLi4KKyMgaHR0cDovL3d3dy5zYW5qdWFuLmdvdi5hci9wcmVuc2EvYXJjaGl2by8wMDAzMjkuaHRtbAorIyBodHRwOi8vd3d3LnNhbmp1YW4uZ292LmFyL3ByZW5zYS9hcmNoaXZvLzAwMDQyNi5odG1sCisjIGh0dHA6Ly93d3cuc2FuanVhbi5nb3YuYXIvcHJlbnNhL2FyY2hpdm8vMDAwNDQxLmh0bWwKKworIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDEtMTcpOgorIyBIZXJlIGFyZSBhcnRpY2xlcyB0aGF0IEFyZ2VudGluYSBQcm92aW5jZSBTYW4gTHVpcyBpcyBwbGFubmluZyB0byBlbmQgRFNUCisjIGFzIGVhcmxpZXIgYXMgdXBjb21pbmcgTW9uZGF5IEphbnVhcnkgMjEsIDIwMDggb3IgRmVicnVhcnkgMjAwODoKKyMKKyMgUHJvdmluY2lhIGFyZ2VudGluYSByZXRyYXNhIHJlbG9qIHkgbWFyY2EgZGlmZXJlbmNpYSBjb24gcmVzdG8gZGVsIHBhaXMKKyMgKEFyZ2VudGluZSBQcm92aW5jZSBkZWxheWVkIGNsb2NrIGFuZCBtYXJrIGRpZmZlcmVuY2Ugd2l0aCB0aGUgcmVzdCBvZiB0aGUKKyMgY291bnRyeSkKKyMgPGEgaHJlZj0iaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsIj4KKyMgaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsCisjIDwvYT4KKyMKKyMgRXMgaW5taW5lbnRlIHF1ZSBlbiBTYW4gTHVpcyBhdHJhc2VuIHVuYSBob3JhIGxvcyByZWxvamVzCisjIChJdCBpcyBpbW1pbmVudCBpbiBTYW4gTHVpcyBjbG9ja3Mgb25lIGhvdXIgZGVsYXkpCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNCI+CisjIGh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNAorIyA8L2E+CisjCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbAorIyA8L2E+CisKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMTgpOgorIyBUaGUgcGFnZSBvZiB0aGUgU2FuIEx1aXMgcHJvdmluY2lhbCBnb3Zlcm5tZW50CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMiI+CisjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMgorIyA8L2E+CisjIGNvbmZpcm1zIHdoYXQgQWxleCBLcml2ZW55c2hldiBoYXMgZWFybGllciBzZW50IHRvIHRoZSB0egorIyBlbWFpbGluZyBsaXN0IGFib3V0IHRoYXQgU2FuIEx1aXMgcGxhbnMgdG8gcmV0dXJuIHRvIHN0YW5kYXJkCisjIHRpbWUgbXVjaCBlYXJsaWVyIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkuIEl0IGFsc28KKyMgY29uZmlybXMgdGhhdCB1cG9uIHJlcXVlc3QgdGhlIHByb3ZpbmNlcyBTYW4gSnVhbiBhbmQgTWVuZG96YSAKKyMgcmVmdXNlZCB0byBmb2xsb3cgU2FuIEx1aXMgaW4gdGhpcyBjaGFuZ2UuIAorIyAKKyMgVGhlIGNoYW5nZSBpcyBzdXBwb3NlZCB0byB0YWtlIHBsYWNlIE1vbmRheSB0aGUgMjEuc3QgYXQgMDowMAorIyBob3Vycy4gQXMgZmFyIGFzIEkgdW5kZXJzdGFuZCBpdCBpZiB0aGlzIGdvZXMgYWhlYWQsIHdlIG5lZWQKKyMgYSBuZXcgdGltZXpvbmUgZm9yIFNhbiBMdWlzIChhbHRob3VnaCB0aGVyZSBhcmUgYWxzbyBkb2N1bWVudGVkCisjIGluZGVwZW5kZW50IGNoYW5nZXMgaW4gdGhlIHNvdXRoYW1lcmljYSBmaWxlIG9mIFNhbiBMdWlzIGluCisjIDE5OTAgYW5kIDE5OTEgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbmZpcm1lZCkuCisKKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMjUpOgorIyBVbmZvcnR1bmF0ZWx5IHRoZSBiZWxvdyBwYWdlIGhhcyBiZWNvbWUgZGVmdW5jdCwgYWJvdXQgdGhlIFNhbiBMdWlzCisjIHRpbWUgY2hhbmdlLiBQZXJoYXBzIGJlY2F1c2UgaXQgbm93IGlzIHBhcnQgb2YgYSBncm91cCBvZiBwYWdlcyAiTW9zdAorIyBpbXBvcnRhbnQgcGFnZXMgb2YgMjAwOC4iCisjCisjIFlvdSBjYW4gdXNlCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNCI+CisjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNAorIyA8L2E+CisjIGluc3RlYWQgaXQgc2VlbXMuIE9yIHVzZSAiQnVzY2Fkb3IiIGZyb20gdGhlIG1haW4gcGFnZSBvZiB0aGUgU2FuIEx1aXMKKyMgZ292ZXJubWVudCwgYW5kIGZpbGwgaW4gImh1c28iIGFuZCBjbGljayBPSywgYW5kIHlvdSB3aWxsIGdldCAzIHBhZ2VzCisjIGZyb20gd2hpY2ggdGhlIGZpcnN0IG9uZSBpcyBpZGVudGljYWwgdG8gdGhlIGFib3ZlLgorCisjIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDgtMDEtMjgpOgorIyBJIGNhbiBjb25maXJtIHRoYXQgdGhlIFByb3ZpbmNlIG9mIFNhbiBMdWlzIChhbmQgc28gZmFyIG9ubHkgdGhhdAorIyBwcm92aW5jZSkgZGVjaWRlZCB0byBnbyBiYWNrIHRvIFVUQy0zIGVmZmVjdGl2ZSBtaWRuaWdodCBKYW4gMjB0aCAyMDA4CisjICh0aGF0IGlzLCBNb25kYXkgMjFzdCBhdCAwOjAwIGlzIHRoZSB0aW1lIHRoZSBjbG9ja3Mgd2VyZSBkZWxheWVkIGJhY2sKKyMgMSBob3VyKSwgYW5kIHRoZXkgaW50ZW5kIHRvIGtlZXAgVVRDLTMgYXMgdGhlaXIgdGltZXpvbmUgYWxsIHllYXIgcm91bmQKKyMgKHRoYXQgaXMsIHVubGVzcyB0aGV5IGNoYW5nZSB0aGVpciBtaW5kIGFueSBtaW51dGUgbm93KS4KKyMKKyMgU28gd2UnbGwgaGF2ZSB0byBhZGQgeWV0IGFub3RoZXIgY2l0eSB0byAnc291dGhhbWVyaWNhJyAoSSB0aGluayBTYW4KKyMgTHVpcyBjaXR5IGlzIHRoZSBtb3MgcG9wdWxhdGVkIGNpdHkgaW4gdGhlIFByb3ZpbmNlLCBzbyBpdCdkIGJlCisjIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzLi4uIG9mIGNvdXJzZSBJIGNhbid0IHJlbWVtYmVyIGlmIFNhbiBMdWlzJ3MKKyMgaGlzdG9yeSBvZiBwYXJ0aWN1bGFyIGNoYW5nZXMgZ29lcyBhbG9uZyB3aXRoIE1lbmRvemEgb3IgU2FuIEp1YW4gOi0oCisjIChJIG9ubHkgcmVtZW1iZXIgbm90IGJlaW5nIGFibGUgdG8gY29sbGVjdCBoYXJkIGZhY3RzIGFib3V0IFNhbiBMdWlzCisjIGJhY2sgaW4gMjAwNCwgd2hlbiB0aGVzZSBwcm92aW5jZXMgY2hhbmdlZCB0byBVVEMtNCBmb3IgYSBmZXcgZGF5cywgSQorIyBtYWlsZWQgdGhlbSBwZXJzb25hbGx5IGFuZCBuZXZlciBnb3QgYW4gYW5zd2VyKS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTA2LTMwKToKKyMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGRhdGEgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5MiwKKyMgZnJvbSB0aGUgSUFUQSBvdGhlcndpc2UuICBBcyBub3RlZCBiZWxvdywgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0CisjIEFtZXJpY2EvQ29yZG9iYSBzcGxpdCBpbnRvIDYgc3VicmVnaW9ucyBkdXJpbmcgMTk5MS8xOTkyLCBvbmUgb2Ygd2hpY2gKKyMgd2FzIEFtZXJpY2EvU2FuX0x1aXMsIGJ1dCB3ZSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgeWV0IHNvIGZvciBub3cgd2UnbGwKKyMga2VlcCBBbWVyaWNhL0NvcmRvYmEgYSBzaW5nbGUgcmVnaW9uIHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdCBpbnRvIHRoZQorIyBvdGhlciA1IHN1YnJlZ2lvbnMuCisKKyMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwOS0wMy0xMyk6CisjIFllc3RlcmRheSAod2l0aCBvdXIgdXN1YWwgMi1kYXkgbm90aWNlKSB0aGUgUHJvdmluY2Ugb2YgU2FuIEx1aXMKKyMgZGVjaWRlZCB0aGF0IG5leHQgU3VuZGF5IGluc3RlYWQgb2YgInN0YXlpbmciIEB1dGMtMDM6MDAgdGhleSB3aWxsIGdvCisjIHRvIHV0Yy0wNDowMCB1bnRpbCB0aGUgc2Vjb25kIFNhdHVyZGF5IGluIE9jdG9iZXIuLi4KKyMKKyMgVGhlIHByZXNzIHJlbGVhc2UgaXMgYXQKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9TTC9QYWdpbmFzL05vdGljaWFEZXRhbGxlLmFzcD9UZW1hSWQ9MSZJbmZvUHJlbnNhSWQ9MzEwMiI+CisjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvU0wvUGFnaW5hcy9Ob3RpY2lhRGV0YWxsZS5hc3A/VGVtYUlkPTEmSW5mb1ByZW5zYUlkPTMxMDIKKyMgPC9hPgorIyAoSSBjb3VsZG4ndCBmaW5kIHRoZSBkZWNyZWUsIGJ1dAorIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyIj4KKyMgd3d3LnNhbmx1aXMuZ292LmFyCisjIDxhLz4KKyMgaXMgdGhlIG9mZmljaWFsIHBhZ2UgZm9yIHRoZSBQcm92aW5jZSBHb3Zlcm5tZW50KS4KKyMKKyMgVGhlcmUncyBhbHNvIGEgbm90ZSBpbiBvbmx5IG9uZSBvZiB0aGUgbWFqb3IgbmF0aW9uYWwgcGFwZXJzIChMYSBOYWNp824pIGF0CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyL25vdGEuYXNwP25vdGFfaWQ9MTEwNzkxMiI+CisjIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyL25vdGEuYXNwP25vdGFfaWQ9MTEwNzkxMgorIyA8L2E+CisjIAorIyBUaGUgcHJlc3MgcmVsZWFzZSBzYXlzOgorIyAgKC4uLikgYW51bmNp8yBxdWUgZWwgcHLzeGltbyBkb21pbmdvIGEgbGFzIDAwOjAwIGxvcyBwdW50YW5vcyBkZWJlcuFuCisjIGF0cmFzYXIgdW5hIGhvcmEgc3VzIHJlbG9qZXMuCisjCisjIEEgcGFydGlyIGRlIGVudG9uY2VzLCBTYW4gTHVpcyBlc3RhYmxlY2Vy4SBlbCBodXNvIGhvcmFyaW8gcHJvcGlvIGRlCisjIGxhIFByb3ZpbmNpYS4gRGUgZXN0YSBtYW5lcmEsIGR1cmFudGUgZWwgcGVyaW9kbyBkZWwgY2FsZW5kYXJpbyBhbnVhbAorIyAyMDA5LCBlbCBjYW1iaW8gaG9yYXJpbyBxdWVkYXLhIGNvbXByZW5kaWRvIGVudHJlIGxhcyAwMDowMCBkZWwgdGVyY2VyCisjIGRvbWluZ28gZGUgbWFyem8geSBsYXMgMjQ6MDAgZGVsIHNlZ3VuZG8gc+FiYWRvIGRlIG9jdHVicmUuCisjIFF1aWNrJmRpcnR5IHRyYW5zbGF0aW9uCisjICguLi4pIGFubm91bmNlZCB0aGF0IG5leHQgU3VuZGF5LCBhdCAwMDowMCwgUHVudGFub3MgKHRoZSBTYW4gTHVpcworIyBpbmhhYml0YW50cykgd2lsbCBoYXZlIHRvIHR1cm4gYmFjayBvbmUgaG91ciB0aGVpciBjbG9ja3MKKyMKKyMgU2luY2UgdGhlbiwgU2FuIEx1aXMgd2lsbCBlc3RhYmxpc2ggaXRzIG93biBQcm92aW5jZSB0aW1lem9uZS4gVGh1cywKKyMgZHVyaW5nIDIwMDksIHRoaXMgdGltZXpvbmUgY2hhbmdlIHdpbGwgcnVuIGZyb20gMDA6MDAgdGhlIHRoaXJkIFN1bmRheQorIyBpbiBNYXJjaCB1bnRpbCAyNDowMCBvZiB0aGUgc2Vjb25kIFNhdHVyZGF5IGluIE9jdG9iZXIuCisKKyMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwOS0xMC0xNik6CisjIC4uLnRoZSBQcm92aW5jZSBvZiBTYW4gTHVpcyBpcyBhIGNhc2UgaW4gaXRzZWxmLgorIworIyBUaGUgTGF3IGF0CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGlwdXRhZG9zc2FubHVpcy5nb3YuYXIvZGlwdXRhZG9zYXNwL3BhZ2luYXMvdmVyTm9ybWEuYXNwP05vcm1hSUQ9Mjc2PiIKKyMgaHR0cDovL3d3dy5kaXB1dGFkb3NzYW5sdWlzLmdvdi5hci9kaXB1dGFkb3Nhc3AvcGFnaW5hcy92ZXJOb3JtYS5hc3A/Tm9ybWFJRD0yNzYKKyMgPC9hPgorIyBpcyBhbWJpZ3VvdXMgYmVjYXVzZSBlc3RhYmxpc2hlcyBhIGNhbGVuZGFyIGZyb20gdGhlIDJuZCBTdW5kYXkgaW4KKyMgT2N0b2JlciBhdCAwOjAwIHRocnUgdGhlIDJuZCBTYXR1cmRheSBpbiBNYXJjaCBhdCAyNDowMCBhbmQgdGhlCisjIGNvbXBsZW1lbnQgb2YgdGhhdCBzdGFydGluZyBvbiB0aGUgMm5kIFN1bmRheSBvZiBNYXJjaCBhdCAwOjAwIGFuZAorIyBlbmRpbmcgb24gdGhlIDJuZCBTYXR1cmRheSBvZiBNYXJjaCBhdCAyNDowMC4KKyMKKyMgVGhpcyBjbGVhcmx5IGJyZWFrcyBldmVyeSB0aW1lIHRoZSAxc3Qgb2YgTWFyY2ggb3IgT2N0b2JlciBpcyBhIFN1bmRheS4KKyMKKyMgSU1ITywgdGhlICJzcGlyaXQgb2YgdGhlIExhdyIgaXMgdG8gbWFrZSB0aGUgY2hhbmdlcyBhdCAwOjAwIG9uIHRoZSAybmQKKyMgU3VuZGF5IG9mIE9jdG9iZXIgYW5kIE1hcmNoLgorIworIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBjaGFuZ2VzIGluIHRoZSByZXN0IG9mIHRoZSBQcm92aW5jZXMgdGhhdCBkaWQKKyMgY2hhbmdlIGluIDIwMDcvMjAwOCwgd2VyZSBtYWRlIGFjY29yZGluZyB0byB0aGUgRmVkZXJhbCBMYXcgYW5kIERlY3JlZXMKKyMgdGhhdCBkaWQgc28gb24gdGhlIDNyZCBTdW5kYXkgb2YgT2N0b2JlciBhbmQgTWFyY2guCisjCisjIEluIGZhY3QsIFNhbiBMdWlzIGFjdHVhbGx5IHN3aXRjaGVkIGZyb20gVVRDLTQgdG8gVVRDLTMgbGFzdCBTdW5kYXkKKyMgKE9jdG9iZXIgMTF0aCkgYXQgMDowMC4KKyMKKyMgU28gSSBndWVzcyBhIG5ldyBzZXQgb2YgcnVsZXMsIGJlc2lkZXMgIkFyZyIsIG11c3QgYmUgbWFkZSBhbmQgdGhlIGxhc3QKKyMgQW1lcmljYS9BcmdlbnRpbmEvU2FuX0x1aXMgZW50cmllcyBzaG91bGQgY2hhbmdlIHRvIHVzZSB0aGVzZS4uLgorIworIyBJJ20gZW5jbG9zaW5nIGEgcGF0Y2ggdGhhdCBkb2VzIHdoYXQgSSBzYXkuLi4gcmVncmV0ZnVsbHksIHRoZSBTYW4gTHVpcworIyB0aW1lem9uZSBtdXN0IGJlIGNhbGxlZCAiV0FSVC9XQVJTVCIgZXZlbiB3aGVuIG1vc3Qgb2YgdGhlIHRpbWUgKGxpa2UsCisjIHJpZ2h0IG5vdykgV0FSU1QgPT0gQVJULi4uIHRoYXQgaXMsIHNpbmNlIGxhc3QgU3VuZGF5LCBhbGwgdGhlIGNvdW50cnkKKyMgaXMgdXNpbmcgVVRDLTMsIGJ1dCBpbiBteSBwYXRjaCwgU2FuIEx1aXMgY2FsbHMgaXQgIldBUlNUIiBhbmQgdGhlIHJlc3QKKyMgb2YgdGhlIGNvdW50cnkgY2FsbHMgaXQgIkFSVCIuCisjIC4uLgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCisjCisjIEJ1ZW5vcyBBaXJlcyAoQkEpLCBDYXBpdGFsIEZlZGVyYWwgKENGKSwKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzIC0zOjUzOjQ4IC0gTE1UIDE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAjIENvcmRvYmEgTWVhbiBUaW1lCisJCQktNDowMAktCUFSVAkxOTMwIERlYworCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1CisJCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKKwkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMworCQkJLTM6MDAJQXJnCUFSJXNUCisjCisjIENvcmRvYmEgKENCKSwgU2FudGEgRmUgKFNGKSwgRW50cmUgUmlvcyAoRVIpLCBDb3JyaWVudGVzIChDTiksIE1pc2lvbmVzIChNTiksCisjIENoYWNvIChDQyksIEZvcm1vc2EgKEZNKSwgU2FudGlhZ28gZGVsIEVzdGVybyAoU0UpCisjCisjIFNoYW5rcyAmIFBvdHRlbmdlciBhbHNvIG1ha2UgdGhlIGZvbGxvd2luZyBjbGFpbXMsIHdoaWNoIHdlIGhhdmVuJ3QgdmVyaWZpZWQ6CisjIC0gRm9ybW9zYSBzd2l0Y2hlZCB0byAtMzowMCBvbiAxOTkxLTAxLTA3LgorIyAtIE1pc2lvbmVzIHN3aXRjaGVkIHRvIC0zOjAwIG9uIDE5OTAtMTItMjkuCisjIC0gQ2hhY28gc3dpdGNoZWQgdG8gLTM6MDAgb24gMTk5MS0wMS0wNC4KKyMgLSBTYW50aWFnbyBkZWwgRXN0ZXJvIHN3aXRjaGVkIHRvIC00OjAwIG9uIDE5OTEtMDQtMDEsCisjICAgdGhlbiB0byAtMzowMCBvbiAxOTkxLTA0LTI2LgorIworWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9Db3Jkb2JhIC00OjE2OjQ4IC0gTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQorCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKKwkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQorCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTEgTWFyICAzCisJCQktNDowMAktCVdBUlQJMTk5MSBPY3QgMjAKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMworCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCisJCQktMzowMAlBcmcJQVIlc1QKKyMKKyMgU2FsdGEgKFNBKSwgTGEgUGFtcGEgKExQKSwgTmV1cXVlbiAoTlEpLCBSaW8gTmVncm8gKFJOKQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9TYWx0YSAtNDoyMTo0MCAtIExNVAkxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKKwkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCisJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTkxIE1hciAgMworCQkJLTQ6MDAJLQlXQVJUCTE5OTEgT2N0IDIwCisJCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKKwkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMworCQkJLTM6MDAJQXJnCUFSJXNUCTIwMDggT2N0IDE4CisJCQktMzowMAktCUFSVAorIworIyBUdWN1bWFuIChUTSkKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hbiAtNDoyMDo1MiAtIExNVAkxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKKwkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCisJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTkxIE1hciAgMworCQkJLTQ6MDAJLQlXQVJUCTE5OTEgT2N0IDIwCisJCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKKwkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMworCQkJLTM6MDAJLQlBUlQJMjAwNCBKdW4gIDEKKwkJCS00OjAwCS0JV0FSVAkyMDA0IEp1biAxMworCQkJLTM6MDAJQXJnCUFSJXNUCisjCisjIExhIFJpb2phIChMUikKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvTGFfUmlvamEgLTQ6Mjc6MjQgLSBMTVQJMTg5NCBPY3QgMzEKKwkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5CisJCQktNDowMAktCUFSVAkxOTMwIERlYworCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1CisJCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDEKKwkJCS00OjAwCS0JV0FSVAkxOTkxIE1heSAgNworCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCisJCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKKwkJCS0zOjAwCS0JQVJUCTIwMDQgSnVuICAxCisJCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKKwkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAorCQkJLTM6MDAJLQlBUlQKKyMKKyMgU2FuIEp1YW4gKFNKKQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9TYW5fSnVhbiAtNDozNDowNCAtIExNVAkxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKKwkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCisJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTkxIE1hciAgMQorCQkJLTQ6MDAJLQlXQVJUCTE5OTEgTWF5ICA3CisJCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKKwkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMworCQkJLTM6MDAJLQlBUlQJMjAwNCBNYXkgMzEKKwkJCS00OjAwCS0JV0FSVAkyMDA0IEp1bCAyNQorCQkJLTM6MDAJQXJnCUFSJXNUCTIwMDggT2N0IDE4CisJCQktMzowMAktCUFSVAorIworIyBKdWp1eSAoSlkpCitab25lIEFtZXJpY2EvQXJnZW50aW5hL0p1anV5IC00OjIxOjEyIC0JTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQorCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKKwkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQorCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTAgTWFyICA0CisJCQktNDowMAktCVdBUlQJMTk5MCBPY3QgMjgKKwkJCS00OjAwCTE6MDAJV0FSU1QJMTk5MSBNYXIgMTcKKwkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAgNgorCQkJLTM6MDAJMTowMAlBUlNUCTE5OTIKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMworCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCisJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKKwkJCS0zOjAwCS0JQVJUCisjCisjIENhdGFtYXJjYSAoQ1QpLCBDaHVidXQgKENIKQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EgLTQ6MjM6MDggLSBMTVQJMTg5NCBPY3QgMzEKKwkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5CisJCQktNDowMAktCUFSVAkxOTMwIERlYworCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1CisJCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDMKKwkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAyMAorCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCisJCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKKwkJCS0zOjAwCS0JQVJUCTIwMDQgSnVuICAxCisJCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKKwkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAorCQkJLTM6MDAJLQlBUlQKKyMKKyMgTWVuZG96YSAoTVopCitab25lIEFtZXJpY2EvQXJnZW50aW5hL01lbmRvemEgLTQ6MzU6MTYgLSBMTVQJMTg5NCBPY3QgMzEKKwkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5CisJCQktNDowMAktCUFSVAkxOTMwIERlYworCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1CisJCQktMzowMAlBcmcJQVIlc1QJMTk5MCBNYXIgIDQKKwkJCS00OjAwCS0JV0FSVAkxOTkwIE9jdCAxNQorCQkJLTQ6MDAJMTowMAlXQVJTVAkxOTkxIE1hciAgMQorCQkJLTQ6MDAJLQlXQVJUCTE5OTEgT2N0IDE1CisJCQktNDowMAkxOjAwCVdBUlNUCTE5OTIgTWFyICAxCisJCQktNDowMAktCVdBUlQJMTk5MiBPY3QgMTgKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMworCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCisJCQktMzowMAktCUFSVAkyMDA0IE1heSAyMworCQkJLTQ6MDAJLQlXQVJUCTIwMDQgU2VwIDI2CisJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKKwkJCS0zOjAwCS0JQVJUCisjCisjIFNhbiBMdWlzIChTTCkKKworUnVsZQlTYW5MdWlzCTIwMDgJbWF4CS0JTWFyCVN1bj49OAkwOjAwCTAJLQorUnVsZQlTYW5MdWlzCTIwMDcJbWF4CS0JT2N0CVN1bj49OAkwOjAwCTE6MDAJUworCitab25lIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzIC00OjI1OjI0IC0gTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQorCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKKwkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQorCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTAKKwkJCS0zOjAwCTE6MDAJQVJTVAkxOTkwIE1hciAxNAorCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDE1CisJCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyICAxCisJCQktNDowMAktCVdBUlQJMTk5MSBKdW4gIDEKKwkJCS0zOjAwCS0JQVJUCTE5OTkgT2N0ICAzCisJCQktNDowMAkxOjAwCVdBUlNUCTIwMDAgTWFyICAzCisJCQktMzowMAktCUFSVAkyMDA0IE1heSAzMQorCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVsIDI1CisJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBKYW4gMjEKKwkJCS00OjAwCVNhbkx1aXMJV0FSJXNUCisjCisjIFNhbnRhIENydXogKFNDKQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MgLTQ6MzY6NTIgLSBMTVQgMTg5NCBPY3QgMzEKKwkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKKwkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCisJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKKwkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMworCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCisJCQktMzowMAktCUFSVAkyMDA0IEp1biAgMQorCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVuIDIwCisJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKKwkJCS0zOjAwCS0JQVJUCisjCisjIFRpZXJyYSBkZWwgRnVlZ28sIEFudGFydGlkYSBlIElzbGFzIGRlbCBBdGxhbnRpY28gU3VyIChURikKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvVXNodWFpYSAtNDozMzoxMiAtIExNVCAxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgIyBDb3Jkb2JhIE1lYW4gVGltZQorCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKKwkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQorCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCisJCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKKwkJCS0zOjAwCS0JQVJUCTIwMDQgTWF5IDMwCisJCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKKwkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAorCQkJLTM6MDAJLQlBUlQKKworIyBBcnViYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBbWVyaWNhL0FydWJhCS00OjQwOjI0IC0JTE1UCTE5MTIgRmViIDEyCSMgT3Jhbmplc3RhZAorCQkJLTQ6MzAJLQlBTlQJMTk2NSAjIE5ldGhlcmxhbmRzIEFudGlsbGVzIFRpbWUKKwkJCS00OjAwCS0JQVNUCisKKyMgQm9saXZpYQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBbWVyaWNhL0xhX1BhegktNDozMjozNiAtCUxNVAkxODkwCisJCQktNDozMjozNiAtCUNNVAkxOTMxIE9jdCAxNSAjIENhbGFtYXJjYSBNVAorCQkJLTQ6MzI6MzYgMTowMAlCT1NUCTE5MzIgTWFyIDIxICMgQm9saXZpYSBTVAorCQkJLTQ6MDAJLQlCT1QJIyBCb2xpdmlhIFRpbWUKKworIyBCcmF6aWwKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTkzLTExLTE4KToKKyMgVGhlIG1heW9yIG9mIFJpbyByZWNlbnRseSBhdHRlbXB0ZWQgdG8gY2hhbmdlIHRoZSB0aW1lIHpvbmUgcnVsZXMKKyMganVzdCBpbiBoaXMgY2l0eSwgaW4gb3JkZXIgdG8gbGVhdmUgbW9yZSBzdW1tZXIgdGltZSBmb3IgdGhlIHRvdXJpc3QgdHJhZGUuCisjIFRoZSBydWxlIGNoYW5nZSBsYXN0ZWQgb25seSBwYXJ0IG9mIHRoZSBkYXk7CisjIHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgcmVmdXNlZCB0byBmb2xsb3cgdGhlIGNpdHkncyBydWxlcywgYW5kIGJ1c2luZXNzCisjIHdhcyBpbiBhIGNoYW9zLCBzbyB0aGUgbWF5b3IgYmFja2VkIGRvd24gdGhhdCBhZnRlcm5vb24uCisKKyMgRnJvbSBJQVRBIFNTSU0gKDE5OTYtMDIpOgorIyBfT25seV8gdGhlIGZvbGxvd2luZyBzdGF0ZXMgaW4gQlIxIG9ic2VydmUgRFNUOiBSaW8gR3JhbmRlIGRvIFN1bCAoUlMpLAorIyBTYW50YSBDYXRhcmluYSAoU0MpLCBQYXJhbmEgKFBSKSwgU2FvIFBhdWxvIChTUCksIFJpbyBkZSBKYW5laXJvIChSSiksCisjIEVzcGlyaXRvIFNhbnRvIChFUyksIE1pbmFzIEdlcmFpcyAoTUcpLCBCYWhpYSAoQkEpLCBHb2lhcyAoR08pLAorIyBEaXN0cml0byBGZWRlcmFsIChERiksIFRvY2FudGlucyAoVE8pLCBTZXJnaXBlIFtTRV0gYW5kIEFsYWdvYXMgW0FMXS4KKyMgW1RoZSBsYXN0IHRocmVlIHN0YXRlcyBhcmUgbmV3IHRvIHRoaXMgaXNzdWUgb2YgdGhlIElBVEEgU1NJTS5dCisKKyMgRnJvbSBHd2lsbGltIExhdyAoMTk5Ni0xMC0wNyk6CisjIEdlb2dyYXBoeSwgaGlzdG9yeSAoVG9jYW50aW5zIHdhcyBwYXJ0IG9mIEdvaWFzIHVudGlsIDE5ODkpLCBhbmQgb3RoZXIKKyMgc291cmNlcyBvZiB0aW1lIHpvbmUgaW5mb3JtYXRpb24gbGVhZCBtZSB0byBiZWxpZXZlIHRoYXQgQUwsIFNFLCBhbmQgVE8gd2VyZQorIyBhbHdheXMgaW4gQlIxLCBhbmQgc28gdGhlIG9ubHkgY2hhbmdlIHdhcyB3aGV0aGVyIG9yIG5vdCB0aGV5IG9ic2VydmVkIERTVC4uLi4KKyMgVGhlIGVhcmxpZXN0IGlzc3VlIG9mIHRoZSBTU0lNIEkgaGF2ZSBpcyAyLzkxLiAgRWFjaCBpc3N1ZSBmcm9tIHRoZW4gdW50aWwKKyMgOS85NSBzYXlzIHRoYXQgRFNUIGlzIG9ic2VydmVkIG9ubHkgaW4gdGhlIHRlbiBzdGF0ZXMgSSBxdW90ZWQgZnJvbSA5Lzk1LAorIyBhbG9uZyB3aXRoIE1hdG8gR3Jvc3NvIChNVCkgYW5kIE1hdG8gR3Jvc3NvIGRvIFN1bCAoTVMpLCB3aGljaCBhcmUgaW4gQlIyCisjIChVVEMtNCkuLi4uICBUaGUgb3RoZXIgdHdvIHRpbWUgem9uZXMgZ2l2ZW4gZm9yIEJyYXppbCBhcmUgQlIzLCB3aGljaCBpcworIyBVVEMtNSwgbm8gRFNULCBhbmQgYXBwbGllcyBvbmx5IGluIHRoZSBzdGF0ZSBvZiBBY3JlIChBQyk7IGFuZCBCUjQsIHdoaWNoIGlzCisjIFVUQy0yLCBhbmQgYXBwbGllcyB0byBGZXJuYW5kbyBkZSBOb3JvbmhhIChmb3JtZXJseSBGTiwgYnV0IEkgYmVsaWV2ZSBpdCdzCisjIGJlY29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSBvZiBQZXJuYW1idWNvKS4gIFRoZSBib3VuZGFyeSBiZXR3ZWVuIEJSMSBhbmQgQlIyCisjIGhhcyBuZXZlciBiZWVuIGNsZWFybHkgc3RhdGVkLiAgVGhleSd2ZSBzaW1wbHkgYmVlbiBjYWxsZWQgRWFzdCBhbmQgV2VzdC4KKyMgSG93ZXZlciwgc29tZSBjb25jbHVzaW9ucyBjYW4gYmUgZHJhd24gZnJvbSBhbm90aGVyIElBVEEgbWFudWFsOiB0aGUgQWlybGluZQorIyBDb2RpbmcgRGlyZWN0b3J5LCB3aGljaCBsaXN0cyBjbG9zZSB0byA0MDAgYWlycG9ydHMgaW4gQnJhemlsLiAgRm9yIGVhY2gKKyMgYWlycG9ydCBpdCBnaXZlcyBhIHRpbWUgem9uZSB3aGljaCBpcyBjb2RlZCB0byB0aGUgU1NJTS4gIEZyb20gdGhhdAorIyBpbmZvcm1hdGlvbiwgSSdtIGxlZCB0byBjb25jbHVkZSB0aGF0IHRoZSBzdGF0ZXMgb2YgQW1hcGEgKEFQKSwgQ2VhcmEgKENFKSwKKyMgTWFyYW5oYW8gKE1BKSwgUGFyYWliYSAoUFIpLCBQZXJuYW1idWNvIChQRSksIFBpYXVpIChQSSksIGFuZCBSaW8gR3JhbmRlIGRvCisjIE5vcnRlIChSTiksIGFuZCB0aGUgZWFzdGVybiBwYXJ0IG9mIFBhcmEgKFBBKSBhcmUgYWxsIGluIEJSMSB3aXRob3V0IERTVC4KKworIyBGcm9tIE1hcmNvcyBUYWRldSAoMTk5OC0wOS0yNyk6CisjIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL3ZlcmFvMS5odG1sIj4KKyMgQnJhemlsaWFuIG9mZmljaWFsIHBhZ2UKKyMgPC9hPgorCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkICgyMDAwLTExLTAzKToKKyMgW0ZvciBhbiBvZmZpY2lhbCBsaXN0IG9mIHdoaWNoIHJlZ2lvbnMgaW4gQnJhemlsIHVzZSB3aGljaCB0aW1lIHpvbmVzLCBzZWU6XQorIyBodHRwOi8vcGNkc2gwMS5vbi5ici9GdXNici5odG0KKyMgaHR0cDovL3BjZHNoMDEub24uYnIvRnVzYnJodi5odG0KKworIyBGcm9tIENlbHNvIERvcmlhIHZpYSBEYXZpZCBNYWRlbyAoMjAwMi0xMC0wOSk6CisjIFRoZSByZWFzb24gZm9yIHRoZSBkZWxheSB0aGlzIHllYXIgaGFzIHRvIGRvIHdpdGggZWxlY3Rpb25zIGluIEJyYXppbC4KKyMKKyMgVW5saWtlIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBlbGVjdGlvbnMgaW4gQnJhemlsIGFyZSAxMDAlIGNvbXB1dGVyaXplZCBhbmQKKyMgdGhlIHJlc3VsdHMgYXJlIGtub3duIGFsbW9zdCBpbW1lZGlhdGVseS4gIFllc3RlcmRheSwgaXQgd2FzIHRoZSBmaXJzdAorIyByb3VuZCBvZiB0aGUgZWxlY3Rpb25zIHdoZW4gMTE1IG1pbGxpb24gQnJhemlsaWFucyB2b3RlZCBmb3IgUHJlc2lkZW50LAorIyBHb3Zlcm5vciwgU2VuYXRvcnMsIEZlZGVyYWwgRGVwdXRpZXMsIGFuZCBTdGF0ZSBEZXB1dGllcy4gIE5vYm9keSBpcworIyBjb3VudGluZyAob3IgcmUtY291bnRpbmcpIHZvdGVzIGFueW1vcmUgYW5kIHdlIGtub3cgdGhlcmUgd2lsbCBiZSBhIHNlY29uZAorIyByb3VuZCBmb3IgdGhlIFByZXNpZGVuY3kgYW5kIGFsc28gZm9yIHNvbWUgR292ZXJub3JzLiAgVGhlIDJuZCByb3VuZCB3aWxsCisjIHRha2UgcGxhY2Ugb24gT2N0b2JlciAyN3RoLgorIworIyBUaGUgcmVhc29uIHdoeSB0aGUgRFNUIHdpbGwgb25seSBiZWdpbiBOb3ZlbWJlciAzcmQgaXMgdGhhdCB0aGUgdGhvdXNhbmRzCisjIG9mIGVsZWN0b3JhbCBtYWNoaW5lcyB1c2VkIGNhbm5vdCBoYXZlIHRoZWlyIHRpbWUgY2hhbmdlZCwgYW5kIHNpbmNlIHRoZQorIyBDb25zdGl0dXRpb24gc2F5cyB0aGUgZWxlY3Rpb25zIG11c3QgYmVnaW4gYXQgODowMCBBTSBhbmQgZW5kIGF0IDU6MDAgUE0sCisjIHRoZSBHb3Zlcm5tZW50IGRlY2lkZWQgdG8gcG9zdHBvbmUgRFNULCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBDb25zdGl0dXRpb24KKyMgKG1heWJlLCBmb3IgdGhlIG5leHQgZWxlY3Rpb25zLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgY2xvY2spLi4uCisKKyMgRnJvbSBSb2RyaWdvIFNldmVybyAoMjAwNC0xMC0wNCk6CisjIEl0J3MganVzdCB0aGUgYmlhbm51YWwgY2hhbmdlIG1hZGUgbmVjZXNzYXJ5IGJ5IHRoZSBtdWNoIGh5cGVkLCBzdXBwb3NlZGx5CisjIG1vZGVybiBCcmF6aWxpYW4gZWxldHJvbmljIHZvdGluZyBtYWNoaW5lcyB3aGljaCwgYXBwYXJlbnRseSwgY2FuJ3QgZGVhbAorIyB3aXRoIGEgdGltZSBjaGFuZ2UgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcm91bmRzIG9mIHRoZSBlbGVjdGlvbnMuCisKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDktMjApOgorIyBCcmF6aWwgd2lsbCBzdGFydCBEU1Qgb24gMjAwNy0xMC0xNCAwMDowMCBhbmQgZW5kIG9uIDIwMDgtMDItMTcgMDA6MDA6CisjIGh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvO2pzZXNzaW9uaWQ9QkJBMDY4MTFBRkNBQUMyOEYwMjg1MjEwOTEzNTEzREE/bmV3c0lkPTEzOTc1CisKKyMgRnJvbSBQYXVsIFNjaHVsemUgKDIwMDgtMDYtMjQpOgorIyAuLi5ieSBsYXcgbnVtYmVyIDExLjY2MiBvZiBBcHJpbCAyNCwgMjAwOCAocHVibGlzaGVkIGluIHRoZSAiRGlhcmlvCisjIE9maWNpYWwgZGEgVW5pYW8iLi4uKSBpbiBCcmF6aWwgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHRpbWV6b25lcywKKyMgZWZmZWN0aXZlIHRvZGF5ICgwMDowMGFtIGF0IEp1bmUgMjQsIDIwMDgpIGFzIGZvbGxvd3M6CisjCisjIGEpIFRoZSB0aW1lem9uZSBVVEMrNSBpcyBlW3hddGluZ3Vpc2hlZCwgd2l0aCBhbGwgdGhlIEFjcmUgc3RhdGUgYW5kIHRoZQorIyBwYXJ0IG9mIHRoZSBBbWF6b25hcyBzdGF0ZSB0aGF0IGhhZCB0aGlzIHRpbWV6b25lIG5vdyBiZWluZyBwdXQgdG8gdGhlCisjIHRpbWV6b25lIFVUQys0CisjIGIpIFRoZSB3aG9sZSBQYXJhIHN0YXRlIG5vdyBpcyBwdXQgYXQgdGltZXpvbmUgVVRDKzMsIGluc3RlYWQgb2YganVzdAorIyBwYXJ0IG9mIGl0LCBhcyB3YXMgYmVmb3JlLgorIworIyBUaGlzIGNoYW5nZSBmb2xsb3dzIGEgcHJvcG9zYWwgb2Ygc2VuYXRvciBUaWFvIFZpYW5hIG9mIEFjcmUgc3RhdGUsIHRoYXQKKyMgcHJvcG9zZWQgaXQgZHVlIHRvIGNvbmNlcm5zIGFib3V0IG9wZW4gdGVsZXZpc2lvbiBjaGFubmVscyBkaXNwbGF5aW5nCisjIHByb2dyYW1zIGluYXBwcm9wcmlhdGUgdG8geW91dGhzIGluIHRoZSBzdGF0ZXMgdGhhdCBoYWQgdGhlIHRpbWV6b25lCisjIFVUQys1IHRvbyBlYXJseSBpbiB0aGUgbmlnaHQuIEluIHRoZSBvY2Nhc2lvbiwgc29tZSBtb3JlIGNvcnJlY3Rpb25zCisjIHdlcmUgcHJvcG9zZWQsIHRyeWluZyB0byB1bmlmeSB0aGUgdGltZXpvbmVzIG9mIGFueSBnaXZlbiBzdGF0ZS4gVGhpcworIyBjaGFuZ2UgbW9kaWZpZXMgdGltZXpvbmUgcnVsZXMgZGVmaW5lZCBpbiBkZWNyZWUgMi43ODQgb2YgMTggSnVuZSwKKyMgMTkxMy4KKworIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTA2LTI0KToKKyMgSnVzdCBjb3JyZWN0aW5nIHRoZSBVUkw6CisjIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOCI+CisjIGh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOAorIyA8L2E+CisjCisjIEFzIGEgcmVzdWx0IG9mIHRoZSBhYm92ZSBEZWNyZWUgSSBiZWxpZXZlIHRoZSBBbWVyaWNhL1Jpb19CcmFuY28KKyMgdGltZXpvbmUgc2hhbGwgYmUgbW9kaWZpZWQgZnJvbSBVVEMtNSB0byBVVEMtNCBhbmQgYSBuZXcgdGltZXpvbmUgc2hhbGwKKyMgYmUgY3JlYXRlZCB0byByZXByZXNlbnQgdGhlIHRoZSB3ZXN0IHNpZGUgb2YgdGhlIFBhcmEgU3RhdGUuIEkKKyMgc3VnZ2VzdCB0aGlzIG5ldyB0aW1lem9uZSBiZSBjYWxsZWQgU2FudGFyZW0gYXMgdGhlIG1vc3QKKyMgaW1wb3J0YW50L3BvcHVsYXRlZCBjaXR5IGluIHRoZSBhZmZlY3RlZCBhcmVhLgorIworIyBUaGlzIG5ldyB0aW1lem9uZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgUmlvX0JyYW5jbyB0aW1lem9uZSB1cCB0bworIyB0aGUgMjAwOC8wNi8yNCBjaGFuZ2Ugd2hpY2ggd291bGQgYmUgdG8gVVRDLTMgaW5zdGVhZCBvZiBVVEMtNC4KKworIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDYtMjQpOgorIyBUaGlzIGlzIGEgcXVpY2sgcmVmZXJlbmNlIHBhZ2UgZm9yIE5ldyBhbmQgT2xkIEJyYXppbCBUaW1lIFpvbmVzIG1hcC4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9icmF6aWwtdGltZS1uZXctb2xkLnBocCI+CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vYnJhemlsLXRpbWUtbmV3LW9sZC5waHAKKyMgPC9hPgorIworIyAtIDQgdGltZSB6b25lcyByZXBsYWNlZCBieSAzIHRpbWUgem9uZXMtZWxpbWluYXRpbmcgdGltZSB6b25lIFVUQy0gMDUKKyMgKHN0YXRlIEFjcmUgYW5kIHRoZSBwYXJ0IG9mIHRoZSBBbWF6b25hcyB3aWxsIGJlIFVUQy9HTVQtIDA0KSAtIHdlc3Rlcm4KKyMgcGFydCBvZiBQYXIgc3RhdGUgaXMgbW92aW5nIHRvIG9uZSB0aW1lem9uZSBVVEMtIDAzIChmcm9tIFVUQyAtMDQpLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMTApOgorIyBUaGUgb2ZmaWNpYWwgZGVjcmVlcyByZWZlcmVuY2VkIGJlbG93IGFyZSBtb3N0bHkgdGFrZW4gZnJvbQorIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sIj4KKyMgRGVjcmV0b3Mgc29icmUgbyBIb3JhcmlvIGRlIFZlcmFvIG5vIEJyYXNpbAorIyA8L2E+LgorCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA4LTI5KToKKyMgQXMgYW5ub3VuY2VkIGJ5IHRoZSBnb3Zlcm5tZW50IGFuZCBtYW55IG5ld3NwYXBlcnMgaW4gQnJhemlsIGxhdGUKKyMgeWVzdGVyZGF5LCBCcmF6aWwgd2lsbCBzdGFydCBEU1Qgb24gMjAwOC0xMC0xOSAobmVlZCB0byBjaGFuZ2UgcnVsZSkgYW5kCisjIGl0IHdpbGwgZW5kIG9uIDIwMDktMDItMTUgKGN1cnJlbnQgcnVsZSBmb3IgQnJhemlsIGlzIGZpbmUpLiBCYXNlZCBvbgorIyBwYXN0IHllYXJzIGV4cGVyaWVuY2Ugd2l0aCB0aGUgZWxlY3Rpb25zLCB0aGVyZSB3YXMgYSBnb29kIGNoYW5jZSB0aGF0CisjIHRoZSBzdGFydCB3YXMgcG9zdHBvbmVkIHRvIE5vdmVtYmVyLCBidXQgaXQgZGlkIG5vdCBoYXBwZW4gdGhpcyB5ZWFyLgorIworIyBJdCBoYXMgbm90IHlldCBiZWVuIHBvc3RlZCB0byBodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sCisjCisjIEFuIG9mZmljaWFsIHBhZ2UgYWJvdXQgaXQ6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMiI+CisjIGh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMgorIyA8L2E+CisjIE5vdGUgdGhhdCB0aGlzIGxpbmsgZG9lcyBub3QgYWx3YXlzIHdvcmsgZGlyZWN0bHksIGJ1dCBtdXN0IGJlIGFjY2Vzc2VkCisjIGJ5IGdvaW5nIHRvCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdCI+CisjIGh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdAorIyA8L2E+CisjCisjIE9uZSBleGFtcGxlIGxpbmsgdGhhdCB3b3JrcyBkaXJlY3RseToKKyMgPGEgaHJlZj0iaHR0cDovL2pvcm5hbGUuY29tLmJyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTEzNTMwJkl0ZW1pZD01NCI+CisjIGh0dHA6Ly9qb3JuYWxlLmNvbS5ici9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMzUzMCZJdGVtaWQ9NTQKKyMgKFBvcnR1Z3Vlc2UpCisjIDwvYT4KKyMKKyMgV2UgaGF2ZSBhIHdyaXR0ZW4gYSBzaG9ydCBhcnRpY2xlIGFib3V0IGl0IGFzIHdlbGw6CisjIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9icmF6aWwtZHN0LTIwMDgtMjAwOS5odG1sIj4KKyMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JyYXppbC1kc3QtMjAwOC0yMDA5Lmh0bWwKKyMgPC9hPgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDQ2Ni5odG0iPjIwLDQ2NjwvYT4gKDE5MzEtMTAtMDEpCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIxODk2Lmh0bSI+MjEsODk2PC9hPiAoMTkzMi0wMS0xMCkKK1J1bGUJQnJhemlsCTE5MzEJb25seQktCU9jdAkgMwkxMTowMAkxOjAwCVMKK1J1bGUJQnJhemlsCTE5MzIJMTkzMwktCUFwcgkgMQkgMDowMAkwCS0KK1J1bGUJQnJhemlsCTE5MzIJb25seQktCU9jdAkgMwkgMDowMAkxOjAwCVMKKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjMxOTUuaHRtIj4yMywxOTU8L2E+ICgxOTMzLTEwLTEwKQorIyByZXZva2VkIERTVC4KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjc0OTYuaHRtIj4yNyw0OTY8L2E+ICgxOTQ5LTExLTI0KQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzk5OC5odG0iPjI3LDk5ODwvYT4gKDE5NTAtMDQtMTMpCitSdWxlCUJyYXppbAkxOTQ5CTE5NTIJLQlEZWMJIDEJIDA6MDAJMTowMAlTCitSdWxlCUJyYXppbAkxOTUwCW9ubHkJLQlBcHIJMTYJIDE6MDAJMAktCitSdWxlCUJyYXppbAkxOTUxCTE5NTIJLQlBcHIJIDEJIDA6MDAJMAktCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjMyMzA4Lmh0bSI+MzIsMzA4PC9hPiAoMTk1My0wMi0yNCkKK1J1bGUJQnJhemlsCTE5NTMJb25seQktCU1hcgkgMQkgMDowMAkwCS0KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzQ3MjQuaHRtIj4zNCw3MjQ8L2E+ICgxOTUzLTExLTMwKQorIyByZXZva2VkIERTVC4KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTI3MDAuaHRtIj41Miw3MDA8L2E+ICgxOTYzLTEwLTE4KQorIyBlc3RhYmxpc2hlZCBEU1QgZnJvbSAxOTYzLTEwLTIzIDAwOjAwIHRvIDE5NjQtMDItMjkgMDA6MDAKKyMgaW4gU1AsIFJKLCBHQiwgTUcsIEVTLCBkdWUgdG8gdGhlIHByb2xvbmdhdGlvbiBvZiB0aGUgZHJvdWdodC4KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTMwNzEuaHRtIj41MywwNzE8L2E+ICgxOTYzLTEyLTAzKQorIyBleHRlbmRlZCB0aGUgYWJvdmUgZGVjcmVlIHRvIGFsbCBvZiB0aGUgbmF0aW9uYWwgdGVycml0b3J5IG9uIDEyLTA5LgorUnVsZQlCcmF6aWwJMTk2Mwlvbmx5CS0JRGVjCSA5CSAwOjAwCTE6MDAJUworIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzYwNC5odG0iPjUzLDYwNDwvYT4gKDE5NjQtMDItMjUpCisjIGV4dGVuZGVkIHN1bW1lciB0aW1lIGJ5IG9uZSBkYXkgdG8gMTk2NC0wMy0wMSAwMDowMCAoc3RhcnQgb2Ygc2Nob29sKS4KK1J1bGUJQnJhemlsCTE5NjQJb25seQktCU1hcgkgMQkgMDowMAkwCS0KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTU2MzkuaHRtIj41NSw2Mzk8L2E+ICgxOTY1LTAxLTI3KQorUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JSmFuCTMxCSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JTWFyCTMxCSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1NzMwMy5odG0iPjU3LDMwMzwvYT4gKDE5NjUtMTEtMjIpCitSdWxlCUJyYXppbAkxOTY1CW9ubHkJLQlEZWMJIDEJIDA6MDAJMTowMAlTCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3ODQzLmh0bSI+NTcsODQzPC9hPiAoMTk2Ni0wMi0xOCkKK1J1bGUJQnJhemlsCTE5NjYJMTk2OAktCU1hcgkgMQkgMDowMAkwCS0KK1J1bGUJQnJhemlsCTE5NjYJMTk2NwktCU5vdgkgMQkgMDowMAkxOjAwCVMKKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNjM0MjkuaHRtIj42Myw0Mjk8L2E+ICgxOTY4LTEwLTE1KQorIyByZXZva2VkIERTVC4KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTE2OTguaHRtIj45MSw2OTg8L2E+ICgxOTg1LTA5LTI3KQorUnVsZQlCcmF6aWwJMTk4NQlvbmx5CS0JTm92CSAyCSAwOjAwCTE6MDAJUworIyBEZWNyZWUgOTIsMzEwICgxOTg2LTAxLTIxKQorIyBEZWNyZWUgOTIsNDYzICgxOTg2LTAzLTEzKQorUnVsZQlCcmF6aWwJMTk4Nglvbmx5CS0JTWFyCTE1CSAwOjAwCTAJLQorIyBEZWNyZWUgOTMsMzE2ICgxOTg2LTEwLTAxKQorUnVsZQlCcmF6aWwJMTk4Nglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk4Nwlvbmx5CS0JRmViCTE0CSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDkyMi5odG0iPjk0LDkyMjwvYT4gKDE5ODctMDktMjIpCitSdWxlCUJyYXppbAkxOTg3CW9ubHkJLQlPY3QJMjUJIDA6MDAJMTowMAlTCitSdWxlCUJyYXppbAkxOTg4CW9ubHkJLQlGZWIJIDcJIDA6MDAJMAktCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk2Njc2Lmh0bSI+OTYsNjc2PC9hPiAoMTk4OC0wOS0xMikKKyMgZXhjZXB0IGZvciB0aGUgc3RhdGVzIG9mIEFDLCBBTSwgUEEsIFJSLCBSTywgYW5kIEFQICh0aGVuIGEgdGVycml0b3J5KQorUnVsZQlCcmF6aWwJMTk4OAlvbmx5CS0JT2N0CTE2CSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk4OQlvbmx5CS0JSmFuCTI5CSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5ODA3Ny5odG0iPjk4LDA3NzwvYT4gKDE5ODktMDgtMjEpCisjIHdpdGggdGhlIHNhbWUgZXhjZXB0aW9ucworUnVsZQlCcmF6aWwJMTk4OQlvbmx5CS0JT2N0CTE1CSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JRmViCTExCSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5OTUzMC5odG0iPjk5LDUzMDwvYT4gKDE5OTAtMDktMTcpCisjIGFkb3B0ZWQgYnkgUlMsIFNDLCBQUiwgU1AsIFJKLCBFUywgTUcsIEdPLCBNUywgREYuCisjIERlY3JlZSA5OSw2MjkgKDE5OTAtMTAtMTkpIGFkZHMgQkEsIE1ULgorUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JT2N0CTIxCSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk5MQlvbmx5CS0JRmViCTE3CSAwOjAwCTAJLQorIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTEuaHRtIj5Vbm51bWJlcmVkIGRlY3JlZTwvYT4gKDE5OTEtMDktMjUpCisjIGFkb3B0ZWQgYnkgUlMsIFNDLCBQUiwgU1AsIFJKLCBFUywgTUcsIEJBLCBHTywgTVQsIE1TLCBERi4KK1J1bGUJQnJhemlsCTE5OTEJb25seQktCU9jdAkyMAkgMDowMAkxOjAwCVMKK1J1bGUJQnJhemlsCTE5OTIJb25seQktCUZlYgkgOQkgMDowMAkwCS0KKyMgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxOTkyLmh0bSI+VW5udW1iZXJlZCBkZWNyZWU8L2E+ICgxOTkyLTEwLTE2KQorIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLgorUnVsZQlCcmF6aWwJMTk5Mglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk5Mwlvbmx5CS0JSmFuCTMxCSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDIuaHRtIj45NDI8L2E+ICgxOTkzLTA5LTI4KQorIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBwbHVzIEFNLgorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxMjUyLmh0bSI+MSwyNTI8L2E+ICgxOTk0LTA5LTIyOworIyB3ZWIgcGFnZSBjb3JyZWN0ZWQgMjAwNC0wMS0wNykgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgbWludXMgQU0uCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE2MzYuaHRtIj4xLDYzNjwvYT4gKDE5OTUtMDktMTQpCisjIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIHBsdXMgTVQgYW5kIFRPLgorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxNjc0Lmh0bSI+MSw2NzQ8L2E+ICgxOTk1LTEwLTEzKQorIyBhZGRzIEFMLCBTRS4KK1J1bGUJQnJhemlsCTE5OTMJMTk5NQktCU9jdAlTdW4+PTExCSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk5NAkxOTk1CS0JRmViCVN1bj49MTUJIDA6MDAJMAktCitSdWxlCUJyYXppbAkxOTk2CW9ubHkJLQlGZWIJMTEJIDA6MDAJMAktCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwMDAuaHRtIj4yLDAwMDwvYT4gKDE5OTYtMDktMDQpCisjIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIG1pbnVzIEFMLCBTRS4KK1J1bGUJQnJhemlsCTE5OTYJb25seQktCU9jdAkgNgkgMDowMAkxOjAwCVMKK1J1bGUJQnJhemlsCTE5OTcJb25seQktCUZlYgkxNgkgMDowMAkwCS0KKyMgRnJvbSBEYW5pZWwgQy4gU29icmFsICgxOTk4LTAyLTEyKToKKyMgSW4gMTk5NywgdGhlIERTIGJlZ2FuIG9uIE9jdG9iZXIgNi4gVGhlIHN0YXRlZCByZWFzb24gd2FzIHRoYXQKKyMgYmVjYXVzZSBpbnRlcm5hdGlvbmFsIHRlbGV2aXNpb24gbmV0d29ya3MgaWdub3JlZCBCcmF6aWwncyBwb2xpY3kgb24gRFMsCisjIHRoZXkgYm91Z2h0IHRoZSB3cm9uZyB0aW1lcyBvbiBzYXRlbGxpdGUgZm9yIGNvdmVyYWdlIG9mIFBvcGUncyB2aXNpdC4KKyMgVGhpcyB5ZWFyLCB0aGUgZW5kaW5nIGRhdGUgb2YgRFMgd2FzIHBvc3Rwb25lZCB0byBNYXJjaCAxCisjIHRvIGhlbHAgZGVhbGluZyB3aXRoIHRoZSBzaG9ydGFnZXMgb2YgZWxlY3RyaWMgcG93ZXIuCisjCisjIERlY3JlZSAyLDMxNyAoMTk5Ny0wOS0wNCksIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCitSdWxlCUJyYXppbAkxOTk3CW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMjQ5NS5KUEciPjIsNDk1PC9hPgorIyAoMTk5OC0wMi0xMCkKK1J1bGUJQnJhemlsCTE5OTgJb25seQktCU1hcgkgMQkgMDowMAkwCS0KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSHY5OC5qcGciPjIsNzgwPC9hPiAoMTk5OC0wOS0xMSkKKyMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgorUnVsZQlCcmF6aWwJMTk5OAlvbmx5CS0JT2N0CTExCSAwOjAwCTE6MDAJUworUnVsZQlCcmF6aWwJMTk5OQlvbmx5CS0JRmViCTIxCSAwOjAwCTAJLQorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjMxNTAuZ2lmIj4zLDE1MDwvYT4KKyMgKDE5OTktMDgtMjMpIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjk5LmdpZiI+MywxODg8L2E+ICgxOTk5LTA5LTMwKQorIyBhZGRzIFNFLCBBTCwgUEIsIFBFLCBSTiwgQ0UsIFBJLCBNQSBhbmQgUlIuCitSdWxlCUJyYXppbAkxOTk5CW9ubHkJLQlPY3QJIDMJIDA6MDAJMTowMAlTCitSdWxlCUJyYXppbAkyMDAwCW9ubHkJLQlGZWIJMjcJIDA6MDAJMAktCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ERUMzNTkyLmh0bSI+Myw1OTI8L2E+ICgyMDAwLTA5LTA2KQorIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCisjIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMwLmpwZyI+Myw2MzA8L2E+ICgyMDAwLTEwLTEzKQorIyByZXBlYWxzIERTVCBpbiBQRSBhbmQgUlIsIGVmZmVjdGl2ZSAyMDAwLTEwLTE1IDAwOjAwLgorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjMzYzMi5qcGciPjMsNjMyPC9hPiAoMjAwMC0xMC0xNykKKyMgcmVwZWFscyBEU1QgaW4gU0UsIEFMLCBQQiwgUk4sIENFLCBQSSBhbmQgTUEsIGVmZmVjdGl2ZSAyMDAwLTEwLTIyIDAwOjAwLgorIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjM5MTYuZ2lmIj4zLDkxNjwvYT4KKyMgKDIwMDEtMDktMTMpIHJlZXN0YWJsaXNoZXMgRFNUIGluIEFMLCBDRSwgTUEsIFBCLCBQRSwgUEksIFJOLCBTRS4KK1J1bGUJQnJhemlsCTIwMDAJMjAwMQktCU9jdAlTdW4+PTgJIDA6MDAJMTowMAlTCitSdWxlCUJyYXppbAkyMDAxCTIwMDYJLQlGZWIJU3VuPj0xNQkgMDowMAkwCS0KKyMgRGVjcmVlIDQsMzk5ICgyMDAyLTEwLTAxKSByZXBlYWxzIERTVCBpbiBBTCwgQ0UsIE1BLCBQQiwgUEUsIFBJLCBSTiwgU0UuCisjIDxhIGhyZWY9Imh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LmJyL0NDSVZJTC9kZWNyZXRvLzIwMDIvRDQzOTkuaHRtIj40LDM5OTwvYT4KK1J1bGUJQnJhemlsCTIwMDIJb25seQktCU5vdgkgMwkgMDowMAkxOjAwCVMKKyMgRGVjcmVlIDQsODQ0ICgyMDAzLTA5LTI0OyBjb3JyZWN0ZWQgMjAwMy0wOS0yNikgcmVwZWFscyBEU1QgaW4gQkEsIE1ULCBUTy4KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMy9ENDg0NC5odG0iPjQsODQ0PC9hPgorUnVsZQlCcmF6aWwJMjAwMwlvbmx5CS0JT2N0CTE5CSAwOjAwCTE6MDAJUworIyBEZWNyZWUgNSwyMjMgKDIwMDQtMTAtMDEpIHJlZXN0YWJsaXNoZXMgRFNUIGluIE1ULgorIyA8YSBocmVmPSJodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDQtMjAwNi8yMDA0L0RlY3JldG8vRDUyMjMuaHRtIj41LDIyMzwvYT4KK1J1bGUJQnJhemlsCTIwMDQJb25seQktCU5vdgkgMgkgMDowMAkxOjAwCVMKKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTUzOS5naWYiPjUsNTM5PC9hPiAoMjAwNS0wOS0xOSksCisjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KK1J1bGUJQnJhemlsCTIwMDUJb25seQktCU9jdAkxNgkgMDowMAkxOjAwCVMKKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTkyMC5naWYiPjUsOTIwPC9hPiAoMjAwNi0xMC0wMyksCisjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KK1J1bGUJQnJhemlsCTIwMDYJb25seQktCU5vdgkgNQkgMDowMAkxOjAwCVMKK1J1bGUJQnJhemlsCTIwMDcJb25seQktCUZlYgkyNQkgMDowMAkwCS0KKyMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNjIxMi5naWYiPjYsMjEyPC9hPiAoMjAwNy0wOS0yNiksCisjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KK1J1bGUJQnJhemlsCTIwMDcJb25seQktCU9jdAlTdW4+PTgJIDA6MDAJMTowMAlTCisjIEZyb20gRnJlZGVyaWNvIEEuIEMuIE5ldmVzICgyMDA4LTA5LTEwKToKKyMgQWNvcmRpbmcgdG8gdGhpcyBkZWNyZWUKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5wbGFuYWx0by5nb3YuYnIvY2NpdmlsXzAzL19BdG8yMDA3LTIwMTAvMjAwOC9EZWNyZXRvL0Q2NTU4Lmh0bSI+CisjIGh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNy0yMDEwLzIwMDgvRGVjcmV0by9ENjU1OC5odG0KKyMgPC9hPgorIyBbdF1oZSBEU1QgcGVyaW9kIGluIEJyYXppbCBub3cgb24gd2lsbCBiZSBmcm9tIHRoZSAzcmQgT2N0IFN1bmRheSB0byB0aGUKKyMgM3JkIEZlYiBTdW5kYXkuIFRoZXJlIGlzIGFuIGV4Y2VwdGlvbiBvbiB0aGUgcmV0dXJuIGRhdGUgd2hlbiB0aGlzIGlzCisjIHRoZSBDYXJuaXZhbCBTdW5kYXkgdGhlbiB0aGUgcmV0dXJuIGRhdGUgd2lsbCBiZSB0aGUgbmV4dCBTdW5kYXkuLi4KK1J1bGUJQnJhemlsCTIwMDgJbWF4CS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKK1J1bGUJQnJhemlsCTIwMDgJMjAxMQktCUZlYglTdW4+PTE1CTA6MDAJMAktCitSdWxlCUJyYXppbAkyMDEyCW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQorUnVsZQlCcmF6aWwJMjAxMwkyMDE0CS0JRmViCVN1bj49MTUJMDowMAkwCS0KK1J1bGUJQnJhemlsCTIwMTUJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCitSdWxlCUJyYXppbAkyMDE2CTIwMjIJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQorUnVsZQlCcmF6aWwJMjAyMwlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KK1J1bGUJQnJhemlsCTIwMjQJMjAyNQktCUZlYglTdW4+PTE1CTA6MDAJMAktCitSdWxlCUJyYXppbAkyMDI2CW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQorUnVsZQlCcmF6aWwJMjAyNwkyMDMzCS0JRmViCVN1bj49MTUJMDowMAkwCS0KK1J1bGUJQnJhemlsCTIwMzQJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCitSdWxlCUJyYXppbAkyMDM1CTIwMzYJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQorUnVsZQlCcmF6aWwJMjAzNwlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDktMjkpOgorIyBUaGUgbmV4dCBpcyB3cm9uZyBpbiBzb21lIHllYXJzIGJ1dCBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLgorUnVsZQlCcmF6aWwJMjAzOAltYXgJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQorCisjIFRoZSBsYXRlc3QgcnVsZXNldCBsaXN0ZWQgYWJvdmUgc2F5cyB0aGF0IHRoZSBmb2xsb3dpbmcgc3RhdGVzIG9ic2VydmUgRFNUOgorIyBERiwgRVMsIEdPLCBNRywgTVMsIE1ULCBQUiwgUkosIFJTLCBTQywgU1AuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KKyMKKyMgRmVybmFuZG8gZGUgTm9yb25oYSAoYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIFBFKQorWm9uZSBBbWVyaWNhL05vcm9uaGEJLTI6MDk6NDAgLQlMTVQJMTkxNAorCQkJLTI6MDAJQnJhemlsCUZOJXNUCTE5OTAgU2VwIDE3CisJCQktMjowMAktCUZOVAkxOTk5IFNlcCAzMAorCQkJLTI6MDAJQnJhemlsCUZOJXNUCTIwMDAgT2N0IDE1CisJCQktMjowMAktCUZOVAkyMDAxIFNlcCAxMworCQkJLTI6MDAJQnJhemlsCUZOJXNUCTIwMDIgT2N0ICAxCisJCQktMjowMAktCUZOVAorIyBPdGhlciBBdGxhbnRpYyBpc2xhbmRzIGhhdmUgbm8gcGVybWFuZW50IHNldHRsZW1lbnQuCisjIFRoZXNlIGluY2x1ZGUgVHJpbmRhZGUgYW5kIE1hcnRpbiBWYXogKGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBFUyksCisjIEF0b2wgZGFzIFJvY2FzIChSTiksIGFuZCBQZW5lZG9zIGRlIFNhbyBQZWRybyBlIFNhbyBQYXVsbyAoUEUpLgorIyBGZXJuYW5kbyBkZSBOb3JvbmhhIHdhcyBhIHNlcGFyYXRlIHRlcnJpdG9yeSBmcm9tIDE5NDItMDktMDIgdG8gMTk4OS0wMS0wMTsKKyMgaXQgYWxzbyBpbmNsdWRlZCB0aGUgUGVuZWRvcy4KKyMKKyMgQW1hcGEgKEFQKSwgZWFzdCBQYXJhIChQQSkKKyMgRWFzdCBQYXJhIGluY2x1ZGVzIEJlbGVtLCBNYXJhYmEsIFNlcnJhIE5vcnRlLCBhbmQgU2FvIEZlbGl4IGRvIFhpbmd1LgorIyBUaGUgZGl2aXNpb24gYmV0d2VlbiBlYXN0IGFuZCB3ZXN0IFBhcmEgaXMgdGhlIHJpdmVyIFhpbmd1LgorIyBJbiB0aGUgbm9ydGggYSB2ZXJ5IHNtYWxsIHBhcnQgZnJvbSB0aGUgcml2ZXIgSmF2YXJ5IChub3cgSmFyaSBJIGd1ZXNzLAorIyB0aGUgYm9yZGVyIHdpdGggQW1hcGEpIHRvIHRoZSBBbWF6b24sIHRoZW4gdG8gdGhlIFhpbmd1LgorWm9uZSBBbWVyaWNhL0JlbGVtCS0zOjEzOjU2IC0JTE1UCTE5MTQKKwkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTg4IFNlcCAxMgorCQkJLTM6MDAJLQlCUlQKKyMKKyMgd2VzdCBQYXJhIChQQSkKKyMgV2VzdCBQYXJhIGluY2x1ZGVzIEFsdGFtaXJhLCBPcmliaWRvcywgUHJhaW5oYSwgT3JpeGltaW5hLCBhbmQgU2FudGFyZW0uCitab25lIEFtZXJpY2EvU2FudGFyZW0JLTM6Mzg6NDggLQlMTVQJMTkxNAorCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCisJCQktNDowMAktCUFNVAkyMDA4IEp1biAyNCAwMDowMAorCQkJLTM6MDAJLQlCUlQKKyMKKyMgTWFyYW5oYW8gKE1BKSwgUGlhdWkgKFBJKSwgQ2VhcmEgKENFKSwgUmlvIEdyYW5kZSBkbyBOb3J0ZSAoUk4pLAorIyBQYXJhaWJhIChQQikKK1pvbmUgQW1lcmljYS9Gb3J0YWxlemEJLTI6MzQ6MDAgLQlMTVQJMTkxNAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3CisJCQktMzowMAktCUJSVAkxOTk5IFNlcCAzMAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDAgT2N0IDIyCisJCQktMzowMAktCUJSVAkyMDAxIFNlcCAxMworCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDIgT2N0ICAxCisJCQktMzowMAktCUJSVAorIworIyBQZXJuYW1idWNvIChQRSkgKGV4Y2VwdCBBdGxhbnRpYyBpc2xhbmRzKQorWm9uZSBBbWVyaWNhL1JlY2lmZQktMjoxOTozNiAtCUxNVAkxOTE0CisJCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5MCBTZXAgMTcKKwkJCS0zOjAwCS0JQlJUCTE5OTkgU2VwIDMwCisJCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMCBPY3QgMTUKKwkJCS0zOjAwCS0JQlJUCTIwMDEgU2VwIDEzCisJCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMiBPY3QgIDEKKwkJCS0zOjAwCS0JQlJUCisjCisjIFRvY2FudGlucyAoVE8pCitab25lIEFtZXJpY2EvQXJhZ3VhaW5hCS0zOjEyOjQ4IC0JTE1UCTE5MTQKKwkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTkwIFNlcCAxNworCQkJLTM6MDAJLQlCUlQJMTk5NSBTZXAgMTQKKwkJCS0zOjAwCUJyYXppbAlCUiVzVAkyMDAzIFNlcCAyNAorCQkJLTM6MDAJLQlCUlQKKyMKKyMgQWxhZ29hcyAoQUwpLCBTZXJnaXBlIChTRSkKK1pvbmUgQW1lcmljYS9NYWNlaW8JLTI6MjI6NTIgLQlMTVQJMTkxNAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3CisJCQktMzowMAktCUJSVAkxOTk1IE9jdCAxMworCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTYgU2VwICA0CisJCQktMzowMAktCUJSVAkxOTk5IFNlcCAzMAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDAgT2N0IDIyCisJCQktMzowMAktCUJSVAkyMDAxIFNlcCAxMworCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDIgT2N0ICAxCisJCQktMzowMAktCUJSVAorIworIyBCYWhpYSAoQkEpCisjIFRoZXJlIGFyZSB0b28gbWFueSBTYWx2YWRvcnMgZWxzZXdoZXJlLCBzbyB1c2UgQW1lcmljYS9CYWhpYSBpbnN0ZWFkCisjIG9mIEFtZXJpY2EvU2FsdmFkb3IuCitab25lIEFtZXJpY2EvQmFoaWEJLTI6MzQ6MDQgLQlMTVQJMTkxNAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDMgU2VwIDI0CisJCQktMzowMAktCUJSVAorIworIyBHb2lhcyAoR08pLCBEaXN0cml0byBGZWRlcmFsIChERiksIE1pbmFzIEdlcmFpcyAoTUcpLAorIyBFc3Bpcml0byBTYW50byAoRVMpLCBSaW8gZGUgSmFuZWlybyAoUkopLCBTYW8gUGF1bG8gKFNQKSwgUGFyYW5hIChQUiksCisjIFNhbnRhIENhdGFyaW5hIChTQyksIFJpbyBHcmFuZGUgZG8gU3VsIChSUykKK1pvbmUgQW1lcmljYS9TYW9fUGF1bG8JLTM6MDY6MjggLQlMTVQJMTkxNAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5NjMgT2N0IDIzIDAwOjAwCisJCQktMzowMAkxOjAwCUJSU1QJMTk2NAorCQkJLTM6MDAJQnJhemlsCUJSJXNUCisjCisjIE1hdG8gR3Jvc3NvIGRvIFN1bCAoTVMpCitab25lIEFtZXJpY2EvQ2FtcG9fR3JhbmRlIC0zOjM4OjI4IC0JTE1UCTE5MTQKKwkJCS00OjAwCUJyYXppbAlBTSVzVAorIworIyBNYXRvIEdyb3NzbyAoTVQpCitab25lIEFtZXJpY2EvQ3VpYWJhCS0zOjQ0OjIwIC0JTE1UCTE5MTQKKwkJCS00OjAwCUJyYXppbAlBTSVzVAkyMDAzIFNlcCAyNAorCQkJLTQ6MDAJLQlBTVQJMjAwNCBPY3QgIDEKKwkJCS00OjAwCUJyYXppbAlBTSVzVAorIworIyBSb25kb25pYSAoUk8pCitab25lIEFtZXJpY2EvUG9ydG9fVmVsaG8gLTQ6MTU6MzYgLQlMTVQJMTkxNAorCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCisJCQktNDowMAktCUFNVAorIworIyBSb3JhaW1hIChSUikKK1pvbmUgQW1lcmljYS9Cb2FfVmlzdGEJLTQ6MDI6NDAgLQlMTVQJMTkxNAorCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCisJCQktNDowMAktCUFNVAkxOTk5IFNlcCAzMAorCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTIwMDAgT2N0IDE1CisJCQktNDowMAktCUFNVAorIworIyBlYXN0IEFtYXpvbmFzIChBTSk6IEJvY2EgZG8gQWNyZSwgSnV0YWksIE1hbmF1cywgRmxvcmlhbm8gUGVpeG90bworIyBUaGUgZ3JlYXQgY2lyY2xlIGxpbmUgZnJvbSBUYWJhdGluZ2EgdG8gUG9ydG8gQWNyZSBkaXZpZGVzCisjIGVhc3QgZnJvbSB3ZXN0IEFtYXpvbmFzLgorWm9uZSBBbWVyaWNhL01hbmF1cwktNDowMDowNCAtCUxNVAkxOTE0CisJCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKKwkJCS00OjAwCS0JQU1UCTE5OTMgU2VwIDI4CisJCQktNDowMAlCcmF6aWwJQU0lc1QJMTk5NCBTZXAgMjIKKwkJCS00OjAwCS0JQU1UCisjCisjIHdlc3QgQW1hem9uYXMgKEFNKTogQXRhbGFpYSBkbyBOb3J0ZSwgQm9jYSBkbyBNYW9jbywgQmVuamFtaW4gQ29uc3RhbnQsCisjCUVpcnVuZXBlLCBFbnZpcmEsIElwaXh1bmEKK1pvbmUgQW1lcmljYS9FaXJ1bmVwZQktNDozOToyOCAtCUxNVAkxOTE0CisJCQktNTowMAlCcmF6aWwJQUMlc1QJMTk4OCBTZXAgMTIKKwkJCS01OjAwCS0JQUNUCTE5OTMgU2VwIDI4CisJCQktNTowMAlCcmF6aWwJQUMlc1QJMTk5NCBTZXAgMjIKKwkJCS01OjAwCS0JQUNUCTIwMDggSnVuIDI0IDAwOjAwCisJCQktNDowMAktCUFNVAorIworIyBBY3JlIChBQykKK1pvbmUgQW1lcmljYS9SaW9fQnJhbmNvCS00OjMxOjEyIC0JTE1UCTE5MTQKKwkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTg4IFNlcCAxMgorCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgMDA6MDAKKwkJCS00OjAwCS0JQU1UCisKKyMgQ2hpbGUKKworIyBGcm9tIEVkdWFyZG8gS3JlbGwgKDE5OTUtMTAtMTkpOgorIyBUaGUgbGF3IHNheXMgdG8gc3dpdGNoIHRvIERTVCBhdCBtaWRuaWdodCBbMjQ6MDBdIG9uIHRoZSBzZWNvbmQgU0FUVVJEQVkKKyMgb2YgT2N0b2Jlci4uLi4gIFRoZSBsYXcgaXMgdGhlIHNhbWUgZm9yIE1hcmNoIGFuZCBPY3RvYmVyLgorIyAoMTk5OC0wOS0yOSk6CisjIEJlY2F1c2Ugb2YgdGhlIGRyb3VnaHQgdGhpcyB5ZWFyLCB0aGUgZ292ZXJubWVudCBkZWNpZGVkIHRvIGdvIGludG8KKyMgRFNUIGVhcmxpZXIgKHNhdHVyZGF5IDkvMjYgYXQgMjQ6MDApLiBUaGlzIGlzIGEgb25lLXRpbWUgY2hhbmdlIG9ubHkgLi4uCisjICh1bmxlc3MgdGhlcmUncyBhbm90aGVyIGRyeSBzZWFzb24gbmV4dCB5ZWFyLCBJIGd1ZXNzKS4KKworIyBGcm9tIEp1bGlvIEkuIFBhY2hlY28gVHJvbmNvc28gKDE5OTktMDMtMTgpOgorIyBCZWNhdXNlIG9mIHRoZSBzYW1lIGRyb3VnaHQsIHRoZSBnb3Zlcm5tZW50IGRlY2lkZWQgdG8gZW5kIERTVCBsYXRlciwKKyMgb24gQXByaWwgMywgKG9uZS10aW1lIGNoYW5nZSkuCisKKyMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwNi0xMC0wOCk6CisjIGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bQorCisjIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTEwLTA4KToKKyMgSSB0aGluayB0aGF0IHRoZXJlIGFyZSBzb21lIG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIHN1Z2dlc3RlZCBsaW5rCisjIGZyb20gT3NjYXIgdmFuIFZsaWptZW4sLi4uIGZvciBpbnN0YW5jZSBlbnRyeSA2NiBzYXlzIHRoYXQgR01ULTQKKyMgZW5kZWQgMTk5MC0wOS0xMiB3aGlsZSBlbnRyeSA2NyBvbmx5IGJlZ2lucyBHTVQtMyBhdCAxOTkwLTA5LTE1CisjICh0aGV5IHNob3VsZCBoYXZlIGJlZW4gMTk5MC0wOS0xNSBhbmQgMTk5MC0wOS0xNiByZXNwZWN0aXZlbHkpLCBidXQKKyMgYW55aG93IGl0IGNsZWFycyB1cCBzb21lIGRvdWJ0cyB0b28uCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0xMi0yNyk6CisjIFRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgQ2hpbGUgYW5kIEFtZXJpY2EvU2FudGlhZ28gYXJlIGZyb20KKyMgPGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvaG9yYW9mLmh0bT4gKDIwMDYtMDktMjApLCB0cmFuc2NyaWJlZCBieQorIyBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4uICBUaGUgZGF0YSBmb3IgUGFjaWZpYy9FYXN0ZXIgYXJlIGZyb20gU2hhbmtzCisjICYgUG90dGVuZ2VyLCBleGNlcHQgd2l0aCBEU1QgdHJhbnNpdGlvbnMgYWZ0ZXIgMTkzMiBjbG9uZWQgZnJvbQorIyBBbWVyaWNhL1NhbnRpYWdvLiAgVGhlIHByZS0xOTgwIFBhY2lmaWMvRWFzdGVyIGRhdGEgYXJlIGR1YmlvdXMsCisjIGJ1dCB3ZSBoYXZlIG5vIG90aGVyIHNvdXJjZS4KKworIyBGcm9tIEdlcm1hbiBQb28tQ2FhbWFufm8gKDIwMDgtMDMtMDMpOgorIyBEdWUgdG8gZHJvdWdodCwgQ2hpbGUgZXh0ZW5kcyBEYXlsaWdodCBUaW1lIGluIHRocmVlIHdlZWtzLiAgVGhpcworIyBpcyBvbmUtdGltZSBjaGFuZ2UgKFNhdHVyZGF5IDMvMjkgYXQgMjQ6MDAgZm9yIEFtZXJpY2EvU2FudGlhZ28KKyMgYW5kIFNhdHVyZGF5IDMvMjkgYXQgMjI6MDAgZm9yIFBhY2lmaWMvRWFzdGVyKQorIyBUaGUgU3VwcmVtZSBEZWNyZWUgaXMgbG9jYXRlZCBhdCAKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5zaG9hLmNsL3NlcnZpY2lvcy9zdXByZW1vMzE2LnBkZiI+CisjIGh0dHA6Ly93d3cuc2hvYS5jbC9zZXJ2aWNpb3Mvc3VwcmVtbzMxNi5wZGYKKyMgPC9hPgorIyBhbmQgdGhlIGluc3RydWN0aW9ucyBmb3IgMjAwOCBhcmUgbG9jYXRlZCBpbjoKKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtIj4KKyMgaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtCisjIDwvYT4uCisKKyMgRnJvbSBKb3NlIE1pZ3VlbCBHYXJyaWRvICgyMDA4LTAzLTA1KToKKyMgLi4uCisjIFlvdSBjb3VsZCBzZWUgdGhlIGFubm91bmNlcyBvZiB0aGUgY2hhbmdlIG9uIAorIyA8YSBocmVmPSJodHRwOi8vd3d3LnNob2EuY2wvbm90aWNpYXMvMjAwOC8wNGhvcmEvaG9yYS5odG0iPgorIyBodHRwOi8vd3d3LnNob2EuY2wvbm90aWNpYXMvMjAwOC8wNGhvcmEvaG9yYS5odG0KKyMgPC9hPi4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQ2hpbGUJMTkyNwkxOTMyCS0JU2VwCSAxCTA6MDAJMTowMAlTCitSdWxlCUNoaWxlCTE5MjgJMTkzMgktCUFwcgkgMQkwOjAwCTAJLQorUnVsZQlDaGlsZQkxOTQyCW9ubHkJLQlKdW4JIDEJNDowMHUJMAktCitSdWxlCUNoaWxlCTE5NDIJb25seQktCUF1ZwkgMQk1OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk0Nglvbmx5CS0JSnVsCTE1CTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZQkxOTQ2CW9ubHkJLQlTZXAJIDEJMzowMHUJMDowMAktCitSdWxlCUNoaWxlCTE5NDcJb25seQktCUFwcgkgMQk0OjAwdQkwCS0KK1J1bGUJQ2hpbGUJMTk2OAlvbmx5CS0JTm92CSAzCTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZQkxOTY5CW9ubHkJLQlNYXIJMzAJMzowMHUJMAktCitSdWxlCUNoaWxlCTE5NjkJb25seQktCU5vdgkyMwk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk3MAlvbmx5CS0JTWFyCTI5CTM6MDB1CTAJLQorUnVsZQlDaGlsZQkxOTcxCW9ubHkJLQlNYXIJMTQJMzowMHUJMAktCitSdWxlCUNoaWxlCTE5NzAJMTk3MgktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCitSdWxlCUNoaWxlCTE5NzIJMTk4NgktCU1hcglTdW4+PTkJMzowMHUJMAktCitSdWxlCUNoaWxlCTE5NzMJb25seQktCVNlcAkzMAk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk3NAkxOTg3CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk4Nwlvbmx5CS0JQXByCTEyCTM6MDB1CTAJLQorUnVsZQlDaGlsZQkxOTg4CTE5ODkJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQorUnVsZQlDaGlsZQkxOTg4CW9ubHkJLQlPY3QJU3VuPj0xCTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZQkxOTg5CW9ubHkJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZQkxOTkwCW9ubHkJLQlNYXIJMTgJMzowMHUJMAktCitSdWxlCUNoaWxlCTE5OTAJb25seQktCVNlcAkxNgk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk5MQkxOTk2CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KK1J1bGUJQ2hpbGUJMTk5MQkxOTk3CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKK1J1bGUJQ2hpbGUJMTk5Nwlvbmx5CS0JTWFyCTMwCTM6MDB1CTAJLQorUnVsZQlDaGlsZQkxOTk4CW9ubHkJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQorUnVsZQlDaGlsZQkxOTk4CW9ubHkJLQlTZXAJMjcJNDowMHUJMTowMAlTCitSdWxlCUNoaWxlCTE5OTkJb25seQktCUFwcgkgNAkzOjAwdQkwCS0KK1J1bGUJQ2hpbGUJMTk5OQltYXgJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUworUnVsZQlDaGlsZQkyMDAwCTIwMDcJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQorIyBOLkIuOiB0aGUgZW5kIG9mIE1hcmNoIDI5IGluIENoaWxlIGlzIE1hcmNoIDMwIGluIFVuaXZlcnNhbCB0aW1lLAorIyB3aGljaCBpcyB1c2VkIGJlbG93IGluIHNwZWNpZnlpbmcgdGhlIHRyYW5zaXRpb24uCitSdWxlCUNoaWxlCTIwMDgJb25seQktCU1hcgkzMAkzOjAwdQkwCS0KK1J1bGUJQ2hpbGUJMjAwOQltYXgJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQorIyBJQVRBIFNTSU0gYW5vbWFsaWVzOiAoMTk5Mi0wMikgc2F5cyAxOTkyLTAzLTE0OworIyAoMTk5Ni0wOSkgc2F5cyAxOTk4LTAzLTA4LiAgSWdub3JlIHRoZXNlLgorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1NhbnRpYWdvCS00OjQyOjQ2IC0JTE1UCTE4OTAKKwkJCS00OjQyOjQ2IC0JU01UCTE5MTAgCSAgICAjIFNhbnRpYWdvIE1lYW4gVGltZQorCQkJLTU6MDAJLQlDTFQJMTkxNiBKdWwgIDEgIyBDaGlsZSBUaW1lCisJCQktNDo0Mjo0NiAtCVNNVAkxOTE4IFNlcCAgMSAjIFNhbnRpYWdvIE1lYW4gVGltZQorCQkJLTQ6MDAJLQlDTFQJMTkxOSBKdWwgIDEgIyBDaGlsZSBUaW1lCisJCQktNDo0Mjo0NiAtCVNNVAkxOTI3IFNlcCAgMSAjIFNhbnRpYWdvIE1lYW4gVGltZQorCQkJLTU6MDAJQ2hpbGUJQ0wlc1QJMTk0NyBNYXkgMjIgIyBDaGlsZSBUaW1lCisJCQktNDowMAlDaGlsZQlDTCVzVAorWm9uZSBQYWNpZmljL0Vhc3RlcgktNzoxNzo0NCAtCUxNVAkxODkwCisJCQktNzoxNzoyOCAtCUVNVAkxOTMyIFNlcCAgICAjIEVhc3RlciBNZWFuIFRpbWUKKwkJCS03OjAwCUNoaWxlCUVBUyVzVAkxOTgyIE1hciAxMyAyMTowMCAjIEVhc3RlciBJIFRpbWUKKwkJCS02OjAwCUNoaWxlCUVBUyVzVAorIworIyBTYWxhIHkgR29tZXogSXNsYW5kIGlzIGxpa2UgUGFjaWZpYy9FYXN0ZXIuCisjIE90aGVyIENoaWxlYW4gbG9jYXRpb25zLCBpbmNsdWRpbmcgSnVhbiBGZXJuYW5kZXogSXMsIFNhbiBBbWJyb3NpbywKKyMgU2FuIEZlbGl4LCBhbmQgQW50YXJjdGljIGJhc2VzLCBhcmUgbGlrZSBBbWVyaWNhL1NhbnRpYWdvLgorCisjIENvbG9tYmlhCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlDTwkxOTkyCW9ubHkJLQlNYXkJIDMJMDowMAkxOjAwCVMKK1J1bGUJQ08JMTk5Mwlvbmx5CS0JQXByCSA0CTA6MDAJMAktCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvQm9nb3RhCS00OjU2OjIwIC0JTE1UCTE4ODQgTWFyIDEzCisJCQktNDo1NjoyMCAtCUJNVAkxOTE0IE5vdiAyMyAjIEJvZ290YSBNZWFuIFRpbWUKKwkJCS01OjAwCUNPCUNPJXNUCSMgQ29sb21iaWEgVGltZQorIyBNYWxwZWxvLCBQcm92aWRlbmNpYSwgU2FuIEFuZHJlcworIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBBbWVyaWNhL0JvZ290YQorCisjIEN1cmFjYW8KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBUaGUgQm90dG9tIGFuZCBQaGlsaXBzYnVyZyBoYXZlIGJlZW4gYXQKKyMgLTQ6MDAgc2luY2Ugc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZCBvbiAxOTEyLTAzLTAyOyBhbmQgdGhhdAorIyBLcmFsZW5kaWprIGFuZCBSaW5jb24gdXNlZCBLcmFsZW5kaWprIE1lYW4gVGltZSAoLTQ6MzM6MDgpIGZyb20KKyMgMTkxMi0wMi0wMiB0byAxOTY1LTAxLTAxLiAgVGhlIGZvcm1lciBpcyBkdWJpb3VzLCBzaW5jZSBTJlAgYWxzbyBzYXkKKyMgU2FiYSBJc2xhbmQgaGFzIGJlZW4gbGlrZSBDdXJhY2FvLgorIyBUaGlzIGFsbCBwcmVkYXRlcyBvdXIgMTk3MCBjdXRvZmYsIHRob3VnaC4KKyMKKyMgQnkgSnVseSAyMDA3IEN1cmFjYW8gYW5kIFN0IE1hYXJ0ZW4gYXJlIHBsYW5uZWQgdG8gYmVjb21lCisjIGFzc29jaWF0ZWQgc3RhdGVzIHdpdGhpbiB0aGUgTmV0aGVybGFuZHMsIG11Y2ggbGlrZSBBcnViYTsKKyMgQm9uYWlyZSwgU2FiYSBhbmQgU3QgRXVzdGF0aXVzIHdvdWxkIGJlY29tZSBkaXJlY3RseSBwYXJ0IG9mIHRoZQorIyBOZXRoZXJsYW5kcyBhcyBLaW5nZG9tIElzbGFuZHMuICBUaGlzIHdvbid0IGFmZmVjdCB0aGVpciB0aW1lIHpvbmVzCisjIHRob3VnaCwgYXMgZmFyIGFzIHdlIGtub3cuCisjCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvQ3VyYWNhbwktNDozNTo0NCAtCUxNVAkxOTEyIEZlYiAxMgkjIFdpbGxlbXN0YWQKKwkJCS00OjMwCS0JQU5UCTE5NjUgIyBOZXRoZXJsYW5kcyBBbnRpbGxlcyBUaW1lCisJCQktNDowMAktCUFTVAorCisjIEVjdWFkb3IKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0wNCk6CisjIEFwcGFyZW50bHkgRWN1YWRvciBoYWQgYSBmYWlsZWQgZXhwZXJpbWVudCB3aXRoIERTVCBpbiAxOTkyLgorIyA8aHR0cDovL21pZGVuYS5nb3YuZWMvY29udGVudC92aWV3LzEyNjEvMjA4Lz4gKDIwMDctMDItMjcpIGFuZAorIyA8aHR0cDovL3d3dy5ob3kuY29tLmVjL05vdGljaWFOdWUuYXNwP3Jvd19pZD0yNDk4NTY+ICgyMDA2LTExLTA2KSBib3RoCisjIHRhbGsgYWJvdXQgImhvcmEgU2l4dG8iLiAgTGVhdmUgdGhpcyBhbG9uZSBmb3Igbm93LCBhcyB3ZSBoYXZlIG5vIGRhdGEuCisjCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvR3VheWFxdWlsCS01OjE5OjIwIC0JTE1UCTE4OTAKKwkJCS01OjE0OjAwIC0JUU1UCTE5MzEgIyBRdWl0byBNZWFuIFRpbWUKKwkJCS01OjAwCS0JRUNUCSAgICAgIyBFY3VhZG9yIFRpbWUKK1pvbmUgUGFjaWZpYy9HYWxhcGFnb3MJLTU6NTg6MjQgLQlMTVQJMTkzMSAjIFB1ZXJ0byBCYXF1ZXJpem8gTW9yZW5vCisJCQktNTowMAktCUVDVAkxOTg2CisJCQktNjowMAktCUdBTFQJICAgICAjIEdhbGFwYWdvcyBUaW1lCisKKyMgRmFsa2xhbmRzCisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEJldHdlZW4gMTk5MCBhbmQgMjAwMCBpbmNsdXNpdmUsIFNoYW5rcyAmIFBvdHRlbmdlciBhbmQgdGhlIElBVEEgYWdyZWUgZXhjZXB0CisjIHRoZSBJQVRBIGdpdmVzIDE5OTYtMDktMDguICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KKworIyBGcm9tIEZhbGtsYW5kIElzbGFuZHMgR292ZXJubWVudCBPZmZpY2UsIExvbmRvbiAoMjAwMS0wMS0yMikKKyMgdmlhIEplc3BlciBOb3JnYWFyZDoKKyMgLi4uIHRoZSBjbG9ja3MgcmV2ZXJ0IGJhY2sgdG8gTG9jYWwgTWVhbiBUaW1lIGF0IDIgYW0gb24gU3VuZGF5IDE1CisjIEFwcmlsIDIwMDEgYW5kIGFkdmFuY2Ugb25lIGhvdXIgdG8gc3VtbWVyIHRpbWUgYXQgMiBhbSBvbiBTdW5kYXkgMgorIyBTZXB0ZW1iZXIuICBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0IHRoZSBjbG9ja3Mgd2lsbCByZXZlcnQgYmFjayBhdCAyCisjIGFtIG9uIFN1bmRheSAyMSBBcHJpbCAyMDAyIGFuZCBhZHZhbmNlIHRvIHN1bW1lciB0aW1lIGF0IDIgYW0gb24KKyMgU3VuZGF5IDEgU2VwdGVtYmVyLgorCisjIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMDItMTMpOgorIworIyBJIGhhdmUgY29tbXVuaWNhdGVkIHNldmVyYWwgdGltZXMgd2l0aCBwZW9wbGUgdGhlcmUsIGFuZCB0aGUgbGFzdAorIyB0aW1lIEkgaGFkIGNvbW11bmljYXRpb25zIHRoYXQgd2FzIGhlbHBmdWwgd2FzIGluIDE5OTguICBIZXJlIGlzCisjIHdoYXQgd2FzIHNhaWQgdGhlbjoKKyMKKyMgIlRoZSBnZW5lcmFsIHJ1bGUgd2FzIHRoYXQgU3RhbmxleSB1c2VkIGRheWxpZ2h0IHNhdmluZyBhbmQgdGhlIENhbXAKKyMgZGlkIG5vdC4gSG93ZXZlciBmb3IgdmFyaW91cyByZWFzb25zIG1hbnkgcGVvcGxlIGluIHRoZSBDYW1wIGhhdmUKKyMgc3RhcnRlZCB0byB1c2UgZGF5bGlnaHQgc2F2aW5nIChrbm93biBsb2NhbGx5IGFzICdTdGFubGV5IFRpbWUnKQorIyBUaGVyZSBpcyBubyBydWxlIGFzIHRvIHdobyB1c2VzIGRheWxpZ2h0IHNhdmluZyAtIGl0IGlzIGEgbWF0dGVyIG9mCisjIHBlcnNvbmFsIGNob2ljZSBhbmQgc28gaXQgaXMgaW1wb3NzaWJsZSB0byBkcmF3IGEgbWFwIHNob3dpbmcgd2hvCisjIHVzZXMgaXQgYW5kIHdobyBkb2VzIG5vdC4gQW55IGxpc3Qgd291bGQgYmUgb3V0IG9mIGRhdGUgYXMgc29vbiBhcworIyBpdCB3YXMgcHJvZHVjZWQuIFRoaXMgeWVhciBkYXlsaWdodCBzYXZpbmcgZW5kZWQgb24gQXByaWwgMTgvMTl0aAorIyBhbmQgc3RhcnRlZCBhZ2FpbiBvbiBTZXB0ZW1iZXIgMTIvMTN0aC4gIEkgZG8gbm90IGtub3cgd2hhdCB0aGUgcnVsZQorIyBpcywgYnV0IGNhbiBmaW5kIG91dCBpZiB5b3UgbGlrZS4gIFdlIGRvIG5vdCBjaGFuZ2UgYXQgdGhlIHNhbWUgdGltZQorIyBhcyBVSyBvciBDaGlsZS4iCisjCisjIEkgZGlkIGhhdmUgaW4gbXkgbm90ZXMgdGhhdCB0aGUgcnVsZSB3YXMgIlNlY29uZCBTYXR1cmRheSBpbiBTZXAgYXQKKyMgMDowMCB1bnRpbCB0aGlyZCBTYXR1cmRheSBpbiBBcHIgYXQgMDowMCIuICBJIHRoaW5rIHRoYXQgdGhpcyBkb2VzCisjIG5vdCBhZ3JlZSBpbiBzb21lIGNhc2VzIHdpdGggU2hhbmtzOyBpcyB0aGlzIHRydWU/CisjCisjIEFsc28sIHRoZXJlIGlzIG5vIG1lbnRpb24gaW4gdGhlIGxpc3QgdGhhdCBzb21lIGFyZWFzIGluIHRoZQorIyBGYWxrbGFuZHMgZG8gbm90IHVzZSBEU1QuICBJIGhhdmUgZm91bmQgaW4gbXkgY29tbXVuaWNhdGlvbnMgdGhlcmUKKyMgdGhhdCB0aGVzZSBhcmVhcyBhcmUgb24gdGhlIHdlc3Rlcm4gaGFsZiBvZiBFYXN0IEZhbGtsYW5kIGFuZCBhbGwgb2YKKyMgV2VzdCBGYWxrbGFuZC4gIFN0YW5sZXkgaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCBjb25zaXN0ZW50bHkgb2JzZXJ2ZXMKKyMgRFNULiAgQWdhaW4sIGFzIGluIG90aGVyIHBsYWNlcyBpbiB0aGUgd29ybGQsIHRoZSBmYXJtZXJzIGRvbid0IGxpa2UKKyMgaXQuICBXZXN0IEZhbGtsYW5kIGlzIGFsbW9zdCBlbnRpcmVseSBzaGVlcCBmYXJtZXJzLgorIworIyBJIGtub3cgb25lIGxhZHkgdGhlcmUgdGhhdCBrZWVwcyBhIGxpc3Qgb2Ygd2hpY2ggZmFybSBrZWVwcyBEU1QgYW5kCisjIHdoaWNoIGRvZXNuJ3QgZWFjaCB5ZWFyLiAgU2hlIHJ1bnMgYSBzaG9wIGluIFN0YW5sZXksIGFuZCBzYXlzIHRoYXQKKyMgdGhlIGxpc3QgY2hhbmdlcyBlYWNoIHllYXIuICBTaGUgdXNlcyBpdCB0byBjb21tdW5pY2F0ZSB0byBoZXIKKyMgY3VzdG9tZXJzLCBjYXRjaGluZyB0aGVtIHdoZW4gdGhleSBhcmUgaG9tZSBmb3IgbHVuY2ggb3IgZGlubmVyLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDUpOgorIyBGb3Igbm93LCB3ZSdsbCBqdXN0IHJlY29yZCB0aGUgdGltZSBpbiBTdGFubGV5LCBzaW5jZSB3ZSBoYXZlIG5vCisjIGJldHRlciBpbmZvLgorCisjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUworUnVsZQlGYWxrCTE5MzcJMTkzOAktCVNlcAlsYXN0U3VuCTA6MDAJMTowMAlTCitSdWxlCUZhbGsJMTkzOAkxOTQyCS0JTWFyCVN1bj49MTkJMDowMAkwCS0KK1J1bGUJRmFsawkxOTM5CW9ubHkJLQlPY3QJMQkwOjAwCTE6MDAJUworUnVsZQlGYWxrCTE5NDAJMTk0MgktCVNlcAlsYXN0U3VuCTA6MDAJMTowMAlTCitSdWxlCUZhbGsJMTk0Mwlvbmx5CS0JSmFuCTEJMDowMAkwCS0KK1J1bGUJRmFsawkxOTgzCW9ubHkJLQlTZXAJbGFzdFN1bgkwOjAwCTE6MDAJUworUnVsZQlGYWxrCTE5ODQJMTk4NQktCUFwcglsYXN0U3VuCTA6MDAJMAktCitSdWxlCUZhbGsJMTk4NAlvbmx5CS0JU2VwCTE2CTA6MDAJMTowMAlTCitSdWxlCUZhbGsJMTk4NQkyMDAwCS0JU2VwCVN1bj49OQkwOjAwCTE6MDAJUworUnVsZQlGYWxrCTE5ODYJMjAwMAktCUFwcglTdW4+PTE2CTA6MDAJMAktCitSdWxlCUZhbGsJMjAwMQltYXgJLQlBcHIJU3VuPj0xNQkyOjAwCTAJLQorUnVsZQlGYWxrCTIwMDEJbWF4CS0JU2VwCVN1bj49MQkyOjAwCTE6MDAJUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBdGxhbnRpYy9TdGFubGV5CS0zOjUxOjI0IC0JTE1UCTE4OTAKKwkJCS0zOjUxOjI0IC0JU01UCTE5MTIgTWFyIDEyICAjIFN0YW5sZXkgTWVhbiBUaW1lCisJCQktNDowMAlGYWxrCUZLJXNUCTE5ODMgTWF5ICAgICAjIEZhbGtsYW5kIElzIFRpbWUKKwkJCS0zOjAwCUZhbGsJRkslc1QJMTk4NSBTZXAgMTUKKwkJCS00OjAwCUZhbGsJRkslc1QKKworIyBGcmVuY2ggR3VpYW5hCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEFtZXJpY2EvQ2F5ZW5uZQktMzoyOToyMCAtCUxNVAkxOTExIEp1bAorCQkJLTQ6MDAJLQlHRlQJMTk2NyBPY3QgIyBGcmVuY2ggR3VpYW5hIFRpbWUKKwkJCS0zOjAwCS0JR0ZUCisKKyMgR3V5YW5hCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvR3V5YW5hCS0zOjUyOjQwIC0JTE1UCTE5MTUgTWFyCSMgR2VvcmdldG93bgorCQkJLTM6NDUJLQlHQkdUCTE5NjYgTWF5IDI2ICMgQnIgR3VpYW5hIFRpbWUKKwkJCS0zOjQ1CS0JR1lUCTE5NzUgSnVsIDMxICMgR3V5YW5hIFRpbWUKKwkJCS0zOjAwCS0JR1lUCTE5OTEKKyMgSUFUQSBTU0lNICgxOTk2LTA2KSBzYXlzIC00OjAwLiAgQXNzdW1lIGEgMTk5MSBzd2l0Y2guCisJCQktNDowMAktCUdZVAorCisjIFBhcmFndWF5CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgc3ByaW5nIHRyYW5zaXRpb25zIGFyZSBmcm9tIDAxOjAwIC0+IDAyOjAwLAorIyBhbmQgYXV0dW1uIHRyYW5zaXRpb25zIGFyZSBmcm9tIDAwOjAwIC0+IDIzOjAwLiAgR28gd2l0aCBwcmUtMTk5OQorIyBlZGl0aW9ucyBvZiBTaGFua3MsIGFuZCB3aXRoIHRoZSBJQVRBLCB3aG8gc2F5IHRyYW5zaXRpb25zIG9jY3VyIGF0IDAwOjAwLgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJUGFyYQkxOTc1CTE5ODgJLQlPY3QJIDEJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTc1CTE5NzgJLQlNYXIJIDEJMDowMAkwCS0KK1J1bGUJUGFyYQkxOTc5CTE5OTEJLQlBcHIJIDEJMDowMAkwCS0KK1J1bGUJUGFyYQkxOTg5CW9ubHkJLQlPY3QJMjIJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTkwCW9ubHkJLQlPY3QJIDEJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTkxCW9ubHkJLQlPY3QJIDYJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTkyCW9ubHkJLQlNYXIJIDEJMDowMAkwCS0KK1J1bGUJUGFyYQkxOTkyCW9ubHkJLQlPY3QJIDUJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTkzCW9ubHkJLQlNYXIJMzEJMDowMAkwCS0KK1J1bGUJUGFyYQkxOTkzCTE5OTUJLQlPY3QJIDEJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkxOTk0CTE5OTUJLQlGZWIJbGFzdFN1bgkwOjAwCTAJLQorUnVsZQlQYXJhCTE5OTYJb25seQktCU1hcgkgMQkwOjAwCTAJLQorIyBJQVRBIFNTSU0gKDIwMDAtMDIpIHNheXMgMTk5OS0xMC0xMDsgaWdub3JlIHRoaXMgZm9yIG5vdy4KKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDAtMTAtMDIpOgorIyBJIGhhdmUgdGhyZWUgaW5kZXBlbmRlbnQgcmVwb3J0cyB0aGF0IFBhcmFndWF5IGNoYW5nZWQgdG8gRFNUIHRoaXMgU3VuZGF5CisjICgxMC0wMSkuCisjCisjIFRyYW5zbGF0ZWQgYnkgR3dpbGxpbSBMYXcgKDIwMDEtMDItMjcpIGZyb20KKyMgPGEgaHJlZj0iaHR0cDovL3d3dy5kaWFyaW9ub3RpY2lhcy5jb20ucHkvMDExMDAwL25hY2lvbmFsL25hY2lvbmExLmh0bSI+CisjIE5vdGljaWFzLCBhIGRhaWx5IHBhcGVyIGluIEFzdW5jaW9uLCBQYXJhZ3VheSAoMjAwMC0xMC0wMSkKKyMgPC9hPjoKKyMgU3RhcnRpbmcgYXQgMDowMCB0b2RheSwgdGhlIGNsb2NrIHdpbGwgYmUgc2V0IGZvcndhcmQgNjAgbWludXRlcywgaW4KKyMgZnVsZmlsbG1lbnQgb2YgRGVjcmVlIE5vLiA3LDI3MyBvZiB0aGUgRXhlY3V0aXZlIFBvd2VyLi4uLiAgVGhlIHRpbWUgY2hhbmdlCisjIHN5c3RlbSBoYXMgYmVlbiBvcGVyYXRpbmcgZm9yIHNldmVyYWwgeWVhcnMuICBGb3JtZXJseSB0aGVyZSB3YXMgYSBzZXBhcmF0ZQorIyBkZWNyZWUgZWFjaCB5ZWFyOyB0aGUgbmV3IGxhdyBoYXMgdGhlIHNhbWUgZWZmZWN0LCBidXQgcGVybWFuZW50bHkuICBFdmVyeQorIyB5ZWFyLCB0aGUgdGltZSB3aWxsIGNoYW5nZSBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE9jdG9iZXI7IGxpa2V3aXNlLCB0aGUKKyMgY2xvY2sgd2lsbCBiZSBzZXQgYmFjayBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE1hcmNoLgorIworUnVsZQlQYXJhCTE5OTYJMjAwMQktCU9jdAlTdW4+PTEJMDowMAkxOjAwCVMKKyMgSUFUQSBTU0lNICgxOTk3LTA5KSBzYXlzIE1hciAxOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJUGFyYQkxOTk3CW9ubHkJLQlGZWIJbGFzdFN1bgkwOjAwCTAJLQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IDE5OTktMDItMjg7IElBVEEgU1NJTSAoMTk5OS0wMikgc2F5cyAxOTk5LTAyLTI3LCBidXQKKyMgKDE5OTktMDkpIHJlcG9ydHMgbm8gZGF0ZTsgZ28gd2l0aCBhYm92ZSBzb3VyY2VzIGFuZCBHZXJkIEtub3BzICgyMDAxLTAyLTI3KS4KK1J1bGUJUGFyYQkxOTk4CTIwMDEJLQlNYXIJU3VuPj0xCTA6MDAJMAktCisjIEZyb20gUml2ZXMgTWNEb3cgKDIwMDItMDItMjgpOgorIyBBIGRlY3JlZSB3YXMgaXNzdWVkIGluIFBhcmFndWF5IChuby4gMTYzNTApIG9uIDIwMDItMDItMjYgdGhhdCBjaGFuZ2VkIHRoZQorIyBkc3QgbWV0aG9kIHRvIGJlIGZyb20gdGhlIGZpcnN0IFN1bmRheSBpbiBTZXB0ZW1iZXIgdG8gdGhlIGZpcnN0IFN1bmRheSBpbgorIyBBcHJpbC4KK1J1bGUJUGFyYQkyMDAyCTIwMDQJLQlBcHIJU3VuPj0xCTA6MDAJMAktCitSdWxlCVBhcmEJMjAwMgkyMDAzCS0JU2VwCVN1bj49MQkwOjAwCTE6MDAJUworIworIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNS0wMS0wMik6CisjIFRoZXJlIGFyZSBzZXZlcmFsIHNvdXJjZXMgdGhhdCBjbGFpbSB0aGF0IFBhcmFndWF5IG1hZGUKKyMgYSB0aW1lem9uZSBydWxlIGNoYW5nZSBpbiBhdXR1bW4gMjAwNC4KKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMDEtMDUpOgorIyBEZWNyZWUgMSw4NjcgKDIwMDQtMDMtMDUpCisjIEZyb20gQ2FybG9zIFJhdWwgUGVyYXNzbyB2aWEgSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTEwLTEzKQorIyA8aHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YucHkvZGVjcmV0b3MvRDE4NjcucGRmPgorUnVsZQlQYXJhCTIwMDQJbWF4CS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKK1J1bGUJUGFyYQkyMDA1CW1heAktCU1hcglTdW4+PTgJMDowMAkwCS0KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL0FzdW5jaW9uCS0zOjUwOjQwIC0JTE1UCTE4OTAKKwkJCS0zOjUwOjQwIC0JQU1UCTE5MzEgT2N0IDEwICMgQXN1bmNpb24gTWVhbiBUaW1lCisJCQktNDowMAktCVBZVAkxOTcyIE9jdCAjIFBhcmFndWF5IFRpbWUKKwkJCS0zOjAwCS0JUFlUCTE5NzQgQXByCisJCQktNDowMAlQYXJhCVBZJXNUCisKKyMgUGVydQorIworIyA8YSBocmVmPSJuZXdzOnhyR21iLjM5OTM1JGdBMS4xMzg5NjExM0BuZXdzNC5zcnYuaGN2bG55LmN2Lm5ldCI+CisjIEZyb20gRXZlbHluIEMuIExlZXBlciB2aWEgTWFyayBCcmFkZXIgKDIwMDMtMTAtMjYpOjwvYT4KKyMgV2hlbiB3ZSB3ZXJlIGluIFBlcnUgaW4gMTk4NS0xOTg2LCB0aGV5IGFwcGFyZW50bHkgc3dpdGNoZWQgb3ZlcgorIyBzb21ldGltZSBiZXR3ZWVuIERlY2VtYmVyIDI5IGFuZCBKYW51YXJ5IDMgd2hpbGUgd2Ugd2VyZSBvbiB0aGUgQW1hem9uLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGhhdmUgdGhpcyB0cmFuc2l0aW9uLiAgQXNzdW1lIDE5ODYgd2FzIGxpa2UgMTk4Ny4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJUGVydQkxOTM4CW9ubHkJLQlKYW4JIDEJMDowMAkxOjAwCVMKK1J1bGUJUGVydQkxOTM4CW9ubHkJLQlBcHIJIDEJMDowMAkwCS0KK1J1bGUJUGVydQkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkwOjAwCTE6MDAJUworUnVsZQlQZXJ1CTE5MzkJMTk0MAktCU1hcglTdW4+PTI0CTA6MDAJMAktCitSdWxlCVBlcnUJMTk4NgkxOTg3CS0JSmFuCSAxCTA6MDAJMTowMAlTCitSdWxlCVBlcnUJMTk4NgkxOTg3CS0JQXByCSAxCTA6MDAJMAktCitSdWxlCVBlcnUJMTk5MAlvbmx5CS0JSmFuCSAxCTA6MDAJMTowMAlTCitSdWxlCVBlcnUJMTk5MAlvbmx5CS0JQXByCSAxCTA6MDAJMAktCisjIElBVEEgaXMgYW1iaWd1b3VzIGZvciAxOTkzLzE5OTU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlQZXJ1CTE5OTQJb25seQktCUphbgkgMQkwOjAwCTE6MDAJUworUnVsZQlQZXJ1CTE5OTQJb25seQktCUFwcgkgMQkwOjAwCTAJLQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZQlBbWVyaWNhL0xpbWEJLTU6MDg6MTIgLQlMTVQJMTg5MAorCQkJLTU6MDg6MzYgLQlMTVQJMTkwOCBKdWwgMjggIyBMaW1hIE1lYW4gVGltZT8KKwkJCS01OjAwCVBlcnUJUEUlc1QJIyBQZXJ1IFRpbWUKKworIyBTb3V0aCBHZW9yZ2lhCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIEF0bGFudGljL1NvdXRoX0dlb3JnaWEgLTI6MjY6MDggLQlMTVQJMTg5MAkJIyBHcnl0dmlrZW4KKwkJCS0yOjAwCS0JR1NUCSMgU291dGggR2VvcmdpYSBUaW1lCisKKyMgU291dGggU2FuZHdpY2ggSXMKKyMgdW5pbmhhYml0ZWQ7IHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKKworIyBTdXJpbmFtZQorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1BhcmFtYXJpYm8JLTM6NDA6NDAgLQlMTVQJMTkxMQorCQkJLTM6NDA6NTIgLQlQTVQJMTkzNSAgICAgIyBQYXJhbWFyaWJvIE1lYW4gVGltZQorCQkJLTM6NDA6MzYgLQlQTVQJMTk0NSBPY3QgIyBUaGUgY2FwaXRhbCBtb3ZlZD8KKwkJCS0zOjMwCS0JTkVHVAkxOTc1IE5vdiAyMCAjIER1dGNoIEd1aWFuYSBUaW1lCisJCQktMzozMAktCVNSVAkxOTg0IE9jdCAjIFN1cmluYW1lIFRpbWUKKwkJCS0zOjAwCS0JU1JUCisKKyMgVHJpbmlkYWQgYW5kIFRvYmFnbworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gLTQ6MDY6MDQgLQlMTVQJMTkxMiBNYXIgMgorCQkJLTQ6MDAJLQlBU1QKKworIyBVcnVndWF5CisjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTMtMTEtMTgpOgorIyBVcnVndWF5IHdpbnMgdGhlIHByaXplIGZvciB0aGUgc3RyYW5nZXN0IHBlYWNldGltZSBtYW5pcHVsYXRpb24gb2YgdGhlIHJ1bGVzLgorIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCisjIFdoaXRtYW4gZ2l2ZXMgMTkyMyBPY3QgMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCitSdWxlCVVydWd1YXkJMTkyMwlvbmx5CS0JT2N0CSAyCSAwOjAwCTA6MzAJSFMKK1J1bGUJVXJ1Z3VheQkxOTI0CTE5MjYJLQlBcHIJIDEJIDA6MDAJMAktCitSdWxlCVVydWd1YXkJMTkyNAkxOTI1CS0JT2N0CSAxCSAwOjAwCTA6MzAJSFMKK1J1bGUJVXJ1Z3VheQkxOTMzCTE5MzUJLQlPY3QJbGFzdFN1bgkgMDowMAkwOjMwCUhTCisjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5MzUgQXByIDEgMDowMCAmIDE5MzYgTWFyIDMwIDA6MDA7IGdvIHdpdGggV2hpdG1hbi4KK1J1bGUJVXJ1Z3VheQkxOTM0CTE5MzYJLQlNYXIJU2F0Pj0yNQkyMzozMHMJMAktCitSdWxlCVVydWd1YXkJMTkzNglvbmx5CS0JTm92CSAxCSAwOjAwCTA6MzAJSFMKK1J1bGUJVXJ1Z3VheQkxOTM3CTE5NDEJLQlNYXIJbGFzdFN1bgkgMDowMAkwCS0KKyMgV2hpdG1hbiBnaXZlcyAxOTM3IE9jdCAzOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KK1J1bGUJVXJ1Z3VheQkxOTM3CTE5NDAJLQlPY3QJbGFzdFN1bgkgMDowMAkwOjMwCUhTCisjIFdoaXRtYW4gZ2l2ZXMgMTk0MSBPY3QgMjQgLSAxOTQyIE1hciAyNywgMTk0MiBEZWMgMTQgLSAxOTQzIEFwciAxMywKKyMgYW5kIDE5NDMgQXByIDEzIGBgdG8gcHJlc2VudCB0aW1lJyc7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgorUnVsZQlVcnVndWF5CTE5NDEJb25seQktCUF1ZwkgMQkgMDowMAkwOjMwCUhTCitSdWxlCVVydWd1YXkJMTk0Mglvbmx5CS0JSmFuCSAxCSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5NDIJb25seQktCURlYwkxNAkgMDowMAkxOjAwCVMKK1J1bGUJVXJ1Z3VheQkxOTQzCW9ubHkJLQlNYXIJMTQJIDA6MDAJMAktCitSdWxlCVVydWd1YXkJMTk1OQlvbmx5CS0JTWF5CTI0CSAwOjAwCTE6MDAJUworUnVsZQlVcnVndWF5CTE5NTkJb25seQktCU5vdgkxNQkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTYwCW9ubHkJLQlKYW4JMTcJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk2MAlvbmx5CS0JTWFyCSA2CSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5NjUJMTk2NwktCUFwcglTdW4+PTEJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk2NQlvbmx5CS0JU2VwCTI2CSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5NjYJMTk2NwktCU9jdAkzMQkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTY4CTE5NzAJLQlNYXkJMjcJIDA6MDAJMDozMAlIUworUnVsZQlVcnVndWF5CTE5NjgJMTk3MAktCURlYwkgMgkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTcyCW9ubHkJLQlBcHIJMjQJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk3Mglvbmx5CS0JQXVnCTE1CSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5NzQJb25seQktCU1hcgkxMAkgMDowMAkwOjMwCUhTCitSdWxlCVVydWd1YXkJMTk3NAlvbmx5CS0JRGVjCTIyCSAwOjAwCTE6MDAJUworUnVsZQlVcnVndWF5CTE5NzYJb25seQktCU9jdAkgMQkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTc3CW9ubHkJLQlEZWMJIDQJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk3OAlvbmx5CS0JQXByCSAxCSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5NzkJb25seQktCU9jdAkgMQkgMDowMAkxOjAwCVMKK1J1bGUJVXJ1Z3VheQkxOTgwCW9ubHkJLQlNYXkJIDEJIDA6MDAJMAktCitSdWxlCVVydWd1YXkJMTk4Nwlvbmx5CS0JRGVjCTE0CSAwOjAwCTE6MDAJUworUnVsZQlVcnVndWF5CTE5ODgJb25seQktCU1hcgkxNAkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTg4CW9ubHkJLQlEZWMJMTEJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk4OQlvbmx5CS0JTWFyCTEyCSAwOjAwCTAJLQorUnVsZQlVcnVndWF5CTE5ODkJb25seQktCU9jdAkyOQkgMDowMAkxOjAwCVMKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBubyBEU1Qgd2FzIG9ic2VydmVkIGluIDE5OTAvMSBhbmQgMTk5MS8yLAorIyBhbmQgdGhhdCAxOTkyLzMncyBEU1Qgd2FzIGZyb20gMTAtMjUgdG8gMDMtMDEuICBHbyB3aXRoIElBVEEuCitSdWxlCVVydWd1YXkJMTk5MAkxOTkyCS0JTWFyCVN1bj49MQkgMDowMAkwCS0KK1J1bGUJVXJ1Z3VheQkxOTkwCTE5OTEJLQlPY3QJU3VuPj0yMQkgMDowMAkxOjAwCVMKK1J1bGUJVXJ1Z3VheQkxOTkyCW9ubHkJLQlPY3QJMTgJIDA6MDAJMTowMAlTCitSdWxlCVVydWd1YXkJMTk5Mwlvbmx5CS0JRmViCTI4CSAwOjAwCTAJLQorIyBGcm9tIEVkdWFyZG8gQ290YSAoMjAwNC0wOS0yMCk6CisjIFRoZSB1cnVndWF5YW4gZ292ZXJubWVudCBoYXMgZGVjcmVlZCBhIGNoYW5nZSBpbiB0aGUgbG9jYWwgdGltZS4uLi4KKyMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5ndWIudXkvZGVjcmV0b3MvMjAwNDA5MTUwMi5odG0KK1J1bGUJVXJ1Z3VheQkyMDA0CW9ubHkJLQlTZXAJMTkJIDA6MDAJMTowMAlTCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTAzLTExKToKKyMgVXJ1Z3VheSdzIERTVCB3YXMgc2NoZWR1bGVkIHRvIGVuZCBvbiBTdW5kYXksIDIwMDUtMDMtMTMsIGJ1dCBpbiBvcmRlciB0bworIyBzYXZlIGVuZXJneSAuLi4gaXQgd2FzIHBvc3Rwb25lZCB0d28gd2Vla3MuLi4uCisjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L19XZWIvbm90aWNpYXMvMjAwNS8wMy8yMDA1MDMxMDA1Lmh0bQorUnVsZQlVcnVndWF5CTIwMDUJb25seQktCU1hcgkyNwkgMjowMAkwCS0KKyMgRnJvbSBFZHVhcmRvIENvdGEgKDIwMDUtMDktMjcpOgorIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9fV2ViL2RlY3JldG9zLzIwMDUvMDkvQ00lMjAxMTlfMDklMjAwOSUyMDIwMDVfMDAwMDEuUERGCisjIFRoaXMgbWVhbnMgdGhhdCBmcm9tIDIwMDUtMTAtMDkgYXQgMDI6MDAgbG9jYWwgdGltZSwgdW50aWwgMjAwNi0wMy0xMiBhdAorIyAwMjowMCBsb2NhbCB0aW1lLCBvZmZpY2lhbCB0aW1lIGluIFVydWd1YXkgd2lsbCBiZSBhdCBHTVQgLTIuCitSdWxlCVVydWd1YXkJMjAwNQlvbmx5CS0JT2N0CSA5CSAyOjAwCTE6MDAJUworUnVsZQlVcnVndWF5CTIwMDYJb25seQktCU1hcgkxMgkgMjowMAkwCS0KKyMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMDYpOgorIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9fd2ViL2RlY3JldG9zLzIwMDYvMDkvQ00lMjAyMTBfMDglMjAwNiUyMDIwMDZfMDAwMDEuUERGCitSdWxlCVVydWd1YXkJMjAwNgltYXgJLQlPY3QJU3VuPj0xCSAyOjAwCTE6MDAJUworUnVsZQlVcnVndWF5CTIwMDcJbWF4CS0JTWFyCVN1bj49OAkgMjowMAkwCS0KKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgQW1lcmljYS9Nb250ZXZpZGVvCS0zOjQ0OjQ0IC0JTE1UCTE4OTggSnVuIDI4CisJCQktMzo0NDo0NCAtCU1NVAkxOTIwIE1heSAgMQkjIE1vbnRldmlkZW8gTVQKKwkJCS0zOjMwCVVydWd1YXkJVVklc1QJMTk0MiBEZWMgMTQJIyBVcnVndWF5IFRpbWUKKwkJCS0zOjAwCVVydWd1YXkJVVklc1QKKworIyBWZW5lenVlbGEKKyMKKyMgRnJvbSBKb2huIFN0YWluZm9ydGggKDIwMDctMTEtMjgpOgorIyAuLi4gdGhlIGNoYW5nZSBmb3IgVmVuZXp1ZWxhIG9yaWdpbmFsbHkgZXhwZWN0ZWQgZm9yIDIwMDctMTItMzEgaGFzCisjIGJlZW4gYnJvdWdodCBmb3J3YXJkIHRvIDIwMDctMTItMDkuICBUaGUgb2ZmaWNpYWwgYW5ub3VuY2VtZW50IHdhcworIyBwdWJsaXNoZWQgdG9kYXkgaW4gdGhlICJHYWNldGEgT2ZpY2lhbCBkZSBsYSBSZXB1YmxpY2EgQm9saXZhcmlhbmEKKyMgZGUgVmVuZXp1ZWxhLCBudW1lcm8gMzguODE5IiAob2ZmaWNpYWwgZG9jdW1lbnQgZm9yIGFsbCBsYXdzIG9yCisjIHJlc29sdXRpb24gcHVibGljYXRpb24pCisjIGh0dHA6Ly93d3cuZ2xvYm92aXNpb24uY29tL25ld3MucGhwP25pZD03MjIwOAorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lCUFtZXJpY2EvQ2FyYWNhcwktNDoyNzo0NCAtCUxNVAkxODkwCisJCQktNDoyNzo0MCAtCUNNVAkxOTEyIEZlYiAxMiAjIENhcmFjYXMgTWVhbiBUaW1lPworCQkJLTQ6MzAJLQlWRVQJMTk2NQkgICAgICMgVmVuZXp1ZWxhIFRpbWUKKwkJCS00OjAwCS0JVkVUCTIwMDcgRGVjICA5IDAzOjAwCisJCQktNDozMAktCVZFVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAwOXMvc3lzdGVtdiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3N5c3RlbXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3Mzg4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3N5c3RlbXYKQEAgLTAsMCArMSwzOSBAQAorIyA8cHJlPgorIyBAKCMpc3lzdGVtdgk4LjIKKyMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKKyMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCisKKyMgT2xkIHJ1bGVzLCBzaG91bGQgdGhlIG5lZWQgYXJpc2UuCisjIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBoYW5kbGUgTmV3Zm91bmRsYW5kLCBzaW5jZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkCisjIHVzaW5nIHRoZSBTeXN0ZW0gViAiVFoiIHNjaGVtZSAoaGFsZi1ob3VyIG9mZnNldCksIG9yIGFueXRoaW5nIG91dHNpZGUKKyMgTm9ydGggQW1lcmljYSAobm8gc3VwcG9ydCBmb3Igbm9uLXN0YW5kYXJkIERTVCBzdGFydC9lbmQgZGF0ZXMpLCBub3IKKyMgdGhlIGNoYW5nZXMgaW4gdGhlIERTVCBydWxlcyBpbiB0aGUgVVMgYWZ0ZXIgMTk3NiAod2hpY2ggb2NjdXJyZWQgYWZ0ZXIKKyMgdGhlIG9sZCBydWxlcyB3ZXJlIHdyaXR0ZW4pLgorIworIyBJZiB5b3UgbmVlZCB0aGUgb2xkIHJ1bGVzLCB1bmNvbW1lbnQgIyMgbGluZXMuCisjIENvbXBpbGUgdGhpcyAqd2l0aG91dCogbGVhcCBzZWNvbmQgY29ycmVjdGlvbiBmb3IgdHJ1ZSBjb25mb3JtYW5jZS4KKworIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJU3lzdGVtVgltaW4JMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECitSdWxlCVN5c3RlbVYJbWluCTE5NzMJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlTeXN0ZW1WCTE5NzQJb25seQktCUphbgk2CTI6MDAJMTowMAlECitSdWxlCVN5c3RlbVYJMTk3NAlvbmx5CS0JTm92CWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJU3lzdGVtVgkxOTc1CW9ubHkJLQlGZWIJMjMJMjowMAkxOjAwCUQKK1J1bGUJU3lzdGVtVgkxOTc1CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlTeXN0ZW1WCTE5NzYJbWF4CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJU3lzdGVtVgkxOTc2CW1heAktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQorIyMgWm9uZQlTeXN0ZW1WL0FTVDRBRFQJLTQ6MDAJU3lzdGVtVgkJQSVzVAorIyMgWm9uZQlTeXN0ZW1WL0VTVDVFRFQJLTU6MDAJU3lzdGVtVgkJRSVzVAorIyMgWm9uZQlTeXN0ZW1WL0NTVDZDRFQJLTY6MDAJU3lzdGVtVgkJQyVzVAorIyMgWm9uZQlTeXN0ZW1WL01TVDdNRFQJLTc6MDAJU3lzdGVtVgkJTSVzVAorIyMgWm9uZQlTeXN0ZW1WL1BTVDhQRFQJLTg6MDAJU3lzdGVtVgkJUCVzVAorIyMgWm9uZQlTeXN0ZW1WL1lTVDlZRFQJLTk6MDAJU3lzdGVtVgkJWSVzVAorIyMgWm9uZQlTeXN0ZW1WL0FTVDQJLTQ6MDAJLQkJQVNUCisjIyBab25lCVN5c3RlbVYvRVNUNQktNTowMAktCQlFU1QKKyMjIFpvbmUJU3lzdGVtVi9DU1Q2CS02OjAwCS0JCUNTVAorIyMgWm9uZQlTeXN0ZW1WL01TVDcJLTc6MDAJLQkJTVNUCisjIyBab25lCVN5c3RlbVYvUFNUOAktODowMAktCQlQU1QKKyMjIFpvbmUJU3lzdGVtVi9ZU1Q5CS05OjAwCS0JCVlTVAorIyMgWm9uZQlTeXN0ZW1WL0hTVDEwCS0xMDowMAktCQlIU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDhoL3llYXJpc3R5cGUuc2ggYi90b29scy96b25laW5mby90emRhdGEyMDA5cy95ZWFyaXN0eXBlLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy96b25laW5mby90emRhdGEyMDA4aC95ZWFyaXN0eXBlLnNoCnJlbmFtZSB0byB0b29scy96b25laW5mby90emRhdGEyMDA5cy95ZWFyaXN0eXBlLnNoCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDA5cy96b25lLnRhYiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMDlzL3pvbmUudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTE5NDEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96b25laW5mby90emRhdGEyMDA5cy96b25lLnRhYgpAQCAtMCwwICsxLDQyOSBAQAorIyA8cHJlPgorIyBAKCMpem9uZS50YWIJOC4yOQorIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgorIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KKyMKKyMgVFogem9uZSBkZXNjcmlwdGlvbnMKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOC0wNSk6CisjCisjIFRoaXMgZmlsZSBjb250YWlucyBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBjb2x1bW5zOgorIyAxLiAgSVNPIDMxNjYgMi1jaGFyYWN0ZXIgY291bnRyeSBjb2RlLiAgU2VlIHRoZSBmaWxlIGBpc28zMTY2LnRhYicuCisjIDIuICBMYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIG9mIHRoZSB6b25lJ3MgcHJpbmNpcGFsIGxvY2F0aW9uCisjICAgICBpbiBJU08gNjcwOSBzaWduLWRlZ3JlZXMtbWludXRlcy1zZWNvbmRzIGZvcm1hdCwKKyMgICAgIGVpdGhlciArLURETU0rLURERE1NIG9yICstRERNTVNTKy1ERERNTVNTLAorIyAgICAgZmlyc3QgbGF0aXR1ZGUgKCsgaXMgbm9ydGgpLCB0aGVuIGxvbmdpdHVkZSAoKyBpcyBlYXN0KS4KKyMgMy4gIFpvbmUgbmFtZSB1c2VkIGluIHZhbHVlIG9mIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLgorIyA0LiAgQ29tbWVudHM7IHByZXNlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGNvdW50cnkgaGFzIG11bHRpcGxlIHJvd3MuCisjCisjIENvbHVtbnMgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSB0YWIuCisjIFRoZSB0YWJsZSBpcyBzb3J0ZWQgZmlyc3QgYnkgY291bnRyeSwgdGhlbiBhbiBvcmRlciB3aXRoaW4gdGhlIGNvdW50cnkgdGhhdAorIyAoMSkgbWFrZXMgc29tZSBnZW9ncmFwaGljYWwgc2Vuc2UsIGFuZAorIyAoMikgcHV0cyB0aGUgbW9zdCBwb3B1bG91cyB6b25lcyBmaXJzdCwgd2hlcmUgdGhhdCBkb2VzIG5vdCBjb250cmFkaWN0ICgxKS4KKyMKKyMgTGluZXMgYmVnaW5uaW5nIHdpdGggYCMnIGFyZSBjb21tZW50cy4KKyMKKyNjb3VudHJ5LQorI2NvZGUJY29vcmRpbmF0ZXMJVFoJCQljb21tZW50cworQUQJKzQyMzArMDAxMzEJRXVyb3BlL0FuZG9ycmEKK0FFCSsyNTE4KzA1NTE4CUFzaWEvRHViYWkKK0FGCSszNDMxKzA2OTEyCUFzaWEvS2FidWwKK0FHCSsxNzAzLTA2MTQ4CUFtZXJpY2EvQW50aWd1YQorQUkJKzE4MTItMDYzMDQJQW1lcmljYS9Bbmd1aWxsYQorQUwJKzQxMjArMDE5NTAJRXVyb3BlL1RpcmFuZQorQU0JKzQwMTErMDQ0MzAJQXNpYS9ZZXJldmFuCitBTgkrMTIxMS0wNjkwMAlBbWVyaWNhL0N1cmFjYW8KK0FPCS0wODQ4KzAxMzE0CUFmcmljYS9MdWFuZGEKK0FRCS03NzUwKzE2NjM2CUFudGFyY3RpY2EvTWNNdXJkbwlNY011cmRvIFN0YXRpb24sIFJvc3MgSXNsYW5kCitBUQktOTAwMCswMDAwMAlBbnRhcmN0aWNhL1NvdXRoX1BvbGUJQW11bmRzZW4tU2NvdHQgU3RhdGlvbiwgU291dGggUG9sZQorQVEJLTY3MzQtMDY4MDgJQW50YXJjdGljYS9Sb3RoZXJhCVJvdGhlcmEgU3RhdGlvbiwgQWRlbGFpZGUgSXNsYW5kCitBUQktNjQ0OC0wNjQwNglBbnRhcmN0aWNhL1BhbG1lcglQYWxtZXIgU3RhdGlvbiwgQW52ZXJzIElzbGFuZAorQVEJLTY3MzYrMDYyNTMJQW50YXJjdGljYS9NYXdzb24JTWF3c29uIFN0YXRpb24sIEhvbG1lIEJheQorQVEJLTY4MzUrMDc3NTgJQW50YXJjdGljYS9EYXZpcwlEYXZpcyBTdGF0aW9uLCBWZXN0Zm9sZCBIaWxscworQVEJLTY2MTcrMTEwMzEJQW50YXJjdGljYS9DYXNleQlDYXNleSBTdGF0aW9uLCBCYWlsZXkgUGVuaW5zdWxhCitBUQktNzgyNCsxMDY1NAlBbnRhcmN0aWNhL1Zvc3RvawlWb3N0b2sgU3RhdGlvbiwgUyBNYWduZXRpYyBQb2xlCitBUQktNjY0MCsxNDAwMQlBbnRhcmN0aWNhL0R1bW9udERVcnZpbGxlCUR1bW9udC1kJ1VydmlsbGUgU3RhdGlvbiwgVGVycmUgQWRlbGllCitBUQktNjkwMDIyKzAzOTM1MjQJQW50YXJjdGljYS9TeW93YQlTeW93YSBTdGF0aW9uLCBFIE9uZ3VsIEkKK0FSCS0zNDM2LTA1ODI3CUFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcwlCdWVub3MgQWlyZXMgKEJBLCBDRikKK0FSCS0zMTI0LTA2NDExCUFtZXJpY2EvQXJnZW50aW5hL0NvcmRvYmEJbW9zdCBsb2NhdGlvbnMgKENCLCBDQywgQ04sIEVSLCBGTSwgTU4sIFNFLCBTRikKK0FSCS0yNDQ3LTA2NTI1CUFtZXJpY2EvQXJnZW50aW5hL1NhbHRhCShTQSwgTFAsIE5RLCBSTikKK0FSCS0yNDExLTA2NTE4CUFtZXJpY2EvQXJnZW50aW5hL0p1anV5CUp1anV5IChKWSkKK0FSCS0yNjQ5LTA2NTEzCUFtZXJpY2EvQXJnZW50aW5hL1R1Y3VtYW4JVHVjdW1hbiAoVE0pCitBUgktMjgyOC0wNjU0NwlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQ2F0YW1hcmNhIChDVCksIENodWJ1dCAoQ0gpCitBUgktMjkyNi0wNjY1MQlBbWVyaWNhL0FyZ2VudGluYS9MYV9SaW9qYQlMYSBSaW9qYSAoTFIpCitBUgktMzEzMi0wNjgzMQlBbWVyaWNhL0FyZ2VudGluYS9TYW5fSnVhbglTYW4gSnVhbiAoU0opCitBUgktMzI1My0wNjg0OQlBbWVyaWNhL0FyZ2VudGluYS9NZW5kb3phCU1lbmRvemEgKE1aKQorQVIJLTMzMTktMDY2MjEJQW1lcmljYS9BcmdlbnRpbmEvU2FuX0x1aXMJU2FuIEx1aXMgKFNMKQorQVIJLTUxMzgtMDY5MTMJQW1lcmljYS9BcmdlbnRpbmEvUmlvX0dhbGxlZ29zCVNhbnRhIENydXogKFNDKQorQVIJLTU0NDgtMDY4MTgJQW1lcmljYS9BcmdlbnRpbmEvVXNodWFpYQlUaWVycmEgZGVsIEZ1ZWdvIChURikKK0FTCS0xNDE2LTE3MDQyCVBhY2lmaWMvUGFnb19QYWdvCitBVAkrNDgxMyswMTYyMAlFdXJvcGUvVmllbm5hCitBVQktMzEzMysxNTkwNQlBdXN0cmFsaWEvTG9yZF9Ib3dlCUxvcmQgSG93ZSBJc2xhbmQKK0FVCS00MjUzKzE0NzE5CUF1c3RyYWxpYS9Ib2JhcnQJVGFzbWFuaWEgLSBtb3N0IGxvY2F0aW9ucworQVUJLTM5NTYrMTQzNTIJQXVzdHJhbGlhL0N1cnJpZQlUYXNtYW5pYSAtIEtpbmcgSXNsYW5kCitBVQktMzc0OSsxNDQ1OAlBdXN0cmFsaWEvTWVsYm91cm5lCVZpY3RvcmlhCitBVQktMzM1MisxNTExMwlBdXN0cmFsaWEvU3lkbmV5CU5ldyBTb3V0aCBXYWxlcyAtIG1vc3QgbG9jYXRpb25zCitBVQktMzE1NysxNDEyNwlBdXN0cmFsaWEvQnJva2VuX0hpbGwJTmV3IFNvdXRoIFdhbGVzIC0gWWFuY293aW5uYQorQVUJLTI3MjgrMTUzMDIJQXVzdHJhbGlhL0JyaXNiYW5lCVF1ZWVuc2xhbmQgLSBtb3N0IGxvY2F0aW9ucworQVUJLTIwMTYrMTQ5MDAJQXVzdHJhbGlhL0xpbmRlbWFuCVF1ZWVuc2xhbmQgLSBIb2xpZGF5IElzbGFuZHMKK0FVCS0zNDU1KzEzODM1CUF1c3RyYWxpYS9BZGVsYWlkZQlTb3V0aCBBdXN0cmFsaWEKK0FVCS0xMjI4KzEzMDUwCUF1c3RyYWxpYS9EYXJ3aW4JTm9ydGhlcm4gVGVycml0b3J5CitBVQktMzE1NysxMTU1MQlBdXN0cmFsaWEvUGVydGgJV2VzdGVybiBBdXN0cmFsaWEgLSBtb3N0IGxvY2F0aW9ucworQVUJLTMxNDMrMTI4NTIJQXVzdHJhbGlhL0V1Y2xhCVdlc3Rlcm4gQXVzdHJhbGlhIC0gRXVjbGEgYXJlYQorQVcJKzEyMzAtMDY5NTgJQW1lcmljYS9BcnViYQorQVgJKzYwMDYrMDE5NTcJRXVyb3BlL01hcmllaGFtbgorQVoJKzQwMjMrMDQ5NTEJQXNpYS9CYWt1CitCQQkrNDM1MiswMTgyNQlFdXJvcGUvU2FyYWpldm8KK0JCCSsxMzA2LTA1OTM3CUFtZXJpY2EvQmFyYmFkb3MKK0JECSsyMzQzKzA5MDI1CUFzaWEvRGhha2EKK0JFCSs1MDUwKzAwNDIwCUV1cm9wZS9CcnVzc2VscworQkYJKzEyMjItMDAxMzEJQWZyaWNhL091YWdhZG91Z291CitCRwkrNDI0MSswMjMxOQlFdXJvcGUvU29maWEKK0JICSsyNjIzKzA1MDM1CUFzaWEvQmFocmFpbgorQkkJLTAzMjMrMDI5MjIJQWZyaWNhL0J1anVtYnVyYQorQkoJKzA2MjkrMDAyMzcJQWZyaWNhL1BvcnRvLU5vdm8KK0JMCSsxNzUzLTA2MjUxCUFtZXJpY2EvU3RfQmFydGhlbGVteQorQk0JKzMyMTctMDY0NDYJQXRsYW50aWMvQmVybXVkYQorQk4JKzA0NTYrMTE0NTUJQXNpYS9CcnVuZWkKK0JPCS0xNjMwLTA2ODA5CUFtZXJpY2EvTGFfUGF6CitCUgktMDM1MS0wMzIyNQlBbWVyaWNhL05vcm9uaGEJQXRsYW50aWMgaXNsYW5kcworQlIJLTAxMjctMDQ4MjkJQW1lcmljYS9CZWxlbQlBbWFwYSwgRSBQYXJhCitCUgktMDM0My0wMzgzMAlBbWVyaWNhL0ZvcnRhbGV6YQlORSBCcmF6aWwgKE1BLCBQSSwgQ0UsIFJOLCBQQikKK0JSCS0wODAzLTAzNDU0CUFtZXJpY2EvUmVjaWZlCVBlcm5hbWJ1Y28KK0JSCS0wNzEyLTA0ODEyCUFtZXJpY2EvQXJhZ3VhaW5hCVRvY2FudGlucworQlIJLTA5NDAtMDM1NDMJQW1lcmljYS9NYWNlaW8JQWxhZ29hcywgU2VyZ2lwZQorQlIJLTEyNTktMDM4MzEJQW1lcmljYS9CYWhpYQlCYWhpYQorQlIJLTIzMzItMDQ2MzcJQW1lcmljYS9TYW9fUGF1bG8JUyAmIFNFIEJyYXppbCAoR08sIERGLCBNRywgRVMsIFJKLCBTUCwgUFIsIFNDLCBSUykKK0JSCS0yMDI3LTA1NDM3CUFtZXJpY2EvQ2FtcG9fR3JhbmRlCU1hdG8gR3Jvc3NvIGRvIFN1bAorQlIJLTE1MzUtMDU2MDUJQW1lcmljYS9DdWlhYmEJTWF0byBHcm9zc28KK0JSCS0wMjI2LTA1NDUyCUFtZXJpY2EvU2FudGFyZW0JVyBQYXJhCitCUgktMDg0Ni0wNjM1NAlBbWVyaWNhL1BvcnRvX1ZlbGhvCVJvbmRvbmlhCitCUgkrMDI0OS0wNjA0MAlBbWVyaWNhL0JvYV9WaXN0YQlSb3JhaW1hCitCUgktMDMwOC0wNjAwMQlBbWVyaWNhL01hbmF1cwlFIEFtYXpvbmFzCitCUgktMDY0MC0wNjk1MglBbWVyaWNhL0VpcnVuZXBlCVcgQW1hem9uYXMKK0JSCS0wOTU4LTA2NzQ4CUFtZXJpY2EvUmlvX0JyYW5jbwlBY3JlCitCUwkrMjUwNS0wNzcyMQlBbWVyaWNhL05hc3NhdQorQlQJKzI3MjgrMDg5MzkJQXNpYS9UaGltcGh1CitCVwktMjQzOSswMjU1NQlBZnJpY2EvR2Fib3JvbmUKK0JZCSs1MzU0KzAyNzM0CUV1cm9wZS9NaW5zaworQloJKzE3MzAtMDg4MTIJQW1lcmljYS9CZWxpemUKK0NBCSs0NzM0LTA1MjQzCUFtZXJpY2EvU3RfSm9obnMJTmV3Zm91bmRsYW5kIFRpbWUsIGluY2x1ZGluZyBTRSBMYWJyYWRvcgorQ0EJKzQ0MzktMDYzMzYJQW1lcmljYS9IYWxpZmF4CUF0bGFudGljIFRpbWUgLSBOb3ZhIFNjb3RpYSAobW9zdCBwbGFjZXMpLCBQRUkKK0NBCSs0NjEyLTA1OTU3CUFtZXJpY2EvR2xhY2VfQmF5CUF0bGFudGljIFRpbWUgLSBOb3ZhIFNjb3RpYSAtIHBsYWNlcyB0aGF0IGRpZCBub3Qgb2JzZXJ2ZSBEU1QgMTk2Ni0xOTcxCitDQQkrNDYwNi0wNjQ0NwlBbWVyaWNhL01vbmN0b24JQXRsYW50aWMgVGltZSAtIE5ldyBCcnVuc3dpY2sKK0NBCSs1MzIwLTA2MDI1CUFtZXJpY2EvR29vc2VfQmF5CUF0bGFudGljIFRpbWUgLSBMYWJyYWRvciAtIG1vc3QgbG9jYXRpb25zCitDQQkrNTEyNS0wNTcwNwlBbWVyaWNhL0JsYW5jLVNhYmxvbglBdGxhbnRpYyBTdGFuZGFyZCBUaW1lIC0gUXVlYmVjIC0gTG93ZXIgTm9ydGggU2hvcmUKK0NBCSs0NTMxLTA3MzM0CUFtZXJpY2EvTW9udHJlYWwJRWFzdGVybiBUaW1lIC0gUXVlYmVjIC0gbW9zdCBsb2NhdGlvbnMKK0NBCSs0MzM5LTA3OTIzCUFtZXJpY2EvVG9yb250bwlFYXN0ZXJuIFRpbWUgLSBPbnRhcmlvIC0gbW9zdCBsb2NhdGlvbnMKK0NBCSs0OTAxLTA4ODE2CUFtZXJpY2EvTmlwaWdvbglFYXN0ZXJuIFRpbWUgLSBPbnRhcmlvICYgUXVlYmVjIC0gcGxhY2VzIHRoYXQgZGlkIG5vdCBvYnNlcnZlIERTVCAxOTY3LTE5NzMKK0NBCSs0ODIzLTA4OTE1CUFtZXJpY2EvVGh1bmRlcl9CYXkJRWFzdGVybiBUaW1lIC0gVGh1bmRlciBCYXksIE9udGFyaW8KK0NBCSs2MzQ0LTA2ODI4CUFtZXJpY2EvSXFhbHVpdAlFYXN0ZXJuIFRpbWUgLSBlYXN0IE51bmF2dXQgLSBtb3N0IGxvY2F0aW9ucworQ0EJKzY2MDgtMDY1NDQJQW1lcmljYS9QYW5nbmlydHVuZwlFYXN0ZXJuIFRpbWUgLSBQYW5nbmlydHVuZywgTnVuYXZ1dAorQ0EJKzc0NDE0NC0wOTQ0OTQ1CUFtZXJpY2EvUmVzb2x1dGUJRWFzdGVybiBTdGFuZGFyZCBUaW1lIC0gUmVzb2x1dGUsIE51bmF2dXQKK0NBCSs0ODQ1MzEtMDkxMzcxOAlBbWVyaWNhL0F0aWtva2FuCUVhc3Rlcm4gU3RhbmRhcmQgVGltZSAtIEF0aWtva2FuLCBPbnRhcmlvIGFuZCBTb3V0aGFtcHRvbiBJLCBOdW5hdnV0CitDQQkrNjI0OTAwLTA5MjA0NTkJQW1lcmljYS9SYW5raW5fSW5sZXQJQ2VudHJhbCBUaW1lIC0gY2VudHJhbCBOdW5hdnV0CitDQQkrNDk1My0wOTcwOQlBbWVyaWNhL1dpbm5pcGVnCUNlbnRyYWwgVGltZSAtIE1hbml0b2JhICYgd2VzdCBPbnRhcmlvCitDQQkrNDg0My0wOTQzNAlBbWVyaWNhL1JhaW55X1JpdmVyCUNlbnRyYWwgVGltZSAtIFJhaW55IFJpdmVyICYgRm9ydCBGcmFuY2VzLCBPbnRhcmlvCitDQQkrNTAyNC0xMDQzOQlBbWVyaWNhL1JlZ2luYQlDZW50cmFsIFN0YW5kYXJkIFRpbWUgLSBTYXNrYXRjaGV3YW4gLSBtb3N0IGxvY2F0aW9ucworQ0EJKzUwMTctMTA3NTAJQW1lcmljYS9Td2lmdF9DdXJyZW50CUNlbnRyYWwgU3RhbmRhcmQgVGltZSAtIFNhc2thdGNoZXdhbiAtIG1pZHdlc3QKK0NBCSs1MzMzLTExMzI4CUFtZXJpY2EvRWRtb250b24JTW91bnRhaW4gVGltZSAtIEFsYmVydGEsIGVhc3QgQnJpdGlzaCBDb2x1bWJpYSAmIHdlc3QgU2Fza2F0Y2hld2FuCitDQQkrNjkwNjUwLTEwNTAzMTAJQW1lcmljYS9DYW1icmlkZ2VfQmF5CU1vdW50YWluIFRpbWUgLSB3ZXN0IE51bmF2dXQKK0NBCSs2MjI3LTExNDIxCUFtZXJpY2EvWWVsbG93a25pZmUJTW91bnRhaW4gVGltZSAtIGNlbnRyYWwgTm9ydGh3ZXN0IFRlcnJpdG9yaWVzCitDQQkrNjgyMDU5LTEzMzQzMDAJQW1lcmljYS9JbnV2aWsJTW91bnRhaW4gVGltZSAtIHdlc3QgTm9ydGh3ZXN0IFRlcnJpdG9yaWVzCitDQQkrNTk0Ni0xMjAxNAlBbWVyaWNhL0Rhd3Nvbl9DcmVlawlNb3VudGFpbiBTdGFuZGFyZCBUaW1lIC0gRGF3c29uIENyZWVrICYgRm9ydCBTYWludCBKb2huLCBCcml0aXNoIENvbHVtYmlhCitDQQkrNDkxNi0xMjMwNwlBbWVyaWNhL1ZhbmNvdXZlcglQYWNpZmljIFRpbWUgLSB3ZXN0IEJyaXRpc2ggQ29sdW1iaWEKK0NBCSs2MDQzLTEzNTAzCUFtZXJpY2EvV2hpdGVob3JzZQlQYWNpZmljIFRpbWUgLSBzb3V0aCBZdWtvbgorQ0EJKzY0MDQtMTM5MjUJQW1lcmljYS9EYXdzb24JUGFjaWZpYyBUaW1lIC0gbm9ydGggWXVrb24KK0NDCS0xMjEwKzA5NjU1CUluZGlhbi9Db2NvcworQ0QJLTA0MTgrMDE1MTgJQWZyaWNhL0tpbnNoYXNhCXdlc3QgRGVtLiBSZXAuIG9mIENvbmdvCitDRAktMTE0MCswMjcyOAlBZnJpY2EvTHVidW1iYXNoaQllYXN0IERlbS4gUmVwLiBvZiBDb25nbworQ0YJKzA0MjIrMDE4MzUJQWZyaWNhL0Jhbmd1aQorQ0cJLTA0MTYrMDE1MTcJQWZyaWNhL0JyYXp6YXZpbGxlCitDSAkrNDcyMyswMDgzMglFdXJvcGUvWnVyaWNoCitDSQkrMDUxOS0wMDQwMglBZnJpY2EvQWJpZGphbgorQ0sJLTIxMTQtMTU5NDYJUGFjaWZpYy9SYXJvdG9uZ2EKK0NMCS0zMzI3LTA3MDQwCUFtZXJpY2EvU2FudGlhZ28JbW9zdCBsb2NhdGlvbnMKK0NMCS0yNzA5LTEwOTI2CVBhY2lmaWMvRWFzdGVyCUVhc3RlciBJc2xhbmQgJiBTYWxhIHkgR29tZXoKK0NNCSswNDAzKzAwOTQyCUFmcmljYS9Eb3VhbGEKK0NOCSszMTE0KzEyMTI4CUFzaWEvU2hhbmdoYWkJZWFzdCBDaGluYSAtIEJlaWppbmcsIEd1YW5nZG9uZywgU2hhbmdoYWksIGV0Yy4KK0NOCSs0NTQ1KzEyNjQxCUFzaWEvSGFyYmluCUhlaWxvbmdqaWFuZyAoZXhjZXB0IE1vaGUpLCBKaWxpbgorQ04JKzI5MzQrMTA2MzUJQXNpYS9DaG9uZ3FpbmcJY2VudHJhbCBDaGluYSAtIFNpY2h1YW4sIFl1bm5hbiwgR3Vhbmd4aSwgU2hhYW54aSwgR3VpemhvdSwgZXRjLgorQ04JKzQzNDgrMDg3MzUJQXNpYS9VcnVtcWkJbW9zdCBvZiBUaWJldCAmIFhpbmppYW5nCitDTgkrMzkyOSswNzU1OQlBc2lhL0thc2hnYXIJd2VzdCBUaWJldCAmIFhpbmppYW5nCitDTwkrMDQzNi0wNzQwNQlBbWVyaWNhL0JvZ290YQorQ1IJKzA5NTYtMDg0MDUJQW1lcmljYS9Db3N0YV9SaWNhCitDVQkrMjMwOC0wODIyMglBbWVyaWNhL0hhdmFuYQorQ1YJKzE0NTUtMDIzMzEJQXRsYW50aWMvQ2FwZV9WZXJkZQorQ1gJLTEwMjUrMTA1NDMJSW5kaWFuL0NocmlzdG1hcworQ1kJKzM1MTArMDMzMjIJQXNpYS9OaWNvc2lhCitDWgkrNTAwNSswMTQyNglFdXJvcGUvUHJhZ3VlCitERQkrNTIzMCswMTMyMglFdXJvcGUvQmVybGluCitESgkrMTEzNiswNDMwOQlBZnJpY2EvRGppYm91dGkKK0RLCSs1NTQwKzAxMjM1CUV1cm9wZS9Db3BlbmhhZ2VuCitETQkrMTUxOC0wNjEyNAlBbWVyaWNhL0RvbWluaWNhCitETwkrMTgyOC0wNjk1NAlBbWVyaWNhL1NhbnRvX0RvbWluZ28KK0RaCSszNjQ3KzAwMzAzCUFmcmljYS9BbGdpZXJzCitFQwktMDIxMC0wNzk1MAlBbWVyaWNhL0d1YXlhcXVpbAltYWlubGFuZAorRUMJLTAwNTQtMDg5MzYJUGFjaWZpYy9HYWxhcGFnb3MJR2FsYXBhZ29zIElzbGFuZHMKK0VFCSs1OTI1KzAyNDQ1CUV1cm9wZS9UYWxsaW5uCitFRwkrMzAwMyswMzExNQlBZnJpY2EvQ2Fpcm8KK0VICSsyNzA5LTAxMzEyCUFmcmljYS9FbF9BYWl1bgorRVIJKzE1MjArMDM4NTMJQWZyaWNhL0FzbWFyYQorRVMJKzQwMjQtMDAzNDEJRXVyb3BlL01hZHJpZAltYWlubGFuZAorRVMJKzM1NTMtMDA1MTkJQWZyaWNhL0NldXRhCUNldXRhICYgTWVsaWxsYQorRVMJKzI4MDYtMDE1MjQJQXRsYW50aWMvQ2FuYXJ5CUNhbmFyeSBJc2xhbmRzCitFVAkrMDkwMiswMzg0MglBZnJpY2EvQWRkaXNfQWJhYmEKK0ZJCSs2MDEwKzAyNDU4CUV1cm9wZS9IZWxzaW5raQorRkoJLTE4MDgrMTc4MjUJUGFjaWZpYy9GaWppCitGSwktNTE0Mi0wNTc1MQlBdGxhbnRpYy9TdGFubGV5CitGTQkrMDcyNSsxNTE0NwlQYWNpZmljL1RydWsJVHJ1ayAoQ2h1dWspIGFuZCBZYXAKK0ZNCSswNjU4KzE1ODEzCVBhY2lmaWMvUG9uYXBlCVBvbmFwZSAoUG9obnBlaSkKK0ZNCSswNTE5KzE2MjU5CVBhY2lmaWMvS29zcmFlCUtvc3JhZQorRk8JKzYyMDEtMDA2NDYJQXRsYW50aWMvRmFyb2UKK0ZSCSs0ODUyKzAwMjIwCUV1cm9wZS9QYXJpcworR0EJKzAwMjMrMDA5MjcJQWZyaWNhL0xpYnJldmlsbGUKK0dCCSs1MTMwMzAtMDAwMDczMQlFdXJvcGUvTG9uZG9uCitHRAkrMTIwMy0wNjE0NQlBbWVyaWNhL0dyZW5hZGEKK0dFCSs0MTQzKzA0NDQ5CUFzaWEvVGJpbGlzaQorR0YJKzA0NTYtMDUyMjAJQW1lcmljYS9DYXllbm5lCitHRwkrNDkyNy0wMDIzMglFdXJvcGUvR3Vlcm5zZXkKK0dICSswNTMzLTAwMDEzCUFmcmljYS9BY2NyYQorR0kJKzM2MDgtMDA1MjEJRXVyb3BlL0dpYnJhbHRhcgorR0wJKzY0MTEtMDUxNDQJQW1lcmljYS9Hb2R0aGFiCW1vc3QgbG9jYXRpb25zCitHTAkrNzY0Ni0wMTg0MAlBbWVyaWNhL0Rhbm1hcmtzaGF2bgllYXN0IGNvYXN0LCBub3J0aCBvZiBTY29yZXNieXN1bmQKK0dMCSs3MDI5LTAyMTU4CUFtZXJpY2EvU2NvcmVzYnlzdW5kCVNjb3Jlc2J5c3VuZCAvIEl0dG9xcW9ydG9vcm1paXQKK0dMCSs3NjM0LTA2ODQ3CUFtZXJpY2EvVGh1bGUJVGh1bGUgLyBQaXR1ZmZpaworR00JKzEzMjgtMDE2MzkJQWZyaWNhL0Jhbmp1bAorR04JKzA5MzEtMDEzNDMJQWZyaWNhL0NvbmFrcnkKK0dQCSsxNjE0LTA2MTMyCUFtZXJpY2EvR3VhZGVsb3VwZQorR1EJKzAzNDUrMDA4NDcJQWZyaWNhL01hbGFibworR1IJKzM3NTgrMDIzNDMJRXVyb3BlL0F0aGVucworR1MJLTU0MTYtMDM2MzIJQXRsYW50aWMvU291dGhfR2VvcmdpYQorR1QJKzE0MzgtMDkwMzEJQW1lcmljYS9HdWF0ZW1hbGEKK0dVCSsxMzI4KzE0NDQ1CVBhY2lmaWMvR3VhbQorR1cJKzExNTEtMDE1MzUJQWZyaWNhL0Jpc3NhdQorR1kJKzA2NDgtMDU4MTAJQW1lcmljYS9HdXlhbmEKK0hLCSsyMjE3KzExNDA5CUFzaWEvSG9uZ19Lb25nCitITgkrMTQwNi0wODcxMwlBbWVyaWNhL1RlZ3VjaWdhbHBhCitIUgkrNDU0OCswMTU1OAlFdXJvcGUvWmFncmViCitIVAkrMTgzMi0wNzIyMAlBbWVyaWNhL1BvcnQtYXUtUHJpbmNlCitIVQkrNDczMCswMTkwNQlFdXJvcGUvQnVkYXBlc3QKK0lECS0wNjEwKzEwNjQ4CUFzaWEvSmFrYXJ0YQlKYXZhICYgU3VtYXRyYQorSUQJLTAwMDIrMTA5MjAJQXNpYS9Qb250aWFuYWsJd2VzdCAmIGNlbnRyYWwgQm9ybmVvCitJRAktMDUwNysxMTkyNAlBc2lhL01ha2Fzc2FyCWVhc3QgJiBzb3V0aCBCb3JuZW8sIENlbGViZXMsIEJhbGksIE51c2EgVGVuZ2FycmEsIHdlc3QgVGltb3IKK0lECS0wMjMyKzE0MDQyCUFzaWEvSmF5YXB1cmEJSXJpYW4gSmF5YSAmIHRoZSBNb2x1Y2NhcworSUUJKzUzMjAtMDA2MTUJRXVyb3BlL0R1YmxpbgorSUwJKzMxNDYrMDM1MTQJQXNpYS9KZXJ1c2FsZW0KK0lNCSs1NDA5LTAwNDI4CUV1cm9wZS9Jc2xlX29mX01hbgorSU4JKzIyMzIrMDg4MjIJQXNpYS9Lb2xrYXRhCitJTwktMDcyMCswNzIyNQlJbmRpYW4vQ2hhZ29zCitJUQkrMzMyMSswNDQyNQlBc2lhL0JhZ2hkYWQKK0lSCSszNTQwKzA1MTI2CUFzaWEvVGVocmFuCitJUwkrNjQwOS0wMjE1MQlBdGxhbnRpYy9SZXlramF2aWsKK0lUCSs0MTU0KzAxMjI5CUV1cm9wZS9Sb21lCitKRQkrNDkxMi0wMDIwNwlFdXJvcGUvSmVyc2V5CitKTQkrMTgwMC0wNzY0OAlBbWVyaWNhL0phbWFpY2EKK0pPCSszMTU3KzAzNTU2CUFzaWEvQW1tYW4KK0pQCSszNTM5MTYrMTM5NDQ0MQlBc2lhL1Rva3lvCitLRQktMDExNyswMzY0OQlBZnJpY2EvTmFpcm9iaQorS0cJKzQyNTQrMDc0MzYJQXNpYS9CaXNoa2VrCitLSAkrMTEzMysxMDQ1NQlBc2lhL1Bobm9tX1BlbmgKK0tJCSswMTI1KzE3MzAwCVBhY2lmaWMvVGFyYXdhCUdpbGJlcnQgSXNsYW5kcworS0kJLTAzMDgtMTcxMDUJUGFjaWZpYy9FbmRlcmJ1cnkJUGhvZW5peCBJc2xhbmRzCitLSQkrMDE1Mi0xNTcyMAlQYWNpZmljL0tpcml0aW1hdGkJTGluZSBJc2xhbmRzCitLTQktMTE0MSswNDMxNglJbmRpYW4vQ29tb3JvCitLTgkrMTcxOC0wNjI0MwlBbWVyaWNhL1N0X0tpdHRzCitLUAkrMzkwMSsxMjU0NQlBc2lhL1B5b25neWFuZworS1IJKzM3MzMrMTI2NTgJQXNpYS9TZW91bAorS1cJKzI5MjArMDQ3NTkJQXNpYS9LdXdhaXQKK0tZCSsxOTE4LTA4MTIzCUFtZXJpY2EvQ2F5bWFuCitLWgkrNDMxNSswNzY1NwlBc2lhL0FsbWF0eQltb3N0IGxvY2F0aW9ucworS1oJKzQ0NDgrMDY1MjgJQXNpYS9ReXp5bG9yZGEJUXl6eWxvcmRhIChLeXp5bG9yZGEsIEt6eWwtT3JkYSkKK0taCSs1MDE3KzA1NzEwCUFzaWEvQXF0b2JlCUFxdG9iZSAoQWt0b2JlKQorS1oJKzQ0MzErMDUwMTYJQXNpYS9BcXRhdQlBdHlyYXUgKEF0aXJhdSwgR3VyJ3lldiksIE1hbmdnaHlzdGF1IChNYW5raXN0YXUpCitLWgkrNTExMyswNTEyMQlBc2lhL09yYWwJV2VzdCBLYXpha2hzdGFuCitMQQkrMTc1OCsxMDIzNglBc2lhL1ZpZW50aWFuZQorTEIJKzMzNTMrMDM1MzAJQXNpYS9CZWlydXQKK0xDCSsxNDAxLTA2MTAwCUFtZXJpY2EvU3RfTHVjaWEKK0xJCSs0NzA5KzAwOTMxCUV1cm9wZS9WYWR1egorTEsJKzA2NTYrMDc5NTEJQXNpYS9Db2xvbWJvCitMUgkrMDYxOC0wMTA0NwlBZnJpY2EvTW9ucm92aWEKK0xTCS0yOTI4KzAyNzMwCUFmcmljYS9NYXNlcnUKK0xUCSs1NDQxKzAyNTE5CUV1cm9wZS9WaWxuaXVzCitMVQkrNDkzNiswMDYwOQlFdXJvcGUvTHV4ZW1ib3VyZworTFYJKzU2NTcrMDI0MDYJRXVyb3BlL1JpZ2EKK0xZCSszMjU0KzAxMzExCUFmcmljYS9Ucmlwb2xpCitNQQkrMzMzOS0wMDczNQlBZnJpY2EvQ2FzYWJsYW5jYQorTUMJKzQzNDIrMDA3MjMJRXVyb3BlL01vbmFjbworTUQJKzQ3MDArMDI4NTAJRXVyb3BlL0NoaXNpbmF1CitNRQkrNDIyNiswMTkxNglFdXJvcGUvUG9kZ29yaWNhCitNRgkrMTgwNC0wNjMwNQlBbWVyaWNhL01hcmlnb3QKK01HCS0xODU1KzA0NzMxCUluZGlhbi9BbnRhbmFuYXJpdm8KK01ICSswNzA5KzE3MTEyCVBhY2lmaWMvTWFqdXJvCW1vc3QgbG9jYXRpb25zCitNSAkrMDkwNSsxNjcyMAlQYWNpZmljL0t3YWphbGVpbglLd2FqYWxlaW4KK01LCSs0MTU5KzAyMTI2CUV1cm9wZS9Ta29wamUKK01MCSsxMjM5LTAwODAwCUFmcmljYS9CYW1ha28KK01NCSsxNjQ3KzA5NjEwCUFzaWEvUmFuZ29vbgorTU4JKzQ3NTUrMTA2NTMJQXNpYS9VbGFhbmJhYXRhcgltb3N0IGxvY2F0aW9ucworTU4JKzQ4MDErMDkxMzkJQXNpYS9Ib3ZkCUJheWFuLU9sZ2l5LCBHb3ZpLUFsdGFpLCBIb3ZkLCBVdnMsIFphdmtoYW4KK01OCSs0ODA0KzExNDMwCUFzaWEvQ2hvaWJhbHNhbglEb3Jub2QsIFN1a2hiYWF0YXIKK01PCSsyMjE0KzExMzM1CUFzaWEvTWFjYXUKK01QCSsxNTEyKzE0NTQ1CVBhY2lmaWMvU2FpcGFuCitNUQkrMTQzNi0wNjEwNQlBbWVyaWNhL01hcnRpbmlxdWUKK01SCSsxODA2LTAxNTU3CUFmcmljYS9Ob3Vha2Nob3R0CitNUwkrMTY0My0wNjIxMwlBbWVyaWNhL01vbnRzZXJyYXQKK01UCSszNTU0KzAxNDMxCUV1cm9wZS9NYWx0YQorTVUJLTIwMTArMDU3MzAJSW5kaWFuL01hdXJpdGl1cworTVYJKzA0MTArMDczMzAJSW5kaWFuL01hbGRpdmVzCitNVwktMTU0NyswMzUwMAlBZnJpY2EvQmxhbnR5cmUKK01YCSsxOTI0LTA5OTA5CUFtZXJpY2EvTWV4aWNvX0NpdHkJQ2VudHJhbCBUaW1lIC0gbW9zdCBsb2NhdGlvbnMKK01YCSsyMTA1LTA4NjQ2CUFtZXJpY2EvQ2FuY3VuCUNlbnRyYWwgVGltZSAtIFF1aW50YW5hIFJvbworTVgJKzIwNTgtMDg5MzcJQW1lcmljYS9NZXJpZGEJQ2VudHJhbCBUaW1lIC0gQ2FtcGVjaGUsIFl1Y2F0YW4KK01YCSsyNTQwLTEwMDE5CUFtZXJpY2EvTW9udGVycmV5CUNlbnRyYWwgVGltZSAtIENvYWh1aWxhLCBEdXJhbmdvLCBOdWV2byBMZW9uLCBUYW1hdWxpcGFzCitNWAkrMjMxMy0xMDYyNQlBbWVyaWNhL01hemF0bGFuCU1vdW50YWluIFRpbWUgLSBTIEJhamEsIE5heWFyaXQsIFNpbmFsb2EKK01YCSsyODM4LTEwNjA1CUFtZXJpY2EvQ2hpaHVhaHVhCU1vdW50YWluIFRpbWUgLSBDaGlodWFodWEKK01YCSsyOTA0LTExMDU4CUFtZXJpY2EvSGVybW9zaWxsbwlNb3VudGFpbiBTdGFuZGFyZCBUaW1lIC0gU29ub3JhCitNWAkrMzIzMi0xMTcwMQlBbWVyaWNhL1RpanVhbmEJUGFjaWZpYyBUaW1lCitNWQkrMDMxMCsxMDE0MglBc2lhL0t1YWxhX0x1bXB1cglwZW5pbnN1bGFyIE1hbGF5c2lhCitNWQkrMDEzMysxMTAyMAlBc2lhL0t1Y2hpbmcJU2FiYWggJiBTYXJhd2FrCitNWgktMjU1OCswMzIzNQlBZnJpY2EvTWFwdXRvCitOQQktMjIzNCswMTcwNglBZnJpY2EvV2luZGhvZWsKK05DCS0yMjE2KzE2NjI3CVBhY2lmaWMvTm91bWVhCitORQkrMTMzMSswMDIwNwlBZnJpY2EvTmlhbWV5CitORgktMjkwMysxNjc1OAlQYWNpZmljL05vcmZvbGsKK05HCSswNjI3KzAwMzI0CUFmcmljYS9MYWdvcworTkkJKzEyMDktMDg2MTcJQW1lcmljYS9NYW5hZ3VhCitOTAkrNTIyMiswMDQ1NAlFdXJvcGUvQW1zdGVyZGFtCitOTwkrNTk1NSswMTA0NQlFdXJvcGUvT3NsbworTlAJKzI3NDMrMDg1MTkJQXNpYS9LYXRobWFuZHUKK05SCS0wMDMxKzE2NjU1CVBhY2lmaWMvTmF1cnUKK05VCS0xOTAxLTE2OTU1CVBhY2lmaWMvTml1ZQorTloJLTM2NTIrMTc0NDYJUGFjaWZpYy9BdWNrbGFuZAltb3N0IGxvY2F0aW9ucworTloJLTQzNTctMTc2MzMJUGFjaWZpYy9DaGF0aGFtCUNoYXRoYW0gSXNsYW5kcworT00JKzIzMzYrMDU4MzUJQXNpYS9NdXNjYXQKK1BBCSswODU4LTA3OTMyCUFtZXJpY2EvUGFuYW1hCitQRQktMTIwMy0wNzcwMwlBbWVyaWNhL0xpbWEKK1BGCS0xNzMyLTE0OTM0CVBhY2lmaWMvVGFoaXRpCVNvY2lldHkgSXNsYW5kcworUEYJLTA5MDAtMTM5MzAJUGFjaWZpYy9NYXJxdWVzYXMJTWFycXVlc2FzIElzbGFuZHMKK1BGCS0yMzA4LTEzNDU3CVBhY2lmaWMvR2FtYmllcglHYW1iaWVyIElzbGFuZHMKK1BHCS0wOTMwKzE0NzEwCVBhY2lmaWMvUG9ydF9Nb3Jlc2J5CitQSAkrMTQzNSsxMjEwMAlBc2lhL01hbmlsYQorUEsJKzI0NTIrMDY3MDMJQXNpYS9LYXJhY2hpCitQTAkrNTIxNSswMjEwMAlFdXJvcGUvV2Fyc2F3CitQTQkrNDcwMy0wNTYyMAlBbWVyaWNhL01pcXVlbG9uCitQTgktMjUwNC0xMzAwNQlQYWNpZmljL1BpdGNhaXJuCitQUgkrMTgyODA2LTA2NjA2MjIJQW1lcmljYS9QdWVydG9fUmljbworUFMJKzMxMzArMDM0MjgJQXNpYS9HYXphCitQVAkrMzg0My0wMDkwOAlFdXJvcGUvTGlzYm9uCW1haW5sYW5kCitQVAkrMzIzOC0wMTY1NAlBdGxhbnRpYy9NYWRlaXJhCU1hZGVpcmEgSXNsYW5kcworUFQJKzM3NDQtMDI1NDAJQXRsYW50aWMvQXpvcmVzCUF6b3JlcworUFcJKzA3MjArMTM0MjkJUGFjaWZpYy9QYWxhdQorUFkJLTI1MTYtMDU3NDAJQW1lcmljYS9Bc3VuY2lvbgorUUEJKzI1MTcrMDUxMzIJQXNpYS9RYXRhcgorUkUJLTIwNTIrMDU1MjgJSW5kaWFuL1JldW5pb24KK1JPCSs0NDI2KzAyNjA2CUV1cm9wZS9CdWNoYXJlc3QKK1JTCSs0NDUwKzAyMDMwCUV1cm9wZS9CZWxncmFkZQorUlUJKzU0NDMrMDIwMzAJRXVyb3BlL0thbGluaW5ncmFkCU1vc2Nvdy0wMSAtIEthbGluaW5ncmFkCitSVQkrNTU0NSswMzczNQlFdXJvcGUvTW9zY293CU1vc2NvdyswMCAtIHdlc3QgUnVzc2lhCitSVQkrNDg0NCswNDQyNQlFdXJvcGUvVm9sZ29ncmFkCU1vc2NvdyswMCAtIENhc3BpYW4gU2VhCitSVQkrNTMxMiswNTAwOQlFdXJvcGUvU2FtYXJhCU1vc2NvdyswMSAtIFNhbWFyYSwgVWRtdXJ0aWEKK1JVCSs1NjUxKzA2MDM2CUFzaWEvWWVrYXRlcmluYnVyZwlNb3Njb3crMDIgLSBVcmFscworUlUJKzU1MDArMDczMjQJQXNpYS9PbXNrCU1vc2NvdyswMyAtIHdlc3QgU2liZXJpYQorUlUJKzU1MDIrMDgyNTUJQXNpYS9Ob3Zvc2liaXJzawlNb3Njb3crMDMgLSBOb3Zvc2liaXJzaworUlUJKzUzNDUrMDg3MDcJQXNpYS9Ob3Zva3V6bmV0c2sJTW9zY293KzAzIC0gTm92b2t1em5ldHNrCitSVQkrNTYwMSswOTI1MAlBc2lhL0tyYXNub3lhcnNrCU1vc2NvdyswNCAtIFllbmlzZWkgUml2ZXIKK1JVCSs1MjE2KzEwNDIwCUFzaWEvSXJrdXRzawlNb3Njb3crMDUgLSBMYWtlIEJhaWthbAorUlUJKzYyMDArMTI5NDAJQXNpYS9ZYWt1dHNrCU1vc2NvdyswNiAtIExlbmEgUml2ZXIKK1JVCSs0MzEwKzEzMTU2CUFzaWEvVmxhZGl2b3N0b2sJTW9zY293KzA3IC0gQW11ciBSaXZlcgorUlUJKzQ2NTgrMTQyNDIJQXNpYS9TYWtoYWxpbglNb3Njb3crMDcgLSBTYWtoYWxpbiBJc2xhbmQKK1JVCSs1OTM0KzE1MDQ4CUFzaWEvTWFnYWRhbglNb3Njb3crMDggLSBNYWdhZGFuCitSVQkrNTMwMSsxNTgzOQlBc2lhL0thbWNoYXRrYQlNb3Njb3crMDkgLSBLYW1jaGF0a2EKK1JVCSs2NDQ1KzE3NzI5CUFzaWEvQW5hZHlyCU1vc2NvdysxMCAtIEJlcmluZyBTZWEKK1JXCS0wMTU3KzAzMDA0CUFmcmljYS9LaWdhbGkKK1NBCSsyNDM4KzA0NjQzCUFzaWEvUml5YWRoCitTQgktMDkzMisxNjAxMglQYWNpZmljL0d1YWRhbGNhbmFsCitTQwktMDQ0MCswNTUyOAlJbmRpYW4vTWFoZQorU0QJKzE1MzYrMDMyMzIJQWZyaWNhL0toYXJ0b3VtCitTRQkrNTkyMCswMTgwMwlFdXJvcGUvU3RvY2tob2xtCitTRwkrMDExNysxMDM1MQlBc2lhL1NpbmdhcG9yZQorU0gJLTE1NTUtMDA1NDIJQXRsYW50aWMvU3RfSGVsZW5hCitTSQkrNDYwMyswMTQzMQlFdXJvcGUvTGp1YmxqYW5hCitTSgkrNzgwMCswMTYwMAlBcmN0aWMvTG9uZ3llYXJieWVuCitTSwkrNDgwOSswMTcwNwlFdXJvcGUvQnJhdGlzbGF2YQorU0wJKzA4MzAtMDEzMTUJQWZyaWNhL0ZyZWV0b3duCitTTQkrNDM1NSswMTIyOAlFdXJvcGUvU2FuX01hcmlubworU04JKzE0NDAtMDE3MjYJQWZyaWNhL0Rha2FyCitTTwkrMDIwNCswNDUyMglBZnJpY2EvTW9nYWRpc2h1CitTUgkrMDU1MC0wNTUxMAlBbWVyaWNhL1BhcmFtYXJpYm8KK1NUCSswMDIwKzAwNjQ0CUFmcmljYS9TYW9fVG9tZQorU1YJKzEzNDItMDg5MTIJQW1lcmljYS9FbF9TYWx2YWRvcgorU1kJKzMzMzArMDM2MTgJQXNpYS9EYW1hc2N1cworU1oJLTI2MTgrMDMxMDYJQWZyaWNhL01iYWJhbmUKK1RDCSsyMTI4LTA3MTA4CUFtZXJpY2EvR3JhbmRfVHVyaworVEQJKzEyMDcrMDE1MDMJQWZyaWNhL05kamFtZW5hCitURgktNDkyMTEwKzA3MDEzMDMJSW5kaWFuL0tlcmd1ZWxlbgorVEcJKzA2MDgrMDAxMTMJQWZyaWNhL0xvbWUKK1RICSsxMzQ1KzEwMDMxCUFzaWEvQmFuZ2tvaworVEoJKzM4MzUrMDY4NDgJQXNpYS9EdXNoYW5iZQorVEsJLTA5MjItMTcxMTQJUGFjaWZpYy9GYWthb2ZvCitUTAktMDgzMysxMjUzNQlBc2lhL0RpbGkKK1RNCSszNzU3KzA1ODIzCUFzaWEvQXNoZ2FiYXQKK1ROCSszNjQ4KzAxMDExCUFmcmljYS9UdW5pcworVE8JLTIxMTAtMTc1MTAJUGFjaWZpYy9Ub25nYXRhcHUKK1RSCSs0MTAxKzAyODU4CUV1cm9wZS9Jc3RhbmJ1bAorVFQJKzEwMzktMDYxMzEJQW1lcmljYS9Qb3J0X29mX1NwYWluCitUVgktMDgzMSsxNzkxMwlQYWNpZmljL0Z1bmFmdXRpCitUVwkrMjUwMysxMjEzMAlBc2lhL1RhaXBlaQorVFoJLTA2NDgrMDM5MTcJQWZyaWNhL0Rhcl9lc19TYWxhYW0KK1VBCSs1MDI2KzAzMDMxCUV1cm9wZS9LaWV2CW1vc3QgbG9jYXRpb25zCitVQQkrNDgzNyswMjIxOAlFdXJvcGUvVXpoZ29yb2QJUnV0aGVuaWEKK1VBCSs0NzUwKzAzNTEwCUV1cm9wZS9aYXBvcm96aHllCVphcG9yb3poJ3llLCBFIEx1Z2Fuc2sgLyBaYXBvcml6aGlhLCBFIEx1aGFuc2sKK1VBCSs0NDU3KzAzNDA2CUV1cm9wZS9TaW1mZXJvcG9sCWNlbnRyYWwgQ3JpbWVhCitVRwkrMDAxOSswMzIyNQlBZnJpY2EvS2FtcGFsYQorVU0JKzE2NDUtMTY5MzEJUGFjaWZpYy9Kb2huc3RvbglKb2huc3RvbiBBdG9sbAorVU0JKzI4MTMtMTc3MjIJUGFjaWZpYy9NaWR3YXkJTWlkd2F5IElzbGFuZHMKK1VNCSsxOTE3KzE2NjM3CVBhY2lmaWMvV2FrZQlXYWtlIElzbGFuZAorVVMJKzQwNDI1MS0wNzQwMDIzCUFtZXJpY2EvTmV3X1lvcmsJRWFzdGVybiBUaW1lCitVUwkrNDIxOTUzLTA4MzAyNDUJQW1lcmljYS9EZXRyb2l0CUVhc3Rlcm4gVGltZSAtIE1pY2hpZ2FuIC0gbW9zdCBsb2NhdGlvbnMKK1VTCSszODE1MTUtMDg1NDUzNAlBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUJRWFzdGVybiBUaW1lIC0gS2VudHVja3kgLSBMb3Vpc3ZpbGxlIGFyZWEKK1VTCSszNjQ5NDctMDg0NTA1NwlBbWVyaWNhL0tlbnR1Y2t5L01vbnRpY2VsbG8JRWFzdGVybiBUaW1lIC0gS2VudHVja3kgLSBXYXluZSBDb3VudHkKK1VTCSszOTQ2MDYtMDg2MDkyOQlBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBtb3N0IGxvY2F0aW9ucworVVMJKzM4NDAzOC0wODczMTQzCUFtZXJpY2EvSW5kaWFuYS9WaW5jZW5uZXMJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIERhdmllc3MsIER1Ym9pcywgS25veCAmIE1hcnRpbiBDb3VudGllcworVVMJKzQxMDMwNS0wODYzNjExCUFtZXJpY2EvSW5kaWFuYS9XaW5hbWFjCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBQdWxhc2tpIENvdW50eQorVVMJKzM4MjIzMi0wODYyMDQxCUFtZXJpY2EvSW5kaWFuYS9NYXJlbmdvCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBDcmF3Zm9yZCBDb3VudHkKK1VTCSszODI5MzEtMDg3MTY0MwlBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZwlFYXN0ZXJuIFRpbWUgLSBJbmRpYW5hIC0gUGlrZSBDb3VudHkKK1VTCSszODQ0NTItMDg1MDQwMglBbWVyaWNhL0luZGlhbmEvVmV2YXkJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIFN3aXR6ZXJsYW5kIENvdW50eQorVVMJKzQxNTEwMC0wODczOTAwCUFtZXJpY2EvQ2hpY2FnbwlDZW50cmFsIFRpbWUKK1VTCSszNzU3MTEtMDg2NDU0MQlBbWVyaWNhL0luZGlhbmEvVGVsbF9DaXR5CUNlbnRyYWwgVGltZSAtIEluZGlhbmEgLSBQZXJyeSBDb3VudHkKK1VTCSs0MTE3NDUtMDg2MzczMAlBbWVyaWNhL0luZGlhbmEvS25veAlDZW50cmFsIFRpbWUgLSBJbmRpYW5hIC0gU3RhcmtlIENvdW50eQorVVMJKzQ1MDYyOC0wODczNjUxCUFtZXJpY2EvTWVub21pbmVlCUNlbnRyYWwgVGltZSAtIE1pY2hpZ2FuIC0gRGlja2luc29uLCBHb2dlYmljLCBJcm9uICYgTWVub21pbmVlIENvdW50aWVzCitVUwkrNDcwNjU5LTEwMTE3NTcJQW1lcmljYS9Ob3J0aF9EYWtvdGEvQ2VudGVyCUNlbnRyYWwgVGltZSAtIE5vcnRoIERha290YSAtIE9saXZlciBDb3VudHkKK1VTCSs0NjUwNDItMTAxMjQzOQlBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0JQ2VudHJhbCBUaW1lIC0gTm9ydGggRGFrb3RhIC0gTW9ydG9uIENvdW50eSAoZXhjZXB0IE1hbmRhbiBhcmVhKQorVVMJKzM5NDQyMS0xMDQ1OTAzCUFtZXJpY2EvRGVudmVyCU1vdW50YWluIFRpbWUKK1VTCSs0MzM2NDktMTE2MTIwOQlBbWVyaWNhL0JvaXNlCU1vdW50YWluIFRpbWUgLSBzb3V0aCBJZGFobyAmIGVhc3QgT3JlZ29uCitVUwkrMzY0NzA4LTEwODQxMTEJQW1lcmljYS9TaGlwcm9jawlNb3VudGFpbiBUaW1lIC0gTmF2YWpvCitVUwkrMzMyNjU0LTExMjA0MjQJQW1lcmljYS9QaG9lbml4CU1vdW50YWluIFN0YW5kYXJkIFRpbWUgLSBBcml6b25hCitVUwkrMzQwMzA4LTExODE0MzQJQW1lcmljYS9Mb3NfQW5nZWxlcwlQYWNpZmljIFRpbWUKK1VTCSs2MTEzMDUtMTQ5NTQwMQlBbWVyaWNhL0FuY2hvcmFnZQlBbGFza2EgVGltZQorVVMJKzU4MTgwNy0xMzQyNTExCUFtZXJpY2EvSnVuZWF1CUFsYXNrYSBUaW1lIC0gQWxhc2thIHBhbmhhbmRsZQorVVMJKzU5MzI0OS0xMzk0MzM4CUFtZXJpY2EvWWFrdXRhdAlBbGFza2EgVGltZSAtIEFsYXNrYSBwYW5oYW5kbGUgbmVjaworVVMJKzY0MzAwNC0xNjUyNDIzCUFtZXJpY2EvTm9tZQlBbGFza2EgVGltZSAtIHdlc3QgQWxhc2thCitVUwkrNTE1MjQ4LTE3NjM5MjkJQW1lcmljYS9BZGFrCUFsZXV0aWFuIElzbGFuZHMKK1VTCSsyMTE4MjUtMTU3NTEzMAlQYWNpZmljL0hvbm9sdWx1CUhhd2FpaQorVVkJLTM0NTMtMDU2MTEJQW1lcmljYS9Nb250ZXZpZGVvCitVWgkrMzk0MCswNjY0OAlBc2lhL1NhbWFya2FuZAl3ZXN0IFV6YmVraXN0YW4KK1VaCSs0MTIwKzA2OTE4CUFzaWEvVGFzaGtlbnQJZWFzdCBVemJla2lzdGFuCitWQQkrNDE1NDA4KzAxMjI3MTEJRXVyb3BlL1ZhdGljYW4KK1ZDCSsxMzA5LTA2MTE0CUFtZXJpY2EvU3RfVmluY2VudAorVkUJKzEwMzAtMDY2NTYJQW1lcmljYS9DYXJhY2FzCitWRwkrMTgyNy0wNjQzNwlBbWVyaWNhL1RvcnRvbGEKK1ZJCSsxODIxLTA2NDU2CUFtZXJpY2EvU3RfVGhvbWFzCitWTgkrMTA0NSsxMDY0MAlBc2lhL0hvX0NoaV9NaW5oCitWVQktMTc0MCsxNjgyNQlQYWNpZmljL0VmYXRlCitXRgktMTMxOC0xNzYxMAlQYWNpZmljL1dhbGxpcworV1MJLTEzNTAtMTcxNDQJUGFjaWZpYy9BcGlhCitZRQkrMTI0NSswNDUxMglBc2lhL0FkZW4KK1lUCS0xMjQ3KzA0NTE0CUluZGlhbi9NYXlvdHRlCitaQQktMjYxNSswMjgwMAlBZnJpY2EvSm9oYW5uZXNidXJnCitaTQktMTUyNSswMjgxNwlBZnJpY2EvTHVzYWthCitaVwktMTc1MCswMzEwMwlBZnJpY2EvSGFyYXJlCg==